diff --git a/.configurations/configuration.vsBuildTools.dsc.yaml b/.configurations/configuration.vsBuildTools.dsc.yaml new file mode 100644 index 00000000000000..5434b44b3e0459 --- /dev/null +++ b/.configurations/configuration.vsBuildTools.dsc.yaml @@ -0,0 +1,54 @@ +# yaml-language-server: $schema=https://aka.ms/configuration-dsc-schema/0.2 +# Reference: https://github.com/nodejs/node/blob/main/BUILDING.md#windows +properties: + resources: + - resource: Microsoft.WinGet.DSC/WinGetPackage + id: pythonPackage + directives: + description: Install Python 3.14 + module: Microsoft.WinGet.DSC + allowPrerelease: true + settings: + id: Python.Python.3.14 + source: winget + - resource: Microsoft.WinGet.DSC/WinGetPackage + id: vsPackage + directives: + description: Install Visual Studio 2022 Build Tools + allowPrerelease: true + settings: + id: Microsoft.VisualStudio.2022.BuildTools + source: winget + useLatest: true + - resource: Microsoft.VisualStudio.DSC/VSComponents + id: vsComponents + dependsOn: + - vsPackage + directives: + description: Install required VS workloads and components + allowPrerelease: true + settings: + productId: Microsoft.VisualStudio.Product.BuildTools + channelId: VisualStudio.17.Release + includeRecommended: true + components: + - Microsoft.VisualStudio.Workload.VCTools + - Microsoft.VisualStudio.Component.VC.Llvm.Clang + - Microsoft.VisualStudio.Component.VC.Llvm.ClangToolset + - resource: Microsoft.WinGet.DSC/WinGetPackage + id: gitPackage + directives: + description: Install Git + allowPrerelease: true + settings: + id: Git.Git + source: winget + - resource: Microsoft.WinGet.DSC/WinGetPackage + id: nasmPackage + directives: + description: Install NetWide Assembler (NASM) + allowPrerelease: true + settings: + id: Nasm.Nasm + source: winget + configurationVersion: 0.1.1 diff --git a/.github/workflows/auto-start-ci.yml b/.github/workflows/auto-start-ci.yml index 4aa8e4b4b4665f..747b957ee33c85 100644 --- a/.github/workflows/auto-start-ci.yml +++ b/.github/workflows/auto-start-ci.yml @@ -45,10 +45,6 @@ jobs: if: needs.get-prs-for-ci.outputs.numbers != '' runs-on: ubuntu-slim steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - with: - persist-credentials: false - - name: Install Node.js uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: @@ -62,14 +58,17 @@ jobs: ncu-config set username "$USERNAME" ncu-config set token "$GH_TOKEN" ncu-config set jenkins_token "$JENKINS_TOKEN" - ncu-config set owner "${{ github.repository_owner }}" - ncu-config set repo "$(echo ${{ github.repository }} | cut -d/ -f2)" + ncu-config set owner "$GITHUB_REPOSITORY_OWNER" + ncu-config set repo "$(echo "$GITHUB_REPOSITORY" | cut -d/ -f2)" env: USERNAME: ${{ secrets.JENKINS_USER }} GH_TOKEN: ${{ secrets.GH_USER_TOKEN }} JENKINS_TOKEN: ${{ secrets.JENKINS_TOKEN }} - name: Start the CI - run: ./tools/actions/start-ci.sh ${{ needs.get-prs-for-ci.outputs.numbers }} + run: | + curl -fsSL "https://github.com/${GITHUB_REPOSITORY}/raw/${GITHUB_SHA}/tools/actions/start-ci.sh" \ + | sh -s -- ${{ needs.get-prs-for-ci.outputs.numbers }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GH_REPO: ${{ github.repository }} diff --git a/.github/workflows/build-tarball.yml b/.github/workflows/build-tarball.yml index c01c840f7ae4f1..9311ec2defd9bb 100644 --- a/.github/workflows/build-tarball.yml +++ b/.github/workflows/build-tarball.yml @@ -57,7 +57,7 @@ jobs: export COMMIT=$(git rev-parse --short=10 "$GITHUB_SHA") ./configure && make tar -j4 SKIP_XZ=1 - name: Upload tarball artifact - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: name: tarballs path: '*.tar.gz' @@ -88,7 +88,7 @@ jobs: - name: Environment Information run: npx envinfo - name: Download tarball - uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0 + uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3 # v8.0.0 with: name: tarballs path: tarballs diff --git a/.github/workflows/close-stale-feature-requests.yml b/.github/workflows/close-stale-feature-requests.yml index b6556a72ed790a..cb308cb044bc84 100644 --- a/.github/workflows/close-stale-feature-requests.yml +++ b/.github/workflows/close-stale-feature-requests.yml @@ -41,7 +41,7 @@ jobs: if: github.repository == 'nodejs/node' runs-on: ubuntu-slim steps: - - uses: actions/stale@997185467fa4f803885201cee163a9f38240193d # v10.1.1 + - uses: actions/stale@b5d41d4e1d5dceea10e7104786b73624c18a190f # v10.2.0 with: repo-token: ${{ secrets.GITHUB_TOKEN }} days-before-stale: 180 diff --git a/.github/workflows/close-stalled.yml b/.github/workflows/close-stalled.yml index 0665796700976c..4d36d9e93cbc23 100644 --- a/.github/workflows/close-stalled.yml +++ b/.github/workflows/close-stalled.yml @@ -20,7 +20,7 @@ jobs: if: github.repository == 'nodejs/node' runs-on: ubuntu-slim steps: - - uses: actions/stale@997185467fa4f803885201cee163a9f38240193d # v10.1.1 + - uses: actions/stale@b5d41d4e1d5dceea10e7104786b73624c18a190f # v10.2.0 with: repo-token: ${{ secrets.GITHUB_TOKEN }} days-before-close: 30 diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index d29e734a82fd8c..f34a389bbfb7ba 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -27,15 +27,15 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@b20883b0cd1f46c72ae0ba6d1090936928f9fa30 # v4.32.0 + uses: github/codeql-action/init@89a39a4e59826350b863aa6b6252a07ad50cf83e # v4.32.4 with: languages: ${{ matrix.language }} config-file: ./.github/codeql-config.yml - name: Autobuild - uses: github/codeql-action/autobuild@b20883b0cd1f46c72ae0ba6d1090936928f9fa30 # v4.32.0 + uses: github/codeql-action/autobuild@89a39a4e59826350b863aa6b6252a07ad50cf83e # v4.32.4 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@b20883b0cd1f46c72ae0ba6d1090936928f9fa30 # v4.32.0 + uses: github/codeql-action/analyze@89a39a4e59826350b863aa6b6252a07ad50cf83e # v4.32.4 with: category: /language:${{matrix.language}} diff --git a/.github/workflows/coverage-windows.yml b/.github/workflows/coverage-windows.yml index 17c1dc1e20e88a..b7b0bc58b720bf 100644 --- a/.github/workflows/coverage-windows.yml +++ b/.github/workflows/coverage-windows.yml @@ -3,31 +3,55 @@ name: Coverage Windows on: pull_request: types: [opened, synchronize, reopened, ready_for_review] - paths: - - lib/**/*.js - - vcbuild.bat - - src/**/*.cc - - src/**/*.h - - test/** - - tools/gyp/** - - tools/test.py - - .github/workflows/coverage-windows.yml - - codecov.yml - - .nycrc + paths-ignore: + - '**.md' + - '**.nix' + - eslint.config.mjs + - '**/eslint.config_partial.mjs' + - android-configure + - android-configure.py + - android-patches/** + - benchmarks/** + - doc/** + - pyproject.yml + - tsconfig.json + - test/internet/** + - tools/actions/** + - tools/bootstrap/** + - tools/dep_updaters/** + - tools/doc/** + - tools/eslint-rules/** + - tools/eslint/** + - tools/lint-md/** + - typings/** + - .** + - '!.github/workflows/coverage-windows.yml' push: branches: - main - paths: - - lib/**/*.js - - vcbuild.bat - - src/**/*.cc - - src/**/*.h - - test/** - - tools/gyp/** - - tools/test.py - - .github/workflows/coverage-windows.yml - - codecov.yml - - .nycrc + paths-ignore: + - '**.md' + - '**.nix' + - eslint.config.mjs + - '**/eslint.config_partial.mjs' + - android-configure + - android-configure.py + - android-patches/** + - benchmarks/** + - doc/** + - pyproject.yml + - tsconfig.json + - test/internet/** + - tools/actions/** + - tools/bootstrap/** + - tools/dep_updaters/** + - tools/doc/** + - tools/eslint-rules/** + - tools/eslint/** + - tools/lint-md/** + - typings/** + - .** + - '!.github/workflows/coverage-windows.yml' concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} diff --git a/.github/workflows/daily-wpt-fyi.yml b/.github/workflows/daily-wpt-fyi.yml index 4137589ebea56c..849f039956a2cb 100644 --- a/.github/workflows/daily-wpt-fyi.yml +++ b/.github/workflows/daily-wpt-fyi.yml @@ -48,7 +48,7 @@ jobs: # install a version and checkout - name: Get latest nightly if: matrix.node-version == 'latest-nightly' - run: echo "NIGHTLY=$(curl -s https://nodejs.org/download/nightly/index.json | jq -r '[.[] | select(.files[] | contains("linux-x64"))][0].version')" >> $GITHUB_ENV + run: echo "NIGHTLY=$(curl -s https://nodejs.org/download/nightly/index.json | jq -r '[.[] | select(.files[] | contains("linux-arm64"))][0].version')" >> $GITHUB_ENV - name: Install Node.js id: setup-node uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 @@ -102,7 +102,7 @@ jobs: run: cp wptreport.json wptreport-${{ steps.setup-node.outputs.node-version }}.json - name: Upload GitHub Actions artifact if: ${{ env.WPT_REPORT != '' }} - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: path: out/wpt/wptreport-*.json name: WPT Report for ${{ steps.setup-node.outputs.node-version }} diff --git a/.github/workflows/doc.yml b/.github/workflows/doc.yml index 51268b3c475da4..5cbf96d11626be 100644 --- a/.github/workflows/doc.yml +++ b/.github/workflows/doc.yml @@ -35,7 +35,7 @@ jobs: run: npx envinfo - name: Build run: NODE=$(command -v node) make doc-only - - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 + - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: name: docs path: out/doc diff --git a/.github/workflows/lint-release-proposal.yml b/.github/workflows/lint-release-proposal.yml index 4ebeff30019b34..73617cc43cd012 100644 --- a/.github/workflows/lint-release-proposal.yml +++ b/.github/workflows/lint-release-proposal.yml @@ -88,7 +88,7 @@ jobs: gh api \ -H "Accept: application/vnd.github+json" \ -H "X-GitHub-Api-Version: 2022-11-28" \ - --jq '.commits.[] | { smallSha: .sha[0:10] } + (.commit.message|capture("^(?.+)\n\n(.*\n)*PR-URL: (?<prURL>.+)\n"))' \ + --jq '.commits.[] | { smallSha: .sha[0:10] } + (.commit.message|capture("^(?<title>.+)\n\n(.*\n)*PR-URL: (?<prURL>.+)(\n|$)"))' \ "/repos/${GITHUB_REPOSITORY}/compare/v${MAJOR}.x...$GITHUB_SHA" --paginate \ | node tools/actions/lint-release-proposal-commit-list.mjs "$CHANGELOG_PATH" "$GITHUB_SHA" \ | while IFS= read -r PR_URL; do diff --git a/.github/workflows/notify-on-push.yml b/.github/workflows/notify-on-push.yml index 9b704b788261ba..605a896541f2f3 100644 --- a/.github/workflows/notify-on-push.yml +++ b/.github/workflows/notify-on-push.yml @@ -30,20 +30,16 @@ jobs: validateCommitMessage: name: Notify on Push on `main` with invalid message - if: github.repository == 'nodejs/node' # cannot use ubuntu-slim here because rtCamp/action-slack-notify is dockerized runs-on: ubuntu-24.04-arm steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - with: - persist-credentials: false - - name: Check commit message + - name: Validate commits + run: echo "$COMMITS" | npx -q core-validate-commit - id: commit-check - run: npx -q core-validate-commit "$COMMIT" env: - COMMIT: ${{ github.event.after }} + COMMITS: ${{ toJSON(github.event.commits) }} - name: Slack Notification - if: ${{ failure() && steps.commit-check.conclusion == 'failure' }} + if: ${{ failure() && steps.commit-check.conclusion == 'failure' && github.repository == 'nodejs/node' }} uses: rtCamp/action-slack-notify@e31e87e03dd19038e411e38ae27cbad084a90661 # 2.3.3 env: SLACK_COLOR: '#DE512A' diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index b92abbb1ec7283..fa8263a710ddd1 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -22,7 +22,8 @@ jobs: analysis: name: Scorecard analysis # cannot use ubuntu-slim here because ossf/scorecard-action is dockerized - runs-on: ubuntu-24.04-arm + # cannot use ubuntu-24.04-arm here because the docker image is x86 only + runs-on: ubuntu-latest permissions: # Needed to upload the results to code-scanning dashboard. security-events: write @@ -34,7 +35,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@e3f713f2d8f53843e71c69a996d56f51aa9adfb9 # v2.14.1 + uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0 with: egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs @@ -66,7 +67,7 @@ jobs: # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF # format to the repository Actions tab. - name: Upload artifact - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: name: SARIF file path: results.sarif @@ -74,6 +75,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: Upload to code-scanning - uses: github/codeql-action/upload-sarif@b20883b0cd1f46c72ae0ba6d1090936928f9fa30 # v4.32.0 + uses: github/codeql-action/upload-sarif@89a39a4e59826350b863aa6b6252a07ad50cf83e # v4.32.4 with: sarif_file: results.sarif diff --git a/.github/workflows/timezone-update.yml b/.github/workflows/timezone-update.yml index 83e411ac6040fc..3901a589ab2fa2 100644 --- a/.github/workflows/timezone-update.yml +++ b/.github/workflows/timezone-update.yml @@ -16,7 +16,8 @@ jobs: pull-requests: write # to create a PR (gr2m/create-or-update-pull-request-action) if: github.repository == 'nodejs/node' - runs-on: ubuntu-slim + # cannot use ubuntu-slim here because it does not have icupkg + runs-on: ubuntu-latest steps: - name: Checkout nodejs/node @@ -56,7 +57,7 @@ jobs: with: author: Node.js GitHub Bot <github-bot@iojs.org> body: | - This PR was generated by tools/timezone-update.yml. + This PR was generated by `.github/workflows/timezone-update.yml` and `tools/update-timezone.mjs`. Updates the ICU files as per the instructions present in https://github.com/nodejs/node/blob/main/doc/contributing/maintaining/maintaining-icu.md#time-zone-data diff --git a/.github/workflows/tools.yml b/.github/workflows/tools.yml index 140dc66797825c..8cc1bebb224ffa 100644 --- a/.github/workflows/tools.yml +++ b/.github/workflows/tools.yml @@ -37,6 +37,7 @@ on: - root-certificates - simdjson - sqlite + - test426-fixtures - undici - uvwasi - zlib @@ -51,7 +52,8 @@ permissions: jobs: tools-deps-update: if: github.repository == 'nodejs/node' || github.event_name == 'workflow_dispatch' - runs-on: ubuntu-slim + # cannot use ubuntu-slim here because some update scripts require Docker + runs-on: ubuntu-latest strategy: fail-fast: false # Prevent other jobs from aborting if one fails matrix: @@ -243,6 +245,14 @@ jobs: cat temp-output tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true rm temp-output + - id: test426-fixtures + subsystem: test + label: test + run: | + bash tools/dep_updaters/update-test426-fixtures.sh > temp-output + cat temp-output + tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true + rm temp-output - id: undici subsystem: deps label: dependencies diff --git a/BUILDING.md b/BUILDING.md index effb206c104ccc..23d047563a64a7 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -38,7 +38,6 @@ file a new issue. * [Windows Prerequisites](#windows-prerequisites) * [Option 1: Manual install](#option-1-manual-install) * [Option 2: Automated install with WinGet](#option-2-automated-install-with-winget) - * [Option 3: Automated install with Boxstarter](#option-3-automated-install-with-boxstarter) * [Building Node.js](#building-nodejs-2) * [Using ccache](#using-ccache) * [Android](#android) @@ -154,11 +153,11 @@ platforms. This is true regardless of entries in the table below. Depending on the host platform, the selection of toolchains may vary. -| Operating System | Compiler Versions | -| ---------------- | -------------------------------------------------------------- | -| Linux | GCC >= 12.2 | -| Windows | Visual Studio >= 2022 with the Windows 10 SDK on a 64-bit host | -| macOS | Xcode >= 16.1 (Apple LLVM >= 17) | +| Operating System | Compiler Versions | +| ---------------- | ------------------------------------------------------------------------- | +| Linux | GCC >= 12.2 | +| Windows | Visual Studio 2022 or 2026 with the Windows 10 or 11 SDK on a 64-bit host | +| macOS | Xcode >= 16.1 (Apple LLVM >= 17) | ### Official binary platforms and toolchains @@ -324,11 +323,9 @@ If you are running tests before submitting a pull request, use: make -j4 test ``` -`make -j4 test` does a full check on the codebase, including running linters and -documentation tests. +`make -j4 test` does a full check on the codebase, including documentation tests. -To run the linter without running tests, use -`make lint`/`vcbuild lint`. It will lint JavaScript, C++, and Markdown files. +To run the linter, use `make lint`/`vcbuild lint`. It will lint JavaScript, C++, and Markdown files. To fix auto fixable JavaScript linting errors, use `make lint-js-fix`. @@ -700,55 +697,36 @@ first and then reinstalling them. ##### Option 2: Automated install with WinGet -[WinGet configuration files](https://github.com/nodejs/node/tree/main/.configurations) +[WinGet configuration files](./.configurations) can be used to install all the required prerequisites for Node.js development easily. These files will install the following [WinGet](https://learn.microsoft.com/en-us/windows/package-manager/winget/) packages: * Git for Windows with the `git` and Unix tools added to the `PATH` * `Python 3.14` -* `Visual Studio 2022` (Community, Enterprise or Professional) -* `Visual Studio 2022 Build Tools` with Visual C++ workload, Clang and ClangToolset +* `Visual Studio 2022` (Build Tools, Community, Professional or Enterprise Edition) and + "Desktop development with C++" workload, Clang and ClangToolset optional components * `NetWide Assembler` -To install Node.js prerequisites from PowerShell Terminal: +The following Desired State Configuration (DSC) files are available: -```powershell -winget configure .\.configurations\configuration.dsc.yaml -``` - -##### Option 3: Automated install with Boxstarter +| Edition | DSC Configuration | +| ------------ | ------------------------------------------------------------------------------------------------ | +| Build Tools | [configuration.vsBuildTools.dsc.yaml](./.configurations/configuration.vsBuildTools.dsc.yaml) | +| Community | [configuration.dsc.yaml](./.configurations/configuration.dsc.yaml) | +| Professional | [configuration.vsProfessional.dsc.yaml](./.configurations/configuration.vsProfessional.dsc.yaml) | +| Enterprise | [configuration.vsEnterprise.dsc.yaml](./.configurations/configuration.vsEnterprise.dsc.yaml) | -A [Boxstarter](https://boxstarter.org/) script can be used for easy setup of -Windows systems with all the required prerequisites for Node.js development. -This script will install the following [Chocolatey](https://chocolatey.org/) -packages: - -* [Git for Windows](https://chocolatey.org/packages/git) with the `git` and - Unix tools added to the `PATH` -* [Python 3.x](https://chocolatey.org/packages/python) -* [Visual Studio 2022 Build Tools](https://chocolatey.org/packages/visualstudio2022buildtools) - with [Visual C++ workload](https://chocolatey.org/packages/visualstudio2022-workload-vctools) -* [NetWide Assembler](https://chocolatey.org/packages/nasm) - -To install Node.js prerequisites using -[Boxstarter WebLauncher](https://boxstarter.org/weblauncher), visit -<https://boxstarter.org/package/nr/url?https://raw.githubusercontent.com/nodejs/node/HEAD/tools/bootstrap/windows_boxstarter> -with a supported browser. - -Alternatively, you can use PowerShell. Run those commands from -an elevated (Administrator) PowerShell terminal: +Use one of the above DSC files with +[winget configure](https://learn.microsoft.com/en-us/windows/package-manager/winget/configure#configure-subcommands) +in a PowerShell Terminal to install Node.js prerequisites. +For example, using the DSC file for Visual Studio Community Edition, execute the following command line: ```powershell -Set-ExecutionPolicy Unrestricted -Force -iex ((New-Object System.Net.WebClient).DownloadString('https://boxstarter.org/bootstrapper.ps1')) -get-boxstarter -Force -Install-BoxstarterPackage https://raw.githubusercontent.com/nodejs/node/HEAD/tools/bootstrap/windows_boxstarter -DisableReboots -refreshenv +winget configure .\.configurations\configuration.dsc.yaml ``` -The entire installation using Boxstarter will take up approximately 10 GB of -disk space. +To add optional components for MSI or ARM64 builds, refer to [Option 1: Manual install](#option-1-manual-install). #### Building Node.js diff --git a/Makefile b/Makefile index 794d45ddbc98da..1dbb9f95206aa6 100644 --- a/Makefile +++ b/Makefile @@ -338,7 +338,7 @@ coverage-run-js: ## Run JavaScript tests with coverage. .PHONY: test # This does not run tests of third-party libraries inside deps. -test: all ## Run default tests, linters, and build docs. +test: all ## Run default tests and build docs. $(MAKE) -s tooltest $(MAKE) -s test-doc $(MAKE) -s build-addons @@ -349,7 +349,7 @@ test: all ## Run default tests, linters, and build docs. $(MAKE) -s jstest .PHONY: test-only -test-only: all ## Run default tests, without linters or building the docs. +test-only: all ## Run default tests without building the docs. $(MAKE) build-addons $(MAKE) build-js-native-api-tests $(MAKE) build-node-api-tests diff --git a/README.md b/README.md index 537b4776ca92a1..d9148ca44ab0cd 100644 --- a/README.md +++ b/README.md @@ -757,6 +757,8 @@ maintaining the Node.js project. **Oliver Medhurst** <<honk@goose.icu>> (they/them) * [daeyeon](https://github.com/daeyeon) - **Daeyeon Jeong** <<daeyeon.dev@gmail.com>> (he/him) +* [efekrskl](https://github.com/efekrskl) - + **Efe Karasakal** <<hi@efe.dev>> (he/him) * [gireeshpunathil](https://github.com/gireeshpunathil) - **Gireesh Punathil** <<gpunathi@in.ibm.com>> (he/him) * [gurgunday](https://github.com/gurgunday) - @@ -889,15 +891,15 @@ releases on a rotation basis as outlined in the * [bengl](https://github.com/bengl) - **Bryan English** <<bryan@bryanenglish.com>> (he/him) * [HeroDevs](https://www.herodevs.com/) - * [marco-ippolito](https://github.com/marco-ippolito) - OpenJSF handle: `Marco Ippolito` + * [juanarbol](https://github.com/juanarbol) - OpenJS Slack handle: `juanarbol` + **Juan José Arboleda** <<soyjuanarbol@gmail.com>> (he/him) + * [marco-ippolito](https://github.com/marco-ippolito) - OpenJS Slack handle: `Marco Ippolito` **Marco Ippolito** <<marcoippolito54@gmail.com>> (he/him) * [NodeSource](https://nodesource.com/) - * [juanarbol](https://github.com/juanarbol) - - **Juan José Arboleda** <<soyjuanarbol@gmail.com>> (he/him) - * [RafaelGSS](https://github.com/RafaelGSS) - OpenJSF handle: `RafaelGSS` + * [RafaelGSS](https://github.com/RafaelGSS) - OpenJS Slack handle: `RafaelGSS` **Rafael Gonzaga** <<rafael.nunu@hotmail.com>> (he/him) * [Platformatic](https://platformatic.dev/) - * [mcollina](https://github.com/mcollina) - OpenJSF handle: `mcollina` + * [mcollina](https://github.com/mcollina) - OpenJS Slack handle: `mcollina` **Matteo Collina** <<matteo.collina@gmail.com>> (he/him) * [Red Hat](https://redhat.com) / [IBM](https://ibm.com) * [BethGriggs](https://github.com/BethGriggs) - diff --git a/SECURITY.md b/SECURITY.md index 6213ca3d43a704..d44018e915ee80 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -320,9 +320,17 @@ the community they pose. * Avoid exposing low-level or dangerous APIs directly to untrusted users. * Examples of scenarios that are **not** Node.js vulnerabilities: - * Allowing untrusted users to register SQLite user-defined functions that can - perform arbitrary operations (e.g., closing database connections during query - execution, causing crashes or use-after-free conditions). + * Allowing untrusted users to register SQLite user-defined functions via + `node:sqlite` (`DatabaseSync`) that can perform arbitrary operations + (e.g., closing database connections during query execution, causing crashes + or use-after-free conditions). + * Loading SQLite extensions using the `allowExtension` option in + `DatabaseSync` — this option must be explicitly set to `true` by the + application, and enabling it is the application operator's responsibility. + * Using `node:sqlite` built-in SQL functions or pragmas (e.g., + `ATTACH DATABASE`) to read or write files — `DatabaseSync` operates with + the same file-system access as the process itself, and it is the + application's responsibility to restrict what SQL is executed. * Exposing `child_process.exec()` or similar APIs to untrusted users without proper input validation, allowing command injection. * Allowing untrusted users to control file paths passed to file system APIs @@ -335,6 +343,21 @@ the community they pose. proper security boundaries between trusted application logic and untrusted user input. +#### Build System Attacks Requiring Control of the Build Environment (CWE-78, CWE-114, CWE-276) + +* The Node.js build system (e.g., `configure`, `configure.py`, `Makefile`, + `vcbuild.bat`) is designed to run in a trusted build environment. + The build environment, including environment variables, the file system, + and locally installed tools, is a trusted element in the Node.js threat model. +* Reports about command injection via environment variables in build scripts + (e.g., `CC`, `CXX`, `PKG_CONFIG`, `RUSTC`), path hijacking in build output + directories, or file permissions of build artifacts are **not** considered + vulnerabilities. These scenarios require the attacker to already have control + over the build environment, which means the system is already compromised. +* Build scripts are not a security boundary. They are expected to execute + tools and scripts specified by the environment, and to trust the + file system they operate on. + #### Unhandled 'error' Events on EventEmitters (CWE-248) * EventEmitters that can emit `'error'` events require the application to @@ -347,6 +370,56 @@ the community they pose. responsibility to properly handle errors by attaching appropriate `'error'` event listeners to EventEmitters that may emit errors. +#### Permission Model Boundaries (`--permission`) + +The Node.js [Permission Model](https://nodejs.org/api/permissions.html) +(`--experimental-permission`) is an opt-in mechanism that limits which +resources a Node.js process may access. It is designed to reduce the blast +radius of mistakes in trusted application code, **not** to act as a security +boundary against intentional misuse or a compromised process. + +The following are **not** vulnerabilities in Node.js: + +* **Operator-controlled flags**: Behavior unlocked by flags the operator + explicitly passes (e.g., `--localstorage-file`) is the operator's + responsibility. The permission model does not restrict how Node.js behaves + when the operator intentionally configures it. + +* **`node:sqlite` and the permission model**: `DatabaseSync` operates with the + same file-system privileges as the process. Using SQL pragmas or built-in + SQLite mechanisms (e.g., `ATTACH DATABASE`) to access files does not bypass + the permission model — the permission model does not intercept SQL-level + file operations. + +* **Path resolution and symlinks**: `fs.realpathSync()`, `fs.realpath()`, and + similar functions resolve a path to its canonical form before the permission + check is applied. Accessing a file through a symlink that resolves to an + allowed path is the intended behavior, not a bypass. TOCTOU races on + symlinks that resolve within the allowed list are similarly not considered + permission model bypasses. + +* **`worker_threads` with modified `execArgv`**: Workers inherit the permission + restrictions of their parent process. Passing an empty or modified `execArgv` + to a worker does not grant it additional permissions. + +#### V8 Sandbox + +The V8 sandbox is an in-process isolation mechanism internal to V8 that is not +a Node.js security boundary. Node.js does not guarantee or document the V8 +sandbox as a security feature, and it is not enabled in a way that provides +security guarantees in production Node.js builds. Reports about escaping the V8 +sandbox are not considered Node.js vulnerabilities; they should be reported +directly to the [V8 project](https://v8.dev/docs/security-bugs). + +#### CRLF Injection in `writeEarlyHints()` + +`ServerResponse.writeEarlyHints()` accepts a `link` header value that is set +by the application. Passing arbitrary strings, including CRLF sequences, as +the `link` value is an application-level misuse of the API, not a Node.js +vulnerability. Node.js validates the structure of Early Hints per the HTTP spec +but does not sanitize free-form application data passed to it; that is the +application's responsibility. + ## Assessing experimental features reports Experimental features are eligible for security reports just like any other diff --git a/benchmark/buffers/buffer-bytelength-string.js b/benchmark/buffers/buffer-bytelength-string.js index 557bc8d6fe38d6..65d92cb6f1cbba 100644 --- a/benchmark/buffers/buffer-bytelength-string.js +++ b/benchmark/buffers/buffer-bytelength-string.js @@ -4,7 +4,7 @@ const common = require('../common'); const bench = common.createBenchmark(main, { type: ['one_byte', 'two_bytes', 'three_bytes', 'four_bytes', 'latin1'], - encoding: ['utf8', 'base64'], + encoding: ['utf8', 'base64', 'latin1', 'hex'], repeat: [1, 2, 16, 256], // x16 n: [4e6], }); diff --git a/benchmark/buffers/buffer-copy-bytes-from.js b/benchmark/buffers/buffer-copy-bytes-from.js new file mode 100644 index 00000000000000..508092264f3a43 --- /dev/null +++ b/benchmark/buffers/buffer-copy-bytes-from.js @@ -0,0 +1,31 @@ +'use strict'; + +const common = require('../common.js'); + +const bench = common.createBenchmark(main, { + type: ['Uint8Array', 'Uint16Array', 'Uint32Array', 'Float64Array'], + len: [64, 256, 2048], + partial: ['none', 'offset', 'offset-length'], + n: [6e5], +}); + +function main({ n, len, type, partial }) { + const TypedArrayCtor = globalThis[type]; + const src = new TypedArrayCtor(len); + for (let i = 0; i < len; i++) src[i] = i; + + let offset; + let length; + if (partial === 'offset') { + offset = len >>> 2; + } else if (partial === 'offset-length') { + offset = len >>> 2; + length = len >>> 1; + } + + bench.start(); + for (let i = 0; i < n; i++) { + Buffer.copyBytesFrom(src, offset, length); + } + bench.end(n); +} diff --git a/benchmark/buffers/buffer-fill.js b/benchmark/buffers/buffer-fill.js index f1ae896843eee0..95e584e246af73 100644 --- a/benchmark/buffers/buffer-fill.js +++ b/benchmark/buffers/buffer-fill.js @@ -10,6 +10,7 @@ const bench = common.createBenchmark(main, { 'fill("t")', 'fill("test")', 'fill("t", "utf8")', + 'fill("t", "ascii")', 'fill("t", 0, "utf8")', 'fill("t", 0)', 'fill(Buffer.alloc(1), 0)', diff --git a/benchmark/buffers/buffer-indexof.js b/benchmark/buffers/buffer-indexof.js index 52cc95ccb9cf7e..ac5dffdd6d9103 100644 --- a/benchmark/buffers/buffer-indexof.js +++ b/benchmark/buffers/buffer-indexof.js @@ -19,7 +19,7 @@ const searchStrings = [ const bench = common.createBenchmark(main, { search: searchStrings, - encoding: ['undefined', 'utf8', 'ucs2'], + encoding: ['undefined', 'utf8', 'ascii', 'latin1', 'ucs2'], type: ['buffer', 'string'], n: [5e4], }, { diff --git a/benchmark/buffers/buffer-tostring.js b/benchmark/buffers/buffer-tostring.js index 0638dc996b39ac..64d2373d49980d 100644 --- a/benchmark/buffers/buffer-tostring.js +++ b/benchmark/buffers/buffer-tostring.js @@ -3,7 +3,7 @@ const common = require('../common.js'); const bench = common.createBenchmark(main, { - encoding: ['', 'utf8', 'ascii', 'latin1', 'hex', 'UCS-2'], + encoding: ['', 'utf8', 'ascii', 'latin1', 'hex', 'base64', 'base64url', 'UCS-2'], args: [0, 1, 3], len: [1, 64, 1024], n: [1e6], diff --git a/benchmark/buffers/buffer-transcode.js b/benchmark/buffers/buffer-transcode.js index cbb3b2e9b16374..4f985ac408459b 100644 --- a/benchmark/buffers/buffer-transcode.js +++ b/benchmark/buffers/buffer-transcode.js @@ -8,7 +8,7 @@ const encodings = ['latin1', 'ascii', 'ucs2', 'utf8']; if (!hasIntl) { console.log('Skipping: `transcode` is only available on platforms that support i18n`'); - process.exit(0); + return; } const bench = common.createBenchmark(main, { diff --git a/benchmark/crypto/hash-stream-creation.js b/benchmark/crypto/hash-stream-creation.js index 5143be03263d74..0adb7d87f93959 100644 --- a/benchmark/crypto/hash-stream-creation.js +++ b/benchmark/crypto/hash-stream-creation.js @@ -5,7 +5,7 @@ const common = require('../common.js'); const crypto = require('crypto'); const bench = common.createBenchmark(main, { - writes: [500], + n: [500], algo: [ 'sha256', 'md5' ], type: ['asc', 'utf', 'buf'], out: ['hex', 'binary', 'buffer'], @@ -13,7 +13,7 @@ const bench = common.createBenchmark(main, { api: ['legacy', 'stream'], }); -function main({ api, type, len, out, writes, algo }) { +function main({ api, type, len, out, n, algo }) { if (api === 'stream' && /^v0\.[0-8]\./.test(process.version)) { console.error('Crypto streams not available until v0.10'); // Use the legacy, just so that we can compare them. @@ -41,15 +41,15 @@ function main({ api, type, len, out, writes, algo }) { const fn = api === 'stream' ? streamWrite : legacyWrite; bench.start(); - fn(algo, message, encoding, writes, len, out); + fn(algo, message, encoding, n, len, out); } -function legacyWrite(algo, message, encoding, writes, len, outEnc) { - const written = writes * len; +function legacyWrite(algo, message, encoding, n, len, outEnc) { + const written = n * len; const bits = written * 8; const gbits = bits / (1024 * 1024 * 1024); - while (writes-- > 0) { + while (n-- > 0) { const h = crypto.createHash(algo); h.update(message, encoding); h.digest(outEnc); @@ -58,12 +58,12 @@ function legacyWrite(algo, message, encoding, writes, len, outEnc) { bench.end(gbits); } -function streamWrite(algo, message, encoding, writes, len, outEnc) { - const written = writes * len; +function streamWrite(algo, message, encoding, n, len, outEnc) { + const written = n * len; const bits = written * 8; const gbits = bits / (1024 * 1024 * 1024); - while (writes-- > 0) { + while (n-- > 0) { const h = crypto.createHash(algo); if (outEnc !== 'buffer') diff --git a/benchmark/crypto/hash-stream-throughput.js b/benchmark/crypto/hash-stream-throughput.js index db10c439e0e446..4a5dbbd440ba16 100644 --- a/benchmark/crypto/hash-stream-throughput.js +++ b/benchmark/crypto/hash-stream-throughput.js @@ -5,14 +5,14 @@ const common = require('../common.js'); const crypto = require('crypto'); const bench = common.createBenchmark(main, { - writes: [500], + n: [500], algo: ['sha1', 'sha256', 'sha512'], type: ['asc', 'utf', 'buf'], len: [2, 1024, 102400, 1024 * 1024], api: ['legacy', 'stream'], }); -function main({ api, type, len, algo, writes }) { +function main({ api, type, len, algo, n }) { if (api === 'stream' && /^v0\.[0-8]\./.test(process.version)) { console.error('Crypto streams not available until v0.10'); // Use the legacy, just so that we can compare them. @@ -40,16 +40,16 @@ function main({ api, type, len, algo, writes }) { const fn = api === 'stream' ? streamWrite : legacyWrite; bench.start(); - fn(algo, message, encoding, writes, len); + fn(algo, message, encoding, n, len); } -function legacyWrite(algo, message, encoding, writes, len) { - const written = writes * len; +function legacyWrite(algo, message, encoding, n, len) { + const written = n * len; const bits = written * 8; const gbits = bits / (1024 * 1024 * 1024); const h = crypto.createHash(algo); - while (writes-- > 0) + while (n-- > 0) h.update(message, encoding); h.digest(); @@ -57,13 +57,13 @@ function legacyWrite(algo, message, encoding, writes, len) { bench.end(gbits); } -function streamWrite(algo, message, encoding, writes, len) { - const written = writes * len; +function streamWrite(algo, message, encoding, n, len) { + const written = n * len; const bits = written * 8; const gbits = bits / (1024 * 1024 * 1024); const h = crypto.createHash(algo); - while (writes-- > 0) + while (n-- > 0) h.write(message, encoding); h.end(); diff --git a/benchmark/crypto/rsa-sign-verify-throughput.js b/benchmark/crypto/rsa-sign-verify-throughput.js index ceaa2942780a8e..8cdd1378b359dc 100644 --- a/benchmark/crypto/rsa-sign-verify-throughput.js +++ b/benchmark/crypto/rsa-sign-verify-throughput.js @@ -17,20 +17,20 @@ keylen_list.forEach((key) => { }); const bench = common.createBenchmark(main, { - writes: [500], + n: [500], algo: ['SHA1', 'SHA224', 'SHA256', 'SHA384', 'SHA512'], keylen: keylen_list, len: [1024, 102400, 2 * 102400, 3 * 102400, 1024 * 1024], }); -function main({ len, algo, keylen, writes }) { +function main({ len, algo, keylen, n }) { const message = Buffer.alloc(len, 'b'); bench.start(); - StreamWrite(algo, keylen, message, writes, len); + StreamWrite(algo, keylen, message, n, len); } -function StreamWrite(algo, keylen, message, writes, len) { - const written = writes * len; +function StreamWrite(algo, keylen, message, n, len) { + const written = n * len; const bits = written * 8; const kbits = bits / (1024); @@ -38,7 +38,7 @@ function StreamWrite(algo, keylen, message, writes, len) { const s = crypto.createSign(algo); const v = crypto.createVerify(algo); - while (writes-- > 0) { + while (n-- > 0) { s.update(message); v.update(message); } diff --git a/benchmark/dgram/single-buffer.js b/benchmark/dgram/single-buffer.js index bab8cee1594f24..9ac41d15da8d20 100644 --- a/benchmark/dgram/single-buffer.js +++ b/benchmark/dgram/single-buffer.js @@ -5,7 +5,7 @@ const common = require('../common.js'); const dgram = require('dgram'); const PORT = common.PORT; -// `num` is the number of send requests to queue up each time. +// `n` is the number of send requests to queue up each time. // Keep it reasonably high (>10) otherwise you're benchmarking the speed of // event loop cycles more than anything else. const bench = common.createBenchmark(main, { @@ -15,7 +15,7 @@ const bench = common.createBenchmark(main, { dur: [5], }); -function main({ dur, len, num: n, type }) { +function main({ dur, len, n, type }) { const chunk = Buffer.allocUnsafe(len); let sent = 0; let received = 0; diff --git a/test/fixtures/wpt/FileAPI/BlobURL/support/file_test2.txt b/benchmark/fixtures/empty.mjs similarity index 100% rename from test/fixtures/wpt/FileAPI/BlobURL/support/file_test2.txt rename to benchmark/fixtures/empty.mjs diff --git a/benchmark/fixtures/import-builtins.mjs b/benchmark/fixtures/import-builtins.mjs new file mode 100644 index 00000000000000..03feaa4887c362 --- /dev/null +++ b/benchmark/fixtures/import-builtins.mjs @@ -0,0 +1,34 @@ +import 'node:async_hooks'; +import 'node:assert'; +import 'node:buffer'; +import 'node:child_process'; +import 'node:console'; +import 'node:constants'; +import 'node:crypto'; +import 'node:cluster'; +import 'node:dgram'; +import 'node:dns'; +import 'node:domain'; +import 'node:events'; +import 'node:fs'; +import 'node:http'; +import 'node:http2'; +import 'node:https'; +import 'node:module'; +import 'node:net'; +import 'node:os'; +import 'node:path'; +import 'node:perf_hooks'; +import 'node:process'; +import 'node:querystring'; +import 'node:readline'; +import 'node:repl'; +import 'node:stream'; +import 'node:string_decoder'; +import 'node:timers'; +import 'node:tls'; +import 'node:tty'; +import 'node:url'; +import 'node:util'; +import 'node:vm'; +import 'node:zlib'; diff --git a/benchmark/misc/startup-core.js b/benchmark/misc/startup-core.js index 053a1ec0cbff8f..414b00176ad2c2 100644 --- a/benchmark/misc/startup-core.js +++ b/benchmark/misc/startup-core.js @@ -7,9 +7,11 @@ let Worker; // Lazy loaded in main const bench = common.createBenchmark(main, { script: [ - 'benchmark/fixtures/require-builtins', - 'test/fixtures/semicolon', - 'test/fixtures/snapshot/typescript', + 'benchmark/fixtures/empty.mjs', + 'benchmark/fixtures/import-builtins.mjs', + 'benchmark/fixtures/require-builtins.js', + 'test/fixtures/semicolon.js', + 'test/fixtures/snapshot/typescript.js', ], mode: ['process', 'worker'], n: [30], @@ -58,7 +60,7 @@ function spawnWorker(script, bench, state) { } function main({ n, script, mode }) { - script = path.resolve(__dirname, '../../', `${script}.js`); + script = path.resolve(__dirname, '../../', `${script}`); const warmup = 3; const state = { n, finished: -warmup }; if (mode === 'worker') { diff --git a/benchmark/util/strip-vt-control-characters.js b/benchmark/util/strip-vt-control-characters.js new file mode 100644 index 00000000000000..a83b03bb2bb26d --- /dev/null +++ b/benchmark/util/strip-vt-control-characters.js @@ -0,0 +1,36 @@ +'use strict'; + +const common = require('../common.js'); + +const { stripVTControlCharacters } = require('node:util'); +const assert = require('node:assert'); + +const bench = common.createBenchmark(main, { + input: ['noAnsi-short', 'noAnsi-long', 'ansi-short', 'ansi-long'], + n: [1e6], +}); + +function main({ input, n }) { + let str; + switch (input) { + case 'noAnsi-short': + str = 'This is a plain text string without any ANSI codes'; + break; + case 'noAnsi-long': + str = 'Long plain text without ANSI. '.repeat(333); + break; + case 'ansi-short': + str = '\u001B[31mHello\u001B[39m'; + break; + case 'ansi-long': + str = ('\u001B[31m' + 'colored text '.repeat(10) + '\u001B[39m').repeat(10); + break; + } + + bench.start(); + for (let i = 0; i < n; i++) { + const result = stripVTControlCharacters(str); + assert.ok(typeof result === 'string'); + } + bench.end(n); +} diff --git a/benchmark/webstreams/readable-read-buffered.js b/benchmark/webstreams/readable-read-buffered.js new file mode 100644 index 00000000000000..653d5577ef1e95 --- /dev/null +++ b/benchmark/webstreams/readable-read-buffered.js @@ -0,0 +1,54 @@ +'use strict'; +const common = require('../common.js'); +const { ReadableStream } = require('node:stream/web'); + +// Benchmark for reading from a pre-buffered ReadableStream. +// This measures the fast path optimization where data is already +// queued in the controller, avoiding DefaultReadRequest allocation. + +const bench = common.createBenchmark(main, { + n: [1e5], + bufferSize: [1, 10, 100, 1000], +}); + +async function main({ n, bufferSize }) { + let enqueued = 0; + + const rs = new ReadableStream({ + start(controller) { + // Pre-fill the buffer + for (let i = 0; i < bufferSize; i++) { + controller.enqueue('a'); + enqueued++; + } + }, + pull(controller) { + // Refill buffer when pulled + const toEnqueue = Math.min(bufferSize, n - enqueued); + for (let i = 0; i < toEnqueue; i++) { + controller.enqueue('a'); + enqueued++; + } + if (enqueued >= n) { + controller.close(); + } + }, + }, { + // Use buffer size as high water mark to allow pre-buffering + highWaterMark: bufferSize, + }); + + const reader = rs.getReader(); + let x = null; + let reads = 0; + + bench.start(); + while (reads < n) { + const { value, done } = await reader.read(); + if (done) break; + x = value; + reads++; + } + bench.end(reads); + console.assert(x); +} diff --git a/common.gypi b/common.gypi index 21a7aa3e6ceef9..87d35a2771812c 100644 --- a/common.gypi +++ b/common.gypi @@ -38,7 +38,7 @@ # Reset this number to 0 on major V8 upgrades. # Increment by one for each non-official patch applied to deps/v8. - 'v8_embedder_string': '-node.46', + 'v8_embedder_string': '-node.47', ##### V8 defaults for Node.js ##### diff --git a/configure.py b/configure.py index 53a045c626acb1..fa25de8c316b71 100755 --- a/configure.py +++ b/configure.py @@ -1800,10 +1800,9 @@ def configure_library(lib, output, pkgname=None): output['libraries'] += [pkg_libpath] default_libs = getattr(options, shared_lib + '_libname') - default_libs = [f'-l{l}' for l in default_libs.split(',')] if default_libs: - output['libraries'] += default_libs + output['libraries'] += [f'-l{l}' for l in default_libs.split(',')] elif pkg_libs: output['libraries'] += pkg_libs.split() diff --git a/deps/acorn/acorn-walk/CHANGELOG.md b/deps/acorn/acorn-walk/CHANGELOG.md index 7aeae8fd5c8622..de4168f21a4508 100644 --- a/deps/acorn/acorn-walk/CHANGELOG.md +++ b/deps/acorn/acorn-walk/CHANGELOG.md @@ -1,3 +1,13 @@ +## 8.3.5 (2026-02-19) + +### Bug fixes + +Emit a more informative error message when trying to walk a node type that has no walker function. + +Specify callbacks in types to receive `AnyNode` type, so that they can be narrowed more easily. + +Support import attributes. + ## 8.3.4 (2024-09-09) ### Bug fixes diff --git a/deps/acorn/acorn-walk/README.md b/deps/acorn/acorn-walk/README.md index 3c18a2c76a938e..eaec57fda3b3ff 100644 --- a/deps/acorn/acorn-walk/README.md +++ b/deps/acorn/acorn-walk/README.md @@ -47,8 +47,8 @@ produce a meaningful state. (An example of a use of state is to track scope at each point in the tree.) ```js -const acorn = require("acorn") -const walk = require("acorn-walk") +import * as acorn from "acorn" +import * as walk from "acorn-walk" walk.simple(acorn.parse("let x = 10"), { Literal(node) { @@ -62,8 +62,8 @@ a tree, building up an array of ancestor nodes (including the current node) and passing the array to the callbacks as a third parameter. ```js -const acorn = require("acorn") -const walk = require("acorn-walk") +import * as acorn from "acorn" +import * as walk from "acorn-walk" walk.ancestor(acorn.parse("foo('hi')"), { Literal(_node, _state, ancestors) { @@ -97,8 +97,8 @@ current node) and passing the array to the callbacks as a third parameter. ```js -const acorn = require("acorn") -const walk = require("acorn-walk") +import * as acorn from "acorn" +import * as walk from "acorn-walk" walk.full(acorn.parse("1 + 1"), node => { console.log(`There's a ${node.type} node at ${node.ch}`) diff --git a/deps/acorn/acorn-walk/dist/walk.d.mts b/deps/acorn/acorn-walk/dist/walk.d.mts index e07a6afaf8e336..199c8a0159b8f2 100644 --- a/deps/acorn/acorn-walk/dist/walk.d.mts +++ b/deps/acorn/acorn-walk/dist/walk.d.mts @@ -1,15 +1,15 @@ import * as acorn from "acorn" export type FullWalkerCallback<TState> = ( - node: acorn.Node, + node: acorn.AnyNode, state: TState, type: string ) => void export type FullAncestorWalkerCallback<TState> = ( - node: acorn.Node, + node: acorn.AnyNode, state: TState, - ancestors: acorn.Node[], + ancestors: acorn.AnyNode[], type: string ) => void @@ -29,13 +29,13 @@ export type SimpleVisitors<TState> = { } export type AncestorVisitors<TState> = { - [type in acorn.AnyNode["type"]]?: ( node: Extract<acorn.AnyNode, { type: type }>, state: TState, ancestors: acorn.Node[] + [type in acorn.AnyNode["type"]]?: ( node: Extract<acorn.AnyNode, { type: type }>, state: TState, ancestors: acorn.AnyNode[] ) => void } & { - [type in keyof AggregateType]?: (node: AggregateType[type], state: TState, ancestors: acorn.Node[]) => void + [type in keyof AggregateType]?: (node: AggregateType[type], state: TState, ancestors: acorn.AnyNode[]) => void } -export type WalkerCallback<TState> = (node: acorn.Node, state: TState) => void +export type WalkerCallback<TState> = (node: acorn.AnyNode, state: TState) => void export type RecursiveVisitors<TState> = { [type in acorn.AnyNode["type"]]?: ( node: Extract<acorn.AnyNode, { type: type }>, state: TState, callback: WalkerCallback<TState>) => void @@ -43,10 +43,10 @@ export type RecursiveVisitors<TState> = { [type in keyof AggregateType]?: (node: AggregateType[type], state: TState, callback: WalkerCallback<TState>) => void } -export type FindPredicate = (type: string, node: acorn.Node) => boolean +export type FindPredicate = (type: string, node: acorn.AnyNode) => boolean export interface Found<TState> { - node: acorn.Node, + node: acorn.AnyNode, state: TState } @@ -66,10 +66,6 @@ export function simple<TState>( /** * does a 'simple' walk over a tree, building up an array of ancestor nodes (including the current node) and passing the array to the callbacks as a third parameter. - * @param node - * @param visitors - * @param base - * @param state */ export function ancestor<TState>( node: acorn.Node, @@ -94,10 +90,6 @@ export function recursive<TState>( /** * does a 'full' walk over a tree, calling the {@link callback} with the arguments (node, state, type) for each node - * @param node - * @param callback - * @param base - * @param state */ export function full<TState>( node: acorn.Node, @@ -108,10 +100,6 @@ export function full<TState>( /** * does a 'full' walk over a tree, building up an array of ancestor nodes (including the current node) and passing the array to the callbacks as a third parameter. - * @param node - * @param callback - * @param base - * @param state */ export function fullAncestor<TState>( node: acorn.Node, @@ -122,8 +110,6 @@ export function fullAncestor<TState>( /** * builds a new walker object by using the walker functions in {@link functions} and filling in the missing ones by taking defaults from {@link base}. - * @param functions - * @param base */ export function make<TState>( functions: RecursiveVisitors<TState>, @@ -132,17 +118,11 @@ export function make<TState>( /** * tries to locate a node in a tree at the given start and/or end offsets, which satisfies the predicate test. {@link start} and {@link end} can be either `null` (as wildcard) or a `number`. {@link test} may be a string (indicating a node type) or a function that takes (nodeType, node) arguments and returns a boolean indicating whether this node is interesting. {@link base} and {@link state} are optional, and can be used to specify a custom walker. Nodes are tested from inner to outer, so if two nodes match the boundaries, the inner one will be preferred. - * @param node - * @param start - * @param end - * @param type - * @param base - * @param state */ export function findNodeAt<TState>( node: acorn.Node, - start: number | undefined, - end?: number | undefined, + start: number | undefined | null, + end?: number | undefined | null, type?: FindPredicate | string, base?: RecursiveVisitors<TState>, state?: TState @@ -150,15 +130,10 @@ export function findNodeAt<TState>( /** * like {@link findNodeAt}, but will match any node that exists 'around' (spanning) the given position. - * @param node - * @param start - * @param type - * @param base - * @param state */ export function findNodeAround<TState>( node: acorn.Node, - start: number | undefined, + start: number | undefined | null, type?: FindPredicate | string, base?: RecursiveVisitors<TState>, state?: TState diff --git a/deps/acorn/acorn-walk/dist/walk.d.ts b/deps/acorn/acorn-walk/dist/walk.d.ts index e07a6afaf8e336..199c8a0159b8f2 100644 --- a/deps/acorn/acorn-walk/dist/walk.d.ts +++ b/deps/acorn/acorn-walk/dist/walk.d.ts @@ -1,15 +1,15 @@ import * as acorn from "acorn" export type FullWalkerCallback<TState> = ( - node: acorn.Node, + node: acorn.AnyNode, state: TState, type: string ) => void export type FullAncestorWalkerCallback<TState> = ( - node: acorn.Node, + node: acorn.AnyNode, state: TState, - ancestors: acorn.Node[], + ancestors: acorn.AnyNode[], type: string ) => void @@ -29,13 +29,13 @@ export type SimpleVisitors<TState> = { } export type AncestorVisitors<TState> = { - [type in acorn.AnyNode["type"]]?: ( node: Extract<acorn.AnyNode, { type: type }>, state: TState, ancestors: acorn.Node[] + [type in acorn.AnyNode["type"]]?: ( node: Extract<acorn.AnyNode, { type: type }>, state: TState, ancestors: acorn.AnyNode[] ) => void } & { - [type in keyof AggregateType]?: (node: AggregateType[type], state: TState, ancestors: acorn.Node[]) => void + [type in keyof AggregateType]?: (node: AggregateType[type], state: TState, ancestors: acorn.AnyNode[]) => void } -export type WalkerCallback<TState> = (node: acorn.Node, state: TState) => void +export type WalkerCallback<TState> = (node: acorn.AnyNode, state: TState) => void export type RecursiveVisitors<TState> = { [type in acorn.AnyNode["type"]]?: ( node: Extract<acorn.AnyNode, { type: type }>, state: TState, callback: WalkerCallback<TState>) => void @@ -43,10 +43,10 @@ export type RecursiveVisitors<TState> = { [type in keyof AggregateType]?: (node: AggregateType[type], state: TState, callback: WalkerCallback<TState>) => void } -export type FindPredicate = (type: string, node: acorn.Node) => boolean +export type FindPredicate = (type: string, node: acorn.AnyNode) => boolean export interface Found<TState> { - node: acorn.Node, + node: acorn.AnyNode, state: TState } @@ -66,10 +66,6 @@ export function simple<TState>( /** * does a 'simple' walk over a tree, building up an array of ancestor nodes (including the current node) and passing the array to the callbacks as a third parameter. - * @param node - * @param visitors - * @param base - * @param state */ export function ancestor<TState>( node: acorn.Node, @@ -94,10 +90,6 @@ export function recursive<TState>( /** * does a 'full' walk over a tree, calling the {@link callback} with the arguments (node, state, type) for each node - * @param node - * @param callback - * @param base - * @param state */ export function full<TState>( node: acorn.Node, @@ -108,10 +100,6 @@ export function full<TState>( /** * does a 'full' walk over a tree, building up an array of ancestor nodes (including the current node) and passing the array to the callbacks as a third parameter. - * @param node - * @param callback - * @param base - * @param state */ export function fullAncestor<TState>( node: acorn.Node, @@ -122,8 +110,6 @@ export function fullAncestor<TState>( /** * builds a new walker object by using the walker functions in {@link functions} and filling in the missing ones by taking defaults from {@link base}. - * @param functions - * @param base */ export function make<TState>( functions: RecursiveVisitors<TState>, @@ -132,17 +118,11 @@ export function make<TState>( /** * tries to locate a node in a tree at the given start and/or end offsets, which satisfies the predicate test. {@link start} and {@link end} can be either `null` (as wildcard) or a `number`. {@link test} may be a string (indicating a node type) or a function that takes (nodeType, node) arguments and returns a boolean indicating whether this node is interesting. {@link base} and {@link state} are optional, and can be used to specify a custom walker. Nodes are tested from inner to outer, so if two nodes match the boundaries, the inner one will be preferred. - * @param node - * @param start - * @param end - * @param type - * @param base - * @param state */ export function findNodeAt<TState>( node: acorn.Node, - start: number | undefined, - end?: number | undefined, + start: number | undefined | null, + end?: number | undefined | null, type?: FindPredicate | string, base?: RecursiveVisitors<TState>, state?: TState @@ -150,15 +130,10 @@ export function findNodeAt<TState>( /** * like {@link findNodeAt}, but will match any node that exists 'around' (spanning) the given position. - * @param node - * @param start - * @param type - * @param base - * @param state */ export function findNodeAround<TState>( node: acorn.Node, - start: number | undefined, + start: number | undefined | null, type?: FindPredicate | string, base?: RecursiveVisitors<TState>, state?: TState diff --git a/deps/acorn/acorn-walk/dist/walk.js b/deps/acorn/acorn-walk/dist/walk.js index 40b7aa1b078a18..fe4d19759b7da3 100644 --- a/deps/acorn/acorn-walk/dist/walk.js +++ b/deps/acorn/acorn-walk/dist/walk.js @@ -26,7 +26,7 @@ if (!baseVisitor) { baseVisitor = base ; }(function c(node, st, override) { var type = override || node.type; - baseVisitor[type](node, st, c); + visitNode(baseVisitor, type, node, st, c); if (visitors[type]) { visitors[type](node, st); } })(node, state, override); } @@ -41,7 +41,7 @@ var type = override || node.type; var isNew = node !== ancestors[ancestors.length - 1]; if (isNew) { ancestors.push(node); } - baseVisitor[type](node, st, c); + visitNode(baseVisitor, type, node, st, c); if (visitors[type]) { visitors[type](node, st || ancestors, ancestors); } if (isNew) { ancestors.pop(); } })(node, state, override); @@ -76,7 +76,7 @@ var last ;(function c(node, st, override) { var type = override || node.type; - baseVisitor[type](node, st, c); + visitNode(baseVisitor, type, node, st, c); if (last !== node) { callback(node, st, type); last = node; @@ -93,7 +93,7 @@ var type = override || node.type; var isNew = node !== ancestors[ancestors.length - 1]; if (isNew) { ancestors.push(node); } - baseVisitor[type](node, st, c); + visitNode(baseVisitor, type, node, st, c); if (last !== node) { callback(node, st || ancestors, ancestors, type); last = node; @@ -113,7 +113,7 @@ var type = override || node.type; if ((start == null || node.start <= start) && (end == null || node.end >= end)) - { baseVisitor[type](node, st, c); } + { visitNode(baseVisitor, type, node, st, c); } if ((start == null || node.start === start) && (end == null || node.end === end) && test(type, node)) @@ -134,7 +134,7 @@ (function c(node, st, override) { var type = override || node.type; if (node.start > pos || node.end < pos) { return } - baseVisitor[type](node, st, c); + visitNode(baseVisitor, type, node, st, c); if (test(type, node)) { throw new Found(node, st) } })(node, state); } catch (e) { @@ -152,7 +152,7 @@ if (node.end < pos) { return } var type = override || node.type; if (node.start >= pos && test(type, node)) { throw new Found(node, st) } - baseVisitor[type](node, st, c); + visitNode(baseVisitor, type, node, st, c); })(node, state); } catch (e) { if (e instanceof Found) { return e } @@ -170,7 +170,7 @@ var type = override || node.type; if (node.end <= pos && (!max || max.node.end < node.end) && test(type, node)) { max = new Found(node, st); } - baseVisitor[type](node, st, c); + visitNode(baseVisitor, type, node, st, c); })(node, state); return max } @@ -186,6 +186,11 @@ function skipThrough(node, st, c) { c(node, st); } function ignore(_node, _st, _c) {} + function visitNode(baseVisitor, type, node, st, c) { + if (baseVisitor[type] == null) { throw new Error(("No walker function defined for node type " + type)) } + baseVisitor[type](node, st, c); + } + // Node walkers. var base = {}; @@ -397,11 +402,28 @@ if (node.declaration) { c(node.declaration, st, node.type === "ExportNamedDeclaration" || node.declaration.id ? "Statement" : "Expression"); } if (node.source) { c(node.source, st, "Expression"); } + if (node.attributes) + { for (var i = 0, list = node.attributes; i < list.length; i += 1) + { + var attr = list[i]; + + c(attr, st); + } } }; base.ExportAllDeclaration = function (node, st, c) { if (node.exported) { c(node.exported, st); } c(node.source, st, "Expression"); + if (node.attributes) + { for (var i = 0, list = node.attributes; i < list.length; i += 1) + { + var attr = list[i]; + + c(attr, st); + } } + }; + base.ImportAttribute = function (node, st, c) { + c(node.value, st, "Expression"); }; base.ImportDeclaration = function (node, st, c) { for (var i = 0, list = node.specifiers; i < list.length; i += 1) @@ -411,9 +433,17 @@ c(spec, st); } c(node.source, st, "Expression"); + if (node.attributes) + { for (var i$1 = 0, list$1 = node.attributes; i$1 < list$1.length; i$1 += 1) + { + var attr = list$1[i$1]; + + c(attr, st); + } } }; base.ImportExpression = function (node, st, c) { c(node.source, st, "Expression"); + if (node.options) { c(node.options, st, "Expression"); } }; base.ImportSpecifier = base.ImportDefaultSpecifier = base.ImportNamespaceSpecifier = base.Identifier = base.PrivateIdentifier = base.Literal = ignore; diff --git a/deps/acorn/acorn-walk/dist/walk.mjs b/deps/acorn/acorn-walk/dist/walk.mjs index c475ababc7ac30..88f18bb616e1d9 100644 --- a/deps/acorn/acorn-walk/dist/walk.mjs +++ b/deps/acorn/acorn-walk/dist/walk.mjs @@ -20,7 +20,7 @@ function simple(node, visitors, baseVisitor, state, override) { if (!baseVisitor) { baseVisitor = base ; }(function c(node, st, override) { var type = override || node.type; - baseVisitor[type](node, st, c); + visitNode(baseVisitor, type, node, st, c); if (visitors[type]) { visitors[type](node, st); } })(node, state, override); } @@ -35,7 +35,7 @@ function ancestor(node, visitors, baseVisitor, state, override) { var type = override || node.type; var isNew = node !== ancestors[ancestors.length - 1]; if (isNew) { ancestors.push(node); } - baseVisitor[type](node, st, c); + visitNode(baseVisitor, type, node, st, c); if (visitors[type]) { visitors[type](node, st || ancestors, ancestors); } if (isNew) { ancestors.pop(); } })(node, state, override); @@ -70,7 +70,7 @@ function full(node, callback, baseVisitor, state, override) { var last ;(function c(node, st, override) { var type = override || node.type; - baseVisitor[type](node, st, c); + visitNode(baseVisitor, type, node, st, c); if (last !== node) { callback(node, st, type); last = node; @@ -87,7 +87,7 @@ function fullAncestor(node, callback, baseVisitor, state) { var type = override || node.type; var isNew = node !== ancestors[ancestors.length - 1]; if (isNew) { ancestors.push(node); } - baseVisitor[type](node, st, c); + visitNode(baseVisitor, type, node, st, c); if (last !== node) { callback(node, st || ancestors, ancestors, type); last = node; @@ -107,7 +107,7 @@ function findNodeAt(node, start, end, test, baseVisitor, state) { var type = override || node.type; if ((start == null || node.start <= start) && (end == null || node.end >= end)) - { baseVisitor[type](node, st, c); } + { visitNode(baseVisitor, type, node, st, c); } if ((start == null || node.start === start) && (end == null || node.end === end) && test(type, node)) @@ -128,7 +128,7 @@ function findNodeAround(node, pos, test, baseVisitor, state) { (function c(node, st, override) { var type = override || node.type; if (node.start > pos || node.end < pos) { return } - baseVisitor[type](node, st, c); + visitNode(baseVisitor, type, node, st, c); if (test(type, node)) { throw new Found(node, st) } })(node, state); } catch (e) { @@ -146,7 +146,7 @@ function findNodeAfter(node, pos, test, baseVisitor, state) { if (node.end < pos) { return } var type = override || node.type; if (node.start >= pos && test(type, node)) { throw new Found(node, st) } - baseVisitor[type](node, st, c); + visitNode(baseVisitor, type, node, st, c); })(node, state); } catch (e) { if (e instanceof Found) { return e } @@ -164,7 +164,7 @@ function findNodeBefore(node, pos, test, baseVisitor, state) { var type = override || node.type; if (node.end <= pos && (!max || max.node.end < node.end) && test(type, node)) { max = new Found(node, st); } - baseVisitor[type](node, st, c); + visitNode(baseVisitor, type, node, st, c); })(node, state); return max } @@ -180,6 +180,11 @@ function make(funcs, baseVisitor) { function skipThrough(node, st, c) { c(node, st); } function ignore(_node, _st, _c) {} +function visitNode(baseVisitor, type, node, st, c) { + if (baseVisitor[type] == null) { throw new Error(("No walker function defined for node type " + type)) } + baseVisitor[type](node, st, c); +} + // Node walkers. var base = {}; @@ -391,11 +396,28 @@ base.ExportNamedDeclaration = base.ExportDefaultDeclaration = function (node, st if (node.declaration) { c(node.declaration, st, node.type === "ExportNamedDeclaration" || node.declaration.id ? "Statement" : "Expression"); } if (node.source) { c(node.source, st, "Expression"); } + if (node.attributes) + { for (var i = 0, list = node.attributes; i < list.length; i += 1) + { + var attr = list[i]; + + c(attr, st); + } } }; base.ExportAllDeclaration = function (node, st, c) { if (node.exported) { c(node.exported, st); } c(node.source, st, "Expression"); + if (node.attributes) + { for (var i = 0, list = node.attributes; i < list.length; i += 1) + { + var attr = list[i]; + + c(attr, st); + } } +}; +base.ImportAttribute = function (node, st, c) { + c(node.value, st, "Expression"); }; base.ImportDeclaration = function (node, st, c) { for (var i = 0, list = node.specifiers; i < list.length; i += 1) @@ -405,9 +427,17 @@ base.ImportDeclaration = function (node, st, c) { c(spec, st); } c(node.source, st, "Expression"); + if (node.attributes) + { for (var i$1 = 0, list$1 = node.attributes; i$1 < list$1.length; i$1 += 1) + { + var attr = list$1[i$1]; + + c(attr, st); + } } }; base.ImportExpression = function (node, st, c) { c(node.source, st, "Expression"); + if (node.options) { c(node.options, st, "Expression"); } }; base.ImportSpecifier = base.ImportDefaultSpecifier = base.ImportNamespaceSpecifier = base.Identifier = base.PrivateIdentifier = base.Literal = ignore; diff --git a/deps/acorn/acorn-walk/package.json b/deps/acorn/acorn-walk/package.json index 133059576956d8..362add83801045 100644 --- a/deps/acorn/acorn-walk/package.json +++ b/deps/acorn/acorn-walk/package.json @@ -16,7 +16,7 @@ ], "./package.json": "./package.json" }, - "version": "8.3.4", + "version": "8.3.5", "engines": { "node": ">=0.4.0" }, diff --git a/deps/acorn/acorn/CHANGELOG.md b/deps/acorn/acorn/CHANGELOG.md index c86068cd71ab47..d18759aeaa3d5e 100644 --- a/deps/acorn/acorn/CHANGELOG.md +++ b/deps/acorn/acorn/CHANGELOG.md @@ -1,3 +1,21 @@ +## 8.16.0 (2026-02-19) + +### New features + +The `sourceType` option can now be set to `"commonjs"` to have the parser treat the top level scope as a function scope. + +Add support for Unicode 17. + +### Bug fixes + +Don't recognize `await using` as contextual keywords when followed directly by a backslash. + +Fix an issue where the parser would allow `return` statements in `static` blocks when `allowReturnOutsideFunction` was enabled. + +Properly reject `using` declarations that appear directly in `switch` or `for` head scopes. + +Fix some corner case issues in the recognition of `using` syntax. + ## 8.15.0 (2025-06-08) ### New features diff --git a/deps/acorn/acorn/README.md b/deps/acorn/acorn/README.md index f7ff9662419308..962de027264563 100644 --- a/deps/acorn/acorn/README.md +++ b/deps/acorn/acorn/README.md @@ -26,6 +26,24 @@ git clone https://github.com/acornjs/acorn.git cd acorn npm install ``` +## Importing acorn + +ESM as well as CommonJS is supported for all 3: `acorn`, `acorn-walk` and `acorn-loose`. + +ESM example for `acorn`: + +```js +import * as acorn from "acorn" +``` + +CommonJS example for `acorn`: + +```js +let acorn = require("acorn") +``` + +ESM is preferred, as it allows better editor auto-completions by offering TypeScript support. +For this reason, following examples will use ESM imports. ## Interface @@ -36,8 +54,8 @@ syntax tree object as specified by the [ESTree spec](https://github.com/estree/estree). ```javascript -let acorn = require("acorn"); -console.log(acorn.parse("1 + 1", {ecmaVersion: 2020})); +import * as acorn from "acorn" +console.log(acorn.parse("1 + 1", {ecmaVersion: 2020})) ``` When encountering a syntax error, the parser will raise a @@ -61,11 +79,12 @@ required): implemented through plugins. - **sourceType**: Indicate the mode the code should be parsed in. Can be - either `"script"` or `"module"`. This influences global strict mode + either `"script"`, `"module"` or `"commonjs"`. This influences global strict mode and parsing of `import` and `export` declarations. **NOTE**: If set to `"module"`, then static `import` / `export` syntax - will be valid, even if `ecmaVersion` is less than 6. + will be valid, even if `ecmaVersion` is less than 6. If set to `"commonjs"`, + it is the same as `"script"` except that the top-level scope behaves like a function. - **onInsertedSemicolon**: If given a callback, that callback will be called whenever a missing semicolon is inserted by the parser. The @@ -97,7 +116,7 @@ required): for `ecmaVersion` 2022 and later, `false` for lower versions. Setting this option to `true` allows to have top-level `await` expressions. They are still not allowed in non-`async` functions, - though. + though. Setting this option to `true` is not allowed when `sourceType: "commonjs"`. - **allowSuperOutsideMethod**: By default, `super` outside a method raises an error. Set this to `true` to accept such code. @@ -217,7 +236,7 @@ for (let token of acorn.tokenizer(str)) { } // transform code to array of tokens: -var tokens = [...acorn.tokenizer(str)]; +var tokens = [...acorn.tokenizer(str)] ``` **tokTypes** holds an object mapping names to the token type objects @@ -238,10 +257,10 @@ on the extended version of the class. To extend a parser with plugins, you can use its static `extend` method. ```javascript -var acorn = require("acorn"); -var jsx = require("acorn-jsx"); -var JSXParser = acorn.Parser.extend(jsx()); -JSXParser.parse("foo(<bar/>)", {ecmaVersion: 2020}); +var acorn = require("acorn") +var jsx = require("acorn-jsx") +var JSXParser = acorn.Parser.extend(jsx()) +JSXParser.parse("foo(<bar/>)", {ecmaVersion: 2020}) ``` The `extend` method takes any number of plugin values, and returns a diff --git a/deps/acorn/acorn/dist/acorn.d.mts b/deps/acorn/acorn/dist/acorn.d.mts index f2ec5243bcb262..afbd9139eb5f2f 100644 --- a/deps/acorn/acorn/dist/acorn.d.mts +++ b/deps/acorn/acorn/dist/acorn.d.mts @@ -614,10 +614,10 @@ export interface Options { /** * `sourceType` indicates the mode the code should be parsed in. - * Can be either `"script"` or `"module"`. This influences global + * Can be either `"script"`, `"module"` or `"commonjs"`. This influences global * strict mode and parsing of `import` and `export` declarations. */ - sourceType?: "script" | "module" + sourceType?: "script" | "module" | "commonjs" /** * a callback that will be called when a semicolon is automatically inserted. diff --git a/deps/acorn/acorn/dist/acorn.d.ts b/deps/acorn/acorn/dist/acorn.d.ts index f2ec5243bcb262..afbd9139eb5f2f 100644 --- a/deps/acorn/acorn/dist/acorn.d.ts +++ b/deps/acorn/acorn/dist/acorn.d.ts @@ -614,10 +614,10 @@ export interface Options { /** * `sourceType` indicates the mode the code should be parsed in. - * Can be either `"script"` or `"module"`. This influences global + * Can be either `"script"`, `"module"` or `"commonjs"`. This influences global * strict mode and parsing of `import` and `export` declarations. */ - sourceType?: "script" | "module" + sourceType?: "script" | "module" | "commonjs" /** * a callback that will be called when a semicolon is automatically inserted. diff --git a/deps/acorn/acorn/dist/acorn.js b/deps/acorn/acorn/dist/acorn.js index cb5628bf83cf0b..b4f281a46f85fe 100644 --- a/deps/acorn/acorn/dist/acorn.js +++ b/deps/acorn/acorn/dist/acorn.js @@ -5,16 +5,16 @@ })(this, (function (exports) { 'use strict'; // This file was generated. Do not modify manually! - var astralIdentifierCodes = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 574, 3, 9, 9, 7, 9, 32, 4, 318, 1, 80, 3, 71, 10, 50, 3, 123, 2, 54, 14, 32, 10, 3, 1, 11, 3, 46, 10, 8, 0, 46, 9, 7, 2, 37, 13, 2, 9, 6, 1, 45, 0, 13, 2, 49, 13, 9, 3, 2, 11, 83, 11, 7, 0, 3, 0, 158, 11, 6, 9, 7, 3, 56, 1, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 68, 8, 2, 0, 3, 0, 2, 3, 2, 4, 2, 0, 15, 1, 83, 17, 10, 9, 5, 0, 82, 19, 13, 9, 214, 6, 3, 8, 28, 1, 83, 16, 16, 9, 82, 12, 9, 9, 7, 19, 58, 14, 5, 9, 243, 14, 166, 9, 71, 5, 2, 1, 3, 3, 2, 0, 2, 1, 13, 9, 120, 6, 3, 6, 4, 0, 29, 9, 41, 6, 2, 3, 9, 0, 10, 10, 47, 15, 343, 9, 54, 7, 2, 7, 17, 9, 57, 21, 2, 13, 123, 5, 4, 0, 2, 1, 2, 6, 2, 0, 9, 9, 49, 4, 2, 1, 2, 4, 9, 9, 330, 3, 10, 1, 2, 0, 49, 6, 4, 4, 14, 10, 5350, 0, 7, 14, 11465, 27, 2343, 9, 87, 9, 39, 4, 60, 6, 26, 9, 535, 9, 470, 0, 2, 54, 8, 3, 82, 0, 12, 1, 19628, 1, 4178, 9, 519, 45, 3, 22, 543, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 513, 54, 5, 49, 9, 0, 15, 0, 23, 4, 2, 14, 1361, 6, 2, 16, 3, 6, 2, 1, 2, 4, 101, 0, 161, 6, 10, 9, 357, 0, 62, 13, 499, 13, 245, 1, 2, 9, 726, 6, 110, 6, 6, 9, 4759, 9, 787719, 239]; + var astralIdentifierCodes = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 574, 3, 9, 9, 7, 9, 32, 4, 318, 1, 78, 5, 71, 10, 50, 3, 123, 2, 54, 14, 32, 10, 3, 1, 11, 3, 46, 10, 8, 0, 46, 9, 7, 2, 37, 13, 2, 9, 6, 1, 45, 0, 13, 2, 49, 13, 9, 3, 2, 11, 83, 11, 7, 0, 3, 0, 158, 11, 6, 9, 7, 3, 56, 1, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 68, 8, 2, 0, 3, 0, 2, 3, 2, 4, 2, 0, 15, 1, 83, 17, 10, 9, 5, 0, 82, 19, 13, 9, 214, 6, 3, 8, 28, 1, 83, 16, 16, 9, 82, 12, 9, 9, 7, 19, 58, 14, 5, 9, 243, 14, 166, 9, 71, 5, 2, 1, 3, 3, 2, 0, 2, 1, 13, 9, 120, 6, 3, 6, 4, 0, 29, 9, 41, 6, 2, 3, 9, 0, 10, 10, 47, 15, 199, 7, 137, 9, 54, 7, 2, 7, 17, 9, 57, 21, 2, 13, 123, 5, 4, 0, 2, 1, 2, 6, 2, 0, 9, 9, 49, 4, 2, 1, 2, 4, 9, 9, 55, 9, 266, 3, 10, 1, 2, 0, 49, 6, 4, 4, 14, 10, 5350, 0, 7, 14, 11465, 27, 2343, 9, 87, 9, 39, 4, 60, 6, 26, 9, 535, 9, 470, 0, 2, 54, 8, 3, 82, 0, 12, 1, 19628, 1, 4178, 9, 519, 45, 3, 22, 543, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 513, 54, 5, 49, 9, 0, 15, 0, 23, 4, 2, 14, 1361, 6, 2, 16, 3, 6, 2, 1, 2, 4, 101, 0, 161, 6, 10, 9, 357, 0, 62, 13, 499, 13, 245, 1, 2, 9, 233, 0, 3, 0, 8, 1, 6, 0, 475, 6, 110, 6, 6, 9, 4759, 9, 787719, 239]; // This file was generated. Do not modify manually! - var astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 13, 10, 2, 14, 2, 6, 2, 1, 2, 10, 2, 14, 2, 6, 2, 1, 4, 51, 13, 310, 10, 21, 11, 7, 25, 5, 2, 41, 2, 8, 70, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 71, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 39, 27, 10, 22, 251, 41, 7, 1, 17, 2, 60, 28, 11, 0, 9, 21, 43, 17, 47, 20, 28, 22, 13, 52, 58, 1, 3, 0, 14, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 20, 1, 64, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 31, 9, 2, 0, 3, 0, 2, 37, 2, 0, 26, 0, 2, 0, 45, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 38, 6, 186, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 19, 72, 200, 32, 32, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 328, 18, 16, 0, 2, 12, 2, 33, 125, 0, 80, 921, 103, 110, 18, 195, 2637, 96, 16, 1071, 18, 5, 26, 3994, 6, 582, 6842, 29, 1763, 568, 8, 30, 18, 78, 18, 29, 19, 47, 17, 3, 32, 20, 6, 18, 433, 44, 212, 63, 129, 74, 6, 0, 67, 12, 65, 1, 2, 0, 29, 6135, 9, 1237, 42, 9, 8936, 3, 2, 6, 2, 1, 2, 290, 16, 0, 30, 2, 3, 0, 15, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 1845, 30, 7, 5, 262, 61, 147, 44, 11, 6, 17, 0, 322, 29, 19, 43, 485, 27, 229, 29, 3, 0, 496, 6, 2, 3, 2, 1, 2, 14, 2, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42719, 33, 4153, 7, 221, 3, 5761, 15, 7472, 16, 621, 2467, 541, 1507, 4938, 6, 4191]; + var astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 13, 10, 2, 14, 2, 6, 2, 1, 2, 10, 2, 14, 2, 6, 2, 1, 4, 51, 13, 310, 10, 21, 11, 7, 25, 5, 2, 41, 2, 8, 70, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 7, 25, 39, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 39, 27, 10, 22, 251, 41, 7, 1, 17, 5, 57, 28, 11, 0, 9, 21, 43, 17, 47, 20, 28, 22, 13, 52, 58, 1, 3, 0, 14, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 20, 1, 64, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 31, 9, 2, 0, 3, 0, 2, 37, 2, 0, 26, 0, 2, 0, 45, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 38, 6, 186, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 19, 72, 200, 32, 32, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 24, 43, 261, 18, 16, 0, 2, 12, 2, 33, 125, 0, 80, 921, 103, 110, 18, 195, 2637, 96, 16, 1071, 18, 5, 26, 3994, 6, 582, 6842, 29, 1763, 568, 8, 30, 18, 78, 18, 29, 19, 47, 17, 3, 32, 20, 6, 18, 433, 44, 212, 63, 33, 24, 3, 24, 45, 74, 6, 0, 67, 12, 65, 1, 2, 0, 15, 4, 10, 7381, 42, 31, 98, 114, 8702, 3, 2, 6, 2, 1, 2, 290, 16, 0, 30, 2, 3, 0, 15, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 1845, 30, 7, 5, 262, 61, 147, 44, 11, 6, 17, 0, 322, 29, 19, 43, 485, 27, 229, 29, 3, 0, 208, 30, 2, 2, 2, 1, 2, 6, 3, 4, 10, 1, 225, 6, 2, 3, 2, 1, 2, 14, 2, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42719, 33, 4381, 3, 5773, 3, 7472, 16, 621, 2467, 541, 1507, 4938, 6, 8489]; // This file was generated. Do not modify manually! - var nonASCIIidentifierChars = "\u200c\u200d\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u07fd\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u0897-\u089f\u08ca-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u09fe\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0afa-\u0aff\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b55-\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c04\u0c3c\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0cf3\u0d00-\u0d03\u0d3b\u0d3c\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d81-\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0ebc\u0ec8-\u0ece\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1715\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u180f-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1abf-\u1ace\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf4\u1cf7-\u1cf9\u1dc0-\u1dff\u200c\u200d\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\u30fb\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua82c\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua8ff-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f\uff65"; + var nonASCIIidentifierChars = "\u200c\u200d\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u07fd\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u0897-\u089f\u08ca-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u09fe\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0afa-\u0aff\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b55-\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c04\u0c3c\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0cf3\u0d00-\u0d03\u0d3b\u0d3c\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d81-\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0ebc\u0ec8-\u0ece\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1715\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u180f-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1abf-\u1add\u1ae0-\u1aeb\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf4\u1cf7-\u1cf9\u1dc0-\u1dff\u200c\u200d\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\u30fb\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua82c\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua8ff-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f\uff65"; // This file was generated. Do not modify manually! - var nonASCIIidentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u05d0-\u05ea\u05ef-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u0860-\u086a\u0870-\u0887\u0889-\u088e\u08a0-\u08c9\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u09fc\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c5d\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cdd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d04-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e86-\u0e8a\u0e8c-\u0ea3\u0ea5\u0ea7-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u1711\u171f-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1878\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4c\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c8a\u1c90-\u1cba\u1cbd-\u1cbf\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1cfa\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31bf\u31f0-\u31ff\u3400-\u4dbf\u4e00-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7cd\ua7d0\ua7d1\ua7d3\ua7d5-\ua7dc\ua7f2-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua8fe\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab69\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"; + var nonASCIIidentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u05d0-\u05ea\u05ef-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u0860-\u086a\u0870-\u0887\u0889-\u088f\u08a0-\u08c9\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u09fc\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c5c\u0c5d\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cdc-\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d04-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e86-\u0e8a\u0e8c-\u0ea3\u0ea5\u0ea7-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u1711\u171f-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1878\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4c\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c8a\u1c90-\u1cba\u1cbd-\u1cbf\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1cfa\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31bf\u31f0-\u31ff\u3400-\u4dbf\u4e00-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7dc\ua7f1-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua8fe\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab69\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"; // These are a run-length and offset encoded representation of the // >0xffff code points that are a valid part of identifiers. The @@ -339,7 +339,7 @@ // for new syntax features. ecmaVersion: null, // `sourceType` indicates the mode the code should be parsed in. - // Can be either `"script"` or `"module"`. This influences global + // Can be either `"script"`, `"module"` or `"commonjs"`. This influences global // strict mode and parsing of `import` and `export` declarations. sourceType: "script", // `onInsertedSemicolon` can be a callback that will be called when @@ -463,6 +463,9 @@ if (isArray(options.onComment)) { options.onComment = pushComment(options, options.onComment); } + if (options.sourceType === "commonjs" && options.allowAwaitOutsideFunction) + { throw new Error("Cannot use allowAwaitOutsideFunction with sourceType: commonjs") } + return options } @@ -494,6 +497,7 @@ SCOPE_DIRECT_SUPER = 128, SCOPE_CLASS_STATIC_BLOCK = 256, SCOPE_CLASS_FIELD_INIT = 512, + SCOPE_SWITCH = 1024, SCOPE_VAR = SCOPE_TOP | SCOPE_FUNCTION | SCOPE_CLASS_STATIC_BLOCK; function functionFlags(async, generator) { @@ -583,7 +587,12 @@ // Scope tracking for duplicate variable names (see scope.js) this.scopeStack = []; - this.enterScope(SCOPE_TOP); + this.enterScope( + this.options.sourceType === "commonjs" + // In commonjs, the top-level scope behaves like a function scope + ? SCOPE_FUNCTION + : SCOPE_TOP + ); // For RegExp validation this.regexpState = null; @@ -594,7 +603,7 @@ this.privateNameStack = []; }; - var prototypeAccessors = { inFunction: { configurable: true },inGenerator: { configurable: true },inAsync: { configurable: true },canAwait: { configurable: true },allowSuper: { configurable: true },allowDirectSuper: { configurable: true },treatFunctionsAsVar: { configurable: true },allowNewDotTarget: { configurable: true },inClassStaticBlock: { configurable: true } }; + var prototypeAccessors = { inFunction: { configurable: true },inGenerator: { configurable: true },inAsync: { configurable: true },canAwait: { configurable: true },allowReturn: { configurable: true },allowSuper: { configurable: true },allowDirectSuper: { configurable: true },treatFunctionsAsVar: { configurable: true },allowNewDotTarget: { configurable: true },allowUsing: { configurable: true },inClassStaticBlock: { configurable: true } }; Parser.prototype.parse = function parse () { var node = this.options.program || this.startNode(); @@ -618,6 +627,12 @@ return (this.inModule && this.options.ecmaVersion >= 13) || this.options.allowAwaitOutsideFunction }; + prototypeAccessors.allowReturn.get = function () { + if (this.inFunction) { return true } + if (this.options.allowReturnOutsideFunction && this.currentVarScope().flags & SCOPE_TOP) { return true } + return false + }; + prototypeAccessors.allowSuper.get = function () { var ref = this.currentThisScope(); var flags = ref.flags; @@ -638,6 +653,14 @@ return false }; + prototypeAccessors.allowUsing.get = function () { + var ref = this.currentScope(); + var flags = ref.flags; + if (flags & SCOPE_SWITCH) { return false } + if (!this.inModule && flags & SCOPE_TOP) { return false } + return true + }; + prototypeAccessors.inClassStaticBlock.get = function () { return (this.currentVarScope().flags & SCOPE_CLASS_STATIC_BLOCK) > 0 }; @@ -842,7 +865,7 @@ } } this.adaptDirectivePrologue(node.body); this.next(); - node.sourceType = this.options.sourceType; + node.sourceType = this.options.sourceType === "commonjs" ? "script" : this.options.sourceType; return this.finishNode(node, "Program") }; @@ -852,7 +875,7 @@ if (this.options.ecmaVersion < 6 || !this.isContextual("let")) { return false } skipWhiteSpace.lastIndex = this.pos; var skip = skipWhiteSpace.exec(this.input); - var next = this.pos + skip[0].length, nextCh = this.input.charCodeAt(next); + var next = this.pos + skip[0].length, nextCh = this.fullCharCodeAt(next); // For ambiguous cases, determine if a LexicalDeclaration (or only a // Statement) is allowed here. If context is not empty then only a Statement // is allowed. However, `let [` is an explicit negative lookahead for @@ -860,12 +883,13 @@ if (nextCh === 91 || nextCh === 92) { return true } // '[', '\' if (context) { return false } - if (nextCh === 123 || nextCh > 0xd7ff && nextCh < 0xdc00) { return true } // '{', astral - if (isIdentifierStart(nextCh, true)) { - var pos = next + 1; - while (isIdentifierChar(nextCh = this.input.charCodeAt(pos), true)) { ++pos; } - if (nextCh === 92 || nextCh > 0xd7ff && nextCh < 0xdc00) { return true } - var ident = this.input.slice(next, pos); + if (nextCh === 123) { return true } // '{' + if (isIdentifierStart(nextCh)) { + var start = next; + do { next += nextCh <= 0xffff ? 1 : 2; } + while (isIdentifierChar(nextCh = this.fullCharCodeAt(next))) + if (nextCh === 92) { return true } + var ident = this.input.slice(start, next); if (!keywordRelationalOperator.test(ident)) { return true } } return false @@ -884,7 +908,7 @@ return !lineBreak.test(this.input.slice(this.pos, next)) && this.input.slice(next, next + 8) === "function" && (next + 8 === this.input.length || - !(isIdentifierChar(after = this.input.charCodeAt(next + 8)) || after > 0xd7ff && after < 0xdc00)) + !(isIdentifierChar(after = this.fullCharCodeAt(next + 8)) || after === 92 /* '\' */)) }; pp$8.isUsingKeyword = function(isAwaitUsing, isFor) { @@ -898,28 +922,28 @@ if (lineBreak.test(this.input.slice(this.pos, next))) { return false } if (isAwaitUsing) { - var awaitEndPos = next + 5 /* await */, after; - if (this.input.slice(next, awaitEndPos) !== "using" || - awaitEndPos === this.input.length || - isIdentifierChar(after = this.input.charCodeAt(awaitEndPos)) || - (after > 0xd7ff && after < 0xdc00) + var usingEndPos = next + 5 /* using */, after; + if (this.input.slice(next, usingEndPos) !== "using" || + usingEndPos === this.input.length || + isIdentifierChar(after = this.fullCharCodeAt(usingEndPos)) || + after === 92 /* '\' */ ) { return false } - skipWhiteSpace.lastIndex = awaitEndPos; + skipWhiteSpace.lastIndex = usingEndPos; var skipAfterUsing = skipWhiteSpace.exec(this.input); - if (skipAfterUsing && lineBreak.test(this.input.slice(awaitEndPos, awaitEndPos + skipAfterUsing[0].length))) { return false } - } - - if (isFor) { - var ofEndPos = next + 2 /* of */, after$1; - if (this.input.slice(next, ofEndPos) === "of") { - if (ofEndPos === this.input.length || - (!isIdentifierChar(after$1 = this.input.charCodeAt(ofEndPos)) && !(after$1 > 0xd7ff && after$1 < 0xdc00))) { return false } - } - } - - var ch = this.input.charCodeAt(next); - return isIdentifierStart(ch, true) || ch === 92 // '\' + next = usingEndPos + skipAfterUsing[0].length; + if (skipAfterUsing && lineBreak.test(this.input.slice(usingEndPos, next))) { return false } + } + + var ch = this.fullCharCodeAt(next); + if (!isIdentifierStart(ch) && ch !== 92 /* '\' */) { return false } + var idStart = next; + do { next += ch <= 0xffff ? 1 : 2; } + while (isIdentifierChar(ch = this.fullCharCodeAt(next))) + if (ch === 92) { return true } + var id = this.input.slice(idStart, next); + if (keywordRelationalOperator.test(id) || isFor && id === "of") { return false } + return true }; pp$8.isAwaitUsing = function(isFor) { @@ -1008,8 +1032,8 @@ var usingKind = this.isAwaitUsing(false) ? "await using" : this.isUsing(false) ? "using" : null; if (usingKind) { - if (topLevel && this.options.sourceType === "script") { - this.raise(this.start, "Using declaration cannot appear in the top level when source type is `script`"); + if (!this.allowUsing) { + this.raise(this.start, "Using declaration cannot appear in the top level when source type is `script` or in the bare case statement"); } if (usingKind === "await using") { if (!this.canAwait) { @@ -1106,7 +1130,12 @@ if (usingKind) { var init$2 = this.startNode(); this.next(); - if (usingKind === "await using") { this.next(); } + if (usingKind === "await using") { + if (!this.canAwait) { + this.raise(this.start, "Await using cannot appear outside of async function"); + } + this.next(); + } this.parseVar(init$2, true, usingKind); this.finishNode(init$2, "VariableDeclaration"); return this.parseForAfterInit(node, init$2, awaitAt) @@ -1165,7 +1194,7 @@ }; pp$8.parseReturnStatement = function(node) { - if (!this.inFunction && !this.options.allowReturnOutsideFunction) + if (!this.allowReturn) { this.raise(this.start, "'return' outside of function"); } this.next(); @@ -1184,7 +1213,7 @@ node.cases = []; this.expect(types$1.braceL); this.labels.push(switchLabel); - this.enterScope(0); + this.enterScope(SCOPE_SWITCH); // Statements under must be grouped (by label) in SwitchCase // nodes. `cur` is used to keep the node that we are currently @@ -3892,7 +3921,7 @@ }; // This file was generated by "bin/generate-unicode-script-values.js". Do not modify manually! - var scriptValuesAddedInUnicode = "Gara Garay Gukh Gurung_Khema Hrkt Katakana_Or_Hiragana Kawi Kirat_Rai Krai Nag_Mundari Nagm Ol_Onal Onao Sunu Sunuwar Todhri Todr Tulu_Tigalari Tutg Unknown Zzzz"; + var scriptValuesAddedInUnicode = "Berf Beria_Erfe Gara Garay Gukh Gurung_Khema Hrkt Katakana_Or_Hiragana Kawi Kirat_Rai Krai Nag_Mundari Nagm Ol_Onal Onao Sidetic Sidt Sunu Sunuwar Tai_Yo Tayo Todhri Todr Tolong_Siki Tols Tulu_Tigalari Tutg Unknown Zzzz"; // This file contains Unicode properties extracted from the ECMAScript specification. // The lists are extracted like so: @@ -5453,13 +5482,17 @@ return this.getTokenFromCode(code) }; - pp.fullCharCodeAtPos = function() { - var code = this.input.charCodeAt(this.pos); + pp.fullCharCodeAt = function(pos) { + var code = this.input.charCodeAt(pos); if (code <= 0xd7ff || code >= 0xdc00) { return code } - var next = this.input.charCodeAt(this.pos + 1); + var next = this.input.charCodeAt(pos + 1); return next <= 0xdbff || next >= 0xe000 ? code : (code << 10) + next - 0x35fdc00 }; + pp.fullCharCodeAtPos = function() { + return this.fullCharCodeAt(this.pos) + }; + pp.skipBlockComment = function() { var startLoc = this.options.onComment && this.curPosition(); var start = this.pos, end = this.input.indexOf("*/", this.pos += 2); @@ -6187,7 +6220,7 @@ // [ghbt]: https://github.com/acornjs/acorn/issues - var version = "8.15.0"; + var version = "8.16.0"; Parser.acorn = { Parser: Parser, diff --git a/deps/acorn/acorn/dist/acorn.mjs b/deps/acorn/acorn/dist/acorn.mjs index 74d5fc431be2b5..9067e9bf97f84f 100644 --- a/deps/acorn/acorn/dist/acorn.mjs +++ b/deps/acorn/acorn/dist/acorn.mjs @@ -1,14 +1,14 @@ // This file was generated. Do not modify manually! -var astralIdentifierCodes = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 574, 3, 9, 9, 7, 9, 32, 4, 318, 1, 80, 3, 71, 10, 50, 3, 123, 2, 54, 14, 32, 10, 3, 1, 11, 3, 46, 10, 8, 0, 46, 9, 7, 2, 37, 13, 2, 9, 6, 1, 45, 0, 13, 2, 49, 13, 9, 3, 2, 11, 83, 11, 7, 0, 3, 0, 158, 11, 6, 9, 7, 3, 56, 1, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 68, 8, 2, 0, 3, 0, 2, 3, 2, 4, 2, 0, 15, 1, 83, 17, 10, 9, 5, 0, 82, 19, 13, 9, 214, 6, 3, 8, 28, 1, 83, 16, 16, 9, 82, 12, 9, 9, 7, 19, 58, 14, 5, 9, 243, 14, 166, 9, 71, 5, 2, 1, 3, 3, 2, 0, 2, 1, 13, 9, 120, 6, 3, 6, 4, 0, 29, 9, 41, 6, 2, 3, 9, 0, 10, 10, 47, 15, 343, 9, 54, 7, 2, 7, 17, 9, 57, 21, 2, 13, 123, 5, 4, 0, 2, 1, 2, 6, 2, 0, 9, 9, 49, 4, 2, 1, 2, 4, 9, 9, 330, 3, 10, 1, 2, 0, 49, 6, 4, 4, 14, 10, 5350, 0, 7, 14, 11465, 27, 2343, 9, 87, 9, 39, 4, 60, 6, 26, 9, 535, 9, 470, 0, 2, 54, 8, 3, 82, 0, 12, 1, 19628, 1, 4178, 9, 519, 45, 3, 22, 543, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 513, 54, 5, 49, 9, 0, 15, 0, 23, 4, 2, 14, 1361, 6, 2, 16, 3, 6, 2, 1, 2, 4, 101, 0, 161, 6, 10, 9, 357, 0, 62, 13, 499, 13, 245, 1, 2, 9, 726, 6, 110, 6, 6, 9, 4759, 9, 787719, 239]; +var astralIdentifierCodes = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 574, 3, 9, 9, 7, 9, 32, 4, 318, 1, 78, 5, 71, 10, 50, 3, 123, 2, 54, 14, 32, 10, 3, 1, 11, 3, 46, 10, 8, 0, 46, 9, 7, 2, 37, 13, 2, 9, 6, 1, 45, 0, 13, 2, 49, 13, 9, 3, 2, 11, 83, 11, 7, 0, 3, 0, 158, 11, 6, 9, 7, 3, 56, 1, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 68, 8, 2, 0, 3, 0, 2, 3, 2, 4, 2, 0, 15, 1, 83, 17, 10, 9, 5, 0, 82, 19, 13, 9, 214, 6, 3, 8, 28, 1, 83, 16, 16, 9, 82, 12, 9, 9, 7, 19, 58, 14, 5, 9, 243, 14, 166, 9, 71, 5, 2, 1, 3, 3, 2, 0, 2, 1, 13, 9, 120, 6, 3, 6, 4, 0, 29, 9, 41, 6, 2, 3, 9, 0, 10, 10, 47, 15, 199, 7, 137, 9, 54, 7, 2, 7, 17, 9, 57, 21, 2, 13, 123, 5, 4, 0, 2, 1, 2, 6, 2, 0, 9, 9, 49, 4, 2, 1, 2, 4, 9, 9, 55, 9, 266, 3, 10, 1, 2, 0, 49, 6, 4, 4, 14, 10, 5350, 0, 7, 14, 11465, 27, 2343, 9, 87, 9, 39, 4, 60, 6, 26, 9, 535, 9, 470, 0, 2, 54, 8, 3, 82, 0, 12, 1, 19628, 1, 4178, 9, 519, 45, 3, 22, 543, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 513, 54, 5, 49, 9, 0, 15, 0, 23, 4, 2, 14, 1361, 6, 2, 16, 3, 6, 2, 1, 2, 4, 101, 0, 161, 6, 10, 9, 357, 0, 62, 13, 499, 13, 245, 1, 2, 9, 233, 0, 3, 0, 8, 1, 6, 0, 475, 6, 110, 6, 6, 9, 4759, 9, 787719, 239]; // This file was generated. Do not modify manually! -var astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 13, 10, 2, 14, 2, 6, 2, 1, 2, 10, 2, 14, 2, 6, 2, 1, 4, 51, 13, 310, 10, 21, 11, 7, 25, 5, 2, 41, 2, 8, 70, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 71, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 39, 27, 10, 22, 251, 41, 7, 1, 17, 2, 60, 28, 11, 0, 9, 21, 43, 17, 47, 20, 28, 22, 13, 52, 58, 1, 3, 0, 14, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 20, 1, 64, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 31, 9, 2, 0, 3, 0, 2, 37, 2, 0, 26, 0, 2, 0, 45, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 38, 6, 186, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 19, 72, 200, 32, 32, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 328, 18, 16, 0, 2, 12, 2, 33, 125, 0, 80, 921, 103, 110, 18, 195, 2637, 96, 16, 1071, 18, 5, 26, 3994, 6, 582, 6842, 29, 1763, 568, 8, 30, 18, 78, 18, 29, 19, 47, 17, 3, 32, 20, 6, 18, 433, 44, 212, 63, 129, 74, 6, 0, 67, 12, 65, 1, 2, 0, 29, 6135, 9, 1237, 42, 9, 8936, 3, 2, 6, 2, 1, 2, 290, 16, 0, 30, 2, 3, 0, 15, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 1845, 30, 7, 5, 262, 61, 147, 44, 11, 6, 17, 0, 322, 29, 19, 43, 485, 27, 229, 29, 3, 0, 496, 6, 2, 3, 2, 1, 2, 14, 2, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42719, 33, 4153, 7, 221, 3, 5761, 15, 7472, 16, 621, 2467, 541, 1507, 4938, 6, 4191]; +var astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 13, 10, 2, 14, 2, 6, 2, 1, 2, 10, 2, 14, 2, 6, 2, 1, 4, 51, 13, 310, 10, 21, 11, 7, 25, 5, 2, 41, 2, 8, 70, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 7, 25, 39, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 39, 27, 10, 22, 251, 41, 7, 1, 17, 5, 57, 28, 11, 0, 9, 21, 43, 17, 47, 20, 28, 22, 13, 52, 58, 1, 3, 0, 14, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 20, 1, 64, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 31, 9, 2, 0, 3, 0, 2, 37, 2, 0, 26, 0, 2, 0, 45, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 38, 6, 186, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 19, 72, 200, 32, 32, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 24, 43, 261, 18, 16, 0, 2, 12, 2, 33, 125, 0, 80, 921, 103, 110, 18, 195, 2637, 96, 16, 1071, 18, 5, 26, 3994, 6, 582, 6842, 29, 1763, 568, 8, 30, 18, 78, 18, 29, 19, 47, 17, 3, 32, 20, 6, 18, 433, 44, 212, 63, 33, 24, 3, 24, 45, 74, 6, 0, 67, 12, 65, 1, 2, 0, 15, 4, 10, 7381, 42, 31, 98, 114, 8702, 3, 2, 6, 2, 1, 2, 290, 16, 0, 30, 2, 3, 0, 15, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 1845, 30, 7, 5, 262, 61, 147, 44, 11, 6, 17, 0, 322, 29, 19, 43, 485, 27, 229, 29, 3, 0, 208, 30, 2, 2, 2, 1, 2, 6, 3, 4, 10, 1, 225, 6, 2, 3, 2, 1, 2, 14, 2, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42719, 33, 4381, 3, 5773, 3, 7472, 16, 621, 2467, 541, 1507, 4938, 6, 8489]; // This file was generated. Do not modify manually! -var nonASCIIidentifierChars = "\u200c\u200d\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u07fd\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u0897-\u089f\u08ca-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u09fe\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0afa-\u0aff\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b55-\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c04\u0c3c\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0cf3\u0d00-\u0d03\u0d3b\u0d3c\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d81-\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0ebc\u0ec8-\u0ece\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1715\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u180f-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1abf-\u1ace\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf4\u1cf7-\u1cf9\u1dc0-\u1dff\u200c\u200d\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\u30fb\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua82c\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua8ff-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f\uff65"; +var nonASCIIidentifierChars = "\u200c\u200d\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u07fd\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u0897-\u089f\u08ca-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u09fe\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0afa-\u0aff\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b55-\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c04\u0c3c\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0cf3\u0d00-\u0d03\u0d3b\u0d3c\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d81-\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0ebc\u0ec8-\u0ece\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1715\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u180f-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1abf-\u1add\u1ae0-\u1aeb\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf4\u1cf7-\u1cf9\u1dc0-\u1dff\u200c\u200d\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\u30fb\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua82c\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua8ff-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f\uff65"; // This file was generated. Do not modify manually! -var nonASCIIidentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u05d0-\u05ea\u05ef-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u0860-\u086a\u0870-\u0887\u0889-\u088e\u08a0-\u08c9\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u09fc\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c5d\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cdd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d04-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e86-\u0e8a\u0e8c-\u0ea3\u0ea5\u0ea7-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u1711\u171f-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1878\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4c\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c8a\u1c90-\u1cba\u1cbd-\u1cbf\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1cfa\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31bf\u31f0-\u31ff\u3400-\u4dbf\u4e00-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7cd\ua7d0\ua7d1\ua7d3\ua7d5-\ua7dc\ua7f2-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua8fe\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab69\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"; +var nonASCIIidentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u05d0-\u05ea\u05ef-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u0860-\u086a\u0870-\u0887\u0889-\u088f\u08a0-\u08c9\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u09fc\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c5c\u0c5d\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cdc-\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d04-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e86-\u0e8a\u0e8c-\u0ea3\u0ea5\u0ea7-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u1711\u171f-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1878\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4c\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c8a\u1c90-\u1cba\u1cbd-\u1cbf\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1cfa\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31bf\u31f0-\u31ff\u3400-\u4dbf\u4e00-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7dc\ua7f1-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua8fe\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab69\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"; // These are a run-length and offset encoded representation of the // >0xffff code points that are a valid part of identifiers. The @@ -333,7 +333,7 @@ var defaultOptions = { // for new syntax features. ecmaVersion: null, // `sourceType` indicates the mode the code should be parsed in. - // Can be either `"script"` or `"module"`. This influences global + // Can be either `"script"`, `"module"` or `"commonjs"`. This influences global // strict mode and parsing of `import` and `export` declarations. sourceType: "script", // `onInsertedSemicolon` can be a callback that will be called when @@ -457,6 +457,9 @@ function getOptions(opts) { if (isArray(options.onComment)) { options.onComment = pushComment(options, options.onComment); } + if (options.sourceType === "commonjs" && options.allowAwaitOutsideFunction) + { throw new Error("Cannot use allowAwaitOutsideFunction with sourceType: commonjs") } + return options } @@ -488,6 +491,7 @@ var SCOPE_DIRECT_SUPER = 128, SCOPE_CLASS_STATIC_BLOCK = 256, SCOPE_CLASS_FIELD_INIT = 512, + SCOPE_SWITCH = 1024, SCOPE_VAR = SCOPE_TOP | SCOPE_FUNCTION | SCOPE_CLASS_STATIC_BLOCK; function functionFlags(async, generator) { @@ -577,7 +581,12 @@ var Parser = function Parser(options, input, startPos) { // Scope tracking for duplicate variable names (see scope.js) this.scopeStack = []; - this.enterScope(SCOPE_TOP); + this.enterScope( + this.options.sourceType === "commonjs" + // In commonjs, the top-level scope behaves like a function scope + ? SCOPE_FUNCTION + : SCOPE_TOP + ); // For RegExp validation this.regexpState = null; @@ -588,7 +597,7 @@ var Parser = function Parser(options, input, startPos) { this.privateNameStack = []; }; -var prototypeAccessors = { inFunction: { configurable: true },inGenerator: { configurable: true },inAsync: { configurable: true },canAwait: { configurable: true },allowSuper: { configurable: true },allowDirectSuper: { configurable: true },treatFunctionsAsVar: { configurable: true },allowNewDotTarget: { configurable: true },inClassStaticBlock: { configurable: true } }; +var prototypeAccessors = { inFunction: { configurable: true },inGenerator: { configurable: true },inAsync: { configurable: true },canAwait: { configurable: true },allowReturn: { configurable: true },allowSuper: { configurable: true },allowDirectSuper: { configurable: true },treatFunctionsAsVar: { configurable: true },allowNewDotTarget: { configurable: true },allowUsing: { configurable: true },inClassStaticBlock: { configurable: true } }; Parser.prototype.parse = function parse () { var node = this.options.program || this.startNode(); @@ -612,6 +621,12 @@ prototypeAccessors.canAwait.get = function () { return (this.inModule && this.options.ecmaVersion >= 13) || this.options.allowAwaitOutsideFunction }; +prototypeAccessors.allowReturn.get = function () { + if (this.inFunction) { return true } + if (this.options.allowReturnOutsideFunction && this.currentVarScope().flags & SCOPE_TOP) { return true } + return false +}; + prototypeAccessors.allowSuper.get = function () { var ref = this.currentThisScope(); var flags = ref.flags; @@ -632,6 +647,14 @@ prototypeAccessors.allowNewDotTarget.get = function () { return false }; +prototypeAccessors.allowUsing.get = function () { + var ref = this.currentScope(); + var flags = ref.flags; + if (flags & SCOPE_SWITCH) { return false } + if (!this.inModule && flags & SCOPE_TOP) { return false } + return true +}; + prototypeAccessors.inClassStaticBlock.get = function () { return (this.currentVarScope().flags & SCOPE_CLASS_STATIC_BLOCK) > 0 }; @@ -836,7 +859,7 @@ pp$8.parseTopLevel = function(node) { } } this.adaptDirectivePrologue(node.body); this.next(); - node.sourceType = this.options.sourceType; + node.sourceType = this.options.sourceType === "commonjs" ? "script" : this.options.sourceType; return this.finishNode(node, "Program") }; @@ -846,7 +869,7 @@ pp$8.isLet = function(context) { if (this.options.ecmaVersion < 6 || !this.isContextual("let")) { return false } skipWhiteSpace.lastIndex = this.pos; var skip = skipWhiteSpace.exec(this.input); - var next = this.pos + skip[0].length, nextCh = this.input.charCodeAt(next); + var next = this.pos + skip[0].length, nextCh = this.fullCharCodeAt(next); // For ambiguous cases, determine if a LexicalDeclaration (or only a // Statement) is allowed here. If context is not empty then only a Statement // is allowed. However, `let [` is an explicit negative lookahead for @@ -854,12 +877,13 @@ pp$8.isLet = function(context) { if (nextCh === 91 || nextCh === 92) { return true } // '[', '\' if (context) { return false } - if (nextCh === 123 || nextCh > 0xd7ff && nextCh < 0xdc00) { return true } // '{', astral - if (isIdentifierStart(nextCh, true)) { - var pos = next + 1; - while (isIdentifierChar(nextCh = this.input.charCodeAt(pos), true)) { ++pos; } - if (nextCh === 92 || nextCh > 0xd7ff && nextCh < 0xdc00) { return true } - var ident = this.input.slice(next, pos); + if (nextCh === 123) { return true } // '{' + if (isIdentifierStart(nextCh)) { + var start = next; + do { next += nextCh <= 0xffff ? 1 : 2; } + while (isIdentifierChar(nextCh = this.fullCharCodeAt(next))) + if (nextCh === 92) { return true } + var ident = this.input.slice(start, next); if (!keywordRelationalOperator.test(ident)) { return true } } return false @@ -878,7 +902,7 @@ pp$8.isAsyncFunction = function() { return !lineBreak.test(this.input.slice(this.pos, next)) && this.input.slice(next, next + 8) === "function" && (next + 8 === this.input.length || - !(isIdentifierChar(after = this.input.charCodeAt(next + 8)) || after > 0xd7ff && after < 0xdc00)) + !(isIdentifierChar(after = this.fullCharCodeAt(next + 8)) || after === 92 /* '\' */)) }; pp$8.isUsingKeyword = function(isAwaitUsing, isFor) { @@ -892,28 +916,28 @@ pp$8.isUsingKeyword = function(isAwaitUsing, isFor) { if (lineBreak.test(this.input.slice(this.pos, next))) { return false } if (isAwaitUsing) { - var awaitEndPos = next + 5 /* await */, after; - if (this.input.slice(next, awaitEndPos) !== "using" || - awaitEndPos === this.input.length || - isIdentifierChar(after = this.input.charCodeAt(awaitEndPos)) || - (after > 0xd7ff && after < 0xdc00) + var usingEndPos = next + 5 /* using */, after; + if (this.input.slice(next, usingEndPos) !== "using" || + usingEndPos === this.input.length || + isIdentifierChar(after = this.fullCharCodeAt(usingEndPos)) || + after === 92 /* '\' */ ) { return false } - skipWhiteSpace.lastIndex = awaitEndPos; + skipWhiteSpace.lastIndex = usingEndPos; var skipAfterUsing = skipWhiteSpace.exec(this.input); - if (skipAfterUsing && lineBreak.test(this.input.slice(awaitEndPos, awaitEndPos + skipAfterUsing[0].length))) { return false } - } - - if (isFor) { - var ofEndPos = next + 2 /* of */, after$1; - if (this.input.slice(next, ofEndPos) === "of") { - if (ofEndPos === this.input.length || - (!isIdentifierChar(after$1 = this.input.charCodeAt(ofEndPos)) && !(after$1 > 0xd7ff && after$1 < 0xdc00))) { return false } - } - } - - var ch = this.input.charCodeAt(next); - return isIdentifierStart(ch, true) || ch === 92 // '\' + next = usingEndPos + skipAfterUsing[0].length; + if (skipAfterUsing && lineBreak.test(this.input.slice(usingEndPos, next))) { return false } + } + + var ch = this.fullCharCodeAt(next); + if (!isIdentifierStart(ch) && ch !== 92 /* '\' */) { return false } + var idStart = next; + do { next += ch <= 0xffff ? 1 : 2; } + while (isIdentifierChar(ch = this.fullCharCodeAt(next))) + if (ch === 92) { return true } + var id = this.input.slice(idStart, next); + if (keywordRelationalOperator.test(id) || isFor && id === "of") { return false } + return true }; pp$8.isAwaitUsing = function(isFor) { @@ -1002,8 +1026,8 @@ pp$8.parseStatement = function(context, topLevel, exports) { var usingKind = this.isAwaitUsing(false) ? "await using" : this.isUsing(false) ? "using" : null; if (usingKind) { - if (topLevel && this.options.sourceType === "script") { - this.raise(this.start, "Using declaration cannot appear in the top level when source type is `script`"); + if (!this.allowUsing) { + this.raise(this.start, "Using declaration cannot appear in the top level when source type is `script` or in the bare case statement"); } if (usingKind === "await using") { if (!this.canAwait) { @@ -1100,7 +1124,12 @@ pp$8.parseForStatement = function(node) { if (usingKind) { var init$2 = this.startNode(); this.next(); - if (usingKind === "await using") { this.next(); } + if (usingKind === "await using") { + if (!this.canAwait) { + this.raise(this.start, "Await using cannot appear outside of async function"); + } + this.next(); + } this.parseVar(init$2, true, usingKind); this.finishNode(init$2, "VariableDeclaration"); return this.parseForAfterInit(node, init$2, awaitAt) @@ -1159,7 +1188,7 @@ pp$8.parseIfStatement = function(node) { }; pp$8.parseReturnStatement = function(node) { - if (!this.inFunction && !this.options.allowReturnOutsideFunction) + if (!this.allowReturn) { this.raise(this.start, "'return' outside of function"); } this.next(); @@ -1178,7 +1207,7 @@ pp$8.parseSwitchStatement = function(node) { node.cases = []; this.expect(types$1.braceL); this.labels.push(switchLabel); - this.enterScope(0); + this.enterScope(SCOPE_SWITCH); // Statements under must be grouped (by label) in SwitchCase // nodes. `cur` is used to keep the node that we are currently @@ -3886,7 +3915,7 @@ pp$2.copyNode = function(node) { }; // This file was generated by "bin/generate-unicode-script-values.js". Do not modify manually! -var scriptValuesAddedInUnicode = "Gara Garay Gukh Gurung_Khema Hrkt Katakana_Or_Hiragana Kawi Kirat_Rai Krai Nag_Mundari Nagm Ol_Onal Onao Sunu Sunuwar Todhri Todr Tulu_Tigalari Tutg Unknown Zzzz"; +var scriptValuesAddedInUnicode = "Berf Beria_Erfe Gara Garay Gukh Gurung_Khema Hrkt Katakana_Or_Hiragana Kawi Kirat_Rai Krai Nag_Mundari Nagm Ol_Onal Onao Sidetic Sidt Sunu Sunuwar Tai_Yo Tayo Todhri Todr Tolong_Siki Tols Tulu_Tigalari Tutg Unknown Zzzz"; // This file contains Unicode properties extracted from the ECMAScript specification. // The lists are extracted like so: @@ -5447,13 +5476,17 @@ pp.readToken = function(code) { return this.getTokenFromCode(code) }; -pp.fullCharCodeAtPos = function() { - var code = this.input.charCodeAt(this.pos); +pp.fullCharCodeAt = function(pos) { + var code = this.input.charCodeAt(pos); if (code <= 0xd7ff || code >= 0xdc00) { return code } - var next = this.input.charCodeAt(this.pos + 1); + var next = this.input.charCodeAt(pos + 1); return next <= 0xdbff || next >= 0xe000 ? code : (code << 10) + next - 0x35fdc00 }; +pp.fullCharCodeAtPos = function() { + return this.fullCharCodeAt(this.pos) +}; + pp.skipBlockComment = function() { var startLoc = this.options.onComment && this.curPosition(); var start = this.pos, end = this.input.indexOf("*/", this.pos += 2); @@ -6181,7 +6214,7 @@ pp.readWord = function() { // [ghbt]: https://github.com/acornjs/acorn/issues -var version = "8.15.0"; +var version = "8.16.0"; Parser.acorn = { Parser: Parser, diff --git a/deps/acorn/acorn/package.json b/deps/acorn/acorn/package.json index 6f63ddbf620a19..7f4d1708b3f026 100644 --- a/deps/acorn/acorn/package.json +++ b/deps/acorn/acorn/package.json @@ -16,7 +16,7 @@ ], "./package.json": "./package.json" }, - "version": "8.15.0", + "version": "8.16.0", "engines": { "node": ">=0.4.0" }, diff --git a/deps/ada/ada.cpp b/deps/ada/ada.cpp index 732a5245ef0426..80bec6c67f313a 100644 --- a/deps/ada/ada.cpp +++ b/deps/ada/ada.cpp @@ -1,4 +1,4 @@ -/* auto-generated on 2026-01-30 13:29:04 -0500. Do not edit! */ +/* auto-generated on 2026-03-23 17:52:13 -0400. Do not edit! */ /* begin file src/ada.cpp */ #include "ada.h" /* begin file src/checkers.cpp */ @@ -10725,7 +10725,7 @@ constexpr static std::array<uint8_t, 256> is_forbidden_domain_code_point_table = for (uint8_t c = 0; c <= 32; c++) { result[c] = true; } - for (size_t c = 127; c < 255; c++) { + for (size_t c = 127; c < 256; c++) { result[c] = true; } return result; @@ -10767,7 +10767,7 @@ constexpr static std::array<uint8_t, 256> for (uint8_t c = 0; c <= 32; c++) { result[c] = 1; } - for (size_t c = 127; c < 255; c++) { + for (size_t c = 127; c < 256; c++) { result[c] = 1; } return result; @@ -13404,7 +13404,13 @@ result_type parse_url_impl(std::string_view user_input, url.query = base_url->query; } else { url.update_base_pathname(base_url->get_pathname()); - url.update_base_search(base_url->get_search()); + if (base_url->has_search()) { + // get_search() returns "" for an empty query string (URL ends + // with '?'). update_base_search("") would incorrectly clear the + // query, so pass "?" to preserve the empty query distinction. + auto s = base_url->get_search(); + url.update_base_search(s.empty() ? std::string_view("?") : s); + } } url.update_unencoded_base_hash(*fragment); return url; @@ -13628,7 +13634,13 @@ result_type parse_url_impl(std::string_view user_input, // cloning the base path includes cloning the has_opaque_path flag url.has_opaque_path = base_url->has_opaque_path; url.update_base_pathname(base_url->get_pathname()); - url.update_base_search(base_url->get_search()); + if (base_url->has_search()) { + // get_search() returns "" for an empty query string (URL ends + // with '?'). update_base_search("") would incorrectly clear the + // query, so pass "?" to preserve the empty query distinction. + auto s = base_url->get_search(); + url.update_base_search(s.empty() ? std::string_view("?") : s); + } } url.has_opaque_path = base_url->has_opaque_path; @@ -14046,7 +14058,13 @@ result_type parse_url_impl(std::string_view user_input, } else { url.update_host_to_base_host(base_url->get_hostname()); url.update_base_pathname(base_url->get_pathname()); - url.update_base_search(base_url->get_search()); + if (base_url->has_search()) { + // get_search() returns "" for an empty query string (URL ends + // with '?'). update_base_search("") would incorrectly clear the + // query, so pass "?" to preserve the empty query distinction. + auto s = base_url->get_search(); + url.update_base_search(s.empty() ? std::string_view("?") : s); + } } url.has_opaque_path = base_url->has_opaque_path; @@ -14495,6 +14513,12 @@ bool url_aggregator::set_pathname(const std::string_view input) { if (get_pathname().starts_with("//") && !has_authority() && !has_dash_dot()) { buffer.insert(components.pathname_start, "/."); components.pathname_start += 2; + if (components.search_start != url_components::omitted) { + components.search_start += 2; + } + if (components.hash_start != url_components::omitted) { + components.hash_start += 2; + } } ADA_ASSERT_TRUE(validate()); return true; @@ -16651,8 +16675,15 @@ tl::expected<std::string, errors> canonicalize_pathname( const auto pathname = url->get_pathname(); // If leading slash is false, then set result to the code point substring // from 2 to the end of the string within result. - return leading_slash ? std::string(pathname) - : std::string(pathname.substr(2)); + if (!leading_slash) { + // pathname should start with "/-" but path traversal (e.g. "../../") + // can reduce it to just "/" which is shorter than 2 characters. + if (pathname.size() < 2) { + return tl::unexpected(errors::type_error); + } + return std::string(pathname.substr(2)); + } + return std::string(pathname); } // If parseResult is failure, then throw a TypeError. return tl::unexpected(errors::type_error); @@ -17189,7 +17220,8 @@ std::string generate_pattern_string( // point. bool needs_grouping = !part.suffix.empty() || - (!part.prefix.empty() && part.prefix[0] != options.get_prefix()[0]); + (!part.prefix.empty() && !options.get_prefix().empty() && + part.prefix[0] != options.get_prefix()[0]); // If all of the following are true: // - needs grouping is false; and @@ -17227,9 +17259,8 @@ std::string generate_pattern_string( // then set needs grouping to true. if (!needs_grouping && part.prefix.empty() && previous_part && previous_part->type == url_pattern_part_type::FIXED_TEXT && - !options.get_prefix().empty() && - previous_part->value.at(previous_part->value.size() - 1) == - options.get_prefix()[0]) { + !previous_part->value.empty() && !options.get_prefix().empty() && + previous_part->value.back() == options.get_prefix()[0]) { needs_grouping = true; } @@ -17352,8 +17383,14 @@ std_regex_provider::regex_search(std::string_view input, const std::regex& pattern) { // Use iterator-based regex_search to avoid string allocation std::match_results<std::string_view::const_iterator> match_result; - if (!std::regex_search(input.begin(), input.end(), match_result, pattern, - std::regex_constants::match_any)) { + try { + if (!std::regex_search(input.begin(), input.end(), match_result, pattern, + std::regex_constants::match_any)) { + return std::nullopt; + } + } catch (const std::regex_error& e) { + (void)e; + ada_log("std_regex_provider::regex_search failed:", e.what()); return std::nullopt; } std::vector<std::optional<std::string>> matches; @@ -17372,7 +17409,13 @@ std_regex_provider::regex_search(std::string_view input, bool std_regex_provider::regex_match(std::string_view input, const std::regex& pattern) { - return std::regex_match(input.begin(), input.end(), pattern); + try { + return std::regex_match(input.begin(), input.end(), pattern); + } catch (const std::regex_error& e) { + (void)e; + ada_log("std_regex_provider::regex_match failed:", e.what()); + return false; + } } #endif // ADA_USE_UNSAFE_STD_REGEX_PROVIDER diff --git a/deps/ada/ada.gyp b/deps/ada/ada.gyp index 4c8910dcb5c915..30054e63e567fd 100644 --- a/deps/ada/ada.gyp +++ b/deps/ada/ada.gyp @@ -6,10 +6,19 @@ { 'target_name': 'ada', 'type': 'static_library', - 'include_dirs': ['.'], + 'include_dirs': [ + '.', + '<(DEPTH)/deps/v8/third_party/simdutf', + ], 'direct_dependent_settings': { 'include_dirs': ['.'], }, + 'defines': [ + 'ADA_USE_SIMDUTF=1', + ], + 'dependencies': [ + '../../tools/v8_gypfiles/v8.gyp:simdutf', + ], 'sources': [ '<@(ada_sources)' ] }, ] diff --git a/deps/ada/ada.h b/deps/ada/ada.h index 898c7dd3042618..8f9089d2210a74 100644 --- a/deps/ada/ada.h +++ b/deps/ada/ada.h @@ -1,4 +1,4 @@ -/* auto-generated on 2026-01-30 13:29:04 -0500. Do not edit! */ +/* auto-generated on 2026-03-23 17:52:13 -0400. Do not edit! */ /* begin file include/ada.h */ /** * @file ada.h @@ -6458,6 +6458,39 @@ constexpr std::string_view is_special_list[] = {"http", " ", "https", "ws", "ftp", "wss", "file", " "}; // for use with get_special_port constexpr uint16_t special_ports[] = {80, 0, 443, 80, 21, 443, 0, 0}; + +// @private +// convert a string_view to a 64-bit integer key for fast comparison +constexpr uint64_t make_key(std::string_view sv) { + uint64_t val = 0; + for (size_t i = 0; i < sv.size(); i++) + val |= (uint64_t)(uint8_t)sv[i] << (i * 8); + return val; +} +// precomputed keys for the special schemes, indexed by a hash of the input +// string +constexpr uint64_t scheme_keys[] = { + make_key("http"), // 0: HTTP + 0, // 1: sentinel + make_key("https"), // 2: HTTPS + make_key("ws"), // 3: WS + make_key("ftp"), // 4: FTP + make_key("wss"), // 5: WSS + make_key("file"), // 6: FILE + 0, // 7: sentinel +}; + +// @private +// branchless load of up to 5 characters into a uint64_t, padding with zeros if +// n < 5 +inline uint64_t branchless_load5(const char *p, size_t n) { + uint64_t input = (uint8_t)p[0]; + input |= ((uint64_t)(uint8_t)p[n > 1] << 8) & (0 - (uint64_t)(n > 1)); + input |= ((uint64_t)(uint8_t)p[(n > 2) * 2] << 16) & (0 - (uint64_t)(n > 2)); + input |= ((uint64_t)(uint8_t)p[(n > 3) * 3] << 24) & (0 - (uint64_t)(n > 3)); + input |= ((uint64_t)(uint8_t)p[(n > 4) * 4] << 32) & (0 - (uint64_t)(n > 4)); + return input; +} } // namespace details /**** @@ -6498,7 +6531,9 @@ constexpr uint16_t get_special_port(std::string_view scheme) noexcept { } int hash_value = (2 * scheme.size() + (unsigned)(scheme[0])) & 7; const std::string_view target = details::is_special_list[hash_value]; - if ((target[0] == scheme[0]) && (target.substr(1) == scheme.substr(1))) { + if (scheme.size() == target.size() && + details::branchless_load5(scheme.data(), scheme.size()) == + details::scheme_keys[hash_value]) { return details::special_ports[hash_value]; } else { return 0; @@ -6513,7 +6548,9 @@ constexpr ada::scheme::type get_scheme_type(std::string_view scheme) noexcept { } int hash_value = (2 * scheme.size() + (unsigned)(scheme[0])) & 7; const std::string_view target = details::is_special_list[hash_value]; - if ((target[0] == scheme[0]) && (target.substr(1) == scheme.substr(1))) { + if (scheme.size() == target.size() && + details::branchless_load5(scheme.data(), scheme.size()) == + details::scheme_keys[hash_value]) { return ada::scheme::type(hash_value); } else { return ada::scheme::NOT_SPECIAL; @@ -8091,6 +8128,12 @@ inline void url_aggregator::update_base_pathname(const std::string_view input) { // output. buffer.insert(components.pathname_start, "/."); components.pathname_start += 2; + if (components.search_start != url_components::omitted) { + components.search_start += 2; + } + if (components.hash_start != url_components::omitted) { + components.hash_start += 2; + } } uint32_t difference = replace_and_resize( @@ -9362,7 +9405,8 @@ inline void url_search_params::remove(const std::string_view key, } inline void url_search_params::sort() { - // We rely on the fact that the content is valid UTF-8. + // Keys are expected to be valid UTF-8, but percent_decode can produce + // arbitrary byte sequences. Handle truncated/invalid sequences gracefully. std::ranges::stable_sort(params, [](const key_value_pair &lhs, const key_value_pair &rhs) { size_t i = 0, j = 0; @@ -9376,18 +9420,15 @@ inline void url_search_params::sort() { low_surrogate1 = 0; } else { uint8_t c1 = uint8_t(lhs.first[i]); - if (c1 <= 0x7F) { - codePoint1 = c1; - i++; - } else if (c1 <= 0xDF) { + if (c1 > 0x7F && c1 <= 0xDF && i + 1 < lhs.first.size()) { codePoint1 = ((c1 & 0x1F) << 6) | (uint8_t(lhs.first[i + 1]) & 0x3F); i += 2; - } else if (c1 <= 0xEF) { + } else if (c1 > 0xDF && c1 <= 0xEF && i + 2 < lhs.first.size()) { codePoint1 = ((c1 & 0x0F) << 12) | ((uint8_t(lhs.first[i + 1]) & 0x3F) << 6) | (uint8_t(lhs.first[i + 2]) & 0x3F); i += 3; - } else { + } else if (c1 > 0xEF && c1 <= 0xF7 && i + 3 < lhs.first.size()) { codePoint1 = ((c1 & 0x07) << 18) | ((uint8_t(lhs.first[i + 1]) & 0x3F) << 12) | ((uint8_t(lhs.first[i + 2]) & 0x3F) << 6) | @@ -9398,6 +9439,10 @@ inline void url_search_params::sort() { uint16_t high_surrogate = uint16_t(0xD800 + (codePoint1 >> 10)); low_surrogate1 = uint16_t(0xDC00 + (codePoint1 & 0x3FF)); codePoint1 = high_surrogate; + } else { + // ASCII (c1 <= 0x7F) or truncated/invalid UTF-8: treat as raw byte + codePoint1 = c1; + i++; } } @@ -9406,18 +9451,15 @@ inline void url_search_params::sort() { low_surrogate2 = 0; } else { uint8_t c2 = uint8_t(rhs.first[j]); - if (c2 <= 0x7F) { - codePoint2 = c2; - j++; - } else if (c2 <= 0xDF) { + if (c2 > 0x7F && c2 <= 0xDF && j + 1 < rhs.first.size()) { codePoint2 = ((c2 & 0x1F) << 6) | (uint8_t(rhs.first[j + 1]) & 0x3F); j += 2; - } else if (c2 <= 0xEF) { + } else if (c2 > 0xDF && c2 <= 0xEF && j + 2 < rhs.first.size()) { codePoint2 = ((c2 & 0x0F) << 12) | ((uint8_t(rhs.first[j + 1]) & 0x3F) << 6) | (uint8_t(rhs.first[j + 2]) & 0x3F); j += 3; - } else { + } else if (c2 > 0xEF && c2 <= 0xF7 && j + 3 < rhs.first.size()) { codePoint2 = ((c2 & 0x07) << 18) | ((uint8_t(rhs.first[j + 1]) & 0x3F) << 12) | ((uint8_t(rhs.first[j + 2]) & 0x3F) << 6) | @@ -9427,6 +9469,10 @@ inline void url_search_params::sort() { uint16_t high_surrogate = uint16_t(0xD800 + (codePoint2 >> 10)); low_surrogate2 = uint16_t(0xDC00 + (codePoint2 & 0x3FF)); codePoint2 = high_surrogate; + } else { + // ASCII (c2 <= 0x7F) or truncated/invalid UTF-8: treat as raw byte + codePoint2 = c2; + j++; } } @@ -9530,13 +9576,14 @@ url_pattern_component<regex_provider>::create_component_match_result( auto result = url_pattern_component_result{.input = std::move(input), .groups = {}}; - // Optimization: Let's reserve the size. - result.groups.reserve(exec_result.size()); - // We explicitly start iterating from 0 even though the spec // says we should start from 1. This case is handled by the - // std_regex_provider. - for (size_t index = 0; index < exec_result.size(); index++) { + // std_regex_provider which removes the full match from index 0. + // Use min() to guard against potential mismatches between + // exec_result size and group_name_list size. + const size_t size = std::min(exec_result.size(), group_name_list.size()); + result.groups.reserve(size); + for (size_t index = 0; index < size; index++) { result.groups.emplace(group_name_list[index], std::move(exec_result[index])); } @@ -11221,14 +11268,14 @@ constructor_string_parser<regex_provider>::parse(std::string_view input) { #ifndef ADA_ADA_VERSION_H #define ADA_ADA_VERSION_H -#define ADA_VERSION "3.4.2" +#define ADA_VERSION "3.4.4" namespace ada { enum { ADA_VERSION_MAJOR = 3, ADA_VERSION_MINOR = 4, - ADA_VERSION_REVISION = 2, + ADA_VERSION_REVISION = 4, }; } // namespace ada diff --git a/deps/amaro/README.md b/deps/amaro/README.md index 0079b288068147..75653766de7a6b 100644 --- a/deps/amaro/README.md +++ b/deps/amaro/README.md @@ -41,11 +41,31 @@ node --import="amaro/strip" file.ts Enabling TypeScript feature transformation: ```bash -node --experimental-transform-types --import="amaro/transform" file.ts +node --enable-source-maps --import="amaro/transform" file.ts ``` -> Note that the "amaro/transform" loader should be used with `--experimental-transform-types` flag, or -> at least with `--enable-source-maps` flag, to preserve the original source maps. +> Note that the `amaro/transform` loader should be used with `--enable-source-maps` +> to preserve accurate source-mapped stack traces. + +#### Programmatic registration with `module.register()` + +If you want TypeScript to "just work" in an existing codebase without passing `--import` every time, create a small bootstrap file and register Amaro once before loading your TS entrypoint. + +```mjs +// bootstrap.mjs +import { register } from "node:module"; + +register("amaro/strip", import.meta.url); +await import("./src/index.ts"); +``` + +Then start your app through the bootstrap file: + +```bash +node --watch ./bootstrap.mjs +``` + +For transform mode, swap `amaro/strip` with `amaro/transform` and run Node with `--enable-source-maps`. #### Type stripping in dependencies diff --git a/deps/amaro/dist/index.js b/deps/amaro/dist/index.js index e11be73ac5021e..b0f6fd4d108780 100644 --- a/deps/amaro/dist/index.js +++ b/deps/amaro/dist/index.js @@ -456,8 +456,8 @@ ${val.stack}`; const ret = false; return ret; }; - module2.exports.__wbindgen_closure_wrapper5340 = function(arg0, arg1, arg2) { - const ret = makeMutClosure(arg0, arg1, 905, __wbg_adapter_50); + module2.exports.__wbindgen_closure_wrapper5029 = function(arg0, arg1, arg2) { + const ret = makeMutClosure(arg0, arg1, 668, __wbg_adapter_50); return addHeapObject(ret); }; module2.exports.__wbindgen_debug_string = function(arg0, arg1) { @@ -545,7 +545,7 @@ ${val.stack}`; throw new Error(getStringFromWasm0(arg0, arg1)); }; var { Buffer: Buffer2 } = require("node:buffer"); - var bytes = Buffer2.from("AGFzbQEAAAAB5wRNYAAAYAABf2AAAX5gAX8AYAF/AX9gAX8BfmABfwF8YAJ/fwBgAn9/AX9gAn9/AX5gAn9/AXxgA39/fwBgA39/fwF/YAN/f38BfmAEf39/fwBgBH9/f38Bf2AEf39/fwF+YAV/f39/fwBgBX9/f39/AX9gBn9/f39/fwBgBn9/f39/fwF/YAd/f39/f39/AGAHf39/f39/fwF/YAh/f39/f39/fwBgCH9/f39/f39/AX9gC39/f39/f39/f39/AX9gDX9/f39/f39/f39/f38AYA5/f39/f39/f39/f39/fwF/YA9/f39/f39/f39/f39/f38Bf2ATf39/f39/f39/f39/f39/f39/fwF/YBd/f39/f39/f39/f39/f39/f39/f39/fwF/YAl/f39/f39+fn4AYAV/f39/fgBgBn9/f39+fwBgBH9/f34AYAZ/f39+f38AYAN/f34Bf2AEf39+fwBgBH9/fn8Bf2AFf39+f38AYAZ/f35/fn8AYAV/f31/fwBgBX9/fH9/AGACf34AYAJ/fgF/YAN/fn8AYAN/fn8Bf2AEf35/fwBgBH9+f34BfmADf35+AGADf35+AX9gBH9+fn8AYAV/fn5+fwBgBX9+fn5+AGAEf31/fwBgAn98AGADf3x/AX9gBH98f38AYAR/fH9/AX9gAX4AYAF+AX9gAX4BfmACfn8AYAJ+fwF+YAN+f38Bf2ACfn4AYAJ+fgF+YAN+fn8AYAR+fn9/AX5gBH5+fn8BfmAHfn5+f39/fwF+YAF8AX9gAXwBfGACfH8Bf2ACfH8BfGACfHwBfGADfHx8AXwCyxo9GF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxVfX3diaW5kZ2VuX251bWJlcl9uZXcARxhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18aX193YmluZGdlbl9iaWdpbnRfZnJvbV91NjQAPBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18VX193YmluZGdlbl9zdHJpbmdfbmV3AAgYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fF19fd2JpbmRnZW5faXNfdW5kZWZpbmVkAAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fDV9fd2JpbmRnZW5faW4ACBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18WX193YmluZGdlbl9ib29sZWFuX2dldAAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxVfX3diaW5kZ2VuX3N0cmluZ19nZXQABxhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18UX193YmluZGdlbl9pc19vYmplY3QABBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18TX193YmluZGdlbl9qc3ZhbF9lcQAIGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diaW5kZ2VuX29iamVjdF9kcm9wX3JlZgADGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxRfX3diaW5kZ2VuX2Vycm9yX25ldwAIGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxRfX3diaW5kZ2VuX2lzX2JpZ2ludAAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxVfX3diaW5kZ2VuX251bWJlcl9nZXQABxhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18kX193YmdfaXNTYWZlSW50ZWdlcl8zNDNlMmJlZWVlY2UxYmIwAAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fGl9fd2JpbmRnZW5fYmlnaW50X2Zyb21faTY0ADwYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fHV9fd2JnX2xlbmd0aF9lMmQyYTQ5MTMyYzFiMjU2AAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fH19fd2JnX2l0ZXJhdG9yXzlhMjRjODhkZjg2MGRjNjUAARhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18lX193YmdfaW5zdGFuY2VvZl9NYXBfZjM0NjljZTIyNDRkMjQzMAAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19zZXRfM2YxZDBiOTg0ZWQyNzJlZAALGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19uZXdfMjNhMjY2NWZhYzgzYzYxMQAIGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxNfX3diaW5kZ2VuX2lzX2ZhbHN5AAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fJF9fd2JnX2dldHdpdGhyZWZrZXlfMWRjMzYxYmQxMDA1M2JmZQAIGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxRfX3diaW5kZ2VuX2lzX3N0cmluZwAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19nZXRfYjliOTMwNDdmZTNjZjQ1YgAIGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXx9fX3diZ190b1N0cmluZ181Mjg1NTk3OTYwNjc2YjdiAAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fGl9fd2JnX25ld180MDVlMjJmMzkwNTc2Y2UyAAEYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fGl9fd2JnX25ld183OGZlYjEwOGI2NDcyNzEzAAEYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fGl9fd2JnX3NldF8zNzgzNzAyM2YzZDc0MGU4AAsYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fG19fd2JpbmRnZW5fb2JqZWN0X2Nsb25lX3JlZgAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxZfX3diaW5kZ2VuX2lzX2Z1bmN0aW9uAAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fG19fd2JnX25leHRfNjU3NGUxYThhNjJkMTA1NQAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxtfX3diZ19kb25lXzc2OWU1ZWRlNGIzMWM2N2IABBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18cX193YmdfdmFsdWVfY2QxZmZhN2IxYWI3OTRmMQAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19nZXRfNjdiMmJhNjJmYzMwZGUxMgAIGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxtfX3diZ19uZXh0XzI1ZmVhZGZjMDkxM2ZlYTkABBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18bX193YmdfY2FsbF82NzJhNGQyMTYzNGQ0YTI0AAgYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fIF9fd2JnX25ld25vYXJnc18xMDVlZDQ3MTQ3NWFhZjUwAAgYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fLV9fd2JnX3N0YXRpY19hY2Nlc3Nvcl9HTE9CQUxfODhhOTAyZDEzYTU1N2QwNwABGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXzJfX3diZ19zdGF0aWNfYWNjZXNzb3JfR0xPQkFMX1RISVNfNTY1NzhiZTdlOWY4MzJiMAABGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXy1fX3diZ19zdGF0aWNfYWNjZXNzb3JfV0lORE9XXzVkZTM3MDQzYTkxYTljNDAAARhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18rX193Ymdfc3RhdGljX2FjY2Vzc29yX1NFTEZfMzdjNWQ0MThlNGJmNTgxOQABGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXx5fX3diZ19pc0FycmF5X2ExZWFiN2UwZDA2NzM5MWIABBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18bX193YmdfY2FsbF83Y2NjZGQ2OWUwNzkxYWUyAAwYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fHV9fd2JnX2xlbmd0aF9hNDQ2MTkzZGMyMmMxMmY4AAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fEV9fd2JpbmRnZW5fbWVtb3J5AAEYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fHV9fd2JnX2J1ZmZlcl82MDljYzNlZWU1MWVkMTU4AAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fGl9fd2JnX25ld19hMTIwMDJhN2Y5MWM3NWJlAAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fGl9fd2JnX3NldF82NTU5NWJkZDg2OGIzMDA5AAsYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fLF9fd2JnX2luc3RhbmNlb2ZfVWludDhBcnJheV8xNzE1NmJjZjExODA4NmE5AAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fGV9fd2JpbmRnZW5fanN2YWxfbG9vc2VfZXEACBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18tX193YmdfaW5zdGFuY2VvZl9BcnJheUJ1ZmZlcl9lMTQ1ODU0MzJlMzczN2ZjAAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fHl9fd2JnX2VudHJpZXNfMzI2NWQ0MTU4YjMzZTVkYwAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxBfX3diaW5kZ2VuX3Rocm93AAcYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fHF9fd2JpbmRnZW5fYmlnaW50X2dldF9hc19pNjQABxhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18XX193YmluZGdlbl9kZWJ1Z19zdHJpbmcABxhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18SX193YmluZGdlbl9jYl9kcm9wAAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fG19fd2JnX3RoZW5fNDRiNzM5NDZkMmZiM2U3ZAAIGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXyVfX3diZ19xdWV1ZU1pY3JvdGFza185N2Q5MmI0ZmNjOGE2MWM1AAMYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fJV9fd2JnX3F1ZXVlTWljcm90YXNrX2QzMjE5ZGVmODI1NTI0ODUABBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18eX193YmdfcmVzb2x2ZV80ODUxNzg1YzljNWY1NzNkAAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fHl9fd2JpbmRnZW5fY2xvc3VyZV93cmFwcGVyNTM0MAAMA9AkziQOBxELCxEHBwcHBwsLBw4LCwsLBwcOBwcHBwsLBxMOCw4RDgcLBwcvBw4RBwcHCAcHBw4HOg4HBwsIBwcHDwcLBxMHEwsOEwQHCwcVEQcLCwcLDgsLBw4LBwMHBwcTEwcHBwgLCBMHBwcLBwcTBAcIAwcHBwcRBxUHCwcHDgMLBwcHAxMTExMTBw4HBwMODgcHBwcTAwwHBwcHBwcHBxEHEQcOBwcLBwMHAwcICw5LBwsTEQMHBw4BBw4IBwcLCwcHDgsHBwcISREDEQcLBwMHBwcHEwQMGhEHBw4HCwsRBwwOCAcIDhEIBwgODAsOCwgMBwgICAcTBwcIBwgHEREHDg4HAwcIAQcHAwcVAwcMCwcHBw4LDgcDBwgHBxERCwcICwcHEQcLBwcEBwsOCAgHBwMTDgsLERELDAdMEwcLBwgDAwsEBwcHBAgHBwsHBwcHCwcHBAQHBwcBBxUHCwsOCAcEDgwHAwcHBwcLAwcHCwcDEQcHDgwHCwgLEQcOCwMbBwgHBwcDBwcHCwsDBAsDBAcHBwcHBwsDAwMDAwsICAcNBwcHBAcHDxUDAwMODggWBw8LDgcHAwcHAwcHBwsLBwcHDwsHEwcLBw4PCwwHBwcVEQcLBwcPBwQOAwcHBwcHBwgEBwsHIQwTBwgHBwcHEwMVCAcVCwcLOAsIEQcHCAcIAwcLDA4OCwcHCwcHDAgHBwcHBwsMCAcMBwwODhgHCwcODgsLBwcIBwcHCAMHERELCwoLCAMIBw8PBwsDCwcHCwwIBxMDCwcHDAsHBw4EOgcDAwMOCwMDBwcHBw4HDggHAwgOCwcODAcDCAMLCAgHDAMHAw4ODAsLBwsDAwsIBwwoFQcLCAcHFwsHBwcHCAMLBwcMBwcHBxUHAwMDCAcHBwcIDgcHBwsMBwsREwUHAwsUCAcHBwwHBAcHCwsHEwgMEQMOAwcHBwcLBxMHDgcIAwcHLi0HBwcIDAMrBwsMCxEHBwcICwcOBwcHCw4OCxMHBwcOExMHCA4HBwcHAwcHBw4DBAcDEQcDCwsHEwcHBxMHCwMDFQcLCAsLDhUVBwsTEwsLBwgHEwgHBwcLC0REBwwLCxIIBwcHRAcHBwcHBxETFQMIEwcHFRMHBwRLDAcLBAgDBwcOEwgIBwcDCA4TMQwDBwcICwcHERMLBwgHBwcHCwcHCA4HDAcLBwsHBwcABwcHBwcHBwc+AwQIDgsDCx8HBwcHBwgHBwcHCAsOBwcHCwsLAwcRDg4HBwsOBwcTCAgHE0ALCwcHDgMIBwcLDggIBwcHCwwODg4OBxELBw4DCwcHAwcHCwsDBwQiCw4LDhMHBwgHBBYEBwQIBw4ICAcHCBQEEwcLEwsDAwUISAsTBwsLBwcOCwcOBwcIAwcWBwcHBw8LBwcHDAcVBAgHDg4HBwcHFQ4ICAMMBwsHBwMLCxMgBwcEBwcHBAMHBwcPEwQHCAgHBwsHCw4DBwcHAyUHAwcRDwsICAcHBAcTDgsOAwcLBwsLAwMLBwcRAzALDg4DAwsIBwMHBwsHBwgDBwgLEwgEAwsPBAgjCAMIEQgLBwMECw4TBxMDCwwMDhMTBwcHEhEDBwgICw8IEwcHBwcHDgcDBAgIBwcLBwMHDAMIBwQDAxMOBxMHCAgIBwsEBwcLAwsTCwMDExMLAw4LCwgHCAgICAgICAgIBxMDBwcHCwgIBwsDBwcHBwcHCwsHBwQHBxYODg4OBwQHEg4RCwgTEw4OBwcIAwgDCAcICAMICw4OCwcDEwgDDAgIDgcLDg4HBwsLCgcDAwcIEQsOCwMHBwMHCwMTCAsMDAMICAgFLQMHAwsLBwgHCAQDEQcLDgcHDgcEAwcHBwcHBwcPCwgMBwcDDA8PDxELAw4HBAMHBBEDDAgIBwsHCQsLBwcHBwsDDgsEBwcHCwsrBwcDBAsHBwcHBAcSEQsIBwcHCAMHExMHCxIHBwsFCBEHCwwMBwcHAw4HBwcHBxUDHgcMBy8DDwcHCAsOBAMHBwsHCAsODggICwsHDgMDCAsICAgIEwQIBwcDCAgDCAcICAgDAwcdCwMLCwcHBwcHCAcHDgcHDwMHDwsICAwHJgcLBwsLCAsHAwgHCAcHJgMECAQOCwcDAwMHBwcLCwscDgcPDgsLCAgOCAMREQsRFQcLCwsHAwcDAxEsAwMICAcHBwcIBw4HEQcIBAcOCxkOQBEHEQMMAwQDCAwMCAQTBwgDEQgOFQcHDAwHAwcOBAMHBwMIBw4HBzcOCwsOCAgHBwcIFgcICAcIAwMICAgDCAgIAwMrBwsHCA8EEwMHAwwDEQsHCAgHCAgHCAcHBwcMBwcLCAgDAwgIAwMTDgcHBAQHDgwHAwwLAw4OBwcHCwQEBwcRBwcHBwwHBwgICAgHBwgHCAMDAwgICAgDCAgICAMDDg4PBw4HEQcDCwMLCEoLCAsLEw0RFQcDDgcLBwQIBwcLCAcLCw4IBwQIBwcHCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIBwsLBwcHBwMIS0tLBAcHCAgIBwgDBBMHCAgICAgHCAgICAMDCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgHBwcLCw8DBwMMCwsLBwMMDEtLSy0TBAQMCAcDAwMDAwgIAwgIAwMHCA4HEwMLLQMDBw4OCwsHCBEECBMkKwMOEQgLDggIBwcICAcICwMHAwgHBwcDCAgQBwgICAcICAgHEAsHCwMHAwcIFQgRCwQHCw4DBAgHCAQDEwgICAgLCwsHBwcHAwcDBwcMBzUHKxEMBwwIBysIAwcIEwMHBwsRBBELCA8RAwMHBwsPBwMICCQHBwskBwcHCAQEJAwMAwgHCAcHCAgICAgLDhMEAwsDAwsLBwMHBwMHBwcOBA4IDgcDBwMEEQsHBwgLCwMIBwcEAwcHAwcMBwcHBwMHCwcIBwgDBwMDDwsHAwMDAwMDAwMHCwgIDwcLCwcTDwcHBwcICAgIBwctBwgICAgHBwcHBwYLBxERDAdFDgsLAwMDAwgICAgICAgICAgICAgHAwcICAgICAgICAgICAgIAwMHDggIAw4OBwcLBA4LCwcOCxMLCwsLDgsEAwQDBwQHBAUHKwMPAwgDNA8DDAgMBwwMDAwICAgICAgICAgICAhBBwMIDAgHAwgHCAsPCAgIBxEIBwcDCAcDDgcHBwwECAgICAgICAgICAgEBwMHMzMHCAcICAgLDgcICAgICAgICAcEDgsICAgIDAsDDA4TCA4ICAMHAwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIBwgICAgICAgICAgICAgICAgICAgICAgICAgICAMEBwcICAQDCAgLCAgLAwMBBAgICAsDCwMDAwgDBwcOBwcHCwsICAsIBwcRCAwOCAMLCwcHCwgICAgICAMDCAgIAwsDAwsICAgICAgICAgICAgLCw4EDggICAgICAgIBwcHCAgICAgIBwcHBwcHCw8ICw8OCAgMCAcLCwsDDgcICAgICAgICAg+CAgICAgICAgHAz4LBwMEBA4LCwsIBBERBwcDAwMDAwQICAgICAgOAwgICAgICAgICAgICAMICAgICAgICAgICAgICAMICAMREQgOERELCwgDCwsLBwgIBwcEBwcHBwgICBEOBz4HBwcLCz4MDAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIBwcRBwgLCwsLCAsDEwMDCAgHEQMDBwMDAwcHBwMLCAgDAwMDBAgIAwMLAwgHDAgICEgABwcHBwsHBwcMAwsLBwMRAQcHCAcOBwwDAwMDBwcIAwsDAwcHBwwLDgcDBwMiCyIHAwMDAwMHCwsHCAsIAwQIBwcHBwcHBwMLCwMIEwMICAgIBAcLCAgICAcDBwMDBwMDBwMIBwMHAwMHBwsDCAcOCQkDBwcDAwMDBwMDCAgIAwMDAwMDAwMHAwMDAwcICAgDAwMDAwMDAwMHBwcHAwcDBwcDAwMDBwgLCwcHBwcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAMDAwMDAwMHBwMHBwMHBwMHAwMDAwMDBwMNAwcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQMDAwMIBwMRAwcDAwsHAwMDAwMDBxEREREHBwcDEQQRBw4HAwgDCAgICAgICwQOCAgNCBMICAgICAgICAQHCAgHBwgICAQIAwgHAwcHBxMDCAgDAwcLAwQIBwQLAwMDAwMDRgMDAz8rBw4ICwcLCAgICwcTCwgIQxMHBAICAgICDAwCAgICAgICAgICAgICAgICAgIMAgIHAgICAg4HBwcDCAMIDxUHBw43DAMDAgM7LQIICwcLBwsDAwQHBwgICBEICwsJAwgICAQEDwcDAwcHBwMICAgyMgsICAgICAQHEggPBwgHCAgHCAhCPQgICAgICAgICAgICAcHBwcHBwcHBwgHBwcHDwgOAxEICxEHEQgLCwgIBwcLAwkLBwgDAwMOBwsICAgICAgIDggIBwcECw07DgcICAQ7CAgICAcxAQcDAwAHAwgHBwMHBw4DAAAAAAsAAAgICAgICAgICAgICAgIBwcHCAwDDAAMDAgLSwcDBwMPBwgICAgECAgLBAwICAgJCxERCAgICAgIBAgICAgICAgHAwgICAgHBwcDDwcHBwMHCw4RAwsLDA4MAwMLBwcHBwQOBAMDAwsDCAcHBwcHBwcHBwcHBwcHCwcHAwsHATEHDAMDBwcHDhEDCAMPCAQECAMDAwMDAwcEBwcLBwsIDggICAMICAgIAwMHBAMICAclEQwMDAgIAwMICAMHCAgICAcIDgUDCAMOAwgIDwMDAwMHAwMDDAMDCAgICwQHAwsDAwgDAwcDAwQDBw4DBwgICAgIBAcIDQcHEQcFBwMDCwcHBwgIEwMHEQcHBwcDAwQEBwMHBwcHBwcHAwcHBwMHAwMHBwMDAwQLCBQPCAgDDw8DCA8PDw8HBw8HCwQHDxIREREnKikSCwMLAwsLDQQHDAgIBwcHBwcHBwcEBwcDBw4LAwsOAzIHBwgECzsOCAcBBw0NBAgHBwMDAwMIAwMDAwMLCwsPCwsLBwgOBQUMBwMDAwMDAwcIEQMDBwcDAwcEAwcLCwMDBAMICAMIAwg8CAgDCAMDDg4DBwcHBwcDAwMLBwcHBwMDBAMDAwMDAQEDCAgBAwQBAQEBAQcDAwMDAwMDAwQHBzsHAwMDAwMDAwMDOwMDAwMDAwMHAwMDAwcNAwMDCQgDAwgICAgICAcIAwMDAwsDCAMICAgNCAgBEQcHBwcHAz4DAwMDAwcHBwcHBwcHAwMDAwMHCwMDCAgICAgICAgLAwMDAwcICwcxCAcICAwICAgICAwICAgHDA8LDAgHAwgICAgICAgICAgDAwMDDAwMDAgDCAMDAwMLCAcICAwHDAcHAwcHAwMDAwMDAwMDAwMHCwcHBwcHAwgDAwgDAwEDAwMHAwMLCwgHBwcDBwsDAwQDEQQEBAgIDAMMAwsMDgMMAwwHOwMDAwMDAwMDAwMDAwMDAwcDBwMDAwcICwMHBwcLCAcHCAgICAgODg4ODg4OCAwICAgLBwMICwsDCAcICCsLCwcIBAgDAwMDAwMDAwMDAwMDAwMDAwMLAwcHBwcHBwcHBwcHBwcHCwcECAgHBwMHAwwEBwMIBwcHBwcICwcHBwwMCwgHAwwECwcHAwcDBwcDCAcHAwMHBwcHBwcHBwcHBwcHBw4OCAgICAgHDQMDBwMDBwMLCwsHCwMDBwQEBAcIAwMEBAgICwgLCAsMCAMODAgECAQICAgIAwgICAgEBAQEBAQICAgLBwgIBwQICAcICAgHBAgECAwMBwcHBwcHBwcHBwcHBwcHBwcHBwcHDAwMCAgICAgICAgICAgICAgICAgICAcHCAgICAgHBwcHBwcHBwcHB0E+A0EHBwcHBwcHBwcHBAgIAwMDAwMLBANMBxUIBAsEAgQEBAAHAwECAAMCAgICAgcIAgICAgcHBwIHBwcCAgIHBAcICAgDA0sEBAQEBAQEBAgEBAQEBAQDBAQEBAEDBAQESAQABAQEBAQEBAQEBAQEAAQEDAQEAQsHBwcHBwsEBwFwAbkMuQwFAwEAKAYJAX8BQYCAgAELB9QBCgZtZW1vcnkCAAl0cmFuc2Zvcm0ArRQNdHJhbnNmb3JtU3luYwDfFRNfX3diaW5kZ2VuX2V4cG9ydF8wAMAhE19fd2JpbmRnZW5fZXhwb3J0XzEBABNfX3diaW5kZ2VuX2V4cG9ydF8yAL8bE19fd2JpbmRnZW5fZXhwb3J0XzMArBwfX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcgCRIxNfX3diaW5kZ2VuX2V4cG9ydF80AK8fE19fd2JpbmRnZW5fZXhwb3J0XzUA+R4J+RgCAEEBC4YHkSC+BPUe0CK1HqkM/wmWIO0hsQi7I/kh9A/K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GyHlASAELwC9GyHmASAELwDNGyHnASAELwDdGyHoASAELwDtGyHpASAELwD9GyHqASAELwCNHCHrASAELwCdHCHsASAELwCtHCHtASAELwC9HCHuASAELwDNHCHvASAELwDdHCHwASAELwDtHCHxASAELwD9HCHyASAELwCNHSHzASAELwCdHSH0ASAELwCtHSH1ASAELwC9HSH2ASAELwDNHSH3ASAELwDdHSH4ASAELwDtHSH5ASAELwD9HSH6ASAELwCNHiH7ASAELwCdHiH8ASAELwCtHiH9ASAELwC9HiH+ASAELwDNHiH/ASAELwDdHiGAAiAELwDtHiGBAiAELwD9HiGCAiAELwCNHyGDAiAELwCdHyGEAiAELwCtHyGFAiAELwC9HyGGAiAELwDNHyGHAiAELwDdHyGIAiAELwDtHyGJAiAELwD9HyGKAiAEQYAYakHgAGoQ1wogBEHcGGpBggQ7AQAgBEIANwOIGCAEQgA3A4AYIARBgoSIEDYC2BggBEECNgLQGCAEQQI2AsgYIARBADYCwBggBEEDOgC8GAJAQdACRQ0AIARBkBVqIARBgBhqQdAC/AoAAAsgBEGcCmo1AgAhoQQgBEGACmpBL2otAAAhiwIgBEGACmpBP2otAAAhjAIgBEGACmpBzwBqLQAAIY0CIARBgApqQd8Aai0AACGOAiAEQYAKakHvAGotAAAhjwIgBEGACmpB/wBqLQAAIZACIARBgApqQY8Bai0AACGRAiAEQYAKakGfAWotAAAhkgIgBEGACmpBrwFqLQAAIZMCIARBgApqQb8Bai0AACGUAiAEQYAKakHPAWotAAAhlQIgBEGACmpB3wFqLQAAIZYCIARBgApqQe8Bai0AACGXAiAEQYAKakH/AWotAAAhmAIgBEGACmpBjwJqLQAAIZkCIARBgApqQZ8Cai0AACGaAiAEQYAKakGvAmotAAAhmwIgBEGACmpBvwJqLQAAIZwCIARBgApqQc8Cai0AACGdAiAEQYAKakHfAmotAAAhngIgBEGACmpB7wJqLQAAIZ8CIARBgApqQf8Cai0AACGgAiAEQYAKakGPA2otAAAhoQIgBEGACmpBnwNqLQAAIaICIARBgApqQa8Dai0AACGjAiAEQYAKakG/A2otAAAhpAIgBEGACmpBzwNqLQAAIaUCIARBgApqQd8D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BSAEQfAaahChICCWBCCWBCgCACIDQX9qNgIAIKgEIAKtQiCGhCCmBEI4hiCpBEIohoSEIaYEAkAgA0EBRw0AIJYEIJoEEOwQCyAYIZYEIB4hmgQMAwsgBSCYBEGQk4QBEMMSAAsgmAQgBCgCiApBoJOEARDYIAALIARBiBhqIARBnA9qKQIANwMAIARBkBhqIARBpA9qKQIANwMAIAQgBCkClA83A4AYIKYEQiCGIJsErYQgA61CKIaEIaYEIAQoApAPIQUgBEHwGmoQoSALIAVBCEYNBCAEQaQPaiAEQZAYaikDADcCACAEQZwPaiAEQYAYakEIaikDADcCACAEIAQpA4AYNwKUDyAEIAU2ApAPIAEtAEMhBSABKAIUIQIgASgCECEDIAEtAEEhGCABLQBAIR4gBEHwGmoQ1wogBEEBOwD7GiAEIBhBCiAeGzoA+RogBEEBOgD4GkECIZcEIARBAjoA/RogBEGAgIAFIAIgA0ECRiIYGzYC9BogBEEBIAMgGBs2AvAaIAQgBSAFQQJGckEBcToA+hogBCAEQZAPajYCgAogBEHgA2ogBEHwGmogBEGACmpBARBSIARB8BpqEKcJAkAgBCgC4ANBKkYNACAEQeADahD6FiCWBCCWBCgCACIFQX9qNgIAAkAgBUEBRw0AIJYEIJoEEOwQCyAEQZAPahChIAwFCyAEKALkAyGYBAJAAkAgAS0ARSIFQQJGDQAgBUEBcQ0AQQAhBUEAIbICQQAhmQRBACGcBAwBCyAEQfAaaiABIJgEENUGIAQvAP0aIAQtAP8aQRB0ciEFIAQtAPwaIbICIAQoAvgaIZkEIAQoAvQaIZwEIAQoAvAaIZcECwJAQYAFRQ0AIARBoARqIARBgBtqQYAF/AoAAAsgBEGQD2oQoSAgsQEhAyCwASECIK8BIRggrgEhHiCqASGuASCrASGvASCsASGwASCtASGxASCmASGqASCnASGrASCoASGsASCpASGtASCiASGmASCjASGnASCkASGoASClASGpASCeASGiASCfASGjASCgASGkASChASGlASCaASGeASCbASGfASCcASGgASCdASGhASCWASGaASCXASGbASCYASGcASCZASGdASCSASGWASCTASGXASCUASGYASCVASGZASCOASGSASCPASGTASCQASGUASCRASGVASCKASGO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NgL0CiAFIJgCNgLwCiAFICA6AOwKIAUgkwI2AugKIAUglAI2AuQKIAUglQI2AuAKIAUgJDoA3AogBSCQAjYC2AogBSCRAjYC1AogBSCSAjYC0AogBSAlOgDMCiAFII0CNgLICiAFII4CNgLECiAFII8CNgLACiAFIAw6ALwKIAUgCzYCuAogBSANNgK0CiAFIAg2ArAKIAUgRToArAogBSBGNgKoCiAFIEc2AqQKIAUgSDYCoAogBSBJOgCcCiAFIEo2ApgKIAUgSzYClAogBSBMNgKQCiAFIE06AIwKIAUgTjYCiAogBSBPNgKECiAFIFA2AoAKIAUgUToA/AkgBSBSNgL4CSAFIFM2AvQJIAUgVDYC8AkgBSBVOgDsCSAFIFY2AugJIAUgVzYC5AkgBSBYNgLgCSAFIFk6ANwJIAUgWjYC2AkgBSBbNgLUCSAFIFw2AtAJIAUgXToAzAkgBSBeNgLICSAFIF82AsQJIAUgYDYCwAkgBSBhOgC8CSAFIGI2ArgJIAUgYzYCtAkgBSBkNgKwCSAFIGU6AKwJIAUgZjYCqAkgBSBnNgKkCSAFIGg2AqAJIAUgaToAnAkgBSBqNgKYCSAFIGs2ApQJIAUgbDYCkAkgBSBtOgCMCSAFIG42AogJIAUgbzYChAkgBSBwNgKACSAFIHE6APwIIAUgcjYC+AggBSBzNgL0CCAFIHQ2AvAIIAUgdToA7AggBSB2NgLoCCAFIHc2AuQIIAUgeDYC4AggBSB5OgDcCCAFIHo2AtgIIAUgezYC1AggBSB8NgLQCCAFIH06AMwIIAUgfjYCyAggBSB/NgLECCAFIIABNgLACCAFIIEBOgC8CCAFIIIBNgK4CCAFIIMBNgK0CCAFIIQBNgKwCCAFIIUBOgCsCCAFIIYBNgKoCCAFIIcBNgKkCCAFIIgBNgKgCCAFIIkBOgCcCCAFIIoBNgKYCCAFIIsBNgKUCCAFIIwBNgKQCCAFII0BOgCMCCAFII4BNgKICCAFII8BNgKECCAFIJABNgKACCAFIJEBOgD8ByAFIJIBNgL4ByAFIJMBNgL0ByAFIJQBNgLwByAFIJUBOgDsByAFIJYBNgLoByAFIJcBNgLkByAFIJgBNgLgByAFIJkBOgDcByAFIJoBNgLYByAFIJsBNgLUByAFIJwBNgLQByAFIJ0BOgDMByAFIJ4BNgLI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QgODQgBSDQAgCaciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDpHQtBAC0A4PadARpByAAQhAEiA0UNASADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EVakIANwAAIANBwABqQQA6AABBAC0A4PadARpBGBCEASIFRQ0BIAVCADcDCCAFIAg3AwAgBUEQakIANwMAAkAgACgCCCIGIAAoAgBHDQAgABC4GQsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQRpqQgA3AQAgACAGQQFqNgIICwJAIAEtAA1FDQBBACABKAIAEI0GIQRBh66aAUEQEPkXIQcgAkGXrpoBQR8Q+Rc3A8gGIAJBmAZqIAJByAZqEJQTIAIoApgGIAIoApwGEPoXIQgCQCACKQPIBiIJQgODQgBSDQAgCaciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDpHQtBAC0A4PadARpByAAQhAEiA0UNASADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EVakIANwAAIANBwABqQQA6AABBAC0A4PadARpBGBCEASIFRQ0BIAVCADcDCCAFIAg3AwAgBUEQakIANwMAAkAgACgCCCIGIAAoAgBHDQAgABC4GQsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQRpqQgA3AQAgACAGQQFqNgIICwJAIAEtAA5FDQBBACABKAIAEI0GIQRBtq6aAUEZEPkXIQcgAkHPrpoBQSgQ+Rc3A8gGIAJBkAZqIAJByAZqEJQTIAIoApAGIAIoApQGEPoXIQgCQCACKQPIBiIJQgODQgBSDQAgCaciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDpHQtBAC0A4PadARpByAAQhAEiA0UNASADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EVakIANwAAIANBwABqQQA6AABBAC0A4PadARpBGBCE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AygCEBDpHQtBAC0A4PadARpByAAQhAEiA0UNASADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EVakIANwAAIANBwABqQQA6AABBAC0A4PadARpBGBCEASIFRQ0BIAVCADcDCCAFIAg3AwAgBUEQakIANwMAAkAgACgCCCIGIAAoAgBHDQAgABC4GQsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQRpqQgA3AQAgACAGQQFqNgIICwJAIAEtABlFDQBBACABKAIAEI0GIQRB0bOaAUEREPkXIQcgAkHis5oBQSAQ+Rc3A8gGIAJBuAVqIAJByAZqEJQTIAIoArgFIAIoArwFEPoXIQgCQCACKQPIBiIJQgODQgBSDQAgCaciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDpHQtBAC0A4PadARpByAAQhAEiA0UNASADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EVakIANwAAIANBwABqQQA6AABBAC0A4PadARpBGBCEASIFRQ0BIAVCADcDCCAFIAg3AwAgBUEQakIANwMAAkAgACgCCCIGIAAoAgBHDQAgABC4GQsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQRpqQgA3AQAgACAGQQFqNgIICwJAIAEtABpFDQBBACABKAIAEI0GIQRBgrSaAUEsEPkXIQcgAkGutJoBQTsQ+Rc3A8gGIAJBsAVqIAJByAZqEJQTIAIoArAFIAIoArQFEPoXIQgCQCACKQPIBiIJQgODQgBSDQAgCaciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDpHQtBAC0A4PadARpByAAQhAEiA0UNASADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EVakIANwAAIANBwABqQQA6AABBAC0A4PadARpBGBCEASIFRQ0BIAVCADcDCCAFIAg3AwAgBUEQakIANwMAAkAgACgCCCIGIAAoAgBHDQAgABC4GQsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQRpqQgA3AQAgACAGQQFqNgIICwJAIAEtABtFDQBBACABKAIAEI0GIQRB6bSaAUEfEPkXIQcgAkGItZoBQS4Q+Rc3A8gGIAJBqAVqIAJByAZqEJQTIAIoAqgFIAIoAqwFEPoXIQgCQCACKQPIBiIJQgODQgBSDQAgCaciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDpHQtBAC0A4PadARpByAAQhAEiA0UNASADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EVakIANwAAIANBwABqQQA6AABBAC0A4PadARpBGBCEASIFRQ0BIAVCADcDCCAFIAg3AwAgBUEQakIANwMAAkAgACgCCCIGIAAoAgBHDQAgABC4GQsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQRpqQgA3AQAgACAGQQFqNgIICwJAIAEtABxFDQBBACABKAIAEI0GIQRBtrWaAUEVEPkXIQcgAkHLtZoBQSQQ+Rc3A8gGIAJBoAVqIAJByAZqEJQTIAIoAqAFIAIoAqQFEPoXIQgCQCACKQPIBiIJQgODQgBSDQAgCaciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDpHQtBAC0A4PadARpByAAQhAEiA0UNASADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EVakIANwAAIANBwABqQQA6AABBAC0A4PadARpBGBCEASIFRQ0BIAVCADcDCCAFIAg3AwAgBUEQakIANwMAAkAgACgCCCIGIAAoAgBHDQAgABC4GQsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQRpqQgA3AQAgACAGQQFqNgIICwJAIAEtAB1FDQBBACABKAIAEI0GIQRB77WaAUEYEPkXIQcgAkGHtpoBQScQ+Rc3A8gGIAJBmAVqIAJByAZqEJQTIAIoApgFIAIoApwFEPoXIQgCQCACKQPIBiIJQgODQgBSDQAgCaciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDpHQtBAC0A4PadARpByAAQhAEiA0UNASADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EVakIANwAAIANBwABqQQA6AABBAC0A4PadARpBGBCEASIFRQ0BIAVCADcDCCAFIAg3AwAgBUEQakIANwMAAkAgACgCCCIGIAAoAgBHDQAgABC4GQsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQRpqQgA3AQAgACAGQQFqNgIICwJAIAEtAB5FDQBBACABKAIAEI0GIQRBrraaAUEZEPkXIQcgAkHHtpoBQSgQ+Rc3A8gGIAJBkAVqIAJByAZqEJQTIAIoApAFIAIoApQFEPoXIQgCQCACKQPIBiIJQgODQgBSDQAgCaciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDpHQtBAC0A4PadARpByAAQhAEiA0UNASADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EVakIANwAAIANBwABqQQA6AABBAC0A4PadARpBGBCEASIFRQ0BIAVCADcDCCAFIAg3AwAgBUEQakIANwMAAkAgACgCCCIGIAAoAgBHDQAgABC4GQsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQRpqQgA3AQAgACAGQQFqNgIICwJAIAEtAB9FDQBBACABKAIAEI0GIQRB77aaAUEfEPkXIQcgAkGOt5oBQS4Q+Rc3A8gGIAJBiAVqIAJByAZqEJQTIAIoAogFIAIoAowFEPoXIQgCQCACKQPIBiIJQgODQgBSDQAgCaciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDpHQtBAC0A4PadARpByAAQhAEiA0UNASADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EVakIANwAA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AyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDpHQtBAC0A4PadARpByAAQhAEiA0UNASADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EVakIANwAAIANBwABqQQA6AABBAC0A4PadARpBGBCEASIFRQ0BIAVCADcDCCAFIAg3AwAgBUEQakIANwMAAkAgACgCCCIGIAAoAgBHDQAgABC4GQsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQRpqQgA3AQAgACAGQQFqNgIICwJAIAEtACpFDQBBACABKAIAEI0GIQRB9LyaAUENEPkXIQcgAkGBvZoBQRwQ+Rc3A8gGIAJBsARqIAJByAZqEJQTIAIoArAEIAIoArQEEPoXIQgCQCACKQPIBiIJQgODQgBSDQAgCaciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDpHQtBAC0A4PadARpByAAQhAEiA0UNASADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EVakIANwAAIANBwABqQQA6AABBAC0A4PadARpBGBCEASIFRQ0BIAVCADcDCCAFIAg3AwAgBUEQakIANwMAAkAgACgCCCIGIAAoAgBHDQAgABC4GQsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQRpqQgA3AQAgACAGQQFqNgIICwJAIAEtACtFDQBBACABKAIAEI0GIQRBnb2aAUEJEPkXIQcgAkGmvZoBQRgQ+Rc3A8gGIAJBqARqIAJByAZqEJQTIAIoAqgEIAIoAqwEEPoXIQgCQCACKQPIBiIJQgODQgBSDQAgCaciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDpHQtBAC0A4PadARpByAAQhAEiA0UNASADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EVakIANwAAIANBwABqQQA6AABBAC0A4PadARpBGBCEASIFRQ0BIAVCADcD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4PadARpByAAQhAEiA0UNASADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EVakIANwAAIANBwABqQQA6AABBAC0A4PadARpBGBCEASIFRQ0BIAVCADcDCCAFIAg3AwAgBUEQakIANwMAAkAgACgCCCIGIAAoAgBHDQAgABC4GQsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQRpqQgA3AQAgACAGQQFqNgIICwJAIAEtADZFDQBBACABKAIAEI0GIQRB+sCaAUEbEPkXIQcgAkGVwZoBQSoQ+Rc3A8gGIAJB0ANqIAJByAZqEJQTIAIoAtADIAIoAtQDEPoXIQgCQCACKQPIBiIJQgODQgBSDQAgCaciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDpHQtBAC0A4PadARpByAAQhAEiA0UNASADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EVakIANwAAIANBwABqQQA6AABBAC0A4PadARpBGBCEASIFRQ0BIAVCADcDCCAFIAg3AwAgBUEQakIANwMAAkAgACgCCCIGIAAoAgBHDQAgABC4GQsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQRpqQgA3AQAgACAGQQFqNgIICwJAIAEtADdFDQBBACABKAIAEI0GIQRBv8GaAUELEPkXIQcgAkHKwZoBQRoQ+Rc3A8gGIAJByANqIAJByAZqEJQTIAIoAsgDIAIoAswDEPoXIQgCQCACKQPIBiIJQgODQgBSDQAgCaciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDpHQtBAC0A4PadARpByAAQhAEiA0UNASADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EVakIANwAAIANBwABqQQA6AABBAC0A4PadARpBGBCEASIFRQ0BIAVCADcDCCAFIAg3AwAgBUEQakIANwMAAkAgACgCCCIGIAAoAgBHDQAgABC4GQsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQRpqQgA3AQAgACAGQQFqNgIICwJAIAEtADhFDQBBACABKAIAEI0GIQRB5MGaAUEYEPkXIQcgAkH8wZoBQScQ+Rc3A8gGIAJBwANqIAJByAZqEJQTIAIoAsADIAIoAsQDEPoXIQgCQCACKQPIBiIJQgODQgBSDQAgCaciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDpHQtBAC0A4PadARpByAAQhAEiA0UNASADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EVakIANwAAIANBwABqQQA6AABBAC0A4PadARpBGBCEASIFRQ0BIAVCADcDCCAFIAg3AwAgBUEQakIANwMAAkAgACgCCCIGIAAoAgBHDQAgABC4GQsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQRpqQgA3AQAgACAGQQFqNgIICwJAIAEtADlFDQBBACABKAIAEI0GIQRBo8KaAUEZEPkXIQcgAkG8wpoBQSgQ+Rc3A8gGIAJBuANqIAJByAZqEJQTIAIoArgDIAIoArwDEPoXIQgCQCACKQPIBiIJQgODQgBSDQAgCaciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDpHQtBAC0A4PadARpByAAQhAEiA0UNASADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EVakIANwAAIANBwABqQQA6AABBAC0A4PadARpBGBCEASIFRQ0BIAVCADcDCCAFIAg3AwAgBUEQakIANwMAAkAgACgCCCIGIAAoAgBHDQAgABC4GQsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQRpqQgA3AQAgACAGQQFqNgIICwJAIAEtADpFDQBBACABKAIAEI0GIQRB5MKaAUETEPkXIQcgAkH3wpoBQSIQ+Rc3A8gGIAJBsANqIAJByAZqEJQTIAIoArADIAIoArQDEPoXIQgCQCACKQPIBiIJQgODQgBSDQAgCaciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDpHQtBAC0A4PadARpByAAQhAEiA0UNASADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EVakIANwAAIANBwABqQQA6AABBAC0A4PadARpBGBCEASIFRQ0BIAVCADcDCCAFIAg3AwAgBUEQakIANwMAAkAgACgCCCIGIAAoAgBHDQAgABC4GQsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQRpqQgA3AQAgACAGQQFqNgIICwJAIAEtADtFDQBBACABKAIAEI0GIQRBmcOaAUESEPkXIQcgAkGrw5oBQSEQ+Rc3A8gGIAJBqANqIAJByAZqEJQTIAIoAqgDIAIoAqwDEPoXIQgCQCACKQPIBiIJQgODQgBSDQAgCaciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDpHQtBAC0A4PadARpByAAQhAEiA0UNASADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EVakIANwAAIANBwABqQQA6AABBAC0A4PadARpBGBCEASIFRQ0BIAVCADcDCCAFIAg3AwAgBUEQakIANwMAAkAgACgCCCIGIAAoAgBHDQAgABC4GQsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQRpqQgA3AQAgACAGQQFqNgIICwJAIAEtADxFDQBBACABKAIAEI0GIQRBzMOaAUEYEPkXIQcgAkHkw5oBQScQ+Rc3A8gGIAJBoANqIAJByAZqEJQTIAIoAqADIAIoAqQDEPoXIQgCQCACKQPIBiIJQgODQgBSDQAgCaciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDpHQtBAC0A4PadARpByAAQhAEiA0UNASADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EVakIANwAAIANBwABqQQA6AABB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AEcNACAAELcZCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQALRQ0AIAMgAUGU2poBQRMgAigCABDpBQJAIAAoAggiBSAAKAIARw0AIAAQtxkLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAAxFDQAgAyABQafamgFBFyACKAIAEOkFAkAgACgCCCIFIAAoAgBHDQAgABC3GQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0ADUUNACADIAFBvtqaAUEPIAIoAgAQ6QUCQCAAKAIIIgUgACgCAEcNACAAELcZCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAORQ0AIAMgAUHN2poBQRggAigCABDpBQJAIAAoAggiBSAAKAIARw0AIAAQtxkLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAA9FDQAgAyABQeXamgFBDiACKAIAEOkFAkAgACgCCCIFIAAoAgBHDQAgABC3GQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AEEUNACADIAFB89qaAUESIAIoAgAQ6QUCQCAAKAIIIgUgACgCAEcNACAAELcZCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQARRQ0AIAMgAUGF25oBQRUgAigCABDpBQJAIAAoAggiBSAAKAIARw0AIAAQtxkLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItABJFDQAgAyABQZrbmgFBCyACKAIAEOkFAkAgACgCCCIFIAAoAgBHDQAgABC3GQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AE0UNACADIAFBpduaAUEKIAIoAgAQ6QUCQCAAKAIIIgUgACgCAEcNACAAELcZCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAURQ0AIAMgAUGv25oBQRsgAigCABDpBQJAIAAoAggiBSAAKAIARw0AIAAQtxkLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItABVFDQAgAyABQcrbmgFBIiACKAIAEOkFAkAgACgCCCIFIAAoAgBHDQAgABC3GQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AFkUNACADIAFB7NuaAUEaIAIoAgAQ6QUCQCAAKAIIIgUgACgCAEcNACAAELcZCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAXRQ0AIAMgAUGG3JoBQRogAigCABDpBQJAIAAoAggiBSAAKAIARw0AIAAQtxkLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItABhFDQAgAyABQaDcmgFBHSACKAIAEOkFAkAgACgCCCIFIAAoAgBHDQAgABC3GQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AGUUNACADIAFBvdyaAUEQIAIoAgAQ6QUCQCAAKAIIIgUgACgCAEcNACAAELcZCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAaRQ0AIAMgAUHN3JoBQSsgAigCABDpBQJAIAAoAggiBSAAKAIARw0AIAAQtxkLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItABtFDQAgAyABQfjcmgFBHiACKAIAEOkFAkAgACgCCCIFIAAoAgBHDQAgABC3GQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AHEUNACADIAFBlt2aAUEUIAIoAgAQ6QUCQCAAKAIIIgUgACgCAEcNACAAELcZCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAdRQ0AIAMgAUGq3ZoBQRcgAigCABDpBQJAIAAoAggiBSAAKAIARw0AIAAQtxkLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAB5FDQAgAyABQcHdmgFBGCACKAIAEOkFAkAgACgCCCIFIAAoAgBHDQAgABC3GQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AH0UNACADIAFB2d2aAUEeIAIoAgAQ6QUCQCAAKAIIIgUgACgCAEcNACAAELcZCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAgRQ0AIAMgAUH33ZoBQR0gAigCABDpBQJAIAAoAggiBSAAKAIARw0AIAAQtxkLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItACFFDQAgAyABQZTemgFBFyACKAIAEOkFAkAgACgCCCIFIAAoAgBHDQAgABC3GQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AIkUNACADIAFBq96aAUEaIAIoAgAQ6QUCQCAAKAIIIgUgACgCAEcNACAAELcZCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAjRQ0AIAMgAUHF3poBQRggAigCABDpBQJAIAAoAggiBSAAKAIARw0AIAAQtxkLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItACRFDQAgAyABQd3emgFBGSACKAIAEOkFAkAgACgCCCIFIAAoAgBHDQAgABC3GQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AJUUNACADIAFB9t6aAUEYIAIoAgAQ6QUCQCAAKAIIIgUgACgCAEcNACAAELcZCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAmRQ0AIAMgAUGO35oBQSMgAigCABDpBQJAIAAoAggiBSAAKAIARw0AIAAQtxkLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItACdFDQAgAyABQbHfmgFBIyACKAIAEOkFAkAgACgCCCIFIAAoAgBHDQAgABC3GQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AKEUNACADIAFB1N+aAUEhIAIoAgAQ6QUCQCAAKAIIIgUgACgCAEcNACAAELcZCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQApRQ0AIAMgAUH135oBQQkgAigCABDpBQJAIAAoAggiBSAAKAIARw0AIAAQtxkLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItACpFDQAgAyABQf7fmgFBDCACKAIAEOkFAkAgACgCCCIFIAAoAgBHDQAgABC3GQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AK0UNACADIAFBiuCaAUEIIAIoAgAQ6QUCQCAAKAIIIgUgACgCAEcNACAAELcZCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAsRQ0AIAMgAUGS4JoBQQggAigCABDpBQJAIAAoAggiBSAAKAIARw0AIAAQtxkLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAC1FDQAgAyABQZrgmgFBHCACKAIAEOkFAkAgACgCCCIFIAAoAgBHDQAgABC3GQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0ALkUNACADIAFBtuCaAUEPIAIoAgAQ6QUCQCAAKAIIIgUgACgCAEcNACAAELcZCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAvRQ0AIAMgAUHF4JoBQQsgAigCABDpBQJAIAAoAggiBSAAKAIARw0AIAAQtxkLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItADBFDQAgAyABQdfLmwFBByACKAIAEOkFAkAgACgCCCIFIAAoAgBHDQAgABC3GQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AMUUNACADIAFB8LObAUEDIAIoAgAQ6QUCQCAAKAIIIgUgACgCAEcNACAAELcZCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAyRQ0AIAMgAUHQ4JoBQRAgAigCABDpBQJAIAAoAggiBSAAKAIARw0AIAAQtxkLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItADNFDQAgAyABQeDgmgFBCCACKAIAEOkFAkAgACgCCCIFIAAoAgBHDQAgABC3GQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0ANEUNACADIAFB6OCaAUEOIAIoAgAQ6QUCQCAAKAIIIgUgACgCAEcNACAAELcZCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQA1RQ0AIAMgAUH24JoBQRsgAigCABDpBQJAIAAoAggiBSAAKAIARw0AIAAQtxkLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItADZFDQAgAyABQZHhmgFBGiACKAIAEOkFAkAgACgCCCIFIAAoAgBHDQAgABC3GQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AN0UNACADIAFBlpybAUEKIAIoAgAQ6QUCQCAAKAIIIgUgACgCAEcNACAAELcZCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQA4RQ0AIAMgAUGr4ZoBQRcgAigCABDpBQJAIAAoAggiBSAAKAIARw0AIAAQtxkLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItADlFDQAgAyABQcLhmgFBGCACKAIAEOkFAkAgACgCCCIFIAAoAgBHDQAgABC3GQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AOkUNACADIAFB2uGaAUESIAIoAgAQ6QUCQCAAKAIIIgUgACgCAEcNACAAELcZCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQA7RQ0AIAMgAUHs4ZoBQREgAigCABDpBQJAIAAoAggiBSAAKAIARw0AIAAQtxkLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItADxFDQAgAyABQf3hmgFBFyACKAIAEOkFAkAgACgCCCIFIAAoAgBHDQAgABC3GQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0APUUNACADIAFBlOKaAUEdIAIoAgAQ6QUCQCAAKAIIIgUgACgCAEcNACAAELcZCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQA+RQ0AIAMgAUGx4poBQQMgAigCABDpBQJAIAAoAggiBSAAKAIARw0AIAAQtxkLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAD9FDQAgAyABQbTimgFBDyACKAIAEOkFAkAgACgCCCIFIAAoAgBHDQAgABC3GQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AQEUNACADIAFBw+KaAUERIAIoAgAQ6QUCQCAAKAIIIgUgACgCAEcNACAAELcZCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBBRQ0AIAMgAUHU4poBQRMgAigCABDpBQJAIAAoAggiBSAAKAIARw0AIAAQtxkLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAEJFDQAgAyABQefimgFBGiACKAIAEOkFAkAgACgCCCIFIAAoAgBHDQAgABC3GQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AQ0UNACADIAFBgeOaAUENIAIoAgAQ6QUCQCAAKAIIIgUgACgCAEcNACAAELcZCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBERQ0AIAMgAUGO45oBQRMgAigCABDpBQJAIAAoAggiBSAAKAIARw0AIAAQtxkLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAEVFDQAgAyABQaHjmgFBGSACKAIAEOkFAkAgACgCCCIFIAAoAgBHDQAgABC3GQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0ARkUNACADIAFBuuOaAUEfIAIoAgAQ6QUCQCAAKAIIIgUgACgCAEcNACAAELcZCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBHRQ0AIAMgAUHZ45oBQQ4gAigCABDpBQJAIAAoAggiBSAAKAIARw0AIAAQtxkLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAEhFDQAgAyABQefjmgFBGyACKAIAEOkFAkAgACgCCCIFIAAoAgBHDQAgABC3GQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0ASUUNACADIAFBguSaAUEPIAIoAgAQ6QUCQCAAKAIIIgUgACgCAEcNACAAELcZCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBKRQ0AIAMgAUHzs5sBQQMgAigCABDpBQJAIAAoAggiBSAAKAIARw0AIAAQtxkLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAEtFDQAgAyABQZHkmgFBECACKAIAEOkFAkAgACgCCCIFIAAoAgBHDQAgABC3GQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0ATEUNACADIAFBoeSaAUEZIAIoAgAQ6QUCQCAAKAIIIgUgACgCAEcNACAAELcZCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBNRQ0AIAMgAUG65JoBQQ8gAigCABDpBQJAIAAoAggiBSAAKAIARw0AIAAQtxkLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAE5FDQAgAyABQcnkmgFBFSACKAIAEOkFAkAgACgCCCIFIAAoAgBHDQAgABC3GQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AT0UNACADIAFB3uSaAUEPIAIoAgAQ6QUCQCAAKAIIIgUgACgCAEcNACAAELcZCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBQRQ0AIAMgAUHt5JoBQRcgAigCABDpBQJAIAAoAggiBSAAKAIARw0AIAAQtxkLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAFFFDQAgAyABQYTlmgFBHSACKAIAEOkFAkAgACgCCCIFIAAoAgBHDQAgABC3GQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AUkUNACADIAFB8NGbAUEFIAIoAgAQ6QUCQCAAKAIIIgUgACgCAEcNACAAELcZCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBTRQ0AIAMgAUGh5ZoBQQggAigCABDpBQJAIAAoAggiBSAAKAIARw0AIAAQtxkLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAFRFDQAgAyABQanlmgFBEyACKAIAEOkFAkAgACgCCCIFIAAoAgBHDQAgABC3GQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AVUUNACADIAFBvOWaAUEMIAIoAgAQ6QUCQCAAKAIIIgUgACgCAEcNACAAELcZCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBWRQ0AIAMgAUHI5ZoBQQ8gAigCABDpBQJAIAAoAggiBSAAKAIARw0AIAAQtxkLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAFdFDQAgAyABQdeEmgFBBiACKAIAEOkFAkAgACgCCCIFIAAoAgBHDQAgABC3GQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AWEUNACADIAFB1+WaAUEHIAIoAgAQ6QUCQCAAKAIIIgUgACgCAEcNACAAELcZCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBZRQ0AIAMgAUHe5ZoBQR0gAigCABDpBQJAIAAoAggiBSAAKAIARw0AIAAQtxkLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAFpFDQAgAyABQfvlmgFBFCACKAIAEOkFAkAgACgCCCIFIAAoAgBHDQAgABC3GQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AW0UNACADIAFBj+aaAUERIAIoAgAQ6QUCQCAAKAIIIgUgACgCAEcNACAAELcZCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBcRQ0AIAMgAUGg5poBQRAgAigCABDpBQJAIAAoAggiBSAAKAIARw0AIAAQtxkLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAF1FDQAgAyABQbDmmgFBHyACKAIAEOkFAkAgACgCCCIFIAAoAgBHDQAgABC3GQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AXkUNACADIAFBz+aaAUEmIAIoAgAQ6QUCQCAAKAIIIgUgACgCAEcNACAAELcZCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBfRQ0AIAMgAUH15poBQR8gAigCABDpBQJAIAAoAggiBSAAKAIARw0AIAAQtxkLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAGBFDQAgAyABQZTnmgFBISACKAIAEOkFAkAgACgCCCIFIAAoAgBHDQAgABC3GQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AYUUNACADIAFBteeaAUEbIAIoAgAQ6QUCQCAAKAIIIgUgACgCAEcNACAAELcZCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBiRQ0AIAMgAUHQ55oBQQwgAigCABDpBQJAIAAoAggiBSAAKAIARw0AIAAQtxkLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAGNFDQAgAyABQdznmgFBIyACKAIAEOkFAkAgACgCCCIFIAAoAgBHDQAgABC3GQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AZEUNACADIAFB/+eaAUELIAIoAgAQ6QUCQCAAKAIIIgUgACgCAEcNACAAELcZCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBlRQ0AIAMgAUGK6JoBQQwgAigCABDpBQJAIAAoAggiBSAAKAIARw0AIAAQtxkLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAGZFDQAgAyABQZbomgFBCyACKAIAEOkFAkAgACgCCCIFIAAoAgBHDQAgABC3GQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AZ0UNACADIAFBoeiaAUEIIAIoAgAQ6QUCQCAAKAIIIgUgACgCAEcNACAAELcZCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBoRQ0AIAMgAUGp6JoBQQkgAigCABDpBQJAIAAoAggiBSAAKAIARw0AIAAQtxkLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAGlFDQAgAyABQbLomgFBGiACKAIAEOkFAkAgACgCCCIFIAAoAgBHDQAgABC3GQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AakUNACADIAFBzOiaAUEUIAIoAgAQ6QUCQCAAKAIIIgUgACgCAEcNACAAELcZCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBrRQ0AIAMgAUHg6JoBQSQgAigCABDpBQJAIAAoAggiBSAAKAIARw0AIAAQtxkLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAGxFDQAgAyABQYTpmgFBESACKAIAEOkFAkAgACgCCCIFIAAoAgBHDQAgABC3GQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AbUUNACADIAFBlemaAUEIIAIoAgAQ6QUCQCAAKAIIIgUgACgCAEcNACAAELcZCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBuRQ0AIAMgAUGd6ZoBQQcgAigCABDpBQJAIAAoAggiBSAAKAIARw0AIAAQtxkLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAG9FDQAgAyABQcXDmwFBBSACKAIAEOkFAkAgACgCCCIFIAAoAgBHDQAgABC3GQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AcEUNACADIAFBpOmaAUEJIAIoAgAQ6QUCQCAAKAIIIgQgACgCAEcNACAAELcZCyAAKAIEIARBMGxqIgEgAykDADcDACABQShqIANBKGopAwA3AwAgAUEgaiADQSBqKQMANwMAIAFBGGogA0EYaikDADcDACABQRBqIANBEGopAwA3AwAgAUEIaiADQQhqKQMANwMAIAAgBEEBajYCCAsgAiACKAIEQX9qNgIEIANBMGokAAu+iwECJX8DfiMAQdAHayIDJAACQAJAAkAgASgCeCIEQYCAgIAGcQ0AIAEoAsQBIQQgASgCwAEhBSADQcaAgIB4NgKwBiAFIAQgA0GwBmoQhBchBCABLQDIAUGiAUcNASABENcSIQUgARDjDiABIAUQ+hIMAQsCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAS0AyAEiBUHfAEYNACAFQdgARw0DIANB+ABqQQhqIAJBCGooAgA2AgAgAyACKQIANwN4IARBgoCAgAJxQYCAgIACRg0BDBALIAEo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AkACQAJAAkACQCAop0EBcUUNACAJIAMpA+ADNwIAIAlBCGoiDiAjKQMANwIAIAlBEGoiJSAhKAIANgIAIAMgBjYCkAQgAS0AyAFB9QBHDQEgARDjDiADQbADaiABQQAQwgUgAygCsAMhDCADLQDEAyIGQQJGDQIgEiATKQIANwIAIBAgESkAADcAACASQQhqIBNBCGopAgA3AgAgEEEHaiARQQdqKAAANgAAIAMgBjoAtAcgAyAMNgKgByADQZgGaiADQaAHahD4FSADQcgCakEIaiAOKQIANwMAIANByAJqQRBqICUoAgA2AgAgCCADKQOYBjcCACAIQQhqIANBmAZqQQhqKQMANwIAIAhBEGogA0GYBmpBEGopAwA3AgAgAyAJKQIANwPIAiADKAKQBCEMIAMoAqQGISVCASEoQQAhDiAgISYMDQsgDSADKQPgAzcCACANQQhqIicgIykDADcCACANQRBqIiMgISgCADYCACADIAY2AvgDQQAhISABLQCBAUEgcUUNBiADQfgDakG4pZsBQQQQpBxFDQYgAS0AyAEiBkG1f2oiIUEfSw0CQQEgIXRBgYCCkHhxRQ0CDAMLIAMoApwEIQQgAygCmAQhBSADQSBqIANBkARqEJMTIANBgAVqIAMoAiAgAygCJBC4CCADIANBgAVqENAdNwO4AyADQfCAgIB4NgKwAyAFIAQgA0GwA2oQhBchDCABLQDIAUGiAUcNACABENcSIQQgARDjDiABIAQQ+hILIAMpA5AEIAMpA6AEEIwkDBMLAkAgBkHAAEYNAEEAISEgBkG0f2pB/wFxQdQASw0FDAELIANBsANqIAEQowkgAygCuAMhDCADKQOwAyIoQgJRDQUgHyAHKQIANwIAIB9BEGoiISAiKAIANgIAIB9BCGoiIyAkKQIANwIAIAMgDDYCmAQgAyAoNwOQBAJAAkACQCABLQDIASIGQfUARw0AIAEQ4w4gA0GwA2ogAUEAEMIFIAMoArADIQYgAy0AxAMiIkECRw0CIAYhDAwBCyABKALEASEMIAEoAsABISEgA0G0BGogBhCGHiADQQE2ArQDIANBlPObATYCsAMgA0IBNwK8AyADICo3A8AEIAMgA0HABGo2ArgDIANBgAVqIANBsANqEI0XIB5BCGogA0G0BGpBCGooAgA2AgAgHiADKQK0BDcCACAhIAwgA0GABWoQhBchDCABLQDIAUGiAUcNACABENcSIQYgARDjDiABIAYQ+hILIANBkARqEOoeDAYLIB0gEykCADcCACAcIBEpAAA3AAAgHUEIaiATQQhqKQIANwIAIBxBB2ogEUEHaigAADYAACADICI6APQEIAMgBjYC4AQgA0HIBGogA0HgBGoQ+BUgCkUNASADKAKEBCEGIAMoAoAEIQ4gA0GngYCAeDYCsAMgASAOIAYgA0GwA2oQ3hwMAQsgA0GYBWogARCIDAJAIAMpA5gFIihCAFINACADKAKgBSEMDAULIANBADYCkAUgAyADKQOgBTcDiAUgA0EAOgCUBSADICg+AoAFIAMgKEIgiD4ChAUCQAJAAkACQAJAAkAgA0GABWpB3LGbAUECEKQcDQAgCg0BDAULAkACQCABLQDIASIhQbV/aiIGQR9LDQBBASAGdEGBgIKQeHENAQsgIUG0f2pB/wFxQdUASQ0AIApFDQQgAygChAQhBiADKAKABCEOIANBp4GAgHg2ArADIAEgDiAGIANBsANqEN4cDAQLIANBsANqIAFBABDCBSADKAKwAyEMAkACQAJAIAMtAMQDIgZBAkYNACAZIBMpAgA3AgAgGCARKQAANwAAIBlBCGogE0EIaiIhKQIANwIAIBhBB2ogEUEHaiIiKAAANgAAIAMgBjoAvAUgAyAMNgKoBSADQZAEaiADQagFahD4FSADQZAEakHcsZsBQQIQpBxFDQICQAJAIAEtAMgBIgxBtX9qIgZBH0sNAEEBIAZ0QYGAgpB4cQ0BCyAMQbR/akH/AXFB1ABLDQMLIANBsANqIAFBABDCBSADKAKwAyEMIAMtAMQDIgZBAkcNASADKQOQBBDzHwsgAykDgAUQ8x8MCwsgFyATKQIANwIAIBYgESkAADcAACAXQQhqICEpAgA3AgAgFkEHaiAiKAAANgAAIAMgBjoA9AUgAyAMNgLgBSADQcgFaiADQeAFahD4FSAKDQIMAwsgCCADKQOQBDcCACAIQQhqIANBkARqQQhqKQMANwIAIAhBEGogA0GQBGpBEGopAwA3AgAgA0HIAmpBCGogJykCADcDACADQcgCakEQaiAjKAIANgIAIAMgDSkCADcDyAIgAygCnAQhJSADKAL4AyEMIAMpA4AFEPMfQQAhDgwLCyADKAKEBCEGIAMoAoAEISEgA0GngYCAeDYCsAMgASAhIAYgA0GwA2oQ3hwMAwsgAygChAQhBiADKAKABCEMIANBp4GAgHg2ArADIAEgDCAGIANBsANqEN4cCyAIIAMpA8gFNwIAIANByAJqQQhqIBpBCGopAgA3AwAgA0HIAmpBEGogGkEQaigCADYCACAIQQhqIANByAVqQQhqKQMANwIAIAhBEGogA0HIBWpBEGopAwA3AgAgAyAaKQIANwPIAiADKAKABSEMIAMoAtQFISUgAykDkAQQ8x9CACEoDAMLIAggAykDgAU3AgAgCEEIaiADQYAFakEIaikDADcCACAIQRBqIANBgAVqQRBqKQMANwIAIAEoArwBISVCAiEoDAILIANBsANqQRBqIgYgA0GABWpBEGopAwA3AwAgA0GwA2pBCGoiISADQYAFakEIaikDADcDACADIAMpA4AFNwOwAyADKQP4AxDzHyADQfgDakEQaiAGKQMANwMAIANB+ANqQQhqICEpAwA3AwAgAyADKQOwAzcD+ANBASEhDAILIBsgAykDyAQ3AgAgA0GwBmpBCGogIykCADcDACADQbAGakEQaiAhKAIANgIAIBtBCGogA0HIBGpBCGopAwA3AgAgG0EQaiADQcgEakEQaikDADcCACADIB8pAgA3A7AGIAMoAtQEISVBLEUNACADQcgCaiADQbAGakEs/AoAAAtBASEOICAhJgwDCyABLQDIASEGCyAGQf8BcUH1AEcNAyABEOMOIANBsANqIAFBABDCBSADKAKwAyEMIAMtAMQDIgZBAkYNACAVIBMpAgA3AgAgFCARKQAANwAAIBVBCGogE0EIaikCADcCACAUQQdqIBFBB2ooAAA2AAAgAyAGOgCcAyADIAw2AogDIANBgAZqIANBiANqEPgVIANByAJqQQhqICcpAgA3AwAgA0HIAmpBEGogIygCADYCACAIIAMpA4AGNwIAIAhBCGogA0GABmpBCGopAwA3AgAgCEEQaiADQYAGakEQaikDADcCACADIA0pAgA3A8gCIAMoAvgDIQwgAygCjAYhJSAhIQ4MAgtCBSEoCyADKQP4AxDzHyAoQgVRDQsMAgtCACEoICAhJgwBCyAIIAMpA/gDNwIAIAhBEGogA0H4A2pBEGopAwA3AgAgCEEIaiADQfgDakEIaikDADcCACABKAK8ASElQgIh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aikDADcDACAfQQhqIANBqAVqQQhqKQMANwMAIANCADcDgAJBACEIDAULIAMoArQFIQUgAygCsAUhCSADQaiBgIB4NgKwBiABIAkgBSADQbAGahDeHAwBCyADQYAGaiABEIgMAkACQCADKQOABiIoUA0AIANBADYCsAcgAyADKQOIBjcDqAcgA0EAOgC0ByADICg+AqAHIAMgKEIgiD4CpAcCQAJAIANBoAdqQdyxmwFBAhCkHEUNAAJAAkAgAS0AyAEiCkG1f2oiBUEfSw0AQQEgBXRBgYCCkHhxDQELIApBtH9qQf8BcUHUAEsNAQsgA0GYBmogARCIDAJAIAMpA5gGIihCAFINACADKAKgBiEKIAMpA6AHEPMfIAMpA+AFEPMfDAQLIChCIIghKSAopyEHIAMoAqQGISAgAygCoAYhIyACRQ0BIAMoArQFIQUgAygCsAUhCSADQaiBgIB4NgKwBiABIAkgBSADQbAGahDeHAwBCyADQZAEakEIaiAZKQIANwMAIANBkARqQRBqIAkoAgA2AgAgA0G8AmpBAmogGkECai0AADoAACADIBApAgA3A5AEIAMgGi8AADsBvAIgAygCqAUhCiADKAK0BSENIAMoAqAHIQcgAygCpAchISADKAKoByEjIAMoAqwHISAgAygCsAchESADLQC0ByEPIAMpA+AFEPMfQgAhKUEAIQhCACEoDAgLICmnISEgA0GQBGpBCGogHUEIaikCADcDACADQZAEakEQaiAdQRBqKAIANgIAIAMgHSkCADcDkAQgAygC4AUhCiADKAK0BSENIAMpA6AHEPMfQQAhD0EBIQhCACEoQgAhKUEAIREMAwsgAygCiAYhCiADKQPgBRDzHwtCAiEoIBghEwwBCyADQZAEakEIaiAdQQhqKQIANwMAIANBkARqQRBqIB1BEGooAgA2AgAgAyAdKQIANwOQBCABKAK8ASENQQEhCEICISlCACEoIAMoAuAFIQoLIAMpA6gFEPMfIChCAlENCwwDCyAfIAMpA+AFNwMAIB9BEGogA0HgBWpBEGopAwA3AwAgH0EIaiADQeAFakEIaikDADcDACADQgA3A4ACIAMpA6gFEPMfQQEhCAtCACEoC0ICISkCQCABLQDIAUH1AEcNACABEOMOIANBsAZqIAEQowkgAygCuAYhBwJAIAMpA7AGIilCAlINACADQYACahDqHiAHIQoMCgsgA0G0BGpBAmogHEECai0AADoAACADIBwvAAA7AbQEIAMtAMwGIRIgAygCyAYhJCADKALEBiEiIAMoAsAGIRUgAygCvAYhFAsgA0GQBGpBCGogBkEIaikCADcDACADQZAEakEQaiAGQRBqKAIANgIAIANBvAJqQQJqIANBtARqQQJqLQAAOgAAIAMgAy8BtAQ7AbwCIAMgBikCADcDkAQgASgCvAEhDSADKAKIAiEKICQhESAiISAgFSEjIBQhISASIQ8LIANBsAZqQQhqIhggA0GQBGpBCGopAwA3AwAgA0GwBmpBEGoiGSADQZAEakEQaigCADYCACADQaAHakECaiIbIANBvAJqQQJqLQAAOgAAIAMgAykDkAQ3A7AGIAMgAy8BvAI7AaAHIAMgAygAoAE2AoACIAMgA0GgAWpBA2ooAAA2AIMCAkAgAygC0AEiCSADKALIAUcNACADQcgBakHMsJsBEPQYCyADKALMASAJQdAAbGoiBSAKNgIIIAUgKDcDACAFIAMpA7AGNwIMIAUgDzoAPCAFIBE2AjggBSAgNgI0IAUgIzYCMCAFICE2AiwgBSAHNgIoIAUgKTcCICAFIAMvAaAHOwA9IAVBFGogGCkDADcCACAFQRxqIBkoAgA2AgAgBUE/aiAbLQAAOgAAIAUgCDoASCAFIA02AkQgBSATNgJAIAUgAygCgAI2AEkgBUHMAGogAygAgwI2AAAgAyAJQQFqNgLQASABLQDIASIFQX1qDgUAAQEBAgELIAEQ4w4CQCABLQDIAUH+AEcNACADQbAGaiABEJgFIAMoArQGIQogAygCsAYiB0UNBwwECyADKALMASIGIAMoAtABQdAAbGohCANAAkACQAJAAkAgBiIFIAhGIgYNACAFQQBB0AAgBhtqIQYgBSkDACIpQn58IihCAiAoQgJUG6cOAwIBAwILQQAhBwJAIAEtAMgBQQZGDQAMCAsgARDjDgwHCyAFKAIUIQsgBSgCECEHAkAgBSkDCCIoQgODQgBSDQAgKKciBSAFKAIAIgVBAWo2AgAgBUF/TA0VCyADQe2AgIB4NgKwBiADICg3A7gGIAEgByALIANBsAZqEN4cDAILAkACQCAFKAIIDQAgBSkDECIoQgODQgBSDQEgKKciCyALKAIAIgtBAWo2AgAgC0F/TA0VDAELIANByABqIAVBEGoQkxMgA0GwBmogAygCSCADKAJMELgIIANBsAZqENAdISgLIAUoAiwhCyAFKAIoIQUgA0HtgICAeDYCsAYgAyAoNwO4BiABIAUgCyADQbAGahDeHAwBCwJAICmnQQFxDQACQEEAKAL46Z0BQQJGDQBB6OmdAUHo6Z0BEPYVCyAFQQhqIQtBACgC9OmdAUUNAQJAIAspAwAiKEIDg0IAUg0AICinKQMIISgLICinQd3L3Z55bCAoQiCIp2pB3cvdnnlsQQ93IglBGXatQoGChIiQoMCAAX4hKUEAIQ9BACgC6OmdASIKQXhqIQ1BACgC7OmdASEHAkADQAJAIAogCSAHcSIJaikAACIqICmFIihCf4UgKEL//fv379+//358g0KAgYKEiJCgwIB/gyIoUA0AA0AgCyANICh6p0EDdiAJaiAHcUEDdGsQ+QsNAyAoQn98ICiDIihQRQ0ACwsgKiAqQgGGg0KAgYKEiJCgwIB/g1BFDQMgCSAPQQhqIg9qIQkMAAsLIAUoAhQhCyAFKAIQIQcCQCAFKQMIIihCA4NCAFINACAopyIFIAUoAgAiBUEBajYCACAFQX9MDRQLIANB7YCAgHg2ArAGIAMgKDcDuAYgASAHIAsgA0GwBmoQ3hwMAQsgBSgCFCELIAUoAhAhBSADQfGAgIB4NgKwBiABIAUgCyADQbAGahDeHAwACwsgASgCxAEhAiABKALAASEGIANBgAVqIAUQhh4gA0EBNgK0BiADQZTzmwE2ArAGIANCATcCvAYgA0H3Bq1CIIZBnK2bAa2ENwOgByADIANBoAdqNgK4BiADQYACaiADQbAGahCNFyADQZQCaiADQYgFaigCADYCACADIAMpAoAFNwKMAiAGIAIgA0GAAmoQhBchCiABLQDIAUGiAUcNBSABENcSIQIgARDjDiABIAIQ+hIMBQsgARDjDiATIRgMAAsLIApBACAHGyEJIAEoArwBIgtBCHYhDUECIQUgAygC0AEhCCADKALMASEGIAMoAsgBIQoMAwsgASgCxAEhAiABKALAASEFIANByARqIAYQhh4gA0EBNgK0BiADQZTzmwE2ArAGIANCATcCvAYgA0H3Bq1CIIZBvKabAa2ENwOgByADIANBoAdqNgK4BiADQYACaiADQbAGahCNFyADQZQCaiADQdAEaigCADYCACADIAMpAsgENwKMAiAFIAIgA0GAAmoQhBchCiABLQDIAUGiAUcNASABENcSIQIgARDjDiABIAIQ+hIMAQsgDyEOCyADQcgBahCFIEEJIQULICWtQiCGISggBK0hKSAMISULAkAgDg0AICZBAkYNACAoICmEEPMfCyAKIQQMBAsgBUGkAUYNASAGQbR/akH/AXFB1ABLDQELIAEQ4w5BASECCyADQbAGaiABEIgMIAMoArgGIQQCQCADKQOwBiIoUEUNAEEJIQUMAgsgAygCvAYhBSADQQA2AsAGIAMgBTYCvAYgAyAENgK4BiADQQA6AMQGIAMgKDcDsAYgA0HoAGogASAMIANBsAZqQQEgAhDvAkEJQQYgAygCaEEBcRshBSADKAJsIQQMAQsLIANB+ABqEPkfCyAFQQlHDQELIABBCjYCACAAIAQ2AgQMAwsgACAKOgAhIAAgAjoAICAAIAk2AhwgACAHNgIYIAAgJTYCECAAIAg2AgwgACAGNgIIIAAgBDYCBCAAIAU2AgAgACAOOgAkIAAgAy8B3gM7ASIgACADLwHaAzsAJSAAIAE2AjQgACAMNgIwIAAgKDcDKCAAIA1BCHQgC0H/AXFyNgIUIABBJ2ogA0HcA2otAAA6AAAMAgsACyAAQQo2AgAgACAENgIEIAIQ+R8LIANB0AdqJAAL/IEBAhN/A34jAEHgBmsiBSQAIAEtAMgBIQYCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAEvAYABQYDAAHEiB0UNACAGQf8BcUHRAEcNACABEOQLQf8BcUH9AEYNASABLQDIASEGCyABKAJ4IQgCQCAGQf8BcSIJQbR/ag43AgMuGwgVAwQuLgUuLi4uGgYHCS4uLhQuLgouCy4cLhkuFi4XGC4uLi4uLi4uLi4uLhAuLi4uEgALAkAgCUHpfmoOBREuLi4TAAsgCUF+ag4FDi0tLQ0tCyABEOMOIAEQ4w4gBUEIaiABIAJBARDfASAFKAIMIQECQAJAIAUoAghBAXFFDQBBEyEGQQQhAgwBCyAAQQY2AghBESEGQQwhAgsgACAGNgIAIAAgAmogATYCAAwtCyAIQYCAgIACcSEGAkAgAw0AIAZFDSwLIAZFDSogAUEBOgD0ASAIQQRxDSogASgCxAEhBiABKALAASEDIAVBk4CAgHg2AuAEIAEgAyAGIAVB4ARqEN4cDCoLIAEQ4w4CQAJAAkACQAJAAkACQAJAIAEtAMgBIgNBfWoOBAIAAAEACyADQaMBRg0BIAEtAMkBQQFxDQEgBUHgBGogASABKAJ4IgNBgAJxRSADQYABcUUQsgMgBSgC4AQhAwJAIAUtAPQEIgdBAkcNACAAQRM2AgAgACADNgIEDDMLIAVBiAZqIgogBUHgBGpBEGooAgA2AgAgBUGoBmpBAmogBUHgBGpBF2otAAA6AAAgBSAFKQPoBDcDgAYgBSAFLwD1BDsBqAYgBSgC5AQhCCABEPQNIglFDQIgAEETNgIAIAAgCTYCBCAIrUIghiADrYQgBxCyIAwyCyABEOMOCyAFQQI6AKwEIAEoArwBIQMgBkH/AXFBzQBGDQRBByEGIAEtAHlBBHFFDQEMLQsgBUGYBGpBEGogCigCADYCACAFQZgEakEXaiAFQaoGai0AADoAACAFIAg2ApwEIAUgAzYCmAQgBSAFKQOABjcDoAQgBSAHOgCsBCAFIAUvAagGOwCtBCABKAK8ASEDIAZB/wFxQc0ARg0CIAEtAHlBBHENAQsgBUGPgYCAeDYC4AQgASACIAMgBUHgBGoQ3hxBByEGDCsLQQchBiAFQZgEaiABKALcASABKALgARDLGg0qIAVBi4GAgHg2AuAEIAEgAiADIAVB4ARqEN4cDCoLIAVBmARqIAEoAtwBIAEoAuABEMsaRQ0JC0EGIQYgAS0AeUEIcQ0oIAVBiYGAgHg2AuAEIAEgAiADIAVB4ARqEN4cDCgLIAEQ4w4gARD0DSIGRQ0IIABBEzYCACAAIAY2AgQMKgsgASgCwAEhAiABEOMOIAEgASgCeCIGQYAYcjYCeCAFQeAEaiABQYCAgIACELMJIAEgBjYCeAJAAkAgBSgC4ARBE0YNAEEIQTAQmSIiBg0BDC0LIAAgBSgC5AQ2AgQgAEETNgIADCoLAkBBMEUNACAGIAVB4ARqQTD8CgAACyAFIAY2AuAFAkACQAJAIAEtAMgBIgNB7wBHDQAgARDjDiABLQDIASIDDQEgARDjDiABIAEoAngiA0HAAHI2AnggBUHgAGogARCFCSAFKAJgIQcgASADNgJ4IAUoAmQhAyAHQQFxRQ0CIABBEzYCACAAIAM2AgQMKAsgASgCxAEhBiABKALAASECIAVByANqIAMQhh4gBUEBNgKcBCAFQZTzmwE2ApgEIAVCATcCpAQgBUH3Bq1CIIZBwMKbAa2ENwPwAyAFIAVB8ANqNgKgBCAFQYAGaiAFQZgEahCNFyAFQZQGaiAFQdADaigCADYCACAFIAUpAsgDNwKMBiACIAYgBUGABmoQhBchBgJAIAEtAMgBQaIBRw0AIAEQ1xIhAiABEOMOIAEgAhD6EgsgAEETNgIAIAAgBjYCBAwnCyABKALEASEGIAEoAsABIQIgBUHABWogAxCGHiAFQQE2ApwEIAVBlPObATYCmAQgBUIBNwKkBCAFQfcGrUIghkGh2pgBrYQ3A/ADIAUgBUHwA2o2AqAEIAVBgAZqIAVBmARqEI0XIAVBlAZqIAVByAVqKAIANgIAIAUgBSkCwAU3AowGIAIgBiAFQYAGahCEFyEGAkAgAS0AyAFBogFHDQAgARDXEiECIAEQ4w4gASACEPoSCyAAQRM2AgAgACAGNgIEDCYLIAUgAzYCzAYCQCABLQDIASIHQQFHDQAgARDjDgJAIAEtAMgBQQZHDQAgARDjDgsgACACNgIMIAAgBjYCCCAAIAM2AgQgAEENNgIAIAAgASgCvAE2AhAMKgsgASgCxAEhBiABKALAASECIAVBqAZqIAcQhh4gBUEBNgKcBCAFQZTzmwE2ApgEIAVCATcCpAQgBUH3Bq1CIIZB4KibAa2ENwPwAyAFIAVB8ANqNgKgBCAFQYAGaiAFQZgEahCNFyAFQZQGaiAFQbAGaigCADYCACAFIAUpAqgGNwKMBiACIAYgBUGABmoQhBchBgJAIAEtAMgBQaIBRw0AIAEQ1xIhAiABEOMOIAEgAhD6EgsgAEETNgIAIAAgBjYCBCAFQcwGahCaIQwlCyABKALAASEIIAEQ4w4gASgCwAEhCQJAAkAgAS0AyAEiBkHMAEYNAEEAIQcgBiECDAELIAEQ4w4gAS0AyAEhAiABKAK8ASEKQQEhBwsCQCACQf8BcQ0AIAEQ4w4gASABKAJ4IgJBMHIgAkFPcUEQciAGQcwARhs2AnggAS0AyAEiBkHtAEYNIgJAAkAgBkHiAEYNACAGQdEARw0BDCQLAkACQAJAIAEQ5AsiA0H/AXEiBkF+ag4DJgEmAAsgBkG1f2pBAkkNJSAGQeIARg0lIAZB8QBGDSUgBkGkAUYNAQsgA0GNf2pB/wFxQS5JDSQLIAEtAMgBIQYLAkAgBkH/AXFBBkcNACABEOMOIAVByANqIAFBAiAFEJwKDCQLIAEoAsABIQsgASABKAJ4IgZBv39xNgJ4IAVB8ABqIAEQhQkgBSgCcCEDIAEgBjYCeCAFKAJ0IQYCQCADQQFxRQ0AIAVBBTYCyAMgBSAGNgLMAwwkCyAFIAY2AuwFAkACQAJAAkAgAS0AgQFBAnFFDQACQAJAAkAgBigCACIDQRpHDQAgBkEIakHFw5sBQQUQoxwNASAGKAIAIQMLIANBIkcNAiAGKAIEIgMoAgBBGkcNAiADQQhqQcXDmwFBBRCjHEUNAkGKASEDIAEtAMgBQYoBRg0DQQEhDAwBC0GKASEDIAEtAMgBQYoBRg0CQQAhDAsgARDkC0H/AXEiA0HgAEYNAyADQYoBRg0DCyABLQDIASIDQeAARg0AIANBigFGDQAgA0EGRw0BIAEQ4w4gBUHIA2ogAUEBIAYQnAoMJgsgBUGYBGogAUECIAYQcgJAIAUoApgEIgtBB0cNACAFIAUoApwENgLMAyAFQQU2AsgDDCYLIAVBqAZqQQhqIAVBmARqQRBqKQMAIhg3AwAgBUGoBmpBEGogBUGYBGpBGGopAwAiGTcDACAFQagGakEYaiAFQZgEakEgaikDACIaNwMAIAVBgAZqQRBqIBg3AwAgBUGABmpBGGogGTcDACAFQYAGakEgaiAaNwMAIAUgBSkDoAQiGDcDqAYgBSAFKAKcBCIMNgKEBiAFIAs2AoAGIAUgGDcDiAYgA0HgAEcNIyABLwGAAUGAwABxRQ0jIAtFDSMgC0EGRg0jIAVB6ABqIAVBgAZqEKsOIAUoAmwhBiAFKAJoIQMgBUGxgYCAeDYCmAQgASADIAYgBUGYBGoQ3hwMIwsgASgCxAEhBiABKALAASELIAVBzAZqIAMQhh4gBUEBNgKcBCAFQZTzmwE2ApgEIAVCATcCpAQgBUH3Bq1CIIZBxMObAa2ENwPYBiAFIAVB2AZqNgKgBCAFQYAGaiAFQZgEahCNFyAFQZQGaiAFQdQGaigCADYCACAFIAUpAswGNwKMBiALIAYgBUGABmoQhBchBgJAIAEtAMgBQaIBRw0AIAEQ1xIhAyABEOMOIAEgAxD6EgsgBUEFNgLIAyAFIAY2AswDDCELIAVBmARqIAFBABDCBSAFKAKYBCEDIAUtAKwEIg1BAkYNHyAFQcAFakEIaiIOIAVBpARqKQIANwMAIAUgBSkCnAQ3A8AFIAUgBSkArQQ3A/AFIAUgBUG0BGooAAA2APcFIAEoArwBIQ9BCEE4EJkiIgZFDSsgBiADNgIIIAZBADYCACAGIAUpA8AFNwIMIAYgDToAHCAGIAUpA/AFNwAdIAZBADoANCAGQQA2AjAgBiAPNgIsIAYgCzYCKCAGQSRqIAUoAPcFNgAAIAZBFGogDikDADcCAEEEQRgQmSIiA0UNKyADIAw6ABQgAyAPNgIQIAMgCzYCDCADQQE2AgggAyAGNgIEIANBATYCAAJAAkACQAJAIAEtAMgBQd5+ag4CAgABCyABKAJwEKQdIQYMAgsgBUHIA2ogAUEBIAMQ7AoMIgsgARDXEiEGIAEQ4w4LIAVBBTYCyAMgBSAGNgLMAyADEJsiDCALIAEoAsQBIQYgASgCwAEhAyAFQeQDaiACEIYeIAVBATYCnAQgBUGU85sBNgKYBCAFQgE3AqQEIAVB9watQiCGQaHamAGthDcDqAYgBSAFQagGajYCoAQgBUGABmogBUGYBGoQjRcgBUGUBmogBUHsA2ooAgA2AgAgBSAFKQLkAzcCjAYgAyAGIAVBgAZqEIQXIQYCQCABLQDIAUGiAUcNACABENcSIQIgARDjDiABIAIQ+hILIABBEzYCACAAIAY2AgQMKAsCQCADDQAgASgCxAEhBiABKALAASECIAVBgYCAgHg2AuAEIAEgAiAGIAVB4ARqEN4cCyAFQeAEakEIaiAEQQhqKAIANgIAIAUgBCkCADcD4AQgBUGQAmogASAFQeAEahCsIgJAAkAgBSgCkAJBCEcNACAAIAUoApQCNgIEQRMhAQwBCwJAQShFDQAgBUHgBGpBBGogBUGQAmpBKPwKAAALAkBBLEUNACAAQQRqIAVB4ARqQSz8CgAAC0ERIQELIAAgATYCAAwoCwJAIAMNACABKALEASEGIAEoAsABIQMgBUGBgICAeDYC4AQgASADIAYgBUHgBGoQ3hwLIAVBuAJqIAEgAiAEQQAQ/wUCQAJAIAUoArgCQQhHDQAgACAFKAK8AjYCBEETIQEMAQsCQEEoRQ0AIAVB4ARqQQRqIAVBuAJqQSj8CgAACwJAQSxFDQAgAEEEaiAFQeAEakEs/AoAAAtBESEBCyAAIAE2AgAMJwsgBUHgBGogARDXAgJAAkAgBSgC4AQNACAAIAUoAuQENgIEQRMhAQwBCyAAIAUpAuAENwIEIABBFGogBUHwBGooAgA2AgBBCCEBIABBDGogBUHgBGpBCGopAgA3AgALIAAgATYCAAwlCyABKALAASEDIAEQ4w5BACEGAkACQAJAIAEtAMgBIgJBfWoOBAIBAQIACyACQaMBRg0BCyABLQDJAQ0AIAEgASgCeCIGQcAAcjYCeCAFQZgBaiABEIUJIAUoApgBIQIgASAGNgJ4IAUoApwBIQYgAkEBcUUNACAAQRM2AgAgACAGNgIEDCULIAUgBjYCmAQCQCABEPQNIgJFDQAgAEETNgIAIAAgAjYCBCAFQZgEahDeIQwlCyABKAK8ASECIAEtAHpBCHENGSABLQCAAUGAAXENGSAFQcuAgIB4NgLgBCABIAMgAiAFQeAEahDeHAwZCyABKALAASEQIAEQ4w4CQAJAIAEtAMgBIgYNACABEOMOIAEgASgCeCIGQcAAcjYCeCAFQagBaiABEIUJIAUoAqgBIQIgASAGNgJ4IAUoAqwBIREgAkEBcUUNASAAQRM2AgAgACARNgIEDCULIAEoAsQBIQIgASgCwAEhAyAFQYAEaiAGEIYeIAVBATYC5AQgBUGU85sBNgLgBCAFQgE3AuwEIAVB9watQiCGQaHamAGthDcDgAYgBSAFQYAGajYC6AQgBUGYBGogBUHgBGoQjRcgBUGsBGogBUGIBGooAgA2AgAgBSAFKQKABDcCpAQgAyACIAVBmARqEIQXIQYCQCABLQDIAUGiAUcNACABENcSIQIgARDjDiABIAIQ+hILIABBEzYCACAAIAY2AgQMJAsgBSARNgLYBiABLQDIASIGQQFHDRYgARDjDiAFQQA2AtQGIAVCgICAgMAANwLMBiABLQDIASIGQQJHDREgARDjDiABIAEoAngiEkGAEHI2AnhBBCETIAVB4ARqQQRqIQwgBUGYBGpBCGohDUEAIQ5BACEUA0ACQAJAAkAgAS0AyAEiBkHUAEYNACAGQc4ARw0BCyAFQQA2ApQEIAVCgICAgIABNwKMBCABKALAASEVIAEQ4w4CQCAGQc4ARg0AAkAgFEEBcUUNACABKALEASEGIAEoAsABIQIgBSAWNgLoBCAFIBc2AuQEIAVBuYCAgHg2AuAEIAIgBiAFQeAEahCEFyEPIAEtAMgBQaIBRw0ZIAEQ1xIhBiABEOMOIAEgBhD6EgwZCyABKAK8ASEWQQAhD0EBIRQgFSEXDAILIAEgASgCeCIGQcAAcjYCeCAFQaABaiABEIUJIAUoAqABIQIgASAGNgJ4IAUoAqQBIQ8gAkEBcUUNAQwXCyABIBI2AngCQCAGQQNHDQAgARDjDiAAIBA2AhQgACARNgIQIABBCTYCACAAIAUpAswGNwIEIABBDGogBUHUBmooAgA2AgAgACABKAK8ATYCGAwmCyABKALEASECIAEoAsABIQMgBUHIA2ogBhCGHiAFQQE2AuQEIAVBlPObATYC4AQgBUIBNwLsBCAFQfcGrUIghkG9ppsBrYQ3A4AGIAUgBUGABmo2AugEIAVBmARqIAVB4ARqEI0XIAVBrARqIAVB0ANqKAIANgIAIAUgBSkCyAM3AqQEIAMgAiAFQZgEahCEFyEPIAEtAMgBQaIBRw0XIAEQ1xIhBiABEOMOIAEgBhD6EgwXCyAFIA82AvAFIAEtAMgBIgZBCUcNEyABEOMOQQAhAkEIIQNBCCELA0ACQAJAIAEtAMgBIgZBA0YNACAGQdQARg0AIAZBzgBHDQELIAEoArwBIQICQCAOIAUoAswGRw0AIAVBzAZqEP0YIAUoAtAGIRMLIAVBjARqQQhqKAIAIQMgEyAOQRhsaiIGIAUpAowENwIAIAYgDzYCFCAGIAI2AhAgBiAVNgIMIAZBCGogAzYCACAFIA5BAWoiDjYC1AYMAgsgASABKAJ4IgdB/////31xNgJ4IAVBAToA7AUgBSABKALAATYC5AMCQAJAIAZBGEYNAEEEIQhBACEKQQAhCQwBCyAFQeAEaiABQQEQgAMgBSgC5AQhCAJAIAUoAuAEIglBgICAgHhHDQAgASAHNgJ4IAghDwwXCyAFKALoBCEKIAEtAMgBIQYLAkACQAJAIAZB/wFxIgZB3wBGDQAgBkHYAEcNAQsgBSAKNgLsBCAFIAg2AugEIAUgCTYC5AQgBSABNgLgBCAFQZgEaiABIAwQnggMAQsgBSAKNgKwBiAFIAg2AqwGIAUgCTYCqAYgBSAFQewFajYCuAYgBSAFQeQDajYCtAYgBUHgBGogASAFQagGahDhHAJAIAUoAuAEQRNHDQAgBSAFKALkBDYCnAQgBUETNgKYBAwBC0EwRQ0AIAVBmARqIAVB4ARqQTD8CgAACyAFKAKYBCEGIAEgBzYCeCAFKAKcBCEIAkAgBkETRw0AIAghDwwWCwJAQShFIgkNACAFQYAGaiANQSj8CgAACwJAIAIgBSgCjARHDQAgBUGMBGpB1MSbARDzGCAFKAKQBCELCyALIANqIgdBfGogCDYCACAHQXhqIAY2AgACQCAJDQAgByAFQYAGakEo/AoAAAsgBSACQQFqIgI2ApQEIANBMGohAwwACwsLIAVBkIGAgHg2AuAEIAEgAiADIAVB4ARqEN4cQQYhBgwfCyAAIAI2AgQgAEECNgIAIAAgASgCvAE2AggMIQsgARDjDiAAIAI2AgQgAEEBNgIAIAAgASgCvAE2AggMIAsgASAIQYCAgIABcjYCeEEAIQYgBUHgBGogAUEAEKIJIAEgCDYCeAJAAkAgBSgC4ARBgICAgHhHDQAgACAFKALkBDYCBEETIQYMAQsgACAFKQLgBDcCBCAAQRRqIAVB8ARqKQIANwIAIABBDGogBUHoBGopAgA3AgALIAAgBjYCAAwfCyAHRQ0dAkACQCABEOQLIgdB/wFxIgNBtX9qIgZBH0sNAEEBIAZ0QYGAgpB4cQ0BCyADQaQBRg0eIAdBtH9qQf8BcUHUAEsNHgsgARDkCxogASgCmAFBC0YNHSABLQCxAUEBcQ0dIAEoAsABIQYgARDjDiAFQfABaiABIAZBABDfASAFKAL0ASEBAkAgBSgC8AFBAXFFDQAgAEETNgIAIAAgATYCBAwfCyAAIAE2AgwgAEEGNgIIIABBETYCAAweCyAHRQ0cAkACQCABEOQLIgdB/wFxIgNBtX9qIgZBH0sNAEEBIAZ0QYGAgpB4cQ0BCyADQaQBRg0dIAdBtH9qQf8BcUHUAEsNHQsgARDkCxogASgCmAFBC0YNHCABLQCxAUEBcQ0cIAEoAsABIQYgARDjDiAFQegBaiABIAYQ0wkgBSgC7AEhAQJAIAUoAugBQQFxRQ0AIABBEzYCACAAIAE2AgQMHgsgACABNgIMIABBBTYCCCAAQRE2AgAMHQsgB0UNGwJAAkAgARDkCyIHQf8BcSIDQbV/aiIGQR9LDQBBASAGdEGBgIKQeHENAQsgA0GkAUYNHCAHQbR/akH/AXFB1ABLDRwLIAEQ5AsaIAEoApgBQQtGDRsgAS0AsQFBAXENGyABKALAASEGIAEQ4w4gBUHgAWogASAGEMgEIAUoAuQBIQECQCAFKALgAUEBcUUNACAAQRM2AgAgACABNgIEDB0LIAAgATYCDCAAQQQ2AgggAEERNgIADBwLIANFDRogBUHYAWogASACQQAQiwUgBSgC3AEhBgJAIAUoAtgBQQFxRQ0AIABBEzYCACAAIAY2AgQMHAsgBkUNGiAAIAY2AgwgAEEDNgIIIABBETYCAAwbCyADRQ0ZAkACQAJAIAEQ5AsiA0H/AXEiBkF+ag4DAgECAAsgBkG1f2pBAkkNASAGQeIARg0BIAZB8QBGDQEgBkGkAUYNGwsgA0GNf2pB/wFxQS1LDRoLIAVB0AFqIAFBABDRAiAFKALUASEBAkAgBSgC0AFBAXFFDQAgAEETNgIAIAAgATYCBAwbCyAAIAE2AgwgAEECNgIIIABBETYCAAwaCyADRQ0YCyAFQcgBaiABQQAQ0QIgBSgCzAEhAQJAIAUoAsgBQQFxRQ0AIABBEzYCACAAIAE2AgQMGQsgACABNgIMIABBAjYCCCAAQRE2AgAMGAsgASgCwAEhAyABEOMOAkACQCABLQDIASIGDQAgARDjDiABIAEoAngiBkHAAHI2AnggBUHAAWogARCFCSAFKALAASECIAEgBjYCeCAFKALEASEGIAJBAXFFDQEgAEETNgIAIAAgBjYCBAwZCyABKALEASECIAEoAsABIQMgBUHABWogBhCGHiAFQQE2ApwEIAVBlPObATYCmAQgBUIBNwKkBCAFQfcGrUIghkGh2pgBrYQ3A8gDIAUgBUHIA2o2AqAEIAVBgAZqIAVBmARqEI0XIAVBlAZqIAVByAVqKAIANgIAIAUgBSkCwAU3AowGIAMgAiAFQYAGahCEFyEGAkAgAS0AyAFBogFHDQAgARDXEiECIAEQ4w4gASACEPoSCyAAQRM2AgAgACAGNgIEDBgLIAUgBjYC8AMCQAJAAkAgAS0AyAEiAkEBRw0AIAEQ4w4gASABKAJ4IgJBgBhyNgJ4IAVB4ARqIAFBgICAgAIQswkgASACNgJ4IAUoAuAEQRNHDQIgBSgC5AQhBgwBCyABKALEASEGIAEoAsABIQMgBUGoBmogAhCGHiAFQQE2ApwEIAVBlPObATYCmAQgBUIBNwKkBCAFQfcGrUIghkHgqJsBrYQ3A8gDIAUgBUHIA2o2AqAEIAVBgAZqIAVBmARqEI0XIAVBlAZqIAVBsAZqKAIANgIAIAUgBSkCqAY3AowGIAMgBiAFQYAGahCEFyEGIAEtAMgBQaIBRw0AIAEQ1xIhAiABEOMOIAEgAhD6EgsgAEETNgIAIAAgBjYCBCAFQfADahCaIQwYC0EIQTAQmSIiAkUNGQJAQTBFDQAgAiAFQeAEakEw/AoAAAsgACADNgIMIAAgAjYCCCAAIAY2AgQgAEEMNgIAIAAgASgCvAE2AhAMFwsCQCABLQCBAUEgcUUNACABKALEASEGIAEoAsABIQIgBUGsgYCAeDYCmAQgASACIAYgBUGYBGoQ3hwLIAEoAsQBIQYgASgCwAEhAiAFQcqAgIB4NgKYBCABIAIgBiAFQZgEahDTDSABKALAASEDIAEQ4w4CQAJAIAEtAMgBIgYNACABEOMOIAEgASgCeCIGQcAAcjYCeCAFQbgBaiABEIUJIAUoArgBIQIgASAGNgJ4IAUoArwBIQYgAkEBcUUNASAAQRM2AgAgACAGNgIEDBgLIAEoAsQBIQIgASgCwAEhAyAFQcAFaiAGEIYeIAVBATYCnAQgBUGU85sBNgKYBCAFQgE3AqQEIAVB9watQiCGQaHamAGthDcDyAMgBSAFQcgDajYCoAQgBUGABmogBUGYBGoQjRcgBUGUBmogBUHIBWooAgA2AgAgBSAFKQLABTcCjAYgAyACIAVBgAZqEIQXIQYCQCABLQDIAUGiAUcNACABENcSIQIgARDjDiABIAIQ+hILIABBEzYCACAAIAY2AgQMFwsgBSAGNgLwAwJAAkACQCABLQDIASICQQFHDQAgARDjDiABIAEoAngiAkGAgCByNgJ4IAVB4ARqIAFBgICAgAIQswkgASACNgJ4IAUoAuAEQRNHDQIgBSgC5AQhBgwBCyABKALEASEGIAEoAsABIQMgBUGoBmogAhCGHiAFQQE2ApwEIAVBlPObATYCmAQgBUIBNwKkBCAFQfcGrUIghkHgqJsBrYQ3A8gDIAUgBUHIA2o2AqAEIAVBgAZqIAVBmARqEI0XIAVBlAZqIAVBsAZqKAIANgIAIAUgBSkCqAY3AowGIAMgBiAFQYAGahCEFyEGIAEtAMgBQaIBRw0AIAEQ1xIhAiABEOMOIAEgAhD6EgsgAEETNgIAIAAgBjYCBCAFQfADahCaIQwXC0EIQTAQmSIiAkUNGAJAQTBFDQAgAiAFQeAEakEw/AoAAAsgACADNgIMIAAgAjYCCCAAIAY2AgQgAEEDNgIAIAAgASgCvAE2AhAMFgsgASgCwAEhAyABEOMOIAVB4ARqIAFBABCiCSAFKALkBCEGAkAgBSgC4AQiAkGAgICAeEcNACAAQRM2AgAgACAGNgIEDBYLIAVBgAZqQRBqIAVB4ARqQRBqKQIANwIAIAUgBSkC6AQ3AogGIAUgBjYChAYgBSACNgKABiABKALAASEHIAVB4ARqIAEQxgMgBSgC5AQhBgJAAkACQCAFKALgBCICQQlHDQAgAEETNgIAIAAgBjYCBAwBCwJAQcAARQ0AIAVBmARqQQhqIAVB4ARqQQhqQcAA/AoAAAsgBSAGNgKcBCAFIAI2ApgEIAVB4ARqIAEQug4gBSgC5AQhBiAFKALgBCIIQYGAgIB4Rw0BIABBEzYCACAAIAY2AgQgBUGYBGoQph8LIAVBgAZqEPYfDBYLIAVBqAZqQQhqIAVB4ARqQRBqKQIANwMAIAUgBSkC6AQ3A6gGAkAgCEGAgICAeEcNACACQQhHDQAgBUH2gICAeDYC4AQgASAHIAcgBUHgBGoQ3hwLIAEoArwBIQIgBUG4BWogBUGABmpBEGopAgA3AwAgBUGwBWogBUGABmpBCGopAgA3AwAgBSAFKQKABjcDqAUCQEHIAEUNACAFQeAEaiAFQZgEakHIAPwKAAALQQhBgAEQmSIiAUUNFwJAQeAARQ0AIAEgBUHgBGpB4AD8CgAACyABIAY2AmQgASAINgJgIAEgAjYCfCABIAM2AnggASAFKQOoBjcDaCABQfAAaiAFQbAGaikDADcDACAAIAE2AgQgAEELNgIADBULIAEoAsQBIQYgASgCwAEhAiAFQfaAgIB4NgLgBCABIAIgBiAFQeAEahDeHCAFQeAEaiABELoOIAVB4ARqEIwfQQhBwAAQmSIiAUUNFiABIAY2AgggASACNgIEIAFBMTYCACAAIAY2AgwgACACNgIIIAAgATYCBCAAQRI2AgAMFAsgASgCxAEhBiABKALAASECIAVB9oCAgHg2AuAEIAEgAiAGIAVB4ARqEN4cIAVB4ARqIAEQxgMCQAJAIAUoAuAEQQlGDQAgBUHgBGoQph8MAQsgBUHgBGpBBHIQjSALIAVB4ARqIAEQug4gBUHgBGoQjB9BCEHAABCZIiIBRQ0VIAEgBjYCCCABIAI2AgQgAUExNgIAIAAgBjYCDCAAIAI2AgggACABNgIEIABBEjYCAAwTCyABKALAASEDIAEQ4w4CQCABLQDJAQ0AIAEgASgCeCIGQcAAcjYCeCAFQbABaiABEIUJIAUoArABIQIgASAGNgJ4IAUoArQBIQYCQCACQQFxRQ0AIABBEzYCACAAIAY2AgQMFAsgBSAGNgLgBAJAIAEQ9A0iAkUNACAAQRM2AgAgACACNgIEIAVB4ARqEJohDBQLIAAgAzYCCCAAIAY2AgQgAEEKNgIAIAAgASgCvAE2AgwMEwsgASgCxAEhBiABKALAASECIAVBroCAgHg2AuAEIAIgBiAFQeAEahCEFyEGAkAgAS0AyAFBogFHDQAgARDXEiECIAEQ4w4gASACEPoSCyAAQRM2AgAgACAGNgIEDBILIAEoAsQBIQIgASgCwAEhAyAFQfADaiAGEIYeIAVBATYC5AQgBUGU85sBNgLgBCAFQgE3AuwEIAVB9watQiCGQbymmwGthDcDgAYgBSAFQYAGajYC6AQgBUGYBGogBUHgBGoQjRcgBUGsBGogBUH4A2ooAgA2AgAgBSAFKQLwAzcCpAQgAyACIAVBmARqEIQXIQ8gAS0AyAFBogFHDQMgARDXEiEGIAEQ4w4gASAGEPoSDAMLIAEoAsQBIQIgASgCwAEhAyAFQcAFaiAGEIYeIAVBATYC5AQgBUGU85sBNgLgBCAFQgE3AuwEIAVB9watQiCGQammmwGthDcDqAYgBSAFQagGajYC6AQgBUGYBGogBUHgBGoQjRcgBUGsBGogBUHIBWooAgA2AgAgBSAFKQLABTcCpAQgAyACIAVBmARqEIQXIQ8gAS0AyAFBogFHDQAgARDXEiEGIAEQ4w4gASAGEPoSCyAFQfAFahDeIQsgBUGMBGoQ9h8gASASNgJ4CyAAQRM2AgAgACAPNgIEIAVBzAZqEIkgDAELIAEoAsQBIQIgASgCwAEhAyAFQeAFaiAGEIYeIAVBATYC5AQgBUGU85sBNgLgBCAFQgE3AuwEIAVB9watQiCGQeComwGthDcDgAYgBSAFQYAGajYC6AQgBUGYBGogBUHgBGoQjRcgBUGsBGogBUHoBWooAgA2AgAgBSAFKQLgBTcCpAQgAyACIAVBmARqEIQXIQYCQCABLQDIAUGiAUcNACABENcSIQIgARDjDiABIAIQ+hILIABBEzYCACAAIAY2AgQLIAVB2AZqEJohDAsLIAAgBjYCDCAAIAI2AgggACADNgIEIABBBDYCAAwKCyAFIAM2AswDIAVBBTYCyAMLIAVB7AVqEJohDAILQQhBKBCZIiIGRQ0JIAYgDDYCBCAGIAs2AgAgBiAFKQOoBjcDCCAGQRBqIAVBsAZqKQMANwMAIAZBGGogBUGoBmpBEGopAwA3AwAgBkEgaiAFQagGakEYaikDADcDACAFQcgDaiABQQIgBhDsCgwBCyAFQZABaiABQQEQ0QIgBSgClAEhBgJAIAUoApABQQFxRQ0AIAEgAjYCeAwCCwJAAkACQAJAIAEtAMgBIgNBBkYNAAJAIANBigFGDQAgA0HgAEcNAgsCQCAGKAIIIgtBAUcNAAJAAkAgA0GKAUYNACABKAJ4QQhxRQ0BCyAGKAIEIgMoAjBFDQAgBUGAAWogAxCrDiAFKAKEASEDIAUoAoABIQsgBUHNgICAeDYCmAQgASALIAMgBUGYBGoQ3hwLIAEtAIEBQSBxRQ0EIAYoAghFDQMgBigCBCIDKAIAIgtBBE8NBCADIAtBAnRByOSdAWooAgBqKAIARQ0EIAVB+ABqIAMQqw4gBSgCfCEDIAUoAnghCyAFQbCBgIB4NgKYBCABIAsgAyAFQZgEahDeHAwECyAGKAIEIgMgC0E4bGohDEEAIQtBASENA0ACQAJAIAtBAXFFDQAgAyAMRg0GDAELIA0gDCADa0E4bk8NBSADIA1BOGxqIQMLIAVBiAFqIAMQqw4gBSgCjAEhCyAFKAKIASENIAVBzICAgHg2ApgEIAEgDSALIAVBmARqEN4cIANBOGohA0EAIQ1BASELDAALCyABEOMOIAVByANqIAFBACAGEJwKDAMLIAEoAsQBIQsgASgCwAEhDCAFQeAFaiADEIYeIAVBATYCnAQgBUGU85sBNgKYBCAFQgE3AqQEIAVB9watQiCGQcTDmwGthDcD2AYgBSAFQdgGajYCoAQgBUGABmogBUGYBGoQjRcgBUGUBmogBUHoBWooAgA2AgAgBSAFKQLgBTcCjAYgDCALIAVBgAZqEIQXIQMCQCABLQDIAUGiAUcNACABENcSIQsgARDjDiABIAsQ+hILIAVBBTYCyAMgBSADNgLMAyAGEJoiDAILQQBBAEG0w5sBEMMSAAsgBUHIA2ogAUEAIAYQ7AoLIAUpAtADIRggBSgCzAMhBiAFKALIAyEDIAEgAjYCeCADQQVGDQAgBSAGNgL0AyAFIAM2AvADIAEtAMgBIQIgBSAYNwL4AwJAAkACQAJAIAJBAUcNACABEOMOIAEgASgCeCICQYAYcjYCeCAFQeAEaiABQYCAgIACELMJIAEgAjYCeCAFKALgBEETRw0CIAAgBSgC5AQ2AgQgAEETNgIADAELIAEoAsQBIQYgASgCwAEhByAFQYAEaiACEIYeIAVBATYCnAQgBUGU85sBNgKYBCAFQgE3AqQEIAVB9watQiCGQeComwGthDcDqAYgBSAFQagGajYCoAQgBUGABmogBUGYBGoQjRcgBUGUBmogBUGABGpBCGooAgA2AgAgBSAFKQKABDcCjAYgByAGIAVBgAZqEIQXIQYCQCABLQDIAUGiAUcNACABENcSIQIgARDjDiABIAIQ+hILIABBEzYCACAAIAY2AgQLQQEhAEEBIQYMAQtBCEEwEJkiIgJFDQggGEIgiCEZAkBBMEUNACACIAVB4ARqQTD8CgAACyAZpyELIBinIQwgBSACNgLIAyABKAK8ASENAkACQAJAAkACQCADQX5qQQAgA0F9akECSRsOAwACAQALIAUgBjYChAYgBSADNgKABiAFIAw2AsAFIAUgCzYCqAYCQCAHDQBBDiEBIAwhCSALIQcgBiEMIAIhCyAIIQIgDSEIIAkhDQwDCyAFQdKAgIB4NgKYBCAJIAogBUGYBGoQhBchBgJAIAEtAMgBQaIBRw0AIAEQ1xIhAiABEOMOIAEgAhD6EgsgAEETNgIAIAAgBjYCBCAFQagGahDeISAFQcAFahDeISAFQYAGahChHUEBIQZBACEADAMLQRAhASAGIQMMAQsgBSAMNgKEBiAFIAY2AoAGIAUgCzYCqAYCQCAHDQBBDyEBIAYhAwwBCyAFQdKAgIB4NgKYBCAJIAogBUGYBGoQhBchBgJAIAEtAMgBQaIBRw0AIAEQ1xIhAiABEOMOIAEgAhD6EgsgAEETNgIAIAAgBjYCBCAFQagGahCaISAFQYAGahCiHUEAIQZBASEADAELIAAgBzYCHCAAIA02AhggACAINgIUIAAgAjYCECAAIAs2AgwgACAMNgIIIAAgAzYCBCAAIAE2AgAMBwsgBUHIA2oQoCELIAVB9ANqIQECQAJAAkAgA0F+akEAIANBfWpBAkkbDgMBAgABCyABEKIdIAVB/ANqEJohDAcLIABFDQYgBUHwA2oQoR0gBUHwA2pBCGoQ3iEgBUH8A2oQ3iEMBgsgBkUNBSABEKIdIAVB/ANqEJohDAULIABBEzYCACAAIAY2AgQMBAsgBUHgBWoQoCEMAwsgACADNgIMIAAgAjYCCCAAIAY2AgAgACAFKQOYBDcDECAAQRhqIAVBoARqKQMANwMAIABBIGogBUGoBGopAwA3AwAMAgsgARDkC0H/AXFBmwFHDQAgASgCwAEhAyABEOMOIAVB2ABqIAEgAkEBEIsFIAUoAlwhBgJAIAUoAlhBAXFFDQAgAEETNgIAIAAgBjYCBAwCCwJAIAZFDQAgACAGNgIMIABBAzYCCCAAQRE2AgAMAgsgBUHQAGogAUEBIAMQtgYgBSgCVCEGAkAgBSgCUEEBcUUNACAAQRM2AgAgACAGNgIEDAILIAEgASgCeCIDQcAAcjYCeCAFQcgAaiABIAZBABCmDSAFKAJIIQYgASADNgJ4IAUoAkwhAwJAIAZBAXFFDQAgAEETNgIAIAAgAzYCBAwCCwJAIAEtAMgBQQZHDQAgARDjDgsgACACNgIIIAAgAzYCBCAAQRI2AgAgACABKAK8ATYCDAwBCwJAIAEtAMgBQfgARw0AIAEQ5AtB/wFxQd0ARw0AIAEQ5AsaIAEoApgBQQtGDQAgAS0AsQFBAXENACAFQeACaiABIAQQ2AsCQAJAIAUoAuACQQhHDQAgACAFKALkAjYCBEETIQEMAQsCQEEoRQ0AIAVB4ARqQQRqIAVB4AJqQSj8CgAACwJAQSxFDQAgAEEEaiAFQeAEakEs/AoAAAtBESEBCyAAIAE2AgAMAgsgASABKAJ4IgZBwAByNgJ4IAVBwABqIAEQhQkgBSgCQCEDIAEgBjYCeCAFKAJEIQcCQCADQQFxRQ0AIABBEzYCACAAIAc2AgQMAQsCQAJAAkACQAJAAkACQAJAAkAgBygCAEF0aiIIQQ5HDQAgBUGIA2pBEGoiBiAHQRhqKQMANwMAIAVBiANqQQhqIgMgB0EQaikDADcDACAFIAcpAwg3A4gDAkAgAS0AyAFBCUcNACABEOMOIAEoAnghDCAFQYAGakEQaiAGKQMANwMAIAVBgAZqQQhqIAMpAwAiGDcDACABIAxB/+///35xQYAQcjYCeCAFIAUpA4gDNwOABkEAIQkgBUEANgKwBiAFQoCAgIDAADcCqAYgASgC3AEiCyABKALgASIKQQN0aiECIBinIQ9BBCEOQQAhDSALIQYCQANAIAYgAkYNASAFQYAGaiAGEPkLIQMgBiAGIAJHQQN0aiIIIQYgA0UNACAFKAKMBiEGIAUoAogGIQMCQCAFKQOABiIYQgODQgBSDQAgGKciFSAVKAIAIhVBAWo2AgAgFUF/TA0PCyAFQcSAgIB4NgLgBCAFIBg3A+gEIAMgBiAFQeAEahCEFyEGAkAgDSAFKAKoBkcNACAFQagGakGExZsBELUYIAUoAqwGIQ4LIA4gDUECdGogBjYCACAFIA1BAWoiDTYCsAYgCUEEaiEJIAghBgwACwsCQCAFKQOABiIYQgODQgBSDQAgGKciBiAGKAIAIgZBAWo2AgAgBkF/TA0NCwJAIAogAUHYAWoiBigCAEcNACAGEPsYIAEoAtwBIQsLIAEgCkEBajYC4AEgCyAKQQN0aiAYNwMAAkACQCABLQDIAUHdAEcNACAFQQA2AqAEIAVCgICAgMAANwKYBCAFQeAEaiABIAVBmARqEKwiIAUoAuQEIQYgBSgC4AQiAkEIRg0BIAVBmARqQRBqIAVB+ARqKQMANwMAIAVBmARqQQhqIAVB4ARqQRBqKQMANwMAIAUgBSkD6AQ3A5gEIAUoAoAFIQMgBSgChAUhC0ERIQoCQCACQQFHDQACQCABLQB4QQhxRQ0AIAMoAjQhAiADKAIwIQggBUHPgICAeDYC4AQgASAIIAIgBUHgBGoQ3hwLAkAgAy0ARA0AQQEhAiADLQBFQQFHDQELIAMoAjQhAiADKAIwIQggBUHOgICAeDYC4AQgASAIIAIgBUHgBGoQ3hxBASECCwwHCyAFQeAEaiABQYCAgIACELMJIAUoAuQEIQYgBSgC4AQiCkETRg0AIAVBoARqIAVB+ARqKQMANwMAIAVBqARqIAVBgAVqKQMANwMAIAUgBSkD8AQ3A5gEIAUoAugEIQIgBSgCiAUhAyAFKAKMBSELIAYhDiAFKALsBCEGDAYLIABBEzYCACAAIAY2AgQgBUGoBmoQ7RYgBSkDgAYQ8x8MBgsgBUHgBGpBFGogBikDADcCACAFQeAEakEMaiADKQMANwIAIAUgBSkDiAM3AuQEQQhBwAAQmSIiBkUNCyAGQRo2AgAgBiAFKQLgBDcCBCAGQQxqIAVB6ARqKQIANwIAIAZBFGogBUHwBGopAgA3AgAgBkEcaiAFQfgEaigCADYCACAFIAY2AvADDAELIAUgBzYC8AMgByEGIAcoAgBBGkYNAEEBIQMgByEGDAELIAVBOGogBkEIahCUEwJAIAUoAjggBSgCPEGgpZsBQQkQwh5FDQAgAS0AyQFBAUcNACAGKAIUIQMgBigCECEJAkAgBikDCCIYQgODQgBSDQAgGKciCiAKKAIAIgpBAWo2AgAgCkF/TA0LCyAFQaeAgIB4NgLgBCAFIBg3A+gEIAEgCSADIAVB4ARqENMNAkAgAS0AyAFBBkcNACABEOMOCyAAIAI2AgggACAGNgIEIABBEjYCACAAIAEoArwBNgIMQQEhAyAIQQ5HDQgMBQsCQCABLQCBAUEgcQ0AQQEhAwwBCyAGKAIYIQkgBigCFCEKIAYoAhAhAwJAIAYpAwgiGEIDg0IAUg0AIBinIgsgCygCACILQQFqNgIAIAtBf0wNCgsgBSAJNgLYAyAFIAo2AtQDIAUgAzYC0AMgBSAYNwPIAyAFIAYtABw6ANwDIAVBMGogBUHIA2oQlBMCQAJAAkACQAJAAkACQAJAAkAgBSgCMCIJIAUoAjQiCkG+ppsBQQcQwh4NAAJAIAkgCkHFppsBQQYQwh4NACAFQYAGaiABIAMgBCAFKQPIA0EAEKQEDAYLIAEtAMgBQQJHDQEgBUHABmogBUHIA2pBEGopAwA3AwAgBUGoBmpBEGogBUHIA2pBCGopAwA3AwAgBSAFKQPIAzcDsAYgBUIANwOoBiAFQcAFaiABEKoJIAUoAsAFIgpBgICAgHhGDQQgBUGYBGpBCGogBUHEBWoiCUEIaikCADcDACAFIAkpAgA3A5gEIAEoArwBIQtBCEHYABCZIiIJRQ0SIAkgBSkDqAY3AwAgCSAKNgIgIAlBGGogBUGoBmpBGGopAwA3AwAgCUEQaiAFQagGakEQaikDADcDACAJQQhqIAVBqAZqQQhqKQMANwMAAkBBIUUNACAJQSRqIAVBmARqQSH8CgAACyAJQQA6AFIgCUGAAjsBUCAJIAs2AkwgCSADNgJIIAlBAjoARSAFIAk2AoQGIAVBBzYCgAYMAgsgBUGYBGogASADIAQQywEgBSgCnAQhAyAFKAKYBCIJQQlGDQIgBUHABWpBGGoiCiAFQZgEakEgaikDADcDACAFQcAFakEQaiILIAVBmARqQRhqKQMANwMAIAVBwAVqQQhqIgwgBUGYBGpBEGopAwA3AwAgBSAFKQOgBDcDwAUCQAJAIAlBCEYNACAFQeAEakEQaiAMKQMANwMAIAVB4ARqQRhqIAspAwA3AwAgBUHgBGpBIGogCikDADcDACAFIAM2AuQEIAUgCTYC4AQgBSAFKQPABTcD6AQgBUGABmogBUHgBGoQ3AsMAQsgBUEINgKABgsgBSkDyAMQ8x8MBAsgBUEINgKABiAFKQPIAxDzHwsgBBD5HwwCCyAFIAM2AoQGIAUpA8gDEPMfDAILIAUgBSgCxAUiAzYChAYgBUGoBmoQ6h4gBBD5HwwBCyAFKAKEBiEDIAUoAoAGIglBCUYNACAFQaADakEgaiAFQYAGakEgaikDADcDACAFQaADakEYaiAFQYAGakEYaikDADcDACAFQaADakEQaiAFQYAGakEQaikDADcDACAFIAUpA4gGNwOoAyAFIAM2AqQDIAUgCTYCoAMgCUEIRg0CAkBBKEUNACAFQeAEakEEaiAFQaADakEo/AoAAAsgAEERNgIAQSxFDQEgAEEEaiAFQeAEakEs/AoAAAwBCyAAQRM2AgAgACADNgIEC0EAIQMMAgsgBUGgA2oQsSFBACEDCwJAAkACQAJAIAEtAIEBQSBxRQ0AIAYoAgBBGkcNACAFQShqIAZBCGoQlBMCQCAFKAIoIgogBSgCLCILQcymmwFBBhDCHg0AIAogC0HHs5sBQQYQwh5FDQILIAEtAMgBIglBggFHDQMMAgsgAS0AyAEhCQwCCyABLQDIASEJIAogC0GUpZsBQQgQwh5FDQEgCUH/AXFBggFHDQELIAEQ4w4gBigCFCEJIAYoAhAhBiAFQa6BgIB4NgLgBCABIAYgCSAFQeAEahDeHCAFQSBqIAEgAhDIBCAFKAIkIQECQAJAIAUoAiBBAXFFDQBBEyEGQQQhAgwBCyAAQQQ2AghBESEGQQwhAgsgACAGNgIAIAAgAmogATYCAAwBCwJAAkACQAJAIAlB/wFxIgpBfWoOBAIAAAEACyAKQaMBRg0BIAEtAMkBQQFxDQEgASgCxAEhCiABKALAASELIAlBUWpB/wFxQQ1JDQIgCUFzakH/AXFBCkkNAiAFQRhqIAYQ0gMgBUG1gICAeDYC4AQgBSAFKQMYNwLkBCALIAogBUHgBGoQhBchBgJAIAEtAMgBQaIBRw0AIAEQ1xIhAiABEOMOIAEgAhD6EgsgAEETNgIAIAAgBjYCBAwDCyABEOMOCyAAIAI2AgggACAGNgIEIABBEjYCACAAIAEoArwBNgIMIAhBDkcNBgJAIAcoAgBBGkYNACAHEMMGCyAHQcAAQQgQvRMMBgsgBUH2gICAeDYC4AQgASALIAogBUHgBGoQ3hwgBUEQaiABIAZBABCmDSAFKAIUIQYCQCAFKAIQQQFxDQAgACACNgIIIAAgBjYCBCAAQRI2AgAgACABKAK8ATYCDCAIQQ5GDQQMBgsgAEETNgIAIAAgBjYCBCAIQQ5HDQUMAwsgBUHwA2oQmiEgCEEORw0EDAILQQhBMBCZIiIIRQ0GIAggBjYCDCAIIAI2AgggCCAONgIEIAggCjYCACAIIAUpA5gENwIQIAggCzYCLCAIIAM2AiggCEEYaiAFQZgEakEIaikDADcCACAIQSBqIAVBqARqKQMANwIAIAUoAqgGIQIgBSAFKAKsBiIGIA1BAnRqIgM2AuwEIAUgAjYC6AQgBSAGNgLgBAJAA0AgCUUNASABIAYoAgAQ+hIgCUF8aiEJIAZBBGohBgwACwsgBSADNgLkBCAFQeAEahDEFCABKALgAUEDdCEGIAEoAtwBIQJBACEDAkADQCAGRQ0BAkAgAiAFQYAGahD5Cw0AIAZBeGohBiADQQFqIQMgAkEIaiECDAELCyADIAEoAuABIgZPDQMgASgC3AEgA0EDdGoiAikDACEYAkAgBiADQX9zakEDdCIDRQ0AIAIgAkEIaiAD/AoAAAsgASAGQX9qNgLgASAYEPMfCyAAIAUpA4AGNwMQIAAgCDYCKCAAIA82AgggAEEFNgIAIAAgASgCvAE2AgwgAEEYaiAFQYgGaikDADcDACAAQSBqIAVBkAZqKQMANwMACyABIAw2AnhBASEDCwJAIAcoAgBBGkYNACAHEMMGCyAHQcAAQQgQvRMMAQsgAyAGQfTEmwEQxxIACyADRQ0BCyAEEPkfCyAFQeAGaiQADwsAC9t3AiV/Cn4jAEHwBGsiAiQAQQAhAwJAAkAgASkDACInpyIEDQAgAC0AGw0AIAEoAhwhBSABKAIgQThsIQYDQCAGRQ0BIAUgBkFIaiIGaiIHKAIAIghBBUsNAAsgB0E4aiIGIAhBAnQiBUHI450BaigCAGooAgAhCSAGIAVB4OOdAWooAgBqKAIAIQpBASEDDAELCwJAIAAtABgiCw0AIAAtABohBiACQagEakEQaiIFQQApA5D/nAEiJzcDACACQagEakEYaiIHQQApA5j/nAEiKDcDACACQagEakEIaiIIIABBCGoiDCkCADcDACAAKQIAISkgACAnNwIAIAwgKDcCACACICk3A6gEIAJBsAFqQQhqICg3AwAgAkGwAWpBEGogJzcDACACQbABakEYaiAoNwMAIAJBEGpBCGogKDcDACACQRBqQRhqICg3AwAgAkEQakEQaiAnNwMAIAIgJzcDsAEgAkGIA2pBCGoiDCAoNwMAIAJBiANqQRBqIg0gJzcDACACQYgDakEYaiIOICg3AwAgAkEAOgBQIAIgJzcDECACICc3A4gDIAJBEGpBOGoiDyAoNwMAIAJBEGpBMGoiECAnNwMAIAJBEGpBKGoiESAoNwMAIAIgJzcDMCACIAY6AMgDIA4gBykDADcDACANIAUpAwA3AwAgDCAIKQMANwMAIAIgAikDqAQ3A4gDIAJBiANqQThqIA8pAwA3AwAgAkGIA2pBMGogECkDADcDACACQYgDakEoaiARKQMANwMAIAIgAikDMDcDqAMCQAJAIARFDQAgASgCICIFRQ0BIAEoAhwhBiAFQTBsIQUDQAJAIAYoAgBBEUcNACAGQQhqKAIAQQdHDQAgBiACQagEahCvAQsgBkEwaiEGIAVBUGoiBQ0ADAILCyACQagDaiERAkAgASgCICIGRQ0AIAEoAhwiBSAGQThsaiEEIAZBOGwhByAFIQYDQAJAAkAgBigCAEEJRw0AIAZBCGogAkGIA2oQxAMMAQsgBiACQYgDahDXAQsgBkE4aiEGIAdBSGoiBw0ACyACQYgDakEwaiEMA0ACQAJAIAUoAgAiBkEJRw0AIAUoAghBEUcNASAFQQhqIBEQkgQMAQsCQAJAAkACQAJAAkACQAJAIAYOCQABAgMEBQYHCAALIAUoAgwiB0UNByAFKAIIIQYCQCAFLQAgDQAgB0HIAGwhBwNAAkAgBikDAEIDWg0AIAZBwABqLQAAQQFHDQAgAkGwAWogBkEgaikDACAGQTBqKAIAEOcaIBEgAikDsAEgAigCuAEQkQYaCyAGQcgAaiEGIAdBuH9qIgcNAAwJCwsgB0HIAGwhBwNAAkACQAJAAkAgBikDAEJ9fCInp0EBakEAICdCAlQbDgMCAQACCyACQbABaiAGQRBqKQMAIAZBIGooAgAQ5xogESACKQOwASACKAK4ARCRBhoMAgsgAkGwAWogBkEQaikDACAGQSBqKAIAEOcaIBEgAikDsAEgAigCuAEQkQYaDAELIAJBsAFqIAZBIGopAwAgBkEwaigCABDnGiARIAIpA7ABIAIoArgBEJEGGgsgBkHIAGohBiAHQbh/aiIHDQAMCAsLIAVBCGogERCkBgwGCyAFKAIcIgZFDQUgBkEIaigCACIHRQ0FIAZBBGooAgAhBiAHQQxsIQcDQAJAAkAgBigCACIIDQAgBkEEaigCACAREK8GDAELIAggERBuCyAGQQxqIQYgB0F0aiIHDQAMBgsLAkACQCAFKAIIDgMAAQYACyAFLQAkQQJGDQUgAkGwAWogBSkDECAFQSBqKAIAEOcaIAwgAikDsAEgAigCuAEQkQYaDAULIAUtACRBAkYNBCACQbABaiAFKQMQIAVBIGooAgAQ5xogDCACKQOwASACKAK4ARCRBhoMBAsgBSgCBCAREG4MAwsgBSgCECIGRQ0CIAZBCGooAgAiB0UNAiAGQQRqKAIAIQYgB0EMbCEHA0ACQAJAIAYoAgAiCA0AIAZBBGooAgAgERCvBgwBCyAIIBEQbgsgBkEMaiEGIAdBdGoiBw0ADAMLCwJAIAUoAgQiBi0AQQ0AIAJBsAFqIAYpAyggBkE4aigCABDnGiAMIAIpA7ABIAIoArgBEJEGGgwCCyACQbABaiAGKQMoIAZBOGooAgAQ5xogESACKQOwASACKAK4ARCRBhoMAQsgBSgCBCAREG4LIAVBOGoiBSAERw0ACwsgAkHIA2ohEgJAIAIoAqQDIgRFDQAgAkGYAmpBCGpBACkDmP+cATcDACACQQApA5D/nAE3A5gCAkACQCACKAKUAyITRQ0AIAIoAogDIghBCGohBSAIKQMAQn+FQoCBgoSIkKDAgH+DISoDQAJAICpCAFINAANAIAhBgH9qIQggBSkDACEnIAVBCGoiBiEFICdCgIGChIiQoMCAf4MiJ0KAgYKEiJCgwIB/UQ0ACyAnQoCBgoSIkKDAgH+FISogBiEFCyAIICp6p0EBdEHwAXFrIgZBcGoiDikDACAGQXhqKAIAEJ0aIidCGYhCgYKEiJCgwIABfiEoIAIoApwDIgwgJ6dxIQcgE0F/aiETICpCf3wgKoMhKiACKAKYAyIGQWBqIQ9BACEUAkACQANAAkAgBiAHaikAACIpICiFIidCf4UgJ0L//fv379+//358g0KAgYKEiJCgwIB/gyInUA0AA0AgDiAPICd6p0EDdiAHaiAMcSIQQQV0IhVrEKkgDQMgJ0J/fCAngyInUEUNAAsLICkgKUIBhoNCgIGChIiQoMCAf4NQRQ0CIAcgFEEIaiIUaiAMcSEHDAALCyAGQQAgEGtBBXRqIQ5BgAEhBwJAIAYgFUEFdSIPaiIQKQAAIicgJ0IBhoNCgIGChIiQoMCAf4N6p0EDdiAGIA9BeGogDHFqIgYpAAAiJyAnQgGGg0KAgYKEiJCgwIB/g3mnQQN2akEHSw0AIAIgAigCoANBAWo2AqADQf8BIQcLIBAgBzoAACAGQQhqIAc6AAAgAiAEQX9qNgKkAyAOQWBqKQMAIihQDQAgDkF4aigCACEGIA5BcGopAwAhJwJAIChCA4NCAFINACAopyIHIAcoAgAiBEF/ajYCAAJAIARBAUcNACAHIAcoAhAQ6R0LICdQDQELA0AgAiAGNgKwBCACICc3A6gEICcgBhCdGiEnIAIoApgDIgZBYGohDCAnQhmIQoGChIiQoMCAAX4hKCACKAKcAyIEICencSEHQQAhEAJAA0ACQAJAAkAgBiAHaikAACIpICiFIidCf4UgJ0L//fv379+//358g0KAgYKEiJCgwIB/gyInUA0AAkADQCACQagEaiAMICd6p0EDdiAHaiAEcSIOQQV0Ig9rEKkgDQEgJ0J/fCAngyInUA0CDAALCyAGQQAgDmtBBXRqIQxBgAEhBwJAIAYgD0EFdSIOaiIPKQAAIicgJ0IBhoNCgIGChIiQoMCAf4N6p0EDdiAGIA5BeGogBHFqIgYpAAAiJyAnQgGGg0KAgYKEiJCgwIB/g3mnQQN2akEHSw0AIAIgAigCoANBAWo2AqADQf8BIQcLIA8gBzoAACAGQQhqIAc6AAAgAiACKAKkA0F/ajYCpAMgDEFgaikDACIoUA0BIAxBeGooAgAhBiAMQXBqKQMAIScgKEIDg0IAUg0EICinIgcgBygCACIEQX9qNgIAIARBAUcNBCAHIAcoAhAQ6R0MBAsgKSApQgGGg0KAgYKEiJCgwIB/g1ANAQtCACEnIA0hBgwCCyAHIBBBCGoiEGogBHEhBwwACwsgAkGYAmogAikDqAQgAigCsAQQkQYaIAYhDSAnQgBSDQALCyACKAKkAyIERQ0CIBMNAAsLIAIoApgDIghBCGohBiAIKQMAQn+FQoCBgoSIkKDAgH+DIScgCCEFA0ACQCAnQgBSDQADQCAFQYB+aiEFIAYpAwAhJyAGQQhqIgchBiAnQoCBgoSIkKDAgH+DIidCgIGChIiQoMCAf1ENAAsgJ0KAgYKEiJCgwIB/hSEnIAchBgsgBSAneqdBAnRB4ANxa0FgahDrESAnQn98ICeDIScgBEF/aiIEDQALAkAgAigCnAMiBkUNACAGQQlqIgVFDQAgCEH/ASAF/AsACyACQQA2AqQDIAIgBiAGQQFqQQN2QQdsIAZBCEkbNgKgAwsgAigCmAIiBSkDACEnIAIoAqQCIQgCQAJAIAIoApwCIgYNAEIAIShBACEEDAELIAUgBkEEdGtBcGqtQiCGIAZBEWxBGWqthCEoQQghBAsgBUEIaiEHIAUgBmpBAWohBiAnQn+FQoCBgoSIkKDAgH+DIScCQCAIQQFqQQF2IAggAigClAMbIgwgAigCkANNDQAgAkGIA2ogDCACQZgDahCoAhoLIAIgKDcC1AEgAiAENgLQASACIAg2AsgBIAIgBTYCwAEgAiAGNgK8ASACIAc2ArgBIAIgJzcDsAECQCAIRQ0AIAchBgNAAkAgJ0IAUg0AA0AgBUGAf2ohBSAGKQMAIScgBkEIaiIHIQYgJ0KAgYKEiJCgwIB/gyInQoCBgoSIkKDAgH9RDQALICdCgIGChIiQoMCAf4UhJyAHIQYLIAJBiANqIAUgJ3qnQQF0QfABcWsiBEFwaikDACAEQXhqKAIAEJEGGiAnQn98ICeDIScgCEF/aiIIDQALIAIgBTYCwAEgAiAHNgK4ASACQQA2AsgBIAIgJzcDsAELIAJBsAFqEN0LIAIoAtABIgZFDQAgAigC1AEiBUUNACACKALYASAFIAYQvRMLIAIgETYCuAEgAiASNgKwASACIAJBqARqNgK8ASACIAJBiANqNgK0ASABKAIgIghFDQAgASgCHCEGQQAhBwJAAkACQANAIAdBAWohBQJAIAJBsAFqIAYQ1gINACAGKAIAQQlGDQIgBhDNBQwDCyAGQThqIQYgBSEHIAggBUcNAAtBACEEDAILIAZBCGoQ6QMLAkAgBSAIRw0AQQEhBAwBCyAGQThqIQYgB0F/cyAIaiEHQQEhBANAAkACQCACQbABaiAGENYCDQAgBEEBaiEEAkAgBigCAEEJRg0AIAYQzQUMAgsgBkEIahDpAwwBCyAGIARBSGxqIgUgBikDADcDACAFQTBqIAZBMGopAwA3AwAgBUEoaiAGQShqKQMANwMAIAVBIGogBkEgaikDADcDACAFQRhqIAZBGGopAwA3AwAgBUEQaiAGQRBqKQMANwMAIAVBCGogBkEIaikDADcDAAsgBkE4aiEGIAdBf2oiBw0ACwsgASAIIARrNgIgCyACQYgDahCWCgJAIAIoAqwDIgZFDQAgAigCqAMgAigCtAMQ3AwgBiAGQQR0QRdqQXBxIgVqQQlqIgZFDQAgAigCqAMgBWsgBkEIEL0TCwJAIAIoArwDIgZFDQAgAigCuAMgAigCxAMQ3AwgBiAGQQR0QRdqQXBxIgVqQQlqIgZFDQAgAigCuAMgBWsgBkEIEL0TCyACQRBqEJYKIAEpAwAhJwsgAkEAOgCIAyABQRhqIRACQAJAICenQQFxRQ0AIBAgAkGIA2oQlQYMAQsgECACQYgDahDzCCABKAIgIgVFDQAgASgCHCEGIAVBOGwhBQNAAkACQAJAIAYoAgBBCUcNACAGQQhqIgcQwAsNASAHKAIAQQFGDQIgAkEQakEoaiAHQShqKQMANwMAIAJBEGpBIGogB0EgaikDADcDACACQRBqQRhqIAdBGGopAwA3AwAgAkEQakEQaiAHQRBqKQMANwMAIAJBEGpBCGogB0EIaikDADcDACAGQRBqQQA2AgAgBykDACEnIAdCATcDACACICc3AxAgAkEQahDpAwwCCyAGIAJBiANqEKEEDAELIAcgAkGIA2oQ0wELIAZBOGohBiAFQUhqIgUNAAsLIAAtAB0hBiAALQAcIQUgAC0AGSEHIAAoAhQhCEEAIAAoAhAQjQYhBEEAIAgQjQYhCCACQZQDakEAKQOY/5wBIic3AgAgAkHoAGogJzcDACACQcgAaiAnNwMAIAJB2ABqICc3AwAgAkEAKQOQ/5wBIic3AowDIAJBNGogAkGQA2opAgA3AgAgAkE8aiACQZgDaigCADYCACACQgA3AyAgAkEANgIQIAIgJzcDYCACICc3A0AgAiAnNwNQIAIgAikCiAM3AiwgAkEAOgCsASACIAc6AKsBIAIgCzoAqgEgAiAFOgCpASACIAY6AKgBIAJCBDcDoAEgAkIANwOYASACQoCAgICAATcDkAEgAkIINwOIASACQgA3A4ABIAJCgICAgIABNwN4IAIgCDYCdCACIAQ2AnACQAJAIAEoAgAiEUEBRw0AIAEoAiAiBUUNASABKAIcIQYgBUEwbCEFA0AgBiACQRBqEP8DIAZBMGohBiAFQVBqIgUNAAwCCwsgASgCICIFRQ0AIAEoAhwhBiAFQThsIQUDQAJAAkAgBigCAEEJRw0AIAZBCGogAkEQahD/AwwBCyAGIAJBEGoQvAELIAZBOGohBiAFQUhqIgUNAAsLAkACQAJAIAIoAkxFDQACQAJAIAIoAkQiBg0AQQAhE0GI/5wBIQ1BACEEQQAhAAwBCyACQYgDakEgQQggBkEBahDHDSACKAKIAyENIAIoAkAhDgJAIAIoAowDIhNBCWoiBkUNACANIA4gBvwKAAALAkAgAigCTCIARQ0AIA5BCGohBiAOKQMAQn+FQoCBgoSIkKDAgH+DIScgACEIIA4hBQNAAkAgJ0IAUg0AA0AgBUGAfmohBSAGKQMAIScgBkEIaiIHIQYgJ0KAgYKEiJCgwIB/gyInQoCBgoSIkKDAgH9RDQALICdCgIGChIiQoMCAf4UhJyAHIQYLIAUgJ3qnQQJ0QeADcWsiB0FoaigCACEEAkAgB0FgaikDACIpQgODQgBSDQAgKaciDyAPKAIAIg9BAWo2AgAgD0F/TA0FCwJAIAdBcGopAwAiKFANACAHQXhqKAIAIQwgKEIDg0IAUg0AICinIg8gDygCACIPQQFqNgIAIA9Bf0wNBQsgJ0J/fCAngyEnIA0gByAOa2oiB0F4aiAMNgIAIAdBcGogKDcDACAHQWhqIAQ2AgAgB0FgaiApNwMAIAhBf2oiCA0ACwsgAigCSCEECwJAIAIoAhAiDEUNACACKAIUIg5FDQACQCACKAIcIghFDQAgDEEIaiEGIAwpAwBCf4VCgIGChIiQoMCAf4MhJyAMIQUDQAJAICdCAFINAANAIAVBgH5qIQUgBikDACEnIAZBCGoiByEGICdCgIGChIiQoMCAf4MiJ0KAgYKEiJCgwIB/UQ0ACyAnQoCBgoSIkKDAgH+FIScgByEGCyAFICd6p0ECdEHgA3FrQWBqELIRICdCf3wgJ4MhJyAIQX9qIggNAAsLIA4gDkEFdEEnakFgcSIGakEJaiIFRQ0AIAwgBmsgBUEIEL0TCyACIAA2AhwgAiAENgIYIAIgEzYCFCACIA02AhALAkAgEUEBcUUNACACQRBqIBAQ5AQMAgtBAEEAEJcTEI0GIRYQ0BohKEEAQQAQlxMQjQYhFxDRGiEpAkACQCABKAIgIgYNACApQgODIStBACEGDAELIAEoAhwiBSAGQThsaiEMIAIoAnAhGCApQgODISsgBUE4aiEEIAJBqARqQQRqIQsgKachGSACQagEakEEciEHIAJBiANqQQRyIQggAkHFA2ohGiACQYgDakEcaiEbIAItAKgBIRUgAkGIA2pBBGoiEUEQaiEcIAJBiANqQRhqIQ9BACEdQQAhDgJAAkADQCAFIQYgBCEFAkACQAJAAkACQAJAIAYoAgBBemoOAgABBQsgBigCBCIELQBBDQQCQAJAAkACQAJAIAQpAwBQDQAgFQ4EAgkBBAILIAJBiANqIARBCGoQsAggAkGwAWogAkGIA2oQhQcgBigCBCIEQTBqIg0pAwAhKiANQgA3AwAgBCkDKCEsIARCATcDKCAEQThqKQMAIS0gBEE1akIANwAAIBEgLDcCACARQQhqICo3AgAgHCAtNwIAIAJBsAFqEKMPIQ1BAC0A4PadARpBOBCEASIERQ0NIARBADYCACAEIAIpAogDNwIEIARBADoANCAEIA02AjAgBEIANwMoIARBADYCICAEQQxqIAJBiANqQQhqIhIpAgA3AgAgBEEUaiACQYgDakEQaiIeKQIANwIAIARBHGogDygCADYCAEEAQQgQ7yJBAC0A4PadARogBigCBCINKAIkIQAgDSgCICETIA0tAEAhFEEcEIQBIQ0CQCAUDQAgDUUNDiANQYAEOwEYIA1BADYCFCANIAA2AhAgDSATNgIMIA1BATYCCCANIAQ2AgQgDUEBNgIAQQkhFEERIQQMCAsgDUUNDSANQgA3AgxBASEUIA1BATYCCCANIAQ2AgQgDUEBNgIAQQIhBCANQQI6ABkgDUERakIANwAADAcLAkAgK0IAUg0AIBkgGSgCACINQQFqNgIAIA1Bf0wNDQtBAC0A4PadARpBEBCEASINRQ0MEKwkISwgAkHwAWpBEGogBEEQaiIAKQMAIi03AwAgAkHwAWpBCGogBEEIaiITKQMAIi43AwAgE0IANwMAIAQpAwAhKiAEICw3AwAgAEIANwMAIAIgKjcD8AEgC0EQaiISIC03AgAgC0EIaiIeIC43AgAgCyAqNwIAIAJBmAJqQQhqIgAgAkGoBGpBCGoiHykCADcDACACQZgCakEQaiITIAJBqARqQRBqIiApAgA3AwAgAkGYAmpBGGoiFCACQagEakEYaiIhKAIANgIAIAIgAikCqAQ3A5gCQQAtAOD2nQEaQcAAEIQBIgRFDQwgBEEANgIIIARBGzYCACAEIAIpA5gCNwIMIARBFGogACkDADcCACAEQRxqIBMpAwA3AgAgBEEkaiAUKAIANgIAIA0gBDYCDCANQQA2AgBBAC0A4PadARpBwAAQhAEiBEUNDCAEQQA6ABwgBCAXNgIYIARCADcDECAEICk3AwggBEEaNgIAIBtCADcCACAbQQhqQgA3AgAgAkEFOgCgAyACIAQ2ApgDIAJBATYClAMgAiANNgKQAyACQQE2AowDIAJCADcCwAQgAkEDOgC8BCACQQA2ArgEIAJCADcCyAQgAkIANwKwBCACQoCAgIDAADcCqAQgAkEXNgKIAyACQagEahCaGkEAQQQQ+CIgBigCBCIEQTBqIg0pAwAhKiANQgA3AwAgBCkDKCEsIARCATcDKCAEQThqKQMAIS0gBEE1akIANwAAIAsgLDcCACAeICo3AgAgEiAtNwIAIAJBiANqEKMPIQ1BAC0A4PadARpBOBCEASIERQ0MIARBADYCACAEIAIpAqgENwIEIARBADoANCAEIA02AjAgBEIANwMoIARBADYCICAEQQxqIB8pAgA3AgAgBEEUaiAgKQIANwIAIARBHGogISgCADYCAEEAQQgQ7yJBAC0A4PadARogBigCBCINKAIkIQAgDSgCICETIA0tAEAhFEEcEIQBIQ0gFA0BIA1FDQwgDUGABDsBGCANQQA2AhQgDSAANgIQIA0gEzYCDCANQQE2AgggDSAENgIEIA1BATYCAEERIQRBCSEUDAULQQAtAOD2nQEaQRAQhAEiAEUNCxCsJCEsIAJBmAJqQRBqIARBEGoiDSkDACItNwMAIAJBmAJqQQhqIARBCGoiEykDACIuNwMAIBNCADcDACAEKQMAISogBCAsNwMAIA1CADcDACACICo3A5gCIBwgLTcCACARQQhqIC43AgAgESAqNwIAIAJBqARqQQhqIhQgAkGIA2pBCGoiIikCADcDACACQagEakEQaiISIAJBiANqQRBqIiMpAgA3AwAgAkGoBGpBGGoiHiAPKAIANgIAIAIgAikCiAM3A6gEQQAtAOD2nQEaQcAAEIQBIgRFDQsgBEEANgIIIARBGzYCACAEIAIpA6gENwIMIARBFGogFCkDADcCACAEQRxqIBIpAwA3AgAgBEEkaiAeKAIANgIAIAAgBDYCDCAAQQA2AgBBAC0A4PadARpBwAAQhAEiBEUNC0EAISAgBEEAOgAcIAQgGDYCGCAEQgA3AxAgBELx5JWL166aueUANwMIIARBGjYCACACQgA3AqADIAJBAzoAnAMgAkEANgKYAyACQgA3AqgDIAJCADcCkAMgAkKAgICAwAA3AogDIAJBiANqEJoaQQBBBBD4IgJAIAYoAgQiDS0AQA0AQQUhIUEXISRBACETDAQLIA0oAjQhICANKAIwISECQCANKQMoIipCA4NCAFINACAqpyINIA0oAgAiDUEBajYCACANQX9MDQwLQQAtAOD2nQEaQcAAEIQBIhNFDQsgE0EAOgAcIBMgGDYCGCATQgA3AxAgE0LxyuGD982cuvMANwMIIBNBGjYCAEEALQDg9p0BGkHAABCEASINRQ0LIA1CADcCMCANQQU6ABggDSAENgIQQQEhJCANQQE2AgwgDSAANgIIIA1Cl4CAgBA3AwAgDUIANwIcQQAhACANQQA6ADwgDSAlNgI4IA1BJGpCADcCACAhQQh2IR8gKkIgiKchJiAqpyEEIA0hJQwDCyANRQ0KIA1CADcCDEEBIRQgDUEBNgIIIA0gBDYCBCANQQE2AgBBAiEEIA1BAjoAGSANQRFqQgA3AAAMAwtBACgC/PWdASIGRQ0EIARBJGooAgAhDSAEKAIgIQAgAkGIA2ogBkEDQcTxmgFBwQEQ+w1BAC0A4PadARogAigCjAMhBkEIEIQBIgRFDQkgBCANNgIEIAQgADYCACAGKAIcIAZBIGoiACgCABDMIiAGQSxqIg0oAgAgBkEwaigCABDsHCAGKAIoIA0oAgAQzSIgDUIENwIAIAZCATcCJCAAIAQ2AgAgBkEBNgIcIAJBqARqQQhqIAJBiANqQQhqKAIANgIAIAIgAikCiAM3A6gEIAJBqARqEMYCIAJBqARqELANDAQLIAJBiANqQTBqIAZBMGopAwA3AwAgAkGIA2pBKGogBkEoaikDADcDACACQYgDakEgaiAGQSBqKQMANwMAIA8gBkEYaikDADcDACACQYgDakEQaiAGQRBqIgQpAwA3AwAgAkGIA2pBCGogBkEIaiINKQMANwMAIA1CATcCACACIAYpAwA3A4gDIAZBCTYCACAEQQA2AgAgBkEcaiACQZgCakEIaikCADcCACAGQSRqIAJBmAJqQRBqKQIANwIAIAZBLGogAkGYAmpBGGopAgA3AgAgBkE0aiACQZgCakEgaigCADYCACAGIAIpApgCNwIUAkAgAigCiAMiBkEJRg0AIAcgCCkCADcCACAHQTBqIAhBMGooAgA2AgAgB0EoaiAIQShqKQIANwIAIAdBIGogCEEgaikCADcCACAHQRhqIAhBGGopAgA3AgAgB0EQaiAIQRBqKQIANwIAIAdBCGogCEEIaikCADcCACACIAY2AqgEAkACQCAGQQdHDQAgAigCrAQiBkUNAQJAIA4NACACKQOwBCEnIAYhDgwHCyAGEOQBIAZBwABBCBC9EwwGCyACQagEahDNBQtBtPGaARDJIgALIAJBkANqEOkDQaTxmgEQySIACyAaIAIvAJgCOwAAIAIgHzsAoQMgAkGIA2pBG2ogH0EQdjoAACAaQQJqIAJBmAJqQQJqLQAAOgAAIAJBADoAxAMgAiAlNgLAAyACQgA3A7gDIAIgEzYCsAMgAkIANwOoAyACICA2AqQDIAIgIToAoAMgAiAmNgKcAyACIAQ2ApgDIAJBATYClAMgAiAANgKQAyACQQE2AowDIAIgJDYCiAMgBigCBCIEQTBqIg0pAwAhKiANQgA3AwAgBCkDKCEsIARCATcDKCAEQThqKQMAIS0gBEE1akIANwAAIAsgLDcCACALQQhqICo3AgAgC0EQaiAtNwIAIAJBiANqEKMPIQ1BAC0A4PadARpBOBCEASIERQ0HIARBADYCACAEIAIpAqgENwIEIARBADoANCAEIA02AjAgBEIANwMoIARBADYCICAEQQxqIBQpAgA3AgAgBEEUaiASKQIANwIAIARBHGogHigCADYCAEEAQQgQ7yJBAC0A4PadARogBigCBCINKAIkIQAgDSgCICETQRwQhAEiDUUNByANQYAEOwEYIA1BADYCFCANIAA2AhAgDSATNgIMIA1BATYCCCANIAQ2AgQgDUEBNgIAAkACQCAGKAIAQQlGDQAgBhDNBQwBCyAGQQhqEOkDCyAGQQk2AgAgBkERNgIIIAYgDTYCFCAGQQI2AhAgBiACKQKIAzcCGCAGQSBqICIpAgA3AgAgBkEoaiAjKQIANwIAIAZBMGogDykCADcCAAwCCwJAAkAgBigCAEEJRg0AIAYQzQUMAQsgBkEIahDpAwsgBiAUNgIAIAYgDTYCDCAGIAQ2AgggBiANNgIUIAZBAjYCECAGIAA2AjQgBiATNgIwIAYgAikCiAM3AhggBkEgaiACQYgDakEIaikCADcCACAGQShqIAJBiANqQRBqKQIANwIAIAVBAEE4IAUgDEYiBhtqIQRBASEdIAZFDQIMAwsCQAJAIAYoAgBBCUYNACAGEM0FDAELIAZBCGoQ6QMLIAYgFDYCACAGIA02AgwgBiAENgIIIAYgDTYCFCAGQQI2AhAgBiAANgI0IAYgEzYCMCAGIAIpAogDNwIYIAZBIGogEikCADcCACAGQShqIB4pAgA3AgALIAVBOGohBCAFIAxHDQALQQAhBiAdQQFxRQ0BC0EALQDg9p0BGkHIABCEASIHRQ0CAkAgKEIDg0IAUg0AICinIgYgBigCACIGQQFqNgIAIAZBf0wNAwsgAhDSGjcDiAIgAkIANwOQAiAHQQhqIAJBiAJqENseIAdCADcDOCAHQQA6ADQgByAWNgIwIAdCADcDKCAHICg3AyAgB0IANwMAIAdBwABqQQA6AAAgAkLh2r2j1o7bMjcDiAMgAkEIaiACQYgDahCUEyACKAIIIAIoAgwQ+hchKgJAIAIpA4gDIixCA4NCAFINACAspyIGIAYoAgAiBUF/ajYCACAFQQFHDQAgBiAGKAIQEOkdC0EALQDg9p0BGkEYEIQBIg1FDQIgDUIANwMIIA0gKjcDACANQRBqQgA3AwBBAC0A4PadARpBEBCEASIIRQ0CQQAtAOD2nQEaQcAAEIQBIgVFDQIgBUEBOgAMIAVBADYCCCAFQiE3AwBBAC0A4PadARpBwAAQhAEiBkUNAiAGQgA3AxggBkKx6snjBjcDECAGQQA2AgggBkEUNgIAIAYgBTYCKCAGQSBqQgA3AwAgCCAGNgIMIAhBADYCAEEALQDg9p0BGkHAABCEASIGRQ0CIAZBADoAHCAGIBY2AhggBkIANwIQIAYgKDcCCCAGQRo2AgAgAkEFOgCgAyACIAY2ApgDIAJBATYClAMgAiAINgKQAyACQQE2AowDIAJCADcCwAQgAkEDOgC8BCACQQA2ArgEIAJCADcCyAQgAkIANwKwBCACQoCAgIDAADcCqAQgAkGsA2pCADcCACACQgA3AqQDIAJBFzYCiAMgAkGoBGoQmhpBAEEEEPgiAkAgK0IAUg0AIBkgGSgCACIGQQFqNgIAIAZBf0wNAwsgAkGIA2oQow8hCEEALQDg9p0BGkE4EIQBIgZFDQJBACEFIAZBADoANCAGIAg2AjAgBkIANwMoIAZBADYCICAGQQA6ABwgBiAXNgIYIAZCADcCECAGICk3AgggBkEANgIAQQBBCBDvIkEALQDg9p0BGkEcEIQBIgRFDQIgBEIANwIMIARBATYCCCAEIAY2AgQgBEEBNgIAIARBAjoAGSAEQRFqQgA3AAAgAkH6AWogAkGoBGpBCGopAgA3AQAgAkHwAWpBEmogAkGoBGpBEGooAgA2AQAgAkGYAmpBCGogAkGIA2pBCGopAgA3AwAgAkGYAmpBEGoiESACQYgDakEQaikCADcDACACQZgCakEYaiILIAJBiANqQRhqKQIANwMAIAIgAikCqAQ3AfIBIAIgAikCiAM3A5gCIAEoAhwhDwJAIAEoAiAiE0UNACAPIBNBOGxqIQxBACEFIA8hBgNAIAYoAgBBCUcNASAGQQhqKAIAQRJHDQEgBkEMaigCACIIKAIAQRtHDQEgCCgCCA0BIAVBAWohBSAGQThqIgYgDEcNAAsgEyEFCyACIAUgBSATQaT3mgEQ9xogAkGqA2pCADcBACABIAIoAgAiBTYCICACQboDaiACQfABakEIaikBADcBACACQYgDakE4aiACQf4BaikBADcBACACIBA2AogEIAJCADcCpAMgAiANNgKgAyACQQE2ApwDIAIgBzYCmAMgAkKAgICAEDcDkAMgAkKAgICAIDcDiAMgAiACKAIEIgA2AowEIAIgAikB8AE3AbIDIAIgEyAAazYCkAQgAiAPIABBOGxqIgg2AoQEIAIgDyAFQThsaiIGNgKABCACQegDaiACQZgCakEIaikDADcDACACQfADaiARKQMANwMAIAJB+ANqIAspAwA3AwAgAiAENgLcAyACQQI2AtgDIAJBETYC0AMgAkEJNgLIAyACIAIpA5gCNwPgAwJAIAUgAEYNACACQagEakEIaiELIAJBqARqQQRyIgdBMGohBCAHQShqIQwgB0EgaiENIAdBGGohDyAHQRBqIREDQCAGKAIAIgVBCkYNASAEIAZBNGooAgA2AgAgDCAGQSxqKQIANwIAIA0gBkEkaikCADcCACAPIAZBHGopAgA3AgAgESAGQRRqKQIANwIAIAdBCGogBkEMaikCADcCACAHIAZBBGopAgA3AgAgAiAFNgKoBAJAAkAgBUEJRg0AIAJBqARqEM0FDAELIAsQ6QMLIAZBOGoiBiAIRw0ACwsgAkGIA2pBCGohESACQoiAgICAATcDgAQCQAJAAkACQAJAAkAgEyAARw0AIBBBAhCoHiABKAIgIQYCQEHwAEUNACABKAIcIAZBOGxqIBFB8AD8CgAACyABIAZBAmo2AiAgAkECNgKIAwwBCwJAAkACQAJAAkACQCABKAIgIgYgAEcNACACKAKIAyEFDAELIAEoAhwiBSAAQThsaiEMIAUgBkE4bGohDUEAIQcgAigCiAMhBUEAIQgDQCAIQQJGDQMgAkGIA2ogB2oiBUEIaigCACIEQQpGDQIgDSAHaiIGIAQ2AgAgBkEEaiAFQQxqKQIANwIAIAZBDGogBUEUaikCADcCACAGQRRqIAVBHGopAgA3AgAgBkEcaiAFQSRqKQIANwIAIAZBJGogBUEsaikCADcCACAGQSxqIAVBNGopAgA3AgAgBkE0aiAFQTxqKAIANgIAIAEgASgCIEEBajYCICAHQThqIQcgCEEBaiIFIQggBkE4aiAMRw0ACyACIAU2AogDCyACQYAEaiEPQQIhByAFQQJGDQMgD0ECIAVrEIcSAkAgAigCiAQiCCgCCCIGIAIoAowEIgVHDQAgAigCiAMhBwwECyAIKAIEIgcgBUE4bGohDSAHIAZBOGxqIQUgAigCiAMiB0E4bCACQYgDampBDGohBiACKAKMAyEMAkADQCAMIAdGDQECQCAGQXxqKAIAIgRBCkYNACAFIAQ2AgAgBUEEaiAGKQIANwIAIAVBDGogBkEIaikCADcCACAFQRRqIAZBEGopAgA3AgAgBUEcaiAGQRhqKQIANwIAIAVBJGogBkEgaikCADcCACAFQSxqIAZBKGopAgA3AgAgBUE0aiAGQTBqKAIANgIAIAggCCgCCEEBajYCCCAHQQFqIQcgBkE4aiEGIAVBOGoiBSANRg0FDAELCyAHQQFqIQwLIAIgDDYCiAMMBAsgCEEBaiEFCyACIAU2AogDDAILIAIgBzYCiAMLIAJBqARqIAIoAowDIgQgB2siCEEIQTgQow4gAigCrAQhBiACKAKoBEEBRg0BIAJBADYC7AQgAiACKAKwBDYC6AQgAiAGNgLkBCACQeQEaiAIEKgeIAIoAuwEIQUgAigC6AQhBgJAIAQgB0YNAAJAIAhBOGwiDEUNACAGIAVBOGxqIAJBiANqIAdBOGxqQQhqIAz8CgAACyACIAQ2AogDIAUgCGohBQsgAiACKALkBDYCoAQgAiAGNgKYBCACIAY2ApwEIAIgBiAFQThsaiIcNgKkBAJAIAVFDQAgDyAFEIcSIAIoAogEIgQoAggiDCACKAKMBCIHRg0AIAQoAgQiDSAHQThsaiEAIAZBOGohCCAFQThsIQcgDSAMQThsaiEFIAJB2ARqIRMgAkHQBGohCyACQcgEaiEVIAJBwARqIRQgAkG4BGohEiACQbAEaiEeAkADQCAIIQwCQCAHDQAgHCEMDAILIAZBOGohDQJAIAYoAgAiD0EKRw0AIA0hDAwCCyAGQTRqKAIAIQggBkEsaikCACEqIAZBJGopAgAhLCAGQRxqKQIAIS0gBkEUaikCACEuIAZBDGopAgAhLyAGKQIEITAgBSAPNgIAIAVBBGogMDcCACAFQQxqIC83AgAgBUEUaiAuNwIAIAVBHGogLTcCACAFQSRqICw3AgAgBUEsaiAqNwIAIAVBNGogCDYCACATIAg2AgAgCyAqNwMAIBUgLDcDACAUIC03AwAgEiAuNwMAIB4gLzcDACAEIAQoAghBAWo2AgggAiAwNwOoBCAMQThqIQggB0FIaiEHIA0hBiAFQThqIgUgAEcNAAsLIAIgDDYCnAQLIAJBmARqEIEZCyACKAKEBCEHIAIoAoAEIQYgAkKIgICAgAE3A4AEIAcgBmtBOG4hBSACKAKIBCEIAkAgByAGRw0AIAIoApAEIgZFDQQgAigCjAQiByAIKAIIIgVGDQMgBkE4bCIERQ0DIAgoAgQiDCAFQThsaiAMIAdBOGxqIAT8CgAADAMLA0AgBhC6BSAGQThqIQYgBUF/aiIFDQALIAIoApAEIgZFDQMgAigCjAQiByAIKAIIIgVGDQEgBkE4bCIERQ0BIAgoAgQiDCAFQThsaiAMIAdBOGxqIAT8CgAADAELIAYgAigCsARBgJ2bARDYIAALIAggBSAGajYCCAwBCyAIIAUgBmo2AggLAkAgAigCjAMiBSACKAKIAyIGRg0AIAUgBmshBSARIAZBOGxqIQYDQAJAAkAgBigCAEEJRg0AIAYQzQUMAQsgBkEIahDpAwsgBkE4aiEGIAVBf2oiBQ0ACwtBASEGCyAORQ0AICdCIIinIQggJ6chBAJAAkACQCACLQCoAQ4EAAECAgALQamlmwFBBhD5FyEnQQAtAOD2nQEaQcAAEIQBIgdFDQMgB0EAOgAcIAcgGDYCGCAHQgA3AhAgByAnNwIIIAdBGjYCAEH88JoBQQcQ+RchJ0EALQDg9p0BGkHAABCEASIFRQ0DIAVCADcDGCAFICc3AxAgBUEANgIIIAVBATYCACAFQQA6ADwgBSAONgI4IAVCADcDMCAFIAc2AiggBUEgakIANwMAIAEoAhwhBwJAIAEoAiAiDEUNACAHIAxBOGxqIg1BSGoiDkUNACAOKAIAQQlHDQAgDUFQaiIOKAIAQQFHDQAgDhDpAyANQVxqIAg2AgAgDUFYaiAENgIAIA1BVGogBTYCACAOQRI2AgAgDUFgaiIFIAIpA4gDNwMAIAVBCGogAkGIA2pBCGopAwA3AwAgBUEQaiACQYgDakEQaikDADcDACAFQRhqIAJBiANqQRhqKQMANwMADAMLAkAgDCAQKAIARw0AIBBBhPGaARD8GCABKAIcIQcLIAcgDEE4bGoiByAINgIUIAcgBDYCECAHIAU2AgwgB0ESNgIIIAdBCTYCACAHIAIpA4gDNwMYIAdBIGogAkGQA2opAwA3AwAgB0EoaiACQZgDaikDADcDACAHQTBqIAJBoANqKQMANwMAIAEgDEEBajYCIAwCCwJAIAEoAiAiBSABKAIYRw0AIBBBlPGaARD8GAsgASgCHCAFQThsaiIHICc3AgggByAONgIEIAdBBzYCACABIAVBAWo2AiAMAQsCQEEAKAL89Z0BIgVFDQAgAkGIA2ogBUEDQYXzmgFBhQEQ+w1BAC0A4PadARogAigCjAMhBUEIEIQBIgdFDQIgByAINgIEIAcgBDYCACAFKAIcIAVBIGoiBCgCABDMIiAFQSxqIggoAgAgBUEwaigCABDsHCAFKAIoIAgoAgAQzSIgCEIENwIAIAVCATcCJCAEIAc2AgAgBUEBNgIcIAJBqARqQQhqIAJBiANqQQhqKAIANgIAIAIgAikCiAM3A6gEIAJBqARqEMYCIAJBqARqELANCyAOEOQBIA5BwABBCBC9EwsCQCArQgBSDQAgKaciBSAFKAIAIgdBf2o2AgAgB0EBRw0AIAUgBSgCEBDpHQsCQCAoQgODQgBSIAZyDQAgKKciBiAGKAIAIgVBf2o2AgAgBUEBRw0AIAYgBigCEBDpHQsgAkEQaiAQEJ0EIAIoAowBIgVFDQEgAkEANgKMASACKAKIASEGIAIoAoQBIQcgAkKAgICAgAE3AoQBIAIgBzYCkAMgAiAGNgKMAyACIAY2AogDIAIgBiAFQQR0ajYClAMgAkGwAWogAkGIA2oQ/AhBAC0A4PadARpBHBCEASIGRQ0AIAYgAikCsAE3AgAgBkIANwIMIAZBEmpCADcBACAGQQhqIAJBsAFqQQhqKAIANgIAAkAgASgCICIHIAEoAhhHDQAgEEGc7JoBEPwYCyABKAIcIAdBOGxqIgVCADcDMCAFIAY2AgwgBUECNgIIIAVBATYCACABIAdBAWo2AiBBAEEIEO8iDAELAAsCQCACKAIQIgRFDQAgAigCFCIMRQ0AAkAgAigCHCIIRQ0AIARBCGohBiAEKQMAQn+FQoCBgoSIkKDAgH+DIScgBCEFA0ACQCAnQgBSDQADQCAFQYB+aiEFIAYpAwAhJyAGQQhqIgchBiAnQoCBgoSIkKDAgH+DIidCgIGChIiQoMCAf1ENAAsgJ0KAgYKEiJCgwIB/hSEnIAchBgsgBSAneqdBAnRB4ANxa0FgahCyESAnQn98ICeDIScgCEF/aiIIDQALCyAMIAxBBXRBJ2pBYHEiBmpBCWoiBUUNACAEIAZrIAVBCBC9EwsCQCACKAI0IgZFDQAgAigCMCACKAI8ENwMIAYgBkEEdEEXakFwcSIFakEJaiIGRQ0AIAIoAjAgBWsgBkEIEL0TCwJAIAIpAyAiJ1ANACAnQgODQgBSDQAgJ6ciBiAGKAIAIgVBf2o2AgAgBUEBRw0AIAYgBigCEBDpHQsCQCACKAJEIgRFDQACQCACKAJMIghFDQAgAigCQCIFQQhqIQYgBSkDAEJ/hUKAgYKEiJCgwIB/gyEnA0ACQCAnQgBSDQADQCAFQYB+aiEFIAYpAwAhJyAGQQhqIgchBiAnQoCBgoSIkKDAgH+DIidCgIGChIiQoMCAf1ENAAsgJ0KAgYKEiJCgwIB/hSEnIAchBgsgBSAneqdBAnRB4ANxa0FgahCyESAnQn98ICeDIScgCEF/aiIIDQALCyAEIARBBXRBJ2pBYHEiBmpBCWoiBUUNACACKAJAIAZrIAVBCBC9EwsCQCACKAJUIgRFDQACQCACKAJcIghFDQAgAigCUCIFQQhqIQYgBSkDAEJ/hUKAgYKEiJCgwIB/gyEnA0ACQCAnQgBSDQADQCAFQcB9aiEFIAYpAwAhJyAGQQhqIgchBiAnQoCBgoSIkKDAgH+DIidCgIGChIiQoMCAf1ENAAsgJ0KAgYKEiJCgwIB/hSEnIAchBgsgBUEAICd6p0EDdmtBKGxqIgdBWGoQ6REgB0FwahCaFSAnQn98ICeDIScgCEF/aiIIDQALCyAEIARBKGxBL2pBeHEiBmpBCWoiBUUNACACKAJQIAZrIAVBCBC9EwsCQCACKAJkIgZFDQAgAigCYCACKAJsENwMIAYgBkEEdEEXakFwcSIFakEJaiIGRQ0AIAIoAmAgBWsgBkEIEL0TCyACKAJ8IAIoAoABEJkVIAIoAnggAigCfBCAIyACKAKIASACKAKMARCZFSACKAKEASACKAKIARCAIyACKAKUASACKAKYARCZFSACKAKQASACKAKUARCAIyACKAKgASACKAKkARDUHCACKAKcASACKAKgARDxIgJAIANFDQACQCABKAIADQAgASgCICIEQThsIQggASgCHCEHQQAhBgJAA0AgCCAGRg0BIAcgBmohBSAGQThqIQYgBSgCAEF6akEESQ0ADAMLCwJAIAQgECgCAEcNACAQQfz1mgEQ/BggASgCHCEHCyAHIARBOGxqIgZCADcDGCAGIAo2AhQgBiAJNgIQIAZCCDcDCCAGQgI3AwAgBkEgakEAOgAAIAEgBEEBajYCIAwBC0Hs9ZoBEMkiAAsgAkHwBGokAAvNcwIefwN+IwBBwANrIgIkACAAKQKAASEgIABCgICAgIABNwOAASAAKQKMASEhIABCgICAgMAANwKMAUEIIQMgAkHQAGpBCGoiBCAAQYgBaiIFKAIANgIAQQAhBiAFQQA2AgAgAEGUAWoiBSgCACEHIAVBADYCACACQeAAakEIaiIIIAc2AgAgAiAgNwNQIAIgITcDYCAAQYwBaiEJIABBgAFqIQoCQAJAAkACQAJAAkACQAJAAkAgASgCCCIFDQAgCiACKQNQNwIAIAkgAikDYDcCACAKQQhqIAQoAgA2AgAgCUEIaiAIKAIANgIAQQQhB0EAIQRBACEIDAELIAEoAgQiCyAFQdgAbGohDCACQfgAakEIaiENA0ACQAJAAkACQAJAAkACQAJAAkAgCygCACIFQXxqQQAgBUF7akEISRsOCQABAgMECAgGBQALAkAgCygCSCIFRQ0AIAsoAkQhBiAFQQZ0IQ5BACEHA0ACQCAGIAdqIgUoAgBBB0cNACAFQQhqIQQCQAJAIAVBHGoiDy0AAEECRw0AIAQoAgAiCCgCAA0QIAJB4AJqIAgpAwggCEEYaiIQKAIAEOcaIAIoAugCIREgAikD4AIhICAIKQMIIiIhISAIKAIUIhIhEyAIKAIQIhQhAwJAICJCA4NCAFINACAipyITIBMoAgAiE0EBajYCACATQX9MDRIgCCkDCCEhIAgoAhQhEyAIKAIQIQMLIAIgEjYC1AIgAiAUNgLQAiACICI3A8gCIAJBADYCwAIgECgCACEQAkAgIUIDg0IAUg0AICGnIhIgEigCACISQQFqNgIAIBJBf0wNEgsgAiAQNgLoASACIBM2AuQBIAIgAzYC4AEgAiAhNwPYASACQRo2AtABIAIgCC0AHDoA7AEgBUEQaigCACEQIAVBFGooAgAhEiAEKAIAIQgQ5R8hEyACQeACaiAIELUCIBNBIGogAkHgAmpBIGoiAykDADcDACATQRhqIAJB4AJqQRhqIhQpAwA3AwAgE0EQaiACQeACakEQaiIVKQMANwMAIBNBCGogAkHgAmpBCGoiFikDADcDACATIAIpA+ACNwMAIAVBDGooAgAhFxDiHyEIIAJB4AJqIBcQRSAIQThqIAJB4AJqQThqKQMANwMAIAhBMGogAkHgAmpBMGopAwA3AwAgCEEoaiACQeACakEoaikDADcDACAIQSBqIAMpAwA3AwAgCEEYaiAUKQMANwMAIAhBEGogFSkDADcDACAIQQhqIBYpAwA3AwAgCCACKQPgAjcDAEEEIRQgAkHAAmogAkHQAWoQqAQhFQwBCyACQeACaiAEKQMAIAVBGGoiCCgCABDnGiACKALoAiERIAIpA+ACISAgAkHgAmogBBDoEiACQQA2AtABIAIgAikD6AI3A+ABIAIgAikD4AI3A9gBIA0gBBDoEiACQRo2AnggBUEMaigCACEQIAgoAgAhGCAFQRRqKAIAIRkgBUEQaigCACESIAQoAgAhCAJAIAQpAwAiIUIDg0IAUg0AICGnIhMgEygCACITQQFqNgIAIBNBf0wNEQsgDy0AACEaQQAhFEEAIRsCQCAFQSBqKAIAIhNFDQBBAC0A4PadARpBDBCEASIbRQ0RQQAtAOD2nQEaIBMoAgAhAyATKAIIIRUgEygCBCEWQeAAEIQBIhNFDREgAkHgAmogAxBlAkBB4ABFDQAgEyACQeACakHgAPwKAAALIBsgFTYCCCAbIBY2AgQgGyATNgIACyACQdABaiACQfgAahCoBCEVCwJAIAAoAogBIgMgACgCgAFHDQAgCkG87JoBEIMZCyAAIANBAWo2AogBIAAoAoQBIANBBHRqIgMgETYCCCADICA3AwACQCAAKAKUASIDIAAoAowBRw0AIAlBzOyaARC1GAsgACADQQFqNgKUASAAKAKQASADQQJ0aiAVNgIAIAVBMGoiAykDACEgIANCgICAgMAANwMAIAVBOGoiESgCACEVIBFBADYCACACQeACakEIaiIRIBU2AgAgAiAgNwPgAiAFQSxqIhUoAgAhFiAFQShqIhcoAgAhHCAFKAIAIR1BAEEEEPUiAkACQCAdQQdHDQACQCAPLQAAQQJGDQAgBBCIFAwCCyAFQQxqKAIAIR0gBCgCACIeEIILIB5BKEEIEL0TIB0Q5AEgHUHAAEEIEL0TDAELIAUQggsLIAUgFDYCACAEIAg2AgAgAyACKQPgAjcDACAXIBw2AgAgFSAWNgIAIAVBBGogEzYCACAPIBo6AAAgBUEYaiAYNgIAIAVBFGogGTYCACAFQRBqIBI2AgAgBUEMaiAQNgIAIAVBHWogAi8AqAI7AAAgBUEfaiACQagCakECai0AADoAACAFQSBqIBs2AgAgA0EIaiARKAIANgIACyAOIAdBwABqIgdHDQALIAsoAkgiBUUNACALKAJEIhMgBUEGdGohDwNAAkACQCATKAIAQQdGDQACQCATQThqKAIAIgVFDQAgE0E0aigCACEHIAVBDGwhCANAIAAgBygCACIFENMDIAUgABBRAkAgACgCAEUNACAFKAIAQRpHDQAgACAFQQhqIgMQwwUiBEUNACAFEOQBIAVBOGogBEE4aikDADcDACAFQTBqIARBMGopAwA3AwAgBUEoaiAEQShqKQMANwMAIAVBIGogBEEgaikDADcDACAFQRhqIARBGGopAwA3AwAgBUEQaiAEQRBqKQMANwMAIAMgBEEIaikDADcDACAFIAQpAwA3AwAgBEHAAEEIEL0TCyAHQQxqIQcgCEF0aiIIDQALCyATIAAQhgQgACgCAEUNASAAIBMQwwgMAQsCQCATQThqKAIAIgVFDQAgE0E0aigCACEHIAVBDGwhCANAIAAgBygCACIFENMDIAUgABBRAkAgACgCAEUNACAFKAIAQRpHDQAgACAFQQhqIgMQwwUiBEUNACAFEOQBIAVBOGogBEE4aikDADcDACAFQTBqIARBMGopAwA3AwAgBUEoaiAEQShqKQMANwMAIAVBIGogBEEgaikDADcDACAFQRhqIARBGGopAwA3AwAgBUEQaiAEQRBqKQMANwMAIAMgBEEIaikDADcDACAFIAQpAwA3AwAgBEHAAEEIEL0TCyAHQQxqIQcgCEF0aiIIDQALCyATLQAcQQJHDQAgAC0AnAEhBCAAQQE6AJwBIBMoAggiBSAAEIYEAkAgACgCAEUNACAAIAUQwwgLIABBADoAnAEgACATKAIMIgUQ0wMgBSAAEFECQCAAKAIARQ0AIAUoAgBBGkcNACAAIAVBCGoiCBDDBSIHRQ0AIAUQ5AEgBUE4aiAHQThqKQMANwMAIAVBMGogB0EwaikDADcDACAFQShqIAdBKGopAwA3AwAgBUEgaiAHQSBqKQMANwMAIAVBGGogB0EYaikDADcDACAFQRBqIAdBEGopAwA3AwAgCCAHQQhqKQMANwMAIAUgBykD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QYABakEgaikDADcDACABQRhqIAJBgAFqQRhqKQMANwMAIAFBEGogAkGAAWpBEGopAwA3AwAgAUEIaiACQYABakEIaikDADcDACABIAIpA4ABNwMACyADQRBqIQMgBCAMNgIAIARBDGogATYCACAEQQRqIDI3AgAgCkFwaiEKIARBEGohBCALQX9qIgsNAAsLIAAgBTYCFCAAIAY2AhAgACAHNgIMIAAgCTYCCCAAIAg2AgQgAEENNgIADDMLIAEoAgghAyABKAIUIQ0gASgCECEOIAJBgAFqIAEoAgwiBUEEQQwQow4gAigChAEhCSACKAKAAUEBRg0eIAIoAogBIQYCQCAJRQ0AIAVBDGwhCiAGIQQgCSEMA0AgCkUNAQJAAkAgAygCACIHDQBBAC0A4PadARpB8AAQhAEiC0UNNSACQYABaiADQQRqKAIAEPkBAkBB8ABFDQAgCyACQYABakHwAPwKAAALQQAhAQwBC0EALQDg9p0BGiADQQhqKAIAIQggA0EEaigCACELQcAAEIQBIgFFDTQgAkGAAWogBxBFIAFBOGogAkGAAWpBOGopAwA3AwAgAUEwaiACQYABakEwaikDADcDACABQShqIAJBgAFqQShqKQMANwMAIAFBIGogAkGAAWpBIGopAwA3AwAgAUEYaiACQYABakEYaikDADcDACABQRBqIAJBgAFqQRBqKQMANwMAIAFBCGogAkGAAWpBCGopAwA3AwAgASACKQOAATcDAAsgA0EMaiEDIAQgATYCACAEQQhqIAg2AgAgBEEEaiALNgIAIApBdGohCiAEQQxqIQQgDEF/aiIMDQALCyAAIA02AhQgACAONgIQIAAgBTYCDCAAIAY2AgggACAJNgIEIABBDjYCAAwyCwJAAkAgAS0AHCIDQQJHDQAMAQsgASgCGCEMIAEoAhQhCyABKAIQIQogASkDCCIyQgODQgBSDQAgMqciBCAEKAIAIgRBAWo2AgAgBEF/TA0xC0EALQDg9p0BGkHIABCEASIERQ0wIAQgASgCIBCIAiAAIAQ2AiAgACADOgAcIAAgDDYCGCAAIAs2AhQgACAKNgIQIAAgMjcDCCAAQQ82AgAMMQtBAC0A4PadARogAS0AECEDIAEoAgwhCiABKAIIIQtBwAAQhAEiBEUNLyAEIAEoAgQQRSAAIAM6ABAgACAKNgIMIAAgCzYCCCAAIAQ2AgQgAEEQNgIADDALIAAgASkDADcDACAAQThqIAFBOGopAwA3AwAgAEEwaiABQTBqKQMANwMAIABBKGogAUEoaikDADcDACAAQSBqIAFBIGopAwA3AwAgAEEYaiABQRhqKQMANwMAIABBEGogAUEQaikDADcDACAAQQhqIAFBCGopAwA3AwAMLwtBAC0A4PadARogAS0AESEDIAEtABAhCiABKAIIIQsgASgCBCEMQcAAEIQBIgRFDS0gBCABKAIMEEUgACADOgARIAAgCjoAECAAIAQ2AgwgACALNgIIIAAgDDYCBCAAQRE2AgAMLgtBAC0A4PadARogAS0AFCEKIAEoAhAhCyABKAIMIQxBwAAQhAEiBEUNLCAEIAEoAgQQRUEALQDg9p0BGkHAABCEASIDRQ0sIAMgASgCCBBFIAAgCjoAFCAAIAs2AhAgACAMNgIMIAAgAzYCCCAAIAQ2AgQgAEESNgIADC0LIAEtADwhCiABKAI0IQsgASgCMCEMAkAgA0ELRw0AAkACQAJAIAEoAgQOAwABAgALIAJBgAFqIAFBCGoQvQYgAkE4akEIaiACQZQBaikCADcDACACIAIpAowBNwM4IAIoAogBIQggAikDgAEhMkEAIQcMLQsgAkGAAWogAUEIahCyDCACQThqQQhqIAJBlAFqKQIANwMAIAIgAikCjAE3AzggAigCiAEhCCACKQOAASEyQQEhBwwsCyACQcAAaiABQRxqKQIANwMAIAIgASkCFDcDOCABKAIQIQggASkDCCEyQQIhBwwrCwJAAkACQAJAAkACQAJAAkACQAJAAkAgAw4LAAECAwQFBgcICQoACyACQYABaiABQQhqELMMIAJBGGpBCGogAkGUAWopAgA3AwAgAkEoaiACQZwBaigCADYCACACIAIpAowBNwMYDDILIAJBgAFqIAFBCGoQyAogAkEYakEIaiACQZQBaikCADcDACACQShqIAJBnAFqKQIANwMAIAJBMGogAkGkAWooAgA2AgAgAiACKQKMATcDGAwxCyACQYABaiABQQhqEMUMIAJBGGpBCGogAkGUAWopAgA3AwAgAkEoaiACQZwBaikCADcDACACQTBqIAJBpAFqKAIANgIAIAIgAikCjAE3AxgMMAsgAkGAAWogAUEEahCwGgwuCyACQYABaiABQQRqEKcEDCwLIAJBgAFqIAFBBGoQsRMMKwsgAkGAAWogAUEEahCxEwwqCyACQYABaiABQQRqELAaDCoLIAJBgAFqIAFBBGoQsRMMKAsgAkGAAWogAUEEahDjEQwnCyACQSBqIAFBHGopAgA3AwAgAkEoaiABQSRqKQIANwMAIAJBMGogAUEsaigCADYCACACIAEpAhQ3AxggASgCECEIIAEpAwghMiABKAIEIQcMKQtBAC0A4PadARogASgCJCEKIAEoAiAhC0HAABCEASIERQ0qIAQgASgCKBBFAkACQAJAAkAgASgCCCIHDgMAAQIACyABKAIUIQMgASgCECEMIAEoAhwhCCABKAIYIQkCQCABKQMQIjJCA4NCAFINACAypyIBIAEoAgAiAUEBajYCACABQX9MDS4LIAIgAzYCgAEgAkEYaiEBDAILIAEoAhQhAyABKAIQIQwgASgCHCEIIAEoAhghCQJAIAEpAxAiMkIDg0IAUg0AIDKnIgEgASgCACIBQQFqNgIAIAFBf0wNLQsgAiADNgKAASACQRhqIQEMAQtBAC0A4PadARogASgCFCEIIAEoAhAhDEHAABCEASIDRQ0rIAMgASgCDBBFIAJBgAFqIQELIAEgCDYCACAAIAw2AhAgACADNgIMIAAgBzYCCCAAIAk2AhggACAENgIoIAAgCjYCJCAAIAs2AiAgAEEUNgIAIAAgAigCgAE2AhQgACACKAIYNgIcDCsLQQEhBCABKAIsIQMgASgCKCEKIAEoAiQhCyABKAIgIQwCQAJAIAEoAghBAUcNACABKQMQITIgAUEMahDaHiEBDAELIAEoAhwhByABKAIYIQhBACEEAkAgASkDECIyQgODQgBRDQAMAQsgMqciASABKAIAIglBAWo2AgAgCUF/TA0qCyAAIAM2AiwgACAKNgIoIAAgCzYCJCAAIAw2AiAgACAHNgIcIAAgCDYCGCAAIDI3AxAgACABNgIMIAAgBDYCCCAAQRU2AgAMKgtBAC0A4PadARogASgCFCELIAEoAhAhDEHAABCEASIERQ0oIAQgASgCBBBFQQAtAOD2nQEaQcAAEIQBIgNFDSggAyABKAIIEEVBAC0A4PadARpBwAAQhAEiCkUNKCAKIAEoAgwQRSAAIAs2AhQgACAMNgIQIAAgCjYCDCAAIAM2AgggACAENgIEIABBFjYCAAwpCyABKAIkIQ4gASgCICEPIAEoAhwhEAJAAkACQCABLQAYIgZBfWoiBEEBIARB/wFxQQNJG0H/AXEOAwABAgALIAJBGmogAUEbai0AADoAACACIAEvABk7ARgMIgsgAkEaaiABQRtqLQAAOgAAIAIgAS8AGTsBGAwhC0EALQDg9p0BGkHAABCEASINRQ0nIA0gASgCEBBFQQUhBgwhC0EALQDg9p0BGiABKAIcIQogASgCGCELIAEoAhQhDEHAABCEASIERQ0mIAQgASgCEBBFQYCAgIB4IQMCQCABKAIEQYCAgIB4Rg0AIAJBgAFqIAFBBGoQ0QggAikChAEhMiACKAKAASEDCwJAAkAgASgCIA0AQQAhAQwBCyABQSBqEMkKIQELIAAgATYCICAAIAo2AhwgACALNgIYIAAgDDYCFCAAIAQ2AhAgACAyNwMIIAAgAzYCBCAAQRg2AgAMJwsgASgCCCEEIAEoAhQhCSABKAIQIQUgAkGAAWogASgCDCIIQQRBBBCjDiACKAKEASEMIAIoAoABQQFGDREgAigCiAEhBwJAIAxFDQAgCEECdCEDIAchCiAMIQsDQCADRQ0BQQAtAOD2nQEaQcAAEIQBIgFFDScgAkGAAWogBCgCABBFIAFBOGogAkGAAWpBOGopAwA3AwAgAUEwaiACQYABakEwaikDADcDACABQShqIAJBgAFqQShqKQMANwMAIAFBIGogAkGAAWpBIGopAwA3AwAgAUEYaiACQYABakEYaikDADcDACABQRBqIAJBgAFqQRBqKQMANwMAIAFBCGogAkGAAWpBCGopAwA3AwAgASACKQOAATcDACAKIAE2AgAgA0F8aiEDIApBBGohCiAEQQRqIQQgC0F/aiILDQALCyAAIAk2AhQgACAFNgIQIAAgCDYCDCAAIAc2AgggACAMNgIEIABBGTYCAAwmCyABKAIYIQQgASgCFCEDIAEoAhAhCgJAIAEpAwgiMkIDg0IAUg0AIDKnIgsgCygCACILQQFqNgIAIAtBf0wNJQsgACAENgIYIAAgAzYCFCAAIAo2AhAgACAyNwMIIABBGjYCACAAIAEtABw6ABwMJQsCQAJAAkACQAJAAkACQAJAAkAgASgCCCIKDgcAAQIDBAUGAAsgASgCHCEHIAEoAhghAwJAIAEpAxAiMkIDg0IAUg0AIDKnIgQgBCgCACIEQQFqNgIAIARBf0wNLAsgASgCJCELIAEoAiAhBAJAIAEpAyAiM1ANACAzQgODUEUNACAzpyIBIAEoAgAiAUEBajYCACABQX9MDSwLIDJCIIinIQwgMqchCAwGCyABKQMYIjJCIIinIQcgASkDECIzQiCIpyEMIAEoAiQhCyABKAIgIQQgASgCDCEBIDKnIQMgM6chCAwGCyABKQMYIjJCIIinIQcgASkDECIzQiCIpyEMIAEoAiQhCyABKAIgIQQgASgCDCEBIDKnIQMgM6chCAwFCyABKAIkIQsgASgCICEEIAEpAxghMiABKAIUIQwgASgCECEIAkAgASkDICIzUA0AIDNCA4NQRQ0AIDOnIgEgASgCACIBQQFqNgIAIAFBf0wNKQsgMkIgiKchByAypyEDDAMLQQAtAOD2nQEaIAEoAhQhDCABKAIQIQhBEBCEASIERQ0nIAEoAiAiA0EEaigCACEFIAMtAAwhByACIANBCGooAgAiA0EEQQRBuOSbARCoFSACKAIAIQkgAigCBCELAkAgA0ECdCIGRQ0AIAsgBSAG/AoAAAsgBCAHOgAMIAQgAzYCCCAEIAs2AgQgBCAJNgIAIAEpAxgiMqchAwJAIDJQDQAgMkIDg1BFDQAgAyADKAIAIgFBAWo2AgAgAUF/TA0oCyAyQiCIpyEHDAILIAEoAiQhCyABKAIgIQQCQCABKQMQIjJCA4NCAFINACAypyIDIAMoAgAiA0EBajYCACADQX9MDScLIAEpAxgiM6chAwJAIDNCA4NCAFINACADIAMoAgAiAUEBajYCACABQX9MDScLIDNCIIinIQcgMkIgiKchDCAypyEIDAELIAEoAiQhCyABKAIgIQQCQCABKQMQIjJCA4NCAFINACAypyIDIAMoAgAiA0EBajYCACADQX9MDSYLIAEpAxgiM6chAwJAIDNCA4NCAFINACADIAMoAgAiAUEBajYCACABQX9MDSYLIDNCIIinIQcgMkIgiKchDCAypyEICwsgACALNgIkIAAgBDYCICAAIAE2AgwgACAKNgIIIABBGzYCACAAIAetQiCGIAOthDcDGCAAIAytQiCGIAithDcDEAwkCyABKAIIIQMgASgCICEFIAEoAhwhBiACQYABaiABKAIMIgdBBEEEEKMOIAIoAoQBIQggAigCgAFBAUYNDSACKAKIASEJAkAgCEUNACAHQQJ0IQogCSELIAghDANAIApFDQFBAC0A4PadARpBwAAQhAEiBEUNJCACQYABaiADKAIAEEUgBEE4aiACQYABakE4aikDADcDACAEQTBqIAJBgAFqQTBqKQMANwMAIARBKGogAkGAAWpBKGopAwA3AwAgBEEgaiACQYABakEgaikDADcDACAEQRhqIAJBgAFqQRhqKQMANwMAIARBEGogAkGAAWpBEGopAwA3AwAgBEEIaiACQYABakEIaikDADcDACAEIAIpA4ABNwMAIAsgBDYCACAKQXxqIQogC0EEaiELIANBBGohAyAMQX9qIgwNAAsLIAJBgAFqIAEoAhQgASgCGBCeCSAAIAc2AgwgACAJNgIIIAAgCDYCBCAAIAU2AiAgACAGNgIcIABBHDYCACAAIAIpAoABNwIQIABBGGogAkGIAWooAgA2AgAMIwtBACEFQQAtAOD2nQEaIAEoAhQhDiABKAIQIQ8gASgCDCEQQcAAEIQBIglFDSEgCSABKAIEEEUCQCABKAIYRQ0AIAFBGGoQyQohBQtBAC0A4PadARpBIBCEASIMRQ0hIAEoAggiCCgCBCEEIAgoAhwhESAIKAIYIRIgAkGAAWogCCgCCCIGQQRBBBCjDiACKAKEASEHIAIoAoABQQFGDQsgAigCiAEhDQJAIAdFDQAgBkECdCEDIA0hCiAHIQsDQCADRQ0BQQAtAOD2nQEaQcAAEIQBIgFFDSMgAkGAAWogBCgCABBFIAFBOGogAkGAAWpBOGopAwA3AwAgAUEwaiACQYABakEwaikDADcDACABQShqIAJBgAFqQShqKQMANwMAIAFBIGogAkGAAWpBIGopAwA3AwAgAUEYaiACQYABakEYaikDADcDACABQRBqIAJBgAFqQRBqKQMANwMAIAFBCGogAkGAAWpBCGopAwA3AwAgASACKQOAATcDACAKIAE2AgAgA0F8aiEDIApBBGohCiAEQQRqIQQgC0F/aiILDQALCyAMQQxqIAhBEGooAgAgCEEUaigCABCeCSAMIBE2AhwgDCASNgIYIAwgBjYCCCAMIA02AgQgDCAHNgIAIAAgBTYCGCAAIA42AhQgACAPNgIQIAAgEDYCDCAAIAw2AgggACAJNgIEIABBHTYCAAwiCyABKAIIIQMgASgCHCEP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AGooAgAhECABQcgAaigCACEPIAFBwABqKQMAIjOnIRQCQCAzQgODQgBSDQAgFCAUKAIAIgRBAWo2AgAgBEF/TA0eCyAzQiCIpyEqDAELIAFBxABqKAIAISogAUHAAGooAgAhFCABQThqKQMAIjKnISkCQCAyQgODQgBSDQAgKSApKAIAIgRBAWo2AgAgBEF/TA0dCyAyQiCIpyEoQgAhMgtBBCEIAkACQCABKAIAIgRBBEcNACArIQQgLCELIC0hDAwBCwJAAkACQAJAAkAgBA4EAAECAwALIAFBFGooAgAhESABQRBqKAIAIRICQCABQQhqKQMAIjNCA4NCAFINACAzpyIEIAQoAgAiBEEBajYCACAEQX9MDSELAkAgAUEYaikDACI1UA0AIDVCA4NQRQ0AIDWnIgEgASgCACIBQQFqNgIAIAFBf0wNIQsgM0IgiKchDCAzpyELQQAhCCAuIQQMAwsgAUEUaigCACERIAFBEGooAgAhEgJAAkAgAUEEaigCACIEQQFHDQBBAC0A4PadARpBwAAQhAEiC0UNISACQYABaiABQQhqKAIAEEUgC0E4aiACQYABakE4aikDADcDACALQTBqIAJBgAFqQTBqKQMANwMAIAtBKGogAkGAAWpBKGopAwA3AwAgC0EgaiACQYABakEgaikDADcDACALQRhqIAJBgAFqQRhqKQMANwMAIAtBEGogAkGAAWpBEGopAwA3AwAgC0EIaiACQYABakEIaikDADcDACALIAIpA4ABNwMAQQEhBCAvIQwMAQsgAUEIaigCACELIAFBDGooAgAiDCEvC0EBIQggBCEuDAILQQAtAOD2nQEaQaABEIQBIgRFDR4gAkGAAWogAUEEaigCABCwAQJAQaABRQ0AIAQgAkGAAWpBoAH8CgAAC0ECIQggMCELIDEhDCAEIS4MAgsgAUEYaikCACE1IAFBFGooAgAhESABQRBqKAIAIRIgAkGAAWogAUEIaigCACABQQxqKAIAEPwDIAFBIGopAgAhNiACKQKEASIzQiCIpyEMIDOnIQtBAyEIIAIoAoABIgQhLgsgCyEwIAwhMQsgKq1CIIYgFK2EITcgKK1CIIYgKa2EITMgBCErIAshLCAMIS0LIBMgA2oiASAINgIAIAFB1ABqIA42AgAgAUHQAGogDTYCACABQcwAaiAQNgIAIAFByABqIA82AgAgAUHAAGogNzcDACABQThqIDM3AwAgAUEwaiAyNwMAIAFBLGogBTYCACABQShqIAY2AgAgAUEgaiA2NwMAIAFBGGogNTcDACABQRRqIBE2AgAgAUEQaiASNgIAIAFBDGogDDYCACABQQhqIAs2AgAgAUEEaiAENgIAIANB2ABqIQMgB0F/aiIHDQALCyAJLQCIASEGAkACQCAJKAJ4IgENAEEAIQgMAQtBAC0A4PadARpBFBCEASIIRQ0ZIAEpAgwhMiAIIAEQhQwgCCAyNwIMCyACQcgAakECaiACQRhqQQJqLQAAOgAAIAIgAi8BGDsBSCAJKAKUASEEIAJBgAFqIAkoApgBIgdBCEEoEKMOIAIoAoQBIQwCQCACKAKAAUEBRg0AIBxBCHQgGkH/AXFyrUIghiEyIBetITMgAigCiAEhBQJAIAxFDQAgB0EobCEDIAUhASAMIQsDQCADRQ0BIAJBgAFqIAQQvAcgAUEgaiACQYABakEgaikDADcDACABQRhqIAJBgAFqQRhqKQMANwMAIAFBEGogAkGAAWpBEGopAwA3AwAgAUEIaiACQYABakEIaikDADcDACABIAIpA4ABNwMAIAFBKGohASADQVhqIQMgBEEoaiEEIAtBf2oiCw0ACwsgMiAzhCEyQQYhAQJAIAktADxBBkYNACAJKAIMIQMgCSgCCCEEIAJBgAFqIAlBEGoQugYgAkHQAGpBKGogAkGAAWpBKGooAgA2AgAgAkHQAGpBIGogAkGAAWpBIGopAwA3AwAgAkHQAGpBGGogAkGAAWpBGGopAwA3AwAgAkHQAGpBEGogAkGAAWpBEGopAwA3AwAgAkHQAGpBCGogAkGAAWpBCGopAwA3AwAgAkHOAGogAkGvAWotAAA6AAAgAiACKQOAATcDUCACIAIvAK0BOwFMIAItAKwBIQELIAogAzYCDCAKIAQ2AgggCiAVNgIEIAogFjYCACAKIAIpA1A3AxAgCiABOgA8IAogAi8BTDsAPSAKQRhqIAJB2ABqKQMANwMAIApBIGogAkHgAGopAwA3AwAgCkEoaiACQdAAakEYaikDADcDACAKQTBqIAJB0ABqQSBqKQMANwMAIApBOGogAkHQAGpBKGooAgA2AgAgCkE/aiACQcwAakECai0AADoAACAKIBs6AGwgCiAdNgJoIAogHjYCZCAKIB82AmAgCiAgNgJcIAogITYCWCAKIDI3A1AgCiAYNgJMIAogGTYCSCAKIDQ3A0AgCiAGOgCIASAKIAc2ApgBIAogBTYClAEgCiAMNgKQASAKICU2AoQBIAogEzYCgAEgCiAmNgJ8IAogCDYCeCAKICM2AnQgCiAkNgJwIAogAi8BSDsAbSAKQe8AaiACQcgAakECai0AADoAACAAIAo2AgQgAEEnNgIADBoLIAwgAigCiAFBiKSaARDYIAALICYgAigCiAFBiKSaARDYIAALIAkgAigCiAFBiKSaARDYIAALIAcgAigCiAFBiKSaARDYIAALIAggAigCiAFBiKSaARDYIAALIAwgAigCiAFBiKSaARDYIAALIAkgAigCiAFBiKSaARDYIAALIAggAigCiAFBiKSaARDYIAwRCyAAIAEpAwA3AwAgAEE4aiABQThqKQMANwMAIABBMGogAUEwaikDADcDACAAQShqIAFBKGopAwA3AwAgAEEgaiABQSBqKQMANwMAIABBGGogAUEYaikDADcDACAAQRBqIAFBEGopAwA3AwAgAEEIaiABQQhqKQMANwMADBELQQAtAOD2nQEaIAEtABAhDiABKAIMIQ8gASgCCCEQQSgQhAEiC0UNDwJAAkAgASgCBCIHKAIAQQNHDQBBAC0A4PadARogBygCHCERIAcoAhghEiAHKAIUIRRBwAAQhAEiCUUNESAJIAcoAhAQRSAHKAIIIQQgAkEQaiAHKAIMIgVBBEEQEPMVIAIoAhQhBgJAIAIoAhAiDUUNACAFQQR0IQogBiEDIA0hDANAIApFDQFBAC0A4PadARogBCkCBCEyIAQoAgAhCEHAABCEASIBRQ0TIAJBgAFqIAQoAgwQRSABQThqIAJBgAFqQThqKQMANwMAIAFBMGogAkGAAWpBMGopAwA3AwAgAUEoaiACQYABakEoaikDADcDACABQSBqIAJBgAFqQSBqKQMANwMAIAFBGGogAkGAAWpBGGopAwA3AwAgAUEQaiACQYABakEQaikDADcDACABQQhqIAJBgAFqQQhqKQMANwMAIAEgAikDgAE3AwAgA0EMaiABNgIAIANBBGogMjcCACADIAg2AgAgCkFwaiEKIANBEGohAyAEQRBqIQQgDEF/aiIMDQALC0EDIQQCQCAHKAIgIgMNAEEAIQEMAgtBAC0A4PadARpBFBCEASIBRQ0RIAMpAgwhMiABIAMoAgQgAygCCBCqDCABIDI3AgwMAQtBAC0A4PadARogBygCHCERIAcoAhghEkHAABCEASIBRQ0QIAEgBygCIBBFIAJBgAFqIAcQlgsgAigClAEhFCACKAKQASEJIAIoAowBIQUgAigCiAEhBiACKAKEASENIAIoAoABIQQLIAsgATYCICALIBE2AhwgCyASNgIYIAsgFDYCFCALIAk2AhAgCyAFNgIMIAsgBjYCCCALIA02AgQgCyAENgIAIAAgDjoAECAAIA82AgwgACAQNgIIIAAgCzYCBCAAQTA2AgAMEAsgASgCFCEEIAEoAhAhAwJAIAEpAwgiMkIDg0IAUg0AIDKnIgEgASgCACIBQQFqNgIAIAFBf0wNDwsgACAENgIUIAAgAzYCECAAIDI3AwggAEEvNgIADA8LQQAtAOD2nQEaIAEoAhAhCiABKAIMIQtBwAAQhAEiBEUNDSAEIAEoAgQQRUEALQDg9p0BGkHgABCEASIDRQ0NIAMgASgCCBBlIAAgCjYCECAAIAs2AgwgACADNgIIIAAgBDYCBCAAQS42AgAMDgtBAC0A4PadARogASgCECEGIAEoAgwhDUHAABCEASIHRQ0MIAcgASgCBBBFQQAtAOD2nQEaQRQQhAEiDEUNDCABKAIIIgQoAgQhASAEKAIQIQ4gBCgCDCEPIAJBgAFqIAQoAggiCUEEQQQQow4gAigChAEhCAJAIAIoAoABQQFGDQAgAigCiAEhBQJAIAhFDQAgCUECdCEEIAUhAyAIIQsDQCAERQ0BQQAtAOD2nQEaQeAAEIQBIgpFDQ8gAkGAAWogASgCABBlAkBB4ABFDQAgCiACQYABakHgAPwKAAALIAMgCjYCACADQQRqIQMgBEF8aiEEIAFBBGohASALQX9qIgsNAAsLIAwgDjYCECAMIA82AgwgDCAJNgIIIAwgBTYCBCAMIAg2AgAgACAGNgIQIAAgDTYCDCAAIAw2AgggACAHNgIEIABBLTYCAAwOCyAIIAIoAogBQYikmgEQ2CAAC0EALQDg9p0BGiABKAIQIQogASgCDCELQcAAEIQBIgRFDQsgBCABKAIEEEVBAC0A4PadARpB4AAQhAEiA0UNCyADIAEoAggQZSAAIAo2AhAgACALNgIMIAAgAzYCCCAAIAQ2AgQgAEEsNgIADAwLQQAtAOD2nQEaIAEoAgwhAyABKAIIIQpBwAAQhAEiBEUNCiAEIAEoAgQQRSAAIAM2AgwgACAKNgIIIAAgBDYCBCAAQSs2AgAMCwtBAC0A4PadARogASgCDCEDIAEoAgghCkHAABCEASIERQ0JIAQgASgCBBBFIAAgAzYCDCAAIAo2AgggACAENgIEIABBKjYCAAwKC0EALQDg9p0BGiABKAIQIQogASgCDCELQcAAEIQBIgRFDQggBCABKAIEEEVBAC0A4PadARpB4AAQhAEiA0UNCCADIAEoAggQZSAAIAo2AhAgACALNgIMIAAgAzYCCCAAIAQ2AgQgAEEpNgIADAkLIAEoAgghAyABKAIcIQkgASgCGCEFIAEoAhQhBiABKAIQIQ0gAkGAAWogASgCDCIIQQhBKBCjDiACKAKEASEMAkAgAigCgAFBAUYNACACKAKIASEHAkAgDEUNACAIQShsIQogByEEIAwhCwNAIApFDQEgAkGAAWogAxC8ByAEQSBqIAJBgAFqQSBqKQMANwMAIARBGGogAkGAAWpBGGopAwA3AwAgBEEQaiACQYABakEQaikDADcDACAEQQhqIAJBgAFqQQhqKQMANwMAIAQgAikDgAE3AwAgCkFYaiEKIARBKGohBCADQShqIQMgC0F/aiILDQALCyAAIAk2AhwgACAFNgIYIAAgBjYCFCAAIA02AhAgACAINgIMIAAgBzYCCCAAIAw2AgQgAEEoNgIAIAAgASkDIDcDIAwJCyAMIAIoAogBQYikmgEQ2CAACyABKAIUIREgASgCECENCyABKAIIIQMgAkGAAWogASgCDCIJQQRBEBCjDiACKAKEASEHAkAgAigCgAFBAUYNACACKAKIASEFAkAgB0UNACAJQQR0IQsgBSEKIAchDANAIAtFDQFBAC0A4PadARogAykCBCEyIAMoAgAhCEHAABCEASIERQ0IIAJBgAFqIAMoAgwQRSAEQThqIAJBgAFqQThqKQMANwMAIARBMGogAkGAAWpBMGopAwA3AwAgBEEoaiACQYABakEoaikDADcDACAEQSBqIAJBgAFqQSBqKQMANwMAIARBGGogAkGAAWpBGGopAwA3AwAgBEEQaiACQYABakEQaikDADcDACAEQQhqIAJBgAFqQQhqKQMANwMAIAQgAikDgAE3AwAgCkEMaiAENgIAIApBBGogMjcCACAKIAg2AgAgC0FwaiELIApBEGohCiADQRBqIQMgDEF/aiIMDQALCwJAAkAgASgCKA0AQQAhAQwBCyABQShqEMkKIQELIAAgAi8BGDsAGSAAQRtqIAJBGmotAAA6AAAgACABNgIoIAAgDjYCJCAAIA82AiAgACAQNgIcIAAgBjoAGCAAIBE2AhQgACANNgIQIAAgCTYCDCAAIAU2AgggACAHNgIEIABBFzYCAAwHCyAHIAIoAogBQYikmgEQ2CAACyACKAKMASEIIAIpAoQBITIgAigCgAEhBwwCCyACKQKEASEyIAIoAoABIQcMAQsgAigCiAEhCCACKQOAASEyCyACQThqQQhqIAJBGGpBCGopAwA3AwAgAkGAAWpBCGogAkEwaigCADYCACACIAIpAxg3AzggAiACKQMoNwOAAQtBAC0A4PadARpBwAAQhAEiBEUNACAEIAEoAjgQRSAAIAg2AhAgACACKQM4NwIUIABBHGogAkE4akEIaikDADcCACAAIAIpA4ABNwIkIABBLGogAkGAAWpBCGooAgA2AgAgACAKOgA8IAAgBDYCOCAAIAs2AjQgACAMNgIwIAAgMjcDCCAAIAc2AgQgACADNgIADAELAAsgAkGgAmokAAu0ZAINfwF+IwBBwA9rIgIkACAAKAIAIQMCQAJAAkADQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIANBdGoiBEEHIARBJkkbDiYfAB4dGxoZGBcWFRQTEh8fERAPDg0fDAsKHx8JCAcGBQQDAh8BHx8LIAAoAgwiA0UNHiAAKAIIIQAgA0EEdCEDA0ACQCAAKAIAQQJGDQACQCAAQQxqKAIAIgQoAgBBGkcNACACQYAMaiABKAIAIAEoAgQgBEEIaiIFEIINIAIoAoAMQTJGDQEgBBDRASAEQThqIAJBgAxqQThqKQMANwMAIARBMGogAkGADGpBMGopAwA3AwAgBEEoaiACQYAMakEoaikDADcDACAEQSBqIAJBgAxqQSBqKQMANwMAIARBGGogAkGADGpBGGopAwA3AwAgBEEQaiACQYAMakEQaikDADcDACAFIAJBgAxqQQhqKQMANwMAIAQgAikDgAw3AwAMAQsgBCABEEYLIABBEGohACADQXBqIgMNAAwfCwsCQCAAKAIEIgAoAgBBA0cNACAAQQRqIAEQhAcMHgsgACABEMMHDB0LIAAoAgQiACgCACIDQRpHDRkgAkGACWogASgCACABKAIEIABBCGoiARCCDSACKAKACUEyRg0cIAAQ0QEgAEE4aiACQYAJakE4aikDADcDACAAQTBqIAJBgAlqQTBqKQMANwMAIABBKGogAkGACWpBKGopAwA3AwAgAEEgaiACQYAJakEgaikDADcDACAAQRhqIAJBgAlqQRhqKQMANwMAIABBEGogAkGACWpBEGopAwA3AwAgASACQYAJakEIaikDADcDACAAIAIpA4AJNwMADBwLIAAoAgQiACgCACIDQRpHDRggAkHACGogASgCACABKAIEIABBCGoiARCCDSACKALACEEyRg0bIAAQ0QEgAEE4aiACQcAIakE4aikDADcDACAAQTBqIAJBwAhqQTBqKQMANwMAIABBKGogAkHACGpBKGopAwA3AwAgAEEgaiACQcAIakEgaikDADcDACAAQRhqIAJBwAhqQRhqKQMANwMAIABBEGogAkHACGpBEGopAwA3AwAgASACQcAIakEIaikDADcDACAAIAIpA8AINwMADBsLIAAoAgQiACgCACIDQRpHDRcgAkGACGogASgCACABKAIEIABBCGoiARCCDSACKAKACEEyRg0aIAAQ0QEgAEE4aiACQYAIakE4aikDADcDACAAQTBqIAJBgAhqQTBqKQMANwMAIABBKGogAkGACGpBKGopAwA3AwAgAEEgaiACQYAIakEgaikDADcDACAAQRhqIAJBgAhqQRhqKQMANwMAIABBEGogAkGACGpBEGopAwA3AwAgASACQYAIakEIaikDADcDACAAIAIpA4AINwMADBoLIAAoAgQiACgCACIDQRpHDRYgAkHAB2ogASgCACABKAIEIABBCGoiARCCDSACKALAB0EyRg0ZIAAQ0QEgAEE4aiACQcAHakE4aikDADcDACAAQTBqIAJBwAdqQTBqKQMANwMAIABBKGogAkHAB2pBKGopAwA3AwAgAEEgaiACQcAHakEgaikDADcDACAAQRhqIAJBwAdqQRhqKQMANwMAIABBEGogAkHAB2pBEGopAwA3AwAgASACQcAHakEIaikDADcDACAAIAIpA8AHNwMADBkLIAAoAgQiACgCACIDQRpHDRUgAkGAB2ogASgCACABKAIEIABBCGoiARCCDSACKAKAB0EyRg0YIAAQ0QEgAEE4aiACQYAHakE4aikDADcDACAAQTBqIAJBgAdqQTBqKQMANwMAIABBKGogAkGAB2pBKGopAwA3AwAgAEEgaiACQYAHakEgaikDADcDACAAQRhqIAJBgAdqQRhqKQMANwMAIABBEGogAkGAB2pBEGopAwA3AwAgASACQYAHakEIaikDADcDACAAIAIpA4AHNwMADBgLIAAoAgQiACgCACIDQRpHDRQgAkHABmogASgCACABKAIEIABBCGoiARCCDSACKALABkEyRg0XIAAQ0QEgAEE4aiACQcAGakE4aikDADcDACAAQTBqIAJBwAZqQTBqKQMANwMAIABBKGogAkHABmpBKGopAwA3AwAgAEEgaiACQcAGakEgaikDADcDACAAQRhqIAJBwAZqQRhqKQMANwMAIABBEGogAkHABmpBEGopAwA3AwAgASACQcAGakEIaikDADcDACAAIAIpA8AGNwMADBcLIAAoAgwhAyAAKAIIIQAgAiABNgKADyADRQ0WIANBKGwhAQNAIAJBgA9qIAAQzwMgAEEoaiEAIAFBWGoiAQ0ADBcLCyAAKAIEIAEQlwEMFQsgAC0ANEECRw0UIABBCGohAQNAIAEoAhgiAS0ALEECRg0ADBULCyAAKAIEIgAoAgAiA0EaRw0QIAJBgAZqIAEoAgAgASgCBCAAQQhqIgEQgg0gAigCgAZBMkYNEyAAENEBIABBOGogAkGABmpBOGopAwA3AwAgAEEwaiACQYAGakEwaikDADcDACAAQShqIAJBgAZqQShqKQMANwMAIABBIGogAkGABmpBIGopAwA3AwAgAEEYaiACQYAGakEYaikDADcDACAAQRBqIAJBgAZqQRBqKQMANwMAIAEgAkGABmpBCGopAwA3AwAgACACKQOABjcDAAwTCyAAKAIEIgAoAgAiA0EaRw0PIAJBwAVqIAEoAgAgASgCBCAAQQhqIgEQgg0gAigCwAVBMkYNEiAAENEBIABBOGogAkHABWpBOGopAwA3AwAgAEEwaiACQcAFakEwaikDADcDACAAQShqIAJBwAVqQShqKQMANwMAIABBIGogAkHABWpBIGopAwA3AwAgAEEYaiACQcAFakEYaikDADcDACAAQRBqIAJBwAVqQRBqKQMANwMAIAEgAkHABWpBCGopAwA3AwAgACACKQPABTcDAAwSCyAAKAIMIgBFDREgASAAEOQMDBELAkAgACgCICIGQQhqKAIAIgBFDQAgBkEEaigCACEDIABBDGwhBANAAkACQCADKAIAIgAoAgBBGkcNACACQYAOaiABKAIAIAEoAgQgAEEIaiIFEIINIAIoAoAOQTJGDQEgABDRASAAQThqIAJBgA5qQThqKQMANwMAIABBMGogAkGADmpBMGopAwA3AwAgAEEoaiACQYAOakEoaikDADcDACAAQSBqIAJBgA5qQSBqKQMANwMAIABBGGogAkGADmpBGGopAwA3AwAgAEEQaiACQYAOakEQaikDADcDACAFIAJBgA5qQQhqKQMANwMAIAAgAikDgA43AwAMAQsgACABEEYLIANBDGohAyAEQXRqIgQNAAsLAkAgBkEUaigCACIDRQ0AIAZBEGooAgAhACADQdgAbCEDA0AgACABEGkgAEHYAGohACADQah/aiIDDQALCyAGKAIwIgBFDRAgACgCACIDQRpHDQ0gAkHAC2ogASgCACABKAIEIABBCGoiARCCDSACKALAC0EyRg0QIAAQ0QEgAEE4aiACQcALakE4aikDADcDACAAQTBqIAJBwAtqQTBqKQMANwMAIABBKGogAkHAC2pBKGopAwA3AwAgAEEgaiACQcALakEgaikDADcDACAAQRhqIAJBwAtqQRhqKQMANwMAIABBEGogAkHAC2pBEGopAwA3AwAgASACQcALakEIaikDADcDACAAIAIpA8ALNwMADBALAkAgACgCDCIERQ0AIAAoAgghAyAEQShsIQQDQCADIAEQqgMgA0EoaiEDIARBWGoiBA0ACwsCQCAAKAIQIgAoAgBBgICAgHhHDQAgAEEEaiABEM4MDBALIAAoAggiA0UNDyAAKAIEIQAgA0EwbCEDA0AgACABEHAgAEEwaiEAIANBUGoiAw0ADBALCwJAAkAgACgCBCIDKAIAQRpHDQAgAkGABWogASgCACABKAIEIANBCGoiBBCCDSACKAKABUEyRg0BIAMQ0QEgA0E4aiACQYAFakE4aikDADcDACADQTBqIAJBgAVqQTBqKQMANwMAIANBKGogAkGABWpBKGopAwA3AwAgA0EgaiACQYAFakEgaikDADcDACADQRhqIAJBgAVqQRhqKQMANwMAIANBEGogAkGABWpBEGopAwA3AwAgBCACQYAFakEIaikDADcDACADIAIpA4AFNwMADAELIAMgARBGCyAAKAIIIgBBCGooAgAiBEUNDiAAQQRqKAIAIQMgBEECdCEEA0ACQAJAIAMoAgAiACgCAEEaRw0AIAJBgAtqIAEoAgAgASgCBCAAQQhqIgUQgg0gAigCgAtBMkYNASAAENEBIABBOGogAkGAC2pBOGopAwA3AwAgAEEwaiACQYALakEwaikDADcDACAAQShqIAJBgAtqQShqKQMANwMAIABBIGogAkGAC2pBIGopAwA3AwAgAEEYaiACQYALakEYaikDADcDACAAQRBqIAJBgAtqQRBqKQMANwMAIAUgAkGAC2pBCGopAwA3AwAgACACKQOACzcDAAwBCyAAIAEQRgsgA0EEaiEDIARBfGoiBA0ADA8LCyAAKAIMIgRFDQ0gACgCCCEDIARBAnQhBANAAkACQCADKAIAIgAoAgBBGkcNACACQcAKaiABKAIAIAEoAgQgAEEIaiIFEIINIAIoAsAKQTJGDQEgABDRASAAQThqIAJBwApqQThqKQMANwMAIABBMGogAkHACmpBMGopAwA3AwAgAEEoaiACQcAKakEoaikDADcDACAAQSBqIAJBwApqQSBqKQMANwMAIABBGGogAkHACmpBGGopAwA3AwAgAEEQaiACQcAKakEQaikDADcDACAFIAJBwApqQQhqKQMANwMAIAAgAikDwAo3AwAMAQsgACABEEYLIANBBGohAyAEQXxqIgQNAAwOCwsgACgCDCIERQ0MIAAoAgghAyAEQQJ0IQQDQAJAAkAgAygCACIAKAIAQRpHDQAgAkGACmogASgCACABKAIEIABBCGoiBRCCDSACKAKACkEyRg0BIAAQ0QEgAEE4aiACQYAKakE4aikDADcDACAAQTBqIAJBgApqQTBqKQMANwMAIABBKGogAkGACmpBKGopAwA3AwAgAEEgaiACQYAKakEgaikDADcDACAAQRhqIAJBgApqQRhqKQMANwMAIABBEGogAkGACmpBEGopAwA3AwAgBSACQYAKakEIaikDADcDACAAIAIpA4AKNwMADAELIAAgARBGCyADQQRqIQMgBEF8aiIEDQAMDQsLIABBBGohAwJAAkAgACgCECIAKAIAQRpHDQAgAkHABGogASgCACABKAIEIABBCGoiBBCCDSACKALABEEyRg0BIAAQ0QEgAEE4aiACQcAEakE4aikDADcDACAAQTBqIAJBwARqQTBqKQMANwMAIABBKGogAkHABGpBKGopAwA3AwAgAEEgaiACQcAEakEgaikDADcDACAAQRhqIAJBwARqQRhqKQMANwMAIABBEGogAkHABGpBEGopAwA3AwAgBCACQcAEakEIaikDADcDACAAIAIpA8AENwMADAELIAAgARBGCyADKAIAQYCAgIB4Rg0LIAEgAxD2CgwLCwJAIAAtABhBBUcNACABIAAoAhAQ5AwLIAAoAgwiA0UNCiADQQR0IQQgACgCCEEMaiEDA0ACQAJAIAMoAgAiACgCAEEaRw0AIAJBwAlqIAEoAgAgASgCBCAAQQhqIgUQgg0gAigCwAlBMkYNASAAENEBIABBOGogAkHACWpBOGopAwA3AwAgAEEwaiACQcAJakEwaikDADcDACAAQShqIAJBwAlqQShqKQMANwMAIABBIGogAkHACWpBIGopAwA3AwAgAEEYaiACQcAJakEYaikDADcDACAAQRBqIAJBwAlqQRBqKQMANwMAIAUgAkHACWpBCGopAwA3AwAgACACKQPACTcDAAwBCyAAIAEQRgsgA0EQaiEDIARBcGoiBA0ADAsLCwJAAkAgACgCBCIDKAIAQRpHDQAgAkGABGogASgCACABKAIEIANBCGoiBBCCDSACKAKABEEyRg0BIAMQ0QEgA0E4aiACQYAEakE4aikDADcDACADQTBqIAJBgARqQTBqKQMANwMAIANBKGogAkGABGpBKGopAwA3AwAgA0EgaiACQYAEakEgaikDADcDACADQRhqIAJBgARqQRhqKQMANwMAIANBEGogAkGABGpBEGopAwA3AwAgBCACQYAEakEIaikDADcDACADIAIpA4AENwMADAELIAMgARBGCwJAAkAgACgCCCIDKAIAQRpHDQAgAkHAA2ogASgCACABKAIEIANBCGoiBBCCDSACKALAA0EyRg0BIAMQ0QEgA0E4aiACQcADakE4aikDADcDACADQTBqIAJBwANqQTBqKQMANwMAIANBKGogAkHAA2pBKGopAwA3AwAgA0EgaiACQcADakEgaikDADcDACADQRhqIAJBwANqQRhqKQMANwMAIANBEGogAkHAA2pBEGopAwA3AwAgBCACQcADakEIaikDADcDACADIAIpA8ADNwMADAELIAMgARBGCyAAKAIMIgAoAgAiA0EaRw0GIAJBgANqIAEoAgAgASgCBCAAQQhqIgEQgg0gAigCgANBMkYNCSAAENEBIABBOGogAkGAA2pBOGopAwA3AwAgAEEwaiACQYADakEwaikDADcDACAAQShqIAJBgANqQShqKQMANwMAIABBIGogAkGAA2pBIGopAwA3AwAgAEEYaiACQYADakEYaikDADcDACAAQRBqIAJBgANqQRBqKQMANwMAIAEgAkGAA2pBCGopAwA3AwAgACACKQOAAzcDAAwJCyAAKAIIQQFHDQggASAAQQxqEM8MDAgLAkACQCAAKAIoIgMoAgBBGkcNACACQcACaiABKAIAIAEoAgQgA0EIaiIEEIINIAIoAsACQTJGDQEgAxDRASADQThqIAJBwAJqQThqKQMANwMAIANBMGogAkHAAmpBMGopAwA3AwAgA0EoaiACQcACakEoaikDADcDACADQSBqIAJBwAJqQSBqKQMANwMAIANBGGogAkHAAmpBGGopAwA3AwAgA0EQaiACQcACakEQaikDADcDACAEIAJBwAJqQQhqKQMANwMAIAMgAikDwAI3AwAMAQsgAyABEEYLIAAoAghBAkkNByABIABBDGoQzwwMBwsCQAJAIANBC0cNAAJAAkAgACgCBA4DAAEDAAsgACgCECIERQ0CIAAoAgwhAyAEQShsIQQDQAJAIAMoAgBBB0YNACADIAEQqgMLIANBKGohAyAEQVhqIgQNAAwDCwsgACgCECIDRQ0BIAAoAgwhBSADQThsIQZBACEDA0ACQAJAAkACQAJAAkACQCAFIANqIgQoAgAOAwABAgALIARBCGooAgBBA0cNBCAEQQxqKAIAIgcoAgBBGkcNAiACQYAPaiABKAIAIAEoAgQgB0EIaiIIEIINIAIoAoAPQTJGDQQgBxDRASAHQThqIAJBgA9qQThqKQMANwMAIAdBMGogAkGAD2pBMGopAwA3AwAgB0EoaiACQYAPakEoaikDADcDACAHQSBqIAJBgA9qQSBqKQMANwMAIAdBGGogAkGAD2pBGGopAwA3AwAgB0EQaiACQYAPakEQaikDADcDACAIIAJBgA9qQQhqKQMANwMAIAcgAikDgA83AwAMBAsgBEEwaigCACIERQ0EIAQoAgBBGkcNAiACQYAPaiABKAIAIAEoAgQgBEEIaiIHEIINIAIoAoAPQTJGDQQgBBDRASAEQThqIAJBgA9qQThqKQMANwMAIARBMGogAkGAD2pBMGopAwA3AwAgBEEoaiACQYAPakEoaikDADcDACAEQSBqIAJBgA9qQSBqKQMANwMAIARBGGogAkGAD2pBGGopAwA3AwAgBEEQaiACQYAPakEQaikDADcDACAHIAJBgA9qQQhqKQMANwMAIAQgAikDgA83AwAMBAsgBEEEaigCACABEKoDDAMLIAcgARBGDAELIAQgARBGDAELIARBKGooAgAgARCqAwsgBiADQThqIgNHDQAMAgsLAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCADDgsUAAECAwQFBgcIFBQLIAAoAigiAygCAEEaRw0IIAJBwA5qIAEoAgAgASgCBCADQQhqIgQQgg0gAigCwA5BMkYNEiADENEBIANBOGogAkHADmpBOGopAwA3AwAgA0EwaiACQcAOakEwaikDADcDACADQShqIAJBwA5qQShqKQMANwMAIANBIGogAkHADmpBIGopAwA3AwAgA0EYaiACQcAOakEYaikDADcDACADQRBqIAJBwA5qQRBqKQMANwMAIAQgAkHADmpBCGopAwA3AwAgAyACKQPADjcDAAwSCyAAKAIIQQFHDRIgACgCDCIDKAIAQRpHDQggAkGAD2ogASgCACABKAIEIANBCGoiBBCCDSACKAKAD0EyRg0SIAMQ0QEgA0E4aiACQYAPakE4aikDADcDACADQTBqIAJBgA9qQTBqKQMANwMAIANBKGogAkGAD2pBKGopAwA3AwAgA0EgaiACQYAPakEgaikDADcDACADQRhqIAJBgA9qQRhqKQMANwMAIANBEGogAkGAD2pBEGopAwA3AwAgBCACQYAPakEIaikDADcDACADIAIpA4APNwMADBILIAAoAgQiAygCAEEaRw0IIAJBgA9qIAEoAgAgASgCBCADQQhqIgQQgg0gAigCgA9BMkYNESADENEBIANBOGogAkGAD2pBOGopAwA3AwAgA0EwaiACQYAPakEwaikDADcDACADQShqIAJBgA9qQShqKQMANwMAIANBIGogAkGAD2pBIGopAwA3AwAgA0EYaiACQYAPakEYaikDADcDACADQRBqIAJBgA9qQRBqKQMANwMAIAQgAkGAD2pBCGopAwA3AwAgAyACKQOADzcDAAwRCwJAIAAoAgQiAygCACIFQQNHDQAgA0EEaiABEIQHDBELIAMoAiAiBCgCAEEaRw0IIAJBwA5qIAEoAgAgASgCBCAEQQhqIgYQgg0gAigCwA5BMkYNDiAEENEBIARBOGogAkHADmpBOGopAwA3AwAgBEEwaiACQcAOakEwaikDADcDACAEQShqIAJBwA5qQShqKQMANwMAIARBIGogAkHADmpBIGopAwA3AwAgBEEYaiACQcAOakEYaikDADcDACAEQRBqIAJBwA5qQRBqKQMANwMAIAYgAkHADmpBCGopAwA3AwAgBCACKQPADjcDAAwOCyAAKAIEIgMoAgBBGkcNCCACQYAPaiABKAIAIAEoAgQgA0EIaiIEEIINIAIoAoAPQTJGDQ8gAxDRASADQThqIAJBgA9qQThqKQMANwMAIANBMGogAkGAD2pBMGopAwA3AwAgA0EoaiACQYAPakEoaikDADcDACADQSBqIAJBgA9qQSBqKQMANwMAIANBGGogAkGAD2pBGGopAwA3AwAgA0EQaiACQYAPakEQaikDADcDACAEIAJBgA9qQQhqKQMANwMAIAMgAikDgA83AwAMDwsgACgCBCIDKAIAQRpHDQggAkGAD2ogASgCACABKAIEIANBCGoiBBCCDSACKAKAD0EyRg0OIAMQ0QEgA0E4aiACQYAPakE4aikDADcDACADQTBqIAJBgA9qQTBqKQMANwMAIANBKGogAkGAD2pBKGopAwA3AwAgA0EgaiACQYAPakEgaikDADcDACADQRhqIAJBgA9qQRhqKQMANwMAIANBEGogAkGAD2pBEGopAwA3AwAgBCACQYAPakEIaikDADcDACADIAIpA4APNwMADA4LIAAoAgQiAygCAEEaRw0IIAJBgA9qIAEoAgAgASgCBCADQQhqIgQQgg0gAigCgA9BMkYNDSADENEBIANBOGogAkGAD2pBOGopAwA3AwAgA0EwaiACQYAPakEwaikDADcDACADQShqIAJBgA9qQShqKQMANwMAIANBIGogAkGAD2pBIGopAwA3AwAgA0EYaiACQYAPakEYaikDADcDACADQRBqIAJBgA9qQRBqKQMANwMAIAQgAkGAD2pBCGopAwA3AwAgAyACKQOADzcDAAwNCyAAKAIEIgMoAgBBGkcNCCACQYAPaiABKAIAIAEoAgQgA0EIaiIEEIINIAIoAoAPQTJGDQwgAxDRASADQThqIAJBgA9qQThqKQMANwMAIANBMGogAkGAD2pBMGopAwA3AwAgA0EoaiACQYAPakEoaikDADcDACADQSBqIAJBgA9qQSBqKQMANwMAIANBGGogAkGAD2pBGGopAwA3AwAgA0EQaiACQYAPakEQaikDADcDACAEIAJBgA9qQQhqKQMANwMAIAMgAikDgA83AwAMDAsgACgCBCIDKAIAQRpHDQggAkGAD2ogASgCACABKAIEIANBCGoiBBCCDSACKAKAD0EyRg0LIAMQ0QEgA0E4aiACQYAPakE4aikDADcDACADQTBqIAJBgA9qQTBqKQMANwMAIANBKGogAkGAD2pBKGopAwA3AwAgA0EgaiACQYAPakEgaikDADcDACADQRhqIAJBgA9qQRhqKQMANwMAIANBEGogAkGAD2pBEGopAwA3AwAgBCACQYAPakEIaikDADcDACADIAIpA4APNwMADAsLIAMgARBGDAkLIAMgARBGDAkLIAMgARBGDAgLIAQgARBGDAULIAMgARBGDAYLIAMgARBGDAULIAMgARBGDAQLIAMgARBGDAMLIAMgARBGDAILIAVBAkkNAQJAIAMoAgQiAygCAEEaRw0AIAJBgA9qIAEoAgAgASgCBCADQQhqIgQQgg0gAigCgA9BMkYNAiADENEBIANBOGogAkGAD2pBOGopAwA3AwAgA0EwaiACQYAPakEwaikDADcDACADQShqIAJBgA9qQShqKQMANwMAIANBIGogAkGAD2pBIGopAwA3AwAgA0EYaiACQYAPakEYaikDADcDACADQRBqIAJBgA9qQRBqKQMANwMAIAQgAkGAD2pBCGopAwA3AwAgAyACKQOADzcDAAwCCyADIAEQRgwBCyAAKAIIQQJJDQACQCAAKAIMIgMoAgBBGkcNACACQYAPaiABKAIAIAEoAgQgA0EIaiIEEIINIAIoAoAPQTJGDQEgAxDRASADQThqIAJBgA9qQThqKQMANwMAIANBMGogAkGAD2pBMGopAwA3AwAgA0EoaiACQYAPakEoaikDADcDACADQSBqIAJBgA9qQSBqKQMANwMAIANBGGogAkGAD2pBGGopAwA3AwAgA0EQaiACQYAPakEQaikDADcDACAEIAJBgA9qQQhqKQMANwMAIAMgAikDgA83AwAMAQsgAyABEEYLIAAoAjgiACgCACIDQRpHDQMgAkGAAmogASgCACABKAIEIABBCGoiARCCDSACKAKAAkEyRg0GIAAQ0QEgAEE4aiACQYACakE4aikDADcDACAAQTBqIAJBgAJqQTBqKQMANwMAIABBKGogAkGAAmpBKGopAwA3AwAgAEEgaiACQYACakEgaikDADcDACAAQRhqIAJBgAJqQRhqKQMANwMAIABBEGogAkGAAmpBEGopAwA3AwAgASACQYACakEIaikDADcDACAAIAIpA4ACNwMADAYLAkACQCAAKAIEIgMoAgBBGkcNACACQcABaiABKAIAIAEoAgQgA0EIaiIEEIINIAIoAsABQTJGDQEgAxDRASADQThqIAJBwAFqQThqKQMANwMAIANBMGogAkHAAWpBMGopAwA3AwAgA0EoaiACQcABakEoaikDADcDACADQSBqIAJBwAFqQSBqKQMANwMAIANBGGogAkHAAWpBGGopAwA3AwAgA0EQaiACQcABakEQaikDADcDACAEIAJBwAFqQQhqKQMANwMAIAMgAikDwAE3AwAMAQsgAyABEEYLIAAoAggiACgCACIDQRpHDQIgAkGAAWogASgCACABKAIEIABBCGoiARCCDSACKAKAAUEyRg0FIAAQ0QEgAEE4aiACQYABakE4aikDADcDACAAQTBqIAJBgAFqQTBqKQMANwMAIABBKGogAkGAAWpBKGopAwA3AwAgAEEgaiACQYABakEgaikDADcDACAAQRhqIAJBgAFqQRhqKQMANwMAIABBEGogAkGAAWpBEGopAwA3AwAgASACQYABakEIaikDADcDACAAIAIpA4ABNwMADAULIAAoAgwiACgCACIDQRpHDQEgAkHAAGogASgCACABKAIEIABBCGoiARCCDSACKAJAQTJGDQQgABDRASAAQThqIAJBwABqQThqKQMANwMAIABBMGogAkHAAGpBMGopAwA3AwAgAEEoaiACQcAAakEoaikDADcDACAAQSBqIAJBwABqQSBqKQMANwMAIABBGGogAkHAAGpBGGopAwA3AwAgAEEQaiACQcAAakEQaikDADcDACABIAJBwABqQQhqKQMANwMAIAAgAikDQDcDAAwECyAAKAIEIgAoAgAiA0EaRw0ACyACIAEoAgAgASgCBCAAQQhqIgEQgg0gAigCAEEyRg0CIAAQ0QEgAEE4aiACQThqKQMANwMAIABBMGogAkEwaikDADcDACAAQShqIAJBKGopAwA3AwAgAEEgaiACQSBqKQMANwMAIABBGGogAkEYaikDADcDACAAQRBqIAJBEGopAwA3AwAgASACQQhqKQMANwMAIAAgAikDADcDAAwCCwJAIAAoAiAiCEEIaigCACIARQ0AIAhBBGooAgAiBiAAQQZ0aiEHA0ACQCAGQThqKAIAIgBFDQAgBkE0aigCACEDIABBDGwhBANAAkACQCADKAIAIgAoAgBBGkcNACACQcANaiABKAIAIAEoAgQgAEEIaiIFEIINIAIoAsANQTJGDQEgABDRASAAQThqIAJBwA1qQThqKQMANwMAIABBMGogAkHADWpBMGopAwA3AwAgAEEoaiACQcANakEoaikDADcDACAAQSBqIAJBwA1qQSBqKQMANwMAIABBGGogAkHADWpBGGopAwA3AwAgAEEQaiACQcANakEQaikDADcDACAFIAJBwA1qQQhqKQMANwMAIAAgAikDwA03AwAMAQsgACABEEYLIANBDGohAyAEQXRqIgQNAAsLIAYgARCbBCAGQcAAaiIAIQYgACAHRw0ACwsCQCAIQRRqKAIAIgBFDQAgCEEQaigCACEDIABBDGwhBANAAkACQCADKAIAIgAoAgBBGkcNACACQYANaiABKAIAIAEoAgQgAEEIaiIFEIINIAIoAoANQTJGDQEgABDRASAAQThqIAJBgA1qQThqKQMANwMAIABBMGogAkGADWpBMGopAwA3AwAgAEEoaiACQYANakEoaikDADcDACAAQSBqIAJBgA1qQSBqKQMANwMAIABBGGogAkGADWpBGGopAwA3AwAgAEEQaiACQYANakEQaikDADcDACAFIAJBgA1qQQhqKQMANwMAIAAgAikDgA03AwAMAQsgACABEEYLIANBDGohAyAEQXRqIgQNAAsLIAgoAhhBgICAgHhGDQEgCCgCICIDRQ0BIAgoAhwhACADQTBsIQMDQCAAIAEQcCAAQTBqIQAgA0FQaiIDDQAMAgsLIAAoAgwiA0UNACAAKAIIIgkgA0EMbGohCgNAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAkoAgAiAA0AAkACQAJAAkACQCAJKAIEIgAoAgAiBEF7aiIDQQQgA0EGSRsOBhAAAQIDBBALIAAoAghBA0cNDiAAKAIMIgMoAgBBGkcNBSACQYAPaiABKAIAIAEoAgQgA0EIaiIEEIINIAIoAoAPQTJGDQ4gAxDRASADQThqIAJBgA9qQThqKQMANwMAIANBMGogAkGAD2pBMGopAwA3AwAgA0EoaiACQYAPakEoaikDADcDACADQSBqIAJBgA9qQSBqKQMANwMAIANBGGogAkGAD2pBGGopAwA3AwAgA0EQaiACQYAPakEQaikDADcDACAEIAJBgA9qQQhqKQMANwMAIAMgAikDgA83AwAMDgsgACgCKCIAKAIAQRpHDQUgAkGAD2ogASgCACABKAIEIABBCGoiAxCCDSACKAKAD0EyRg0OIAAQ0QEgAEE4aiACQYAPakE4aikDADcDACAAQTBqIAJBgA9qQTBqKQMANwMAIABBKGogAkGAD2pBKGopAwA3AwAgAEEgaiACQYAPakEgaikDADcDACAAQRhqIAJBgA9qQRhqKQMANwMAIABBEGogAkGAD2pBEGopAwA3AwAgAyACQYAPakEIaikDADcDACAAIAIpA4APNwMADA4LIAAoAghBA0cNCyAAKAIMIgMoAgBBGkcNBSACQYAPaiABKAIAIAEoAgQgA0EIaiIEEIINIAIoAoAPQTJGDQsgAxDRASADQThqIAJBgA9qQThqKQMANwMAIANBMGogAkGAD2pBMGopAwA3AwAgA0EoaiACQYAPakEoaikDADcDACADQSBqIAJBgA9qQSBqKQMANwMAIANBGGogAkGAD2pBGGopAwA3AwAgA0EQaiACQYAPakEQaikDADcDACAEIAJBgA9qQQhqKQMANwMAIAMgAikDgA83AwAMCwsgAEEgaiEDIARBA0cNCSAAKAIEIgQoAgBBGkcNBSACQYAPaiABKAIAIAEoAgQgBEEIaiIFEIINIAIoAoAPQTJGDQkgBBDRASAEQThqIAJBgA9qQThqKQMANwMAIARBMGogAkGAD2pBMGopAwA3AwAgBEEoaiACQYAPakEoaikDADcDACAEQSBqIAJBgA9qQSBqKQMANwMAIARBGGogAkGAD2pBGGopAwA3AwAgBEEQaiACQYAPakEQaikDADcDACAFIAJBgA9qQQhqKQMANwMAIAQgAikDgA83AwAMCQsgACgCCEEDRw0HIAAoAgwiAygCAEEaRw0FIAJBwA5qIAEoAgAgASgCBCADQQhqIgQQgg0gAigCwA5BMkYNByADENEBIANBOGogAkHADmpBOGopAwA3AwAgA0EwaiACQcAOakEwaikDADcDACADQShqIAJBwA5qQShqKQMANwMAIANBIGogAkHADmpBIGopAwA3AwAgA0EYaiACQcAOakEYaikDADcDACADQRBqIAJBwA5qQRBqKQMANwMAIAQgAkHADmpBCGopAwA3AwAgAyACKQPADjcDAAwHCyAAKAIAQRpHDQUgAkHADGogASgCACABKAIEIABBCGoiAxCCDSACKALADEEyRg0KIAAQ0QEgAEE4aiACQcAMakE4aikDADcDACAAQTBqIAJBwAxqQTBqKQMANwMAIABBKGogAkHADGpBKGopAwA3AwAgAEEgaiACQcAMakEgaikDADcDACAAQRhqIAJBwAxqQRhqKQMANwMAIABBEGogAkHADGpBEGopAwA3AwAgAyACQcAMakEIaikDADcDACAAIAIpA8AMNwMADAoLIAMgARBGDAgLIAAgARBGDAgLIAMgARBGDAULIAQgARBGDAMLIAMgARBGDAELIAAgARBGDAQLAkAgACgCKCILQQhqKAIAIgBFDQAgC0EEaigCACIMIABBBnRqIQ0DQAJAIAxBOGooAgAiAEUNACAMQTRqKAIAIQMgAEEMbCEEA0ACQAJAIAMoAgAiACgCAEEaRw0AIAEoAgBBAUcNASABKAIEIgYgACgCGEcNAQJAAkAgACkDCCIPQgODQgBSDQAgD6ciBSAFKAIAIgVBAWo2AgAgBUF/TA0BC0EALQDg9p0BGiAAKAIUIQcgACgCECEIIAAtABwhDkHAABCEASIFRQ0AIAUgDjoAHCAFIAY2AhggBUIANwMQIAUgDzcDCCAFQRo2AgAgABDRASAAIAU2AiggACAHNgIkIAAgCDYCICAAQgA3AxggAEKRvgE3AxAgAEEANgIIIABBFDYCAAwCCwALIAAgARBGCyADQQxqIQMgBEF0aiIEDQALCyAMIAEQmwQgDEHA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IAggAkHUAmoQ+wwgAkHUAmoQ2wgaIAJBAToAiAUMGQsgAkHoBGogAkHUAmoQtQEgAigC7AQhAyACKALoBCIaQSJGDRkgAigC/AQhBiACKAL4BCEHIAIoAvQEISYgAigC8AQhIAJAQSRFIgENACACQZAEaiATQST8CgAACyACKAKkBSEEIAENFCACQeACaiACQZAEakEk/AoAAAwUCwJAQSRFDQAgAkG4BGogAkGEA2pBJPwKAAALIAJB6ARqIAJB1AJqIAJBuARqEIkEIAJBgARqQQhqIiAgE0EIaikCADcDACACIBMpAgA3A4AEIAIoAvwEIQYgAigC+AQhByACKAL0BCEBIAIoAvAEIQUgAigC7AQhAyACKALoBCIaQSJGDQcgCiAJKQIANwIAIApBEGogCUEQaigCADYCACAKQQhqIAlBCGopAgA3AgAgAkHgAmpBCGogAkGABGpBCGopAwA3AwAgAiACKQOABDcD4AIMEgsCQEEkRQ0AIAJBuARqIAJBhANqQST8CgAACyACQegEaiACQdQCaiACQbgEahDMAiACQYAEakEIaiIgIBNBCGopAgA3AwAgAiATKQIANwOABCACKAL8BCEGIAIoAvgEIQcgAigC9AQhASACKALwBCEFIAIoAuwEIQMgAigC6AQiGkEiRg0HIAogCSkCADcCACAKQRBqIAlBEGooAgA2AgAgCkEIaiAJQQhqKQIANwIAIAJB4AJqQQhqIAJBgARqQQhqKQMANwMAIAIgAikDgAQ3A+ACDBELAkBBJEUNACACQbgEaiACQYQDakEk/AoAAAsgAkHoBGogAkHUAmogAkG4BGoQhAUgAkGABGpBCGoiICATQQhqKQIANwMAIAIgEykCADcDgAQgAigC/AQhBiACKAL4BCEHIAIoAvQEIQEgAigC8AQhBSACKALsBCEDIAIoAugEIhpBIkYNByAKIAkpAgA3AgAgCkEQaiAJQRBqKAIANgIAIApBCGogCUEIaikCADcCACACQeACakEIaiACQYAEakEIaikDADcDACACIAIpA4AENwPgAgwQCyACQegEaiACQdQCahDtAiACKAKABSEGIAIoAvwEIQcgAigC+AQhJiACKAL0BCEgIAIoAvAEIQMgAigC7AQhGiACKALoBCELAkBBJEUiDA0AIAJBuARqIA5BJPwKAAALIAIoAqgFIQQgC0GJgMQARw0HQSRFDRAgAkHgAmogAkG4BGpBJPwKAAAMEAsCQEEkRQ0AIAJBuARqIAJBhANqQST8CgAACyACQQM2AtQKIAJB6ARqIAJB1AJqIAJBuARqIAJB1ApqEJcEIAJBgARqQQhqIiAgE0EIaikCADcDACACIBMpAgA3A4AEIAIoAvwEIQYgAigC+AQhByACKAL0BCEBIAIoAvAEIQUgAigC7AQhAyACKALoBCIaQSJGDQcgCiAJKQIANwIAIApBEGogCUEQaigCADYCACAKQQhqIAlBCGopAgA3AgAgAkHgAmpBCGogAkGABGpBCGopAwA3AwAgAiACKQOABDcD4AIMDgsCQEEkRQ0AIAJBuARqIAJBhANqQST8CgAACyACQQQ2AtQKIAJB6ARqIAJB1AJqIAJBuARqIAJB1ApqEJcEIAJBgARqQQhqIiAgE0EIaikCADcDACACIBMpAgA3A4AEIAIoAvwEIQYgAigC+AQhByACKAL0BCEBIAIoAvAEIQUgAigC7AQhAyACKALoBCIaQSJGDQcgCiAJKQIANwIAIApBEGogCUEQaigCADYCACAKQQhqIAlBCGopAgA3AgAgAkHgAmpBCGogAkGABGpBCGopAwA3AwAgAiACKQOABDcD4AIMDQsCQEEkRQ0AIAJBuARqIAJBhANqQST8CgAACyACQQU2AtQKIAJB6ARqIAJB1AJqIAJBuARqIAJB1ApqEJcEIAJBgARqQQhqIiAgE0EIaikCADcDACACIBMpAgA3A4AEIAIoAvwEIQYgAigC+AQhByACKAL0BCEBIAIoAvAEIQUgAigC7AQhAyACKALoBCIaQSJGDQcgCiAJKQIANwIAIApBEGogCUEQaigCADYCACAKQQhqIAlBCGopAgA3AgAgAkHgAmpBCGogAkGABGpBCGopAwA3AwAgAiACKQOABDcD4AIMDAsCQEEkRQ0AIAJBuARqIAJBhANqQST8CgAACyACQegEaiACQdQCaiACQbgEahD/ASACQYAEakEIaiIgIBNBCGopAgA3AwAgAiATKQIANwOABCACKAL8BCEGIAIoAvgEIQcgAigC9AQhASACKALwBCEFIAIoAuwEIQMgAigC6AQiGkEiRg0HIAogCSkCADcCACAKQRBqIAlBEGooAgA2AgAgCkEIaiAJQQhqKQIANwIAIAJB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AzYCACACQegEaiABEKUQIAIoAugEQRBHDQFBpLKFARDJIgALIAJBADYC6ARBACACQYQDakGgipsBIAJB6ARqQbSyhQEQxxsACyACQagDakEYaiACQegEakEYaigCADYCACACQagDakEQaiACQegEakEQaikCADcDACACQagDakEIaiACQegEakEIaikCADcDACACIAIpAugENwOoAyAMIAJBqANqEPwJQQEhAUGAgICAeCEDDAgLQZSyhQEQ+BYACyAMIBpBJPwKAAAMBQsgAiAFNgLABCACKAKABCEDIBMhGAwACwtB5PmEARDJIgALIAItAJABISEgAi0AjwEhIyACLQCOASEoIAIoAsQBIQYgAigCwAEhAQJAAkAgAi0AiAEiHEEDRg0AIBxBAkYNACACKAJ8Ih0gHSgCACIDQQFqNgIAIANBf0wNCyACKAKEASEpIAIoAoABISoMAQsLIAItAI0BISsgAi0AjAEhLCACLQCVASEtIAItAJQBIS4gAi0AkwEhLyACKAJ4ITAgAigCdCExIAIoAnAhMiACKAJsITMgAi0AkgEhNCACLQCRASE1IAIoAlghNiACKAJUITcgAigCaCE4IAIoAmQhOSACKAJgITogAigCXCE7IAItAJYBITwgAkHoBGogBkEEQQQQpA4gAigC7AQhPQJAIAIoAugEQQFGDQAgAigC8AQhEEEAIRNBACEZAkAgBkUNACAQIQMgBiEFA0AgAyABNgIAIANBBGohAyABQRxqIQEgBUF/aiIFDQALIAYhGQsgAkEANgLkBCACQoCAgIDAADcC3AQCQAJAIBkNAEEBIRRBBCEVQQAhEUEEISZBACENDAELIAZBAnQhE0EAIQVBBCEHQQAhBgNAIBAgBWooAgAhAxDaHyIBIAMoAhgiAy0AMjoAMiABIAMvATA7ATAgASADKQIoNwIoIAEgAykCIDcCICABIAMpAhg3AhggASADKQIQNwIQIAEgAykCCDcCCCABIAMpAgA3AgACQCAGIAIoAtwERw0AIAJB3ARqEIAYIAIoAuAEIQcLIAcgBWogATYCACACIAZBAWoiBjYC5AQgEyAFQQRqIgVHDQALIAIoAuAEIhFBBGohJiARIAZBAnRqIRUgESgCACIBKAIUIRIgASgCECENQX8hE0EAIRQLQQAhA0EBIQZBASEHQQAhGkEAIR4g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AUHG/IMBEOQVIB5BCGogASgCADYCACAeIAIpAuwBNwIADAwLIAJBMGogAkGoA2oQjwMgAkEBNgLwASACQZTzmwE2AuwBIAJCATcC+AEgAkH1ADYC4AMgAiACQdwDajYC9AEgAiACQTBqNgLcAwJAIAJB1ApqQfDZgwEgAkHsAWoQ9AUNACACQQI2AvABIAJB0J+FATYC7AEgAkIBNwL4ASACQfUANgLgAyACIAJB3ANqNgL0ASACIAJBgARqNgLcAyACQdQKakHw2YMBIAJB7AFqEPQFDQACQCACKAK8AyIBRQ0AQQAhBSACQQA2AtABIAJCgICAgMAANwLIASABQRhsIQcgAigCuAMiA0EQaiEBIANBFGohBkEEIRpBACEDA0AgAkEFNgLgAyACQYCghQE2AtwDIAJCBDcC6AMgBigCACETIAJBDjYCiAIgAkEONgKAAiACQQ42AvgBIAJBDjYC8AEgAiATQX9qNgLUAiACIAE2AvwBIAIgAUF4ajYC9AEgAiABQXRqNgLsASACIAJB7AFqNgLkAyACIAJB1AJqNgKEAiACQeACaiACQdwDahCICgJAIAMgAigCyAFHDQAgAkHIAWoQgxggAigCzAEhGgsgGiAFaiITIAIpAuACNwIAIBNBCGogAkHgAmpBCGooAgA2AgAgAiADQQFqIgM2AtABIAFBGGohASAGQRhqIQYgBUEMaiEFIAdBaGoiBw0ACyACQdwDaiACKALMASADQaimmwFBARDsBCACQfUANgLkAiACQQI2AvABIAJB0J+FATYC7AEgAkIBNwL4ASACIAJB3ANqNgLgAiACIAJB4AJqNgL0ASACQdQKakHw2YMBIAJB7AFqEO0gIQEgAigC3AMgAigC4ANBAUEBENASIAJByAFqEPkWIAENAQsgAkEBNgLwASACQeSehQE2AuwBIAJCATcC+AEgAkH3ADYC4AMgAiAgNgLcAyACIAJB3ANqNgL0ASACQdQKakHw2YMBIAJB7AFqEPQFRQ0DCyACKAIwIAIoAjRBAUEBENASCyACKAKABCACKAKEBEEBQQEQ0BILIAJBqANqEJcUDAULIAIoAjAgAigCNEEBQQEQ0BIgAigCgAQgAigChARBAUEBENASCyACQagDahCXFAwGCyACQTBqIAJBqANqEI8DIAJBATYC8AEgAkGU85sBNgLsASACQgE3AvgBIAJB9QA2AuADIAIgAkHcA2o2AvQBIAIgAkEwajYC3AMCQCACQdQKakHw2YMBIAJB7AFqEPQFDQAgAkECNgLwASACQdCfhQE2AuwBIAJCATcC+AEgAkH1ADYC4AMgAiACQdwDajYC9AEgAiACQYAEajYC3AMgAkHUCmpB8NmDASACQewBahD0BQ0AAkAgAigCvAMiAUUNAEEAIQUgAkEANgLQASACQoCAgIDAADcCyAEgAUEYbCEHIAIoArgDIgNBEGohASADQRRqIQZBBCEaQQAhAwNAIAJBBTYC4AMgAkGAoIUBNgLcAyACQgQ3AugDIAYoAgAhEyACQQ42AogCIAJBDjYCgAIgAkEONgL4ASACQQ42AvABIAIgE0F/ajYC1AIgAiABNgL8ASACIAFBeGo2AvQBIAIgAUF0ajYC7AEgAiACQewBajYC5AMgAiACQdQCajYChAIgAkHgAmogAkHcA2oQiAoCQCADIAIoAsgBRw0AIAJByAFqEIMYIAIoAswBIRoLIBogBWoiEyACKQLgAjcCACATQQhqIAJB4AJqQQhqKAIANgIAIAIgA0EBaiIDNgLQASABQRhqIQEgBkEYaiEGIAVBDGohBSAHQWhqIgcNAAsgAkHcA2ogAigCzAEgA0GoppsBQQEQ7AQgAkH1ADYC5AIgAkECNgLwASACQdCfhQE2AuwBIAJCATcC+AEgAiACQdwDajYC4AIgAiACQeACajYC9AEgAkHUCmpB8NmDASACQewBahDtICEBIAIoAtwDIAIoAuADQQFBARDQEiACQcgBahD5FiABDQELIAJBATYC8AEgAkHknoUBNgLsASACQgE3AvgBIAJB9gA2AuADIAIgIDYC3AMgAiACQdwDajYC9AEgAkHUCmpB8NmDASACQewBahD0BUUNBAsgAigCMCACKAI0QQFBARDQEgsgAigCgAQgAigChARBAUEBENASCyACQagDahCXFAtBmNSbAUE3IAJBvAFqQYjagwFB0NSbARDqEAALIAIoAjAgAigCNEEBQQEQ0BIgAigCgAQgAigChARBAUEBENASCyACQagDahCXFAsgHiACKQLUCjcCACAeQQhqIAJB1ApqQQhqKAIANgIACwJAAkAgAigC6ARFDQACQCACKALwBCIBQV5qQQAgAUFdakEHSRsOAgEAAgsgAigC+ARB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ACAKNgIEIAAgAjYCAAwHCyADQdADaiAFQQRBCBCkDiADKALUAyEGAkACQAJAIAMoAtADQQFGDQBBACECIANBADYC5AEgAyADKALYAyIENgLgASADIAY2AtwBIAVBA3QhBiAKrSEvQQAhBQJAA0AgBiACRg0BIBE1AgAiMEKAAloNAyARNQIEIjFCgAJaDQQCQCAFIAMoAtwBRw0AIANB3AFqQbSwhAEQ8hcgAygC4AEhBAsgEUEIaiERIAQgAmogMEIghiAvhCAxQiiGhDcCACADIAVBAWoiBTYC5AEgAkEIaiECDAALCyADQdADaiABIANB3AFqEIQTIAMoAtQDIQICQCADKALQAyIFQSpGDQACQEE4RQ0AIABBCGogA0HQA2pBCGpBOPwKAAALIAAgAjYCBCAAIAU2AgAMCgsgACAKNgIIIAAgAjYCBCAAQSo2AgAMCQsgBiADKALYA0GEsIQBENggAAtBtKqbAUErIANB0ANqQfjogwFBlLCEARDqEAALQbSqmwFBKyADQdADakH46IMBQaSwhAEQ6hAACwJAAkACQAJAAkAgAS0ADEEBcQ0AIAEoAtgBDQIgAUF/NgLYASABQdwBaiECIAEoAuQBRQ0BIAEgAS8B7AFBAWoiBTsB7AEgBUH//wNxIAVGDQQgA0EANgLYAyADQgA3A9ADIANBADsB3AMgA0GQA2ogA0HQA2ogASgC6AFBrLqEARDECiABKALcASABQeABaigCAEEEQRAQxRIgAkEIaiADQZADakEIaigCADYCACACIAMpApADNwIADAQLAkAgASgChAENACADQcwCaiETIANBzgJqIRQgAUF/NgKEASABQYgBaiIVEJcKIAFBoAFqIRYgAUGsAWohFyADQcgCakEBaiEYIANBkANqQQRqIRkgA0EoakECciEaIAFBkAFqIQcgAUGMAWohCCABQbABaiEbIANBlgNqIRwgA0GZA2ohHSABQaQBaiEeA0AgESASRg0EIANB2AJqIBEoAgAgESgCBBDaGyARQQhqIRECQANAIANBhAJqIANB2AJqEN8CIAMtAIQCQQRGDQEgA0HIAmpBCGogA0GEAmpBCGotAAA6AAAgAyADKQCEAiIwNwPIAgJAAkACQAJAAkAgMKdB/wFxDgQEAAEDBAsgAy8AywIhBSADIAMtAMkCOgDLAiADLQDKAiEC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ICFB/wFxIAUoAgQgJEEDdGoiBS0ABEkNASAFLQAFQf8BcSAiQf8BcU8NBgwBCyAgIAJBhMiEARDDEgALIBUgA0HoAWogGiAlEP8QIQICQCApQQFxDQAgCCgCACAHKAIAICQgICAiICEgAhC/DQwBCyAgIAcoAgAiBU8NAiAkIAgoAgAgI2oiBSgCCCIETw0DIAUoAgQgJEEDdGoiBSAhOgAFIAUgIjoABCAFIAI2AgALICRBAWohJEEAISkgK0EDaiIrIChGDQkMAAsLICAgBUGUyIQBEMMSAAsgJCAEQfTHhAEQwxIACyAgIAJJDQALICAgAkGEyIQBEMMSAAsgAiAGQaTIhAEQwxIACyAgIAJBhMiEARDDEgALQdyzhAFBJEH0xoQBEIwaAAsgCUEEQZzJhAEQvCIACyADKALwASICDQALIAEoAqwBIBsoAgBBBEEQEMUSIBdBCGogA0HoAWpBCGooAgA2AgAgFyADKQPoATcCAAwACwsgAygC2AIgAygC3AJBBEEIEMUSDAALC0HUr4QBEPcWAAsgA0EANgLYAyADQgA3A9ADIANBADsB3AMgA0GQA2ogA0HQA2ogASgC6AFBvLqEARDECiABKALcASABQeABaigCAEEEQRAQxRIgAkEIaiADQZADakEIaigCADYCACACIAMpApADNwIADAILQcSwhAEQ9xYACwJAAkAgASgCIA0AIAFBfzYCIAJAIAEoAmANACABQX82AmAgA0HQA2ogAUEkaiABQeQAahCOByADQZADakEIaiICIANB3ANqKAIANgIAIAMgAykC1AM3A5ADAkAgAygC0AMiBUEqRg0AAkBBMEUNACAAQRBqIANB0ANqQRBqQTD8CgAACyAAQQxqIANBmANqKAIANgIAIAAgAykDkAM3AgQgACAFNgIADAMLIANBKGpBCGogAigCADYCACADIAMpA5ADNwMoAkAgASgCuAENACABQQA2AsQBIAFBfzYCuAECQCABKALIAQ0AIAFBvAFqIQ8gAUEANgLUASABQX82AsgBAkAgASgCvAENACAPQYTGhAEQ8hcLIAFBzAFqIQ0gASgCwAFCATcCACABQZABaiIMKAIAIQYgAUGMAWohCEEBIQICQANAIAEgAkF/aiICNgLEAQJAAkAgASgCwAEgAkEDdGoiAigCACIEIAZPDQAgAigCBCIC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CiAEaiAxQiCGIC+EIDBCKIaENwIAIAMgBkEBaiIGNgLYASAFQX5qIQUgBEEIaiEEDAALCyADQdADaiABIANB0AFqEIQTIAMoAtQDIQICQCADKALQAyIFQSpGDQACQEE4RQ0AIABBCGogA0HQA2pBCGpBOPwKAAALIAAgAjYCBCAAIAU2AgAMBQsgACAJNgIIIAAgAjYCBCAAQSo2AgAMBAsgBSADKALYA0GUr4QBENggAAsCQAJAAkACQCABKAIgDQAgAUF/NgIgIANCADcCkAMgA0HQA2ogAUEkaiINIANBkANqEJ4MIAMoAtQDIQwCQCADKALQAyICQSpGDQACQEE4RQ0AIABBCGogA0HQA2pBCGpBOPwKAAALIAAgDDYCBCAAIAI2AgAgAygC4AIhBCADKALcAiEJDAQLIANBADYCjAIgA0KAgICAwAA3AoQCAkAgAygC4AIiBEUNACADQZACaiADKALcAiIJEMwMIANBKGpBBGohDyADQZACakEYaiEIIANBkAJqQQRqIS4gDK0hMSADQZACakEMaiEHIANBkANqQRBqIQtBBCEOQQAhEANAAkACQAJAAkACQAJAAkAgAygCwAIiAiADKALEAkYNACADIAJBCGo2AsACAkAgAigCACIGIARPDQAgAjEABCEwIAMoApwCIQogAygCpAIhBQJAIAkgBkEYbGooAghFDQACQCAFIApHDQAgB0GIt4QBEPIXCyADKAKgAiAFQQN0aiAwQiiGIDBCIIaENwIAIAMgBUEBajYCpAICQCAQIAMoAoQCRw0AIANBhAJqEIwYIAMoAogCIQ4LAkBBOEUNACAOIBBBOGxqIANBkAJqQTj8CgAACyADIBBBAWoiEDYCjAIgAigCACICIARPDQMgA0GQAmogCSACQRhsahDMDAwJCwJAIAUgCkcNACAHQbi3hAEQ8hcLIAMoAqACIAVBA3RqIDBCIIYgMYQgMEIohoQ3AgAgAyAFQQFqNgKkAgwICyAGIARB+LaEARDDEgALIAMoAqQCDgIFAgELIAIgBEGot4QBEMMSAAsgDyAHKQIANwIAIA9BCGogB0EIaigCADYCACADQQA2AqQCIANCgICAgMAANwKcAiADQQI2AiggA0HQA2ogDSADQShqEJ4MIAMoAtQDIQUgAygC0AMiAkEqRg0CQThFDQEgAEEIaiADQdADakEIakE4/AoAAAwBCyADQQA2AqQCIAMoAqACKQIAITAgA0EBNgIoIAMgMDcCLCADQdADaiANIANBKGoQngwgAygC1AMhBSADKALQAyICQSpGDQFBOEUNACAAQQhqIANB0ANqQQhqQTj8CgAACyAAIAU2AgQgACACNgIAIAMoApACIAMoApQCQQRBBBDFEgwGCwJAIAMoApgCIgIgAygCkAJHDQAgA0GQAmpByLeEARDtFwsgAygClAIgAkECdGogBTYCACADIAJBAWo2ApgCCyADQRhqIAgQ4g8CQCADKAIYIgJFDQAgAygCHCEGAkAgAygCmAIiBSADKAKQAkcNACADQZACakHYt4QBEO0XCyADKAKUAiAFQQJ0aiAMNgIAIAMgBUEBajYCmAIgAyACNgLAAiADIAIgBkEDdGo2AsQCDAELIA8gAykCkAI3AgAgD0EIaiADQZACakEIaigCADYCACADQQY2AiggA0HQA2ogDSADQShqEJ4MIAMoAtQDIQoCQCADKALQAyICQSpGDQACQEE4RQ0AIABBCGogA0HQA2pBCGpBOPwKAAALIAAgCjYCBCAAIAI2AgAMBQsCQCAQDQBBACEQDAQLIAMgEEF/aiIQNgKMAiAOIBBBOGxqIgIoAgAiLUGAgICAeEYNAyACKAIUIQUgAigCECEGIANByAJqQQhqIhUgAkEMaigCADYCACACKQIEITAgCyACQShqKQIANwMAIANBkANqQRhqIiQgAkEwaikCADcDACADQZADakEIaiIrIAJBIGopAgA3AwAgAyAwNwPIAiADIAIpAhg3A5ADAkAgBUUNACAGIAVBA3RqQXhqIgJFDQAgAiAKNgIAIAMoApwCIAMoAqACQQRBCBDFEiAuIAMpA8gCNwIAIC5BCGogFSgCADYCACAIIAMpA5ADNwIAIAhBCGogKykDADcCACAIQRBqIAspAwA3AgAgCEEYaiAkKQMANwIAIAMgLTYCkAIgAyAFNgKkAiADIAY2AqACDAELC0Hot4QBEMkiAAtBAEEAQei2hAEQwxIAC0H0roQBEPcWAAsgACAMNgIIIAAgCjYCBCAAQSo2AgALIAMoApwCIAMoAqACQQRBCBDFEiAOIBAQtBcgAygChAIgDkEEQTgQxRILAkAgBEUNACAJIQIDQCACKAIAIAJBBGooAgBBBEEIEMUSIAJBDGooAgAgAkEQaigCAEEEQQgQxRIgAkEYaiECIARBf2oiBA0ACwsgAygC2AIgCUEEQRgQxRIgASABKAIgQQFqNgIgDAILAAsCQCABKAIgRQ0AQbSxhAEQ9xYACyABQX82AiAgAyACNgKYAyADQgM3ApADIANB0ANqIAFBJGogA0GQA2oQngwgASABKAIgQQFqNgIgIABBCGohBCADKALUAyECAkACQCADKALQAyIFQSpGDQBBOEUNASAEIANB0ANqQQhqQTj8CgAADAELIAQgAjYCAAsgACAFNgIAIAAgAjYCBAsgA0GQBGokAAuOZwIKfwF+IwBB8AFrIgMkAAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgASgCACIEQXRqIgVBByAFQSZJGw4mAAECAwQFBgcICQoLDA0ODycmJSQjIiEgHx4dHBsaGRgXFhUUExIACyABKAIIIQUgA0HIAWogAiABKAIEIgRBABCiAgJAAkAgAy0AyAFBBEYNACADKQPIASINQv8Bg0IEUg0BCyADIAU2AtABIAMgBDYCzAEgA0EBNgLIASADQbgBaiACIANByAFqQczLmwFBBBCGDSADLQC4AUEERg0wIAMpA7gBIg1C/wGDQgRRDTALIA1C/wGDQgRRDS8gACANNwIADDALIAEoAhQhBiADQbgBaiACIAEoAhAiB0EAEKICAkAgAy0AuAFBBEYNACADKQO4ASINQv8Bg0IEUg0uCwJAIAdFDQAgA0G4AWogAiAHEOIcIAMtALgBQQRGDQAgAykDuAEiDUL/AYNCBFINLgsgA0EANgLIASADQbgBaiACIANByAFqQdDLmwFBARCFDQJAIAMtALgBQQRGDQAgAykDuAEiDUL/AYNCBFINLgsgASgCCCIFIAEoAgwiCEEEdGpBcGohCUHSIiEKAkAgCEUNACAJRQ0AQdKiwABB0iIgCSgCAEECRhshCgsgA0G4AWogAiAHIAggCiAIEIUaAkAgAy0AuAFBBUYNACADKQO4ASENDCwLIANBuAFqELMhIAhFDSogA0EwaiAFEIwXAkAgAi0ATQ0AIANBuAFqIAIQphMgAy0AuAFBBEYN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AiAEKQIANwPIBCAbISkgJkGAgICAeEciJQ0BA0AgKSIeICFGDQIgHiAeICFHQQZ0aiEpIB4oAgBBB0cNACAeKAIsISsgHigCKCEeIAJBqYGAgHg2AqADIAEgHiArIAJBoANqEN4cDAALCyACQfiAgIB4NgKgAyABICcgIyACQaADahDeHAwCCwJAICUNACABLwGAAUGAwABxRQ0AA0AgGyIeICFGDQEgHiAeICFHQQZ0aiEbQRAhKUEMISUCQAJAIB4oAgBBfGoOBAECAgACCyAeLQAcQQJHDQFBFCEpQRAhJQsgHiAlaigCACElIB4gKWooAgAhHiACQaqBgIB4NgKgAyABICUgHiACQaADahDeHAwACwsCQCAdRQ0AIAJBg4GAgHg2AqADIAJC4ebRi8au2jE3A6gDIAEgIiAkIAJBoANqEN4cCwJAIBogKnFBAXFFDQAgAkGfgYCAeDYCoAMgASAsIB8gAkGgA2oQ3hwLAkAgAigCgANBBUYNACATIAIpApgENwIAIBUgDykDADcDACACQeAAakEQaiACQYADakEQaikDADcDACACQeAAakEYaiACQYADakEYaikDADcDACATQQhqIAJBmARqQQhqKAIANgIAIAIgAikDgAM3A2AgASgCvAEhGiACQgA3A7ADIAJCATcDqAMgAkIANwPYA0EAIRsgAkEANgKgAyACQgA3A+gDIAJCgICAgIABNwPgAyACQYCAgIB4NgLAAyACQYAGOwHwAyANIAIpA8gENwIAIA1BCGogBSkDADcCACACIBw6ALEBIAIgLjoAsAEgAkEANgKsASACIBo2ApwBIAIgGTYCmAEgAiAnNgKEASACICY2AoABIAJBoANqEMEZIAcQjyAgBhCXIQwKCyACQQE2AqQDIAJBoLWbATYCoAMgAkIANwKsAyACIAJB+ANqNgKoAyACQaADakGotZsBEKgdAAsgAkGYBGoQjyAMBwsgASgCwAEhJSACQaADaiABQQAQgAMgAigCpAMhGyACKAKgAyIeQYCAgIB4Rg0BIAIgAigCqAM2AsQEIAIgGzYCwAQgAiAeNgK8BAJAAkACQCABLQDIAUEcRyIgDQAgASgCwAEhJyABEOMOIAEoArwBISsgAkGgA2ogAUEAEKABIAIoAqQDIRsCQCACKAKgAyIeQQdGDQAgBSAEKQMANwMAIAVB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AGohBCADLQA3RQ0ACyABIAEoAixBf2o2AixBASEQDAALCyADQShqIAEgAigCKCACKAIsIAIoAjQgAigCOBDqBQJAAkAgAy0AKEEERg0AIAMpAygiFEL/AYNCBFINAQsgA0EoaiABIAItAEgQkQoCQCADLQAoQQRGDQAgAykDKCIUQv8Bg0IEUg0BCwJAIAItAERFDQAgA0EANgIoIANBOGogASADQShqQcezmwFBBhCGDQJAIAMtADhBBEYNACADKQM4IhRC/wGDQgRSDQILIANBKGogARDdDyADLQAoQQRGDQAgAykDKCIUQv8Bg0IEUg0BCwJAIAItAEVFDQAgA0EANgIoIANBOGogASADQShqQZSlmwFBCBCGDQJAIAMtADhBBEYNACADKQM4IhRC/wGDQgRSDQILIANBKGogARDdDyADLQAoQQRGDQAgAykDKCIUQv8Bg0IEUg0BCwJAIAItAEZFDQAgA0EANgIoIANBOGogASADQShqQY6nmwFBCBCGDQJAIAMtADhBBEYNACADKQM4IhRC/wGDQgRSDQILIANBKGogARDdDyADLQAoQQRGDQAgAykDKCIUQv8Bg0IEUg0BCyADQQA2AkAgA0EoaiABIANBwABqQcvSmwFBCBCGDQJAIAMtAChBBEYNACADKQMoIhRC/wGDQgRSDQELIANBKGogARDdDwJAIAMtAChBBEYNACADKQMoIhRC/wGDQgRSDQELAkACQAJAIAJBCGoiBCgCAEEFRg0AIANBKGogBCABEOUFIAMtAChBBEYNAiADKQMoIhRC/wGDQgRSDQEMAgsgA0EoaiACQRBqIAEQpAkgAy0AKEEERg0BIAMpAygiFEL/AYNCBFENAQsgFEL/AYNCBFINAQsCQCACKAJARQ0AAkAgAi0AR0UNACADQShqIAEgA0HAAGpBupubAUEBEIUNIAMtAChBBEYNACADKQMoIhRC/wGDQgRSDQILIANBKGogASADQcAAakHFy5sBQQEQhQ0CQCADLQAoQQRGDQAgAykDKCIUQv8Bg0IEUg0CCyADQShqIAEQ3Q8CQCADLQAoQQRGDQAgAykDKCIUQv8Bg0IEUg0CCyADQShqIAJBwABqIAEQnRAgAy0AKEEERg0AIAMpAygiFEL/AYNCBFINAQsCQCACKAI8RQ0AAkAgAS0ATQ0AIANBKGogARDd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IBAgARDlBSADLQAoQQRGDQMgAykDKCIUQv8Bg0IEUQ0DDAQLIANBKGogARDdDyADLQAoQQRGDQAgAykDKCIUQv8Bg0IEUg0DCyADQShqIBAgARDlBSADLQAoQQRGDQEgAykDKCIUQv8Bg0IEUg0CDAELAkAgES0AREUNACADQQA2AiggA0E4aiABIANBKGpBipybAUEBEIUNIAMtADhBBEYNACADKQM4IhRC/wGDQgRSDQILIANBKGogECABEOUFIAMtAChBBEYNACADKQMoIhRC/wGDQgRSDQELAkAgAi0ANkUNACADQQA2AiggA0E4aiABIANBKGpB4MubAUEBEIUNIAMtADhBBEYNACADKQM4IhRC/wGDQgRSDQELAkAgESgCPEUNACADQShqIBFBPGogARCTBSADLQAoQQRGDQAgAykDKCIUQv8Bg0IEUg0BCyADQQA2AkAgA0EoaiABIANBwABqQfjAmwFBARCFDQJAIAMtAChBBEYNACADKQMoIhRC/wGDQgRSDQELIANBKGogASARKAIwIBEoAjQgESgCBCARKAIIEP8GAkAgAy0AKEEERg0AIAMpAygiFEL/AYNCBFINAQsgA0EoaiABIANBwABqQbOBnQFBARCFDQJAIAMtAChBBEYNACADKQMoIhRC/wGDQgRSDQELAkAgESgCQEUNACADQShqIAEgA0HAAGpBxcubAUEBEIUNAkAgAy0AKEEERg0AIAMpAygiFEL/AYNCBFINAgsCQCABLQBNDQAgA0EoaiABEN0PIAMtAChBBEYNACADKQMoIhRC/wGDQgRSDQILIANBKGogEUHAAGogARCdECADLQAoQQRGDQAgAykDKCIUQv8Bg0IEUg0BCwJAIBEoAhhBgICAgHhGDQACQCABLQBNDQAgA0EoaiABEN0PIAMtAChBBEYNACADKQMoIhRC/wGDQgRSDQILIANBKGogEUEYaiABEN4WIAMtAChBBEYNByADKQMoIhRC/wGDQgRSDQEMBwsgA0EoaiABIANBwABqEIcNIAMtAChBBEYNBiADKQMoIhRC/wGDQgRRDQYLIBRC/wGDQgRSDQQMBQsgA0HAAGogASAMIA9FQZAKEMARIAMtAEBBBEYNASADKQNAIhRC/wGDQgRRDQELIBRC/wGDQgRSDQELIANBwABqIAEgA0EoakGzgZ0BQQEQhQ0CQCADLQBAQQRGDQAgAykDQCIUQv8Bg0IEUg0BCwJAIAIoAiBBgICAgHhGDQAgA0HAAGogAkEgaiABEN4WIAMtAEBBBEYNAyADKQNAIhRC/wGDQgRSDQEMAwsgA0HAAGogASADQShqEIcNIAMtAEBBBEYNAiADKQNAIhRC/wGDQgRRDQILIBRC/wGDQgRRDQELIBRC/wGDQgRSDQMLAkACQCADLQAmDQAgA0EBOgAmDAELIAEoAkRFDQAgA0HAAGogASAKQQAQ6gMgAy0AQEEERg0AIAMpA0AiFEL/AYNCBFINAwsgCUEBaiEJQQEhBCADLQAnRQ0AIAEgASgCLEF/ajYCLCADQQA6ACcMAAsLIANBwABqIAEgBiAIRUHBABDAESADLQBAQQRGDQEgAykDQCIUQv8Bg0IEUQ0BCyAUQv8Bg0IEUQ0AIAAgFDcCAAwBCwJAAkAgBkUNACADQcAAaiABIAZBf2oQ4hwgAy0AQEEERg0AIAMpA0AiFEL/AYNCBFINAQsgA0HAAGogASADQRhqQcjLmwFBARCFDQJAIAMtAEBBBEYNACADKQNAIhRC/wGDQgRRDQAgACAUNwIADAILIABBBDoAAAwBCyAAIBQ3AgALIANB0ABqJAAL0E8CDH8CfiMAQfAAayIDJAAgA0EoaiABELoTIANBMGogAiADKAIoQQAQogICQAJAIAMtADBBBEYNACADKQMwIg9C/wGDQgRRDQAgACAPNwIADAELAkACQCABKAIAIgRBCUcNACADQTBqIAFBCGogAhBMIAMtADBBBEYNASADKQMwIg9C/wGDQgRRDQEgACAPNwIADAILIANBIGogARCSDCADQTBqIAIgAygCIEEAEKICAkACQAJAIAMtADBBBEYNACADKQMwIg9C/wGDQgRSDQELAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgBA4JAAECAwQFBgcIAAsgASgCGCEFIANBMGogAiABKAIUIgZBABCiAgJAIAMtADBBBEYNACADKQMwIg9C/wGDQgRSDRELAkAgBkUNACADQTBqIAIgBhDiHCADLQAwQQRGDQAgAykDMCIPQv8Bg0IEUg0RCyADQQA2AkggA0EwaiACIANByABqQfy9mwFBBhCGDQJAIAMtADBBBEYNACADKQMwIg9C/wGDQgRSDRELIAEtACBFDQ8gA0EwaiACEN0PAkAgAy0AMEEERg0AIAMpAzAiD0L/AYNCBFINEQsgA0EwaiACIANByABqQbilmwFBBBCGDSADLQAwQQRGDQ8gAykDMCIPQv8Bg0IEUg0QDA8LAkACQCABKAIwIgRFDQAgA0EwaiACIAQQ4hwgAy0AMEEERg0AIAMpAzAiD0L/AYNCBFINAQsCQAJAIAFBCGoiBCgCAA0AIAFBEGohByABKAIoIggoAghBDGwhBCAIKAIEIQgDQCAERQ0CIANBMGogCCACELYIAkAgAy0AMEEERg0AIAMpAzAiD0L/AYNCBFINBAsgCEEMaiEIIARBdGohBAwACwsgA0EANgIwIANB2ABqIAIgA0EwakG8y5sBQQYQhg0CQCADLQBYQQRGDQAgAykDWCIPQv8Bg0IEUg0CCyADQTBqIAIQ3Q8CQCADLQAwQQRGDQAgAykDMCIPQv8Bg0IEUg0CCyADQTBqIAQgAhCLASADLQAwQQRGDRIgAykDMCIPQv8Bg0IEUg0BDBILIANBADYCMCADQdgAaiACIANBMGpBvMubAUEGEIYNAkAgAy0AWEEERg0AIAMpA1giD0L/AYNCBFINAQsgA0EwaiACEN0PAkAgAy0AMEEERg0AIAMpAzAiD0L/AYNCBFINAQsgA0EwaiACIAdBARDDBCADLQAwQQRGDREgAykDMCIPQv8Bg0IEUQ0RCyAPQv8Bg0IEUQ0QDBELIAEoAhQhCSADQTBqIAIgASgCECIKQQAQogICQCADLQAwQQRGDQAgAykDMCIPQv8Bg0IEUg0NCwJAIApFDQAgA0EwaiACIAoQ4hwgAy0AMEEERg0AIAMpAzAiD0L/AYNCBFINDQsCQAJAIAEoAgwiBQ0AQQEhBEEAIQdBBCELQQAhBkEAIQxBACEIDAELIAEoAgghBEEAIQZBBCELQQAhB0EAIQhBACENQQAhDANAIAMgDjsBQiADIA06AEAgAyAINgI8IAMgBzYCOCADIAs2AjQgAyAGNgIwIAMgBDYCRAJAAkAgBCkDAEICUg0AIAggBEEIaiAIGyEIQQEhDQwBCyADQQE6AEECQCAHIAZHDQAgA0EwahDIGSADKAI0IQsLIAsgB0ECdGogBDYCACAHQQFqIQcgAy0AQSEMIAMvAUIhDiADLQBAIQ0gAygCPCEIIAMoAjQhCyADKAIwIQYLIARB0ABqIQQgBUF/aiIFDQALIA1BAXMhBAsgA0EANgJYIANBMGogAiADQdgAakG8y5sBQQYQhg0CQCADLQAwQQRGDQAgAykDMCIPQv8Bg0IEUg0MCyABLQAgRQ0KIANBMGogAhDdDwJAIAMtADBBBEYNACADKQMwIg9C/wGDQgRSDQwLIANBMGogAiADQdgAakG4pZsBQQQQhg0gAy0AMEEERg0KIAMpAzAiD0L/AYNCBFENCgwLCyADQdgAaiACIAEoAjAiBEEAEKICAkACQCADLQBYQQRGDQAgAykDWCIPQv8Bg0IEUg0BCwJAIARFDQAgA0HYAGogAiAEEOIcIAMtAFhBBEYNACADKQNYIg9C/wGDQgRSDQELIANBADYCMCADQdgAaiACIANBMGpBvMubAUEGEIYNAkAgAy0AWEEERg0AIAMpA1giD0L/AYNCBFINAQsgA0HYAGogAhDdDwJAIAMtAFhBBEYNACADKQNYIg9C/wGDQgRSDQELIANB2ABqIAIgA0EwakHczpsBQQcQhg0CQCADLQBYQQRGDQAgAykDWCIPQv8Bg0IEUg0BCyADQdgAaiACEN0PAkAgAy0AWEEERg0AIAMpA1giD0L/AYNCBFINAQsCQAJAAkAgASgCCA4DAAECAAsgA0HYAGogAUEQaiACELUFIAMtAFhBBEYNESADKQNYIg9C/wGDQgRSDQIMEQsgA0HYAGogAUEQaiACEMcFIAMtAFhBBEYNECADKQNYIg9C/wGDQgRSDQEMEAsgA0HYAGogAUEMaiACENoDIAMtAFhBBEYNDyADKQNYIg9C/wGDQgRRDQ8LIA9C/wGDQgRRDQ4MDwsCQAJAIAEoAggiBEUNACADQdgAaiACIAQQ4hwgAy0AWEEERg0AIAMpA1giD0L/AYNCBFINAQsgA0EANgIwIANB2ABqIAIgA0EwakG8y5sBQQYQhg0CQCADLQBYQQRGDQAgAykDWCIPQv8Bg0IEUg0BCyADQdgAaiACEN0PAkAgAy0AWEEERg0AIAMpA1giD0L/AYNCBFINAQsgA0HYAGogAiADQTBqQdzOmwFBBxCGDQJAIAMtAFhBBEYNACADKQNYIg9C/wGDQgRSDQELAkACQCABQQRqIgQoAgAQmgkNACACLQBNDQEgA0HYAGogAhDdDyADLQBYQQRGDQEgAykDWCIPQv8Bg0IEUQ0BDAILIANB2ABqIAIQ3Q8gAy0AWEEERg0AIAMpA1giD0L/AYNCBFINAQsgA0HYAGogBCACEIojAkAgAy0AWEEERg0AIAMpA1giD0L/AYNCBFINAQsgA0HYAGogAiADQTBqEIcNAkAgAy0AWEEERg0AIAMpA1giD0L/AYNCBFINAQsgASgCDCIERQ0OIANB2ABqIAIgBBDiHCADLQBYQQRGDQ4gAykDWCIPQv8Bg0IEUQ0OCyAPQv8Bg0IEUQ0NDA4LIAEoAgwhCCADQdgAaiACIAEoAggiBEEAEKICAkAgAy0AWEEERg0AIAMpA1giD0L/AYNCBFINBwsCQCAERQ0AIANB2ABqIAIgBBDiHCADLQBYQQRGDQAgAykDWCIPQv8Bg0IEUg0HCyADQQA2AjAgA0HYAGogAiADQTBqQbzLmwFBBhCGDQJAIAMtAFhBBEYNACADKQNYIg9C/wGDQgRSDQcLAkAgAS0AFA0AIAItAE0NBiADQdgAaiACEN0PIAMtAFhBBEYNBiADKQNYIg9C/wGDQgRSDQcMBgsgA0HYAGogAhDdDwJAIAMtAFhBBEYNACADKQNYIg9C/wGDQgRSDQcLIANB2ABqIAIgA0EwakG4pZsBQQQQhg0CQCADLQBYQQRGDQAgAykDWCIPQv8Bg0IEUg0HCyADQdgAaiACEN0PIAMtAFhBBEYNBSADKQNYIg9C/wGDQgRRDQUMBgsgA0EwaiACIAEoAgQiBCgCIEEAEKICAkAgAy0AMEEERg0AIAMpAzAiD0L/AYNCBFINBAsgBC0AQEUNAiADQQA2AjAgA0HIAGogAiADQTBqQbzLmwFBBhCGDQJAIAMtAEhBBEYNACADKQNIIg9C/wGDQgRSDQQLIANBMGogAhDdDyADLQAwQQRGDQIgAykDMCIPQv8Bg0IEUQ0CDAMLIANB2ABqIAIgASgCCEEAEKICAkACQCADLQBYQQRGDQAgAykDWCIPQv8Bg0IEUg0BCyADQQA2AjAgA0HYAGogAiADQTBqQbzLmwFBBhCGDQJAIAMtAFhBBEYNACADKQNYIg9C/wGDQgRSDQELAkAgAi0ATQ0AIANB2ABqIAIQ3Q8gAy0AWEEERg0AIAMpA1giD0L/AYNCBFINAQsgA0HYAGogAiADQTBqQcybmwFBARCFDQJAIAMtAFhBBEYNACADKQNYIg9C/wGDQgRSDQELAkAgAi0ATQ0AIANB2ABqIAIQ3Q8gAy0AWEEERg0AIAMpA1giD0L/AYNCBFINAQsgA0HYAGogAUEEaiACEIojIAMtAFhBBEYNCyADKQNYIg9C/wGDQgRRDQsLIA9C/wGDQgRRDQoMCwsgA0HYAGogAiABKAIIQQAQogICQAJAIAMtAFhBBEYNACADKQNYIg9C/wGDQgRSDQELIANBADYCMCADQdgAaiACIANBMGpBvMubAUEGEIYNAkAgAy0AWEEERg0AIAMpA1giD0L/AYNCBFINAQsgA0HYAGogAhDdDwJAIAMtAFhBBEYNACADKQNYIg9C/wGDQgRSDQELIANB2ABqIAIgA0EwakHMm5sBQQEQhQ0CQCADLQBYQQRGDQAgAykDWCIPQv8Bg0IEUg0BCyADQdgAaiACEN0PAkAgAy0AWEEERg0AIAMpA1giD0L/AYNCBFINAQsgA0HYAGogAUEQaiACEPYUIAMtAFhBBEYNCiADKQNYIg9C/wGDQgRRDQoLIA9C/wGDQgRSDQoMCQsgA0EANgJYIANBMGogAiADQdgAakH8vZsBQQYQhg0CQCADLQAwQQRGDQAgAykDMCIPQv8Bg0IEUg0BCyADQTBqIAIQ3Q8CQCADLQAwQQRGDQAgAykDMCIPQv8Bg0IEUg0BCwJAIAQtAEFFDQAgA0EwaiACIANB2ABqQbilmwFBBBCGDQJAIAMtADBBBEYNACADKQMwIg9C/wGDQgRSDQILIANBMGogAhDdDyADLQAwQQRGDQAgAykDMCIPQv8Bg0IEUg0BCyADQTBqIARBKGogAhD2FAJAIAMtADBBBEYNACADKQMwIg9C/wGDQgRSDQELAkAgAi0ATQ0AIANBMGogAhDdDyADLQAwQQRGDQAgAykDMCIPQv8Bg0IEUg0BCyADQTBqIAIgA0HYAGpBzJubAUEBEIUNAkAgAy0AMEEERg0AIAMpAzAiD0L/AYNCBFINAQsCQCACLQBNDQAgA0EwaiACEN0PIAMtADBBBEYNACADKQMwIg9C/wGDQgRSDQELAkACQCAEKQMAUCIHDQAgBEEYaiEIDAELAkAgBC0AHEECRg0AIARBEGohCAwBCyAEKAIIQRBqIQgLIANBMGogAiAIKAIAQQAQogICQAJAAkAgAy0AMEEERg0AIAMpAzAiD0L/AYNCBFINAQsCQCAHDQAgA0HIAGogAiAEKAIYQQAQogICQAJAIAMtAEhBBEYNACADKQNIIg9C/wGDQgRSDQELIANBADYCMCADQcgAaiACIANBMGpBrsybAUEHEIYNAkAgAy0ASEEERg0AIAMpA0giD0L/AYNCBFINAQsgA0HIAGogAiADQTBqQfjAmwFBARCFDQJAIAMtAEhBBEYNACADKQNIIg9C/wGDQgRSDQELIANByABqIAQgAhCGAQJAIAMtAEhBBEYNACADKQNIIg9C/wGDQgRSDQELIANByABqIAIgA0EwakGzgZ0BQQEQhQ0gAy0ASEEERg0DIAMpA0giD0L/AYNCBFENAwsgD0L/AYNCBFINAQwCCyADQTBqIARBCGogAhCMCCADLQAwQQRGDQEgAykDMCIPQv8Bg0IEUQ0BCyAPQv8Bg0IEUg0BCyADQTBqIAIgA0HYAGoQhw0gAy0AMEEERg0IIAMpAzAiD0L/AYNCBFENCAsgD0L/AYNCBFENBwwICyADQdgAaiACIANBMGpBipybAUEBEIUNAkAgAy0AWEEERg0AIAMpA1giD0L/AYNCBFINAQsCQCACLQBNDQAgA0HYAGogAhDdDyADLQBYQQRGDQAgAykDWCIPQv8Bg0IEUg0BCyADQdgAaiACIANBMGpBpc2bAUEEEIYNAkAgAy0AWEEERg0AIAMpA1giD0L/AYNCBFINAQsCQCACLQBNDQAgA0HYAGogAhDdDyADLQBYQQRGDQAgAykDWCIPQv8Bg0IEUg0BCyADQdgAaiABKAIEIAIQhgECQCADLQBYQQRGDQAgAykDWCIPQv8Bg0IEUg0BCwJAIAEoAhBFDQACQCACLQBNDQAgA0HYAGogAhDdDyADLQBYQQRGDQAgAykDWCIPQv8Bg0IEUg0CCwJAAkAgAi0ATw0AIANB2ABqIAIgA0EwakG1zJsBQQQQhg0gAy0AWEEERg0BIAMpA1giD0L/AYNCBFENAQwDCyADQdgAaiACIANBMGpBqc2bAUEGEIYNIAMtAFhBBEYNACADKQNYIg9C/wGDQgRSDQILAkAgAi0ATQ0AIANB2ABqIAIQ3Q8gAy0AWEEERg0AIAMpA1giD0L/AYNCBFINAgsgA0HYAGogAUEQaiACEIkjIAMtAFhBBEYNACADKQNYIg9C/wGDQgRSDQELIANB2ABqIAIgA0EwahCHDQJAIAMtAFhBBEYNACADKQNYIg9C/wGDQgRSDQELIAhFDQYgA0HYAGogAiAIEOIcIAMtAFhBBEYNBiADKQNYIg9C/wGDQgRRDQYLIA9C/wGDQgRRDQUMBgsCQCACLQBNDQAgA0EwaiACEN0PIAMtADBBBEYNACADKQMwIg9C/wGDQgRSDQELAkACQAJAAkAgCEUNACADQTBqIAggAhDrBgJAIAMtADBBBEYNACADKQMwIg9C/wGDQgRSDQULIAxBAXFFDQAgA0EwaiACIANB2ABqQd7LmwFBARCFDQJAIAMtADBBBEYNACADKQMwIg9C/wGDQgRSDQULIAItAE0NASADQTBqIAIQ3Q8gAy0AMEEERg0BIAMpAzAiD0L/AYNCBFINBAwBCyAMIARyQQFxDQAgASgCGCIERQ0CIANBMGogAhDdDyADLQAwQQRGDQEgAykDMCIPQv8Bg0IEUg0DDAELIANBMGogAiADQdgAakG7spsBQQEQhQ0CQCADLQAwQQRGDQAgAykDMCIPQv8Bg0IEUg0DCyADQTBqIAIgCiAHQbADIAcQhRoCQAJAAkAgAy0AMEEFRg0AIAMpAzAhDwwBCyADQTBqELMhAkACQCAHRQ0AIANBAToAZgJAIAItAE0NACADQTBqIAIQ3Q8gAy0AMEEERg0AIAMpAzAiD0L/AYNCBFINAwsgA0EAOgBnIAchDSALIQRBACEIQQAhBQNAAkACQAJAAkACQAJAIA1FDQAgA0EwaiACIAlBsAMgCCAFIANB5wBqIANB5gBqEMYFAkAgAy0AMEEERg0AIAMpAzAiD0L/AYNCBFINCgsgBCgCACIIKQMAQn58Ig9CAiAPQgJUG6cOAwECAwELIANBMGogAiAKIAlBsAMgCCAFEMgCIAMtADBBBEYNByADKQMwIg9C/wGDQgRSDQgMBwsgA0EwaiAIQQhqIAIQ6wYgAy0AMEEERg0DIAMpAzAiD0L/AYNCBFINAgwDCyADQQE2AjQgA0HEzpsBNgIwIANCADcCPCADIANB6ABqNgI4IANBMGpBzM6bARCoHQALIAgoAkQhDiADQTBqIAIgCCgCQCIFQQAQogICQAJAIAMtADBBBEYNACADKQMwIg9C/wGDQgRSDQELAkAgBUUNACADQTBqIAIgBRDiHCADLQAwQQRGDQAgAykDMCIPQv8Bg0IEUg0BCwJAIAgtAEhFDQAgA0EANgIwIANByABqIAIgA0EwakG4pZsBQQQQhg0CQCADLQBIQQRGDQAgAykDSCIPQv8Bg0IEUg0CCyADQTBqIAIQ3Q8gAy0AMEEERg0AIAMpAzAiD0L/AYNCBFINAQsCQAJAIAgpAyBCAlENACADQTBqIAggAhDsDgJAIAMtADBBBEYNACADKQMwIg9C/wGDQgRSDQMLIANBMGogAhDdDwJAIAMtADBBBEYNACADKQMwIg9C/wGDQgRSDQMLIANBADYCMCADQcgAaiACIANBMGpB3LGbAUECEIYNAkAgAy0ASEEERg0AIAMpA0giD0L/AYNCBFINAwsgA0EwaiACEN0PAkAgAy0AMEEERg0AIAMpAzAiD0L/AYNCBFINAwsgA0EwaiAIQSBqIAIQ7A4gAy0AMEEERg0BIAMpAzAiD0L/AYNCBFENAQwCCyADQTBqIAggAhDsDiADLQAwQQRGDQAgAykDMCIPQv8Bg0IEUg0BCyAORQ0CIANBMGogAiAOEOIcIAMtADBBBEYNAiADKQMwIg9C/wGDQgRRDQILIA9C/wGDQgRRDQELIA9C/wGDQgRSDQQLAkACQCADLQBmDQAgA0EBOgBmDAELIAIoAkRFDQAgA0EYaiAEKAIAENkZIANBMGogAiADKAIcQQAQ6gMgAy0AMEEERg0AIAMpAzAiD0L/AYNCBFINBAsCQCADLQBnRQ0AIAIgAigCLEF/ajYCLCADQQA6AGcLIANBEGogBCgCABDZGSANQX9qIQ0gBEEEaiEEQQEhCCADKAIUIQUMAAsLIAItAE0NACADQTBqIAIQ3Q8gAy0AMEEERg0AIAMpAzAiD0L/AYNCBFINAQsgA0EwaiACIAkgB0VBsAMQwBEgAy0AMEEERg0BIAMpAzAiD0L/AYNCBFENAQsgD0L/AYNCBFINAwsgA0EwaiACIANB2ABqQcjLmwFBARCFDQJAIAMtADBBBEYNACADKQMwIg9C/wGDQgRSDQMLIAEoAhgiBEUNASACLQBNDQAgA0EwaiACEN0PIAMtADBBBEYNACADKQMwIg9C/wGDQgRSDQILIANBMGogAiADQdgAakGlzZsBQQQQhg0CQCADLQAwQQRGDQAgAykDMCIPQv8Bg0IEUg0CCwJAIAItAE0NACADQTBqIAIQ3Q8gAy0AMEEERg0AIAMpAzAiD0L/AYNCBFINAgsgA0EwaiAEIAIQhgECQCADLQAwQQRGDQAgAykDMCIPQv8Bg0IEUg0CCyABKAIcRQ0AAkAgAi0ATQ0AIANBMGogAhDdDyADLQAwQQRGDQAgAykDMCIPQv8Bg0IEUg0CCwJAAkAgAi0ATw0AIANBMGogAiADQdgAakG1zJsBQQQQhg0gAy0AMEEERg0BIAMpAzAiD0L/AYNCBFINAwwBCyADQTBqIAIgA0HYAGpBqc2bAUEGEIYNIAMtADBBBEYNACADKQMwIg9C/wGDQgRSDQILAkAgAi0ATQ0AIANBMGogAhDdDyADLQAwQQRGDQAgAykDMCIPQv8Bg0IEUg0CCyADQTBqIAFBHGogAhCJIyADLQAwQQRGDQAgAykDMCIPQv8Bg0IEUg0BCyADQTBqIAIgA0HYAGoQhw0CQCADLQAwQQRGDQAgAykDMCIPQv8Bg0IEUg0BCwJAIAlFDQAgA0EwaiACIAkQ4hwgAy0AMEEERg0AIAMpAzAiD0L/AYNCBFINAQsgBiALEMEiDAQLIAYgCxDBIgsgD6ciBEH/AXFBBEYNAgwECwJAAkACQCABLQAhDgMCAAECCyADQTBqIAIQ3Q8CQCADLQAwQQRGDQAgAykDMCIPQv8Bg0IEUg0DCyADQTBqIAIgA0HIAGpBgLGbAUEGEIYNIAMtADBBBEYNASADKQMwIg9C/wGDQgRSDQIMAQsgA0EwaiACEN0PAkAgAy0AMEEERg0AIAMpAzAiD0L/AYNCBFINAgsgA0EwaiACIANByABqQYaxmwFBBRCGDSADLQAwQQRGDQAgAykDMCIPQv8Bg0IEUg0BCwJAAkACQCABKAIMIghFDQAgASgCCCkDAEIDUQ0BCyACLQBNDQEgA0EwaiACEN0PIAMtADBBBEYNASADKQMwIg9C/wGDQgRSDQIMAQsgA0EwaiACEN0PIAMtADBBBEYNACADKQMwIg9C/wGDQgRSDQELIANBADYCYCADQoCAgIDAADcCWCABKAIIIgQgCEHIAGxqIQcgCEEDSSEKQQAhDUEEIQ5BACEMQQAhCwJAAkACQANAAkACQAJAAkAgBCAHRg0AIARByABqIQggBCkDAEJ9fCIPp0EBakEAIA9CAlQbDgMBAgMBCwJAIA1FDQAgC0EBcUUNBSADQTBqIAIgA0HIAGpB3subAUEBEIUNAkAgAy0AMEEERg0AIAMpAzAiD0L/AYNCBFINCAsgAi0ATQ0FIANBMGogAhDdDyADLQAwQQRGDQUgAykDMCIPQv8Bg0IEUQ0FDAcLIAwgC3JBAXFFDQUgA0EwaiACEN0PAkAgAy0AMEEERg0AIAMpAzAiD0L/AYNCBFINBwsgA0EwaiACIANByABqQaXNmwFBBBCGDQJAIAMtADBBBEYNACADKQMwIg9C/wGDQgRSDQcLIAItAE0NBSADQTBqIAIQ3Q8gAy0AMEEERg0FIAMpAzAiD0L/AYNCBFENBQwGCwJAIA0gAygCWEcNACADQdgAahDJGSADKAJcIQ4LIA4gDUECdGogBDYCACADIA1BAWoiDTYCYCAIIQQMAgsgA0EwaiAEQRBqIAIQ9hQCQCADLQAwQQRGDQBBASELIAghBCADKQMwIg9C/wGDQgRSDQUMAgtBASELIAghBAwBCwJAIAtBAXFFDQAgA0EwaiACIANByABqQd7LmwFBARCFDQJAIAMtADBBBEYNACADKQMwIg9C/wGDQgRSDQULIAItAE0NACADQTBqIAIQ3Q8gAy0AMEEERg0AIAMpAzAiD0L/AYNCBFINBAsCQCAKDQBBwM2bAUEsQezNmwEQjBoACyADQTBqIAIgA0HIAGpBipybAUEBEIUNAkAgAy0AMEEERg0AIAMpAzAiD0L/AYNCBFINBAsCQCACLQBNDQAgA0EwaiACEN0PIAMtADBBBEYNACADKQMwIg9C/wGDQgRSDQQLIANBMGogAiADQcgAakHcsZsBQQIQhg0CQCADLQAwQQRGDQAgAykDMCIPQv8Bg0IEUg0ECyADQTBqIAIQ3Q8CQCADLQAwQQRGDQAgAykDMCIPQv8Bg0IEUg0ECyAEQcgAaiEIIANBMGogBEEQaiACEPYUAkAgAy0AMEEERw0AQQEhDCAIIQQMAQtBASEMIAghBCADKQMwIg9C/wGDQgRRDQAMAwsLIANBMGogAiADQcgAakG7spsBQQEQhQ0CQCADLQAwQQRGDQAgAykDMCIPQv8Bg0IEUg0CCyADKAJcIQggA0EwaiACIAYgDUGwAyANEIUaAkACQAJAIAMtADBBBUYNACADKQMwIQ8MAQsgA0EwahCzISADQQE6AGYCQCACLQBNDQAgA0EwaiACEN0PIAMtADBBBEYNACADKQMwIg9C/wGDQgRSDQELIANBADoAZ0EAIQcDQAJAAkACQAJAAkAgDUUNACAIKAIAIQQgA0EwaiACIAVBsAMgByAPQiCIpyADQecAaiADQeYAahDGBQJAIAMtADBBBEYNACADKQMwIg9C/wGDQgRSDQcLAkAgBCgCOCIHRQ0AIANBMGogAiAHEOIcIAMtADBBBEYNACADKQMwIg9C/wGDQgRSDQQLIAQtAEANAQwCCyADQTBqIAIgBiAFQbADIAcgD0IgiKcQyAICQCADLQAwQQRGDQAgAykDMCIPQv8Bg0IEUg0GCyADQTBqIAIgBUEAQbADEMARIAMtADBBBEYNBiADKQMwIg9C/wGDQgRSDQUMBgsgA0EANgIwIANB6ABqIAIgA0EwakG4pZsBQQQQhg0CQCADLQBoQQRGDQAgAykDaCIPQv8Bg0IEUg0CCyADQTBqIAIQ3Q8gAy0AMEEERg0AIAMpAzAiD0L/AYNCBFINAQsCQCAEKQMAQgJRDQAgA0EwaiAEIAIQ7A4CQCADLQAwQQRGDQAgAykDMCIPQv8Bg0IEUg0CCyADQTBqIAIQ3Q8CQCADLQAwQQRGDQAgAykDMCIPQv8Bg0IEUg0CCyADQQA2AjAgA0HoAGogAiADQTBqQdyxmwFBAhCGDQJAIAMtAGhBBEYNACADKQNoIg9C/wGDQgRSDQILIANBMGogAhDdDyADLQAwQQRGDQAgAykDMCIPQv8Bg0IEUg0BCyADQTBqIARBIGogAhD2FAJAIAMtADBBBEYNACADKQMwIg9C/wGDQgRSDQELIAQoAjwiB0UNASADQTBqIAIgBxDiHCADLQAwQQRGDQEgAykDMCIPQv8Bg0IEUQ0BCyAPQv8Bg0IEUg0CCwJAAkAgAy0AZg0AIANBAToAZgwBCyACKAJERQ0AIANBMGogAiAEKAI8QQAQ6gMgAy0AMEEERg0AIAMpAzAiD0L/AYNCBFINAgsCQCADLQBnRQ0AIAIgAigCLEF/ajYCLCADQQA6AGcLIA1Bf2ohDSAIQQRqIQggBCkDOCEPQQEhBwwACwsgD0L/AYMiEEIEUQ0AIBBCBFINAgsgA0EwaiACIANByABqQcjLmwFBARCFDQJAIAMtADBBBEYNACADKQMwIg9C/wGDQgRSDQILAkAgAi0ATQ0AIANBMGogAhDdDyADLQAwQQRGDQAgAykDMCIPQv8Bg0IEUg0CCyADQTBqIAIgA0HIAGpBpc2bAUEEEIYNAkAgAy0AMEEERg0AIAMpAzAiD0L/AYNCBFINAgsgAi0ATQ0AIANBMGogAhDdDyADLQAwQQRGDQAgAykDMCIPQv8Bg0IEUg0BCyADQTBqIAEoAhAgAhCGAQJAIAMtADBBBEYNACADKQMwIg9C/wGDQgRSDQELAkAgASgCHEUNAAJAIAItAE0NACADQTBqIAIQ3Q8gAy0AMEEERg0AIAMpAzAiD0L/AYNCBFINAgsCQAJAIAItAE8NACADQTBqIAIgA0HIAGpBtcybAUEEEIYNIAMtADBBBEYNASADKQMwIg9C/wGDQgRRDQEMAwsgA0EwaiACIANByABqQanNmwFBBhCGDSADLQAwQQRGDQAgAykDMCIPQv8Bg0IEUg0CCwJAIAItAE0NACADQTBqIAIQ3Q8gAy0AMEEERg0AIAMpAzAiD0L/AYNCBFINAgsgA0EwaiABQRxqIAIQiSMgAy0AMEEERg0AIAMpAzAiD0L/AYNCBFINAQsgA0EwaiACIANByABqEIcNAkAgAy0AMEEERg0AIAMpAzAiD0L/AYNCBFINAQsCQCAFRQ0AIANBMGogAiAFEOIcIAMtADBBBEYNACADKQMwIg9C/wGDQgRSDQELIAMoAlggAygCXBDBIgwCCyADKAJYIAMoAlwQwSILIA+nIgRB/wFxQQRHDQILIANBCGogARCSDCADQTBqIAIgAygCDEEBEOoDAkAgAy0AMEEERg0AIAMpAzAiD0L/AYNCBFINAQsgAi0ATQ0CIANBMGogAhCmEyADLQAwQQRGDQIgAykDMCIPQv8Bg0IEUQ0CCyAPpyIEQf8BcUEERg0BCyAAIA9CgH6DIAStQv8Bg4Q3AgAMAQsgAyABELoTIANBMGogAiADKAIEQQEQ6gMCQCADLQAwQQRGDQAgAykDMCIPQv8Bg0IEUQ0AIAAgDzcCAAwBCyAAQQQ6AAALIANB8ABqJAALwk4CCH8BfiMAQTBrIgMkAAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABKAIAIgEoAgAOFAABAgMEBQYHCAkKCwwNDg8QERITAAsgASgCCCEEIANBIGogAiABKAIEIgVBABCiAgJAAkAgAy0AIEEERg0AIAMpAyAiC0L/AYNCBFINAQsCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABLQAMDg0AAQIDBAUGBwgJCgsMAAsgAyAENgIoIAMgBTYCJCADQQE2AiAgA0EIaiACIANBIGpB+ambAUEDEIYNIAMtAAhBBEYNMSADKQMIIgtC/wGDQgRSDQwMMQsgAyAENgIoIAMgBTYCJCADQQE2AiAgA0EIaiACIANBIGpB/KmbAUEHEIYNIAMtAAhBBEYNMCADKQMIIgtC/wGDQgRSDQsMMAsgAyAENgIoIAMgBTYCJCADQQE2AiAgA0EIaiACIANBIGpB7ambAUEGEIYNIAMtAAhBBEYNLyADKQMIIgtC/wGDQgRSDQoMLwsgAyAENgIoIAMgBTYCJCADQQE2AiAgA0EIaiACIANBIGpB86mbAUEGEIYNIAMtAAhBBEYNLiADKQMIIgtC/wGDQgRSDQkMLgsgAyAENgIoIAMgBTYCJCADQQE2AiAgA0EIaiACIANBIGpBg6qbAUEHEIYNIAMtAAhBBEYNLSADKQMIIgtC/wGDQgRSDQgMLQsgAyAENgIoIAMgBTYCJCADQQE2AiAgA0EIaiACIANBIGpBiqqbAUEGEIYNIAMtAAhBBEYNLCADKQMIIgtC/wGDQgRSDQcMLAsgAyAENgIoIAMgBTYCJCADQQE2AiAgA0EIaiACIANBIGpB46mbAUEGEIYNIAMtAAhBBEYNKyADKQMIIgtC/wGDQgRSDQYMKwsgAyAENgIoIAMgBTYCJCADQQE2AiAgA0EIaiACIANBIGpBkKqbAUEGEIYNIAMtAAhBBEYNKiADKQMIIgtC/wGDQgRSDQUMKgsgAyAENgIoIAMgBTYCJCADQQE2AiAgA0EIaiACIANBIGpBwpubAUEEEIYNIAMtAAhBBEYNKSADKQMIIgtC/wGDQgRSDQQMKQsgAyAENgIoIAMgBTYCJCADQQE2AiAgA0EIaiACIANBIGpBiMybAUEJEIYNIAMtAAhBBEYNKCADKQMIIgtC/wGDQgRSDQMMKAsgAyAENgIoIAMgBTYCJCADQQE2AiAgA0EIaiACIANBIGpB6ambAUEEEIYNIAMtAAhBBEYNJyADKQMIIgtC/wGDQgRSDQIMJwsgAyAENgIoIAMgBTYCJCADQQE2AiAgA0EIaiACIANBIGpBlqqbAUEFEIYNIAMtAAhBBEYNJiADKQMIIgtC/wGDQgRSDQEMJgsgAyAENgIoIAMgBTYCJCADQQE2AiAgA0EIaiACIANBIGpBm6qbAUEJEIYNIAMtAAhBBEYNJSADKQMIIgtC/wGDQgRRDSULIAtC/wGDQgRRDSQgACALNwIADCULIANBIGogASgCBCABKAIIIAIQzQ4gAy0AIEEERg0jIAMpAyAiC0L/AYNCBFENIyAAIAs3AgAMJAsgA0EgaiACIAEoAhgiBSABKAIUIgYgASgCBCIEQYCAgIB4RhtBABCiAgJAIAMtACBBBEYNACADKQMgIgtC/wGDQgRSDSILAkAgBEGAgICAeEYNACADQQhqIAIgBkEAEKICAkAgAy0ACEEERg0AIAMpAwgiC0L/AYNCBFINIgsgAS0AIEUNICADQQA2AgggA0EYaiACIANBCGpBlKWbAUEIEIYNAkAgAy0AGEEERg0AIAMpAxgiC0L/AYNCBFINIgsgA0EIaiACEN0PIAMtAAhBBEYNICADKQMIIgtC/wGDQgRRDSAMIQsgASgCHCEEIANBCGogAiAFQQAQogICQAJAIAMtAAhBBEYNACADKQMIIgtC/wGDQgRSDQELIANBCGogAUEgaiACEI4fAkAgAy0ACEEERg0AIAMpAwgiC0L/AYNCBFINAQsgA0EANgIgIANBCGogAiADQSBqQfjAmwFBARCFDQJAIAMtAAhBBEYNACADKQMIIgtC/wGDQgRSDQELIANBCGogAiAFIAQgASgCDCABKAIQEOUGAkAgAy0ACEEERg0AIAMpAwgiC0L/AYNCBFINAQsgA0EIaiACIANBIGpBs4GdAUEBEIUNAkAgAy0ACEEERg0AIAMpAwgiC0L/AYNCBFINAQsCQCACLQBNDQAgA0EIaiACEN0PIAMtAAhBBEYNACADKQMIIgtC/wGDQgRSDQELIANBCGogAiADQSBqQcbLmwFBAhCFDQJAIAMtAAhBBEYNACADKQMIIgtC/wGDQgRSDQELAkAgAi0ATQ0AIANBCGogAhDdDyADLQAIQQRGDQAgAykDCCILQv8Bg0IEUg0BCyADQQhqIAFBFGogAhCdECADLQAIQQRGDSMgAykDCCILQv8Bg0IEUQ0jCyALQv8Bg0IEUQ0iDCELIANBCGogAiABKAIIQQAQogICQAJAIAMtAAhBBEYNACADKQMIIgtC/wGDQgRSDQELIANBCGogAUEQaiACEIwIAkAgAy0ACEEERg0AIAMpAwgiC0L/AYNCBFINAQsgASgCKCIBRQ0iIANBADYCICADQQhqIAIgA0EgakH9m5sBQQEQhQ0CQCADLQAIQQRGDQAgAykDCCILQv8Bg0IEUg0BCyADQQhqIAIgASgCDCABKAIQIAEoAgQgASgCCEGQ0gEQrwQCQCADLQAIQQRGDQAgAykDCCILQv8Bg0IEUg0BCyADQQhqIAIgA0EgakGAnJsBQQEQhQ0gAy0ACEEERg0iIAMpAwgiC0L/AYNCBFENIgsgC0L/AYNCBFENISAAIAs3AgAMIgsgA0EgaiACIAEoAghBABCiAgJAAkAgAy0AIEEERg0AIAMpAyAiC0L/AYNCBFINAQsgA0EANgIgIANBCGogAiADQSBqQbybmwFBBhCGDQJAIAMtAAhBBEYNACADKQMIIgtC/wGDQgRSDQELIANBIGogAhDdDwJAIAMtACBBBEYNACADKQMgIgtC/wGDQgRSDQELIAFBEGohBAJAAkACQCABLQBEQQRGDQAgA0EgaiAEIAIQtwMgAy0AIEEERg0CIAMpAyAiC0L/AYNCBFINAQwCCyADQSBqIAQgAhCMCCADLQAgQQRGDQEgAykDICILQv8Bg0IEUQ0BCyALQv8Bg0IEUg0BCyADQSBqIAFB2ABqIAIQjx8gAy0AIEEERg0hIAMpAyAiC0L/AYNCBFENIQsgC0L/AYNCBFENICAAIAs3AgAMIQsgASgCFCEEIANBCGogAiABKAIQIgVBABCiAgJAAkAgAy0ACEEERg0AIAMpAwgiC0L/AYNCBFINAQsgA0EANgIgIANBCGogAiADQSBqQbuymwFBARCFDQJAIAMtAAhBBEYNACADKQMIIgtC/wGDQgRSDQELIANBCGogAiAFIAQgASgCCCABKAIMEIABAkAgAy0ACEEERg0AIAMpAwgiC0L/AYNCBFINAQsgA0EIaiACIANBIGpByMubAUEBEIUNIAMtAAhBBEYNICADKQMIIgtC/wGDQgRRDSALIAtC/wGDQgRRDR8gACALNwIADCALIANBCGogAiABKAIIQQAQogICQAJAIAMtAAhBBEYNACADKQMIIgtC/wGDQgRSDQELIANBCGogAUEEaiACEE8CQCADLQAIQQRGDQAgAykDCCILQv8Bg0IEUg0BCyADQQA2AiAgA0EIaiACIANBIGpB0MubAUEBEIUNAkAgAy0ACEEERg0AIAMpAwgiC0L/AYNCBFINAQsgA0EIaiACIANBIGpB0cubAUEBEIUNIAMtAAhBBEYNHyADKQMIIgtC/wGDQgRRDR8LIAtC/wGDQgRRDR4gACALNwIADB8LIAEoAhQhByADQSBqIAIgASgCECIIQQAQogICQCADLQAgQQRGDQAgAykDICILQv8Bg0IEUg0aCyADQQA2AgggA0EgaiACIANBCGpB0MubAUEBEIUNAkAgAy0AIEEERg0AIAMpAyAiC0L/AYNCBFINGgsgASgCCCEEIANBIGogAiAIIAEoAgwiCUHQAiAJEIUaAkAgAy0AIEEFRg0AIAMpAyAhCwwYCyADQSBqELMhIAlFDRYgA0EBOgAWIAItAE1BAUcNDAwVCyADQSBqIAIgASgCCEEAEKICAkACQCADLQAgQQRGDQAgAykDICILQv8Bg0IEUg0BCyADQSBqIAFBBGogAhBPAkAgAy0AIEEERg0AIAMpAyAiC0L/AYNCBFINAQsgA0EANgIgIANBCGogAiADQSBqQeDLmwFBARCFDSADLQAIQQRGDR0gAykDCCILQv8Bg0IEUQ0dCyALQv8Bg0IEUQ0cIAAgCzcCAAwdCyADQSBqIAIgASgCCEEAEKICAkACQCADLQAgQQRGDQAgAykDICILQv8Bg0IEUg0BCyADQQA2AiAgA0EIaiACIANBIGpBycubAUEDEIUNAkAgAy0ACEEERg0AIAMpAwgiC0L/AYNCBFINAQsgA0EgaiABQQRqIAIQTyADLQAgQQRGDRwgAykDICILQv8Bg0IEUQ0cCyALQv8Bg0IEUQ0bIAAgCzcCAAwcCwJAAkAgASgCBEEBRw0AIAEoAhghBCADQSBqIAIgASgCFCIFQQAQogICQAJAIAMtACBBBEYNACADKQMgIgtC/wGDQgRSDQELIANBIGogAiAFIAQgASgCDCABKAIQQYgCEK8EIAMtACBBBEYNHSADKQMgIgtC/wGDQgRRDR0LIAtC/wGDQgRSDQEMHAsgASgCGCEEIANBIGogAiABKAIUIgVBABCiAgJAAkAgAy0AIEEERg0AIAMpAyAiC0L/AYNCBFINAQsgA0EgaiACIAUgBCABKAIMIAEoAhBBhAIQrwQgAy0AIEEERg0cIAMpAyAiC0L/AYNCBFENHAsgC0L/AYNCBFENGwsgC0L/AYNCBFENGiAAIAs3AgAMGwsgA0EIaiACIAEoAhRBABCiAgJAAkAgAy0ACEEERg0AIAMpAwgiC0L/AYNCBFINAQsgA0EIaiABQQRqIAIQTwJAIAMtAAhBBEYNACADKQMIIgtC/wGDQgRSDQELIANBCGogAhDdDwJAIAMtAAhBBEYNACADKQMIIgtC/wGDQgRSDQELIANBADYCICADQQhqIAIgA0EgakHXy5sBQQcQhg0CQCADLQAIQQRGDQAgAykDCCILQv8Bg0IEUg0BCyADQQhqIAIQ3Q8CQCADLQAIQQRGDQAgAykDCCILQv8Bg0IEUg0BCyADQQhqIAFBCGogAhBPAkAgAy0ACEEERg0AIAMpAwgiC0L/AYNCBFINAQsgA0EIaiACEN0PAkAgAy0ACEEERg0AIAMpAwgiC0L/AYNCBFINAQsgA0EIaiACIANBIGpB4MubAUEBEIUNAkAgAy0ACEEERg0AIAMpAwgiC0L/AYNCBFINAQsgA0EIaiACEN0PAkAgAy0ACEEERg0AIAMpAwgiC0L/AYNCBFINAQsgA0EIaiABQQxqIAIQTwJAIAMtAAhBBEYNACADKQMIIgtC/wGDQgRSDQELIANBCGogAhDdDwJAIAMtAAhBBEYNACADKQMIIgtC/wGDQgRSDQELIANBCGogAiADQSBqQcXLmwFBARCFDQJAIAMtAAhBBEYNACADKQMIIgtC/wGDQgRSDQELIANBCGogAhDdDwJAIAMtAAhBBEYNACADKQMIIgtC/wGDQgRSDQELIANBCGogAUEQaiACEE8gAy0ACEEERg0aIAMpAwgiC0L/AYNCBFENGgsgC0L/AYNCBFENGSAAIAs3AgAMGgsgA0EgaiACIAEoAghBABCiAgJAAkAgAy0AIEEERg0AIAMpAyAiC0L/AYNCBFINAQsgA0EANgIgIANBCGogAiADQSBqQdLLmwFBBRCGDQJAIAMtAAhBBEYNACADKQMIIgtC/wGDQgRSDQELIANBIGogAhDdDwJAIAMtACBBBEYNACADKQMgIgtC/wGDQgRSDQELIANBIGogAUEQaiACENQDIAMtACBBBEYNGSADKQMgIgtC/wGDQgRRDRkLIAtC/wGDQgRRDRggACALNwIADBkLIANBCGogAiABKAIIQQAQogICQAJAIAMtAAhBBEYNACADKQMIIgtC/wGDQgRSDQELIANBADYCICADQQhqIAIgA0EgakH4wJsBQQEQhQ0CQCADLQAIQQRGDQAgAykDCCILQv8Bg0IEUg0BCyADQQhqIAFBBGogAhBPAkAgAy0ACEEERg0AIAMpAwgiC0L/AYNCBFINAQsgA0EIaiACIANBIGpBs4GdAUEBEIUNIAMtAAhBBEYNGCADKQMIIgtC/wGDQgRRDRgLIAtC/wGDQgRRDRcgACALNwIADBgLIANBIGogAiABKAIIQQAQogICQAJAIAMtACBBBEYNACADKQMgIgtC/wGDQgRSDQELAkACQAJAAkAgAS0AEA4DAAECAAsgA0EANgIgIANBCGogAiADQSBqQZHMmwFBBRCGDSADLQAIQQRGDQIgAykDCCILQv8Bg0IEUQ0CDAMLIANBADYCICADQQhqIAIgA0EgakGWzJsBQQYQhg0gAy0ACEEERg0BIAMpAwgiC0L/AYNCBFENAQwCCyADQQA2AiAgA0EIaiACIANBIGpB4qabAUEIEIYNIAMtAAhBBEYNACADKQMIIgtC/wGDQgRSDQELIANBIGogAhDdDwJAIAMtACBBBEYNACADKQMgIgtC/wGDQgRSDQELIANBIGogAUEEaiACEE8gAy0AIEEERg0XIAMpAyAiC0L/AYNCBFENFwsgC0L/AYNCBFENFiAAIAs3AgAMFwsgA0EIaiACIAEoAgxBABCiAgJAAkAgAy0ACEEERg0AIAMpAwgiC0L/AYNCBFINAQsgA0EIaiABQQRqIAIQTwJAIAMtAAhBBEYNACADKQMIIgtC/wGDQgRSDQELIANBADYCICADQQhqIAIgA0EgakHQy5sBQQEQhQ0CQCADLQAIQQRGDQAgAykDCCILQv8Bg0IEUg0BCyADQQhqIAFBCGogAhBPAkAgAy0ACEEERg0AIAMpAwgiC0L/AYNCBFINAQsgA0EIaiACIANBIGpB0cubAUEBEIUNIAMtAAhBBEYNFiADKQMIIgtC/wGDQgRRDRYLIAtC/wGDQgRRDRUgACALNwIADBYLIANBCGogAiABKAIIQQAQogICQCADLQAIQQRGDQAgAykDCCILQv8Bg0IEUg0MCyADQQA2AiAgA0EIaiACIANBIGpBu7KbAUEBEIUNAkAgAy0ACEEERg0AIAMpAwgiC0L/AYNCBFINDAsgA0EIaiACEKYTAkAgAy0ACEEERg0AIAMpAwgiC0L/AYNCBFINDAsgAiACKAIsQQFqNgIsAkACQAJAIAEtAEgOBAABAg0ACyADQQhqIAIgA0EgakHippsBQQgQhg0CQCADLQAIQQRGDQAgAykDCCILQv8Bg0IEUg0OCyADQQhqIAIQ3Q8gAy0ACEEERg0MIAMpAwgiC0L/AYNCBFENDAwNCyADQQhqIAIgA0EgakG5m5sBQQEQhQ0CQCADLQAIQQRGDQAgAykDCCILQv8Bg0IEUg0NCyADQQhqIAIgA0EgakHippsBQQgQhg0CQCADLQAIQQRGDQAgAykDCCILQv8Bg0IEUg0NCyADQQhqIAIQ3Q8gAy0ACEEERg0LIAMpAwgiC0L/AYNCBFENCwwMCyADQQhqIAIgA0EgakG4m5sBQQEQhQ0CQCADLQAIQQRGDQAgAykDCCILQv8Bg0IEUg0MCyADQQhqIAIgA0EgakHippsBQQgQhg0CQCADLQAIQQRGDQAgAykDCCILQv8Bg0IEUg0MCyADQQhqIAIQ3Q8gAy0ACEEERg0KIAMpAwgiC0L/AYNCBFENCgwLCyADQSBqIAIgASgCKEEAEKICAkAgAy0AIEEERg0AIAMpAyAiC0L/AYNCBFINCQsCQAJAAkACQAJAIAEoAghBgICAgHhzIgRBBCAEQQRJGw4FAAECAwQACyADQSBqIAFBEGogAhDcFiADLQAgQQRGDRcgAykDICILQv8Bg0IEUg0LDBcLIANBIGogAUEQaiACEIYBIAMtACBBBEYNFiADKQMgIgtC/wGDQgRSDQoMFgsgASgCECEEIANBIGogAiABKAIMIgVBABCiAgJAAkAgAy0AIEEERg0AIAMpAyAiC0L/AYNCBFINAQsCQCABLQAUDQAgAyAENgIoIAMgBTYCJCADQQE2AiAgA0EIaiACIANBIGpBxNCbAUEFEIYNIAMtAAhBBEYNFyADKQMIIgtC/wGDQgRSDQEMFwsgAyAENgIoIAMgBTYCJCADQQE2AiAgA0EIaiACIANBIGpBydCbAUEEEIYNIAMtAAhBBEYNFiADKQMIIgtC/wGDQgRRDRYLIAtC/wGDQgRSDQkMFQsgA0EgaiABQRBqIAIQuwMgAy0AIEEERg0UIAMpAyAiC0L/AYNCBFINCAwUCyADQQhqIAIgASgCIEEAEKICAkAgAy0ACEEERg0AIAMpAwgiC0L/AYNCBFINBwsgA0EANgIgIANBCGogAiADQSBqQbq+mwFBARCFDQJAIAMtAAhBBEYNACADKQMIIgtC/wGDQgRSDQcLIAEoAhAiByABKAIcIgpqIQUgASgCDCEJQQAhBANAAkACQAJAIAUgBEYNACAEQQFxDQEgA0EIaiABKAIYIAogBEEBdkHky5sBEMAeIAIQkQEgAy0ACEEERg0CIAMpAwgiC0L/AYNCBFINCgwCCyADQQhqIAIgA0EgakG6vpsBQQEQhQ0gAy0ACEEERg0WIAMpAwgiC0L/AYNCBFENFgwJCyADQQhqIAIgA0EgakH0y5sBQQIQhQ0CQCADLQAIQQRGDQAgAykDCCILQv8Bg0IEUg0JCyAEQQF2IgYgB08NBSADQQhqIAkgBkECdGogAhBPAkAgAy0ACEEERg0AIAMpAwgiC0L/AYNCBFINCQsgA0EIaiACIANBIGpByMubAUEBEIUNIAMtAAhBBEYNACADKQMIIgtC/wGDQgRSDQgLIARBAWohBAwACwsgA0EgaiACIAEoAiBBABCiAgJAIAMtACBBBEYNACADKQMgIgtC/wGDQgRSDQULIAEtACxFDQMgA0EANgIgIANBCGogAiADQSBqQaXMmwFBBxCGDQJAIAMtAAhBBEYNACADKQMIIgtC/wGDQgRSDQULIANBIGogAhDdDyADLQAgQQRGDQMgAykDICILQv8Bg0IEUQ0DDAQLIANBIGogAUEIaiACELcDIAMtACBBBEYNESADKQMgIgtC/wGDQgRRDREgACALNwIADBILIAIgAigCLEEBajYCLAwICyAGIAdB+MubARDDEgALIANBIGogAiABQQhqIgUgAS0AHCIEQQJHQQN0aigCAEEAEKICAkACQAJAIAMtACBBBEYNACADKQMgIgtC/wGDQgRSDQELAkAgBEECRg0AIANBIGogBSACEPYUIAMtACBBBEYNAiADKQMgIgtC/wGDQgRSDQEMAgsgA0EgaiABKAIIIAEoAgwgAhDNDiADLQAgQQRGDQEgAykDICILQv8Bg0IEUQ0BCyALQv8Bg0IEUg0BCyABKAIoRQ0OIANBIGogAhDdDwJAIAMtACBBBEYNACADKQMgIgtC/wGDQgRSDQELIANBADYCICADQQhqIAIgA0EgakGszJsBQQIQhg0CQCADLQAIQQRGDQAgAykDCCILQv8Bg0IEUg0BCyADQSBqIAIQ3Q8CQCADLQAgQQRGDQAgAykDICILQv8Bg0IEUg0BCyADQSBqIAFBKGogAhCdECADLQAgQQRGDQ4gAykDICILQv8Bg0IEUQ0OCyALQv8Bg0IEUQ0NIAAgCzcCAAwOCyALQv8Bg0IEUQ0MCyALQv8Bg0IEUQ0LCyALQv8Bg0IEUQ0KIAAgCzcCAAwLCyADQQhqIAIgA0EgakHQy5sBQQEQhQ0CQCADLQAIQQRGDQAgAykDCCILQv8Bg0IEUg0BCyADQQhqIAFBGGogAhD2FAJAIAMtAAhBBEYNACADKQMIIgtC/wGDQgRSDQELAkAgASgCMEUNACADQQhqIAIQ3Q8CQCADLQAIQQRGDQAgAykDCCILQv8Bg0IEUg0CCyADQQhqIAIgA0EgakGUnJsBQQIQhg0CQCADLQAIQQRGDQAgAykDCCILQv8Bg0IEUg0CCyADQQhqIAIQ3Q8CQCADLQAIQQRGDQAgAykDCCILQv8Bg0IEUg0CCyADQQhqIAFBMGogAhBPIAMtAAhBBEYNACADKQMIIgtC/wGDQgRSDQELAkAgASgCNEUNAAJAIAItAE0NACADQQhqIAIQ3Q8gAy0ACEEERg0AIAMpAwgiC0L/AYNCBFINAgsgA0EIaiACIANBIGpBzJubAUEBEIUNAkAgAy0ACEEERg0AIAMpAwgiC0L/AYNCBFINAgsCQCACLQBNDQAgA0EIaiACEN0PIAMtAAhBBEYNACADKQMIIgtC/wGDQgRSDQILIANBCGogAUE0aiACEE8gAy0ACEEERg0AIAMpAwgiC0L/AYNCBFINAQsCQCABKAJARQ0AIANBCGogAhDdDwJAIAMtAAhBBEYNACADKQMIIgtC/wGDQgRSDQILIANBCGogAiADQSBqQdyxmwFBAhCGDQJAIAMtAAhBBEYNACADKQMIIgtC/wGDQgRSDQILIANBCGogAhDdDwJAIAMtAAhBBEYNACADKQMIIgtC/wGDQgRSDQILIANBCGogAUHAAGogAhBPIAMtAAhBBEYNACADKQMIIgtC/wGDQgRSDQELIANBCGogAiADQSBqQdHLmwFBARCFDQJAIAMtAAhBBEYNACADKQMIIgtC/wGDQgRSDQELAkACQAJAAkAgAS0ASQ4EAAECAwALIANBCGogAiADQSBqQeDLmwFBARCFDSADLQAIQQRGDQIgAykDCCILQv8Bg0IEUQ0CDAMLIANBCGogAiADQSBqQbmbmwFBARCFDQJAIAMtAAhBBEYNACADKQMIIgtC/wGDQgRSDQMLIANBCGogAiADQSBqQeDLmwFBARCFDSADLQAIQQRGDQEgAykDCCILQv8Bg0IEUQ0BDAILIANBCGogAiADQSBqQbibmwFBARCFDQJAIAMtAAhBBEYNACADKQMIIgtC/wGDQgRSDQILIANBCGogAiADQSBqQeDLmwFBARCFDSADLQAIQQRGDQAgAykDCCILQv8Bg0IEUg0BCwJAIAEoAkRFDQAgA0EIaiACIANBIGpBxcubAUEBEIUNAkAgAy0ACEEERg0AIAMpAwgiC0L/AYNCBFINAgsgA0EIaiACEN0PAkAgAy0ACEEERg0AIAMpAwgiC0L/AYNCBFINAgsgA0EIaiABQcQAaiACEE8gAy0ACEEERg0AIAMpAwgiC0L/AYNCBFINAQsgA0EIaiACIANBIGoQhw0CQCADLQAIQQRGDQAgAykDCCILQv8Bg0IEUg0BCyADQQhqIAIQphMCQCADLQAIQQRGDQAgAykDCCILQv8Bg0IEUg0BCyACIAIoAixBf2o2AiwgA0EIaiACIANBIGpByMubAUEBEIUNIAMtAAhBBEYNCSADKQMIIgtC/wGDQgRRDQkLIAtC/wGDQgRRDQggACALNwIADAkLIANBADoAFyAJIQFBACEGQQAhCgNAAkACQAJAIAFFDQAgBEEsaigCACEFIANBIGogAiAHQdACIAYgCiADQRdqIANBFmoQxgUCQCADLQAgQQRGDQAgAykDICILQv8Bg0IEUg0GCyADQSBqIAIgBEEoaigCAEEAEKICAkACQAJAIAMtACBBBEYNACADKQMgIgtC/wGDQgRSDQELAkAgBCgCAEEHRg0AIANBIGogBCACEN0GAkAgAy0AIEEERg0AIAMpAyAiC0L/AYNCBFINAgsgA0EANgIgIANBGGogAiADQSBqQcXLmwFBARCFDQJAIAMtABhBBEYNACADKQMYIgtC/wGDQgRSDQILIAItAE0NACADQSBqIAIQ3Q8gAy0AIEEERg0AIAMpAyAiC0L/AYNCBFINAQsgA0EgaiAEQTBqIAIQTyADLQAgQQRGDQEgAykDICILQv8Bg0IEUQ0BCyALQv8Bg0IEUg0GCyADLQAWDQEgA0EBOgAWDAILIANBIGogAiAIIAdB0AIgBiAKEMgCIAMtACBBBEYNAyADKQMgIgtC/wGDQgRSDQQMAwsgAigCREUNACADQSBqIAIgBUEAEOoDIAMtACBBBEYNACADKQMgIgtC/wGDQgRSDQMLAkAgAy0AF0UNACACIAIoAixBf2o2AiwgA0EAOgAXCyABQX9qIQEgBEE4aiEEQQEhBiAFIQoMAAsLIANBIGogAiAHIAlFQdACEMARIAMtACBBBEYNASADKQMgIgtC/wGDQgRRDQELIAtC/wGDQgRSDQELIANBIGogAiADQQhqQdHLmwFBARCFDSADLQAgQQRGDQQgAykDICILQv8Bg0IEUQ0ECyALQv8Bg0IEUQ0DIAAgCzcCAAwECyADQQA2AiAgA0EIaiACIANBIGpBwsubAUEDEIYNAkAgAy0ACEEERg0AIAMpAwgiC0L/AYNCBFINAQsCQCABKAIcRQ0AIANBCGogAhDdDwJAIAMtAAhBBEYNACADKQMIIgtC/wGDQgRSDQILIANBCGogAUEcaiACEJMFIAMtAAhBBEYNACADKQMIIgtC/wGDQgRSDQELIANBCGogAiADQSBqQfjAmwFBARCFDQJAIAMtAAhBBEYNACADKQMIIgtC/wGDQgRSDQELIANBCGogAiAGIAUgASgCCCABKAIMEOUGAkAgAy0ACEEERg0AIAMpAwgiC0L/AYNCBFINAQsgA0EIaiACIANBIGpBs4GdAUEBEIUNAkAgAy0ACEEERg0AIAMpAwgiC0L/AYNCBFINAQsCQCACLQBNDQAgA0EIaiACEN0PIAMtAAhBBEYNACADKQMIIgtC/wGDQgRSDQELIANBCGogAiADQSBqQcbLmwFBAhCFDQJAIAMtAAhBBEYNACADKQMIIgtC/wGDQgRSDQELAkAgAi0ATQ0AIANBCGogAhDdDyADLQAIQQRGDQAgAykDCCILQv8Bg0IEUg0BCyADQQhqIAFBEGogAhCdECADLQAIQQRGDQIgAykDCCILQv8Bg0IEUQ0CCyALQv8Bg0IEUQ0BCyALQv8Bg0IEUQ0AIAAgCzcCAAwBCyAAQQQ6AAALIANBMGokAAvRVAMVfwV+AXwjAEHQB2siAiQAIAEoAsABIQMCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABLQDIASIEQY1/akH/AXFBLkkNAAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAEQUBqDg4CAgIBAQMEAQEBARAQEAALAkAgBEGcf2oODhABAQEHAQIBCAEQAQEQAAsCQCAEDgULAQkBCgALIARBDkYNBCAEQRpGDQEgBEHaAEYNASAEQd8ARg0FCyACQYAGakEEciAEEIYeIAJBhQE2ApQGIAJBsaubATYCkAYgAkGwgICAeDYCgAYgASgCwAEgASgCxAEgAkGABmoQhBchBEEBIQUgAS0AyAFBogFHDTEgARDXEiEDIAEQ4w4gASADEPoSDDELAkACQCAEQRpHDQAgARDjDiACQQA2AvgGIAJCgICAgMAANwLwBiACQYAGaiABQQAQqQYgAigCgAYhBCACLQCYBiIGQQJGDTAgAkHgBWpBEGoiByACQYAGakEUaigCADYCACACQeAFakEIaiIIIAJBgAZqQQxqKQIANwMAIAIgAikChAY3A+AFIAIgAigAmQY2AsAHIAIgAkGABmpBHGooAAA2AMMHQQhBIBCZIiIFRQ0uIAUgBDYCACAFIAIpA+AFNwIEIAUgBjoAGCAFIAIoAsAHNgAZIAVBHGogAigAwwc2AAAgBUEMaiAIKQMANwIAIAVBFGogBygCADYCACACIAU2ApQHIAJBATYCkAcgAkGZBmohCSACQYAGakEEciEKQQAhCEEEIQtBACEHQQEhBAJAAkADQCACIAQ2ApgHIAZBAXENAgJAIAEtAMgBIgRBPUcNACABEOMOIAJBCGogARDXBCACKAIMIQQgAigCCEEBcQ0zAkAgByACKALwBkcNACACQfAGakHYrJsBELUYIAIoAvQGIQsLIAsgCGogBDYCACACIAdBAWoiBzYC+AYgAS0AyAEiBEEDRw0CIAEQ4w4gAkGABmogAUEAEKkGIAIoAoAGIQQgAi0AmAYiBkECRg0zIAJB6ABqQRBqIgwgCkEQaigCADYCACACQegAakEIaiINIApBCGop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BCACIA8oAAA2AqgHIAIgECgAADYAqwcCQCACKALoBSIJIAIoAuAFRw0AIAJB4AVqQbi/mwEQtBgLIAIoAuQFIgggCUEFdGoiBCAGNgIAIAQgAikDyAQ3AgQgBCAFOgAYIAQgAigCqAc2ABkgBEEMaiANKQMANwIAIARBFGogDCgCADYCACAEQRxqIAIoAKsHNgAAIApBBGohCiAJQQFqIQkMAQsLIAJB4AVqEP0fCyACQcAFahDaIUGAgICAeCEKDCMLIAEQ4w5BASEFAkACQAJAAkAgAS0AyAEiBEG/f2pB/wFxQQFLDQAgAkGABmogARChBiACKAKEBiEEIAIoAoAGIgVBB0YNMCACQcgEakEYaiACQYAGakEYaikDADcDACACQcgEakEQaiACQYAGakEQaikDADcDACACIAIpA4gGNwPQBCACIAQ2AswEIAIgBTYCyAQgBUF9ag4CAgMBCyACQYAGakEEciAEEIYeIAJBITYClAYgAkGQq5sBNgKQBiACQbCAgIB4NgKABiABKALAASABKALEASACQYAGahCEFyEEIAEtAMgBQaIBRw0wIAEQ1xIhAyABEOMOIAEgAxD6EgwwC0GSqZsBQShBgKubARCMGgALIAIoAtQEIQYgAigC0AQhByACIAIrA9gEOQPABSACKQPgBCEYIAJB6ABqQbibmwFBARCcFQJAAkAgGFANACACIBg3A4AGIAJBKGogAkGABmoQlBMgAkHoAGogAigCKCIEIAQgAigCLGoQjxsgAikDgAYQ8x8MAQsgAkEBNgKEBiACQZTzmwE2AoAGIAJCATcCjAYgAkH3Aa1CIIYgAkHABWqthDcD4AUgAiACQeAFajYCiAYgAkHoAGogAkGABmoQrSENCgsgAisDwAUhHCACQYAGakEIaiACQegAakEIaigCADYCACACIAIpAmg3A4AGIAJBgAZqEJgfIhdCgICAgHCDIRggHJohHCAXpyEFQYCAgIB4IQgMIgsgAigC1AQhBiACKALQBCEHIAIgAigC4AQ2AsAFIAIpA9gEIRggAkHoAGpBuJubAUEBEJwVAkAgGFANACACIBg3A4AGIAJBMGogAkGABmoQlBMgAkHoAGogAigCMCIEIAQgAigCNGoQjxsgAikDgAYQ8x8MIQsgAkEBNgKEBiACQZTzmwE2AoAGIAJCATcCjAYgAkHc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QQAhBSABIQQMBAsACyACQZAHahD9HwsgAkHwBmoQ2iELQQEhBQsgACAENgIEIAAgBTYCACACQdAHaiQAC4xMAQp/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCACICQXRqIgNBByADQSZJGw4mHgABAgMEBQYHCAkKCwweHg0ODxARHhITFB4eFRYXGBkaGxweHR4eCyAAKAIMIgNFDR0gACgCCCEAIANBBHQhAgNAAkAgACgCAEECRg0AIAEgAEEMaigCACIDENMDIAMgARBRIAEoAgBFDQAgAygCAEEaRw0AIAEgA0EIaiIEEMMFIgVFDQAgAxDkASADQThqIAVBOGopAwA3AwAgA0EwaiAFQTBqKQMANwMAIANBKGogBUEoaikDADcDACADQSBqIAVBIGopAwA3AwAgA0EYaiAFQRhqKQMANwMAIANBEGogBUEQaikDADcDACAEIAVBCGopAwA3AwAgAyAFKQMANwMAIAVBwABBCBC9EwsgAEEQaiEAIAJBcGoiAg0ADB4LCyAAKAIMIgNFDRwgACgCCCIGIANBDGxqIQcDQAJAAkAgBigCACIADQACQAJAAkACQAJAAkAgBigCBCIIKAIAIgNBe2oiAEEEIABBBkkbDgYFAAECAwQFCwJAIAgoAghBA0cNACABIAgoAgwiABDTAyAAIAEQUSABKAIARQ0AIAAoAgBBGkcNACABIABBCGoiAhDDBSIDRQ0AIAAQ5AEgAEE4aiADQThqKQMANwMAIABBMGogA0EwaikDADcDACAAQShqIANBKGopAwA3AwAgAEEgaiADQSBqKQMANwMAIABBGGogA0EYaikDADcDACAAQRBqIANBEGopAwA3AwAgAiADQQhqKQMANwMAIAAgAykDADcDACADQcAAQQgQvRMLIAEgCCgCKCIAENMDIAAgARBRIAEoAgBFDQYgACgCAEEaRw0EIAEgAEEIaiICEMMFIgNFDQQgABDkASAAQThqIANBOGopAwA3AwAgAEEwaiADQTBqKQMANwMAIABBKGogA0EoaikDADcDACAAQSBqIANBIGopAwA3AwAgAEEYaiADQRhqKQMANwMAIABBEGogA0EQaikDADcDACACIANBCGopAwA3AwAgACADKQMANwMAIANBwABBCBC9EwwECyABIAgoAigiABDTAyAAIAEQUSABKAIARQ0FIAAoAgBBGkcNAyABIABBCGoiAhDDBSIDRQ0DIAAQ5AEgAEE4aiADQThqKQMANwMAIABBMGogA0EwaikDADcDACAAQShqIANBKGopAwA3AwAgAEEgaiADQSBqKQMANwMAIABBGGogA0EYaikDADcDACAAQRBqIANBEGopAwA3AwAgAiADQQhqKQMANwMAIAAgAykDADcDACADQcAAQQgQvRMMAwsgCEEoaiEAAkAgCCgCCEEDRw0AIAEgCCgCDCIDENMDIAMgARBRIAEoAgBFDQAgAygCAEEaRw0AIAEgA0EIaiIFEMMFIgJFDQAgAxDkASADQThqIAJBOGopAwA3AwAgA0EwaiACQTBqKQMANwMAIANBKGogAkEoaikDADcDACADQSBqIAJBIGopAwA3AwAgA0EYaiACQRhqKQMANwMAIANBEGogAkEQaikDADcDACAFIAJBCGopAwA3AwAgAyACKQMANwMAIAJBwABBCBC9EwsgACgCAEGAgICAeEYNAiABIAAQ5AQMAgsgCEEgaiEAAkAgA0EDRw0AIAEgCCgCBCIDENMDIAMgARBRIAEoAgBFDQAgAygCAEEaRw0AIAEgA0EIaiIFEMMFIgJFDQAgAxDkASADQThqIAJBOGopAwA3AwAgA0EwaiACQTBqKQMANwMAIANBKGogAkEoaikDADcDACADQSBqIAJBIGopAwA3AwAgA0EYaiACQRhqKQMANwMAIANBEGogAkEQaikDADcDACAFIAJBCGopAwA3AwAgAyACKQMANwMAIAJBwABBCBC9EwsCQCAAKAIAQQdGDQAgACABEIYEIAEoAgBFDQAgASAAEMMICyAIQcgAaiEAIAgoAmgiAyABEIYEAkAgASgCAEUNACABIAMQwwgLIAAoAgBBgICAgHhGDQEgASAAEOQEDAELAkAgCCgCCEEDRw0AIAEgCCgCDCIAENMDIAAgARBRIAEoAgBFDQAgACgCAEEaRw0AIAEgAEEIaiICEMMFIgNFDQAgABDkASAAQThqIANBOGopAwA3AwAgAEEwaiADQTBqKQMANwMAIABBKGogA0EoaikDADcDACAAQSBqIANBIGopAwA3AwAgAEEYaiADQRhqKQMANwMAIABBEGogA0EQaikDADcDACACIANBCGopAwA3AwAgACADKQMANwMAIANBwABBCBC9EwsCQCAIKAIoIglBCGooAgAiAEUNACAJQQRqKAIAIgogAEEGdGohCwNAAkAgCkE4aigCACIARQ0AIApBNGooAgAhAyAAQQxsIQUDQCABIAMoAgAiABDTAyAAIAEQUQJAIAEoAgBFDQAgACgCAEEaRw0AIAEgAEEIaiIEEMMFIgJFDQAgABDkASAAQThqIAJBOGopAwA3AwAgAEEwaiACQTBqKQMANwMAIABBKGogAkEoaikDADcDACAAQSBqIAJBIGopAwA3AwAgAEEYaiACQRhqKQMANwMAIABBEGogAkEQaikDADcDACAEIAJBCGopAwA3AwAgACACKQMANwMAIAJBwABBCBC9EwsgA0EMaiEDIAVBdGoiBQ0ACwsgCiABENcIIApBwABqIgAhCiAAIAtHDQALCyAJQRhqIQoCQCAJQRRqKAIAIgBFDQAgCUEQaigCACEDIABBDGwhBQNAIAEgAygCACIAENMDIAAgARBRAkAgASgCAEUNACAAKAIAQRpHDQAgASAAQQhqIgQQwwUiAkUNACAAEOQBIABBOGogAkE4aikDADcDACAAQTBqIAJBMGopAwA3AwAgAEEoaiACQShqKQMANwMAIABBIGogAkEgaikDADcDACAAQRhqIAJBGGopAwA3AwAgAEEQaiACQRBqKQMANwMAIAQgAkEIaikDADcDACAAIAIpAwA3AwAgAkHAAEEIEL0TCyADQQxqIQMgBUF0aiIFDQALCyAKKAIAQYCAgIB4Rg0AIAEgChDkBAsgASgCAEUNASABIAgQsgsMAQsgASAAENMDIAAgARBRIAEoAgBFDQAgACgCAEEaRw0AIAEgAEEIaiICEMMFIgNFDQAgABDkASAAQThqIANBOGopAwA3AwAgAEEwaiADQTBqKQMANwMAIABBKGogA0EoaikDADcDACAAQSBqIANBIGopAwA3AwAgAEEYaiADQRhqKQMANwMAIABBEGogA0EQaikDADcDACACIANBCGopAwA3AwAgACADKQMANwMAIANBwABBCBC9EwsgBkEMaiIGIAdHDQAMHQsLAkAgACgCICIIQQhqKAIAIgBFDQAgCEEEaigCACIKIABBBnRqIQYDQAJAIApBOGooAgAiAEUNACAKQTRqKAIAIQMgAEEMbCEFA0AgASADKAIAIgAQ0wMgACABEFECQCABKAIARQ0AIAAoAgBBGkcNACABIABBCGoiBBDDBSICRQ0AIAAQ5AEgAEE4aiACQThqKQMANwMAIABBMGogAkEwaikDADcDACAAQShqIAJBKGopAwA3AwAgAEEgaiACQSBqKQMANwMAIABBGGogAkEYaikDADcDACAAQRBqIAJBEGopAwA3AwAgBCACQQhqKQMANwMAIAAgAikDADcDACACQcAAQQgQvRMLIANBDGohAyAFQXRqIgUNAAsLIAogARDXCCAKQcAAaiIAIQogACAGRw0ACwsgCEEYaiEKAkAgCEEUaigCACIARQ0AIAhBEGooAgAhAyAAQQxsIQUDQCABIAMoAgAiABDTAyAAIAEQUQJAIAEoAgBFDQAgACgCAEEaRw0AIAEgAEEIaiIEEMMFIgJFDQAgABDkASAAQThqIAJBOGopAwA3AwAgAEEwaiACQTBqKQMANwMAIABBKGogAkEoaikDADcDACAAQSBqIAJBIGopAwA3AwAgAEEYaiACQRhqKQMANwMAIABBEGogAkEQaikDADcDACAEIAJBCGopAwA3AwAgACACKQMANwMAIAJBwABBCBC9EwsgA0EMaiEDIAVBdGoiBQ0ACwsgCigCAEGAgICAeEYNGyABIAoQ5AQPCyABIAAoAgQiABDTAyAAIAEQUSABKAIARQ0aIAAoAgBBGkcNGiABIABBCGoiAxDDBSIBRQ0aIAAQ5AEgAEE4aiABQThqKQMANwMAIABBMGogAUEwaikDADcDACAAQShqIAFBKGopAwA3AwAgAEEgaiABQSBqKQMANwMAIABBGGogAUEYaikDADcDACAAQRBqIAFBEGopAwA3AwAgAyABQQhqKQMANwMAIAAgASkDADcDACABQcAAQQgQvRMPCyABLQCcASECIAFBAToAnAEgASAAKAIMIgAQ0wMgACABEFECQCABKAIARQ0AIAAoAgBBGkcNACABIABBCGoiBRDDBSIDRQ0AIAAQ5AEgAEE4aiADQThqKQMANwMAIABBMGogA0EwaikDADcDACAAQShqIANBKGopAwA3AwAgAEEgaiADQSBqKQMANwMAIABBGGogA0EYaikDADcDACAAQRBqIANBEGopAwA3AwAgBSADQQhqKQMANwMAIAAgAykDADcDACADQcAAQQgQvRMLIAEgAjoAnAEPCyABIAAoAgQiAxDTAyADIAEQUQJAIAEoAgBFDQAgAygCAEEaRw0AIAEgA0EIaiIFEMMFIgJFDQAgAxDkASADQThqIAJBOGopAwA3AwAgA0EwaiACQTBqKQMANwMAIANBKGogAkEoaikDADcDACADQSBqIAJBIGopAwA3AwAgA0EYaiACQRhqKQMANwMAIANBEGogAkEQaikDADcDACAFIAJBCGopAwA3AwAgAyACKQMANwMAIAJBwABBCBC9EwsgASAAKAIIIgAQ0wMgACABEFEgASgCAEUNGCAAKAIAQRpHDRggASAAQQhqIgMQwwUiAUUNGCAAEOQBIABBOGogAUE4aikDADcDACAAQTBqIAFBMGopAwA3AwAgAEEoaiABQShqKQMANwMAIABBIGogAUEgaikDADcDACAAQRhqIAFBGGopAwA3AwAgAEEQaiABQRBqKQMANwMAIAMgAUEIaikDADcDACAAIAEpAwA3AwAgAUHAAEEIEL0TDwsgAS0AnAEhCCABQQE6AJwBAkACQCACQQtHDQACQAJAIAAoAgQOAwABAwALIAAoAhAiAkUNAiAAKAIMIQMgAkEobCECA0ACQCADKAIAQQdGDQAgAyABEIYEIAEoAgBFDQAgASADEMMICyADQShqIQMgAkFYaiICDQAMAwsLIAAoAhAiA0UNASAAKAIMIQQgA0E4bCEKQQAhAgNAAkACQAJAAkAgBCACaiIDKAIADgMAAQIACwJAIANBCGooAgBBA0cNACABIANBDGooAgAiBRDTAyAFIAEQUSABKAIARQ0AIAUoAgBBGkcNACABIAVBCGoiCxDDBSIGRQ0AIAUQ5AEgBUE4aiAGQThqKQMANwMAIAVBMGogBkEwaikDADcDACAFQShqIAZBKGopAwA3AwAgBUEgaiAGQSBqKQMANwMAIAVBGGogBkEYaikDADcDACAFQRBqIAZBEGopAwA3AwAgCyAGQQhqKQMANwMAIAUgBikDADcDACAGQcAAQQgQvRMLIANBKGooAgAgARDXCAwCCyABLQCcASEGIAFBADoAnAECQCADQTBqKAIAIgVFDQAgASAFENMDIAUgARBRIAEoAgBFDQAgBSgCAEEaRw0AIAEgBUEIaiIHEMMFIgtFDQAgBRDkASAFQThqIAtBOGopAwA3AwAgBUEwaiALQTBqKQMANwMAIAVBKGogC0EoaikDADcDACAFQSBqIAtBIGopAwA3AwAgBUEYaiALQRhqKQMANwMAIAVBEGogC0EQaikDADcDACAHIAtBCGopAwA3AwAgBSALKQMANwMAIAtBwABBCBC9EwsgASAGOgCcAQwBCyADQQRqKAIAIAEQ1wgLAkAgASgCAEUNACABIAMQ0AQLIAogAkE4aiICRw0ADAILCyAAIAEQ/QEgASgCAEUNACABIAAQywULIAFBADoAnAEgASAAKAI4IgAQ0wMgACABEFECQCABKAIARQ0AIAAoAgBBGkcNACABIABBCGoiAhDDBSIDRQ0AIAAQ5AEgAEE4aiADQThqKQMANwMAIABBMGogA0EwaikDADcDACAAQShqIANBKGopAwA3AwAgAEEgaiADQSBqKQMANwMAIABBGGogA0EYaikDADcDACAAQRBqIANBEGopAwA3AwAgAiADQQhqKQMANwMAIAAgAykDADcDACADQcAAQQgQvRMLIAEgCDoAnAEPCyABLQCcASEFIAFBADoAnAEgASAAKAIoIgMQ0wMgAyABEFECQCABKAIARQ0AIAMoAgBBGkcNACABIANBCGoiBBDDBSICRQ0AIAMQ5AEgA0E4aiACQThqKQMANwMAIANBMGogAkEwaikDADcDACADQShqIAJBKGopAwA3AwAgA0EgaiACQSBqKQMANwMAIANBGGogAkEYaikDADcDACADQRBqIAJBEGopAwA3AwAgBCACQQhqKQMANwMAIAMgAikDADcDACACQcAAQQgQvRMLAkAgACgCCEECSQ0AIAEgAEEMahCZDQsgASAFOgCcAQ8LIAAoAghBAUcNFSABIABBDGoQmQ0PCyABIAAoAgQiAxDTAyADIAEQUQJAIAEoAgBFDQAgAygCAEEaRw0AIAEgA0EIaiIFEMMFIgJFDQAgAxDkASADQThqIAJBOGopAwA3AwAgA0EwaiACQTBqKQMANwMAIANBKGogAkEoaikDADcDACADQSBqIAJBIGopAwA3AwAgA0EYaiACQRhqKQMANwMAIANBEGogAkEQaikDADcDACAFIAJBCGopAwA3AwAgAyACKQMANwMAIAJBwABBCBC9EwsgASAAKAIIIgMQ0wMgAyABEFECQCABKAIARQ0AIAMoAgBBGkcNACABIANBCGoiBRDDBSICRQ0AIAMQ5AEgA0E4aiACQThqKQMANwMAIANBMGogAkEwaikDADcDACADQShqIAJBKGopAwA3AwAgA0EgaiACQSBqKQMANwMAIANBGGogAkEYaikDADcDACADQRBqIAJBEGopAwA3AwAgBSACQQhqKQMANwMAIAMgAikDADcDACACQcAAQQgQvRMLIAEgACgCDCIAENMDIAAgARBRIAEoAgBFDRQgACgCAEEaRw0UIAEgAEEIaiIDEMMFIgFFDRQgABDkASAAQThqIAFBOGopAwA3AwAgAEEwaiABQTBqKQMANwMAIABBKGogAUEoaikDADcDACAAQSBqIAFBIGopAwA3AwAgAEEYaiABQRhqKQMANwMAIABBEGogAUEQaikDADcDACADIAFBCGopAwA3AwAgACABKQMANwMAIAFBwABBCBC9Ew8LAkAgAC0AGEEFRw0AIAEgACgCEBClDQsgACgCDCIDRQ0TIANBBHQhBSAAKAIIQQxqIQMDQCABIAMoAgAiABDTAyAAIAEQUQJAIAEoAgBFDQAgACgCAEEaRw0AIAEgAEEIaiIEEMMFIgJFDQAgABDkASAAQThqIAJBOGopAwA3AwAgAEEwaiACQTBqKQMANwMAIABBKGogAkEoaikDADcDACAAQSBqIAJBIGopAwA3AwAgAEEYaiACQRhqKQMANwMAIABBEGogAkEQaikDADcDACAEIAJBCGopAwA3AwAgACACKQMANwMAIAJBwABBCBC9EwsgA0EQaiEDIAVBcGoiBQ0ADBQLCyABIAAoAhAiAxDTAyADIAEQUSAAQQRqIQACQCABKAIARQ0AIAMoAgBBGkcNACABIANBCGoiBRDDBSICRQ0AIAMQ5AEgA0E4aiACQThqKQMANwMAIANBMGogAkEwaikDADcDACADQShqIAJBKGopAwA3AwAgA0EgaiACQSBqKQMANwMAIANBGGogAkEYaikDADcDACADQRBqIAJBEGopAwA3AwAgBSACQQhqKQMANwMAIAMgAikDADcDACACQcAAQQgQvRMLIAAoAgBBgICAgHhGDRIgASAAEKkLDwsgACgCDCICRQ0RIAAoAgghAyACQQJ0IQUDQCABIAMoAgAiABDTAyAAIAEQUQJAIAEoAgBFDQAgACgCAEEaRw0AIAEgAEEIaiIEEMMFIgJFDQAgABDkASAAQThqIAJBOGopAwA3AwAgAEEwaiACQTBqKQMANwMAIABBKGogAkEoaikDADcDACAAQSBqIAJBIGopAwA3AwAgAEEYaiACQRhqKQMANwMAIABBEGogAkEQaikDADcDACAEIAJBCGopAwA3AwAgACACKQMANwMAIAJBwABBCBC9EwsgA0EEaiEDIAVBfGoiBQ0ADBILCyAAKAIMIgJFDRAgACgCCCEDIAJBAnQhBQNAIAEgAygCACIAENMDIAAgARBRAkAgASgCAEUNACAAKAIAQRpHDQAgASAAQQhqIgQQwwUiAkUNACAAEOQBIABBOGogAkE4aikDADcDACAAQTBqIAJBMGopAwA3AwAgAEEoaiACQShqKQMANwMAIABBIGogAkEgaikDADcDACAAQRhqIAJBGGopAwA3AwAgAEEQaiACQRBqKQMANwMAIAQgAkEIaikDADcDACAAIAIpAwA3AwAgAkHAAEEIEL0TCyADQQRqIQMgBUF8aiIFDQAMEQsLIAEgACgCBCIDENMDIAMgARBRAkAgASgCAEUNACADKAIAQRpHDQAgASADQQhqIgUQwwUiAkUNACADEOQBIANBOGogAkE4aikDADcDACADQTBqIAJBMGopAwA3AwAgA0EoaiACQShqKQMANwMAIANBIGogAkEgaikDADcDACADQRhqIAJBGGopAwA3AwAgA0EQaiACQRBqKQMANwMAIAUgAkEIaikDADcDACADIAIpAwA3AwAgAkHAAEEIEL0TCyAAKAIIIgBBCGooAgAiAkUNDyAAQQRqKAIAIQMgAkECdCEFA0AgASADKAIAIgAQ0wMgACABEFECQCABKAIARQ0AIAAoAgBBGkcNACABIABBCGoiBBDDBSICRQ0AIAAQ5AEgAEE4aiACQThqKQMANwMAIABBMGogAkEwaikDADcDACAAQShqIAJBKGopAwA3AwAgAEEgaiACQSBqKQMANwMAIABBGGogAkEYaikDADcDACAAQRBqIAJBEGopAwA3AwAgBCACQQhqKQMANwMAIAAgAikDADcDACACQcAAQQgQvRMLIANBBGohAyAFQXxqIgUNAAwQCwsCQCAAKAIMIgJFDQAgACgCCCEDIAJBKGwhAgNAIAMgARCGBAJAIAEoAgBFDQAgASADEMMICyADQShqIQMgAkFYaiICDQALCwJAIAAoAhAiACgCAEGAgICAeEcNACAAQQRqIAEQmg0PCyABIAAQ5AQPCyAAKAIgIgpBDGohBgJAIApBCGooAgAiAEUNACAKQQRqKAIAIQMgAEEMbCEFA0AgASADKAIAIgAQ0wMgACABEFECQCABKAIARQ0AIAAoAgBBGkcNACABIABBCGoiBBDDBSICRQ0AIAAQ5AEgAEE4aiACQThqKQMANwMAIABBMGogAkEwaikDADcDACAAQShqIAJBKGopAwA3AwAgAEEgaiACQSBqKQMANwMAIABBGGogAkEYaikDADcDACAAQRBqIAJBEGopAwA3AwAgBCACQQhqKQMANwMAIAAgAikDADcDACACQcAAQQgQvRMLIANBDGohAyAFQXRqIgUNAAsLIAEgBhBEIAooAjAiAEUNDSABIAAQ0wMgACABEFEgASgCAEUNDSAAKAIAQRpHDQ0gASAAQQhqIgMQwwUiAUUNDSAAEOQBIABBOGogAUE4aikDADcDACAAQTBqIAFBMGopAwA3AwAgAEEoaiABQShqKQMANwMAIABBIGogAUEgaikDADcDACAAQRhqIAFBGGopAwA3AwAgAEEQaiABQRBqKQMANwMAIAMgAUEIaikDADcDACAAIAEpAwA3AwAgAUHAAEEIEL0TDwsgACgCDCIARQ0MIAEgABClDQ8LIAEgACgCBCIAENMDIAAgARBRIAEoAgBFDQsgACgCAEEaRw0LIAEgAEEIaiIDEMMFIgFFDQsgABDkASAAQThqIAFBOGopAwA3AwAgAEEwaiABQTBqKQMANwMAIABBKGogAUEoaikDADcDACAAQSBqIAFBIGopAwA3AwAgAEEYaiABQRhqKQMANwMAIABBEGogAUEQaikDADcDACADIAFBCGopAwA3AwAgACABKQMANwMAIAFBwABBCBC9Ew8LIAEgACgCBCIAENMDIAAgARBRIAEoAgBFDQogACgCAEEaRw0KIAEgAEEIaiIDEMMFIgFFDQogABDkASAAQThqIAFBOGopAwA3AwAgAEEwaiABQTBqKQMANwMAIABBKGogAUEoaikDADcDACAAQSBqIAFBIGopAwA3AwAgAEEYaiABQRhqKQMANwMAIABBEGogAUEQaikDADcDACADIAFBCGopAwA3AwAgACABKQMANwMAIAFBwABBCBC9Ew8LIABBIGohAwJAIAAtADRBAkcNACADIAEQqBwLIAEoAgBFDQkgASADEN8FDwsgACgCBCABEL0BDwsgACgCDCIDRQ0HIANBKGwhAyAAKAIIQQRqIQADQAJAAkACQAJAAkAgAEF8aigCAA4FBAABAgMECyAAKAIAQQFHDQMgASAAQQRqKAIAIgIQ0wMgAiABEFEgASgCAEUNAyACKAIAQRpHDQMgASACQQhqIgQQwwUiBUUNAyACEOQBIAJBOGogBUE4aikDADcDACACQTBqIAVBMGopAwA3AwAgAkEoaiAFQShqKQMANwMAIAJBIGogBUEgaikDADcDACACQRhqIAVBGGopAwA3AwAgAkEQaiAFQRBqKQMANwMAIAQgBUEIaikDADcDACACIAUpAwA3AwAgBUHAAEEIEL0TDAMLIAEgACgCACICENMDIAIgARBRIAEoAgBFDQIgAigCAEEaRw0CIAEgAkEIaiIEEMMFIgVFDQIgAhDkASACQThqIAVBOGopAwA3AwAgAkEwaiAFQTBqKQMANwMAIAJBKGogBUEoaikDADcDACACQSBqIAVBIGopAwA3AwAgAkEYaiAFQRhqKQMANwMAIAJBEGogBUEQaikDADcDACAEIAVBCGopAwA3AwAgAiAFKQMANwMAIAVBwABBCBC9EwwCCyAAIAEQ0QQMAQsgACABEPwCCyAAQShqIQAgA0FYaiIDDQAMCAsLIAEgACgCBCIAENMDIAAgARBRIAEoAgBFDQYgACgCAEEaRw0GIAEgAEEIaiIDEMMFIgFFDQYgABDkASAAQThqIAFBOGopAwA3AwAgAEEwaiABQTBqKQMANwMAIABBKGogAUEoaikDADcDACAAQSBqIAFBIGopAwA3AwAgAEEYaiABQRhqKQMANwMAIABBEGogAUEQaikDADcDACADIAFBCGopAwA3AwAgACABKQMANwMAIAFBwABBCBC9Ew8LIAEgACgCBCIAENMDIAAgARBRIAEoAgBFDQUgACgCAEEaRw0FIAEgAEEIaiIDEMMFIgFFDQUgABDkASAAQThqIAFBOGopAwA3AwAgAEEwaiABQTBqKQMANwMAIABBKGogAUEoaikDADcDACAAQSBqIAFBIGopAwA3AwAgAEEYaiABQRhqKQMANwMAIABBEGogAUEQaikDADcDACADIAFBCGopAwA3AwAgACABKQMANwMAIAFBwABBCBC9Ew8LIAEgACgCBCIAENMDIAAgARBRIAEoAgBFDQQgACgCAEEaRw0EIAEgAEEIaiIDEMMFIgFFDQQgABDkASAAQThqIAFBOGopAwA3AwAgAEEwaiABQTBqKQMANwMAIABBKGogAUEoaikDADcDACAAQSBqIAFBIGopAwA3AwAgAEEYaiABQRhqKQMANwMAIABBEGogAUEQaikDADcDACADIAFBCGopAwA3AwAgACABKQMANwMAIAFBwABBCBC9Ew8LIAEgACgCBCIAENMDIAAgARBRIAEoAgBFDQMgACgCAEEaRw0DIAEgAEEIaiIDEMMFIgFFDQMgABDkASAAQThqIAFBOGopAwA3AwAgAEEwaiABQTBqKQMANwMAIABBKGogAUEoaikDADcDACAAQSBqIAFBIGopAwA3AwAgAEEYaiABQRhqKQMANwMAIABBEGogAUEQaikDADcDACADIAFBCGopAwA3AwAgACABKQMANwMAIAFBwABBCBC9Ew8LIAEgACgCBCIAENMDIAAgARBRIAEoAgBFDQIgACgCAEEaRw0CIAEgAEEIaiIDEMMFIgFFDQIgABDkASAAQThqIAFBOGopAwA3AwAgAEEwaiABQTBqKQMANwMAIABBKGogAUEoaikDADcDACAAQSBqIAFBIGopAwA3AwAgAEEYaiABQRhqKQMANwMAIABBEGogAUEQaikDADcDACADIAFBCGopAwA3AwAgACABKQMANwMAIAFBwABBCBC9Ew8LIAEgACgCBCIAENMDIAAgARBRIAEoAgBFDQEgACgCAEEaRw0BIAEgAEEIaiIDEMMFIgFFDQEgABDkASAAQThqIAFBOGopAwA3AwAgAEEwaiABQTBqKQMANwMAIABBKGogAUEoaikDADcDACAAQSBqIAFBIGopAwA3AwAgAEEYaiABQRhqKQMANwMAIABBEGogAUEQaikDADcDACADIAFBCGopAwA3AwAgACABKQMANwMAIAFBwABBCBC9Ew8LAkAgACgCBCIAKAIAQQNHDQAgAEEEaiABEMAHDwsgACABEN4HCwvDUAIVfwd+IwBBkAprIgQkAAJAAkACQAJAAkACQCADQQBIDQACQCABLQALQQFxRQ0AIAEtAA1BAkcNBAsgASgCIA0BIAFC/////w83AiAgASgCPCEFIAFBADYCPAJAIAVF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NgKoAiACIAQpAgA3A+gCIAtBGGohCyAHQYGAgIB4Rw0ACyACKAKkAiEKIAIoAqACIQkLIAVBsJeAARCRHSAIQQJJDQECQCAIQRVJDQAgCiAIEKwLDAILIAhBGGwhBEEYIQEDQCAEIAFGDQIgCiAKIAFqEJILIAFBGGohAQwACwsgCSACKALwAkGAnZsBENggAAsgBkEIaiENIAJBwABqIAhBBEEgQcyPgAEQ3RUgAkEANgKIASACIAIpA0A3AoABIAogCEEYbCIOaiEPIAAoArQBIRBBACEEIAohAQNAAkACQCAOIARGDQBBgICAgHghBwJAIAEoAgBBgICAgHhGDQAgAkHoAmogCiAEaiIHQQRqKAIAIAdBCGooAgAQrBQgAigC6AIhBwsgB0GBgICAeEYNACACKQLsAiI5QiCIpyERIAEtABQhEiA5pyETIAJBkANqIA1BASABKAIMIgYgASgCECIUIBAgEBCIASACKAKQA0UNASACIAIpApQDNwPQAiACQYwBakEMaiAAQYABai8BADsBACACQcCQgAE2AowBIAIgACkCeDcCkAEgAkGcAWpBDGogAEGoAWoiAS8BADsBACACQQYgESAHQYCAgIB4RiIEGzYC4AIgAkHIkIABIBMgBBs2AtwCIAIgACkCoAE3AqABIAIgAkHcAmo2ApwBIAJBrAFqQQxqIAEvAQA7AQAgAiAGNgLIASACIAApAqABNwKwASACIAJByAFqNgKsASACQYACakEMaiABLwEAOwEAIAIgFDYCxAIgAiAAKQKgATcChAIgAiACQcQCajYCgAIgAkGgAmpBDGogAEGKAWovAQA7AQAgAiAAKQGCATcCpAIgAiACQdACajYCoAIgAkEWNgKMAyACQRc2AoQDIAJBFzYC/AIgAkEYNgL0AiACQRg2AuwCIAIgAkGgAmo2AogDIAIgAkGAAmo2AoADIAIgAkGsAWo2AvgCIAIgAkGcAWo2AvACIAIgAkGMAWo2AugCIAJBADYC6AEgAkEGNgLcASACQeyQgAE2AtgBIAJBBTYC5AEgAiACQegCajYC4AEgAkH0AGogAkHYAWoQ2yAhCyACLQDQAiACKALUAhDxFiAHIBMQxSAgAigChAEhBwJAIAIoAogBIgRFDQAgByEBA0AgASgCACABQQRqKAIAENwgIAFBGGooAgAgAUEcaigCABCSHSABQSBqIQEgBEF/aiIEDQALCyACKAKAASAHQQRBIBDAEiAKIAgQ6hwgCSAKEMgiIAtFDQMMBQsgAigCiAEhBCACKAKEASEBIAIgAigCgAE2ArQBIAIgATYCsAEgAiABNgKsASACIAEgBEEFdGo2ArgBIABBEGohFSAAQcAAaiEWIABBxABqIRcgAEEYaiEYIABBFGohGSAAQSRqIRogAEE4aiEbIABBBGohHCAAKAJwIh0gACgCdEEKbGohHiACQaACakEEaiEfIAJB6AJqQQRqISAgAkHoAmpBIGohISACQegCakEcaiEiIAJB6AJqQRRqISMgACgCuAEhJCACQdgBakEEaiIlQQhqISYCQANAIAIoArABIgEgAigCuAFGDQEgAiABQSBqNgKwASABKAIAIidBgYCAgHhGDQEgASgCHCEoIAEoAhghKSABKAIEISogAkHoAmogDUEBIAEoAgwgASgCECAQIBAQiAECQCACKALoAkEBRw0AIAIoAuwCIAIoAvACEPEWDAYLIAJBMGogAigC7AIiKyACKALwAiIsKAIMEQcAIAJBnAFqIAIoAjAgAigCNBDuBSArICwoAhwRBAAhBCArICwoAhARBAAoAgAhFCACQShqIAIoAqQBIgFBAUEBQbComwEQ3RVBACEGIAJBADYCiAIgAiACKQMoNwKAAiACQSBqQQFBBEEUQaCVgAEQ3RUgAkEANgKoAiACIAIoAiQiEzYCpAIgAiACKAIgNgKgAiACIAEgAigCoAEiB2o2AuABIAIgBzYC3AFBgYDEACEBIBQhCwNAIAJBgYDEADYC2AECQCABQYGAxABHDQAgJRDqDCEBCwJAAkACQCABQYCAxABGDQACQAJAIAFBgAFPDQBBASEHDAELAkAgAUGAEE8NAEECIQcMAQtBA0EEIAFBgIAESRshBwsgByALaiELQQAhBQJAAkAgAUF2ag4EBAEBAAELIAIoAtgBIQcgAkGBgMQANgLYAQJAAkACQCAHQYGAxABHDQACQCACKALcASIMIAIoAuABRw0AQYCAxAAhDAwDCyACIAxBAWo2AtwBIAwtAAAiB8BBf0oNASACIAxBAmo2AtwBIAwtAAFBP3EhESAHQR9xIRICQCAHQd8BSw0AIBJBBnQgEXIhBwwCCyACIAxBA2o2AtwBIBFBBnQgDC0AAkE/cXIhEQJAIAdB8AFPDQAgESASQQx0ciEHDAILIAIgDEEEajYC3AEgEUEGdCAMLQADQT9xciASQRJ0QYCA8ABxciEHC0GAgMQAIQwgB0GAgMQARg0BCyAHIQwgB0EKRg0DCyACIAw2AtgBCyACQYACaiABEKoUIARBf0YNAgJAIAIoAtgBIgFBgYDEAEcNACACICUQ6gwiATYC2AELIARBAWoiBCEFIAFBgIDEAEcNAwwCCyACKQKkAiE5IAIoAqACIQEgAigCgAIgAigChAIQvSIgAigCnAEgAigCoAEQxSAgKyAsEJAdIAFBgICAgHhGDQggAiABNgK8ASACIDk3AsABIAJBADYC+AEgAkIANwLwASACIB42AuwBIAIgHTYC6AEgAiAeNgLkASACIB02AuABIAIgDzYC3AEgAiAKNgLYASACQYACaiACQdgBahDABCA5QiCIpyEFIDmnIRICQAJAIAIoAoACQYGAgIB4Rg0AIAJB6AJqIAJB2AFqEPgbQQEhBEEgIQcgAkEYaiACKALoAkEBaiIBQX8gARsiAUEEIAFBBEsbQQRBIEGAnZsBEN0VIAJBgAJqQQhqKQIAITkgAkGAAmpBEGopAgAhOiACQYACakEYaikCACE7IAIoAhghASACKAIcIgsgAikCgAI3AgAgC0EYaiA7NwIAIAtBEGogOjcCACALQQhqIDk3AgAgAkEBNgKUASACIAs2ApABIAIgATYCjAECQEEkRQ0AIAJB6AJqIAJB2AFqQST8CgAACwJAA0AgAkGgAmogAkHoAmoQwAQgAigCoAJBgYCAgHhGDQECQCAEIAIoAowBRw0AIAJBnAFqIAJB6AJqEPgbIAJBjAFqIAQgAigCnAFBAWoiAUF/IAEbQQRBIBDNGSACKAKQASELCyALIAdqIgEgAikCoAI3AgAgAUEYaiACQaACakEYaikCADcCACABQRBqIAJBoAJqQRBqKQIANwIAIAFBCGogAkGgAmpBCGopAgA3AgAgAiAEQQFqIgQ2ApQBIAdBIGohBwwACwsgAkHIAWpBCGogAkGMAWpBCGooAgAiLDYCACACIAIpAowBNwPIASACKALMASERDAELQQAhLCACQQA2AtABIAJCgICAgMAANwPIAUEEIRELIBEgLEEFdGohFCASIAVBFGxqIS1BACErIBIhBANAAkACQCAEIC1GDQBBACETIBEhBwNAIAciASAURg0CIAFBEGooAgAhCyAEQRBqKAIAIQUCQCABQQxqKAIAIgwgBEEMaigCACIGSQ0AIAFBIGohByALIAxqIAUgBmpNDQELIAFBIGohByATIAYgBSAMIAsQ+hRqIRMMAAsLA0ACQAJAAkACQAJAAkACQAJAIBIgLUYNACArRQ0FQQAhDiACQQA2AqQBIAJCgICAgBA3ApwBIBJBEGoiDCgCACASQQxqIgYoAgAiLmohLyARICxBBXRqIQUgESEEA0ACQCAEIgEgBUcNAEEDIQEMBgsgAUEgaiEEIAYoAgAiCyAMKAIAIhMgAUEMaigCACIHIAFBEGooAgAiFBD6FEUNAAJAAkACQCAHIAtPDQACQCAUIAdqIhQgC0kNACAUIBMgC2pNDQMLIA5BAWohDgJAIAcgLk8NACAUIC9LDQILIAJBnAFqQSAQqhQMAwsgAiAYNgLoAiAgIAEpABQ3AAAgIEEIaiIEIAFBHGoiBy8AADsAACACQdgBaiACQegCahDDESACQZwBaiACKALcASILIAIoAuABEPMhIAIoAtgBIAsQvSIgAkHYAWogACgCABCpFCACQaACaiACKALcASILIAIoAuABQQAgKyAOayIFIAUgK0sbEJ8JIAIgAkGgAmo2AugCICAgASkAFDcAACAEIAcvAAA7AAAgAkGAAmogAkHoAmoQwhEgAkGcAWogAigChAIiBSACKAKIAhDzISACKAKAAiAFEL0iIAIoAqACIAIoAqQCEL0iIAIoAtgBIAsQvSIgAiAZNgLoAiAgIAEpABQ3AAAgBCAHLwAAOwAAIAJB2AFqIAJB6AJqEMMRIAJBnAFqIAIoAtwBIgEgAigC4AEQ8yEgAigC2AEgARC9IgwGCyACIBw2AugCICAgASkAFDcAACAgQQhqIAFBHGovAAA7AAAgAkHYAWogAkHoAmoQwxEgAkGcAWogAigC3AEiASACKALgARDzISACKALYASABEL0iDAELCyACQegCaiABEIgGIAIoAugCIgQgAigC7AIQxSAgAUEUaiEBIARBgICAgHhGDQEgAiAbNgLoAiAgIAEpAAA3AAAgIEEIaiABQQhqLwAAOwAAIAJB2AFqIAJB6AJqEMMRIAJBnAFqIAIoAtwBIgQgAigC4AEQ8yEgAigC2AEgBBC9IgwCCyACQcgBahCTFyACQbwBahCrFyAnICoQxSAgKSAoEJAdDA0LIAIgGjYC6AIgICABKQAANwAAICBBCGogAUEIai8AADsAACACQdgBaiACQegCahDDESACQZwBaiACKALcASIEIAIoAuABEPMhIAIoAtgBIAQQvSILIAJB2AFqIAAoAgAQqRQgAkGgAmogAigC3AEiBCACKALgAUEAICsgDmsiByAHICtLGxCfCSACIAJBoAJqNgLoAiAgIAEpAAA3AAAgIEEIaiIHIAFBCGoiCy8AADsAACACQYACaiACQegCahDCESACQZwBaiACKAKEAiIFIAIoAogCEPMhIAIoAoACIAUQvSIgAigCoAIgAigCpAIQvSIgAigC2AEgBBC9IiACIBk2AugCICAgASkAADcAACAHIAsvAAA7AAAgAkHYAWogAkHoAmoQwxEgAkGcAWogAigC3AEiASACKALgARDzISACKALYASABEL0iC0EBIQELIAIoAqABIQQCQAJAIAIoAqQBIgdBEEkNACAEIAcQ/QUhBAwBCyAEIAcQwxshBAsgAkGgAmpBqJubAUEBQQAgKyAEayIEIAQgK0sbIAFqEJ8JIAJBEzYC5AEgAkETNgLcASACQQI2AuwCIAJBlPWaATYC6AIgAkICNwL0AiACIAJBoAJqNgLgASACIAJBnAFqNgLYASACIAJB2AFqNgLwAiACQfQAaiACQegCahDbICEBIAIoAqACIAIoAqQCEL0iIAIoApwBIAIoAqABEL0iIAENAQsgEkEUaiEwIBIoAgghBCASKAIEIQEgAkEAOgCMAyACQQA2AogDIAIgJDYChAMgAiABIARqIgQ2AoADIAIgATYC/AIgAkEANgL4AiACQgA3AvACIAIgBDYC7AIgAiABNgLoAgJAA0AgAkHoAmoQ6gwiBEGAgMQARg0BICMQ6gwiAUGAgMQARg0BICIgARCbByEBAkAgBEEJRg0AIAJB9ABqIAQQqhQMAQsDQCABRQ0BIAJB9ABqQSAQqhQgAUF/aiEBDAALCwsgAkH0AGpBChCqFCACQQA2AuABIAJCgICAgMAANwLYASACQQA2AvACIAJCgICAgMAANwLoAgJAAkACQAJAICwNAEEEITFBACEyQQAhM0EEITRBACE1QQAhLAwBC0EEIQYDQAJAIBJBDGoiEygCACIEIBJBEGoiDigCACIFIBFBDGooAgAiByARQRBqKAIAIgwQ3hJFDQBBACELIAJB6AJqIQECQCAHIARJDQAgDCAHaiAFIARqSw0AQQEhCyACQdgBaiEBCwJAIAEoAggiBCABKAIARw0AIAFByImAAUG4iYABIAsbEOoXIAIoAtwBIQYLIAYgAigC7AIgCxsgBEECdGogETYCACABIARBAWo2AggLIBFBIGohESAsQX9qIiwNAAsgAigC0AEhLCACKALMASERIAIoAvACITUgAigC7AIhNCACKALoAiEzIAIoAtwBITEgAigC2AEhMiACKALgASIuRQ0AIAAgAkH0AGogKyATKAIAIA4oAgAgESAsQQAQ2wQNAkEAIQQgAkEANgLMAiACQoCAgIAQNwLEAiACQRBqIC5BBEEIQYCdmwEQ3RUgAkEANgLYAiACIAIoAhQiBzYC1AIgAiACKAIQIgs2AtACIC5BAnQhBUEAIQECQCAuIAtNDQAgAkHQAmpBACAuQQRBCBDNGSACKALUAiEHIAIoAtgCIQELIDEgBWohNiABIC5qITcgByABQQN0aiEFIDEhDANAIAwoAgAiASgCECELIAQgACgCuAEgEiABKAIMIgZBARDGCSIHIAQgB0sbIQcCQAJAIAEoAhANACAHQQFqIQsMAQsgB0EBaiIUIAAoArgBIBIgCyAGakEAEMYJIgsgFCALSxshCwsgAkGMAWogFygCABCpFCACQZADaiACKAKQASIvIAIoApQBIAsgB2pBAXYiBiAHaxCfCSAVIRQCQCABKAIQRQ0AIAJB2AFqIAEQiAYgAigC2AEiFCACKALcARDFICAXIBYgFEGAgICAeEYbIRQLIAIgFCgCADYCnAMgAkGAAmogFygCABCpFCACQZwBaiACKAKEAiIUIAIoAogCIAsgBkF/c2oQnwkgIUEAIAcgBGsiOCA4IAdLG0HIk4ABEKQVIAJBEzYChAMgAkEHNgL8AiACQRM2AvQCIAJBCTYC7AIgAkGU85sBNgLoAiACQQQ2AuwBIAJB2JOAATYC6AEgAkEENgLcASACQaiTgAE2AtgBIAJBBTYC5AEgAiACQZwBajYCgAMgAiACQZwDajYC+AIgAiACQZADajYC8AIgAiACQegCajYC4AEgAkHcAmogAkHYAWoQ8hYgAigCnAEgAigCoAEQvSIgAigCgAIgFBC9IiACKAKQAyAC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3AEhEQJAIB8gBkEFdGoiBigCACISQYGAgIB4Rg0AIAYoAhghKyAGKAIcIRcgEiAGKAIEEMUgICsgFxCQHQsgAiAUNgKEAyACIBE2AoADIAJBADoA/AIgAiAsNgL4AiACIAw2AvQCIAIgLTYC8AIgAiAuNgLsAiACIC82AugCIAJBgAFqIAJB6AJqQeyPgAEQjRIgBSALEJAdIAcgExDFIAwDC0Hcj4ABEMkiAAsgAiALNgKEAyACIAU2AoADIAIgEjoA/AIgAiAUNgL4AiACIAY2AvQCIAIgETYC8AIgAiATNgLsAiACIAc2AugCIAJBgAFqIAJB6AJqQYyQgAEQjRIMAQsgAiALNgKEAyACIAU2AoADIAIgEjoA/AIgAiAUNgL4AiACIAY2AvQCIAIgETYC8AIgAiATNgLsAiACIAc2AugCIAJBgAFqIAJB6AJqQfyPgAEQjRILIAFBGGohASAEQRhqIQQMAAsLIAIpAnghOSACKAJ0IQUMAgsgJyAqEMUgICkgKBCQHSACQawBahDfEiAKIAgQ6hwgCSAKEMgiCyACKAJ0IAIoAngQvSJBgICAgHghBQsgAEHAAWohBAsgAygCOCELIAJBCGogAygCPCIBQQRBKEGAnZsBEN0VIAJBADYC4AEgAiACKAIMNgLcASACIAIoAggiBzYC2AECQAJAIAEgB00NACACQdgBakEAIAFBBEEoEM0ZDAELIAENACACQcgAakEIaiACQdgBakEIaigCADYCACACIAIpAtgBNwNIAkACQCADKAIAQQJHDQBBACEBDAELIAMoAgwhByADKAIIIQELAkACQAJAIANBJGooAgBFDQAgAkHoAmogBCgCAEEIaiADQSBqKAIAKAIAEKwDAkACQCACKALoAkUNACACQaACakEIaiACQegCakEIaikCADcDACACIAIpAugCNwOgAgwBCyACQQA2AqACCyADQSRqKAIARQ0BIAJB6AJqIAQoAgBBCGogA0EgaigCACgCBBCsAwJAIAIoAugCRQ0AIAJB2AFqQQhqIAJB6AJqQQhqKQIANwMAIAIgAikC6AI3A9gBDAMLIAJBADYC2AEMAgsgAkEANgKgAgsgAkEANgLYAQsCQAJAAkACQCACKAKgAiILDQBBgICAgHghDAwBCyACQQA2AogCIAJCgICAgBA3AoACIAJB6IiAATYC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IAIoAhAREwACQCADKAIIRQ0AIAMoAgwiAiAETQ0GDAcLIABBADYCAAwZCyAAIAI2AgwgACAJNgIIIABBATYCACAAIAkgAWs2AgQMGAsgCSAVQcjygwEQ0SIAC0EAQQBB7OGDARDDEgALIAIgB0G84YMBEMMSAAsgAiAJQbjygwEQwxIACyAEQQFqIQILIAIhBCACIAVJDQALCyAAQQA2AgAMEAsgA0EANgIYIANBATYCDCADQcTmgwE2AgggA0IENwIQIANBCGpBzOaDARCoHQALIAIgCUG48oMBEMMSAAsgAiAHQbzhgwEQwxIAC0EAQQBB7OGDARDDEgALIAkgAkHI8oMBENEiAAsgACADKQIMNwIEIABBDGogA0EIakEMaigCADYCAAsgACACNgIADAkLIAkgASgCuAJLDQAgASgCCCILIAlJDQUgCyAJRg0EIAsgCWshDAJAAkAgASgCBCAJQQJ0aiINLQAAIgtB/wFGDQAgCyALQQJ2aiALQQNxQQBHakECaiELDAELIAEoAihBAmohCwsgCyAMTw0DAkACQCANIAtBAnRqKAIAIhVBf0wNAAJAIAtBAWoiCyAMTw0AIA0gC0ECdGooAgAhEAwCCyALIAxBzOGDARDDEgALIBVB/////wdxIRALIBAgASgCFCILTw0CIAQgASgCECAQQQJ0aigCACILSQ0BIAQgC2shEUEBIQgLIANBCGogByABKAIgIgsoAghBf2pBeHFqQQhqIAIoAggiDyACKAIMIg4gBCAFIAsoAhAREwACQAJAAkACQCADKAIIIgIOAwIBAAILIAFBLGohCiADKAIMIQIMAgsgACADKQIMNwIEIABBDGogA0EIakEMaigCADYCAAsgACACNgIADAgLAkACQAJAAkADQAJAAkACQAJAIAIiEiAFTw0AAkACQAJAAkAgEiAOTw0AAkAgCSABKAIIIhVJDQAgCSENDBMLIAogDyASai0AAGotAAAiAkECaiEGIAEoAgQhFiAJIQ0CQAJAAkACQANAAkACQAJAAkAgFiANQQJ0aigCACIJQf8BcUGCfmoOAgIAAQsgBiANaiIJIBVPDQQgFiAJQQJ0aigCACIJQQFGDQIMCwsgFSANQQJqIhNJDQQgCUECdkE/cSAJQQNxQQBHaiIUIBUgE2siCUsNBSAUQQJ0IQcgFiATQQJ0aiELQX8hDAJAAkACQANAIAdFDQUgDEEBaiEMIAIgCygCACIJQf8BcUYNASACIAlBCHZB/wFxRg0CIAIgCUEQdkH/AXFGDQMgC0EEaiELIAdBfGohByACIAlBGHZHDQALIBQgE2ogDEECdGpBA2oiAiAVSQ0MIAIgFUHI8YMBEMMSAAsgDEECdCAUIBNqaiICIBVJDQsgAiAVQfjxgwEQwxIACyAUIBNqIAxBAnRqQQFqIgIgFUkNCiACIBVB6PGDARDDEgALIBQgE2ogDEECdGpBAmoiAiAVSQ0JIAIgFUHY8YMBEMMSAAsgAiAJQQh2Qf8BcUYNBwsgDUEBaiIJIBVPDQQgFiAJQQJ0aigCACINIBVPDRcMAAsLIAkgFUGY8oMBEMMSAAsgEyAVQajxgwEQ0SIACyAUIAlBuPGDARC8IgALIAkgFUGo8oMBEMMSAAsgEiAOQYydgAEQwxIACyANQQJqIgIgFUkNACACIBVBiPKDARDDEgALIBYgAkECdGooAgAhCQsgCSABKAK0AksNAyAJRQ0AAkAgCSABKAK4AksNACAVIAlJDQYgFSAJRg0HIBUgCWshBwJAAkAgFiAJQQJ0aiILLQAAIgJB/wFGDQAgAiACQQJ2aiACQQNxQQBHakECaiECDAELIAEoAihBAmohAgsgAiAHTw0IAkACQCALIAJBAnRqKAIAIgxBf0wNAAJAIAJBAWoiAiAHTw0AIAsgAkECdGooAgAhEAwCCyACIAdBzOGDARDDEgALIAxB/////wdxIRALIBAgASgCFCICTw0JIBJBAWoiBCABKAIQIBBBAnRqKAIAIgJPDQMgA0EANgIYIANBATYCDCADQcTmgwE2AgggA0IENwIQIANBCGpBzOaDARCoHQALIANBCGogASgCHCABKAIgIgIoAghBf2pBeHFqQQhqIA8gDiASIAUgAigCEBETACADKAIIRQ0BIAMoAgwiAiASTQ0DDAQLIAAgEDYCDCAAIAQ2AgggACARNgIEIAAgCDYCAAwPCyAAQQA2AgAMDgsgBCACayERQQEhCCAEIQIMAQsgEkEBaiECDAALCyAJIBVByPKDARDRIgALQQBBAEHs4YMBEMMSAAsgAiAHQbzhgwEQwxIACyAQIAJBuPKDARDDEgALIANBADYCGCADQQE2AgwgA0HE5oMBNgIIIANCBDcCECADQQhqQczmgwEQqB0ACyAQIAtBuPKDARDDEgALIAsgDEG84YMBEMMSAAtBAEEAQezhgwEQwxIACyAJIAtByPKDARDRIgALIA0gFUGY8YMBEMMSAAsgACAONgIMIAAgEDYCCCAAIA82AgQgACAKNgIACyADQSBqJAALtT8DD38DfgJ8IwBBsANrIgMkAAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAIoAgBBcGoOFAAIAQgCCAgICAgEBwYICAgICAgFCAsgA0HEAGpBAmogAkETai0AADoAACADIAIvABE7AUQgAigCDCEEIAIoAgghBSACKAIEIQYCQAJAAkAgAi0AECIHQQNLDQAgB0ECRw0BC0EALQDg9p0BGkHAABCEASIIRQ0UIAggBzoAECAIIAQ2AgwgCCAFNgIIIAggBjYCBCAIQRA2AgAgCCADLwFEOwARIAAgCDYCBCAAQQI2AgAgCEETaiADQcQAakECai0AADoAAAwBCyADQfAAaiABIAYQWAJAIAMoAnBBAUcNACADKwN4IRUCQAJAAkACQCAHDgQBAwACAAtBkqmbAUEoQYT1mgEQjBoACyAVmiEVDAELIBUQiBchFQsgAEEBNgIAIAAgFTkDCCADQfAAahCaFQwBCyADQegCaiADQfAAahDJBEEALQDg9p0BGkHAABCEASIIRQ0TIAggAykD6AI3AwAgCEE4aiADQegCakE4aikDADcDACAIQTBqIANB6AJqQTBqKQMANwMAIAhBKGogA0HoAmpBKGopAwA3AwAgCEEgaiADQegCakEgaikDADcDACAIQRhqIANB6AJqQRhqKQMANwMAIAhBEGogA0HoAmpBEGopAwA3AwAgCEEIaiADQegCakEIaikDADcDAEEALQDg9p0BGkHAABCEASIBRQ0TIAEgBzoAECABIAQ2AgwgASAFNgIIIAEgCDYCBCABQRA2AgAgACABNgIEIABBAjYCAAsgAigCAEFwaiIIQRNLDRdBASAIdEGVqCBxDRkgCEELRg0WDBcLIAIoAhAhCSACKAIMIQogAi0AFCEGIAIoAgghBCACKAIEIQUQ4h8hCCADQegCaiAFEEUgCEE4aiADQegCakE4aiILKQMANwMAIAhBMGogA0HoAmpBMGoiDCkDADcDACAIQShqIANB6AJqQShqIg0pAwA3AwAgCEEgaiADQegCakEgaiIOKQMANwMAIAhBGGogA0HoAmpBGGoiDykDADcDACAIQRBqIANB6AJqQRBqIhApAwA3AwAgCEEIaiADQegCakEIaiIRKQMANwMAIAggAykD6AI3AwAQ4h8hByADQegCaiAEEEUgB0E4aiALKQMANwMAIAdBMGogDCkDADcDACAHQShqIA0pAwA3AwAgB0EgaiAOKQMANwMAIAdBGGogDykDADcDACAHQRBqIBApAwA3AwAgB0EIaiARKQMANwMAIAcgAykD6AI3AwACQCAGQXhqQQtJDQAgBkEXRg0AQQAtAOD2nQEaQcAAEIQBIgFFDRIgASAGOgAUIAEgCTYCECABIAo2AgwgASAHNgIIIAEgCDYCBCABQRI2AgAgACABNgIEIABBAjYCACAFIAQQoh8MFQsgA0GAAWogASAFEFggA0GAAWpBEGoiCyABIAQQWCADIAY6AKABIAMoApABIQVBASEMAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAMoAoABIgQOAgABKAsgBQ4CAQImCyAFDgICAyULIAZBC0YNEkEAIQUMJAsCQCAGQQtGDQBBASEFDCQLIAMgAykDiAE3A4ACIANB2AJqIAMrA5gBENINIANBAjYC7AIgA0GU9ZoBNgLoAiADQgI3AvQCIANB7AStQiCGIANB2AJqrYQ3A7gCIANB5wStQiCGIANBgAJqrYQ3A7ACIAMgA0GwAmo2AvACIANB6AFqIANB6AJqENENQQAhASADQegBahCYHyESIABBADYCACAAIBI3AwggAygC2AIgAygC3AIQvSIgAykDgAIQ8BsMEwsgBkELRg0BQQAhBQwiCyADKwOYASEVIAMrA4gBIRYgBkF4ag4QAgMEBQYHCAkKCwwBAQEBDQELIAMrA4gBIRUgAyADKQOYATcDgAIgA0HYAmogFRDSDSADQQI2AuwCIANBlPWaATYC6AIgA0ICNwL0AiADQecErUIghiADQYACaq2ENwO4AiADQewErUIghiADQdgCaq2ENwOwAiADIANBsAJqNgLwAiADQegBaiADQegCahDRDSADQegBahCYHyESIABBADYCACAAIBI3AwggAygC2AIgAygC3AIQvSIgAykDgAIQ8BsMDwtBkqmbAUEoQaT1mgEQjBoACyAWIBUQoA8hFQwLCyAWIBUQoQ8hFQwKCyAWIBUQog8hFQwJCyAWIBWgIRUMCAsgFiAVoSEVDAcLIBYgFaIhFQwGCyAWIBWjIRUMBQsgFiAVEIsHIRUMBAsgFiAVEOwPIRUMAwsgFiAVEO0PIRUMAgsgFiAVEO4PIRUMAQsgFiAVEKccIRULIABBATYCACAAIBU5AwhBACEBDAILIAMgAykDiAE3A4ACIAMgAykDmAE3A9gCIANBAjYC7AIgA0GU9ZoBNgLoAiADQgI3AvQCIANB5wStQiCGIhIgA0HYAmqthDcDuAIgAyASIANBgAJqrYQ3A7ACIAMgA0GwAmo2AvACIANB6AFqIANB6AJqENENIANB6AFqEJgfIRIgAEEANgIAIAAgEjcDCCADKQPYAhDwGyADKQOAAhDwGwtBASEBCyAIEOQBIAhBwABBCBC9EyAHEOQBIAdBwABBCBC9EyAEDQEMDgsgA0HIAGpBIGogAkEoaikDADcDACADQcgAakEYaiACQSBqKQMANwMAIANByABqQRBqIAJBGGopAwA3AwAgA0HIAGpBCGogAkEQaikDADcDACADIAIpAwgiEjcDSAJAIBKnIgZBAUcNACADQegCakEkaiACQQhqIghBIGopAgA3AgAgA0HoAmpBHGogCEEYaikCADcCACADQegCakEUaiAIQRBqKQIANwIAIANB6AJqQQxqIAhBCGopAgA3AgBBAC0A4PadARogAyAIKQIANwLsAkHAABCEASIIRQ0RIAhBFDYCACAIIAMpAugCNwIEIAhBDGogA0HwAmopAgA3AgAgCEEUaiADQfgCaikCADcCACAIQRxqIANBgANqKQIANwIAIAhBJGogA0GIA2opAgA3AgAgCEEsaiADQZADaigCADYCACAAQQI2AgAgACAINgIEDA0LIAEoAgQhECADKAJkIQsgAygCYCEMIAMoAmghBBDiHyEBIANB6AJqIAQQRSABQThqIANB6AJqQThqIgUpAwA3AwAgAUEwaiADQegCakEwaiIOKQMANwMAIAFBKGogA0HoAmpBKGopAwA3AwAgAUEgaiADQegCakEgaikDADcDACABQRhqIANB6AJqQRhqKQMANwMAIAFBEGogA0HoAmpBEGopAwA3AwAgAUEIaiADQegCakEIaikDADcDACABIAMpA+gCNwMAAkACQCAGDQAgAygCVCEHIAMoAlAhDSADKAJcIQggAygCWCEOAkAgAykDUCISQgODQgBSDQAgEqciBSAFKAIAIgVBAWo2AgAgBUF/TA0TCyADIAc2AugCIANBgAFqIQUMAQsgAygCVCEIIAMoAlAhDSADKAJMIQ8Q4h8hByADQegCaiAPEEUgB0E4aiAFKQMANwMAIAdBMGogDikDADcDACAHQShqIANB6AJqQShqKQMANwMAIAdBIGogA0HoAmpBIGopAwA3AwAgB0EYaiADQegCakEYaikDADcDACAHQRBqIANB6AJqQRBqKQMANwMAIAdBCGogA0HoAmpBCGopAwA3AwAgByADKQPoAjcDACADQegCaiEFCyAFIAg2AgBBAC0A4PadARogAygCgAEhBSADKALoAiEPQcAAEIQBIghFDRAgCCABNgIoIAggCzYCJCAIIAw2AiAgCCAFNgIcIAggDjYCGCAIIA82AhQgCCANNgIQIAggBzYCDCAIIAY2AgggCEEUNgIAAkACQCAGDgMACgEAC0EBIQFBACEHIAMpA1AhEgwLCwJAAkAgAygCTCIMKAIAQRtHDQAgDCgCCEUNAQsgACAINgIEIABBAjYCACAMEOQBIAxBwABBCBC9E0EAIQFBASEHDAwLIANB+AJqIAxBIGopAwA3AwAgA0HoAmpBCGogDEEYaikDADcDACADIAwpAxA3A+gCIANBEGogA0HoAmoQkxMgAygCECENAkACQCADKAIUIg5FDQAgDSAOaiELIA0hAQNAIAFBAWohBwJAAkAgASwAACIFQX9MDQAgByEBDAELAkACQCAFQWBJDQACQCAFQW1HDQAgByALRg0FIAFBAmogC0YNBSABLQABQZ8BSw0CIAFBA2ohAQwDCyAHIAFBAmogByALRhsiASABIAtHaiEBIAVBcEkNAiABIAEgC0dqIQEMAgsgByABQQJqIAcgC0YbIQEMAQsgA0EIaiADQegCahCTEyADQYABaiADKAIIIAMoAgwQuAggA0GAAWoQ0B0hEgwDCyABIAtHDQALCyANIA4Q+RchEgsgA0HoAmoQqhECQCAMKAIAQRtHDQAgDEEIaiIBKAIARQ0KIAEQrAkMCgsgDBDkAQwJCyADQYABahCaFQwMCyADQSBqIAJBCGoi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CDYChAEgA0ECNgKAASADQYABahCaFQwCCyADQYABahCaFQsgAEEIaiADQYABakEIaikDADcDACADIAg2AoQBIANBAjYCgAEgACADKQOAATcDAAsCQCAUQgBSDQAgE6ciCCAIKAIAIgBBf2o2AgAgAEEBRw0AIAggCCgCEBDpHQsgA0HoAmoQ6RECQCAEKAIAQRpGDQAgBBDkAQsgBEHAAEEIEL0TDAELAkACQCAEKAIAQRpGDQAgBBDkAQwBCyAEKQMIIhJCA4NCAFINACASpyIIIAgoAgAiAEF/ajYCACAAQQFHDQAgCCAIKAIQEOkdCyADKAJoQcAAQQgQvRMCQAJAAkAgBg4DAQACAQsgA0HIAGoQgBAMAgsgB0UNASADKQNQIhJCA4NCAFINASASpyIIIAgoAgAiAEF/ajYCACAAQQFHDQEgCCAIKAIQEOkdDAELIAFFDQAgAygCTCIIEOQBIAhBwABBCBC9EwsgAigCAEFwaiIIQRNLDQhBASAIdEGVqCBxDQogCEELRg0HDAgLIAENBQwECyADQegCaiADQYABahDJBEEALQDg9p0BGkHAABCEASIBRQ0BIAEgAykD6AI3AwAgAUE4aiADQegCakE4aikDADcDACABQTBqIANB6AJqQTBqKQMANwMAIAFBKGogA0HoAmpBKGopAwA3AwAgAUEgaiADQegCakEgaikDADcDACABQRhqIANB6AJqQRhqKQMANwMAIAFBEGogA0HoAmpBEGopAwA3AwAgAUEIaiADQegCakEIaikDADcDACAIEOQBIAhBwABBCBC9EyAEQQFLIQwgASEICwJAAkAgBUEBTQ0AIAchBAwBCyADQegCaiALEMkEQQAtAOD2nQEaQcAAEIQBIgRFDQEgBCADKQPoAjcDACAEQThqIANB6AJqQThqKQMANwMAIARBMGogA0HoAmpBMGopAwA3AwAgBEEoaiADQegCakEoaikDADcDACAEQSBqIANB6AJqQSBqKQMANwMAIARBGGogA0HoAmpBGGopAwA3AwAgBEEQaiADQegCakEQaikDADcDACAEQQhqIANB6AJqQQhqKQMANwMAIAcQ5AEgB0HAAEEIEL0TC0EALQDg9p0BGkHAABCEASIBRQ0AIAEgBjoAFCABIAk2AhAgASAKNgIMIAEgBDYCCCABIAg2AgQgAUESNgIA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IANB0AVqENQgQQEhDiAMQYGAgIB4Rg0BCyADQbgDaiABEKgUAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAMoArgDIhRBgICAgHhHIhBFDQAgA0H4AGpBCGogA0G4A2pBCGooAgA2AgAgAyADKQK4AzcDeAwBCwJAIAEQmSMiDg0AQdyXgAFBIxACIQUMAwsgA0HwAWogARAYIhIQqBQgAygC8AFBgICAgHhGDQEgA0H4AGpBCGogA0HwAWpBCGooAgA2AgAgAyADKQLwATcDeCABEMEhIBIQwSELQQhBBBCPHiIOQgA3AgBBBEEEEI8eIhJBADYCACADQYQBakEYakEAKQOY/5wBIiM3AgAgA0EAOgCEASADQoGAgIDw/79/NwKwASADIBI2AqwBIANBATYCqAEgA0EAOgCkASADQQE2ApABIAMgDjYCjAEgA0EBNgKIASADQQApA5D/nAEiJDcClAFBACgCgPadASEcQQAgA0GEAWo2AoD2nQFBjAEQwiEiDkEANgJ0IA5CgICAgMAANwJsIA5BADoAaCAOQcy7mAE2AmQgDkKAgICAEDcCXCAOQoCAgIDAADcCVCAOQQs2AgggDkKCgICAEDcCACAOQQE2AogBIA4gJDcCeCAOQYABaiAjNwIAIAMgDjYC3AFBAUUNAiADQeABakEIaiADQfgAakEIaigCADYCACADIAMpA3g3A+ABQRgQxyIiEkUNAiASQQA2AhQgEkKAgICAwAA3AgwgEkEAOgAIIBJCgYCAgBA3AgACQAJAQQAtAIDynQEOBAAABQEAC0EAQQI6AIDynQFBAC0A4PadARpBgAgQhAEiE0UNA0EAQQM6AIDynQFBACATNgL48Z0BCyADQbgDahDLCSADQaQEaiITEPgNIANCgYCAgMAANwLsBCADQcAGakEBQQAQ+RQgA0HYBmpBAUEAEPkUIANBxAVqQQFBABD5FCADQdAFahDLCSADKQLgBSEjIAMpAoAGISQgAykCiAYhJSADKQKQBiEmIANB+ARqEPgNIANBuANqEJIgIANBiARqIANBwAZqQQhqKAIANgIAIANBlARqIANB2AZqQQhqKAIANgIAIANBoARqIANBxAVqQQhqKAIANgIAIAMgJjcC+AMgAyAlNwLwAyADICQ3AugDIANCoICAgIAENwLgAyADQqCAgICABDcC2AMgA0KggICAgAQ3AtADIAMgIzcCyAMgA0KggICAgAQ3AsADIANCoICAgIAENwK4AyADIAMpAsAGNwKABCADIAMpAtgGNwKMBCADIAMpAsQFNwKYBAJAQcgARQ0AIBMgA0H4BGpByAD8CgAACwJAQbwBRQ0AIANB8AFqIANBuANqQbwB/AoAAAsgAyAONgKwAyADIBI2AqwDIANB0AVqELEeIBIgEigCACIOQQFqNgIAIA5Bf0wNAiADKQLwASEjIAMpAvgBISQgAykCgAIhJSADKQKIAiEmIAMpApACIScgAykCmAIhKCADKQKgAiEpIAMpAqgCISogAykCsAIhKyADQYAEaiADKAK8AiADKALAAhCsFCADQYwEaiADKALIAiADKALMAhCsFCADQZgEaiADKALUAiADKALYAhCsFCADICs3AvgDIAMgKjcC8AMgAyApNwLoAyADICg3AuADIAMgJzcC2AMgAyAmNwLQAyADICU3AsgDIAMgJDcCwAMgAyAjNwK4AyADKALgAiEOIANB0AVqIAMoAuQCIhNBAUEKEKkNIAMoAtQFIR0gAygC0AVBAUYNBCADKALYBSEeAkAgE0EKbCIRRQ0AIB4gDiAR/AoAAAsCQEHsAEUNACADQdAFaiADQbgDakHsAPwKAAALIAMoArADIhEgESgCACIOQQFqNgIAIA5Bf0wNAiADKAKoAyEfIAMoAqQDISACQEHsAEUiIQ0AIANBuANqIANB0AVqQewA/AoAAAsgA0GaA2ohGSADQZADaiEaIANBhgNqIQ8gA0H8AmohFyADQfICaiEYIANB6AJqISJBxAEQwiEhDgJAICENACAOIANBuANqQewA/AoAAAsgDiATNgJ0IA4gHjYCcCAOIB02AmwgDiAiKQIANwJ4IA5BgAFqICJBCGovAQA7AQAgDiAYKQEANwGCASAOQYoBaiAYQQhqLwEAOwEAIA4gFykCADcCjAEgDkGUAWogF0EIai8BADsBACAOIA8pAQA3AZYBIA5BngFqIA9BCGovAQA7AQAgDiAgNgK0ASAOIB82ArgBIA4gEjYCvAEgDiARNgLAASAOQagBaiAaQQhqLwEAOwEAIA4gGikCADcCoAEgDiAZKQEANwGqASAOQbIBaiAZQQhqLwEAOwEAIANBwAZqQQtqQQApA5j/nAEiIzcAACADQfgEakELaiAjNwAAIANB0AVqQQtqICM3AAAgA0EBOgCWBCADQQA2AJcEIANBADoAvAMgA0EANgK4AyADIA42AsADIANB7JWAATYCxAMgA0GAAjsBlAQgA0EAOgDIAyADQQA6ANgDIANBADYC1AMgA0KAgICAwAA3AswDIANBACkDkP+cASIjNwDDBiADICM3APsEIAMgIzcA0wUgA0HoA2ogA0HABmpBD2ooAAA2AAAgA0HhA2ogA0HABmpBCGoiEikAADcAACADIAMpAMAGNwDZAyADQQA6AOwDIANB/ANqIANB+ARqQQ9qKAAANgAAIANB9QNqIANB+ARqQQhqIhMpAAA3AAAgAyADKQD4BDcA7QMgA0EAOgCABCADQZAEaiADQdAFakEPaigAADYAACADQYkEaiADQdAFakEIaiIOKQAANwAAIAMgAykA0AU3AIEEIA4gA0HgAWpBCGooAgA2AgAgAyAVOwDrBSADQe0FaiAVQRB2OgAAIAMgBToA9gUgAyAIOgD1BSADIAk6APQFIAMgCjoA8wUgAyAHNgDvBSADIAY6AO4FIAMgFjsA6QUgAyALOgDoBSADIBs2AuQFIAMgDTYC4AUgAyAMNgLcBSADIAMpA+ABNwPQBSADIANBuANqNgL8BSADIANB3AFqNgL4BUEAKAL89Z0BIQ5BACADQbgDajYC/PWdASADQcAGaiADKALcASADQbgDaiADQdAFaiADQdAFakEMahA/AkACQCADKALABkGAgICAeEcNACADQfgEahDZHyADQdgGakEIaiIMIANB+ARqQQxqKQIANwMAIANB2AZqQRBqIgUgA0GMBWooAgA2AgAgAyADKQL8BDcD2AYgAygC+AQhBkEsEMIhIg0gBjYCBCANQeiKgAE2AgAgDSADKQPYBjcCCCANQRBqIAwpAwA3AgAgDUEYaiAFKAIANgIAIA0gAykCxAY3AhwgDUEkaiADQcAGakEMaikCADcCACADIA02AvwEIANBgICAgHg2AvgEDAELIANB+ARqQRBqIANBwAZqQRBqKQIANwMAIBMgEikCADcDACADIAMpAsAGNwP4BAtB8MWYASAOEPQeAkACQCADKAK4Aw0AIAMoAvwEIQkgAygC+AQiCkGAgICAeEYNByADKQOIBSEkIAMpA4AFISMMAQsgAygCrAMiDUEIahCO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gANqIARB6AJqEPgICyAEQcgBaiAEQZgDaigCADYCACAEQcABaiAEQZADaikCADcCACAEQbgBaiAEQYgDaikCADcCACAEIAQpAoADNwKwAQwBCyAEQawBaiABKAIEIAEoAgggBEHYAGogCBCTECAEKAKsASIBQYCAgIB4Rg0AIARB0ABqIARBrAFqQRxqKAIAIgM2AgAgBEHIAGogBEGsAWpBFGopAgAiFjcDACAEQcAAaiAEQawBakEMaikCACIXNwMAIAQgBCkCsAEiGDcDOCAEKQLMASEZIABBHGogAzYCACAAQRRqIBY3AgAgAEEMaiAXNwIAIAAgGDcCBCAAIBk3AiAgACABNgIADAILIARB0ABqIARByAFqKAIANgIAIARByABqIARBwAFqKQIANwMAIARBwABqIARBuAFqKQIANwMAIAQgBCkCsAE3AzggAyAEQThqEK4PCyAAQYCAgIB4NgIACyAEQaADaiQAC8U6ARt/IwBBgAFrIgUkACACQQA2AmggAkEANgJUIAJBADYCOCACQQA2AiQgAkEANgIIAkACQAJAAkACQAJAIAMoAhAiBiADKAIUIgdLDQAgAygCDCIIQX9GDQMgAygCCCEJIAVBOGogACADKAIAIAMoAgQQxhMgBS0AOCIKQQJGDQAgAUH/AXFBAkYgAXIhCyAFKAI8IQwgAkHYAGohDSACQShqIQ4gBCgCCCEPIAMtABhBAXEhECAGIREDQCALIA9BAEdxIQMCQAJAAkAgAigCJEUNACARIRIgA0UNAQwCCyADIAogESAGS3FyDQMLAkAgAigCCCIDIAIoAgBHDQAgAkG4w4QBEPMXCyACKAIEIANBDGxqIgEgDDYCBCABQQA2AgAgAiADQQFqIgM2AgggESESIANFDQAgESESA0AgEiETIAIgA0F/aiIDNgIIAkAgAigCBCADQQxsaiIDKAIAIgFBAkcNACATIRIMAgsgAygCBCEDAkACQAJAAkAgAUEBcQ0AIAUgAzYCRAJAIAMgAigCICIBTw0AIAkgE2oiFEF/aiEVIAkgE0F/aiIWaiEXA0AgAigCFCEYAkACQAJAAkACQAJAAkACQAJAIAIoAhwgA0ECdCIZaigCACIaIAIoAiQiAU8NACAaIBhPDQEgAigCECAaQQJ0aigCACADRg0NCyAFIAE2AkggASAYTw0BIAIo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IAJBOGoQ+SICQCACLQAwRQ0AIAAgAigCNDYCBAwHCyACLQAxIQMLAkACQCADQf8BcUFVag4DAAEAAQsgASABKAJcQX9qNgJcIAEgASgCWEEBajYCWCABIAEoAmhBAWo2AmgLIAJBOGogARDSBQJAIAItAEEiCEECRw0AIAAgAigCODYCBAwGCyABKAJoIAVrIQQgASgCYCAFIAEoAmxraiEDIAggBnJBAXENAQtBgICAgHghCAwBCyACQQA2AkAgAkKAgICAEDcCOCACQThqIAMgAyAEahDQBiACKAJAIQQgAigCPCEDIAIoAjghCAsgAkE4aiADIAQQjgECQCACLQA4RQ0AIAIgAi0AOToAMEGIx5kBQR0gAkEwakGAsJkBQajHmQEQ6hAACyACKwNAIRAgCEGAgICAeEYNASAIIAMQvSIMAQsgASAMNgJoIAEgASgCZCAMIANrIghrNgJcIAEgBCAIaiINNgJYIAQgCSADayIJaiEDAkAgBkEBcQ0AIAMgCCAJaxD1CiEQDAELIAJBADYCQCACQoCAgIAQNwI4IAJBOGogAyANENAGIAIoAjghAyACKAI8IgQgAigCQBD1CiEQIANBgICAgHhGDQAgAyAEEL0iCyABKAJcRQ0BIAEoAlgsAAAiA0EASA0BIANBwKyZAWotAABBAUcNASABKAJoIQEgAkGggICAeDYCOCAAIAEgASACQThqEM0jNgIEC0EBIQEMAwsCQCABKAIIQQpGDQAgAUEIahCKCQsgASAQOQMQIAFBBzYCCEHBACEBDAELAAsgACABOgABQQAhAQsgACABOgAAIAJB0ABqJAAL7DgCHX8HfiMAQaAFayIDJAAgASABKAJ4IgRB/79/cTYCeCABKALAASEFAkACQCABQRIQlAwiBkUNACAAQYGAgIB4NgKQASAAIAY2AgAMAQsgAUHAAWohBwJAIAEtAMgBIgZBW2oiCEESSw0AQQEgCHRBg4AacUUNACADQcgCaiABIAEoAsABENIEIAdBCGogA0HIAmpBCGooAgA2AgAgByADKQLIAjcCACABLQDIASEGCwJAIAZB/wFxQRNHDQAgASgCwAEhCCABKALEASEGIANByAJqIAEQ3gEgASAGNgK8ASABIAg2ArgBIAcgAykCyAI3AgAgB0EIaiADQcgCakEIaigCADYCACADQShqIAEQnAIgASgCwAEhCQJAAkAgAUE8EJQMIggNAAJAIAEtAMgBIghBW2oiCkESSw0AQQEgCnRBg4AacUUNACADQcgCaiABIAEoAsABENIEIAdBCGogA0HIAmpBCGooAgA2AgAgByADKQLIAjcCACABLQDIASEICyADQRM6AJgCIAhB/wFxQRNGDQEgASgCxAEhBiABKALAASEJIANBuAFqIAgQhh4gA0EBNgLMAiADQZTzmwE2AsgCIANCATcC1AIgA0H3Bq1CIIYgA0GYAmqthDcDaCADIANB6ABqNgLQAiADQegBaiADQcgCahCNFyADQfwBaiADQcABaigCADYCACADIAMpArgBNwL0ASAJIAYgA0HoAWoQhBchCCABLQDIAUGiAUcNACABENcSIQYgARDjDiABIAYQ+hILIABBgYCAgHg2ApABIAAgCDYCACADQShqEN8hDAILAkACQCACDQAgASgCwAEhCiABKALEASEIIANByAJqIAEQ3gEgASAINgK8ASABIAo2ArgBIAcgAykCyAI3AgAgB0EIaiADQcgCakEIaigCADYCAAwBCyABEOMOIAEoArwBIQgLIAAgAykCKDcCACAAQYCAgIB4NgKQASAAIAg2AiAgACAJNgIcIAAgBjYCGCAAIAU2AhQgACAINgIQIAAgBTYCDCAAQQhqIANBKGpBCGooAgA2AgAMAQsgASABKAJ4IgZB/79/cTYCeCADQcgCaiABEKkEIAEgBjYCeCADKALIAiEIAkAgAy0A9AIiCUEGRg0AAkBBKEUNACADQShqQQRyIANByAJqQQRyQSj8CgAACyADQShqQS9qIANByAJqQS9qLQAAOgAAIAMgAy8A9QI7AFUgAyAJOgBUIAMgCDYCKEEAIQsCQCABLQCBAUEgcUUNAEEAIQsgAS0AyAFB/wFxQRJHDQAgA0HIAmogARCTAyABIAZBAXI2AnggA0EgaiABELQEIAMoAiQhCwJAAkAgAygCIEEBcQ0AIAEQ4w4gCw0BIAEgA0HIAmoQoAZBACELDAILIANBATYC6AEgAyALNgLsASABIANByAJqEKAGIANB6AFqEO4eQQAhCwwBCyABIAEoAnhBfnEgBkEBcXI2AnggA0HIAmoQqyELIANBGGpBCEEIQdgAQfC3mwEQ2RYgAyADKAIcIgg2ApgBIAMgAygCGDYClAEgAUEIaiEMQfcGrUIghiIgQb2mmwGthCEhIANB6AFqQQxqIQ0gA0HcA2ohDiADQcgCakEkaiEPIANByAJqQQxqIRAgA0G4AWpBCGohEUEAIQkCQAJAAkADQCADIAk2ApwBAkAgAS0AyAEiBkFbaiIKQRJLDQBBASAKdEGDgBpxRQ0AIANByAJqIAEgASgCwAEQ0gQgB0EIaiADQcgCakEIaigCADYCACAHIAMpAsgCNwIAIAEtAMgBIQYLAkACQAJAAkACQAJAAkACQAJAIAZB/wFxIgpBcGoOBAEAAAEACwJAAkAgCkECRw0AIAEQ4w4gASgCwAEhEiABQRwQlAwiCA0LIAEoArwBIRMgAyABEPYLIAMoAgQhCiADKAIAQQFxRQ0BIAohCAwLCyABKALAASEUIAEQvwEgA0HIAmogARDUCiADKALIAiEIIAMtANwCQQJGDQogAygC1AIhCSADKALQAiEKIAMoAswCIQYgAS0AyAFBCUcNAiABEOMOIAEQvwEgA0HIAmogARDUCgJAIAMtANwCQQJHDQAgCK0hIiADKALIAiEIICIgBq1CIIaEEPMfDAsLIAmtQiCGIAqthCEjIAatQiCGIAithCEiIAMpA8gCISQgAygC1AIhFSADKALQAiEWIBQhFwwGCyADIAo2AsgCAkAgAUEDEJQMIghFDQAgA0HIAmoQmiEMCgtBBSEYDAYLIAMoApQBIgpBgICAgHhGDQkgAyAJNgJkIAMgCDYCYCADIAo2AlwCQCAGQf8BcUETRw0AIAEpA8ABISIgA0HIAmogARDeASABICI3A7gBIAcgAykCyAI3AgAgB0EIaiADQcgCakEIaigCADYCACABKALAASEGAkBBMEUNACADQcgCaiADQShqQTD8CgAACyADQYwDaiADQdwAakEIaigCADYCACADQQA6AJADIAMgBjYC/AIgAyAFNgL4AiADIAs2AoADIAMgAykCXDcChAMgA0G0AmogARCcAiABKALAASEIIAFBPBCUDCIGDQQgA0HoAWogARCpBCADKALoASEGIAMtAJQCIglBBkYNBAJAQShFDQAgA0G4AWpBBHIgA0HoAWpBBHJBKPwKAAALIANBuAFqQS9qIANB6AFqQS9qLQAAOgAAIAMgAy8AlQI7AOUBIAMgCToA5AEgAyAGNgK4AQJAIAEtAMgBIgZBW2oiCUESSw0AQQEgCXRBg4AacUUNACADQegBaiABIAEoAsABENIEIAdBCGogA0HoAWpBCGooAgA2AgAgByADKQLoATcCACABLQDIASEGCyADQRM6AJQBAkACQAJAIAZB/wFxQRNGDQAgASgCxAEhCCABKALAASEJIANBoAFqIAYQhh4gA0EBNgLsASADQZTzmwE2AugBIANCATcC9AEgAyAgIANBlAFqrYQ3A4gFIAMgA0GIBWo2AvABIANBmAJqIANB6AFqEI0XIANBrAJqIANBqAFqKAIANgIAIAMgAykCoAE3AqQCIAkgCCADQZgCahCEFyEGIAEtAMgBQaIBRw0BIAEQ1xIhCCABEOMOIAEgCBD6EgwBCwJAAkAgAg0AIAEpA8ABISIgA0HoAWogARDeASABICI3A7gBIAcgAykC6AE3AgAgB0EIaiADQegBakEIaigCADYCAAwBCyABEOMOCyADIANByAJqELsINwOYAiADIANBuAFqELsIIiI3A+gBIANBmAJqIANB6AFqEPkLIQYgIhDzHyADKQOYAhDzHyAGDQEgA0HEAWohBiADQbgBakEIaiEIAkACQAJAIAMtAOQBQX1qIglBASAJQf8BcUEDSRtB/wFxDgMCAAECCyADQcwBaiEGIANByAFqIQgMAQsgA0HcAWohBiADQdgBaiEICyAGKAIAIQYgCCgCACEIIANByAJqELsIISIgA0HYgICAeDYC6AEgAyAiNwPwASAIIAYgA0HoAWoQhBchBiABLQDIAUGiAUcNACABENcSIQggARDjDiABIAgQ+hILIANBuAFqEIEaDAULIANB5QFqIQYgASgCvAEhCQJAQSxFDQAgA0HoAGogA0G4AWpBLPwKAAALIANB/ARqQQJqIAZBAmotAAA6AAAgAyAGLwAAOwH8BCAIIQYgAy0A5AEiCkEGRg0EIAAgCTYCDAJAQSxFDQAgAEEQaiADQegAakEs/AoAAAsgAEE/aiADQf4Eai0AADoAACAAIAMvAfwEOwA9IAFBvAFBwAEgAhtqKAIAIQYCQEHQAEUNACAAQcAAaiADQcgCakHQAPwKAAALIAAgCjoAPCAAIAg2AgggACAGNgIEIAAgBTYCACAAQZgBaiADQbwCaigCADYCACAAIAMpArQCNwKQAQwNCyABQRAQlAwiBkUNAQwCCyAJrUIghiAKrYQhJCAG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RQ0CIBogEjYCCCAaIBM2AgQgGiAINgIAIBogAykD4AQ3AgwgGkEUaiAJKQMANwIAIBpBHGogCikDADcCAAJAIBgNACAaQSRqIANB9ANqQewA/AoAAAsgGiAGNgKQASAaIAMpA+gDNwKUASAaQZwBaiAcKAIANgIAQQIhGAwDCyADQbgBaiABEP0NIANB6ABqQQhqIBFBCGopAwA3AwAgAyARKQMANwNoQQAhGCADKAK8ASEeIAMoArgBIR8MAgsgA0HoAGpBEGogCikDADcDACADQegAakEIaiAJKQMANwMAIAMgAykD4AQ3A2hBAyEYIAghGiATIR8gEiEeDAELAAsgASAZNgJ4IANBoAFqQQhqIANB6ABqQQhqKQMANwMAIANBoAFqQRBqIANB6ABqQRBqKQMANwMAIAMgAykDaDcDoAEgASgCvAEhGyAeIRMgHyESIBohCgsgA0GYAmpBEGoiHCADQaABakEQaikDADcDACADQZgCakEIaiIdIANBoAFqQQhqKQMANwMAIAMgAykDoAE3A5gCAkAgAygCnAEiCSADKAKUAUcNACADQZQBahD/GAsgAygCmAEiCCAJQdgAbGoiBiATNgIMIAYgEjYCCCAGIAo2AgQgBiAYNgIAIAYgAykDmAI3AxAgBiAVNgJUIAYgFzYCUCAGIBU2AkwgBiAWNgJIIAYgJDcDQCAGICM3AzggBiAiNwMwIAYgGzYCLCAGIBQ2AiggBkEYaiAdKQMANwMAIAZBIGogHCkDADcDACAJQQFqIQkMAQsLIAEgGTYCeAJAICJCAFINACAjEPMfDAELICIgJBCPJAsgA0GUAWoQgyALIABBgYCAgHg2ApABIAAgCDYCAAsgCxCeIiADQShqEIEaDAELIABBgYCAgHg2ApABIAAgCDYCAAsgASAENgJ4IANBoAVqJAALpUYCAn8BfiMAQdACayICJAACQAJAAkACQAJAAkACQANAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgASgCACIDQTQgA0G9gYCAeEgbQf8BcQ69AQABAgMEBQYHCAkKCwwNDg8QERITFBUWvAEXGBkaGxwdHh8gISIjJCUmJygpKissLS4vvQEwMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f4ABgQGCAYMBhAGFAYYBhwGIAYkBigGLAYwBjQGOAY8BkAGRAZIBkwGUAZUBlgGXAZgBmQGaAZsBnAGdAZ4BnwGgAaEBogGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AbYBtwG5AboBuwEACyAAQQ42AgggAEHY4ZgBNgIEIABBgICAgHg2AgAMvgELIABBGjYCCCAAQebhmAE2AgQgAEGAgICAeDYCAAy9AQsgAEEgNgIIIABBgOKYATYCBCAAQYCAgIB4NgIADLwBCyAAQS82AgggAEGg4pgBNgIEIABBgICAgHg2AgAMuwELIABB0wA2AgggAEHP4pgBNgIEIABBgICAgHg2AgAMugELIABBKTYCCCAAQaLjmAE2AgQgAEGAgICAeDYCAAy5AQsgAEEmNgIIIABBy+OYATYCBCAAQYCAgIB4NgIADLgBCyAAQSo2AgggAEHx45gBNgIEIABBgICAgHg2AgAMtwELIABBETYCCCAAQZvkmAE2AgQgAEGAgICAeDYCAAy2AQsgAEEXNgIIIABBrOSYATYCBCAAQYCAgIB4NgIADLUBCyAAQSw2AgggAEHD5JgBNgIEIABBgICAgHg2AgAMtAELIABB4gA2AgggAEHv5JgBNgIEIABBgICAgHg2AgAMswELIABBGjYCCCAAQdHlmAE2AgQgAEGAgICAeDYCAAyyAQsgAEElNgIIIABB6+WYATYCBCAAQYCAgIB4NgIADLEBCyAAQRw2AgggAEGQ5pgBNgIEIABBgICAgHg2AgAMsAELIABBJzYCCCAAQazmmAE2AgQgAEGAgICAeDYCAAyvAQsgAEEnNgIIIABB0+aYATYCBCAAQYCAgIB4NgIADK4BCyAAQSc2AgggAEH65pgBNgIEIABBgICAgHg2AgAMrQELIABBMDYCCCAAQaHnmAE2AgQgAEGAgICAeDYCAAysAQsgAEEpNgIIIABB0eeYATYCBCAAQYCAgIB4NgIADKsBCyAAQTU2AgggAEH655gBNgIEIABBgICAgHg2AgAMqgELIABBMzYCCCAAQa/omAE2AgQgAEGAgICAeDYCAAypAQsgAEEfNgIIIABB4uiYATYCBCAAQYCAgIB4NgIADKgBCyAAQSg2AgggAEH86ZgBNgIEIABBgICAgHg2AgAMpwELIABBJTYCCCAAQaTqmAE2AgQgAEGAgICAeDYCAAymAQsgAEEaNgIIIABByeqYATYCBCAAQYCAgIB4NgIADKUBCyAAQRw2AgggAEHj6pgBNgIEIABBgICAgHg2AgAMpAELIABBFzYCCCAAQf/qmAE2AgQgAEGAgICAeDYCAAyjAQsgAiABQQhqNgKgAiACQQE2ArwCIAJBxOuYATYCuAIgAkIBNwLEAiACQeoErUIghiACQaACaq2ENwPQASACIAJB0AFqNgLAAiACQRBqIAJBuAJqENENIABBCGogAkEQakEIaigCADYCACAAIAIpAhA3AgAMogELIABBGzYCCCAAQczrmAE2AgQgAEGAgICAeDYCAAyhAQsgAEEVNgIIIABB5+uYATYCBCAAQYCAgIB4NgIADKABCyAAQR82AgggAEH865gBNgIEIABBgICAgHg2AgAMnwELIAIgAUEEajYCoAIgAkEBNgK8AiACQbDsmAE2ArgCIAJCATcCxAIgAkHjBK1CIIYgAkGgAmqthDcD0AEgAiACQdABajYCwAIgAkEcaiACQbgCahDRDSAAQQhqIAJBHGpBCGooAgA2AgAgACACKQIcNwIADJ4BCyAAQRU2AgggAEG47JgBNgIEIABBgICAgHg2AgAMnQELIABBFjYCCCAAQc3smAE2AgQgAEGAgICAeDYCAAycAQsgAiABQQRqNgKgAiACQQE2ArwCIAJB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rYQ3A7gDIAIgAkG4A2o2AnQgAkHsAGpB7NObARCoHQALIBUgARDQHyASQTBqIAEQkyQMAwsgEiAXKQMANwMAIAIgAikDsAQ3A7gDIAJBoARqEOUhIAJBlAJqEIsQAkAgAigCxANFDQAgAkEANgKcAiACQoCAgICAATcClAIgAiABKQJANwKgAiACIAJBuANqNgKoAiAVIAJBlAJqENEfIAJBlAJqEPUfCyACQbgDahDRDAwCCwALIBUgFykDADcDACACIAIpA7AENwO4AyACQaAEahDlISACQZQCahCLEAJAIAIoAsQDRQ0AIAJBADYCnAIgAkKAgICAgAE3ApQCIAIgASkCQDcCoAIgAiACQbgDajYCqAIgEiACQZQCahDKDSACQZQCahD1HwsgAkG4A2oQ0QwMAAsLzTQCNH8DfiMAQaAEayIEJAACQAJAAkACQCADLQAlQQJGDQAgBEGYAWpBCGogA0EQaikDADcDACAEQZgBakEQaiADQRhqIgUpAwA3AwAgBCADKQMIIjg3A5gBIAUoAgAhBiADKAIgIQUgAygCBCEHIAMoAgAhCAJAIDhCA4NCAFINACA4pyIJIAkoAgAiCUEBajYCACAJQX9MDQILIANBCGohAyAEQTBqQSBqIAVBIGopAwA3AwAgBEEwakEYaiAFQRhqKQMANwMAIARBMGpBEGogBUEQaikDADcDACAEQTBqQQhqIAVBCGopAwA3AwAgBCAFKQMANwMwIARBCGogOCAGIARBMGoQZAJAAkAgAUIDgyI4QgBSDQAgAaciBiAGKAIAIglBAWo2AgAgCUF/TA0DIAQgAjYCOCAEIAE3AzAgBEEgaiADIARBMGoQ8AMgBiAGKAIAIgNBf2o2AgAgA0EBRw0BIAYgBigCEBDpHQwBCyAEIAI2AjggBCABNwMwIARBIGogAyAEQTBqEPADC0EALQDg9p0BGkHAABCEASIDRQ0BIARB/ABqQQxqIARBmAFqQQhqKQMANwIAIARB/ABqQRRqIARBmAFqQRBqKQMANwIAIANBADYCACADQgA3AiAgA0EoakIANwIAIANBMGpBADYCACAEIAQpA5gBNwKAASADIAQpAnw3AgQgA0EMaiAEQfwAakEIaikCADcCACADQRRqIARB/ABqQRBqKQIANwIAIANBHGogBEGUAWooAgA2AgAgA0IENwI0IARBATYC6AIgBCADNgLkAiAEQQE2AuACIARBMGogBEHgAmogBEEIahCFEUEALQDg9p0BGkEQEIQBIgpFDQEgCiAEKQIgNwIAIApBCGogBEEgakEIaikCADcCAEEALQDg9p0BGkHIABCEASIDRQ0BAkBByABFDQAgAyAEQTBqQcgA/AoAAAtBAC0A4PadARpBwAAQhAEiBkUNASAGIAM2AiAgBkECOgAcIAZBDzYCACAEQgA3AvgCIARBAzoA9AIgBEEANgLwAiAEQgA3AoADIARCADcC6AIgBEKAgICAwAA3AuACIARB4AJqEJoaQQBBBBD4IkEALQDg9p0BGkEwEIQBIglFDQFBAC0A4PadARpBwAAQhAEiA0UNASADQgA3AhwgA0EFOgAYIAMgBjYCECADQQE2AgwgAyAKNgIIIANCl4CAgBA3AwAgA0EkakIANwIAIABBADYCFCAAIAc2AhAgACAINgIMIABBATYCCCAAIAk2AgQgAEEBNgIAIAlCADcCCCAJIAM2AgQgCUESNgIAIAVBKEEIEL0TQQBBCBD2IiA4QgBSDQMgAaciAyADKAIAIgVBf2o2AgAgBUEBRw0DIAMgAygCEBDpHQwDCyADKAIQIQsgAygCDCEMIAMoAgAhBSADKAIEIQ0gAygCCCEDIARBADYCvAEgBEKAgICAgAE3ArQBIAQgDSADQThsaiIONgLMASAEIAU2AsgBIAQgDTYCxAEgBCANNgLAAQJAIAMNACABQgODITkMAgsgAUIDgyE5IARB4AJqQSBqIQ8gBEHgAmpBHGohECAEQeACakEYaiERIARB4AJqQRRqIRIgBEHgAmpBEGohEyAEQeACakE0aiEUIARB4AJqQTBqIRUgBEHgAmpBDGohFiABpyEXIARB4AJqQQRyIRggBEHIA2pBBHIhBSAEQeABakElaiEZIARB4AJqQQhqIRoDQCAEIA0iA0E4aiINNgLEASAEIAMpACU3A9ABIAQgA0EsaigAADYA1wEgAygCACIGQQpGDQIgAy0AJCEbIAMoAiAhHCADKAIcIQggAygCGCEdIAMpAhAhOCADKAIMIQcgAygCCCEKIAMoAgQhCSADKQIwITogGSADQSVqIgMpAAA3AAAgGUEHaiADQQdqIh4oAAA2AAAgBCAbOgCEAiAEIBw2AoACIAQgCDYC/AEgBCAdNgL4ASAEIDg3A/ABIAQgBzYC7AEgBCAKNgLoASAEIAk2AuQBIAQgOjcDkAIgBCAGNgLgAQJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgBkEBRg0AIAZBemoOBAECAgMCCyAEIAMpAAA3A5gCIAQgHigAADYAnwICQAJAIApBAkkNACAKQQJHDQUgBEEANgKwAiAEQQA2AqgCIAQgBygCADYCwAIgBCAHKAIEIgg2ArwCIAQgCDYCuAIgBCAIIAcoAggiA0E4bCIfaiIgNgLEAgJAAkAgA0UNAEEAIQYCQANAIAggBmoiA0E4aiEhIAMoAgAiCUEHRg0BIANBKGooAgAhIiADQSxqKAIAISMgA0EwaigCACEKIAUgA0EEaiIkKQIANwIAIAVBCGoiHSADQQxqKQIANwIAIAVBEGoiGyADQRRqKQIANwIAIAVBGGoiHCADQRxqKQIANwIAIAVBIGoiHiADQSRqKAIANgIAIAQgCTYCyAMCQCAKRQ0AIAQgITYCvAIgGCAkKQIANwIAIBhBCGoiJSAkQQhqKQIANwIAIBhBEGoiJiAkQRBqKQIANwIAIBhBGGoiJyAkQRhqKQIANwIAIBhBIGoiKCAkQSBqKAIANgIAIAQgCTYC4AIgBEHwA2ogBEHgAmoQ8QUgBCgC8ANBDEYNCyAEQeACakEoaiIpIARB8ANqQShqIiopAwA3AwAgBEHgAmpBIGoiKyAEQfADakEgaiIsKQMANwMAIARB4AJqQRhqIi0gBEHwA2pBGGoiLikDADcDACAEQeACakEQaiIvIARB8ANqQRBqIjApAwA3AwAgBEHgAmpBCGoiMSAEQfADakEIaiIyKQMANwMAIAQgBCkD8AM3A+ACQQAtAOD2nQEaQcAAEIQBIgMNBAwYCyAEQcgDahCCCyAfIAZBOGoiBkcNAAsgICEhCyAEICE2ArwCCyAEQagCahDtDUEEQQAQ1BxBAEEEEPEiIAdBHEEEEL0TDA4LIAMgBCkD4AI3AwAgA0EAOgA8IAMgCjYCOCADICM2AjQgAyAiNgIwIANBKGogKSkDADcDACADQSBqICspAwA3AwAgA0EYaiAtKQMANwMAIANBEGogLykDADcDACADQQhqIDEpAwA3AwAgBEHgAmpBBEEEQQQQow4gBCgC5AIhBiAEKALgAkEBRg0HIAQoAugCIjMgAzYCAEEBITQgBEEBNgKkAyAEIDM2AqADIAQgBjYCnAMgBEGoA2pBEGogBEGoAmpBEGopAgAiODcDACAEQagDakEYaiAEQagCakEYaikCADcDACAEQagDakEIaiAEQagCakEIaikCADcDACAEIAQpAqgCNwOoAyA4pyE1IAQoAsQDIQggBCgCvAMiNiEDAkADQAJAIDUNACAEIDY2ArwDIARBqANqEO0NIAQoApwDIQkgBCgCoAMhAwwRCyADIAhGDQEgA0EoaiEGAkADQCAGIgNBWGooAgAiCUEHRg0BIANBBGooAgAhIyADQQhqKAIAIQogAygCACEgIAQgCTYCyAMgBSADQVxqIgYpAgA3AgAgHSAGQQhqIiEpAgA3AgAgGyAGQRBqIiQpAgA3AgAgHCAGQRhqIh8pAgA3AgAgHiAGQSBqIiIoAgA2AgACQCAKRQ0AIAQgCTYC4AIgGCAGKQIANwIAICUgISkCADcCACAmICQpAgA3AgAgJyAfKQIANwIAICggIigCADYCACAEQfADaiAEQeACahDxBSAEKALwA0EMRg0NICkgKikDADcDACArICwpAwA3AwAgLSAuKQMANwMAIC8gMCkDADcDACAxIDIpAwA3AwAgBCAEKQPwAzcD4AJBAC0A4PadARpBwAAQhAEiBkUNGCAGIAQpA+ACNwMAIAZBADoAPCAGIAo2AjggBiAjNgI0IAYgIDYCMCAGQShqICkpAwA3AwAgBkEgaiArKQMANwMAIAZBGGogLSkDADcDACAGQRBqIC8pAwA3AwAgBkEIaiAxKQMANwMAAkAgNCAEKAKcA0cNACAEQZwDakEBEKceIAQoAqADITMLIANBEGohAyAzIDRBAnRqIAY2AgAgBCA0QQFqIjQ2AqQDDAMLIANBOGohBiAEQcgDahCCCyADQRBqIAhHDQALCwsgA0EQaiEDCyAEIAM2ArwDIARBqANqEO0NIAQoApwDIQkgBCgCoAMhAyA0RQ0BIDRBAUYNDkEALQDg9p0BGkHAABCEASIKRQ0TIApCADcDECAKIDQ2AgwgCiADNgIIIAogCTYCBCAKQRk2AgBBACEdDA8LAkAgOEIDg0IAUiIDDQAgOKciBiAGKAIAIgZBAWo2AgAgBkF/TA0TCwJAIDlCAFINACAXIBcoAgAiBkEBajYCACAGQX9MDRMLAkAgAw0AIDinIgMgAygCACIDQQFqNgIAIANBf0wNEwtBAC0A4PadARpBwAAQhAEiCUUNEiAJQQA6ABwgCSACNgIYIAlCADcCECAJIAE3AgggCUEaNgIAQQAtAOD2nQEaQcAAEIQBIgZFDRIgBiAbOgAcIAYgHDYCGCAGIAg2AhQgBiAdNgIQIAYgODcDCCAGQRo2AgBBAC0A4PadARpBwAAQhAEiA0UNEiADQQA6ADwgAyAGNgI4IANCADcDMCADIAk2AiggA0IANwMgIAMgCDYCHCADIB02AhggAyA4NwMQIANBADYCCCADQQE2AgACQCAEKAK8ASIJIAQoArQBIg1HDQAgBEG0AWpBoO6aARDzGCAEKAK0ASENCyA6QiCIpyEhIAQoArgBIh4gCUEwbGoiBiAbOgAkIAYgHDYCICAGIAg2AhwgBiAdNgIYIAYgODcCECAGIAc2AgwgBiAKNgIIIAZBETYCACAGIAQpA5gCNwAlIAZBLGogBCgAnwI2AAAgBCAJQQFqIgY2ArwBAkAgBiANRw0AIARBtAFqQbDumgEQ8xggBCgCuAEhHgsgHiAGQTBsaiIGICE2AgwgBiA6pzYCCCAGIAM2AgQgBkESNgIAIAQgCUECajYCvAEMDwsgBCgC4AEhBiADQQAQ1BwgCSADEPEiIAdBHEEEEL0TAkAgBkEJSw0AQQEgBnRBwgRxDQwLIARB4AFqEM0FDAsLAkAgCSkDAFANAEEAKAL89Z0BIgNFDQogCUEkaigCACEKIAkoAiAhByAEQeACaiADQQNBoO+aAUE9EPsNQQAtAOD2nQEaIAQoAuQCIQNBCBCEASIGRQ0RIAYgCjYCBCAGIAc2AgAgAygCHCADQSBqIgcoAgAQzCIgA0EsaiIKKAIAIANBMGooAgAQ7BwgAygCKCAKKAIAEM0iIApCBDcCACADQgE3AiQgByAGNgIAIANBATYCHCAEQfADakEIaiAEQeACakEIaigCADYCACAEIAQpAuACNwPwAyAEQfADahDGAiAEQfADahCwDQwKCyAEQcgCakEQaiAJQRhqKQMANwMAIARByAJqQQhqIAlBEGopAwA3AwAgBCAJKQMINwPIAiAEQTBqIARByAJqEIUHAkAgCS0AQA0AIAkoAjghBiAJKAI0IQogCSgCMCEHAkAgCSkDKCI4QgODQgBSDQAgOKciAyADKAIAIgNBAWo2AgAgA0F/TA0SCyAJLQA8IQggBEEwahCjDyEdQQAtAOD2nQEaQTgQhAEiA0UNESADQQA6ADQgAyAdNgIwIANCADcDKCADQQA2AiAgAyAIOgAcIAMgBjYCGCADIAo2AhQgAyAHNgIQIAMgODcCCCADQQA2AgBBAEEIEO8iQQAtAOD2nQEaIAkoAiQhCiAJKAIgIQdBHBCEASIGRQ0RIAZBgAQ7ARggBkEANgIUIAYgCjYCECAGIAc2AgwgBkEBNgIIIAYgAzYCBCAGQQE2AgBBAiEHQREhCAwJCwJAIDlCAFINACAXIBcoAgAiA0EBajYCACADQX9MDRELIAkoAjQhCCAJKAIwIR0CQCAJKQMoIjhCA4NCAFINACA4pyIDIAMoAgAiA0EBajYCACADQX9MDRELQQAtAOD2nQEaQcAAEIQBIgpFDRAgCkEAOgAcIAogAjYCGCAKQgA3AhAgCiABNwIIIApBGjYCAEEALQDg9p0BGkHAABCEASIDRQ0QIAMgBCkDMDcDACADQThqIARBMGpBOGopAwA3AwAgA0EwaiAEQTBqQTBqKQMANwMAIANBKGogBEEwakEoaikDADcDACADQSBqIARBMGpBIGopAwA3AwAgA0EYaiAEQTBqQRhqKQMANwMAIANBEGogBEEwakEQaikDADcDACADQQhqIARBMGpBCGopAwA3AwAgCSgCICEHIAkoAiQhBkEALQDg9p0BGkHAABCEASI3RQ0QIDdBADoAPCA3IAM2AjggN0IANwMwIDcgCjYCKCA3QgA3AyAgNyAINgIcIDcgHTYCGCA3IDg3AxAgN0EANgIIIDdBATYCAEESIQgMCAsgBEHgAmpBMGogBEHgAWpBMGopAwA3AwAgBEHgAmpBKGogBEHgAWpBKGopAwA3AwAgBEHgAmpBIGogBEHgAWpBIGopAwA3AwAgBEHgAmpBGGogBEHgAWpBGGopAwA3AwAgBEHgAmpBEGogBEHgAWpBEGopAwA3AwAgBEHgAmpBCGogBEHgAWpBCGopAwA3AwAgBCAEKQPgATcD4AJBACgC/PWdASIJRQ0FIBIhAyARIQYCQAJAAkACQAJAAkAgBCgC4AIiCg4KBQECAQMDBAMDAAULIBEhAyAQIQYCQAJAAkACQAJAIAQoAugCDhMJAAABAAYGBgECBgMBAQkCAgQGCQsgFiEDIBMhBgwICyASIQMgESEGDAcLIBAhAyAPIQYMBgsgBCgC7AIiA0H8AGohBiADQfgAaiEDDAULAkACQAJAAkACQAJAAkAgBCgC8AIOCAABAgMEBAUGAAsgBCgCkAMiA0EoaiEGIANBJGohAwwKCyAEKAKQAyIDQTRqIQYgA0EwaiEDDAkLIAQoAvQCIgNBEGohBiADQQxqIQMMCAsgBCgC9AIiA0EQaiEGIANBDGohAwwHCyAEKAL0AiIDQQRqIQYMBgsgBCgC9AIiA0EcaiEGIANBGGohAwwFCyAEKAL0AiIDQcwAaiEGIANByABqIQMMBAsgFSEDIBQhBgwDCyATIQMgEiEGDAILIBohAyAWIQYMAQsgBCgC5AIiA0EkaiEGIANBIGohAwsgAygCACEHIAYoAgAhCCAEQfADaiAJQQNB3e+aAUE/EPsNQQAtAOD2nQEaIAQoAvQDIQNBCBCEASIGRQ0PIAYgCDYCBCAGIAc2AgAgAygCHCADQSBqIgcoAgAQzCIgA0EsaiIJKAIAIANBMGooAgAQ7BwgAygCKCAJKAIAEM0iIAlCBDcCACADQgE3AiQgByAGNgIAIANBATYCHCAEQcgDakEIaiAEQfADakEIaigCADYCACAEIAQpAvADNwPIAyAEQcgDahDGAiAEQcgDahCwDSAKQQlGDQYgBEHgAWoQzQUMDQsCQCAEKAK8ASIGIAQoArQBRw0AIARBtAFqQfDumgEQ8xgLIAQoArgBIAZBMGxqIgMgGzoAHCADIBw2AhggAyAINgIUIAMgHTYCECADIDg3AwggAyAHNgIEIAMgCjYCACADIAQpA9ABNwAdIAMgOjcDKCADQSRqIAQoANcBNgAAIAQgBkEBajYCvAEMCwsgBEGEA2ogA0EHaigAADYAACAEIBs6APwCIAQgHDYC+AIgBCAINgL0AiAEIB02AvACIAQgODcD6AIgBCAHNgLkAiAEIAo2AuACIAQgAykAADcA/QIgBEEBNgL0AyAEQcijmwE2AvADIARCATcC/AMgBEHeBq1CIIYgBEHgAmqthDcDyAMgBCAEQcgDajYC+AMgBEHwA2pB0O6aARCoHQALIARB4AJqQSBqIARBmARqKQMANwMAIARB4AJqQRhqIARB8ANqQSBqKQMANwMAIARB4AJqQRBqIARB8ANqQRhqKQMANwMAIARB6AJqIARB8ANqQRBqKQMANwMAIAQgBCkD+AM3A+ACQbSqmwFBKyAEQeACakGA75oBQZDvmgEQ6hAACyAGIAQoAugCQYCdmwEQ2CAACyAEQeACakEgaiAEQZgEaikDADcDACAEQeACakEYaiAEQfADakEgaikDADcDACAEQeACakEQaiAEQfADakEYaikDADcDACAEQegCaiAEQfADakEQaikDADcDACAEIAQpA/gDNwPgAkG0qpsBQSsgBEHgAmpBgO+aAUGQ75oBEOoQAAsgBCgC4AJBCUYNACAEQeABahDNBQwHCyAaEOkDDAYLAkAgBCgCvAEiCiAEKAK0AUcNACAEQbQBakHg7poBEPMYCyAEKAK4ASAKQTBsaiIDIAY2AgwgAyAHNgIIIAMgNzYCBCADIAg2AgAgBCAKQQFqNgK8AQsCQCAJKQMoIjhCA4NCAFINACA4pyIDIAMoAgAiBkF/ajYCACAGQQFHDQAgAyADKAIQEOkdCwJAIAkpAwBQDQAgCRCqEQsgCUHIAEEIEL0TDAMLIA0gDkYNBgwECyADKAIAIQpBASEdQQAhNAsgBygCECENIAcoAgwhGwJAIAQoArwBIgggBCgCtAFHDQAgBEG0AWpBwO6aARDzGAsgBCgCuAEgCEEwbGoiBiANNgIMIAYgGzYCCCAGIAo2AgQgBkESNgIAIAQgCEEBajYCvAECQCAdRQ0AIAMgNBDUHCAJIAMQ8SILIAdBHEEEEL0TCwJAIAQoAuABIgNBCUsNAEEBIAN0QcIEcQ0BCyAEQeABahDNBQsgBCgCxAEiDSAEKALMASIORg0CDAALCwALIARBwAFqEIEZIABBCGogBEG0AWpBCGooAgA2AgAgACAEKQK0ATcCACAAQQA2AhQgACALNgIQIAAgDDYCDEEAQQgQ9iIgOUIAUg0AIAGnIgMgAygCACIFQX9qNgIAIAVBAUcNACADIAMoAhAQ6R0LIARBoARqJAAL4zICFH8EfiMAQbABayICJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAEoAgAOFAABAgMEBQYHCAkKCwwNDg8QERITAAtB4ABFDRMgACABQeAA/AoAAAwTC0HgAEUNEiAAIAFB4AD8CgAADBILAkACQCABKAIEQYCAgIB4Rg0AIAEoAhghAyABKAIUIQQgAkHQAGogASgCCCABKAIMEN4CQQAhBQJAIAEoAhwiBkUNACAGEOQfIgUQywYLQQAtAOD2nQEaQQwQhAEiBkUNG0EALQDg9p0BGiABKAIQIgcoAgghCCAHKAIEIQlB4AAQhAEiCkUNGyAKIAcoAgAQZSAGIAg2AgggBiAJNgIEIAYgCjYCACABLQAgIQcgAigCUCEBIAIpAlQhFgwBCyABKAIcIQUgASgCGCEDIAJB0ABqIAEoAgwgASgCEBDeAkEAIQcCQCABKAIgIgRFDQAgBBDkHyIHEMsGC0EALQDg9p0BGkEMEIQBIgRFDRpBAC0A4PadARogASgCFCIBKAIIIQogASgCBCEIQeAAEIQBIgZFDRogBiABKAIAEGUgBCAKNgIIIAQgCDYCBCAEIAY2AgAgAikDUCEWIAIoAlghBkGAgICAeCEBCyAAIAc2AiAgACAFNgIcIAAgAzYCGCAAIAQ2AhQgACAGNgIQIAAgFjcDCCAAIAE2AgQgAEECNgIADBELIAEoAgwhCCABKAIIIQkgAkEoaiABQRBqEJgJAkACQCABKAIoIgQNAEEAIQMMAQtBAC0A4PadARpBFBCEASIDRQ0ZIAQoAgQhASAEKAIQIQsgBCgCDCEMIAJB0ABqIAQoAggiDUEEQQQQow4gAigCVCEKIAIoAlBBAUYNEiACKAJYIQ4CQCAKRQ0AIA1BAnQhBCAOIQYgCiEHA0AgBEUNAUEALQDg9p0BGkHgABCEASIFRQ0bIAJB0ABqIAEoAgAQZQJAQeAARQ0AIAUgAkHQAGpB4AD8CgAACyAGIAU2AgAgBkEEaiEGIARBfGohBCABQQRqIQEgB0F/aiIHDQALCyADIAs2AhAgAyAMNgIMIAMgDTYCCCADIA42AgQgAyAKNgIACyAAIAIpAyg3AxAgAEEgaiACQShqQRBqKQMANwMAIABBGGogAkEwaikDADcDACAAIAM2AiggACAINgIMIAAgCTYCCCAAQQM2AgAMEAtBBCEKIAEoAgwhDiABKAIIIQsCQAJAIAEtAEQiBEEERg0AIAEoAiQhDCABKAIgIQ8gASgCFCEQIAEoAhAhEQJAIAEpAxgiF0IDg0IAUg0AIBenIgYgBigCACIGQQFqNgIAIAZBf0wNGgsCQCABKQMoIhZQDQAgFkIDg0IAUg0AIBanIgYgBigCACIGQQFqNgIAIAZBf0wNGgtBAyEKAkAgBEEDRg0AIAJB0ABqIAFBMGoQmAkgAkEQakEQaiACQdAAakEQaigCADYCACACQRBqQQhqIAJB0ABqQQhqKQMANwMAIAJBDmogAkHnAGotAAA6AAAgAiACKQNQNwMQIAIgAi8AZTsBDCACLQBkIQoLQQAhCEEAIQkCQCABKAJIRQ0AIAFByABqEMkKIQkLAkAgASgCTA0ADAILIAJB0ABqIAFBzABqEPQVIAIpAlQhGCACKAJQIQgMAQsgAkHQAGogAUEQahCYCSACKAJkIQwgAigCYCEPIAIpA1ghFyACKAJUIRAgAigCUCERCwJAAkAgASgCWCIEDQBBACEDDAELQQAtAOD2nQEaQRQQhAEiA0UNGCAEKAIEIQEgBCgCECESIAQoAgwhEyACQdAAaiAEKAIIIhRBBEEEEKMOIAIoAlQhDSACKAJQQQFGDRIgAigCWCEVAkAgDUUNACAUQQJ0IQQgFSEGIA0hBwNAIARFDQFBAC0A4PadARpB4AAQhAEiBUUNGiACQdAAaiABKAIAEGUCQEHgAEUNACAFIAJB0ABqQeAA/AoAAAsgBiAFNgIAIAZBBGohBiAEQXxqIQQgAUEEaiEBIAdBf2oiBw0ACwsgAyASNgIQIAMgEzYCDCADIBQ2AgggAyAVNgIEIAMgDTYCAAsgACACKQMQNwMwIAAgAi8BDDsARSAAIAM2AlggACAYNwNQIAAgCDYCTCAAIAk2AkggACAKOgBEIAAgFjcDKCAAIAw2AiQgACAPNgIgIAAgFzcDGCAAIBA2AhQgACARNgIQIAAgDjYCDCAAIAs2AgggAEHAAGogAkEgaigCADYCACAAQThqIAJBGGopAwA3AwAgAEHHAGogAkEOai0AADoAACAAQQQ2AgAMDwsgASgCCCEEIAEoAhQhCCABKAIQIQkgAkHQAGogASgCDCIDQQhBOBCjDiACKAJUIQcgAigCUEEBRg0RIAIoAlghCgJAIAdFDQAgA0E4bCEGIAohASAHIQUDQCAGRQ0BIAJB0ABqIAQQzAEgAUEwaiACQdAAakEwaikDADcDACABQShqIAJB0ABqQShqKQMANwMAIAFBIGogAkHQAGpBIGopAwA3AwAgAUEYaiACQdAAakEYaikDADcDACABQRBqIAJB0ABqQRBqKQMANwMAIAFBCGogAkHQAGpBCGopAwA3AwAgASACKQNQNwMAIAZBSGohBiABQThqIQEgBEE4aiEEIAVBf2oiBQ0ACwsgACAINgIUIAAgCTYCECAAIAM2AgwgACAKNgIIIAAgBzYCBCAAQQU2AgAMDgtBAC0A4PadARogASgCDCEGIAEoAgghBUHgABCEASIERQ0VIAQgASgCBBBlIAAgBjYCDCAAIAU2AgggACAENgIEIABBBjYCAAwNCyABKAIIIQ4gASgCFCEQIAEoAhAhESACQdAAaiABKAIMIg9BCEE4EKMOIAIoAlQhDCACKAJQQQFGDRAgAigCWCENAkAgDEUNACAPQThsIQsgAkHQAGpBBHIhBkEAIQQgDCEDA0AgCyAERg0BIA4gBGoiAUEsaigCACEKIAFBKGooAgAhCEEHIQUCQCABKAIAQQdGDQAgAkHQAGogARC1AiACQShqQQhqIAZBCGopAgA3AwAgAkEoakEQaiAGQRBqKQIANwMAIAJBKGpBGGogBkEYaikCADcDACACQShqQSBqIAZBIGooAgA2AgAgAiAGKQIANwMoIAIoAlAhBQtBAC0A4PadARpB4AAQhAEiB0UNFiACQdAAaiABQTBqKAIAEGUCQEHgAEUNACAHIAJB0ABqQeAA/AoAAAsgAkHQAGpBIGogAkEoakEgaigCACIJNgIAIAJB0ABqQRhqIAJBKGpBGGopAwAiFjcDACACQdAAakEQaiACQShqQRBqKQMAIhc3AwAgAkHQAGpBCGogAkEoakEIaikDACIYNwMAIAIgAikDKCIZNwNQIA0gBGoiASAFNgIAIAFBBGogGTcCACABQQxqIBg3AgAgAUEUaiAXNwIAIAFBHGogFjcCACABQSRqIAk2AgAgAUEwaiAHNgIAIAFBLGogCjYCACABQShqIAg2AgAgBEE4aiEEIANBf2oiAw0ACwsgACAQNgIUIAAgETYCECAAIA82AgwgACANNgIIIAAgDDYCBCAAQQc2AgAMDAtBAC0A4PadARogASgCDCEGIAEoAgghBUHgABCEASIERQ0TIAQgASgCBBBlIAAgBjYCDCAAIAU2AgggACAENgIEIABBCDYCAAwLC0EALQDg9p0BGiABKAIMIQYgASgCCCEFQeAAEIQBIgRFDRIgBCABKAIEEGUgACAGNgIMIAAgBTYCCCAAIAQ2AgQgAEEJNgIADAoLIAEoAhAhCCABKAIMIQUgASgCGCEJIAEoAhQhDQJAAkAgASgCBEEBRw0AIAJB0ABqIAhBBEEEEKMOIAIoAlQhCiACKAJQQQFGDRAgAigCWCEGQQEhDgJAIAoNAEEAIQoMAgsgCEECdCEDQQAhASAKIQcDQCADIAFGDQJBAC0A4PadARpB4AAQhAEiBEUNFCACQdAAaiAFIAFqKAIAEGUCQEHgAEUNACAEIAJB0ABqQeAA/AoAAAsgBiABaiAENgIAIAFBBGohASAHQX9qIgcNAAwCCwsgAkHQAGogCEEEQQQQow4gAigCVCEKIAIoAlBBAUYNECACKAJYIQYCQCAKDQBBACEKQQAhDgwBCyAIQQJ0IQNBACEOQQAhASAKIQcDQCADIAFGDQFBAC0A4PadARpB4AAQhAEiBEUNEyACQdAAaiAFIAFqKAIAEGUCQEHgAEUNACAEIAJB0ABqQeAA/AoAAAsgBiABaiAENgIAIAFBBGohASAHQX9qIgcNAAsLIAAgCTYCGCAAIA02AhQgACAINgIQIAAgBjYCDCAAIAo2AgggACAONgIEIABBCjYCAAwJC0EALQDg9p0BGiABKAIYIQMgASgCFCEKQeAAEIQBIgRFDRAgBCABKAIEEGVBAC0A4PadARpB4AAQhAEiBkUNECAGIAEoAggQZUEALQDg9p0BGkHgABCEASIFRQ0QIAUgASgCDBBlQQAtAOD2nQEaQeAAEIQBIgdFDRAgByABKAIQEGUgACADNgIYIAAgCjYCFCAAIAc2AhAgACAFNgIMIAAgBjYCCCAAIAQ2AgQgAEELNgIADAgLIAEoAighBSABKAIkIQcgASgCICEDIAEoAhQhCiABKAIQIQggASgCDCEJIAEoAgghDQJAIAEpAxgiFkIDg0IAUg0AIBanIgQgBCgCACIEQQFqNgIAIARBf0wNEAsgAS0AOiEOIAEtADkhCyABLQA4IQwgAS0ALCEPQQAhBkEAIQQCQCABKAIwIhBFDQBBAC0A4PadARpB4AAQhAEiBEUNECAEIBAQZQsCQCABKAI0IgFFDQBBAC0A4PadARpB4AAQhAEiBkUNECAGIAEQZQsgACAOOgA6IAAgCzoAOSAAIAw6ADggACAGNgI0IAAgBDYCMCAAIA86ACwgACAFNgIoIAAgBzYCJCAAIAM2AiAgACAWNwMYIAAgCjYCFCAAIAg2AhAgACAJNgIMIAAgDTYCCCAAQQw2AgAMBwtBAC0A4PadARogASgCDCEGIAEoAgghBUHgABCEASIERQ0OIAQgASgCBBBlIAAgBjYCDCAAIAU2AgggACAENgIEIABBDTYCAAwGC0EALQDg9p0BGiABLQAQIQYgASgCDCEFIAEoAgghB0HgABCEASIERQ0NIAQgASgCBBBlIAAgBjoAECAAIAU2AgwgACAHNgIIIAAgBDYCBCAAQQ42AgAMBQtBAC0A4PadARogAS0AFCEFIAEoAhAhByABKAIMIQNB4AAQhAEiBEUNDCAEIAEoAgQQZUEALQDg9p0BGkHgABCEASIGRQ0MIAYgASgCCBBlIAAgBToAFCAAIAc2AhAgACADNgIMIAAgBjYCCCAAIAQ2AgQgAEEPNgIADAQLIAEoAighAyABKAIkIQogASgCICEIIAEoAhQhCSABKAIQIQ0gAS0ASCEOIAEoAgwhCyABKAIIIQwCQCABKQMYIhZCA4NCAFINACAWpyIEIAQoAgAiBEEBajYCACAEQX9MDQwLIAEtADohDyABLQA5IRAgAS0AOCERIAEtACwhFEEAIQZBACEEAkAgASgCMCIFRQ0AQQAtAOD2nQEaQeAAEIQBIgRFDQwgBCAFEGULAkAgASgCNCIFRQ0AQQAtAOD2nQEaQeAAEIQBIgZFDQwgBiAFEGULQQAhB0EAIQUCQCABKAJAIhVFDQBBAC0A4PadARpB4AAQhAEiBUUNDCAFIBUQZQsgAS0ASSEVAkAgASgCRCIBRQ0AQQAtAOD2nQEaQeAAEIQBIgdFDQwgByABEGULIAAgDzoAOiAAIBA6ADkgACAROgA4IAAgBjYCNCAAIAQ2AjAgACAUOgAsIAAgAzYCKCAAIAo2AiQgACAINgIgIAAgFjcDGCAAIAk2AhQgACANNgIQIAAgFToASSAAIA46AEggACAHNgJEIAAgBTYCQCAAIAs2AgwgACAMNgIIIABBEDYCAAwDCyABKAIsIQcgASgCKCEDAkACQAJAAkACQAJAIAEoAggiBkGAgICAeHMiBEEEIARBBEkbDgUAAQIDBAALIAEpAxghFyABKAIUIQogASgCECEIIAEpAyAiFqchBAJAIBZQDQAgFkIDg1BFDQAgBCAEKAIAIgFBAWo2AgAgAUF/TA0QCyAWQiCIpyENIBdCIIinIQkgF6chBUGAgICAeCEGDAQLIAEoAhwhCSABKAIYIQUCQCABKQMQIhdCA4NCAFINACAXpyIEIAQoAgAiBEEBajYCACAEQX9MDQ8LIAEpAyAiFqchBAJAIBZQDQAgFkIDg1BFDQAgBCAEKAIAIgFBAWo2AgAgAUF/TA0PCyAWQiCIpyENIBdCIIinIQogF6chCEGBgICAeCEGDAMLIAEpAxgiFkIgiKchCSABKQMQIhdCIIinIQogASgCJCENIAEoAiAhBCABKAIMIQEgFqchBSAXpyEIDAILQQAtAOD2nQEaIAEoAhQhCiABKAIQIQhBEBCEASIERQ0MIAEoAiAiBkEEaigCACEOIAYtAAwhCSACIAZBCGooAgAiBkEEQQRBuOSbARCoFSACKAIAIQ0gAigCBCEFAkAgBkECdCILRQ0AIAUgDiAL/AoAAAsgBCAJOgAMIAQgBjYCCCAEIAU2AgQgBCANNgIAIAEpAxgiFqchBQJAIBZQDQAgFkIDg1BFDQAgBSAFKAIAIgFBAWo2AgAgAUF/TA0NCyAWQiCIpyEJQYOAgIB4IQYMAQsgASgCJCENIAEoAiAhBCACQShqIAFBCGoQhQwgAkHQAGogASgCGCABKAIcEJ4JIAIpAlQiFkIgiKchCSACKAJQIQogAigCMCEIIAIoAiwhASACKAIoIQYgFqchBQsgACAHNgIsIAAgAzYCKCAAIA02AiQgACAENgIgIAAgATYCDCAAIAY2AgggAEERNgIAIAAgCa1CIIYgBa2ENwMYIAAgCq1CIIYgCK2ENwMQDAILIAEtACwhBiABKAIkIQUgASgCICEHAkACQCABLQAcIgNBAkYNACABKAIYIQogASgCFCEIIAEoAhAhCSABKQMIIhZCA4NCAFINASAWpyIEIAQoAgAiBEEBajYCACAEQX9KDQEMCwsgAkHQAGpBAmogAUEfai0AADoAACACIAEvAB07AVAgASgCGCEKIAEoAhQhCCABKAIQIQkgASkDCCEWCwJAAkAgASgCKCIEDQBBACEBDAELQQAtAOD2nQEaQQwQhAEiAUUNCkEALQDg9p0BGiAEKAIIIQ4gBCgCBCELQeAAEIQBIg1FDQogDSAEKAIAEGUgASAONgIIIAEgCzYCBCABIA02AgALIAAgAi8BUDsAHSAAQR9qIAJB0gBqLQAAOgAAIAAgBjoALCAAIAE2AiggACAFNgIkIAAgBzYCICAAIAM6ABwgACAKNgIYIAAgCDYCFCAAIAk2AhAgACAWNwMIIABBEjYCAAwBCyABKAIcIQ4gASgCGCELIAEoAgwhDCABKAIIIQ8CQCABKQMQIhdCA4NCAFINACAXpyIEIAQoAgAiBEEBajYCACAEQX9MDQkLAkAgASkDICIWUA0AIBZCA4NCAFINACAWpyIEIAQoAgAiBEEBajYCACAEQX9MDQkLQQMhCQJAIAEtADxBA0YNACACQdAAaiABQShqEJgJIAJBKGpBEGogAkHQAGpBEGooAgA2AgAgAkEoakEIaiACQdAAakEIaikDADcDACACQQpqIAJB5wBqLQAAOgAAIAIgAikDUDcDKCACIAIvAGU7AQggAi0AZCEJC0EAIQhBACEKAkAgASgCQCIGRQ0AQQAtAOD2nQEaQRQQhAEiCkUNCSAGKAIEIQQgBigCECEUIAYoAgwhFSACQdAAaiAGKAIIIhBBBEEEEKMOIAIoAlQhDSACKAJQQQFGDQggAigCWCERAkAgDUUNACAQQQJ0IQYgESEFIA0hAwNAIAZFDQFBAC0A4PadARpB4AAQhAEiB0UNCyACQdAAaiAEKAIAEGUCQEHgAEUNACAHIAJB0ABqQeAA/AoAAAsgBSAHNgIAIAVBBGohBSAGQXxqIQYgBEEEaiEEIANBf2oiAw0ACwsgCiAUNgIQIAogFTYCDCAKIBA2AgggCiARNgIEIAogDTYCAAsCQAJAIAEoAkQiBA0ADAELQQAtAOD2nQEaIAEpA0ghGEEUEIQBIghFDQkgBCkCDCEZIAggBCgCBCAEKAIIEM4HIAggGTcCDAsgACACKQMoNwMoIAAgAi8BCDsAPSAAQThqIAJBOGooAgA2AgAgAEEwaiACQTBqKQMANwMAIABBP2ogAkEKai0AADoAACAAIBg3A0ggACAINgJEIAAgCjYCQCAAIAk6ADwgACAWNwMgIAAgDjYCHCAAIAs2AhggACAXNwMQIAAgDDYCDCAAIA82AgggAEETNgIACyACQbABaiQADwsgCiACKAJYQYikmgEQ2CAACyANIAIoAlhBiKSaARDYIAALIAcgAigCWEGIpJoBENggAAsgDCACKAJYQYikmgEQ2CAACyAKIAIoAlhBiKSaARDYIAALIAogAigCWEGIpJoBENggAAsgDSACKAJYQYikmgEQ2CAACwALpDICB38BfiMAQcABayIEJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAFBAXFFDQACQAJAAkACQAJAAkACQAJAAkAgAygCACIBLQAUIgVBAkYNACAFQQFxDQAgBEGYAWogARClECAEKAKYAUEQRg0KIARBEGpBGGoiBSAEQZgBakEYaiIGKAIANgIAIARBEGpBEGogBEGYAWpBEGopAgA3AwAgBEEQakEIaiIHIARBmAFqQQhqIgMpAgA3AwAgBCAEKQKYATcDECAEQdgAaiAEQRBqEPcRIARBmAFqIAEQpRAgBCgCmAFBEEYNCyAFIAYoAgA2AgAgBEEQakEQaiIFIARBmAFqQRBqIgYpAgA3AwAgByADKQIANwMAIAQgBCkCmAE3AxAgBEGIAWogBEEQahD3ESAEQZgBaiABEKUQIAQoApgBQRBGDQwgBEEQakEYaiAEQZgBakEYaigCADYCACAFIAYpAgA3AwAgBEEQakEIaiAEQZgBakEIaikCADcDACAEIAQpApgBNwMQIARB6ABqIARBEGoQ9xECQCABLQAQQQFxRQ0AIARB2ABqEPkHIARBiAFqEPkHCyACLQAgDgMBAgMBCyAEQZgBaiABEKUQIAQoApgBQRBGDQwgBEEQakEYaiIFIARBmAFqQRhqIgYoAgA2AgAgBEEQakEQaiAEQZgBakEQaikCADcDACAEQRBqQQhqIgcgBEGYAWpBCGoiAykCADcDACAEIAQpApgBNwMQIARB2ABqIARBEGoQ+BEgBEGYAWogARClECAEKAKYAUEQRg0NIAUgBigCADYCACAEQRBqQRBqIgUgBEGYAWpBEGoiBikCADcDACAHIAMpAgA3AwAgBCAEKQKYATcDECAEQYgBaiAEQRBqEPgRIARBmAFqIAEQpRAgBCgCmAFBEEYNDiAEQRBqQRhqIARBmAFqQRhqKAIANgIAIAUgBikCADcDACAEQRBqQQhqIARBmAFqQQhqKQIANwMAIAQgBCkCmAE3AxAgBEHoAGogBEEQahD4EQJAIAEtABBBAXFFDQAgBEHYAGoQ+gQgBEGIAWoQ+gQLIAItACAOAwQFBgQLIARBiAFqIARB2ABqEIgHDAILIARBiAFqIARB2ABqEN0DDAELIARBmAFqIAQoAowBIAQoApABEPMRIAQgBC0AlAE6AKQBIARBmAFqIARB2ABqEIgHIARBiAFqIARB2ABqEKMLIARBiAFqIARBmAFqEN0DIAQoApgBIAQoApwBQQFBAhDQEgsgBEHoAGogBEGIAWoQowsgBEGkAWogBEHwAGopAgA3AgAgBCAEKQJoNwKcASAEQQo2ApgBIAEgBEGYAWoQrg8gBCgCiAEgBCgCjAFBAUECENASIAQoAlggBCgCXEEBQQIQ0BIMGwsgBEGIAWogBEHYAGoQiQcMAgsgBEGIAWogBEHYAGoQsQMMAQsgBEGYAWogBCgCjAEgBCgCkAEQxhEgBCAELQCUAToApAEgBEGYAWogBEHYAGoQiQcgBEGIAWogBEHYAGoQxgsgBEGIAWogBEGYAWoQsQMgBCgCmAEgBCgCnAFBBEEIENASCyAEQegAaiAEQYgBahDGCyAEQaQBaiAEQegAakEIaikCADcCACAEIAQpAmg3ApwBIARBCTYCmAEgASAEQZgBahCuDyAEKAKIASAEKAKMAUEEQQgQ0BIgBCgCWCAEKAJcQQRBCBDQEgwXCwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAigCACIFQYCAvH9qIgFBAiABQQhJGw4IKgABAg0DBCoqCyACQQRqIQEgAygCACIGLQAUIgVBAkYNBCAFQQFxDQQgBEGYAWogBhClECAEKAKYAUEQRg0ZIARB6ABqQRhqIARBmAFqQRhqKAIANgIAIARB6ABqQRBqIARBmAFqQRBqKQIANwMAIARB6ABqQQhqIARBmAFqQQhqKQIANwMAIAQgBCkCmAE3A2ggBEGIAWogBEHoAGoQ9xEgBEGYAWogAyABEOgLIAQtAJwBIQUgBCgCmAEiAUGAgICAeEYNEgJAQSNFDQAgBEEQaiAEQZ0BakEj/AoAAAsgBCgCiAEgBCgCjAFBAUECENASDCoLIAMoAgAiBi0AFCIBQQJGDQQgAUEBcQ0EIARBmAFqIAYQpRAgBCgCmAFBEEYNGiAEQegAakEYaiAEQZgBakEYaigCADYCACAEQegAakEQaiAEQZgBakEQaikCADcDACAEQegAakEIaiAEQZgBakEIaikCADcDACAEIAQpApgBNwNoIARBiAFqIARB6ABqEPcRIARBmAFqIAMgAhDoCyAELQCcASEFIAQoApgBIgFBgICAgHhGDQVBI0UNBiAEQRBqIARBnQFqQSP8CgAADAYLAkAgAygCACIILQAUIgFBAkYNACABQQFxRQ0HCyAEIAItABwQzRwCQCAEKAIEIgcgBCgCACIBayIFQf7///8DSw0AIAVBAnQiBkH9////B0kNCAtBgJ2bARCBHAALIAJBBGohASADKAIAIgYtABQiBUECRg0LIAVBAXENCyAEQZgBaiADIAEQsAcgBCAEKQCdATcDaCAEIARBpAFqKQAANwBvIAQtAJwBIQUgBCgCmAEiAUGAgICAeEYNCiAEQS9qIARBvAFqKAIANgAAIARBJ2ogBEG0AWopAgA3AAAgBCAEKQKsATcAHyAEIAQpA2g3AxAgBCAEKQBvNwAXDCcLIAMoAgAiBS0AFCIBQQJGDQsgAUEBcQ0LIARBmAFqIAUQpRAgBCgCmAFBEEYNISAEQegAakEYaiAEQZgBakEYaigCADYCACAEQegAakEQaiAEQZgBakEQaikCADcDACAEQegAakEIaiAEQZgBakEIaikCADcDACAEIAQpApgBNwNoIARB2ABqIARB6ABqEPcRIARBmAFqIAMgAigCBCIBQdgAaiABLQBwIARB2ABqEIARIAQoApgBIgFBgICAgHhGDQwgBC0AnAEhBQJAQSNFDQAgBEEQaiAEQZ0BakEj/AoAAAsgBCgCWCAEKAJcQQFBAhDQEgwmCyAEQZgBaiAGEKUQIAQoApgBQRBGDRUgBEHoAGpBGGogBEGYAWpBGGooAgA2AgAgBEHoAGpBEGogBEGYAWpBEGopAgA3AwAgBEHoAGpBCGogBEGYAWpBCGopAgA3AwAgBCAEKQKYATcDaCAEQYgBaiAEQegAahD4ESAEQYgBaiABKAIAIgEgARDRFyAEQaQBaiAEQYgBakEIaikCADcCACAEIAQpAogBNwKcASAEQQk2ApgBIAYgBEGYAWoQrg8MJAsgBEGYAWogBhClECAEKAKYAUEQRg0WIARB6ABqQRhqIARBmAFqQRhqKAIANgIAIARB6ABqQRBqIARBmAFqQRBqKQIANwMAIARB6ABqQQhqIARBmAFqQQhqKQIANwMAIAQgBCkCmAE3A2ggBEGIAWogBEHoAGoQ+BEgBEGIAWogBSACKAIgIgEgBSABSRsgBSABIAUgAUsbENEXIARBpAFqIARBiAFqQQhqKQIANwIAIAQgBCkCiAE3ApwBIARBCTYCmAEgBiAEQZgBahCuDwwjCyAEQZgBaiADIAJBIGoQ6AsgBC0AnAEhByAEKAKYASIBQYCAgIB4Rg0WAkBBI0UNACAEQRBqIARBnQFqQSP8CgAACyAHIQULIAQoAogBIAQoAowBQQFBAhDQEgwiCyAEQQhqIAItABwQzRwgBCgCDCIFIAQoAggiAWsiBkF/TA0VAkACQCAFIAFHDQBBACEJIARBADYCoAEgBEKAgICAEDcDmAEMAQtBACEJQQAtAOD2nQEaIAYQhAEiBUUNFyAEQQA2AqABIAQgBTYCnAEgBCAGQQF2Igo2ApgBA0AgBUEBaiABLQAAIgYgAUEBai0AACIHIAYgB0sbOgAAIAUgBiAHIAYgB0kbOgAAIAVBAmohBSABQQJqIQEgCiAJQQFqIglHDQALCyAEKQOYASELIARBmAFqQQhqIgEgCTYCACAEIAlFOgCkASAEIAs3A5gBIARBmAFqEIMFIARBiAFqQQhqIgUgASkDADcDACAEIAQpA5gBNwOIASAEQZgBaiADIAJBBGogAi0AHSAEQYgBahCAESAEKAKYASIBQYCAgIB4Rg0BIARB6ABqQQhqIgYgBEG0AWopAgA3AwAgBEH4AGoiByAEQbwBaigCADYCACAEIAQpAJ0BNwNIIAQgBCkCrAE3A2ggBCAEQaQBaikAADcATyAELQCcASEFIAQoAogBIAQoAowBQQFBAhDQEiAEQSdqIAYpAwA3AAAgBEEvaiAHKAIANgAAIAQgBCkATzcAPyAEIAQpA0g3AzggBCAEKQNoNwAfIAQgBCkDODcDECAEIAQpAD83ABcMIQsgBUEBdiEJQQAhAwJAAkAgBg0AQQQhBUEAIQYMAQtBAC0A4PadARogBhCEASIFRQ0WIAkhBgsgBEEANgKgASAEIAU2ApwBIAQgBjYCmAECQCABIAdGDQBBACEDA0AgBUEEaiABLQAAIgYgAUEBai0AACIHIAYgB0sbNgIAIAUgBiAHIAYgB0kbNgIAIAVBCGohBSABQQJqIQEgCSADQQFqIgNHDQALCyAEKQOYASELIARBmAFqQQhqIgEgAzYCACAEIANFOgCkASAEIAs3A5gBIARBmAFqEJUFIARBiAFqQQhqIgUgASkDADcDACAEIAQpA5gBNwOIASAEQZgBaiAIIAItAB0gBEGIAWoQ1B0gBCgCmAEiAUGAgICAeEYNASAEQegAakEIaiIGIARBtAFqKQIANwMAIARB+ABqIgcgBEG8AWooAgA2AgAgBCAEKQCdATcDSCAEIAQpAqwBNwNoIAQgBEGkAWopAAA3AE8gBC0AnAEhBSAEKAKIASAEKAKMAUEEQQgQ0BIgBEEnaiAGKQMANwAAIARBL2ogBygCADYAACAEIAQpAE83AD8gBCAEKQNINwM4IAQgBCkDaDcAHyAEIAQpAzg3AxAgBCAEKQA/NwAXDCALIAQgBCkAiQE3A0ggBCAFKQAANwBPIAQgBCkATzcAPyAEIAQpA0g3AzggBEHYAGpBCGogBCkAPzcAACAEIAQtAIgBOgBYIAQgBCkDODcAWSAEQZgBaiAIEKUQIAQoApgBQRBGDRUgBEHoAGpBGGogBEGYAWpBGGooAgA2AgAgBEHoAGpBEGogBEGYAWpBEGopAgA3AwAgBEHoAGpBCGogBEGYAWpBCGopAgA3AwAgBCAEKQKYATcDaCAEQYgBaiAEQegAahD3ESAEQYgBaiAEQdgAahCjCyAEQaQBaiAEQYgBakEIaikCADcCACAEIAQpAogBNwKcASAEQQo2ApgBIAggBEGYAWoQrg8gBCgCWCAEKAJcQQFBAhDQEgweCyAEIAQpAIkBNwNIIAQgBSkAADcATyAEIAQpAE83AD8gBCAEKQNINwM4IARB2ABqQQhqIAQpAD83AAAgBCAELQCIAToAWCAEIAQpAzg3AFkgBEGYAWogCBClECAEKAKYAUEQRg0VIARB6ABqQRhqIARBmAFqQRhqKAIANgIAIARB6ABqQRBqIARBmAFqQRBqKQIANwMAIARB6ABqQQhqIARBmAFqQQhqKQIANwMAIAQgBCkCmAE3A2ggBEGIAWogBEHoAGoQ+BEgBEGIAWogBEHYAGoQxgsgBEGkAWogBEGIAWpBCGopAgA3AgAgBCAEKQKIATcCnAEgBEEJNgKYASAIIARBmAFqEK4PIAQoAlggBCgCXEEEQQgQ0BIMHQsgBEGYAWogAyACQQRqEOkBIAQgBCkAnQE3A2ggBCAEQaQBaikAADcAbyAELQCcASEFAkAgBCgCmAEiAUGAgICAeEYNACAEQS9qIARBvAFqKAIANgAAIARBJ2ogBEG0AWopAgA3AAAgBCAEKQKsATcAHyAEIAQpA2g3AxAgBCAEKQBvNwAXDB4LIARB2ABqQQhqIAQpAG83AAAgBCAFOgBYIAQgBCkDaDcAWSAEQZgBaiADKAIAIgEQpRAgBCgCmAFBEEYNFSAEQegAakEYaiAEQZgBakEYaigCADYCACAEQegAakEQaiAEQZgBakEQaikCADcDACAEQegAakEIaiAEQZgBakEIaikCADcDACAEIAQpApgBNwNoIARBiAFqIARB6ABqEPgRIARBiAFqIARB2ABqEMYLIARBpAFqIARBiAFqQQhqKQIANwIAIAQgBCkCiAE3ApwBIARBCTYCmAEgASAEQZgBahCuDyAEKAJYIAQoAlxBBEEIENASDBwLIARB2ABqQQhqIAQpAG83AAAgBCAFOgBYIAQgBCkDaDcAWSAEQZgBaiAGEKUQIAQoApgBQRBGDRUgBEHoAGpBGGogBEGYAWpBGGooAgA2AgAgBEHoAGpBEGogBEGYAWpBEGopAgA3AwAgBEHoAGpBCGogBEGYAWpBCGopAgA3AwAgBCAEKQKYATcDaCAEQYgBaiAEQegAahD3ESAEQYgBaiAEQdgAahCjCyAEQaQBaiAEQYgBakEIaikCADcCACAEIAQpAogBNwKcASAEQQo2ApgBIAYgBEGYAWoQrg8gBCgCWCAEKAJcQQFBAhDQEgwbCyAEQZgBaiADIAEQ9QcgBCAEKQCdATcDaCAEIARBpAFqKQAANwBvIAQtAJwBIQUCQCAEKAKYASIBQYCAgIB4Rg0AIARBL2ogBEG8AWooAgA2AAAgBEEnaiAEQbQBaikCADcAACAEIAQpAqwBNwAfIAQgBCkDaDcDECAEIAQpAG83ABcMHAsgBEHYAGpBCGogBCkAbzcAACAEIAU6AFggBCAEKQNoNwBZIARBmAFqIAYQpRAgBCgCmAFBEEYNFSAEQegAakEYaiAEQZgBakEYaigCADYCACAEQegAakEQaiAEQZgBakEQaikCADcDACAEQegAakEIaiAEQZgBakEIaikCADcDACAEIAQpApgBNwNoIARBiAFqIARB6ABqEPgRIARBiAFqIARB2ABqEMYLIARBpAFqIARBiAFqQQhqKQIANwIAIAQgBCkCiAE3ApwBIARBCTYCmAEgBiAEQZgBahCuDyAEKAJYIAQoAlxBBEEIENASDBoLIARBmAFqIAUQpRAgBCgCmAFBEEYNFiAEQegAakEYaiAEQZgBakEYaigCADYCACAEQegAakEQaiAEQZgBakEQaikCADcDACAEQegAakEIaiAEQZgBakEIaikCADcDACAEIAQpApgBNwNoIARB2ABqIARB6ABqEPgRIARBmAFqIAUgAigCBC0AcCAEQdgAahDUHSAEKAKYASIBQYCAgIB4Rg0BIAQtAJwBIQUCQEEjRQ0AIARBEGogBEGdAWpBI/wKAAALIAQoAlggBCgCXEEEQQgQ0BIMGgsgBEGYAWogBRClECAEKAKYAUEQRg0WIARB6ABqQRhqIARBmAFqQRhqKAIANgIAIARB6ABqQRBqIARBmAFqQRBqKQIANwMAIARB6ABqQQhqIARBmAFqQQhqKQIANwMAIAQgBCkCmAE3A2ggBEGIAWogBEHoAGoQ9xEgBEGIAWogBEHYAGoQowsgBEGkAWogBEGIAWpBCGopAgA3AgAgBCAEKQKIATcCnAEgBEEKNgKYASAFIARBmAFqEK4PIAQoAlggBCgCXEEBQQIQ0BIMGAsgBEGYAWogBRClECAEKAKYAUEQRg0WIARB6ABqQRhqIARBmAFqQRhqKAIANgIAIARB6ABqQRBqIARBmAFqQRBqKQIANwMAIARB6ABqQQhqIARBmAFqQQhqKQIANwMAIAQgBCkCmAE3A2ggBEGIAWogBEHoAGoQ+BEgBEGIAWogBEHYAGoQxgsgBEGkAWogBEGIAWpBCGopAgA3AgAgBCAEKQKIATcCnAEgBEEJNgKYASAFIARBmAFqEK4PIAQoAlggBCgCXEEEQQgQ0BIMFwsgBEGIAWogBSAFENIXIARBpAFqIARBiAFqQQhqKQIANwIAIAQgBCkCiAE3ApwBIARBCjYCmAEgBiAEQZgBahCuDwwWC0GktYUBEMkiAAtBtLWFARDJIgALQcS1hQEQySIAC0HUtYUBEMkiAAtB5LWFARDJIgALQfS1hQEQySIAC0HUs4UBEMkiAAtB5LOFARDJIgALQfSzhQEQySIAC0GEtIUBEMkiAAsgBEGIAWogBUH/AXEiASAHQf8BcSIFIAEgBUkbIAEgBSABIAVLGxDSFyAEQaQBaiAEQZABaikCADcCACAEIAQpAogBNwKcASAEQQo2ApgBIAYgBEGYAWoQrg8MCwtBgJ2bARCBHAsAC0GUtIUBEMkiAAtBpLSFARDJIgALQbS0hQEQySIAC0HEtIUBEMkiAAtB1LSFARDJIgALQeS0hQEQySIAC0GEtYUBEMkiAAtB9LSFARDJIgALQZS1hQEQySIAC0GAgICAeCEBDAELIAAgBToABEEjRQ0AIABBBWogBEEQakEj/AoAAAsgACABNgIAIARBwAFqJAALyjICFX8CfiMAQaADayIFJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAi0ACEF9aiIGQQEgBkH/AXFBA0kbQf8BcQ4DAAECAAsgAigCBCEHIAIoAgAhCAJAAkACQAJAAkACQCABLQDIASICQXxqDgUEAQEBBQALIAJFDQELIAMNASABKALEASEGIAEoAsABIQcgBUGJgICAeDYCwAEgByAGIAVBwAFqEIQXIQYgAkGiAUcNDSABENcSIQIgARDjDiABIAIQ+hIMDQsgA0UNCQsgASgCxAEhBiABKALAASEHIAVBiICAgHg2AsABIAcgBiAFQcABahCEFyEGIAJBogFHDQsgARDXEiECIAEQ4w4gASACEPoSDAsLIAEQ4w4gASgCuAEhCSABIAEoAngiBkHAAHI2AnggBUEwaiABEIUJIAUoAjAhAiABIAY2AnggBSgCNCEGIAJBAXENCiAFIAY2ArACAkACQAJAIAEtAMgBIgJBBUcNACABEOMOIAUgCTYCSCAFIAY2AkQgBSABKAK8ASIGNgJMAkAgAS0Ae0ECcQ0AIAEtAIABQcAAcUUNAgtBCEHAABCZIiICRQ0MIAJBATYCCCACQRU2AgAgAiAFKQJENwIMIAIgBzYCLCACIAg2AiggAiAGNgIkIAIgCDYCICACQRRqIAVBxABqQQhqKAIANgIADAsLIAEoAsQBIQYgASgCwAEhByAFQaABaiACEIYeIAVBATYCxAEgBUGU85sBNgLAASAFQgE3AswBIAVB9watQiCGQeOomwGthDcDcCAFIAVB8ABqNgLIASAFQeACaiAFQcABahCNFyAFQfQCaiAFQagBaigCADYCACAFIAUpAqABNwLsAiAHIAYgBUHgAmoQhBchBiAFQbACaiECIAEtAMgBQaIBRw0BIAEQ1xIhByABEOMOIAEgBxD6EgwBCyAFQYmAgIB4NgLAASAIIAcgBUHAAWoQhBchBiAFQcQAaiECIAEtAMgBQaIBRw0AIAEQ1xIhByABEOMOIAEgBxD6EgsgAhCaIQwKCyABEOMOIAVBwAFqIAEQ2w0gBSkDwAEiGkICUQ0CIAVBgAFqQQhqIAVBwAFqQQhqIgZBCGopAwAiGzcDACAFQfACaiAbNwMAIAUgBikDACIbNwOAASAFIBs3A+gCIAUgGqciAkF/c0EBcTYC4AIgASgCvAEhBgJAAkAgAS0Ae0ECcQ0AIAEtAIABQcAAcUUNAQsCQCACQQFxRQ0AIAVB3ABqIAVBgAFqQQhqKQMANwIAIAUgBSkDgAE3AlRBCEHAABCZIiICRQ0KIAJBADYCCCACQRU2AgAgAiAFKQJQNwIMIAIgBzYCLCACIAg2AiggAiAGNgIkIAIgCDYCICACQRRqIAVB0ABqQQhqKQIANwIAIAJBHGogBUHgAGooAgA2AgAMCQsgASgCxAEhBiABKALAASECIAVBiICAgHg2AsABIAIgBiAFQcABahCEFyEGIAEtAMgBQaIBRw0GIAEQ1xIhAiABEOMOIAEgAhD6EgwGCyAFQYmAgIB4NgLAASAIIAcgBUHAAWoQhBchBiABLQDIAUGiAUYNAwwECwJAIAEtAMgBIgcNACACKAIAIQggBUHAAWogARCKBSAFKALEASEGIAUoAsABIgdBgICAgHhGDQkgBSgCyAEhCSAFIAY2AlQgBSAHNgJQIAUgCTYCWCABKAK8ASEGAkAgCUF9akF9Sw0AIAVB64CAgHg2AsABIAggBiAFQcABahCEFyEGAkAgAS0AyAFBogFHDQAgARDXEiECIAEQ4w4gASACEPoSCyAFQdAAahDgIQwKCyAFQeACakEIaiIHIAVB0ABqQQhqKAIANgIAIAUgBSkCUDcD4AIgBUHgAmpBFGogAkEIaigCADYCACAFQgA3AtgBIAVBAzoA1AEgBUEANgLQASAFQgA3AuABIAVCADcCyAEgBUKAgICAwAA3AsABIAUgAikCADcC7AJBCEHAABCZIiICRQ0IIAJBFzYCACACIAUpA+ACNwIEIAJCADcCJCACIAY2AiAgAiAINgIcIAJBDGogBykDADcCACACQRRqIAVB8AJqKQMANwIAIAVBwAFqQQxqEJwhIAVBwAFqEOAhDAcLIAEoAsQBIQYgASgCwAEhAiAFQYyAgIB4NgLAASACIAYgBUHAAWoQhBchBiAHQaIBRw0IIAEQ1xIhAiABEOMOIAEgAhD6EgwICyAFQThqIAIoAgAiAhDSAyAFKAI4IQgMBQsgBSgCyAEhBgwGCyABENcSIQcgARDjDiABIAcQ+hILIAJBAXFFDQAgBSkD6AIQ8x8MBAsgBUHgAmoQ3x0MAwsgBUHAAWogARCKBSAFKALEASEGIAUoAsABIglBgICAgHhGDQIgBSgCyAEhCiABKAK8ASELIAVCADcC2AEgBUEDOgDUASAFQQA2AtABIAVCADcC4AEgBUIANwLIASAFQoCAgIDAADcCwAFBCEHAABCZIiICRQ0BIAJCADcCJCACIAs2AiAgAiAINgIcIAJBAzoAGCACIAc2AhQgAiAINgIQIAIgCjYCDCACIAY2AgggAiAJNgIEIAJBFzYCACAFQcwBahCcISAFQcABahDgIQtB9watQiCGQeOomwGthCEbIAVBwAFqQQxqIQwgBUHAAWpBCGohDSAFQeACakEMaiEOIAVB4AJqQQRyIQ8gBUG4AmpBCGohECAFQeACakEIaiERIAVBwAFqQQtqIRIDQCAFIAI2AmgCQAJAAkACQAJAAkACQAJAIAEtAIEBQSBxDQAgAS0AyAEhBkEAIQkMAQsgAS0AyAEhBgJAAkACQAJAAkACQAJAIAEtAMkBDQAgBkH/AXFBC0YNAQtBASEHIAZB/wFxQRJHDQUgASABKAJ4IglBgMAAcjYCeCAFQcABaiABEJMDIAEgASgCeEEBcjYCeCADDQIgASgC1AEhByABKALQASEGIAVBKGogAhDSAyAGQQFHDQIgByAFKAIoRw0CIAIoAgBBGkcNAiACQQhqQfazmwFBBRCjHA0BDAILIAEQ4w4gASgCvAEhB0EIQcAAEJkiIgZFDQ0gBiAHNgIMIAYgCDYCCCAGIAI2AgQgBkErNgIAQQEhByAGIQIMCwsgBUHgAmogASAIEJkCIAUoAuQCIQYgBSgC4AIiB0GBgICAeEYNASAQIBEpAgA3AgAgEEEYaiARQRhqKQIANwIAIBBBEGogEUEQaikCADcCACAQQQhqIBFBCGopAgA3AgAgBSAGNgK8AiAFIAc2ArgCAkAgB0GAgICAeEYNAEEIQcAAEJkiIgZFDQ0gBkEeNgIAQShFDQcgBkEEaiAFQbgCakEo/AoAAAwHCyAFQbgCahCvIQsgBUEgaiABELQEIAUoAiQhBwJAIAUoAiBBAXFFDQAgBUEDOgC0AiAFIAc2ArACDAILIAEQ4w4CQAJAAkACQAJAAkACQAJAIAEtAMgBIgYNACADRQ0BCyAGQbt/akECSQ0EAkACQCAGQWlqDgQHAQEGAAsgBkH1AEYNBiAGQZ4BRg0GCyADDQEgDyAGEIYeIAVBBjYC9AIgBUG0vpsBNgLwAiAFQbCAgIB4NgLgAiABKALAASABKALEASAFQeACahCEFyELIAEtAMgBQaIBRg0CDAMLIAVB4AJqIAEQigUgBSgC5AIhCyAFKALgAiITQYCAgIB4Rg0CIAUoAugCIRQgAigCACEKIAEoArwBIRVBCEHAABCZIiEGAkAgCkEwRw0AIAZFDRIgBkEANgIIIAZCMTcDACAFIAY2AmgQsCEhBiAFQgA3AvACIAUgBjYC7AIgBUIANwL4AiAFQQA2AugCIAVCgICAgMAANwLgAkEIQSgQmSIiCkUNEiAKIAc2AiBBACEWIApBADYCHCAKIBU2AhggCiAINgIUIAogAjYCECAKIBQ2AgwgCiALNgIIIAogEzYCBCAKQQM2AgAgBUHgAmoQtyBBMCEXIAghCyAVIRQMCwsgBkUNESAGQQA2AgggBkIxNwMAIAUgBjYCaCAFQgA3AvgCIAVBAzoA9AIgBUEANgLwAiAFQgA3AoADIAVCADcC6AIgBUKAgICAwAA3AuACIAJBCHYhGCAFQeACahC0IEEXIRcgEyEKIAIhFgwKCyAPIAYQhh4gBUEBNgL0AiAFQbq+mwE2AvACIAVBsICAgHg2AuACIAEoAsABIAEoAsQBIAVB4AJqEIQXIQsgAS0AyAFBogFHDQELIAEQ1xIhBiABEOMOIAEgBhD6EgsgBUEDOgC0AiAFIAs2ArACIAcQoCIMBAtBCEHAABCZIiIGRQ0NIAZBADYCCCAGQjE3AwAgBSAGNgJoIAVBiANqIAEgAiAHEKUGIAUoAogDRQ0BQQhBwAAQmSIiBkUNDSAGQR02AgAgBiAFKQKIAzcCBCAGQQxqIAVBiANqQQhqKQIANwIAIAZBFGogBUGIA2pBEGopAgA3AgAMBwsgASgCvAEhCkEIQcAAEJkiIgZFDQwgBkEANgIIIAZCMTcDACAFIAY2AmhBCEHAABCZIiIGRQ0MIAYgCjYCECAGIAg2AgwgBiAHNgIIIAYgAjYCBCAGQS02AgBBACEHDAcLIAUoAowDIQYLIAVBAzoAtAIgBSAGNgKwAgsgASAFQcABahCgBiAFQbACahCNICABIAk2AnggAS0AgQFBIHFBBXYhByABLQDIASEGC0EAIQkgB0UNACAGQf8BcUESRw0AIAEQ9gUhCSABLQDIASEGC0EAIQoCQCAGQf8BcUEKRw0AIAEQ5AtB/wFxQQhHDQAgARDjDiABEOMOQQEhCgsgAS0AyAEhBgJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAQNACAGQf8BcUEERg0BCyAGQf8BcSECIAEtAIEBQSBxRQ0CIAogAkESRnFFDQIgBUEIaiABELQEQQEhAiAFKAIMIQsgBSgCCEEBcUUNAUEAIQpBAiEHIAshBgwUCyABEOMOIAEoArgBIRMgASABKAJ4IgZBwAByNgJ4IAVBGGogARCFCSAFKAIYIRQgASAGNgJ4QQEhAkECIQcgBSgCHCELAkAgFEEBcUUNACALIQYMEwsgBSALNgJsAkACQCABLQDIASIGQQVHDQAgARDjDiAFQRBqIAUoAmgiFhDSAyABKAK8ASEHQQAhFSAFKAIQIRQCQCABLQCBAUEgcUUNACABLQDIAUH/AXFBEkcNACABEPYFIRULIAVB6ABqIQYDQCAGKAIAIgJBBGohBiACKAIAQXRqIgJBByACQSZJGyICQR9GDQALIApBf3MgAkEkR3FFDQFBFCEYQQIhCgwTCyABKALEASEKIAEoAsABIQsgBUHwAGogBhCGHiAFQQE2AsQBIAVBlPObATYCwAEgBUIBNwLMASAFIBs3A7ACIAUgBUGwAmo2AsgBIAVB4AJqIAVBwAFqEI0XIA5BCGogBUHwAGpBCGooAgA2AgAgDiAFKQJwNwIAIAsgCiAFQeACahCEFyEGAkAgAS0AyAFBogFHDQAgARDXEiEKIAEQ4w4gASAKEPoSCyAFQewAahCaIQwTC0EIQSgQmSIiBkUNGyAGIBY2AiAgBiAHNgIcIAYgFDYCGCAGIAc2AgwgBiATNgIIIAYgCzYCBCAGQQI2AgBBMCEYIAohEyAHIQsgFCEKDBELIAEQ4w4gAS0AyAEiBkUNASALDQIMBQsgAg0EQQAhCwsgA0UNACAKQQFzRQ0AIAtFDQELIAVBwAFqIAEQigUgBSgCxAEhBgJAIAUoAsABIhNBgICAgHhHDQBBASEKDAwLIAUoAsgBIRUgASgCvAEhFCAKDQEgBUHoAGohAgJAA0ACQCACKAIAIgIoAgAiB0ErRg0AIAdBMEcNAgwECyACQQRqIQIMAAsLIAUoAmghAiAFQgA3AtgBIAVBAzoA1AEgBUEANgLQASAFQgA3AuABIAVCADcCyAEgBUKAgICAwAA3AsABIAwQnCEgBUHAAWoQ4CFBCEHAABCZIiIKRQ0XIApCADcCJCAKIBQ2AiAgCiAINgIcIApBBToAGCAKIAI2AhAgCiAVNgIMIAogBjYCCCAKIBM2AgQgCkEXNgIAQQAhAkEBIQcgCiEGQQEhCgwMC0EAIQYgCg0CDAMLIAUoAmghBxCwISECIAVCADcC0AEgBSACNgLMASAFQgA3AtgBIAVBADYCyAEgBUKAgICAwAA3AsABQQhBKBCZIiICRQ0VIAIgCzYCICACQQA2AhwgAiAUNgIYIAIgCDYCFCACIAc2AhAgAiAVNgIMIAIgBjYCCCACIBM2AgQgAkEDNgIAIAVBwAFqELcgQQhBwAAQmSIiBkUNFSAGIAo6ABAgBiAUNgIMIAYgCDYCCCAGIAI2AgQgBkEwNgIAQQAhCkEBIQdBACECDA0LIAoNACAGQf8BcUEIRw0BIAEQ4w4LIAVBwAFqIAEQ2w0gBSkDwAEiGkICUQ0BIAVBsAFqQQhqIhYgDEEIaigCADYCACAFIAwpAgA3A7ABIBItAAAhBiAFLQDIASELIAUvAMkBIQIgBSAFKAJoIhUQ0gMgGqchByAGQRB0IQYgASgCvAEhGUEAIRcgBSgCACETAkAgAS0AgQFBIHFFDQAgAS0AyAFB/wFxQRJHDQAgARD2BSEXCyAHQQFzIRQgAiAGciEHIBUhBgNAIAYoAgBBdGoiAkEHIAJBJkkbIgJBH0cNAyAGKAIEIQYMAAsLIAUoAmghBwJAAkAgCQ0AIAchAgwBCyABKAK8ASEGQQhBwAAQmSIiAkUNEyACIAY2AhAgAiAINgIMIAIgCTYCCCACIAc2AgQgAkEtNgIAIAEtAMgBIQYLAkAgBkH/AXEiBkG7f2pBAkkNACAGQRpHDQMLIAlFIQogASABKAJ4IgZB//97cTYCeCAFQcABaiABIAJBABClBiABIAY2AnggBSgCxAEhBgJAIAUoAsABIgcNAEEAIQtBAiEHDAYLIBEgDUEIaikCADcDACAFIA0pAgA3A+ACQQhBwAAQmSIiAkUNEiACIAY2AgggAiAHNgIEIAJBHTYCACACIAUpA+ACNwIMIAJBFGogESkDADcCAEEAIQtBASEHIAIhBgwFCyAFKALIASEGQQEhCkEAIQsMBQsCQAJAIApBf3MgAkEkR3ENACABKAK8ASEYQQhBKBCZIiICRQ0SIAIgBzsACSACIAs6AAggAiAUNgIAIAIgBSkDsAE3AgwgAiAVNgIgIAIgGTYCHCACIBM2AhggAkELaiAHQRB2OgAAIAJBFGogFigCADYCAEEwIRYgCCEUIAohCwwBCyAFQZABakEIaiAWKAIANgIAIAUgBSkDsAE3A5ABQRQhFgsgF0UNAUEIQcAAEJkiIgZFDRAgBiAHOwARIAYgCzoAECAGIBg2AgwgBiAUNgIIIAYgAjYCBCAGIBY2AgAgBiAFKQOQATcCFCAGIBU2AiggBiAZNgIkIAYgEzYCICAGIAUpA1A3AzAgBkETaiAHQRB2OgAAIAZBHGogBUGQAWpBCGooAgA2AgAgBkE4aiAFQdAAakEIaikDADcDACABKAK8ASILQQh2IQdBLSEWIAYhAiAXIRQgCCEYDAILQQAhB0EAEJ4iDA0LIAVBoAFqQQhqIAVBkAFqQQhqKAIANgIAIAUgBSkDkAE3A6ABC0EIQcAAEJkiIgZFDQ0gBiAHOwARIAYgCzoAECAGIBg2AgwgBiAUNgIIIAYgAjYCBCAGIBY2AgAgBiAFKQOgATcCFCAGIBU2AiggBiAZNgIkIAYgEzYCICAGIAUpA1A3AzAgBkETaiAHQRB2OgAAIAZBHGogBUGgAWpBCGooAgA2AgAgBkE4aiAFQdAAakEIaikDADcDAEEAIQtBASEHQQEhCgtBACECDAELQQIhB0EBIQILIAsQniIgCkEBcyEKDAILAkACQCAVDQAgCiEVIAYhAgwBC0EIQcAAEJkiIgJFDQogAiAWNgIoIAIgBzYCJCACIBQ2AiAgAiAHNgIUIAIgEzYCECACIAs2AgwgAiAKNgIIIAIgBjYCBCACIBg2AgAgAiAFKQOAATcDMCACQThqIAVBgAFqQQhqKQMANwMAIAEoArwBIRNBLSEYIAghCwtBCEHAABCZIiIGRQ0JIAYgFjYCKCAGIAc2AiQgBiAUNgIgIAYgBzYCFCAGIBM2AhAgBiALNgIMIAYgFTYCCCAGIAI2AgQgBiAYNgIAIAYgBSkDgAE3AzAgBkE4aiAFQYABakEIaikDADcDAEEAIQJBASEHC0EAIQoLAkAgCUUNACAKDQAgCRCgIgsgAg0DDAQLQQhBwAAQmSIiBkUNBiAGIBg7ABEgBiAHNgIoIAZBADYCJCAGIBU2AiAgBiAINgIcIAZCgICAgNAANwIUIAYgFjoAECAGIBQ2AgwgBiALNgIIIAYgCjYCBCAGIBc2AgAgBkETaiAYQRB2OgAAC0EBIQcLIAEgASgCeEF+cSAJQQFxcjYCeCAFQcABahCrISABIAk2AngLIAVB6ABqEJohCyAHQQJGDQMgBiECCyAHQQFxDQALQQAhASACIQYMAgsAC0EBIQELIAAgBjYCBCAAIAE2AgAgBUGgA2okAAuCMgITfwR+IwBBsARrIgIkACABQTBqIQMgAUEQaiEEIAFBIGohBSAAKAIEIgYgACgCCEEMbGohByACQcQBakHoAGohCCACQSRqQTxqIQkgAkGgA2ohCiACQcQBakEYaiELIAJBxAFqQQhqIQwgAkHEAmohDSACQfABaiEOAkACQANAIAYgB0YNASAGQQxqIQACQCAGKAIADQAgBigCBCEPIAAhBgJAAkACQAJAAkAgDygCACIQQXtqIhFBBCARQQZJGw4GBgABAgMEBgsgD0EIaiABENAfIA9BKGogARDHBCAAIQYMBQsgD0EoaiABEMcEIAAhBgwECyAPQQhqIRICQAJAAkAgAS0ARQ0AIAJBgAI7AMQBIA9BKGohEAJAIA8oAghBA0cNACAPKAIMIAJBxAFqEJgBCwJAIBAoAgBBgICAgHhGDQAgDygCMCIRRQ0AIAItAMQBDQAgDygCLCEGIBFBMGwhEQNAAkAgAi0AxAENACAGIAJBxAFqEIcDCyAGQTBqIQYgEUFQaiIRDQALCyACLQDEAQ0BCyACQfAAakEAIAEoAkBBABDcBwJAQdQARQ0AIA4gAkHwAGpB1AD8CgAACyANQQhqQQApA5j/nAEiFTcCACANQQApA5D/nAEiFjcCACAMIBY3AgAgDEEIaiIRIBU3AgAgCyAWNwIAIAtBCGogFTcCACACQQA6ANQCIAJBADYCxAEgAkEAOgDsASAPQShqIQYCQCAPKAIIQQNHDQAgAi0AvQIhECACQQA6AL0CAkAgDygCDCIPKAIAQRpHDQAgAkHoAmogDykDCCAPQRhqKAIAEOcaIA4gAikD6AIgAigC8AIQkAsLIA8gAkHEAWoQeCACQQA6AOwBIAIgEDoAvQILAkAgBigCAEGAgICAeEYNACACQcQBaiAGEI8KCyACQdgCakEIaiIPIBEpAgA3AwAgAiAMKQIANwPYAiACQegCaiANEKQPIAogCxCkDyACIAJB2AJqNgKYAyACQdADakEIaiIGIBU3AwAgAiAWNwPQAyACQfADaiACQegCahDmECACQdADaiACKALwAxDnHwJAIAIoAogDQYGAgIB4Rg0AAkBBMEUNACACQfADaiACQegCakEw/AoAAAsCQANAIAJB4ANqIAJB8ANqEJANIAIpA+ADIhdQDQEgAiACKALoAzYCqAQgAiAXNwOgBAJAIAJB2AJqIAJBoARqELkbRQ0AIAIpA6AEEPMfDAELIAJB0ANqIBcQmQYMAAsLQgAQ1iEgAkHwA2oQ2x0LAkAgAigCwANBgYCAgHhGDQACQEEwRQ0AIAJB8ANqIApBMPwKAAALAkADQCACQaAEaiACQfADahCQDSACKQOgBCIXUA0BIAJB0ANqIBcQmQYMAAsLQgAQ1iEgAkHwA2oQ2x0LIAkgAikD0AM3AgAgCUEIaiIRIAYpAwA3AgACQEE8RSIQDQAgAkEkaiAOQTz8CgAACyACQdgCahDjFyAIEIogAkAgEA0AIAJBxAFqIAJBJGpBPPwKAAALIA8gESkCADcDACACIAkpAgA3A9gCIAJBxAFqEPoIIAJB6AJqIAUQhBEgAkHoAmogAkHYAmoQwQogBiACQegCakEIaiIQKQIANwMAIAIgAikC6AI3A9ADAkAgASgCHCIRRQ0AIAJB0ANqEJ8VIRMgBCgCACIPKQMAIRcgEyARQQFqQQF2IBEgAigC3AMbEOcfIA9BCGohBiAXQn+FQoCBgoSIkKDAgH+DIRcDQAJAIBdQDQACQCAPIBd6p0EBdEHwAXFrQXBqKQMAIhhCA4NCAFINACAYpyIUIBQoAgAiFEEBajYCACAUQX9MDQsLIBdCf3wgF4MhFyATIBgQmQYgEUF/aiERDAELIBFFDQEgD0GAf2ohDyAGKQMAQn+FQoCBgoSIkKDAgH+DIRcgBkEIaiEGDAALCyACQQA2AvACIAJCgICAgIABNwLoAiACQegCahDWESACQeADakEIaiITIBU3AwAgAiAWNwPgAyAQIBU3AwAgAkEANgL4AiACIBY3A+gCIAJBxAFqIAJB4ANqIAMgAkHoAmogBCACQdADaiACKALUAyACKALQAxsQqQEgAkHoAmoQswsgASgCAEUNASABIAIoAuwDIAQQzR8gAigC4AMiBikDACEXIAIoAuQDIQ8gAiACKALsAzYCiAEgAiAGNgKAASACIAYgD2pBAWo2AnwgAiAGQQhqNgJ4IAIgF0J/hUKAgYKEiJCgwIB/gzcDcANAIAJBCGogAkHwAGoQ1xkgAigCCCIGRQ0CIAIoAgwhDwJAIAYpAwAiF0IDg0IAUg0AIBenIhEgESgCACIRQQFqNgIAIBFBf0wNCQsgAkHoAmogASAXIAYoAggQjwkgAigC8AIhEQJAIAIpA+gCIhVQDQAgAigCgAMhBiACKQP4AiEWAkAgDykDACIXQgODQgBSDQAgF6ciDyAPKAIAIg9BAWo2AgAgD0F/TA0KCyACIBc3A/gCIAIgETYC8AIgAiAVNwPoAiAGIBYgAkHoAmoQ7w8MAQsLAkAgEUF4aikDACIXQgODQgBSDQAgF6ciASABKAIAIgFBAWo2AgAgAUF/TA0ICyACQQA2AqgEIAIgFzcDoAQCQCAPKQMAIhdCA4NCAFINACAXpyIBIAEoAgAiAUEBajYCACABQX9MDQgLIAJBADYC+AMgAiAXNwPwAyACQQM2AiggAkGI05sBNgIkIAJCAzcCMCACQecErUIghiIXIAJB8ANqrYQ3A/gCIAIgFyACQaAEaq2ENwPwAiACIBcgBq2ENwPoAiACIAJB6AJqNgIsIAJBJGpB7NObARCoHQALIBIgARDQHyAQIAEQuSAgACEGDAQLIBAgEykDADcDACACIAIpA+ADNwPoAiACQdADahDlISACQcQBahCLEAJAIAIoAvQCRQ0AIAJBADYCzAEgAkKAgICAgAE3AsQBIAIgASkCQDcC0AEgAiACQegCajYC2AEgEiACQcQBahCvHiACQcQBahD1HwsgAkHoAmoQ0QwgACEGDAMLAkACQAJAIAEtAEUNACACQYACOwDEASAPQSBqIRICQCAQQQNHDQAgDygCBCACQcQBahCYAQsgD0HIAGohECAPQegAaiETAkAgEigCAEEHRg0AIBIgAkHEAWoQtwkLIBMoAgAgAkHEAWoQtwkCQCAQKAIAQYCAgIB4Rg0AIA8oAlAiEUUNACACLQDEAQ0AIA8oAkwhBiARQTBsIREDQAJAIAItAMQBDQAgBiACQcQBahCHAwsgBkEwaiEGIBFBUGoiEQ0ACwsgAi0AxAENAQsgAkHwAGpBACABKAJAQQAQ3AcCQEHUAEUNACAOIAJB8ABqQdQA/AoAAAsgDUEIakEAKQOY/5wBIhU3AgAgDUEAKQOQ/5wBIhY3AgAgDCAWNwIAIAxBCGoiESAVNwIAIAsgFjcCACALQQhqIBU3AgAgAkEAOgDUAiACQQA2AsQBIAJBADoA7AEgD0EgaiEGAkAgDygCAEEDRw0AIAItAL0CIRIgAkEAOgC9AgJAIA8oAgQiECgCAEEaRw0AIAJB6AJqIBApAwggEEEYaigCABDnGiAOIAIpA+gCIAIoAvACEJALCyAQIAJBxAFqEHggAkEAOgDsASACIBI6AL0CCwJAIAYoAgBBB0YNACAGIAJBxAFqEIUFCyAPKAJoIAJBxAFqEIUFAkAgDygCSEGAgICAeEYNACACQcQBaiAPQcgAahCPCgsgAkHYAmpBCGoiECARKQIANwMAIAIgDCkCADcD2AIgAkHoAmogDRCkDyAKIAsQpA8gAiACQdgCajYCmAMgAkHQA2pBCGoiBiAVNwMAIAIgFjcD0AMgAkHwA2ogAkHoAmoQ5hAgAkHQA2ogAigC8AMQ5x8CQCACKAKIA0GBgICAeEYNAAJAQTBFDQAgAkHwA2ogAkHoAmpBMPwKAAALAkADQCACQeADaiACQfADahCQDSACKQPgAyIXUA0BIAIgAigC6AM2AqgEIAIgFzcDoAQCQCACQdgCaiACQaAEahC5G0UNACACKQOgBBDzHwwBCyACQdADaiAXEJkGDAALC0IAENYhIAJB8ANqENsdCwJAIAIoAsADQYGAgIB4Rg0AAkBBMEUNACACQfADaiAKQTD8CgAACwJAA0AgAkGgBGogAkHwA2oQkA0gAikDoAQiF1ANASACQdADaiAXEJkGDAALC0IAENYhIAJB8ANqENsdCyAJIAIpA9ADNwIAIAlBCGoiESAGKQMANwIAAkBBPEUiEg0AIAJBJGogDkE8/AoAAAsgAkHYAmoQ4xcgCBCKIAJAIBINACACQcQBaiACQSRqQTz8CgAACyAQIBEpAgA3AwAgAiAJKQIANwPYAiACQcQBahD6CCACQegCaiAFEIQRIAJB6AJqIAJB2AJqEMEKIAYgAkHoAmpBCGoiEikCADcDACACIAIpAugCNwPQAwJAIAEoAhwiEEUNACACQdADahCfFSETIAQoAgAiESkDACEXIBMgEEEBakEBdiAQIAIoAtwDGxDnHyARQQhqIQYgF0J/hUKAgYKEiJCgwIB/gyEXA0ACQCAXUA0AAkAgESAXeqdBAXRB8AFxa0FwaikDACIYQgODQgBSDQAgGKciFCAUKAIAIhRBAWo2AgAgFEF/TA0KCyAXQn98IBeDIRcgEyAYEJkGIBBBf2ohEAwBCyAQRQ0BIBFBgH9qIREgBikDAEJ/hUKAgYKEiJCgwIB/gyEXIAZBCGohBgwACwsgAkEANgLwAiACQoCAgICAATcC6AIgAkHoAmoQ1hEgAkHgA2pBCGoiEyAVNwMAIAIgFjcD4AMgEiAVNwMAIAJBADYC+AIgAiAWNwPoAiACQcQBaiACQeADaiADIAJB6AJqIAQgAkHQA2ogAigC1AMgAigC0AMbEKkBIAJB6AJqELMLIAEoAgBFDQEgASACKALsAyAEEM0fIAIoAuADIgYpAwAhFyACKALkAyERIAIgAigC7AM2AogBIAIgBjYCgAEgAiAGIBFqQQFqNgJ8IAIgBkEIajYCeCACIBdCf4VCgIGChIiQoMCAf4M3A3ADQCACQRBqIAJB8ABqENcZIAIoAhAiBkUNAiACKAIUIRECQCAGKQMAIhdCA4NCAFINACAXpyIQIBAoAgAiEEEBajYCACAQQX9MDQgLIAJB6AJqIAEgFyAGKAIIEI8JIAIoAvACIRACQCACKQPoAiIVUA0AIAIoAoADIQYgAikD+AIhFgJAIBEpAwAiF0IDg0IAUg0AIBenIhEgESgCACIRQQFqNgIAIBFBf0wNCQsgAiAXNwP4AiACIBA2AvACIAIgFTcD6AIgBiAWIAJB6AJqEO8PDAELCwJAIBBBeGopAwAiF0IDg0IAUg0AIBenIgEgASgCACIBQQFqNgIAIAFBf0wNBwsgAkEANgKoBCACIBc3A6AEAkAgESkDACIXQgODQgBSDQAgF6ciASABKAIAIgFBAWo2AgAgAUF/TA0HCyACQQA2AvgDIAIgFzcD8AMgAkEDNgIoIAJBiNObATYCJCACQgM3AjAgAkHnBK1CIIYiFyACQfADaq2ENwP4AiACIBcgAkGgBGqthDcD8AIgAiAXIAathDcD6AIgAiACQegCajYCLCACQSRqQezTmwEQqB0ACyAPIAEQ0B8gEiABELogIBMgARCSJCAQIAEQuSAgACEGDAMLIBIgEykDADcDACACIAIpA+ADNwPoAiACQdADahDlISACQcQBahCLEAJAIAIoAvQCRQ0AIAJBADYCzAEgAkKAgICAgAE3AsQBIAIgASkCQDcC0AEgAiACQegCajYC2AEgDyACQcQBahCjHSACQcQBahD1HwsgAkHoAmoQ0QwgACEGDAILIA9BCGohBgJAAkACQCABLQBFDQAgAkGAAjsAxAECQCAGKAIAQQNHDQAgDygCDCACQcQBahCYAQsgDygCKCACQcQBahCQCiACLQDEAQ0BCyACQfAAakEAIAEoAkBBABDcBwJAQdQARQ0AIA4gAkHwAGpB1AD8CgAACyANQQhqQQApA5j/nAEiFTcCACANQQApA5D/nAEiFjcCACAMIBY3AgAgDEEIaiIRIBU3AgAgCyAWNwIAIAtBCGogFTcCACACQQA6ANQCIAJBADYCxAEgAkEAOgDsAQJAIAYoAgBBA0cNACACLQC9AiEQIAJBADoAvQICQCAPKAIMIgYoAgBBGkcNACACQegCaiAGKQMIIAZBGGooAgAQ5xogDiACKQPoAiACKALwAhCQCwsgBiACQcQBahB4IAJBADoA7AEgAiAQOgC9AgsgAkHEAWogDygCKBD9BCACQdgCakEIaiIQIBEpAgA3AwAgAiAMKQIANwPYAiACQegCaiANEKQPIAogCxCkDyACIAJB2AJqNgKYAyACQdADakEIaiIGIBU3AwAgAiAWNwPQAyACQfADaiACQegCahDmECACQdADaiACKALwAxDnHwJAIAIoAogDQYGAgIB4Rg0AAkBBMEUNACACQfADaiACQegCakEw/AoAAAsCQANAIAJB4ANqIAJB8ANqEJANIAIpA+ADIhdQDQEgAiACKALoAzYCqAQgAiAXNwOgBAJAIAJB2AJqIAJBoARqELkbRQ0AIAIpA6AEEPMfDAELIAJB0ANqIBcQmQYMAAsLQgAQ1iEgAkHwA2oQ2x0LAkAgAigCwANBgYCAgHhGDQACQEEwRQ0AIAJB8ANqIApBMPwKAAALAkADQCACQaAEaiACQfADahCQDSACKQOgBCIXUA0BIAJB0ANqIBcQmQYMAAsLQgAQ1iEgAkHwA2oQ2x0LIAkgAikD0AM3AgAgCUEIaiIRIAYpAwA3AgACQEE8RSISDQAgAkEkaiAOQTz8CgAACyACQdgCahDjFyAIEIogAkAgEg0AIAJBxAFqIAJBJGpBPPwKAAALIBAgESkCADcDACACIAkpAgA3A9gCIAJBxAFqEPoIIAJB6AJqIAUQhBEgAkHoAmogAkHYAmoQwQogBiACQegCakEIaiISKQIANwMAIAIgAikC6AI3A9ADAkAgASgCHCIQRQ0AIAJB0ANqEJ8VIRMgBCgCACIRKQMAIRcgEyAQQQFqQQF2IBAgAigC3AMbEOcfIBFBCGohBiAXQn+FQoCBgoSIkKDAgH+DIRcDQAJAIBdQDQACQCARIBd6p0EBdEHwAXFrQXBqKQMAIhhCA4NCAFINACAYpyIUIBQoAgAiFEEBajYCACAUQX9MDQkLIBdCf3wgF4MhFyATIBgQmQYgEEF/aiEQDAELIBBFDQEgEUGAf2ohESAGKQMAQn+FQoCBgoSIkKDAgH+DIRcgBkEIaiEGDAALCyACQQA2AvACIAJCgICAgIABNwLoAiACQegCahDWESACQeADakEIaiITIBU3AwAgAiAWNwPgAyASIBU3AwAgAkEANgL4AiACIBY3A+gCIAJBxAFqIAJB4ANqIAMgAkHoAmogBCACQdADaiACKALUAyACKALQAxsQqQEgAkHoAmoQswsgASgCAEUNASABIAIoAuwDIAQQzR8gAigC4AMiBikDACEXIAIoAuQDIREgAiACKALsAzYCiAEgAiAGNgKAASACIAYgEWpBAWo2AnwgAiAGQQhqNgJ4IAIgF0J/hUKAgYKEiJCgwIB/gzcDcANAIAJBGGogAkHwAGoQ1xkgAigCGCIGRQ0CIAIoAhwhEQJAIAYpAwAiF0IDg0IAUg0AIBenIhAgECgCACIQQQFqNgIAIBBBf0wNBwsgAkHoAmogASAXIAYoAggQjwkgAigC8AIhEAJAIAIpA+gCIhVQDQAgAigCgAMhBiACKQP4AiEWAkAgESkDACIXQgODQgBSDQAgF6ciESARKAIAIhFBAWo2AgAgEUF/TA0ICyACIBc3A/gCIAIgEDYC8AIgAiAVNwPoAiAGIBYgAkHoAmoQ7w8MAQsLAkAgEEF4aikDACIXQgODQgBSDQAgF6ciASABKAIAIgFBAWo2AgAgAUF/TA0GCyACQQA2AqgEIAIgFzcDoAQCQCARKQMAIhdCA4NCAFINACAXpyIBIAEoAgAiAUEBajYCACABQX9MDQYLIAJBADYC+AMgAiAXNwPwAyACQQM2AiggAkGI05sBNgIkIAJCAzcCMCACQecErUIghiIXIAJB8ANqrYQ3A/gCIAIgFyACQaAEaq2ENwPwAiACIBcgBq2ENwPoAiACIAJB6AJqNgIsIAJBJGpB7NObARCoHQALIAYgARDQHyAPKAIoIAEQphcgACEGDAILIBIgEykDADcDACACIAIpA+ADNwPoAiACQdADahDlISACQcQBahCLEAJAIAIoAvQCRQ0AIAJBADYCzAEgAkKAgICAgAE3AsQBIAIgASkCQDcC0AEgAiACQegCajYC2AEgDygCCCAPKAIMIAJBxAFqEKMhIA8oAiggAkHEAWoQpBMgAkHEAWoQ9R8LIAJB6AJqENEMIAAhBgwBCyAGIAEQxwQgACEGDAALCyACQbAEaiQADwsAC/0rAQd/IwBBgAlrIgIkAAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIAIgNBfGpBACADQXtqQQhJGw4JAAECCAcLCwYFAAsgA0EDRw0JIAAoAgQiAygCAEEaRw0DIAIgASgCACABKAIEIANBCGoiBBCCDSACKAIAQTJGDQkgAxDRASADQThqIAJBOGopAwA3AwAgA0EwaiACQTBqKQMANwMAIANBKGogAkEoaikDADcDACADQSBqIAJBIGopAwA3AwAgA0EYaiACQRhqKQMANwMAIANBEGogAkEQaikDADcDACAEIAJBCGopAwA3AwAgAyACKQMANwMADAkLIAAoAghBA0cNByAAKAIMIgMoAgBBGkcNASACQcAAaiABKAIAIAEoAgQgA0EIaiIEEIINIAIoAkBBMkYNByADENEBIANBOGogAkHAAGpBOGopAwA3AwAgA0EwaiACQcAAakEwaikDADcDACADQShqIAJBwABqQShqKQMANwMAIANBIGogAkHAAGpBIGopAwA3AwAgA0EYaiACQcAAakEYaikDADcDACADQRBqIAJBwABqQRBqKQMANwMAIAQgAkHAAGpBCGopAwA3AwAgAyACKQNANwMADAcLAkAgACgCICIFQQhqKAIAIgNFDQAgBUEEaigCACIGIANBBnRqIQADQAJAIAZBOGooAgAiA0UNACAGQTRqKAIAIQQgA0EMbCEHA0ACQAJAIAQoAgAiAygCAEEaRw0AIAJBwAdqIAEoAgAgASgCBCADQQhqIggQgg0gAigCwAdBMkYNASADENEBIANBOGogAkHAB2pBOGopAwA3AwAgA0EwaiACQcAHakEwaikDADcDACADQShqIAJBwAdqQShqKQMANwMAIANBIGogAkHAB2pBIGopAwA3AwAgA0EYaiACQcAHakEYaikDADcDACADQRBqIAJBwAdqQRBqKQMANwMAIAggAkHAB2pBCGopAwA3AwAgAyACKQPABzcDAAwBCyADIAEQRgsgBEEMaiEEIAdBdGoiBw0ACwsgBiABEJsEIAZBwABqIgMhBiADIABHDQALCwJAIAVBFGooAgAiA0UNACAFQRBqKAIAIQQgA0EMbCEHA0ACQAJAIAQoAgAiAygCAEEaRw0AIAJBgAdqIAEoAgAgASgCBCADQQhqIggQgg0gAigCgAdBMkYNASADENEBIANBOGogAkGAB2pBOGopAwA3AwAgA0EwaiACQYAHakEwaikDADcDACADQShqIAJBgAdqQShqKQMANwMAIANBIGogAkGAB2pBIGopAwA3AwAgA0EYaiACQYAHakEYaikDADcDACADQRBqIAJBgAdqQRBqKQMANwMAIAggAkGAB2pBCGopAwA3AwAgAyACKQOABzcDAAwBCyADIAEQRgsgBEEMaiEEIAdBdGoiBw0ACwsgBSgCGEGAgICAeEYNCCAFQSBqKAIAIgRFDQggBUEcaigCACEDIARBMGwhBANAIAMgARBwIANBMGohAyAEQVBqIgQNAAwJCwsgAyABEEYMBQsgAyABEEYMBQsCQCAAKAIIIgNBBUYNACADQQNHDQACQCAAKAIMIgMoAgBBGkcNACACQcAEaiABKAIAIAEoAgQgA0EIaiIEEIINIAIoAsAEQTJGDQEgAxDRASADQThqIAJBwARqQThqKQMANwMAIANBMGogAkHABGpBMGopAwA3AwAgA0EoaiACQcAEakEoaikDADcDACADQSBqIAJBwARqQSBqKQMANwMAIANBGGogAkHABGpBGGopAwA3AwAgA0EQaiACQcAEakEQaikDADcDACAEIAJBwARqQQhqKQMANwMAIAMgAikDwAQ3AwAMAQsgAyABEEYLAkAgACgCPCIDRQ0AAkAgAygCAEEaRw0AIAJBgARqIAEoAgAgASgCBCADQQhqIgQQgg0gAigCgARBMkYNASADENEBIANBOGogAkGABGpBOGopAwA3AwAgA0EwaiACQYAEakEwaikDADcDACADQShqIAJBgARqQShqKQMANwMAIANBIGogAkGABGpBIGopAwA3AwAgA0EYaiACQYAEakEYaikDADcDACADQRBqIAJBgARqQRBqKQMANwMAIAQgAkGABGpBCGopAwA3AwAgAyACKQOABDcDAAwBCyADIAEQRgsgACgCOCIDRQ0FIAAoAjQhBCADQQxsIQcDQAJAAkAgBCgCACIDKAIAQRpHDQAgAkHAA2ogASgCACABKAIEIANBCGoiCBCCDSACKALAA0EyRg0BIAMQ0QEgA0E4aiACQcADakE4aikDADcDACADQTBqIAJBwANqQTBqKQMANwMAIANBKGogAkHAA2pBKGopAwA3AwAgA0EgaiACQcADakEgaikDADcDACADQRhqIAJBwANqQRhqKQMANwMAIANBEGogAkHAA2pBEGopAwA3AwAgCCACQcADakEIaikDADcDACADIAIpA8ADNwMADAELIAMgARBGCyAEQQxqIQQgB0F0aiIHDQAMBgsLIAAoAgwiBEUNBCAAKAIIIQMgBEEwbCEEA0AgAyABEHAgA0EwaiEDIARBUGoiBA0ADAULCwJAIAAoAiQiA0UNAAJAIAMoAgBBGkcNACACQYADaiABKAIAIAEoAgQgA0EIaiIEEIINIAIoAoADQTJGDQEgAxDRASADQThqIAJBgANqQThqKQMANwMAIANBMGogAkGAA2pBMGopAwA3AwAgA0EoaiACQYADakEoaikDADcDACADQSBqIAJBgANqQSBqKQMANwMAIANBGGogAkGAA2pBGGopAwA3AwAgA0EQaiACQYADakEQaikDADcDACAEIAJBgANqQQhqKQMANwMAIAMgAikDgAM3AwAMAQsgAyABEEYLIAAoAjQiA0UNAyAAKAIwIQQgA0EMbCEHA0ACQAJAIAQoAgAiAygCAEEaRw0AIAJBwAJqIAEoAgAgASgCBCADQQhqIggQgg0gAigCwAJBMkYNASADENEBIANBOGogAkHAAmpBOGopAwA3AwAgA0EwaiACQcACakEwaikDADcDACADQShqIAJBwAJqQShqKQMANwMAIANBIGogAkHAAmpBIGopAwA3AwAgA0EYaiACQcACakEYaikDADcDACADQRBqIAJBwAJqQRBqKQMANwMAIAggAkHAAmpBCGopAwA3AwAgAyACKQPAAjcDAAwBCyADIAEQRgsgBEEMaiEEIAdBdGoiBw0ADAQLCwJAIAAoAghBA0cNAAJAIAAoAgwiAygCAEEaRw0AIAJBgAJqIAEoAgAgASgCBCADQQhqIgQQgg0gAigCgAJBMkYNASADENEBIANBOGogAkGAAmpBOGopAwA3AwAgA0EwaiACQYACakEwaikDADcDACADQShqIAJBgAJqQShqKQMANwMAIANBIGogAkGAAmpBIGopAwA3AwAgA0EYaiACQYACakEYaikDADcDACADQRBqIAJBgAJqQRBqKQMANwMAIAQgAkGAAmpBCGopAwA3AwAgAyACKQOAAjcDAAwBCyADIAEQRgsCQCAAKAI8IgNFDQACQCADKAIAQRpHDQAgAkHAAWogASgCACABKAIEIANBCGoiBBCCDSACKALAAUEyRg0BIAMQ0QEgA0E4aiACQcABakE4aikDADcDACADQTBqIAJBwAFqQTBqKQMANwMAIANBKGogAkHAAWpBKGopAwA3AwAgA0EgaiACQcABakEgaikDADcDACADQRhqIAJBwAFqQRhqKQMANwMAIANBEGogAkHAAWpBEGopAwA3AwAgBCACQcABakEIaikDADcDACADIAIpA8ABNwMADAELIAMgARBGCyAAKAI4IgNFDQIgACgCNCEEIANBDGwhBwNAAkACQCAEKAIAIgMoAgBBGkcNACACQYABaiABKAIAIAEoAgQgA0EIaiIIEIINIAIoAoABQTJGDQEgAxDRASADQThqIAJBgAFqQThqKQMANwMAIANBMGogAkGAAWpBMGopAwA3AwAgA0EoaiACQYABakEoaikDADcDACADQSBqIAJBgAFqQSBqKQMANwMAIANBGGogAkGAAWpBGGopAwA3AwAgA0EQaiACQYABakEQaikDADcDACAIIAJBgAFqQQhqKQMANwMAIAMgAikDgAE3AwAMAQsgAyABEEYLIARBDGohBCAHQXRqIgcNAAwDCwsCQCAAKAIwIgVBCGooAgAiA0UNACAFQQRqKAIAIgYgA0EGdGohAANAAkAgBkE4aigCACIDRQ0AIAZBNGooAgAhBCADQQxsIQcDQAJAAkAgBCgCACIDKAIAQRpHDQAgAkHABmogASgCACABKAIEIANBCGoiCBCCDSACKALABkEyRg0BIAMQ0QEgA0E4aiACQcAGakE4aikDADcDACADQTBqIAJBwAZqQTBqKQMANwMAIANBKGogAkHABmpBKGopAwA3AwAgA0EgaiACQcAGakEgaikDADcDACADQRhqIAJBwAZqQRhqKQMANwMAIANBEGogAkHABmpBEGopAwA3AwAgCCACQcAGakEIaikDADcDACADIAIpA8AGNwMADAELIAMgARBGCyAEQQxqIQQgB0F0aiIHDQALCyAGIAEQmwQgBkHAAGoiAyEGIAMgAEcNAAsLAkAgBUEUaigCACIDRQ0AIAVBEGooAgAhBCADQQxsIQcDQAJAAkAgBCgCACIDKAIAQRpHDQAgAkGABmogASgCACABKAIEIANBCGoiCBCCDSACKAKABkEyRg0BIAMQ0QEgA0E4aiACQYAGakE4aikDADcDACADQTBqIAJBgAZqQTBqKQMANwMAIANBKGogAkGABmpBKGopAwA3AwAgA0EgaiACQYAGakEgaikDADcDACADQRhqIAJBgAZqQRhqKQMANwMAIANBEGogAkGABmpBEGopAwA3AwAgCCACQYAGakEIaikDADcDACADIAIpA4AGNwMADAELIAMgARBGCyAEQQxqIQQgB0F0aiIHDQALCyAFKAIYQYCAgIB4Rg0BIAVBIGooAgAiBEUNASAFQRxqKAIAIQMgBEEwbCEEA0AgAyABEHAgA0EwaiEDIARBUGoiBA0ADAILCwJAIAAoAkgiA0UNACAAKAJEIgYgA0EGdGohBQNAAkACQCAGKAIAQQdGDQACQCAGQThqKAIAIgNFDQAgBkE0aigCACEEIANBDGwhBwNAAkACQCAEKAIAIgMoAgBBGkcNACACQcAFaiABKAIAIAEoAgQgA0EIaiIIEIINIAIoAsAFQTJGDQEgAxDRASADQThqIAJBwAVqQThqKQMANwMAIANBMGogAkHABWpBMGopAwA3AwAgA0EoaiACQcAFakEoaikDADcDACADQSBqIAJBwAVqQSBqKQMANwMAIANBGGogAkHABWpBGGopAwA3AwAgA0EQaiACQcAFakEQaikDADcDACAIIAJBwAVqQQhqKQMANwMAIAMgAikDwAU3AwAMAQsgAyABEEYLIARBDGohBCAHQXRqIgcNAAsLIAYgARCqAwwBCwJAIAZBOGooAgAiA0UNACAGQTRqKAIAIQQgA0EMbCEHA0ACQAJAIAQoAgAiAygCAEEaRw0AIAJBgAVqIAEoAgAgASgCBCADQQhqIggQgg0gAigCgAVBMkYNASADENEBIANBOGogAkGABWpBOGopAwA3AwAgA0EwaiACQYAFakEwaikDADcDACADQShqIAJBgAVqQShqKQMANwMAIANBIGogAkGABWpBIGopAwA3AwAgA0EYaiACQYAFakEYaikDADcDACADQRBqIAJBgAVqQRBqKQMANwMAIAggAkGABWpBCGopAwA3AwAgAyACKQOABTcDAAwBCyADIAEQRgsgBEEMaiEEIAdBdGoiBw0ACwsgBi0AHEECRw0AAkACQAJAAkACQAJAIAYoAggiAygCAA4HBQABAgQFAwULIANBDGooAgAiBEUNBCADQQhqKAIAIQMgBEEobCEEA0ACQCADKAIAQQdGDQAgAyABEKoDCyADQShqIQMgBEFYaiIEDQAMBQsLIAMoAgQgARCqAwwDCyADQQxqKAIAIgRFDQIgA0EIaigCACEDIARBOGwhBANAAkACQAJAAkACQCADKAIADgMAAQIACyADQQhqIAEQowQMAwsgA0EwaigCACIHRQ0CIAcoAgBBGkcNASACQcAIaiABKAIAIAEoAgQgB0EIaiIIEIINIAIoAsAIQTJGDQIgBxDRASAHQThqIAJBwAhqQThqKQMANwMAIAdBMGogAkHACGpBMGopAwA3AwAgB0EoaiACQcAIakEoaikDADcDACAHQSBqIAJBwAhqQSBqKQMANwMAIAdBGGogAkHACGpBGGopAwA3AwAgB0EQaiACQcAIakEQaikDADcDACAIIAJBwAhqQQhqKQMANwMAIAcgAikDwAg3AwAMAgsgA0EEaiABENwFDAELIAcgARBGCyADQThqIQMgBEFIaiIEDQAMAwsLAkAgAygCBCIDKAIAQRpHDQAgAkHACGogASgCACABKAIEIANBCGoiBBCCDSACKALACEEyRg0CIAMQ0QEgA0E4aiACQcAIakE4aikDADcDACADQTBqIAJBwAhqQTBqKQMANwMAIANBKGogAkHACGpBKGopAwA3AwAgA0EgaiACQcAIakEgaikDADcDACADQRhqIAJBwAhqQRhqKQMANwMAIANBEGogAkHACGpBEGopAwA3AwAgBCACQcAIakEIaikDADcDACADIAIpA8AINwMADAILIAMgARBGDAELIAMoAgQgARCqAwJAIAMoAggiAygCAEEaRw0AIAJBwAhqIAEoAgAgASgCBCADQQhqIgQQgg0gAigCwAhBMkYNASADENEBIANBOGogAkHACGpBOGopAwA3AwAgA0EwaiACQcAIakEwaikDADcDACADQShqIAJBwAhqQShqKQMANwMAIANBIGogAkHACGpBIGopAwA3AwAgA0EYaiACQcAIakEYaikDADcDACADQRBqIAJBwAhqQRBqKQMANwMAIAQgAkHACGpBCGopAwA3AwAgAyACKQPACDcDAAwBCyADIAEQRgsCQCAGKAIMIgMoAgBBGkcNACACQYAIaiABKAIAIAEoAgQgA0EIaiIEEIINIAIoAoAIQTJGDQEgAxDRASADQThqIAJBgAhqQThqKQMANwMAIANBMGogAkGACGpBMGopAwA3AwAgA0EoaiACQYAIakEoaikDADcDACADQSBqIAJBgAhqQSBqKQMANwMAIANBGGogAkGACGpBGGopAwA3AwAgA0EQaiACQYAIakEQaikDADcDACAEIAJBgAhqQQhqKQMANwMAIAMgAikDgAg3AwAMAQsgAyABEEYLIAZBwABqIgYgBUcNAAsLIAAoAiBBgICAgHhGDQAgACgCKCIERQ0AIAAoAiQhAyAEQTBsIQQDQCADIAEQcCADQTBqIQMgBEFQaiIEDQALCyACQYAJaiQAC6wtAgx/An4jAEHgAGsiAiQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIAIgNBfGoiBEEEIARBB0kbDgcAAQIDBAUGAAsgAS0ANEEBRw0MIAEoAjAQlxMhBCACQcAAakEIakEAKQOY/5wBIg43AwAgAkHAAGpBEGpBACkDkP+cASIPNwMAIAJBwABqQRhqIA43AwAgAkE0aiABQTRqKAIANgIAIAJBCGogDjcDACACQRBqIA83AwAgAkEYaiAONwMAIAIg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Ai8AOSEEIAJBgQI7ADkgASgCACACEIACIAIgBDsAOQsgA0EoaiIDIAdHDQALCwJAIAAoAhgiAUUNACACLQA0QQFHDQAgAi8AOSEEIAJBgQI7ADkgASgCACACEIACIAIgBDsAOQsCQCACKAIEIgFFDQAgAigCACACKAIMENoMIAEgAUEEdEEXakFwcSIEakEJaiIBRQ0AIAIoAgAgBGsgAUEIEL0TCyACQRBqENYXDAsLIAEtADRBAUcNCiAALQAVRQ0JIAEtADkhBCABQQE6ADkgACgCECABEG0gASAEOgA5DAkLIAAtABQNAwwHCyAALQA0RQ0FIAEtADkhBCABQQE6ADkgACgCMCABEG0gASAEOgA5DAULIAEtADRBAUcNByABKAIwEJcTIQQgAkHAAGpBCGpBACkDmP+cASIONwMAIAJBwABqQRBqQQApA5D/nAEiDzcDACACQcAAakEYaiAONwMAIAJBNGogAUE0aigCADYCACACQQhqIA43AwAgAkEQaiAPNwMAIAJBGGogDjcDACACIA83A0AgAiABKQIsNwIsIAIgDzcDACABLQA4IQMgAS0APSEFIAIgAS8AOzsAOyACQYECOwA5IAJBAToAKCACIAQ2AiQgAiABNgIgIAIgBToAPSACIAM6ADgCQCAAKAIgIgFFDQAgAi0ANEEBRw0AIAJBADoAOSACIAEQoQsgAkEBOgA6CyAALQAkDQIMAwsgAS0ANEEBRw0GIAAoAgwhAyAAKAIIIQQgAiABNgIAAkAgA0UNACADQShsIQMDQCACIAQQngUgBEEoaiEEIANBWGoiAw0ACwsgACgCECIERQ0GIAEtADRBAUcNBiABLwA5IQAgAUGBAjsAOSAEKAIAIAEQgAIgASAAOwA5DAYLIAEtADkhBCABQQE6ADkgACgCBCABEG0gASAEOgA5DAMLIAItADkhASACQQE6ADkgACgCECACEG0gAiABOgA5CwJAIAAoAgwiAUUNACACLQA0QQFHDQAgACgCCCIDIAFBKGxqIQcgAkHAAGpBDGohCCACQcAAakEIaiEJA0ACQCACLQA0QQFHDQACQAJAAkACQCADKAIADgQAAQIDAAsgAi0AOiEEIAItADkhAQJAIAMoAiAiBUUNACACQYECOwA5IAUoAgAgAhCAAiACIAQ6ADoLIAIgAToAOSACIANBCGoQ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ACgCICIEKAIwIgNFDQAgAS0AOSEHIAFBAToAOSADIAEQbSABIAc6ADkLIAEoAjAQlxMhAyACQdABakE0aiABQTRqKAIANgIAIAJBADoAiQIgAkHQAWpBCGpBACkDmP+cASILNwMAIAJB4AFqQQApA5D/nAEiDDcDACACQegBaiALNwMAIAIgATYC8AEgAiADNgL0ASACQQE6APgBIAIgASkCLDcC/AEgAiABKAE6NgGKAiACIAEtADg6AIgCIAIgDDcD0AECQCAALQAcQQJGDQAgAkHQAWogAEEIahCbEQsgAkEBOgCJAiACQdABaiAEEHkCQCACKALUASIBRQ0AIAIoAtABIAIoAtwBENoMIAEgAUEEdEEXakFwcSIAakEJaiIBRQ0AIAIoAtABIABrIAFBCBC9EwsgAkHgAWoQ1hcMDwsgACgCDCIARQ0OIAEtADkhBCABQQE6ADkgACABEG0gASAEOgA5DA4LIAEtADkhBCABQQE6ADkgACgCBCABEG0gASAEOgA5DA0LIAEtADkhBCABQQE6ADkgACgCBCABEG0gASAEOgA5DAwLIABBIGohBAJAIAAtADRBAkcNAANAIAQoAgAiAEEYaiEEIAAtACxBAkYNAAsLIAEgBBCbEQwLCyAAKAIEIAEQ4QEMCgsgACgCDCEEIAAoAgghACACIAE2AtABIARFDQkgBEEobCEBA0AgAkHQAWogABCJBSAAQShqIQAgAUFYaiIBDQAMCgsLAkACQCABLQA0DQAgAS0AOSEEDAELIAEtADkhBCABLQA6IQMgAUGBAjsAOSAAKAIIIAEQgAIgASADOgA6CyABQQE6ADkgACgCBCABEG0gASAEOgA5DAgLIAEtADkhBCABQQE6ADkgACgCBCABEG0gASAEOgA5DAcLIAEtADkhBCABQQE6ADkgACgCBCABEG0gASAEOgA5DAYLAkACQCABLQA0DQAgAS0AOSEEDAELIAEtADkhBCABLQA6IQMgAUGBAjsAOSAAKAIIIAEQgAIgASADOgA6CyABQQE6ADkgACgCBCABEG0gASAEOgA5DAULIAEtADkhByABQQE6ADkgACgCBCABEG0gASAHOgA5IAEtADRBAUcNBCAAKAIIIQAgAS0AOiEGIAFBgQI7ADkCQCAAKAIIIgRFDQAgACgCBCEAIARBAnQhBANAAkAgAS0ANEEBRw0AIAAoAgAhAyABQYECOwA5IAMgARCAAiABQYECOwA5CyAAQQRqIQAgBEF8aiIEDQALCyABIAY6ADogASAHOgA5DAQLAkACQCABLQA0DQAgAS0AOSEEDAELIAEtADkhBCABLQA6IQMgAUGBAjsAOSAAKAIIIAEQgAIgASADOgA6CyABQQE6ADkgACgCBCABEG0gASAEOgA5DAMLAkAgACgCBCIAKAIAQQNHDQAgAEEEaiABENIIDAMLIAAgARCfGgwCCyACIAM2AkALAkAgB0UNACACQSBqEIIRCwJAIAAoAgwiBEUNACAAKAIIIQEgBEEobCEEA0AgASACQdABahCaBCABQShqIQEgBEFYaiIEDQALCyACIAU6AIkCAkACQCAGKAIAQYCAgIB4Rw0AIAYoAgQhASACQQE6AIkCIAEgAkHQAWoQbSACIAU6AIkCDAELAkAgBigCFA0AIAIoAvQBIgFFDQAgBkEAIAEQjQY2AhQLAkAgAi0AjQIiAw0AAkAgBigCCA0AIAJBADoAjQIMAQsgAiAGKAIEIgEoAgAgAUEEaigCABDnFjoAjQILIAJBADsARSACQShqQQApA5j/nAEiCzcDACACQThqIAs3AwAgAiACLQCIAjoARCACQQApA5D/nAEiCzcDICACIAs3AzAgAiACQdABajYCQCACQSBqIAYQqgcgAkEgahDWFyACQTBqENYXAkAgBigCCCIERQ0AIAYoAgQhASAEQTBsIQQDQCABIAJB0AFqEMcBIAFBMGohASAEQVBqIgQNAAsLIAIgAzoAjQILAkAgACgCJCIBRQ0AIAItAIQCQQFHDQAgAi8AiQIhACACQYECOwCJAiABKAIAIAJB0AFqEIACIAIgADsAiQILAkAgAigC1AEiAUUNACACKALQASACKALcARDaDCABIAFBBHRBF2pBcHEiAGpBCWoiAUUNACACKALQASAAayABQQgQvRMLIAJB4AFqENYXCyACQbACaiQAC9IoAQl/IwBBEGsiAiQAIAFBEGohAwJAAkACQAJAAkADQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIAIgRBdGoiBUEHIAVBJkkbDiYdAAECAwQFBgcICQoLDB0dDQ4PEBEdEhITHR0UFRYXFxkaGx0cHR0L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KGopAwA3AwAgA0EgaiACQSBqKQMANwMAIANBGGogAkEYaikDADcDACADQRBqIAJBEGopAwA3AwAgBCACQQhqKQMANwMAIAMgAikDADcDAAsgACgCCCEADBcLIAAoAgwiAEUNFyAAKAIAQRpHDQ0gAkHABGogASgCACABKAIEIABBCGoiARCCDSACKALABEEyRg0XIAAQ0QEgAEE4aiACQcAEakE4aikDADcDACAAQTBqIAJBwARqQTBqKQMANwMAIABBKGogAkHABGpBKGopAwA3AwAgAEEgaiACQcAEakEgaikDADcDACAAQRhqIAJBwARqQRhqKQMANwMAIABBEGogAkHABGpBEGopAwA3AwAgASACQcAEakEIaikDADcDACAAIAIpA8AENwMADBcLIAAoAighAAwVCyAAKAIEIgMoAgBBGkcNCiACQcAAaiABKAIAIAEoAgQgA0EIaiIEEIINIAIoAkBBMkYNEyADENEBIANBOGogAkHAAGpBOGopAwA3AwAgA0EwaiACQcAAakEwaikDADcDACADQShqIAJBwABqQShqKQMANwMAIANBIGogAkHAAGpBIGopAwA3AwAgA0EYaiACQcAAakEYaikDADcDACADQRBqIAJBwABqQRBqKQMANwMAIAQgAkHAAGpBCGopAwA3AwAgAyACKQNANwMADBMLIAAoAhAiAygCAEEaRw0IIAJBgAFqIAEoAgAgASgCBCADQQhqIgQQgg0gAigCgAFBMkYNESADENEBIANBOGogAkGAAWpBOGopAwA3AwAgA0EwaiACQYABakEwaikDADcDACADQShqIAJBgAFqQShqKQMANwMAIANBIGogAkGAAWpBIGopAwA3AwAgA0EYaiACQYABakEYaikDADcDACADQRBqIAJBgAFqQRBqKQMANwMAIAQgAkGAAWpBCGopAwA3AwAgAyACKQOAATcDAAwRCyAAKAIEIgAoAgBBGkcNBiACQcABaiABKAIAIAEoAgQgAEEIaiIBEIINIAIoAsABQTJGDRMgABDRASAAQThqIAJBwAFqQThqKQMANwMAIABBMGogAkHAAWpBMGopAwA3AwAgAEEoaiACQcABakEoaikDADcDACAAQSBqIAJBwAFqQSBqKQMANwMAIABBGGogAkHAAWpBGGopAwA3AwAgAEEQaiACQcABakEQaikDADcDACABIAJBwAFqQQhqKQMANwMAIAAgAikDwAE3AwAMEwsCQCAAKAIEIgQoAlAiA0UNACAEKAJMIQAgA0EwbCEDA0AgACABEHAgAEEwaiEAIANBUGoiAw0ACwsCQAJAAkAgBCgCAEF5ag4CAQIACyAEIAEQqgMLIAQoAjAiA0UNACAEKAIsIQAgA0EwbCEDA0AgACABEHAgAEEwaiEAIANBUGoiAw0ACwsgBCgCYEGAgICAeEYNEiAEKAJoIgNFDRIgBCgCZCEAIANBMGwhAwNAIAAgARBwIABBMGohACADQVBqIgMNAAwTCwsgACgCBCIDKAIAQRpHDQMgAkGAAmogASgCACABKAIEIANBCGoiBBCCDQJAIAIoAoACQTJGDQAgAxDRASADQThqIAJBgAJqQThqKQMANwMAIANBMGogAkGAAmpBMGopAwA3AwAgA0EoaiACQYACakEoaikDADcDACADQSBqIAJBgAJqQSBqKQMANwMAIANBGGogAkGAAmpBGGopAwA3AwAgA0EQaiACQYACakEQaikDADcDACAEIAJBgAJqQQhqKQMANwMAIAMgAikDgAI3AwALIAAoAgghAAwQCyAAKAIEIgMoAgBBGkcNASACQcACaiABKAIAIAEoAgQgA0EIaiIEEIINAkAgAigCwAJBMkYNACADENEBIANBOGogAkHAAmpBOGopAwA3AwAgA0EwaiACQcACakEwaikDADcDACADQShqIAJBwAJqQShqKQMANwMAIANBIGogAkHAAmpBIGopAwA3AwAgA0EYaiACQcACakEYaikDADcDACADQRBqIAJBwAJqQRBqKQMANwMAIAQgAkHAAmpBCGopAwA3AwAgAyACKQPAAjcDAAsgACgCCCEADA8LIAAoAgQiA0ECRg0LAkACQCADQQFxRQ0AIAAoAggiAygCAEEaRw0BIAJBgAZqIAEoAgAgASgCBCADQQhqIgQQgg0gAigCgAZBMkYNDSADENEBIANBOGogAkGABmpBOGopAwA3AwAgA0EwaiACQYAGakEwaikDADcDACADQShqIAJBgAZqQShqKQMANwMAIANBIGogAkGABmpBIGopAwA3AwAgA0EYaiACQYAGakEYaikDADcDACADQRBqIAJBgAZqQRBqKQMANwMAIAQgAkGABmpBCGopAwA3AwAgAyACKQOABjcDAAwNCyAAKAIIIgMoAggiBEUNDCADKAIEIgMgBEE4bGohBQNAIAMgARCqAwJAIANBMGooAgAiBEUNAAJAIAQoAgBBGkcNACACQYAHaiABKAIAIAEoAgQgBEEIaiIGEIINIAIoAoAHQTJGDQEgBBDRASAEQThqIAJBgAdqQThqKQMANwMAIARBMGogAkGAB2pBMGopAwA3AwAgBEEoaiACQYAHakEoaikDADcDACAEQSBqIAJBgAdqQSBqKQMANwMAIARBGGogAkGAB2pBGGopAwA3AwAgBEEQaiACQYAHakEQaikDADcDACAGIAJBgAdqQQhqKQMANwMAIAQgAikDgAc3AwAMAQsgBCABEEYLIANBOGoiAyAFRw0ADA0LCyADIAEQRgwLCyADIAEQRiAAKAIIIQAMDQsgAyABEEYgACgCCCEADAwLIAAgARBGDAwLIAMgARBGDAgLIAMgARBGDAgLIAAgARBGDAkLIAMgARBGIAAoAgghAAwHCwJAIAAoAgQiACgCAEEaRw0AIAJBgARqIAEoAgAgASgCBCAAQQhqIgEQgg0gAigCgARBMkYNCCAAENEBIABBOGogAkGABGpBOGopAwA3AwAgAEEwaiACQYAEakEwaikDADcDACAAQShqIAJBgARqQShqKQMANwMAIABBIGogAkGABGpBIGopAwA3AwAgAEEYaiACQYAEakEYaikDADcDACAAQRBqIAJBgARqQRBqKQMANwMAIAEgAkGABGpBCGopAwA3AwAgACACKQOABDcDAAwICyAAIAEQRgwHCyAAQQhqIAEQzQEMBgsCQAJAAkACQCAAKAIEDgMAAgEACyAAKAIIIgMoAggiBEUNAiADKAIEIgMgBEE4bGohBQNAIAMgARCqAwJAIANBMGooAgAiBEUNAAJAIAQoAgBBGkcNACACQYAHaiABKAIAIAEoAgQgBEEIaiIGEIINIAIoAoAHQTJGDQEgBBDRASAEQThqIAJBgAdqQThqKQMANwMAIARBMGogAkGAB2pBMGopAwA3AwAgBEEoaiACQYAHakEoaikDADcDACAEQSBqIAJBgAdqQSBqKQMANwMAIARBGGogAkGAB2pBGGopAwA3AwAgBEEQaiACQYAHakEQaikDADcDACAGIAJBgAdqQQhqKQMANwMAIAQgAikDgAc3AwAMAQsgBCABEEYLIANBOGoiAyAFRw0ADAMLCyAAKAIIIAEQmwQMAQsgACgCCCIDKAIIIgRFDQAgAygCBCIDIARBOGxqIQUDQCADIAEQqgMCQCADQTBqKAIAIgRFDQACQCAEKAIAQRpHDQAgAkGAB2ogASgCACABKAIEIARBCGoiBhCCDSACKAKAB0EyRg0BIAQQ0QEgBEE4aiACQYAHakE4aikDADcDACAEQTBqIAJBgAdqQTBqKQMANwMAIARBKGogAkGAB2pBKGopAwA3AwAgBEEgaiACQYAHakEgaikDADcDACAEQRhqIAJBgAdqQRhqKQMANwMAIARBEGogAkGAB2pBEGopAwA3AwAgBiACQYAHakEIaikDADcDACAEIAIpA4AHNwMADAELIAQgARBGCyADQThqIgMgBUcNAAsLAkAgACgCDCIDKAIAQRpHDQAgAkHAA2ogASgCACABKAIEIANBCGoiBBCCDQJAIAIoAsADQTJGDQAgAxDRASADQThqIAJBwANqQThqKQMANwMAIANBMGogAkHAA2pBMGopAwA3AwAgA0EoaiACQcADakEoaikDADcDACADQSBqIAJBwANqQSBqKQMANwMAIANBGGogAkHAA2pBGGopAwA3AwAgA0EQaiACQcADakEQaikDADcDACAEIAJBwANqQQhqKQMANwMAIAMgAikDwAM3AwALIAAoAhAhAAwFCyADIAEQRiAAKAIQIQAMBAsCQAJAAkACQCAAKAIEDgMAAgEACyAAKAIIIgMoAggiBEUNAiADKAIEIgMgBEE4bGohBQNAIAMgARCqAwJAIANBMGooAgAiBEUNAAJAIAQoAgBBGkcNACACQYAHaiABKAIAIAEoAgQgBEEIaiIGEIINIAIoAoAHQTJGDQEgBBDRASAEQThqIAJBgAdqQThqKQMANwMAIARBMGogAkGAB2pBMGopAwA3AwAgBEEoaiACQYAHakEoaikDADcDACAEQSBqIAJBgAdqQSBqKQMANwMAIARBGGogAkGAB2pBGGopAwA3AwAgBEEQaiACQYAHakEQaikDADcDACAGIAJBgAdqQQhqKQMANwMAIAQgAikDgAc3AwAMAQsgBCABEEYLIANBOGoiAyAFRw0ADAMLCyAAKAIIIAEQmwQMAQsgACgCCCIDKAIIIgRFDQAgAygCBCIDIARBOGxqIQUDQCADIAEQqgMCQCADQTBqKAIAIgRFDQACQCAEKAIAQRpHDQAgAkGAB2ogASgCACABKAIEIARBCGoiBhCCDSACKAKAB0EyRg0BIAQQ0QEgBEE4aiACQYAHakE4aikDADcDACAEQTBqIAJBgAdqQTBqKQMANwMAIARBKGogAkGAB2pBKGopAwA3AwAgBEEgaiACQYAHakEgaikDADcDACAEQRhqIAJBgAdqQRhqKQMANwMAIARBEGogAkGAB2pBEGopAwA3AwAgBiACQYAHakEIaikDADcDACAEIAIpA4AHNwMADAELIAQgARBGCyADQThqIgMgBUcNAAsLAkAgACgCDCIDKAIAQRpHDQAgAkGAA2ogASgCACABKAIEIANBCGoiBBCCDQJAIAIoAoADQTJGDQAgAxDRASADQThqIAJBgANqQThqKQMANwMAIANBMGogAkGAA2pBMGopAwA3AwAgA0EoaiACQYADakEoaikDADcDACADQSBqIAJBgANqQSBqKQMANwMAIANBGGogAkGAA2pBGGopAwA3AwAgA0EQaiACQYADakEQaikDADcDACAEIAJBgANqQQhqKQMANwMAIAMgAikDgAM3AwALIAAoAhAhAAwECyADIAEQRiAAKAIQIQAMAwsCQCAAKAIYIgNFDQACQCADKAIAQRpHDQAgAkHABWogASgCACABKAIEIANBCGoiBBCCDSACKALABUEyRg0BIAMQ0QEgA0E4aiACQcAFakE4aikDADcDACADQTBqIAJBwAVqQTBqKQMANwMAIANBKGogAkHABWpBKGopAwA3AwAgA0EgaiACQcAFakEgaikDADcDACADQRhqIAJBwAVqQRhqKQMANwMAIANBEGogAkHABWpBEGopAwA3AwAgBCACQcAFakEIaikDADcDACADIAIpA8AFNwMADAELIAMgARBGCwJAAkAgACgCHCIDRQ0AIAMoAgBBGkcNASACQYAFaiABKAIAIAEoAgQgA0EIaiIEEIINIAIoAoAFQTJGDQAgAxDRASADQThqIAJBgAVqQThqKQMANwMAIANBMGogAkGABWpBMGopAwA3AwAgA0EoaiACQYAFakEoaikDADcDACADQSBqIAJBgAVqQSBqKQMANwMAIANBGGogAkGABWpBGGopAwA3AwAgA0EQaiACQYAFakEQaikDADcDACAEIAJBgAVqQQhqKQMANwMAIAMgAikDgAU3AwALIAAoAgwhAAwDCyADIAEQRiAAKAIMIQAMAgsgACgCDCIDRQ0CIAAoAggiBCADQRhsaiEFA0ACQCAEKAIUIgBFDQACQCAAKAIAQRpHDQAgAkHABmogASgCACABKAIEIABBCGoiAxCCDSACKALABkEyRg0BIAAQ0QEgAEE4aiACQcAGakE4aikDADcDACAAQTBqIAJBwAZqQTBqKQMANwMAIABBKGogAkHABmpBKGopAwA3AwAgAEEgaiACQcAGakEgaikDADcDACAAQRhqIAJBwAZqQRhqKQMANwMAIABBEGogAkHABmpBEGopAwA3AwAgAyACQcAGakEIaikDADcDACAAIAIpA8AGNwMADAELIAAgARBGCwJAIARBCGooAgAiA0UNACAEQQRqKAIAIQAgA0EwbCEDA0AgACABEHAgAEEwaiEAIANBUGoiAw0ACwsgBEEYaiIEIAVGDQMMAAsLIAAoAgggARBwIAAoAhQiAA0ACwsgAkHAB2okAAuRJwIbfwh+IwBB4A5rIgQkACABvSEfAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAGZRAAAAAAAAPB/Yg0AQQMhBQwBCyAfQoCAgICAgID4/wCDIiBCgICAgICAgPj/AFENBSAfQv////////8HgyIhQoCAgICAgIAIhCAfQgGGQv7///////8PgyAfQjSIp0H/D3EiBRsiIkIBgyEjICBCAFINAiAhUEUNAUEEIQULIAVBfmohBgwDCyAFQc13aiEHICOnQQFzIQZCASEhDAELQoCAgICAgIAgICJCAYYgIkKAgICAgICACFEiCBshIkICQgEgCBshISAjp0EBcyEGQct3Qcx3IAgbIAVqIQcLIAZBfnIiBkUNAQsgA0H//wNxIQlBASEFQbibmwFBuZubASAfQgBTIggbQbibmwFBASAIGyACGyEKQQEgH0I/iKcgAhshCyAGQQMgBkEDSRtBf2oOAwECAwELIARBAzYCxA0gBEH49JoBNgLADSAEQQI7AbwNQQEhCiAEQbwNaiECQQAhC0EBIQUMBAsgBEEDNgLEDSAEQaGMgQE2AsANIARBAjsBvA0gBEG8DWohAgwDC0ECIQUgBEECOwG8DSADQf//A3FFDQEgBCAJNgLMDSAEQQA7AcgNIARBAjYCxA0gBEHM15gBNgLADSAE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B0HY8oMBENEiAAtBAEEAQezhgwEQwxIACyANIAtBjOKDARDDEgALIAEgC0G84YMBEMMSAAsgA0EANgIIQQBBpLeYASADQQRqIANBCGpB3OGDARDHGwALIAEgBkG48oMBEMMSAAsgA0EANgIYIANBATYCDCADQcTmgwE2AgggA0IENwIQIANBCGpBzOaDARCoHQALIAYgB0HY8oMBENEiAAtBAEEAQezhgwEQwxIACyAEIAxBjOKDARDDEgALIAEgDEG84YMBEMMSAAsgA0EANgIIQQBBpLeYASADQQRqIANBCGpB3OGDARDHGwALIAEgB0G48oMBEMMSAAsgA0EANgIYIANBATYCDCADQcTmgwE2AgggA0IENwIQIANBCGpBzOaDARCoHQALIAYgB0HY8oMBENEiAAtBAEEAQezhgwEQwxIACyANIAtBjOKDARDDEgALIAEgC0G84YMBEMMSAAsgA0EANgIIQQBBpLeYASADQQRqIANBCGpB3OGDARDHGwALIAEgBkG48oMBEMMSAAsgA0EANgIYIANBATYCDCADQcTmgwE2AgggA0IENwIQIANBCGpBzOaDARCoHQALIAYgB0HY8oMBENEiAAtBAEEAQezhgwEQwxIACyAEIAxBjOKDARDDEgALIAEgDEG84YMBEMMSAAsgA0EANgIIQQBBpLeYASADQQRqIANBCGpB3OGDARDHGwALIAEgB0G48oMBEMMSAAsgA0EANgIYIANBATYCDCADQcTmgwE2AgggA0IENwIQIANBCGpBzOaDARCoHQALIAJBADYCGCACIAY2AhQgAkEBNgIQIAIgBDYCICACQQA2AgALAkAgBCAFTw0AIABBLGohDiABKAIMIQ8gASgCCCEQA0ACQAJAAkACQAJAAkACQAJAIAQgD08NAAJAAkAgBiAAKAIIIg1JDQAgBiEIDAELIA4gECAEai0AAGotAAAiAUECaiERIAAoAgQhCSAGIQgDQAJAAkACQAJAIAkgCEECdGooAgAiBkH/AXFBgn5qDgICAAELIBEgCGoiBiANTw0GIAkgBkECdGooAgAiBkEBRg0CDAwLIA0gCEECaiIKSQ0GIAZBAnZBP3EgBkEDcUEAR2oiEiANIAprIgZLDQcgEkECdCEHIAkgCkECdGohC0F/IQwCQAJAAkADQCAHRQ0FIAxBAWohDCABIAso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AwJAAkAgBiABQQJ0aigCACILQX9MDQACQCABQQFqIgEgB08NACAGIAFBAnRqKAIAIQEMAgsgASAHQczhgwEQwxIACyALQf////8HcSEBCyABIAAoAhQiBk8NBCAEQQFqIgYgACgCECABQQJ0aigCACIHSQ0FIAIgATYCDCACIAY2AgggAkEBNgIAIAIgBiAHazYCBAsgA0EgaiQADwsgBiANQcjygwEQ0SIAC0EAQQBB7OGDARDDEgALIAEgB0G84YMBEMMSAAsgASAGQbjygwEQwxIACyADQQA2AhggA0EBNgIMIANBxOaDATYCCCADQgQ3AhAgA0EIakHM5oMBEKgdAAvoMQECfyMAQRBrIgIkAAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgAiAygCACIAQTQgAEG9gYCAeEgbQf8BcQ69AQABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gAGBAYIBgwGEAYUBhgGHAYgBiQGKAYsBjAGNAY4BjwGQAZEBkgGTAZQBlQGWAZcBmAGZAZoBmwGcAZ0BngGfAaABoQGiAaMBpAGlAaYBpwGoAakBqgGr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AwAgA0EwaiAFQTBqKQMANwMAIANBKGogBUEoaikDADcDACADQSBqIAVBIGopAwA3AwAgA0EYaiAFQRhqKQMANwMAIANBEGogBUEQaikDADcDACAEIAVBCGopAwA3AwAgAyAFKQMANwMAIAVBwABBCBC9EwsgACABKAIIEHcgASgCFCIDRQ0MIAAgAxB3DAwLIAAgASgCECIDENMDIAMgABBRAkAgACgCAEUNACADKAIAQRpHDQAgACADQQhqIgQQwwUiBUUNACADEOQBIANBOGogBUE4aikDADcDACADQTBqIAVBMGopAwA3AwAgA0EoaiAFQShqKQMANwMAIANBIGogBUEgaikDADcDACADQRhqIAVBGGopAwA3AwAgA0EQaiAFQRBqKQMANwMAIAQgBUEIaikDADcDACADIAUpAwA3AwAgBUHAAEEIEL0TCyABKAIMIgVFDQsgASgCCCEDIAVBGGwhBANAAkAgAyIFQRRqKAIAIgNFDQAgACADENMDIAMgABBRIAAoAgBFDQAgAygCAEEaRw0AIAAgA0EIaiIGEMMFIgFFDQAgAxDkASADQThqIAFBOGopAwA3AwAgA0EwaiABQTBqKQMANwMAIANBKGogAUEoaikDADcDACADQSBqIAFBIGopAwA3AwAgA0EYaiABQRhqKQMANwMAIANBEGogAUEQaikDADcDACAGIAFBCGopAwA3AwAgAyABKQMANwMAIAFBwABBCBC9EwsgBUEYaiEDIAAgBRDkBCAEQWhqIgQNAAwMCwsgACABKAIEIgMQ0wMgAyAAEFEgACgCAEUNCiADKAIAQRpHDQogACADQQhqIgQQwwUiBUUNCiADEOQBIANBOGogBUE4aikDADcDACADQTBqIAVBMGopAwA3AwAgA0EoaiAFQShqKQMANwMAIANBIGogBUEgaikDADcDACADQRhqIAVBGGopAwA3AwAgA0EQaiAFQRBqKQMANwMAIAQgBUEIaikDADcDACADIAUpAwA3AwAgBUHAAEEIEL0TDAoLIAAgASgCBCIDQcgAahDkBCADQeAAaiEFAkAgAygCACIEQQhGDQAgA0EoaiEBAkAgBEEHRg0AIAMgABCGBCAAKAIARQ0AIAAgAxDDCAsgACABEOQECyAFKAIAQYCAgIB4Rg0JIAAgBRDkBAwJCyAAIAEoAgQiAxDTAyAD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ADcDACADQShqIAVBKGopAwA3AwAgA0EgaiAFQSBqKQMANwMAIANBGGogBUEYaikDADcDACADQRBqIAVBEGopAwA3AwAgBCAFQQhqKQMANwMAIAMgBSkDADcDACAFQcAAQQgQvRMLIAAgASgCDBB3DAYLAkACQAJAAkAgASgCBA4DAAECAAsgASgCCCIDKAIIIgVFDQIgAygCBCEDIAVBOGwhBQNAIAMgABDCBiADQThqIQMgBUFIaiIFDQAMAwsLIAEoAggiAygCCCIFRQ0BIAMoAgQhAyAFQThsIQUDQCADIAAQwgYgA0E4aiEDIAVBSGoiBQ0ADAILCyABKAIIIAAQ1wgLIAAgASgCDCIDENMDIAMgABBRAkAgACgCAEUNACADKAIAQRpHDQAgACADQQhqIgQQwwUiBUUNACADEOQBIANBOGogBUE4aikDADcDACADQTBqIAVBMGopAwA3AwAgA0EoaiAFQShqKQMANwMAIANBIGogBUEgaikDADcDACADQRhqIAVBGGopAwA3AwAgA0EQaiAFQRBqKQMANwMAIAQgBUEIaikDADcDACADIAUpAwA3AwAgBUHAAEEIEL0TCyAAIAEoAhAQdwwFCwJAAkACQAJAIAEoAgQOAwABAgALIAEoAggiAygCCCIFRQ0CIAMoAgQhAyAFQThsIQUDQCADIAAQwgYgA0E4aiEDIAVBSGoiBQ0ADAMLCyABKAIIIgMoAggiBUUNASADKAIEIQMgBUE4bCEFA0AgAyAAEMIGIANBOGohAyAFQUhqIgUNAAwCCwsgASgCCCAAENcICyAAIAEoAgwiAxDTAyADIAAQUQJAIAAoAgBFDQAgAygCAEEaRw0AIAAgA0EIaiIEEMMFIgVFDQAgAxDkASADQThqIAVBOGopAwA3AwAgA0EwaiAFQTBqKQMANwMAIANBKGogBUEoaikDADcDACADQSBqIAVBIGopAwA3AwAgA0EYaiAFQRhqKQMANwMAIANBEGogBUEQaikDADcDACAEIAVBCGopAwA3AwAgAyAFKQMANwMAIAVBwABBCBC9EwsgACABKAIQEHcMBAsgACABKAIEIgMQ0wMgAyAAEFEgACgCAEUNAyADKAIAQRpHDQMgACADQQhqIgQQwwUiBUUNAyADEOQBIANBOGogBUE4aikDADcDACADQTBqIAVBMGopAwA3AwAgA0EoaiAFQShqKQMANwMAIANBIGogBUEgaikDADcDACADQRhqIAVBGGopAwA3AwAgA0EQaiAFQRBqKQMANwMAIAQgBUEIaikDADcDACADIAUpAwA3AwAgBUHAAEEIEL0TDAMLIAFBCGogABClAgwBCyAAIAFBBGoQ5AQgASgCAEERRw0BCyACQeAAahCcGiACQThqQSBqIAFBKGoiBSkDADcDACACQThqQRhqIAFBIGoiBCkDADcDACACQThqQRBqIAFBGGoiBikDADcDACACQThqQQhqIAFBEGoiBykDADcDACABKQMIIQ0gASACKQNgNwMIIAcgAkHgAGpBCGoiCSkDADcDACAGIAJB4ABqQRBqIgopAwA3AwAgBCACQeAAakEYaiIIKQMANwMAIAUgAkHgAGpBIGoiCykDADcDACACIA03AzggAkEIaiAAIAJBOGpBABBfIAFBCGohAwJAAkACQCACKAIIQW1qIgBBAiAAQQJJGw4DAAECAAsgASkDACENIAFCATcDACACQeAAakEoaiAFKQMANwMAIAsgBCkDADcDACAIIAYpAwA3AwAgCiAHKQMANwMAIAkgAykDADcDACADQQA2AgAgAiANNwNgIAJB4ABqEOkDDAILIAMQlAUgA0EgaiACQQhqQShqKQMANwMAIANBGGogAkEIakEgaikDADcDACADQRBqIAJBCGpBGGopAwA3AwAgA0EIaiACQQhqQRBqKQMANwMAIAMgAikDEDcDAAwBCyABEOkDIAUgAkEIakEoaikDADcDACAEIAJBCGpBIGopAwA3AwAgBiACQQhqQRhqKQMANwMAIAcgAkEIakEQaikDADcDACADIAJBCGpBCGopAwA3AwAgASACKQMINwMACyACQZABaiQAC9gnAgp/AX4jAEHwAGsiAiQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIAIgNBdGoiBEEHIARBJkkbDiYfAAEDAgQFBgcICQoLDA0fDg8QERIfExQVHx8WFxgZGhscHR8eHx8LIAAoAgwiA0UNHiAAKAIIIQQgA0EEdCEAIAFBLGohBQNAAkAgBCgCAEECRg0AIAEtACghBiABQQA6ACggAS0AeSEHIAFBADoAeQJAIARB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AtQCSw0AIAkgASgCCCIHTw0EAkACQCABKAIEIAlBFGxqKAIIIgdFDQAgByABKAIsIgtJDQEgByALQZzjgwEQwxIAC0H48oMBEMkiAAsgASgCKCAHQQN0aigCACIMIAEoAjgiB08NAyAEIAEoAjQgDEECdGooAgAiB0kNAiAEIAdrIQ1BASEKIAZBAXENAQsCQCAEIAVJDQAgBCEIDBALIAIoAgwiDiAEIA4gBEsbIQ8gAUHIAGohECACKAIIIREgBCESIAQhCANAAkACQAJAAkACQCASIA9GDQACQAJAAkAgCSABKAIIIhNPDQAgESASai0AACEHAkACQCABKAIEIhQgCUEUbGoiCSgCBCICRQ0AIAIgECAHai0AAGoiCSABKAIgIgJPDQMgASgCHCAJQQJ0aiEJDAELA0AgCSgAACIJRQ0aIAkgASgCFCICTw0EIAEoAhAgCUEJbGoiAkEFaiEJIAcgAi0AACILSw0ACyAHIAtHDRkgAkEBaiEJCyAJKAAAIglBAUYNGCAJIAEoAtACSw0HIAlFDRggCSABKALUAksNByAJIBNPDQQCQAJAIBQgCUEUbGooAggiAkUNACACIAEoAiwiB0kNASACIAdBnOODARDDEgALQfjygwEQySIACyABKAIoIAJBA3RqKAIAIgIgASgCOCIHTw0FIBJBAWoiByABKAI0IAJBAnRqKAIAIgtJDQYgByALayILIARLDQdBASEKAkAgBkEBcQ0AIAIhDCAHIQggCyENDAgLIAAgAjYCDCAAIAc2AgggACALNgIEIABBATYCAAwZCyAJIBNBrOODARDDEgALIAkgAkG844MBEMMSAAsgCSACQYzjgwEQwxIACyAPIA5BjJ2AARDDEgALIAkgE0GMroABEMMSAAsgAiAHQejygwEQwxIACyADQQA2AkggA0EBNgI8IANBxOaDATYCOCADQgQ3AkAgA0E4akHM5oMBEKgdAAsgEkEBaiISIAVGDRAMAAsLIAAgDDYCDCAAIAQ2AgggACANNgIEIABBATYCAAwPCyADQQA2AkggA0EBNgI8IANBxOaDATYCOCADQgQ3AkAgA0E4akHM5oMBEKgdAAsgDCAHQejygwEQwxIACyAJIAdBjK6AARDDEgALIABBADYCAAwLCwJAAkAgBkEBcQ0AQQAhCAJAAkACQAJAAkAgASgC2AIi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CyADQThqIAcgASgCQCILKAIIQX9qQXhxakEIaiACKAIIIg8gAigCDCIKIAQgBSALKAIQERMAAkAgAygCOCICDgMEAwAECwJAIAMoAjwiBCAFTw0AIAFByABqIREDQAJAAkACQAJAAkACQAJAAkACQCAEIApPDQACQCAJIAEoAggiDE8NACARIA8gBGotAAAiB2ohDSABKAIEIQYDQCAGIAlBFGxqIhIhCQJAAkACQCASKAIEIgJFDQAgAiANLQAAaiIJIAEoAiAiAk8NByABKAIcIAlBAnRqIQkMAQsDQCAJKAAAIglFDQIgCSABKAIUIgJPDQggASgCECAJQQlsaiICQQVqIQkgByACLQAAIgtLDQALIAcgC0cNASACQQFqIQkLIAkoAAAiCUEBRw0ECyASKAIMIgkgDEkNAAsLIAkgDEGs44MBEMMSAAsgBCAKQYydgAEQwxIACyAJIAEoAtACSw0FIAlFDQICQAJAIAkgASgC1AJLDQAgCSAMTw0FAkACQCAGIAlBFGxqKAIIIglFDQAgCSABKAIsIgJJDQEgCSACQZzjgwEQwxIAC0H48oMBEMkiAAsgASgCKCAJQQN0aigCACIJIAEoAjgiAk8NBiAEQQFqIgIgASgCNCAJQQJ0aigCACIBTw0BIANBADYCSCADQQE2AjwgA0HE5oMBNgI4IANCBDcCQCADQThqQczmgwEQqB0ACyADQThqIAEoAjwgASgCQCICKAIIQX9qQXhxakEIaiAPIAogBCAFIAIoAhAREwACQCADKAI4RQ0AIAMoAjwiAiAETQ0HDAgLIABBADYCAAwXCyAAIAk2AgwgACACNgIIIABBATYCACAAIAIgAWs2AgQMFgsgCSACQbzjgwEQwxIACyAJIAJBjOODARDDEgALIABBADYCAAwTCyAJIAxBjK6AARDDEgALIAkgAkHo8oMBEMMSAAsgBEEBaiECCyACIQQgAiAFSQ0ACwsgAEEANgIADA0LIANBADYCSCADQQE2AjwgA0HE5oMBNgI4IANCBDcCQCADQThqQczmgwEQqB0ACyAJIAJB6PKDARDDEgALIAAgAykCPDcCBCAAQQxqIANBOGpBDGooAgA2AgALIAAgAjYCAAwJCyAJIAEoAtQCSw0AIANBMGogASAJEMkbAkACQCADKAI0IgdFDQAgByADKAIwIgsoAiwi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ACABKQMANwMAIABBKGogAUEoaikDADcDACAAQSBqIAFBIGopAwA3AwAgAEEYaiABQRhqKQMANwMAIABBEGogAUEQaikDADcDACAAQQhqIAFBCGopAwA3AwAMHAtBAC0A4PadARogASgCECELIAEoAgwhCEHAABCEASIDRQ0VIAMgASgCBBBFQQAtAOD2nQEaQTAQhAEiCkUNFSAKIAEoAggQfyAAIAs2AhAgACAINgIMIAAgCjYCCCAAIAM2AgQgAEEDNgIADBsLIAAgASkDADcDACAAQShqIAFBKGopAwA3AwAgAEEgaiABQSBqKQMANwMAIABBGGogAUEYaikDADcDACAAQRBqIAFBEGopAwA3AwAgAEEIaiABQQhqKQMANwMADBoLIAEoAgghAyABKAIEIQoCQAJAIAEoAgwiCw0AQQAhAQwBC0EALQDg9p0BGkHAABCEASIBRQ0UIAEgCxBFCyAAIAE2AgwgACADNgIIIAAgCjYCBCAAQQQ2AgAMGQsgASgCICEKIAEoAhwhCyABKAIYIQggASgCDCEHIAEoAgghCQJAIAEpAxAiHkIDg0IAUg0AIB6nIgMgAygCACIDQQFqNgIAIANBf0wNEwtBAC0A4PadARogAS0AJCEEQTAQhAEiA0UNEiADIAEoAigQfyAAIAM2AiggACAEOgAkIAAgCjYCICAAIAs2AhwgACAINgIYIAAgHjcDECAAIAc2AgwgACAJNgIIIABBBTYCAAwYCyABKAIMIQMgASgCCCEKIAEtACQiC0ECRw0MDA0LIAEoAgwhAyABKAIIIQogAS0AJCILQQJHDQ0MDgtBAC0A4PadARogASgCECELIAEoAgwhCEHAABCEASIDRQ0PIAMgASgCBBBFQQAtAOD2nQEaQTAQhAEiCkUNDyAKIAEoAggQfwJAAkAgASgCFCIHDQBBACEBDAELQQAtAOD2nQEaQTAQhAEiAUUNECABIAcQfwsgACABNgIUIAAgCzYCECAAIAg2AgwgACAKNgIIIAAgAzYCBCAAQQg2AgAMFQtBAC0A4PadARogASgCGCEMIAEoAhQhDUHAABCEASIORQ0OIA4gASgCEBBFIAEoAgghCCACQeAAaiABKAIMIg9BBEEYEKMOIAIoAmQhECACKAJgQQFGDQ8gAigCaCERAkAgEEUNACAIIA9BGGxqIRIgECET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IAIoAvQBIQxBACELQQAtAOD2nQEaIAEQhAEiAUUNBiACQfQBaiEHIAJBADYCsAEgAiABNgKsASACIAU2AqgBIANBAWohCQNAIAFBAWogDCALai0AACIDOgAAIAEgAzoAACABQQJqIQEgCSALQQFqIgtHDQAMBAsLQeTGhQEQySIAC0EAIQ0gAkEANgKwASACQoCAgIAQNwOoASACQfQBaiEHQQEhDEEAIQUMAQtBvP6aARCBHAALIA0gDEEBQQEQ0BIgAikDqAEhESACQagBakEIaiIBIAU2AgAgAiAFRToAtAEgAiARNwOoASACQagBahCDBSAHQQhqIAEpAwA3AgAgByACKQOoATcCACACQQE2AvABIAAgAkHwAWoQ+AgMBwsgBSAMQQFBARDQEgsgAkEANgL4ASACQoCAgIDAADcC8AEgAkHkAGogAkHwAWoQqhUgAkHwAWpBBHIhDSACQagBakEEaiEEIAchDAJAAkADQCAMKAIAQQJHDQICQAJAIAwoAgRBAUcNACAMQRBqKAIAIgFBAXQhBSAMQQxqKAIAIQMCQCABRQ0AIAMgBWoiC0F+akUNACALQX9qLAAAQQBIDQULIAVB/v///wNLDQMgAUEDdCIJQf3///8HTw0DIAFB/////wdxIQtBACEFAkACQCAJDQBBBCEBQQAhCQwBC0EALQDg9p0BGiAJEIQBIgFFDQYgCyEJCyACQQA2AvgBIAIgATYC9AEgAiAJNgLwAQJAIAtFDQBBACEFA0AgASADLQAANgIAIAFBBGogA0EBai0AADYCACABQQhqIQEgA0ECaiEDIAsgBUEBaiIFRw0ACwsgAiACKQPwATcD8AEgAiAFNgL4ASACIAVFOgD8ASACQfABahCVBSACQZgBakEIaiIDIA1BCGooAgA2AgAgAiANKQIANwOYASACKALwASIBQYCAgIB4Rg0EIAQgAikDmAE3AgAgBEEIaiADKAIANgIAIAIgATYCqAEgAkHkAGogAkGoAWoQxgsgASACKAKsAUEEQQgQ0BIMAQsgAkHkAGogDEEIahDGCwsgDEEcaiIMIApHDQALIAJByABqIAJB7ABqKQIANwIAIAIgAikCZDcCQCACQQA2AjwgACACQTxqEPgIDAcLQYCdmwEQgRwACyACKAJkIAIoAmhBBEEIENASIAJBADYC+AEgAkKAgICAEDcC8AEgAkHkAGogAkHwAWoQqRUgAkHwAWpBBHIhDSACQagBakEEaiEEAkACQAJAA0AgBygCAEECRw0DAkACQCAHKAIEQQFHDQAgAkHkAGogB0EIahCjCwwBCyAHQQxqKAIAIQECQCAHQRBqKAIAIgNFDQAgASADQQN0aiIFQXhqRQ0AIAVBfGooAgBB/wBLDQULAkACQCADQf////8BcSIJDQBBACEFIAJBADYC+AEgAkKAgICAEDcD8AEMAQtBAC0A4PadARogA0EBdEH+////A3EQhAEiA0UNBkEAIQUgAkEANgL4ASACIAM2AvQBIAIgCTYC8AEDQCABKAIAIgtBgAJPDQQgAUEEaigCACIMQYACTw0FIAMgCzoAACADQQFqIAw6AAAgA0ECaiEDIAFBCGohASAJIAVBAWoiBUcNAAsLIAIgAikD8AE3A/ABIAIgBTYC+AEgAiAFRToA/AEgAkHwAWoQgwUgAkGYAWpBCGoiAyANQQhqKAIANgIAIAIgDSkCADcDmAEgAigC8AEiAUGAgICAeEYNBCAEIAIpA5gBNwIAIARBCGogAygCADYCACACIAE2AqgBIAJB5ABqIAJBqAFqEKMLIAEgAigCrAFBAUECENASCyAHQRxqIgcgCkcNAAsgAkHcAGogAkHsAGopAgA3AgAgAiACKQJkNwJUIAJBATYCUCAAIAJB0ABqEPgIDAgLQbSqmwFBKyACQeABakHY/IQBQYTHhQEQ6hAAC0G0qpsBQSsgAkHgAWpB2PyEAUGUx4UBEOoQAAsgAigCZCACKAJoQQFBAhDQEgJAAkACQCACKAIIIgFBAkkNACACKAIEIgMoAgBBBkcNACADKAIMIgVFDQAgAygCCCENIAMgAUEcbGohCkEAIQEgAyEHQQEhCwNAAkACQCABQQFxRQ0AIAchASAHIApHDQEMBQsgCyAKIAdrQRxuTw0EIAcgC0EcbGohAQsgASgCAEEGRw0BIAEoAgwiC0UNASABQRxqIQcgCyAFIAsgBUkbIQkgASgCCCEBQQAhDCANIQsCQAJAA0AgCyABEMwERQ0BIAtBHGohCyABQRxqIQEgCSAMQQFqIgxHDQALIAkhBQwBCyAMIAVLDQMgDCEFC0EAIQtBASEBIAUNAAsLIAJB8ABqIAJBCGooAgA2AgAgAiACKQIANwJoDAULIAwgBUHsyIUBELwiAAsgAkEANgKIASACQoCAgIDAADcCgAEgAkEANgKUASACQoCAgIDAADcCjAEgAigCACEBIAIgCjYCpAEgAiABNgKgASACIAM2ApgBIAJBqAFqQQRqIghBEGohDkEAIQtBASEMQQQhDwNAAkACQCADIAtqIgEoAgAiCUEIRg0AIA4gAUEUaikCADcCACAIQQhqIAFBDGoiDSkCADcCACAIIAFBBGoiBCkCADcCACACQfABakEIaiIHIA0oAgA2AgAgAkEANgKoASACIAQpAgA3A/ABIAJBqAFqEKMgIAlBBkYNAUGSqZsBQShB3MiFARCMGgALIAFBHGohCgwECyACQcgBakEIaiIQIAcoAgAiCTYCACACIAIpA/ABNwPIASAJIAVJDQIgCSAFayIGQRxsIQ1BBCEEAkAgCSAFRg0AQQAtAOD2nQEaIA0QhAEiBEUNAgsgAiAFNgLQAQJAIA1FDQAgBCACKALMASAFQRxsaiAN/AoAAAsgAiAGNgLcASACIAQ2AtgBIAIgBjYC1AEgAkHwAWogAkHUAWoQtwECQCAMQX9qIAIoAowBRw0AIAJBjAFqQczIhQEQghggAigCkAEhDwsgDyALaiIJIAIpAvABNwIAIAlBGGogAkHwAWpBGGooAgA2AgAgCUEQaiACQfABakEQaikCADcCACAJQQhqIAcpAgA3AgAgAiAMNgKUAQJAAkAgAigCiAENACACQYABahCYGiACQYABakEIaiAQKAIANgIAIAIgAikDyAE3A4ABDAELIAJByAFqEJgaCyALQRxqIQsgDEEBaiEMIAFBHGogCkcNAAwDCwsACyAFIAkQyBIACyACIAo2ApwBIAJBmAFqELUXIAJB4AFqQQhqIgEgAkGAAWpBCGooAgA2AgAgAiACKQOAATcD4AEgAkHwAWogAkGMAWoQhQECQCABKAIAIgMgAigC4AFHDQAgAkHgAWpBrMiFARCCGAsgAigC5AEgA0EcbGoiASACKQLwATcCACABQQhqIAJB8AFqQQhqKQIANwIAIAFBEGogAkHwAWpBEGopAgA3AgAgAUEYaiACQfABakEYaigCADYCACACIANBAWo2AugBIAJB5ABqIAJB4AFqELcBIAIoAmRBCEYNACAAIAIpAmQ3AgAgAEEYaiACQeQAakEYaigCADYCACAAQRBqIAJB5ABqQRBqKQIANwIAIABBCGogAkHkAGpBCGopAgA3AgAMAwsgAkEIaiIBIAJB5ABqQQxqKAIAIgM2AgAgAiACKQJoNwMAIAAgAigCBCIFIAUgA0EcbGoQgAU2AhggAEEHNgIAIABBDGogASgCADYCACAAIAIpAwA3AgQMAgsgAkEANgKwASACQoCAgIAQNwKoASACQfQBaiACQagBahCpFSACQQE2AvABIAJB8AFqEJoIIQEgAEECNgIAIAAgATYCGCAAIAIpAvABNwIEIABBDGogAkH4AWopAgA3AgAgAEEUaiACQYACaigCADYCAAsgAhCYGgsgAkGQAmokAAvqIgIKfwF+IwBBoAJrIgMkACABKAIMIQQgA0HgAWogAiABKAIIIgVBABCiAgJAAkAgAy0A4AFBBEYNACADKQPgASINQv8Bg0IEUQ0AIAAgDTcCAAwBCwJAAkACQAJAIAVFDQAgA0HgAWogAiAFEOIcIAMtAOABQQRGDQAgAykD4AEiDUL/AYNCBFINAQsgA0GYAWogARCTEyADQeABaiADKAKYASIFIAMoApwBIgZBABCJCSADKALgAQ0CIAUgBkHN0JsBQQoQxR5FDQIgASkDEEIAUg0BDAILIAAgDTcCAAwCCyADQZABaiABQRBqIgUQlBMgAygCkAEgAygClAFB3AAQ4xxFDQACQCACLQBQRQ0AIANBiAFqIAUQlBMgAygCiAEgAygCjAFB19CbAUEGEPcUDQELIANBgAFqIAUQlBMgA0HgAWogAkEAQQAgAygCgAEgAygChAEQlQ4CQCADLQDgAUEERg0AIAMpA+ABIg1C/wGDQgRRDQAgACANNwIADAILAkACQCAERQ0AIANB4AFqIAIgBBDiHCADLQDgAUEERg0AIAMpA+ABIg1C/wGDQgRSDQELIABBBDoAAAwCCyAAIA03AgAMAQsgAi0AUiEHAkAgAi0ATQ0AIAEpAxBCAFENACABQRBqIQUCQCAHQf8BcUEBSw0AIANB+ABqIAUQlBMgAygCeCADKAJ8Qd3QmwFBAxD3FA0BCwJAIAItAExFDQAgA0HwAGogBRCUEyADKAJwIAMoAnQQ3A1FDQELAkAgAi0AUEUNACADQegAaiAFEJQTIAMoAmggAygCbEHX0JsBQQYQ9xQNAQsgA0HgAGogBRCUEyADQeABaiACQQBBACADKAJgIAMoAmQQlQ4CQCADLQDgAUEERg0AIAMpA+ABIg1C/wGDQgRRDQAgACANNwIADAILIABBBDoAAAwBCyADQdgAaiABEJMTIAItAEwhCAJAAkAgAygCWCIJIAMoAlwiChDXDUUNACAJIApqIQRBACELIAkhAUEAIQwDQAJAAkACQCABIARGDQAgAUEBaiEGIAEtAAAiBUEiRg0BIAVBJ0YNAiAFQdwARg0EIAYhASAFQSBJDQQMAwsCQCALIAxKIgEgDEVxDQAgC0EARyABcg0EC0EnQSIgARshDCAJIQUDQAJAIAUiASAERw0AQf8BIQEMBgsgAUEBaiEFIAEsAAAiBkF/Sg0AAkAgBkFgSQ0AAkAgBkFtRw0AIAFBAmohByAFIARGIQYgBCEFIAYNAiAEIQUgByAERg0CIAFBA2ohBSABLQABQZ8BTQ0CQbjVmAEQySIACyAFIAFBAmogBSAERhsiASABIARHaiEFIAZBcEkNASAFIAUgBEdqIQUMAQsgBSABQQJqIAUgBEYbIQUMAAsLIAtBAWohCyAGIQEMAQsgDEEBaiEMIAYhAQwACwsgAyAJNgLgASADIAkgCmoiBjYC5AFBACEFQQAhBAJAA0AgA0HQAGogA0HgAWoQ5QkgAygCUEEBcUUNAQJAIAMoAlQiAUEiRw0AIARBAWohBAwBCyABQSdHDQAgBUEBaiEFDAALCyADQdQBaiAEIAUgBCAFSRsgCmoQzRMgAyAGNgKUAiADIAk2ApACQSdBIiAEIAVLGyEMIANBkAJqIQQgCCAHQf8BcSIGQQJJIgdyQQFxIQpBAiEBA0AgA0ECNgKIAgJAIAFBAkcNACADQcgAaiAEEOUJIAMoAkwhBSADKAJIIQELAkACQAJAAkACQAJAAkACQAJAAkAgAUEBcUUNAAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAFDg4JAQEBAQEBAQIHBAYDBQALIAVB3ABGDQcLAkBBgIDEACAFIAVBgHBxIglBgLADRhsiAUGAgMQARg0AIAEgDEYNCQsgBQ0JIANB1AFqQQAQzhsMEwsgA0HUAWpBsf6aAUECEKMGDBILIANB1AFqQbP+mgFBAhCjBgwRCyADQdQBakG1/poBQQIQowYMEAsgA0HUAWpBt/6aAUECEKMGDA8LIANB1AFqQc7VmAFBAhCjBgwOCyADQdQBakEJEM4bDA0LIANB1AFqQa/+mgFBAhCjBgwMCyAGDQkMCgsgA0HUAWpB3AAQzhsgA0HUAWogDBDOGwwKCwJAIAVBD0sNACADQdQBakGI15gBQQMQowYgA0EBNgLkASADQZTzmwE2AuABIANCATcC7AEgA0HgATYCuAEgAyAFOgCkASADIANBtAFqNgLoASADIANBpAFqNgK0ASADQdQBaiADQeABahCiEUUNCkG0qpsBQSsgA0HgAWpByNCYAUGM15gBEOoQAAsCQCAFQR9LDQAgA0HUAWpBjNWYAUECEKMGIANBATYC5AEgA0GU85sBNgLgASADQgE3AuwBIANB4AE2ArgBIAMgBToApAEgAyADQbQBajYC6AEgAyADQaQBajYCtAEgA0HUAWogA0HgAWoQohFFDQpBtKqbAUErIANB4AFqQcjQmAFB+NaYARDqEAALAkAgBUH+AEsNACAJQYCwA0YNAiADQdQBaiAFEM4bDAoLAkAgBUGAAkkNAAJAAkACQCAFQdi/f2oOAgABAgsgA0HUAWpBn9SYAUEGEKMGDAwLIANB1AFqQaXUmAFBBhCjBgwLCyAFQf/9A0YNBwJAIAVB//8DSw0AAkACQCAFQYDwA3FBgLADRg0AIAhBAXENASABQYCAxABGDQYgA0HUAWogARDOGwwNCyADQQE2AvQBIANB5MmZATYC8AEgA0EBNgLkASADQdzJmQE2AuABIANBATYC7AEgA0HfADYCuAEgAyAFNgKkASADIANBtAFqNgLoASADIANBpAFqNgK0ASADQdQBaiADQeABahCiEUUNDEG0qpsBQSsgA0HgAWpByNCYAUH41ZgBEOoQAAsgA0EBNgL0ASADQeTJmQE2AvABIANBATYC5AEgA0HcyZkBNgLgASADQQE2AuwBIANB/gE2ArgBIAMgBTsBpAEgAyADQbQBajYC6AEgAyADQaQBajYCtAEgA0HUAWogA0HgAWoQohFFDQtBtKqbAUErIANB4AFqQcjQmAFB6NWYARDqEAALAkACQCAHDQAgCEEBcQ0BIAFBgIDEAEYNBiADQdQBaiABEM4bDAwLIAMgBUGAgHxqQQp2QYCwA2o2ArABIAMgBUH/B3FBgLgDcjYCpAEgA0ECNgL0ASADQczUmAE2AvABIANBAjYC5AEgA0G81JgBNgLgASADQQI2AuwBIANB3wA2AsABIANB3wA2ArgBIAMgA0G0AWo2AugBIAMgA0GkAWo2ArwBIAMgA0GwAWo2ArQBIANB1AFqIANB4AFqEKIRRQ0LQbSqmwFBKyADQeABakHI0JgBQbjWmAEQ6hAACyADQQE2AvQBIANB5MmZATYC8AEgA0ECNgLkASADQZjWmAE2AuABIANBATYC7AEgA0HfADYCuAEgAyAFNgKkASADIANBtAFqNgLoASADIANBpAFqNgK0ASADQdQBaiADQeABahCiEUUNCkG0qpsBQSsgA0HgAWpByNCYAUGo1pgBEOoQAAsgCg0FIAFBgIDEAEYNBCADQdQBaiABEM4bDAkLIAMgAy8B3AE7AeABIAMgA0HeAWotAAA6AOIBIAMoAtgBIQogAygC1AEhCSADLQDfASEBDAoLQejWmAEQySIAC0HY1ZgBEMkiAAtBiNaYARDJIgALQcjWmAEQySIACyADQdQBakGM1ZgBQQIQowYgA0EBNgLkASADQZTzmwE2AuABIANCATcC7AEgA0HgATYCuAEgAyAFOgCkASADIANBtAFqNgLoASADIANBpAFqNgK0ASADQdQBaiADQeABahCiEUUNA0G0qpsBQSsgA0HgAWpByNCYAUHY1pgBEOoQAAsgA0HUAWpB0NWYAUEGEKMGDAILAkAgAygCiAIiAUECRw0AIANBCGogBBDlCSADIAMoAgw2AowCIAMgAygCCCIBNgKIAgsCQCABQQFxRQ0AIAMoAowCQVBqQQpJDQELIANB1AFqQcjVmAFBAhCjBgwBCyADQdQBakHK1ZgBQQQQowYLIAMoAowCIQUgAygCiAIhAQwACwsgA0GuAWogAy0A4gE6AAAgAyAKNgKoASADIAk2AqQBIAMgAy8B4AE7AawBIAMgAToArwECQCACLQBQRQ0AIANBwABqIANBpAFqEIYVIAMoAkAhASADKAJEIQUgA0EINgKwASADIAU2AtABIAMgATYCzAEgA0EANgLEASADIAEgBWo2AsABIAMgATYCvAEgA0ECNgK0ASADIANBsAFqNgLIASADQThqIANBtAFqQQhqIgYQ1QggAyADKAI8NgK4ASADIAMoAjgiBDYCtAECQAJAAkAgBEEBcUUNACADQdQBaiABIAUQ/wwgA0HgAWpBGGogA0G0AWpBGGopAgA3AwAgA0HgAWpBEGogA0G0AWpBEGopAgA3AwAgA0HgAWpBCGoiCiAGKQIANwMAIAMgAykCtAE3A+ABIANBADYCgAIDQCADKALgASEBIANBAjYC4AECQAJAIAFBAkYNACADKALkASEFDAELIANBMGogChDVCCADKAI0IQUgAygCMCEBCwJAIAFBAXFFDQAgAyADKAKAAkEBaiIBNgKAAiADQRhqIANB1AFqEJAaAkAgASAFaiIBRQ0AAkAgASADKAIcIgVJDQAgASAFRg0BDAYLIAMoAhggAWosAABBv39MDQULIAMtAN8BIQUgAygC2AEhBiADQdQBakEBELsHIANBEGogA0HUAWoQlhcgAygCECABaiEEAkAgBiAFQcAAakH/AXEiCUEMIAlBDEkbIAVB/gFGGyIFIAFrIgFFDQAgBEEBaiAEIAH8CgAACyAEQdwAOgAAIAVBAWohAQJAIAMtAN8BQf4BRg0AIAFBC0sNAiADIAFBwAFyOgDfAQwCCyADIAE2AtgBDAELCyADQYgCakEIaiADQdQBakEIaigCADYCACADIAMpAtQBNwOIAgwBCyADQf8BOgCTAiADIAU2AowCIAMgATYCiAILIANBKGogA0GIAmoQhhUgA0G0AWogAygCKCADKAIsQeDQmwFBBEHk0JsBQQcQiQwgA0HUAWogAygCuAEiCSADKAK8AUHr0JsBQQNB7tCbAUEGEIkMAkACQAJAAkAgAygC1AEiBUH+//8HSw0AIAUNAUEAIQFBgICAgHwhCiADKALYASEEQQAhBgwCCyADKALYASEEIANB4AFqIAMoAtwBIgEQig4gAygC4AEhCiADKALkASEGIAFFDQEgBiAEIAH8CgAADAELIAMoAtgBIQQCQCADKALcASIBQQxNDQAgBUH///8HIAVB////B0kbQYCAgHByIQogBCEGDAILIANBADYA5wEgA0IANwPgASADIAFBwAFyOgDrAQJAIAFFDQAgA0HgAWogBCAB/AoAAAsgAygC6AEhCiADKALkASEBIAMoAuABIQYLIAUgBBCrEwsgA0GkAWoQ0x8gAyAKNgKsASADIAE2AqgBIAMgBjYCpAEgAygCtAEgCRDOJCADQYgCahDTHwwBCyADQQA2ApgCIANBATYCjAIgA0GA1IABNgKIAiADQgQ3ApACIANBiAJqQYjUgAEQqB0ACyADIAw6ALQBIANB4AFq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EgALIANBADYCGCADQQE2AgwgA0HE5oMBNgIIIANCBDcCECADQQhqQczmgwEQqB0ACyAFIARBAWoiBEYNBgwACwsgA0EANgIYIANBATYCDCADQcTmgwE2AgggA0IENwIQIANBCGpBzOaDARCoHQALIBEgB0GE74MBEMMSAAtBAEEAQaTvgwEQwxIACyAHIAtBlO+DARDDEgALAkAgASgC0AIiCA0AQQEQ9h4hASAAQQI2AgAgACABNgIEDAULAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgCCABKALMAiIRTQ0AAkAgBCAFTw0AIAIoAgwiBiAEIAYgBEsbIQcgAUHAAGohCyACKAIIIRADQCAHIARGDQogCCALIBAgBGotAABqLQAAaiICIAEoAggiCE8NCQJAIAEoAgQgAkECdGooAgAiCCABKALIAksNACAIRQ0EIAggEU0NBQsgBSAEQQFqIgRHDQALCyAAQQA2AgAMEQsgCCABKAI8dkF+aiICIAEoAhQiCE8NAiABKAIQIAJBDGxqIgIoAghFDQMgAigCBCgCACICIAEoAiAiCE8NBCAEIAEoAhwgAkECdGooAgAiAUkNBSAAIAI2AgwgACAENgIIIABBATYCACAAIAQgAWs2AgQMEAsgAEEANgIADA8LIAggASgCPHZBfmoiAiABKAIUIghPDQYgASgCECACQQxsaiICKAIIRQ0HIAIoAgQoAgAiAiABKAIgIghPDQggBEEBaiIIIAEoAhwgAkECdGooAgAiAUkNCSAAIAI2AgwgACAINgIIIABBATYCACAAIAggAWs2AgQMDgsgAiAIQZTvgwEQwxIAC0EAQQBBpO+DARDDEgALIAIgCEGE74MBEMMSAAsgA0EANgIYIANBATYCDCADQcTmgwE2AgggA0IENwIQIANBCGpBzOaDARCoHQALIAIgCEH07oMBEMMSAAsgByAGQYydgAEQwxIACyACIAhBlO+DARDDEgALQQBBAEGk74MBEMMSAAsgAiAIQYTvgwEQwxIACyADQQA2AhggA0EBNgIMIANBxOaDATYCCCADQgQ3AhAgA0EIakHM5oMBEKgdAAsgACARNgIMIAAgCTYCCCAAIAw2AgQgACASNgIADAMLAkAgASgC0AIiCA0AQQEQ9h4hASAAQQI2AgAgACABNgIEDAMLAkACQAJAAkACQAJAAkAgCCABKALMAksNACAIIAEoAjx2QX5qIgIgASgCFCIITw0EIAEoAhAgAkEMbGoiAigCCEUNAyACKAIEKAIAIgIgASgCICIITw0CIAQgASgCHCACQQJ0aigCACIBSQ0BIAAgAjYCDCAAIAQ2AgggAEEBNgIAIAAgBCABazYCBAwJCyADQQhqIAcgASgCLCIQKAIIQX9qQXhxakEIaiACKAIIIgsgAigCDCIHIAQgBSAQKAIQERMAAkAgAygCCCICDgMGBQAGCwJAIAMoAgwiAiAFTw0AIAFBwABqIRADQAJAAkACQAJAAkACQCACIAdPDQACQCAIIBAgCyACai0AAGotAABqIgggASgCCCIETw0AIAEoAgQgCEECdGooAgAiCCABKALIAksNBQJAAkACQCAIRQ0AIAggASgCzAJLDQEgCCABKAI8dkF+aiIIIAEoAhQiBE8NBSABKAIQIAhBDGxqIggoAghFDQYgCCgCBCgCACIIIAEoAiAiBE8NByACQQFqIgIgASgCHCAIQQJ0aigCACIBTw0CIANBADYCGCADQQE2AgwgA0HE5oMBNgIIIANCBDcCECADQQhqQczmgwEQqB0ACyAAQQA2AgAMEwsgA0EIaiABKAIoIAEoAiwiBCgCCEF/akF4cWpBCGogCyAHIAIgBSAEKAIQERMAAkAgAygCCEUNACADKAIMIgQgAk0NBwwICyAAQQA2AgAMEgsgACAINgIMIAAgAjYCCCAAQQE2AgAgACACIAFrNgIEDBELIAggBEH07oMBEMMSAAsgAiAHQYydgAEQwxIACyAIIARBlO+DARDDEgALQQBBAEGk74MBEMMSAAsgCCAEQYTvgwEQwxIACyACQQFqIQQLIAQhAiAEIAVJDQALCyAAQQA2AgAMCAsgA0EANgIYIANBATYCDCADQcTmgwE2AgggA0IENwIQIANBCGpBzOaDARCoHQALIAIgCEGE74MBEMMSAAtBAEEAQaTvgwEQwxIACyACIAhBlO+DARDDEgALIAAgAykCDDcCBCAAQQxqIANBCGpBDGooAgA2AgALIAAgAjYCAAwCCwJAAkACQAJAAkACQCAIIAEoAswCTQ0AQQAhCQwBCyAIIAEoAjx2QX5qIgsgASgCFCIQTw0EIAEoAhAgC0EMbGoiCygCCEUNAyALKAIEKAIAIgYgASgCICILTw0CIAQgASgCHCAGQQJ0aigCACILSQ0BIAQgC2shEkEBIQkLIANBCGogByABKAIsIhAoAghBf2pBeHFqQQhqIAIoAggiCyACKAIMIgcgBCAFIBAoAhAREwACQAJAAkACQCADKAIIIgIOAwIBAAILIAFBwABqIREgAygCDCEQDAILIAAgAykCDDcCBCAAQQxqIANBCGpBDGooAgA2AgALIAAgAjYCAAwGCwJAAkACQANAAkACQAJAAkACQAJAIBAiAiAFTw0AIAIgB08NBCAIIBEgCyACai0AAGotAABqIgggASgCCCIQTw0DIAEoAgQgCEECdGooAgAiCCABKALIAksNBSAIRQ0AAkAgCCABKALMAksNACAIIAEoAjx2QX5qIgQgASgCFCIQTw0IIAEoAhAgBEEMbGoiBCgCCEUNCSAEKAIEKAIAIgYgASgCICIETw0KIAJBAWoiBCABKAIcIAZBAnRqKAIAIgJPDQMgA0EANgIYIANBATYCDCADQcTmgwE2AgggA0IENwIQIANBCGpBzOaDARCoHQALIANBCGogASgCKCABKAIsIhAoAghBf2pBeHFqQQhqIAsgByACIAUgECgCEBETACADKAIIRQ0BIAMoAgwiECACTQ0FDAYLIAAgBjYCDCAAIAQ2AgggACASNgIEIAAgCTYCAAwOCyAAQQA2AgAMDQsgBCACayESQQEhCSAEIRAMAwsgCCAQQfTugwEQwxIACyACIAdBjJ2AARDDEgALIAJBAWohEAwACwsgBCAQQZTvgwEQwxIAC0EAQQBBpO+DARDDEgALIAYgBEGE74MBEMMSAAsgA0EANgIYIANBATYCDCADQcTmgwE2AgggA0IENwIQIANBCGpBzOaDARCoHQALIAYgC0GE74MBEMMSAAtBAEEAQaTvgwEQwxIACyALIBBBlO+DARDDEgALIAAgDDYCDCAAIA42AgggACANNgIEIAAgCjYCAAsgA0EgaiQAC8UfAhJ/AX4jAEHwBmsiAyQAIANBIGogARCUEyADQfgAaiADKAIgIAMoAiRBt+ObAUECQaimmwFBARCJDCADQSxqIAMoAnwiBCADKAKAAUENQaimmwFBARDyByADKAJ4IAQQziQCQAJAAkACQCACLQBNDQAgAi0ATEUNASADQRhqIAEQlBMgAygCGCADKAIcENwNDQELIAItAFEh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DQEgACAAKAIQEOkdDwsCQAJAIAAoAgQiACgCAEEDRg0AIAAQvw4MAQsgAEEEahDiDAsgAEEoQQgQvRMLC/MbAQt/IwBBwAFrIgIkAAJAIAAtAGxBAkcNACAAQcAAaiEDA0AgAygCGCIDLQAsQQJGDQALCwJAIAAoAoQBIgNFDQAgACgCgAEiBCADQdgAbGohBQNAAkACQAJAAkAgBCgCACIDQQVHDQAgBCgCBCIDKAIAQRpHDQEgAiABKAIAIAEoAgQgA0EIaiIGEIINIAIoAgBBMkYNAyADENEBIANBOGogAkE4aikDADcDACADQTBqIAJBMGopAwA3AwAgA0EoaiACQShqKQMANwMAIANBIGogAkEgaikDADcDACADQRhqIAJBGGopAwA3AwAgA0EQaiACQRBqKQMANwMAIAYgAkEIaikDADcDACADIAIpAwA3AwAMAwsgA0EERg0CAkACQAJAIAMOBAUAAQQFCyAEKAIEQQFHDQQgBCgCCCIDKAIAQRpHDQEgAkGAAWogASgCACABKAIEIANBCGoiBhCCDSACKAKAAUEyRg0EIAMQ0QEgA0E4aiACQYABakE4aikDADcDACADQTBqIAJBgAFqQTBqKQMANwMAIANBKGogAkGAAWpBKGopAwA3AwAgA0EgaiACQYABakEgaikDADcDACADQRhqIAJBgAFqQRhqKQMANwMAIANBEGogAkGAAWpBEGopAwA3AwAgBiACQYABakEIaikDADcDACADIAIpA4ABNwMADAQLAkAgBCgCBCIHLQBsQQJHDQAgB0HAAGohAwNAIAMoAhgiAy0ALEECRg0ACwsCQCAHKAKEASIGRQ0AIAcoAoABIQMgBkHYAGwhBgNAAkACQAJAAkAgAygCAEF8ag4CAwABCyADQQRqKAIAIggoAgBBGkcNASACQYABaiABKAIAIAEoAgQgCEEIaiIJEIINIAIoAoABQTJGDQIgCBDRASAIQThqIAJBgAFqQThqKQMANwMAIAhBMGogAkGAAWpBMGopAwA3AwAgCEEoaiACQYABakEoaikDADcDACAIQSBqIAJBgAFqQSBqKQMANwMAIAhBGGogAkGAAWpBGGopAwA3AwAgCEEQaiACQYABakEQaikDADcDACAJIAJBgAFqQQhqKQMANwMAIAggAikDgAE3AwAMAgsgAyABEIoCDAELIAggARBGCyADQdgAaiEDIAZBqH9qIgYNAAsLAkAgB0GYAWooAgAiA0UNACAHQZQBaigCACIJIANBKGxqIQoDQAJAAkACQAJAAkACQAJAIAkoAgAOBQYAAQIFBgsgCSgCBEEBRw0FIAkoAggiAygCAEEaRw0DIAJBgAFqIAEoAgAgASgCBCADQQhqIgYQgg0gAigCgAFBMkYNBSADENEBIANBOGogAkGAAWpBOGopAwA3AwAgA0EwaiACQYABakEwaikDADcDACADQShqIAJBgAFqQShqKQMANwMAIANBIGogAkGAAWpBIGopAwA3AwAgA0EYaiACQYABakEYaikDADcDACADQRBqIAJBgAFqQRBqKQMANwMAIAYgAkGAAWpBCGopAwA3AwAgAyACKQOAATcDAAwFCyAJKAIEIgMoAgBBGkcNASACQYABaiABKAIAIAEoAgQgA0EIaiIGEIINIAIoAoABQTJGDQQgAxDRASADQThqIAJBgAFqQThqKQMANwMAIANBMGogAkGAAWpBMGopAwA3AwAgA0EoaiACQYABakEoaikDADcDACADQSBqIAJBgAFqQSBqKQMANwMAIANBGGogAkGAAWpBGGopAwA3AwAgA0EQaiACQYABakEQaikDADcDACAGIAJBgAFqQQhqKQMANwMAIAMgAikDgAE3AwAMBAsCQCAJKAIEIgstAGxBAkcNACALQcAAaiEDA0AgAygCGCIDLQAsQQJGDQALCwJAIAtBhAFqKAIAIgZFDQAgC0GAAWooAgAhAyAGQdgAbCEGA0ACQAJAAkAgAygCAEEFRw0AIANBBGooAgAiCCgCAEEaRw0BIAJBgAFqIAEoAgAgASgCBCAIQQhqIgwQgg0gAigCgAFBMkYNAiAIENEBIAhBOGogAkGAAWpBOGopAwA3AwAgCEEwaiACQYABakEwaikDADcDACAIQShqIAJBgAFqQShqKQMANwMAIAhBIGogAkGAAWpBIGopAwA3AwAgCEEYaiACQYABakEYaikDADcDACAIQRBqIAJBgAFqQRBqKQMANwMAIAwgAkGAAWpBCGopAwA3AwAgCCACKQOAATcDAAwCCyADIAEQ7QgMAQsgCCABEEYLIANB2ABqIQMgBkGof2oiBg0ACwsCQCALQZgBaigCACIGRQ0AIAtBlAFqKAIAIQMgBkEobCEGA0AgASADEMoCIANBKGohAyAGQVhqIgYNAAsLIAstADwiA0EGRg0DIANBAkcNAyALQRBqIQMDQCADKAIYIgMtACxBAkYNAAwECwsgAyABEEYMAgsgAyABEEYMAQsgCSgCDCEGIAkoAgghAyACIAE2AoABIAZFDQAgBkEobCEGA0AgAkGAAWogAxDPAyADQShqIQMgBkFYaiIGDQALCyAJQShqIgkgCkcNAAsLIActADwiA0EGRg0DIANBAkcNAyAHQRBqIQMDQCADKAIYIgMtACxBAkYNAAwECwsgAyABEEYMAgsgAyABEEYMAQsgBCgCDCEGIAQoAgghAyACIAE2AoABIAZFDQAgBkEobCEGA0AgAkGAAWogAxDPAyADQShqIQMgBkFYaiIGDQALCyAEQdgAaiIEIAVHDQALCwJAIAAoApgBIgNFDQAgACgClAEiCSADQShsaiELA0ACQAJAAkACQAJAAkACQCAJKAIADgUGAAECBQYLIAkoAgRBAUcNBSAJKAIIIgMoAgBBGkcNAyACQYABaiABKAIAIAEoAgQgA0EIaiIGEIINIAIoAoABQTJGDQUgAxDRASADQThqIAJBgAFqQThqKQMANwMAIANBMGogAkGAAWpBMGopAwA3AwAgA0EoaiACQYABakEoaikDADcDACADQSBqIAJBgAFqQSBqKQMANwMAIANBGGogAkGAAWpBGGopAwA3AwAgA0EQaiACQYABakEQaikDADcDACAGIAJBgAFqQQhqKQMANwMAIAMgAikDgAE3AwAMBQsgCSgCBCIDKAIAQRpHDQEgAkGAAWogASgCACABKAIEIANBCGoiBhCCDSACKAKAAUEyRg0EIAMQ0QEgA0E4aiACQYABakE4aikDADcDACADQTBqIAJBgAFqQTBqKQMANwMAIANBKGogAkGAAWpBKGopAwA3AwAgA0EgaiACQYABakEgaikDADcDACADQRhqIAJBgAFqQRhqKQMANwMAIANBEGogAkGAAWpBEGopAwA3AwAgBiACQYABakEIaikDADcDACADIAIpA4ABNwMADAQLAkAgCSgCBCIMLQBsQQJHDQAgDEHAAGohAwNAIAMoAhgiAy0ALEECRg0ACwsgDEGQAWohCgJAIAxBhAFqKAIAIgZFDQAgDEGAAWooAgAhAyAGQdgAbCEGA0ACQAJAAkAgAygCAEEFRw0AIANBBGooAgAiCCgCAEEaRw0BIAJBgAFqIAEoAgAgASgCBCAIQQhqIgQQgg0gAigCgAFBMkYNAiAIENEBIAhBOGogAkGAAWpBOGopAwA3AwAgCEEwaiACQYABakEwaikDADcDACAIQShqIAJBgAFqQShqKQMANwMAIAhBIGogAkGAAWpBIGopAwA3AwAgCEEYaiACQYABakEYaikDADcDACAIQRBqIAJBgAFqQRBqKQMANwMAIAQgAkGAAWpBCGopAwA3AwAgCCACKQOAATcDAAwCCyADIAEQ7QgMAQsgCCABEEYLIANB2ABqIQMgBkGof2oiBg0ACwsgCiABEMECIAwtADwiA0EGRg0DIANBAkcNAyAMQRBqIQMDQCADKAIYIgMtACxBAkYNAAwECwsgAyABEEYMAgsgAyABEEYMAQsgCSgCDCIDRQ0AIANBKGwhBiAJKAIIQQRqIQMDQAJAAkACQAJAAkACQAJAIANBfGooAgAOBQYAAQIDBgsgAygCAEEBRw0FIANBBGooAgAiCCgCAEEaRw0DIAJBgAFqIAEoAgAgASgCBCAIQQhqIgQQgg0gAigCgAFBMkYNBSAIENEBIAhBOGogAkGAAWpBOGopAwA3AwAgCEEwaiACQYABakEwaikDADcDACAIQShqIAJBgAFqQShqKQMANwMAIAhBIGogAkGAAWpBIGopAwA3AwAgCEEYaiACQYABakEYaikDADcDACAIQRBqIAJBgAFqQRBqKQMANwMAIAQgAkGAAWpBCGopAwA3AwAgCCACKQOAATcDAAwFCyADKAIAIggoAgBBGkcNAyACQcAAaiABKAIAIAEoAgQgCEEIaiIEEIINIAIoAkBBMkYNBCAIENEBIAhBOGogAkHAAGpBOGopAwA3AwAgCEEwaiACQcAAakEwaikDADcDACAIQShqIAJBwABqQShqKQMANwMAIAhBIGogAkHAAGpBIGopAwA3AwAgCEEYaiACQcAAakEYaikDADcDACAIQRBqIAJBwABqQRBqKQMANwMAIAQgAkHAAGpBCGopAwA3AwAgCCACKQNANwMADAQLIAMgARDpBgwDCyADIAEQwyQMAgsgCCABEEYMAQsgCCABEEYLIANBKGohAyAGQVhqIgYNAAsLIAlBKGoiCSALRw0ACwsCQCAALQA8IgFBBkYNACABQQJHDQAgAEEQaiEBA0AgASgCGCIBLQAsQQJGDQALCyACQcABaiQAC4sdAQZ/AkACQANAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIAIgJBdGoiA0EHIANBJkkbDiYfAAECAwQFBgcICQoLDB8fDQ4PEBEfEhMUHx8VFhcYGRobHB8eHx8LIAAoAgwiA0UNHiAAKAIIIQAgA0EEdCEDA0ACQCAAKAIAQQJGDQAgAS0AAA0AIABBDGooAgAgARCYAQsgAEEQaiEAIANBcGoiAw0ADB8LCyAAKAIMIgNFDR0gACgCCCEAIANBDGwhAwNAAkACQCAAKAIAIgINACAAQQRqKAIAIAEQ5gQMAQsgAS0AAA0AIAIgARCYAQsgAEEMaiEAIANBdGoiAw0ADB4LCwJAIAAoAiAiBEEIaigCACIDRQ0AIARBBGooAgAiACADQQZ0aiEFA0ACQCAAIgJBOGooAgAiA0UNACABLQAADQAgAkE0aigCACEAIANBDGwhAwNAAkAgAS0AAA0AIAAoAgAgARCYAQsgAEEMaiEAIANBdGoiAw0ACwsgAiABELcJIAJBwABqIgAgBUcNAAsLIARBGGohAgJAIARBFGooAgAiA0UNACABLQAADQAgBEEQaigCACEAIANBDGwhAwNAAkAgAS0AAA0AIAAoAgAgARCYAQsgAEEMaiEAIANBdGoiAw0ACwsgAigCAEGAgICAeEYNHCABIAIQ3BcPCyABLQAADRsgACgCBCEADBkLIAEtAAANGiAAKAIMIQAMGAsgAS0AAA0ZIAAoAgQgARCYASABLQAAQQFxDRkgACgCCCEADBcLAkACQCACQQtHDQACQAJAIAAoAgQOAwABAwALIAAoAhAiAkUNAiAAKAIMIQMgAkEobCECA0ACQCADKAIAQQdGDQAgAyABELcJCyADQShqIQMgAkFYaiICDQAMAwsLIAAoAhAiA0UNASAAKAIMIgIgA0E4bGohBANAIAIiA0E4aiECAkACQAJAAkAgAygCAA4DAAECAAsCQCADKAIIQQNHDQAgAS0AAA0AIAMoAgwgARCYAQsCQAJAAkACQAJAIAMoAigiAygCAA4HBwABAgMHBAcLIANBDGooAgAiBUUNBiADQQhqKAIAIQMgBUEobCEFA0ACQCADKAIAQQdGDQAgAyABELcJCyADQShqIQMgBUFYaiIFDQAMBwsLIAMoAgQgARC3CQwFCyADQQxqKAIAIgVFDQQgA0EIaigCACEGIAVBOGwhB0EAIQMDQAJAAkACQAJAIAYgA2oiBSgCAA4DAAECAAsCQCAFQQhqKAIAQQNHDQAgAS0AAA0AIAVBDGooAgAgARCYAQsgBUEoaigCACABELcJDAILIAVBMGooAgAiBUUNASABLQAADQEgBSABEJgBDAELIAVBBGooAgAgARC3CQsgByADQThqIgNHDQAMBQsLIAMoAgQgARC3CSABLQAADQMgAygCCCABEJgBDAMLIAEtAAANAiADKAIEIAEQmAEMAgsgAygCMCIDRQ0BIAEtAAANASADIAEQmAEMAQsCQAJAAkACQAJAIAMoAgQiAygCAA4HBQABAgMFBAULIANBDGooAgAiBUUNBCADQQhqKAIAIQMgBUEobCEFA0ACQCADKAIAQQdGDQAgAyABELcJCyADQShqIQMgBUFYaiIFDQAMBQsLIAMoAgQgARC3CQwDCyADQQxqKAIAIgVFDQIgA0EIaigCACEGIAVBOGwhB0EAIQMDQAJAAkACQAJAIAYgA2oiBSgCAA4DAAECAAsCQCAFQQhqKAIAQQNHDQAgAS0AAA0AIAVBDGooAgAgARCYAQsgBUEoaigCACABELcJDAILIAVBMGooAgAiBUUNASABLQAADQEgBSABEJgBDAELIAVBBGooAgAgARC3CQsgByADQThqIgNHDQAMAwsLIAMoAgQgARC3CSABLQAADQEgAygCCCABEJgBDAELIAEtAAANACADKAIEIAEQmAELIAIgBEcNAAwCCwsCQAJAAkACQAJAAkACQAJAAkACQCACDgsKAAECAwQFBgcICgoLAkAgAS0AAA0AIAAoAiggARCYAQsgACgCCEECRw0JIAEtAAANCSAAQQxqIQMMCAsgACgCCEEBRw0IIAEtAAANCCAAQQxqIQMMBwsgAS0AAA0HIABBBGohAwwGCwJAIAAoAgQiAygCACICQQNHDQACQCABLQAADQAgAygCECABEJgBCyADQQxqKAIAIgJFDQcgAS0AAA0HIAJBBHQhAiADQQhqKAIAQQxqIQMDQAJAIAEtAAANACADKAIAIAEQmAELIANBEGohAyACQXBqIgINAAwICwsCQCABLQAADQAgAygCICABEJgBCyACQQJHDQYgAS0AAA0GIANBBGohAwwFCyABLQAADQUgAEEEaiEDDAQLIAEtAAANBCAAQQRqIQMMAwsgAS0AAA0DIABBBGohAwwCCyABLQAADQIgAEEEaiEDDAELIAEtAAANASAAQQRqIQMLIAMoAgAgARCYAQsgAS0AAA0YIAAoAjghAAwWCwJAIAEtAAANACAAKAIoIAEQmAELIAAoAghBAkcNFyABLQAADRcgACgCDCEADBULIAAoAghBAUcNFiABLQAADRYgACgCDCEADBQLIAEtAAANFSAAKAIEIAEQmAEgAS0AAEEBcQ0VIAAoAgggARCYASABLQAAQQFxDRUgACgCDCEADBMLAkAgAC0AGEEFRw0AAkACQCAAKAIQIgMoAgBBGkcNACADQQhqQfzTmwFBBBCjHA0BCyABLQAADQEgAyABEJgBDAELIAFBAToAAAsgACgCDCIDRQ0UIAEtAAANFCADQQR0IQMgACgCCEEMaiEAA0ACQCABLQAADQAgACgCACABEJgBCyAAQRBqIQAgA0FwaiIDDQAMFQsLAkAgAS0AAA0AIAAoAhAgARCYAQsgACgCBEGAgICAeEYNEyAAKAIIIAAoAgwgARDdFw8LIAAoAgwiA0UNEiABLQAADRIgACgCCCEAIANBAnQhAwNAAkAgAS0AAA0AIAAoAgAgARCYAQsgAEEEaiEAIANBfGoiAw0ADBMLCyAAKAIMIgNFDREgAS0AAA0RIAAoAgghACADQQJ0IQMDQAJAIAEtAAANACAAKAIAIAEQmAELIABBBGohACADQXxqIgMNAAwSCwsCQCABLQAADQAgACgCBCABEJgBCyAAKAIIIgBBCGooAgAiA0UNECABLQAADRAgAEEEaigCACEAIANBAnQhAwNAAkAgAS0AAA0AIAAoAgAgARCYAQsgAEEEaiEAIANBfGoiAw0ADBELCwJAIAAoAgwiAkUNACAAKAIIIQMgAkEobCECA0AgAyABELcJIANBKGohAyACQVhqIgINAAsLAkAgACgCECIAKAIAQYCAgIB4Rw0AIAEtAAANECAAKAIEIQAMDgsgACgCCCIDRQ0PIAEtAAANDyAAKAIEIQAgA0EwbCEDA0ACQCABLQAADQAgACABEIcDCyAAQTBqIQAgA0FQaiIDDQAMEAsLAkAgACgCICICQQhqKAIAIgNFDQAgAS0AAA0AIAJBBGooAgAhACADQQxsIQMDQAJAIAEtAAANACAAKAIAIAEQmAELIABBDGohACADQXRqIgMNAAsLAkAgAkEUaigCACIDRQ0AIAJBEGooAgAhACADQdgAbCEDA0AgACABEIoDIABB2ABqIQAgA0Gof2oiAw0ACwsgAigCMCIARQ0OIAEtAABFDQwMDgsgACgCDCIARQ0NIAEtAABFDQsMDQsgAS0AAA0MIAAoAgQhAAwKCyABLQAADQsgACgCBCEADAkLIAAtADRBAkcNCiAAQQhqIQEDQCABKAIYIgEtACxBAkYNAAwLCwsCQCAAKAIEIgYtAGxBAkcNACAGQcAAaiEAA0AgACgCGCIALQAsQQJGDQALCwJAIAZBhAFqKAIAIgBFDQAgBkGAAWooAgAiAyAAQdgAbGohBQNAAkACQAJAAkACQAJAIAMoAgAiAEF8ag4CBQABCyABLQAADQRBBCEADAELAkAgAA4EBAACAwQLIAMoAgRBAUcNAyABLQAADQNBCCEACyADIABqKAIAIAEQmAEMAgsCQCADKAIEIgQtAGxBAkcNACAEQcAAaiEAA0AgACgCGCIALQAsQQJGDQALCwJAIARBhAFqKAIAIgJFDQAgBEGAAWooAgAhACACQdgAbCECA0ACQAJAAkAgACgCAEF8ag4CAgABCyABLQAADQEgAEEEaigCACABEJgBDAELIAAgARDsCAsgAEHYAGohACACQah/aiICDQALCwJAIARBmAFqKAIAIgJFDQAgBEGUAWooAgAhACACQShsIQIDQCAAIAEQ1AYgAEEoaiEAIAJBWGoiAg0ACwsgBC0APCIAQQZGDQEgAEECRw0BIARBEGohAANAIAAoAhgiAC0ALEECRg0ADAILCyADKAIMIgJFDQAgAygCCCEAIAJBKGwhAgNAIAEgABCGBSAAQShqIQAgAkFYaiICDQALCyADQdgAaiIDIAVHDQALCwJAIAZBmAFqKAIAIgNFDQAgBkGUAWooAgAhACADQShsIQMDQCABIAAQhgUgAEEoaiEAIANBWGoiAw0ACwsgBi0APCIBQQZGDQkgAUECRw0JIAZBEGohAQNAIAEoAhgiAS0ALEECRg0ADAoLCyAAKAIMIgNFDQggACgCCCEAIANBKGwhAwNAIAAgARDUBiAAQShqIQAgA0FYaiIDDQAMCQsLIAEtAAANByAAKAIEIQAMBQsgAS0AAA0GIAAoAgQhAAwECyABLQAADQUgACgCBCEADAMLIAEtAAANBCAAKAIEIQAMAgsgAS0AAA0DIAAoAgQhAAwBCyABLQAADQIgACgCBCEADAALCwJAIAAoAgQiACgCAEEDRw0AIABBBGogARDsEw8LIAAgARCCHQsLgRwBEX8gAC0AJCECIABBADoAJCAALQAlIQMCQCABKAIwIgRFDQACQAJAIAQoAgBBdGoiBUEHIAVBJkkbQXtqIgVBH0sNAEEBIAV0Qa6igIB4cQ0BIAUNACAELQARRQ0BCyAAQQM6ACQLIAAgBBDOASAEIAAQUyAAIAM6ACUgAEEAOgAkIAAgBBCdAQsgAC0AJiEGIABBADoAJiABKAIQIQcCQCABKAIUIghFDQAgByAIQdgAbGohCSAHIQoDQAJAAkACQAJAAkACQAJAAkACQCAKKAIAIgVBfGpBACAFQXtqQQhJGw4JAAYFBAMICAIBAAsCQCAFQQNHDQAgAC0AJCELIABBAzoAJCAALQAlIQwgACAKKAIEIgUQzgEgBSAAEFMgACAMOgAlIABBAzoAJCAAIAUQnQEgACAMOgAlIAAgCzoAJCAFKAIAQRlHDQAgACAFELMBCwJAIAooAkgiBUUNACAKKAJEIg0gBUEGdGohDgNAAkACQCANKAIAQQdGDQAgAC0AJCEPIABBAjoAJCAALQAlIRACQCANQThqKAIAIgVFDQAgDUE0aigCACEMIAVBDGwhCwNAIAwoAgAhBQJAIAAtACQiEQ0AAkAgBSgCAEF0aiISQQcgEkEmSRtBe2oiEkEfSw0AQQEgEnRBrqKAgHhxDQEgEg0AIAUtABFFDQELIABBAzoAJAsgDEEMaiEMIAAtACUhEiAAIAUQzgEgBSAAEFMgACASOgAlIAAgEToAJCAAIAUQnQEgC0F0aiILDQALCyANIAAQ4wQgACAQOgAlIAAgDzoAJAwBCwJAIA1BOGooAgAiBUUNACANQTRqKAIAIQwgBUEMbCELA0AgDCgCACEFAkAgAC0AJCIRDQACQCAFKAIAQXRqIhJBByASQSZJG0F7aiISQR9LDQBBASASdEGuooCAeHENASASDQAgBS0AEUUNAQsgAEEDOgAkCyAMQQxqIQwgAC0AJSESIAAgBRDOASAFIAAQUyAAIBI6ACUgACAROgAkIAAgBRCdASALQXRqIgsNAAsLIA0tABxBAkcNACAALQAmIQsgAEEAOgAmAkACQAJAAkACQAJAIA0oAggiBSgCAA4HBQABAgMFBAULIAVBDGooAgAiDEUNBCAFQQhqKAIAIQUgDEEobCEMA0ACQCAFKAIAQQdGDQAgBSAAEOMECyAFQShqIQUgDEFYaiIMDQAMBQsLIAUoAgQgABDjBAwDCyAFQQRqIAAQ9wUMAgsgACAFQQRqEIMODAELIAUoAgQhBQJAIAAtACQiDA0AAkAgBSgCAEF0aiIRQQcgEUEmSRtBe2oiEUEfSw0AQQEgEXRBrqKAgHhxDQEgEQ0AIAUtABFFDQELIABBAzoAJAsgAC0AJSERIAAgBRDOASAFIAAQUyAAIBE6ACUgACAMOgAkIAAgBRCdAQsgAC0AJSEMIA0oAgwhBQJAIAAtACQiEQ0AAkAgBSgCAEF0aiISQQcgEkEmSRtBe2oiEkEfSw0AQQEgEnRBrqKAgHhxDQEgEg0AIAUtABFFDQELIABBAzoAJAsgACAFEM4BIAUgABBTIAAgDDoAJSAAIBE6ACQgACAFEJ0BIAAgCzoAJiANKAIMIgUoAgBBGUcNACAAIAUQswELIA1BwABqIg0gDkcNAAsLIAooAiBBgICAgHhGDQcgAC0AJiESIABBADoAJiAKKAIoIgxFDQYgCigCJCEFIAxBMGwhDCAALQAlIQsgAC0AJCERA0AgAEEDOgAkIAUgABB0IAAgCzoAJSAAIBE6ACQgBUEwaiEFIAxBUGoiDA0ADAcLCwJAIAooAggiBUEFRg0AIAVBA0cNACAALQAkIQsgAEEDOgAkIAAtACUhDCAAIAooAgwiBRDOASAFIAAQUyAAIAw6ACUgAEEDOgAkIAAgBRCdASAAIAw6ACUgACALOgAkIAUoAgBBGUcNACAAIAUQswELAkAgCigCPCIFRQ0AAkAgAC0AJCIMDQACQCAFKAIAQXRqIgtBByALQSZJG0F7aiILQR9LDQBBASALdEGuooCAeHENASALDQAgBS0AEUUNAQsgAEEDOgAkCyAALQAlIQsgACAFEM4BIAUgABBTIAAgCzoAJSAAIAw6ACQgACAFEJ0BCyAKKAI4IgVFDQYgCigCNCEMIAVBDGwhCwNAIAwoAgAhBQJAIAAtACQiEQ0AAkAgBSgCAEF0aiISQQcgEkEmSRtBe2oiEkEfSw0AQQEgEnRBrqKAgHhxDQEgEg0AIAUtABFFDQELIABBAzoAJAsgDEEMaiEMIAAtACUhEiAAIAUQzgEgBSAAEFMgACASOgAlIAAgEToAJCAAIAUQnQEgC0F0aiILDQAMBwsLIAAtACYhEiAAQQA6ACYgCigCDCIMRQ0EIAooAgghBSAMQTBsIQwgAC0AJSELIAAtACQhEQNAIABBAzoAJCAFIAAQdCAAIAs6ACUgACAROgAkIAVBMGohBSAMQVBqIgwNAAwFCwsCQCAKKAIkIgVFDQACQCAALQAkIgwNAAJAIAUoAgBBdGoiC0EHIAtBJkkbQXtqIgtBH0sNAEEBIAt0Qa6igIB4cQ0BIAsNACAFLQARRQ0BCyAAQQM6ACQLIAAtACUhCyAAIAUQzgEgBSAAEFMgACALOgAlIAAgDDoAJCAAIAUQnQELIAooAjQiBUUNBCAKKAIwIQwgBUEMbCELA0AgDCgCACEFAkAgAC0AJCIRDQACQCAFKAIAQXRqIhJBByASQSZJG0F7aiISQR9LDQBBASASdEGuooCAeHENASASDQAgBS0AEUUNAQsgAEEDOgAkCyAMQQxqIQwgAC0AJSESIAAgBRDOASAFIAAQUyAAIBI6ACUgACAROgAkIAAgBRCdASALQXRqIgsNAAwFCwsCQCAKKAIIQQNHDQAgAC0AJCELIABBAzoAJCAALQAlIQwgACAKKAIMIgUQzgEgBSAAEFMgACAMOgAlIABBAzoAJCAAIAUQnQEgACAMOgAlIAAgCzoAJCAFKAIAQRlHDQAgACAFELMBCwJAIAooAjwiBUUNAAJAIAAtACQiDA0AAkAgBSgCAEF0aiILQQcgC0EmSRtBe2oiC0EfSw0AQQEgC3RBrqKAgHhxDQEgCw0AIAUtABFFDQELIABBAzoAJAsgAC0AJSELIAAgBRDOASAFIAAQUyAAIAs6ACUgACAMOgAkIAAgBRCdAQsgCigCOCIFRQ0DIAooAjQhDCAFQQxsIQsDQCAMKAIAIQUCQCAALQAkIhENAAJAIAUoAgBBdGoiEkEHIBJBJkkbQXtqIhJBH0sNAEEBIBJ0Qa6igIB4cQ0BIBINACAFLQARRQ0BCyAAQQM6ACQLIAxBDGohDCAALQAlIRIgACAFEM4BIAUgABBTIAAgEjoAJSAAIBE6ACQgACAFEJ0BIAtBdGoiCw0ADAQLCyAKKAIgIg0gABD7BQJAIA1BFGooAgAiBUUNACANQRBqKAIAIQwgBUEMbCELA0AgDCgCACEFAkAgAC0AJCIRDQACQCAFKAIAQXRqIhJBByASQSZJG0F7aiISQR9LDQBBASASdEGuooCAeHENASASDQAgBS0AEUUNAQsgAEEDOgAkCyAMQQxqIQwgAC0AJSESIAAgBRDOASAFIAAQUyAAIBI6ACUgACAROgAkIAAgBRCdASALQXRqIgsNAAsLIA0oAhhBgICAgHhGDQIgAC0AJiESIABBADoAJiANQSBqKAIAIgxFDQEgDUEcaigCACEFIAxBMGwhDCAALQAlIQsgAC0AJCERA0AgAEEDOgAkIAUgABB0IAAgCzoAJSAAIBE6ACQgBUEwaiEFIAxBUGoiDA0ADAILCwJAIAooAghBA0cNACAALQAkIQsgAEEDOgAkIAAtACUhDCAAIAooAgwiBRDOASAFIAAQUyAAIAw6ACUgAEEDOgAkIAAgBRCdASAAIAw6ACUgACALOgAkIAUoAgBBGUcNACAAIAUQswELIAooAjAiDSAAEPsFAkAgDUEUaigCACIFRQ0AIA1BEGooAgAhDCAFQQxsIQsDQCAMKAIAIQUCQCAALQAkIhENAAJAIAUoAgBBdGoiEkEHIBJBJkkbQXtqIhJBH0sNAEEBIBJ0Qa6igIB4cQ0BIBINACAFLQARRQ0BCyAAQQM6ACQLIAxBDGohDCAALQAlIRIgACAFEM4BIAUgABBTIAAgEjoAJSAAIBE6ACQgACAFEJ0BIAtBdGoiCw0ACwsgDSgCGEGAgICAeEYNASAALQAmIRIgAEEAOgAmIA1BIGooAgAiDEUNACANQRxqKAIAIQUgDEEwbCEMIAAtACUhCyAALQAkIREDQCAAQQM6ACQgBSAAEHQgACALOgAlIAAgEToAJCAFQTBqIQUgDEFQaiIMDQALCyAAIBI6ACYLIApB2ABqIgogCUcNAAsLIAAgBjoAJgJAIARFDQAgBCgCAEF0aiIFQQcgBUEmSRsiBUEWSw0AQQEgBXRB0MnAAnFFDQAgACAEELMBCyAAIAM6ACUgACACOgAkAkAgCEUNAEEAIQUCQAJAA0AgBUEBaiEAIAcoAgBBCkYNASAHQdgAaiEHIAAhBSAIIABHDQALQQAhDAwBCyAHEJ8FAkAgACAIRw0AQQEhDAwBCyAHQdgAaiEAIAVBf3MgCGohBUEBIQwDQAJAAkAgACgCAEEKRw0AIAAQnwUgDEEBaiEMDAELQdgARQ0AIAAgDEGof2xqIABB2AD8CgAACyAAQdgAaiEAIAVBf2oiBQ0ACwsgASAIIAxrNgIUCwv1HQIKfwJ+IwBB4ANrIgYkAAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAA0ACQAJAIAMNAEEAIQMMAQsgAigCAA0AIANBAnQhB0EAIQhBACEJA0AgByAIRg0VAkAgAiAIaigCAA0AIAhBBGohCCAJQQFqIQkMAQsLIAZB+ABqIAkgAiADQZDnggEQvhwgBigCfCEDIAYoAnghAiAGQfAAaiAJIAAgAUGg54IBEL0cIAYoAnQhASAGKAJwIQALAkACQCAFDQBBACEFDAELIAQoAgANACAFQQJ0IQdBACEIQQAhCQNAIAcgCEYNFQJAIAQgCGooAgANACAIQQRqIQggCUEBaiEJDAELCyAGQegAaiAJIAQgBUGw54IBEL4cIAYoAmwhBSAGKAJoIQQgBkHgAGogCSAAIAFBwOeCARC9HCAGKAJkIQEgBigCYCEACyADIAUgAyAFSxshByAEIAIgAyAFSSIIGyEKIAIgBCAIGyECIAMgBSAIGyIDQSFJDQMCQAJAIANBAXQgB00NACADQYECTw0BIAZBuANqIAIgAyADQQF2IghBwOiCARCQEiAGKAK8AyEEIAYoArgDIQUgBigCwAMhCyAGKALEAyECIAZBuANqIAogByAIQdDoggEQkBIgBigCvAMhByAGKAK4AyEKIAYoAsADIQwgBkGgA2ogAiAGKALEAyINakEBaiIOQeDoggEQwxMgBigCpAMgBigCqAMgCyACIAwgDRCaASAGQaADahCmCSAGQTBqIAggACABQfDoggEQvRwgBigCMCAGKAI0IAYoAqQDIgkgBigCqAMiDxCtCxogBkEoaiADQf4DcSAAIAFBgOmCARC9HCAGKAIoIAYoAiwgCSAPEK0LGiAGQQA2AqgDIAZBoANqIA4QjhIgBigCpAMgBigCqAMgBSAEIAogBxCaASAGQaADahCmCSAAIAEgBigCpAMiCSAGKAKoAyIDEK0LGiAGQSBqIAggACABQZDpggEQvRwgBigCICAGKAIkIAkgAxCtCxogBkG4A2ogCyACIAUgBBCnByAGKALEAyELIAYoAsADIQIgBigCvAMhBCAGLQC4AyEFIAZBuANqIAwgDSAKIAcQpwcgBigCxAMhCiAGKALAAyEDIAYoArwDIQcgBSAGLQC4AxDFF0H/AXEOAwMKBAMLIAZBuANqIAogByAHQQF2IghBwOmCARCQEiAGKALEAyEFIAYoAsADIQQgACABIAIgAyAGKAK4AyAGKAK8AxCaASAGQdgAaiAIIAAgAUHQ6YIBEL0cIAYoAlwhASAGKAJYIQAMAQsLIAZBgAFqIAIgB0EDbkEBaiIEIAMgBCADSRsiCBDIECAEIAMgCGsiCSAEIAlJGyIFIAhqIgkgA0sNAyAGQZABaiACIAhBAnRqIAUQyBAgBkHQAGogCSACIANB4OeCARC+HCAGQaABaiAGKAJQIAYoAlQQyBAgB0UNBCAGQbABaiAKIAQQyBAgBCAHIARrIgggBCAISRsiAiAEaiIIIAdLDQUgBkHAAWogCiAEQQJ0aiACEMgQIAZByABqIAggCiAHQZDoggEQvhwgBkHQAWogBigCSCAGKAJMEMgQIAZB4AFqIAZBgAFqIAZBoAFqEIgLIAZB8AFqIAZBsAFqIAZB0AFqEIgLIAZBgAJqIAZB4AFqIAZBkAFqEM4KIAZBkAJqIAZB8AFqIAZBwAFqEM4KIAZBoAJqIAZBgAFqIAZBsAFqEJIaIAZBsAJqIAZBoAFqIAZB0AFqEJIaIAZBoANqIAZB4AFqIAZBkAFqEL4IIAZBuANqIAZB8AFqIAZBwAFqEL4IIAZBwAJqIAZBoANqIAZBuANqEK4LIAZB0AJqIAZBgAJqIAZBkAJqEJIaIAZBuANqIAZBgAJqIAZBoAFqEL4IIAZBoANqIAZBuANqENEZIAZBkANqIAZBoANqIAZBgAFqEOAHIAZBuANqIAZBkAJqIAZB0AFqEL4IIAZBoANqIAZBuANqENEZIAZBuANqIAZBoANqIAZBsAFqEOAHIAZB4AJqIAZBkANqIAZBuANqEK4LIAZBoANqIAZB4AJqIAZBwAJqEPQHIAYtAKwDIQggBkG4A2ogBkGgA2pBAxDUCCAGQZADakEIaiAGQbgDakEIaigCADYCACAGIAYpArgDNwOQAyAGQfACaiAIIAZBkANqEM0UIAZBuANqIAZBwAJqIAZB0AJqEPQHIAZBgANqIAZBuANqELMKIAZBkANqIAZB0AJqIAZBoAJqEPQHIAYtAPwCIghBAUcNBiAGQbgDaiAGQZADahCbHyAGKAL0AiEIDBALIAZBEGogCCAAIAFBoOmCARC9HCAGKAIQIAYoAhQgAiALIAMgChCaAQwGCyAGQQA2AqgDIAZBoANqIA4QjhIgBigCpAMgBigCqAMgAiALIAMgChCaASAGQaADahCmCSAGQRhqIAggACABQbDpggEQvRwgBigCGCAGKAIcIAYoAqQDIgkgBigCqAMQrAgMBQsgAiADQQJ0aiEMQQAhAwNAIAIgDEYNECAGQQhqIAMgACABQeDpggEQvRwgA0EBaiEDIAIoAgAhCSAGKAIMIQggBigCCCEEIAJBBGoiBSECIAlFDQAgBkG4A2ogBCAIIAdBwOaCARCPEiAHIAYoArwDIgggByAISRshAiAGKALEAyEEIAYoAsADIQsgBigCuAMhCCAJrSEQQgAhESAKIQkCQANAIAJFDQEgCCARIAg1AgB8IAk1AgAgEH58IhE+AgAgEUIgiCERIAJBf2ohAiAJQQRqIQkgCEEEaiEIDAALCyAGIBE+ArgDIAYgCyAEIAZBuANqQQEQrQsiCDYCoAMCQCAIDQAgBSECDAELCyAGQgA3AsQDIAZCgYCAgMAANwK8AyAGQfjmggE2ArgDIAZBoANqIAZBuANqENMbAAsgCSADQdDnggEQvCIACyAEQQBB8OeCARC8IgALIAggB0GA6IIBELwiAAsgBi0AnAMiAg4DAQgCAQsgByADEN8iIAQgAhDfIiAGKAKgAyAJEN8iDAoLIAhFDQEMAgsgCEUNAQsgBigClAMiCSAGKAKYAyIDIAYoAvQCIgggBigC+AIQmRtB/wFxDgICAwELIAZBuANqQQhqIAZB8AJqQQhqKAIANgIAIAYgBikC8AI3A7gDIAZBoANqIAZBuANqIAYoApQDIAYoApgDEJYMIAZBuANqIAIgBkGgA2oQzRQMBQsgBkGgA2pBCGogBkHwAmpBCGooAgA2AgAgBiAGKQLwAjcDoAMgBkGgA2ogCSADEKAgIAZBuANqQQIgAmsgBkGgA2oQzRQMBAsgBkHAA2pBACkCyN+CATcDACAGQQApAsDfggE3A7gDDAILIAZBuANqQQhqIAZB8AJqQQhqKAIANgIAIAYgBikC8AI3A7gDIAZBoANqIAkgAyAGQbgDahDmByAGQbgDaiACIAZBoANqEM0UDAILIAZBuANqQQhqIAZB8AJqQQhqKAIANgIAIAZBuANqQQ9qIAZB8AJqQQ9qLQAAOgAAIAYgBikC8AI3A7gDIAYgBi8A/QI7AMUDIAZBAiAIazoAxAMMAQsgBigC8AIgCBDfIgsgBkGgA2ogBkG4A2oQswogBi0AvAIhCCAGQYCAgIB4NgK4AyAGIAZBsAJqNgK8AwJAAkAgBigCuAJFDQAgBkHUA2ogBkG4A2pBAEEBEMgIDAELIAZB1ANqIAZBuANqENAZCyAGQbgDaiAIIAZB1ANqEM0UIAZB8AJqIAZBoANqIAZBuANqEL4IIAZBuANqIAZBgANqIAZBsAJqEM4KIAZBmANqIgIoAgAhBSAGQZ8Dai0AACEJIAYtAJwDIQggBi8AnQMhAyACQQApAsjfggE3AwAgBkG0A2pBAmoiByAJOgAAIAYoApADIQkgBigClAMhAiAGQQApAsDfggE3A5ADIAYgAzsBtAMCQAJAIAYtAMQDIgNBAUcNACAGQZ0DaiIDIAYvAbQDOwAAIANBAmogBy0AADoAACAGIAg6AJwDIAYgBTYCmAMgBiACNgKUAyAGIAk2ApADDAELAkACQAJAAkACQAJAAkACQAJAIAgOAwEDAAELIANFDQEMBwsgA0UNBgsgAiAFIAYoArwDIgcgBigCwAMiChCZG0H/AXEOAgIDAQsgBkGQA2ogBkG4A2oQmx8MAwsgBiAFNgKoAyAGIAI2AqQDIAYgCTYCoAMgBkHUA2ogByAKIAZBoANqEOYHIAZBkANqIAMgBkHUA2oQzRQMBAsgBkGYA2pBACkCyN+CATcDACAGQQApAsDfggE3A5ADDAELIAYgBTYCqAMgBiACNgKkAyAGIAk2AqADIAZBoANqIAcgChCgICAGQZADaiAIIAZBoANqEM0UDAILIAkgAhDfIgwBCyAGIAU2AqgDIAYgAjYCpAMgBiAJNgKgAyAGQdQDaiAGQaADaiAGKAK8AyAGKALAAxCWDCAGQZADaiAIIAZB1ANqEM0UC0EAQQQQ3yIgBigCuAMgBigCvAMQ3yIgBkGAA2pBCGoiCCkDACERIAhBACkCyN+CATcDACAGQbgDakEIaiARNwMAIAYpA4ADIREgBkEAKQLA34IBNwOAAyAGIBE3A7gDIAZBgANqIAZBuANqIAZB8AJqEPQHQQBBBBDfIiAGIAZBsAJqNgLIAyAGIAZB8AJqNgLEAyAGIAZBkANqNgLAAyAGIAZBgANqNgK8AyAGIAZBoAJqNgK4A0EQIQgDQAJAAkACQAJAIAhBfEYNACAIQQJ2IQIgBkG4A2ogCGoiCSgCAC0ADA4DAQMCAQsgBigCkAMgBigClAMQ3yIgBigCgAMgBigChAMQ3yIgBigC8AIgBigC9AIQ3yIgBigCsAIgBigCtAIQ3yIgBigCoAIgBigCpAIQ3yIMBAsgBkE4aiACIARsIAAgAUGg6IIBEL0cIAYoAjggBigCPCAJKAIAIgIoAgQgAigCCBCsCAwBCyAGQcAAaiACIARsIAAgAUGw6IIBEL0cIAYoAkAgBigCRCAJKAIAIgIoAgQgAigCCBCtCxoLIAhBfGohCAwACwsgBkHgA2okAAu/HQIUfwF+IwBBwAFrIgYkAAJAAkACQAJAIAMoAgAiB0F/akECSQ0AAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgBSABKAKkDSIIKALEAigCEEEBdEsNACAGQewAaiABKAKwDSABKAK0DSIJKAIIQX9qQXhxakEIaiIKIAMoAggiCyADKAIMIgwgAygCECINIAMoAhQiDiAJKAIQIg8REwACQAJAAkAgBigCbEEBRw0AIAJBmANqIRAgAUGQBWohESADLQAYIRJBACETIAEtAKwNQQFxIRQgASkDAEIChSABKQMIhCEaIA0hFQNAIAYoAnAhFiAGIAYoAnQiCTYCjAEgBiANNgKIAQJAAkAgCSAMSw0AIA0gCUEBak0NAQsgBkECNgKYASAGQdChmwE2ApQBIAZCAjcCoAEgBkEONgK4ASAGQcABNgKwASAGIAw2ApABIAYgBkGsAWo2ApwBIAYgBkGQAWo2ArQBIAYgBkGIAWo2AqwBIAZBlAFqQeChmwEQqB0ACyAGIBdBgH5xIBJyIhc2AoQBIAYgCTYCgAEgBiANNgJ8IAYgDDYCeCAGIAs2AnQgBkEBNgJsIBQNBQJAAkAgGlANACACKALIBEECRg0IIAZBrAFqIBEgECAGQewAaiATEN0BIAYoArABIRggBigCrAEiE0ECRw0BIBhBAXFFDQUgBkHAAGogASACIAMQ2gQMGAsgBkEBNgKYASAGQfSbhAE2ApQBIAZCADcCoAEgBiAGQbwBajYCnAEgBkGUAWpB/JuEARCoHQALIBNBAXENAiAVIA5PDQEgFkF/Rg0HIAZB7ABqIAogCyAMIBZBAWoiFSAOIA8REwAgCSETIAYoAmwNAAsLIAZBADYCQAwUCyAGIAYoArQBIgk2AogBIAYgDjYCjAEgDiAMSw0FIAkgDkEBaksNBSAGIBI2AoQBIAYgDjYCgAEgBiAJNgJ8IAYgDDYCeCAGIAs2AnQgBiAYNgJwIAZBAjYCbCACKALIBEECRg0GIAJB2AFqIQ0CQAJAAkACQAJAIAEoAoAFIgwtAOICDQAgBkGUAWogASANIAZB7ABqEEsgBigClAEiDEECRw0BDBYLIAwtAOMCIQ4gBkGUAWogASANIAZB7ABqEEsgBigClAEiDEECRg0VIAxBAXFFDQMgBigCnAEhFiAOQQFxRQ0CIAZBrAFqIAZB7ABqIAYoApgBIBYgFiABIA0Q0wYgBigCrAEiDEECRw0BIAYoArABIQkMFgsgDEEBcUUNAiAGKAKcASEWDAELIAYoArQBIRYLIAxBAXFFDQAgCSAWSw0IIAYgGDYCTCAGIBY2AkggBiAJNgJEIAZBATYCQAwUCyAGQQE2ApgBIAZB9JyEATYClAEgBkIANwKgASAGIAZBvAFqNgKcASAGQZQBakH8nIQBEKgdAAsgAigCyARBAkYNByAGQewAaiABIAJB2AFqIAMQhwQCQCAGKAJsIglBAkcNACAGKAJwELcRGiAGQcAAaiABIAIgAxDaBAwTCyAGIAYpAnQ3AkggBiAGKAJwNgJEIAYgCTYCQAwSCyADKAIEIRkgBkHsAGogASgCsA0gASgCtA0iCSgCCEF/akF4cWpBCGoiCiADKAIIIgsgAygCDCIMIAMoAhAiDSADKAIUIg4gCSgCECIPERMAIAYoAmxBAUcNEyACQZgDaiEQIAFBkAVqIREgAy0AGCESQQAhEyABLQCsDUEBcSEUIAEpAwBCAoUgASkDCIQhGiANIRUCQANAIAYoAnAhFiAGIAYoAnQiCTYCRCAGIA02AkAgCSAMSw0JIA0gCUEBaksNCSAGIBdBgH5xIBJyIhc2AoQBIAYgCTYCgAEgBiANNgJ8IAYgDDYCeCAGIAs2AnQgBkEBNgJsIBQNCgJAAkAgGlANACACKALIBEECRg0NIAZBrAFqIBEgECAGQewAaiATEN0BIAYoArABIRggBigCrAEiE0ECRw0BIBhBAXFFDQMgBkEYaiABIAIgAyAEIAUQ3gYgBigCHCEDIAYoAhghAQwZCyAGQQE2ApgBIAZB9JuEATYClAEgBkIANwKgASAGIAZBvAFqNgKcASAGQZQBakH8m4QBEKgdAAsCQCATQQFxDQAgFSAOTw0WIBZBf0YNDSAGQewAaiAKIAsgDCAWQQFqIhUgDiAPERMAIAkhEyAGKAJsRQ0WDAELCyAGIAYoArQBIgM2AqwBIAYgDjYCsAEgDiAMSw0MIAMgDkEBaksNDCAGIBI6AIQBIAYgDjYCgAEgBiADNgJ8IAYgDDYCeCAGIAs2AnQgBiAYNgJwIAZBAjYCbCAGQThqIAEgAiAGQewAaiAEIAUQ3gYgBigCPCEDIAYoAjghAQwWCwJAIAUgCCgCxAIoAhBBAXRLDQAgAigCyARBAkYNDSAGQewAaiABIAJB2AFqIAMQhwQCQAJAIAYoAmwiCUECRw0AIAYoAnAQtxEaIAZBlAFqIAEgAiADENoEIAYoApQBIQkMAQsgBiAGKQJ0NwKcASAGIAYoAnA2ApgBCyAJQQFxRQ0UIAYoAqABIgNBAXQiAUEBciEJIAYpApgBIRoCQCABIAVPDQAgBCABQQJ0aiAap0EBajYCAAtBASEBIAkgBU8NFkEBIQEgBCAJQQJ0aiAaQiCIp0EBajYCAAwWCwJAIAEoAuQKQQNGDQAgASgCiAsiCSgCsAIgCSgCtAJHDQAgBkEwaiABIAIgAyAEIAUQ3gYgBigCNCEDIAYoAjAhAQwWCyACKALIBEECRg0NIAZB7ABqIAEgAkHYAWogAxCHBAJAIAYoAmwiCUECRw0AIAYoAnAQtxEaIAZBIGogASACIAMgBCAFEN4GIAYoAiQhAyAGKAIgIQEMFgsgCUEBcUUNEyAGKAJ4IQMgBigCdCEJIAYoAnAhFiAGIA42AoABIAYgDTYCfCAGIAw2AnggBiALNgJ0IAYgEjoAhAEgBiAZNgJwIAYgBzYCbCAGQdAAaiAGQewAaiAWIAkQgwwgBiADNgJUIAZBAjYCUCAGQShqIAEgAiAGQdAAaiAEIAUQ3gYgBigCKEEBcUUNDiAGKAIsIQNBASEBDBULQZKpmwFBKEGMooQBEIwaAAtBnKGEARDJIgALQZybhAEQySIACyAGQQI2ApgBIAZB0KGbATYClAEgBkICNwKgASAGQQ42ArgBIAZBwAE2ArABIAYgDDYCkAEgBiAGQawBajYCnAEgBiAGQZABajYCtAEgBiAGQYgBajYCrAEgBkGUAWpB4KGbARCoHQALQeyghAEQySIACyAGQQA2AqQBIAZBATYCmAEgBkHE5oMBNgKUASAGQgQ3ApwBIAZBlAFqQaDihAEQqB0AC0HcoIQBEMkiAAsgBkECNgKYASAGQdChmwE2ApQBIAZCAjcCoAEgBkEONgK4ASAGQcABNgKwASAGIAw2AogBIAYgBkGsAWo2ApwBIAYgBkGIAWo2ArQBIAYgBkHAAGo2AqwBIAZBlAFqQeChmwEQqB0AC0GSqZsBQShBjKKEARCMGgALQZyhhAEQySIAC0Gcm4QBEMkiAAsgBkECNgJwIAZB0KGbATYCbCAGQgI3AnggBkEONgKgASAGQcABNgKYASAGIAw2AkAgBiAGQZQBajYCdCAGIAZBwABqNgKcASAGIAZBrAFqNgKUASAGQewAakHgoZsBEKgdAAtB3KCEARDJIgALQdyghAEQySIAC0GUmoQBQRNBqJqEARCrFAALIAYoApgBIQkLIAkQtxEaIAZBwABqIAEgAiADENoECyAGKAJARQ0BQQEhASAGKAJMIgNBAXQiCUEBciECIAYpAkQhGgJAIAkgBU8NACAEIAlBAnRqIBqnQQFqNgIACyACIAVPDQNBASEBIAQgAkECdGogGkIgiKdBAWo2AgAMAwsCQAJAAkACQAJAAkACQAJAIAUgASgCpA0oAsQCKAIQQQF0Sw0AIAEtAKwNQQFGDQEgASkDAEIChSABKQMIhFANAyACKALIBEECRg0CIAZB7ABqIAEgAkHYAWogAxCHBAJAIAYoAmwiCUECRw0AIAYoAnAQtxEaIAZBlAFqIAEgAiADENoEDAgLIAYgBikCdDcCnAEgBiAGKAJwNgKYASAGIAk2ApQBDAcLAkACQCABKALkCkEDRw0AIAEtAKwNRQ0BQZKpmwFBKEHMoYQBEIwaAAsgBkEQaiABIAIgAyAEIAUQ3gYgBigCFCEDIAYoAhAhAQwKCwJAAkAgASkDAEIChSABKQMIhFANACACKALIBEECRg0FIAZB7ABqIAEgAkHYAWogAxCHBCAGKAJsIglBAkcNASAGKAJwELcRGgsgBiABIAIgAyAEIAUQ3gYgBigCBCEDIAYoAgAhAQwKCyAJQQFxRQ0HIAYoAnghDCAGKAJwIQkgAy0AGCEWIAMoAgwhDSADKAIIIQ4gBiAGKAJ0IgM2ArABIAYgCTYCrAEgCSADQQFqSw0EIAMgDUsNBCAGIBY6AIQBIAYgAzYCgAEgBiAJNgJ8IAYgDTYCeCAGIA42AnQgBiAMNgJwIAZBAjYCbCAGQQhqIAEgAiAGQewAaiAEIAUQ3gZBASEBIAYoAghBAXFFDQUgBigCDCEDDAkLQZKpmwFBKEHMoYQBEIwaAAtB3KCEARDJIgALIAZBlAFqIAEgAiADENoEDAMLQdyghAEQySIACyAGQQI2AnAgBkHQoZsBNgJsIAZCAjcCeCAGQQ42AqABIAZBwAE2ApgBIAYgDTYCQCAGIAZBlAFqNgJ0IAYgBkHAAGo2ApwBIAYgBkGsAWo2ApQBIAZB7ABqQeChmwEQqB0AC0GUmoQBQRNBqJqEARCrFAALIAYoApQBDQELQQAhAQwBC0EBIQEgBigCoAEiA0EBdCIJQQFyIQIgBikCmAEhGgJAIAkgBU8NACAEIAlBAnRqIBqnQQFqNgIACyACIAVPDQBBASEBIAQgAkECdGogGkIgiKdBAWo2AgALIAAgATYCACAAIAM2AgQgBkHAAWokAAuFHAEJfyMAQRBrIgIkAAJAAkACQAJAAkACQAJAAkACQCAAKAIADggABQQDCAgCAQALAkAgACgCICIDQQhqKAIAIgRFDQAgAS0ABEEBRw0AIANBBGooAgAhACAEQQxsIQQDQAJAIAEtAARBAUcNAAJAAkACQAJAIAAoAgAiBSgCAEFmag4DAgABAwsgBSgCCEEFRg0BDAILIAUoAgxFDQELIAFBADoABAwBCyAFIAEQ5wELIABBDGohACAEQXRqIgQNAAsLAkAgA0EUaigCACIARQ0AIANBEGooAgAiBiAAQdgAbGohBwNAAkACQAJAAkACQAJAAkACQCAGKAIAIgBBfGpBACAAQXtqQQhJGw4JAAYFBAMHBwIBAAsgBiABEPULAkAgBigCSCIARQ0AIAYoAkQiBSAAQQZ0aiEIA0ACQAJAIAUoAgBBB0YNAAJAIAVBOGooAgAiBEUNACABLQAEQQFHDQAgBUE0aigCACEAIARBDGwhBANAAkAgAS0ABEEBRw0AAkACQAJAAkAgACgCACIJKAIAQWZqDgMCAAEDCyAJKAIIQQVGDQEMAgsgCSgCDEUNAQsgAUEAOgAEDAELIAkgARDnAQsgAEEMaiEAIARBdGoiBA0ACwsgBSABEPoGDAELAkAgBUE4aigCACIERQ0AIAEtAARBAUcNACAFQTRqKAIAIQAgBEEMbCEEA0ACQCABLQAEQQFHDQACQAJAAkACQCAAKAIAIgkoAgBBZmoOAwIAAQMLIAkoAghBBUYNAQwCCyAJKAIMRQ0BCyABQQA6AAQMAQsgCSABEOcBCyAAQQxqIQAgBEF0aiIEDQALCyAFLQAcQQJHDQAgBSgCCCABEPoGIAEtAARBAUcNAAJAAkACQAJAIAUoAgwiACgCAEFmag4DAgABAwsgACgCCEEFRg0BDAILIAAoAgxFDQELIAFBADoABAwBCyAAIAEQ5wELIAVBwABqIgUgCEcNAAsLIAYoAiBBgICAgHhGDQYgBigCKCIERQ0GIAYoAiQhACAEQTBsIQQDQCAAIAEQ8gEgAEEwaiEAIARBUGoiBA0ADAcLCwJAAkAgBigCCCIAQQVGDQAgAS0ABEEBRw0BAkACQAJAAkACQAJAIAAOBQIDAAEGAgsCQCABLQAFDQAgBisDGJlEAAAAAAAA8H9iDQAgAUEAOgAECyABIAEoAgBBBWo2AgAMBgsCQCAGKAIMIgAoAgBBZmoOAwUDAAQLIAAoAgwNBAwDCyACIAZBEGoQlBMgASACKAIEIAEoAgBqQQJqNgIADAQLIAJBCGogBkEQahCTEyABIAIoAgwgASgCAGpBAmo2AgAMAwsgACgCCEEFRg0BCyAAIAEQ5wELIAFBADoABAsCQCAGKAI8IgBFDQAgAS0ABEEBRw0AAkACQAJAAkAgACgCAEFmag4DAgABAwsgACgCCEEFRg0BDAILIAAoAgxFDQELIAFBADoABAwBCyAAIAEQ5wELIAYoAjgiBEUNBSABLQAEQQFHDQUgBigCNCEAIARBDGwhBANAAkAgAS0ABEEBRw0AAkACQAJAAkAgACgCACIFKAIAQWZqDgMCAAEDCyAFKAIIQQVGDQEMAgsgBSgCDEUNAQsgAUEAOgAEDAELIAUgARDnAQsgAEEMaiEAIARBdGoiBA0ADAYLCyAGKAIMIgRFDQQgBigCCCEAIARBMGwhBANAIAAgARDyASAAQTBqIQAgBEFQaiIEDQAMBQsLIAFBADoABAwDCyAGQQhqIAEQ9QsCQCAGKAI8IgBFDQAgAS0ABEEBRw0AAkACQAJAAkAgACgCAEFmag4DAgABAwsgACgCCEEFRg0BDAILIAAoAgxFDQELIAFBADoABAwBCyAAIAEQ5wELIAYoAjgiBEUNAiABLQAEQQFHDQIgBigCNCEAIARBDGwhBANAAkAgAS0ABEEBRw0AAkACQAJAAkAgACgCACIFKAIAQWZqDgMCAAEDCyAFKAIIQQVGDQEMAgsgBSgCDEUNAQsgAUEAOgAEDAELIAUgARDnAQsgAEEMaiEAIARBdGoiBA0ADAMLCyABQQA6AAQCQCAGKAIgIgooAggiBEUNACAKKAIEIgAgBEEGdGohCANAAkAgACIJQThqKAIAIgRFDQAgAS0ABEEBRw0AIAlBNGooAgAhACAEQQxsIQQDQAJAIAEtAARBAUcNAAJAAkACQAJAIAAoAgAiBSgCAEFmag4DAgABAwsgBSgCCEEFRg0BDAILIAUoAgxFDQELIAFBADoABAwBCyAFIAEQ5wELIABBDGohACAEQXRqIgQNAAsLIAkgARD6BiAJQcAAaiIAIAhHDQALCwJAIAooAhQiBEUNACABLQAEQQFHDQAgCigCECEAIARBDGwhBANAAkAgAS0ABEEBRw0AAkACQAJAAkAgACgCACIFKAIAQWZqDgMCAAEDCyAFKAIIQQVGDQEMAgsgBSgCDEUNAQsgAUEAOgAEDAELIAUgARDnAQsgAEEMaiEAIARBdGoiBA0ACwsgCigCGEGAgICAeEYNASAKKAIgIgRFDQEgCigCHCEAIARBMGwhBANAIAAgARDyASAAQTBqIQAgBEFQaiIEDQAMAgsLIAZBCGogARD1CwJAIAYoAjAiCkEIaigCACIERQ0AIApBBGooAgAiACAEQQZ0aiEIA0ACQCAAIglBOGooAgAiBEUNACABLQAEQQFHDQAgCUE0aigCACEAIARBDGwhBANAAkAgAS0ABEEBRw0AAkACQAJAAkAgACgCACIFKAIAQWZqDgMCAAEDCyAFKAIIQQVGDQEMAgsgBSgCDEUNAQsgAUEAOgAEDAELIAUgARDnAQsgAEEMaiEAIARBdGoiBA0ACwsgCSABEPoGIAlBwABqIgAgCEcNAAsLAkAgCkEUaigCACIERQ0AIAEtAARBAUcNACAKQRBqKAIAIQAgBEEMbCEEA0ACQCABLQAEQQFHDQACQAJAAkACQCAAKAIAIgUoAgBBZmoOAwIAAQMLIAUoAghBBUYNAQwCCyAFKAIMRQ0BCyABQQA6AAQMAQsgBSABEOcBCyAAQQxqIQAgBEF0aiIEDQALCyAKKAIYQYCAgIB4Rg0AIApBIGooAgAiBEUNACAKQRxqKAIAIQAgBEEwbCEEA0AgACABEPIBIABBMGohACAEQVBqIgQNAAsLIAZB2ABqIgYgB0cNAAsLIAMoAjAiAEUNByABLQAEQQFHDQcCQAJAIAAoAgBBZmoOAwgAAQcLIAAoAghBBUYNBwwGCyAAKAIMRQ0FIAFBADoABAwHCyAAKAIEIgAtAEUiBEEDRg0GAkAgBEECRg0AAkAgACgCQCIALQAlQQJGDQAgAEEgaiABELMRDAgLIABBCGooAgAiBEUNByAAQQRqKAIAIQAgBEE4bCEEA0ACQAJAIAAoAgBBCUcNACAAQQhqIAEQ8gEMAQsgACABENAFCyAAQThqIQAgBEFIaiIEDQAMCAsLIABBKGooAgAiBEUNBiAAQSRqKAIAIQAgBEE4bCEEA0ACQAJAIAAoAgBBCUcNACAAQQhqIAEQ8gEMAQsgACABENAFCyAAQThqIQAgBEFIaiIEDQAMBwsLIAAoAgQiAEEoaigCACIERQ0FIARBMGwhBCAAQSRqKAIAQShqIQADQAJAIAAoAgAiBUUNACABLQAEQQFHDQACQAJAAkACQCAFKAIAQWZqDgMCAAEDCyAFKAIIQQVGDQEMAgsgBSgCDEUNAQsgAUEAOgAEDAELIAUgARDnAQsgAEEwaiEAIARBUGoiBA0ADAYLCyAAKAIEIgBBCGooAgAiBEUNBCAAQQRqKAIAIgAgBEE4bGohBQNAIAAgARD6BgJAIABBMGooAgAiBEUNACABLQAEQQFHDQACQAJAAkACQCAEKAIAQWZqDgMCAAEDCyAEKAIIQQVGDQEMAgsgBCgCDEUNAQsgAUEAOgAEDAELIAQgARDnAQsgAEE4aiIAIAVHDQAMBQsLIAAoAgQiAEEIaigCACIERQ0DIABBBGooAgAiACAEQThsaiEFA0AgACABEPoGAkAgAEEwaigCACIERQ0AIAEtAARBAUcNAAJAAkACQAJAIAQoAgBBZmoOAwIAAQMLIAQoAghBBUYNAQwCCyAEKAIMRQ0BCyABQQA6AAQMAQsgBCABEOcBCyAAQThqIgAgBUcNAAwECwsCQCAAKAIgIghBCGooAgAiBEUNACAIQQRqKAIAIgAgBEEGdGohBgNAAkAgACIJQThqKAIAIgRFDQAgAS0ABEEBRw0AIAlBNGooAgAhACAEQQxsIQQDQAJAIAEtAARBAUcNAAJAAkACQAJAIAAoAgAiBSgCAEFmag4DAgABAwsgBSgCCEEFRg0BDAILIAUoAgxFDQELIAFBADoABAwBCyAFIAEQ5wELIABBDGohACAEQXRqIgQNAAsLIAkgARD6BiAJQcAAaiIAIAZHDQALCwJAIAhBFGooAgAiBEUNACABLQAEQQFHDQAgCEEQaigCACEAIARBDGwhBANAAkAgAS0ABEEBRw0AAkACQAJAAkAgACgCACIFKAIAQWZqDgMCAAEDCyAFKAIIQQVGDQEMAgsgBSgCDEUNAQsgAUEAOgAEDAELIAUgARDnAQsgAEEMaiEAIARBdGoiBA0ACwsgCCgCGEGAgICAeEYNAiAIQSBqKAIAIgRFDQIgCEEcaigCACEAIARBMGwhBANAIAAgARDyASAAQTBqIQAgBEFQaiIEDQAMAwsLIAAgARDnAQwBCyABQQA6AAQLIAJBEGokAAuFHAIMfwF8IwBBsAFrIgIkAEEAIQMgAkEAOgAHAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgASgCAEFuag4fCgwJDAAIDAEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAgwLAkAgASgCBCIEKAIAQXRqIgVBByAFQSZJGyIFQRRLDQACQEEBIAV0IgVBgMnQAHENACAFQYyAIHFFDQEgAC0AJA0BCyAAIAQQswELAkAgASgCCCIFKAIAQRlHDQAgACAFELMBCwJAIAEoAgwiBSgCAEEZRw0AIAAgBRCzAQsgAC0AJEEBRw0LIAAtACVBAUcNCyAAIAEQswEMCwsgASgCCCEGAkAgASgCDCIHRQ0AQQAhAyAGIQUgByEIA0BBASEEAkACQAJAIAUoAgAiCSgCAEFnag4LAQICAgICAgICAgACCyAJKAIEIgkoAgBBGUcNAQsgCSgCDCEECyAFQQRqIQUgBCADaiEDIAhBf2oiCA0ACwsgAyAHRw0DIAYgB0ECdGohCiAHQQJ0IQkgB0F/aiELQQAhBAJAAkACQAJAA0AgBiEDAkAgCQ0AQQAhBCACQQA2AihBBCEFQQAhAwwDC0EALQDg9p0BGkHAABCEASEFAkACQCALIARGDQAgBQ0BDAwLIAVFDQsgA0EEaiEJIAVBADYCCCAFQjE3AwAgAygCACEIIAMgBTYCACAHIQQMAgsgA0EEaiEGIAVBADYCCCAFQjE3AwAgAygCACEIIAMgBTYCACAEQQFqIQQgCUF8aiEJIAggAkEHahDjBiIIRQ0ACyADQQRqIQkLIAJB6ABqQQRBBEEEEKMOIAIoAmwhBSACKAJoQQFGDQQgAigCcCIMIAg2AgAgAkEBNgIwIAIgDDYCLCACIAU2AiggB0F/aiEGQQEhCwJAA0AgCSIDIApGDQFBAC0A4PadARpBwAAQhAEhBQJAAkAgBiAERg0AIAVFDQwgA0EEaiEJIAVBADYCCCAFQjE3AwAgAygCACEIIAMgBTYCACAEQQFqIQQgCCACQQdqEOMGIghFDQIgA0EEaiEJDAELIAVFDQsgA0EEaiEJIAVBADYCCCAFQjE3AwAgAygCACEIIAMgBTYCACAHIQQLAkAgCyACKAIoRw0AIAJBKGpBARCnHiACKAIsIQwLIAwgC0ECdGogCDYCACACIAtBAWoiCzYCMAwACwsgAigCLCEFIAIoAighAyACKAIwIgRBAUYNAiACIAQ2AiggBEECSw0BCyACIAQ2AhAgAiAFNgIMIAIgAzYCCAwGCyACQQA2AnggAiADNgJwIAIgBTYCbCACIAU2AmggAiAFIARBAnRqNgJ0IAIgAkEoajYCfCACQQhqIAJB6ABqEPYIDAULIAJB6ABqQQhqIgkgBSgCACIEQQhqKQMANwMAIAJB6ABqQRBqIgggBEEQaikDADcDACACQegAakEYaiIGIARBGGopAwA3AwAgAkHoAGpBIGoiCiAEQSBqKQMANwMAIAJB6ABqQShqIgsgBEEoaikDADcDACACQegAakEwaiIHIARBMGopAwA3AwAgAkHoAGpBOGoiACAEQThqKQMANwMAIAIgBCkDADcDaCABENEBIAFBOGogACkDADcDACABQTBqIAcpAwA3AwAgAUEoaiALKQMANwMAIAFBIGogCikDADcDACABQRhqIAYpAwA3AwAgAUEQaiAIKQMANwMAIAFBCGogCSkDADcDACABIAIpA2g3AwAgBEHAAEEIEL0TIAVBABDUHCADIAUQ8SIMCgsgASgCBCIFKAIAQQNHDQkgBSgCECIEKAIAQXRqIgVBByAFQSZJGyIFQRZLDQlBASAFdEGAwZACcQ0BIAVBA0cNCQJAAkAgAC0AJA4EAQALCwELIAAtACUNCQsgACAEELMBDAkLIAUgAigCcEGAnZsBENggAAsgACAEELMBDAcLIAJB6ABqIANBBEEEEKMOIAIoAmwhBQJAAkACQAJAAkAgAigCaEEBRg0AIAJBADYCMCACIAIoAnAiAzYCLCACIAU2AigCQCABKAIMIgQNAEEAIQQMAwsgASgCCCIGIARBAnRqIQwgBkEEaiEDIARBf2pB/////wNxQQFqIQ1BACEEQQEhCQNAIAYhBSADIQYgCSEKAkACQAJAAkAgBSgCACIDKAIAQRlHDQAgAygCDCELIANBADYCDCADKAIEIQkgAygCCCEFIANCgICAgMAANwIEIAUgC0ECdCIDaiEIAkAgCiAHRg0AIAIgCDYCICACIAk2AhwgAiAFNgIYIAIgBTYCFCACIAJBB2o2AiQCQCALRQ0AA0AgBSEDAkACQANAIANBBGohBSADKAIAIAJBB2oQ4wYiAw0BIAUhAyAFIAhGDQIMAAsLIAIgBTYCGAJAIAQgAigCKEcNACACQShqQQEQpx4LIAIoAiwgBEECdGogAzYCACACIARBAWoiBDYCMCAFIAhHDQELCyAIIQULIAIgBTYCGCACQRRqEK8WDAQLIAJBADYCeCACIAg2AnQgAiAJNgJwIAIgBTYCbCACIAU2AmggC0UNAkEAIANrIQkgC0F/akH/////A3EhCwNAIAUoAgAhAwJAAkACQCAJQXxGDQAgAkEoaiADIAJBB2oQ4wYiA0EARxCnHiACKAIwIQQgAw0BDAILIAQgAigCKEcNACACQShqQZComgEQtRgLIAIoAiwgBEECdGogAzYCACAEQQFqIQQLIAVBBGohBSACIAQ2AjAgCUEEaiIJRQ0CDAALC0EALQDg9p0BGkHAABCEASEEAkACQCAKIAdGDQAgBEUNDCAEQQA2AgggBEIxNwMAIAUoAgAhAyAFIAQ2AgAgAkEoaiADIAJBB2oQ4wYiBUEARxCnHiACKAIwIQQgBUUNASACKAIsIARBAnRqIAU2AgAgBEEBaiEEDAELIARFDQsgBEEANgIIIARCMTcDACAFKAIAIQMgBSAENgIAAkAgAigCMCIFIAIoAihHDQAgAkEoakGgqJoBELUYCyACKAIsIAVBAnRqIAM2AgAgBUEBaiEECyACIAQ2AjAMAgsgAiAINgJsIAIgC0EBajYCeAsgAkHoAGoQrxYLIApBAWohCSAGIAYgDEdBAnRqIQMgCiANRg0CDAALCyAFIAIoAnBBgKiaARDYIAALIARBAUYNASACKAIsIQMgAigCKCEFIAIgBDYCrAEgBEECSw0CCyACIAQ2AhAgAiADNgIMIAIgBTYCCAwCCyACQegAakEIaiIDIAIoAiwiBCgCACIFQQhqKQMANwMAIAJB6ABqQRBqIgkgBUEQaikDADcDACACQegAakEYaiIIIAVBGGopAwA3AwAgAkHoAGpBIGoiBiAFQSBqKQMANwMAIAJB6ABqQShqIgogBUEoaikDADcDACACQegAakEwaiILIAVBMGopAwA3AwAgAkHoAGpBOGoiByAFQThqKQMANwMAIAIgBSkDADcDaCACKAIoIQAgARDRASABQThqIAcpAwA3AwAgAUEwaiALKQMANwMAIAFBKGogCikDADcDACABQSBqIAYpAwA3AwAgAUEYaiAIKQMANwMAIAFBEGogCSkDADcDACABQQhqIAMpAwA3AwAgASACKQNoNwMAIAVBwABBCBC9EyAEQQAQ1BwgACAEEPEiDAcLIAJBADYCeCACIAU2AnAgAiADNgJsIAIgAzYCaCACIAMgBEECdGo2AnQgAiACQawBajYCfCACQQhqIAJB6ABqEPYICwJAIAAtACQiBQ0AIAIoAhBFDQBBACEFAkACQAJAIAIoAgwoAgAiBCgCAEFuag4GAAMDAwMBAwsgBCgCBCIEKAIAQRdHDQIgBC0AGEEFRw0CIAQoAhAiBCgCAEEPRg0BDAILIAQtABhBBUcNASAEKAIQIgQoAgBBD0cNAQsgACAEELMBIAAtACQhBQsgAkE0aiACQQhqQQhqKAIANgIAIAIgAikCCDcCLCACQRk2AiggAiABKQMQNwM4AkAgBUH/AXFBAkcNACAAIAJBKGoQswELIAJB6ABqQThqIgUgAkEoakE4aikDADcDACACQegAakEwaiIEIAJBKGpBMGopAwA3AwAgAkHoAGpBKGoiAyACQShqQShqKQMANwMAIAJB6ABqQSBqIgkgAkEoakEgaikDADcDACACQegAakEYaiIIIAJBKGpBGGopAwA3AwAgAkHoAGpBEGoiBiACQShqQRBqKQMANwMAIAJB6ABqQQhqIgogAkEoakEIaikDADcDACACIAIpAyg3A2ggARDRASABQThqIAUpAwA3AwAgAUEwaiAEKQMANwMAIAFBKGogAykDADcDACABQSBqIAkpAwA3AwAgAUEYaiAIKQMANwMAIAFBEGogBikDADcDACABQQhqIAopAwA3AwAgASACKQNoNwMADAULAAsgAS0AGEEFRw0DIAEoAhAiBCgCAEF0aiIFQQcgBUEmSRsiBUEWSw0DAkBBASAFdEGAwZACcQ0AIAVBA0cNBAJAAkACQCAALQAkDgQBAAcHAQsgAC0AJQ0BCyAAIAQQswEMBQsgACABELMBDAQLIAAgBBCzAQwDCyABKAIoIgUoAgBBG0cNAiAFKAIIQQNHDQIgBSsDGCIOIA5iDQJEAAAAAAAA8D8gDqZEAAAAAAAA8L9iDQIgACAFELMBDAILAkAgAS0AFEEVRw0AIAAtACYNAQsgAC0AJA0BIAEoAgQiBCgCACIFQR9LDQFBASAFdEGAgIOAeHFFDQEgACAEELMBDAELIAAgARCzAQsgAkGwAWokAAv5JAIEfwJ+IwBBIGsiAiQAIAAgASkDADcDACAAQQhqIQMgAUEIaiEEAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABKAIIIgVBNCAFQb2BgIB4SBtB/wFxDr0BAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AAYEBggGDAYQBhQGGAYcBiAGJAYoBiwGMAY0BjgGPAZABkQGSAZMBlAGVAZYBlwGYAZkBmgGbAZwBnQGeAZ8BoAGhAaIBowGkAaUBpgGnAagBqQGqAasBrAGtAa4BrwGwAbEBsgGzAbQBtQG2AbcBuAG5AboBuwG8AQALIANBgICAgHg2AgAMvAELIANBgYCAgHg2AgAMuwELIANBgoCAgHg2AgAMugELIANBg4CAgHg2AgAMuQELIANBhICAgHg2AgAMuAELIANBhYCAgHg2AgAMtwELIANBhoCAgHg2AgAMtgELIANBh4CAgHg2AgAMtQELIANBiICAgHg2AgAMtAELIANBiYCAgHg2AgAMswELIANBioCAgHg2AgAMsgELIANBi4CAgHg2AgAMsQELIANBjICAgHg2AgAMsAELIANBjYCAgHg2AgAMrwELIANBjoCAgHg2AgAMrgELIANBj4CAgHg2AgAMrQELIANBkICAgHg2AgAMrAELIANBkYCAgHg2AgAMqwELIANBkoCAgHg2AgAMqgELIANBk4CAgHg2AgAMqQELIANBlICAgHg2AgAMqAELIANBlYCAgHg2AgAMpwELIANBloCAgHg2AgAMpgELIAMgBCkDADcDACADQRBqIARBEGopAwA3AwAgA0EIaiAEQQhqKQMANwMADKUBCyADQZiAgIB4NgIADKQBCyADQZmAgIB4NgIADKMBCyADQZqAgIB4NgIADKIBCyADQZuAgIB4NgIADKEBCyADQZyAgIB4NgIADKABCwJAIAEpAxAiBkIDg0IAUg0AIAanIgEgASgCACIBQQFqNgIAIAFBf0wNoQELIABBnYCAgHg2AgggACAGNwMQDJ8BCyADQZ6AgIB4NgIADJ4BCyADQZ+AgIB4NgIADJ0BCyADQaCAgIB4NgIADJwBCyADIAQpAwA3AwAgA0EQaiAEQRBqKQMANwMAIANBCGogBEEIaikDADcDAAybAQsgA0GigICAeDYCAAyaAQsgA0GjgICAeDYCAAyZAQsgAyAEKQMANwMAIANBEGogBEEQaikDADcDACADQQhqIARBCGopAwA3AwAMmAELIANBpYCAgHg2AgAMlwELIANBpoCAgHg2AgAMlgELAkAgASkDECIGQgODQgBSDQAgBqciASABKAIAIgFBAWo2AgAgAUF/TA2XAQsgAEGngICAeDYCCCAAIAY3AxAMlQELIANBqICAgHg2AgAMlAELIANBqYCAgHg2AgAMkwELIANBqoCAgHg2AgAMkgELIANBq4CAgHg2AgAMkQELIAJBFGogASgCECABKAIUEKwUIABBrICAgHg2AgggACACKQIUNwIMIABBFGogAkEUakEIaigCADYCACAAIAEpAxg3AxgMkAELIANBrYCAgHg2AgAMjwELIANBroCAgHg2AgAMjgELIANBr4CAgHg2AgAMjQELIAJBFGogASgCECABKAIUEKwUIABBsICAgHg2AgggACACKQIUNwIMIABBFGogAkEUakEIaigCADYCACAAIAEpAxg3AxgMjAELIAJBFGogASgCECABKAIUEKwRIABBsYCAgHg2AgggAEEUaiACQRRqQQhqKAIANgIAIAAgAikCFDcCDAyLAQsgA0GygICAeDYCAAyKAQsgA0GzgICAeDYCAAyJAQsgAkEIaiABKAIMIAEoAhAQrBQgAkEUaiABKAIYIAEoAhwQrBQgA0EIaiACQQhqQQhqKAIANgIAIAMgAikCCDcCACAAIAIpAhQ3AhQgAEEcaiACQRRqQQhqKAIANgIADIgBCyADIAQpAwA3AwAgA0EQaiAEQRBqKQMANwMAIANBCGogBEEIaikDADcDAAyHAQsgA0G2gICAeDYCAAyGAQsgA0G3gICAeDYCAAyFAQsgA0G4gICAeDYCAAyEAQsgAyAEKQMANwMAIANBEGogBEEQaikDADcDACADQQhqIARBCGopAwA3AwAMgwELIANBuoCAgHg2AgAMggELIANBu4CAgHg2AgAMgQELIANBvICAgHg2AgAMgAELIANBvYCAgHg2AgAMfwsgA0G+gICAeDYCAAx+CyADQb+AgIB4NgIADH0LIANBwICA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NgJIIANBkAJqIANBwABqEI0XIANBpAJqIANB0AFqKAIANgIAIAMgAykCyAE3ApwCIAQgAiADQZACahCEFyEKIAEtAMgBQaIBRw0AIAEQ1xIhAiABEOMOIAEgAhD6EgsgAEEHNgIAIAAgCjYCBCADQagBahCEIAwFCyADQRBqIAEgAhDCBQJAAkAgAy0AJEECRg0AIANB3ABqIANBKGopAwA3AgAgA0HUAGogA0EgaikDADcCACADQcwAaiADQRhqKQMANwIAIAMgAykDEDcCRAJAQSRFDQAgAEEEaiADQcAAakEk/AoAAAtBACEBDAELIAAgAygCEDYCBEEHIQELIAAgATYCAAwECyAEQaIBRg0BCyADQcAAakEEciAEEIYeIANBHDYCVCADQZy8mwE2AlAgA0GwgICAeDYCQCABKALAASABKALEASADQcAAahCEFyECAkAgAS0AyAFBogFHDQAgARDXEiEFIAEQ4w4gASAFEPoSCyAAQQc2AgAgACACNgIEDAILIAEQ1xIhAiABEOMOIABBBzYCACAAIAI2AgQMAQsgASABKAJ4IhBB//97cTYCeCABKALAASERIAEQ4w4gA0EIakEIQQhBOEG0yZsBENkWIANBADYCOCADIAMoAgwiCzYCNCADIAMoAgg2AjAgA0HoAWpBCGohAiADQegBakEEaiEMIANBwABqQRBqIRIgA0HoAWpBBHIhEyADQcgBakEIaiEGIANBwABqQQhqIRQgA0HAAGpBBHIhFSABLQDIASEFQQAhCkEAIRYCQAJAA0AgCkE4bCEHAkADQAJAIAVB/wFxIgVBA0cNACABEOMOIAEoArwBIQYgA0HAAGpBCGogA0EwakEIaigCACIENgIAIAMgAykCMDcDQCADIBY2AlggAyAGNgJUIAMgETYCUCADIAE2AkwgBEF/aiEFIAMoAkQiAiAEQThsaiEHIAMgGDcCXCAYQiCIpyEIIBinIQsgFkEBcSEJAkADQAJAAkACQCACIAdGIgQNACACKAIAIQogBUUNASAKQQJHDQIgAigCDCEKIAIoAgghDCADQbuAgIB4NgLoASABIAwgCiADQegBahDeHAwCCwJAAkACQCABLQCBAUEEcQ0AQQAhAiABLQB5QcAAcUUNAiABLQDIAUH/AXFBCkYNAQwCC0EAIQIgAS0AyAFBCkcNAQsgARDj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gHghBQywAQtBiYCAgHghBQyvAQtBioCAgHghBQyuAQtBi4CAgHghBQytAQtBjICAgHghBQysAQtBjYCAgHghBQyrAQtBjoCAgHghBQyqAQtBj4CAgHghBQypAQtBkICAgHghBQyoAQtBkYCAgHghBQynAQtBkoCAgHghBQymAQtBk4CAgHghBQylAQtBlICAgHghBQykAQtBlYCAgHghBQyjAQtBloCAgHghBQyiAQtBmICAgHghBQyhAQtBmYCAgHghBQygAQtBmoCAgHghBQyfAQtBm4CAgHghBQyeAQtBnICAgHghBQydAQsgACkDECIMpyEHAkAgDEIDg0IAUg0AIAcgBygCACIAQQFqNgIAIABBf0wNnwELIAxCIIinIQhBnYCAgHghBQydAQtBnoCAgHghBQybAQtBn4CAgHghBQyaAQtBoICAgHghBQyZAQtBooCAgHghBQyYAQtBo4CAgHghBQyXAQsgACgCHCEJIAAoAhghCiAAKAIUIQggACgCECEHIAAoAgwhCyAGIQUMlwELQaWAgIB4IQUMlQELQaaAgIB4IQUMlAELIAApAxAiDKchBwJAIAxCA4NCAFINACAHIAcoAgAiAEEBajYCACAAQX9MDZYBCyAMQiCIpyEIQaeAgIB4IQUMlAELQaiAgIB4IQUMkgELQamAgIB4IQUMkQELQaqAgIB4IQUMkAELQauAgIB4IQUMjwELIAFBFGogAEEQaigCACAAQRRqKAIAEKwUIAAoAhwhCSAAKAIYIQogASgCHCEIIAEoAhghByABKAIUIQtBrICAgHghBQyPAQtBrYCAgHghBQyNAQtBroCAgHghBQyMAQtBr4CAgHghBQyLAQsgAUEUaiAAQRBqKAIAIABBFGooAgAQrBQgACgCHCEJIAAoAhghCiABKAIcIQggASgCGCEHIAEoAhQhC0GwgICAeCEFDIsBCyABQRRqIABBEGooAgAgAEEUaigCABCsESABKAIcIQggASgCGCEHIAEoAhQhC0GxgICAeCEFDIoBC0GygICAeCEFDIgBC0GzgICAeCEFDIcBCyABQQhqIABBDGooAgAgAEEQaigCABCsFCABQRRqIABBGGooAgAgAEEcaigCABCsFCABKAIcIQkgASgCGCEKIAEoAhQhCCABKAIQIQcgASgCDCELIAEoAgghBQyHAQtBtoCA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ABxBAkYNACAAQQA6ABwLIAAoAiAiAyABEL0EIANBGGohBgJAIANBFGooAgAiBEUNACADQRBqKAIAIQAgBEEMbCEEA0AgASAAKAIAEN0IIABBDGohACAEQXRqIgQNAAsLAkAgBigCAEGAgICAeEYNAAJAIAMoAiAiBEUNACADKAIcIQAgBEEwbCEEA0ACQAJAIAAQwAsNACAAKAIAQQFGDQEgACkDACELIABCATcDACACQShqIABBKGopAwA3AwAgAkEgaiAAQSBqKQMANwMAIAJBGGogAEEYaikDADcDACACQRBqIABBEGopAwA3AwAgAkEIaiAAQQhqIgUpAwA3AwAgBUEANgIAIAIgCzcDACACEOkDDAELIAAgARDTAQsgAEEwaiEAIARBUGoiBA0ACwsgBhDoCAsCQCADKAI8IgFFDQAgARC+DiABKAIAIAFBBGooAgAQ9iIgAUEUQQQQvRMLIANBADYCPAJAIAMoAkAiAUUNACABKAIAIgAQ2AMgAEHgAEEIEL0TIAFBDEEEEL0TCyADQQA2AkALIAJBMGokAAuHFgEEfwJAAkACQANAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCAA4TAA8PAQIDDw8EBRAODAsKCQgHBgALIAAoAgwiAkUNDiAAKAIIIQAgAkEwbCECA0AgACABEK8BIABBMGohACACQVBqIgINAAwPCwsgACgCBCABEKUBIAAoAgghAAwLCyAAKAIMIgBFDQwgACABEKUBDwsgACgCKCEADAkLIAAoAgQgARClASAAKAIIIAEQrwEgACgCFCIADQgMCgsgACgCECABEKUBIAAoAgwiAkUNCSAAKAIIIgMgAkEYbGohBANAAkAgAygCFCIARQ0AIAAgARClAQsCQCADQQhqKAIAIgJFDQAgA0EEaigCACEAIAJBMGwhAgNAIAAgARCvASAAQTBqIQAgAkFQaiICDQALCyADQRhqIgMgBEYNCgwACwsgACgCBCABEKUBDAgLAkACQAJAAkACQAJAAkACQCAAKAIIDggAAQIDBAUGBwALAkAgACgCKCIEQQhqKAIAIgJFDQAgBEEEaigCACEAIAJBDGwhAgNAIAAoAgAgARClASAAQQxqIQAgAkF0aiICDQALCwJAIARBFGooAgAiAkUNACAEQRBqKAIAIQAgAkHYAGwhAgNA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AwA3AwAgBUEYaiACQSBqQRhqKQMANwMAIAVBEGogAkEgakEQaikDADcDACAFQQhqIAJBIGpBCGopAwA3AwAgBSACKQMgNwMAIAVBKGohBSAaQVhqIRogHUEoaiEdIBtBf2oiGw0ACwsgKq1CIIYgK62EIS8gESkCICEwQQMhHQwBCwJAIC5CA4NCAFENAAwBCyAupyIFIAUoAgAiBUEBajYCACAFQX9MDQQLICetQiCGICathCExICCtQiCGICGthCEyIC9CIIinIRogL6chGwsgEUHYAGohESAWIBlB2ABsaiIFICI2AlQgBSAjNgJQIAUgJDYCTCAFICU2AkggBSAxNwNAIAUgMjcDOCAFIC03AzAgBSAeNgIsIAUgHzYCKCAFIDA3AyAgBSAuNwMYIAUgKDYCFCAFICk2AhAgBSAcNgIEIAUgHTYCACAFIBqtQiCGIButhDcDCCAZQQFqIRkgGEF/aiIYDQALCyABLQCIASEbAkACQCABKAJ4IhENAEEAIRgMAQtBAC0A4PadARpBFBCEASIYRQ0BIBEoAgQhBSARKAIQIR4gESgCDCEfIAJBIGogESgCCCIoQQRBBBCjDiACKAIkIRogAigCIEEBRg0EIAIoAighKQJAIBpFDQAgKEECdCERICkhGSAaIR0DQCARRQ0BQQAtAOD2nQEaQeAAEIQBIhxFDQMgAkEgaiAFKAIAEGUCQEHgAEUNACAcIAJBIGpB4AD8CgAACyAZIBw2AgAgGUEEaiEZIBFBfGohESAFQQRqIQUgHUF/aiIdDQALCyAYIB42AhAgGCAfNgIMIBggKDYCCCAYICk2AgQgGCAaNgIACyACQQxqQQJqIhwgAkEQakECai0AADoAACACIAIvARA7AQwgAkEQaiABKAKUASABKAKYARD8A0EGIQUCQAJAIAEtADwiEUEGRw0ADAELIAEoAgwhGiABKAIIIR0CQAJAAkACQCARQX1qIgVBASAFQQNJG0H/AXEOAwABAgALIAEoAiAhIyABKAIcIREgASgCGCEZAkAgASkDECItQgODQgBSDQAgLaciBSAFKAIAIgVBAWo2AgAgBUF/TA0FCyABLQAkISJBAyEFQQAhJAwCCyABKAIkISIgASgCICEjIAJBIGogAUEoahCYCSABKAIcIREgASgCGCEZAkAgASkDECItQgODQgBSDQAg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AjcCDCAAQQI6ACQgACAENgIIIABCooCAgKCAgICAfzcCACAAQRxqIAJBqAJqKQMANwIAIABBFGogAkGgAmopAwA3AgAMCgsgAkGwAmogARDIASACKAKwAiEBAkBBOEUNACACQcABaiACQbQCakE4/AoAAAsgAUEiRg0BIAIoAuwCIQMCQEE4RQ0AIABBBGogAkHAAWpBOPwKAAALIAAgAzYCPAwCCyACQbACaiABEPsLIAJBwAFqQQhqIgEgAkGwAmpBDGopAgA3AwAgAkHAAWpBEGoiAyACQbACakEUaikCADcDACACQcABakEYaiIFIAJBsAJqQRxqKQIANwMAIAIgAikCtAI3A8ABAkACQCACKAKwAiIEQSJGDQAgACACKQLUAjcCJCAAQTxqIAJBsAJqQTxqKAIANgIAIABBNGogAkGwAmpBNGopAgA3AgAgAEEsaiACQbACakEsaikCADcCACAAQRxqIAUpAwA3AgAgAEEUaiADKQMANwIAIABBDGogASkDADcCACAAIAIpA8ABNwIEDAELIAJB6ABqQQhqIgYgASkDADcDACACQegAakEQaiADKQMAIgg3AwAgAkHoAGpBGGogBSkDACIJNwMAIAJB6ABqQQxqIAJBCGpBCGooAgA2AgAgAiACKQPAATcDaCAAQYKAgIB4NgIEIABBGGogCDcCACAAQSBqIAk3AgAgAiACKQMINwJsIAAgAikDaDcCCCAAQRBqIAYpAwA3AgALIAAgBDYCAAwICwJAQThFIgMNACACQYgBaiACQcABakE4/AoAAAsgAkGsAWogAkEQaigCADYCACACIAIpAwg3AqQBIAMNACAAQQRqIAJBiAFqQTj8CgAACyAAIAE2AgAMBgsgAkHQAGogARD7DCACQThqQRRqIAJB0ABqQRRqKAIANgIAIAJBOGpBCGogAkEIakEIaigCADYCACACIAIpAlw3AkQgAiACKQMINwM4IAJBIDYCwAEgAkGwAmogASgCBCABKAIIIAJBOGogAkHAAWoQoQ1BwABFDQUgACACQbACakHAAPwKAAAMBQsgACACKQOYAjcCDCAAQQE6ACQgACAENgIIIABCooCAgKCAgICAfzcCACAAQRxqIAJBqAJqKQMANwIAIABBFGogAykDADcCAAwECwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIARB7QBKDQACQCAEQURqDgcNAg4CAgkMAAsgBEGff2oOBgIKAQEBAwELAkAgBEGOf2oOCQYBBAEHAQEBCQALIARB7gBGDQQLIAJBCzYCwAEgAkGwAmogASgCBCABKAIIIAJBmAJqIAJBwAFqEKENQcAARQ0RIAAgAkGwAmpBwAD8CgAADBELIAAgAikDmAI3AgwgAEEGOwEkIABBBzYCCCAAQqKAgICggICAgH83AgAgAEEcaiACQagCaikDADcCACAAQRRqIAJBoAJqKQMANwIADBALIAAgAikDmAI3AgwgAEGGAjsBJCAAQQw2AgggAEKigICAoICAgIB/NwIAIABBHGogAkGoAmopAwA3AgAgAEEUaiACQaACaikDADcCAAwPCyAAIAIpA5gCNwIMIABBhgQ7ASQgAEEJNgIIIABCooCAgKCAgICAfzcCACAAQRxqIAJBqAJqKQMANwIAIABBFGogAkGgAmopAwA3AgAMDgsgACACKQOYAjcCDCAAQYYGOwEkIABBCjYCCCAAQqKAgICggICAgH83AgAgAEEcaiACQagCaikDADcCACAAQRRqIAJBoAJqKQMANwIADA0LIAAgAikDmAI3AgwgAEGGCDsBJCAAQQ02AgggAEKigICAoICAgIB/NwIAIABBHGogAkGoAmopAwA3AgAgAEEUaiACQaACaikDADcCAAwMCyAAIAIpA5gCNwIMIABBhgo7ASQgAEELNgIIIABCooCAgKCAgICAfzcCACAAQRxqIAJBqAJqKQMANwIAIABBFGogAkGgAmopAwA3AgAMCwsgACACKQOYAjcCCCAAQQI6ACAgAEKigICAsICAgIB/NwIAIABBGGogAkGYAmpBEGopAwA3AgAgAEEQaiACQaACaikDADcCAAwKCyAAIAIpA5gCNwIIIABBAzoAICAAQqKAgICwgICAgH83AgAgAEEYaiACQZgCakEQaikDADcCACAAQRBqIAJBoAJqKQMANwIADAkLIAJBwAFqQRBqIgQgAkGYAmpBEGopAwA3AwAgAkHAAWpBCGoiBiACQZgCakEIaikDADcDACACIAIpA5gCNwPAAUEEIQMgBSgCACABKAIIRg0EIAEQgQpB+wBHDQQgAkGwAmogASACQQhqEKgDIAItALQCIQEgAigCsAIiB0EiRg0DAkBBO0UNACAAQQVqIAJBsAJqQQVqQTv8CgAACyAAIAE6AAQgACAHNgIADAgLIAAgAikDmAI3AgggAEEFOgAgIABCooCAgLCAgICAfzcCACAAQRhqIAJBmAJqQRBqKQMANwIAIABBEGogAkGgAmopAwA3AgAMBwsgACACKQOYAjcCCCAAQQg6ACAgAEKigICAsICAgIB/NwIAIABBGGogAkGYAmpBEGopAwA3AgAgAEEQaiACQZgCakEIaikDADcCAAwGCyAAIAIpA5gCNwIIIABBCToAICAAQqKAgICwgICAgH83AgAgAEEYaiACQZgCakEQaikDADcCACAAQRBqIAJBoAJqKQMANwIADAULIAFB/wFxQQxGDQAgAkHUAWogBUEIaigCADYCACACIAUpAgA3AswBIAEhAwsgACACKQPAATcCCCAAIAM6ACAgAEKigICAsICAgIB/NwIAIABBGGogBCkDADcCACAAQRBqIAYpAwA3AgAMAwsCQCADLQBlDQAgAkHQAGogARD7DCACQThqQRRqIAJB0ABqQRRqKAIANgIAIAJBOGpBCGogAkEIakEIaigCADYCACACIAIpAlw3AkQgAiACKQMINwM4IAJBIDYCwAEgAkGwAmogASgCBCABKAIIIAJBOGogAkHAAWoQoQ1BwABFDQMgACACQbACakHAAPwKAAAMAwsgAkEYaiABEL0FIAJBJGogAkEIakEIaigCADYCACAAQqKAgICggICAgH83AgAgAEEYaiACQRhqQRBqKQIANwIAIABBIGogAkEYakEYaikCADcCACACIAIpAwg3AhwgACACKQIYNwIIIABBEGogAkEYakEIaikCADcCAAwCCyACQQA2ArACIAJBBGpBoIeFASACQbACakGkh4UBEOIbAAsgAkH4AWogARCgCiACQfgBakEIaiIBIAJBCGpBCGooAgA2AgAgAEKigICA0ICAgIB/NwIAIAAgAikDCCIINwIIIABBGGogAkH4AWpBEGopAwA3AgAgAEEgaiACQfgBakEYaigCADYCACAAQRBqIAEpAwA3AgAgAiAINwP4AQsgAkHwAmokAAuPFwIWfwF+IwBBgAFrIgMkACADQQY2AiRBuIiAASEEIANBuIiAATYCICADQZWAgIB4NgIIIAMgASACQQV0aiIFNgIcIANB4ABqQQRyIQYgA0H0AGohByADQdAA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AkACQAJAAkAgAygCtBEiCkGAgICAeEcNACADQfAFakEIaiAELwEAOwEAIAMgAykD8A03A/AFDAELAkBBnANFDQAgA0GgFGpBGGogA0GADmpBGGpBnAP8CgAACwJAQegCRQ0AIANBoBRqQbgDaiADQYAOakG4A2pB6AL8CgAACyADQbYUaiADQfANakEIai8BADsBACADIAU6AK0UIAMgBjoArBQgAyAHNgKoFCADIAg2AqQUIAMgCTYCoBQgAyAKNgLUFyADIAMpA/ANNwGuFCADQeAXaiEGAkAgAygC6BciCSADKALgF0cNACAGQbTkgwEQ7xcLIAMoAuQXIAlBCWxqIghCADcAACAIQQhqQQA6AAAgAyAJQQFqNgLoFyADQfgXaiEHAkAgAygCgBgiCSADKAL4F0cNACAHQcTkgwEQ8hcLIANB1BdqIQQgAygC/BcgCUEDdGpCADcCACADIAlBAWo2AoAYIANB7BdqIQUCQCADKAL0FyIJIAMoAuwXRw0AIAVB1OSDARDtFwsgAygC8BcgCUECdGpBADYCACADIAlBAWo2AvQXIANBgA5qIARBABCZDwJAAkACQCADKAKADiIJQQNGDQAgA0HoDWogA0GWDmovAQA7AQAgAyADKQGODjcD4A0MAQsgA0GADmogBEEAEJkPAkAgAygCgA4iCUEDRg0AIANB6A1qIANBlg5qLwEAOwEAIAMgAykBjg43A+ANDAELIANBgA5qIARBABCZDyADKAKEDiEIAkACQCADKAKADiIJQQNGDQAgA0HoDWogA0GWDmovAQA7AQAgAyADKQGODjcD4A0MAQsgAyAINgKsGiADQYAOaiAEQQAQmQ8gAygChA4hCAJAIAMoAoAOIglBA0YNACADQegNaiADQZYOai8BADsBACADIAMpAY4ONwPgDQwBCyADIAg2ArAaIANBgA5qIANBoBRqEKUMAkAgAygCgA4iCUEDRg0AIANB6A1qIANBlg5qLwEAOwEAIAMgAykBjg43A+ANDAILIANBgA5qIANBoBRqENsRAkAgAygCgA4iCUEDRg0AIANB6A1qIANBlg5qLwEAOwEAIAMgAykBjg43A+ANDAILIANBgA5qIANBoBRqIAEgAhCcAwJAIAMoAoAOIglBA0YNACADQegNaiADQZYOai8BADsBACADIAMpAY4ONwPgDQwCCyAEEKsVIANBgA5qIANBoBRqEJ4NAkBBgAJFDQAgA0GcGGogA0GADmpBgAL8CgAACyADQYAOaiADQaAUahCrCAJAIAMoAoAOIglBA0YNACADQegNaiADQZYOai8BADsBACADIAMpAY4ONwPgDQwCCyADQaAUahCrDyADQYAOaiADQaAUahCuBwJAIAMoAoAOIglBA0YNACADQegNaiADQZYOai8BADsBACADIAMpAY4ONwPgDQwCCyADQYAOaiADQaAUahCCAgJAIAMoAoAOIglBA0YNACADQegNaiADQZYOai8BADsBACADIAMpAY4ONwPgDQwCCyADQaAUahD7CSADQaAUahD/AiADQYAOaiADQcAUaiICEKMBIANBkBhqIQkCQCADKAKQGCIIRQ0AIAggCCgCACIEQX9qNgIAIARBAUcNACADKAKQGCADKAKUGBDsEAsgCSADKQKADjcCACAJQQhqIANBgA5qQQhqKAIANgIAIAMgA0GgFGpBkAZBiAYgAygCkBgbaigCADYCpBogBhCsFSAFEK0VIAcQrhUgA0GEGGoQrxUgA0HgDWpBCGoiCCADQe4Xai8BADsBACADIAMpAeYXNwPgDSADKQLUFyELIAMpAtwXIQwgAy8B5BchBgJAQcgCRSIJDQAgA0GYC2ogA0HwF2pByAL8CgAACyACEJUdIANBiAtqQQhqIgcgCC8BADsBACADIAMpA+ANNwOICwJAIAkNACADQagDaiADQZgLakHIAvwKAAALIANB8AVqQQhqIAcvAQAiCDsBACADQZgDakEIaiIHIAg7AQAgAyADKQOICyINNwPwBSADIA03A5gDAkAgCQ0AIANB0ABqIANBqANqQcgC/AoAAAsgA0HOAGogBy8BADsBACADIAY7AUQgAyAMNwI8IAMgCzcCNCADIAMpA5gDNwFGAkACQAJAAkACQAJAAkACQAJAIAMtADAiBg4EAQIDAAELAkBB5AJFDQAgA0GgFGogA0E0akHkAvwKAAALIANBgA5qIANBDGogA0GgFGoQiAkgAygCgA4hCCADKAKEDiEHIAMtAIgOIQYgAy0AMSEFDA0LQQAtAOD2nQEaQewCEIQBIghFDQIgCEKBgICAEDcCAAJAQeQCRQ0AIAhBCGogA0E0akHkAvwKAAALQcTdgwEhB0EAIQYgAy0AMSEFDAwLIANB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AiQAAkACQAJAIAAtAGwiA0EERg0AIANBfWpBA0kNAQsgAEHYAGohBAJAIANBAkcNACAEIAEQqBwLIAEoAgBFDQEgASAEEN8FCyABKAIARQ0AIAAtAGxBA0cNACACIAEgAEHAAGoiAxD5BSACLQAsQQZGDQAgAxDPESADQShqIAJBKGopAwA3AwAgA0EgaiACQSBqKQMANwMAIANBGGogAkEYaikDADcDACADQRBqIAJBEGopAwA3AwAgA0EIaiACQQhqKQMANwMAIAMgAikDADcDAAsCQCAAKAKEASIDRQ0AIAAoAoABIgQgA0HYAGxqIQUDQAJAAkAgBCgCACIDQQVHDQAgASAEKAIEIgMQ0wMgAyABEFEgASgCAEUNASADKAIAQRpHDQEgASADQQhqIgYQwwUiB0UNASADEOQBIANBOGogB0E4aikDADcDACADQTBqIAdBMGopAwA3AwAgA0EoaiAHQShqKQMANwMAIANBIGogB0EgaikDADcDACADQRhqIAdBGGopAwA3AwAgA0EQaiAHQRBqKQMANwMAIAYgB0EIaikDADcDACADIAcpAwA3AwAgB0HAAEEIEL0TDAELIANBBEYNAAJAAkACQCADDgQDAAECAwsgBCgCBEEBRw0CIAEgBCgCCCIDENMDIAMgARBRIAEoAgBFDQIgAygCAEEaRw0CIAEgA0EIaiIGEMMFIgdFDQIgAxDkASADQThqIAdBOGopAwA3AwAgA0EwaiAHQTBqKQMANwMAIANBKGogB0EoaikDADcDACADQSBqIAdBIGopAwA3AwAgA0EYaiAHQRhqKQMANwMAIANBEGogB0EQaikDADcDACAGIAdBCGopAwA3AwAgAyAHKQMANwMAIAdBwABBCBC9EwwCCyAEKAIEIAEQvQEMAQsgBCgCDCIDRQ0AIANBKGwhByAEKAIIQQRqIQMDQAJAAkACQAJAAkAgA0F8aigCAA4FBAABAgMECyADKAIAQQFHDQMgASADQQRqKAIAIgYQ0wMgBiABEFEgASgCAEUNAyAGKAIAQRpHDQMgASAGQQhqIggQwwUiCUUNAyAGEOQBIAZBOGogCUE4aikDADcDACAGQTBqIAlBMGopAwA3AwAgBkEoaiAJQShqKQMANwMAIAZBIGogCUEgaikDADcDACAGQRhqIAlBGGopAwA3AwAgBkEQaiAJQRBqKQMANwMAIAggCUEIaikDADcDACAGIAkpAwA3AwAgCUHAAEEIEL0TDAMLIAEgAygCACIGENMDIAYgARBRIAEoAgBFDQIgBigCAEEaRw0CIAEgBkEIaiIIEMMFIglFDQIgBhDkASAGQThqIAlBOGopAwA3AwAgBkEwaiAJQTBqKQMANwMAIAZBKGogCUEoaikDADcDACAGQSBqIAlBIGopAwA3AwAgBkEYaiAJQRhqKQMANwMAIAZBEGogCUEQaikDADcDACAIIAlBCGopAwA3AwAgBiAJKQMANwMAIAlBwABBCBC9EwwCCyADIAEQ0QQMAQsgAyABEPwCCyADQShqIQMgB0FYaiIHDQALCyAEQdgAaiIEIAVHDQALCwJAIAAoApgBIgNFDQAgACgClAEiByADQShsaiEJA0ACQAJAAkACQAJAIAcoAgAOBQQAAQIDBAsgBygCBEEBRw0DIAEgBygCCCIDENMDIAMgARBRIAEoAgBFDQMgAygCAEEaRw0DIAEgA0EIaiIGEMMFIgRFDQMgAxDkASADQThqIARBOGopAwA3AwAgA0EwaiAEQTBqKQMANwMAIANBKGogBEEoaikDADcDACADQSBqIARBIGopAwA3AwAgA0EYaiAEQRhqKQMANwMAIANBEGogBEEQaikDADcDACAGIARBCGopAwA3AwAgAyAEKQMANwMAIARBwABBCBC9EwwDCyABIAcoAgQiAxDTAyADIAEQUSABKAIARQ0CIAMoAgBBGkcNAiABIANBCGoiBhDDBSIERQ0CIAMQ5AEgA0E4aiAEQThqKQMANwMAIANBMGogBEEwaikDADcDACADQShqIARBKGopAwA3AwAgA0EgaiAEQSBqKQMANwMAIANBGGogBEEYaikDADcDACADQRBqIARBEGopAwA3AwAgBiAEQQhqKQMANwMAIAMgBCkDADcDACAEQcAAQQgQvRMMAgsgBygCBCIDQcAAaiABEIwDIANBkAFqIAEQ/AIgAy0APCIEQQZGDQECQAJAIARBBEYNACAEQX1qQQNJDQELIANBKGohBgJAIARBAkcNACAGIAEQqBwLIAEoAgBFDQIgASAGEN8FCyABKAIARQ0BIAMtADxBA0cNASACIAEgA0EQaiIDEPkFIAItACxBBkYNASADEM8RIANBKGogAkEoaikDADcDACADQSBq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BwwFCyABKAIwEJcTIQMgAkGIAWpBNGogAUE0aigCADYCACACQZABakEAKQOY/5wBIgg3AwAgAkGYAWpBACkDkP+cASIJNwMAIAJBoAFqIAg3AwAgAiABNgKoASACIAM2AqwBIAJBADoAsAEgAiABKQIsNwK0ASACIAk3A4gBIAIgASgBOjYBwgEgAiABLQA4OgDAASACQQA6AMEBAkAgACgCBCIBQQJGDQACQCABQQFxRQ0AIAJBAToAwQEgACgCCCACQYgBahBtDAELIAJBiAFqIAAoAggQ2woLIAJBAToAwQECQCAAKAIYIgFFDQAgASACQYgBahBtCyACQQE6AMEBAkAgACgCHCIBRQ0AIAEgAkGIAWoQbSACQQE6AMEBCyACIAAoAgw2AugBIAJBiAFqIAJB6AFqEL8HAkAgAigCjAEiAUUNACACKAKIASACKAKUARDaDCABIAFBBHRBF2pBcHEiAGpBCWoiAUUNACACKAKIASAAayABQQgQvRMLIAJBmAFqENYXDAQLIAEoAjAQlxMhAyACQYgBakE0aiABQTRqKAIANgIAIAJBADoAsAEgAkGQAWpBACkDmP+cASIINwMAIAJBmAFqQQApA5D/nAEiCTcDACACQaABaiAINwMAIAIgATYCqAEgAiADNgKsASACQQE6AMEBIAIgASkCLDcCtAEgAiABKAE6NgHCASACIAEtADg6AMABIAIgCTcDiAECQAJAAkACQCAAKAIEDgMAAQIACyACQYgBaiAAKAIIENsKDAILIAJBiAFqIAAoAggQzAsMAQsgACgCCCACQYgBahCaBAsgACgCDCEBIAItAMEBIQMgAkEBOgDBASABIAJBiAFqEG0gAiADOgDBASACIAAoAhA2AugBIAJBiAFqIAJB6AFqEL8HAkAgAigCjAEiAUUNACACKAKIASACKAKUARDaDCABIAFBBHRBF2pBcHEiAGpBCWoiAUUNACACKAKIASAAayABQQgQvRMLIAJBmAFqENYXDAMLIAEoAjAQlxMhAyACQYgBakE0aiABQTRqKAIANgIAIAJBADoAsAEgAkGQAWpBACkDmP+cASIINwMAIAJBmAFqQQApA5D/nAEiCTcDACACQaABaiAINwMAIAIgATYCqAEgAiADNgKsASACQQE6AMEBIAIgASkCLDcCtAEgAiABKAE6NgHCASAC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QSBqIAJBCGpBIGopAwA3AwAgA0EYaiACQQhqQRhqKQMANwMAIANBEGogAkEIakEQaikDADcDACADQQhqIAJBCGpBCGopAwA3AwAgAyACKQMINwMAIApBWGohCiADQShqIQMgBEEoaiEEIAtBf2oiCw0ACwsCQAJAIAEoAhAiBA0AQQAhAwwBC0EALQDg9p0BGkEMEIQBIgNFDQNBAC0A4PadARogBCgCCCELIAQoAgQhBUHgABCEASIKRQ0DIAogBCgCABBlIAMgCzYCCCADIAU2AgQgAyAKNgIACyAAIAM2AhAgACAHNgIMIAAgCTYCCCAAIAg2AgQgAEEKNgIAIAAgAS8BHDsBHCAAIAEpAhQ3AhQLIAJBMGokAA8LIAggAigCEEGIpJoBENggCwALIAggAigCEEGIpJoBENggAAsgCCACKAIQQYikmgEQ2CAACyAIIAIoAhBBiKSaARDYIAALuBICC38BfiMAQYADayICJAACQAJAAkACQAJAAkACQCAAKAIADggABQQDBgYCAQALAkAgACgCICIDQQhqKAIAIgBFDQAgA0EEaigCACEEIABBDGwhBQNAAkACQCAEKAIAIgAoAgBBGkcNACACQcAAaiABKAIAIAEoAgQgAEEIaiIGEIINIAIoAkBBMkYNASAAENEBIABBOGogAkHAAGpBOGopAwA3AwAgAEEwaiACQcAAakEwaikDADcDACAAQShqIAJBwABqQShqKQMANwMAIABBIGogAkHAAGpBIGopAwA3AwAgAEEYaiACQcAAakEYaikDADcDACAAQRBqIAJBwABqQRBqKQMANwMAIAYgAkHAAGpBCGopAwA3AwAgACACKQNANwMADAELIAAgARBGCyAEQQxqIQQgBUF0aiIFDQALCwJAIANBFGooAgAiBEUNACADQRBqKAIAIQAgBEHYAGwhBANAIAAgARBpIABB2ABqIQAgBEGof2oiBA0ACwsgAygCMCIARQ0FAkAgACgCAEEaRw0AIAIgASgCACABKAIEIABBCGoiBBCCDSACKAIAQTJGDQYgABDRASAAQThqIAJBOGopAwA3AwAgAEEwaiACQTBqKQMANwMAIABBKGogAkEoaikDADcDACAAQSBqIAJBIGopAwA3AwAgAEEYaiACQRhqKQMANwMAIABBEGogAkEQaikDADcDACAEIAJBCGopAwA3AwAgACACKQMANwMADAYLIAAgARBGDAULIAAoAgQiAC0ARSIEQQNGDQQCQCAEQQJGDQACQCAAKAJAIgAtACVBAkYNACAAQSBqIAEQrhEMBgsgAEEIaigCACIERQ0FIABBBGooAgAhACAEQThsIQQDQAJAAkAgACgCAEEJRw0AIABBCGogARBwDAELIAAgARCuAgsgAEE4aiEAIARBSGoiBA0ADAYLCyAAQShqKAIAIgRFDQQgAEEkaigCACEAIARBOGwhBANAAkACQCAAKAIAQQlHDQAgAEEIaiABEHAMAQsgACABEK4CCyAAQThqIQAgBEFIaiIEDQAMBQsLIAAoAgQiAEEoaigCACIERQ0DIARBMGwhBSAAQSRqKAIAQShqIQQDQAJAIAQoAgAiAEUNAAJAIAAoAgBBGkcNACACQcACaiABKAIAIAEoAgQgAEEIaiIGEIINIAIoAsACQTJGDQEgABDRASAAQThqIAJBwAJqQThqKQMANwMAIABBMGogAkHAAmpBMGopAwA3AwAgAEEoaiACQcACakEoaikDADcDACAAQSBqIAJBwAJqQSBqKQMANwMAIABBGGogAkHAAmpBGGopAwA3AwAgAEEQaiACQcACakEQaikDADcDACAGIAJBwAJqQQhqKQMANwMAIAAgAikDwAI3AwAMAQsgACABEEYLIARBMGohBCAFQVBqIgUNAAwECwsgACgCBCIAQQhqKAIAIgRFDQIgAEEEaigCACIAIARBOGxqIQUDQCAAIAEQqgMCQCAAQTBqKAIAIgRFDQACQCAEKAIAQRpHDQAgAkGAAmogASgCACABKAIEIARBCGoiBhCCDSACKAKAAkEyRg0BIAQQ0QEgBEE4aiACQYACakE4aikDADcDACAEQTBqIAJBgAJqQTBqKQMANwMAIARBKGogAkGAAmpBKGopAwA3AwAgBEEgaiACQYACakEgaikDADcDACAEQRhqIAJBgAJqQRhqKQMANwMAIARBEGogAkGAAmpBEGopAwA3AwAgBiACQYACakEIaikDADcDACAEIAIpA4ACNwMADAELIAQgARBGCyAAQThqIgAgBUcNAAwDCwsgACgCBCIAQQhqKAIAIgRFDQEgAEEEaigCACIAIARBOGxqIQUDQCAAIAEQqgMCQCAAQTBqKAIAIgRFDQACQCAEKAIAQRpHDQAgAkHAAWogASgCACABKAIEIARBCGoiBhCCDSACKALAAUEyRg0BIAQQ0QEgBEE4aiACQcABakE4aikDADcDACAEQTBqIAJBwAFqQTBqKQMANwMAIARBKGogAkHAAWpBKGopAwA3AwAgBEEgaiACQcABakEgaikDADcDACAEQRhqIAJBwAFqQRhqKQMANwMAIARBEGogAkHAAWpBEGopAwA3AwAgBiACQcABakEIaikDADcDACAEIAIpA8ABNwMADAELIAQgARBGCyAAQThqIgAgBUcNAAwCCwsCQCAAKAIgIgdBCGooAgAiAEUNACAHQQRqKAIAIgggAEEGdGohCQNAAkAgCEE4aigCACIARQ0AIAhBNGooAgAhBCAAQQxsIQUDQAJAAkAgBCgCACIAKAIAQRpHDQAgASgCAEEBRw0BIAEoAgQiAyAAKAIYRw0BAkACQCAAKQMIIg1CA4NCAFINACANpyIGIAYoAgAiBkEBajYCACAGQX9MDQELQQAtAOD2nQEaIAAoAhQhCiAAKAIQIQsgAC0AHCEMQcAAEIQBIgZFDQAgBiAMOgAcIAYgAzYCGCAGQgA3AxAgBiANNwMIIAZBGjYCACAAENEBIAAgBjYCKCAAIAo2AiQgACALNgIgIABCADcDGCAAQpG+ATcDECAAQQA2AgggAEEUNgIADAILAAsgACABEEYLIARBDGohBCAFQXRqIgUNAAsLIAggARCbBCAIQcAAaiIAIQggACAJRw0ACwsCQCAHQRRqKAIAIgBFDQAgB0EQaigCACEEIABBDGwhBQNAAkACQCAEKAIAIgAoAgBBGkcNACACQYABaiABKAIAIAEoAgQgAEEIaiIGEIINIAIoAoABQTJGDQEgABDRASAAQThqIAJBgAFqQThqKQMANwMAIABBMGogAkGAAWpBMGopAwA3AwAgAEEoaiACQYABakEoaikDADcDACAAQSBqIAJBgAFqQSBqKQMANwMAIABBGGogAkGAAWpBGGopAwA3AwAgAEEQaiACQYABakEQaikDADcDACAGIAJBgAFqQQhqKQMANwMAIAAgAikDgAE3AwAMAQsgACABEEYLIARBDGohBCAFQXRqIgUNAAsLIAcoAhhBgICAgHhGDQAgB0EgaigCACIERQ0AIAdBHGooAgAhACAEQTBsIQQDQCAAIAEQcCAAQTBqIQAgBEFQaiIEDQALCyACQYADaiQAC8MSAhJ/A34jAEHAAGsiAiQAAkADQAJAAkACQAJAIAEoAgBBZ2oOCwABAQEBAQEBAQECAQsgASgCDEEBRg0CCyACQcAAaiQADwsCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABKAIEIgMoAgBBdGoiBEEHIARBJkkbDiYAAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJQALIANBCGohBCADQQRqIQMMLAsgA0EUaiEEIANBEGohAwwrCyADQRRqIQQgA0EQaiEDDCoLIAMoAiAiA0E0aiEEIANBMGohAwwpCyADQQxqIQQgA0EIaiEDDCgLIANBCGohBCADQQRqIQMMJwsgA0EQaiEEIANBDGohAwwmCyADQTRqIQQgA0EwaiEDDCULIANBJGohBCADQSBqIQMMJAsgA0EkaiEEIANBIGohAwwjCyADQRRqIQQgA0EQaiEDDCILIANBIGohBCADQRxqIQMMIQsgA0EYaiEEIANBFGohAwwgCyADQRRqIQQgA0EQaiEDDB8LIANBFGohBCADQRBqIQMMHgsgAygCCA4HFhcYGRobHBYLIANBIGohBCADQRxqIQMMHAsgA0EQaiEEIANBDGohAwwbCyADQRhqIQQgA0EUaiEDDBoLIAMoAiAiA0EoaiEEIANBJGohAwwZCyADQQhqIQQgA0EEaiEDDBgLIANBCGohBCADQQRqIQMMFwsgA0EMaiEEIANBCGohAwwWCyADQQxqIQQgA0EIaiEDDBULIANBHGohBCADQRhqIQMMFAsgA0EsaiEEIANBKGohAwwTCyADQQhqIQQgA0EEaiEDDBILIAMoAgQiA0EEaiEEDBELIANBFGohBCADQRBqIQMMEAsgA0EQaiEEIANBDGohAwwPCyADQQxqIQQgA0EIaiEDDA4LIANBDGohBCADQQhqIQMMDQsgA0EQaiEEIANBDGohAwwMCyADQRBqIQQgA0EMaiEDDAsLIANBEGohBCADQQxqIQMMCgsgA0EUaiEEIANBEGohAwwJCyADQQxqIQQgA0EIaiEDDAgLIANBCGohBCADQQRqIQMMBwsgA0EcaiEEIANBGGohAwwGCyADQRBqIQQgA0EMaiEDDAULIANBEGohBCADQQxqIQMMBAsgA0EUaiEEIANBEGohAwwDCyADQRRqIQQgA0EQaiEDDAILIANBJGohBCADQSBqIQMMAQsgA0EkaiEEIANBIGohAwtBAC0A4PadARogASgCDCEFIAEoAgghBiAEKAIAIQcgAygCACEIQcAAEIQBIgRFDQIgBEEANgIIIARCMTcDACABKAIEIQMgASAENgIEIAJBCGoiBCADQQhqKQMANwMAIAJBEGoiCSADQRBqKQMANwMAIAJBGGoiCiADQRhqKQMANwMAIAJBIGoiCyADQSBqKQMANwMAIAJBKGoiDCADQShqKQMANwMAIAJBMGoiDSADQTBqKQMANwMAIAJBOGoiDiADQThqKQMANwMAIAIgAykDADcDACABENEBIAFBOGogDikDADcDACABQTBqIA0pAwA3AwAgAUEoaiAMKQMANwMAIAFBIGogCykDADcDACABQRhqIAopAwA3AwAgAUEQaiAJKQMANwMAIAFBCGogBCkDADcDACABIAIpAwA3AwAgA0HAAEEIEL0TIAhB3cvdnnlsIAdqQd3L3Z55bEEPdyEJIAAoAgghDCAAKAIEIQ0CQCAAKAIUDQAgAEEMaiANIAwQigQaCyAAKAIMIgpBfGohDiAAKAIQIgsgCXEhBCAJQRl2Ig+tQoGChIiQoMCAAX4hFEEAIRBBACERAkACQAJAAkADQCAKIARqKQAAIhUgFIUiFkJ/hSAWQv/9+/fv37//fnyDQoCBgoSIkKDAgH+DIRYCQANAIBZQDQEgDiAWeqdBA3YgBGogC3FBAnRrKAIAIgMgDE8NAyAWQn98IBaDIRYgCCANIANBFGxqIhIoAgBHDQAgByASQQRqKAIARw0ACyADIAAoAggiBE8NAyAAKAIEIANBFGxqIgMgBTYCDCADIAY2AggMBwsgFUKAgYKEiJCgwIB/gyEWAkACQAJAAkAgEUUNAEEBIREMAQsgFkIAUiERIBZ6p0EDdiAEaiALcSETIBZQDQELIBYgFUIBhoNCAFINAQsgBCAQQQhqIhBqIAtxIQQMAQsLAkAgCiATaiwAACIDQQBIDQAgCiAKKQMAQoCBgoSIkKDAgH+DeqdBA3YiE2otAAAhAwsgACgCCCEEIAogE2ogDzoAACAKIAsgE0F4anFqQQhqIA86AAAgCiATQQJ0a0F8aiAENgIAIAAgACgCFCADQQFxazYCFCAAIAAoAhhBAWo2AhggACgCCCIDIAAoAgBHDQMgACgCGCAAKAIUaiIEQebMmTMgBEHmzJkzSRsgA2siBEEBTQ0CIAAgAyAEQQRBFBD0CyEEIAAoAgghAyAEQYGAgIB4Rw0CDAMLIAMgDEGspZoBEMMSAAsgAyAEQYSnmgEQwxIACyAAIANBAUEEQRQQuAsgACgCCCEDCwJAIAMgACgCAEcNACAAEIYZCyAAIANBAWo2AgggACgCBCADQRRsaiIDIAk2AhAgAyAFNgIMIAMgBjYCCCADIAc2AgQgAyAINgIADAELQQAtAOD2nQEaIAEoAgghCUHAABCEASIERQ0BIARBADYCCCAEQjE3AwAgCSgCACEDIAkgBDYCACACQQhqIgQgA0EIaikDADcDACACQRBqIgkgA0EQaikDADcDACACQRhqIgggA0EYaikDADcDACACQSBqIgcgA0EgaikDADcDACACQShqIgogA0EoaikDADcDACACQTBqIgsgA0EwaikDADcDACACQThqIgUgA0E4aikDADcDACACIAMpAwA3AwAgARDRASABQThqIAUpAwA3AwAgAUEwaiALKQMANwMAIAFBKGogCikDADcDACABQSBqIAcpAwA3AwAgAUEYaiAIKQMANwMAIAFBEGogCSkDADcDACABQQhqIAQpAwA3AwAgASACKQMANwMAIANBwABBCBC9EwwACwsAC7gSAQx/IwBBEGsiAiQAAkAgAC0AbEECRw0AIABBwABqIQMDQCADKAIYIgMtACxBAkYNAAsLAkAgACgChAEiA0UNACAAKAKAASIEIANB2ABsaiEFA0ACQAJAIAQoAgAiA0EFRw0AIAEtACQhBiABQQI6ACQgAS0AJSEDIAEgBCgCBCIHEM4BIAcgARBTIAEgAzoAJSABQQI6ACQgASAHEJ0BIAEgAzoAJSABIAY6ACQMAQsgA0EERg0AAkACQAJAAkACQCADDgQFAAECBQsgBCgCBEEBRw0EIAQoAgghAyABLQAkIgcNAyADKAIAQXRqIgZBByAGQSZJG0F7aiIGQR9LDQJBASAGdEGuooCAeHENAyAGDQIgAy0AEQ0CDAMLAkAgBCgCBCIILQBsQQJHDQAgCEHAAGoh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IQYgAEIBNwMAIAJBKGogAEEoaikDADcDACACQSBqIABBIGopAwA3AwAgAkEYaiAAQRhqKQMANwMAIAJBEGogAEEQaikDADcDACACQQhqIABBCGoiASkDADcDACABQQA2AgAgAiAGNwMAIAIQ6QMMEgsgACgCDCIARQ0RIAEgABDdCAwRCyAAQQA6ACQgACgCKCIAEMALDQ8gACgCAEEBRg0QIAApAwAhBiAAQgE3AwAgAkEoaiAAQShqKQMANwMAIAJBIGogAEEgaikDADcDACACQRhqIABBGGopAwA3AwAgAkEQaiAAQRBqKQMANwMAIAJBCGogAEEIaiIBKQMANwMAIAFBADYCACACIAY3AwAgAhDpAwwQCyAALQAkQQJGDQ8gAEEAOgAkDA8LIAAtACRBAkYNDiAAQQA6ACQMDgsgASAAKAIEEN0IIAAoAggiAxDACw0KIAMoAgBBAUYNCyADKQMAIQYgA0IBNwMAIAJBKGogA0EoaikDADcDACACQSBqIANBIGopAwA3AwAgAkEYaiADQRhqKQMANwMAIAJBEGogA0EQaikDADcDACACQQhqIANBCGoiAykDADcDACADQQA2AgAgAiAGNwMAIAIQ6QMMCwsgASAAKAIQEN0IIAAoAgwiA0UNDCAAKAIIIQAgA0EYbCEDA0ACQCAAQRRqKAIAIgRFDQAgASAEEN0ICyAAIAEQlQYgAEEYaiEAIANBaGoiAw0ADA0LCyABIAAoAgQQ3QgMCwsgASAAKAIEIgBByABqEJQGIABB4ABqIQMCQCAAKAIAIgRBCEYNACAAQShqIQUCQCAEQQdGDQAgACABEOwFCyABIAUQlAYLIAMoAgBBgICAgHhGDQogAyABEJUGDAoLIAEgACgCBBDdCCAAKAIIIgAQwAsNCCAAKAIAQQFGDQkgACkDACEGIABCATcDACACQShqIABBKGopAwA3AwAgAkEgaiAAQSBqKQMANwMAIAJBGGogAEEYaikDADcDACACQRBqIABBEGopAwA3AwAgAkEIaiAAQQhqIgEpAwA3AwAgAUEANgIAIAIgBjcDACACEOkDDAkLIAEgACgCBBDdCCAAKAIIIgAQwAsNByAAKAIAQQFGDQggACkDACEGIABCATcDACACQShqIABBKGopAwA3AwAgAkEgaiAAQSBqKQMANwMAIAJBGGogAEEYaikDADcDACACQRBqIABBEGopAwA3AwAgAkEIaiAAQQhqIgEpAwA3AwAgAUEANgIAIAIgBjcDACACEOkDDAgLAkAgACgCBCIDQQJGDQACQCADQQFxRQ0AIAEgACgCCBDdCAwBCyAAKAIIIgMoAggiBEUNACADKAIEIgMgBEE4bGohBQNAIAMgARDsBQJAIANBMGooAgAiBEUNACABIAQQ3QgLIANBOGoiAyAFRw0ACwsCQCAAKAIYIgNFDQAgASADEN0ICwJAIAAoAhwiA0UNACABIAMQ3QgLIAAoAgwiABDACw0GIAAoAgBBAUYNByAAKQMAIQYgAEIBNwMAIAJBKGogAEEoaikDADcDACACQSBqIABBIGopAwA3AwAgAkEYaiAAQRhqKQMANwMAIAJBEGogAEEQaikDADcDACACQQhqIABBCGoiASkDADcDACABQQA2AgAgAiAGNwMAIAIQ6QMMBwsCQAJAAkACQCAAKAIEDgMAAQIACyAAKAIIIgMoAggiBEUNAiADKAIEIgMgBEE4bGohBQNAIAMgARDsBQJAIANBMGooAgAiBEUNACABIAQQ3QgLIANBOGoiAyAFRw0ADAMLCyAAKAIIIgMoAggiBEUNASADKAIEIgMgBEE4bGohBQNAIAMgARDsBQJAIANBMGooAgAiBEUNACABIAQQ3QgLIANBOGoiAyAFRw0ADAILCyAAKAIIIAEQ7AULIAEgACgCDBDdCCAAKAIQIgAQwAsNBSAAKAIAQQFGDQYgACkDACEGIABCATcDACACQShqIABBKGopAwA3AwAgAkEgaiAAQSBqKQMANwMAIAJBGGogAEEYaikDADcDACACQRBqIABBEGopAwA3AwAgAkEIaiAAQQhqIgEpAwA3AwAgAUEANgIAIAIgBjcDACACEOkDDAYLAkACQAJAAkAgACgCBA4DAAECAAsgACgCCCIDKAIIIgRFDQIgAygCBCIDIARBOGxqIQUDQCADIAEQ7AUCQCADQTBqKAIAIgRFDQAgASAEEN0ICyADQThqIgMgBUcNAAwDCwsgACgCCCIDKAIIIgRFDQEgAygCBCIDIARBOGxqIQUDQCADIAEQ7AUCQCADQTBqKAIAIgRFDQAgASAEEN0ICyADQThqIgMgBUcNAAwCCwsgACgCCCABEOwFCyABIAAoAgwQ3QggACgCECIAEMALDQQgACgCAEEBRg0FIAApAwAhBiAAQgE3AwAgAkEoaiAAQShqKQMANwMAIAJBIGogAEEgaikDADcDACACQRhqIABBGGopAwA3AwAgAkEQaiAAQRBqKQMANwMAIAJBCGogAEEIaiIBKQMANwMAIAFBADYCACACIAY3AwAgAhDpAwwFCyAAQQhqIAEQ1QIMBAsgASAAKAIEEN0IDAMLIAMgARDTAQsgACgCFCIARQ0BIAAQwAsNAAsgACgCAEEBRg0AIAApAwAhBiAAQgE3AwAgAkEoaiAAQShqKQMANwMAIAJBIGogAEEgaikDADcDACACQRhqIABBGGopAwA3AwAgAkEQaiAAQRBqKQMANwMAIAJBCGogAEEIaiIBKQMANwMAIAFBADYCACACIAY3AwAgAhDpAwsgAkEwaiQAC/MQAQh/AkACQCAAKAIAIgINAAJAAkACQAJAAkACQCAAKAIEIgMoAgAiAEF7aiICQQQgAkEGSRsOBgUAAQIDBAULAkAgAygCCEEDRw0AIAEgAygCDCICENMDIAIgARBRIAEoAgBFDQAgAigCAEEaRw0AIAEgAkEIaiIEEMMFIgBFDQAgAhDkASACQThqIABBOGopAwA3AwAgAkEwaiAAQTBqKQMANwMAIAJBKGogAEEoaikDADcDACACQSBqIABBIGopAwA3AwAgAkEYaiAAQRhqKQMANwMAIAJBEGogAEEQaikDADcDACAEIABBCGopAwA3AwAgAiAAKQMANwMAIABBwABBCBC9EwsgASADKAIoIgIQ0wMgAiABEFEgASgCAEUNBiACKAIAQRpHDQQgASACQQhqIgQQwwUiAEUNBCACEOQBIAJBOGogAEE4aikDADcDACACQTBqIABBMGopAwA3AwAgAkEoaiAAQShqKQMANwMAIAJBIGogAEEgaikDADcDACACQRhqIABBGGopAwA3AwAgAkEQaiAAQRBqKQMANwMAIAQgAEEIaikDADcDACACIAApAwA3AwAgAEHAAEEIEL0TDAQLIAEgAygCKCICENMDIAIgARBRIAEoAgBFDQUgAigCAEEaRw0DIAEgAkEIaiIEEMMFIgBFDQMgAhDkASACQThqIABBOGopAwA3AwAgAkEwaiAAQTBqKQMANwMAIAJBKGogAEEoaikDADcDACACQSBqIABBIGopAwA3AwAgAkEYaiAAQRhqKQMANwMAIAJBEGogAEEQaikDADcDACAEIABBCGopAwA3AwAgAiAAKQMANwMAIABBwABBCBC9EwwDCyADQShqIQICQCADKAIIQQNHDQAgASADKAIMIgAQ0wMgACABEFEgASgCAEUNACAAKAIAQRpHDQAgASAAQQhqIgUQwwUiBEUNACAAEOQBIABBOGogBEE4aikDADcDACAAQTBqIARBMGopAwA3AwAgAEEoaiAEQShqKQMANwMAIABBIGogBEEgaikDADcDACAAQRhqIARBGGopAwA3AwAgAEEQaiAEQRBqKQMANwMAIAUgBEEIaikDADcDACAAIAQpAwA3AwAgBEHAAEEIEL0TCyACKAIAQYCAgIB4Rg0CIAEgAhDkBAwCCyADQSBqIQICQCAAQQNHDQAgASADKAIEIgAQ0wMgACABEFEgASgCAEUNACAAKAIAQRpHDQAgASAAQQhqIgUQwwUiBEUNACAAEOQBIABBOGogBEE4aikDADcDACAAQTBqIARBMGopAwA3AwAgAEEoaiAEQShqKQMANwMAIABBIGogBEEgaikDADcDACAAQRhqIARBGGopAwA3AwAgAEEQaiAEQRBqKQMANwMAIAUgBEEIaikDADcDACAAIAQpAwA3AwAgBEHAAEEIEL0TCwJAIAIoAgBBB0YNACACIAEQhgQgASgCAEUNACABIAIQwwgLIANByABqIQIgAygCaCIAIAEQhgQCQCABKAIARQ0AIAEgABDDCAsgAigCAEGAgICAeEYNASABIAIQ5AQMAQsCQCADKAIIQQNHDQAgASADKAIMIgIQ0wMgAiABEFEgASgCAEUNACACKAIAQRpHDQAgASACQQhqIgQQwwUiAEUNACACEOQBIAJBOGogAEE4aikDADcDACACQTBqIABBMGopAwA3AwAgAkEoaiAAQShqKQMANwMAIAJBIGogAEEgaikDADcDACACQRhqIABBGGopAwA3AwAgAkEQaiAAQRBqKQMANwMAIAQgAEEIaikDADcDACACIAApAwA3AwAgAEHAAEEIEL0TCwJAIAMoAigiBkEIaigCACICRQ0AIAZBBGooAgAiByACQQZ0aiEIA0ACQCAHKAI4IgJFDQAgBygCNCEAIAJBDGwhBQNAIAEgACgCACICENMDIAIgARBRAkAgASgCAEUNACACKAIAQRpHDQAgASACQQhqIgkQwwUiBEUNACACEOQBIAJBOGogBEE4aikDADcDACACQTBqIARBMGopAwA3AwAgAkEoaiAEQShqKQMANwMAIAJBIGogBEEgaikDADcDACACQRhqIARBGGopAwA3AwAgAkEQaiAEQRBqKQMANwMAIAkgBEEIaikDADcDACACIAQpAwA3AwAgBEHAAEEIEL0TCyAAQQxqIQAgBUF0aiIFDQALCyAHIAEQhgQCQCABKAIARQ0AIAEgBxDDCAsgB0HAAGoiByAIRw0ACwsgBkEYaiEHAkAgBkEUaigCACICRQ0AIAZBEGooAgAhACACQQxsIQUDQCABIAAoAgAiAhDTAyACIAEQUQJAIAEoAgBFDQAgAigCAEEaRw0AIAEgAkEIaiIJEMMFIgRFDQAgAhDkASACQThqIARBOGopAwA3AwAgAkEwaiAEQTBqKQMANwMAIAJBKGogBEEoaikDADcDACACQSBqIARBIGopAwA3AwAgAkEYaiAEQRhqKQMANwMAIAJBEGogBEEQaikDADcDACAJIARBCGopAwA3AwAgAiAEKQMANwMAIARBwABBCBC9EwsgAEEMaiEAIAVBdGoiBQ0ACwsgBygCAEGAgICAeEYNACABIAcQ5AQLIAEoAgBFDQEgASADELILDwsgASACENMDIAIgARBRIAEoAgBFDQAgAigCAEEaRw0AIAEgAkEIaiIAEMMFIgFFDQAgAhDkASACQThqIAFBOGopAwA3AwAgAkEwaiABQTBqKQMANwMAIAJBKGogAUEoaikDADcDACACQSBqIAFBIGopAwA3AwAgAkEYaiABQRhqKQMANwMAIAJBEGogAUEQaikDADcDACAAIAFBCGopAwA3AwAgAiABKQMANwMAIAFBwABBCBC9EwsL6RABBX8jAEHAAmsiAiQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgAiAw0AAkACQAJAAkACQCAAKAIEIgMoAgAiBEF7aiIAQQQgAEEGSRsOBhAAAQIDBBALIAMoAghBA0cNDiADKAIMIgAoAgBBGkcNBSACQYACaiABKAIAIAEoAgQgAEEIaiIEEIINIAIoAoACQTJGDQ4gABDRASAAQThqIAJBgAJqQThqKQMANwMAIABBMGogAkGAAmpBMGopAwA3AwAgAEEoaiACQYACakEoaikDADcDACAAQSBqIAJBgAJqQSBqKQMANwMAIABBGGogAkGAAmpBGGopAwA3AwAgAEEQaiACQYACakEQaikDADcDACAEIAJBgAJqQQhqKQMANwMAIAAgAikDgAI3AwAMDgsgAygCKCIDKAIAQRpHDQUgAkHAAGogASgCACABKAIEIANBCGoiARCCDSACKAJAQTJGDQ4gAxDRASADQThqIAJBwABqQThqKQMANwMAIANBMGogAkHAAGpBMGopAwA3AwAgA0EoaiACQcAAakEoaikDADcDACADQSBqIAJBwABqQSBqKQMANwMAIANBGGogAkHAAGpBGGopAwA3AwAgA0EQaiACQcAAakEQaikDADcDACABIAJBwABqQQhqKQMANwMAIAMgAikDQDcDAAwOCyADKAIIQQNHDQsgAygCDCIAKAIAQRpHDQUgAkGAAmogASgCACABKAIEIABBCGoiBBCCDSACKAKAAkEyRg0LIAAQ0QEgAEE4aiACQYACakE4aikDADcDACAAQTBqIAJBgAJqQTBqKQMANwMAIABBKGogAkGAAmpBKGopAwA3AwAgAEEgaiACQYACakEgaikDADcDACAAQRhqIAJBgAJqQRhqKQMANwMAIABBEGogAkGAAmpBEGopAwA3AwAgBCACQYACakEIaikDADcDACAAIAIpA4ACNwMADAsLIANBIGohACAEQQNHDQkgAygCBCIEKAIAQRpHDQUgAkGAAmogASgCACABKAIEIARBCGoiBRCCDSACKAKAAkEyRg0JIAQQ0QEgBEE4aiACQYACakE4aikDADcDACAEQTBqIAJBgAJqQTBqKQMANwMAIARBKGogAkGAAmpBKGopAwA3AwAgBEEgaiACQYACakEgaikDADcDACAEQRhqIAJBgAJqQRhqKQMANwMAIARBEGogAkGAAmpBEGopAwA3AwAgBSACQYACakEIaikDADcDACAEIAIpA4ACNwMADAkLIAMoAghBA0cNByADKAIMIgAoAgBBGkcNBSACQYACaiABKAIAIAEoAgQgAEEIaiIEEIINIAIoAoACQTJGDQcgABDRASAAQThqIAJBgAJqQThqKQMANwMAIABBMGogAkGAAmpBMGopAwA3AwAgAEEoaiACQYACakEoaikDADcDACAAQSBqIAJBgAJqQSBqKQMANwMAIABBGGogAkGAAmpBGGopAwA3AwAgAEEQaiACQYACakEQaikDADcDACAEIAJBgAJqQQhqKQMANwMAIAAgAikDgAI3AwAMBwsgAygCAEEaRw0FIAIgASgCACABKAIEIANBCGoiARCCDSACKAIAQTJGDQogAxDRASADQThqIAJBOGopAwA3AwAgA0EwaiACQTBqKQMANwMAIANBKGogAkEoaikDADcDACADQSBqIAJBIGopAwA3AwAgA0EYaiACQRhqKQMANwMAIANBEGogAkEQaikDADcDACABIAJBCGopAwA3AwAgAyACKQMANwMADAoLIAAgARBGDAgLIAMgARBGDAgLIAAgARBGDAULIAQgARBGDAMLIAAgARBGDAELIAMgARBGDAQLIAMoAigiBiABEJsJAkAgBkEUaigCACIDRQ0AIAZBEGooAgAhACADQQxsIQQDQAJAAkAgACgCACIDKAIAQRpHDQAgAkHAAWogASgCACABKAIEIANBCGoiBRCCDSACKALAAUEyRg0BIAMQ0QEgA0E4aiACQcABakE4aikDADcDACADQTBqIAJBwAFqQTBqKQMANwMAIANBKGogAkHAAWpBKGopAwA3AwAgA0EgaiACQcABakEgaikDADcDACADQRhqIAJBwAFqQRhqKQMANwMAIANBEGogAkHAAWpBEGopAwA3AwAgBSACQcABakEIaikDADcDACADIAIpA8ABNwMADAELIAMgARBGCyAAQQxqIQAgBEF0aiIEDQALCyAGKAIYQYCAgIB4Rg0DIAZBIGooAgAiAEUNAyAGQRxqKAIAIQMgAEEwbCEAA0AgAyABEHAgA0EwaiEDIABBUGoiAA0ADAQLCwJAIAAoAgBBB0YNACAAIAEQqgMLIAMoAmggARCqAyADKAJIQYCAgIB4Rg0CIANB0ABqKAIAIgBFDQIgA0HMAGooAgAhAyAAQTBsIQADQCADIAEQcCADQTBqIQMgAEFQaiIADQAMAwsLIAMoAihBgICAgHhGDQEgA0EwaigCACIARQ0BIANBLGooAgAhAyAAQTBsIQADQCADIAEQcCADQTBqIQMgAEFQaiIADQAMAgsLAkAgAygCKCIDKAIAQRpHDQAgAkGAAWogASgCACABKAIEIANBCGoiARCCDSACKAKAAUEyRg0BIAMQ0QEgA0E4aiACQYABakE4aikDADcDACADQTBqIAJBgAFqQTBqKQMANwMAIANBKGogAkGAAWpBKGopAwA3AwAgA0EgaiACQYABakEgaikDADcDACADQRhqIAJBgAFqQRhqKQMANwMAIANBEGogAkGAAWpBEGopAwA3AwAgASACQYABakEIaikDADcDACADIAIpA4ABNwMADAELIAMgARBGCyACQcACaiQAC9AQAgp/AX4jAEGQAWsiAiQAAkACQAJAIAEoAgAiA0EJRw0AIAAgAUEIahB3IAEoAgBBAUYNAQwCCwJAAkACQAJAAkACQAJAAkAgAw4JAAECAwQFCQYJAAsgASgCHCIBRQ0IIAFBCGooAgAiA0UNCCABQQRqKAIAIQEgA0EMbCEDA0AgASAAENQBIAFBDGohASADQXRqIgMNAAwJCwsgACgCAEUNBSABKAIIQQJHDQUgASgCDCIDKAIIIgRFDQYgAygCBCIFIARBOGxqIQYDQAJAAkACQAJAAkACQAJAIAUoAgAOBwUAAQIDBQQFCyAFQQxqKAIAIgRFDQQgBUEIaigCACEDIARBKGwhBANAAkAgAygCAEEHRg0AIAMgABCGBCAAKAIARQ0AIAAgAxDDCAsgA0EoaiEDIARBWGoiBA0ADAULCyAFKAIEIgMgABCGBCAAKAIARQ0EIAAgAxDDCAwDCyAFQQRqIAAQnwYMAgsgACAFQQRqEKoLDAELIAAgBSgCBCIDENMDIAMgABBRIAAoAgBFDQEgAygCAEEaRw0AIAAgA0EIaiIHEMMFIgRFDQAgAxDkASADQThqIARBOGopAwA3AwAgA0EwaiAEQTBqKQMANwMAIANBKGogBEEoaikDADcDACADQSBqIARBIGopAwA3AwAgA0EYaiAEQRhqKQMANwMAIANBEGogBEEQaikDADcDACAHIARBCGopAwA3AwAgAyAEKQMANwMAIARBwABBCBC9EwsgACgCAEUNACAAIAUQwwgLAkAgBSgCMCIDRQ0AIAAgAxDTAyADIAAQUSAAKAIARQ0AIAMoAgBBGkcNACAAIANBCGoiBxDDBSIERQ0AIAMQ5AEgA0E4aiAEQThqKQMANwMAIANBMGogBEEwaikDADcDACADQShqIARBKGopAwA3AwAgA0EgaiAEQSBqKQMANwMAIANBGGogBEEYaikDADcDACADQRBqIARBEGopAwA3AwAgByAEQQhqKQMANwMAIAMgBCkDADcDACAEQcAAQQgQvRMLIAVBOGoiBSAGRw0ADAcLCyABKAIcIgFFDQYgAUEIaigCACIDRQ0GIAFBBGooAgAhASADQQxsIQMDQCABIAAQ1AEgAUEMaiEBIANBdGoiAw0ADAcLCwJAAkACQCABKAIIDgMAAQgACyABKAIoIAAQrAcgAS0AJEECRw0BDAcLIAEoAiggABD1BSABLQAkQQJGDQYLIAJB2ABqIAEpAxAgASgCIBDnGiAAQSBqIAIpA1ggAigCYBCRBhoMBQsgACABKAIEIgEQ0wMgASAAEFEgACgCAEUNBCABKAIAQRpHDQQgACABQQhqIgMQwwUiAEUNBCABEOQBIAFBOGogAEE4aikDADcDACABQTBqIABBMGopAwA3AwAgAUEoaiAAQShqKQMANwMAIAFBIGogAEEgaikDADcDACABQRhqIABBGGopAwA3AwAgAUEQaiAAQRBqKQMANwMAIAMgAEEIaikDADcDACABIAApAwA3AwAgAEHAAEEIEL0TDAQLIAEoAhAiAUUNAyABQQhqKAIAIgNFDQMgAUEEaigCACEBIANBDGwhAwNAIAEgABDUASABQQxqIQEgA0F0aiIDDQAMBAsLIAAgASgCBCIBENMDIAEgABBRIAAoAgBFDQIgASgCAEEaRw0CIAAgAUEIaiIDEMMFIgBFDQIgARDkASABQThqIABBOGopAwA3AwAgAUEwaiAAQTBqKQMANwMAIAFBKGogAEEoaikDADcDACABQSBqIABBIGopAwA3AwAgAUEYaiAAQRhqKQMANwMAIAFBEGogAEEQaikDADcDACADIABBCGopAwA3AwAgASAAKQMANwMAIABBwABBCBC9EwwCCyABQQhqIAAQpQILIAJB2ABqEJwaIAJBMGpBIGogAUEoaiIEKQMANwMAIAJBMGpBGGogAUEgaiIFKQMANwMAIAJBMGpBEGogAUEYaiIGKQMANwMAIAJBMGpBCGogAUEQaiIDKQMANwMAIAEpAwghDCABIAIpA1g3AwggAyACQdgAakEIaiIIKQMANwMAIAYgAkHYAGpBEGoiCSkDADcDACAFIAJB2ABqQRhqIgopAwA3AwAgBCACQdgAakEgaiILKQMANwMAIAIgDDcDMCACIAAgAkEwakEBEF8gAUEIaiEAAkACQAJAIAIoAgBBbWoiB0ECIAdBAkkbDgMAAQIACyABKQMAIQwgAUEJNgIAIAJB2ABqQTBqIAFBMGopAwA3AwAgAkHYAGpBKGogBCkDADcDACALIAUpAwA3AwAgCiAGKQMANwMAIAkgAykDADcDACAIIAApAwA3AwAgA0EANgIAIABCATcDACACIAw3A1gCQCAMp0EJRg0AIAJB2ABqEM0FDAMLIAJB4ABqEOkDDAILIAAQlAUgAEEgaiACQShqKQMANwMAIABBGGogAkEgaikDADcDACAAQRBqIAJBGGopAwA3AwAgAEEIaiACQRBqKQMANwMAIAAgAikDCDcDAAwBCyACQdgAakEsaiACQShqKQMANwIAIAJB2ABqQSRqIAJBIGopAwA3AgAgAkHYAGpBHGogAkEYaikDADcCACACQdgAakEUaiACQRBqKQMANwIAIAJB2ABqQQxqIAJBCGopAwA3AgAgAiACKQMANwJcIAEQzQUgAUEJNgIAIAEgAikCWDcCBCABQQxqIAgpAgA3AgAgAUEUaiAJKQIANwIAIAFBHGogCikCADcCACABQSRqIAspAgA3AgAgAUEsaiACQdgAakEoaikCADcCACABQTRqIAJBiAFqKAIANgIACyACQZABaiQAC9kQAgh/BX4jAEEQayICJAACQAJAAkACQAJAAkACQAJAAkACQCAAKAIADgkJAAECAwQFBwYJCyAAQQhqIAEQ+gIMCAsgAC0AIA0HIAAoAhgNBwJAIAAoAgwiA0UNACAAKAIIIQQgA0HQAGwhAwNAAkACQAJAAkAgBCkDACIKQn58IgtCAiALQgJUG6cOAwABAgALIARBCGooAgANAiACIARBEGopAwAgBEEgaigCABDnGiABIAIpAwAgAigCCBCRBhoMAgsgAiAEQQhqKQMAIARBGGooAgAQ5xogASACKQMAIAIoAggQkQYaDAELIARByABqLQAADQAgCqdBAXENACACIARBCGopAwAgBEEYaigCABDnGiABIAIpAwAgAigCCBCRBhoLIARB0ABqIQQgA0Gwf2oiAw0ACwsgACgCHCIERQ0HIARBCGooAgAiAEUNByAEQQRqKAIAIQQgAEEMbCEAA0ACQAJAIAQoAgAiAw0AIARBBGooAgAgARCtBQwBCyADIAEQjQELIARBDGohBCAAQXRqIgANAAwICwsCQAJAIAAoAggOAwABCAALAkAgACgC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EMAiIQQgAxDBISAERQ0CIAEQwSEgACAINwMIIABBhICAgHg2AgAMDAsgAkHIAGogARCoFAJAIAIoAkhBgICAgHhGDQAgACACKQJINwIEIABBjICAgHg2AgAgAEEMaiACQdAAaigCADYCAAwJCwJAAkAgARCYIw0AIAJB1ABqIAJBxABqEKUPIAIoAlRBgICAgHhGDQEgACACKQJUNwIEIABBjoCAgHg2AgAgAEEMaiACQdwAaigCADYCAAwKCyACIAE2ApABAkAgARCYI0UNACACIAEQDyIBNgLoASACQQA2AuQBIAJBADYC7AEgAiACQZABajYC4AEgAkHQAWogAUGAgAQgAUGAgARJGxDzGiACQZABaiEEA0BBlYCAgHghAQJAIARFDQAgAkEIaiACQeABahDLGUGVgICAeCEBIAIoAghBAXFFDQAgAigCDCEBIAIgAigC7AFBAWo2AuwBIAJBsAFqIAEQ3AEgAigCtAEhAyACKAKwASIBQZWAgIB4Rg0HIAIpA7gBIQgLIAIgCDcDcCACIAM2AmwgAiABNgJoAkAgAUGVgICAeEYNACACQdABaiACQegAahDCFyACKALgASEEDAELCyACQegAahDHICAAIAIpAtABNwIEIABBlICAgHg2AgAgAEEMaiACQdgBaigCADYCAAwMCyACQbABaiABEJwMIAIoArABIQECQAJAAkAgAi0AtAEiA0F+ag4CAgABCyAAQZWAgIB4NgIAIAAgATYCBAwNCyACIAM6ANQBIAIgATYC0AEgAkHgAWpBABDzGgNAIAJBEGogAkHQAWoQ5Q5BlYCAgHghAQJAIAIoAhAiBEECRg0AIAIoAhQhAyAEQQFxDQggAkGwAWogAxDcASACKAK0ASEDIAIoArABIgFBlYCAgHhGDQggAikDuAEhCAsgAiAINwNwIAIgAzYCbCACIAE2AmgCQCABQZWAgIB4Rg0AIAJB4AFqIAJB6ABqEMIXDAELCyACQegAahDHICAAIAIpAuABNwIEIABBlICAgHg2AgAgAEEMaiACQegBaigCADYCAAwLCyAAIAJBkAFqEK0cDAsLIAEQkyNFDQUQECIDIAEQvyIhBCADEMEhAkAgBEUNACABEBFFDQYLIAIgATYCYCACQbABaiABEJwMIAIoArABIQMCQAJAAkAgAi0AtAEiBEF+ag4CAgAB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EQwBCyADQfADakEYaiABQShqKQMANwMAIANBgARqIAFBIGopAwA3AwAgAyABKQMQNwPwAyADIAFBGGopAwA3A/gDQgEhEQsgBmchBiALLQAAIQsgAS0AWyEOIAEtAFkhDyABKQNIIRIgASkDUCETIAEvAVwhAQJAQYACRSIQDQAgAEHgAGogA0HwAWpBgAL8CgAAC0EgIAZrIQYCQCAQDQAgAEHgAmogA0GwBGpBgAL8CgAACyAAQgA3AwggACARNwMAIAAgBzYCiAUgACAGNgKEBSAAIAI2AoAFIAAgATsBXCAAIA46AFsgACALOgBaIAAgDzoAWSAAIAg6AFggACATNwNQIAAgEjcDSCAAIAk2AkQgACAKNgJAIAAgBDoAPCAAIAw2AjggACANNgI0IAAgBTYCMCAAQfgEaiADQdABakEYaikDADcDACAAQfAEaiADQdABakEQaikDADcDACAAQegEaiADKQPYATcDACAAIAMpA9ABNwPgBCAAIAMpA/ADNwMQIABBGGogAykD+AM3AwAgAEEgaiADQfADakEQaikDADcDACAAQShqIANB8ANqQRhqKQMANwMADAILIABCADcDCCAAQgI3AwAgAEGxATYCGCAAQdyFhAE2AhQgAEEsNgIQCyACIAIoAgAiBEF/ajYCACAEQQFHDQAgAhDVGwsgA0GwBmokAAvJDQEPfyMAQSBrIgYkAAJAAkACQAJAIAFBIU8NACABIQcMAQsgAkF8aiEIA0ACQCAEDQAgACABIAIgA0EBEOECDAMLIAAgAUEDdiIJQRxsaiEKIAAgCUEEdGohBwJAAkAgAUHAAEkNACAAIAcgCiAJEOAPIQsMAQsgACAKIAcgACgCACIJIAcoAgAiDEkiDSAMIAooAgAiDklzGyANIAkgDklzGyELCyAEQX9qIQQgBiALKAIAIg02AgQgCyAAa0ECdiEPAkACQAJAAkAgBUUNACAFKAIAIA1PDQELIAMgAUkNBiACIAFBAnQiEGohCkEAIQcgACEJIA8hEQNAAkAgCSAAQQAgEUF9aiIMIAwgEUsbQQJ0aiISTw0AIAsoAgAhDANAIAIgCkF8aiAJKAIAIg4gDUkiExsgB0ECdGogDjYCACACIApBeGogCUEEaigCACIOIAxJIhQbIAcgE2oiB0ECdGogDjYCACACIApBdGogCUEIaigC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QQxqIAJBuAFqQTj8CgAACyAAIAE2AgggACAENgIEIABBhICAgHg2AgAMBwsgAkHEAWogA0EIaigCACIENgIAIAJBsAFqQQhqIAQ2AgAgAiADKQIAIgs3ArwBIAIgCzcDsAEgAkEQaiACQbABahCdF0EALQDg9p0BGiACKAIUIQRBCBCEASIDRQ0EIANBADYCACAAIAIpAiA3AjAgACADNgIsIAAgATYCBCAAQYCAgIB4NgIAIAMgBDYCBCAAQThqIAJBIGpBCGopAgA3AgAgAEHAAGogAkEwaikCADcCAAwGCyADKAIAIgQgASgCCCIFRg0EIAJBsAFqIAEQ+gMgAkHQAGpBCGoiBiACQcgBaikCADcDACACQdAAakEQaiIHIAJB0AFqKQIANwMAIAIgAikCwAE3A1AgAigCvAEhBCACKAK4ASEIIAIoArQBIQkCQCACKAKwASIKQSJGDQAgACACKQLYATcCLCAAQTxqIAJB6AFqKQIANwIAIABBNGogAkHgAWopAgA3AgAgACAENgIQIAAgCDYCDCAAIAk2AgggACACKQNQNwIUIABBHGogBikDADcCACAAQSRqIAcpAwA3AgAgACAKNgIEIABBhICAgHg2AgAMBgsgAkH4AGpBCGogBikDADcDACACQfgAakEQaiAHKQMANwMAIAIgAikDUDcDeCACIAEQgQoiBjYClAEgARDbCBoCQAJAIAZBKUYNACAGQTpGDQEgAkEANgKwASACQZQBakG4hoUBIAJBsAFqQbyGhQEQ4hsACwJAIARFDQAgAkGsAWogA0EIaigCADYCACAAIAIpA3g3AhAgACAENgIMIAAgCDYCCCAAIAk2AgQgAEGDgICAeDYCACACQZgBakEIaiIBIAJBIGpBCGooAgA2AgAgAEEYaiACQfgAakEIaikDADcCACAAQSBqIAJB+ABqQRBqKQMANwIAIAIgAykCADcCpAEgAiACKQIgNwOYASAAQThqIAJBmAFqQRBqKQMANwIAIABBMGogASkDADcCACAAIAIpA5gBNwIoDAcLIAJBGzYCsAEgAEEEaiABKAIEIAUgAkE4aiACQbABahChDSAAQYSAgIB4NgIAIAkgCEEEQRwQ0BIMBgsgACAENgIMIAAgCDYCCCAAIAk2AgQgACACKQN4NwIQIABBGGogAkH4AGpBCGopAwA3AgAgAEEgaiACQfgAakEQaikDADcCACACQcQBaiADQQhqKAIAIgE2AgAgAkGwAWpBCGogATYCACACIAMpAgAiCzcCvAEgAiALNwOwASACQQhqIAJBsAFqEJ0XQQAtAOD2nQEaIAIoAgwhA0EIEIQBIgFFDQMgAUEANgIAIAAgAikCIDcCMCAAIAE2AiwgAEGCgICAeDYCACABIAM2AgQgAEE4aiACQSBqQQhqKQIANwIAIABBwABqIAJBIGpBEGopAgA3AgAMBQsgAkGwAWogASAEEPoBIAIoArABIQECQEEoRQ0AIAJB0ABqIAJBtAFqQSj8CgAACwJAIAFBIkYNACAAIAIpAtwBNwIwIABBwABqIAJB7AFqKAIANgIAIABBOGogAkHkAWopAgA3AgACQEEoRQ0AIABBCGogAkHQAGpBKPwKAAALIABBhICAgHg2AgAgACABNgIEDAULAkBBKEUNACACQbABaiACQdAAakEo/AoAAAsgAkHkAGogA0EIaigCACIBNgIAIAJB0ABqQQhqIAE2AgAgAiADKQIAIgs3AlwgAiALNwNQIAIgAkHQAGoQnRdBAC0A4PadARogAigCBCEDQQgQhAEiAUUNAiABQQA2AgAgACACKQIgNwIwIAEgAzYCBCAAQThqIAJBIGpBCGopAgA3AgAgAEHAAGogAkEwaikCADcCAAJAQShFDQAgACACQbABakEo/AoAAAsgACABNgIsIAAgBToAKAwECyACQQA2ArABIAJBHGpB4ICFASACQbABakHMhoUBEOIbAAsgAkHQAGpBCGogAkEgakEIaigCADYCACACQeQAaiABKAIAIgNB2ABqKAIANgIAIAIgAikCIDcDUCACIAMpAlA3AlwgAkEhNgKwASAAQQRqIAEoAgQgASgCCCACQdAAaiACQbABahChDSAAQYSAgIB4NgIADAILAAsgAkEVNgKwASAAQQRqIAEoAgQgBCACQSBqIAJBsAFqEKENIABBhICAgHg2AgALIAJB8AFqJAALpQ8CFH8BfiMAQdAAayIEJAACQAJAAkAgAigCAEGAgICAeEYNACADKAIAQYCAgIB4Rw0BCyABKAIMIQUMAQtBfyACKAIIrSADNQIIfiIYpyAYQiCIpxsgASgCDCIFTQ0AIAMQ1R0gA0GAgICAeDYCAAsCQAJAAkACQAJAIAEtABAiBkEB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AkACQAJAAkACQAJAAkACQAJAIAAoAgAOCwkAAQIDBAUGBwgJCQsgAS0AnAEhAiABQQA6AJwBIAEgACgCKCIDENMDIAMgARBRAkAgASgCAEUNACADKAIAQRpHDQAgASADQQhqIgQQwwUiBUUNACADEOQBIANBOGogBUE4aikDADcDACADQTBqIAVBMGopAwA3AwAgA0EoaiAFQShqKQMANwMAIANBIGogBUEgaikDADcDACADQRhqIAVBGGopAwA3AwAgA0EQaiAFQRBqKQMANwMAIAQgBUEIaikDADcDACADIAUpAwA3AwAgBUHAAEEIEL0TCwJAIAAoAghBAkkNACABIAAoAgwiABDTAyAAIAEQUSABKAIARQ0AIAAoAgBBGkcNACABIABBCGoiBRDDBSIDRQ0AIAAQ5AEgAEE4aiADQThqKQMANwMAIABBMGogA0EwaikDADcDACAAQShqIANBKGopAwA3AwAgAEEgaiADQSBqKQMANwMAIABBGGogA0EYaikDADcDACAAQRBqIANBEGopAwA3AwAgBSADQQhqKQMANwMAIAAgAykDADcDACADQcAAQQgQvRMLIAEgAjoAnAEPCyAAKAIIQQFHDQcgASAAKAIMIgAQ0wMgACABEFEgASgCAEUNByAAKAIAQRpHDQcgASAAQQhqIgMQwwUiAUUNByAAEOQBIABBOGogAUE4aikDADcDACAAQTBqIAFBMGopAwA3AwAgAEEoaiABQShqKQMANwMAIABBIGogAUEgaikDADcDACAAQRhqIAFBGGopAwA3AwAgAEEQaiABQRBqKQMANwMAIAMgAUEIaikDADcDACAAIAEpAwA3AwAgAUHAAEEIEL0TDwsgASAAKAIEIgAQ0wMgACABEFEgASgCAEUNBiAAKAIAQRpHDQYgASAAQQhqIgMQwwUiAUUNBiAAEOQBIABBOGogAUE4aikDADcDACAAQTBqIAFBMGopAwA3AwAgAEEoaiABQShqKQMANwMAIABBIGogAUEgaikDADcDACAAQRhqIAFBGGopAwA3AwAgAEEQaiABQRBqKQMANwMAIAMgAUEIaikDADcDACAAIAEpAwA3AwAgAUHAAEEIEL0TDwsCQCAAKAIEIgAoAgBBA0cNACAAQQRqIAEQwAcPCyAAIAEQ3gcPCyABIAAoAgQiABDTAyAAIAEQUSABKAIARQ0EIAAoAgBBGkcNBCABIABBCGoiAxDDBSIBRQ0EIAAQ5AEgAEE4aiABQThqKQMANwMAIABBMGogAUEwaikDADcDACAAQShqIAFBKGopAwA3AwAgAEEgaiABQSBqKQMANwMAIABBGGogAUEYaikDADcDACAAQRBqIAFBEGopAwA3AwAgAyABQQhqKQMANwMAIAAgASkDADcDACABQcAAQQgQvRMPCyABIAAoAgQiABDTAyAAIAEQUSABKAIARQ0DIAAoAgBBGkcNAyABIABBCGoiAxDDBSIBRQ0DIAAQ5AEgAEE4aiABQThqKQMANwMAIABBMGogAUEwaikDADcDACAAQShqIAFBKGopAwA3AwAgAEEgaiABQSBqKQMANwMAIABBGGogAUEYaikDADcDACAAQRBqIAFBEGopAwA3AwAgAyABQQhqKQMANwMAIAAgASkDADcDACABQcAAQQgQvRMPCyABIAAoAgQiABDTAyAAIAEQUSABKAIARQ0CIAAoAgBBGkcNAiABIABBCGoiAxDDBSIBRQ0CIAAQ5AEgAEE4aiABQThqKQMANwMAIABBMGogAUEwaikDADcDACAAQShqIAFBKGopAwA3AwAgAEEgaiABQSBqKQMANwMAIABBGGogAUEYaikDADcDACAAQRBqIAFBEGopAwA3AwAgAyABQQhqKQMANwMAIAAgASkDADcDACABQcAAQQgQvRMPCyABIAAoAgQiABDTAyAAIAEQUSABKAIARQ0BIAAoAgBBGkcNASABIABBCGoiAxDDBSIBRQ0BIAAQ5AEgAEE4aiABQThqKQMANwMAIABBMGogAUEwaikDADcDACAAQShqIAFBKGopAwA3AwAgAEEgaiABQSBqKQMANwMAIABBGGogAUEYaikDADcDACAAQRBqIAFBEGopAwA3AwAgAyABQQhqKQMANwMAIAAgASkDADcDACABQcAAQQgQvRMPCyABIAAoAgQiABDTAyAAIAEQUSABKAIARQ0AIAAoAgBBGkcNACABIABBCGoiAxDDBSIBRQ0AIAAQ5AEgAEE4aiABQThqKQMANwMAIABBMGogAUEwaikDADcDACAAQShqIAFBKGopAwA3AwAgAEEgaiABQSBqKQMANwMAIABBGGogAUEYaikDADcDACAAQRBqIAFBEGopAwA3AwAgAyABQQhqKQMA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AmsiAyQAAkACQAJAAkACQAJAAkACQAJAIAEQgQpB+wBHDQAgA0EIaiABKAIAIgRB2ABqKAIANgIAIAMgBCkCUDcDACAEQdAAaiEFAkACQAJAIAIoAggiBkUNACACIAZBf2oiBzYCCCADIAIoAgQgB0EDdGoiCCgCBCIJNgIUIAMgCCgCACIHNgIQIAdBAkkNASABEPQdDQIgA0GkAWogBUEIaigCADYCACADQZABakEIaiADQQhqKAIANgIAIAMgAykDADcDkAEgAyAFKQIANwKcASADQRo2AuwBIAAgASgCBCABKAIIIANBkAFqIANB7AFqEKENDAkLIANBpAFqIAVBCGooAgAiBDYCACADQZABakEIaiAENgIAIAMgBSkCACIRNwKcASADIBE3A5ABIANBGzYC7AEgACABKAIEIAEoAgggA0GQAWogA0HsAWoQoQ0MCQsgA0GkAWogBUEIaigCACIENgIAIANBkAFqQQhqIAQ2AgAgAyAFKQIAIhE3ApwBIAMgETcDkAEgA0EbNgLsASAAIAEoAgQgASgCCCADQZABaiADQewBahChDQwHCyADQewBaiABEOwCIANBGTYCdCADQQU2AlggA0EYaiADQewBaiADQdgAaiADQfQAahDhBQJAAkACQAJAAkAgBSgCACIKIAEoAggiC0YNACABEIEKQSxHDQIgARD0HQ0DIANBpAFqIAVBCGooAgA2AgAgA0GQAWpBCGogA0EIaigCADYCACADIAMpAwA3A5ABIAMgBSkCADcCnAEgA0EaNgLsASAAIAEoAgQgCyADQZABaiADQewBahChDQwBCyADQaQBaiAFQQhqKAIANgIAIANBkAFqQQhqIANBCGooAgA2AgAgAyADKQMANwOQASADIAUpAgA3ApwBIANBGjYC7AEgACABKAIEIAogA0GQAWogA0HsAWoQoQ0LQQEhBEEBIQoMBgsgAygCHCEMIAMoAhgiBEEiRw0BQQAhDUEBIQ5BACEEQQAhCgwECyABEIEKIQogAygCGCEPAkAgCkH9AEcNACADKAIcIQwCQCAPQSJHDQBBACEEQQEhDkEBIQ1BACEKDAULAkBBOEUNACAAQQhqIANBGGpBCGpBOPwKAAALIAAgDDYCBCAAIA82AgAMCAsCQAJAAkAgD0EiRiIKDQAgD0EZRw0BIAQtAGcNAkHAAEUNCiAAIANBGGpBwAD8CgAADAoLIAMoAhwhDAwECyADKAIcIQECQEE4RQ0AIABBCGogA0EYakEIakE4/AoAAAsgACABNgIEIAAgDzYCAAwICyADKAI0IAMoAjhBAUEBENASQQAhDAwCCwJAQThFDQAgAEEIaiADQRhqQQhqQTj8CgAACyAAIAw2AgQgACAENgIADAYLQfyFhQFBJEGghoUBEIwaDAQLIANB7AFqIAEQ7AIgA0GQAWogA0HsAWogA0HYAGogA0H0AGoQ4QUgAygClAEhDwJAIAMoApABIgRBIkYNAAJAQThFDQAgAEEIaiADQZABakEIakE4/AoAAAsgACAPNgIEIAAgBDYCAEEBIQQMAgtBASEEQQIhDUEAIQ4LAkACQCAFKAIAIAtGDQAgARCBCkH9AEYNAQsgA0GkAWogBUEIaigCADYCACADQZABakEIaiADQQhqKAIANgIAIAMgAykDADcDkAEgAyAFKQIANwKcASADQRo2AuwBIAAgASgCBCALIANBkAFqIANB7AFqEKENDAELQQEhEAJAIAEQ9B1FDQAgARCBCkE/Rw0AIAEQ2wgaQQAhEAsgA0HkAWogBUEIaigCADYCACADQdABakEIaiADQQhqKAIANgIAIAMgAykDADcD0AEgAyAFKQIANwLcASAOIAwgD01yDQEgA0EYNgLsASAAIAEoAgQgCyADQdABaiADQewBahChDQsgCkUNAiAERQ0CIAMoAhhBIkYNAiADKAI0IAMoAjhBAUEBENASDAILIAkhAQJAAkACQAJAAkACQAJAAkAgB0F+ag4KAAcHAQcCAwQFBgALIAlBBGohAQwGCyAJQRxqIQEMBQsgCUHYAGohAQwECyAJQShqIQEMAwsgCUEwaiEBDAILIAlBDGohAQwBCyAJQQxqIQELIANBkAFqQRRqIAVBCGooAgA2AgAgA0GQAWpBCGoiBCABQQhqKAIANgIAIANB7AFqQRRqIANB0AFqQQhqKQMANwIAIANBiAJqIANB0AFqQRBqKQMANwIAIAMgAykD0AE3AvgBQQAtAOD2nQEaIAMgBSkCADcCnAEgAyABKQIANwOQAUEIEIQBIgFFDQAgASAJNgIEIAEgBzYCACADQZwCaiAEKQMANwIAIANBpAJqIANBkAFqQRBqKQMANwIAIAMgAykDkAE3ApQCIAMgEDoA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KAIAIgYgAEEobGohBwNAAkACQAJAAkACQAJAAkAgBigCAA4FBgABAgUGCyAGKAIEQQFHDQUgBigCCCIAKAIAQRpHDQMgAkGQAWogASgCACABKAIEIABBCGoiBBCCDSACKAKQAUEyRg0FIAAQ0QEgAEE4aiACQZABakE4aikDADcDACAAQTBqIAJBkAFqQTBqKQMANwMAIABBKGogAkGQAWpBKGopAwA3AwAgAEEgaiACQZABakEgaikDADcDACAAQRhqIAJBkAFqQRhqKQMANwMAIABBEGogAkGQAWpBEGopAwA3AwAgBCACQZABakEIaikDADcDACAAIAIpA5ABNwMADAULIAYoAgQiACgCAEEaRw0BIAJB0ABqIAEoAgAgASgCBCAAQQhqIgQQgg0gAigCUEEyRg0EIAAQ0QEgAEE4aiACQdAAakE4aikDADcDACAAQTBqIAJB0ABqQTBqKQMANwMAIABBKGogAkHQAGpBKGopAwA3AwAgAEEgaiACQdAAakEgaikDADcDACAAQRhqIAJB0ABqQRhqKQMANwMAIABBEGogAkHQAGpBEGopAwA3AwAgBCACQdAAakEIaikDADcDACAAIAIpA1A3AwAMBAsCQCAGKAIEIggtAGxBAkcNACAIQcAAaiEAA0AgACgCGCIALQAsQQJGDQALCwJAIAhBhAFqKAIAIgRFDQAgCEGAAWooAgAhACAEQdgAbCEEA0ACQAJAAkAgACgCAEEFRw0AIABBBGooAgAiBSgCAEEaRw0BIAJBkAJqIAEoAgAgASgCBCAFQQhqIgkQgg0gAigCkAJBMkYNAiAFENEBIAVBOGogAkGQAmpBOGopAwA3AwAgBUEwaiACQZACakEwaikDADcDACAFQShqIAJBkAJqQShqKQMANwMAIAVBIGogAkGQAmpBIGopAwA3AwAgBUEYaiACQZACakEYaikDADcDACAFQRBqIAJBkAJqQRBqKQMANwMAIAkgAkGQAmpBCGopAwA3AwAgBSACKQOQAjcDAAwCCyAAIAEQ7QgMAQsgBSABEEYLIABB2ABqIQAgBEGof2oiBA0ACwsCQCAIQZgBaigCACIERQ0AIAhBlAFqKAIAIQAgBEEobCEEA0AgASAAEMoCIABBKGohACAEQVhqIgQNAAsLIAgtADwiAEEGRg0DIABBAkcNAyAIQRBqIQAD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AggOAwQQBQQLIAEtABxBAkcNAgwPCyABKAIEIgEoAgAiA0EDRg0GIAMOAwwNCwwLIAEtABxBAkYNDQsgAkEANgIoIAJCgICAgBA3AiAgAkGw9poBNgIMIAJCoICAgA43AhAgAiACQSBqNgIIIAFBCGogAkEIahDPHA0HIAAgAikCIDcCACAAQQhqIAJBIGpBCGooAgA2AgAMDQsgAkHQAGogASgCKBCPAgJAAkAgAigCUEGAgICAeEYNACACQcAAakEIaiACQdAAakEIaigCADYCACACIAIpAlA3A0AMAQsgAkEANgJIIAJCgICAgBA3A0ALIAJBAjYCDCACQaj4mgE2AgggAkICNwIUIAJB5wStQiCGIAFBEGqthDcDKCACQewErUIghiACQcAAaq2ENwMgIAIgAkEgajYCECAAIAJBCGoQiAogAigCQCACKAJEEL0iDAwLIAJBCGogASgCKBCPAgJAAkAgAigCCEGAgICAeEYNACACQTBqQQhqIAJBCGpBCGooAgA2AgAgAiACKQIINwMwDAELIAJBADYCOCACQoCAgIAQNwMwCyACQdAAaiABKAIMEI8CAkACQCACKAJQQYCAgIB4Rg0AIAJBwABqQQhqIAJB0ABqQQhqKAIANgIAIAIgAikCUDcDQAwBCyACQQA2AkggAkKAgICAEDcDQAsgAkECNgIMIAJBqPiaATYCCCACQgI3AhQgAkHsBK1CIIYiCCACQcAAaq2ENwMoIAIgCCACQTBqrYQ3AyAgAiACQSBqNgIQIAAgAkEIahCICiACKAJAIAIoAkQQvSIgAigCMCACKAI0EL0iDAsLAkAgASgCCA0AIAJBATYCDCACQcD4mgE2AgggAkIBNwIUIAJB5wStQiCGIAFBEGqthDcDICACIAJBIGo2AhAgACACQQhqEIgKDAsLIAJBIGogASgCDBCPAgJAAkAgAigCIEGAgICAeEYNACACQdAAakEIaiACQSBqQQhqKAIANgIAIAIgAikCIDcDUAwBCyACQQA2AlggAkKAgICAEDcDUAsgAkEBNgIMIAJBwPiaATYCCCACQgE3AhQgAkHsBK1CIIYgAkHQAGqthDcDQCACIAJBwABqNgIQIAAgAkEIahCICiACKAJQIAIoAlQQvSIMCgsgAS0AGEEFRw0ICyABKAIQIQEMAAsLIAEoAggNBSACIAFBEGoQkxMgAigCACEEAkACQAJAIAIoAgQiBUUNACAEIAVqIQYgBCEBA0AgAUEBaiEDAkACQCABLAAAIgdBf0wNACADIQEMAQsCQCAHQWBJDQACQCAHQW1HDQAgAyAGRg0EIAFBAmogBkYNBCABLQABQZ8BSw0FIAFBA2ohAQwCCyADIAFBAmogAyAGRhsiASABIAZHaiEBIAdBcEkNASABIAEgBkdqIQEMAQsgAyABQQJqIAMgBkYbIQELIAEgBkcNAAsLIARFDQAgAkEIaiAFQQFBARCjDiACKAIMIQMgAigCCEEBRg0BIAIoAhAhAQJAIAVFDQAgASAEIAX8CgAACyAAIAU2AgggACABNgIEIAAgAzYCAAwICyAAQYCAgIB4NgIADAcLIAMgAigCEEG45JsBENggAAtBmNSbAUE3IAJB0ABqQcj2mgFB0NSbARDqEAALIAMgAigCEEG45JsBENggAAsgAkEIaiABKAIgEI8CAkACQCACKAIIQYCAgIB4Rg0AIAJBMGpBCGogAkEIakEIaigCADYCACACIAIpAgg3AzAMAQsgAkEANgI4IAJCgICAgBA3AzALIAJB0ABqIAEoAgQQjwICQAJAIAIoAlBBgICAgHhGDQAgAkHAAGpBCGogAkHQAGpBCGooAgA2AgAgAiACKQJQNwNADAELIAJBADYCSCACQoCAgIAQNwNACyACQQI2AgwgAkGo+JoBNgIIIAJCAjcCFCACQewErUIghiIIIAJBwABqrYQ3AyggAiAIIAJBMGqthDcDICACIAJBIGo2AhAgACACQQhqEIgKIAIoAkAgAigCRBC9IiACKAIwIAIoAjQQvSIMAwsgAkHQAGogASgCIBCPAgJAAkAgAigCUEGAgICAeEYNACACQcAAakEIaiACQdAAakEIaigCADYCACACIAIpAlA3A0AMAQsgAkEANgJIIAJCgICAgBA3A0ALIAJBAjYCDCACQaj4mgE2AgggAkICNwIUIAJB5wStQiCGIAFBCGqthDcDKCACQewErUIghiACQcAAaq2ENwMgIAIgAkEgajYCECAAIAJBCGoQiAogAigCQCACKAJEEL0iDAILIABBgICAgHg2AgAMAQsgAEGAgICAeDYCAAsgAkHgAGokAAvPDAIWfwJ+IwBB0AJrIgYkACABrSIcQv//////////P3wgHIAhHAJAAkAgAUGBIEkNAEEBQSAgAUEBcmdrQQF2Igd0IAEgB3ZqQQF2IQgMAQsgASABQQF2ayIHQcAAIAdBwABJGyEICyAAQXxqIQkgAEEIaiEKQQEhB0EAIQtBACEMA0BBASENQQAhDgJAIAEgC00NACAAIAtBAnQiD2ohEAJAAkAgASALayIRIAhJDQACQAJAIBFBAk8NACARIRIMAQsCQAJAAkACQAJAAkAgECgCBCITIAUoAgAoAgAiEigCCCIUTw0AIBAoAgAiFSAUTw0BAkACQAJAAkAgEigCBCIWIBNBDGxqKAIIIBYgFUEMbGooAghLIhcNAEECIRIgEUECRg0KQQIhEiAKIAtBAnRqIRUDQCAVKAIAIhggFE8NByATIBRPDQggFiAYQQxsaigCCCAWIBNBDGxqKAIISw0DIBVBBGohFSAYIRMgESASQQFqIhJHDQAMAgsLQQIhEkEBIRUgEUECRg0CQQIhEiAKIAtBAnRqIRUDQCAVKAIAIhggFE8NCCATIBRPDQkgFiAYQQxsaigCCCAWIBNBDGxqKAIITQ0CIBVBBGohFSAYIRMgESASQQFqIhJHDQALCyARIRILIBIgCEkNCCAXRQ0HAkAgEkECTw0AQQEhEgwICyASQQF2IRULIAkgEkECdCAPamohEwNAIBAoAgAhESAQIBMoAgA2AgAgEyARNgIAIBNBfGohEyAQQQRqIRAgFUF/aiIVDQAMBwsLIBMgFEHMuIABEMMSAAsgFSAUQdy4gAEQwxIACyAYIBRBzLiAARDDEgALIBMgFEHcuIABEMMSAAsgGCAUQcy4gAEQwxIACyATIBRB3LiAARDDEgALIBJBAXRBAXIhDQwBCwJAIAQNACARIAggESAISRtBAXQhDQwBCyAQIBFBICARQSBJGyITIAIgA0EAQQAgBRC0ASATQQF0QQFyIQ0LIA1BAXYgC2qtIAutIh18IBx+IAsgB0EBdmutIB18IBx+hXmnIQ4LAkACQCAMQQJJDQAgCSALQQJ0IhBqIRkgACAQaiEaA0AgBkGOAmogDEF/aiISai0AACAOSQ0BAkACQAJAAkACQAJAAkACQAJAAkAgBkEEaiASQQJ0aigCACIMQQF2IhAgB0EBdiIRaiIXIANLDQAgDCAHckEBcUUNAQsgACALIBdrQQJ0aiEPAkAgDEEBcQ0AIA8gECACIAMgEEEBcmdBAXRBPnNBACAFELQBCwJAIAdBAXENACAPIBBBAnRqIBEgAiADIBFBAXJnQQF0QT5zQQAgBRC0AQsgDEECSQ0HIAdBAkkNByADIBEgECARIBBJIgcbIhVJDQcgBSgCACEbIA8gEEECdGoiEyAPIAcbIQcCQCAVQQJ0IgxFDQAgAiAHIAz8CgAACyACIAxqIQwCQCARIBBPDQAgGygCACETIBkhEANAIAxBfGoiFSgCACIMIBMoAggiEU8NAyAHQXxqIhQoAgAiByARTw0EIBAgByAMIBMoAgQiESAMQQxsaigCCCIWIBEgB0EMbGooAggiEUsiGBs2AgAgFSAYQQJ0aiEMIBQgFiARTUECdGoiByAPRg0HIBBBfGohECAMIAJHDQAMBwsLIBVFDQUgEyAaRg0FIAIhEANAIBMoAgAiESAbKAIAIhYoAggiFE8NBCAQKAIAIhUgFE8NBSAHIBEgFSAWKAIEIhQgEUEMbGooAggiFiAUIBVBDGxqKAIIIhRLIhgbNgIAIAdBBGohByAQIBYgFE1BAnRqIhAgDEYNByATIBhBAnRqIhMgGkcNAAwHCwsgF0EBdCEHDAcLIAwgEUHMuIABEMMSAAsgByARQdy4gAEQwxIACyARIBRBzLiAARDDEgALIBUgFEHcuIABEMMSAAsgAiEQCyAMIBBrIgxFDQAgByAQIAz8CgAACyAXQQF0QQFyIQcLQQEhECASIQwgEkEBSw0ADAILCyAMIRALIAZBjgJqIBBqIA46AAAgBkEEaiAQQQJ0aiAHNgIAAkAgASALTQ0AIBBBAWohDCANQQF2IAtqIQsgDSEHDAELCwJAIAdBAXENACAAIAEgAiADIAFBAXJnQQF0QT5zQQAgBRC0AQsgBkHQAmokAAv8DgIOfwF+IwBBIGsiASQAQQAhAgJAAkAgACgCXCIDQQJJDQACQAJAAkAgACgCWCIELQABQVZqDgYBAwMDAwADCyAAQQIQlQIMAQsgACADQX5qIgU2AlwgACAEQQJqIgY2AlggACAAKAJoIgdBAmoiCDYCaCAEIANqIQkgAC0AHCEKQQAhAgJAAkADQAJAAkACQCACIgtBIGoiAiAFSQ0AIAMgC2shDCAEIAtqIQ1BAiECA0AgDCACRg0CIA0gAmohDiACQQFqIQIgDi0AACIOQcC9mQFqLQAARQ0ACyACQX1qIQIMAgsCQCAGIAtqIgwtAAAiDkHAvZkBai0AAEUNAEEAIQIMAgsCQCAMLQABIg5BwL2ZAWotAABFDQBBASECDAILAkAgDC0AAiIOQcC9mQFqLQAARQ0AQQIhAgwCCwJAIAwtAAMiDkHAvZkBai0AAEUNAEEDIQIMAgsCQCAMLQAEIg5BwL2ZAWotAABFDQBBBCECDAILAkAgDC0ABSIOQcC9mQFqLQAARQ0AQQUhAgwCCwJAIAwtAAYiDkHAvZkBai0AAEUNAEEGIQIMAgsCQCAMLQAHIg5BwL2ZAWotAABFDQBBByECDAILAkAgDC0ACCIOQcC9mQFqLQAARQ0AQQghAgwCCwJAIAwtAAkiDkHAvZkBai0AAEUNAEEJIQIMAgsCQCAMLQAKIg5BwL2ZAWotAABFDQBBCiECDAILAkAgDC0ACyIOQcC9mQFqLQAARQ0AQQshAgwCCwJAIAwtAAwiDkHAvZkBai0AAEUNAEEMIQIMAgsCQCAMLQANIg5BwL2ZAWotAABFDQBBDSECDAILAkAgDC0ADiIOQcC9mQFqLQAARQ0AQQ4hAgwCCwJAIAwtAA8iDkHAvZkBai0AAEUNAEEPIQIMAgsCQCAMLQAQIg5BwL2ZAWotAABFDQBBECECDAILAkAgDC0AESIOQcC9mQFqLQAARQ0AQREhAgwCCwJAIAwtABIiDkHAvZkBai0AAEUNAEESIQIMAgsCQCAMLQATIg5BwL2ZAWotAABFDQBBEyECDAILAkAgDC0AFCIOQcC9mQFqLQAARQ0AQRQhAgwCCwJAIAwtABUiDkHAvZkBai0AAEUNAEEVIQIMAgsCQCAMLQAWIg5BwL2ZAWotAABFDQBBFiECDAILAkAgDC0AFyIOQcC9mQFqLQAARQ0AQRchAgwCCwJAIAwtABgiDkHAvZkBai0AAEUNAEEYIQIMAgsCQCAMLQAZIg5BwL2ZAWotAABFDQBBGSECDAILAkAgDC0AGiIOQcC9mQFqLQAARQ0AQRohAgwCCwJAIAwtABsiDkHAvZkBai0AAEUNAEEbIQIMAgsCQCAMLQAcIg5BwL2ZAWotAABFDQBBHCECDAILAkAgDC0AHSIOQcC9mQFqLQAARQ0AQR0hAgwCCwJAIAwtAB4iDkHAvZkBai0AAEUNAEEeIQIMAgsgDC0AHyIOQcC9mQFqLQAARQ0CQR8hAgwBCyAAQQA2AlwgACAJNgJYIAAgAyAHajYCaCAAKAJwIQIgAUGagICAeDYCCCAAIAIgAiABQQhqEN4UDAQLIAIgC2ohAgJAAkACQAJAAkAgDkEqRg0AIA5B4gFGDQEgAiEODAILIAJBAWoiDiAFTw0CIAYgDmotAABBL0cNAiACQQJqIQ5BASEMIApBAXENBkEBIQwgAC0AHSINQaQBRg0FIA1BtH9qQf8BcUEnSQ0FQQAhDCANQX5qDkoFBQMDBQMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwUDAwUFBQUDAwMDAwMFBQMLIAJBAmoiDiAFTw0BIAJBAWoiDCAFTw0IIAYgDmotAABBCHQgBiAMai0AAHJBgAJyQf//A3FBgNMCRw0BCyAAQQE6ABwgDiECCyACQQFqIQIMAQsLIA1B3wBqQf8BcUHSAUkhDAsgDiAFTw0AIAwgBiAOai0AAEE7R3EhDAsCQCAAKAIgIgVBgICAgHhGDQAgACACIAhqIg02AmggACAAKAJkIgQgDSAAKAJsIgtrIg1rNgJcIAAgACgCYCIGIA1qNgJYIA0gCCALayILayEDIAYgC2ohDQJAIAJFDQAgACAINgJoIAAgDTYCWCAAIAQgC2s2AlwLIA4gCGohCyAAKAJ0QQhqIA0gAxDeAyEPAkAgDA0AIAAoAhghDAJAIAAoAigiAiAFRw0AIABBIGpByMaZARC0GAsgACACQQFqNgIoIAAoAiQgAkEFdGoiAkEBOgAcIAIgDDYCGCACQQE6ABAgAiALNgIMIAIgBzYCCCACIA83AwAMAQsCQCAAKAI0IgIgACgCLEcNACAAQSxqQdjGmQEQrxgLIAAgAkEBajYCNCAAKAIwIAJBGGxqIgJBAToAECACIAs2AgwgAiAHNgIIIAIgDzcDAAsgACAAKAJcIA5rNgJcIAAgACgCWCAOajYCWCAAIAAoAmggDmo2AmgLQQEhAgsgAUEgaiQAIAIPCyAMIAVB+MaZARDDEgAL6Q0CBH8DfiMAQRBrIgMkAEEAIQQCQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAikDAEJ9fCIHp0EBakEAIAdCAlQbDgMCAAECCyADIAIpAxAgAigCIBDnGiABKAIcRQ0FIAMpAwAgAygCCBCdGiEHIAEoAhAiBEFwaiEFIAdCGYhCgYKEiJCgwIABfiEIIAEoAhQiASAHp3EhAkEAIQYDQAJAIAQgAmopAAAiCSAIhSIHQn+FIAdC//379+/fv/9+fINCgIGChIiQoMCAf4MiB1ANAANAIAMgBSAHeqdBA3YgAmogAXFBBHRrEKkgDQcgB0J/fCAHgyIHUEUNAAsLIAkgCUIBhoNCgIGChIiQoMCAf4NQRQ0GIAIgBkEIaiIGaiABcSECDAALCyADIAIpAxAgAigCIBDnGiABKAIcRQ0CIAMpAwAgAygCCBCdGiEHIAEoAhAiBEFwaiEFIAdCGYhCgYKEiJCgwIABfiEIIAEoAhQiASAHp3EhAkEAIQYDQAJAIAQgAmopAAAiCSAIhSIHQn+FIAdC//379+/fv/9+fINCgIGChIiQoMCAf4MiB1ANAANAIAMgBSAHeqdBA3YgAmogAXFBBHRrEKkgDQQgB0J/fCAHgyIHUEUNAAsLIAkgCUIBhoNCgIGChIiQoMCAf4NQRQ0DIAIgBkEIaiIGaiABcSECDAALCyACLQBADQggAyACKQMgIAIoAjAQ5xoCQCABKAIcRQ0AIAMpAwAgAygCCBCdGiEHIAEoAhAiBEFwaiEFIAdCGYhCgYKEiJCgwIABfiEIIAEoAhQiASAHp3EhAkEAIQYDQAJAIAQgAmopAAAiCSAIhSIHQn+FIAdC//379+/fv/9+fINCgIGChIiQoMCAf4MiB1ANAANAIAMgBSAHeqdBA3YgAmogAXFBBHRrEKkgDQggB0J/fCAHgyIHUEUNAAsLIAkgCUIBhoNCgIGChIiQoMCAf4NQRQ0BIAIgBkEIaiIGaiABcSECDAALCyAAKAIMRQ0GIAMpAwAgAygCCBCdGiEHIAAoAgAiAUFwaiEFIAdCGYhCgYKEiJCgwIABfiEIIAAoAgQiBCAHp3EhAkEAIQADQAJAIAEgAmopAAAiCSAIhSIHQn+FIAdC//379+/fv/9+fINCgIGChIiQoMCAf4MiB1ANAANAAkAgAyAFIAd6p0EDdiACaiAEcUEEdGsQqSBFDQBBASEEDAsLIAdCf3wgB4MiB1BFDQALCyAJIAlCAYaDQoCBgoSIkKDAgH+DUEUNByACIABBCGoiAGogBHEhAgwACwsgAykDACIHQgODQgBSDQQgB6ciAiACKAIAIgFBf2o2AgAgAUEBRw0EIAIgAigCEBDpHQwECwJAAkAgACgCDEUNACADKQMAIAMoAggQnRohByAAKAIAIgFBcGohBSAHQhmIQoGChIiQoMCAAX4hCCAAKAIEIgQgB6dxIQJBACEAA0ACQCABIAJqKQAAIgkgCIUiB0J/hSAHQv/9+/fv37//fnyDQoCBgoSIkKDAgH+DIgdQDQADQAJAIAMgBSAHeqdBA3YgAmogBHFBBHRrEKkgRQ0AQQEhBAwFCyAHQn98IAeDIgdQRQ0ACwsgCSAJQgGGg0KAgYKEiJCgwIB/g1BFDQEgAiAAQQhqIgBqIARxIQIMAAsLQQAhBAsgAykDACIHQgODQgBSDQYgB6ciAiACKAIAIgFBf2o2AgAgAUEBRw0GIAIgAigCEBDpHQwGCyADKQMAIgdCA4NCAFINAiAHpyICIAIoAgAiAUF/ajYCACABQQFHDQIgAiACKAIQEOkdDAILAkACQCAAKAIMRQ0AIAMpAwAgAygCCBCdGiEHIAAoAgAiAUFwaiEFIAdCGYhCgYKEiJCgwIABfiEIIAAoAgQiBCAHp3EhAkEAIQADQAJAIAEgAmopAAAiCSAIhSIHQn+FIAdC//379+/fv/9+fINCgIGChIiQoMCAf4MiB1ANAANAAkAgAyAFIAd6p0EDdiACaiAEcUEEdGsQqSBFDQBBASEEDAULIAdCf3wgB4MiB1BFDQALCyAJIAlCAYaDQoCBgoSIkKDAgH+DUEUNASACIABBCGoiAGogBHEhAgwACwtBACEECyADKQMAIgdCA4NCAFINBCAHpyICIAIoAgAiAUF/ajYCACABQQFHDQQgAiACKAIQEOkdDAQLIAMpAwAiB0IDg0IAUg0AIAenIgIgAigCACIBQX9qNgIAIAFBAUcNACACIAIoAhAQ6R0LQQAhBAwCC0EAIQQLIAMpAwAiB0IDg0IAUg0AIAenIgIgAigCACIBQX9qNgIAIAFBAUcNACACIAIoAhAQ6R0LIANBEGokACAEC8YOAg9/AX4jAEGgAWsiDSQAIA0gBDoAGCANIAI2AhQgDSAGOgAZIA0gCDoAGiANIAk6ABsgDSAKOgAcIA0gCzoAHSANIAw6AB4gBRD0CSEEIAUoAgAhAgJAAkACQAJAAkACQAJAIAQNACACQQVHDQMgCg0BDAILIAVBDEEUIAJBfmpBA0kiCBtqKAIAIQogBUEIQRAgCBtqKAIAIQggDUHfgICAeDYCICAIIAogDUEgahCEFyEIAkAgAS0AyAFBogFHDQAgARDXEiEKIAEQ4w4gASAKEPoSCyAAQQ02AgAgACAINgIEDAMLIAUoAhQhCiAFKAIQIQQgDUHhgICAeDYCICANQvHIlZvGrZi55QA3AyggASAEIAogDUEgahDeHAsgC0UNACAFQQxBFCAFKAIAQX5qQQNJIgobaigCACELIAVBCEEQIAobaigCACEKEMkaIRwgDUHhgICAeDYCICANIBw3AyggASAKIAsgDUEgahDeHAsCQAJAIAEtAIEBQSBxRQ0AIAgNACANIAEtAMgBQQtGIgg6AB8gCEUNASABEOMODAELIA1BADoAHwsgDUEIaiABEPUUIA0oAgwhCCANKAIIQQFxRQ0BIABBDTYCACAAIAg2AgQLIAUQrR8gAxD5HwwBCyANQSBqQQhqIAVBCGopAwA3AwAgDUEgakEQaiAFQRBqKQMANwMAIA1BIGpBGGogBUEYaikDADcDACANQcgAaiADQQhqKAIANgIAIA0gBzYCTCANIAg2AnQgDSAFKQMANwMgIA0gAykCADcDQCANIA1BFGo2AlAgDSANQRlqNgJUIA0gDUEcajYCcCANIA1BG2o2AmwgDSANQRpqNgJoIA0gDUEfajYCZCANIA1BHmo2AmAgDSANQR1qNgJcIA0gDUEYajYCWCABIAEoAngiCkHAgBByNgJ4QQAhBQJAAkACQAJAAkACQAJAAkAgAS0AyAEiC0EXRw0AIAEQ4w4gDSABEPYLIA0oAgQhBSANKAIAQQFxDQEgAS0AyAEhCwsgC0H/AXEiC0F9ag4EBQICAQILIA1BwABqIQMgDUH0AGohCCAAQQ02AgAgACAFNgIEIA0oAiBBBUYNAiANQSBqEMEZDAMLIAEQ4w4MAwsgC0GjAUYNAiABLQDJAUEBcQ0CIAEoAsQBIQsgASgCwAEhBCANQfaAgIB4NgJ4IAEgBCALIA1B+ABqEN4cDAILIA0pAygQ8x8LIAgQ2CEgAxD5HwwBCwJAIAcoAgBFDQAgACADKQIANwIwIABBOGogA0EIaigCADYCACANQfgAakEMaiANQSBqQQhqKQMANwIAIA1BjAFqIA1BMGopAwA3AgAgDUGUAWogDUE4aikDADcCACANIA0pAyA3AnwgASgCvAEhAyANKAIUIQsgDS0AGSEEIA0tAB0hAiANLQAeIQYgDS0AHyEJIA0tABghDCAAQQw2AgACQEEkRQ0AIABBBGogDUH4AGpBJPwKAAALIAAgDDoASCAAIAk6AEcgACAGOgBGIAAgAjoARSAAIAQ6AEQgACAINgJAIAAgBTYCPCAAIAM2AiwgACALNgIoDAELAkACQAJAAkAgDSgCIEEFRg0AIAEoArwBIQYgDS0AHSEDIA0oAhQhCSANKAI8IQwgDSgCOCEHIA0oAjQhDiANKAIwIQsgDSgCLCEEIAVFDQIgA0EBcQ0BDAILQQMhAkEIIQ8gDUEgakEIaiEDIA0oAhQhCyANKAI0IQQCQCANLQAYQQNGDQAgDUG2gYCAeDYCeCABIAsgBCALIARJGyALIAQgCyAESxsgDUH4AGoQ3hwgDS0AGCECIA0oAhQhCwsgDUGEAWogA0EIaigCADYCACANIAMpAgA3AnwgASgCvAEhDkEAIQcgDS0AHyEQIA0tAB4hESANLQAaIRIgDSkCRCEcIA0oAkAhBiANLQAZIRMgBSEMIAghCSANLQAbIQUMAgsgDUGjgYCAeDYCeCABIAkgBiANQfgAahDeHCANLQAdIQMLIA1BhAFqIA1BIGpBCGooAgA2AgAgDSANKQMgNwJ8IAVBEHYhFCAFQQh2IRBBByEPIA0tAB8hFSANLQAcIRYgDS0AGyEXIA0tAB4hGCANLQAaIRkgDS0AGCEaIA0tAEshESANLQBKIRIgDS0ASSETIA0tAEghAiANKQNAIRwgDS0AGSEbCyAAIA82AgAgACANKQJ4NwIEIAAgGjoASyAAIBU6AEogACAWOgBJIAAgFzoASCAAIBg6AEcgACAZOgBGIAAgAzoARSAAIBs6AEQgACAINgJAIAAgFDsBPiAAIBA6AD0gACAFOgA8IAAgEToAOyAAIBI6ADogACATOgA5IAAgAjoAOCAAIBw3AzAgACAGNgIsIAAgCTYCKCAAIAw2AiQgACAHNgIgIAAgDjYCHCAAIAs2AhggACAENgIUIABBDGogDUGAAWopAgA3AgALIAEgCjYCeAsgDUGgAWokAAvCDgIEfwN+IwBBgARrIgUkAEEAIQYgBUHwAGogBCABKAJAIgdBABDcBwJAIARFDQBBASEGQQAgBxCNBiEICyAFQfABaiEHAkBB1ABFDQAgByAFQfAAakHUAPwKAAALIAVBzAJqQQApA5j/nAEiCTcCACAFQdQBaiAJNwIAIAVB5AFqIAk3AgAgBUEAOgDUAiAFIAg2AsgBIAUgBjYCxAEgBUEAOgDsASAFQQApA5D/nAEiCTcCxAIgBSAJNwLMASAFIAk3AtwBIANBOGwhBCAFQdwBaiEIIAVBxAFqQQhqIQYgBUHEAmohAwJAA0AgBEUNAQJAAkAgAigCAEEJRw0AIAVBADoAwQIgAkEIaiAFQcQBahBsDAELIAIgBUHEAWoQ4AELIAJBOGohAiAEQUhqIQQMAAsLIAVB2AJqQQhqIAZBCGopAgA3AwAgBSAGKQIANwPYAiAFQegCaiADEKQPIAVBoANqIgIgCBCkDyAFIAVB2AJqNgKYAyAFQdADakEIakEAKQOY/5wBNwMAIAVBACkDkP+cATcD0AMgBUEgaiAFQegCahDmECAFQdADaiAFKAIgEOcfAkAgBSgCiANBgYCAgHhGDQACQEEwRQ0AIAVBIGogBUHoAmpBMPwKAAALAkADQCAFQeADaiAFQSBqEJANIAUpA+ADIglQDQEgBSAFKALoAzYC+AMgBSAJNwPwAwJAIAVB2AJqIAVB8ANqELkbRQ0AIAUpA/ADEPMfDAELIAVB0ANqIAkQmQYMAAsLQgAQ1iEgBUEgahDbHQsCQCAFKALAA0GBgICAeEYNAAJAQTBFDQAgBUEgaiACQTD8CgAACwJAA0AgBUHwA2ogBUEgahCQDSAFKQPwAyIJUA0BIAVB0ANqIAkQmQYMAAsLQgAQ1iEgBUEgahDbHQsgBUHkAGoiAiAFQdADakEIaikDADcCACAFIAUpA9ADNwJcAkBBPEUiBA0AIAVBIGogB0E8/AoAAAsgBUHYAmoQ4xcgBUGsAmoQiiACQCAEDQAgBUHEAWogBUEgakE8/AoAAAsgBUEQakEIaiIEIAIpAgA3AwAgBSAFKQJcNwMQIAVBxAFqEPoIIAFBIGoiAhDWFyABQShqIAQpAwA3AgAgASAFKQMQNwIgIAUgAjYC3AIgBUEANgLYAgJAAkACQAJAIAEoAhxFDQAgBUHYAmoQnxUhCCABKAIQIgQpAwAhCSAIIAEoAhwiBkEBakEBdiAGIAgoAgwbEOcfIARBCGohAiAJQn+FQoCBgoSIkKDAgH+DIQkDQAJAIAlQDQACQCAEIAl6p0EBdEHwAXFrQXBqKQMAIgpCA4NCAFINACAKpyIDIAMoAgAiA0EBajYCACADQX9MDQQLIAlCf3wgCYMhCSAIIAoQmQYgBkF/aiEGDAELIAZFDQEgBEGAf2ohBCACKQMAQn+FQoCBgoSIkKDAgH+DIQkgAkEIaiECDAALCyAFQQA2AvACIAVCgICAgIABNwLoAiAFQegCahDWESAFQdADakEIaiIIQQApA5j/nAEiCTcDACAFQQApA5D/nAEiCjcD0AMgBUHoAmpBCGogCTcDACAFQQA2AvgCIAUgCjcD6AIgBUHEAWogBUHQA2ogAUEwaiAFQegCaiABQRBqIgIgBUHYAmogBSgC3AIgBSgC2AIbEKkBIAVB6AJqELMLIAEoAgBFDQEgASAFKALcAyACEM0fIAUoAtADIgIpAwAhCSAFKALUAyEEIAUgBSgC3AM2AogBIAUgAjYCgAEgBSACIARqQQFqNgJ8IAUgAkEIajYCeCAFIAlCf4VCgIGChIiQoMCAf4M3A3ADQCAFQQhqIAVB8ABqENcZIAUoAggiAkUNAiAFKAIMIQQCQCACKQMAIglCA4NCAFINACAJpyIGIAYoAgAiBkEBajYCACAGQX9MDQILIAVB6AJqIAEgCSACKAIIEI8JIAUoAvACIQYCQCAFKQPoAiIKUA0AIAUoAoADIQIgBSkD+AIhCwJAIAQpAwAiCUIDg0IAUg0AIAmnIgQgBCgCACIEQQFqNgIAIARBf0wNAwsgBSAJNwP4AiAFIAY2AvACIAUgCjcD6AIgAiALIAVB6AJqEO8PDAELCwJAIAZBeGopAwAiCUIDg0IAUg0AIAmnIgYgBigCACIGQQFqNgIAIAZBf0wNAQsgBUEANgLoAyAFIAk3A+ADIAQpAwAiCUIDg0IAUg0CIAmnIgQgBCgCACIEQQFqNgIAIARBf0oNAgsACyAAIAUpA9ADNwIAIABBCGogCCkDADcCACAFQdgCahDlISAFQcQBahCLECAFQYAEaiQADwsgBUEANgL4AyAFIAk3A/ADIAVBAzYCJCAFQYjTmwE2AiAgBUIDNwIsIAVB5wStQiCGIgkgBUHwA2qthDcD+AIgBSAJIAVB4ANqrYQ3A/ACIAUgCSACrYQ3A+gCIAUgBUHoAmo2AiggBUEgakHs05sBEKgdAAusDgIMfwF+IAAoAmghAiAAKAJYIQMgACgCXCEEQQEhBQJAIAAtABwNAEEAIQUgAC0AHSIGQaQBRg0AQQEhBSAGQVFqQf8BcUENSQ0AIAZBc2pB/wFxQQpJIQULIAIgAWohByADIAFqIQggBCABayEJIAMgBGohCkEAIQMCQAJAA0AgCCADIgtqIQwCQAJAAkACQCALQSBqIgMgCUkNACAEIAEgC2prIQ1BACEDA0AgDSADRg0CIAwgA2ohBiADQQFqIQMgBi0AACIGQcC7mQFqLQAARQ0ACyADQX9qIQMMAwsgDC0AACIGQcC7mQFqLQAARQ0BQQAhAwwCCyAAQQA2AlwgACAKNgJYIAAgBCACajYCaCAAKAIgIgxBgICAgHhGDQQgACAAKAJwIgM2AmggACAAKAJkIAMgACgCbCINayIGazYCXCAAIAAoAmAiCyAGajYCWCAAKAJ0QQhqIAsgByANayINaiAGIA1rEN4DIQ4CQCAFDQAgACgCGCENAkAgACgCKCIGIAxHDQAgAEEgakHIxpkBELQYCyAAIAZBAWo2AiggACgCJCAGQQV0aiIGQQE6ABwgBiANNgIYIAZBADoAECAGIAM2AgwgBiACNgIIIAYgDjcDAA8LAkAgACgCNCIGIAAoAixHDQAgAEEsakHYxpkBEK8YCyAAIAZBAWo2AjQgACgCMCAGQRhsaiIGQQA6ABAgBiADNgIMIAYgAjYCCCAGIA43AwAMBAsCQCAMLQABIgZBwLuZAWotAABFDQBBASEDDAELAkAgDC0AAiIGQcC7mQFqLQAARQ0AQQIhAwwBCwJAIAwtAAMiBkHAu5kBai0AAEUNAEEDIQMMAQsCQCAMLQAEIgZBwLuZAWotAABFDQBBBCEDDAELAkAgDC0ABSIGQcC7mQFqLQAARQ0AQQUhAwwBCwJAIAwtAAYiBkHAu5kBai0AAEUNAEEGIQMMAQsCQCAMLQAHIgZBwLuZAWotAABFDQBBByEDDAELAkAgDC0ACCIGQcC7mQFqLQAARQ0AQQghAwwBCwJAIAwtAAkiBkHAu5kBai0AAEUNAEEJIQMMAQsCQCAMLQAKIgZBwLuZAWotAABFDQBBCiEDDAELAkAgDC0ACyIGQcC7mQFqLQAARQ0AQQshAwwBCwJAIAwtAAwiBkHAu5kBai0AAEUNAEEMIQMMAQsCQCAMLQANIgZBwLuZAWotAABFDQBBDSEDDAELAkAgDC0ADiIGQcC7mQFqLQAARQ0AQQ4hAwwBCwJAIAwtAA8iBkHAu5kBai0AAEUNAEEPIQMMAQsCQCAMLQAQIgZBwLuZAWotAABFDQBBECEDDAELAkAgDC0AESIGQcC7mQFqLQAARQ0AQREhAwwBCwJAIAwtABIiBkHAu5kBai0AAEUNAEESIQMMAQsCQCAMLQATIgZBwLuZAWotAABFDQBBEyEDDAELAkAgDC0AFCIGQcC7mQFqLQAARQ0AQRQhAwwBCwJAIAwtABUiBkHAu5kBai0AAEUNAEEVIQMMAQsCQCAMLQAWIgZBwLuZAWotAABFDQBBFiEDDAELAkAgDC0AFyIGQcC7mQFqLQAARQ0AQRchAwwBCwJAIAwtABgiBkHAu5kBai0AAEUNAEEYIQMMAQsCQCAMLQAZIgZBwLuZAWotAABFDQBBGSEDDAELAkAgDC0AGiIGQcC7mQFqLQAARQ0AQRohAwwBCwJAIAwtABsiBkHAu5kBai0AAEUNAEEbIQMMAQsCQCAMLQAcIgZBwLuZAWotAABFDQBBHCEDDAELAkAgDC0AHSIGQcC7mQFqLQAARQ0AQR0hAwwBCwJAIAwtAB4iBkHAu5kBai0AAEUNAEEeIQMMAQsgDC0AHyIGQcC7mQFqLQAARQ0BQR8hAwsgAyALaiEMAkAgBkHiAUcNACAMQQFqIQMgDEECaiIGIAlPDQEgAyAJTw0CIAggBmotAABBCHQgCCADai0AAHJBgAJyQf//A3FBgNMCRw0BCwsgACAMIAdqIgM2AmggACAJIAxrNgJcIAAgCCAMajYCWAJAIAAoAiAiBkGAgICAeEYNACAAKAJ0QQhqIAAoAmAgByAAKAJsa2ogDBDeAyEOAkAgBQ0AIAAoAhghDQJAIAAoAigiDCAGRw0AIABBIGpByMaZARC0GAsgACAMQQFqNgIoIAAoAiQgDEEFdGoiBkEBOgAcIAYgDTYCGCAGQQA6ABAgBiADNgIMIAYgAjYCCCAGIA43AwAMAQsCQCAAKAI0IgYgACgCLEcNACAAQSxqQdjGmQEQrxgLIAAgBkEBajYCNCAAKAIwIAZBGGxqIgZBADoAECAGIAM2AgwgBiACNgIIIAYgDjcDAAsgACgCaCADRg0BIAAgAzYCaCAAIAAoAmQgAyAAKAJsayIDazYCXCAAIAAoAmAgA2o2AlgPCyADIAlB6MaZARDDEgALC4sPAgd/AX4jAEGAAmsiAiQAIAEoAsABIQMgARDjDgJAAkACQAJAAkAgAS0AyAEiBA0AIAEQ4w4gAS0AyAEiBEHAAEYNASAEQaIBRw0CIAEQ1xIhBCABEOMOIABBBDoANCAAIAQ2AgAMBAsgASgCxAEhAyABKALAASEFIAJBDGogBBCGHiACQQE2AqwBIAJBlPObATYCqAEgAkIBNwK0ASACQfcGrUIghkGh2pgBrYQ3AxggAiACQRhqNgKwASACQfAAaiACQagBahCNFyACQYQBaiACQRRqKAIANgIAIAIgAikCDDcCfCAFIAMgAkHwAGoQhBchBAJAIAEtAMgBQaIBRw0AIAEQ1xIhAyABEOMOIAEgAxD6EgsgAEEEOgA0IAAgBDYCAAwDCyACQRhqIAEQ/Q0MAQsgASgCxAEhBCABKALAASEFIAEQ4w4gAkGSgYCAeDYCqAEgASAFIAQgAkGoAWoQ3hwQrCQhCSACIAQ2AiQgAiAFNgIgIAJCocSIATcDKCACIAk3AxgLQQAhBQJAAkACQCABLQDIASIEQQdHDQAgARDjDiABLQDIASIEQQJHDQAgASgCwAEhBiABEOMOAkACQAJAAkACQAJAIAEtAMgBIgRB8ABHDQAgARDjDiABLQDIASIEQQlHDQIgARDjDiACQagBaiABEFkgAigCrAEhBCACKAKoASIFQTJGDQUCQEE4RQ0AIAJB8ABqIAJBsAFqQTj8CgAACyAFQQ5HDQMgAkHkAGogAkH4AGopAwA3AgAgAiACKQNwNwJcIAIgBDYCWAJAIAEtAMgBIgRBB0cNACABEOMOIAEtAMgBIQQLAkAgBEH/AXFBA0cNACABEOMOIAEoArwBIQdBBEEUEJkiIgUNAgALIAEoAsQBIQMgASgCwAEhBSACQewBaiAEEIYeIAJBATYCrAEgAkGU85sBNgKoASACQgE3ArQBIAJB9watQiCGQb2mmwGthDcD+AEgAiACQfgBajYCsAEgAkHwAGogAkGoAWoQjRcgAkGEAWogAkH0AWooAgA2AgAgAiACKQLsATcCfCAFIAMgAkHwAGoQhBchBAJAIAEtAMgBQaIBRw0AIAEQ1xIhAyABEOMOIAEgAxD6EgsgAkHYAGoQ3CEMBQsgASgCxAEhAyABKALAASEFIAJBwABqIAQQhh4gAkEBNgKsASACQZTzmwE2AqgBIAJCATcCtAEgAkH3Bq1CIIZBkambAa2ENwNYIAIgAkHYAGo2ArABIAJB8ABqIAJBqAFqEI0XIAJBhAFqIAJByABqKAIANgIAIAIgAikCQDcCfCAFIAMgAkHwAGoQhBchBCABLQDIAUGiAUcNBAwDCyAFIAIpAlg3AgAgBUEQaiACQdgAakEQaigCADYCACAFQQhqIAJB2ABqQQhqKQIANwIAIAEtAMgBIQQMBQsgASgCxAEhAyABKALAASEFIAJBzABqIAQQhh4gAkEBNgKsASACQZTzmwE2AqgBIAJCATcCtAEgAkH3Bq1CIIZBqaabAa2ENwNYIAIgAkHYAGo2ArABIAJB8ABqIAJBqAFqEI0XIAJBhAFqIAJB1ABqKAIANgIAIAIgAikCTDcCfCAFIAMgAkHwAGoQhBchBCABLQDIAUGiAUYNAQwCC0GSqZsBQShBvKmbARCMGgALIAEQ1xIhAyABEOMOIAEgAxD6EgsgAEEEOgA0IAAgBDYCAAwCCwsCQAJAAkACQAJAIARB/wFxQQFHDQAgARDjDiABLQDIASIEQQhHDQEgARDjDiACQagBaiABQQAQqgUgAigCqAEhBCACLQC8ASIIQQNHDQIgAEEEOgA0IAAgBDYCAAwECyABKALEASEDIAEoAsABIQggAkE0aiAEEIYeIAJBATYCrAEgAkGU85sBNgKoASACQgE3ArQBIAJB9watQiCGQeComwGthDcDWCACIAJB2ABqNgKwASACQfAAaiACQagBahCNFyACQYQBaiACQTxqKAIANgIAIAIgAikCNDcCfCAIIAMgAkHwAGoQhBchBAJAIAEtAMgBQaIBRw0AIAEQ1xIhAyABEOMOIAEgAxD6EgsgAEEEOgA0IAAgBDYCAAwDCyACQQM6AIQBDAELIAJB8ABqQQxqIAJBqAFqQQxqKQIANwIAIAJB8ABqQRdqIAJBqAFqQRdqLQAAOgAAIAIgAikCrAE3AnQgAiACLwC9ATsAhQEgAiAIOgCEASACIAQ2AnAgAS0AyAEhBAtBACEIAkAgBEH/AXFBEkcNACACIAEQkRcgAigCBCEIAkAgAigCAEEBcUUNACAAQQQ6ADQgACAINgIAIAJB8ABqEJkhDAILIAEQ4w4LIAAgAikDGDcDCCAAIAIpA3A3AyAgACAHNgJEIAAgBjYCQCAAIAU2AjwgACAINgI4IAAgAzYCACAAIAEoArwBNgIEIABBEGogAkEYakEIaikDADcDACAAQRhqIAJBGGpBEGopAwA3AwAgAEEoaiACQfAAakEIaikDADcDACAAQTBqIAJB8ABqQRBqKQMANwMADAILIAUQnyILIAIpAxggAikDKBCMJAsgAkGAAmokAAucDgISfwJ+IwBB0ABrIgQkACADKAIQIgVBf2ohBgJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAVFDQAgBiADKAIMSQ0BCyADKAIEIQcgAygCACEIQQIhCQwBCyADKAIIIAZqLQAAIQogAygCBCEHIAMoAgAhCAJAIAFB4ARqIglBsMuEAUEgEJIXRQ0AIARBIGogCSAKQQN2QRBxaiIJKQMAIAlBCGopAwAgCkH/AHEQqBMgBCkDIEIBg1ANACAKrSEWQgQhFwwCCyABIApqLQBgIQkLIAlB/wFxIQoCQAJAIAgOAwQAAQQLIApBBmohCgwDCyABLQBZQQFxDQEgB60hFkICIRcLIBZCIIYgF4QhFgwCCwJAIAcgASgCgAUoAtwCTw0AIAdBBmwgCmpBDGohCgwBCyABKAKEBRD7FiEKDAILAkAgCiACKAKIASILSQ0AIAogC0GMhYQBEMMSAAsgAigChAEgCkECdGooAgAiCkEATg0BIAQgAjYCSCAEIAE2AkQgBEE4aiAEQcQAaiAIIAcgCRCJAQJAIAQoAjhBBUcNACAEKAI8IQoMAgsgBCkDOCEWCyAWQiCIIRcCQAJAAkACQCAWpyICQX1qIgpBAiAKQQJJGw4DAAECAAsgBEEBOgBEIAQgBTYCSCAEQcQAahDFHCEFDAILIAVFDQMgBCAGNgJIIAQgF6c6AEUgBEEAOgBEIARBxABqEMUcIQUMAQsgBCAXPgJMIAQgAjYCSCAEQQM6AEQgBEHEAGoQxRwhBQsgBRC3ESEFIABBAjYCACAAIAU2AgQMBQsgAygCDCEMAkAgBSADKAIUIglJDQBBACENDAQLIAUgDCAFIAxLGyEHIAFB4AJqIQsgASgChAUhDiADLQAYIQ8gASgCgAUhECADKAIIIRFBACENAkADQAJAIAcgBUcNACAHIAxBnJSEARDDEgALIApB////P3EgCyARIAVqIhItAAAiE2otAABqIgYgAigCfCIITw0DAkACQCACKAJ4IAZBAnRqKAIAIghBAEgNAEEAIQYgCCEKDAELIAQgAjYCSCAEIAE2AkQgBEEYaiAEQcQAaiAKIBNBCHQQggEgBCgCHCEKIAQoAhghBgsCQCAGQQFxRQ0AIARBAToARCAEIAU2AkggBEHEAGoQxRwQtxEhBSAAQQI2AgAgACAFNgIEDAcLAkACQCAKQYCAgMAASQ0AAkAgCkGAgIDAAHENACAKQYCAgIAEcQ0CIApBgICAgAJxRQ0BIBItAAAhCiAEIAU2AkggBCAKOgBFIARBADoARCAEQcQAahDFHBC3ESEFIABBAjYCACAAIAU2AgQMCQtBACEUAkAgECgC3AJBAUYNACAOIAIgChCfHCIGKAIAIAYoAgRBABCYESEUC0EBIQ0gD0EBcQ0DIAUhFQsgCSAFQQFqIgVGDQUMAQsLIAAgFTYCCCAAIBQgBSANQQFxGzYCBCAAIA1Bf3NBAXE2AgAMBQsgACAFNgIIIAAgFDYCBCAAQQA2AgAMBAtB8P6DAUEkQZT/gwEQqxQACyAGIAhB0P6DARDDEgALIAkhBQsCQAJAAkACQAJAAkACQCAJIAxPDQAgCkH///8/cSABIAMoAgggCWotAAAiA2otAOACaiIIIAIoAnwiBk8NBEEAIQYCQCACKAJ4IAhBAnRqKAIAIghBAE4NACAEIAI2AkggBCABNgJEIARBCGogBEHEAGogCiADQQh0EIIBIAQoAgwhCCAEKAIIIQYLIAZBAXFFDQEgBEEBOgBEIAQgCTYCSCAEQcQAahDFHCEFDAYLIAEtAN8EQQFqIgMgCkH///8/cWoiCCACKAJ8IgZPDQRBACEGAkAgAigCeCAIQQJ0aigCACIIQQBODQAgBCACNgJIIAQgATYCRCAEQRBqIARBxABqIAogA0EQdEEBchCCASAEKAIUIQggBCgCECEGCwJAIAZBAXFFDQAgBEEBOgBEIAQgDDYCSCAEQcQAahDFHCEFDAYLIAhBgICAwABxRQ0BAkAgASgCgAUoAtwCQQFHDQBBACEFQQAhCgwDC0EAIQogASgChAUgAiAIEJ8cIgUoAgAgBSgCBEEAEJgRIQUMAgsCQCAIQYCAgMAAcQ0AIAhBgICAgAJxRQ0BIAQgCTYCSCAEIAM6AEUgBEEAOgBEIARBxABqEMUcIQUMBQsCQCABKAKABSgC3AJBAUcNAEEAIQUgCSEMQQAhCgwCC0EAIQogASgChAUgAiAIEJ8cIgUoAgAgBSgCBEEAEJgRIQUgCSEMDAELQQEhCiANQQFxRQ0AQQAhCiAVIQwgFCEFCyAAIAw2AgggACAFNgIEIAAgCjYCAAwDCyAIIAZB0P6DARDDEgALIAggBkHg/oMBEMMSAAsgBRC3ESEFIABBAjYCACAAIAU2AgQLIARB0ABqJAALmg4BC38jAEHgAmsiAiQAIAJBoAJqIAEQ9BkgAigCoAIhAwJAQThFDQAgAkH4AGogAkGgAmpBBGpBOPwKAAALAkACQCADQSJGDQAgAigC3AIhAQJAQThFDQAgAEEIaiACQfgAakE4/AoAAAsgACABNgJAIAAgAzYCBCAAQYiAxAA2AgAMAQsCQEE4RQ0AIAJBCGogAkH4AGpBOPwKAAALIAEQ9AMCQAJAAkAgASgCACgCUCABKAIIIgRGDQAgAkEIakEEaiEDIAEQgQpBLUcNAiABEKAEQd0ARg0CIAEQoARBLUYNAgJAIAEQ9B0NACAAQQRqIAEQ8gogAEGIgMQANgIADAILIAJBoAJqIAEQ9BkgAigCoAIhBQJAQThFDQAgAkH4AGogAkGkAmpBOPwKAAALAkAgBUEiRg0AIAIoAtwCIQECQEE4RQ0AIABBCGogAkH4AGpBOPwKAAALIAAgATYCQCAAIAU2AgQgAEGIgMQANgIADAILAkBBOEUNACACQcAAaiACQfgAakE4/AoAAAsgAkEIakEIaiEFAkACQAJAIAIoAghB/v///wdqIgZBBCAGQQRJGw4FAgAAAAECCyADIQUMAQsgAkEIakEcaiEFCyACQcAAakEIaiEDAkACQAJAIAIoAkBB/v///wdqIgZBBCAGQQRJGw4FAgAAAAECCyACQcAAakEEaiEDDAELIAJBwABqQRxqIQMLIAJB6AFqQRRqIANBFGooAgA2AgAgAkHoAWpBCGogBUEIaigCADYCACACIAMpAgw3AvQBIAIgBSkCADcD6AEgAkGgAmogAkEIaiABKAIEIgMgBBDtDCACQYACakEIaiIFIAJBoAJqQRBqIgcpAgA3AwAgAkGAAmpBEGoiCCACQaACakEYaiIJKQIANwMAIAJBgAJqQRhqIgogAkHAAmoiCygCADYCACACIAIpAqgCNwOAAiACKAKkAiEBAkAgAigCoAIiDEEiRg0AIAAgAikCxAI3AiggAEHAAGogAkHcAmooAgA2AgAgAEE4aiACQdQCaikCADcCACAAQTBqIAJBzAJqKQIANwIAIABBJGogCigCADYCACAAQRxqIAgpAwA3AgAgAEEUaiAFKQMANwIAIAAgAikDgAI3AgwgACABNgIIIAAgDDYCBCAAQYiAxAA2AgAgBkEESQ0EIAJBwABqEOQWDAQLIAJBoAJqIAJBwABqIAMgBBDtDCACQfgAakEIaiAHKQIANwMAIAJB+ABqQRBqIAkpAgA3AwAgAkH4AGpBGGogCygCADYCACACIAIpAqgCNwN4IAIoAqQCIQUCQCACKAKgAiIGQSJGDQAgACACKQLEAjcCKCAAQcAAaiACQdwCaigCADYCACAAQThqIAJB1AJqKQIANwIAIABBMGogAkHMAmopAgA3AgAgAEEkaiACQZABaigCADYCACAAQRxqIAJBiAFqKQMANwIAIABBFGogAkGAAWopAwA3AgAgACACKQN4NwIMIAAgBTYCCCAAIAY2AgQgAEGIgMQANgIADAQLIAJBsAFqQQhqIAJB+ABqQQhqKQMANwMAIAJBsAFqQRBqIAJB+ABqQRBqKQMANwMAIAJBsAFqQRhqIAJB+ABqQRhqKAIANgIAIAJBsAFqQSRqIAJB6AFqQQhqKQMANwIAIAJB3AFqIAJB6AFqQRBqKQMANwIAIAIgAikDeDcDsAEgAiACKQPoATcCzAECQCABIAVNDQAgAkECNgKgAiAAQQRqIAMgBCACQegBaiACQaACahChDSAAQYiAxAA2AgAMBAsgACACKQOAAjcCBCAAQRxqIAJBgAJqQRhqKAIANgIAIABBFGogAkGAAmpBEGopAwA3AgAgAEEMaiACQYACakEIaikDADcCAAJAQTRFDQAgAEEkaiACQbABakE0/AoAAAsgACAFNgIgIAAgATYCAAwDCyAAQQRqIAEQ8gogAEGIgMQANgIACyACKAIIQf7///8HakEESQ0BIAJBCGoQ5BYMAQsCQEE4RQ0AIAJBoAJqIAJBCGpBOPwKAAALAkACQAJAAkAgAigCoAJB/v///wdqIgVBBCAFQQRJIgUbDgUBAAACAwALIAJBATYCeCAAQQRqIAEoAgQgBCACQaACakEEaiACQfgAahChDSAAQYiAxAA2AgAgBQ0DIAJBCGoQ5BYMAwsgAEGBgMQANgIAIAAgAykCADcCBCAAQRxqIANBGGopAgA3AgAgAEEUaiADQRBqKQIANwIAIABBDGogA0EIaikCADcCAAwCCyAAQYWAxAA2AgAgACADKQIANwIEIABBHGogA0EYaigCADYCACAAQRRqIANBEGopAgA3AgAgAEEMaiADQQhqKQIANwIADAELIABBhIDEADYCAEE4RQ0AIABBBGogAkEIakE4/AoAAAsgAkHgAmokAAuaDwIMfwF+IwBB8AJrIgMkACADIAI2AhwCQAJAAkAgAS0AyAEiAkE+Rg0AIAJBEkcNAQsgAS0AgQFBIHFFDQAgASgCeCEEIANBIGogARCTAyABIAEoAnhBAXI2AnggA0EQaiABQQBBABDQAiADKAIUIQUCQAJAAkAgAygCEEEBcUUNACADQYGAgIB4NgKQASADIAU2ApQBIAEgA0EgahCgBgwBCwJAAkACQCABLQCAAUEBcUUNACAFKAIIQQFHDQAgBSgCBCICKAIgDQAgBSgCECACKAIEa0EBSw0AQYCAgIB4IQIgA0GAgICAeDYCkAEMAQsCQCABLQDIASICRQ0AIAEoAsQBIQYgASgCwAEhByADQaQBaiACEIYeIANBATYCtAIgA0GU85sBNgKwAiADQgE3ArwCIANB9watQiCGQaHamAGthDcDsAEgAyADQbABajYCuAIgA0HwAWogA0GwAmoQjRcgA0GEAmogA0GsAWooAgA2AgAgAyADKQKkATcC/AEgByAGIANB8AFqEIQXIQYCQCABLQDIAUGiAUcNACABENcSIQIgARDjDiABIAIQ+hILQYGAgIB4IQIgA0GBgICAeDYCkAEgAyAGNgKUAQwBCyABEOMOIANBsAJqIAEQzgIgAygCtAIhBwJAAkACQAJAIAMoArACIghBgICAgHhGDQAgAygCuAJBBnQhCSAIQQZ0IQogA0HgAmohC0EAIQZBACECAkADQCAHIAZqIQwgCSACRg0BIAcgAmohDQJAQcAARSIODQAgA0HwAWogDUHAAPwKAAALAkAgDg0AIANBsAJqIA1BwAD8CgAACyALEPkfAkBBKEUNACAMIANB8AFqQSj8CgAACyAGQShqIQYgAkHAAGohAgwACwsgA0EINgK8ASADQQA2AsQBQQBBCBDuIiADQQg2AsgBIANBCDYCwAEgCkEobiEGIAchAgJAIAhFDQAgByECIAogBkEobCINRg0AIAcgCiANEOEdIgJFDQILIAMgAjYCtAEgAyAGNgKwASADIAwgB2tBKG42ArgBIANBvAFqENMSAkACQAJAIAEtAMgBIgJBAUcNACABEOMOQQAhAiABLQDIASIGQQlHDQIgA0EIaiABQQkQswQgAygCDCECIAMoAghBAXFFDQEgA0GBgICAeDYCkAEgAyACNgKUAQwFCyABKALEASEGIAEoAsABIQcgA0HMAWogAhCGHiADQQE2ArQCIANBlPObATYCsAIgA0IBNwK8AiADQfcGrUIghkHgqJsBrYQ3A+gBIAMgA0HoAWo2ArgCIANB8AFqIANBsAJqEI0XIANBhAJqIANB1AFqKAIANgIAIAMgAykCzAE3AvwBIAcgBiADQfABahCEFyECAkAgAS0AyAFBogFHDQAgARDXEiEGIAEQ4w4gASAGEPoSCyADQYGAgIB4NgKQASADIAI2ApQBDAQLIAEtAMgBIQYLIAMgAjYC2AECQCAGQf8BcUEbRw0AIAEQ4w4gA0GQAWpBCGogA0GwAWpBCGooAgA2AgAgAyACNgKgASADIAU2ApwBIAMgAykCsAEiDzcDkAEgD6chAgwGCyABKALEASECIAEoAsABIQcgA0HcAWogBhCGHiADQQE2ArQCIANBlPObATYCsAIgA0IBNwK8AiADQfcGrUIghkGorpsBrYQ3A+gBIAMgA0HoAWo2ArgCIANB8AFqIANBsAJqEI0XIANBhAJqIANB5AFqKAIANgIAIAMgAykC3AE3AvwBIAcgAiADQfABahCEFyECAkAgAS0AyAFBogFHDQAgARDXEiEGIAEQ4w4gASAGEPoSCyADQYGAgIB4NgKQASADIAI2ApQBIANB2AFqENghDAILIANBgYCAgHg2ApABIAMgBzYClAEMAgsACyADQbABahCCIAtBgYCAgHghAgsgBRCdIgsCQAJAIAJBgICAgHhqDgIAAQMLIAEgA0EgahCgBiADKAKQAUGBgICAeEcNAyADQZABahDgHAwDCyADKAKQASECIAEgA0EgahCgBiACQYGAgIB4Rw0CCyADQZABahDgHAwBCyABIAEoAnhBfnEgBEEBcXI2AnggAygCkAEhAiADKAKgASEHIAMoApwBIQYgAykC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wABqQQhqKQMANwMAAkACQCADDQAgASEEIAYhBwwBCwJAIAlCAFINACAIpyIDIAMoAgAiA0EBajYCACADQX9MDQMLIAIgCDcDgAEgAiACQYABahCUEyACKAIAIAIoAgQQ+hchCgJAIAIpA4ABIg1CA4NCAFINACANpyIDIAMoAgAiB0F/ajYCACAHQQFHDQAgAyADKAIQEOkdCwJAIAxCAFINACALpyIDIAMoAgAiA0EBajYCACADQX9MDQMLQQAtAOD2nQEaQcAAEIQBIgdFDQIgB0EAOgAcIAcgBDYCGCAHQgA3AxAgByALNwMIIAdBGjYCAEEALQDg9p0BGkHAABCEASIERQ0CIARBADoAPCAEIAU2AjggBEIANwMwIAQgBjYCKCAEQgA3AyAgBEIANwMQIAQgATYCDCAEQQI2AgggBEEBNgIAIAQgAi8AgAE7AD0gBEE/aiACQYABakECai0AADoAAEEALQDg9p0BGkHAABCEASIFRQ0CIAVCADcDGCAFIAo3AxAgBUEANgIIIAVBGzYCACAFQSBqQgA3AwALQQAtAOD2nQEaIAIoAiwhASACKAIoIQZBwAAQhAEiA0UNASADQQA6ADwgAyAFNgI4IANCADcDMCADIAc2AiggA0IANwMgIANCADcDECADIAQ2AgwgA0ECNgIIIANBATYCACADIAIvAIABOwA9IANBP2ogAkGAAWpBAmotAAA6AAACQCAJQgBSDQAgCKciBSAFKAIAIgRBf2o2AgAgBEEBRw0AIAUgBSgCEBDpHQsCQCACKQMwIgtCA4NCAFINACALpyIFIAUoAgAiBEF/ajYCACAEQQFHDQAgBSAFKAIQEOkdCyAAIAE2AgwgACAGNgIIIAAgAzYCBCAAQRI2AgAgACACKQNANwMQIABBGGogAkHIAGopAwA3AwAgAEEgaiACQdAAaikDADcDACAAQShqIAJBwABqQRhqKQMANwMACyACQaABaiQADwsAC8AOAgd/AX4jAEEgayICJAACQAJAAkAgACgCACIDDQAgACgCECIARQ0BIABB4MubAUEBEJwGIQMMAgsCQAJAAkACQAJAAkAgACgCCCIEIAAoAgQiBUkNACAAKAIQIgNFDQEgA0HUtJcBQRAQnAZFDQEMBQsgACAEQQFqIgY2AgggAyAEai0AACEHIAAgACgCDEEBaiIINgIM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ByAGakH/AToAACAHIAAoAgQgBkF4anFqQQhqQf8BOgAAIAQgDkF/c0EYbGoiBEEQaiALQRBqKQAANwAAIARBCGogC0EIaikAADcAACAEIAspAAA3AAAgByEECyAIQWhqIQggCiAKIAVJIgZqIQ8gBg0ACyAAKAIEIgQgBEEBakEDdkEHbCAEQQhJGyEECyAAIAQgACgCDGs2AggLQYGAgIB4IQcLIAJBMGokACAHC94MAgh/An4jAEEQayICJAACQAJAAkACQAJAAkACQAJAIAAoAgAOCAABAgMGBgQFAAsgACgCICIDQQxqIQQCQCADQQhqKAIAIgBFDQAgA0EEaigCACEFIABBDGwhBgNAIAEgBSgCACIAENMDIAAgARBRAkAgASgCAEUNACAAKAIAQRpHDQAgASAAQQhqIgcQwwUiCEUNACAAEOQBIABBOGogCEE4aikDADcDACAAQTBqIAhBMGopAwA3AwAgAEEoaiAIQShqKQMANwMAIABBIGogCEEgaikDADcDACAAQRhqIAhBGGopAwA3AwAgAEEQaiAIQRBqKQMANwMAIAcgCEEIaikDADcDACAAIAgpAwA3AwAgCEHAAEEIEL0TCyAFQQxqIQUgBkF0aiIGDQALCyABIAQQRCADKAIwIgBFDQUgASAAENMDIAAgARBRIAEoAgBFDQUgACgCAEEaRw0FIAEgAEEIaiIFEMMFIgFFDQUgABDkASAAQThqIAFBOGopAwA3AwAgAEEwaiABQTBqKQMANwMAIABBKGogAUEoaikDADcDACAAQSBqIAFBIGopAwA3AwAgAEEYaiABQRhqKQMANwMAIABBEGogAUEQaikDADcDACAFIAFBCGopAwA3AwAgACABKQMANwMAIAFBwABBCBC9EwwFCwJAIAAoAiAiCUEIaigCACIARQ0AIAlBBGooAgAiAyAAQQZ0aiEEA0ACQCADQThqKAIAIgBFDQAgA0E0aigCACEFIABBDGwhBgNAIAEgBSgCACIAENMDIAAgARBRAkAgASgCAEUNACAAKAIAQRpHDQAgASAAQQhqIgcQwwUiCEUNACAAEOQBIABBOGogCEE4aikDADcDACAAQTBqIAhBMGopAwA3AwAgAEEoaiAIQShqKQMANwMAIABBIGogCEEgaikDADcDACAAQRhqIAhBGGopAwA3AwAgAEEQaiAIQRBqKQMANwMAIAcgCEEIaikDADcDACAAIAgpAwA3AwAgCEHAAEEIEL0TCyAFQQxqIQUgBkF0aiIGDQALCyADIAEQ1wggA0HAAGoiACEDIAAgBEcNAAsLIAlBGGohAwJAIAlBFGooAgAiAEUNACAJQRBqKAIAIQUgAEEMbCEGA0AgASAFKAIAIgAQ0wMgACABEFECQCABKAIARQ0AIAAoAgBBGkcNACABIABBCGoiBxDDBSIIRQ0AIAAQ5AEgAEE4aiAIQThqKQMANwMAIABBMGogCEEwaikDADcDACAAQShqIAhBKGopAwA3AwAgAEEgaiAIQSBqKQMANwMAIABBGGogCEEYaikDADcDACAAQRBqIAhBEGopAwA3AwAgByAIQQhqKQMANwMAIAAgCCkDADcDACAIQcAAQQgQvRMLIAVBDGohBSAGQXRqIgYNAAsLIAMoAgBBgICAgHhGDQQgASADEOQEDAQLIAAoAgQiAEEEaigCACIFIAUgAEEIaigCAEE4bGogARCiBQwDCyAAKAIEIgBBBGooAgAiBSAFIABBCGooAgBBOGxqIAEQogUMAgsgACgCBCIAQShqKAIAIgVFDQEgBUEwbCEIIABBJGooAgBBKGohBQNAAkAgBSgCACIARQ0AIAEgABDTAyAAIAEQUSABKAIARQ0AIAAoAgBBGkcNACABIABBCGoiBxDDBSIGRQ0AIAAQ5AEgAEE4aiAGQThqKQMANwMAIABBMGogBkEwaikDADcDACAAQShqIAZBKGopAwA3AwAgAEEgaiAGQSBqKQMANwMAIABBGGogBkEYaikDADcDACAAQRBqIAZBEGopAwA3AwAgByAGQQhqKQMANwMAIAAgBikDADcDACAGQcAAQQgQvRMLIAVBMGohBSAIQVBqIggNAAwCCwsgACgCBCIAKAIAQQFGDQEgAiAAKQMIIABBGGooAgAQ5xogAikDACEKIAEoAhghBSABIAIoAgg2AhggASkDECELIAEgCjcDEAJAIAAtAEUiCEEDRg0AIABBIGohAAJAIAhBAkYNACABIAAQ8Q0MAQsgASAAEJ0ECwJAIAEpAxAiClANACAKQgODQgBSDQAgCqciACAAKAIAIghBf2o2AgAgCEEBRw0AIAAgACgCEBDpHQsgASAFNgIYIAEgCzcDEAsgAkEQaiQADwtBivSaAUEqQbT0mgEQqxQAC7oMAhN/A34jAEEwayICJAACQAJAAkACQAJAIAAoAgwiA0F/Rg0AAkAgAyAAKAIEIgQgBEEBaiIFQQN2IgZBB2wiByAEQQhJGyIIQQF2SQ0AAkACQCAIIAMgCCADSxsiCEEOSQ0AIAhB/v///wFLDQNBfyAIQQN0QQhqQQduQX9qZ3ZBAWohCAwBC0EEQQhBECAIQQdJGyAIQQNJGyEICyACQSBqQRRBCCAIEMcNIAIoAiQhCSACKAIgIgRFDQUgAikCKCEVAkAgCUEJaiIIRQ0AIARB/wEgCPwLAAsgAiAVQiCIPgIcIAIgFaciCjYCGCACIAk2AhQgAiAENgIQIAJBCDYCDEEAIQtBACEIAkAgA0UNACAEQQhqIQwgACgCACIFKQMAQn+FQoCBgoSIkKDAgH+DIRVBACEIIAMhDSAFIQYDQAJAIBVCAFINAANAIAhBCGohCCAGQQhqIgYpAwBCgIGChIiQoMCAf4MiFUKAgYKEiJCgwIB/UQ0ACyAVQoCBgoSIkKDAgH+FIRULIAJBADYCICAFQQAgFXqnQQN2IAhqIg5rQRRsaiIPQXBqKAIAIA9BdGooAgAgAkEgahCcCAJAIAQgCSACKAIgQQ93IhBxIg9qKQAAQoCBgoSIkKDAgH+DIhZCAFINAEEIIREDQCAPIBFqIQ8gEUEIaiERIAQgDyAJcSIPaikAAEKAgYKEiJCgwIB/gyIWUA0ACwsgFUJ/fCEXAkAgBCAWeqdBA3YgD2ogCXEiD2osAABBAEgNACAEKQMAQoCBgoSIkKDAgH+DeqdBA3YhDwsgFyAVgyEVIAQgD2ogEEEZdiIQOgAAIAwgD0F4aiAJcWogEDoAACAEIA9Bf3NBFGxqIg9BEGogBSAOQX9zQRRsaiIOQRBqKAAANgAAIA9BCGogDkEIaikAADcAACAPIA4pAAA3AAAgDUF/aiINDQALIAMhCAsgAiAINgIcIAIgCiAIazYCGAJAA0AgC0EQRg0BIAAgC2oiCCgCACEGIAggAkEEaiALakEMaiIEKAIANgIAIAQgBjYCACALQQRqIQsMAAsLIAIoAhQiCEUNBCAIIAhBFGxBG2pBeHEiBmpBCWoiCEUNBCACKAIQIAZrIAhBCBC9EwwECyAAKAIAIQsCQCAGIAVBB3FBAEdqIgZFDQAgCyEIA0AgCCAIKQMAIhVCf4VCB4hCgYKEiJCgwIABgyAVQv/+/fv379+//wCEfDcDACAIQQhqIQggBkF/aiIGDQALCwJAIAVBCEkNACALIAVqIAspAAA3AAAMAgsCQCAFRQ0AIAtBCGogCyAF/AoAAAsgBQ0BQQAhCAwCCxCHHAALIAtBCGohEUEBIQkgCyEPQQAhCANAIAghBiAJIQgCQCALIAZqIg4tAABBgAFHDQAgCyAGQX9zQRRsaiESIAtBACAGa0EUbGoiCUF0aiEMIAlBcGohCgJAA0AgAkEANgIEIAooAgAgDCgCACACQQRqEJwIIAQgAigCBEEPdyIQcSIJIQ0CQCALIAlqKQAAQoCBgoSIkKDAgH+DIhVCAFINAEEIIRMgCSENA0AgDSATaiENIBNBCGohEyALIA0gBHEiDWopAABCgIGChIiQoMCAf4MiFVANAAsLAkAgCyAVeqdBA3YgDWogBHEiDWosAABBAEgNACALKQMAQoCBgoSIkKDAgH+DeqdBA3YhDQsgEK0hFQJAIA0gCWsgBiAJa3MgBHFBCEkNACALIA1qIgktAAAhECAJIBVCGYinIhM6AAAgESANQXhqIARxaiATOgAAIBBB/wFGDQJBbCEJIAsgDUFsbGohFANAIAlFDQIgDyAJaiINKAAAIRAgDSAUIAlqIhMoAAA2AAAgEyAQNgAAIAlBBGohCQwACwsLIA4gFUIZiKciCToAACARIAQgBkF4anFqIAk6AAAMAQsgDkH/AToAACARIAQgBkF4anFqQf8BOgAAIAsgDUF/c0EUbGoiBkEQaiASQRBqKAAANgAAIAZBCGogEkEIaikAADcAACAGIBIpAAA3AAALIA9BbGohDyAIIAggBUkiBmohCSAGDQALIAQgByAEQQhJGyEICyAAIAggA2s2AggLQYGAgIB4IQkLIAJBMGokACAJC4ENAgp/BX4jAEEQayIEJAAgBBDNGiIONwMAIA5CA4MhDwJAAkACQAJAAkACQAJAAkACQAJAAkAgASAEEPkLDQACQCAPQgBSDQAgDqciBSAFKAIAIgZBf2o2AgAgBkEBRw0AIAUgBSgCEBDpHQsCQCABKQMAIg5CA4MiEEIAUg0AIA6nIgUgBSgCACIFQQFqNgIAIAVBf0wNBgsgAEEcaiAOIAEoAggiBxCRBhoCQAJAAkAgACgCCCIFDgICAQALAkAgASkDACIPQgODQgBSDQAgD6cpAwghDwsgACgCECIIIA+nQd3L3Z55bCAPQiCIp2pB3cvdnnlsIAdqQd3L3Z55bEEPdyIJcSEGIAlBGXatQoGChIiQoMCAAX4hESAAKAIMIglBfGohCiAAKAIEIQtBACEMA0AgCSAGaikAACISIBGFIg9Cf4UgD0L//fv379+//358g0KAgYKEiJCgwIB/gyEPAkADQCAPUA0BIAogD3qnQQN2IAZqIAhxQQJ0aygCACINIAVPDQcgD0J/fCAPgyEPIAEgCyANQRhsaiINEPkLRQ0AIAcgDSgCCEcNAAwPCwsgEiASQgGGg0KAgYKEiJCgwIB/g0IAUg0CIAxBCGoiDCAGaiAIcSEGDAALCyABIAAoAgQiBRD5C0UNACAHIAUoAghGDQsLIAINAQwECyAPQgBSDQkgDqciASABKAIAIgNBf2o2AgAgA0EBRw0JIAEgASgCEBDpHQwJCwJAAkBBACgCgPadASIBRQ0AIAcgARCOFCICQQxqKAIAIgFJDQEgByABQdz7mQEQwxIAC0GElpsBQcgAQayXmwEQvCMACyACQQhqKAIAIAdBA3RqKAIAIQEgAkEAOgAAAkACQEEAKAKA9p0BIgVFDQAgBUEgahCOFCEJIAVBLGohAiAFQShqIQUDQCABRQ0CIAEgA0YNAiABIAIoAgAiBk8NBCAFKAIAIAFBAnRqKAIAIQEMAAsLQYSWmwFByABBrJebARC8IwALIAlBADoAACABIANHDQIMCAsgDSAFQaylmgEQwxIACyABIAZBjMGYARDDEgALIA4hDwJAIBBCAFINACAOpyIBIAEoAgAiA0EBajYCACADQX9MDQEgASkDCCEPCyAEIA43AwAgBCAHNgIIIA+nQd3L3Z55bCAPQiCIp2pB3cvdnnlsIAdqQd3L3Z55bEEPdyEDIAAoAgghBiAAKAIEIQcCQCAAKAIUDQAgAEEMakEBIAcgBhCIBBoLIAAoAhAiBSADcSEBIANBGXYiDa1CgYKEiJCgwIABfiEPIAAoAgwhAkEAIQxBACELA0AgAiABaikAACIQIA+FIg5Cf4UgDkL//fv379+//358g0KAgYKEiJCgwIB/gyEOAkADQCAOUA0BIAAoAgwgDnqnQQN2IAFqIAVxIghBAnRrQXxqKAIAIgkgBk8NBCAOQn98IA6DIQ4gBCAHIAlBGGxqIgkQ+QtFDQAgBCgCCCAJKAIIRw0ACyAAKAIMQQAgCGtBAnRqQXxqKAIAIgEgACgCCCIDTw0EIAQpAwAiDkIDg0IAUg0HIA6nIgEgASgCACIDQX9qNgIAIANBAUcNByABIAEoAhAQ6R0MBwsgEEKAgYKEiJCgwIB/gyEOAkACQAJAAkAgC0UNAEEBIQsMAQsgDkIAUiELIA56p0EDdiABaiAFcSEKIA5QDQELIA4gEEIBhoNCAFINAQsgASAMQQhqIgxqIAVxIQEMAQsLAkAgAiAKaiwAAEEASA0AIAIpAwBCgIGChIiQoMCAf4N6p0EDdiEKCyAAKAIMIgEgCmoiAi0AACEFIAAoAgghBiACIA06AAAgASAAKAIQIApBeGpxakEIaiANOgAAIAEgCkECdGtBfGogBjYCACAAIAAoAhhBAWo2AhggACAAKAIUIAVBAXFrNgIUIAQoAgghAiAEKQMAIQ4gACgCCCIBIAAoAgBHDQQgACgCGCAAKAIUaiIFQdWq1SogBUHVqtUqSRsgAWsiBUEBTQ0DIAAgASAFQQhBGBD0CyEFIAAoAgghASAFQYGAgIB4Rw0DDAQLAAsgCSAGQaylmgEQwxIACyABIANBhKeaARDDEgALIAAgAUEBQQhBGBC4CyAAKAIIIQELAkAgASAAKAIARw0AIAAQhBkLIAAgAUEBajYCCCAAKAIEIAFBGGxqIgEgAzYCECABIAI2AgggASAONwMACyAEQRBqJAALsAwCDX8EfiMAQTBrIgMkAAJAAkACQAJAAkAgACgCDCIEIAFqIgEgBEkNAAJAIAEgACgCBCIFIAVBAWoiBkEDdiIHQQdsIAVBCEkbIgVBAXZNDQACQAJAIAVBAWoiBSABIAUgAUsbIgFBD0kNACABQf////8BSw0DQX8gAUEDdEEHbkF/amd2QQFqIQEMAQtBBEEIQRAgAUEISRsgAUEESRshAQsgA0EgakEQQQggARDHDSADKAIkIQggAygCICIJRQ0FIAMpAighEAJAIAhBCWoiAUUNACAJQf8BIAH8CwALIAMgEEIgiD4CHCADIBCnIgo2AhggAyAINgIUIAMgCTYCECADQQg2AgxBACEHQQAhAQJAIARFDQAgCUEIaiELIAAoAgAiBikDAEJ/hUKAgYKEiJCgwIB/gyEQQQAhASAEIQwgBiEFA0ACQCAQQgBSDQADQCABQQhqIQEgBUEIaiIFKQMAQoCBgoSIkKDAgH+DIhBCgIGChIiQoMCAf1ENAAsgEEKAgYKEiJCgwIB/hSEQCwJAIAkgCCAGIBB6p0EDdiABaiINQQR0ayIOQXBqKQMAIA5BeGooAgAQnRoiEadxIg5qKQAAQoCBgoSIkKDAgH+DIhJCAFINAEEIIQ8DQCAOIA9qIQ4gD0EIaiEPIAkgDiAIcSIOaikAAEKAgYKEiJCgwIB/gyISUA0ACwsgEEJ/fCETAkAgCSASeqdBA3YgDmogCHEiDmosAABBAEgNACAJKQMAQoCBgoSIkKDAgH+DeqdBA3YhDgsgEyAQgyEQIAkgDmogEUIZiKciDzoAACALIA5BeGogCHFqIA86AAAgCSAOQX9zQQR0aiIOQQhqIAYgDUF/c0EEdGoiDUEIaikAADcAACAOIA0pAAA3AAAgDEF/aiIMDQALIAQhAQsgAyABNgIcIAMgCiABazYCGAJAA0AgB0EQRg0BIAAgB2oiASgCACEFIAEgA0EEaiAHakEMaiIJKAIANgIAIAkgBTYCACAHQQRqIQcMAAsLIAMoAhQiAUUNBCABIAFBBHRBF2pBcHEiBWpBCWoiAUUNBCADKAIQIAVrIAFBCBC9EwwECyAAKAIAIQECQCAHIAZBB3FBAEdqIgdFDQAgASEFA0AgBSAFKQMAIhBCf4VCB4hCgYKEiJCgwIABgyAQQv/+/fv379+//wCEfDcDACAFQQhqIQUgB0F/aiIHDQALCwJAIAZBCEkNACABIAZqIAEpAAA3AAAMAgsCQCAGRQ0AIAFBCGogASAG/AoAAAsgBg0BQQAhAQwCCxCHHAALQQEhDkEAIQlBACEHA0AgByEFIA4hBwJAIAEgBWotAABBgAFHDQAgASAJaiEPIAEgBUF/c0EEdGohC0EAIAVrQQR0IQ0CQANAIAEgDWoiDkFwaikDACAOQXhqKAIAEJ0aIRAgACgCBCIOIBCncSIIIQwCQCABIAhqKQAAQoCBgoSIkKDAgH+DIhJCAFINAEEIIQQgCCEMA0AgDCAEaiEMIARBCGohBCABIAwgDnEiDGopAABCgIGChIiQoMCAf4MiElANAAsLAkAgASASeqdBA3YgDGogDnEiDGosAABBAEgNACABKQMAQoCBgoSIkKDAgH+DeqdBA3YhDAsCQCAMIAhrIAUgCGtzIA5xQQhJDQAgASAMaiIILQAAIQQgCCAQQhmIpyIKOgAAIAAoAgAiCCAMQXhqIA5xakEIaiAKOgAAIARB/wFGDQIgASAMQQR0ayEEQXAhAQJAA0AgAUUNASAPIAFqIg4oAAAhCCAOIAQgAWoiDCgAADYAACAMIAg2AAAgAUEEaiEBDAALCyAAKAIAIQEMAQsLIAEgBWogEEIZiKciCDoAACAAKAIAIgEgDiAFQXhqcWpBCGogCDoAAAwBCyAIIAVqQf8BOgAAIAggACgCBCAFQXhqcWpBCGpB/wE6AAAgASAMQX9zQQR0aiIBQQhqIAtBCGopAAA3AAAgASALKQAANwAAIAghAQsgCUFwaiEJIAcgByAGSSIFaiEOIAUNAAsgACgCBCIBIAFBAWpBA3ZBB2wgAUEISRshAQsgACABIAAoAgxrNgIIC0GBgICAeCEICyADQTBqJAAgCAv5DAIJfwF+IwBBwABrIgMkACADQShqQRBBAUEBEKMOIAMoAiwhBAJAAkACQCADKAIoQQFGDQBBACEFIANBADYCDCADIAMoAjA2AgggAyAENgIEQd8ArUIghiADQRBqrYQhDEEBIQYDQCABKAJoIQcgASgCXCEIIAEoAlghBAJAAkACQAJAA0AgCEUNAQJAAkACQAJAAkACQCAELAAAIglBf0oNACAELQABQT9xIQogCUEfcSELAkAgCUFgTw0AIAtBBnQgCnIhCQwDCyAKQQZ0IAQtAAJBP3FyIQogCUFwTw0BIAogC0EMdHIhCQwCCyAJQf8BcSIKQcCtmQFqLQAADQIgBkEBcUUNBCAKQcCsmQFqLQAAQQFHDQQgASAHQQFqIgc2AmggASAIQX9qIgg2AlwgBEEBaiEEDAMLIApBBnQgBC0AA0E/cXIgC0ESdEGAgPAAcXIiCUGAgMQARg0FCwJAAkACQAJAQaHamAEgCUEJdkHI9psBaiAJQf+DOEsbLQAAQQV0IAlBA3ZBP3FqQYCFnAFqLQAAIAlBB3F2QQFxDQAgBkEBcQ0BDAgLIAlBgAFPDQFBASEJDAILIAkQsRpFDQYCQAJAIAlBgAFPDQBBASEJDAELAkAgCUGAEE8NAEECIQkMAQtBA0EEIAlBgIAESRshCQsgASAHIAlqIgc2AmggASAIIAlrIgg2AlwgBCAJaiEEDAMLAkAgCUGAEE8NAEECIQkMAQtBA0EEIAlBgIAESRshCQsgASAHIAlqIgc2AmggASAIIAlrIgg2AlwgASAEIAlqIgQ2AlgMAwsgASAHQQFqIgc2AmggASAIQX9qIgg2AlwgASAEQQFqIgQ2AlgMAgsgASAENgJYQQAhBgwBCwsgCUHcAEcNACABIAhBf2oiCTYCXCABIARBAWoiBDYCWCABIAEoAmgiCEEBajYCaAJAAkAgCUUNACAELQAAQfUARg0BCyADQZyAgIB4NgIoIAggCCADQShqEOQjIQQMBwsgA0EEaiABKAJgIAIgASgCbGtqIgQgBCAIIAJrahCPGyADQShqIAEQxQMgAygCLCEEAkACQAJAIAMoAigOBAIAAQkCCyADQQRqIAQQrgogA0GWgICAeDYCKCABIAggA0EoahCVIgwFCyADIAQ2AhAgA0EBNgI8IANB5MmZATYCOCADQQE2AiwgA0HcyZkBNgIoIANBATYCNCADIAw3AyAgAyADQSBqNgIwIANBFGogA0EoahDRDSADKAIUIQkgA0EEaiADKAIYIgQgBCADKAIcahCPGyAJIAQQvSIgA0GWgICAeDYCKCABIAggA0EoahCVIgwECwJAAkAgBEH/AEsNACAEQcCtmQFqLQAAQQFHDQFBASEIIAMoAgwhBwwEC0Gh2pgBIARBCXZByPabAWogBEH/gzhLGy0AAEEFdCAEQQN2QT9xakGAhZwBai0AACAEQQdxdkEBcUUNACADKAIMIQcMAgsgA0GWgICAeDYCKCABIAggA0EoahCVIiADKAIMIQcgBEGAAU8NAUEBIQgMAgsgASABKAJkIAEoAmggASgCbCIEayIIazYCXCABIAEoAmAiCSAIaiIHNgJYIAkgAiAEayIKaiEEQQEhAQJAAkAgBUEBcQ0AIAMoAgQgAygCCBC9IiAIIAprIQhBACEBQYCAgIB4IQkMAQsgA0EEaiAEIAcQjxsgAygCDCEIIAMoAgghBCADKAIEIQkLIAAgAToADCAAIAg2AgggACAENgIEIAAgCTYCAAwGCwJAIARBgBBPDQBBAiEIDAELQQNBBCAEQYCABEkbIQgLIANBBGogCBCOHiADKAIIIAMoAgxqIQkCQAJAAkAgBEGAAUkNACAEQYAQSQ0BAkAgBEGAgARJDQAgCSAEQT9xQYABcjoAAyAJIARBEnZB8AFyOgAAIAkgBEEGdkE/cUGAAXI6AAIgCSAEQQx2QT9xQYABcjoAAQwDCyAJIARBP3FBgAFyOgACIAkgBEEMdkHgAXI6AAAgCSAEQQZ2QT9xQYABcjoAAQwCCyAJIAQ6AAAMAQsgCSAEQT9xQYABcjoAASAJIARBBnZBwAFyOgAACyADIAggB2o2AgwLIAEoAmghAkEAIQZBASEFDAALCyAEIAMoAjBBsKibARDYIAALIABBgYCAgHg2AgAgACAENgIEIAMoAgQgAygCCBC9IgsgA0HAAGokAAvADQEQfyMAQZACayIEJAACQAJAIAIoAggiBQ0AIABBADYCCCAAQoCAgICAATcCAAwBCyAEQShqIAVBCEEoQbi8mwEQ2RYgBEEANgI8IAQgBCgCLCIGNgI4IAQgBCgCKDYCNCAFQX9qIAIoAggiBxCWHyEIIAJBADYCCCAEIAg2ApQBIAQgAjYCkAEgBCAHIAhrNgKYASAEIAIoAgQiByAIQShsaiIJNgKMASAFQShsQVhqIQogB0EoaiELIARB2AFqQQhqIQwgBEHAAGpBEGohDSAEQcAAakEEciEOQQAhBQJAAkACQANAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIApFDQAgBygCACIIQQhHDQEgCyEJCyAEIAk2AogBIARBiAFqEJsKIAIoAggiB0UNASACIAdBf2oiBzYCCCACKAIEIAdBKGxqIgcoAgAiCkEIRg0BIAQgCjYCiAEgBEGIAWpBBHIhCAJAQSRFDQAgCCAHQQRqQST8CgAACyAKQQdGDQIgBEEQaiAEQYgBahCrDiAEQYgCaiAHQSRqKAIANgIAIAQgBykCHDcDgAIgBCgCoAEhDyAEKAKcASEMIAQoApgBIQYgBCgClAEhECAEKAKQASERIAQoAowBIQsgCkECRw0OIAMoAgBFDQ4gAygCBCEHIAMoAgghCCAEQbqAgIB4NgLYASABIAcgCCAEQdgBahDeHEECIQoMDgsgBCAINgJAAkBBJEUNACAOIAdBBGpBJPwKAAALIAhBB0YiEA0CIAhBAkYNAwJAIAUgBCgCNEcNACAEQTRqQfi8mwEQthgLIAQoAjghBgJAQShFDQAgBiAFQShsaiAEQcAAakEo/AoAAAsgBCAFQQFqIgU2AjwgEEUNCQwHC0HIvJsBEMkiAAsgBEEIaiAIEIsSAkAgBCgCjAFBAUcNACAEKAKUASEMIAQoApABIQYCQCAEKAKYASIHKAIAQXRqQSVNDQAgBCgCDCEIIAQoAgghCiAEQYCBgIB4NgLYASABIAogCCAEQdgBahDeHAsCQCADKAIAQQFHDQAgAygCCCEIIAMoAgQhCiAEQbqAgIB4NgLYASABIAogCCAEQdgBahDeHAsgBCAHENIDIAQoAgQhECAEKAIAIREgBEGwAWogAUEAIAcQcgJAIAQoArABQQdGDQBBCEEoEJkiIgtFDQUCQEEoRQ0AIAsgBEGwAWpBKPwKAAALQQIhCkEAIQ8MDQsgBCgCtAEhCwwKCyAEQdgBaiABQQAgBCgCmAEQciAEKALcASELIAQoAtgBIgpBB0YNCSAEQYgCaiAEQfwBaigCADYCACAEIAQpAvQBNwOAAiAEKALwASEPIAQoAuwBIQwgBCgC6AEhBiAEKALkASEQIAQoAuABIREMCwsgBCgCRA0BIARB2AFqIAFBACAEKAJQEHIgBCgC3AEhEAJAIAQoAtgBIhFBB0cNACAEIAs2AogBIABBgICAgHg2AgAgACAQNgIEIARBiAFqEJsKDAoLIARB6ABqQRhqIg8gDEEYaikDADcDACAEQegAakEQaiISIAxBEGopAwA3AwAgBEHoAGpBCGoiEyAMQQhqKQMANwMAIAQgDCkDADcDaAJAIAUgBCgCNEcNACAEQTRqQei8mwEQthggBCgCOCEGCyAGIAVBKGxqIgggEDYCBCAIIBE2AgAgCCAEKQNoNwMIIAhBIGogDykDADcDACAIQRhqIBIpAwA3AwAgCEEQaiATKQMANwMAIAQgBUEBaiIFNgI8IAQoAkBBB0YNBgwFCyAEQSBqIARBwABqEKsOIAQoAiQhCCAEKAIgIREMAgsgBEEYaiAOEIsSIAQoAhwhCCAEKAIYIREMAQsACyAEQfiAgIB4NgLYASABIBEgCCAEQdgBahDeHCAQRQ0BCyANEJohDAELIARBwABqEKQUCyAHQShqIQcgC0EoaiELIApBWGohCgwACwsgAEGAgICAeDYCACAAIAs2AgQLIARBNGoQgiAMAQsCQCAFIAQoAjRHDQAgBEE0akHYvJsBELYYCyAEKAI4IgcgBUEobCISaiIIIAQpA4ACNwIcIAggDzYCGCAIIAw2AhQgCCAGNgIQIAggEDYCDCAIIBE2AgggCCALNgIEIAggCjYCACAIQSRqIARBgAJqQQhqKAIANgIAIAQgBUEBajYCPAJAIAEtAHhBCHFFDQAgEkEoaiEFA0AgBUUNASABIAcQ+gkgBUFYaiEFIAdBKGohBwwACwsgACAEKQI0NwIAIABBCGogBEE0akEIaigCADYCAAsgAhCOEyAEQZACaiQAC54NAgx/AX4jAEHAAWsiAyQAIANCBDcCJCADQgA3AhwgA0KAgICAwAA3AhQgA0EANgIwIAMgATYCLCADQSBqIQQCQANAIAJBBGoiASgCACEFQdgAIQYCQAJAAkACQAJAIAIoAgAODAQEBAQEBAQDAAECAgQLQSghBgwCC0EwIQYMAQtBDCEGCyADQYABaiADQSxqIAUgBmoQ0wsgAygCgAEiBkEiRg0AAkBBPEUNACAAQQRqIANBgAFqQQRqQTz8CgAACyAAIAY2AgAMAgsgASgCACEBAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAIoAgBBeWoOBQANAgEEBwsgASABKAIAQYiAxABGIgZBAnRqIQEDQAJAAkAgBkEBcUUNACADQYABaiADQSxqIAFBCGoQ0wsgAygCgAEiB0EiRg0BIAMpAowBIQ8gAygCiAEhASADKAKEASEGQSxFDRMgA0E0aiADQZQBakEs/AoAAAwTCyABKAIAQYCAvH9qIgVBAiAFQQhJGyIFQQZJDQACQAJAAkAgBUF6ag4CAAEACyABKAIEQdgAaiEFDAELIAFBEGohBQsgA0GAAWogA0EsaiAFENMLIAMoAoABIgdBIkYNACADKQKMASEPIAMoAogBIQEgAygChAEhBkEsRQ0SIANBNGogA0GUAWpBLPwKAAAMEgsgA0HgAGogBiABENUNAkAgAygCYEEERg0AIANBCGogA0HgAGoQ8REgAygCDCEIIAMoAgghCQJAIAMoAigiByADKAIgRw0AIAQQ/hcLIAMoAiQgB0EYbGoiBSABNgIEIAUgBjYCACAFIAMpAmA3AgggBUEQaiADQeAAakEIaikCADcCACADIAdBAWo2AiggCCEBIAkhBgwBCyADQYABaiAGIAEgA0EsahDJEwJAIAMoAoABIgdBIkYNACADKQKMASEPIAMoAogBIQEgAygChAEhBkEsRQ0SIANBNGogA0GUAWpBLPwKAAAMEgsgAygCKCIIRQ0GIAMoAiQgCEEYbGpBaGohBQJAAkACQANAIAUoAgAiB0ECRg0BIAVBFGooAgAhASAFQQRqKAIAIQkCQAJAAkAgBUEIaiIKKAIADgQAAgECAAsgAUUNASAFQRBqKAIAIgZB2ABqIQsgAUF/aiEMQQAhDQwFCyAFKAIMIQZBAyENIAEhCwwECyADQYABaiAHIAkgA0EsahDJEwJAIAMoAoABIgdBIkYNACADKQKMASEPIAMoAogBIQEgAygChAEhBkEsRQ0WIANBNGogA0GUAWpBLPwKAAAMFgsgBUFoaiEFIAhBf2oiCA0AC0EAIQEMAQsgCEF/aiEBCyADIAE2AigMBwsgA0HwAGpBCGoiDiALNgIAIAMgDDYCfCADIAY2AnQgAyANNgJwIAMgA0HwAGoQ8REgAygCBCEBIAMoAgAhBiAFIAk2AgQgBSAHNgIAIApBCGogDikCADcCACAKIAMpAnA3AgAgAyAINgIoDAALCyABKAIIIgYNAQwEC0EsIQZBASEIDAsLIAZBf2ohBiABKAIEIgFBCGohBUEDIQgMAQsgASgCCCIGRQ0BIAZBf2ohBiABKAIEIgFBCGohBUECIQgLIAatQiCGIAWthCEPIAEhBwwJCyACKAIAQQZLDQELIAMoAjAhCAwBCyADKAIwIgFFDQEgAUF/aiEICwJAIAMoAhwiBkUNACADKAIYIAZBFGxqQWxqIQEDQCABQQRqKAIAIgVBBEYNASABQRBqKAIAIQkgASgCACEHAkACQCAFDgQBAQAAAQsgCQ0FCwJAIAcoAgBBB0kNACAIRQ0EIAhBf2ohCAsgAUFsaiEBIAZBf2oiBg0ACwsgAEEiNgIADAkLQfiOhQEQySIAC0H4joUBEMkiAAsgASAFNgIEIAEgBzYCACABIAlBf2o2AhAgASABKAIMIgc2AgggASAHQQhqNgIMIAMgCDYCMAwDC0EkIQZBACEIC0IAIQ8gASAGaigCACEHCwJAIAMoAhwiBSADKAIURw0AIANBFGoQ/xcLIAMoAhggBUEUbGoiBiAPNwIMIAYgATYCCCAGIAg2AgQgBiACNgIAIAVBAWohBgsgAyAGNgIcIAchAgwBCwsCQEEsRQ0AIABBFGogA0E0akEs/AoAAAsgACAPNwIMIAAgATYCCCAAIAY2AgQgACAHNgIACyADKAIUIAMoAhhBBEEUENASIAMoAiAgAygCJEEEQRgQ0BIgA0HAAWokAAuqDAIQfwN+IwBBMGsiAiQAAkACQAJAAkACQCAAKAIMIgNBf0YNAAJAIAMgACgCBCIEIARBAWoiBUEDdiIGQQdsIARBCEkbIgRBAXZJDQACQAJAIAQgAyAEIANLGyIEQQ5JDQAgBEH+////AUsNA0F/IARBA3RBCGpBB25Bf2pndkEBaiEEDAELQQRBCEEQIARBB0kbIARBA0kbIQQLIAJBIGpBDEEIIAQQxw0gAigCJCEHIAIoAiAiCEUNBSACKQIoIRICQCAHQQlqIgRFDQAgCEH/ASAE/AsACyACIBJCIIg+AhwgAiASpyIJNgIYIAIgBzYCFCACIAg2AhAgAkEINgIMQQAhCkEAIQQCQCADRQ0AIAhBCGohCyAAKAIAIgxBdGohDSAMKQMAQn+FQoCBgoSIkKDAgH+DIRJBACEEIAMhBSAMIQYDQAJAIBJCAFINAANAIARBCGohBCAGQQhqIgYpAwBCgIGChIiQoMCAf4MiEkKAgYKEiJCgwIB/UQ0ACyASQoCBgoSIkKDAgH+FIRILAkAgCCAHIA1BACASeqdBA3YgBGoiDmtBDGxqKAIAQd3L3Z55bEEPdyIPcSIQaikAAEKAgYKEiJCgwIB/gyITQgBSDQBBCCERA0AgECARaiEQIBFBCGohESAIIBAgB3EiEGopAABCgIGChIiQoMCAf4MiE1ANAAsLIBJCf3whFAJAIAggE3qnQQN2IBBqIAdxIhBqLAAAQQBIDQAgCCkDAEKAgYKEiJCgwIB/g3qnQQN2IRALIBQgEoMhEiAIIBBqIA9BGXYiDzoAACALIBBBeGogB3FqIA86AAAgCCAQQX9zQQxsaiIQQQhqIAwgDkF/c0EMbGoiDkEIaigAADYAACAQIA4pAAA3AAAgBUF/aiIFDQALIAMhBAsgAiAENgIcIAIgCSAEazYCGAJAA0AgCkEQRg0BIAAgCmoiBCgCACEGIAQgAkEEaiAKakEMaiIIKAIANgIAIAggBjYCACAKQQRqIQoMAAsLIAIoAhQiBEUNBCAEIARBDGxBE2pBeHEiBmpBCWoiBEUNBCACKAIQIAZrIARBCBC9EwwECyAAKAIAIQQCQCAGIAVBB3FBAEdqIgpFDQAgBCEGA0AgBiAGKQMAIhJCf4VCB4hCgYKEiJCgwIABgyASQv/+/fv379+//wCEfDcDACAGQQhqIQYgCkF/aiIKDQALCwJAIAVBCEkNACAEIAVqIAQpAAA3AAAMAgsCQCAFRQ0AIARBCGogBCAF/AoAAAsgBQ0BQQAhBAwCCxCHHAALQQEhEEEAIQhBACEKA0AgCiEGIBAhCgJAIAQgBmotAABBgAFHDQAgBCAIaiELIAQgBkF/c0EMbGohDUEAIAZrQQxsIQwCQANAIAAoAgQiECAEIAxqQXRqKAIAQd3L3Z55bEEPdyIPcSIHIQ4CQCAEIAdqKQAAQoCBgoSIkKDAgH+DIhJCAFINAEEIIQMgByEOA0AgDiADaiEOIANBCGohAyAEIA4gEHEiDmopAABCgIGChIiQoMCAf4MiElANAAsLAkAgBCASeqdBA3YgDmogEHEiDmosAABBAEgNACAEKQMAQoCBgoSIkKDAgH+DeqdBA3YhDgsgD60hEgJAIA4gB2sgBiAHa3MgEHFBCEkNACAEIA5qIgctAAAhDyAHIBJCGYinIgM6AAAgACgCACIHIA5BeGogEHFqQQhqIAM6AAAgD0H/AUYNAkF0IRAgBCAOQXRsaiEPAkADQCAQRQ0BIAsgEGoiBCgAACEHIAQgDyAQaiIOKAAANgAAIA4gBzYAACAQQQRqIRAMAAsLIAAoAgAhBAwBCwsgBCAGaiASQhmIpyIHOgAAIAAoAgAiBCAQIAZBeGpxakEIaiAHOgAADAELIAcgBmpB/wE6AAAgByAAKAIEIAZBeGpxakEIakH/AToAACAEIA5Bf3NBDGxqIgRBCGogDUEIaigAADYAACAEIA0pAAA3AAAgByEECyAIQXRqIQggCiAKIAVJIgZqIRAgBg0ACyAAKAIEIgQgBEEBakEDdkEHbCAEQQhJGyEECyAAIAQgACgCDGs2AggLQYGAgIB4IQcLIAJBMGokACAHC5YNAQl/IwBBwABrIgMkACAALQABIQRBACEFIAAtAAAhBiAALQAFIQcCQAJAIAAsAAkiCA0AIARBBEcNACAHQf8BcUEERw0AIAZBAXFFDQELAkAgAUHy3YIBQQIgAigCDCIJEQwADQAgCEEARyAGciEKAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgBEEERw0AIAdB/wFxQQRGDQEgACgABSEADAMLIAAoAAEiBUEIdiELAkACQAJAAkACQCAFQf8BcQ4EAgABAwILIAEgC0H/AXFBgAFzQQJ0QbyJnQFqKAIAQRAgCREMAA0lDAMLIAEgC0GAAXNB/wFxQQJ0IgVBvJmdAWooAgAgBUG8kZ0BaigCACACKAIMIgkRDAANJAwCCyABIAvAQQJ0QfiInQFqKAIAQQIgCREMAA0jDAELIAMgCzoAASADIAVBGHY6AAMgAyAFQRB2OgACIAMgA0EBajYCBEEBIQUgAyADQQFqQQFqNgIIIAMgA0EDajYCDCADQQM2AhQgA0HglIMBNgIQIANCAzcCHCADQe8ANgI8IANB7wA2AjQgA0HvADYCLCADIANBKGo2AhggAyADQQxqNgI4IAMgA0EIajYCMCADIANBBGo2AiggASACIANBEGoQ9AUNIwsgB0H/AXFBBEcNAQsgCkEBcUUNHyAGQQFxDQMgBEEERyEFDAILIAAoAAUhAEEBIQUgAUGnm5sBQQEgCREMAA0gCyAAQQh2IQQCQAJAAkACQAJAIABB/wFxDgQDAAECAwtBASEFIAEgBEH/AXFBgAFzQQJ0QcSinQFqKAIAQRAgAigCDCIJEQwARQ0DDCMLQQEhBSABIARBgAFzQf8BcUECdCIAQcSynQFqKAIAIABBxKqdAWooAgAgAigCDCIJEQwARQ0CDCILIAMgBDoAASADIABBGHY6AAMgAyAAQRB2OgACIAMgA0EBajYCBEEBIQUgAyADQQFqQQFqNgIIIAMgA0EDajYCDCADQQM2AhQgA0GAlYMBNgIQIANCAzcCHCADQe8ANgI8IANB7wA2AjQgA0HvADYCLCADIANBKGo2AhggAyADQQxqNgI4IAMgA0EIajYCMCADIANBBGo2AiggASACIANBEGoQ6iBFDQEMIQtBASEFIAEgBMBBAnQiAEGAop0BaigCACAAQbyhnQFqKAIAIAkRDAANIAtBASEFIApBAXFFDR0gBkEBcQ0CCyAIRQ0cIAhBAXENAyAIQQJxRQ0IIAUNBwwJCyAEQQRGDQELQQEhBSABQaebmwFBASAJEQwADRwLQQEhBSABQfTdggFBASAJEQwADRsgCEUNGUEBIQUgCEEBcUUNAQwCCyAFDQEMAgsgCEECcQ0CDAMLQQEhBSABQaebmwFBASAJEQwADRgLQQEhBSABQfXdggFBASAJEQwADRdBASEFIAhBAnFFDQELQQEhBSABQaebmwFBASACKAIMIgkRDABFDQEMFgsCQCAIQQRxDQAgCEEIcUUNCCACKAIMIQkgBQ0GDAkLIAIoAgwhCSAFDQEMAwtBASEFIAFB9t2CAUEBIAkRDAANFCAIQQRxRQ0BC0EBIQUgAUGnm5sBQQEgCREMAEUNAQwTCyAIQQhxDQEMAwtBASEFIAFB992CAUEBIAkRDAANESAIQQhxRQ0CDAELIAIoAgwhCQtBASEFIAFBp5ubAUEBIAkRDABFDQIMDwtBASEFCwJAIAhBEHENACAIQSBxRQ0HIAIoAgwhCSAFDQUMCAsgAigCDCEJIAUNAQwDC0EBIQUgAUH43YIBQQEgCREMAA0MIAhBEHFFDQELQQEhBSABQaebmwFBASAJEQwARQ0BDAsLIAhBIHENAQwCC0EBIQUgAUH53YIBQQEgCREMAA0JIAhBIHFFDQELQQEhBSABQaebmwFBASAJEQwARQ0CDAgLQQEhBQsgAigCDCEJIAhBwABxRQ0DIAUNAQwCC0EBIQUgAUH63YIBQQEgCREMAA0FQQEhBSAIQcAAcUUNAgtBASEFIAFBp5ubAUEBIAkRDAANBAtBASEFIAFB+92CAUEBIAkRDAANAwsgCEF/Sg0AAkAgBUUNAEEBIQUgAUGnm5sBQQEgCREMAA0DC0EBIQUgAUH83YIBQQEgCREMAA0CCyABQYiPhQFBASAJEQwAIQUMAQtBASEFCyADQcAAaiQAIAULwgwBBX8jAEHAAmsiAiQAAkACQAJAAkACQAJAAkACQAJAIAAoAgAOCQABAgMGBQgECAALIAAoAhwiAEUNByAAQQhqKAIAIgNFDQcgAEEEaigCACEAIANBDGwhAwNAIAAgARDVASAAQQxqIQAgA0F0aiIDDQAMCAsLIABBCGogARDNAQwGCyAAKAIcIgBFDQUgAEEIaigCACIDRQ0FIABBBGooAgAhACADQQxsIQMDQCAAIAEQ1QEgAEEMaiEAIANBdGoiAw0ADAYLCwJAIAAoAggOAwAEBQALAkAgACgCKCIEQQhqKAIAIgBFDQAgBEEEaigCACEDIABBDGwhBQNAAkACQCADKAIAIgAoAgBBGkcNACACQYACaiABKAIAIAEoAgQgAEEIaiIGEIINIAIoAoACQTJGDQEgABDRASAAQThqIAJBgAJqQThqKQMANwMAIABBMGogAkGAAmpBMGopAwA3AwAgAEEoaiACQYACakEoaikDADcDACAAQSBqIAJBgAJqQSBqKQMANwMAIABBGGogAkGAAmpBGGopAwA3AwAgAEEQaiACQYACakEQaikDADcDACAGIAJBgAJqQQhqKQMANwMAIAAgAikDgAI3AwAMAQsgACABEEYLIANBDGohAyAFQXRqIgUNAAsLAkAgBEEUaigCACIDRQ0AIARBEGooAgAhACADQdgAbCEDA0AgACABEGkgAEHYAGohACADQah/aiIDDQALCyAEKAIwIgBFDQQCQCAAKAIAQRpHDQAgAkHAAWogASgCACABKAIEIABBCGoiARCCDSACKALAAUEyRg0FIAAQ0QEgAEE4aiACQcABakE4aikDADcDACAAQTBqIAJBwAFqQTBqKQMANwMAIABBKGogAkHAAWpBKGopAwA3AwAgAEEgaiACQcABakEgaikDADcDACAAQRhqIAJBwAFqQRhqKQMANwMAIABBEGogAkHAAWpBEGopAwA3AwAgASACQcABakEIaikDADcDACAAIAIpA8ABNwMADAULIAAgARBGDAQLAkAgACgCBCIAKAIAQRpHDQAgAkHAAGogASgCACABKAIEIABBCGoiARCCDSACKAJAQTJGDQQgABDRASAAQThqIAJBwABqQThqKQMANwMAIABBMGogAkHAAGpBMGopAwA3AwAgAEEoaiACQcAAakEoaikDADcDACAAQSBqIAJBwABqQSBqKQMANwMAIABBGGogAkHAAGpBGGopAwA3AwAgAEEQaiACQcAAakEQaikDADcDACABIAJBwABqQQhqKQMANwMAIAAgAikDQDcDAAwECyAAIAEQRgwDCyAAKAIQIgBFDQIgAEEIaigCACIDRQ0CIABBBGooAgAhACADQQxsIQMDQCAAIAEQ1QEgAEEMaiEAIANBdGoiAw0ADAMLCwJAIAAoAgQiACgCAEEaRw0AIAIgASgCACABKAIEIABBCGoiARCCDSACKAIAQTJGDQIgABDRASAAQThqIAJBOGopAwA3AwAgAEEwaiACQTBqKQMANwMAIABBKGogAkEoaikDADcDACAAQSBqIAJBIGopAwA3AwAgAEEYaiACQRhq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QCAALQAcQQJGDQAgACkDCCIFQgODQgBSDQAgBaciAiACKAIAIgNBf2o2AgAgA0EBRw0AIAIgAigCEBDpHQsgACgCKCICRQ0AIAIoAgAiABDAAiAAQeAAQQgQvRMgAkEMQQQQvRMPCwvlCwEHfyMAQcACayICJAACQCAAKAIIIgNFDQAgACgCBCIEIANBKGxqIQUDQAJAAkACQAJAAkACQAJAIAQoAgAOBQYAAQIFBgsgBCgCBEEBRw0FIAQoAggiACgCAEEaRw0DIAJBwAFqIAEoAgAgASgCBCAAQQhqIgMQgg0gAigCwAFBMkYNBSAAENEBIABBOGogAkHAAWpBOGopAwA3AwAgAEEwaiACQcABakEwaikDADcDACAAQShqIAJBwAFqQShqKQMANwMAIABBIGogAkHAAWpBIGopAwA3AwAgAEEYaiACQcABakEYaikDADcDACAAQRBqIAJBwAFqQRBqKQMANwMAIAMgAkHAAWpBCGopAwA3AwAgACACKQPAATcDAAwFCyAEKAIEIgAoAgBBGkcNASACQYABaiABKAIAIAEoAgQgAEEIaiIDEIINIAIoAoABQTJGDQQgABDRASAAQThqIAJBgAFqQThqKQMANwMAIABBMGogAkGAAWpBMGopAwA3AwAgAEEoaiACQYABakEoaikDADcDACAAQSBqIAJBgAFqQSBqKQMANwMAIABBGGogAkGAAWpBGGopAwA3AwAgAEEQaiACQYABakEQaikDADcDACADIAJBgAFqQQhqKQMANwMAIAAgAikDgAE3AwAMBAsCQCAEKAIEIgYtAGxBAkcNACAGQcAAaiEAA0AgACgCGCIALQAsQQJGDQALCwJAIAZBhAFqKAIAIgNFDQAgBkGAAWooAgAhACADQdgAbCEDA0ACQAJAAkACQCAAKAIAQXxqDgIDAAELIABBBGooAgAiBygCAEEaRw0BIAJBgAJqIAEoAgAgASgCBCAHQQhqIggQgg0gAigCgAJBMkYNAiAHENEBIAdBOGogAkGAAmpBOGopAwA3AwAgB0EwaiACQYACakEwaikDADcDACAHQShqIAJBgAJqQShqKQMANwMAIAdBIGogAkGAAmpBIGopAwA3AwAgB0EYaiACQYACakEYaikDADcDACAHQRBqIAJBgAJqQRBqKQMANwMAIAggAkGAAmpBCGopAwA3AwAgByACKQOAAjcDAAwCCyAAIAEQjAkMAQsgByABEEYLIABB2ABqIQAgA0Gof2oiAw0ACwsCQCAGQZgBaigCACIARQ0AIABBKGwhAyAGQZQBaigCAEEEaiEAA0ACQAJAAkACQAJAAkACQCAAQXxqKAIADgUGAAECAwYLIAAoAgBBAUcNBSAAQQRqKAIAIgcoAgBBGkcNAyACQcAAaiABKAIAIAEoAgQgB0EIaiIIEIINIAIoAkBBMkYNBSAHENEBIAdBOGogAkHAAGpBOGopAwA3AwAgB0EwaiACQcAAakEwaikDADcDACAHQShqIAJBwABqQShqKQMANwMAIAdBIGogAkHAAGpBIGopAwA3AwAgB0EYaiACQcAAakEYaikDADcDACAHQRBqIAJBwABqQRBqKQMANwMAIAggAkHAAGpBCGopAwA3AwAgByACKQNANwMADAULIAAoAgAiBygCAEEaRw0DIAIgASgCACABKAIEIAdBCGoiCBCCDSACKAIAQTJGDQQgBxDRASAHQThqIAJBOGopAwA3AwAgB0EwaiACQTBqKQMANwMAIAdBKGogAkEoaikDADcDACAHQSBqIAJBIGopAwA3AwAgB0EYaiACQRhqKQMANwMAIAdBEGogAkEQaikDADcDACAIIAJBCGopAwA3AwAgByACKQMANwMADAQLIAAgARDpBgwDCyAAIAEQwQIMAgsgByABEEYMAQsgByABEEYLIABBKGohACADQVhqIgMNAAsLIAYtADwiAEEGRg0DIABBAkcNAyAGQRBqIQADQCAAKAIYIgAtACxBAkYNAAwECwsgACABEEYMAgsgACABEEYMAQsgBEEMaigCACIDRQ0AIARBCGooAgAhACADQShsIQMDQCABIAAQygIgAEEoaiEAIANBWGoiAw0ACwsgBEEoaiIEIAVHDQALCyACQcACaiQAC8gMAhR/A34jAEHQAGsiAiQAIAAoAgAhAwJAAkAgASgCACIEQZD6gwFBDiABKAIEIgUoAgwiBhEMAA0AIAMoAhQiByADKAKwAiIBdiEIIAFBH3EhCSADKAIQIQogAygCrAIhC0EAIQwCQAJAA0ACQAJAAkACQCAMIAhGDQAgAiADIAwQ+xoiFjcDACAMRQ0BIBZC////////flgNAiAEQbD7gwFBAiAGEQwADQcMAwtBASENIARBqKab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KQMANwMAIAAgAkEIaikDADcDACABIAIpAwA3AwAMBAsCQCABKAIEIgMtAGxBAkcNACADQcAAaiEBA0AgASgCGCIBLQAsQQJGDQALCwJAIANBhAFqKAIAIgRFDQAgA0GAAWooAgAhASAEQdgAbCEEA0ACQAJAAkACQCABKAIAQXxqDgIDAAELIAFBBGooAgAiBSgCAEEaRw0BIAJBgAJqIAAoAgAgACgCBCAFQQhqIgYQgg0gAigCgAJBMkYNAiAFENEBIAVBOGogAkGAAmpBOGopAwA3AwAgBUEwaiACQYACakEwaikDADcDACAFQShqIAJBgAJqQShqKQMANwMAIAVBIGogAkGAAmpBIGopAwA3AwAgBUEYaiACQYACakEYaikDADcDACAFQRBqIAJBgAJqQRBqKQMANwMAIAYgAkGAAmpBCGopAwA3AwAgBSACKQOAAjcDAAwCCyABIAAQjAkMAQsgBSAAEEYLIAFB2ABqIQEgBEGof2oiBA0ACwsCQCADQZgBaigCACIBRQ0AIAFBKGwhBCADQZQBaigCAEEEaiEBA0ACQAJAAkACQAJAAkACQCABQXxqKAIADgUGAAECAwYLIAEoAgBBAUcNBSABQQRqKAIAIgUoAgBBGkcNAyACQcABaiAAKAIAIAAoAgQgBUEIaiIGEIINIAIoAsABQTJGDQUgBRDRASAFQThqIAJBwAFqQThqKQMANwMAIAVBMGogAkHAAWpBMGopAwA3AwAgBUEoaiACQcABakEoaikDADcDACAFQSBqIAJBwAFqQSBqKQMANwMAIAVBGGogAkHAAWpBGGopAwA3AwAgBUEQaiACQcABakEQaikDADcDACAGIAJBwAFqQQhqKQMANwMAIAUgAikDwAE3AwAMBQsgASgCACIFKAIAQRpHDQMgAkGAAWogACgCACAAKAIEIAVBCGoiBhCCDSACKAKAAUEyRg0EIAUQ0QEgBUE4aiACQYABakE4aikDADcDACAFQTBqIAJBgAFqQTBqKQMANwMAIAVBKGogAkGAAWpBKGopAwA3AwAgBUEgaiACQYABakEgaikDADcDACAFQRhqIAJBgAFqQRhqKQMANwMAIAVBEGogAkGAAWpBEGopAwA3AwAgBiACQYABakEIaikDADcDACAFIAIpA4ABNwMADAQLIAEgABDpBgwDCyABIAAQwQIM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AQMACyAFQQA2AiAMAgsgBUEQaiECAkAgAUECRw0AA0AgAigCGCICLQAsQQJGDQALCyACQQA2AigMAQsgAygCDCICRQ0AIAJBKGwhASADKAIIQQRqIQIDQAJAAkACQAJAAkAgAkF8aigCAA4FBAABAgMECyACKAIAQQFHDQMgAkEEaigCABC6AQwDCyACKAIAELoBDAILIAIQ4wcMAQsgAhCOBgsgAkEoaiECIAFBWGoiAQ0ACwsgA0HYAGoiAyAERw0ACwsCQCAAKAKYASICRQ0AIAAoApQBIgYgAkEobGohBwNAAkACQAJAAkACQCAGKAIADgUEAAECAwQLIAYoAgRBAUcNAyAGKAIIELoBDAMLIAYoAgQQugEMAgsCQAJAAkAgBigCBCIDLQBsIgFBfWoiAkEBIAJB/wFxQQNJG0H/AXEOAwABAgALIANBADYCUAwBCyADQcAAaiECAkAgAUH/AXFBAkcNAANAIAIoAhgiAi0ALEECRg0ACwsgAkEANgIoCyADQZABaiEEAkAgA0GEAWooAgAiAUUNACADQYABaigCACECIAFB2ABsIQEDQAJAAkAgAigCAEEFRw0AIAJBBGooAgAQugEMAQsgAhCQDgsgAkHYAGohAiABQah/aiIBDQALCyAEEI4GIAMtADwiAUEGRg0BAkACQCABQX1qIgJBASACQQNJG0H/AXEOAwABAwALIANBADYCIAwCCyADQRBqIQICQCABQQJHDQADQCACKAIYIgItACxBAkYNAAsLIAJBADYCKAwBCyAGKAIMIgJFDQAgAkEobCEBIAYoAghBBGohAgNAAkACQAJAAkACQCACQXxqKAIADgUEAAECAwQLIAIoAgBBAUcNAyACQQRqKAIAELoBDAMLIAIoAgAQugEMAgsgAhDjBwwBCyACEOokCyACQShqIQIgAUFYaiIBDQALCyAGQShqIgYgB0cNAAsLAkAgAC0APCIBQQZGDQACQAJAIAFBfWoiAkEBIAJBA0kbQf8BcQ4DAAECAAsgAEEANgIgDwsgAEEQaiECAkAgAUECRw0AA0AgAigCGCICLQAsQQJGDQALCyACQQA2AigLC4ILAgR/AX4jAEEwayICJAACQAJAAkACQAJAAkACQAJAIAAoAgAOCAECAwQAAAUGAQsACyAAQQA6ABwgASAAKAIgEL4BDAULIABBADoA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QQAhCgwBCyABIAw2AkBBASEKCyABIAo2AjggAUH0AGogAUE4akHwv5gBELcXCyALIANqIQMMAAsL3QoBB38jAEEQayICJAACQAJAAkACQAJAAkACQCAAKAIADggAAQIDBgYEBQALIAEgAEEIahCmBgwFCyABIABBCGoQsAMMBAsgAS0AeiEDIAEgACgCBCIALQAZRToAegJAIABBCGooAgAiBEUNACAAQQRqKAIAIgAgBEE4bGohBSABQSxqIQYgAS0AeSEHIAEtACghCANAIAFBAToAeSABQQE6ACggACABEIUFAkAgAEEwaigCACIERQ0AIAFBADoAeSABQQA6ACgCQCAEKAIAQRpHDQAgAiAEKQMIIARBGGooAgAQ5xogBiACKQMAIAIoAggQkAsLIAQgARB4CyABIAg6ACggASAHOgB5IABBOGoiACAFRw0ACwsgASADOgB6DAMLIAAoAgQiAEEIaigCACIERQ0CIABBBGooAgAiACAEQThsaiEFIAFBLGohBiABLQB5IQcgAS0AKCEIA0AgAUEBOgB5IAFBAToAKCAAIAEQhQUCQCAAQTBqKAIAIgRFDQAgAUEAOgB5IAFBADoAKAJAIAQoAgBBGkcNACACIAQpAwggBEEYaigCABDnGiAGIAIpAwAgAigCCBCQCwsgBCABEHgLIAEgCDoAKCABIAc6AHkgAEE4aiIAIAVHDQAMAwsLIAAoAgQhAAJAIAEtAJABDQAgAEEQaigCACIERQ0AIAIgACkDACAEEOcaIAFBgAFqIAIpAwAgAigCCBCRBhoLIABBKGooAgAiBEUNASAAQSRqKAIAIgAgBEEwbGohCCABQSxqIQYgAUGAAWohAwNAAkAgACgCAA0AIAEtAJABDQAgAEEYaigCACIERQ0AIAIgAEEIaikDACAEEOcaIAMgAikDACACKAIIEJEGGgsCQCAAQShqKAIAIgRFDQAgAS0AKCEFIAFBADoAKCABLQB5IQcgAUEAOgB5AkAgBCgCAEEaRw0AIAIgBCkDCCAEQRhqKAIAEOcaIAYgAikDACACKAIIEJALCyAEIAEQeCABIAU6ACggASAHOgB5CyAAQTBqIgAgCEcNAAwCCwsCQCAAKAIEIgAoAgANACABLQCQAQ0AIABBGGooAgAiBEUNACACIAApAwggBBDnGiABQYABaiACKQMAIAIo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KGooAgAQtQIgDEEgaiADQTBqQSBqKQMANwMAIAxBGGogA0EwakEYaikDADcDACAMQRBqIANBMGpBEGopAwA3AwAgDEEIaiADQTBqQQhqKQMANwMAIAwgAykDMDcDACADKAIQIQ0gAygCFCEOIAMoAhghDyADKAIcIRAgAygCICERIAMoAiQhEiADKAIoIRMgAy0ALCEUIANBDGpBAmogB0ECai0AADoAACADIAcvAAA7AQwMAgsgCkEgaigCACETIApBHGooAgAhEiAKQRhqKAIAIREgCkEMaigCACEOIApBCGooAgAhDQJAIApBEGopAwAiGkIDg0IAUg0AIBqnIgwgDCgCACIMQQFqNgIAIAxBf0wNBQsgCkEkai0AACEUQQAhFUEAIQwCQCAKQShqKAIAIg9FDQBBAC0A4PadARpBDBCEASIMRQ0FQQAtAOD2nQEaIA8oAgghFiAPKAIEIRdB4AAQhAEiEEUNBSADQTBqIA8oAgAQZQJAQeAARQ0AIBAgA0EwakHgAPwKAAALIAwgFjYCCCAMIBc2AgQgDCAQNgIACwJAIApBMGooAgAiCkUNAEEALQDg9p0BGkHAABCEASIVRQ0FIANBMGogChBFIBVBOGogA0EwakE4aikDADcDACAVQTBqIANBMGpBMGopAwA3AwAgFUEoaiADQTBqQShqKQMANwMAIBVBIGogA0EwakEgaikDADcDACAVQRhqIANBMGpBGGopAwA3AwAgFUEQaiADQTBqQRBqKQMANwMAIBVBCGogA0EwakEIaikDADcDACAVIAMpAzA3AwALIBpCIIinIRAgGqchDwwBC0EALQDg9p0BGiAKQRRqKAIAIRAgCkEQaigCACEPIApBDGooAgAhDiAKQQhqKAIAIQ1BKBCEASIYRQ0DIANBMGogCkEEaigCABC1AiAYQSBqIANBMGpBIGopAwA3AwAgGEEYaiADQTBqQRhqKQMANwMAIBhBEGogA0EwakEQaikDADcDACAYQQhqIANBMGpBCGopAwA3AwAgGCADKQMwNwMAAkAgCkEYaigCACIKDQBBACERDAELQQAtAOD2nQEaQQwQhAEiEUUNA0EALQDg9p0BGiAKKAIIIRcgCigCBCEZQeAAEIQBIhZFDQMgA0EwaiAKKAIAEGUCQEHgAEUNACAWIANBMGpB4AD8CgAACyARIBc2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BCAAIAg2AgALIAZB4ABqJAAL8wkBBX8jAEEQayICJAACQAJAAkACQAJAAkACQCAAKAIADggAAQIDBgYEBQALAkAgACgCICIDQQhqKAIAIgRFDQAgA0EEaigCACEAIARBDGwhBANAIAAoAgAgARCNASAAQQxqIQAgBEF0aiIEDQALCwJAIANBFGooAgAiBEUNACADQRBqKAIAIQAgBEHYAGwhBANAIAAgARCEAyAAQdgAaiEAIARBqH9qIgQNAAsLIAMoAjAiAEUNBSAAIAEQjQEMBQsCQCAAKAIgIgVBCGooAgAiAEUNACAFQQRqKAIAIgMgAEEGdGohBgNAAkAgA0E4aigCACIERQ0AIANBNGooAgAhACAEQQxsIQQDQCAAKAIAIAEQjQEgAEEMaiEAIARBdGoiBA0ACwsgAyABELkKIANBwABqIgAhAyAAIAZHDQALCwJAIAVBFGooAgAiBEUNACAFQRBqKAIAIQAgBEEMbCEEA0AgACgCACABEI0BIABBDGohACAEQXRqIgQNAAsLIAUoAhhBgICAgHhGDQQgBUEgaigCACIERQ0EIAVBHGooAgAhACAEQTBsIQQDQCAAIAEQxAMgAEEwaiEAIARBUGoiBA0ADAULCyAAKAIEIgBBCGooAgAiBEUNAyAAQQRqKAIAIgAgBEE4bGohAwNAIAAgARDvCQJAIABBMGooAgAiBEUNACAEIAEQjQELIABBOGoiACADRw0ADAQLCyAAKAIEIgBBCGooAgAiBEUNAiAAQQRqKAIAIgAgBEE4bGohAwNAIAAgARDvCQJAIABBMGooAgAiBEUNACAEIAEQjQELIABBOGoiACADRw0ADAMLCyACIAAoAgQiACkDACAAQRBqKAIAEOcaIAEgAikDACACKAIIEJEGGiAAQShqKAIAIgRFDQEgAEEkaigCACIAIARBMGxqIQMDQAJAIAAoAgANACACIABBCGopAwAgAEEYaigCABDnGiABIAIpAwAgAigCCBCRBhoLAkAgAEEoaigCACIERQ0AIAQgARCNAQsgAEEwaiIAIANHDQAMAgsLAkAgACgCBCIAKAIADQAgAiAAKQMIIABBGGooAgAQ5xogASACKQMAIAIoAggQkQYaCyAALQBFIgRBA0YNAAJAIARBAkYNACACIAApAyggAEE4aigCABDnGiABIAIpAwAgAigC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AkACQCAEKAIADgUEAAECAwQLIAQoAgRBAUcNAyABIAQoAggiABDTAyAAIAEQUSABKAIARQ0DIAAoAgBBGkcNAyABIABBCGoiBhDDBSIDRQ0DIAAQ5AEgAEE4aiADQThqKQMANwMAIABBMGogA0EwaikDADcDACAAQShqIANBKGopAwA3AwAgAEEgaiADQSBqKQMANwMAIABBGGogA0EYaikDADcDACAAQRBqIANBEGopAwA3AwAgBiADQQhqKQMANwMAIAAgAykDADcDACADQcAAQQgQvRMMAwsgASAEKAIEIgAQ0wMgACABEFEgASgCAEUNAiAAKAIAQRpHDQIgASAAQQhqIgYQwwUiA0UNAiAAEOQBIABBOGogA0E4aikDADcDACAAQTBqIANBMGopAwA3AwAgAEEoaiADQShqKQMANwMAIABBIGogA0EgaikDADcDACAAQRhqIANBGGopAwA3AwAgAEEQaiADQRBqKQMANwMAIAYgA0EIaikDADcDACAAIAMpAwA3AwAgA0HAAEEIEL0TDAILIAQoAgQiB0HAAGogARCMAwJAIAdBmAFqKAIAIgBFDQAgAEEobCEDIAdBlAFqKAIAQQRqIQADQAJAAkACQAJAAkAgAEF8aigCAA4FBAABAgMECyAAKAIAQQFHDQMgASAAQQRqKAIAIgYQ0wMgBiABEFEgASgCAEUNAyAGKAIAQRpHDQMgASAGQQhqIggQwwUiCUUNAyAGEOQBIAZBOGogCUE4aikDADcDACAGQTBqIAlBMGopAwA3AwAgBkEoaiAJQShqKQMANwMAIAZBIGogCUEgaikDADcDACAGQRhqIAlBGGopAwA3AwAgBkEQaiAJQRBqKQMANwMAIAggCUEIaikDADcDACAGIAkpAwA3AwAgCUHAAEEIEL0TDAMLIAEgACgCACIGENMDIAYgARBRIAEoAgBFDQIgBigCAEEaRw0CIAEgBkEIaiIIEMMFIglFDQIgBhDkASAGQThqIAlBOGopAwA3AwAgBkEwaiAJQTBqKQMANwMAIAZBKGogCUEoaikDADcDACAGQSBqIAlBIGopAwA3AwAgBkEYaiAJQRhqKQMANwMAIAZBEGogCUEQaikDADcDACAIIAlBCGopAwA3AwAgBiAJKQMANwMAIAlBwABBCBC9EwwCCyAAIAEQ0QQMAQsgACABEPwC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uZkBai0AAEUNACAGIQNBBCEFDAMLAkAgB0EFai0AAEHAuZkBai0AAEUNACAGIQNBBSEFDAMLAkAgB0EGai0AAEHAuZkBai0AAEUNACAGIQNBBiEFDAMLAkAgB0EHai0AAEHAuZkBai0AAEUNACAGIQNBByEFDAMLAkAgB0EIai0AAEHAuZkBai0AAEUNACAGIQNBCCEFDAMLAkAgB0EJai0AAEHAuZkBai0AAEUNACAGIQNBCSEFDAMLAkAgB0EKai0AAEHAuZkBai0AAEUNACAGIQNBCiEFDAMLAkAgB0ELai0AAEHAuZkBai0AAEUNACAGIQNBCyEFDAMLAkAgB0EMai0AAEHAuZkBai0AAEUNACAGIQNBDCEFDAMLAkAgB0ENai0AAEHAuZkBai0AAEUNACAGIQNBDSEFDAMLAkAgB0EOai0AAEHAuZkBai0AAEUNACAGIQNBDiEFDAMLAkAgB0EPai0AAEHAuZkBai0AAEUNACAGIQNBDyEFDAMLAkAgB0EQai0AAEHAuZkBai0AAEUNACAGIQNBECEFDAMLAkAgB0ERai0AAEHAuZkBai0AAEUNACAGIQNBESEFDAMLAkAgB0ESai0AAEHAuZkBai0AAEUNACAGIQNBEiEFDAMLAkAgB0ETai0AAEHAuZkBai0AAEUNACAGIQNBEyEFDAMLAkAgB0EUai0AAEHAuZkBai0AAEUNACAGIQNBFCEFDAMLAkAgB0EVai0AAEHAuZkBai0AAEUNACAGIQNBFSEFDAMLAkAgB0EWai0AAEHAuZkBai0AAEUNACAGIQNBFiEFDAMLAkAgB0EXai0AAEHAuZkBai0AAEUNACAGIQNBFyEFDAMLAkAgB0EYai0AAEHAuZkBai0AAEUNACAGIQNBGCEFDAMLAkAgB0EZai0AAEHAuZkBai0AAEUNACAGIQNBGSEFDAMLAkAgB0Eaai0AAEHAuZkBai0AAEUNACAGIQNBGiEFDAMLAkAgB0Ebai0AAEHAuZkBai0AAEUNACAGIQNBGyEFDAMLAkAgB0Ecai0AAEHAuZkBai0AAEUNACAGIQNBHCEFDAMLAkAgB0Edai0AAEHAuZkBai0AAEUNACAGIQNBHSEFDAMLAkAgB0Eeai0AAEHAuZkBai0AAEUNACAGIQNBHiEFDAMLAkAgB0Efai0AAEHAuZkBai0AAEUNACAGIQNBHyEFDAMLIAZBwABqIQcgBkEgaiIDIQYgByAESQ0ACwsgBCADayEGIAEgBGohCCABIANqIQUDQAJAIAYgAkcNAEEAIQcgBCECQQAhBgwDCyAFIAJqIQcgAkEBaiECIActAABBwLmZAWotAABBAUcNAAsgAkF/aiEFCyABIAUgA2oiAmohCCAEIAJrIQdBASEGCyAAIAc2AlwgACAINgJYIAAgACgCaCACajYCaCAGC/wIAhR/An4jAEGQBGsiAiQAAkBBgARFDQAgAkEMakEAQYAE/AsACwJAAkAgACgCDCIDDQAgASgCACAAKAIAIAAoAgQgASgCBCgCDBEMACEADAELIAAoAgAhBCAAKAIIIgUtAAAhBkEAIQcCQAJAIAAoAgQiCEUNACAEIAhqIQlBACEHIAJBDGohCiAEIQADQAJAAkAgACwAACILQX9MDQAgAEEBaiEAIAtB/wFxIQsMAQsgAC0AAUE/cSEMIAtBH3EhDQJAIAtBX0sNACANQQZ0IAxyIQsgAEECaiEADAELIAxBBnQgAC0AAkE/cXIhDAJAIAtBcE8NACAMIA1BDHRyIQsgAEEDaiEADAELIAxBBnQgAC0AA0E/cXIgDUESdEGAgPAAcXIiC0GAgMQARg0CIABBBGohAAsgB0GAAUYNAiAKIAs2AgAgCkEEaiEKIAdBAWohByAAIAlHDQALCyAFIANqIQ4gB0ECdCIAQQRqIQ8gACACQQxqakF8aiEQQbwFIRFByAAhEiAFIQlBgAEhE0EAIRQDQCAJQQFqIQlBACEKQSQhAEEBIRVBASENQQAhCwNAAkACQCAKQQFxRQ0AIAkgDkYNBCAJLQAAIQogCUEBaiEJDAELIAYhCiAVQQFxRQ0DCwJAIApBn39qIgxB/wFxQRpJDQAgCkFQakH/AXFBCUsNAyAKQWpqIQwLIAxB/wFxIgqtIA2tIhZ+IhdCIIinDQIgF6cgC2oiDCALSQ0CAkBBACAAIBJrIgsgCyAASxsiC0EBIAtBAUsbIgtBGiALQRpJGyILIApLDQAgAEEkaiEAIBZBJCALa61+IhenIQ1BACEVQQEhCiAMIQsgF0IgiKdFDQEMAwsLIAwgFGoiCiAUSQ0BIAogB0EBaiIVbiILIBNqIg0gE0kNASANQYCwA3NBgIC8f2pBgJC8f0kNASANQYCAxABGDQEgB0H/AEsNASAQIQACQAJAIAcgCiALIBVsayILSw0AIAtBgAFJDQEgC0GAAUHgsZcBEMMSAAsDQCAAQQRqIAAoAgA2AgAgAEF8aiEAIAdBf2oiByALSw0ACwsgAkEMaiALQQJ0aiANNgIAAkAgCSAORg0AIAktAAAhBkEAIQcCQAJAIAwgEW4iACAVbiAAaiIAQcgDTw0AIAAhDAwBC0EAIQcDQCAHQSRqIQcgAEHX/ABLIQogAEEjbiIMIQAgCg0ACwsgC0EBaiEUIAcgDEEkbEH8/wNxIAxBJmpB//8DcW5qIRIgEEEEaiEQIA9BBGohD0ECIREgFSEHIA0hEwwBCwsgAkEMaiEHA0AgAiAHKAIANgKMBCACQYwEaiABEP8JIgANAiAHQQRqIQcgD0F8aiIPDQAMAgsLQQEhACABKAIAIgdB8LGXAUEJIAEoAgQoAgwiChEMAA0AAkAgCEUNACAHIAQgCCAKEQwADQFBASEAIAdBuJubAUEBIAoRDAANAQtBASEAIAcgBSADIAoRDAANACAHQcjLmwFBASAKEQwAIQALIAJBkARqJAAgAAuOCgEDfwJAAkACQANAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCAA4TABAQAQIDEBAEBQ8ODAsKCQgHBgALIAAoAgwiAkUNDyABLQAADQ8gACgCCCEAIAJBMGwhAgNAAkAgAS0AAA0AIAAgARCHAwsgAEEwaiEAIAJBUGoiAg0ADBALCwJAIAEtAAENACABLQAADQ8gACgCBCABEJgBIAEtAABBAXENDyAAKAIIIQAMDAsgAUEBOgAADwsgACgCDCIARQ0NIAEtAAANDSAAIAEQmAEPCyABLQAADQwgACgCKCEADAkLAkAgAS0AAA0AIAAoAgQgARCYASABLQAAQQFxDQAgACgCCCABEIcDCyAAKAIUIgBFDQsgAS0AAEUNCAwLCwJAIAEtAAANACAAKAIQIAEQmAELIAAoAgwiAkUNCiAAKAIIIgMgAkEYbGohBANAAkAgAygCFCIARQ0AIAEtAAANACAAIAEQmAELAkAgA0EIaigCACICRQ0AIAEtAAANACADQQRqKAIAIQAgAkEwbCECA0ACQCABLQAADQAgACABEIcDCyAAQTBqIQAgAkFQaiICDQALCyADQRhqIgMgBEYNCwwACwsgAS0AAA0JIAAoAgQgARCYAQwJCyAAQQhqIAEQwAMPCwJAAkACQAJAIAAoAgQOAwABAgALIAAoAgggARCRCAwCCyAAKAIIIAEQkggMAQsgACgCCCABEOwJCyABLQAADQcgACgCDCABEJgBIAEtAABBAXENByAAKAIQIQAMBAsCQAJAAkACQCAAKAIEDgMAAQIACyAAKAIIIAEQkQgMAgsgACgCCCABEJIIDAELIAAoAgggARDsCQsgAS0AAA0GIAAoAgwgARCYASABLQAAQQFxDQYgACgCECEADAMLAkAgACgCBCICQQJGDQACQCACQQFxRQ0AIAEtAAANASAAKAIIIAEQmAEMAQsgACgCCCICQQhqKAIAIgNFDQAgAkEEaigCACICIANBOGxqIQQDQCACIAEQtwkCQCACQTBqKAIAIgNFDQAgAS0AAA0AIAMgARCYAQsgAkE4aiICIARHDQALCyAAKAIYIgJBAEcgAS0AACIEciEDAkAgAkUNACAEQQFxDQAgAiABEJgBIAEtAAAhAwsCQAJAIAAoAhwiAkUNACADQQFxDQcgAiABEJgBIAEtAABBAXFFDQEMBwsgA0EBcQ0GCyAAKAIMIQAMAgsgAS0AAA0EIAAoAgQgARCYASABLQAAQQFxDQQgACgCCCEADAELIAEtAAANAyAAKAIEIAEQmAEgAS0AAEEBcQ0DIAAoAgghAAwACwsCQCAAKAIEIgNB0ABqKAIAIgJFDQAgAS0AAA0AIANBzABqKAIAIQAgAkEwbCECA0ACQCABLQAADQAgACABEIcDCyAAQTBqIQAgAkFQaiICDQALCwJAAkACQCADKAIAQXlqDgIBAgALIAMgARC3CQsgA0EwaigCACICRQ0AIAEtAAANACADQSxqKAIAIQAgAkEwbCECA0ACQCABLQAADQAgACABEIcDCyAAQTBqIQAgAkFQaiICDQALCyADKAJgQYCAgIB4Rg0BIANB6ABqKAIAIgJFDQEgAS0AAA0BIANB5ABqKAIAIQAgAkEwbCECA0ACQCABLQAADQAgACABEIcDCyAAQTBqIQAgAkFQaiICDQAMAgsLIAEtAAANACAAKAIEIAEQmAEPCwu6CQEGfyMAQTBrIgIkAAJAAkACQAJAAkAgASgCAA4FBAABAgMECyABKAIEQQFHDQMgACABKAIIIgEQ0wMgASAAEFEgACgCAEUNAyABKAIAQRpHDQMgACABQQhqIgMQwwUiAEUNAyABEOQBIAFBOGogAEE4aikDADcDACABQTBqIABBMGopAwA3AwAgAUEoaiAAQShqKQMANwMAIAFBIGogAEEgaikDADcDACABQRhqIABBGGopAwA3AwAgAUEQaiAAQRBqKQMANwMAIAMgAEEIaikDADcDACABIAApAwA3AwAgAEHAAEEIEL0TDAMLIAAgASgCBCIBENMDIAEgABBRIAAoAgBFDQIgASgCAEEaRw0CIAAgAUEIaiIDEMMFIgBFDQIgARDkASABQThqIABBOGopAwA3AwAgAUEwaiAAQTBqKQMANwMAIAFBKGogAEEoaikDADcDACABQSBqIABBIGopAwA3AwAgAUEYaiAAQRhqKQMANwMAIAFBEGogAEEQaikDADcDACADIABBCGopAwA3AwAgASAAKQMANwMAIABBwABBCBC9EwwCCyABKAIEIgRBwABqIAAQjAMCQCAEQZgBaigCACIBRQ0AIAFBKGwhAyAEQZQBaigCAEEEaiEBA0ACQAJAAkACQAJAIAFBfGooAgAOBQQAAQIDBAsgASgCAEEBRw0DIAAgAUEEaigCACIFENMDIAUgABBRIAAoAgBFDQMgBSgCAEEaRw0DIAAgBUEIaiIGEMMFIgdFDQMgBRDkASAFQThqIAdBOGopAwA3AwAgBUEwaiAHQTBqKQMANwMAIAVBKGogB0EoaikDADcDACAFQSBqIAdBIGopAwA3AwAgBUEYaiAHQRhqKQMANwMAIAVBEGogB0EQaikDADcDACAGIAdBCGopAwA3AwAgBSAHKQMANwMAIAdBwABBCBC9EwwDCyAAIAEoAgAiBRDTAyAFIAAQUSAAKAIARQ0CIAUoAgBBGkcNAiAAIAVBCGoiBhDDBSIHRQ0CIAUQ5AEgBUE4aiAHQThqKQMANwMAIAVBMGogB0EwaikDADcDACAFQShqIAdBKGopAwA3AwAgBUEgaiAHQSBqKQMANwMAIAVBGGogB0EYaikDADcDACAFQRBqIAdBEGopAwA3AwAgBiAHQQhqKQMANwMAIAUgBykDADcDACAHQcAAQQgQvRMMAgsgASAAENEEDAELIAEgABD8AgsgAUEoaiEBIANBWGoiAw0ACwsgBC0APCIBQQZGDQECQAJAIAFBBEYNACABQX1qQQNJDQELIARBKGohAwJAIAFBAkcNACADIAAQqBwLIAAoAgBFDQIgACADEN8FCyAAKAIARQ0BIAQtADxBA0cNASACIAAgBEEQaiIBEPkFIAItACxBBkYNASABEM8RIAFBKGogAkEoaikDADcDACABQSBqIAJBIGopAwA3AwAgAUEYaiACQRhqKQMANwMAIAFBEGogAkEQaikDADcDACABQQhqIAJBCGopAwA3AwAgASACKQMANwMADAELIAEoAgwiA0UNACABKAIIIQEgA0EobCEDA0AgACABEIgDIAFBKGohASADQVhqIgMNAAsLIAJBMGokAAuqCQIEfwF+IwBBIGsiAyQAIAEoAhwhBCADQRBqIAIgASgCGCIFQQAQogICQAJAIAMtABBBBEYNACADKQMQIgdC/wGDQgRRDQAgACAHNwIADAELAkACQAJAAkACQAJAAkACQAJAIAVFDQAgA0EQaiACIAUQ4hwgAy0AEEEERg0AIAMpAxAiB0L/AYNCBFINAQsgASgCICIFKAIAQWhqDgQDAgIBAgsgACAHNwIADAcLIAUoAghBA0YNAwsgA0EQaiABQSBqIAIQiiMgAy0AEEEERw0BQQAhBgwEC0EAIQYgA0EQaiACIAVBBGpBABDgBCADLQAQQQRGDQMgAykDECIHQv8Bg0IEUQ0DIAAgBzcCAAwEC0EAIQYgAykDECIHQv8Bg0IEUg0BDAILIANBEGogAiAFQRBqQQEQuQECQCADLQAQQQRHDQAgAy0AESEGDAILAkAgAykDECIHQv8Bg0IEUg0AIAdCgAKDQgiIpyEGDAILIAAgBzcCAAwCCyAAIAc3AgAMAQsCQAJAAkACQAJAAkACQAJAAkAgASgCAA4DAQIAAQsgA0EQaiABQQRqIAIQpQkgAy0AEEEERg0HIAMpAxAiB0L/AYNCBFINAgwHCyABKAIQIQUgBkEBcUUNBQJAIAVBAkkNACADQRBqIAIgBUF+akEAEKICIAMtABBBBEYNACADKQMQIgdC/wGDQgRSDQMLIANBADYCECADQQhqIAIgA0EQakHfy5sBQQEQhQ0gAy0ACEEERg0FIAMpAwgiB0L/AYNCBFENBSAAIAc3AgAMBwsgASgCECEFIAZBAXFFDQMCQCAFQQJJDQAgA0EQaiACIAVBfmpBABCiAiADLQAQQQRGDQAgAykDECIHQv8Bg0IEUg0DCyADQQA2AhAgA0EIaiACIANBEGpB38ubAUEBEIUNIAMtAAhBBEYNAyADKQMIIgdC/wGDQgRRDQMgACAHNwIADAYLIAAgBzcCAAwFCyAAIAc3AgAMBAsgACAHNwIADAMLAkACQCAFRQ0AIANBEGogAiAFQX9qQQAQogIgAy0AEEEERg0AIAMpAxAiB0L/AYNCBFINAQsgA0EANgIQIANBCGogAiADQRBqQd/LmwFBARCFDQJAIAMtAAhBBEYNACADKQMIIgdC/wGDQgRRDQAgACAHNwIADAQLIANBEGogAUEIaiACEKQJIAMtABBBBEYNAiADKQMQIgdC/wGDQgRRDQIgACAHNwIADAMLIAAgBzcCAAwCCwJAAkAgBUUNACADQRBqIAIgBUF/akEAEKICIAMtABBBBEYNACADKQMQIgdC/wGDQgRSDQELIANBADYCECADQQhqIAIgA0EQakHfy5sBQQEQhQ0CQCADLQAIQQRGDQAgAykDCCIHQv8Bg0IEUQ0AIAAgBzcCAAwDCyADQRBqIAFBCGogAhCiFSADLQAQQQRGDQEgAykDECIHQv8Bg0IEUQ0BIAAgBzcCAAwCCyAAIAc3AgAMAQsCQAJAIARFDQAgA0EQaiACIAQQ4hwgAy0AEEEERg0AIAMpAxAiB0L/AYNCBFINAQsgAEEEOgAADAELIAAgBzcCAAsgA0EgaiQAC8QJAQR/AkACQAJAAkACQAJAAkACQCAAKAIAIgJBfGpBACACQXtqQQhJGw4JAAECAwQHBwUGAAsCQCACQQNHDQAgAS0AAA0AIAAoAgQgARCYAQsCQCAAKAJIIgJFDQAgACgCRCIDIAJBBnRqIQQDQAJAAkAgAygCAEEHRg0AAkAgA0E4aigCACIFRQ0AIAEtAAANACADQTRqKAIAIQIgBUEMbCEFA0ACQCABLQAADQAgAigCACABEJgBCyACQQxqIQIgBUF0aiIFDQALCyADIAEQtwkMAQsCQCADQThqKAIAIgVFDQAgAS0AAA0AIANBNGooAgAhAiAFQQxsIQUDQAJAIAEtAAANACACKAIAIAEQmAELIAJBDGohAiAFQXRqIgUNAAsLIAMtABxBAkcNACADKAIIIAEQtwkgAS0AAA0AIAMoAgwgARCYAQsgA0HAAGoiAyAERw0ACwsgACgCIEGAgICAeEYNBiAAKAIoIgVFDQYgAS0AAA0GIAAoAiQhAiAFQTBsIQUDQAJAIAEtAAANACACIAEQhwMLIAJBMGohAiAFQVBqIgUNAAwHCwsCQCAAKAIIQQNHDQAgAS0AAA0AIAAoAgwgARCYAQsCQCAAKAIwIgRBCGooAgAiBUUNACAEQQRqKAIAIgIgBUEGdGohAANAAkAgAiIDQThqKAIAIgVFDQAgAS0AAA0AIANBNGooAgAhAiAFQQxsIQUDQAJAIAEtAAANACACKAIAIAEQmAELIAJBDGohAiAFQXRqIgUNAAsLIAMgARC3CSADQcAAaiICIABHDQALCwJAIARBFGooAgAiBUUNACABLQAADQAgBEEQaigCACECIAVBDGwhBQNAAkAgAS0AAA0AIAIoAgAgARCYAQsgAkEMaiECIAVBdGoiBQ0ACwsgBCgCGEGAgICAeEYNBSAEQSBqKAIAIgVFDQUgAS0AAA0FIARBHGooAgAhAiAFQTBsIQUDQAJAIAEtAAANACACIAEQhwMLIAJBMGohAiAFQVBqIgUNAAwGCwsgACgCICABEJAKDwsCQCAAKAIIQQNHDQAgAS0AAA0AIAAoAgwgARCYAQsCQCAAKAI8IgJFDQAgAS0AAA0AIAIgARCYAQsgACgCOCIFRQ0DIAEtAAANAyAAKAI0IQIgBUEMbCEFA0ACQCABLQAADQAgAigCACABEJgBCyACQQxqIQIgBUF0aiIFDQAMBAsLAkAgACgCJCICRQ0AIAEtAAANACACIAEQmAELIAAoAjQiBUUNAiABLQAADQIgACgCMCECIAVBDGwhBQNAAkAgAS0AAA0AIAIoAgAgARCYAQsgAkEMaiECIAVBdGoiBQ0ADAMLCyAAKAIMIgVFDQEgAS0AAA0BIAAoAgghAiAFQTBsIQUDQAJAIAEtAAANACACIAEQhwMLIAJBMGohAiAFQVBqIgUNAAwCCwsCQCAAKAIIIgJBBUYNACACQQNHDQAgAS0AAA0AIAAoAgwgARCYAQsCQCAAKAI8IgJFDQAgAS0AAA0AIAIgARCYAQsgACgCOCIFRQ0AIAEtAAANACAAKAI0IQIgBUEMbCEFA0ACQCABLQAADQAgAigCACABEJgBCyACQQxqIQIgBUF0aiIFDQALCwvJCQEJfyMAQRBrIgIkAAJAAkACQAJAAkACQCAAKAIADgQFAAECBQsgACgCBEEBRw0EIAEtACUhAyAAKAIIIQAgAS0AJCIEDQMgACgCAEF0aiIFQQcgBUEmSRtBe2oiBUEfSw0CQQEgBXRBrqKAgHhxDQMgBQ0CIAAtABENAgwDCwJAIAAoAgQiBi0AbEECRw0AIAZBwABqIQADQCAAKAIYIgAtACxBAkYNAAsLAkAgBkGEAWooAgAiA0UNACAGQYABaigCACEAIANB2ABsIQMDQAJAAkACQCAAKAIAQXxqDgICAAELIAEtACQhByABQQI6ACQgAS0AJSEEIAEgAEEEaigCACIFEM4BIAUgARBTIAEgBDoAJSABQQI6ACQgASAFEJ0BIAEgBDoAJSABIAc6ACQMAQsgACABEIsDCyAAQdgAaiEAIANBqH9qIgMNAAsLAkAgBkGYAWooAgAiAEUNACAGQZQBaigCACIHIABBKGxqIQgDQAJAAkACQAJAAkACQAJAAkACQCAHKAIADgUIAAECAwgLIAcoAgRBAUcNByAHKAIIIQAgAS0AJCIDDQYgACgCAEF0aiIEQQcgBEEmSRtBe2oiBEEfSw0FQQEgBHRBrqKAgHhxDQYgBA0FIAAtABENBQwGCyAHKAIEIQAgAS0AJCIDDQMgACgCAEF0aiIEQQcgBEEmSRtBe2oiBEEfSw0CQQEgBHRBrqKAgHhxDQMgBA0CIAAtABENAgwDCwJAIAcoAgQiCS0AbEECRw0AIAlBwABqIQADQCAAKAIYIgAtACxBAkYNAAsLAkAgCUGEAWooAgAiA0UNACAJQYABaigCACEAIANB2ABsIQMDQAJAAkACQCAAKAIAQXxqDgICAAELIAEtACQhCiABQQI6ACQgAS0AJSEEIAEgAEEEaigCACIFEM4BIAUgARBTIAEgBDoAJSABQQI6ACQgASAFEJ0BIAEgBDoAJSABIAo6ACQMAQsgACABEKYLCyAAQdgAaiEAIANBqH9qIgMNAAsLAkAgCUGYAWooAgAiA0UNACAJQZQBaigCACEAIANBKGwhAwNAIAEgABDuAyAAQShqIQAgA0FYaiIDDQALCyAJLQA8IgBBBkYNBSAAQQJHDQUgCUEQaiEAA0AgACgCGCIALQAsQQJGDQAMBgsLIAdBDGooAgAhAyAHQQhqKAIAIQAgAiABNgIMIANFDQQgA0EobCEDA0AgAkEMaiAAEMQFIABBKGohACADQVhqIgMNAAwFCwsgAUEDOgAkCyABLQAlIQQgASAAEM4BIAAgARBTIAEgBDoAJSABIAM6ACQgASAAEJ0BDAILIAFBAzoAJAsgAS0AJSEEIAEgABDOASAAIAEQUyABIAQ6ACUgASADOgAkIAEgABCdAQsgB0EoaiIHIAhHDQALCyAGLQA8IgFBBkYNAyABQQJHDQMgBkEQaiEBA0AgASgCGCIBLQAsQQJGDQAMBAsLIAAoAgwhAyAAKAIIIQAgAiABNgIIIANFDQIgA0EobCEBA0AgAkEIaiAAEMQFIABBKGohACABQVhqIgENAAwDCwsgAUEDOgAkCyABIAAQzgEgACABEFMgASADOgAlIAEgBDoAJCABIAAQnQELIAJBEGokAAupCQEHfyMAQTBrIgIkAAJAAkACQCAALQAsIgNBBEYNACADQX1qQQNJDQELIABBGGohBAJAIANBAkcNACAEIAEQqBwLIAEoAgBFDQEgASAEEN8FCyABKAIARQ0AIAAtACxBA0cNACACIAEgABD5BSACLQAsQQZGDQAgABDPESAAQShqIAJBKGopAwA3AwAgAEEgaiACQSBqKQMANwMAIABBGGogAkEYaikDADcDACAAQRBqIAJBEGopAwA3AwAgAEEIaiACQQhqKQMANwMAIAAgAikDADcDAAsCQCAAKAJEIgRFDQAgACgCQCIDIARB2ABsaiEFA0ACQAJAAkAgAygCACIAQXxqDgICAAELIAEgAygCBCIAENMDIAAgARBRIAEoAgBFDQEgACgCAEEaRw0BIAEgAEEIaiIGEMMFIgRFDQEgABDkASAAQThqIARBOGopAwA3AwAgAEEwaiAEQTBqKQMANwMAIABBKGogBEEoaikDADcDACAAQSBqIARBIGopAwA3AwAgAEEYaiAEQRhqKQMANwMAIABBEGogBEEQaikDADcDACAGIARBCGopAwA3AwAgACAEKQMANwMAIARBwABBCBC9EwwBCwJAAkACQCAADgQDAAECAwsgAygCBEEBRw0CIAEgAygCCCIAENMDIAAgARBRIAEoAgBFDQIgACgCAEEaRw0CIAEgAEEIaiIGEMMFIgRFDQIgABDkASAAQThqIARBOGopAwA3AwAgAEEwaiAEQTBqKQMANwMAIABBKGogBEEoaikDADcDACAAQSBqIARBIGopAwA3AwAgAEEYaiAEQRhq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IAhGDQEgBSAFIAhHQQZ0aiEGIAUoAgBBBEcNACAFKAIQIQ0gBSgCDCEFIANBqoGAgHg2AmggAiAFIA0gA0HoAGoQ3hwMAAsLIANB/ABqIAFBCGooAgA2AgAgA0HoAGpBCGogA0EgakEIaigCADYCACADIAMpAiA3A2ggAyABKQIANwJ0IActAAAhBSAJLQAAIQYgAigCvAEhCCABKAIUKAIAIQECQEEEQcgAEJkiIgINAAALIAIgAykDaDcCACACIAs2AhwgAiAMNgIYIAIgAykDWDcCICACIAY6AEUgAiAFOgBEIAIgCjYCQCACIAQ2AjxBACEFIAJBADYCOCACIAg2AjQgAiABNgIwIAJBEGogA0HoAGpBEGopAwA3AgAgAkEIaiADQegAakEIaikDADcCACACQShqIANB2ABqQQhqKQMANwIAIAIhBAwCCyAEEJwiIAohBAsgARD5H0EBIQULIAAgBDYCBCAAIAU2AgAgA0GAAWokAAvQCQIMfwF+IwBB4ABrIgIkACACQQA2AhAgAkKAgICAEDcCCCABKAIYIQMgASgCHCEEIAJBADYCPCACQQA7ATggAiAENgI0IAJBADYCMCACQQE6ACwgAkEKNgIoIAIgBDYCJCACQQA2AiAgAiAENgIcIAIgAzYCGCACQQo2AhQgASgCICIFQQJqQQQgBRshBiABKAIEIQcgASgCCCEIA0AgAiACQRRqEIwKAkACQAJAIAIoAgAiAUUNACACKAIEIQkgAiACKAI8IgRBAWoiAzYCPAJAAkACQAJAIAUNACACQQhqQczMmwFB0MybARDkFQwBCyACQQA2AkggAkKAgICAEDcCQCACQYD8hAE2AlAgAkKggICADjcCVCACIAJBwABqNgJMIANBASACQcwAahCFCA0CIAUgAigCSCIKSQ0BIAIoAkQhAyACKAJAIQsgAkEANgJUIAJCgICAgBA3AkwgAkHMAGpBICAFIAprENoQIAJBzABqIAMgAyAKahDkFSACKAJMIQwgAigCVCENIAIoAlAhCiALIANBAUEBENASIAJBCGogCiAKIA1qEOQVIAwgCkEBQQEQ0BIgAkEIakHomZgBQeqZmAEQ5BULIAJBCGogASABIAlqEOQVIAIoAhAiASEDAkAgAigCCCABRw0AIAJBCGogAUEBQQFBARDUGSACKAIQIQMLIAIoAgwgA2pBCjoAACACIAFBAWo2AhACQCAEIAhPDQAgByAEQQxsaiIKKAIIIgFFDQYgAkEANgJUIAJCgICAgBA3AkwCQAJAIAZFDQBBACEBQQEhAwNAIAEhBAJAIAEgAigCTEcNACACQcwAaiABQQFBAUEBENQZIAIoAlAhAyACKAJUIQQLIAMgBGpBIDoAACACIAFBAWoiATYCVCAGIAFHDQALIAooAggiAUUNBiAKKAIEIgkgAUEYbGohDQwBCyAKKAIEIgkgAUEYbGohDQtBACEEIAYhAQNAAkACQCAEIAkoAggiA0F/aiIMSQ0AIAQhDAwBCyAEQX9zIANqIQQDQCABIQMCQCABIAIoAkxHDQAgAkHMAGogAUEBQQFBARDUGSACKAJUIQMLIAIoAlAgA2pBIDoAACACIAFBAWoiATYCVCAEQX9qIgQNAAsgCSgCCCEDCyAJQRhqIQtBACAJKAIUIgQgA2siAyADIARLGyIEQQEgBEEBSxsiCSEEA0AgASEDAkAgASACKAJMRw0AIAJBzABqIAFBAUEBQQEQ1BkgAigCVCEDCyACKAJQIgogA2pB3gA6AAAgAiABQQFqIgE2AlQgBEF/aiIEDQALIAkgDGohBCALIQkgCyANRg0GDAALCyAEIAhB+KCFARDDEgALQYihhQEQySIAC0GY1JsBQTcgAkHfAGpBmPyEAUHQ1JsBEOoQAAsgACACKQIINwIAIABBCGogAkEIakEIaigCADYCACACQeAAaiQADwsgAigCUCEKCyACKQJQIQ4gAigCTCIEQYCAgIB4Rg0AIAJBCGogDqciASABIA5CIIinahDkFSACKAIQIgEhAwJAIAIoAgggAUcNACACQQhqIAFBAUEBQQEQ1BkgAigCECEDCyACKAIMIANqQQo6AAAgAiABQQFqNgIQIAQgCkEBQQEQ0BIMAAsL0AkBA38CQAJAAkADQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgAOEwAPDwECAw8PBAUQDgwLCgkIBwYACyAAKAIMIgJFDQ4gACgCCCEAIAJBMGwhAgNAIAAgARCQAyAAQTBqIQAgAkFQaiICDQAMDwsLIAEgACgCBBDFASAAKAIIIQAMCwsgACgCDCIARQ0MIAEgABDFAQ8LIAAoAighAAwJCyABIAAoAgQQxQEgACgCCCABEJADIAAoAhQiAA0IDAoLIAEgACgCEBDFASAAKAIMIgJFDQkgACgCCCIDIAJBGGxqIQQDQAJAIAMoAhQiAEUNACABIAAQxQELAkAgA0EIaigCACICRQ0AIANBBGooAgAhACACQTBsIQIDQCAAIAEQkAMgAEEwaiEAIAJBUGoiAg0ACwsgA0EYaiIDIARGDQoMAAsLIAEtAAwhAiABQQE6AAwgASAAKAIEEMUBIAEgAjoADAwICyAAQQhqIAEQowUPCwJAAkACQAJAIAAoAgQOAwABAgALIAAoAggiAigCCCIDRQ0CIAIoAgQiAiADQThsaiEEA0AgAiABEPAJAkAgAkEwaigCACIDRQ0AIAEgAxDFAQsgAkE4aiICIARHDQAMAwsLIAAoAggiAigCCCIDRQ0BIAIoAgQiAiADQThsaiEEA0AgAiABEPAJAkAgAkEwaigCACIDRQ0AIAEgAxDFAQsgAkE4aiICIARHDQAMAgsLIAAoAgggARDZBwsgASAAKAIMEMUBIAAoAhAhAAwECwJAAkACQAJAIAAoAgQOAwABAgALIAAoAggiAigCCCIDRQ0CIAIoAgQiAiADQThsaiEEA0AgAiABEPAJAkAgAkEwaigCACIDRQ0AIAEgAxDFAQsgAkE4aiICIARHDQAMAwsLIAAoAggiAigCCCIDRQ0BIAIoAgQiAiADQThsaiEEA0AgAiABEPAJAkAgAkEwaigCACIDRQ0AIAEgAxDFAQsgAkE4aiICIARHDQAMAgsLIAAoAgggARDZBwsgASAAKAIMEMUBIAAoAhAhAAwDCwJAIAAoAgQiAkECRg0AAkAgAkEBcUUNACABIAAoAggQxQEMAQsgACgCCCICKAIIIgNFDQAgAigCBCICIANBOGxqIQQDQCACIAEQ8AkCQCACQTBqKAIAIgNFDQAgASADEMUBCyACQThqIgIgBEcNAAsLAkAgACgCGCICRQ0AIAEgAhDFAQsCQCAAKAIcIgJFDQAgASACEMUBCyAAKAIMIQAMAgsgASAAKAIEEMUBIAAoAgghAAwBCyABIAAoAgQQxQEgACgCCCEADAALCwJAIAAoAgQiA0HQAGooAgAiAkUNACADQcwAaigCACEAIAJBMGwhAgNAIAAgARCQAyAAQTBqIQAgAkFQaiICDQALCwJAAkACQCADKAIAQXlqDgIBAgALIAMgARDwCQsgA0EwaigCACICRQ0AIANBLGooAgAhACACQTBsIQIDQCAAIAEQkAMgAEEwaiEAIAJBUGoiAg0ACwsgAygCYEGAgICAeEYNACADQegAaigCACICRQ0AIANB5ABqKAIAIQAgAkEwbCECA0AgACABEJADIABBMGohACACQVBqIgINAAsLDwsgASAAKAIEEMUBC4EKAgd/AX4jAEEgayIBJAACQAJAAkAgACgCACICDQAgACgCECIARQ0BIABB4MubAUEBEJwGIQIMAgsCQAJAAkACQAJAAkACQAJAIAAoAggiAyAAKAIEIgRJDQAgACgCECICRQ0BIAJB1LSXAUEQEJwGRQ0BDAcLIAAgA0EBaiIFNgIIIAFBCGogAiADai0AACIGEJ8XAkAgASgCCCIHRQ0AIAAoAhAiAEUNCCAAIAcgASgCDBCcBiECDAkLIAAgACgCDEEBaiIHNgIMAkAgB0H1A0kNAAJAIAAoAhAiAkUNACACQeS0lwFBGRCcBg0ICyAAQQE6AAQMBgsCQAJAAkACQAJAAkACQAJAAkACQAJAAkAgBkG/f2oOFAIGDgUOBA4ODg4ODg4OAQEAAAIDDgsCQCAAKAIQIgNFDQBBASECIANBj5ybAUEBEJwGDRQgACgCACICRQ0IIAAoAgghBSAAKAIEIQQLIAUgBE8NByACIAVqLQAAQcwARw0HIAAgBUEBajYCCCABQRBqIAAQqAggAS0AEEUNBiABLQARIQMCQCAAKAIQIgRFDQBBASECIARB5LSXAUHUtJcBIANBAXEiBxtBGUEQIAcbEJwGDRQLIAAgAzoABAwQCwJAIAAoAhAiA0UNAEEBIQIgA0GKnJsBQQEQnAYNEwsgBkHQAEcNByAAKAIQIgJFDQggAkGZtZcBQQYQnAYNEAwICwJAIAAoAhAiA0UNAEEBIQIgA0HQy5sBQQEQnAYNEgtBASECIAAQkQMNEQJAIAZBwQBHDQACQCAAKAIQIgNFDQAgA0GftZcBQQIQnAYNEwtBASECIABBARChAg0SCyAAKAIQIgNFDQ1BASECIANB0cubAUEBEJwGDREMDQsCQCAAKAIQIgNFDQBBASECIANB+MCbAUEBEJwGDRELIAEgABD3DkEBIQIgASgCAEEBcQ0QAkAgASgCBEEBRw0AIAAoAhAiA0UNDUEBIQIgA0Hey5sBQQEQnAYNEQsgACgCECIDRQ0MQQEhAiADQbOBnQFBARCcBg0QDAwLIAAQgAkNDQwLCwJAIAAoAhAiAkUNACACQaG1lwFBBBCcBg0NC0EBIQIgABD1CA0OIAAoAgAiA0UNBSAAKAIIIgQgACgCBE8NBSADIARqLQAAQcwARw0FIAAgBEEBajYCCCABQRBqIAAQqAggAS0AEEUNByABLQARIQMCQCAAKAIQIgRFDQBBASECIARB5LSXAUHUtJcBIANBAXEiBxtBGUEQIAcbEJwGDQ8LIAAgAzoABAwLCyAAEKQLDQsMCQsgASkDGCIIUA0AIAAgCBCUDQ0KIAAoAhAiA0UNAEEBIQIgA0Gom5sBQQEQnAYNDAsgBkHSAEYNBiAAKAIQIgJFDQYgAkGVtZcBQQQQnAYNCQwGCyAAKAIQIgJFDQAgAkGVtZcBQQQQnAYNCAsgABCRAw0HDAULIAAoAhAiA0UNACADQdS0lwFBEBCcBg0IC0EAIQIgAEEAOgAEIABBADYCAAwHCyABKQMYIghQDQICQCAAKAIQIgJFDQAgAkGltZcBQQMQnAYNBQsgACAIEJQNDQQMAgsgACADNgIIIABBABCDAg0DDAELIAAQkQMNAgtBACECIAAoAgBFDQMgACAAKAIMQX9qNgIMDAMLQQAhAiAAQQA2AgAMAgtBASECDAELQQAhAgsgAUEgaiQAIAIL2wgCEn8BfiMAQcAAayIBJAACQAJAAkAgACgCDCICQX9GDQACQCACIAAoAgQiAyADQQFqIgRBA3YiBUEHbCADQQhJGyIGQQF2SQ0AAkACQCAGIAIgBiACSxsiBUEOSQ0AIAVB/v///wFLDQNBfyAFQQN0QQhqQQduQX9qZ3ZBAWohBQwBC0EEQQhBECAFQQdJGyAFQQNJGyEFCyABQRhqQQwgBRD5ECABKAIYIgdFDQEgASgCICEDIAFBEGogByABKAIcENMeIAEoAhAiB0UNAiAAQRBqIQQgByADaiEIAkAgBUEIaiIHRQ0AIAhB/wEgB/wLAAsgAUEANgIwIAEgBUF/aiIJNgIoIAEgCDYCJCABQoyAgICAATcCHCABIAQ2AhggASAJIAVBA3ZBB2wgBUEJSRsiCjYCLCAIQXRqIQsgACgCACIHKQMAQn+FQoCBgoSIkKDAgH+DIRMgAUEYakEMaiEMQQAhBQJAA0AgAkUNAQJAA0AgE0IAUg0BIAVBCGohBSAHQQhqIgcpAwBCf4VCgIGChIiQoMCAf4MhEwwACwsgAUEIaiAIIAkgACgCAEEAIBN6p0EDdiAFaiIDa0EMbGoiBEF0aigCACINIARBeGooAgAgDRutELYXIAsgASgCCEF0bGoiBCAAKAIAIANBdGxqQXRqIgMpAAA3AAAgBEEIaiADQQhqKAAANgAAIAJBf2ohAiATQn98IBODIRMMAAsLIAEgACgCDCIFNgIwIAEgCiAFazYCLCAAIAxBBBCrGiABKAIoIgVFDQMgAUE0aiABKAIcIAEoAiAgBUEBahCNECABKAIkIAEoAjxrIAEoAjQgASgCOBDRIAwDCyAFIARBB3FBAEdqIQcgACgCACINIQUDQAJAIAcNAAJAAkAgBEEISQ0AIA0gBGogDSkAADcAAAwBCyAERQ0AIA1BCGogDSAE/AoAAAsgDUEIaiEOIA1BdGohD0EAIQcDQAJAAkAgByIFIARPDQAgBSAFIARJaiEHIA0gBWoiCS0AAEGAAUcNAiAPIAVBdGxqIRAgDUEAIAVrQQxsaiIIQXhqIQogCEF0aiEMA0AgBSAMKAIAIgggCigCACAIGyIIIANxIgtrIA0gAyAIrRCPESIRIAtrcyADcUEISQ0CIA0gEWoiCy0AACESIAsgCEEZdiIIOgAAIA4gEUF4aiADcWogCDoAACAPIBFBdGxqIQgCQCASQf8BRw0AIAlB/wE6AAAgDiAFQXhqIANxakH/AToAACAIQQhqIBBBCGooAAA2AAAgCCAQKQAANwAADAQLIBAgCEEDEKsaDAALCyAAIAYgAms2AggMBgsgCSAIQRl2Igg6AAAgDiAFQXhqIANxaiAIOgAADAALCyAFIAUpAwAiE0J/hUIHiEKBgoSIkKDAgAGDIBNC//79+/fv37//AIR8NwMAIAVBCGohBSAHQX9qIQcMAAsLEIccAAsACyABQcAAaiQAQYGAgIB4C7cJAhB/An4jAEEQayICJABBCiEDIAEoAhghBCABKAIEIQUgASgCACEGIAEtABwhByABKAKQASEIAkACQAJAIAEoAggiCUEKRw0ADAELAkACQAJAAkACQAJAAkACQAJAAkAgCUF+aiIDQQEgA0EISRsOCAAFAQIGBgMEAAtBAiEDIAEpAxAiEkIDg0IAUg0IIBKnIgkgCSgCACIJQQFqNgIAIAlBf0oNCQwKC0EEIQMgASkDECISQgODQgBSDQcgEqciCSAJKAIAIglBAWo2AgAgCUF/TA0JDAgLQQUhAyABKQMQIhJCA4NCAFINBiASpyIJIAkoAgAiCUEBajYCACAJQX9MDQgMBwsgASgCDCEJEOYfIQogCUEEaigCACELIAktAAwhDCACIAlBCGooAgAiCUEAQQRBBBCrDSACKAIEIQ0gAigCAEEBRg0DIAIoAgghAwJAIAlBAnQiDkUNACADIAsgDvwKAAALIAogDDoADCAKIAk2AgggCiADNgIEIAogDTYCAEEIIQMMBgtBAC0A4PadARpBIBCEASIKRQ0GIAogASgCDBCeAUEJIQMMBQsgCUEBcQ0CQQAhAyABKQMQIhJCA4NCAFINAyASpyIJIAkoAgAiCUEBajYCACAJQX9MDQUMBAsgASkDECESIAEoAgwhCiAJIQMMAwsgDSACKAIIQbjkmwEQ2CAAC0EALQDg9p0BGkEgEIQBIgpFDQIgCiABKAIMEJ4BQQEhAwwBCwtBACENQQAhDAJAIAEoAiBBgICAgHhGDQAgASgCNCEMIAEoAighDQsgASgCaCELIAEoAnghDiABLQAdIQ9BCyEJAkACQCABKAKYASIQQQtHDQAMAQtBCiEJAkACQCAQQQpHDQAMAQtBCCEJAkACQAJAAkACQAJAAkACQAJAIBBBfmoiEUEBIBFBCEkbDggABQECBgYDBAALQQIhCSABKQOgASITQgODQgBSDQcgE6ciESARKAIAIhBBAWo2AgAgEEF/TA0KDAgLQQQhCSABKQOgASITQgODQgBSDQYgE6ciESARKAIAIhBBAWo2AgAgEEF/TA0JDAcLQQUhCSABKQOgASITQgODQgBSDQUgE6ciESARKAIAIhBBAWo2AgAgEEF/TA0IDAYLIAEoApwBEKAVIREMBQtBCSEJIAFBnAFqEKoBIREMBAsgEEEBcQ0BQQAhCSABKQOgASITQgODQgBSDQIgE6ciESARKAIAIhBBAWo2AgAgEEF/TA0FDAMLIAEpA6ABIRMgASgCnAEhESAQIQkMAgtBASEJIAFBnAFqEKoBIREMAQsLIAJBCGogAUGoAWoiEEEIaigCADYCACACIBApAgA3AwALIAAgCDYCMCAAIAs2AiwgACAONgIoIAAgDDYCJCAAIA02AiAgACAPOgAdIAAgBzoAHCAAIAQ2AhggACASNwMQIAAgCjYCDCAAIAM2AgggACAFNgIEIAAgBjYCACAAIAEpA7gBNwNYIAAgASkDwAE3A2AgAEHoAGogAUHIAWooAgA2AgAgACATNwNAIAAgETYCPCAAIAk2AjggACACKQMANwJIIABB0ABqIAJBCGooAgA2AgAgAkEQaiQADwsAC4wJAgt/An4jAEEgayICJAACQAJAIAAoAggiAyABSQ0AIAFFDQECQAJAIAMgAWsiBCAAKAIYIgUgACgCFCIGakEBdk8NACAAKAIEIQcCQCAFRQ0AQQAhBgJAIAAoAhAiCEUNAAJAIAhBCWoiCUUNACAAKAIMQf8BIAn8CwALIAggCEEBakEDdkEHbCAIQQhJGyEGCyAAIAY2AhQgAEEANgIYCyAGIARJDQEgAyABRg0DIAcgAUEUbGohCCAHIANBFGxqIQYgAEEMaiEKA0ACQCAAKAIMIgMgACgCECIHIAgoAhAiAXEiBGopAABCgIGChIiQoMCAf4MiDUIAUg0AQQghCQNAIAQgCWohBCAJQQhqIQkgAyAEIAdxIgRqKQAAQoCBgoSIkKDAgH+DIg1QDQALCwJAIAMgDXqnQQN2IARqIAdxIgRqLAAAIglBAEgNACADIAMpAwBCgIGChIiQoMCAf4N6p0EDdiIEai0AACEJCyAAKAIYIQsgAa0hDSAJQQFxIQkCQAJAAkACQCAAKAIUIgxFDQAgCSEFDAELQQAhBSAJDQELIAAgDCAFazYCFCADIARqIA1CGYinIgE6AAAgAyAEQXhqIAdxaiEHDAELIAoQjwcaAkAgACgCDCIDIAAoAhAiByABcSIEaikAAEKAgYKEiJCgwIB/gyIOQgBSDQBBCCEBA0AgBCABaiEEIAFBCGohASADIAQgB3EiBGopAABCgIGChIiQoMCAf4MiDlANAAsLAkAgAyAOeqdBA3YgBGogB3EiBGosAAAiCUEASA0AIAMgAykDAEKAgYKEiJCgwIB/g3qnQQN2IgRqLQAAIQkLIAMgBGogDUIZiKciAToAACAAIAAoAhQgCUEBcWs2AhQgAyAEQXhqIAdxaiEHCyAHQQhqIAE6AAAgACAAKAIYQQFqNgIYIAMgBEECdGtBfGogCzYCACAIQRRqIgggBkcNAAwECwsgBUUNAiAAKAIMIglBCGohAyAJKQMAQn+FQoCBgoSIkKDAgH+DIQ0gACgCECEKIAUhByAJIQQDQAJAIA1CAFINAANAIARBYGohBCADKQMAIQ0gA0EIaiIIIQMgDUKAgYKEiJCgwIB/gyINQoCBgoSIkKDAgH9RDQALIA1CgIGChIiQoMCAf4UhDSAIIQMLIAdBf2ohByANQn98IA2DIQ4CQAJAIAQgDXqnQQF2QTxxayILQXxqIggoAgAiDCABSQ0AIAggDCABazYCAAwBC0GAASEIAkAgCSAJIAtrQQJ1IgtqIgwpAAAiDSANQgGGg0KAgYKEiJCgwIB/g3qnQQN2IAkgC0F4aiAKcWoiCykAACINIA1CAYaDQoCBgoSIkKDAgH+DeadBA3ZqQQdLDQAgACAGQQFqIgY2AhRB/wEhCAsgDCAIOgAAIAAgBUF/aiIFNgIYIAtBCGogCDoAAAsgDiENIAdFDQMMAAsLQYymmgFBxQBB1KaaARCMGgALIAJBADYCGCACQQE2AgwgAkGU1psBNgIIIAJCBDcCECACQQhqQZSnmgEQqB0ACyACQSBqJAAL5AkBBX8jAEEQayICJAACQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgAOCwABAgMEBQYHCAkKAAsgASAAQQhqELELDAkLIAEtACghAyABQQA6ACggAS0AeSEEIAFBADoAeSABQSxqIQUCQCAAKAIoIgYoAgBBGkcNACACIAYpAwggBkEYaigCABDnGiAFIAIpAwAgAigCCBCQCwsgBiABEHggASADOgAoIAEgBDoAeSAAKAIIQQJJDQggAUEAOgB5IAFBADoAKAJAIAAoAgwiACgCAEEaRw0AIAIgACkDCCAAQRhqKAIAEOcaIAUgAikDACACKAIIEJALCyAAIAEQeCABIAM6ACggASAEOgB5DAgLIAAoAghFDQcgAS0AKCEGIAFBADoAKCABLQB5IQMgAUEAOgB5AkAgACgCDCIAKAIAQRpHDQAgAiAAKQMIIABBGGooAgAQ5xogAUEsaiACKQMAIAIoAggQkAsLIAAgARB4IAEgBjoAKCABIAM6AHkMBwsgAS0AKCEGIAFBADoAKCABLQB5IQMgAUEAOgB5AkAgACgCBCIAKAIAQRpHDQAgAiAAKQMIIABBGGooAgAQ5xogAUEsaiACKQMAIAIoAggQkAsLIAAgARB4IAEgBjoAKCABIAM6AHkMBgsCQCAAKAIEIgAoAgAiBkEDRw0AIABBBGogARCYCwwGCyABLQAoIQQgAUEAOgAoIAEtAHkhBSABQQA6AHkCQCAAKAIgIgMoAgBBGkcNACACIAMpAwggA0EYaigCABDnGiABQSxqIAIpAwAgAigCCBCQCwsgAyABEHggASAEOgAoIAEgBToAeSAGQQJJDQUgAUEAOgB5IAFBADoAKAJAIAAoAgQiACgCAEEaRw0AIAIgACkDCCAAQRhqKAIAEOcaIAFBLGogAikDACACKAIIEJALCyAAIAEQeCABIAQ6ACggASAFOgB5DAULIAEtACghBiABQQA6ACggAS0AeSEDIAFBADoAeQJAIAAoAgQiACgCAEEaRw0AIAIgACkDCCAAQRhqKAIAEOcaIAFBLGogAikDACACKAIIEJALCyAAIAEQeCABIAY6ACggASADOgB5DAQLIAEtACghBiABQQA6ACggAS0AeSEDIAFBADoAeQJAIAAoAgQiACgCAEEaRw0AIAIgACkDCCAAQRhqKAIAEOcaIAFBLGogAikDACACKAIIEJALCyAAIAEQeCABIAY6ACggASADOgB5DAMLIAEtACghBiABQQA6ACggAS0AeSEDIAFBADoAeQJAIAAoAgQiACgCAEEaRw0AIAIgACkDCCAAQRhqKAIAEOcaIAFBLGogAikDACACKAIIEJALCyAAIAEQeCABIAY6ACggASADOgB5DAILIAEtACghBiABQQA6ACggAS0AeSEDIAFBADoAeQJAIAAoAgQiACgCAEEaRw0AIAIgACkDCCAAQRhqKAIAEOcaIAFBLGogAikDACACKAIIEJALCyAAIAEQeCABIAY6ACggASADOgB5DAELIAEtACghBiABQQA6ACggAS0AeSEDIAFBADoAeQJAIAAoAgQiACgCAEEaRw0AIAIgACkDCCAAQRhqKAIAEOcaIAFBLGogAikDACACKAIIEJALCyAAIAEQeCABIAY6ACggASADOgB5CyACQRBqJAALxwkBAn8CQAJAQQAoAoT2nQEiAEUNACAAKAIEQf////8HTw0BQQEhAQJAIAAtAAgNAEEBIQEgAC0ACQ0AQQEhASAALQAKDQBBASEBIAAtAAsNAEEBIQEgAC0ADA0AQQEhASAALQANDQBBASEBIAAtAA4NAEEBIQEgAC0ADw0A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BEEYakEUaigCADYCACAAQQxqIARBGGpBDGopAgA3AgAgACAMNgIADAgLIBEgA0Gs44MBEMMSAAsgAyAMQbzjgwEQwxIACyADIBNBjOODARDDEgALIBBBAWohECANQQFqIg0gDkcNAAsLIARBGGogCCADIAsQuwsgBCgCGCIDQQNGDQAgACAEKQIcNwIEIABBFGogBEEYakEUaigCADYCACAAQQxqIARBGGpBDGopAgA3AgAgACADNgIADAILIAJBEGoiAiAJRw0ACyAAQQM2AgALIARBMGokAAvECAEGfwJAIAAoAggiAyABRw0AQQEPCyAAKAIEIgQgAUEwbGohBSAEIANBMGxqIQEgAigCBCEEIAIoAgwhBgNAAkAgBCIDIAZHDQBBAA8LIAIgA0EEaiIENgIEAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAygCACIDKAIAQXRqIgdBByAHQSZJGw4mLAABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQsCyADQRRqIQcgA0EQaiEIDCwLIANBFGohByADQRBqIQgMKwsgAygCICIIQTRqIQcgCEEwaiEIDCoLIANBDGohByADQQhqIQgMKQsgA0EIaiEHIANBBGohCAwoCyADQRBqIQcgA0EMaiEIDCcLIANBNGohByADQTBqIQgMJgsgA0EkaiEHIANBIGohCAwlCyADQSRqIQcgA0EgaiEIDCQLIANBFGohByADQRBqIQgMIwsgA0EgaiEHIANBHGohCAwiCyADQRhqIQcgA0EUaiEIDCELIANBFGohByADQRBqIQgMIAsgA0EUaiEHIANBEGohCAwfCyADKAIIDgcWFxgZGhscFgsgA0EgaiEHIANBHGohCAwdCyADQRBqIQcgA0EMaiEIDBwLIANBGGohByADQRRqIQgMGwsgAygCICIIQShqIQcgCEEkaiEIDBoLIANBCGohByADQQRqIQgMGQsgA0EIaiEHIANBBGohCAwYCyADQQxqIQcgA0EIaiEIDBcLIANBDGohByADQQhqIQgMFgsgA0EcaiEHIANBGGohCAwVCyADQSxqIQcgA0EoaiEIDBQLIANBCGohByADQQRqIQgMEwsgAygCBCIIQQRqIQcMEgsgA0EUaiEHIANBEGohCAwRCyADQRBqIQcgA0EMaiEIDBALIANBDGohByADQQhqIQgMDwsgA0EMaiEHIANBCGohCAwOCyADQRBqIQcgA0EMaiEIDA0LIANBEGohByADQQxqIQgMDAsgA0EQaiEHIANBDGohCAwLCyADQRRqIQcgA0EQaiEIDAoLIANBDGohByADQQhqIQgMCQsgA0EIaiEHIANBBGohCAwICyADQRxqIQcgA0EYaiEIDAcLIANBEGohByADQQxqIQgMBgsgA0EQaiEHIANBDGohCAwFCyADQRRqIQcgA0EQaiEIDAQLIANBFGohByADQRBqIQgMAwsgA0EkaiEHIANBIGohCAwCCyADQSRqIQcgA0EgaiEIDAELIANBCGohByADQQRqIQgLIAgoAgAhCCABQQxqIAcoAgA2AgAgAUEIaiAINgIAIAFBBGogAzYCACABQRI2AgAgACAAKAIIQQFqNgIIIAFBMGoiASAFRw0AC0EBC6UJAQN/AkACQAJAA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIADhMADw8BAgMPDwQFEA4MCwoJCAcGAAsgACgCDCICRQ0OIAAoAgghACACQTBsIQIDQCAAIAEQogMgAEEwaiEAIAJBUGoiAg0ADA8LCyABIAAoAgQQqwEgACgCCCEADAsLIAAoAgwiAEUNDCABIAAQqwEPCyAAKAIoIQAMCQsgASAAKAIEEKsBIAAoAgggARCiAyAAKAIUIgANCAwKCyABIAAoAhAQqwEgACgCDCICRQ0JIAAoAggiAyACQRhsaiEEA0ACQCADKAIUIgBFDQAgASAAEKsBCwJAIANBCGooAgAiAkUNACADQQRqKAIAIQAgAkEwbCECA0AgACABEKIDIABBMGohACACQVBqIgINAAsLIANBGGoiAyAERg0KDAALCyABIAAoAgQQqwEMCAsgAEEIaiABEOQDDwsCQAJAAkACQCAAKAIEDgMAAQIACyAAKAIIIgIoAggiA0UNAiACKAIEIgIgA0E4bGohBANAIAIgARDuCQJAIAJBMGooAgAiA0UNACABIAMQqwELIAJBOGoiAiAERw0ADAMLCyAAKAIIIgIoAggiA0UNASACKAIEIgIgA0E4bGohBANAIAIgARDuCQJAIAJBMGooAgAiA0UNACABIAMQqwELIAJBOGoiAiAERw0ADAILCyAAKAIIIAEQzQsLIAEgACgCDBCrASAAKAIQIQAMBAsCQAJAAkACQCAAKAIEDgMAAQIACyAAKAIIIgIoAggiA0UNAiACKAIEIgIgA0E4bGohBANAIAIgARDuCQJAIAJBMGooAgAiA0UNACABIAMQqwELIAJBOGoiAiAERw0ADAMLCyAAKAIIIgIoAggiA0UNASACKAIEIgIgA0E4bGohBANAIAIgARDuCQJAIAJBMGooAgAiA0UNACABIAMQqwELIAJBOGoiAiAERw0ADAILCyAAKAIIIAEQzQsLIAEgACgCDBCrASAAKAIQIQAMAwsCQCAAKAIEIgJBAkYNAAJAIAJBAXFFDQAgASAAKAIIEKsBDAELIAAoAggiAigCCCIDRQ0AIAIoAgQiAiADQThsaiEEA0AgAiABEO4JAkAgAkEwaigCACIDRQ0AIAEgAxCrAQsgAkE4aiICIARHDQALCwJAIAAoAhgiAkUNACABIAIQqwELAkAgACgCHCICRQ0AIAEgAhCrAQsgACgCDCEADAILIAEgACgCBBCrASAAKAIIIQAMAQsgASAAKAIEEKsBIAAoAgghAAwACwsCQCAAKAIEIgMoAlAiAkUNACADKAJMIQAgAkEwbCECA0AgACABEKIDIABBMGohACACQVBqIgINAAsLAkACQAJAIAMoAgBBeWoOAgECAAsgAyABEO4JCyADKAIwIgJFDQAgAygCLCEAIAJBMGwhAgNAIAAgARCiAyAAQTBqIQAgAkFQaiICDQALCyADKAJgQYCAgIB4Rg0AIAMoAmgiAkUNACADKAJkIQAgAkEwbCECA0AgACABEKIDIABBMGohACACQVBqIgINAAsLDwsgASAAKAIEEKsBC8UJAQp/IwBBkAJrIgEkAAJAAkACQAJAAkAgACgCACICQYiAxABHDQAgACgCBCgCACICQYiAxABGDQEgAkGAgMQARw0BIAAoAggoAgAiAkGIgMQARg0BIAJBgIDEAEcNAQwDCyACQYCAvH9qIgJBAiACQQhJGyICQQZJDQECQAJAIAJBemoOAgABAAsgACgCBCgCACICQYiAxABGDQEgAkGAgMQARw0BDAILIAAoAgxFDQELQQAtAOD2nQEaAkACQEHYABCE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DQAgAhC6AQsgAUE4aiIBIANHDQAMAgsLIAAoAggQvgsLIAAoAgwQugEgACgCECEADAQLAkACQAJAAkAgACgCBA4DAAECAAsgACgCCCIBKAIIIgJFDQIgASgCBCIBIAJBOGxqIQMDQCABEP4JAkAgAUEwaigCACICRQ0AIAIQugELIAFBOGoiASADRw0ADAMLCyAAKAIIIgEoAggiAkUNASABKAIEIgEgAkE4bGohAwNAIAEQ/gkCQCABQTBqKAIAIgJFDQAgAhC6AQsgAUE4aiIBIANHDQAMAgsLIAAoAggQvgsLIAAoAgwQugEgACgCECEADAMLAkAgACgCBCIBQQJGDQACQCABQQFxRQ0AIAAoAggQugEMAQsgACgCCCIBKAIIIgJFDQAgASgCBCIBIAJBOGxqIQMDQCABEP4JAkAgAUEwaigCACICRQ0AIAIQugELIAFBOGoiASADRw0ACwsCQCAAKAIYIgFFDQAgARC6AQsCQCAAKAIcIgFFDQAgARC6AQsgACgCDCEADAILIAAoAgQQugEgACgCCCEADAELIAAoAgQQugEgACgCCCEADAALCwJAIAAoAgQiAigCUCIBRQ0AIAIoAkwhACABQTBsIQEDQCAAEKkDIABBMGohACABQVBqIgENAAsLAkACQAJAIAIoAgBBeWoOAgECAAsgAhD+CQsgAigCMCIBRQ0AIAIoAiwhACABQTBsIQEDQCAAEKkDIABBMGohACABQVBqIgENAAsLIAIoAmBBgICAgHhGDQAgAigCaCIBRQ0AIAIoAmQhACABQTBsIQEDQCAAEKkDIABBMGohACABQVBqIgENAAsLDwsgACgCBBC6AQvdCAEGfyMAQYACayICJAACQAJAAkACQANAAkAgACgCACIDQQJGDQACQAJAIAMOBwcBAAQGBwUHCwALIAAoAgwiA0UNBSAAKAIIIQAgA0EobCEDA0ACQCAAKAIAQQdGDQAgACABEKoDCyAAQShqIQAgA0FYaiIDDQAMBgsLIAAoAgQhAAwACwsgACgCDCIDRQ0CIAAoAgghBCADQThsIQVBACEAA0ACQAJAAkACQAJAAkACQCAEIABqIgMoAgAOAwABAgALIANBCGooAgBBA0cNBCADQQxqKAIAIgYoAgBBGkcNAiACQcABaiABKAIAIAEoAgQgBkEIaiIHEIINIAIoAsABQTJGDQQgBhDRASAGQThqIAJBwAFqQThqKQMANwMAIAZBMGogAkHAAWpBMGopAwA3AwAgBkEoaiACQcABakEoaikDADcDACAGQSBqIAJBwAFqQSBqKQMANwMAIAZBGGogAkHAAWpBGGopAwA3AwAgBkEQaiACQcABakEQaikDADcDACAHIAJBwAFqQQhqKQMANwMAIAYgAikDwAE3AwAMBAsgA0EwaigCACIDRQ0EIAMoAgBBGkcNAiACQYABaiABKAIAIAEoAgQgA0EIaiIGEIINIAIoAoABQTJGDQQgAxDRASADQThqIAJBgAFqQThqKQMANwMAIANBMGogAkGAAWpBMGopAwA3AwAgA0EoaiACQYABakEoaikDADcDACADQSBqIAJBgAFqQSBqKQMANwMAIANBGGogAkGAAWpBGGopAwA3AwAgA0EQaiACQYABakEQaikDADcDACAGIAJBgAFqQQhqKQMANwMAIAMgAikDgAE3AwAMBAsgA0EEaigCACABEJsEDAMLIAYgARBGDAELIAMgARBGDAELIANBKGooAgAgARCbBAsgBSAAQThqIgBHDQAMAwsLAkAgACgCBCIAKAIAQRpHDQAgAiABKAIAIAEoAgQgAEEIaiIDEIINIAIoAgBBMkYNAiAAENEBIABBOGogAkE4aikDADcDACAAQTBqIAJBMGopAwA3AwAgAEEoaiACQShqKQMANwMAIABBIGogAkEgaikDADcDACAAQRhqIAJBGGopAwA3AwAgAEEQaiACQRBqKQMANwMAIAMgAkEIaikDADcDACAAIAIpAwA3AwAMAgsgACABEEYMAQsgACgCBCABEKoDAkAgACgCCCIAKAIAQRpHDQAgAkHAAGogASgCACABKAIEIABBCGoiAxCCDSACKAJAQTJGDQEgABDRASAAQThqIAJBwABqQThqKQMANwMAIABBMGogAkHAAGpBMGopAwA3AwAgAEEoaiACQcAAakEoaikDADcDACAAQSBqIAJBwABqQSBqKQMANwMAIABBGGogAkHAAGpBGGopAwA3AwAgAEEQaiACQcAAakEQaikDADcDACADIAJBwABqQQhqKQMANwMAIAAgAikDQDcDAAwBCyAAIAEQRgsgAkGAAmokAAvaCAEFfwJAAkACQAJAAkACQAJAIAAoAgAOCAABBQQGBgMCAAsgASAA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DQEMBAtBwOqEARDJIgALIANBDGogACACEOEEAkAgAygCDEEBRw0AQQAhBAwDCyADIAMoAhAiAiADKAIUajYCHCADIAI2AhggA0EYahDsDCICQYCAxABGDQELIAIQmg5B/wFxIQQMAQtBwOqEARDJIgALIAUgBHNBAXMhCQsgA0EgaiQAIAkL/AgBCX8jAEEQayICJAACQAJAAkACQAJAIAEoAgAOBQQAAQIDBAsgASgCBEEBRw0DIAAtACghAyAAQQA6ACggAC0AeSEEIABBADoAeQJAIAEoAggiASgCAEEaRw0AIAIgASkDCCABQRhqKAIAEOcaIABBLGogAikDACACKAIIEJALCyABIAAQeCAAIAM6ACggACAEOgB5DAMLIAAtACghAyAAQQA6ACggAC0AeSEEIABBADoAeQJAIAEoAgQiASgCAEEaRw0AIAIgASkDCCABQRhqKAIAEOcaIABBLGogAikDACACKAIIEJALCyABIAAQeCAAIAM6ACggACAEOgB5DAILIAEoAgQiBUHAAGogABCACwJAIAVBhAFqKAIAIgNFDQAgBUGAAWooAgAhASADQdgAbCEDIABBLGohBgNAAkACQAJAIAEoAgBBfGoOAgIAAQsgAC0AKCEHIABBADoAKCAALQB5IQggAEEAOgB5AkAgAUEEaigCACIEKAIAQRpHDQAgAiAEKQMIIARBGGooAgAQ5xogBiACKQMAIAIoAggQkAsLIAQgABB4IAAgBzoAKCAAIAg6AHkMAQsgASAAEPwGCyABQdgAaiEBIANBqH9qIgMNAAsLAkAgBUGYAWooAgAiA0UNACAFQZQBaigCACEBIANBKGwhAwNAIAEgABCNBCABQShqIQEgA0FYaiIDDQALCyAFLQA8QQZGDQEgBUEQaiAAEIALDAELIAEoAgwiA0UNACABKAIIIgcgA0EobGohCSAAQSxqIQoDQAJAAkACQAJAAkAgBygCAA4FBAABAgMECyAHKAIEQQFHDQMgAC0AKCEDIABBADoAKCAALQB5IQQgAEEAOgB5AkAgBygCCCIBKAIAQRpHDQAgAiABKQMIIAFBGGooAgAQ5xogCiACKQMAIAIoAggQkAsLIAEgABB4IAAgAzoAKCAAIAQ6AHkMAwsgAC0AKCEDIABBADoAKCAALQB5IQQgAEEAOgB5AkAgBygCBCIBKAIA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/wGDQgRRDQAgACAENwIADAELAkAgASgCPEUNACADQRhqIAIgA0EMakHey5sBQQEQhQ0CQCADLQAYQQRGDQAgAykDGCIEQv8Bg0IEUQ0AIAAgBDcCAAwCCwJAAkACQAJAIAItAE0NACADQRhqIAIQ3Q8gAy0AGEEERg0AIAMpAxgiBEL/AYNCBFINAQsgA0EANgIYIANBKGogAiADQRhqQbuymwFBARCFDQJAIAMtAChBBEYNACADKQMoIgRC/wGDQgRSDQMLAkAgAi0ATQ0AIANBKGogAhCmEwJAIAMtAChBBEYNACADKQMoIgRC/wGDQgRSDQQLIAIgAigCLEEBajYCLAsgA0EoaiACIANBGGpBtcybAUEEEIYNAkAgAy0AKEEERg0AIAMpAygiBEL/AYNCBFINAwsgA0EoaiACIANBGGpBxcubAUEBEIUNAkAgAy0AKEEERg0AIAMpAygiBEL/AYNCBFINAwsCQCACLQBNDQAgA0EoaiACEN0PIAMtAChBBEYNACADKQMoIgRC/wGDQgRSDQMLIANBKGogAUE8aiACEIkjAkAgAy0AKEEERg0AIAMpAygiBEL/AYNCBFINAwsgAi0ATUEBRg0BIAIgAigCLEF/ajYCLCADQShqIAIQphMgAy0AKEEERg0BIAMpAygiBEL/AYNCBFENAQwCCyAAIAQ3AgAMAwsgA0EoaiACIANBGGpByMubAUEBEIUNIAMtAChBBEYNASADKQMoIgRC/wGDQgRRDQELIARC/wGDQgRRDQAgACAENwIADAELIANBGGogAiADQQxqQbOBnQFBARCFDQJAIAMtABhBBEYNACADKQMYIgRC/wGDQgRRDQAgACAENwIADAELAkAgAS0ANEEDRg0AIANBGGogAiADQQxqQd/LmwFBARCFDQJAIAMtABhBBEYNACADKQMYIgRC/wGDQgRRDQAgACAENwIADAILIANBGGogAUEgaiACEIwIIAMtABhBBEYNACADKQMYIgRC/wGDQgRRDQAgACAENwIADAELIANBGGogAUE4aiACEI8fAkAgAy0AGEEERg0AIAMpAxgiBEL/AYNCBFENACAAIAQ3AgAMAQsgAEEEOgAACyADQTBqJAAL1QgBDX8jAEHAAGsiBSQAAkAgAygCCA0AAkAgASAAKALQAiIGTw0AAkACQAJAAkACQCAAKALM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QQZ0IghqIgk2AiQgAkHYAGohCiACQegAakEEaiELIAJBKGpBBHIhDEEEIQ0CQAJAA0ACQAJAAkACQAJAAkAgCEUNAAJAIAMoAgAiBUEHRg0AIANBBGohBCACIAU2AigCQEE8RQ0AIAwgBEE8/AoAAAsgA0HAAGohDiAFDgQCAwQFCAsgA0HAAGohCQsgAiAJNgIcIAJBGGoQ0xICQCABLQDIASIDQQFHDQAgARDjDiAAQQhqIAJBDGpBCGooAgA2AgAgACACKQIMNwIADAkLIAEoAsQBIQQgASgCwAEhBSACQYwBaiADEIYeIAJBATYCLCACQZTzmwE2AiggAkIBNwI0IAJB9watQiCGQeComwGthDcDGCACIAJBGGo2AjAgAkGYAWogAkEoahCNFyACQawBaiACQZQBaigCADYCACACIAIpAowBNwKkASAFIAQgAkGYAWoQhBchAwJAIAEtAMgBQaIBRw0AIAEQ1xIhBCABEOMOIAEgBBD6EgsgAEGAgICAeDYCACAAIAM2AgQMBwsgC0EYaiADQSBqKQIANwIAIAtBEGogA0EYaikCADcCACALQQhqIANBEGopAgA3AgAgCyADQQhqKQIANwIADAMLIAJB6ABqQRhqIARBGGooAgA2AgAgAkHoAGpBEGogBEEQaikCADcDACACQegAakEIaiAEQQhqKQIANwMAIAIgBCkCADcDaAwCCyACQegAakEQaiAEQRBqKQIANwMAIAJB6ABqQQhqIARBCGopAgA3AwAgAiAEKQIANwNoDAELIAJB6ABqQRhqIARBGGooAgA2AgAgAkHoAGpBEGogBEEQaikCADcDACACQegAakEIaiAEQQhqKQIANwMAIAIgBCkCADcDaAsCQCAGIAIoAgxHDQAgAkEMahDuGCACKAIQIQcLIAcgDWoiA0F8aiAFNgIAAkBBJEUNACADIAJB6ABqQST8CgAACyACIAZBAWoiBjYCFCAKEPkfAkAgAigCKEEESQ0AIAJBKGoQpBQLIAhBQGohCCANQShqIQ0gDiEDDAALCyACIA42AhwgAkGYAWpBBHIgAS0AyAEQhh4gAkHXADYCrAEgAkHArZsBNgKoASACQbCAgIB4NgKYASABKALAASABKALEASACQZgBahCEFyEDAkAgAS0AyAFBogFHDQAgARDXEiEEIAEQ4w4gASAEEPoS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AyADKAIAIgNBAWo2AgAgA0F/Sg0DDAULAkACQCABKAIMIgMoAgBBZWoOAgEAAgsgAygCDA0BIAMoAhhBAUcNAQJAIAMoAhQiAykDEFANACACQTBqIANBEGoQ0AkCQCACKAIwRQ0AIAIpAzghCAwFCyACKAI0KQMAIghCA4NCAFINBCAIpyIDIAMoAgAiA0EBajYCACADQX9MDQYMBAsgAykDACIIQgODQgBSDQMgCKciAyADKAIAIgNBAWo2AgAgA0F/TA0FDAMLIAMoAghFDQELIAIpAwgiCEIDg0IAUg0CIAinIgAgACgCACIBQX9qNgIAIAFBAUcNAiAAIAAoAhAQ6R0MAgsgAkEwaiADQRBqENAJAkAgAigCMEEBRw0AIAIpAzghCAwBCyACKAI0KQMAIghCA4NCAFINACAIpyIDIAMoAgAiA0EBajYCACADQX9MDQILIAIgCDcDKCACIAIoAhA2AiAgAiACKQMINwMYAkAgAEHAAGogAkEYahCjCCIARQ0AAkAgACgCGEECTw0AIAJB8ABqIABBGGoQ9wkgAkEwaiACQfAAahDJBCABEOQBIAFBOGogAkEwakE4aikDADcDACABQTBqIAJBMGpBMGopAwA3AwAgAUEoaiACQTBqQShqKQMANwMAIAFBIGogAkEwakEgaikDADcDACABQRhqIAJBMGpBGGopAwA3AwAgAUEQaiACQTBqQRBqKQMANwMAIAFBCGogAkEwakEIaikDADcDACABIAIpAzA3AwALIAJBGGoQ6REMAQsgAkEYahDpEQsgAkGAAWokAA8LAAvSBwIBfwF+IwBBIGsiAyQAIANBEGogAiABKAIAQQAQogICQAJAIAMtABBBBEYNACADKQMQIgRC/wGDQgRRDQAgACAENwIADAELAkAgAS0AKkUNACADQQA2AhAgA0EIaiACIANBEGpBr5ubAUEFEIYNAkAgAy0ACEEERg0AIAMpAwgiBEL/AYNCBFENACAAIAQ3AgAMAgsgA0EQaiACEN0PIAMtABBBBEYNACADKQMQIgRC/wGDQgRRDQAgACAENwIADAELAkAgAS0AKEUNACADQQA2AhAgA0EIaiACIANBEGpBlJybAUECEIYNAkAgAy0ACEEERg0AIAMpAwgiBEL/AYNCBFENACAAIAQ3AgAMAgsgA0EQaiACEN0PIAMtABBB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AQIDBgYEBQALIABBADYCGAJAIAAoAiAiAUEIaigCACICRQ0AIAFBBGooAgAhACACQQxsIQIDQCAAKAIAELoBIABBDGohACACQXRqIgINAAsLAkAgAUEUaigCACICRQ0AIAFBEGooAgAhACACQdgAbCECA0AgABDJAiAAQdgAaiEAIAJBqH9qIgINAAsLIAEoAjAiAEUNBSAAELoBDwsgAEEANgIYAkAgACgCICIDQQhqKAIAIgBFDQAgA0EEaigCACIBIABBBnRqIQQDQAJAIAFBOGooAgAiAkUNACABQTRqKAIAIQAgAkEMbCECA0AgACgCABC6ASAAQQxqIQAgAkF0aiICDQALCyABEL4LIAFBwABqIgAhASAAIARHDQALCwJAIANBFGooAgAiAkUNACADQRBqKAIAIQAgAkEMbCECA0AgACgCABC6ASAAQQxqIQAgAkF0aiICDQALCyADKAIYQYCAgIB4Rg0EIANBIGooAgAiAkUNBCADQRxqKAIAIQAgAkEwbCECA0AgABCpAyAAQTBqIQAgAkFQaiICDQAMBQsLIAAoAgQiAEEIaigCACICRQ0DIABBBGooAgAiACACQThsaiEBA0AgABD+CQJAIABBMGooAgAiAkUNACACELoBCyAAQThqIgAgAUcNAAwECwsgACgCBCIAQQhqKAIAIgJFDQIgAEEEaigCACIAIAJBOGxqIQEDQCAAEP4JAkAgAEEwaigCACICRQ0AIAIQugELIABBOGoiACABRw0ADAMLCyAAKAIEIgBBADYCECAAQShqKAIAIgJFDQEgAEEkaigCACIAIAJBMGxqIQEDQAJAIAAoAgANACAAQRhqQQA2AgALAkAgAEEoaigCACICRQ0AIAIQugELIABBMGoiACABRw0ADAILCwJAIAAoAgQiACgCAA0AIABBADYCGAsgAC0ARSICQQNGDQACQCACQQJGDQAgAEEANgI4AkAgACgCQCIALQAlQQJGDQAgAEEANgIYIABBIGoQ4hAPCyAAQQhqKAIAIgJFDQEgAEEEaigCACEAIAJBOGwhAgNAAkACQCAAKAIAQQlHDQAgAEEIahCpAwwBCyAAEMkDCyAAQThqIQAgAkFIaiICDQAMAgsLIABBKGooAgAiAkUNACAAQSRqKAIAIQAgAkE4bCECA0ACQAJAIAAoAgBBCUcNACAAQQhq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IAcgCk8NBCAAKAIEIgggBmoiDC0AACENIAxBAWotAAAhDAJAIAogACgCAEcNACAAQfSihQEQpxggACgCBCEICyAIIAlqIgggDToAACAAIApBAWoiCjYCCCAIQQFqIAw6AAAgBkECaiEGIAlBAmohCSADIAdBAWoiB0cNAAsLIAogA0kNASAAQQA2AgggAiAANgIUIAIgACgCBCIGNgIMIAIgAzYCGCACIAogA2s2AhwgAiAGIANBAXRqNgIQIAJBDGoQqAwgACAALQAMIAEtAAxxOgAMCyACQSBqJAAPCyADIApBpPeaARC8IgALIAcgCkHkooUBEMMSAAvoBwIHfwR+IwBBMGsiAyQAAkACQAJAAkACQCACQQhJDQACQAJAIAJBEUkNACACQXBqIQRC05GMrYjR2p8kIQpCxObBm+DF4owTIQtBACEFA0AgCyEMAkAgBSAESQ0AIANBGGogBCABIAJBuK+YARCUHSADKAIcIgVBB00NBiAFQQ9NDQcgAygCGCIFKQAIIAyFIQsgBSkAACAKhSEKDAMLIAEgBWoiBkEIaikAAELQ4/zMooTOhKR/hSILQv////8PgyAGKQAAIAqFIgpCIIh+QiCJIAtCIIggCkL/////D4N+hSELIAVBEGohBSAMIQoMAAsLIAEpAAAhCyADQRBqIAJBeGogASACQYiwmAEQlB0gAygCFEEIRw0FIAtC05GMrYjR2p8khSEKIAMoAhApAABCxObBm+DF4owThSELCyACQd3L3Z55bCAKQv////8PgyALQiCIfiACrYUgCkIgiCALQv////8Pg35CIImFIgunakHdy92eeWwgC0IgiKdqQd3L3Z55bEEPdyIFrSELAkACQCACQYAESw0AIAAoAgAiB0F8aiEIIAtCGYhCgYKEiJCgwIABfiENIAAoAgQiBCAFcSEGQQAhCQJAA0AgAyAHIAZqKQAAIgogDYUiDEJ/hSAMQv/9+/fv37//fnyDQoCBgoSIkKDAgH+DNwMoAkADQCADQQhqIANBKGoQ9xcgAygCCEEBcUUNASAIIAMoAgwgBmogBHFBAnRrKAIAIgUpAwggC1INACAFQRhqIAUoAhAgASACEMUeRQ0ADAMLCwJAIAogCkIBhoNCgIGChIiQoMCAf4NCAFINACAGIAlBCGoiCWogBHEhBgwBCwsgByAEIAsgASAC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DAELIAJB6ABqQQhqIAJByAFqQQhqKQIANwMAIAJB6ABqQRBqIAJByAFqQRBqKQIANwMAIAIgAikCyAE3A2ggAiAEOgCAASACQQhqIAJBEGogAkHoAGoQ8wogAigCCEEBcUUNACACKAIMIQMgAkHIAWogARD7DAJAIAMgAigCGCIETw0AIAJBlAFqIAIoAhQgA0EcbGoiA0EIaikCADcCACACQZwBaiADQRBqKQIANwIAIAJBDTYCiAEgAiADKQIANwKMASAAIAEoAgQgASgCCCACQcgBaiACQYgBahChDQwECyADIARBkIeFARDDEgALIAEQ2wgNAAsgAkHcAWogBkEIaigCACIDNgIAIAJByAFqQQhqIAM2AgAgAiAGKQIAIgc3AtQBIAIgBzcDyAEgAkEPNgKIASAAIAEoAgQgASgCCCACQcgBaiACQYgBahChDQwBCyACKAIEIQMgAkHIAWogARD7DAJAIAMgAigCGCIETw0AIAJBlAFqIAIoAhQgA0EcbGoiA0EIaikCADcCACACQZwBaiADQRBqKQIANwIAIAJBDjYCiAEgAiADKQIANwKMASAAIAEoAgQgASgCCCACQcgBaiACQYgBahChDQwBCyADIARBgIeFARDDEgALIAIoAhAgAigCFEEEQRwQ0BILIAJB4AFqJAAL9QcBCX8jAEHAAGsiAyQAIAFBCGohBAJAAkACQAJAAkACQAJAIAEoAghBuYGAgHhHDQAgASgCHCEFIAEoAhghBiABKAIQIQcgASgCFCEIIANBNGogASgCDCIJKAIAIAIQ+wMgAygCOCEKIAMgCEEBQQEQow4gAygCBCELIAMoAgBBAUYNASADKAIIIQICQCAIRQ0AIAIgByAI/AoAAAsgAyAINgIIIAMgAjYCBCADIAs2AgAgCkEcaiAGIAUgAxDcFCAAQQhqIANBNGpBCGooAgA2AgAgACADKQI0NwIAIAlBBEEEEL0TAkAgBCgCAEG5gYCAeEYNACAEEK4DCyABQSBBCBC9EwwGCyABKAIEIQggASgCACELIANBEGogBEEQaikDADcDACADQQhqIARBCGopAwA3AwAgAyAEKQMANwMAIAFBIEEIEL0TIANBHGogAxBiIANBKGogAkEDIAMoAiAiBSADKAIkEPsNQQAtAOD2nQEaIAMoAiwhAUEIEIQBIgRFDQEgBCAINgIEIAQgCzYCACABKAIcIAFBIGoiAigCABDMIiABQSxqIggoAgAgAUEwaigCABDsHCABKAIoIAgoAgAQzSIgCEIENwIAIAFCATcCJCACIAQ2AgAgAUEBNgIcIAFBHGohBAJAAkAgAygCAEHL////B2oOBQAGBgYBBgsgAygCCCECIAMoAgQhCyADQTRqQTZBAUEBEKMOIAMoAjghCCADKAI0QQFGDQMgAygCPCIBQS5qQQApAOyrmQE3AAAgAUEoakEAKQDmq5kBNwAAIAFBIGpBACkA3quZATcAACABQRhqQQApANarmQE3AAAgAUEQakEAKQDOq5kBNwAAIAFBCGpBACkAxquZATcAACABQQApAL6rmQE3AAAgA0E2NgI8IAMgATYCOCADIAg2AjQgBCALIAIgA0E0ahDcFAwFCyADKAIIIQIgAygCBCELIANBNGpBKUEBQQEQow4gAygCOCEIIAMoAjRBAUYNAyADKAI8IgFBKGpBAC0AnKyZAToAACABQSBqQQApAJSsmQE3AAAgAUEYakEAKQCMrJkBNwAAIAFBEGpBACkAhKyZATcAACABQQhqQQApAPyrmQE3AAAgAUEAKQD0q5kBNwAAIANBKTYCPCADIAE2AjggAyAINgI0IAQgCyACIANBNGoQ3BQMBAsgCyADKAIIQbjkmwEQ2CALAAsgCCADKAI8QbjkmwEQ2CAACyAIIAMoAjxBuOSbARDYIAALIAAgAykCKDcCACAAQQhqIANBKGpBCGooAgA2AgACQCADKAIcIgFBgICAgHhGDQAgASAFEL0iCyADEK4DCyADQcAAaiQAC/wGAg1/A34jAEGgAWsiAyQAIAMgAkEIQSgQow4gAygCBCEEAkACQCADKAIAQQFGDQAgAygCCCEFAkAgBEUNACACQShsIQZBACEHIAQhCANAIAYgB0YNAQJAAkACQAJAAkACQCABIAdqIgkoAgAiCg4FAAECAwQACyAJQRxqKAIAIQsgCUEYaigCACEMAkAgCUEIaikDACIQQgODQgBSDQAgEKciDSANKAIAIg1BAWo2AgAgDUF/TA0JCyAJQRBqKQMAIhFCA4NCAFINBCARpyIJIAkoAgAiCUEBajYCACAJQX9KDQQMCAsgCUEQaikCACERAkACQCAJQQRqKAIAIg5BAUcNAEEALQDg9p0BGkHAABCEASIN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CwJAAkACQAJAAkAgASgCBCIBKAIADgcIAAECAwgECAsgAUEMaigCACIDRQ0HIAFBCGooAgAhASADQShsIQMDQAJAIAEoAgBBB0YNACABIAAQqgMLIAFBKGohASADQVhqIgMNAAwICwsgASgCBCAAEKoDDAYLIAFBDGooAgAiA0UNBSABQQhqKAIAIQEgA0E4bCEDA0AgACABEJUEIAFBOGohASADQUhqIgMNAAwGCwsgASgCBCAAEKoDIAEoAggiASgCAEEaRw0CIAJBwABqIAAoAgAgACgCBCABQQhqIgAQgg0gAigCQEEyRg0EIAEQ0QEgAUE4aiACQcAAakE4aikDADcDACABQTBqIAJBwABqQTBqKQMANwMAIAFBKGogAkHAAGpBKGopAwA3AwAgAUEgaiACQcAAakEgaikDADcDACABQRhqIAJBwABqQRhqKQMANwMAIAFBEGogAkHAAGpBEGopAwA3AwAgACACQcAAakEIaikDADcDACABIAIpA0A3AwAMBAsgASgCBCIBKAIAQRpHDQIgAiAAKAIAIAAoAgQgAUEIaiIAEIINIAIoAgBBMkYNAyABENEBIAFBOGogAkE4aikDADcDACABQTBqIAJBMGopAwA3AwAgAUEoaiACQShqKQMANwMAIAFBIGogAkEgaikDADcDACABQRhqIAJBGGopAwA3AwAgAUEQaiACQRBqKQMANwMAIAAgAkEIaikDADcDACABIAIpAwA3AwAMAwsgASAAEEYMAgsgASAAEEYMAQsgASAAEEYLIAJBwAFqJAAL/wYBBn8jAEHwAGsiASQAAkACQAJAAkAgACgCACICRQ0AQQAhAwJAIAAoAggiBCAAKAIEIgVPDQAgAiAEai0AAEHVAEcNAEEBIQMgACAEQQFqIgQ2AggLAkACQAJAAkAgBCAFTw0AIAIgBGotAABBywBGDQELIANFDQNBACEEDAELIAAgBEEBaiIGNgIIAkACQCAGIAVPDQAgAiAGai0AAEHDAEcNACAAIARBAmo2AghBASECQayvlwEhBAwBCyABQcgAaiAAEM4EAkAgASgCSCIEDQAgAS0ATCECAkAgACgCECIFRQ0AQQEhBCAFQeS0lwFB1LSXASACQQFxIgMbQRlBECADGxCcBg0ICyAAIAI6AARBACEEIABBADYCAAwHCwJAIAEoAkwiAkUN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aiACQYABakEgaikDADcDACAEQRhqIAJBgAFqQRhqKQMANwMAIARBEGogAkGAAWpBEGopAwA3AwAgBSACQYABakEIaikDADcDACAEIAIpA4ABNwMADAILIABBBGogARDcBQwBCyAEIAEQRgsgAEE4aiEAIANBSGoiAw0ADAMLCwJAIAAoAgQiACgCAEEaRw0AIAIgASgCACABKAIEIABBCGoiARCCDSACKAIAQTJGDQIgABDRASAAQThqIAJBOGopAwA3AwAgAEEwaiACQTBqKQMANwMAIABBKGogAkEoaikDADcDACAAQSBqIAJBIGopAwA3AwAgAEEYaiACQRhqKQMANwMAIABBEGogAkEQaikDADcDACABIAJBCGopAwA3AwAgACACKQMANwMADAILIAAgARBGDAELIAAoAgQgARCqAwJAIAAoAggiACgCAEEaRw0AIAJBwABqIAEoAgAgASgCBCAAQQhqIgEQgg0gAigCQEEyRg0BIAAQ0QEgAEE4aiACQcAAakE4aikDADcDACAAQTBqIAJBwABqQTBqKQMANwMAIABBKGogAkHAAGpBKGopAwA3AwAgAEEgaiACQcAAakEgaikDADcDACAAQRhqIAJBwABqQRhqKQMANwMAIABBEGogAkHAAGpBEGopAwA3AwAgASACQcAAakEIaikDADcDACAAIAIpA0A3AwAMAQsgACABEEYLIAJBwAFqJAAL3QYBCH8jAEEQayICJAACQAJAAkACQCAAKAIADgQDAAECAwsgACgCBEEBRw0CIAEgACgCCBDFAQwCCwJAIAAoAgQiAy0AbEECRw0AIANBwABqIQADQCAAKAIYIgAtACxBAkYNAAsLAkAgA0GEAWooAgAiBEUNACADQYABaigCACEAIARB2ABsIQQDQAJAAkACQCAAKAIAQXxqDgICAAELIAEgAEEEaigCABDFAQwBCyAAIAEQnAQLIABB2ABqIQAgBEGof2oiBA0ACwsCQCADQZgBaigCACIARQ0AIANBlAFqKAIAIgUgAEEobGohBgNAAkACQAJAAkACQCAFKAIADgUEAAECAwQLIAUoAgRBAUcNAyABIAUoAggQxQEMAwsgASAFKAIEEMUBDAILAkAgBSgCBCIHLQBsQQJHDQAgB0HAAGohAANAIAAoAhgiAC0ALEECRg0ACwsCQCAHQYQBaigC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KAIIIANBuAJqIANB1AJqEKENIANB8AFqEOUWIANBgAFqEJQaIAQgBCgCEEEBajYCECACEJQaDAQLAkBBwABFDQAgACADQRhqQcAA/AoAAAsgBCAEKAIQQQFqNgIQDAMLIANBHGohBQJAQcgARQ0AIANB8AFqIAJBJGpByAD8CgAACyADQcgCaiACQeQAaikCADcDACADQcACaiACQdwAaikCADcDACADIAIpAlQ3A7gCIANBFTYC1AIgACABKAIEIAEoAgggA0G4AmogA0HUAmoQoQ0gA0HwAWoQ5RYgBRDDAyAEIAQoAhBBAWo2AhAgA0GAAWoQlBoMAgtBkqmbAUEoQYiChQEQjBoAC0HogYUBEPcWAAsgA0HwAmokAAvGBgEDfyMAQcABayICJAACQCAAKAIAQQNHDQACQCAAKAIEIgMoAgBBGkcNACACQYABaiABKAIAIAEoAgQgA0EIaiIEEIINIAIoAoABQTJGDQEgAxDRASADQThqIAJBgAFqQThqKQMANwMAIANBMGogAkGAAWpBMGopAwA3AwAgA0EoaiACQYABakEoaikDADcDACADQSBqIAJBgAFqQSBqKQMANwMAIANBGGogAkGAAWpBGGopAwA3AwAgA0EQaiACQYABakEQaikDADcDACAEIAJBgAFqQQhqKQMANwMAIAMgAikDgAE3AwAMAQsgAyABEEYLAkACQAJAAkACQAJAAkACQCAAKAIgIgAoAgAOBwcAAQIDBwQHCyAAQQxqKAIAIgNFDQYgAEEIaigCACEAIANBKGwhAwNAAkAgACgCAEEHRg0AIAAgARCqAwsgAEEoaiEAIANBWGoiAw0ADAcLCyAAKAIEIAEQqgMMBQsgAEEMaigCACIDRQ0EIABBCGooAgAhACADQThsIQMDQCABIAAQlQQgAEE4aiEAIANBSGoiAw0ADAULCyAAKAIEIAEQqgMgACgCCCIAKAIAQRpHDQEgAkHAAGogASgCACABKAIEIABBCGoiARCCDSACKAJAQTJGDQMgABDRASAAQThqIAJBwABqQThqKQMANwMAIABBMGogAkHAAGpBMGopAwA3AwAgAEEoaiACQcAAakEoaikDADcDACAAQSBqIAJBwABqQSBqKQMANwMAIABBGGogAkHAAGpBGGopAwA3AwAgAEEQaiACQcAAakEQaikDADcDACAB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NgIcIAYgCTYCGCAGIAo2AhQgBiALNgIQIAYgDTYCDCAGIA82AgggBiAONgIEIAYgDDYCACAAIAM6AAwgACAENgIIIAAgBTYCBCAAIAY2AgAgAkHAAGokAA8LIA4gAigCCEGIpJoBENggAAsAC84GAgZ/AX4jAEEgayICJABBAC0A4PadARoCQEHAABCEASIDRQ0AIANBADYCCCADQgw3AwACQAJAAkACQAJAAkACQAJAIAAoAgAOBQACAwEEAAsgACkDECEIIAAoAgwhBCAAKAIIIQVBACEGDAYLIAAoAgwhBCAAKAIIIQUgACgCBCEHQQIhBgwECyACQQRqQRRqIABBGGopAgA3AgAgAkEQaiAAQRBqKQIANwIAQQAhBEEALQDg9p0BGiACIAApAgg3AghBwAAQhAEiB0UNBSAHQQA2AgggB0EbNgIAIAcgAikCBDcCDCAHQRRqIAJBDGopAgA3AgAgB0EcaiACQQRqQRBqKQIANwIAIAdBJGogAkEEakEYaigCADYCAAwCCyACQQRqQRRqIABBGGopAgA3AgAgAkEQaiAAQRBqKQIANwIAQQAhBEEALQDg9p0BGiACIAApAgg3AghBwAAQhAEiB0UNBCAHQQM2AgggB0EbNgIAIAcgAikCBDcCDCAHQRRqIAJBDGopAgA3AgAgB0EcaiACQQRqQRBqKQIANwIAIAdBJGogAkEEakEYaigCADYCAAwBCyACQQRqQRRqIABBGGopAgA3AgAgAkEQaiAAQRBqKQIANwIAQQAhBEEALQDg9p0BGiACIAApAgg3AghBwAAQhAEiB0UNAyAHQQQ2AgggB0EbNgIAIAcgAikCBDcCDCAHQRRqIAJBDGopAgA3AgAgB0EcaiACQQRqQRBqKQIANwIAIAdBJGogAkEEakEYaigCADYCAAtBAiEGQQAhBQsLQQAtAOD2nQEaQcAAEIQBIgBFDQAgACABKQMANwMAIABBOGogAUE4aikDADcDACAAQTBqIAFBMGopAwA3AwAgAEEoaiABQShqKQMANwMAIABBIGogAUEgaikDADcDACAAQRhqIAFBGGopAwA3AwAgAEEQaiABQRBqKQMANwMAIABBCGogAUEIaikDADcDAEEALQDg9p0BGkHAABCEASIBRQ0AIAFBADoAPCABIAA2AjggAUIANwMwIAEgAzYCKCABQgA3AyAgASAINwIYIAEgBDYCFCABIAU2AhAgASAHNgIMIAEgBjYCCCABQQE2AgAgAkEgaiQAIAEPCwAL3QYCDn8DfiMAQfAAayICJAAgASgCwAEhAyABEL8BIAJB0ABqIAEQ1AoCQAJAAkACQAJAAkACQCACLQBkQQJHDQAgAigCUCEBDAELIAIpA1ghECACKQNQIREgAS0AyAFBCUcNAiABEOMOIAEQvwEgAkHQAGogARDUCiACLQBkQQJHDQEgAigCUCEBIBEQ8x8LIABBBjoALCAAIAE2AgAMBAsgAikDUCESIBFQRQ0BIBAhESASIRALQQAhBCACQQA6ABQgAkEANgIQIAIgED4CCCACIBBCIIg+AgxBAyEFDAELIAIoAlghBSACIAIoAlwiBjYCJCACIAM2AiAgAiAGNgIcIAIgBTYCGCACIBA3AwggAiASNwMQIBJCIIinIQRBBSEFCyACIAU6ACwgAiARNwMAIAJBLWohByACQRxqIQggAkEVaiEJIAJBBHIhCgNAAkACQCABLQDIAUEIRw0AIAEQ4w4gARC/ASACQdAAaiABENQKIAItAGRBAkcNASACKAJQIQEgAEEGOgAsIAAgATYCACACEIEaDAMLQTBFDQIgACACQTD8CgAADAILIAIoAlwhCyACKAJYIQwgAikDUCEQIAEoArwBIQYCQAJAAkACQCAFQX1qIgVBASAFQf8BcSINQQNJG0H/AXEOAwECAAELIAJBATYCVCACQbi5mwE2AlAgAkIANwJcIAIgAkHsAGo2AlggAkHQAGpBwLmbARCoHQALIBGnIQ4gAkHQAGpBCGogCkEIaikCADcDACACQcwAakECaiAJQQJqLQAAOgAAIAIgCikCADcDUCACIAkvAAA7AUwgBCEFDAELAkBBCEEwEJkiIg5FDQACQEEwRQ0AIA4gAkEw/AoAAAtBAiEFDAELAAsgAkE4akEIaiIEIAJB0ABqQQhqKQMANwMAIAJBNGpBAmoiDyACQcwAakECai0AADoAACACIAIpA1A3AzggAiACLwFMOwE0AkAgDUECRw0AIAIQgRoLIAggAikDODcCACAHIAIvATQ7AAAgCEEIaiAEKQMANwIAIAdBAmogDy0AADoAACACIA42AhggAiAGNgIUIAIgAzYCECACIAs2AgwgAiAMNgIIIAIgEDcDACACIAU6ACwg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gQE2AiwgAiAIKQIANwIcIAIgCCkCCDcCMCACIAJBHGo2AiggAkEUaiACQShqEPoeDQQgAkEcakHomZgBQQIQ0QUNBAwDCyACQQA2AjggAkEBNgIsIAJByJCBATYCKCACQgQ3AjAgAkEoakHwkIEBEKgdAAtBASEEIAgoAgBB046YAUECIAgoAgQoAgwRDAANBAtBASEEIAJBFGogCBD6Hg0DQQEhBCAIKAIAQeiZmAFBAiAIKAIEKAIMEQwADQMLIAJBADoAECACQQE6ABICQCACKAIMIggtAApBgAFxDQBBASEEIAJBGGogCBCYHA0DDAILIAIgBjYCJCACQeCPgQE2AiwgAiAIKQIANwIcIAIgCCkCCDcCMCACIAJBHGo2AiggAkEYaiACQShqEJgcDQAgAigCKEH7j4EBQQIgAigCLCgCDBEMAEUNAQtBASEEDAELQQAhBCACQQA6ABILIAlCf3wgCYMhCSACQQE6ABEgAiAEOgAQIAVBf2oiBQ0AC0EBIQAgBA0CIAIoAgwhAQwBCyAEDQELIAItABINASABKAIAQcjLmwFBASABKAIEKAIMEQwAIQALIAJBwABqJAAgAA8LIAJBADYCOCACQQE2AiwgAkGwkYEBNgIoIAJCBDcCMCACQShqQbiRgQEQqB0AC7EGAQR/QQQhAgJAAkACQAJAAkAgASgCAA4FBAABAgMECyABKAIERQ0DQQghAgsgASACaigCACAAEG4PCwJAIAEoAgQiAy0AbEECRw0AIANBwABqIQEDQCABKAIYIgEtACxBAkYNAAsLAkAgA0GEAWooAgAiAkUNACADQYABaigCACEBIAJB2ABsIQIDQAJAAkACQCABKAIAQXxqDgICAAELIAFBBGooAgAgABBuDAELIAEgABDdBwsgAUHYAGohASACQah/aiICDQALCwJAIAMoAngiAUUNACABQQhqKAIAIgJFDQAgAUEEaigCACEBIAJBAnQhAgNAIAEoAgAgABCnASABQQRqIQEgAkF8aiICDQALCwJAIANBmAFqKAIAIgJFDQAgA0GUAWooAgAhASACQShsIQIDQCABIAAQqAYgAUEoaiEBIAJBWGoiAg0ACwsgAy0APCIBQQZGDQEgAUECRw0BIANBEGohAQNAIAEoAhgiAS0ALEECRg0ADAILCyABKAIMIgJFDQAgASgCCCID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gSBBgICAgHghCQwBCyADQRBqQQhqIgYgA0HEAGpBCGooAgA2AgAgAyADKQJENwMQIAMoAiAhBSADKAIcIglBgICAgHhGDQAgACADKQMQNwIMIABBFGogBigCADYCACAAIAQ2AhggACAHNgIIIAAgASgCvAE2AhwLIAAgCTYCACAAIAU2AgQgA0GQAWokAA8LAAvoBgIGfwV+IwBBoAFrIgMkACABvSEJAkACQCABmUQAAAAAAADwf2INAEEDIQQMAQsCQCAJQoCAgICAgID4/wCDIgpCgICAgICAgPj/AFINAEECIQQMAQsgCUL/////////B4MiC0KAgICAgICACIQgCUIBhkL+////////D4MgCUI0iKdB/w9xIgUbIgxCAYMhDQJAIApCAFINAAJAIAtQRQ0AQQQhBAwCCyAFQc13aiEFIA2nQQFzIQRCASEKDAELQoCAgICAgIAgIAxCAYYgDEKAgICAgICACFEiBhshDEICQgEgBhshCiANp0EBcyEEQct3Qcx3IAYbIAVqIQULIAMgBTsBiAEgAyAKNwOAASADQgE3A3ggAyAMNwNwIAMgBDoAigECQAJAAkACQAJAAkACQCAEQX5qIgRFDQBBASEFQbibmwFBuZubASAJQgBTIgYbQbibmwFBASAGGyACGyEGQQEgCUI/iKcgAhshAiAEQQMgBEEDSRtBf2oOAwECAwELIANBAzYCICADQfj0mgE2AhwgA0ECOwEYQQEhBkEAIQJBASEFDAMLIANBAzYCICADQaGMgQE2AhwgA0ECOwEYDAILIANBAzYCICADQaSMgQE2AhwgA0ECOwEYDAELIANB4ABqIANB8ABqIANBB2oQmgICQAJAIAMoAmBFDQAgA0GQAWpBCGogA0HgAGpBCGooAgA2AgAgAyADKQJgNwOQAQwBCyADQZABaiADQfAAaiADQQdqEIEBCyADKAKUASIFRQ0BIAMoApABIgctAABBME0NAiADLgGYASEIIAMgBzYCHCADQQI7ARggA0EBNgIgAkACQCAFQQFHDQAgA0EkaiEEQQMhBQwBCyADQTxqIQQgA0ECOwEwIANB38ubATYCKCADQQI7ASQgAyAFQX9qNgI4IANBATYCLCADIAdBAWo2AjRBBSEFCyAEQQE7AQwgBEECOwEAIARBASAIayAIQX9qIAhBAUgiCBs7AQ4g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qIUBEIwaAAsgBUEMahDoCgsgACADKQIANwIAIABBCGogA0EIaigCADYCACAFQSBqJAALpgYBB39BBCECAkACQAJAAkACQCAAKAIADgUEAAECAwQLIAAoAgRFDQNBCCECCyABIAAgAmooAgAQqwEPCwJAIAAoAgQiAy0AbEECRw0AIANBwABqIQADQCAAKAIYIgAtACxBAkYNAAsLAkAgA0GEAWooAgAiAEUNACADQYABaigCACIEIABB2ABsaiEFA0BBBCECAkACQCAEKAIAIgBBBUYNACAAQQRGDQECQAJAAkAgAA4EBAIAAQQLAkAgBCgCBCIGLQBsQQJHDQAgBkHAAGohAANAIAAoAhgiAC0ALEECRg0ACwsCQCAGQYQBaigCACICRQ0AIAZBgAFqKAIAIQAgAkHYAGwhAgNAAkACQCAAKAIAQQVHDQAgASAAQQRqKAIAEKsBDAELIAAgARCPBgsgAEHYAGohACACQah/aiICDQALCwJAIAYoApgBIgBFDQAgBigClAEiByAAQShsaiEIA0ACQAJAAkACQAJAIAcoAgAOBQQAAQIDBAsgBygCBEEBRw0DIAEgBygCCBCrAQwDCyABIAcoAgQQqwEMAgsgB0EEaiABELUIDAELIAdBDGooAgAiAkUNACAHQQhqKAIAIQAgAkEobCECA0AgACABELoEIABBKGohACACQVhqIgINAAsLIAdBKGoiByAIRw0ACwsgBi0APCIAQQZGDQMgAEECRw0DIAZBEGohAANAIAAoAhgiAC0ALEECRg0ADAQLCyAEQQxqKAIAIgJFDQIgBEEIaigCACEAIAJBKGwhAgNAIAAgARCEBCAAQShqIQAgAkFYaiICDQAMAwsLQQghAiAEKAIERQ0BCyABIAQgAmooAgAQqwELIARB2ABqIgQgBUcNAAsLAkAgA0GYAWooAgAiAkUNACADQZQBaigCACEAIAJBKGwhAgNAIAEgABCDBiAAQShqIQAgAkFYaiICDQALCyADLQA8IgBBBkYNASAAQQJHDQEgA0EQaiEAA0AgACgCGCIALQAsQQJGDQAMAgsLIAAoAgwiAkUNACAAKAIIIQAgAkEobCECA0AgACABEIQEIABBKGohACACQVhqIgINAAsLC8AGAgl/An4jAEHgAGsiAiQAIAJBADYCGCACQoCAgIDAADcCEEH3Bq1C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IAEgAEEIahC8GyABIABBIGoQghogAEEUaiABEJgkDwsgAEEQaiABKAIUEN0dIAEgAEEoahC7IA8LIABB2ABqIQIgAEEQaiEDAkACQCAALQBEQQRGDQAgAyABEMIKDAELIAMgASgCFBDdHQsgASACELsgDwsgACgCDEE4bCEEIAAoAgghBUEAIQADQCAEIABGDQwCQAJAAkACQAJAAkACQAJAIAUgAGoiAigCAEF8aiIDQQQgA0EHSRsOBwABAgMEBQYACyABIAJBBGoQvBsgAkEYaiABEKQhIAEgAkEcahCCGgwGCyABIAJBBGoQvBsgAkEYaiABEKQhIAEgAkEcahCCGgwFCyACQRBqKAIAIAEQ8gMgAkEMaiABEKQhDAQLIAJBBGooAgAgARDyAyACQRBqIAEQpCEMAwsgAkEwaigCACABEPIDIAIgARD5CgwCCyACQRBqKAIAIAEQ8gMgASACQQRqELwbIAJBHGogARCkISABIAJBIGoQghoMAQsgAkEEaiABEKchCyAAQThqIQAMAAsLIAAoAgxBOGwhAiAAKAIIIQADQCACRQ0LIAAgARC+ICAAQTBqIAEQxgQgAkFIaiECIABBOGohAAwACwsgASAAQQhqEL0bDwsgAEEEaiABEMYEIABBCGogARDGBCAAQQxqIAEQxgQgAEEQaiEADAMLIABBEGogARCDHg8LIABBBGohAAwBCyAAQQRqIAEQxgQgAEEIaiEADAALCyAAQRBqIAEQgx4gASAAQcAAahCoISABIABBxABqEKghDwsgACgCCEGEgICAeEgNAiABIABBCGoQvRsPCyAAQShqIQICQCAALQAcQQJGDQAgASgCFCAAQQhqENgOGgsgAiABEKQhDwsgAEEIaiABEMIKCwukBgECfwJAA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCACICKAIAIgNBdGoiAEEHIABBJkkbDiYOAAECAwQFBgcICQoLDA4ODQ8QERIOExQVDg4WFxgZGhscHQ4fDg4LIAIoAgxBBHQhACACKAIIIQIDQCAARQ0OAkAgAigCAEECRg0AIAJBDGogARDHBAsgAkEQaiECIABBcGohAAwACwsgAkEEaiABEGgPCyABIAJBCGoQjQIPCyAC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NgIAIANBGGpCADcDACADQSBqQgA3AwBBAC0A4PadARpBwAAQhAEiAUUNASABIAM2AgQgAUEQNgIAIAFBEGoiA0EFOgAAIAFBCGpCADcDACAAQQhqQgA3AwAgACABKQMANwMAIABBGGogAUEYaikDADcDACAAQSBqIAFBIGopAwA3AwAgAEEoaiABQShqKQMANwMAIABBMGogAUEwaikDADcDACAAQThqIAFBOGopAwA3AwAgAEEQaiADKQMANwMAIAFBwABBCBC9EwwDCyABKwMIIgYgBmINAQJAIAaZRAAAAAAAAPB/YQ0AIABCADcDICAAIAY5AxggAEIANwMQIABBAzYCCCAAQRs2AgAMAwsQzxohBAJAIAa9QgBTDQAgAEIANwMQIAAgBDcDCCAAQRo2AgAgAEEVakIANwAADAMLQQAtAOD2nQEaQcAAEIQBIgFFDQAgAUIANwMQIAEgBDcCCCABQRo2AgAgAEIANwMIIAAgATYCBCAAQRA2AgAgAUEVakIANwAAIABBEGpBADoAAAwCCwALIABCADcDECAAQrGchfMENwMIIABBGjYCACAAQRVqQgA3AAALIAJBEGokAAvBBgEEfwJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCAA4LAAECAwQFBgcICQoACyAAQQhqIQIgAS0AOiEDIAEtADkhBAJAIAAoAiAiAEUNACABLQA0QQFHDQAgAUGBAjsAOSAAKAIAIAEQgAIgASADOgA6CyABIAQ6ADkgASACEJsRIAEgBDoAOSABIAM6ADoPCyABLQA5IQQgAUEBOgA5IAAoAiggARBtIAEgBDoAOSAAKAIIQQJHDQggAUEBOgA5IAAoAgwgARBtIAEgBDoAOQ8LIAAoAghBAUcNByABLQA5IQQgAUEBOgA5IAAoAgwgARBtIAEgBDoAOQ8LIAEtADkhBCABQQE6ADkgACgCBCABEG0gASAEOgA5DwsCQCAAKAIEIgAoAgAiBEEDRw0AIABBBGogARDSCA8LIAEtADkhAyABQQE6ADkgACgCICABEG0gASADOgA5IARBAkcNBSABQQE6ADkgACgCBCABEG0gASADOgA5DwsCQAJAIAEtADQNACABLQA5IQQMAQsgAS0AOSEEIAEtADohAyABQYECOwA5IAAoAgggARCAAiABIAM6ADoLIAFBAToAOSAA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AC0AMCADLQAwRw0AIAAoAiwgAygCLEcNACADKAIQIQECQAJAIAAoAhBBAUcNACABRQ0CIAAoAhQgAygCFEYNAQwCCyABDQELIAAtADEgAy0AMUcNACAALQAyIAMtADJGIQILIAIL1gYCA38CfiMAQaACayICJAACQAJAQQAtAJD2nQFFDQBBACkDoPadASEFQQApA5j2nQEhBgwBCyACQQhqEJcXQQBBAToAkPadAUEAIAIpAxAiBTcDoPadASACKQMIIQYLQQAgBkIBfDcDmPadASABKAKABSgC0AIhAyACQgQ3AhggAkIANwIQIAJCgICAgMAANwIIAkAgA0F/TA0AIAJBADYCIAJAAkACQCADRQ0AIAJBCGogAxCbDyADIAIoAhwiBEsNAQsgAiADNgIcDAELIAJBFGogAyAEaxCbDwsgAkGAAmpBGGogAkEIakEYaigCADYCACACQYACakEQaiACQQhqQRBqKQIANwMAIAJBgAJqQQhqIAJBCGpBCGopAgA3AwAgAiACKQIINwOAAiACQQA2AiAgAkIENwIYIAJCADcCECACQoCAgIDAADcCCAJAAkACQCADRQ0AIAJBCGogAxCbDyADIAIoAhwiBEsNAQsgAiADNgIcDAELIAJBFGogAyAEaxCbDwsgAkH8AWogAkEIakEYaigCADYCACACQfQBaiACQQhqQRBqKQIANwIAIAJB7AFqIAJBCGpBCGoiAykCADcCACACQcgBakEIaiACQYACakEIaikDADcDACACQcgBakEQaiACQYACakEQaikDADcDACACQcgBakEYaiACQYACakEYaigCADYCACACIAIpAgg3AuQBIAIgAikDgAI3A8gBIAJBADYCnAEgAkKAgICAwAA3ApQBIAJCBDcCjAEgAkIANwKEASACQoCAgIDAADcCfCADQQApA5j/nAE3AwAgAkEAKQOQ/5wBNwMIIAIgBTcDICACIAY3AxgCQEE4RQ0AIAJBOGogAkHIAWpBOPwKAAALIAJCATcDsAEgAkIANwOoASACQoCAgIDAADcDoAEgAkEANgK4ASACQQA2AnggAkIANwNwIAJBADYCKCACIAE2AsgBIAIgAkEIajYCzAEgAkHIAWoQiwICQEHAAUUNACAAIAJBCGpBwAH8CgAACyACQaACaiQADwsgAkEBNgLMASACQbzlhAE2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aiIHRQ0AIAcoAgBBgICAgHhGDQELIANB6ABqQQhqIgcgAkEUaigCADYCACADQegAakEUaiAFQQhqKAIANgIAQQAtAOD2nQEaIAMgAikCDDcDaCADIAUpAgA3AnRBCBCEASIGRQ0EIAMgA0EUahD2DiAGIAMpAwA3AgAgA0HQAGpBCGogBykDADcDACADQdAAakEQaiIHIANB6ABqQRBqKQMANwMAIAMgAykDaDcDUAJAIAQoAhwiAiAEKAIURw0AIARBFGpB0ICFARCiGAsgBCACQQFqNgIcIAQoAhggAkHwAGxqIgJBATYCDCACIAY2AgggAkKAgICAGDcCACACIAMpA1A3AhAgAkEYaiADQdgAaikDADcCACACQSBqIAcpAwA3AgAMAQsgA0EIaiADQRRqEPYOIAMoAgwhByADKAIIIQgCQCAGQZx/aiIJKAIAIgIgBkGUf2oiCigCAEcNACAKQcCAhQEQ/RcLIAkgAkEBajYCACAGQZh/aigCACACQQN0aiICIAc2AgQgAiAINgIACyAEIAQoAhBBAWo2AhAgARDbCBogA0E4akEIaiIEIAVBCGooAgAiAjYCACADQcwAaiACNgIAIABBADYCDCAAQoCAgIDAADcCBCAAQSI2AgAgACAFKQIAIgs3AhAgAyALNwJEIABBGGogBCkDADcCACAAQSBqIANByABqKQMANwIAIAMgCzcDOCADQYABaiQADwsgA0EANgIUIANBEGpBnICFASADQRRqQaCAhQEQ4hsAC0GwgIUBEPcWCwAL4AUBCH8jAEEQayICJAACQAJAAkACQANAAkAgACgCACIDQQJGDQACQAJAAkAgAw4HAQIABQYIBwELAAsgASAAQQhqELELDAYLIAAoAgwiA0UNBSAAKAIIIQAgA0EobCEDA0ACQCAAKAIAQQdGDQAgACABEIUFCyAAQShqIQAgA0FYaiIDDQAMBgsLIAAoAgQhAAwACwsgACgCDCIDRQ0CIAAoAgghBCADQThsIQUgAUEsaiEGQQAhAwNAAkACQAJAAkAgBCADaiIAKAIADgMAAQIACwJAIABBCGooAgBBA0cNACABLQAoIQcgAUEAOgAoIAEtAHkhCCABQQA6AHkCQCAAQQxqKAIAIgkoAgBBGkcNACACIAkpAwggCUEYaigCABDnGiAGIAIpAwAgAigCCBCQCwsgCSABEHggASAHOgAoIAEgCDoAeQsgAEEoaigCACABEIUFDAILIAEgAEEQahCxCyAAQQhqIQkCQCAAQTBqKAIAIgBFDQAgAS0AKCEHIAFBADoAKCABLQB5IQggAUEAOgB5AkAgACgCAEEaRw0AIAIgACkDCCAAQRhqKAIAEOcaIAYgAikDACACKAIIEJALCyAAIAEQeCABIAc6ACggASAIOgB5CyABIAkQgBIMAQsgAEEEaigCACABEIUFCyAFIANBOGoiA0cNAAwDCwsgACgCBCABEIUFIAEtACghAyABQQA6ACggAS0AeSEEIAFBADoAeQJAIAAoAggiACgCAEEaRw0AIAIgACkDCCAAQRhqKAIAEOcaIAFBLGogAikDACACKAIIEJALCyAAIAEQeCABIAM6ACggASAEOgB5DAELIAEtACghAyABQQA6ACggAS0AeSEEIAFBADoAeQJAIAAoAgQiACgCAEEaRw0AIAIgACkDCCAAQRhqKAIAEOcaIAFBLGogAikDACACKAIIEJALCyAAIAEQeCABIAM6ACggASAEOgB5CyACQRBqJAAL1wUBBH8CQAJAAkACQAJAAkAgASgCAA4FBQABAwQFCyABKAIEQQFHDQQgAC0AAA0EQQghAgwBCyAALQAADQNBBCECCyABIAJqKAIAIAAQmAEPCwJAIAEoAgQiAy0AbEECRw0AIANBwABqIQEDQCABKAIYIgEtACxBAkYNAAsLAkAgA0GEAWooAgAiAkUNACADQYABaigCACEBIAJB2ABsIQIDQAJAAkACQCABKAIAQXxqDgICAAELIAAtAAANASABQQRqKAIAIAAQmAEMAQsgASAAEOwICyABQdgAaiEBIAJBqH9qIgINAAsLAkAgA0GYAWooAgAiAkUNACADQZQBaigCACEBIAJBKGwhAgNAIAEgABDUBiABQShqIQEgAkFYaiICDQALCyADLQA8IgFBBkYNASABQQJHDQEgA0EQaiEBA0AgASgCGCIBLQAsQQJGDQAMAgsLIAEoAgwiAkUNACABKAIIIgMgAkEobGohBANAAkACQAJAAkACQCADKAIADgUEAAECAwQLIAMoAgRBAUcNAyAALQAADQMgAygCCCAAEJgBDAMLIAAtAAANAiADKAIEIAAQmAEMAgsCQCADKAIEIgUtAGxBAkcNACAFQcAAaiEBA0Ag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GzYCAAwBCyAGIAVPDQMgBCAIaiIJKAIAIQogCUF8aigCACEJAkAgBSAAKAIARw0AIABBsKWFARD9FyAAKAIEIQQLIAAgBUEBaiIDNgIIIAQgBUEDdGoiBSAKNgIEIAUgCTYCACADIQULIAhBCGohCCACIAZBAWoiBkYNAwwACwsgBiAKQZClhQEQwxIACyAGIAVBoKWFARDDEgALIAUgAkkNASAAQQA2AgggASAANgIUIAEgACgCBCIGNgIMIAEgAjYCGCABIAUgAms2AhwgASAGIAJBA3RqNgIQIAFBDGoQpwwLIAFBIGokAA8LIAIgBUGk95oBELwiAAucBQIQfwV+IwBB8ABrIgIkACAAKAIEIQMgAC0AGCEEIAAtABkhBSAAKAIUIQYgACgCECEHIAAoAgwhCCACQTBqIAAoAggiCUEIQTgQow4gAigCNCEKAkACQCACKAIwQQFGDQAgAigCOCELAkAgCkUNACAJQThsIQwgCyEAIAohDQNAIAxFDQEgAygCLCEOIAMoAighDyACQQhqIAMQtQICQAJAIAMoAjAiEA0AQQAhEQwBC0EALQDg9p0BGkHAABCEASIRRQ0EIAJBMGogEBBFIBFBOGogAkEwakE4aikDADcDACARQTBqIAJBMGpBMGopAwA3AwAgEUEoaiACQTBqQShqKQMANwMAIBFBIGogAkEwakEgaikDADcDACARQRhqIAJBMGpBGGopAwA3AwAgEUEQaiACQTBqQRBqKQMANwMAIBFBCGogAkEwakEIaikDADcDACARIAIpAzA3AwALIAMtADQhECACQTBqQSBqIAJBCGpBIGopAwAiEjcDACACQTBqQRhqIAJBCGpBGGopAwAiEzcDACACQTBqQRBqIAJBCGpBEGopAwAiFDcDACACQTBqQQhqIAJBCGpBCGopAwAiFTcDACACIAIpAwgiFjcDMCAAQSBqIBI3AwAgAEEYaiATNwMAIABBEGogFDcDACAAQQhqIBU3AwAgACAWNwMAIABBNGogEDoAACAAQTBqIBE2AgAgAEEsaiAONgIAIABBKGogDzYCACAMQUhqIQwgAEE4aiEAIANBOGohAyANQX9qIg0NAAsLIAEgBToAGSABIAQ6ABggASAGNgIUIAEgBzYCECABIAg2AgwgASAJNgIIIAEgCzYCBCABIAo2AgAgAkHwAGok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/OOCARC3HigCABDUCCAAQQhqIANBEGpBCGooAgA2AgAgACADKQIQNwIAIABBDGogAygCHBCCEwwICyABKAIEIgYgBSACKAIEIgcgBBCZG0H/AXEOAgIDAQsgACABKAIEIAUQlRQgAEEUakEAKAKElZsBNgIAIABBACkC/JSbATcCDAwGCyAAQQxqIAYgBRCVFCAAQQhqQQAoAoSVmwE2AgAgAEEAKQL8lJsBNwIADAULQQRBBBC4HyECIABBATYCCCAAIAI2AgQgAEEBNgIAIAJBATYCACAAQQApAvyUmwE3AgwgAEEUakEAKAKElZsBNgIADAQLIAcgBEECdGpBfGoiCEUNAgJAIAgoAgAiCWciCA0AIANBEGogBiAFEJUUIAAgA0EQaiAHIAQQxAQMBAsgA0EoaiABIAgQ4xUgA0E0aiACIAgQ4xUgA0EQaiADQShqIAMoAjgiAiADKAI8EMQEIABBCGogA0EQakEIaigCADYCACAAIAMpAhA3AgAgA0EIaiADQSRqKAIANgIAIAMgAykCHDcDACADKAI0IAIQ3yIgAEEMaiEAAkAgAygCBCADIAMoAgBBgICAgHhGGygCCEUNACAAIAMgCUUgCEEfcRDeCAwECyAAIAMQ0BkMAwsgA0EANgIgIANBATYCFCADQeTjggE2AhAgA0IENwIYIANBEGpBnOSCARCoHQALIABBCGpBACgChJWbASICNgIAIABBACkC/JSbASIKNwIAIAAgCjcCDCAAQRRqIAI2AgAMAQtBjOSCARDJIgALIANBwABqJAALpgUBBH9BBCECAkACQAJAAkACQCABKAIADgUEAAECAwQLIAEoAgRFDQNBCCECCyABIAJqKAIAIAAQqAEPCwJAIAEoAgQiAy0AbEECRw0AIANBwABqIQEDQCABKAIYIgEtACxBAkYNAAsLAkAgA0GEAWooAgAiAkUNACADQYABaigCACEBIAJB2ABsIQIDQAJAAkACQCABKAIAQXxqDgICAAELIAFBBGooAgAgABCoAQwBCyABIAAQkgkLIAFB2ABqIQEgAkGof2oiAg0ACwsCQCADQZgBaigCACICRQ0AIANBlAFqKAIAIQEgAkEobCECA0AgASAAEKEHIAFBKGohASACQVhqIgINAAsLIAMtADwiAUEGRg0BIAFBAkcNASADQRBqIQEDQCABKAIY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IAIQhx0LIAytQiCGIAathCALELIgDAELIAAgDDYCBCAAIAY2AgAgACAHKQMYNwMIIAAgCzoAFCAAIAcvARQ7ABUgACACNgIYIABBEGogB0EgaigCADYCACAAQRdqIAdBFmotAAA6AAALIAEgCjYCeAsgB0HAAGokAAu3BQIEfwF+IwBBIGsiAiQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAEoAgBBbGoOHQABCwsLCwwLCwsLCwsLCwILCwsLCwMLBAUGBwsICwsgAkEMaiABQRBqKQIANwIAIAJBFGogAUEYaikCADcCACACIAEpAgg3AgQgASkDKCEGIAEoAiQhAyABKAIgIQRBASEFDAkLIAJBDGogAUEQaikCADcCACACQRRqIAFBGGopAgA3AgAgAiABKQIINwIEIAEpAyghBiABKAIkIQMgASgCICEEQQIhBQwICyACQQhqIAFBDGooAgA2AgAgAiABKQIENwMAQQMhBQwGC0EIIQUgAkEIaiABQQxqKQIANwMAIAIgASkCBDcDAAwFCyACQQhqIAFBDGooAgA2AgAgAiABKQIENwMAQQchBQwECyACQQhqIAFBDGopAgA3AwAgAiABKQIENwMAQQUhBQwDCyACQQhqIAFBDGopAgA3AwAgAiABKQIENwMAQQkhBQwCCyACQQhqIAFBDGopAgA3AwAgAiABKQIENwMAQQYhBQwBCyACQQhqIAFBDGopAgA3AwAgAiABKQIENwMAQQQhBQsLIAAgBTYCACAAIAIpAwA3AgQgACAGNwMoIAAgAzYCJCAAIAQ2AiAgAEEMaiACQQhqKQMANwIAIABBFGogAkEQaikDADcCACAAQRxqIAJBGGooAgA2AgAMAgsgAEELNgIAIAAgATYCBAwCCyACQQxqIAFBEGopAgA3AgAgAkEUaiABQRhqKQIANwIAIABBADYCACAAQQA2AiAgAiABKQIINwIEIAAgAikDADcCBCAAQQxqIAJBCGopAwA3AgAgAEEUaiACQRBqKQMANwIAIABBHGogAkEYaigCADYCAAsgAUHAAEEIEL0TCyACQSBqJAALxgUCB38BfiMAQcAAayIDJAAgAS0AyAEhBAJAAkACQAJAIAINACAEQcsARw0BDAILIARBywBGDQEgBEHiAEcNACADQShqQQRyQeIAEIYeIANBMDYCPCADQfjFmwE2AjggA0GwgICAeDYCKCABKALAASABKALEASADQShqEIQXIQQCQCABLQDIAUGiAUcNACABENcSIQIgARDjDiABIAIQ+hILIABBAjoAFCAAIAQ2AgAMAgsgA0EoaiABQQFBARCyAyADKAIoIQQCQAJAAkACQCADLQA8IgJBAkYNACADQSRqQQJqIANBKGpBF2otAAAiBToAACADQQhqQRdqIAU6AAAgAyADLwA9IgY7ASQgAyACOgAcIAMgAygCOCIHNgIYIAMgAygCNCIFNgIUIAMgAygCMCIINgIQIAMgAygCLCIJNgIMIAMgBDYCCCADIAY7AB0gASgCeCIGQYAFcUUNASADQQhqQajGmwFBBRCkHEUNAQwCCyAAQQI6ABQgACAENgIADAQLIAZBgAJxRQ0BIANBCGpBrcabAUEFEKQcRQ0BCyADQcKAgIB4NgIoIAEgCCAFIANBKGoQ3hwLIAAgAjoAFCAAIAc2AhAgACAFNgIMIAAgCDYCCCAAIAk2AgQgACAENgIAIAAgAy8BJDsAFSAAQQA2AhggAEEXaiADQSZqLQAAOgAADAELIAEoAsQBIQQgASgCwAEhAiADQcsAIAEQyQs3AwAgARDjDiADELoaIgo3AyggA0EoaiADEPkLIQUgChDzHwJAAkAgBQ0AIANCwcrZi8YNNwMoIANBKGogAxD5CyEFQsHK2YvGDRDzHyAFRQ0BCyADQamAgIB4NgIoIAEgAiAEIANBKGoQ0w0LIABBADYCGCAAQQA6ABQgAEEANgIQIAAgBDYCDCAAIAI2AgggACADKQMANwMACyADQcAAaiQAC4MFAgZ/BH4jAEEQayICJAAgAiABKQMAIgggASgCEBDnGiACKQMAIQkCQAJAAkACQAJAIAAoAgxFDQAgCSACKAIIEJ0aIQkgACgCACIDQWBqIQQgCUIZiEKBgoSIkKDAgAF+IQogACgCBCIFIAmncSEAQQAhBgJAAkADQAJAIAMgAGopAAAiCyAKhSIJQn+FIAlC//379+/fv/9+fINCgIGChIiQoMCAf4MiCVANAANAIAIgBCAJeqdBA3YgAGogBXEiB0EFdGsQqSANAyAJQn98IAmDIglQRQ0ACwsgCyALQgGGg0KAgYKEiJCgwIB/g1BFDQIgACAGQQhqIgZqIAVxIQAMAAsLIANBACAHa0EFdGoiAEFwaikDACIJUEUNAkEAIQEMAwsgAikDACEJC0EAIQEgCUIDg0IAUg0DIAmnIgAgACgCACIDQX9qNgIAIANBAUcNAyAAIAAoAhAQ6R0MAwsCQCAJQgODQgBSDQAgCaciAyADKAIAIgNBAWo2AgAgA0F/TA0CCyABKAIMIQMgASgCCCEFIABBeGooAgAhAQJAIAhCA4NCAFINACAIpyIAIAAoAgAiAEEBajYCACAAQX9MDQILQQAtAOD2nQEaQcAAEIQBIgBFDQEgAEEAOgAcIAAgATYCGCAAQgA3AhAgACAJNwIIIABBGjYCAEEALQDg9p0BGkHAABCEASIBRQ0BIAEgADYCKCABQgA3AyAgASADNgIcIAEgBTYCGCABIAg3AxAgAUEANgIIIAFBFDYCAAsgAikDACIJQgODQgBSDQEgCaciACAAKAIAIgNBf2o2AgAgA0EBRw0BIAAgACgCEBDpHQwBCwALIAJBEGokACABC5EFAQZ/IwBBEGsiAiQAIAAoAgAhAAJAAkACQAJAAkACQAJAAkACQCABKAIADgUIAAECAwgLIAEoAgRBAUcNByAALQAlIQMgASgCCCEBIAAtACQiBA0GIAEoAgBBdGoiBUEHIAVBJkkbQXtqIgVBH0sNBUEBIAV0Qa6igIB4cQ0GIAUNBSABLQARDQUMBgsgAC0AJSEDIAEoAgQhASAALQAkIgQNAyABKAIAQXRqIgVBByAFQSZJG0F7aiIFQR9LDQJBASAFdEGuooCAeHENAyAFDQIgAS0AEQ0CDAMLAkAgASgCBCIGLQBsQQJHDQAgBkHAAGohAQNAIAEoAhgiAS0ALEECRg0ACwsCQCAGQYQBaigCACIDRQ0AIAZBgAFqKAIAIQEgA0HYAGwhAwNAAkACQAJAIAEoAgBBfGoOAgIAAQsgAC0AJCEHIABBAjoAJCAALQAlIQQgACABQQRqKAIAIgUQzgEgBSAAEFMgACAEOgAlIABBAjoAJCAAIAUQnQEgACAEOgAlIAAgBzoAJAwBCyABIAAQpgsLIAFB2ABqIQEgA0Gof2oiAw0ACwsgBkGYAWooAgAhAyAGQZQBaigCACEBIAIgADYCDAJAIANFDQAgA0EobCEAA0AgAkEMaiABEMQFIAFBKGohASAAQVhqIgANAAsLIAYtADwiAEEGRg0FIABBAkcNBSAGQRBqIQADQCAAKAIYIgAtACxBAkYNAAwGCwsgAUEEaiAAEN8DDAQLIABBAzoAJAsgACABEM4BIAEgABBTIAAgAzoAJSAAIAQ6ACQgACABEJ0BDAILIABBAzoAJAsgACABEM4BIAEgABBTIAAgAzoAJSAAIAQ6ACQgACABEJ0BCyACQRBqJAALnQUBBH8CQCAAKAIIIgJFDQAgACgCBCIDIAJBKGxqIQQDQAJAAkACQAJAAkACQAJAIAMoAgAOBQYAAQIDBgsgAygCBEEBRw0FIAEgAygCCBDdCAwFCyABIAMoAgQQ3QgMBAsCQAJAIAMoAgQiBS0AbCICQX1qIgBBASAAQf8BcUEDSRtB/wFxDgMAAQQACyAFQQA6AFQMAwsgAkH/AXFBAkcNASAFQcAAaiEAA0AgACgCGCIALQAsQQJGDQALIABBADoALAwCCyADQQxqKAIAIgJFDQIgA0EIaigCACEAIAJBKGwhAgNAIAEgABDzBSAAQShqIQAgAkFYaiICDQAMAwsLIAVBADoAbAsCQCAFKAKEASICRQ0AIAUoAoABIQAgAkHYAGwhAgNAAkACQAJAIAAoAgBBfGoOAgIAAQsgASAAQQRqKAIAEN0IDAELIAAgARC8BgsgAEHYAGohACACQah/aiICDQALCwJAIAUoAngiAEUNACAAEOUaIAAoAgAgAEEEaigCABDxIiAAQRRBBBC9EwsgBUEANgJ4AkAgBUGYAWooAgAiAEUNACAAQShsIQIgBUGUAWooAgBBBGohAANAAkACQAJAAkACQCAAQXxqKAIADgUEAAECAwQLIAAoAgBBAUcNAyABIABBBGooAgAQ3QgMAwsgASAAKAIAEN0IDAILIAAgARD1BgwBCyAAIAEQxQULIABBKGohACACQVhqIgINAAsLIAUtADwiAEEGRg0AAkACQCAAQX1qIgJBASACQQNJG0H/AXEOAwABAgALIAVBADoAJAwBCwJAIABBAkcNACAFQRBqIQADQCAAKAIYIgAtACxBAkYNAAsgAEEAOgAsDAELIAVBADoAPAsgA0EoaiIDIARHDQALCwv/BAIBfwF+IwBBIGsiCCQAAkACQAJAIARBAXFFDQACQCADQRxxQRxHDQAgBSACRg0AIAEoAkRFDQAgCEEQaiABIAVBARCiAiAILQAQQQRGDQAgCCkDECIJQv8Bg0IEUQ0AIAAgCTcCAAwDCwJAAkACQAJAAkACQCADQQJ2QQdxDgUFAgMAAQALQZKpmwFBKEGgz5sBEIwaAAsgCEEANgIQIAhBCGogASAIQRBqQd7LmwFBARCFDSAILQAIQQRGDQMgCCkDCCIJQv8Bg0IEUQ0DDAILAkAgAS0ATQ0AIAhBEGogARDdDyAILQAQQQRGDQAgCCkDECIJQv8Bg0IEUg0CCyAIQQA2AhAgCEEIaiABIAhBEGpBjZybAUEBEIUNIAgtAAhBBEYNAiAIKQMIIglC/wGDQgRSDQEMAgsCQCABLQBNDQAgCEEQaiABEN0PIAgtABBBBEYNACAIKQMQIglC/wGDQgRSDQELIAhBADYCECAIQQhqIAEgCEEQakGPnJsBQQEQhQ0gCC0ACEEERg0BIAgpAwgiCUL/AYNCBFENAQsgCUL/AYNCBFENACAAIAk3AgAMAwsCQCADQQNxDQAgA0GAAnFFDQEgAS0ATQ0BIAhBEGogARDdDyAILQAQQQRGDQEgCCkDECIJQv8Bg0IEUQ0BIAAgCTcCAAwDCyABLQBNIQQCQAJAAkAgA0HDAHFFDQAgBEEBcUUNAQwCCyAEQQFxDQEgBkEBOgAAIAEgASgCLEEBajYCLAsgCEEQaiABEKYTIAgtABBBBEYNACAIKQMQIglC/wGDQgRSDQILIAdBADoAAAsgAEEEOgAADAELIAAgCTcCAAsgCEEgaiQAC/0EAgN/AX4jAEEwayIDJAAgA0EgaiACIAEoAhgiBCgCMEEAEKICAkACQCADLQAgQQRGDQAgAykDICIGQv8Bg0IEUQ0AIAAgBjcCAAwBCwJAAkACQAJAIAQoAjAiBUUNACADQSBqIAIgBRDiHCADLQAgQQRGDQAgAykDICIGQv8Bg0IEUg0BCyAELQBFDQEgA0EANgIgIANBGGogAiADQSBqQZHRmwFBCBCGDSADLQAYQQRGDQIgAykDGCIGQv8Bg0IEUQ0CIAAgBjcCAAwDCyAAIAY3AgAMAgsgA0EANgIMIANBIGogAiADQQxqQfazmwFBBRCGDQJAIAMtACBBBEYNACADKQMgIgZC/wGDQgRRDQAgACAGNwIADAILIANBIGogAhDdDwJAIAMtACBBBEYNACADKQMgIgZC/wGDQgRRDQAgACAGNwIADAILIANBIGogAiADQQxqQZHRmwFBCBCGDSADLQAgQQRGDQAgAykDICIGQv8Bg0IEUQ0AIAAgBjcCAAwBCwJAIAQtAERFDQAgA0EANgIgIANBGGogAiADQSBqQYqcmwFBARCFDSADLQAYQQRGDQAgAykDGCIGQv8Bg0IEUQ0AIAAgBjcCAAwBCwJAIAEtABRBAkYNACADQSBqIAIQ3Q8CQCADLQAgQQRGDQAgAykDICIGQv8Bg0IEUQ0AIAAgBjcCAAwCCyADQSBqIAEgAhD2FCADLQAgQQRGDQAgAykDICIGQv8Bg0IEUQ0AIAAgBjcCAAwBCyADQSBqIAIgBBC7BQJAIAMtACBBBEYNACADKQMgIgZC/wGDQgRRDQAgACAGNwIADAELIABBBDoAAAsgA0EwaiQAC4UFARV/IwBB4ABrIgIkACABKAIEIQMgAiABKAIIIgRBBEEQEKMOIAIoAgQhBQJAAkACQCACKAIAQQFGDQAgAigCCCEGAkAgBUUNACADIARBBHRqIQdBACEIIAUhCQNAIAMgB0YNAUEALQDg9p0BGiADKAIIIQogAygCBCELQcAAEIQBIgxFDQMgAiADKAIAEEUgDEE4aiACQThqKQMANwMAIAxBMGogAkEwaikDADcDACAMQShqIAJBKGopAwA3AwAgDEEgaiACQSBqKQMANwMAIAxBGGogAkEYaikDADcDACAMQRBqIAJBEGopAwA3AwAgDEEIaiACQQhqKQMANwMAIAwgAikDADcDAAJAAkAgAygCDCINDQBBACEODAELQQAtAOD2nQEaQRQQhAEiDkUNBCANKAIEIQEgDSgCECEPIA0oAgwhECACIA0oAggiEUEEQQQQow4gAigCBCESIAIoAgBBAUYNBSACKAIIIRMCQCASRQ0AIBFBAnQhDSATIRQgEiEVA0AgDUUNAUEALQDg9p0BGkHgABCEASIWRQ0GIAIgASgCABBlAkBB4ABFDQAgFiACQeAA/AoAAAsgFCAWNgIAIA1BfGohDSAUQQRqIRQgAUEEaiEBIBVBf2oiFQ0ACwsgDiAPNgIQIA4gEDYCDCAOIBE2AgggDiATNgIEIA4gEjYCAAsgA0EQaiEDIAYgCEEEdGoiASAONgIMIAEgCjYCCCABIAs2AgQgASAMNgIAIAhBAWohCCAJQX9qIgkNAAsLIAAgBDYCCCAAIAY2AgQgACAFNgIAIAJB4ABqJAAPCyAFIAIoAghBiKSaARDYIAsACyASIAIoAghBiKSaARDYIAALggUBBX8jAEEQayICJABBBCEDAkACQAJAAkACQCABKAIADgUEAAECAwQLIAEoAgRFDQNBCCEDCyABIANqKAIAIAAQpQEMAgsCQCABKAIEIgQtAGxBAkcNACAEQcAAaiEBA0AgASgCGCIBLQAsQQJGDQALCwJAIARBhAFqKAIAIgNFDQAgBEGAAWooAgAiASADQdgAbGohBQNAAkACQCABKAIAIgNBBUcNACABKAIEIAAQpQEMAQsgA0EERg0AAkACQAJAIAMOBAMAAQIDCyABKAIEQQFHDQIgASgCCCAAEKUBDAILIAEoAgQgABDTAgwBCyABQQxqKAIAIQYgAUEIaigCACEDIAIgADYCDCAGRQ0AIAZBKGwhBgNAIAJBDGogAxCwBiADQShqIQMgBkFYaiIGDQALCyABQdgAaiIBIAVHDQALCwJAIAQoAngiAUUNACABQQhqKAIAIgNFDQAgAUEEaigCACEBIANBAnQhAwNAIAEoAgAgABDsASABQQRqIQEgA0F8aiIDDQALCwJAIARBmAFqKAIAIgFFDQAgAUEobCEDIARBlAFqKAIAQQRqIQEDQAJAAkACQAJAAkAgAUF8aigCAA4FBAABAgMECyABKAIAQQFHDQMgAUEEaigCACAAEKUBDAMLIAEoAgAgABClAQwCCyABIAAQkgcMAQsgASAAEJkFCyABQShqIQEgA0FYaiIDDQALCyAELQA8IgFBBkYNASABQQJHDQEgBEEQaiEBA0AgASgCGCIBLQAsQQJGDQAMAgsLIAEoAgwiA0UNACABKAIIIQEgA0EobCEDA0AgACABEMkFIAFBKGohASADQVhqIgMNAAsLIAJBEGokAAv7BAEEfwJAAkACQAJAIAAoAgAOBAMAAQIDCyAAKAIEQQFHDQIgACgCCCABEG4PCwJAIAAoAgQiAi0AbEECRw0AIAJBwABqIQADQCAAKAIYIgAtACxBAkYNAAsLAkAgAkGEAWooAgAiA0UNACACQYABaigCACIAIANB2ABsaiEEA0ACQAJAIAAoAgAiA0EFRw0AIAAoAgQgARBuDAELIANBBEYNAAJAAkACQCADDgQDAAECAwsgACgCBEEBRw0CIAAoAgggARBuDAILIAEgACgCBBD7BwwBCyAAQQxqKAIA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CwsCQAJAIAUgA0H//wNxTw0AIAMgBWshA0EAIQFBACEIAkACQAJAIARBHXZBA3EOBAIAAQACCyADIQgMAQsgA0H+/wNxQQF2IQgLIARB////AHEhByAAKAIEIQUgACgCACEGA0AgAUH//wNxIAhB//8DcU8NAiABQQFqIQEgBiAHIAUoAhARCABFDQAMAwsLIAAoAgAgACgCBCACELYHIQEgACAJNwIIDAILIAYgBSACELYHDQAgAyAIa0H//wNxIQNBACEIA0ACQCAIQf//A3EgA0kNAEEAIQEgACAJNwIIDAMLQQEhASAIQQFqIQggBiAHIAUoAhARCABFDQALIAAgCTcCCAwBC0EBIQELIAJBEGokACABC+EEAQJ/IwBBgAFrIgIkAAJAAkACQAJAAkACQAJAAkAgACgCACIAKAIADgcHAAECAwcEBwsgAEEMaigCACIDRQ0GIABBCGooAgAhACADQShsIQMDQAJAIAAoAgBBB0YNACAAIAEQqgMLIABBKGohACADQVhqIgMNAAwHCwsgACgCBCABEKoDDAULIABBDGooAgAiA0UNBCAAQQhqKAIAIQAgA0E4bCEDA0AgASAAEJUEIABBOGohACADQUhqIgMNAAwFCwsgACgCBCABEKoDIAAoAggiACgCAEEaRw0BIAJBwABqIAEoAgAgASgCBCAAQQhqIgEQgg0gAigCQEEyRg0DIAAQ0QEgAEE4aiACQcAAakE4aikDADcDACAAQTBqIAJBwABqQTBqKQMANwMAIABBKGogAkHAAGpBKGopAwA3AwAgAEEgaiACQcAAakEgaikDADcDACAAQRhqIAJBwABqQRhqKQMANwMAIABBEGogAkHAAGpBEGopAwA3AwAgASACQcAAakEIaikDADcDACAAIAIpA0A3AwAMAwsgACgCBCIAKAIAQRpHDQEgAiABKAIAIAEoAgQgAEEIaiIBEIINIAIoAgBBMkYNAiAAENEBIABBOGogAkE4aikDADcDACAAQTBqIAJBMGopAwA3AwAgAEEoaiACQShqKQMANwMAIABBIGogAkEgaikDADcDACAAQRhqIAJBGGopAwA3AwAgAEEQaiACQRBqKQMANwMAIAEgAkEIaikDADcDACAAIAIpAwA3AwAMAgsgACABEEYMAQsgACABEEYLIAJBgAFqJAAL5AQBBH8CQAJAAkACQAJAIAAoAgAiAg0AAkACQCAAKAIEIgAoAgAiA0F7aiICQQQgAkEGSRsOBgYAAQMEBQYLIAAoAghBA0cNACABIAAoAgwQqwELIAAoAighAgsgASACEKsBDwsCQCAAKAIIQQNHDQAgASAAKAIMEKsBCyAAKAIoQYCAgIB4Rg0CIABBMGooAgAiAkUNAiAAQSxqKAIAIQAgAkEwbCECA0AgACABEKIDIABBMGohACACQVBqIgINAAwDCwsgAEEgaiECAkAgA0EDRw0AIAEgACgCBBCrAQsCQCACKAIAQQdGDQAgAiABEO4JCyAAKAJoIAEQ7gkgACgCSEGAgICAeEYNASAAQdAAaigCACICRQ0BIABBzABqKAIAIQAgAkEwbCECA0AgACABEKIDIABBMGohACACQVBqIgINAAwCCwsCQCAAKAIIQQNHDQAgASAAKAIMEKsBCwJAIAAoAigiBEEIaigCACIARQ0AIARBBGooAgAiAyAAQQZ0aiEFA0ACQCADQThqKAIAIgJFDQAgA0E0aigCACEAIAJBDGwhAgNAIAEgACgCABCrASAAQQxqIQAgAkF0aiICDQALCyADIAEQ7gkgA0HAAGoiACEDIAAgBUcNAAsLAkAgBEEUaigCACICRQ0AIARBEGooAgAhACACQQxsIQIDQCABIAAoAgAQqwEgAEEMaiEAIAJBdGoiAg0ACwsgBCgCGEGAgICAeEYNACAEQSBqKAIAIgJFDQAgBEEcaigCACEAIAJBMGwhAgNAIAAgARCiAyAAQTBqIQAgAkFQaiICDQALCwv7BAEGfyMAQRBrIgIkAAJAAkACQAJAIAAoAgAOBAMAAQIDCyAAKAIEQQFHDQIgAS0AKCEDIAFBADoAKCABLQB5IQQgAUEAOgB5AkAgACgCCCIAKAIAQRpHDQAgAiAAKQMIIABBGGooAgAQ5xogAUEsaiACKQMAIAIoAggQkAsLIAAgARB4IAEgAzoAKCABIAQ6AHkMAgsgACgCBCIEQcAAaiABEIALIARBgAFqKAIAIARBhAFqKAIAIAEQwggCQCAEQZgBaigCACIDRQ0AIARBlAFqKAIAIQAgA0EobCEDA0AgACABENcHIABBKGohACADQVhqIgMNAAsLIAQtADxBBkYNASAEQRBqIAEQgAsMAQsgACgCDCIDRQ0AIAAoAggiBCADQShsaiEFIAFBLGohBgNAAkACQAJAAkACQCAEKAIADgUEAAECAwQLIAQoAgRBAUcNAyABLQAoIQMgAUEAOgAoIAEtAHkhByABQQA6AHkCQCAEKAIIIgAoAgBBGkcNACACIAApAwggAEEYaigCABDnGiAGIAIpAwAgAigCCBCQCwsgACABEHggASADOgAoIAEgBzoAeQwDCyABLQAoIQMgAUEAOgAoIAEtAHkhByABQQA6AHkCQCAEKAIEIgAoAgBBGkcNACACIAApAwggAEEYaigCABDnGiAGIAIpAwAgAigCCBCQCwsgACABEHggASADOgAoIAEgBzoAeQwCCyABIAQoAgQQpQcMAQsgBEEMaigCACIDRQ0AIARBCGooAgAhACADQShsIQMDQCABIAAQtAMgAEEoaiEAIANBWGoiAw0ACwsgBEEoaiIEIAVHDQALCyACQRBqJAAL1QQCBH8BfiMAQYABayICJAACQAJAIAEtABRBAkYNACACQQhqIAAgARD5BSACLQA0QQZGDQAgAkE4akEoaiACQQhqQShqKQMANwMAIAJBOGpBIGogAkEIakEgaikDADcDACACQThqQRhqIAJBCGpBGGopAwA3AwAgAkE4akEQaiACQQhqQRBqKQMANwMAIAJBOGpBCGogAkEIakEIaikDADcDACACIAIpAwg3AzgCQAJAAkACQCACLQBkIgNBfWoiAEEBIABB/wFxQQNJG0H/AXEOAwACAQALIAJB8ABqQQhqIAJBFGopAgA3AwAgAkHuAGogAkEfai0AADoAACACIAIpAgw3A3AgAiACLwAdOwFsIAItAEwhBCACKAI4IQAMAgtBtumaAUEPQYDqmgEQjBoAC0EALQDg9p0BGkEwEIQBIgBFDQIgACACKQMINwMAIABBKGogAkEIakEoaikDADcDACAAQSBqIAJBCGpBIGopAwA3AwAgAEEYaiACQQhqQRhqKQMANwMAIABBEGogAkEIakEQaikDADcDACAAQQhqIAJBCGpBCGopAwA3AwBBAiEECwJAIAEpAwAiBkIDg0IAUg0AIAanIgMgAygCACIFQX9qNgIAAkAgBUEBRw0AIAMgAygCEBDpHQsgAi0AZCEDCyABIAA2AgAgASACKQNwNwIEIAEgBDoAFCABIAIvAWw7ABUgAUEMaiACQfgAaikDADcCACABQRdqIAJB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AA8LQn8gB4ZCf4UhCQJAAkACQAJAIAMgAU0NAEEAIANrIQUgAUEIaiEGIAMgAWshBCABQYAGIAFBgAZJG0GAemohA0EIIQEDQCADIAFqQQhGDQIgACAGajEAACEKIAAgAWogCCAHiDwAACAKIAggCYNCCn58IQggAUEBaiEBIAUgBkEBaiIGakEIRw0ACyAIUA0DDAILQQAhBCAIQgBSDQEgAEEANgIADAMLIAZBeGpBgAZBjOqAARDDEgALA0AgCCIKIAmDQgp+IQggCiAHiKchAQJAAkAgBEGABkkNACABQf8BcUUNASAAQQE6AIgGDAELIAIgBGogAToAACAEQQFqIQQLIAhCAFINAAsLIAAgBDYCACAEQYAGSw0BIARBB2ohAQNAIAAgAWotAAANASAAIAFBeGo2AgAgAUF/aiIBQQdHDQALCw8LIARBf2pBgAZB3OmAARDDEgAL3gQCAn8BfiMAQcAAayIDJAACQAJAAkACQAJAAkACQAJAIAEoAgAOBQABAgMEAAsgA0EwaiACIAEoAhAiBEEAEKICIAMtADBBBEYNBCADKQMwIgVC/wGDQgRRDQQgACAFNwIADAYLIANBMGogAUEIaiACEIYBIAMtADBBBEYNBCADKQMwIgVC/wGDQgRRDQQgACAFNwIADAULIANBMGogAUEIaiACENwWIAMtADBBBEYNAyADKQMwIgVC/wGDQgRRDQMgACAFNwIADAQLIANBMGogAUEEaiACEKUJIAMtADBBBEYNAiADKQMwIgVC/wGDQgRRDQIgACAFNwIADAMLIANBMGogAUEIaiACELsDIAMtADBBBEYNASADKQMwIgVC/wGDQgRRDQEgACAFNwIADAILAkACQAJAIARFDQAgA0EwaiACIAQQ4hwgAy0AMEEERg0AIAMpAzAiBUL/AYNCBFINAQsgAUEIaiEBIAItAEwNASADQTBqIAEgAhCiFSADLQAwQQRGDQIgAykDMCIFQv8Bg0IEUQ0CIAAgBTcCAAwDCyAAIAU3AgAMAgsgA0EQaiABEJQTIANBMGogAygCECADKAIUEOIEIANBJGogAygCNCIBIAMoAjhBASACLQBSENsBIANBCGogA0EkahCGFSADQRhqIAIgAygCCCADKAIMEJYOAkAgAy0AGEEERg0AIAMpAxgiBUL/AYNCBFENACAAIAU3AgAgA0EkahDTHyADKAIwIAEQtCEMAgsgA0EkahDTHyADKAIwIAEQtCELIABBBDoAAAsgA0HAAGokAAuPBQECfyMAQTBrIgMkAAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgBBfmoiBEEGIARBCUkbDgkAAQIDBAUGBwgACyADQQE2AhQgA0GU85sBNgIQIANCATcCHCADQYsCNgIMIAMgACkCCDcCKCADIANBCGo2AhggAyADQShqNgIIIAEgAiADQRBqEOUgIQAMCAsgAyAAQQRqNgIIIANBAjYCFCADQYDCmAE2AhAgA0IBNwIcIANB+gA2AiwgAyADQShqNgIYIAMgA0EIajYCKCABIAIgA0EQahDlICEADAcLIANBADYCICADQQE2AhQgA0GkwpgBNgIQIANCBDcCGCABIAIgA0EQahDlICEADAYLIANBADYCICADQQE2AhQgA0G0wpgBNgIQIANCBDcCGCABIAIgA0EQahDlICEADAULIANBADYCICADQQE2AhQgA0HQwpgBNgIQIANCBDcCGCABIAIgA0EQahDlICEADAQLIANBADYCICADQQE2AhQgA0HwwpgBNgIQIANCBDcCGCABIAIgA0EQahDlICEADAMLIAMgADYCCCADQQE2AhQgA0GU85sBNgIQIANCATcCHCADQYwCNgIsIAMgA0EoajYCGCADIANBCGo2AiggASACIANBEGoQ5SAhAAwCCyADIABBBGo2AgggA0ECNgIUIANB+MKYATYCECADQgE3AhwgA0H6ADYCLCADIANBKGo2AhggAyADQQhqNgIoIAEgAiADQRBqEOUgIQAMAQsgAyAAQQRqNgIIIANBATYCFCADQZTzmwE2AhAgA0IBNwIcIANB+gA2AiwgAyADQShqNgIYIAMgA0EIajYCKCABIAIgA0EQahDlICEACyADQTBqJAAgAAv0BAEHfyMAQRBrIgIkACAAKAIAIQACQAJAAkACQAJAIAEoAgAOBQQAAQIDBAsgASgCBEEBRw0DIAAtACghAyAAQQA6ACggAC0AeSEEIABBADoAeQJAIAEoAggiASgCAEEaRw0AIAIgASkDCCABQRhqKAIAEOcaIABBLGogAikDACACKAIIEJALCyABIAAQeCAAIAM6ACggACAEOgB5DAMLIAAtACghAyAAQQA6ACggAC0AeSEEIABBADoA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/wNxIQBBACEBA0ACQCABQf//A3EgAEkNAEEADwtBASEJIAFBAWohASAKIAcgBigCEBEIAEUNAAwDCwtBASEJIAogBCAFIAcoAgwRDAANASAAIA03AghBAA8LQQEhCSAAKAIAIgEgACgCBCIKIAggAiADEJcbDQAgASAEIAUgCigCDBEMACEJCyAJC9kEAQd/IwBBIGsiAiQAQQEhAwJAIAFFDQAgASAAKAIESQ0AIAFBECABQRBLGyEEAkACQAJAIAAoAggiBUH///93Rg0AIAFB/v//B00NAQwDCyABQf7//wdNDQJBACEFAkAgACgCAEF8aiIGKAAAIgdBf3NBH3YgB0HE0oABELccIgdB+P///wdLDQBBBCEFIAJBBDYCHCACIAdBBGo2AhgLIAIgBTYCFCACQQhqIAJBFGpB4NKAARCwFyACKAIIIQUgAigCDCEIIARBf3NBH3YgBEHE0oABELccIQRBACEHAkAgAUH4////B0sNAEEEIQcgAkEENgIcIAIgBEEEajYCGAsgAiAHNgIUIAJBCGogAkEUakHg0oABELAXIAIoAggiByACKAIMakF/akEAIAdrcSIHIARJDQIgBiAFIAhqQX9qQQAgBWtxIAUgBxDvAyIFRQ0CIAUgBDYAACAFQQRqIQQMAQtBACEDIAQgBUH///8HcSIFRg0BIAJBADYCHCACIAU2AhhBASEDIAJBATYCFCACQQhqIAJBFGpB8NKAARCwFyACKAIIIQUgAigCDCEGIARBf3NBH3YgBEGg0JgBELccIQQgAkEANgIcIAIgBDYCGCACQQE2AhQgAkEIaiACQRRqQfDSgAEQsBcgAigCCCIHIAIoAgxqQX9qQQAgB2txIgcgBEkNASAAKAIAIAUgBmpBf2pBACAFa3EgBSAHEO8DIgRFDQELIAAgAUH///8HIAFB////B0kbQYCAgHByNgIIIAAgBDYCAEEAIQMLIAJBIGokACADC+kEAgR/BH4jAEHQAGsiAiQAAkACQAJAAkACQAJAAkACQCABKAIADgcEAQACAAMGAAsgAEEMNgIAIAAgASkDADcDCCAAQShqIAFBIGopAwA3AwAgAEEgaiABQRhqKQMANwMAIABBGGogAUEQaikDADcDACAAQRBqIAFBCGopAwA3AwAMBgsgAkEQaiABQRBqKQIANwMAIAJBCGpBEGog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ACICRQ0EIAFBCGooAgAhASACQShsIQIDQAJAIAEoAgBBB0YNACABIAAQ4wQLIAFBKGohASACQVhqIgINAAwFCwsgASgCBCAAEOMEDwsgAUEMaigCACICRQ0CIAFBCGooAgAhASACQThsIQIDQCAAIAEQpwYgAUE4aiEBIAJBSGoiAg0ADAMLCyAAIAFBBGoQgw4PCyAALQAlIQIgASgCBCEBAkAgAC0AJCIEDQACQCABKAIAQXRqIgNBByADQSZJG0F7aiIDQR9LDQBBASADdEGuooCAeHENASADDQAgAS0AEUUNAQsgAEEDOgAkCyAAIAEQzgEgASAAEFMgACACOgAlIAAgBDoAJCAAIAEQnQELC6gEAQR/QQQhAgJAAkACQAJAAkAgACgCAA4FBAABAgMECyAAKAIERQ0DQQghAgsgACACaigCACABEG4PCwJAIAAoAgQiAy0AbEECRw0AIANBwABqIQADQCAAKAIYIgAtACxBAkYNAAsLAkAgA0GEAWooAgAiAkUNACADQYABaigCACEAIAJB2ABsIQIDQAJAAkACQCAAKAIAQXxqDgICAAELIABBBGooAgAgARBuDAELIAAgARDKBQsgAEHYAGohACACQah/aiICDQALCwJAIAMoAngiAEUNACAAQQhqKAIAIgJFDQAgAEEEaigCACEAIAJBAnQhAgNAIAAoAgAgARCnASAAQQRqIQAgAkF8aiICDQALCwJAIANBmAFqKAIAIgBFDQAgA0GUAWooAgAiBCAAQShsaiEFA0ACQAJAAkACQAJAIAQoAgAOBQQAAQIDBAsgBCgCBEEBRw0DIAQoAgggARBuDAMLIAQoAgQgARBuDAILIAEgBCgCBBD7BwwBCyAEQQxqKAIAIgJFDQAgBEEIaigCACEAIAJBKGwhAgNAIAEgABCxBCAAQShqIQAgAkFYaiICDQALCyAEQShqIgQgBUcNAAsLIAMtADwiAEEGRg0BIABBAkcNASADQRBqIQADQCAAKAIYIgAtACxBAkYNAAwCCwsgACgCDCICRQ0AIAAoAgghACACQShsIQIDQCABIAAQsQQgAEEoaiEAIAJBWGoiAg0ACwsLzwQCBX8CfiMAQTBrIgMkAAJAIAEtAMgBIgRBA0cNACADQRhqIAEgASgCwAFBABCLBiABQcABaiIEQQhqIANBGGpBCGooAgA2AgAgBCADKQIYNwIAIAEtAMgBIQQLIAEoAsQBIQUgASgCwAEhBgJAAkACQAJAAkACQAJAAkAgBEH/AXEiB0G5f2oOAgECAAsgB0GiAUYNAiADQRhqQQRyIAQQhh4gA0EDNgIsIANB3r6bATYCKCADQbCAgIB4NgIYIAEoAsABIAEoAsQBIANBGGoQhBchBAJAIAEtAMgBQaIBRw0AIAEQ1xIhBiABEOMOIAEgBhD6EgsgAEECOgAYIAAgBDYCAAwGCyADIAEgBiAFQX5qIgQQ2BkgAygCACADKAIEEPkXIQggA0EYaiABEPgQIAEQ4w4CQCADKAIYDQAgAykDICEJDAQLIAMgAygCHCIBNgIUAkAgAg0AIABBAjoAGCAAIAE2AgAgCBDzHwwGCyADQRRqEI0gQgAhCQwDCyADQQhqIAEgBiAFQX9qIgQQ2BkgAygCCCADKAIMEPkXIQggA0EYaiABEPgQIAEQ4w4CQCADKAIYDQAgAykDICEJDAILIAMgAygCHCIBNgIUAkAgAg0AIABBAjoAGCAAIAE2AgAgCBDzHwwFCyADQRRqEI0gQgAhCQwBCyABENcSIQQgARDjDiAAQQI6ABggACAENgIADAMLQQEhAQwBC0EAIQELIAAgAToAGCAAIAk3AxAgACAENgIMIAAgBjYCCCAAIAg3AwALIANBMGokAAuNBAIIfwR+IAApAxAgACkDGCABIAIQ7QYhDAJAIAAoAggNACAAIABBEGoQrwIaCyABQQhqIQQgACgCBCIFIAyncSEGIAxCGYgiDUL/AINCgYKEiJCgwIABfiEOIAAoAgAhB0EAIQhBACEJA0ACQAJAAkACQCAHIAZqKQAAIg8gDoUiDEJ/hSAMQv/9+/fv37//fnyDQoCBgoSIkKDAgH+DIgxQDQADQCAEIAIgB0EAIAx6p0EDdiAGaiAFcWtBDGxqIgpBdGooAgBBCGogCkF4aigCABDFHg0CIAxCf3wgDIMiDFBFDQALCyAPQoCBgoSIkKDAgH+DIQwCQCAJQQFGDQAgDFANAiAMeqdBA3YgBmogBXEhCwsCQCAMIA9CAYaDQgBSDQBBASEJDAMLAkAgByALaiwAACIGQQBIDQAgByAHKQMAQoCBgoSIkKDAgH+DeqdBA3YiC2otAAAhBgsgByALaiANp0H/AHEiCjoAACAHIAUgC0F4anFqQQhqIAo6AAAgACAAKAIIIAZBAXFrNgIIIAAgACgCDEEBajYCDCAHQQAgC2tBDGxqIgBBdGogATYCACAAQXhqIAI2AgAgAEF8aiADNgIADwsgCkF8aiADNgIAIAEgASgCACIAQX9qNgIAAkAgAEEBRw0AIAEgAhCpGgsPC0EAIQkLIAYgCEEIaiIIaiAFcSEGDAALC5YEAQh/IwBBwABrIgQkAAJAAkAgASgCBCIFKAIcIgYgAyAGIANJGyIHDQBBACEIDAELIAUoAhhBDmohBkEAIQggAiEJA0AgBkF+ai0AAEEBRw0BIAZBf2otAAAgCS0AAEcNASAGLQAAQf8BcSAJQQFqLQAAQf8BcUcNASAGQRBqIQYgCUECaiEJIAcgCEEBaiIIRw0ACyAHIQgLAkACQAJAIAMgCE0NACAEIAEgCBCVCQJAAkAgBCgCACIKQSpGDQBBPEUNASAAQQRqIARBBHJBPPwKAAAMAQsgBSgCHCIGRQ0CIAUoAhggBkEEdGoiBkF8aiIJLQAAQQFGDQMgBkF9aiACIAhBAXRqIgYvAAA7AAAgCUEBOgAAQSohCiADIAhrQQF0IglBAkYNACAFQRRqIQIgBiAJaiELIAZBAmohCSAFKAIcIghBBHQhBwNAIAlBAWotAAAhAyAJLQAAIQECQCAIIAIoAgBHDQAgAkHMs4QBEJAYCyAFKAIYIAdqIgZCgICAgMAANwIAIAZBDmogAzoAACAGQQ1qIAE6AAAgBkEMakEBOgAAIAZBCGpBADYCACAFIAhBAWoiCDYCHCAHQRBqIQcgCUECaiIJIAtHDQALCyAAIAo2AgAgBEHAAGokAA8LQaSyhAFBK0HQsoQBEIwaAAtB4LKEAUEPQfCyhAEQqxQAC0GAs4QBQTxBvLOEARCMGgAL4wQBA38jAEGwA2siAyQAIAMgARCBCiIENgIMAkACQAJAAkACQAJAIARB3QBHDQAgA0EQaiACEKcOIANB6ABqIAEoAgAiBCADQRBqEPkEIAQoAiANBCAEQX82AiAgBCgCLCICRQ0BIAQgAkF/aiICNgIsIAQoAiggAkGYAWxqIgIoAgAiBUH3/7t/ag4CAgEDCyADQQA2AtgCIANBDGpBzIKFASADQdgCakHUg4UBEOIbAAsgA0EANgLoAiADQQE2AtwCIANBiIOFATYC2AIgA0IENwLgAiADQdgCakGQg4UBEKgdAAsgA0EANgLoAiADQQE2AtwCIANBvIOFATYC2AIgA0IENwLgAiADQdgCakHEg4UBEKgdAAsCQEEkRQ0AIANBwAFqIAJB9ABqQST8CgAACyADIAU2AuQBAkBB8ABFDQAgA0HkAWpBBGogAkEEakHwAPwKAAALIAEQ2wgaIANB0AJqIARB2ABqKAIANgIAIAMgBCkCUDcCyAIgA0HkAWoQowMCQEHYAEUNACADQeQBaiADQegAakHYAPwKAAALAkACQCAEKAIsRQ0AQQAtAOD2nQEaQfQAEIQBIgFFDQMCQEH0AEUNACABIANB5AFqQfQA/AoAAAsgA0GGgMQANgLYAiADIAE2AtwCIANBwAFqIANB2AJqEM8IAkBBJEUNACAAQQRqIANBwAFqQST8CgAACyAAQYmAxAA2AgAMAQsCQEH0AEUNACAAIANB5AFqQfQA/AoAAAsgA0HAAWoQlhoLIAQgBCgCIEEBajYCICADQbADaiQADwtB0IKFARD3FgsAC50EAQh/QQAhBgJAAkAgBUUNAAJAAkAgBUEDSw0AIANB/wFxIQMgBCEHA0AgAyAHLQAAIghGDQIgAUH/AXEgCEYNAiACQf8BcSAIRg0CIAdBAWohByAFQX9qIgVFDQMMAAsLAkBBgIKECCAEKAAAIgggAUH/AXFBgYKECGwiCXMiB2sgB3JBgIGChHhxQYCBgoR4Rw0AQYCChAggCCACQf8BcUGBgoQIbCIKcyIHayAHckGAgYKEeHFBgIGChHhHDQBBgIKECCAIIANB/wFxQYGChAhsIgtzIgdrIAdyQYCBgoR4cUGAgYKEeEcNAAJAIARBfHFBBGoiByAEIAVqIghBfGoiDEsNAANAQYCChAggBygCACIFIAlzIg1rIA1yQYCBgoR4cUGAgYKEeEcNAUGAgoQIIAUgCnMiDWsgDXJBgIGChHhxQYCBgoR4Rw0BQYCChAggBSALcyIFayAFckGAgYKEeHFBgIGChHhHDQEgB0EEaiIHIAxNDQALCyAHIAhPDQIgA0H/AXEhAwNAIAMgBy0AACIFRg0CIAFB/wFxIAVGDQIgAkH/AXEgBUYNAiAHQQFqIgcgCEYNAwwACwsgBCEHA0AgA0H/AXEgBy0AACIIRg0BIAFB/wFxIAhGDQEgAkH/AXEgCEYNASAHQQFqIQcgBUF/aiIFRQ0CDAALCyAHIARrIQdBASEGDAELCyAAIAc2AgQgACAGNgIAC6oEAgd/AX4jAEEwayICJAACQAJAAkAgAC0APA0AIAAtAChBAUcNAQtBACEDIAJBADsALSACQQhqQQhqQQApA5j/nAEiCTcDACACQSBqIAk3AwAgAiAANgIoIAIgAC0AODoALCACQQApA5D/nAEiCTcDCCACIAk3AxggAkEIakEQaiEEAkAgASgCCCIFRQ0AIAEoAgQhASAFQThsIQYDQAJAAkACQAJAAkACQAJAAkACQCABIANqIgcoAgBBf2oOCQAEBAQEBAQEAQQLIAdBCGooAgBBf2oOAgECAwsgB0EIaiIIKAIAQRFGDQQMBQsgByACQQhqEIIEDAULIAdBDGooAgAtABlFDQELIAcgAkEIahCCBAwDCyAHIAJBCGoQggQMAgsCQAJAIAdBEGooAgBBf2oOAgEAAgsgB0EUaigCAC0AGQ0BIAggAkEIahDYAgwCCyAIIAJBCGoQ2AIMAQsgCCACQQhqENgCCyAGIANBOGoiA0cNAAsgAkEIahDWFyAEENYXIAVBOGwhAwNAAkACQCABKAIAQQlHDQAgAUEIaiAAEMcBDAELIAEgABDZAQsgAUE4aiEBIANBSGoiAw0ADAMLCyACQQhqENYXIAQQ1hcMAQsgASgCCCIDRQ0AIAEoAgQhASADQThsIQMDQAJAAkAgASgCAEEJRw0AIAFBCGogABDHAQwBCyABIAAQ2QELIAFBOGohASADQUhqIgMNAAsLIAJBMGokAAuTBAEEfwJAAkACQAJAAkACQCAAKAIAIgJBe2oiA0EEIANBBkkbDgYFAAECAwQFCwJAIAAoAghBA0cNACAAKAIMIAEQbgsgACgCKCABEG4PCyAAKAIoIAEQbg8LAkAgACgCCEEDRw0AIAAoAgwgARBuCyAAKAJIIgBFDQIgACgCACABEKcBDwsgAEEgaiEDAkAgAkEDRw0AIAAoAgQgARBuCwJAIAMoAgBBB0YNACADIAEQ+AkLIAAoAmggARD4CQ8LAkAgACgCCEEDRw0AIAAoAgwgARBuCwJAIAAoAigiBEEIaigCACIARQ0AIARBBGooAgAiAiAAQQZ0aiEFA0ACQCACQThqKAIAIgNFDQAgAkE0aigCACEAIANBDGwhAwNAIAAoAgAgARBuIABBDGohACADQXRqIgMNAAsLIAIgARD4CSACQcAAaiIAIQIgACAFRw0ACwsCQCAEQRRqKAIAIgNFDQAgBEEQaigCACEAIANBDGwhAwNAIAAoAgAgARBuIABBDGohACADQXRqIgMNAAsLAkAgBCgCPCIARQ0AIABBCGooAgAiA0UNACADQTBsIQMgAEEEaigCAEEkaiEAA0ACQCAAQXxqKAIAIgJFDQAgAiABEKcBCwJAIAAoAgAiAkUNACACIAEQpwELIABBMGohACADQVBqIgMNAAsLIAQoAkAiAEUNACAAKAIAIAEQpwELC6AEAQV/IwBBEGsiAiQAIAAoAgAhAwJAAkACQAJAAkAgASgCAA4FBAABAgMECyABKAIEQQFHDQMgASgCCCADEKUBDAMLIAEoAgQgAxClAQwCCwJAIAEoAgQiBC0AbEECRw0AIARBwABqIQEDQCABKAIYIgEtACxBAkYNAAsLAkAgBEGEAWooAgAiAEUNACAEQYABaigCACIBIABB2ABsaiEFA0ACQAJAIAEoAgAiAEEFRw0AIAEoAgQgAxClAQwBCyAAQQRGDQACQAJAAkAgAA4EAwABAgMLIAEoAgRBAUcNAiABKAIIIAMQpQEMAgsgASgCBCADENMCDAELIAFBDGooAgAhBiABQQhqKAIAIQAgAiADNgIMIAZFDQAgBkEobCEGA0AgAkEMaiAAELAGIABBKGohACAGQVhqIgYNAAsLIAFB2ABqIgEgBUcNAAsLAkAgBCgCeCIBRQ0AIAFBCGooAgAiAEUNACABQQRqKAIAIQEgAEECdCEAA0AgASgCACADEOwBIAFBBGohASAAQXxqIgANAAsLIARBmAFqKAIAIQAgBEGUAWooAgAhASACIAM2AggCQCAARQ0AIABBKGwhAANAIAJBCGogARCwBiABQShqIQEgAEFYaiIADQALCyAELQA8IgFBBkYNASABQQJHDQEgBEEQaiEBA0AgASgCGCIBLQAsQQJGDQAMAgsLIAFBBGogAxCZBQsgAkEQaiQAC8sEAQl/IwBBEGsiBCQAIAEoAgBBrP6aAUEBEK4JIAIgA2ohBUEAIQYgAiEHA0AgBiEIQQAhCQJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAA0AgByAJaiIKIAVGDQEgCUEBaiEJIAotAAAiC0Gc/JoBai0AACIKRQ0ACyAIIAlqIgZBf2oiDCAITQ0DIAhFDQIgAyAISw0BIAMgCEYNAgwMCwJAIAMgCEYNAAJAIAhFDQAgAyAITQ0FIAIgCGosAABBv39MDQULIAEoAgAgAiAIaiADIAhrEK4JCyABKAIAQaz+mgFBARCuCSAAQQQ6AAAgBEEQaiQADwsgAiAIaiwAAEFASA0KCwJAAkAgDCADSQ0AIAwgA0cNCwwBCyACIAxqLAAAQb9/TA0KCyABKAIAIAIgCGogDCAIaxCuCQsgByAJaiEHIApB7QBKDQECQAJAAkAgCkGef2oOBQIFBQUBAAtBrf6aASEJIApBIkYNCSAKQdwARw0EQa/+mgEhCQwJC0Gz/poBIQkMCAtBsf6aASEJDAcLIAIgAyAIIANBjPyaARDEIQALIApBkn9qDggEAAAAAwACAQALQZKpmwFBKEH8+5oBEIwaAAsgBEHc6sGBAzYACiAEIAtBD3FB2P2cAWotAAA6AA8gBCALQQR2Qdj9nAFqLQAAOgAOIAEoAgAgBEEKakEGEK4JDAULQbn+mgEhCQwCC0G3/poBIQkMAQtBtf6aASEJCyABKAIAIAlBAhCuCQwBCwsgAiADIAggDEGc/poBEMQhAAuYBAEJfwJAAkACQAJAAkACQAJAIAUgBEkNACAFIANLDQEgBSAERg0DIAEtAIECIQYgAS0AgAIhByACIARqIQgCQCAFIARrIglBA0sNACAIIQoDQCAHIAotAAAiBUYNBiAGIAVGDQYgCkEBaiEKIAlBf2oiCQ0ADAULCwJAAkBBgIKECCAIKAAAIgsgB0GBgoQIbCIMcyIKayAKckGAgYKEeHFBgIGChHhGDQAgCCEKDAELIAghCkGAgoQIIAsgBkGBgoQIbCINcyILayALckGAgYKEeHFBgIGChHhGDQMLA0AgByAKLQAAIgVGDQUgBiAFRg0FIApBAWohCiAJQX9qIgkNAAwECwsgBCAFQeTAgAEQ1yIACyAFIANB5MCAARC8IgALAkAgCEF8cUEEaiIKIAIgBWoiC0F8aiIOSw0AA0BBgIKECCAKKAIAIgUgDHMiCWsgCXJBgIGChHhxQYCBgoR4Rw0BQYCChAggBSANcyIJayAJckGAgYKEeHFBgIGChHhHDQEgCkEEaiIKIA5NDQALCyAKIAtPDQADQCAHIAotAAAiCUYNAiAGIAlGDQIgCkEBaiIKIAtHDQALC0EAIQoMAQsgCiAIayAEaiIKIANPDQEgAEEAIAogASACIApqLQAAai0AAGsiCSAJIApLGyIKIAQgCiAESxs2AgRBAiEKCyAAIAo2AgAPCyAKIANB9MCAARDDEgALrQQBCn8jAEHQAGsiBiQAAkACQAJAIAEoAgAiB0F/akECSQ0AIAYgASgCBDYCBCAGIAc2AgAgBiABKAIUIgg2AhQgBiABKAIMIgk2AgwgBiABKAIIIgo2AgggBiABLQAYOgAYIAEoAhAiAUEBaiEHIAhBAWohCyAFKAIMIQwgBSgCCCENIAUoAgQhDiAFKAIAIQ8CQAJAAkADQAJAAkAgBCAJSQ0AIAQgCUcNAQwHCyAKIARqLAAAQb9/Sg0GCyAHRQ0BIAYgAUEBaiIENgIcIAYgCDYCICAIIAlLDQIgASALTw0CIAYgBDYCECAGQSRqIA8gDiAGIA0gDBB+IAYoAighAgJAIAYoAiQiBUECRw0AIAAgAjYCBEECIQQMBAsgB0EBaiEHIAQhASAGKAIsIgMhBCAFQQFxDQALQQAhBAwCC0GQ4oQBEMkiAAsgBkECNgIoIAZB0KGbATYCJCAGQgI3AjAgBkEONgJIIAZBwAE2AkAgBiAJNgJMIAYgBkE8ajYCLCAGIAZBzABqNgJEIAYgBkEcajYCPCAGQSRqQeChmwEQqB0ACyAAIAQ2AgAMAgsCQAJAAkAgBCABKAIMIgdJDQAgBCAHRg0BDAILIAEoAgggBGosAABBv39MDQELIAAgAzYCCCAAIAI2AgQgAEEBNgIADAILIAAgAzYCCCAAIAI2AgQgAEEANgIADAELIAAgAzYCCCAAIAI2AgQgAEEBNgIACyAGQdAAaiQAC/sDAQt/IABBOEHUACAAKAJYIAAoAjxJIAAoAlQiAiAAKAI4IgNJIAIgA0YbIgMbaiIEIAAgACgCICAAKAIESSAAKAIcIgIgACgCACIFSSACIAVGGyIFQQFzQRxsaiICIABB1ABBOCADG2oiAyADKAIEIAAgBUEcbGoiACgCBEkgAygCACIFIAAoAgAiBkkgBSAGRhsiBxsgBCgCBCACKAIESSAEKAIAIgUgAigCACIGSSAFIAZGGyIIGyIFKAIEIQkgACADIAIgCBsgBxsiBigCBCEKIAUoAgAhCyAGKAIAIQwgAUEYaiADIAAgBxsiAEEYaigCADYCACABQRBqIABBEGopAgA3AgAgAUEIaiAAQQhqKQIANwIAIAEgACkCADcCACABIAUgBiAJIApJIAsgDEkgCyAMRhsiAxsiACkCADcCHCABQTRqIABBGGooAgA2AgAgAUEsaiAAQRBqKQIANwIAIAFBJGogAEEIaikCADcCACABQdAAaiAGIAUgAxsiAEEYaigCADYCACABQcgAaiAAQRBqKQIANwIAIAFBwABqIABBCGopAgA3AgAgASAAKQIANwI4IAEgAiAEIAgbIgApAgA3AlQgAUHcAGogAEEIaikCADcCACABQeQAaiAAQRBqKQIANwIAIAFB7ABqIABBGGooAgA2AgALuwUAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCAA4ZAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGAALIAEoAgAgACgCBCAAKAIIIAEoAgQoAgwRDAAPCyAAQQRqIAEQ+gcPCyABKAIAQcSQmAFBGCABKAIEKAIMEQwADwsgASgCAEHckJgBQRsgASgCBCgCDBEMAA8LIAEoAgBB95CYAUEaIAEoAgQoAgwRDAAPCyABKAIAQZGRmAFBGSABKAIEKAIMEQwADwsgASgCAEGqkZgBQQwgASgCBCgCDBEMAA8LIAEoAgBBtpGYAUETIAEoAgQoAgwRDAAPCyABKAIAQcmRmAFBEyABKAIEKAIMEQwADwsgASgCAEHckZgBQQ4gASgCBCgCDBEMAA8LIAEoAgBB6pGYAUEOIAEoAgQoAgwRDAAPCyABKAIAQfiRmAFBDCABKAIEKAIMEQwADwsgASgCAEGEkpgBQQ4gASgCBCgCDBEMAA8LIAEoAgBBkpKYAUEOIAEoAgQoAgwRDAAPCyABKAIAQaCSmAFBEyABKAIEKAIMEQwADwsgASgCAEGzkpgBQRogASgCBCgCDBEMAA8LIAEoAgBBzZKYAUE+IAEoAgQoAgwRDAAPCyABKAIAQYuTmAFBFCABKAIEKAIMEQwADwsgASgCAEGfk5gBQTQgASgCBCgCDBEMAA8LIAEoAgBB05OYAUEsIAEoAgQoAgwRDAAPCyABKAIAQf+TmAFBJCABKAIEKAIMEQwADwsgASgCAEGjlJgBQQ4gASgCBCgCDBEMAA8LIAEoAgBBsZSYAUETIAEoAgQoAgwRDAAPCyABKAIAQcSUmAFBHCABKAIEKAIMEQwADwsgASgCAEHglJgBQRggASgCBCgCDBEMAAvIBAEEfyMAQSBrIgQkAAJAIAJBAXENACABKALAASEDIAEQ4w4LAkACQAJAIAEtAMgBIgVBD0cNACABKALEASEGIAEoAsABIQIgBEG2gICAeDYCCCACIAYgBEEIahCEFyEGQQEhAiABLQDIAUGiAUcNASABENcSIQMgARDjDiABIAMQ+hIMAQsgASgCvAEhBwJAIAEoAngiBkGAAXENAAJAAkACQCAFQX1qDgQCAQECAAsgBUGjAUYNAQsgAS0AyQFBAUYNACAFQQdLDQFBASAFdEGiAXFFDQELAkAgBkECcUUNACAEQaiAgIB4NgIIIAEgAyAHIARBCGoQ3hwLQQhBwAAQmSIiBkUNAkEAIQIgBkEAOgAcIAZBADYCGCAGIAc2AhQgBiADNgIQIAZC0cLdi5aNHTcDCCAGQRo2AgAMAQsCQCAGQYCAgIACcUUNACACQQFxDQAgAUEBOgD0ASAGQQRxDQAgBEGTgICAeDYCCCABIAMgByAEQQhqEN4cCwJAIAZBgIEgcUGAgCBHDQAgBEHTgICAeDYCCCABIAMgByAEQQhqEN4cCwJAIAZBgICgAXFBgICAAUcNACAEQdGAgIB4NgIIIAEgAyAHIARBCGoQ3hwLIAQgARC0AkEBIQIgBCgCBCEFAkAgBCgCAEEBcUUNACAFIQYMAQsgASgCvAEhAUEIQcAAEJkiIgZFDQEgBiABNgIMIAYgAzYCCCAGIAU2AgQgBkEiNgIAQQAhAgsgACAGNgIEIAAgAjYCACAEQSBqJAAPCwALhwQBBn8jAEEwayICJAACQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgAiA0EBakF+cSADRg0AIAJBGGogABDmG0EBQQIgAUGAAUkbIAIoAhxqIgRBC0sNBCACQRBqIAAQ5hsgAigCFCIFQQxPDQZBASEGIAAgBWpBAWohBCABQYABSQ0BIAVBCU0NA0ECIQYMAgtBAUECIAFBgAFJGyAAKAIIaiEGIAAoAgQiByEFA0AgBSIEQQF0IQUgBCAGSQ0ACyAEEOcbIQUgAyAHEOcbQQIgBRDvAyIERQ0EIAAgBTYCBCAAIAQ2AgAgACABELQODAkLIAVBC0cNBgsgASAGQQsgBWsQ8A4ACyAEIAFBP3FBgAFyOgABIAQgAUEGdkHAAXI6AABBAiEEDAULIAJBCGogABDmGyACKAIMIQUgAigCCCEDIARBFiAEQRZLGxDnGyEEQQAtAOD2nQEaIAQQhAEiBkUNACAFIARLDQICQCAFRQ0AIAYgAyAF/AoAAAsgAkEkakEIaiIDIAU2AgAgAiAENgIoIAIgBjYCJCACQSRqIAEQtA4gAEEIaiADKAIANgIAIAAgAikCJDcCAAwFCwALIAVBC0GQ25gBENEiAAsgBSAEQdiZmAEQvCIACyAEIAE6AABBASEECyAAIAAtAABBAXEgBCAFakEBdHI6AAALIAJBMGokAAuSBAEEf0EEIQICQAJAAkACQAJAIAAoAgAOBQQAAQIDBAsgACgCBEUNA0EIIQILIAAgAmooAgAgARBuDwsCQCAAKAIEIgMtAGxBAkcNACADQcAAaiEAA0AgACgCGCIALQAsQQJGDQALCwJAIANBhAFqKAIAIgJFDQAgA0GAAWooAgAiACACQdgAbGohBANAAkACQCAAKAIAIgJBBUcNACAAKAIEIAEQbgwBCyACQQRGDQACQAJAAkAgAg4EAwABAgMLIAAoAgRBAUcNAiAAKAIIIAEQbgwCCyABIAAoAgQQ+wcMAQsgAEEMaigCACIFRQ0AIABBCGooAgAhAiAFQShsIQUDQCACIAEQuAYgAkEoaiECIAVBWGoiBQ0ACwsgAEHYAGoiACAERw0ACwsCQCADKAJ4IgBFDQAgAEEIaigCACICRQ0AIABBBGooAgAhACACQQJ0IQIDQCAAKAIAIAEQpwEgAEEEaiEAIAJBfGoiAg0ACwsCQCADQZgBaigCACICRQ0AIANBlAFqKAIAIQAgAkEobCECA0AgACABELgGIABBKGohACACQVhqIgINAAsLIAMtADwiAUEGRg0BIAFBAkcNASADQRBqIQEDQCABKAIYIgEtACxBAkYNAAwCCwsgACgCDCICRQ0AIAAoAgghACACQShsIQIDQCABIAAQsQQgAEEoaiEAIAJBWGoiAg0ACwsLkgQBB38CQCABKAIEIgJFDQAgASgCACEDQQAhBAJAA0AgBEEBaiEFAkACQCADIARqLQAAIgbAIgdBf0wNACAFIQQMAQsCQAJAAkACQAJAAkACQAJAAkACQAJAIAZB55WBAWotAABBfmoOAwABAg0LIAMgBWpBodqYASAFIAJJGywAAEFATg0MIARBAmohBAwKCyADIAVqQaHamAEgBSACSRssAAAhCCAGQaB+ag4OAQMDAwMDAwMDAwMDAwIDCyADIAVqQaHamAEgBSACSRssAAAhCCAGQZB+ag4FBAMDAwUDCyAIQWBxQaB/Rw0JDAYLIAhBn39KDQgMBQsCQCAHQR9qQf8BcUEMSQ0AIAdBfnFBbkcNCCAIQUBODQgMBQsgCEFATg0HDAQLIAdBD2pB/wFxQQJLDQYgCEFATg0GDAILIAhB8ABqQf8BcUEwTw0FDAELIAhBj39KDQQLIAMgBEECaiIFakGh2pgBIAUgAkkbLAAAQb9/Sg0DIAMgBEEDaiIFakGh2pgBIAUgAkkbLAAAQb9/Sg0DIARBBGohBAwBCyADIARBAmoiBWpBodqYASAFIAJJGywAAEFATg0CIARBA2ohBAsgBCEFIAQgAkkNAAsLIAAgBDYCBCAAIAM2AgAgASACIAVrNgIEIAEgAyAFajYCACAAIAUgBGs2AgwgACADIARqNgIIDwsgAEEANgIAC5gEAgd/An4jAEEgayICJAACQAJAAkACQAJAIAEtACxBfWoiA0EBIANB/wFxQQNJG0H/AXEOAwABAgALIAEoAhAhAyABKAIMIQQgASgCCCEFAkAgASkDACIJQgODQgBSDQAgCaciBiAGKAIAIgZBAWo2AgAgBkF/TA0ECyAAQQM6ACwgACADNgIQIAAgBDYCDCAAIAU2AgggACAJNwMAIAAgAS0AFDoAFAwCCyABKAIUIQMgASgCECEEIAJBCGogAUEYahCYCSABKAIMIQUgASgCCCEGAkAgASkDACIJQgODQgBSDQAgCaciASABKAIAIgFBAWo2AgAgAUF/TA0DCyAAIAIpAwg3AxggAEEoaiACQRhqKQMANwMAIABBIGogAkEQaikDADcDACAAIAM2AhQgACAENgIQIAAgBTYCDCAAIAY2AgggACAJNwMADAELIAEoAgwhAyABKAIIIQQgASgCJCEFIAEoAiAhBgJAIAEpAwAiCUIDg0IAUg0AIAmnIgcgBygCACIHQQFqNgIAIAdBf0wNAgsgASgCHCEHIAEoAhghCAJAIAEpAxAiCkIDg0IAUg0AIAqnIgEgASgCACIBQQFqNgIAIAFBf0wNAgsgAEEFOgAsIAAgBTYCJCAAIAY2AiAgACAHNgIcIAAgCDYCGCAAIAo3AxAgACADNgIMIAAgBDYCCCAAIAk3AwALIAJBIGokAA8LAAu1BAIHfwF+IAAoAgAiAUEEaigCACECAkAgASgCCCIDRQ0AQQAhBANAAkACQAJAAkACQAJAAkAgAiAEQThsaiIFKAIADgYBAgMEBQYACyAFKAIEIgAQlgEgAEHAAEEIEL0TDAULAkAgBSkDCCIIQgODQgBSDQAgCKciACAAKAIAIgZBf2o2AgAgBkEBRw0AIAAgACgCEBDpHQsgBSgCICIARQ0EIAAoAgAiBhDAAiAGQeAAQQgQvRMgAEEMQQQQvRMMBAsgBUEIaiIHKAIAIQACQCAFKAIMIgZFDQADQAJAIAAoAgBBB0YNACAAEMgHCyAAQShqIQAgBkF/aiIGDQALIAcoAgAhAAsgBSgCBCAAQQhBKBC/EiAFKAIYIgBFDQMgACgCACIGEMACIAZB4ABBCBC9EyAAQQxBBBC9EwwDCyAFKAIEIgAQyAcgAEEoQQgQvRMgBSgCGCIARQ0CIAAoAgAiBhDAAiAGQeAAQQgQvRMgAEEMQQQQvRMMAgsgBUEEahCZECAFKAIEIAVBCGooAgBBCEE4EL8SIAUoAhgiAEUNASAAKAIAIgYQwAIgBkHgAEEIEL0TIABBDEEEEL0TDAELIAUoAgQiABDIByAAQShBCBC9EyAFKAIIIgAQlgEgAEHAAEEIEL0TCwJAIAUoAjAiAEUNACAAEJYBIABBwABBCBC9EwsgBEEBaiIEIANHDQALIAFBBGooAgAhAgsgASgCACACQQhBOBC/EiABQRxBBBC9EwulBAEJfyMAQcAAayICJAACQAJAAkACQAJAIAAoAgAOBAMAAQIDCyAAKAIEQQFHDQICQCAAKAIIIgAoAgBBV2pBBUsNAANAQQAtAOD2nQEaQcAAEIQBIgNFDQUgA0EANgIIIANCMTcDACAAKAIEIQQgACADNgIEIAJBCGoiAyAEQQhqKQMANwMAIAJBEGoiBSAEQRBqKQMANwMAIAJBGGoiBiAEQRhqKQMANwMAIAJBIGoiByAEQSBqKQMANwMAIAJBKGoiCCAEQShqKQMANwMAIAJBMGoiCSAEQTBqKQMANwMAIAJBOGoiCiAEQThqKQMANwMAIAIgBCkDADcDACAAEOQBIABBOGogCikDADcDACAAQTBqIAkpAwA3AwAgAEEoaiAIKQMANwMAIABBIGogBykDADcDACAAQRhqIAYpAwA3AwAgAEEQaiAFKQMANwMAIABBCGogAykDADcDACAAIAIpAwA3AwAgBEHAAEEIEL0TIAAoAgBBV2pBBkkNAAsLIAAgARCuAQwCCyAAKAIEIAEQtwIMAQsgACgCDCIERQ0AIARBKGwhBCAAKAIIQQRqIQADQAJAAkACQAJAAkAgAEF8aigCAA4FBAABAgMECyAAKAIAQQFHDQMgASAAQQRqKAIAEN0IDAMLIAEgACgCABDdCAwCCyAAIAEQ9QYMAQsgACABEMUFCyAAQShqIQAgBEFYaiIEDQALCyACQcAAaiQADwsAC5gEARB/IwBB0ABrIgIkACABKAIEIQMgASgCECEEIAEoAgwhBSACQShqIAEoAggiBkEIQSgQow4gAigCLCEHAkACQCACKAIoQQFGDQAgAigCMCEIAkAgB0UNACAGQShsIQkgAkEoakEEciEKIAJBCGohCyACQRBqIQwgAkEYaiENIAJBIGohDiAIIQ8gByEQA0AgCUUNAUEHIRECQCADKAIAQQdGDQAgAkEoaiADELUCIAsgCkEIaikCADcDACAMIApBEGopAgA3AwAgDSAKQRhqKQIANwMAIA4gCkEgaigCADYCACACIAopAgA3AwAgAigCKCERCyADQShqIQMgDyARNgIAIA9BBGogAikDADcCACAPQQxqIAspAwA3AgAgD0EUaiAMKQMANwIAIA9BHGogDSkDADcCACAPQSRqIA4oAgA2AgAgD0EoaiEPIAlBWGohCSAQQX9qIhANAAsLIAEtABghCQJAAkAgASgCFCIDDQBBACEPDAELQQAtAOD2nQEaQQwQhAEiD0UNAkEALQDg9p0BGiADKAIIIREgAygCBCEQQeAAEIQBIgpFDQIgCiADKAIAEGUgDyARNgIIIA8gEDYCBCAPIAo2AgALIAAgBDYCECAAIAU2AgwgACAJOgAYIAAgBjYCCCAAIAg2AgQgACAHNgIAIAAgDzYCFCACQdAAaiQADwsgByACKAIwQYikmgEQ2CALAAulBAEDfyMAQRBrIgIkACAAKAIAIQACQAJAAkACQAJAAkACQAJAAkAgASgCAA4FCAABAgMICyABKAIEQQFHDQcg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NwMAIANBIGogAkHAAGpBIGopAwA3AwAgA0EYaiACQcAAakEYaikDADcDACADQRBqIAJBwABqQRBqKQMANwMAIAUgAkHAAGpBCGopAwA3AwAgAyACKQNANwMADAELIAMgARBGCyAAQRBqIQAgBEFwaiIEDQALCyACQYABaiQAC90DAQV/IwBBgAFrIgIkAAJAAkACQCABLQAUQQJGDQAgAEEaNgIAIAAgASkDADcDCCAAQRhqIAFBEGopAwA3AwAgAEEQaiABQQhqKQMANwMADAELIAJBCGogASgCACIDQSBqKQMANwMAIAJBEGogA0EoaikDADcDACACQRhqQQhqIgQgA0EIaikDADcDACACIAMpAxg3AwAgAiADKQMANwMYIAMoAhQhBSADKAIQIQYgAkEoaiACEIUHQQAtAOD2nQEaQcAAEIQBIgFFDQEgASACKQMoNwMAIAFBOGogAkEoakE4aikDADcDACABQTBqIAJBKGpBMGopAwA3AwAgAUEoaiACQShqQShqKQMANwMAIAFBIGogAkEoakEgaikDADcDACABQRhqIAJBKGpBGGopAwA3AwAgAUEQaiACQShqQRBqKQMANwMAIAFBCGogAkEoakEIaikDADcDACACQfgAaiAEKQMANwIAIABBADYCCCAAIAE2AiggACAFNgIkIAAgBjYCICAAQRQ2AgAgAiACKQMYNwJwIAAgAikCbDcCDCAAQRRqIAJB7ABqQQhqKQIANwIAIABBHGogAkHsAGpBEGooAgA2AgAgA0EwQQgQvRMLIAJBgAFqJAAPCwAL8QMBB38jAEHQAGsiByQAAkACQAJAIAEoAgAiCEF/akECSQ0AIAcgASgCBDYCBCAHIAg2AgAgByABKAIQIgg2AhAgByABKAIMIgk2AgwgByABKAIIIgo2AgggByABLQAYOgAYIAEoAhQiAUF/aiAJSyELAkADQAJAAkAgBCAJSQ0AIAQgCUcNAQwFCyAKIARqLAAAQb9/Sg0EC0EAIQwCQCABRQ0AIAcgCDYCHCAHIAFBf2oiBDYCICALDQIgCCABSw0CIAcgBDYCFCAHQSRqIAUgBiAHEG8gBygCKCECAkAgBygCJCINQQJHDQAgACACNgIEQQIhDAwBCyAEIQEgBygCLCIDIQQgDUEBcQ0BCwsgACAMNgIADAMLIAdBAjYCKCAHQdCh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mAFqKAIAIQAgBEGUAWooAgAhASACIAM2AgwCQCAARQ0AIABBKGwhAANAIAJBDGogARCiByABQShqIQEgAEFYaiIADQALCyAELQA8IgFBBkYNASABQQJHDQEgBEEQaiEBA0AgASgCGCIBLQAsQQJGDQAMAgsLIAEoAgwiAEUNACABKAIIIQEgAEEobCEAA0AgASADELoEIAFBKGohASAAQVhqIgANAAsLIAJBEGokAAvVAwIJfwF+IwBBwABrIgIkACACIAE2AgwgACgCDCEDIAIgAkEMajYCEAJAIANBf0YNAAJAAkACQCADIAAoAgQiASABQQFqQQN2QQdsIAFBCEkbIgFBAXZJDQAgAkEwakEQIAEgAyABIANLG0EBahDeDCACKAI0IQQgAigCMCIFRQ0CIAIoAjghBiACIAIoAjw2AiwgAiAGNgIoIAIgBDYCJCACIAU2AiAgAkKQgICAgAE3AhggAiAAQRBqNgIUIAAoAgAiBykDAEJ/hUKAgYKEiJCgwIB/gyELIAJBIGohCEEAIQECQANAIANFDQECQANAIAtCAFINASABQQhqIQEgB0EIaiIHKQMAQn+FQoCBgoSIkKDAgH+DIQsMAAsLIAIgBSAEIAEgACALeqdBA3YgAWoiCRCMIBC4FyAFIAIoAgBBf3NBBHRqIgogACgCACAJQX9zQQR0aiIJKQAANwAAIApBCGogCUEIaikAADcAACADQX9qIQMgC0J/fCALgyELDAALCyACIAAoAgwiATYCLCACIAYgAWs2AiggACAIEMQjIAJBFGoQgRcMAQsgACACQRBqQfYGQRAQswULQYGAgIB4IQQLIAJBwABqJAAgBA8LEIccAAvNAwICfwF+IwBBIGsiAyQAIANBEGogAiABKAIYIgRBABCiAgJAAkAgAy0AEEEERg0AIAMpAxAiBUL/AYNCBFENACAAIAU3AgAMAQsCQAJAAkAgBEUNACADQRBqIAIgBBDiHCADLQAQQQRGDQAgAykDECIFQv8Bg0IEUg0BCyADQRBqIAEoAiAgASgCJCACELsSIAMtABBBBEYNASADKQMQIgVC/wGDQgRRDQEgACAFNwIADAILIAAgBTcCAAwBCwJAAkACQAJAIAEoAgBBAUcNACADQRBqIAFBBGogAhClCSADLQAQQQRGDQMgAykDECIFQv8Bg0IEUg0BDAMLAkAgASgCECIERQ0AIANBEGogAiAEQX9qQQAQogIgAy0AEEEERg0AIAMpAxAiBUL/AYNCBFINAgsgA0EANgIQIANBCGogAiADQRBqQd/LmwFBARCFDQJAIAMtAAhBBEYNACADKQMIIgVC/wGDQgRRDQAgACAFNwIADAQLIANBEGogAUEIaiACEKIVIAMtABBBBEYNAiADKQMQIgVC/wGDQgRRDQIgACAFNwIADAMLIAAgBTcCAAwCCyAAIAU3AgAMAQsgAEEEOgAACyADQSBqJAAL4AMBB38jAEEQayICJAAgAUHAAGogABCACwJAIAEoAoQBIgNFDQAgASgCgAEiBCADQdgAbGohBSAAQSxqIQYDQAJAAkAgBCgCACIDQQVHDQAgAC0AKCEHIABBADoAKCAALQB5IQggAEEAOgB5AkAgBCgCBCIDKAIAQRpHDQAgAiADKQMIIANBGGooAgAQ5xogBiACKQMAIAIoAggQkAsLIAMgABB4IAAgBzoAKCAAIAg6AHkMAQsgA0EERg0AAkACQAJAIAMOBAMAAQIDCyAEKAIEQQFHDQIgAC0AKCEHIABBADoAKCAALQB5IQggAEEAOgB5AkAgBCgCCCIDKAIAQRpHDQAgAiADKQMIIANBGGooAgAQ5xogBiACKQMAIAIoAggQkAsLIAMgABB4IAAgBzoAKCAAIAg6AHkMAgsgACAEKAIEEKUHDAELIAQoAgwiB0UNACAEKAIIIQMgB0EobCEHA0AgAyAAENcHIANBKGohAyAHQVhqIgcNAAsLIARB2ABqIgQgBUcNAAsLAkAgASgCmAEiA0UNACABKAKUASEEIANBKGwhAwNAIAQgABDXByAEQShqIQQgA0FYaiIDDQALCwJAIAEtADxBBkYNACABQRBqIAAQgAsLIAJBEGokAAvYAwEFfyMAQRBrIgIkACAAKAIAIQMCQAJAAkACQAJAIAEoAgAOBQQAAQIDBAsgASgCBEEBRw0DIAMgASgCCBDFAQwDCyADIAEoAgQQxQEMAgsCQCABKAIEIgQtAGxBAkcNACAEQcAAaiEBA0AgASgCGCIBLQAsQQJGDQALCwJAIARBhAFqKAIAIgBFDQAgBEGAAWooAgAiASAAQdgAbGohBQNAAkACQCABKAIAIgBBBUcNACADIAEoAgQQxQEMAQsgAEEERg0AAkACQAJAIAAOBAMAAQIDCyABKAIEQQFHDQIgAyABKAIIEMUBDAILIAEoAgQgAxC8AgwBCyABQQxqKAIAIQYgAUEIaigCACEAIAIgAzYCDCAGRQ0AIAZBKGwhBgNAIAJBDGogABCmByAAQShqIQAgBkFYaiIGDQALCyABQdgAaiIBIAVHDQALCyAEQZgBaigCACEAIARBlAFqKAIAIQEgAiADNgIIAkAgAEUNACAAQShsIQADQCACQQhqIAEQpgcgAUEoaiEBIABBWGoiAA0ACwsgBC0APCIBQQZGDQEgAUECRw0BIARBEGohAQNAIAEoAhgiAS0ALEECRg0ADAILCyABQQRqIAMQ4wULIAJBEGokAAvKAwEGfyMAQSBrIgUkAAJAIAJFDQAgASACQQJ0akF8aiIGRQ0AIAYoAgANACACQQJ0IQYgAUF8aiEHIAJB/////wNxIQgDQCAIIQkCQCAGDQBBACECDAILIAlBf2ohCCAHIAZqIQogBkF8aiEGIAooAgBFDQALAkAgCSACSw0AIAkhAgwBCyAJIAJBkOqCARC8IgALAkAgBEUNACADIARBAnRqQXxqIgZFDQAgBigCAA0AIARBAnQhBiADQXxqIQcgBEH/////A3EhCANAIAghCQJAIAYNAEEAIQQMAgsgCUF/aiEIIAcgBmohCiAGQXxqIQYgCigCAEUNAAsCQCAJIARLDQAgCSEEDAELIAkgBEGg6oIBELwiAAsCQAJAAkACQCABIAIgAyAEEJkbQf8BcQ4CAQIACyAFQRRqIAMgBBCVFCAFKAIYIAUoAhwgASACEKwIIABBBGogBUEUahCyFyAAQQA6AAAMAgsgAEEBOgAAIABBACkC/JSbATcCBCAAQQxqQQAoAoSVmwE2AgAMAQsgBUEIaiABIAIQlRQgBSgCDCAFKAIQIAMgBBCsCCAAQQRqIAVBCGoQshcgAEECOgAACyAFQSBqJAAL0AMBA38jAEHAAGsiBiQAAkACQAJAIAIgA0kNACABKAIYIgdBAWoiAkUNASAGIAEoAhwiAzYCECAGIAI2AgwgASgCFCEIIAcgA0EBak8NAiADIAhLDQIgASACNgIYAkACQCAFKAIAQQFHDQAgBSgCCCEHDAELIAUoAgQhBwsCQAJAIAQoAhAoAlgiBS0AHEEBcQ0AAkAgAyAITw0AIAUtACBBAnENAQsgAUEIaiEBAkAgBSgCAEEBRw0AQQAgAyACayICIAIgA0sbIgMgBSgCBEkNASABKAIAQX9qQQFLDQAgBS0AIEECcUUNACAFKAIIQQFHDQAgAyAFKAIMSw0BCyAGQRRqIAQoAgggBCgCDCIDKAIIQX9qQXhxakEIaiAHIAEgAygCJBEOAAwBCyAGQQA2AhQLIAAgBikCFDcCACAAQQhqIAZBFGpBCGopAgA3AgAgBkHAAGokAA8LQdzPhAFBHkH8z4QBEIwaAAtBjNCEARDJIgALIAZBAjYCGCAGQdChmwE2AhQgBkICNwIgIAZBDjYCOCAGQcABNgIwIAYgCDYCPCAGIAZBLGo2AhwgBiAGQTxqNgI0IAYgBkEMajYCLCAGQRRqQeChmwEQqB0AC+0DAQR/IwBB0ANrIgMkACADIAEQgQoiBDYCDAJAAkAgBEHbAEcNACADQaQBaiABEL4DIAMoAqQBIQQCQEHAAEUNACADQeQAaiADQagBakHAAPwKAAALAkACQCAEQYmAxABHDQACQEHAAEUNACAAIANB5ABqQcAA/AoAAAsgAhCWGgwBCwJAQdQARQ0AIANBEGogA0HoAWpB1AD8CgAACwJAQcAARQ0AIANB7AJqIANB5ABqQcAA/AoAAAsCQEEwRQ0AIANBvAJqIANBEGpBMPwKAAALAkBBJEUNACADQawDaiADQRBqQTBqQST8CgAACyABKAIAIgEoAiANAiABQX82AiACQCABKAIsIgUgASgCJEcNACABQSRqQayChQEQpBgLIAEoAiggBUGYAWxqIgYgBDYCAAJAQcAARQ0AIAZBBGogA0HsAmpBwAD8CgAACwJAQTBFDQAgBkHEAGogA0G8AmpBMPwKAAALAkBBJEUiBA0AIAZB9ABqIAJBJPwKAAALIAEgBUEBajYCLCABIAEoAiBBAWo2AiACQCAEDQAgAEEEaiADQawDakEk/AoAAAsgAEEiNgIACyADQdADaiQADwsgA0EANgKkASADQQxqQZiChQEgA0GkAWpBvIKFARDiGwALQZyChQEQ9xYAC70DAQZ/IwBBIGsiAiQAAkACQAJAAkACQAJAIAEoAggiA0UNACABKAIEIgEgA0EwbCIDaiEEA0AgASgCAEERRw0CIAFBCGooAgBBf2pBAUsNAyABIAAQ2AIgAUEwaiEBIANBUGoiAw0ACwtBBCEDQQAhBQwDCyABQTBqIQMMAQsgAUEwaiEDCyACQRRqQQRBBEEEEKMOQQEhBSACKAIYIQYgAigCFEEBRg0BIAIoAhwiByABNgIAIAJBATYCECACIAc2AgwgAiAGNgIIAkAgAyAERg0AQQEhBQNAIAMhAQJAA0AgASgCAEERRw0BIAFBCGooAgBBf2pBAUsNASABIAAQ2AIgAUEwaiIDIQEgAyAERw0ADAMLCyABQTBqIQMCQCAFIAIoAghHDQAgAkEIaiAFQQFBBEEEEM0ZIAIoAgwhBwsgByAFQQJ0aiABNgIAIAIgBUEBaiIFNgIQIAMgBEcNAAsLIAVBAnQhBCACKAIMIQMgAigCCCEFQQAhAQNAIAMgAWooAgAgABDYAiAEIAFBBGoiAUcNAAsLIAUgA0EEQQQQvxIgAkEgaiQADwsgBiACKAIcQYCdmwEQ2CAAC5YEAQJ/IwBBIGsiAiQAAkACQAJAAkACQAJAIAAtAAAOBAABAgMACyACIAAoAgQ2AgQgASgCAEGbpZgBQQIgASgCBCgCDBEMACEAIAJBADoADSACIAA6AAwgAiABNgIIIAJBCGpBnaWYAUEEIAJBBGpB8AAQ4gkhASACQSk6ABMgAUHwg5oBQQQgAkETakHxABDiCSEAQQAtAOD2nQEaQRQQhAEiAUUNBCABQRBqQQAoAOCtmAE2AAAgAUEIakEAKQDYrZgBNwAAIAFBACkA0K2YATcAACACQRQ2AhwgAiABNgIYIAJBFDYCFCAAQYD7mQFBByACQRRqQfIAEOIJEMQSIQEgAigCFCIARQ0DIAIoAhggAEEBEL0TDAMLIAIgAC0AAToACCACIAEoAgBBoaWYAUEEIAEoAgQoAgwRDAA6ABwgAiABNgIYIAJBADoAHSACQQA2AhQgAkEUaiACQQhqQfEAEMMLEPIPIQEMAgsgACgCBCEAIAEoAgBB0NqbAUEFIAEoAgQoAgwRDAAhAyACQQA6ABkgAiADOgAYIAIgATYCFCACQRRqQfCDmgFBBCAAQQhqQfEAEOIJQYD7mQFBByAAQfMAEOIJEMQSIQEMAQsgAiAAKAIEIgA2AhQgAUGlpZgBQQZB8IOaAUEEIABBCGpB8QBB6NybAUEFIAJBFGpB9AAQqA0hAQsgAkEgaiQAIAEPCwALwAMBBn8gAEEMaiECAkAgACgCCCIDRQ0AIAAoAgQhBCADQQxsIQUDQCABIAQoAgAiAxDTAyADIAEQUQJAIAEoAgBFDQAgAygCAEEaRw0AIAEgA0EIaiIGEMMFIgdFDQAgAxDkASADQThqIAdBOGopAwA3AwAgA0EwaiAHQTBqKQMANwMAIANBKGogB0EoaikDADcDACADQSBqIAdBIGopAwA3AwAgA0EYaiAHQRhqKQMANwMAIANBEGogB0EQaikDADcDACAGIAdBCGopAwA3AwAgAyAHKQMANwMAIAdBwABBCBC9EwsgBEEMaiEEIAVBdGoiBQ0ACwsgASACEEQCQCAAKAIwIgNFDQAgASADENMDIAMgARBRIAEoAgBFDQAgAygCAEEaRw0AIAEgA0EIaiIEEMMFIgFFDQAgAxDkASADQThqIAFBOGopAwA3AwAgA0EwaiABQTBqKQMANwMAIANBKGogAUEoaikDADcDACADQSBqIAFBIGopAwA3AwAgA0EYaiABQRhqKQMANwMAIANBEGogAUEQaikDADcDACAEIAFBCGopAwA3AwAgAyABKQMANwMAIAFBwABBCBC9EwsLpgQBBn8jAEGwAmsiAiQAIAEtAAQhAyACQRxqQYACQaTBgAEQlBdBACEEIAJBGmpBADsBACACQQA2AiggAkESaiACQSRqKQIANwEAIAIgAikCHDcBCiACLQAvIQUgAS0ABiEGAkBBgAJFDQAgAkEwakEAQYAC/AsACyADQQJ0QayInQFqKAIAIQcDQCACQTBqIARqIAQ6AAAgBEEBaiIEQYACRw0ACyAAQgA3AoQGIABBjAZqQgA3AgACQEHGAkUNACAAQQBBxgL8CwALIABBADoAjQMgAEGBhIgQNgCJAyAAQYKABCADQQN0djoAiAMgAEEAOgCEAyAAQQA2AoADIABCgICAgHA3A/gCIABCgICAgMAANwPwAiAAQgQ3A+gCIAAgBzYC5AIgAEIANwLcAiAAQYCAgIB4NgLQAiAAQQE6AMcCIAAgBjoAxgIgACACKQEINwGOAyAAQZYDaiACQRBqKQEANwEAIABBngNqIAJBGGooAQA2AQAgAEIANwLsAyAAQoCAgIDAADcC5AMgAEIENwLcAyAAQgA3AtQDIABCgICAgMAANwLMAyAAQgE3AsQDIABCADcCvAMgAEKAgICAwAA3ArQDIAAgATYCsAMgAEEBOgClAyAAIAY6AKQDIAAgBToAowMgACAGOgCiAwJAQYACRQ0AIABB/ANqIAJBMGpBgAL8CgAACyAAIAM6AJQGIABC/////w83AvwFIAJBsAJqJAALzQMBEH8jAEEQayICJAACQAJAAkACQAJAIAEoArwDIgNFDQAgAUG0A2ohBCABQfwDaiEFIAFBzANqIQZBACEHIAMhCANAAkAgB0ECSQ0AIAcgCE8NAyABKAK4AyAHQRRsIglqKAIQIAEoArADKAIATw0AIAEtAPsFIgpBAWohCyABKALUAyIMIQgCQCABKALMAyAMayAKSw0AIAYgDCALQQRBBBDOGSABKALUAyEICyAIIApqQQFqIQ0gASgC0AMiDiAIQQJ0aiEIA0AgCEEBNgIAIAhBBGohCCALQX9qIgsNAAsgASANNgLUAyABKALEAyEPIAEoAsgDIRBBACELAkADQCACQQhqIAQgByALIAgQ+hAgAigCCCILQQFxRQ0BIAIoAgwiCCAQTw0GIAwgBSAPIAhBCWxqIhEtAABqLQAAaiIKIA1PDQcgDiAKQQJ0aiARKAABNgIADAALCyAHIAEoArwDIghPDQYgASgCuAMgCWogDDYCBAsgB0EBaiIHIANHDQALCyAAQQM2AgAgAkEQaiQADwsgByAIQZS1gAEQwxIACyAIIBBBpLWAARDDEgALIAogDUG0tYABEMMSAAsgByAIQcS1gAEQwxIAC7sDAQ5/IwBBEGsiAiQAAkACQAJAIAEtACUNACABQRRqIQMgASABLQAYIgRqQRNqIQUgASgCDCEGIAEoAgghByABKAIQIQggASgCBCEJIARBBUkhCgJAAkACQANAIAggBkkNAiAIIAdLDQIgCSAGaiELIAUtAAAhDAJAAkAgCCAGayINQQdLDQBBACEOIAxB/wFxIQ9BACEMA0ACQCANIAxHDQAgDSEMDAMLAkAgCyAMai0AACAPRw0AQQEhDgwDCyAMQQFqIQwMAAsLIAJBCGogDCALIA0Q1AkgAigCDCEMIAIoAgghDgsgDkEBcUUNASABIAwgBmpBAWoiBjYCDCAGIARJDQAgBiAEayEMIAYgB0sNACAKRQ0GIAkgDGogBCADIAQQwh5FDQALIAEoAhwhDSABIAY2AhwgDCANayEMDAILIAEgCDYCDAsgAUEBOgAlAkACQCABLQAkQQFHDQAgASgCICEMIAEoAhwhDQwBCyABKAIgIgwgASgCHCINRg0CCyAMIA1rIQwLIAAgCSANaiAMEPkUDAELIABBgICAgHg2AgALIAJBEGokAA8LIARBBEGc5JsBELwiAAvSAwEIfyMAQTBrIgMkAAJAAkACQAJAAkAgASgCACIELQAUIgVBAkYNACAFQQFxDQAgA0EIaiACLQAYQQJ0QeC/nQFqKAIALQAAEM0cIAMoAgwiBiADKAIIIgVrIgdBAEgNAQJAAkAgBiAFRw0AQQAhCCADQQA2AiwgA0KAgICAEDcCJAwBC0EAIQhBAC0A4PadARogBxCEASIGRQ0DIANBADYCLCADIAY2AiggAyAHQQF2Igk2AiQDQCAGQQFqIAUtAAAiByAFQQFqLQAAIgogByAKSxs6AAAgBiAHIAogByAKSRs6AAAgBkECaiEGIAVBAmohBSAJIAhBAWoiCEcNAAsLIAMgCDYCLCADQRRqIANBJGoQqRUgAi0AGQ0DDAQLQb3BhQFBKUHowYUBEIwaAAtBgJ2bARCBHAsACyADQRRqELEFCwJAAkACQCAELQAXRQ0AIAMoAhwiBUUNACADKAIYIAVBAXRqIgVBfmpFDQAgBUF/aiwAAEEASA0BCyAAIAMpAhQ3AgQgAEGAgICAeDYCACAAQQxqIANBHGopAgA3AgAMAQsgACABKAIEIAEoAgggAkEBEJMQIAMoAhQgAygCGEEBQQIQ0BILIANBMGokAAvNAwEEf0EEIQICQAJAAkACQAJAIAAoAgAOBQQAAQIDBAsgACgCBEUNA0EIIQILIAAgAmooAgAgARCoAQ8LAkAgACgCBCIDLQBsQQJHDQAgA0HAAGohAANAIAAoAhgiAC0ALEECRg0ACwsCQCADQYQBaigCACICRQ0AIANBgAFqKAIAIgAgAkHYAGxqIQQDQAJAAkAgACgCACICQQVHDQAgACgCBCABEKgBDAELIAJBBEYNAAJAAkACQCACDgQDAAECAwsgACgCBEEBRw0CIAAoAgggARCoAQwCCyABIAAoAgQQuwkMAQsgAEEMaigCACIFRQ0AIABBCGooAgAhAiAFQShsIQUDQCACIAEQsQcgAkEoaiECIAVBWGoiBQ0ACwsgAEHYAGoiACAERw0ACwsCQCADQZgBaigCACICRQ0AIANBlAFqKAIAIQAgAkEobCECA0AgACABELEHIABBKGohACACQVhqIgINAAsLIAMtADwiAUEGRg0BIAFBAkcNASADQRBqIQEDQCABKAIYIgEtACxBAkYNAAwCCwsgACgCDCICRQ0AIAAoAgghACACQShsIQIDQCABIAAQtwUgAEEoaiEAIAJBWGoiAg0ACwsL7AMBAn8jAEEwayICJAACQAJAAkAgARC/EQ0AIAEQsQ1FDQELIAJBCGogARC/DCAAIAIoAgggAigCDBDqGiACIAEQvwwgACACKAIAIAIoAgQQ1w4MAQsCQAJAAkACQAJAAkACQAJAIAEoAgAOCAABAgMEBQYHAAsgAUEgaiAAENoBDAcLIAFBIGogABDnDAwGCyABQQRqIAAQgyQMBQsgAUEEaiAAEIQkDAQLIAFBBGogABChCQwDCyAAIAEoAgQiASgCACIDIAFBBGooAgAiARDqGiAAIAMgARDXDgwCC0EAKAL89Z0BIgBFDQEgAkEUaiAAIAEoAgQiAUEYaigCACABQRxqKAIAQaTtmwFBMxD1ECACQSRqQbvqmwFBERCcFSACQQA2AiAgAigCGCIBEL4fIAFBCGogAkEgakEIaikCADcCACABIAIpAiA3AgAgAkEUahDGAiACQRRqELINDAELQQAoAvz1nQEiAEUNACACQRRqIAAgASgCBCIBQcgAaigCACABQcwAaigCAEHX7ZsBQcQAEPUQIAJBJGpBu+qbAUEREJwVIAJBADYCICACKAIYIgEQvh8gAUEIaiACQSBqQQhqKQIANwIAIAEgAikCIDcCACACQRRqEMYCIAJBFGoQsg0LIAJBMGokAAvGAwEFfyMAQdAAayICJABBfyAAQQNsIgBBf2pndkEBakEBIABBAUsbIgNBBnQhAEEAIQQCQAJAIANB////H0sNACAAQcD///8HSw0AQcAAIQVBACEEIABFDQEgAkEIaiAAEJobIAMhBCACKAIIIgUNAUHAACEECyAEIABB6NeDARDYIAALIAJBADYCHCACIAU2AhggAiAENgIUQRAhBkEAIQACQANAIAMgAEYNAQJAIAAgAigCFEcNACACQRRqEJMLIAIoAhghBQsgBSAGaiIEQXxqIABBAWoiADYCACAEQXhqQQA2AgAgBEFwakIANwMAAkBBMEUNACAEIAJBIGpBMPwKAAALIAIgADYCHCAGQcAAaiEGDAALCwJAAkACQCACKAIUIgAgA00NACAAQQZ0IQAgAigCGCEEAkACQCADDQBBwAAhBiAEQcAAIAAQ0SAMAQsgBCAAQcAAIANBBnQiBRDvAyIGRQ0CCyACIAY2AhgLIAIoAhghBCACQQRBEBDrHSACKAIAIgBFDQEgACABNgIMIAAgAzYCBCAAIAQ2AgAgAEEfIANnazYCCCACQdAAaiQAIAAPC0HAACAFQfjXgwEQ2CALAAvTAwEGfyMAQSBrIgQkAAJAAkACQAJAAkAgAS0ArA1BAUYNAAJAAkACQCABKQMAQgKFIAEpAwiEUA0AIAIoAsgEQQJGDQQgAkHYAWohBQJAAkACQCABKAKABSIGLQDiAg0AIARBEGogASAFIAMQSyAEKAIQIgZBAkcNAQwICyAGLQDjAiEHIARBEGogASAFIAMQSyAEKAIQIgZBAkYNByAEKAIYIQggBCgCFCEJIAZBAXEiBkUNBCAHQQFxRQ0EIARBBGogAyAJIAggCCABIAUQ0wYgBCgCBCIGQQJHDQEgBCgCCCEFDAgLIAZBAXENAkEAIQYMAwsgBCgCDCEIIAQoAgghCQwCCyAEQRBqIAEgAiADENoEAkACQCAEKAIQDQBBACEBDAELIAAgBCkCGEIgiTcCBEEBIQELIAAgATYCAAwGCyAEKAIYIQggBCgCFCEJCyAAIAg2AgggACAJNgIEIAAgBjYCAAwEC0GSqZsBQShB3KGEARCMGgALQeyghAEQySIACyAEKAIUIQULIAUQtxEaIARBEGogASACIAMQ2gQCQAJAIAQoAhANAEEAIQEMAQsgACAEKQIYQiCJNwIEQQEhAQsgACABNgIACyAEQSBqJAALzwMBBn8jAEEgayICJAAgASAAKAIIQX5qIgNBBiADQQlJGyIDEP0eAkACQAJAAkACQAJAIAMOCQAEBQUFBQMCAQULQQAhAyACQRhqQQAgAEEQaigCACAAQRRqKAIAQbS0mAEQlB0gAigCHCEEIAIoAhghBUEAIQZBACEHA0ACQCAEIAMiAEcNAAJAIAcgBE8NACACQQhqIAcgBSAEQcS0mAEQlB0gASACKAIIIAIoAgwiABD0CiAAIAZqQR53IQYLIAEgBhDIIwwGCyAAQQFqIQMgBSAAai0AAEEvRw0AAkAgACAHTQ0AIAEgBSAHaiAAIAdrIgAQ9AogACAGakEedyEGCyACQRBqIAMgBSAEQdS0mAEQlB0gAigCECEAAkACQAJAAkACQCACKAIUDgICAAELIAAtAABBLkcNAQwCCyAALQAAQS5HDQAgAC0AAUEvRg0BC0EAIQAMAQtBASEACyAAIANqIQcMAAsLIABBEGooAgAgAEEUaigCACABEM4hDAMLIABBEGooAgAgAEEUaigCACABEM4hDAILIABBHGooAgAgAEEgaigCACABEM4hDAELIABBEGooAgAgAEEUaigCACABEM4hCyACQSBqJAALvAMBB38jAEEQayIDJAACQAJAIAIoAgQiBEUNACAAIAIoAgAgBCABKAIMEQwARQ0AQQEhAgwBCwJAIAIoAgwiBEUNACACKAIIIgUgBEEMbGohBiADQQhqQQRqIQcDQAJAAkACQAJAIAUvAQAOAwACAQALAkACQCAFKAIEIgJBwQBJDQAgAUEMaigCACEEA0ACQCAAQciRgQFBwAAgBBEMAEUNAEEBIQIMCQsgAkFAaiICQcAASw0ADAILCyACRQ0DIAFBDGooAgAhBAsgAEHIkYEBIAIgBBEMAEUNAkEBIQIMBQsgACAFKAIEIAUoAgggAUEMaigCABEMAEUNAUEBIQIMBAsgBS8BAiECIAdBADoAACADQQA2AggCQAJAIAJB6AdJDQBBBEEFIAJBkM4ASRshCAwBC0EBIQggAkEKSQ0AQQJBAyACQeQASRshCAsgCCEEA0AgBEF/aiIEIANBCGpqIAIgAkH//wNxQQpuIglBCmxrQTByOgAAIAkhAiAEDQALIAAgA0EIaiAIIAFBDGooAgARDABFDQBBASECDAMLIAVBDGoiBSAGRw0ACwtBACECCyADQRBqJAAgAgvRAwEIfyMAQRBrIgIkAAJAAkACQCABKAIADgMAAQIACyABKAIMIgNFDQEgASgCCCEBIANBKGwhAwNAAkAgASgCAEEHRg0AIAEgABCFBQsgAUEoaiEBIANBWGoiAw0ADAILCyABKAIMIgNFDQAgASgCCCEEIANBOGwhBSAAQSxqIQZBACEDA0ACQAJAAkACQCAEIANqIgEoAgAOAwABAgALAkAgAUEIaigCAEEDRw0AIAAtACghByAAQQA6ACggAC0AeSEIIABBADoAeQJAIAFBDGooAgAiCSgCAEEaRw0AIAIgCSkDCCAJQRhqKAIAEOcaIAYgAikDACACKAIIEJALCyAJ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EGpBACkDmP+cASIFNwMAIAJBGGpBACkDkP+cASIGNwMAIAJBIGogBTcDACACIAA2AiggAiADNgIsIAJBAToAQSACIAApAiw3AjQgAiAAKAE6NgFCIAIgAC0AOCIEOgBAIAIgBjcDCAJAAkAgASgCACIAKAIADQAgAEEEaiEBAkAgA0UNACAAKAIYDQAgAEEAIAMQjQY2AhgLIAJBADsAjQEgAkHwAGpBACkDmP+cASIFNwMAIAJBgAFqIAU3AwAgAiAEOgCMASACQQApA5D/nAEiBTcDaCACIAU3A3ggAiACQQhqNgKIASACQegAaiABEKoHIAJB6ABqENYXIAJB+ABqENYXIAAoAgwiA0UNASAAKAIIIQAgA0EwbCEDA0AgACACQQhqEMcBIABBMGohACADQVBqIgMNAAwCCwsgACACQQhqEMcBCwJAIAIoAgwiAEUNACACKAIIIAIoAhQQ2gwgACAAQQR0QRdqQXBxIgNqQQlqIgBFDQAgAigCCCADayAAQQgQvRMLIAJBGGoQ1hcgAkGQAWokAAuxAwEEfyABIAAoAgwiAhDTAyACIAEQUQJAIAEoAgBFDQAgAigCAEEaRw0AIAEgAkEIaiIDEMMFIgRFDQAgAhDkASACQThqIARBOGopAwA3AwAgAkEwaiAEQTBqKQMANwMAIAJBKGogBEEoaikDADcDACACQSBqIARBIGopAwA3AwAgAkEYaiAEQRhqKQMANwMAIAJBEGogBEEQaikDADcDACADIARBCGopAwA3AwAgAiAEKQMANwMAIARBwABBCBC9EwsCQCAAKAIIIgJFDQAgAkEEdCEDIAAoAgRBDGohAANAIAEgACgCACICENMDIAIgARBRAkAgASgCAEUNACACKAIAQRpHDQAgASACQQhqIgUQwwUiBEUNACACEOQBIAJBOGogBEE4aikDADcDACACQTBqIARBMGopAwA3AwAgAkEoaiAEQShqKQMANwMAIAJBIGogBEEgaikDADcDACACQRhqIARBGGopAwA3AwAgAkEQaiAEQRBqKQMANwMAIAUgBEEIaikDADcDACACIAQpAwA3AwAgBEHAAEEIEL0TCyAAQRBqIQAgA0FwaiIDDQALCwumAwELfyMAQRBrIgIkAAJAAkACQCABKAIEIgMgAUF0aigCACABKAIIIgQgAUF4aigCACIFIAQgBUkbEJIXIgYgBCAFayAGGyIFDQBBACEHIAEtAAwgAUF8ai0AAEkNAQwCCyAFQX9KDQEgAS0ADCEHCyABKAIAIQggASABQXBqIgYpAgA3AgAgAUEPai0AACEFIAEvAA0hCSABQQhqIAZBCGopAgA3AgAgAkEOaiIKIAU6AAAgAiAJOwEMAkAgBiAARg0AIAFBYGohASAHQf8BcSELAkADQAJAAkAgAyABQQRqKAIAIAQgAUEIaiIMKAIAIgUgBCAFSRsQkhciCSAEIAVrIAkbIgUNACALIAFBDGotAABJDQEMBAsgBUF/Sg0CCyAGQXBqIQYgAUEQaiIFIAEpAgA3AgAgBUEIaiAMKQIANwIAIAEgAEchBSABQXBqIgkhASAFDQALIAlBEGohBgwBCyABQRBqIQYLIAYgBzoADCAGIAQ2AgggBiADNgIEIAYgCDYCACAGIAIvAQw7AA0gBkEPaiAKLQAAOgAACyACQRBqJAALpQMBDn8jAEEQayICJABBACEDAkACQCABLQAlRQ0ADAELIAEoAgQhBAJAIAEoAhAiBSABKAIIIgZLDQAgBSABKAIMIgdJDQAgAUEUaiIIIAEtABgiCWpBf2otAAAiCkH/AXEhCyAJQQVJIQwCQANAIAQgB2ohDQJAAkAgBSAHayIOQQdLDQAgBSAHRg0DQQAhDwNAIA0gD2otAAAgC0YNAiAOIA9BAWoiD0cNAAwECwsgAkEIaiAKIA0gDhDUCSACKAIIQQFxRQ0CIAIoAgwhDwsgASAHIA9qQQFqIgc2AgwCQCAHIAlJDQAgByAGSw0AAkAgDEUNACAEIAcgCWsiD2ogCCAJEJIXDQEgASgCHCENIAEgBzYCHCAEIA1qIQMgDyANayEPDAULIAlBBEGc5JsBELwiAAsgBSAHTw0ADAILCyABIAU2AgwLIAFBAToAJQJAAkAgAS0AJEEBRw0AIAEoAiAhDiABKAIcIQ0MAQsgASgCICIOIAEoAhwiDUYNAQsgBCANaiEDIA4gDWshDwsgACAPNgIEIAAgAzYCACACQRBqJAALsgMBA38jAEGAAWsiAiQAAkACQCAAKAIgIgMoAgBBGkcNACACIAEoAgAgASgCBCADQQhqIgQQgg0gAigCAEEyRg0BIAMQ0QEgA0E4aiACQThqKQMANwMAIANBMGogAkEwaikDADcDACADQShqIAJBKGopAwA3AwAgA0EgaiACQSBqKQMANwMAIANBGGogAkEYaikDADcDACADQRBqIAJBEGopAwA3AwAgBCACQQhqKQMANwMAIAMgAikDADcDAAwBCyADIAEQRgsCQCAAKAIAQQJJDQACQCAAKAIEIgMoAgBBGkcNACACQcAAaiABKAIAIAEoAgQgA0EIaiIAEIINIAIoAkBBMkYNASADENEBIANBOGogAkHAAGpBOGopAwA3AwAgA0EwaiACQcAAakEwaikDADcDACADQShqIAJBwABqQShqKQMANwMAIANBIGogAkHAAGpBIGopAwA3AwAgA0EYaiACQcAAakEYaikDADcDACADQRBqIAJBwABqQRBqKQMANwMAIAAgAkHAAGpBCGopAwA3AwAgAyACKQNANwMADAELIAMgARBGCyACQYABaiQAC7UDAQV/IwBBEGsiAiQAAkAgAS0AbEECRw0AIAFBwABqIQMDQCADKAIYIgMtACxBAkYNAAsLAkAgASgChAEiBEUNACABKAKAASIDIARB2ABsaiEFA0ACQAJAIAMoAgAiBEEFRw0AIAMoAgQgABClAQwBCyAEQQRGDQACQAJAAkAgBA4EAwABAgMLIAMoAgRBAUcNAiADKAIIIAAQpQEMAgsgAygCBCAAENMCDAELIANBDGooAgAhBiADQQhqKAIAIQQgAiAANgIMIAZFDQAgBkEobCEGA0AgAkEMaiAEELAGIARBKGohBCAGQVhqIgYNAAsLIANB2ABqIgMgBUcNAAsLAkAgASgCeCIDRQ0AIANBCGooAgAiBEUNACADQQRqKAIAIQMgBEECdCEEA0AgAygCACAAEOwBIANBBGohAyAEQXxqIgQNAAsLAkAgASgCmAEiBEUNACABKAKUASEDIARBKGwhBANAIAAgAxDJBSADQShqIQMgBEFYaiIEDQALCwJAIAEtADwiA0EGRg0AIANBAkcNACABQRBqIQMDQCADKAIYIgMtACxBAkYNAAsLIAJBEGokAAvOAwEDfwJAIAAoAggiAkUNACAAKAIEIgMgAkE4bGohBANAAkACQAJAAkACQAJAAkACQAJAIAMoAgAOBwgAAQIDBQQICyADQQxqKAIAIgJFDQcgA0EIaigCACEAIAJBKGwhAgNAAkAgACgCAEEHRg0AIAAgARD6BgsgAEEoaiEAIAJBWGoiAg0ADAgLCyADKAIEIAEQ+gYMBgsgA0EMaigCACICRQ0FIANBCGooAgAhACACQThsIQIDQCAAIAEQ/QggAEE4aiEAIAJBSGoiAg0ADAYLCyADKAIEIAEQ+gYgAS0ABEEBRw0EAkACQCADKAIIIgAoAgBBZmoOAwMAAQULIAAoAghBBUYNAgwECyAAKAIMRQ0DDAELIAEtAARBAUcNAwJAAkAgAygCBCIAKAIAQWZqDgMCAAEDCyAAKAIIQQVGDQEMAgsgACgCDEUNAQsgAUEAOgAEDAILIAAgARDnAQwBCyAAIAEQ5wELAkAgAygCMCIARQ0AIAEtAARBAUcNAAJAAkACQAJAIAAoAgBBZmoOAwIAAQMLIAAoAghBBUYNAQwCCyAAKAIMRQ0BCyABQQA6AAQMAQsgACABEOcBCyADQThqIgMgBEcNAAsLC84DAQN/AkAgACgCCCICRQ0AIAAoAgQiAyACQThsaiEEA0ACQAJAAkACQAJAAkACQAJAAkAgAygCAA4HCAABAgMFBAgLIANBDGooAgAiAkUNByADQQhqKAIAIQAgAkEobCECA0ACQCAAKAIAQQdGDQAgACABEPoGCyAAQShqIQAgAkFYaiICDQAMCAsLIAMoAgQgARD6BgwGCyADQQxqKAIAIgJFDQUgA0EIaigCACEAIAJBOGwhAgNAIAAgARD9CCAAQThqIQAgAkFIaiICDQAMBgsLIAMoAgQgARD6BiABLQAEQQFHDQQCQAJAIAMoAggiACgCAEFmag4DAwABBQsgACgCCEEFRg0CDAQLIAAoAgxFDQMMAQsgAS0ABEEBRw0DAkACQCADKAIEIgAoAgBBZmoOAwIAAQMLIAAoAghBBUYNAQwCCyAAKAIMRQ0BCyABQQA6AAQMAgsgACABEOcBDAELIAAgARDnAQsCQCADKAIwIgBFDQAgAS0ABEEBRw0AAkACQAJAAkAgACgCAEFmag4DAgABAwsgACgCCEEFRg0BDAILIAAoAgxFDQELIAFBADoABAwBCyAAIAEQ5wELIANBOGoiAyAERw0ACwsLvQMCBX8BfgJAAkAgAEKAgICAEFoNACABIQIgACEHDAELIAFBeGoiAiAAQoDC1y+AIgdCgL6o0A9+IAB8pyIDQZDOAG4iBEGQzgBwIgVB//8DcUHkAG4iBkEBdEGgzJgBai8AADsAACABQXxqIAMgBEGQzgBsayIDQf//A3FB5ABuIgRBAXRBoMyYAWovAAA7AAAgAUF6aiAFIAZB5ABsa0H//wNxQQF0QaDMmAFqLwAAOwAAIAFBfmogAyAEQeQAbGtB//8DcUEBdEGgzJgBai8AADsAAAsgAkF8aiECIAenIQECQAJAA0ACQCABQY/OAEsNACACQQRqIQIgAUHjAEsNAiABIQMMAwsgAiABQZDOAG4iA0HwsX9sIAFqIgFB5ABuIgRBAXRBoMyYAWovAAA7AAAgAkECaiABIARB5ABsa0EBdEGgzJgBai8AADsAACACQXxqIQIgAyEBDAALCyACQX5qIgIgASABQf//A3FB5ABuIgNB5ABsa0H//wNxQQF0QaDMmAFqLwAAOwAACwJAIANBCUsNACACQX9qIANBMHI6AAAPCyACQX5qIANBAXRBoMyYAWovAAA7AAAL1gMCA38BfgJAAkACQAJAAkACQAJAIAAoAgAOBgECAwQGBQALIAAoAgQiARCWASABQcAAQQgQvRMPCwJAIAApAwgiBEIDg0IAUg0AIASnIgEgASgCACICQX9qNgIAIAJBAUcNACABIAEoAhAQ6R0LIAAoAiAiAUUNAyABKAIAIgIQwAIgAkHgAEEIEL0TIAFBDEEEEL0TDwsgACgCCCEDAkAgACgCDCICRQ0AIAMhAQNAAkAgASgCAEEHRg0AIAEQyAcLIAFBKGohASACQX9qIgINAAsLIAAoAgQgA0EIQSgQvxIgACgCGCIBRQ0CIAEoAgAiAhDAAiACQeAAQQgQvRMgAUEMQQQQvRMPCyAAKAIEIgEQyAcgAUEoQQgQvRMgACgCGCIBRQ0BIAEoAgAiAhDAAiACQeAAQQgQvRMgAUEMQQQQvRMPCyAAKAIIIQMCQCAAKAIMIgJFDQAgAyEBA0AgARDNECABQThqIQEgAkF/aiICDQALCyAAKAIEIANBCEE4EL8SIAAoAhgiAUUNACABKAIAIgIQwAIgAkHgAEEIEL0TIAFBDEEEEL0TCw8LIAAoAgQiARDIByABQShBCBC9EyAAKAIIIgEQlgEgAUHAAEEIEL0TC6kDAQZ/QQAhAQJAIAAoAlwiAkUNAAJAAkAgACgCWCIDLAAAIgRBf0wNACAEQf8BcSEEDAELIAMtAAFBP3EhBSAEQR9xIQYCQCAEQV9LDQAgBkEGdCAFciEEDAELIAVBBnQgAy0AAkE/cXIhBQJAIARBcE8NACAFIAZBDHRyIQQMAQsgBUEGdCADLQADQT9xciAGQRJ0QYCA8ABxciEECwJAAkACQAJAAkAgBEGuwABKDQACQCAEQZ8BSg0AIARBdWpBAkkNAyAEQYUBRg0DDAILIARBoAFGDQIgBEGALUYNAgwBCwJAIARB/98ASg0AIARBr8AARg0CIARB38AARw0BDAILIARBgOAARg0BIARB//0DRg0BCyAEQYBAakEMSQ0BIARB/v//AHFBqMAARw0DIABBAToAHCAAIAJBfWo2AlwgACADQQNqNgJYIAAgACgCaEEDajYCaEEBDwsCQCAEQYABTw0AQQEhBAwCCyAEQYAQTw0AQQIhBAwBC0EDIQQLIAAgAiAEazYCXCAAIAMgBGo2AlggACAAKAJoIARqNgJoQQEhAQsgAQu5AwIGfwR+AkACQCAAKAIMRQ0AIAEpAwAiCCABKAIIIgIQnRohCSAAKAIAIgNBcGohBCAJQhmIQoGChIiQoMCAAX4hCiAAKAIEIgUgCadxIQZBACEHAkADQAJAIAMgBmopAAAiCyAKhSIJQn+FIAlC//379+/fv/9+fINCgIGChIiQoMCAf4MiCVANAANAIAEgBCAJeqdBA3YgBmogBXFBBHRrEKkgDQMgCUJ/fCAJgyIJUEUNAAsLIAsgC0IBhoNCgIGChIiQoMCAf4NQRQ0CIAYgB0EIaiIHaiAFcSEGDAALC0EBIQYgACgCHEUNASAIIAIQnRohCSAAKAIQIgNBcGohBCAJQhmIQoGChIiQoMCAAX4hCiAAKAIUIgUgCadxIQBBACECA0ACQCADIABqKQAAIgsgCoUiCUJ/hSAJQv/9+/fv37//fnyDQoCBgoSIkKDAgH+DIglQDQADQCABIAQgCXqnQQN2IABqIAVxQQR0axCpIA0DIAlCf3wgCYMiCVBFDQALCyALIAtCAYaDQoCBgoSIkKDAgH+DUEUNAiAAIAJBCGoiAmogBXEhAAwACwtBACEGCyAGC9sDAgZ/An4jAEHQAGsiBCQAAkACQCABLQAQDQAgAEEDOgAUDAELIAIoAgwhBSACKAIIIQYCQAJAIAIpAwAiCkIDg0IAUiIHDQAgCqciCCAIKAIAIghBAWo2AgAgCEF/TA0BCyACLQAUIQkgBEEIakEAKQOY/5wBNwMAIARBACkDkP+cATcDACAEQRBqIAogAigCEBDnGiAEKAIYIQggBCkDECELAkAgBw0AIAqnIgcgBygCACIHQQFqNgIAIAdBf0wNAQsgBCALIAggChCtCRDWISAEQQA2AhggBEKAgICAgAE3AhAgBCABKQIMNwIcIAQgBDYCJCADIARBEGoQ7QcgBEEQahD1HyAEENEMIAEoAhQgAhDYDhogAyABEO0HAkBBwABFDQAgBEEQaiADQcAA/AoAAAsgA0IANwIgIANCgICAgMAANwIYIANCCDcCECADQgA3AgggA0KAgICAwAA3AgAgA0EoakIANwIAIANBMGpCADcCACADQTVqQgA3AABBBEHAABCZIiIDRQ0AAkBBwABFDQAgAyAEQRBqQcAA/AoAAAsgACADNgIYIAAgCToAFCAAQQA2AhAgACAFNgIMIAAgBjYCCCAAIAo3AwAMAQsACyAEQdAAaiQAC9MDAQF/IwBBEGsiAyQAAkACQAJAAkACQCACQXpqDgMCAAEDCyABLQAAQcMARw0CIAEtAAFB7ABHDQIgAS0AAkHhAEcNAiABLQADQfMARw0CIAEtAARB/wFxQfMARw0CIAEtAAVB6QBHDQIgAS0ABkHjAEcNAiAAQQA7AQAMAwsCQAJAIAEtAABBsn9qDgMBAwADCyABLQABQfIARw0CIAEtAAJB5QBHDQIgAS0AA0HzAEcNAiABLQAEQeUARw0CIAEtAAVB8gBHDQIgAS0ABkH2AEcNAiABLQAHQeUARw0CIABBgAI7AQAMAwsgAS0AAUHvAEcNASABLQACQeQARw0BIAEtAANB5QBHDQEgAS0ABEHOAEcNASABLQAFQeUARw0BIAEtAAZB+ABHDQEgAS0AB0H0AEcNASAAQYAEOwEADAILIAEtAABBxQBHDQAgAS0AAUHzAEcNACABLQACQc4ARw0AIAEtAANB5QBHDQAgAS0ABEH4AEcNACABLQAFQfQARw0AIABBgAY7AQAMAQsgA0EEaiABIAIQ7gUgAygCCCIBIAMoAgxB+IeAAUEEEIYRIQIgAEEBOgAAIAAgAjYCBCADKAIEIAEQxSALIANBEGokAAuJBAEFfyMAQcABayIBJAAgAUGhAWpBggY7AAAgAUEDOgCUASABQoCAgICAgMCAATcAtQEgAUEKOgC0ASABQQA6AL0BIAFCgICAgKAfNwKsASABQoCAgIDAADcCpAEgAUEAOgCYASABQQI2AoABIAFBAjYCeCABQQI2AnAgAUKBgICAgICA0AA3AmggAUKBgICAgICAEDcCYCABQoKEiJCgwICBAjcAmQEgAUGkAWpBAEEBQQRBDBDOGSABKAKoASABKAKsASICQQxsaiEDQQAhBAJAAkACQANAIARBAXENASABQQZBAUEBEKQOIAEoAgQhBSABKAIAQQFGDQIgASgCCCIEQQRqQQAvALPYmAE7AAAgBEEAKACv2JgBNgAAIANBCGpBBjYCACADQQRqIAQ2AgAgAyAFNgIAIANBDGohA0EBIQQgAkEBaiECDAALCyABIAI2AqwBAkBB4ABFDQAgASABQeAAakHgAPwKAAALIAFB4ABqIAEQRyABKAJIIgMgASgCTBCCHCABKAJEIAMQ1CIgARCVGiABKAJgRQ0BIAAgASkCYDcCACAAQQhqIAFB4ABqQQhqKQIANwIAIAFBwAFqJAAPCyAFIAEoAghBuOSbARDYIAALIAFBCGogAUHsAGooAgA2AgAgASABKQJkNwMAQbSqmwFBKyABQdjQmAFB2NiYARDqEAALsAMBCn8jAEHwAGsiAyQAIAMgAkEEQQwQow4gAygCBCEEAkAgAygCAEEBRg0AIAMoAgghBQJAAkAgBEUNACACQQxsIQYgBSEHIAQhCANAIAZFDQECQAJAIAEoAgAiCQ0AQQAtAOD2nQEaQfAAEIQBIgpFDQQgAyABQQRqKAIAEPkBAkBB8ABFDQAgCiADQfAA/AoAAAtBACELDAELQQAtAOD2nQEaIAFBCGooAgAhDCABQQRqKAIAIQpBwAAQhAEiC0UNAyADIAkQRSALQThqIANBOGopAwA3AwAgC0EwaiADQTBqKQMANwMAIAtBKGogA0EoaikDADcDACALQSBqIANBIGopAwA3AwAgC0EYaiADQRhqKQMANwMAIAtBEGogA0EQaikDADcDACALQQhqIANBCGopAwA3AwAgCyADKQMANwMACyABQQxqIQEgByALNgIAIAdBCGogDDYCACAHQQRqIAo2AgAgB0EMaiEHIAZBdGohBiAIQX9qIggNAAsLIAAgAjYCCCAAIAU2AgQgACAENgIAIANB8ABqJAAPCwALIAQgAygCCEGIpJoBENggAAuUAwEFfwJAAkACQAJA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CyAAIAEQeCABIAM6ACggASAEOgB5DAMLIAEtACghAyABQQA6ACggAS0AeSEEIAFBADoAeQJAIAAoAgQiACgCAEEaRw0AIAIgACkDCCAAQRhqKAIAEOcaIAFBLGogAikDACACKAIIEJALCyAAIAEQeCABIAM6ACggASAEOgB5DAILIAAoAgQiBEHAAGogARCACyAEQYABaigCACAEQYQBaigCACABEMIIAkAgBEGYAWooAgAiA0UNACAEQZQBaigCACEAIANBKGwhAwNAIAAgARDXByAAQShqIQAgA0FYaiIDDQALCyAELQA8QQZGDQEgBEEQaiABEIALDAELIAAoAgwiA0UNACAAKAIIIQAgA0EobCEDA0AgASAAELQDIABBKGohACADQVhqIgMNAAsLIAJBEGokAAuiAwIKfwF+IwBB4ABrIgIkAAJAIAEoAgwiAyABKAIEIgRrQQR2IgUgACgCACAAKAIIIgZrTQ0AIAAgBiAFQQhB2AAQzRkgACgCCCEGCwJAIAQgA0YNACAAKAIEIAZB2ABsaiEFIAJBCGpBKGohByACQTxqIQggAkHFAGoiCUEEaiEKA0AgASAEQRBqIgs2AgQgBCkDACEMIAhCADcCACAIQQhqQQA6AAAgCUEANgAAIApBADsAACACQgA3AxggAkIBNwMQIAJBADYCMCACQgA3AyggAkEANgIIIAJBAzoASyACQgQ3AjQgAkHQAGpBCGoiBCAHQQhqKAIANgIAIAIgBykDADcDUCACQQhqEOwNIAVBKGpCADcCACAFQRhqQgA3AgAgBUEQaiAMNwIAIAVBCGpBADYCACAFQQc2AgAgBUEwaiACKQNQNwIAIAVBOGogBCgCADYCACAFQTxqQgA3AgAgBUHDAGpCADcAACAFQcsAakEDOgAAIAVB2ABqIQUgBkEBaiEGIAshBCALIANHDQALCyAAIAY2AgggAkHgAGokAAvAAwEDfwJAAkACQAJAAkACQCAAKAIADgcFAAECAwUEBQsgACgCDCICRQ0EIAAoAgghACACQShsIQIDQAJAIAAoAgBBB0YNACAAIAEQ8AkLIABBKGohACACQVhqIgINAAwFCwsgACgCBCABEPAJDwsgACgCDCICRQ0CIAAoAggiACACQThsaiEDA0ACQAJAAkACQCAAKAIADgMAAQIACyAAQQhqIAEQgAwM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AkAgA0GEAWooAgAiBEUNACADQYABaigCACEBIARB2ABsIQQDQAJAAkACQCABKAIAQXxqDgICAAELIAAtAAANASABQQRqKAIAIAAQmAEMAQsgASAAEOwICyABQdgAaiEBIARBqH9qIgQNAAsLAkAgA0GYAWooAgAiBEUNACADQZQBaigCACEBIARBKGwhBANAIAEgABDUBiABQShqIQEgBEFYaiIEDQALCyADLQA8IgFBBkYNASABQQJHDQEgA0EQaiEBA0AgASgCGCIBLQAsQQJGDQAMAgsLIAEoAgwhBCABKAIIIQEgAiAANgIMIARFDQAgBEEobCEAA0AgAkEMaiABEOgHIAFBKGohASAAQVhqIgANAAsLIAJBEGokAAuxAwEFfwJAAkACQAJAAkACQAJAIAAoAgAOBwABAgMFBAYACyAAKAIgIgJFDQMgAigCACABEOwBDwsCQCAAKAIMIgNFDQAgACgCCCECIANBKGwhAwNAAkAgAigCAEEHRg0AIAIgARDpBwsgAkEoaiECIANBWGoiAw0ACwsgACgCGCICRQ0CIAIoAgAgARDsAQ8LIAAoAgQgARDpByAAKAIYIgJFDQEgAigCACABEOwBDwsCQCAAKAIMIgJFDQAgACgCCCEEIAJBOGwhBUEAIQMDQAJAAkACQAJAIAQgA2oiAigCAA4DAAECAAsCQCACQQhqKAIAQQNHDQAgAkEMaigCACABEKUBCyACQShqKAIAIAEQ6QcMAgsCQCACQShqKAIAIgZFDQAgBigCACABEOwBCyACQTBqKAIAIgJFDQEgAiABEKUBDAELIAJBBGooAgAgARDpByACQRhqKAIAIgJFDQAgAigCACABEOwBCyAFIANBOGoiA0cNAAsLIAAoAhgiAkUNACACKAIAIAEQ7AELDwsgACgCBCABEOkHIAAoAgggARClAQ8LIAAoAgQgARClAQvsAgEIfyACIAFBDGxBdGoiA2ohBCAAIANqIQUgACABQQF2IgZBDGxqIgNBdGohBwJAA0ACQCAGDQAgB0EMaiEHAkAgAUEBcUUNACACIAAgAyAAIAdJIgQbIgYpAgA3AgAgAkEIaiAGQQhqKAIANgIAIAMgACAHT0EMbGohAyAAIARBDGxqIQALAkAgACAHRw0AIAMgBUEMakYNAwsQ+xsACyACIAMgACADKAIEIAAoAgRJ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wABqJAALhAMCBn8CfiMAQSBrIgMkAEEUIQQgACEJAkAgAELoB1QNAEEUIQQgACEKA0AgA0EMaiAEaiIFQX1qIAogCkKQzgCAIglCkM4Afn2nIgZB//8DcUHkAG4iB0EBdCIIQaHMmAFqLQAAOgAAIAVBfGogCEGgzJgBai0AADoAACAFQX9qIAYgB0HkAGxrQf//A3FBAXQiBkGhzJgBai0AADoAACAFQX5qIAZBoMyYAWotAAA6AAAgBEF8aiEEIApC/6ziBFYhBSAJIQogBQ0ACwsCQCAJQglYDQAgA0EMaiAEakF/aiAJpyIFIAVB//8DcUHkAG4iBUHkAGxrQf//A3FBAXQiBkGhzJgBai0AADoAACADQQxqIARBfmoiBGogBkGgzJgBai0AADoAACAFrSEJCwJAAkAgAFANACAJUA0BCyADQQxqIARBf2oiBGogCadBAXRBHnFBocyYAWotAAA6AAALIAIgAUEBQQAgA0EMaiAEakEUIARrEO8FIQUgA0EgaiQAIAULqAMBBH8jAEEwayIDJAACQAJAIAItAAwiBEEBRw0AIAAgASkCADcCACAAQQhqIAFBCGopAgA3AgAMAQsCQAJAAkACQAJAAkACQAJAAkAgAS0ADCIFDgMBAAIBCyADIAIQmx8gACADKQIANwIAIANBAiADLQAMazoADCAAQQhqIANBCGopAgA3AgAgASgCBCEEDAcLIARFDQEMAgsgBEUNAQsgASgCBCIEIAEoAgggAigCBCIGIAIoAggiAhCZG0H/AXEOAgIDAQsgA0EIaiABQQhqKAIANgIAIAMgASkCADcDACADQRRqIAMgAigCBCACKAIIEJYMIAAgBSADQRRqEM0UDAQLIANBCGogAUEIaigCADYCACADIAEpAgA3AwAgA0EUaiAGIAIgAxDmByAAQQIgBWsgA0EUahDNFAwDCyAAQQhqQQApAsjfggE3AgAgAEEAKQLA34IBNwIADAELIANBIGpBCGogAUEIaigCADYCACADIAEpAgA3AyAgA0EgaiAGIAIQoCAgACAFIANBIGoQzRQMAQsgASgCACAEEN8iCyADQTBqJAALsgMBAn8jAEHgAGsiAyQAAkACQAJAAkACQCABKAIALQAUIgRBAkYNACAEQQFxRQ0BCwJAAkACQAJAIAItABgOAwABAgALIANBOGpBpOeI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DQACQAJAIAQNAEEEIQRBACEFDAELQQAtAOD2nQEaIAQQhAEiBEUNAiACIQULIANBADYCDCADIAQ2AgggAyAFNgIEIAJBAkkNAyABKAIIIgatQhh+IgxCIIinQQBHIAynIgVB/P///wdLciEHIAJBf2ohCCABKAIEIQkDQCAHDQMCQAJAIAUNAEEEIQpBACELDAELQQAtAOD2nQEaIAUQhAEiCkUNAyAGIQsLAkAgBUUNACAKIAkgBfwKAAALIARBCGogBjYCACAEQQRqIAo2AgAgBCALNgIAIARBDGohBCAIQX9qIggNAAwFCwtBuKCFARCBHAsAC0G45JsBEIEcAAsgAkUNAUEBIQILIAQgASkCADcCACAEQQhqIAFBCGooAgA2AgAMAQsgASgCACABKAIEQQRBGBDQEkEAIQILIAAgAykCBDcCACAAQQhqIAI2AgAgA0EQaiQAC5gDAQV/AkAgACgCCCICRQ0AIAAoAgQiAyACQThsaiEEA0ACQAJAAkACQAJAAkAgAygCAA4HBQABAgMFBAULIANBDGooAgAiAkUNBCADQQhqKAIAIQAgAkEobCECA0ACQCAAKAIAQQdGDQAgACABELcJCyAAQShqIQAgAkFYaiICDQAMBQsLIAMoAgQgARC3CQwDCyADQQxqKAIAIgBFDQIgA0EIaigCACEFIABBOGwhBkEAIQADQAJAAkACQAJAIAUgAGoiAigCAA4DAAECAAsCQCACQQhqKAIAQQNHDQAgAS0AAA0AIAJBDGooAgAgARCYAQsgAkEoaigCACABELcJDAILIAJBMGooAgAiAkUNASABLQAADQEgAiABEJgBDAELIAJBBGooAgAgARC3CQsgBiAAQThqIgBHDQAMAwsLIAMoAgQgARC3CSABLQAADQEgAygCCCABEJgBDAELIAEtAAANACADKAIEIAEQmAELAkAgAygCMCIARQ0AIAEtAAANACAAIAEQmAELIANBOGoiAyAERw0ACwsLmAMBBX8CQCAAKAIIIgJFDQAgACgCBCIDIAJBOGxqIQQDQAJAAkACQAJAAkACQCADKAIADgcFAAECAwUEBQsgA0EMaigCACICRQ0EIANBCGooAgAhACACQShsIQIDQAJAIAAoAgBBB0YNACAAIAEQtwkLIABBKGohACACQVhqIgINAAwFCwsgAygCBCABELcJ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CwsgASACOgAlIAEgAzoAJCABIAc6ACYL9wIBA38CQAJAAkACQAJAAkACQCAAKAIADgcFAAECAwUEBQsgACgCDCICRQ0EIAAoAgghAyACQShsIQIDQAJAIAMoAgBBB0YNACADIAEQhgQgASgCAEUNACABIAMQwwgLIANBKGohAyACQVhqIgINAAwFCwsgACgCBCIDIAEQhgQgASgCAEUNBCABIAMQwwgMAwsgAEEEaiABEJ8GDAILIAEgAEEEahCqCwwBCyABIAAoAgQiAxDTAyADIAEQUSABKAIARQ0BIAMoAgBBGkcNACABIANBCGoiBBDDBSICRQ0AIAMQ5AEgA0E4aiACQThqKQMANwMAIANBMGogAkEwaikDADcDACADQShqIAJBKGopAwA3AwAgA0EgaiACQSBqKQMANwMAIANBGGogAkEYaikDADcDACADQRBqIAJBEGopAwA3AwAgBCACQQhqKQMANwMAIAMgAikDADcDACACQcAAQQgQvRMLIAEoAgBFDQAgASAAEMMICwvcAgIMfwV+IwBBMGshA0EBIQQCQCAAKAIIIgUgAUYNACAAKAIEIgQgAUEwbGohBiAEIAVBMGxqIQUgAigCBCEBIAIoAgwhByADQShqIQggA0EgaiEJIANBGGohCiADQRBqIQsgA0EIaiEMA0BBACEEIAEgB0YNASACIAFBMGoiDTYCBCABKAIAIg5BE0YNASABQSxqKAIAIQQgAUEkaikCACEPIAFBHGopAgAhECABQRRqKQIAIREgAUEMaikCACESIAFBBGopAgAhEyAFIA42AgAgBUEEaiATNwIAIAVBDGogEjcCACAFQRRqIBE3AgAgBUEcaiAQNwIAIAVBJGogDzcCACAFQSxqIAQ2AgAgCCAENgIAIAkgDzcDACAKIBA3AwAgCyARNwMAIAwgEjcDAEEBIQQgACAAKAIIQQFqNgIIIAMgEzcDACANIQEgBUEwaiIFIAZHDQALCyAEC9wCAQ9/IwBBEGsiAiQAIAFBFGohAyABIAEtABgiBGpBE2ohBSABKAIMIQYgASgCBCEHIAEoAgghCCABKAIQIQkgBEEFSSEKAkACQAJAA0BBACELIAkgBkkNAyAJIAhLDQMgByAGaiEMIAUtAAAhDQJAAkAgCSAGayIOQQdLDQBBACEPIA1B/wFxIRBBACENA0ACQCAO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WGoiAg0ADAULCyADKAIEIAEQ7QkMAwsgA0EMaigCACIARQ0CIANBCGooAgAhBSAAQThsIQZBACEAA0ACQAJAAkACQCAFIABqIgIoAgAOAwABAgALAkAgAkEIaigCAEEDRw0AIAJBDGooAgAgARCoAQsgAkEoaigCACABEO0JDAILIAJBMGooAgAiAkUNASACIAEQqAEMAQsgAkEEaigCACABEO0JCyAGIABBOGoiAEcNAAwDCwsgAygCBCABEO0JIAMoAgggARCoAQwBCyADKAIEIAEQqAELAkAgAygCMCIARQ0AIAAgARCoAQsgA0E4aiIDIARHDQALCwv1AgEFfwJAIAAoAggiAkUNACAAKAIEIgMgAkE4bGohBANAAkACQAJAAkACQAJAIAMoAgAOBwUAAQIDBQQFCyADQQxqKAIAIgJFDQQgA0EIaigCACEAIAJBKGwhAgNAAkAgACgCAEEHRg0AIAAgARDtCQsgAEEoaiEAIAJBWGoiAg0ADAULCyADKAIEIAEQ7QkMAwsgA0EMaigCACIARQ0CIANBCGooAgAhBSAAQThsIQZBACEAA0ACQAJAAkACQCAFIABqIgIoAgAOAwABAgALAkAgAkEIaigCAEEDRw0AIAJBDGooAgAgARCoAQsgAkEoaigCACABEO0JDAILIAJBMGooAgAiAkUNASACIAEQqAEMAQsgAkEEaigCACABEO0JCyAGIABBOGoiAEcNAAwDCwsgAygCBCABEO0JIAMoAgggARCoAQwBCyADKAIEIAEQqAELAkAgAygCMCIARQ0AIAAgARCoAQsgA0E4aiIDIARHDQALCwv1AgEFfwJAIAAoAggiAkUNACAAKAIEIgMgAkE4bGohBANAAkACQAJAAkACQAJAIAMoAgAOBwUAAQIDBQQFCyADQQxqKAIAIgJFDQQgA0EIaigCACEAIAJBKGwhAgNAAkAgACgCAEEHRg0AIAAgARDvCQsgAEEoaiEAIAJBWGoiAg0ADAULCyADKAIEIAEQ7wkMAwsgA0EMaigCACIARQ0CIANBCGooAgAhBSAAQThsIQZBACEAA0ACQAJAAkACQCAFIABqIgIoAgAOAwABAgALAkAgAkEIaigCAEEDRw0AIAJBDGooAgAgARCNAQsgAkEoaigCACABEO8JDAILIAJBMGooAgAiAkUNASACIAEQjQEM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EKAhDwsgAEEIahC7DQvgAgIBfwF+IwBBIGsiAyQAIANBEGogAiABKAIIQQAQogICQAJAIAMtABBBBEYNACADKQMQIgRC/wGDQgRRDQAgACAENwIADAELIANBEGogASACEIojAkAgAy0AEEEERg0AIAMpAxAiBEL/AYNCBFENACAAIAQ3AgAMAQsgA0EQaiACEN0PAkAgAy0AEEEERg0AIAMpAxAiBEL/AYNCBFENACAAIAQ3AgAMAQsgA0EANgIQIANBCGogAiADQRBqQdyxmwFBAhCGDQJAIAMtAAhBBEYNACADKQMIIgRC/wGDQgRRDQAgACAENwIADAELIANBEGogAhDdDwJAIAMtABBBBEYNACADKQMQIgRC/wGDQgRRDQAgACAENwIADAELIANBEGogAUEEaiACEE8CQCADLQAQQQRGDQAgAykDECIEQv8Bg0IEUQ0AIAAgBDcCAAwBCyAAQQQ6AAALIANBIGokAAvgAgIBfwF+IwBBIGsiAyQAIANBEGogAiABKAIIQQAQogICQAJAIAMtABBBBEYNACADKQMQIgRC/wGDQgRRDQAgACAENwIADAELIANBEGogASACEIojAkAgAy0AEEEERg0AIAMpAxAiBEL/AYNCBFENACAAIAQ3AgAMAQsgA0EQaiACEN0PAkAgAy0AEEEERg0AIAMpAxAiBEL/AYNCBFENACAAIAQ3AgAMAQsgA0EANgIQIANBCGogAiADQRBqQZzMmwFBCRCGDQJAIAMtAAhBBEYNACADKQMIIgRC/wGDQgRRDQAgACAENwIADAELIANBEGogAhDdDwJAIAMtABBBBEYNACADKQMQIgRC/wGDQgRRDQAgACAENwIADAELIANBEGogAUEEaiACEE8CQCADLQAQQQRGDQAgAykDECIEQv8Bg0IEUQ0AIAAgBDcCAAwBCyAAQQQ6AAALIANBIGokAAv3AgEBfwJAAkAgAkUNACABLQAAQTBNDQEgBUECOwEAAkACQAJAAkACQAJAIAPBIgZBAUgNACAFIAE2AgQgAiADQf//A3EiA0sNASAFQQA7AQwgBSACNgIIIAUgAyACazYCECAEDQJBAiEBDAULIAUgAjYCICAFIAE2AhwgBUECOwEYIAVBADsBDCAFQQI2AgggBUHM15gBNgIEIAVBACAGayIDNgIQQQMhASAEIAJNDQQg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AGohAiABQah/aiIBDQALCwJAIAAoApgBIgFFDQAgACgClAEhAiABQShsIQEDQCACENEGIAJBKGohAiABQVhqIgENAAsLAkAgAC0APCIBQQZGDQACQAJAIAFBfWoiAkEBIAJBA0kbQf8BcQ4DAAECAAsgAEEANgIgDwsgAEEQaiECAkAgAUECRw0AA0AgAigCGCICLQAsQQJGDQALCyACQQA2AigLC9QCAQR/IwBBMGsiASQAIABBPGoQ6SEgACgCACAAKAIEQQRBHBC/EiAAQQxqEMsUIABBzABqEOkhIABBGGoQyxQCQCAAKAIwQYCAgIB4Rg0AIABBMGoQyxQLIAAoAighAgJAIAAoAiwiA0UNAANAAkAgAigCACIERQ0AIAJBDGogAkEEaigCACACQQhqKAIAIAQoAhARCwAgAkEYaigCACACQRxqKAIAEMwiCyACQSRqIQIgA0F/aiIDDQALIAAoAighAgsgACgCJCACQQRBJBC/EgJAAkAgACgCXCICDQBBACECQQAhAwwBCyABIAI2AhggAUEANgIUIAEgAjYCCCABQQA2AgQgASAAKAJgIgI2AhwgASACNgIMIAAoAmQhA0EBIQILIAEgAzYCICABIAI2AhAgASACNgIAA0AgAUEkaiABEJkHIAEoAiQNAAsgAUEwaiQAC9UCAQV/IwBB0ABrIgMkACABIAEoAngiBCACQX9zcTYCeEEAIQUgA0EAOgADIAMgASgCwAE2AgRBBCECQQAhBgJAAkAgAS0AyAEiB0EYRw0AIANBCGogAUEBEIADIAMoAgwhAgJAIAMoAggiBkGAgICAeEcNACAAQRM2AgAgACACNgIEDAILIAMoAhAhBSABLQDIASEHCwJAAkAgB0H/AXEiB0HfAEYNACAHQdgARw0BCyADIAU2AhQgAyACNgIQIAMgBjYCDCADIAE2AgggACABIANBDGoQnggMAQsgAyAFNgJEIAMgAjYCQCADIAY2AjwgAyADQQNqNgJMIAMgA0EEajYCSCADQQhqIAEgA0E8ahDhHAJAIAMoAghBE0cNACAAIAMoAgw2AgQgAEETNgIADAELQTBFDQAgACADQQhqQTD8CgAACyABIAQ2AnggA0HQAGokAAuDAwEBfyMAQZABayICJAAgAkHg6YMBNgKIASACQdTshAE2AoABIAJB1OyEATYCeCAC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IABBBHYhACAEDQALIAFBAUGA0ZsBQQIgAiADakF/akGBASADaxDvBSEACyACQYABaiQAIAALsgICAn8BfiMAQcAAayICJAACQAJAAkACQAJAAkAgASgCAA4EAAECAwALAkAgASkDCCIEQgODQgBSDQAgBKciASABKAIAIgFBAWo2AgAgAUF/TA0FCyAAQQA2AgAgACAENwMIDAMLIAAgASkDADcDACAAQQhqIAFBCGopAwA3AwAMAgsgASgCBCEDEOIfIQEgAiADEEUgAUE4aiACQThqKQMANwMAIAFBMGogAkEwaikDADcDACABQShqIAJBKGopAwA3AwAgAUEgaiACQSBqKQMANwMAIAFBGGogAkEYaikDADcDACABQRBqIAJBEGopAwA3AwAgAUEIaiACQQhqKQMANwMAIAEgAikDADcDACAAQQI2AgAgACABNgIEDAELIABBAzYCAAsgAkHAAGokAA8LAAu9AgEDfyMAQRBrIgIkAAJAAkACQAJAAkACQAJAIAAoAgAOBwABAgMEBgUACyACIAApAwggACgCGBDnGiABQRBqIAIpAwAgAigCCBCRBhoMBQsCQCAAKAIMIgNFDQAgACgCCCEEIANBKGwhAwNAAkAgBCgCAEEHRg0AIAQgARD4CQsgBEEoaiEEIANBWGoiAw0ACwsgACgCGCIERQ0EIAQoAgAgARCnAQwECyAAKAIEIAEQ+AkgACgCGCIERQ0DIAQoAgAgARCnAQwDCwJAIAAoAgwiA0UNACAAKAIIIQQgA0E4bCEDA0AgBCABEOQQIARBOGohBCADQUhqIgMNAAsLIAAoAhgiBEUNAiAEKAIAIAEQpwEMAgsgACgCBCABEPgJIAAoAgggARBuDAELIAAoAgQgARBuCyACQRBqJAALvwIBA38jAEEwayIDJAACQCABIAAoAnhBCHFBA3YQqxANACADQRBqIAEQ0gMgAygCFCEEIAMoAhAhBSADQauBgIB4NgIYIAAgBSAEIANBGGoQ3hwLAkAgAC8BgAFBgNAAcUGAwABHDQACQCABKAIAIgRBGkcNACABQQhqEI4KRQ0AIAMgARDSAyADKAIEIQQgAygCACEFIANBh4GAgHg2AhggACAFIAQgA0EYahDTDQwBCyABIAAoAnhBCHFBA3YQqxANACABIQUCQAJAA0ACQCAEQSNGDQACQCAE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DQIgACgCCCEAIAJBOGwhAgNAAkACQAJAAkAgACgCAA4DAAECAAsCQCAAQShqKAIAIgMoAgANACABIANBCGoQzwQMAwsgAyABELYKDAILIAEgAEEQahDPBAwBCwJAIABBBGooAgAiAygCAA0AIAEgA0EIahDPBAwBCyADIAEQtgoLIABBOGohACACQUhqIgINAAwDCwsgACgCBCIAKAIAIgINAAsgASAAQQhqEM8ECwuoAgEDfwJAAkACQAJAAkACQCAAKAIADgcFAAECAwUEBQsgACgCDCICRQ0EIAAoAgghACACQShsIQIDQAJAIAAoAgBBB0YNACAAIAEQ7QkLIABBKGohACACQVhqIgINAAwFCwsgACgCBCABEO0JDwsgACgCDCICRQ0CIAAoAgghAyACQThsIQRBACEAA0ACQAJAAkACQCADIABqIgIoAgAOAwABAgALAkAgAkEIaigCAEEDRw0AIAJBDGooAgAgARCoAQsgAkEoaigCACABEO0JDAILIAJBMGooAgAiAkUNASACIAEQqAEMAQsgAkEEaigCACABEO0JCyAEIABBOGoiAEcNAAwDCwsgACgCBCABEO0JIAAoAgggARCoAQ8LIAAoAgQgARCoAQsLngIBAX8CQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgAOCwoAAQIDBAUGBwgKCgsgASAAKAIoEKsBIAAoAghBAkkNCSAAQQxqIQAMCAsgACgCCEEBRw0IIABBDGohAAwHCyAAQQRqIQAMBgsCQCAAKAIEIgAoAgAiAkEDRw0AIAEgACgCEBCrASAAQQxqKAIAIgJFDQcgAkEEdCECIABBCGooAgBBDGohAANAIAEgACgCABCrASAAQRBqIQAgAkFwaiICDQAMCAsLIAEgACgCIBCrASACQQJJDQYgAEEEaiEADAULIABBBGohAAwECyAAQQRqIQAMAwsgAEEEaiEADAILIABBBGohAAwBCyAAQQRqIQALIAEgACgCABCrAQsLqAIBA38CQAJAAkACQAJAAkAgACgCAA4HBQABAgMFBAULIAAoAgwiAkUNBCAAKAIIIQAgAkEobCECA0ACQCAAKAIAQQdGDQAgACABEO8JCyAAQShqIQAgAkFYaiICDQAMBQsLIAAoAgQgARDvCQ8LIAAoAgwiAkUNAiAAKAIIIQMgAkE4bCEEQQAh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mAE2AgggAkIDNwIUIAIgAEEQajYCMCACIABBDGo2AiggAiACQThqNgIgIAIgAkEgajYCECABKAIAIAEoAgQgAkEIahDlICEAIAIoAjggAigCPBDnIiACQeAAaiQAIAAL+AEBBH8gAigCCCEDIAIoAgQhBCAAENISIQACQAJAAkAgASACKAIATw0AA0ACQCADDQBBACEFDAQLIAAoAhAgACgCFCADQX9qIgZBlL6YARC7HiIFKAIAIAFJDQIgBEECIAUtAAQiA0F/aiADQQRGG0H/AXFrIQQgBiEDDAALCyADIAAoAhQiBiADIAZLGyEFA0AgBSADRg0CIAAoAhAgACgCFCADQaS+mAEQux4iBigCACABTw0BIARBAiAGLQAEIgZBf2ogBkEERhtB/wFxaiEEIANBAWohAwwACwsgAyEFCyACIAU2AgggAiAENgIEIAIgATYCACAEC4ACAgN/AX4jAEEgayICJAACQCAALQCQAQ0AIAEoAhAiA0UNACACQQhqIAEpAwAgAxDnGiAAQYABaiACKQMIIAIoAhAQkQYaCwJAIAAtAChBAUcNACACQQhqIAEQ6BIgACACKQMIIgUgAigCGBCJECAFQgODQgBSDQAgBaciAyADKAIAIgRBf2o2AgAgBEEBRw0AIAMgAygCEBDpHQsgAEEsaiEDAkACQCAALQB5DQAgAkEIaiABKQMAIAEoAhAQ5xogAyACKQMIIAIoAhAQkAsMAQsgAkEIaiABKQMAIAEoAhAQ5xogAyACKQMIIAIoAhAgAC0AehCPDAsgAkEgaiQAC/0BAgF/An4jAEHAAGsiAiQAAkAgASgCAEEFRw0AIAAgAUEIahDDBSIARQ0AIAEpAwghAyABQgE3AwggASkDECEEIAFCADcDECABQRVqQgA3AAAgASAANgIoIAFBBjYCACABIAIpAwA3AzAgAUEANgIIIAEgAzcDECABIAQ3AxggAUE4aiACQQhqKQMANwMAIAFBwABqIAJBEGopAwA3AwAgAUHIAGogAkEYaikDADcDACABQdAAaiACQSBqKQMANwMAIAFB2ABqIAJBKGopAwA3AwAgAUHgAGogAkEwaikDADcDACABQegAaiACQThqKQMANwMACyACQcAAaiQAC/YBAgZ/AX4jAEEQayIBJAACQCAAKAIEIgJFDQAgACgCACEDAkAgACgCDCIERQ0AIANBCGohACADKQMAQn+FQoCBgoSIkKDAgH+DIQdBASEFIAMhBgNAIAVFDQECQANAIAdCAFINASAGQcB+aiEGIAApAwBCf4VCgIGChIiQoMCAf4MhByAAQQhqIQAMAAsLIAZBACAHeqdBA3ZrQRhsaiIFQWhqKQMAEPMfIAVBcGoQiiAgB0J/fCAHgyEHIARBf2oiBCEFDAALCyABQQRqQRhBCCACQQFqEI0QIAMgASgCDGsgASgCBCABKAIIENEgCyABQRBqJAALjAIBBH8jAEEgayIDJABBASEEAkAgAC0ABA0AIAAtAAUhBQJAAkAgACgCACIGLQAKQYABcQ0AQQEhBCAFQQFxRQ0BIAYoAgBB046YAUECIAYoAgQoAgwRDABFDQEMAgtBASEEAkAgBUEBcQ0AIAYoAgBBqKabAUEBIAYoAgQoAgwRDAANAgtBASEEIANBAToADyADQeCPgQE2AhQgAyAGKQIANwIAIAMgBikCCDcCGCADIANBD2o2AgggAyADNgIQIAEgA0EQaiACEQgADQEgAygCEEH7j4EBQQIgAygCFCgCDBEMACEEDAELIAEgBiACEQgAIQQLIABBAToABSAAIAQ6AAQgA0EgaiQAIAAL6AEBA38CQCADQQhJDQAgACAAIANBA3YiA0HgAGwiBGogACADQagBbCIFaiADELULIQAgASABIARqIAEgBWogAxC1CyEBIAIgAiAEaiACIAVqIAMQtQshAgsCQAJAIAAoAgAiAyABKAIAIgVGDQAgAyAFSSEEDAELIAAoAgwgASgCDEkhBAsCQAJAIAMgAigCACIGRg0AIAMgBkkhAwwBCyAAKAIMIAIoAgxJIQMLAkAgBCADRw0AAkACQCAFIAZGDQAgBSAGSSEADAELIAEoAgwgAigCDEkhAAsgAiABIAQgAHMbIQALIAAL5gEBA38CQCADQQhJDQAgACAAIANBA3YiA0EFdCIEaiAAIANBOGwiBWogAxC2CyEAIAEgASAEaiABIAVqIAMQtgshASACIAIgBGogAiAFaiADELYLIQILAkACQCAAKAIAIgMgASgCACIFRg0AIAMgBUkhBAwBCyAAKAIEIAEoAgRJIQQLAkACQCADIAIoAgAiBkYNACADIAZJIQMMAQsgACgCBCACKAIESSEDCwJAIAQgA0cNAAJAAkAgBSAGRg0AIAUgBkkhAAwBCyABKAIEIAIoAgRJIQALIAIgASAEIABzGyEACyAAC+YBAQN/AkAgA0EISQ0AIAAgACADQXhxIgRqIAAgA0EDdiIDQQ5sIgVqIAMQtwshACABIAEgBGogASAFaiADELcLIQEgAiACIARqIAIgBWogAxC3CyECCwJAAkAgAC0AACIDIAEtAAAiBUYNACADIAVJIQQMAQsgAC0AASABLQABSSEECwJAAkAgAyACLQAAIgZGDQAgAyAGSSEDDAELIAAtAAEgAi0AAUkhAwsCQCAEIANHDQACQAJAIAUgBkYNACAFIAZJIQAMAQsgAS0AASACLQABSSEACyACIAEgBCAAcxshAAsgAAvrAQIEfwF+IwBBIGsiBSQAAkAgAiAAKAIAIgYgAWtNDQBBACEHAkACQAJAIAEgAmoiAiABTw0ADAELAkAgAyAEakF/akEAIANrca0gAq1+IglCIIinRQ0ADAELIAmnIghBgICAgHggA2tLDQBBACEBAkAgBkUNACAFIAYgBGw2AhwgBSAAKAIENgIUIAMhAQsgBSABNgIYIAVBCGogAyAIIAVBFGoQuhEgBSgCCEEBRw0BIAUoAhAhASAFKAIMIQcLIAcgAUHcpZoBENggAAsgBSgCDCEBIAAgAjYCACAAIAE2AgQLIAVBIGokAAuUAgIFfwJ+IwBBIGsiAyQAIAMgASABKALAASIEQQFqIgUgASgCxAFBf2oiBhDYGSADKAIAIAMoAgQQ+RchCCADQQhqIAEQ+BACQAJAAkACQCADKAIIQQFHDQAgAyADKAIMIgc2AhwgAg0BIABBgICAgHg2AgAgACAHNgIEIAgQ8x8MAwsgAykDECEJDAELIANBHGoQjSBCACEJCyABEOMOIAEoArwBIQICQEEIQSAQmSIiAQ0AAAsgAUEBOgAYIAEgCTcDECABIAY2AgwgASAFNgIIIAEgCDcDACAAIAI2AhwgACAENgIYIABBATYCFCAAIAE2AhAgAEKAgICAEDcCCCAAQoCAgIDAADcCAAsgA0EgaiQAC/sBAQd/IAAoAgghASAAKAIEIQJBACEDAkADQCADIAFGDQEgAiADQdwAbGoiBCgCOCAEQTxqKAIAEMUgIAQoAiAgBEEkaigCABC9IiAEKAJEIARByABqKAIAEMUgIAQoAlAgBEHUAGooAgAQxSAgBCgCNCEFIARBMGoiBigCACEHAkADQCAFRQ0BIAcoAgAgB0EEaigCABC9IiAHQRhqKAIAIAdBHGooAgAQxSAgB0EMaigCACAHQRBqKAIAEL0iIAVBf2ohBSAHQShqIQcMAAsLIAQoAiwgBigCAEEEQSgQvxIgA0EBaiEDDAALCyAAKAIAIAJBBEHcABC/Egv4AQEEfwJAAkACQCACIAEoAggiBE8NACABKAIEIAJBFGxqKAIIIQUgASgCKCEGIAEoAiwhBwNAIAUiBCAHTw0CIAYgBEEDdGooAgQiBQ0ACwJAIAcgASgCJEcNACABQSRqQeixgAEQ8hcgASgCKCEGCyABIAdBAWo2AiwgBiAHQQN0aiIFQQA2AgQgBSADNgIAAkACQCAERQ0AIAYgBEEDdGogBzYCBAwBCyACIAEoAggiBE8NAyABKAIEIAJBFGxqIAc2AggLIABBAzYCAA8LIAIgBEG4sIABEMMSAAsgBCAHQciwgAEQwxIACyACIARB2LCAARDDEgAL8gECBH8IfiMAQSBrIgIkACACQRBqIgMgAUEQaikDADcDACACQQhqIgQgAUEIaikDADcDACACQRhqIgUgATUCOEI4hiABKQMwhCIGIAFBGGopAwCFNwMAIAIgASkDADcDACACEK4NIAQgBCkDAELuAYU3AwAgAiACKQMAIAaFNwMAIAIQkQkgAyADKQMAIgZC3QGFNwMAIAQpAwAhByACKQMAIQggBSkDACEJIAIQkQkgBSkDACEKIAQpAwAhCyADKQMAIQwgAikDACENIAAgBiAJIAggB4WFhTcDACAAIAogCyAMIA2FhYU3AwggAkEgaiQAC/ABAQR/IwBBIGsiASQAIABBBGooAgAhAiAAKAIAIgMoAgAhACADQQA2AgAgACgCFCEDIABBADYCFAJAIANFDQAgAUEIaiADEQMAAkAgAigCACIAKAIAIgNFDQAgACgCBCIERQ0AIAMgAEEMaigCABDvDCAEIARBA3RBD2pBeHEiAGpBCWoiBEUNACADIABrIARBCBC9EwsgAigCACIAIAEpAgg3AgAgAEEIaiABQQhqQQhqKQIANwIAIAFBIGokAEEBDwsgAUEANgIYIAFBATYCDCABQbiDnQE2AgggAUIENwIQIAFBCGpBoPObARCoHQALhQIBAn8CQAJAAkACQAJAAkACQCAAKAIADgcAAQIDBAYFAAsgAEEANgIYDwsgACgCDCIBRQ0EIAAoAgghACABQShsIQEDQAJAIAAoAgBBB0YNACAAEP4JCyAAQShqIQAgAUFYaiIBDQAMBQsLIAAoAgQQ/gkPCyAAKAIMIgFFDQIgACgCCCEAIAFBOGwhAQNAAkACQAJAAkAgACgCAA4DAAECAAsgAEEIahCQDAwCCyAAQSBqQQA2AgAgAEEwaigCACICRQ0BIAIQugEMAQsgAEEEahDxDAsgAEE4aiEAIAFBSGoiAQ0ADAMLCyAAKAIEEP4JIAAoAggQugEPCyAAKAIEELoBCwv8AQEDfwJAIAEoAgBBA0cNACAALQAkIQIgAEEDOgAkIAAtACUhAyAAIAEoAgQiBBDOASAEIAAQUyAAIAM6ACUgAEEDOgAkIAAgBBCdASAAIAM6ACUgACACOgAkIAQoAgBBGUcNACAAIAQQswELIAAtACUhBCABKAIgIQECQCAALQAkIgMNAAJAIAEoAgBBdGoiAkEHIAJBJkkbQXtqIgJBH0sNAEEBIAJ0Qa6igIB4cQ0BIAINACABLQARRQ0BCyAAQQM6ACQLIAAgARDOASABIAAQUyAAIAQ6ACUgACADOgAkIAAgARCdAQJAIAEoAgBBGUcNACAAIAEQswELC4ECAQN/AkACQCAAKAIAIgFBEUcNAEEAIQECQAJAAkACQAJAAkAgACgCCA4IAwUABAcHAQIDCyAAKAIMLQAYRQ0DDAYLIAAoAgwtACxFDQIMBQsgACgCDCIALQBQDQQgAC0AUQ0EIAAtAEUiAkEDRg0EIABBIGohAAJAIAJBAkYNAANAIAAoAiAiAC0AJUECRw0ACwsgACgCCCICRQ0EIAAoAgQhACACQThsQUhqIQIDQCAAEJoLIgENBSAAQThqIQAgAiEDIAJBSGohAiADDQAMBQsLIAAtACwNAwtBAQ8LIAAtACwNASAAKAIoKAIYQYCAgIB4Rw8LIAFBAUchAQsgAQv8AQEDfyMAQcAAayIFJABBASEGIAVBCGogASACIAMgBEEBQQAQwAUgBSgCCCEDAkACQCAFLQAcIgJBA0YNACAFQThqIgYgBUEUaikCADcDACAFIAUpAgw3AzAgBUEuaiIBIAVBH2otAAA6AAAgBSAFLwAdOwEsQQAtAOD2nQEaIAUoAiAhB0HAABCEASIERQ0BIAQgAzYCCCAEQQ82AgAgBCAFKQMwNwIMIAQgAjoAHCAEIAUvASw7AB0gBCAHNgIgIARBFGogBikDADcCACAEQR9qIAEtAAA6AABBACEGIAQhAwsgACADNgIEIAAgBjYCACAFQcAAaiQADwsAC/IBAgZ/AX4jAEEQayIBJAACQCAAKAIIIgJFDQAgACgCBCEDAkAgACgCECIERQ0AIANBCGohACADKQMAQn+FQoCBgoSIkKDAgH+DIQcgAyEFQQEhBgNAIAZFDQECQANAIAdCAFINASAFQYB/aiEFIAApAwBCf4VCgIGChIiQoMCAf4MhByAAQQhqIQAMAAsLIAUgB3qnQQF0QfABcWsiBkF0aigCACAGQXhqKAIAEL0iIAdCf3wgB4MhByAEQX9qIgQhBgwACwsgAUEEakEQIAJBAWoQ+RAgAyABKAIMayABKAIEIAEoAggQ0SALIAFBEGokAAuLAgEEfyMAQSBrIgMkACAAKAIAIQRBASEFAkAgAC0ACA0AAkAgACgCBCIGLQAKQYABcQ0AQQEhBSAGKAIAQdOOmAFB+MCbASAEG0ECQQEgBBsgBigCBCgCDBEMAA0BIAEgBiACEQgAIQUMAQsCQCAEDQBBASEFIAYoAgBB/Y+BAUECIAYoAgQoAgwRDAANAQtBASEFIANBAToADyADQeCPgQE2AhQgAyAGKQIANwIAIAMgBikCCDcCGCADIANBD2o2AgggAyADNgIQIAEgA0EQaiACEQgADQAgAygCEEH7j4EBQQIgAygCFCgCDBEMACEFCyAAIAU6AAggACAEQQFqNgIAIANBIGokACAAC/8BAQh/IwBBMGsiAiQAQQEhAwJAIAEoAgAiBEH02oQBQQ0gASgCBCIFKAIMIgYRDAANAEEAIQEDQEH/ASEHAkACQCABQf8BcSIIQf8BRiIJDQBBASEHIAhFDQEgAUEBaiEHCyAEQdOOmAFBAiAGEQwADQILIAIgACAIai0AADoAAyACQQI2AgggAkGA/IMBNgIEIAJCAjcCECACQYMBNgIoIAJB+wA2AiAgAiABOgAvIAIgAkEcajYCDCACIAJBA2o2AiQgAiACQS9qNgIcIAQgBSACQQRqEPQFDQEgByEBIAlFDQALIARByMubAUEBIAYRDAAhAwsgAkEwaiQAIAMLoQIBAX8jAEHgAGsiAiQAIAJBhO2EATYCWCACQfTshAE2AlAgAkHU7IQBNgJIIAJBjOqDATYCQCACQdTshAE2AjggAkHk7IQBNgIwIAJB1OyEATYCKCACQdTshAE2AiAgAkHU7IQBNgIYIAJBxOyEATYCECACQbTshAE2AgggAiAANgIsIAIgAEHIAGo2AkwgAiAAQd0AajYCRCACIABBwABqNgI8IAIgAEHcAGo2AjQgAiAAQdsAajYCJCACIABB2gBqNgIcIAIgAEHZAGo2AhQgAiAAQTBqNgIMIAIgAEHYAGo2AgQgAiAAQdAAajYCXCACIAJB3ABqNgJUIAFBlO+EAUEGQbzuhAFBCyACQQRqQQsQwwohACACQeAAaiQAIAAL6QEBCX8CQCABKAIIIgJFDQAgASgCBCEDIAAoAgQhBAJAIAAoAggiBSACRw0AIAJBAWohBiADIQcgBCEIA0AgBkF/aiIGRQ0CIAgoAgAgBygCAEcNASAHQQRqIQkgCEEEaiEKIAdBCGohByAIQQhqIQggCigCACAJKAIARg0ACwsgAkEDdCEHAkAgAiAAKAIAIAVrTQ0AIAAgBSACQQRBCBDUGSAAKAIEIQQgACgCCCEFCwJAIAdFDQAgBCAFQQN0aiADIAf8CgAACyAAIAUgAmo2AgggABCVBSAAIAAtAAwgAS0ADHE6AAwLC/8BAgV/AX4CQAJAIAEoAgAiAyABKAIEIgQgAkHdy92eeWxBD3etIAIQ2QwiAg0AQYCAgIB4IQEMAQtBgAEhBQJAIAMgAyACa0EEdSIGaiIHKQAAIgggCEIBhoNCgIGChIiQoMCAf4N6p0EDdiADIAQgBkF4anFqIgMpAAAiCCAIQgGGg0KAgYKEiJCgwIB/g3mnQQN2akEHSw0AIAEgASgCCEEBajYCCEH/ASEFCyAHIAU6AAAgA0EIaiAFOgAAIAEgASgCDEF/ajYCDEGAgICAeCEBIAJBdGooAgAiA0GAgICAeEYNACAAIAJBeGopAgA3AgQgAyEBCyAAIAE2AgAL8gEBBn8jAEEQayICJAACQCAAKAIIIgNFDQAgACgCBCEEIANBOGwhBSABQRBqIQZBACEHA0ACQAJAAkACQCAEIAdqIgMoAgAOAwABAgALAkAgA0EIaigCAEEDRw0AIANBDGooAgAgARBuCyADQShqKAIAIAEQ+AkMAgsgAiADQRBqKQMAIANBIGooAgAQ5xogBiACKQMAIAIoAggQkQYaDAELIANBBGooAgAgARD4CSADQRhqKAIAIgNFDQAgAygCACABEKcBCyAFIAdBOGoiB0cNAAsLAkAgACgCFCIDRQ0AIAMoAgAgARCnAQsgAkEQaiQAC/YBAgJ/AX4jAEEwayICJAACQAJAAkACQCAAQf8BcUHLAEcNACACQQAgAUEIaiABKAIIIgNBCkYiABs2AgwgAA0BIANBAkcNASABKQMQIgRCA4NCAFINAyAEpyIBIAEoAgAiAUEBajYCACABQX9MDQIMAwsgAiABIAEoAsABIAEoAsQBENgZIAIoAgAgAigCBBD5FyEEDAILIAJBATYCJCACQdCjmwE2AiAgAkEBNgIUIAJByKObATYCECACQQE2AhwgAkH4Bq1CIIYgAkEMaq2ENwMoIAIgAkEoajYCGCACQRBqQaykmwEQqB0LAAsgAkEwaiQAIAQL8QEBBn8CQAJAAkACQCABKAIAIgMgAigCACIEKAIIIgVPDQAgAUF8aiIGKAIAIgEgBU8NAQJAIAQoAgQiBSADQQxsaigCCCAFIAFBDGxqKAIITQ0AIANBDGwhBwJAA0AgBiIFQQRqIAE2AgAgBSAARg0BIAMgAigCACIIKAIIIgRPDQUgBUF8aiIGKAIAIgEgBE8NBiAIKAIEIgQgB2ooAgggBCABQQxsaigCCEsNAAsLIAUgAzYCAAsPCyADIAVBzLiAARDDEgALIAEgBUHcuIABEMMSAAsgAyAEQcy4gAEQwxIACyABIARB3LiAARDDEgALgQIBAn8CQAJAAkAgACgCCCIDQYCABE8NAAJAIAAoAhQiBCAAKAIMRw0AIABBDGpBrLiAARDtFwsgACAEQQFqNgIUIAAoAhAgBEECdGogAzYCACACQX9MDQFBAC0A4PadARogAhCEASIDRQ0CAkAgAkUNACADIAEgAvwKAAALAkAgACgCCCIEIAAoAgBHDQAgAEG8uIABEPMXCyAAIARBAWo2AgggACgCBCAEQQxsaiIEIAI2AgggBCADNgIEIAQgAjYCACAAIAAoAhwgAmo2AhwgACACIAAoAhgiBCACIARJGzYCGA8LQfi2gAFBN0GcuIABEIwaAAtBuOSbARCBHAsAC+sBAQd/IwBBIGsiAiQAIAAtADghAyAAQQA6ADgCQCABKAIIIgRFDQAgASgCBCIBIARBOGxqIQUgAkEMaiEGIAJBCGohBwNAIAAtADkhBCAAQQA6ADkgASAAEJoEIAAgBDoAOQJAIAFBMGooAgAiCEUNACAAQQE6ADkgAkEDNgIIIAggABBtIAAgBDoAOSACKAIIIgRBAUsNACAHIAIQzhogByACKQMAEJ4aIARFDQAgAigCDCIEIAQoAgAiBEF/ajYCACAEQQFHDQAgBhDgEAsgAUE4aiIBIAVHDQALCyAAIAM6ADggAkEgaiQAC4ACAQJ/AkACQAJAAkACQAJAIAAoAgAOBwUAAQIDBQQFCyAAKAIMIgJFDQQgACgCCCEAIAJBKGwhAgNAAkAgACgCAEEHRg0AIAAgARDuCQsgAEEoaiEAIAJBWGoiAg0ADAULCyAAKAIEIAEQ7gkPCyAAKAIMIgJFDQIgACgCCCEAIAJBOGwhAgNAAkACQAJAAkAgACgCAA4DAAECAAsgAEEIaiABEP8LDAILIABBMGooAgAiA0UNASABIAMQqwEMAQsgAEEEaiABEOYMCyAAQThqIQAgAkFIaiICDQAMAwsLIAAoAgQgARDuCSABIAAoAggQqwEPCyABIAAoAgQQqwELC/wBAQN/AkACQAJAAkACQAJAIAAoAgAOBwABAgMEBQUACyABKAIAIAEoAgQgAEEIahDACQ8LIAAoAgxBKGwhAiAAKAIIIQADQCACRQ0EAkAgACgCAEEHRg0AIAAgARDOCwsgAEEoaiEAIAJBWGohAgwACwsgAEEEaiABEJAkDwsgACgCDEE4bCECIAEoAgQhAyABKAIAIQQgACgCCCEAA0AgAkUNAgJAAkACQAJAIAAoAgAOAwABAgALIABBKGogARCQJAwCCyAEIAMgAEEQahDACQwBCyAAQQRqIAEQkCQLIABBOGohACACQUhqIQIMAAsLIABBBGogARCQJAsL9gEBA38jAEEgayICJAAgAkEQaiABEPwBIAIoAhQhAwJAAkAgAigCEEEBcUUNACAAQQA2AgAgACADNgIEDAELIAIgAzYCHAJAIAMoAgBBLUcNACAAIAMpAgQ3AgACQCADKAIAQS1GDQAgAxDDBgsgA0HAAEEIEL0TDAELAkACQCABLQCBAUEgcUUNACABLQDIAUH/AXFBEkcNACACQQhqIAEQtAQgAigCDCEEAkAgAigCCEEBcUUNACAAQQA2AgAgACAENgIEIAJBHGoQmiEMAwsgARDjDiAAIAQ2AgQMAQsgAEEANgIECyAAIAM2AgALIAJBIGokAAuGAgEDfyMAQSBrIgMkACAAKAIAIgAoAgAhBCAAQQA2AgACQCAEQQFxDQBB2IuAAUExEJQjAAsgA0EQakEIaiIEIABBDGooAgA2AgAgAyAAKQIENwMQQSQQwiEiAEEAOgAgIAAgAjYCECAAIAE2AgwgAEEIaiAEKAIANgIAIAAgAykDEDcCAEEgENQfIgRBAToAHCAEQgA3AgggBEKCgICAEDcCACADQQhqIARBCGoiBUGEh50BEKcdIAMoAgwhASADKAIIIgIQqBcgAiAFNgIMIAJBlIedATYCCCACQYiFgAE2AgQgAiAANgIAIAEgASgCAEEBajYCABC+ByAEEOkMIANBIGokAAv3AQEEfyAAKAK8AiEBAkAgACgCwAIiAkUNACABIQMDQAJAAkACQAJAIAMoAgBBf2oOBAABAwIDCyADQQhqKAIAIgRFDQIgA0EEaigCACAEQQN0QQQQvRMMAgsgA0EIaigCACIERQ0BIANBBGooAgAgBEECdEEEEL0TDAELIANBCGooAgAiBEUNACADQQRqKAIAIARBAnRBBBC9EwsgA0EUaiEDIAJBf2oiAg0ACwsgACgCuAIgAUEEQRQQxRIgACgCxAIgACgCyAJBBEEEEMUSIAAoArQCIgMgAygCACIDQX9qNgIAAkAgA0EBRw0AIAAoArQCENYbCwvwAQEEfyMAQTBrIgQkAEEAIQUCQCADKAIQIgYgAygCFCIHSw0AAkACQCADKAIAQX9qQQJJDQAgBEEMaiABQQRqIAMoAgggAygCDCAGIAcQhwcgBCgCDEEBRw0CIAQoAhAgBCgCFCIDTQ0BIARBADYCKCAEQQE2AhwgBEHE5oMBNgIYIARCBDcCICAEQRhqQaDihAEQqB0ACyAGIAMoAgxPDQECQCABLQAEIAMoAgggBmotAAAiA0YNACABLQAFQf8BcSADRw0CCyAGQQFqIQMLIAAgAzYCCCAAQQA2AgRBASEFCyAAIAU2AgAgBEEwaiQAC/ABAQR/IwBB4ABrIgMkACABKAIAIQQCQAJAAkAgASgCBCIFQX9GDQAgBUEBaiEFDAELIANCl4CAgHA3AkQgA0EEaiAEQQRqKAIAIARBCGooAgAgAiADQcQAahChDSADKAIIIQUgAygCBCIGQSJGDQACQEE4RQ0AIABBCGogA0EEakEIakE4/AoAAAsgACAFNgIEIAAgBjYCAAwBCwJAIAUgBCgCACgCYCIGSw0AIABBIjYCACABIAU2AgQMAQsgA0EXNgIEIAMgBjYCCCAAIARBBGooAgAgBEEIaigCACACIANBBGoQoQ0LIANB4ABqJAAL6wEBBH8jAEEgayIBJAAgACgCACICKAIAIQMgAkEANgIAIAMoAhQhAiADQQA2AhQCQCACRQ0AIAFBCGogAhEDAAJAIAAoAgQiACgCACIDKAIAIgJFDQAgAygCBCIERQ0AIAIgA0EMaigCABDvDCAEIARBA3RBD2pBeHEiA2pBCWoiBEUNACACIANrIARBCBC9EwsgACgCACIDIAEpAgg3AgAgA0EIaiABQQhqQQhqKQIANwIAIAFBIGokAEEBDwsgAUEANgIYIAFBATYCDCABQbiDnQE2AgggAUIENwIQIAFBCGpBoPObARCoHQAL8gEBBn8jAEEQayICJAACQCAAKAIIIgNFDQAgACgCBCEAIANBDGwhBCABQSxqIQUDQAJAAkAgACgCACIDDQAgAEEEaigCACIDIAEQjAQgAygCAEEFRw0BIAIgAykDCCADQRhqKAIAEOcaIAUgAikDACACKAIIEJALDAELIAEtACghBiABQQA6ACggAS0AeSEHIAFBADoAeQJAIAMoAgBBGkcNACACIAMpAwggA0EYaigCABDnGiAFIAIpAwAgAigCCBCQCwsgAyABEHggASAGOgAoIAEgBzoAeQsgAEEMaiEAIARBdGoiBA0ACwsgAkEQaiQAC/EBAQJ/AkAgAS0AbEECRw0AIAFBwABqIQIDQCACKAIYIgItACxBAkYNAAsLAkAgASgChAEiA0UNACABKAKAASECIANB2ABsIQMDQAJAAkAgAigCAEEFRw0AIAAtAAANASACQQRqKAIAIAAQmAEMAQsgAiAAEIEJCyACQdgAaiECIANBqH9qIgMNAAsLAkAgASgCmAEiA0UNACABKAKUASECIANBKGwhAwNAIAIgABD9BiACQShqIQIgA0FYaiIDDQALCwJAIAEtADwiAkEGRg0AIAJBAkcNACABQRBqIQIDQCACKAIYIgItACxBAkYNAAsLC/sBAQJ/AkACQAJAIAAtACwiAkF9aiIDQQEg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uBQLIARBMGokAAvUAQEFfyAAKAIEIQEgACgCACECIABChICAgMAANwIAIAAoAhAhAwJAAkACQAJAIAEgAkYNACADDQEMAwsgA0UNAiAAKAIMIgIgACgCCCIAKAIIIgFGDQEgA0EDdCIERQ0BIAAoAgQiBSABQQN0aiAFIAJBA3RqIAT8CgAADAELAkAgACgCDCICIAAoAggiACgCCCIBRg0AIANBA3QiBEUNACAAKAIEIgUgAUEDdGogBSACQQN0aiAE/AoAAAsgACABIANqNgIIDwsgACABIANqNgIIDwsL0wEBBX8gACgCBCEBIAAoAgAhAiAAQoGAgIAQNwIAIAAoAhAhAwJAAkACQAJAIAEgAkYNACADDQEMAwsgA0UNAiAAKAIMIgIgACgCCCIAKAIIIgFGDQEgA0EBdCIERQ0BIAAoAgQiBSABQQF0aiAFIAJBAXRqIAT8CgAADAELAkAgACgCDCICIAAoAggiACgCCCIBRg0AIANBAXQiBEUNACAAKAIEIgUgAUEBdGogBSACQQF0aiAE/AoAAAsgACABIANqNgIIDwsgACABIANqNgIIDwsL+wEBAn8jAEEwayICJAACQAJAIAApAwBC////////////AINCgICAgICAgPj/AFMNACACQQE2AhQgAkGU85sBNgIQIAJCATcCHCACQfcBNgIsIAIgADYCKCACIAJBKGo2AhggASgCACABKAIEIAJBEGoQ5SAhAwwBCyACQQA6AAwgAiABNgIIQQEhAyACQQE2AhQgAkGU85sBNgIQIAJCATcCHCACQfcBNgIsIAIgADYCKCACIAJBKGo2AhggAkEIaiACQRBqEPYgDQACQCACLQAMDQAgASgCAEHVjpgBQQIgASgCBCgCDBEMAA0BC0EAIQMLIAJBMGokACADC9sBAQd/IwBB4ABrIgMkACADIAJBBEEEEKMOIAMoAgQhBAJAIAMoAgBBAUYNACADKAIIIQUCQAJAIARFDQAgAkECdCEGIAUhByAEIQgDQCAGRQ0BQQAtAOD2nQEaQeAAEIQBIglFDQIgAyABKAIAEGUCQEHgAEUNACAJIANB4AD8CgAACyAHIAk2AgAgB0EEaiEHIAZBfGohBiABQQRqIQEgCEF/aiIIDQALCyAAIAI2AgggACAFNgIEIAAgBDYCACADQeAAaiQADwsACyAEIAMo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ASgCBCAAQQhqIgEQgg0gAigCAEEyRg0BIAAQ0QEgAEE4aiACQThqKQMANwMAIABBMGogAkEwaikDADcDACAAQShqIAJBKGopAwA3AwAgAEEgaiACQSBqKQMANwMAIABBGGogAkEYaikDADcDACAAQRBqIAJBEGopAwA3AwAgASACQQhqKQMANwMAIAAgAikDADcDAAwBCyAAIAEQRgsgAkHAAGokAAvPAQEBfyMAQcAAayICJAACQAJAIAEoAgAiASgCAEEaRw0AIAIgACgCACAAKAIEIAFBCGoiABCCDSACKAIAQTJGDQEgARDRASABQThqIAJBOGopAwA3AwAgAUEwaiACQTBqKQMANwMAIAFBKGogAkEoaikDADcDACABQSBqIAJBIGopAwA3AwAgAUEYaiACQRhqKQMANwMAIAFBEGogAkEQaikDADcDACAAIAJBCGopAwA3AwAgASACKQMANwMADAELIAEgABBGCyACQcAAaiQAC7oBAQV/AkAgA0EISQ0AIAAgACADQQN2IgNB8ABsIgRqIAAgA0HEAWwiBWogAxDQDCEAIAEgASAEaiABIAVqIAMQ0AwhASACIAIgBGogAiAFaiADENAMIQILAkAgACgCBCIFIAEoAgQiBkkgACgCACIDIAEoAgAiBEkgAyAERhsiByAFIAIoAgQiCEkgAyACKAIAIgVJIAMgBUYbRw0AIAIgASAHIAYgCEkgBCAFSSAEIAVGG3MbIQALIAAL2gECBH8BfiMAQSBrIgEkAAJAIAAoAgQiAkUNACAAKAIAIQMCQCAAKAIMIgBFDQAgAykDACEFIAEgADYCGCABIAM2AhBBASEEIAEgAyACakEBajYCDCABIANBCGo2AgggASAFQn+FQoCBgoSIkKDAgH+DNwMAA0AgBEUNASABEJURIQAgASABKAIYQX9qIgQ2AhggAEF4aikDACEFIABBaGopAwAQ8x8gBRDzHwwACwsgAUEYQQggAkEBahCNECADIAEoAghrIAEoAgAgASgCBBDRIAsgAUEgaiQAC8IBAQV/AkAgASgCBCICIAFBeGooAgBJIAEoAgAiAyABQXRqKAIAIgRJIAMgBEYbQQFHDQAgAUFoaiEEIAEoAgghBQJAAkADQCAEIgFBIGogAUEUaigCADYCACABQRhqIAFBDGoiBCkCADcCACAEIABGDQEg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IAooAgAiAC0ACkGAAXENACAAKAIAQde1lwFBAiAAKAIEKAIMEQwAIQAMAQsgACgCAEHIy5sBQQEgACgCBCgCDBEMACEACyALQRBqJAAgAEEBcQu5AQICfwF+IwBBEGsiBCQAAkACQAJAIAIgA2pBf2pBACACa3GtIAGtfiIGQiCIpw0AIAanIgNBgICAgHggAmtNDQELIABBADYCBEEBIQIMAQsCQCADDQAgACACNgIIQQAhAiAAQQA2AgQMAQsgBEEIaiACIAMQix4CQCAEKAIIIgVFDQAgACAFNgIIIAAgATYCBEEAIQIMAQsgACADNgIIIAAgAjYCBEEBIQILIAAgAjYCACAEQRBqJAAL1gEBAn8jAEEQayIDJAACQAJAAkACQCACQX9MDQAgAkHp////B08NASACQRdqQfj///8HcSIEQfH///8HTw0CQQggBEEPakF4cRCHIiIERQ0DIAQgAjYCECAEIAA3AwggBEEBNgIAAkAgAkUNACAEQRhqIAEgAvwKAAALIANBEGokACAEDwtBtKqbAUErIANBD2pB8NSCAUHw1YIBEOoQAAtBtKqbAUErIANBD2pB8NSCAUGA1oIBEOoQAAtBtKqbAUErIANBD2pB8NSCAUHg1YIBEOoQCwALvgEBAX4CQAJAAkAgAyAEakF/akEAIANrca0gAa1+IgVCIIinDQAgBaciBEGAgICAeCADa00NAQsgAEEANgIEQQEhAwwBCwJAIAQNACAAIAM2AghBACEDIABBADYCBAwBC0EALQDg9p0BGgJAAkAgAkUNACAEIAMQrhwhAgwBCyAEIAMQtR8hAgsCQCACRQ0AIAAgAjYCCCAAIAE2AgRBACEDDAELIAAgBDYCCCAAIAM2AgRBASEDCyAAIAM2AgALwAECAn8BfiMAQSBrIgIkACACQQxqIAFBBGovAAA7AQAgAiABKAAANgIIQQAhAUEALQDg9p0BGgJAQQYQhAEiA0UNACACQQA2AhggAiADNgIUIAJBAzYCEANAIAMgAWogAiABakEIai8BADsAACABQQJqIgFBBkcNAAsgAikDECEEIAJBCGoiAUEDNgIAIAJBADoADCACIAQ3AwAgAhCDBSAAQQhqIAEpAwA3AgAgACACKQMANwIAIAJBIGokAA8LAAuuAQEFf0EAIQUDQCACQQF2IgYgBWohByAFIAcgASAHQQR0aiIIKAIAIAMgCCgCBCIIIAQgCCAESRsQkhciCSAIIARrIAkbQQBKGyEFIAIgBmsiAkEBSw0ACwJAAkAgASAFQQR0aiICKAIAIAMgAigCBCIFIAQgBSAESRsQkhciByAFIARrIAcbRQ0AQQAhBAwBCyACKAIMIQUgAigCCCEECyAAIAU2AgQgACAENgIAC6ABAQV+IAAgACkDGCIBQhCJIAEgACkDCHwiAYUiAkIViSACIAApAxAiAyAAKQMAfCIEQiCJfCIChSIFQhCJIAUgASADQg2JIASFIgN8IgFCIIl8IgSFIgUgAiABIANCEYmFIgF8IgJCIIl8IgM3AwAgACAFQhWJIAOFNwMYIAAgAUINiSAChSIBQhGJIAQgAXwiAYU3AxAgACABQiCJNwMIC9cBAAJAIAEgAkHW0ZsBQQIQwh5FDQBB3gAPCwJAIAEgAkH8vZsBQQYQwh5FDQBB3wAPCwJAIAEgAkGUnJsBQQIQwh5FDQBB4AAPCwJAIAEgAkGWnJsBQQoQwh5FDQBB4QAPCwJAIAEgAkGszJsBQQIQwh5FDQBBhAEPCwJAIAEgAkHSy5sBQQUQwh5FDQBBnQEPCwJAIAEgAkGgpZsBQQkQwh5FDQBBggEPCwJAIAEgAkHB0psBQQoQwh5FDQBBgQEPC0GDf0GkfyABIAJBm6qbAUEJEMIeGwvPAQEBfyAAEI8UIAAoAgQiAEEUaiIBKAIAIABBGGooAgAQ6xwgACgCECABKAIAEMsiAkAgACgCAEECRg0AIAAoAgQgAEEIaigCABC9IgsgACgCHCAAQSBqKAIAEMwiIABBLGoiASgCACAAQTBqKAIAEOwcIAAoAiggASgCABDNIiAAQThqIgEoAgAgAEE8aigCABCtFyAAKAI0IAEoAgAQziIgAEHEAGoiASgCACAAQcgAaigCABCiDSAAKAJAIAEoAgAQzyIgAEHQAEEEEL0TC7wBAQN/QQAhAQJAAkACQCAAKAIAQXxqDgQBAQIAAgsgACgCBCIALQBFQQNGDQEgAEEgaiEAAkADQCAALQAlQQJGDQEgACgCICEADAALCyAAKAIIQThsIQIgACgCBEEIaiEAA0AgAkUNAQJAAkAgAEF4aigCACIDQQFGDQAgA0EJRw0EIAAoAgBBEUcNBCAAQQhqELENRQ0EDAELIAAQsQ1FDQMLIAJBSGohAiAAQThqIQAMAAsLQQEhAQsgAQvPAQEBfyAAEI8UIAAoAgQiAEEUaiIBKAIAIABBGGooAgAQ6xwgACgCECABKAIAEMsiAkAgACgCAEECRg0AIAAoAgQgAEEIaigCABDOJAsgACgCHCAAQSBqKAIAEMwiIABBLGoiASgCACAAQTBqKAIAEOwcIAAoAiggASgCABDNIiAAQThqIgEoAgAgAEE8aigCABCtFyAAKAI0IAEoAgAQziIgAEHEAGoiASgCACAAQcgAaigCABCiDSAAKAJAIAEoAgAQzyIgAEHQAEEEEL0TC8cBAQV/IwBBEGsiAiQAQQEhAwJAIABBBGogASgCACIEIAEoAgQiBRCtAg0AAkACQCAAKAIAIgYtAABBBEcNACAEQaveggFBCyAFKAIMEQwARQ0BDAILIAIgBjYCDCABQaTeggFBByACQQxqQRoQ5gsNAQsCQCAALQAFQQRHDQAgAC0ACUH/AXFBBEcNACAALQAEDQBBACEDIAAtAA1B/wFxRQ0BCyABKAIAQf3dggFBBCABKAIEKAIMEQwAIQMLIAJBEGokACADC74BAQN/AkACQCABIAAoAggiA08NACAAKAIEIAFBFGxqKAIIIQECQAJAAkAgAkUNACAAKAIoIQQgACgCLCEFQQAhAwNAIAFFDQIgASAFTw0FIAQgAUEDdGooAgQhASACIANBAWoiA0cNAAsLIAFFDQAgASAAKAIsIgNJDQEgASADQZzjgwEQwxIAC0H48oMBEMkiAAsgACgCKCABQQN0aigCAA8LIAEgA0GMroABEMMSAAsgASAFQZzjgwEQwxIAC7oBAQN/IwBBEGsiAyQAIANBCGogACABEMkbIAMoAgwhASADKAIIIQACQAJAAkACQCACRQ0AQQAhBANAIAFFDQIgASAAKAIsIgVPDQQgACgCKCABQQN0aigCBCEBIAIgBEEBaiIERw0ACwsgAUUNACABIAAoAiwiBEkNASABIARBnOODARDDEgALQfjygwEQySIACyAAKAIoIAFBA3RqKAIAIQEgA0EQaiQAIAEPCyABIAVBnOODARDDEgALugEBA38jAEEgayICJAAgACgCACEDQQAhACABKAIAQbuymwFBASABKAIEKAIMEQwAIQQgAkEAOgAZIAIgBDoAGCACIAE2AhQDQCACIAA6AB8gAiAD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/wGDQiiGIAStQv8Bg0IghoQgBq2ENwIADwsgAyABQZTIhAEQwxIACyACIANB5MeEARDGEgALvQEBBX8jAEEgayICJAACQAJAAkAgASgCCCIDRQ0AAkAgASgCBCIELQAAQQJxRQ0AIAIgA0FzaiIFQQNxIgY2AgQgBg0DIANBDE0NAiAEIAVBAnY2AAkLIABBADYCDCAAIAEpAgA3AgAgAEEIaiABQQhqKAIANgIAIAJBIGokAA8LQQBBAEGs3YQBEMMSAAtBDSADQYzfhAEQvCIACyACQQA2AghBACACQQRqQaS3mAEgAkEIakGc34QBEMcbAAu/AQEFfwJAAkAgASAAKAIMayICQQF0IAJBH3VzIgNB/wBLDQAgACgCCCEEDAELIAAoAgghAiADIQUDQAJAIAIgACgCAEcNACAAQbzfhAEQlw4LIAAgAkEBaiIENgIIIAAoAgQgAmogBUGAf3I6AAAgBUH//wBLIQYgBCECIAVBB3YiAyEFIAYNAAsLAkAgBCAAKAIARw0AIABBrN+EARCXDgsgACABNgIMIAAgBEEBajYCCCAAKAIEIARqIAM6AAALvAEBBH8jAEEwayIDJABBACEEAkAgAigCECIFIAIoAhQiBksNAAJAIAIoAgBBf2pBAkkNACADQQxqIABBBGogAigCCCACKAIMIAUgBhCDByADKAIMIgRBAUcNASADKAIQIAMoAhRNDQEgA0EANgIoIANBATYCHCADQcTmgwE2AhggA0IENwIgIANBGGpBoOKEARCoHQALIAUgAigCDE8NACAALQAEIAIoAgggBWotAABGIQQLIANBMGokACAEC7wBAQR/IwBBMGsiAyQAQQAhBAJAIAIoAhAiBSACKAIUIgZLDQACQCACKAIAQX9qQQJJDQAgA0EMaiAAIAIoAgggAigCDCAFIAYQ3g4gAygCDCIEQQFHDQEgAygCECADKAIUTQ0BIANBADYCKCADQQE2AhwgA0HE5oMBNgIYIANCBDcCICADQRhqQaDihAEQqB0ACyAFIAIoAgxPDQAgACACKAIIIAVqLQAAai0AACEECyADQTBqJAAgBEEBcQu8AQEDfyMAQYAgayICJAACQAJAAkACQCABQYCS9AEgAUGAkvQBSRsiAyABIAFBAXZrIgQgAyAESxsiA0GBEEkNACADQQF0IgQgA3JBf0wNAgJAAkAgBA0AQQAhA0EBIQQMAQtBAC0A4PadARogBBCEASIERQ0ECyAAIAEgBCADIAFBwQBJELoCIAMgBEEBQQIQ0BIMAQsgACABIAJBgBAgAUHBAEkQugILIAJBgCBqJAAPC0HE25sBEIEcCwALvQEBBH8gACgCBCEBIAAoAgAhAiAAQoGAgIAQNwIAIAAoAhAhAwJAAkACQAJAIAEgAkYNACADDQEMAwsgA0UNAiAAKAIMIgIgACgCCCIAKAIIIgFGDQEgA0UNASAAKAIEIgQgAWogBCACaiAD/AoAAAwBCwJAIAAoAgwiAiAAKAIIIgAoAggiAUYNACADRQ0AIAAoAgQiBCABaiAEIAJqIAP8CgAACyAAIAEgA2o2AggPCyAAIAEgA2o2AggPCwvHAQEEfyMAQRBrIgIkACABKAIMIQMCQAJAAkACQAJAAkAgASgCBA4CAAECCyADDQFBASEEQQAhAQwCCyADDQAgASgCACIDKAIEIQEgAygCACEEDAELIAAgARCICgwBCyACQQRqIAFBAEEBQQEQqw0gAigCCCEFIAIoAgRBAUYNASACKAIMIQMCQCABRQ0AIAMgBCAB/AoAAAsgACABNgIIIAAgAzYCBCAAIAU2AgALIAJBEGokAA8LIAUgAigCDEG45JsBENggAAuoAQIBfwF+AkACQCABrSADrX4iBUIgiKcNACAFpyIBIAJBf2pqIgQgAUkNACAEQQAgAmtxIgQgA0EIamoiASAESQ0AIAFBgICAgHggAmtLDQACQCABRQ0AQQAtAOD2nQEaIAEgAhC1HyECCyACRQ0BIABBADYCDCAAIANBf2oiATYCBCAAIAIgBGo2AgAgACABIANBA3ZBB2wgAUEISRs2AggPCxCHHAsAC8UBAQN/IwBBIGsiASQAIAAoAgAiAigCACEDIAJBADYCACADKAIQIQIgA0EANgIQAkAgAkUNACABQQhqIAIRAwACQCAAKAIEIgAoAgAiAygCACICQYKAgIB4SA0AIAIgA0EEaigCABC9IiAAKAIAIQMLIAMgASkCCDcCACADQQhqIAFBCGpBCGooAgA2AgAgAUEgaiQAQQEPCyABQQA2AhggAUEBNgIMIAFBuIOdATYCCCABQgQ3AhAgAUEIakGg85sBEKgdAAu8AQIEfwF+IAAoAgQhAQJAIAAoAggiAkUNACABQSRqIQEDQAJAIAFBZGopAwAiBUIDg0IAUg0AIAWnIgMgAygCACIEQX9qNgIAIARBAUcNACADIAMoAhAQ6R0LAkAgAUF8aigCACIDRQ0AIAMQwAIgA0HgAEEIEL0TCwJAIAEoAgAiA0UNACADEMACIANB4ABBCBC9EwsgAUEwaiEBIAJBf2oiAg0ACyAAKAIEIQELIAAoAgAgAUEIQTAQvxILugEBBX8gACgCACAAKAIEIAEQoyEgACgCSEEGdCECIAAoAkQhA0EAIQQDQAJAAkAgAiAERg0AAkAgAyAEaiIFKAIAQQdGDQAgBSABEL0gDAILIAVBNGooAgAgBUE4aigCACABEN0cIAVBCGohBgJAIAVBHGotAABBAkcNACAFQQxqKAIAIQUgBigCACABEI0TIAUgARDyAwwCCyAGIAEQiyAMAQsgAEEgaiABEKcfDwsgBEHAAGohBAwACwvNAQIDfwF+IwBBIGsiAiQAIAEoAsABIQMgARDjDgJAAkAgASgCwAEgASgCvAEiBEcNACACQQhqIAEQiAwCQCACKQMIIgVQRQ0AIAIoAhAhASAAQgA3AwAgACABNgIIDAILIAAgAzYCCCAAIAU3AwAgACABKAK8ATYCDAwBCyACQd2AgIB4NgIIIAMgBCACQQhqEIQXIQMCQCABLQDIAUGiAUcNACABENcSIQQgARDjDiABIAQQ+hILIABCADcDACAAIAM2AggLIAJBIGokAAu+AQEFf0EAIQEgAEEAIAAtAAAiAiACQQFGIgIbOgAAAkAgAg0AIAAQyRAiAyECAkADQCABIQQgAiIFKAIEIgFFDQEgASECIAEoAgAgAEcNAAsgBSABKAIEIgI2AgQCQAJAAkAgAygCCCABRg0AA0AgAkUNAgJAIAIoAgAgAEcNAEECIQIMBAsgAigCBCECDAALCyADIAQ2AggLQQAhAgsgACACOgAAIAFBADYCCBCMHAALIABBADoAACADENEdCwvfAQECfyMAQRBrIgIkACAAKAIAKAIAIgBBAWohAwJAAkACQAJAAkACQCAALQAADgUAAQIDBAALIAEoAgBBxO+DAUEUIAEoAgQoAgwRDAAhAQwECyABKAIAQdjvgwFBFiABKAIEKAIMEQwAIQEMAwsgAiADNgIIIAFB7u+DAUERQe7SmQFBAyACQQhqQf0AEN0NIQEMAgsgAiADNgIMIAFB/++DAUEWQe7SmQFBAyACQQxqQf0AEN0NIQEMAQsgASgCAEGV8IMBQRAgASgCBCgCDBEMACEBCyACQRBqJAAgAQvCAQECfyMAQYAGayICJABBAiEDAkAgASkDAEIChSABKQMIhFANACACQYADaiABEM0EIAJBwARqIAFBkAVqEM0EAkBB8AJFDQAgAkEQaiACQYADakHwAvwKAAALIAJBCGogAkH8BWooAgA2AgAgAiACKQL0BTcDACACKALwBSEDCwJAQfACRQ0AIAAgAkEQakHwAvwKAAALIAAgAzYC8AIgACACKQMANwL0AiAAQfwCaiACQQhqKAIANgIAIAJBgAZqJAALvAEBA38jAEEwayIEJAACQCACKAIQIgUgAigCFCIGSw0AAkACQCACKAIAQX9qQQJJDQAgBEEMaiAAQQRqIAIoAgggAigCDCAFIAYQgwcgBCgCDEEBRw0CIAQoAhAgBCgCFE0NASAEQQA2AiggBEEBNgIcIARBxOaDATYCGCAEQgQ3AiAgBEEYakGg4oQBEKgdAAsgBSACKAIMTw0BIAAtAAQgAigCCCAFai0AAEcNAQsgAxC4FAsgBEEwaiQAC8cBAgR/AX4jAEEQayICJAAgAiABEMUCIAIoAgQhAwJAAkAgAigCACIEQYGAgIB4Rw0AIAAgAzYCBEEBIQEMAQsgAi0ADCEFIAEoAnRBCGogAyACKAIIEN4DIQYCQCAEQYCAgIB4Rg0AIAQgAxC9IgsCQCABKAIIQQpGDQAgAUEIahCKCQsgASAGNwMQIAFBAjYCCAJAIAVBAXFFDQAgASABLQCDAUEBcjoAgwELIABBywA6AAFBACEBCyAAIAE6AAAgAkEQaiQAC8UBAQR/IwBBEGsiAiQAIAEoAgwhAwJAAkACQAJAAkACQCABKAIEDgIAAQILIAMNAUEBIQRBACEBDAILIAMNACABKAIAIgMoAgQhASADKAIAIQQMAQsgACABEIgKDAELIAJBBGogAUEBQQEQow4gAigCCCEFIAIoAgRBAUYNASACKAIMIQMCQCABRQ0AIAMgBCAB/AoAAAsgACABNgIIIAAgAzYCBCAAIAU2AgALIAJBEGokAA8LIAUgAigCDEG45JsBENggAAvIAQEFfyMAQTBrIgIkAAJAAkAgAb1C////////////AINC//////////f/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ACACQbSbmgE2AjggAkGkm5oBNgIwIAIgADYCLCACQfCAmgE2AiggAiAAQdIAajYCJCACQfCAmgE2AiAgAiAAQdEAajYCHCACQfCAmgE2AhggAiAAQdAAajYCFCACQfD8mQE2AhAgAiAAQcgAajYCDCACIABBIGo2AjwgAiACQTxqNgI0IAFB9JuaAUEMQcSbmgFBBiACQQxqQQYQwwohACACQcAAaiQAIAALsgEBA38gACgCACICQcAAahDgHSACQZABaiEDIAIoAoQBQdgAbCEEIAIoAoABIQACQANAIARFDQECQAJAAkACQAJAIAAoAgAOBgQBAgMEAAQLIABBBGogARDHBAwDCyAAQQRqIAEQzh8MAgsgAEEEaiABELkODAELIABBBGogARDUEQsgAEHYAGohACAEQah/aiEEDAALCyADIAEQ1BECQCACLQA8QQZGDQAgAkEQahDgHQsLtgEBAn8jAEEwayICJAACQAJAAkAgAS0AyAFB2wBGDQBBgICAgHghAwwBCyABEOMOIAJBGGogAUEAEKIJIAIoAhwhAQJAIAIoAhgiA0GAgICAeEYNACACQRBqIAJBKGopAgA3AwAgAiACKQIgNwMIDAELIABBgYCAgHg2AgAgACABNgIEDAELIAAgATYCBCAAIAM2AgAgACACKQMINwIIIABBEGogAkEQaikDADcCAAsgAkEwaiQAC7oBAQF/IwBBwABrIgIkACAAKAIAIQAgAkHkqJcBNgI4IAJB1KiXATYCMCACIABBBGo2AiwgAkHUqJcBNgIoIAIgAEEDajYCJCACQdSolwE2AiAgAiAAQQJqNgIcIAJB1KiXATYCGCACIABBAWo2AhQgAkHUqJcBNgIQIAIgADYCDCACIABBBWo2AjwgAiACQTxqNgI0IAFB6KmXAUEFQbiplwFBBiACQQxqQQYQwwohACACQcAAaiQAIAALqQECAn8BfiMAQRBrIgIkACABKAIIIQMgAiABEKgIAkACQCACLQAAQQFHDQAgAi0AASEBIABBADYCACAAIAE6AAQMAQsCQCACKQMIIgQgA0F/aq1aDQACQCABKAIMQQFqIgNB9ANLDQAgACADNgIMIAAgBD4CCCAAIAEpAgA3AgAMAgsgAEEANgIAIABBAToABAwBCyAAQQA2AgAgAEEAOgAECyACQRBqJAALoQEBA38j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AAsQLCIGEC0iBxAuIQMgBxDBISADIAEgBRAvIAMQwSEgBhDBISAAIAEQKzYCCCAAIAU2AgQgACAENgIAIAJBEGokAAuRAQEDfwJAIAEgACgCACAAKAIIIgJrTQ0AIAAgAiABQQRBBBDOGSAAKAIIIQILIAAoAgQgAkECdGohAwJAAkACQCABQQJJDQAgAUF/aiEEA0AgA0EANgIAIANBBGohAyAEQX9qIgQNAAsgAiABakF/aiECDAELIAFFDQELIANBADYCACACQQFqIQILIAAgAjYCCAuRAQEDfwJAIAEgACgCACAAKAIIIgJrTQ0AIAAgAiABQQRBBBDOGSAAKAIIIQILIAAoAgQgAkECdGohAwJAAkACQCABQQJJDQAgAUF/aiEEA0AgA0EANgIAIANBBGohAyAEQX9qIgQNAAsgAiABakF/aiECDAELIAFFDQELIANBADYCACACQQFqIQILIAAgAjYCCAuRAQIBfwJ+IAEgASgCOEEEajYCOCABIACtIgMgASgCPCIAQQN0QThxrYYgASkDMIQiBDcDMAJAAkBBCCAAayICQQRLDQAgASABKQMYIASFNwMYIAEQrg0gASkDMCEEIAEgAyACQQN0rYg3AzAgASAEIAEpAwCFNwMAIABBfGohAAwBCyAAQQRqIQALIAEgADYCPAuZAQIDfwF+AkAgACgCCCIBRQ0AIAAoAgQhAANAIABBCGohAgJAAkAgACgCAA0AIAIpAwAiBEIDg0IAUg0BIASnIgIgAigCACIDQX9qNgIAIANBAUcNASACIAIoAhAQ6R0MAQsgAhCqEQsCQCAAQShqKAIAIgJFDQAgAhCWASACQcAAQQgQvRMLIABBMGohACABQX9qIgENAAsLC6MBAgF/AX4jAEEQayICJAACQAJAAkACQCAAKAIAIgApAwBCfnwiA0ICIANCAlQbpw4DAAECAAsgAiAAQQhqNgIEIAFB4p6aAUEJIAJBBGpBnwQQ5gshAAwCCyACIABBCGo2AgggAUHrnpoBQQcgAkEIakGgBBDmCyEADAELIAIgADYCDCABQfKemgFBBSACQQxqQaEEEOYLIQALIAJBEGokACAAC9MBAQJ/QQAhAkEAIQMCQCAAvUL///////////8Ag0L/////////9/8AVQ0AIACdIgAgAEQAAAAAAADwPaKdRAAAAAAAAPBBoqEgAKYiAEQAAAAAAADwQaAgACAARAAAAAAAAAAAYxv8AyEDCwJAIAG9Qv///////////wCDQv/////////3/wBVDQAgAZ0iACAARAAAAAAAAPA9op1EAAAAAAAA8EGioSAApiIARAAAAAAAAPBBoCAAIABEAAAAAAAAAABjG/wDQR9xIQILIAMgAnS3C9MBAQJ/QQAhAkEAIQMCQCAAvUL///////////8Ag0L/////////9/8AVQ0AIACdIgAgAEQAAAAAAADwPaKdRAAAAAAAAPBBoqEgAKYiAEQAAAAAAADwQaAgACAARAAAAAAAAAAAYxv8AyEDCwJAIAG9Qv///////////wCDQv/////////3/wBVDQAgAZ0iACAARAAAAAAAAPA9op1EAAAAAAAA8EGioSAApiIARAAAAAAAAPBBoCAAIABEAAAAAAAAAABjG/wDQR9xIQILIAMgAnW3C9MBAQJ/QQAhAkEAIQMCQCAAvUL///////////8Ag0L/////////9/8AVQ0AIACdIgAgAEQAAAAAAADwPaKdRAAAAAAAAPBBoqEgAKYiAEQAAAAAAADwQaAgACAARAAAAAAAAAAAYxv8AyEDCwJAIAG9Qv///////////wCDQv/////////3/wBVDQAgAZ0iACAARAAAAAAAAPA9op1EAAAAAAAA8EGioSAApiIARAAAAAAAAPBBoCAAIABEAAAAAAAAAABjG/wDQR9xIQILIAMgAna4C5cBAQF/QQAtAOD2nQEaAkBBwAAQhAEiAQ0AAAsgASAAKQMANwMAIAFBOGogAEE4aikDADcDACABQTBqIABBMGopAwA3AwAgAUEoaiAAQShqKQMANwMAIAFBIGogAEEgaikDADcDACABQRhqIABBGGopAwA3AwAgAUEQaiAAQRBqKQMANwMAIAFBCGogAEEIaikDADcDACABC5oBAgN/An4gASgCDCECIAEoAgAiAykDACEFAkACQCABKAIEIgENAEIAIQZBACEEDAELIAMgAUEEdGtBcGqtQiCGIAFBEWxBGWqthCEGQQghBAsgACAGNwIkIAAgBDYCICAAIAI2AhggACADNgIQIAAgA0EIajYCCCAAIAMgAWpBAWo2AgwgACAFQn+FQoCBgoSIkKDAgH+DNwMAC5cBAQF/IwBBEGsiAiQAAkACQCABKAIA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AA8LAkAgASACQd/RmwFBAxDCHkUNAEHrAA8LAkAgASACQbilmwFBBBDCHkUNAEGXAQ8LQaB/QaR/IAEgAkHUwZsBQQYQwh4bC9ABAQJ/QQAhAkEAIQMCQCAAvUL///////////8Ag0L/////////9/8AVQ0AIACdIgAgAEQAAAAAAADwPaKdRAAAAAAAAPBBoqEgAKYiAEQAAAAAAADwQaAgACAARAAAAAAAAAAAYxv8AyEDCwJAIAG9Qv///////////wCDQv/////////3/wBVDQAgAZ0iACAARAAAAAAAAPA9op1EAAAAAAAA8EGioSAApiIARAAAAAAAAPBBoCAAIABEAAAAAAAAAABjG/wDIQILIAIgA3K3C9ABAQJ/QQAhAkEAIQMCQCAAvUL///////////8Ag0L/////////9/8AVQ0AIACdIgAgAEQAAAAAAADwPaKdRAAAAAAAAPBBoqEgAKYiAEQAAAAAAADwQaAgACAARAAAAAAAAAAAYxv8AyEDCwJAIAG9Qv///////////wCDQv/////////3/wBVDQAgAZ0iACAARAAAAAAAAPA9op1EAAAAAAAA8EGioSAApiIARAAAAAAAAPBBoCAAIABEAAAAAAAAAABjG/wDIQILIAIgA3O3C9ABAQJ/QQAhAkEAIQMCQCAAvUL///////////8Ag0L/////////9/8AVQ0AIACdIgAgAEQAAAAAAADwPaKdRAAAAAAAAPBBoqEgAKYiAEQAAAAAAADwQaAgACAARAAAAAAAAAAAYxv8AyEDCwJAIAG9Qv///////////wCDQv/////////3/wBVDQAgAZ0iACAARAAAAAAAAPA9op1EAAAAAAAA8EGioSAApiIARAAAAAAAAPBBoCAAIABEAAAAAAAAAABjG/wDIQILIAIgA3G3C40BAQR/IwBBEGsiAyQAIANBCGogACgCACIEIAAoAgQgARC4FyADKAIIIQUgAy0ADCEGIAAgACgCDEEBajYCDCAAIAAoAgggBkEBcWs2AgggBEEAIAVrQRhsakFoaiIAIAIpAwA3AwAgAEEIaiACQQhqKQMANwMAIABBEGogAkEQaikDADcDACADQRBqJAALmAEBAn8jAEEQayIGJABBACEHAkACQAJAIAEtAMgBQYQBRw0AIAEQ4w4gBkEIaiABQQAgASgC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jAMQ5gshAAwBCyACIABBBGo2AgwgAUG9hZoBQQggAkEMakHjBRDmCyEACyACQRBqJAAgAAuWAQEBfyMAQRBrIgIkAAJAAkACQAJAIAAoAgAiACgCAA4DAAECAAsgAiAAQQhqNgIEIAFBrf+ZAUEIIAJBBGpB2AYQ5gshAAwCCyACIABBCGo2AgggAUHp2psBQQYgAkEIakHZBhDmCyEADAELIAIgAEEEajYCDCABQd/amwFBBCACQQxqQfIEEOYLIQALIAJBEGokACAAC5ABAQJ/AkAgAS0AGEUNAAJAAkAgASgCFCICRQ0AIAAoAhwgACgCICACKAIEQX9qEOUQIQIMAQsgACgCHCAAKAIgIAEoAhAQ0REhAgsgACACEIMfCyABKAIIQShsIQIgASgCBCEDAkADQCACRQ0BIAMgABCtICACQVhqIQIgA0EoaiEDDAALCyABKAIUIAAQ5h4LeQIBfwF+QQQhBAJAAkAgA0EETw0AQQAhBEIAIQUMAQsgACACajUAACEFCwJAIARBAXIgA08NACAAIAJqIARqMwAAIARBA3SthiAFhCEFIARBAnIhBAsCQCAEIANPDQAgACAEIAJqajEAACAEQQN0rYYgBYQhBQsgBQueAQACQAJAAkACQAJAIAEgAkHYh4ABQQcQwh4NACABIAJB34eAAUEIEMIeDQEgASACQeeHgAFBCBDCHg0CAkAgASACQe+HgAFBBhDCHg0AIAAgASACQfiHgAFBBBCGETYCBEEBIQIMBQsgAEEDOgABDAMLQQAhAiAAQQA6AAEMAwsgAEEBOgABDAELIABBAjoAAQtBACECCyAAIAI6AAALigEBA38jAEEQayICJAACQAJAAkAgASgCAEUNACABKAIEIgMgASgCDEYNASABIANBCGo2AgQgAygCBCEEIAMoAgAhAwwCCyABKAIEIgNFDQAgAkEIaiADIAEoAggiBCgCGBEHACABIAIpAwg3AgQMAQtBACEDCyAAIAQ2AgQgACADNgIAIAJBEGokAAuHAQECfyMAQYACayIDJAACQEGAAkUNACADQQBBgAL8CwALIAJBBHQhBCABQQhqIQICQANAAkAgAigCAEEBRg0AIABBAjoAAAwCCyADIAJBfGooAgAtAABqQQE6AAAgAkEQaiECIARBcGoiBA0AC0GAAkUNACAAIANBgAL8CgAACyADQYACaiQAC4wBAQN/IAAoAgAiAUEEaigCACEAAkAgASgCCCICRQ0AA0ACQAJAIAAoAgAiA0UNACADEJYBIANBwABBCBC9EwwBCyAAQQRqKAIAIgMQvwQgA0HwAEEIEL0TCyAAQQxqIQAgAkF/aiICDQALIAFBBGooAgAhAAsgASgCACAAQQRBDBC/EiABQRRBBBC9EwuMAQEEfwJAIAEtADRBAUcNACABLQA5IQIgAS0AOiEDAkAgACgCCCIERQ0AIAAoAgQhACAEQQJ0IQQDQAJAIAEtADRBAUcNACAAKAIAIQUgAUGBAjsAOSAFIAEQgAIgAUEBOgA6IAEgAjoAOQsgAEEEaiEAIARBfGoiBA0ACwsgASADOgA6IAEgAjoAOQsLhQECBH8BfgJAIAAoAgwiASAAKAIEIgJGDQAgASACa0EFdiEBA0ACQCACQRBqKQMAIgVCA4NCAFINACAFpyIDIAMoAgAiBEF/ajYCACAEQQFHDQAgAyADKAIQEOkdCyACEJoVIAJBIGohAiABQX9qIgENAAsLIAAoAgggACgCAEEIQSAQvxILggEBBH8jAEEQayICJAAgAkEIaiABKAIAIgMQ0QMgACACKAIMIgQgASgCDCIFIAQgBUkbIAQgBSAEIAVLGxDqGiACIAMQ0gMgACAAKAIcIAAoAiAgAigCBBCPISgCACIEIAUgBCAFSRsgBCAFIAQgBUsbEMoUIAEgABCBJCACQRBqJAALjwEBAn8jAEEwayICJABBASEDAkAgASgCAEEiIAEoAgQoAhARCAANACACIAE2AgxBASEDIAJBATYCFCACQZTzmwE2AhAgAkIBNwIcIAJBCzYCLCACIAA2AiggAiACQShqNgIYIAJBDGogAkEQahC5IQ0AIAEoAgBBIiABKAIEKAIQEQgAIQMLIAJBMGokACADC4MBAQF/IwBBEGsiByQAAkACQCAFQQFxRQ0AIAdBCGogBiABQQJqLQAAEOgcIAcoAgwhBSAHKAIIIQYMAQtBgQFBgAEgAS0AABshBUEAIQYLQQEhAQJAIAZBAXENACACIAMgBBCrBSAFEBJBACEBCyAAIAU2AgQgACABNgIAIAdBEGokAAt5AQN/IwBBgAFrIgIkAEGBASEDA0AgAiADakF+aiAAQQ9xIgRBMHIgBEE3aiAEQQpJGzoAACAAQf8BcSIEQQR2IQAgA0F/aiEDIARBD0sNAAsgAUEBQYDRmwFBAiACIANqQX9qQYEBIANrEO8FIQMgAkGAAWokACADC4UBAQR/IwBBEGsiBSQAIAVBBGogAiAEakEBakHw6YIBEMMTIAUoAgQhBiAFKAIIIgcgBSgCDCIIIAEgAiADIAQQmgEgBUEEakEIaiIEIAg2AgAgBSAHNgIIIAUgBjYCBCAFQQRqEKYJIABBCGogBCgCADYCACAAIAUpAgQ3AgAgBUEQaiQAC4sBAQF/IwBBIGsiAyQAIANBFGogASACEJUUIANBCGogA0EUahCyFwJAAkAgAygCEEUNACAAQQI6AAwgACADKQIINwIAIABBCGogA0EIakEIaigCADYCAAwBCyAAQQhqQQApAsjfggE3AgAgAEEAKQLA34IBNwIAIAMoAgggAygCDBDfIgsgA0EgaiQAC5ABAQN/IABBufPd8XlsIQECQANAAkBBACgCvPGdASIADQAQmRchAAsgAUEAIAAoAghrdiICIAAoAgQiA08NASAAKAIAIAJBBnRqIgIgAigCACIDQQEgAxs2AgACQCADRQ0AIAIQ5BILAkBBACgCvPGdASAARg0AIAIQ0R0MAQsLIAIPCyACIANB6NaDARDDEgALmAEBAn8jAEEQayICJAACQAJAAkAgAUF/TA0AIAFB9f///wdPDQFBAC0A4PadARogAUELakF8cUEEELUfIgNFDQIgA0KBgICAEDcCACAAIAE2AgQgACADNgIAIAJBEGokAA8LQbSqmwFBKyACQQ9qQajpgwFBuOmDARDqEAALQbSqmwFBKyACQQ9qQejIgAFBwMmAARDqEAsAC4QBAQJ/IwBBIGsiAyQAIANBFGogAUEEQQQQpA4gAygCGCEEAkAgAygCFEEBRw0AIAQgAygCHCACENggAAsgA0EIakEIaiICQQA2AgAgAyADKAIcNgIMIAMgBDYCCCADQQhqIAEQnA8gAEEIaiACKAIANgIAIAAgAykCCDcCACADQSBqJAALpQEBAX8jAEEgayIEJAACQEEAKAK46Z0BQQJGDQAgBEG46Z0BNgIIIARBvOmdATYCDCAEIARBH2o2AhggBCAEQQxqNgIUIAQgBEEIajYCEEG46Z0BIARBEGpBjLWYARDIBgsCQAJAQQAoArzpnQFBgICAgHhGDQAgAEEAKALA6Z0BQQAoAsTpnQEgAiADEKsJDAELIABBgICAgHg2AgALIARBIGokAAuSAQEBfwJAAkACQAJAIAAoAgAOAgECAAsgACgCBCIBEMgHIAFBKEEIEL0TIAAoAhgiAEUNAiAAKAIAIgEQwAIgAUHgAEEIEL0TIABBDEEEEL0TDwsgAEEIahDjDSAAKAIoIgAQyAcgAEEoQQgQvRMPCyAAQRBqEMwTIAAoAjAiAEUNACAAEJYBIABBwABBCBC9EwsLmwECA38BfgJAAkAgACkDACIEUA0AIAAoAhAhAQwBCyAAKAIQIQEgACgCCCECA0AgAUFAaiEBIAIpAwAhBCACQQhqIgMhAiAEQoCBgoSIkKDAgH+DIgRCgIGChIiQoMCAf1ENAAsgACABNgIQIAAgAzYCCCAEQoCBgoSIkKDAgH+FIQQLIAAgBEJ/fCAEgzcDACABIAR6p0H4AHFrC5QBAQJ/IwBBEGsiAiQAIAAoAgAiAEEEaiEDAkACQAJAAkAgACgCAA4DAAECAAsgAiADNgIEIAFB2tqbAUEFIAJBBGpBtAQQ5gshAAwCCyACIAM2AgggAUHj2psBQQYgAkEIakG2BBDmCyEADAELIAIgAzYCDCABQe/amwFBByACQQxqQY4DEOYLIQALIAJBEGokACAAC4gBAgF/AX4jAEEQayICJAACQCABLQAUQQJGDQAgAiABKQMAIAEoAhAQ5xogAikDACEDIAIgAigCCDYCCCACIAM3AwAgACACIAAtAEwgACgCSBCnAiADQgODQgBSDQAgA6ciASABKAIAIgBBf2o2AgAgAEEBRw0AIAEgASgCEBDpHQsgAkEQaiQAC5QBAQJ/IwBBEGsiAiQAIAAoAgAiAEEEaiEDAkACQAJAAkAgACgCAA4DAAECAAsgAiADNgIEIAFB2tqbAUEFIAJBBGpB8QQQ5gshAAwCCyACIAM2AgggAUHj2psBQQYgAkEIakHzBBDmCyEADAELIAIgAzYCDCABQe/amwFBByACQQxqQY4DEOYLIQALIAJBEGokACAAC48BAQN/IwBBIGsiASQAIABBBGooAgAhAiAAKAIAIgMoAgAhACADQQA2AgAgACgCDCEDIABBADYCDAJAIAMNACABQQA2AhggAUEBNgIMIAFBuIOdATYCCCABQgQ3AhAgAUEIakGg85sBEKgdAAsgAxEBACEAIAIoAgAiAyAANgIEIANBATYCACABQSBqJABBAQuRAQEBfwJAAkAgACgCACIAKAIAQQNGDQAgACgCICIBEMkBIAFBwABBCBC9EyAAEIEQDAELIAAoAhAiARDJASABQcAAQQgQvRMgAEEEahCaGiAAKAIEIABBCGooAgAQ+CIgACgCICIBRQ0AIAEQ5RogASgCACABQQRqKAIAEPEiIAFBFEEEEL0TCyAAQShBCBC9EwuJAQECfyMAQRBrIgYkAAJAAkAgBSgCAEGAgICAeEYNACAGQQhqIAUoAgQgBSgCCBDGICAGKAIMIQUgBigCCCEHDAELQYEBQYABIAEtAAAbIQVBACEHC0EBIQECQCAHQQFxDQAgAiADIAQQqwUgBRASQQAhAQsgACAFNgIEIAAgATYCACAGQRBqJAALdwEDfyMAQYABayICJABBgQEhAwNAIAIgA2pBfmogAEEPcSIEQTByIARBN2ogBEEKSRs6AAAgA0F/aiEDIABBD0shBCAAQQR2IQAgBA0ACyABQQFBgNGbAUECIAIgA2pBf2pBgQEgA2sQ7wUhACACQYABaiQAIAALeAEDfyMAQYABayICJABBgQEhAwNAIAIgA2pBfmogAEEPcSIEQTByIARB1wBqIARBCkkbOgAAIANBf2ohAyAAQQ9LIQQgAEEEdiEAIAQNAAsgAUEBQYDRmwFBAiACIANqQX9qQYEBIANrEO8FIQAgAkGAAWokACAAC3cBA38jAEGAAWsiAiQAQYEBIQMDQCACIANqQX5qIABBD3EiBEEwciAEQTdqIARBCkkbOgAAIANBf2ohAyAAQQ9LIQQgAEEEdiEAIAQNAAsgAUEBQYDRmwFBAiACIANqQX9qQYEBIANrEO8FIQAgAkGAAWokACAAC3gBA38jAEGAAWsiAiQAQYEBIQMDQCACIANqQX5qIABBD3EiBEEwciAEQdcAaiAEQQpJGzoAACADQX9qIQMgAEEPSyEEIABBBHYhACAEDQALIAFBAUGA0ZsBQQIgAiADakF/akGBASADaxDvBSEAIAJBgAFqJAAgAAuFAQEDfyMAQRBrIgMkAEEAIQQCQAJAIAJBAEgNAAJAIAINAEEAIQVBASEEDAILIANBCGogAhCWGyACIQUgAygCCCIEDQFBASEECyAEIAJBuOSbARDYIAALAkAgAkUNACAEIAEgAvwKAAALIAAgAjYCCCAAIAQ2AgQgACAFNgIAIANBEGokAAuEAQECfwJAAkACQCACIAAoAgAgACgCCCIDa00NACAAIAMgAkEBQQEQ1BkgACgCCCEDDAELIAJFDQELA0AgAyEEAkAgAyAAKAIARw0AIAAgA0EBQQFBARDUGSAAKAIIIQQLIAAgA0EBaiIDNgIIIAAoAgQgBGogAToAACACQX9qIgINAAsLC4wBAQJ/IwBBIGsiAyQAQYCAgIB4IQQCQCABQQNGDQAgA0IANwIYIANCgICAgMAANwIQIANBEGogAkHEAmooAgAQjREgA0EIaiADQRxqKAIANgIAIAMgAykCFDcDACADKAIQIQQLIAAgBDYCACAAIAMpAwA3AgQgAEEMaiADQQhqKAIANgIAIANBIGokAAuZAQECfyABKAKkDSgCxAIiAiACKAIAIgNBAWo2AgACQCADQX9KDQAACyAAIAIQ6xUgAEHoBGogASgCsAoQpg4gASgCyAohAiAAQdgEaiABKALkCiABKAKICxDbECAAQdgBaiABEM4NIABCADcD6AUgAEKAgICAwAA3A+AFIABCBDcD2AUgACACQQJGQR90NgLUBSAAQQI2AsgBC5kBAQJ/IAEoAqQNKALEAiICIAIoAgAiA0EBajYCAAJAIANBf0oNAAALIAAgAhDrFSAAQegEaiABKAKwChCmDiABKALICiECIABB2ARqIAEoAuQKIAEoAogLENsQIABB2AFqIAEQzg0gAEIANwPoBSAAQoCAgIDAADcD4AUgAEIENwPYBSAAIAJBAkZBH3Q2AtQFIABBAjYCyAELmQEBAn8gASgCpA0oAsQCIgIgAigCACIDQQFqNgIAAkAgA0F/Sg0AAAsgACACEOsVIABB6ARqIAEoArAKEKYOIAEoAsgKIQIgAEHYBGogASgC5AogASgCiAsQ2xAgAEHYAWogARDODSAAQgA3A+gFIABCgICAgMAANwPgBSAAQgQ3A9gFIAAgAkECRkEfdDYC1AUgAEECNgLIAQuXAQICfwF8IwBBMGsiAiQAAkACQCABKwMAIgREAAAAAAAAAABhDQACQAJAIAS9Qv///////////wCDQv/////////3/wBVDQAgBCACQRdqEIQCIAJBF2prIQEgAkEXaiEDDAELIAJBCGogBBDgGiACKAIMIQEgAigCCCEDCyAAIAMg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AwBCgIGChIiQoMCAf4N6p0EDdiEDCyADDwsgAyAEaiABcSEDIARBCGohBAwACwt7AQZ/IAEgASgCXCICQX9qIgM2AlwgASABKAJYIgRBAWoiBTYCWCABIAEoAmgiBkEBajYCaEERIQcCQCADRQ0AIAUtAABBPUcNACABIAZBAmo2AmggASACQX5qNgJcIAEgBEECajYCWEEjIQcLIABBADoAACAAIAc6AAELewEGfyABIAEoAlwiAkF/aiIDNgJcIAEgASgCWCIEQQFqIgU2AlggASABKAJoIgZBAWo2AmhBECEHAkAgA0UNACAFLQAAQT1HDQAgASAGQQJqNgJoIAEgAkF+ajYCXCABIARBAmo2AlhBIiEHCyAAQQA6AAAgACAHOgABC3sBBn8gASABKAJcIgJBf2oiAzYCXCABIAEoAlgiBEEBaiIFNgJYIAEgASgCaCIGQQFqNgJoQRUhBwJAIANFDQAgBS0AAEE9Rw0AIAEgBkECajYCaCABIAJBfmo2AlwgASAEQQJqNgJYQSghBwsgAEEAOgAAIAAgBzoAAQudAQECfwJAA0BBACECAkACQAJAAkAgACgCACIDKAIAQXRqIgBBByAAQSZJGw4mBQUFBQUFBQUAAQUFBQUCBQUFBQUFBQUDBQUFBQUDBQMDAwMFBQUFCyADQShqIQAgAygCKCgCACIDQRRGDQMgA0EwRg0EC0EBIQIMAwtBASECIAFFDQIgA0EIahCOCkEBcw8LIANBBGohAAwACwsgAguIAQEDfyMAQSBrIgEkACAAKAIAIgIoAgAhAyACQQA2AgAgAygCDCECIANBADYCDAJAIAINACABQQA2AhggAUEBNgIMIAFBuIOdATYCCCABQgQ3AhAgAUEIakGg85sBEKgdAAsgAhEBACEDIAAoAgQoAgAiACADNgIEIABBATYCACABQSBqJABBAQt+AgN/AX4gACgCECEBIAAoAgghAiAAKQMAIQQDfwJAIARQDQAgACAEQn98IASDNwMAIAFBACAEeqdBA3ZrQRhsag8LIAAgAUHAfmoiATYCECAAIAJBCGoiAzYCCCAAIAIpAwBCf4VCgIGChIiQoMCAf4MiBDcDACADIQIMAAsLewECfyABIAKncSEDQQghBAJAA0AgACADaikAAEKAgYKEiJCgwIB/gyICQgBSDQEgAyAEaiABcSED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AUF/ajYCACABQQFHDQEgACAAKAIQEOkdDwsgABD4DwsLfQEBfwJAAkACQAJAAkAgACgCAA4FBAABAgMECyAAKAIEQQFHDQMgACgCCCABEI0BDwsgACgCBCABEI0BDwsgASAAKAIEEN8HDwsgACgCDCICRQ0AIAAoAgghACACQShsIQIDQCABIAAQ5AYgAEEoaiEAIAJBWGoiAg0ACwsLZQEDf0EAIQMCQCABRQ0AA0ACQCABQQFLDQAgACADQQxsaigCACIBIAJGDQIgAyABIAJJaiEDDAILIAMgAUEBdiIEIANqIgUgACAFQQxsaigCACACSxshAyABIARrIQEMAAsLIAMLegEBfyAAKAIIQShsIQIgACgCBCEAAkADQCACRQ0BAkACQAJAAkACQCAAKAIADgUEAAECAwQLIABBBGogARDHHwwDCyAAQQRqIAEQgSQMAgsgAEEEaiABEIUODAELIABBBGogARDSEQsgAEEoaiEAIAJBWGohAgwACwsLegEBfyAAKAIIQShsIQIgACgCBCEAAkADQCACRQ0BAkACQAJAAkACQCAAKAIADgUEAAECAwQLIABBBGogARDJHwwDCyAAQQRqIAEQhiQMAgsgAEEEaiABEIYODAELIABBBGogARDTEQsgAEEoaiEAIAJBWGohAgwACwsLegEBfyAAKAIIQShsIQIgACgCBCEAAkADQCACRQ0BAkACQAJAAkACQCAAKAIADgUEAAECAwQLIABBBGogARDOHwwDCyAAQQRqIAEQxwQMAgsgAEEEaiABELkODAELIABBBGogARDUEQsgAEEoaiEAIAJBWGohAgwACwsLdgEBfyAAKAIIQThsIQIgACgCBCEAA0ACQAJAIAJFDQACQAJAAkAgACgCAA4DAAECAAsgAEEIaiABENAfIABBKGogARCSJAwDCyABIABBMGoQoiEMAgsgAEEEaiABEJIkDAELDwsgAEE4aiEAIAJBSGohAgwACwt0AgV/AX4gACgCBCEBAkAgACgCCCICRQ0AIAEhAwNAAkAgAykDACIGQgODQgBSDQAgBqciBCAEKAIAIgVBf2o2AgAgBUEBRw0AIAQgBCgCEBDpHQsgA0EIaiEDIAJBf2oiAg0ACwsgACgCACABQQhBCBC/EguGAQEBfyMAQSBrIgIkACACQQA2AgggAkKAgICAEDcCACACQYDUmwE2AhAgAkKggICADjcCFCACIAI2AgwCQCABIAJBDGoQnB1FDQBBmNSbAUE3IAJBH2pBpKqbAUHQ1JsBEOoQAAsgACACKQIANwIAIABBCGogAkEIaigCADYCACACQSBqJAALdgIDfwF+IwBBEGsiAyQAIAEoAhQhBCABKAIQIQUgAyABQQhqEJQTIANBCGogAiAFIAQgAygCACADKAIEEJUOAkACQCADLQAIQQRGDQAgAykDCCIGQv8Bg0IEUQ0AIAAgBjcCAAwBCyAAQQQ6AAALIANBEGokAAuGAQEBfyMAQSBrIgIkACACQQA2AgggAkKAgICAEDcCACACQYDUmwE2AhAgAkKggICADjcCFCACIAI2AgwCQCABIAJBDGoQ6yNFDQBBmNSbAUE3IAJBH2pBpKqbAUHQ1JsBEOoQAAsgACACKQIANwIAIABBCGogAkEIaigCADYCACACQSBqJAALeQEBfyMAQRBrIgIkACACIAAoAgAiAEEkajYCDCABQZzEgAFBCEHwg5oBQQQgAEEoakE2QaTEgAFBBSAAQQhqQTdBqcSAAUEFIABBFGpBOEG86oMBQQsgAEEgakEpQa7EgAFBEyACQQxqQSoQiwwhACACQRBqJAAgAAtsAQF/IwBBIGsiAiQAIAJBCGogAUG0A2pBAEEAEI4IAkAgAigCCCIBQQNGDQAgACACKQIMNwIEIABBFGogAkEIakEUaigCADYCACAAQQxqIAJBCGpBDGopAgA3AgALIAAgATYCACACQSBqJAALhQECAn8CfCABKAIIIgJBgICAAXEhAyAAKwMAIQQCQCACQYCAgIABcQ0AAkAgBJkiBUQAgOA3ecNBQ2YNACAERAAAAAAAAAAAYiAFRC1DHOviNho/Y3ENACABIAQgA0EAR0EBEI0FDwsgASAEIANBAEcQtgQPCyABIAQgA0EARyABLwEOEHELZgEFfiAAIAApAxgiAUIQiSABIAApAwh8IgGFIgIgACkDECIDIAApAwB8IgRCIIl8IgU3AwAgACACQhWJIAWFNwMYIAAgASADQg2JIASFIgJ8IgEgAkIRiYU3AxAgACABQiCJNwMIC3EBAn8CQAJAAkAgASgCFCICRQ0AIAEoAhAgAkEDdGoiAkF4ag0BCyABKAIIIQNBACECDAELIAJBfGooAgAiAiABKAIIIgNNDQAgAiADQci4hAEQ0SIACyAAIAMgAms2AgQgACABKAIEIAJBA3RqNgIAC34BAX8gABDCDCAAKALAEiIBIAEoAgAiAUF/ajYCAAJAIAFBAUcNACAAKALAEiAAKALEEhDsEAsgACgC0BIiASABKAIAIgFBf2o2AgACQCABQQFHDQAgACgC0BIQ1RsLAkAgACkDsA1CAoUgACkDuA2EUA0AIABBsA1qEPEcCwt0AQJ/QRAhAQJAAkACQCAAKAIIQX5qIgJBBiACQQlJG0F+ag4FAgICAgEAC0EEIQELIABBCGogAWoiAigCACACQQRqKAIAEL0iCwJAIABBf0YNACAAIAAoAgQiAkF/ajYCBCACQQFHDQAgAEHQAEEEEL0TCwt2AQF/IwBBEGsiBCQAIARBCGogACgCAEEIakGguJgBEKYcIAQoAgwhAAJAAkAgBCgCCCABELAYIgFFDQAgAiADIAEoAgQgASgCCBCUBCEBDAELIAIgA0EIQQAQlAQhAQsgACAAKAIAQX9qNgIAIARBEGokACABC3IBAn8jAEEQayIDJAAgA0EIaiABIAIQxAwgAygCDCEBAkACQAJAIAMoAghBAXFFDQAgAEEANgIAIAAgATYCBAwBCyABRQ0BIAEoAnQhBCAAIAE2AgAgACACIARrNgIECyADQRBqJAAPC0GMvZgBEMkiAAt/AgR/AX5BAC0A4PadARogASgCDCECIAEoAgghAwJAQcAAEIQBIgRFDQAgBCABKAIAEEVBAC0A4PadARpBFBCEASIFRQ0AIAEoAgQiASkCDCEGIAUgARCFDCAAIAI2AgwgACADNgIIIAUgBjcCDCAAIAU2AgQgACAENgIADwsAC3ACAn8BfgJAIAApAwAiA0IDg0IAUg0AIAOnIgEgASgCACICQX9qNgIAIAJBAUcNACABIAEoAhAQ6R0LAkAgACkDCCIDQgODQgBSDQAgA6ciACAAKAIAIgFBf2o2AgAgAUEBRw0AIAAgACgCEBDpHQsLcAICfwF+AkAgACkDACIDQgODQgBSDQAgA6ciASABKAIAIgJBf2o2AgAgAkEBRw0AIAEgASgCEBDpHQsCQCAAKQMQIgNCA4NCAFINACADpyIAIAAoAgAiAUF/ajYCACABQQFHDQAgACAAKAIQEOkdCwtwAgJ/AX4CQCAAKQMAIgNCA4NCAFINACADpyIBIAEoAgAiAkF/ajYCACACQQFHDQAgASABKAIQEOkdCwJAIAApAxAiA0IDg0IAUg0AIAOnIgAgACgCACIBQX9qNgIAIAFBAUcNACAAIAAoAhAQ6R0LC3cBAX8gAEEIahCrEQJAIAAtADRBA0YNACAAQSBqELoPCwJAIAAoAjgiAUUNACABEOUaIAEoAgAgAUEEaigCABDxIiABQRRBBBC9EwsCQCAAKAI8IgBFDQAgABCiFCAAKAIAIABBBGooAgAQ9SIgAEEUQQQQvRMLC3QBA38gACgCDCIBIAAoAgQiAmtBKG4hAwJAIAEgAkYNAANAAkACQCACKAIAQQdHDQAgAkEQaigCACIBEK0BIAFBwABBCBC9EwwBCyACEP8KCyACQShqIQIgA0F/aiIDDQALCyAAKAIIIAAoAgBBCEEoEL8SC3ACAn8BfgJAIAApAwAiA0IDg0IAUg0AIAOnIgEgASgCACICQX9qNgIAIAJBAUcNACABIAEoAhAQ6R0LAkAgACkDECIDQgODQgBSDQAgA6ciACAAKAIAIgFBf2o2AgAgAUEBRw0AIAAgACgCEBDpHQsLdwEBfyAAQQhqEKoRAkAgAC0ANEEDRg0AIABBIGoQuQ8LAkAgACgCOCIBRQ0AIAEQ5RogASgCACABQQRqKAIAEPEiIAFBFEEEEL0TCwJAIAAoAjwiAEUNACAAEKIUIAAoAgAgAEEEaigCABD1IiAAQRRBBBC9EwsLcAICfwF+AkAgACkDACIDQgODQgBSDQAgA6ciASABKAIAIgJBf2o2AgAgAkEBRw0AIAEgASgCEBDpHQsCQCAAKQMQIgNCA4NCAFINACADpyIAIAAoAgAiAUF/ajYCACABQQFHDQAgACAAKAIQEOkdCwtpAQR/QQAhAkEAIAFBAXYiA2shBCABQQxsIABqQXRqIQUgAUECSSEBAkADQCAEIAJGDQEgAkF/aiECAkAgAQ0AIAAgBUEDEKQaIABBDGohACAFQXRqIQUMAQsLIAIgA0Hs1psBEMMSAAsLcwEEfyMAQRBrIgMkACABIAEoAngiBEGAIHI2AnhBACEFQQAhBgJAIAEtAMgBIAJB/wFxRw0AIAEQ4w4gA0EIaiABENcEIAMoAghBAXEhBiADKAIMIQULIAEgBDYCeCAAIAU2AgQgACAGNgIAIANBEGokAAt2AQN/QQEhAgJAIABBBGogASgCACIDIAEoAgQiBBCtAg0AIAAoAgAgARD/CQ0AAkAgAC0ABUEERw0AIAAtAAlB/wFxQQRHDQAgAC0ABA0AQQAhAiAALQANQf8BcUUNAQsgA0H93YIBQQQgBCgCDBEMACECCyACC3gBAX9BASECAkAgAEEEaiABKAIAIAEoAgQQrQINACAAKAIAIAEQyiINAAJAIAAtAAVBBEcNACAALQAJQf8BcUEERw0AIAAtAAQNAEEAIQIgAC0ADUH/AXFFDQELIAEoAgBB/d2CAUEEIAEoAgQoAgwRDAAhAgsgAgtkAQN/IAMgASADIAFJGyEBQQAhAwJAA0AgAUUNASACIAAoAgAiBCACKAIAIgVrIgYgA0H/AXEiA2s2AgAgBCAFSSAGIANJciEDIAFBf2ohASACQQRqIQIgAEEEaiEADAALCyADC30BAX8CQAJAAkACQAJAIAEoAgAOBAABAgMACyABKAIEIQFBACECDAMLIAEoAgQhAUEBIQIMAgsgASgCCCIBIAEoAgBBiIDEAEYiAkECdGohAQwBCyABKAIIIgEgASgCAEGIgMQARiICQQJ0aiEBCyAAIAE2AgQgACACNgIAC3UBBH8CQAJAIAEoAgAiAyABKAIIIgRNDQAgASgCBCEFAkACQCAEDQBBASEGIAUgA0EBEL0TDAELIAUgA0EBIAQQ7wMiBkUNAgsgASAENgIAIAEgBjYCBAsgACAENgIEIAAgASgCBDYCAA8LQQEgBCACENggAAt1AQN/QQEhAwJAAkAgAkEBdCIEIAJyQX9MDQACQAJAIAQNAEEAIQUMAQtBAC0A4PadARogBBCEASIDRQ0CIAIhBQsCQCAERQ0AIAMgASAE/AoAAAsgACACNgIIIAAgAzYCBCAAIAU2AgAPC0G45JsBEIEcCwALeQEDf0EAIQICQAJAAkACQAJAIAEoAgAiA0F6ag4CAgEACyADDQMgASgCBCEEQQEhAgwDCyABKAIMQQFGDQEMAgsgASgCDEEBRw0BIAEoAggoAgAhBEEBIQIMAQsgASgCCCgCACEEQQEhAgsgACAENgIEIAAgAjYCAAtwAAJAAkAgBSAESQ0AIAUgA0sNAUEAIQMCQCACIARqIAUgBGsgASgCPCABKAJAIgUQyh5FDQAgACAENgIEIAAgBSAEajYCCEEBIQMLIAAgAzYCAA8LIAQgBUHc14QBENciAAsgBSADQdzXhAEQvCIAC2cBAX8CQCABIANHDQAgAUEBaiEBA0ACQCABQX9qIgENAEEBDwsgAC0AACACLQAARw0BIAJBAWohAyAAQQFqIQQgAkECaiECIABBAmohACAELQAAQf8BcSADLQAAQf8BcUYNAAsLQQALdwEBfyMAQSBrIgIkAAJAIAEoAgBBCkYNACACQQE2AgQgAkGosIUBNgIAIAJCATcCDCACQfgANgIcIAIgATYCGCACIAJBGGo2AgggAkGwsIUBEKgdAAsgACABKQIENwIAIABBCGogAUEMaikCADcCACACQSBqJAALdwEBfyMAQSBrIgIkAAJAIAEoAgBBCUYNACACQQE2AgQgAkHgr4UBNgIAIAJCATcCDCACQfgANgIcIAIgATYCGCACIAJBGGo2AgggAkHor4UBEKgdAAsgACABKQIENwIAIABBCGogAUEMaikCADcCACACQSBqJAALcQEEfyABKAIEIQIgASgCACEDAkAgASgCCCIBIAAoAgAgACgCCCIEa00NACAAIAQgAUEIQRgQzRkgACgCCCEECwJAIAFBGGwiBUUNACAAKAIEIARBGGxqIAIgBfwKAAALIAAgBCABajYCCCADIAIQ7CILcwEDfyABKAIAIQJBACEDIAFBADYCAAJAAkAgAkEBcUUNACABKAIIIQMgASgCBCECDAELAkAgASgCDCIEIAEoAhBHDQAMAQsgASAEQQFqNgIMIAEgASgCFCICQQFqNgIUIAQhAwsgACADNgIEIAAgAjYCAAt+AQF/IwBBEGsiAiQAIAIgACgCACgCACIANgIMIAFB6YOaAUEHQdD8mQFBBCAAQQxqQYACQbCBmgFBBCAAQRRqQZsDQfCDmgFBBCAAQRlqQYMEQb6mmwFBByAAQRhqQdECQfSDmgFBBSACQQxqQYQEEIsMIQAgAkEQaiQAIAALfgEBfyMAQRBrIgIkACACIAAoAgAoAgAiAEEkajYCDCABQbqemgFBD0HQ/JkBQQQgAEGAAkG+ppsBQQcgAEEoakHRAkHzk5oBQQIgAEEIakHyA0HYgZoBQQsgAEEgakGrAkHAg5oBQQggAkEMakGvAhCLDCEAIAJBEGokACAAC34BAX8jAEEQayICJAAgAiAAKAIAKAIAIgBBIGo2AgwgAUG9lZoBQQpB0PyZAUEEIABBGGpBgAJBvqabAUEHIABBLGpB0QJBx5WaAUEIIABBLWpB0QJB85OaAUECIABB8gNBwJSaAUEHIAJBDGpBhQQQiwwhACACQRBqJAAgAAuAAQEBfyMAQRBrIgIkACACIAAoAgAoAgAiADYCDCABQdahmgFBEkHQ/JkBQQQgAEEgakGAAkHooZoBQQkgAEHAAGpB0QJB8aGaAUEMIABBwQBqQdECQfOTmgFBAiAAQShqQfIDQf2hmgFBCiACQQxqQZoEEIsMIQAgAkEQaiQAIAALeAACQAJAAkAgAA4CAQIACyABEP8KIAFBKEEIEL0TDwsgAUEEaiIAKAIAIAFBCGooAgAQ+BkgASgCACAAKAIAEO8iIAFBHEEEEL0TDwsgAUEEaiIAKAIAIAFBCGooAgAQ+BkgASgCACAAKAIAEO8iIAFBGEEEEL0TC2wCAX8BfiMAQSBrIgIkAAJAIAAtAChFDQAgAkEIaiABQQhqEOgSIAAgAikDCCIDIAIoAhgQiRAgA0IDg0IAUg0AIAOnIgAgACgCACIBQX9qNgIAIAFBAUcNACAAIAAoAhAQ6R0LIAJBIGokAAtuAQF/AkACQCABQgODQgBSDQAgAaciAyADKAIAIgNBAWo2AgAgA0F/TA0BCwJAIAAoAggiAyAAKAIARw0AIABBtKeaARCDGQsgACADQQFqNgIIIAAoAgQgA0EEdGoiACACNgIIIAAgATcDAA8LAAt4AAJAAkACQCAADgIBAgALIAEQ9wogAUEoQQgQvRMPCyABQQRqIgAoAgAgAUEIaigCABD4GSABKAIAIAAoAgAQ7yIgAUEcQQQQvRMPCyABQQRqIgAoAgAgAUEIaigCABD4GSABKAIAIAAoAgAQ7yIgAUEYQQQQvRMLfgEBfyMAQRBrIgIkACACIAAoAgAoAgAiADYCDCABQemDmgFBB0HQ/JkBQQQgAEEMakGAAkGwgZoBQQQgAEEUakGbA0Hwg5oBQQQgAEEZakGDBEG+ppsBQQcgAEEYakHRAkH0g5oBQQUgAkEMakGIBhCLDCEAIAJBEGokACAAC34BAX8jAEEQayICJAAgAiAAKAIAKAIAIgBBJGo2AgwgAUG6npoBQQ9B0PyZAUEEIABBgAJBvqabAUEHIABBKGpB0QJB85OaAUECIABBCGpB8gNB2IGaAUELIABBIGpBiQZBwIOaAUEIIAJBDGpBrQUQiwwhACACQRBqJAAgAAt+AQF/IwBBEGsiAiQAIAIgACgCACgCACIAQSBqNgIMIAFBvZWaAUEKQdD8mQFBBCAAQRhqQYACQb6mmwFBByAAQSxqQdECQceVmgFBCCAAQS1qQdECQfOTmgFBAiAAQfIDQcCUmgFBByACQQxqQYoGEIsMIQAgAkEQaiQAIAALgAEBAX8jAEEQayICJAAgAiAAKAIAKAIAIgA2AgwgAUHWoZoBQRJB0PyZAUEEIABBIGpBgAJB6KGaAUEJIABBwABqQdECQfGhmgFBDCAAQcEAakHRAkHzk5oBQQIgAEEoakHyA0H9oZoBQQogAkEMakGcBhCLDCEAIAJBEGokACAAC2sBBH8CQCABIAAoAggiAigCACAAKAIQIgMgACgCDCIEaiIFa00NACACIAUgAUEIQTgQzRkLIAQgAWohAQJAIANBOGwiA0UNACACKAIEIgIgAUE4bGogAiAEQThsaiAD/AoAAAsgACABNgIMC3gAAkACQAJAIAAOAgECAAsgARCCCyABQShBCBC9Ew8LIAFBBGoiACgCACABQQhqKAIAEPgZIAEoAgAgACgCABDvIiABQRxBBBC9Ew8LIAFBBGoiACgCACABQQhqKAIAEPgZIAEoAgAgACgCABDvIiABQRhBBBC9EwtrAQR/AkAgASAAKAIIIgIoAgAgACgCECIDIAAoAgwiBGoiBWtNDQAgAiAFIAFBCEEwEM0ZCyAEIAFqIQECQCADQTBsIgNFDQAgAigCBCICIAFBMGxqIAIgBEEwbGogA/wKAAALIAAgATYCDAt4AAJAAkACQCAADgIBAgALIAEQ+AogAUEoQQgQvRMPCyABQQRqIgAoAgAgAUEIaigCABD4GSABKAIAIAAoAgAQ7yIgAUEcQQQQvRMPCyABQQRqIgAoAgAgAUEIaigCABD4GSABKAIAIAAoAgAQ7yIgAUEYQQQQvRMLbAEDfyMAQRBrIgIkACACQQhqIAEoAgwQ0gMgAigCDCEDAkACQCABKAIAQQFGDQAgAigCCCEBDAELIAEoAgQiBCADIAQgA0kbIQEgBCADIAQgA0sbIQMLIAAgATYCACAAIAM2AgQgAkEQaiQAC3cDAX8BfgF8IwBBEGsiASQAIAApAwghAiAAQQo2AgggAUEIaiAAQRBqKQMANwMAIAEgAjcDAAJAAkAgAqciAEEKRg0AIABBB0YNAQsgARClE0GSqZsBQShB3MebARCMGgALIAErAwghAyABEKUTIAFBEGokACADC2wBAX8CQCAAKAIIIgMgACgCAEcNACAAIAIQ5xcLIAAgA0EBajYCCCAAKAIEIANBBXRqIgAgASkCADcCACAAQQhqIAFBCGopAgA3AgAgAEEQaiABQRBqKQIANwIAIABBGGogAUEYaikCADcCAAtoAQN/AkAgASAAKAIIIgJNDQAgACABIAJrIgMQkx4gA0F/aiEBIAAoAgQgACgCCCIEQQJ0aiECAkADQCACQQA2AgAgAUUNASABQX9qIQEgAkEEaiECDAALCyAEIANqIQELIAAgATYCCAttAQF/IwBBIGsiBSQAAkAgAiADTw0AIAVBADYCGCAFQQE2AgwgBUGU1psBNgIIIAVCBDcCECAFQQhqIAQQqB0ACyAAIAM2AgQgACABNgIAIAAgAiADazYCDCAAIAEgA0ECdGo2AgggBUEgaiQAC20BAX8jAEEgayIFJAACQCACIANPDQAgBUEANgIYIAVBATYCDCAFQZTWmwE2AgggBUIENwIQIAVBCGogBBCoHQALIAAgAzYCBCAAIAE2AgAgACACIANrNgIMIAAgASADQQJ0ajYCCCAFQSBqJAALbAECf0EAIQNBACEEAkACQCACRQ0AIAJBf2oiBCABTw0BIAAgBGotAABB1OeEAWotAAAhBAsCQCACIAFPDQAgACACai0AAEHU54QBai0AACEDCyAEIANzQX9zQQFxDwsgBCABQcTShAEQwxIAC3ABA38gACgCCCECIABBBBCXHiAAKAIEIgMgACgCCCIEakEANgAAIAAgBEEEaiIENgIIAkACQCAEIAJJDQAgBCACayIAQQNNDQEgAyACaiABNgAADwsgAiAEQczfhAEQ0SIAC0EEIABB/NuEARC8IgALZwEBfyMAQTBrIgQkACAEQSBqIAFCACAAQgAQ5xAgBEEQaiACQgAgAEIAEOcQIAQgBCkDKCIAIAQpAxB8IgEgBCkDGCABIABUrXwgA0H/AHFBwABzEKgTIAQpAwAhACAEQTBqJAAgAAt/AQJ/IwBBEGsiBCQAQQBBACgC6PWdASIFQQFqNgLo9Z0BAkAgBUEASA0AAkACQEEALQDg9Z0BDQBBAEEAKALc9Z0BQQFqNgLc9Z0BQQAoAoTynQFBf0oNAQwCCyAEQQhqIAAgAREHAAALQQBBADoA4PWdASACRQ0AEP0kAAsAC3QBAX8jAEEQayIDJAAgA0EIaiABKAIAQQhqQaS2mAEQphwgAygCDCEBAkACQCADKAIIIAIQsBgiAkUNACAAIAJBBGooAgAgAkEIaigCABCVCgwBCyAAQYCAgIB4NgIACyABIAEoAgBBf2o2AgAgA0EQaiQAC3QBAX8jAEEQayIDJAAgA0EIaiABKAIEQQhqQZS3mAEQphwgAygCDCEBAkACQCADKAIIIAIQsBgiAkUNACAAIAJBBGooAgAgAkEIaigCABCVCgwBCyAAQYCAgIB4NgIACyABIAEoAgBBf2o2AgAgA0EQaiQAC28CAX8BfgJAAkACQAJAIAAtACxBfWoiAUEBIAFB/wFxQQNJG0H/AXEOAgECAAsgABDlEQ8LIAApAwAiAkIDg0IAUg0BIAKnIgAgACgCACIBQX9qNgIAIAFBAUcNASAAIAAoAhAQ6R0PCyAAEPgPCwtzAgJ/AX4CQCAAKQMIIgNCA4NCAFINACADpyIBIAEoAgAiAkF/ajYCACACQQFHDQAgASABKAIQEOkdCwJAIAAoAiAiAUUNACABEMACIAFB4ABBCBC9EwsCQCAAKAIkIgBFDQAgABDAAiAAQeAAQQgQvRMLC28CAX8BfgJAAkACQAJAIAAtACxBfWoiAUEBIAFB/wFxQQNJG0H/AXEOAgECAAsgABDmEQ8LIAApAwAiAkIDg0IAUg0BIAKnIgAgACgCACIBQX9qNgIAIAFBAUcNASAAIAAoAhAQ6R0PCyAAEPoPCwtzAgJ/AX4CQCAAKQMIIgNCA4NCAFINACADpyIBIAEoAgAiAkF/ajYCACACQQFHDQAgASABKAIQEOkdCwJAIAAoAiAiAUUNACABENUDIAFB4ABBCBC9EwsCQCAAKAIkIgBFDQAgABDVAyAAQeAAQQgQvRMLC3sBAX8jAEEQayICJAAgAiAAKAIAIgBBDGo2AgwgAUHfkZoBQRFB0PyZAUEEIABBEGpBgAJB956aAUEKIABBzgJBgZ+aAUEMIABBBGpBzgJBjZ+aAUEJIABBCGpBzgJBlp+aAUEKIAJBDGpBrwIQiwwhACACQRBqJAAgAAt7AQF/IwBBEGsiAiQAIAIgACgCACIAQTxqNgIMIAFB05KaAUEMQdD8mQFBBCAAQYACQb2DmgFBAyAAQQhqQdUCQbKamgFBCSAAQSBqQdYCQZyEmgFBCSAAQThqQdcCQbuamgFBCiACQQxqQdgCEIsMIQAgAkEQaiQAIAALewEBfyMAQRBrIgIkACACIAAoAgAiAEEkajYCDCABQYGFmgFBCEHQ/JkBQQQgAEEYakGAAkGwgZoBQQQgAEEgakGbA0GShJoBQQYgAEEMakGcA0GYhJoBQQQgAEGdA0GchJoBQQkgAkEMakHIAhCLDCEAIAJBEGokACAAC3sBAX8jAEEQayICJAAgAiAAKAIAIgBBHGo2AgwgAUGLhJoBQQdB0PyZAUEEIABBEGpBgAJBsIGaAUEEIABBGGpBmwNBkoSaAUEGIABBDGpBlQNBmISaAUEEIABBngNBnISaAUEJIAJBDGpByAIQiwwhACACQRBqJAAgAAt7AQF/IwBBEGsiAiQAIAIgACgCACIAQQRqNgIMIAFB5/2ZAUEJQdD8mQFBBCAAQQhqQYACQbCBmgFBBCAAQRBqQZsDQaWHmgFBAyAAQZUDQdiBmgFBCyAAQRRqQdcCQaiHmgFBAyACQQxqQasDEIsMIQAgAkEQaiQAIAALewEBfyMAQRBrIgIkACACIAAoAgAiAEEcajYCDCABQaWEmgFBB0HQ/JkBQQQgAEEQakGAAkGwgZoBQQQgAEEYakGbA0GShJoBQQYgAEEMakGVA0GYhJoBQQQgAEGdA0GchJoBQQkgAkEMakHIAhCLDCEAIAJBEGokACAAC3sBAX8jAEEQayICJAAgAiAAKAIAIgBBEGo2AgwgAUGNjJoBQRBBkIaaAUEGIABBqgJBwIOaAUEIIABBDGpB1gNB4qabAUEIIABBGGpB0QJB34iaAUEJIABBGWpB0QJB0PyZAUEEIAJBDGpBhgIQiwwhACACQRBqJAAgAAt7AQF/IwBBEGsiAiQAIAIgACgCACIAQQhqNgIMIAFBzISaAUEHQdD8mQFBBCAAQQxqQYACQdOEmgFBBCAAQfkDQd6DmgFBBCAAQRRqQa0DQdeEmgFBBiAAQRhqQa0DQb6BmgFBBCACQQxqQfADEIsMIQAgAkEQaiQAIAALewEBfyMAQRBrIgIkACACIAAoAgAiAEEMajYCDCABQZGImgFBCUHQ/JkBQQQgAEEQakGAAkHlhZoBQQggAEEYakHRAkGChJoBQQQgAEH6A0GGhJoBQQUgAEEIakGVA0G+gZoBQQQgAkEMakHwAxCLDCEAIAJBEGokACAAC3sBAX8jAEEQayICJAAgAiAAKAIAIgBBIGo2AgwgAUGcnpoBQQ9B0PyZAUEEIABBgAJBvqabAUEHIABBJGpB0QJBxaabAUEGIABBJWpB0QJB85OaAUECIABBCGpB8gNBvoGaAUEEIAJBDGpBiQQQiwwhACACQRBqJAAgAAt7AQF/IwBBEGsiAiQAIAIgACgCACIAQRhqNgIMIAFBjJqaAUELQdD8mQFBBCAAQQxqQYACQaSWmgFBCiAAQZYEQaGVmgFBAyAAQRRqQZcEQaSVmgFBCSAAQRxqQdECQbXMmwFBBCACQQxqQZgEEIsMIQAgAkEQaiQAIAALfgEBfyMAQRBrIgIkACACIAAoAgAiAEHIAGo2AgwgAUHxipoBQQpB0PyZAUEEIABB4ABqQYACQdyImgFBAyAAQb0EQfuKmgFBCiAAQSBqQckEQYWLmgFBBSAAQegAakG4BEG+gZoBQQQgAkEMakH4AxCLDCEAIAJBEGokACAAC3sBAX8jAEEQayICJAAgAiAAKAIAIgBBHGo2AgwgAUGgn5oBQRFB0PyZAUEEIABBEGpBgAJBkIaaAUEGIABBqgJB2IGaAUELIABBGGpBqwJBwIOaAUEIIABBDGpB2wRBzYGaAUELIAJBDGpBoQMQiwwhACACQRBqJAAgAAtyAQN/IwBBEGsiAiQAIAEtACghAyABQQA6ACggAS0AeSEEIAFBADoAeQJAIAAoAgBBGkcNACACIAApAwggACgCGBDnGiABQSxqIAIpAwAgAigCCBCQCwsgACABEHggASADOgAoIAEgBDoAeSACQRBqJAALcwICfwF+AkAgACkDCCIDQgODQgBSDQAgA6ciASABKAIAIgJBf2o2AgAgAkEBRw0AIAEgASgCEBDpHQsCQCAAKAIgIgFFDQAgARDXAyABQeAAQQgQvRMLAkAgACgCJCIARQ0AIAAQ1wMgAEHgAEEIEL0TCwtwAQR/IAAtACYhAiAAQQA6ACYCQCABKAIIIgNFDQAgASgCBCEBIANBMGwhAyAALQAlIQQgAC0AJCEFA0AgAEEDOgAkIAEgABB0IAAgBDoAJSAAIAU6ACQgAUEwaiEBIANBUGoiAw0ACwsgACACOgAmC3sBAX8jAEEQayICJAAgAiAAKAIAIgBBJGo2AgwgAUGBhZoBQQhB0PyZAUEEIABBGGpBgAJBsIGaAUEEIABBIGpBmwNBkoSaAUEGIABBDGpBnwVBmISaAUEEIABBoAVBnISaAUEJIAJBDGpBoQUQiwwhACACQRBqJAAgAAt7AQF/IwBBEGsiAiQAIAIgACgCACIAQRxqNgIMIAFBi4SaAUEHQdD8mQFBBCAAQRBqQYACQbCBmgFBBCAAQRhqQZsDQZKEmgFBBiAAQQxqQZsFQZiEmgFBBCAAQaIFQZyEmgFBCSACQQxqQaEFEIsMIQAgAkEQaiQAIAALewEBfyMAQRBrIgIkACACIAAoAgAiAEEEajYCDCABQef9mQFBCUHQ/JkBQQQgAEEIakGAAkGwgZoBQQQgAEEQakGbA0Glh5oBQQMgAEGbBUHYgZoBQQsgAEEUakGlBUGoh5oBQQMgAkEMakGmBRCLDCEAIAJBEGokACAAC3sBAX8jAEEQayICJAAgAiAAKAIAIgBBHGo2AgwgAUGlhJoBQQdB0PyZAUEEIABBEGpBgAJBsIGaAUEEIABBGGpBmwNBkoSaAUEGIABBDGpBmwVBmISaAUEEIABBoAVBnISaAUEJIAJBDGpBoQUQiwwhACACQRBqJAAgAAt7AQF/IwBBEGsiAiQAIAIgACgCACIAQQxqNgIMIAFB35GaAUERQdD8mQFBBCAAQRBqQYACQfeemgFBCiAAQc8FQYGfmgFBDCAAQQRqQc8FQY2fmgFBCSAAQQhqQc8FQZafmgFBCiACQQxqQa0FEIsMIQAgAkEQaiQAIAALewEBfyMAQRBrIgIkACACIAAoAgAiAEE8ajYCDCABQdOSmgFBDEHQ/JkBQQQgAEGAAkG9g5oBQQMgAEEIakHVAkGympoBQQkgAEEgakHSBUGchJoBQQkgAEE4akGlBUG7mpoBQQogAkEMakHTBRCLDCEAIAJBEGokACAAC34BAX8jAEEQayICJAAgAiAAKAIAIgBByABqNgIMIAFB8YqaAUEKQdD8mQFBBCAAQeAAakGAAkHciJoBQQMgAEHfBUH7ipoBQQogAEEgakHiBUGFi5oBQQUgAEHoAGpB+ARBvoGaAUEEIAJBDGpB4QUQiwwhACACQRBqJAAgAAt7AQF/IwBBEGsiAiQAIAIgACgCACIAQQhqNgIMIAFBzISaAUEHQdD8mQFBBCAAQQxqQYACQdOEmgFBBCAAQf4FQd6DmgFBBCAAQRRqQagFQdeEmgFBBiAAQRhqQagFQb6BmgFBBCACQQxqQfgFEIsMIQAgAkEQaiQAIAALewEBfyMAQRBrIgIkACACIAAoAgAiAEEMajYCDCABQZGImgFBCUHQ/JkBQQQgAEEQakGAAkHlhZoBQQggAEEYakHRAkGChJoBQQQgAEH/BUGGhJoBQQUgAEEIakGbBUG+gZoBQQQgAkEMakH4BRCLDCEAIAJBEGokACAAC3sBAX8jAEEQayICJAAgAiAAKAIAIgBBIGo2AgwgAUGcnpoBQQ9B0PyZAUEEIABBgAJBvqabAUEHIABBJGpB0QJBxaabAUEGIABBJWpB0QJB85OaAUECIABBCGpB8gNBvoGaAUEEIAJBDGpBjgYQiwwhACACQRBqJAAgAAt7AQF/IwBBEGsiAiQAIAIgACgCACIAQRhqNgIMIAFBjJqaAUELQdD8mQFBBCAAQQxqQYACQaSWmgFBCiAAQZYEQaGVmgFBAyAAQRRqQZcEQaSVmgFBCSAAQRxqQdECQbXMmwFBBCACQQxqQZoGEIsMIQAgAkEQaiQAIAALewEBfyMAQRBrIgIkACACIAAoAgAiAEEQajYCDCABQY2MmgFBEEGQhpoBQQYgAEGnBkHAg5oBQQggAEEMakHgBUHippsBQQggAEEYakHRAkHfiJoBQQkgAEEZakHRAkHQ/JkBQQQgAkEMakGGAhCLDCEAIAJBEGokACAAC3sBAX8jAEEQayICJAAgAiAAKAIAIgBBHGo2AgwgAUGgn5oBQRFB0PyZAUEEIABBEGpBgAJBkIaaAUEGIABBpwZB2IGaAUELIABBGGpBiQZBwIOaAUEIIABBDGpBwwZBzYGaAUELIAJBDGpBoQMQiwwhACACQRBqJAAgAAtzAgJ/AX4CQCAAKQMIIgNCA4NCAFINACADpyIBIAEoAgAiAkF/ajYCACACQQFHDQAgASABKAIQEOkdCwJAIAAoAiAiAUUNACABENgDIAFB4ABBCBC9EwsCQCAAKAIkIgBFDQAgABDYAyAAQeAAQQgQvRMLC3MCAn8BfgJAIAApAwgiA0IDg0IAUg0AIAOnIgEgASgCACICQX9qNgIAIAJBAUcNACABIAEoAhAQ6R0LAkAgACgCICIBRQ0AIAEQ2QMgAUHgAEEIEL0TCwJAIAAoAiQiAEUNACAAENkDIABB4ABBCBC9EwsLcQACQAJAAkACQAJAAkACQCAAKAIADgcAAQIDBAYFAAsgASAAQQhqENgWDwsgASAAQQRqELsQDwsgAEEEaiABENUhDwsgASAAQQRqEMcMDwsgAEEEaiABEIUkIABBCGogARCBJA8LIABBBGogARCBJAsLcQIBfwF+IwBBIGsiBCQAIAQgAjYCHCAEIAE2AhggBEEBNgIUIARBCGogAyAEQRRqQfTgmwFBBRCGDQJAAkAgBC0ACEEERg0AIAQpAwgiBUL/AYNCBFENACAAIAU3AgAMAQsgAEEEOgAACyAEQSBqJAALeQECfyMAQRBrIgIkACABKAIAQdDamwFBBSABKAIEKAIMEQwAIQMgAkEAOgAJIAIgAzoACCACIAE2AgQgAiAANgIMIAJBBGpBnOObAUEHIAJBDGpBgwcQ4glBgLGbAUEGIABBCGpBhAcQ4gkQxBIhASACQRBqJAAgAQt5AQJ/IwBBEGsiAiQAIAEoAgBB0NqbAUEFIAEoAgQoAgwRDAAhAyACQQA6AAkgAiADOgAIIAIgATYCBCACIAA2AgwgAkEEakGc45sBQQcgAkEMakGDBxDiCUGAsZsBQQYgAEEIakGFBxDiCRDEEiEBIAJBEGokACABC2wBA38jAEEQayIBJAACQAJAIAAoAgAiAg0AQQAhAiABQQxqIQAMAQsgACgCBCEDIAFBATYCDCABQQhqIQALIAAgAjYCAAJAIAEoAgwiAEUNACABKAIIIgJFDQAgAyACIAAQvRMLIAFBEGokAAtnAQF/IwBBEGsiBCQAAkACQCAADQBBACEAIARBDGohAwwBCyAEIAI2AgwgACADbCEAIARBCGohAwsgAyAANgIAAkAgBCgCDCIARQ0AIAQoAggiA0UNACABIAMgABC9EwsgBEEQaiQAC2cBAX8jAEEQayIEJAACQAJAIAANAEEAIQAgBEEMaiEDDAELIAQgAjYCDCAAIANsIQAgBEEIaiEDCyADIAA2AgACQCAEKAIMIgBFDQAgBCgCCCIDRQ0AIAEgAyAAEL0TCyAEQRBqJAALagEBfwJAIAAoAggiAiAAKAIARw0AIAAQ5hcLIAAgAkEBajYCCCAAKAIEIAJBBXRqIgAgASkDADcDACAAQQhqIAFBCGopAwA3AwAgAEEQaiABQRBqKQMANwMAIABBGGogAUEYaikDADcDAAtqAQF/AkAgACgCCCICIAAoAgBHDQAgABDoFwsgACACQQFqNgIIIAAoAgQgAkEFdGoiACABKQMANwMAIABBCGogAUEIaikDADcDACAAQRBqIAFBEGopAwA3AwAgAEEYaiABQRhqKQMANwMAC2kCAX8BfiMAQTBrIgMkACADIAE2AgQgAyAANgIAIANBAjYCDCADQayOgQE2AgggA0ICNwIUIANBDq1CIIYiBCADrYQ3AyggAyAEIANBBGqthDcDICADIANBIGo2AhAgA0EIaiACEKgdAAt5AQJ/IAAtAAQiASECAkAgAC0ABUUNAEEBIQICQCABQQFxDQACQCAAKAIAIgItAApBgAFxDQAgAigCAEHXtZcBQQIgAigCBCgCDBEMACECDAELIAIoAgBByMubAUEBIAIoAgQoAgwRDAAhAgsgACACOgAECyACQQFxC2cBAX8jAEEQayIEJAACQAJAIAANAEEAIQAgBEEMaiEDDAELIAQgAjYCDCAAIANsIQAgBEEIaiEDCyADIAA2AgACQCAEKAIMIgBFDQAgBCgCCCIDRQ0AIAEgAyAAEL0TCyAEQRBqJAALaQIBfwF+IwBBMGsiAyQAIAMgATYCBCADIAA2AgAgA0EDNgIMIANBlMqAATYCCCADQgI3AhQgA0EOrUIghiIEIANBBGqthDcDKCADIAQgA62ENwMgIAMgA0EgajYCECADQQhqIAIQqB0AC2kCAX8BfiMAQTBrIgMkACADIAE2AgQgAyAANgIAIANBAzYCDCADQcDKgAE2AgggA0ICNwIUIANBDq1CIIYiBCADQQRqrYQ3AyggAyAEIAOthDcDICADIANBIGo2AhAgA0EIaiACEKgdAAtsAgF/AX4jAEEwayICJAAgAiABNgIEIAIgADYCACACQQM2AgwgAkHwyoABNgIIIAJCAjcCFCACQQ6tQiCGIgMgAkEEaq2ENwMoIAIgAyACrYQ3AyAgAiACQSBqNgIQIAJBCGpBvMiFARCoHQALZwEBfyMAQRBrIgQkAAJAAkAgAA0AQQAhACAEQQxqIQMMAQsgBCACNgIMIAAgA2whACAEQQhqIQMLIAMgADYCAAJAIAQoAgwiAEUNACAEKAIIIgNFDQAgASADIAAQvRMLIARBEGokAAt8AQF/IwBBEGsiAyQAAkAgACgCBEEDRg0AIAEpAwBCtuvn6eHYxrZ2Ug0AIAEpAwhCtN+v6pWUsbIQUg0AIAEoAhANACABIABBBGo2AhALIANBCGogACAAKAIAKAIEEQcAIAMoAgggASACIAMoAgwoAigRCwAgA0EQaiQAC3EBAX9BDBC2HCIGQQI2AgggBiADNgIAIAYgBCADayAFajYCBCABIAYgASgCACIDIAMgAkYiAhs2AgACQCACDQAgACADIAQgBRDfGiAGEKMjDwsgACAGNgIMIAAgBTYCCCAAIAQ2AgQgAEGo0IABNgIAC2kCAX8BfiMAQTBrIgMkACADIAE2AgQgAyAANgIAIANBAjYCDCADQbD9gQE2AgggA0ICNwIUIANBDq1CIIYiBCADQQRqrYQ3AyggAyAEIAOthDcDICADIANBIGo2AhAgA0EIaiACEKgdAAtpAgF/AX4jAEEwayIDJAAgAyABNgIEIAMgADYCACADQQI2AgwgA0HQ/YEBNgIIIANCAjcCFCADQQ6tQiCGIgQgA0EEaq2ENwMoIAMgBCADrYQ3AyAgAyADQSBqNgIQIANBCGogAhCoHQALaQIBfwF+IwBBMGsiAyQAIAMgATYCBCADIAA2AgAgA0ECNgIMIANBhP6BATYCCCADQgI3AhQgA0EOrUIghiIEIANBBGqthDcDKCADIAQgA62ENwMgIAMgA0EgajYCECADQQhqIAIQqB0AC2kCAX8BfiMAQTBrIgMkACADIAE2AgQgAyAANgIAIANBAzYCDCADQej+gQE2AgggA0ICNwIUIANBDq1CIIYiBCADQQRqrYQ3AyggAyAEIAOthDcDICADIANBIGo2AhAgA0EIaiACEKgdAAtnAQF/IwBBEGsiBCQAAkACQCAADQBBACEAIARBDGohAwwBCyAEIAI2AgwgACADbCEAIARBCGohAwsgAyAANgIAAkAgBCgCDCIARQ0AIAQoAggiA0UNACABIAMgABC9EwsgBEEQaiQAC28BAn8jAEEQayIDJAACQAJAIAEoAgAgASgCCCIETQ0AIANBCGogASAEQQRBBBC8DSADKAIIIgRBgYCAgHhHDQEgASgCCCEECyAAIAQ2AgQgACABKAIENgIAIANBEGokAA8LIAQgAygCDCACENggAAtoAQJ/IwBBIGsiASQAIABBNGohAgJAIAAoAjBBAkYNACABIAA2AgggASACNgIMIAEgAUEfajYCGCABIAFBDGo2AhQgASABQQhqNgIQIABBMGogAUEQakH4tJgBEMgGCyABQSBqJAAgAgttAQN/AkAgACgCDCIBIAAoAgQiAkYNACABIAJrQQZ2IQEDQCACQTRqIgMoAgAgAkE4aigCABDVHCACQTBqKAIAIAMoAgAQ9SIgAhD/CiACQcAAaiECIAFBf2oiAQ0ACwsgACgCCCAAKAIAEO4iC2oBA38CQCAALQAlQQJGDQADQCAAKAIgIgAtACVBAkcNAAsLAkAgACgCCCIBDQBBAA8LIAAoAgQhACABQThsQUhqIQECQANAIAAQmgsiAg0BIABBOGohACABIQMgAUFIaiEBIAMNAAsLIAILbwICfwF+IABBCGohAQJAAkAgACgCAA0AIAEpAwAiA0IDg0IAUg0BIAOnIgEgASgCACICQX9qNgIAIAJBAUcNASABIAEoAhAQ6R0MAQsgARCqEQsCQCAAKAIoIgBFDQAgABDkASAAQcAAQQgQvRMLC28BBH9BACECAkACQCABLQAlRQ0ADAELIAFBAToAJQJAAkAgAS0AJEEBRw0AIAEoAiAhAyABKAIcIQQMAQsgASgCICIDIAEoAhwiBEYNAQsgAyAEayEFIAEoAgQgBGohAgsgACAFNgIEIAAgAjYCAAtwAgF/AX4jAEEQayIBJAAgACkDCCECIABBCjYCCCABQQhqIABBEGopAwA3AwAgASACNwMAAkACQCACpyIAQQpGDQAgAEEJRg0BCyABEKUTQZKpmwFBKEGsx5sBEIwaAAsgASgCBCEAIAFBEGokACAAC3UBAn8jAEEQayICJAACQAJAAkACQCABKAIADgQAAgECAAsgAkEIaiABQQhqEPcVIAIoAgwhAyACKAIIIQEMAgsgASgCDCEDIAEoAgghAQwBCyABKAIUIQMgASgCECEBCyAAIAE2AgAgACADNgIEIAJBEGokAAtwAgF/AX4jAEEQayIBJAAgACkDCCECIABBCjYCCCABQQhqIABBEGopAwA3AwAgASACNwMAAkACQCACpyIAQQpGDQAgAEEIRg0BCyABEKUTQZKpmwFBKEHMx5sBEIwaAAsgASgCBCEAIAFBEGokACAAC3ACAX8BfiMAQRBrIgEkACAAKQMIIQIgAEEKNgIIIAFBCGogAEEQaikDADcDACABIAI3AwACQAJAIAKnIgBBCkYNACAAQQJGDQELIAEQpRNBkqmbAUEoQZzHmwEQjBoACyABKQMIIQIgAUEQaiQAIAILZwECfyMAQRBrIgIkAEEAIQMCQCABKAIIRQ0AIAJBCGogAUEIahDLGSACKAIIQQFxRQ0AIAIgAigCDBCNHiAAIAIpAwA3AgQgASABKAIUQQFqNgIUQQEhAwsgACADNgIAIAJBEGokAAtxAQJ/IwBBEGsiAiQAAkACQAJAAkAgAUIBVg0AIAGnDgIBAgELQQEhAyACQQE6AAAgAiABNwMIIAAgAkHQh4ABEPwSNgIEDAILQQAhAyAAQQA6AAEMAQsgAEEBOgABQQAhAwsgACADOgAAIAJBEGokAAtuAQF/IABB6ABqEPUdAkAgACgCbEUNACAAQewAahD1HQsgAEEcaiAAKAIUIAAoAhggACgCECgCEBELACAAQcQAahDjGgJAIABBf0YNACAAIAAoAgQiAUF/ajYCBCABQQFHDQAgAEGAAUEQEL0TCwtcAQF/IAEgAGohAQJAIAIgAEkNACACIAFPDQBBAQ8LQQEhBCACIANBASADQQFLG2ohAwJAAkAgAiAATw0AIAMgAUsNAQsCQCADIABLDQBBAA8LIAMgAU0hBAsgBAtpAQJ/AkAgACgCDCIBIAAoAgQiAkYNACABIAJrQQV2IQEDQCACKAIAIAJBBGooAgAQ3CAgAkEYaigCACACQRxqKAIAEJIdIAJBIGohAiABQX9qIgENAAsLIAAoAgggACgCAEEEQSAQwBILbAECfyMAQRBrIgIkACAAKAIAIgBBBGohAwJAAkAgACgCAEEBRw0AIAIgAzYCDCABQdiZgAFBBSACQQxqQSsQ5gshAAwBCyACIAM2AgggAUHQmYABQQggAkEIakErEOYLIQALIAJBEGokACAAC3MBAn8gACgCACAAKAIEQQRBBBDFEiAAKAIQIgEgACgCFBCDHCAAKAIMIAFBBEEMEMUSIAAoAhggACgCHEEEQQQQxRICQCAAKAIoIgFFDQAgASABKAIAIgJBf2o2AgAgAkEBRw0AIAAoAiggACgCLBDsEAsLWgEBfyMAQRBrIgUkACAFIAJCACABQgAQ5xAgACABIAN+IAUpAwh8IgFBACAEa0E/ca0iAohCAYM8AAAgACABIARBP3GthiAFKQMAIAKIhFA6AAEgBUEQaiQAC14BA38CQANAQQEhBCABIABGIgUNAQJAIAMgAkcNACACIQMMAgsgAUF8aiIBKAIAIgQgA0F8aiIDKAIAIgZGDQALIAQgBksgBCAGSWshBAtBf0EAIAIgA0cbIAQgBRsLYwEEf0EAIQEDQCAAKAIAIQICQANAIAJBAXENASAAIAJBAXIgACgCACIDIAMgAkYiBBs2AgAgAyECIARFDQALDwsCQAJAIAJBA0sNACABQQpJDQELEIscAAsgAUEBaiEBDAALC2kBAn9BACEDQQAhBAJAAkAgAkUNACACQX9qIgQgAU8NASAAIARqLQAAQdTnhAFqLQAAIQQLAkAgAiABTw0AIAAgAmotAABB1OeEAWotAAAhAwsgBCADc0EBcQ8LIAQgAUHE0oQBEMMSAAt6AQF/IwBBEGsiAiQAIAIgAEHUEmo2AgwgAUGs9IQBQQxBm/SEAUEEIABBwgFBuPSEAUEIIABBwBJqQcMBQbTzhAFBBiAAQdASakHEAUHY8IQBQQYgAEGwDWpBxQFB3vCEAUEDIAJBDGpBxgEQiwwhACACQRBqJAAgAAtuAQJ/IwBBEGsiAyQAAkACQCACKAIARQ0AQQkhAkH4p5gBIQQMAQsgA0EEaiACKAIEIAIoAggQ4QRB+KeYASADKAIIIAMoAgQiAhshBEEJIAMoAgwgAhshAgsgBCACIAEQnQ4hAiADQRBqJAAgAgttAgR/AX4gASgCECECIAEoAgwhAyABKAIIIQQCQCABKQMAIgZCA4NCAFINACAGpyIFIAUoAgAiBUEBajYCACAFQX9KDQAACyAAIAI2AhAgACADNgIMIAAgBDYCCCAAIAY3AwAgACABLQAUOgAUC3cAAkAgASACQYDSmwFBBBDCHkUNAEHOAA8LAkAgASACQarSmwFBBRDCHkUNAEHPAA8LAkAgASACQYzRmwFBBRDCHkUNAEHQAA8LAkAgASACQa+bmwFBBRDCHkUNAEHRAA8LQdIAQaR/IAEgAkGx0psBQQgQwh4bC3cAAkAgASACQbnSmwFBCBDCHkUNAEHTAA8LAkAgASACQdzOmwFBBxDCHkUNAEHUAA8LAkAgASACQcabmwFBBhDCHkUNAEHVAA8LAkAgASACQa/SmwFBAhDCHkUNAEHWAA8LQfwAQaR/IAEgAkG+ppsBQQcQwh4bC3cAAkAgASACQcTQmwFBBRDCHkUNAEHaAA8LAkAgASACQeLRmwFBBxDCHkUNAEHbAA8LAkAgASACQdzRmwFBAxDCHkUNAEHcAA8LAkAgASACQZHRmwFBCBDCHkUNAEHdAA8LQf4AQaR/IAEgAkGlzZsBQQQQwh4bC3cAAkAgASACQcLLmwFBAxDCHkUNAEHjAA8LAkAgASACQempmwFBBBDCHkUNAEHkAA8LAkAgASACQe2pmwFBBhDCHkUNAEGIAQ8LAkAgASACQZaqmwFBBRDCHkUNAEGHAQ8LQYZ/QaR/IAEgAkGvpZsBQQkQwh4bC24BAn8jAEEQayICJAAgACgCACIAQQRqIQMCQAJAIAAoAgBBAUcNACACIAM2AgwgAUGHopoBQRIgAkEMakHMAhDmCyEADAELIAIgAzYCCCABQdiZmgFBCyACQQhqQc0CEOYLIQALIAJBEGokACAAC24BAn8jAEEQayICJAAgACgCACIAQQRqIQMCQAJAIAAoAgBBAUcNACACIAM2AgwgAUH22psBQQQgAkEMakHpAhDmCyEADAELIAIgAzYCCCABQY+DmgFBDCACQQhqQYMDEOYLIQALIAJBEGokACAAC3cBAX8jAEEQayICJAAgAiAAQThqNgIMIAFB45SaAUERQYuDmgFBBCAAQcEDQdD8mQFBBCAAQTBqQYACQfSUmgFBBSAAQTxqQcIDQfmUmgFBDCAAQcgAakHRAkGchJoBQQkgAkEMakHIAhCLDCEAIAJBEGokACAAC24BAn8jAEEQayICJAAgACgCACIAQQhqIQMCQAJAIAAoAgBBAUcNACACIAM2AgwgAUHU/JkBQQMgAkEMakGiAxDmCyEADAELIAIgAzYCCCABQdXamwFBBSACQQhqQeMCEOYLIQALIAJBEGokACAAC24BAn8jAEEQayICJAAgACgCACIAQQRqIQMCQAJAIAAoAgBBAUcNACACIAM2AgwgAUH22psBQQQgAkEMakHpAhDmCyEADAELIAIgAzYCCCABQemDmgFBByACQQhqQf0DEOYLIQALIAJBEGokACAAC20BAX8jAEEQayICJAACQAJAIAAoAgAiACgCAEEBRw0AIAIgAEEEajYCDCABQb2FmgFBCCACQQxqQdoDEOYLIQAMAQsgAiAAQQhqNgIIIAFB1dqbAUEFIAJBCGpBsAMQ5gshAAsgAkEQaiQAIAALbQEBfyMAQRBrIgIkAAJAAkAgACgCACIAKAIAQQFHDQAgAiAAQQRqNgIMIAFB0t+YAUEDIAJBDGpB3wQQ5gshAAwBCyACIABBCGo2AgggAUHQ35gBQQIgAkEIakHPBBDmCyEACyACQRBqJAAgAAtuAQJ/IwBBEGsiAiQAIAAoAgAiAEEEaiEDAkACQCAAKAIAQQFHDQAgAiADNgIMIAFBh6KaAUESIAJBDGpBzQUQ5gshAAwBCyACIAM2AgggAUHYmZoBQQsgAkEIakHOBRDmCyEACyACQRBqJAAgAAtuAQJ/IwBBEGsiAiQAIAAoAgAiAEEEaiEDAkACQCAAKAIAQQFHDQAgAiADNgIMIAFB9tqbAUEEIAJBDGpB9QQQ5gshAAwBCyACIAM2AgggAUHpg5oBQQcgAkEIakGCBhDmCyEACyACQRBqJAAgAAtuAQJ/IwBBEGsiAiQAIAAoAgAiAEEEaiEDAkACQCAAKAIAQQFHDQAgAiADNgIMIAFB9tqbAUEEIAJBDGpB9QQQ5gshAAwBCyACIAM2AgggAUGPg5oBQQwgAkEIakGDAxDmCyEACyACQRBqJAAgAAt3AQF/IwBBEGsiAiQAIAIgAEE4ajYCDCABQeOUmgFBEUGLg5oBQQQgAEHIBkHQ/JkBQQQgAEEwakGAAkH0lJoBQQUgAEE8akHJBkH5lJoBQQwgAEHIAGpB0QJBnISaAUEJIAJBDGpBoQUQiwwhACACQRBqJAAgAAttAQF/IwBBEGsiAiQAAkACQCAAKAIAIgAoAgBBAUcNACACIABBBGo2AgwgAUG9hZoBQQggAkEMakHjBRDmCyEADAELIAIgAEEIajYCCCABQdXamwFBBSACQQhqQbADEOYLIQALIAJBEGokACAAC2QBAn8CQCAAQgODQgBSDQAgAKciAiACKAIAIgNBf2o2AgAgA0EBRw0AIAIgAigCEBDpHQsCQCABQgODQgBSDQAgAaciAiACKAIAIgNBf2o2AgAgA0EBRw0AIAIgAigCEBDpHQsLbQECfyMAQRBrIgIkACACIAE2AgwCQAJAAkAgAC0AeEEBcQ0AIAAtAIEBQQhxRQ0BCyACQQxqEI0gDAELAkAgAC0AyAFBogFHDQAgABDXEiEDIAAQ4w4gACADEIMbCyAAIAEQgxsLIAJBEGokAAuDAQEBfwJAAkACQAJAAkACQAJAIAAoAgBBgICAgHhzIgFBFSABQRVJGw4VAQEBAQEBAQEBAQEBAgEDAQEEAQUGAAsgABDZGgsPCyAAKAIEIAAoAggQvSIPCyAAKAIEIAAoAggQvSIPCyAAQQRqENUgDwsgAEEEahDVIA8LIABBBGoQihoLbwEBfyMAQTBrIgIkACACQbCAgAE2AgQgAiABNgIAIAJBAjYCDCACQZiBgAE2AgggAkICNwIUIAJBATYCLCACQQI2AiQgAiAANgIgIAIgAkEgajYCECACIAI2AiggAkEIahDxGiEBIAJBMGokACABC2wBAX8jAEEwayIDJAAgAyACNgIEIAMgATYCACADQQI2AgwgA0HIlpgBNgIIIANCAjcCFCADQQE2AiwgA0ECNgIkIAMgADYCICADIANBIGo2AhAgAyADNgIoIANBCGoQ8RohAiADQTBqJAAgAgtrAQF/IwBBMGsiAiQAIAJBAjYCDCACQcTBmAE2AgggAkICNwIUIAJBDjYCLCACQQ42AiQgAiAANgIgIAIgAEEEajYCKCACIAJBIGo2AhAgASgCACABKAIEIAJBCGoQ9AUhACACQTBqJAAgAAtnAQN/IwBBEGsiAiQAIAAgASgCBCABKAIAaxDJHiAAKAIIIQMgACgCBCEEAkADQCACQQhqIAEQ3RogAi0ACEUNASAEIANqIAItAAk6AAAgA0EBaiEDDAALCyAAIAM2AgggAkEQaiQAC2sBAn8jAEEQayIBJAAgACAAKAIIIgJBf2o2AggCQAJAIAJBAUcNACAAQQRqKAIAIgJBf0wNASAAKAIAIAJBARC9EyAAEKMjCyABQRBqJAAPC0G0qpsBQSsgAUEPakG8z4ABQZjQgAEQ6hAAC2wBAX8jAEEwayICJAAgAkECNgIMIAJB0IOCATYCCCACQgI3AhQgAkEONgIsIAJB4gA2AiQgAiAANgIoIAIgAEEEajYCICACIAJBIGo2AhAgASgCACABKAIEIAJBCGoQ5SAhACACQTBqJAAgAAtwAgF/AX4jAEEQayICJAAgAkEIakEAKAKElZsBNgIAIAJBACkC/JSbATcDACABrSEDAkADQCADUA0BIAIgA6dB9JWbARDSG0IAIQMMAAsLIAAgAikDADcCACAAQQhqIAJBCGooAgA2AgAgAkEQaiQAC3EBAX8jAEEQayICJAAgAiAAKAIAKAIAIgBBLGo2AgwgAUGj9oQBQQ5BsfaEAUELIABBCGpBtQFBvPaEAUENIABBFGpBtgFByfaEAUENIABBIGpBtwFB1vaEAUEMIAJBDGpBKhDADCEAIAJBEGokACAAC2kBAX8jAEEQayIDJAACQCABKAIgRQ0AQaSxhAEQ9xYACyABQX82AiAgA0EMaiACQQhqKAIANgIAIANBAjYCACADIAIpAgA3AgQgACABQSRqIAMQngwgASABKAIgQQFqNgIgIANBEGokAAtfAQF/AkAgASADRw0AIAFBAWohAQNAAkAgAUF/aiIBDQBBAQ8LIAAoAgAgAigCAEcNASACQQRqIQMgAEEEaiEEIAJBCGohAiAAQQhqIQAgBCgCACADKAIARg0ACwtBAAtrAQF/IwBBMGsiAiQAIAJBAjYCDCACQcTBmAE2AgggAkICNwIUIAJBDjYCLCACQQ42AiQgAiAANgIgIAIgAEEEajYCKCACIAJBIGo2AhAgASgCACABKAIEIAJBCGoQ5SAhACACQTBqJAAgAAttAQF/IwBBEGsiAiQAAkACQCAAKAIAKAIAIgAoAgBBA0cNACACIABBBGo2AgwgAUHa/ZkBQQQgAkEMakG5AxDmCyEADAELIAIgADYCCCABQcf9mQFBBiACQQhqQfICEOYLIQALIAJBEGokACAAC20BAX8jAEEQayICJAACQAJAIAAoAgAoAgAiACgCAEEDRw0AIAIgAEEEajYCDCABQdr9mQFBBCACQQxqQbAFEOYLIQAMAQsgAiAANgIIIAFBx/2ZAUEGIAJBCGpBgQUQ5gshAAsgAkEQaiQAIAALaAEDfwJAAkAgASgCBCICIAEoAgAiAygCIEkNAEEAIQMMAQtBACEEAkAgAiADKAIsTw0AIAMoAiggAkEkbGoiBEEAIAQoAgAbIQQLQQEhAyABIAJBAWo2AgQLIAAgBDYCBCAAIAM2AgALYgEBf0H/ASEFAkAgA0H/AXFFDQBBf0EAIANrQQdxdEF/cyADQQdxdCEFCyAAQQg6AA4gACADOgANIAAgBToADCAAIAE2AgggAEEANgIQIAAgAkF/ajYCBCAAIAFBAWo2AgALdAEBfyMAQRBrIgIkACAAKAIAIQAgAiABKAIAQZCKmwFBDSABKAIEKAIMEQwAOgAIIAIgATYCBCACQQA6AAkgAkEANgIAIAIgACgCADYCDCACIAJBDGpB6gYQwwtBoIqbAUEpEMMLEPIPIQEgAkEQaiQAIAELYgECfyAAKAIIQThsIQIgACgCBCEAA0ACQAJAIAJFDQACQCAAKAIAIgNBAUYNACADQQlHDQIgASAAQQhqEMgfDAILIAEgAEEIahDuBgwBCw8LIABBOGohACACQUhqIQIMAAsLawACQAJAAkACQAJAAkACQCAAKAIADgcAAQIDBAYFAAsgASgCFCAAQQhqENgOGg8LIABBBGogARC1Gw8LIABBBGogARCHJA8LIABBBGogARCrBA8LIABBBGogARCWIQ8LIABBBGogARCGJAsLawEEfyAAKAIEIQECQCAAKAIIIgJFDQAgASEDA0ACQAJAIAMoAgBBB0cNACADQRBqKAIAIgQQrQEgBEHAAEEIEL0TDAELIAMQ/woLIANBKGohAyACQX9qIgINAAsLIAAoAgAgAUEIQSgQvxILbAEBfyMAQTBrIgIkACACQQI2AgwgAkH45ZsBNgIIIAJCAjcCFCACQRM2AiwgAkGGBzYCJCACIAA2AiggAiAAQQxqNgIgIAIgAkEgajYCECABKAIAIAEoAgQgAkEIahDlICEAIAJBMGokACAAC2oBA38jAEEQayICJAAgAkEIaiIDIAFBJGopAgA3AwAgAiABKQIcNwMAQRAQwiEiBEEIaiADKQMANwIAIAQgAikDADcCACABQQRqENgfIAEQlyMgAEGAioABNgIEIAAgBDYCACACQRBqJAALZwEBfyAAQQxqIgEoAgAgAEEQaigCABCAHCAAKAIIIAEoAgBBBEEMEMUSIAAoAhQgAEEYaigCAEEEQQQQxRICQCAAQX9GDQAgACAAKAIEIgFBf2o2AgQgAUEBRw0AIABBLEEEEL0TCwtqAQJ/IAFBACABKAIIIgQgBEEBRiIEGzYCCAJAIAQNACAAIAIgAxDZECABEIATDwsgASgCBCEFIAEoAgAhBCABEKMjAkAgA0UNACAEIAIgA/wKAAALIAAgAzYCCCAAIAQ2AgQgACAFNgIAC2IBAn8CQAJAAkAgASkDAKciAkEDcQ0AIAJBGGohASACKAIQIQIMAQsgAsAiA0HwAXFBBHYhAiADQX9MDQEgAUEBaiEBCyAAIAI2AgQgACABNgIADwsgAkEHQYjYggEQvCIAC2IBAn8CQAJAAkAgASkDAKciAkEDcQ0AIAJBGGohASACKAIQIQIMAQsgAsAiA0HwAXFBBHYhAiADQX9MDQEgAUEBaiEBCyAAIAI2AgQgACABNgIADwsgAkEHQbDYggEQvCIAC2YBAn8CQCABIAAoAgAgACgCCCICa00NACAAIAIgAUEEQQQQzhkgACgCCCECCyACIAFqIQMgACgCBCACQQJ0aiECA0AgAkGAgICAeDYCACACQQRqIQIgAUF/aiIBDQALIAAgAzYCCAtfAQF/AkAgACgCDCABbCACaiICQQV2IgEgACgCCCIDTw0AAkAgACgCBCABQQJ0aiIBKAIAIgNBASACdCICcSIADQAgASADIAJyNgIACyAARQ8LIAEgA0H0pIQBEMMSAAttAQN/AkBBACgCgPadASIBRQ0AIAFBIGoQjhQhAgJAIAEoAiwiAyABKAIkRw0AIAFBJGoQrBgLIAEoAiggA0ECdGogADYCACACQQA6AAAgASADQQFqNgIsIAMPC0GElpsBQcgAQayXmwEQvCMAC24BAX8jAEEQayICJAACQAJAIAAoAgAiACgCAEGAgICAeEYNACACIAA2AgwgAUGgn5oBQREgAkEMakHFAhDmCyEADAELIAIgAEEEajYCCCABQayUmgFBCCACQQhqQcYCEOYLIQALIAJBEGokACAAC2oBAX8jAEEQayICJAACQAJAIAAoAgAiACgCAEEFRw0AIAIgAEEEajYCDCABQc2TmgFBDSACQQxqQeICEOYLIQAMAQsgAiAANgIIIAFBhIOaAUEHIAJBCGpBxgMQ5gshAAsgAkEQaiQAIAALagEBfyMAQRBrIgIkAAJAAkAgACgCACIAKAIAQQlHDQAgAiAAQQhqNgIMIAFBmpCaAUEEIAJBDGpB3gMQ5gshAAwBCyACIAA2AgggAUGQkJoBQQogAkEIakGMBBDmCyEACyACQRBqJAAgAAtpAQJ/IwBBEGsiAiQAIABBCGohAwJAAkAgACgCAEEBRw0AIAIgAzYCDCABQdT8mQFBAyACQQxqQaIDEOYLIQAMAQsgAiADNgIIIAFB1dqbAUEFIAJBCGpB4wIQ5gshAAsgAkEQaiQAIAALagEBfyMAQRBrIgIkAAJAAkAgACgCACIAKAIAQQdGDQAgAiAANgIMIAFBxYeaAUEFIAJBDGpBxAQQ5gshAAwBCyACIABBCGo2AgggAUG8mJoBQQsgAkEIakHMBBDmCyEACyACQRBqJAAgAAtuAQF/IwBBEGsiAiQAAkACQCAAKAIAIgAoAgBBgICAgHhHDQAgAiAAQQRqNgIMIAFB9tqbAUEEIAJBDGpB6QIQ5gshAAwBCyACIAA2AgggAUHjh5oBQQkgAkEIakHXAxDmCyEACyACQRBqJAAgAAtuAQF/IwBBEGsiAiQAAkACQCAAKAIAIgAoAgBBgICAgHhGDQAgAiAANgIMIAFBoJ+aAUERIAJBDGpBxwUQ5gshAAwBCyACIABBBGo2AgggAUGslJoBQQggAkEIakHIBRDmCyEACyACQRBqJAAgAAtqAQF/IwBBEGsiAiQAAkACQCAAKAIAIgAoAgBBCUcNACACIABBCGo2AgwgAUGakJoBQQQgAkEMakHpBRDmCyEADAELIAIgADYCCCABQZCQmgFBCiACQQhqQZEGEOYLIQALIAJBEGokACAAC2oBAX8jAEEQayICJAACQAJAIAAoAgAiACgCAEEHRg0AIAIgADYCDCABQcWHmgFBBSACQQxqQbcGEOYLIQAMAQsgAiAAQQhqNgIIIAFBvJiaAUELIAJBCGpBuAYQ5gshAAsgAkEQaiQAIAALagEBfyMAQRBrIgIkAAJAAkAgACgCACIAKAIAQQVHDQAgAiAAQQRqNgIMIAFBzZOaAUENIAJBDGpB2QUQ5gshAAwBCyACIAA2AgggAUGEg5oBQQcgAkEIakHNBhDmCyEACyACQRBqJAAgAAtuAQF/IwBBEGsiAiQAAkACQCAAKAIAIgAoAgBBgICAgHhHDQAgAiAAQQRqNgIMIAFB9tqbAUEEIAJBDGpB9QQQ5gshAAwBCyACIAA2AgggAUHjh5oBQQkgAkEIakHnBRDmCyEACyACQRBqJAAgAAtrAQJ/IwBBEGsiASQAAkACQANAIAFBCGogABCEDAJAIAEoAgxBgIDEACABKAIIQQFxGyICQXZqDgQCAQECAAsgAkHYv39qQQJJDQEgAkGAgMQARw0AC0EAIQIMAQtBASECCyABQRBqJAAgAgtmAQJ/IAAoAghBBnQhAiAAKAIEIQMCQANAIAJFDQEgAyABEL0gIAJBQGohAiADQcAAaiEDDAALCyAAKAIQIAAoAhQgARDdHCAAQRhqIAEQpx8gASAAQTxqEIIaIABBwABqIAEQpCELcQEBfwJAIAAoAgAiAUEKRg0AAkACQAJAAkACQAJAIAFBfmoiAUEBIAFBCEkbDggBAgMEBgYFAAELIABBBGoQjSAPCyAAKQMIEPMfDwsgABCpHw8LIAApAwgQ/h8PCyAAKQMIEPMfDwsgACgCBBCzIAsLbgECfyABKAIAIQIgAUEANgIAAkAgAS0APA0AIAEoAgQhAyABKAIoIAEoAhAgASgCFBCuCQJAIAEoAjhFDQAgAUEANgI0IAEgASgCMEEBajYCMAsgAUEBOgA8IAJFDQAgASADENMFCyAAQQQ6AAALVwEBfgJAAkAgA0HAAHENACADRQ0BIAIgA0E/ca0iBIYgAUEAIANrQT9xrYiEIQIgASAEhiEBDAELIAEgA0E/ca2GIQJCACEBCyAAIAE3AwAgACACNwMIC1cBAX4CQAJAIANBwABxDQAgA0UNASACQQAgA2tBP3GthiABIANBP3GtIgSIhCEBIAIgBIghAgwBCyACIANBP3GtiCEBQgAhAgsgACABNwMAIAAgAjcDCAtlAQJ/IwBBEGsiAiQAIAIgATYCCAJAAkAgARCzH0H/AXEiA0ECRg0AIAAgAzoAAUEAIQMMAQsgACACQQhqIAJBD2pBgICAARCMBzYCBEEBIQMLIAAgAzoAACABEMEhIAJBEGokAAthAQF/IwBBIGsiAiQAAkAgACgCCEECRg0AIAIgATYCCCACIAA2AgwgAiACQR9qNgIYIAIgAkEMajYCFCACIAJBCGo2AhAgAEEIaiACQRBqQZDWggEQyAYLIAJBIGokACAAC2ABAn8jAEEQayICJAACQAJAIAANAEEAIQAgAkEMaiEDDAELIAJBATYCDCACQQhqIQMLIAMgADYCAAJAIAIoAgwiAEUNACACKAIIIgNFDQAgASADIAAQvRMLIAJBEGokAAtkAQR/IwBBEGsiAiQAIAAtAAwhAyACQQRqIAAoAgQgACgCCEEKEMYBIAIoAggiACACKAIMIgQQjBEgAigCBCEFIAEgA0EAR0EBQQAgACAEEO8FIQEgBSAAEN4iIAJBEGokACABC2oBAX8jAEEQayICJAACQAJAIAAoAgAiACkDAEIChSAAKQMIhFANACACIAA2AgwgAUHs3psBQQQgAkEMakGmARDmCyEBDAELIAEoAgBBtJubAUEEIAEoAgQoAgwRDAAhAQsgAkEQaiQAIAELagEBfyMAQRBrIgIkAAJAAkAgACgCACIAKQMAQgKFIAApAwiEUA0AIAIgADYCDCABQezemwFBBCACQQxqQbwBEOYLIQEMAQsgASgCAEG0m5sBQQQgASgCBCgCDBEMACEBCyACQRBqJAAgAQtlAQN/AkACQCABKAIMIAJsIgIgASgCECIDaiIEIAJJDQAgBCABKAIIIgVLDQEgASgCBCEBIAAgAzYCBCAAIAEgAkECdGo2AgAPCyACIARBzMSEARDXIgALIAQgBUHMxIQBELwiAAtgAQF/IwBBEGsiBCQAAkACQCAADQBBACEAIARBDGohAwwBCyAEIAI2AgwgACADbCEAIARBCGohAwsgAyAANgIAAkAgBCgCDCIARQ0AIAEgACAEKAIIENEgCyAEQRBqJAALbQEEf0EALQDg9p0BGiABKAIMIQIgASgCCCEDAkBBwAAQhAEiBEUNACAEIAEoAgAQRUEALQDg9p0BGkHgABCEASIFRQ0AIAUgASgCBBBlIAAgAjYCDCAAIAM2AgggACAFNgIEIAAgBDYCAA8LAAtxAQF/IwBBEGsiAiQAIAIgACgCACgCACIAQQhqNgIMIAFBrv6ZAUEKQdD8mQFBBCAAQYACQc2HmgFBByAAQcAAakGyA0HUh5oBQQggAEGQAWpBswNB3IeaAUEHIAJBDGpBtAMQwAwhACACQRBqJAAgAAtyAQF/IwBBEGsiAiQAIAIgACgCACgCACIAQeAAajYCDCABQd2EmgFBB0HQ/JkBQQQgAEH4AGpBgAJB5ISaAUEFIABByABqQfYDQemEmgFBByAAQfcDQfCEmgFBCSACQQxqQfgDEMAMIQAgAkEQaiQAIAALaAEBfyMAQRBrIgIkAAJAAkAgACgCACIAKQMAUA0AIAIgADYCDCABQeeXmgFBEyACQQxqQZsEEOYLIQAMAQsgAiAAQQhqNgIIIAFB25eaAUEMIAJBCGpB2wIQ5gshAAsgAkEQaiQAIAALagEBfyMAQRBrIgIkAAJAAkAgACgCACgCACIALQAlQQJGDQAgAiAANgIMIAFBnJ6aAUEPIAJBDGpBhwQQ5gshAAwBCyACIAA2AgggAUGinJoBQQ0gAkEIakGIBBDmCyEACyACQRBqJAAgAAtxAQF/IwBBEGsiAiQAIAIgACgCACgCACIAQQhqNgIMIAFBrv6ZAUEKQdD8mQFBBCAAQYACQc2HmgFBByAAQcAAakGqBUHUh5oBQQggAEGQAWpBqwVB3IeaAUEHIAJBDGpBrAUQwAwhACACQRBqJAAgAAtyAQF/IwBBEGsiAiQAIAIgACgCACgCACIAQeAAajYCDCABQd2EmgFBB0HQ/JkBQQQgAEH4AGpBgAJB5ISaAUEFIABByABqQfwFQemEmgFBByAAQf0FQfCEmgFBCSACQQxqQeEFEMAMIQAgAkEQaiQAIAALaAEBfyMAQRBrIgIkAAJAAkAgACgCACIAKQMAUA0AIAIgADYCDCABQeeXmgFBEyACQQxqQZsEEOYLIQAMAQsgAiAAQQhqNgIIIAFB25eaAUEMIAJBCGpB1AUQ5gshAAsgAkEQaiQAIAALagEBfyMAQRBrIgIkAAJAAkAgACgCACgCACIALQAlQQJGDQAgAiAANgIMIAFBnJ6aAUEPIAJBDGpBjAYQ5gshAAwBCyACIAA2AgggAUGinJoBQQ0gAkEIakGNBhDmCyEACyACQRBqJAAgAAtkAQJ/IwBBEGsiAiQAAkACQCABKAIAQQlHDQAgAiABQQhqEO8NIAIoAgQhASACKAIAIQMMAQsgAkEIaiABEJIMIAIoAgwhASACKAIIIQMLIAAgAzYCACAAIAE2AgQgAkEQaiQAC2QBA38gACgCeCEBAkACQAJAIAAQ5AsiAkH/AXEiA0G1f2oiAEEfSw0AQQEgAHRBgYCCkHhxDQELQQAhACADQaQBRg0BIAJBtH9qQf8BcUHUAEsNAQsgAiABEP4NQQFzIQALIAALYAEBfyMAQRBrIgQkAAJAAkAgAA0AQQAhACAEQQxqIQMMAQsgBCACNgIMIAAgA2whACAEQQhqIQMLIAMgADYCAAJAIAQoAgwiAEUNACABIAAgBCgCCBDRIAsgBEEQaiQAC2MBAn8CQAJAIABBfGooAgAiA0F4cSIEQQRBCCADQQNxIgMbIAFqSQ0AAkAgA0UNACAEIAFBJ2pLDQILIAAQ6gQPC0GlmpgBQS5B1JqYARCMGgALQeSamAFBLkGUm5gBEIwaAAtoAQF/IwBBEGsiAiQAIAIgACgCACIAQSRqNgIMIAFB8MOYAUENQevDmAFBBSAAQTxqQR1BgPuZAUEHIABBHkHQ/JkBQQQgAEEMakEfQf3DmAFBCyACQQxqQSAQwAwhACACQRBqJAAgAAtpAQF/IwBBEGsiAiQAIAAoAgAhACACIAEoAgBBlPqEAUEHIAEoAgQoAgwRDAA6AAggAiABNgIEIAJBADoACSACQQA2AgAgAiAAKAIANgIMIAIgAkEMakEnEMMLEPIPIQEgAkEQaiQAIAELaAEBfyMAQRBrIgIkACACIAAoAgAiAEEsajYCDCABQZPugwFBCEGb7oMBQQggAEEYakEzQaPugwFBCSAAQTRBrO6DAUELIABBHGpBNUG86oMBQQsgAkEMakEqEMAMIQAgAkEQaiQAIAALaQEBfyMAQRBrIgIkACAAKAIAIQAgAiABKAIAQev4hAFBCSABKAIEKAIMEQwAOgAIIAIgATYCBCACQQA6AAkgAkEANgIAIAIgACgCADYCDCACIAJBDGpBJxDDCxDyDyEBIAJBEGokACABC2EBAX8CQAJAIAEgACgCPHZBfmoiASAAKAIUIgNPDQAgAiAAKAIQIAFBDGxqIgAoAggiAU8NASAAKAIEIAJBAnRqKAIADwsgASADQZTvgwEQwxIACyACIAFBpO+DARDDEgALYQECfyMAQRBrIgMkACADQQRqIAFBAUEEQQQQqw0gAygCCCEEAkAgAygCBEEBRw0AIAQgAygCDCACENggAAsgAygCDCECIAAgATYCCCAAIAI2AgQgACAENgIAIANBEGokAAtrAQJ/IAAoAgAgACgCBBDTIiAAKAIQIgEgACgCFBCDHCAAKAIMIAFBBEEMEMUSIAAoAhggACgCHBDTIgJAIAAoAigiAUUNACABIAEoAgAiAkF/ajYCACACQQFHDQAgACgCKCAAKAIsEOwQCwthAQF/AkACQCABIAAoAjx2QX5qIgEgACgCFCIDTw0AIAIgACgCECABQQxsaiIAKAIIIgFPDQEgACgCBCACQQJ0aigCAA8LIAEgA0GU74MBEMMSAAsgAiABQaTvgwEQwxIAC20AAkACQAJAAkACQCACDgMAAQIACyABKAKwAiICIAEoArQCRiEBDAMLIAEoArACIQIMAQsCQCADIAEoAtwCSQ0AQQIhAQwCCyABKALYAiADQQJ0aigCACECC0EBIQELIAAgAjYCBCAAIAE6AAALXwEBf0EAIQYCQCAEIANPDQACQCABLQAAIAIgBGotAAAiA0YNACABLQABQf8BcSADRg0AIAEtAAJB/wFxIANHDQELIAAgBDYCBEEBIQYgACAEQQFqNgIICyAAIAY2AgALawEBfyMAQRBrIgIkACACIAAoAgAiAEEIajYCDCABQZiolwFBCkHVq5cBQQMgAEEMakEnQdirlwFBAyAAQeUBQdurlwFBBiAAQRBqQcQAQZDqmQFBAyACQQxqQeYBEMAMIQAgAkEQaiQAIAALZwACQAJAAkACQCABQQFxRQ0AIAMoAgQiAQ0BQfiOhQEQySIACyACKAIAQYaAxABJDQIgAygCBCIBRQ0BIAMgAUF/ajYCBAwCCyADIAFBf2o2AgQMAQtB+I6FARDJIgALIABBIjYCAAtjAQF/IwBBEGsiAiQAIAJBCGogACgCAEEIakH0tZgBEKYcIAIoAgwhAAJAAkAgAigCCCABELAYIgENAEEAIQEMAQsgASgCCEEARyEBCyAAIAAoAgBBf2o2AgAgAkEQaiQAIAELYwEBfyMAQRBrIgIkACACQQhqIAAoAgRBCGpB5LaYARCmHCACKAIMIQACQAJAIAIoAgggARCwGCIBDQBBACEBDAELIAEoAghBAEchAQsgACAAKAIAQX9qNgIAIAJBEGokACABC2UCAn8BfgJAIAApAwAiA0IDg0IAUg0AIAOnIgEgASgCACICQX9qNgIAIAJBAUcNACABIAEoAhAQ6R0LAkAgACgCGCIARQ0AIAAoAgAiARDAAiABQeAAQQgQvRMgAEEMQQQQvRMLC2kBAX8jAEEQayICJAACQAJAIAFBDUkNACACQQhqIAEQ6BYgAigCDCEBIAAgAigCCDYCCCAAQQA2AgQgACABNgIADAELIABBCGpBACgC2M6YATYCACAAQQApAtDOmAE3AgALIAJBEGokAAtlAgJ/AX4CQCAAKQMAIgNCA4NCAFINACADpyIBIAEoAgAiAkF/ajYCACACQQFHDQAgASABKAIQEOkdCwJAIAAoAhgiAEUNACAAKAIAIgEQ1QMgAUHgAEEIEL0TIABBDEEEEL0TCwtsAQF/IwBBEGsiAiQAIAIgACgCACIAQQxqNgIMIAFBrJSaAUEIQdD8mQFBBCAAQRBqQYACQZCGmgFBBiAAQaoCQdiBmgFBCyAAQRhqQasCQcCDmgFBCCACQQxqQawCEMAMIQAgAkEQaiQAIAALbAEBfyMAQRBrIgIkACACIAAoAgAiAEEEajYCDCABQZySmgFBE0HQ/JkBQQQgAEEIakGAAkHippsBQQggAEEQakHRAkGsopoBQQggAEHOAkG0opoBQQogAkEMakGvAhDADCEAIAJBEGokACAAC2wBAX8jAEEQayICJAAgAiAAKAIAIgBBIGo2AgwgAUHEkpoBQQ9B0PyZAUEEIABBGGpBgAJBpcybAUEHIABBJGpB0QJB2J6aAUEKIABB0wJBwIOaAUEIIAJBDGpB1AIQwAwhACACQRBqJAAgAAtnAQF/IwBBEGsiAiQAAkACQCAAKAIAIgAoAgANACACIABBBGo2AgwgAUGqj5oBQQQgAkEMakHhAhDmCyEADAELIAIgADYCCCABQaSPmgFBBiACQQhqQeICEOYLIQALIAJBEGokACAAC2wBAX8jAEEQayICJAAgAiAAKAIAIgBBCGo2AgwgAUG6ipoBQQpB0PyZAUEEIABBgAJBgISaAUECIABBDGpBkwNBxIqaAUEGIABBDWpB0QJBvYOaAUEDIAJBDGpB6QIQwAwhACACQRBqJAAgAAtsAQF/IwBBEGsiAiQAIAIgACgCACIAQQRqNgIMIAFB+YOaAUEHQdD8mQFBBCAAQQhqQYACQYCEmgFBAiAAQRBqQZQDQYKEmgFBBCAAQZUDQYaEmgFBBSACQQxqQekCEMAMIQAgAkEQaiQAIAALbAEBfyMAQRBrIgIkACACIAAoAgAiAEE4ajYCDCABQY6KmgFBCkHQ/JkBQQQgAEEwakGAAkGAhJoBQQIgAEE8akGWA0GChJoBQQQgAEGXA0GGhJoBQQUgAkEMakHpAhDADCEAIAJBEGokACAAC2wBAX8jAEEQayICJAAgAiAAKAIAIgBBCGo2AgwgAUGJhZoBQQhB0PyZAUEEIABBDGpBgAJB3oOaAUEEIABBlQNB4oOaAUEEIABBBGpBlQNB5oOaAUEDIAJBDGpB6QIQwAwhACACQRBqJAAgAAtsAQF/IwBBEGsiAiQAIAIgACgCACIAQRRqNgIMIAFB1dqbAUEFQdD8mQFBBCAAQQhqQYACQbCBmgFBBCAAQRBqQZsDQfmCmgFBAyAAQaADQfyCmgFBCCACQQxqQaEDEMAMIQAgAkEQaiQAIAALbAEBfyMAQRBrIgIkACACIAAoAgAiAEEcajYCDCABQbj+mQFBC0HQ/JkBQQQgAEEMakGAAkHNh5oBQQcgAEEUakG1A0HUh5oBQQggAEGzA0Hch5oBQQcgAkEMakG2AxDADCEAIAJBEGokACAAC2UBAX8jAEEQayICJAACQAJAIAAoAgBBBUYNACACIAA2AgwgAUGv/ZkBQQYgAkEMakHZAxDmCyEADAELIAIgAEEIajYCCCABQaj9mQFBByACQQhqQYwDEOYLIQALIAJBEGokACAAC2wBAX8jAEEQayICJAAgAiAAKAIAIgBBEGo2AgwgAUHYg5oBQQZB0PyZAUEEIABBCGpBgAJB3oOaAUEEIABBlQNB4oOaAUEEIABBBGpB3gNB5oOaAUEDIAJBDGpB9AMQwAwhACACQRBqJAAgAAtsAQF/IwBBEGsiAiQAIAIgACgCACIAQQxqNgIMIAFBiIiaAUEJQdD8mQFBBCAAQRBqQYACQYKEmgFBBCAAQfoDQYaEmgFBBSAAQQhqQZUDQb6BmgFBBCACQQxqQfADEMAMIQAgAkEQaiQAIAALZwEBfyMAQRBrIgIkAAJAAkAgACgCACIALQAlQQJGDQAgAiAANgIMIAFBnJ6aAUEPIAJBDGpBhwQQ5gshAAwBCyACIAA2AgggAUGinJoBQQ0gAkEIakGIBBDmCyEACyACQRBqJAAgAAtsAQF/IwBBEGsiAiQAIAIgACgCACIAQQxqNgIMIAFBmJWaAUEJQdD8mQFBBCAAQQRqQYACQaGVmgFBAyAAQaIDQaSVmgFBCSAAQRBqQdECQbXMmwFBBCACQQxqQZgEEMAMIQAgAkEQaiQAIAALZwEBfyMAQRBrIgIkAAJAAkAgACgCACIALQAUQQJGDQAgAiAANgIMIAFB1dqbAUEFIAJBDGpB4wIQ5gshAAwBCyACIAA2AgggAUGXmpoBQQ8gAkEIakGcBBDmCyEACyACQRBqJAAgAAtuAQF/IwBBEGsiAiQAIAIgACgCACIAQcgAajYCDCABQfCimgFBFEHQ/JkBQQQgAEHAAGpBgAJBhKOaAUEEIABBowRBiKOaAUEIIABBIGpBpARB8aGaAUEMIAJBDGpBoQMQwAwhACACQRBqJAAgAAtsAQF/IwBBEGsiAiQAIAIgACgCACIAQRhqNgIMIAFBvJyaAUETQdD8mQFBBCAAQQxqQYACQZCGmgFBBiAAQaoCQcCDmgFBCCAAQRRqQdYDQdiBmgFBCyACQQxqQbEEEMAMIQAgAkEQaiQAIAALbAEBfyMAQRBrIgIkACACIAAoAgAiAEEYajYCDCABQc+cmgFBGEHQ/JkBQQQgAEEMakGAAkGQhpoBQQYgAEGqAkHAg5oBQQggAEEUakHWA0HYgZoBQQsgAkEMakGxBBDADCEAIAJBEGokACAAC2wBAX8jAEEQayICJAAgAiAAKAIAIgBBDGo2AgwgAUH6nJoBQRFB0PyZAUEEIABBBGpBgAJB3IiaAUEDIABBlQNBsZ+aAUEIIABBEGpB0QJBwIOaAUEIIAJBDGpB1AIQwAwhACACQRBqJAAgAAtsAQF/IwBBEGsiAiQAIAIgACgCACIANgIMIAFBi52aAUERQdD8mQFBBCAAQShqQYACQdyImgFBAyAAQTBqQZUDQbGfmgFBCCAAQTRqQdECQYWLmgFBBSACQQxqQa0CEMAMIQAgAkEQaiQAIAALbAEBfyMAQRBrIgIkACACIAAoAgAiAEEUajYCDCABQbOEmgFBCEHQ/JkBQQQgAEEMakGAAkG7hJoBQQUgAEG3BEH8gpoBQQggAEEYakHRAkHAg5oBQQggAkEMakHUAhDADCEAIAJBEGokACAAC2wBAX8jAEEQayICJAAgAiAAKAIAIgBBFGo2AgwgAUGsg5oBQQdB0PyZAUEEIABBBGpBgAJBs4OaAUEKIABBDGpBgAJBvYOaAUEDIABBuARBwIOaAUEIIAJBDGpB1AIQwAwhACACQRBqJAAgAAtsAQF/IwBBEGsiAiQAIAIgACgCACIAQRRqNgIMIAFBr4WaAUEJQdD8mQFBBCAAQQxqQYACQbiFmgFBBSAAQbkEQfyCmgFBCCAAQRhqQdECQcCDmgFBCCACQQxqQdQCEMAMIQAgAkEQaiQAIAALbAEBfyMAQRBrIgIkACACIAAoAgAiAEE0ajYCDCABQcCTmgFBDUHQ/JkBQQQgAEEoakGAAkGLg5oBQQQgAEHDBEHThJoBQQQgAEEwakGtA0GLiZoBQQggAkEMakGhAxDADCEAIAJBEGokACAAC2cBAX8jAEEQayICJAACQAJAIAAoAgAiAC0AFEECRw0AIAIgADYCDCABQenamwFBBiACQQxqQcAEEOYLIQAMAQsgAiAANgIIIAFB1dqbAUEFIAJBCGpBswQQ5gshAAsgAkEQaiQAIAALbAEBfyMAQRBrIgIkACACIAAoAgAiADYCDCABQaaKmgFBCkHQ/JkBQQQgAEEIakGAAkGwipoBQQQgAEEYakHRAkG0ipoBQQYgAEEQakHOBEGF/ZkBQQMgAkEMakG3AxDADCEAIAJBEGokACAAC2UBAX8jAEEQayICJAACQAJAIAAoAgBBC0cNACACIABBBGo2AgwgAUHJhJoBQQMgAkEMakHUBBDmCyEADAELIAIgADYCCCABQfCOmgFBBiACQQhqQdUEEOYLIQALIAJBEGokACAAC20BAX8jAEEQayICJAAgAiAAKAIAIgBBIGo2AgwgAUHdipoBQQpB0PyZAUEEIABBOGpBgAJB3IiaAUEDIABBvQRBwIOaAUEIIABBwABqQdYDQb6BmgFBBCACQQxqQfgDEMAMIQAgAkEQaiQAIAALZAEBfwJAIAEtAAANACAAKAIMIAEQmAELAkAgACgCCCICRQ0AIAEtAAANACACQQR0IQIgACgCBEEMaiEAA0ACQCABLQAADQAgACgCACABEJgBCyAAQRBqIQAgAkFwaiICDQALCwtsAQF/IwBBEGsiAiQAIAIgACgCACIAQRRqNgIMIAFBs4SaAUEIQdD8mQFBBCAAQQxqQYACQbuEmgFBBSAAQfcEQfyCmgFBCCAAQRhqQdECQcCDmgFBCCACQQxqQfYEEMAMIQAgAkEQaiQAIAALbAEBfyMAQRBrIgIkACACIAAoAgAiAEEUajYCDCABQayDmgFBB0HQ/JkBQQQgAEEEakGAAkGzg5oBQQogAEEMakGAAkG9g5oBQQMgAEH4BEHAg5oBQQggAkEMakH2BBDADCEAIAJBEGokACAAC2wBAX8jAEEQayICJAAgAiAAKAIAIgBBFGo2AgwgAUGvhZoBQQlB0PyZAUEEIABBDGpBgAJBuIWaAUEFIABB+QRB/IKaAUEIIABBGGpB0QJBwIOaAUEIIAJBDGpB9gQQwAwhACACQRBqJAAgAAtsAQF/IwBBEGsiAiQAIAIgACgCACIAQQhqNgIMIAFBuoqaAUEKQdD8mQFBBCAAQYACQYCEmgFBAiAAQQxqQZMDQcSKmgFBBiAAQQ1qQdECQb2DmgFBAyACQQxqQfUEEMAMIQAgAkEQaiQAIAALbAEBfyMAQRBrIgIkACACIAAoAgAiAEEEajYCDCABQfmDmgFBB0HQ/JkBQQQgAEEIakGAAkGAhJoBQQIgAEEQakGUA0GChJoBQQQgAEGbBUGGhJoBQQUgAkEMakH1BBDADCEAIAJBEGokACAAC2wBAX8jAEEQayICJAAgAiAAKAIAIgBBOGo2AgwgAUGOipoBQQpB0PyZAUEEIABBMGpBgAJBgISaAUECIABBPGpBlgNBgoSaAUEEIABBnAVBhoSaAUEFIAJBDGpB9QQQwAwhACACQRBqJAAgAAtsAQF/IwBBEGsiAiQAIAIgACgCACIAQQhqNgIMIAFBiYWaAUEIQdD8mQFBBCAAQQxqQYACQd6DmgFBBCAAQZsFQeKDmgFBBCAAQQRqQZsFQeaDmgFBAyACQQxqQfUEEMAMIQAgAkEQaiQAIAALbAEBfyMAQRBrIgIkACACIAAoAgAiAEEcajYCDCABQbj+mQFBC0HQ/JkBQQQgAEEMakGAAkHNh5oBQQcgAEEUakG1A0HUh5oBQQggAEGrBUHch5oBQQcgAkEMakG2AxDADCEAIAJBEGokACAAC2wBAX8jAEEQayICJAAgAiAAKAIAIgBBBGo2AgwgAUGckpoBQRNB0PyZAUEEIABBCGpBgAJB4qabAUEIIABBEGpB0QJBrKKaAUEIIABBzwVBtKKaAUEKIAJBDGpBrQUQwAwhACACQRBqJAAgAAtsAQF/IwBBEGsiAiQAIAIgACgCACIAQSBqNgIMIAFBxJKaAUEPQdD8mQFBBCAAQRhqQYACQaXMmwFBByAAQSRqQdECQdiemgFBCiAAQdMCQcCDmgFBCCACQQxqQfYEEMAMIQAgAkEQaiQAIAALZwEBfyMAQRBrIgIkAAJAAkAgACgCACIAKAIADQAgAiAAQQRqNgIMIAFBqo+aAUEEIAJBDGpB2AUQ5gshAAwBCyACIAA2AgggAUGkj5oBQQYgAkEIakHZBRDmCyEACyACQRBqJAAgAAttAQF/IwBBEGsiAiQAIAIgACgCACIAQSBqNgIMIAFB3YqaAUEKQdD8mQFBBCAAQThqQYACQdyImgFBAyAAQd8FQcCDmgFBCCAAQcAAakHgBUG+gZoBQQQgAkEMakHhBRDADCEAIAJBEGokACAAC2wBAX8jAEEQayICJAAgAiAAKAIAIgBBEGo2AgwgAUHYg5oBQQZB0PyZAUEEIABBCGpBgAJB3oOaAUEEIABBmwVB4oOaAUEEIABBBGpB6QVB5oOaAUEDIAJBDGpB+gUQwAwhACACQRBqJAAgAAtsAQF/IwBBEGsiAiQAIAIgACgCACIAQQxqNgIMIAFBiIiaAUEJQdD8mQFBBCAAQRBqQYACQYKEmgFBBCAAQf8FQYaEmgFBBSAAQQhqQZsFQb6BmgFBBCACQQxqQfgFEMAMIQAgAkEQaiQAIAALZwEBfyMAQRBrIgIkAAJAAkAgACgCACIALQAlQQJGDQAgAiAANgIMIAFBnJ6aAUEPIAJBDGpBjAYQ5gshAAwBCyACIAA2AgggAUGinJoBQQ0gAkEIakGNBhDmCyEACyACQRBqJAAgAAtsAQF/IwBBEGsiAiQAIAIgACgCACIAQQxqNgIMIAFBmJWaAUEJQdD8mQFBBCAAQQRqQYACQaGVmgFBAyAAQaIDQaSVmgFBCSAAQRBqQdECQbXMmwFBBCACQQxqQZoGEMAMIQAgAkEQaiQAIAALZwEBfyMAQRBrIgIkAAJAAkAgACgCACIALQAUQQJGDQAgAiAANgIMIAFB1dqbAUEFIAJBDGpB4wIQ5gshAAwBCyACIAA2AgggAUGXmpoBQQ8gAkEIakGdBhDmCyEACyACQRBqJAAgAAttAQF/IwBBEGsiAiQAIAIgACgCACIAQcAAajYCDCABQZCjmgFBFEHQ/JkBQQQgAEE4akGAAkGko5oBQQUgAEEgakHyA0Gpo5oBQQggAEGkBEHxoZoBQQwgAkEMakGhAxDADCEAIAJBEGokACAAC2wBAX8jAEEQayICJAAgAiAAKAIAIgBBGGo2AgwgAUG8nJoBQRNB0PyZAUEEIABBDGpBgAJBkIaaAUEGIABBpwZBwIOaAUEIIABBFGpB4AVB2IGaAUELIAJBDGpBqAYQwAwhACACQRBqJAAgAAtsAQF/IwBBEGsiAiQAIAIgACgCACIAQRhqNgIMIAFBz5yaAUEYQdD8mQFBBCAAQQxqQYACQZCGmgFBBiAAQacGQcCDmgFBCCAAQRRqQeAFQdiBmgFBCyACQQxqQagGEMAMIQAgAkEQaiQAIAALbAEBfyMAQRBrIgIkACACIAAoAgAiAEEMajYCDCABQfqcmgFBEUHQ/JkBQQQgAEEEakGAAkHciJoBQQMgAEGbBUGxn5oBQQggAEEQakHRAkHAg5oBQQggAkEMakH2BBDADCEAIAJBEGokACAAC2wBAX8jAEEQayICJAAgAiAAKAIAIgA2AgwgAUGLnZoBQRFB0PyZAUEEIABBKGpBgAJB3IiaAUEDIABBMGpBmwVBsZ+aAUEIIABBNGpB0QJBhYuaAUEFIAJBDGpBqQYQwAwhACACQRBqJAAgAAtsAQF/IwBBEGsiAiQAIAIgACgCACIAQTRqNgIMIAFBwJOaAUENQdD8mQFBBCAAQShqQYACQYuDmgFBBCAAQe8EQdOEmgFBBCAAQTBqQagFQYuJmgFBCCACQQxqQaEDEMAMIQAgAkEQaiQAIAALZQEBfyMAQRBrIgIkAAJAAkAgACgCAEEFRg0AIAIgADYCDCABQa/9mQFBBiACQQxqQbUGEOYLIQAMAQsgAiAAQQhqNgIIIAFBqP2ZAUEHIAJBCGpBjAMQ5gshAAsgAkEQaiQAIAALZwEBfyMAQRBrIgIkAAJAAkAgACgCACIALQAUQQJHDQAgAiAANgIMIAFB6dqbAUEGIAJBDGpB9AQQ5gshAAwBCyACIAA2AgggAUHV2psBQQUgAkEIakHwBBDmCyEACyACQRBqJAAgAAtsAQF/IwBBEGsiAiQAIAIgACgCACIAQQxqNgIMIAFBrJSaAUEIQdD8mQFBBCAAQRBqQYACQZCGmgFBBiAAQacGQdiBmgFBCyAAQRhqQYkGQcCDmgFBCCACQQxqQeQFEMAMIQAgAkEQaiQAIAALZQEBfyMAQRBrIgIkAAJAAkAgACgCAEELRw0AIAIgAEEEajYCDCABQcmEmgFBAyACQQxqQdQGEOYLIQAMAQsgAiAANgIIIAFB8I6aAUEGIAJBCGpB1QYQ5gshAAsgAkEQaiQAIAALZQICfwF+AkAgACkDACIDQgODQgBSDQAgA6ciASABKAIAIgJBf2o2AgAgAkEBRw0AIAEgASgCEBDpHQsCQCAAKAIYIgBFDQAgACgCACIBENgDIAFB4ABBCBC9EyAAQQxBBBC9EwsLZwECfyMAQRBrIgEkAEEAIQIgAUEANgIIIAFBgQI7AQwCQAJAAkACQCAAKAIAQWZqDgMDAAECCyAAKAIIQQVGDQIMAQsgACgCDA0BCyAAIAFBCGoQ5wEgAS0ADCECCyABQRBqJAAgAgtZAQJ/IwBBEGsiAiQAIAFBEEEIIAEoAgBBAkkbaigCACEDIAJBCGogASgCIBDSAyAAIAMgAigCDCIBIAMgAUkbNgIAIAAgAyABIAMgAUsbNgIEIAJBEGokAAtZAQJ/IwBBEGsiAiQAIAFBEEEIIAEoAgBBAkkbaigCACEDIAJBCGogASgCIBCrDiAAIAMgAigCDCIBIAMgAUkbNgIAIAAgAyABIAMgAUsbNgIEIAJBEGokAAtkAQF/IwBBMGsiAiQAIAIgADYCDCACQQE2AhQgAkGU85sBNgIQIAJCATcCHCACQRI2AiwgAiACQShqNgIYIAIgAkEMajYCKCABKAIAIAEoAgQgAkEQahDlICEBIAJBMGokACABC2EBAX8jAEEwayICJAAgAiABNgIMIAIgADYCCCACQQI2AhQgAkHcgYABNgIQIAJCATcCHCACQQk2AiwgAiACQShqNgIYIAIgAkEIajYCKCACQRBqEPEaIQEgAkEwaiQAIAELagECfyMAQSBrIgEkACAALQAAIQIgAEEBOgAAIAEgAjoABwJAIAJBAUcNACABQgA3AhQgAUKBgICAwAA3AgwgAUGQspgBNgIIIAFBB2pBodqYASABQQhqQfSymAEQwBsACyABQSBqJAAgAAtlAQF/IwBBEGsiASQAAkACQAJAQQAoAuj1nQFB/////wdxRQ0AELMkRQ0BCyAAKAIELQBMQQdHDQELIAFBEGokAA8LIAFBBGogACgCAEEAQeK4mAFBIRD7DSABQQRqEMYCELUkAAtlAQF/IwBBEGsiAiQAAkACQCAAKAIAIgAtAABBAUcNACACIABBAWo2AgwgAUHs3psBQQQgAkEMakEmEOYLIQEMAQsgASgCAEG0m5sBQQQgASgCBCgCDBEMACEBCyACQRBqJAAgAQtmAQF/IwBBEGsiAiQAAkACQCAAKAIAIgAoAgBBAUcNACACIABBBGo2AgwgAUHs3psBQQQgAkEMakHUABDmCyEBDAELIAEoAgBBtJubAUEEIAEoAgQoAgwRDAAhAQsgAkEQaiQAIAELaQEBfwJAAkACQCACKAIERQ0AAkAgAigCCCIDDQBBAC0A4PadARoMAgsgAigCACADQQEgARDvAyECDAILQQAtAOD2nQEaCyABEIQBIQILIAAgATYCCCAAIAJBASACGzYCBCAAIAJFNgIAC2EBAn8gACgCCCECAkACQCABQYABTw0AQQEhAwwBCwJAIAFBgBBPDQBBAiEDDAELQQNBBCABQYCABEkbIQMLIAAgAxDJHiABIAAoAgQgACgCCGoQnA0gACADIAJqNgIIQQALZQEBfyMAQRBrIgIkAAJAAkAgACgCACIALQAAQQFHDQAgAiAAQQFqNgIMIAFB7N6bAUEEIAJBDGpBJhDmCyEBDAELIAEoAgBBtJubAUEEIAEoAgQoAgwRDAAhAQsgAkEQaiQAIAELYQEEfyMAQRBrIgMkACADQQhqIAJBBEEEQbjkmwEQqBUgAygCCCEEIAMoAgwhBQJAIAJBAnQiBkUNACAFIAEgBvwKAAALIAAgAjYCCCAAIAU2AgQgACAENgIAIANBEGokAAtcAQJ/AkAgAEEQaigCACIBRQ0AIABBFGooAgAhAiABQQA6AAAgAkUNACABIAJBARC9EwsCQCAAQX9GDQAgACAAKAIEIgFBf2o2AgQgAUEBRw0AIABBGEEIEL0TCwtiAQN/IAAoAgQhAQJAIAAoAggiAkUNACABIQMDQCADKAIAIANBBGooAgBBBEEYENASIANBDGohAyACQX9qIgINAAsLIAAoAgAgAUEEQQwQ0BIgACgCDCAAKAIQQQRBGBDQEgtkAQF/QQAtAOD2nQEaAkBBNBCEASIADQAACyAAQgA3AhQgAEEBNgIQIABCATcCCCAAQgE3AgAgAEEAOgAyIABBATsBMCAAQRxqQgA3AgAgAEEkakIANwIAIABBLGpBADYCACAAC2kBAX9BAC0A4PadARoCQEE0EIQBIgENAAALIAFBADoAMiABQQE7ATAgAUEANgIsIAEgADYCKCABIAA2AiQgASAANgIgIAEgADYCHCABIAA2AhggAUIBNwIQIAFCATcCCCABQgE3AgAgAQtlAQF/IwBBEGsiAiQAAkACQCAAKAIAIgAoAgBBAUcNACACIABBBGo2AgwgAUHs3psBQQQgAkEMakEqEOYLIQEMAQsgASgCAEG0m5sBQQQgASgCBCgCDBEMACEBCyACQRBqJAAgAQtmAQF/IwBBEGsiAiQAAkACQCAAKAIAIgAtAABBAUcNACACIABBAWo2AgwgAUHs3psBQQQgAkEMakGeARDmCyEBDAELIAEoAgBBtJubAUEEIAEoAgQoAgwRDAAhAQsgAkEQaiQAIAELZgEBfyMAQRBrIgIkAAJAAkAgACgCACIALQAAQQFHDQAgAiAAQQFqNgIMIAFB7N6bAUEEIAJBDGpBowEQ5gshAQwBCyABKAIAQbSbmwFBBCABKAIEKAIMEQwAIQELIAJBEGokACABC2QBAX8gAUEwaiIDEJMaIAFBOGogAkEIaikCADcCACABIAIpAgA3AjACQCABLQBcQQJHDQAgAUHMhYQBIAMgAS0APEEDRhstAAxBAkc6AFwLAkBB4ABFDQAgACABQeAA/AoAAAsLaQECfwJAAkACQAJAAkBBACAAKAIAIgFBeWoiAiACIAFLGw4EAAECAwQLIAAQoyAPCyAAKAIEIAAoAghBAUEBENASDwsgACgCBCAAKAIIQQRBCBDQEg8LIAAoAgQgACgCCEEBQQIQ0BILC2kBAX8CQAJAAkAgAigCBEUNAAJAIAIoAggiAw0AQQAtAOD2nQEaDAILIAIoAgAgA0EBIAEQ7wMhAgwCC0EALQDg9p0BGgsgARCEASECCyAAIAE2AgggACACQQEgAhs2AgQgACACRTYCAAthAQR/IAAoAgQhAQJAIAAoAggiAkUNACABIQMDQCADEMgHAkAgA0EwaigCACIERQ0AIAQQlgEgBEHAAEEIEL0TCyADQThqIQMgAkF/aiICDQALCyAAKAIAIAFBCEE4EL8SC2EBBH8gACgCBCEBAkAgACgCCCICRQ0AIAEhAwNAIAMQyAcCQCADQTBqKAIAIgRFDQAgBBCWASAEQcAAQQgQvRMLIANBOGohAyACQX9qIgINAAsLIAAoAgAgAUEIQTgQvxILYwECfwJAIAAoAggiAUUNACAAKAIEIQADQAJAAkAgACgCACICRQ0AIAIQlgEgAkHAAEEIEL0TDAELIABBBGooAgAiAhC/BCACQfAAQQgQvRMLIABBDGohACABQX9qIgENAAsLC2MBAX8jAEEQayICJAACQAJAIAApAwBQDQAgAiAANgIMIAFBlf6ZAUERIAJBDGpBggMQ5gshAAwBCyACIABBCGo2AgggAUHV2psBQQUgAkEIakGwAxDmCyEACyACQRBqJAAgAAtiAAJAAkACQAJAAkACQAJAIAAoAgAOBgECAwQFBgALIABBBGoQmiEPCyAAQQhqEOEhDwsgAEEEahCmIg8LIABBBGoQqCIPCyAAQQRqEKciDwsgAEEEahCfISAAQQhqEJohCwtiAQJ/IwBBEGsiAiQAAkACQCABKAIAQQVHDQAgAkEIaiABKAIEIAEoAggQwxkgAigCDCEDIAIoAgghAQwBCyABKAIsIQMgASgCKCEBCyAAIAE2AgAgACADNgIEIAJBEGokAAthAQV/IAEoAighAiABKAIMIQMgASgCCCEEIAEoAiwiBSEGA0ACQCAGDQACQCABKAI4RQ0AIAEgASgCNCADIAVsajYCNAsgAEEEOgAADwsgAiAEIAMQrgkgBkF/aiEGDAALC2IBAn8jAEEQayIEJAAgBEEANgIMIAQgASAEQQxqEMAXIAQoAgQhBSAAIAM2AhAgAEEANgIMIAAgAzYCCCAAIAI2AgQgACAFOgAYIAAgATYCACAAIAQoAgw2AhQgBEEQaiQAC2MBAn8jAEEQayICJAAgAkEIaiABEAYCQAJAIAIoAggiAQ0AQYCAgIB4IQEMAQsgAiABIAIoAgwQ7iEgAigCACEDIAAgAigCBCIBNgIIIAAgAzYCBAsgACABNgIAIAJBEGokAAtZAQF/IwBBIGsiAiQAIAJBADYCECACQQhqIAEgAkEQahDAFyACQRRqIAIoAgggAigCDBD5FCAAQQhqIAJBFGpBCGooAgA2AgAgACACKQIUNwIAIAJBIGokAAtfAQJ/IAAoAgghAgJAAkAgAUGAAU8NAEEBIQMMAQsCQCABQYAQTw0AQQIhAwwBC0EDQQQgAUGAgARJGyEDCyAAIAMQjh4gASAAKAIEIAAoAghqEJwNIAAgAyACajYCCAtaAQF/IwBBMGsiAyQAIAMgATYCDCADIAA2AgggA0EBNgIUIANBlPObATYCECADQgE3AhwgA0EQrUIghiADQQhqrYQ3AyggAyADQShqNgIYIANBEGogAhCoHQALZQEBfwJAAkAgAkF/TA0AAkACQCACDQBBASEDDAELQQAtAOD2nQEaIAIQhAEiA0UNAgsCQCACRQ0AIAMgASAC/AoAAAsgACACNgIIIAAgAzYCBCAAIAI2AgAPC0GUyYABEIEcCwALXQEBfyMAQSBrIgIkACACQQA6ABggAiABNgIUIAIgADYCECACQQE2AgwgAiACQQxqNgIcIAJBHGpBmIWAARATIQECQCACKAIMRQ0AIAJBEGoQ1R8LIAJBIGokACABC2MBAX8jAEEQayICJAAgAiAAQRRqNgIMIAFBvO6DAUEJQZvugwFBCCAAQQxqQTNBpfCDAUEHIABBOUGs8IMBQQggAEEQakEpQbTwgwFBCSACQQxqQSoQwAwhACACQRBqJAAgAAtaAQJ/AkAgACgCDCIDIAAoAgAiBEcNACAAIAIQ3g0gACgCACEEIAAoAgwhAwsgACADQQFqNgIMIAAoAgQgACgCCCADaiIAQQAgBCAAIARJG2tBAnRqIAE2AgALaQEBfyMAQRBrIgIkACACIABBggJqNgIMIAFBjcWAAUEOQYHFgAFBByAAQdAAQfDEgAFBBSAAQYACakHGAEGIxYABQQUgAEGBAmpBxgBBm8WAAUEFIAJBDGpBJhDADCEAIAJBEGokACAAC2MBAX8CQCAAKAIIIgIgAUH/AXEiAU0NAAJAIAAoAgQgAWoiAi0AAA0AIAJBAToAACAAIAAoAgxBAWo2AgwgACAALwEQIAFB/KuFAWotAABqOwEQCw8LIAEgAkGgwoABEMMSAAtcAQR/AkAgASAAKAIIIgIoAgAgACgCECIDIAAoAgwiBGoiBWtNDQAgAiAFIAEQ/goLIAQgAWohAQJAIANFDQAgAigCBCICIAFqIAIgBGogA/wKAAALIAAgATYCDAtXAQF/IwBBEGsiBSQAAkACQCACIARPDQAgBUEEaiADIAQQlRQgACAFQQRqIAEgAhCWDAwBCyAFQQRqIAEgAhCVFCAAIAVBBGogAyAEEJYMCyAFQRBqJAALYgEBfyMAQRBrIgIkAAJAAkAgACgCAEEBcUUNACACIABBEGo2AgwgAUHs3psBQQQgAkEMakGKARDmCyEADAELIAEoAgBBtJubAUEEIAEoAgQoAgwRDAAhAAsgAkEQaiQAIAALXQECf0EBIQMCQCACRQ0AAkACQAJAIAJBf2oiBCABTw0AIAAgBGotAABBdmoOBAMBAQIBCyAEIAFBpNKEARDDEgALQQAPCyACIAFPDQAgACACai0AAEEKRyEDCyADC1wBAn8jAEEgayIEJAAgBEEAOgAcIARBADYCGCAEQQA2AgwgBCAAQeACajYCFAJAA0AgBEEMahDACiIFQf8BcUECRg0BIAAgASACIAUgAxDNCQwACwsgBEEgaiQAC2MBAX8jAEEQayICJAAgAiAAQSxqNgIMIAFBk+6DAUEIQZvugwFBCCAAQRhqQTNBo+6DAUEJIABBNEGs7oMBQQsgAEEcakE1QbzqgwFBCyACQQxqQSoQwAwhACACQRBqJAAgAAtkAQJ/IwBBEGsiASQAAkAgACgCBEUNAAJAIAAoAgAiAi0AAA0AIAJBAToAACAAIAAoAghBAWo2AggLIAFBEGokAA8LIAFCADcCCEG04oQBQSogAUEIakGI6IMBQeDihAEQ6hAAC2UBAX8CQAJAIAJBf0wNAAJAAkAgAg0AQQEhAwwBC0EALQDg9p0BGiACEIQBIgNFDQILAkAgAkUNACADIAEgAvwKAAALIAAgAjYCCCAAIAM2AgQgACACNgIADwtBuOSbARCBHAsAC2UBAX8CQAJAIAJBf0wNAAJAAkAgAg0AQQEhAwwBC0EALQDg9p0BGiACEIQBIgNFDQILAkAgAkUNACADIAEgAvwKAAALIAAgAjYCCCAAIAM2AgQgACACNgIADwtBuOSbARCBHAsAC2ABAn8jAEEQayICJAACQAJAIAEtAABBA0YNAEEAIQEMAQsgAkEIaiABKAIEIgEoAgAgASgCBCgCGBEHACACKAIMIQMgAigCCCEBCyAAIAM2AgQgACABNgIAIAJBEGokAAtgAQJ/IwBBEGsiAiQAAkACQCABLQAAQQNGDQBBACEBDAELIAJBCGogASgCBCIBKAIAIAEoAgQoAiQRBwAgAigCDCEDIAIoAgghAQsgACADNgIEIAAgATYCACACQRBqJAALXAEBfwJAIAAoAggiAyAAKAIARw0AIAAgAhCvGAsgACADQQFqNgIIIAAoAgQgA0EYbGoiACABKQMANwMAIABBCGogAUEIaikDADcDACAAQRBqIAFBEGopAwA3AwALYgEBfyMAQRBrIgIkAAJAAkAgAC0AFEECRg0AIAIgADYCDCABQdXamwFBBSACQQxqQeMCEOYLIQAMAQsgAiAANgIIIAFBmYWaAUENIAJBCGpBygMQ5gshAAsgAkEQaiQAIAALZwEBfyMAQRBrIgIkACACIABBFGo2AgwgAUHV2psBQQVB0PyZAUEEIABBCGpBgAJBsIGaAUEEIABBEGpBmwNB+YKaAUEDIABBoANB/IKaAUEIIAJBDGpBoQMQwAwhACACQRBqJAAgAAtiAQF/IwBBEGsiAiQAAkACQCAALQAUQQJGDQAgAiAANgIMIAFB1dqbAUEFIAJBDGpB4wIQ5gshAAwBCyACIAA2AgggAUGXmpoBQQ8gAkEIakGcBBDmCyEACyACQRBqJAAgAAtiAQF/IwBBEGsiAiQAAkACQCAALQAUQQJGDQAgAiAANgIMIAFB1dqbAUEFIAJBDGpB4wIQ5gshAAwBCyACIAA2AgggAUHckJoBQQogAkEIakGxAhDmCyEACyACQRBqJAAgAAtiAQF/IwBBEGsiAiQAAkACQCAALQA0QQRGDQAgAiAANgIMIAFB14KaAUEGIAJBDGpBwwIQ5gshAAwBCyACIAA2AgggAUHbl5oBQQwgAkEIakHbAhDmCyEACyACQRBqJAAgAAtaAQJ/IwBBEGsiAiQAAkACQCAAKAIAIgNBAWpBfnEgA0YNACACQQhqIAAQ5hsgAigCDCEAIAIoAgghAwwBCyAAKAIIIQALIAEgAyAAEJwGIQMgAkEQaiQAIAMLXAEDfwJAIAAoAgwiASAAKAIEIgJGDQAgASACa0ECdiEBA0AgAigCACIDQQhqEK4DIANBIEEIEL0TIAJBBGohAiABQX9qIgENAAsLIAAoAgggACgCAEEEQQQQvxILXQEDfwJAIAAoAgwiASAAKAIEIgJGDQAgASACa0EEdiEBIAJBDGohAgNAIAIoAgAiAxCtASADQcAAQQgQvRMgAkEQaiECIAFBf2oiAQ0ACwsgACgCCCAAKAIAEPgiC2IBAX8jAEEQayICJAACQAJAIAAtABRBAkYNACACIAA2AgwgAUHV2psBQQUgAkEMakHjAhDmCyEADAELIAIgADYCCCABQZeamgFBDyACQQhqQZ0GEOYLIQALIAJBEGokACAAC2IBAX8jAEEQayICJAACQAJAIAAtADRBBEYNACACIAA2AgwgAUHXgpoBQQYgAkEMakHFBRDmCyEADAELIAIgADYCCCABQduXmgFBDCACQQhqQdQFEOYLIQALIAJBEGokACAAC2IBAX8jAEEQayICJAACQAJAIAAtABRBAkYNACACIAA2AgwgAUHV2psBQQUgAkEMakHjAhDmCyEADAELIAIgADYCCCABQZmFmgFBDSACQQhqQdAGEOYLIQALIAJBEGokACAAC10BA38gACgCBCEBAkAgACgCCCICRQ0AIAEhAwNAIANBDGogA0EEaigCACADQQhqKAIAIAMoAgAoAhARCwAgA0EQaiEDIAJBf2oiAg0ACwsgACgCACABQQRBEBC/EgtmAQJ/AkAgACgCHCIDIAAoAiAiBCACQX9qEOUQIgIgBEF/akYNACADIAQgAkEBakG865sBELweIgQtAAlFDQACQAJAIAQtAAgiBA4FAQICAgEACyAEQcUARw0BCyAAIAFBOxCiGgsLXQEDfyAAKAIEIQECQCAAKAIIIgJFDQAgASEDA0AgA0EMaiADQQRqKAIAIANBCGooAgAgAygCACgCEBELACADQRBqIQMgAkF/aiICDQALCyAAKAIAIAFBBEEQEL8SC18BAn8gACgCGCIBIAEoAgAiAUF/ajYCAAJAIAFBAUcNACAAKAIYEJETCyAAEI0aAkAgACgCHCIBRQ0AIAEgASgCACICQX9qNgIAIAJBAUcNACAAKAIcIAAoAiAQ7BALC10BAX9BASEDAkACQCABQf8BcUEBRg0AIAFBASACKAIIGyEDDAELIAJBADYCCCACQQRBBBDjGSACEKYJCyAAIAM6AAwgACACKQIANwIAIABBCGogAkEIaigCADYCAAtjAQF/IwBBEGsiAiQAAkACQCAAKAIAIgAoAgBBAkYNACACIAA2AgwgAUHs3psBQQQgAkEMakGJARDmCyEBDAELIAEoAgBBtJubAUEEIAEoAgQoAgwRDAAhAQsgAkEQaiQAIAELYAEBfyMAQRBrIgIkAAJAAkAgACgCAEEBRw0AIAIgAEEEajYCDCABQezemwFBBCACQQxqQSoQ5gshAAwBCyABKAIAQbSbmwFBBCABKAIEKAIMEQwAIQALIAJBEGokACAAC2MBAX8jAEEQayICJAACQAJAIAAoAgAiAC0ADEECRg0AIAIgADYCDCABQezemwFBBCACQQxqQY0BEOYLIQEMAQsgASgCAEG0m5sBQQQgASgCBCgCDBEMACEBCyACQRBqJAAgAQtjAQF/IwBBEGsiAiQAAkACQCAAKAIAIgAtAAxBA0YNACACIAA2AgwgAUHs3psBQQQgAkEMakGMARDmCyEBDAELIAEoAgBBtJubAUEEIAEoAgQoAgwRDAAhAQsgAkEQaiQAIAELYwEBfyMAQRBrIgIkAAJAAkAgACgCACIAKAIAQQNGDQAgAiAANgIMIAFB7N6bAUEEIAJBDGpBkwEQ5gshAQwBCyABKAIAQbSbmwFBBCABKAIEKAIMEQwAIQELIAJBEGokACABC2IBAX8jAEEQayICJAAgAiABKAIAQev4hAFBCSABKAIEKAIMEQwAOgAIIAIgATYCBCACQQA6AAkgAkEANgIAIAIgACgCADYCDCACIAJBDGpBJxDDCxDyDyEBIAJBEGokACABC2IBAX8jAEEQayICJAAgAiABKAIAQZT6hAFBByABKAIEKAIMEQwAOgAIIAIgATYCBCACQQA6AAkgAkEANgIAIAIgACgCADYCDCACIAJBDGpBJxDDCxDyDyEBIAJBEGokACABC2MBAX8jAEEQayICJAACQAJAIAAoAgAiACgCAEECRg0AIAIgADYCDCABQezemwFBBCACQQxqQakBEOYLIQEMAQsgASgCAEG0m5sBQQQgASgCBCgCDBEMACEBCyACQRBqJAAgAQtlAQF/IwBBEGsiAiQAIAIgACgCACgCACIAQdgAajYCDCABQd/vhAFBCkHA64QBQQYgAEEIakGuAUG4hZoBQQUgAEHMAGpBrwFB6e+EAUELIAJBDGpBsAEQ+QwhACACQRBqJAAgAAthAQF/IwBBEGsiAiQAAkACQCAAKAIAQQFHDQAgAiAAQQRqNgIMIAFB7N6bAUEEIAJBDGpB6QEQ5gshAAwBCyABKAIAQbSbmwFBBCABKAIEKAIMEQwAIQALIAJBEGokACAAC2MBAX8jAEEQayICJAACQAJAIAAoAgAiAC0AAEECRg0AIAIgADYCDCABQezemwFBBCACQQxqQYsBEOYLIQEMAQsgASgCAEG0m5sBQQQgASgCBCgCDBEMACEBCyACQRBqJAAgAQtnAQF/IwBBEGsiAiQAAkACQCAAKAIAIgAoAgBBgICAgHhGDQAgAiAANgIMIAFB7N6bAUEEIAJBDGpBhQIQ5gshAQwBCyABKAIAQbSbmwFBBCABKAIEKAIMEQwAIQELIAJBEGokACABC14BAX8jAEEgayIDJAAgA0EIaiAAKAIAQQhqQcS1mAEQpx0gAygCDCEAIANBEGogAygCCCABEI0KIANBEGoQqg4gAkHUtZgBEL0UIAAgACgCAEEBajYCACADQSBqJAALXgEBfyMAQSBrIgMkACADQQhqIAAoAgRBCGpBtLaYARCnHSADKAIMIQAgA0EQaiADKAIIIAEQjQogA0EQahCqDiACQcS2mAEQvRQgACAAKAIAQQFqNgIAIANBIGokAAtbAQF/AkAgACgCFCIEIAAoAgxHDQAgAEEMahCuGAsgACAEQQFqNgIUIAAoAhAgBEEUbGoiACADKQIANwIAIAAgAjYCECAAIAE2AgwgAEEIaiADQQhqKAIANgIAC2MBBH9BAC0A4PadARoCQEEMEIQBIgFFDQBBAC0A4PadARogACgCACIAKAIIIQIgACgCBCEDQeAAEIQBIgRFDQAgBCAAKAIAEGUgASACNgIIIAEgAzYCBCABIAQ2AgAgAQ8LAAtbAAJAIAAtAHhBAXFFDQAgAxCuAw8LIAEgAiADEIQXIQICQCAAKAJIIgMgACgCQEcNACAAQcAAakG4xpkBELUYCyAAIANBAWo2AkggACgCRCADQQJ0aiACNgIAC2EBAX8jAEEQayICJAACQAJAIAAoAgBBAUcNACACIABBBGo2AgwgAUHs3psBQQQgAkEMakGGAhDmCyEADAELIAEoAgBBtJubAUEEIAEoAgQoAgwRDAAhAAsgAkEQaiQAIAALYwEBfyMAQRBrIgIkAAJAAkAgACgCACIALQA0QQZGDQAgAiAANgIMIAFB7N6bAUEEIAJBDGpBwwMQ5gshAQwBCyABKAIAQbSbmwFBBCABKAIEKAIMEQwAIQELIAJBEGokACABC2MBAX8jAEEQayICJAACQAJAIAAoAgAiACgCAEEERg0AIAIgADYCDCABQezemwFBBCACQQxqQckDEOYLIQEMAQsgASgCAEG0m5sBQQQgASgCBCgCDBEMACEBCyACQRBqJAAgAQtjAQF/IwBBEGsiAiQAAkACQCAAKAIAIgAtACVBA0YNACACIAA2AgwgAUHs3psBQQQgAkEMakGGBBDmCyEBDAELIAEoAgBBtJubAUEEIAEoAgQoAgwRDAAhAQsgAkEQaiQAIAELYwEBfyMAQRBrIgIkAAJAAkAgACgCACIAKAIAQQdGDQAgAiAANgIMIAFB7N6bAUEEIAJBDGpBuAQQ5gshAQwBCyABKAIAQbSbmwFBBCABKAIEKAIMEQwAIQELIAJBEGokACABC2cBAX8jAEEQayICJAACQAJAIAAoAgAiACgCAEGAgICAeEYNACACIAA2AgwgAUHs3psBQQQgAkEMakHXAxDmCyEBDAELIAEoAgBBtJubAUEEIAEoAgQoAgwRDAAhAQsgAkEQaiQAIAELYwEBfyMAQRBrIgIkAAJAAkAgACgCACIALQAUQQJGDQAgAiAANgIMIAFB7N6bAUEEIAJBDGpB4wIQ5gshAQwBCyABKAIAQbSbmwFBBCABKAIEKAIMEQwAIQELIAJBEGokACABC2MBAX8jAEEQayICJAACQAJAIAAoAgAiACgCAEECRg0AIAIgADYCDCABQezemwFBBCACQQxqQboDEOYLIQEMAQsgASgCAEG0m5sBQQQgASgCBCgCDBEMACEBCyACQRBqJAAgAQtVAQJ/IwBBEGsiAiQAIAAoAgghAyAAKAIEIQAgAiABNgIMAkAgA0UNACADQShsIQMDQCACQQxqIAAQ5wUgAEEoaiEAIANBWGoiAw0ACwsgAkEQaiQAC1UBAn8jAEEQayICJAAgACgCCCEDIAAoAgQhACACIAE2AgwCQCADRQ0AIANBKGwhAwNAIAJBDGogABDoByAAQShqIQAgA0FYaiIDDQALCyACQRBqJAALWwEDfwJAIAAoAggiAkUNACAAKAIEIQAgAkEwbCECIAEtACUhAyABLQAkIQQDQCABQQM6ACQgACABEHQgASADOgAlIAEgBDoAJCAAQTBqIQAgAkFQaiICDQALCwtjAQF/IwBBEGsiAiQAAkACQCAAKAIAIgAtACVBA0YNACACIAA2AgwgAUHs3psBQQQgAkEMakGLBhDmCyEBDAELIAEoAgBBtJubAUEEIAEoAgQoAgwRDAAhAQsgAkEQaiQAIAELZwEBfyMAQRBrIgIkAAJAAkAgACgCACIAKAIAQYCAgIB4Rg0AIAIgADYCDCABQezemwFBBCACQQxqQecFEOYLIQEMAQsgASgCAEG0m5sBQQQgASgCBCgCDBEMACEBCyACQRBqJAAgAQtjAQF/IwBBEGsiAiQAAkACQCAAKAIAIgAtADRBBkYNACACIAA2AgwgAUHs3psBQQQgAkEMakHKBhDmCyEBDAELIAEoAgBBtJubAUEEIAEoAgQoAgwRDAAhAQsgAkEQaiQAIAELYwEBfyMAQRBrIgIkAAJAAkAgACgCACIAKAIAQQRGDQAgAiAANgIMIAFB7N6bAUEEIAJBDGpBzwYQ5gshAQwBCyABKAIAQbSbmwFBBCABKAIEKAIMEQwAIQELIAJBEGokACABC2MBAX8jAEEQayICJAACQAJAIAAoAgAiACgCAEECRg0AIAIgADYCDCABQezemwFBBCACQQxqQbEFEOYLIQEMAQsgASgCAEG0m5sBQQQgASgCBCgCDBEMACEBCyACQRBqJAAgAQtjAQF/IwBBEGsiAiQAAkACQCAAKAIAIgAoAgBBB0YNACACIAA2AgwgAUHs3psBQQQgAkEMakH4BBDmCyEBDAELIAEoAgBBtJubAUEEIAEoAgQoAgwRDAAhAQsgAkEQaiQAIAELVQECfyMAQRBrIgIkACAAKAIIIQMgACgCBCEAIAIgATYCDAJAIANFDQAgA0EobCEDA0AgAkEMaiAAEJQIIABBKGohACADQVhqIgMNAAsLIAJBEGokAAtVAQJ/IwBBEGsiAiQAIAAoAgghAyAAKAIEIQAgAiABNgIMAkAgA0UNACADQShsIQMDQCACQQxqIAAQ6g4gAEEoaiEAIANBWGoiAw0ACwsgAkEQaiQAC1UBAn8jAEEQayICJAAgACgCCCEDIAAoAgQhACACIAE2AgwCQCADRQ0AIANBKGwhAwNAIAJBDGogABCYByAAQShqIQAgA0FYaiIDDQALCyACQRBqJAALVQECfyMAQRBrIgIkACAAKAIIIQMgACgCBCEAIAIgATYCDAJAIANFDQAgA0EobCEDA0AgAkEMaiAAEL4GIABBKGohACADQVhqIgMNAAsLIAJBEGokAAthAQJ/IwBBEGsiAiQAAkACQAJAIAEoAgAOAwABAQALIAJBCGogAUEIahCLFCACKAIMIQMgAigCCCEBDAELIAEoAgwhAyABKAIIIQELIAAgATYCACAAIAM2AgQgAkEQaiQAC1sBA38jAEEQayICJABBACEDQQAhBAJAIAEtAMgBQQlHDQAgAkEIaiABQQEgASgCwAEQzA4gAigCCEEBcSEEIAIoAgwhAwsgACADNgIEIAAgBDYCACACQRBqJAALXAIBfwF+IwBBEGsiAyQAIANBCGogAiABKAIIIAEgAS0AFBD+BgJAAkAgAy0ACEEERg0AIAMpAwgiBEL/AYNCBFENACAAIAQ3AgAMAQsgAEEEOgAACyADQRBqJAALWAEBfyMAQdAAayIEJAACQAJAIAMgAUkNACACIAMgACABEMIeIQEMAQsgBEEQaiAAIAEgAiADEPMCIARBBGogBEEQahDkByAEKAIEIQELIARB0ABqJAAgAQtgAQN/AkAgAC0ADCICIAEtAAwiA0YNACACIANKIAIgA0hrDwtBACEDIAEhBAJAAkACQCACDgMBAgABCyAAIQQgASEACyAEKAIEIAQoAgggACgCBCAAKAIIEL4bIQMLIAMLXAEDfyMAQRBrIgMkACADQQhqIAJBAUEBQbjkmwEQ3RUgAygCCCEEIAMoAgwhBQJAIAJFDQAgBSABIAL8CgAACyAAIAI2AgggACAFNgIEIAAgBDYCACADQRBqJAALTAEBf0EAIQQCQCAAIAEgAiADEN4SRQ0AQQEhBCACIABJDQAgAiABIABqIgFPDQAgAiADQQEgA0EBSxtqIgIgAE0gAiABS3IhBAsgBAtVAQJ/IwBBEGsiBCQAIARBADYCDCAEIAMgBEEMahCQECABIAIgBCgCACAEKAIEIgMQyh4hBSAAIAIgA2s2AgQgACABIANqQQAgBRs2AgAgBEEQaiQAC2ABAX8jAEEQayICJAAgACgCACEAIAIgASgCAEH094QBQQsgASgCBCgCDBEMADoADCACIAE2AgggAkEAOgANIAJBADYCBCACQQRqIABBsgEQwwsQ8g8hASACQRBqJAAgAQthAQF/IwBBEGsiAiQAAkACQCAAKAIAIgAoAgBFDQAgAiAANgIMIAFB7N6bAUEEIAJBDGpBtAEQ5gshAQwBCyABKAIAQbSbmwFBBCABKAIEKAIMEQwAIQELIAJBEGokACABC1oBAX9BASEDAkAgAiABRg0AAkACQAJAIAIgAU8NACAAIAJqIgEtAABBdmoOBAIBAQMBCyACIAFBtNKEARDDEgALQQAPCyACRQ0AIAFBf2otAABBDUchAwsgAwtgAQN/QQEhAgJAIABBAWogARCuCA0AIAEoAgAiA0GI/YQBQQMgASgCBCgCDCIEEQwADQAgAEECaiABEK4IDQBBACECIAAtAABBAUcNACADQYv9hAFBDCAEEQwAIQILIAILWAECfyMAQRBrIgIkAAJAAkAgASgCACIBKAIAQQFGDQBBACEBDAELIAJBCGogAUEEahC7FCACKAIMIQMgAigCCCEBCyAAIAM2AgQgACABNgIAIAJBEGokAAtZAQF/IwBBIGsiAyQAIANBCGogACgCAEEIakHktZgBEKcdIAMoAgwhACADQRBqIAMoAgggARCNCiADQRBqEKoOIAIQ+REgACAAKAIAQQFqNgIAIANBIGokAAtZAQF/IwBBIGsiAyQAIANBCGogACgCBEEIakHUtpgBEKcdIAMoAgwhACADQRBqIAMoAgggARCNCiADQRBqEKoOIAIQ+REgACAAKAIAQQFqNgIAIANBIGokAAtc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ACgCAA0AIAEgACgCBBCEESAAEOUhIABBCGogAUEIaikCADcCACAAIAEpAgA3AgAgACgCAA0AQZKpmwFBKEGg3JsBEIwaAAsgAUEQaiQAIAALWAEDfyMAQRBrIgEkABDmHyECIAAtAAwhAyABIABBBGooAgAgAEEIaigCABCVFCACIAEpAgA3AgAgASADOgAMIAJBCGogAUEIaikCADcCACABQRBqJAAgAgtXAQN/IwBBEGsiBCQAQQAhBUEAIQYCQCABLQDIAUESRw0AIARBCGogASACIAMQ0AIgBCgCCEEBcSEGIAQoAgwhBQsgACAFNgIEIAAgBjYCACAEQRBqJAALWQIBfwF+IwBBEGsiAyQAIANBCGogAiABKAIIIAFBABD+BgJAAkAgAy0ACEEERg0AIAMpAwgiBEL/AYNCBFENACAAIAQ3AgAMAQsgAEEEOgAACyADQRBqJAALYwACQAJAIAEgAkGah4ABQQYQwh4NAAJAIAEgAkGgh4ABQQgQwh4NACAAIAEgAkGoh4ABQQIQhhE2AgRBASECDAILIABBAToAAUEAIQIMAQtBACECIABBADoAAQsgACACOgAAC1kBAX8jAEEgayIDJAACQCABQf//A0sNACAAIAE7AQQgAEEANgIAIANBIGokAA8LIANBADYCGCADQQE2AgwgA0GwiYABNgIIIANCBDcCECADQQhqIAIQqB0AC2EBBH8gACgCACECIAAoAgQhA0EAIQRBACEFAkADQCABIAVGDQEgAEGBgICAeDYCAAJAIAJBgYCAgHhGDQAgAiADENYgIAVBAWohBUGBgICAeCECDAELCyABIAVrIQQLIAQLXgEBfyMAQSBrIgEkAAJAIABBf0oNACABQQE2AgQgAUHg+oQBNgIAIAFCATcCDCABQSk2AhwgAUGw4oQBNgIYIAEgAUEYajYCCCABQbjGgAEQqB0ACyABQSBqJAAgAAtUAAJAIAEoAgAiAUEBcUUNACABIAQRBAAhAQJAIANFDQAgASACIAP8CgAACyAAIAM2AgggACABNgIEIAAgAyACaiABazYCAA8LIAAgASACIAMQkhMLVgEBfyMAQRBrIgUkACAFQQRqIAFBACACIAMQqw0gBSgCCCEDAkAgBSgCBEEBRw0AIAMgBSgCDCAEENggAAsgACAFKAIMNgIEIAAgAzYCACAFQRBq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IQQCQCABKAIAQQdGDQAgAkEIaiABEKsOIAIoAgwhAyACKAIIIQQLIAAgAzYCBCAAIAQ2AgAgAkEQaiQAC08BA38jAEEQayICJABBACEDQQAhBAJAIAEoAgBBAkYNACACQQhqIAEQixIgAigCDCEDIAIoAgghBAsgACADNgIEIAAgBDYCACACQRBqJAALWQEBfyABKAIMIQICQAJAAkACQCABKAIEDgIAAQILIAINAUEBIQFBACECDAILIAINACABKAIAIgEoAgQhAiABKAIAIQEMAQsgACABEIgKDwsgACABIAIQnBULUAECfyMAQRBrIgMkACABIAEoAngiBCACcjYCeCADQQhqIAEQ9gsgAygCCCECIAEgBDYCeCADKAIMIQEgACACNgIAIAAgATYCBCADQRBqJAALUgEDfyMAQRBrIgIkACABIAEoAngiA0H//3txNgJ4IAJBCGogARD2CyACKAIIIQQgASADNgJ4IAIoAgwhASAAIAQ2AgAgACABNgIEIAJBEGokAAtRAQN/IwBBEGsiAiQAIAEgASgCeCIDQYAgcjYCeCACQQhqIAEQ1wQgAigCCCEEIAEgAzYCeCACKAIMIQEgACAENgIAIAAgATYCBCACQRBqJAALUgEDfyMAQRBrIgIkACABIAEoAngiA0H/v39xNgJ4IAJBCGogARC0BCACKAIIIQQgASADNgJ4IAIoAgwhASAAIAQ2AgAgACABNgIEIAJBEGokAAtKAQN/QQAhAwJAIAJFDQACQANAIAAtAAAiBCABLQAAIgVHDQEgAEEBaiEAIAFBAWohASACQX9qIgJFDQIMAAsLIAQgBWshAwsgAwtTAQN/IAAoAgghASAAKAIEIgIhAwJAA0AgAUUNAQJAIAMoAgBBgICAgHhGDQAgAxCqFwsgAUF/aiEBIANBIGohAwwACwsgACgCACACQQRBIBC/EgtQAAJAAkAgAUF/TA0AAkACQCABDQBBASECDAELQQAtAOD2nQEaIAFBARCuHCICRQ0CCyAAIAE2AgggACACNgIEIAAgATYCAA8LIAIQgRwLAAtSAQF/AkACQAJAIAJFDQBBACEDIAEoAtQCIgFFDQFBACECDAILQQAhAiABKALQAiIBDQFBASEDC0EBIQIgAxD2HiEBCyAAIAE2AgQgACACNgIAC1UBAX9BDCECAkAgAS0AC0H+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KAIAIgIQlgEgAkHAAEEIEL0TIABBEGohACABQX9qIgENAAsLC0IBA38gACgCBCEBAkAgACgCCCICRQ0AIAEhAwNAIAMQ7gIgA0EwaiEDIAJBf2oiAg0ACwsgACgCACABQQhBMBC/EgtMAQF/QQAtAOD2nQEaAkBBHBCEASIBDQAACyABQgA3AgwgAUEANgIIIAFCgICAgIABNwIAIAAgATYCBCAAQQI2AgAgAUESakIANwEACz0AAkAgAEIDg0IAUg0AIACnKQMIIQALIACnQd3L3Z55bCAAQiCIp2pB3cvdnnlsIAFqQd3L3Z55bEEPd60LPwECfyAAKAIIIQIgACgCBCEDAkAgACgCAEEBRw0AIAMgAigCCEF/akF4cWpBCGohAwsgAyABIAIoAkARLAAaC0YBAX8gAS0AOSECIAFBAToAOSAAKAIgIAEQbSABIAI6ADkCQCAAKAIAQQJHDQAgAUEBOgA5IAAoAgQgARBtIAEgAjoAOQsLRQECfyABKAIEIQQCQAJAIAEoAgAiBUEBRg0AIAEoAgghAwwBCwJAIAVFDQAgBBDrFgsgAiEECyAAIAM2AgQgACAENgIAC0oBAX8gACgCACgCACEAAkAgASgCCCICQYCAgBBxDQACQCACQYCAgCBxDQAgACABEMoiDwsgACgCACABENUQDwsgACgCACABENYQC0EBAX8CQCAAKAIUIgMgACgCDEcNACAAQQxqEL8ZCyAAIANBAWo2AhQgACgCECADQQN0aiIAIAI6AAQgACABNgIAC0EBAX8gACgCCEEEdCECIAAoAgQhAAJAA0AgAkUNASAAIAEQgSQgACgCDCABEIcbIAJBcGohAiAAQRBqIQAMAAsLCz4BAX8DQAJAIAINAA8LIAAoAAAhAyAAIAEoAAA2AAAgASADNgAAIAJBf2ohAiABQQRqIQEgAEEEaiEADAALC0cBAX8gACgCACEAAkAgASgCCCICQYCAgBBxDQACQCACQYCAgCBxDQAgACABEMoiDwsgACgCACABENUQDwsgACgCACABENYQC0cBAX8gACgCACEAAkAgASgCCCICQYCAgBBxDQACQCACQYCAgCBxDQAgACABEMoiDwsgACgCACABENUQDwsgACgCACABENYQCz8BAX8jAEEQayICJAAgACgCACEAIAJBADYCDCACIAEgAkEMahD3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QQR0IQIgACgCBCEAAkADQCACRQ0BIABBDGogARCBJCACQXBqIQIgAEEQaiEADAALCws8AQJ/IAAgAhCoHiAAKAIIIQMCQCACQThsIgRFDQAgACgCBCADQThsaiABIAT8CgAACyAAIAMgAmo2AggLOgEBfyAAKAIIQQR0IQIgACgCBCEAAkADQCACRQ0BIABBDGogARDHBCACQXBqIQIgAEEQaiEADAALCws9AQJ/AkADQCABIgMgADYCDCADKAIQIgRFDQEgBEEEaiEBIAQoAgBBCEYNAAsLIANBEGoQ4yEgAyACNgIQC0UBAX8CQAJAAkAgACgCACIAKAIADgIAAQILIAAoAggiAUUNASAAKAIEQQEgARDRIAwBCyAAQQRqEO4WCyAAQRRBBBC9Ews8AQF/IAAtABQhASAAQQE6ABQCQAJAIAENACAAQXhqIgAgACgCAEEBaiIBNgIAIAFFDQEgABDTJAsPCwALOgECfyMAQRBrIgEkACABQQRqIAAQxg0gASgCCCIAIAEoAgwQCiECIAEoAgQgABDeIiABQRBqJAAgAgs+AgF/AX4jAEEQayICJAAgAkEIaiABQQhBIEHwjIABEN0VIAIpAwghAyAAQQA2AgggACADNwIAIAJBEGokAAs+AgF/AX4jAEEQayICJAAgAkEIaiABQQhBEEGQjYABEN0VIAIpAwghAyAAQQA2AgggACADNwIAIAJBEGokAAs8AQF/IwBBEGsiAiQAIAJBCGogACAAKAIAKAIEEQcAIAIoAgggASACKAIMKAIQEQgAIQAgAkEQaiQAIAALPwEBfyMAQRBrIgIkACACIAAoAgAoAgA2AgwgAUHWxIABQQ5B2KuXAUEDIAJBDGpBJhDdDSEAIAJBEGokACAACzoBAX8jAEEQayICJAAgAkEANgIMIAIgASACQQxqEMAXIAAgAigCACACKAIEEMIEIQEgAkEQaiQAIAELOAACQAJAIAEgAksNACACIANNDQEgAiADIAQQvCIACyABIAIgBBDXIgALIAAgAjYCBCAAIAE2AgALQQEBfyAAKAIAIQACQCABKAIIIgJBgICAEHENAAJAIAJBgICAIHENACAAIAEQyiIPCyAAIAEQsBAPCyAAIAEQsRALOwIBfwF+IwBBEGsiAyQAIANBCGogAUEBQQEgAhCoFSADKQMIIQQgAEEANgII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AgwgASACEMUeIQAgA0EQaiQAIAALNQEBfyMAQRBrIgIkACACIAAoAgA2AgwgAUH0xZgBQQQgAkEMakExEOYLIQAgAkEQaiQAIAALOAEBfwJAIAEoAgAiA0H/////B0kNACACEPgWAAsgASADQQFqNgIAIAAgATYCBCAAIAFBBGo2AgALRQEBfEQAAAAAAAD4fyECAkAgASABYg0AAkAgAJlEAAAAAAAA8D9iDQAgAZlEAAAAAAAA8H9hDQELIAAgARDUJCECCyACCzYBAX8gACgCACICQRhqIQACQCACLQAsQQJHDQAgACABEKgcCwJAIAEoAgBFDQAgASAAEN8FCws7AQF/IAAoAgAiARDJASABQcAAQQgQvRMgACgCBCIAEOUaIAAoAgAgAEEEaigCABDxIiAAQRRBBBC9Ews1AQF/IAEoAhQhAgJAA0AgAC0AJUECRg0BIAIgAEEIahDYDhogACgCICEADAALCyABIAAQfQs2AAJAIAAtABRBAkcNACAAKAIAIgBBGGoQqxwgACkDABDzHyAAQTBBCBC9Ew8LIAApAwAQ8x8LLwACQCADaUEBRw0AIAFBgICAgHggA2tLDQAgACABIAMgAhDvAyIDRQ0AIAMPCwALNwEBfyMAQRBrIgIkACABIAJBD2pB+ISAARCMByEBIABBlYCAgHg2AgAgACABNgIEIAJBEGokAAsvAQF/AkAgABCEASICRQ0AIAJBfGotAABBA3FFDQAgAEUNACACQQAgAPwLAAsgAgsyAQF/IwBBEGsiAiQAIAIgADYCDCABQd2ZgAFBCCACQQxqQS4Q5gshACACQRBqJAAgAAszAQF/IwBBEGsiAiQAIAIgADYCDCABQYTugwFBDyACQQxqQcEAEOYLIQAgAkEQaiQAIAALMwEBfyMAQRBrIgIkACACIAA2AgwgAUHIxoABQQwgAkEMakHHABDmCyEAIAJBEGokACAACy0AIAAoAiQgACgCFEEMbGogACgCICAAKAIIakECdGogACgCMEEAIAAoAigbagszAQF/IwBBEGsiAiQAIAIgADYCDCABQdDEgAFBBiACQQxqQdIAEOYLIQAgAkEQaiQAIAALMwEBfyMAQRBrIgIkACACIAA2AgwgAUGV+IQBQQYgAkEMakHTABDmCyEAIAJBEGokACAACzQBAX8gACACEMkeIAAoAggh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AEEDRg0AIAAQoyIMAQsgAEEEahC3IAsgAEEoQQgQvRMLMwACQAJAIAAoAgAiACgCAEGAgICAeEYNACAAEPYfDAELIABBBGoQmiELIABBGEEEEL0TCy8BAX8CQCAAKAIAIgFBAkYNACAAQQRqIQACQCABDQAgACgCABCaIg8LIAAQmiELCzUBAX8gAEEEaiEBAkACQAJAIAAoAgAOAgECAAsgARCfIQ8LIAEoAgAQmiIPCyABKAIAEJsiCzAAIAAoAgAgACgCBCABEKMhIABBIGogARC+ICAAKAJoIAEQjRMgAEHIAGogARCnHwsvAQF/IwBBIGsiASQAIAFBgICAgHg2AgggACAAIAFBCGoQhBchACABQSBqJAAgAAsxAQF/AkAgASgCACICRQ0AIAAgAhEDAAsCQCABKAIEIgJFDQAgACACIAEoAggQvRMLCzEBAX8gAUF4aiICIAIoAgBBAWoiAjYCAAJAIAINAAALIAAgATYCBCAAQZSHnQE2AgALKwACQCABKAIARQ0AIAIQ9xYACyABQX82AgAgACABNgIEIAAgAUEEajYCAAsrAQF/IwBBEGsiAiQAIAJBATsBDCACIAE2AgggAiAANgIEIAJBBGoQrx0ACyoBAX8jAEEQayIDJAAgAyAAKAIANgIMIANBDGogASACENALIANBEGokAAszACABKAIAIAAoAgAtAABBAnQiAEG86J0BaigCACAAQbDonQFqKAIAIAEoAgQoAgwRDAALKwAgACACIAMoAgAQnQYgAEEQaiACQRBqIAMoAgAQnQYgAkEIIAEgAxCcBwsuAQF/AkAgASAAKAIUIgJJDQAgASACQbjygwEQwxIACyAAKAIQIAFBAnRqKAIACy4BAX8CQCABIAAoAjgiAkkNACABIAJB6PKDARDDEgALIAAoAjQgAUECdGooAgALLgEBfwJAIAEgACgCICICSQ0AIAEgAkGE74MBEMMSAAsgACgCHCABQQJ0aigCAAstAgF/AX4jAEEQayIBJAAgACkCACECIAEgADYCDCABIAI3AgQgAUEEahCyJAALMwAgASgCACAAKAIALQAAQQJ0IgBByIidAWooAgAgAEG4iJ0BaigCACABKAIEKAIMEQwACzMAIAEoAgAgACgCAC0AAEECdCIAQbi/nQFqKAIAIABBnL+dAWooAgAgASgCBCgCDBEMAAszACABKAIAIAAoAgAtAABBAnQiAEHQup0BaigCACAAQcS6nQFqKAIAIAEoAgQoAgwRDAALMwAgASgCACAAKAIALQAAQQJ0IgBB8LydAWooAgAgAEHkvJ0BaigCACABKAIEKAIMEQwACzcBAX9BCCEBAkACQAJAIAAoAgBBfmoOBgECAgIAAAILQQQhAQsgACgCBCAAKAIIQQQgARDFEgsLLwEBfyAAKAIAIgEgASgCACIBQX9qNgIAAkAgAUEBRw0AIAAoAgAgACgCBBDsEAsLMAACQCAAKAIAQYCAgIB4Rw0AQcyfhAEQySIACyAAQQxqIAEQ6gggAEE8aiABEOoICysAIAAQxwkgACgCsA0gACgCtA0iACgCCEF/akF4cWpBCGogACgCGBEEAGoLLwEBfyAAKAIAIgEgASgCACIBQX9qNgIAAkAgAUEBRw0AIAAoAgAgACgCBBDsEAsLMwAgASgCACAAKAIALQAAQQJ0IgBBxMGdAWooAgAgAEGwwZ0BaigCACABKAIEKAIMEQwACywAIAAgAUEuRiAALQAEcjoABCAAKAIAIgAoAgAgASAAQQRqKAIAKAIQEQgACysBAX8jAEEQayICJAAgAiABNgIMIAIgADYCCCACQQhqQfsBQQFBABCUEgALLAAgACACQoCBgoSIkKDAgH+DIgJCAFI2AgAgACACeqdBA3YgA2ogAXE2AgQLKAAgASACIAMgBBDKHiEDIAAgAiAEazYCBCAAIAEgBGpBACADGzYCAAs1AQF/QYABIQMCQCABIAJBxaabAUEGEMIeDQBB/wBBpH8gASACQfCzmwFBAxDCHhshAwsgAws1AQF/Qe0AIQMCQCABIAJBqZubAUEDEMIeDQBB7gBBpH8gASACQcKbmwFBBBDCHhshAwsgAws1AQF/Qe8AIQMCQCABIAJB9dGbAUEFEMIeDQBB8ABBpH8gASACQbXMmwFBBBDCHhshAwsgAwszACABKAIAIAAoAgAtAABBAnQiAEGcz50BaigCACAAQZDPnQFqKAIAIAEoAgQoAgwRDAALMwAgASgCACAAKAIALQAAQQJ0IgBBtM+dAWooAgAgAEGoz50BaigCACABKAIEKAIMEQwACy0AAkAgACgCACIARQ0AIAAQohQgACgCACAAQQRqKAIAEPUiIABBFEEEEL0TCwstAAJAIAAoAgAiAEUNACAAEOUaIAAoAgAgAEEEaigCABDxIiAAQRRBBBC9EwsLMwAgASgCACAAKAIALQAAQQJ0IgBB2M+dAWooAgAgAEHMz50BaigCACABKAIEKAIMEQwACzMAIAEoAgAgACgCAC0AAEECdCIAQZjQnQFqKAIAIABB5M+dAWooAgAgASgCBCgCDBEMAAstAAJAIAAoAgAiAEUNACAAEL4OIAAoAgAgAEEEaigCABD2IiAAQRRBBBC9EwsLMQEBfwJAIAEtADRBAUcNACABLwA5IQIgAUGBAjsAOSAAKAIAIAEQgAIgASACOwA5CwszACABKAIAIAAoAgAtAABBAnQiAEH84Z0BaigCACAAQfDhnQFqKAIAIAEoAgQoAgwRDAALMwAgASgCACAAKAIALQAAQQJ0IgBBlOKdAWooAgAgAEGI4p0BaigCACABKAIEKAIMEQwACzMAIAEoAgAgACgCAC0AAEECdCIAQbjinQFqKAIAIABBrOKdAWooAgAgASgCBCgCDBEMAAszACABKAIAIAAoAgAtAABBAnQiAEH44p0BaigCACAAQcTinQFqKAIAIAEoAgQoAgwRDAALMQEBfkIAIQICQCABLQDIAUGhAUcNACABENoSIQIgARDjDgsgAEEANgIAIAAgAjcDCAswACABKAIAIAAtAABBAnQiAEGgiJ0BaigCACAAQZSInQFqKAIAIAEoAgQoAgwRDAALKQACQCADIAJJDQAgAyACQey4gAEQwxIACyAAIAEgA0EMbGopAgQ3AwALMwIBfwF+IAAoAgQiASAAKAIIEPkXIQICQCAAKAIAIgBBgICAgHhGDQAgACABEKsTCyACCykBAX8gACAAKAIAIgFBf2o2AgACQCABQQRJDQAgAUECcQ0AIAAQ3goLCzAAIAEoAgAgAC0AAEECdCIAQfS6nQFqKAIAIABB3LqdAWooAgAgASgCBCgCDBEMAAssAAJAAkAgACgCAEGJgMQARg0AIABB9ABqEJYaDAELIABBBGohAAsgABCjAwstAAJAIAEtABBBAXFFDQAgAxD6BAsCQCACRQ0AIAMQjwULIABBgICAgHg2AgALMQECfwJAIAAoAgAiAUGAgICAeEYNACAAKAIEIgIgACgCCBCbHCABIAJBBEEQENASCwswACABKAIAIAAtAABBAnQiAEHQxJ0BaigCACAAQajD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DQAgAEEEaiABEMcECwsmACAAKAIAIAAoAgQgARCjISAAQcAAaiABEKQhIABBIGogARCnHwsoAQF/IABBwABqEIkeAkAgACgCHCIBRQ0AIAAoAhggAUEMQQgQ+BcLCykAIAAoAkggACgCTBC9IiAAKAJUIAAoAlgQvSIgACgCYCAAKAJkEL0iCyUBAX8CQCAAKAI4RQ0AIAAoAkAiAUUNACAAKAI8IAFBARC9EwsLIwEBf0EBIQECQCAAKAIAIgBBAXENACAAKAIIQQFGIQELIAELIQACQCAAKAIAIgBBAXFFDQAgACABIAIQ9BcPCyAAEIATCyABAn4gACkDACICIAJCP4ciA4UgA30gAkJ/VSABEPMHCyYAAkAgAA0AQcSCnQFBMhCUIwALIAAgAiADIAQgBSABKAIQERIACx4AAkAgAiABSQ0AIAIgASADEMMSAAsgACACQQJ0agsfAAJAIAFFDQAgACABbiABakEBdg8LQcSTgwEQhRwACyAAAkAgASAAayIBQRBJDQAgACABEP0FDwsgACABEMMbCyoBAX8gACgCACAAKAIEEMwiIAAoAhAiASAAKAIUEOwcIAAoAgwgARDNIgseAAJAIAIgAUkNACACIAEgAxDDEgALIAAgAkEDdGoLHgACQCACIAFJDQAgAiABIAMQwxIACyAAIAJBDGxqCycAIAApAwggACkDGBCMJCAAQSBqEJkhIAAoAjgQniIgACgCPBCfIgshACAAKAIAKAIAIAAoAgQoAgBBACABa0EYbGpBaGoQqSALHgACQCACIAFJDQAgAiABIAMQwxIACyAAIAJBBnRqCx4AAkAgAiABSQ0AIAIgASADEMMSAAsgACACQQV0agseAAJAIAIgAUkNACACIAEgAxDDEgALIAAgAkECdGoLIAEBf0EAIQQCQCABIANHDQAgACACIAEQkhdFIQQLIAQLJQAgACABKAIINgIEIABBACABKAIEIAEoAgBBgICAgHhGGzYCAAslAQF/IAEoAgAhAiABQQA2AgAgASgCBCEBIAIQtB8gACABEKkTCyABAX9BACEEAkAgASADRw0AIAAgAiABEJIXRSEECyAECyUBAX8gASgCACECIAFBADYCACABKAIEIQEgAhC0HyAAIAEQ3AELHwAgACACEMkMIABBEGogAkEQahDJDCACQQggARDZCQseACAA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CwwAIAAoAgAgARCgBQsMACAAKAIAIAEQgw0LDAAgACgCACABENwKCwwAIAAoAgAgARDKIgsMACABIAAoAgAQ3QgLDAAgACABKQIQNwMACwwAIAAoAgAgARDVDAsMACAAKAIAIAEQ1QwLDAAgACgCACABEJUQCwwAIAAoAgAgARDKDAsMACAAKAIAIAEQ+gcLDAAgACgCACABEM8CCwwAIAAoAgAgARCeBAsMACAAKAIAIAEQtRELDAAgACgCACABELURCwwAIAAoAgAgARC6EgsMACAAKAIAIAEQ8gMLDAAgACgCACABEI0TCwwAIAAoAgAgARClFwsMACAAKAIAIAEQkAYLDAAgASAAKAIAEMAZCwwAIAEgACgCABDAGQsMACAAEP4fIAEQ1iELDAAgARCzICAAENYhCwsAIABBEEEEEL0TCwwAIAAQ8x8gARDzHwsMACAAKAIAIAEQzgsLCwAgACgCACABEGMLDAAgACgCACABENoWCwwAIAAoAgAgARCmFwsMACAAKAIAIAEQpBMLDAAgACgCACABEM0GCwwAIAEgACgCABCDGgsMACABIAAoAgAQgxoLDAAgACgCACABEMYECwsAIABBBCABENEgCwoAIAAQjAUaQQELDAAgACgCACABEK8LCwwAIAAoAgAgARCrBwsMACAAEMMgIAAQniQLCwAgAEE4QQQQvRMLDAAgABC9ISAAEKAkCwsAIABBMEEEEL0TCwoAIABBCGoQ7xYLCwAgACABIAIQyhILDgAgAEH4gp0BQYcHEDwLCgAgAEF4ahCyHwsLACAAIAEgAhD4AgsJACAAQQA2AgALCQAgAEIBNwMACwkAIAAgARD1HgsHACAAQX5xCwoAIAAoAgAQgBMLCQAgACAAEKoTCwkAQQFBABD6FwsIACAAQcgAagsIACAAQZADagsIACAAQYACagsLAEGMjpgBEPUXAAsJACAAQQA2AgALCAAgABD2DwALCwBBACgC3PWdAUULDABBo9qYAUEJEPkXCwsAQYS5mAEQ9RcACw0AIABBgICAgHg2AgALDABBlpybAUEKEPkXCwwAQZHRmwFBCBD5FwsMAEG50psBQQgQ+RcLDABBsdKbAUEIEPkXCwwAQa3pmgFBCRD5FwsJACAAIAEQ0A0LCQAgACABEPUeCwwAQY6nmwFBCBD5FwsMAEHippsBQQgQ+RcLDABBy9KbAUEIEPkXCwwAQZSlmwFBCBD5FwsJACAAIAEQjQMLCQAgACABEMECCwkAIAAgARDfAwsMAEH79JoBQQgQ+RcLCQAgACABEMUFCwkAIAAgARCZBQsJACAAIAEQ/AILDABBo/aaAUENEPkXCwwAQZr2mgFBCRD5FwsMAEGM9poBQQ4Q+RcLCQAgACABEOMFCwcAIABBGGoLCQAgACABEL0iCwkAIAAgARDtIQsIACAAIAEQawsJACAAIAEQ7SELCgAgACgCABCxHwsKABC+ByAAEOkMCwkAIAAgARDrAQsIACAALQDEAgsHACAAKAIUCwgAIAAoAqwCCwgAIAAoArACCwgAIAAtAOACCwcAIAAoAjgLCAAgACgCyAILCAAgACgCzAILBQAgAUULCAAgAC0A2AILBwAgACgCIAsIACAAKALAAgsIACAAKALEAgsIACAALQDMEgsIACAALQC8DQsHACAAEMIMCwcAIAAQxwkLBwAgACgCQAsHACAAKAJACwcAIAAQpxELBwBBABCXEwsHACAAEI4GCwcAIAAoAiALBwAgACgCJAsHACAAKAIoCwcAIAAQvQgLBABBAQsDAAALBAAgAAsEAEEACwQAQQELBABBAAsEAEEBCwQAQQALBABBAQsEACAACwQAQQALBABBAQsEAEEACwQAIAALAwAACwcAQfz1nQELBwBBgPadAQsEAEEACwQAQQALBwBBhPadAQsEAEEBCwIACwIACwIACwIACwIACwIACwIACwu08R0CAEGAgIABC/joHQAAAAAAAAAAAQAAAIsDAABtYXAgd2l0aCBhIHNpbmdsZSBrZXkAAAAQACAAFQAAAAAAAAAIAAAABAAAAIwDAABzdHJpbmcgb3IgbWFwAAAAQAAgAA0AAAAAAAAAAAAAAAEAAACNAwAAAAAAAAAAAAABAAAAjgMAAAAAAAAAAAAAAQAAAI0DAABpbnZhbGlkIHZhbHVlOiAAiAAgAA8AAAA6CyYACwAAAGludmFsaWQgbGVuZ3RoIACoACAADwAAADoLJgALAAAAZHVwbGljYXRlIGZpZWxkIGAAAADIACAAEQAAADrfJgABAAAAdW5rbm93biB2YXJpYW50IGBgLCBleHBlY3RlZCAAAADsACAAEQAAAP0AIAAMAAAAdHN4ABwBIAADAAAAtIAmAAoAAAAv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BAAACAQAAAAAAAADAAAAAQAAAAkEAAAKBAAAOB8gAG0AAAAxAwAAFgAAADgfIABtAAAAFgMAACQAAAA4HyAAbQAAACIDAAARAAAAOB8gAG0AAABPAwAAGQAAADgfIABtAAAAYQMAAC0AAAA4HyAAbQAAAHIDAAA6AAAAOB8gAG0AAACEAwAARgAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL2Foby1jb3Jhc2ljay0xLjEuMy9zcmMvdXRpbC9yZW1hcHBlci5yc2AhIABsAAAAcgAAABIAAABgISAAbAAAAIwAAAAkAAAAYCEgAGwAAACRAAAAIAAAAGAhIABsAAAAkwAAAB0AAABgISAAbAAAAJkAAAAfAAAAUGF0dGVybnNieV9pZG9yZGVydG90YWxfcGF0dGVybl9ieXRlc2ltcG1lbW9yeV91c2FnZVBhY2tlZFJhcmVCeXRlT2Zmc2V0UmFyZUJ5dGVzT25lYnl0ZTFSYXJlQnl0ZXNUd29vZmZzZXRzYnl0ZTJSYXJlQnl0ZXNUaHJlZWJ5dGUzU3RhcnRCeXRlc09uZVN0YXJ0Qnl0ZXNUd29TdGFydEJ5dGVzVGhyZWUvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9haG8tY29yYXNpY2stMS4xLjMvc3JjL3V0aWwvcHJpbWl0aXZlcy5ycwDJIiAAbgAAAOECAAABAAAAU3RhdGVJREVycm9yAAAAAAQAAAAEAAAACwQAAAwEAAAMAAAABAAAAA0EAAAOBAAADwQAAGxpYnJhcnkvYWxsb2Mvc3JjL3Jhd192ZWMvbW9kLnJzfCMgACAAAAAuAgAAEQAAAGxpYnJhcnkvYWxsb2Mvc3JjL3N0cmluZy5ycwCsIyAAGwAAAOgBAAAXAAAAAAAAAAAAAAABAAAAEAQAAGEgZm9ybWF0dGluZyB0cmFpdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5lZCBhbiBlcnJvciB3aGVuIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSBkaWQgbm90bGlicmFyeS9hbGxvYy9zcmMvZm10LnJzAAA+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AQICGAYBAgElAQIBBAEBABcJEQEpAwNvAU8AZm8RxABhDwARBhkABQAALwAABx8RTxEeEjAQBB8VBRMALdNAgEsEOQcRQAIBAQwCDgAIACkKAAQBBwECAQAPAR0DAgEOBAgAAGsFDQMJBwoEAQBVAUcBAgIBAgICBAEMAQEBBwFBAQQCCAEHARwBBAEFAQEDBwEAAhkBGQEfARkBHwEZAR8BGQEfARkBCAAfBgbVBwERAgcBAgEFBT4hAXAtCgcQAQAeEiwAHOQeAgEABwEEAQIBDwHFO0QDAQMBAAQBGwECAQECAQEKAQQBAQEBBgEEAQEBAQEBAwECAQECAQEBAQEBAQEBAQIBAQIEAQcBBAEEAQEBCgERBQMBBQERABoGGgYaAAAgAAbeAgAOAA8AAAAAAAUAAABwAAcALQEBAQIBAgEBSAswFRABZQcCBgICAQQjAR4bWws6CQkBGAQBCQEDAQUrAzsJKhgBIDcBAQEECAQBAwcKAh0BOgEBAQIECAEJAQoCGgECAjkBBAIEAgIDAwEeAgMBCwI5AQQFAQIEARQCFgYBAToBAQIBBAgBBwMKAh4BOwEBAQwBCQEoAQMBNwEBAwUDAQQHAgsCHQE6AQICAQEDAwEEBwILAhwCOQIBAQIECAEJAQoCHQFIAQQBAgMBAQgBUQECBwwIYgECCQsHSQIbAQEBAQE3DgEFAQIFCwEkCQFmBAEGAQICAhkCBAMQBA0BAgIGAQ8BAAMABBwDHQIeAkACAQcIAQILCQEtAwEBdQIiAXYDBAIJAQYD2wICAToBAQcBAQEBAggGCgIBMB8xBDAKBAMmCQwCIAQCBjgBAQIDAQEFOAgCApgDAQ0BBwQBBgEDAsZAAAHDIQADjQFgIAAGaQIABAEKIAJQAgABAwEEARkCBQGXAhoSDQEmCBkLAQEsAzABAgQCAgIBJAFDBgICAgIMAQgBLwEzAQEDAgIFAgEBKgIIAe4BAgEEAQABABAQEAACAAHiAZUFAAMBAgUEKAMEAaUCAARBBQACTwRGCzEEewE2DykBAgIKAzEEAgIHAT0DJAUBCD4BDAI0CQEBCAQCAV8DAgQGAQIBnQEDCBUCOQIBAQEBDAEJAQ4HAwVDAQIGAQECAQEDBAMBAQ4CVQgCAwEBFwFRAQIGAQECAQECAQLrAQIEBgIBAhsCVQgCAQECagEBAQIIZQEBAQIEAQUACQEC9QEKBAQBkAQCAgQBIAooBgIECAEJBgIDLg0BAgAHAQYBAVIWAgcBAgECegYDAQECAQcBAUgCAwEBAQACCwI0BQUDFwEAAQYPAAwDAwAFOwcAAT8EUQELAgACAC4CFwAFAwYICAIHHgSUAwA3BDIIAQ4BFgUBDwAHARECBwECAQVkAaAHAAE9BAAE/gIAB20HAGCA8AAwCngCBQECAwAKhgrGCgAKdgoEBmwKdgp2CgIGbg1zCggHZwpoBwcTbQpgCnYKRhQACkYKABQAA+8KBgoWCgAKgAulCgYKtgpWCoYKBgoAAQMGBgrGMwIFADxOFgAeAAEAARkJDgMABIoKHggBDyAKJw8ACrwKAAaaCiYKxgoWClYKAAoACgAtDDkRAgAbJAQdAQgBhgXKCgAIGQcnCUsFFgagAgIQAi5ACTQCHgNLBWgIGAgpBwAGMAoGCgAfngoqBHAHhh6ACjwKkAoHFPsKAAp2CgAKZgoGFEwMABNdCgAKVh3jCkYKAApmFQBvAAoAClYKhgoBBwAKABcACgAUDBRsGQAyAAoACgAK9woACYAKADsBAwEETC0BDwANAAoAAAAAAAABAAAAAAAAAAoAAAAAAAAAZAAAAAAAAADoAwAAAAAAABAnAAAAAAAAoIYBAAAAAABAQg8AAAAAAICWmAAAAAAAAOH1BQAAAAAAypo7AAAAAADkC1QCAAAAAOh2SBcAAAAAEKXU6AAAAACgck4YCQAAAEB6EPNaAAAAgMakfo0DAGxpYnJhcnkvY29yZS9zcmMvbnVtL2RlYzJmbHQvZGVjaW1hbF9zZXEucnMAsDQgACsAAABWAAAAJwAAALA0IAArAAAAiAAAABMAAACwNCAAKwAAALAAAAAgAAAAsDQgACsAAADHAAAAJQAAALA0IAArAAAA9AAAABUAAACwNCAAKwAAAP8AAAAYAAAAAAAACAEIAwgGEAkQDRASGBcYHRgkICsgMyA8IEYoUChbKGcwczCAMI44nDirOLs4zEDdQO9AAkkVSSlJPlFTUWlRgFGYWbBZyVnjYf1hGGI0alBqbWqLaqpyyXLpcgp7K3tNe3CDk4O3g9yDAowojE+Md5SflMiU8pwcBRwFHAUcBQUCBQECBQYCBQMBAgUBBQYCBQcIAQIFAwkABgIFAQkFAwECBQkHBgUGAgUECAgCCAECBQIEBAEEAAYCBQECAgAHAAMBAgUGAQADBQEFBgIFAwAFAQcFBwgBAgUBBQIFCAcICQAGAgUHBgIJAwkEBQMBAgUDCAEEBgkHAgYFBgIFAQkABwMECAYDAggBAgUJBQMGBwQDAQYEAAYCBQQHBggDBwEFCAIAAwECBQIDCAQBCAUHCQEAAQUGAgUBAQkCAAkCCAkFBQAHCAECBQUJBgAEBgQEBwcFAwkABgIFAgkIAAIDAgIDCAcGCQUDAQIFAQQJAAEBBgEBCQMIBAcGBQYCBQcEBQAFCAAFCQYJAgMIAggBAgUDBwIFAgkAAgkIBAYBCQEEAAYCBQEIBgIGBAUBBAkCAwAJBQcAAwECBQkDAQMCAgUHBAYBBQQHCAUBBQYCBQQGBQYGAQIIBwMABwcDCQIFBwgBAgUCAwIIAwAGBAMGBQMIBgkGAggJAAYCBQEBBgQBBQMCAQgCBgkDBAgBBAQFAwECBQUIAgAHBgYACQEDBAYHBAAHAgIGBQYCBQIJAQADCAMABAUGBwMDBwADBgEDAggBAgUBBAUFAQkBBQICCAMGBggFAQgABgYEAAYCBQcCBwUJBQcGAQQBCAMEAgUJAAMDAgADAQIFAwYDBwkHCAgABwAJAQcBAgkFAQYGAAEFBgIFAQgBCAkICQQAAwUEBQgFBgQHBQgDAAAHCAECBQkACQQJBAcAAQcHAgkCCAIDBwkBBQADCQAGAgUEBQQHBAcDBQAICAYEBgQBAQgJBQcFAQkFAwECBQICBwMHAwYHBQQEAwIDAgAFCQQHCAcFCQcGBQYCBQEBAwYIBggDBwcCAQYBBgACCQcDCQMHCQgIAggBAgUFBggEAwQBCAgGAAgACAABBAgGCQYICQkEAQQABgIFAggEAgEHAAkEAwAEAAQAAAcEAwQIBAQJBwAHAAMBAgUBBAIBAAgFBAcBBQIAAgAAAwcBBwQCAgQIBQMFAQUGAgUHAQAFBAIHAwUHBgABAAABCAUIBwEBAgQCBgcFBwgBAgUDBQUCBwEDBgcICAAABQAACQIJAwUFBgIBAwMHCAkABgIFAQcHBgMFBggDCQQAAAIFAAQGBAYHBwgBAAYGCAkEBQMBAgUICAgBBwgEAQkHAAABAgUCAwIDAwgJAAUDAwQEBwIGBQYCBQQEBAAICQIACQgFAAAGAgYBBgEGCQQFAgYGBwIDBgMC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L25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL2hhc2hicm93bi0wLjE2LjAvc3JjL3Jhdy9tb2QucnPsqSAAZAAAACUAAAAoAAAAAAAAAAAAAAABAAAANQQAAAAAAAAAAAAAAQAAABkEAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi90cmlvbXBoZS0wLjEuMTQvc3JjL2FyYy5ycwCAqiAAXwAAADUBAAAOAAAAgKogAF8AAABuAQAALQAAAICqIABfAAAAbwEAAA4AAAAAAAAADAAAAAQAAAA2BAAANwQAAGNyYXRlcy9oc3RyL3NyYy9keW5hbWljLnJzAAAkqyAAGgAAAGkAAAAgAAAAJKsgABoAAABxAAAAIAAAAGNyYXRlcy9oc3RyL3NyYy93dGY4L21vZC5ycwBgqyAAGwAAAN0BAABKAAAAYKsgABsAAADWAQAAPQAAAGCrIAAbAAAAhAIAAB4AAABgqyAAGwAAAIUCAAAxAAAAYKsgABsAAACQAgAAPQAAAGCrIAAbAAAAiwIAAD0AAABgqyAAGwAAAPICAAAiAAAAY3JhdGVzL2hzdHIvc3JjL3d0ZjhfYXRvbS5yc+yrIAAcAAAAXAEAADkAAABjcmF0ZXMvaHN0ci9zcmMvbGliLnJzAAAYrCAAFgAAABYBAAA8AAAAPEAnAG8AAAAkAQAADgAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL2pzLXN5cy0wLjMuNzcvc3JjL2xpYi5yc3JldHVybiB0aGlzUKwgAF0AAAD7GAAAAQAAAE8pJgBwAAAATQAAAC4AAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9tZW1jaHItMi43LjYvc3JjL2FyY2gvYWxsL3R3b3dheS5yc9isIABoAAAAvwAAAC4AAADYrCAAaAAAAMcAAAApAAAA2KwgAGgAAADMAAAANAAAANisIABoAAAA1AAAACQAAADYrCAAaAAAANQAAAAxAAAA2KwgAGgAAADXAAAAIgAAANisIABoAAAA1wAAADMAAADYrCAAaAAAAPEAAAAuAAAA2KwgAGgAAAD4AAAAKQAAANisIABoAAAA/QAAADQAAADYrCAAaAAAAAQBAAAYAAAA2KwgAGgAAAAEAQAAJQAAANisIABoAAAAwgEAAB0AAADYrCAAaAAAAMMBAAAZAAAA2KwgAGgAAAAKAgAAGwAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL21lbWNoci0yLjcuNi9zcmMvYXJjaC9hbGwvbW9kLnJzAAAAMK4gAGUAAAAsAAAAHgAAADxzZWFyY2hlciBmdW5jdGlvbj4AqK4gABMAAABjYWxsPHNlYXJjaGVyIGtpbmQgdW5pb24+AAAAyK4gABUAAABGaW5kZXJoYXNoG1sxMjM0NTY3ODkbWzBtAAAAeu0mAEoAAAALAgAAFwAAAHrtJgBKAAAACgIAADIAAABJb0Vycm9yT3V0T2ZCb3VuZHMvcnVzdGMvMmU2ODgyYWM1YmUyN2E3MzI5M2Q2ZjdhZTU2Mzk3ZmRmMzI4NDhkZS9saWJyYXJ5L2NvcmUvc3JjL3NsaWNlL2l0ZXIucnNjYXBhY2l0eSBvdmVyZmxvdwAAAISvIAARAAAAAAAAAAQAAAAEAAAAMQAAADavIABOAAAA9gUAABUAAAAAAAAABAAAAAAAAAABAAAAbmVnYXRpdmUgdmFsdWVzIGFyZSBub24temVyby9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL251bS1iaWdpbnQtMC40LjYvc3JjL2JpZ2ludC9zaGlmdC5ycwAAAOyvIABpAAAAZgAAACgAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9udW0tYmlnaW50LTAuNC42L3NyYy9iaWd1aW50L2FkZGl0aW9uLnJzAAAAaLAgAG0AAAA7AAAAGgAAAGiwIABtAAAAaAAAAEIAAABo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MDAwOzIwNjsyMDkzODsyOzE0ODswMDA7MjExMzg7MjsyNTU7MDIwOzE0NzM4OzI7MDAwOzE5MTsyNTUzODsyOzEwNTsxMDU7MTA1Mzg7MjswMzA7MTQ0OzI1NTM4OzI7MTc4OzAzNDswMzQzODsyOzI1NTsyNTA7MjQwMzg7MjswMzQ7MTM5OzAzNDM4OzI7MjU1OzAwMDsyNTUzODsyOzIyMDsyMjA7MjIwMzg7MjsyNDg7MjQ4OzI1NTM4OzI7MjU1OzIxNTswMDAzODsyOzIxODsxNjU7MDMyMzg7MjsxMjg7MTI4OzEyODM4OzI7MDAwOzEyODswMDAzODsyOzE3MzsyNTU7MDQ3Mzg7MjsyNDA7MjU1OzI0MDM4OzI7MjU1OzEwNTsxODAzODsyOzIwNTswOTI7MDkyMzg7MjswNzU7MDAwOzEzMDM4OzI7MjU1OzI1NTsyNDAzODsyOzI0MDsyMzA7MTQwMzg7MjsyMzA7MjMwOzI1MDM4OzI7MjU1OzI0MDsyNDUzODsyOzEyNDsyNTI7MDAwMzg7MjsyNTU7MjUwOzIwNTM4OzI7MTczOzIxNjsyMzAzODsyOzI0MDsxMjg7MTI4Mzg7MjsyMjQ7MjU1OzI1NTM4OzI7MjUwOzI1MDsyMTAzODsyOzIxMTsyMTE7MjExMzg7MjsxNDQ7MjM4OzE0NDM4OzI7MjU1OzE4MjsxOTMzODsyOzI1NTsxNjA7MTIyMzg7MjswMzI7MTc4OzE3MDM4OzI7MTM1OzIwNjsyNTAzODsyOzExOTsxMzY7MTUzMzg7MjsxNzY7MTk2OzIyMjM4OzI7MjU1OzI1NTsyMjQzODsyOzAwMDsyNTU7MDAwMzg7MjswNTA7MjA1OzA1MDM4OzI7MjUwOzI0MDsyMzAzODsyOzEyODswMDA7MDAwMzg7MjsxMDI7MjA1OzE3MDM4OzI7MDAwOzAwMDsyMDUzODsyOzE4NjswODU7MjExMzg7MjsxNDc7MTEyOzIxOTM4OzI7MDYwOzE3OTsxMTMzODsyOzEyMzsxMDQ7MjM4Mzg7MjswMDA7MjUwOzE1NDM4OzI7MDcyOzIwOTsyMDQzODsyOzE5OTswMjE7MTMzMzg7MjswMjU7MDI1OzExMjM4OzI7MjQ1OzI1NTsyNTAzODsyOzI1NTsyMjg7MjI1Mzg7MjsyNTU7MjI4OzE4MTM4OzI7MjU1OzIyMjsxNzMzODsyOzAwMDswMDA7MTI4Mzg7MjsyNTM7MjQ1OzIzMDM4OzI7MTI4OzEyODswMDAzODsyOzEwNzsxNDI7MDM1Mzg7MjsyNTU7MTY1OzAwMDM4OzI7MjU1OzA2OTswMDAzODsyOzIxODsxMTI7MjE0Mzg7MjsyMzg7MjMyOzE3MDM4OzI7MTUyOzI1MTsxNTIzODsyOzE3NTsyMzg7MjM4Mzg7MjsyMTk7MTEyOzE0NzM4OzI7MjU1OzIzOTsyMTMzODsyOzI1NTsyMTg7MTg1Mzg7MjsyMDU7MTMzOzA2MzM4OzI7MjU1OzE5MjsyMDMzODsyOzIyMTsxNjA7MjIxMzg7MjsxNzY7MjI0OzIzMDM4OzI7MTI4OzAwMDsxMjgzODsyOzEwMjswNTE7MTUzMzg7MjsyNTU7MDAwOzAwMDM4OzI7MTg4OzE0MzsxNDMzODsyOzA2NTsxMDU7MjI1Mzg7MjsxMzk7MDY5OzAxOTM4OzI7MjUwOzEyODsxMTQzODsyOzI0NDsxNjQ7MDk2Mzg7MjswNDY7MTM5OzA4NzM4OzI7MjU1OzI0NTsyMzgzODsyOzE2MDswODI7MDQ1Mzg7MjsxOTI7MTkyOzE5MjM4OzI7MTM1OzIwNjsyMzUzODsyOzEwNjswOTA7MjA1Mzg7MjsxMTI7MTI4OzE0NDM4OzI7MjU1OzI1MDsyNTAzODsyOzAwMDsyNTU7MTI3Mzg7MjswNzA7MTMwOzE4MDM4OzI7MjEwOzE4MDsxNDAzODsyOzAwMDsxMjg7MTI4Mzg7MjsyMTY7MTkxOzIxNjM4OzI7MjU1OzA5OTswNzEzODsyOzA2NDsyMjQ7MjA4Mzg7MjsyMzg7MTMwOzIzODM4OzI7MjQ1OzIyMjsxNzkzODsyOzI1NTsyNTU7MjU1Mzg7MjsyNDU7MjQ1OzI0NTM4OzI7MjU1OzI1NTswMDAzODsyOzE1NDsyMDU7MDUwNDg7MjsyNDA7MjQ4OzI1NTQ4OzI7MjUwOzIzNTsyMTU0ODsyOzAwMDsyNTU7MjU1NDg7MjsxMjc7MjU1OzIxMjQ4OzI7MjQwOzI1NTsyNTU0ODsyOzI0NTsyNDU7MjIwNDg7MjsyNTU7MjI4OzE5NjQ4OzI7MDAwOzAwMDswMDA0ODsyOzI1NTsyMzU7MjA1NDg7MjswMDA7MDAwOzI1NTQ4OzI7MTM4OzA0MzsyMjY0ODsyOzE2NTswNDI7MDQyNDg7MjsyMjI7MTg0OzEzNTQ4OzI7MDk1OzE1ODsxNjA0ODsyOzEyNzsyNTU7MDAwNDg7MjsyMTA7MTA1OzAzMDQ4OzI7MjU1OzEyNzswODA0ODsyOzEwMDsxNDk7MjM3NDg7MjsyNTU7MjQ4OzIyMDQ4OzI7MjIwOzAyMDswNjA0ODsyOzAwMDswMDA7MTM5NDg7MjswMDA7MTM5OzEzOTQ4OzI7MTg0OzEzNDswMTE0ODsyOzE2OTsxNjk7MTY5NDg7MjswMDA7MTAwOzAwMDQ4OzI7MTg5OzE4MzsxMDc0ODsyOzEzOTswMDA7MTM5NDg7MjswODU7MTA3OzA0NzQ4OzI7MjU1OzE0MDswMDA0ODsyOzE1MzswNTA7MjA0NDg7MjsxMzk7MDAwOzAwMDQ4OzI7MjMzOzE1MDsxMjI0ODsyOzE0MzsxODg7MTQzNDg7MjswNzI7MDYxOzEzOTQ4OzI7MDQ3OzA3OTswNzk0ODsyOzAwMDsyMDY7MjA5NDg7MjsxNDg7MDAwOzIxMTQ4OzI7MjU1OzAyMDsxNDc0ODsyOzAwMDsxOTE7MjU1NDg7MjsxMDU7MTA1OzEwNTQ4OzI7MDMwOzE0NDsyNTU0ODsyOzE3ODswMzQ7MDM0NDg7MjsyNTU7MjUwOzI0MDQ4OzI7MDM0OzEzOTswMzQ0ODsyOzI1NTswMDA7MjU1NDg7MjsyMjA7MjIwOzIyMDQ4OzI7MjQ4OzI0ODsyNTU0ODsyOzI1NTsyMTU7MDAwNDg7MjsyMTg7MTY1OzAzMjQ4OzI7MTI4OzEyODsxMjg0ODsyOzAwMDsxMjg7MDAwNDg7MjsxNzM7MjU1OzA0NzQ4OzI7MjQwOzI1NTsyNDA0ODsyOzI1NTsxMDU7MTgwNDg7MjsyMDU7MDkyOzA5MjQ4OzI7MDc1OzAwMDsxMzA0ODsyOzI1NTsyNTU7MjQwNDg7MjsyNDA7MjMwOzE0MDQ4OzI7MjMwOzIzMDsyNTA0ODsyOzI1NTsyNDA7MjQ1NDg7MjsxMjQ7MjUyOzAwMDQ4OzI7MjU1OzI1MDsyMDU0ODsyOzE3MzsyMTY7MjMwNDg7MjsyNDA7MTI4OzEyODQ4OzI7MjI0OzI1NTsyNTU0ODsyOzI1MDsyNTA7MjEwNDg7MjsyMTE7MjExOzIxMTQ4OzI7MTQ0OzIzODsxNDQ0ODsyOzI1NTsxODI7MTkzNDg7MjsyNTU7MTYwOzEyMjQ4OzI7MDMyOzE3ODsxNzA0ODsyOzEzNTsyMDY7MjUwNDg7MjsxMTk7MTM2OzE1MzQ4OzI7MTc2OzE5NjsyMjI0ODsyOzI1NTsyNTU7MjI0NDg7MjswMDA7MjU1OzAwMDQ4OzI7MDUwOzIwNTswNTA0ODsyOzI1MDsyNDA7MjMwNDg7MjsxMjg7MDAwOzAwMDQ4OzI7MTAyOzIwNTsxNzA0ODsyOzAwMDswMDA7MjA1NDg7MjsxODY7MDg1OzIxMTQ4OzI7MTQ3OzExMjsyMTk0ODsyOzA2MDsxNzk7MTEzNDg7MjsxMjM7MTA0OzIzODQ4OzI7MDAwOzI1MDsxNTQ0ODsyOzA3MjsyMDk7MjA0NDg7MjsxOTk7MDIxOzEzMzQ4OzI7MDI1OzAyNTsxMTI0ODsyOzI0NTsyNTU7MjUwNDg7MjsyNTU7MjI4OzIyNTQ4OzI7MjU1OzIyODsxODE0ODsyOzI1NTsyMjI7MTczNDg7MjswMDA7MDAwOzEyODQ4OzI7MjUzOzI0NTsyMzA0ODsyOzEyODsxMjg7MDAwNDg7MjsxMDc7MTQyOzAzNTQ4OzI7MjU1OzE2NTswMDA0ODsyOzI1NTswNjk7MDAwNDg7MjsyMTg7MTEyOzIxNDQ4OzI7MjM4OzIzMjsxNzA0ODsyOzE1MjsyNTE7MTUyNDg7MjsxNzU7MjM4OzIzODQ4OzI7MjE5OzExMjsxNDc0ODsyOzI1NTsyMzk7MjEzNDg7MjsyNTU7MjE4OzE4NTQ4OzI7MjA1OzEzMzswNjM0ODsyOzI1NTsxOTI7MjAzNDg7MjsyMjE7MTYwOzIyMTQ4OzI7MTc2OzIyNDsyMzA0ODsyOzEyODswMDA7MTI4NDg7MjsxMDI7MDUxOzE1MzQ4OzI7MjU1OzAwMDswMDA0ODsyOzE4ODsxNDM7MTQzNDg7MjswNjU7MTA1OzIyNTQ4OzI7MTM5OzA2OTswMTk0ODsyOzI1MDsxMjg7MTE0NDg7MjsyNDQ7MTY0OzA5NjQ4OzI7MDQ2OzEzOTswODc0ODsyOzI1NTsyNDU7MjM4NDg7MjsxNjA7MDgyOzA0NTQ4OzI7MTkyOzE5MjsxOTI0ODsyOzEzNTsyMDY7MjM1NDg7MjsxMDY7MDkwOzIwNTQ4OzI7MTEyOzEyODsxNDQ0ODsyOzI1NTsyNTA7MjUwNDg7MjswMDA7MjU1OzEyNzQ4OzI7MDcwOzEzMDsxODA0ODsyOzIxMDsxODA7MTQwNDg7MjswMDA7MTI4OzEyODQ4OzI7MjE2OzE5MTsyMTY0ODsyOzI1NTswOTk7MDcxNDg7MjswNjQ7MjI0OzIwODQ4OzI7MjM4OzEzMDsyMzg0ODsyOzI0NTsyMjI7MTc5NDg7MjsyNTU7MjU1OzI1NTQ4OzI7MjQ1OzI0NTsyNDU0ODsyOzI1NTsyNTU7MDAwNDg7MjsxNTQ7MjA1OzA1MDM4OzU7MDM4OzU7MTM4OzU7MjM4OzU7MzM4OzU7NDM4OzU7NTM4OzU7NjM4OzU7NzM4OzU7ODM4OzU7OTM4OzU7MTAzODs1OzExMzg7NTsxMjM4OzU7MTMzODs1OzE0Mzg7NTsxNTM4OzU7MTYzODs1OzE3Mzg7NTsxODM4OzU7MTkzODs1OzIwMzg7NTsyMTM4OzU7MjIzODs1OzIzMzg7NTsyNDM4OzU7MjUzODs1OzI2Mzg7NTsyNzM4OzU7MjgzODs1OzI5Mzg7NTszMDM4OzU7MzEzODs1OzMyMzg7NTszMzM4OzU7MzQzODs1OzM1Mzg7NTszNjM4OzU7MzczODs1OzM4Mzg7NTszOTM4OzU7NDAzODs1OzQxMzg7NTs0MjM4OzU7NDMzODs1OzQ0Mzg7NTs0NTM4OzU7NDYzODs1OzQ3Mzg7NTs0ODM4OzU7NDkzODs1OzUwMzg7NTs1MTM4OzU7NTIzODs1OzUzMzg7NTs1NDM4OzU7NTUzODs1OzU2Mzg7NTs1NzM4OzU7NTgzODs1OzU5Mzg7NTs2MDM4OzU7NjEzODs1OzYyMzg7NTs2MzM4OzU7NjQzODs1OzY1Mzg7NTs2NjM4OzU7NjczODs1OzY4Mzg7NTs2OTM4OzU7NzAzODs1OzcxMzg7NTs3MjM4OzU7NzMzODs1Ozc0Mzg7NTs3NTM4OzU7NzYzODs1Ozc3Mzg7NTs3ODM4OzU7NzkzODs1OzgwMzg7NTs4MTM4OzU7ODIzODs1OzgzMzg7NTs4NDM4OzU7ODUzODs1Ozg2Mzg7NTs4NzM4OzU7ODgzODs1Ozg5Mzg7NTs5MDM4OzU7OTEzODs1OzkyMzg7NTs5MzM4OzU7OTQzODs1Ozk1Mzg7NTs5NjM4OzU7OTczODs1Ozk4Mzg7NTs5OTM4OzU7MTAwMzg7NTsxMDEzODs1OzEwMjM4OzU7MTAzMzg7NTsxMDQzODs1OzEwNTM4OzU7MTA2Mzg7NTsxMDczODs1OzEwODM4OzU7MTA5Mzg7NTsxMTAzODs1OzExMTM4OzU7MTEyMzg7NTsxMTMzODs1OzExNDM4OzU7MTE1Mzg7NTsxMTYzODs1OzExNzM4OzU7MTE4Mzg7NTsxMTkzODs1OzEyMDM4OzU7MTIxMzg7NTsxMjIzODs1OzEyMzM4OzU7MTI0Mzg7NTsxMjUzODs1OzEyNjM4OzU7MTI3Mzg7NTsxMjgzODs1OzEyOTM4OzU7MTMwMzg7NTsxMzEzODs1OzEzMjM4OzU7MTMzMzg7NTsxMzQzODs1OzEzNTM4OzU7MTM2Mzg7NTsxMzczODs1OzEzODM4OzU7MTM5Mzg7NTsxNDAzODs1OzE0MTM4OzU7MTQyMzg7NTsxNDMzODs1OzE0NDM4OzU7MTQ1Mzg7NTsxNDYzODs1OzE0NzM4OzU7MTQ4Mzg7NTsxNDkzODs1OzE1MDM4OzU7MTUxMzg7NTsxNTIzODs1OzE1MzM4OzU7MTU0Mzg7NTsxNTUzODs1OzE1NjM4OzU7MTU3Mzg7NTsxNTgzODs1OzE1OTM4OzU7MTYwMzg7NTsxNjEzODs1OzE2MjM4OzU7MTYzMzg7NTsxNjQzODs1OzE2NTM4OzU7MTY2Mzg7NTsxNjczODs1OzE2ODM4OzU7MTY5Mzg7NTsxNzAzODs1OzE3MTM4OzU7MTcyMzg7NTsxNzMzODs1OzE3NDM4OzU7MTc1Mzg7NTsxNzYzODs1OzE3NzM4OzU7MTc4Mzg7NTsxNzkzODs1OzE4MDM4OzU7MTgxMzg7NTsxODIzODs1OzE4MzM4OzU7MTg0Mzg7NTsxODUzODs1OzE4NjM4OzU7MTg3Mzg7NTsxODgzODs1OzE4OTM4OzU7MTkwMzg7NTsxOTEzODs1OzE5MjM4OzU7MTkzMzg7NTsxOTQzODs1OzE5NTM4OzU7MTk2Mzg7NTsxOTczODs1OzE5ODM4OzU7MTk5Mzg7NTsyMDAzODs1OzIwMTM4OzU7MjAyMzg7NTsyMDMzODs1OzIwNDM4OzU7MjA1Mzg7NTsyMDYzODs1OzIwNzM4OzU7MjA4Mzg7NTsyMDkzODs1OzIxMDM4OzU7MjExMzg7NTsyMTIzODs1OzIxMzM4OzU7MjE0Mzg7NTsyMTUzODs1OzIxNjM4OzU7MjE3Mzg7NTsyMTgzODs1OzIxOTM4OzU7MjIwMzg7NTsyMjEzODs1OzIyMjM4OzU7MjIzMzg7NTsyMjQzODs1OzIyNTM4OzU7MjI2Mzg7NTsyMjczODs1OzIyODM4OzU7MjI5Mzg7NTsyMzAzODs1OzIzMTM4OzU7MjMyMzg7NTsyMzMzODs1OzIzNDM4OzU7MjM1Mzg7NTsyMzYzODs1OzIzNzM4OzU7MjM4Mzg7NTsyMzkzODs1OzI0MDM4OzU7MjQxMzg7NTsyNDIzODs1OzI0MzM4OzU7MjQ0Mzg7NTsyNDUzODs1OzI0NjM4OzU7MjQ3Mzg7NTsyNDgzODs1OzI0OTM4OzU7MjUwMzg7NTsyNTEzODs1OzI1MjM4OzU7MjUzMzg7NTsyNTQzODs1OzI1NTQ4OzU7MDQ4OzU7MTQ4OzU7MjQ4OzU7MzQ4OzU7NDQ4OzU7NTQ4OzU7NjQ4OzU7NzQ4OzU7ODQ4OzU7OTQ4OzU7MTA0ODs1OzExNDg7NTsxMjQ4OzU7MTM0ODs1OzE0NDg7NTsxNTQ4OzU7MTY0ODs1OzE3NDg7NTsxODQ4OzU7MTk0ODs1OzIwNDg7NTsyMTQ4OzU7MjI0ODs1OzIzNDg7NTsyNDQ4OzU7MjU0ODs1OzI2NDg7NTsyNzQ4OzU7Mjg0ODs1OzI5NDg7NTszMDQ4OzU7MzE0ODs1OzMyNDg7NTszMzQ4OzU7MzQ0ODs1OzM1NDg7NTszNjQ4OzU7Mzc0ODs1OzM4NDg7NTszOTQ4OzU7NDA0ODs1OzQxNDg7NTs0MjQ4OzU7NDM0ODs1OzQ0NDg7NTs0NTQ4OzU7NDY0ODs1OzQ3NDg7NTs0ODQ4OzU7NDk0ODs1OzUwNDg7NTs1MTQ4OzU7NTI0ODs1OzUzNDg7NTs1NDQ4OzU7NTU0ODs1OzU2NDg7NTs1NzQ4OzU7NTg0ODs1OzU5NDg7NTs2MDQ4OzU7NjE0ODs1OzYyNDg7NTs2MzQ4OzU7NjQ0ODs1OzY1NDg7NTs2NjQ4OzU7Njc0ODs1OzY4NDg7NTs2OTQ4OzU7NzA0ODs1OzcxNDg7NTs3MjQ4OzU7NzM0ODs1Ozc0NDg7NTs3NTQ4OzU7NzY0ODs1Ozc3NDg7NTs3ODQ4OzU7Nzk0ODs1OzgwNDg7NTs4MTQ4OzU7ODI0ODs1OzgzNDg7NTs4NDQ4OzU7ODU0ODs1Ozg2NDg7NTs4NzQ4OzU7ODg0ODs1Ozg5NDg7NTs5MDQ4OzU7OTE0ODs1OzkyNDg7NTs5MzQ4OzU7OTQ0ODs1Ozk1NDg7NTs5NjQ4OzU7OTc0ODs1Ozk4NDg7NTs5OTQ4OzU7MTAwNDg7NTsxMDE0ODs1OzEwMjQ4OzU7MTAzNDg7NTsxMDQ0ODs1OzEwNTQ4OzU7MTA2NDg7NTsxMDc0ODs1OzEwODQ4OzU7MTA5NDg7NTsxMTA0ODs1OzExMTQ4OzU7MTEyNDg7NTsxMTM0ODs1OzExNDQ4OzU7MTE1NDg7NTsxMTY0ODs1OzExNzQ4OzU7MTE4NDg7NTsxMTk0ODs1OzEyMDQ4OzU7MTIxNDg7NTsxMjI0ODs1OzEyMzQ4OzU7MTI0NDg7NTsxMjU0ODs1OzEyNjQ4OzU7MTI3NDg7NTsxMjg0ODs1OzEyOTQ4OzU7MTMwNDg7NTsxMzE0ODs1OzEzMjQ4OzU7MTMzNDg7NTsxMzQ0ODs1OzEzNTQ4OzU7MTM2NDg7NTsxMzc0ODs1OzEzODQ4OzU7MTM5NDg7NTsxNDA0ODs1OzE0MTQ4OzU7MTQyNDg7NTsxNDM0ODs1OzE0NDQ4OzU7MTQ1NDg7NTsxNDY0ODs1OzE0NzQ4OzU7MTQ4NDg7NTsxNDk0ODs1OzE1MDQ4OzU7MTUxNDg7NTsxNTI0ODs1OzE1MzQ4OzU7MTU0NDg7NTsxNTU0ODs1OzE1NjQ4OzU7MTU3NDg7NTsxNTg0ODs1OzE1OTQ4OzU7MTYwNDg7NTsxNjE0ODs1OzE2MjQ4OzU7MTYzNDg7NTsxNjQ0ODs1OzE2NTQ4OzU7MTY2NDg7NTsxNjc0ODs1OzE2ODQ4OzU7MTY5NDg7NTsxNzA0ODs1OzE3MTQ4OzU7MTcyNDg7NTsxNzM0ODs1OzE3NDQ4OzU7MTc1NDg7NTsxNzY0ODs1OzE3NzQ4OzU7MTc4NDg7NTsxNzk0ODs1OzE4MDQ4OzU7MTgxNDg7NTsxODI0ODs1OzE4MzQ4OzU7MTg0NDg7NTsxODU0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LjMvc3JjL2RmYS5ycy9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL2Foby1jb3Jhc2ljay0xLjEuMy9zcmMvbmZhL2NvbnRpZ3VvdXMucnMATvAgAG0AAABxAgAAFgAAAE7wIABtAAAAcwIAAA0AAABO8CAAbQAAAHUCAAANAAAATvAgAG0AAAApAgAACQAAAE7wIABtAAAATwIAAA0AAABO8CAAbQAAAEoCAAANAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvYWhvLWNvcmFzaWNrLTEuMS4zL3NyYy9uZmEvbm9uY29udGlndW91cy5ycxzxIABwAAAAIgEAACAAAAAc8SAAcAAAADIBAAAhAAAAHPEgAHAAAABUAQAAHQAAABzxIABwAAAAZgEAABcAAABleHBlY3RlZCBudW1iZXIgb2YgcGF0dGVybnMgdG8gbWF0Y2ggcGF0dGVybiBJRADM8SAALwAAABzxIABwAAAANAQAAA0AAAAc8SAAcAAAADkEAAAjAAAAHPEgAHAAAABVBAAAOQAAABzxIABwAAAAygMAABkAAAAc8SAAcAAAAMsDAAAaAAAAHPEgAHAAAADPAwAAGAAAABzxIABwAAAA4wMAABkAAAAc8SAAcAAAABYEAAAZAAAAHPEgAHAAAAAXBAAAGAAAABzxIABwAAAAGAQAABoAAAAc8SAAcAAAABkEAAAfAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvYWhvLWNvcmFzaWNrLTEuMS4zL3NyYy91dGlsL3NlYXJjaC5ycwAAtPIgAGoAAABOAQAACQAAAGludmFsaWQgbWF0Y2ggc3BhbgAAMPMgABIAAAC08iAAagAAAFsDAAAJAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvYWhvLWNvcmFzaWNrLTEuMS4zL3NyYy9wYWNrZWQvYXBpLnJz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c3NlcnRpb24gZmFpbGVkOiBzZWxmLmFzX3JlZigpLmlzX3ZhbGlkKGlkKeT+IABrAAAAOwoAAAkAAABhdHRlbXB0ZWQgdG8gc2VhcmNoIGZvciBhIHNwZWNpZmljIHBhdHRlcm4gd2l0aG91dCBlbmFibGluZyBzdGFydHNfZm9yX2VhY2hfcGF0dGVybgAQAiEAUwAAAOT+IABrAAAAQQoAABEAAADk/iAAawAAAEoKAAAaAAAA5P4gAGsAAACOCgAAHQAAAOT+IABrAAAAlgoAABsAAADk/iAAawAAALIKAAAzAAAA5P4gAGsAAAC7CgAAMwAAAAAAAAAAAAAAAAAAAAIAAABjYW5ub3QgYnVpbGQgbGF6eSBERkFzIGZvciByZWdleGVzIHdpdGggVW5pY29kZSB3b3JkIGJvdW5kYXJpZXM7IHN3aXRjaCB0byBBU0NJSSB3b3JkIGJvdW5kYXJpZXMsIG9yIGhldXJpc3RpY2FsbHkgZW5hYmxlIFVuaWNvZGUgd29yZCBib3VuZGFyaWVzIG9yIHVzZSBhIGRpZmZlcmVudCByZWdleCBlbmdpbmUpIGFyZSBub3Qgc3VwcG9ydGVkIG9yIGVuYWJsZWRyZXZlcnNlIHNlYXJjaCBtdXN0IG1hdGNoIGlmIGZvcndhcmQgc2VhcmNoIGRvZXMvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvaHlicmlkL3JlZ2V4LnJz2wMhAG0AAADxAQAADgAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy9oeWJyaWQvc2VhcmNoLnJzAABYBCEAbgAAAFkAAAApAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogc2lkIGJlaW5nIHVua25vd24gaXMgYSBidWfYBCEARAAAAFgEIQBuAAAAHQEAABEAAABYBCEAbgAAABoBAAAtAAAAWAQhAG4AAABXAQAAKQAAAFgEIQBuAAAArQEAABEAAABYBCEAbgAAAKoBAAAtAAAAWAQhAG4AAAD7AQAAJQAAAFgEIQBuAAAAIgIAABEAAABYBCEAbgAAAB0CAAAVAAAAWAQhAG4AAADiAgAAFAAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGZvdW5kIGltcG9zc2libGUgZXJyb3IgaW4gbWV0YSBlbmdpbmU6IAAAALQFIQBRAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL21ldGEvZXJyb3IucnMAEAYhAGsAAADtAAAAEQAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy9tZXRhL2xpbWl0ZWQucnMAAACMBiEAbQAAAI4AAAAlAAAAjAYhAG0AAADoAAAAFAAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy9tZXRhL2xpdGVyYWwucnMAAAAcByEAbQAAAB4AAAANAAAAHAchAG0AAAA+AAAADgAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGV4cGVjdGVkIGxpdGVyYWwsIGdvdCCsByEAQAAAABwHIQBtAAAAOAAAAB4AAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBleHBlY3RlZCBsaXRlcmFsIG9yIGNvbmNhdCwgZ290IAAABAghAEoAAAAcByEAbQAAADwAAAASAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL21ldGEvcmVnZXgucnMAaAghAGsAAACI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AAAAFS4hAHcAAADKAgAAMQAAABUuIQB3AAAAxgIAAAkAAAAVLiEAdwAAAAADAAAKAAAAFS4hAHcAAAD9AgAADgAAABUuIQB3AAAAHAMAAB4AAABhc3NlcnRpb24gZmFpbGVkOiBzdGFjay5pc19lbXB0eSgpL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL3V0aWwvZGV0ZXJtaW5pemUvbW9kLnJzAP4vIQB1AAAAeAEAAAUAAAD+LyEAdQAAAIABAAALAAAA/i8hAHUAAACkAQAAGwAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy91dGlsL2VtcHR5LnJzAKQwIQBrAAAA+QAAADoAAAA80CYAbAAAAPsDAAAJAAAA////f1BhdHRlcm5TZXQgc2hvdWxkIGhhdmUgc3VmZmljaWVudCBjYXBhY2l0eQAAPNAmAGwAAADLBAAADgAAAHF1aXQgc2VhcmNoIGFmdGVyIG9ic2VydmluZyBieXRlICBhdCBvZmZzZXQgcDEhACEAAACRMSEACwAAAGdhdmUgdXAgc2VhcmNoaW5nIGF0IG9mZnNldCCsMSEAHAAAAGhheXN0YWNrIG9mIGxlbmd0aCAgaXMgdG9vIGxvbmcA0DEhABMAAADjMSEADAAAAHVuYW5jaG9yZWQgc2VhcmNoZXMgYXJlIG5vdCBzdXBwb3J0ZWQgb3IgZW5hYmxlZGFuY2hvcmVkIHNlYXJjaGVzIGFyZSBub3Qgc3VwcG9ydGVkIG9yIGVuYWJsZWRhbmNob3JlZCBzZWFyY2hlcyBmb3IgYSBzcGVjaWZpYyBwYXR0ZXJuICheMiEAKgAAAI0DIQAeAAAAc3BhcnNlIHNldCBjYXBhY2l0eSBjYW5ub3QgZXhjY2VkIAAAmDIhACIAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvdXRpbC9zcGFyc2Vfc2V0LnJzxDIhAHAAAACCAAAACQAAACBleGNlZWRzIGNhcGFjaXR5IG9mICB3aGVuIGluc2VydGluZyAAAAABAAAAAAAAAEQzIQAVAAAAWTMhABAAAADEMiEAcAAAALIAAAAJAAAAxDIhAHAAAAC9AAAAFAAAAMQyIQBwAAAAxQAAACAAAADEMiEAcAAAAMYAAAA0AAAAxDIhAHAAAADRAAAAIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvdXRpbC91dGY4LnJzAADUNCEAagAAAEMAAAArAAAA1DQhAGoAAABVAAAAOAAAANQ0IQBqAAAAWAAAABgAAADjBAAAYAAAABAAAADkBAAA5QQAAAQAAAAEAAAAxAAAAAAAAAAAAQAAAQAAAOYEAAAAAAAAAAEAAAEAAACFAAAAAAAAACAAAAAQAAAA5wQAAGNvbmZpZ25mYXN0cmlkZTJzdGFydF9tYXBjbGFzc2VzcXVpdHNldGNhY2hlX2NhcGFjaXR5AAAAwDUhAAYAAADGNSEAAwAAAMk1IQAHAAAA0DUhAAkAAADZNSEABwAAAOA1IQAHAAAA5zUhAA4AAABERkEAAAAAAAEAAAABAAAAkQAAAOgEAAAQAAAABAAAAKEAAAAAAAAAAQAAAAEAAADpBAAAAAAAADAAAAAQAAAA6gQAAAAAAAAIAAAABAAAAOsEAAAAAAAABAAAAAQAAADsBAAAbWF0Y2hfa2luZHByZXN0YXJ0c19mb3JfZWFjaF9wYXR0ZXJuYnl0ZV9jbGFzc2VzdW5pY29kZV93b3JkX2JvdW5kYXJ5c3BlY2lhbGl6ZV9zdGFydF9zdGF0ZXNza2lwX2NhY2hlX2NhcGFjaXR5X2NoZWNrbWluaW11bV9jYWNoZV9jbGVhcl9jb3VudG1pbmltdW1fYnl0ZXNfcGVyX3N0YXRlAAAAlDYhAAoAAACeNiEAAwAAAKE2IQAXAAAAuDYhAAwAAADENiEAFQAAAOA1IQAHAAAA2TYhABcAAADnNSEADgAAAPA2IQAZAAAACTchABkAAAAiNyEAFwAAAENvbmZpZ0NhY2hlRXJyb3JMYXp5U3RhdGVJRExhenlTdGF0ZUlERXJyb3JhdHRlbXB0ZWRmb3J3YXJkcmV2ZXJzZVJlZ2V4SW5mb1JlZ2V4SW5mb0lwcm9wc191bmlvbgAAAAABAAAAAQAAAO0EAAB1dGY4X2VtcHR5YXV0b3ByZXdoaWNoX2NhcHR1cmVzbmZhX3NpemVfbGltaXRvbmVwYXNzX3NpemVfbGltaXRoeWJyaWRfY2FjaGVfY2FwYWNpdHloeWJyaWRkZmFkZmFfc2l6ZV9saW1pdGRmYV9zdGF0ZV9saW1pdG9uZXBhc3NiYWNrdHJhY2tsaW5lX3Rlcm1pbmF0b3IAAACUNiEACgAAAAQ4IQAKAAAADjghAAcAAACeNiEAAwAAABU4IQAOAAAAIzghAA4AAAAxOCEAEgAAAEM4IQAVAAAAWDghAAYAAABeOCEAAwAAAGE4IQAOAAAAbzghAA8AAAB+OCEABwAAAIU4IQAJAAAAuDYhAAwAAACOOCEADwAAAFByZWdyb3VwX2luZm8AAADuBAAABAAAAAQAAADvBAAA8AQAABAAAAAEAAAA8QQAAPIEAAAEAAAABAAAAPMEAAD0BAAAGAAAAAQAAAD1BAAA9gQAABwAAAAEAAAA9wQAAPgEAAA8AQAABAAAAPkEAAD6BAAAIAUAABAAAAD7BAAAAAAAAAQAAAAEAAAA/AQAAGluZm9uZmFyZXZwaWtldm2wOSEABAAAAJ42IQADAAAAxjUhAAMAAAC0OSEABgAAALo5IQAGAAAAhTghAAkAAAB+OCEABwAAAFg4IQAGAAAAXjghAAMAAABDb3JlUmV2ZXJzZUFuY2hvcmVkY29yZVJldmVyc2VTdWZmaXhSZXZlcnNlSW5uZXJwcmVpbm5lclBpa2VWTVBpa2VWTUVuZ2luZUJvdW5kZWRCYWNrdHJhY2tlckJvdW5kZWRCYWNrdHJhY2tlckVuZ2luZU9uZVBhc3NPbmVQYXNzRW5naW5lSHlicmlkSHlicmlkRW5naW5lREZBRW5naW5lUmV2ZXJzZUh5YnJpZFJldmVyc2VIeWJyaWRFbmdpbmVSZXZlcnNlREZBUmV2ZXJzZURGQUVuZ2luZXZpc2l0ZWRfY2FwYWNpdHlBbGxJbXBsaWNpdFRvb01hbnlQYXR0ZXJuc0J5dGVTZXRiaXRzR3JvdXBJbmZvR3JvdXBJbmZvSW5uZXJzbG90X3Jhbmdlc25hbWVfdG9faW5kZXhpbmRleF90b19uYW1lbWVtb3J5X2V4dHJhR3JvdXBJbmZvRXJyb3JlcnJUb29NYW55R3JvdXBzbWluaW11bU1pc3NpbmdHcm91cHNGaXJzdE11c3RCZVVubmFtZWREdXBsaWNhdGVyZWdleDogdGhyZWFkIElEIGFsbG9jYXRpb24gc3BhY2UgZXhoYXVzdGVkAACvOyEAKwAAAGzPJgBqAAAAXgEAABEAAABBaG9Db3Jhc2lja2FjTWVtY2hyTWVtY2hyMk1lbWNocjNNZW1tZW1maW5kZXJzZWFyY2hlcmFuY2hvcmVkX2FjUHJlZmlsdGVyaXNfZmFzdG1heF9uZWVkbGVfbGVuU21hbGxJbmRleFNtYWxsSW5kZXhFcnJvclBhdHRlcm5JRC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy91dGlsL3ByaW1pdGl2ZXMucnN0PCEAcAAAAPECAAABAAAAUGF0dGVybklERXJyb3IAAHQ8IQBwAAAA8gIAAAEAAABTdGF0ZUlEY2Fubm90IGNyZWF0ZSBpdGVyYXRvciBmb3IgU3RhdGVJRCB3aGVuIG51bWJlciBvZiBlbGVtZW50cyBleGNlZWQgAAAAGz0hAEIAAABOb25Xb3JkQnl0ZVdvcmRCeXRlVGV4dExpbmVMRkxpbmVDUkN1c3RvbUxpbmVUZXJt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bXVtIG51bWJlciBvZiBjYXB0dXJpbmcgZ3JvdXBzICgAAAAUSCEAMQAAALNAJwABAAAAaW52YWxpZCBlc2NhcGUgc2VxdWVuY2UgZm91bmQgaW4gY2hhcmFjdGVyIGNsYXNzaW52YWxpZCBjaGFyYWN0ZXIgY2xhc3MgcmFuZ2UsIHRoZSBzdGFydCBtdXN0IGJlIDw9IHRoZSBlbmRpbnZhbGlkIHJhbmdlIGJvdW5kYXJ5LCBtdXN0IGJlIGEgbGl0ZXJhbHVuY2xvc2VkIGNoYXJhY3RlciBjbGFzc2RlY2ltYWwgbGl0ZXJhbCBlbXB0eWRlY2ltYWwgbGl0ZXJhbCBpbnZhbGlkaGV4YWRlY2ltYWwgbGl0ZXJhbCBlbXB0eWhleGFkZWNpbWFsIGxpdGVyYWwgaXMgbm90IGEgVW5pY29kZSBzY2FsYXIgdmFsdWVpbnZhbGlkIGhleGFkZWNpbWFsIGRpZ2l0aW5jb21wbGV0ZSBlc2NhcGUgc2VxdWVuY2UsIHJlYWNoZWQgZW5kIG9mIHBhdHRlcm4gcHJlbWF0dXJlbHl1bnJlY29nbml6ZWQgZXNjYXBlIHNlcXVlbmNlZGFuZ2xpbmcgZmxhZyBuZWdhdGlvbiBvcGVyYXRvcmR1cGxpY2F0ZSBmbGFnZmxhZyBuZWdhdGlvbiBvcGVyYXRvciByZXBlYXRlZGV4cGVjdGVkIGZsYWcgYnV0IGdvdCBlbmQgb2YgcmVnZXh1bnJlY29nbml6ZWQgZmxhZ2R1cGxpY2F0ZSBjYXB0dXJlIGdyb3VwIG5hbWVlbXB0eSBjYXB0dXJlIGdyb3VwIG5hbWVpbnZhbGlkIGNhcHR1cmUgZ3JvdXAgY2hhcmFjdGVydW5jbG9zZWQgY2FwdHVyZSBncm91cCBuYW1ldW5jbG9zZWQgZ3JvdXB1bm9wZW5lZCBncm91cGV4Y2VlZCB0aGUgbWF4aW11bSBudW1iZXIgb2YgbmVzdGVkIHBhcmVudGhlc2VzL2JyYWNrZXRzICj2SiEAOgAAALNAJwABAAAAaW52YWxpZCByZXBldGl0aW9uIGNvdW50IHJhbmdlLCB0aGUgc3RhcnQgbXVzdCBiZSA8PSB0aGUgZW5kcmVwZXRpdGlvbiBxdWFudGlmaWVyIGV4cGVjdHMgYSB2YWxpZCBkZWNpbWFsdW5jbG9zZWQgY291bnRlZCByZXBldGl0aW9ucmVwZXRpdGlvbiBvcGVyYXRvciBtaXNzaW5nIGV4cHJlc3Npb25zcGVjaWFsIHdvcmQgYm91bmRhcnkgYXNzZXJ0aW9uIGlzIGVpdGhlciB1bmNsb3NlZCBvciBjb250YWlucyBhbiBpbnZhbGlkIGNoYXJhY3RlcnVucmVjb2duaXplZCBzcGVjaWFsIHdvcmQgYm91bmRhcnkgYXNzZXJ0aW9uLCB2YWxpZCBjaG9pY2VzIGFyZTogc3RhcnQsIGVuZCwgc3RhcnQtaGFsZiBvciBlbmQtaGFsZmZvdW5kIGVpdGhlciB0aGUgYmVnaW5uaW5nIG9mIGEgc3BlY2lhbCB3b3JkIGJvdW5kYXJ5IG9yIGEgYm91bmRlZCByZXBldGl0aW9uIG9uIGEgXGIgd2l0aCBhbiBvcGVuaW5nIGJyYWNlLCBidXQgbm8gY2xvc2luZyBicmFjZWludmFsaWQgVW5pY29kZSBjaGFyYWN0ZXIgY2xhc3NiYWNrcmVmZXJlbmNlcyBhcmUgbm90IHN1cHBvcnRlZGxvb2stYXJvdW5kLCBpbmNsdWRpbmcgbG9vay1haGVhZCBhbmQgbG9vay1iZWhpbmQsIGlzIG5vdCBzdXBwb3J0ZWQvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1zeW50YXgtMC44LjQvc3JjL2FzdC9tb2QucnNhbG51bWFzY2lpYmxhbmtjbnRybGRpZ2l0Z3JhcGhsb3dlcnByaW50cHVuY3RzcGFjZXVwcGVyeGRpZ2l0AACjTSEAZgAAAOcEAAAUAAAAo00hAGYAAADzBAAAIwAAAKNNIQBmAAAADwYAABQAAACjTSEAZgAAAMwGAAAbAAAAJyAnL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtc3ludGF4LTAuOC40L3NyYy9kZWJ1Zy5ycwCLTiEAZAAAABgAAAA9AAAAi04hAGQAAAAVAAAADQAAAItOIQBkAAAAMgAAABsAAACLTiEAZAAAAC4AAAAj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yOLDmriufni/ncKqvaKhlsGOiauwuae6cK/AvJyMj3uFgJOKknLfl/nY7uz949rm94e08en29OeL9fP768nE8NaYts21fxvU09LV5MWpn4OsaVBiYGFRz5F0c5CCmXlrhG1ufG9SbHaNcYF3faV1XGpTSGNdQU+m7aPHvuHRy8bZ287q+J7v/////////////////////////////////////////////////////////////////////////////////////3RyaWVkIHRvIHVud3JhcCBleHByIGZyb20gSGlyRnJhbWUsIGdvdDogAAAA/FYhACkAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1zeW50YXgtMC44LjQvc3JjL2hpci90cmFuc2xhdGUucnMwVyEAbAAAAAEBAAASAAAAdHJpZWQgdG8gdW53cmFwIFVuaWNvZGUgY2xhc3MgZnJvbSBIaXJGcmFtZSwgZ290OiAAAKxXIQAyAAAAMFchAGwAAAAKAQAAEgAAAHRyaWVkIHRvIHVud3JhcCBieXRlIGNsYXNzIGZyb20gSGlyRnJhbWUsIGdvdDogAPhXIQAvAAAAMFchAGwAAAAXAQAAEgAAAHRyaWVkIHRvIHVud3JhcCByZXBldGl0aW9uIGZyb20gSGlyRnJhbWUsIGdvdDogAEBYIQAvAAAAMFchAGwAAAAlAQAAEQAAAHRyaWVkIHRvIHVud3JhcCBncm91cCBmcm9tIEhpckZyYW1lLCBnb3Q6IAAAiFghACoAAAAwVyEAbAAAADQBAAARAAAAdHJpZWQgdG8gdW53cmFwIGFsdCBwaXBlIGZyb20gSGlyRnJhbWUsIGdvdDogAAAAzFghAC0AAAAwVyEAbAAAAD8BAAARAAAAMFchAGwAAABOAQAAJwAAADBXIQBsAAAATwEAABcAAAAwVyEAbAAAAE4BAAAJAAAAMFchAGwAAACsAQAALgAAADBXIQBsAAAAowEAAC4AAAAwVyEAbAAAALcBAAAnAAAAMFchAGwAAAC4AQAAHAAAADBXIQBsAAAAvAEAACcAAAAwVyEAbAAAAL0BAAAsAAAAMFchAGwAAADOAQAAIAAAADBXIQBsAAAAzwEAABsAAAAwVyEAbAAAAMUBAAAfAAAAMFchAGwAAAD+AQAALgAAADBXIQBsAAAA+gEAAC4AAAAwVyEAbAAAAAoCAAAuAAAAMFchAGwAAAAGAgAALgAAADBXIQBsAAAAGQIAAC4AAAAwVyEAbAAAABQCAAAuAAAAMFchAGwAAAAgAgAAKgAAADBXIQBsAAAALAIAAC4AAAAwVyEAbAAAACcCAAAuAAAAMFchAGwAAAA+AgAALwAAADBXIQBsAAAARQIAAC8AAAAwVyEAbAAAADMCAAAvAAAAMFchAGwAAAA6AgAALwAAADBXIQBsAAAAjAIAACYAAAAwVyEAbAAAAI0CAAAmAAAAMFchAGwAAACOAgAAJgAAADBXIQBsAAAAcwIAACYAAAAwVyEAbAAAAHQCAAAmAAAAMFchAGwAAAB1AgAAJgAAADBXIQBsAAAAuAIAABwAAAAwVyEAbAAAALgCAAApAAAAMFchAGwAAADDAgAALAAAADBXIQBsAAAAxwIAABMAAAAwVyEAbAAAANECAAAsAAAAMFchAGwAAADTAgAAFQAAADBXIQBsAAAA1QIAABMAAAAwVyEAbAAAANsCAAAcAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZXhwZWN0ZWQgZXhwciBvciBjb25jYXQsIGdvdCBVbmljb2RlIGNsYXNzhFshAFQAAAAwVyEAbAAAAOkCAAARAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZXhwZWN0ZWQgZXhwciBvciBjb25jYXQsIGdvdCBieXRlIGNsYXNzAAAA8FshAFEAAAAwVyEAbAAAAOwCAAARAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZXhwZWN0ZWQgZXhwciBvciBjb25jYXQsIGdvdCByZXBldGl0aW9uAAAAXFwhAFEAAAAwVyEAbAAAAO8CAAARAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZXhwZWN0ZWQgZXhwciBvciBjb25jYXQsIGdvdCBncm91cMhcIQBMAAAAMFchAGwAAADyAgAAEQAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGV4cGVjdGVkIGV4cHIgb3IgY29uY2F0LCBnb3QgYWx0IG1hcmtlcgAAACxdIQBRAAAAMFchAGwAAAD1AgAAEQAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGV4cGVjdGVkIGV4cHIgb3IgY29uY2F0LCBnb3QgYWx0IGJyYW5jaCBtYXJrZXKYXSEAWAAAADBXIQBsAAAA+AIAABEAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBleHBlY3RlZCBleHByIG9yIGFsdCwgZ290IFVuaWNvZGUgY2xhc3MAAAAIXiEAUQAAADBXIQBsAAAACAMAABEAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBleHBlY3RlZCBleHByIG9yIGFsdCwgZ290IGJ5dGUgY2xhc3MAAHReIQBOAAAAMFchAGwAAAALAwAAEQAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGV4cGVjdGVkIGV4cHIgb3IgYWx0LCBnb3QgcmVwZXRpdGlvbgAA3F4hAE4AAAAwVyEAbAAAAA4DAAARAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZXhwZWN0ZWQgZXhwciBvciBhbHQsIGdvdCBncm91cAAAAERfIQBJAAAAMFchAGwAAAARAwAAEQAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGV4cGVjdGVkIGV4cHIgb3IgYWx0LCBnb3QgY29uY2F0IG1hcmtlcgAAAKhfIQBRAAAAMFchAGwAAAAUAwAAEQAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGV4cGVjdGVkIGV4cHIgb3IgYWx0LCBnb3QgYWx0IGJyYW5jaCBtYXJrZXIAAAAUYCEAVQAAADBXIQBsAAAAFwMAABEAAABhc3NlcnRpb24gZmFpbGVkOiBzZWxmLmZsYWdzKCkudW5pY29kZSgpMFchAGwAAABDBAAACQAAAAxhc3Nl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AQAAXwEAAF4BAABhAQAAYAEAAGMBAABiAQAAZQEAAGQBAABnAQAAZgEAAGkBAABoAQAAawEAAGoBAABtAQAAbAEAAG8BAABuAQAAcQEAAHABAABzAQAAcgEAAHUBAAB0AQAAdwEAAHYBAAD/AAAAegEAAHkBAAB8AQAAewEAAH4BAAB9AQAAUwAAAHMAAABDAgAAUwIAAIMBAACCAQAAhQEAAIQBAABUAgAAiAEAAIcBAABWAgAAVwIAAIwBAACLAQAA3QEAAFkCAABbAgAAkgEAAJEBAABgAgAAYwIAAPYBAABpAgAAaAIAAJkBAACYAQAAPQIAAG8CAAByAgAAIAIAAHUCAAChAQAAoAEAAKMBAACiAQAApQEAAKQBAACAAgAAqAEAAKcBAACDAgAArQEAAKwBAACIAgAAsAEAAK8BAACKAgAAiwIAALQBAACzAQAAtgEAALUBAACSAgAAuQEAALgBAAC9AQAAvAEAAPcBAADFAQAAxgEAAMQBAADGAQAAxAEAAMUBAADIAQAAyQEAAMcBAADJAQAAxwEAAMgBAADLAQAAzAEAAMoBAADMAQAAygEAAMsBAADOAQAAzQEAANABAADPAQAA0gEAANEBAADUAQAA0wEAANYBAADVAQAA2AEAANcBAADaAQAA2QEAANwBAADbAQAAjgEAAN8BAADeAQAA4QEAAOABAADjAQAA4gEAAOUBAADkAQAA5wEAAOYBAADpAQAA6AEAAOsBAADqAQAA7QEAAOwBAADvAQAA7gEAAPIBAADzAQAA8QEAAPMBAADxAQAA8gEAAPUBAAD0AQAAlQEAAL8BAAD5AQAA+AEAAPsBAAD6AQAA/QEAAPwBAAD/AQAA/gEAAAECAAAAAgAAAwIAAAICAAAFAgAABAIAAAcCAAAGAgAACQIAAAgCAAALAgAACgIAAA0CAAAMAgAADwIAAA4CAAARAgAAEAIAABMCAAASAgAAFQIAABQCAAAXAgAAFgIAABkCAAAYAgAAGwIAABoCAAAdAgAAHAIAAB8CAAAeAgAAngEAACMCAAAiAgAAJQIAACQCAAAnAgAAJgIAACkCAAAoAgAAKwIAACoCAAAtAgAALAIAAC8CAAAuAgAAMQIAADACAAAzAgAAMgIAAGUsAAA8AgAAOwIAAJoBAABmLAAAfiwAAH8sAABCAgAAQQIAAIABAACJAgAAjAIAAEcCAABGAgAASQIAAEgCAABLAgAASgIAAE0CAABMAgAATwIAAE4CAABvLAAAbSwAAHAsAACBAQAAhgEAAIkBAACKAQAAjwEAAJABAACrpwAAkwEAAKynAACUAQAAjacAAKqnAACXAQAAlgEAAK6nAABiLAAAracAAJwBAABuLAAAnQEAAJ8BAABkLAAApgEAAMWnAACpAQAAsacAAK4BAABEAgAAsQEAALIBAABFAgAAtwEAALKnAACwpwAAmQMAALkDAAC+HwAAcQMAAHADAABzAwAAcgMAAHcDAAB2AwAA/QMAAP4DAAD/AwAA8wMAAKwDAACtAwAArgMAAK8DAADMAwAAzQMAAM4DAACxAwAAsgMAANADAACzAwAAtAMAALUDAAD1AwAAtgMAALcDAAC4AwAA0QMAAPQDAABFAwAAuQMAAL4fAAC6AwAA8AMAALsDAAC1AAAAvAMAAL0DAAC+AwAAvwMAAMADAADWAwAAwQMAAPEDAADCAwAAwwMAAMQDAADFAwAAxgMAANUDAADHAwAAyAMAAMkDAAAmIQAAygMAAMsDAACGAwAAiAMAAIkDAACKAwAAkQMAAJIDAADQAwAAkwMAAJQDAACVAwAA9QMAAJYDAACXAwAAmAMAANEDAAD0AwAARQMAAJkDAAC+HwAAmgMAAPADAACbAwAAtQAAAJwDAACdAwAAngMAAJ8DAACgAwAA1gMAAKEDAADxAwAAowMAAMMDAACjAwAAwgMAAKQDAAClAwAApgMAANUDAACnAwAAqAMAAKkDAAAmIQAAqgMAAKsDAACMAwAAjgMAAI8DAADXAwAAkgMAALIDAACYAwAAuAMAAPQDAACmAwAAxgMAAKADAADAAwAAzwMAANkDAADYAwAA2wMAANoDAADdAwAA3AMAAN8DAADeAwAA4QMAAOADAADjAwAA4gMAAOUDAADkAwAA5wMAAOYDAADpAwAA6AMAAOsDAADqAwAA7QMAAOwDAADvAwAA7gMAAJoDAAC6AwAAoQMAAMEDAAD5AwAAfwMAAJgDAAC4AwAA0QMAAJUDAAC1AwAA+AMAAPcDAADyAwAA+wMAAPoDAAB7AwAAfAMAAH0DAABQBAAAUQQAAFIEAABTBAAAVAQAAFUEAABWBAAAVwQAAFgEAABZBAAAWgQAAFsEAABcBAAAXQQAAF4EAABf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HgAAOR4AADgeAAA7HgAAOh4AAD0eAAA8HgAAPx4AAD4eAABBHgAAQB4AAEMeAABCHgAARR4AAEQeAABHHgAARh4AAEkeAABIHgAASx4AAEoeAABNHgAATB4AAE8eAABOHgAAUR4AAFAeAABTHgAAUh4AAFUeAABUHgAAVx4AAFYeAABZHgAAWB4AAFseAABaHgAAXR4AAFweAABfHgAAXh4AAGEeAACbHgAAYB4AAJseAABjHgAAYh4AAGUeAABkHgAAZx4AAGYeAABpHgAAaB4AAGseAABqHgAAbR4AAGweAABvHgAAbh4AAHEeAABwHgAAcx4AAHIeAAB1HgAAdB4AAHceAAB2HgAAeR4AAHgeAAB7HgAAeh4AAH0eAAB8HgAAfx4AAH4eAACBHgAAgB4AAIMeAACCHgAAhR4AAIQeAACHHgAAhh4AAIkeAACIHgAAix4AAIoeAACNHgAAjB4AAI8eAACOHgAAkR4AAJAeAACTHgAAkh4AAJUeAACUHgAAYB4AAGEeAADfAAAAoR4AAKAeAACjHgAAoh4AAKUeAACkHgAApx4AAKYeAACpHgAAqB4AAKseAACqHgAArR4AAKweAACvHgAArh4AALEeAACwHgAAsx4AALIeAAC1HgAAtB4AALceAAC2HgAAuR4AALgeAAC7HgAAuh4AAL0eAAC8HgAAvx4AAL4eAADBHgAAwB4AAMMeAADCHgAAxR4AAMQeAADHHgAAxh4AAMkeAADIHgAAyx4AAMoeAADNHgAAzB4AAM8eAADOHgAA0R4AANAeAADTHgAA0h4AANUeAADUHgAA1x4AANYeAADZHgAA2B4AANseAADaHgAA3R4AANweAADfHgAA3h4AAOEeAADgHgAA4x4AAOIeAADlHgAA5B4AAOceAADmHgAA6R4AAOgeAADrHgAA6h4AAO0eAADsHgAA7x4AAO4eAADxHgAA8B4AAPMeAADyHgAA9R4AAPQeAAD3HgAA9h4AAPkeAAD4HgAA+x4AAPoeAAD9HgAA/B4AAP8eAAD+HgAACB8AAAkfAAAKHwAACx8AAAwfAAANHwAADh8AAA8fAAAAHwAAAR8AAAIfAAADHwAABB8AAAUfAAAGHwAABx8AABgfAAAZHwAAGh8AABsfAAAcHwAAHR8AABAfAAARHwAAEh8AABMfAAAUHwAAFR8AACgfAAApHwAAKh8AACsfAAAsHwAALR8AAC4fAAAvHwAAIB8AACEfAAAiHwAAIx8AACQfAAAlHwAAJh8AACcfAAA4HwAAOR8AADofAAA7HwAAPB8AAD0fAAA+HwAAPx8AADAfAAAxHwAAMh8AADMfAAA0HwAANR8AADYfAAA3HwAASB8AAEkfAABKHwAASx8AAEwfAABNHwAAQB8AAEEfAABCHwAAQx8AAEQfAABFHwAAWR8AAFsfAABdHwAAXx8AAFEfAABTHwAAVR8AAFcfAABoHwAAaR8AAGofAABrHwAAbB8AAG0fAABuHwAAbx8AAGAfAABhHwAAYh8AAGMfAABkHwAAZR8AAGYfAABnHwAAuh8AALsfAADIHwAAyR8AAMofAADLHwAA2h8AANsfAAD4HwAA+R8AAOofAADrHwAA+h8AAPsfAACIHwAAiR8AAIofAACLHwAAjB8AAI0fAACOHwAAjx8AAIAfAACBHwAAgh8AAIMfAACEHwAAhR8AAIYfAACHHwAAmB8AAJkfAACaHwAAmx8AAJwfAACdHwAAnh8AAJ8fAACQHwAAkR8AAJIfAACTHwAAlB8AAJUfAACWHwAAlx8AAKgfAACpHwAAqh8AAKsfAACsHwAArR8AAK4fAACvHwAAoB8AAKEfAACiHwAAox8AAKQfAAClHwAAph8AAKcfAAC4HwAAuR8AALwfAACwHwAAsR8AAHAfAABxHwAAsx8AAEUDAACZAwAAuQMAAMwfAAByHwAAcx8AAHQfAAB1HwAAwx8AANgfAADZHwAA0B8AANEfAAB2HwAAdx8AAOgfAADpHwAA7B8AAOAfAADhHwAAeh8AAHsfAADlHwAA/B8AAHgfAAB5HwAAfB8AAH0fAADzHwAAqQMAAMkDAABLAAAAawAAAMUAAADlAAAATiEAADIhAABwIQAAcSEAAHIhAABzIQAAdCEAAHUhAAB2IQAAdyEAAHghAAB5IQAAeiEAAHshAAB8IQAAfSEAAH4hAAB/IQAAYCEAAGEhAABiIQAAYyEAAGQhAABlIQAAZiEAAGchAABoIQAAaSEAAGohAABrIQAAbCEAAG0hAABuIQAAbyEAAIQhAACDIQAA0CQAANEkAADSJAAA0yQAANQkAADVJAAA1iQAANckAADYJAAA2SQAANokAADbJAAA3CQAAN0kAADeJAAA3yQAAOAkAADhJAAA4iQAAOMkAADkJAAA5SQAAOYkAADnJAAA6CQAAOkkAAC2JAAAtyQAALgkAAC5JAAAuiQAALskAAC8JAAAvSQAAL4kAAC/JAAAwCQAAMEkAADCJAAAwyQAAMQkAADFJAAAxiQAAMckAADIJAAAySQAAMokAADLJAAAzCQAAM0kAADOJAAAzyQAADAsAAAxLAAAMiwAADMsAAA0LAAANSwAADYsAAA3LAAAOCwAADksAAA6LAAAOywAADwsAAA9LAAAPiwAAD8sAABALAAAQSwAAEIsAABDLAAARCwAAEUsAABGLAAARywAAEgsAABJLAAASiwAAEssAABMLAAATSwAAE4sAABPLAAAUCwAAFEsAABSLAAAUywAAFQsAABVLAAAViwAAFcsAABYLAAAWSwAAFosAABbLAAAXCwAAF0sAABeLAAAXywAAAAsAAABLAAAAiwAAAMsAAAELAAABSwAAAYsAAAHLAAACCwAAAksAAAKLAAACywAAAwsAAANLAAADiwAAA8sAAAQLAAAESwAABIsAAATLAAAFCwAABUsAAAWLAAAFywAABgsAAAZLAAAGiwAABssAAAcLAAAHSwAAB4sAAAfLAAAICwAACEsAAAiLAAAIywAACQsAAAlLAAAJiwAACcsAAAoLAAAKSwAACosAAArLAAALCwAAC0sAAAuLAAALywAAGEsAABgLAAAawIAAH0dAAB9AgAAOgIAAD4CAABoLAAAZywAAGosAABpLAAAbCwAAGssAABRAgAAcQIAAFACAABSAgAAcywAAHIsAAB2LAAAdSwAAD8CAABAAgAAgSwAAIAsAACDLAAAgiwAAIUsAACELAAAhywAAIYsAACJLAAAiCwAAIssAACKLAAAjSwAAIwsAACPLAAAjiwAAJEsAACQLAAAkywAAJIsAACVLAAAlCwAAJcsAACWLAAAmSwAAJgsAACbLAAAmiwAAJ0sAACcLAAAnywAAJ4sAAChLAAAoCwAAKMsAACiLAAApSwAAKQsAACnLAAApiwAAKksAACoLAAAqywAAKosAACtLAAArCwAAK8sAACuLAAAsSwAALAsAACzLAAAsiwAALUsAAC0LAAAtywAALYsAAC5LAAAuCwAALssAAC6LAAAvSwAALwsAAC/LAAAviwAAMEsAADALAAAwywAAMIsAADFLAAAxCwAAMcsAADGLAAAySwAAMgsAADLLAAAyiwAAM0sAADMLAAAzywAAM4sAADRLAAA0CwAANMsAADSLAAA1SwAANQsAADXLAAA1iwAANksAADYLAAA2ywAANosAADdLAAA3CwAAN8sAADeLAAA4SwAAOAsAADjLAAA4iwAAOwsAADrLAAA7iwAAO0sAADzLAAA8iwAAKAQAAChEAAAohAAAKMQAACkEAAApRAAAKYQAACnEAAAqBAAAKkQAACqEAAAqxAAAKwQAACtEAAArhAAAK8QAACwEAAAsRAAALIQAACzEAAAtBAAALUQAAC2EAAAtxAAALgQAAC5EAAAuhAAALsQAAC8EAAAvRAAAL4QAAC/EAAAwBAAAMEQAADCEAAAwxAAAMQQAADFEAAAxxAAAM0QAABBpgAAQKYAAEOmAABCpgAARaYAAESmAABHpgAARqYAAEmmAABIpgAAiBwAAEumAACIHAAASqYAAE2mAABMpgAAT6YAAE6mAABRpgAAUKYAAFOmAABSpgAAVaYAAFSmAABXpgAAVqYAAFmmAABYpgAAW6YAAFqmAABdpgAAXKYAAF+mAABepgAAYaYAAGCmAABjpgAAYqYAAGWmAABkpgAAZ6YAAGamAABppgAAaKYAAGumAABqpgAAbaYAAGymAACBpgAAgKYAAIOmAACCpgAAhaYAAISmAACHpgAAhqYAAImmAACIpgAAi6YAAIqmAACNpgAAjKYAAI+mAACOpgAAkaYAAJCmAACTpgAAkqYAAJWmAACUpgAAl6YAAJamAACZpgAAmKYAAJumAACapgAAI6cAACKnAAAlpwAAJKcAACenAAAmpwAAKacAACinAAArpwAAKqcAAC2nAAAspwAAL6cAAC6nAAAzpwAAMqcAADWnAAA0pwAAN6cAADanAAA5pwAAOKcAADunAAA6pwAAPacAADynAAA/pwAAPqcAAEGnAABApwAAQ6cAAEKnAABFpwAARKcAAEenAABGpwAASacAAEinAABLpwAASqcAAE2nAABMpwAAT6cAAE6nAABRpwAAUKcAAFOnAABSpwAAVacAAFSnAABXpwAAVqcAAFmnAABYpwAAW6cAAFqnAABdpwAAXKcAAF+nAABepwAAYacAAGCnAABjpwAAYqcAAGWnAABkpwAAZ6cAAGanAABppwAAaKcAAGunAABqpwAAbacAAGynAABvpwAAbqcAAHqnAAB5pwAAfKcAAHunAAB5HQAAf6cAAH6nAACBpwAAgKcAAIOnAACCpwAAhacAAISnAACHpwAAhqcAAIynAACLpwAAZQIAAJGnAACQpwAAk6cAAJKnAADEpwAAl6cAAJanAACZpwAAmKcAAJunAACapwAAnacAAJynAACfpwAAnqcAAKGnAACgpwAAo6cAAKKnAAClpwAApKcAAKenAACmpwAAqacAAKinAABmAgAAXAIAAGECAABsAgAAagIAAJ4CAACHAgAAnQIAAFOrAAC1pwAAtKcAALenAAC2pwAAuacAALinAAC7pwAAuqcAAL2nAAC8pwAAv6cAAL6nAADBpwAAwKcAAMOnAADCpwAAlKcAAIICAACOHQAAyKcAAMenAADKpwAAyacAANGnAADQpwAA16cAANanAADZpwAA2KcAAPanAAD1pwAAs6cAAKATAAChEwAAohMAAKMTAACkEwAApRMAAKYTAACnEwAAqBMAAKkTAACqEwAAqxMAAKwTAACtEwAArhMAAK8TAACwEwAAsRMAALITAACzEwAAtBMAALUTAAC2EwAAtxMAALgTAAC5EwAAuhMAALsTAAC8EwAAvRMAAL4TAAC/EwAAwBMAAMETAADCEwAAwxMAAMQTAADFEwAAxhMAAMcTAADIEwAAyRMAAMoTAADLEwAAzBMAAM0TAADOEwAAzxMAANATAADREwAA0hMAANMTAADUEwAA1RMAANYTAADXEwAA2BMAANkTAADaEwAA2xMAANwTAADdEwAA3hMAAN8TAADgEwAA4RMAAOITAADjEwAA5BMAAOUTAADmEwAA5xMAAOgTAADpEwAA6hMAAOsTAADsEwAA7RMAAO4TAADvEwAAQf8AAEL/AABD/wAARP8AAEX/AABG/wAAR/8AAEj/AABJ/wAASv8AAEv/AABM/wAATf8AAE7/AABP/wAAUP8AAFH/AABS/wAAU/8AAFT/AABV/wAAVv8AAFf/AABY/wAAWf8AAFr/AAAh/wAAIv8AACP/AAAk/wAAJf8AACb/AAAn/wAAKP8AACn/AAAq/wAAK/8AACz/AAAt/wAALv8AAC//AAAw/wAAMf8AADL/AAAz/wAANP8AADX/AAA2/wAAN/8AADj/AAA5/wAAOv8AACgEAQApBAEAKgQBACsEAQAsBAEALQQBAC4EAQAvBAEAMAQBADEEAQAyBAEAMwQBADQEAQA1BAEANgQBADcEAQA4BAEAOQQBADoEAQA7BAEAPAQBAD0EAQA+BAEAPwQBAEAEAQBBBAEAQgQBAEMEAQBEBAEARQQBAEYEAQBHBAEASAQBAEkEAQBKBAEASwQBAEwEAQBNBAEATgQBAE8EAQAABAEAAQQBAAIEAQADBAEABAQBAAUEAQAGBAEABwQBAAgEAQAJBAEACgQBAAsEAQAMBAEADQQBAA4EAQAPBAEAEAQBABEEAQASBAEAEwQBABQEAQAVBAEAFgQBABcEAQAYBAEAGQQBABoEAQAbBAEAHAQBAB0EAQAeBAEAHwQBACAEAQAhBAEAIgQBACMEAQAkBAEAJQQBACYEAQAnBAEA2AQBANkEAQDaBAEA2wQBANwEAQDdBAEA3gQBAN8EAQDgBAEA4QQBAOIEAQDjBAEA5AQBAOUEAQDmBAEA5wQBAOgEAQDpBAEA6gQBAOsEAQDsBAEA7QQBAO4EAQDvBAEA8AQBAPEEAQDyBAEA8wQBAPQEAQD1BAEA9gQBAPcEAQD4BAEA+QQBAPoEAQD7BAEAsAQBALEEAQCyBAEAswQBALQEAQC1BAEAtgQBALcEAQC4BAEAuQQBALoEAQC7BAEAvAQBAL0EAQC+BAEAvwQBAMAEAQDBBAEAwgQBAMMEAQDEBAEAxQQBAMYEAQDHBAEAyAQBAMkEAQDKBAEAywQBAMwEAQDNBAEAzgQBAM8EAQDQBAEA0QQBANIEAQDTBAEAlwUBAJgFAQCZBQEAmgUBAJsFAQCcBQEAnQUBAJ4FAQCfBQEAoAUBAKEFAQCjBQEApAUBAKUFAQCmBQEApwUBAKgFAQCpBQEAqgUBAKsFAQCsBQEArQUBAK4FAQCvBQEAsAUBALEFAQCzBQEAtAUBALUFAQC2BQEAtwUBALgFAQC5BQEAuwUBALwFAQBwBQEAcQUBAHIFAQBzBQEAdAUBAHUFAQB2BQEAdwUBAHgFAQB5BQEAegUBAHwFAQB9BQEAfgUBAH8FAQCABQEAgQUBAIIFAQCDBQEAhAUBAIUFAQCGBQEAhwUBAIgFAQCJBQEAigUBAIwFAQCNBQEAjgUBAI8FAQCQBQEAkQUBAJIFAQCUBQEAlQUBAMAMAQDBDAEAwgwBAMMMAQDEDAEAxQwBAMYMAQDHDAEAyAwBAMkMAQDKDAEAywwBAMwMAQDNDAEAzgwBAM8MAQDQDAEA0QwBANIMAQDTDAEA1AwBANUMAQDWDAEA1wwBANgMAQDZDAEA2gwBANsMAQDcDAEA3QwBAN4MAQDfDAEA4AwBAOEMAQDiDAEA4wwBAOQMAQDlDAEA5gwBAOcMAQDoDAEA6QwBAOoMAQDrDAEA7AwBAO0MAQDuDAEA7wwBAPAMAQDxDAEA8gwBAIAMAQCBDAEAggwBAIMMAQCEDAEAhQwBAIYMAQCHDAEAiAwBAIkMAQCKDAEAiwwBAIwMAQCNDAEAjgwBAI8MAQCQDAEAkQwBAJIMAQCTDAEAlAwBAJUMAQCWDAEAlwwBAJgMAQCZDAEAmgwBAJsMAQCcDAEAnQwBAJ4MAQCfDAEAoAwBAKEMAQCiDAEAowwBAKQMAQClDAEApgwBAKcMAQCoDAEAqQwBAKoMAQCrDAEArAwBAK0MAQCuDAEArwwBALAMAQCxDAEAsgwBAMAYAQDBGAEAwhgBAMMYAQDEGAEAxRgBAMYYAQDHGAEAyBgBAMkYAQDKGAEAyxgBAMwYAQDNGAEAzhgBAM8YAQDQGAEA0RgBANIYAQDTGAEA1BgBANUYAQDWGAEA1xgBANgYAQDZGAEA2hgBANsYAQDcGAEA3RgBAN4YAQDfGAEAoBgBAKEYAQCiGAEAoxgBAKQYAQClGAEAphgBAKcYAQCoGAEAqRgBAKoYAQCrGAEArBgBAK0YAQCuGAEArxgBALAYAQCxGAEAshgBALMYAQC0GAEAtRgBALYYAQC3GAEAuBgBALkYAQC6GAEAuxgBALwYAQC9GAEAvhgBAL8YAQBgbgEAYW4BAGJuAQBjbgEAZG4BAGVuAQBmbgEAZ24BAGhuAQBpbgEAam4BAGtuAQBsbgEAbW4BAG5uAQBvbgEAcG4BAHFuAQBybgEAc24BAHRuAQB1bgEAdm4BAHduAQB4bgEAeW4BAHpuAQB7bgEAfG4BAH1uAQB+bgEAf24BAEBuAQBBbgEAQm4BAENuAQBEbgEARW4BAEZuAQBHbgEASG4BAEluAQBKbgEAS24BAExuAQBNbgEATm4BAE9uAQBQbgEAUW4BAFJuAQBTbgEAVG4BAFVuAQBWbgEAV24BAFhuAQBZbgEAWm4BAFtuAQBcbgEAXW4BAF5uAQBfbgEAIukBACPpAQAk6QEAJekBACbpAQAn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AQAAyGchAAEAAABeAQAAzGchAAEAAABfAQAA0GchAAEAAABgAQAA1GchAAEAAABhAQAA2GchAAEAAABiAQAA3GchAAEAAABjAQAA4GchAAEAAABkAQAA5GchAAEAAABlAQAA6GchAAEAAABmAQAA7GchAAEAAABnAQAA8GchAAEAAABoAQAA9GchAAEAAABpAQAA+GchAAEAAABqAQAA/GchAAEAAABrAQAAAGghAAEAAABsAQAABGghAAEAAABtAQAACGghAAEAAABuAQAADGghAAEAAABvAQAAEGghAAEAAABwAQAAFGghAAEAAABxAQAAGGghAAEAAAByAQAAHGghAAEAAABzAQAAIGghAAEAAAB0AQAAJGghAAEAAAB1AQAAKGghAAEAAAB2AQAALGghAAEAAAB3AQAAMGghAAEAAAB4AQAANGghAAEAAAB5AQAAOGghAAEAAAB6AQAAPGghAAEAAAB7AQAAQGghAAEAAAB8AQAARGghAAEAAAB9AQAASGghAAEAAAB+AQAATGghAAEAAAB/AQAAUGghAAIAAACAAQAAWGghAAEAAACBAQAAXGghAAEAAACCAQAAYGghAAEAAACDAQAAZGghAAEAAACEAQAAaGghAAEAAACFAQAAbGghAAEAAACGAQAAcGghAAEAAACHAQAAdGghAAEAAACIAQAAeGghAAEAAACJAQAAfGghAAEAAACKAQAAgGghAAEAAACLAQAAhGghAAEAAACMAQAAiGghAAEAAACOAQAAjGghAAEAAACPAQAAkGghAAEAAACQAQAAlGghAAEAAACRAQAAmGghAAEAAACSAQAAnGghAAEAAACTAQAAoGghAAEAAACUAQAApGghAAEAAACVAQAAqGghAAEAAACWAQAArGghAAEAAACXAQAAsGghAAEAAACYAQAAtGghAAEAAACZAQAAuGghAAEAAACaAQAAvGghAAEAAACcAQAAwGghAAEAAACdAQAAxGghAAEAAACeAQAAyGghAAEAAACfAQAAzGghAAEAAACgAQAA0GghAAEAAAChAQAA1GghAAEAAACiAQAA2GghAAEAAACjAQAA3GghAAEAAACkAQAA4GghAAEAAAClAQAA5GghAAEAAACmAQAA6GghAAEAAACnAQAA7GghAAEAAACoAQAA8GghAAEAAACpAQAA9GghAAEAAACsAQAA+GghAAEAAACtAQAA/GghAAEAAACuAQAAAGkhAAEAAACvAQAABGkhAAEAAACwAQAACGkhAAEAAACxAQAADGkhAAEAAACyAQAAEGkhAAEAAACzAQAAFGkhAAEAAAC0AQAAGGkhAAEAAAC1AQAAHGkhAAEAAAC2AQAAIGkhAAEAAAC3AQAAJGkhAAEAAAC4AQAAKGkhAAEAAAC5AQAALGkhAAEAAAC8AQAAMGkhAAEAAAC9AQAANGkhAAEAAAC/AQAAOGkhAAEAAADEAQAAPGkhAAIAAADFAQAARGkhAAIAAADGAQAATGkhAAIAAADHAQAAVGkhAAIAAADIAQAAXGkhAAIAAADJAQAAZGkhAAIAAADKAQAAbGkhAAIAAADLAQAAdGkhAAIAAADMAQAAfGkhAAIAAADNAQAAhGkhAAEAAADOAQAAiGkhAAEAAADPAQAAjGkhAAEAAADQAQAAkGkhAAEAAADRAQAAlGkhAAEAAADSAQAAmGkhAAEAAADTAQAAnGkhAAEAAADUAQAAoGkhAAEAAADVAQAApGkhAAEAAADWAQAAqGkhAAEAAADXAQAArGkhAAEAAADYAQAAsGkhAAEAAADZAQAAtGkhAAEAAADaAQAAuGkhAAEAAADbAQAAvGkhAAEAAADcAQAAwGkhAAEAAADdAQAAxGkhAAEAAADeAQAAyGkhAAEAAADfAQAAzGkhAAEAAADgAQAA0GkhAAEAAADhAQAA1GkhAAEAAADiAQAA2GkhAAEAAADjAQAA3GkhAAEAAADkAQAA4GkhAAEAAADlAQAA5GkhAAEAAADmAQAA6GkhAAEAAADnAQAA7GkhAAEAAADoAQAA8GkhAAEAAADpAQAA9GkhAAEAAADqAQAA+GkhAAEAAADrAQAA/GkhAAEAAADsAQAAAGohAAEAAADtAQAABGohAAEAAADuAQAACGohAAEAAADvAQAADGohAAEAAADxAQAAEGohAAIAAADyAQAAGGohAAIAAADzAQAAIGohAAIAAAD0AQAAKGohAAEAAAD1AQAALGohAAEAAAD2AQAAMGohAAEAAAD3AQAANGohAAEAAAD4AQAAOGohAAEAAAD5AQAAPGohAAEAAAD6AQAAQGohAAEAAAD7AQAARGohAAEAAAD8AQAASGohAAEAAAD9AQAATGohAAEAAAD+AQAAUGohAAEAAAD/AQAAVGohAAEAAAAAAgAAWGohAAEAAAABAgAAXGohAAEAAAACAgAAYGohAAEAAAADAgAAZGohAAEAAAAEAgAAaGohAAEAAAAFAgAAbGohAAEAAAAGAgAAcGohAAEAAAAHAgAAdGohAAEAAAAIAgAAeGohAAEAAAAJAgAAfGohAAEAAAAKAgAAgGohAAEAAAALAgAAhGohAAEAAAAMAgAAiGohAAEAAAANAgAAjGohAAEAAAAOAgAAkGohAAEAAAAPAgAAlGohAAEAAAAQAgAAmGohAAEAAAARAgAAnGohAAEAAAASAgAAoGohAAEAAAATAgAApGohAAEAAAAUAgAAqGohAAEAAAAVAgAArGohAAEAAAAWAgAAsGohAAEAAAAXAgAAtGohAAEAAAAYAgAAuGohAAEAAAAZAgAAvGohAAEAAAAaAgAAwGohAAEAAAAbAgAAxGohAAEAAAAcAgAAyGohAAEAAAAdAgAAzGohAAEAAAAeAgAA0GohAAEAAAAfAgAA1GohAAEAAAAgAgAA2GohAAEAAAAiAgAA3GohAAEAAAAjAgAA4GohAAEAAAAkAgAA5GohAAEAAAAlAgAA6GohAAEAAAAmAgAA7GohAAEAAAAnAgAA8GohAAEAAAAoAgAA9GohAAEAAAApAgAA+GohAAEAAAAqAgAA/GohAAEAAAArAgAAAGshAAEAAAAsAgAABGshAAEAAAAtAgAACGshAAEAAAAuAgAADGshAAEAAAAvAgAAEGshAAEAAAAwAgAAFGshAAEAAAAxAgAAGGshAAEAAAAyAgAAHGshAAEAAAAzAgAAIGshAAEAAAA6AgAAJGshAAEAAAA7AgAAKGshAAEAAAA8AgAALGshAAEAAAA9AgAAMGshAAEAAAA+AgAANGshAAEAAAA/AgAAOGshAAEAAABAAgAAPGshAAEAAABBAgAAQGshAAEAAABCAgAARGshAAEAAABDAgAASGshAAEAAABEAgAATGshAAEAAABFAgAAUGshAAEAAABGAgAAVGshAAEAAABHAgAAWGshAAEAAABIAgAAXGshAAEAAABJAgAAYGshAAEAAABKAgAAZGshAAEAAABLAgAAaGshAAEAAABMAgAAbGshAAEAAABNAgAAcGshAAEAAABOAgAAdGshAAEAAABPAgAAeGshAAEAAABQAgAAfGshAAEAAABRAgAAgGshAAEAAABSAgAAhGshAAEAAABTAgAAiGshAAEAAABUAgAAjGshAAEAAABWAgAAkGshAAEAAABXAgAAlGshAAEAAABZAgAAmGshAAEAAABbAgAAnGshAAEAAABcAgAAoGshAAEAAABgAgAApGshAAEAAABhAgAAqGshAAEAAABjAgAArGshAAEAAABlAgAAsGshAAEAAABmAgAAtGshAAEAAABoAgAAuGshAAEAAABpAgAAvGshAAEAAABqAgAAwGshAAEAAABrAgAAxGshAAEAAABsAgAAyGshAAEAAABvAgAAzGshAAEAAABxAgAA0GshAAEAAAByAgAA1GshAAEAAAB1AgAA2GshAAEAAAB9AgAA3GshAAEAAACAAgAA4GshAAEAAACCAgAA5GshAAEAAACDAgAA6GshAAEAAACHAgAA7GshAAEAAACIAgAA8GshAAEAAACJAgAA9GshAAEAAACKAgAA+GshAAEAAACLAgAA/GshAAEAAACMAgAAAGwhAAEAAACSAgAABGwhAAEAAACdAgAACGwhAAEAAACeAgAADGwhAAEAAABFAwAAEGwhAAMAAABwAwAAHGwhAAEAAABxAwAAIGwhAAEAAAByAwAAJGwhAAEAAABzAwAAKGwhAAEAAAB2AwAALGwhAAEAAAB3AwAAMGwhAAEAAAB7AwAANGwhAAEAAAB8AwAAOGwhAAEAAAB9AwAAPGwhAAEAAAB/AwAAQGwhAAEAAACGAwAARGwhAAEAAACIAwAASGwhAAEAAACJAwAATGwhAAEAAACKAwAAUGwhAAEAAACMAwAAVGwhAAEAAACOAwAAWGwhAAEAAACPAwAAXGwhAAEAAACRAwAAYGwhAAEAAACSAwAAZGwhAAIAAACTAwAAbGwhAAEAAACUAwAAcGwhAAEAAACVAwAAdGwhAAIAAACWAwAAfGwhAAEAAACXAwAAgGwhAAEAAACYAwAAhGwhAAMAAACZAwAAkGwhAAMAAACaAwAAnGwhAAIAAACbAwAApGwhAAEAAACcAwAAqGwhAAIAAACdAwAAsGwhAAEAAACeAwAAtGwhAAEAAACfAwAAuGwhAAEAAACgAwAAvGwhAAIAAAChAwAAxGwhAAIAAACjAwAAzGwhAAIAAACkAwAA1GwhAAEAAAClAwAA2GwhAAEAAACmAwAA3GwhAAIAAACn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EwAA6HYhAAEAAADcEwAA7HYhAAEAAADdEwAA8HYhAAEAAADeEwAA9HYhAAEAAADfEwAA+HYhAAEAAADgEwAA/HYhAAEAAADhEwAAAHchAAEAAADiEwAABHchAAEAAADjEwAACHchAAEAAADkEwAADHchAAEAAADlEwAAEHchAAEAAADmEwAAFHchAAEAAADnEwAAGHchAAEAAADoEwAAHHchAAEAAADpEwAAIHchAAEAAADqEwAAJHchAAEAAADrEwAAKHchAAEAAADsEwAALHchAAEAAADtEwAAMHchAAEAAADuEwAANHchAAEAAADvEwAAOHchAAEAAADwEwAAPHchAAEAAADxEwAAQHchAAEAAADyEwAARHchAAEAAADzEwAASHchAAEAAAD0EwAATHchAAEAAAD1EwAAUHchAAEAAAD4EwAAVHchAAEAAAD5EwAAWHchAAEAAAD6EwAAXHchAAEAAAD7EwAAYHchAAEAAAD8EwAAZHchAAEAAAD9EwAAaHchAAEAAACAHAAAbHchAAIAAACBHAAAdHchAAIAAACCHAAAfHchAAIAAACDHAAAhHchAAIAAACEHAAAjHchAAMAAACFHAAAmHchAAMAAACGHAAApHchAAIAAACHHAAArHchAAIAAACIHAAAtHchAAIAAACQHAAAvHchAAEAAACRHAAAwHchAAEAAACSHAAAxHchAAEAAACTHAAAyHchAAEAAACUHAAAzHchAAEAAACVHAAA0HchAAEAAACWHAAA1HchAAEAAACXHAAA2HchAAEAAACYHAAA3HchAAEAAACZHAAA4HchAAEAAACaHAAA5HchAAEAAACbHAAA6HchAAEAAACcHAAA7HchAAEAAACdHAAA8HchAAEAAACeHAAA9HchAAEAAACfHAAA+HchAAEAAACgHAAA/HchAAEAAAChHAAAAHghAAEAAACiHAAABHghAAEAAACjHAAACHghAAEAAACkHAAADHghAAEAAAClHAAAEHghAAEAAACmHAAAFHghAAEAAACnHAAAGHghAAEAAACoHAAAHHghAAEAAACpHAAAIHghAAEAAACqHAAAJHghAAEAAACrHAAAKHghAAEAAACsHAAALHghAAEAAACtHAAAMHghAAEAAACuHAAANHghAAEAAACvHAAAOHghAAEAAACwHAAAPHghAAEAAACx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HgAAoHohAAEAAACHHgAApHohAAEAAACIHgAAqHohAAEAAACJHgAArHohAAEAAACKHgAAsHohAAEAAACLHgAAtHohAAEAAACMHgAAuHohAAEAAACNHgAAvHohAAEAAACOHgAAwHohAAEAAACPHgAAxHohAAEAAACQHgAAyHohAAEAAACRHgAAzHohAAEAAACSHgAA0HohAAEAAACTHgAA1HohAAEAAACUHgAA2HohAAEAAACVHgAA3HohAAEAAACbHgAA4HohAAIAAACeHgAA6HohAAEAAACgHgAA7HohAAEAAAChHgAA8HohAAEAAACiHgAA9HohAAEAAACjHgAA+HohAAEAAACkHgAA/HohAAEAAAClHgAAAHshAAEAAACmHgAABHshAAEAAACnHgAACHshAAEAAACoHgAADHshAAEAAACpHgAAEHshAAEAAACqHgAAFHshAAEAAACrHgAAGHshAAEAAACsHgAAHHshAAEAAACtHgAAIHshAAEAAACuHgAAJHshAAEAAACvHgAAKHshAAEAAACwHgAALHshAAEAAACxHgAAMHshAAEAAACyHgAANHshAAEAAACzHgAAOHshAAEAAAC0HgAAPHshAAEAAAC1HgAAQHshAAEAAAC2HgAARHshAAEAAAC3HgAASHshAAEAAAC4HgAATHshAAEAAAC5HgAAUHshAAEAAAC6HgAAVHshAAEAAAC7HgAAWHshAAEAAAC8HgAAXHshAAEAAAC9HgAAYHshAAEAAAC+HgAAZHshAAEAAAC/HgAAaHshAAEAAADAHgAAbHshAAEAAADBHgAAcHshAAEAAADCHgAAdHshAAEAAADDHgAAeHshAAEAAADEHgAAfHshAAEAAADFHgAAgHshAAEAAADGHgAAhHshAAEAAADHHgAAiHshAAEAAADIHgAAjHshAAEAAADJHgAAkHshAAEAAADKHgAAlHshAAEAAADLHgAAmHshAAEAAADMHgAAnHshAAEAAADNHgAAoHshAAEAAADOHgAApHshAAEAAADPHgAAqHshAAEAAADQHgAArHshAAEAAADRHgAAsHshAAEAAADSHgAAtHshAAEAAADTHgAAuHshAAEAAADUHgAAvHshAAEAAADVHgAAwHshAAEAAADWHgAAxHshAAEAAADXHgAAyHshAAEAAADYHgAAzHshAAEAAADZ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pwAAeIYhAAEAAAAypwAAfIYhAAEAAAAzpwAAgIYhAAEAAAA0pwAAhIYhAAEAAAA1pwAAiIYhAAEAAAA2pwAAjIYhAAEAAAA3pwAAkIYhAAEAAAA4pwAAlIYhAAEAAAA5pwAAmIYhAAEAAAA6pwAAnIYhAAEAAAA7pwAAoIYhAAEAAAA8pwAApIYhAAEAAAA9pwAAqIYhAAEAAAA+pwAArIYhAAEAAAA/pwAAsIYhAAEAAABApwAAtIYhAAEAAABBpwAAuIYhAAEAAABCpwAAvIYhAAEAAABDpwAAwIYhAAEAAABEpwAAxIYhAAEAAABFpwAAyIYhAAEAAABGpwAAzIYhAAEAAABHpwAA0IYhAAEAAABIpwAA1IYhAAEAAABJpwAA2IYhAAEAAABKpwAA3IYhAAEAAABLpwAA4IYhAAEAAABMpwAA5IYhAAEAAABNpwAA6IYhAAEAAABOpwAA7IYhAAEAAABPpwAA8IYhAAEAAABQpwAA9IYhAAEAAABRpwAA+IYhAAEAAABSpwAA/IYhAAEAAABTpwAAAIchAAEAAABUpwAABIchAAEAAABVpwAACIchAAEAAABWpwAADIchAAEAAABXpwAAEIchAAEAAABYpwAAFIchAAEAAABZpwAAGIchAAEAAABapwAAHIchAAEAAABbpwAAIIchAAEAAABcpwAAJIchAAEAAABdpwAAKIchAAEAAABepwAALIchAAEAAABfpwAAMIchAAEAAABgpwAANIchAAEAAABhpwAAOIchAAEAAABipwAAPIchAAEAAABjpwAAQIchAAEAAABkpwAARIchAAEAAABlpwAASIchAAEAAABmpwAATIchAAEAAABnpwAAUIchAAEAAABopwAAVIchAAEAAABppwAAWIchAAEAAABqpwAAXIchAAEAAABrpwAAYIchAAEAAABspwAAZIchAAEAAABtpwAAaIchAAEAAABupwAAbIchAAEAAABvpwAAcIchAAEAAAB5pwAAdIchAAEAAAB6pwAAeIchAAEAAAB7pwAAfIchAAEAAAB8pwAAgIchAAEAAAB9pwAAhIchAAEAAAB+pwAAiIchAAEAAAB/pwAAjIchAAEAAACApwAAkIchAAEAAACBpwAAlIchAAEAAACCpwAAmIchAAEAAACDpwAAnIchAAEAAACEpwAAoIchAAEAAACFpwAApIchAAEAAACGpwAAqIchAAEAAACHpwAArIchAAEAAACLpwAAsIchAAEAAACMpwAAtIchAAEAAACNpwAAuIchAAEAAACQpwAAvIchAAEAAACRpwAAwIchAAEAAACSpwAAxIchAAEAAACTpwAAyIchAAEAAACUpwAAzIchAAEAAACWpwAA0IchAAEAAACXpwAA1IchAAEAAACYpwAA2IchAAEAAACZpwAA3IchAAEAAACapwAA4IchAAEAAACbpwAA5IchAAEAAACcpwAA6IchAAEAAACdpwAA7IchAAEAAACepwAA8IchAAEAAACfpwAA9IchAAEAAACgpwAA+IchAAEAAAChpwAA/IchAAEAAACipwAAAIghAAEAAACjpwAABIghAAEAAACkpwAACIghAAEAAAClpwAADIghAAEAAACmpwAAEIghAAEAAACnpwAAFIghAAEAAACopwAAGIghAAEAAACppwAAHIghAAEAAACqpwAAIIghAAEAAACrpwAAJIghAAEAAACspwAAKIghAAEAAACtpwAALIghAAEAAACupwAAMIghAAEAAACwpwAANIghAAEAAACxpwAAOIghAAEAAACypwAAPIghAAEAAACzpwAAQIghAAEAAAC0pwAARIghAAEAAAC1pwAASIghAAEAAAC2pwAATIghAAEAAAC3pwAAUIghAAEAAAC4pwAAVIghAAEAAAC5pwAAWIghAAEAAAC6pwAAXIghAAEAAAC7pwAAYIghAAEAAAC8pwAAZIghAAEAAAC9pwAAaIghAAEAAAC+pwAAbIghAAEAAAC/pwAAcIghAAEAAADApwAAdIghAAEAAADBpwAAeIghAAEAAADCpwAAfIghAAEAAADDpwAAgIghAAEAAADEpwAAhIghAAEAAADFpwAAiIghAAEAAADGpwAAjIghAAEAAADHpwAAkIghAAEAAADIpwAAlIghAAEAAADJpwAAmIghAAEAAADKpwAAnIghAAEAAADQpwAAoIghAAEAAADRpwAApIghAAEAAADWpwAAqIghAAEAAADXpwAArIghAAEAAADYpwAAsIghAAEAAADZpwAAtIghAAEAAAD1pwAAuIghAAEAAAD2pwAAvIghAAEAAABTqwAAwIghAAEAAABwqwAAxIghAAEAAABxqwAAyIghAAEAAAByqwAAzIghAAEAAABzqwAA0IghAAEAAAB0qwAA1IghAAEAAAB1qwAA2IghAAEAAAB2qwAA3IghAAEAAAB3qwAA4IghAAEAAAB4qwAA5IghAAEAAAB5qwAA6IghAAEAAAB6qwAA7IghAAEAAAB7qwAA8IghAAEAAAB8qwAA9IghAAEAAAB9qwAA+IghAAEAAAB+qwAA/IghAAEAAAB/qwAAAIkhAAEAAACAqwAABIkhAAEAAACBqwAACIkhAAEAAACCqwAADIkhAAEAAACDqwAAEIkhAAEAAACEqwAAFIkhAAEAAACFqwAAGIkhAAEAAACGqwAAHIkhAAEAAACHqwAAIIkhAAEAAACIqwAAJIkhAAEAAACJqwAAKIkhAAEAAACKqwAALIkhAAEAAACLqwAAMIkhAAEAAACMqwAANIkhAAEAAACNqwAAOIkhAAEAAACOqwAAPIkhAAEAAACPqwAAQIkhAAEAAACQqwAARIkhAAEAAACRqwAASIkhAAEAAACSqwAATIkhAAEAAACTqwAAUIkhAAEAAACUqwAAVIkhAAEAAACVqwAAWIkhAAEAAACWqwAAXIkhAAEAAACXqwAAYIkhAAEAAACYqwAAZIkhAAEAAACZqwAAaIkhAAEAAACaqwAAbIkhAAEAAACbqwAAcIkhAAEAAACcqwAAdIkhAAEAAACdqwAAeIkhAAEAAACeqwAAfIkhAAEAAACfqwAAgIkhAAEAAACgqwAAhIkhAAEAAAChqwAAiIkhAAEAAACiqwAAjIkhAAEAAACjqwAAkIkhAAEAAACkqwAAlIkhAAEAAAClqwAAmIkhAAEAAACmqwAAnIkhAAEAAACnqwAAoIkhAAEAAACoqwAApIkhAAEAAACpqwAAqIkhAAEAAACqqwAArIkhAAEAAACrqwAAsIkhAAEAAACsqwAAtIkhAAEAAACtqwAAuIkhAAEAAACuqwAAvIkhAAEAAACvqwAAwIkhAAEAAACwqwAAxIkhAAEAAACxqwAAyIkhAAEAAACyqwAAzIkhAAEAAACzqwAA0IkhAAEAAAC0qwAA1IkhAAEAAAC1qwAA2IkhAAEAAAC2qwAA3IkhAAEAAAC3qwAA4IkhAAEAAAC4qwAA5IkhAAEAAAC5qwAA6IkhAAEAAAC6qwAA7IkhAAEAAAC7qwAA8IkhAAEAAAC8qwAA9IkhAAEAAAC9qwAA+IkhAAEAAAC+qwAA/IkhAAEAAAC/qwAAAIohAAEAAAAh/wAABIohAAEAAAAi/wAACIohAAEAAAAj/wAADIohAAEAAAAk/wAAEIohAAEAAAAl/wAAFIohAAEAAAAm/wAAGIohAAEAAAAn/wAAHIohAAEAAAAo/wAAIIohAAEAAAAp/wAAJIohAAEAAAAq/wAAKIohAAEAAAAr/wAALIohAAEAAAAs/wAAMIohAAEAAAAt/wAANIohAAEAAAAu/wAAOIohAAEAAAAv/wAAPIohAAEAAAAw/wAAQIohAAEAAAAx/wAARIohAAEAAAAy/wAASIohAAEAAAAz/wAATIohAAEAAAA0/wAAUIohAAEAAAA1/wAAVIohAAEAAAA2/wAAWIohAAEAAAA3/wAAXIohAAEAAAA4/wAAYIohAAEAAAA5/wAAZIohAAEAAAA6/wAAaIohAAEAAABB/wAAbIohAAEAAABC/wAAcIohAAEAAABD/wAAdIohAAEAAABE/wAAeIohAAEAAABF/wAAfIohAAEAAABG/wAAgIohAAEAAABH/wAAhIohAAEAAABI/wAAiIohAAEAAABJ/wAAjIohAAEAAABK/wAAkIohAAEAAABL/wAAlIohAAEAAABM/wAAmIohAAEAAABN/wAAnIohAAEAAABO/wAAoIohAAEAAABP/wAApIohAAEAAABQ/wAAqIohAAEAAABR/wAArIohAAEAAABS/wAAsIohAAEAAABT/wAAtIohAAEAAABU/wAAuIohAAEAAABV/wAAvIohAAEAAABW/wAAwIohAAEAAABX/wAAxIohAAEAAABY/wAAyIohAAEAAABZ/wAAzIohAAEAAABa/wAA0IohAAEAAAAABAEA1IohAAEAAAABBAEA2IohAAEAAAACBAEA3IohAAEAAAADBAEA4IohAAEAAAAEBAEA5IohAAEAAAAFBAEA6IohAAEAAAAGBAEA7IohAAEAAAAHBAEA8IohAAEAAAAIBAEA9IohAAEAAAAJBAEA+IohAAEAAAAKBAEA/IohAAEAAAALBAEAAIshAAEAAAAMBAEABIshAAEAAAANBAEACIshAAEAAAAOBAEADIshAAEAAAAPBAEAEIshAAEAAAAQBAEAFIshAAEAAAARBAEAGIshAAEAAAASBAEAHIshAAEAAAATBAEAIIshAAEAAAAUBAEAJIshAAEAAAAVBAEAKIshAAEAAAAWBAEALIshAAEAAAAXBAEAMIshAAEAAAAYBAEANIshAAEAAAAZBAEAOIshAAEAAAAaBAEAPIshAAEAAAAbBAEAQIshAAEAAAAcBAEARIshAAEAAAAdBAEASIshAAEAAAAeBAEATIshAAEAAAAfBAEAUIshAAEAAAAgBAEAVIshAAEAAAAhBAEAWIshAAEAAAAiBAEAXIshAAEAAAAjBAEAYIshAAEAAAAkBAEAZIshAAEAAAAlBAEAaIshAAEAAAAmBAEAbIshAAEAAAAnBAEAcIshAAEAAAAoBAEAdIshAAEAAAApBAEAeIshAAEAAAAqBAEAfIshAAEAAAArBAEAgIshAAEAAAAsBAEAhIshAAEAAAAtBAEAiIshAAEAAAAuBAEAjIshAAEAAAAvBAEAkIshAAEAAAAwBAEAlIshAAEAAAAxBAEAmIshAAEAAAAyBAEAnIshAAEAAAAzBAEAoIshAAEAAAA0BAEApIshAAEAAAA1BAEAqIshAAEAAAA2BAEArIshAAEAAAA3BAEAsIshAAEAAAA4BAEAtIshAAEAAAA5BAEAuIshAAEAAAA6BAEAvIshAAEAAAA7BAEAwIshAAEAAAA8BAEAxIshAAEAAAA9BAEAyIshAAEAAAA+BAEAzIshAAEAAAA/BAEA0IshAAEAAABABAEA1IshAAEAAABBBAEA2IshAAEAAABCBAEA3IshAAEAAABDBAEA4IshAAEAAABEBAEA5IshAAEAAABFBAEA6IshAAEAAABGBAEA7IshAAEAAABHBAEA8IshAAEAAABIBAEA9IshAAEAAABJBAEA+IshAAEAAABKBAEA/IshAAEAAABLBAEAAIwhAAEAAABMBAEABIwhAAEAAABNBAEACIwhAAEAAABOBAEADIwhAAEAAABPBAEAEIwhAAEAAACwBAEAFIwhAAEAAACxBAEAGIwhAAEAAACyBAEAHIwhAAEAAACzBAEAIIwhAAEAAAC0BAEAJIwhAAEAAAC1BAEAKIwhAAEAAAC2BAEALIwhAAEAAAC3BAEAMIwhAAEAAAC4BAEANIwhAAEAAAC5BAEAOIwhAAEAAAC6BAEAPIwhAAEAAAC7BAEAQIwhAAEAAAC8BAEARIwhAAEAAAC9BAEASIwhAAEAAAC+BAEATIwhAAEAAAC/BAEAUIwhAAEAAADABAEAVIwhAAEAAADBBAEAWIwhAAEAAADCBAEAXIwhAAEAAADDBAEAYIwhAAEAAADEBAEAZIwhAAEAAADFBAEAaIwhAAEAAADGBAEAbIwhAAEAAADHBAEAcIwhAAEAAADIBAEAdIwhAAEAAADJBAEAeIwhAAEAAADKBAEAfIwhAAEAAADLBAEAgIwhAAEAAADMBAEAhIwhAAEAAADNBAEAiIwhAAEAAADOBAEAjIwhAAEAAADPBAEAkIwhAAEAAADQBAEAlIwhAAEAAADRBAEAmIwhAAEAAADSBAEAnIwhAAEAAADTBAEAoIwhAAEAAADYBAEApIwhAAEAAADZBAEAqIwhAAEAAADaBAEArIwhAAEAAADbBAEAsIwhAAEAAADcBAEAtIwhAAEAAADdBAEAuIwhAAEAAADeBAEAvIwhAAEAAADfBAEAwIwhAAEAAADgBAEAxIwhAAEAAADhBAEAyIwhAAEAAADiBAEAzIwhAAEAAADjBAEA0IwhAAEAAADkBAEA1IwhAAEAAADlBAEA2IwhAAEAAADmBAEA3IwhAAEAAADnBAEA4IwhAAEAAADoBAEA5IwhAAEAAADpBAEA6IwhAAEAAADqBAEA7IwhAAEAAADrBAEA8IwhAAEAAADsBAEA9IwhAAEAAADtBAEA+IwhAAEAAADuBAEA/IwhAAEAAADvBAEAAI0hAAEAAADwBAEABI0hAAEAAADxBAEACI0hAAEAAADyBAEADI0hAAEAAADzBAEAEI0hAAEAAAD0BAEAFI0hAAEAAAD1BAEAGI0hAAEAAAD2BAEAHI0hAAEAAAD3BAEAII0hAAEAAAD4BAEAJI0hAAEAAAD5BAEAKI0hAAEAAAD6BAEALI0hAAEAAAD7BAEAMI0hAAEAAABwBQEANI0hAAEAAABxBQEAOI0hAAEAAAByBQEAPI0hAAEAAABzBQEAQI0hAAEAAAB0BQEARI0hAAEAAAB1BQEASI0hAAEAAAB2BQEATI0hAAEAAAB3BQEAUI0hAAEAAAB4BQEAVI0hAAEAAAB5BQEAWI0hAAEAAAB6BQEAXI0hAAEAAAB8BQEAYI0hAAEAAAB9BQEAZI0hAAEAAAB+BQEAaI0hAAEAAAB/BQEAbI0hAAEAAACABQEAcI0hAAEAAACBBQEAdI0hAAEAAACCBQEAeI0hAAEAAACDBQEAfI0hAAEAAACEBQEAgI0hAAEAAACFBQEAhI0hAAEAAACGBQEAiI0hAAEAAACHBQEAjI0hAAEAAACIBQEAkI0hAAEAAACJBQEAlI0hAAEAAACKBQEAmI0hAAEAAACMBQEAnI0hAAEAAACNBQEAoI0hAAEAAACOBQEApI0hAAEAAACPBQEAqI0hAAEAAACQBQEArI0hAAEAAACRBQEAsI0hAAEAAACSBQEAtI0hAAEAAACUBQEAuI0hAAEAAACVBQEAvI0hAAEAAACXBQEAwI0hAAEAAACYBQEAxI0hAAEAAACZBQEAyI0hAAEAAACaBQEAzI0hAAEAAACbBQEA0I0hAAEAAACcBQEA1I0hAAEAAACdBQEA2I0hAAEAAACeBQEA3I0hAAEAAACfBQEA4I0hAAEAAACgBQEA5I0hAAEAAAChBQEA6I0hAAEAAACjBQEA7I0hAAEAAACkBQEA8I0hAAEAAAClBQEA9I0hAAEAAACmBQEA+I0hAAEAAACnBQEA/I0hAAEAAACoBQEAAI4hAAEAAACpBQEABI4hAAEAAACqBQEACI4hAAEAAACrBQEADI4hAAEAAACsBQEAEI4hAAEAAACtBQEAFI4hAAEAAACuBQEAGI4hAAEAAACvBQEAHI4hAAEAAACwBQEAII4hAAEAAACxBQEAJI4hAAEAAACzBQEAKI4hAAEAAAC0BQEALI4hAAEAAAC1BQEAMI4hAAEAAAC2BQEANI4hAAEAAAC3BQEAOI4hAAEAAAC4BQEAPI4hAAEAAAC5BQEAQI4hAAEAAAC7BQEARI4hAAEAAAC8BQEASI4hAAEAAACADAEATI4hAAEAAACBDAEAUI4hAAEAAACCDAEAVI4hAAEAAACDDAEAWI4hAAEAAACEDAEAXI4hAAEAAACFDAEAYI4hAAEAAACGDAEAZI4hAAEAAACHDAEAaI4hAAEAAACIDAEAbI4hAAEAAACJDAEAcI4hAAEAAACKDAEAdI4hAAEAAACLDAEAeI4hAAEAAACMDAEAfI4hAAEAAACNDAEAgI4hAAEAAACODAEAhI4hAAEAAACPDAEAiI4hAAEAAACQDAEAjI4hAAEAAACRDAEAkI4hAAEAAACSDAEAlI4hAAEAAACTDAEAmI4hAAEAAACUDAEAnI4hAAEAAACVDAEAoI4hAAEAAACWDAEApI4hAAEAAACXDAEAqI4hAAEAAACYDAEArI4hAAEAAACZDAEAsI4hAAEAAACaDAEAtI4hAAEAAACbDAEAuI4hAAEAAACcDAEAvI4hAAEAAACdDAEAwI4hAAEAAACeDAEAxI4hAAEAAACfDAEAyI4hAAEAAACgDAEAzI4hAAEAAAChDAEA0I4hAAEAAACiDAEA1I4hAAEAAACjDAEA2I4hAAEAAACkDAEA3I4hAAEAAAClDAEA4I4hAAEAAACmDAEA5I4hAAEAAACnDAEA6I4hAAEAAACoDAEA7I4hAAEAAACpDAEA8I4hAAEAAACqDAEA9I4hAAEAAACrDAEA+I4hAAEAAACsDAEA/I4hAAEAAACtDAEAAI8hAAEAAACuDAEABI8hAAEAAACvDAEACI8hAAEAAACwDAEADI8hAAEAAACxDAEAEI8hAAEAAACyDAEAFI8hAAEAAADADAEAGI8hAAEAAADBDAEAHI8hAAEAAADCDAEAII8hAAEAAADDDAEAJI8hAAEAAADEDAEAKI8hAAEAAADFDAEALI8hAAEAAADGDAEAMI8hAAEAAADHDAEANI8hAAEAAADIDAEAOI8hAAEAAADJDAEAPI8hAAEAAADKDAEAQI8hAAEAAADLDAEARI8hAAEAAADMDAEASI8hAAEAAADNDAEATI8hAAEAAADODAEAUI8hAAEAAADPDAEAVI8hAAEAAADQDAEAWI8hAAEAAADRDAEAXI8hAAEAAADSDAEAYI8hAAEAAADTDAEAZI8hAAEAAADUDAEAaI8hAAEAAADVDAEAbI8hAAEAAADWDAEAcI8hAAEAAADXDAEAdI8hAAEAAADYDAEAeI8hAAEAAADZDAEAfI8hAAEAAADaDAEAgI8hAAEAAADbDAEAhI8hAAEAAADcDAEAiI8hAAEAAADdDAEAjI8hAAEAAADeDAEAkI8hAAEAAADfDAEAlI8hAAEAAADgDAEAmI8hAAEAAADhDAEAnI8hAAEAAADiDAEAoI8hAAEAAADjDAEApI8hAAEAAADkDAEAqI8hAAEAAADlDAEArI8hAAEAAADmDAEAsI8hAAEAAADnDAEAtI8hAAEAAADoDAEAuI8hAAEAAADpDAEAvI8hAAEAAADqDAEAwI8hAAEAAADrDAEAxI8hAAEAAADsDAEAyI8hAAEAAADtDAEAzI8hAAEAAADuDAEA0I8hAAEAAADvDAEA1I8hAAEAAADwDAEA2I8hAAEAAADxDAEA3I8hAAEAAADyDAEA4I8hAAEAAACgGAEA5I8hAAEAAAChGAEA6I8hAAEAAACiGAEA7I8hAAEAAACjGAEA8I8hAAEAAACkGAEA9I8hAAEAAAClGAEA+I8hAAEAAACmGAEA/I8hAAEAAACnGAEAAJAhAAEAAACoGAEABJAhAAEAAACpGAEACJAhAAEAAACqGAEADJAhAAEAAACrGAEAEJAhAAEAAACsGAEAFJAhAAEAAACtGAEAGJAhAAEAAACuGAEAHJAhAAEAAACvGAEAIJAhAAEAAACwGAEAJJAhAAEAAACxGAEAKJAhAAEAAACyGAEALJAhAAEAAACzGAEAMJAhAAEAAAC0GAEANJAhAAEAAAC1GAEAOJAhAAEAAAC2GAEAPJAhAAEAAAC3GAEAQJAhAAEAAAC4GAEARJAhAAEAAAC5GAEASJAhAAEAAAC6GAEATJAhAAEAAAC7GAEAUJAhAAEAAAC8GAEAVJAhAAEAAAC9GAEAWJAhAAEAAAC+GAEAXJAhAAEAAAC/GAEAYJAhAAEAAADAGAEAZJAhAAEAAADBGAEAaJAhAAEAAADCGAEAbJAhAAEAAADDGAEAcJAhAAEAAADEGAEAdJAhAAEAAADFGAEAeJAhAAEAAADGGAEAfJAhAAEAAADHGAEAgJAhAAEAAADIGAEAhJAhAAEAAADJGAEAiJAhAAEAAADKGAEAjJAhAAEAAADLGAEAkJAhAAEAAADMGAEAlJAhAAEAAADNGAEAmJAhAAEAAADOGAEAnJAhAAEAAADPGAEAoJAhAAEAAADQGAEApJAhAAEAAADRGAEAqJAhAAEAAADSGAEArJAhAAEAAADTGAEAsJAhAAEAAADUGAEAtJAhAAEAAADVGAEAuJAhAAEAAADWGAEAvJAhAAEAAADXGAEAwJAhAAEAAADYGAEAxJAhAAEAAADZGAEAyJAhAAEAAADaGAEAzJAhAAEAAADbGAEA0JAhAAEAAADcGAEA1JAhAAEAAADdGAEA2JAhAAEAAADeGAEA3JAhAAEAAADfGAEA4JAhAAEAAABAbgEA5JAhAAEAAABBbgEA6JAhAAEAAABCbgEA7JAhAAEAAABDbgEA8JAhAAEAAABEbgEA9JAhAAEAAABFbgEA+JAhAAEAAABGbgEA/JAhAAEAAABHbgEAAJEhAAEAAABIbgEABJEhAAEAAABJbgEACJEhAAEAAABKbgEADJEhAAEAAABLbgEAEJEhAAEAAABMbgEAFJEhAAEAAABNbgEAGJEhAAEAAABObgEAHJEhAAEAAABPbgEAIJEhAAEAAABQbgEAJJEhAAEAAABRbgEAKJEhAAEAAABSbgEALJEhAAEAAABTbgEAMJEhAAEAAABUbgEANJEhAAEAAABVbgEAOJEhAAEAAABWbgEAPJEhAAEAAABXbgEAQJEhAAEAAABYbgEARJEhAAEAAABZbgEASJEhAAEAAABabgEATJEhAAEAAABbbgEAUJEhAAEAAABcbgEAVJEhAAEAAABdbgEAWJEhAAEAAABebgEAXJEhAAEAAABfbgEAYJEhAAEAAABgbgEAZJEhAAEAAABhbgEAaJEhAAEAAABibgEAbJEhAAEAAABjbgEAcJEhAAEAAABkbgEAdJEhAAEAAABlbgEAeJEhAAEAAABmbgEAfJEhAAEAAABnbgEAgJEhAAEAAABobgEAhJEhAAEAAABpbgEAiJEhAAEAAABqbgEAjJEhAAEAAABrbgEAkJEhAAEAAABsbgEAlJEhAAEAAABtbgEAmJEhAAEAAABubgEAnJEhAAEAAABvbgEAoJEhAAEAAABwbgEApJEhAAEAAABxbgEAqJEhAAEAAABybgEArJEhAAEAAABzbgEAsJEhAAEAAAB0bgEAtJEhAAEAAAB1bgEAuJEhAAEAAAB2bgEAvJEhAAEAAAB3bgEAwJEhAAEAAAB4bgEAxJEhAAEAAAB5bgEAyJEhAAEAAAB6bgEAzJEhAAEAAAB7bgEA0JEhAAEAAAB8bgEA1JEhAAEAAAB9bgEA2JEhAAEAAAB+bgEA3JEhAAEAAAB/bgEA4JEhAAEAAAAA6QEA5JEhAAEAAAAB6QEA6JEhAAEAAAAC6QEA7JEhAAEAAAAD6QEA8JEhAAEAAAAE6QEA9JEhAAEAAAAF6QEA+JEhAAEAAAAG6QEA/JEhAAEAAAAH6QEAAJIhAAEAAAAI6QEABJIhAAEAAAAJ6QEACJIhAAEAAAAK6QEADJIhAAEAAAAL6QEAEJIhAAEAAAAM6QEAFJIhAAEAAAAN6QEAGJIhAAEAAAAO6QEAHJIhAAEAAAAP6QEAIJIhAAEAAAAQ6QEAJJIhAAEAAAAR6QEAKJIhAAEAAAAS6QEALJIhAAEAAAAT6QEAMJIhAAEAAAAU6QEANJIhAAEAAAAV6QEAOJIhAAEAAAAW6QEAPJIhAAEAAAAX6QEAQJIhAAEAAAAY6QEARJIhAAEAAAAZ6QEASJIhAAEAAAAa6QEATJIhAAEAAAAb6QEAUJIhAAEAAAAc6QEAVJIhAAEAAAAd6QEAWJIhAAEAAAAe6QEAXJIhAAEAAAAf6QEAYJIhAAEAAAAg6QEAZJIhAAEAAAAh6QEAaJIhAAEAAAAi6QEAbJIhAAEAAAAj6QEAcJIhAAEAAAAk6QEAdJIhAAEAAAAl6QEAeJIhAAEAAAAm6QEAfJIhAAEAAAAn6QEAgJIhAAEAAAAo6QEAhJIhAAEAAAAp6QEAiJIhAAEAAAAq6QEAjJIhAAEAAAAr6QEAkJIhAAEAAAAs6QEAlJIhAAEAAAAt6QEAmJIhAAEAAAAu6QEAnJIhAAEAAAAv6QEAoJIhAAEAAAAw6QEApJIhAAEAAAAx6QEAqJIhAAEAAAAy6QEArJIhAAEAAAAz6QEAsJIhAAEAAAA06QEAtJIhAAEAAAA16QEAuJIhAAEAAAA26QEAvJIhAAEAAAA36QEAwJIhAAEAAAA46QEAxJIhAAEAAAA56QEAyJIhAAEAAAA66QEAzJIhAAEAAAA76QEA0JIhAAEAAAA86QEA1JIhAAEAAAA96QEA2JIhAAEAAAA+6QEA3JIhAAEAAAA/6QEA4JIhAAEAAABA6QEA5JIhAAEAAABB6QEA6JIhAAEAAABC6QEA7JIhAAEAAABD6QEA8JIhAAEAAABnb3QgY29kZXBvaW50IFUrIHdoaWNoIG9jY3VycyBiZWZvcmUgbGFzdCBjb2RlcG9pbnQgVSsAANwZIgAQAAAA7BkiACYAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1zeW50YXgtMC44LjQvc3JjL3VuaWNvZGUucnMAACQaIgBmAAAAfgAAAA0AAABhc3NlcnRpb24gZmFpbGVkOiBpID4gc2VsZi5uZXh0ACQaIgBmAAAAmwAAABEAAAAkGiIAZgAAALUAAAAJAAAAR2VuZXJhbF9DYXRlZ29yeVNjcmlwdGNmc2NsY0FnZVNjcmlwdF9FeHRlbnNpb25zR3JhcGhlbWVfQ2x1c3Rlcl9CcmVha1NlbnRlbmNlX0JyZWFrV29yZF9CcmVhawAAMAAAADkAAABBAAAAWgAAAF8AAABfAAAAYQAAAHoAAACqAAAAqgAAALUAAAC1AAAAugAAALoAAADAAAAA1gAAANgAAAD2AAAA+AAAAMECAADGAgAA0QIAAOACAADkAgAA7AIAAOwCAADuAgAA7gIAAAADAAB0AwAAdgMAAHcDAAB6AwAAfQMAAH8DAAB/AwAAhgMAAIYDAACIAwAAigMAAIwDAACMAwAAjgMAAKEDAACjAwAA9QMAAPcDAACBBAAAgwQAAC8FAAAxBQAAVgUAAFkFAABZBQAAYAUAAIgFAACRBQAAvQUAAL8FAAC/BQAAwQUAAMIFAADEBQAAxQUAAMcFAADHBQAA0AUAAOoFAADvBQAA8gUAABAGAAAaBgAAIAYAAGkGAABuBgAA0wYAANUGAADcBgAA3wYAAOgGAADqBgAA/AYAAP8GAAD/BgAAEAcAAEoHAABNBwAAsQcAAMAHAAD1BwAA+gcAAPoHAAD9BwAA/QcAAAAIAAAtCAAAQAgAAFsIAABgCAAAaggAAHAIAACHCAAAiQgAAI4IAACYCAAA4QgAAOMIAABjCQAAZgkAAG8JAABxCQAAgwkAAIUJAACMCQAAjwkAAJAJAACTCQAAqAkAAKoJAACwCQAAsgkAALIJAAC2CQAAuQkAALwJAADECQAAxwkAAMgJAADLCQAAzgkAANcJAADXCQAA3AkAAN0JAADfCQAA4wkAAOYJAADxCQAA/AkAAPwJAAD+CQAA/gkAAAEKAAADCgAABQoAAAoKAAAPCgAAEAoAABMKAAAoCgAAKgoAADAKAAAyCgAAMwoAADUKAAA2CgAAOAoAADkKAAA8CgAAPAoAAD4KAABCCgAARwoAAEgKAABLCgAATQoAAFEKAABRCgAAWQoAAFwKAABeCgAAXgoAAGYKAAB1CgAAgQoAAIMKAACFCgAAjQoAAI8KAACRCgAAkwoAAKgKAACqCgAAsAoAALIKAACzCgAAtQoAALkKAAC8CgAAxQoAAMcKAADJCgAAywoAAM0KAADQCgAA0AoAAOAKAADjCgAA5goAAO8KAAD5CgAA/woAAAELAAADCwAABQsAAAwLAAAPCwAAEAsAABMLAAAoCwAAKgsAADALAAAyCwAAMwsAADULAAA5CwAAPAsAAEQLAABHCwAASAsAAEsLAABNCwAAVQsAAFcLAABcCwAAXQsAAF8LAABjCwAAZgsAAG8LAABxCwAAcQsAAIILAACDCwAAhQsAAIoLAACOCwAAkAsAAJILAACVCwAAmQsAAJoLAACcCwAAnAsAAJ4LAACfCwAAowsAAKQLAACoCwAAqgsAAK4LAAC5CwAAvgsAAMILAADGCwAAyAsAAMoLAADNCwAA0AsAANALAADXCwAA1wsAAOYLAADvCwAAAAwAAAwMAAAODAAAEAwAABIMAAAoDAAAKgwAADkMAAA8DAAARAwAAEYMAABIDAAASgwAAE0MAABVDAAAVgwAAFgMAABaDAAAXQwAAF0MAABgDAAAYwwAAGYMAABvDAAAgAwAAIMMAACFDAAAjAwAAI4MAACQDAAAkgwAAKgMAACqDAAAswwAALUMAAC5DAAAvAwAAMQMAADGDAAAyAwAAMoMAADNDAAA1QwAANYMAADdDAAA3gwAAOAMAADjDAAA5gwAAO8MAADxDAAA8wwAAAANAAAMDQAADg0AABANAAASDQAARA0AAEYNAABIDQAASg0AAE4NAABUDQAAVw0AAF8NAABjDQAAZg0AAG8NAAB6DQAAfw0AAIENAACDDQAAhQ0AAJYNAACaDQAAsQ0AALMNAAC7DQAAvQ0AAL0NAADADQAAxg0AAMoNAADKDQAAzw0AANQNAADWDQAA1g0AANgNAADfDQAA5g0AAO8NAADyDQAA8w0AAAEOAAA6DgAAQA4AAE4OAABQDgAAWQ4AAIEOAACCDgAAhA4AAIQOAACGDgAAig4AAIwOAACjDgAApQ4AAKUOAACnDgAAvQ4AAMAOAADEDgAAxg4AAMYOAADIDgAAzg4AANAOAADZDgAA3A4AAN8OAAAADwAAAA8AABgPAAAZDwAAIA8AACkPAAA1DwAANQ8AADcPAAA3DwAAOQ8AADkPAAA+DwAARw8AAEkPAABsDwAAcQ8AAIQPAACGDwAAlw8AAJkPAAC8DwAAxg8AAMYPAAAAEAAASRAAAFAQAACdEAAAoBAAAMUQAADHEAAAxxAAAM0QAADNEAAA0BAAAPoQAAD8EAAASBIAAEoSAABNEgAAUBIAAFYSAABYEgAAWBIAAFoSAABdEgAAYBIAAIgSAACKEgAAjRIAAJASAACwEgAAshIAALUSAAC4EgAAvhIAAMASAADAEgAAwhIAAMUSAADIEgAA1hIAANgSAAAQEwAAEhMAABUTAAAYEwAAWhMAAF0TAABfEwAAgBMAAI8TAACgEwAA9RMAAPgTAAD9EwAAARQAAGwWAABvFgAAfxYAAIEWAACaFgAAoBYAAOoWAADuFgAA+BYAAAAXAAAVFwAAHxcAADQXAABAFwAAUxcAAGAXAABsFwAAbhcAAHAXAAByFwAAcxcAAIAXAADTFwAA1xcAANcXAADcFwAA3RcAAOAXAADpFwAACxgAAA0YAAAPGAAAGRgAACAYAAB4GAAAgBgAAKoYAACwGAAA9RgAAAAZAAAeGQAAIBkAACsZAAAwGQAAOxkAAEYZAABtGQAAcBkAAHQZAACAGQAAqxkAALAZAADJGQAA0BkAANkZAAAAGgAAGxoAACAaAABeGgAAYBoAAHwaAAB/GgAAiRoAAJAaAACZGgAApxoAAKcaAACwGgAAzhoAAAAbAABMGwAAUBsAAFkbAABrGwAAcxsAAIAbAADzGwAAABwAADccAABAHAAASRwAAE0cAAB9HAAAgBwAAIgcAACQHAAAuhwAAL0cAAC/HAAA0BwAANIcAADUHAAA+hwAAAAdAAAVHwAAGB8AAB0fAAAgHwAARR8AAEgfAABNHwAAUB8AAFcfAABZHwAAWR8AAFsfAABbHwAAXR8AAF0fAABfHwAAfR8AAIAfAAC0HwAAth8AALwfAAC+HwAAvh8AAMIfAADEHwAAxh8AAMwfAADQHwAA0x8AANYfAADbHwAA4B8AAOwfAADyHwAA9B8AAPYfAAD8HwAADCAAAA0gAAA/IAAAQCAAAFQgAABUIAAAcSAAAHEgAAB/IAAAfyAAAJAgAACcIAAA0CAAAPAgAAACIQAAAiEAAAchAAAHIQAACiEAABMhAAAVIQAAFSEAABkhAAAdIQAAJCEAACQhAAAmIQAAJiEAACghAAAoIQAAKiEAAC0hAAAvIQAAOSEAADwhAAA/IQAARSEAAEkhAABOIQAATiEAAGAhAACIIQAAtiQAAOkkAAAALAAA5CwAAOssAADzLAAAAC0AACUtAAAnLQAAJy0AAC0tAAAtLQAAMC0AAGctAABvLQAAby0AAH8tAACWLQAAoC0AAKYtAACoLQAAri0AALAtAAC2LQAAuC0AAL4tAADALQAAxi0AAMgtAADO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Z2Nhc2VpZ25vcmFibGVDYXNlX0lnbm9yYWJsZWNjY2NlQ29tcG9zaXRpb25fRXhjbHVzaW9uY2hhbmdlc3doZW5jYXNlZm9sZGVkQ2hhbmdlc19XaGVuX0Nhc2Vmb2xkZWRjaGFuZ2Vzd2hlbmNhc2VtYXBwZWRDaGFuZ2VzX1doZW5fQ2FzZW1hcHBlZGNoYW5nZXN3aGVubG93ZXJjYXNlZENoYW5nZXNfV2hlbl9Mb3dlcmNhc2VkY2hhbmdlc3doZW5uZmtjY2FzZWZvbGRlZENoYW5nZXNfV2hlbl9ORktDX0Nhc2Vmb2xkZWRjaGFuZ2Vzd2hlbnRpdGxlY2FzZWRDaGFuZ2VzX1doZW5fVGl0bGVjYXNlZGNoYW5nZXN3aGVudXBwZXJjYXNlZENoYW5nZXNfV2hlbl9VcHBlcmNhc2VkY2ljamthY2NvdW50aW5nbnVtZXJpY2tBY2NvdW50aW5nTnVtZXJpY2Nqa2NvbXBhdGliaWxpdHl2YXJpYW50a0NvbXBhdGliaWxpdHlWYXJpYW50Y2praWljb3Jla0lJQ29yZWNqa2lyZ2dzb3VyY2VrSVJHX0dTb3VyY2Vjamtpcmdoc291cmNla0lSR19IU291cmNlY2praXJnanNvdXJjZWtJUkdfSlNvdXJjZWNqa2lyZ2twc291cmNla0lSR19LUFNvdXJjZWNqa2lyZ2tzb3VyY2VrSVJHX0tTb3VyY2Vjamtpcmdtc291cmNla0lSR19NU291cmNlY2praXJnc3NvdXJjZWtJUkdfU1NvdXJjZWNqa2lyZ3Rzb3VyY2VrSVJHX1RTb3VyY2Vjamtpcmd1a3NvdXJjZWtJUkdfVUtTb3VyY2Vjamtpcmd1c291cmNla0lSR19VU291cmNlY2praXJndnNvdXJjZWtJUkdfVlNvdXJjZWNqa290aGVybnVtZXJpY2tPdGhlck51bWVyaWNjamtwcmltYXJ5bnVtZXJpY2tQcmltYXJ5TnVtZXJpY2Nqa3JzdW5pY29kZWtSU1VuaWNvZGVjb21wZXhGdWxsX0NvbXBvc2l0aW9uX0V4Y2x1c2lvbmNvbXBvc2l0aW9uZXhjbHVzaW9uY3djZmN3Y21jd2tjZmN3bGN3dGN3dWRhc2hEYXNoZGVjb21wb3NpdGlvbm1hcHBpbmdEZWNvbXBvc2l0aW9uX01hcHBpbmdkZWNvbXBvc2l0aW9udHlwZURlY29tcG9zaXRpb25fVHlwZWRlZmF1bHRpZ25vcmFibGVjb2RlcG9pbnREZWZhdWx0X0lnbm9yYWJsZV9Db2RlX1BvaW50ZGVwRGVwcmVjYXRlZGRlcHJlY2F0ZWRkaWRpYURpYWNyaXRpY2RpYWNyaXRpY2RtZHRlYUVhc3RfQXNpYW5fV2lkdGhlYXN0YXNpYW53aWR0aGViYXNlRW1vamlfTW9kaWZpZXJfQmFzZWVjb21wRW1vamlfQ29tcG9uZW50ZW1vZEVtb2ppX01vZGlmaWVyZW1vamlFbW9qaWVtb2ppY29tcG9uZW50ZW1vamltb2RpZmllcmVtb2ppbW9kaWZpZXJiYXNlZW1vamlwcmVzZW50YXRpb25FbW9qaV9QcmVzZW50YXRpb25lcHJlc2VxdWlkZW9FcXVpdmFsZW50X1VuaWZpZWRfSWRlb2dyYXBoZXF1aXZhbGVudHVuaWZpZWRpZGVvZ3JhcGhleHBhbmRzb25uZmNFeHBhbmRzX09uX05GQ2V4cGFuZHNvbm5mZEV4cGFuZHNfT25fTkZEZXhwYW5kc29ubmZrY0V4cGFuZHNfT25fTkZLQ2V4cGFuZHNvbm5ma2RFeHBhbmRzX09uX05GS0RleHRFeHRlbmRlcmV4dGVuZGVkcGljdG9ncmFwaGljRXh0ZW5kZWRfUGljdG9ncmFwaGljZXh0ZW5kZXJleHRwaWN0ZmNuZmtjRkNfTkZLQ19DbG9zdXJlZmNuZmtjY2xvc3VyZWZ1bGxjb21wb3NpdGlvbmV4Y2x1c2lvbmdjZ2NiZ2VuZXJhbGNhdGVnb3J5Z3JhcGhlbWViYXNlR3JhcGhlbWVfQmFzZWdyYXBoZW1lY2x1c3RlcmJyZWFrZ3JhcGhlbWVleHRlbmRHcmFwaGVtZV9FeHRlbmRncmFwaGVtZWxpbmtHcmFwaGVtZV9MaW5rZ3JiYXNlZ3JleHRncmxpbmtoYW5ndWxzeWxsYWJsZXR5cGVIYW5ndWxfU3lsbGFibGVfVHlwZWhleEhleF9EaWdpdGhleGRpZ2l0aHN0aHlwaGVuSHlwaGVuaWRjSURfQ29udGludWVpZGNvbnRpbnVlaWRlb0lkZW9ncmFwaGljaWRlb2dyYXBoaWNpZHNJRF9TdGFydGlkc2JJRFNfQmluYXJ5X09wZXJhdG9yaWRzYmluYXJ5b3BlcmF0b3JpZHN0SURTX1RyaW5hcnlfT3BlcmF0b3JpZHN0YXJ0aWRzdHJpbmFyeW9wZXJhdG9yaW5kaWNwb3NpdGlvbmFsY2F0ZWdvcnlJbmRpY19Qb3NpdGlvbmFsX0NhdGVnb3J5aW5kaWNzeWxsYWJpY2NhdGVnb3J5SW5kaWNfU3lsbGFiaWNfQ2F0ZWdvcnlpbnBjaW5zY2lzY0lTT19Db21tZW50amFtb3Nob3J0bmFtZUphbW9fU2hvcnRfTmFtZWpnSm9pbmluZ19Hcm91cGpvaW5jSm9pbl9Db250cm9sam9pbmNvbnRyb2xqb2luaW5nZ3JvdXBqb2luaW5ndHlwZUpvaW5pbmdfVHlwZWpzbmp0a2FjY291bnRpbmdudW1lcmlja2NvbXBhdGliaWxpdHl2YXJpYW50a2lpY29yZWtpcmdnc291cmNla2lyZ2hzb3VyY2VraXJnanNvdXJjZWtpcmdrcHNvdXJjZWtpcmdrc291cmNla2lyZ21zb3VyY2VraXJnc3NvdXJjZWtpcmd0c291cmNla2lyZ3Vrc291cmNla2lyZ3Vzb3VyY2VraXJndnNvdXJjZWtvdGhlcm51bWVyaWNrcHJpbWFyeW51bWVyaWNrcnN1bmljb2RlbGJMaW5lX0JyZWFrTG93ZXJjYXNlX01hcHBpbmdsaW5lYnJlYWtsb2VMb2dpY2FsX09yZGVyX0V4Y2VwdGlvbmxvZ2ljYWxvcmRlcmV4Y2VwdGlvbkxvd2VyY2FzZWxvd2VyY2FzZWxvd2VyY2FzZW1hcHBpbmdtYXRoTWF0aG5hTmFtZW5hMVVuaWNvZGVfMV9OYW1lbmFtZWFsaWFzTmFtZV9BbGlhc25jaGFyTm9uY2hhcmFjdGVyX0NvZGVfUG9pbnRuZmNxY05GQ19RdWlja19DaGVja25mY3F1aWNrY2hlY2tuZmRxY05GRF9RdWlja19DaGVja25mZHF1aWNrY2hlY2tuZmtjY2FzZWZvbGRORktDX0Nhc2Vmb2xkbmZrY2NmbmZrY3FjTkZLQ19RdWlja19DaGVja25ma2NxdWlja2NoZWNrbmZrZHFjTkZLRF9RdWlja19DaGVja25ma2RxdWlja2NoZWNrbm9uY2hhcmFjdGVyY29kZXBvaW50bnROdW1lcmljX1R5cGVudW1lcmljdHlwZW51bWVyaWN2YWx1ZU51bWVyaWNfVmFsdWVudm9hbHBoYU90aGVyX0FscGhhYmV0aWNvY29tbWVudG9kaU90aGVyX0RlZmF1bHRfSWdub3JhYmxlX0NvZGVfUG9pbnRvZ3JleHRPdGhlcl9HcmFwaGVtZV9FeHRlbmRvaWRjT3RoZXJfSURfQ29udGludWVvaWRzT3RoZXJfSURfU3RhcnRvbG93ZXJPdGhlcl9Mb3dlcmNhc2VvbWF0aE90aGVyX01hdGhvdGhlcmFscGhhYmV0aWNvdGhlcmRlZmF1bHRpZ25vcmFibGVjb2RlcG9pbnRvdGhlcmdyYXBoZW1lZXh0ZW5kb3RoZXJpZGNvbnRpbnVlb3RoZXJpZHN0YXJ0b3RoZXJsb3dlcmNhc2VvdGhlcm1hdGhvdGhlcnVwcGVyY2FzZU90aGVyX1VwcGVyY2FzZW91cHBlcnBhdHN5blBhdHRlcm5fU3ludGF4cGF0dGVybnN5bnRheHBhdHRlcm53aGl0ZXNwYWNlUGF0dGVybl9XaGl0ZV9TcGFjZXBhdHdzcGNtUHJlcGVuZGVkX0NvbmNhdGVuYXRpb25fTWFya3ByZXBlbmRlZGNvbmNhdGVuYXRpb25tYXJrcW1hcmtRdW90YXRpb25fTWFya3F1b3RhdGlvbm1hcmtyYWRpY2FsUmFkaWNhbHJlZ2lvbmFsaW5kaWNhdG9yUmVnaW9uYWxfSW5kaWNhdG9ycmlzYnNjZlNpbXBsZV9DYXNlX0ZvbGRpbmdzY3JpcHRleHRlbnNpb25zc2N4c2RTb2Z0X0RvdHRlZHNlbnRlbmNlYnJlYWtzZW50ZW5jZXRlcm1pbmFsU2VudGVuY2VfVGVybWluYWxzZmNzaW1wbGVjYXNlZm9sZGluZ3NpbXBsZWxvd2VyY2FzZW1hcHBpbmdTaW1wbGVfTG93ZXJjYXNlX01hcHBpbmdzaW1wbGV0aXRsZWNhc2VtYXBwaW5nU2ltcGxlX1RpdGxlY2FzZV9NYXBwaW5nc2ltcGxldXBwZXJjYXNlbWFwcGluZ1NpbXBsZV9VcHBlcmNhc2VfTWFwcGluZ3NsY3NvZnRkb3R0ZWRXaGl0ZV9TcGFjZXN0Y3N0ZXJtc3VjdGNUaXRsZWNhc2VfTWFwcGluZ3Rlcm1UZXJtaW5hbF9QdW5jdHVhdGlvbnRlcm1pbmFscHVuY3R1YXRpb250aXRsZWNhc2VtYXBwaW5ndWNVcHBlcmNhc2VfTWFwcGluZ3VpZGVvVW5pZmllZF9JZGVvZ3JhcGh1bmljb2RlMW5hbWV1bmljb2RlcmFkaWNhbHN0cm9rZXVuaWZpZWRpZGVvZ3JhcGhVcHBlcmNhc2V1cHBlcmNhc2V1cHBlcmNhc2VtYXBwaW5ndXJzdmFyaWF0aW9uc2VsZWN0b3JWYXJpYXRpb25fU2VsZWN0b3J2ZXJ0aWNhbG9yaWVudGF0aW9uVmVydGljYWxfT3JpZW50YXRpb252b3Zzd2J3aGl0ZXNwYWNld29yZGJyZWFrd3NwYWNleGlkY1hJRF9Db250aW51ZXhpZGNvbnRpbnVleGlkc1hJRF9TdGFydHhpZHN0YXJ0eG9uZmN4b25mZHhvbmZrY3hvbmZrZNw1IgADAAAA+BoiAAMAAADfNSIABAAAAOM1IgAPAAAAXXMmAAUAAADyNSIACgAAAPw1IgAKAAAA8jUiAAoAAAAGNiIADQAAAOM1IgAPAAAAEzYiAAIAAAAVNiIACgAAAB82IgAFAAAAJDYiAAwAAAAwNiIACQAAABU2IgAKAAAAOTYiAAsAAAAkNiIADAAAAEQ2IgAFAAAASTYiAA0AAABWNiIADAAAAEk2IgANAAAAYjYiABIAAAB0NiIAFAAAAIg2IgARAAAAmTYiABMAAACsNiIAFQAAAME2IgAYAAAA2TYiAAMAAADHfyYABQAAAGSCJgAFAAAAx38mAAUAAADcNiIAAwAAAHQ2IgAUAAAA3zYiAAMAAACZNiIAEwAAAOI2IgADAAAAwTYiABgAAADlNiIAFwAAAPw2IgAZAAAAFTciAAUAAAAaNyIABQAAAB83IgALAAAAKjciAAwAAAA2NyIADQAAAEM3IgAOAAAAUTciAAMAAAD8NiIAGQAAAFQ3IgACAAAAVjciABUAAADyGiIAAgAAACo3IgAMAAAAazciABUAAACANyIAFwAAAJc3IgAVAAAArDciABcAAADDNyIAFQAAANg3IgAXAAAA7zciABkAAAAIOCIAHAAAACQ4IgAVAAAAOTgiABcAAABQOCIAFQAAAGU4IgAXAAAAfDgiAAIAAABDNyIADgAAAH44IgAUAAAAkjgiABIAAACkOCIAFwAAALs4IgAVAAAA0DgiAAkAAADZOCIABwAAAOA4IgANAAAA7TgiAAwAAAD5OCIADQAAAAY5IgAMAAAAEjkiAA0AAAAfOSIADAAAACs5IgAOAAAAOTkiAA0AAABGOSIADQAAAFM5IgAMAAAAXzkiAA0AAABsOSIADAAAAHg5IgANAAAAhTkiAAwAAACROSIADQAAAJ45IgAMAAAAqjkiAA4AAAC4OSIADQAAAMU5IgANAAAA0jkiAAwAAADeOSIADQAAAOs5IgAMAAAA9zkiAA8AAAAGOiIADQAAABM6IgARAAAAJDoiAA8AAAAzOiIADAAAAD86IgAKAAAASToiAAYAAABPOiIAGgAAAGk6IgAUAAAAVjciABUAAAB9OiIABAAAAIA3IgAXAAAAgToiAAQAAACsNyIAFwAAAIU6IgAFAAAACDgiABwAAACKOiIAAwAAANg3IgAXAAAAjToiAAMAAAA5OCIAFwAAAJA6IgADAAAAZTgiABcAAACTOiIABAAAAJc6IgAEAAAAmzoiABQAAACvOiIAFQAAAMQ6IgARAAAA1ToiABIAAADnOiIAGQAAAAA7IgAcAAAAHDsiAAMAAAAfOyIACgAAACk7IgAKAAAAHzsiAAoAAAAzOyIAAgAAAAA7IgAcAAAANTsiAAMAAAA4OyIACQAAAEE7IgAJAAAAODsiAAkAAABKOyIAAgAAAK86IgAVAAAATDsiAAIAAADVOiIAEgAAAE47IgACAAAAUDsiABAAAABgOyIADgAAAFA7IgAQAAAAbjsiAAUAAABzOyIAEwAAAIY7IgAFAAAAizsiAA8AAACaOyIABAAAAJ47IgAOAAAArDsiAAUAAACxOyIABQAAALY7IgAOAAAAizsiAA8AAADEOyIADQAAAJ47IgAOAAAA0TsiABEAAABzOyIAEwAAAOI7IgARAAAA8zsiABIAAAAFPCIABQAAAPM7IgASAAAACjwiAAcAAAARPCIAHAAAAC08IgAaAAAAETwiABwAAABHPCIADAAAAFM8IgAOAAAAYTwiAAwAAABtPCIADgAAAHs8IgANAAAAiDwiAA8AAACXPCIADQAAAKQ8IgAPAAAAszwiAAMAAAC2PCIACAAAAL48IgAUAAAA0jwiABUAAADnPCIACAAAALY8IgAIAAAA7zwiAAcAAADSPCIAFQAAAPY8IgAGAAAA/DwiAA8AAAALPSIADQAAAPw8IgAPAAAAGD0iABgAAABPOiIAGgAAADA9IgACAAAA3BoiABAAAAAyPSIAAwAAAAwbIgAWAAAANT0iAA8AAADcGiIAEAAAAEQ9IgAMAAAAUD0iAA0AAABdPSIAFAAAAAwbIgAWAAAAcT0iAA4AAAB/PSIADwAAAI49IgAMAAAAmj0iAA0AAACnPSIABgAAAFA9IgANAAAArT0iAAUAAAB/PSIADwAAALI9IgAGAAAAmj0iAA0AAAC4PSIAEgAAAMo9IgAUAAAA3j0iAAMAAADhPSIACQAAAOo9IgAIAAAA4T0iAAkAAADyPSIAAwAAAMo9IgAUAAAA9T0iAAYAAAD7PSIABgAAAAE+IgADAAAABD4iAAsAAAAPPiIACgAAAAQ+IgALAAAAGT4iAAQAAAAdPiIACwAAACg+IgALAAAAHT4iAAsAAAAzPiIAAwAAADY+IgAIAAAAPj4iAAQAAABCPiIAEwAAAFU+IgARAAAAQj4iABMAAABmPiIABAAAAGo+IgAUAAAAfj4iAAcAAAA2PiIACAAAAIU+IgASAAAAaj4iABQAAACXPiIAFwAAAK4+IgAZAAAAxz4iABUAAADcPiIAFwAAAPM+IgAEAAAArj4iABkAAAD3PiIABAAAANw+IgAXAAAA+z4iAAMAAAD+PiIACwAAAAk/IgANAAAAFj8iAA8AAAAlPyIAAgAAACc/IgANAAAAND8iAAUAAAA5PyIADAAAAEU/IgALAAAAOT8iAAwAAABQPyIADAAAACc/IgANAAAAXD8iAAsAAABnPyIADAAAAHM/IgADAAAAFj8iAA8AAAB2PyIAAgAAAGc/IgAMAAAAeD8iABIAAACSOCIAEgAAAIo/IgAVAAAAuzgiABUAAACfPyIABwAAANk4IgAHAAAApj8iAAsAAADtOCIADAAAALE/IgALAAAABjkiAAwAAAC8PyIACwAAAB85IgAMAAAAxz8iAAwAAAA5OSIADQAAANM/IgALAAAAUzkiAAwAAADePyIACwAAAGw5IgAMAAAA6T8iAAsAAACFOSIADAAAAPQ/IgALAAAAnjkiAAwAAAD/PyIADAAAALg5IgANAAAAC0AiAAsAAADSOSIADAAAABZAIgALAAAA6zkiAAwAAAAhQCIADQAAAAY6IgANAAAALkAiAA8AAAAkOiIADwAAAD1AIgAKAAAAPzoiAAoAAABHQCIAAgAAAElAIgAKAAAA9hoiAAIAAABTQCIAEQAAAGRAIgAJAAAASUAiAAoAAABtQCIAAwAAAHBAIgAXAAAAh0AiABUAAABwQCIAFwAAACdOIQAFAAAAnEAiAAkAAAClQCIACQAAAJxAIgAJAAAArkAiABAAAABTQCIAEQAAAL5AIgAEAAAAwkAiAAQAAADGQCIAAgAAAMhAIgAEAAAAzEAiAAMAAADPQCIADgAAAIuBJgAEAAAAyEAiAAQAAADdQCIACQAAAOZAIgAKAAAA8EAiAAUAAAD1QCIAFwAAAAxBIgAFAAAAEUEiAA8AAAAgQSIADQAAABFBIgAPAAAALUEiAAUAAAAyQSIADwAAAEFBIgANAAAAMkEiAA8AAABOQSIADAAAAFpBIgANAAAAZ0EiAAYAAABaQSIADQAAAG1BIgAGAAAAc0EiABAAAACDQSIADgAAAHNBIgAQAAAAkUEiAAYAAACXQSIAEAAAAKdBIgAOAAAAl0EiABAAAAC1QSIAFQAAAPVAIgAXAAAAykEiAAIAAADMQSIADAAAANhBIgALAAAAzEEiAAwAAADjQSIADAAAAO9BIgANAAAA/EEiAAIAAADvQSIADQAAAP5BIgAGAAAABEIiABAAAAAUQiIACAAAAP4+IgALAAAAHEIiAAMAAAAfQiIAIgAAAEFCIgAGAAAAR0IiABUAAABcQiIABAAAAGBCIgARAAAAcUIiAAQAAAB1QiIADgAAAINCIgAGAAAAiUIiAA8AAACYQiIABQAAAJ1CIgAKAAAAp0IiAA8AAAAEQiIAEAAAALZCIgAeAAAAH0IiACIAAADUQiIAEwAAAEdCIgAVAAAA50IiAA8AAABgQiIAEQAAAPZCIgAMAAAAdUIiAA4AAAACQyIADgAAAIlCIgAPAAAAEEMiAAkAAACdQiIACgAAABlDIgAOAAAAJ0MiAA8AAAA2QyIABgAAACdDIgAPAAAAPEMiAAYAAABCQyIADgAAAFBDIgANAAAAQkMiAA4AAABdQyIAEQAAAG5DIgATAAAAgUMiAAUAAABuQyIAEwAAAIZDIgADAAAAiUMiABwAAAClQyIAGgAAAIlDIgAcAAAAv0MiAAUAAADEQyIADgAAANJDIgANAAAAxEMiAA4AAADfQyIABwAAAOZDIgAHAAAA7UMiABEAAAD+QyIAEgAAABBEIgACAAAA/kMiABIAAAASRCIAAgAAACIbIgAOAAAA9BoiAAIAAADsGiIABgAAABREIgADAAAAF0QiABMAAABX6CYABgAAAOwaIgAGAAAAKkQiABAAAAD7GiIAEQAAADpEIgADAAAA+xoiABEAAAA9RCIAAgAAAD9EIgALAAAASkQiAA0AAAAiGyIADgAAAFdEIgAQAAAAZ0QiABEAAAB4RCIAAwAAABdEIgATAAAAe0QiABEAAAAXRCIAEwAAAIxEIgAWAAAAokQiABgAAAC6RCIAFgAAANBEIgAYAAAA6EQiABYAAAD+RCIAGAAAABZFIgADAAAAokQiABgAAAAZRSIACgAAAD9EIgALAAAANk4hAAUAAAAjRSIACwAAAC5FIgADAAAA0EQiABgAAAAxRSIABQAAAGdEIgARAAAANkUiAAMAAAD+RCIAGAAAADlFIgACAAAAO0UiABEAAABMRSIABAAAAFBFIgAUAAAAZEUiABMAAABQRSIAFAAAAHdFIgAQAAAAO0UiABEAAACHRSIAAgAAAIlFIgARAAAAmkUiAAUAAACfRSIAEQAAALBFIgAMAAAAz0AiAA4AAAC8RSIAFAAAAD86IgAKAAAA0EUiABAAAACfRSIAEQAAADtOIQAFAAAA4EUiAAkAAADpRSIACQAAAOBFIgAJAAAA8kUiABAAAACJRSIAEQAAAAJGIgADAAAAPzoiAAoAAAAFRiIAEQAAABZGIgASAAAAKEYiABMAAAA7RiIAFAAAAE9GIgACAAAAO0YiABQAAABRRiIAAgAAABZGIgASAAAAU0YiAAIAAAAwGyIACgAAAFVGIgAKAAAAI0UiAAsAAABfRiIACQAAADAbIgAKAAAAaEYiAAYAAAAjRSIACwAAAG5GIgAEAAAAckYiAAwAAAB+RiIACwAAAHJGIgAMAAAAiUYiAAQAAACNRiIACQAAAJZGIgAIAAAAjUYiAAkAAACeRiIABQAAAFM8IgAOAAAAo0YiAAUAAABtPCIADgAAAKhGIgAGAAAAiDwiAA8AAACuRiIABgAAAKQ8IgAPAAAAJBoiAGYAAAAvAgAAFgAAADEuMVYxXzExMC4wVjEwXzAxMS4wVjExXzAxMi4wVjEyXzAxMi4xVjEyXzExMy4wVjEzXzAxNC4wVjE0XzAxNS4wVjE1XzAyLjBWMl8wMi4xVjJfMTMuMFYzXzAzLjFWM18xMy4yVjNfMjQuMFY0XzA0LjFWNF8xNS4wVjVfMDUuMVY1XzE1LjJWNV8yNi4wVjZfMDYuMVY2XzE2LjJWNl8yNi4zVjZfMzcuMFY3XzA4LjBWOF8wOS4wVjlfMFVuYXNzaWduZWR1bmFzc2lnbmVkdjEwMHYxMXYxMTB2MTIwdjEyMXYxMzB2MTQwdjE1MHYyMHYyMXYzMHYzMXYzMnY0MHY0MXY1MHY1MXY1MnY2MHY2MXY2MnY2M3Y3MHY4MHY5MACkViIAAwAAAKdWIgAEAAAAq1YiAAQAAACvViIABQAAALRWIgAEAAAAuFYiAAUAAAC9ViIABAAAAMFWIgAFAAAAxlYiAAQAAADKViIABQAAAM9WIgAEAAAA01YiAAUAAADYViIABAAAANxWIgAFAAAA4VYiAAQAAADlViIABQAAAOpWIgADAAAA7VYiAAQAAADxViIAAwAAAPRWIgAEAAAA+FYiAAMAAAD7ViIABAAAAP9WIgADAAAAAlciAAQAAAAGVyIAAwAAAAlXIgAEAAAADVciAAMAAAAQVyIABAAAABRXIgADAAAAF1ciAAQAAAAbVyIAAwAAAB5XIgAEAAAAIlciAAMAAAAlVyIABAAAAClXIgADAAAALFciAAQAAAAwVyIAAwAAADNXIgAEAAAAN1ciAAMAAAA6VyIABAAAAD5XIgADAAAAQVciAAQAAABFVyIAAwAAAEhXIgAEAAAATFciAAMAAABPVyIABAAAAFNXIgADAAAAVlciAAQAAABaVyIAAwAAAF1XIgAEAAAAxkAiAAIAAABhVyIACgAAAGtXIgAKAAAAYVciAAoAAAB1VyIABAAAAK9WIgAFAAAAeVciAAMAAACnViIABAAAAHxXIgAEAAAAuFYiAAUAAACAVyIABAAAAMFWIgAFAAAAhFciAAQAAADKViIABQAAAIhXIgAEAAAA01YiAAUAAACMVyIABAAAANxWIgAFAAAAkFciAAQAAADlViIABQAAAJRXIgADAAAA7VYiAAQAAACXVyIAAwAAAPRWIgAEAAAAmlciAAMAAAD7ViIABAAAAJ1XIgADAAAAAlciAAQAAACgVyIAAwAAAAlXIgAEAAAAo1ciAAMAAAAQVyIABAAAAKZXIgADAAAAF1ciAAQAAACpVyIAAwAAAB5XIgAEAAAArFciAAMAAAAlVyIABAAAAK9XIgADAAAALFciAAQAAACyVyIAAwAAADNXIgAEAAAAtVciAAMAAAA6VyIABAAAALhXIgADAAAAQVciAAQAAAC7VyIAAwAAAEhXIgAEAAAAvlciAAMAAABPVyIABAAAAMFXIgADAAAAVlciAAQAAADEVyIAAwAAAF1XIgAEAAAAY2FzZWRsZXR0ZXJDYXNlZF9MZXR0ZXJjY0NvbnRyb2xGb3JtYXRjbG9zZXB1bmN0dWF0aW9uQ2xvc2VfUHVuY3R1YXRpb25jbmNvUHJpdmF0ZV9Vc2Vjb21iaW5pbmdtYXJrY29ubmVjdG9ycHVuY3R1YXRpb25Db25uZWN0b3JfUHVuY3R1YXRpb25jb250cm9sY3NTdXJyb2dhdGVjdXJyZW5jeXN5bWJvbEN1cnJlbmN5X1N5bWJvbGRhc2hwdW5jdHVhdGlvbkRhc2hfUHVuY3R1YXRpb25kZWNpbWFsbnVtYmVyRGVjaW1hbF9OdW1iZXJlbmNsb3NpbmdtYXJrRW5jbG9zaW5nX01hcmtmaW5hbHB1bmN0dWF0aW9uRmluYWxfUHVuY3R1YXRpb25mb3JtYXRpbml0aWFscHVuY3R1YXRpb25Jbml0aWFsX1B1bmN0dWF0aW9uTGV0dGVybGV0dGVybGV0dGVybnVtYmVyTGV0dGVyX051bWJlcmxpbmVzZXBhcmF0b3JMaW5lX1NlcGFyYXRvcmxsTG93ZXJjYXNlX0xldHRlcmxtTW9kaWZpZXJfTGV0dGVybG9PdGhlcl9MZXR0ZXJsb3dlcmNhc2VsZXR0ZXJUaXRsZWNhc2VfTGV0dGVybHVVcHBlcmNhc2VfTGV0dGVybWFya21hdGhzeW1ib2xNYXRoX1N5bWJvbG1jU3BhY2luZ19NYXJrbWVtbk5vbnNwYWNpbmdfTWFya21vZGlmaWVybGV0dGVybW9kaWZpZXJzeW1ib2xNb2RpZmllcl9TeW1ib2xuZG5sbm9PdGhlcl9OdW1iZXJub25zcGFjaW5nbWFya29wZW5wdW5jdHVhdGlvbk9wZW5fUHVuY3R1YXRpb25vdGhlcm90aGVybGV0dGVyb3RoZXJudW1iZXJvdGhlcnB1bmN0dWF0aW9uT3RoZXJfUHVuY3R1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YyIABgAAAPpjIgAGAAAA9GMiAAYAAAAAZCIAAwAAAANkIgAOAAAAEWQiAAwAAAADZCIADgAAAOTTJgABAAAAHWQiAAEAAAAeZCIAAgAAACBkIgACAAAAImQiAAIAAAAkZCIAAgAAACZkIgADAAAAKWQiAAMAAACqXSIABQAAAL4WJgAFAAAALGQiAAIAAAAuZCIABwAAADVkIgAHAAAALmQiAAcAAADtQyIAEQAAAP5DIgASAAAAEEQiAAIAAAD+QyIAEgAAAGJeIgACAAAAPGQiAAsAAACDXiIACwAAADxkIgALAAAAR2QiAAEAAABIZCIAAQAAAElkIgABAAAASmQiAAEAAABLZCIAAgAAAL4WJgAFAAAA6XMmAAMAAABNZCIAAwAAAGFkbGFtQWRsYW1hZGxtYWdoYkNhdWNhc2lhbl9BbGJhbmlhbmFob21BaG9tYW5hdG9saWFuaGllcm9nbHlwaHNBbmF0b2xpYW5fSGllcm9nbHlwaHNhcmFiQXJhYmljYXJhYmljYXJtZW5pYW5Bcm1lbmlhbmFybWlJbXBlcmlhbF9BcmFtYWljYXJtbmF2ZXN0YW5BdmVzdGFuYXZzdGJhbGlCYWxpbmVzZWJhbGluZXNlYmFtdUJhbXVtYmFtdW1iYXNzQmFzc2FfVmFoYmFzc2F2YWhiYXRha0JhdGFrYmF0a2JlbmdCZW5nYWxpYmVuZ2FsaWJoYWlrc3VraUJoYWlrc3VraWJoa3Nib3BvQm9wb21vZm9ib3BvbW9mb2JyYWhCcmFobWlicmFobWlicmFpQnJhaWxsZWJyYWlsbGVidWdpQnVnaW5lc2VidWdpbmVzZWJ1aGRCdWhpZGJ1aGlkY2FrbUNoYWttYWNhbmFkaWFuYWJvcmlnaW5hbENhbmFkaWFuX0Fib3JpZ2luYWxjYW5zY2FyaUNhcmlhbmNhcmlhbmNhdWNhc2lhbmFsYmFuaWFuY2hha21hY2hhbUNoYW1jaGVyQ2hlcm9rZWVjaGVyb2tlZWNob3Jhc21pYW5DaG9yYXNtaWFuY2hyc2NvbW1vbkNvbW1vbmNvcHRDb3B0aWNjb3B0aWNjcG1uQ3lwcm9fTWlub2FuY3BydEN5cHJpb3RjdW5laWZvcm1DdW5laWZvcm1jeXByaW90Y3lwcm9taW5vYW5jeXJpbGxpY0N5cmlsbGljY3lybGRlc2VyZXREZXNlcmV0ZGV2YURldmFuYWdhcmlkZXZhbmFnYXJpZGlha0RpdmVzX0FrdXJ1ZGl2ZXNha3VydWRvZ3JEb2dyYWRvZ3JhZHNydGR1cGxEdXBsb3lhbmR1cGxveWFuZWd5cEVneXB0aWFuX0hpZXJvZ2x5cGhzZWd5cHRpYW5oaWVyb2dseXBoc2VsYmFFbGJhc2FuZWxiYXNhbmVseW1FbHltYWljZWx5bWFpY2V0aGlFdGhpb3BpY2V0aGlvcGljZ2Vvckdlb3JnaWFuZ2VvcmdpYW5nbGFnR2xhZ29saXRpY2dsYWdvbGl0aWNnb25nR3VuamFsYV9Hb25kaWdvbm1NYXNhcmFtX0dvbmRpZ290aEdvdGhpY2dvdGhpY2dyYW5HcmFudGhhZ3JhbnRoYWdyZWVrR3JlZWtncmVrZ3VqYXJhdGlHdWphcmF0aWd1anJndW5qYWxhZ29uZGlndXJtdWtoaUd1cm11a2hpZ3VydWhhbkhhbmhhbmdIYW5ndWxoYW5ndWxoYW5paGFuaWZpcm9oaW5neWFIYW5pZmlfUm9oaW5neWFoYW5vSGFudW5vb2hhbnVub29oYXRySGF0cmFuaGF0cmFuaGVickhlYnJld2hlYnJld2hpcmFIaXJhZ2FuYWhpcmFnYW5haGx1d2htbmdQYWhhd2hfSG1vbmdobW5wTnlpYWtlbmdfUHVhY2h1ZV9IbW9uZ2hya3RLYXRha2FuYV9Pcl9IaXJhZ2FuYWh1bmdPbGRfSHVuZ2FyaWFuaW1wZXJpYWxhcmFtYWljaW5oZXJpdGVkSW5oZXJpdGVkaW5zY3JpcHRpb25hbHBhaGxhdmlJbnNjcmlwdGlvbmFsX1BhaGxhdmlpbnNjcmlwdGlvbmFscGFydGhpYW5JbnNjcmlwdGlvbmFsX1BhcnRoaWFuaXRhbE9sZF9JdGFsaWNqYXZhSmF2YW5lc2VqYXZhbmVzZWthaXRoaUthaXRoaWthbGlLYXlhaF9MaWthbmFLYXRha2FuYWthbm5hZGFLYW5uYWRha2F0YWthbmFrYXRha2FuYW9yaGlyYWdhbmFrYXdpS2F3aWtheWFobGlraGFyS2hhcm9zaHRoaWtoYXJvc2h0aGlraGl0YW5zbWFsbHNjcmlwdEtoaXRhbl9TbWFsbF9TY3JpcHRraG1lcktobWVya2htcmtob2pLaG9qa2lraG9qa2lraHVkYXdhZGlLaHVkYXdhZGlraXRza25kYWt0aGlsYW5hVGFpX1RoYW1sYW9MYW9sYW9vbGF0aW5MYXRpbmxhdG5sZXBjTGVwY2hhbGVwY2hhbGltYkxpbWJ1bGltYnVsaW5hTGluZWFyX0FsaW5iTGluZWFyX0JsaW5lYXJhbGluZWFyYmxpc3VMaXN1bHljaUx5Y2lhbmx5Y2lhbmx5ZGlMeWRpYW5seWRpYW5tYWhhamFuaU1haGFqYW5pbWFoam1ha2FNYWthc2FybWFrYXNhcm1hbGF5YWxhbU1hbGF5YWxhbW1hbmRNYW5kYWljbWFuZGFpY21hbmlNYW5pY2hhZWFubWFuaWNoYWVhbm1hcmNNYXJjaGVubWFyY2hlbm1hc2FyYW1nb25kaW1lZGVmYWlkcmluTWVkZWZhaWRyaW5tZWRmbWVldGVpbWF5ZWtNZWV0ZWlfTWF5ZWttZW5kTWVuZGVfS2lrYWt1aW1lbmRla2lrYWt1aW1lcmNNZXJvaXRpY19DdXJzaXZlbWVyb01lcm9pdGljX0hpZXJvZ2x5cGhzbWVyb2l0aWNjdXJzaXZlbWVyb2l0aWNoaWVyb2dseXBoc21pYW9NaWFvbWx5bW1vZGlNb2RpbW9uZ01vbmdvbGlhbm1vbmdvbGlhbm1yb01yb21yb29tdGVpbXVsdE11bHRhbmltdWx0YW5pbXlhbm1hck15YW5tYXJteW1ybmFiYXRhZWFuTmFiYXRhZWFubmFnbU5hZ19NdW5kYXJpbmFnbXVuZGFyaW5hbmROYW5kaW5hZ2FyaW5hbmRpbmFnYXJpbmFyYk9sZF9Ob3J0aF9BcmFiaWFubmJhdG5ld2FOZXdhbmV3dGFpbHVlTmV3X1RhaV9MdWVua29Oa29ua29vbnNodU51c2h1bnVzaHVueWlha2VuZ3B1YWNodWVobW9uZ29nYW1PZ2hhbW9naGFtb2xjaGlraU9sX0NoaWtpb2xja29sZGh1bmdhcmlhbm9sZGl0YWxpY29sZG5vcnRoYXJhYmlhbm9sZHBlcm1pY09sZF9QZXJtaWNvbGRwZXJzaWFuT2xkX1BlcnNpYW5vbGRzb2dkaWFuT2xkX1NvZ2RpYW5vbGRzb3V0aGFyYWJpYW5PbGRfU291dGhfQXJhYmlhbm9sZHR1cmtpY09sZF9UdXJraWNvbGR1eWdodXJPbGRfVXlnaHVyb3JpeWFPcml5YW9ya2hvcnlhb3NhZ2VPc2FnZW9zZ2Vvc21hT3NtYW55YW9zbWFueWFvdWdycGFoYXdoaG1vbmdwYWxtUGFsbXlyZW5lcGFsbXlyZW5lcGF1Y1BhdV9DaW5fSGF1cGF1Y2luaGF1cGVybXBoYWdQaGFnc19QYXBoYWdzcGFwaGxpcGhscFBzYWx0ZXJfUGFobGF2aXBobnhQaG9lbmljaWFucGhvZW5pY2lhbnBscmRwcnRpcHNhbHRlcnBhaGxhdmlxYWFjcWFhaXJlamFuZ1JlamFuZ3Jqbmdyb2hncnVuaWNSdW5pY3J1bnJzYW1hcml0YW5TYW1hcml0YW5zYW1yc2FyYnNhdXJTYXVyYXNodHJhc2F1cmFzaHRyYXNnbndTaWduV3JpdGluZ3NoYXJhZGFTaGFyYWRhc2hhdmlhblNoYXZpYW5zaGF3c2hyZHNpZGRTaWRkaGFtc2lkZGhhbXNpZ253cml0aW5nc2luZHNpbmhTaW5oYWxhc2luaGFsYXNvZ2RTb2dkaWFuc29nZGlhbnNvZ29zb3JhU29yYV9Tb21wZW5nc29yYXNvbXBlbmdzb3lvU295b21ib3NveW9tYm9zdW5kU3VuZGFuZXNlc3VuZGFuZXNlc3lsb1N5bG90aV9OYWdyaXN5bG90aW5hZ3Jpc3lyY1N5cmlhY3N5cmlhY3RhZ2Fsb2dUYWdhbG9ndGFnYlRhZ2JhbndhdGFnYmFud2F0YWlsZVRhaV9MZXRhaXRoYW10YWl2aWV0VGFpX1ZpZXR0YWtyVGFrcml0YWtyaXRhbGV0YWx1dGFtaWxUYW1pbHRhbWx0YW5nVGFuZ3V0dGFuZ3NhVGFuZ3NhdGFuZ3V0dGF2dHRlbHVUZWx1Z3V0ZWx1Z3V0Zm5nVGlmaW5hZ2h0Z2xndGhhYVRoYWFuYXRoYWFuYXRoYWlUaGFpdGliZXRhblRpYmV0YW50aWJ0dGlmaW5hZ2h0aXJoVGlyaHV0YXRpcmh1dGF0bnNhdG90b1RvdG91Z2FyVWdhcml0aWN1Z2FyaXRpY3ZhaVZhaXZhaWl2aXRoVml0aGt1cWl2aXRoa3VxaXdhbmNob1dhbmNob3dhcmFXYXJhbmdfQ2l0aXdhcmFuZ2NpdGl3Y2hveHBlb3hzdXh5ZXppWWV6aWRpeWV6aWRpeWlZaXlpaWl6YW5hYmF6YXJzcXVhcmVaYW5hYmF6YXJfU3F1YXJlemFuYnppbmh6eXl5enp6egAAABBmIgAFAAAAFWYiAAUAAAAaZiIABAAAABVmIgAFAAAAHmYiAAQAAAAiZiIAEgAAADRmIgAEAAAAOGYiAAQAAAA8ZiIAFAAAAFBmIgAVAAAAZWYiAAQAAABpZiIABgAAAG9mIgAGAAAAaWYiAAYAAAB1ZiIACAAAAH1mIgAIAAAAhWYiAAQAAACJZiIAEAAAAJlmIgAEAAAAfWYiAAgAAACdZiIABwAAAKRmIgAHAAAAq2YiAAQAAACkZiIABwAAAK9mIgAEAAAAs2YiAAgAAAC7ZiIACAAAALNmIgAIAAAAw2YiAAQAAADHZiIABQAAAMxmIgAFAAAAx2YiAAUAAADRZiIABAAAANVmIgAJAAAA3mYiAAgAAADVZiIACQAAAOZmIgAFAAAA62YiAAUAAADwZiIABAAAAOtmIgAFAAAA9GYiAAQAAAD4ZiIABwAAAP9mIgAHAAAA+GYiAAcAAAAGZyIACQAAAA9nIgAJAAAAGGciAAQAAAAPZyIACQAAABxnIgAEAAAAIGciAAgAAAAoZyIACAAAACBnIgAIAAAAMGciAAQAAAA0ZyIABgAAADpnIgAGAAAANGciAAYAAABAZyIABAAAAERnIgAHAAAAS2ciAAcAAABEZyIABwAAAFJnIgAEAAAAVmciAAgAAABeZyIACAAAAFZnIgAIAAAAZmciAAQAAABqZyIABQAAAG9nIgAFAAAAamciAAUAAAB0ZyIABAAAAHhnIgAGAAAAfmciABIAAACQZyIAEwAAAKNnIgAEAAAAkGciABMAAACnZyIABAAAAKtnIgAGAAAAsWciAAYAAACrZyIABgAAALdnIgARAAAAImYiABIAAADIZyIABgAAAHhnIgAGAAAAzmciAAQAAADSZyIABAAAANZnIgAEAAAA2mciAAgAAADiZyIACAAAANpnIgAIAAAA6mciAAoAAAD0ZyIACgAAAP5nIgAEAAAA9GciAAoAAAACaCIABgAAAAhoIgAGAAAADmgiAAQAAAASaCIABgAAABhoIgAGAAAAEmgiAAYAAAAeaCIABAAAACJoIgAMAAAALmgiAAQAAAAyaCIABwAAADloIgAJAAAAQmgiAAkAAABLaCIABwAAADJoIgAHAAAAUmgiAAsAAAAiaCIADAAAAF1oIgAIAAAAZWgiAAgAAABtaCIABAAAAGVoIgAIAAAAcWgiAAcAAAB4aCIABwAAAH9oIgAEAAAAg2giAAoAAACNaCIACgAAAINoIgAKAAAAl2giAAQAAACbaCIACwAAAKZoIgAKAAAAm2giAAsAAACwaCIABAAAALRoIgAFAAAAuWgiAAUAAAC0aCIABQAAAL5oIgAEAAAAeGgiAAcAAADCaCIABAAAAMZoIgAIAAAAzmgiAAgAAADGaCIACAAAANZoIgAEAAAA2mgiABQAAADuaCIAEwAAANpoIgAUAAAAAWkiAAQAAAAFaSIABwAAAAxpIgAHAAAABWkiAAcAAAATaSIABAAAABdpIgAHAAAAHmkiAAcAAAAXaSIABwAAACVpIgAEAAAAKWkiAAgAAAAxaSIACAAAAClpIgAIAAAAOWkiAAQAAAA9aSIACAAAAEVpIgAIAAAAPWkiAAgAAABNaSIABAAAAFFpIgAKAAAAW2kiAAoAAABRaSIACgAAAGVpIgAEAAAAaWkiAA0AAAB2aSIABAAAAHppIgANAAAAh2kiAAQAAACLaSIABgAAAJFpIgAGAAAAi2kiAAYAAACXaSIABAAAAJtpIgAHAAAAomkiAAcAAACbaSIABwAAAKlpIgAFAAAArmkiAAUAAACzaSIABAAAAK5pIgAFAAAAt2kiAAgAAAC/aSIACAAAAMdpIgAEAAAAv2kiAAgAAADLaSIADAAAAGlpIgANAAAA12kiAAgAAADfaSIACAAAAOdpIgAEAAAA32kiAAgAAADraSIAAwAAAO5pIgADAAAA8WkiAAQAAAD1aSIABgAAAPtpIgAGAAAA9WkiAAYAAAABaiIABAAAAO5pIgADAAAABWoiAA4AAAATaiIADwAAACJqIgAEAAAAJmoiAAcAAAAtaiIABwAAACZqIgAHAAAANGoiAAQAAAA4aiIABgAAAD5qIgAGAAAAOGoiAAYAAABEaiIABAAAAEhqIgAGAAAATmoiAAYAAABIaiIABgAAAFRqIgAEAAAAWGoiAAgAAABgaiIACAAAAFhqIgAIAAAAaGoiAAQAAABQZiIAFQAAAGxqIgAEAAAAcGoiAAwAAAB8aiIABAAAAIBqIgAWAAAAlmoiAAQAAACaaiIAFAAAAK5qIgAEAAAAsmoiAA0AAAC/aiIADwAAAIlmIgAQAAAAzmoiAAkAAADXaiIACQAAAOBqIgAUAAAA9GoiABUAAAAJayIAFQAAAB5rIgAWAAAANGsiAAQAAAA4ayIACgAAAEJrIgAEAAAARmsiAAgAAABOayIACAAAAEZrIgAIAAAAVmsiAAYAAABcayIABgAAAGJrIgAEAAAAZmsiAAgAAABuayIABAAAAHJrIgAIAAAAemsiAAcAAACBayIABwAAAIhrIgAIAAAAcmsiAAgAAACQayIAEgAAAJpqIgAUAAAAomsiAAQAAACmayIABAAAAKprIgAHAAAAZmsiAAgAAACxayIABAAAALVrIgAKAAAAv2siAAoAAAC1ayIACgAAAMlrIgARAAAA2msiABMAAADtayIABQAAAPJrIgAFAAAA92siAAQAAADyayIABQAAAPtrIgAEAAAA/2siAAYAAAAFbCIABgAAAP9rIgAGAAAAC2wiAAkAAAAUbCIACQAAAB1sIgAEAAAA2msiABMAAAAhbCIABAAAAIFrIgAHAAAAJWwiAAQAAABcayIABgAAAClsIgAEAAAALWwiAAgAAAA1bCIAAwAAADhsIgADAAAAO2wiAAQAAAA4bCIAAwAAAD9sIgAFAAAARGwiAAUAAABJbCIABAAAAERsIgAFAAAATWwiAAQAAABRbCIABgAAAFdsIgAGAAAAUWwiAAYAAABdbCIABAAAAGFsIgAFAAAAZmwiAAUAAABhbCIABQAAAGtsIgAEAAAAb2wiAAgAAAB3bCIABAAAAHtsIgAIAAAAg2wiAAcAAABvbCIACAAAAIpsIgAHAAAAe2wiAAgAAACRbCIABAAAAJVsIgAEAAAAmWwiAAQAAACdbCIABgAAAKNsIgAGAAAAnWwiAAYAAACpbCIABAAAAK1sIgAGAAAAs2wiAAYAAACtbCIABgAAALlsIgAIAAAAwWwiAAgAAADJbCIABAAAAMFsIgAIAAAAzWwiAAQAAADRbCIABwAAANhsIgAHAAAA0WwiAAcAAADfbCIACQAAAOhsIgAJAAAA8WwiAAQAAAD1bCIABwAAAPxsIgAHAAAA9WwiAAcAAAADbSIABAAAAAdtIgAKAAAAEW0iAAoAAAAHbSIACgAAABttIgAEAAAAH20iAAcAAAAmbSIABwAAAB9tIgAHAAAALW0iAAwAAAB6aSIADQAAADltIgALAAAARG0iAAsAAABPbSIABAAAAERtIgALAAAAU20iAAsAAABebSIADAAAAGptIgAEAAAAbm0iAA0AAAB7bSIADAAAAG5tIgANAAAAh20iAAQAAACLbSIAEAAAAJttIgAEAAAAn20iABQAAACzbSIADwAAAIttIgAQAAAAwm0iABMAAACfbSIAFAAAANVtIgAEAAAA2W0iAAQAAADdbSIABAAAAOhsIgAJAAAA4W0iAAQAAADlbSIABAAAAOltIgAEAAAA7W0iAAkAAAD2bSIACQAAAO1tIgAJAAAA/20iAAMAAAACbiIAAwAAAAVuIgAEAAAAAm4iAAMAAAAJbiIABAAAAF5tIgAMAAAADW4iAAQAAAARbiIABwAAABhuIgAHAAAAEW4iAAcAAAAfbiIABwAAACZuIgAHAAAALW4iAAQAAAAmbiIABwAAADFuIgAJAAAAOm4iAAkAAABDbiIABAAAAEduIgALAAAAUm4iAAoAAABHbiIACwAAAFxuIgAEAAAAYG4iAAsAAABrbiIACwAAAGBuIgALAAAAdm4iAAQAAAB6biIAEQAAAItuIgAEAAAAOm4iAAkAAACPbiIABAAAAJNuIgAEAAAAl24iAAkAAACgbiIACwAAAKtuIgADAAAArm4iAAMAAACxbiIABAAAAK5uIgADAAAAtW4iAAQAAAC5biIABQAAAL5uIgAFAAAAuW4iAAUAAADDbiIAFAAAAIBqIgAWAAAA124iAAQAAADbbiIABQAAAOBuIgAFAAAA224iAAUAAADlbiIABwAAAOxuIgAIAAAA9G4iAAQAAADsbiIACAAAAPhuIgAMAAAAsmoiAA0AAAAEbyIACQAAADhrIgAKAAAADW8iAA8AAAB6biIAEQAAABxvIgAJAAAAJW8iAAoAAAAvbyIACgAAADlvIgALAAAARG8iAAoAAABObyIACwAAAFlvIgAPAAAAaG8iABEAAAB5byIACQAAAIJvIgAKAAAAjG8iAAkAAACVbyIACgAAAJ9vIgAFAAAApG8iAAUAAACpbyIABAAAAIJvIgAKAAAArW8iAAQAAACkbyIABQAAALFvIgAFAAAAtm8iAAUAAAC7byIABAAAALZvIgAFAAAAv28iAAQAAADDbyIABwAAAMpvIgAH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CQAAOQkAADwJAABNCQAAUAkAAFQJAABYCQAAcAkAAIEJAACDCQAAhQkAAIwJAACPCQAAkAkAAJMJAACoCQAAqgkAALAJAACyCQAAsgkAALYJAAC5CQAAvAkAALwJAAC+CQAAxAkAAMcJAADICQAAywkAAM0JAADXCQAA1wkAANwJAADdCQAA3wkAAOMJAADmCQAA+gkAAAIKAAACCgAABQoAAAoKAAAPCgAAEAoAABMKAAAoCgAAKgoAADAKAAAyCgAAMwoAADUKAAA2CgAAOAoAADkKAAA8CgAAPAoAAD4KAABCCgAARwoAAEgKAABLCgAATQoAAFkKAABcCgAAXgoAAF4KAABmCgAAdAoAAIEKAACDCgAAhQoAAIsKAACNCgAAjQoAAI8KAACRCgAAkwoAAKgKAACqCgAAsAoAALIKAACzCgAAtQoAALkKAAC8CgAAxQoAAMcKAADJCgAAywoAAM0KAADQCgAA0AoAAOAKAADgCgAA5goAAO8KAAABCwAAAwsAAAULAAAMCwAADwsAABALAAATCwAAKAsAACoLAAAwCwAAMgsAADMLAAA2CwAAOQsAADwLAABDCwAARwsAAEgLAABLCwAATQsAAFYLAABXCwAAXAsAAF0LAABfCwAAYQsAAGYLAABwCwAAggsAAIMLAACFCwAAigsAAI4LAACQCwAAkgsAAJULAACZCwAAmgsAAJwLAACcCwAAngsAAJ8LAACjCwAApAsAAKgLAACqCwAArgsAALULAAC3CwAAuQsAAL4LAADCCwAAxgsAAMgLAADKCwAAzQsAANcLAADXCwAA5wsAAPILAAABDAAAAwwAAAUMAAAMDAAADgwAABAMAAASDAAAKAwAACoMAAAzDAAANQwAADkMAAA+DAAARAwAAEYMAABIDAAASgwAAE0MAABVDAAAVgwAAGAMAABhDAAAZgwAAG8MAACCDAAAgwwAAIUMAACMDAAAjgwAAJAMAACSDAAAqAwAAKoMAACzDAAAtQwAALkMAAC+DAAAxAwAAMYMAADIDAAAygwAAM0MAADVDAAA1gwAAN4MAADeDAAA4AwAAOEMAADmDAAA7wwAAAINAAADDQAABQ0AAAwNAAAODQAAEA0AABINAAAoDQAAKg0AADkNAAA+DQAAQw0AAEYNAABIDQAASg0AAE0NAABXDQAAVw0AAGANAABh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AwAAgQQAAIoEAAAvBQAAMQUAAFYFAABZBQAAWQUAAGAFAACIBQAA0AUAAOoFAADvBQAA8gUAACAGAABKBgAAbgYAAG8GAABxBgAA0wYAANUGAADVBgAA5QYAAOYGAADuBgAA7wYAAPoGAAD8BgAA/wYAAP8GAAAQBwAAEAcAABIHAAAvBwAATQcAAKUHAACxBwAAsQcAAMoHAADqBwAA9AcAAPUHAAD6BwAA+gcAAAAIAAAVCAAAGggAABoIAAAkCAAAJAgAACgIAAAoCAAAQAgAAFgIAABgCAAAaggAAHAIAACHCAAAiQgAAI4IAACgCAAAyQgAAAQJAAA5CQAAPQkAAD0JAABQCQAAUAkAAFgJAABhCQAAcQkAAIAJAACFCQAAjAkAAI8JAACQCQAAkwkAAKgJAACqCQAAsAkAALIJAACyCQAAtgkAALkJAAC9CQAAvQkAAM4JAADOCQAA3AkAAN0JAADfCQAA4QkAAPAJAADxCQAA/AkAAPwJAAAFCgAACgoAAA8KAAAQCgAAEwoAACgKAAAqCgAAMAoAADIKAAAzCgAANQoAADYKAAA4CgAAOQoAAFkKAABcCgAAXgoAAF4KAAByCgAAdAoAAIUKAACNCgAAjwoAAJEKAACTCgAAqAoAAKoKAACwCgAAsgoAALMKAAC1CgAAuQoAAL0KAAC9CgAA0AoAANAKAADgCgAA4QoAAPkKAAD5CgAABQsAAAwLAAAPCwAAEAsAABMLAAAoCwAAKgsAADALAAAyCwAAMwsAADULAAA5CwAAPQsAAD0LAABcCwAAXQsAAF8LAABhCwAAcQsAAHELAACDCwAAgwsAAIULAACKCwAAjgsAAJALAACSCwAAlQsAAJkLAACaCwAAnAsAAJwLAACeCwAAnwsAAKMLAACkCwAAqAsAAKoLAACuCwAAuQsAANALAADQCwAABQwAAAwMAAAODAAAEAwAABIMAAAoDAAAKgwAADkMAAA9DAAAPQwAAFgMAABaDAAAXQwAAF0MAABgDAAAYQwAAIAMAACADAAAhQwAAIwMAACODAAAkAwAAJIMAACoDAAAqgwAALMMAAC1DAAAuQwAAL0MAAC9DAAA3QwAAN4MAADgDAAA4QwAAPEMAADyDAAABA0AAAwNAAAODQAAEA0AABINAAA6DQAAPQ0AAD0NAABODQAATg0AAFQNAABW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AQAAKQEAACsBAAArAQAALQEAAC0BAAAvAQAALwEAADEBAAAxAQAAMwEAADMBAAA1AQAANQEAADcBAAA4AQAAOgEAADoBAAA8AQAAPAEAAD4BAAA+AQAAQAEAAEABAABCAQAAQgEAAEQBAABEAQAARgEAAEYBAABIAQAASQEAAEsBAABLAQAATQEAAE0BAABPAQAATwEAAFEBAABRAQAAUwEAAFMBAABVAQAAVQEAAFcBAABXAQAAWQEAAFkBAABbAQAAWwEAAF0BAABdAQAAXwEAAF8BAABhAQAAYQEAAGMBAABjAQAAZQEAAGUBAABnAQAAZwEAAGkBAABpAQAAawEAAGsBAABtAQAAbQEAAG8BAABvAQAAcQEAAHEBAABzAQAAcwEAAHUBAAB1AQAAdwEAAHcBAAB6AQAAegEAAHwBAAB8AQAAfgEAAIABAACDAQAAgwEAAIUBAACFAQAAiAEAAIgBAACMAQAAjQEAAJIBAACSAQAAlQEAAJUBAACZAQAAmwEAAJ4BAACeAQAAoQEAAKEBAACjAQAAowEAAKUBAAClAQAAqAEAAKgBAACqAQAAqwEAAK0BAACtAQAAsAEAALABAAC0AQAAtAEAALYBAAC2AQAAuQEAALoBAAC9AQAAvwEAAMYBAADGAQAAyQEAAMkBAADMAQAAzAEAAM4BAADOAQAA0AEAANABAADSAQAA0gEAANQBAADUAQAA1gEAANYBAADYAQAA2AEAANoBAADaAQAA3AEAAN0BAADfAQAA3wEAAOEBAADhAQAA4wEAAOMBAADlAQAA5QEAAOcBAADnAQAA6QEAAOkBAADrAQAA6wEAAO0BAADtAQAA7wEAAPABAADzAQAA8wEAAPUBAAD1AQAA+QEAAPkBAAD7AQAA+wEAAP0BAAD9AQAA/wEAAP8BAAABAgAAAQIAAAMCAAADAgAABQIAAAUCAAAHAgAABwIAAAkCAAAJAgAACwIAAAsCAAANAgAADQIAAA8CAAAPAgAAEQIAABECAAATAgAAEwIAABUCAAAVAgAAFwIAABcCAAAZAgAAGQIAABsCAAAbAgAAHQIAAB0CAAAfAgAAHwIAACECAAAhAgAAIwIAACMCAAAlAgAAJQIAACcCAAAnAgAAKQIAACkCAAArAgAAKwIAAC0CAAAtAgAALwIAAC8CAAAxAgAAMQIAADMCAAA5AgAAPAIAADwCAAA/AgAAQAIAAEICAABCAgAARwIAAEcCAABJAgAASQIAAEsCAABLAgAATQIAAE0CAABPAgAAkwIAAJUCAACvAgAAcQMAAHEDAABzAwAAcwMAAHcDAAB3AwAAewMAAH0DAACQAwAAkAMAAKwDAADOAwAA0AMAANEDAADVAwAA1wMAANkDAADZAwAA2wMAANsDAADdAwAA3QMAAN8DAADfAwAA4QMAAOEDAADjAwAA4wMAAOUDAADlAwAA5wMAAOcDAADpAwAA6QMAAOsDAADrAwAA7QMAAO0DAADvAwAA8wMAAPUDAAD1AwAA+AMAAPgDAAD7AwAA/AMAADAEAABfBAAAYQQAAGEEAABjBAAAYwQAAGUEAABlBAAAZwQAAGcEAABpBAAAaQQAAGsEAABrBAAAbQQAAG0EAABvBAAAbwQAAHEEAABxBAAAcwQAAHMEAAB1BAAAdQQAAHcEAAB3BAAAeQQAAHkEAAB7BAAAewQAAH0EAAB9BAAAfwQAAH8EAACBBAAAgQQAAIsEAACLBAAAjQQAAI0EAACPBAAAjwQAAJEEAACRBAAAkwQAAJMEAACVBAAAlQQAAJcEAACXBAAAmQQAAJkEAACbBAAAmwQAAJ0EAACdBAAAnwQAAJ8EAAChBAAAoQQAAKMEAACjBAAApQQAAKUEAACnBAAApwQAAKkEAACpBAAAqwQAAKsEAACtBAAArQQAAK8EAACvBAAAsQQAALEEAACzBAAAswQAALUEAAC1BAAAtwQAALcEAAC5BAAAuQQAALsEAAC7BAAAvQQAAL0EAAC/BAAAvwQAAMIEAADCBAAAxAQAAMQEAADGBAAAxgQAAMgEAADIBAAAygQAAMoEAADMBAAAzAQAAM4EAADPBAAA0QQAANEEAADTBAAA0wQAANUEAADVBAAA1wQAANcEAADZBAAA2QQAANsEAADbBAAA3QQAAN0EAADfBAAA3wQAAOEEAADhBAAA4wQAAOMEAADlBAAA5QQAAOcEAADnBAAA6QQAAOkEAADrBAAA6wQAAO0EAADtBAAA7wQAAO8EAADxBAAA8QQAAPMEAADzBAAA9QQAAPUEAAD3BAAA9wQAAPkEAAD5BAAA+wQAAPsEAAD9BAAA/QQAAP8EAAD/BAAAAQUAAAEFAAADBQAAAwUAAAUFAAAFBQAABwUAAAcFAAAJBQAACQUAAAsFAAALBQAADQUAAA0FAAAPBQAADwUAABEFAAARBQAAEwUAABMFAAAVBQAAFQUAABcFAAAXBQAAGQUAABkFAAAbBQAAGwUAAB0FAAAdBQAAHwUAAB8FAAAhBQAAIQUAACMFAAAjBQAAJQUAACUFAAAnBQAAJwUAACkFAAApBQAAKwUAACsFAAAtBQAALQUAAC8FAAAvBQAAYAUAAIgFAADQEAAA+hAAAP0QAAD/EAAA+BMAAP0TAACAHAAAiBwAAAAdAAArHQAAax0AAHcdAAB5HQAAmh0AAAEeAAABHgAAAx4AAAMeAAAFHgAABR4AAAceAAAHHgAACR4AAAkeAAALHgAACx4AAA0eAAANHgAADx4AAA8eAAARHgAAER4AABMeAAATHgAAFR4AABUeAAAXHgAAFx4AABkeAAAZHgAAGx4AABseAAAdHgAAHR4AAB8eAAAfHgAAIR4AACEeAAAjHgAAIx4AACUeAAAlHgAAJx4AACceAAApHgAAKR4AACseAAArHgAALR4AAC0eAAAvHgAALx4AADEeAAAxHgAAMx4AADMeAAA1HgAANR4AADceAAA3HgAAOR4AADkeAAA7HgAAOx4AAD0eAAA9HgAAPx4AAD8eAABBHgAAQR4AAEMeAABDHgAARR4AAEUeAABHHgAARx4AAEkeAABJHgAASx4AAEseAABNHgAATR4AAE8eAABPHgAAUR4AAFEeAABTHgAAUx4AAFUeAABVHgAAVx4AAFceAABZHgAAWR4AAFseAABbHgAAXR4AAF0eAABfHgAAXx4AAGEeAABhHgAAYx4AAGMeAABlHgAAZR4AAGceAABnHgAAaR4AAGkeAABrHgAAax4AAG0eAABtHgAAbx4AAG8eAABxHgAAcR4AAHMeAABzHgAAdR4AAHUeAAB3HgAAdx4AAHkeAAB5HgAAex4AAHseAAB9HgAAfR4AAH8eAAB/HgAAgR4AAIEeAACDHgAAgx4AAIUeAACFHgAAhx4AAIceAACJHgAAiR4AAIseAACLHgAAjR4AAI0eAACPHgAAjx4AAJEeAACRHgAAkx4AAJMeAACVHgAAnR4AAJ8eAACfHgAAoR4AAKEeAACjHgAAox4AAKUeAAClHgAApx4AAKceAACpHgAAqR4AAKseAACrHgAArR4AAK0eAACvHgAArx4AALEeAACxHgAAsx4AALMeAAC1HgAAtR4AALceAAC3HgAAuR4AALkeAAC7HgAAux4AAL0eAAC9HgAAvx4AAL8eAADBHgAAwR4AAMMeAADDHgAAxR4AAMUeAADHHgAAxx4AAMkeAADJHgAAyx4AAMseAADNHgAAzR4AAM8eAADPHgAA0R4AANEeAADTHgAA0x4AANUeAADVHgAA1x4AANceAADZHgAA2R4AANseAADbHgAA3R4AAN0eAADfHgAA3x4AAOEeAADhHgAA4x4AAOMeAADlHgAA5R4AAOceAADnHgAA6R4AAOkeAADrHgAA6x4AAO0eAADtHgAA7x4AAO8eAADxHgAA8R4AAPMeAADzHgAA9R4AAPUeAAD3HgAA9x4AAPkeAAD5HgAA+x4AAPseAAD9HgAA/R4AAP8eAAAHHwAAEB8AABUfAAAgHwAAJx8AADAfAAA3HwAAQB8AAEUfAABQHwAAVx8AAGAfAABnHwAAcB8AAH0fAACAHwAAhx8AAJAfAACXHwAAoB8AAKcfAACwHwAAtB8AALYfAAC3HwAAvh8AAL4fAADCHwAAxB8AAMYfAADHHwAA0B8AANMfAADWHwAA1x8AAOAfAADnHwAA8h8AAPQfAAD2HwAA9x8AAAohAAAKIQAADiEAAA8hAAATIQAAEyEAAC8hAAAvIQAANCEAADQhAAA5IQAAOSEAADwhAAA9IQAARiEAAEkhAABOIQAATiEAAIQhAACEIQAAMCwAAF8sAABhLAAAYSwAAGUsAABmLAAAaCwAAGgsAABqLAAAaiwAAGwsAABsLAAAcSwAAHEsAABzLAAAdCwAAHYsAAB7LAAAgSwAAIEsAACDLAAAgywAAIUsAACFLAAAhywAAIcsAACJLAAAiSwAAIssAACLLAAAjSwAAI0sAACPLAAAjywAAJEsAACRLAAAkywAAJMsAACVLAAAlSwAAJcsAACXLAAAmSwAAJksAACbLAAAmywAAJ0sAACdLAAAnywAAJ8sAAChLAAAoSwAAKMsAACjLAAApSwAAKUsAACnLAAApywAAKksAACpLAAAqywAAKssAACtLAAArSwAAK8sAACvLAAAsSwAALEsAACzLAAAsywAALUsAAC1LAAAtywAALcsAAC5LAAAuSwAALssAAC7LAAAvSwAAL0sAAC/LAAAvywAAMEsAADBLAAAwywAAMMsAADFLAAAxSwAAMcsAADHLAAAySwAAMksAADLLAAAyywAAM0sAADNLAAAzywAAM8sAADRLAAA0SwAANMsAADTLAAA1SwAANUsAADXLAAA1ywAANksAADZLAAA2ywAANssAADdLAAA3SwAAN8sAADfLAAA4SwAAOEsAADjLAAA5CwAAOwsAADsLAAA7iwAAO4sAADzLAAA8ywAAAAtAAAlLQAAJy0AACctAAAtLQAALS0AAEGmAABBpgAAQ6YAAEOmAABFpgAARaYAAEemAABHpgAASaYAAEmmAABLpgAAS6YAAE2mAABNpgAAT6YAAE+mAABRpgAAUaYAAFOmAABTpgAAVaYAAFWmAABXpgAAV6YAAFmmAABZpgAAW6YAAFumAABdpgAAXaYAAF+mAABfpgAAYaYAAGGmAABjpgAAY6YAAGWmAABlpgAAZ6YAAGemAABppgAAaaYAAGumAABrpgAAbaYAAG2mAACBpgAAgaYAAIOmAACDpgAAhaYAAIWmAACHpgAAh6YAAImmAACJpgAAi6YAAIumAACNpgAAjaYAAI+mAACPpgAAkaYAAJGmAACTpgAAk6YAAJWmAACVpgAAl6YAAJemAACZpgAAmaYAAJumAACbpgAAI6cAACOnAAAlpwAAJacAACenAAAnpwAAKacAACmnAAArpwAAK6cAAC2nAAAtpwAAL6cAADGnAAAzpwAAM6cAADWnAAA1pwAAN6cAADenAAA5pwAAOacAADunAAA7pwAAPacAAD2nAAA/pwAAP6cAAEGnAABBpwAAQ6cAAEOnAABFpwAARacAAEenAABHpwAASacAAEmnAABLpwAAS6cAAE2nAABNpwAAT6cAAE+nAABRpwAAUacAAFOnAABTpwAAVacAAFWnAABXpwAAV6cAAFmnAABZpwAAW6cAAFunAABdpwAAXacAAF+nAABfpwAAYacAAGGnAABjpwAAY6cAAGWnAABlpwAAZ6cAAGenAABppwAAaacAAGunAABrpwAAbacAAG2nAABvpwAAb6cAAHGnAAB4pwAAeqcAAHqnAAB8pwAAfKcAAH+nAAB/pwAAgacAAIGnAACDpwAAg6cAAIWnAACFpwAAh6cAAIenAACMpwAAjKcAAI6nAACOpwAAkacAAJGnAACTpwAAlacAAJenAACXpwAAmacAAJmnAACbpwAAm6cAAJ2nAACd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BgAA3QYAAN0GAAAOBwAADwcAAEsHAABMBwAAsgcAAL8HAAD7BwAA/AcAAC4IAAAvCAAAPwgAAD8IAABcCAAAXQgAAF8IAABfCAAAawgAAG8IAACPCAAAlwgAAOIIAADiCAAAhAkAAIQJAACNCQAAjgkAAJEJAACSCQAAqQkAAKkJAACxCQAAsQkAALMJAAC1CQAAugkAALsJAADFCQAAxgkAAMkJAADKCQAAzwkAANYJAADYCQAA2wkAAN4JAADeCQAA5AkAAOUJAAD/CQAAAAoAAAQKAAAECgAACwoAAA4KAAARCgAAEgoAACkKAAApCgAAMQoAADEKAAA0CgAANAoAADcKAAA3CgAAOgoAADsKAAA9CgAAPQoAAEMKAABGCgAASQoAAEoKAABOCgAAUAoAAFIKAABYCgAAXQoAAF0KAABfCgAAZQoAAHcKAACACgAAhAoAAIQKAACOCgAAjgoAAJIKAACSCgAAqQoAAKkKAACxCgAAsQoAALQKAAC0CgAAugoAALsKAADGCgAAxgoAAMoKAADKCgAAzgoAAM8KAADRCgAA3woAAOQKAADlCgAA8goAAPgKAAAACwAAAAsAAAQLAAAECwAADQsAAA4LAAARCwAAEgsAACkLAAApCwAAMQsAADELAAA0CwAANAsAADoLAAA7CwAARQsAAEYLAABJCwAASgsAAE4LAABUCwAAWAsAAFsLAABeCwAAXgsAAGQLAABlCwAAeAsAAIELAACECwAAhAsAAIsLAACNCwAAkQsAAJELAACWCwAAmAsAAJsLAACbCwAAnQsAAJ0LAACgCwAAogsAAKULAACnCwAAqwsAAK0LAAC6CwAAvQsAAMMLAADFCwAAyQsAAMkLAADOCwAAzwsAANELAADWCwAA2AsAAOULAAD7CwAA/wsAAA0MAAANDAAAEQwAABEMAAApDAAAKQwAADoMAAA7DAAARQwAAEUMAABJDAAASQwAAE4MAABUDAAAVwwAAFcMAABbDAAAXAwAAF4MAABfDAAAZAwAAGUMAABwDAAAdgwAAI0MAACNDAAAkQwAAJEMAACpDAAAqQwAALQMAAC0DAAAugwAALsMAADFDAAAxQwAAMkMAADJDAAAzgwAANQMAADXDAAA3AwAAN8MAADfDAAA5AwAAOUMAADwDAAA8AwAAPQMAAD/DAAADQ0AAA0NAAAR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FwAA6hcAAO8XAAD6FwAA/xcAABoYAAAfGAAAeRgAAH8YAACrGAAArxgAAPYYAAD/GAAAHxkAAB8ZAAAsGQAALxkAADwZAAA/GQAAQRkAAEMZAABuGQAAbxkAAHUZAAB/GQAArBkAAK8ZAADKGQAAzxkAANsZAADdGQAAHBoAAB0aAABfGgAAXxoAAH0aAAB+GgAAihoAAI8aAACaGgAAnxoAAK4aAACvGgAAzxoAAP8aAABNGwAATxsAAH8bAAB/GwAA9BsAAPsbAAA4HAAAOhwAAEocAABMHAAAiRwAAI8cAAC7HAAAvBwAAMgcAADPHAAA+xwAAP8cAAAWHwAAFx8AAB4fAAAfHwAARh8AAEcfAABOHwAATx8AAFgfAABYHwAAWh8AAFofAABcHwAAXB8AAF4fAABeHwAAfh8AAH8fAAC1HwAAtR8AAMUfAADFHwAA1B8AANUfAADcHwAA3B8AAPAfAADxHwAA9R8AAPUfAAD/HwAA/x8AAGUgAABlIAAAciAAAHMgAACPIAAAjyAAAJ0gAACfIAAAwSAAAM8gAADxIAAA/yAAAIwhAACPIQAAJyQAAD8kAABLJAAAXyQAAHQrAAB1KwAAlisAAJYrAAD0LAAA+CwAACYtAAAmLQAAKC0AACwtAAAuLQAALy0AAGgtAABuLQAAcS0AAH4tAACXLQAAny0AAKctAACnLQAAry0AAK8tAAC3LQAAty0AAL8tAAC/LQAAxy0AAMctAADPLQAAzy0AANctAADXLQAA3y0AAN8tAABeLgAAfy4AAJouAACaLgAA9C4AAP8uAADWLwAA7y8AAPwvAAD/LwAAQDAAAEAwAACXMAAAmDAAAAAxAAAEMQAAMDEAADAxAACPMQAAjzEAAOQxAADvMQAAHzIAAB8yAACNpAAAj6QAAMekAADPpAAALKYAAD+mAAD4pgAA/6YAAMunAADPpwAA0qcAANKnAADUpwAA1KcAANqnAADxpwAALagAAC+oAAA6qAAAP6gAAHioAAB/qAAAxqgAAM2oAADaqAAA36gAAFSpAABeqQAAfakAAH+pAADOqQAAzqkAANqpAADdqQAA/6kAAP+pAAA3qgAAP6oAAE6qAABPqgAAWqoAAFuqAADDqgAA2qoAAPeqAAAAqwAAB6sAAAirAAAPqwAAEKsAABerAAAfqwAAJ6sAACerAAAv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AQAAWgEAAFwBAABcAQAAXgEAAF4BAABgAQAAYAEAAGIBAABiAQAAZAEAAGQBAABmAQAAZgEAAGgBAABoAQAAagEAAGoBAABsAQAAbAEAAG4BAABuAQAAcAEAAHABAAByAQAAcgEAAHQBAAB0AQAAdgEAAHYBAAB4AQAAeQEAAHsBAAB7AQAAfQEAAH0BAACBAQAAggEAAIQBAACEAQAAhgEAAIcBAACJAQAAiwEAAI4BAACRAQAAkwEAAJQBAACWAQAAmAEAAJwBAACdAQAAnwEAAKABAACiAQAAogEAAKQBAACkAQAApgEAAKcBAACpAQAAqQEAAKwBAACsAQAArgEAAK8BAACxAQAAswEAALUBAAC1AQAAtwEAALgBAAC8AQAAvAEAAMQBAADEAQAAxwEAAMcBAADKAQAAygEAAM0BAADNAQAAzwEAAM8BAADRAQAA0QEAANMBAADTAQAA1QEAANUBAADXAQAA1wEAANkBAADZAQAA2wEAANsBAADeAQAA3gEAAOABAADgAQAA4gEAAOIBAADkAQAA5AEAAOYBAADmAQAA6AEAAOgBAADqAQAA6gEAAOwBAADsAQAA7gEAAO4BAADxAQAA8QEAAPQBAAD0AQAA9gEAAPgBAAD6AQAA+gEAAPwBAAD8AQAA/gEAAP4BAAAAAgAAAAIAAAICAAACAgAABAIAAAQCAAAGAgAABgIAAAgCAAAIAgAACgIAAAoCAAAMAgAADAIAAA4CAAAOAgAAEAIAABACAAASAgAAEgIAABQCAAAUAgAAFgIAABYCAAAYAgAAGAIAABoCAAAaAgAAHAIAABwCAAAeAgAAHgIAACACAAAgAgAAIgIAACICAAAkAgAAJAIAACYCAAAmAgAAKAIAACgCAAAqAgAAKgIAACwCAAAsAgAALgIAAC4CAAAwAgAAMAIAADICAAAyAgAAOgIAADsCAAA9AgAAPgIAAEECAABBAgAAQwIAAEYCAABIAgAASAIAAEoCAABKAgAATAIAAEwCAABOAgAATgIAAHADAABwAwAAcgMAAHIDAAB2AwAAdgMAAH8DAAB/AwAAhgMAAIYDAACIAwAAigMAAIwDAACMAwAAjgMAAI8DAACRAwAAoQMAAKMDAACrAwAAzwMAAM8DAADSAwAA1AMAANgDAADYAwAA2gMAANoDAADcAwAA3AMAAN4DAADeAwAA4AMAAOADAADiAwAA4gMAAOQDAADkAwAA5gMAAOYDAADoAwAA6AMAAOoDAADqAwAA7AMAAOwDAADuAwAA7gMAAPQDAAD0AwAA9wMAAPcDAAD5AwAA+gMAAP0DAAAvBAAAYAQAAGAEAABiBAAAYgQAAGQEAABkBAAAZgQAAGYEAABoBAAAaAQAAGoEAABqBAAAbAQAAGwEAABuBAAAbgQAAHAEAABwBAAAcgQAAHIEAAB0BAAAdAQAAHYEAAB2BAAAeAQAAHgEAAB6BAAAegQAAHwEAAB8BAAAfgQAAH4EAACABAAAgAQAAIoEAACKBAAAjAQAAIwEAACOBAAAjgQAAJAEAACQBAAAkgQAAJIEAACUBAAAlAQAAJYEAACWBAAAmAQAAJgEAACaBAAAmgQAAJwEAACcBAAAngQAAJ4EAACgBAAAoAQAAKIEAACiBAAApAQAAKQEAACmBAAApgQAAKgEAACoBAAAqgQAAKoEAACsBAAArAQAAK4EAACuBAAAsAQAALAEAACyBAAAsgQAALQEAAC0BAAAtgQAALYEAAC4BAAAuAQAALoEAAC6BAAAvAQAALwEAAC+BAAAvgQAAMAEAADBBAAAwwQAAMMEAADFBAAAxQQAAMcEAADHBAAAyQQAAMkEAADLBAAAywQAAM0EAADNBAAA0AQAANAEAADSBAAA0gQAANQEAADUBAAA1gQAANYEAADYBAAA2AQAANoEAADaBAAA3AQAANwEAADeBAAA3gQAAOAEAADgBAAA4gQAAOIEAADkBAAA5AQAAOYEAADmBAAA6AQAAOgEAADqBAAA6gQAAOwEAADsBAAA7gQAAO4EAADwBAAA8AQAAPIEAADyBAAA9AQAAPQEAAD2BAAA9gQAAPgEAAD4BAAA+gQAAPoEAAD8BAAA/AQAAP4EAAD+BAAAAAUAAAAFAAACBQAAAgUAAAQFAAAEBQAABgUAAAYFAAAIBQAACAUAAAoFAAAKBQAADAUAAAwFAAAOBQAADgUAABAFAAAQBQAAEgUAABIFAAAUBQAAFAUAABYFAAAWBQAAGAUAABgFAAAaBQAAGgUAABwFAAAcBQAAHgUAAB4FAAAgBQAAIAUAACIFAAAiBQAAJAUAACQFAAAmBQAAJgUAACgFAAAoBQAAKgUAACoFAAAsBQAALAUAAC4FAAAuBQAAMQUAAFYFAACgEAAAxRAAAMcQAADHEAAAzRAAAM0QAACgEwAA9RMAAJAcAAC6HAAAvRwAAL8cAAAAHgAAAB4AAAIeAAACHgAABB4AAAQeAAAGHgAABh4AAAgeAAAIHgAACh4AAAoeAAAMHgAADB4AAA4eAAAOHgAAEB4AABAeAAASHgAAEh4AABQeAAAUHgAAFh4AABYeAAAYHgAAGB4AABoeAAAaHgAAHB4AABweAAAeHgAAHh4AACAeAAAgHgAAIh4AACIeAAAkHgAAJB4AACYeAAAmHgAAKB4AACgeAAAqHgAAKh4AACweAAAsHgAALh4AAC4eAAAwHgAAMB4AADIeAAAyHgAANB4AADQeAAA2HgAANh4AADgeAAA4HgAAOh4AADoeAAA8HgAAPB4AAD4eAAA+HgAAQB4AAEAeAABCHgAAQh4AAEQeAABEHgAARh4AAEYeAABIHgAASB4AAEoeAABKHgAATB4AAEweAABOHgAATh4AAFAeAABQHgAAUh4AAFIeAABUHgAAVB4AAFYeAABWHgAAWB4AAFgeAABaHgAAWh4AAFweAABcHgAAXh4AAF4eAABgHgAAYB4AAGIeAABiHgAAZB4AAGQeAABmHgAAZh4AAGgeAABoHgAAah4AAGoeAABsHgAAbB4AAG4eAABuHgAAcB4AAHAeAAByHgAAch4AAHQeAAB0HgAAdh4AAHYeAAB4HgAAeB4AAHoeAAB6HgAAfB4AAHweAAB+HgAAfh4AAIAeAACAHgAAgh4AAIIeAACEHgAAhB4AAIYeAACGHgAAiB4AAIgeAACKHgAAih4AAIweAACMHgAAjh4AAI4eAACQHgAAkB4AAJIeAACSHgAAlB4AAJQeAACeHgAAnh4AAKAeAACgHgAAoh4AAKIeAACkHgAApB4AAKYeAACmHgAAqB4AAKgeAACqHgAAqh4AAKweAACsHgAArh4AAK4eAACwHgAAsB4AALIeAACyHgAAtB4AALQeAAC2HgAAth4AALgeAAC4HgAAuh4AALoeAAC8HgAAvB4AAL4eAAC+HgAAwB4AAMAeAADCHgAAwh4AAMQeAADEHgAAxh4AAMYeAADIHgAAyB4AAMoeAADKHgAAzB4AAMweAADOHgAAzh4AANAeAADQHgAA0h4AANIeAADUHgAA1B4AANYeAADWHgAA2B4AANgeAADaHgAA2h4AANweAADcHgAA3h4AAN4eAADgHgAA4B4AAOIeAADiHgAA5B4AAOQeAADmHgAA5h4AAOgeAADoHgAA6h4AAOoeAADsHgAA7B4AAO4eAADuHgAA8B4AAPAeAADyHgAA8h4AAPQeAAD0HgAA9h4AAPYeAAD4HgAA+B4AAPoeAAD6HgAA/B4AAPweAAD+HgAA/h4AAAgfAAAPHwAAGB8AAB0fAAAoHwAALx8AADgfAAA/HwAASB8AAE0fAABZHwAAWR8AAFsfAABbHwAAXR8AAF0fAABfHwAAXx8AAGgfAABvHwAAuB8AALsfAADIHwAAyx8AANgfAADbHwAA6B8AAOwfAAD4HwAA+x8AAAIhAAACIQAAByEAAAchAAALIQAADSEAABAhAAASIQAAFSEAABUhAAAZIQAAHSEAACQhAAAkIQAAJiEAACYhAAAoIQAAKCEAACohAAAtIQAAMCEAADMhAAA+IQAAPyEAAEUhAABFIQAAgyEAAIMhAAAALAAALywAAGAsAABgLAAAYiwAAGQsAABnLAAAZywAAGksAABpLAAAaywAAGssAABtLAAAcCwAAHIsAAByLAAAdSwAAHUsAAB+LAAAgCwAAIIsAACCLAAAhCwAAIQsAACGLAAAhiwAAIgsAACILAAAiiwAAIosAACMLAAAjCwAAI4sAACOLAAAkCwAAJAsAACSLAAAkiwAAJQsAACULAAAliwAAJYsAACYLAAAmCwAAJosAACaLAAAnCwAAJwsAACeLAAAniwAAKAsAACgLAAAoiwAAKIsAACkLAAApCwAAKYsAACmLAAAqCwAAKgsAACqLAAAqiwAAKwsAACsLAAAriwAAK4sAACwLAAAsCwAALIsAACyLAAAtCwAALQsAAC2LAAAtiwAALgsAAC4LAAAuiwAALosAAC8LAAAvCwAAL4sAAC+LAAAwCwAAMAsAADCLAAAwiwAAMQsAADELAAAxiwAAMYsAADILAAAyCwAAMosAADKLAAAzCwAAMwsAADOLAAAziwAANAsAADQLAAA0iwAANIsAADULAAA1CwAANYsAADWLAAA2CwAANgsAADaLAAA2iwAANwsAADcLAAA3iwAAN4sAADgLAAA4CwAAOIsAADiLAAA6ywAAOssAADtLAAA7SwAAPIsAADyLAAAQKYAAECmAABCpgAAQqYAAESmAABEpgAARqYAAEamAABIpgAASKYAAEqmAABKpgAATKYAAEymAABOpgAATqYAAFCmAABQpgAAUqYAAFKmAABUpgAAVKYAAFamAABWpgAAWKYAAFimAABapgAAWqYAAFymAABcpgAAXqYAAF6mAABgpgAAYKYAAGKmAABipgAAZKYAAGSmAABmpgAAZqYAAGimAABopgAAaqYAAGqmAABspgAAbKYAAICmAACApgAAgqYAAIKmAACEpgAAhKYAAIamAACGpgAAiKYAAIimAACKpgAAiqYAAIymAACMpgAAjqYAAI6mAACQpgAAkKYAAJKmAACSpgAAlKYAAJSmAACWpgAAlqYAAJimAACYpgAAmqYAAJqmAAAipwAAIqcAACSnAAAkpwAAJqcAACanAAAopwAAKKcAACqnAAAqpwAALKcAACynAAAupwAALqcAADKnAAAypwAANKcAADSnAAA2pwAANqcAADinAAA4pwAAOqcAADqnAAA8pwAAPKcAAD6nAAA+pwAAQKcAAECnAABCpwAAQqcAAESnAABEpwAARqcAAEanAABIpwAASKcAAEqnAABKpwAATKcAAEynAABOpwAATqcAAFCnAABQpwAAUqcAAFKnAABUpwAAVKcAAFanAABWpwAAWKcAAFinAABapwAAWqcAAFynAABcpwAAXqcAAF6nAABgpwAAYKcAAGKnAABipwAAZKcAAGSnAABmpwAAZqcAAGinAABopwAAaqcAAGqnAABspwAAbKcAAG6nAABupwAAeacAAHmnAAB7pwAAe6cAAH2nAAB+pwAAgKcAAICnAACCpwAAgqcAAISnAACEpwAAhqcAAIanAACLpwAAi6cAAI2nAACNpwAAkKcAAJCnAACSpwAAkqcAAJanAACWpwAAmKcAAJinAACapwAAmqcAAJynAACcpwAAnqcAAJ6nAACgpwAAoKcAAKKnAACipwAApKcAAKSnAACmpwAApqcAAKinAACopwAAqqcAAK6nAACwpwAAtKcAALanAAC2pwAAuKcAALinAAC6pwAAuqcAALynAAC8pwAAvqcAAL6nAADApwAAwKcAAMKnAADCpwAAxKcAAMenAADJpwAAyacAANCnAADQpwAA1qcAANanAADYpwAA2KcAAPWnAAD1pwAAIf8AADr/AAAABAEAJwQBALAEAQDTBAEAcAUBAHoFAQB8BQEAigUBAIwFAQCS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AAAAlW8iAAoAAABQyiMAAwAAAKRvIgAFAAAAaMojABIAAAC2byIABQAAAGilIwACAAAAw28iAAcAAAB4pSMAAgAAAHBqIgAMAAAAiKUjAAUAAADkbyIACQAAALClIwABAAAA+m8iAAsAAAC4pSMAAQAAABZwIgAIAAAA+MojAAMAAABAcCIACgAAAMilIwACAAAALXAiAA8AAAAQyyMABAAAAHhwIgAGAAAA8KUjAAIAAACLcCIABQAAAACmIwACAAAAnXAiAAkAAAAQpiMAAgAAALJwIgAKAAAAIKYjAAIAAADccCIABwAAADDLIwAGAAAA6nAiAAcAAAA4piMAAQAAAP1wIgAHAAAAQKYjAAIAAADKcCIACwAAAFCmIwADAAAAHnEiAAcAAABgyyMADgAAADBxIgAHAAAA0MsjAAIAAABGcSIADAAAANimIwACAAAAYXEiAAcAAADopiMAAQAAAHNxIgAJAAAA8KYjAAIAAACJcSIADAAAAODLIwADAAAApHEiAAYAAAD4yyMADAAAALdxIgAHAAAAWMwjAAMAAADCcSIACAAAAHDMIwAEAAAA13EiAAYAAACQzCMAAwAAAC1sIgAIAAAAYKcjAAUAAADrcSIACAAAAIinIwACAAAA93EiAAUAAACozCMABAAAAA5yIgAFAAAAyMwjABkAAAAnciIABgAAADioIwACAAAAG3IiAAYAAABIqCMABAAAADtyIgAGAAAAkM0jABEAAABbciIABgAAABjOIwAHAAAAa3IiAAQAAADYqCMAAgAAAHZyIgAHAAAA6KgjAAcAAABLciIACAAAACCpIwADAAAAjXIiAAcAAABQziMABgAAAKNyIgAEAAAASKkjAAEAAACrciIACAAAAFCpIwACAAAAvnIiAAMAAABgqSMAAQAAAMlyIgAIAAAAaKkjAAgAAADfciIABgAAAKipIwACAAAA6XIiAAsAAAC4qSMAAgAAAA5zIgAGAAAAgM4jAAcAAAAccyIAAgAAALjOIwAHAAAAMXMiABAAAADwqSMAAQAAADAAAAA5AAAAQQAAAEYAAABhAAAAZgAAAEEAAABaAAAAYQAAAHoAAACqAAAAqgAAALUAAAC1AAAAugAAALoAAADAAAAA1gAAANgAAAD2AAAA+AAAAMECAADGAgAA0QIAAOACAADkAgAA7AIAAOwCAADuAgAA7gIAAEUDAABFAwAAcAMAAHQDAAB2AwAAdwMAAHoDAAB9AwAAfwMAAH8DAACGAwAAhgMAAIgDAACKAwAAjAMAAIwDAACOAwAAoQMAAKMDAAD1AwAA9wMAAIEEAACKBAAALwUAADEFAABWBQAAWQUAAFkFAABgBQAAiAUAALAFAAC9BQAAvwUAAL8FAADBBQAAwgUAAMQFAADFBQAAxwUAAMcFAADQBQAA6gUAAO8FAADyBQAAEAYAABoGAAAgBgAAVwYAAFkGAABfBgAAbgYAANMGAADVBgAA3AYAAOEGAADoBgAA7QYAAO8GAAD6BgAA/AYAAP8GAAD/BgAAEAcAAD8HAABNBwAAsQcAAMoHAADqBwAA9AcAAPUHAAD6BwAA+gcAAAAIAAAXCAAAGggAACwIAABACAAAWAgAAGAIAABqCAAAcAgAAIcIAACJCAAAjggAAKAIAADJCAAA1AgAAN8IAADjCAAA6QgAAPAIAAA7CQAAPQkAAEwJAABOCQAAUAkAAFUJAABjCQAAcQkAAIMJAACFCQAAjAkAAI8JAACQCQAAkwkAAKgJAACqCQAAsAkAALIJAACyCQAAtgkAALkJAAC9CQAAxAkAAMcJAADICQAAywkAAMwJAADOCQAAzgkAANcJAADXCQAA3AkAAN0JAADfCQAA4wkAAPAJAADxCQAA/AkAAPwJAAABCgAAAwoAAAUKAAAKCgAADwoAABAKAAATCgAAKAoAACoKAAAwCgAAMgoAADMKAAA1CgAANgoAADgKAAA5CgAAPgoAAEIKAABHCgAASAoAAEsKAABMCgAAUQoAAFEKAABZCgAAXAoAAF4KAABeCgAAcAoAAHUKAACBCgAAgwoAAIUKAACNCgAAjwoAAJEKAACTCgAAqAoAAKoKAACwCgAAsgoAALMKAAC1CgAAuQoAAL0KAADFCgAAxwoAAMkKAADLCgAAzAoAANAKAADQCgAA4AoAAOMKAAD5CgAA/AoAAAELAAADCwAABQsAAAwLAAAPCwAAEAsAABMLAAAoCwAAKgsAADALAAAyCwAAMwsAADULAAA5CwAAPQsAAEQLAABHCwAASAsAAEsLAABMCwAAVgsAAFcLAABcCwAAXQsAAF8LAABjCwAAcQsAAHELAACCCwAAgwsAAIULAACKCwAAjgsAAJALAACSCwAAlQsAAJkLAACaCwAAnAsAAJwLAACeCwAAnwsAAKMLAACkCwAAqAsAAKoLAACuCwAAuQsAAL4LAADCCwAAxgsAAMgLAADKCwAAzAsAANALAADQCwAA1wsAANcLAAAADAAADAwAAA4MAAAQDAAAEgwAACgMAAAqDAAAOQwAAD0MAABEDAAARgwAAEgMAABKDAAATAwAAFUMAABWDAAAWAwAAFoMAABdDAAAXQwAAGAMAABjDAAAgAwAAIMMAACFDAAAjAwAAI4MAACQDAAAkgwAAKgMAACqDAAAswwAALUMAAC5DAAAvQwAAMQMAADGDAAAyAwAAMoMAADMDAAA1QwAANYMAADdDAAA3gwAAOAMAADjDAAA8QwAAPMMAAAADQAADA0AAA4NAAAQDQAAEg0AADoNAAA9DQAARA0AAEYNAABIDQAASg0AAEwNAABODQAATg0AAFQNAABXDQAAXw0AAGMNAAB6DQAAfw0AAIENAACDDQAAhQ0AAJYNAACaDQAAsQ0AALMNAAC7DQAAvQ0AAL0NAADADQAAxg0AAM8NAADUDQAA1g0AANYNAADYDQAA3w0AAPINAADzDQAAAQ4AADoOAABADgAARg4AAE0OAABNDgAAgQ4AAIIOAACEDgAAhA4AAIYOAACKDgAAjA4AAKMOAAClDgAApQ4AAKcOAAC5DgAAuw4AAL0OAADADgAAxA4AAMYOAADGDgAAzQ4AAM0OAADcDgAA3w4AAAAPAAAADwAAQA8AAEcPAABJDwAAbA8AAHEPAACDDwAAiA8AAJcPAACZDwAAvA8AAAAQAAA2EAAAOBAAADgQAAA7EAAAPxAAAFAQAACPEAAAmhAAAJ0QAACgEAAAxRAAAMcQAADHEAAAzRAAAM0QAADQEAAA+hAAAPwQAABIEgAAShIAAE0SAABQEgAAVhIAAFgSAABYEgAAWhIAAF0SAABgEgAAiBIAAIoSAACNEgAAkBIAALASAACyEgAAtRIAALgSAAC+EgAAwBIAAMASAADCEgAAxRIAAMgSAADWEgAA2BIAABATAAASEwAAFRMAABgTAABaEwAAgBMAAI8TAACgEwAA9RMAAPgTAAD9EwAAARQAAGwWAABvFgAAfxYAAIEWAACaFgAAoBYAAOoWAADuFgAA+BYAAAAXAAATFwAAHxcAADMXAABAFwAAUxcAAGAXAABsFwAAbhcAAHAXAAByFwAAcxcAAIAXAACzFwAAthcAAMgXAADXFwAA1xcAANwXAADcFwAAIBgAAHgYAACAGAAAqhgAALAYAAD1GAAAABkAAB4ZAAAgGQAAKxkAADAZAAA4GQAAUBkAAG0ZAABwGQAAdBkAAIAZAACrGQAAsBkAAMkZAAAAGgAAGxoAACAaAABeGgAAYRoAAHQaAACnGgAApxoAAL8aAADAGgAAzBoAAM4aAAAAGwAAMxsAADUbAABDGwAARRsAAEwbAACAGwAAqRsAAKwbAACvGwAAuhsAAOUbAADnGwAA8RsAAAAcAAA2HAAATRwAAE8cAABaHAAAfRwAAIAcAACIHAAAkBwAALocAAC9HAAAvxwAAOkcAADsHAAA7hwAAPMcAAD1HAAA9hwAAPocAAD6HAAAAB0AAL8dAADnHQAA9B0AAAAeAAAVHwAAGB8AAB0fAAAgHwAARR8AAEgfAABNHwAAUB8AAFcfAABZHwAAWR8AAFsfAABbHwAAXR8AAF0fAABfHwAAfR8AAIAfAAC0HwAAth8AALwfAAC+HwAAvh8AAMIfAADEHwAAxh8AAMwfAADQHwAA0x8AANYfAADbHwAA4B8AAOwfAADyHwAA9B8AAPYfAAD8HwAAcSAAAHEgAAB/IAAAfyAAAJAgAACcIAAAAiEAAAIhAAAHIQAAByEAAAohAAATIQAAFSEAABUhAAAZIQAAHSEAACQhAAAkIQAAJiEAACYhAAAoIQAAKCEAACohAAAtIQAALyEAADkhAAA8IQAAPyEAAEUhAABJIQAATiEAAE4hAABgIQAAiCEAALYkAADpJAAAACwAAOQsAADrLAAA7iwAAPIsAADzLAAAAC0AACUtAAAnLQAAJy0AAC0tAAAtLQAAMC0AAGctAABvLQAAby0AAIAtAACWLQAAoC0AAKYtAACoLQAAri0AALAtAAC2LQAAuC0AAL4tAADALQAAxi0AAMgtAADOLQAA0C0AANYtAADYLQAA3i0AAOAtAAD/LQAALy4AAC8uAAAFMAAABzAAACEwAAApMAAAMTAAADUwAAA4MAAAPDAAAEEwAACWMAAAnTAAAJ8wAAChMAAA+jAAAPwwAAD/MAAABTEAAC8xAAAxMQAAjjEAAKAxAAC/MQAA8DEAAP8xAAAANAAAv00AAABOAACMpAAA0KQAAP2kAAAApQAADKYAABCmAAAf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AQAANAEAADQBAAA2AQAANgEAADkBAAA5AQAAOwEAADsBAAA9AQAAPQEAAD8BAAA/AQAAQQEAAEEBAABDAQAAQwEAAEUBAABFAQAARwEAAEcBAABJAQAASgEAAEwBAABMAQAATgEAAE4BAABQAQAAUAEAAFIBAABSAQAAVAEAAFQBAABWAQAAVgEAAFgBAABYAQAAWgEAAFoBAABcAQAAXAEAAF4BAABeAQAAYAEAAGABAABiAQAAYgEAAGQBAABkAQAAZgEAAGYBAABoAQAAaAEAAGoBAABqAQAAbAEAAGwBAABuAQAAbgEAAHABAABwAQAAcgEAAHIBAAB0AQAAdAEAAHYBAAB2AQAAeAEAAHkBAAB7AQAAewEAAH0BAAB9AQAAfwEAAH8BAACBAQAAggEAAIQBAACEAQAAhgEAAIcBAACJAQAAiwEAAI4BAACRAQAAkwEAAJQBAACWAQAAmAEAAJwBAACdAQAAnwEAAKABAACiAQAAogEAAKQBAACkAQAApgEAAKcBAACpAQAAqQEAAKwBAACsAQAArgEAAK8BAACxAQAAswEAALUBAAC1AQAAtwEAALgBAAC8AQAAvAEAAMQBAADFAQAAxwEAAMgBAADKAQAAywEAAM0BAADNAQAAzwEAAM8BAADRAQAA0QEAANMBAADTAQAA1QEAANUBAADXAQAA1wEAANkBAADZAQAA2wEAANsBAADeAQAA3gEAAOABAADgAQAA4gEAAOIBAADkAQAA5AEAAOYBAADmAQAA6AEAAOgBAADqAQAA6gEAAOwBAADsAQAA7gEAAO4BAADxAQAA8gEAAPQBAAD0AQAA9gEAAPgBAAD6AQAA+gEAAPwBAAD8AQAA/gEAAP4BAAAAAgAAAAIAAAICAAACAgAABAIAAAQCAAAGAgAABgIAAAgCAAAIAgAACgIAAAoCAAAMAgAADAIAAA4CAAAOAgAAEAIAABACAAASAgAAEgIAABQCAAAUAgAAFgIAABYCAAAYAgAAGAIAABoCAAAaAgAAHAIAABwCAAAeAgAAHgIAACACAAAgAgAAIgIAACICAAAkAgAAJAIAACYCAAAmAgAAKAIAACgCAAAqAgAAKgIAACwCAAAsAgAALgIAAC4CAAAwAgAAMAIAADICAAAyAgAAOgIAADsCAAA9AgAAPgIAAEECAABBAgAAQwIAAEYCAABIAgAASAIAAEoCAABKAgAATAIAAEwCAABOAgAATgIAAEUDAABFAwAAcAMAAHADAAByAwAAcgMAAHYDAAB2AwAAfwMAAH8DAACGAwAAhgMAAIgDAACKAwAAjAMAAIwDAACOAwAAjwMAAJEDAAChAwAAowMAAKsDAADCAwAAwgMAAM8DAADRAwAA1QMAANYDAADYAwAA2AMAANoDAADaAwAA3AMAANwDAADeAwAA3gMAAOADAADgAwAA4gMAAOIDAADkAwAA5AMAAOYDAADmAwAA6AMAAOgDAADqAwAA6gMAAOwDAADsAwAA7gMAAO4DAADwAwAA8QMAAPQDAAD1AwAA9wMAAPcDAAD5AwAA+gMAAP0DAAAvBAAAYAQAAGAEAABiBAAAYgQAAGQEAABkBAAAZgQAAGYEAABoBAAAaAQAAGoEAABqBAAAbAQAAGwEAABuBAAAbgQAAHAEAABwBAAAcgQAAHIEAAB0BAAAdAQAAHYEAAB2BAAAeAQAAHgEAAB6BAAAegQAAHwEAAB8BAAAfgQAAH4EAACABAAAgAQAAIoEAACKBAAAjAQAAIwEAACOBAAAjgQAAJAEAACQBAAAkgQAAJIEAACUBAAAlAQAAJYEAACWBAAAmAQAAJgEAACaBAAAmgQAAJwEAACcBAAAngQAAJ4EAACgBAAAoAQAAKIEAACiBAAApAQAAKQEAACmBAAApgQAAKgEAACoBAAAqgQAAKoEAACsBAAArAQAAK4EAACuBAAAsAQAALAEAACyBAAAsgQAALQEAAC0BAAAtgQAALYEAAC4BAAAuAQAALoEAAC6BAAAvAQAALwEAAC+BAAAvgQAAMAEAADBBAAAwwQAAMMEAADFBAAAxQQAAMcEAADHBAAAyQQAAMkEAADLBAAAywQAAM0EAADNBAAA0AQAANAEAADSBAAA0gQAANQEAADUBAAA1gQAANYEAADYBAAA2AQAANoEAADaBAAA3AQAANwEAADeBAAA3gQAAOAEAADgBAAA4gQAAOIEAADkBAAA5AQAAOYEAADmBAAA6AQAAOgEAADqBAAA6gQAAOwEAADsBAAA7gQAAO4EAADwBAAA8AQAAPIEAADyBAAA9AQAAPQEAAD2BAAA9gQAAPgEAAD4BAAA+gQAAPoEAAD8BAAA/AQAAP4EAAD+BAAAAAUAAAAFAAACBQAAAgUAAAQFAAAEBQAABgUAAAYFAAAIBQAACAUAAAoFAAAKBQAADAUAAAwFAAAOBQAADgUAABAFAAAQBQAAEgUAABIFAAAUBQAAFAUAABYFAAAWBQAAGAUAABgFAAAaBQAAGgUAABwFAAAcBQAAHgUAAB4FAAAgBQAAIAUAACIFAAAiBQAAJAUAACQFAAAmBQAAJgUAACgFAAAoBQAAKgUAACoFAAAsBQAALAUAAC4FAAAuBQAAMQUAAFYFAACHBQAAhwUAAKAQAADFEAAAxxAAAMcQAADNEAAAzRAAAPgTAAD9EwAAgBwAAIgcAACQHAAAuhwAAL0cAAC/HAAAAB4AAAAeAAACHgAAAh4AAAQeAAAEHgAABh4AAAYeAAAIHgAACB4AAAoeAAAKHgAADB4AAAweAAAOHgAADh4AABAeAAAQHgAAEh4AABIeAAAUHgAAFB4AABYeAAAWHgAAGB4AABgeAAAaHgAAGh4AABweAAAcHgAAHh4AAB4eAAAgHgAAIB4AACIeAAAiHgAAJB4AACQeAAAmHgAAJh4AACgeAAAoHgAAKh4AACoeAAAsHgAALB4AAC4eAAAuHgAAMB4AADAeAAAyHgAAMh4AADQeAAA0HgAANh4AADYeAAA4HgAAOB4AADoeAAA6HgAAPB4AADweAAA+HgAAPh4AAEAeAABAHgAAQh4AAEIeAABEHgAARB4AAEYeAABGHgAASB4AAEgeAABKHgAASh4AAEweAABMHgAATh4AAE4eAABQHgAAUB4AAFIeAABSHgAAVB4AAFQeAABWHgAAVh4AAFgeAABYHgAAWh4AAFoeAABcHgAAXB4AAF4eAABeHgAAYB4AAGAeAABiHgAAYh4AAGQeAABkHgAAZh4AAGYeAABoHgAAaB4AAGoeAABqHgAAbB4AAGweAABuHgAAbh4AAHAeAABwHgAAch4AAHIeAAB0HgAAdB4AAHYeAAB2HgAAeB4AAHgeAAB6HgAAeh4AAHweAAB8HgAAfh4AAH4eAACAHgAAgB4AAIIeAACCHgAAhB4AAIQeAACGHgAAhh4AAIgeAACIHgAAih4AAIoeAACMHgAAjB4AAI4eAACOHgAAkB4AAJAeAACSHgAAkh4AAJQeAACUHgAAmh4AAJseAACeHgAAnh4AAKAeAACgHgAAoh4AAKIeAACkHgAApB4AAKYeAACmHgAAqB4AAKgeAACqHgAAqh4AAKweAACsHgAArh4AAK4eAACwHgAAsB4AALIeAACyHgAAtB4AALQeAAC2HgAAth4AALgeAAC4HgAAuh4AALoeAAC8HgAAvB4AAL4eAAC+HgAAwB4AAMAeAADCHgAAwh4AAMQeAADEHgAAxh4AAMYeAADIHgAAyB4AAMoeAADKHgAAzB4AAMweAADOHgAAzh4AANAeAADQHgAA0h4AANIeAADUHgAA1B4AANYeAADWHgAA2B4AANgeAADaHgAA2h4AANweAADcHgAA3h4AAN4eAADgHgAA4B4AAOIeAADiHgAA5B4AAOQeAADmHgAA5h4AAOgeAADoHgAA6h4AAOoeAADsHgAA7B4AAO4eAADuHgAA8B4AAPAeAADyHgAA8h4AAPQeAAD0HgAA9h4AAPYeAAD4HgAA+B4AAPoeAAD6HgAA/B4AAPweAAD+HgAA/h4AAAgfAAAPHwAAGB8AAB0fAAAoHwAALx8AADgfAAA/HwAASB8AAE0fAABZHwAAWR8AAFsfAABbHwAAXR8AAF0fAABfHwAAXx8AAGgfAABvHwAAgB8AAK8fAACyHwAAtB8AALcfAAC8HwAAwh8AAMQfAADHHwAAzB8AANgfAADbHwAA6B8AAOwfAADyHwAA9B8AAPcfAAD8HwAAJiEAACYhAAAqIQAAKyEAADIhAAAyIQAAYCEAAG8hAACDIQAAgyEAALYkAADPJAAAACwAAC8sAABgLAAAYCwAAGIsAABkLAAAZywAAGcsAABpLAAAaSwAAGssAABrLAAAbSwAAHAsAAByLAAAciwAAHUsAAB1LAAAfiwAAIAsAACCLAAAgiwAAIQsAACELAAAhiwAAIYsAACILAAAiCwAAIosAACKLAAAjCwAAIwsAACOLAAAjiwAAJAsAACQLAAAkiwAAJIsAACULAAAlCwAAJYsAACWLAAAmCwAAJgsAACaLAAAmiwAAJwsAACcLAAAniwAAJ4sAACgLAAAoCwAAKIsAACiLAAApCwAAKQsAACmLAAApiwAAKgsAACoLAAAqiwAAKosAACsLAAArCwAAK4sAACuLAAAsCwAALAsAACyLAAAsiwAALQsAAC0LAAAtiwAALYsAAC4LAAAuCwAALosAAC6LAAAvCwAALwsAAC+LAAAviwAAMAsAADALAAAwiwAAMIsAADELAAAxCwAAMYsAADGLAAAyCwAAMgsAADKLAAAyiwAAMwsAADMLAAAziwAAM4sAADQLAAA0CwAANIsAADSLAAA1CwAANQsAADWLAAA1iwAANgsAADYLAAA2iwAANosAADcLAAA3CwAAN4sAADeLAAA4CwAAOAsAADiLAAA4iwAAOssAADrLAAA7SwAAO0sAADyLAAA8iwAAECmAABApgAAQqYAAEKmAABEpgAARKYAAEamAABGpgAASKYAAEimAABKpgAASqYAAEymAABMpgAATqYAAE6mAABQpgAAUKYAAFKmAABSpgAAVKYAAFSmAABWpgAAVqYAAFimAABYpgAAWqYAAFqmAABcpgAAXKYAAF6mAABepgAAYKYAAGCmAABipgAAYqYAAGSmAABkpgAAZqYAAGamAABopgAAaKYAAGqmAABqpgAAbKYAAGymAACApgAAgKYAAIKmAACCpgAAhKYAAISmAACGpgAAhqYAAIimAACIpgAAiqYAAIqmAACMpgAAjKYAAI6mAACOpgAAkKYAAJCmAACSpgAAkqYAAJSmAACUpgAAlqYAAJamAACYpgAAmKYAAJqmAACapgAAIqcAACKnAAAkpwAAJKcAACanAAAmpwAAKKcAACinAAAqpwAAKqcAACynAAAspwAALqcAAC6nAAAypwAAMqcAADSnAAA0pwAANqcAADanAAA4pwAAOKcAADqnAAA6pwAAPKcAADynAAA+pwAAPqcAAECnAABApwAAQqcAAEKnAABEpwAARKcAAEanAABGpwAASKcAAEinAABKpwAASqcAAEynAABMpwAATqcAAE6nAABQpwAAUKcAAFKnAABSpwAAVKcAAFSnAABWpwAAVqcAAFinAABYpwAAWqcAAFqnAABcpwAAXKcAAF6nAABepwAAYKcAAGCnAABipwAAYqcAAGSnAABkpwAAZqcAAGanAABopwAAaKcAAGqnAABqpwAAbKcAAGynAABupwAAbqcAAHmnAAB5pwAAe6cAAHunAAB9pwAAfqcAAICnAACApwAAgqcAAIKnAACEpwAAhKcAAIanAACGpwAAi6cAAIunAACNpwAAjacAAJCnAACQpwAAkqcAAJKnAACWpwAAlqcAAJinAACYpwAAmqcAAJqnAACcpwAAnKcAAJ6nAACepwAAoKcAAKCnAACipwAAoqcAAKSnAACkpwAApqcAAKanAACo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AQAAfQEAAIEBAACCAQAAhAEAAIQBAACGAQAAhwEAAIkBAACLAQAAjgEAAJEBAACTAQAAlAEAAJYBAACYAQAAnAEAAJ0BAACfAQAAoAEAAKIBAACiAQAApAEAAKQBAACmAQAApwEAAKkBAACpAQAArAEAAKwBAACuAQAArwEAALEBAACzAQAAtQEAALUBAAC3AQAAuAEAALwBAAC8AQAAxAEAAMUBAADHAQAAyAEAAMoBAADLAQAAzQEAAM0BAADPAQAAzwEAANEBAADRAQAA0wEAANMBAADVAQAA1QEAANcBAADXAQAA2QEAANkBAADbAQAA2wEAAN4BAADeAQAA4AEAAOABAADiAQAA4gEAAOQBAADkAQAA5gEAAOYBAADoAQAA6AEAAOoBAADqAQAA7AEAAOwBAADuAQAA7gEAAPEBAADyAQAA9AEAAPQBAAD2AQAA+AEAAPoBAAD6AQAA/AEAAPwBAAD+AQAA/gEAAAACAAAAAgAAAgIAAAICAAAEAgAABAIAAAYCAAAGAgAACAIAAAgCAAAKAgAACgIAAAwCAAAMAgAADgIAAA4CAAAQAgAAEAIAABICAAASAgAAFAIAABQCAAAWAgAAFgIAABgCAAAYAgAAGgIAABoCAAAcAgAAHAIAAB4CAAAeAgAAIAIAACACAAAiAgAAIgIAACQCAAAkAgAAJgIAACYCAAAoAgAAKAIAACoCAAAqAgAALAIAACwCAAAuAgAALgIAADACAAAwAgAAMgIAADICAAA6AgAAOwIAAD0CAAA+AgAAQQIAAEECAABDAgAARgIAAEgCAABIAgAASgIAAEoCAABMAgAATAIAAE4CAABOAgAAcAMAAHADAAByAwAAcgMAAHYDAAB2AwAAfwMAAH8DAACGAwAAhgMAAIgDAACKAwAAjAMAAIwDAACOAwAAjwMAAJEDAAChAwAAowMAAKsDAADPAwAAzwMAANgDAADYAwAA2gMAANoDAADcAwAA3AMAAN4DAADeAwAA4AMAAOADAADiAwAA4gMAAOQDAADkAwAA5gMAAOYDAADoAwAA6AMAAOoDAADqAwAA7AMAAOwDAADuAwAA7gMAAPQDAAD0AwAA9wMAAPcDAAD5AwAA+gMAAP0DAAAvBAAAYAQAAGAEAABiBAAAYgQAAGQEAABkBAAAZgQAAGYEAABoBAAAaAQAAGoEAABqBAAAbAQAAGwEAABuBAAAbgQAAHAEAABwBAAAcgQAAHIEAAB0BAAAdAQAAHYEAAB2BAAAeAQAAHgEAAB6BAAAegQAAHwEAAB8BAAAfgQAAH4EAACABAAAgAQAAIoEAACKBAAAjAQAAIwEAACOBAAAjgQAAJAEAACQBAAAkgQAAJIEAACUBAAAlAQAAJYEAACWBAAAmAQAAJgEAACaBAAAmgQAAJwEAACcBAAAngQAAJ4EAACgBAAAoAQAAKIEAACiBAAApAQAAKQEAACmBAAApgQAAKgEAACoBAAAqgQAAKoEAACsBAAArAQAAK4EAACuBAAAsAQAALAEAACyBAAAsgQAALQEAAC0BAAAtgQAALYEAAC4BAAAuAQAALoEAAC6BAAAvAQAALwEAAC+BAAAvgQAAMAEAADBBAAAwwQAAMMEAADFBAAAxQQAAMcEAADHBAAAyQQAAMkEAADLBAAAywQAAM0EAADNBAAA0AQAANAEAADSBAAA0gQAANQEAADUBAAA1gQAANYEAADYBAAA2AQAANoEAADaBAAA3AQAANwEAADeBAAA3gQAAOAEAADgBAAA4gQAAOIEAADkBAAA5AQAAOYEAADmBAAA6AQAAOgEAADqBAAA6gQAAOwEAADsBAAA7gQAAO4EAADwBAAA8AQAAPIEAADyBAAA9AQAAPQEAAD2BAAA9gQAAPgEAAD4BAAA+gQAAPoEAAD8BAAA/AQAAP4EAAD+BAAAAAUAAAAFAAACBQAAAgUAAAQFAAAEBQAABgUAAAYFAAAIBQAACAUAAAoFAAAKBQAADAUAAAwFAAAOBQAADgUAABAFAAAQBQAAEgUAABIFAAAUBQAAFAUAABYFAAAWBQAAGAUAABgFAAAaBQAAGgUAABwFAAAcBQAAHgUAAB4FAAAgBQAAIAUAACIFAAAiBQAAJAUAACQFAAAmBQAAJgUAACgFAAAoBQAAKgUAACoFAAAsBQAALAUAAC4FAAAuBQAAMQUAAFYFAACgEAAAxRAAAMcQAADHEAAAzRAAAM0QAACgEwAA9RMAAJAcAAC6HAAAvRwAAL8cAAAAHgAAAB4AAAIeAAACHgAABB4AAAQeAAAGHgAABh4AAAgeAAAIHgAACh4AAAoeAAAMHgAADB4AAA4eAAAOHgAAEB4AABAeAAASHgAAEh4AABQeAAAUHgAAFh4AABYeAAAYHgAAGB4AABoeAAAaHgAAHB4AABweAAAeHgAAHh4AACAeAAAgHgAAIh4AACIeAAAkHgAAJB4AACYeAAAmHgAAKB4AACgeAAAqHgAAKh4AACweAAAsHgAALh4AAC4eAAAwHgAAMB4AADIeAAAyHgAANB4AADQeAAA2HgAANh4AADgeAAA4HgAAOh4AADoeAAA8HgAAPB4AAD4eAAA+HgAAQB4AAEAeAABCHgAAQh4AAEQeAABEHgAARh4AAEYeAABIHgAASB4AAEoeAABKHgAATB4AAEweAABOHgAATh4AAFAeAABQHgAAUh4AAFIeAABUHgAAVB4AAFYeAABWHgAAWB4AAFgeAABaHgAAWh4AAFweAABcHgAAXh4AAF4eAABgHgAAYB4AAGIeAABiHgAAZB4AAGQeAABmHgAAZh4AAGgeAABoHgAAah4AAGoeAABsHgAAbB4AAG4eAABuHgAAcB4AAHAeAAByHgAAch4AAHQeAAB0HgAAdh4AAHYeAAB4HgAAeB4AAHoeAAB6HgAAfB4AAHweAAB+HgAAfh4AAIAeAACAHgAAgh4AAIIeAACEHgAAhB4AAIYeAACGHgAAiB4AAIgeAACKHgAAih4AAIweAACMHgAAjh4AAI4eAACQHgAAkB4AAJIeAACSHgAAlB4AAJQeAACeHgAAnh4AAKAeAACgHgAAoh4AAKIeAACkHgAApB4AAKYeAACmHgAAqB4AAKgeAACqHgAAqh4AAKweAACsHgAArh4AAK4eAACwHgAAsB4AALIeAACyHgAAtB4AALQeAAC2HgAAth4AALgeAAC4HgAAuh4AALoeAAC8HgAAvB4AAL4eAAC+HgAAwB4AAMAeAADCHgAAwh4AAMQeAADEHgAAxh4AAMYeAADIHgAAyB4AAMoeAADKHgAAzB4AAMweAADOHgAAzh4AANAeAADQHgAA0h4AANIeAADUHgAA1B4AANYeAADWHgAA2B4AANgeAADaHgAA2h4AANweAADcHgAA3h4AAN4eAADgHgAA4B4AAOIeAADiHgAA5B4AAOQeAADmHgAA5h4AAOgeAADoHgAA6h4AAOoeAADsHgAA7B4AAO4eAADuHgAA8B4AAPAeAADyHgAA8h4AAPQeAAD0HgAA9h4AAPYeAAD4HgAA+B4AAPoeAAD6HgAA/B4AAPweAAD+HgAA/h4AAAgfAAAPHwAAGB8AAB0fAAAoHwAALx8AADgfAAA/HwAASB8AAE0fAABZHwAAWR8AAFsfAABbHwAAXR8AAF0fAABfHwAAXx8AAGgfAABvHwAAiB8AAI8fAACYHwAAnx8AAKgfAACvHwAAuB8AALwfAADIHwAAzB8AANgfAADbHwAA6B8AAOwfAAD4HwAA/B8AACYhAAAmIQAAKiEAACshAAAyIQAAMiEAAGAhAABvIQAAgyEAAIMhAAC2JAAAzyQAAAAsAAAvLAAAYCwAAGAsAABiLAAAZCwAAGcsAABnLAAAaSwAAGksAABrLAAAaywAAG0sAABwLAAAciwAAHIsAAB1LAAAdSwAAH4sAACALAAAgiwAAIIsAACELAAAhCwAAIYsAACGLAAAiCwAAIgsAACKLAAAiiwAAIwsAACMLAAAjiwAAI4sAACQLAAAkCwAAJIsAACSLAAAlCwAAJQsAACWLAAAliwAAJgsAACYLAAAmiwAAJosAACcLAAAnCwAAJ4sAACeLAAAoCwAAKAsAACiLAAAoiwAAKQsAACkLAAApiwAAKYsAACoLAAAqCwAAKosAACqLAAArCwAAKwsAACuLAAAriwAALAsAACwLAAAsiwAALIsAAC0LAAAtCwAALYsAAC2LAAAuCwAALgsAAC6LAAAuiwAALwsAAC8LAAAviwAAL4sAADALAAAwCwAAMIsAADCLAAAxCwAAMQsAADGLAAAxiwAAMgsAADILAAAyiwAAMosAADMLAAAzCwAAM4sAADOLAAA0CwAANAsAADSLAAA0iwAANQsAADULAAA1iwAANYsAADYLAAA2CwAANosAADaLAAA3CwAANwsAADeLAAA3iwAAOAsAADgLAAA4iwAAOIsAADrLAAA6ywAAO0sAADtLAAA8iwAAPIsAABApgAAQKYAAEKmAABCpgAARKYAAESmAABGpgAARqYAAEimAABIpgAASqYAAEqmAABMpgAATKYAAE6mAABOpgAAUKYAAFCmAABSpgAAUqYAAFSmAABUpgAAVqYAAFamAABYpgAAWKYAAFqmAABapgAAXKYAAFymAABepgAAXqYAAGCmAABgpgAAYqYAAGKmAABkpgAAZKYAAGamAABmpgAAaKYAAGimAABqpgAAaqYAAGymAABspgAAgKYAAICmAACCpgAAgqYAAISmAACEpgAAhqYAAIamAACIpgAAiKYAAIqmAACKpgAAjKYAAIymAACOpgAAjqYAAJCmAACQpgAAkqYAAJKmAACUpgAAlKYAAJamAACWpgAAmKYAAJimAACapgAAmqYAACKnAAAipwAAJKcAACSnAAAmpwAAJqcAACinAAAopwAAKqcAACqnAAAspwAALKcAAC6nAAAupwAAMqcAADKnAAA0pwAANKcAADanAAA2pwAAOKcAADinAAA6pwAAOqcAADynAAA8pwAAPqcAAD6nAABApwAAQKcAAEKnAABCpwAARKcAAESnAABGpwAARqcAAEinAABIpwAASqcAAEqnAABMpwAATKcAAE6nAABOpwAAUKcAAFCnAABSpwAAUqcAAFSnAABUpwAAVqcAAFanAABYpwAAWKcAAFqnAABapwAAXKcAAFynAABepwAAXqcAAGCnAABgpwAAYqcAAGKnAABkpwAAZKcAAGanAABmpwAAaKcAAGinAABqpwAAaqcAAGynAABspwAAbqcAAG6nAAB5pwAAeacAAHunAAB7pwAAfacAAH6nAACApwAAgKcAAIKnAACCpwAAhKcAAISnAACGpwAAhqcAAIunAACLpwAAjacAAI2nAACQpwAAkKcAAJKnAACSpwAAlqcAAJanAACYpwAAmKcAAJqnAACapwAAnKcAAJynAACepwAAnqcAAKCnAACgpwAAoqcAAKKnAACkpwAApKcAAKanAACmpwAAqKcAAKinAACqpwAArqcAALCnAAC0pwAAtqcAALanAAC4pwAAuKcAALqnAAC6pwAAvKcAALynAAC+pwAAvqcAAMCnAADApwAAwqcAAMKnAADEpwAAx6cAAMmnAADJpwAA0KcAANCnAADWpwAA1qcAANinAADYpwAA9acAAPWnAAAh/wAAOv8AAAAEAQAnBAEAsAQBANMEAQBwBQEAegUBAHwFAQCKBQEAjAUBAJIFAQCUBQEAlQUBAIAMAQCyDAEAoBgBAL8YAQBAbgEAX24BAADpAQAh6QEAYQAAAHoAAAC1AAAAtQAAAN8AAAD2AAAA+AAAAP8AAAABAQAAAQEAAAMBAAADAQAABQEAAAUBAAAHAQAABwEAAAkBAAAJAQAACwEAAAsBAAANAQAADQEAAA8BAAAPAQAAEQEAABEBAAATAQAAEwEAABUBAAAVAQAAFwEAABcBAAAZAQAAGQEAABsBAAAbAQAAHQEAAB0BAAAfAQAAHwEAACEBAAAhAQAAIwEAACMBAAAlAQAAJQEAACcBAAAnAQAAKQEAACkBAAArAQAAKwEAAC0BAAAtAQAALwEAAC8BAAAxAQAAMQEAADMBAAAzAQAANQEAADUBAAA3AQAANwEAADoBAAA6AQAAPAEAADwBAAA+AQAAPgEAAEABAABAAQAAQgEAAEIBAABEAQAARAEAAEYBAABGAQAASAEAAEkBAABLAQAASwEAAE0BAABNAQAATwEAAE8BAABRAQAAUQEAAFMBAABTAQAAVQEAAFUBAABXAQAAVwEAAFkBAABZAQAAWwEAAFsBAABdAQAAXQEAAF8BAABfAQAAYQEAAGEBAABjAQAAYwEAAGUBAABlAQAAZwEAAGcBAABpAQAAaQEAAGsBAABrAQAAbQEAAG0BAABvAQAAbwEAAHEBAABxAQAAcwEAAHMBAAB1AQAAdQEAAHcBAAB3AQAAegEAAHoBAAB8AQAAfAEAAH4BAACAAQAAgwEAAIMBAACFAQAAhQEAAIgBAACIAQAAjAEAAIwBAACSAQAAkgEAAJUBAACVAQAAmQEAAJoBAACeAQAAngEAAKEBAAChAQAAowEAAKMBAAClAQAApQEAAKgBAACoAQAArQEAAK0BAACwAQAAsAEAALQBAAC0AQAAtgEAALYBAAC5AQAAuQEAAL0BAAC9AQAAvwEAAL8BAADEAQAAxAEAAMYBAADHAQAAyQEAAMoBAADMAQAAzAEAAM4BAADOAQAA0AEAANABAADSAQAA0gEAANQBAADUAQAA1gEAANYBAADYAQAA2AEAANoBAADaAQAA3AEAAN0BAADfAQAA3wEAAOEBAADhAQAA4wEAAOMBAADlAQAA5QEAAOcBAADnAQAA6QEAAOkBAADrAQAA6wEAAO0BAADtAQAA7wEAAPEBAADzAQAA8wEAAPUBAAD1AQAA+QEAAPkBAAD7AQAA+wEAAP0BAAD9AQAA/wEAAP8BAAABAgAAAQIAAAMCAAADAgAABQIAAAUCAAAHAgAABwIAAAkCAAAJAgAACwIAAAsCAAANAgAADQIAAA8CAAAPAgAAEQIAABECAAATAgAAEwIAABUCAAAVAgAAFwIAABcCAAAZAgAAGQIAABsCAAAbAgAAHQIAAB0CAAAfAgAAHwIAACMCAAAjAgAAJQIAACUCAAAnAgAAJwIAACkCAAApAgAAKwIAACsCAAAtAgAALQIAAC8CAAAvAgAAMQIAADECAAAzAgAAMwIAADwCAAA8AgAAPwIAAEACAABCAgAAQgIAAEcCAABHAgAASQIAAEkCAABLAgAASwIAAE0CAABNAgAATwIAAFQCAABWAgAAVwIAAFkCAABZAgAAWwIAAFwCAABgAgAAYQIAAGMCAABjAgAAZQIAAGYCAABoAgAAbAIAAG8CAABvAgAAcQIAAHICAAB1AgAAdQIAAH0CAAB9AgAAgAIAAIACAACCAgAAgwIAAIcCAACMAgAAkgIAAJICAACdAgAAngIAAEUDAABFAwAAcQMAAHEDAABzAwAAcwMAAHcDAAB3AwAAewMAAH0DAACQAwAAkAMAAKwDAADOAwAA0AMAANEDAADVAwAA1wMAANkDAADZAwAA2wMAANsDAADdAwAA3QMAAN8DAADfAwAA4QMAAOEDAADjAwAA4wMAAOUDAADlAwAA5wMAAOcDAADpAwAA6QMAAOsDAADrAwAA7QMAAO0DAADvAwAA8wMAAPUDAAD1AwAA+AMAAPgDAAD7AwAA+wMAADAEAABfBAAAYQQAAGEEAABjBAAAYwQAAGUEAABlBAAAZwQAAGcEAABpBAAAaQQAAGsEAABrBAAAbQQAAG0EAABvBAAAbwQAAHEEAABxBAAAcwQAAHMEAAB1BAAAdQQAAHcEAAB3BAAAeQQAAHkEAAB7BAAAewQAAH0EAAB9BAAAfwQAAH8EAACBBAAAgQQAAIsEAACLBAAAjQQAAI0EAACPBAAAjwQAAJEEAACRBAAAkwQAAJMEAACVBAAAlQQAAJcEAACXBAAAmQQAAJkEAACbBAAAmwQAAJ0EAACdBAAAnwQAAJ8EAAChBAAAoQQAAKMEAACjBAAApQQAAKUEAACnBAAApwQAAKkEAACpBAAAqwQAAKsEAACtBAAArQQAAK8EAACvBAAAsQQAALEEAACzBAAAswQAALUEAAC1BAAAtwQAALcEAAC5BAAAuQQAALsEAAC7BAAAvQQAAL0EAAC/BAAAvwQAAMIEAADCBAAAxAQAAMQEAADGBAAAxgQAAMgEAADIBAAAygQAAMoEAADMBAAAzAQAAM4EAADPBAAA0QQAANEEAADTBAAA0wQAANUEAADVBAAA1wQAANcEAADZBAAA2QQAANsEAADbBAAA3QQAAN0EAADfBAAA3wQAAOEEAADhBAAA4wQAAOMEAADlBAAA5QQAAOcEAADnBAAA6QQAAOkEAADrBAAA6wQAAO0EAADtBAAA7wQAAO8EAADxBAAA8QQAAPMEAADzBAAA9QQAAPUEAAD3BAAA9wQAAPkEAAD5BAAA+wQAAPsEAAD9BAAA/QQAAP8EAAD/BAAAAQUAAAEFAAADBQAAAwUAAAUFAAAFBQAABwUAAAcFAAAJBQAACQUAAAsFAAALBQAADQUAAA0FAAAPBQAADwUAABEFAAARBQAAEwUAABMFAAAVBQAAFQUAABcFAAAXBQAAGQUAABkFAAAbBQAAGwUAAB0FAAAdBQAAHwUAAB8FAAAhBQAAIQUAACMFAAAjBQAAJQUAACUFAAAnBQAAJwUAACkFAAApBQAAKwUAACsFAAAtBQAALQUAAC8FAAAvBQAAYQUAAIcFAAD4EwAA/RMAAIAcAACIHAAAeR0AAHkdAAB9HQAAfR0AAI4dAACOHQAAAR4AAAEeAAADHgAAAx4AAAUeAAAFHgAABx4AAAceAAAJHgAACR4AAAseAAALHgAADR4AAA0eAAAPHgAADx4AABEeAAARHgAAEx4AABMeAAAVHgAAFR4AABceAAAXHgAAGR4AABkeAAAbHgAAGx4AAB0eAAAdHgAAHx4AAB8eAAAhHgAAIR4AACMeAAAjHgAAJR4AACUeAAAnHgAAJx4AACkeAAApHgAAKx4AACseAAAtHgAALR4AAC8eAAAvHgAAMR4AADEeAAAzHgAAMx4AADUeAAA1HgAANx4AADceAAA5HgAAOR4AADseAAA7HgAAPR4AAD0eAAA/HgAAPx4AAEEeAABBHgAAQx4AAEMeAABFHgAARR4AAEceAABHHgAASR4AAEkeAABLHgAASx4AAE0eAABNHgAATx4AAE8eAABRHgAAUR4AAFMeAABTHgAAVR4AAFUeAABXHgAAVx4AAFkeAABZHgAAWx4AAFseAABdHgAAXR4AAF8eAABfHgAAYR4AAGEeAABjHgAAYx4AAGUeAABlHgAAZx4AAGceAABpHgAAaR4AAGseAABrHgAAbR4AAG0eAABvHgAAbx4AAHEeAABxHgAAcx4AAHMeAAB1HgAAdR4AAHceAAB3HgAAeR4AAHkeAAB7HgAAex4AAH0eAAB9HgAAfx4AAH8eAACBHgAAgR4AAIMeAACDHgAAhR4AAIUeAACHHgAAhx4AAIkeAACJHgAAix4AAIseAACNHgAAjR4AAI8eAACPHgAAkR4AAJEeAACTHgAAkx4AAJUeAACbHgAAoR4AAKEeAACjHgAAox4AAKUeAAClHgAApx4AAKceAACpHgAAqR4AAKseAACrHgAArR4AAK0eAACvHgAArx4AALEeAACxHgAAsx4AALMeAAC1HgAAtR4AALceAAC3HgAAuR4AALkeAAC7HgAAux4AAL0eAAC9HgAAvx4AAL8eAADBHgAAwR4AAMMeAADDHgAAxR4AAMUeAADHHgAAxx4AAMkeAADJHgAAyx4AAMseAADNHgAAzR4AAM8eAADPHgAA0R4AANEeAADTHgAA0x4AANUeAADVHgAA1x4AANceAADZHgAA2R4AANseAADbHgAA3R4AAN0eAADfHgAA3x4AAOEeAADhHgAA4x4AAOMeAADlHgAA5R4AAOceAADnHgAA6R4AAOkeAADrHgAA6x4AAO0eAADtHgAA7x4AAO8eAADxHgAA8R4AAPMeAADzHgAA9R4AAPUeAAD3HgAA9x4AAPkeAAD5HgAA+x4AAPseAAD9HgAA/R4AAP8eAAAHHwAAEB8AABUfAAAgHwAAJx8AADAfAAA3HwAAQB8AAEUfAABQHwAAVx8AAGAfAABnHwAAcB8AAH0fAACAHwAAhx8AAJAfAACXHwAAoB8AAKcfAACwHwAAtB8AALYfAAC3HwAAvh8AAL4fAADCHwAAxB8AAMYfAADHHwAA0B8AANMfAADWHwAA1x8AAOAfAADnHwAA8h8AAPQfAAD2HwAA9x8AAE4hAABOIQAAcCEAAH8hAACEIQAAhCEAANAkAADpJAAAMCwAAF8sAABhLAAAYSwAAGUsAABmLAAAaCwAAGgsAABqLAAAaiwAAGwsAABsLAAAcywAAHMsAAB2LAAAdiwAAIEsAACBLAAAgywAAIMsAACFLAAAhSwAAIcsAACHLAAAiSwAAIksAACLLAAAiywAAI0sAACNLAAAjywAAI8sAACRLAAAkSwAAJMsAACTLAAAlSwAAJUsAACXLAAAlywAAJksAACZLAAAmywAAJssAACdLAAAnSwAAJ8sAACfLAAAoSwAAKEsAACjLAAAoywAAKUsAAClLAAApywAAKcsAACpLAAAqSwAAKssAACrLAAArSwAAK0sAACvLAAArywAALEsAACxLAAAsywAALMsAAC1LAAAtSwAALcsAAC3LAAAuSwAALksAAC7LAAAuywAAL0sAAC9LAAAvywAAL8sAADBLAAAwSwAAMMsAADDLAAAxSwAAMUsAADHLAAAxywAAMksAADJLAAAyywAAMssAADNLAAAzSwAAM8sAADPLAAA0SwAANEsAADTLAAA0ywAANUsAADVLAAA1ywAANcsAADZLAAA2SwAANssAADbLAAA3SwAAN0sAADfLAAA3ywAAOEsAADhLAAA4ywAAOMsAADsLAAA7CwAAO4sAADuLAAA8ywAAPMsAAAALQAAJS0AACctAAAnLQAALS0AAC0tAABBpgAAQaYAAEOmAABDpgAARaYAAEWmAABHpgAAR6YAAEmmAABJpgAAS6YAAEumAABNpgAATaYAAE+mAABPpgAAUaYAAFGmAABTpgAAU6YAAFWmAABVpgAAV6YAAFemAABZpgAAWaYAAFumAABbpgAAXaYAAF2mAABfpgAAX6YAAGGmAABhpgAAY6YAAGOmAABlpgAAZaYAAGemAABnpgAAaaYAAGmmAABrpgAAa6YAAG2mAABtpgAAgaYAAIGmAACDpgAAg6YAAIWmAACFpgAAh6YAAIemAACJpgAAiaYAAIumAACLpgAAjaYAAI2mAACPpgAAj6YAAJGmAACRpgAAk6YAAJOmAACVpgAAlaYAAJemAACXpgAAmaYAAJmmAACbpgAAm6YAACOnAAAjpwAAJacAACWnAAAnpwAAJ6cAACmnAAAppwAAK6cAACunAAAtpwAALacAAC+nAAAvpwAAM6cAADOnAAA1pwAANacAADenAAA3pwAAOacAADmnAAA7pwAAO6cAAD2nAAA9pwAAP6cAAD+nAABBpwAAQacAAEOnAABDpwAARacAAEWnAABHpwAAR6cAAEmnAABJpwAAS6cAAEunAABNpwAATacAAE+nAABPpwAAUacAAFGnAABTpwAAU6cAAFWnAABVpwAAV6cAAFenAABZpwAAWacAAFunAABbpwAAXacAAF2nAABfpwAAX6cAAGGnAABhpwAAY6cAAGOnAABlpwAAZacAAGenAABnpwAAaacAAGmnAABrpwAAa6cAAG2nAABtpwAAb6cAAG+nAAB6pwAAeqcAAHynAAB8pwAAf6cAAH+nAACBpwAAgacAAIOnAACDpwAAhacAAIWnAACHpwAAh6cAAIynAACMpwAAkacAAJGnAACTpwAAlKcAAJenAACXpwAAmacAAJmnAACbpwAAm6cAAJ2nAACdpwAAn6cAAJ+nAAChpwAAoacAAKOnAACjpwAApacAAKWnAACnpwAAp6cAAKmnAACppwAAtacAALWnAAC3pwAAt6cAALmnAAC5pwAAu6cAALunAAC9pwAAvacAAL+nAAC/pwAAwacAAMGnAADDpwAAw6cAAMinAADIpwAAyqcAAMqnAADRpwAA0acAANenAADXpwAA2acAANmnAAD2pwAA9qcAAFOrAABTqwAAcKsAAL+rAAAA+wAABvsAABP7AAAX+wAAQf8AAFr/AAAoBAEATwQBANgEAQD7BAEAlwUBAKEFAQCjBQEAsQUBALMFAQC5BQEAuwUBALwFAQDADAEA8gwBAMAYAQDfGAEAYG4BAH9uAQAi6QEAQ+kBAGEAAAB6AAAAtQAAALUAAADfAAAA9gAAAPgAAAD/AAAAAQEAAAEBAAADAQAAAwEAAAUBAAAFAQAABwEAAAcBAAAJAQAACQEAAAsBAAALAQAADQEAAA0BAAAPAQAADwEAABEBAAARAQAAEwEAABMBAAAVAQAAFQEAABcBAAAXAQAAGQEAABkBAAAbAQAAGwEAAB0BAAAdAQAAHwEAAB8BAAAhAQAAIQEAACMBAAAjAQAAJQEAACUBAAAnAQAAJwEAACkBAAApAQAAKwEAACsBAAAtAQAALQEAAC8BAAAvAQAAMQEAADEBAAAzAQAAMwEAADUBAAA1AQAANwEAADcBAAA6AQAAOgEAADwBAAA8AQAAPgEAAD4BAABAAQAAQAEAAEIBAABCAQAARAEAAEQBAABGAQAARgEAAEgBAABJAQAASwEAAEsBAABNAQAATQEAAE8BAABPAQAAUQEAAFEBAABTAQAAUwEAAFUBAABVAQAAVwEAAFcBAABZAQAAWQEAAFsBAABbAQAAXQEAAF0BAABfAQAAXwEAAGEBAABhAQAAYwEAAGMBAABlAQAAZQEAAGcBAABnAQAAaQEAAGkBAABrAQAAawEAAG0BAABtAQAAbwEAAG8BAABxAQAAcQEAAHMBAABzAQAAdQEAAHUBAAB3AQAAdwEAAHoBAAB6AQAAfAEAAHwBAAB+AQAAgAEAAIMBAACDAQAAhQEAAIUBAACIAQAAiAEAAIwBAACMAQAAkgEAAJIBAACVAQAAlQEAAJkBAACaAQAAngEAAJ4BAAChAQAAoQEAAKMBAACjAQAApQEAAKUBAACoAQAAqAEAAK0BAACtAQAAsAEAALABAAC0AQAAtAEAALYBAAC2AQAAuQEAALkBAAC9AQAAvQEAAL8BAAC/AQAAxQEAAMYBAADIAQAAyQEAAMsBAADMAQAAzgEAAM4BAADQAQAA0AEAANIBAADSAQAA1AEAANQBAADWAQAA1gEAANgBAADYAQAA2gEAANoBAADcAQAA3QEAAN8BAADfAQAA4QEAAOEBAADjAQAA4wEAAOUBAADlAQAA5wEAAOcBAADpAQAA6QEAAOsBAADrAQAA7QEAAO0BAADvAQAA8AEAAPIBAADzAQAA9QEAAPUBAAD5AQAA+QEAAPsBAAD7AQAA/QEAAP0BAAD/AQAA/wEAAAECAAABAgAAAwIAAAMCAAAFAgAABQIAAAcCAAAHAgAACQIAAAkCAAALAgAACwIAAA0CAAANAgAADwIAAA8CAAARAgAAEQIAABMCAAATAgAAFQIAABUCAAAXAgAAFwIAABkCAAAZAgAAGwIAABsCAAAdAgAAHQIAAB8CAAAfAgAAIwIAACMCAAAlAgAAJQIAACcCAAAnAgAAKQIAACkCAAArAgAAKwIAAC0CAAAtAgAALwIAAC8CAAAxAgAAMQIAADMCAAAzAgAAPAIAADwCAAA/AgAAQAIAAEICAABCAgAARwIAAEcCAABJAgAASQIAAEsCAABLAgAATQIAAE0CAABPAgAAVAIAAFYCAABXAgAAWQIAAFkCAABbAgAAXAIAAGACAABhAgAAYwIAAGMCAABlAgAAZgIAAGgCAABsAgAAbwIAAG8CAABxAgAAcgIAAHUCAAB1AgAAfQIAAH0CAACAAgAAgAIAAIICAACDAgAAhwIAAIwCAACSAgAAkgIAAJ0CAACeAgAARQMAAEUDAABxAwAAcQMAAHMDAABzAwAAdwMAAHcDAAB7AwAAfQMAAJADAACQAwAArAMAAM4DAADQAwAA0QMAANUDAADXAwAA2QMAANkDAADbAwAA2wMAAN0DAADdAwAA3wMAAN8DAADhAwAA4QMAAOMDAADjAwAA5QMAAOUDAADnAwAA5wMAAOkDAADpAwAA6wMAAOsDAADtAwAA7QMAAO8DAADzAwAA9QMAAPUDAAD4AwAA+AMAAPsDAAD7AwAAMAQAAF8EAABhBAAAYQQAAGMEAABjBAAAZQQAAGUEAABnBAAAZwQAAGkEAABpBAAAawQAAGsEAABtBAAAbQQAAG8EAABvBAAAcQQAAHEEAABzBAAAcwQAAHUEAAB1BAAAdwQAAHcEAAB5BAAAeQQAAHsEAAB7BAAAfQQAAH0EAAB/BAAAfwQAAIEEAACBBAAAiwQAAIsEAACNBAAAjQQAAI8EAACPBAAAkQQAAJEEAACTBAAAkwQAAJUEAACVBAAAlwQAAJcEAACZBAAAmQQAAJsEAACbBAAAnQQAAJ0EAACfBAAAnwQAAKEEAAChBAAAowQAAKMEAAClBAAApQQAAKcEAACnBAAAqQQAAKkEAACrBAAAqwQAAK0EAACtBAAArwQAAK8EAACxBAAAsQQAALMEAACzBAAAtQQAALUEAAC3BAAAtwQAALkEAAC5BAAAuwQAALsEAAC9BAAAvQQAAL8EAAC/BAAAwgQAAMIEAADEBAAAxAQAAMYEAADGBAAAyAQAAMgEAADKBAAAygQAAMwEAADMBAAAzgQAAM8EAADRBAAA0QQAANMEAADTBAAA1QQAANUEAADXBAAA1wQAANkEAADZBAAA2wQAANsEAADdBAAA3QQAAN8EAADfBAAA4QQAAOEEAADjBAAA4wQAAOUEAADlBAAA5wQAAOcEAADpBAAA6QQAAOsEAADrBAAA7QQAAO0EAADvBAAA7wQAAPEEAADxBAAA8wQAAPMEAAD1BAAA9QQAAPcEAAD3BAAA+QQAAPkEAAD7BAAA+wQAAP0EAAD9BAAA/wQAAP8EAAABBQAAAQUAAAMFAAADBQAABQUAAAUFAAAHBQAABwUAAAkFAAAJBQAACwUAAAsFAAANBQAADQUAAA8FAAAPBQAAEQUAABEFAAATBQAAEwUAABUFAAAVBQAAFwUAABcFAAAZBQAAGQUAABsFAAAbBQAAHQUAAB0FAAAfBQAAHwUAACEFAAAhBQAAIwUAACMFAAAlBQAAJQUAACcFAAAnBQAAKQUAACkFAAArBQAAKwUAAC0FAAAtBQAALwUAAC8FAABhBQAAhwUAANAQAAD6EAAA/RAAAP8QAAD4EwAA/RMAAIAcAACIHAAAeR0AAHkdAAB9HQAAfR0AAI4dAACOHQAAAR4AAAEeAAADHgAAAx4AAAUeAAAFHgAABx4AAAceAAAJHgAACR4AAAseAAALHgAADR4AAA0eAAAPHgAADx4AABEeAAARHgAAEx4AABMeAAAVHgAAFR4AABceAAAXHgAAGR4AABkeAAAbHgAAGx4AAB0eAAAdHgAAHx4AAB8eAAAhHgAAIR4AACMeAAAjHgAAJR4AACUeAAAnHgAAJx4AACkeAAApHgAAKx4AACseAAAtHgAALR4AAC8eAAAvHgAAMR4AADEeAAAzHgAAMx4AADUeAAA1HgAANx4AADceAAA5HgAAOR4AADseAAA7HgAAPR4AAD0eAAA/HgAAPx4AAEEeAABBHgAAQx4AAEMeAABFHgAARR4AAEceAABHHgAASR4AAEkeAABLHgAASx4AAE0eAABNHgAATx4AAE8eAABRHgAAUR4AAFMeAABTHgAAVR4AAFUeAABXHgAAVx4AAFkeAABZHgAAWx4AAFseAABdHgAAXR4AAF8eAABfHgAAYR4AAGEeAABjHgAAYx4AAGUeAABlHgAAZx4AAGceAABpHgAAaR4AAGseAABrHgAAbR4AAG0eAABvHgAAbx4AAHEeAABxHgAAcx4AAHMeAAB1HgAAdR4AAHceAAB3HgAAeR4AAHkeAAB7HgAAex4AAH0eAAB9HgAAfx4AAH8eAACBHgAAgR4AAIMeAACDHgAAhR4AAIUeAACHHgAAhx4AAIkeAACJHgAAix4AAIseAACNHgAAjR4AAI8eAACPHgAAkR4AAJEeAACTHgAAkx4AAJUeAACbHgAAoR4AAKEeAACjHgAAox4AAKUeAAClHgAApx4AAKceAACpHgAAqR4AAKseAACrHgAArR4AAK0eAACvHgAArx4AALEeAACxHgAAsx4AALMeAAC1HgAAtR4AALceAAC3HgAAuR4AALkeAAC7HgAAux4AAL0eAAC9HgAAvx4AAL8eAADBHgAAwR4AAMMeAADDHgAAxR4AAMUeAADHHgAAxx4AAMkeAADJHgAAyx4AAMseAADNHgAAzR4AAM8eAADPHgAA0R4AANEeAADTHgAA0x4AANUeAADVHgAA1x4AANceAADZHgAA2R4AANseAADbHgAA3R4AAN0eAADfHgAA3x4AAOEeAADhHgAA4x4AAOMeAADlHgAA5R4AAOceAADnHgAA6R4AAOkeAADrHgAA6x4AAO0eAADtHgAA7x4AAO8eAADxHgAA8R4AAPMeAADzHgAA9R4AAPUeAAD3HgAA9x4AAPkeAAD5HgAA+x4AAPseAAD9HgAA/R4AAP8eAAAHHwAAEB8AABUfAAAgHwAAJx8AADAfAAA3HwAAQB8AAEUfAABQHwAAVx8AAGAfAABnHwAAcB8AAH0fAACAHwAAtB8AALYfAAC3HwAAvB8AALwfAAC+HwAAvh8AAMIfAADEHwAAxh8AAMcfAADMHwAAzB8AANAfAADTHwAA1h8AANcfAADgHwAA5x8AAPIfAAD0HwAA9h8AAPcfAAD8HwAA/B8AAE4hAABOIQAAcCEAAH8hAACEIQAAhCEAANAkAADpJAAAMCwAAF8sAABhLAAAYSwAAGUsAABmLAAAaCwAAGgsAABqLAAAaiwAAGwsAABsLAAAcywAAHMsAAB2LAAAdiwAAIEsAACBLAAAgywAAIMsAACFLAAAhSwAAIcsAACHLAAAiSwAAIksAACLLAAAiywAAI0sAACNLAAAjywAAI8sAACRLAAAkSwAAJMsAACTLAAAlSwAAJUsAACXLAAAlywAAJksAACZLAAAmywAAJssAACdLAAAnSwAAJ8sAACfLAAAoSwAAKEsAACjLAAAoywAAKUsAAClLAAApywAAKcsAACpLAAAqSwAAKssAACrLAAArSwAAK0sAACvLAAArywAALEsAACxLAAAsywAALMsAAC1LAAAtSwAALcsAAC3LAAAuSwAALksAAC7LAAAuywAAL0sAAC9LAAAvywAAL8sAADBLAAAwSwAAMMsAADDLAAAxSwAAMUsAADHLAAAxywAAMksAADJLAAAyywAAMssAADNLAAAzSwAAM8sAADPLAAA0SwAANEsAADTLAAA0ywAANUsAADVLAAA1ywAANcsAADZLAAA2SwAANssAADbLAAA3SwAAN0sAADfLAAA3ywAAOEsAADhLAAA4ywAAOMsAADsLAAA7CwAAO4sAADuLAAA8ywAAPMsAAAALQAAJS0AACctAAAnLQAALS0AAC0tAABBpgAAQaYAAEOmAABDpgAARaYAAEWmAABHpgAAR6YAAEmmAABJpgAAS6YAAEumAABNpgAATaYAAE+mAABPpgAAUaYAAFGmAABTpgAAU6YAAFWmAABVpgAAV6YAAFemAABZpgAAWaYAAFumAABbpgAAXaYAAF2mAABfpgAAX6YAAGGmAABhpgAAY6YAAGOmAABlpgAAZaYAAGemAABnpgAAaaYAAGmmAABrpgAAa6YAAG2mAABtpgAAgaYAAIGmAACDpgAAg6YAAIWmAACFpgAAh6YAAIemAACJpgAAiaYAAIumAACLpgAAjaYAAI2mAACPpgAAj6YAAJGmAACRpgAAk6YAAJOmAACVpgAAlaYAAJemAACXpgAAmaYAAJmmAACbpgAAm6YAACOnAAAjpwAAJacAACWnAAAnpwAAJ6cAACmnAAAppwAAK6cAACunAAAtpwAALacAAC+nAAAvpwAAM6cAADOnAAA1pwAANacAADenAAA3pwAAOacAADmnAAA7pwAAO6cAAD2nAAA9pwAAP6cAAD+nAABBpwAAQacAAEOnAABDpwAARacAAEWnAABHpwAAR6cAAEmnAABJpwAAS6cAAEunAABNpwAATacAAE+nAABPpwAAUacAAFGnAABTpwAAU6cAAFWnAABVpwAAV6cAAFenAABZpwAAWacAAFunAABbpwAAXacAAF2nAABfpwAAX6cAAGGnAABhpwAAY6cAAGOnAABlpwAAZacAAGenAABnpwAAaacAAGmnAABrpwAAa6cAAG2nAABtpwAAb6cAAG+nAAB6pwAAeqcAAHynAAB8pwAAf6cAAH+nAACBpwAAgacAAIOnAACDpwAAhacAAIWnAACHpwAAh6cAAIynAACMpwAAkacAAJGnAACTpwAAlKcAAJenAACXpwAAmacAAJmnAACbpwAAm6cAAJ2nAACdpwAAn6cAAJ+nAAChpwAAoacAAKOnAACjpwAApacAAKWnAACnpwAAp6cAAKmnAACppwAAtacAALWnAAC3pwAAt6cAALmnAAC5pwAAu6cAALunAAC9pwAAvacAAL+nAAC/pwAAwacAAMGnAADDpwAAw6cAAMinAADIpwAAyqcAAMqnAADRpwAA0acAANenAADXpwAA2acAANmnAAD2pwAA9qcAAFOrAABTqwAAcKsAAL+rAAAA+wAABvsAABP7AAAX+wAAQf8AAFr/AAAoBAEATwQBANgEAQD7BAEAlwUBAKEFAQCjBQEAsQUBALMFAQC5BQEAuwUBALwFAQDADAEA8gwBAMAYAQDfGAEAYG4BAH9uAQAi6QEAQ+kBAC0AAAAtAAAAigUAAIoFAAC+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rwEA+68BAP2vAQD+rwEAAM8BAC3PAQAwzwEARs8BAGfRAQBp0QEAbdEBAHLRAQB70QEAgtEBAIXRAQCL0QEAqtEBAK3RAQAw4AEAbeABADDhAQA24QEAruIBAK7iAQDs4gEA7+IBANDoAQDW6AEAROkBAEbpAQBI6QEASukBACMAAAAjAAAAKgAAACoAAAAwAAAAOQAAAKkAAACpAAAArgAAAK4AAAA8IAAAPCAAAEkgAABJIAAAIiEAACIhAAA5IQAAOSEAAJQhAACZIQAAqSEAAKohAAAaIwAAGyMAACgjAAAoIwAAzyMAAM8jAADpIwAA8yMAAPgjAAD6IwAAwiQAAMIkAACqJQAAqyUAALYlAAC2JQAAwCUAAMAlAAD7JQAA/iUAAAAmAAAEJgAADiYAAA4mAAARJgAAESYAABQmAAAVJgAAGCYAABgmAAAdJgAAHSYAACAmAAAgJgAAIiYAACMmAAAmJgAAJiYAAComAAAqJgAALiYAAC8mAAA4JgAAOiYAAEAmAABAJgAAQiYAAEImAABIJgAAUyYAAF8mAABgJgAAYyYAAGMmAABlJgAAZiYAAGgmAABoJgAAeyYAAHsmAAB+JgAAfyYAAJImAACXJgAAmSYAAJkmAACbJgAAnCYAAKAmAAChJgAApyYAAKcmAACqJgAAqyYAALAmAACxJgAAvSYAAL4mAADEJgAAxSYAAMgmAADIJgAAziYAAM8mAADRJgAA0SYAANMmAADUJgAA6SYAAOomAADwJgAA9SYAAPcmAAD6JgAA/SYAAP0mAAACJwAAAicAAAUnAAAFJwAACCcAAA0nAAAPJwAADycAABInAAASJwAAFCcAABQnAAAWJwAAFicAAB0nAAAdJwAAIScAACEnAAAoJwAAKCcAADMnAAA0JwAARCcAAEQnAABHJwAARycAAEwnAABMJwAATicAAE4nAABTJwAAVScAAFcnAABXJwAAYycAAGQnAACVJwAAlycAAKEnAAChJwAAsCcAALAnAAC/JwAAvycAADQpAAA1KQAABSsAAAcrAAAbKwAAHCsAAFArAABQKwAAVSsAAFUrAAAwMAAAMDAAAD0wAAA9MAAAlzIAAJcyAACZMgAAmTIAAATwAQAE8AEAz/ABAM/wAQBw8QEAcfEBAH7xAQB/8QEAjvEBAI7xAQCR8QEAmvEBAObxAQD/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CAAAXggAAGAIAABqCAAAcAgAAI4IAACgCAAAyQgAAAMJAAA5CQAAOwkAADsJAAA9CQAAQAkAAEkJAABMCQAATgkAAFAJAABYCQAAYQkAAGQJAACACQAAggkAAIMJAACFCQAAjAkAAI8JAACQCQAAkwkAAKgJAACqCQAAsAkAALIJAACyCQAAtgkAALkJAAC9CQAAvQkAAL8JAADACQAAxwkAAMgJAADLCQAAzAkAAM4JAADOCQAA3AkAAN0JAADfCQAA4QkAAOYJAAD9CQAAAwoAAAMKAAAFCgAACgoAAA8KAAAQCgAAEwoAACgKAAAqCgAAMAoAADIKAAAzCgAANQoAADYKAAA4CgAAOQoAAD4KAABACgAAWQoAAFwKAABeCgAAXgoAAGYKAABvCgAAcgoAAHQKAAB2CgAAdgoAAIMKAACDCgAAhQoAAI0KAACPCgAAkQoAAJMKAACoCgAAqgoAALAKAACyCgAAswoAALUKAAC5CgAAvQoAAMAKAADJCgAAyQoAAMsKAADMCgAA0AoAANAKAADgCgAA4QoAAOYKAADxCgAA+QoAAPkKAAACCwAAAwsAAAULAAAMCwAADwsAABALAAATCwAAKAsAACoLAAAwCwAAMgsAADMLAAA1CwAAOQsAAD0LAAA9CwAAQAsAAEALAABHCwAASAsAAEsLAABMCwAAXAsAAF0LAABfCwAAYQsAAGYLAAB3CwAAgwsAAIMLAACFCwAAigsAAI4LAACQCwAAkgsAAJULAACZCwAAmgsAAJwLAACcCwAAngsAAJ8LAACjCwAApAsAAKgLAACqCwAArgsAALkLAAC/CwAAvwsAAMELAADCCwAAxgsAAMgLAADKCwAAzAsAANALAADQCwAA5gsAAPoLAAABDAAAAwwAAAUMAAAMDAAADgwAABAMAAASDAAAKAwAACoMAAA5DAAAPQwAAD0MAABBDAAARAwAAFgMAABaDAAAXQwAAF0MAABgDAAAYQwAAGYMAABvDAAAdwwAAIAMAACCDAAAjAwAAI4MAACQDAAAkgwAAKgMAACqDAAAswwAALUMAAC5DAAAvQwAAL4MAADADAAAwQwAAMMMAADEDAAAxwwAAMgMAADKDAAAywwAAN0MAADeDAAA4AwAAOEMAADmDAAA7wwAAPEMAADzDAAAAg0AAAwNAAAODQAAEA0AABINAAA6DQAAPQ0AAD0NAAA/DQAAQA0AAEYNAABIDQAASg0AAEwNAABODQAATw0AAFQNAABWDQAAWA0AAGENAABmDQAAfw0AAIINAACDDQAAhQ0AAJYNAACaDQAAsQ0AALMNAAC7DQAAvQ0AAL0NAADADQAAxg0AANANAADRDQAA2A0AAN4NAADmDQAA7w0AAPINAAD0DQAAAQ4AADAOAAAyDgAAMw4AAD8OAABGDgAATw4AAFsOAACBDgAAgg4AAIQOAACEDgAAhg4AAIoOAACMDgAAow4AAKUOAAClDgAApw4AALAOAACyDgAAsw4AAL0OAAC9DgAAwA4AAMQOAADGDgAAxg4AANAOAADZDgAA3A4AAN8OAAAADwAAFw8AABoPAAA0DwAANg8AADYPAAA4DwAAOA8AADoPAABHDwAASQ8AAGwPAAB/DwAAfw8AAIUPAACFDwAAiA8AAIwPAAC+DwAAxQ8AAMcPAADMDwAAzg8AANoPAAAAEAAALBAAADEQAAAxEAAAOBAAADgQAAA7EAAAPBAAAD8QAABXEAAAWhAAAF0QAABhEAAAcBAAAHUQAACBEAAAgxAAAIQQAACHEAAAjBAAAI4QAACcEAAAnhAAAMUQAADHEAAAxxAAAM0QAADNEAAA0BAAAEgSAABKEgAATRIAAFASAABWEgAAWBIAAFgSAABaEgAAXRIAAGASAACIEgAAihIAAI0SAACQEgAAsBIAALISAAC1EgAAuBIAAL4SAADAEgAAwBIAAMISAADFEgAAyBIAANYSAADYEgAAEBMAABITAAAVEwAAGBMAAFoTAABgEwAAfBMAAIATAACZEwAAoBMAAPUTAAD4EwAA/RMAAAAUAACcFgAAoBYAAPgWAAAAFwAAERcAABUXAAAVFwAAHxcAADEXAAA0FwAANhcAAEAXAABRFwAAYBcAAGwXAABuFwAAcBcAAIAXAACzFwAAthcAALYXAAC+FwAAxRcAAMcXAADIFwAA1BcAANwXAADgFwAA6RcAAPAXAAD5FwAAABgAAAoYAAAQGAAAGRgAACAYAAB4GAAAgBgAAIQYAACHGAAAqBgAAKoYAACqGAAAsBgAAPUYAAAAGQAAHhkAACMZAAAmGQAAKRkAACsZAAAwGQAAMRkAADMZAAA4GQAAQBkAAEAZAABEGQAAbRkAAHAZAAB0GQAAgBkAAKsZAACwGQAAyRkAANAZAADaGQAA3hkAABYaAAAZGgAAGhoAAB4aAABVGgAAVxoAAFcaAABhGgAAYRoAAGMaAABkGgAAbRoAAHIaAACAGgAAiRoAAJAaAACZGgAAoBoAAK0aAAAEGwAAMxsAADsbAAA7GwAAPRsAAEEbAABDGwAATBsAAFAbAABqGwAAdBsAAH4bAACCGwAAoRsAAKYbAACnGwAAqhsAAKobAACuGwAA5RsAAOcbAADnGwAA6hsAAOwbAADuGwAA7hsAAPIbAADzGwAA/BsAACscAAA0HAAANRwAADscAABJHAAATRwAAIgcAACQHAAAuhwAAL0cAADHHAAA0xwAANMcAADhHAAA4RwAAOkcAADsHAAA7hwAAPMcAAD1HAAA9xwAAPocAAD6HAAAAB0AAL8dAAAAHgAAFR8AABgfAAAdHwAAIB8AAEUfAABIHwAATR8AAFAfAABXHwAAWR8AAFkfAABbHwAAWx8AAF0fAABdHwAAXx8AAH0fAACAHwAAtB8AALYfAADEHwAAxh8AANMfAADWHwAA2x8AAN0fAADvHwAA8h8AAPQfAAD2HwAA/h8AAAAgAAAKIAAAECAAACcgAAAvIAAAXyAAAHAgAABxIAAAdCAAAI4gAACQIAAAnCAAAKAgAADAIAAAACEAAIshAACQIQAAJiQAAEAkAABKJAAAYCQAAHMrAAB2KwAAlSsAAJcrAADuLAAA8iwAAPMsAAD5LAAAJS0AACctAAAnLQAALS0AAC0tAAAwLQAAZy0AAG8tAABwLQAAgC0AAJYtAACgLQAApi0AAKgtAACuLQAAsC0AALYtAAC4LQAAvi0AAMAtAADGLQAAyC0AAM4tAADQLQAA1i0AANgtAADeLQAAAC4AAF0uAACALgAAmS4AAJsuAADzLgAAAC8AANUvAADwLwAA+y8AAAAwAAApMAAAMDAAAD8wAABBMAAAljAAAJswAAD/MAAABTEAAC8xAAAxMQAAjjEAAJAxAADjMQAA8DEAAB4yAAAgMgAAjKQAAJCkAADGpAAA0KQAACumAABApgAAbqYAAHOmAABzpgAAfqYAAJ2mAACgpgAA76YAAPKmAAD3pgAAAKcAAMqnAADQpwAA0acAANOnAADTpwAA1acAANmnAADypwAAAagAAAOoAAAFqAAAB6gAAAqoAAAMqAAAJKgAACeoAAAr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FAEAxBQBAMcUAQDQFAEA2RQBAIAVAQCuFQEAsBUBALEVAQC4FQEAuxUBAL4VAQC+FQEAwRUBANsVAQAAFgEAMhYBADsWAQA8FgEAPhYBAD4WAQBBFgEARBYBAFAWAQBZFgEAYBYBAGwWAQCAFgEAqhYBAKwWAQCsFgEArhYBAK8WAQC2FgEAthYBALgWAQC5FgEAwBYBAMkWAQAAFwEAGhcBACAXAQAhFwEAJhcBACYXAQAwFwEARhcBAAAYAQAuGAEAOBgBADgYAQA7GAEAOxgBAKAYAQDyGAEA/xgBAAYZAQAJGQEACRkBAAwZAQATGQEAFRkBABYZAQAYGQEALxkBADEZAQA1GQEANxkBADgZAQA9GQEAPRkBAD8ZAQBCGQEARBkBAEYZAQBQGQEAWRkBAKAZAQCnGQEAqhkBANMZAQDcGQEA3xkBAOEZAQDkGQEAABoBAAAaAQALGgEAMhoBADkaAQA6GgEAPxoBAEYaAQBQGgEAUBoBAFcaAQBYGgEAXBoBAIkaAQCXGgEAlxoBAJoaAQCiGgEAsBoBAPgaAQAAGwEACRsBAAAcAQAIHAEAChwBAC8cAQA+HAEAPhwBAEAcAQBFHAEAUBwBAGwcAQBwHAEAjxwBAKkcAQCpHAEAsRwBALEcAQC0HAEAtBwBAAAdAQAGHQEACB0BAAkdAQALHQEAMB0BAEYdAQBGHQEAUB0BAFkdAQBgHQEAZR0BAGcdAQBoHQEAah0BAI4dAQCTHQEAlB0BAJYdAQCWHQEAmB0BAJgdAQCgHQEAqR0BAOAeAQDyHgEA9R4BAPgeAQACHwEAEB8BABIfAQA1HwEAPh8BAD8fAQBBHwEAQR8BAEMfAQBZHwEAsB8BALAfAQDAHwEA8R8BAP8fAQCZIwEAACQBAG4kAQBwJAEAdCQBAIAkAQBDJQEAkC8BAPIvAQAAMAEALzQBAEE0AQBGNAEAAEQBAEZGAQAAaAEAOGoBAEBqAQBeagEAYGoBAGlqAQBuagEAvmoBAMBqAQDJagEA0GoBAO1qAQD1agEA9WoBAABrAQAvawEAN2sBAEVrAQBQawEAWWsBAFtrAQBhawEAY2sBAHdrAQB9awEAj2sBAEBuAQCabgEAAG8BAEpvAQBQbwEAh28BAJNvAQCfbwEA4G8BAONvAQDwbwEA8W8BAABwAQD3hwEAAIgBANWMAQAA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CgAAMwoAADUKAAA2CgAAOAoAADkKAAA8CgAAPAoAAD4KAABCCgAARwoAAEgKAABLCgAATQoAAFEKAABRCgAAWQoAAFwKAABeCgAAXgoAAGYKAAB1CgAAgQoAAIMKAACFCgAAjQoAAI8KAACRCgAAkwoAAKgKAACqCgAAsAoAALIKAACzCgAAtQoAALkKAAC8CgAAxQoAAMcKAADJCgAAywoAAM0KAADQCgAA0AoAAOAKAADjCgAA5goAAO8KAAD5CgAA/woAAAELAAADCwAABQsAAAwLAAAPCwAAEAsAABMLAAAoCwAAKgsAADALAAAyCwAAMwsAADULAAA5CwAAPAsAAEQLAABHCwAASAsAAEsLAABNCwAAVQsAAFcLAABcCwAAXQsAAF8LAABjCwAAZgsAAG8LAABxCwAAcQsAAIILAACDCwAAhQsAAIoLAACOCwAAkAsAAJILAACVCwAAmQsAAJoLAACcCwAAnAsAAJ4LAACfCwAAowsAAKQLAACoCwAAqgsAAK4LAAC5CwAAvgsAAMILAADGCwAAyAsAAMoLAADNCwAA0AsAANALAADXCwAA1wsAAOYLAADvCwAAAAwAAAwMAAAODAAAEAwAABIMAAAoDAAAKgwAADkMAAA8DAAARAwAAEYMAABIDAAASgwAAE0MAABVDAAAVgwAAFgMAABaDAAAXQwAAF0MAABgDAAAYwwAAGYMAABvDAAAgAwAAIMMAACFDAAAjAwAAI4MAACQDAAAkgwAAKgMAACqDAAAswwAALUMAAC5DAAAvAwAAMQMAADGDAAAyAwAAMoMAADNDAAA1QwAANYMAADdDAAA3gwAAOAMAADjDAAA5gwAAO8MAADxDAAA8wwAAAANAAAMDQAADg0AABANAAASDQAARA0AAEYNAABIDQAASg0AAE4NAABUDQAAVw0AAF8NAABjDQAAZg0AAG8NAAB6DQAAfw0AAIENAACDDQAAhQ0AAJYNAACaDQAAsQ0AALMNAAC7DQAAvQ0AAL0NAADADQAAxg0AAMoNAADKDQAAzw0AANQNAADWDQAA1g0AANgNAADfDQAA5g0AAO8NAADyDQAA8w0AAAEOAAA6DgAAQA4AAE4OAABQDgAAWQ4AAIEOAACCDgAAhA4AAIQOAACGDgAAig4AAIwOAACjDgAApQ4AAKUOAACnDgAAvQ4AAMAOAADE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GQAAbRkAAHAZAAB0GQAAgBkAAKsZAACwGQAAyRkAAAAaAAAWGgAAIBoAAFQaAACnGgAApxoAAAUbAAAzGwAARRsAAEwbAACDGwAAoBsAAK4bAACvGwAAuhsAAOUbAAAAHAAAIxwAAE0cAABPHAAAWhwAAH0cAACAHAAAiBwAAJAcAAC6HAAAvRwAAL8cAADpHAAA7BwAAO4cAADzHAAA9RwAAPYcAAD6HAAA+hwAAAAdAAC/HQAAAB4AABUfAAAYHwAAHR8AACAfAABFHwAASB8AAE0fAABQHwAAVx8AAFkfAABZHwAAWx8AAFsfAABdHwAAXR8AAF8fAAB9HwAAgB8AALQfAAC2HwAAvB8AAL4fAAC+HwAAwh8AAMQfAADGHwAAzB8AANAfAADTHwAA1h8AANsfAADgHwAA7B8AAPIfAAD0HwAA9h8AAPwfAABxIAAAcSAAAH8gAAB/IAAAkCAAAJwgAAACIQAAAiEAAAchAAAHIQAACiEAABMhAAAVIQAAFSEAABghAAAdIQAAJCEAACQhAAAmIQAAJiEAACghAAAoIQAAKiEAADkhAAA8IQAAPyEAAEUhAABJIQAATiEAAE4hAABgIQAAiCEAAAAsAADkLAAA6ywAAO4sAADyLAAA8ywAAAAtAAAlLQAAJy0AACctAAAtLQAALS0AADAtAABnLQAAby0AAG8tAACALQAAli0AAKAtAACmLQAAqC0AAK4tAACwLQAAti0AALgtAAC+LQAAwC0AAMYtAADILQAAzi0AANAtAADWLQAA2C0AAN4tAAAFMAAABzAAACEwAAApMAAAMTAAADUwAAA4MAAAPDAAAEEwAACWMAAAmzAAAJ8wAAChMAAA+jAAAPwwAAD/MAAABTEAAC8xAAAxMQAAjjEAAKAxAAC/MQAA8DEAAP8xAAAANAAAv00AAABOAACMpAAA0KQAAP2kAAAApQAADKYAABCmAAAfpgAAKqYAACumAABApgAAbqYAAH+mAACdpgAAoKYAAO+mAAAXpwAAH6cAACKnAACIpwAAi6cAAMqnAADQpwAA0acAANOnAADTpwAA1acAANmnAADypwAAAagAAAOoAAAFqAAAB6gAAAqoAAAMqAAAIqgAAECoAABzqAAAgqgAALOoAADyqAAA96gAAPuoAAD7qAAA/agAAP6oAAAKqQAAJakAADCpAABG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AQAAuQEAALoBAAC9AQAAvwEAAMYBAADGAQAAyQEAAMkBAADMAQAAzAEAAM4BAADOAQAA0AEAANABAADSAQAA0gEAANQBAADUAQAA1gEAANYBAADYAQAA2AEAANoBAADaAQAA3AEAAN0BAADfAQAA3wEAAOEBAADhAQAA4wEAAOMBAADlAQAA5QEAAOcBAADnAQAA6QEAAOkBAADrAQAA6wEAAO0BAADtAQAA7wEAAPABAADzAQAA8wEAAPUBAAD1AQAA+QEAAPkBAAD7AQAA+wEAAP0BAAD9AQAA/wEAAP8BAAABAgAAAQIAAAMCAAADAgAABQIAAAUCAAAHAgAABwIAAAkCAAAJAgAACwIAAAsCAAANAgAADQIAAA8CAAAPAgAAEQIAABECAAATAgAAEwIAABUCAAAVAgAAFwIAABcCAAAZAgAAGQIAABsCAAAbAgAAHQIAAB0CAAAfAgAAHwIAACECAAAhAgAAIwIAACMCAAAlAgAAJQIAACcCAAAnAgAAKQIAACkCAAArAgAAKwIAAC0CAAAtAgAALwIAAC8CAAAxAgAAMQIAADMCAAA5AgAAPAIAADwCAAA/AgAAQAIAAEICAABCAgAARwIAAEcCAABJAgAASQIAAEsCAABLAgAATQIAAE0CAABPAgAAkwIAAJUCAAC4AgAAwAIAAMECAADgAgAA5AIAAEUDAABFAwAAcQMAAHEDAABzAwAAcwMAAHcDAAB3AwAAegMAAH0DAACQAwAAkAMAAKwDAADOAwAA0AMAANEDAADVAwAA1wMAANkDAADZAwAA2wMAANsDAADdAwAA3QMAAN8DAADfAwAA4QMAAOEDAADjAwAA4wMAAOUDAADlAwAA5wMAAOcDAADpAwAA6QMAAOsDAADrAwAA7QMAAO0DAADvAwAA8wMAAPUDAAD1AwAA+AMAAPgDAAD7AwAA/AMAADAEAABfBAAAYQQAAGEEAABjBAAAYwQAAGUEAABlBAAAZwQAAGcEAABpBAAAaQQAAGsEAABrBAAAbQQAAG0EAABvBAAAbwQAAHEEAABxBAAAcwQAAHMEAAB1BAAAdQQAAHcEAAB3BAAAeQQAAHkEAAB7BAAAewQAAH0EAAB9BAAAfwQAAH8EAACBBAAAgQQAAIsEAACLBAAAjQQAAI0EAACPBAAAjwQAAJEEAACRBAAAkwQAAJMEAACVBAAAlQQAAJcEAACXBAAAmQQAAJkEAACbBAAAmwQAAJ0EAACdBAAAnwQAAJ8EAAChBAAAoQQAAKMEAACjBAAApQQAAKUEAACnBAAApwQAAKkEAACpBAAAqwQAAKsEAACtBAAArQQAAK8EAACvBAAAsQQAALEEAACzBAAAswQAALUEAAC1BAAAtwQAALcEAAC5BAAAuQQAALsEAAC7BAAAvQQAAL0EAAC/BAAAvwQAAMIEAADCBAAAxAQAAMQEAADGBAAAxgQAAMgEAADIBAAAygQAAMoEAADMBAAAzAQAAM4EAADPBAAA0QQAANEEAADTBAAA0wQAANUEAADVBAAA1wQAANcEAADZBAAA2QQAANsEAADbBAAA3QQAAN0EAADfBAAA3wQAAOEEAADhBAAA4wQAAOMEAADlBAAA5QQAAOcEAADnBAAA6QQAAOkEAADrBAAA6wQAAO0EAADtBAAA7wQAAO8EAADxBAAA8QQAAPMEAADzBAAA9QQAAPUEAAD3BAAA9wQAAPkEAAD5BAAA+wQAAPsEAAD9BAAA/QQAAP8EAAD/BAAAAQUAAAEFAAADBQAAAwUAAAUFAAAFBQAABwUAAAcFAAAJBQAACQUAAAsFAAALBQAADQUAAA0FAAAPBQAADwUAABEFAAARBQAAEwUAABMFAAAVBQAAFQUAABcFAAAXBQAAGQUAABkFAAAbBQAAGwUAAB0FAAAdBQAAHwUAAB8FAAAhBQAAIQUAACMFAAAjBQAAJQUAACUFAAAnBQAAJwUAACkFAAApBQAAKwUAACsFAAAtBQAALQUAAC8FAAAvBQAAYAUAAIgFAADQEAAA+hAAAPwQAAD/EAAA+BMAAP0TAACAHAAAiBwAAAAdAAC/HQAAAR4AAAEeAAADHgAAAx4AAAUeAAAFHgAABx4AAAceAAAJHgAACR4AAAseAAALHgAADR4AAA0eAAAPHgAADx4AABEeAAARHgAAEx4AABMeAAAVHgAAFR4AABceAAAXHgAAGR4AABkeAAAbHgAAGx4AAB0eAAAdHgAAHx4AAB8eAAAhHgAAIR4AACMeAAAjHgAAJR4AACUeAAAnHgAAJx4AACkeAAApHgAAKx4AACseAAAtHgAALR4AAC8eAAAvHgAAMR4AADEeAAAzHgAAMx4AADUeAAA1HgAANx4AADceAAA5HgAAOR4AADseAAA7HgAAPR4AAD0eAAA/HgAAPx4AAEEeAABBHgAAQx4AAEMeAABFHgAARR4AAEceAABHHgAASR4AAEkeAABLHgAASx4AAE0eAABNHgAATx4AAE8eAABRHgAAUR4AAFMeAABTHgAAVR4AAFUeAABXHgAAVx4AAFkeAABZHgAAWx4AAFseAABdHgAAXR4AAF8eAABfHgAAYR4AAGEeAABjHgAAYx4AAGUeAABlHgAAZx4AAGceAABpHgAAaR4AAGseAABrHgAAbR4AAG0eAABvHgAAbx4AAHEeAABxHgAAcx4AAHMeAAB1HgAAdR4AAHceAAB3HgAAeR4AAHkeAAB7HgAAex4AAH0eAAB9HgAAfx4AAH8eAACBHgAAgR4AAIMeAACDHgAAhR4AAIUeAACHHgAAhx4AAIkeAACJHgAAix4AAIseAACNHgAAjR4AAI8eAACPHgAAkR4AAJEeAACTHgAAkx4AAJUeAACdHgAAnx4AAJ8eAAChHgAAoR4AAKMeAACjHgAApR4AAKUeAACnHgAApx4AAKkeAACpHgAAqx4AAKseAACtHgAArR4AAK8eAACvHgAAsR4AALEeAACzHgAAsx4AALUeAAC1HgAAtx4AALceAAC5HgAAuR4AALseAAC7HgAAvR4AAL0eAAC/HgAAvx4AAMEeAADBHgAAwx4AAMMeAADFHgAAxR4AAMceAADHHgAAyR4AAMkeAADLHgAAyx4AAM0eAADNHgAAzx4AAM8eAADRHgAA0R4AANMeAADTHgAA1R4AANUeAADXHgAA1x4AANkeAADZHgAA2x4AANseAADdHgAA3R4AAN8eAADfHgAA4R4AAOEeAADjHgAA4x4AAOUeAADlHgAA5x4AAOceAADpHgAA6R4AAOseAADrHgAA7R4AAO0eAADvHgAA7x4AAPEeAADxHgAA8x4AAPMeAAD1HgAA9R4AAPceAAD3HgAA+R4AAPkeAAD7HgAA+x4AAP0eAAD9HgAA/x4AAAcfAAAQHwAAFR8AACAfAAAnHwAAMB8AADcfAABAHwAARR8AAFAfAABXHwAAYB8AAGcfAABwHwAAfR8AAIAfAACHHwAAkB8AAJcfAACgHwAApx8AALAfAAC0HwAAth8AALcfAAC+HwAAvh8AAMIfAADEHwAAxh8AAMcfAADQHwAA0x8AANYfAADXHwAA4B8AAOcfAADyHwAA9B8AAPYfAAD3HwAAcSAAAHEgAAB/IAAAfyAAAJAgAACcIAAACiEAAAohAAAOIQAADyEAABMhAAATIQAALyEAAC8hAAA0IQAANCEAADkhAAA5IQAAPCEAAD0hAABGIQAASSEAAE4hAABOIQAAcCEAAH8hAACEIQAAhCEAANAkAADpJAAAMCwAAF8sAABhLAAAYSwAAGUsAABmLAAAaCwAAGgsAABqLAAAaiwAAGwsAABsLAAAcSwAAHEsAABzLAAAdCwAAHYsAAB9LAAAgSwAAIEsAACDLAAAgywAAIUsAACFLAAAhywAAIcsAACJLAAAiSwAAIssAACLLAAAjSwAAI0sAACPLAAAjywAAJEsAACRLAAAkywAAJMsAACVLAAAlSwAAJcsAACXLAAAmSwAAJksAACbLAAAmywAAJ0sAACdLAAAnywAAJ8sAAChLAAAoSwAAKMsAACjLAAApSwAAKUsAACnLAAApywAAKksAACpLAAAqywAAKssAACtLAAArSwAAK8sAACvLAAAsSwAALEsAACzLAAAsywAALUsAAC1LAAAtywAALcsAAC5LAAAuSwAALssAAC7LAAAvSwAAL0sAAC/LAAAvywAAMEsAADBLAAAwywAAMMsAADFLAAAxSwAAMcsAADHLAAAySwAAMksAADLLAAAyywAAM0sAADNLAAAzywAAM8sAADRLAAA0SwAANMsAADTLAAA1SwAANUsAADXLAAA1ywAANksAADZLAAA2ywAANssAADdLAAA3SwAAN8sAADfLAAA4SwAAOEsAADjLAAA5CwAAOwsAADsLAAA7iwAAO4sAADzLAAA8ywAAAAtAAAlLQAAJy0AACctAAAtLQAALS0AAEGmAABBpgAAQ6YAAEOmAABFpgAARaYAAEemAABHpgAASaYAAEmmAABLpgAAS6YAAE2mAABNpgAAT6YAAE+mAABRpgAAUaYAAFOmAABTpgAAVaYAAFWmAABXpgAAV6YAAFmmAABZpgAAW6YAAFumAABdpgAAXaYAAF+mAABfpgAAYaYAAGGmAABjpgAAY6YAAGWmAABlpgAAZ6YAAGemAABppgAAaaYAAGumAABrpgAAbaYAAG2mAACBpgAAgaYAAIOmAACDpgAAhaYAAIWmAACHpgAAh6YAAImmAACJpgAAi6YAAIumAACNpgAAjaYAAI+mAACPpgAAkaYAAJGmAACTpgAAk6YAAJWmAACVpgAAl6YAAJemAACZpgAAmaYAAJumAACdpgAAI6cAACOnAAAlpwAAJacAACenAAAnpwAAKacAACmnAAArpwAAK6cAAC2nAAAtpwAAL6cAADGnAAAzpwAAM6cAADWnAAA1pwAAN6cAADenAAA5pwAAOacAADunAAA7pwAAPacAAD2nAAA/pwAAP6cAAEGnAABBpwAAQ6cAAEOnAABFpwAARacAAEenAABHpwAASacAAEmnAABLpwAAS6cAAE2nAABNpwAAT6cAAE+nAABRpwAAUacAAFOnAABTpwAAVacAAFWnAABXpwAAV6cAAFmnAABZpwAAW6cAAFunAABdpwAAXacAAF+nAABfpwAAYacAAGGnAABjpwAAY6cAAGWnAABlpwAAZ6cAAGenAABppwAAaacAAGunAABrpwAAbacAAG2nAABvpwAAeKcAAHqnAAB6pwAAfKcAAHynAAB/pwAAf6cAAIGnAACBpwAAg6cAAIOnAACFpwAAhacAAIenAACHpwAAjKcAAIynAACOpwAAjqcAAJGnAACRpwAAk6cAAJWnAACXpwAAl6cAAJmnAACZpwAAm6cAAJunAACdpwAAnacAAJ+nAACfpwAAoacAAKGnAACjpwAAo6cAAKWnAAClpwAAp6cAAKenAACppwAAqacAAK+nAACvpwAAtacAALWnAAC3pwAAt6cAALmnAAC5pwAAu6cAALunAAC9pwAAvacAAL+nAAC/pwAAwacAAMGnAADDpwAAw6cAAMinAADIpwAAyqcAAMqnAADRpwAA0acAANOnAADTpwAA1acAANWnAADXpwAA16cAANmnAADZpwAA8qcAAPSnAAD2pwAA9qcAAPinAAD6pwAAMKsAAFqrAABcqwAAaasAAHCrAAC/qwAAAPsAAAb7AAAT+wAAF/sAAEH/AABa/wAAKAQBAE8EAQDYBAEA+wQBAJcFAQChBQEAowUBALEFAQCzBQEAuQUBALsFAQC8BQEAgAcBAIAHAQCDBwEAhQcBAIcHAQCwBwEAsgcBALoHAQDADAEA8gwBAMAYAQDfGAEAYG4BAH9uAQAa1AEAM9QBAE7UAQBU1AEAVtQBAGfUAQCC1AEAm9QBALbUAQC51AEAu9QBALvUAQC91AEAw9QBAMXUAQDP1AEA6tQBAAPVAQAe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AQAAzQEAAM0BAADPAQAAzwEAANEBAADRAQAA0wEAANMBAADVAQAA1QEAANcBAADXAQAA2QEAANkBAADbAQAA2wEAAN4BAADeAQAA4AEAAOABAADiAQAA4gEAAOQBAADkAQAA5gEAAOYBAADoAQAA6AEAAOoBAADqAQAA7AEAAOwBAADuAQAA7gEAAPEBAADxAQAA9AEAAPQBAAD2AQAA+AEAAPoBAAD6AQAA/AEAAPwBAAD+AQAA/gEAAAACAAAAAgAAAgIAAAICAAAEAgAABAIAAAYCAAAGAgAACAIAAAgCAAAKAgAACgIAAAwCAAAMAgAADgIAAA4CAAAQAgAAEAIAABICAAASAgAAFAIAABQCAAAWAgAAFgIAABgCAAAYAgAAGgIAABoCAAAcAgAAHAIAAB4CAAAeAgAAIAIAACACAAAiAgAAIgIAACQCAAAkAgAAJgIAACYCAAAoAgAAKAIAACoCAAAqAgAALAIAACwCAAAuAgAALgIAADACAAAwAgAAMgIAADICAAA6AgAAOwIAAD0CAAA+AgAAQQIAAEECAABDAgAARgIAAEgCAABIAgAASgIAAEoCAABMAgAATAIAAE4CAABOAgAAcAMAAHADAAByAwAAcgMAAHYDAAB2AwAAfwMAAH8DAACGAwAAhgMAAIgDAACKAwAAjAMAAIwDAACOAwAAjwMAAJEDAAChAwAAowMAAKsDAADPAwAAzwMAANIDAADUAwAA2AMAANgDAADaAwAA2gMAANwDAADcAwAA3gMAAN4DAADgAwAA4AMAAOIDAADiAwAA5AMAAOQDAADmAwAA5gMAAOgDAADoAwAA6gMAAOoDAADsAwAA7AMAAO4DAADuAwAA9AMAAPQDAAD3AwAA9wMAAPkDAAD6AwAA/QMAAC8EAABgBAAAYAQAAGIEAABiBAAAZAQAAGQEAABmBAAAZgQAAGgEAABoBAAAagQAAGoEAABsBAAAbAQAAG4EAABuBAAAcAQAAHAEAAByBAAAcgQAAHQEAAB0BAAAdgQAAHYEAAB4BAAAeAQAAHoEAAB6BAAAfAQAAHwEAAB+BAAAfgQAAIAEAACABAAAigQAAIoEAACMBAAAjAQAAI4EAACOBAAAkAQAAJAEAACSBAAAkgQAAJQEAACUBAAAlgQAAJYEAACYBAAAmAQAAJoEAACaBAAAnAQAAJwEAACeBAAAngQAAKAEAACgBAAAogQAAKIEAACkBAAApAQAAKYEAACmBAAAqAQAAKgEAACqBAAAqgQAAKwEAACsBAAArgQAAK4EAACwBAAAsAQAALIEAACyBAAAtAQAALQEAAC2BAAAtgQAALgEAAC4BAAAugQAALoEAAC8BAAAvAQAAL4EAAC+BAAAwAQAAMEEAADDBAAAwwQAAMUEAADFBAAAxwQAAMcEAADJBAAAyQQAAMsEAADLBAAAzQQAAM0EAADQBAAA0AQAANIEAADSBAAA1AQAANQEAADWBAAA1gQAANgEAADYBAAA2gQAANoEAADcBAAA3AQAAN4EAADeBAAA4AQAAOAEAADiBAAA4gQAAOQEAADkBAAA5gQAAOYEAADoBAAA6AQAAOoEAADqBAAA7AQAAOwEAADuBAAA7gQAAPAEAADwBAAA8gQAAPIEAAD0BAAA9AQAAPYEAAD2BAAA+AQAAPgEAAD6BAAA+gQAAPwEAAD8BAAA/gQAAP4EAAAABQAAAAUAAAIFAAACBQAABAUAAAQFAAAGBQAABgUAAAgFAAAIBQAACgUAAAoFAAAMBQAADAUAAA4FAAAOBQAAEAUAABAFAAASBQAAEgUAABQFAAAUBQAAFgUAABYFAAAYBQAAGAUAABoFAAAaBQAAHAUAABwFAAAeBQAAHgUAACAFAAAgBQAAIgUAACIFAAAkBQAAJAUAACYFAAAmBQAAKAUAACgFAAAqBQAAKgUAACwFAAAsBQAALgUAAC4FAAAxBQAAVgUAAKAQAADFEAAAxxAAAMcQAADNEAAAzRAAAKATAAD1EwAAkBwAALocAAC9HAAAvxwAAAAeAAAAHgAAAh4AAAIeAAAEHgAABB4AAAYeAAAGHgAACB4AAAgeAAAKHgAACh4AAAweAAAMHgAADh4AAA4eAAAQHgAAEB4AABIeAAASHgAAFB4AABQeAAAWHgAAFh4AABgeAAAYHgAAGh4AABoeAAAcHgAAHB4AAB4eAAAeHgAAIB4AACAeAAAiHgAAIh4AACQeAAAkHgAAJh4AACYeAAAoHgAAKB4AACoeAAAqHgAALB4AACweAAAuHgAALh4AADAeAAAwHgAAMh4AADIeAAA0HgAANB4AADYeAAA2HgAAOB4AADgeAAA6HgAAOh4AADweAAA8HgAAPh4AAD4eAABAHgAAQB4AAEIeAABCHgAARB4AAEQeAABGHgAARh4AAEgeAABIHgAASh4AAEoeAABMHgAATB4AAE4eAABOHgAAUB4AAFAeAABSHgAAUh4AAFQeAABUHgAAVh4AAFYeAABYHgAAWB4AAFoeAABaHgAAXB4AAFweAABeHgAAXh4AAGAeAABgHgAAYh4AAGIeAABkHgAAZB4AAGYeAABmHgAAaB4AAGgeAABqHgAAah4AAGweAABsHgAAbh4AAG4eAABwHgAAcB4AAHIeAAByHgAAdB4AAHQeAAB2HgAAdh4AAHgeAAB4HgAAeh4AAHoeAAB8HgAAfB4AAH4eAAB+HgAAgB4AAIAeAACCHgAAgh4AAIQeAACEHgAAhh4AAIYeAACIHgAAiB4AAIoeAACKHgAAjB4AAIweAACOHgAAjh4AAJAeAACQHgAAkh4AAJIeAACUHgAAlB4AAJ4eAACeHgAAoB4AAKAeAACiHgAAoh4AAKQeAACkHgAAph4AAKYeAACoHgAAqB4AAKoeAACqHgAArB4AAKweAACuHgAArh4AALAeAACwHgAAsh4AALIeAAC0HgAAtB4AALYeAAC2HgAAuB4AALgeAAC6HgAAuh4AALweAAC8HgAAvh4AAL4eAADAHgAAwB4AAMIeAADCHgAAxB4AAMQeAADGHgAAxh4AAMgeAADIHgAAyh4AAMoeAADMHgAAzB4AAM4eAADOHgAA0B4AANAeAADSHgAA0h4AANQeAADUHgAA1h4AANYeAADYHgAA2B4AANoeAADaHgAA3B4AANweAADeHgAA3h4AAOAeAADgHgAA4h4AAOIeAADkHgAA5B4AAOYeAADmHgAA6B4AAOgeAADqHgAA6h4AAOweAADsHgAA7h4AAO4eAADwHgAA8B4AAPIeAADyHgAA9B4AAPQeAAD2HgAA9h4AAPgeAAD4HgAA+h4AAPoeAAD8HgAA/B4AAP4eAAD+HgAACB8AAA8fAAAYHwAAHR8AACgfAAAvHwAAOB8AAD8fAABIHwAATR8AAFkfAABZHwAAWx8AAFsfAABdHwAAXR8AAF8fAABfHwAAaB8AAG8fAAC4HwAAux8AAMgfAADLHwAA2B8AANsfAADoHwAA7B8AAPgfAAD7HwAAAiEAAAIhAAAHIQAAByEAAAshAAANIQAAECEAABIhAAAVIQAAFSEAABkhAAAdIQAAJCEAACQhAAAmIQAAJiEAACghAAAoIQAAKiEAAC0hAAAwIQAAMyEAAD4hAAA/IQAARSEAAEUhAABgIQAAbyEAAIMhAACDIQAAtiQAAM8kAAAALAAALywAAGAsAABgLAAAYiwAAGQsAABnLAAAZywAAGksAABpLAAAaywAAGssAABtLAAAcCwAAHIsAAByLAAAdSwAAHUsAAB+LAAAgCwAAIIsAACCLAAAhCwAAIQsAACGLAAAhiwAAIgsAACILAAAiiwAAIosAACMLAAAjCwAAI4sAACOLAAAkCwAAJAsAACSLAAAkiwAAJQsAACULAAAliwAAJYsAACYLAAAmCwAAJosAACaLAAAnCwAAJwsAACeLAAAniwAAKAsAACgLAAAoiwAAKIsAACkLAAApCwAAKYsAACmLAAAqCwAAKgsAACqLAAAqiwAAKwsAACsLAAAriwAAK4sAACwLAAAsCwAALIsAACyLAAAtCwAALQsAAC2LAAAtiwAALgsAAC4LAAAuiwAALosAAC8LAAAvCwAAL4sAAC+LAAAwCwAAMAsAADCLAAAwiwAAMQsAADELAAAxiwAAMYsAADILAAAyCwAAMosAADKLAAAzCwAAMwsAADOLAAAziwAANAsAADQLAAA0iwAANIsAADULAAA1CwAANYsAADWLAAA2CwAANgsAADaLAAA2iwAANwsAADcLAAA3iwAAN4sAADgLAAA4CwAAOIsAADiLAAA6ywAAOssAADtLAAA7SwAAPIsAADyLAAAQKYAAECmAABCpgAAQqYAAESmAABEpgAARqYAAEamAABIpgAASKYAAEqmAABKpgAATKYAAEymAABOpgAATqYAAFCmAABQpgAAUqYAAFKmAABUpgAAVKYAAFamAABWpgAAWKYAAFimAABapgAAWqYAAFymAABcpgAAXqYAAF6mAABgpgAAYKYAAGKmAABipgAAZKYAAGSmAABmpgAAZqYAAGimAABopgAAaqYAAGqmAABspgAAbKYAAICmAACApgAAgqYAAIKmAACEpgAAhKYAAIamAACGpgAAiKYAAIimAACKpgAAiqYAAIymAACMpgAAjqYAAI6mAACQpgAAkKYAAJKmAACSpgAAlKYAAJSmAACWpgAAlqYAAJimAACYpgAAmqYAAJqmAAAipwAAIqcAACSnAAAkpwAAJqcAACanAAAopwAAKKcAACqnAAAqpwAALKcAACynAAAupwAALqcAADKnAAAypwAANKcAADSnAAA2pwAANqcAADinAAA4pwAAOqcAADqnAAA8pwAAPKcAAD6nAAA+pwAAQKcAAECnAABCpwAAQqcAAESnAABEpwAARqcAAEanAABIpwAASKcAAEqnAABKpwAATKcAAEynAABOpwAATqcAAFCnAABQpwAAUqcAAFKnAABUpwAAVKcAAFanAABWpwAAWKcAAFinAABapwAAWqcAAFynAABcpwAAXqcAAF6nAABgpwAAYKcAAGKnAABipwAAZKcAAGSnAABmpwAAZqcAAGinAABopwAAaqcAAGqnAABspwAAbKcAAG6nAABupwAAeacAAHmnAAB7pwAAe6cAAH2nAAB+pwAAgKcAAICnAACCpwAAgqcAAISnAACEpwAAhqcAAIanAACLpwAAi6cAAI2nAACNpwAAkKcAAJCnAACSpwAAkqcAAJanAACWpwAAmKcAAJinAACapwAAmqcAAJynAACcpwAAnqcAAJ6nAACgpwAAoKcAAKKnAACipwAApKcAAKSnAACmpwAApqcAAKinAACopwAAqqcAAK6nAACwpwAAtKcAALanAAC2pwAAuKcAALinAAC6pwAAuqcAALynAAC8pwAAvqcAAL6nAADApwAAwKcAAMKnAADCpwAAxKcAAMenAADJpwAAyacAANCnAADQpwAA1qcAANanAADYpwAA2KcAAPWnAAD1pwAAIf8AADr/AAAABAEAJwQBALAEAQDTBAEAcAUBAHoFAQB8BQEAigUBAIwFAQCSBQEAlAUBAJUFAQCADAEAsgwBAKAYAQC/GAEAQG4BAF9uAQAA1AEAGdQBADTUAQBN1AEAaNQBAIHUAQCc1AEAnNQBAJ7UAQCf1AEAotQBAKLUAQCl1AEAptQBAKnUAQCs1AEArtQBALXUAQDQ1AEA6dQBAATVAQAF1QEAB9UBAArVAQAN1QEAFNUBABbVAQAc1QEAONUBADnVAQA71QEAPtUBAEDVAQBE1QEARtUBAEbVAQBK1QEAUNUBAGzVAQCF1QEAoNUBALnVAQDU1QEA7dUBAAjWAQAh1gEAPNYBAFXWAQBw1gEAidYBAKjWAQDA1gEA4tYBAPrWAQAc1wEANNcBAFbXAQBu1wEAkNcBAKjXAQDK1wEAytcBAADpAQAh6QEAMPEBAEnxAQBQ8QEAafEBAHDxAQCJ8QEACxgAAA0YAAAPGAAADxgAAAD+AAAP/gAAAAEOAO8BDgAwAAAAOQAAAEEAAABaAAAAXwAAAF8AAABhAAAAegAAAKoAAACqAAAAtQAAALUAAAC3AAAAtwAAALoAAAC6AAAAwAAAANYAAADYAAAA9gAAAPgAAADBAgAAxgIAANECAADgAgAA5AIAAOwCAADsAgAA7gIAAO4CAAAAAwAAdAMAAHYDAAB3AwAAewMAAH0DAAB/AwAAfwMAAIYDAACKAwAAjAMAAIwDAACOAwAAoQMAAKMDAAD1AwAA9wMAAIEEAACDBAAAhwQAAIoEAAAvBQAAMQUAAFYFAABZBQAAWQUAAGAFAACIBQAAkQUAAL0FAAC/BQAAvwUAAMEFAADCBQAAxAUAAMUFAADHBQAAxwUAANAFAADqBQAA7wUAAPIFAAAQBgAAGgYAACAGAABpBgAAbgYAANMGAADVBgAA3AYAAN8GAADoBgAA6gYAAPwGAAD/BgAA/wYAABAHAABKBwAATQcAALEHAADABwAA9QcAAPoHAAD6BwAA/QcAAP0HAAAACAAALQgAAEAIAABbCAAAYAgAAGoIAABwCAAAhwgAAIkIAACOCAAAmAgAAOEIAADjCAAAYwkAAGYJAABvCQAAcQkAAIMJAACFCQAAjAkAAI8JAACQCQAAkwkAAKgJAACqCQAAsAkAALIJAACyCQAAtgkAALkJAAC8CQAAxAkAAMcJAADICQAAywkAAM4JAADXCQAA1wkAANwJAADdCQAA3wkAAOMJAADmCQAA8QkAAPwJAAD8CQAA/gkAAP4JAAABCgAAAwoAAAUKAAAKCgAADwoAABAKAAATCgAAKAoAACoKAAAwCgAAMgoAADMKAAA1CgAANgoAADgKAAA5CgAAPAoAADwKAAA+CgAAQgoAAEcKAABICgAASwoAAE0KAABRCgAAUQoAAFkKAABcCgAAXgoAAF4KAABmCgAAdQoAAIEKAACDCgAAhQoAAI0KAACPCgAAkQoAAJMKAACoCgAAqgoAALAKAACyCgAAswoAALUKAAC5CgAAvAoAAMUKAADHCgAAyQoAAMsKAADNCgAA0AoAANAKAADgCgAA4woAAOYKAADvCgAA+QoAAP8KAAABCwAAAwsAAAULAAAMCwAADwsAABALAAATCwAAKAsAACoLAAAwCwAAMgsAADMLAAA1CwAAOQsAADwLAABECwAARwsAAEgLAABLCwAATQsAAFULAABXCwAAXAsAAF0LAABfCwAAYwsAAGYLAABvCwAAcQsAAHELAACCCwAAgwsAAIULAACKCwAAjgsAAJALAACSCwAAlQsAAJkLAACaCwAAnAsAAJwLAACeCwAAnwsAAKMLAACkCwAAqAsAAKoLAACuCwAAuQsAAL4LAADCCwAAxgsAAMgLAADKCwAAzQsAANALAADQCwAA1wsAANcLAADmCwAA7wsAAAAMAAAMDAAADgwAABAMAAASDAAAKAwAACoMAAA5DAAAPAwAAEQMAABGDAAASAwAAEoMAABNDAAAVQwAAFYMAABYDAAAWgwAAF0MAABdDAAAYAwAAGMMAABmDAAAbwwAAIAMAACDDAAAhQwAAIwMAACODAAAkAwAAJIMAACoDAAAqgwAALMMAAC1DAAAuQwAALwMAADEDAAAxgwAAMgMAADKDAAAzQwAANUMAADWDAAA3QwAAN4MAADgDAAA4wwAAOYMAADvDAAA8QwAAPMMAAAADQAADA0AAA4NAAAQDQAAEg0AAEQNAABGDQAASA0AAEoNAABODQAAVA0AAFcNAABfDQAAYw0AAGYNAABvDQAAeg0AAH8NAACBDQAAgw0AAIUNAACWDQAAmg0AALENAACzDQAAuw0AAL0NAAC9DQAAwA0AAMYNAADKDQAAyg0AAM8NAADUDQAA1g0AANYNAADYDQAA3w0AAOYNAADvDQAA8g0AAPMNAAABDgAAOg4AAEAOAABODgAAUA4AAFkOAACBDgAAgg4AAIQOAACEDgAAhg4AAIoOAACMDgAAow4AAKUOAAClDgAApw4AAL0OAADADgAAxA4AAMYOAADGDgAAyA4AAM4OAADQDgAA2Q4AANwOAADfDgAAAA8AAAAPAAAYDwAAGQ8AACAPAAApDwAANQ8AADUPAAA3DwAANw8AADkPAAA5DwAAPg8AAEcPAABJDwAAbA8AAHEPAACEDwAAhg8AAJcPAACZDwAAvA8AAMYPAADGDwAAABAAAEkQAABQEAAAnRAAAKAQAADFEAAAxxAAAMcQAADNEAAAzRAAANAQAAD6EAAA/BAAAEgSAABKEgAATRIAAFASAABWEgAAWBIAAFgSAABaEgAAXRIAAGASAACIEgAAihIAAI0SAACQEgAAsBIAALISAAC1EgAAuBIAAL4SAADAEgAAwBIAAMISAADFEgAAyBIAANYSAADYEgAAEBMAABITAAAVEwAAGBMAAFoTAABdEwAAXxMAAGkTAABxEwAAgBMAAI8TAACgEwAA9RMAAPgTAAD9EwAAARQAAGwWAABvFgAAfxYAAIEWAACaFgAAoBYAAOoWAADuFgAA+BYAAAAXAAAVFwAAHxcAADQXAABAFwAAUxcAAGAXAABsFwAAbhcAAHAXAAByFwAAcxcAAIAXAADTFwAA1xcAANcXAADcFwAA3RcAAOAXAADpFwAACxgAAA0YAAAPGAAAGRgAACAYAAB4GAAAgBgAAKoYAACwGAAA9RgAAAAZAAAeGQAAIBkAACsZAAAwGQAAOxkAAEYZAABtGQAAcBkAAHQZAACAGQAAqxkAALAZAADJGQAA0BkAANoZAAAAGgAAGxoAACAaAABeGgAAYBoAAHwaAAB/GgAAiRoAAJAaAACZGgAApxoAAKcaAACwGgAAvRoAAL8aAADOGgAAABsAAEwbAABQGwAAWRsAAGsbAABzGwAAgBsAAPMbAAAAHAAANxwAAEAcAABJHAAATRwAAH0cAACAHAAAiBwAAJAcAAC6HAAAvRwAAL8cAADQHAAA0hwAANQcAAD6HAAAAB0AABUfAAAYHwAAHR8AACAfAABFHwAASB8AAE0fAABQHwAAVx8AAFkfAABZHwAAWx8AAFsfAABdHwAAXR8AAF8fAAB9HwAAgB8AALQfAAC2HwAAvB8AAL4fAAC+HwAAwh8AAMQfAADGHwAAzB8AANAfAADTHwAA1h8AANsfAADgHwAA7B8AAPIfAAD0HwAA9h8AAPwfAAA/IAAAQCAAAFQgAABUIAAAcSAAAHEgAAB/IAAAfyAAAJAgAACcIAAA0CAAANwgAADhIAAA4SAAAOUgAADwIAAAAiEAAAIhAAAHIQAAByEAAAohAAATIQAAFSEAABUhAAAYIQAAHSEAACQhAAAkIQAAJiEAACYhAAAoIQAAKCEAACohAAA5IQAAPCEAAD8hAABFIQAASSEAAE4hAABOIQAAYCEAAIghAAAALAAA5CwAAOssAADzLAAAAC0AACUtAAAnLQAAJy0AAC0tAAAtLQAAMC0AAGctAABvLQAAby0AAH8tAACWLQAAoC0AAKYtAACoLQAAri0AALAtAAC2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AAAA+AAAAMECAADGAgAA0QIAAOACAADkAgAA7AIAAOwCAADuAgAA7gIAAHADAAB0AwAAdgMAAHcDAAB7AwAAfQMAAH8DAAB/AwAAhgMAAIYDAACIAwAAigMAAIwDAACMAwAAjgMAAKEDAACjAwAA9QMAAPcDAACBBAAAigQAAC8FAAAxBQAAVgUAAFkFAABZBQAAYAUAAIgFAADQBQAA6gUAAO8FAADyBQAAIAYAAEoGAABuBgAAbwYAAHEGAADTBgAA1QYAANUGAADlBgAA5gYAAO4GAADvBgAA+gYAAPwGAAD/BgAA/wYAABAHAAAQBwAAEgcAAC8HAABNBwAApQcAALEHAACxBwAAygcAAOoHAAD0BwAA9QcAAPoHAAD6BwAAAAgAABUIAAAaCAAAGggAACQIAAAkCAAAKAgAACgIAABACAAAWAgAAGAIAABqCAAAcAgAAIcIAACJCAAAjggAAKAIAADJCAAABAkAADkJAAA9CQAAPQkAAFAJAABQCQAAWAkAAGEJAABxCQAAgAkAAIUJAACMCQAAjwkAAJAJAACTCQAAqAkAAKoJAACwCQAAsgkAALIJAAC2CQAAuQkAAL0JAAC9CQAAzgkAAM4JAADcCQAA3QkAAN8JAADhCQAA8AkAAPEJAAD8CQAA/AkAAAUKAAAKCgAADwoAABAKAAATCgAAKAoAACoKAAAwCgAAMgoAADMKAAA1CgAANgoAADgKAAA5CgAAWQoAAFwKAABeCgAAXgoAAHIKAAB0CgAAhQoAAI0KAACPCgAAkQoAAJMKAACoCgAAqgoAALAKAACyCgAAswoAALUKAAC5CgAAvQoAAL0KAADQCgAA0AoAAOAKAADhCgAA+QoAAPkKAAAFCwAADAsAAA8LAAAQCwAAEwsAACgLAAAqCwAAMAsAADILAAAzCwAANQsAADkLAAA9CwAAPQsAAFwLAABdCwAAXwsAAGELAABxCwAAcQsAAIMLAACDCwAAhQsAAIoLAACOCwAAkAsAAJILAACVCwAAmQsAAJoLAACcCwAAnAsAAJ4LAACfCwAAowsAAKQLAACoCwAAqgsAAK4LAAC5CwAA0AsAANALAAAFDAAADAwAAA4MAAAQDAAAEgwAACgMAAAqDAAAOQwAAD0MAAA9DAAAWAwAAFoMAABdDAAAXQwAAGAMAABhDAAAgAwAAIAMAACF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IAAACyAAAA4gAAAPIAAAKCAAAC4gAABgIAAAbyAAAP/+AAD//gAA8P8AAPv/AAAwNAEAPzQBAKC8AQCjvAEAc9EBAHrRAQAAAA4AHwAOAIAADgD/AA4A8AEOAP8PDgAAAwAAbwMAAIMEAACJBAAAkQUAAL0FAAC/BQAAvwUAAMEFAADCBQAAxAUAAMUFAADHBQAAxwUAABAGAAAaBgAASwYAAF8GAABwBgAAcAYAANYGAADcBgAA3wYAAOQGAADnBgAA6AYAAOoGAADtBgAAEQcAABEHAAAwBwAASgcAAKYHAACwBwAA6wcAAPMHAAD9BwAA/QcAABYIAAAZCAAAGwgAACMIAAAlCAAAJwgAACkIAAAtCAAAWQgAAFsIAACYCAAAnwgAAMoIAADhCAAA4wgAAAIJAAA6CQAAOgkAADwJAAA8CQAAQQkAAEgJAABNCQAATQkAAFEJAABXCQAAYgkAAGMJAACBCQAAgQkAALwJAAC8CQAAvgkAAL4JAADBCQAAxAkAAM0JAADNCQAA1wkAANcJAADiCQAA4wkAAP4JAAD+CQAAAQoAAAIKAAA8CgAAPAoAAEEKAABCCgAARwoAAEgKAABLCgAATQoAAFEKAABRCgAAcAoAAHEKAAB1CgAAdQoAAIEKAACCCgAAvAoAALwKAADBCgAAxQoAAMcKAADICgAAzQoAAM0KAADiCgAA4woAAPoKAAD/CgAAAQsAAAELAAA8CwAAPAsAAD4LAAA/CwAAQQsAAEQLAABNCwAATQsAAFULAABXCwAAYgsAAGMLAACCCwAAggsAAL4LAAC+CwAAwAsAAMALAADNCwAAzQsAANcLAADXCwAAAAwAAAAMAAAEDAAABAwAADwMAAA8DAAAPgwAAEAMAABGDAAASAwAAEoMAABNDAAAVQwAAFYMAABiDAAAYwwAAIEMAACBDAAAvAwAALwMAAC/DAAAvwwAAMIMAADCDAAAxgwAAMYMAADMDAAAzQwAANUMAADWDAAA4gwAAOMMAAAADQAAAQ0AADsNAAA8DQAAPg0AAD4NAABBDQAARA0AAE0NAABNDQAAVw0AAFcNAABiDQAAYw0AAIENAACBDQAAyg0AAMoNAADPDQAAzw0AANINAADUDQAA1g0AANYNAADfDQAA3w0AADEOAAAxDgAANA4AADoOAABHDgAATg4AALEOAACx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HwEAQDQBAEA0AQBHNAEAVTQBAPBqAQD0agEAMGsBADZrAQBPbwEAT28BAI9vAQCSbwEA5G8BAORvAQCdvAEAnrwBAADPAQAtzwEAMM8BAEbPAQBl0QEAZdEBAGfRAQBp0QEAbtEBAHLRAQB70QEAgtEBAIXRAQCL0QEAqtEBAK3RAQBC0gEARNIBAADaAQA22gEAO9oBAGzaAQB12gEAddoBAITaAQCE2gEAm9oBAJ/aAQCh2gEAr9oBAADgAQAG4AEACOABABjgAQAb4AEAIeABACPgAQAk4AEAJuABACrgAQCP4AEAj+ABADDhAQA24QEAruIBAK7iAQDs4gEA7+IBAOzkAQDv5AEA0OgBANboAQBE6QEASukBAPvzAQD/8wEAIAAOAH8ADgAAAQ4A7wEOAAARAABfEQAAYKkAAHypAAAKAAAACgAAAACsAAAArAAAHKwAABysAAA4rAAAOKwAAFSsAABUrAAAcKwAAHCsAACMrAAAjKwAAKisAACorAAAxKwAAMSsAADgrAAA4KwAAPysAAD8rAAAGK0AABitAAA0rQAANK0AAFCtAABQrQAAbK0AAGytAACIrQAAiK0AAKStAACkrQAAwK0AAMCtAADcrQAA3K0AAPitAAD4rQAAFK4AABSuAAAwrgAAMK4AAEyuAABMrgAAaK4AAGiuAACErgAAhK4AAKCuAACgrgAAvK4AALyuAADYrgAA2K4AAPSuAAD0rgAAEK8AABCvAAAsrwAALK8AAEivAABIrwAAZK8AAGSvAACArwAAgK8AAJyvAACcrwAAuK8AALivAADUrwAA1K8AAPCvAADwrwAADLAAAAywAAAosAAAKLAAAESwAABEsAAAYLAAAGCwAAB8sAAAfLAAAJiwAACYsAAAtLAAALSwAADQsAAA0LAAAOywAADssAAACLEAAAixAAAksQAAJLEAAECxAABAsQAAXLEAAFyxAAB4sQAAeLEAAJSxAACUsQAAsLEAALCxAADMsQAAzLEAAOixAADosQAABLIAAASyAAAgsgAAILIAADyyAAA8sgAAWLIAAFiyAAB0sgAAdLIAAJCyAACQsgAArLIAAKyyAADIsgAAyLIAAOSyAADksgAAALMAAACzAAAcswAAHLMAADizAAA4swAAVLMAAFSzAABwswAAcLMAAIyzAACMswAAqLMAAKizAADEswAAxLMAAOCzAADgswAA/LMAAPyzAAAYtAAAGLQAADS0AAA0tAAAULQAAFC0AABstAAAbLQAAIi0AACItAAApLQAAKS0AADAtAAAwLQAANy0AADctAAA+LQAAPi0AAAUtQAAFLUAADC1AAAwtQAATLUAAEy1AABotQAAaLUAAIS1AACEtQAAoLUAAKC1AAC8tQAAvLUAANi1AADYtQAA9LUAAPS1AAAQtgAAELYAACy2AAAstgAASLYAAEi2AABktgAAZLYAAIC2AACAtgAAnLYAAJy2AAC4tgAAuLYAANS2AADUtgAA8LYAAPC2AAAMtwAADLcAACi3AAAotwAARLcAAES3AABgtwAAYLcAAHy3AAB8twAAmLcAAJi3AAC0twAAtLcAANC3AADQtwAA7LcAAOy3AAAIuAAACLgAACS4AAAkuAAAQLgAAEC4AABcuAAAXLgAAHi4AAB4uAAAlLgAAJS4AACwuAAAsLgAAMy4AADMuAAA6LgAAOi4AAAEuQAABLkAACC5AAAguQAAPLkAADy5AABYuQAAWLkAAHS5AAB0uQAAkLkAAJC5AACsuQAArLkAAMi5AADIuQAA5LkAAOS5AAAAugAAALoAABy6AAAcugAAOLoAADi6AABUugAAVLoAAHC6AABwugAAjLoAAIy6AACougAAqLoAAMS6AADEugAA4LoAAOC6AAD8ugAA/LoAABi7AAAYuwAANLsAADS7AABQuwAAULsAAGy7AABsuwAAiLsAAIi7AACkuwAApLsAAMC7AADAuwAA3LsAANy7AAD4uwAA+LsAABS8AAAUvAAAMLwAADC8AABMvAAATLwAAGi8AABovAAAhLwAAIS8AACgvAAAoLwAALy8AAC8vAAA2LwAANi8AAD0vAAA9LwAABC9AAAQvQAALL0AACy9AABIvQAASL0AAGS9AABkvQAAgL0AAIC9AACcvQAAnL0AALi9AAC4vQAA1L0AANS9AADwvQAA8L0AAAy+AAAMvgAAKL4AACi+AABEvgAARL4AAGC+AABgvgAAfL4AAHy+AACYvgAAmL4AALS+AAC0vgAA0L4AANC+AADsvgAA7L4AAAi/AAAIvwAAJL8AACS/AABAvwAAQL8AAFy/AABcvwAAeL8AAHi/AACUvwAAlL8AALC/AACwvwAAzL8AAMy/AADovwAA6L8AAATAAAAEwAAAIMAAACDAAAA8wAAAPMAAAFjAAABYwAAAdMAAAHTAAACQwAAAkMAAAKzAAACswAAAyMAAAMjAAADkwAAA5MAAAADBAAAAwQAAHMEAABzBAAA4wQAAOMEAAFTBAABUwQAAcMEAAHDBAACMwQAAjMEAAKjBAACowQAAxMEAAMTBAADgwQAA4MEAAPzBAAD8wQAAGMIAABjCAAA0wgAANMIAAFDCAABQwgAAbMIAAGzCAACIwgAAiMIAAKTCAACkwgAAwMIAAMDCAADcwgAA3MIAAPjCAAD4wgAAFMMAABTDAAAwwwAAMMMAAEzDAABMwwAAaMMAAGjDAACEwwAAhMMAAKDDAACgwwAAvMMAALzDAADYwwAA2MMAAPTDAAD0wwAAEMQAABDEAAAsxAAALMQAAEjEAABIxAAAZMQAAGTEAACAxAAAgMQAAJzEAACcxAAAuMQAALjEAADUxAAA1MQAAPDEAADwxAAADMUAAAzFAAAoxQAAKMUAAETFAABExQAAYMUAAGDFAAB8xQAAfMUAAJjFAACYxQAAtMUAALTFAADQxQAA0MUAAOzFAADsxQAACMYAAAjGAAAkxgAAJMYAAEDGAABAxgAAXMYAAFzGAAB4xgAAeMYAAJTGAACUxgAAsMYAALDGAADMxgAAzMYAAOjGAADoxgAABMcAAATHAAAgxwAAIMcAADzHAAA8xwAAWMcAAFjHAAB0xwAAdMcAAJDHAACQxwAArMcAAKzHAADIxwAAyMcAAOTHAADkxwAAAMgAAADIAAAcyAAAHMgAADjIAAA4yAAAVMgAAFTIAABwyAAAcMgAAIzIAACMyAAAqMgAAKjIAADEyAAAxMgAAODIAADgyAAA/MgAAPzIAAAYyQAAGMkAADTJAAA0yQAAUMkAAFDJAABsyQAAbMkAAIjJAACIyQAApMkAAKTJAADAyQAAwMkAANzJAADcyQAA+MkAAPjJAAAUygAAFMoAADDKAAAwygAATMoAAEzKAABoygAAaMoAAITKAACEygAAoMoAAKDKAAC8ygAAvMoAANjKAADYygAA9MoAAPTKAAAQywAAEMsAACzLAAAsywAASMsAAEjLAABkywAAZMsAAIDLAACAywAAnMsAAJzLAAC4ywAAuMsAANTLAADUywAA8MsAAPDLAAAMzAAADMwAACjMAAAozAAARMwAAETMAABgzAAAYMwAAHzMAAB8zAAAmMwAAJjMAAC0zAAAtMwAANDMAADQzAAA7MwAAOzMAAAIzQAACM0AACTNAAAkzQAAQM0AAEDNAABczQAAXM0AAHjNAAB4zQAAlM0AAJTNAACwzQAAsM0AAMzNAADMzQAA6M0AAOjNAAAEzgAABM4AACDOAAAgzgAAPM4AADzOAABYzgAAWM4AAHTOAAB0zgAAkM4AAJDOAACszgAArM4AAMjOAADIzgAA5M4AAOTOAAAAzwAAAM8AABzPAAAczwAAOM8AADjPAABUzwAAVM8AAHDPAABwzwAAjM8AAIzPAACozwAAqM8AAMTPAADEzwAA4M8AAODPAAD8zwAA/M8AABjQAAAY0AAANNAAADTQAABQ0AAAUNAAAGzQAABs0AAAiNAAAIjQAACk0AAApNAAAMDQAADA0AAA3NAAANzQAAD40AAA+NAAABTRAAAU0QAAMNEAADDRAABM0QAATNEAAGjRAABo0QAAhNEAAITRAACg0QAAoNEAALzRAAC80QAA2NEAANjRAAD00QAA9NEAABDSAAAQ0gAALNIAACzSAABI0gAASNIAAGTSAABk0gAAgNIAAIDSAACc0gAAnNIAALjSAAC40gAA1NIAANTSAADw0gAA8NIAAAzTAAAM0wAAKNMAACjTAABE0wAARNMAAGDTAABg0wAAfNMAAHzTAACY0wAAmNMAALTTAAC00wAA0NMAANDTAADs0wAA7NMAAAjUAAAI1AAAJNQAACTUAABA1AAAQNQAAFzUAABc1AAAeNQAAHjUAACU1AAAlNQAALDUAACw1AAAzNQAAMzUAADo1AAA6NQAAATVAAAE1QAAINUAACDVAAA81QAAPNUAAFjVAABY1QAAdNUAAHTVAACQ1QAAkNUAAKzVAACs1QAAyNUAAMjVAADk1QAA5NUAAADWAAAA1gAAHNYAABzWAAA41gAAONYAAFTWAABU1gAAcNYAAHDWAACM1gAAjNYAAKjWAACo1gAAxNYAAMTWAADg1gAA4NYAAPzWAAD81gAAGNcAABjXAAA01wAANNcAAFDXAABQ1wAAbNcAAGzXAACI1wAAiNcAAAGsAAAbrAAAHawAADesAAA5rAAAU6wAAFWsAABvrAAAcawAAIusAACNrAAAp6wAAKmsAADDrAAAxawAAN+sAADhrAAA+6wAAP2sAAAXrQAAGa0AADOtAAA1rQAAT60AAFGtAABrrQAAba0AAIetAACJrQAAo60AAKWtAAC/rQAAwa0AANutAADdrQAA960AAPmtAAATrgAAFa4AAC+uAAAxrgAAS64AAE2uAABnrgAAaa4AAIOuAACFrgAAn64AAKGuAAC7rgAAva4AANeuAADZrgAA864AAPWuAAAPrwAAEa8AACuvAAAtrwAAR68AAEmvAABjrwAAZa8AAH+vAACBrwAAm68AAJ2vAAC3rwAAua8AANOvAADVrwAA768AAPGvAAALsAAADbAAACewAAApsAAAQ7AAAEWwAABfsAAAYbAAAHuwAAB9sAAAl7AAAJmwAACzsAAAtbAAAM+wAADRsAAA67AAAO2wAAAHsQAACbEAACOxAAAlsQAAP7EAAEGxAABbsQAAXbEAAHexAAB5sQAAk7EAAJWxAACvsQAAsbEAAMuxAADNsQAA57EAAOmxAAADsgAABbIAAB+yAAAhsgAAO7IAAD2yAABXsgAAWbIAAHOyAAB1sgAAj7IAAJGyAACrsgAArbIAAMeyAADJsgAA47IAAOWyAAD/sgAAAbMAABuzAAAdswAAN7MAADmzAABTswAAVbMAAG+zAABxswAAi7MAAI2zAACnswAAqbMAAMOzAADFswAA37MAAOGzAAD7swAA/bMAABe0AAAZtAAAM7QAADW0AABPtAAAUbQAAGu0AABttAAAh7QAAIm0AACjtAAApbQAAL+0AADBtAAA27QAAN20AAD3tAAA+bQAABO1AAAVtQAAL7UAADG1AABLtQAATbUAAGe1AABptQAAg7UAAIW1AACftQAAobUAALu1AAC9tQAA17UAANm1AADztQAA9bUAAA+2AAARtgAAK7YAAC22AABHtgAASbYAAGO2AABltgAAf7YAAIG2AACbtgAAnbYAALe2AAC5tgAA07YAANW2AADvtgAA8bYAAAu3AAANtwAAJ7cAACm3AABDtwAARbcAAF+3AABhtwAAe7cAAH23AACXtwAAmbcAALO3AAC1twAAz7cAANG3AADrtwAA7bcAAAe4AAAJuAAAI7gAACW4AAA/uAAAQbgAAFu4AABduAAAd7gAAHm4AACTuAAAlbgAAK+4AACxuAAAy7gAAM24AADnuAAA6bgAAAO5AAAFuQAAH7kAACG5AAA7uQAAPbkAAFe5AABZuQAAc7kAAHW5AACPuQAAkbkAAKu5AACtuQAAx7kAAMm5AADjuQAA5bkAAP+5AAABugAAG7oAAB26AAA3ugAAOboAAFO6AABVugAAb7oAAHG6AACLugAAjboAAKe6AACpugAAw7oAAMW6AADfugAA4boAAPu6AAD9ugAAF7sAABm7AAAzuwAANbsAAE+7AABRuwAAa7sAAG27AACHuwAAibsAAKO7AACluwAAv7sAAMG7AADbuwAA3bsAAPe7AAD5uwAAE7wAABW8AAAvvAAAMbwAAEu8AABNvAAAZ7wAAGm8AACDvAAAhbwAAJ+8AAChvAAAu7wAAL28AADXvAAA2bwAAPO8AAD1vAAAD70AABG9AAArvQAALb0AAEe9AABJvQAAY70AAGW9AAB/vQAAgb0AAJu9AACdvQAAt70AALm9AADTvQAA1b0AAO+9AADxvQAAC74AAA2+AAAnvgAAKb4AAEO+AABFvgAAX74AAGG+AAB7vgAAfb4AAJe+AACZvgAAs74AALW+AADPvgAA0b4AAOu+AADtvgAAB78AAAm/AAAjvwAAJb8AAD+/AABBvwAAW78AAF2/AAB3vwAAeb8AAJO/AACVvwAAr78AALG/AADLvwAAzb8AAOe/AADpvwAAA8AAAAXAAAAfwAAAIcAAADvAAAA9wAAAV8AAAFnAAABzwAAAdcAAAI/AAACRwAAAq8AAAK3AAADHwAAAycAAAOPAAADlwAAA/8AAAAHBAAAbwQAAHcEAADfBAAA5wQAAU8EAAFXBAABvwQAAccEAAIvBAACNwQAAp8EAAKnBAADDwQAAxcEAAN/BAADhwQAA+8EAAP3BAAAXwgAAGcIAADPCAAA1wgAAT8IAAFHCAABrwgAAbcIAAIfCAACJwgAAo8IAAKXCAAC/wgAAwcIAANvCAADdwgAA98IAAPnCAAATwwAAFcMAAC/DAAAxwwAAS8MAAE3DAABnwwAAacMAAIPDAACFwwAAn8MAAKHDAAC7wwAAvcMAANfDAADZwwAA88MAAPXDAAAPxAAAEcQAACvEAAAtxAAAR8QAAEnEAABjxAAAZcQAAH/EAACBxAAAm8QAAJ3EAAC3xAAAucQAANPEAADVxAAA78QAAPHEAAALxQAADcUAACfFAAApxQAAQ8UAAEXFAABfxQAAYcUAAHvFAAB9xQAAl8UAAJnFAACzxQAAtcUAAM/FAADRxQAA68UAAO3FAAAHxgAACcYAACPGAAAlxgAAP8YAAEHGAABbxgAAXcYAAHfGAAB5xgAAk8YAAJXGAACvxgAAscYAAMvGAADNxgAA58YAAOnGAAADxwAABccAAB/HAAAhxwAAO8cAAD3HAABXxwAAWccAAHPHAAB1xwAAj8cAAJHHAACrxwAArccAAMfHAADJxwAA48cAAOXHAAD/xwAAAcgAABvIAAAdyAAAN8gAADnIAABTyAAAVcgAAG/IAABxyAAAi8gAAI3IAACnyAAAqcgAAMPIAADFyAAA38gAAOHIAAD7yAAA/cgAABfJAAAZyQAAM8kAADXJAABPyQAAUckAAGvJAABtyQAAh8kAAInJAACjyQAApckAAL/JAADByQAA28kAAN3JAAD3yQAA+ckAABPKAAAVygAAL8oAADHKAABLygAATcoAAGfKAABpygAAg8oAAIXKAACfygAAocoAALvKAAC9ygAA18oAANnKAADzygAA9coAAA/LAAARywAAK8sAAC3LAABHywAAScsAAGPLAABlywAAf8sAAIHLAACbywAAncsAALfLAAC5ywAA08sAANXLAADvywAA8csAAAvMAAANzAAAJ8wAACnMAABDzAAARcwAAF/MAABhzAAAe8wAAH3MAACXzAAAmcwAALPMAAC1zAAAz8wAANHMAADrzAAA7cwAAAfNAAAJzQAAI80AACXNAAA/zQAAQc0AAFvNAABdzQAAd80AAHnNAACTzQAAlc0AAK/NAACxzQAAy80AAM3NAADnzQAA6c0AAAPOAAAFzgAAH84AACHOAAA7zgAAPc4AAFfOAABZzgAAc84AAHXOAACPzgAAkc4AAKvOAACtzgAAx84AAMnOAADjzgAA5c4AAP/OAAABzwAAG88AAB3PAAA3zwAAOc8AAFPPAABVzwAAb88AAHHPAACLzwAAjc8AAKfPAACpzwAAw88AAMXPAADfzwAA4c8AAPvPAAD9zwAAF9AAABnQAAAz0AAANdAAAE/QAABR0AAAa9AAAG3QAACH0AAAidAAAKPQAACl0AAAv9AAAMHQAADb0AAA3dAAAPfQAAD50AAAE9EAABXRAAAv0QAAMdEAAEvRAABN0QAAZ9EAAGnRAACD0QAAhdEAAJ/RAACh0QAAu9EAAL3RAADX0QAA2dEAAPPRAAD1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AQAAhQEAAIgBAACIAQAAjAEAAI0BAACSAQAAkgEAAJUBAACVAQAAmQEAAJsBAACeAQAAngEAAKEBAAChAQAAowEAAKMBAAClAQAApQEAAKgBAACoAQAAqgEAAKsBAACtAQAArQEAALABAACwAQAAtAEAALQBAAC2AQAAtgEAALkBAAC6AQAAvQEAAL8BAADGAQAAxgEAAMkBAADJAQAAzAEAAMwBAADOAQAAzgEAANABAADQAQAA0gEAANIBAADUAQAA1AEAANYBAADWAQAA2AEAANgBAADaAQAA2gEAANwBAADdAQAA3wEAAN8BAADhAQAA4QEAAOMBAADjAQAA5QEAAOUBAADnAQAA5wEAAOkBAADpAQAA6wEAAOsBAADtAQAA7QEAAO8BAADwAQAA8wEAAPMBAAD1AQAA9QEAAPkBAAD5AQAA+wEAAPsBAAD9AQAA/QEAAP8BAAD/AQAAAQIAAAECAAADAgAAAwIAAAUCAAAFAgAABwIAAAcCAAAJAgAACQIAAAsCAAALAgAADQIAAA0CAAAPAgAADwIAABECAAARAgAAEwIAABMCAAAVAgAAFQIAABcCAAAXAgAAGQIAABkCAAAbAgAAGwIAAB0CAAAdAgAAHwIAAB8CAAAhAgAAIQIAACMCAAAjAgAAJQIAACUCAAAnAgAAJwIAACkCAAApAgAAKwIAACsCAAAtAgAALQIAAC8CAAAvAgAAMQIAADECAAAzAgAAOQIAADwCAAA8AgAAPwIAAEACAABCAgAAQgIAAEcCAABHAgAASQIAAEkCAABLAgAASwIAAE0CAABNAgAATwIAAJMCAACVAgAAuAIAAMACAADBAgAA4AIAAOQCAABxAwAAcQMAAHMDAABzAwAAdwMAAHcDAAB6AwAAfQMAAJADAACQAwAArAMAAM4DAADQAwAA0QMAANUDAADXAwAA2QMAANkDAADbAwAA2wMAAN0DAADdAwAA3wMAAN8DAADhAwAA4QMAAOMDAADjAwAA5QMAAOUDAADnAwAA5wMAAOkDAADpAwAA6wMAAOsDAADtAwAA7QMAAO8DAADzAwAA9QMAAPUDAAD4AwAA+AMAAPsDAAD8AwAAMAQAAF8EAABhBAAAYQQAAGMEAABjBAAAZQQAAGUEAABnBAAAZwQAAGkEAABpBAAAawQAAGsEAABtBAAAbQQAAG8EAABvBAAAcQQAAHEEAABzBAAAcwQAAHUEAAB1BAAAdwQAAHcEAAB5BAAAeQQAAHsEAAB7BAAAfQQAAH0EAAB/BAAAfwQAAIEEAACBBAAAiwQAAIsEAACNBAAAjQQAAI8EAACPBAAAkQQAAJEEAACTBAAAkwQAAJUEAACVBAAAlwQAAJcEAACZBAAAmQQAAJsEAACbBAAAnQQAAJ0EAACfBAAAnwQAAKEEAAChBAAAowQAAKMEAAClBAAApQQAAKcEAACnBAAAqQQAAKkEAACrBAAAqwQAAK0EAACtBAAArwQAAK8EAACxBAAAsQQAALMEAACzBAAAtQQAALUEAAC3BAAAtwQAALkEAAC5BAAAuwQAALsEAAC9BAAAvQQAAL8EAAC/BAAAwgQAAMIEAADEBAAAxAQAAMYEAADGBAAAyAQAAMgEAADKBAAAygQAAMwEAADMBAAAzgQAAM8EAADRBAAA0QQAANMEAADTBAAA1QQAANUEAADXBAAA1wQAANkEAADZBAAA2wQAANsEAADdBAAA3QQAAN8EAADfBAAA4QQAAOEEAADjBAAA4wQAAOUEAADlBAAA5wQAAOcEAADpBAAA6QQAAOsEAADrBAAA7QQAAO0EAADvBAAA7wQAAPEEAADxBAAA8wQAAPMEAAD1BAAA9QQAAPcEAAD3BAAA+QQAAPkEAAD7BAAA+wQAAP0EAAD9BAAA/wQAAP8EAAABBQAAAQUAAAMFAAADBQAABQUAAAUFAAAHBQAABwUAAAkFAAAJBQAACwUAAAsFAAANBQAADQUAAA8FAAAPBQAAEQUAABEFAAATBQAAEwUAABUFAAAVBQAAFwUAABcFAAAZBQAAGQUAABsFAAAbBQAAHQUAAB0FAAAfBQAAHwUAACEFAAAhBQAAIwUAACMFAAAlBQAAJQUAACcFAAAnBQAAKQUAACkFAAArBQAAKwUAAC0FAAAtBQAALwUAAC8FAABgBQAAiAUAAPwQAAD8EAAA+BMAAP0TAACAHAAAiBwAAAAdAAC/HQAAAR4AAAEeAAADHgAAAx4AAAUeAAAFHgAABx4AAAceAAAJHgAACR4AAAseAAALHgAADR4AAA0eAAAPHgAADx4AABEeAAARHgAAEx4AABMeAAAVHgAAFR4AABceAAAXHgAAGR4AABkeAAAbHgAAGx4AAB0eAAAdHgAAHx4AAB8eAAAhHgAAIR4AACMeAAAjHgAAJR4AACUeAAAnHgAAJx4AACkeAAApHgAAKx4AACseAAAtHgAALR4AAC8eAAAvHgAAMR4AADEeAAAzHgAAMx4AADUeAAA1HgAANx4AADceAAA5HgAAOR4AADseAAA7HgAAPR4AAD0eAAA/HgAAPx4AAEEeAABBHgAAQx4AAEMeAABFHgAARR4AAEceAABHHgAASR4AAEkeAABLHgAASx4AAE0eAABNHgAATx4AAE8eAABRHgAAUR4AAFMeAABTHgAAVR4AAFUeAABXHgAAVx4AAFkeAABZHgAAWx4AAFseAABdHgAAXR4AAF8eAABfHgAAYR4AAGEeAABjHgAAYx4AAGUeAABlHgAAZx4AAGceAABpHgAAaR4AAGseAABrHgAAbR4AAG0eAABvHgAAbx4AAHEeAABxHgAAcx4AAHMeAAB1HgAAdR4AAHceAAB3HgAAeR4AAHkeAAB7HgAAex4AAH0eAAB9HgAAfx4AAH8eAACBHgAAgR4AAIMeAACDHgAAhR4AAIUeAACHHgAAhx4AAIkeAACJHgAAix4AAIseAACNHgAAjR4AAI8eAACPHgAAkR4AAJEeAACTHgAAkx4AAJUeAACdHgAAnx4AAJ8eAAChHgAAoR4AAKMeAACjHgAApR4AAKUeAACnHgAApx4AAKkeAACpHgAAqx4AAKseAACtHgAArR4AAK8eAACvHgAAsR4AALEeAACzHgAAsx4AALUeAAC1HgAAtx4AALceAAC5HgAAuR4AALseAAC7HgAAvR4AAL0eAAC/HgAAvx4AAMEeAADBHgAAwx4AAMMeAADFHgAAxR4AAMceAADHHgAAyR4AAMkeAADLHgAAyx4AAM0eAADNHgAAzx4AAM8eAADRHgAA0R4AANMeAADTHgAA1R4AANUeAADXHgAA1x4AANkeAADZHgAA2x4AANseAADdHgAA3R4AAN8eAADfHgAA4R4AAOEeAADjHgAA4x4AAOUeAADlHgAA5x4AAOceAADpHgAA6R4AAOseAADrHgAA7R4AAO0eAADvHgAA7x4AAPEeAADxHgAA8x4AAPMeAAD1HgAA9R4AAPceAAD3HgAA+R4AAPkeAAD7HgAA+x4AAP0eAAD9HgAA/x4AAAcfAAAQHwAAFR8AACAfAAAnHwAAMB8AADcfAABAHwAARR8AAFAfAABXHwAAYB8AAGcfAABwHwAAfR8AAIAfAACHHwAAkB8AAJcfAACgHwAApx8AALAfAAC0HwAAth8AALcfAAC+HwAAvh8AAMIfAADEHwAAxh8AAMcfAADQHwAA0x8AANYfAADXHwAA4B8AAOcfAADyHwAA9B8AAPYfAAD3HwAAcSAAAHEgAAB/IAAAfyAAAJAgAACcIAAACiEAAAohAAAOIQAADyEAABMhAAATIQAALyEAAC8hAAA0IQAANCEAADkhAAA5IQAAPCEAAD0hAABGIQAASSEAAE4hAABOIQAAcCEAAH8hAACEIQAAhCEAANAkAADpJAAAMCwAAF8sAABhLAAAYSwAAGUsAABmLAAAaCwAAGgsAABqLAAAaiwAAGwsAABsLAAAcSwAAHEsAABzLAAAdCwAAHYsAAB9LAAAgSwAAIEsAACDLAAAgywAAIUsAACFLAAAhywAAIcsAACJLAAAiSwAAIssAACLLAAAjSwAAI0sAACPLAAAjywAAJEsAACRLAAAkywAAJMsAACVLAAAlSwAAJcsAACXLAAAmSwAAJksAACbLAAAmywAAJ0sAACdLAAAnywAAJ8sAAChLAAAoSwAAKMsAACjLAAApSwAAKUsAACnLAAApywAAKksAACpLAAAqywAAKssAACtLAAArSwAAK8sAACvLAAAsSwAALEsAACzLAAAsywAALUsAAC1LAAAtywAALcsAAC5LAAAuSwAALssAAC7LAAAvSwAAL0sAAC/LAAAvywAAMEsAADBLAAAwywAAMMsAADFLAAAxSwAAMcsAADHLAAAySwAAMksAADLLAAAyywAAM0sAADNLAAAzywAAM8sAADRLAAA0SwAANMsAADTLAAA1SwAANUsAADXLAAA1ywAANksAADZLAAA2ywAANssAADdLAAA3SwAAN8sAADfLAAA4SwAAOEsAADjLAAA5CwAAOwsAADsLAAA7iwAAO4sAADzLAAA8ywAAAAtAAAlLQAAJy0AACctAAAtLQAALS0AAEGmAABBpgAAQ6YAAEOmAABFpgAARaYAAEemAABHpgAASaYAAEmmAABLpgAAS6YAAE2mAABNpgAAT6YAAE+mAABRpgAAUaYAAFOmAABTpgAAVaYAAFWmAABXpgAAV6YAAFmmAABZpgAAW6YAAFumAABdpgAAXaYAAF+mAABfpgAAYaYAAGGmAABjpgAAY6YAAGWmAABlpgAAZ6YAAGemAABppgAAaaYAAGumAABrpgAAbaYAAG2mAACBpgAAgaYAAIOmAACDpgAAhaYAAIWmAACHpgAAh6YAAImmAACJpgAAi6YAAIumAACNpgAAjaYAAI+mAACPpgAAkaYAAJGmAACTpgAAk6YAAJWmAACVpgAAl6YAAJemAACZpgAAmaYAAJumAACdpgAAI6cAACOnAAAlpwAAJacAACenAAAnpwAAKacAACmnAAArpwAAK6cAAC2nAAAtpwAAL6cAADGnAAAzpwAAM6cAADWnAAA1pwAAN6cAADenAAA5pwAAOacAADunAAA7pwAAPacAAD2nAAA/pwAAP6cAAEGnAABBpwAAQ6cAAEOnAABFpwAARacAAEenAABHpwAASacAAEmnAABLpwAAS6cAAE2nAABNpwAAT6cAAE+nAABRpwAAUacAAFOnAABTpwAAVacAAFWnAABXpwAAV6cAAFmnAABZpwAAW6cAAFunAABdpwAAXacAAF+nAABfpwAAYacAAGGnAABjpwAAY6cAAGWnAABlpwAAZ6cAAGenAABppwAAaacAAGunAABrpwAAbacAAG2nAABvpwAAeKcAAHqnAAB6pwAAfKcAAHynAAB/pwAAf6cAAIGnAACBpwAAg6cAAIOnAACFpwAAhacAAIenAACHpwAAjKcAAIynAACOpwAAjqcAAJGnAACRpwAAk6cAAJWnAACXpwAAl6cAAJmnAACZpwAAm6cAAJunAACdpwAAnacAAJ+nAACfpwAAoacAAKGnAACjpwAAo6cAAKWnAAClpwAAp6cAAKenAACppwAAqacAAK+nAACvpwAAtacAALWnAAC3pwAAt6cAALmnAAC5pwAAu6cAALunAAC9pwAAvacAAL+nAAC/pwAAwacAAMGnAADDpwAAw6cAAMinAADIpwAAyqcAAMqnAADRpwAA0acAANOnAADTpwAA1acAANWnAADXpwAA16cAANmnAADZpwAA8qcAAPSnAAD2pwAA9qcAAPinAAD6pwAAMKsAAFqrAABcqwAAaasAAHCrAAC/qwAAAPsAAAb7AAAT+wAAF/sAAEH/AABa/wAAKAQBAE8EAQDYBAEA+wQBAJcFAQChBQEAowUBALEFAQCzBQEAuQUBALsFAQC8BQEAgAcBAIAHAQCDBwEAhQcBAIcHAQCwBwEAsgcBALoHAQDADAEA8gwBAMAYAQDfGAEAYG4BAH9uAQAa1AEAM9QBAE7UAQBU1AEAVtQBAGfUAQCC1AEAm9QBALbUAQC51AEAu9QBALvUAQC91AEAw9QBAMXUAQDP1AEA6tQBAAPVAQAe1QEAN9UBAFLVAQBr1QEAhtUBAJ/VAQC61QEA09UBAO7VAQAH1gEAItYBADvWAQBW1gEAb9YBAIrWAQCl1gEAwtYBANrWAQDc1gEA4dYBAPzWAQAU1wEAFtcBABvXAQA21wEATtcBAFDXAQBV1wEAcNcBAIjXAQCK1wEAj9cBAKrXAQDC1wEAxNcBAMnXAQDL1wEAy9cBAADfAQAJ3wEAC98BAB7fAQAl3wEAKt8BADDgAQBt4AEAIukBAEPpAQAwAAAAOQAAAGAGAABpBgAAawYAAGwGAADwBgAA+QYAAMAHAADJBwAAZgkAAG8JAADmCQAA7wkAAGYKAABvCgAA5goAAO8KAABmCwAAbwsAAOYLAADvCwAAZgwAAG8MAADmDAAA7wwAAGYNAABvDQAA5g0AAO8NAABQDgAAWQ4AANAOAADZDgAAIA8AACkPAABAEAAASRAAAJAQAACZEAAA4BcAAOkXAAAQGAAAGRgAAEYZAABPGQAA0BkAANkZAACAGgAAiRoAAJAaAACZGgAAUBsAAFkbAACwGwAAuRsAAEAcAABJHAAAUBwAAFkcAAAgpgAAKaYAANCoAADZqAAAAKkAAAmpAADQqQAA2akAAPCpAAD5qQAAUKoAAFmqAADwqwAA+asAABD/AAAZ/wAAoAQBAKkEAQAwDQEAOQ0BAGYQAQBvEAEA8BABAPkQAQA2EQEAPxEBANARAQDZEQEA8BIBAPkSAQBQFAEAWRQBANAUAQDZFAEAUBYBAFkWAQDAFgEAyRYBADAXAQA5FwEA4BgBAOkYAQBQGQEAWRkBAFAcAQBZHAEAUB0BAFkdAQCgHQEAqR0BAFAfAQBZHwEAYGoBAGlqAQDAagEAyWoBAFBrAQBZawEAztcBAP/XAQBA4QEASeEBAPDiAQD54gEA8OQBAPnkAQBQ6QEAWekBAPD7AQD5+wEAuwEAALsBAADAAQAAwwEAAJQCAACUAgAAuQIAAL8CAADGAgAA0QIAAOwCAADsAgAA7gIAAO4CAAB0AwAAdAMAAFkFAABZBQAA0AUAAOoFAADvBQAA8wUAACAGAABKBgAAbgYAAG8GAABxBgAA0wYAANUGAADVBgAA5QYAAOYGAADuBgAA7wYAAPoGAAD8BgAA/wYAAP8GAAAQBwAAEAcAABIHAAAvBwAATQcAAKUHAACxBwAAsQcAAMoHAADqBwAA9AcAAPUHAAD6BwAA+gcAAAAIAAAVCAAAGggAABoIAAAkCAAAJAgAACgIAAAoCAAAQAgAAFgIAABgCAAAaggAAHAIAACHCAAAiQgAAI4IAACgCAAAyQgAAAQJAAA5CQAAPQkAAD0JAABQCQAAUAkAAFgJAABhCQAAcQkAAIAJAACFCQAAjAkAAI8JAACQCQAAkwkAAKgJAACqCQAAsAkAALIJAACyCQAAtgkAALkJAAC9CQAAvQkAAM4JAADOCQAA3AkAAN0JAADfCQAA4QkAAPAJAADxCQAA/AkAAPwJAAAFCgAACgoAAA8KAAAQCgAAEwoAACgKAAAqCgAAMAoAADIKAAAzCgAANQoAADYKAAA4CgAAOQoAAFkKAABcCgAAXgoAAF4KAAByCgAAdAoAAIUKAACNCgAAjwoAAJEKAACTCgAAqAoAAKoKAACwCgAAsgoAALMKAAC1CgAAuQoAAL0KAAC9CgAA0AoAANAKAADgCgAA4QoAAPkKAAD5CgAABQsAAAwLAAAPCwAAEAsAABMLAAAoCwAAKgsAADALAAAyCwAAMwsAADULAAA5CwAAPQsAAD0LAABcCwAAXQsAAF8LAABhCwAAcQsAAHELAACDCwAAgwsAAIULAACKCwAAjgsAAJALAACSCwAAlQsAAJkLAACaCwAAnAsAAJwLAACeCwAAnwsAAKMLAACkCwAAqAsAAKoLAACuCwAAuQsAANALAADQCwAABQwAAAwMAAAODAAAEAwAABIMAAAoDAAAKgwAADkMAAA9DAAAPQwAAFgMAABaDAAAXQwAAF0MAABgDAAAYQwAAIAMAACADAAAhQwAAIwMAACODAAAkAwAAJIMAACoDAAAqgwAALMMAAC1DAAAuQwAAL0MAAC9DAAA3QwAAN4MAADgDAAA4QwAAPEMAADyDAAABA0AAAwNAAAODQAAEA0AABINAAA6DQAAPQ0AAD0NAABODQAATg0AAFQNAABWDQAAXw0AAGENAAB6DQAAfw0AAIUNAACWDQAAmg0AALENAACzDQAAuw0AAL0NAAC9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AQAAQQEAAEMBAABDAQAARQEAAEUBAABHAQAARwEAAEoBAABKAQAATAEAAEwBAABOAQAATgEAAFABAABQAQAAUgEAAFIBAABUAQAAVAEAAFYBAABWAQAAWAEAAFgBAABaAQAAWgEAAFwBAABcAQAAXgEAAF4BAABgAQAAYAEAAGIBAABiAQAAZAEAAGQBAABmAQAAZgEAAGgBAABoAQAAagEAAGoBAABsAQAAbAEAAG4BAABuAQAAcAEAAHABAAByAQAAcgEAAHQBAAB0AQAAdgEAAHYBAAB4AQAAeQEAAHsBAAB7AQAAfQEAAH0BAACBAQAAggEAAIQBAACEAQAAhgEAAIcBAACJAQAAiwEAAI4BAACRAQAAkwEAAJQBAACWAQAAmAEAAJwBAACdAQAAnwEAAKABAACiAQAAogEAAKQBAACkAQAApgEAAKcBAACpAQAAqQEAAKwBAACsAQAArgEAAK8BAACxAQAAswEAALUBAAC1AQAAtwEAALgBAAC8AQAAvAEAAMQBAADFAQAAxwEAAMgBAADKAQAAywEAAM0BAADNAQAAzwEAAM8BAADRAQAA0QEAANMBAADTAQAA1QEAANUBAADXAQAA1wEAANkBAADZAQAA2wEAANsBAADeAQAA3gEAAOABAADgAQAA4gEAAOIBAADkAQAA5AEAAOYBAADmAQAA6AEAAOgBAADqAQAA6gEAAOwBAADsAQAA7gEAAO4BAADxAQAA8gEAAPQBAAD0AQAA9gEAAPgBAAD6AQAA+gEAAPwBAAD8AQAA/gEAAP4BAAAAAgAAAAIAAAICAAACAgAABAIAAAQCAAAGAgAABgIAAAgCAAAIAgAACgIAAAoCAAAMAgAADAIAAA4CAAAOAgAAEAIAABACAAASAgAAEgIAABQCAAAUAgAAFgIAABYCAAAYAgAAGAIAABoCAAAaAgAAHAIAABwCAAAeAgAAHgIAACACAAAgAgAAIgIAACICAAAkAgAAJAIAACYCAAAmAgAAKAIAACgCAAAqAgAAKgIAACwCAAAsAgAALgIAAC4CAAAwAgAAMAIAADICAAAyAgAAOgIAADsCAAA9AgAAPgIAAEECAABBAgAAQwIAAEYCAABIAgAASAIAAEoCAABKAgAATAIAAEwCAABOAgAATgIAAHADAABwAwAAcgMAAHIDAAB2AwAAdgMAAH8DAAB/AwAAhgMAAIYDAACIAwAAigMAAIwDAACMAwAAjgMAAI8DAACRAwAAoQMAAKMDAACrAwAAzwMAAM8DAADSAwAA1AMAANgDAADYAwAA2gMAANoDAADcAwAA3AMAAN4DAADeAwAA4AMAAOADAADiAwAA4gMAAOQDAADkAwAA5gMAAOYDAADoAwAA6AMAAOoDAADqAwAA7AMAAOwDAADuAwAA7gMAAPQDAAD0AwAA9wMAAPcDAAD5AwAA+gMAAP0DAAAvBAAAYAQAAGAEAABiBAAAYgQAAGQEAABkBAAAZgQAAGYEAABoBAAAaAQAAGoEAABqBAAAbAQAAGwEAABuBAAAbgQAAHAEAABwBAAAcgQAAHIEAAB0BAAAdAQAAHYEAAB2BAAAeAQAAHgEAAB6BAAAegQAAHwEAAB8BAAAfgQAAH4EAACABAAAgAQAAIoEAACKBAAAjAQAAIwEAACOBAAAjgQAAJAEAACQBAAAkgQAAJIEAACUBAAAlAQAAJYEAACWBAAAmAQAAJgEAACaBAAAmgQAAJwEAACcBAAAngQAAJ4EAACgBAAAoAQAAKIEAACiBAAApAQAAKQEAACmBAAApgQAAKgEAACoBAAAqgQAAKoEAACsBAAArAQAAK4EAACuBAAAsAQAALAEAACyBAAAsgQAALQEAAC0BAAAtgQAALYEAAC4BAAAuAQAALoEAAC6BAAAvAQAALwEAAC+BAAAvgQAAMAEAADBBAAAwwQAAMMEAADFBAAAxQQAAMcEAADHBAAAyQQAAMkEAADLBAAAywQAAM0EAADNBAAA0AQAANAEAADSBAAA0gQAANQEAADUBAAA1gQAANYEAADYBAAA2AQAANoEAADaBAAA3AQAANwEAADeBAAA3gQAAOAEAADgBAAA4gQAAOIEAADkBAAA5AQAAOYEAADmBAAA6AQAAOgEAADqBAAA6gQAAOwEAADsBAAA7gQAAO4EAADwBAAA8AQAAPIEAADyBAAA9AQAAPQEAAD2BAAA9gQAAPgEAAD4BAAA+gQAAPoEAAD8BAAA/AQAAP4EAAD+BAAAAAUAAAAFAAACBQAAAgUAAAQFAAAEBQAABgUAAAYFAAAIBQAACAUAAAoFAAAKBQAADAUAAAwFAAAOBQAADgUAABAFAAAQBQAAEgUAABIFAAAUBQAAFAUAABYFAAAWBQAAGAUAABgFAAAaBQAAGgUAABwFAAAcBQAAHgUAAB4FAAAgBQAAIAUAACIFAAAiBQAAJAUAACQFAAAmBQAAJgUAACgFAAAoBQAAKgUAACoFAAAsBQAALAUAAC4FAAAuBQAAMQUAAFYFAACgEAAAxRAAAMcQAADHEAAAzRAAAM0QAACgEwAA9RMAAAAeAAAAHgAAAh4AAAIeAAAEHgAABB4AAAYeAAAGHgAACB4AAAgeAAAKHgAACh4AAAweAAAMHgAADh4AAA4eAAAQHgAAEB4AABIeAAASHgAAFB4AABQeAAAWHgAAFh4AABgeAAAYHgAAGh4AABoeAAAcHgAAHB4AAB4eAAAeHgAAIB4AACAeAAAiHgAAIh4AACQeAAAkHgAAJh4AACYeAAAoHgAAKB4AACoeAAAqHgAALB4AACweAAAuHgAALh4AADAeAAAwHgAAMh4AADIeAAA0HgAANB4AADYeAAA2HgAAOB4AADgeAAA6HgAAOh4AADweAAA8HgAAPh4AAD4eAABAHgAAQB4AAEIeAABCHgAARB4AAEQeAABGHgAARh4AAEgeAABIHgAASh4AAEoeAABMHgAATB4AAE4eAABOHgAAUB4AAFAeAABSHgAAUh4AAFQeAABUHgAAVh4AAFYeAABYHgAAWB4AAFoeAABaHgAAXB4AAFweAABeHgAAXh4AAGAeAABgHgAAYh4AAGIeAABkHgAAZB4AAGYeAABmHgAAaB4AAGgeAABqHgAAah4AAGweAABsHgAAbh4AAG4eAABwHgAAcB4AAHIeAAByHgAAdB4AAHQeAAB2HgAAdh4AAHgeAAB4HgAAeh4AAHoeAAB8HgAAfB4AAH4eAAB+HgAAgB4AAIAeAACCHgAAgh4AAIQeAACEHgAAhh4AAIYeAACIHgAAiB4AAIoeAACKHgAAjB4AAIweAACOHgAAjh4AAJAeAACQHgAAkh4AAJIeAACUHgAAlB4AAJ4eAACeHgAAoB4AAKAeAACiHgAAoh4AAKQeAACkHgAAph4AAKYeAACoHgAAqB4AAKoeAACqHgAArB4AAKweAACuHgAArh4AALAeAACwHgAAsh4AALIeAAC0HgAAtB4AALYeAAC2HgAAuB4AALgeAAC6HgAAuh4AALweAAC8HgAAvh4AAL4eAADAHgAAwB4AAMIeAADCHgAAxB4AAMQeAADGHgAAxh4AAMgeAADIHgAAyh4AAMoeAADMHgAAzB4AAM4eAADOHgAA0B4AANAeAADSHgAA0h4AANQeAADUHgAA1h4AANYeAADYHgAA2B4AANoeAADaHgAA3B4AANweAADeHgAA3h4AAOAeAADgHgAA4h4AAOIeAADkHgAA5B4AAOYeAADmHgAA6B4AAOgeAADqHgAA6h4AAOweAADsHgAA7h4AAO4eAADwHgAA8B4AAPIeAADyHgAA9B4AAPQeAAD2HgAA9h4AAPgeAAD4HgAA+h4AAPoeAAD8HgAA/B4AAP4eAAD+HgAACB8AAA8fAAAYHwAAHR8AACgfAAAvHwAAOB8AAD8fAABIHwAATR8AAFkfAABZHwAAWx8AAFsfAABdHwAAXR8AAF8fAABfHwAAaB8AAG8fAACIHwAAjx8AAJgfAACfHwAAqB8AAK8fAAC4HwAAvB8AAMgfAADMHwAA2B8AANsfAADoHwAA7B8AAPgfAAD8HwAAAiEAAAIhAAAHIQAAByEAAAshAAANIQAAECEAABIhAAAVIQAAFSEAABkhAAAdIQAAJCEAACQhAAAmIQAAJiEAACghAAAoIQAAKiEAAC0hAAAwIQAAMyEAAD4hAAA/IQAARSEAAEUhAABgIQAAbyEAAIMhAACDIQAAtiQAAM8kAAAALAAALywAAGAsAABgLAAAYiwAAGQsAABnLAAAZywAAGksAABpLAAAaywAAGssAABtLAAAcCwAAHIsAAByLAAAdSwAAHUsAAB+LAAAgCwAAIIsAACCLAAAhCwAAIQsAACGLAAAhiwAAIgsAACILAAAiiwAAIosAACMLAAAjCwAAI4sAACOLAAAkCwAAJAsAACSLAAAkiwAAJQsAACULAAAliwAAJYsAACYLAAAmCwAAJosAACaLAAAnCwAAJwsAACeLAAAniwAAKAsAACgLAAAoiwAAKIsAACkLAAApCwAAKYsAACmLAAAqCwAAKgsAACqLAAAqiwAAKwsAACsLAAAriwAAK4sAACwLAAAsCwAALIsAACyLAAAtCwAALQsAAC2LAAAtiwAALgsAAC4LAAAuiwAALosAAC8LAAAvCwAAL4sAAC+LAAAwCwAAMAsAADCLAAAwiwAAMQsAADELAAAxiwAAMYsAADILAAAyCwAAMosAADKLAAAzCwAAMwsAADOLAAAziwAANAsAADQLAAA0iwAANIsAADULAAA1CwAANYsAADWLAAA2CwAANgsAADaLAAA2iwAANwsAADcLAAA3iwAAN4sAADgLAAA4CwAAOIsAADiLAAA6ywAAOssAADtLAAA7SwAAPIsAADyLAAAQKYAAECmAABCpgAAQqYAAESmAABEpgAARqYAAEamAABIpgAASKYAAEqmAABKpgAATKYAAEymAABOpgAATqYAAFCmAABQpgAAUqYAAFKmAABUpgAAVKYAAFamAABWpgAAWKYAAFimAABapgAAWqYAAFymAABcpgAAXqYAAF6mAABgpgAAYKYAAGKmAABipgAAZKYAAGSmAABmpgAAZqYAAGimAABopgAAaqYAAGqmAABspgAAbKYAAICmAACApgAAgqYAAIKmAACEpgAAhKYAAIamAACGpgAAiKYAAIimAACKpgAAiqYAAIymAACMpgAAjqYAAI6mAACQpgAAkKYAAJKmAACSpgAAlKYAAJSmAACWpgAAlqYAAJimAACYpgAAmqYAAJqmAAAipwAAIqcAACSnAAAkpwAAJqcAACanAAAopwAAKKcAACqnAAAqpwAALKcAACynAAAupwAALqcAADKnAAAypwAANKcAADSnAAA2pwAANqcAADinAAA4pwAAOqcAADqnAAA8pwAAPKcAAD6nAAA+pwAAQKcAAECnAABCpwAAQqcAAESnAABEpwAARqcAAEanAABIpwAASKcAAEqnAABKpwAATKcAAEynAABOpwAATqcAAFCnAABQpwAAUqcAAFKnAABUpwAAVKcAAFanAABWpwAAWKcAAFinAABapwAAWqcAAFynAABcpwAAXqcAAF6nAABgpwAAYKcAAGKnAABipwAAZKcAAGSnAABmpwAAZqcAAGinAABopwAAaqcAAGqnAABspwAAbKcAAG6nAABupwAAeacAAHmnAAB7pwAAe6cAAH2nAAB+pwAAgKcAAICnAACCpwAAgqcAAISnAACEpwAAhqcAAIanAACLpwAAi6cAAI2nAACNpwAAkKcAAJCnAACSpwAAkqcAAJanAACWpwAAmKcAAJinAACapwAAmqcAAJynAACcpwAAnqcAAJ6nAACgpwAAoKcAAKKnAACipwAApKcAAKSnAACmpwAApqcAAKinAACopwAAqqcAAK6nAACwpwAAtKcAALanAAC2pwAAuKcAALinAAC6pwAAuqcAALynAAC8pwAAvqcAAL6nAADApwAAwKcAAMKnAADCpwAAxKcAAMenAADJpwAAyacAANCnAADQpwAA1qcAANanAADYpwAA2KcAAPWnAAD1pwAAIf8AADr/AAAABAEAJwQBALAEAQDTBAEAcAUBAHoFAQB8BQEAigUBAIwFAQCSBQEAlAUBAJUFAQCADAEAsgwBAKAYAQC/GAEAQG4BAF9uAQAA1AEAGdQBADTUAQBN1AEAaNQBAIHUAQCc1AEAnNQBAJ7UAQCf1AEAotQBAKLUAQCl1AEAptQBAKnUAQCs1AEArtQBALXUAQDQ1AEA6dQBAATVAQAF1QEAB9UBAArVAQAN1QEAFNUBABbVAQAc1QEAONUBADnVAQA71QEAPtUBAEDVAQBE1QEARtUBAEbVAQBK1QEAUNUBAGzVAQCF1QEAoNUBALnVAQDU1QEA7dUBAAjWAQAh1gEAPNYBAFXWAQBw1gEAidYBAKjWAQDA1gEA4tYBAPrWAQAc1wEANNcBAFbXAQBu1wEAkNcBAKjXAQDK1wEAytcBAADpAQAh6QEAMPEBAEnxAQBQ8QEAafEBAHDxAQCJ8QEAlociAAUAAABohiUABAAAAL5jIgACAAAA4DglAAEAAACihyIABQAAAIiGJQAtAAAA9GMiAAYAAADwhyUAOQEAAChbIgAGAAAAuJElABUAAAAgZCIAAgAAAPBEJQABAAAAtYciAAUAAABgkiUAnQIAALqHIgAHAAAASKclAEEAAACuhyIABwAAAFCpJQAfAgAAz4ciAAkAAABIuiUAEwAAAO+HIgAFAAAA4LolAE0AAADjhyIAAwAAAEi9JQACAAAA64ciAAIAAABYvSUACQAAAPaHIgAFAAAAoL0lAIwCAAAkGiIAZgAAAHcDAAAcAAAAJBoiAGYAAACqAwAACQAAACQaIgBmAAAAqwMAAAkAAAAkGiIAZgAAAK4DAAAPAAAAJBoiAGYAAACgAwAADQAAACQaIgBmAAAAnQMAAA0AAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1zeW50YXgtMC44LjQvc3JjL3V0ZjgucnMAQNMlAGMAAABBAQAAGgAAAEDTJQBjAAAAtAEAAC0AAABA0yUAYwAAALUBAAArAAAAQNMlAGMAAAC4AQAACQAAAEludGVydmFsU2V0cmFuZ2VzZm9sZGVkTGl0ZXJhbENsYXNzVW5pY29kZUNsYXNzQnl0ZXNSZXBldGl0aW9uR3JvdXBvbGRfZmxhZ3NDb25jYXRBbHRlcm5hdGlvbkFsdGVybmF0aW9uQnJhbmNoAAAAAAAAAQAAAAEAAADpBAAAAAAAAAQAAAAEAAAABgUAAGNhc2VfaW5zZW5zaXRpdmVtdWx0aV9saW5lZG90X21hdGNoZXNfbmV3X2xpbmVzd2FwX2dyZWVkdW5pY29kZWNybGYAdNQlABAAAACE1CUACgAAAI7UJQAUAAAAotQlAAoAAACs1CUABwAAALPUJQAEAAAARmxhZ3NMb29rQ2FwdHVyZVN0YXJ0RW5kU3RhcnRMRkVuZExGU3RhcnRDUkxGRW5kQ1JMRldvcmRBc2NpaVdvcmRBc2NpaU5lZ2F0ZVdvcmRVbmljb2RlV29yZFVuaWNvZGVOZWdhdGVXb3JkU3RhcnRBc2NpaVdvcmRFbmRBc2NpaVdvcmRTdGFydFVuaWNvZGVXb3JkRW5kVW5pY29kZVdvcmRTdGFydEhhbGZBc2NpaVdvcmRFbmRIYWxmQXNjaWlXb3JkU3RhcnRIYWxmVW5pY29kZVdvcmRFbmRIYWxmVW5pY29kZWluZGV4bWlubWF4Z3JlZWR5KCkvcnVzdGMvMmU2ODgyYWM1YmUyN2E3MzI5M2Q2ZjdhZTU2Mzk3ZmRmMzI4NDhkZS9saWJyYXJ5L2NvcmUvc3JjL29wcy9mdW5jdGlvbi5ycwDj1SUAUAAAAKYAAAAFAAAAAAAAAAAAAAABAAAABwUAAEludmFsaWREaWdpdFBvc092ZXJmbG93TmVnT3ZlcmZsb3daZXJvAAAAAAAADAAAAAQAAAAIBQAACQUAAAoFAABfWk4vcnVzdC9kZXBzL3J1c3RjLWRlbWFuZ2xlLTAuMS4yNC9zcmMvbGVnYWN5LnJzAAAAl9YlAC4AAAA9AAAACwAAAJfWJQAuAAAAOgAAAAsAAACX1iUALgAAADYAAAALAAAAl9YlAC4AAABmAAAAHAAAAJfWJQAuAAAAbwAAACcAAACX1iUALgAAAHAAAAAdAAAAl9YlAC4AAAByAAAAIQAAAJfWJQAuAAAAcwAAABoAAAA6OgAAl9YlAC4AAAB+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cmluZ0VPRiB3aGlsZSBwYXJzaW5nIGEgdmFsdWVleHBlY3RlZCBgOmBleHBlY3RlZCBgLGAgb3IgYF1gZXhwZWN0ZWQgYCxgIG9yIGB9YGV4cGVjdGVkIGlkZW50ZXhwZWN0ZWQgdmFsdWVleHBlY3RlZCBgImBpbnZhbGlkIGVzY2FwZWludmFsaWQgbnVtYmVybnVtYmVyIG91dCBvZiByYW5nZWludmFsaWQgdW5pY29kZSBjb2RlIHBvaW50Y29udHJvbCBjaGFyYWN0ZXIgKFx1MDAwMC1cdTAwMUYpIGZvdW5kIHdoaWxlIHBhcnNpbmcgYSBzdHJpbmdrZXkgbXVzdCBiZSBhIHN0cmluZ2ludmFsaWQgdmFsdWU6IGV4cGVjdGVkIGtleSB0byBiZSBhIG51bWJlciBpbiBxdW90ZXNmbG9hdCBrZXkgbXVzdCBiZSBmaW5pdGUgKGdvdCBOYU4gb3IgKy8taW5mKWxvbmUgbGVhZGluZyBzdXJyb2dhdGUgaW4gaGV4IGVzY2FwZXRyYWlsaW5nIGNvbW1hdHJhaWxpbmcgY2hhcmFjdGVyc3VuZXhwZWN0ZWQgZW5kIG9mIGhleCBlc2NhcGVyZWN1cnNpb24gbGltaXQgZXhjZWVkZWQgYXQgbGluZSAgY29sdW1uIAAAAAEAAAAAAAAAeAomAAkAAACBCiYACAAAAEVycm9yKCwgbGluZTogLCBjb2x1bW46IKQKJgAGAAAAqgomAAgAAACyCiYACgAAALNAJwABAAAA4AcmAGQAAAD3AQAAIQAAAOAHJgBkAAAA+wEAAAwAAADgByYAZAAAAAICAAAhAAAA4AcmAGQAAAALAgAAKgAAAOAHJgBkAAAADwIAACwAAABpbnZhbGlkIHR5cGU6ICwgZXhwZWN0ZWQgAAAALAsmAA4AAAA6CyYACwAAAAAAAAAAAAAAAQAAABUFAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zZXJkZS13YXNtLWJpbmRnZW4tMC42LjUvc3JjL2xpYi5yc2gLJgBoAAAANQAAAA4AAAAAAAAAAAAAAAEAAAAZBAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc21hcnRzdHJpbmctMS4wLjEvc3JjL2lubGluZS5yc/ALJgBkAAAAKwAAACsAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zbWFydHN0cmluZy0xLjAuMS9zcmMvYm94ZWQucnMAZAwmAGMAAABBAAAADgAAAGQMJgBjAAAAdgAAACQAAAA6IAAAAAAAAAQAAAAEAAAAFgUAAC9ydXN0L2RlcHMvZGxtYWxsb2MtMC4yLjgvc3JjL2RsbWFsbG9jLnJzYXNzZXJ0aW9uIGZhaWxlZDogcHNpemUgPj0gc2l6ZSArIG1pbl9vdmVyaGVhZAD8DCYAKQAAAKwEAAAJAAAAYXNzZXJ0aW9uIGZhaWxlZDogcHNpemUgPD0gc2l6ZSArIG1heF9vdmVyaGVhZAAA/AwmACkAAACyBAAADQAAAHVzZSBvZiBzdGQ6OnRocmVhZDo6Y3VycmVudCgpIGlzIG5vdCBwb3NzaWJsZSBhZnRlciB0aGUgdGhyZWFkJ3MgbG9jYWwgZGF0YSBoYXMgYmVlbiBkZXN0cm95ZWQAAKQNJgBeAAAAbGlicmFyeS9zdGQvc3JjL3RocmVhZC9jdXJyZW50LnJzAAAADA4mACEAAAABAQAACQAAAEFjY2Vzc0Vycm9yY2Fubm90IGFjY2VzcyBhIFRocmVhZCBMb2NhbCBTdG9yYWdlIHZhbHVlIGR1cmluZyBvciBhZnRlciBkZXN0cnVjdGlvbjogAEsOJgBIAAAAbGlicmFyeS9zdGQvc3JjL3RocmVhZC9tb2QucnNmYWlsZWQgdG8gZ2VuZXJhdGUgdW5pcXVlIHRocmVhZCBJRDogYml0c3BhY2UgZXhoYXVzdGVkuQ4mADcAAACcDiYAHQAAAKkEAAANAAAAbGlicmFyeS9zdGQvc3JjL3N5bmMvbGF6eV9sb2NrLnJzAAAACA8mACEAAADRAAAAEwAAAGxpYnJhcnkvc3RkL3NyYy9iYWNrdHJhY2UucnN1bnN1cHBvcnRlZCBiYWNrdHJhY2VkaXNhYmxlZCBiYWNrdHJhY2UAPA8mABwAAACKAQAAHQAAABcFAAAQAAAABAAAABgFAAAZBQAAV291bGRCbG9ja2VudGl0eSBub3QgZm91bmRwZXJtaXNzaW9uIGRlbmllZGNvbm5lY3Rpb24gcmVmdXNlZGNvbm5lY3Rpb24gcmVzZXRob3N0IHVucmVhY2hhYmxlbmV0d29yayB1bnJlYWNoYWJsZWNvbm5lY3Rpb24gYWJvcnRlZG5vdCBjb25uZWN0ZWRhZGRyZXNzIGluIHVzZWFkZHJlc3Mgbm90IGF2YWlsYWJsZW5ldHdvcmsgZG93bmJyb2tlbiBwaXBlZW50aXR5IGFscmVhZHkgZXhpc3Rzb3BlcmF0aW9uIHdvdWxkIGJsb2Nrbm90IGEgZGlyZWN0b3J5aXMgYSBkaXJlY3RvcnlkaXJlY3Rvcnkgbm90IGVtcHR5cmVhZC1vbmx5IGZpbGVzeXN0ZW0gb3Igc3RvcmFnZSBtZWRpdW1maWxlc3lzdGVtIGxvb3Agb3IgaW5kaXJlY3Rpb24gbGltaXQgKGUuZy4gc3ltbGluayBsb29wKXN0YWxlIG5ldHdvcmsgZmlsZSBoYW5kbGVpbnZhbGlkIGlucHV0IHBhcmFtZXRlcmludmFsaWQgZGF0YXRpbWVkIG91dHdyaXRlIHplcm9ubyBzdG9yYWdlIHNwYWNlc2VlayBvbiB1bnNlZWthYmxlIGZpbGVxdW90YSBleGNlZWRlZGZpbGUgdG9vIGxhcmdlcmVzb3VyY2UgYnVzeWV4ZWN1dGFibGUgZmlsZSBidXN5ZGVhZGxvY2tjcm9zcy1kZXZpY2UgbGluayBvciByZW5hbWV0b28gbWFueSBsaW5rc2ludmFsaWQgZmlsZW5hbWVhcmd1bWVudCBsaXN0IHRvbyBsb25nb3BlcmF0aW9uIGludGVycnVwdGVkdW5zdXBwb3J0ZWR1bmV4cGVjdGVkIGVuZCBvZiBmaWxlb3V0IG9mIG1lbW9yeWluIHByb2dyZXNzb3RoZXIgZXJyb3J1bmNhdGVnb3JpemVkIGVycm9yT3Njb2RlS2luZEN1c3RvbSAob3MgZXJyb3IgAAABAAAAAAAAAKsSJgALAAAAs0AnAAEAAABsaWJyYXJ5L3N0ZC9zcmMvcGF0aC5ycwDQEiYAFwAAANMCAAAhAAAA0BImABcAAAD6AgAALAAAANASJgAXAAAA/AIAACYAAADQEiYAFwAAAAkDAAAnAAAA0BImABcAAAAVAwAAJwAAANASJgAXAAAAfwMAACkAAADQEiYAFwAAAIADAAArAAAA0BImABcAAACVAwAALwAAANASJgAXAAAAjQMAAC8AAADQEiYAFwAAAJsDAAArAAAAbGlicmFyeS9zdGQvc3JjL3N5cy9zeW5jL211dGV4L25vX3RocmVhZHMucnOIEyYALAAAABMAAAAJAAAAbGlicmFyeS9zdGQvc3JjL3N5bmMvcG9pc29uL29uY2UucnMAxBMmACMAAADWAAAAFAAAADx1bmtub3duPu+/vWxpYnJhcnkvc3RkL3NyYy8uLi8uLi9iYWNrdHJhY2Uvc3JjL3N5bWJvbGl6ZS9tb2QucnMEFCYANAAAAGcBAAAwAAAAAQAAAAAAAADoDCYAAgAAAAIAAAAAAAAAAAAEAAAAAAAAAAAAIAAA6CAtIAABAAAAAAAAAHAUJgADAAAAAgAAAAAAAAABAAAAAQAAAAAAAAAgAADoICAgICAgICAgICAgICAgICAgIGF0IAAAxeUmAAEAAABOb3RGb3VuZFBlcm1pc3Npb25EZW5pZWRDb25uZWN0aW9uUmVmdXNlZENvbm5lY3Rpb25SZXNldEhvc3RVbnJlYWNoYWJsZU5ldHdvcmtVbnJlYWNoYWJsZUNvbm5lY3Rpb25BYm9ydGVkTm90Q29ubmVjdGVkQWRkckluVXNlQWRkck5vdEF2YWlsYWJsZU5ldHdvcmtEb3duQnJva2VuUGlwZUFscmVhZHlFeGlzdHNOb3RBRGlyZWN0b3J5SXNBRGlyZWN0b3J5RGlyZWN0b3J5Tm90RW1wdHlSZWFkT25seUZpbGVzeXN0ZW1GaWxlc3lzdGVtTG9vcFN0YWxlTmV0d29ya0ZpbGVIYW5kbGVJbnZhbGlkSW5wdXRJbnZhbGlkRGF0YVRpbWVkT3V0V3JpdGVaZXJvU3RvcmFnZUZ1bGxOb3RTZWVrYWJsZVF1b3RhRXhjZWVkZWRGaWxlVG9vTGFyZ2VSZXNvdXJjZUJ1c3lFeGVjdXRhYmxlRmlsZUJ1c3lEZWFkbG9ja0Nyb3NzZXNEZXZpY2VzVG9vTWFueUxpbmtzSW52YWxpZEZpbGVuYW1lQXJndW1lbnRMaXN0VG9vTG9uZ0ludGVycnVwdGVkVW5zdXBwb3J0ZWRVbmV4cGVjdGVkRW9mT3V0T2ZNZW1vcnlJblByb2dyZXNzT3RoZXJVbmNhdGVnb3JpemVkb3BlcmF0aW9uIHN1Y2Nlc3NmdWxPbmNlIGluc3RhbmNlIGhhcyBwcmV2aW91c2x5IGJlZW4gcG9pc29uZWQAAOQWJgAqAAAAb25lLXRpbWUgaW5pdGlhbGl6YXRpb24gbWF5IG5vdCBiZSBwZXJmb3JtZWQgcmVjdXJzaXZlbHkYFyYAOAAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3J1c3RjLWhhc2gtMi4xLjEvc3JjL2xpYi5yc1gXJgBgAAAAIwEAABwAAABYFyYAYAAAACQBAAAoAAAAWBcmAGAAAAAlAQAAKAAAAFgXJgBgAAAACAEAACsAAABYFyYAYAAAAAgBAABCAAAAWBcmAGAAAAAFAQAAKwAAAFgXJgBgAAAABQEAAEIAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi91bmljb2RlLXdpZHRoLTAuMi4yL3NyYy90YWJsZXMucnMAACgYJgBmAAAAuAAAABUAAAAoGCYAZgAAAL4AAAAZAAAAb3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybbAYJgAoAAAAJAAAAAAAAAACAAAA2BgmAGNhbm5vdCByZWN1cnNpdmVseSBhY3F1aXJlIG11dGV48BgmACAAAAAvcnVzdGMvMmU2ODgyYWM1YmUyN2E3MzI5M2Q2ZjdhZTU2Mzk3ZmRmMzI4NDhkZS9saWJyYXJ5L3N0ZC9zcmMvc3lzL3N5bmMvbXV0ZXgvbm9fdGhyZWFkcy5ycxgZJgBcAAAAEwAAAAkAAACZAwAADAAAAAQAAAAaBQAAGwUAAJwDAAAAAAAAAAAAAAEAAACdAwAAAAAAAAQAAAAEAAAAHAUAAAAAAAAAAAAAAQAAAB0FAAAAAAAABAAAAAQAAAAeBQAAAAAAAAQAAAAEAAAAEQEAAC9ydXN0Yy8yZTY4ODJhYzViZTI3YTczMjkzZDZmN2FlNTYzOTdmZGYzMjg0OGRlL2xpYnJh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AAAAPGFub24+AAAsISYABgAAADxtYWNybyBleHBhbnNpb24+AAAAPCEmABEAAAA8cHJvYy1tYWNybyBzb3VyY2UgY29kZT5YISYAGAAAAP3NJgABAAAAAM4mAAEAAADUICYAIwAAAMECAAAaAAAAYXNzZXJ0aW9uIGZhaWxlZDogbGluZV9pbmRleCA8IGFuYWx5c2lzLmxpbmVzLmxlbigpIGFzIGlzaXpl1CAmACMAAAAiBAAACQAAAE1lc3NhZ2VsZXZlbFN1YkRpYWdub3N0aWNyZW5kZXJfc3Bhbk1haW5IZWFkZXJNc2dIZWFkZXJNc2dMaW5lQW5kQ29sdW1uTGluZU51bWJlclF1b3RhdGlvblVuZGVybGluZVByaW1hcnlVbmRlcmxpbmVTZWNvbmRhcnlMYWJlbFByaW1hcnlMYWJlbFNlY29uZGFyeU9sZFNjaG9vbE5vdGVUZXh0Tm9TdHlsZUxldmVsSGlnaGxpZ2h0AAAAAAAAAAABAAAAKAUAACkFAAAqBQAAQnVnRmF0YWxQaGFzZUZhdGFsV2FybmluZ05vdGVIZWxwQ2FuY2VsbGVkRmFpbHVyZU5vdGUAAAArBQAATWFyaywFAABQcmltYXJ5U3BhbkxhYmVsTXVsdGlTcGFucHJpbWFyeV9zcGFuc3NwYW5fbGFiZWxzQnl0ZVBvcy9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3BoZl9zaGFyZWQtMC4xMS4zL3NyYy9saWIucnMAAAA0IyYAYQAAADsAAAAFAAAAAAAAAAwAAAAEAAAALQUAAC4FAABjcmF0ZXMvc3djX2VjbWFfYXN0L3NyYy9saXN0LnJzALwjJgAfAAAAxQAAABIAAAC8IyYAHwAAAM8AAAASAAAAAAAAAAcAAAAUAAAAGgAAAAEAAAAAAAAAEgAAAAoAAAAAAAAAHgAAAAEAAAAMAAAAAQAAAAoAAAAaAAAACAAAADnpJgAIAAAAqc0mAAMAAADp6CYABQAAAPzeJgAGAAAANeYmAAQAAACM6CYABQAAAMbNJgAGAAAAXOcmAAcAAABJ6CYABAAAAOLoJgAHAAAAMekmAAgAAAD16CYABQAAANboJgACAAAA2OgmAAQAAADC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eHByZXNzaW9uLCBvciBjbGFzcy5JbXBvcnQgaXMgbm90IGFsbG93ZWQgaGVyZUFuIGFycm93IGZ1bmN0aW9uIGlzIG5vdCBhbGxvd2VkIGhlcmVgZXhwb3J0YCBpcyBub3QgYWxsb3dlZCBoZXJlQSBnZXR0ZXIgb3IgYSBzZXR0ZXIgY2Fubm90IGJlIHJlYWRvbmx5QSBnZXR0ZXIgb3IgYSBzZXR0ZXIgY2Fubm90IGJlIG9wdGlvbmFsQSBgZ2V0YCBhY2Nlc3NvciBjYW5ub3QgaGF2ZSBwYXJhbWV0ZXJzQSBgc2V0YCBhY2Nlc3NvciBtdXN0IGhhdmUgZXhhY3RseSBvbmUgcGFyYW1ldGVydG9wIGxldmVsIGF3YWl0IGlzIG9ubHkgYWxsb3dlZCBpbiBtb2R1bGVMZWdhY3kgZGVjaW1hbCBlc2NhcGUgaXMgbm90IHBlcm1pdHRlZCBpbiBzdHJpY3QgbW9kZUxlZ2FjeSBvY3RhbCBlc2NhcGUgaXMgbm90IHBlcm1pdHRlZCBpbiBzdHJpY3QgbW9kZUludmFsaWQgY2hhcmFjdGVyIGluIGlkZW50aWZpZXJhIGJpbmFyeWFuIG9jdGFsYSBkZWNpbWFsYSBoZXhhZGVjaW1hbEV4cGVjdGVkICBkaWdpdAAApzQmAAkAAACwNCYABgAAAGNyYXRlcy9zd2NfZWNtYV9wYXJzZXIvc3JjL2Vycm9yLnJzAMg0JgAjAAAAQgEAABoAAABTZXR0ZXIgc2hvdWxkIGhhdmUgZXhhY3RseSBvbmUgcGFyYW1ldGVyUmVzdCBwYXR0ZXJuIGlzIG5vdCBhbGxvd2VkIGluIHNldHRlclVudGVybWluYXRlZCBibG9jayBjb21tZW50VW50ZXJtaW5hdGVkIHN0cmluZyBjb25zdGFudEV4cGVjdGVkIHVuaWNvZGUgZXNjYXBlVW5leHBlY3RlZCBlc2NhcGUgc2VxdWVuY2UgaW4gcmVzZXJ2ZWQgd29yZDogAJY1JgAtAAAAVW50ZXJtaW5hdGVkIHJlZ2V4cCBsaXRlcmFsVW50ZXJtaW5hdGVkIHRlbXBsYXRlSWRlbnRpZmllciBjYW5ub3QgZm9sbG93IG51bWJlclVuZXhwZWN0ZWQgY2hhcmFjdGVyIBs2JgAVAAAASW52YWxpZCBzdHJpbmcgZXNjYXBlSW52YWxpZCB1bmljb2RlIGVzY2FwZUJhZCBjaGFyYWN0ZXIgZXNjYXBlIHNlcXVlbmNlLCBleHBlY3RlZCAAYzYmACgAAABFeHBlY3RlZCArLCAtIG9yIGRlY2ltYWwgZGlnaXQgYWZ0ZXIgZUxlZ2FjeSBjb21tZW50cyBjYW5ub3QgYmUgdXNlZCBpbiBtb2R1bGUgY29kZWAgY2Fubm90IGJlIHVzZWQgYXMgYW4gaWRlbnRpZmllciBpbiBzdHJpY3QgbW9kZQA63yYAAQAAAOc2JgAwAAAAYGF3YWl0YCBjYW5ub3QgYmUgdXNlZCBhcyBhbiBpZGVudGlmaWVyIGluIGFuIGFzeW5jIGNvbnRleHQnZXZhbCcgYW5kICdhcmd1bWVudHMnIGNhbm5vdCBiZSB1c2VkIGFzIGEgYmluZGluZyBpZGVudGlmaWVyIGluIHN0cmljdCBtb2RlJ2FyZ3VtZW50cycgaXMgb25seSBhbGxvd2VkIGluIGZ1bmN0aW9ucyBhbmQgY2xhc3MgbWV0aG9kc0lsbGVnYWwgJ3VzZSBzdHJpY3QnIGRpcmVjdGl2ZSBpbiBmdW5jdGlvbiB3aXRoIG5vbi1zaW1wbGUgcGFyYW1ldGVyIGxpc3QuJyoqJyBjYW5ub3QgYmUgYXBwbGllZCB0byB1bmFyeS9hd2FpdCBleHByZXNzaW9uLlVuZXhwZWN0ZWQgdG9rZW4gJyMnTGluZUJyZWFrIGNhbm5vdCBmb2xsb3cgJ3Rocm93J1VuZXhwZWN0ZWQgbGluZSBicmVhayBiZXR3ZWVuIGFycm93IGhlYWQgYW5kIGFycm93VW5leHBlY3RlZCB0b2tlbiBgYC4gRXhwZWN0ZWQgAMk4JgASAAAA2zgmAAwAAAAgLCBvciAAAPs4JgADAAAAIG9yIFVuZXhwZWN0ZWQgdG9rZW4uIERpZCB5b3UgbWVhbiAADDkmAB8AAADg5SYAAQAAAGNhbm5vdCBpbXBvcnQgYXMgcmVzZXJ2ZWQgd29yZGFzc2lnbm1lbnQgcHJvcGVydHkgaXMgaW52YWxpZCBzeW50YXhFeHBlY3RlZCAnJywgZ290ICcnAAB/OSYACgAAAIk5JgAIAAAAkTkmAAEAAABFeHBlY3RlZCAnOycsICd9JyBvciA8ZW9mPmF3YWl0KiBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIGFzeW5jIGZ1bmN0aW9ucyBwcm9wb3NhbC4gVXNlIFByb21pc2UuYWxsKCkgaW5zdGVhZC5DYW5ub3QgdXNlIGEgcmVzZXJ2ZWQgd29yZCBhcyBhIHNob3J0aGFuZCBwcm9wZXJ0eU51bGxpc2ggY29hbGVzY2luZyBvcGVyYXRvcig/PykgcmVxdWlyZXMgcGFyZW5zIHdoZW4gbWl4aW5nIHdpdGggbG9naWNhbCBvcGVyYXRvcnNBIHN3aXRjaCBibG9jayBjYW5ub3QgaGF2ZSBtdWx0aXBsZSBkZWZhdWx0c1RyYWlsaW5nIGNvbW1hIGlzbid0IHBlcm1pdHRlZCBhZnRlciBhIHJlc3QgZWxlbWVudFJlc3QgZWxlbWVudCBtdXN0IGJlIGZpbmFsIGVsZW1lbnRQYXJlbnRoZXNpemVkIGV4cHJlc3Npb24gY2Fubm90IGNvbnRhaW4gc3ByZWFkIG9wZXJhdG9yUGFyZW50aGVzaXplZCBleHByZXNzaW9uIGNhbm5vdCBiZSBlbXB0eU5vdCBhIHBhdHRlcm5Ob3QgYW4gZXhwcmVzc2lvbkNhbm5vdCBhc3NpZ24gdG8gdGhpc0ludmFsaWQgYXNzaWdubWVudCB0YXJnZXRFeHBlY3RlZCBpZGVudEV4cGVjdGVkICc7JyBvciBsaW5lIGJyZWFrTGFiZWwgIGlzIGFscmVhZHkgZGVjbGFyZWQAAADzOyYABgAAAPk7JgAUAAAAQW4gYXN5bmMgZnVuY3Rpb24gY2Fubm90IGJlIGdlbmVyYXRvcidpbXBvcnQnLCBhbmQgJ2V4cG9ydCcgYXJlIG5vdCBwZXJtaXR0ZWQgaGVyZSdpbXBvcnQnLCBhbmQgJ2V4cG9ydCcgY2Fubm90IGJlIHVzZWQgb3V0c2lkZSBvZiBtb2R1bGUgY29kZSdpbXBvcnQubWV0YScgY2Fubm90IGJlIHVzZWQgb3V0c2lkZSBvZiBtb2R1bGUgY29kZS5EZXN0cnVjdHVyaW5nIGJpbmRpbmdzIHJlcXVpcmUgaW5pdGlhbGl6ZXJzV2l0aCBzdGF0ZW1lbnQgYXJlIG5vdCBhbGxvd2VkIGluIHN0cmljdCBtb2RlUmV0dXJuIHN0YXRlbWVudCBpcyBub3QgYWxsb3dlZCBoZXJlRXhwZWN0ZWQgb25lIHZhcmlhYmxlIGJpbmRpbmdVbmV4cGVjdGVkIGluaXRpYWxpemVyIGluIGZvciBpbi9vZiBsb29wR2VuZXJhdG9yIG9yIGFzeW5jIGZ1bmN0aW9uIGNhbm5vdCBiZSBsYWJlbGxlZEZ1bmN0aW9uIGNhbm5vdCBiZSBsYWJlbGxlZCBpbiBzdHJpY3QgbW9kZSd5aWVsZCcgY2Fubm90IGJlIHVzZWQgYXMgYSBwYXJhbWV0ZXIgd2l0aGluIGdlbmVyYXRvcmBhd2FpdGAgZXhwcmVzc2lvbnMgY2Fubm90IGJlIHVzZWQgaW4gYSBwYXJhbWV0ZXIgaW5pdGlhbGl6ZXIuZm9yIGF3YWl0IHN5bnRheCBpcyB2YWxpZCBvbmx5IGZvciBmb3Itb2Ygc3RhdGVtZW50YXdhaXQgaXNuJ3QgYWxsb3dlZCBpbiBub24tYXN5bmMgZnVuY3Rpb25VbnRlcm1pbmF0ZWQgSlNYIGNvbnRlbnRzSlNYIGF0dHJpYnV0ZXMgbXVzdCBvbmx5IGJlIGFzc2lnbmVkIGEgbm9uLWVtcHR5IGV4cHJlc3Npb25KU1ggdmFsdWUgc2hvdWxkIGJlIGVpdGhlciBhbiBleHByZXNzaW9uIG9yIGEgcXVvdGVkIEpTWCB0ZXh0RXhwZWN0ZWQgY29ycmVzcG9uZGluZyBKU1ggY2xvc2luZyB0YWcgZm9yIDw+RXhwZWN0ZWQgY29ycmVzcG9uZGluZyBKU1ggY2xvc2luZyB0YWcgZm9yIDwAAACJPyYALAAAAADOJgABAAAATGVhZGluZyBkZWNvcmF0b3JzIG11c3QgYmUgYXR0YWNoZWQgdG8gYSBjbGFzcyBkZWNsYXJhdGlvblVzaW5nIHRoZSBleHBvcnQga2V5d29yZCBiZXR3ZWVuIGEgZGVjb3JhdG9yIGFuZCBhIGNsYXNzIGlzIG5vdCBhbGxvd2VkLiBQbGVhc2UgdXNlIGBleHBvcnQgQGRlYyBjbGFzc2AgaW5zdGVhZC5BIHJlcXVpcmVkIGVsZW1lbnQgY2Fubm90IGZvbGxvdyBhbiBvcHRpb25hbCBlbGVtZW50LlR5cGVzY3JpcHQgcGFyYW1ldGVyIHByb3BlcnR5IG11c3QgYmUgYW4gaWRlbnRpZmllciBvciBhc3NpZ25tZW50IHBhdHRlcm5VbmV4cGVjdGVkIHNwYWNlIGJldHdlZW4gIyBhbmQgaWRlbnRpZmllckNvbnN0cnVjdG9yIGNhbid0IGJlIGFuIGFzeW5jIGZ1bmN0aW9uQ2xhc3NlcyBtYXkgbm90IGhhdmUgYSBub24tc3RhdGljIGZpZWxkIG5hbWVkICdjb25zdHJ1Y3RvcidDbGFzc2VzIGNhbid0IGhhdmUgYSBwcml2YXRlIGZpZWxkIG5hbWVkICcjY29uc3RydWN0b3InLicgbW9kaWZpZXIgY2Fubm90IGJlIHVzZWQgd2l0aCBhIHByaXZhdGUgaWRlbnRpZmllcgAAAJE5JgABAAAAskEmADMAAABDbGFzcyBjb25zdHJ1Y3RvciBjYW4ndCBiZSBhbiBhY2Nlc3Nvci5BIG1ldGhvZCBjYW5ub3QgYmUgcmVhZG9ubHlBIGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBnZW5lcmF0b3JBIGNsYXNzIGNhbiBvbmx5IGhhdmUgb25lIGNvbnN0cnVjdG9yQSBiaW5kaW5nIHBhdHRlcm4gcGFyYW1ldGVyIGNhbm5vdCBiZSBvcHRpb25hbCBpbiBhbiBpbXBsZW1lbnRhdGlvbiBzaWduYXR1cmUuU3VwZXIgY2FsbCBjYW5ub3QgYmUgb3B0aW9uYWxDb25zdHJ1Y3RvciBpbi9hZnRlciBhbiBvcHRpb25hbCBjaGFpbmluZyBpcyBub3QgYWxsb3dlZC5UYWdnZWQgdGVtcGxhdGUgbGl0ZXJhbCBpcyBub3QgYWxsb3dlZCBpbiBvcHRpb25hbCBjaGFpbi5UcmFpbGluZyBjb21tYSBpcyBkaXNhbGxvd2VkIGluc2lkZSBpbXBvcnQoLi4uKSBhcmd1bWVudHNgaW1wb3J0KClgIHJlcXVpcmVzIGV4YWN0bHkgb25lIG9yIHR3byBhcmd1bWVudHNleHBvcnQgZGVmYXVsdCBzdGF0ZW1lbnRzIHJlcXVpcmVkIGZyb20gJy4uLic7YCBjYW5ub3QgYmUgdXNlZCB3aXRob3V0IGBmcm9tYCBjbGF1c2UAADrfJgABAAAA9EMmACYAAABgLi4uYCBtdXN0IGJlIGZvbGxvd2VkIGJ5IGFuIGlkZW50aWZpZXIgaW4gZGVjbGFyYXRpb24gY29udGV4dHNBIG51bWVyaWMgc2VwYXJhdG9yIGlzIG9ubHkgYWxsb3dlZCBiZXR3ZWVuIHR3byBkaWdpdHNBIHN0cmluZyBsaXRlcmFsIGNhbm5vdCBiZSB1c2VkIGFzIGFuIGltcG9ydGVkIGJpbmRpbmcuCi0gRGlkIHlvdSBtZWFuIGBpbXBvcnQgeyAiIiBhcyBmb28gfWA/AKFEJgBSAAAA80QmAAwAAABBIHN0cmluZyBsaXRlcmFsIGNhbm5vdCBiZSB1c2VkIGFzIGFuIGV4cG9ydGVkIGJpbmRpbmcgd2l0aG91dCBgZnJvbWAuJ2NvbnN0JyBkZWNsYXJhdGlvbnMgbXVzdCBiZSBpbml0aWFsaXplZER1cGxpY2F0ZWQgcmVndWxhciBleHByZXNzaW9uIGZsYWcgJycufkUmACQAAACiRSYAAgAAAFVua25vd24gcmVndWxhciBleHByZXNzaW9uIGZsYWdzLkV4cGVjdGVkIGFuIGlkZW50aWZpZXJFeHBlY3RlZCBhIHNlbWljb2xvblRyYWlsaW5nIGNvbW1hIGlzIG5vdCBhbGxvd2VkQSByZXN0IHBhcmFtZXRlciBtdXN0IGJlIGxhc3QgaW4gYSBwYXJhbWV0ZXIgbGlzdFBhcmFtZXRlciBjYW5ub3QgaGF2ZSBxdWVzdGlvbiBtYXJrIGFuZCBpbml0aWFsaXplcicgbW9kaWZpZXIgbXVzdCBwcmVjZWRlICcnIG1vZGlmaWVyLpE5JgABAAAAgEYmABkAAACZRiYACwAAACcgbW9kaWZpZXIgYWxyZWFkeSBzZWVuLpE5JgABAAAAvEYmABgAAABgZGVjbGFyZWAgbW9kaWZpZXIgY2Fubm90IGFwcGVhciBvbiBjbGFzcyBlbGVtZW50cyBvZiB0aGlzIGtpbmRgZGVjbGFyZWAgbW9kaWZpZXIgbm90IGFsbG93ZWQgZm9yIGNvZGUgYWxyZWFkeSBpbiBhbiBhbWJpZW50IGNvbnRleHRgYXN5bmNgIG1vZGlmaWVyIGNhbm5vdCBiZSB1c2VkIGhlcmVBIHJlc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBvcHRpb25hbEEgcmVzdCBwYXJhbWV0ZXIgY2Fubm90IGhhdmUgYW4gaW5pdGlhbGl6ZXJqc2MudGFyZ2V0IHNob3VsZCBiZSBlczUgb3IgdXBwZXIgdG8gdXNlIGdldHRlciAvIHNldHRlckxlZ2FjeSBvY3RhbCBsaXRlcmFscyBhcmUgbm90IGF2YWlsYWJsZSB3aGVuIHRhcmdldGluZyBFQ01BU2NyaXB0IDUgYW5kIGhpZ2hlcicgbW9kaWZpZXIgY2Fubm90IGFwcGVhciBvbiBhIGNvbnN0cnVjdG9yIGRlY2xhcmF0aW9uAAAAkTkmAAEAAABgSCYANQAAAFR5cGUgcGFyYW1ldGVycyBjYW5ub3QgYXBwZWFyIG9uIGEgY29uc3RydWN0b3IgZGVjbGFyYXRpb25BbiBpbmRleCBzaWduYXR1cmUgbXVzdCBoYXZlIGV4YWN0bHkgb25lIHBhcmFtZXRlclR5cGUgcGFyYW1ldGVyIGxpc3QgY2Fubm90IGJlIGVtcHR5SW52YWxpZCB1c2Ugb2YgJ2FyZ3VtZW50cycgaW4gc3RyaWN0IG1vZGUnZGVsZXRlJyBjYW5ub3QgYmUgY2FsbGVkIG9uIGFuIGlkZW50aWZpZXIgaW4gc3RyaWN0IG1vZGVBICdicmVhaycgc3RhdGVtZW50IGNhbiBvbmx5IGJlIHVzZWQgd2l0aGluIGFuIGVuY2xvc2luZyBpdGVyYXRpb24gb3Igc3dpdGNoIHN0YXRlbWVudFRoZSBsZWZ0LWhhbmQgc2lkZSBvZiBhIGBmb3IuLi5vZmAgc3RhdGVtZW50IG1heSBub3QgYmUgYGFzeW5jYEp1bXAgdGFyZ2V0IGNhbm5vdCBjcm9zcyBmdW5jdGlvbiBib3VuZGFyeUV4cHJlc3Npb24gZXhwZWN0ZWR0eXBlIGV4cGVjdGVkRHVwbGljYXRlIGxhYmVsQSAnY29udGludWUnIHN0YXRlbWVudCBjYW4gb25seSBqdW1wIHRvIGEgbGFiZWwgb2YgYW4gZW5jbG9zaW5nIGl0ZXJhdGlvbiBzdGF0ZW1lbnRBICdicmVhaycgc3RhdGVtZW50IGNhbiBvbmx5IGp1bXAgdG8gYSBsYWJlbCBvZiBhbiBlbmNsb3Npbmcgc3RhdGVtZW50VmFyaWFibGUgZGVjbGFyYXRpb24gbGlzdCBjYW5ub3QgYmUgZW1wdHlsaXRlcmFsIGluIGFuIGltcG9ydCB0eXBlIHNob3VsZCBiZSBzdHJpbmcgbGl0ZXJhbEFuIG9iamVjdCBtZW1iZXIgY2Fubm90IGJlIGRlY2xhcmVkIG9wdGlvbmFsQ29tcHV0ZWQgcHJvcGVydHkgbmFtZXMgYXJlIG5vdCBhbGxvd2VkIGluIGVudW1zQSBjb21tYSBleHByZXNzaW9uIGlzIG5vdCBhbGxvd2VkIGluIGEgY29tcHV0ZWQgcHJvcGVydHkgbmFtZWBleHRlbmRzYCBjbGF1c2UgYWxyZWFkeSBzZWVuLidleHRlbmRzJyBjbGF1c2UgbXVzdCBwcmVjZWRlICdpbXBsZW1lbnRzJyBjbGF1c2UuQ2xhc3NlcyBjYW4gb25seSBleHRlbmQgYSBzaW5nbGUgY2xhc3NgaW1wbGVtZW50c2AgY2xhdXNlIGFscmVhZHkgc2VlbkFuIGltcGxlbWVudGF0aW9uIGNhbm5vdCBiZSBkZWNsYXJlZCBpbiBhbWJpZW50IGNvbnRleHRzTW9kaWZpZXJzIGNhbm5vdCBhcHBlYXIgaGVyZU1lcmdlIGNvbmZsaWN0IG1hcmtlciBlbmNvdW50ZXJlZC5UeXBlIGFubm90YXRpb24gY2Fubm90IGFwcGVhciBvbiBhIGNvbnN0cnVjdG9yIGRlY2xhcmF0aW9uQ2F0Y2ggY2xhdXNlIHZhcmlhYmxlIGNhbm5vdCBoYXZlIGEgdHlwZSBhbm5vdGF0aW9uYGFic3RyYWN0YCBtb2RpZmllciBjYW4gb25seSBhcHBlYXIgb24gYSBjbGFzcyBvciBtZXRob2QgZGVjbGFyYXRpb24nIG1vZGlmaWVyIGNhbm5vdCBiZSB1c2VkIHdpdGggJwAAAJE5JgABAAAA0U0mACAAAACZRiYACwAAAEFic3RyYWN0IG1ldGhvZHMgY2FuIG9ubHkgYXBwZWFyIHdpdGhpbiBhbiBhYnN0cmFjdCBjbGFzcy5BYnN0cmFjdCBtZXRob2QgY2Fubm90IGhhdmUgYW4gaW1wbGVtZW50YXRpb24uQWJzdHJhY3QgcHJvcGVydHkgY2Fubm90IGhhdmUgYW4gaW5pdGlhbGl6ZXIuJyBtb2RpZmllciBjYW5ub3QgYXBwZWFyIG9uIGEgdHlwZSBwYXJhbWV0ZXIAAACROSYAAQAAAKFOJgAsAAAAJyBtb2RpZmllciBjYW4gb25seSBhcHBlYXIgb24gYSB0eXBlIHBhcmFtZXRlciBvZiBhIGNsYXNzLCBpbnRlcmZhY2Ugb3IgdHlwZSBhbGlhcwAAkTkmAAEAAADgTiYAUgAAACcgbW9kaWZpZXIgY2FuIG9ubHkgYXBwZWFyIG9uIGEgdHlwZSBwYXJhbWV0ZXIgb2YgYSBmdW5jdGlvbiwgbWV0aG9kIG9yIGNsYXNzAAAAkTkmAAEAAABETyYATQAAAFRoZSAndHlwZScgbW9kaWZpZXIgY2Fubm90IGJlIHVzZWQgb24gYSBuYW1lZCBpbXBvcnQgd2hlbiAnaW1wb3J0IHR5cGUnIGlzIHVzZWQgb24gaXRzIGltcG9ydCBzdGF0ZW1lbnQuVGhlICd0eXBlJyBtb2RpZmllciBjYW5ub3QgYmUgdXNlZCBvbiBhIG5hbWVkIGV4cG9ydCB3aGVuICdleHBvcnQgdHlwZScgaXMgdXNlZCBvbiBpdHMgZXhwb3J0IHN0YXRlbWVudC5BIHBhcmFtZXRlciBwcm9wZXJ0eSBpcyBvbmx5IGFsbG93ZWQgaW4gYSBjb25zdHJ1Y3RvciBpbXBsZW1lbnRhdGlvbkEgcGFyYW1ldGVyIGluaXRpYWxpemVyIGlzIG9ubHkgYWxsb3dlZCBpbiBhIGZ1bmN0aW9uIG9yIGNvbnN0cnVjdG9yIGltcGxlbWVudGF0aW9uVGhlIGxlZnQtaGFuZCBzaWRlIG9mIGFuIGFzc2lnbm1lbnQgZXhwcmVzc2lvbiBtdXN0IGJlIGEgdmFyaWFibGUgb3IgYSBwcm9wZXJ0eSBhY2Nlc3MuVGhlICd3aXRoJyBzdGF0ZW1lbnQgaXMgbm90IHN1cHBvcnRlZC4gQWxsIHN5bWJvbHMgaW4gYSAnd2l0aCcgYmxvY2sgd2lsbCBoYXZlIHR5cGUgJ2FueScuSW52YWxpZCBjbGFzcyBuYW1laW50ZXJmYWNlIG5hbWUgaXMgaW52YWxpZEFuIGVudW0gbWVtYmVyIGNhbm5vdCBoYXZlIGEgbnVtZXJpYyBuYW1lVGhlIGxlZnQtaGFuZCBzaWRlIG9mIGEgJ2Zvci4uLm9mJyBzdGF0ZW1lbnQgY2Fubm90IHVzZSBhIHR5cGUgYW5ub3RhdGlvblRoZSBsZWZ0LWhhbmQgc2lkZSBvZiBhICdmb3IuLi5pbicgc3RhdGVtZW50IGNhbm5vdCBiZSBhIGRlc3RydWN0dXJpbmcgcGF0dGVybkFuIGludGVyZmFjZSBjYW4gb25seSBleHRlbmQgYW4gaWRlbnRpZmllci9xdWFsaWZpZWQtbmFtZSB3aXRoIG9wdGlvbmFsIHR5cGUgYXJndW1lbnRzLlRoZSBvcGVyYW5kIG9mIGEgZGVsZXRlIG9wZXJhdG9yIG11c3QgYmUgYSBwcm9wZXJ0eSByZWZlcmVuY2UuVGhpcyBtZW1iZXIgY2Fubm90IGhhdmUgYW4gJ292ZXJyaWRlJyBtb2RpZmllciBiZWNhdXNlIGl0cyBjb250YWluaW5nIGNsYXNzIGRvZXMgbm90IGV4dGVuZCBhbm90aGVyIGNsYXNzLkRlY29yYXRvcnMgbWF5IG5vdCBhcHBlYXIgYWZ0ZXIgYGV4cG9ydGAgb3IgYGV4cG9ydCBkZWZhdWx0YCBpZiB0aGV5IGFsc28gYXBwZWFyIGJlZm9yZSBgZXhwb3J0YC5BbiBhY2Nlc3NpYmlsaXR5IG1vZGlmaWVyIGNhbm5vdCBiZSB1c2VkIHdpdGggYSBwcml2YXRlIGlkZW50aWZpZXIuVHlwZSBhbm5vdGF0aW9ucyBtdXN0IGNvbWUgYmVmb3JlIGRlZmF1bHQgYXNzaWdubWVudHNUeXBlc2NyaXB0IG5vbi1udWxsIGFzc2VydGlvbiBvcGVyYXRvciBpcyBub3QgYWxsb3dlZCB3aXRoICcAf1QmADwAAACROSYAAQAAAFRoaXMgc3ludGF4IGlzIHJlc2VydmVkIGluIGZpbGVzIHdpdGggdGhlIC5tdHMgb3IgLmN0cyBleHRlbnNpb24uIFVzZSBhbiBgYXNgIGV4cHJlc3Npb24gaW5zdGVhZC5UaGlzIHN5bnRheCBpcyByZXNlcnZlZCBpbiBmaWxlcyB3aXRoIHRoZSAubXRzIG9yIC5jdHMgZXh0ZW5zaW9uLiBBZGQgYSB0cmFpbGluZyBjb21tYSwgYXMgaW4gYDxULD4oKSA9PiAuLi5gLlR5cGUgYXJndW1lbnQgbGlzdCBjYW5ub3QgYmUgZW1wdHkuVGhpcyBpcyB0aGUgZXhwcmVzc2lvbiBwYXJ0IG9mIGFuIGV4cHJl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AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAABAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEAAAAAAAAAAAAAAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBPT09PTw8PDw8ID4+Pj4gY3JhdGVzL3N3Y19lY21hX3BhcnNlci9zcmMvbGV4ZXIvbW9kLnJzAADPYiYAJwAAAHEBAAAWAAAAKC4mADUAAADRAAAAFAAAAM9iJgAnAAAA2AEAACgAAADPYiYAJwAAAOQBAAAeAAAAz2ImACcAAACYAAAAFQAAAEBXJgAzAAAAMQAAABcAAABAVyYAMwAAADYAAAAeAAAAz2ImACcAAACTAgAAJgAAAM9iJgAnAAAA/AIAACoAAABmYWlsZWQgdG8gcGFyc2UgZmxvYXQgbGl0ZXJhbAAAAM9iJgAnAAAATAQAABkAAADPYiYAJwAAAPsDAABWAAAAz2ImACcAAACtBAAAPgAAAA/OJgABAAAAp80mAAEAAADPYiYAJwAAAO4EAAAlAAAAz2ImACcAAADvBAAANQAAAGZhaWxlZCB0byBwYXJzZSBudW1iZXIgYXMgY2hhcgAAz2ImACcAAADQBAAADgAAAGZhaWxlZCB0byBwYXJzZSBzdHJpbmcgYXMgbnVtYmVyz2ImACcAAADOBAAALwAAADQgaGV4IGNoYXJhY3RlcnMxLTYgaGV4IGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIDAgdG8gMTBGRkZGLjEtNiBoZXggY2hhcmFjdGVyczIgaGV4IGNoYXJhY3RlcnMAAM9iJgAnAAAAYAYAADkAAABcdQAA2GQmAAIAAAACAAAAAAAAAAAABAAAAAAAAAAAACAAAOl8fHx8fCAAAM9iJgAnAAAAZggAACAAAADPYiYAJwAAAKsIAAAmAAAAAQAAAAAAAADf5SYAAQAAAAEAAAAAAAAAxeUmAAEAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBVc2luZyBpcyBub3QgYSB2YWxpZCBkZWNsYXJhdGlvbiBmb3IgYGRlY2xhcmVgIGtleXdvcmREZSYAYAAAAGNyYXRlcy9zd2NfZWNtYV9wYXJzZXIvc3JjL3BhcnNlci90eXBlc2NyaXB0LnJzAKxlJgAvAAAALAAAABwAAABFb2ZEZWNsTm90QWxsb3dlZFVzaW5nRGVjbE5vdEFsbG93ZWRVc2luZ0RlY2xOb3RBbGxvd2VkRm9yRm9ySW5Mb29wVXNpbmdEZWNsTm90RW5hYmxlZEludmFsaWROYW1lSW5Vc2luZ0RlY2xJbml0UmVxdWlyZWRGb3JVc2luZ0RlY2xQcml2YXRlTmFtZUluSW50ZXJmYWNlSW52YWxpZFN1cGVyQ2FsbEludmFsaWRTdXBlckludmFsaWRTdXBlclByaXZhdGVOYW1lSW52YWxpZE5ld1RhcmdldEludmFsaWRJbXBvcnRBcnJvd05vdEFsbG93ZWRFeHBvcnROb3RBbGxvd2VkR2V0dGVyU2V0dGVyQ2Fubm90QmVSZWFkb25seUdldHRlclNldHRlckNhbm5vdEJlT3B0aW9uYWxHZXR0ZXJQYXJhbVNldHRlclBhcmFtVG9wTGV2ZWxBd2FpdEluU2NyaXB0TGVnYWN5RGVjaW1hbExlZ2FjeU9jdGFsSW52YWxpZElkZW50Q2hhckV4cGVjdGVkRGlnaXRyYWRpeFNldHRlclBhcmFtUmVxdWlyZWRSZXN0UGF0SW5TZXR0ZXJVbnRlcm1pbmF0ZWRCbG9ja0NvbW1lbnRVbnRlcm1pbmF0ZWRTdHJMaXRFeHBlY3RlZFVuaWNvZGVFc2NhcGVFc2NhcGVJblJlc2VydmVkV29yZHdvcmRVbnRlcm1pbmF0ZWRSZWdFeHBVbnRlcm1pbmF0ZWRUcGxJZGVudEFmdGVyTnVtVW5leHBlY3RlZENoYXJJbnZhbGlkU3RyRXNjYXBlSW52YWxpZFVuaWNvZGVFc2NhcGVCYWRDaGFyYWN0ZXJFc2NhcGVTZXF1ZW5jZWV4cGVjdGVkTnVtTGl0VGVybWluYXRlZFdpdGhFeHBMZWdhY3lDb21tZW50SW5Nb2R1bGVJbnZhbGlkSWRlbnRJblN0cmljdEludmFsaWRJZGVudEluQXN5bmNFdmFsQW5kQXJndW1lbnRzSW5TdHJpY3RBcmd1bWVudHNJbkNsYXNzRmllbGRJbGxlZ2FsTGFuZ3VhZ2VNb2RlRGlyZWN0aXZlVW5hcnlJbkV4cGxlZnRfc3Bhbkhhc2hMaW5lQnJlYWtJblRocm93TGluZUJyZWFrQmVmb3JlQXJyb3dVbmV4cGVjdGVkZ290VW5leHBlY3RlZFRva2VuV2l0aFN1Z2dlc3Rpb25zY2FuZGlkYXRlX2xpc3RSZXNlcnZlZFdvcmRJbkltcG9ydEFzc2lnblByb3BlcnR5RXhwZWN0ZWRFeHBlY3RlZFNlbWlGb3JFeHByU3RtdEF3YWl0U3RhclJlc2VydmVkV29yZEluT2JqU2hvcnRoYW5kT3JQYXROdWxsaXNoQ29hbGVzY2luZ1dpdGhMb2dpY2FsT3BNdWx0aXBsZURlZmF1bHRwcmV2aW91c0NvbW1hQWZ0ZXJSZXN0RWxlbWVudE5vbkxhc3RSZXN0UGFyYW1TcHJlYWRJblBhcmVuRXhwckVtcHR5UGFyZW5FeHBySW52YWxpZFBhdEludmFsaWRFeHByTm90U2ltcGxlQXNzaWduSW52YWxpZEFzc2lnblRhcmdldEV4cGVjdGVkSWRlbnRFeHBlY3RlZFNlbWlEdXBsaWNhdGVMYWJlbEFzeW5jR2VuZXJhdG9yTm9uVG9wTGV2ZWxJbXBvcnRFeHBvcnRJbXBvcnRFeHBvcnRJblNjcmlwdEltcG9ydE1ldGFJblNjcmlwdFBhdFZhcldpdGhvdXRJbml0V2l0aEluU3RyaWN0UmV0dXJuTm90QWxsb3dlZFRvb01hbnlWYXJJbkZvckluSGVhZFZhckluaXRpYWxpemVySW5Gb3JJbkhlYWRMYWJlbGxlZEdlbmVyYXRvck9yQXN5bmNMYWJlbGxlZEZ1bmN0aW9uSW5TdHJpY3RZaWVsZFBhcmFtSW5HZW5Bd2FpdFBhcmFtSW5Bc3luY0F3YWl0Rm9yU3RtdEF3YWl0SW5GdW5jdGlvblVudGVybWluYXRlZEpTWENvbnRlbnRzRW1wdHlKU1hBdHRySW52YWxpZEpTWFZhbHVlSlNYRXhwZWN0ZWRDbG9zaW5nVGFnRm9yTHRHdEpTWEV4cGVjdGVkQ2xvc2luZ1RhZ0ludmFsaWRMZWFkaW5nRGVjb3JhdG9yRGVjb3JhdG9yT25FeHBvcnRUc1JlcXVpcmVkQWZ0ZXJPcHRpb25hbFRzSW52YWxpZFBhcmFtUHJvcFBhdFNwYWNlQmV0d2Vlbkhhc2hBbmRJZGVudEFzeW5jQ29uc3RydWN0b3JQcm9wZXJ0eU5hbWVkQ29uc3RydWN0b3JQcml2YXRlQ29uc3RydWN0b3JQcml2YXRlTmFtZU1vZGlmaWVyQ29uc3RydWN0b3JBY2Nlc3NvclJlYWRPbmx5TWV0aG9kR2VuZXJhdG9yQ29uc3RydWN0b3JEdXBsaWNhdGVDb25zdHJ1Y3RvclRzQmluZGluZ1BhdENhbm5vdEJlT3B0aW9uYWxTdXBlckNhbGxPcHRpb25hbE9wdENoYWluQ2Fubm90Rm9sbG93Q29uc3RydWN0b3JDYWxsVGFnZ2VkVHBsSW5PcHRDaGFpblRyYWlsaW5nQ29tbWFJbnNpZGVJbXBvcnRJbXBvcnRSZXF1aXJlc09uZU9yVHdvQXJnc0V4cG9ydERlZmF1bHRXaXRoT3V0RnJvbUV4cG9ydEV4cGVjdEZyb21Eb3RzV2l0aG91dElkZW50aWZpZXJOdW1lcmljU2VwYXJhdG9ySXNBbGxvd2VkT25seUJldHdlZW5Ud29EaWdpdHNJbXBvcnRCaW5kaW5nSXNTdHJpbmdFeHBvcnRCaW5kaW5nSXNTdHJpbmdDb25zdERlY2xhcmF0aW9uc1JlcXVpcmVJbml0aWFsaXphdGlvbkR1cGxpY2F0ZWRSZWdFeHBGbGFnc1Vua25vd25SZWdFeHBGbGFnc1RTMTAwM1RTMTAwNVRTMTAwOVRTMTAxNFRTMTAxNVRTMTAyOVRTMTAzMFRTMTAzMVRTMTAzOFRTMTA0MlRTMTA0N1RTMTA0OFRTMTA1NlRTMTA4NVRTMTA4OVRTMTA5MlRTMTA5NlRTMTA5OFRTMTEwMFRTMTEwMlRTMTEwNVRTMTEwNlRTMTEwN1RTMTEwOVRTMTExMFRTMTExNFRTMTExNVRTMTExNlRTMTEyM1RTMTE0MVRTMTE2MlRTMTE2NFRTMTE3MVRTMTE3MlRTMTE3M1RTMTE3NFRTMTE3NVRTMTE4M1RTMTE4NFRTMTE4NVRTMTA5M1RTMTE5NlRTMTI0MlRTMTI0M1RTMTI0NFRTMTI0NVRTMTI2N1RTMTI3M1RTMTI3NFRTMTI3N1RTMjIwNlRTMjIwN1RTMjM2OVRTMjM3MVRTMjQwNlRTMjQxMFRTMjQxNFRTMjQyN1RTMjQ1MlRTMjQ4M1RTMjQ5MVRTMjQ5OVRTMjcwM1RTNDExMlRTODAzOFRTMTgwMTBUU1R5cGVBbm5vdGF0aW9uQWZ0ZXJBc3NpZ25Uc05vbk51bGxBc3NlcnRpb25Ob3RBbGxvd2VkV2l0aExhYmVsaW5uZXJub3RlUmVzZXJ2ZWRUeXBlQXNzZXJ0aW9uUmVzZXJ2ZWRBcnJvd1R5cGVQYXJhbUVtcHR5VHlwZUFyZ3VtZW50TGlzdHF1b3RhbXBhcG9zbHRndG5ic3BpZXhjbGNlbnRwb3VuZGN1cnJlbnllbmJydmJhcnNlY3R1bWxjb3B5b3JkZmxhcXVvbm90c2h5cmVnbWFjcmRlZ3BsdXNtbnN1cDJzdXAzYWN1dGVtaWNyb3BhcmFtaWRkb3RjZWRpbHN1cDFvcmRtcmFxdW9mcmFjMTRmcmFjMTJmcmFjMzRpcXVlc3RBZ3JhdmVBYWN1dGVBY2lyY0F0aWxkZUF1bWxBcmluZ0FFbGlnQ2NlZGlsRWdyYXZlRWFjdXRlRWNpcmNFdW1sSWdyYXZlSWFjdXRlSWNpcmNJdW1sRVRITnRpbGRlT2dyYXZlT2FjdXRlT2NpcmNPdGlsZGVPdW1sdGltZXNPc2xhc2hVZ3JhdmVVYWN1dGVVY2lyY1V1bWxZYWN1dGVUSE9STnN6bGlnYWdyYXZlYWFjdXRlYWNpcmNhdGlsZGVhdW1sYXJpbmdhZWxpZ2NjZWRpbGVncmF2ZWVhY3V0ZWVjaXJjZXVtbGlncmF2ZWlhY3V0ZWljaXJjaXVtbGV0aG50aWxkZW9ncmF2ZW9hY3V0ZW9jaXJjb3RpbGRlb3VtbGRpdmlkZW9zbGFzaHVncmF2ZXVhY3V0ZXVjaXJjdXVtbHlhY3V0ZXRob3JueXVtbE9FbGlnb2VsaWdTY2Fyb25zY2Fyb25ZdW1sZm5vZmNpcmN0aWxkZUFscGhhQmV0YUdhbW1hRGVsdGFFcHNpbG9uWmV0YUV0YVRoZXRhSW90YUthcHBhTGFtYmRhTXVOdVhpT21pY3JvblBpUmhvU2lnbWFUYXVVcHNpbG9uUGhpQ2hpUHNpT21lZ2FhbHBoYWJldGFnYW1tYWRlbHRhZXBzaWxvbnpldGFldGF0aGV0YWlvdGFrYXBwYWxhbWJkYW11bnV4aW9taWNyb25waXJob3NpZ21hZnNpZ21hdGF1dXBzaWxvbnBoaWNoaXBzaW9tZWdhdGhldGFzeW11cHNpaHBpdmVuc3BlbXNwdGhpbnNwenduanp3amxybXJsbW5kYXNobWRhc2hsc3F1b3JzcXVvc2JxdW9sZHF1b3JkcXVvYmRxdW9kYWdnZXJEYWdnZXJidWxsaGVsbGlwcGVybWlscHJpbWVQcmltZWxzYXF1b3JzYXF1b29saW5lZnJhc2xldXJvaW1hZ2V3ZWllcnByZWFsdHJhZGVhbGVmc3ltbGFycnVhcnJyYXJyZGFycmhhcnJjcmFycmxBcnJ1QXJyckFycmRBcnJoQXJyZm9yYWxscGFydGV4aXN0ZW1wdHluYWJsYWlzaW5ub3Rpbm5pcHJvZHN1bW1pbnVzbG93YXN0cmFkaWNpbmZpbmFuZ2FuZG9yY2FwY3VwaW50dGhlcmU0c2ltY29uZ2FzeW1wbmVlcXVpdmxlZ2VzdWJzdXBuc3Vic3ViZXN1cGVvcGx1c290aW1lc3BlcnBzZG90bGNlaWxyY2VpbGxmbG9vcnJmbG9vcmxhbmdyYW5nbG96c3BhZGVzY2x1YnNoZWFydHNkaWFtc3EFAABxBQAAcQUAAHEFAABxBQAAcQUAAHEFAABxBQAAcQUAAHEFAABxBQAAcQUAAHEFAABxBQAAcQUAAHEFAABxBQAAcQUAAHEFAABxBQAAcQUAAHEFAABxBQAAcQUAAHEFAABxBQAAcQUAAHEFAABxBQAAcQUAAHEFAABxBQAAcQUAAHIFAABzBQAAdAUAAHUFAAB2BQAAdwUAAHMFAAB4BQAAeQUAAHoFAAB7BQAAfAUAAH0FAAB+BQAAfwUAAIAFAACBBQAAgQUAAIEFAACBBQAAgQUAAIEFAACBBQAAgQUAAIEFAACCBQAAgwUAAIQFAACFBQAAhgUAAIcFAACIBQAAdQUAAHUFAAB1BQAAdQUAAHUFAAB1BQAAdQUAAHUFAAB1BQAAdQUAAHUFAAB1BQAAdQUAAHUFAAB1BQAAdQUAAHUFAAB1BQAAdQUAAHUFAAB1BQAAdQUAAHUFAAB1BQAAdQUAAHUFAACJBQAAdQUAAIoFAACLBQAAdQUAAIwFAACNBQAAjgUAAI8FAACQBQAAkQUAAJIFAACTBQAAdQUAAJQFAAB1BQAAlQUAAJYFAACXBQAAmAUAAJkFAACaBQAAdQUAAJsFAACcBQAAnQUAAJ4FAACfBQAAoAUAAHUFAAChBQAAdQUAAKIFAACjBQAApAUAAKUFAABxBQAApgUAAKYFAACmBQAApgUAAKYFAACmBQAApgUAAKYFAACmBQAApgUAAKYFAACmBQAApgUAAKYFAACmBQAApgUAAKYFAACmBQAApgUAAKYFAACmBQAApgUAAKYFAACmBQAApgUAAKYFAACmBQAApgUAAKYFAACmBQAApgUAAKYFAACmBQAApgUAAKYFAACmBQAApgUAAKYFAACmBQAApgUAAKYFAACmBQAApgUAAKYFAACmBQAApgUAAKYFAACmBQAApgUAAKYFAACmBQAApgUAAKYFAACmBQAApgUAAKYFAACmBQAApgUAAKYFAACmBQAApgUAAKYFAACmBQAApgUAAKYFAACmBQAApgUAAKYFAACmBQAApgUAAKYFAACmBQAApgUAAKYFAACmBQAApgUAAKYFAACmBQAApgUAAKYFAACmBQAApgUAAKYFAACmBQAApgUAAKYFAACmBQAApgUAAKYFAACmBQAApgUAAKYFAACmBQAApgUAAKYFAACmBQAApgUAAKYFAACmBQAApgUAAKYFAACmBQAApgUAAKYFAACmBQAApgUAAKYFAACmBQAApgUAAKYFAACmBQAApgUAAKYFAACmBQAApgUAAKYFAACmBQAApgUAAKYFAACmBQAApgUAAKYFAACmBQAApgUAAKYFAACmBQAApgUAAKYFAABXb3JkVGVtcGxhdGVKc3hUZXh0AKcFAACnBQAApwUAAKcFAACnBQAApwUAAKcFAACnBQAApwUAAKgFAACpBQAAqAUAAKgFAACpBQAApwUAAKcFAACnBQAApwUAAKcFAACnBQAApwUAAKcFAACnBQAApwUAAKcFAACnBQAApwUAAKcFAACnBQAApwUAAKcFAACnBQAAqAUAAKcFAACnBQAApwUAAKcFAACnBQAApwUAAKcFAACnBQAApwUAAKcFAACnBQAApwUAAKcFAACnBQAAqgUAAKcFAACnBQAApwUAAKcFAACnBQAApwUAAKcFAACnBQAApwUAAKcFAACnBQAApwUAAKcFAACnBQAApwUAAKcFAACnBQAApwUAAKcFAACnBQAApwUAAKcFAACnBQAApwUAAKcFAACnBQAApwUAAKcFAACnBQAApwUAAKcFAACnBQAApwUAAKcFAACnBQAApwUAAKcFAACnBQAApwUAAKcFAACnBQAApwUAAKcFAACnBQAApwUAAKcFAACnBQAApwUAAKcFAACnBQAApwUAAKcFAACnBQAApwUAAKcFAACnBQAApwUAAKcFAACnBQAApwUAAKcFAACnBQAApwUAAKcFAACnBQAApwUAAKcFAACnBQAApwUAAKcFAACnBQAApwUAAKcFAACnBQAApwUAAKcFAACnBQAApwUAAKcFAACnBQAAqwUAAKsFAACrBQAAqwUAAKsFAACrBQAAqwUAAKsFAACrBQAAqwUAAKsFAACrBQAAqwUAAKsFAACrBQAAqwUAAKsFAACrBQAAqwUAAKsFAACrBQAAqwUAAKsFAACrBQAAqwUAAKsFAACrBQAAqwUAAKsFAACrBQAAqwUAAKsFAACrBQAAqwUAAKsFAACrBQAAqwUAAKsFAACrBQAAqwUAAKsFAACrBQAAqwUAAKsFAACrBQAAqwUAAKsFAACrBQAAqwUAAKsFAACrBQAAqwUAAKsFAACrBQAAqwUAAKsFAACrBQAAqwUAAKsFAACrBQAAqwUAAKsFAACrBQAAqwUAAKsFAACrBQAAqwUAAKsFAACrBQAAqwUAAKsFAACrBQAAqwUAAKsFAACrBQAAqwUAAKsFAACrBQAAqwUAAKsFAACrBQAAqwUAAKsFAACrBQAAqwUAAKsFAACrBQAAqwUAAKsFAACrBQAAqwUAAKsFAACrBQAAqwUAAKsFAACrBQAAqwUAAKsFAACrBQAAqwUAAKsFAACrBQAAqwUAAKsFAACrBQAAqwUAAKsFAACrBQAAqwUAAKsFAACrBQAAqwUAAKsFAACrBQAAqwUAAKsFAACrBQAAqwUAAKsFAACrBQAAqwUAAKsFAACrBQAAqwUAAKsFAACrBQAAqwUAAKsFAABtZXNzYWdlc3RydWN0IFRzU3ludGF4L2hvbWUvbm9kZS9idWlsZC9kZXBzL3N3Yy9jcmF0ZXMvc3djX2NvbW1vbi9zcmMvc3ludGF4X3Bvcy9oeWdpZW5lLnJzAJZ9JgBFAAAA0AEAADYAAABjYWxsZWQgZXhwZWN0IG9uIAAAAOx9JgARAAAAL2hvbWUvbm9kZS9idWlsZC9kZXBzL3N3Yy9jcmF0ZXMvc3djX2VjbWFfYXN0L3NyYy9wYXQucnMIfiYAOAAAAA0AAAAUAAAAc3BhblN0ckJvb2xOdW1CaWdJbnRSZWdleEpTWFRleHQAAAAACAAAAAQAAAAAAQAAdmFsdWVyYXdUcGxleHByc3F1YXNpcwAAAAAAAAQAAAAEAAAAoQEAAFByaXZhdGVQdWJsaWNUaGlzVW5hcnlVcGRhdGVCaW5NZW1iZXJTdXBlclByb3BDb25kQ2FsbE5ld1NlcUxpdFRhZ2dlZFRwbEFycm93WWllbGRNZXRhUHJvcEF3YWl0UGFyZW5KU1hNZW1iZXJKU1hOYW1lc3BhY2VkTmFtZUpTWEVtcHR5SlNYRWxlbWVudEpTWEZyYWdtZW50VHNUeXBlQXNzZXJ0aW9uVHNDb25zdEFzc2VydGlvblRzTm9uTnVsbFRzQXNUc0luc3RhbnRpYXRpb25Uc1NhdGlzZmllc1ByaXZhdGVOYW1lT3B0Q2hhaW5leHBmbGFnc1Nob3J0aGFuZEtleVZhbHVlR2V0dGVyU2V0dGVyTWV0aG9kQmxvY2tFbXB0eURlYnVnZ2VyV2l0aFJldHVybkxhYmVsZWRCcmVha0NvbnRpbnVlSWZTd2l0Y2hUaHJvd1RyeVdoaWxlRG9XaGlsZUZvckZvckluRm9yT2ZEZWNsU3VwZXJOdW1iZXIAAAAAAAQAAAAEAAAAmwEAAEAFAAAMAAAABAAAADkDAABBBQAADAAAAAQAAACwBQAAsQUAAAQAAAAEAAAAqAIAAAAAAAABAAAAAQAAAFEBAABEBQAABAAAAAQAAAAJAwAARQUAAAQAAAAEAAAApQIAAAAAAAAEAAAABAAAALIFAABjdHh0ZGVjb3JhdG9yc2JvZHlzdXBlcl9jbGFzc2lzX2Fic3RyYWN0dHlwZV9wYXJhbXNzdXBlcl90eXBlX3BhcmFtc1B+JgAEAAAAsIAmAAQAAAC0gCYACgAAAL6AJgAEAAAAwoAmAAsAAADNgCYACwAAANiAJgALAAAA44AmABEAAABB6SYACgAAAEcFAAAYAAAACAAAAPIBAABGbkRlY2xpZGVudEltcG9ydEZuRXhwcgAAAAAABAAAAAQAAABTAwAAcGhhc2VzeW1vcHRpb25hbEpTWEF0dHJuYW1lSlNYRW1wdHlFeHByAAAAAAAEAAAABAAAAHYCAABSZXN0UGF0ZG90M190b2tlbmFyZ3R5cGVfYW5uswUAAAQAAAAEAAAAmwIAAElmU3RtdHRlc3Rjb25zYWx0VmFyRGVjbGtpbmRkZWNsc0JpbkV4cHJvcGxlZnRyaWdodE5ld0V4cHJjYWxsZWVhcmdzdHlwZV9hcmdzT3B0Q2FsbFNlcUV4cHJBcnJheVBhdGVsZW1zVXNpbmdEZWNsUGF0Rm9yU3RtdGluaXR1cGRhdGVUcnlTdG10YmxvY2toYW5kbGVyZmluYWxpemVyQXJyYXlMaXRDYWxsRXhwckNvbmRFeHByVGhpc0V4cHJKU1hNZW1iZXJFeHByQXNzaWduUGF0T2JqZWN0UGF0cHJvcHNDb21wdXRlZEV4cHJTdG10ZXhwcldpdGhTdG10b2JqQ2xhc3NEZWNsaXNfYXdhaXQAAABJBQAADAAAAAQAAAC0BQAAtQUAAAQAAAAEAAAAtgUAAHBhcmFtc2lzX2FzeW5jaXNfZ2VuZXJhdG9ycmV0dXJuX3R5cGUAAABQfiYABAAAALCAJgAEAAAAEIMmAAYAAAC+gCYABAAAABaDJgAIAAAAHoMmAAwAAADYgCYACwAAACqDJgALAAAAQXJyb3dFeHByQXdhaXRFeHByQ2xhc3NFeHByT2JqZWN0TGl0UGFyZW5FeHBydGFndHBsVW5hcnlFeHByWWllbGRFeHByZGVsZWdhdGVQYXJhbXBhdG9wZW5pbmdjaGlsZHJlbmNsb3NpbmdCbG9ja1N0bXRzdG10c0JyZWFrU3RtdGxhYmVsRW1wdHlTdG10Rm9ySW5TdG10Rm9yT2ZTdG10VGhyb3dTdG10V2hpbGVTdG10twUAACAAAAAIAAAA3wIAALgFAAAEAAAABAAAAOACAAAAAAAAAQAAAAEAAAC5BQAAa2V5aXNfc3RhdGljYWNjZXNzaWJpbGl0eWlzX29wdGlvbmFsaXNfb3ZlcnJpZGVkZWZpbml0ZQBQfiYABAAAAFyEJgADAAAAgH4mAAUAAADAgSYACAAAAF+EJgAJAAAAtIAmAAoAAABohCYADQAAAM2AJgALAAAAdYQmAAsAAACAhCYACwAAAGLTJgAIAAAAPtMmAAcAAACLhCYACAAAAENsYXNzUHJvcERlY29yYXRvckFzc2lnbkV4cHJNZW1iZXJFeHBycHJvcFRwbEVsZW1lbnR0YWlsY29va2VkVXBkYXRlRXhwcnByZWZpeElkZW50TmFtZUFzc2lnblByb3BHZXR0ZXJQcm9wTWV0aG9kUHJvcFNldHRlclByb3B0aGlzX3BhcmFtcGFyYW1SZXR1cm5TdG10U3dpdGNoQ2FzZVN3aXRjaFN0bXRkaXNjcmltaW5hbnRjYXNlc0pTWEV4cHJDb250YWluZXJDYXRjaENsYXVzZURvV2hpbGVTdG10TGFiZWxlZFN0bXRDb25zdHJ1Y3RvclByaXZhdGVNZXRob2RQcml2YXRlUHJvcFRzSW5kZXhTaWduYXR1cmVTdGF0aWNCbG9ja0F1dG9BY2Nlc3NvcroFAAAEAAAABAAAALsFAAAAAAAAAQAAAAEAAAC8BQAAUH4mAAQAAABchCYAAwAAAJHoJgAIAAAA8IEmAAQAAABfhCYACQAAAGiEJgANAAAAzYAmAAsAAAB1hCYACwAAAICEJgALAAAAQ2xhc3NNZXRob2QAUwUAAAwAAAAEAAAAvQUAAFUFAAAYAAAABAAAAL4FAABQfiYABAAAALCAJgAEAAAAXIQmAAMAAAAQgyYABgAAAL6AJgAEAAAAaIQmAA0AAAB1hCYACwAAAFcFAAAQAAAACAAAAFgFAABQfiYABAAAALCAJgAEAAAAXIQmAAMAAACAfiYABQAAAMCBJgAIAAAAX4QmAAkAAAC0gCYACgAAAGiEJgANAAAAdYQmAAsAAACAhCYACwAAAGLTJgAIAAAAi4QmAAgAAABTaW1wbGVFeHByT3JTcHJlYWRzcHJlYWRNZXRhUHJvcEV4cHJPcHRDaGFpbkV4cHJiYXNlU3ByZWFkUHJvcAAAWQUAAAwAAAAEAAAAvwUAABCDJgAGAAAAtIAmAAoAAABQfiYABAAAALCAJgAEAAAAvoAmAAQAAAAegyYADAAAABaDJgAIAAAA2IAmAAsAAAAqgyYACwAAAEZ1bmN0aW9uTW9kdWxlRGVjbFN0bXRBc3NpZ25QYXRQcm9wS2V5VmFsdWVQcm9wQ29udGludWVTdG10RGVidWdnZXJTdG10VHNLZXl3b3JkVHlwZVRzVGhpc1R5cGVUc0ZuT3JDb25zdHJ1Y3RvclR5cGVUc1R5cGVSZWZUc1R5cGVRdWVyeVRzVHlwZUxpdFRzQXJyYXlUeXBlVHNUdXBsZVR5cGVUc09wdGlvbmFsVHlwZVRzUmVzdFR5cGVUc1VuaW9uT3JJbnRlcnNlY3Rpb25UeXBlVHNDb25kaXRpb25hbFR5cGVUc0luZmVyVHlwZVRzUGFyZW50aGVzaXplZFR5cGVUc1R5cGVPcGVyYXRvclRzSW5kZXhlZEFjY2Vzc1R5cGVUc01hcHBlZFR5cGVUc0xpdFR5cGVUc1R5cGVQcmVkaWNhdGVUc0ltcG9ydFR5cGUAwAUAACAAAAAIAAAAwQUAAFB+JgAEAAAAXIQmAAMAAACAfiYABQAAAMCBJgAIAAAAX4QmAAkAAAC0gCYACgAAAGiEJgANAAAAzYAmAAsAAACAhCYACwAAAIuEJgAIAAAAVmFyRGVjbGFyYXRvclNwcmVhZEVsZW1lbnRTdXBlclByb3BFeHByQmluZGluZ0lkZW50aWRKU1hTcHJlYWRDaGlsZEtleVZhbHVlUGF0UHJvcFRzQXNFeHByAABdBQAADAAAAAQAAAAnAwAAVHNGblR5cGVsaXRUc1R5cGVBbm5tZW1iZXJzdHlwZV9uYW1lSlNYQ2xvc2luZ0VsZW1lbnRuc0pTWE9wZW5pbmdFbGVtZW50YXR0cnNzZWxmX2Nsb3NpbmcAAABeBQAABAAAAAQAAACiAQAARXhwb3J0QWxsc3JjdHlwZV9vbmx5Q29tcHV0ZWRQcm9wTmFtZVRzRW51bURlY2xpc19jb25zdEpTWENsb3NpbmdGcmFnbWVudEpTWE9wZW5pbmdGcmFnbWVudEV4cG9ydERlY2xkZWNsAAAAXwUAAAwAAAAEAAAAYAUAAGEFAAAEAAAABAAAAMIFAABzcGVjaWZpZXJzAABQfiYABAAAACSLJgAKAAAAoYomAAMAAACkiiYACQAAADXmJgAEAAAAdIEmAAUAAABJbXBvcnREZWNsRXhwb3J0TmFtZWRFeHBvcnREZWZhdWx0RGVjbEV4cG9ydERlZmF1bHRFeHByVHNJbXBvcnRFcXVhbHNUc0V4cG9ydEFzc2lnbm1lbnRUc05hbWVzcGFjZUV4cG9ydGVsZW1fdHlwZXR5cGVfcGFyYW1Uc0VudGl0eU5hbWVUc0V4dGVybmFsTW9kdWxlUmVmAAAAAAAABAAAAAQAAADDBQAAUH4mAAQAAAC0gCYACgAAAGiEJgANAAAAgIQmAAsAAABi0yYACAAAAIWFJgAFAAAAVHNQYXJhbVByb3BlbGVtX3R5cGVzAAAAxAUAAAQAAAAEAAAAxQUAAAAAAAAEAAAABAAAAMYFAABpc19pbmlzX291dGNvbnN0cmFpbnQAAABQfiYABAAAAIuBJgAEAAAAdIwmAAUAAAB5jCYABgAAAMeKJgAIAAAAf4wmAAoAAABc5yYABwAAAFRzVHlwZVBhcmFtZXhwcl9uYW1lVHNVbmlvblR5cGV0eXBlc1RzSW50ZXJmYWNlRGVjbEV2YWx1YXRpb25Tb3VyY2VEZWZlck5hbWVkRXhwb3J0VHNRdWFsaWZpZWROYW1lVHNFbnVtTWVtYmVycXVhbGlmaWVyYXR0cmlidXRlcwAAAAAAAAABAAAAAQAAAMcFAADIBQAAMAAAAAgAAADJBQAAbmFtZV90eXBlAAAAUH4mAAQAAABi0yYACAAAANGLJgAKAAAAaI0mAAkAAAB8gSYACAAAAMCBJgAIAAAAagUAACAAAAAIAAAAIwIAAAAAAAAEAAAABAAAAMoFAABQfiYABAAAAD7TJgAHAAAARdMmAAYAAACv0iYACQAAAPOJJgACAAAAvoAmAAQAAABUc01vZHVsZURlY2xUc1RwbExpdFR5cGVQcm90ZWN0ZWRUcnVlUGx1c01pbnVzVHNNb2R1bGVCbG9ja1RzTm9uTnVsbEV4cHJUc0NhbGxTaWduYXR1cmVEZWNsVHNDb25zdHJ1Y3RTaWduYXR1cmVEZWNsVHNQcm9wZXJ0eVNpZ25hdHVyZVRzR2V0dGVyU2lnbmF0dXJlVHNTZXR0ZXJTaWduYXR1cmVUc01ldGhvZFNpZ25hdHVyZVRzVHVwbGVFbGVtZW50dHlUc0ludGVyZmFjZUJvZHlsBQAADAAAAAQAAADLBQAAAAAAAAQAAAAEAAAAzAUAAFB+JgAEAAAA84kmAAIAAAA+0yYABwAAANiAJgALAAAA1+UmAAcAAAC+gCYABAAAAFRzTmFtZXNwYWNlRGVjbFRzU2F0aXNmaWVzRXhwclRzVHlwZUFsaWFzRGVjbFRzVHlwZVBhcmFtRGVjbHBhcmFtX25hbWVOYW1lc3BhY2VEZWZhdWx0TmFtZWRjaGVja190eXBlZXh0ZW5kc190eXBldHJ1ZV90eXBlZmFsc2VfdHlwZVRzQ29uc3RydWN0b3JUeXBlY29tcHV0ZWRUc0FueUtleXdvcmRUc1Vua25vd25LZXl3b3JkVHNOdW1iZXJLZXl3b3JkVHNPYmplY3RLZXl3b3JkVHNCb29sZWFuS2V5d29yZFRzQmlnSW50S2V5d29yZFRzU3RyaW5nS2V5d29yZFRzU3ltYm9sS2V5d29yZFRzVm9pZEtleXdvcmRUc1VuZGVmaW5lZEtleXdvcmRUc051bGxLZXl3b3JkVHNOZXZlcktleXdvcmRUc0ludHJpbnNpY0tleXdvcmQAAAAABAAAAAQAAAAoAwAAUH4mAAQAAABchCYAAwAAALGPJgAIAAAAfIEmAAgAAAAQgyYABgAAAMCBJgAIAAAA2IAmAAsAAABUc0V4cHJXaXRoVHlwZUFyZ3NUc0ltcG9ydEVxdWFsc0RlY2xpc19leHBvcnRpc190eXBlX29ubHltb2R1bGVfcmVmVHNJbnRlcnNlY3Rpb25UeXBlVHNJbXBvcnRDYWxsT3B0aW9uc29ial90eXBlaW5kZXhfdHlwZQAAUH4mAAQAAABi0yYACAAAAFyEJgADAAAAsY8mAAgAAAB8gSYACAAAAMCBJgAIAAAARXhwb3J0TmFtZWRTcGVjaWZpZXJvcmlnZXhwb3J0ZWRJbXBvcnROYW1lZFNwZWNpZmllcmxvY2FsaW1wb3J0ZWRUc05hbWVzcGFjZUV4cG9ydERlY2xJbXBvcnRTdGFyQXNTcGVjaWZpZXJFeHBvcnREZWZhdWx0U3BlY2lmaWVySW1wb3J0RGVmYXVsdFNwZWNpZmllcgB67SYASgAAAKgBAAAfAAAAVHNUeXBlUGFyYW1JbnN0YW50aWF0aW9uRXhwb3J0TmFtZXNwYWNlU3BlY2lmaWVyL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvaW5kZXhtYXAtMi4xMi4wL3NyYy9tYXAvY29yZS5yc0iSJgBkAAAAOwAAACMAAABpbmRleCBub3QgZm91bmQASJImAGQAAABLAAAACgAAAEiSJgBkAAAAGgIAAA0AAABIkiYAZAAAAKICAAAsAAAASJImAGQAAAB6AgAAIgAAAGFzc2VydGlvbiBmYWlsZWQ6IGluZGljZXMuY2FwYWNpdHkoKSAtIGluZGljZXMubGVuKCkgPj0gZW50cmllcy5sZW4oKQAAAEiSJgBkAAAAVAAAAAUAAABIkiYAZAAAAFYAAABEAAAASJImAGQAAABMAQAAFgAAAEiSJgBkAAAAWAEAADgAAABIkiYAZAAAAMgBAAA0AAAASJImAGQAAAAzAAAADwAAAMW0JgA6AAAAdwYAABQAAABjcmF0ZXMvc3djX2VjbWFfdHJhbnNmb3Jtc19iYXNlL3NyYy9maXhlci5yc8STJgAsAAAAxgAAAEAAAADEkyYALAAAAG8DAAAjAAAAxJMmACwAAAB/AwAAMQAAAMSTJgAsAAAAiwMAACkAAABjcmF0ZXMvc3djX2VjbWFfdHJhbnNmb3Jtc19iYXNlL3NyYy9oZWxwZXJzL21vZC5yc0Bzd2MvaGVscGVycy9fL18AAGKUJgAQAAAAY3JhdGVzL3N3Y19lY21hX3RyYW5zZm9ybXNfYmFzZS9zcmMvcmVuYW1lL2FuYWx5emVyL3JldmVyc2VfbWFwLnJzAAB8lCYAQgAAAA4AAAAsAAAAY3JhdGVzL3N3Y19lY21hX3RyYW5zZm9ybXNfYmFzZS9zcmMvcmVuYW1lL2FuYWx5emVyL21vZC5ycwAA0JQmADoAAAAuAAAAGwAAANCUJgA6AAAAOgAAADcAAADQlCYAOgAAAIsAAAAdAAAATWFya2VyIHByb3ZpZGVkIHRvIHJlc29sdmVyIHNob3VsZCBub3QgYmUgdGhlIHJvb3QgbWFyawA8lSYANwAAAGNyYXRlcy9zd2NfZWNtYV90cmFuc2Zvcm1zX2Jhc2Uvc3JjL3Jlc29sdmVyL21vZC5ycwB8lSYAMwAAAIcAAAAFAAAAfJUmADMAAADUBgAANgAAAM0FAAAwlCYAMgAAAPsAAAABAAAAX2FwcGx5X2RlY29yYXRlZF9kZXNjcmlwdG9yQHN3Yy9oZWxwZXJzL18vX2FwcGx5X2RlY29yYXRlZF9kZXNjcmlwdG9yX2FycmF5X2xpa2VfdG9fYXJyYXlAc3djL2hlbHBlcnMvXy9fYXJyYXlfbGlrZV90b19hcnJheV9hcnJheV93aXRoX2hvbGVzQHN3Yy9oZWxwZXJzL18vX2FycmF5X3dpdGhfaG9sZXNfYXJyYXlfd2l0aG91dF9ob2xlc0Bzd2MvaGVscGVycy9fL19hcnJheV93aXRob3V0X2hvbGVzX2Fzc2VydF90aGlzX2luaXRpYWxpemVkQHN3Yy9oZWxwZXJzL18vX2Fzc2VydF90aGlzX2luaXRpYWxpemVkX2FzeW5jX2dlbmVyYXRvckBzd2MvaGVscGVycy9fL19hc3luY19nZW5lcmF0b3JfYXN5bmNfZ2VuZXJhdG9yX2RlbGVnYXRlQHN3Yy9oZWxwZXJzL18vX2FzeW5jX2dlbmVyYXRvcl9kZWxlZ2F0ZV9hc3luY19pdGVyYXRvckBzd2MvaGVscGVycy9fL19hc3luY19pdGVyYXRvcl9hc3luY190b19nZW5lcmF0b3JAc3djL2hlbHBlcnMvXy9fYXN5bmNfdG9fZ2VuZXJhdG9yX2F3YWl0X2FzeW5jX2dlbmVyYXRvckBzd2MvaGVscGVycy9fL19hd2FpdF9hc3luY19nZW5lcmF0b3JfYXdhaXRfdmFsdWVAc3djL2hlbHBlcnMvXy9fYXdhaXRfdmFsdWVfY2FsbF9zdXBlckBzd2MvaGVscGVycy9fL19jYWxsX3N1cGVyX2NoZWNrX3ByaXZhdGVfcmVkZWNsYXJhdGlvbkBzd2MvaGVscGVycy9fL19jaGVja19wcml2YXRlX3JlZGVjbGFyYXRpb25fY2xhc3NfYXBwbHlfZGVzY3JpcHRvcl9kZXN0cnVjdHVyZUBzd2MvaGVscGVycy9fL19jbGFzc19hcHBseV9kZXNjcmlwdG9yX2Rlc3RydWN0dXJlX2NsYXNzX2FwcGx5X2Rlc2NyaXB0b3JfZ2V0QHN3Yy9oZWxwZXJzL18vX2NsYXNzX2FwcGx5X2Rlc2NyaXB0b3JfZ2V0X2NsYXNzX2FwcGx5X2Rlc2NyaXB0b3Jfc2V0QHN3Yy9oZWxwZXJzL18vX2NsYXNzX2FwcGx5X2Rlc2NyaXB0b3Jfc2V0X2NsYXNzX2FwcGx5X2Rlc2NyaXB0b3JfdXBkYXRlQHN3Yy9oZWxwZXJzL18vX2NsYXNzX2FwcGx5X2Rlc2NyaXB0b3JfdXBkYXRlX2NsYXNzX2NhbGxfY2hlY2tAc3djL2hlbHBlcnMvXy9fY2xhc3NfY2FsbF9jaGVja19jbGFzc19jaGVja19wcml2YXRlX3N0YXRpY19maWVsZF9kZXNjcmlwdG9yQHN3Yy9oZWxwZXJzL18vX2NsYXNzX2NoZWNrX3ByaXZhdGVfc3RhdGljX2ZpZWxkX2Rlc2NyaXB0b3JfY2xhc3NfZXh0cmFjdF9maWVsZF9kZXNjcmlwdG9yQHN3Yy9oZWxwZXJzL18vX2NsYXNzX2V4dHJhY3RfZmllbGRfZGVzY3JpcHRvcl9jbGFzc19uYW1lX3Rkel9lcnJvckBzd2MvaGVscGVycy9fL19jbGFzc19uYW1lX3Rkel9lcnJvcl9jbGFzc19wcml2YXRlX2ZpZWxkX2dldEBzd2MvaGVscGVycy9fL19jbGFzc19wcml2YXRlX2ZpZWxkX2dldF9jbGFzc19wcml2YXRlX2ZpZWxkX2luaXRAc3djL2hlbHBlcnMvXy9fY2xhc3NfcHJpdmF0ZV9maWVsZF9pbml0X2NsYXNzX3ByaXZhdGVfZmllbGRfbG9vc2VfYmFzZUBzd2MvaGVscGVycy9fL19jbGFzc19wcml2YXRlX2ZpZWxkX2xvb3NlX2Jhc2VfY2xhc3NfcHJpdmF0ZV9maWVsZF9sb29zZV9rZXlAc3djL2hlbHBlcnMvXy9fY2xhc3NfcHJpdmF0ZV9maWVsZF9sb29zZV9rZXlfY2xhc3NfcHJpdmF0ZV9maWVsZF9zZXRAc3djL2hlbHBlcnMvXy9fY2xhc3NfcHJpdmF0ZV9maWVsZF9zZXRfY2xhc3NfcHJpdmF0ZV9maWVsZF91cGRhdGVAc3djL2hlbHBlcnMvXy9fY2xhc3NfcHJpdmF0ZV9maWVsZF91cGRhdGVfY2xhc3NfcHJpdmF0ZV9tZXRob2RfZ2V0QHN3Yy9oZWxwZXJzL18vX2NsYXNzX3ByaXZhdGVfbWV0aG9kX2dldF9jbGFzc19wcml2YXRlX21ldGhvZF9pbml0QHN3Yy9oZWxwZXJzL18vX2NsYXNzX3ByaXZhdGVfbWV0aG9kX2luaXRfY2xhc3NfcHJpdmF0ZV9tZXRob2Rfc2V0QHN3Yy9oZWxwZXJzL18vX2NsYXNzX3ByaXZhdGVfbWV0aG9kX3NldF9jbGFzc19zdGF0aWNfcHJpdmF0ZV9maWVsZF9zcGVjX2dldEBzd2MvaGVscGVycy9fL19jbGFzc19zdGF0aWNfcHJpdmF0ZV9maWVsZF9zcGVjX2dldF9jbGFzc19zdGF0aWNfcHJpdmF0ZV9maWVsZF9zcGVjX3NldEBzd2MvaGVscGVycy9fL19jbGFzc19zdGF0aWNfcHJpdmF0ZV9maWVsZF9zcGVjX3NldF9jbGFzc19zdGF0aWNfcHJpdmF0ZV9maWVsZF91cGRhdGVAc3djL2hlbHBlcnMvXy9fY2xhc3Nfc3RhdGljX3ByaXZhdGVfZmllbGRfdXBkYXRlX2NvbnN0cnVjdEBzd2MvaGVscGVycy9fL19jb25zdHJ1Y3RfY3JlYXRlX2NsYXNzQHN3Yy9oZWxwZXJzL18vX2NyZWF0ZV9jbGFzc19kZWNvcmF0ZUBzd2MvaGVscGVycy9fL19kZWNvcmF0ZV9kZWZhdWx0c0Bzd2MvaGVscGVycy9fL19kZWZhdWx0c19kZWZpbmVfZW51bWVyYWJsZV9wcm9wZXJ0aWVzQHN3Yy9oZWxwZXJzL18vX2RlZmluZV9lbnVtZXJhYmxlX3Byb3BlcnRpZXNfZGVmaW5lX3Byb3BlcnR5QHN3Yy9oZWxwZXJzL18vX2RlZmluZV9wcm9wZXJ0eV9leHBvcnRfc3RhckBzd2MvaGVscGVycy9fL19leHBvcnRfc3Rhcl9leHRlbmRzQHN3Yy9oZWxwZXJzL18vX2V4dGVuZHNfZ2V0QHN3Yy9oZWxwZXJzL18vX2dldF9nZXRfcHJvdG90eXBlX29mQHN3Yy9oZWxwZXJzL18vX2dldF9wcm90b3R5cGVfb2ZfaW5oZXJpdHNAc3djL2hlbHBlcnMvXy9faW5oZXJpdHNfaW5oZXJpdHNfbG9vc2VAc3djL2hlbHBlcnMvXy9faW5oZXJpdHNfbG9vc2VfaW5pdGlhbGl6ZXJfZGVmaW5lX3Byb3BlcnR5QHN3Yy9oZWxwZXJzL18vX2luaXRpYWxpemVyX2RlZmluZV9wcm9wZXJ0eV9pbml0aWFsaXplcl93YXJuaW5nX2hlbHBlckBzd2MvaGVscGVycy9fL19pbml0aWFsaXplcl93YXJuaW5nX2hlbHBlcl9pbnN0YW5jZW9mQHN3Yy9oZWxwZXJzL18vX2luc3RhbmNlb2ZfaW50ZXJvcF9yZXF1aXJlX2RlZmF1bHRAc3djL2hlbHBlcnMvXy9faW50ZXJvcF9yZXF1aXJlX2RlZmF1bHRfaW50ZXJvcF9yZXF1aXJlX3dpbGRjYXJkQHN3Yy9oZWxwZXJzL18vX2ludGVyb3BfcmVxdWlyZV93aWxkY2FyZF9pc19uYXRpdmVfZnVuY3Rpb25Ac3djL2hlbHBlcnMvXy9faXNfbmF0aXZlX2Z1bmN0aW9uX2l0ZXJhYmxlX3RvX2FycmF5QHN3Yy9oZWxwZXJzL18vX2l0ZXJhYmxlX3RvX2FycmF5X2l0ZXJhYmxlX3RvX2FycmF5X2xpbWl0QHN3Yy9oZWxwZXJzL18vX2l0ZXJhYmxlX3RvX2FycmF5X2xpbWl0X2l0ZXJhYmxlX3RvX2FycmF5X2xpbWl0X2xvb3NlQHN3Yy9oZWxwZXJzL18vX2l0ZXJhYmxlX3RvX2FycmF5X2xpbWl0X2xvb3NlX2pzeEBzd2MvaGVscGVycy9fL19qc3hfbmV3X2Fycm93X2NoZWNrQHN3Yy9oZWxwZXJzL18vX25ld19hcnJvd19jaGVja19ub25faXRlcmFibGVfcmVzdEBzd2MvaGVscGVycy9fL19ub25faXRlcmFibGVfcmVzdF9ub25faXRlcmFibGVfc3ByZWFkQHN3Yy9oZWxwZXJzL18vX25vbl9pdGVyYWJsZV9zcHJlYWRfb2JqZWN0X2Rlc3RydWN0dXJpbmdfZW1wdHlAc3djL2hlbHBlcnMvXy9fb2JqZWN0X2Rlc3RydWN0dXJpbmdfZW1wdHlfb2JqZWN0X3NwcmVhZEBzd2MvaGVscGVycy9fL19vYmplY3Rfc3ByZWFkX29iamVjdF9zcHJlYWRfcHJvcHNAc3djL2hlbHBlcnMvXy9fb2JqZWN0X3NwcmVhZF9wcm9wc19vYmplY3Rfd2l0aG91dF9wcm9wZXJ0aWVzQHN3Yy9oZWxwZXJzL18vX29iamVjdF93aXRob3V0X3Byb3BlcnRpZXNfb2JqZWN0X3dpdGhvdXRfcHJvcGVydGllc19sb29zZUBzd2MvaGVscGVycy9fL19vYmplY3Rfd2l0aG91dF9wcm9wZXJ0aWVzX2xvb3NlX292ZXJsb2FkX3lpZWxkQHN3Yy9oZWxwZXJzL18vX292ZXJsb2FkX3lpZWxkX3Bvc3NpYmxlX2NvbnN0cnVjdG9yX3JldHVybkBzd2MvaGVscGVycy9fL19wb3NzaWJsZV9jb25zdHJ1Y3Rvcl9yZXR1cm5fcmVhZF9vbmx5X2Vycm9yQHN3Yy9oZWxwZXJzL18vX3JlYWRfb25seV9lcnJvcl9zZXRAc3djL2hlbHBlcnMvXy9fc2V0X3NldF9wcm90b3R5cGVfb2ZAc3djL2hlbHBlcnMvXy9fc2V0X3Byb3RvdHlwZV9vZl9za2lwX2ZpcnN0X2dlbmVyYXRvcl9uZXh0QHN3Yy9oZWxwZXJzL18vX3NraXBfZmlyc3RfZ2VuZXJhdG9yX25leHRfc2xpY2VkX3RvX2FycmF5QHN3Yy9oZWxwZXJzL18vX3NsaWNlZF90b19hcnJheV9zbGljZWRfdG9fYXJyYXlfbG9vc2VAc3djL2hlbHBlcnMvXy9fc2xpY2VkX3RvX2FycmF5X2xvb3NlX3N1cGVyX3Byb3BfYmFzZUBzd2MvaGVscGVycy9fL19zdXBlcl9wcm9wX2Jhc2VfdGFnZ2VkX3RlbXBsYXRlX2xpdGVyYWxAc3djL2hlbHBlcnMvXy9fdGFnZ2VkX3RlbXBsYXRlX2xpdGVyYWxfdGFnZ2VkX3RlbXBsYXRlX2xpdGVyYWxfbG9vc2VAc3djL2hlbHBlcnMvXy9fdGFnZ2VkX3RlbXBsYXRlX2xpdGVyYWxfbG9vc2VfdGhyb3dAc3djL2hlbHBlcnMvXy9fdGhyb3dfdG9fYXJyYXlAc3djL2hlbHBlcnMvXy9fdG9fYXJyYXlfdG9fY29uc3VtYWJsZV9hcnJheUBzd2MvaGVscGVycy9fL190b19jb25zdW1hYmxlX2FycmF5X3RvX3ByaW1pdGl2ZUBzd2MvaGVscGVycy9fL190b19wcmltaXRpdmVfdG9fcHJvcGVydHlfa2V5QHN3Yy9oZWxwZXJzL18vX3RvX3Byb3BlcnR5X2tleV91cGRhdGVAc3djL2hlbHBlcnMvXy9fdXBkYXRlX3R5cGVfb2ZAc3djL2hlbHBlcnMvXy9fdHlwZV9vZl91bnN1cHBvcnRlZF9pdGVyYWJsZV90b19hcnJheUBzd2MvaGVscGVycy9fL191bnN1cHBvcnRlZF9pdGVyYWJsZV90b19hcnJheV93cmFwX2FzeW5jX2dlbmVyYXRvckBzd2MvaGVscGVycy9fL193cmFwX2FzeW5jX2dlbmVyYXRvcl93cmFwX25hdGl2ZV9zdXBlckBzd2MvaGVscGVycy9fL193cmFwX25hdGl2ZV9zdXBlcl93cml0ZV9vbmx5X2Vycm9yQHN3Yy9oZWxwZXJzL18vX3dyaXRlX29ubHlfZXJyb3JfY2xhc3NfcHJpdmF0ZV9maWVsZF9kZXN0cnVjdHVyZUBzd2MvaGVscGVycy9fL19jbGFzc19wcml2YXRlX2ZpZWxkX2Rlc3RydWN0dXJlX2NsYXNzX3N0YXRpY19wcml2YXRlX2ZpZWxkX2Rlc3RydWN0dXJlQHN3Yy9oZWxwZXJzL18vX2NsYXNzX3N0YXRpY19wcml2YXRlX2ZpZWxkX2Rlc3RydWN0dXJlX2NsYXNzX3N0YXRpY19wcml2YXRlX21ldGhvZF9nZXRAc3djL2hlbHBlcnMvXy9fY2xhc3Nfc3RhdGljX3ByaXZhdGVfbWV0aG9kX2dldF9jbGFzc19jaGVja19wcml2YXRlX3N0YXRpY19hY2Nlc3NAc3djL2hlbHBlcnMvXy9fY2xhc3NfY2hlY2tfcHJpdmF0ZV9zdGF0aWNfYWNjZXNzX2lzX25hdGl2ZV9yZWZsZWN0X2NvbnN0cnVjdEBzd2MvaGVscGVycy9fL19pc19uYXRpdmVfcmVmbGVjdF9jb25zdHJ1Y3RfY3JlYXRlX3N1cGVyQHN3Yy9oZWxwZXJzL18vX2NyZWF0ZV9zdXBlcl9jcmVhdGVfZm9yX29mX2l0ZXJhdG9yX2hlbHBlcl9sb29zZUBzd2MvaGVscGVycy9fL19jcmVhdGVfZm9yX29mX2l0ZXJhdG9yX2hlbHBlcl9sb29zZV90c19kZWNvcmF0ZUBzd2MvaGVscGVycy9fL190c19kZWNvcmF0ZV90c19nZW5lcmF0b3JAc3djL2hlbHBlcnMvXy9fdHNfZ2VuZXJhdG9yX3RzX21ldGFkYXRhQHN3Yy9oZWxwZXJzL18vX3RzX21ldGFkYXRhX3RzX3BhcmFtQHN3Yy9oZWxwZXJzL18vX3RzX3BhcmFtX3RzX3ZhbHVlc0Bzd2MvaGVscGVycy9fL190c192YWx1ZXNfdHNfYWRkX2Rpc3Bvc2FibGVfcmVzb3VyY2VAc3djL2hlbHBlcnMvXy9fdHNfYWRkX2Rpc3Bvc2FibGVfcmVzb3VyY2VfdHNfZGlzcG9zZV9yZXNvdXJjZXNAc3djL2hlbHBlcnMvXy9fdHNfZGlzcG9zZV9yZXNvdXJjZXNfdHNfcmV3cml0ZV9yZWxhdGl2ZV9pbXBvcnRfZXh0ZW5zaW9uQHN3Yy9oZWxwZXJzL18vX3RzX3Jld3JpdGVfcmVsYXRpdmVfaW1wb3J0X2V4dGVuc2lvbl9hcHBseV9kZWNzXzIyMDNfckBzd2MvaGVscGVycy9fL19hcHBseV9kZWNzXzIyMDNfcl9pZGVudGl0eUBzd2MvaGVscGVycy9fL19pZGVudGl0eV9kaXNwb3NlQHN3Yy9oZWxwZXJzL18vX2Rpc3Bvc2VfdXNpbmdAc3djL2hlbHBlcnMvXy9fdXNpbmdfdXNpbmdfY3R4QHN3Yy9oZWxwZXJzL18vX3VzaW5nX2N0eGFwcGx5X2RlY29yYXRlZF9kZXNjcmlwdG9yYXJyYXlfbGlrZV90b19hcnJheWFycmF5X3dpdGhfaG9sZXNhcnJheV93aXRob3V0X2hvbGVzYXNzZXJ0X3RoaXNfaW5pdGlhbGl6ZWRhc3luY19nZW5lcmF0b3Jhc3luY19nZW5lcmF0b3JfZGVsZWdhdGVhc3luY19pdGVyYXRvcmFzeW5jX3RvX2dlbmVyYXRvcmF3YWl0X2FzeW5jX2dlbmVyYXRvcmF3YWl0X3ZhbHVlY2FsbF9zdXBlcmNoZWNrX3ByaXZhdGVfcmVkZWNsYXJhdGlvbmNsYXNzX2FwcGx5X2Rlc2NyaXB0b3JfZGVzdHJ1Y3R1cmVjbGFzc19hcHBseV9kZXNjcmlwdG9yX2dldGNsYXNzX2FwcGx5X2Rlc2NyaXB0b3Jfc2V0Y2xhc3NfYXBwbHlfZGVzY3JpcHRvcl91cGRhdGVjbGFzc19jYWxsX2NoZWNrY2xhc3NfY2hlY2tfcHJpdmF0ZV9zdGF0aWNfZmllbGRfZGVzY3JpcHRvcmNsYXNzX2V4dHJhY3RfZmllbGRfZGVzY3JpcHRvcmNsYXNzX25hbWVfdGR6X2Vycm9yY2xhc3NfcHJpdmF0ZV9maWVsZF9nZXRjbGFzc19wcml2YXRlX2ZpZWxkX2luaXRjbGFzc19wcml2YXRlX2ZpZWxkX2xvb3NlX2Jhc2VjbGFzc19wcml2YXRlX2ZpZWxkX2xvb3NlX2tleWNsYXNzX3ByaXZhdGVfZmllbGRfc2V0Y2xhc3NfcHJpdmF0ZV9maWVsZF91cGRhdGVjbGFzc19wcml2YXRlX21ldGhvZF9nZXRjbGFzc19wcml2YXRlX21ldGhvZF9pbml0Y2xhc3NfcHJpdmF0ZV9tZXRob2Rfc2V0Y2xhc3Nfc3RhdGljX3ByaXZhdGVfZmllbGRfc3BlY19nZXRjbGFzc19zdGF0aWNfcHJpdmF0ZV9maWVsZF9zcGVjX3NldGNsYXNzX3N0YXRpY19wcml2YXRlX2ZpZWxkX3VwZGF0ZWNvbnN0cnVjdGNyZWF0ZV9jbGFzc2RlY29yYXRlZGVmYXVsdHNkZWZpbmVfZW51bWVyYWJsZV9wcm9wZXJ0aWVzZGVmaW5lX3Byb3BlcnR5ZXhwb3J0X3N0YXJnZXRfcHJvdG90eXBlX29maW5oZXJpdHNpbmhlcml0c19sb29zZWluaXRpYWxpemVyX2RlZmluZV9wcm9wZXJ0eWluaXRpYWxpemVyX3dhcm5pbmdfaGVscGVyaW50ZXJvcF9yZXF1aXJlX2RlZmF1bHRpbnRlcm9wX3JlcXVpcmVfd2lsZGNhcmRpc19uYXRpdmVfZnVuY3Rpb25pdGVyYWJsZV90b19hcnJheWl0ZXJhYmxlX3RvX2FycmF5X2xpbWl0aXRlcmFibGVfdG9fYXJyYXlfbGltaXRfbG9vc2Vqc3huZXdfYXJyb3dfY2hlY2tub25faXRlcmFibGVfcmVzdG5vbl9pdGVyYWJsZV9zcHJlYWRvYmplY3RfZGVzdHJ1Y3R1cmluZ19lbXB0eW9iamVjdF9zcHJlYWRvYmplY3Rfc3ByZWFkX3Byb3Bzb2JqZWN0X3dpdGhvdXRfcHJvcGVydGllc29iamVjdF93aXRob3V0X3Byb3BlcnRpZXNfbG9vc2VvdmVybG9hZF95aWVsZHBvc3NpYmxlX2NvbnN0cnVjdG9yX3JldHVybnJlYWRfb25seV9lcnJvcnNldF9wcm90b3R5cGVfb2Zza2lwX2ZpcnN0X2dlbmVyYXRvcl9uZXh0c2xpY2VkX3RvX2FycmF5c2xpY2VkX3RvX2FycmF5X2xvb3Nlc3VwZXJfcHJvcF9iYXNldGFnZ2VkX3RlbXBsYXRlX2xpdGVyYWx0YWdnZWRfdGVtcGxhdGVfbGl0ZXJhbF9sb29zZXRvX2FycmF5dG9fY29uc3VtYWJsZV9hcnJheXRvX3ByaW1pdGl2ZXRvX3Byb3BlcnR5X2tleXR5cGVfb2Z1bnN1cHBvcnRlZF9pdGVyYWJsZV90b19hcnJheXdyYXBfYXN5bmNfZ2VuZXJhdG9yd3JhcF9uYXRpdmVfc3VwZXJ3cml0ZV9vbmx5X2Vycm9yY2xhc3NfcHJpdmF0ZV9maWVsZF9kZXN0cnVjdHVyZWNsYXNzX3N0YXRpY19wcml2YXRlX2ZpZWxkX2Rlc3RydWN0dXJlY2xhc3Nfc3RhdGljX3ByaXZhdGVfbWV0aG9kX2dldGNsYXNzX2NoZWNrX3ByaXZhdGVfc3RhdGljX2FjY2Vzc2lzX25hdGl2ZV9yZWZsZWN0X2NvbnN0cnVjdGNyZWF0ZV9zdXBlcmNyZWF0ZV9mb3Jfb2ZfaXRlcmF0b3JfaGVscGVyX2xvb3NldHNfZGVjb3JhdGV0c19nZW5lcmF0b3J0c19tZXRhZGF0YXRzX3BhcmFtdHNfdmFsdWVzdHNfYWRkX2Rpc3Bvc2FibGVfcmVzb3VyY2V0c19kaXNwb3NlX3Jlc291cmNlc3RzX3Jld3JpdGVfcmVsYXRpdmVfaW1wb3J0X2V4dGVuc2lvbmFwcGx5X2RlY3NfMjIwM19yaWRlbnRpdHlkaXNwb3NldXNpbmdfY3R4YXJndW1lbnRzbm90IGltcGxlbWVudGVkL2hvbWUvbm9kZS9idWlsZC9kZXBzL3N3Yy9jcmF0ZXMvc3djX2VjbWFfdXRpbHMvc3JjL2xpYi5ycwDFtCYAOgAAAPwJAAA+AAAAzgUAAAQAAAAEAAAAlQEAAMW0JgA6AAAACgoAADwAAADFtCYAOgAAAOkJAAAmAAAAPAUAAAwAAAAEAAAAPQUAAD4FAACcAwAAAAAAAAAAAAABAAAAPwUAAENsYXNzRm5WYXJVc2luZ1RzSW50ZXJmYWNlVHNUeXBlQWxpYXNUc0VudW1Uc01vZHVsZWNyYXRlcy9zd2NfZWNtYV90cmFuc2Zvcm1zX3R5cGVzY3JpcHQvc3JjL3N0cmlwX3R5cGUucnMAAJu1JgA3AAAA1QAAACkAAABjcmF0ZXMvc3djX2VjbWFfdHJhbnNmb3Jtc190eXBlc2NyaXB0L3NyYy90cmFuc2Zvcm0ucnMAAOS1JgA2AAAA+gAAABcAAADktSYANgAAABUBAAASAAAA5LUmADYAAABdAQAAKAAAAOS1JgA2AAAAXgEAAC0AAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBkZXN0cnVjdHVyaW5nIHBhdHRlcm4gaW5zaWRlIFRzUGFyYW1ldGVyUHJvcGVydHkAAFy2JgBaAAAA5LUmADYAAABMAQAAIQAAAOS1JgA2AAAAewEAABIAAADktSYANgAAAE4CAAAnAAAA5LUmADYAAABLAgAAMgAAAOS1JgA2AAAA0QIAADgAAADktSYANgAAAFkDAAANAAAA5LUmADYAAAC5AwAAHwAAAOS1JgA2AAAAugMAAB8AAADktSYANgAAAOIDAAAfAAAA5LUmADYAAADqAwAAHQAAAOS1JgA2AAAABgQAACMAAADktSYANgAAALIDAAAxAAAAzwUAACgAAAAIAAAAQwIAAOS1JgA2AAAAxQMAAEAAAABJbXBvcnQgZGVjbGFyYXRpb25zIGluIGEgbmFtZXNwYWNlIGNhbm5vdCByZWZlcmVuY2UgYSBtb2R1bGUuRVNNLXN0eWxlIG1vZHVsZSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwZXJtaXR0ZWQgaW4gYSBuYW1lc3BhY2Uu5LUmADYAAAB6BAAAIwAAAOS1JgA2AAAAUAQAACsAAADktSYANgAAAFwEAABRAAAA5LUmADYAAABfBAAAHwAAAOS1JgA2AAAAaQQAAFYAAADktSYANgAAAGsEAAAfAAAAZXhwb3J0cwDktSYANgAAAKEFAAAjAAAA5LUmADYAAAClBQAAHwAAAOS1JgA2AAAAXAUAABoAAADktSYANgAAAF4FAAAaAAAASW1wb3J0IGFzc2lnbm1lbnQgY2Fubm90IGJlIHVzZWQgd2hlbiB0YXJnZXRpbmcgRUNNQVNjcmlwdCBtb2R1bGVzLiBDb25zaWRlciB1c2luZyBgaW1wb3J0ICogYXMgbnMgZnJvbSAibW9kImAsIGBpbXBvcnQge2F9IGZyb20gIm1vZCJgLCBgaW1wb3J0IGQgZnJvbSAibW9kImAsIG9yIGFub3RoZXIgbW9kdWxlIGZvcm1hdCBpbnN0ZWFkLkV4cG9ydCBhc3NpZ25tZW50IGNhbm5vdCBiZSB1c2VkIHdoZW4gdGFyZ2V0aW5nIEVDTUFTY3JpcHQgbW9kdWxlcy4gQ29uc2lkZXIgdXNpbmcgYGV4cG9ydCBkZWZhdWx0YCBvciBhbm90aGVyIG1vZHVsZSBmb3JtYXQgaW5zdGVhZC5Pbmx5IGFtYmllbnQgbW9kdWxlcyBjYW4gdXNlIHF1b3RlZCBuYW1lcy7ktSYANgAAAAoGAAAOAAAAY3JhdGVzL3N3Y19lY21hX3RyYW5zZm9ybXNfdHlwZXNjcmlwdC9zcmMvdHNfZW51bS5yc05hTkluZmluaXR5AES6JgA0AAAAuAAAABIAAAABAAAAAAAAAAEAAAAAAAAARLomADQAAADiAAAAGgAAAGNyYXRlcy9zd2NfZWNtYV90cmFuc2Zvcm1zX3R5cGVzY3JpcHQvc3JjL3R5cGVzY3JpcHQucnMAtLomADcAAABCAAAALAAAALS6JgA3AAAAWgAAABAAAABfY3JlYXRlUmVxdWlyZV9fcmVxdWlyZWNyZWF0ZVJlcXVpcmU8BQAADAAAAAQAAAA9BQAAPgUAAJwDAAAAAAAAAAAAAAEAAAA/BQAAL3J1c3RjLzJlNjg4MmFjNWJlMjdhNzMyOTNkNmY3YWU1NjM5N2ZkZjMyODQ4ZGUvbGlicmFyeS9hbGxvYy9zcmMvdmVjL21vZC5yc1i7JgBMAAAAVgoAACQAAAAAAAAADAAAAAQAAADUBQAA1QUAAGNvbnN0cnVjdG9yIHNob3VsZCBoYXZlIGEgYm9keWNyYXRlcy9zd2NfZWNtYV91dGlscy9zcmMvY29uc3RydWN0b3IucnMAAOa7JgAoAAAADgAAACAAAABTeW1ib2wAAAEAAAAAAAAAXNgmAAEAAABzdXBlcl8AADi8JgAGAAAAXNgmAAEAAAC8yyYAPQAAAHoCAAAUAAAAvMsmAD0AAACiAgAAPAAAALzLJgA9AAAAkQIAAD4AAACZAwAADAAAAAQAAAAaBQAA1wUAAJwDAAAAAAAAAAAAAAEAAACdAwAAYOomAE8AAAAKAgAANwAAANgFAAAsAAAABAAAANkFAADaBQAA2wUAANwFAADdBQAA3gUAAKMDAAAkc2VyZGVfanNvbjo6cHJpdmF0ZTo6UmF3VmFsdWVyYW5nZSAgb3V0IG9mIGJvdW5kczog/rwmAAYAAAAEvSYAEAAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL2JpdHZlYy0xLjAuMS9zcmMvc2xpY2UvYXBpLnJzAAAkvSYAYgAAAI4KAAABAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc2VyZGVfanNvbi0xLjAuMTQwL3NyYy9zZXIucnMAAJi9JgBiAAAADQYAABIAAACYvSYAYgAAAEwIAAAzAAAAdXV1dXV1dXVidG51ZnJ1dXV1dXV1dXV1dXV1dXV1dXUAACIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJi9JgBiAAAAPwgAAEAAAAAiXCJcXFxiXGZcblxyXHQAHMwmAF4AAAA0AAAABQAAAEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8vaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi93eXotMC41LjEvc3JjL2NvbXUucnMAAIy/JgBaAAAAJwEAAAIAAADfBQAADAAAAAQAAADgBQAA4QUAAJwDAAAAAAAAAAAAAAEAAAAABQAAdTgAAOIFAAAUAAAABAAAAOMFAAAAAAAACAAAAAQAAADkBQAAL3J1c3RjLzJlNjg4MmFjNWJlMjdhNzMyOTNkNmY3YWU1NjM5N2ZkZjMyODQ4ZGUvbGlicmFyeS9hbGxvYy9zcmMvY29sbGVjdGlvbnMvYnRyZWUvbmF2aWdhdGUucnMARMAmAF8AAADGAAAAJwAAAC9ydXN0Yy8yZTY4ODJhYzViZTI3YTczMjkzZDZmN2FlNTYzOTdmZGYzMjg0OGRlL2xpYnJhcnkvYWxsb2Mvc3JjL2NvbGxlY3Rpb25zL2J0cmVlL21hcC9lbnRyeS5yc7TAJgBgAAAAoQEAAC4AAAAvcnVzdGMvMmU2ODgyYWM1YmUyN2E3MzI5M2Q2ZjdhZTU2Mzk3ZmRmMzI4NDhkZS9saWJyYXJ5L2FsbG9jL3NyYy9jb2xsZWN0aW9ucy9idHJlZS9ub2RlLnJzYXNzZXJ0aW9uIGZhaWxlZDogZWRnZS5oZWlnaHQgPT0gc2VsZi5oZWlnaHQgLSAxACTBJgBbAAAArQIAAAkAAABhc3NlcnRpb24gZmFpbGVkOiBzcmMubGVuKCkgPT0gZHN0LmxlbigpJMEmAFsAAABKBwAABQAAACTBJgBbAAAAxwQAACMAAAAkwSYAWwAAAAoFAAAkAAAAYXNzZXJ0aW9uIGZhaWxlZDogZWRnZS5oZWlnaHQgPT0gc2VsZi5ub2RlLmhlaWdodCAtIDEAAAAkwSYAWwAAAPoDAAAJAAAARMAmAF8AAABYAgAAMAAAAETAJgBfAAAAFgIAAC8AAABEwCYAXwAAAKEAAAAkAAAAYXR0ZW1wdCB0byBqb2luIGludG8gY29sbGVjdGlvbiB3aXRoIGxlbiA+IHVzaXplOjpNQVgvcnVzdGMvMmU2ODgyYWM1YmUyN2E3MzI5M2Q2ZjdhZTU2Mzk3ZmRmMzI4NDhkZS9saWJyYXJ5L2FsbG9jL3NyYy9zdHIucnMAAADFwiYASAAAAJoAAAAKAAAAxcImAEgAAACdAAAAFgAAAMXCJgBIAAAAsQAAABYAAABOdWxsUHRyRXJyb3JJbmNsdWRlZEV4Y2x1ZGVkVW5ib3VuZGVkY2Fubm90ICBiaXRzIGZyb20gYSAtYml0IHJlZ2lvbmXDJgAHAAAAqM0mAAEAAABswyYADQAAAHnDJgALAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvYml0dmVjLTEuMC4xL3NyYy9maWVsZC5ycwAApMMmAF4AAAAOAgAAAgAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL2JpdHZlYy0xLjAuMS9zcmMvc2xpY2UucnMAABTEJgBeAAAA9wAAAB8AAAAUxCYAXgAAAE8BAAAjAAAAaW5kZXggIG91dCBvZiByYW5nZTogAAAAlMQmAAYAAACaxCYADwAAABTEJgBeAAAAMQYAAAMAAAAuLmxvYWRCaXRTcGFuRXJyb3I8Pjo6AADSxCYADQAAAN/EJgADAAAATnVsbE1pc2FsaWduZWRUb29Mb25nVG9vSGlnaE1pc2FsaWduRXJyb3IAAAABAAAAmL0mAGIAAAB/AgAAKgAAAJi9JgBiAAAApAIAACoAAACYvSYAYgAAAPwBAAAqAAAAmL0mAGIAAAAKAgAAKgAAAGV4cGVjdGVkIFJhd1ZhbHVlL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX3NvdXJjZW1hcC05LjMuNC9zcmMvYnVpbGRlci5yc3XFJgBnAAAAaQAAABoAAAB1xSYAZwAAAGoAAAAiAAAAQ2Fubm90IHNldCBzb3VyY2VzIGZvciB0b21ic3RvbmUgc291cmNlIGlkAAB1xSYAZwAAAIAAAAAJAAAAdcUmAGcAAACEAAAAHQAAAHXFJgBnAAAABwEAABUAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zd2Nfc291cmNlbWFwLTkuMy40L3NyYy9lbmNvZGVyLnJzAFjGJgBnAAAANwAAAA0AAABpbnZhbGlkIGJ5dGVYxiYAZwAAACMAAAASAAAAaW52YWxpZCB1dGY4WMYmAGcAAABmAAAAIQAAAFjGJgBnAAAAWAAAABEAAABiYWQganNvbjogAAAYxyYACgAAAGxlZnRvdmVyIGN1ci9zaGlmdCBpbiB2bHEgZGVjb2RldmxxIGRlY29kZSBkaWQgbm90IHByb2R1Y2UgYW55IHZhbHVlc3ZscSBkZWNvZGUgY2F1c2VkIGFuIG92ZXJmbG93Z290ICBzZWdtZW50cywgZXhwZWN0ZWQgNCBvciA1jscmAAQAAACSxyYAGgAAAGJhZCByZWZlcmVuY2UgdG8gc291cmNlICMAAAC8xyYAGQAAAGJhZCByZWZlcmVuY2UgdG8gbmFtZSAjAODHJgAXAAAAZW5jb3VudGVyZWQgaW5jb21wYXRpYmxlIHNvdXJjZW1hcCBmb3JtYXR0aGUgcHJvdmlkZWQgZGF0YSBVUkwgaXMgaW52YWxpZGNhbm5vdCBmbGF0dGVuIHRoZSBpbmRleGVkIHNvdXJjZW1hcDogAEnIJgAmAAAAaW52YWxpZCBtYWdpYyBudW1iZXIgZm9yIHJhbSBidW5kbGVpbnZhbGlkIG1vZHVsZSBpbmRleCBpbiByYW0gYnVuZGxlaW52YWxpZCByYW0gYnVuZGxlIG1vZHVsZSBlbnRyeW5vdCBhIHJhbSBidW5kbGVpbnZhbGlkIHJhbmdlIG1hcHBpbmcgaW5kZXg6IAAAAOzIJgAdAAAAaW52YWxpZCBiYXNlNjQgY2hhcmFjdGVyOiAAABTJJgAaAAAAaHR0cDpodHRwczoAAQAAAAAAAAALziYAAQAAAGxpbmVjb2x1bW5vZmZzZXR1cmxtYXBuYW1lc21hcHBpbmdzdmVyc2lvbmZpbGVzb3VyY2Vzc291cmNlUm9vdHNvdXJjZXNDb250ZW50c2VjdGlvbnNyYW5nZU1hcHBpbmdzaWdub3JlTGlzdHhfZmFjZWJvb2tfb2Zmc2V0c3hfbWV0cm9fbW9kdWxlX3BhdGhzeF9mYWNlYm9va19zb3VyY2VzZGVidWdfaWRkZWJ1Z0lkL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvbnVtLWJpZ2ludC0wLjQuNi9zcmMvYmlnaW50LnJzAAAHyiYAYwAAAGwDAAAPAAAAAAAAAAQAAAAAAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvbnVtLWJpZ2ludC0wLjQuNi9zcmMvYmlndWludC9jb252ZXJ0LnJziMomAGwAAADwAQAAFgAAAGNhbm5vdCBhY2Nlc3MgYSBzY29wZWQgdGhyZWFkIGxvY2FsIHZhcmlhYmxlIHdpdGhvdXQgY2FsbGluZyBgc2V0YCBmaXJzdC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3Njb3BlZC10bHMtMS4wLjEvc3JjL2xpYi5yc0zLJgBgAAAAqAAAAAkAAAAvaG9tZS9ub2RlL2J1aWxkL2RlcHMvc3djL2NyYXRlcy9zd2NfY29tbW9uL3NyYy9zb3VyY2VfbWFwLnJzAAAAvMsmAD0AAAA1BQAASgAAALzLJgA9AAAAYgUAACYAAAAvcnVzdGMvMmU2ODgyYWM1YmUyN2E3MzI5M2Q2ZjdhZTU2Mzk3ZmRmMzI4NDhkZS9saWJyYXJ5L2FsbG9jL3NyYy92ZWMvc3BlY19mcm9tX2l0ZXJfbmVzdGVkLnJzAAAczCYAXgAAABMAAAAFAAAAL2hvbWUvbm9kZS9idWlsZC9kZXBzL3N3Yy9jcmF0ZXMvc3djX2VjbWFfdHJhbnNmb3Jtc19iYXNlL3NyYy9yZW5hbWUvb3BzLnJzAIzMJgBLAAAASgIAABcAAACMzCYASwAAAE8CAAARAAAAjMwmAEsAAAAeAQAAGQAAAIzMJgBLAAAARwEAABkAAACMzCYASwAAAHsBAAAcAAAAjMwmAEsAAAC7AQAAFwAAAIzMJgBLAAAAwAEAABEAAACMzCYASwAAAH4CAAASAAAAL2hvbWUvbm9kZS9idWlsZC9kZXBzL3N3Yy9jcmF0ZXMvc3djX2VjbWFfY29kZWdlbi9zcmMvdGV4dF93cml0ZXIvYmFzaWNfaW1wbC5yczsgdmFybGV0Y29uc3ROb25lLSshfnR5cGVvZnZvaWRkZWxldGU9Kz0tPSo9Lz0lPTw8PT4+PT4+Pj18PV49Jj0qKj0mJj18fD0/Pz09PSE9PT09IT09PDw9Pj49PDw+Pj4+PiovJXxeJnx8JiZpbmluc3RhbmNlb2YqKj8/KystLS9ydXN0Yy8yZTY4ODJhYzViZTI3YTczMjkzZDZmN2FlNTYzOTdmZGYzMjg0OGRlL2xpYnJhcnkvY29yZS9zcmMvaXRlci90cmFpdHMvaXRlcmF0b3IucnMoziYAWAAAANMHAAAJAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL3V0aWwvaXRlci5yc3VuZXhwZWN0ZWQgcmVnZXggZmluZCBlcnJvcjogCnRvIGhhbmRsZSBmaW5kIGVycm9ycywgdXNlICd0cnknIG9yICdzZWFyY2gnIG1ldGhvZHP6ziYAHQAAABfPJgA1AAAAkM4mAGoAAAB+AQAAGQAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy91dGlsL3Bvb2wucnMAAGzPJgBqAAAAPQIAABwAAABszyYAagAAAEQCAAAyAAAAbM8mAGoAAABeAgAAHAAAAGzPJgBqAAAAawIAADIAAABszyYAagAAAG8CAAAXAAAAAgAAAGzPJgBqAAAAAQMAABUAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvdXRpbC9zZWFyY2gucnNpbnZhbGlkIHNwYW4gIGZvciBoYXlzdGFjayBvZiBsZW5ndGggAAAAqNAmAA0AAAC10CYAGAAAADzQJgBsAAAAqgEAAAkAAABhc3NlcnRpb24gZmFpbGVkOiBzcGFuLmxvID49IHNlbGYuaW5wdXQuc3RhcnRfcG9zKCkgJiYgc3Bhbi5oaSA8PSBzZWxmLmlucHV0LmVuZF9wb3MoKS9ob21lL25vZGUvYnVpbGQvZGVwcy9zd2MvY3JhdGVzL3N3Y19lY21hX3BhcnNlci9zcmMvbGV4ZXIvc3RhdGUucnMAAABG0SYAQwAAAFEAAAAJAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogAACc0SYAKgAAAAIAAAAAAAAAAgAAAAAAAAAAAAAAIACA4C9ob21lL25vZGUvYnVpbGQvZGVwcy9zd2MvY3JhdGVzL3N3Y19lY21hX3BhcnNlci9zcmMvbGV4ZXIvdG9rZW4ucnMA6NEmAEMAAAB9AQAAEQAAAC9ob21lL25vZGUvYnVpbGQvZGVwcy9zd2MvY3JhdGVzL3N3Y19lY21hX3BhcnNlci9zcmMvbGV4ZXIvY2FwdHVyaW5nLnJzADzSJgBHAAAAPgAAAAsAAABhYnN0cmFjdGVudW1pbnRlcmZhY2Vtb2R1bGVuYW1lc3BhY2V0eXBlL2hvbWUvbm9kZS9idWlsZC9kZXBzL3N3Yy9jcmF0ZXMvc3djX2VjbWFfcGFyc2VyL3NyYy9wYXJzZXIvdHlwZXNjcmlwdC5ycwAAALzSJgBJAAAAOwAAABcAAAC80iYASQAAAD8AAAARAAAACgkAALzSJgBJAAAAcgEAACAAAAACA2RlY2xhcmVnbG9iYWwScHVibGljcHJvdGVjdGVkcHJpdmF0ZXJlYWRvbmx5AABM0yYABgAAAFLTJgAJAAAAW9MmAAcAAABi0yYACAAAAJ1Zb3ZlcnJpZGVvdXQAAABM0yYABgAAAFvTJgAHAAAAUtMmAAkAAABi0yYACAAAAJTSJgAIAAAAr80mAAUAAACO0yYACAAAABTOJgACAAAAltMmAAMAAABsL3J1c3RjLzJlNjg4MmFjNWJlMjdhNzMyOTNkNmY3YWU1NjM5N2ZkZjMyODQ4ZGUvbGlicmFyeS9hbGxvYy9zcmMvc3RyaW5nLnJz5dMmAEsAAADoAQAAFwAAALzSJgBJAAAA5wMAAEAAAAC80iYASQAAAOoDAAAsAAAAAZEEBWLTJgAIAAAAkwAAALzSJgBJAAAAQQgAADcAAAA8IChqc3ggdGFnIHN0YXJ0KXBpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlAAC80iYASQAAAAAJAAASAAAAGgAAALzSJgBJAAAAdgQAABYAAACFmRNzdHJpbmdudWxsbnVtYmVyb2JqZWN0YW55dW5rbm93bmJvb2xlYW5iaWdpbnRzeW1ib2xuZXZlcmludHJpbnNpYwAAAAAAAAAAAQAAAJ0DAABjYWxsZWQgYFJlc3VsdDo6dW53cmFwKClgIG9uIGFuIGBFcnJgIHZhbHVlALzSJgBJAAAA7QkAADgAAAC80iYASQAAAP8JAAA4AAAAvNImAEkAAAAJCgAAFgAAAG51bWVyaWMgbGl0ZXJhbCBvciBiaWdpbnQgbGl0ZXJhbGFuIGlkZW50aWZpZXIsIHZvaWQsIHlpZWxkLCBudWxsLCBhd2FpdCwgYnJlYWssIGEgc3RyaW5nIGxpdGVyYWwsIGEgbnVtZXJpYyBsaXRlcmFsLCB0cnVlLCBmYWxzZSwgYCwgLSwgaW1wb3J0LCB0aGlzLCB0eXBlb2YsIHssIFssIChoY7zSJgBJAAAATgkAACsAAAC80iYASQAAAEwJAAAaAAAAvNImAEkAAABdBAAAEwAAALzSJgBJAAAAYQQAABQAAAAXkmEgc3RyaW5nIGxpdGVyYWwAALzSJgBJAAAAcgAAABEAAAAHAAAAvNImAEkAAACABQAAGAAAALzSJgBJAAAAjgUAABIAAABhbiBpZGVudGlmaWVyLCBbIGZvciBhbiBhcnJheSBwYXR0ZXJuLCB7IGZvciBhbiBvYmplY3QgcGF0dGVyIG9yIC4uLiBmb3IgYSByZXN0IHBhdHRlcm4AvNImAEkAAAAkAQAAFwAAABtnbG9iYWwgb3IgYSBzdHJpbmcgbGl0ZXJhbGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGhhbmRsZV9pbXBvcnRfZXhwb3J0IHNob3VsZCBub3QgYmUgY2FsbGVkIGlmIGN1cnJlbnQgdG9rZW4gaXNuJ3QgaW1wb3J0IG5vciBleHBvcnQAQ9cmAHwAAAAvaG9tZS9ub2RlL2J1aWxkL2RlcHMvc3djL2NyYXRlcy9zd2NfZWNtYV9wYXJzZXIv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4SYAQwAAACUDAAAgAAAAceEmAEMAAAB5AAAAFgAAAC9ob21lL25vZGUvYnVpbGQvZGVwcy9zd2MvY3JhdGVzL3N3Y19lY21hX3BhcnNlci9zcmMvcGFyc2VyL2lkZW50LnJzpOImAEQAAADLAAAADQAAAGxldCBpcyByZXNlcnZlZCBpbiBjb25zdCwgbGV0LCBjbGFzcyBkZWNsYXJhdGlvbmF3YWl0eWllbGRpZGVudGlmaWVyIG9yIHN0cmluZy9ob21lL25vZGUvYnVpbGQvZGVwcy9zd2MvY3JhdGVzL3N3Y19lY21hX3BhcnNlci9zcmMvcGFyc2VyL2lucHV0LnJzAABG4yYARAAAAIMBAAAgAAAARuMmAEQAAABkAAAADQAAAEbjJgBEAAAAnAAAAA0AAABG4yYARAAAAI4AAAANAAAARuMmAEQAAACHAAAADQAAAEbjJgBEAAAAcgAAAA0AAABG4yYARAAAAHkAAAANAAAARuMmAEQAAACAAAAADQAAAEbjJgBEAAAAlQAAAA0AAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiB0b2tlbl92YWx1ZTogABzkJgA3AAAARuMmAEQAAABrAAAADQAAAC9ob21lL25vZGUvYnVpbGQvZGVwcy9zd2MvY3JhdGVzL3N3Y19lY21hX3BhcnNlci9zcmMvcGFyc2VyL29iamVjdC5ycwAAAGzkJgBFAAAAFgAAAB0AAABs5CYARQAAABkAAAAXAAAALi4uICwgKiwgICgsIFssIDosICwgPywgPSwgYW4gaWRlbnRpZmllciwgcHVibGljLCBwcm90ZWN0ZWQsIHByaXZhdGUsIHJlYWRvbmx5LCA8Li4uLiAsICosICAoLCBbLCA6LCAsID8sID0gb3IgYW4gaWRlbnRpZmllcmlkZW50aWZpZXIAAGzkJgBFAAAAnQEAACIAAABhbiBpZGVudGlmaWVyL2hvbWUvbm9kZS9idWlsZC9kZXBzL3N3Yy9jcmF0ZXMvc3djX2VjbWFfY29kZWdlbi9zcmMvdHlwZXNjcmlwdC5yc2V4cG9ydG5ldzo9Pn0uLi50aGlzW11pbmZlcmV4dGVuZHMsLj8AAAB55SYAQwAAABUCAAAiAAAAJHsAAHnlJgBDAAAAGAIAACEAAAB1bmRlZmluZWRrZXlvZnVuaXF1ZXNhdGlzZmllc2Fzc2VydHNpc3JlcXVpcmV3aXRoAAAAWM0mAE8AAAByAAAAGgAAACAgICBYzSYATwAAAIsAAAAYAAAAL2hvbWUvbm9kZS9idWlsZC9kZXBzL3N3Yy9jcmF0ZXMvc3djX2VjbWFfY29kZWdlbi9zcmMvbW9kdWxlX2RlY2xzLnJzZnJvbWFzc2VydABg5iYARQAAAKEAAAAgAAAAYXNzZXJ0aW9uIGZhaWxlZDogc2VsZi5zcGVjaWZpZXJzLmxlbigpIDw9IDJg5iYARQAAAK8AAAAVAAAAYOYmAEUAAABlAQAAKAAAAG5vdCBpbXBsZW1lbnRlZDogY29kZWdlbiBvZiBgZXhwb3J0IGRlZmF1bHQgZnJvbSAnZm9vJztgDOcmADgAAABg5iYARQAAAAcBAAARAAAAZGVmYXVsdC9ob21lL25vZGUvYnVpbGQvZGVwcy9zd2MvY3JhdGVzL3N3Y19lY21hX2NvZGVnZW4vc3JjL2xpYi5ycwBj5yYAPAAAAJEDAAASAAAAY+cmADwAAAAFAgAASAAAAGPnJgA8AAAABgIAACgAAABj5yYAPAAAAMoAAABMAAAAY+cmADwAAADNAAAAJwAAADwvPC8+PD4vaG9tZS9ub2RlL2J1aWxkL2RlcHMvc3djL2NyYXRlcy9zd2NfZWNtYV9jb2RlZ2VuL3NyYy9saXQucnMA9+cmADwAAAD/AAAANAAAAGZhbHNldHJ1ZXVzZSBzdHJpY3RzY3JpcHRcdXs8IS0tXHgzYyEtLS0tPi0tXHgzZW4tMHh16CYAAwAAADB4AACA6CYAAgAAAGNsYXNzZnVuY3Rpb24vaG9tZS9ub2RlL2J1aWxkL2RlcHMvc3djL2NyYXRlcy9zd2NfZWNtYV9jb2RlZ2VuL3NyYy9zdG10LnJzaWZlbHNlZm9ydHJ5ZmluYWxseWJyZWFrb2Z0aHJvd3doaWxlcmV0dXJuY2FzZZnoJgA9AAAAAwEAAB0AAACZ6CYAPQAAAAYBAABBAAAAc3dpdGNoY2F0Y2hkb2NvbnRpbnVlZGVidWdnZXJpbXBsZW1lbnRzYWNjZXNzb3IvLy8qKi8gaXMgYWxyZWFkeSByZW5hbWVkIHRvICwgYnV0IGl0J3MgcmVuYW1lZCBhcyAAAJzRJgAqAAAAWekmABcAAABw6SYAFgAAAC9ob21lL25vZGUvYnVpbGQvZGVwcy9zd2MvY3JhdGVzL3N3Y19lY21hX3RyYW5zZm9ybXNfYmFzZS9zcmMvcmVuYW1lL21vZC5ycwCg6SYASwAAABEBAAAZAAAAZXZhbOUFAAAMAAAABAAAABoFAACbAwAAnAMAAGEgRGlzcGxheSBpbXBsZW1lbnRhdGlvbiByZXR1cm5lZCBhbiBlcnJvciB1bmV4cGVjdGVkbHkA5dMmAEsAAADwCgAADgAAAC9ydXN0Yy8yZTY4ODJhYzViZTI3YTczMjkzZDZmN2FlNTYzOTdmZGYzMjg0OGRlL2xpYnJhcnkvY29yZS9zcmMvc3RyL3BhdHRlcm4ucnMAYOomAE8AAADiBQAAFAAAAGDqJgBPAAAA4gUAACEAAABg6iYATwAAANYFAAAhAAAAZGVzY3JpcHRpb24oKSBpcyBkZXByZWNhdGVkOyB1c2UgRGlzcGxheW1pZCA+IGxlbgAAAAjrJgAJAAAAL3J1c3RjLzJlNjg4MmFjNWJlMjdhNzMyOTNkNmY3YWU1NjM5N2ZkZjMyODQ4ZGUvbGlicmFyeS9jb3JlL3NyYy9zbGljZS9tb2QucnMAAAAc6yYATQAAAOwDAAArAAAAL3J1c3RjLzJlNjg4MmFjNWJlMjdhNzMyOTNkNmY3YWU1NjM5N2ZkZjMyODQ4ZGUvbGlicmFyeS9jb3JlL3NyYy9zbGljZS9zb3J0L3N0YWJsZS9kcmlmdC5ycwB86yYAWwAAAP8AAAAZAAAAfOsmAFsAAADyAAAAEgAAAHzrJgBbAAAAzgAAACQAAAB86yYAWwAAANEAAAAkAAAAfOsmAFsAAABAAAAAIgAAAC9ydXN0Yy8yZTY4ODJhYzViZTI3YTczMjkzZDZmN2FlNTYzOTdmZGYzMjg0OGRlL2xpYnJhcnkvY29yZS9zcmMvc2xpY2Uvc29ydC9zdGFibGUvcXVpY2tzb3J0LnJzACjsJgBfAAAATgAAAB8AAAAo7CYAXwAAAEgAAAAXAAAA5gUAAAgAAAAEAAAA5wUAAAAAAAAEAAAABAAAAGAAAAAAAAAABAAAAAQAAAAcBQAA6AUAABQAAAAEAAAA6QUAAOgFAAAUAAAABAAAAIQDAADpBQAA2OwmAKMDAADqBQAA6wUAAKMDAACmAwAA7AUAAAwAAAAEAAAA7QUAAOwFAAAMAAAABAAAAIUDAADtBQAAFO0mAKMDAADuBQAApQMAAO8FAACmAwAARXJyb3JJZGVudEFycmF5UmVzdE9iamVjdEFzc2lnbkludmFsaWRFeHByL3J1c3RjLzJlNjg4MmFjNWJlMjdhNzMyOTNkNmY3YWU1NjM5N2ZkZjMyODQ4ZGUvbGlicmFyeS9hbGxvYy9zcmMvc2xpY2UucnN67SYASgAAAGIDAAAJAAAAL3J1c3RjLzJlNjg4MmFjNWJlMjdhNzMyOTNkNmY3YWU1NjM5N2ZkZjMyODQ4ZGUvbGlicmFyeS9hbGxvYy9zcmMvYm9ycm93LnJzANTtJgBLAAAAFQEAACUAAABVdGY4RXJyb3J2YWxpZF91cF90b2Vycm9yX2xlbjxpbnZhbGlkPkZyb21VdGY4RXJyb3JieXRlc2Vycm9ySW9VdGY4QmFkSnNvblZscUxlZnRvdmVyVmxxTm9WYWx1ZXNWbHFPdmVyZmxvd0JhZFNlZ21lbnRTaXplQmFkU291cmNlUmVmZXJlbmNlQmFkTmFtZVJlZmVyZW5jZUluY29tcGF0aWJsZVNvdXJjZU1hcEludmFsaWREYXRhVXJsQ2Fubm90RmxhdHRlbkludmFsaWRSYW1CdW5kbGVNYWdpY0ludmFsaWRSYW1CdW5kbGVJbmRleEludmFsaWRSYW1CdW5kbGVFbnRyeU5vdEFSYW1CdW5kbGVJbnZhbGlkUmFuZ2VNYXBwaW5nSW5kZXhJbnZhbGlkQmFzZTY0U29tZWludmFsaWQgdXRmLTg6IGNvcnJ1cHQgY29udGVudHMAY+cmADwAAAAeCAAAIgAAAGPnJgA8AAAAIQgAACEAAABpbnZhbGlkIHV0Zi04AAAA5gUAAAgAAAAEAAAA8AUAAOYFAAAIAAAABAAAAOcFAADwBQAAwO8mAPEFAADyBQAA8wUAAPQFAACmAwAAAAAAAAgAAAAEAAAA9QUAAAAAAAAIAAAABAAAAPYFAAD1BQAA/O8mAKMDAAD3BQAA+AUAAKMDAACmAwAA+QUAAAQAAAAEAAAA+gUAAPkFAAAEAAAABAAAAPsFAAD6BQAAOPAmAPwFAAD9BQAApQMAAP4FAACmAwAAc3VwZXIAAAD/BQAAFAAAAAQAAAAABgAA/wUAABQAAAAE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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////////////8/P/////8/P/+q////P////////99f3B/PD/8f3B8AAAAAAAAAAAAAAAAAAAAAAAAAAAAEIAT//3////9///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASgBP//f////3///////////////////////////////////////////////////////////////////////w8A//9/+P//////D////////////////////////////////8P/AwAfUAAAAAAAAAAAAAAAAAAAAADfvEDX///7////////////v//////////////////////////////////D/wMAH1AAAP//////////////////37zA1///+////////////7///////////////////////wP8///////////////////////////+////fwL//////wEAAAAAAAAAAP///4cHAP/////////////////////7/P///////////////////////////v///38C//////8B/v////+/tgD///+HBwAAAAAA//////8HAAAAwP7//////////////y8AYMAAnAAA/f///wAAAOD/////////////PwACAAD8////BzAEAAD/B////////////8P////////////////vn//9/58AAP/////////n////////////////AwD///////8/JP//PwQQAQAA////Af8H////fgAA//////8DAAAAAAAA8P///////yMAAAH/AwD+/+Gf+f///cUjAEAAsAMAAxD//////z8AAP///w//B////36A////////////+////////////////////8///v/vn/n///3F8595gLDP/wNQ4If5///9bQMAAABeAAAcAOC/+////e0jAAABAAMAAALgn/n///3tIwAAALADAAIA6Mc91hjH/wMAAAEAAAAAAO6H+f///W3ThzkCXsD/PwDuv/v///3t8787AQDP/wD+7p/5///97fOfOeCwz/8CAOzHPdYYx//Dxz2BAMD/AADg3/3///3/IwAAACcDAAAA4d/9///97yMAAABgAwAGAPDf/f////8nAEBwgAMAAPzg/3/8///7L38AAAAAAAAA/9/9///9//PfPWAnz/8AAO/f/f///e/z3z1gYM//DgD/3/3//////9998IDP/wD87v9//P//+y9/hF//wP8MAP7//////w0AfwAAAAAAAADW9///r/8NIF8AAPAAAAAAAQAAAAAAAAD//v///x8AAAAfAAAAAAAAAAAAAAAAAAD+////////B/9//wMAAAAA1vf//6///z9ff//zAAAAAAEAAAP/A6DC//7///8f/v/f///+////H0AAAAAAAAAA//////8HAIAAAD88YsDh/wNAAAD/////vyD///////f///////////////////////////////////////////////////8/AAD///////////z///////8AAAAAAP8P////////////A////////////z//////vyD///////f//////////////////////////////////////////////////38A//8/AP8AAAC////////9BwAAAAAAAAAA////////////PX89//////89/////z1/Pf9//////////z3//////////wcAAAAA//8AAP////////////8/P////////////z1/Pf//////Pf////89fz3/f/////////89///////////nAP4DAP//AAD/////////////Pz/+/////////////////////////////////////////////////////////////////////////////////////////////////////////////wMAAAAAAAAAAAAAAAD/////////////////n////v//B////////////8f/Af//A4D//wMA//8DAP/fAQD///////8PAAAAgBAAAAAA/////////////////5////7//wf////////////H/wH//z+A//8fAP//DwD/3w0A/////////////48w/wMAAAAAAAD//////////////wH//////wX//////////z8A////fwAAAAAAAP///z8fAP//////D////wMAAAAAAAAAuP8D//////////////8B//////8H//////////8/AP///3//D/8PwP////8/HwD//////w////8D/wcAAAAA//9/AP///////x8AAAAAAAAAAACAAAAAAAAAAAAAAADg//////8PAOAfAAAAAAAA+P///wHAAPz/////PwAAAP///w//////////f////5//A/8DgAD/v/9/AAAAAAAA////////////H/8DAPgPAP//////////////////DwD/////DwAAAADgAPz///8//wf//////+cAAAAAAN5vBP///////////////////////////////wAAAAAAAAAA/////////wD/4///////P/8H///////nAAD3/////wf///////////////////////////////////////////////////////////////////////////////////8HAAAAAAAAAAAAAAAAAAACgAAA/x8AAAAAAAAAAAAAAACE/C8/UP3/8+BDAAD//////wEAAAAAAAAAAAAAAAAAAAAwAAAAAACAAQAQAAAAAoAAAP8fAAAAAAAA/x/i/wEAhPwvP1D9//PgQwAA//////8BAAAAAAAAAAAAAAAAAAD/////////////////////////////////////H3gMAP////+/IP////////+AAAD//38Af39/f39/f38AAAAA/////////////////////////////////////x/4DwD/////vyD/////////gACA//9/AH9/f39/f39//////+AAAAD+Az4f/v///////////3/4/v/////////////34P///////v////////////9/AAD/////AAAAAAAA///gAAAA/v8+H/7///////////9//v7//////////////+D///////7/////////////fwAA/////wAAAAAAAP////////////////////////8fAAAAAAAAAAD//////z////////////////////////////////////////////////////////////////////////////////////8A/x///wAMAAD//////38AgP///z//////////////AAAAAID//P////////////////n/////////P+sfAAD8//8f////DwAA////////8L///////////////////wMAAACA//z////////////////5/////////z/rHwAA/P+79///BwAAAP///////w8A/P//////DwAAAAAAAAD8aAD8//8/AP//fwAAAP///x/w//////8HAACAAADf/wB8//////8QAAD///////8PAP//////////PwD/A////+j//////z//////DwD///8f//////////8BgP8D////f///////AQAA9w8AAP//f8T///////9iPgUAADj/BxwAfn5+AH9////////3/wP//////////////////wcAAAD///////9/AP8//wP//3/8//////////8HAAA4//98AH5+fgB/f///////9/8D////////////////////N/8D/////////////////z//////////////////AwAAAAB/APig//1/X9v/////////////////AwAAAPj///////////////////////8//////////////////wMAAAAAfwD44P/9f1/b/////////////////wMAAAD4//////8AAAAAAAAAAAAAAAAAAN//////////////////////HwAAAAD+//8H/v//B8D/////////////f/z8/BwAAAAA//8AAP//GAAA4AAAAADf/////////////////////x8AAP8D/v//h/7//wfg/////////////3/8/PwcAAAAAP/v//9///+3/z//PwAAAAD///////////////////8HAAAAAAAAAAD///////8fAAAAAAAAAAAAAAAAAAAAAAD/7///f///t/8//z8AAAAA////////////////////BwAAAAAAAAAA////////HwAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAP///x////////8BAAAAAAD/////AOD///8H/////z8A////P/////8P/z4AAAAAAAAAAAAAAAAAAAAAAAAAAAD///8f////////AQABAAAA/////wDg////B///////B////z//////D/8+AAAAAAD/////////////////////////PwAA/////w//////D///////AP///////w8A//f/97f/+//7G////////w8A/////////////////////////z//A/////8P/////w///////wD///////8PAP/3//e3//v/+xv///////8PAD/9/////7+R//8/AP//fwD///9/AAAAAAAAAAD//zcA//8/AP///wMAAAAAAAAAAP/////////AAAAAAAAAAAABAO/+//8/AAAAAAD///8f////HwAAAAD//v//HwAAAP///////z8A//8/AP//BwD//wMAAAAAAAAAAAAAAAAAb/Dv/v//P4cAAAAA////H////x8AAAAA//7//38AAAD///////8/AP//PwD//wcA//8DAAAAAAAAAAAAAAAAAP///////////wEAAAAAAAD///////8HAP///////wcA/////w8AAAAA/P//P4D//z8AAAAAAAAAAAAAAAAAAAD///////////8BAAAAAAAA////////BwD///////8HAP//////AP8D/////z++//8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////AwMAHAAAAAAAAAD///8fgAD//z8AAAAAAP//AwAAAAAA//8fAAAA//9/AAAAAAAAAAAAAAAAAAAAAAD//////xsDABwAAAAAAADw////H4AA/////wEAAAD//z8AAAAAAP//HwAAAP//fwD4////////AAAAAAAAACYA+P//////AAAAAP///wEAAPj///9/AAAAkAD/////RwD4//////8HAB4AABQAAAAA//////////9/AAAAwP8/gP////////8HBAD///8B/wP////////f//AA/////08A//////////8f3v8XAAAAAP//+///DwCAAQAAAAAAAAB/vf+//wH//////38AAAAA4J/5///97SMAAAHgAwAAAP9L/////78AAAAKAAAAAAD///v/////wAMAAAAAAAAAf73/v/8B/////////wf/A++f+f///e37nzmB4M8fHwD/S/////+//6X3DwAGAAAA////////HwCABwCAAwAAAP///////wAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////9/AAAAAAAPAAAAAP///////////wf/wwMAAAD//////////78A/wMAAAAAAAAAAAAAAAAAAAAAAAAAAP///////z//AQAAPwAAAAD///////8AABAAAAAAAAAA//////8HAAEAAAAAAAAAAP///wcAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8RAP8DAAAAAP////////8B/wP//w8AAAD////n/w//A38AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////DwAAAAAAAAAAAAAAAAAA//////////8AAACAf/Jv////AIACAAAAAAAAAAAAAAD//P////8BAAoAAAD/////////BwAAAAAAAAAAAAAAAP///////////wMAgH/yb////7/5DwD/AwAAAAAAAAAA//z///////wbAAAAAfj/////BwQAAAHw//////8DACAAAP///////////wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AQAAAP////////9/gAD///////////8jAAD///////////8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wEA/wP//f///38AAAEAAAAAAPz///8AAAAAAAAAAAAAAAAAAH/7/////wEAQAAAAL/9////AwABAAAAAAAAAAAAAAAA//3/////f/8BAP8DAAD8/////P///n8AAAAAAAAAAAB/+/////9/tP8A/wO//f///3/7Af8DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wcA9P/9////DwAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//9/AP///f/////HBwD/BwAAAAAAAAAAAAABAAAAAAAAAAAA/////////////////38AAP///////////////////////////////w8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////AQD///////8AAH4AAAD//////////////////////////////////////////////////////////////////////////wcABAAAACcA8AD///////////////////////////////8AAP//PwD//////////////////////////////////////////////////////////////////////////////wP//////////////////////////////////////////38AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////8DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////wH///9/AAD///////////9/AAD///8/AAD///////8AAA8AAAD4///g//8AAAAAAAAAAAAAAAAAAP////////8B////f/8D////////////f/8D////Px8A////////fwAPAP8D+P//4P//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////8fAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////H/8DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAAAAAAAAAAAAAAAAAA////////////BwEAAAAAAAAA+P8AAAAAAAAAAAsAAAAAAAAAAAAAAP//////////AAAAAAAAAAAAAAAAAAAAAP///////////4f/////////gP//AAAAAAAAAAAbAAMA//////////////////////////////////8/AAAAAID/AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA72//////////////////////////////////////////DwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////8///9/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////B/8f/wH/AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4OMH+OcPAAAAPAAAAAAAAAAAAAD/////////////////B/8f/wH/YwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////f+AHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH9v/38AAAAAAAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wP/////////////3///////////32Te/+vv/////////7/n39////97X/z9//////////////////////////////////////////////////////8//////f//9/////f//9/////f//9/////f/////3////9///3DwAAAAAAAP//////////////////////////P/////3///f////3///f////3///f////3/////9/////f//98////////////////9/+P//////HyAAEAAA+P7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////AAAAAAAAAAD/////////PwAAAAAAAAAAAAAAAAAAAAAAAP//////H4A/AEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf///+dsH/////////z8AAACAAAAAAAAAAAAAAAAAAAD//////x//P/9DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///z8AAP//////DwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///9/AAD/////////AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///z8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////8DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////wf///////////////////////////////8fAAAAAAAAAP//////////DwgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////HwB/AAAAAAD///////////8P/wMAAAAAAAAAAAAAAAAAAAAAAAAAAO////+W/vcKhOqWqpb3917/+/8P7vv/DwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////////////////////////AAAAAP///////////////////////////////////////////////////////////////////////////////wEA//////8/////////////////////////////////////////////////////////////////////////////////////////////B////////////////////////////////////////////////////////wMA/////////////////////////////////////////////////////////////////////////////////////wAAAAAAAAAAAAD//////////////z8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgICAwQFBgcICQoLDA0CAgICAgICDgICAgICAgIOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCAgICAgICAgICAgICAgICAgICAgICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQICAgIDAgIEAgUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0CAh4CAgICAgICHyAhIiMCJCUmJygpAioCAgICKywCAgICLS4CAgIvMDEyMwICAgICAjQCAjU2NwI4OTo7PD0+Pzk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlAAgJBQgICQ0RFRkdIAkk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlKAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICOTk5OUsCAgICAkxNTk8CAgJQAlFSAgICAgICAgICAgICAlNUAgJVAlYCAldYWVpbXF1eX2BhYmMCZGVmZwJoAmlqa2xtAm5vcHECcnMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUCAgICAgICAgICAgICAgICAgJ2dwICAngCAgJ5ejk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OXt8fQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ+OTl/OTmAAgICAgICAgICAgICAgICAgICAoECAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAgICg4SFAoYCAgICAgICAgICAgICh4gCAgICAgICAgICiYp3AgKLAgICjAKNAo4CAgKPkAICAgICAgICAgICAgKRkgKTlAKVlpeYmZqbnAKdAgKen6ChAgICAgICAgICAjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OaIdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKMCAgICpKUCBAIFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdAgIeAgICAgICAh8gISIjAiQlJicoKQIqAgICAqanqKmqq6wurTmur7CxsrMCAgICAgK0AgI1NjcCODk6Ozw9PrU5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlLAgICAgK2TU63iYp3AgKLAgICjAKNAo4CAgKPkAICAgICAgICAgICAgKRkri5lAKVlpeYmZqbnAKdAgKen6ChAgICAgICAgICAlVVdVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVVVVVFQBQVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAQAAAAAAAAAAAAAQQRBVVVVVVVdVVVVVVVVVVVVRVVUAAEBU9d1VVVVVVVVVVRUAAAAAAFVVVVX8XVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVBQAUABQEUFVVVVVVVVUVUVVVVVVVVVUAAAAAAABAVVVVVVVVVVVV1VdVVVVVVVVVVVVVVQUAAFRVVVVVVVVVVVVVVVVVFQAAVVVRVVVVVVUFEAAAAQFQVVVVVVVVVVVVVQFVVVVVVf////9/VVVVUBUAAFVVVVVVVVVVVVUFAAAAAAAAAAAAAAAAAEBVVVVVVVVVVVVVVVVVRVQBAFRRAQBVVQVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVRAFUVVFVFVVVBVVVVVVVVUVBVVVVVVVVVVVVVVVVVVVUQRUUUFFVVVVVVVVVUFFVVUFVVVVVVVVVVVVVVVVVVVQBEFRRVVVVVQVVVVVVVQUAUVVVVVVVVVVVVVVVVVVVBAFUVVFVAVVVBVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVFVFVVUVUVVVVVVVVVVVVVVVRUVVVVVVVVVVVVVVVVVQRUBQRQVUFVVQVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVFEQFBFBVQVVVBVVVVVVVVVVQVVVVVVVVVVVVVVVVVRVEAVRVQVUVVVUFVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVVVVUUVBURVFVVVVVVVVVVVVVVVVVVVVVVVVVVVUQBAVVUVAEBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRAABUVVUAQFVVVVVVVVVVVVVVVVVVVVVVVVBVVVVVVVURUVVVVVVVVVVVVVVVVVUBAABAAARVAQAAAQAAAAAAAAAAVFVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQEEAEFBVVVVVVVVUAVUVVVVAVRVVUVBVVFVVVVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAVVVVVVVVVVVVVVVVQVQVVVVVVVVBVRVVVVVVVUFVVVVVVVVVQVVVVV///33//3XX3fW1ddVEABQVUUBAABVV1FVVVVVVVVVVVVVFQBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUFVVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAVVFVFVQFVVVVVVVVVVVVVVVVVVVVVVVVVVVVXFRRVVVVVVVVVVVVVVVVVVUUAQEQBAFQVAAAUVVVVVVVVVVVVVVVVAAAAAAAAAAAAAABQAAAAVVVVVVUAVVVVVVVVVVVVVVVVAABQBVRVVVVVVVVVVRUAAFVVVVBVVVVVVVVVBVAAUFVVVVVVVVVVVVVVVVVFUBEAVVVVVVVVVVVVVVVVVVUAAAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAAAAAEAFRRVVRQVVVVVVVVVVVVVVVVVVVVVVUAAAAAAAAAAAAAAAAAAAAAVVUVAFVVVVVVVQVAVVVVVVVVVVVVVVVVAAAAAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQAAAAAAAAAAVFVVVVVVVVVVVfVVVVVpVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX9V9dVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVfVVVVVVVX1VVVVVVVaqqVVVVVf///1VVVVVVVVVVVVXVVVWlqtVVVVVdVfVVVVVVfVVfVXVVV1VVVVV1VfVddV1VXfVVVVVVVVVVV1VVVVVVVVVVd9XfVVVVVVVVVVVVVVVVVVVV/VVVVVVVVVdVVdVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV1VdVVVVVVVVVVVVVVVVXXVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVUFVVVVVVVVVVVVVVVVVVVf3///////////////9fVdVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAAAAAAAAAACqqqqqqqqaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqlVVVaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqWlVVVVVVVaqqqqqqqqqqqqqqqqqqCgCqqqpqqaqqqqqqqqqqqqqqqqqqqqqqqqqqaoGqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqVamqqqqqqqqqqqqqqaqqqqqqqqqqqqqqqqiqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqWlWVqqqqqqqqqqqqqqpqqqqqqqqqqqqqqlVVqqqqqqqqqqqqqqqqqqqqVqqqqqqqqqqqqqqqqqpqVVVVVVVVVVVVVVVVVV9VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVQAAAUFVVVVVVVVUFVVVVVVVVVVVVVVVVVVVVVVVVVVVQVVVVRUUVVVVVVVVVQVVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVBVVVVVVVUAAAAAUFVFFVVVVVVVVVVVVQUAUFVVVVVVFQAAEFVVVaqqqqqqqqpWQFVVVVVVVVVVVVVVFQVQUFRVVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVVVAUBBQVVVFVVVVFVVVVVVVVVVVVVVVFVVVVVVVVVVVVVVVQQUVAVRVVVVVVVVVVVVVVBVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFUUVVVVVWqqqqqqqqqqqpVVVUAAAAAAEAVAAAAAAAAAAAAAAAAVVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVDAAA8KqqWlUAAAAAqqqqqqqqqqpqqqqqqmqqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFamqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqlZVVVVVVVVVVVVVVVVVVQVUVVVVVVVVVVVVVVVVVVVVqmpVVQAAVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUFQFUBQVUAVVVVVVVVVVVVVUAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVBVVVVVVVV1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAVVVVVVVVVVVVVVVVVVVVVQFQVVVVVVVVVVVVVVVVVVUVVFVVVVVVVVVVVVVVVVVVVVVVVQUAVVVVVVVVVVVVVVVVVVVVVVUFAABUVVVVVVVVVVVVVVUFUFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVVVVVVVVVVVVVVVVVAAAAQFVVVVVVVVVVVVUUVFUVUFVVVVVVVVVVVVVVFUBBVUVVVVVVVVVVVVVVVVVVVVVAVVVVVVVVVVUVAAEAVFVVVVVVVVVVVVVVVVVVFVVVVVBVVVVVVVVVVVVVVVUFAEAEVQEUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVUABVRVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRUVAEBVVVVVVVBVVVVVVVVVVVVVVVVVFURUVVVRVRVVVVUFAFQAVFVVVVVVVVVVVVVVVVVVVVUUAEQRUAVAVVVVQVVVVVVVVVVVVVVVVVVVVVVVVVVVVQAABURVVVVVVUVVVVVVVVVVVVVVVVVVVVVVVVVVVRQARBEEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVBVBVEFRVVVVVVVVQVVVVVVVVVVVVVVVVVVVVVVVVVVUVAEARVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVUQAAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVREFEABVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRUAAEFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVFQARVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAAVVVFVVVVVVVVUBAEBVVVVVVVVVVVUVABRAVRVVVQFAAVVVVVVVVVVVVVUAAAAAQFBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVBERVVVVVVVVVVVVVVVVVVVVVVVUAQAAQVVVVVVVVVVVVVVVVVVVVVVVVVVUFAAAAAAAFAARBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAUBFEAAAVVVVVVVVVVVVVVVVVVVVVVVVUBFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVVFVVQFVVVVVVVVVVVVVVVQVAVUBVVVVVVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVBUAAABQVVVVVVVVVVVVVVVVVVVVVVUFAABQAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQBUVVVVVVVVVVVVVVVVVVUAQFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVXVV1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVVUVQFVVVVVVVVVVVVVVVVVVVVVVVVWqVFVVoGpVVaqqqqqqqqqqqqqqqqqqqqqqqqqqqlpVVVVVVVVVVVWVqqqqqqqqqmpVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVWqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqalVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVWqqappqqqqqqqqqqpqVVVVZVVVVVVVVVVqWVVVVapVVaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqVVVVVVVVVVVBAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAAAAAAAAAAAAAABQAAAAAABAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAVABAAAAAEABAFVVVVVVVVUFUFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQVUVVVVVVVVVVVVVVVVVVWqqqqqqqqqqqqqqqqqqqqqqqqqqqpqVVWqqqqqqmpVVQAAAAAAAAAAAAAAAABAFQAAAAAAAAAAAAAAAFRVUVVVVVRVVVVVFQABAAAAVVVVVVVVVVVVVVVVVVVVVVVVVVUAQAAAAAAUABAEQFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVVAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFUVVBVVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQBAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAEBVVVVVVVVVVVVVVVVVVVdVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV1VVVVVVVVVVVVVVVVVVVVXX9/39VVVVVVVVVVVVVVVVVVVVVVVX1////////blVVVaqquqqqqqrq+r+/VaqqVlVfVVVVqlpVVVVVVVX//////////1dVVf3/3///////////////////////9///////VVVV/////////////3/V/1VVVf////9XV///////////////////////f/f/////////////////////////////////////////////////////////////1////////////////////19VVdV/////////VVVVVXVVVVVVVVV9VVVVV1VVVVVVVVVVVVVVVVVVVVVVVVVV1f///////////////////////////1VVVVVVVVVVVVVVVf//////////////////////X1VXf/1X/1VV1VdV//9XVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV////VVdVVVVVVVX//////////////3///9//////////////////////////////////////////////////////////////VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf///1f//3/1/////////////////39X/f///9f//3/V//9XVaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpaVVVVVVVVVVVZllVhqqVZqlVVVVVVlVVVVVVVVVWVVVUAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAVVVVVVWVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVAJZqWlpqqgVAplmVZVVVVVVVVVVVAAAAAFVWVVWpVlVVVVVVVVVVVVZVVVVVVVVVVQAAAAAAAAAAVFVVVZVZWVVVZVVVaVVVVVVVVVVVVVVVqqqqaqqqqlWqqlpVVVVZVaqqqlVVVVVlVVVaVVVVVaVlVlVVVZVVVVVVVVWmlpqWWVllqZaqqmZVqlVaWVVaVmVVVVVqqqWlWlVVVaWqWlVVWVlVVVlVVVVVVZVVVVVVVVVVVVVVVVVVVVVVVVVVVWVV9VVVVWlVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVWqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpVqqqqqqqqqqqqVlVVqqqqqqVaVVWaqlpVpaVVWlqllqVaVVVVpVpVlVVVVX1VaVmlVa9VZlVVVVWqqlVVZlX///9VVVWammqaVVVV1VVVparVVVWlXVX1VVVVVb1Vr6q6qquqqppVuqr6rrquVV31VVVVVVVVVVdVVVVVWVVVVXfV31VVVVVVVVWlqqqqqqqqqv1VVVVVVVVXVVXVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVdVXVVVVVVVVVVVVVVVVV61aVVVVVVVVVVVVqqqqqqqqqmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqozAADAqqpaVQAAAACqqqqqqqqqqmqqqqqqaqpVVVVVVVVVVVVVVVUFVFVVVVVVVVVVVVVVVVVVVapqVVUAAFRZqqqqVqqqqqqqqqpaqqqqqqqqqqqqqqqqqqpaVaqqqqqqqqq6/v+/qqqqqlZVVVVVVVVVVVVVVVVV9f///////y4GAAAMAAAABAAAABoFAAAvBgAAnAMAADAxMjM0NTY3ODlhYmNkZWYvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi91dWlkLTEuMTYuMC9zcmMvZm10LnJzAOg+JwBbAAAAuwAAAA0AAADoPicAWwAAALMAAAAVAAAA6D4nAFsAAAC2AAAADQAAAOg+JwBbAAAAtwAAAA0AAAAAAAAA//////////+IPycAAAAAAAAAAAAAAAAAL3J1c3RjLzJlNjg4MmFjNWJlMjdhNzMyOTNkNmY3YWU1NjM5N2ZkZjMyODQ4ZGUvbGlicmFyeS9zdGQvc3JjL3RocmVhZC9sb2NhbC5ycwCgPycATwAAABkBAAAZAAAAVHJpZWQgdG8gc2hyaW5rIHRvIGEgbGFyZ2VyIGNhcGFjaXR5AEAnACQAAAC0QycAUAAAALkCAAAJAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvd2FzbS1iaW5kZ2VuLTAuMi4xMDAvc3JjL2NvbnZlcnQvc2xpY2VzLnJzSnNWYWx1ZSgpq0AnAAgAAACzQCcAAQAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3dhc20tYmluZGdlbi0wLjIuMTAwL3NyYy9jYWNoZS9pbnRlcm4ucnMAAADEQCcAbQAAABoAAAArAAAAY2xvc3VyZSBpbnZva2VkIHJlY3Vyc2l2ZWx5IG9yIGFmdGVyIGJlaW5nIGRyb3BwZWQAADEGAAAEAAAABAAAADIGAAAzBgAATGF6eSBpbnN0YW5jZSBoYXMgcHJldmlvdXNseSBiZWVuIHBvaXNvbmVkAACMQScAKgAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL29uY2VfY2VsbC0xLjIxLjMvc3JjL2xpYi5yc8BBJwBgAAAACAMAABkAAAByZWVudHJhbnQgaW5pdAAAMEInAA4AAADAQScAYAAAAHoCAAANAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvd2FzbS1iaW5kZ2VuLWZ1dHVyZXMtMC40LjUwL3NyYy9xdWV1ZS5ycwAAAFhCJwBtAAAAJQAAAC4AAABYQicAbQAAACgAAAApAAAAWEInAG0AAAA+AAAAGgAAAFhCJwBtAAAAPgAAACcAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi93YXNtLWJpbmRnZW4tZnV0dXJlcy0wLjQuNTAvc3JjL3Rhc2svc2luZ2xldGhyZWFkLnJzAAAACEMnAHkAAAAiAAAAFQAAADUGAAA2BgAANwYAADgGAAAIQycAeQAAAGcAAAAlAAAAL3J1c3RjLzJlNjg4MmFjNWJlMjdhNzMyOTNkNmY3YWU1NjM5N2ZkZjMyODQ4ZGUvbGlicmFyeS9hbGxvYy9zcmMvcmF3X3ZlYy9tb2QucnO0QycAUAAAAC4CAAARAAAACAAAAA0AAAAPAAAAT/cgAFf3IABk9yAAAAAAgAAAAAAAAAAABgAAAAYAAAAIAAAABwAAAOCBIAAgvCYA5oEgAO6BIACEgSAAkoEgAKCBIAC2gSAADgAAAA4AAAAWAAAAFgAAAJjKIACayiAAnMogAJ7KIACgyiAAosogAKTKIACmyiAAqMogAKrKIACsyiAArsogALDKIACyyiAAtMogALbKIAC4yiAAdNIgAITSIACU0iAApNIgAKTSIAC00iAAxNIgANTSIADk0iAA9NIgAATTIAAU0yAAJNMgADTTIABE0yAAVNMgAGTTIAB00yAAhNMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADkyiAA9MogAATLIAAUyyAAJMsgADTLIABEyyAAVMsgAGTLIAB0yyAAhMsgAJTLIACkyyAAtMsgAMTLIADUyyAA5MsgAPTLIAAEzCAAFMwgACTMIAA0zCAARMwgAFTMIABUzCAAZMwgAHTMIACEzCAAlMwgAKTMIAC0zCAAxMwgANTMIADkzCAA9MwgAATNIAAEzSAAFM0gACTNIAA0zSAARM0gAFTNIABUzSAAZM0gAHTNIACEzSAAlM0gAKTNIAC0zSAAxM0gANTNIADkzSAA9M0gAPTNIAAEziAAFM4gACTOIAA0ziAARM4gAFTOIABkziAAdM4gAITOIACUziAApM4gALTOIADEziAA1M4gAOTOIAD0ziAABM8gAATPIAAUzyAAJM8gADTPIABEzyAAVM8gAGTPIABkzyAAdM8gAITPIACUzyAApM8gALTPIACkzSAAxM8gANTPIADkzyAA9M8gAATQIAAU0CAAJNAgADTQIABE0CAAVNAgAGTQIAB00CAAhNAgAJTQIACk0CAAtNAgAMTQIADU0CAA5NAgAPTQIAAE0SAAFNEgACTRIAA00SAARNEgAFTRIABk0SAAdNEgAITRIACU0SAApNEgALTRIADE0SAA1NEgAOTRIAD00SAABNIgABTSIAAk0iAANNIgAETSIABU0iAAZNIgAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAADW3yAA3t8gAObfIADu3yAA9t8gAP7fIAAG4CAADuAgABbgIAAe4CAAJuAgAC7gIAA24CAAPuAgAEbgIABO4CAAVuAgAF7gIABm4CAAbuAgAHbgIAB+4CAAhuAgAI7gIACW4CAAnuAgAKbgIACu4CAAtuAgAL7gIADG4CAAzuAgANbgIADe4CAA5uAgAO7gIAD24CAA/uAgAAbhIAAO4SAAFuEgAB7hIAAm4SAALuEgADbhIAA+4SAARuEgAE7hIABW4SAAXuEgAGbhIABu4SAAduEgAH7hIACG4SAAjuEgAJbhIACe4SAApuEgAK7hIAC24SAAvuEgAMbhIADO4SAA1uEgAN7hIADm4SAA7uEgAPbhIAD+4SAABuIgAA7iIAAW4iAAHuIgACbiIAAu4iAANuIgAD7iIABG4iAATuIgAFbiIABe4iAAZuIgAG7iIAB24iAAfuIgAIbiIACO4iAAluIgAJ7iIACm4iAAruIgALbiIAC+4iAAxuIgAM7iIADW4iAA3uIgAObiIADu4iAA9uIgAP7iIAAG4yAADuMgABbjIAAe4yAAJuMgAC7jIAA24yAAPuMgAEbjIABO4yAAVuMgAF7jIABm4yAAbuMgAHbjIAB+4yAAhuMgAI7jIACW4yAAnuMgAKbjIACu4yAAtuMgAL7jIADG4yAAzuMgAETcIABK3CAAUNwgAFbcIABc3CAAYtwgAGjcIABu3CAAdNwgAHrcIACA3CAAh9wgAI7cIACV3CAAnNwgAKPcIACq3CAAsdwgALjcIAC/3CAAxtwgAM3cIADU3CAA29wgAOLcIADp3CAA8NwgAPfcIAD+3CAABd0gAAzdIAAT3SAAGt0gACHdIAAo3SAAL90gADbdIAA93SAARN0gAEvdIABS3SAAWd0gAGDdIABn3SAAbt0gAHXdIAB83SAAg90gAIrdIACR3SAAmN0gAJ/dIACm3SAArd0gALTdIAC73SAAwt0gAMndIADQ3SAA190gAN7dIADl3SAA7N0gAPPdIAD63SAAAd4gAAjeIAAP3iAAFt4gAB3eIAAk3iAAK94gADLeIAA53iAAQN4gAEfeIABO3iAAVd4gAFzeIABj3iAAat4gAHHeIAB43iAAf94gAIbeIACN3iAAlN4gAJveIACi3iAAqd4gALDeIAC33iAAvt4gAMXeIADM3iAA094gANreIADh3iAA6N4gAO/eIAD23iAA/t4gAAbfIAAO3yAAFt8gAB7fIAAm3yAALt8gADbfIAA+3yAARt8gAE7fIABW3yAAXt8gAGbfIABu3yAAdt8gAH7fIACG3yAAjt8gAJbfIACe3yAApt8gAK7fIAC23yAAvt8gAMbfIADO3yAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAC6yiAAvMogAL7KIADAyiAAwsogAMTKIADGyiAAyMogAMrKIADMyiAAz8ogANLKIADVyiAA2MogANvKIADeyiAA4cogACTbIAA02yAARNsgAFTbIABU2yAAZNsgAHTbIACE2yAAlNsgAKTbIAC02yAAxNsgANTbIADk2yAA9NsgAATcIAAU3CAAJNwgADTcIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlNMgAKTTIAC00yAAxNMgANTTIADk0yAA9NMgAATUIAAU1CAAJNQgADTUIABE1CAAVNQgAGTUIAB01CAAhNQgAJTUIACk1CAAtNQgAMTUIADU1CAA5NQgAPTUIAAE1SAABNUgABTVIAAk1SAANNUgAETVIABU1SAAZNUgAHTVIACE1SAAlNUgAKTVIAC01SAAtNUgAMTVIADU1SAA5NUgAPTVIAAE1iAABNYgABTWIAAk1iAANNYgAETWIABU1iAAZNYgAHTWIACE1iAAlNYgAKTWIACk1iAAtNYgAMTWIADU1iAA5NYgAPTWIAAE1yAAFNcgACTXIAA01yAARNcgAFTXIABk1yAAdNcgAITXIACU1yAApNcgALTXIAC01yAAxNcgANTXIADk1yAA9NcgAATYIAAU2CAAFNggACTYIAA02CAARNggAFTYIABk2CAAVNYgAHTYIACE2CAAlNggAKTYIAC02CAAxNggANTYIADk2CAA9NggAATZIAAU2SAAJNkgADTZIABE2SAAVNkgAGTZIAB02SAAhNkgAJTZIACk2SAAtNkgAMTZIADU2SAA5NkgAPTZIAAE2iAAFNogACTaIAA02iAARNogAFTaIABk2iAAdNogAITaIACU2iAApNogALTaIADE2iAA1NogAOTaIAD02iAABNsgABTbIAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAAaOcgAHDnIAB45yAAgOcgAIjnIACQ5yAAmOcgAKDnIACo5yAAsOcgALjnIADA5yAAyOcgANDnIADY5yAA4OcgAOjnIADw5yAA+OcgAADoIAAI6CAAEOggABjoIAAg6CAAKOggADDoIAA46CAAQOggAEjoIABQ6CAAWOggAGDoIABo6CAAcOggAHjoIACA6CAAiOggAJDoIACY6CAAoOggAKjoIACw6CAAuOggAMDoIADI6CAA0OggANjoIADg6CAA6OggAPDoIAD4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jyYA1Y8mAOSPJgDzjyYAA5AmABKQJgAhkCYAMJAmAD2QJgBPkCYAXJAmAGqQJgAGAAAACgAAAAkAAAAJAAAAAgAAAAUAAAAJAAAABQAAAAYAAAAGAAAAAgAAAAMAAAAIAAAABwAAAAcAAAAJAAAABgAAAAgAAAAHAAAAAwAAAAYAAAAGAAAABgAAAAQAAAAJAAAABgAAAAcAAAAFAAAACAAAAAUAAAAJAAAABAAAAAYAAAACAAAADgAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAIAAAADAAAAAgAAAAIAAAACAAAAAgAAAAEAAAACAAAAAgAAAAMAAAADAAAABAAAAAIAAAACAAAAAgAAAAMAAAADAAAAAwAAAAMAAAACAAAAAgAAAAIAAAADAAAAAwAAAAIAAAACAAAAAgAAAAIAAAADAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAADQAAAAsAAAAOAAAADwAAAA4AAAAOAAAADgAAACAAAAANAAAADwAAAA0AAAAIAAAACAAAAAUAAAAFAAAABQAAAAQAAAAFAAAABQAAAAUAAAAIAAAACAAAAAcAAAAGAAAAAgAAAAQAAAAGAAAABwAAAAUAAAAHAAAAAwAAAAgAAAACAAAABgAAAAIAAAAKAAAAAwAAAAMAAAAEAAAABgAAAAUAAAAGAAAABAAAAAUAAAAEAAAAAwAAAAYAAAADAAAABAAAAAUAAAAEAAAABQAAAAYAAAAIAAAAAwAAAAIAAAAHAAAABgAAAAUAAAAGAAAABwAAAAsAAAAHAAAABAAAAAQAAAADAAAARdMmAEHpJgCg0iYAG9UmACzmJgAR5iYAr9ImABbVJgDt1CYA89QmAO7oJgCW0yYAjtMmACZaJgBb0yYAUtMmAEzTJgBi0yYALuYmAPPZJgDH2SYA49QmABDVJgC40iYACOYmABbmJgD81CYAxeEmAEvpJgDS5SYAHOYmANDgJgDU4CYAtPEmAK9bJgAdViYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB44CYAs0AnADvZJgDI5SYA0OUmANHlJgCnzSYA3uUmAN/lJgDF5SYA4OUmALrNJgC7zSYAuc0mALjNJgAKziYAC84mAAzOJgD9zSYAAM4mAA3OJgAOziYAD84mAMzNJgC28SYAC/ImADrfJgDG5SYAyeUmACTOJgAmziYAzc0mAM/NJgAKziYA080mANXNJgDXzSYA2s0mAN3NJgDhzSYA480mAOXNJgDnzSYA7c0mAOrNJgDwzSYACfImAPPNJgD1zSYA980mAPrNJgD+zSYAAc4mAAPOJgAFziYAB84mACDOJgAQziYAEs4mACLOJgDw5yYA9OUmAOdaJgD0WiYA/1omAA1bJgAcWyYAKlsmADhbJgBGWyYAZlsmAHNbJgCCWyYAj1smAJdbJgBSgSYAKOMmAOnoJgAA6SYAKukmAIzoJgCvzSYAMekmADnpJgBc5yYAxs0mAC/pJgDY6CYAvOUmANflJgBE6CYA4ugmANzoJgCR6CYA1ugmAPzeJgAUziYAn1smAKzNJgDC5SYA6dQmAProJgB08CYAJOkmAMzlJgDw6CYASegmAN/oJgCpWyYAqc0mAMLNJgD16CYANeYmAC3jJgCp0iYAlNImAPnUJgDc2CYAJeYmAKnmJgD22SYACtUmAAPVJgC82SYAPtMmAJzSJgCl5iYA8NkmAIE0JgAAAAAAAAAAAIk0JgCRNCYAAAAAAAAAAACaNCYACAAAAAAAAAAAAAAACAAAAAkAAAAAAAAAAAAAAA0AAAAGBgYGBwcHBwgICAkJCgoKAwQFAQIHBwsBBgYGBgcHBwcICAgJCQoKCgMEBQECBwcLAQYGBgYHBwcHCAgICQkKCgoDBAUBAgcHCwEGBgYGBwcHBwgICAkJCgoKAwQFAQIHBwsBCgAAAAYAAAAFAAAA94wmAAGNJgAHjSYABgAAAAkAAAAHAAAAr34mAAyOJgCofiYAwX8mALV/JgC7fyYABAAAAAQAAAAFAAAAFY4mABmOJgAdjiYADAAAABAAAAAPAAAADwAAABAAAAAPAAAADwAAAA8AAAANAAAAEgAAAA0AAAAOAAAAEgAAALmPJgDFjyYA1Y8mAOSPJgDzjyYAA5AmABKQJgAhkCYAMJAmAD2QJgBPkCYAXJAmAGqQJgAGBgYGBwcHBwgICAkJCgoKAwQFAQIHBwsBAAAA3P////j////Y////+P///9D////Q////4P////z////c/////P///9T////U////KAAAABAAAABAAAAALAAAABQAAABEAAAAEAAAABAAAAAEAAAACAAAACgAAAAUAAAAFAAAABQAAAAUAAAACAAAAAwAAAAsAAAAGAAAABgAAAAgAAAAGAAAABgAAAAYAAAAAQAAAAIAAAACAAAAAgAAAAIAAAACAAAAAwAAAAMAAAAEAAAAAgAAAAIAAAACAAAAAwAAAAMAAAADAAAAAwAAAMzNJgDNzSYAz80mANHNJgDTzSYA1c0mANfNJgDazSYA3c0mAOHNJgDjzSYA5c0mAOfNJgDqzSYA7c0mAPDNJgAQAAAABAAAAAQAAAAIAAAACAAAABgAAAAYAAAAPAAAACwAAAAcAAAALAAAABwAAAAYAAAACAAAACAAAAAsAAAAAwAAAAMAAAAFAAAAqc0mAKzNJgCvzSYAAgAAAAIAAAADAAAAAwAAAAEAAAACAAAAAQAAAAIAAAACAAAAAgAAAAMAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAIAAAACAAAAAgAAAAoAAAACAAAAAgAAAPPNJgD1zSYA980mAPrNJgD9zSYA/s0mAADOJgABziYAA84mAAXOJgAHziYAuc0mALjNJgAKziYAC84mAAzOJgANziYADs4mAA/OJgAQziYAEs4mABTOJgAWziYAIM4mACLOJgABAAAAAQAAAAEAAAABAAAABgAAAAQAAAAGAAAAuM0mALnNJgC6zSYAu80mALzNJgDCzSYAxs0mAA0AAAARAAAABwAAAHzzJgA79SYAQ/gmAAAAAAAAAPA/AAAAAAAA+D8AAAAAAAAAAAbQz0Pr/Uw+AAAAAAAAAAAAAABAA7jiPwBB+OidAQuoCAAAAAAAAAAAOAQAAAIAAAAAAAAAOQQAAAIAAAAAAAAAOgQAAAIAAAAAAAAAOwQAAAIAAAAAAAAAPAQAAAMAAAAAAAAAAQAAgAAAAAAAAAAAIwUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJwUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8FAAAAAAAAAAAAAAAAAAAAAAAAMAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMQUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMgUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMwUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQFAAAAAAAAAAAAAAAAAAAAAAAANQUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADsFAAAAAAAAAAAAAAAAAAAAAAAAAAAAACcFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKwFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKwFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKwFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK0FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK0FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK0FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK4FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK0FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK4FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK0FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK4FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK0FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK0FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK8FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK8FAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUFAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUFAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUFAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUFAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUFAAAAAAAAAAAAAAAAAAAAAAAAAAAAANAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAANEFAAAAAAAAAAAAAAAAAAAAAAAAAAAAANIFAAAAAAAAAAAAAAAAAAAAAAAAAAAAANMFAAAAAAAAAAAAAAAAAAAAAAAA1gUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAA0BgAAAEoEbmFtZQFDAjweX193YmluZGdlbl9jbG9zdXJlX3dyYXBwZXI1MzQwkSMfX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcgA8CXByb2R1Y2VycwEMcHJvY2Vzc2VkLWJ5AgZ3YWxydXMGMC4yMy4zDHdhc20tYmluZGdlbgcwLjIuMTAw", "base64"); + var bytes = Buffer2.from("AGFzbQEAAAAB5wRNYAAAYAABf2AAAX5gAX8AYAF/AX9gAX8BfmABfwF8YAJ/fwBgAn9/AX9gAn9/AX5gAn9/AXxgA39/fwBgA39/fwF/YAN/f38BfmAEf39/fwBgBH9/f38Bf2AEf39/fwF+YAV/f39/fwBgBX9/f39/AX9gBn9/f39/fwBgBn9/f39/fwF/YAd/f39/f39/AGAHf39/f39/fwF/YAh/f39/f39/fwBgCH9/f39/f39/AX9gC39/f39/f39/f39/AX9gDX9/f39/f39/f39/f38AYA5/f39/f39/f39/f39/fwF/YA9/f39/f39/f39/f39/f38Bf2ATf39/f39/f39/f39/f39/f39/fwF/YBd/f39/f39/f39/f39/f39/f39/f39/fwF/YAl/f39/f39+fn4AYAV/f39/fgBgBn9/f39+fwBgBH9/f34AYAZ/f39+f38AYAN/f34Bf2AEf39+fwBgBH9/fn8Bf2AFf39+f38AYAZ/f35/fn8AYAV/f31/fwBgBX9/fH9/AGACf34AYAJ/fgF/YAN/fn8AYAN/fn8Bf2AEf35/fwBgBH9+f34BfmADf35+AGADf35+AX9gBH9+fn8AYAV/fn5+fwBgBX9+fn5+AGAEf31/fwBgAn98AGADf3x/AX9gBH98f38AYAR/fH9/AX9gAX4AYAF+AX9gAX4BfmACfn8AYAJ+fwF+YAN+f38Bf2ACfn4AYAJ+fgF+YAN+fn8AYAR+fn9/AX5gBH5+fn8BfmAHfn5+f39/fwF+YAF8AX9gAXwBfGACfH8Bf2ACfH8BfGACfHwBfGADfHx8AXwCyxo9GF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxVfX3diaW5kZ2VuX251bWJlcl9uZXcARxhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18aX193YmluZGdlbl9iaWdpbnRfZnJvbV91NjQAPBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18VX193YmluZGdlbl9zdHJpbmdfbmV3AAgYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fF19fd2JpbmRnZW5faXNfdW5kZWZpbmVkAAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fDV9fd2JpbmRnZW5faW4ACBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18WX193YmluZGdlbl9ib29sZWFuX2dldAAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxVfX3diaW5kZ2VuX3N0cmluZ19nZXQABxhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18UX193YmluZGdlbl9pc19vYmplY3QABBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18TX193YmluZGdlbl9qc3ZhbF9lcQAIGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diaW5kZ2VuX29iamVjdF9kcm9wX3JlZgADGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxRfX3diaW5kZ2VuX2Vycm9yX25ldwAIGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxRfX3diaW5kZ2VuX2lzX2JpZ2ludAAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxVfX3diaW5kZ2VuX251bWJlcl9nZXQABxhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18kX193YmdfaXNTYWZlSW50ZWdlcl8zNDNlMmJlZWVlY2UxYmIwAAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fGl9fd2JpbmRnZW5fYmlnaW50X2Zyb21faTY0ADwYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fHV9fd2JnX2xlbmd0aF9lMmQyYTQ5MTMyYzFiMjU2AAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fH19fd2JnX2l0ZXJhdG9yXzlhMjRjODhkZjg2MGRjNjUAARhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18lX193YmdfaW5zdGFuY2VvZl9NYXBfZjM0NjljZTIyNDRkMjQzMAAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19zZXRfM2YxZDBiOTg0ZWQyNzJlZAALGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19uZXdfMjNhMjY2NWZhYzgzYzYxMQAIGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxNfX3diaW5kZ2VuX2lzX2ZhbHN5AAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fJF9fd2JnX2dldHdpdGhyZWZrZXlfMWRjMzYxYmQxMDA1M2JmZQAIGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxRfX3diaW5kZ2VuX2lzX3N0cmluZwAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19nZXRfYjliOTMwNDdmZTNjZjQ1YgAIGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXx9fX3diZ190b1N0cmluZ181Mjg1NTk3OTYwNjc2YjdiAAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fGl9fd2JnX25ld180MDVlMjJmMzkwNTc2Y2UyAAEYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fGl9fd2JnX25ld183OGZlYjEwOGI2NDcyNzEzAAEYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fGl9fd2JnX3NldF8zNzgzNzAyM2YzZDc0MGU4AAsYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fG19fd2JpbmRnZW5fb2JqZWN0X2Nsb25lX3JlZgAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxZfX3diaW5kZ2VuX2lzX2Z1bmN0aW9uAAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fG19fd2JnX25leHRfNjU3NGUxYThhNjJkMTA1NQAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxtfX3diZ19kb25lXzc2OWU1ZWRlNGIzMWM2N2IABBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18cX193YmdfdmFsdWVfY2QxZmZhN2IxYWI3OTRmMQAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19nZXRfNjdiMmJhNjJmYzMwZGUxMgAIGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxtfX3diZ19uZXh0XzI1ZmVhZGZjMDkxM2ZlYTkABBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18bX193YmdfY2FsbF82NzJhNGQyMTYzNGQ0YTI0AAgYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fIF9fd2JnX25ld25vYXJnc18xMDVlZDQ3MTQ3NWFhZjUwAAgYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fLV9fd2JnX3N0YXRpY19hY2Nlc3Nvcl9HTE9CQUxfODhhOTAyZDEzYTU1N2QwNwABGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXzJfX3diZ19zdGF0aWNfYWNjZXNzb3JfR0xPQkFMX1RISVNfNTY1NzhiZTdlOWY4MzJiMAABGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXy1fX3diZ19zdGF0aWNfYWNjZXNzb3JfV0lORE9XXzVkZTM3MDQzYTkxYTljNDAAARhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18rX193Ymdfc3RhdGljX2FjY2Vzc29yX1NFTEZfMzdjNWQ0MThlNGJmNTgxOQABGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXx5fX3diZ19pc0FycmF5X2ExZWFiN2UwZDA2NzM5MWIABBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18bX193YmdfY2FsbF83Y2NjZGQ2OWUwNzkxYWUyAAwYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fHV9fd2JnX2xlbmd0aF9hNDQ2MTkzZGMyMmMxMmY4AAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fEV9fd2JpbmRnZW5fbWVtb3J5AAEYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fHV9fd2JnX2J1ZmZlcl82MDljYzNlZWU1MWVkMTU4AAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fGl9fd2JnX25ld19hMTIwMDJhN2Y5MWM3NWJlAAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fGl9fd2JnX3NldF82NTU5NWJkZDg2OGIzMDA5AAsYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fLF9fd2JnX2luc3RhbmNlb2ZfVWludDhBcnJheV8xNzE1NmJjZjExODA4NmE5AAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fGV9fd2JpbmRnZW5fanN2YWxfbG9vc2VfZXEACBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18tX193YmdfaW5zdGFuY2VvZl9BcnJheUJ1ZmZlcl9lMTQ1ODU0MzJlMzczN2ZjAAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fHl9fd2JnX2VudHJpZXNfMzI2NWQ0MTU4YjMzZTVkYwAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxBfX3diaW5kZ2VuX3Rocm93AAcYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fHF9fd2JpbmRnZW5fYmlnaW50X2dldF9hc19pNjQABxhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18XX193YmluZGdlbl9kZWJ1Z19zdHJpbmcABxhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18SX193YmluZGdlbl9jYl9kcm9wAAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fG19fd2JnX3RoZW5fNDRiNzM5NDZkMmZiM2U3ZAAIGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXyVfX3diZ19xdWV1ZU1pY3JvdGFza185N2Q5MmI0ZmNjOGE2MWM1AAMYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fJV9fd2JnX3F1ZXVlTWljcm90YXNrX2QzMjE5ZGVmODI1NTI0ODUABBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18eX193YmdfcmVzb2x2ZV80ODUxNzg1YzljNWY1NzNkAAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fHl9fd2JpbmRnZW5fY2xvc3VyZV93cmFwcGVyNTAyOQAMA5kilyIOBxELCxEHBwsHBwsHBwsLDgsLBw4HBwcHCwsHEw4LDhEOBwsHBy8HDhEHBwcIBwcHDgc6DgcLBwsIBwcPFQcLBwsTBxMLDhMEBwsHEQcLBw4LCwMOCwcHBwcHExMHBwcICwgTBwcHCxMEBwcIAwcHEQcVBwsHBw4DCwMTExMTEwcOBwcDDg4HBwcHEwMMBwcHBwcRBxEHDgcHBwsDBwcDCAsHDksLExEHBw4BBw4IBwcLAwsHDgsHBwhJEQMRBwcLBwMHBwgHEwQaEQcHDgsHCxEHDAwOBwgOEQgIDgwOCwsIDAcICAgIEwcHCAgHAxERBw4OBwcIAQcHAwcVAwcIDAsOBwcHBwsOAwcHBxERCwcICwcHEQcLBwcEBwMLDggHBxMOCwsDERELDAdMEwsIAwsEBwcECAcLBwcHCwcHBAcEBwcHAQcVBwsLDggLBwQODAcDBwcHBwsDBwcLBwMRBwcODAcLCAsHEQcOCxsHCAcHBwMHBwsLAwQLAwMEBwcHBwcLAwsDAwcDAwgIBw0HBwQHBw8VAw4OCAMWBw8LBw4HBwMHBwMHBwcLCwsHDwsHEwcLCA4PCwwHAwcHFQsHDwcEDgMHBwcHBwQLByEMEwcIBwcHBxMDFQgVCwcLOAsIEQcHCAgDBwsMDg4LBwcLBwcMCAcHBwcHCwwIBwwHDA4HDhgLBw4OCwsHCAcHBwgDERELCwoLAwgHDw8HCwMLBwcLDAgHEwMLBwcMCwcHDgQ6BwMDDgsDAwcHBw4HBw4DBwMIDgcODAcDCAMICAwDBwMODgwLCwsDBwsIBwwoFQcIKAcXDgcLCAMLBwcMBwcHBxUHBwMDAwwIAwcHBwcDCA4HBwcLDAcLERMFCxQIBwcMBAcHCwsHEwgMEQ4DBwcLCwcTBw4IAwcHLi0IDCsHDAsRBwcICwcOBwcLDg4LEwcOExMHCAcOBxEHBwcHAwQDEQcLCwcTBwMHEwcLAwsDFQcHCwgLCw4VFQcLExMLCwcIEwgHBwcLCwtERAcMFQsLEggHB0QHBwcHAwcHERMVCBMHBxUTBwcDBAtLDAcLBAgHDhMICAcDCA4TMQwDBwgHCwcHERMLBwgHBwcLBwgOBwwHCwcLBwcABwcHBwcHBwc+BA4LAwsfBwcHBwgHBwcHCAsOBwsLCwMHBxEODgcLDgcHEwgHERNACwsHBwcOAwgHCw4ICAcHBwsMDg4ODgcLBw4DCwcHAwcLCwMDBwQiCw4LDhMHBwgHBBYEBwQIBw4ICAcIFAQTBwsTCwMDBQhICxMHCwsHBw4LBw4HBwgDBxYHBwcHDwsHBwwHFQQDCAsOBwcVDggHCwcHAwsLEyAOBwQHBwcEAwcHBw8TBAcICAcHCwcLDgMHBwcHAyUHAxURDwsIBwcHBAcTDgsHAw4DBwsHCwsDAwsHBxEDMA4OAwsLCAcDBwcLBwgHAwgHCxMIBAMHCw8ECCMIAwgRCAsHBAsOEwcTAwsMDA4TEwMDBwcHAxIRBwgHBwsPCBMHBwcHDgcDBAgHCAcLAwcMAwgHBAMDEw4HEwcICAgHCwQHBwsDCxMLBwMTEwsDDgsLCAcICAgICAgICAcTBwcLCAcLAwMHBwcDBwcLCwcHBAcHFg4ODg4HBAcHEg4RCwgTEw4OBwcHBwcHBwcHBwcHBwgDCAMHCAgDCAsODgsDEwgDDAgOBwsODgcHCwsDCgcDAwcIEQsOCwcHCwMTCAsMDAMICAgFLQMHAwsLBwcIBAMRBwsOBwMHAw4HBAcHAwcHBw8LCAwHBwMMDw8PEQsDDgcEBwMEEQMMCAgHCwkLCwcHBwcLAw4LBAcHCwsrBwcDBAsHBwcHBAcSEQsHBwcIAwcTEwcLEgcHCwUIEQcLDAwHBwMOBwcHBxUDHgcMBy8DDwcHCAcLDgQDBwcHCwcICw4OCAcLCwcOAwMICwgIEwQIBwcDAwcICAgDAwcdCwMLCwcHBwcHCAcHDgcHDwMHDwsICAwHJgcHCwsLCAsHAwcIByYDBAgEDgsHAwMHBwsLCxwOBw8OCwsIDggDERELERUHCwsLAwcDBwMDESwDCAcHCAcOBxEHCAQtDgsZDkARBxEDDAMEAwgMDAgEEwcHCAMRCA4VBwcMDAcDBw4EAwcHAwgHDgcHNw4LCw4ICAcHBwgWBwgIBwgDAwgICAMDAysHCwcIDwQTAwcDDAMRCwgHCAcIBwgHBwcHBwwHBwsICAMDEw4HBwQEBw4MBwMMCw4OBwcHCwQHBxEHBwcHDAcHCAgHBwgHCAMDAwMICAgIAwMDAw4ODwcOBxEHAwsDCwhKCwgLCxMNERUHAw4HCwcECAcLCAcLCw4IBwQIBwcHCAgICAgICAgICAgICAgICAcLCwcHBwcDCEtLSwQHBwgICAcIAwQTBwgICAgIBwgICAgDAwMICAgICAgICAgICAgICAgICAcLCw8DBwMMCwsLBwMMDEtLSy0TBAQMCAcDAwMDAwMICAMDBwgOBxMDCy0HAwMHDg4LCwcIEQQIJBMrDhEICw4ICAcHCAgHCAsDBwMIBwcHAwgICxAHBwgICAcQCwcLAwcDBwgVCBELBAcLDgQHCAQDEwgICAgLCwcHBwcHAwcHAwwHNQcrEQwHDAgHKwcIAxMDBwcLEQQRCwgPEQMHAwcLDwcDCAgkBwcLJAcHBwgEBCQMDAgHAwgHBwgICAgICw4TBAMLAwMLCwMHAwcHAwcHBw4EDggOBwMDBwMDBBELBwcICwsDCAcHBAMHBwMMBwcHBwMHCwcIBwgDBwMDDwsHAwMDAwMDAwMDBwsICA8HCwsHEw8HBwcHBy0HCAgICAcHBwcGBwsHEREMB0UOCwsDAwMDBwMDBwgICAgICAgICAgICAgDAwcOAwgIAw4OBwcLBA4LCwcOCxMLCwsLDgsEAwQDBwQHBAUHKwMPAwgDNA8DDAgMBwwMDAwICAgICAgIQQcDCAwIBwMIBwgLDwgIBxEIBwcDCAcDDgcHBwwECAgICAgIBAcDBzMzBwgHCAgICw4HCAgICAcEDgsICAgIDAsDDA4TCA4ICAMHAwcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDBAcHCAgEAwgICwgICwMDAQQICAgLAwsDAwMIAwcHDgcHBwsLCAgLCAcHEQgMDggDCwsHBwsIAwMICAgICAMLAwMLCAgICAgICAgICAgICwsOBA4HBwcICAgICAgICAcHBwcLDwgLDw4ICAwIBwsLCw4HPggICAgICAgICAcDPgsHAwQEDgsLCwgEEREHBwMDAwMDBAgICAgICA4DCAgICAgICAgICAgICAgDCAgDEREIDhERCwsIAwsLCwcICAcHBAcHBwcICAgRDgc+BwcHCws+DAwMDAMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAcHEQcICwsLCwgLAxMDAwMICAcRAwMHAwQDAwcHBwMLCAgDAwMDBAgIAwMLAwgHDAgISAAHBwcHCwcHBwwDCwsHAxEBBwcIBw4HDAMDAwcHCAMLAwMHBwwLDgcDBwMiIgsHAwMDAwMLBwcLCwcICwgDBAgHBwcHBwcHAwsLAwgTAwQHCwgICAgHAwcDBwMDAwMHCAcHAwcDAwcLAwgHDgkJAwcHAwMDAwcDAwgICAMDAwMDAwMDBwMDAwMHCAgIAwMDAwMDAwMDBwcHBwMHAwcHAwMHAwMICwsHBwcHAwcHBwcDAwMDAwMDAwMDAwMHAwcDDQMHCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0HBwMDAwMDAwgHAxEDBwMDCwcDAwMDAwMDAwcRERERBwcHAxEEEQcOBwMIAwgICAgICAsEDggIDQgTCAgICAgICAgEBwgIBwcECAgIAwgHAwcHBxMDCAgDAwcLAwQIBwQLAwMDAwMDRgMDAz8rBw4ICwcLCAgICwcTCwgIQxMHBAICAgICDAwCAgICAgICAgICAgICAgICAgICDAICBwIHAgICDgcHBwMIAwgPFQcOBzcMAwMCAzstAggLBwsHCwMDBAcHCAgRCAsLCQMICAgEBA8HAwMHBwcIAwgIMjIICwgICAgIBBIIDwcIBwgIBwgIQj0ICAgICAgICAgICAgHBwcHBwcHBwcIBwcHBw8IDgMRCAsRBxEICwsICAcHCwMJCwcIAwMDDgcLCAgICAgICA4ICAcHBAsNOwcOCAgEOwgIBwgIMQEHAwMABwMIBwcDBwcOAwAAAAALAAAICAgICAgICAgICAgICAcHBwgMAwwADAgIC0sHAwcDDwcICAgIBAgICwQMCAgICQsREQgICAgICAQICAgICAgIBwMICAgHBwcDDwcHBwMHCw4RCAMLCwwODAMDCwcHBwcEDgQDAwMLAwgHBwcHBwcHBwcHBwcHBwsHBwMLBwELCwsLCwsLCwsLMQMHDAMDBwcHDhEDCAMPCAQECAMDAwMDAwcEBwcLBwsIDggICAMICAgIAwMHBAMICAclEQwMDAcDCAMIAwgIBwgOBQMIAw4DCAgPAwMDBwMDAwwDAwgICAsEBwMLAwMIAwMHAwMEAwMHDgcICAgICAQHCA0HBxEHBQcDAwsHBwcICBMDBxEHBwcHAwMEBAcDBwcHBwcHAwgHBwMHAwMHBwMDBAsIFA8ICAMPDwMIDw8PBw8HDwcLBAcPEhEREScqKRILAwsDCwsNBAcIBwcHBwcEBwcDBw4LAwsOAzIHBwgECzsOCAcBBw0NBAgHBwcDAwMDCAMDAwMDCwsLDwsLCwcOBwUFDAwHAwMDAwcIEQMDBwcDAwcEAwsLCwMDBAMICAMIAwg8CAgDCAMDDg4LBwMHBwcHBwMDAwsHBwcHAwMEAwMDAwMBAQMICAEDBAEBAQEBBwMDAwMDAwMDBAcHOwcDAwMDAwMDAzsDAwMDAwMDBwMDAwMHDQMDAwkIAwMICAgICAgHCAMDAwMLAwgDCAgIDQgIAREHBwcHBwM+AwMDAwMHBwcHBwcHBwMDAwMDBwsDAwgICAgICAgICwMDAwMHCAsHMQgHCAgMCAgICAgMCAgIBwwPCwwIBwMICAgICAgICAgIAwMDAwwMDAwIAwMDAwMLCAcICAwHDAcHAwcHAwMDAwMDAwMDAwMHCwcHBwcHAwgDAwgDAwEDAwMHAwMLCwgHBwMHBwsDAwQDEQQEBAgIDAMMAwsMDgMMAwwHOwMDAwMDAwMDAwMDAwMDAwMHAwcDAwMHCAsDBwcHCwgHBwgICAgIDg4ODg4ODggMCAgICwcDCAsLAwgHCAgLKwsHCAQIAwMDAwMDAwMDAwMDAwMDAwMDCwMHBwcHBwcHBwcHBwcHBwcLBAgIBwcDBwMMBAcD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oB4hfCAELQCcHiF9IAQoApgeIX4gBCgClB4hfyAEKAKQHiGAASAELQCMHiGBASAEKAKIHiGCASAEKAKEHiGDASAEKAKAHiGEASAELQD8HSGFASAEKAL4HSGGASAEKAL0HSGHASAEKALwHSGIASAELQDsHSGJASAEKALoHSGKASAEKALkHSGLASAEKALgHSGMASAELQDcHSGNASAEKALYHSGOASAEKALUHSGPASAEKALQHSGQASAELQDMHSGRASAEKALIHSGSASAEKALEHSGTASAEKALAHSGUASAELQC8HSGVASAEKAK4HSGWASAEKAK0HSGXASAEKAKwHSGYASAELQCsHSGZASAEKAKoHSGaASAEKAKkHSGbASAEKAKgHSGcASAELQCcHSGdASAEKAKYHSGeASAEKAKUHSGfASAEKAKQHSGgASAELQCMHSGhASAEKAKIHSGiASAEKAKEHSGjASAEKAKAHSGkASAELQD8HCGlASAEKAL4HCGmASAEKAL0HCGnASAEKALwHCGoASAELQDsHCGpASAEKALoHCGqASAEKALkHCGrASAEKALgHCGsASAELQDcHCGtASAEKALYHCGuASAEKALUHCGvASAEKALQHCGwASAELQDMHCGxASAEKALIHCGyASAEKALEHCGzASAEKALAHCG0ASAELQC8HCG1ASAEKAK4HCG2ASAEKAK0HCG3ASAEKAKwHCG4ASAELQCsHCG5ASAEKAKoHCG6ASAEKAKkHCG7ASAEKAKgHCG8ASAELQCcHCG9ASAEKAKYHCG+ASAEKAKUHCG/ASAEKAKQHCHAASAELQCMHCHBASAEKAKIHCHCASAEKAKEHCHDASAEKAKAHCHEASAELQD8GyHFASAEKAL4GyHGASAEKAL0GyHHASAEKALwGyHIASAELQDsGyHJASAEKALoGyHKASAEKALkGyHLASAEKALgGyHMASAELQDcGyHNASAEKALYGyHOASAEKALUGyHPASAEKALQGyHQASAELQDMGyHRASAEKALIGyHSASAEKALEGyHTASAEKALAGyHUASAELQC8GyHVASAEKAK4GyHWASAEKAK0GyHXASAEKAKwGyHYASAELQCsGyHZASAEKAKoGyHaASAEKAKkGyHbASAEKAKgGyHcASAELQCcGyHdASAEKAKYGyHeASAEKAKUGyHfASAEKAKQGyHg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7QIgBCgCxAwh7gIgBCgCyAwh7wIgBC0AzAwh8AIgBCgC0Awh8QIgBCgC1Awh8gIgBCgC2Awh8wIgBC0A3Awh9AIgBCgC4Awh9QIgBCgC5Awh9gIgBCgC6Awh9wIgBC0A7Awh+AIgBCgC8Awh+QIgBCgC9Awh+gIgBCgC+Awh+wIgBC0A/Awh/AIgBCgCgA0h/QIgBCgChA0h/gIgBCgCiA0h/wIgBC0AjA0hgAMgBCgCkA0hgQMgBCgClA0hggMgBCgCmA0hgwMgBC0AnA0hhAMgBCgCoA0hhQMgBCgCpA0hhgMgBCgCqA0hhwMgBC0ArA0hiAMgBCgCsA0hiQMgBCgCtA0higMgBCgCuA0hiwMgBC0AvA0hjAMgBCgCwA0hjQMgBCgCxA0hjgMgBCgCyA0hjwMgBC0AzA0hkAMgBCgC0A0hkQMgBCgC1A0hkgMgBCgC2A0hkwMgBC0A3A0hlAMgBCgC4A0hlQMgBCgC5A0hlgMgBCgC6A0hlwMgBC0A7A0hmAMgBCgC8A0hmQMgBCgC9A0hmgMgBCgC+A0hmwMgBC0A/A0hnAMgBCgCgA4hnQMgBCgChA4hngMgBCgCiA4hnwMgBC0AjA4hoAMgBCgCkA4hoQMgBCgClA4hogMgBCgCmA4howMgBC0AnA4hpAMgBCgCoA4hpQMgBCgCpA4hpgMgBCgCqA4hpwMgBC0ArA4hqAMgBCgCsA4hqQMgBCgCtA4hqgMgBCgCuA4hqwMgBC0AvA4hrAMgBCgCwA4hrQMgBCgCxA4hrgMgBCgCyA4hrwMgBC0AzA4hsAMgBCgC0A4hsQMgBCgC1A4hsgMgBCgC2A4hswMgBC0A3A4htAMgBCgC4A4htQMgBCgC5A4htgMgBCgC6A4htwMgBC0A7A4huAMgBCgC8A4huQMgBCgC9A4hugMgBCgC+A4huwMgBC0A/A4hvAMgBCgCgA8hvQMgBCgChA8hvgMgBCgCiA8hvwMgBC0AjA8hwAMgBC8ArQohwQMgBC8AvQohwgMgBC8AzQohwwMgBC8A3QohxAMgBC8A7QohxQMgBC8A/QohxgMgBC8AjQshxwMgBC8AnQshyAMgBC8ArQshyQMgBC8AvQshygMgBC8AzQshywMgBC8A3QshzAMgBC8A7QshzQMgBC8A/QshzgMgBC8AjQwhzwMgBC8AnQwh0AMgBC8ArQwh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tQIhuQIgtgIhugIgECGzAiAUIbQCIA8htQIgDiG2AiAeIbsCIBghECAXIRQgFiEPIBUhDiATIRVBACEWIB8hEyAhIR8gICEhICQhICAlISQgJiElIIwCISZBACGUBCCfBCGkBCCeBCGlBAsgBEGQD2oQ8hsMAQtBACGMBCCyASGNBCCzASGOBCC0ASGPBCC1ASGQBCC5ASG1ASC4ASG0ASC3ASGzASC2ASGyASC9ASG5ASC8ASG4ASC7ASG3ASC6ASG2ASDBASG9ASDAASG8ASC/ASG7ASC+ASG6ASDFASHBASDEASHAASDDASG/ASDCASG+ASDJASHFASDIASHEASDHASHDASDGASHCASDNASHJASDMASHIASDLASHHASDKASHGASDRASHNASDQASHMASDPASHLASDOASHKASDVASHRASDUASHQASDTASHPASDSASHOASDZASHVASDYASHUASDXASHTASDWASHSASDdASHZASDcASHYASDbASHXASDaASHWASDhASHdASDgASHcASDfASHbASDeASHaASDiASHgASARId8BIBIh3gEgwAMhkQQgIyHiAUEAIRFBACESILwDIcADIL0DISMgvgMh4QEgvwMhkgQguAMhvAMguQMhvQMgugMhvgMguwMhvwMgtAMhuAMgtQMhuQMgtgMhugMgtwMhuwMgsAMhtAMgsQMhtQMgsgMhtgMgswMhtwMgrAMhsAMgrQMhsQMgrgMhsgMgrwMhswMgqAMhrAMgqQMhrQMgqgMhrgMgqwMhrwMgpAMhqAMgpQMhqQMgpgMhqgMgpwMhqwMgoAMhpAMgoQMhpQMgogMhpgMgowMhpwMgnAMhoAMgnQMhoQMgngMhogMgnwMhowMgmAMhnAMgmQMhnQMgmgMhngMgmwMhnwMglAMhmAMglQMhmQMglgMhmgMglwMhmwMgkAMhlAMgkQMhlQMgkgMhlgMgkwMhlwMgjAMhkAMgjQMhkQMgjgMhkgMgjwMhkwMgiAMhjAMgiQMhjQMgigMhjgMgiwMhjwMghAMhiAMghQMhiQMghgMhigMghwMhiwMggAMhhAMggQMhhQMgggMhhgMggwMhhwMg/AIhgAMg/QIhgQMg/gIhggMg/wIhgwMg+AIh/AIg+QIh/QIg+gIh/gIg+wIh/wIg9AIh+AIg9QIh+QIg9gIh+gIg9wIh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NgLQBiAFIL0BOgDMBiAFIL4BNgLIBiAFIL8BNgLEBiAFIMABNgLABiAFIMEBOgC8BiAFIMIBNgK4BiAFIMMBNgK0BiAFIMQBNgKwBiAFIMUBOgCsBiAFIMYBNgKoBiAFIMcBNgKkBiAFIMgBNgKgBiAFIMkBOgCcBiAFIMoBNgKYBiAFIMsBNgKUBiAFIMwBNgKQBiAFIM0BOgCMBiAFIM4BNgKIBiAFIM8BNgKEBiAFINABNgKABiAFINEBOgD8BSAFINIBNgL4BSAFINMBNgL0BSAFINQBNgLwBSAFINUBOgDsBSAFINYBNgLoBSAFINcBNgLkBSAFINgBNgLgBSAFINkBOgDcBSAFINoBNgLYBSAFINsBNgLUBSAFINwBNgLQBSAFIN0BOgDMBSAFIN4BNgLIBSAFIN8BNgLEBSAFIOABNgLABSAFIIwEOgC8BSAFIBI2ArgFIAUgETYCtAUgBSDiATYCsAUgBSCRBDoArAUgBSCSBDYCqAUgBSDhATYCpAUgBSAjNgKgBSAFIMADOgCcBSAFIL8DNgKYBSAFIL4DNgKUBSAFIL0DNgKQBSAFILwDOgCMBSAFILsDNgKIBSAFILoDNgKEBSAFILkDNgKABSAFILgDOgD8BCAFILcDNgL4BCAFILYDNgL0BCAFILUDNgLwBCAFILQDOgDsBCAFILMDNgLoBCAFILIDNgLkBCAFILEDNgLgBCAFILADOgDcBCAFIK8DNgLYBCAFIK4DNgLUBCAFIK0DNgLQBCAFIKwDOgDMBCAFIKsDNgLIBCAFIKoDNgLEBCAFIKkDNgLABCAFIKgDOgC8BCAFIKcDNgK4BCAFIKYDNgK0BCAFIKUDNgKwBCAFIKQDOgCsBCAFIKMDNgKoBCAFIKIDNgKkBCAFIKEDNgKgBCAFIKADOgCcBCAFIJ8DNgKYBCAFIJ4DNgKUBCAFIJ0DNgKQBCAFIJwDOgCMBCAFIJsDNgKIBCAFIJoDNgKEBCAFIJkDNgKABCAFIJgDOgD8AyAFIJcDNgL4AyAFIJYDNgL0AyAFIJUDNgLwAyAFIJQDOgDsAyAFIJMDNgLoAyAFIJIDNgLkAyAFIJEDNgLgAyAFIJADOgDcAyAFII8DNgLYAyAFII4DNgLUAyAFII0DNgLQAyAFIIwDOgDMAyAFIIsDNgLIAyAFIIoDNgLEAyAFIIkDNgLA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HzoAnAsgBSCZAjYCmAsgBSCaAjYClAsgBSCbAjYCkAsgBSAhOgCMCyAFIJYCNgKICyAFIJcCNgKECyAFIJgCNgKACyAFICA6APwKIAUgkwI2AvgKIAUglAI2AvQKIAUglQI2AvAKIAUgJDoA7AogBSCQAjYC6AogBSCRAjYC5AogBSCSAjYC4AogBSAlOgDcCiAFII0CNgLYCiAFII4CNgLUCiAFII8CNgLQCiAFIAw6AMwKIAUgCzYCyAogBSANNgLECiAFIAg2AsAKIAUgRToAvAogBSBGNgK4CiAFIEc2ArQKIAUgSDYCsAogBSBJOgCsCiAFIEo2AqgKIAUgSzYCpAogBSBMNgKgCiAFIE06AJwKIAUgTjYCmAogBSBPNgKUCiAFIFA2ApAKIAUgUToAjAogBSBSNgKICiAFIFM2AoQKIAUgVDYCgAogBSBVOgD8CSAFIFY2AvgJIAUgVzYC9AkgBSBYNgLwCSAFIFk6AOwJIAUgWjYC6AkgBSBbNgLkCSAFIFw2AuAJIAUgXToA3AkgBSBeNgLYCSAFIF82AtQJIAUgYDYC0AkgBSBhOgDMCSAFIGI2AsgJIAUgYzYCxAkgBSBkNgLACSAFIGU6ALwJIAUgZjYCuAkgBSBnNgK0CSAFIGg2ArAJIAUgaToArAkgBSBqNgKoCSAFIGs2AqQJIAUgbDYCoAkgBSBtOgCcCSAFIG42ApgJIAUgbzYClAkgBSBwNgKQCSAFIHE6AIwJIAUgcjYCiAkgBSBzNgKECSAFIHQ2AoAJIAUgdToA/AggBSB2NgL4CCAFIHc2AvQIIAUgeDYC8AggBSB5OgDsCCAFIHo2AugIIAUgezYC5AggBSB8NgLgCCAFIH06ANwIIAUgfjYC2AggBSB/NgLUCCAFIIABNgLQCCAFIIEBOgDMCCAFIIIBNgLICCAFIIMBNgLECCAFIIQBNgLACCAFIIUBOgC8CCAFIIYBNgK4CCAFIIcBNgK0CCAFIIgBNgKwCCAFIIkBOgCsCCAFIIoBNgKoCCAFIIsBNgKkCCAFIIwBNgKgCCAFII0BOgCcCCAFII4BNgKYCCAFII8BNgKUCCAFIJABNgKQCCAFIJEBOgCMCCAFIJIBNgKICCAFIJMBNgKECCAFIJQBNgKACCAFIJUBOgD8ByAFIJYBNgL4ByAFIJcBNgL0ByAFIJgBNgLw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CyAFIB86AIwLIAUgmQI2AogLIAUgmgI2AoQLIAUgmwI2AoALIAUgIToA/AogBSCWAjYC+AogBSCXAjYC9AogBSCYAjYC8AogBSAgOgDsCiAFIJMCNgLoCiAFIJQCNgLkCiAFIJUCNgLgCiAFICQ6ANwKIAUgkAI2AtgKIAUgkQI2AtQKIAUgkgI2AtAKIAUgJToAzAogBSCNAjYCyAogBSCOAjYCxAogBSCPAjYCwAogBSAMOgC8CiAFIAs2ArgKIAUgDTYCtAogBSAINgKwCiAFIEU6AKwKIAUgRjYCqAogBSBHNgKkCiAFIEg2AqAKIAUgSToAnAogBSBKNgKYCiAFIEs2ApQKIAUgTDYCkAogBSBNOgCMCiAFIE42AogKIAUgTzYChAogBSBQNgKACiAFIFE6APwJIAUgUjYC+AkgBSBTNgL0CSAFIFQ2AvAJIAUgVToA7AkgBSBWNgLoCSAFIFc2AuQJIAUgWDYC4AkgBSBZOgDcCSAFIFo2AtgJIAUgWzYC1AkgBSBcNgLQCSAFIF06AMwJIAUgXjYCyAkgBSBfNgLECSAFIGA2AsAJIAUgYToAvAkgBSBiNgK4CSAFIGM2ArQJIAUgZDYCsAkgBSBlOgCsCSAFIGY2AqgJIAUgZzYCpAkgBSBoNgKgCSAFIGk6AJwJIAUgajYCmAkgBSBrNgKUCSAFIGw2ApAJIAUgbToAjAkgBSBuNgKICSAFIG82AoQJIAUgcDYCgAkgBSBxOgD8CCAFIHI2AvgIIAUgczYC9AggBSB0NgLwCCAFIHU6AOwIIAUgdjYC6AggBSB3NgLkCCAFIHg2AuAIIAUgeToA3AggBSB6NgLYCCAFIHs2AtQIIAUgfDYC0AggBSB9OgDMCCAFIH42AsgIIAUgfzYCxAggBSCAATYCwAggBSCBAToAvAggBSCCATYCuAggBSCDATYCtAggBSCEATYCsAggBSCFAToArAggBSCGATYCqAggBSCHATYCpAggBSCIATYCoAggBSCJAToAnAggBSCKATYCmAggBSCLATYClAggBSCMATYCkAggBSCNAToAjAggBSCOATYCiAggBSCPATYChAggBSCQATYCgAggBSCRAToA/AcgBSCSATYC+AcgBSCTATYC9AcgBSCUATYC8AcgBSCVAToA7AcgBSCWATYC6AcgBSCXATYC5AcgBSCYATYC4AcgBSCZAToA3AcgBSCaATYC2AcgBSCbATYC1AcgBSCcATYC0AcgBSCdAToAzAcgBSCeATYCyAcgBSCfATYCxAcgBSCgATYCwAcgBSChAToAvAcgBSCiATYCuAcgBSCjATYCtAcgBSCkATYCsAcgBSClAToArAcgBSCmATYCqAcgBSCnATYCpAcgBSCoATYCoAcgBSCpAToAnAcgBSCqATYCmAcgBSCrATYClAcgBSCsATYCkAcgBSCtAToAjAcgBSCuATYCiAcgBSCvATYChAcgBSCwATYCgAcgBSCxAToA/AYgBSAeNgL4BiAFIBg2AvQGIAUgAjYC8AYgBSADOgDsBiAFII0ENgLoBiAFII4ENgLkBiAFII8ENgLgBiAFIJAEOgDcBiAFILIBNgLYBiAFILMBNgLUBiAFILQBNgLQBiAFILUBOgDMBiAFILYBNgLIBiAFILcBNgLEBiAFILgBNgLABiAFILkBOgC8BiAFILoBNgK4BiAFILsBNgK0BiAFILwBNgKwBiAFIL0BOgCsBiAFIL4BNgKoBiAFIL8BNgKkBiAFIMABNgKgBiAFIMEBOgCcBiAFIMIBNgKYBiAFIMMBNgKUBiAFIMQBNgKQBiAFIMUBOgCMBiAFIMYBNgKIBiAFIMcBNgKEBiAFIMgBNgKABiAFIMkBOgD8BSAFIMoBNgL4BSAFIMsBNgL0BSAFIMwBNgLwBSAFIM0BOgDsBSAFIM4BNgLoBSAFIM8BNgLkBSAFINABNgLgBSAFINEBOgDcBSAFINIBNgLYBSAFINMBNgLUBSAFINQBNgLQBSAFINUBOgDMBSAFINYBNgLIBSAFINcBNgLEBSAFINgBNgLABSAFINkBOgC8BSAFINoBNgK4BSAFINsBNgK0BSAFINwBNgKwBSAFIN0BOgCsBSAFIN4BNgKoBSAFIN8BNgKkBSAFIOABNgKgBSAFIIwEOgCcBSAFIBI2ApgFIAUgETYClAUgBSDiATYCkAUgBSCRBDoAjAUgBSCSBDYCiAUgBSDhATYChAUgBSAjNgKABSAFIMADOgD8BCAFIL8DNgL4BCAFIL4DNgL0BCAFIL0DNgLwBCAFILwDOgDsBCAFILsDNgLoBCAFILoDNgLkBCAFILkDNgLgBCAFILgDOgDcBCAFILcDNgLYBCAFILYDNgLUBCAFILUDNgLQBCAFILQDOgDMBCAFILMDNgLIBCAFILIDNgLEBCAFILEDNgLABCAFILADOgC8BCAFIK8DNgK4BCAFIK4DNgK0BCAFIK0DNgKwBCAFIKwDOgCsBCAFIKsDNgKoBCAFIKoDNgKkBCAFIKkDNgKgBCAFIKgDOgCcBCAFIKcDNgKYBCAFIKYDNgKUBCAFIKUDNgKQBCAFIKQDOgCMBCAFIKMDNgKIBCAFIKIDNgKEBCAFIKEDNgKABCAFIKADOgD8AyAFIJ8DNgL4AyAFIJ4DNgL0AyAFIJ0DNgLwAyAFIJwDOgDsAyAFIJsDNgLoAyAFIJoDNgLkAyAFIJkDNgLgAyAFIJgDOgDcAyAFIJcDNgLYAyAFIJYDNgLUAyAFIJUDNgLQAyAFIJQDOgDMAyAFIJMDNgLIAyAFIJIDNgLEAyAFIJEDNgLAAyAFIJADOgC8AyAFII8DNgK4AyAFII4DNgK0AyAFII0DNgKwAyAFIIwDOgCsAyAFIIsDNgKoAyAFIIoDNgKkAyAFIIkDNgKgAyAFIIgDOgCcAyAFIIcDNgKYAyAFIIYDNgKUAyAFIIUDNgKQAyAFIIQDOgCMAyAFIIMDNgKIAyAFIIIDNgKEAyAFIIEDNgKAAyAFIIADOgD8AiAFIP8CNgL4AiAFIP4CNgL0AiAFIP0CNgLwAiAFIPwCOgDsAiAFIPsCNgLoAiAFIPoCNgLkAiAFIPkCNgLgAiAFIPgCOgDcAiAFIPcCNgLYAiAFIPYCNgLUAiAFIPUCNgLQAiAFIPQCOgDMAiAFIPMCNgLIAiAFIPICNgLEAiAFIPECNgLAAiAFIPACOgC8AiAFIO8CNgK4AiAFIO4CNgK0AiAFIO0CNgKwAiAFIOwCOgCsAiAFIOsCNgKoAiAFIOoCNgKkAiAFIOkCNgKgAiAFIOgCOgCcAiAFIOcCNgKYAiAFIOYCNgKUAiAFIOUCNgKQAiAFIOQCOgCMAiAFIOMCNgKIAiAFIOICNgKEAiAFIOECNgKAAiAFIOACOgD8ASAFIN8CNgL4ASAFIN4CNgL0ASAFIN0CNgLwASAFINwCOgDsASAFINsCNgLoASAFINoCNgLkASAFINkCNgLgASAFINgCOgDcASAFINcCNgLYASAFINYCNgLUASAFINUCNgLQASAFINQCOgDMASAFINMCNgLIASAFINICNgLEASAFINECNgLAASAF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FAALAkAgAi0ACUUNACADIAFB8dSaAUETIAIoAgAQxgUCQCAAKAIIIgUgACgCAEcNACAAQdSmmgEQgxcLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAApFDQAgAyABQYTVmgFBECACKAIAEMYFAkAgACgCCCIFIAAoAgBHDQAgAEHUppoBEIMXCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQALRQ0AIAMgAUGU1ZoBQRMgAigCABDGBQJAIAAoAggiBSAAKAIARw0AIABB1KaaARCDFwsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0ADEUNACADIAFBp9WaAUEXIAIoAgAQxgUCQCAAKAIIIgUgACgCAEcNACAAQdSmmgEQgxcLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAA1FDQAgAyABQb7VmgFBDyACKAIAEMYFAkAgACgCCCIFIAAoAgBHDQAgAEHUppoBEIMXCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAORQ0AIAMgAUHN1ZoBQRggAigCABDGBQJAIAAoAggiBSAAKAIARw0AIABB1KaaARCDFwsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AD0UNACADIAFB5dWaAUEOIAIoAgAQxgUCQCAAKAIIIgUgACgCAEcNACAAQdSmmgEQgxcLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItABBFDQAgAyABQfPVmgFBEiACKAIAEMYFAkAgACgCCCIFIAAoAgBHDQAgAEHUppoBEIMXCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQARRQ0AIAMgAUGF1poBQRUgAigCABDGBQJAIAAoAggiBSAAKAIARw0AIABB1KaaARCDFwsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AEkUNACADIAFBmtaaAUELIAIoAgAQxgUCQCAAKAIIIgUgACgCAEcNACAAQdSmmgEQgxcLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItABNFDQAgAyABQaXWmgFBCiACKAIAEMYFAkAgACgCCCIFIAAoAgBHDQAgAEHUppoBEIMXCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAURQ0AIAMgAUGv1poBQRsgAigCABDGBQJAIAAoAggiBSAAKAIARw0AIABB1KaaARCDFwsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AFUUNACADIAFBytaaAUEiIAIoAgAQxgUCQCAAKAIIIgUgACgCAEcNACAAQdSmmgEQgxcLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItABZFDQAgAyABQezWmgFBGiACKAIAEMYFAkAgACgCCCIFIAAoAgBHDQAgAEHUppoBEIMXCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAXRQ0AIAMgAUGG15oBQRogAigCABDGBQJAIAAoAggiBSAAKAIARw0AIABB1KaaARCDFwsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AGEUNACADIAFBoNeaAUEdIAIoAgAQxgUCQCAAKAIIIgUgACgCAEcNACAAQdSmmgEQgxcLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItABlFDQAgAyABQb3XmgFBECACKAIAEMYFAkAgACgCCCIFIAAoAgBHDQAgAEHUppoBEIMXCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAaRQ0AIAMgAUHN15oBQSsgAigCABDGBQJAIAAoAggiBSAAKAIARw0AIABB1KaaARCDFwsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AG0UNACADIAFB+NeaAUEeIAIoAgAQxgUCQCAAKAIIIgUgACgCAEcNACAAQdSmmgEQgxcLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItABxFDQAgAyABQZbYmgFBFCACKAIAEMYFAkAgACgCCCIFIAAoAgBHDQAgAEHUppoBEIMXCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAdRQ0AIAMgAUGq2JoBQRcgAigCABDGBQJAIAAoAggiBSAAKAIARw0AIABB1KaaARCDFwsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AHkUNACADIAFBwdiaAUEYIAIoAgAQxgUCQCAAKAIIIgUgACgCAEcNACAAQdSmmgEQgxcLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAB9FDQAgAyABQdnYmgFBHiACKAIAEMYFAkAgACgCCCIFIAAoAgBHDQAgAEHUppoBEIMXCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAgRQ0AIAMgAUH32JoBQR0gAigCABDGBQJAIAAoAggiBSAAKAIARw0AIABB1KaaARCDFwsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AIUUNACADIAFBlNmaAUEXIAIoAgAQxgUCQCAAKAIIIgUgACgCAEcNACAAQdSmmgEQgxcLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItACJFDQAgAyABQavZmgFBGiACKAIAEMYFAkAgACgCCCIFIAAoAgBHDQAgAEHUppoBEIMXCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAjRQ0AIAMgAUHF2ZoBQRggAigCABDGBQJAIAAoAggiBSAAKAIARw0AIABB1KaaARCDFwsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AJEUNACADIAFB3dmaAUEZIAIoAgAQxgUCQCAAKAIIIgUgACgCAEcNACAAQdSmmgEQgxcLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItACVFDQAgAyABQfbZmgFBGCACKAIAEMYFAkAgACgCCCIFIAAoAgBHDQAgAEHUppoBEIMXCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAmRQ0AIAMgAUGO2poBQSMgAigCABDGBQJAIAAoAggiBSAAKAIARw0AIABB1KaaARCDFwsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AJ0UNACADIAFBsdqaAUEjIAIoAgAQxgUCQCAAKAIIIgUgACgCAEcNACAAQdSmmgEQgxcLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAChFDQAgAyABQdTamgFBISACKAIAEMYFAkAgACgCCCIFIAAoAgBHDQAgAEHUppoBEIMXCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQApRQ0AIAMgAUH12poBQQkgAigCABDGBQJAIAAoAggiBSAAKAIARw0AIABB1KaaARCDFwsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AKkUNACADIAFB/tqaAUEMIAIoAgAQxgUCQCAAKAIIIgUgACgCAEcNACAAQdSmmgEQgxcLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItACtFDQAgAyABQYrbmgFBCCACKAIAEMYFAkAgACgCCCIFIAAoAgBHDQAgAEHUppoBEIMXCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAsRQ0AIAMgAUGS25oBQQggAigCABDGBQJAIAAoAggiBSAAKAIARw0AIABB1KaaARCDFwsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0ALUUNACADIAFBmtuaAUEcIAIoAgAQxgUCQCAAKAIIIgUgACgCAEcNACAAQdSmmgEQgxcLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAC5FDQAgAyABQbbbmgFBDyACKAIAEMYFAkAgACgCCCIFIAAoAgBHDQAgAEHUppoBEIMXCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAvRQ0AIAMgAUHF25oBQQsgAigCABDGBQJAIAAoAggiBSAAKAIARw0AIABB1KaaARCDFwsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AMEUNACADIAFB28SbAUEHIAIoAgAQxgUCQCAAKAIIIgUgACgCAEcNACAAQdSmmgEQgxcLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItADFFDQAgAyABQbLFmwFBAyACKAIAEMYFAkAgACgCCCIFIAAoAgBHDQAgAEHUppoBEIMXCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAyRQ0AIAMgAUHQ25oBQRAgAigCABDGBQJAIAAoAggiBSAAKAIARw0AIABB1KaaARCDFwsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AM0UNACADIAFB4NuaAUEIIAIoAgAQxgUCQCAAKAIIIgUgACgCAEcNACAAQdSmmgEQgxcLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItADRFDQAgAyABQejbmgFBDiACKAIAEMYFAkAgACgCCCIFIAAoAgBHDQAgAEHUppoBEIMXCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQA1RQ0AIAMgAUH225oBQRsgAigCABDGBQJAIAAoAggiBSAAKAIARw0AIABB1KaaARCDFwsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0ANkUNACADIAFBkdyaAUEaIAIoAgAQxgUCQCAAKAIIIgUgACgCAEcNACAAQdSmmgEQgxcLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItADdFDQAgAyABQcWXmwFBCiACKAIAEMYFAkAgACgCCCIFIAAoAgBHDQAgAEHUppoBEIMXCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQA4RQ0AIAMgAUGr3JoBQRcgAigCABDGBQJAIAAoAggiBSAAKAIARw0AIABB1KaaARCDFwsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AOUUNACADIAFBwtyaAUEYIAIoAgAQxgUCQCAAKAIIIgUgACgCAEcNACAAQdSmmgEQgxcLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItADpFDQAgAyABQdrcmgFBEiACKAIAEMYFAkAgACgCCCIFIAAoAgBHDQAgAEHUppoBEIMXCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQA7RQ0AIAMgAUHs3JoBQREgAigCABDGBQJAIAAoAggiBSAAKAIARw0AIABB1KaaARCDFwsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0APEUNACADIAFB/dyaAUEXIAIoAgAQxgUCQCAAKAIIIgUgACgCAEcNACAAQdSmmgEQgxcLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAD1FDQAgAyABQZTdmgFBHSACKAIAEMYFAkAgACgCCCIFIAAoAgBHDQAgAEHUppoBEIMXCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQA+RQ0AIAMgAUGx3ZoBQQMgAigCABDGBQJAIAAoAggiBSAAKAIARw0AIABB1KaaARCDFwsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AP0UNACADIAFBtN2aAUEPIAIoAgAQxgUCQCAAKAIIIgUgACgCAEcNACAAQdSmmgEQgxcLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAEBFDQAgAyABQcPdmgFBESACKAIAEMYFAkAgACgCCCIFIAAoAgBHDQAgAEHUppoBEIMXCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBBRQ0AIAMgAUHU3ZoBQRMgAigCABDGBQJAIAAoAggiBSAAKAIARw0AIABB1KaaARCDFwsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AQkUNACADIAFB592aAUEaIAIoAgAQxgUCQCAAKAIIIgUgACgCAEcNACAAQdSmmgEQgxcLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAENFDQAgAyABQYHemgFBDSACKAIAEMYFAkAgACgCCCIFIAAoAgBHDQAgAEHUppoBEIMXCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBERQ0AIAMgAUGO3poBQRMgAigCABDGBQJAIAAoAggiBSAAKAIARw0AIABB1KaaARCDFwsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0ARUUNACADIAFBod6aAUEZIAIoAgAQxgUCQCAAKAIIIgUgACgCAEcNACAAQdSmmgEQgxcLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAEZFDQAgAyABQbremgFBHyACKAIAEMYFAkAgACgCCCIFIAAoAgBHDQAgAEHUppoBEIMXCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBHRQ0AIAMgAUHZ3poBQQ4gAigCABDGBQJAIAAoAggiBSAAKAIARw0AIABB1KaaARCDFwsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0ASEUNACADIAFB596aAUEbIAIoAgAQxgUCQCAAKAIIIgUgACgCAEcNACAAQdSmmgEQgxcLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAElFDQAgAyABQYLfmgFBDyACKAIAEMYFAkAgACgCCCIFIAAoAgBHDQAgAEHUppoBEIMXCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBKRQ0AIAMgAUG1xZsBQQMgAigCABDGBQJAIAAoAggiBSAAKAIARw0AIABB1KaaARCDFwsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AS0UNACADIAFBkd+aAUEQIAIoAgAQxgUCQCAAKAIIIgUgACgCAEcNACAAQdSmmgEQgxcLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAExFDQAgAyABQaHfmgFBGSACKAIAEMYFAkAgACgCCCIFIAAoAgBHDQAgAEHUppoBEIMXCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBNRQ0AIAMgAUG635oBQQ8gAigCABDGBQJAIAAoAggiBSAAKAIARw0AIABB1KaaARCDFwsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0ATkUNACADIAFByd+aAUEVIAIoAgAQxgUCQCAAKAIIIgUgACgCAEcNACAAQdSmmgEQgxcLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAE9FDQAgAyABQd7fmgFBDyACKAIAEMYFAkAgACgCCCIFIAAoAgBHDQAgAEHUppoBEIMXCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBQRQ0AIAMgAUHt35oBQRcgAigCABDGBQJAIAAoAggiBSAAKAIARw0AIABB1KaaARCDFwsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AUUUNACADIAFBhOCaAUEdIAIoAgAQxgUCQCAAKAIIIgUgACgCAEcNACAAQdSmmgEQgxcLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAFJFDQAgAyABQeDLmwFBBSACKAIAEMYFAkAgACgCCCIFIAAoAgBHDQAgAEHUppoBEIMXCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBTRQ0AIAMgAUGh4JoBQQggAigCABDGBQJAIAAoAggiBSAAKAIARw0AIABB1KaaARCDFwsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AVEUNACADIAFBqeCaAUETIAIoAgAQxgUCQCAAKAIIIgUgACgCAEcNACAAQdSmmgEQgxcLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAFVFDQAgAyABQbzgmgFBDCACKAIAEMYFAkAgACgCCCIFIAAoAgBHDQAgAEHUppoBEIMXCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBWRQ0AIAMgAUHI4JoBQQ8gAigCABDGBQJAIAAoAggiBSAAKAIARw0AIABB1KaaARCDFwsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AV0UNACADIAFB1/+ZAUEGIAIoAgAQxgUCQCAAKAIIIgUgACgCAEcNACAAQdSmmgEQgxcLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAFhFDQAgAyABQdfgmgFBByACKAIAEMYFAkAgACgCCCIFIAAoAgBHDQAgAEHUppoBEIMXCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBZRQ0AIAMgAUHe4JoBQR0gAigCABDGBQJAIAAoAggiBSAAKAIARw0AIABB1KaaARCDFwsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AWkUNACADIAFB++CaAUEUIAIoAgAQxgUCQCAAKAIIIgUgACgCAEcNACAAQdSmmgEQgxcLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAFtFDQAgAyABQY/hmgFBESACKAIAEMYFAkAgACgCCCIFIAAoAgBHDQAgAEHUppoBEIMXCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBcRQ0AIAMgAUGg4ZoBQRAgAigCABDGBQJAIAAoAggiBSAAKAIARw0AIABB1KaaARCDFwsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AXUUNACADIAFBsOGaAUEfIAIoAgAQxgUCQCAAKAIIIgUgACgCAEcNACAAQdSmmgEQgxcLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAF5FDQAgAyABQc/hmgFBJiACKAIAEMYFAkAgACgCCCIFIAAoAgBHDQAgAEHUppoBEIMXCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBfRQ0AIAMgAUH14ZoBQR8gAigCABDGBQJAIAAoAggiBSAAKAIARw0AIABB1KaaARCDFwsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AYEUNACADIAFBlOKaAUEhIAIoAgAQxgUCQCAAKAIIIgUgACgCAEcNACAAQdSmmgEQgxcLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAGFFDQAgAyABQbXimgFBGyACKAIAEMYFAkAgACgCCCIFIAAoAgBHDQAgAEHUppoBEIMXCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBiRQ0AIAMgAUHQ4poBQQwgAigCABDGBQJAIAAoAggiBSAAKAIARw0AIABB1KaaARCDFwsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AY0UNACADIAFB3OKaAUEjIAIoAgAQxgUCQCAAKAIIIgUgACgCAEcNACAAQdSmmgEQgxcLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAGRFDQAgAyABQf/imgFBCyACKAIAEMYFAkAgACgCCCIFIAAoAgBHDQAgAEHUppoBEIMXCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBlRQ0AIAMgAUGK45oBQQwgAigCABDGBQJAIAAoAggiBSAAKAIARw0AIABB1KaaARCDFwsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AZkUNACADIAFBluOaAUELIAIoAgAQxgUCQCAAKAIIIgUgACgCAEcNACAAQdSmmgEQgxcLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAGdFDQAgAyABQaHjmgFBCCACKAIAEMYFAkAgACgCCCIFIAAoAgBHDQAgAEHUppoBEIMXCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBoRQ0AIAMgAUGp45oBQQkgAigCABDGBQJAIAAoAggiBSAAKAIARw0AIABB1KaaARCDFwsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AaUUNACADIAFBsuOaAUEaIAIoAgAQxgUCQCAAKAIIIgUgACgCAEcNACAAQdSmmgEQgxcLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAGpFDQAgAyABQczjmgFBFCACKAIAEMYFAkAgACgCCCIFIAAoAgBHDQAgAEHUppoBEIMXCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBrRQ0AIAMgAUHg45oBQSQgAigCABDGBQJAIAAoAggiBSAAKAIARw0AIABB1KaaARCDFwsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AbEUNACADIAFBhOSaAUERIAIoAgAQxgUCQCAAKAIIIgUgACgCAEcNACAAQdSmmgEQgxcLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAG1FDQAgAyABQZXkmgFBCCACKAIAEMYFAkAgACgCCCIFIAAoAgBHDQAgAEHUppoBEIMXCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBuRQ0AIAMgAUGd5JoBQQcgAigCABDGBQJAIAAoAggiBSAAKAIARw0AIABB1KaaARCDFwsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0Ab0UNACADIAFB/bybAUEFIAIoAgAQxgUCQCAAKAIIIgUgACgCAEcNACAAQdSmmgEQgxcLIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAHBFDQAgAyABQaTkmgFBCSACKAIAEMYFAkAgACgCCCIEIAAoAgBHDQAgAEHUppoBEIMXCyAAKAIEIARBMGxqIgEgAykDADcDACABQShqIANBKGopAwA3AwAgAUEgaiADQSBqKQMANwMAIAFBGGogA0EYaikDADcDACABQRBqIANBEGopAwA3AwAgAUEIaiADQQhqKQMANwMAIAAgBEEBajYCCAsgAiACKAIEQX9qNgIEIANBMGokAAudggECLX8GfiMAQbAGayIDJAACQAJAAkAgASgCeCIEQYCAgIAGcQ0AIAEoAsQBIQQgASgCwAEhBSADQcaAgIB4NgLoBCAFIAQgA0HoBGoQhRUhBCABLQDIAUGiAUcNASABEMcRIQUgARCHDiABIAUQ5REMAQsCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAEtAMgBIgVB3wBGDQAgBUHYAEcNAyADQfAAakEIaiACQQhqKAIANgIAIAMgAikCADcDcCAEQYKAgIACcUGAgICAAkYNAQwSCyABKALAASEGAkAgARCiC0H/AXFBCEYNAAJAIAEQogtB/wFxRQ0AAkAgASgCeCIEQQJxDQAgASAEQQpyNgJ4CwJAAkACQAJAIAEtAMgBIgRB3wBHDQAgARCHDiABLQDIAUHAAEcNASADQegEaiABEKwNQQhBGBDrHyIFDQIMGAsgASgCxAEhBSABKALAASEGIANBgAFqIAQQ3hsgA0EBNgLsBCADQZjvmwE2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BAwCC0EAIQoLAkAgAS0AyAEiBEH+AEYNACAEQQdHDQMgARCHDgsgA0HoBGpBCGoiBCADQYAGakEIaiIFKQMANwMAIANB6ARqQRBqIgsgA0GABmpBEGopAwA3AwAgAyADKQOABjcD6AQgBSgCACEFIAMoAowGIQwCQCAIDQAgA0GMAWpBvKubARDEFiADKAKQASEHCyAHQgM3AwAgByAMNgIMIAcgBTYCCCAHIAMpA+gENwMQIAdBGGogBCkDADcDACAHQSBqIAspAwA3AwBBASEEIANBATYClAELIAEtAMgBIQULAkACQAJAIApBAUYNACAFQf8BcUEPRg0BCyAKDQEgBUH/AXFBAkcNASABEIcOIARByABsIQ9BigWtQiCGIjJB2KqbAa2EITMgA0HoBGpBFWohECADQZACakEVaiERIANB6ARqQQRyIRIgA0GQAmpBBHIhEyADQdgFakEVaiEUIANB2AVqQQRyIRUgA0H4AmpBFWohFiADQfgCakEEciEXIANBgAZqQRVqIRggA0GABmpBBHIhGSADQdACakEVaiEaIANB0AJqQQRyIRsgA0HYA2pBDGohHCADQagDakEMaiEdIANBkAJqQQxqIR4CQANAAkACQCABLQDIASIfQQNGDQAgASgCwAEhByADQZACaiABEOAIIAMoApgCIQUCQCADKQOQAiIxQgJSDQAgBSELDAkLIAMpA6gCITQgAygCpAIhICADKAKgAiEhIAMoApwCIQgCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAxp0EBcUUNACADIDQ3A7gDIAMgIDYCtAMgAyAhNgKwAyADIAg2AqwDIAMgBTYCqAMgAS0AyAFB9QBHDQEgARCHDiADQZACaiABQQAQ3QUgAygCkAIhCyADLQCkAiIFQQJGDQIgEiATKQIANwIAIBAgESkAADcAACASQQhqIBNBCGopAgA3AgAgEEEHaiARQQdqKAAANgAAIAMgBToA/AQgAyALNgLoBCADQdAEaiADQegEahCeFCADKQPgBCEwIAMoAtgEISIgAygC1AQhIyADKALQBCEkIAMpA7gDITUgAygCtAMhJSADKAKwAyEmIAMoAqwDIScgAygCqAMhC0IBITFBACENIAMoAtwEIgwhDgwSCyABLQDIASEoQQAhKSAfQZcBRw0M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IAUgBzYCCCAFQgQ3AwAgBSADKQOQAjcCFCAFIAg6ACQgBSADLwGABjsAJSAFQRxqIAwpAwA3AgAgBUEnaiADQYIGai0AADoAACADIARBAWoiBDYClAELAkACQAJAAkAgAS0AyAEiBUH+AEcNACABEIcOIAEtAMgBIgVBwABHDQEgA0HoBGogARCsDUEIQRgQ6x8iBUUNCiAFIAMpA+gENwMAIAVBEGogA0HoBGpBEGopAwA3AwAgBUEIaiADQegEakEIaikDADcDAEEAIQcCQAJAIAEtAMkBDQACQCABLQDIASILQfcARg0AIAtB8ABHDQELIAEQhw4gA0HoBGogARBYIAMoAuwEIQsgAygC6AQiB0EyRg0BAkBBOEUNACADQZACakEIaiADQegEakEIakE4/AoAAAsgAyALNgKUAiADIAc2ApACIAdBDkcNBUEEQRQQ6x8iB0UNDCAHIANBkAJqQQRyIgspAgA3AgAgB0EQaiALQRBqKAIANgIAIAdBCGogC0EIaikCADcCAAsgARCiDSILRQ0DIAcQ8R8LIAUQnx0MBgsgASgCxAEhBCABKALAASEGIANBhAJqIAUQ3hsgA0EBNgLsBCADQZjvmwE2AugEIANCATcC9AQgA0GKBa1CIIZB6pabAa2ENwOABiADIANBgAZqNgLwBCADQZACaiADQegEahCNFSADQaQCaiADQYwCaigCADYCACADIAMpAoQCNwKcAiAGIAQgA0GQAmoQhRUhCyABLQDIAUGiAUcNBSABEMcRIQQgARCHDiABIAQQ5REMBQsgA0HoBGpBBHIgBRDeGyADQRA2AvwEIANBmqebATYC+AQgA0GwgICAeDYC6AQgASgCwAEgASgCxAEgA0HoBGoQhRUhCyABLQDIAUGiAUcNBCABEMcRIQQgARCHDiABIAQQ5REMBAsgASgCvAEhCCADKAKQASEMIAMoAowBIQtBACEBIAYhDQwFC0Gyo5sBQShB7KubARDdFwALIAEoAsQBIQUgASgCwAEhBiADQdABaiAEEN4bIANBATYC7AQgA0GY75sBNgLoBCADQgE3AvQEIANBigWtQiCGQbynmwGthDcD2AUgAyADQdgFajYC8AQgA0GQAmogA0HoBGoQjRUgA0GkAmogA0HYAWooAgA2AgAgAyADKQLQATcCnAIgBiAFIANBkAJqEIUVIQsgAS0AyAFBogFHDQAgARDHESEEIAEQhw4gASAEEOURCyADKQOABhDGHQtBCiEBCyADQYwBahDZHQJAIAFBCkcNACALIQQMBAsLIAAgCjoAISAAIAk6ACAgACAHNgIcIAAgCDYCGCAAIA02AhQgACAFNgIQIAAgBDYCDCAAIAw2AgggACALNgIEIAAgATYCACACEMwdDAMLIAEoAsABIQsgARCHDgJAAkACQAJAAkAgAS0AyAEiBUGjAUcNAEEJIQUgASgCcBCBGyEEDAELIAEvAYABIgZBgMAAcSEEAkACQCAFQfwARw0AIARFDQAgASgCwAEhBCABEIcOIANBgAZqIAIQkQggA0HoBGogASAEIANBgAZqEMMBQQkhBSADKALsBCEEIAMoAugEIgZBCUYNASADQdACakEgaiADQegEakEgaikDADcDACADQdACakEYaiADQegEakEYaikDADcDACADQdACakEQaiADQegEakEQaikDADcDACADIAMpA/AENwPYAiADIAQ2AtQCIAMgBjYC0AICQCAGQQhGDQAgA0GkA2ogA0HvAmotAAA6AAAgAyADLwHqAjsBpgMgAyADLwDtAjsBogMgAygC3AIiCkEIdiENIAEoArwBIQFBASEFIAMpA/ACITAgAy0A7AIhDiADLQDpAiEIIAMtAOgCIQIgAygC5AIhCSADKALgAiEHIAMoAtgCISIgBCEMDAMLIANB0AJqEIMfIAEvAYABIgZBgMAAcSEECwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgBEUNAAJAAkACQCABLQDIASIEQbV/aiIFQR9LDQBBASAFdEGBgIKQeHENAQsgBEG0f2pB/wFxQdUATw0BCyAEIAEQiAshMCADQagDakEIaiIEIAIQkQggAyAwNwOoAwJAAkACQCABLQCBAUEgcUUNACABKAJ4IQIgA0HoBGogARD/AiABIAJBAXI2AnggA0GABmogASABKALAASAEIDBBARCKBCADKAKEBiEEAkAgAygCgAYiBUEJRw0AIAMgBDYC3AUgA0EJNgLYBSABIANB6ARqEPAFIANBCDYC+AIgA0HYBWpBBHIQ3x0MAwsgA0HYBWpBIGogA0GABmpBIGopAwA3AwAgA0HYBWpBGGogA0GABmpBGGopAwA3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IAMoApQCIQwMAgsgASgCvAEhCiABKAK4ASEHQQAhI0EAIQZBACECDAQLIAMtAIEFIQggAy0AgAUhAiADKAL8BCEJIAMoAvgEIQcgAygC8AQhIiADLQCEBSEOIAMpA4gFITAgAygCkAUhCyADKAKUBSEBIAQhDAsMCQtBCSEFDAgLQQkhBQwGCyABLQDIASEECwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAEQf8BcUEYRw0AIAEoAsABIQggA0HoBGogAUEAEO4CIAMoAuwEIQQgAygC6AQiCUGAgICAeEYNCSADIAMoAvAENgKIBiADIAQ2AoQGIAMgCTYCgAYgAygCeA0BIANB8ABqEMwdIANB8ABqQQhqIANBgAZqQQhqKAIANgIAIAMgAykCgAY3A3AgAS0AyAEhBAsgAiAEQf8BcUHQAEdyRQ0BIAIgBEH/AXFB+ABHckUNAgwDCyABKAK8ASECIANBtYGAgHg2AugEIAggAiADQegEahCFFSEEAkAgAS0AyAFBogFHDQAgARDHESECIAEQhw4gASACEOURCyADQYAGahDMHQwHC0EAIQUgA0HoBGogASABKALAASADQfAAakEAENgFIAMoAuwEIQQgAygC6AQiBkEIRg0bIANBpANqIANBhwVqLQAAOgAAIAMgAy8BggU7AaYDIAMgAy8AhQU7AaIDIAMtAIEFIQggAy0AgAUhAiADKAL8BCEJIAMoAvgEIQcgAygC9AQhCiADKALwBCEiIAMtAIQFIQ4gAykDiAUhMAwDCyABEKILQf8BcUHdAEcNACABEKILGiABKAKYAUELRg0AIAEtALEBQQFxDQAgA0HoBGogASADQfAAahCWCyADKALsBCEEIAMoAugEIgZBCEYNGiADQaQDaiADQYcFai0AADoAACADIAMvAYIFOwGmAyADIAMvAIUFOwGiAwwBCwJAAkACQAJAIAIgAS0AyAEiBEH/AXFB3QBHckUNACACDQcCQCABLQCBAUEgcUUNACAEQf8BcUHRAEcNACABEKILQf8BcUH9AEYNAyABLQDIASEECyAEQf8BcSIEQdEARg0DIARB4gBGDQEgBEHtAEYNAwwHCyADQYAGakEIaiADQfAAakEIaigCADYCACADIAMpA3A3A4AGIANB6ARqIAEg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eDYC6AQgAyAwNwPwBCABIAcgCiADQegEahCvGgwBCyAFKAIUIQogBSgCECEFIANB8YCAgHg2AugEIAEgBSAKIANB6ARqEK8aDAALCyABKALEASECIAEoAsABIQYgA0G4BGogBRDeGyADQQE2AuwEIANBmO+bATYC6AQgA0IBNwL0BCADQYoFrUIghkG8p5sBrYQ3A9gFIAMgA0HYBWo2AvAEIANBgAZqIANB6ARqEI0VIANBlAZqIANBwARqKAIANgIAIAMgAykCuAQ3AowGIAYgAiADQYAGahCFFSEIIAEtAMgBQaIBRw0FIAEQxxEhAiABEIcOIAEgAhDlEQwFCyABEIcOIBEhFyATIRogHyEbICghFCAGIRUMAAsLIAhBACAHGyEJIAEoArwBIgpBCHYhDUECIQUgAygCyAEhDCADKALEASEGIAMoAsABIQgMAwsgASgCxAEhAiABKALAASEFIANBoARqIAYQ3hsgA0EBNgLsBCADQZjvmwE2AugEIANCATcC9AQgA0GKBa1CIIZB7KGbAa2ENwPYBSADIANB2AVqNgLwBCADQYAGaiADQegEahCNFSADQZQGaiADQagEaigCADYCACADIAMpAqAENwKMBiAFIAIgA0GABmoQhRUhCCABLQDIAUGiAUcNASABEMcRIQIgARCHDiABIAIQ5REMAQsgJCEOCyADQcABahDXHUEJIQULICKtQiCGITAgBK0hMSALISILAkAgDg0AICNBAkYNACAwIDGEEMYdCyAIIQQMBAsgBUGkAUYNASAGQbR/akH/AXFB1ABLDQELIAEQhw5BASECCyADQegEaiABEMMLIAMoAvAEIQQCQCADKQPoBCIwUEUNAEEJIQUMAgsgAygC9AQhBSADQQA2AvgEIAMgBTYC9AQgAyAENgLwBCADQQA6APwEIAMgMDcD6AQgA0HgAGogASALIANB6ARqQQEgAhDfAkEJQQYgAygCYEEBcRshBSADKAJkIQQMAQsLIANB8ABqEMwdCyAFQQlHDQELIABBCjYCACAAIAQ2AgQMAwsgACAIOgAhIAAgAjoAICAAIAk2AhwgACAHNgIYIAAgIjYCECAAIAw2AgwgACAGNgIIIAAgBDYCBCAAIAU2AgAgACAOOgAkIAAgAy8BpgM7ASIgACADLwGiAzsAJSAAIAE2AjQgACALNgIwIAAg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IAJAIANFDQACQCABKAIADQAgAUEYaiEMIAEoAiAiBEE4bCEIIAEoAhwhB0EAIQYCQANAIAggBkYNASAHIAZqIQUgBkE4aiEGIAUoAgBBempBBEkNAAwDCwsCQCAEIAwoAgBHDQAgDEHc8ZoBEIQXIAEoAhwhBwsgByAEQThsaiIGQgA3AxggBiAKNgIUIAYgCTYCECAGQgg3AwggBkICNwMAIAZBIGpBADoAACABIARBAWo2AiAMAQtBzPGaARCbIAALIAJBsAdqJAALymkCMH8GfiMAQaACayICJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAEoAgAiA0F0aiIEQQcgBEEmSRsOJgQAAQIDBQYHCAkKCwwNDg8QERITFBUWFxgZGhsrKikoJyYlJCMiBAsgASgCCCEDIAEoAhQhBSABKAIQIQYgAkGAAWogASgCDCIHQQRBEBDMDSACKAKEASEIIAIoAoABQQFGDSAgAigCiAEhCQJAIAhFDQAgB0EEdCEKIAkhBCAIIQsDQCAKRQ0BAkAgAygCACIMQQJGDQBBAC0AwPGdARogA0EEaikCACEyQcAAEIUBIgFFDTUgAkGAAWogA0EMaigCABBEIAFBOGogAkGAAWpBOGopAwA3AwAgAUEwaiACQYABakEwaikDADcDACABQShqIAJBgAFqQShqKQMANwMAIAFBIGogAkGAAWpBIGopAwA3AwAgAUEYaiACQYABakEYaikDADcDACABQRBqIAJBgAFqQRBqKQMANwMAIAFBCGogAkGAAWpBCGopAwA3AwAgASACKQOAATcDAAsgA0EQaiEDIAQgDDYCACAEQQxqIAE2AgAgBEEEaiAyNwIAIApBcGohCiAEQRBqIQQgC0F/aiILDQALCyAAIAU2AhQgACAGNgIQIAAgBzYCDCAAIAk2AgggACAINgIEIABBDTYCAAwzCyABKAIIIQMgASgCFCENIAEoAhAhDiACQYABaiABKAIMIgVBBEEMEMwNIAIoAoQBIQkgAigCgAFBAUYNHiACKAKIASEGAkAgCUUNACAFQQxsIQogBiEEIAkhDANAIApFDQECQAJAIAMoAgAiBw0AQQAtAMDxnQEaQfAAEIUBIgtFDTUgAkGAAWogA0EEaigCABDtAQJAQfAARQ0AIAsgAkGAAWpB8AD8CgAAC0EAIQEMAQtBAC0AwPGdARogA0EIaigCACEIIANBBGooAgAhC0HAABCFASIBRQ00IAJBgAFqIAcQRCABQThqIAJBgAFqQThqKQMANwMAIAFBMGogAkGAAWpBMGopAwA3AwAgAUEoaiACQYABakEoaikDADcDACABQSBqIAJBgAFqQSBqKQMANwMAIAFBGGogAkGAAWpBGGopAwA3AwAgAUEQaiACQYABakEQaikDADcDACABQQhqIAJBgAFqQQhqKQMANwMAIAEgAikDgAE3AwALIANBDGohAyAEIAE2AgAgBEEIaiAINgIAIARBBGogCzYCACAKQXRqIQogBEEMaiEEIAxBf2oiDA0ACwsgACANNgIUIAAgDjYCECAAIAU2AgwgACAGNgIIIAAgCTYCBCAAQQ42AgAMMgsCQAJAIAEtABwiA0ECRw0ADAELIAEoAhghDCABKAIUIQsgASgCECEKIAEpAwgiMkIDg0IAUg0AIDKnIgQgBCgCACIEQQFqNgIAIARBf0wNMQtBAC0AwPGdARpByAAQhQEiBEUNMCAEIAEoAiAQ/AEgACAENgIgIAAgAzoAHCAAIAw2AhggACALNgIUIAAgCjYCECAAIDI3AwggAEEPNgIADDELQQAtAMDxnQEaIAEtABAhAyABKAIMIQogASgCCCELQcAAEIUBIgRFDS8gBCABKAIEEEQgACADOgAQIAAgCjYCDCAAIAs2AgggACAENgIEIABBEDYCAAwwCyAAIAEpAwA3AwAgAEE4aiABQThqKQMANwMAIABBMGogAUEwaikDADcDACAAQShqIAFBKGopAwA3AwAgAEEgaiABQSBqKQMANwMAIABBGGogAUEYaikDADcDACAAQRBqIAFBEGopAwA3AwAgAEEIaiABQQhqKQMANwMADC8LQQAtAMDxnQEaIAEtABEhAyABLQAQIQogASgCCCELIAEoAgQhDEHAABCFASIERQ0tIAQgASgCDBBEIAAgAzoAESAAIAo6ABAgACAENgIMIAAgCzYCCCAAIAw2AgQgAEERNgIADC4LQQAtAMDxnQEaIAEtABQhCiABKAIQIQsgASgCDCEMQcAAEIUBIgRFDSwgBCABKAIEEERBAC0AwPGdARpBwAAQhQEiA0UNLCADIAEoAggQRCAAIAo6ABQgACALNgIQIAAgDDYCDCAAIAM2AgggACAENgIEIABBEjYCAAwtCyABLQA8IQogASgCNCELIAEoAjAhDAJAIANBC0cNAAJAAkACQCABKAIEDgMAAQIACyACQYABaiABQQhqEIkGIAJBOGpBCGogAkGUAWopAgA3AwAgAiACKQKMATcDOCACKAKIASEIIAIpA4ABITJBACEHDC0LIAJBgAFqIAFBCGoQ7QsgAkE4akEIaiACQZQBaikCADcDACACIAIpAowBNwM4IAIoAogBIQggAikDgAEhMkEBIQcMLAsgAkHAAGogAUEcaikCADcDACACIAEpAhQ3AzggASgCECEIIAEpAwghMkECIQcMKwsCQAJAAkACQAJAAkACQAJAAkACQAJAIAMOCwABAgMEBQYHCAkKAAsgAkGAAWogAUEIahDuCyACQRhqQQhqIAJBlAFqKQIANwMAIAJBKGogAkGcAWooAgA2AgAgAiACKQKMATcDGAwyCyACQYABaiABQQhqEIIKIAJBGGpBCGogAkGUAWopAgA3AwAgAkEoaiACQZwBaikCADcDACACQTBqIAJBpAFqKAIANgIAIAIgAikCjAE3AxgMMQsgAkGAAWogAUEIahD9CyACQRhqQQhqIAJBlAFqKQIANwMAIAJBKGogAkGcAWopAgA3AwAgAkEwaiACQaQBaigCADYCACACIAIpAowBNwMYDDALIAJBgAFqIAFBBGoQgRgMLgsgAkGAAWogAUEEahCNBAwsCyACQYABaiABQQRqEJYSDCsLIAJBgAFqIAFBBGoQlhIMKgsgAkGAAWogAUEEahCBGAwqCyACQYABaiABQQRqEJYSDCgLIAJBgAFqIAFBBGoQ4hAMJwsgAkEgaiABQRxqKQIANwMAIAJBKGogAUEkaikCADcDACACQTBqIAFBLGooAgA2AgAgAiABKQIUNwMYIAEoAhAhCCABKQMIITIgASgCBCEHDCkLQQAtAMDxnQEaIAEoAiQhCiABKAIgIQtBwAAQhQEiBEUNKiAEIAEoAigQRAJAAkACQAJAIAEoAggiBw4DAAECAAsgASgCFCEDIAEoAhAhDCABKAIcIQggASgCGCEJAkAgASkDECIyQgODQgBSDQAg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DAJAIAIoAoABQQFGDQAgHEEIdCAaQf8BcXKtQiCGITIgF60hMyACKAKIASEFAkAgDEUNACAHQShsIQMgBSEBIAwhCwNAIANFDQEgAkGAAWogBBCEByABQSBqIAJBgAFqQSBqKQMANwMAIAFBGGogAkGAAWpBGGopAwA3AwAgAUEQaiACQYABakEQaikDADcDACABQQhqIAJBgAFqQQhqKQMANwMAIAEgAikDgAE3AwAgAUEoaiEBIANBWGohAyAEQShqIQQgC0F/aiILDQALCyAyIDOEITJBBiEBAkAgCS0APEEGRg0AIAkoAgwhAyAJKAIIIQQgAkGAAWogCUEQahCIBiACQdAAakEoaiACQYABakEoaigCADYCACACQdAAakEgaiACQYABakEgaikDADcDACACQdAAakEYaiACQYABakEYaikDADcDACACQdAAakEQaiACQYABakEQaikDADcDACACQdAAakEIaiACQYABakEIaikDADcDACACQc4AaiACQa8Bai0AADoAACACIAIpA4ABNwNQIAIgAi8ArQE7AUwgAi0ArAEhAQsgCiADNgIMIAogBDYCCCAKIBU2AgQgCiAWNgIAIAogAikDUDcDECAKIAE6ADwgCiACLwFMOwA9IApBGGogAkHYAGopAwA3AwAgCkEgaiACQeAAaikDADcDACAKQShqIAJB0ABqQRhqKQMANwMAIApBMGogAkHQAGpBIGopAwA3AwAgCkE4aiACQdAAakEoaigCADYCACAKQT9qIAJBzABqQQJqLQAAOgAAIAogGzoAbCAKIB02AmggCiAeNgJkIAogHzYCYCAKICA2AlwgCiAhNgJYIAogMjcDUCAKIBg2AkwgCiAZNgJIIAogNDcDQCAKIAY6AIgBIAogBzYCmAEgCiAFNgKUASAKIAw2ApABIAogJTYChAEgCiATNgKAASAKICY2AnwgCiAINgJ4IAogIzYCdCAKICQ2AnAgCiACLwFIOwBtIApB7wBqIAJByABqQQJqLQAAOgAAIAAgCjYCBCAAQSc2AgAMGgsgDCACKAKIAUGIn5oBEKoeAAsgJiACKAKIAUGIn5oBEKoeAAsgCSACKAKIAUGIn5oBEKoeAAsgByACKAKIAUGIn5oBEKoeAAsgCCACKAKIAUGIn5oBEKoeAAsgDCACKAKIAUGIn5oBEKoeAAsg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AhwhCSABKAIYIQUgASgCFCEGIAEoAhAhDSACQYABaiABKAIMIghBCEEoEMwNIAIoAoQBIQwCQCACKAKAAUEBRg0AIAIoAogBIQcCQCAMRQ0AIAhBKGwhCiAHIQQgDCELA0AgCkUNASACQYABaiADEIQHIARBIGogAkGAAWpBIGopAwA3AwAgBEEYaiACQYABakEYaikDADcDACAEQRBqIAJBgAFqQRBqKQMANwMAIARBCGogAkGAAWpBCGopAwA3AwAgBCACKQOAATcDACAKQVhqIQogBEEoaiEEIANBKGohAyALQX9qIgsNAAsLIAAgCTYCHCAAIAU2AhggACAGNgIUIAAgDTYCECAAIAg2AgwgACAHNgIIIAAgDDYCBCAAQSg2AgAgACABKQMgNwMgDAkLIAwgAigCiAFBiJ+aARCqHgALIAEoAhQhESABKAIQIQ0LIAEoAgghAyACQYABaiABKAIMIglBBEEQEMwNIAIoAoQBIQcCQCACKAKAAUEBRg0AIAIoAogBIQUCQCAHRQ0AIAlBBHQhCyAFIQogByEMA0AgC0UNAUEALQDA8Z0BGiADKQIEITIgAygCACEIQcAAEIUBIgRFDQggAkGAAWogAygCDBBEIARBOGogAkGAAWpBOGopAwA3AwAgBEEwaiACQYABakEwaikDADcDACAEQShqIAJBgAFqQShqKQMANwMAIARBIGogAkGAAWpBIGopAwA3AwAgBEEYaiACQYABakEYaikDADcDACAEQRBqIAJBgAFqQRBqKQMANwMAIARBCGogAkGAAWpBCGopAwA3AwAgBCACKQOAATcDACAKQQxqIAQ2AgAgCkEEaiAyNwIAIAogCDYCACALQXBqIQsgCkEQaiEKIANBEGohAyAMQX9qIgwNAAsLAkACQCABKAIoDQBBACEBDAELIAFBKGoQgwohAQsgACACLwEYOwAZIABBG2ogAkEaai0AADoAACAAIAE2AiggACAONgIkIAAgDzYCICAAIBA2AhwgACAGOgAYIAAgETYCFCAAIA02AhAgACAJNgIMIAAgBTYCCCAAIAc2AgQgAEEXNgIADAcLIAcgAigCiAFBiJ+aARCqHgALIAIoAowBIQggAikChAEhMiACKAKAASEHDAILIAIpAoQBITIgAigCgAEhBwwBCyACKAKIASEIIAIpA4ABITILIAJB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AykDuAEiDUL/AYNCBFINAQsgA0G4AWogAUEEaiACENogAkAgAy0AuAFBBEYNACADKQO4ASINQv8Bg0IEUg0BCyADQbgBaiACEOIOAkAgAy0AuAFBBEYNACADKQO4ASINQv8Bg0IEUg0BCyADQQA2AsgBIANBuAFqIAIgA0HIAWpBosSbAUECELkMAkAgAy0AuAFBBEYNACADKQO4ASINQv8Bg0IEUg0BCyADQbgBaiACEOIOAkAgAy0AuAFBBEYNACADKQO4ASINQv8Bg0IEUg0BCyADQbgBaiACIANByAFqQd6WmwFBBRC5DCADLQC4AUEERg0XIAMpA7gBIg1C/wGDQgRRDRcLIA1C/wGDQgRRDRYgACANNwIADBcLIANByAFqIAFBBGogAhCCCSADLQDIAUEERg0VIAMpA8gBIg1C/wGDQgRRDRUgACANNwIADBYLIANByAFqIAFBBGogAhDbCSADLQDIAUEERg0UIAMpA8gBIg1C/wGDQgRRDRQgACANNwIADBULIANByAFqIAFBBGogAhD9ASADLQDIAUEERg0TIAMpA8gBIg1C/wGDQgRRDRMgACANNwIADBQLIANByAFqIAEoAgQgAhDcFCADLQDIAUEERg0SIAMpA8gBIg1C/wGDQgRRDRIgACANNwIADBMLIANByAFqIAFBCGogAhCrDCADLQDIAUEERg0RIAMpA8gBIg1C/wGDQgRRDREgACANNwIADBILIANByAFqIAFBCGogAhD3CSADLQDIAUEERg0QIAMpA8gBIg1C/wGDQgRRDRAgACANNwIADBELIANByAFqIAFBBGogAhDXByADLQDIAUEERg0PIAMpA8gBIg1C/wGDQgRRDQ8gACANNwIADBALIANByAFqIAIgASgCCCIFQQAQlQICQAJAIAMtAMgBQQRGDQAgAykDyAEiDUL/AYNCBFINAQsCQCAFRQ0AIANByAFqIAIgBRC0GiADLQDIAUEERg0AIAMpA8gBIg1C/wGDQgRSDQELIANBADYCyAEgA0G4AWogAiADQcgBakGEy5sBQQUQuQwCQCADLQC4AUEERg0AIAMpA7gBIg1C/wGDQgRSDQELIANByAFqIAIQ4g4CQCADLQDIAUEERg0AIAMpA8gBIg1C/wGDQgRSDQELIANByAFqIAFBBGogAhDaICADLQDIAUEERg0PIAMp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BCAAQQhqIgEQtQwgAigCgAlBMkYNHCAAEMkBIABBOGogAkGACWpBOGopAwA3AwAgAEEwaiACQYAJakEwaikDADcDACAAQShqIAJBgAlqQShqKQMANwMAIABBIGogAkGACWpBIGopAwA3AwAgAEEYaiACQYAJakEYaikDADcDACAAQRBqIAJBgAlqQRBqKQMANwMAIAEgAkGACWpBCGopAwA3AwAgACACKQOACTcDAAwcCyAAKAIEIgAoAgAiA0EaRw0YIAJBwAhqIAEoAgAgASgCBCAAQQhqIgEQtQwgAigCwAhBMkYNGyAAEMkBIABBOGogAkHACGpBOGopAwA3AwAgAEEwaiACQcAIakEwaikDADcDACAAQShqIAJBwAhqQShqKQMANwMAIABBIGogAkHACGpBIGopAwA3AwAgAEEYaiACQcAIakEYaikDADcDACAAQRBqIAJBwAhqQRBqKQMANwMAIAEgAkHACGpBCGopAwA3AwAgACACKQPACDcDAAwbCyAAKAIEIgAoAgAiA0EaRw0XIAJBgAhqIAEoAgAgASgCBCAAQQhqIgEQtQwgAigCgAhBMkYNGiAAEMkBIABBOGogAkGACGpBOGopAwA3AwAgAEEwaiACQYAIakEwaikDADcDACAAQShqIAJBgAhqQShqKQMANwMAIABBIGogAkGACGpBIGopAwA3AwAgAEEYaiACQYAIakEYaikDADcDACAAQRBqIAJBgAhqQRBqKQMANwMAIAEgAkGACGpBCGopAwA3AwAgACACKQOACDcDAAwaCyAAKAIEIgAoAgAiA0EaRw0WIAJBwAdqIAEoAgAgASgCBCAAQQhqIgEQtQwgAigCwAdBMkYNGSAAEMkBIABBOGogAkHAB2pBOGopAwA3AwAgAEEwaiACQcAHakEwaikDADcDACAAQShqIAJBwAdqQShqKQMANwMAIABBIGogAkHAB2pBIGopAwA3AwAgAEEYaiACQcAHakEYaikDADcDACAAQRBqIAJBwAdqQRBqKQMANwMAIAEgAkHAB2pBCGopAwA3AwAgACACKQPABzcDAAwZCyAAKAIEIgAoAgAiA0EaRw0VIAJBgAdqIAEoAgAgASgCBCAAQQhqIgEQtQwgAigCgAdBMkYNGCAAEMkBIABBOGogAkGAB2pBOGopAwA3AwAgAEEwaiACQYAHakEwaikDADcDACAAQShqIAJBgAdqQShqKQMANwMAIABBIGogAkGAB2pBIGopAwA3AwAgAEEYaiACQYAHakEYaikDADcDACAAQRBqIAJBgAdqQRBqKQMANwMAIAEgAkGAB2pBCGopAwA3AwAgACACKQOABzcDAAwYCyAAKAIEIgAoAgAiA0EaRw0UIAJBwAZqIAEoAgAgASgCBCAAQQhqIgEQtQwgAigCwAZBMkYNFyAAEMkBIABBOGogAkHABmpBOGopAwA3AwAgAEEwaiACQcAGakEwaikDADcDACAAQShqIAJBwAZqQShqKQMANwMAIABBIGogAkHABmpBIGopAwA3AwAgAEEYaiACQcAGakEYaikDADcDACAAQRBqIAJBwAZqQRBqKQMANwMAIAEgAkHABmpBCGopAwA3AwAgACACKQPABjcDAAwXCyAAKAIMIQMgACgCCCEAIAIgATYCgA8gA0UNFiADQShsIQEDQCACQYAPaiAAELwDIABBKGohACABQVhqIgENAAwXCwsgACgCBCABEJQBDBULIAAtADRBAkcNFCAAQQhqIQEDQCABKAIYIgEtACxBAkYNAAwVCwsgACgCBCIAKAIAIgNBGkcNECACQYAGaiABKAIAIAEoAgQgAEEIaiIBELUMIAIoAoAGQTJGDRMgABDJASAAQThqIAJBgAZqQThqKQMANwMAIABBMGogAkGABmpBMGopAwA3AwAgAEEoaiACQYAGakEoaikDADcDACAAQSBqIAJBgAZqQSBqKQMANwMAIABBGGogAkGABmpBGGopAwA3AwAgAEEQaiACQYAGakEQaikDADcDACABIAJBgAZqQQhqKQMANwMAIAAgAikDgAY3AwAMEwsgACgCBCIAKAIAIgNBGkcNDyACQcAFaiABKAIAIAEoAgQgAEEIaiIBELUMIAIoAsAFQTJGDRIgABDJASAAQThqIAJBwAVqQThqKQMANwMAIABBMGogAkHABWpBMGopAwA3AwAgAEEoaiACQcAFakEoaikDADcDACAAQSBqIAJBwAVqQSBqKQMANwMAIABBGGogAkHABWpBGGopAwA3AwAgAEEQaiACQcAFakEQaikDADcDACABIAJBwAVqQQhqKQMANwMAIAAgAikDwAU3AwAMEgsgACgCDCIARQ0RIAEgABCbDAwRCwJAIAAoAiAiBkEIaigCACIARQ0AIAZBBGooAgAhAyAAQQxsIQQDQAJAAkAgAygCACIAKAIAQRpHDQAgAkGADmogASgCACABKAIEIABBCGoiBRC1DCACKAKADkEyRg0BIAAQyQEgAEE4aiACQYAOakE4aikDADcDACAAQTBqIAJBgA5qQTBqKQMANwMAIABBKGogAkGADmpBKGopAwA3AwAgAEEgaiACQYAOakEgaikDADcDACAAQRhqIAJBgA5qQRhqKQMANwMAIABBEGogAkGADmpBEGopAwA3AwAgBSACQYAOakEIaikDADcDACAAIAIpA4AONwMADAELIAAgARBGCyADQQxqIQMgBEF0aiIEDQALCwJAIAZBFGooAgAiA0UNACAGQRBqKAIAIQAgA0HYAGwhAwNAIAAgARBoIABB2ABqIQAgA0Gof2oiAw0ACwsgBigCMCIARQ0QIAAoAgAiA0EaRw0NIAJBwAtqIAEoAgAgASgCBCAAQQhqIgEQtQwgAigCwAtBMkYNECAAEMkBIABBOGogAkHAC2pBOGopAwA3AwAgAEEwaiACQcALakEwaikDADcDACAAQShqIAJBwAtqQShqKQMANwMAIABBIGogAkHAC2pBIGopAwA3AwAgAEEYaiACQcALakEYaikDADcDACAAQRBqIAJBwAtqQRBqKQMANwMAIAEgAkHAC2pBCGopAwA3AwAgACACKQPACzcDAAwQCwJAIAAoAgwiBEUNACAAKAIIIQMgBEEobCEEA0AgAyABEJcDIANBKGohAyAEQVhqIgQNAAsLAkAgACgCECIAKAIAQYCAgIB4Rw0AIABBBGogARCGDAwQCyAAKAIIIgNFDQ8gACgCBCEAIANBMGwhAwNAIAAgARBvIABBMGohACADQVBqIgMNAAwQCwsCQAJAIAAoAgQiAygCAEEaRw0AIAJBgAVqIAEoAgAgASgCBCADQQhqIgQQtQwgAigCgAVBMkYNASADEMkBIANBOGogAkGABWpBOGopAwA3AwAgA0EwaiACQYAFakEwaikDADcDACADQShqIAJBgAVqQShqKQMANwMAIANBIGogAkGABWpBIGopAwA3AwAgA0EYaiACQYAFakEYaikDADcDACADQRBqIAJBgAVqQRBqKQMANwMAIAQgAkGABWpBCGopAwA3AwAgAyACKQOABTcDAAwBCyADIAEQRgsgACgCCCIAQQhqKAIAIgRFDQ4gAEEEaigCACEDIARBAnQhBANAAkACQCADKAIAIgAoAgBBGkcNACACQYALaiABKAIAIAEoAgQgAEEIaiIFELUMIAIoAoALQTJGDQEgABDJASAAQThqIAJBgAtqQThqKQMANwMAIABBMGogAkGAC2pBMGopAwA3AwAgAEEoaiACQYALakEoaikDADcDACAAQSBqIAJBgAtqQSBqKQMANwMAIABBGGogAkGAC2pBGGopAwA3AwAgAEEQaiACQYALakEQaikDADcDACAFIAJBgAtqQQhqKQMANwMAIAAgAikDgAs3AwAMAQsgACABEEYLIANBBGohAyAEQXxqIgQNAAwPCwsgACgCDCIERQ0NIAAoAgghAyAEQQJ0IQQDQAJAAkAgAygCACIAKAIAQRpHDQAgAkHACmogASgCACABKAIEIABBCGoiBRC1DCACKALACkEyRg0BIAAQyQEgAEE4aiACQcAKakE4aikDADcDACAAQTBqIAJBwApqQTBqKQMANwMAIABBKGogAkHACmpBKGopAwA3AwAgAEEgaiACQcAKakEgaikDADcDACAAQRhqIAJBwApqQRhqKQMANwMAIABBEGogAkHACmpBEGopAwA3AwAgBSACQcAKakEIaikDADcDACAAIAIpA8AKNwMADAELIAAgARBGCyADQQRqIQMgBEF8aiIEDQAMDgsLIAAoAgwiBEUNDCAAKAIIIQMgBEECdCEEA0ACQAJAIAMoAgAiACgCAEEaRw0AIAJBgApqIAEoAgAgASgCBCAAQQhqIgUQtQwgAigCgApBMkYNASAAEMkBIABBOGogAkGACmpBOGopAwA3AwAgAEEwaiACQYAKakEwaikDADcDACAAQShqIAJBgApqQShqKQMANwMAIABBIGogAkGACmpBIGopAwA3AwAgAEEYaiACQYAKakEYaikDADcDACAAQRBqIAJBgApqQRBqKQMANwMAIAUgAkGACmpBCGopAwA3AwAgACACKQOACjcDAAwBCyAAIAEQRgsgA0EEaiEDIARBfGoiBA0ADA0LCyAAQQRqIQMCQAJAIAAoAhAiACgCAEEaRw0AIAJBwARqIAEoAgAgASgCBCAAQQhqIgQQtQwgAigCwARBMkYNASAAEMkBIABBOGogAkHABGpBOGopAwA3AwAgAEEwaiACQcAEakEwaikDADcDACAAQShqIAJBwARqQShqKQMANwMAIABBIGogAkHABGpBIGopAwA3AwAgAEEYaiACQcAEakEYaikDADcDACAAQRBqIAJBwARqQRBqKQMANwMAIAQgAkHABGpBCGopAwA3AwAgACACKQPABDcDAAwBCyAAIAEQRgsgAygCAEGAgICAeEYNCyABIAMQugoMCwsCQCAALQAYQQVHDQAgASAAKAIQEJsMCyAAKAIMIgNFDQogA0EEdCEEIAAoAghBDGohAwNAAkACQCADKAIAIgAoAgBBGkcNACACQcAJaiABKAIAIAEoAgQgAEEIaiIFELUMIAIoAsAJQTJGDQEgABDJASAAQThqIAJBwAlqQThqKQMANwMAIABBMGogAkHACWpBMGopAwA3AwAgAEEoaiACQcAJakEoaikDADcDACAAQSBqIAJBwAlqQSBqKQMANwMAIABBGGogAkHACWpBGGopAwA3AwAgAEEQaiACQcAJakEQaikDADcDACAFIAJBwAlqQQhqKQMANwMAIAAgAikDwAk3AwAMAQsgACABEEYLIANBEGohAyAEQXBqIgQNAAwLCwsCQAJAIAAoAgQiAygCAEEaRw0AIAJBgARqIAEoAgAgASgCBCADQQhqIgQQtQwgAigCgARBMkYNASADEMkBIANBOGogAkGABGpBOGopAwA3AwAgA0EwaiACQYAEakEwaikDADcDACADQShqIAJBgARqQShqKQMANwMAIANBIGogAkGABGpBIGopAwA3AwAgA0EYaiACQYAEakEYaikDADcDACADQRBqIAJBgARqQRBqKQMANwMAIAQgAkGABGpBCGopAwA3AwAgAyACKQOABDcDAAwBCyADIAEQRgsCQAJAIAAoAggiAygCAEEaRw0AIAJBwANqIAEoAgAgASgCBCADQQhqIgQQtQwgAigCwANBMkYNASADEMkBIANBOGogAkHAA2pBOGopAwA3AwAgA0EwaiACQcADakEwaikDADcDACADQShqIAJBwANqQShqKQMANwMAIANBIGogAkHAA2pBIGopAwA3AwAgA0EYaiACQcADakEYaikDADcDACADQRBqIAJBwANqQRBqKQMANwMAIAQgAkHAA2pBCGopAwA3AwAgAyACKQPAAzcDAAwBCyADIAEQRgsgACgCDCIAKAIAIgNBGkcNBiACQYADaiABKAIAIAEoAgQgAEEIaiIBELUMIAIoAoADQTJGDQkgABDJASAAQThqIAJBgANqQThqKQMANwMAIABBMGogAkGAA2pBMGopAwA3AwAgAEEoaiACQYADakEoaikDADcDACAAQSBqIAJBgANqQSBqKQMANwMAIABBGGogAkGAA2pBGGopAwA3AwAgAEEQaiACQYADakEQaikDADcDACABIAJBgANqQQhqKQMANwMAIAAgAikDgAM3AwAMCQsgACgCCEEBRw0IIAEgAEEMahCHDAwICwJAAkAgACgCKCIDKAIAQRpHDQAgAkHAAmogASgCACABKAIEIANBCGoiBBC1DCACKALAAkEyRg0BIAMQyQEgA0E4aiACQcACakE4aikDADcDACADQTBqIAJBwAJqQTBqKQMANwMAIANBKGogAkHAAmpBKGopAwA3AwAgA0EgaiACQcACakEgaikDADcDACADQRhqIAJBwAJqQRhqKQMANwMAIANBEGogAkHAAmpBEGopAwA3AwAgBCACQcACakEIaikDADcDACADIAIpA8ACNwMADAELIAMgARBGCyAAKAIIQQJJDQcgASAAQQxqEIcMDAcLAkACQCADQQtHDQACQAJAIAAoAgQOAwABAwALIAAoAhAiBEUNAiAAKAIMIQMgBEEobCEEA0ACQCADKAIAQQdGDQAgAyABEJcDCyADQShqIQMgBEFYaiIEDQAMAwsLIAAoAhAiA0UNASAAKAIMIQUgA0E4bCEGQQAhAwNAAkACQAJAAkACQAJAAkAgBSADaiIEKAIADgMAAQIACyAEQQhqKAIAQQNHDQQgBEEMaigCACIHKAIAQRpHDQIgAkGAD2ogASgCACABKAIEIAdBCGoiCBC1DCACKAKAD0EyRg0EIAcQyQEgB0E4aiACQYAPakE4aikDADcDACAHQTBqIAJBgA9qQTBqKQMANwMAIAdBKGogAkGAD2pBKGopAwA3AwAgB0EgaiACQYAPakEgaikDADcDACAHQRhqIAJBgA9qQRhqKQMANwMAIAdBEGogAkGAD2pBEGopAwA3AwAgCCACQYAPakEIaikDADcDACAHIAIpA4APNwMADAQLIARBMGooAgAiBEUNBCAEKAIAQRpHDQIgAkGAD2ogASgCACABKAIEIARBCGoiBxC1DCACKAKAD0EyRg0EIAQQyQEgBEE4aiACQYAPakE4aikDADcDACAEQTBqIAJBgA9qQTBqKQMANwMAIARBKGogAkGAD2pBKGopAwA3AwAgBEEgaiACQYAPakEgaikDADcDACAEQRhqIAJBgA9qQRhqKQMANwMAIARBEGogAkGAD2pBEGopAwA3AwAgByACQYAPakEIaikDADcDACAEIAIpA4APNwMADAQLIARBBGooAgAgARCXAwwDCyAHIAEQRgwBCyAEIAEQRgwBCyAEQShqKAIAIAEQlwMLIAYgA0E4aiIDRw0ADAILCwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAw4LFAABAgMEBQYHCBQUCyAAKAIoIgMoAgBBGkcNCCACQcAOaiABKAIAIAEoAgQgA0EIaiIEELUMIAIoAsAOQTJGDRIgAxDJASADQThqIAJBwA5qQThqKQMANwMAIANBMGogAkHADmpBMGopAwA3AwAgA0EoaiACQcAOakEoaikDADcDACADQSBqIAJBwA5qQSBqKQMANwMAIANBGGogAkHADmpBGGopAwA3AwAgA0EQaiACQcAOakEQaikDADcDACAEIAJBwA5qQQhqKQMANwMAIAMgAikDwA43AwAMEgsgACgCCEEBRw0SIAAoAgwiAygCAEEaRw0IIAJBgA9qIAEoAgAgASgCBCADQQhqIgQQtQwgAigCgA9BMkYNEiADEMkBIANBOGogAkGAD2pBOGopAwA3AwAgA0EwaiACQYAPakEwaikDADcDACADQShqIAJBgA9qQShqKQMANwMAIANBIGogAkGAD2pBIGopAwA3AwAgA0EYaiACQYAPakEYaikDADcDACADQRBqIAJBgA9qQRBqKQMANwMAIAQgAkGAD2pBCGopAwA3AwAgAyACKQOADzcDAAwSCyAAKAIEIgMoAgBBGkcNCCACQYAPaiABKAIAIAEoAgQgA0EIaiIEELUMIAIoAoAPQTJGDREgAxDJASADQThqIAJBgA9qQThqKQMANwMAIANBMGogAkGAD2pBMGopAwA3AwAgA0EoaiACQYAPakEoaikDADcDACADQSBqIAJBgA9qQSBqKQMANwMAIANBGGogAkGAD2pBGGopAwA3AwAgA0EQaiACQYAPakEQaikDADcDACAEIAJBgA9qQQhqKQMANwMAIAMgAikDgA83AwAMEQsCQCAAKAIEIgMoAgAiBUEDRw0AIANBBGogARDPBgwRCyADKAIgIgQoAgBBGkcNCCACQcAOaiABKAIAIAEoAgQgBEEIaiIGELUMIAIoAsAOQTJGDQ4gBBDJASAEQThqIAJBwA5qQThqKQMANwMAIARBMGogAkHADmpBMGopAwA3AwAgBEEoaiACQcAOakEoaikDADcDACAEQSBqIAJBwA5qQSBqKQMANwMAIARBGGogAkHADmpBGGopAwA3AwAgBEEQaiACQcAOakEQaikDADcDACAGIAJBwA5qQQhqKQMANwMAIAQgAikDwA43AwAMDgsgACgCBCIDKAIAQRpHDQggAkGAD2ogASgCACABKAIEIANBCGoiBBC1DCACKAKAD0EyRg0PIAMQyQEgA0E4aiACQYAPakE4aikDADcDACADQTBqIAJBgA9qQTBqKQMANwMAIANBKGogAkGAD2pBKGopAwA3AwAgA0EgaiACQYAPakEgaikDADcDACADQRhqIAJBgA9qQRhqKQMANwMAIANBEGogAkGAD2pBEGopAwA3AwAgBCACQYAPakEIaikDADcDACADIAIpA4APNwMADA8LIAAoAgQiAygCAEEaRw0IIAJBgA9qIAEoAgAgASgCBCADQQhqIgQQtQwgAigCgA9BMkYNDiADEMkBIANBOGogAkGAD2pBOGopAwA3AwAgA0EwaiACQYAPakEwaikDADcDACADQShqIAJBgA9qQShqKQMANwMAIANBIGogAkGAD2pBIGopAwA3AwAgA0EYaiACQYAPakEYaikDADcDACADQRBqIAJBgA9qQRBqKQMANwMAIAQgAkGAD2pBCGopAwA3AwAgAyACKQOADzcDAAwOCyAAKAIEIgMoAgBBGkcNCCACQYAPaiABKAIAIAEoAgQgA0EIaiIEELUMIAIoAoAPQTJGDQ0gAxDJASADQThqIAJBgA9qQThqKQMANwMAIANBMGogAkGAD2pBMGopAwA3AwAgA0EoaiACQYAPakEoaikDADcDACADQSBqIAJBgA9qQSBqKQMANwMAIANBGGogAkGAD2pBGGopAwA3AwAgA0EQaiACQYAPakEQaikDADcDACAEIAJBgA9qQQhqKQMANwMAIAMgAikDgA83AwAMDQsgACgCBCIDKAIAQRpHDQggAkGAD2ogASgCACABKAIEIANBCGoiBBC1DCACKAKAD0EyRg0MIAMQyQEgA0E4aiACQYAPakE4aikDADcDACADQTBqIAJBgA9qQTBqKQMANwMAIANBKGogAkGAD2pBKGopAwA3AwAgA0EgaiACQYAPakEgaikDADcDACADQRhqIAJBgA9qQRhqKQMANwMAIANBEGogAkGAD2pBEGopAwA3AwAgBCACQYAPakEIaikDADcDACADIAIpA4APNwMADAwLIAAoAgQiAygCAEEaRw0IIAJBgA9qIAEoAgAgASgCBCADQQhqIgQQtQwgAigCgA9BMkYNCyADEMkBIANBOGogAkGAD2pBOGopAwA3AwAgA0EwaiACQYAPakEwaikDADcDACADQShqIAJBgA9qQShqKQMANwMAIANBIGogAkGAD2pBIGopAwA3AwAgA0EYaiACQYAPakEYaikDADcDACADQRBqIAJBgA9qQRBqKQMANwMAIAQgAkGAD2pBCGopAwA3AwAgAyACKQOADzcDAAwLCyADIAEQRgwJCyADIAEQRgwJCyADIAEQRgwICyAEIAEQRgwFCyADIAEQRgwGCyADIAEQRgwFCyADIAEQRgwECyADIAEQRgwDCyADIAEQRgwCCyAFQQJJDQECQCADKAIEIgMoAgBBGkcNACACQYAPaiABKAIAIAEoAgQgA0EIaiIEELUMIAIoAoAPQTJGDQIgAxDJASADQThqIAJBgA9qQThqKQMANwMAIANBMGogAkGAD2pBMGopAwA3AwAgA0EoaiACQYAPakEoaikDADcDACADQSBqIAJBgA9qQSBqKQMANwMAIANBGGogAkGAD2pBGGopAwA3AwAgA0EQaiACQYAPakEQaikDADcDACAEIAJBgA9qQQhqKQMANwMAIAMgAikDgA83AwAMAgsgAyABEEYMAQsgACgCCEECSQ0AAkAgACgCDCIDKAIAQRpHDQAgAkGAD2ogASgCACABKAIEIANBCGoiBBC1DCACKAKAD0EyRg0BIAMQyQEgA0E4aiACQYAPakE4aikDADcDACADQTBqIAJBgA9qQTBqKQMANwMAIANBKGogAkGAD2pBKGopAwA3AwAgA0EgaiACQYAPakEgaikDADcDACADQRhqIAJBgA9qQRhqKQMANwMAIANBEGogAkGAD2pBEGopAwA3AwAgBCACQYAPakEIaikDADcDACADIAIpA4APNwMADAELIAMgARBGCyAAKAI4IgAoAgAiA0EaRw0DIAJBgAJqIAEoAgAgASgCBCAAQQhqIgEQtQwgAigCgAJBMkYNBiAAEMkBIABBOGogAkGAAmpBOGopAwA3AwAgAEEwaiACQYACakEwaikDADcDACAAQShqIAJBgAJqQShqKQMANwMAIABBIGogAkGAAmpBIGopAwA3AwAgAEEYaiACQYACakEYaikDADcDACAAQRBqIAJBgAJqQRBqKQMANwMAIAEgAkGAAmpBCGopAwA3AwAgACACKQOAAjcDAAwGCwJAAkAgACgCBCIDKAIAQRpHDQAgAkHAAWogASgCACABKAIEIANBCGoiBBC1DCACKALAAUEyRg0BIAMQyQEgA0E4aiACQcABakE4aikDADcDACADQTBqIAJBwAFqQTBqKQMANwMAIANBKGogAkHAAWpBKGopAwA3AwAgA0EgaiACQcABakEgaikDADcDACADQRhqIAJBwAFqQRhqKQMANwMAIANBEGogAkHAAWpBEGopAwA3AwAgBCACQcABakEIaikDADcDACADIAIpA8ABNwMADAELIAMgARBGCyAAKAIIIgAoAgAiA0EaRw0CIAJBgAFqIAEoAgAgASgCBCAAQQhqIgEQtQwgAigCgAFBMkYNBSAAEMkBIABBOGogAkGAAWpBOGopAwA3AwAgAEEwaiACQYABakEwaikDADcDACAAQShqIAJBgAFqQShqKQMANwMAIABBIGogAkGAAWpBIGopAwA3AwAgAEEYaiACQYABakEYaikDADcDACAAQRBqIAJBgAFqQRBqKQMANwMAIAEgAkGAAWpBCGopAwA3AwAgACACKQOAATcDAAwFCyAAKAIMIgAoAgAiA0EaRw0BIAJBwABqIAEoAgAgASgCBCAAQQhqIgEQtQwgAigCQEEyRg0EIAAQyQEgAEE4aiACQcAAakE4aikDADcDACAAQTBqIAJBwABqQTBqKQMANwMAIABBKGogAkHAAGpBKGopAwA3AwAgAEEgaiACQcAAakEgaikDADcDACAAQRhqIAJBwABqQRhqKQMANwMAIABBEGogAkHAAGpBEGopAwA3AwAgASACQcAAakEIaikDADcDACAAIAIpA0A3AwAMBAsgACgCBCIAKAIAIgNBGkcNAAsgAiABKAIAIAEoAgQgAEEIaiIBELUMIAIoAgBBMkYNAiAAEMkBIABBOGogAkE4aikDADcDACAAQTBqIAJBMGopAwA3AwAgAEEoaiACQShqKQMANwMAIABBIGogAkEgaikDADcDACAAQRhqIAJBGGopAwA3AwAgAEEQaiACQRBqKQMANwMAIAEgAkEIaikDADcDACAAIAIpAwA3AwAMAgsCQCAAKAIgIghBCGooAgAiAEUNACAIQQRqKAIAIgYgAEEGdGohBwNAAkAgBkE4aigCACIARQ0AIAZBNGooAgAhAyAAQQxsIQQDQAJAAkAgAygCACIAKAIAQRpHDQAgAkHADWogASgCACABKAIEIABBCGoiBRC1DCACKALADUEyRg0BIAAQyQEgAEE4aiACQcANakE4aikDADcDACAAQTBqIAJBwA1qQTBqKQMANwMAIABBKGogAkHADWpBKGopAwA3AwAgAEEgaiACQcANakEgaikDADcDACAAQRhqIAJBwA1qQRhqKQMANwMAIABBEGogAkHADWpBEGopAwA3AwAgBSACQcANakEIaikDADcDACAAIAIpA8ANNwMADAELIAAgARBGCyADQQxqIQMgBEF0aiIEDQALCyAGIAEQgwQgBkHAAGoiACEGIAAgB0cNAAsLAkAgCEEUaigCACIARQ0AIAhBEGooAgAhAyAAQQxsIQQDQAJAAkAgAygCACIAKAIAQRpHDQAgAkGADWogASgCACABKAIEIABBCGoiBRC1DCACKAKADUEyRg0BIAAQyQEgAEE4aiACQYANakE4aikDADcDACAAQTBqIAJBgA1qQTBqKQMANwMAIABBKGogAkGADWpBKGopAwA3AwAgAEEgaiACQYANakEgaikDADcDACAAQRhqIAJBgA1qQRhqKQMANwMAIABBEGogAkGADWpBEGopAwA3AwAgBSACQYANakEIaikDADcDACAAIAIpA4ANNwMADAELIAAgARBGCyADQQxqIQMgBEF0aiIEDQALCyAIKAIYQYCAgIB4Rg0BIAgoAiAiA0UNASAIKAIcIQAgA0EwbCEDA0AgACABEG8gAEEwaiEAIANBUGoiAw0ADAILCyAAKAIMIgNFDQAgACgCCCIJIANBDGxqIQoDQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAJKAIAIgANAAJAAkACQAJAAkAgCSgCBCIAKAIAIgRBe2oiA0EEIANBBkkbDgYQAAECAwQQCyAAKAIIQQNHDQ4gACgCDCIDKAIAQRpHDQUgAkGAD2ogASgCACABKAIEIANBCGoiBBC1DCACKAKAD0EyRg0OIAMQyQEgA0E4aiACQYAPakE4aikDADcDACADQTBqIAJBgA9qQTBqKQMANwMAIANBKGogAkGAD2pBKGopAwA3AwAgA0EgaiACQYAPakEgaikDADcDACADQRhqIAJBgA9qQRhqKQMANwMAIANBEGogAkGAD2pBEGopAwA3AwAgBCACQYAPakEIaikDADcDACADIAIpA4APNwMADA4LIAAoAigiACgCAEEaRw0FIAJBgA9qIAEoAgAgASgCBCAAQQhqIgMQtQwgAigCgA9BMkYNDiAAEMkBIABBOGogAkGAD2pBOGopAwA3AwAgAEEwaiACQYAPakEwaikDADcDACAAQShqIAJBgA9qQShqKQMANwMAIABBIGogAkGAD2pBIGopAwA3AwAgAEEYaiACQYAPakEYaikDADcDACAAQRBqIAJBgA9qQRBqKQMANwMAIAMgAkGAD2pBCGopAwA3AwAgACACKQOADzcDAAwOCyAAKAIIQQNHDQsgACgCDCIDKAIAQRpHDQUgAkGAD2ogASgCACABKAIEIANBCGoiBBC1DCACKAKAD0EyRg0LIAMQyQEgA0E4aiACQYAPakE4aikDADcDACADQTBqIAJBgA9qQTBqKQMANwMAIANBKGogAkGAD2pBKGopAwA3AwAgA0EgaiACQYAPakEgaikDADcDACADQRhqIAJBgA9qQRhqKQMANwMAIANBEGogAkGAD2pBEGopAwA3AwAgBCACQYAPakEIaikDADcDACADIAIpA4APNwMADAsLIABBIGohAyAEQQNHDQkgACgCBCIEKAIAQRpHDQUgAkGAD2ogASgCACABKAIEIARBCGoiBRC1DCACKAKAD0EyRg0JIAQQyQEgBEE4aiACQYAPakE4aikDADcDACAEQTBqIAJBgA9qQTBqKQMANwMAIARBKGogAkGAD2pBKGopAwA3AwAgBEEgaiACQYAPakEgaikDADcDACAEQRhqIAJBgA9qQRhqKQMANwMAIARBEGogAkGAD2pBEGopAwA3AwAgBSACQYAPakEIaikDADcDACAEIAIpA4APNwMADAkLIAAoAghBA0cNByAAKAIMIgMoAgBBGkcNBSACQcAOaiABKAIAIAEoAgQgA0EIaiIEELUMIAIoAsAOQTJGDQcgAxDJASADQThqIAJBwA5qQThqKQMANwMAIANBMGogAkHADmpBMGopAwA3AwAgA0EoaiACQcAOakEoaikDADcDACADQSBqIAJBwA5qQSBqKQMANwMAIANBGGogAkHADmpBGGopAwA3AwAgA0EQaiACQcAOakEQaikDADcDACAEIAJBwA5qQQhqKQMANwMAIAMgAikDwA43AwAMBwsgACgCAEEaRw0FIAJBwAxqIAEoAgAgASgCBCAAQQhqIgMQtQwgAigCwAxBMkYNCiAAEMkBIABBOGogAkHADGpBOGopAwA3AwAgAEEwaiACQcAMakEwaikDADcDACAAQShqIAJBwAxqQShqKQMANwMAIABBIGogAkHADGpBIGopAwA3AwAgAEEYaiACQcAMakEYaikDADcDACAAQRBqIAJBwAxqQRBqKQMANwMAIAMgAkHADGpBCGopAwA3AwAgACACKQPADDcDAAwKCyADIAEQRgwICyAAIAEQRgwICyADIAEQRgwFCyAEIAEQRgwDCyADIAEQRgwBCyAAIAEQRgwECwJAIAAoAigiC0EIaigCACIARQ0AIAtBBGooAgAiDCAAQQZ0aiENA0ACQCAMQThqKAIAIgBFDQAgDEE0aigCACEDIABBDGwhBANAAkACQCADKAIAIgAoAgBBGkcNACABKAIAQQFHDQEgASgCBCIGIAAoAhhHDQECQAJAIAApAwgiD0IDg0IAUg0AIA+nIgUgBSgCACIFQQFqNgIAIAVBf0wNAQtBAC0AwPGdARogACgCFCEHIAAoAhAhCCAALQAcIQ5BwAAQhQEiBUUNACAFIA46ABwgBSAGNgIYIAVCADcDECAFIA83AwggBUEaNgIAIAAQyQEgACAFNgIoIAAgBzYCJCAAIAg2AiAgAEIANwMYIABCkb4BNwMQIABBADYCCCAAQRQ2AgAMAgsACyAAIAEQRgsgA0EMaiEDIARBdGoiBA0ACwsgDCABEIMEIAxBwABqIgAhDCAAIA1HDQALCwJAIAtBFGooAgAiAEUNACALQRBqKAIAIQMgAEEMbCEEA0ACQAJAIAMoAgAiACgCAEEaRw0AIAJBgA9qIAEoAgAgASgCBCAAQQhqIgUQtQwgAigCgA9BMkYNASAAEMkBIABBOGogAkGAD2pBOGopAwA3AwAgAEEwaiACQYAPakEwaikDADcDACAAQShqIAJBgA9qQShqKQMANwMAIABBIGogAkGAD2pBIGopAwA3AwAgAEEYaiACQYAPakEYaikDADcDACAAQRBqIAJBgA9qQRBqKQMANwMAIAUgAkGAD2pBCGopAwA3AwAgACACKQOADzcDAAwBCyAAIAEQRgsgA0EMaiEDIARBdGoiBA0ACwsgCygCGEGAgICAeEYNAyALQSBqKAIAIgNFDQMgC0EcaigCACEAIANBMGwhAwNAIAAgARBvIABBMGohACADQVBqIgMNAAwECwsCQCADKAIAQQdGDQAgAyABEJcDCyAAKAJoIAEQlwMgACgCSEGAgICAeEYNAiAAKAJQIgNFDQIgACgCTCEAIANBMGwhAwNAIAAgARBvIABBMGohACADQVBqIgMNAAwDCwsgACgCKEGAgICAeEYNASAAKAIwIgNFDQEgACgCLCEAIANBMGwhAwNAIAAgARBvIABBMGohACADQVBqIgMNAAwCCwsCQCAAKAIoIgAoAgBBGkcNACACQcAOaiABKAIAIAEoAgQgAEEIaiIDELUMIAIoAsAOQTJGDQEgABDJASAAQThqIAJBwA5qQThqKQMANwMAIABBMGogAkHADmpBMGopAwA3AwAgAEEoaiACQcAOakEoaikDADcDACAAQSBqIAJBwA5qQSBqKQMANwMAIABBGGogAkHADmpBGGopAwA3AwAgAEEQaiACQcAOakEQaikDADcDACADIAJBwA5qQQhqKQMANwMAIAAgAikDwA43AwAMAQsgACABEEYLIAlBDGoiCSAKRw0ACwsgAkHAD2okAAurbwI8fwJ+IwBB4AprIgIkACACIAEoAkwiAzYCLAJAAkACQAJAIANBAUcNACABLQA8IQQgAS0ANCIDQQNGDQEgA0ECRg0BIAEoAigiBSAFKAIAIgZBAWo2AgAgBkF/TA0DIAEoAjAhBiABKAIsIQcMAgsgAkEANgLoBEEAQYCGmwEgAkEsaiACQegEakH82oMBEJkZAAsLIAEtAF0hCCABLQBbIQkgAS0AWiEKIAEtAFkhCyABLQBYIQwgAS0AVyENIAEtAFYhDiABLQBVIQ8gAS0AVCEQIAEoAlAhESABLQA5IRIgAS0AOCETIAEtAEEh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QEEkRSIBDQAgAkGQBGogE0Ek/AoAAAsgAigCpAUhBCABDRQgAkHgAmogAkGQBGpBJPwKAAAMFAsCQEEkRQ0AIAJBuARqIAJBhANqQST8CgAACyACQegEaiACQdQCaiACQbgEahD0AyACQYAEakEIaiIgIBNBCGopAgA3AwAgAiATKQIANwOABCACKAL8BCEGIAIoAvgEIQcgAigC9AQhASACKALwBCEFIAIoAuwEIQMgAigC6AQiGkEiRg0HIAogCSkCADcCACAKQRBqIAlBEGooAgA2AgAgCkEIaiAJQQhqKQIANwIAIAJB4AJqQQhqIAJBgARqQQhqKQMANwMAIAIgAikDgAQ3A+ACDBILAkBBJEUNACACQbgEaiACQYQDakEk/AoAAAsgAkHoBGogAkHUAmogAkG4BGoQvgIgAkGABGpBCGoiICATQQhqKQIANwMAIAIgEykCADcDgAQgAigC/AQhBiACKAL4BCEHIAIoAvQEIQEgAigC8AQhBSACKALsBCEDIAIoAugEIhpBIkYNByAKIAkpAgA3AgAgCkEQaiAJQRBqKAIANgIAIApBCGogCUEIaikCADcCACACQeACakEIaiACQYAEakEIaikDADcDACACIAIpA4AENwPgAgwRCwJAQSRFDQAgAkG4BGogAkGEA2pBJPwKAAALIAJB6ARqIAJB1AJqIAJBuARqEOUEIAJBgARqQQhqIiAgE0EIaikCADcDACACIBMpAgA3A4AEIAIoAvwEIQYgAigC+AQhByACKAL0BCEBIAIoAvAEIQUgAigC7AQhAyACKALoBCIaQSJGDQcgCiAJKQIANwIAIApBEGogCUEQaigCADYCACAKQQhqIAlBCGopAgA3AgAgAkHgAmpBCGogAkGABGpBCGopAwA3AwAgAiACKQOABDcD4AIMEAsgAkHoBGogAkHUAmoQ3gIgAigCgAUhBiACKAL8BCEHIAIoAvgEISYgAigC9AQhICACKALwBCEDIAIoAuwEIRogAigC6AQhCwJAQSRFIgwNACACQbgEaiAOQST8CgAACyACKAKoBSEEIAtBiYDEAEcNB0EkRQ0QIAJB4AJqIAJBuARqQST8CgAADBALAkBBJEUNACACQbgEaiACQYQDakEk/AoAAAsgAkEDNgLUCiACQegEaiACQdQCaiACQbgEaiACQdQKahCABCACQYAEakEIaiIgIBNBCGopAgA3AwAgAiATKQIANwOABCACKAL8BCEGIAIoAvgEIQcgAigC9AQhASACKALwBCEFIAIoAuwEIQMgAigC6AQiGkEiRg0HIAogCSkCADcCACAKQRBqIAlBEGooAgA2AgAgCkEIaiAJQQhqKQIANwIAIAJB4AJqQQhqIAJBgARqQQhqKQMANwMAIAIgAikDgAQ3A+ACDA4LAkBBJEUNACACQbgEaiACQYQDakEk/AoAAAsgAkEENgLUCiACQegEaiACQdQCaiACQbgEaiACQdQKahCABCACQYAEakEIaiIgIBNBCGopAgA3AwAgAiATKQIANwOABCACKAL8BCEGIAIoAvgEIQcgAigC9AQhASACKALwBCEFIAIoAuwEIQMgAigC6AQiGkEiRg0HIAogCSkCADcCACAKQRBqIAlBEGooAgA2AgAgCkEIaiAJQQhqKQIANwIAIAJB4AJqQQhqIAJBgARqQQhqKQMANwMAIAIgAikDgAQ3A+ACDA0LAkBBJEUNACACQbgEaiACQYQDakEk/AoAAAsgAkEFNgLUCiACQegEaiACQdQCaiACQbgEaiACQdQKahCABCACQYAEakEIaiIgIBNBCGopAgA3AwAgAiATKQIANwOABCACKAL8BCEGIAIoAvgEIQcgAigC9AQhASACKALwBCEFIAIoAuwEIQMgAigC6AQiGkEiRg0HIAogCSkCADcCACAKQRBqIAlBEGooAgA2AgAgCkEIaiAJQQhqKQIANwIAIAJB4AJqQQhqIAJBgARqQQhqKQMANwMAIAIgAikDgAQ3A+ACDAwLAkBBJEUNACACQbgEaiACQYQDakEk/AoAAAsgAkHoBGogAkHUAmogAkG4BGoQ8wEgAkGABGpBCGoiICATQQhqKQIANwMAIAIgEykCADcDgAQgAigC/AQhBiACKAL4BCEHIAIoAvQEIQEgAigC8AQhBSACKALsBCEDIAIoAugEIhpBIkYNByAKIAkpAgA3AgAgCkEQaiAJQRBqKAIANgIAIApBCGogCUEIaikCADcCACACQeACakEIaiACQYAEakEIaikDADcDACACIAIpA4AENwPgAgwLCyAYIAIpA4AENwIAIBhBCGogICkDADcCAAwJCyAYIAIpA4AENwIAIBhBCGogICkDADcCAAwICyAYIAIpA4AENwIAIBhBCGogICkDADcCAAwHCwJAQTBFIg0NACACQagDaiAPQTD8CgAACwJAIAwNACACQdwDaiACQbgEakEk/AoAAAtBAC0AwPGdARpB9AAQhQEiIkUNECAiIAY2AhggIiAHNgIUICIgJjYCECAiICA2AgwgIiADNgIIICIgGjYCBCAiIAs2AgACQCAMDQAgIkEcaiACQdwDakEk/AoAAAsgIiAENgJAAkAgDQ0AICJBxABqIAJBqANqQTD8CgAACwJAIAEgAigChANHDQAgAkGEA2pB7ISFARD5FSACKAKIAyEFCyAFIAFBA3RqIgMgIjYCBCADQQc2AgAMDgsgGCACKQOABDcCACAYQQhqICApAwA3AgAMBQsgGCACKQOABDcCACAYQQhqICApAwA3AgAMBAsgGCACKQOABDcCACAYQQhqICApAwA3AgAMAwsgGCACKQOABDcCACAYQQhqICApAwA3AgAMAgsgCCACQdQCahCvDCACQdQCahCaCBpBhICAgHghAwwICyACICA2AoQEIAIgAzYCgAQgAkHoBGogAkHUAmogAkGABGoQnQICQCACKALoBCIaQSJGDQAgAigC/AQhBiACKAL4BCEHIAIoAvQEISYgAigC8AQhICACKALsBCEDAkBBJEUNACACQeACaiATQST8CgAACyACKAKkBSEEIAJBgARqELADDAQLAkAgAigC7AENACACKAL4ASEGIAJBADYC+AEgAigC9AEhByACKALwASEmIAJCgICAgMAANwLwAQwFC0GMhYUBEPgUAAsgAiAGNgKUAyACIAc2ApADIAIgATYCjAMgAiAFNgKIAyACIAM2AoQDDAgLIAIoAqQFIQQgBSEgIAEhJgwBCyACQYQDahDlFyAaQSJGDQELAkBBJEUiAQ0AIAJByAFqIAJB4AJqQST8CgAACwJAIAENACACQTBqIAJByAFqQST8CgAACyACQewBahDPCUEAIR5BACETDAELAkAgBkUNACAHIQEDQCABKAIAIAFBBGooAgBBAUEBEMARIAFBJGohASAGQX9qIgYNAAsLICYgB0EEQSQQwBEgAkHsAWoQzwkCQCACKAK4ASIFIAIoArABRw0AIAJBsAFqQfSRhAEQ+RULIAIoArQBIgEgBUEDdGoiBiAgNgIEIAYgAzYCACACIAVBAWoiAzYCuAEgASADQQN0aiENIAJB6ARqQQRqIRogAkHsAWpBFGohDiACQegEakEUaiEQIAJBuARqQQxqIR4gAkHcA2pBEGohCSACQewBakEEaiEMQQAhCEEAIQsDQCACQdQKaiEDAkACQAJAAkACQAJAAkAgCEEIRw0AQQghCCABIQpBACEBDAELIAsNASAIQQhqIQVBASELAkAgASANRw0AIAUhCCANIQpBACEBDAELIAIgAkGoAWogCGo2AtQKIAFBCGohCiACQdQCaiEDIAUhCAsgAyABNgIAIAIoAtQKIgFFDQEgAigC1AIhGCAJQQRqICRBBGovAAA7AAAgCSAkKAAANgAAIAIgAi0AmAE6APMDIAJCBDcC5AMgAkIANwLcAyACIAItAJ8BOgDyAyACIAEpAgA3AoQEIAIgAkHcA2o2AoAEIAJCgICAgMAANwK4BCACQgQ3AsgEIAJCADcCwAQgAkHcA2ohAwNAIBhBBGoiBCgCACEFAkACQAJAAkACQAJAAkACQCAYKAIAIgFBeWoOBQABAgUDBwsgAy0AFCIBQQJGDQMgAUEBcQ0DIAJBADYCsAMgAkKAgICAEDcCqAMgGiACQagDahDcEyACQQo2AugEIAMgAkHoBGoQww4MBQsgAkELNgLoBCADIAJB6ARqEMMODAQLAkACQAJAIAUoAgBBgoCAgHhGDQAgAkEDOgCoAwwBCyACQagDaiADIAVBCGooAgAgBUEMaigCABCqByACQagDaiEBIAItAKgDQQNHDQELIANBEGohAQsgGiABKAAANgAAIBpBBGogAUEEai8AADsAACACQQw2AugEIAMgAkHoBGoQww4MAwsgAkENNgLoBCADIAJB6ARqEMMODAILIAJBADYCsAMgAkKAgICAwAA3AqgDIBogAkGoA2oQ3RMgAkEJNgLoBCADIAJB6ARqEMMODAELIAJBDjYC6AQgAyACQegEahDDDiAFKAIIRQ0AIAJBDzYC6AQgAyACQegEahDDDgsgGCgCACEBC0EEISAgGEEEaigCACEDQQEhIgJAAkACQAJAAkACQCABQXlqDgUABAECAwULIAMgAygCAEGIgMQARiIBQQJ0aiEFAkACQANAIAIoAoAEIQMCQAJAIAFBAXFFDQACQCADLQAUIgZBAkYNACAGQQFxDQAgAkEANgLQASACQoCAgIAQNwLIASAaIAJByAFqENwTIAJBCjYC6AQgAyACQegEahDDDgwCCyACQQA2AtABIAJCgICAgMAANwLIASAaIAJByAFqEN0TIAJBCTYC6AQgAyACQegEahDDDgwBCyAFKAIAQYaAxABHDQACQCADLQAUIgZBAkYNACAGQQFxDQAgAkEANgLQASACQoCAgIAQNwLIASAaIAJByAFqENwTIAJBCjYC6AQgAyACQegEahDDDgwBCyACQQA2AtABIAJCgICAgMAANwLIASAaIAJByAFqEN0TIAJBCTYC6AQgAyACQegEahDDDgsgAkHgAmogASAFEIYNAkAgAigC4AJBBEYNACACQRhqIAJB4AJqEPEQIAIoAhwhByACKAIYIRMCQCACKALMBCIGIAIoAsQERw0AIB4Q+hULIAIoAsgEIAZBGGxqIgMgBTYCBCADIAE2AgAgAyACKQLgAjcCCCADQRBqIAJB4AJqQQhqKQIANwIAIAIgBkEBajYCzAQgByEFIBMhAQwBCyACQegEaiABIAUgAkGABGoQZQJAIAIoAugEIgNBgICAgHhGDQAgAkGoA2pBCGogEEEIaikCADcDACACQagDakEQaiAQQRBqKAIANgIAIAIgECkCADcDqAMgAikC9AQhPiACKALwBCEBIAIoAuwEIQUMDAsgAigCzAQiA0UNAiACKALIBCADQRhsakFoaiEGA0AgA0F/aiEBIAYoAgAiB0ECRg0CIAZBFGooAgAhBSAGQQRqKAIAIRMCQAJAAkACQCAGQQhqIiYoAgAOBAADAQMACyAFRQ0CIAZBEGooAgAhASACQQA2AoQDIAIgBUF/aiIPNgKQAyACIAE2AogDIAIgAUHYAGo2AowDDAELIAIgATYCzAQgAiAPNgKQAyACIAU2AowDIAJBAzYChAMgAiAGKAIMNgKIAwJAIAIoAoAEIgEtABQiBUECRg0AIAVBAXENACACQQA2AtABIAJCgICAgBA3AsgBIBogAkHIAWoQ3BMgAkEKNgLoBCABIAJB6ARqEMMODAELIAJBADYC0AEgAkKAgICAwAA3AsgBIBogAkHIAWoQ3RMgAkEJNgLoBCABIAJB6ARqEMMOCyACQRBqIAJBhANqEPEQIAIoAhQhBSACKAIQIQEgBiATNgIEIAYgBzYCACAmQQhqIAJBhANqQQhqKQIANwIAICYgAikChAM3AgAgAiADNgLMBAwCCyACQegEaiAHIBMgAkGABGoQZQJAIAIoAugEIgNBgICAgHhGDQAgAkGoA2pBCGogEEEIaikCADcDACACQagDakEQaiAQQRBqKAIANgIAIAIgATYCzAQgAiAQKQIANwOoAyACKALsBCEFIAIoAvAEIQEgAikC9AQhPgwNCyAGQWhqIQYgASEDIAENAAsLQQAhAQsgAiABNgLMBAsMBAtBASEgQQAhBkEAISIMAwsgAygCCCIBRQ0CIAFBf2ohBiADKAIEIgNBCGohBUEDISBBACEiDAILIAMoAggiAUUNASABQX9qIQYgAygCBCIDQQhqIQVBAiEgQQAhIgwBC0EAIQZBACEiQQAhIAsCQAJAICINACAGrUIghiE+IAWtIT9BJCEBIAMhEwJAAkACQCAgDgQBAAICAQtBLCEBCyADIAFqKAIAIRMLID4gP4QhPgJAIAIoAsAEIgUgAigCuARHDQAgAkG4BGoQ+xULIAIoArwEIAVBFGxqIgEgPjcCDCABIAM2AgggASAgNgIEIAEgGDYCACAFQQFqIQUMAQsgAkHoBGogAkGABGogGCgCACAEKAIAEFwCQAJAIAIoAugEIgNBgICAgHhGDQBBJEUNBwwBCwJAIAIoAsAEIgVFDQAgAigCvAQgBUEUbGpBbGohAQJAA0ACQAJAAkACQAJAAkAgAUEEaigCACIGQQRGDQAgAUEQaigCACEHIAFBDGooAgAhEyABKAIAIQMgBg4EBQUCAQULIAVBf2ohAQwGCyAHDQEMAwsgB0UNAgwBCyACQQ82AugEIAIoAoAEIAJB6ARqEMMOCyABIBM2AgggASAGNgIEIAEgAzYCACABIAdBf2o2AhAgASATQQhqNgIMDAULIAJB6ARqIAJBgARqIAMoAgAgA0EEaigCABBcAkAgAigC6AQiA0GAgICAeEYNAEEkDQQMCgsgAUFsaiEBIAVBf2oiBQ0AC0EAIQELIAIgATYCwAQLAkAgAigCgAQiASgCACIDQf////8HTw0AIAEgA0EBajYCACACIAEoAgwiBTYChAMCQAJAIAVBAUcNACABIAM2AgAgAkHoBGogARCoDyACKALoBEEQRw0BQaSyhQEQmyAACyACQQA2AugEQQAgAkGEA2pBgIabASACQegEakG0soUBEJkZAAsgAkGoA2pBGGogAkHoBGpBGGooAgA2AgAgAkGoA2pBEGogAkHoBGpBEGopAgA3AwAgAkGoA2pBCGogAkHoBGpBCGopAgA3AwAgAiACKQLoBDcDqAMgDCACQagDahC5CUEBIQFBgICAgHghAwwIC0GUsoUBEPkUAAsgDCAaQST8CgAADAULIAIgBTYCwAQgAigCgAQhAyATIRgMAAsLQeT5hAEQmyAACyACLQCQASEhIAItAI8BISMgAi0AjgEhKCACKALEASEGIAIoAsABIQECQAJAIAItAIgBIhxBA0YNACAcQQJGDQAgAigCfCIdIB0oAgAiA0EBajYCACADQX9MDQsgAigChAEhKSACKAKAASEqDAELCyACLQCNASErIAItAIwBISwgAi0AlQEhLSACLQCUASEuIAItAJMBIS8gAigCeCEwIAIoAnQhMSACKAJwITIgAigCbCEzIAItAJIBITQgAi0AkQEhNSACKAJYITYgAigCVCE3IAIoAmghOCACKAJkITkgAigCYCE6IAIoAlwhOyACLQCWASE8IAJB6ARqIAZBBEEEEM0NIAIoAuwEIT0CQCACKALoBEEBRg0AIAIoAvAEIRBBACETQQAhGQJAIAZFDQAgECEDIAYhBQNAIAMgATYCACADQQRqIQMgAUEcaiEBIAVBf2oiBQ0ACyAGIRkLIAJBADYC5AQgAkKAgICAwAA3AtwEAkACQCAZDQBBASEUQQQhFUEAIRFBBCEmQQAhDQwBCyAGQQJ0IRNBACEFQQQhB0EAIQYDQCAQIAVqKAIAIQMQrR0iASADKAIYIgMtADI6ADIgASADLwEwOwEwIAEgAykCKDcCKCABIAMpAiA3AiAgASADKQIYNwIYIAEgAykCEDcCECABIAMpAgg3AgggASADKQIANwIAAkAgBiACKALcBEcNACACQdwEahD8FSACKALgBCEHCyAHIAVqIAE2AgAgAiAGQQFqIgY2AuQEIBMgBUEEaiIFRw0ACyACKALgBCIRQQRqISYgESAGQQJ0aiEVIBEoAgAiASgCFCESIAEoAhAhDUF/IRNBACEUC0EAIQNBASEGQQEhB0EAIRpBACEeIBMhIEEAISJBASEFQQAhCEEAIQ5BACEEA0BBACEYA0AgCCEbA0AgGCEIAkACQAJAAkACQAJAAkACQAJAAkAgBUEBcQ0AICYgFUYNAiAmIQEgJkEEaiEmDAELIBEhASAUDQELIAEo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ASAKIQEMAAsLIAIoAsABIgEgAigCxAEQ7hsgAigCvAEgARCzICACKAK0ASEYAkAgAigCuAEiBUUNACAYIQEDQCABELADIAFBCGohASAFQX9qIgUNAAsLIAIoArABIBhBBEEIEMARAkACQCATQQJHDQAgACAnNgIMIAAgJTYCCCAAIBo2AgQgACAeNgIADAELAkBBJEUNACACQbgEaiACQTBqQST8CgAACyAlICUoAgAiAUF/ajYCAAJAIAFBAUcNACAlICcQ+hcLIAIgBjYChAUgAiAHNgKABSACICY2AvwEIAIgIDYC+AQgAiADNgL0BCACIBo2AvAEIAIgHjYC7AQgAiATNgLoBAJAQSRFDQAgAkGIBWogAkG4BGpBJPwKAAALIAIgBDYCrAUgAkHwBGohGAJAAkAgE0EBcSIBRQ0AIBpBJ0cNACAAQYCAgIB4NgIEIAAgAzYCCAwBCyAAQQRqIR4CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABDQBBACEBIAJBADYC3AogAkKAgICAEDcC1AoCQCAaQSJHDQAgAkEANgKUAyACICY2AogDIAIgIDYChAMgAiACQYAFajYCkAMgAiACQZgFajYCjAMgAkGoA2ogAkGEA2oQsQYgAkGMA2ohICACKAKEAyEBAkACQAJAIAIoAogDIgNBB0sNACADRQ0BA0AgAS0AAEEKRg0DIAFBAWohASADQX9qIgMNAAwCCwsgAkEKIAEgAxCQCSACKAIAQQFGDQELIAJB1ApqQciehQFB256FARCKFCACQewBaiACQYQDahCxBiACQdwDaiACQewBahD6AiACQewBahDeEiACQQE2AvABIAJBmO+bATYC7AEgAkIBNwL4ASACQfUANgLkAiACIAJB4AJqNgL0ASACIAJB3ANqNgLgAgJAIAJB1ApqQfDZgwEgAkHsAWoQzgUNACACQQE2AvABIAJB5J6FATYC7AEgAkIBNwL4ASACQfYANgLkAiACICA2AuACIAIgAkHgAmo2AvQBIAJB1ApqQfDZgwEgAkHsAWoQzgUNACACKALcAyACKALgA0EBQQEQwBEMDgsgAigC3AMgAigC4ANBAUEBEMARDAoLIAJB7AFqQQhqIgFBADYCACACQoCAgIAQNwLsASACQewBakH+AEHPABDYDyACQYAEakEIaiABKAIANgIAIAIgAikC7AE3A4AEIAJB1ApqQciehQFB256FARCKFCACQQI2AvABIAJB0J+FATYC7AEgAkIBNwL4ASACQfUANgLgAyACIAJB3ANqNgL0ASACIAJBgARqNgLcAyACQdQKakHw2YMBIAJB7AFqEM4FRQ0HDAgLIAIoApQFIQMgAigCkAUhBQJAIBpBEUsNAEEBIBp0QYDACXFFDQAgAkH0BGohAQsgAiABNgKUAyACIBg2AowDIAIgAzYCiAMgAiAFNgKEAyACIAJBmAVqNgKQAyACQagDaiACQYQDahCxBiACQYwDaiEgIAIoAoQDIQECQAJAAkAgAigCiAMiA0EHSw0AIANFDQEDQCABLQAAQQpGDQMgAUEBaiEBIANBf2oiAw0ADAILCyACQQhqQQogASADEJAJIAIoAghBAUYNAQsgAkHUCmpByJ6FAUHbnoUBEIoUIAJB7AFqIAJBhANqELEGIAJB3ANqIAJB7AFqEPoCIAJB7AFqEN4SIAJBATYC8AEgAkGY75sBNgLsASACQgE3AvgBIAJB9QA2AuQCIAIgAkHgAmo2AvQBIAIgAkHcA2o2AuACAkAgAkHUCmpB8NmDASACQewBahDOBQ0AIAJBATYC8AEgAkHknoUBNgLsASACQgE3AvgBIAJB9wA2AuQCIAIgIDYC4AIgAiACQeACajYC9AEgAkHUCmpB8NmDASACQewBahDOBQ0AIAIoAtwDIAIoAuADQQFBARDAEQwHCyACKALcAyACKALgA0EBQQEQwBEMBAsgAkHsAWpBCGoiAUEANgIAIAJCgICAgBA3AuwBIAJB7AFqQf4AQc8AENgPIAJBgARqQQhqIAEoAgA2AgAgAiACKQLsATcDgAQgAkHUCmpByJ6FAUHbnoUBEIoUIAJBAjYC8AEgAkHQn4UBNgLsASACQgE3AvgBIAJB9QA2AuADIAIgAkHcA2o2AvQBIAIgAkGABGo2AtwDIAJB1ApqQfDZgwEgAkHsAWoQzgVFDQEMAgsgAkHsAWpBCGoiAUEANgIAIAJCgICAgBA3AuwBIAJB7AFqQbT8gwFBxvyDARCKFCAeQQhqIAEoAgA2AgAgHiACKQLsATcCAAwMCyACQTBqIAJBqANqEPoCIAJBATYC8AEgAkGY75sBNgLsASACQgE3AvgBIAJB9QA2AuADIAIgAkHcA2o2AvQBIAIgAkEwajYC3AMCQCACQdQKakHw2YMBIAJB7AFqEM4FDQAgAkECNgLwASACQdCfhQE2AuwBIAJCATcC+AEgAkH1ADYC4AMgAiACQdwDajYC9AEgAiACQYAEajYC3AMgAkHUCmpB8NmDASACQewBahDOBQ0AAkAgAigCvAMiAUUNAEEAIQUgAkEANgLQASACQoCAgIDAADcCyAEgAUEYbCEHIAIoArgDIgNBEGohASADQRRqIQZBBCEaQQAhAwNAIAJBBTYC4AMgAkGAoIUBNgLcAyACQgQ3AugDIAYoAgAhEyACQQ42AogCIAJBDjYCgAIgAkEONgL4ASACQQ42AvABIAIgE0F/ajYC1AIgAiABNgL8ASACIAFBeGo2AvQBIAIgAUF0ajYC7AEgAiACQewBajYC5AMgAiACQdQCajYChAIgAkHgAmogAkHcA2oQxQkCQCADIAIoAsgBRw0AIAJByAFqEP8VIAIoAswBIRoLIBogBWoiEyACKQLgAjcCACATQQhqIAJB4AJqQQhqKAIANgIAIAIgA0EBaiIDNgLQASABQRhqIQEgBkEYaiEGIAVBDGohBSAHQWhqIgcNAAsgAkHcA2ogAigCzAEgA0HYoZsBQQEQzgQgAkH1ADYC5AIgAkECNgLwASACQdCfhQE2AuwBIAJCATcC+AEgAiACQdwDajYC4AIgAiACQeACajYC9AEgAkHUCmpB8NmDASACQewBahC/HiEBIAIoAtwDIAIoAuADQQFBARDAESACQcgBahD6FCABDQELIAJBATYC8AEgAkHknoUBNgLsASACQgE3AvgBIAJB9wA2AuADIAIgIDYC3AMgAiACQdwDajYC9AEgAkHUCmpB8NmDASACQewBahDOBUUNAwsgAigCMCACKAI0QQFBARDAEQsgAigCgAQgAigChARBAUEBEMARCyACQagDahDeEgwFCyACKAIwIAIoAjRBAUEBEMARIAIoAoAEIAIoAoQEQQFBARDAEQsgAkGoA2oQ3hIMBgsgAkEwaiACQagDahD6AiACQQE2AvABIAJBmO+bATYC7AEgAkIBNwL4ASACQfUANgLgAyACIAJB3ANqNgL0ASACIAJBMGo2AtwDAkAgAkHUCmpB8NmDASACQewBahDOBQ0AIAJBAjYC8AEgAkHQn4UBNgLsASACQgE3AvgBIAJB9QA2AuADIAIg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PEUNACAAQQRqIANB0ANqQQRyQTz8CgAACyAAIAU2AgAMEwsgACAGNgIIIAAgAjYCBCAAQSo2AgAMEgsgACABIAIoAgwgAi0AFCAGEPoBDBELIAMgBjYC3AMgA0EANgLYAyADIAU2AtQDIAMgATYC0AMgACABIANB0ANqENMEDBALIAAgASACKAIIIAIoAgwgAigCECACKAIEEOoCDA8LIAIoAggiBSACKAIMIgRBHGxqIQICQAJAAkACQAJAIAEtAAtBAXENACAERQ0CIANB0ANqIAEgBRBIIAMoAtgDIQQgAygC1AMhCCADKALQAyEGAkBBNEUNACADQegAaiADQdwDakE0/AoAAAsgBUEcaiEFDAELIARFDQEgA0HQA2ogASACQWRqIgIQSCADKALYAyEEIAMoAtQDIQggAygC0AMhBkE0RQ0AIANB6ABqIANB3ANqQTT8CgAACyAGQVZqDgICAAELIANB0ANqIAEQmxUgAEEIaiEEIAMoAtQDIQICQAJAIAMoAtADIgVBKkYNAEE4RQ0BIAQgA0HQA2pBCGpBOPwKAAAMAQsgBCACNgIACyAAIAU2AgAgACACNgIEDBALAkBBNEUNACAAQQxqIANB6ABqQTT8CgAACyAAIAQ2AgggACAINgIEIAAgBjYCAAwPCyADQdwDaiEHA0ACQAJAAkACQAJAIAEtAAtBAXENACAFIAJGDQIgA0HQA2ogASAFEEggAygC2AMhCSADKALUAyEKIAMoAtADIQYCQEE0RQ0AIANBnAFqIAdBNPwKAAALIAVBHGohBQwBCyAFIAJGDQEgA0HQA2ogASACQWRqIgIQSCADKALYAyEJIAMoAtQDIQogAygC0AMhBkE0RQ0AIANBnAFqIAdBNPwKAAALIAZBKkYNAiAGQStHDQELIAAgBDYCCCAAIAg2AgQgAEEqNgIADBELAkBBNEUNACAAQQxqIANBnAFqQTT8CgAACyAAIAk2AgggACAKNgIEIAAgBjYCAAwQCyADQdADaiABIAQgChCeCAJAIAMoAtADIgRBKkYNAAJAQTxFDQAgAEEEaiADQdADakEEckE8/AoAAAsgACAENgIADBALIAkhBAwACwsCQAJAAkACQCACKAIMIgpFDQAgAigCCCIGIApBHGwiCWohC0EAIQUgBiECIAohBANAIAUgAigCAEEBRmohBSAC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QQhqIANB0ANqQQhqQTj8CgAACyAAIAI2AgQgACAFNgIADAULIAAgCTYCCCAAIAI2AgQgAEEqNgIADAQLIAUgAygC2ANBlK+EARCqHgALAkACQAJAAkAgASgCIA0AIAFBfzYCICADQgA3ApADIANB0ANqIAFBJGoiDSADQZADahDbCyADKALUAyEMAkAgAygC0AMiAkEqRg0AAkBBOEUNACAAQQhqIANB0ANqQQhqQTj8CgAACyAAIAw2AgQgACACNgIAIAMoAuACIQQgAygC3AIhCQwECyADQQA2AowCIANCgICAgMAANwKEAgJAIAMoAuACIgRFDQAgA0GQAmogAygC3AIiCRCEDCADQShqQQRqIQ8gA0GQAmpBGGohCCADQZACakEEaiEuIAytITEgA0GQAmpBDGohByADQZADakEQaiELQQQhDkEAIRADQAJAAkACQAJAAkACQAJAIAMoAsACIgIgAygCxAJGDQAgAyACQQhqNgLAAgJAIAIoAgAiBiAETw0AIAIxAAQhMCADKAKcAiEKIAMoAqQCIQUCQCAJIAZBGGxqKAIIRQ0AAkAgBSAKRw0AIAdBiLeEARDvFQsgAygCoAIgBUEDdGogMEIohiAwQiCGhDcCACADIAVBAWo2AqQCAkAgECADKAKEAkcNACADQYQCahCIFiADKAKIAiEOCwJAQThFDQAgDiAQQThsaiADQZACakE4/AoAAAsgAyAQQQFqIhA2AowCIAIoAgAiAiAETw0DIANBkAJqIAkgAkEYbGoQhAwMCQsCQCAFIApHDQAgB0G4t4QBEO8VCyADKAKgAiAFQQN0aiAwQiCGIDGEIDBCKIaENwIAIAMgBUEBajYCpAIMCAsgBiAEQfi2hAEQsxEACyADKAKkAg4CBQIBCyACIARBqLeEARCzEQALIA8gBykCADcCACAPQQhqIAdBCGooAgA2AgAgA0EANgKkAiADQoCAgIDAADcCnAIgA0ECNgIoIANB0ANqIA0gA0EoahDbCyADKALUAyEFIAMoAtADIgJBKkYNAkE4RQ0BIABBCGogA0HQA2pBCGpBOPwKAAAMAQsgA0EANgKkAiADKAKgAikCACEwIANBATYCKCADIDA3AiwgA0HQA2ogDSADQShqENsLIAMoAtQDIQUgAygC0AMiAkEqRg0BQThFDQAgAEEIaiADQdADakEI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aiEKIAtBIGohEwwjCyALQRRqIQogC0EQaiETDCILIAtBIGohCiALQRxqIRMMIQsgC0EYaiEKIAtBFGohEwwgCyALQRRqIQogC0EQaiETDB8LIAtBFGohCiALQRBqIRMMHgsgCygCCA4HFhcYGRobHBYLIAtBIGohCiALQRxqIRMMHAsgC0EQaiEKIAtBDGohEwwbCyALQRhqIQogC0EUaiETDBoLIAsoAiAiE0EoaiEKIBNBJGohEwwZCyALQQhqIQogC0EEaiETDBgLIAtBCGohCiALQQRqIRMMFwsgC0EMaiEKIAtBCGohEwwWCyALQQxqIQogC0EIaiETDBULIAtBHGohCiALQRhqIRMMFAsgC0EsaiEKIAtBKGohEwwTCyALQQhqIQogC0EEaiETDBILIAsoAgQiE0EEaiEKDBELIAtBFGohCiALQRBqIRMMEAsgC0EQaiEKIAtBDGohEwwPCyALQQxqIQogC0EIaiETDA4LIAtBDGohCiALQQhqIRMMDQsgC0EQaiEKIAtBDGohEwwMCyALQRBqIQogC0EMaiETDAsLIAtBEGohCiALQQxqIRMMCgsgC0EUaiEKIAtBEGohEwwJCyALQQxqIQogC0EIaiETDAgLIAtBCGohCiALQQRqIRMMBwsgC0EcaiEKIAtBGGohEwwGCyALQRBqIQogC0EMaiETDAULIAtBEGohCiALQQxqIRMMBAsgC0EUaiEKIAtBEGohEwwDCyALQRRqIQogC0EQaiETDAILIAtBJGohCiALQSBqIRMMAQsgC0EkaiEKIAtBIGohEwsgCigCACEVIBMoAgAhGSACQdABaiALEIMCAkACQCACKALQAUGAgICAeEYNACACQcACakEIaiACQdABakEIaigCACIKNgIAIAIgAikC0AE3A8ACIAIoAsQCIQsMAQtBBCEKIAJB4AJqQQRBAUEBEMwNIAIoAuQCIRMgAigC4AJBAUYNBCACKALoAiILQd/WlcsHNgAAIAJBBDYCyAIgAiALNgLEAiACIBM2AsACCyACQcgAakHIypgBIAsgChCoAwJAAkACQCACKAJIDQAgCyAKQYTLmwFBBRCZHA0AIAJBwABqQbjLmAEgCyAKEKgDIAIoAkANACACQThqQejLmAEgCyAKEKgDIAIoAjgNACALIApqIREgCkUNCwJAIAssAAAiGkF/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QeACakHYAPwKAAALQQEhFSABIABBAWo2AggLIAJBGGpBAEEAIAEoAggiE0GE85oBEMkYIAIoAhwhDyABIAIoAhgiADYCCCACIAkgEkEEdGoiDTYC8AEgAiAWNgLsASACIAk2AugBIAIgCTYC5AEgAiABNgLYASACIA82AtwBIAIgEyAPayIWNgLgAQJAIAAgD0YNACABKAIEIgQgD0HYAGxqIQUgBCAAQdgAbGohACACQeACakEEciEMA0AgACgCACIEQQ1GDQECQEHUAEUNACAMIABBBGpB1AD8CgAACyACIAQ2AuACIAJB4AJqEIYFIABB2ABqIgAgBUcNAAsLIAJB5AFqIRQgAkKIgICAgAE3AtABAkACQAJAAkACQAJAIBMgD0cNACABIBQQnAcMAQsCQAJAAkAgASgCCCIAIA9GDQAgASgCBCIFIA9B2ABsaiEOIBJBBHQhBCAFIABB2ABsaiEAIAJBnQNqIQUgAkHgAmpBKGohDCACQZQDaiELA0AgBEUNAiAJKQMAISAgC0IANwIAIAtBCGpBADoAACAFQQA2AAAgBUEEakEAOwAAIAJBADYCiAMgAkIENwKMAyACQcACakEIaiIKIAxBCGooAgA2AgAgAkIANwPwAiACQgE3A+gCIAJCADcDgAMgAkEANgLgAiACQQM6AKMDIAIgDCkDADcDwAIgAkHgAmoQmQ0gAEEoakIANwMAIABBGGpCADcDACAAQRBqICA3AwAgAEEIakEANgIAIABBBzYCACAAQTBqIAIpA8ACNwMAIABBOGogCigCADYCACAAQTxqQgA3AgAgAEHDAGpCADcAACAAQcsAakEDOgAAIAEgASgCCEEBajYCCCAEQXBqIQQgCUEQaiEJIABB2ABqIgAgDkcNAAsgAiAJNgLoAQsCQCANIAlHDQAgDSEJDAILAkAgDSAJa0EEdiIAIAEoAgAgE2tNDQAgASATIABBCEHYABCfFwsgACAPaiIAQdgAbCEEAkAgFkHYAGwiBUUNACABKAIEIgwgBGogDCAPQdgAbGogBfwKAAALIAIgADYC3AEgASgCCCIFIABGDQEgASgCBCIAIARqIQsgACAFQdgAbGohACACQeACakEoaiEEIAJBlANqIQUgAkGdA2oiCkEEaiEPAkADQCAJIA1GDQEgCSkDACEgIAVCADcCACAFQQhqQQA6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AowBIAIgACkCeDcCkAEgAkGcAWpBDGogAEGoAWoiAS8BADsBACACQQYgESAHQYCAgIB4RiIEGzYC4AIgAkHIkIABIBMgBBs2AtwCIAIgACkCoAE3AqABIAIgAkHcAmo2ApwBIAJBrAFqQQxqIAEvAQA7AQAgAiAGNgLIASACIAApAqABNwKwASACIAJByAFqNgKsASACQYACakEMaiABLwEAOwEAIAIgFDYCxAIgAiAAKQKgATcChAIgAiACQcQCajYCgAIgAkGgAmpBDGogAEGKAWovAQA7AQAgAiAAKQGCATcCpAIgAiACQdACajYCoAIgAkEXNgKMAyACQRg2AoQDIAJBGDYC/AIgAkEZNgL0AiACQRk2AuwCIAIgAkGgAmo2AogDIAIgAkGAAmo2AoADIAIgAkGsAWo2AvgCIAIgAkGcAWo2AvACIAIgAkGMAWo2AugCIAJBADYC6AEgAkEGNgLcASACQeyQgAE2AtgBIAJBBTYC5AEgAiACQegCajYC4AEgAkH0AGogAkHYAWoQrR4hCCACLQDQAiACKALUAhDyFCAHIBMQlx4gAigChAEhBwJAIAIoAogBIgRFDQAgByEBA0AgASgCACABQQRqKAIAEK4eIAFBGGooAgAgAUEcaigCABDvGiABQSBqIQEgBEF/aiIEDQALCyACKAKAASAHQQRBIBCwESALIAkQvBogCiALEJogIAhFDQMMBQsgAigCiAEhBCACKAKEASEBIAIgAigCgAE2ArQBIAIgATYCsAEgAiABNgKsASACIAEgBEEFdGo2ArgBIABBEGohFSAAQcAAaiEWIABBxABqIRcgAEEYaiEYIABBFGohGSAAQSRqIRogAEE4aiEbIABBBGohHCAAKAJwIh0gACgCdEEKbGohHiACQaACakEEaiEfIAJB6AJqQQRqISAgAkHoAmpBIGohISACQegCakEcaiEiIAJB6AJqQRRqISMgACgCuAEhJCACQdgBakEEaiIlQQhqISYCQANAIAIoArABIgEgAigCuAFGDQEgAiABQSBqNgKwASABKAIAIidBgYCAgHhGDQEgASgCHCEoIAEoAhghKSABKAIEISogAkHoAmogDUEBIAEoAgwgASgCECAQIBAQegJAIAIoAugCQQFHDQAgAigC7AIgAigC8AIQ8hQMBgsgAkEwaiACKALsAiIrIAIo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AigC4AEQxR8gAigC2AEgCBCOICACQdgBaiAAKAIAEPASIAJBoAJqIAIoAtwBIgggAigC4AFBACArIA5rIgUgBSArSxsQ3AggAiACQaACajYC6AIgICABKQAUNwAAIAQgBy8AADsAACACQYACaiACQegCahDDECACQZwBaiACKAKEAiIFIAIoAogCEMUfIAIoAoACIAUQjiAgAigCoAIgAigCpAIQjiAgAigC2AEgCBCOICACIBk2AugCICAgASkAFDcAACAEIAcvAAA7AAAgAkHYAWogAkHoAmoQwhAgAkGcAWogAigC3AEiASACKALgARDFHyACKALYASABEI4gDAYLIAIgHDYC6AIgICABKQAUNwAAICBBCGogAUEcai8AADsAACACQdgBaiACQegCahDCECACQZwBaiACKALcASIBIAIoAuABEMUfIAIoAtgBIAEQjiAMAQsLIAJB6AJqIAEQ3wUgAigC6AIiBCACKALsAhCXHiABQRRqIQEgBEGAgICAeEYNASACIBs2AugCICAgASkAADcAACAgQQhqIAFBCGovAAA7AAAgAkHYAWogAkHoAmoQwhAgAkGcAWogAigC3AEiBCACKALgARDFHyACKALYASAEEI4gDAILIAJByAFqEJMVIAJBvAFqEKoVICcgKhCXHiApICgQ7RoMDQsgAiAaNgLoAiAgIAEpAAA3AAAgIEEIaiABQQhqLwAAOwAAIAJB2AFqIAJB6AJqEMIQIAJBnAFqIAIoAtwBIgQgAigC4AEQxR8gAigC2AEgBBCOIAsgAkHYAWogACgCABDwEiACQaACaiACKALcASIEIAIoAuABQQAgKyAOayIHIAcgK0sbENwIIAIgAkGgAmo2AugCICAgASkAADcAACAgQQhqIgcgAUEIaiIILwAAOwAAIAJBgAJqIAJB6AJqEMMQIAJBnAFqIAIoAoQCIgUgAigCiAIQxR8gAigCgAIgBRCOICACKAKgAiACKAKkAhCOICACKALYASAEEI4gIAIgGTYC6AIgICABKQAANwAAIAcgCC8AADsAACACQdgBaiACQegCahDCECACQZwBaiACKALcASIBIAIoAuABEMUfIAIoAtgBIAEQjiALQQEhAQsgAigCoAEhBAJAAkAgAigCpAEiB0EQSQ0AIAQgBxDWBSEEDAELIAQgBxCVGSEECyACQaAC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ayEEAkAgBiACKAKgAkcNACACQaACahDlFSACKAKkAiETCyATIAZBFGxqIgEgAikC6AI3AgAgAkHoAmpBCGooAgAhByABIAQ2AhAgASAUNgIMIAFBCGogBzYCACACIAZBAWoiBjYCqAIgAkEANgKIAiACKALYASEBIAUhBCAIIRQMAAsLCyACQawBahDPESALIAkQvBogCiALEJogDAILIAIoApgDIQggAigClAMhBQJAAkACQCACKAKIASIrRQ0AAkAgAigChAEiHyArQQV0aiIMQWBqIi5FDQAgDEF4aiIsKAIAIAxBfGoiFygCACgCGBEEACAsKAIAIBcoAgAoAiARBABqIAUgCCgCGBEEAEkNAiAMQXBqKAIAISwgDEFsaiIMKAIAIRcgAkE4aiAuEJgcIAJB6AJqIAIoAjggAigCPBDkHCACKALwAiEtIAIoAuwCIS4gAigC6AIhLyACQdgBaiANQQEgDCgCACIMIBQgBmoiOCAsIBdqIiwgOCAsSxsgDGsiLCAQIBAQegJAIAIoAtgBIhdFDQAgLyAuEJceIAIoAuABIQwCQCAXDQAgAigC3AEgDBDtGgwECyACLQDcASAMEPIUDAMLIAIgK0F/aiIGNgKIASACKALgASEUIAIoAtwBIRECQCAfIAZBBXRqIgYoAgAiEkGBgICAeEYNACAGKAIYISsgBigCHCEXIBIgBigCBBCXHiArIBcQ7RoLIAIgFDYChAMgAiARNgKAAyACQQA6APwCIAIgLDYC+AIgAiAMNgL0AiACIC02AvACIAIgLjYC7AIgAiAvNgLoAiACQYABaiACQegCakHsj4ABEIgRIAUgCBDtGiAHIBMQlx4MAwtB3I+AARCbIAALIAIgCDYChAMgAiAFNgKAAyACIBI6APwCIAIgFDYC+AIgAiAGNgL0AiACIBE2AvACIAIgEzYC7AIgAiAHNgLoAiACQYABaiACQegCakGMkIABEIgRDAELIAIgCDYChAMgAiAFNgKAAyACIBI6APwCIAIgFDYC+AIgAiAGNgL0AiACIBE2AvACIAIgEzYC7AIgAiAHNgLoAiACQYABaiACQegCakH8j4ABEIgRCyABQRhqIQEgBEEYaiEEDAALCyACKQJ4ITkgAigCdCEFDAILICcgKhCXHiApICgQ7RogAkGsAWoQzxEgCyAJELwaIAogCxCaIAsgAigCdCACKAJ4EI4gQYCAgIB4IQULIABBwAFqIQQLIAMoAjghCCACQQhqIAMoAjwiAUEEQShBsJibARCDFCACQQA2AuABIAIgAigCDDYC3AEgAiACKAIIIgc2AtgBAkACQCABIAdNDQAgAkHYAWpBACABQQRBKBCfFwwBCyABDQAgAkHIAGpBCGogAkHYAWpBCGooAgA2AgAgAiACKQLYATcDSAJAAkAgAygCAEECRw0AQQAhAQwBCyADKAIMIQcgAygCCCEBCwJAAkACQCADQSRqKAIARQ0AIAJB6AJqIAQoAgBBCGogA0EgaigCACgCABCZAwJAAkAgAigC6AJFDQAgAkGgAmpBCGogAkHoAmpBCGopAgA3AwAgAiACKQLoAjcDoAIMAQsgAkEANgKgAgsgA0EkaigCAEUNASACQegCaiAEKAIAQQhqIANBIGooAgAoAgQQmQMCQCACKALoAkUNACACQdgBakEIaiACQegCakEIaikCADcDACACIAIpAugCNwPYAQwDCyACQQA2AtgBDAILIAJBADYCoAILIAJBADYC2AELAkACQAJAAkAgAigCoAIiCA0AQYCAgIB4IQwMAQsgAkEANgKIAiACQoCAgIAQNwKAAiACQeiIgAE2AuwCIAJCoICAgA43AvACIAIgAkGAAmo2AugCIAhB6ABqIAJB6AJqEOcdDQEgAikChAIhOiACKAKAAiEMCwJAAkAgAUUNACACQegCaiABIAcQtRMMAQsgAkGAgICAeDYC6AILIAMoAhhFDQEgAkHoAGogAygCFCIBQQRqKAIAIAFBCGooAgAQ8xIgAkHYAGpBCGoiBiACQegCakEIaigCADYCACACIAIpAugCNwNYIAIoAuQBIRQgAigC3AEhEyACKALYASERIAIoAqwCIRIgAigCpAIhKyAAKAK8ASIEQQhqENUSIQACQCAEKAIUIgcgBCgCDEcNACAEQQxqEOYVCyAEKAIQIAdB3ABsaiIBIBQ2AhwgASARQQBHIhQ2AhggASATNgIUIAEgFDYCECABIBI2AgwgASAIQQBHIgg2AgggASArNgIEIAEgCDYCACABIAIpAmg3AiAgASACKQNINwIsIAEgAikDWDcCOCABQShqIAJB6ABqQQhqKAIANgIAIAFBNGogAkHIAGpBCGooAgA2AgAgAUHAAGogBigCADYC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JCIdQQJGDQAgBCgCICErIAQoAhwhIyAEKAIYIRkgBCkDECJBQgODQgBSDQAgQaciASABKAIAIgFBAWo2AgAgAUF/TA0XC0EALQDA8Z0BGkHIABCFASIYRQ0WIAQoAigiGygCBCEDIAJB8ABqIBsoAggiIkEIQcAAEMwNIAIoAnQhJiACKAJwQQFGDREgAigCeCElAkAgJkUNACADICJBBnRqISRBACEKICYhIQNAIAohHCADIiogJEYNASAqKAI0IQMgKigCLCEpICooAighJyACQfAAaiAqKAI4IiBBBEEMEMwNIAIoAnQhGiACKAJwQQFGDRQgAigCeCEfAkAgGkUNACAgQQxsIQUgHyEKIBohBgNAIAVFDQFBAC0AwPGdARogAygCCCEHIAMoAgQhCEHAABCFASIBRQ0aIAJB8ABqIAMoAgAQRCABQThqIAJB8ABqQThqKQMANwMAIAFBMGogAkHwAGpBMGopAwA3AwAgAUEoaiACQfAAakEoaikDADcDACABQSBqIAJB8ABqQSBqKQMANwMAIAFBGGogAkHwAGpBGGopAwA3AwAgAUEQaiACQfAAakEQaikDADcDACABQQhqIAJB8ABqQQhqKQMANwMAIAEgAikDcDcDACAKQQhqIAc2AgAgCkEEaiAINgIAIAogATYCACAKQQxqIQogBUF0aiEFIANBDGohAyAGQX9qIgYNAAsLICpBwABqIQMgHEEBaiEKIAJB8ABqICoQpwIgJSAcQQZ0aiIBICA2AjggASAfNgI0IAEgGjYCMCABICk2AiwgASAnNgIoIAFBIGogAkHwAGpBIGopAwA3AwAgAUEYaiACQfAAakEYaikDADcDACABQRBqIAJB8ABqQRBqKQMANwMAIAFBCGogAkHwAGpBCGopAwA3AwAgASACKQNwNwMAICFBf2oiIQ0ACwsgAkHAAGogG0EMahCRCEGAgICAeCEGIBsoAjghGiAbKAI0IRwgGygCMCEgAkAgGygCGEGAgICAeEYNACAbKAIcIQMgGygCLCEqIBsoAighCCAbKAIkIQcgAkHwAGogGygCICIfQQhBMBDMDSACKAJ0IQYgAigCcEEBRg0UIAIoAnghIQJAIAZFDQAgH0EwbCEKICEhASAGIQUDQCAKRQ0BIAJB8ABqIAMQgAEgAUEoaiACQfAAakEoaikDADcDACAB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IAEpAgwhPyAGIAEoAgQgASgCCBCTByAGID83AgwMBAtBAC0AwPGdARpByAAQhQEiCkUNESAEKAIEIgEoAjghAyABKAI0IQUgASgCMCEGIAEtAEEhByABLQBAIQggASgCJCELIAEoAiAhGQJAIAEpAygiQEIDg0IAUg0AIECnIiMgIygCACIjQQFqNgIAICNBf0wNEgsgAS0APCEjAkACQCABKQMAIj9QDQAgASgCDCEqIAEoAgghKyABKAIcISggASgCGCEeAkAgP0IDg0IAUg0AID+nIh0gHSgCACIdQQFqNgIAIB1Bf0wNFAsgASkDECJBUA0BIEFCA4NCAFINASBBpyIBIAEoAgAiAUEBajYCACABQX9MDRMMAQsgAkHwAGogAUEIahDTCCACKAKEASEoIAIoAoABIR4gAikDeCFBIAIoAnQhKiACKAJwISsLIAogBzoAQSAKIAg6AEAgCiAjOgA8IAogAzYCOCAKIAU2AjQgCiAGNgIwIAogQDcDKCAKIAs2AiQgCiAZNgIgIAogKDYCHCAKIB42AhggCiBBNwMQIAogKjYCDCAKICs2AgggCiA/NwMADAMLQQAtAMDxnQEaIAQoAgwhBSAEKAIIIQtBwAAQhQEiCkUNECAKIAQoAgQQRAwCCyAEKAIgISsgBCgCHCEjIAQoAhghGSAEKAIMIQUgBCgCCCELIAQpAxAiP6chBgJAID9CA4NCAFINACAGIAYoAgAiAUEBajYCACABQX9MDRALID9CIIinIRogBC0AJCEdCwsgEiACLwFAOwAAIBJBAmogAkHAAGpBAmotAAA6AAAgAiAdOgAsIAIgKzYCKCACICM2AiQgAiAZNgIgIAIgBTYCFCACIAs2AhAgAiAKNgIMIAIgFzYCCCACIB42AjwgAiAoNgI4IAIgPzcDMCACIBqtQiCGIAathDcDGAsgBEE4aiEEIBAgCUE4bGoiASACKQMINwMAIAFBMGogAkEIakEwaikDADcDACABQShqIAJBCGpBKGopAwA3AwAgAUEgaiACQQhqQSBqKQMANwMAIAFBGGogAkEIakEYaikDADcDACABQRBqIAJBCGpBEGopAwA3AwAgAUEIaiATKQMANwMAIAlBAWohCSAWQX9qIhYNAAsLIAAgDDYCECAAIA02AgwgACAONgIIIAAgEDYCBCAAIA82AgBBAiED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CUECdGooAgAiDSAVSQ0ACwsgDSAVQZjxgwEQsxEACyAJIBVBmPKDARCzEQALIBIgFUGo8YMBEKMgAAsgEyAJQbjxgwEQjyAACyAJIBVBqPKDARCzEQALIAQgBkGMnYABELMRAAsgDUECaiICIBVJDQAgAiAVQYjygwEQsxEACyAWIAJBAnRqKAIAIQkLAkACQCAJIAEoArQCSw0AAkACQAJAAkACQAJAAkACQAJAIAlFDQAgCSABKAK4AksNAyAVIAlJDQUgFSAJRg0GIBUgCWshByAWIAlBAnRqIgktAAAiAkH/AUYNASACIAJBAnZqIAJBA3FBAEdqQQJqIQIMAgsgAEEANgIADBwLIAEoAihBAmohAgsgAiAHTw0EAkACQCAJIAJBAnRqKAIAIgtBf0wNAAJAIAJBAWoiAiAHTw0AIAkgAkECdGooAgAhAgwCCyACIAdBzOGDARCzEQALIAtB/////wdxIQILIAIgASgCFCIJTw0FIARBAWoiCSABKAIQIAJBAnRqKAIAIgFPDQEgA0EANgIYIANBATYCDCADQcTmgwE2AgggA0IENwIQIANBCGpBzOaDARCFGwALIANBCGogASgCHCABKAIgIgIoAghBf2pBeHFqQQhqIA4gBiAEIAUgAigCEBETAAJAIAMoAghFDQAgAygCDCICIARNDQYMBwsgAEEANgIADBkLIAAgAjYCDCAAIAk2AgggAEEBNgIAIAAgCSABazYCBAwYCyAJIBVByPKDARCjIAALQQBBAEHs4YMBELMRAAsgAiAHQbzhgwEQsxEACyACIAlBuPKDARCzEQALIARBAWohAgsgAiEEIAIgBUkNAAsLIABBADYCAAwQCyADQQA2AhggA0EBNgIMIANBxOaDATYCCCADQgQ3AhAgA0EIakHM5oMBEIUbAAsgAiAJQbjygwEQsxEACyACIAdBvOGDARCzEQALQQBBAEHs4YMBELMRAAsgCSACQcjygwEQoyAACyAAIAMpAgw3AgQgAEEMaiADQQhqQQxqKAIANgIACyAAIAI2AgAMCQsgCSABKAK4AksNACABKAIIIgsgCUkNBSALIAlGDQQgCyAJayEMAkACQCABKAIEIAlBAnRqIg0tAAAiC0H/AUYNACALIAtBAnZqIAtBA3FBAEdqQQJqIQsMAQsgASgCKEECaiELCyALIAxPDQMCQAJAIA0gC0ECdGooAgAiFUF/TA0AAkAgC0EBaiILIAxPDQAgDSALQQJ0aigCACEQDAILIAsgDEHM4YMBELMRAAsgFUH/////B3EhEAsgECABKAIUIgtPDQIgBCABKAIQIBBBAnRqKAIAIgtJDQEgBCALayERQQEhCAsgA0EIaiAHIAEoAiAiCygCCEF/akF4cWpBCGogAigCCCIPIAIoAgwiDiAEIAUgCygCEBETAAJAAkACQAJAIAMoAggiAg4DAgEAAgsgAUEsaiEKIAMoAgwhAgwCCyAAIAMpAgw3AgQgAEEMaiADQQhqQQxqKAIANgIACyAAIAI2AgAMCAsCQAJAAkACQANAAkACQAJAAkAgAiISIAVPDQACQAJAAkACQCASIA5PDQACQCAJIAEoAggiFUkNACAJIQ0MEwsgCiAPIBJqLQAAai0AACICQQJqIQYgASgCBCEWIAkhDQJAAkACQAJAA0ACQAJAAkACQCAWIA1BAnRqKAIAIglB/wFxQYJ+ag4CAgABCyAGIA1qIgkgFU8NBCAWIAlBAnRqKAIAIglBAUYNAgwLCyAVIA1BAmoiE0kNBCAJQQJ2QT9xIAlBA3FBAEdqIhQgFSATayIJSw0FIBRBAnQhByAWIBNBAnRqIQtBfyEMAkACQAJAA0AgB0UNBSAMQQFqIQwgAiALKAIAIglB/wFxRg0BIAIgCUEIdkH/AXFGDQIgAiAJQRB2Qf8BcUYNAyALQQRqIQsgB0F8aiEHIAIgCUEYdkcNAAsgFCATaiAMQQJ0akEDaiICIBVJDQwgAiAVQcjxgwEQsxEACyAMQQJ0IBQgE2pqIgIgFUkNCyACIBVB+PGDARCzEQALIBQgE2ogDEECdGpBAWoiAiAVSQ0KIAIgFUHo8YMBELMRAAsgFCATaiAMQQJ0akECaiICIBVJDQkgAiAVQdjxgwEQsxEACyACIAlBCHZB/wFxRg0HCyANQQFqIgkgFU8NBCAWIAlBAnRqKAIAIg0gFU8NFwwACwsgCSAVQZjygwEQsxEACyATIBVBqPGDARCjIAALIBQgCUG48YMBEI8gAAsgCSAVQajygwEQsxEACyASIA5BjJ2AARCzEQALIA1BAmoiAiAVSQ0AIAIgFUGI8oMBELMRAAsgFiACQQJ0aigCACEJCyAJIAEoArQCSw0DIAlFDQACQCAJIAEoArgCSw0AIBUgCUkNBiAVIAlGDQcgFSAJayEHAkACQCAWIAlBAnRqIgstAAAiAkH/AUYNACACIAJBAnZqIAJBA3FBAEdqQQJqIQIMAQsgASgCKEECaiECCyACIAdPDQgCQAJAIAsgAkECdGooAgAiDEF/TA0AAkAgAkEBaiICIAdPDQAgCyACQQJ0aigCACEQDAILIAIgB0HM4YMBELMRAAsgDEH/////B3EhEAsgECABKAIUIgJPDQkgEkEBaiIEIAEoAhAgEEECdGooAgAiAk8NAyADQQA2AhggA0EBNgIMIANBxOaDATYCCCADQgQ3AhAgA0EIakHM5oMBEIUbAAsgA0EIaiABKAIcIAEoAiAiAigCCEF/akF4cWpBCGogDyAOIBIgBSACKAIQERMAIAMoAghFDQEgAygCDCICIBJNDQMMBAsgACAQNgIMIAAgBDYCCCAAIBE2AgQgACAINgIADA8LIABBADYCAAwOCyAEIAJrIRFBASEIIAQhAgwBCyASQQFqIQIMAAsLIAkgFUHI8oMBEKMgAAtBAEEAQezhgwEQsxEACyACIAdBvOGDARCzEQALIBAgAkG48oMBELMRAAsgA0EANgIYIANBATYCDCADQcTmgwE2AgggA0IENwIQIANBCGpBzOaDARCFGwALIBAgC0G48oMBELMRAAsgCyAMQbzhgwEQsxEAC0EAQQBB7OGDARCzEQALIAkgC0HI8oMBEKMgAAsgDSAVQZjxgwEQsxEACyAAIA42AgwgACAQNgIIIAAgDzYCBCAAIAo2AgALIANBIGokAAu1PwMPfwN+AnwjAEGwA2siAyQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAigCAEFwag4UAAgBCAIICAgICAQHBggICAgICAUICyADQcQAakECaiACQRNqLQAAOgAAIAMgAi8AETsBRCACKAIMIQQgAigCCCEFIAIoAgQhBgJAAkACQCACLQAQIgdBA0sNACAHQQJHDQELQQAtAMDxnQEaQcAAEIUBIghFDRQgCCAHOgAQIAggBDYCDCAIIAU2AgggCCAGNgIEIAhBEDYCACAIIAMvAUQ7ABEgACAINgIEIABBAjYCACAIQRNqIANBxABqQQJqLQAAOgAADAELIANB8ABqIAEgBhBXAkAgAygCcEEBRw0AIAMrA3ghFQJAAkACQAJAIAcOBAEDAAIAC0Gyo5sBQShB5PCaARDdFwALIBWaIRUMAQsgFRCIFSEVCyAAQQE2AgAgACAVOQMIIANB8ABqEM0TDAELIANB6AJqIANB8ABqEK0EQQAtAMDxnQEaQcAAEIUBIghFDRMgCCADKQPoAjcDACAIQThqIANB6AJqQThqKQMANwMAIAhBMGogA0HoAmpBMGopAwA3AwAgCEEoaiADQegCakEoaikDADcDACAIQSBqIANB6AJqQSBqKQMANwMAIAhBGGogA0HoAmpBGGopAwA3AwAgCEEQaiADQegCakEQaikDADcDACAIQQhqIANB6AJqQQhqKQMANwMAQQAtAMDxnQEaQcAAEIUBIgFFDRMgASAHOgAQIAEgBDYCDCABIAU2AgggASAINgIEIAFBEDYCACAAIAE2AgQgAEECNgIACyACKAIAQXBqIghBE0sNF0EBIAh0QZWoIHENGSAIQQtGDRYMFwsgAigCECEJIAIoAgwhCiACLQAUIQYgAigCCCEEIAIoAgQhBRC1HSEIIANB6AJqIAUQRCAIQThqIANB6AJqQThqIgspAwA3AwAgCEEwaiADQegCakEwaiIMKQMANwMAIAhBKGogA0HoAmpBKGoiDSkDADcDACAIQSBqIANB6AJqQSBqIg4pAwA3AwAgCEEYaiADQegCakEYaiIPKQMANwMAIAhBEGogA0HoAmpBEGoiECkDADcDACAIQQhqIANB6AJqQQhqIhEpAwA3AwAgCCADKQPoAjcDABC1HSEHIANB6AJqIAQQRCAHQThqIAspAwA3AwAgB0EwaiAMKQMANwMAIAdBKGogDSkDADcDACAHQSBqIA4pAwA3AwAgB0EYaiAPKQMANwMAIAdBEGogECkDADcDACAHQQhqIBEpAwA3AwAgByADKQPoAjcDAAJAIAZBeGpBC0kNACAGQRdGDQBBAC0AwPGdARpBwAAQhQEiAUUNEiABIAY6ABQgASAJNgIQIAEgCjYCDCABIAc2AgggASAINgIEIAFBEjYCACAAIAE2AgQgAEECNgIAIAUgBBDzHAwVCyADQYABaiABIAUQVyADQYABakEQaiILIAEgBBBXIAMgBjoAoAEgAygCkAEhBUEBIQwCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAygCgAEiBA4CAAEoCyAFDgIBAiYLIAUOAgIDJQsgBkELRg0SQQAhBQwkCwJAIAZBC0YNAEEBIQUMJAsgAyADKQOIATcDgAIgA0HYAmogAysDmAEQgw0gA0ECNgLsAiADQfTwmgE2AugCIANCAjcC9AIgA0G9Aq1CIIYgA0HYAmqthDcDuAIgA0G4Aq1CIIYgA0GAAmqthDcDsAIgAyADQbACajYC8AIgA0HoAWogA0HoAmoQgg1BACEBIANB6AFqEOocIRIgAEEANgIAIAAgEjcDCCADKALYAiADKALcAhCOICADKQOAAhDCGQwTCyAGQQtGDQFBACEFDCILIAMrA5gBIRUgAysDiAEhFiAGQXhqDhACAwQFBgcICQoLDAEBAQENAQsgAysDiAEhFSADIAMpA5gBNwOAAiADQdgCaiAVEIMNIANBAjYC7AIgA0H08JoBNgLoAiADQgI3AvQCIANBuAKtQiCGIANBgAJqrYQ3A7gCIANBvQKtQiCGIANB2AJqrYQ3A7ACIAMgA0GwAmo2AvACIANB6AFqIANB6AJqEIINIANB6AFqEOocIRIgAEEANgIAIAAgEjcDCCADKALYAiADKALcAhCOICADKQOAAhDCGQwPC0Gyo5sBQShBhPGaARDdFwALIBYgFRC1DiEVDAsLIBYgFRC2DiEVDAoLIBYgFRC3DiEVDAkLIBYgFaAhFQwICyAWIBWhIRUMBwsgFiAVoiEVDAYLIBYgFaMhFQwFCyAWIBUQ2AYhFQwECyAWIBUQ8Q4hFQwDCyAWIBUQ8g4hFQwCCyAWIBUQ8w4hFQwBCyAWIBUQ+RkhFQsgAEEBNgIAIAAgFTkDCEEAIQEMAgsgAyADKQOIATcDgAIgAyADKQOYATcD2AIgA0ECNgLsAiADQfTwmgE2AugCIANCAjcC9AIgA0G4Aq1CIIYiEiADQdgCaq2ENwO4AiADIBIgA0GAAmqthDcDsAIgAyADQbACajYC8AIgA0HoAWogA0HoAmoQgg0gA0HoAWoQ6hwhEiAAQQA2AgAgACASNwMIIAMpA9gCEMIZIAMpA4ACEMIZC0EBIQELIAgQ2QEgCEHAAEEIEJ4SIAcQ2QEgB0HAAEEIEJ4SIAQNAQwOCyADQcgAakEgaiACQShqKQMANwMAIANByABqQRhqIAJBIGopAwA3AwAgA0HIAGpBEGogAkEYaikDADcDACADQcgAakEIaiACQRBqKQMANwMAIAMgAikDCCISNwNIAkAgEqciBkEBRw0AIANB6AJqQSRqIAJBCGoiCEEgaikCADcCACADQegCakEcaiAIQRhqKQIANwIAIANB6AJqQRRqIAhBEGopAgA3AgAgA0HoAmpBDGogCEEIaikCADcCAEEALQDA8Z0BGiADIAgpAgA3AuwCQcAAEIUBIghFDREgCEEUNgIAIAggAykC6AI3AgQgCEEMaiADQfACaikCADcCACAIQRRqIANB+AJqKQIANwIAIAhBHGogA0GAA2opAgA3AgAgCEEkaiADQYgDaikCADcCACAIQSxqIANBkANqKAIANgIAIABBAjYCACAAIAg2AgQMDQsgASgCBCEQIAMoAmQhCyADKAJgIQwgAygCaCEEELUdIQEgA0HoAmogBBBEIAFBOGogA0HoAmpBOGoiBSkDADcDACABQTBqIANB6AJqQTBqIg4pAwA3AwAgAUEoaiADQegCakEoaikDADcDACABQSBqIANB6AJqQSBqKQMANwMAIAFBGGogA0HoAmpBGGopAwA3AwAgAUEQaiADQegCakEQaikDADcDACABQQhqIANB6AJqQQhqKQMANwMAIAEgAykD6AI3AwACQAJAIAYNACADKAJUIQcgAygCUCENIAMoAlwhCCADKAJYIQ4CQCADKQNQIhJCA4NCAFINACASpyIFIAUoAgAiBUEBajYCACAFQX9MDRMLIAMgBzYC6AIgA0GAAWohBQwBCyADKAJUIQggAygCUCENIAMoAkwhDxC1HSEHIANB6AJqIA8QRCAHQThqIAUpAwA3AwAgB0EwaiAOKQMANwMAIAdBKGogA0HoAmpBKGopAwA3AwAgB0EgaiADQegCakEgaikDADcDACAHQRhqIANB6AJqQRhqKQMANwMAIAdBEGogA0HoAmpBEGopAwA3AwAgB0EIaiADQegCakEIaikDADcDACAHIAMpA+gCNwMAIANB6AJqIQULIAUgCDYCAEEALQDA8Z0BGiADKAKAASEFIAMoAugCIQ9BwAAQhQEiCEUNECAIIAE2AiggCCALNgIkIAggDDYCICAIIAU2AhwgCCAONgIYIAggDzYCFCAIIA02AhAgCCAHNgIMIAggBjYCCCAIQRQ2AgACQAJAIAYOAwAKAQALQQEhAUEAIQcgAykDUCESDAsLAkACQCADKAJMIgwoAgBBG0cNACAMKAIIRQ0BCyAAIAg2AgQgAEECNgIAIAwQ2QEgDEHAAEEIEJ4SQQAhAUEBIQcMDAsgA0H4AmogDEEgaikDADcDACADQegCakEIaiAMQRhqKQMANwMAIAMgDCkDEDcD6AIgA0EQaiADQegCahD9ESADKAIQIQ0CQAJAIAMoAhQiDkUNACANIA5qIQsgDSEBA0AgAUEBaiEHAkACQCABLAAAIgVBf0wNACAHIQEMAQsCQAJAIAVBYEkNAAJAIAVBbUcNACAHIAtGDQUgAUECaiALRg0FIAEtAAFBnwFLDQIgAUEDaiEBDAMLIAcgAUECaiAHIAtGGyIBIAEgC0dqIQEgBUFwSQ0CIAEgASALR2ohAQwCCyAHIAFBAmogByALRhshAQwBCyADQQhqIANB6AJqEP0RIANBgAFqIAMoAgggAygCDBD4ByADQYABahCpGyESDAMLIAEgC0cNAAsLIA0gDhD1FSESCyADQegCahCnEAJAIAwoAgBBG0cNACAMQQhqIgEoAgBFDQogARDpCAwKCyAMENkBDAkLIANBgAFqEM0TDAwLIANBIGogAkEIaiIIEP4RAkACQAJAAkACQAJAAkACQAJAAkAgAygCICADKAIkQdjwmgFBAxCZHEUNACACKAIYIAEoAghGDQELIANBGGogCBD+EQJAIAMoAhggAygCHEHb8JoBQQgQmRxFDQAgAigCGCABKAIIRg0CCyABKAIEIQcCQCABKAIAIgEpAwAiEkIDg0IAUg0AIBKnIgYgBigCACIGQQFqNgIAIAZBf0wNGAsgASgCCCEGAkAgCCkDACITQgODQgBSDQAgE6ciCCAIKAIAIghBAWo2AgAgCEF/TA0YCyADIBM3A5ABIAMgBjYCiAEgAyASNwOAASAHIANBgAFqEOQHIghFDQYgCCgCGCIHDgQCBQMEAgsgAEKAgICAgICA/P8ANwMIIABBATYCACAIKQMAIhJCA4NCAFINDSASpyIIIAgoAgAiAEF/ajYCACAAQQFHDQ0gCCAIKAIQEMEbDA0LIABCgICAgICAgPj/ADcDCCAAQQE2AgAgCCkDACISQgODQgBSDQwgEqciCCAIKAIAIgBBf2o2AgAgAEEBRw0MIAggCCgCEBDBGwwMC0EAIQcCQCAIKQMgIhJCA4NCAFENAAwGCyASpyIIIAgoAgAiAUEBajYCACABQX9KDQUMFAsgCCgCHCEGELUdIQggA0HoAmogBhBEIAhBOGogA0HoAmpBOGopAwA3AwAgCEEwaiADQegCakEwaikDADcDACAIQShqIANB6AJqQShqKQMANwMAIAhBIGogA0HoAmpBIGopAwA3AwAgCEEYaiADQegCakEYaikDADcDACAIQRBqIANB6AJqQRBqKQMANwMAIAhBCGogA0HoAmpBCGopAwA3AwAgCCADKQPoAjcDACADIAg2ArQCCyADIAc2ArACDAILIANBsAJqQQhqIAhBGGoiCEEIaikDADcDACADIAgpAwAiEjcDsAIgEqciB0EBSw0BIAMpA7gCIRIgAygCtAIhCAwCCyAAQQI2AgAgACACNgIEIANBgAFqEOkQDBgLAkAgASkDACISQgODQgBSDQAgEqciCCAIKAIAIghBAWo2AgAgCEF/TA0QCyACKAIUIQcgAigCECEGIAEoAgghCAJAIAIpAwgiE0IDg0IAUg0AIBOnIgEgASgCACIBQQFqNgIAIAFBf0wNEAtBAC0AwPGdARpBwAAQhQEiAUUNDyABQQA6ABwgASAINgIYIAFCADcCECABIBI3AgggAUEaNgIAQQAtAMDxnQEaQcAAEIUBIghFDQ8gCCABNgIoIAhCADcDICAIIAc2AhwgCCAGNgIYIAggEzcDECAIQQA2AgggCEEUNgIAIANBsAJqEM0TQQIhBwsgACASNwMIIAAgCDYCBCAAIAc2AgAgAhDZASACQcAAQQgQnhIgA0GAAWoQ6RAMFgsgACABIAIoAgQQVyACKAIAQXBqIghBE0sNEkEBIAh0QZWoIHENFCAIQQtGDREMEgsgAigCICEEIAIoAhwhCyACKAIQIQwgAigCBCENIAIoAhghBiACKAIUIQcgA0G8AWogAigCCCIFIAIoAgwiDhCyDCADQbwBakEMaiAHIAYQ2QhBAC0AwPGdARpBwAAQhQEiCEUNDCAIQRw2AgAgCCADKQK8ATcCBCAIIAQ2AiAgCCALNgIcIAhBDGogA0G8AWpBCGopAgA3AgAgCEEUaiADQcwBaikCADcCACADIAg2AqwBIANBAjYCqAEgByAGQQV0aiEEIAchCAJAAkAgBkUNACAHQSBqIQggBy0AGCILQQJGDQAgA0GwAmpBEGogB0EQaikDACISNwMAIANBsAJqQQhqIAdBCGopAwAiEzcDACADIAcpAwAiFDcDsAIgAyAHKAAZNgKoAiADIAdBHGooAAA2AKsCIANB6AJqQRBqIBI3AwAgA0HoAmpBCGogEzcDACADQegCakEcaiADKACrAjYAACADIBQ3A+gCIAMgCzoAgAMgAyADKAKoAjYAgQMgA0EANgLwASADQoCAgIAQNwLoASADQcDlmgE2AoQBIANCoICAgA43AogBIAMgA0HoAWo2AoABAkACQAJAIANB6AJqIANBgAFqEKEaDQAgAygC6AEhCyADKQLsASESIANB6AJqEK0QIAtBgICAgHhGDQMgAyASNwLYASADIAs2AtQBIANBADYCkAMgA0IANwKIAyADIAUgDkECdGo2AoQDIAMgDTYCgAMgAyAFNgL8AiADIAU2AvgCIAMgBDYC9AIgAyAMNgLwAiADIAg2AuwCIAMgBzYC6AIgA0HoAmpBEGohECAGQQFGDQIgA0GAAWpBGWoiBUEDaiELA0AgAyAIQSBqNgLsAgJAAkACQAJAAkACQAJAIAgtABgiB0ECRg0AIAUgCCgAGTYAACADQYABakEQaiIMIAhBEGoiDSkDADcDACADQYABakEIaiIOIAhBCGoiDykDADcDACALIAhBHGooAAA2AAAgAyAHOgCYASADIAgpAwA3A4ABAkAgAygC/AIiBiADKAKEA0cNACAIQSBqIQggA0GAAWoQrRAMCgsgA0HoAWpBCGogDykDACISNwMAIANB6AFqQRBqIA0pAwAiEzcDACADIAZBBGo2AvwCIAMgCCkDACIUNwPoASADIAhBGWoiDSgAADYC4AEgAyANQQNqKAAANgDjASAGKAIAIQYgDCATNwMAIA4gEjcDACAFIAMoAuABNgAAIAsgAygA4wE2AAAgAyAUNwOAASADIAc6AJgBIANBgAJqIAEgBhBXIAMoAoACDgICAwELIAhBIGohCAwICyAAIAMpA6gBNwMAIABBCGogA0GoAWpBCGopAwA3AwAgA0GAAmoQzRMgA0GAAWoQrRACQCAEIAhBIGoiCEYNACAEIAhrQQV2IQADQCAIEK0QIAhBIGohCCAAQX9qIgANAAsLIAMoAvACIAMoAugCEL8gIBAQphQgAygC1AEgAygC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IANBgAFqEK0EQQAtAMDxnQEaQcAAEIUBIgFFDQEgASADKQPoAjcDACABQThqIANB6AJqQThqKQMANwMAIAFBMGogA0HoAmpBMGopAwA3AwAgAUEoaiADQegCakEoaikDADcDACABQSBqIANB6AJqQSBqKQMANwMAIAFBGGogA0HoAmpBGGopAwA3AwAgAUEQaiADQegCakEQaikDADcDACABQQhqIANB6AJqQQhqKQMANwMAIAgQ2QEgCEHAAEEIEJ4SIARBAUshDCABIQgLAkACQCAFQQFNDQAgByEEDAELIANB6AJqIAsQrQRBAC0AwPGdARpBwAAQhQEiBEUNASAEIAMpA+gCNwMAIARBOGogA0HoAmpBOGopAwA3AwAgBEEwaiADQegCakEwaikDADcDACAEQShqIANB6AJqQShqKQMANwMAIARBIGogA0HoAmpBIGopAwA3AwAgBEEYaiADQegCakEYaikDADcDACAEQRBqIANB6AJqQRBqKQMANwMAIARBCGogA0HoAmpBCGopAwA3AwAgBxDZASAHQcAAQQgQnhILQQAtAMDxnQEaQcAAEIUBIgFFDQAgASAGOgAUIAEgCTYCECABIAo2AgwgASAENgIIIAEgCDYCBCABQRI2AgAgACABNgIEIABBAjYCACAFQQFNDQEgCxDNEwwBCwALIANBgAFqIQsgDEUNAQsgCxDNEwsgAigCAEFwaiIIQRNLDQFBASAIdEGVqCBxDQMgCEELRw0BCyACKAIIDgQCAQECAQsgAhDZAQwBCyACQQhqEOkICyACQcAAQQgQnhILIANBsANqJAALhUACKn8HfiMAQeAFayICJAAgASABKAJ4IgNB//97cTYCeCABKALAASEEIAEQhw4gAkHYAGpBCEEEQQxBkMKbARDYFCACQQA2AmggAiACKQNYNwJgQYoFrUIghiIsQYijmwGthCEtICxBgdqYAa2EIS4gAkGwBGpBBGohBSACQbAEakEEciEGIAJBsARqQQxqIQcgAkGQA2pBBGohCCACQZACakEQaiEJIAJBkAVqQSBqIQogAkGwBGpBCGohCyACQZADakEMaiEMIAJBkANqQQhqIQ0gAkGQBWpBDGohDiACQZADakHAAGohDyACQbAEakHIAGohECACQbAEakEgaiERIAJBwAVqIRIgAkGQBWpBBHIhEyACQdACakEQaiEUIAJBmAFqQQhqIRUgAkH4AGpBCGohFiABLQDIASEXQQAhGAJAAkACQANAAkAgF0H/AXFBA0cNACABEIcOIAEoArwBIRcCQCAYQQFxRQ0AIAJBsARqIAFB5AFqIAQgL6cgL0IgiKcQjgYLIABBDjYCACAAIAIpAmA3AgQgACAXNgIUIAAgBDYCECAAQQxqIAJB6ABqKAIANgIADAMLIAIgASgCwAEiGTYCdAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAEtAMgBIhdBD0YNAAJAIBdBHEcNACABEIcOIAEoArwBIRogAkHIAGogAUHAABCOFSACIAIoAkwiFzYCcCACKAJIQQFxDQ8gAiAZNgJsDA0LIAJBsARqIAEQgAwCQCACLQCwBEEBRw0AIAIoArQEIRcMDwsgAi0AsQQhGyABLQDIASEcIAEoArwBIR0gASgCuAEhHiACQbAEaiABEIsDIAIoArQEIRcgAigCsAQiGUEFRg0OIBUgCykDADcDACAVQRBqIAtBEGopAwA3AwAgFUEIaiALQQhqKQMANwMAIAIgFzYCnAEgAiAZNgKYASABLQDIASEXAkACQCABLwGAAUGAwABxIh9FDQAgF0EXSw0DQQEgF3RBkYmCBHENBCAXQQlHDQMMAQsgF0EJRw0DCyABEIcOIAJBCGogAUHAABCOFSACKAIMIRcCQCACKAIIQQFxRQ0AIAIgFzYCcCAZDQQgAikDoAEQxh0MDwsgBSACKQOYATcCACAFQRhqIAJBmAFqQRhqKQMANwIAIAVBEGogAkGYAWpBEGopAwA3AgAgBUEIaiAVKQMANwIAQQhB8AAQ6x8iGUUNECAZQQY2AgACQEEkRQ0AIBlBBGogAkGwBGpBJPwKAAALIBkgFzYCKCACIBk2AmxBACEXDAwLIAEQhw4gAkGwBGogARCLAyACKAK0BCEXAkAgAigCsAQiGUEFRg0AIBYgCykDADcDACAWQRBqIAtBEGopAwA3AwAgFkEIaiALQQhqKQMANwMAIAEgASgCeCIcQf//729xQYCAgBByNgJ4IAJBADYCuAQgAkKAgICAwAA3ArAEIAJB0ABqIAEgAkGwBGogAigCdEEAQQEQxAkgAigCVCEfIAIoAlAhGyABIBw2AnggAiAXNgJ8IAIgGTYCeAJAIBtBAXFFDQAgAiAfNgJwIAJB+ABqEJEXIB8hFwwPCyAFIAIpA3g3AgAgBUEYaiACQfgAakEYaikDADcCACAFQRBqIAJB+ABqQRBqKQMANwIAIAVBCGogFikDADcCAEEIQfAAEOsfIhlFDRAgGUEKNgIAAkBBJEUNACAZQQRqIAJBsARqQST8CgAACyAZIB82AihBACEXIAJBADYCcCACIBk2AmwMDAsgAiAXNgJwDA0LAkAgF0G1f2oiIEEfSw0AQQEgIHRBgYCCkHhxDQELIBdBQGpBAkkNACAXQRJGDQAgF0G0f2pB/wFxQdUASQ0AAkAgGQ0AIBdBA0YNAQsgASgCxAEhFyABKALAASEZIAJB9oCAgHg2ArAEIAEgGSAXIAJBsARqEK8aIAEoArwBIRkgAigCdCEfQQhBwAAQ6x8iF0UNDiAXIBk2AgggFyAfNgIEIBdBMTYCACAFIAIpA5gBNwIAIAVBCGogFSkDADcCACAFQRBqIAJBmAFqQRBqKQMANwIAIAVBGGogAkGYAWpBGGopAwA3AgBBCEHwABDrHyIZRQ0OIBlBBjYCAAJAQSRFDQAgGUEEaiACQbAEakEk/AoAAAsgGSAXNgIoQQAhFyACQQA2AnAgAiAZNgJsDAoLAkACQCAXRQ0AIBdBEkYgH0EAR3FFDQELIAEgASgCeCIXQf//729xQYCAgBByNgJ4IAJBADYCuAQgAkKAgICAwAA3ArAEIAJBEGogASACQbAEaiACKAJ0QQBBABDECSACKAIUIR8gAigCECEZIAEgFzYCeCAZQQFxDQMgBSACKQOYATcCACAFQRhqIAJBmAFqQRhqKQMANwIAIAVBEGogAkGYAWpBEGopAwA3AgAgBUEIaiAVKQMANwIAQQhB8AAQ6x8iF0UNDiAXQQo2AgACQEEkRQ0AIBdBBGogAkGwBGpBJPwKAAALIBcgHzYCKEEAIRkgAkEANgJwIAJB7ABqIRwMCAsgGUUNASAGIBcQ3hsgAkEKNgLEBCACQazDmwE2AsAEIAJBsICAgHg2ArAEIAEoAsABIAEoAsQBIAJBsARqEIUVIRcCQCABLQDIAUGiAUcNACABEMcRIRkgARCHDiABIBkQ5RELIAIgFzYCcAsgAkGYAWoQkRcMCgsgAikDoAEhMAJAIBdBCkcNACABEIcOIAEoArwBIRcgASgCuAEhGSACQZOBgIB4NgKwBCABIBkgFyACQbAEahCvGiABLQDIASEXCwJAAkACQAJAIBdB/wFxIhlBfWoOBQIBAQECAAsgGUEXRg0CCwJAAkACQCAcQYh/aiIZQRtLDQBBASAZdEGBgYDAAHENAQsgAS0AgQFBIHFFDQEgBiAXEN4bIAJB0gA2AsQEIAJBsMKbATYCwAQgAkGwgICAeDYCsAQgASgCwAEgASgCxAEgAkGwBGoQhRUhFyABLQDIAUGiAUcNByABEMcRIRkgARCHDiABIBkQ5REMBwsgG0EBcQ0EDAULIAYgFxDeGyACQSo2AsQEIAJBgsObATYCwAQgAkGwgICAeDYCsAQgASgCwAEgASgCxAEgAkGwBGoQhRUhFyABLQDIAUGiAUcNBSABEMcRIRkgARCHDiABIBkQ5REMBQsgAigCrAEhHyACKAKoASEcQQhB8AAQ6x8iGUUNDEEAIRcgGUEAOgAcIBlBADYCGCAZIB82AhQgGSAcNgIQIBkgMDcCCCAZQQU2AgAgAkEANgJwIAIgGTYCbAwICyABEIcOIAJBwABqIAFBwAAQjhUgAigCRCEXIAIoAkBBAXENAyABKAK8ASEfIAIoAqwBIRwgAigCqAEhGyACKAJ0IR1BCEHwABDrHyIZRQ0LIBkgFzYCKEEAIRcgGUEAOgAkIBlBADYCICAZIBw2AhwgGSAbNgIYIBkgMDcCECAZIB82AgwgGSAdNgIIIBlBBzYCACACQQA2AnAgAiAZNgJsDAcLIAJBmAFqEJEXQQEhGSACQfAAaiEcIB8hFwwECyACQf6AgIB4NgKwBCABIB4gHSACQbAEahCvGiABLQDIASEXCwJAIBxB+ABHDQAgF0H/AXFBD0cNACABEIcOCyACQbAEaiABEIsDIAIoArQEISEgAigCsAQiG0EFRw0BICEhFwsgAiAXNgJwIDAQxh0MBQsgAikDyAQhMSACKALABCEdIAIoArgEIR4gAigCxAQhICACKAK8BCEiIAEgASgCeCIjQf//729xQYCAgBByIiQ2AnggAiAgICIgG0ECSSIZGzYCvAEgAiAdIB4gGRs2ArgBAkACQAJAAkACQAJAAkACQAJAIBxB+ABGDQACQAJAIBxB/wBGDQAgHEGTAUYNAUGyo5sBQShBuMObARDdFwALIAIoAnQhF0EAISUgAkEAOgDXBSACQQA6ANYFIAIgFzYC0AUgASAkQf/8b3EiGTYCeCACQQA2ArgEIAJCgICAgMAANwKwBCACIAJB0AVqNgLIBCACIAJB1gVqNgLEBCACIAJBuAFqNgLABCACIAJB1wVqNgK8BCABLQDIASEXAkAgAS0AgQFBIHFFDQAgASAZQYAgcjYCeAJAIBdBEkYNACAXQT5GDQAgASAZNgJ4DAELIAJBKGogAUEAQQEQvwIgAigCKCEXIAEgGTYCeCACKAIsISUCQCAXQQFxRQ0AICUhFwwKCyABLQDIASEXCwJAAkACQAJAIBdB/wFxDQAgARCHDiABQYACQQAgAi0A1wUbIAEoAngiJkH//N9+cUGAgYABQYCAgAEgAi0A1gUbcnI2AnggAkGQA2ogARDCAiACKAKUAyEfAkAgAigCkAMiJ0GAgICAeEcNACABICY2AnggHyEXDAwLIB8gAigCmAMiKEEGdCIcaiEpQQAhFwJAA0AgHCAXRg0BIB8gF2ohGSAXQcAAaiEXIBkQ1xVFDQALIAIoArwBIRcgAigCuAEhGSACQZGAgIB4NgKQAyABIBkgFyACQZADahCvGgsgASAmNgJ4IAIgKDYCiAQgAiAfNgKEBCACICc2AoAEIAEtAMgBIhdBAUcNASABEIcOQQAhFwJAIAEtAIEBQSBxRQ0AIAEtAMgBQf8BcUEJRw0AIAJBIGogAUEJEJgEIAIoAiQhFyACKAIgQQFxDQMLIAIgFzYCkAUgAkGQA2ogASACLQDWBSACLQDXBSAfICgQ3RgQvwogAigClAMhHCACKAKQAyImQYGAgIB4Rw0DIAJBkAVqEKkfIBwhFwwCCyABKALEASEZIAEoAsABIR8gAkGgBGogFxDeGyACQQE2ApQDIAJBmO+bATYCkAMgAkIBNwKcAyACIC43A4AEIAIgAkGABGo2ApgDIAJBkAVqIAJBkANqEI0VIA5BCGogAkGgBGpBCGooAgA2AgAgDiACKQKgBDcCACAfIBkgAkGQBWoQhRUhFyABLQDIAUGiAUcNCiABEMcRIRkgARCHDiABIBkQ5REMCgsgASgCxAEhGSABKALAASEfIAJB2ANqIBcQ3hsgAkEBNgKUAyACQZjvmwE2ApADIAJCATcCnAMgAiAtNwPYBSACIAJB2AVqNgKYAyACQZAFaiACQZADahCNFSAOQQhqIAJB2ANqQQhqKAIANgIAIA4gAikC2AM3AgAgHyAZIAJBkAVqEIUVIRcgAS0AyAFBogFHDQAgARDHESEZIAEQhw4gASAZEOURCyACQYAEahDLHQwICyACQcABakEIaiInIA1BCGopAgA3AwAgAiANKQIANwPAASAmQYCAgIB4Rw0FIAEvAYABQYDAAHFFDQUDQCAfIhkgKUYNBiAZIBkgKUdBBnRqIR8gGSgCAEEERw0AIBkoAhAhKCAZKAIMIRkgAkGqgYCAeDYCkAMgASAZICggAkGQA2oQrxoMAAsLIAIoAnQhF0EAISkgAkEAOgDXBSACQQA6ANYFIAIgFzYC0AUgASAkQf/8b3EiGTYCeCACQQA2ArgEIAJCgICAgMAANwKwBCACIAJB0AVqNgLIBCACIAJB1gVqNgLEBCACIAJBuAFqNgLABCACIAJB1wVqNgK8BCABLQDIASEXAkAgAS0AgQFBIHFFDQAgASAZQYAgcjYCeAJAIBdBEkYNACAXQT5GDQAgASAZNgJ4DAELIAJBOGogAUEAQQEQvwIgAigCOCEXIAEgGTYCeCACKAI8ISkCQCAXQQFxRQ0AICkhFwwFCyABLQDIASEXCwJAAkACQAJAIBdB/wFxDQAgARCHDiABQYACQQAgAi0A1wUbIAEoAngiJUH//N9+cUGAgYABQYCAgAEgAi0A1gUbcnI2AnggAkGQA2ogARDCAiACKAKUAyEcAkAgAigCkAMiJ0GAgICAeEcNACABICU2AnggHCEXDAcLAkACQCACKAKYAyImRQ0AQQAhGSAcIRcgJiEfA0AgGSAXENcVaiEZIBdBwABqIRcgH0F/aiIfDQALAkAgGUEBRg0AIAIoArwBIRcgAigCuAEhGSACQZKAgIB4NgKQAyABIBkgFyACQZADahCvGgsgHCgCAEECRw0BIBwoAiwhFyAcKAIoIRkgAkGZgICAeDYCkAMgASAZIBcgAkGQA2oQrxoMAQsgAigCvAEhFyACKAK4ASEZIAJBkoCAgHg2ApADIAEgGSAXIAJBkANqEK8aCwJAIAEtAIEBQSBxRQ0AIAEtAIIBQf8BcQ0AIAIoArwBIRcgAigCuAEhGSACQYGBgIB4NgKQAyABIBkgFyACQZADahCvGgsgASAlNgJ4IAIgJjYCiAQgAiAcNgKEBCACICc2AoAEIAEtAMgBIhdBAUcNASABEIcOQQAhFwJAIAEtAIEBQSBxRQ0AIAEtAMgBQf8BcUEJRw0AIAJBMGogAUEJEJgEIAIoAjQhFyACKAIwQQFxDQMLIAIgFzYCkAUgAkGQA2ogASACLQDWBSACLQDXBSAcICYQ3RgQvwogAigClAMhJSACKAKQAyInQYGAgIB4Rw0DIAJBkAVqEKkfICUhFwwCCyABKALEASEZIAEoAsABIR8gAkGgBGogFxDeGyACQQE2ApQDIAJBmO+bATYCkAMgAkIBNwKcAyACIC43A4AEIAIgAkGABGo2ApgDIAJBkAVqIAJBkANqEI0VIA5BCGogAkGgBGpBCGooAgA2AgAgDiACKQKgBDcCACAfIBkgAkGQBWoQhRUhFyABLQDIAUGiAUcNBSABEMcRIRkgARCHDiABIBkQ5REMBQsgASgCxAEhGSABKALAASEfIAJB2ANqIBcQ3hsgAkEBNgKUAyACQZjvmwE2ApADIAJCATcCnAMgAiAtNwPYBSACIAJB2AVqNgKYAyACQZAFaiACQZADahCNFSAOQQhqIAJB2ANqQQhqKAIANgIAIA4gAikC2AM3AgAgHyAZIAJBkAVqEIUVIRcgAS0AyAFBogFHDQAgARDHESEZIAEQhw4gASAZEOURCyACQYAEahDLHQwDCyACQcABakEIaiIoIA1BCGopAgA3AwAgAiANKQIANwPAASAnQYCAgIB4Rw0BIAEvAYABQYDAAHFFDQEgHCAmQQZ0aiEfA0AgHCIZIB9GDQIgGSAZIB9HQQZ0aiEcIBkoAgBBBEcNACAZKAIQISYgGSgCDCEZIAJBqoGAgHg2ApADIAEgGSAmIAJBkANqEK8aDAALCyACQQA2ArgEIAJCgICAgMAANwKwBCACQRhqIAEgAkGwBGogAigCdEEBIBdB/wFxQQ9GEMQJIAIgMTcDiAIgAiAgNgKEAiACIB02AoACIAIgIjYC/AEgAiAeNgL4ASACICE2AvQBIAIgGzYC8AEgAigCHCEXAkAgAigCGEEBcQ0AIAUgAikD8AE3AgAgBUEYaiACQfABakEYaikDADcCACAFQRBqIAJB8AFqQRBqKQMANwIAIAVBCGogAkHwAWpBCGopAwA3AgBBCEHwABDrHyIZRQ0PIBlBCjYCAAJAQSRFDQAgGUEEaiACQbAEakEk/AoAAAsgGSAXNgIoQQAhFyACQQA2AnAgAiAZNgJsDAULIAIgFzYCcCACQfABahCRF0EBIRkMBwsgDCACKQKwBDcCACAMQQhqIAsoAgA2AgAgDSACQYAEakEIaiIcKAIANgIAIAIgAikCgAQ3A5ADIAEoArwBIR8gAi0A1wUhJiACLQDWBSEqIAIoAtAFIStBBEHIABDrHyIZRQ0NIBkgAikDkAM3AgAgGSAlNgIcIBkgJzYCGCAZIAIpA8ABNwIgIBkgKjoARSAZICY6AEQgGSAXNgJAIBkgKTYCPCAZQQA2AjggGSAfNgI0IBkgKzYCMCAZQRBqIAJBkANqQRBqKQMANwIAIBlBCGoiKSANKQMANwIAIBlBKGogKCkDADcCACABICQ2AnggGSgCACEfIBkoAgQhFwJAQcAARSIkDQAgAkHQAmogKUHAAPwKAAALIBlByABBBBCeEiACIDE3A9gBIAIgIDYC1AEgAiAdNgLQASACICI2AswBIAIgHjYCyAEgAiAhNgLEASACIBs2AsABIAIgFzYClAMgAiAfNgKQAwJAICQNACANIAJB0AJqQcAA/AoAAAsgAigCmAMhGSACQQc2AtgDAkAgGUECSQ0AAkAgJA0AIAJBkAVqIBdBwAD8CgAACwJAIBlBBnRBQGoiG0UNACAXIBdBwABqIBv8CgAACyACQdgDahDyHgJAQShFDQAgAkHYA2ogAkGQBWpBKPwKAAALIBIQzB0gGUF/aiEZCyACIB82AqgEIAIgFzYCoAQgAiAXNgKkBCACIBcgGUEGdGo2AqwEAkACQCAZRQ0AIAIgF0HAAGo2AqQEIBcoAgAiGUEHRg0AAkBBPEUNACATIBdBBGpBPPwKAAALIBwgF0EUaikCADcDACACQYAEakEQaiAXQRxqKQIANwMAIAJBgARqQRhqIBdBJGooAgA2AgAgAiAZNgKQBSACIBcpAgw3A4AEIAIoApQFIR8gAigCmAUhGyASEMwdDAELIAIoArwBIRcgAigCuAEhGSACQZKAgIB4NgKQBSABIBkgFyACQZAFahCvGkEFIRlBACEbQQAhHwtBCEEoEOsfIhdFDQ0gFyAbNgIIIBcgHzYCBCAXIBk2AgAgFyACKQOABDcCDCAXQRRqIBwpAwA3AgAgF0EcaiACQYAEakEQaikDADcCACAXQSRqIAJBgARqQRhqKAIANgIAIAJBoARqEMMRIAEoArwBIR8gAigCdCEcAkBBKEUNACARIAJB2ANqQSj8CgAACyACQbAEakEYaiACQcABakEYaikDADcDACACQbAEakEQaiACQcABakEQaikDADcDACALICgpAwA3AwAgECAUKQIANwIAIBBBCGogFEEIaikCADcCACAQQRBqIBRBEGopAgA3AgAgAiACKQPAATcDsARBCEHwABDrHyIZRQ0NAkBB4ABFDQAgGSACQbAEakHgAPwKAAALIBkgFzYCaCAZIB82AmQgGSAcNgJgIAwQzB0gAigCzAMQ7h8gDxCpH0EAIRcgAkEANgJwIAIgGTYCbAwDCyApEO4fCyACQbAEahDMHSABICQ2AnggAiABNgLgASACIDE3A9gBIAIgIDYC1AEgAiAdNgLQASACICI2AswBIAIgHjYCyAEgAiAhNgLEASACIBs2AsABIAIgAkH0AGo2AugBIAIgAkG4AWo2AuQBIAIgFzYCcCACQcABahCRF0EBIRkMBAsgDCACKQKwBDcCACAMQQhqIAsoAgA2AgAgDSACQYAEakEIaigCADYCACACIAIpAoAENwOQAyABKAK8ASEfIAItANcFISkgAi0A1gUhKCACKALQBSEqQQRByAAQ6x8iGUUNCiAZIAIpA5ADNwIAIBkgHDYCHCAZICY2AhggGSACKQPAATcCICAZICg6AEUgGSApOgBEIBkgFzYCQCAZICU2AjwgGUEANgI4IBkgHzYCNCAZICo2AjAgGUEQaiACQZADakEQaikDADcCACAZQQhqIh8gDSkDADcCACAZQShqICcpAwA3AgAgASAkNgJ4IBkpAgAhMgJAQcAARSIXDQAgAkGQAmogH0HAAPwKAAALIBlByABBBBCeEiACIDE3A9gBIAIgIDYC1AEgAiAdNgLQASACICI2AswBIAIgHjYCyAEgAiAhNgLEASACIBs2AsABIAIgMjcCsAQCQCAXDQAgCyACQZACakHAAPwKAAALIAIoAvAEIRcCQCABLQCBAUEgcUUNACABLQCCAUH/AXENACACKAK8ASEZIAIoArgBIR8gAkGBgYCAeDYCkAMgASAfIBkgAkGQA2oQrxoLIAJBkAVqQQhqICcpAwA3AwAgAkGQBWpBEGogAkHAAWpBEGopAwA3AwAgAkGQBWpBGGogAkHAAWpBGGopAwA3AwAgCiAJKQIANwIAIApBCGogCUEIaikCADcCACAK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IANBuANqIANB+ARqEJwcIAMoArwDIQ0CQCADKAK4AyIOQZWAgIB4Rw0AIANBuAFqEOYRQQEhDCANIRUMCgsgA0HwAWpBCGogA0G4AWpBCGopAwA3AwAgAyADKQO4ATcD8AEgAyADKQPAAzcDiAIgAyANNgKEAiADIA42AoACIANBhAFqIANB8AFqELIRDAELCyADQbgBahCkHiADQfABaiADKAKIASADKAKMARCxASADLQDwAQ0GIAMvAfQBIANB8AFqQQZqLQAAQRB0ciEVIAMvAfIBIRYgAy0A8QEhF0EAIQwMBwsgA0HwAGogAygC2AYQuxoCQCADKAJwQQFxRQ0AIAMgAygCdCINNgLABiADIA0QDzYCyAMgA0EANgLEAyADQQA2AswDIANBADYCuAMgAyADQcAGajYCwAMgA0EANgKMASADQoCAgICAATcChAEDQCADQfgEaiADQbgDahDLEUGVgICAeCENAkAgAygC+ARBAUcNACADKAL8BCENIAMoAoAFIQ4gAygCuAMgAygCvAMQwh8gAyAONgK8AyADQQE2ArgDIANB8AFqIA0QhBAgAygC9AEhFSADKALwASINQZWAgIB4Rg0GIAMpA/gBISMLIAMgIzcD0AEgAyAVNgLMASADIA02AsgBAkAgDUGVgICAeEYNACADKAK4AyENIANBADYCuAMgDUUNBCADQfgEaiADKAK8AxDRASADKAL8BCENAkAgAygC+AQiDkGVgICAeEcNACADQcgBahDmEUEBIQwgDSEVDAgLIANB8AFqQQhqIANByAFqQQhqKQMANwMAIAMgAykDyAE3A/ABIAMgAykDgAU3A4gCIAMgDTYChAIgAyAONgKAAiADQYQBaiADQfABahCyEQwBCwsgA0HIAWoQpB4gA0HwAWogAygCiAEgAygCjAEQsQEgAy0A8AENAyADLwH0ASADQfABakEGai0AAEEQdHIhFSADLwHyASEWIAMtAPEBIRdBACEMDAULIANB2AZqIANBwAZqQeiEgAEQ2QYhFQwHCyAMEJIfQQIhCgwKC0HxjYABQSxBhI+AARDyEgALIAMoAvQBIRULQQEhDAsgA0GEAWoQ2hcgAygCuAMgAygCvAMQwh8gAygCwAYQkh8MAgsgAygC9AEhFUEBIQwLIANBhAFqENoXIANB+ARqEKUeCyADKALYBhCS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4OydAUEALQDA8Z0BGkGACBCFASITRQ0DQQBBAzoA4OydAUEAIBM2AtjsnQELIANBuANqEIgJIANBpARqIhMQpg0gA0KBgICAwAA3AuwEIANBwAZqQQFBABC1EyADQdgGakEBQQAQtRMgA0HEBWpBAUEAELUTIANB0AVqEIgJIAMpAuAFISMgAykCgAYhJCADKQKIBiElIAMpApAGISYgA0H4BGoQpg0gA0G4A2oQ5B0gA0GIBGogA0HABmpBCGooAgA2AgAgA0GUBGogA0HYBmpBCGooAgA2AgAgA0GgBGogA0HEBWpBCGooAgA2AgAgAyAmNwL4AyADICU3AvADIAMgJDcC6AMgA0KggICAgAQ3AuADIANCoICAgIAENwLYAyADQqCAgICABDcC0AMgAyAjNwLIAyADQqCAgICABDcCwAMgA0KggICAgAQ3ArgDIAMgAykCwAY3AoAEIAMgAykC2AY3AowEIAMgAykCxAU3ApgEAkBByABFDQAgEyADQfgEakHIAPwKAAALAkBBvAFFDQAgA0HwAWogA0G4A2pBvAH8CgAACyADIA42ArADIAMgEjYCrAMgA0HQBWoQhxwgEiASKAIAIg5BAWo2AgAgDkF/TA0CIAMpAvABISMgAykC+AEhJCADKQKAAiElIAMpAogCISYgAykCkAIhJyADKQKYAiEoIAMpAqACISkgAykCqAIhKiADKQKwAiErIANBgARqIAMoArwCIAMoAsACEPMSIANBjARqIAMoAsgCIAMoAswCEPMSIANBmARqIAMoAtQCIAMoAtgCEPMSIAMgKzcC+AMgAyAqNwLwAyADICk3AugDIAMgKDcC4AMgAyAnNwLYAyADICY3AtADIAMgJTcCyAMgAyAkNwLAAyADICM3ArgDIAMoAuACIQ4gA0HQBWogAygC5AIiE0EBQQoQ2QwgAygC1AUhHSADKALQBUEBRg0EIAMoAtgFIR4CQCATQQpsIhFFDQAgHiAOIBH8CgAACwJAQewARQ0AIANB0AVqIANBuANqQewA/AoAAAsgAygCsAMiESARKAIAIg5BAWo2AgAgDkF/TA0CIAMoAqgDIR8gAygCpAMhIAJAQewARSIhDQAgA0G4A2ogA0HQBWpB7AD8CgAACyADQZoDaiEZIANBkANqIRogA0GGA2ohDyADQfwCaiEXIANB8gJqIRgg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BEGsAWogASgCACIBIANBBGooAgAgA0EIaigCABCqByAEEN8SNgLEASAEQQA2AqwBIAEgBEGsAWoQww4MIwsgBEHYAGpBEGogA0EQaikCADcDACAEQdgAakEIaiADQQhqKQIANwMAIAQgAykCADcDWCABKAIAIgMsABYhBSADLQAVIQYgAy0AFCECIAMtABIhByADLQAXRQ0fQQEhCCAFQQBIDSAgAkH/AXFBAkYgAnJBAXENHwwgCyABKAIAIgEtABQiAkECRiACciEFIAEtABUhByABLQARIQZBASECAkACQAJAAkACQAJAAkACQCADLQAYDgwOAA8BAgMEBQQFBgcOC0EgQQggB0EBcRtBAiAGQQFxGyECDA4LQQIhAgwNC0GAAkHAACAFQQFxGyECDAwLQYAEQYABIAVBAXEbIQIMCwtBgCBBgAggBUEBcRshAgwKC0GAwABBgBAgBUEBcRshAgwJC0GAgARBgIABIAVBAXEbIQIMCAtBgIAIQYCAAiAFQQFxGyECDAcLIAEoAgAiBS0AFCICQQJGDQkgAkEBcQ0JIARBrAFqIAEgAxD5BiAEQYgDaiIDIARBrAFqQQxqKQIANwMAIAQgBCkCsAE3A4ADIAQoAqwBIgFBgICAgHhGDQggACAEKQLAATcCFCAAQSRqIARBrAFqQSRqKAIANgIAIABBHGogBEGsAWpBHGopAgA3AgAgAEEMaiADKQMANwIAIAAgBCkDgAM3AgQgACABNgIADCELIAEoAgAiAi0AFCIFQQJGDQkgBUEBcQ0JIARBrAFqIAIQqA8gBCgCrAFBEEYNEiAEQYADakEYaiAEQawBakEYaigCADYCACAEQYADakEQaiAEQawBakEQaikCADcDACAEQYADakEIaiAEQawBakEIaikCADcDACAEIAQpAqwBNwOAAyAEQegCaiAEQYADahD3ECAEQawBaiABIANB2ABqIAMtAHAgBEHoAmoQ/Q8gBCgCrAEiA0GAgICAeEYNFAJAQSRFDQAgAEEEaiAEQawBakEEakEk/AoAAAsgACADNgIAIAQoAugCIAQoAuwCQQFBAhDAEQwgCyAEQawBaiABKAIAIgIQqA8gBCgCrAFBEEYNCyAEQYADakEYaiIBIARBrAFqQRhqIgUoAgA2AgAgBEGAA2pBEGogBEGsAWpBEGopAgA3AwAgBEGA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IAALIARBATYCsAEgBEG0sYUBNgKsASAEQgE3ArgBIARB+AA2AuwCIAQgBEHoAmo2ArQBIAQgBEGAA2o2AugCIARBrAFqQbyxhQEQhRsAC0HEsoUBEJsgAAtB1LKFARCbIAALIARBjANqIARB6AJqQQhqKQIANwIAIAQgBCkC6AI3AoQDIARBATYCgAMgBEGsAWogBEGAA2oQsgggAiAEQawBahDDDgwKC0Gks4UBEJsgAAsgBEEBNgKwASAEQfyxhQE2AqwBIARCATcCuAEgBEH4ADYC7AIgBCAEQegCajYCtAEgBCAEQYADajYC6AIgBEGsAWpBhLKFARCFGwALAkACQCAWp0EBcUUNACABKAIAIgMoAgANASAWQgiIpyECIANBfzYCAAJAAkACQCADKAIMIgFFDQAgAygCCCABQRxsaiIBQWRqIgVFDQAgBSgCAEEIRg0BC0EALQDA8Z0BGkEBEIUBIgFFDQYgASACOgAAAkAgAygCDCICIAMoAgRHDQAgA0EEakHktoUBEP4VCyADIAJBAWo2AgwgAygCCCACQRxsaiICQQE2AgwgAiABNgIIIAJCiICAgBA3AgAMAQsCQCABQXBqIgcoAgAiBSABQWhqIgYoAgBHDQAgBkHUtoUBEMENCyABQWxqKAIAIAVqIAI6AAAgByAFQQFqNgIACyADIAMoAgBBAWo2AgAMCQsgFkIgiKchAgJAAkAgASgCACIDLQAQQQFxDQAgBEEINgKwAQwBCwJAIAMtABQiAUECRg0AIAFBAXENAAJAIBZCgICAgIAQVA0AIARBCDYCsAEMAgsCQCACQd8AcUG/f2pBGUsNAEEALQDA8Z0BGkECEIUBIgFFDQYgASACOgABIAEgAjoAACAEQQE2ArQBIAQgATYCsAEgBEEBNgKsASAEQegCaiAEQawBahDcEyAEQegCahC8ByAEQYwDaiAEQfACaikCADcCACAEIAQpAugCNwKEAyAEQQE2AoADIARBsAFqIARBgANqELIIDAILIARBCDYCsAEMAQsCQCACIAIQtxANACAEQQg2ArABDAELQQAtAMDxnQEaQQgQhQEiAUUNBCABIAI2AgQgASACNgIAIARBATYCtAEgBCABNgKwASAEQQE2AqwBIARB6AJqIARBrAFqEN0TIARB6AJqENsEIARBjANqIARB6AJqQQhqKQIANwIAIAQgBCkC6AI3AoQDIARBADYCgAMgBEGwAWogBEGAA2oQsggLIARBIGpBCGoiASAEQawBakEQaikCADcDACAEQSBqQRBqIgUgBEHEAWopAgA3AwAgBCAEKQK0ATcDIAJAIAQoArABIgdBCEYNACAEQcABaiAFKQMANwIAIARBuAFqIAEpAwA3AgAgBCAEKQMgNwKwASAEIAc2AqwBIAMgBEGsAWoQww4MCQsgAyACEJgGDAgLQcS2hQEQ+BQACwtBAC0AwPGdARogAy0AQCEIIAItABMhCUEcEIUBIgMNAQsACyADIAQpAtQBNwIAIANBGGogBEHUAWpBGGooAgAiBjYCACADQRBqIARB1AFqQRBqKQIANwIAIANBCGogBEHUAWpBCGopAgA3AgAgBCABNgKMAyAEIAU2AoQDIAQgBzYCgAMgBCADNgKIAyAEIAggCUEBcXM6AJADAkACQCAGKAIIQQFHDQAgBigCDA0AQQEhBiAEQQE2AoADIAQgAUEARyIBNgKMAyAEIAVBAEcgB0EBc3IiBTYChAMMAQsgByEGCwJAAkACQAJAAkAgAQ4CAAECCyAGRQ0BIAUNARDfEiEBIAMQ9R1BACEFDAILIAZFDQAgBUEBRw0AIARB8AJqIARB4AFqKQIANwMAIARB+AJqIARB6AFqKAIANgIAIAQgBCkC2AE3A+gCIAQoAuwBIQEgBCgC1AEhBQwBCyAEQYADahDzByEBIARB6AJqQRBqIARBgANqQRBqKAIANgIAIARB6AJqQQhqIARBgANqQQhqKQIANwMAIAQgBCkCgAM3A+gCQQQhBQwBCyADQRxBBBCeEgsgBEG4AWogBEHwAmopAwA3AgAgBEHAAWogBEH4AmooAgA2AgAgBCAFNgKsASAEIAQpA+gCNwKwASAEIAE2AsQBIAIgBEGsAWoQww4MAwsgAkH/AXFBAkYgAnIhAgJAAkACQAJAAkACQCAHQQFxDQACQCACQQFxDQAgBkEBcQ0EIARB1AJqIAVBCHQgBUH/AXFyEO0PIARB1AJqEI4FIARB9AJqIARB1AJqQQhqKQIANwIAIAQgBCkC1AI3AuwCIARBATYC6AIgBEGAA2ogBEHoAmoQsggMBgsgBkEBcQ0CIAVBf0oNAUECIQgMBgsgAkEBcQ0DIARB7AJqQYD+AxDtDyAEQQE2AugCIARBgANqIARB6AJqELIIDAQLIARB1AJqIAWtQv8BgyIWQiCGIBaEEO4PIARB1AJqEPAEIARB9AJqIARB3AJqKQIANwIAIAQgBCkC1AI3AuwCIARBADYC6AIgBEGAA2ogBEHoAmoQsggMAwsgBEKOgICA8P+/CDcC+AIgBEKLgICAwAE3AvACIARCgICAgJABNwLoAiAEQdgCaiAEQegCahCQDCAEQQA2AtQCIARBgANqIARB1AJqELIIDAILIARBjv4DOwDYAiAEQYCSrOAANgDUAiAEQewCaiAEQdQCahDcDCAEQQE2AugCIARBgANqIARB6AJqELIIDAELIARB7AJqQoCAgIDw/78IEO4PIARBADYC6AIgBEGAA2ogBEHoAmoQsggLIARByAFqIARBmANqKAIANgIAIARBwAFqIARBkANqKQIANwIAIARBuAFqIARBiANqKQIANwIAIAQgBCkCgAM3ArABDAELIARBrAFqIAEoAgQgASgCCCAEQdgAaiAIEJcPIAQoAqwBIgFBgICAgHhGDQAgBEHQAGogBEGsAWpBHGooAgAiAzYCACAEQcgAaiAEQawBakEUaikCACIWNwMAIARBwABqIARBrAFqQQxqKQIAIhc3AwAgBCAEKQKwASIYNwM4IAQpAswBIRkgAEEcaiADNgIAIABBFGogFjcCACAAQQxqIBc3AgAgACAYNwIEIAAgGTcCICAAIAE2AgAMAgsgBEHQAGogBEHIAWooAgA2AgAgBEHIAGogBEHAAWopAgA3AwAgBEHAAGogBEG4AWopAgA3AwAgBCAEKQKwATcDOCADIARBOGoQww4LIABBgICAgHg2AgALIARBoANqJAALxToBG38jAEGAAWsiBSQAIAJBADYCaCACQQA2AlQgAkEANgI4IAJBADYCJCACQQA2AggCQAJAAkACQAJAAkAgAygCECIGIAMoAhQiB0sNACADKAIMIghBf0YNAyADKAIIIQkgBUE4aiAAIAMoAgAgAygCBBCnEiAFLQA4IgpBAkYNACABQf8BcUECRiABciELIAUoAjwhDCACQdgAaiENIAJBKGohDiAEKAIIIQ8gAy0AGEEBcSEQIAYhEQNAIAsgD0EAR3EhAwJAAkACQCACKAIkRQ0AIBEhEiADRQ0BDAILIAMgCiARIAZLcXINAwsCQCACKAIIIgMgAigCAEcN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CyAAIAE6AAAgAkHQAGokAAvsOAIdfwd+IwBBoAVrIgMkACABIAEoAngiBEH/v39xNgJ4IAEoAsABIQUCQAJAIAFBEhDPCyIGRQ0AIABBgYCAgHg2ApABIAAgBjYCAAwBCyABQcABaiEHAkAgAS0AyAEiBkFbaiIIQRJLDQBBASAIdEGDgBpxRQ0AIANByAJqIAEgASgCwAEQtgQgB0EIaiADQcgCakEIaigCADYCACAHIAMpAsgCNwIAIAEtAMgBIQYLAkAgBkH/AXFBE0cNACABKALAASEIIAEoAsQBIQYgA0HIAmogARDTASABIAY2ArwBIAEgCDYCuAEgByADKQLIAjcCACAHQQhqIANByAJqQQhqKAIANgIAIANBKGogARCPAiABKALAASEJAkACQCABQTwQzwsiCA0AAkAgAS0AyAEiCEFbaiIKQRJLDQBBASAKdEGDgBpxRQ0AIANByAJqIAEgASgCwAEQtgQgB0EIaiADQcgCakEIaigCADYCACAHIAMpAsgCNwIAIAEtAMgBIQgLIANBEzoAmAIgCEH/AXFBE0YNASABKALEASEGIAEoAsABIQkgA0G4AWogCBDeGyADQQE2AswCIANBmO+bATYCyAIgA0IBNwLUAiADQYoFrUIghiADQZgCaq2ENwNoIAMgA0HoAGo2AtACIANB6AFqIANByAJqEI0VIANB/AFqIANBwAFqKAIANgIAIAMgAykCuAE3AvQBIAkgBiADQegBahCFFSEIIAEtAMgBQaIBRw0AIAEQxxEhBiABEIcOIAEgBhDlEQsgAEGBgICAeDYCkAEgACAINgIAIANBKGoQsR8MAgsCQAJAIAINACABKALAASEKIAEoAsQBIQggA0HIAmogARDTASABIAg2ArwBIAEgCjYCuAEgByADKQLIAjcCACAHQQhqIANByAJqQQhqKAIANgIADAELIAEQhw4gASgCvAEhCAsgACADKQIoNwIAIABBgICAgHg2ApABIAAgCDYCICAAIAk2AhwgACAGNgIYIAAgBTYCFCAAIAg2AhAgACAFNgIMIABBCGogA0EoakEIaigCADYCAAwBCyABIAEoAngiBkH/v39xNgJ4IANByAJqIAEQjwQgASAGNgJ4IAMoAsgCIQgCQCADLQD0AiIJQQZGDQACQEEoRQ0AIANBKGpBBHIgA0HIAmpBBHJB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0hcMBQsgA0HlAWohBiABKAK8ASEJAkBBLEUNACADQegAaiADQbgBakEs/AoAAAsgA0H8BGpBAmogBkECai0AADoAACADIAYvAAA7AfwEIAghBiADLQDkASIKQQZGDQQgACAJNgIMAkBBLEUNACAAQRBqIANB6ABqQSz8CgAACyAAQT9qIANB/gRqLQAAOgAAIAAgAy8B/AQ7AD0gAUG8AUHAASACG2ooAgAhBgJAQdAARQ0AIABBwABqIANByAJqQdAA/AoAAAsgACAKOgA8IAAgCDYCCCAAIAY2AgQgACAFNgIAIABBmAFqIANBvAJqKAIANgIAIAAgAykCtAI3ApABDA0LIAFBEBDPCyIGRQ0BDAILIAmtQiCGIAqthCEkIAatQiCGIAithCEjQgAhIgwDCwJAIAEtAMgBIgZBW2oiCEESSw0AQQEgCHRBg4AacUUNACADQcgCaiABIAEoAsABELYEIAdBCGogA0HIAmpBCGooAgA2AgAgByADKQLIAjcCACABLQDIASEGCyADQRM6AJgCAkAgBkH/AXFBE0YNACABKALEASEIIAEoAsABIQkgA0G4AWogBhDeGyADQQE2AswCIANBmO+bATYCyAIgA0IBNwLUAiADICAgA0GYAmqthDcDaCADIANB6ABqNgLQAiADQegBaiADQcgCahCNFSADQfwBaiADQcABaigCADYCACADIAMpArgBNwL0ASAJIAggA0HoAWoQhRUhBiABLQDIAUGiAUcNASABEMcRIQggARCHDiABIAgQ5REMAQsCQAJAIAINACABKALAASEIIAEoAsQBIQYgA0HIAmogARDTASABIAY2ArwBIAEgCDYCuAEgByADKQLIAjcCACAHQQhqIANByAJqQQhqKAIANgIADAELIAEQhw4gASgCvAEhBgsgBygCACEIAkBBMEUNACAAQcAAaiADQShqQTD8CgAACyAAQQA2ApgBIABCgICAgIABNwOQASAAQQE6AIgBIAAgCzYCeCAAIAYgCCACGyIGNgJ0IAAgBTYCcCAAQQY6ADwgACAGNgIEIAAgBTYCACAAQYQBaiADQeQAaigCADYCACAAIAMpAlw3AnwMCgsgAEGBgICAeDYCkAEgACAGNgIAIANB3ABqENUdDAcLIABBgYCAgHg2ApABIAAgBjYCACADQbQCahCxHyADQcgCahCI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QRhqIREgBEHgAmpBFGohEiAEQeACakEQaiETIARB4AJqQTRqIRQgBEHgAmpBMGohFSAEQeACakEMaiEWIAGnIRcgBEHgAmpBBHIhGCAEQcgDakEEciEFIARB4AFqQSVqIRkgBEHgAmpBCGohGgNAIAQgDSIDQThqIg02AsQBIAQgAykAJTcD0AEgBCADQSxqKAAANgDXASADKAIAIgZBCkYNAiADLQAkIRsgAygCICEcIAMoAhwhCCADKAIYIR0gAykCECE4IAMoAgwhByADKAIIIQogAygCBCEJIAMpAjAhOiAZIANBJWoiAykAADcAACAZQQdqIANBB2oiHigAADYAACAEIBs6AIQCIAQgHDYCgAIgBCAINgL8ASAEIB02AvgBIAQgODcD8AEgBCAHNgLsASAEIAo2AugBIAQgCTYC5AEgBCA6NwOQAiAEIAY2AuABAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAGQQFGDQAgBkF6ag4EAQICAwILIAQgAykAADcDmAIgBCAeKAAANgCfAgJAAkAgCkECSQ0AIApBAkcNBSAEQQA2ArACIARBADYCqAIgBCAHKAIANgLAAiAEIAcoAgQiCDYCvAIgBCAINgK4AiAEIAggBygCCCIDQThsIh9qIiA2AsQCAkACQCADRQ0AQQAhBgJAA0AgCCAGaiIDQThqISEgAygCACIJQQdGDQEgA0EoaigCACEiIANBLGooAgAhIyADQTBqKAIAIQogBSADQQRqIiQpAgA3AgAgBUEIaiIdIANBDGopAgA3AgAgBUEQaiIbIANBFGopAgA3AgAgBUEYaiIcIANBHGopAgA3AgAgBUEgaiIeIANBJGooAgA2AgAgBCAJNgLIAwJAIApFDQAgBCAhNgK8AiAYICQpAgA3AgAgGEEIaiIlICRBCGopAgA3AgAgGEEQaiImICRBEGopAgA3AgAgGEEYaiInICRBGGopAgA3AgAgGEEgaiIoICRBIGooAgA2AgAgBCAJNgLgAiAEQfADaiAEQeACahDMBSAEKALwA0EMRg0LIARB4AJqQShqIikgBEHwA2pBKGoiKikDADcDACAEQeACakEgaiIrIARB8ANqQSBqIiwpAwA3AwAgBEHgAmpBGGoiLSAEQfADakEYaiIuKQMANwMAIARB4AJqQRBqIi8gBEHw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NyAdNgIYIDcgODcDECA3QQA2AgggN0EBNgIAQRIhCAwICyAEQeACakEwaiAEQeABakEwaikDADcDACAEQeACakEoaiAEQeABakEoaikDADcDACAEQeACakEgaiAEQeABakEgaikDADcDACAEQeACakEYaiAEQeABakEYaikDADcDACAEQeACakEQaiAEQeABakEQaikDADcDACAEQeACakEIaiAEQeABakEIaikDADcDACAEIAQpA+ABNwPgAkEAKALc8J0BIglFDQUgEiEDIBEhBgJAAkACQAJAAkACQCAEKALgAiIKDgoFAQIBAwMEAwMABQsgESEDIBAhBgJAAkACQAJAAkAgBCgC6AIOEwkAAAEABgYGAQIGAwEBCQICBAYJCyAWIQMgEyEGDAgLIBIhAyARIQYMBwsgECEDIA8hBgwGCyAEKALsAiIDQfwAaiEGIANB+ABqIQMMBQsCQAJAAkACQAJAAkACQCAEKALwAg4IAAECAwQEBQYACyAEKAKQAyIDQShqIQYgA0EkaiEDDAoLIAQoApADIgNBNGohBiADQTBqIQMMCQsgBCgC9AIiA0EQaiEGIANBDGohAwwICyAEKAL0AiIDQRBqIQYgA0EMaiEDDAcLIAQoAvQCIgNBBGohBgwGCyAEKAL0AiIDQRxqIQYgA0EYaiEDDAULIAQoAvQCIgNBzABqIQYgA0HIAGohAwwECyAVIQMgFCEGDAMLIBMhAyASIQYMAgsgGiEDIBYhBgwBCyAEKALkAiIDQSRqIQYgA0EgaiEDCyADKAIAIQcgBigCACEIIARB8ANqIAlBA0G965oBQT8QqQ1BAC0AwPGdARogBCgC9AMhA0EIEIUBIgZFDQ8gBiAINgIEIAYgBzYCACADKAIcIANBIGoiBygCABCeICADQSxqIgkoAgAgA0EwaigCABC+GiADKAIoIAkoAgAQnyAgCUIENwIAIANCATcCJCAHIAY2AgAgA0EBNgIcIARByANqQQhqIARB8ANqQQhqKAIANgIAIAQgBCkC8AM3A8gDIARByANqELcCIARByANqEOAMIApBCUYNBiAEQeABahCmBQwNCwJAIAQoArwBIgYgBCgCtAFHDQAgBEG0AWpB0OqaARCDFwsgBCgCuAEgBkEwbGoiAyAbOgAcIAMgHDYCGCADIAg2AhQgAyAdNgIQIAMgODcD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ADcDACADQTBqIAJBMGopAwA3AwAgA0EoaiACQShqKQMANwMAIANBIGogAkEgaikDADcDACADQRhqIAJBGGopAwA3AwAgA0EQaiACQRBqKQMANwMAIAQgAkEIaikDADcDACADIAIpAwA3AwAMCQsgACgCCEEDRw0HIAAoAgwiAygCAEEaRw0BIAJBwABqIAEoAgAgASgCBCADQQhqIgQQtQwgAigCQEEyRg0HIAMQyQEgA0E4aiACQcAAakE4aikDADcDACADQTBqIAJBwABqQTBqKQMANwMAIANBKGogAkHAAGpBKGopAwA3AwAgA0EgaiACQcAAakEgaikDADcDACADQRhqIAJBwABqQRhqKQMANwMAIANBEGogAkHAAGpBEGopAwA3AwAgBCACQcAAakEIaikDADcDACADIAIpA0A3AwAMBwsCQCAAKAIgIgVBCGooAgAiA0UNACAFQQRqKAIAIgYgA0EGdGohAANAAkAgBkE4aigCACIDRQ0AIAZBNGooAgAhBCADQQxsIQcDQAJAAkAgBCgCACIDKAIAQRpHDQAgAkHAB2ogASgCACABKAIEIANBCGoiCBC1DCACKALAB0EyRg0BIAMQyQEgA0E4aiACQcAHakE4aikDADcDACADQTBqIAJBwAdqQTBqKQMANwMAIANBKGogAkHAB2pBKGopAwA3AwAgA0EgaiACQcAHakEgaikDADcDACADQRhqIAJBwAdqQRhqKQMANwMAIANBEGogAkHAB2pBEGopAwA3AwAgCCACQcAHakEIaikDADcDACADIAIpA8AHNwMADAELIAMgARBGCyAEQQxqIQQgB0F0aiIHDQALCyAGIAEQgwQgBkHAAGoiAyEGIAMgAEcNAAsLAkAgBUEUaigCACIDRQ0AIAVBEGooAgAhBCADQQxsIQcDQAJAAkAgBCgCACIDKAIAQRpHDQAgAkGAB2ogASgCACABKAIEIANBCGoiCBC1DCACKAKAB0EyRg0BIAMQyQEgA0E4aiACQYAHakE4aikDADcDACADQTBqIAJBgAdqQTBqKQMANwMAIANBKGogAkGAB2pBKGopAwA3AwAgA0EgaiACQYAHakEgaikDADcDACADQRhqIAJBgAdqQRhqKQMANwMAIANBEGogAkGAB2pBEGopAwA3AwAgCCACQYAHakEIaikDADcDACADIAIpA4AHNwMADAELIAMgARBGCyAEQQxqIQQgB0F0aiIHDQALCyAFKAIYQYCAgIB4Rg0IIAVBIGooAgAiBEUNCCAFQRxqKAIAIQMgBEEwbCEEA0AgAyABEG8gA0EwaiEDIARBUGoiBA0ADAkLCyADIAEQRgwFCyADIAEQRgwFCwJAIAAoAggiA0EFRg0AIANBA0cNAAJAIAAoAgwiAygCAEEaRw0AIAJBwARqIAEoAgAgASgCBCADQQhqIgQQtQwgAigCwARBMkYNASADEMkBIANBOGogAkHABGpBOGopAwA3AwAgA0EwaiACQcAEakEwaikDADcDACADQShqIAJBwARqQShqKQMANwMAIANBIGogAkHABGpBIGopAwA3AwAgA0EYaiACQcAEakEYaikDADcDACADQRBqIAJBwARqQRBqKQMANwMAIAQgAkHABGpBCGopAwA3AwAgAyACKQPABDcDAAwBCyADIAEQRgsCQCAAKAI8IgNFDQACQCADKAIAQRpHDQAgAkGABGogASgCACABKAIEIANBCGoiBBC1DCACKAKABEEyRg0BIAMQyQEgA0E4aiACQYAEakE4aikDADcDACADQTBqIAJBgARqQTBqKQMANwMAIANBKGogAkGABGpBKGopAwA3AwAgA0EgaiACQYAEakEgaikDADcDACADQRhqIAJBgARqQRhqKQMANwMAIANBEGogAkGABGpBEGopAwA3AwAgBCACQYAEakEIaikDADcDACADIAIpA4AENwMADAELIAMgARBGCyAAKAI4IgNFDQUgACgCNCEEIANBDGwhBwNAAkACQCAEKAIAIgMoAgBBGkcNACACQcADaiABKAIAIAEoAgQgA0EIaiIIELUMIAIoAsADQTJGDQEgAxDJASADQThqIAJBwANqQThqKQMANwMAIANBMGogAkHAA2pBMGopAwA3AwAgA0EoaiACQcADakEoaikDADcDACADQSBqIAJBwANqQSBqKQMANwMAIANBGGogAkHAA2pBGGopAwA3AwAgA0EQaiACQcADakEQaikDADcDACAIIAJBwANqQQhqKQMANwMAIAMgAikDwAM3AwAMAQsgAyABEEYLIARBDGohBCAHQXRqIgcNAAwGCwsgACgCDCIERQ0EIAAoAgghAyAEQTBsIQQDQCADIAEQbyADQTBqIQMgBEFQaiIEDQAMBQsLAkAgACgCJCIDRQ0AAkAgAygCAEEaRw0AIAJBgANqIAEoAgAgASgCBCADQQhqIgQQtQwgAigCgANBMkYNASADEMkBIANBOGogAkGAA2pBOGopAwA3AwAgA0EwaiACQYADakEwaikDADcDACADQShqIAJBgANqQShqKQMANwMAIANBIGogAkGAA2pBIGopAwA3AwAgA0EYaiACQYADakEYaikDADcDACADQRBqIAJBgANqQRBqKQMANwMAIAQgAkGAA2pBCGopAwA3AwAgAyACKQOAAzcDAAwBCyADIAEQRgsgACgCNCIDRQ0DIAAoAjAhBCADQQxsIQcDQAJAAkAgBCgCACIDKAIAQRpHDQAgAkHAAmogASgCACABKAIEIANBCGoiCBC1DCACKALAAkEyRg0BIAMQyQEgA0E4aiACQcACakE4aikDADcDACADQTBqIAJBwAJqQTBqKQMANwMAIANBKGogAkHAAmpBKGopAwA3AwAgA0EgaiACQcACakEgaikDADcDACADQRhqIAJBwAJqQRhqKQMANwMAIANBEGogAkHAAmpBEGopAwA3AwAgCCACQcACakEIaikDADcDACADIAIpA8ACNwMADAELIAMgARBGCyAEQQxqIQQgB0F0aiIHDQAMBAsLAkAgACgCCEEDRw0AAkAgACgCDCIDKAIAQRpHDQAgAkGAAmogASgCACABKAIEIANBCGoiBBC1DCACKAKAAkEyRg0BIAMQyQEgA0E4aiACQYACakE4aikDADcDACADQTBqIAJBgAJqQTBqKQMANwMAIANBKGogAkGAAmpBKGopAwA3AwAgA0EgaiACQYACakEgaikDADcDACADQRhqIAJBgAJqQRhqKQMANwMAIANBEGogAkGAAmpBEGopAwA3AwAgBCACQYACakEIaikDADcDACADIAIpA4ACNwMADAELIAMgARBGCwJAIAAoAjwiA0UNAAJAIAMoAgBBGkcNACACQcABaiABKAIAIAEoAgQgA0EIaiIEELUMIAIoAsABQTJGDQEgAxDJASADQThqIAJBwAFqQThqKQMANwMAIANBMGogAkHAAWpBMGopAwA3AwAgA0EoaiACQcABakEoaikDADcDACADQSBqIAJBwAFqQSBqKQMANwMAIANBGGogAkHAAWpBGGopAwA3AwAgA0EQaiACQcABakEQaikDADcDACAEIAJBwAFqQQhqKQMANwMAIAMgAikDwAE3AwAMAQsgAyABEEYLIAAoAjgiA0UNAiAAKAI0IQQgA0EMbCEHA0ACQAJAIAQoAgAiAygCAEEaRw0AIAJBgAFqIAEoAgAgASgCBCADQQhqIggQtQwgAigCgAFBMkYNASADEMkBIANBOGogAkGAAWpBOGopAwA3AwAgA0EwaiACQYABakEwaikDADcDACADQShqIAJBgAFqQShqKQMANwMAIANBIGogAkGAAWpBIGopAwA3AwAgA0EYaiACQYABakEYaikDADcDACADQRBqIAJBgAFqQRBqKQMANwMAIAggAkGAAWpBCGopAwA3AwAgAyACKQOAATcDAAwBCyADIAEQRgsgBEEMaiEEIAdBdGoiBw0ADAMLCwJAIAAoAjAiBUEIaigCACIDRQ0AIAVBBGooAgAiBiADQQZ0aiEAA0ACQCAGQThqKAIAIgNFDQAgBkE0aigCACEEIANBDGwhBwNAAkACQCAEKAIAIgMoAgBBGkcNACACQcAGaiABKAIAIAEoAgQgA0EIaiIIELUMIAIoAsAGQTJGDQEgAxDJASADQThqIAJBwAZqQThqKQMANwMAIANBMGogAkHABmpBMGopAwA3AwAgA0EoaiACQcAGakEoaikDADcDACADQSBqIAJBwAZqQSBqKQMANwMAIANBGGogAkHABmpBGGopAwA3AwAgA0EQaiACQcAGakEQaikDADcDACAIIAJBwAZqQQhqKQMANwMAIAMgAikDwAY3AwAMAQsgAyABEEYLIARBDGohBCAHQXRqIgcNAAsLIAYgARCDBCAGQcAAaiIDIQYgAyAARw0ACwsCQCAFQRRqKAIAIgNFDQAgBUEQaigCACEEIANBDGwhBwNAAkACQCAEKAIAIgMoAgBBGkcNACACQYAGaiABKAIAIAEoAgQgA0EIaiIIELUMIAIoAoAGQTJGDQEgAxDJASADQThqIAJBgAZqQThqKQMANwMAIANBMGogAkGABmpBMGopAwA3AwAgA0EoaiACQYAGakEoaikDADcDACADQSBqIAJBgAZqQSBqKQMANwMAIANBGGogAkGABmpBGGopAwA3AwAgA0EQaiACQYAGakEQaikDADcDACAIIAJBgAZqQQhqKQMANwMAIAMgAikDgAY3AwAMAQsgAyABEEYLIARBDGohBCAHQXRqIgcNAAsLIAUoAhhBgICAgHhGDQEgBUEgaigCACIERQ0BIAVBHGooAgAhAyAEQTBsIQQDQCADIAEQbyADQTBqIQMgBEFQaiIEDQAMAgsLAkAgACgCSCIDRQ0AIAAoAkQiBiADQQZ0aiEFA0ACQAJAIAYoAgBBB0YNAAJAIAZBOGooAgAiA0UNACAGQTRqKAIAIQQgA0EMbCEHA0ACQAJAIAQoAgAiAygCAEEaRw0AIAJBwAVqIAEoAgAgASgCBCADQQhqIggQtQwgAigCwAVBMkYNASADEMkBIANBOGogAkHABWpBOGopAwA3AwAgA0EwaiACQcAFakEwaikDADcDACADQShqIAJBwAVqQShqKQMANwMAIANBIGogAkHABWpBIGopAwA3AwAgA0EYaiACQcAFakEYaikDADcDACADQRBqIAJBwAVqQRBqKQMANwMAIAggAkHABWpBCGopAwA3AwAgAyACKQPABTcDAAwBCyADIAEQRgsgBEEMaiEEIAdBdGoiBw0ACwsgBiABEJcDDAELAkAgBkE4aigCACIDRQ0AIAZBNGooAgAhBCADQQxsIQcDQAJAAkAgBCgCACIDKAIAQRpHDQAgAkGABWogASgCACABKAIEIANBCGoiCBC1DCACKAKABUEyRg0BIAMQyQEgA0E4aiACQYAFakE4aikDADcDACADQTBqIAJBgAVqQTBqKQMANwMAIANBKGogAkGABWpBKGopAwA3AwAgA0EgaiACQYAFakEgaikDADcDACADQRhqIAJBgAVqQRhqKQMANwMAIANBEGogAkGABWpBEGopAwA3AwAgCCACQYAFakEIaikDADcDACADIAIpA4AFNwMADAELIAMgARBGCyAEQQxqIQQgB0F0aiIHDQALCyAGLQAcQQJHDQACQAJAAkACQAJAAkAgBigCCCIDKAIADgcFAAECBAUDBQsgA0EMaigCACIERQ0EIANBCGooAgAhAyAEQShsIQQDQAJAIAMoAgBBB0YNACADIAEQlwMLIANBKGohAyAEQVhqIgQNAAwFCwsgAygCBCABEJcDDAMLIANBDGooAgAiBEUNAiADQQhqKAIAIQMgBEE4bCEEA0ACQAJAAkACQAJAIAMoAgAOAwABAgALIANBCGogARCJBAwDCyADQTBqKAIAIgdFDQIgBygCAEEaRw0BIAJBwAhqIAEoAgAgASgCBCAHQQhqIggQtQwgAigCwAhBMkYNAiAHEMkBIAdBOGogAkHACGpBOGopAwA3AwAgB0EwaiACQcAIakEwaikDADcDACAHQShqIAJBwAhqQShqKQMANwMAIAdBIGogAkHACGpBIGopAwA3AwAgB0EYaiACQcAIakEYaikDADcDACAHQRBqIAJBwAhqQRBqKQMANwMAIAggAkHACGpBCGopAwA3AwAgByACKQPACDcDAAwCCyADQQRqIAEQuAUMAQsgByABEEYLIANBOGohAyAEQUhqIgQNAAwDCwsCQCADKAIEIgMoAgBBGkcNACACQcAIaiABKAIAIAEoAgQgA0EIaiIEELUMIAIoAsAIQTJGDQIgAxDJASADQThqIAJBwAhqQThqKQMANwMAIANBMGogAkHACGpBMGopAwA3AwAgA0EoaiACQcAIakEoaikDADcDACADQSBqIAJBwAhqQSBqKQMANwMAIANBGGogAkHACGpBGGopAwA3AwAgA0EQaiACQcAIakEQaikDADcDACAEIAJBwAhqQQhqKQMANwMAIAMgAikDwAg3AwAMAgsgAyABEEYMAQsgAygCBCABEJcDAkAgAygCCCIDKAIAQRpHDQAgAkHACGogASgCACABKAIEIANBCGoiBBC1DCACKALACEEyRg0BIAMQyQEgA0E4aiACQcAIakE4aikDADcDACADQTBqIAJBwAhqQTBqKQMANwMAIANBKGogAkHACGpBKGopAwA3AwAgA0EgaiACQcAIakEgaikDADcDACADQRhqIAJBwAhqQRhqKQMANwMAIANBEGogAkHACGpBEGopAwA3AwAgBCACQcAIakEIaikDADcDACADIAIpA8AINwMADAELIAMgARBGCwJAIAYoAgwiAygCAEEaRw0AIAJBgAhqIAEoAgAgASgCBCADQQhqIgQQtQwgAigCgAhBMkYNASADEMkBIANBOGogAkGACGpBOGopAwA3AwAgA0EwaiACQYAIakEwaikDADcDACADQShqIAJBgAhqQShqKQMANwMAIANBIGogAkGACGpBIGopAwA3AwAgA0EYaiACQYAIakEYaikDADcDACADQRBqIAJBgAhqQRBqKQMANwMAIAQgAkGACGpBCGopAwA3AwAgAyACKQOACDcDAAwBCyADIAEQRgsgBkHAAGoiBiAFRw0ACwsgACgCIEGAgICAeEYNACAAKAIoIgRFDQAgACgCJCEDIARBMGwhBANAIAMgARBvIANBMGohAyAEQVBqIgQNAAsLIAJBgAlqJAALrC0CDH8CfiMAQeAAayICJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgAiA0F8aiIEQQQgBEEHSRsOBwABAgMEBQYACyABLQA0QQFHDQwgASgCMBCBEiEEIAJBwABqQQhqQQApA5j7nAEiDjcDACACQcAAakEQakEAKQOQ+5wBIg83AwAgAkHAAGpBGGogDjcDACACQTRqIAFBNGooAgA2AgAgAkEIaiAONwMAIAJBEGogDzcDACACQRhqIA43AwAgAiAPNwNAIAIgASkCLDcCLCACIA83AwAgAS0AOCEDIAEtAD0hBSACIAEvADs7ADsgAkGBAjsAOSACQQE6ACggAiAENgIkIAIgATYCICACIAU6AD0gAiADOgA4AkAgACgCHCIBRQ0AIAItADRBAUcNACACQQA6ADkCQCABKAIIIgNFDQAgA0EwbCEEIAEoAgQiBUEIaiEBA0AgAiABEJcQIAFBMGohASAEQVBqIgQNAAsgAi0ANEEBRw0AIANBMGwhBCAFQSBqIQEDQAJAIAItADRBAUcNACACIAFBaGoQlxAgAi0AOSEDAkAgAUEEaigCACIFRQ0AIAItADRBAUcNACACLQA6IQYgAkGBAjsAOSAFIAIQ9AEgAiAGOgA6IAIgAzoAOQsCQCABKAIAIgVFDQAgAi0ANEEBRw0AIAItADohBiACQYECOwA5IAUgAhD0ASACIAY6ADoLIAIgAzoAOQsgAUEwaiEBIARBUGoiBA0ACwsgAkEBOgA6CwJAIAAoAgwiAUUNACACLQA0QQFHDQAgACgCCCIDIAFBKGxqIQcgAkHAAGpBDGohCCACQcAAakEIaiEJA0ACQCACLQA0QQFHDQACQAJAAkACQCADKAIADgQAAQIDAAsgAi0AOiEEIAItADkhAQJAIAMoAiAiBUUNACACQYECOwA5IAUoAgAgAhD0ASACIAQ6ADoLIAIgAToAOSACIANBCGoQlxAgAiABOgA5IAIgBDoAOgwDCwJAIANBDGooAgAiBEUNACADQQhqKAIAIQEgBEEobCEEA0ACQCABKAIAQQdGDQAgASACEIQECyABQShqIQEgBEFYaiIEDQALCyADKAIYIgFFDQIgAi0ANEEBRw0CIAIvADkhBCACQYECOwA5IAEoAgAgAhD0ASACIAQ7ADkMAgsgAygCBCACEIQEIAMoAhgiAUUNASACLQA0QQFHDQEgAi8AOSEEIAJBgQI7ADkgASgCACACEPQBIAIgBDsAOQwBCwJAIANBDGooAgAiAUUNACADQQhqKAIAIQYgAUE4bCEKQQAhBANAAkACQAJAAkAgBiAEaiIBKAIADgMAAQIACwJAIAFBCGooAgBBA0cNACABQQxqKAIAIQUgAkEDNgJIIAItADkhCyACQQE6ADkgBSACEGwgAiALOgA5IAIoAkgiBUEBSw0AIAkgAkHAAGoQoBggCSACKQNAEO8XIAVFDQAgAigCTCIFIAUoAgAiBUF/ajYCACAFQQFHDQAgCBDfDwsgAUEoaigCACACEIQEDAILIAFBEGohDCACLQA6IQsgAi0AOSEFAkAgAUEoaigCACINRQ0AIAItADRBAUcNACACQYECOwA5IA0oAgAgAhD0ASACIAs6ADoLIAIgBToAOSACIAwQlxAgAiAFOgA5IAIgCzoAOiABQTBqKAIAIgFFDQEgAkEBOgA5IAEgAhBsIAIgBToAOQwBCyABQQRqKAIAIAIQhAQgAUEYaigCACIBRQ0AIAItADRBAUcNACACLwA5IQUgAkGBAjsAOSABKAIAIAIQ9AEgAiAFOwA5CyAKIARBOGoiBEcNAAsLIAMoAhgiAUUNACACLQA0QQFHDQAgAi8AOSEEIAJBgQI7ADkgASgCACACEPQBIAIgBDsAOQsgA0EoaiIDIAdHDQALCwJAIAAoAhgiAUUNACACLQA0QQFHDQAgAi8AOSEEIAJBgQI7ADkgASgCACACEPQBIAIgBDsAOQsCQCACKAIEIgFFDQAgAigCACACKAIMEJIMIAEgAUEEdEEXakFwcSIEakEJaiIBRQ0AIAIoAgAgBGsgAUEIEJ4SCyACQRBqENYVDAwLIAEtADRBAUcNCyABKAIwEIESIQQgAkHAAGpBCGpBACkDmPucASIONwMAIAJBwABqQRBqQQApA5D7nAEiDzcDACACQcAAakEYaiAONwMAIAJBNGogAUE0aigCADYCACACQQhqIA43AwAgAkEQaiAPNwMAIAJBGGogDjcDACACIA83A0AgAiABKQIsNwIsIAIgDzcDACABLQA4IQMgAS0APSEFIAIgAS8AOzsAOyACQYECOwA5IAJBAToAKCACIAQ2AiQgAiABNgIgIAIgBToAPSACIAM6ADgCQCAAKAIcIgFFDQAgAi0ANEEBRw0AIAJBADoAOQJAIAEoAggiA0UNACADQTBsIQQgASgCBCIFQQhqIQEDQCACIAEQlxAgAUEwaiEBIARBUGoiBA0ACyACLQA0QQFHDQAgA0EwbCEEIAVBIGohAQNAAkAgAi0ANEEBRw0AIAIgAUFoahCXECACLQA5IQMCQCABQQRqKAIAIgVFDQAgAi0ANEEBRw0AIAItADohBiACQYECOwA5IAUgAhD0ASACIAY6ADogAiADOgA5CwJAIAEoAgAiBUUNACACLQA0QQFHDQAgAi0AOiEGIAJBgQI7ADkgBSACEPQBIAIgBjoAOgsgAiADOgA5CyABQTBqIQEgBEFQaiIEDQALCyACQQE6ADoLAkAgACgCDCIBRQ0AIAItADRBAUcNACAAKAIIIgMgAUEobGohByACQcAAakEMaiEIIAJBwABqQQhqIQkDQAJAIAItADRBAUcNAAJAAkACQAJAIAMoAgAOBAABAgMACyACLQA6IQQgAi0AOSEBAkAgAygCICIFRQ0AIAJBgQI7ADkgBSgCACACEPQBIAIgBDoAOgsgAiABOgA5IAIgA0EIahCXECACIAE6ADkgAiAEOgA6DAMLAkAgA0EMaigCACIERQ0AIANBCGooAgAhASAEQShsIQQDQAJAIAEoAgBBB0YNACABIAIQhAQLIAFBKGohASAEQVhqIgQNAAsLIAMoAhgiAUUNAiACLQA0QQFHDQIgAi8AOSEEIAJBgQI7ADkgASgCACACEPQBIAIgBDsAOQwCCyADKAIEIAIQhAQgAygCGCIBRQ0BIAItADRBAUcNASACLwA5IQQgAkGBAjsAOSABKAIAIAIQ9AEgAiAEOwA5DAELAkAgA0EMaigCACIBRQ0AIANBCGooAgAhBiABQThsIQpBACEEA0ACQAJAAkACQCAGIARqIgEoAgAOAwABAgALAkAgAUEIaigCAEEDRw0AIAFBDGooAgAhBSACQQM2AkggAi0AOSELIAJBAToAOSAFIAIQbCACIAs6ADkgAigCSCIFQQFLDQAgCSACQcAAahCgGCAJIAIpA0AQ7xcgBUUNACACKAJMIgUgBSgCACIFQX9qNgIAIAVBAUcNACAIEN8PCyABQShqKAIAIAIQhAQMAgsgAUEQaiEMIAItADohCyACLQA5IQUCQCABQShqKAIAIg1FDQAgAi0ANEEBRw0AIAJBgQI7ADkgDSgCACACEPQBIAIgCzoAOgsgAiAFOgA5IAIgDBCXECACIAU6ADkgAiALOgA6IAFBMGooAgAiAUUNASACQQE6ADkgASACEGwgAiAFOgA5DAELIAFBBGooAgAgAhCEBCABQRhqKAIAIgFFDQAgAi0ANEEBRw0AIAIvADkhBSACQYECOwA5IAEoAgAgAhD0ASACIAU7ADkLIAogBEE4aiIERw0ACwsgAygCGCIBRQ0AIAItADRBAUcNACACLwA5IQQgAkGBAjsAOSABKAIAIAIQ9AEgAiAEOwA5CyADQShqIgMgB0cNAAsLAkAgACgCGCIBRQ0AIAItADRBAUcNACACLwA5IQQgAkGBAjsAOSABKAIAIAIQ9AEgAiAEOwA5CwJAIAIoAgQiAUUNACACKAIAIAIoAgwQkgwgASABQQR0QRdqQXBxIgRqQQlqIgFFDQAgAigCACAEayABQQgQnhILIAJBEGoQ1hUMCwsgAS0ANEEBRw0KIAAtABVFDQkgAS0AOSEEIAFBAToAOSAAKAIQIAEQbCABIAQ6ADkMCQsgAC0AFA0DDAcLIAAtADRFDQUgAS0AOSEEIAFBAToAOSAAKAIwIAEQbCABIAQ6ADkMBQsgAS0ANEEBRw0HIAEoAjAQgRIhBCACQcAAakEIakEAKQOY+5wBIg43AwAgAkHAAGpBEGpBACkDkPucASIPNwMAIAJBwABqQRhqIA43AwAgAkE0aiABQTRqKAIANgIAIAJBCGogDjcDACACQRBqIA83AwAgAkEYaiAONwMAIAIgDzcDQCACIAEpAiw3AiwgAiAPNwMAIAEtADghAyABLQA9IQUgAiABLwA7OwA7IAJBgQI7ADkgAkEBOgAoIAIgBDYCJCACIAE2AiAgAiAFOgA9IAIgAzoAOAJAIAAoAiAiAUUNACACLQA0QQFHDQAgAkEAOgA5IAIgARDiCiACQQE6ADoLIAAtACQNAgwDCyABLQA0QQFHDQYgACgCDCEDIAAoAgghBCACIAE2AgACQCADRQ0AIANBKGwhAwNAIAIgBBD+BCAEQShqIQQgA0FYaiIDDQALCyAAKAIQIgRFDQYgAS0ANEEBRw0GIAEvADkhACABQYECOwA5IAQoAgAgARD0ASABIAA7ADkMBgsgAS0AOSEEIAFBAToAOSAAKAIEIAEQbCABIAQ6ADkMAwsgAi0AOSEBIAJBAToAOSAAKAIQIAIQbCACIAE6ADkLAkAgACgCDCIBRQ0AIAItADRBAUcNACAAKAIIIgMgAUEobGohByACQcAAakEMaiEIIAJBwABqQQhqIQkDQAJAIAItADRBAUcNAAJAAkACQAJAIAMoAgAOBAABAgMACyACLQA6IQQgAi0AOSEBAkAgAygCICIFRQ0AIAJBgQI7ADkgBSgCACACEPQBIAIgBDoAOgsgAiABOgA5IAIgA0EIahCXECACIAE6ADkgAiAEOgA6DAMLAkAgAygCDCIERQ0AIAMoAgghASAEQShsIQQDQAJAIAEoAgBBB0YNACABIAIQhAQLIAFBKGohASAEQVhqIgQNAAsLIAMoAhgiAUUNAiACLQA0QQFHDQIgAi8AOSEEIAJBgQI7ADkgASgCACACEPQBIAIgBDsAOQwCCyADKAIEIAIQhAQgAygCGCIBRQ0BIAItADRBAUcNASACLwA5IQQgAkGBAjsAOSABKAIAIAIQ9AEgAiAEOwA5DAELAkAgAygCDCIBRQ0AIAMoAgghBiABQThsIQpBACEEA0ACQAJAAkACQCAGIARqIgEoAgAOAwABAgALAkAgAUEIaigCAEEDRw0AIAItADkhBSACQQE6ADkgAUEMaigCACACEGwgAiAFOgA5CyABQShqKAIAIAIQhAQMAgsgAUEQaiEMIAItADohCyACLQA5IQUCQCABQShqKAIAIg1FDQAgAi0ANEEBRw0AIAJBgQI7ADkgDSgCACACEPQBIAIgCzoAOgsgAiAFOgA5IAIgDBCXECACIAU6ADkgAiALOgA6IAFBMGooAgAiAUUNASACQQM2AkggAkEBOgA5IAEgAhBsIAIgBToAOSACKAJIIgFBAUsNASAJIAJBwABqEKAYIAkgAikDQBDvFyABRQ0BIAIoAkwiASABKAIAIgFBf2o2AgAgAUEBRw0BIAgQ3w8MAQsgAUEEaigCACACEIQEIAFBGGooAgAiAUUNACACLQA0QQFHDQAgAi8AOSEFIAJBgQI7ADkgASgCACACEPQBIAIgBTsAOQsgCiAEQThqIgRHDQALCyADKAIYIgFFDQAgAi0ANEEBRw0AIAIvADkhBCACQYECOwA5IAEoAgAgAhD0ASACIAQ7ADkLIANBKGoiAyAHRw0ACwsCQCAAKAIcIgFFDQAgAi0ANEEBRw0AIAIvADkhBCACQYECOwA5IAEoAgAgAhD0ASACIAQ7ADkLAkAgAigCBCIBRQ0AIAIoAgAgAigCDBCSDCABIAFBBHRBF2pBcHEiBGpBCWoiAUUNACACKAIAIARrIAFBCBCeEgsgAkEQahDWFQwDCyABLQA0QQFHDQICQAJAAkACQCADDgQAAQIDAAsgAEEIaiEFIAEtADohAyABLQA5IQQCQCAAKAIgIgBFDQAgAUGBAjsAOSAAKAIAIAEQ9AEgASADOgA6CyABIAQ6ADkgASAFEJcQIAEgBDoAOSABIAM6ADoMBQsCQCAAKAIMIgNFDQAgACgCCCEEIANBKGwhAwNAAkAgBCgCAEEHRg0AIAQgARCEBAsgBEEoaiEEIANBWGoiAw0ACwsgACgCGCIERQ0EIAEtADRBAUcNBCABLwA5IQAgAUGBAjsAOSAEKAIAIAEQ9AEgASAAOwA5DAQLIAAoAgQgARCEBCAAKAIYIgRFDQMgAS0ANEEBRw0DIAEvADkhACABQYECOwA5IAQoAgAgARD0ASABIAA7ADkMAwsCQCAAKAIMIgRFDQAgACgCCCEGIARBOGwhCiACQQxqIQkgAkEIaiEHQQAhAwNAAkACQAJAAkAgBiADaiIEKAIADgMAAQIACwJAIARBCGooAgBBA0cNACAEQQxqKAIAIQUgAS0AOSELIAFBAToAOSACQQM2AgggBSABEGwgASALOgA5IAIoAggiBUEBSw0AIAcgAhCgGCAHIAIpAwAQ7xcgBUUNACACKAIMIgUgBSgCACIFQX9qNgIAIAVBAUcNACAJEN8PCyAEQShqKAIAIAEQhAQMAgsgBEEQaiEMIAEtADohCyABLQA5IQUCQCAEQShqKAIAIg1FDQAgAS0ANEEBRw0AIAFBgQI7ADkgDSgCACABEPQBIAEgCzoAOgsgASAFOgA5IAEgDBCXECABIAU6ADkgASALOgA6IARBMGooAgAiBEUNASABQQE6ADkgBCABEGwgASAFOgA5DAELIARBBGooAgAgARCEBCAEQRhqKAIAIgRFDQAgAS0ANEEBRw0AIAEvADkhBSABQYECOwA5IAQoAgAgARD0ASABIAU7ADkLIAogA0E4aiIDRw0ACwsgACgCGCIERQ0CIAEtADRBAUcNAiABLwA5IQAgAUGBAjsAOSAEKAIAIAEQ9AEgASAAOwA5DAILIAAoAhAiBEUNASABLQA0QQFHDQEgAS8AOSEAIAFBgQI7ADkgBCgCACABEPQBIAEgADsAOQwBCyABKAIwEIESIQQgAkHAAGpBCGpBACkDmPucASIONwMAIAJBwABqQRBqQQApA5D7nAEiDzcDACACQcAAakEYaiAONwMAIAJBNGogAUE0aigCADYCACACQQhqIA43AwAgAkEQaiAPNwMAIAJBGGogDjcDACACIA83A0AgAiABKQIsNwIsIAIgDzcDACABLQA4IQMgAS0APSEFIAIgAS8AOzsAOyACQYECOwA5IAJBAToAKCACIAQ2AiQgAiABNgIgIAIgBToAPSACIAM6ADgCQCAAKAIMIgFFDQAgAi0ANEEBRw0AIAJBAToAOSABKAIAIAIQ9AEgAkGBAjsAOQsCQCACKAIEIgFFDQAgAigCACACKAIMEJIMIAEgAUEEdEEXakFwcSIEakEJaiIBRQ0AIAIoAgAgBGsgAUEIEJ4SCyACQRBqENYVCyACQeAAaiQAC8wtAhx/AX4jAEHwAWsiAiQAIAJBMGogACAAKAIAKAIEEQcAIAIgAigCNCIDNgI8IAIgAigCMCIENgI4AkACQAJAAkACQAJAIAEtAApBgAFxDQBBASEFIAJBATYCpAEgAkGY75sBNgKgASACQgE3AqwBIAJBEzYCfCACIAJB+ABqNgKoASACIAJBOGo2AnggASgCACABKAIEIAJBoAFqELceDQIgAkEoaiAEIAMoAhgRBwAgAigCKCIDRQ0BIAIoAiwhBCACQQA2ArABQQEhBSACQQE2AqQBIAJB1M6AATYCoAEgAkIENwKoASABKAIAIAEoAgQgAkGgAWoQtx4NAiACQSBqIAMgBCgCGBEHACACKAIgIQUgAkEANgKIASACIAQ2AoABIAIgAzYCfCACQQA2AnggBUEARyEGA0AgAkEYaiACQfgAahC/DwJAIAIoAhgiBQ0AIAIoAnggAigCgAEQ7B0MAwsgAigCHCEDIAIgAigCiAEiBEEBajYCiAEgAiADNgLkASACIAU2AuABIAJBADYCsAEgAkEBNgKkASACQdzOgAE2AqABIAJCBDcCqAECQCABKAIAIAEoAgQgAkGgAWoQtx4NACACQQA6AHQgAiAENgJsIAIgBjYCaCACIAE2AnAgAkEBNgKkASACQZjvmwE2AqABIAJCATcCrAEgAkETNgJcIAIgAkHYAGo2AqgBIAIgAkHgAWo2AlggAkHoAGogAkGgAWoQth5FDQELCyACKAJ4IAIoAoABEOwdQQEhBQwCCyAEIAEgAygCDBEIACEFDAELAkACQAJAAkACQAJAAkACQAJAAkAgACgCBCIDQQNGDQAgAEEEaiEADAELIAJBEGogACAAKAIAKAIEEQcAIAIoAhAgAigCFEEoaigCABDgFyIARQ0BIAAoAgAhAwtBACEFIANBAkkNCCACQQA2AlQgAkKAgICAEDcCTCACQYjLgAE2AlwgAkKggICADjcCYCACIAJBzABqNgJYAkAgACgCAA4DAwIAAwsCQAJAAkACQAJAAkACQCAALQAUDgQAAwIBAAsgAEECOgAUQQAtAOHsnQEhBUEAQQE6AOHsnQEgAiAFOgB4IAUNBSAAQQM6ABRBAEEAOgDh7J0BCyAAKAIQIgUgACgCDCIDSw0DIAAoAgghACACQQApA+ixmAEiHjcCbCACQYCAgIB4NgJoIAJBADoAdCACQQA6AIgBIAJBADYChAEgAkGQn5gBNgKAASACIAJB2ABqNgJ4IAIgAkHoAGo2AnwgAyAFRw0CIB5CIIinIQAgHqchBQwKCyACQQA2ArABIAJBATYCpAEgAkHQrpgBNgKgASACQgQ3AqgBIAJBoAFqQayemAEQhRsACyACQQA2ArABIAJBATYCpAEgAkGQrpgBNgKgASACQgQ3AqgBIAJBoAFqQayemAEQhRsACyAAIANBDGxqIQcgACAFQQxsaiEIIAJBoAFqQQhqIQkgAkGgAWpBB2ohCgNAAkACQCAIKAIIIgUNACACQQA2ApgBIAIgAkH4AGo2ApQBIAJBAzYCoAEgAkECNgLgASACQZQBaiACQaABaiACQeABakEAIAJBACACENgDIQAgAigClAEiBSAFKAIMQQFqNgIMIABFDQEMDwsgCCgCBCIAIAVBLGxqIQsDQCACQQA2ApABIAIgAkH4AGo2AowBAkACQAJAAkACQAJAIAAoAiBBgICAgHhGDQAgAkGgAWogACgCJCIMIAAoAigiDRDFBEECIQ4gAigCoAENBCACQaABaiACKAKkASIPIAIoAqgBIhBB7LWXAUEGEOQCAkACQCACKAKgAUUNACACKALcASEFIAIoAtgBIQMgAigC1AEhBCACKALQASEGIAIoAsQBQX9GDQEgAkGUAWogCSAGIAQgAyAFQQAQpQYMBQsCQANAIAJB4AFqIAJBoAFqEJoDIAIoAuABDgMEAAEECwtBACEFDAMLIAJBlAFqIAkgBiAEIAMgBUEBEKUGDAMLIAJBAzYCoAEMBAsgAiACKQLkATcCmAFBASEFCyACIAU2ApQBCwJAIAIoApQBQQFHDQACQCACKAKYASIRQQZqIgVFDQACQAJAIAUgEEkNACAFIBBHDQEMAgsgDyAFaiwAAEG/f0oNAQsgDyAQIAUgEEGgtpcBEJUfAAsgDyAQaiEEIA8gBWohBQJAA0AgBSAERg0BAkACQCAFLAAAIgNBf0wNACAFQQFqIQUgA0H/AXEhAwwBCyAFLQABQT9xIQYgA0EfcSESAkAgA0FfSw0AIBJBBnQgBnIhAyAFQQJqIQUMAQsgBkEGdCAFLQACQT9xciEGAkAgA0FwTw0AIAYgEkEMdHIhAyAFQQNqIQUMAQsgBkEGdCAFLQADQT9xciASQRJ0QYCA8ABxciIDQYCAxABGDQIgBUEEaiEFCyADQbl/akF4Sw0AIANBRmpBdk8NAAwCCwsgEUUNAQJAAkAgESAQSQ0AIBEgEEYNAgwBCyAPIBFqLAAAQb9/TA0AIBEhEAwBCyAPIBBBACARQbC2lwEQlR8ACwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgEEEDSQ0AQZStlwEgD0EDEJIVRQ0BIA8vAABB2pwBRg0CIBBBA0YNByAPKAAAQd++6fIERw0HQXwhBUEEIQMgEEEFTw0DQQQhEAwFCyAQQQJHDQ0gDy8AAEHanAFHDQVBfiEFQQIhEEECIQMMBAtBAyEDQX0hBQJAIBBBA0cNAEEDIRAMBAsgDywAA0G/f0oNAyAPIBBBAyAQQeitlwEQlR8ACyAPLAACQb9/TA0BQQIhA0F+IQUMAgsgDywABEG/f0oNASAPIBBBBCAQQcitlwEQlR8ACyAPIBBBAiAQQditlwEQlR8ACyAPIANqIhEgBSAQaiIGaiETIAYhBSARIQMCQAJAA0AgBUUNASAFQX9qIQUgAywAACEEIANBAWohAyAEQQBODQAMAgsLIAZFDQACQAJAIBEsAAAiBUF/TA0AIBFBAWohEiAFQf8BcSEFDAELIBEtAAFBP3EhAyAFQR9xIQQCQCAFQV9LDQAgBEEGdCADciEFIBFBAmohEgwBCyADQQZ0IBEtAAJBP3FyIQMCQCAFQXBPDQAgAyAEQQx0ciEFIBFBA2ohEgwBCyADQQZ0IBEtAANBP3FyIARBEnRBgIDwAHFyIQUgEUEEaiESCwJAAkAgBUHFAEcNAEEAIQQMAQsgBUGAgMQARg0BQQAhBANAIAVBUGpBCUsNAkEAIQMDQAJAIAVBUGoiFEEKSQ0AA0ACQAJAIANFDQAgEiATRg0HAkAgEiwAACIFQX9MDQAgEkEBaiESIAVB/wFxIQUMAgsgEi0AAUE/cSEVIAVBH3EhFAJAIAVBX0sNACAUQQZ0IBVyIQUgEkECaiESDAILIBVBBnQgEi0AAkE/cXIhFQJAIAVBcE8NACAVIBRBDHRyIQUgEkEDaiESDAILIBVBBnQgEi0AA0E/cXIgFEESdEGAgPAAcXIiBUGAgMQARg0HIBJBBGohEgwBCyAEQQFqIQQgBUHFAEcNBAwFCyADQX9qIQMMAAsLIAOtQgp+Ih5CIIinDQMgHqciBSAUaiIDIAVJDQMgEiATRg0DAkACQCASLAAAIgVBf0wNACASQQFqIRIgBUH/AXEhBQwBCyASLQABQT9xIRQgBUEfcSEVAkAgBUFfSw0AIBVBBnQgFHIhBSASQQJqIRIMAQsgFEEGdCASLQACQT9xciEUAkAgBUFwTw0AIBQgFUEMdHIhBSASQQNqIRIMAQsgFEEGdCASLQADQT9xciAVQRJ0QYCA8ABxciEFIBJBBGohEgsgBUGAgMQARg0DDAALCwsgEyASayEWDAgLIBBBAksNAQtBAiEQIA8tAABB0gBGDQEMBwsCQCAPLwAAQd+kAUcNACAPLAACIgVBv39MDQQgD0ECaiEGQX4hAwwFCyAPLQAAQdIARw0BCyAPLAABIgVBv39MDQEgD0EBaiEGQX8hAwwDCyAQQQNGDQRBkLCXASAPQQMQkhUNBAJAIA8sAAMiBUG/f0wNACAPQQNqIQZBfSEDDAMLIA8gEEEDIBBBwLCXARCVHwALIA8gEEEBIBBB0LCXARCVHwALIA8gEEECIBBB4LCXARCVHwALIAVBv39qQf8BcUEZSw0BIAMgEGohBEEAIQUCQANAIAQgBUYNASAGIAVqIQMgBUEBaiEFIAMsAABBAE4NAAwDCwsgCUIANwIAIAlBCGpCADcCACACIAQ2AqQBIAIgBjYCoAECQAJAAkAgAkGgAWpBABD2AQ0AIAIoAqABIgNFDQQgAigCqAEiBSACLwClASAKLQAAQRB0ckEIdCACLQCkAXIiEk8NAiADIAVqLQAAQb9/akH/AXFBGk8NAiACKAKsASERIAJCADcCsAEgAiARNgKsASACIAU2AqgBIAIgEjYCpAEgAiADNgKgASACQaABakEAEPYBDQEgAigCoAEiA0UNBCACKAKoASEFIAIvAKUBIAotAABBEHRyQQh0IAItAKQBciESDAILQYCxlwFBPSACQe8BakHwsJcBQcCxlwEQ6A8AC0GAsZcBQT0gAkHvAWpB8LCXAUHAsZcBEOgPAAsCQCAFRQ0AAkAgEiAFSw0AIBIgBUYNAQwNCyADIAVqLAAAQb9/TA0MCyASIAVrIRYgAyAFaiESQQAhEQsCQAJAIBYNAEEAIRcgESEYIAYhGSAEIRogDyEbIBAhHCASIR0MAQsgEi0AAEEuRw0BIBIgFmohE0EuIQMgEiEFAkADQAJAAkACQCADwEF/Sg0AIAUtAAFBP3EhFSADQR9xIRQgA0H/AXEiA0HfAUsNASAUQQZ0IBVyIQMgBUECaiEFDAILIAVBAWohBSADQf8BcSEDDAELIBVBBnQgBS0AAkE/cXIhFQJAIANB8AFPDQAgFSAUQQx0ciEDIAVBA2ohBQwBCyAVQQZ0IAUtAANBP3FyIBRBEnRBgIDwAHFyIgNBgIDEAEYNAiAFQQRqIQULAkAgA0Hf//8AcUG/f2pBGkkNACADQVBqQQpJDQAgA0FfakEPSQ0AIANBRmpBB0kNACADQaV/akEGSQ0AIANBhX9qQQNLDQQLIAUgE0YNASAFLQAAIQMMAAsLIBEhGCAGIRkgBCEaIA8hGyAQIRwgEiEdIBYhFwtBASEOCyACIBc2ArwBIAIgHTYCuAEgAiAcNgK0ASACIBs2ArABIAIgGjYCrAEgAiAZNgKoASACIBg2AqQBIAIgDTYCxAEgAiAMNgLAASACIA42AqABCwJAIAAoAhAiBUECRg0AIAIgACkCGDcC5AELIAIgBTYC4AEgAkGMAWogAkGgAWogAkHgAWogACgCACAAKAIEIAAoAgggACgCDBDYAyEFIAIoAowBIgMgAygCDEEBajYCDCAFDQ8gAEEsaiIAIAtHDQALCyAIQQxqIgggB0YNBwwACwsgBSADQYCfmAEQoyAACyACQgA3AqwBIAJCgYCAgMAANwKkASACQZCymAE2AqABIAJB+ABqQYHamAEgAkGgAWpBtKeYARCSGQALQaDOgAFBGEG4zoABEPISAAsgAkHMAGpB7Z6YAUESEK0gDQkMBQsgAkHMAGpB2J6YAUEVEK0gRQ0EDAgLIAMgEiAFIBJB0LGXARCVHwALIAIoAmgiAEUNAiAAQYCAgIB4Rw0BIAIoAnAhACACLQBsIQULIAVB/wFxQQNHDQEgACgCACEDAkAgAEEEaigCACIFKAIAIgRFDQAgAyAEEQMACwJAIAUoAgQiBEUNACADIAQgBSgCCBCeEgsgAEEMQQQQnhIMAQsgAigCbCAAQQEQnhILIAJBwABqQQhqIAJBzABqQQhqKAIANgIAIAIgAikCTDcDQCACQQA2ArABQQEhBSACQQE2AqQBIAJB6M6AATYCoAEgAkIENwKoAQJAAkAgASgCACABKAIEIAJBoAFqELceDQACQAJAIAIoAkQiAyACKAJIIgBB8M6AAUEQEKAcDQAgAkEANgKwASACQQE2AqQBIAJBlM+AATYCoAEgAkIENwKoASABKAIAIAEoAgQgAkGgAWoQtx4NAgwBCwJAAkACQCAAQQFLDQAgAEEBRg0CDAELIAMsAAFBv39KDQELQbzLgAFBKkHoy4ABEN0XAAsgAkEANgJIIAJBATYCrAEgAkG0/IMBNgK4ASACQbP8gwE2ArQBIAJCgYCAgBA3AqABIAIgAEF/aiIDNgKwASACIAJBwABqNgKoASACQbQBaiEAAkACQCADDQAgAkHAAGogABDqEQwBCyACQcAAakEBIAAQlBBFDQACQAJAIAIoArgBIgMgAigCtAEiBEcNACADIQQMAQsgAkGgAWogAyAEaxD5EiACKAKoASACKAKsASAAEJQQRQ0BIAIoArQBIQMgAigCuAEhBAtBACESAkACQCAEIANrIgZBAEgNAAJAIAQgA0cNAEEBIQNBACEGDAILIAJBCGogBhDnHCACKAIIIgMNAUEBIRILIBIgBkGwmJsBEKoeAAsgAkEANgKAASACIAM2AnwgAiAGNgJ4IAJB+ABqIAAQ6hEgAigCfCEQIAIoAnghDwJAIAIoAoABIgBFDQAgAkGgAWogABD5EiACKAKsASACKAKoASISKAIIIgRrIQMgEigCBCAEaiEEIBAhBgNAIANFDQEgAEUNASAEIAYtAAA6AAAgEiASKAIIQQFqNgIIIANBf2ohAyAAQX9qIQAgBkEBaiEGIARBAWohBAwACwsgDyAQEKsgCyACKAKwASIARQ0AAkAgAigCrAEiBiACKAKoASIDKAIIIgRGDQAgAEUNACADKAIEIhIgBGogEiAGaiAA/AoAAAsgAyAAIARqNgIICyACKAJEIhIgAigCSCILaiEDAkACQANAAkAgEiADIgRHDQBBACEADAILAkAgBEF/aiIDLAAAIgBBf0oNAAJAAkAgBEF+aiIDLQAAIgbAIhBBQEgNACAGQR9xIQYMAQsCQAJAIARBfWoiAy0AACIGwCIPQUBIDQAgBkEPcSEGDAELIARBfGoiAy0AAEEHcUEGdCAPQT9xciEGCyAGQQZ0IBBBP3FyIQYLIAZBBnQgAEE/cXIhAAsCQCAAQXdqIgZBF0sNAEEBIAZ0QZ+AgARxDQELAkAgAEGAAUkNAAJAIABBCHYiBkUNAAJAAkAgBkEwRg0AIAZBIEYNASAGQRZHDQMgAEGALUYNBAwDCyAAQYDgAEYNAwwCCyAAQf8BcUHO7JsBai0AAEECcQ0CDAELIABB/wFxQc7smwFqLQAAQQFxDQELCyAEIBJrIgAgC0sNASAARQ0AIAAgC08NACASIABqLAAAQb9/TA0FCyACIAA2AkgLIAJBATYCpAEgAkGY75sBNgKgASACQgE3AqwBIAJBFDYCfCACIAJB+ABqNgKoASACIAJBwABqNgJ4IAEoAgAgASgCBCACQaABahC3HkUNAQsgAigCQCACKAJEEKsgDAELIAIoAkAgAigCRBCrIEEAIQULIAJB8AFqJAAgBQ8LQeTRmAFBMEGU0pgBEN0XAAsCQAJAIAIoAmgiAEGAgICAeEYNACAARQ0CQQEhAyACKAJsIQUMAQsgAi0AbEEDRw0BQQQhAyACKAJwIgUoAgAhBgJAIAVBBGooAgAiBCgCACIARQ0AIAYgABEDAAtBDCEAIAQoAgQiEkUNACAGIBIgBCgCCBCeEgsgBSAAIAMQnhILQfjPmwFBNyACQe8BakGgy4ABQbDQmwEQ6A8AC+owAgh/AX4jAEHgBmsiAiQAIAFBgAFqIQMgAUEsaiEEA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgAOEwAREQECAwQFBgcQDw4NDAsKCQgAC0EAIQUgAkEYakEAKQOY+5wBIgo3AgAgAkEoaiAKNwIAIAJBADYBUiACQQA2AgwgAkKAgICAgAE3AgQgAkKAgICAgAE3AkAgAkKAgICAwAA3AjAgAkEANgJIIAJBAToAPCACQQA2AjggAiABLwF4OwFQIAIgASgCdDYCTCACQQApA5D7nAEiCjcCECACIAo3AiAgAiABLQB+OgBWAkADQCAFQdQARg0BIAEgBWpBLGoiBigCACEHIAYgAkEEaiAFaiIDKAIANgIAIAMgBzYCACAFQQRqIQUMAAsLAkAgACgCDCIFRQ0AIAAoAgghACAFQTBsIQUDQCABQQA6AH0gACABEGsgAEEwaiEAIAVBUGoiBQ0ACwsgBCACQQRqEJMDDBALIAEtACghBiABQQA6ACggAS0AeSEHIAFBADoAeQJAIAAoAgQiBSgCAEEaRw0AIAJB+AVqIAUpAwggBUEYaigCABC6GCAEIAIpA/gFIAIoAoAGENEKCyAFIAEQdyABIAY6ACggASAHOgB5DBALIAAoAgwiAEUNDiABLQAoIQUgAUEAOgAoIAEtAHkhBiABQQA6AHkCQCAAKAIAQRpHDQAgAkH4BWogACkDCCAAQRhqKAIAELoYIAQgAikD+AUgAigCgAYQ0QoLIAAgARB3IAEgBToAKCABIAY6AHkMDgsCQCABLQCQAQ0AIABBIGooAgAiBUUNACACQfgFaiAAKQMQIAUQuhggAyACKQP4BSACKAKABhDnBRoLIAAoAighACABQQA6AH0MEAsgAC0AJEECRg0MIAEtAJABDQwgAEEgaigCACIBRQ0MIAJB+AVqIAApAxAgARC6GCADIAIpA/gFIAIoAoAGEOcFGgwMCyAALQAkQQJGDQsgAS0AkAENCyAAQSBqKAIAIgFFDQsgAkH4BWogACkDECABELoYIAMgAikD+AUgAigCgAYQ5wUaDAsLIAEtACghBiABQQA6ACggAS0AeSEHIAFBADoAeQJAIAAoAgQiBSgCAEEaRw0AIAJB+AVqIAUpAwggBUEYaigCABC6GCAEIAIpA/gFIAIoAoAGENEKCyAFIAEQdyABIAY6ACggASAHOgB5IAFBADoAfSAAKAIIIAEQayAAKAIUIgANDAwKCyABLQAoIQYgAUEAOgAoIAEtAHkhByABQQA6AHkCQCAAKAIQIgUoAgBBGkcNACACQfgFaiAFKQMIIAVBGGooAgAQuhggBCACKQP4BSACKAKABhDRCgsgBSABEHcgASAGOgAoIAEgBzoAeSAAKAIMIgVFDQkgACgCCCIGIAVBGGxqIQMDQAJAIAYoAhQiAEUNACABLQAoIQUgAUEAOgAoIAEtAHkhByABQQA6AHkCQCAAKAIAQRpHDQAgAkH4BWogACkDCCAAQRhqKAIAELoYIAQgAikD+AUgAigCgAYQ0QoLIAAgARB3IAEgBToAKCABIAc6AHkLAkAgBkEIaigCACIFRQ0AIAZBBGooAgAhACAFQTBsIQUDQCABQQA6AH0gACABEGsgAEEwaiEAIAVBUGoiBQ0ACwsgBkEYaiIGIANGDQoMAAsLIAEtACghBSABQQA6ACggAS0AeSEGIAFBADoAeQJAIAAoAgQiACgCAEEaRw0AIAJB+AVqIAApAwggAEEYaigCABC6GCAEIAIpA/gFIAIoAoAGENEKCyAAIAEQdyABIAU6ACggASAGOgB5DAgLIABBCGogARDYAgwHC0EAIQUgAkHkBGpBACkDmPucASIKNwIAIAJB9ARqIAo3AgAgAkEANgGeBSACQQA2AtgEIAJCgICAgIABNwLQBCACQoCAgICAATcCjAUgAkKAgICAwAA3AvwEIAJBADYClAUgAkEBOgCIBSACQQA2AoQFIAIgAS8BeDsBnAUgAiABKAJ0NgKYBSACQQApA5D7nAEiCjcC3AQgAiAKNwLsBCACIAEtAH46AKIFAkADQCAFQdQARg0BIAEgBWpBLGoiBigCACEHIAYgAkHQBGogBWoiAygCADYCACADIAc2AgAgBUEEaiEFDAALCwJAAkACQAJAIAAoAgQOAwABAgALIAEtAHohCCABIAAoAggiBS0AGUU6AHoCQCAFQQhqKAIAIgZFDQAgBUEEaigCACIFIAZBOGxqIQcgAS0AeSEDIAEtACghCQNAIAFBAToAeSABQQE6ACggBSABEOcEAkAgBUEwaigCACIGRQ0AIAFBADoAeSABQQA6ACgCQCAGKAIAQRpHDQAgAkH4BWogBikDCCAGQRhqKAIAELoYIAQgAikD+AUgAigCgAYQ0QoLIAYgARB3CyABIAk6ACggASADOgB5IAVBOGoiBSAHRw0ACwsgASAIOgB6DAILIAAoAggiBUEIaigCACIGRQ0BIAVBBGooAgAiBSAGQThsaiEHIAEtAHkhAyABLQAoIQkDQCABQQE6AHkgAUEBOgAoIAUgARDnBAJAIAVBMGooAgAiBkUNACABQQA6AHkgAUEAOgAoAkAgBigCAEEaRw0AIAJB+AVqIAYpAwggBkEYaigCABC6GCAEIAIpA/gFIAIoAoAGENEKCyAGIAEQdwsgASAJOgAoIAEgAzoAeSAFQThqIgUgB0cNAAwCCwsgACgCCCABEOcECyABLQAoIQNBACEFIAFBADoAKCABLQB5IQYgAUEAOgB5AkAgACgCDCIHKAIAQRpHDQAgAkH4BWogBykDCCAHQRhqKAIAELoYIAQgAikD+AUgAigCgAYQ0QoLIAcgARB3IAEgAzoAKCABIAY6AHkgAkG4BWpBACkDmPucASIKNwIAIAJByAVqIAo3AgAgAkEANgHyBSACIAY6APEFIAJBADYCrAUgAkKAgICAgAE3AqQFIAJCgICAgIABNwLgBSACQoCAgIDAADcC0AUgAkEANgLoBSACQQE6ANwFIAJBADYC2AUgAiABLQB4OgDwBSACIAEoAnQ2AuwFIAJBACkDkPucASIKNwKwBSACIAo3AsAFIAIgAS0AfjoA9gUCQANAIAVB1ABGDQEgASAFakEsaiIGKAIAIQcgBiACQaQFaiAFaiIDKAIANgIAIAMgBzYCACAFQQRqIQUMAAsLAkACQCAAKAIQIgAoAgANACAAQQxqKAIAIgVFDQEgAEEIaigCACEAIAVBMGwhBQNAIAFBADoAfSAAIAEQayAAQTBqIQAgBUFQaiIFDQAMAgsLIAFBADoAfSAAIAEQawsgBCACQaQFahCTAyAEIAJB0ARqEJMDDAYLQQAhBSACQbwDakEAKQOY+5wBIgo3AgAgAkHMA2ogCjcCACACQQA2AfYDIAJBADYCsAMgAkKAgICAgAE3AqgDIAJCgICAgIABNwLkAyACQoCAgIDAADcC1AMgAkEANgLsAyACQQE6AOADIAJBADYC3AMgAiABLwF4OwH0AyACIAEoAnQ2AvADIAJBACkDkPucASIKNwK0AyACIAo3AsQDIAIgAS0AfjoA+gMCQANAIAVB1ABGDQEgASAFakEsaiIGKAIAIQcgBiACQagDaiAFaiIDKAIANgIAIAMgBzYCACAFQQRqIQUMAAsLAkACQAJAAkAgACgCBA4DAAECAAsgAS0AeiEIIAEgACgCCCIFLQAZRToAegJAIAVBCGooAgAiBkUNACAFQQRqKAIAIgUgBkE4bGohByABLQB5IQMgAS0AKCEJA0AgAUEBOgB5IAFBAToAKCAFIAEQ5wQCQCAFQTBqKAIAIgZFDQAgAUEAOgB5IAFBADoAKAJAIAYoAgBBGkcNACACQfgFaiAGKQMIIAZBGGooAgAQuhggBCACKQP4BSACKAKABhDRCgsgBiABEHcLIAEgCToAKCABIAM6AHkgBUE4aiIFIAdHDQALCyABIAg6AHoMAgsgACgCCCIFQQhqKAIAIgZFDQEgBUEEaigCACIFIAZBOGxqIQcgAS0AeSEDIAEtACghCQNAIAFBAToAeSABQQE6ACggBSABEOcEAkAgBUEwaigCACIGRQ0AIAFBADoAeSABQQA6ACgCQCAGKAIAQRpHDQAgAkH4BWogBikDCCAGQRhqKAIAELoYIAQgAikD+AUgAigCgAYQ0QoLIAYgARB3CyABIAk6ACggASADOgB5IAVBOGoiBSAHRw0ADAILCyAAKAIIIAEQ5wQLIAEtACghA0EAIQUgAUEAOgAoIAEtAHkhBiABQQA6AHkCQCAAKAIMIgcoAgBBGkcNACACQfgFaiAHKQMIIAdBGGooAgAQuhggBCACKQP4BSACKAKABhDRCgsgByABEHcgASADOgAoIAEgBjoAeSACQZAEakEAKQOY+5wBIgo3AgAgAkGgBGogCjcCACACQQA2AcoEIAIgBjoAyQQgAkEANgKEBCACQoCAgICAATcC/AMgAkKAgICAgAE3ArgEIAJCgICAgMAANwKoBCACQQA2AsAEIAJBAToAtAQgAkEANgKwBCACIAEtAHg6AMgEIAIgASgCdDYCxAQgAkEAKQOQ+5wBIgo3AogEIAIgCjcCmAQgAiABLQB+OgDOBAJAA0AgBUHUAEYNASABIAVqQSxqIgYoAgAhByAGIAJB/ANqIAVqIgMoAgA2AgAgAyAHNgIAIAVBBGohBQwACwsCQAJAIAAoAhAiACgCAA0AIABBDGooAgAiBUUNASAAQQhqKAIAIQAgBUEwbCEFA0AgAUEAOgB9IAAgARBrIABBMGohACAFQVBqIgUNAAwCCwsgAUEAOgB9IAAgARBrCyAEIAJB/ANqEJMDIAQgAkGoA2oQkwMMBQtBACEFIAJBlAJqQQApA5j7nAEiCjcCACACQaQCaiAKNwIAIAJBADYBzgIgAkEANgKIAiACQoCAgICAATcCgAIgAkKAgICAgAE3ArwCIAJCgICAgMAANwKsAiACQQA2AsQCIAJBAToAuAIgAkEANgK0AiACIAEvAXg7AcwCIAIgASgCdDYCyAIgAkEAKQOQ+5wBIgo3AowCIAIgCjcCnAIgAiABLQB+OgDSAgJAA0AgBUHUAEYNASABIAVqQSxqIgYoAgAhByAGIAJBgAJqIAVqIgMoAgA2AgAgAyAHNgIAIAVBBGohBQwACwsCQCAAKAIEIgVBAkYNAAJAIAVBAXFFDQAgAS0AKCEGIAFBADoAKCABLQB5IQcgAUEAOgB5AkAgACgCCCIFKAIAQRpHDQAgAkH4BWogBSkDCCAFQRhqKAIAELoYIAQgAikD+AUgAigCgAYQ0QoLIAUgARB3IAEgBjoAKCABIAc6AHkMAQsgAS0AeiEIIAEgACgCCCIFLQAZRToAegJAIAVBCGooAgAiBkUNACAFQQRqKAIAIgUgBkE4bGohByABLQB5IQMgAS0AKCEJA0AgAUEBOgB5IAFBAToAKCAFIAEQ5wQCQCAFQTBqKAIAIgZFDQAgAUEAOgB5IAFBADoAKAJAIAYoAgBBGkcNACACQfgFaiAGKQMIIAZBGGooAgAQuhggBCACKQP4BSACKAKABhDRCgsgBiABEHcLIAEgCToAKCABIAM6AHkgBUE4aiIFIAdHDQALCyABIAg6AHoLIAEtAHkhBgJAIAAoAhgiBUUNACABQQA6AHkgAS0AKCEHIAFBADoAKAJAIAUoAgBBGkcNACACQfgFaiAFKQMIIAVBGGooAgAQuhggBCACKQP4BSACKAKABhDRCgsgBSABEHcgASAHOgAoIAEgBjoAeQsCQCAAKAIcIgVFDQAgAUEAOgB5IAEtACghByABQQA6ACgCQCAFKAIAQRpHDQAgAkH4BWogBSkDCCAFQRhqKAIAELoYIAQgAikD+AUgAigCgAYQ0QoLIAUgARB3IAEgBzoAKCABIAY6AHkLQQAhBSACQegCakEAKQOY+5wBIgo3AgAgAkH4AmogCjcCACACIAY6AKEDIAJBADYC3AIgAkKAgICAgAE3AtQCIAJBADYCiAMgAkEBOgCMAyACQQA2ApgDIAJBADYBogMgAkKAgICAwAA3AoADIAJCgICAgIABNwKQAyACIAEtAHg6AKADIAIgASgCdDYCnAMgAkEAKQOQ+5wBIgo3AuACIAIgCjcC8AIgAiABLQB+OgCmAwJAA0AgBUHUAEYNASABIAVqQSxqIgYoAgAhByAGIAJB1AJqIAVqIgMoAgA2AgAgAyAHNgIAIAVBBGohBQwACwsCQAJAIAAoAgwiACgCAA0AIABBDGooAgAiBUUNASAAQQhqKAIAIQAgBUEwbCEFA0AgAUEAOgB9IAAgARBrIABBMGohACAFQVBqIgUNAAwCCwsgAUEAOgB9IAAgARBrCyAEIAJB1AJqEJMDIAQgAkGAAmoQkwMMBAsgAS0AKCEGIAFBADoAKCABLQB5IQcgAUEAOgB5AkAgACgCBCIFKAIAQRpHDQAgAkH4BWogBSkDCCAFQRhqKAIAELoYIAQgAikD+AUgAigCgAYQ0QoLIAUgARB3IAEgBjoAKCABIAc6AHkMBAsgAS0AKCEGIAFBADoAKCABLQB5IQcgAUEAOgB5AkAgACgCBCIFKAIAQRpHDQAgAkH4BWogBSkDCCAFQRhqKAIAELoYIAQgAikD+AUgAigCgAYQ0QoLIAUgARB3IAEgBjoAKCABIAc6AHkMAwsgACgCBCEDQQAhACACQewAakEAKQOY+5wBIgo3AgAgAkH8AGogCjcCACACQQA2AaYBIAIgAS8BeDsBpAEgAiABKAJ0NgKgASACQQA2AmAgAkKAgICAgAE3AlggAkEAKQOQ+5wBIgo3AmQgAiAKNwJ0IAJBADYCjAEgAkEBOgCQASACQQA2ApwBIAIgAS0AfjoAqgEgAkKAgICAwAA3AoQBIAJCgICAgIABNwKUAQJAA0AgAEHUAEYNASABIABqQSxqIgUoAgAhBiAFIAJB2ABqIABqIgcoAgA2AgAgByAGNgIAIABBBGohAAwACwsCQCADKAJQIgVFDQAgAygCTCEAIAVBMGwhBQNAIAFBADoAfSAAIAEQayAAQTBqIQAgBUFQaiIFDQALCyAEIAJB2ABqEJMDAkAgAygCAEEIRg0AQQAhACACQaAGakEAKQOY+5wBIgo3AgAgAkGwBmogCjcCACACQQA2AdoGIAJBADYClAYgAkKAgICAgAE3AowGIAJCgICAgIABNwLIBiACQoCAgIDAADcCuAYgAkEANgLQBiACQQE6AMQGIAJBADYCwAYgAiABLwF4OwHYBiACIAEoAnQ2AtQGIAJBACkDkPucASIKNwKYBiACIAo3AqgGIAIgAS0AfjoA3gYgAS0AKCEJAkADQCAAQdQARg0BIAEgAGpBLGoiBSgCACEGIAUgAkGMBmogAGoiBygCADYCACAHIAY2AgAgAEEEaiEADAALCyABQQA6ACggAS0AeyEGIAFBADoAeyABLQB5IQcgAUEAOgB5AkAgAygCMCIFRQ0AIAMoAiwhACAFQTBsIQUDQCABQQA6AH0gACABEGsgAEEwaiEAIAVBUGoiBQ0ACwsgAUEBOgB7IAFBAToAeSABQQE6ACgCQCADKAIAQQdGDQAgAyABEOcECyABIAY6AHsgASAJOgAoIAEgBzoAeSAEIAJBjAZqEJMDCyADKAJgQYCAgIB4Rg0BQQAhACACQcABakEAKQOY+5wBIgo3AgAgAkHQAWogCjcCACACQQA2AfoBIAJBADYCtAEgAkKAgICAgAE3AqwBIAJCgICAgIABNwLoASACQoCAgIDAADcC2AEgAkEANgLwASACQQE6AOQBIAJBADYC4AEgAiABLwF4OwH4ASACIAEoAnQ2AvQBIAJBACkDkPucASIKNwK4ASACIAo3AsgBIAIgAS0AfjoA/gECQANAIABB1ABGDQEgASAAakEsaiIFKAIAIQYgBSACQawBaiAAaiIHKAIANgIAIAcgBjYCACAAQQRqIQAMAAsLAkAgAygCaCIFRQ0AIAMoAmQhACAFQTBsIQUDQCABQQA6AH0gACABEGsgAEEwaiEAIAVBUGoiBQ0ACwsgBCACQawBahCTAwwBCyABLQAoIQUgAUEAOgAoIAEtAHkhBiABQQA6AHkCQCAAKAIEIgAoAgBBGkcNACACQfgFaiAAKQMIIABBGGooAgAQuhggBCACKQP4BSACKAKABhDRCgsgACABEHcgASAFOgAoIAEgBjoAeQsgAkHgBmokAA8LIAAoAgghAAsgAUEAOgB9DAALC7grAgl/An4jAEGwAmsiAiQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCACIDQXRqIgRBByAEQSZJGw4mIQABAgMEBQYHCAkKCwwNIQ4PEBESIRMUFSEhFhcYGRobHB0hHiEhCyAAKAIMIgRFDSAgACgCCCEAIARBBHQhBCACQdABakEMaiEFIAJB2AFqIQYDQAJAIAAoAgBBAkYNACAAQQxqKAIAIQMgAS0AOSEHIAFBAToAOSACQQM2AtgBIAMgARBsIAEgBzoAOSACKALYASIDQQFLDQAgBiACQdABahCgGCAGIAIpA9ABEO8XIANFDQAgAigC3AEiAyADKAIAIgNBf2o2AgAgA0EBRw0AIAUQ3w8LIABBEGohACAEQXBqIgQNAAwhCwsgASgCMBCBEiEEIAJB0AFqQTRqIAFBNGooAgA2AgAgAkEAOgD4ASACQdABakEIakEAKQOY+5wBIgs3AwAgAkHgAWpBACkDkPucASIMNwMAIAJB6AFqIAs3AwAgAiABNgLwASACIAQ2AvQBIAJBAToAiQIgAiABKQIsNwL8ASACIAEoATo2AYoCIAIgAS0AODoAiAIgAiAMNwPQAQJAIAAoAgwiBEUNACAAKAIIIQEgBEEMbCEAIAJBIGpBDGohBiACQSBqQQhqIQcDQAJAAkAgASgCACIEDQAgAUEEaigCACACQdABahD2AwwBCyACQQM2AiggAi0AiQIhAyACQQE6AIkCIAQgAkHQAWoQbCACIAM6AIkCIAIoAigiBEEBSw0AIAcgAkEgahCgGCAHIAIpAyAQ7xcgBEUNACACKAIsIgQgBCgCACIEQX9qNgIAIARBAUcNACAGEN8PCyABQQxqIQEgAEF0aiIADQALCwJAIAIoAtQBIgFFDQAgAigC0AEgAigC3AEQkgwgASABQQR0QRdqQXBxIgBqQQlqIgFFDQAgAigC0AEgAGsgAUEIEJ4SCyACQeABahDWFQwfCwJAIAAoAiAiBCgCFCIDRQ0AIAQoAhAhBCADQQxsIQMgAkHQAWpBDGohCCACQdABakEIaiEFA0AgBCgCACEHIAEtADkhBiABQQE6ADkgAkEDNgLYASAHIAEQbCABIAY6ADkCQCACKALYASIHQQFLDQAgBSACQdABahCgGCAFIAIpA9ABEO8XIAdFDQAgAigC3AEiByAHKAIAIgdBf2o2AgAgB0EBRw0AIAgQ3w8LIARBDGohBCADQXRqIgMNAAsLIAFBLGohBAJAIAAtABxBAkYNACABKAIwEIESIQMgAkEgakE0aiIHIARBCGooAgA2AgAgAkEgakEIakEAKQOY+5wBIgs3AwAgAkEgakEQakEAKQOQ+5wBIgw3AwAgAkEgakEYaiALNwMAIAIgATYCQCACIAM2AkQgAkEBOgBZIAJBAToASCACIAQpAgA3AkwgAiAMNwMgIAIgASgBOjYBWiACIAEtADg6AFggAkEgaiAAQQhqQQMQ+Q0gAigCUBCBEiEBIAJB0AFqQTRqIAcoAgA2AgAgAkHQAWpBCGogCzcDACACQdABakEQaiIEIAw3AwAgAkHQAWpBGGogCzcDACACIAE2AvQBIAJBAToAiQIgAkEBOgD4ASACIAIpAkw3AvwBIAIgDDcD0AEgAiACKAFaNgGKAiACIAItAFg6AIgCIAIgAkEgajYC8AEgAkHQAWogACgCIBDAAgJAIAIoAtQBIgFFDQAgAigC0AEgAigC3AEQkgwgASABQQR0QRdqQXBxIgBqQQlqIgFFDQAgAigC0AEgAGsgAUEIEJ4SCyAEENYVAkAgAigCJCIBRQ0AIAIoAiAgAigCLBCSDCABIAFBBHRBF2pBcHEiAGpBCWoiAUUNACACKAIgIABrIAFBCBCeEgsgAkEwahDWFQwfCyABKAIwEIESIQMgAkGEAmogBEEIaigCADYCACACQdABakEIakEAKQOY+5wBIgs3AwAgAkHgAWoiB0EAKQOQ+5wBIgw3AwAgAkHoAWogCzcDACACIAE2AvABIAIgAzYC9AEgAkEBOgCJAiACQQE6APgBIAIgBCkCADcC/AEgAiAMNwPQASACIAEoATo2AYoCIAIgAS0AODoAiAIgAkHQAWogACgCIBDAAgJAIAIoAtQBIgFFDQAgAigC0AEgAigC3AEQkgwgASABQQR0QRdqQXBxIgBqQQlqIgFFDQAgAigC0AEgAGsgAUEIEJ4SCyAHENYVDB4LIAEtADkhBCABQQE6ADkgACgCBCABEGwgASAEOgA5DB0LIAEtADkhBCABQQE6ADkgACgCDCABEGwgASAEOgA5DBwLIAEtADkhBCABQQE6ADkgACgCBCABEGwgAUEBOgA5IAAoAgggARBsIAEgBDoAOQwbCwJAAkAgA0ELRw0AIAEgAEEEahDEBgwBCyAAIAEQrgQLIAEtADkhBCABQQE6ADkgACgCOCABEGwgASAEOgA5DBoLIAEtADkhBCABQQE6ADkgACgCKCABEGwgASAEOgA5IAAoAghBAkcNGSABQQE6ADkgACgCDCABEGwgASAEOgA5DBkLIAAoAghBAUcNGCABLQA5IQQgAUEBOgA5IAAoAgwgARBsIAEgBDoAOQwYCyABLQA5IQQgAUEBOgA5IAAoAgQgARBsIAFBAToAOSAAKAIIIAEQbCABQQE6ADkgACgCDCABEGwgASAEOgA5DBcLAkAgAC0AGEEFRw0AIAEtADkhBCABQQE6ADkgACgCECABEGwgASAEOgA5CwJAIAAoAgwiBEUNACAEQQR0IQMgACgCCEEMaiEEIAJB0AFqQQxqIQggAkHYAWohBQNAIAQoAgAhByABLQA5IQYgAUEBOgA5IAJBAzYC2AEgByABEGwgASAGOgA5AkAgAigC2AEiB0EBSw0AIAUgAkHQAWoQoBggBSACKQPQARDvFyAHRQ0AIAIoAtwBIgcgBygCACIHQX9qNgIAIAdBAUcNACAIEN8PCyAEQRBqIQQgA0FwaiIDDQALCyAAKAIoIgBFDRYgACABEO8PDBYLIAEtADkhBCABQQE6ADkgACgCECABEGwgASAEOgA5AkAgACgCBEGAgICAeEYNACABIABBBGoQwgwLIAAoAiAiAEUNFSAAIAEQ7w8MFQsgACgCDCIERQ0UIAAoAgghACAEQQJ0IQQgAkHcAWohBSACQdgBaiEGA0AgACgCACEDIAEtADkhByABQQE6ADkgAkEDNgLYASADIAEQbCABIAc6ADkCQCACKALYASIDQQFLDQAgBiACQdABahCgGCAGIAIpA9ABEO8XIANFDQAgAigC3AEiAyADKAIAIgNBf2o2AgAgA0EBRw0AIAUQ3w8LIABBBGohACAEQXxqIgRFDRUMAAsLIAEgAEEIahCXEAwTCyAAKAIMIgRFDRIgACgCCCEAIARBAnQhBCACQdwBaiEFIAJB2AFqIQYDQCAAKAIAIQMgAS0AOSEHIAFBAToAOSACQQM2AtgBIAMgARBsIAEgBzoAOQJAIAIoAtgBIgNBAUsNACAGIAJB0AFqEKAYIAYgAikD0AEQ7xcgA0UNACACKALcASIDIAMoAgAiA0F/ajYCACADQQFHDQAgBRDfDwsgAEEEaiEAIARBfGoiBEUNEwwACwsgAS0AOSEEIAFBAToAOSAAKAIEIAEQbCABIAQ6ADkCQCAAKAIYIgRFDQAgBCABEO8PCyAAKAIIIgBBCGooAgAiBEUNESAAQQRqKAIAIQAgBEECdCEEIAJB3AFqIQUgAkHQAWpBCGohBgNAIAAoAgAhAyABLQA5IQcgAUEBOgA5IAJBAzYC2AEgAyABEGwgASAHOgA5AkAgAigC2AEiA0EBSw0AIAYgAkHQAWoQoBggBiACKQPQARDvFyADRQ0AIAIoAtwBIgMgAygCACIDQX9qNgIAIANBAUcNACAFEN8PCyAAQQRqIQAgBEF8aiIERQ0SDAALCyAAKAIQIQYgASgCMBCBEiEEIAJBIGpBCGpBACkDmPucASILNwMAIAJBIGpBEGpBACkDkPucASIMNwMAIAJBIGpBGGogCzcDACACQdABakE0aiABQTRqKAIANgIAIAJB0AFqQQhqIAs3AwAgAkHQAWpBEGogDDcDACACQdABakEYaiALNwMAIAIgDDcDICACIAEpAiw3AvwBIAIgDDcD0AEgAS0AOCEDIAEtAD0hBSABLQA6IQcgAiABLwA7OwCLAiACIAc6AIoCIAJBAToA+AEgAiAENgL0ASACIAE2AvABIAIgBToAjQIgAiADOgCIAkEBIQUCQCAAKAIgIgFFDQBBASEFIAItAIQCQQFHDQAgAkGAAjsAiQICQCABKAIIIgNFDQAgA0EwbCEEIAEoAgQiBUEIaiEBA0AgAkHQAWogARCXECABQTBqIQEgBEFQaiIEDQALIAItAIQCQQFHDQAgA0EwbCEEIAVBIGohAQNAAkAgAi0AhAJBAUcNACACQdABaiABQWhqEJcQIAItAIkCIQMCQCABQQRqKAIAIgVFDQAgAi0AhAJBAUcNACACLQCKAiEIIAJBgQI7AIkCIAUgAkHQAWoQ9AEgAiAIOgCKAiACIAM6AIkCCwJAIAEoAgAiBUUNACACLQCEAkEBRw0AIAItAIoCIQggAkGBAjsAiQIgBSACQdABahD0ASACIAg6AIoCCyACIAM6AIkCCyABQTBqIQEgBEFQaiIEDQALCyACIAc6AIoCIAItAIkCIQULIAJBADoAiQIgACgCDCEEIAIgACgCCCIBNgJAIAJBADYCMCACQQA2AiAgAiABIARBKGxqIgM2AkRBACEHQQAhBANAAkACQCAERQ0AIAggCUcNASACQSBqEIAQQQAhByACQQA2AiALIAEgA0YNEAJAA0AgAUEoaiEEIAEoAgBBAkcNASAEIQEgBCADRg0SDAALCyACIAQ2AkAgAkEANgLMASACQoCAgICAATcCxAEgAkHEAWogARCoCyACKALEASIBQYCAgIB4Rg0RIAIpAsgBIQsgAiABNgIoIAIgC6ciBzYCJCACIAc2AiAgAiAHIAtCIIinQQR0aiIJNgIsIAQhASAHIQggByEEDAELIAIgCEEQaiIKNgIkIAJB0AFqIAgpAwBBARDoBSAKIQgMAAsLAkAgACgCICIEKAIwIgNFDQAgAS0AOSEHIAFBAToAOSADIAEQbCABIAc6ADkLIAEoAjAQgRIhAyACQdABakE0aiABQTRqKAIANgIAIAJBADoAiQIgAkHQAWpBCGpBACkDmPucASILNwMAIAJB4AFqQQApA5D7nAEiDDcDACACQegBaiALNwMAIAIgATYC8AEgAiADNgL0ASACQQE6APgBIAIgASkCLDcC/AEgAiABKAE6NgGKAiACIAEtADg6AIgCIAIgDDcD0AECQCAALQAcQQJGDQAgAkHQAWogAEEIahCXEAsgAkEBOgCJAiACQdABaiAEEHgCQCACKALUASIBRQ0AIAIoAtABIAIoAtwBEJIMIAEgAUEEdEEXakFwcSIAakEJaiIBRQ0AIAIoAtABIABrIAFBCBCeEgsgAkHgAWoQ1hUMDwsgACgCDCIARQ0OIAEtADkhBCABQQE6ADkgACABEGwgASAEOgA5DA4LIAEtADkhBCABQQE6ADkgACgCBCABEGwgASAEOgA5DA0LIAEtADkhBCABQQE6ADkgACgCBCABEGwgASAEOgA5DAwLIABBIGohBAJAIAAtADRBAkcNAANAIAQoAgAiAEEYaiEEIAAtACxBAkYNAAsLIAEgBBCXEAwLCyAAKAIEIAEQ1gEMCgsgACgCDCEEIAAoAgghACACIAE2AtABIARFDQkgBEEobCEBA0AgAkHQAWogABDqBCAAQShqIQAgAUFYaiIBDQAMCgsLAkACQCABLQA0DQAgAS0AOSEEDAELIAEtADkhBCABLQA6IQMgAUGBAjsAOSAAKAIIIAEQ9AEgASADOgA6CyABQQE6ADkgACgCBCABEGwgASAEOgA5DAgLIAEtADkhBCABQQE6ADkgACgCBCABEGwgASAEOgA5DAcLIAEtADkhBCABQQE6ADkgACgCBCABEGwgASAEOgA5DAYLAkACQCABLQA0DQAgAS0AOSEEDAELIAEtADkhBCABLQA6IQMgAUGBAjsAOSAAKAIIIAEQ9AEgASADOgA6CyABQQE6ADkgACgCBCABEGwgASAEOgA5DAULIAEtADkhByABQQE6ADkgACgCBCABEGwgASAHOgA5IAEtADRBAUcNBCAAKAIIIQAgAS0AOiEGIAFBgQI7ADkCQCAAKAIIIgRFDQAgACgCBCEAIARBAnQhBANAAkAgAS0ANEEBRw0AIAAoAgAhAyABQYECOwA5IAMgARD0ASABQYECOwA5CyAAQQRqIQAgBEF8aiIEDQALCyABIAY6ADogASAHOgA5DAQLAkACQCABLQA0DQAgAS0AOSEEDAELIAEtADkhBCABLQA6IQMgAUGBAjsAOSAAKAIIIAEQ9AEgASADOgA6CyABQQE6ADkgACgCBCABEGwgASAEOgA5DAMLAkAgACgCBCIAKAIAQQNHDQAgAEEEaiABEJIIDAMLIAAgARDwFwwCCyACIAM2AkALAkAgB0UNACACQSBqEIAQCwJAIAAoAgwiBEUNACAAKAIIIQEgBEEobCEEA0AgASACQdABahCEBCABQShqIQEgBEFYaiIEDQALCyACIAU6AIkCAkACQCAGKAIAQYCAgIB4Rw0AIAYoAgQhASACQQE6AIkCIAEgAkHQAWoQbCACIAU6AIkCDAELAkAgBigCFA0AIAIoAvQBIgFFDQAgBkEAIAEQ4wU2AhQLAkAgAi0AjQIiAw0AAkAgBigCCA0AIAJBADoAjQIMAQsgAiAGKAIEIgEoAgAgAUEEaigCABDnFDoAjQILIAJBADsARSACQShqQQApA5j7nAEiCzcDACACQThqIAs3AwAgAiACLQCIAjoARCACQQApA5D7nAEiCzcDICACIAs3AzAgAiACQdABajYCQCACQSBqIAYQ9AYgAkEgahDWFSACQTBqENYVAkAgBigCCCIERQ0AIAYoAgQhASAEQTBsIQQDQCABIAJB0AFqEL8BIAFBMGohASAEQVBqIgQNAAsLIAIgAzoAjQILAkAgACgCJCIBRQ0AIAItAIQCQQFHDQAgAi8AiQIhACACQYECOwCJAiABKAIAIAJB0AFqEPQBIAIgADsAiQILAkAgAigC1AEiAUUNACACKALQASACKALcARCSDCABIAFBBHRBF2pBcHEiAGpBCWoiAUUNACACKALQASAAayABQQgQnhILIAJB4AFqENYVCyACQbACaiQAC50pAhx/An4jAEHgAGsiAiQAQQAhAwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAEoAgAiBEF8akEAIARBe2pBCEkbDgkAAQIDBAUGBwgACyABKAJMIQUgASgCPCEGIAEoAjghByACIAEQ+wQgASgCRCEIIAJBIGogASgCSCIJQQhBwAAQzA0gAigCJCEKIAIoAiBBAUYNCCACKAIoIQsCQCAKRQ0AIAggCUEGdGohDCAKIQ1BACEOA0AgCCAMRg0BAkACQCAIKAIAQQdGDQAgCCgCNCEPIAgoAiwhECAIKAIoIREgAkEgaiAIKAI4IhJBBEEMEMwNIAIoAiQhEyACKAIgQQFGDQ0gAigCKCEUAkAgE0UNACASQQxsIRUgFCEWIBMhFwNAIBVFDQFBAC0AwPGdARogDygCCCEYIA8oAgQhA0HAABCFASIERQ0ZIAJBIGogDygCABBEIARBOGogAkEgakE4aikDADcDACAEQTBqIAJBIGpBMGopAwA3AwAgBEEoaiACQSBqQShqKQMANwMAIARBIGogAkEgakEgaikDADcDACAEQRhqIAJBIGpBGGopAwA3AwAgBEEQaiACQSBqQRBqKQMANwMAIARBCGogAkEgakEIaikDADcDACAEIAIpAyA3AwAgFkEIaiAYNgIAIBZBBGogAzYCACAWIAQ2AgAgFUF0aiEVIBZBDGohFiAPQQxqIQ8gF0F/aiIXDQALCyACQSBqIAgQpwIgAiASNgJYIAIgFDYCVCACIBM2AlAgAiAQNgJMIAIgETYCSAwBCyAIKAI0IQ8gCCgCLCEQIAgoAighESACQSBqIAgoAjgiEkEEQQwQzA0gAigCJCETIAIoAiBBAUYNDSACKAIoIRQCQCATRQ0AIBJBDGwhFSAUIRYgEyEXA0AgFUUNAUEALQDA8Z0BGiAPKAIIIRggDygCBCEDQcAAEIUBIgRFDRggAkEgaiAPKAIAEEQgBEE4aiACQSBqQThqKQMANwMAIARBMGogAkEgakEwaikDADcDACAEQShqIAJBIGpBKGopAwA3AwAgBEEgaiACQSBqQSBqKQMANwMAIARBGGogAkEgakEYaikDADcDACAEQRBqIAJBIGpBEGopAwA3AwAgBEEIaiACQSBqQQhqKQMANwMAIAQgAikDIDcDACAWQQhqIBg2AgAgFkEEaiADNgIAIBYgBDYCACAVQXRqIRUgFkEMaiEWIA9BDGohDyAXQX9qIhcNAAsLIAgtAD0hFSAILQA8IRcgCC0APiEYAkACQCAILQAcIgNBAkcNAEEALQDA8Z0BGiAIKAIUIRkgCCgCECEaQSgQhQEiD0UNGCAPIAgoAggQpwJBAC0AwPGdARpBwAAQhQEiFkUNGCAWIAgoAgwQRAwBCyAIKAIYIRsgCCgCFCEZIAgoAhAhGgJAIAgpAwgiHkIDg0IAUg0AIB6nIgQgBCgCACIEQQFqNgIAIARBf0wNGAsCQAJAIAgoAiAiDw0AQQAhBAwBC0EALQDA8Z0BGkEMEIUBIgRFDRhBAC0AwPGdARogDygCCCEcIA8oAgQhHUHgABCFASIWRQ0YIBYgDygCABBkIAQgHDYCCCAEIB02AgQgBCAWNgIACyAeQiCIpyEWIB6nIQ8LIAIgGDoAXiACIBU6AF0gAiAXOgBcIAIgEjYCWCACIBQ2AlQgAiATNgJQIAIgEDYCTCACIBE2AkggAiAENgJAIAIgAzoAPCACIBs2AjggAiAZNgI0IAIgGjYCMCACQQc2AiAgAiAWrUIghiAPrYQ3AygLIAhBwABqIQggCyAOQQZ0aiIEIAIpAyA3AwAgBEE4aiACQSBqQThqKQMANwMAIARBMGogAkEgakEwaikDADcDACAEQShqIAJBIGpBKGopAwA3AwAgBEEgaiACQSBqQSBqKQMANwMAIARBGGogAkEgakEYaikDADcDACAEQRBqIAJBIGpBEGopAwA3AwAgBEEIaiACQSBqQQhqKQMANwMAIA5BAWohDiANQX9qIg0NAAsLQYCAgIB4IQgCQAJAIAEoAiBBgICAgHhHDQAMAQsgASgCJCEPIAEoAjQhAyABKAIwIRggASgCLCEXIAJBIGogASgCKCIOQQhBMBDMDSACKAIkIQggAigCIEEBRg0MIAIoAighDQJAIAhFDQAgDkEwbCEWIA0hBCAIIRUDQCAWRQ0BIAJBIGogDxCAASAEQShqIAJBIGpBKGopAwA3AwAgBEEgaiACQSBqQSBqKQMANwMAIARBGGogAkEgakEYaikDADcDACAEQRBqIAJBIGpBEGopAwA3AwAgBEEIaiACQSBqQQhqKQMANwMAIAQgAikDIDcDACAEQTBqIQQgFkFQaiEWIA9BMGohDyAVQX9qIhUNAAsLIA6tQiCGIA2thCEeCyAAIAIpAwA3AwAgAEEIaiACQQhqKQMANwMAIABBEGogAkEQaikDADcDACAAQRhqIAJBGGopAwA3AwAgACABLwFQOwFQIAAgBTYCTCAAIAk2AkggACALNgJEIAAgCjYCQCAAIAY2AjwgACAHNgI4IAAgAzYCNCAAIBg2AjAgACAXNgIsIAAgHjcCJCAAIAg2AiAMEgsgASgCLCEPIAEoAighFiACQSBqIAFBCGoQ+wRBAC0AwPGdARpByAAQhQEiBEUNEiAEIAEoAjAQ/AEgACACKQMgNwMIIABBEGogAkEoaikDADcDACAAQRhqIAJBIGpBEGopAwA3AwAgAEEgaiACQSBqQRhqKQMANwMAIAEoAjQhFSAAIAEvATg7ATggACAVNgI0IAAgBDYCMCAAIA82AiwgACAWNgIoIABBBTYCAAwRCyABKAIUIQ8gASgCECEWIAEoAhwhFSABKAIYIQgCQCABKQMIIh5CA4NCAFINACAepyIEIAQoAgAiBEEBajYCACAEQX9MDRILQQAtAMDxnQEaQcgAEIUBIgRFDREgBCABKAIgEPwBIAAgBDYCICAAIBU2AhwgACAINgIYIAAgDzYCFCAAIBY2AhAgACAeNwMIIABBBjYCACAAIAEvASg7ASggACABKAIkNgIkDBALIAEoAiwhFCABKAIoIQsgAiABQQhqEPsEAkAgASgCPCIERQ0AQQAtAMDxnQEaQcAAEIUBIgNFDREgAyAEEEQLAkACQCABKAJAIgQNAEEAIQ4MAQtBAC0AwPGdARpBDBCFASIORQ0RQQAtAMDxnQEaIAQoAgghFiAEKAIEIRVB4AAQhQEiD0UNESAPIAQoAgAQZCAOIBY2AgggDiAVNgIEIA4gDzYCAAsgASgCNCEPIAEtAEQhDCACQSBqIAEoAjgiE0EEQQwQzA0gAigCJCENIAIoAiBBAUYNCSACKAIoIRICQCANRQ0AIBNBDGwhFSASIRYgDSEIA0AgFUUNAUEALQDA8Z0BGiAPKAIIIRcgDygCBCEYQcAAEIUBIgRFDRIgAkEgaiAPKAIAEEQgBEE4aiACQSBqQThqKQMANwMAIARBMGogAkEgakEwaikDADcDACAEQShqIAJBIGpBKGopAwA3AwAgBEEgaiACQSBqQSBqKQMANwMAIARBGGogAkEgakEYaikDADcDACAEQRBqIAJBIGpBEGopAwA3AwAgBEEIaiACQSBqQQhqKQMANwMAIAQgAikDIDcDACAWQQhqIBc2AgAgFkEEaiAYNgIAIBYgBDYCACAVQXRqIRUgFkEMaiEWIA9BDGohDyAIQX9qIggNAAsLIAAgAikDADcDCCAAQRBqIAJBCGopAwA3AwAgAEEYaiACQRBqKQMANwMAIABBIGogAkEYaikDADcDACABKABFIQQgAS8ASSEPIAAgAS0ASzoASyAAIA87AEkgACAENgBFIAAgDDoARCAAIA42AkAgACADNgI8IAAgEzYCOCAAIBI2AjQgACANNgIwIAAgFDYCLCAAIAs2AiggAEEHNgIADA8LIAEoAhQhFCABKAIQIQsgASgCICEMIAEoAhwhECABKAIYIRECQCABKQMIIh5CA4NCAFINACAepyIEIAQoAgAiBEEBajYCACAEQX9MDRALQQAhA0EAIQ0CQCABKAIkIgRFDQBBAC0AwPGdARpBwAAQhQEiDUUNECANIAQQRAsCQCABKAIoIgRFDQBBAC0AwPGdARpBDBCFASIDRQ0QQQAtAMDxnQEaIAQoAgghFiAEKAIEIRVB4AAQhQEiD0UNECAPIAQoAgAQZCADIBY2AgggAyAVNgIEIAMgDzYCAAsgASgCMCEPIAEtADkhGSACQSBqIAEoAjQiE0EEQQwQzA0gAigCJCEOIAIoAiBBAUYNCSACKAIoIRICQCAORQ0AIBNBDGwhFSASIRYgDiEIA0AgFUUNAUEALQDA8Z0BGiAPKAIIIRcgDygCBCEYQcAAEIUBIgRFDREgAkEgaiAPKAIAEEQgBEE4aiACQSBqQThqKQMANwMAIARBMGogAkEgakEwaikDADcDACAEQShqIAJBIGpBKGopAwA3AwAgBEEgaiACQSBqQSBqKQMANwMAIARBGGogAkEgakEYaikDADcDACAEQRBqIAJBIGpBEGopAwA3AwAgBEEIaiACQSBqQQhqKQMANwMAIAQgAikDIDcDACAWQQhqIBc2AgAgFkEEaiAYNgIAIBYgBDYCACAVQXRqIRUgFkEMaiEWIA9BDGohDyAIQX9qIggNAAsLIAAgGToAOSAAIBM2AjQgACASNgIwIAAgDjYCLCAAIAM2AiggACANNgIkIAAgDDYCICAAIBA2AhwgACARNgIYIAAgFDYCFCAAIAs2AhAgACAeNwMIIABBCDYCACAAIAEoATo2ATogACABLQA4OgA4DA4LIAEoAgghDyACQSBqIAEoAgwiF0EIQSgQzA0gAigCJCEIIAIoAiBBAUYNCSACKAIoIRgCQCAIRQ0AIBdBKGwhFiAYIQQgCCEVA0AgFkUNASACQSBqIA8Q0QIgBEEgaiACQSBqQSBqKQMANwMAIARBGGogAkEgakEYaikDADcDACAEQRBqIAJBIGpBEGopAwA3AwAgBEEIaiACQSBqQQhqKQMANwMAIAQgAikDIDcDACAWQVhqIRYgBEEoaiEEIA9BKGohDyAVQX9qIhUNAAsLAkACQCABKAIQIg8NAEEAIQQMAQtBAC0AwPGdARpBDBCFASIERQ0PQQAtAMDxnQEaIA8oAgghFSAPKAIEIQNB4AAQhQEiFkUNDyAWIA8oAgAQZCAEIBU2AgggBCADNgIEIAQgFjYCAAsgACAENgIQIAAgFzYCDCAAIBg2AgggACAINgIEIABBCTYCACAAIAEvARw7ARwgACABKQIUNwIUDA0LQdgARQ0MIAAgAUHYAPwKAAAMDAsgASgCCCEPIAEoAhghGCABKAIUIQMgASgCECEOIAEoAiAhDSABKAIcIRMgAkEgaiABKAIMIhdBCEEwEMwNIAIoAiQhCCACKAIgQQFGDQggAigCKCEBAkAgCEUNACAXQTBsIRYgASEEIAghFQNAIBZFDQEgAkEgaiAPEIABIARBKGogAkEgakEoaikDADcDACAEQSBqIAJBIGpBIGopAwA3AwAgBEEYaiACQSBqQRhqKQMANwMAIARBEGogAkEgakEQaikDADcDACAEQQhqIAJBIGpBCGopAwA3AwAgBCACKQMgNwMAIARBMGohBCAWQVBqIRYgD0EwaiEPIBVBf2oiFQ0ACwsgACANNgIgIAAgEzYCHCAAIBg2AhggACADNgIUIAAgDjYCECAAIBc2AgwgACABNgIIIAAgCDYCBCAAQQs2AgAMCwtBBSEUIAEoAiwhCyABKAIoIQwCQCABKAIIQQVGDQAgAkEgaiABQQhqEPsEIAIpAzghHyACKAI0IRAgAigCMCERIAIpAyghHiACKAIkIRkgAigCICEUDAoLIAEoAhwhECABKAIYIREgASkDECIeQgODQgBSDQggHqciBCAEKAIAIgRBAWo2AgAgBEF/Sg0IDAsLIAogAigCKEGIn5oBEKoeAAsgEyACKAIoQYifmgEQqh4ACyATIAIoAihBiJ+aARCqHgALIAggAigCKEGIn5oBEKoeAAsgDSACKAIoQYifmgEQqh4ACyAOIAIoAihBiJ+aARCqHgALIAggAigCKEGIn5oBEKoeAAsgCCACKAIoQYifmgEQqh4ACwtBACEDQQAhDQJAIAEoAjwiBEUNAEEALQDA8Z0BGkHAABCFASINRQ0CIA0gBBBECwJAIAEoAkAiBEUNAEEALQDA8Z0BGkEMEIUBIgNFDQJBAC0AwPGdARogBCgCCCEWIAQoAgQhFUHgABCFASIPRQ0CIA8gBCgCABBkIAMgFjYCCCADIBU2AgQgAyAPNgIACyABKAI0IQ8gAS0ARCEaIAJBIGogASgCOCITQQRBDBDMDSACKAIkIQ4gAigCIEEBRg0CIAIoAighEgJAIA5FDQAgE0EMbCEVIBIhFiAOIQgDQCAVRQ0BQQAtAMDxnQEaIA8oAgghFyAPKAIEIRhBwAAQhQEiBEUNAyACQSBqIA8oAgAQRCAEQThqIAJBIGpBOGopAwA3AwAgBEEwaiACQSBqQTBqKQMANwMAIARBKGogAkEgakEoaikDADcDACAEQSBqIAJBIGpBIGopAwA3AwAgBEEYaiACQSBqQRhqKQMANwMAIARBEGogAkEgakEQaikDADcDACAEQQhqIAJBIGpBCGopAwA3AwAgBCACKQMgNwMAIBZBCGogFzYCACAWQQRqIBg2AgAgFiAENgIAIBVBdGohFSAWQQxqIRYgD0EMaiEPIAhBf2oiCA0ACwsgACAaOgBEIAAgAzYCQCAAIA02AjwgACATNgI4IAAgEjYCNCAAIA42AjAgACALNgIsIAAgDDYCKCAAIB83AyAgACAQNgIcIAAgETYCGCAAIB43AxAgACAZNgIMIAAgFDYCCCAAQQw2AgAgACABKABFNgBFCyACQeAAaiQADwsACyAOIAIoAihBiJ+aARCqHgAL9ioCE38CfiMAQbABayIEJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAMoAhAiBSADKAIUIgZLDQACQCADLQAYDQACQCAGIAMoAgwiB0kNACADKAIEIQggAygCACEJQQIhCgwNCyADKAIIIAZqLQAAIQsgAygCBCEIIAMoAgAhCSABQeAEaiIKQbDLhAFBIBCSFQ0KDAsLAkAgBiADKAIMIgxJDQAgAygCBCENIAMoAgAhCUECIQoMBAsgAygCCCAGai0AACELIAMoAgQhDSADKAIAIQkgAUHgBGoiCkGwy4QBQSAQkhUNAQwCCyAAQQA2AgAMEQsgBEEwaiAKIAtBA3ZBEHFqIgopAwAgCkEIaikDACALQf8AcRCNEiAEKQMwQgGDUA0AIAutIRdCBCEYDAILIAEgC2otAGAhCgsgCkH/AXEhCwJAAkAgCQ4DBAABBAsgC0EGaiELDAMLIAEtAFlBAXENASANrSEXQgIhGAsgF0IghiAYhCEXDAILAkAgDSABKAKABSgC3AJPDQAgDUEGbCALakEMaiELDAELIAEoAoQFEPwUIQgMAgsCQCALIAIoAogBIghJDQAgCyAIQYyFhAEQsxEACyACKAKEASALQQJ0aigCACIIQQBODQEgBCACNgKMASAEIAE2AogBIARBoAFqIARBiAFqIAkgDSAKEIkBAkAgBCgCoAFBBUcNACAEKAKkASEIDAILIAQpA6ABIRcLIBdCIIghGAJAAkACQAJAIBenIgJBfWoiC0ECIAtBAkkbDgMAAQIACyAEQQE6AIgBIAQgBjYCjAEgBEGIAWoQlxohBgwCCyAEIAY2AowBIAQgGDwAiQEgBEEAOgCIASAEQYgBahCXGiEGDAELIAQgGD4CkAEgBCACNgKMASAEQQM6AIgBIARBiAFqEJcaIQYLIABBAjYCACAAIAY2AgQMCgsCQCAFIAZGDQAgBkF/aiEKAkAgAigCsAFBAXFFDQAgAiACKAK0ASIGIAIoArgBIgtrIAsgBmsgBiALSxsgAigCcGo2AnALIAIgCjYCuAEgAiAKNgK0ASACQQE2ArABQX8gBUEDaiIGIAYgBUkbIQ0gAUHgAmohCSADKAIIIgdBfWohDgNAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgCEH///8/Sw0AIAogBU8NAQwLCyACKAKwAUUNAiACIAo2ArgBIAogDEkNASAKIAxBxIqEARCzEQALIAIoAnwhDyACKAJ4IQMgCiELA0AgAyAIIAkgDiALaiIKQQNqLQAAai0AAGpBAnRqKAIAIQYgCyANTQ0HIAZBgICAwABPDQcgAyAGIAkgCkECai0AAGotAABqQQJ0aigCACIIQf///z9LDQQgAyAIIAkgCkEBai0AAGotAABqQQJ0aigCACIGQf///z9LDQYgAyAGIAkgCi0AAGotAABqQQJ0aigCACIIQf///z9LDQUgC0F8aiILIAVPDQAMCwsLIAhB////P3EgCSAHIApqLQAAIgtqLQAAaiIGIAIoAnwiA08NAQJAAkAgAigCeCAGQQJ0aigCACIGQQBIDQBBACELDAELIAQgAjYCjAEgBCABNgKIASAEQSBqIARBiAFqIAggC0EIdBCDASAEKAIkIQYgBCgCICELCyALQQFxRQ0HIARBAToAiAEgBCAKNgKMASAEQYgBahCXGiEGIABBAjYCACAAIAY2AgQMFQtB1P+DAUEfQfT/gwEQ8hIACyAGIANB0P6DARCzEQALIAtBf2ohCiAGIRAgCCEGDAMLIAtBfWohCiAGIRAgCCEGDAILIAtBfmohCiAIIRAMAQsgCCEQIAshCgsgBkEATg0AAkACQCACKAKwAUUNACACIAo2ArgBIBAgCSAHIApqLQAAIgtqLQAAaiIGIA9PDQECQAJAIAMgBkECdGooAgAiBkEASA0AQQAhCwwBCyAEIAI2AowBIAQgATYCiAEgBEEoaiAEQYgBaiAQIAtBCHQQgwEgBCgCLCEGIAQoAighCwsgC0EBcUUNAiAEQQE6AIgBIAQgCjYCjAEgBEGIAWoQlxohBiAAQQI2AgAgACAGNgIEDBALQdT/gwFBH0H0/4MBEPISAAsgBiAPQdD+gwEQsxEACwJAIAZBgICAwABJDQAgBkGAgICAAXENAAJAAkACQCAGQYCAgMAAcQ0AIAZBgICAgARxDQEgBkGAgICAAnFFDQIgAiAKEMkVAkAgCiAMTw0AIAcgCmotAAAhBiAEIAo2AowBIAQgBjoAiQEgBEEAOgCIASAEQYgBahCXGiEGIABBAjYCACAAIAY2AgQMEgsgCiAMQeSKhAEQsxEACyABKAKABSABKAKEBSACIAYQ9RohBiACIAoQyRUgACAKQQFqNgIIIAAgBjYCBCAAQQE2AgAMEAsgAiAKEMkVIABBADYCAAwPCyAEQQE2AowBIARBnIqEATYCiAEgBEIANwKUASAEIARBrAFqNgKQASAEQYgBakHUioQBEIUbAAsgBiEICyAKIQsLIAtBf2ohCiALIAVHDQALIAIoArABIQYgAkEANgKwAQJAAkACQCAGQQFxRQ0AIAIgAigCcCACKAK0ASIGIAVrIAUgBmsgBiAFSxtqNgJwAkACQAJAAkAgBQ0AIARBEGogASACIAgQ9A0gBCgCEEEBcUUNASAEQQE6AIgBIARBADYCjAEgBEGIAWoQlxohBgwGCwJAIAVBf2oiBiAMSQ0AIAYgDEGki4QBELMRAAsgBEEYaiABIAIgCCAHIAZqLQAAIgsQ9g0gBCgCGEEBcQ0EIAQoAhwiCUGAgIDAAHENAQJAIAlBgICAgAJxDQBBACEFDAMLIAQgBjYCjAEgBCALOgCJASAEQQA6AIgBIARBiAFqEJcaIQYMBQtBACEFIAQoAhQiCUGAgIDAAHFFDQELIAEoAoAFIAEoAoQFIAIgCRD1GiELIAUhBkEBIQULIAAgBjYCCCAAIAs2AgQMDAtBhICEAUEfQaSAhAEQ8hIACyAEQQE6AIgBIAQgBTYCjAEgBEGIAWoQlxohBgsgAEECNgIAIAAgBjYCBAwKCwJAAkACQAJAAkACQAJAAkAgBQ0AIAEtAN8EQQFqIgUgCEH///8/cWoiBiACKAJ8IgtPDQJBACELAkAgAigCeCAGQQJ0aigCACIGQQBODQAgBCACNgKMASAEIAE2AogBIAQgBEGIAWogCCAFQRB0QQFyEIMBIAQoAgQhBiAEKAIAIQsLIAtBAXFFDQEgBEEBOgCIASAEQQA2AowBIARBiAFqEJcaIQYMBAsgBUF/aiILIAxJDQIgCyAMQaSLhAEQsxEAC0EAIQUgBkGAgIDAAHFFDQQMAwsgBiALQeD+gwEQsxEACyAIQf///z9xIAEgAygCCCALai0AACIDai0A4AJqIgYgAigCfCIJTw0DQQAhCQJAIAIoAnggBkECdGooAgAiBkEATg0AIAQgAjYCjAEgBCABNgKIASAEQQhqIARBiAFqIAggA0EIdBCDASAEKAIMIQYgBCgCCCEJCwJAIAlBAXFFDQAgBEEBOgCIASAEIAU2AowBIARBiAFqEJcaIQYMAQsgBkGAgIDAAHENAQJAIAZBgICAgAJxDQBBACEFDAMLIAQgCzYCjAEgBCADOgCJASAEQQA6AIgBIARBiAFqEJcaIQYLIABBAjYCACAAIAY2AgQMDAsgASgCgAUgASgChAUgAiAGEPUaIQkgBSELQQEhBQsgACALNgIIIAAgCTYCBAwJCyAGIAlB0P6DARCzEQALIARB8ABqIAogC0EDdkEQcWoiCikDACAKQQhqKQMAIAtB/wBxEI0SIAQpA3BCAYNQDQAgC60hF0IEIRgMAgsgASALai0AYCEKCyAKQf8BcSELAkACQCAJDgMEAAEECyALQQZqIQsMAwsgAS0AWUEBcQ0BIAitIRdCAiEYCyAXQiCGIBiEIRcMAgsCQCAIIAEoAoAFKALcAk8NACAIQQZsIAtqQQxqIQsMAQsgASgChAUQ/BQhCwwCCwJAIAsgAigCiAEiDUkNACALIA1BjIWEARCzEQALIAIoAoQBIAtBAnRqKAIAIgtBAE4NASAEIAI2AowBIAQgATYCiAEgBEGgAWogBEGIAWogCSAIIAoQiQECQCAEKAKgAUEFRw0AIAQoAqQBIQsMAgsgBCkDoAEhFwsgF0IgiCEYAkACQAJAAkAgF6ciAkF9aiILQQIgC0ECSRsOAwABAgALIARBAToAiAEgBCAGNgKMASAEQYgBahCXGiEGDAILIAQgBjYCjAEgBCAYPACJASAEQQA6AIgBIARBiAFqEJcaIQYMAQsgBCAYPgKQASAEIAI2AowBIARBAzoAiAEgBEGIAWoQlxohBgsgAEECNgIAIAAgBjYCBAwCCwJAIAUgBkYNACAGQX9qIQYCQCACKAKwAUEBcUUNACACIAIoArQBIgkgAigCuAEiCmsgCiAJayAJIApLGyACKAJwajYCcAsgAiAGNgK4ASACIAY2ArQBIAJBATYCsAFBfyAFQQNqIgkgCSAFSRshDiABQeACaiEJIAMoAggiD0F9aiEMIAEoAoQFIREgASgCgAUhEkEAIRMCQANAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgC0H///8/Sw0AIAYgBU8NAQwLCyACKAKwAUUNAiACIAY2ArgBIAYgB0kNASAGIAdBxIqEARCzEQALIAIoAnwhFCACKAJ4IQMDQCADIAsgCSAMIAZqIgpBA2otAABqLQAAakECdGooAgAhCCAGIA5NDQcgCEGAgIDAAE8NByADIAggCSAKQQJqLQAAai0AAGpBAnRqKAIAIg1B////P0sNBCADIA0gCSAKQQFqLQAAai0AAGpBAnRqKAIAIghB////P0sNBiADIAggCSAKLQAAai0AAGpBAnRqKAIAIgtB////P0sNBSAGQXxqIgYgBUkNCgwACwsgC0H///8/cSAJIA8gBmotAAAiCmotAABqIgMgAigCfCIITw0BAkACQCACKAJ4IANBAnRqKAIAIgNBAEgNAEEAIQsMAQsgBCACNgKMASAEIAE2AogBIARB4ABqIARBiAFqIAsgCkEIdBCDASAEKAJkIQMgBCgCYCELCwJAIAtBAXFFDQAgBEEBOgCIASAEIAY2AowBIARBiAFqEJcaIQYgAEECNgIAIAAgBjYCBAwPCyADIQsgBiEKDAcLQdT/gwFBH0H0/4MBEPISAAsgAyAIQdD+gwEQsxEACyAGQX9qIQogDSEVIAghDQwDCyAGQX1qIQogCyEVIAghDQwCCyAGQX5qIQogCCEVDAELIAghFSAGIQogCyENCwJAIBVBAEgNACAVIQsMAQsCQAJAIAIoArABRQ0AIAIgCjYCuAEgDSAJIA8gCmotAAAiCGotAABqIgYgFE8NAQJAAkAgAyAGQQJ0aigCACILQQBIDQBBACEGDAELIAQgAjYCjAEgBCABNgKIASAEQegAaiAEQYgBaiANIAhBCHQQgwEgBCgCbCELIAQoAmghBgsgBkEBcUUNAiAEQQE6AIgBIAQgCjYCjAEgBEGIAWoQlxohBiAAQQI2AgAgACAGNgIEDAkLQdT/gwFBH0H0/4MBEPISAAsgBiAUQdD+gwEQsxEACyALQYCAgMAASQ0BIAtBgICAgAFxDQECQAJAAkAgC0GAgIDAAHENACALQYCAgIAEcQ0BIAtBgICAgAJxDQIgBEEBNgKMASAEQZyKhAE2AogBIARCADcClAEgBCAEQawBajYCkAEgBEGIAWpB1IqEARCFGwALQQAhEAJAIBIoAtwCQQFGDQAgESACIAsQ8RkiBigCACAGKAIEQQAQlRAhEAtBASETIApBAWohFgwDCyACIAoQyRUMBAsgAiAKEMkVAkAgCiAHTw0AIA8gCmotAAAhBiAEIAo2AowBIAQgBjoAiQEgBEEAOgCIASAEQYgBahCXGiEGIABBAjYCACAAIAY2AgQMBwsgCiAHQeSKhAEQsxEACyAGIQoLIApBf2ohBiAKIAVHDQALIAIoArABIQYgAkEANgKwAQJAAkACQAJAIAZBAXFFDQAgAiACKAJwIAIoArQBIgYgBWsgBSAGayAGIAVLG2o2AnACQCAFDQAgBEHQAGogASACIAsQ9A0CQCAEKAJQQQFxRQ0AIARBAToAiAEgBEEANgKMASAEQYgBahCXGiEGDAQLIAQoAlQiC0GAgIDAAHFFDQVBACEFDAQLAkAgBUF/aiIGIAdJDQAgBiAHQaSLhAEQsxEACyAEQdgAaiABIAIgCyAPIAZqLQAAIgkQ9g0gBCgCWEEBcQ0BIAQoAlwiC0GAgIDAAHENAyALQYCAgIACcUUNBCAEIAY2AowBIAQgCToAiQEgBEEAOgCIASAEQYgBahCXGiEGDAILQYSAhAFBH0GkgIQBEPISAAsgBEEBOgCIASAEIAU2AowBIARBiAFqEJcaIQYLIABBAjYCACAAIAY2AgQMBAtBASETIBIgESACIAsQ9RohECAFIRYLIAAgFjYCCCAAIBA2AgQgACATNgIADAILAkACQAJAAkACQAJAAkAgBQ0AIAEtAN8EQQFqIgkgC0H///8/cWoiBiACKAJ8IgVPDQJBACEFAkAgAigCeCAGQQJ0aigCACIGQQBODQAgBCACNgKMASAEIAE2AogBIARBwABqIARBiAFqIAsgCUEQdEEBchCDASAEKAJEIQYgBCgCQCEFCyAFQQFxRQ0BIARBAToAiAEgBEEANgKMASAEQYgBahCXGiEGDAQLIAVBf2oiCSAHSQ0CIAkgB0Gki4QBELMRAAtBACEFIAZBgICAwABxRQ0EDAMLIAYgBUHg/oMBELMRAAsgC0H///8/cSABIAMoAgggCWotAAAiCmotAOACaiIGIAIoAnwiA08NBUEAIQMCQCACKAJ4IAZBAnRqKAIAIgZBAE4NACAEIAI2AowBIAQgATYCiAEgBEHIAGogBEGIAWogCyAKQQh0EIMBIAQoAkwhBiAEKAJIIQMLAkAgA0EBcUUNACAEQQE6AIgBIAQgBTYCjAEgBEGIAWoQlxohBgwBCyAGQYCAgMAAcQ0BAkAgBkGAgICAAnENAEEAIQUMAwsgBCAJNgKMASAEIAo6AIkBIARBADoAiAEgBEGIAWoQlxohBgsgAEECNgIAIAAgBjYCBAwDCyAFIQlBASEFIAEoAoAFIAEoAoQFIAIgBhD1GiELCyAAIAk2AgggACALNgIECyAAIAU2AgALIARBsAFqJAAPCyAGIANB0P6DARCzEQALjSgBBX8jAEHAB2siAiQAAkADQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgAOEwAaGgECAxoaBAUGBwgJChUUExIACyAAKAIMIgNFDRkgACgCCCEAIANBMGwhAwNAIAAgARBvIABBMGohACADQVBqIgMNAAwaCwsgACgCBCIDKAIAQRpHDQ8gAiABKAIAIAEoAgQgA0EIaiIEELUMAkAgAigCAEEyRg0AIAMQyQEgA0E4aiACQThqKQMANwMAIANBMGogAkEwaikDADcDACADQShqIAJBKGopAwA3AwAgA0EgaiACQSBqKQMANwMAIANBGGogAkEYaikDADcDACADQRBqIAJBEGopAwA3AwAgBCACQQhqKQMANwMAIAMgAikDADcDAAsgACgCCCEADBcLIAAoAgwiAEUNFyAAKAIAQRpHDQ0gAkHABGogASgCACABKAIEIABBCGoiARC1DCACKALABEEyRg0XIAAQyQEgAEE4aiACQcAEakE4aikDADcDACAAQTBqIAJBwARqQTBqKQMANwMAIABBKGogAkHABGpBKGopAwA3AwAgAEEgaiACQcAEakEgaikDADcDACAAQRhqIAJBwARqQRhqKQMANwMAIABBEGogAkHABGpBEGopAwA3AwAgASACQcAEakEIaikDADcDACAAIAIpA8AENwMADBcLIAAoAighAAwVCyAAKAIEIgMoAgBBGkcNCiACQcAAaiABKAIAIAEoAgQgA0EIaiIEELUMIAIoAkBBMkYNEyADEMkBIANBOGogAkHAAGpBOGopAwA3AwAgA0EwaiACQcAAakEwaikDADcDACADQShqIAJBwABqQShqKQMANwMAIANBIGogAkHAAGpBIGopAwA3AwAgA0EYaiACQcAAakEYaikDADcDACADQRBqIAJBwABqQRBqKQMANwMAIAQgAkHAAGpBCGopAwA3AwAgAyACKQNANwMADBMLIAAoAhAiAygCAEEaRw0IIAJBgAFqIAEoAgAgASgCBCADQQhqIgQQtQwgAigCgAFBMkYNESADEMkBIANBOGogAkGAAWpBOGopAwA3AwAgA0EwaiACQYABakEwaikDADcDACADQShqIAJBgAFqQShqKQMANwMAIANBIGogAkGAAWpBIGopAwA3AwAgA0EYaiACQYABakEYaikDADcDACADQRBqIAJBgAFqQRBqKQMANwMAIAQgAkGAAWpBCGopAwA3AwAgAyACKQOAATcDAAwRCyAAKAIEIgAoAgBBGkcNBiACQcABaiABKAIAIAEoAgQgAEEIaiIBELUMIAIoAsABQTJGDRMgABDJASAAQThqIAJBwAFqQThqKQMANwMAIABBMGogAkHAAWpBMGopAwA3AwAgAEEoaiACQcABakEoaikDADcDACAAQSBqIAJBwAFqQSBqKQMANwMAIABBGGogAkHAAWpBGGopAwA3AwAgAEEQaiACQcABakEQaikDADcDACABIAJBwAFqQQhqKQMANwMAIAAgAikDwAE3AwAMEwsCQCAAKAIEIgQoAlAiA0UNACAEKAJMIQAgA0EwbCEDA0AgACABEG8gAEEwaiEAIANBUGoiAw0ACwsCQAJAAkAgBCgCAEF5ag4CAQIACyAEIAEQlwMLIAQoAjAiA0UNACAEKAIsIQAgA0EwbCEDA0AgACABEG8gAEEwaiEAIANBUGoiAw0ACwsgBCgCYEGAgICAeEYNEiAEKAJoIgNFDRIgBCgCZCEAIANBMGwhAwNAIAAgARBvIABBMGohACADQVBqIgMNAAwTCwsgACgCBCIDKAIAQRpHDQMgAkGAAmogASgCACABKAIEIANBCGoiBBC1DAJAIAIoAoACQTJGDQAgAxDJASADQThqIAJBgAJqQThqKQMANwMAIANBMGogAkGAAmpBMGopAwA3AwAgA0EoaiACQYACakEoaikDADcDACADQSBqIAJBgAJqQSBqKQMANwMAIANBGGogAkGAAmpBGGopAwA3AwAgA0EQaiACQYACakEQaikDADcDACAEIAJBgAJqQQhqKQMANwMAIAMgAikDgAI3AwALIAAoAgghAAwQCyAAKAIEIgMoAgBBGkcNASACQcACaiABKAIAIAEoAgQgA0EIaiIEELUMAkAgAigCwAJBMkYNACADEMkBIANBOGogAkHAAmpBOGopAwA3AwAgA0EwaiACQcACakEwaikDADcDACADQShqIAJBwAJqQShqKQMANwMAIANBIGogAkHAAmpBIGopAwA3AwAgA0EYaiACQcACakEYaikDADcDACADQRBqIAJBwAJqQRBqKQMANwMAIAQgAkHAAmpBCGopAwA3AwAgAyACKQPAAjcDAAsgACgCCCEADA8LIAAoAgQiA0ECRg0LAkACQCADQQFxRQ0AIAAoAggiAygCAEEaRw0BIAJBgAZqIAEoAgAgASgCBCADQQhqIgQQtQwgAigCgAZBMkYNDSADEMkBIANBOGogAkGABmpBOGopAwA3AwAgA0EwaiACQYAGakEwaikDADcDACADQShqIAJBgAZqQShqKQMANwMAIANBIGogAkGABmpBIGopAwA3AwAgA0EYaiACQYAGakEYaikDADcDACADQRBqIAJBgAZqQRBqKQMANwMAIAQgAkGABmpBCGopAwA3AwAgAyACKQOABjcDAAwNCyAAKAIIIgMoAggiBEUNDCADKAIEIgMgBEE4bGohBQNAIAMgARCXAwJAIANBMGooAgAiBEUNAAJAIAQoAgBBGkcNACACQYAHaiABKAIAIAEoAgQgBEEIaiIGELUMIAIoAoAHQTJGDQEgBBDJASAEQThqIAJBgAdqQThqKQMANwMAIARBMGogAkGAB2pBMGopAwA3AwAgBEEoaiACQYAHakEoaikDADcDACAEQSBqIAJBgAdqQSBqKQMANwMAIARBGGogAkGAB2pBGGopAwA3AwAgBEEQaiACQYAHakEQaikDADcDACAGIAJBgAdqQQhqKQMANwMAIAQgAikDgAc3AwAMAQsgBCABEEYLIANBOGoiAyAFRw0ADA0LCyADIAEQRgwLCyADIAEQRiAAKAIIIQAMDQsgAyABEEYgACgCCCEADAwLIAAgARBGDAwLIAMgARBGDAgLIAMgARBGDAgLIAAgARBGDAkLIAMgARBGIAAoAgghAAwHCwJAIAAoAgQiACgCAEEaRw0AIAJBgARqIAEoAgAgASgCBCAAQQhqIgEQtQwgAigCgARBMkYNCCAAEMkBIABBOGogAkGABGpBOGopAwA3AwAgAEEwaiACQYAEakEwaikDADcDACAAQShqIAJBgARqQShqKQMANwMAIABBIGogAkGABGpBIGopAwA3AwAgAEEYaiACQYAEakEYaikDADcDACAAQRBqIAJBgARqQRBqKQMANwMAIAEgAkGABGpBCGopAwA3AwAgACACKQOABDcDAAwICyAAIAEQRgwHCyAAQQhqIAEQxQEMBgsCQAJAAkACQCAAKAIEDgMAAgEACyAAKAIIIgMoAggiBEUNAiADKAIEIgMgBEE4bGohBQNAIAMgARCXAwJAIANBMGooAgAiBEUNAAJAIAQoAgBBGkcNACACQYAHaiABKAIAIAEoAgQgBEEIaiIGELUMIAIoAoAHQTJGDQEgBBDJASAEQThqIAJBgAdqQThqKQMANwMAIARBMGogAkGAB2pBMGopAwA3AwAgBEEoaiACQYAHakEoaikDADcDACAEQSBqIAJBgAdqQSBqKQMANwMAIARBGGogAkGAB2pBGGopAwA3AwAgBEEQaiACQYAHakEQaikDADcDACAGIAJBgAdqQQhqKQMANwMAIAQgAikDgAc3AwAMAQsgBCABEEYLIANBOGoiAyAFRw0ADAMLCyAAKAIIIAEQgwQMAQsgACgCCCIDKAIIIgRFDQAgAygCBCIDIARBOGxqIQUDQCADIAEQlwMCQCADQTBqKAIAIgRFDQACQCAEKAIAQRpHDQAgAkGAB2ogASgCACABKAIEIARBCGoiBhC1DCACKAKAB0EyRg0BIAQQyQEgBEE4aiACQYAHakE4aikDADcDACAEQTBqIAJBgAdqQTBqKQMANwMAIARBKGogAkGAB2pBKGopAwA3AwAgBEEgaiACQYAHakEgaikDADcDACAEQRhqIAJBgAdqQRhqKQMANwMAIARBEGogAkGAB2pBEGopAwA3AwAgBiACQYAHakEIaikDADcDACAEIAIpA4AHNwMADAELIAQgARBGCyADQThqIgMgBUcNAAsLAkAgACgCDCIDKAIAQRpHDQAgAkHAA2ogASgCACABKAIEIANBCGoiBBC1DAJAIAIoAsADQTJGDQAgAxDJASADQThqIAJBwANqQThqKQMANwMAIANBMGogAkHAA2pBMGopAwA3AwAgA0EoaiACQcADakEoaikDADcDACADQSBqIAJBwANqQSBqKQMANwMAIANBGGogAkHAA2pBGGopAwA3AwAgA0EQaiACQcADakEQaikDADcDACAEIAJBwANqQQhqKQMANwMAIAMgAikDwAM3AwALIAAoAhAhAAwFCyADIAEQRiAAKAIQIQAMBAsCQAJAAkACQCAAKAIEDgMAAgEACyAAKAIIIgMoAggiBEUNAiADKAIEIgMgBEE4bGohBQNAIAMgARCXAwJAIANBMGooAgAiBEUNAAJAIAQoAgBBGkcNACACQYAHaiABKAIAIAEoAgQgBEEIaiIGELUMIAIoAoAHQTJGDQEgBBDJASAEQThqIAJBgAdqQThqKQMANwMAIARBMGogAkGAB2pBMGopAwA3AwAgBEEoaiACQYAHakEoaikDADcDACAEQSBqIAJBgAdqQSBqKQMANwMAIARBGGogAkGAB2pBGGopAwA3AwAgBEEQaiACQYAHakEQaikDADcDACAGIAJBgAdqQQhqKQMANwMAIAQgAikDgAc3AwAMAQsgBCABEEYLIANBOGoiAyAFRw0ADAMLCyAAKAIIIAEQgwQMAQsgACgCCCIDKAIIIgRFDQAgAygCBCIDIARBOGxqIQUDQCADIAEQlwMCQCADQTBqKAIAIgRFDQACQCAEKAIAQRpHDQAgAkGAB2ogASgCACABKAIEIARBCGoiBhC1DCACKAKAB0EyRg0BIAQQyQEgBEE4aiACQYAHakE4aikDADcDACAEQTBqIAJBgAdqQTBqKQMANwMAIARBKGogAkGAB2pBKGopAwA3AwAgBEEgaiACQYAHakEgaikDADcDACAEQRhqIAJBgAdqQRhqKQMANwMAIARBEGogAkGAB2pBEGopAwA3AwAgBiACQYAHakEIaikDADcDACAEIAIpA4AHNwMADAELIAQgARBGCyADQThqIgMgBUcNAAsLAkAgACgCDCIDKAIAQRpHDQAgAkGAA2ogASgCACABKAIEIANBCGoiBBC1DAJAIAIoAoADQTJGDQAgAxDJASADQThqIAJBgANqQThqKQMANwMAIANBMGogAkGAA2pBMGopAwA3AwAgA0EoaiACQYADakEoaikDADcDACADQSBqIAJBgANqQSBqKQMANwMAIANBGGogAkGAA2pBGGopAwA3AwAgA0EQaiACQYADakEQaikDADcDACAEIAJBgANqQQhqKQMANwMAIAMgAikDgAM3AwALIAAoAhAhAAwECyADIAEQRiAAKAIQIQAMAwsCQCAAKAIYIgNFDQACQCADKAIAQRpHDQAgAkHABWogASgCACABKAIEIANBCGoiBBC1DCACKALABUEyRg0BIAMQyQEgA0E4aiACQcAFakE4aikDADcDACADQTBqIAJBwAVqQTBqKQMANwMAIANBKGogAkHABWpBKGopAwA3AwAgA0EgaiACQcAFakEgaikDADcDACADQRhqIAJBwAVqQRhqKQMANwMAIANBEGogAkHABWpBEGopAwA3AwAgBCACQcAFakEIaikDADcDACADIAIpA8AFNwMADAELIAMgARBGCwJAAkAgACgCHCIDRQ0AIAMoAgBBGkcNASACQYAFaiABKAIAIAEoAgQgA0EIaiIEELUMIAIoAoAFQTJGDQAgAxDJASADQThqIAJBgAVqQThqKQMANwMAIANBMGogAkGABWpBMGopAwA3AwAgA0EoaiACQYAFakEoaikDADcDACADQSBqIAJBgAVqQSBqKQMANwMAIANBGGogAkGABWpBGGopAwA3AwAgA0EQaiACQYAFakEQaikDADcDACAEIAJBgAVqQQhqKQMANwMAIAMgAikDgAU3AwALIAAoAgwhAAwDCyADIAEQRiAAKAIMIQAMAgsgACgCDCIDRQ0CIAAoAggiBCADQRhsaiEFA0ACQCAEKAIUIgBFDQACQCAAKAIAQRpHDQAgAkHABmogASgCACABKAIEIABBCGoiAxC1DCACKALABkEyRg0BIAAQyQEgAEE4aiACQcAGakE4aikDADcDACAAQTBqIAJBwAZqQTBqKQMANwMAIABBKGogAkHABmpBKGopAwA3AwAgAEEgaiACQcAGakEgaikDADcDACAAQRhqIAJBwAZqQRhqKQMANwMAIABBEGogAkHABmpBEGopAwA3AwAgAyACQcAGakEIaikDADcDACAAIAIpA8AGNwMADAELIAAgARBGCwJAIARBCGooAgAiA0UNACAEQQRqKAIAIQAgA0EwbCEDA0AgACABEG8gAEEwaiEAIANBUGoiAw0ACwsgBEEYaiIEIAVGDQMMAAsLIAAoAgggARBvIAAoAhQiAA0ACwsgAkHAB2okAAuRJwIbfwh+IwBB4A5rIgQkACABvSEfAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAGZRAAAAAAAAPB/Yg0AQQMhBQwBCyAfQoCAgICAgID4/wCDIiBCgICAgICAgPj/AFENBSAfQv////////8HgyIhQoCAgICAgIAIhCAfQgGGQv7///////8PgyAfQjSIp0H/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CCACQQE2AgAgAiAGIAdrNgIEDCALIAYgB0HY8oMBEKMgAAtBAEEAQezhgwEQsxEACyANIAtBjOKDARCzEQALIAEgC0G84YMBELMRAAsgA0EANgIIQQBBlLeYASADQQRqIANBCGpB3OGDARCZGQALIAEgBkG48oMBELMRAAsgA0EANgIYIANBATYCDCADQcTmgwE2AgggA0IENwIQIANBCGpBzOaDARCFGwALIAYgB0HY8oMBEKMgAAtBAEEAQezhgwEQsxEACyAEIAxBjOKDARCzEQALIAEgDEG84YMBELMRAAsgA0EANgIIQQBBlLeYASADQQRqIANBCGpB3OGDARCZGQALIAEgB0G48oMBELMRAAsgA0EANgIYIANBATYCDCADQcTmgwE2AgggA0IENwIQIANBCGpBzOaDARCFGwALIAYgB0HY8oMBEKMgAAtBAEEAQezhgwEQsxEACyANIAtBjOKDARCzEQALIAEgC0G84YMBELMRAAsgA0EANgIIQQBBlLeYASADQQRqIANBCGpB3OGDARCZGQALIAEgBkG48oMBELMRAAsgA0EANgIYIANBATYCDCADQcTmgwE2AgggA0IENwIQIANBCGpBzOaDARCFGwALIAYgB0HY8oMBEKMgAAtBAEEAQezhgwEQsxEACyAEIAxBjOKDARCzEQALIAEgDEG84YMBELMRAAsgA0EANgIIQQBBlLeYASADQQRqIANBCGpB3OGDARCZGQALIAEgB0G48oMBELMRAAsgA0EANgIYIANBATYCDCADQcTmgwE2AgggA0IENwIQIANBCGpBzOaDARCFGwALIAJBADYCGCACIAY2AhQgAkEBNgIQIAIgBDYCICACQQA2AgALAkAgBCAFTw0AIABBLGohDiABKAIMIQ8gASgCCCEQA0ACQAJAAkACQAJAAkACQAJAIAQgD08NAAJAAkAgBiAAKAIIIg1JDQAgBiEIDAELIA4gECAEai0AAGotAAAiAUECaiERIAAoAgQhCSAGIQgDQAJAAkACQAJAIAkgCEECdGooAgAiBkH/AXFBgn5qDgICAAELIBEgCGoiBiANTw0GIAkgBkECdGooAgAiBkEBRg0CDAwLIA0gCEECaiIKSQ0GIAZBAnZBP3EgBkEDcUEAR2oiEiANIAprIgZLDQcgEkECdCEHIAkgCkECdGohC0F/IQwC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AmohAQwBCyAAKAIoQQJqIQELIAEgB08NAwJAAkAgBiABQQJ0aigCACILQX9MDQACQCABQQFqIgEgB08NACAGIAFBAnRqKAIAIQEMAgsgASAHQczhgwEQsxEACyALQf////8HcSEBCyABIAAoAhQiBk8NBCAEQQFqIgYgACgCECABQQJ0aigCACIHSQ0FIAIgATYCDCACIAY2AgggAkEBNgIAIAIgBiAHazYCBAsgA0EgaiQADwsgBiANQcjygwEQoyAAC0EAQQBB7OGDARCzEQALIAEgB0G84YMBELMRAAsgASAGQbjygwEQsxEACyADQQA2AhggA0EBNgIMIANBxOaDATYCCCADQgQ3AhAgA0EIakHM5oMBEIUbAAvoMQECfyMAQRBrIgIkAAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgAiAygCACIAQTQgAEG9gYCAeEgbQf8BcQ69AQABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gAGBAYIBgwGEAYUBhgGHAYgBiQGKAYsBjAGNAY4BjwGQAZEBkgGTAZQBlQGWAZcBmAGZAZoBmwGcAZ0BngGf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ARCzEQALIAkgB0GMroABELMRAAsgAEEANgIADAsLAkACQCAGQQFxDQBBACEIAkACQAJAAkACQCABKALYAiIJDQAMAQsgCSABKALUAksNACADQSBqIAEgCRCbGSADIAMpAyA3AjggA0EYaiADQThqQQAQmAwgAygCGEEBcUUNAyADKAIcIhMgASgCOCIHTw0CIAQgASgCNCATQQJ0aigCACIHSQ0BIAQgB2shEEEBIQgLAkAgBCAFSQ0AIAQhFAwFCyACKAIMIg4gBCAOIARLGyEKIAFByABqIQ8gAigCCCERIAQhFANAAkACQAJAAkACQCAEIApGDQACQAJAAkACQCAJIAEoAggiDE8NACAPIBEgBGotAAAiB2ohDSABKAIEIQYDQCAGIAlBFGxqIhIhCQJAAkACQCASKAIEIgJFDQAgAiANLQAAaiIJIAEoAiAiAk8NBiABKAIcIAlBAnRqIQkMAQsDQCAJKAAAIglFDQIgCSABKAIUIgJPDQcgASgCECAJQQlsaiICQQVqIQkgByACLQAAIgtLDQALIAcgC0cNASACQQFqIQkLIAkoAAAiCUEBRw0DCyASKAIMIgkgDEkNAAsLIAkgDEGs44MBELMRAAsgCSABKALQAksNBiAJRQ0MIAkgASgC1AJLDQYgCSAMTw0DAkACQCAGIAlBFGxqKAIIIgJFDQAgAiABKAIsIgdJDQEgAiAHQZzjgwEQsxEAC0H48oMBEJsgAAsgASgCKCACQQN0aigCACITIAEoAjgiAk8NBCAEQQFqIhQgASgCNCATQQJ0aigCACICSQ0FIBQgAmshEEEBIQgMBgsgCSACQbzjgwEQsxEACyAJIAJBjOODARCzEQALIAogDkGMnYABELMRAAsgCSAMQYyugAEQsxEACyATIAJB6PKDARCzEQALIANBADYCSCADQQE2AjwgA0HE5oMBNgI4IANCBDcCQCADQThqQczmgwEQhRsACyAEQQFqIgQgBUYNBQwACwsgA0EANgJIIANBATYCPCADQcTmgwE2AjggA0IENwJAIANBOGpBzOaDARCFGwALIBMgB0Ho8oMBELMRAAtB+PKDARCbIAALAkACQAJAAkAgASgC2AIiCUUNACAJIAEoAtQCSw0AIANBEGogASAJEJsZIAMgAykDEDcCOCADQQhqIANBOGpBABCYDCADKAIIQQFxRQ0DIAMoAgwiCSABKAI4IgJPDQIgBCABKAI0IAlBAnRqKAIAIgFJDQEgACAJNgIMIAAgBDYCCCAAQQE2AgAgACAEIAFrNgIEDA8LAkAgBCAFTw0AIAIoAgwiEyAEIBMgBEsbIQogAUHIAGohDyACKAIIIREDQAJAAkACQAJAAkACQAJAAkACQCAEIApGDQACQCAJIAEoAggiDE8NACAPIBEgBGotAAAiB2ohDSABKAIEIQYDQCAGIAlBFGxqIhIhCQJAAkACQCASKAIEIgJFDQAgAiANLQAAaiIJIAEoAiAiAk8NByABKAIcIAlBAnRqIQkMAQsDQCAJKAAAIglFDQIgCSABKAIUIgJPDQggASgCECAJQQlsaiICQQVqIQkgByACLQAAIgtLDQALIAcgC0cNASACQQFqIQkLIAkoAAAiCUEBRw0ECyASKAIMIgkgDEkNAAsLIAkgDEGs44MBELMRAAsgCiATQYydgAEQsxEACyAJIAEoAtACSw0GIAlFDQIgCSABKALUAksNBiAJIAxPDQMCQAJAIAYgCUEUbGooAggiCUUNACAJIAEoAiwiAkkNASAJIAJBnOODARCzEQALQfjygwEQmyAACyABKAIoIAlBA3RqKAIAIgkgASgCOCICTw0EIARBAWoiAiABKAI0IAlBAnRqKAIAIgFJDQUgACAJNgIMIAAgAjYCCCAAQQE2AgAgACACIAFrNgIEDBcLIAkgAkG844MBELMRAAsgCSACQYzjgwEQsxEACyAAQQA2AgAMFAsgCSAMQYyugAEQsxEACyAJIAJB6PKDARCzEQALIANBADYCSCADQQE2AjwgA0HE5oMBNgI4IANCBDcCQCADQThqQczmgwEQhRsACyAEQQFqIgQgBUcNAAsLIABBADYCAAwOCyADQQA2AkggA0EBNgI8IANBxOaDATYCOCADQgQ3AkAgA0E4akHM5oMBEIUbAAsgCSACQejygwEQsxEAC0H48oMBEJsgAAsgACATNgIMIAAgFDYCCCAAIBA2AgQgACAINgIADAoLAkACQAJAAkACQCABKALYAiIJRQ0AIAkgASgC1AJLDQAgA0EoaiABIAkQmxkCQAJAIAMoAiwiCUUNACAJIAMoAigiAigCLCIHSQ0BIAkgB0Gc44MBELMRAAtB+PKDARCbIAALIAIoAiggCUEDdGooAgAiCSABKAI4IgJPDQIgBCABKAI0IAlBAnRqKAIAIgFJDQEgACAJNgIMIAAgBDYCCCAAQQE2AgAgACAEIAFrNgIEDA4LIANBOGogByABKAJAIgsoAghBf2pBeHFqQQhqIAIoAggiDyACKAIMIgogBCAFIAsoAhAREwACQCADKAI4IgIOAwQDAAQLAkAgAygCPCIEIAVPDQAgAUHIAGohEQNAAkACQAJAAkACQAJAAkACQAJAIAQgCk8NAAJAIAkgASgCCCIMTw0AIBEgDyAEai0AACIHaiENIAEoAgQhBgNAIAYgCUEUbGoiEiEJAkACQAJAIBIoAgQiAkUNACACIA0tAABqIgkgASgCICICTw0HIAEoAhwgCUECdGohCQwBCwNAIAkoAAAiCUUNAiAJIAEoAhQiAk8NCCABKAIQIAlBCWxqIgJBBWohCSAHIAItAAAiC0sNAAsgByALRw0BIAJBAWohCQsgCSgAACIJQQFHDQQLIBIoAgwiCSAMSQ0ACwsgCSAMQazjgwEQsxEACyAEIApBjJ2AARCzEQALIAkgASgC0AJLDQUgCUUNAgJAAkAgCSABKALUAksNACAJIAxPDQUCQAJAIAYgCUEUbGooAggiCUUNACAJIAEoAiwiAkkNASAJIAJBnOODARCzEQALQfjygwEQmyAACyABKAIoIAlBA3RqKAIAIgkgASgCOCICTw0GIARBAWoiAiABKAI0IAlBAnRqKAIAIgFPDQEgA0EANgJIIANBATYCPCADQcTmgwE2AjggA0IENwJAIANBOGpBzOaDARCFGwALIANBOGogASgCPCABKAJAIgIoAghBf2pBeHFqQQhqIA8gCiAEIAUgAigCEBETAAJAIAMoAjhFDQAgAygCPCICIARNDQcMCAsgAEEANgIADBcLIAAgCTYCDCAAIAI2AgggAEEBNgIAIAAgAiABazYCBAwWCyAJIAJBvOODARCzEQALIAkgAkGM44MBELMRAAsgAEEANgIADBMLIAkgDEGMroABELMRAAsgCSACQejygwEQsxEACyAEQQFqIQILIAIhBCACIAVJDQALCyAAQQA2AgAMDQsgA0EANgJIIANBATYCPCADQcTmgwE2AjggA0IENwJAIANBOGpBzOaDARCFGwALIAkgAkHo8oMBELMRAAsgACADKQI8NwIEIABBDGogA0E4akEMaigCADYC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IANBwABqIAIgA0EoakHjxJsBQQEQuAwCQCADLQBAQQRGDQAgAykDQCINQv8Bg0IEUg0DCyADQShqIAFBCGogAhCyEwJAIAMtAChBBEYNACADKQMoIg1C/wGDQgRSDQMLIAEoAiAhAQwACwsCQCACLQBdDQAgA0EoaiACEOIOIAMtAChBBEYNACADKQMoIg1C/wGDQgRSDQELIANBKGogASACEOICIAMtAChBBEYNCCADKQMoIg1C/wGDQgRRDQgLIA1C/wGDQgRRDQcgACANNwIADAgLIAEoAgQiASgCHCEEIANBKGogAiABKAIYIglBABCVAgJAAkAgAy0AKEEERg0AIAMpAygiDUL/AYNCBFINAQsCQCABLQAsRQ0AIANBADYCKCADQRhqIAIgA0EoakHuoZsBQQcQuQwCQCADLQAYQQRGDQAgAykDGCINQv8Bg0IEUg0CCyADQShqIAIQ4g4gAy0AKEEERg0AIAMpAygiDUL/AYNCBFINAQsCQCABLQAtRQ0AIANBADYCKCADQRhqIAIgA0EoakHelpsBQQUQuQwCQCADLQAYQQRGDQAgAykDGCINQv8Bg0IEUg0CCyADQShqIAIQ4g4gAy0AKEEERg0AIAMpAygiDUL/AYNCBFINAQsgA0EANgJAIANBKGogAiADQcAAakHMoJsBQQQQuQwCQCADLQAoQQRGDQAgAykDKCINQv8Bg0IEUg0BCyADQShqIAIQ4g4CQCADLQAoQQRGDQAgAykDKCINQv8Bg0IEUg0BCyADQShqIAEgAhCyEwJAIAMtAChBBEYNACADKQMoIg1C/wGDQgRSDQELAkAgAi0AXQ0AIANBKGogAhDiDiADLQAoQQRGDQAgAykDKCINQv8Bg0IEUg0BCyADQShqIAIgA0HAAGpB16ybAUEBELgMAkAgAy0AKEEERg0AIAMpAygiDUL/AYNCBFINAQsgASgCJCEFIANBKGogAiAJIAEoAigiDEHRACAMENYXAkACQAJAIAMtAChBBUYNACADKQMoIQ0MAQsgA0EoahCEHwJAAkACQAJAIAxFDQACQCACLQBdDQAgA0EoaiACEIsSIAMtAChBBEYNACADKQMoIg1C/wGDQgRSDQULIANBADoATyACLQBdRQ0BDAILIAItAF0NAiADQShqIAIQixIgAy0AKEEERg0CIAMpAygiDUL/AYNCBFENAgwDCyACIAIoAjhBAWo2AjgLIANBADoAOCAFQShqIQEgDCEFQQAhC0EAIQYDQAJAAkACQAJAAkACQCAFRQ0AIAFBfGooAgAhCiADQShqIAIgBEHRACALIAYgA0E4aiADQc8AahChBQJAIAMtAChBBEYNACADKQMoIg1C/wGDQgRSDQkLIANBKGogAiABQXhqKAIAQQAQlQICQCADLQAoQQRGDQAgAykDKCINQv8Bg0IEUg0FCyABQWBqIQsgAUFYaigCAEEBRw0BIANBKGogCyACEIcBIAMtAChBBEYNAyADKQMoIg1C/wGDQgRSDQIMAwsgA0EoaiACIAkgBEHRACALIAYQuQIgAy0AKEEERg0GIAMpAygiDUL/AYNCBFINBwwGCyADQShqIAsgAhCyEyADLQAoQQRGDQEgAykDKCINQv8Bg0IEUQ0BCyANQv8Bg0IEUg0BCyABKAIARQ0BAkAgAi0AXQ0AIANBKGogAhDiDiADLQAoQQRGDQAgAykDKCINQv8Bg0IEUg0BCyADQQA2AiggA0EYaiACIANBKGpB+5abAUEBELgMAkAgAy0AGEEERg0AIAMpAxgiDUL/AYNCBFINAQsCQCACLQBdDQAgA0EoaiACEOIOIAMtAChBBEYNACADKQMoIg1C/wGDQgRSDQELIANBKGogASACENogIAMtAChBBEYNASADKQMoIg1C/wGDQgRRDQELIA1C/wGDQgRSDQMLAkACQCADLQBPDQAgA0EBOgBPDAELIAIoAlRFDQAgA0EoaiACIApBABDUAyADLQAoQQRGDQAgAykDKCINQv8Bg0IEUg0DCwJAIAMtADhFDQAgAiACKAI4QX9qNgI4IANBADoAOAsgBUF/aiEFIAFBMGohAUEBIQsgCiEGDAALCyADQShqIAIgBCAMRUHRABDAECADLQAoQQRGDQEgAykDKCINQv8Bg0IEUQ0BCyANQv8Bg0IEUg0BCyADQShqIAIgA0HAAGpBpsSbAUEBELgMIAMtAChBBEYNByADKQMoIg1C/wGDQgRRDQcLIA1C/wGDQgRRDQYgACANNwIADAcLIANBwABqIAIgASgCBCIBKAIAQQAQlQICQAJAIAMtAEBBBEYNACADKQNAIg1C/wGDQgRSDQELAkAgAS0AKEUNACADQQA2AkAgA0EYaiACIANBwABqQe6hmwFBBxC5DAJAIAMtABhBBEYNACADKQMYIg1C/wGDQgRSDQILIANBwABqIAIQ4g4gAy0AQEEERg0AIAMpA0AiDUL/AYNCBFINAQsgA0EANgIoIANBwABqIAIgA0EoakHooJsBQQQQuQwCQCADLQBAQQRGDQAgAykDQCINQv8Bg0IEUg0BCyADQcAAaiACEOIOAkAgAy0AQEEERg0AIAMpA0AiDUL/AYNCBFINAQsgA0HAAGogAUEIaiACELITAkAgAy0AQEEERg0AIAMpA0AiDUL/AYNCBFINAQsCQCABKAIgRQ0AIANBwABqIAFBIGogAhDzBCADLQBAQQRGDQAgAykDQCINQv8Bg0IEUg0BCwJAIAItAF0NACADQcAAaiACEOIOIAMtAEBBBEYNACADKQNAIg1C/wGDQgRSDQELIANBwABqIAIgA0EoakH7lpsBQQEQuAwCQCADLQBAQQRGDQAgAykDQCINQv8Bg0IEUg0BCwJAIAItAF0NACADQcAAaiACEOIOIAMtAEBBBEYNACADKQNAIg1C/wGDQgRSDQELIANBwABqIAFBJGogAhBPAkAgAy0AQEEERg0AIAMpA0AiDUL/AYNCBFINAQsgA0HAAGogAiADQShqELoMIAMtAEBBBEYNBiADKQNAIg1C/wGDQgRRDQYLIA1C/wGDQgRRDQUgACANNwIADAYLIANBKGogAUEEaiACEMIDIAMtAChBBEYNBCADKQMoIg1C/wGDQgRRDQQgACANNwIADAULIANBKGogAUEEaiACEMYHIAMtAChBBEYNAyADKQMoIg1C/wGDQgRRDQMgACANNwIADAQLIANBKGogAiABKAIEEOcDAkAgAy0AKEEERg0AIAMpAygiDUL/AYNCBFENACAAIA03AgAMBAsgA0EANgIoIANBwABqIAIgA0EoahC6DAJAIAMtAEBBBEYNACADKQNAIg1C/wGDQgRRDQAgACANNwIADAQLIANBEGogARD3CyADKAIUIgFFDQIgA0EoaiACIAEQtBogAy0AKEEERg0CIAMpAygiDUL/AYNCBFENAiAAIA03AgAMAwsCQCABLQAkRQ0AIANBADYCKCADQRhqIAIgA0EoakHuoZsBQQcQuQwCQCADLQAYQQRGDQAgAykDGCINQv8Bg0IEUg0CCyADQShqIAIQ4g4gAy0AKEEERg0AIAMp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BGooAgAtAAAhCwJAIAMgBUcNACACQfABakGcyIUBEMENIAIoAvQBIQwLIAwgA2ogCzoAACACIANBAWoiBTYC+AEgAUEcaiIBIApHDQALIAIoAvABIg1BgICAgHhGDQUgBUEBdCIBQX9MDQIgAigC9AEhDEEAIQtBAC0AwPGdARogARCFASIBRQ0GIAJB9AFqIQcgAkEANgKwASACIAE2AqwBIAIgBTYCqAEgA0EBaiEJA0AgAUEBaiAMIAtqLQAAIgM6AAAgASADOgAAIAFBAmohASAJIAtBAWoiC0cNAAwECwtB5MaFARCbIAALQQAhDSACQQA2ArABIAJCgICAgBA3A6gBIAJB9AFqIQdBASEMQQAhBQwBC0Gc+poBENMZAAsgDSAMQQFBARDAESACKQOoASERIAJBqAFqQQhqIgEgBTYCACACIAVFOgC0ASACIBE3A6gBIAJBqAFqEOQEIAdBCGogASkDADcCACAHIAIpA6gBNwIAIAJBATYC8AEgACACQfABahCyCAwHCyAFIAxBAUEBEMARCyACQQA2AvgBIAJCgICAgMAANwLwASACQeQAaiACQfABahDdEyACQfABakEEciENIAJBqAFqQQRqIQQgByEMAkACQANAIAwoAgBBAkcNAgJAAkAgDCgCBEEBRw0AIAxBEGooAgAiAUEBdCEFIAxBDGooAgAhAwJAIAFFDQAgAyAFaiILQX5qRQ0AIAtBf2osAABBAEgNBQsgBUH+////A0sNAyABQQN0IglB/f///wdPDQMgAUH/////B3EhC0EAIQUCQAJAIAkNAEEEIQFBACEJDAELQQAtAMDxnQEaIAkQhQEiAUUNBiALIQkLIAJBADYC+AEgAiABNgL0ASACIAk2AvABAkAgC0UNAEEAIQUDQCABIAMtAAA2AgAgAUEEaiADQQFqLQAANgIAIAFBCGohASADQQJqIQMgCyAFQQFqIgVHDQALCyACIAIpA/ABNwPwASACIAU2AvgBIAIgBUU6APwBIAJB8AFqEPUEIAJBmAFqQQhqIgMgDUEIaigCADYCACACIA0pAgA3A5gBIAIoAvABIgFBgICAgHhGDQQgBCACKQOYATcCACAEQQhqIAMoAgA2AgAgAiABNgKoASACQeQAaiACQagBahCGCyABIAIoAqwBQQRBCBDAEQwBCyACQeQAaiAMQQhq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akEQaikCADcCACABQRhqIAJB8AFqQRhqKAIANgIAIAIgA0EBajYC6AEgAkHkAGogAkHgAWoQsgEgAigCZEEIRg0AIAAgAikCZDcCACAAQRhqIAJB5ABqQRhqKAIANgIAIABBEGogAkHkAGpBEGopAgA3AgAgAEEIaiACQeQAakEIaikCADcCAAwDCyACQQhqIgEgAkHkAGpBDGooAgAiAzYCACACIAIpAmg3AwAgACACKAIEIgUgBSADQRxsahDhBDYCGCAAQQc2AgAgAEEMaiABKAIANgIAIAAgAikDADcCBAwCCyACQQA2ArABIAJCgICAgBA3AqgBIAJB9AFqIAJBqAFqENwTIAJBATYC8AEgAkHwAWoQ2wchASAAQQI2AgAgACABNgIYIAAgAikC8AE3AgQgAEEMaiACQfgBaikCADcCACAAQRRqIAJBgAJqKAIANgIACyACEOkXCyACQZACaiQAC+oiAgp/AX4jAEGgAmsiAyQAIAEoAgwhBCADQeABaiACIAEoAggiBUEAEJUCAkACQCADLQDgAUEERg0AIAMpA+ABIg1C/wGDQgRRDQAgACANNwIADAELAkACQAJAAkAgBUUNACADQeABaiACIAUQtBogAy0A4AFBBEYNACADKQPgASINQv8Bg0IEUg0BCyADQZgBaiABEP0RIANB4AFqIAMoApgBIgUgAygCnAEiBkEAEMMIIAMoAuABDQIgBSAGQdXJmwFBChCbHEUNAiABKQMQQgBSDQEMAgsgACANNwIADAILIANBkAFqIAFBEGoiBRD+ESADKAKQASADKAKUAUHcABC1GkUNAAJAIAItAGBFDQAgA0GIAWogBRD+ESADKAKIASADKAKMAUHfyZsBQQYQsxMNAQsgA0GAAWogBRD+ESADQeABaiACQQBBACADKAKAASADKAKEARC/DQJAIAMtAOABQQRGDQAgAykD4AEiDUL/AYNCBFENACAAIA03AgAMAgsCQAJAIARFDQAgA0HgAWogAiAEELQaIAMtAOABQQRGDQAgAykD4AEiDUL/AYNCBFINAQsgAEEEOgAADAILIAAgDTcCAAwBCyACLQBiIQcCQCACLQBdDQAgASkDEEIAUQ0AIAFBEGohBQJAIAdB/wFxQQFLDQAgA0H4AGogBRD+ESADKAJ4IAMoAnxB5cmbAUEDELMTDQELAkAg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IANBOGogA0G0AWpBCGoiBhCVCCADIAMoAjw2ArgBIAMgAygCOCIENgK0AQJAAkACQCAEQQFxRQ0AIANB1AFqIAEgBRCzDCADQeABakEYaiADQbQBakEYaikCADcDACADQeABakEQaiADQbQBakEQaikCADcDACADQeABakEIaiIKIAYpAgA3AwAgAyADKQK0ATcD4AEgA0EANgKAAgNAIAMoAuABIQEgA0ECNgLgAQJAAkAgAUECRg0AIAMoAuQBIQUMAQsgA0EwaiAKEJUIIAMoAjQhBSADKAIwIQELAkAgAUEBcUUNACADIAMoAoACQQFqIgE2AoACIANBGGogA0HUAWoQ4RcCQCABIAVqIgFFDQACQCABIAMoAhwiBUkNACABIAVGDQEMBgsgAygCGCABaiwAAEG/f0wNBQsgAy0A3wEhBSADKALYASEGIANB1AFqQQEQgwcgA0EQaiADQdQBahCWFSADKAIQIAFqIQQCQCAGIAVBwABqQf8BcSIJQQwgCUEMSRsgBUH+AUYbIgUgAWsiAUUNACAEQQFqIAQgAfwKAAALIARB3AA6AAAgBUEBaiEBAkAgAy0A3wFB/gFGDQAgAUELSw0CIAMgAUHAAXI6AN8BDAILIAMgATYC2AEMAQsLIANBiAJqQQhqIANB1AFqQQhqKAIANgIAIAMgAykC1AE3A4gCDAELIANB/wE6AJMCIAMgBTYCjAIgAyABNgKIAgsgA0EoaiADQYgCahDBEyADQbQBaiADKAIoIAMoAixB6MmbAUEEQezJmwFBBxDECyADQdQBaiADKAK4ASIJIAMoArwBQfPJmwFBA0H2yZsBQQYQxAsCQAJAAkACQCADKALUASIFQf7//wdLDQAgBQ0BQQAhAUGAgICAfCEKIAMoAtgBIQRBACEGDAILIAMoAtgBIQQgA0HgAWogAygC3AEiARC4DSADKALgASEKIAMoAuQBIQYgAUUNASAGIAQgAfwKAAAMAQsgAygC2AEhBAJAIAMoAtwBIgFBDE0NACAFQf///wcgBUH///8HSRtBgICAcHIhCiAEIQYMAgsgA0EANgDnASADQgA3A+ABIAMgAUHAAXI6AOsBAkAgAUUNACADQeABaiAEIAH8CgAACyADKALoASEKIAMoAuQBIQEgAygC4AEhBgsgBSAEEJASCyADQaQBahCmHSADIAo2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BkEBcQ0AIBEhDCATIQ4gEiENDAcLIAAgETYCDCAAIBM2AgggACASNgIEIABBATYCAAwSCyAIIBFB9O6DARCzEQALIAcgD0GMnYABELMRAAsgESASQZTvgwEQsxEAC0EAQQBBpO+DARCzEQALIBEgEkGE74MBELMRAAsgA0EANgIYIANBATYCDCADQcTmgwE2AgggA0IENwIQIANBCGpBzOaDARCFGwALIAUgAkEBaiICRg0KDAALCyAAIAw2AgwgACAENgIIIAAgDTYCBCAAQQE2AgAMCQsgA0EANgIYIANBATYCDCADQcTmgwE2AgggA0IENwIQIANBCGpBzOaDARCFGwALIAwgB0GE74MBELMRAAtBAEEAQaTvgwEQsxEACyAHIAtBlO+DARCzEQALIABBADYCAAwECwJAAkAgBkEBcQ0AAkAgASgC0AIiCA0AQQEQxxwhASAAQQI2AgAgACABNgIEDAYLAkACQAJAAkACQAJAIAggASgCzAIiBk0NAEEAIRIMAQsgCCABKAI8dkF+aiIHIAEoAhQiC08NBCABKAIQIAdBDGxqIgcoAghFDQMgBygCBCgCACIRIAEoAiAiB08NAiAEIAEoAhwgEUECdGooAgAiB0kNASAEIAdrIQxBASESCwJAIAQgBUkNACAEIQkMBgsgAigCDCINIAQgDSAESxshByABQcAAaiELIAIoAgghECAEIQkDQAJAAkACQAJAAkACQCAHIARGDQACQCAIIAsgECAEai0AAGotAABqIgIgASgCCCIITw0AIAEoAgQgAkECdGooAgAiCCABKALIAksNBiAIRQ0NIAggBksNBiAIIAEoAjx2QX5qIgIgASgCFCIRTw0CIAEoAhAgAkEMbGoiAigCCEUNAyACKAIEKAIAIhEgASgCICICTw0EIAEoAhwgEUECdGooAgAiAiAEQQFqIglLDQVBASESIAQgAmtBAWohDAwGCyACIAhB9O6DARCzEQALIAcgDUGMnYABELMRAAsgAiARQZTvgwEQsxEAC0EAQQBBpO+DARCzEQALIBEgAkGE74MBELMRAAsgA0EANgIYIANBATYCDCADQcTmgwE2AgggA0IENwIQIANBCGpBzOaDARCFGwALIAUgBEEBaiIERg0GDAALCyADQQA2AhggA0EBNgIMIANBxOaDATYCCCADQgQ3AhAgA0EIakHM5oMBEIUbAAsgESAHQYTvgwEQsxEAC0EAQQBBpO+DARCzEQALIAcgC0GU74MBELMRAAsCQCABKALQAiIIDQBBARDHHCEBIABBAjYCACAAIAE2AgQMBQsCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAIIAEoAswCIhFNDQACQCAEIAVPDQAgAigCDCIGIAQgBiAESxshByABQcAAaiELIAIoAgghEANAIAcgBEYNCiAIIAsgECAEai0AAGotAABqIgIgASgCCCIITw0JAkAgASgCBCACQQJ0aigCACIIIAEoAsgCSw0AIAhFDQQgCCARTQ0FCyAFIARBAWoiBEcNAAsLIABBADYCAAwRCyAIIAEoAjx2QX5qIgIgASgCFCIITw0CIAEoAhAgAkEMbGoiAigCCEUNAyACKAIEKAIAIgIgASgCICIITw0EIAQgASgCHCACQQJ0aigCACIBSQ0FIAAgAjYCDCAAIAQ2AgggAEEBNgIAIAAgBCABazYCBAwQCyAAQQA2AgAMDwsgCCABKAI8dkF+aiICIAEoAhQiCE8NBiABKAIQIAJBDGxqIgIoAghFDQcgAigCBCgCACICIAEoAiAiCE8NCCAEQQFqIgggASgCHCACQQJ0aigCACIBSQ0JIAAgAjYCDCAAIAg2AgggAEEBNgIAIAAgCCABazYCBAwOCyACIAhBlO+DARCzEQALQQBBAEGk74MBELMRAAsgAiAIQYTvgwEQsxEACyADQQA2AhggA0EBNgIMIANBxOaDATYCCCADQgQ3AhAgA0EIakHM5oMBEIUbAAsgAiAIQfTugwEQsxEACyAHIAZBjJ2AARCzEQALIAIgCEGU74MBELMRAAtBAEEAQaTvgwEQsxEACyACIAhBhO+DARCzEQALIANBADYCGCADQQE2AgwgA0HE5oMBNgIIIANCBDcCECADQQhqQczmgwEQhRsACyAAIBE2AgwgACAJNgIIIAAgDDYCBCAAIBI2AgAMAwsCQCABKALQAiIIDQBBARDHHCEBIABBAjYCACAAIAE2AgQMAwsCQAJAAkACQAJAAkACQCAIIAEoAswCSw0AIAggASgCPHZBfmoiAiABKAIUIghPDQQgASgCECACQQxsaiICKAIIRQ0DIAIoAgQoAgAiAiABKAIgIghPDQIgBCABKAIcIAJBAnRqKAIAIgFJDQEgACACNgIMIAAgBDYCCCAAQQE2AgAgACAEIAFrNgIEDAkLIANBCGogByABKAIsIhAoAghBf2pBeHFqQQhqIAIoAggiCyACKAIMIgcgBCAFIBAoAhAREwACQCADKAIIIgIOAwYFAAYLAkAgAygCDCICIAVPDQAgAUHAAGohEANAAkACQAJAAkACQAJAIAIgB08NAAJAIAggECALIAJqLQAAai0AAGoiCCABKAIIIgRPDQAgASgCBCAIQQJ0aigCACIIIAEoAsgCSw0FAkACQAJAIAhFDQAgCCABKALMAksNASAIIAEoAjx2QX5qIgggASgCFCIETw0FIAEoAhAgCEEMbGoiCCgCCEUNBiAIKAIEKAIAIgggASgCICIETw0HIAJBAWoiAiABKAIcIAhBAnRqKAIAIgFPDQIgA0EANgIYIANBATYCDCADQcTmgwE2AgggA0IENwIQIANBCGpBzOaDARCFGwALIABBADYCAAwTCyADQQhqIAEoAiggASgCLCIEKAIIQX9qQXhxakEIaiALIAcgAiAFIAQoAhAREwACQCADKAIIRQ0AIAMoAgwiBCACTQ0HDAgLIABBADYCAAwSCyAAIAg2AgwgACACNgIIIABBATYCACAAIAIgAWs2AgQMEQsgCCAEQfTugwEQsxEACyACIAdBjJ2AARCzEQALIAggBEGU74MBELMRAAtBAEEAQaTvgwEQsxEACyAIIARBhO+DARCzEQALIAJBAWohBAsgBCECIAQgBUkNAAsLIABBADYCAAwICyADQQA2AhggA0EBNgIMIANBxOaDATYCCCADQgQ3AhAgA0EIakHM5oMBEIUbAAsgAiAIQYTvgwEQsxEAC0EAQQBBpO+DARCzEQALIAIgCEGU74MBELMRAAsgACADKQIMNwIEIABBDGogA0EIakEMaigCADYCAAsgACACNgIADAILAkACQAJAAkACQAJAIAggASgCzAJNDQBBACEJDAELIAggASgCPHZBfmoiCyABKAIUIhBPDQQgASgCECALQQxsaiILKAIIRQ0DIAsoAgQoAgAiBiABKAIgIgtPDQIgBCABKAIcIAZBAnRqKAIAIgtJDQEgBCALayESQQEhCQsgA0EIaiAHIAEoAiwiECgCCEF/akF4cWpBCGogAigCCCILIAIoAgwiByAEIAUgECgCEBETAAJAAkACQAJAIAMo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QQJGDQAgA0Gw650BNgJkIANBsOudATYCVCADIANB7wZqNgKAASADIANB1ABqNgJ8IAMgA0HkAGo2AnhBwOudASADQfgAakHk4ZsBEJEGCyADKAI0IQUgAygCMCEGQQAoArTrnQEhBAJAAkACQEEAEPYOKAIAIgcgBCgC+AUiC0YNAAJAAkACQAJAIAsNACAEIAQoAvgFIgtBASALGzYC+AUgC0UNAQsgBEGEBmooAgAiC0UNASAEQYAGaigCACALIAcgC3BBmJubARCVHCILLQAAIQcgC0EBOgAAIAdFDQIgA0H4AGogBCgC8AUgBCgC9AUoAhQRBwBB8AVBCBD7HiEHAkBB8AVFDQAgByADQfgAakHwBfwKAAALQQEhC0EAIQgMBQsgA0H4AGogBCgC8AUgBCgC9AUoAhQRBwAgBBD6HgJAQfAFRQ0AIAQgA0H4AGpB8AX8CgAAC0EAIQtBASEIDAQLQYibmwEQzxkACwJAIAsoAgwiB0UNACALIAdBf2oiBzYCDCALKAIIIAdBAnRqKAIAIQdBACEIIAtBADoAAAwCC0EAIQggC0EAOgAAIANB+ABqIAQoAvAFIAQoAvQFKAIUEQcAQfAFQQgQ+x4hB0HwBUUNASAHIANB+ABqQfAF/AoAAAwBC0EBIQggBEEBNgL4BQtBACELCyADQYcBaiADQdQAakECai0AADoAACADQasBaiADQeQAakECai0AADoAACADQcABaiADQThqQQhqKQIANwIAIANByAFqIANBOGpBEGopAgA3AgAgA0HQAWogA0E4akEYaigCADYCACADIAs6AIQBIAMgBDYCgAEgAyAHNgJ8IAMgCDYCeCADIAMvAFQ7AIUBIAMgAy8AZDsAqQEgAyADKQI4NwK4ASADQQA2AtwBIANCADcC1AEgAyAFNgK0ASADIAY2ArABIANBsOudATYCrAEgA0EAOgCoASADIAU2AqQBIANBADYCoAEgAyAFNgKcASADIAY2ApgBIANBADYCkAEgA0EANgKIASADQfgAakEYaiEPIANB+ABqQRBqIRAgA0G4AWohEUEAIRJBACEEAkACQANAIANBOGogERCwCgJAAkAgAygCOEEBRw0AAkACQCADKAJ4QQFHDQAgAygCgAEhCAwBCyADKAJ8IQgLIAMoAjwhByADKAKsASITKAIAIgsoAhAhBQJA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AgBBGkcNASACIAEoAgAgASgCBCADQQhqIgYQtQwgAigCAEEyRg0DIAMQyQEgA0E4aiACQThqKQMANwMAIANBMGogAkEwaikDADcDACADQShqIAJBKGopAwA3AwAgA0EgaiACQSBqKQMANwMAIANBGGogAkEYaikDADcDACADQRBqIAJBEGopAwA3AwAgBiACQQhqKQMANwMAIAMgAikDADcDAAwDCyADQQRGDQICQAJAAkAgAw4EBQABBAULIAQoAgRBAUcNBCAEKAIIIgMoAgBBGkcNASACQYABaiABKAIAIAEoAgQgA0EIaiIGELUMIAIoAoABQTJGDQQgAxDJASADQThqIAJBgAFqQThqKQMANwMAIANBMGogAkGAAWpBMGopAwA3AwAgA0EoaiACQYABakEoaikDADcDACADQSBqIAJBgAFqQSBqKQMANwMAIANBGGogAkGAAWpBGGopAwA3AwAgA0EQaiACQYABakEQaikDADcDACAGIAJBgAFqQQhqKQMANwMAIAMgAikDgAE3AwAMBAsCQCAEKAIEIgctAGxBAkcNACAHQcAAaiEDA0AgAygCGCIDLQAsQQJGDQALCwJAIAcoAoQBIgZFDQAgBygCgAEhAyAGQdgAbCEGA0ACQAJAAkACQCADKAIAQXxqDgIDAAELIANBBGooAgAiCCgCAEEaRw0BIAJBgAFqIAEoAgAgASgCBCAIQQhqIgkQtQwgAigCgAFBMkYNAiAIEMkBIAhBOGogAkGAAWpBOGopAwA3AwAgCEEwaiACQYABakEwaikDADcDACAIQShqIAJBgAFqQShqKQMANwMAIAhBIGogAkGAAWpBIGopAwA3AwAgCEEYaiACQYABakEYaikDADcDACAIQRBqIAJBgAFqQRBqKQMANwMAIAkgAkGAAWpBCGopAwA3AwAgCCACKQOAATcDAAwCCyADIAEQ/gEMAQsgCCABEEYLIANB2ABqIQMgBkGof2oiBg0ACwsCQCAHQZgBaigCACIDRQ0AIAdBlAFqKAIAIgkgA0EobGohCgNAAkACQAJAAkACQAJAAkAgCSgCAA4FBgABAgUGCyAJKAIEQQFHDQUgCSgCCCIDKAIAQRpHDQMgAkGAAWogASgCACABKAIEIANBCGoiBhC1DCACKAKAAUEyRg0FIAMQyQEgA0E4aiACQYABakE4aikDADcDACADQTBqIAJBgAFqQTBqKQMANwMAIANBKGogAkGAAWpBKGopAwA3AwAgA0EgaiACQYABakEgaikDADcDACADQRhqIAJBgAFqQRhqKQMANwMAIANBEGogAkGAAWpBEGopAwA3AwAgBiACQYABakEIaikDADcDACADIAIpA4ABNwMADAULIAkoAgQiAygCAEEaRw0BIAJBgAFqIAEoAgAgASgCBCADQQhqIgYQtQwgAigCgAFBMkYNBCADEMkBIANBOGogAkGAAWpBOGopAwA3AwAgA0EwaiACQYABakEwaikDADcDACADQShqIAJBgAFqQShqKQMANwMAIANBIGogAkGAAWpBIGopAwA3AwAgA0EYaiACQYABakEYaikDADcDACADQRBqIAJBgAFqQRBqKQMANwMAIAYgAkGAAWpBCGopAwA3AwAgAyACKQOAATcDAAwECwJAIAkoAgQiCy0AbEECRw0AIAtBwABqIQMDQCADKAIYIgMtACxBAkYNAAsLAkAgC0GEAWooAgAiBkUNACALQYABaigCACEDIAZB2ABsIQYDQAJAAkACQCADKAIAQQVHDQAgA0EEaigCACIIKAIAQRpHDQEgAkGAAWogASgCACABKAIEIAhBCGoiDBC1DCACKAKAAUEyRg0CIAgQyQEgCEE4aiACQYABakE4aikDADcDACAIQTBqIAJBgAFqQTBqKQMANwMAIAhBKGogAkGAAWpBKGopAwA3AwAgCEEgaiACQYABakEgaikDADcDACAIQRhqIAJBgAFqQRhqKQMANwMAIAhBEGogAkGAAWpBEGopAwA3AwAgDCACQYABakEIaikDADcDACAIIAIpA4ABNwMADAILIAMgARCnCAwBCyAIIAEQRgsgA0HYAGohAyAGQah/aiIGDQALCwJAIAtBmAFqKAIAIgZFDQAgC0GUAWooAgAhAyAGQShsIQYDQCABIAMQuwIgA0EoaiEDIAZBWGoiBg0ACwsgCy0APCIDQQZGDQMgA0ECRw0DIAtBEGohAwNAIAMoAhgiAy0ALEECRg0ADAQLCyADIAEQRgwCCyADIAEQRgwBCyAJKAIMIQYgCSgCCCEDIAIgATYCgAEgBkUNACAGQShsIQYDQCACQYABaiADELwDIANBKGohAyAGQVhqIgYNAAsLIAlBKGoiCSAKRw0ACwsgBy0APCIDQQZGDQMgA0ECRw0DIAdBEGohAwNAIAMoAhgiAy0ALEECRg0ADAQLCyADIAEQRgwCCyADIAEQRgwBCyAEKAIMIQYgBCgCCCEDIAIgATYCgAEgBkUNACAGQShsIQYDQCACQYABaiADELwDIANBKGohAyAGQVhqIgYNAAsLIARB2ABqIgQgBUcNAAsLAkAgACgCmAEiA0UNACAAKAKUASIJIANBKGxqIQsDQAJAAkACQAJAAkACQAJAIAkoAgAOBQYAAQIFBgsgCSgCBEEBRw0FIAkoAggiAygCAEEaRw0DIAJBgAFqIAEoAgAgASgCBCADQQhqIgYQtQwgAigCgAFBMkYNBSADEMkBIANBOGogAkGAAWpBOGopAwA3AwAgA0EwaiACQYABakEwaikDADcDACADQShqIAJBgAFqQShqKQMANwMAIANBIGogAkGAAWpBIGopAwA3AwAgA0EYaiACQYABakEYaikDADcDACADQRBqIAJBgAFqQRBqKQMANwMAIAYgAkGAAWpBCGopAwA3AwAgAyACKQOAATcDAAwFCyAJKAIEIgMoAgBBGkcNASACQYABaiABKAIAIAEoAgQgA0EIaiIGELUMIAIoAoABQTJGDQQgAxDJASADQThqIAJBgAFqQThqKQMANwMAIANBMGogAkGAAWpBMGopAwA3AwAgA0EoaiACQYABakEoaikDADcDACADQSBqIAJBgAFqQSBqKQMANwMAIANBGGogAkGAAWpBGGopAwA3AwAgA0EQaiACQYABakEQaikDADcDACAGIAJBgAFqQQhqKQMANwMAIAMgAikDgAE3AwAMBAsCQCAJKAIEIgwtAGxBAkcNACAMQcAAaiEDA0AgAygCGCIDLQAsQQJGDQALCyAMQZABaiEKAkAgDEGEAWooAgAiBkUNACAMQYABaigCACEDIAZB2ABsIQYDQAJAAkACQCADKAIAQQVHDQAgA0EEaigCACIIKAIAQRpHDQEgAkGAAWogASgCACABKAIEIAhBCGoiBBC1DCACKAKAAUEyRg0CIAgQyQEgCEE4aiACQYABakE4aikDADcDACAIQTBqIAJBgAFqQTBqKQMANwMAIAhBKGogAkGAAWpBKGopAwA3AwAgCEEgaiACQYABakEgaikDADcDACAIQRhqIAJBgAFqQRhqKQMANwMAIAhBEGogAkGAAWpB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RQ0BIAEtAAANASAFIAEQlQEMAQsgBUEEaigCACABEPMICyAHIANBOGoiA0cNAAwFCwsgAygCBCABEPMIIAEtAAANAyADKAIIIAEQlQEMAwsgAS0AAA0CIAMoAgQgARCVAQwCCyADKAIwIgNFDQEgAS0AAA0BIAMgARCVAQwBCwJAAkACQAJAAkAgAygCBCIDKAIADgcFAAECAwUEBQsgA0EMaigCACIFRQ0EIANBCGooAgAhAyAFQShsIQUDQAJAIAMoAgBBB0YNACADIAEQ8wgLIANBKGohAyAFQVhqIgUNAAwFCwsgAygCBCABEPMIDAMLIANBDGooAgAiBUUNAiADQQhqKAIAIQYgBUE4bCEHQQAhAwNAAkACQAJAAkAgBiADaiIFKAIADgMAAQIACwJAIAVBCGooAgBBA0cNACABLQAADQAgBUEMaigCACABEJUBCyAFQShqKAIAIAEQ8wgMAgsgBUEwaigCACIFRQ0BIAEtAAANASAFIAEQlQEMAQsgBUEEaigCACABEPMICyAHIANBOGoiA0cNAAwDCwsgAygCBCABEPMIIAEtAAANASADKAIIIAEQlQEMAQsgAS0AAA0AIAMoAgQgARCVAQsgAiAERw0ADAILCwJAAkACQAJAAkACQAJAAkACQAJAIAIOCwoAAQIDBAUGBwgKCgsCQCABLQAADQAgACgCKCABEJUBCyAAKAIIQQJHDQkgAS0AAA0JIABBDGohAwwICyAAKAIIQQFHDQggAS0AAA0IIABBDGohAwwHCyABLQAADQcgAEEEaiEDDAYLAkAgACgCBCIDKAIAIgJBA0cNAAJAIAEtAAANACADKAIQIAEQlQELIANBDGooAgAiAkUNByABLQAADQcgAkEEdCECIANBCGooAgBBDGohAwNAAkAgAS0AAA0AIAMoAgAgARCVAQsgA0EQaiEDIAJBcGoiAg0ADAgLCwJAIAEtAAANACADKAIgIAEQlQELIAJBAkcNBiABLQAADQYgA0EEaiEDDAULIAEtAAANBSAAQQRqIQMMBAsgAS0AAA0EIABBBGohAwwDCyABLQAADQMgAEEEaiEDDAILIAEtAAANAiAAQQRqIQMMAQsgAS0AAA0BIABBBGohAwsgAygCACABEJUBCyABLQAADRggACgCOCEADBYLAkAgAS0AAA0AIAAoAiggARCVAQsg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IAFBABCeASADKAJEIQogAygCQCIEQQdGDQQgA0HoAWpBGGoiDSAHQRhqKQMANwMAIANB6AFqQRBqIg4gB0EQaikDADcDACADQegBakEIaiIPIAdBCGopAwA3AwAgAyAHKQMANwPoASABKAK8ASEIQQhBKBDrHyIFDQEMCwsgA0HAAGogARDVByADKAJEIQogAygCQCIMQQdGDQMgA0H4AGpBGGoiDSAHQRhqKQMANwMAIANB+ABqQRBqIg4gB0EQaikDADcDACADQfgAakEIaiIPIAdBCGopAwA3AwAgAyAHKQMANwN4AkAgAiADKAKoAUcNACADQagBakGwtJsBELUWCyADKAKsASIEIAJBKGxqIgUgCjYCBCAFIAw2AgAgBSADKQN4NwMIIAVBEGogDykDADcDACAFQRhqIA4pAwA3AwAgBUEgaiANKQMANwMADAELIAUgCjYCBCAFIAQ2AgAgBSADKQPoATcDCCAFQRBqIA8pAwA3AwAgBUEYaiAOKQMANwMAIAVBIGogDSkDADcDAAJAIAIgAygCqAFHDQAgA0GoAWpBwLSbARC1FgsgAygCrAEiBCACQShsaiIKQQA2AhggCiAMNgIUIAogCTYCECAKIAg2AgwgCiAJNgIIIAogBTYCBCAKQQI2AgALIAMgAkEBaiICNgKwAQJAAkAgAS0AyAEiBUF7ag4DAgEAAQsgARCHDiALQRxHDQEgAS0AyAFB/wFxQQVHDQEgASgCvAEhBSABKAK4ASEKIANBuoCAgHg2AkAgASAKIAUgA0HAAGoQrxoMAQsLIAEoAsQBIQIgASgCwAEhBCADQcgBaiAFEN4bIANBATYCRCADQZjvmwE2AkAgA0IBNwJMIANBigWtQiCGQbynmwGthDcDMCADIANBMGo2AkggA0GQAmogA0HAAGoQjRUgA0GkAmogA0HQAWooAgA2AgAgAyADKQLIATcCnAIgBCACIANBkAJqEIUVIQogAS0AyAFBogFHDQAgARDHESECIAEQhw4gASACEOURCyAAQQc2AgAgACAKNgIEIANBqAFqENYdDAULIANBEGogASACEN0FAkACQCADLQAkQQJGDQAgA0HcAGogA0EoaikDADcCACADQdQAaiADQSBqKQMANwIAIANBzABqIANBGGopAwA3AgAgAyADKQMQNwJEAkBBJEUNACAAQQRqIANBwABqQST8CgAAC0EAIQEMAQsgACADKAIQNgIEQQchAQsgACABNgIADAQLIARBogFGDQELIANBwABqQQRyIAQQ3hsgA0EcNgJUIANB0LWbATYCUCADQbCAgIB4NgJAIAEoAsABIAEoAsQBIANBwABqEIUVIQICQCABLQDIAUGiAUcNACABEMcRIQUgARCHDiABIAUQ5RELIABBBzYCACAAIAI2AgQMAgsgARDHESECIAEQhw4gAEEHNgIAIAAgAjYCBAwBCyABIAEoAngiEEH//3txNgJ4IAEoAsABIREgARCHDiADQQhqQQhBCEE4QZDCmwEQ2BQgA0EANgI4IAMgAygCDCILNgI0IAMgAygCCDYCMCADQegBakEIaiECIANB6AFqQQRqIQwgA0HAAGpBEGohEiADQegBakEEciETIANByAFqQQhqIQYgA0HAAGpBCGohFCADQcAAakEEciEVIAEtAMgBIQVBACEKQQAhFgJAAkADQCAKQThsIQcCQANAAkAgBUH/AXEiBUEDRw0AIAEQhw4gASgCvAEhBiADQcAAakEIaiADQTBqQQhqKAIAIgQ2AgAgAyADKQIwNwNAIAMgFjYCWCADIAY2AlQgAyARNgJQIAMgATYCTCAEQX9qIQUgAygCRCICIARBOGxqIQcgAyAYNwJcIBhCIIinIQggGKchCyAWQQFxIQkCQANAAkACQAJAIAIgB0YiBA0AIAIoAgAhCiAFRQ0BIApBAkcNAiACKAIMIQogAigCCCEMIANBu4CAgHg2AugBIAEgDCAKIANB6AFqEK8aDAILAkACQAJAIAEtAIEBQQRxDQBBACECIAEtAHlBwABxRQ0CIAEtAMgBQf8BcUEKRg0BDAILQQAhAiABLQDIAUEKRw0BCyABEIcOQQEhAgsgACADKQIwNwIEIAAgAjoAHCAAQQA2AhggACAGNgIUIAAgETYCECAAQQM2AgAgAEEMaiADQThqKAIANgIADAkLIApBAkcNACACKAIEKAIADQIgCUUNACADQbqAgIB4NgLoASABIAsgCCADQegBahCvGgsgAkEAQTggBBtqIQIgBUF/aiEFDAALCyACKAIIIQUgAigCDCECIANB7oCAgHg2AugBIAUgAiADQegBahCFFSECAkAgAS0AyAFBogFHDQAgARDHESEFIAEQhw4gASAFEOURCyAA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KAIIIQULIAJBADYCKCACQgA3AyAgAiAFNgIYIAIgDTcDECACIAMgAEEEdGo2AgwgAiAENgIIIAIgAzYCBCACIAM2AgAgAUHAAGogAhCfBgwLCwJAIA1CA4NCAFINACANpyIAIAAoAgAiAEEBajYCACAAQX9MDQkLIAIgAUHAAGogDCADIA0gASgCCBCbBQsgAikDAFANCSACKQMIIg1QDQkgDUIDg0IAUg0JIA2nIgMgAygCACIAQX9qNgIAIABBAUcNCSADIAMoAhAQwRsMCQsgACgCDCIDKAIADQggAiADKQMIIANBGGooAgAQuhggAigCCCEDIAIpAwAhDAJAAkAgASkDACINQgBSDQAgAiABQcAAaiAMIANCACADEJsFDAELAkAgDUIDg0IAUg0AIA2nIgAgACgCACIAQQFqNgIAIABBf0wNCAsgAiABQcAAaiAMIAMgDSABKAIIEJsFCyACKQMAUA0IIAIpAwgiDVANCCANQgODQgBSDQggDaciAyADKAIAIgBBf2o2AgAgAEEBRw0IIAMgAygCEBDBGwwICyAALQAgDQcgACgCGA0HAkAgACgCDCIERQ0AIAAoAgghAyAEQdAAbCEEIAFBwABqIQYDQEEIIQVBGCEHAkACQAJAAkAgAykDACIMQn58Ig1CAiANQgJUG6cOAwACAQALIANBCGooAgANAkEgIQdBECEFDAELIANByABqLQAADQECQAJAAkACQAJAIAEtAKABDQAgDKdBAXENAyACIANBCGoiBSkDACADQRhqIgcoAgAQuhggAigCCCEIIAIpAwAhDCABKQMAIg1CAFINASACIAYgDCAIQgAgAxCbBQwCCwJAIAynQQFxDQAgASADQQhqKQMAIANBGGooAgAQ1QwLIANBIGopAwAiDUICUQ0FIA2nQQFxDQUMAwsCQCANQgODQgBSDQAgDaciCSAJKAIAIglBAWo2AgAgCUF/TA0NCyACIAYgDCAIIA0gASgCCBCbBQsCQCACKQMAUA0AIAIpAwgiDVANACANQgODQgBSDQAgDaciCCAIKAIAIglBf2o2AgAgCUEBRw0AIAggCCgCEBDBGwsgASAFKQMAIAcoAgAQ1QwLIANBIGopAwAiDUICUQ0CIA2nQQFxDQILQTghB0EoIQULIAEgAyAFaikDACADIAdqKAIAENUMCyADQdAAaiEDIARBsH9qIgQNAAsLIAAoAhwiA0UNByADQQhqKAIAIgBFDQcgA0EEaigCACEDIABBDGwhAANAAkACQCADKAIAIgQNACADQQRqKAIAIAEQsQUMAQsgBCABEKgBCyADQQxqIQMgAEF0aiIADQAMCAsLIAEgACkDECAAKAIgENUMDAYLIAAoAgQgARCoAQwFCyAAKAIEIQQCQCABKAKcASIDRQ0AIAEoApgBIQAgAiAEKQMoIARBOGooAgAQuhggAigCCCEFIAIpAwAhDSAELQBBIQcgBC0AQCEIIAQoAiQhBiAEKAIgIQkCQCAAIANBLGxqIgNBXGoiCigCACIAIANBVGoiCygCAEcNACALEIcXCyADQVhqKAIAIABBBXRqIgMgBzoAGSADIAg6ABggAyAGNgIUIAMgCTYCECADIAU2AgggAyANNwMAIAogAEEBajYCAAsCQCABLQCgAQ0AIAQtAEBFDQAgAiAEKQMoIARBOGooAgAQuhggAigCCCEDIAIpAwAhDAJAAkAgASkDACINQgBSDQAgAiABQcAAaiAMIANCACADEJsFDAELAkAgDUIDg0IAUg0AIA2nIgAgACgCACIAQQFqNgIAIABBf0wNBQsgAiABQcAAaiAMIAMgDSABKAIIEJsFCyACKQMAUA0AIAIpAwgiDVANACANQgODQgBSDQAgDaciAyADKAIAIgBBf2o2AgAgAEEBRw0AIAMgAygCEBDBGwsgBC0AQQ0EIAQpAwBCAFINBCAEQQhqIQMCQCAELQAcQQJHDQADQCADKAIAIgBBGGohAyAALQAsQQJGDQALCwJAIAEoApwBIgBFDQAgASgCmAEgAEEsbGohAAJAIAQtAEANACACIAQpAyggBEE4aigCABC6GCACKAIIIQUgAikDACENIAIgAykDACADQRBqKAIAELoYIAIgAEFwaiANIAUgAikDACACKAIIEJ8FIAIpAwAiDVANASANQgODQgBSDQEgDaciACAAKAIAIgVBf2o2AgAgBUEBRw0BIAAgACgCEBDBGwwBCyACIAMpAwAgA0EQaigCABC6GCAAQWBqIgAgAikDACACKAIIEOcFGiACIAQpAyggBEE4aigCABC6GCAAIAIpAwAgAigCCBDnBRoLAkAgBC0AQA0AIAIgBCkDKCAEQThqKAIAELoYIAIoAgghACACKQMAIQ0gAiADKQMAIANBEGooAgAQuhggAiABQYABaiANIAAgAikDACACKAIIEJ8FIAIpAwAiDVANBSANQgODQgBSDQUgDaciAyADKAIAIgBBf2o2AgAgAEEBRw0FIAMgAygCEBDBGwwFCyABIAMpAwAgA0EQaigCABDVDCABIAQpAyggBEE4aigCABDVDAwECyAAKAIQIgNFDQMgA0EIaigCACIARQ0DIANBBGooAgAhAyAAQQxsIQADQAJAAkAgAygCACIEDQAgA0EEaigCACABELEFDAELIAQgARCoAQsgA0EMaiEDIABBdGoiAA0ADAQLCyAAKAIEIgMgARCoASABLQCgAQ0CIAMoAgBBGkcNAiACIAMpAwggA0EYaigCABC6GCACKAIIIQMgAikDACEMAkACQCABKQMAIg1CAFINACACIAFBwABqIAwgA0IAIAMQmwUMAQsCQCANQgODQgBSDQAgDaciACAAKAIAIgBBAWo2AgAgAEF/TA0CCyACIAFBwABqIAwgAyANIAEoAggQmwULIAIpAwBQDQIgAikDCCINUA0CIA1CA4NCAFINAiANpyIDIAMoAgAiAEF/ajYCACAAQQFHDQIgAyADKAIQEMEbDAILAAsCQAJAIAAoAggOAwABAgALAkAgACgCKCIEQQhqKAIAIgBFDQAgBEEEaigCACEDIABBDGwhAANAIAMoAgAgARCoASADQQxqIQMgAEF0aiIADQALCwJAIARBFGooAgAiAEUNACAEQRBqKAIAIQMgAEHYAGwhAANAIAMgARDxAiADQdgAaiEDIABBqH9qIgANAAsLIAQoAjAiA0UNASADIAEQqAEMAQsCQCAAKAIoIgZBCGooAgAiA0UNACAGQQRqKAIAIgQgA0EGdGohCANAAkAgBEE4aigCACIARQ0AIARBNGooAgAhAyAAQQxsIQADQCADKAIAIAEQqAEgA0EMaiEDIABBdGoiAA0ACwsCQAJAAkACQAJAAkAgBCgCAA4HBQABAgMFBAULIARBDGooAgAiAEUNBCAEQQhqKAIAIQMgAEEobCEAA0ACQCADKAIAQQdGDQAgAyABEKwJCyADQShqIQMgAEFYaiIADQAMBQsLIAQoAgQgARCsCQwDCyAEQQxqKAIAIgNFDQIgBEEIaigCACEFIANBOGwhB0EAIQMDQAJAAkACQAJAIAUgA2oiACgCAA4D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IAIgCkEBajYCHCADQShqIAAgBxCbGSADIAMpAyg3AjggA0EgaiADQThqIAoQmAwgAygCIEEBcUUNDCADKAIkIgcgACgCOCIITw0NIAQgACgCNCAHQQJ0aigCACIASQ0OIAIgBzYCDCACIAQ2AgggAkEBNgIAIAIgBCAAazYCBAwYCyAHIAAoAggiCE8NDgJAAkAgACgCBCAHQRRsaigCCCIIRQ0AIAIoAhwhCiAAKAIoIQsgACgCLCEJQQAhDANAIAggCU8NEiAMQQFqIQwgCyAIQQN0aigCBCIIDQALIAogDEkNAQsgAkEANgIYIAJBADYCACACIAIoAiBBAWoiBDYCIAwVCyACQQE2AhggAiAKQQFqNgIcIAIoAiAhCCADQRhqIAAgBxCbGSADIAMpAxg3AjggA0EQaiADQThqIAoQmAwgAygCEEEBcUUNECADKAIUIgcgACgCOCIBTw0RIAhBAWoiCCAAKAI0IAdBAnRqKAIAIgBJDRIgAiAHNgIMIAIgCDYCCCACQQE2AgAgAiAIIABrNgIEDBcLIAcgCEGMroABELMRAAsgCCALQZzjgwEQsxEACyAJIAtBnOODARCzEQALIAcgCEHo8oMBELMRAAsgA0EANgJIIANBATYCPCADQcTmgwE2AjggA0IENwJAIANBOGpBzOaDARCFGwALIAcgCEGMroABELMRAAsgCCALQZzjgwEQsxEACyAJIAtBnOODARCzEQALIAcgAUHo8oMBELMRAAsgA0EANgJIIANBATYCPCADQcTmgwE2AjggA0IENwJAIANBOGpBzOaDARCFGwALIAggCUGc44MBELMRAAtB+PKDARCbIAALIAcgCEHo8oMBELMRAAsgA0EANgJIIANBATYCPCADQcTmgwE2AjggA0IENwJAIANBOGpBzOaDARCFGwALIAcgCEGMroABELMRAAsgCCAJQZzjgwEQsxEAC0H48oMBEJsgAAsgByABQejygwEQsxEACyADQQA2AkggA0EBNgI8IANBxOaDATYCOCADQgQ3AkAgA0E4akHM5oMBEIUbAAsgAkEANgIYIAIgBzYCFCACQQE2AhAgAiAENgIgIAJBADYCAAsCQCAEIAVPDQAgAEE8akEAIAYbIQ0gAEHIAGohDiABKAIMIQ8gASgCCCEQA0ACQAJAAkACQAJAAkACQAJAAkAgBCAPTw0AAkACQCAHIAAoAggiBk8NACAOIBAgBGotAAAiAWohCiAAKAIEIQsDQCALIAdBFGxqIgkhBwJAAkACQCAJKAIEIghFDQAgCCAKLQAAaiIHIAAoAiAiCE8NCCAAKAIcIAdBAnRqIQcMAQsDQCAHKAAAIgdFDQIgByAAKAIUIghPDQkgACgCECAHQQlsaiIIQQVqIQcgASAILQAAIgxLDQALIAEgDEcNASAIQQFqIQcLIAcoAAAiB0EBRw0DCyAJKAIMIgcgBkkNAAsLIAcgBkGs44MBELMRAAsgByAAKALQAk0NASAEIQgMBwsgBCAPQZydgAEQsxEACyACIAc2AhQgAkEBNgIQIAdFDQsCQCAHIAAoAtQCSw0AIAJCgYCAgBA3AhggA0EIaiAAIAcQmxkgAyADKQMINwI4IAMgA0E4akEAEJgMIAMoAgBBAXFFDQMgAygCBCIHIAAoAjgiCE8NBCAEQQFqIgggACgCNCAHQQJ0aigCACIASQ0FIAIgBzYCDCACIAg2AgggAkEBNgIAIAIgCCAAazYCBAwMCyADQThqIA0oAgAgDSgCBCIIKAIIQX9qQXhxakEIaiAQIA8gBCAFIAgoAhAREwAgAygCOEUNCyADKAI8IgQgAigCICIITQ0FDAYLIAcgCEG844MBELMRAAsgByAIQYzjgwEQsxEAC0H48oMBEJsgAAsgByAIQejygwEQsxEACyADQQA2AkggA0EBNgI8IANBxOaDATYCOCADQgQ3AkAgA0E4akHM5oMBEIUbAAsgCEEBaiEECyACIAQ2AiAgBCAFSQ0ACwsgAiAHNgIUIAJBATYCEAwCCyACQQA2AhggAiAHNgIUIAJBATYCECACIAQ2AiAgAkEANgIACwJAIAQgBU8NACAEIAEoAgwiESAEIBFLGyEQIABByABqIQ4gASgCCCENIAEtABBBAXEhBgNAAkACQAJAAkACQAJAIAQgEEYNAAJAIAcgACgCCCIKTw0AIA4gDSAEai0AACIBaiEPIAAoAgQhCwNAIAsgB0EUbGoiCSEHAkACQAJAIAkoAgQiCEUNACAIIA8tAABqIgcgACgCICIITw0HIAAoAhwgB0ECdGohBwwBCwNAIAcoAAAiB0UNAiAHIAAoAhQiCE8NCCAAKAIQIAdBCWxqIghBBWohByABIAgtAAAiDEsNAAsgASAMRw0BIAhBAWohBwsgBygAACIHQQFHDQQLAkAgBkUNACACQgE3AhAMCwsgCSgCDCIHIApJDQALCyAHIApBrOODARCzEQALIBAgEUGcnYABELMRAAsgByAAKALQAksNAyACIAc2AhQgAkEBNgIQIAcNAgwGCyAHIAhBvOODARCzEQALIAcgCEGM44MBELMRAAsgByAAKALUAksNACACQoGAgIAQNwIYAkACQAJAIAcgCk8NAAJAAkAgCyAHQRRsaigCCCIHRQ0AIAcgACgCLCIISQ0BIAcgCEGc44MBELMRAAtB+PKDARCbIAALIAAoAiggB0EDdGooAgAiByAAKAI4IghPDQEgBEEBaiIIIAAoAjQgB0ECdGooAgAiAEkNAiACIAc2AgwgAiAINgIIIAJBATYCACACIAggAGs2AgQMBgsgByAKQYyugAEQsxEACyAHIAhB6PKDARCzEQALIANBADYCSCADQQE2AjwgA0HE5oMBNgI4IANCBDcCQCADQThqQczmgwEQhRsACyACIARBAWoiBDYCICAEIAVHDQALCyACIAc2AhQgAkEBNgIQCyADQdAAaiQAC40YAhh/B34jAEGAAWsiBiQAIAAoAgghByAAQQA2AgggACgCACEIIAAoAgQhCSAAQoCAgICAATcCACAAKAIQIQogACgCDCELIABBACkDkPucASIeNwIMIABBFGpBACkDmPucASIfNwIAIAZBGGpBCGogHzcDACAGIB43AxggBkEANgIsIAsgChDVGiADQRBqIQwgCSAHQRhsaiENQYcFrUIghiAGQcgAaq2EISBBuAKtQiCGIAZBMGqthCEhIAUoAgAiDkF4aiEPIAZBGGpBEGohECAFKAIEIREgBSgCDCESIAkhCgJAA0ACQCAKIgcgDUcNACANIQoMAgsgB0EYaiEKIAcpAwAiHlANASAGIAcoAgg2AjggBiAeNwMwAkACQCAEIAZBMGoQixkNACABIAZBMGoQyAoNACACIAZBMGoQyAoNACAGQTBqQdzPmwEQ9hkNAAJAAkAgBigCJEUNACAGKQMwEPUYIh5CGYhCgYKEiJCgwIABfiEfIAYoAhwiEyAep3EhB0EAIRQgBigCGCELA0AgCyAHaikAACIiIB+FIh5Cf4UgHkL//fv379+//358g0KAgYKEiJCgwIB/gyEeAkACQANAIB5QDQEgBkEw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akEMaikCADcDACACQcABakEQaiIDIAJBsAJqQRRqKQIANwMAIAJBwAFqQRhqIgUgAkGwAmpBHGopAgA3AwAgAiACKQK0AjcDwAECQAJAIAIoArACIgRBIkYNACAAIAIpAtQCNwIkIABBPGogAkGwAmpBPGooAgA2AgAgAEE0aiACQbACakE0aikCADcCACAAQSxqIAJBsAJqQSxqKQIANwIAIABBHGogBSkDADcCACAAQRRqIAMpAwA3AgAgAEEMaiABKQMANwIAIAAgAikDwAE3AgQMAQsgAkHoAGpBCGoiBiABKQMANwMAIAJB6ABqQRBqIAMpAwAiCDcDACACQegAakEYaiAFKQMAIgk3AwAgAkHoAGpBDGogAkEIakEIaigCADYCACACIAIpA8ABNwNoIABBgoCAgHg2AgQgAEEYaiAINwIAIABBIGogCTcCACACIAIpAwg3AmwgACACKQNoNwIIIABBEGogBikDADcCAAsgACAENgIADAgLAkBBOEUiAw0AIAJBiAFqIAJBwAFqQTj8CgAACyACQawBaiACQRBqKAIANgIAIAIgAikDCDcCpAEgAw0AIABBBGogAkGIAWpBOPwKAAALIAAgATYCAAwGCyACQdAAaiABEK8MIAJBOGpBFGogAkHQAGpBFGooAgA2AgAgAkE4akEIaiACQQhqQQhqKAIANgIAIAIgAikCXDcCRCACIAIpAwg3AzggAkEgNgLAASACQbACaiABKAIEIAEoAgggAkE4aiACQcABahDRDEHAAEUNBSAAIAJBsAJqQcAA/AoAAAwFCyAAIAIpA5gCNwIMIABBAToAJCAAIAQ2AgggAEKigICAoICAgIB/NwIAIABBHGogAkGoAmopAwA3AgAgAEEUaiADKQMANwIADAQLAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgBEHtAEoNAAJAIARBRGoOBw0CDgICCQwACyAEQZ9/ag4GAgoBAQEDAQsCQCAEQY5/ag4JBgEEAQcBAQEJAAsgBEHuAEYNBAsgAkELNgLAASACQbACaiABKAIEIAEoAgggAkGYAmogAkHAAWoQ0QxBwABFDREgACACQbACakHAAPwKAAAMEQsgACACKQOYAjcCDCAAQQY7ASQgAEEHNgIIIABCooCAgKCAgICAfzcCACAAQRxqIAJBqAJqKQMANwIAIABBFGogAkGgAmopAwA3AgAMEAsgACACKQOYAjcCDCAAQYYCOwEkIABBDDYCCCAAQqKAgICggICAgH83AgAgAEEcaiACQagCaikDADcCACAAQRRqIAJBoAJqKQMANwIADA8LIAAgAikDmAI3AgwgAEGGBDsBJCAAQQk2AgggAEKigICAoICAgIB/NwIAIABBHGogAkGoAmopAwA3AgAgAEEUaiACQaACaikDADcCAAwOCyAAIAIpA5gCNwIMIABBhgY7ASQgAEEKNgIIIABCooCAgKCAgICAfzcCACAAQRxqIAJBqAJqKQMANwIAIABBFGogAkGgAmopAwA3AgAMDQsgACACKQOYAjcCDCAAQYYIOwEkIABBDTYCCCAAQqKAgICggICAgH83AgAgAEEcaiACQagCaikDADcCACAAQRRqIAJBoAJqKQMANwIADAwLIAAgAikDmAI3AgwgAEGGCjsBJCAAQQs2AgggAEKigICAoICAgIB/NwIAIABBHGogAkGoAmopAwA3AgAgAEEUaiACQaACaikDADcCAAwLCyAAIAIpA5gCNwIIIABBAjoAICAAQqKAgICwgICAgH83AgAgAEEYaiACQZgCakEQaikDADcCACAAQRBqIAJBoAJqKQMANwIADAoLIAAgAikDmAI3AgggAEEDOgAgIABCooCAgLCAgICAfzcCACAAQRhqIAJBmAJqQRBqKQMANwIAIABBEGogAkGgAmopAwA3AgAMCQsgAkHAAWpBEGoiBCACQZgCakEQaikDADcDACACQcABakEIaiIGIAJBmAJqQQhqKQMANwMAIAIgAikDmAI3A8ABQQQhAyAFKAIAIAEoAghGDQQgARC+CUH7AEcNBCACQbACaiABIAJBCGoQlQMgAi0AtAIhASACKAKwAiIHQSJGDQMCQEE7RQ0AIABBBWogAkGwAmpBBWpBO/wKAAALIAAgAToABCAAIAc2AgAMCAsgACACKQOYAjcCCCAAQQU6ACAgAEKigICAsICAgIB/NwIAIABBGGogAkGYAmpBEGopAwA3AgAgAEEQaiACQaACaikDADcCAAwHCyAAIAIpA5gCNwIIIABBCDoAICAAQqKAgICwgICAgH83AgAgAEEYaiACQZgCakEQaikDADcCACAAQRBqIAJBmAJqQQhqKQMANwIADAYLIAAgAikDmAI3AgggAEEJOgAgIABCooCAgLCAgICAfzcCACAAQRhqIAJBmAJqQRBqKQMANwIAIABBEGogAkGgAmopAwA3AgAMBQsgAUH/AXFBDEYNACACQdQBaiAFQQhqKAIANgIAIAIgBSkCADcCzAEgASEDCyAAIAIpA8ABNwIIIAAgAzoAICAAQqKAgICwgICAgH83AgAgAEEYaiAEKQMANwIAIABBEGogBikDADcCAAwDCwJAIAMtAGUNACACQdAAaiABEK8MIAJBOGpBFGogAkHQAGpBFGooAgA2AgAgAkE4akEIaiACQQhqQQhqKAIANgIAIAIgAikCXDcCRCACIAIpAwg3AzggAkEgNgLAASACQbACaiABKAIEIAEoAgggAkE4aiACQcABahDRDEHAAEUNAyAAIAJBsAJqQcAA/AoAAAwDCyACQRhqIAEQmQUgAkEkaiACQQhqQQhqKAIANgIAIABCooCAgKCAgICAfzcCACAAQRhqIAJBGGpBEGopAgA3AgAgAEEgaiACQRhqQRhqKQIANwIAIAIgAikDCDcCHCAAIAIpAhg3AgggAEEQaiACQRhqQQhqKQIANwIADAILIAJBADYCsAIgAkEEakGgh4UBIAJBsAJqQaSHhQEQtBkACyACQfgBaiABEN0JIAJB+AFqQQhqIgEgAkEIakEIaigCADYCACAAQqKAgIDQgICAgH83AgAgACACKQMIIgg3AgggAEEYaiACQfgBakEQaikDADcCACAAQSBqIAJB+AFqQRhqKAIANgIAIABBEGogASkDADcCACACIAg3A/gBCyACQfACaiQAC48XAhZ/AX4jAEGAAWsiAyQAIANBBjYCJEG4iIABIQQgA0G4iIABNgIgIANBlYCAgHg2AgggAyABIAJBBXRqIgU2AhwgA0HgAGpBBHIhBiADQfQAaiEHIANB0ABqQQRyIQggA0HAAGpBBHIhCSADQeAAakEQaiEKIANBCGpBBHIhC0EGIQJBAiEMQQQhDUECIQ5BAiEPQQIhEEECIREDQCACQQN0IRICQAJAAkACQAJAAkACQAJAAkADQAJAAkACQAJAIAEgBUYNACADQeAAaiETIAEoAgAiAkGVgICAeEYNA0EIIRQCQAJAAkACQCACQYCAgIB4cyICQRUgAkEVSRsiAkF0ag4EAwIAAQcLIANB0ABqIAEoAgggASgC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AtQXIAMgAykD8A03Aa4UIANB4BdqIQYCQCADKALoFyIJIAMoAuAXRw0AIAZBtOSDARDsFQsgAygC5BcgCUEJbGoiCEIANwAAIAhBCGpBADoAACADIAlBAWo2AugXIANB+BdqIQcCQCADKAKAGCIJIAMoAvgXRw0AIAdBxOSDARDvFQsgA0HUF2ohBCADKAL8FyAJQQN0akIANwIAIAMgCUEBajYCgBggA0HsF2ohBQJAIAMoAvQXIgkgAygC7BdHDQAgBUHU5IMBEOkVCyADKALwFyAJQQJ0akEANgIAIAMgCUEBajYC9BcgA0GADmogBEEAEK4OAkACQAJAIAMoAoAOIglBA0YNACADQegNaiADQZYOai8BADsBACADIAMpAY4ONwPgDQwBCyADQYAOaiAEQQAQrg4CQCADKAKADiIJQQNGDQAgA0HoDWogA0GWDmovAQA7AQAgAyADKQGODjcD4A0MAQsgA0GADmogBEEAEK4OIAMoAoQOIQgCQAJAIAMoAoAOIglBA0YNACADQegNaiADQZYOai8BADsBACADIAMpAY4ONwPgDQwBCyADIAg2AqwaIANBgA5qIARBABCuDiADKAKEDiEIAkAgAygCgA4iCUEDRg0AIANB6A1qIANBlg5qLwEAOwEAIAMgAykBjg43A+ANDAELIAMgCDYCsBogA0GADmogA0GgFGoQ4gsCQCADKAKADiIJQQNGDQAgA0HoDWogA0GWDmovAQA7AQAgAyADKQGODjcD4A0MAgsgA0GADmogA0GgFGoQ2hACQCADKAKADiIJQQNGDQAgA0HoDWogA0GWDmovAQA7AQAgAyADKQGODjcD4A0MAgsgA0GADmogA0GgFGogASACEIgDAkAgAygCgA4iCUEDRg0AIANB6A1qIANBlg5qLwEAOwEAIAMgAykBjg43A+ANDAILIAQQ3hMgA0GADmogA0GgFGoQzgwCQEGAAkUNACADQZwYaiADQYAOakGAAvwKAAALIANBgA5qIANBoBRqEOwHAkAgAygCgA4iCUEDRg0AIANB6A1qIANBlg5qLwEAOwEAIAMgAykBjg43A+ANDAILIANBoBRqEMAOIANBgA5qIANBoBRqEPcGAkAgAygCgA4iCUEDRg0AIANB6A1qIANBlg5qLwEAOwEAIAMgAykBjg43A+ANDAILIANBgA5qIANB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A2pBCWoiAEUNACACKAKIASADayAAQQgQnhILIAJBmAFqENYVCyAEKAIAQYCAgIB4Rg0FIAQgARCXBwwFCyABKAIwEIESIQMgAkGIAWpBNGogAUE0aigCADYCACACQZABakEAKQOY+5wBIgg3AwAgAkGYAWpBACkDkPucASIJNwMAIAJBoAFqIAg3AwAgAiABNgKoASACIAM2AqwBIAJBADoAsAEgAiABKQIsNwK0ASACIAk3A4gBIAIgASgBOjYBwgEgAiABLQA4OgDAASACQQA6AMEBAkAgACgCBCIBQQJGDQACQCABQQFxRQ0AIAJBAToAwQEgACgCCCACQYgBahBsDAELIAJBiAFqIAAoAggQoAoLIAJBAToAwQECQCAAKAIYIgFFDQAgASACQYgBahBsCyACQQE6AMEBAkAgACgCHCIBRQ0AIAEgAkGIAWoQbCACQQE6AMEBCyACIAAoAgw2AugBIAJBiAFqIAJB6AFqEIYHAkAgAigCjAEiAUUNACACKAKIASACKAKUARCSDCABIAFBBHRBF2pBcHEiAGpBCWoiAUUNACACKAKIASAAayABQQgQnhILIAJBmAFqENYVDAQLIAEoAjAQgRIhAyACQYgBakE0aiABQTRqKAIANgIAIAJBADoAsAEgAkGQAWpBACkDmPucASIINwMAIAJBmAFqQQApA5D7nAEiCTcDACACQaABaiAINwMAIAIgATYCqAEgAiADNgKsASACQQE6AMEBIAIgASkCLDcCtAEgAiABKAE6NgHCASACIAEtADg6AMABIAIgCTcDiAECQAJAAkACQCAAKAIEDgMAAQIACyACQYgBaiAAKAIIEKAKDAILIAJBiAFqIAAoAggQiwsMAQsgACgCCCACQYgBahCEBAsgACgCDCEBIAItAMEBIQMgAkEBOgDBASABIAJBiAFqEGwgAiADOgDBASACIAAoAhA2AugBIAJBiAFqIAJB6AFqEIYHAkAgAigCjAEiAUUNACACKAKIASACKAKUARCSDCABIAFBBHRBF2pBcHEiAGpBCWoiAUUNACACKAKIASAAayABQQgQnhILIAJBmAFqENYVDAMLIAEoAjAQgRIhAyACQYgBakE0aiABQTRqKAIANgIAIAJBADoAsAEgAkGQAWpBACkDmPucASIINwMAIAJBmAFqQQApA5D7nAEiCTcDACAC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GCAAIAM2AgQgAEEGNgIAIANBDGogBEGoAWopAwA3AgAgA0EUaiAEQbABaigCADYCAAwECyAEIAFBABDEAiAEKAIEIQMCQAJAIAQoAgBBAXENACADKAIIIQcgAygCBCEGIAMtABkhCCADKAIUIQkgAygCECEKIAMoAgAhAiAEKAIcIQsgA0EcQQQQnhIgAkGAgICAeEcNASAGIQMLIABBCTYCACAAIAM2AgQMBAtBBEEcEOsfIgNFDQYgAyAIOgAZIANBAToAGCADIAk2AhQgAyAKNgIQIAMgCzYCDCADIAc2AgggAyAGNgIEIAMgAjYCACAAIAM2AgQgAEECNgIADAMLIAZBtH9qQf8BcUHVAEkNACAAQQg2AgAgBEEgahDMHQwDCyAGIAEQiAshDyAEQThqIAEgBCgCGCADIA9BARCKBAJAIAQoAjgiA0EJRw0AQShFDQMgACAEQThqQSj8CgAADAMLQQghAgJAIANBCEYNACAEIAM2AtgBAkBBJEUiAw0AIARB2AFqQQRyIARBOGpBBHJBJPwKAAALIARBgAJqIARB2AFqEJoLIAQoAoACIQIgAw0AIARBtAFqIARBgAJqQQRyQST8CgAACyAAIAI2AgBBJEUNAiAAQQRqIARBtAFqQST8CgAADAILIAAgBCkDODcDCCAAIAM2AgQgACAINgIAIABBIGogBykDADcDACAAQRhqIAYpAwA3AwAgAEEQaiACKQMANwMACyAEQSBqEMwdCyABIAU2AngMAgsgAEEINgIAIAMQzB0MAQsACyAEQbACaiQAC8wTAg9/AX4jAEEwayICJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABKAIAQXxqIgNBBCADQQdJGw4HAAECAwQFBgALIAEoAgghBCABKAIUIQUgASgCECEGIAJBCGogASgCDCIHQQhBKBDMDSACKAIMIQggAigCCEEBRg0HIAIoAhAhCQJAIAhFDQAgB0EobCEKIAkhAyAIIQsDQCAKRQ0BIAJBCGogBBDRAiADQSBqIAJBCGpBIGopAwA3AwAgA0EYaiACQQhqQRhqKQMANwMAIANBEGogAkEIakEQaikDADcDACADQQhqIAJBCGpBCGopAwA3AwAgAyACKQMINwMAIApBWGohCiADQShqIQMgBEEoaiEEIAtBf2oiCw0ACwtBACEEQQAhAwJAIAEoAhgiCkUNAEEALQDA8Z0BGkEMEIUBIgNFDQlBAC0AwPGdARogCigCCCEMIAooAgQhDUHgABCFASILRQ0JIAsgCigCABBkIAMgDDYCCCADIA02AgQgAyALNgIACwJAIAEoAhwiAUUNAEEALQDA8Z0BGkEUEIUBIgRFDQkgASkCDCERIAQgASgCBCABKAIIEKIGIAQgETcCDAsgACAENgIcIAAgAzYCGCAAIAU2AhQgACAGNgIQIAAgBzYCDCAAIAk2AgggACAINgIEIABBBDYCAAwGCyABKAIIIQQgASgCFCEFIAEoAhAhBiACQQhqIAEoAgwiB0EIQSgQzA0gAigCDCEIIAIoAghBAUYNCCACKAIQIQkCQCAIRQ0AIAdBKGwhCiAJIQMgCCELA0AgCkUNASACQQhqIAQQ0QIgA0EgaiACQQhqQSBqKQMANwMAIANBGGogAkEIakEYaikDADcDACADQRBqIAJBCGpBEGopAwA3AwAgA0EIaiACQQhqQQhqKQMANwMAIAMgAikDCDcDACAKQVhqIQogA0EoaiEDIARBKGohBCALQX9qIgsNAAsLQQAhBEEAIQMCQCABKAIYIgpFDQBBAC0AwPGdARpBDBCFASIDRQ0IQQAtAMDxnQEaIAooAgghDCAKKAIEIQ1B4AAQhQEiC0UNCCALIAooAgAQZCADIAw2AgggAyANNgIEIAMgCzYCAAsCQCABKAIcIgFFDQBBAC0AwPGdARpBFBCFASIERQ0IIAEpAgwhESAEIAEoAgQgASgCCBCiBiAEIBE3AgwLIAAgBDYCHCAAIAM2AhggACAFNgIUIAAgBjYCECAAIAc2AgwgACAJNgIIIAAgCDYCBCAAQQU2AgAMBQtBACEDQQAtAMDxnQEaIAEtABQhCiABKAIIIQsgASgCBCEIQcAAEIUBIgRFDQYgBCABKAIQEEQgAS0AFiEHIAEtABUhCQJAIAEoAgwiAUUNAEEALQDA8Z0BGkEMEIUBIgNFDQdBAC0AwPGdARogASgCCCEGIAEoAgQhDEHgABCFASIFRQ0HIAUgASgCABBkIAMgBjYCCCADIAw2AgQgAyAFNgIACyAAIAc6ABYgACAJOgAVIAAgCjoAFCAAIAQ2AhAgACADNgIMIAAgCzYCCCAAIAg2AgQgAEEGNgIADAQLQQAhA0EALQDA8Z0BGiABKAIMIQogASgCCCELQcAAEIUBIgRFDQUgBCABKAIEEEQgAS0AFCEIAkAgASgCECIBRQ0AQQAtAMDxnQEaQQwQhQEiA0UNBkEALQDA8Z0BGiABKAIIIQkgASgCBCEFQeAAEIUBIgdFDQYgByABKAIAEGQgAyAJNgIIIAMgBTYCBCADIAc2AgALIAAgCDoAFCAAIAM2AhAgACAKNgIMIAAgCzYCCCAAIAQ2AgQgAEEHNgIADAMLQQAtAMDxnQEaIAEoAiwhBCABKAIoIQpBwAAQhQEiA0UNBCADIAEoAjAQRCABLQA0IQsgAkEIaiABENECIAAgCzoANCAAIAM2AjAgACAENgIsIAAgCjYCKCAAQSBqIAJBCGpBIGopAwA3AwAgAEEYaiACQQhqQRhqKQMANwMAIABBEGogAkEIakEQaikDADcDACAAQQhqIAJBCGpBCGopAwA3AwAgACACKQMINwMADAILQQAtAMDxnQEaIAEoAhghBiABKAIUIQxBwAAQhQEiB0UNAyAHIAEoAhAQRCABKAIIIQQgAS0AJSENIAEtACQhDiACQQhqIAEoAgwiCUEIQSgQzA0gAigCDCEIIAIoAghBAUYNBSACKAIQIQUCQCAIRQ0AIAlBKGwhCiAFIQMgCCELA0AgCkUNASACQQhqIAQQ0QIgA0EgaiACQQhqQSBqKQMANwMAIANBGGogAkEIakEYaikDADcDACADQRBqIAJBCGpBEGopAwA3AwAgA0EIaiACQQhqQQhqKQMANwMAIAMgAikDCDcDACAKQVhqIQogA0EoaiEDIARBKGohBCALQX9qIgsNAAsLQQAhBEEAIQMCQCABKAIcIgpFDQBBAC0AwPGdARpBDBCFASIDRQ0EQQAtAMDxnQEaIAooAgghDyAKKAIEIRBB4AAQhQEiC0UNBCALIAooAgAQZCADIA82AgggAyAQNgIEIAMgCzYCAAsCQCABKAIgIgFFDQBBAC0AwPGdARpBFBCFASIERQ0EIAEpAgwhESAEIAEoAgQgASgCCBCiBiAEIBE3AgwLIAAgDToAJSAAIA46ACQgACAENgIgIAAgAzYCHCAAIAY2AhggACAMNgIUIAAgBzYCECAAIAk2AgwgACAFNgIIIAAgCDYCBCAAQQk2AgAMAQsgASgCCCEEIAJBCGogASgCDCIHQQhBKBDMDSACKAIMIQggAigCCEEBRg0FIAIoAhAhCQJAIAhFDQAgB0EobCEKIAkhAyAIIQsDQCAKRQ0BIAJBCGogBBDRAiADQSBqIAJBCGpBIGopAwA3AwAgA0EYaiACQQhqQRhqKQMANwMAIANBEGogAkEIakEQaikDADcDACADQQhqIAJBCGpBCGopAwA3AwAgAyACKQMINwMAIApBWGohCiADQShqIQMgBEEoaiEEIAtBf2oiCw0ACwsCQAJAIAEoAhAiBA0AQQAhAwwBC0EALQDA8Z0BGkEMEIUBIgNFDQNBAC0AwPGdARogBCgCCCELIAQoAgQhBUHgABCFASIKRQ0DIAogBCgCABBkIAMgCzYCCCADIAU2AgQgAyAKNgIACyAAIAM2AhAgACAHNgIMIAAgCTYCCCAAIAg2AgQgAEEKNgIAIAAgAS8BHDsBHCAAIAEpAhQ3AhQLIAJBMGokAA8LIAggAigCEEGIn5oBEKoeCwALIAggAigCEEGIn5oBEKoeAAsgCCACKAIQQYifmgEQqh4ACyAIIAIoAhBBiJ+aARCqHgALuBICC38BfiMAQYADayICJAACQAJAAkACQAJAAkACQCAAKAIADggABQQDBgYCAQALAkAgACgCICIDQQhqKAIAIgBFDQAgA0EEaigCACEEIABBDGwhBQNAAkACQCAEKAIAIgAoAgBBGkcNACACQcAAaiABKAIAIAEoAgQgAEEIaiIGELUMIAIoAkBBMkYNASAAEMkBIABBOGogAkHAAGpBOGopAwA3AwAgAEEwaiACQcAAakEwaikDADcDACAAQShqIAJBwABqQShqKQMANwMAIABBIGogAkHAAGpBIGopAwA3AwAgAEEYaiACQcAAakEYaikDADcDACAAQRBqIAJBwABqQRBqKQMANwMAIAYgAkHAAGpBCGopAwA3AwAgACACKQNANwMADAELIAAgARBGCyAEQQxqIQQgBUF0aiIFDQALCwJAIANBFGooAgAiBEUNACADQRBqKAIAIQAgBEHYAGwhBANAIAAgARBoIABB2ABqIQAgBEGof2oiBA0ACwsgAygCMCIARQ0FAkAgACgCAEEaRw0AIAIgASgCACABKAIEIABBCGoiBBC1DCACKAIAQTJGDQYgABDJASAAQThqIAJBOGopAwA3AwAgAEEwaiACQTBqKQMANwMAIABBKGogAkEoaikDADcDACAAQSBqIAJBIGopAwA3AwAgAEEYaiACQRhqKQMANwMAIABBEGogAkEQaikDADcDACAEIAJBCGopAwA3AwAgACACKQMANwMADAYLIAAgARBGDAULIAAoAgQiAC0ARSIEQQNGDQQCQCAEQQJGDQACQCAAKAJAIgAtACVBAkYNACAAQSBqIAEQrBAMBgsgAEEIaigCACIERQ0FIABBBGooAgAhACAEQThsIQQDQAJAAkAgACgCAEEJRw0AIABBCGogARBvDAELIAAgARCgAgsgAEE4aiEAIARBSGoiBA0ADAYLCyAAQShqKAIAIgRFDQQgAEEkaigCACEAIARBOGwhBANAAkACQCAAKAIAQQlHDQAgAEEIaiABEG8MAQsgACABEKACCyAAQThqIQAgBEFIaiIEDQAMBQsLIAAoAgQiAEEoaigCACIERQ0DIARBMGwhBSAAQSRqKAIAQShqIQQDQAJAIAQoAgAiAEUNAAJAIAAoAgBBGkcNACACQcACaiABKAIAIAEoAgQgAEEIaiIGELUMIAIoAsACQTJGDQEgABDJASAAQThqIAJBwAJqQThqKQMANwMAIABBMGogAkHAAmpBMGopAwA3AwAgAEEoaiACQcACakEoaikDADcDACAAQSBqIAJBwAJqQSBqKQMANwMAIABBGGogAkHAAmpBGGopAwA3AwAgAEEQaiACQcACakEQaikDADcDACAGIAJBwAJqQQhqKQMANwMAIAAgAikDwAI3AwAMAQsgACABEEYLIARBMGohBCAFQVBqIgUNAAwECwsgACgCBCIAQQhqKAIAIgRFDQIgAEEEaigCACIAIARBOGxqIQUDQCAAIAEQlwMCQCAAQTBqKAIAIgRFDQACQCAEKAIAQRpHDQAgAkGAAmogASgCACABKAIEIARBCGoiBhC1DCACKAKAAkEyRg0BIAQQyQEgBEE4aiACQYACakE4aikDADcDACAEQTBqIAJBgAJqQTBqKQMANwMAIARBKGogAkGAAmpBKGopAwA3AwAgBEEgaiACQYACakEgaikDADcDACAEQRhqIAJBgAJqQRhqKQMANwMAIARBEGogAkGAAmpBEGopAwA3AwAgBiACQYACakEIaikDADcDACAEIAIpA4ACNwMADAELIAQgARBGCyAAQThqIgAgBUcNAAwDCwsgACgCBCIAQQhqKAIAIgRFDQEgAEEEaigCACIAIARBOGxqIQUDQCAAIAEQlwMCQCAAQTBqKAIAIgRFDQACQCAEKAIAQRpHDQAgAkHAAWogASgCACABKAIEIARBCGoiBhC1DCACKALAAUEyRg0BIAQQyQEgBEE4aiACQcABakE4aikDADcDACAEQTBqIAJBwAFqQTBqKQMANwMAIARBKGogAkHAAWpBKGopAwA3AwAgBEEgaiACQcABakEgaikDADcDACAEQRhqIAJBwAFqQRhqKQMANwMAIARBEGogAkHAAWpBEGopAwA3AwAgBiACQcABakEIaikDADcDACAEIAIpA8ABNwMADAELIAQgARBGCyAAQThqIgAgBUcNAAwCCwsCQCAAKAIgIgdBCGooAgAiAEUNACAHQQRqKAIAIgggAEEGdGohCQNAAkAgCEE4aigCACIARQ0AIAhBNGooAgAhBCAAQQxsIQUDQAJAAkAgBCgCACIAKAIAQRpHDQAgASgCAEEBRw0BIAEoAgQiAyAAKAIYRw0BAkACQCAAKQMIIg1CA4NCAFINACANpyIGIAYoAgAiBkEBajYCACAGQX9MDQELQQAtAMDxnQEaIAAoAhQhCiAAKAIQIQsgAC0AHCEMQcAAEIUBIgZFDQAgBiAMOgAcIAYgAzYCGCAGQgA3AxAgBiANNwMIIAZBGjYCACAAEMkBIAAgBjYCKCAAIAo2AiQgACALNgIgIABCADcDGCAAQpG+ATcDECAAQQA2AgggAEEUNgIADAILAAsgACABEEYLIARBDGohBCAFQXRqIgUNAAsLIAggARCDBCAIQcAAaiIAIQggACAJRw0ACwsCQCAHQRRqKAIAIgBFDQAgB0EQaigCACEEIABBDGwhBQNAAkACQCAEKAIAIgAoAgBBGkcNACACQYABaiABKAIAIAEoAgQgAEEIaiIGELUMIAIoAoABQTJGDQEgABDJASAAQThqIAJBgAFqQThqKQMANwMAIABBMGogAkGAAWpBMGopAwA3AwAgAEEoaiACQYABakEoaikDADcDACAAQSBqIAJBgAFqQSBqKQMANwMAIABBGGogAkGAAWpBGGopAwA3AwAgAEEQaiACQYABakEQaikDADcDACAGIAJBgAFqQQhqKQMANwMAIAAgAikDgAE3AwAMAQsgACABEEYLIARBDGohBCAFQXRqIgUNAAsLIAcoAhhB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QQBIDQAgCiAKKQMAQoCBgoSIkKDAgH+DeqdBA3YiE2otAAAhAwsgACgCCCEEIAogE2ogDzoAACAKIAsgE0F4anFqQQhqIA86AAAgCiATQQJ0a0F8aiAENgIAIAAgACgCFCADQQFxazYCFCAAIAAoAhhBAWo2AhggACgCCCIDIAAoAgBHDQMgACgCGCAAKAIUaiIEQebMmTMgBEHmzJkzSRsgA2siBEEBTQ0CIAAgAyAEQQRBFBCxCyEEIAAoAgghAyAEQYGAgIB4Rw0CDAMLIAMgDEGsoJoBELMRAAsgAyAEQYSimgEQsxEACyAAIANBAUEEQRQQ+AogACgCCCEDCwJAIAMgACgCAEcNACAAEMkWCyAAIANBAWo2AgggACgCBCADQRRsaiIDIAk2AhAgAyAFNgIMIAMgBjYCCCADIAc2AgQgAyAINgIADAELQQAtAMDxnQEaIAEoAgghCUHAABCFASIERQ0BIARBADYCCCAEQjE3AwAgCSgCACEDIAkgBDYCACACQQhqIgQgA0EIaikDADcDACACQRBqIgkgA0EQaikDADcDACACQRhqIgggA0EYaikDADcDACACQSBqIgcgA0EgaikDADcDACACQShqIgogA0EoaikDADcDACACQTBqIgsgA0EwaikDADcDACACQThqIgUgA0E4aikDADcDACACIAMpAwA3AwAgARDJASABQThqIAUpAwA3AwAgAUEwaiALKQMANwMAIAFBKGogCikDADcDACABQSBqIAcpAwA3AwAgAUEYaiAIKQMANwMAIAFBEGogCSkDADcDACABQQhqIAQpAwA3AwAgASACKQMANwMAIANBwABBCBCeEgwACwsAC7gSAQx/IwBBEGsiAiQAAkAgAC0AbEECRw0AIABBwABqIQMDQCADKAIYIgMtACxBAkYNAAsLAkAgACgChAEiA0UNACAAKAKAASIEIANB2ABsaiEFA0ACQAJAIAQoAgAiA0EFRw0AIAEtACQhBiABQQI6ACQgAS0AJSEDIAEgBCgCBCIHEMYBIAcgARBSIAEgAzoAJSABQQI6ACQgASAHEJsBIAEgAzoAJSABIAY6ACQMAQsgA0EERg0AAkACQAJAAkACQCADDgQFAAECBQsgBCgCBEEBRw0EIAQoAgghAyABLQAkIgcNAyADKAIAQXRqIgZBByAGQSZJG0F7aiIG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AhQhByACKAIYDQIgAigCICEFDBALAkAgACgC0AIiBw0AQQEQxxwhBAwTCyAHIAAoAswCSw0OIAcgACgCPHZBfmoiCCAAKAIUIglPDQggAigCHEEAIAIoAhgbIgkgACgCECAIQQxsaiIIKAIITw0OIAJBATYCGCACIAlBAWo2AhwgCCgCBCAJQQJ0aigCACIHIAAoAiAiBk8NCSAFIAAoAhwgB0ECdGooAgAiAEkNCiACIAc2AgwgAiAFNgIIIAJBATYCACACIAUgAGs2AgQLQQAhBAwRCyAHIAAoAjx2QX5qIgUgACgCFCIITw0JAkAgAigCHCIIIAAoAhAgBUEMbGoiBSgCCEkNACACQQA2AhggAkEANgIAIAIgAigCIEEBaiIFNgIgDA4LIAJBATYCGCACIAhBAWo2AhwgBSgCBCAIQQJ0aigCACIFIAAoAiAiB08NCiACKAIgQQFqIgcgACgCHCAFQQJ0aigCACIASQ0LIAIgBTYCDCACIAc2AgggAkEBNgIAIAIgByAAazYCBAwQCyAIIAlBtO+DARCzEQALIAcgBkGE74MBELMRAAsgA0EANgIYIANBATYCDCADQcTmgwE2AgggA0IENwIQIANBCGpBzOaDARCFGwALIAUgCEG074MBELMRAAsgBSAHQYTvgwEQsxEACyADQQA2AhggA0EBNgIMIANBxOaDATYCCCADQgQ3AhAgA0EIakHM5oMBEIUbAAsgCCAJQbTvgwEQsxEACyAHIAZBhO+DARCzEQALIANBADYCGCADQQE2AgwgA0HE5oMBNgIIIANCBDcCECADQQhqQczmgwEQhRsACyAFIAhBtO+DARCzEQALIAUgB0GE74MBELMRAAsgA0EANgIYIANBATYCDCADQcTmgwE2AgggA0IENwIQIANBCGpBzOaDARCFGwALIAJBADYCGCACIAc2AhQgAkEBNgIQIAIgBTYCICACQQA2AgALAkAgBSAGTw0AIABBwABqIQogASgCDCEIIAEoAgghCQNAAkACQAJAAkACQAJAAkACQAJAIAUgCE8NACAHIAogCSAFai0AAGotAABqIgcgACgCCCIBTw0CIAAoAgQgB0ECdGooAgAiByAAKALIAk0NASAFIQEMBwsgBSAIQZydgAEQsxEACyACIAc2AhQgAkEBNgIQIAdFDQsCQCAHIAAoAswCSw0AIAJCgYCAgBA3AhggByAAKAI8dkF+aiIHIAAoAhQiBk8NAiAAKAIQIAdBDGxqIgcoAghFDQMgBygCBCgCACIHIAAoAiAiBk8NBCAFQQFqIgUgACgCHCAHQQJ0aigCACIASQ0FIAIgBzYCDCACIAU2AgggAkEBNgIAIAIgBSAAazYCBAwMCyADQQhqIAAoAiggACgCLCIBKAIIQX9qQXhxakEIaiAJIAggBSAGIAEoAhAREwAgAygCCEUNCyADKAIMIgUgAigCICIBTQ0FDAYLIAcgAUH07oMBELMRAAsgByAGQZTvgwEQsxEAC0EAQQBBpO+DARCzEQALIAcgBkGE74MBELMRAAsgA0EANgIYIANBATYCDCADQcTmgwE2AgggA0IENwIQIANBCGpBzOaDARCFGwALIAFBAWohBQsgAiAFNgIgIAUgBkkNAAsLIAIgBzYCFCACQQE2AhAMAgsgAkEANgIYIAIgBzYCFCACQQE2AhAgAiAFNgIgIAJBADYCAAsCQAJAIAUgBk8NACAFIAEoAgwiCyAFIAtLGyEIIABBwABqIQkgASgCCCEBA0AgCCAFRg0FIAcgCSABIAVqLQAAai0AAGoiByAAKAIIIgpPDQQCQCAAKAIEIAdBAnRqKAIAIgcgACgCyAJLDQAgAiAHNgIUIAJBATYCECAHRQ0EIAcgACgCzAJNDQMLIAIgBUEBaiIFNgIgIAYgBUcNAAsLIAIgBzYCFCACQQE2AhAMAQsgAkKBgICAEDcCGCAHIAAoAjx2QX5qIgcgACgCFCIGTw0DIAAoAhAgB0EMbGoiBygCCEUNBCAHKAIEKAIAIgcgACgCICIGTw0FIAVBAWoiBSAAKAIcIAdBAnRqKAIAIgBJDQYgAiAHNgIMIAIgBTYCCCACQQE2AgAgAiAFIABrNgIECyADQSBqJAAgBA8LIAcgCkH07oMBELMRAAsgCCALQZydgAEQsxEACyAHIAZBlO+DARCzEQALQQBBAEGk74MBELMRAAsgByAGQYTvgwEQsxEACyADQQA2AhggA0EBNgIMIANBxOaDATYCCCADQgQ3AhAgA0EIakHM5oMBEIUbAAvpEAEFfyMAQcACayICJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCACIDDQACQAJAAkACQAJAIAAoAgQiAygCACIEQXtqIgBBBCAAQQZJGw4GEAABAgMEEAsgAygCCEEDRw0OIAMoAgwiACgCAEEaRw0FIAJBgAJqIAEoAgAgASgCBCAAQQhqIgQQtQwgAigCgAJBMkYNDiAAEMkBIABBOGogAkGAAmpBOGopAwA3AwAgAEEwaiACQYACakEwaikDADcDACAAQShqIAJBgAJqQShqKQMANwMAIABBIGogAkGAAmpBIGopAwA3AwAgAEEYaiACQYACakEYaikDADcDACAAQRBqIAJBgAJqQRBqKQMANwMAIAQgAkGAAmpBCGopAwA3AwAgACACKQOAAjcDAAwOCyADKAIoIgMoAgBBGkcNBSACQcAAaiABKAIAIAEoAgQgA0EIaiIBELUMIAIoAkBBMkYNDiADEMkBIANBOGogAkHAAGpBOGopAwA3AwAgA0EwaiACQcAAakEwaikDADcDACADQShqIAJBwABqQShqKQMANwMAIANBIGogAkHAAGpBIGopAwA3AwAgA0EYaiACQcAAakEYaikDADcDACADQRBqIAJBwABqQRBqKQMANwMAIAEgAkHAAGpBCGopAwA3AwAgAyACKQNANwMADA4LIAMoAghBA0cNCyADKAIMIgAoAgBBGkcNBSACQYACaiABKAIAIAEoAgQgAEEIaiIEELUMIAIoAoACQTJGDQsgABDJASAAQThqIAJBgAJqQThqKQMANwMAIABBMGogAkGAAmpBMGopAwA3AwAgAEEoaiACQYACakEoaikDADcDACAAQSBqIAJBgAJqQSBqKQMANwMAIABBGGogAkGAAmpBGGopAwA3AwAgAEEQaiACQYACakEQaikDADcDACAEIAJBgAJqQQhqKQMANwMAIAAgAikDgAI3AwAMCwsgA0EgaiEAIARBA0cNCSADKAIEIgQoAgBBGkcNBSACQYACaiABKAIAIAEoAgQgBEEIaiIFELUMIAIoAoACQTJGDQkgBBDJASAEQThqIAJBgAJqQThqKQMANwMAIARBMGogAkGAAmpBMGopAwA3AwAgBEEoaiACQYACakEoaikDADcDACAEQSBqIAJBgAJqQSBqKQMANwMAIARBGGogAkGAAmpBGGopAwA3AwAgBEEQaiACQYACakEQaikDADcDACAFIAJBgAJqQQhqKQMANwMAIAQgAikDgAI3AwAMCQsgAygCCEEDRw0HIAMoAgwiACgCAEEaRw0FIAJBgAJqIAEoAgAgASgCBCAAQQhqIgQQtQwgAigCgAJBMkYNByAAEMkBIABBOGogAkGAAmpBOGopAwA3AwAgAEEwaiACQYACakEwaikDADcDACAAQShqIAJBgAJqQShqKQMANwMAIABBIGogAkGAAmpBIGopAwA3AwAgAEEYaiACQYACakEYaikDADcDACAAQRBqIAJBgAJqQRBqKQMANwMAIAQgAkGAAmpBCGopAwA3AwAgACACKQOAAjcDAAwHCyADKAIAQRpHDQUgAiABKAIAIAEoAgQgA0EIaiIBELUMIAIoAgBBMkYNCiADEMkBIANBOGogAkE4aikDADcDACADQTBqIAJBMGopAwA3AwAgA0EoaiACQShqKQMANwMAIANBIGogAkEgaikDADcDACADQRhqIAJBGGopAwA3AwAgA0EQaiACQRBqKQMANwMAIAEgAkEIaikDADcDACADIAIpAwA3AwAMCgsgACABEEYMCAsgAyABEEYMCAsgACABEEYMBQsgBCABEEYMAwsgACABEEYMAQsgAyABEEYMBAsgAygCKCIGIAEQ1ggCQCAGQRRqKAIAIgNFDQAgBkEQaigCACEAIANBDGwhBANAAkACQCAAKAIAIgMoAgBBGkcNACACQcABaiABKAIAIAEoAgQgA0EIaiIFELUMIAIoAsABQTJGDQEgAxDJASADQThqIAJBwAFqQThqKQMANwMAIANBMGogAkHAAWpBMGopAwA3AwAgA0EoaiACQcABakEoaikDADcDACADQSBqIAJBwAFqQSBqKQMANwMAIANBGGogAkHAAWpBGGopAwA3AwAgA0EQaiACQcABakEQaikDADcDACAFIAJBwAFqQQhqKQMANwMAIAMgAikDwAE3AwAMAQsgAyABEEYLIABBDGohACAEQXRqIgQNAAsLIAYoAhhBgICAgHhGDQMgBkEgaigCACIARQ0DIAZBHGooAgAhAyAAQTBsIQADQCADIAEQbyADQTBqIQMgAEFQaiIADQAMBAsLAkAgACgCAEEHRg0AIAAgARCXAwsgAygCaCABEJcDIAMoAkhBgICAgHhGDQIgA0HQAGooAgAiAEUNAiADQcwAaigCACEDIABBMGwhAANAIAMgARBvIANBMGohAyAAQVBqIgANAAwDCwsgAygCKEGAgICAeEYNASADQTBqKAIAIgBFDQEgA0EsaigCACEDIABBMGwhAANAIAMgARBvIANBMGohAyAAQVBqIgANAAwCCwsCQCADKAIoIgMoAgBBGkcNACACQYABaiABKAIAIAEoAgQgA0EIaiIBELUMIAIoAoABQTJGDQEgAxDJASADQThqIAJBgAFqQThqKQMANwMAIANBMGogAkGAAWpBMGopAwA3AwAgA0EoaiACQYABakEoaikDADcDACADQSBqIAJBgAFqQSBqKQMANwMAIANBGGogAkGAAWpBGGopAwA3AwAgA0EQaiACQYABakEQaikDADcDACABIAJBgAFqQQhqKQMANwMAIAMgAikDgAE3AwAMAQsgAyABEEYLIAJBwAJqJAALgBECCn8BfiMAQZABayICJAACQAJAAkAgASgCACIDQQlHDQAgACABQQhqEN8BDAELAkACQAJAAkACQAJAAkACQCADDgkABwYFBAMJAgEACwJAIAEoAgwiBEUNACABKAIIIQNBACEFAkACQANAIAVBAWohBgJAIAMpAwBCAlYNACADQcAAai0AAEEBcQ0CCyADQcgAaiEDIAYhBSAEIAZHDQALQQAhBQwBCyADEL8JAkAgBiAERw0AQQEhBQwBCyAFQX9zIARqIQYgA0HIAGohA0EBIQUDQAJAAkAgAykDAEICVg0AIANBwABqLQAAQQFxRQ0AIAMQvwkgBUEBaiEFDAELQcgARQ0AIAMgBUG4f2xqIANByAD8CgAACyADQcgAaiEDIAZBf2oiBg0ACwsgASAEIAVrNgIMCyABKAIcIgNFDQcgA0EIaigCACIGRQ0HIANBBGooAgAhAyAGQQxsIQYDQAJAAkAgAygCACIFDQAgA0EEaigCACAAENwDDAELIAAgBRCMAQsgA0EMaiEDIAZBdGoiBg0ADAgLCyABQQA6ACQMBwsgACABKAIEEIwBDAULIAEoAhAiA0UNBCADQQhqKAIAIgZFDQQgA0EEaigCACEDIAZBDGwhBgNAAkACQCADKAIAIgUNACADQQRqKAIAIAAQ3AMMAQsgACAFEIwBCyADQQxqIQMgBkF0aiIGDQAMBQsLIAAgASgCBBCMAQwDCwJAAkACQCABKAIIDgMAAQYACwJAIAEtACQiB0ECRg0AIAFBADoAJAsgASgCKCIIQQA6ADwgCCgCICEFIAhBADYCIAJAIAVFDQAgCCgCHCEGA0AgBkEMaigCACEDIAYoAgAiBBDZASAEQcAAQQgQnhICQCADRQ0AIAMQuBggAygCACADQQRqKAIAEMAgIANBFEEEEJ4SCyAGQRBqIQYgBUF/aiIFDQALCyAIIAAQ6gwgB0ECRw0BDAQLAkAgAS0AJCIIQQJGDQAgAUEAOgAkCyAAIAEoAigiBRCLByAFQRhqIQQCQCAFKAIUIgZFDQAgBSgCECEDIAZBDGwhBgNAIAAgAygCABCMASADQQxqIQMgBkF0aiIGDQALCwJAIAQoAgBBgICAgHhGDQAgACAEEMECCwJAIAUoAjwiA0UNACADEOQNIAMoAgAgA0EEaigCABDCICADQRRBBBCeEgsgBUEANgI8AkAgBSgCQCIDRQ0AIAMoAgAiBhDGAyAGQeAAQQgQnhIgA0EMQQQQnhILIAVBADYCQCAIQQJGDQMLIAJB2ABqIAEpAxAgASgCIBC6GCAAQZABaiACKQNYIAIoAmAQ5wUaDAILAkAgASgCDCIERQ0AIAEoAgghA0EAIQUCQAJAA0AgBUEBaiEGAkAgAykDAEIBVg0AIANByABqLQAAQQFxDQILIANB0ABqIQMgBiEFIAQgBkcNAAtBACEFDAELIAMQyQgCQCAGIARHDQBBASEFDAELIAVBf3MgBGohBiADQdAAaiEDQQEhBQNAAkACQCADKQMAQgFWDQAgA0HIAGotAABBAXFFDQAgAxDJCCAFQQFqIQUMAQtB0ABFDQAgAyAFQbB/bGogA0HQAPwKAAALIANB0ABqIQMgBkF/aiIGDQALCyABIAQgBWs2AgwLIAEoAhwiA0UNASADQQhqKAIAIgZFDQEgA0EEaigCACEDIAZBDGwhBgNAAkACQCADKAIAIgUNACADQQRqKAIAIAAQ3AMMAQsgACAFEIwBCyADQQxqIQMgBkF0aiIGDQAMAgsLAkAgACgCAEUNACABKAIIQQJHDQAgASgCDCIDKAIIIgZFDQEgAygCBCEDIAZBOGwhBgNAIAMgABC+BAJAIAAoAgBFDQAgACADEIMICwJAIANBMGooAgAiBUUNACAAIAUQjAELIANBOGohAyAGQUhqIgYNAAwCCwsgAUEIaiAAEJYFCyABKAIAQQFHDQAgAkHYAGoQ7RcgAkEwakEgaiABQShqIgYpAwA3AwAgAkEwakEYaiABQSBqIgUpAwA3AwAgAkEwakEQaiABQRhqIgQpAwA3AwAgAkEwakEIaiABQRBqIgMpAwA3AwAgASkDCCEMIAEgAikDWDcDCCADIAJB2ABqQQhqIgcpAwA3AwAgBCACQdgAakEQaiIJKQMANwMAIAUgAkHYAGpBGGoiCikDADcDACAGIAJB2ABqQSBqIgspAwA3AwAgAiAMNwMwIAIgACACQTBqQQEQXiABQQhqIQACQAJAAkAgAigCAEFtaiIIQQIgCEECSRsOAwABAgALIAEpAwAhDCABQQk2AgAgAkHYAGpBMGogAUEwaikDADcDACACQdgAakEoaiAGKQMANwMAIAsgBSkDADcDACAKIAQpAwA3AwAgCSADKQMANwMAIAcgACkDADcDACADQQA2AgAgAEIBNwMAIAIgDDcDWAJAIAynQQlGDQAgAkHYAGoQpgUMAwsgAkHgAGoQ1wMMAgsgABD0BCAAQSBqIAJBKGopAwA3AwAgAEEYaiACQSBqKQMANwMAIABBEGogAkEYaikDADcDACAAQQhqIAJBEGopAwA3AwAgACACKQMINwMADAELIAJB2ABqQSxqIAJBKGopAwA3AgAgAkHYAGpBJGogAkEgaikDADcCACACQdgAakEcaiACQRhqKQMANwIAIAJB2ABqQRRqIAJBEGopAwA3AgAgAkHYAGpBDGogAkEIaikDADcCACACIAIpAwA3AlwgARCmBSABQQk2AgAgASACKQJYNwIEIAFBDGogBykCADcCACABQRRqIAkpAgA3AgAgAUEcaiAKKQIANwIAIAFBJGogCykCADcCACABQSxqIAJB2ABqQShqKQIANwIAIAFBNGogAkGIAWooAgA2AgALIAJBkAFqJAALzRECB38DfiMAQYAEayICJAACQAJAAkACQAJAIAAtAEUNACACQYACOwDEASABKAIEIQMCQCABKAIIIgRFDQAgBEEobCEFIAMhBgNAIAYgAkHEAWoQ8wggBkEoaiEGIAVBWGoiBQ0ACwsCQAJAIAEoAgwiBygCAEGAgICAeEcNACACLQDEAQ0BIAcoAgQgAkHEAWoQlQEMAQsgBygCCCIFRQ0AIAItAMQBDQAgBygCBCEGIAVBMGwhBQNAAkAgAi0AxAENACAGIAJBxAFqEPQCCyAGQTBqIQYgBUFQaiIFDQALCyACLQDEAUEBRw0AIARBKGwhBgNA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SAJAAkAgAS0AyAEiCEF9ag4FAwEBAQABCyABEIcODAELIARBBzoAhAIgBCAIOgDwASAEQcwAaiAEQfABahDWECABKALEASEIIAEoAsABIQ8gBEEBNgLUASAEQZjvmwE2AtABIARCATcC3AEgBCAWNwNwIAQgBEHwAGo2AtgBIARBiAFqIARB0AFqEI0VIBEgBEHMAGpBCGooAgA2AgAgCiAEKQJMNwIAIAEgDyAIIARBiAFqEK8aDAALCwJAIAQoAkAiCEGAgICAeEcNACANIQcMAgsgBCAHNgI8IAQgDTYCOCAEIAg2AjQgARCHDiABKAK8ASEBAkBBCEEwEOsfIgdFDQAgByABNgIcIAcgAjYCGEEAIQYgB0EAOgAUIAdBADYCECAHIAk2AgwgByAFNgIIIAcgFTcDACAHIAQpAjQ3AiAgByADOgAtIAdBADoALCAHQShqIARBNGpBCGooAgA2AgAMAwsACyABKALEASEHIAEoAsABIQogBEEoaiAIEN4bIARBATYC1AEgBEGY75sBNgLQASAEQgE3AtwBIARBigWtQiCGQeyhmwGthDcDcCAEIARB8ABqNgLYASAEQYgBaiAEQdABahCNFSAEQZwBaiAEQTBqKAIANgIAIAQgBCkCKDcClAEgCiAHIARBiAFqEIUVIQcgAS0AyAFBogFHDQAgARDHESEIIAEQhw4gASAIEOURCyAVEMYdCyAAIAc2AgQgACAGNgIAIARBkAJqJAAL4RACC38CfiMAQfAAayICJAACQAJAAkACQAJAAkACQAJAAkACQCAAKAIADgkAAQIDBAUGBwgACwJAIAAoAgwiA0UNACAAKAIIIQQgA0HIAGwhBSABQSxqIQYgAUGAAWohB0EAIQgDQAJAAkACQAJAIAQgCGoiAykDACINQn18Ig6nQQFqQQAgDkICVBsOAwABAgALIANBMGoiCSgCACEKAkAgAS0AkAENACAKRQ0AIAJB4ABqIANBIGopAwAgChC6GCAHIAIpA2AgAigCaBDnBRogAykDACENCwJAIA1CAlENACANp0EBcQ0AIAEtAJABDQAgA0EYaigCACILRQ0AIAJB4ABqIANBCGopAwAgCxC6GCAHIAIpA2AgAigCaBDnBRoLIAJB4ABqIANBIGoiAykDACAJKAIAELoYIAYgAikDYCACKAJoQQEQygsgASAD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QcgAakHXrJsBQQEQuAwgAy0AYEEERg0BIAMpA2AiDUL/AYNCBFENASAAIA03AgAMAgsgACANNwIADAELIAEoAgQhBiADQeAAaiACIAUgASgCCCIHQZCDkAEgBxDWFwJAAkACQCADLQBgQQVGDQAgAykDYCENDAELIANB4ABqEIQfAkAgB0UNACADQQE6AFYgA0HAAGogBhCwEwJAIAItAF0NACADQeAAaiACEOIOIAMtAGBBBEYNACADKQNgIg1C/wGDQgRSDQILIANBADoAVyAGQShqIQggByEJQQAhCkEAIQsDQAJAAkACQAJAAkACQCAJRQ0AIANBOGogCEFYaiIMELATIANB4ABqIAIgBEGQg5ABIAogCyADQdcAaiADQdYAahChBQJAIAMtAGBBBEYNACADKQNgIg1C/wGDQgRSDQkLIAwoAgAOAwECAwELAkAgBiAHQThsakFIaiIIRQ0AIANBCGogCBCwEwsgA0HgAGogAiAFIARBkIOQASAKIAsQuQIgAy0AYEEERg0GIAMpA2AiDUL/AYNCBFINBwwGCyADQTBqIAhBYGoiChDSEiADQeAAaiACIAMoAjBBABCVAgJAAkAgAy0AYEEERg0AIAMpA2AiDUL/AYNCBFINAQsgA0EoaiAKENISAkAgAygCKCILRQ0AIANB4ABqIAIgCxC0GiADLQBgQQRGDQAgAykDYCINQv8Bg0IEUg0BCyADQeAAaiAKIAIQwgUCQCADLQBgQQRGDQAgAykDYCINQv8Bg0IEUg0BCyADQQA2AmAgA0HYAGogAiADQeAAakGhxJsBQQEQuAwCQCADLQBYQQRGDQAgAykDWCINQv8Bg0IEUg0BCwJAIAItAF0NACADQeAAaiACEOIOIAMtAGBBBEYNACADKQNgIg1C/wGDQgRSDQELIANB4ABqIAggAhDbIAJAIAMtAGBBBEYNACADKQNgIg1C/wGDQgRSDQELIANBIGogChDSEiADKAIkIgpFDQQgA0HgAGogAiAKELQaIAMtAGBBBEYNBCADKQNgIg1C/wGDQgRRDQQLIA1C/wGDQgRSDQIMAwsgCEFkaigCACELIANB4ABqIAIgCEFgaigCACIKQQAQlQICQAJAIAMtAGBBBEYNACADKQNgIg1C/wGDQgRSDQELAkAgCkUNACADQeAAaiACIAoQtBogAy0AYEEE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NgIIIAMgBCACQShqEM4FDQAgAkECNgIsIAJBrPqDATYCKCACQgE3AjQgAkEqNgIMIAIgAEE0ajYCCCACIAJBCGo2AjAgAyAEIAJBKGoQzgUNACACQQI2AiwgAkHM+oMBNgIoIAJCATcCNCACQSo2AgwgAiAAKAIgIhk2AiQgAiACQQhqNgIwIAIgAkEkajYCCCADIAQgAkEoahDOBQ0AIAJBAjYCLCACQfyegAE2AiggAkIBNwI0IAJBKjYCDCACIABBwAJqNgIIIAIgAkEIajYCMCADIAQgAkEoahCxHg0AIAJBAjYCLCACQaSfgAE2AiggAkIBNwI0IAJBKjYCDCACIABBxAJqNgIIIAIgAkEIajYCMCADIAQgAkEoahCxHg0AIAJBAjYCLCACQcifgAE2AiggAkIBNwI0IAJBKjYCDCACIABBOGo2AgggAiACQQhqNgIwQQEhEyADIAQgAkEoahCxHg0BIAJBAjYCLCACQeCfgAE2AiggAkIBNwI0IAJBygA2AgxBASETIAJBASAAKAI8dDYCJCACIAJBCGo2AjAgAiACQSRqNgIIIAMgBCACQShqELEeDQEgAkECNgIsIAJBgKCAATYCKCACQgE3AjQgAkHGADYCDCACIABBwABqNgIIIAIgAkEIajYCMCADIAQgAkEoahCxHg0BIAJBoKCAATYCKCACQgE3AjQgAkEqNgIMIAAoAjAhFyAAKAIUIRQgACgCCCEdIAJBAjYCLCACIBRBDGwgHSAZakECdGogACgCJGogF0EAIAEbajYCJCACIAJBCGo2AjAgAiACQSRqNgIIIAMgBCACQShqELEeDQEgAkEANgI4IAJBATYCLCACQeD6gwE2AiggAkIENwIwIAMgBCACQShqELEeIRMMAQtBASETCyACQcAAaiQAIBMLhhEBCn8jAEGwAWsiAyQAAkACQCABKAIAIgQtABQiBUECRg0AIAVBAXENACAAIAEoAgQgASgCCCACQRxqQQAQlw8MAQsCQAJAAkACQAJAAkACQAJAAkAgAigCAEGAgICAeHMiBUECIAVBAkkbDgMCAAECCyADQeAAaiACKAIIIAIoAgwQpQggAkEcaiEGDAILIAIoAhQhBSACKAIQIQcgA0GYAWogAigCBCACKAIIEMUFIANBpAFqIAcgBRDFBSADQYgBaiADKAKcASIHIAMo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EKgXAkAgAygCKEGAgICAeEcNACADQeAAaiAEIAItADQgA0EoakEEahCtGyADKAJgIgFBgICAgHhGDQACQEEkRQ0AIABBBGogA0HgAGpBBGpBJPwKAAALIAAgATYCAAJAIAMoAigiAUGAgICAeEcNACADKAIsIAMoAjBBBEEIEMARDAILIAEgAygCLEEBQQEQwBEMAQtBKEUNACAAIANBKGpBKPwKAAALIANBsAFqJAAL/g8CC38BfiMAQZABayICJAACQAJAIAEQgAsNACABKAIAQQFGDQEgASkDACENIAFCATcDACACQeAAakEoaiABQShqKQMANwMAIAJB4ABqQSBqIAFBIGopAwA3AwAgAkHgAGpBGGogAUEYaikDADcDACACQeAAakEQaiABQRBqKQMANwMAIAJB4ABqQQhqIAFBCGoiAykDADcDACADQQA2AgAgAiANNwNgIAJB4ABqENcDDAELAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAEoAgAOEwASEgECAwQFBgcICQoLDA0ODxAACyAAIAFBBGoQwQIMEAsgACABKAIEEIwBIAAgASgCCBDfAQwPCyABKAIMIgNFDQ4gACADEIwBDA4LIAFBADoAJCAAIAEoAigQ3wEMDQsgAS0AJEECRg0NIAFBADoAJAwMCyABLQAkQQJGDQwgAUEAOgAkDAsLIAAgASgCBBCMASAAIAEoAggQ3wEgASgCFCIDRQ0KIAAgAxDfAQwKCyAAIAEoAhAQjAEgASgCDCIERQ0JIAEoAgghAyAEQRhsIQQDQAJAIANBFGooAgAiBUUNACAAIAUQjAELIAAgAxDBAiADQRhqIQMgBEFoaiIEDQAMCgsLIAAgASgCBBCMAQwICyAAIAEoAgQiA0HIAGoQwQIgA0HgAGohBAJAIAMoAgAiBUEIRg0AIANBKGohBgJAIAVBB0YNACADIAAQvgQgACgCAEUNACAAIAMQgwgLIAAgBhDBAgsgBCgCAEGAgICAeEYNByAAIAQQwQIMBwsgACABKAIEEIwBIAAgASgCCBDfAQwGCyAAIAEoAgQQjAEgACABKAIIEN8BDAULAkAgASgCBCIDQQJGDQACQCADQQFxRQ0AIAAgASgCCBCMAQwBCyABKAIIIgMoAggiBEUNACADKAIEIgcgBEE4bGohCANA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AAAAwKCjIA4gASARoaEiACABIACioKGhRAAAAAAAAPA/oCIBvSILQiCIp2oiA0GAgMAASA0AIAOtQiCGIAtC/////w+DhL8hAQwBCyABIAUQ/Q0hAQsgDyABoiEODAELRAAAAAAAAPA/IA6jIA4gC0IAUxshDiAMQn9VDQACQCAIIAdBgIDAgHxqcg0AIA4gDqEiASABow8LIA6aIA4gCEEBRhsPCyAOC5EQAg5/A34jAEGwBmsiAyQAAkACQCABKAIAQQFxRQ0AIANBkARqQRhqIAFBKGopAwA3AwAgA0GgBGogAUEgaikDADcDACADIAEpAxA3A5AEIAMgAUEYaikDADcDmAQMAQsgA0GoBGpCADcDACADQaAEakIANwMAIANCADcDmAQgA0IANwOQBAsCQAJAAkACQCACLwC5AkGzBnFFDQACQAJAIAEtAFtBAXENAEGAASEEA0AgBEH/AXFBAWoiBUH/AXEgBUcNAiADQcAAaiADQZAEaiAEQYABcUEDdmoiBikDACAGKQMIIARB/wBxEI0SIAUhBCADKQNAQgGDUEUNAAwECwtBgAEhBANAIANBMGpCAUIAIARB/wBxEIwSIANBkARqIARBA3ZBEHFqIgUgBSkDACADKQMwhDcDACAFIAUpAwggAykDOIQ3AwggBEH/AXFBAWoiBEH/AXEgBEYNAAwCCwsgAykDqARCAFkNAQsgA0GIAWogAykDmAQiETcCACADQZABaiADQZAEakEQaikDACISNwIAIANB0AFqQRhqIANBkARqQRhqKQMAIhM3AwAgA0HQAWpBEGogEjcDACADQdAAakEYaiATNwMAIANB0ABqQRBqIBI3AwAgAyADKQOQBCISNwKAASADIBE3A9gBIAMgEjcD0AEgAyARNwNYIAMgEjcDUAJAAkAgAUHaAGotAAAiBEECRg0AIARBAXENAEEAIQQCQEGAAkUNACADQbAEakEAQYAC/AsACwNAIANBsARqIARqIAQ6AAAgBEEBaiIEQYACRw0ADAILCyADQaABakEYaiACQagCaikDADcDACADQaABakEQaiACQaACaikDADcDACADIAIpA5ACNwOgASADIAJBmAJqKQMANwOoAQJAIANB0ABqQbDLhAFBIBCSFUUNAEEAIQUDQCAFQYACIAVBgAJLGyEGA0AgBiAFIgRGDQIgA0EgaiADQdAAaiAEQQN2QfD///8BcWoiBSkDACAFKQMIIARB/wBxEI0SIARBAWohBSADKQMgQgGDUA0ACwJAAkAgBEH+AU0NACAEIQcMAQsgBCEHA0AgA0EQaiADQdAAaiAFQQN2QfD///8BcWoiBikDACAGKQMIIAVB/wBxEI0SIAMpAxBCAYNQDQEgBSEHIAVBAWoiBiEFIAZBgAJHDQALQf8BIQdBgAIhBQsgA0GgAWogBCAHEJ4NDAALCyADQbAEaiADQaABahDQDAtBGCEFAkAgAS0AWUEBcUUNACACKALcAkEYbEEYaiEFCyACKALQAiEEIAMtAK8GIQggA0EIahCrDyADKAIMIQYgAygCCCIHIAcoAgAiCUF/ajYCAAJAIAlBAUcNACAHIAYQ+hcLAkACQAJAAkACQCABKAJEIglBgICAASABKAJAIgobIgcgBEEMbEEUQSAgCEEBamdrdGogBWogBkEDbGogBEEFbCACKALcAkECdGpBCWoiBGogBEEBdGpB5ABqIgRPDQAgAS0AXUEBcUUNASAEIQcLIAMtAK8GIQYCQEGAAkUNACADQfABakEAQYAC/AsACyADQagCakGBAjsAACADQbkCakKBgoSIkKDAgAE3AAAgA0HBAmpCgYKEiJCgwIABNwAAIANByQJqQYECOwAAIANB2QJqQoGChIiQoMCAATcAACADQeECakKBgoSIkKDAgAE3AAAgA0HpAmpBgQI7AAAgA0EEOgD9ASADQoGChIiQoMCAATcAoAIgA0KBgoSIkKDAgAE3ALECIANCgYKEiJCgwIABNwDRAiACLQDgAiEEIANBAzoA+gEgA0EBOgDPAgJAAkAgBEF2ag4EAQAAAQALIANB8AFqIARqQQU6AAALIAEtAFghCCABLQA8IgRBA0YNAiAEQQJGDQIgASgCMCIFIAUoAgAiC0EBajYCACALQX9MDQEgASgCOCEMIAEoAjQhDQwDCyAAQgA3AwggAEICNwMAIAAgBzYCGCAAIAQ2AhQgAEEqNgIQDAQLAAsLIAZBAWohBiABQdoAaiELAkACQCABKAIAQQFxDQBCACERDAELIANB8ANqQRhqIAFBKGopAwA3AwAgA0GABGogAUEgaikDADcDACADIAEpAxA3A/ADIAMgAUEYaikDADcD+ANCASERCyAGZyEGIAstAAAhCyABLQBb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AgAMBgsgAygCACIEIAEoAggiBUYNBCACQbABaiABEOYDIAJB0ABqQQhqIgYgAkHIAWopAgA3AwAgAkHQAGpBEGoiByACQdABaikCADcDACACIAIpAsABNwNQIAIoArwBIQQgAigCuAEhCCACKAK0ASEJAkAgAigCsAEiCkEiRg0AIAAgAikC2AE3AiwgAEE8aiACQegBaikCADcCACAAQTRqIAJB4AFqKQIANwIAIAAgBDYCECAAIAg2AgwgACAJNgIIIAAgAikDUDcCFCAAQRxqIAYpAwA3AgAgAEEkaiAHKQMANwIAIAAgCjYCBCAAQYSAgIB4NgIADAYLIAJB+ABqQQhqIAYpAwA3AwAgAkH4AGpBEGogBykDADcDACACIAIpA1A3A3ggAiABEL4JIgY2ApQBIAEQmggaAkACQCAGQSlGDQAgBkE6Rg0BIAJBADYCsAEgAkGUAWpBuIaFASACQbABakG8hoUBELQZAAsCQCAERQ0AIAJBrAFqIANBCGooAgA2AgAgACACKQN4NwIQIAAgBDYCDCAAIAg2AgggACAJNgIEIABBg4CAgHg2AgAgAkGYAWpBCGoiASACQSBqQQhqKAIANgIAIABBGGogAkH4AGpBCGopAwA3AgAgAEEgaiACQfgAakEQaikDADcCACACIAMpAgA3AqQBIAIgAikCIDcDmAEgAEE4aiACQZgBakEQaikDADcCACAAQTBqIAEpAwA3AgAgACACKQOYATcCKAwHCyACQRs2ArABIABBBGogASgCBCAFIAJBOGogAkGwAWoQ0QwgAEGEgICAeDYCACAJIAhBBEEcEMARDAYLIAAgBDYCDCAAIAg2AgggACAJNgIEIAAgAikDeDcCECAAQRhqIAJB+ABqQQhqKQMANwIAIABBIGogAkH4AGpBEGopAwA3AgAgAkHEAWogA0EIaigCACIBNgIAIAJBsAFqQQhqIAE2AgAgAiADKQIAIgs3ArwBIAIgCzcDsAEgAkEIaiACQbABahCdFUEALQDA8Z0BGiACKAIMIQNBCBCFASIBRQ0DIAFBADYCACAAIAIpAiA3AjAgACABNgIsIABBgoCAgHg2AgAgASADNgIEIABBOGogAkEgakEIaikCADcCACAAQcAAaiACQSBqQRBqKQIANwIADAULIAJBsAFqIAEgBBDuASACKAKwASEBAkBB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BEF8akEAIARBe2pBCEkbDgkAAQIDBAcHBQYACyABIAAQzwMMBgsgASAAQQhqEIIEDAULQQAhAyACQfAAakEAKQOY+5wBIgk3AgAgAkGAAWogCTcCACACQQA2AaoBIAJBADYCZCACQoCAgICAATcCXCACQoCAgICAATcCmAEgAkKAgICAwAA3AogBIAJBADYCoAEgAkEAOgCUASACQQA2ApABIAIgAS8BeDsBqAEgAiABKAJ0NgKkASACQQApA5D7nAEiCTcCaCACIAk3AnggAiABLQB+OgCuASABQSxqIQUgACgCICEGAkADQCADQdQARg0BIAEgA2pBLGoiBCgCACEHIAQgAkHcAGogA2oiCCgCADYCACAIIAc2AgAgA0EEaiEDDAALCwJAIAYoAhQiA0UNACAGKAIQIQQgA0EMbCEHIAEtAHkhCCABLQAoIQADQCAEKAIAIQMgAUEAOgB5IAFBADoAKAJAIAMoAgBBGkcNACACQbABaiADKQMIIANBGGooAgAQuhggBSACKQOwASACKAK4ARDRCgsgBEEMaiEEIAMgARB3IAEgADoAKCABIAg6AHkgB0F0aiIHDQALCwJAIAYoAggiBEUNACAGKAIEIQMgBEEGdCEEA0AgASADEKcLIANBwABqIQMgBEFAaiIEDQALCwJAIAYoAhhBgICAgHhGDQAgBkEgaigCACIERQ0AIAZBHGooAgAhAyAEQTBsIQQDQCABQQA6AH0gAyABEGsgA0EwaiEDIARBUGoiBA0ACwsgBSACQdwAahCTAwwECwJAIAAoAghBA0cNACABLQAoIQQgAUEAOgAoIAEtAHkhByABQQA6AHkCQCAAKAIMIgMoAgBBGkcNACACQbABaiADKQMIIANBGGooAgAQuhggAUEsaiACKQOwASACKAK4ARDRCgsgAyABEHcgASAEOgAoIAEgBzoAeQsCQCAAKAI8IgNFDQAgAS0AKCEEIAFBADoAKCABLQB5IQcgAUEAOgB5AkAgAygCAEEaRw0AIAJBsAFqIAMpAwggA0EYaigCABC6GCABQSxqIAIpA7ABIAIoArgBENEKCyADIAEQdyABIAQ6ACggASAHOgB5CyAAKAI4IgRFDQMgACgCNCEDIARBDGwhByABQSxqIQUgAS0AeSEIIAEtACghAANAIAFBADoAeSABQQA6ACgCQCADKAIAIgQoAgBBGkcNACACQbABaiAEKQMIIARBGGooAgAQuhggBSACKQOwASACKAK4ARDRCgsgA0EMaiEDIAQgARB3IAEgADoAKCABIAg6AHkgB0F0aiIHDQAMBAsLAkAgACgCJCIDRQ0AIAEtACghBCABQQA6ACggAS0AeSEHIAFBADoAeQJAIAMoAgBBGkcNACACQbABaiADKQMIIANBGGooAgAQuhggAUEsaiACKQOwASACKAK4ARDRCgsgAyABEHcgASAEOgAoIAEgBzoAeQsgACgCNCIERQ0CIAAoAjAhAyAEQQxsIQcgAUEsaiEFIAEtAHkhCCABLQAoIQADQCABQQA6AHkgAUEAOgAoAkAgAygCACIEKAIAQRpHDQAgAkGwAWogBCkDCCAEQRhqKAIAELoYIAUgAikDsAEgAigCuAEQ0QoLIANBDGohAyAEIAEQdyABIAA6ACggASAIOgB5IAdBdGoiBw0ADAMLCyACQRxqQQApA5j7nAEiCTcCACACQSxqIAk3AgAgAkEANgFWIAJBADYCECACQoCAgICAATcCCCACQoCAgICAATcCRCACQoCAgIDAADcCNCACQQA2AkwgAkEAOgBAIAJBADYCPCACIAEvAXg7AVQgAiABKAJ0NgJQIAJBACkDkPucASIJNwIUIAIgCTcCJCACIAEtAH46AFogAUEsaiEFAkADQCADQdQARg0BIAEgA2pBLGoiBCgCACEHIAQgAkEIaiADaiIIKAIANgIAIAggBzYCACADQQRqIQMMAAsLAkAgACgCDCIERQ0AIAAoAgghAyAEQTBsIQQDQCABQQA6AH0gAyABEGsgA0EwaiEDIARBUGoiBA0ACwsgBSACQQhqEJMDDAELAkAgACgCCCIDQQVGDQAgA0EDRw0AIAEtACghBCABQQA6ACggAS0AeSEHIAFBADoAeQJAIAAoAgwiAygCAEEaRw0AIAJBsAFqIAMpAwggA0EYaigCABC6GCABQSxqIAIpA7ABIAIoArgBENEKCyADIAEQdyABIAQ6ACggASAHOgB5CwJAIAAoAjwiA0UNACABLQAoIQQgAUEAOgAoIAEtAHkhByABQQA6AHkCQCADKAIAQRpHDQAgAkGwAWogAykDCCADQRhqKAIAELoYIAFBLGogAikDsAEgAigCuAEQ0QoLIAMgARB3IAEgBDoAKCABIAc6AHkLIAAoAjgiBEUNACAAKAI0IQMgBEEMbCEHIAFBLGohBSABLQB5IQggAS0AKCEAA0AgAUEAOgB5IAFBADoAKAJAIAMoAgAiBCgCAEEaRw0AIAJBsAFqIAQpAwggBEEYaigCABC6GCAFIAIpA7ABIAIoArgBENEKCyADQQxqIQMgBCABEHcgASAAOgAoIAEgCDoAeSAHQXRqIgcNAAsLIAJBwAFqJAAL8w4CDn8BfiMAQYABayICJAACQAJAAkACQAJAAkACQAJAAkACQCABKAIAQXtqIgNBBCADQQZJGw4GAAECAwQFAAsgASgCGCEDIAEoAhQhBCABKAIQIQUCQCABKQMIIhBCA4NCAFINACAQpyIGIAYoAgAiBkEBajYCACAGQX9MDQcLIAAgAzYCGCAAIAQ2AhQgACAFNgIQIAAgEDcDCCAAQQU2AgAgACABLQAcOgAcDAULIAJB0ABqIAFBCGoQ+wRBAC0AwPGdARpBwAAQhQEiA0UNBSADIAEoAigQRCAAQSBqIAJB0ABqQRhqKQMANwMAIABBGGogAkHQAGpBEGopAwA3AwAgAEEQaiACQdAAakEIaikDADcDACAAIAIpA1A3AwggAEEGNgIAIAAgAzYCKAwECyABKAIgIQQgASgCHCEFIAEoAhghBiABKAIMIQcgASgCCCEIAkAgASkDECIQQgODQgBSDQAgEKciAyADKAIAIgNBAWo2AgAgA0F/TA0FC0EALQDA8Z0BGiABLQAkIQlBwAAQhQEiA0UNBCADIAEoAigQRCAAIAM2AiggACAJOgAkIAAgBDYCICAAIAU2AhwgACAGNgIYIAAgEDcDECAAIAc2AgwgACAINgIIIABBBzYCAAwDCyABKAJEIQggASgCQCEJIAJBKGogAUEIahD7BAJAAkAgASgCSCIDDQBBACEGDAELQQAtAMDxnQEaQQwQhQEiBkUNBEEALQDA8Z0BGiADKAIIIQUgAygCBCEHQeAAEIUBIgRFDQQgBCADKAIAEGQgBiAFNgIIIAYgBzYCBCAGIAQ2AgALQYCAgIB4IQcCQAJAIAEoAihBgICAgHhHDQAMAQsgASgCLCEDIAEoAjwhCiABKAI4IQsgASgCNCEMIAJB0ABqIAEoAjAiDUEIQTAQzA0gAigCVCEHIAIoAlBBAUYNBSACKAJYIQ4CQCAHRQ0AIA1BMGwhBCAOIQEgByEFA0AgBEUNASACQdAAaiADEIABIAFBKGogAkHQAGpBKGopAwA3AwAgAUEgaiACQdAAakEgaikDADcDACABQRhqIAJB0ABqQRhqKQMANwMAIAFBEGogAkHQAGpBEGopAwA3AwAgAUEIaiACQdAAakEIaikDADcDACABIAIpA1A3AwAgAUEwaiEBIARBUGohBCADQTBqIQMgBUF/aiIFDQALCyANrUIghiAOrYQhEAsgACACKQMoNwMIIABBIGogAkEoakEYaikDADcDACAAQRhqIAJBKGpBEGopAwA3AwAgAEEQaiACQShqQQhqKQMANwMAIAAgBjYCSCAAIAg2AkQgACAJNgJAIAAgCjYCPCAAIAs2AjggACAMNgI0IAAgEDcCLCAAIAc2AiggAEEINgIADAILIAEoAmQhCSABKAJgIQwgAkEIaiABEPsEQQchCAJAIAEoAiBBB0YNACACQdAAaiABQSBqEKcCIAJBMGogAkHcAGopAgA3AwAgAkE4aiACQeQAaikCADcDACACQcAAaiACQewAaikCADcDACACQShqQSBqIAJB9ABqKAIANgIAIAIgAikCVDcDKCACKAJQIQgLQQAtAMDxnQEaQSgQhQEiB0UNAiAHIAEoAmgQpwJBgICAgHghBgJAAkAgASgCSEGAgICAeEcNAAwBCyABKAJMIQMgASgCXCENIAEoAlghCiABKAJUIQsgAkHQAGogASgCUCIOQQhBMBDMDSACKAJUIQYgAigCUEEBRg0FIAIoAlghDwJAIAZFDQAgDkEwbCEEIA8hASAGIQUDQCAERQ0BIAJB0ABqIAMQgAEgAUEoaiACQdAAakEoaikDADcDACABQSBqIAJB0ABqQSBqKQMANwMAIAFBGGogAkHQAGpBGGopAwA3AwAgAUEQaiACQdAAakEQaikDADcDACABQQhqIAJB0ABqQQhqKQMANwMAIAEgAikDUDcDACABQTBqIQEgBEFQaiEEIANBMGohAyAFQX9qIgUNAAsLIA6tQiCGIA+thCEQCyAAIAIpAwg3AwAgACACKQMoNwIkIABBGGogAkEIakEYaikDADcDACAAQRBqIAJBCGpBEGopAwA3AwAgAEEIaiACQQhqQQhqKQMANwMAIABBLGogAkEoakEIaikDADcCACAAQTRqIAJBKGpBEGopAwA3AgAg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AiADQZABaiADQewBaiADQdgAaiADQfQAahC+BSADKAKUASEPAkAgAygCkAEiBEEiRg0AAkBBOEUNACAAQQhqIANBkAFqQQhqQTj8CgAACyAAIA82AgQgACAENgIAQQEhBAwCC0EBIQRBAiENQQAhDgsCQAJAIAUoAgAgC0YNACABEL4JQf0ARg0BCyADQaQBaiAFQQhqKAIANgIAIANBkAFqQQhqIANBCGooAgA2AgAgAyADKQMANwOQASADIAUpAgA3ApwBIANBGjYC7AEgACABKAIEIAsgA0GQAWogA0HsAWoQ0QwMAQtBASEQAkAgARDMG0UNACABEL4JQT9HDQAgARCaCBpBACEQCyADQeQBaiAFQQhqKAIANgIAIANB0AFqQQhqIANBCGooAgA2AgAgAyADKQMANwPQASADIAUpAgA3AtwBIA4gDCAPTXINASADQRg2AuwBIAAgASgCBCALIANB0AFqIANB7AFqENEMCyAKRQ0CIARFDQIgAygCGEEiRg0CIAMoAjQgAygCOEEBQQEQwBEMAgsgCSEBAkACQAJAAkACQAJAAkACQCAHQX5qDgoABwcBBwIDBAUGAAsgCUEEaiEBDAYLIAlBHGohAQwFCyAJQdgAaiEBDAQLIAlBKGohAQwDCyAJQTBqIQEMAgsgCUEMaiEBDAELIAlBDGohAQsgA0GQAWpBFGogBUEIaigCADYCACADQZABakEIaiIEIAFBCGooAgA2AgAgA0HsAWpBFGogA0HQAWpBCGopAwA3AgAgA0GIAmogA0HQAWpBEGopAwA3AgAgAyADKQPQATcC+AFBAC0AwPGdARogAyAFKQIANwKcASADIAEpAgA3A5ABQQgQhQEiAUUNACABIAk2AgQgASAHNgIAIANBnAJqIAQpAwA3AgAgA0GkAmogA0GQAWpBEGopAwA3AgAgAyADKQOQATcClAIgAyAQOgCsAiADIA82AvQBIAMgDDYC8AEgAyANNgLsASADIAE2ApACIAggA0HsAWoQ9xo2AgQgCEEINgIAIAIgBjYCCAJAQSRFDQAgAEEEaiACQST8CgAACyAAQSI2AgAMAwsACyADQRBqELADCyACEOUXCyADQbACaiQAC5QPAQV/IwBBEGsiAiQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgC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IQAgBEGof2oiBA0ACwsCQCADQZgBaigCACIARQ0AIANBlAFqKAIAIgYgAEEobGohBwNAAkACQAJAAkACQAJAAkAgBigCAA4FBgABAgUGCyAGKAIEQQFHDQUgBigCCCIAKAIAQRpHDQMgAkGQAWogASgCACABKAIEIABBCGoiBBC1DCACKAKQAUEyRg0FIAAQyQEgAEE4aiACQZABakE4aikDADcDACAAQTBqIAJBkAFqQTBqKQMANwMAIABBKGogAkGQAWpBKGopAwA3AwAgAEEgaiACQZABakEgaikDADcDACAAQRhqIAJBkAFqQRhqKQMANwMAIABBEGogAkGQAWpBEGopAwA3AwAgBCACQZABakEIaikDADcDACAAIAIpA5ABNwMADAULIAYoAgQiACgCAEEaRw0BIAJB0ABqIAEoAgAgASgCBCAAQQhqIgQQtQwgAigCUEEyRg0EIAAQyQEgAEE4aiACQdAAakE4aikDADcDACAAQTBqIAJB0ABqQTBqKQMANwMAIABBKGogAkHQAGpBKGopAwA3AwAgAEEgaiACQdAAakEgaikDADcDACAAQRhqIAJB0ABqQRhqKQMANwMAIABBEGogAkHQAGpBEGopAwA3AwAgBCACQdAAakEIaikDADcDACAAIAIpA1A3AwAMBAsCQCAGKAIEIggtAGxBAkcNACAIQcAAaiEAA0AgACgCGCIALQAsQQJGDQALCwJAIAhBhAFqKAIAIgRFDQAgCEGAAWooAgAhACAEQdgAbCEEA0ACQAJAAkAgACgCAEEFRw0AIABBBGooAgAiBSgCAEEaRw0BIAJBkAJqIAEoAgAgASgCBCAFQQhqIgkQtQwgAigCkAJBMkYNAiAFEMkBIAVBOGogAkGQAmpBOGopAwA3AwAgBUEwaiACQZACakEwaikDADcDACAFQShqIAJBkAJqQShqKQMANwMAIAVBIGogAkGQAmpBIGopAwA3AwAgBUEYaiACQZACakEYaikDADcDACAFQRBqIAJBkAJqQRBqKQMANwMAIAkgAkGQAmpBCGopAwA3AwAgBSACKQOQAjcDAAwCCyAAIAEQpwgMAQsgBSABEEYLIABB2ABqIQAgBEGof2oiBA0ACwsCQCAIQZgBaigCACIERQ0AIAhBlAFqKAIAIQAgBEEobCEEA0AgASAAELsCIABBKGohACAE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gHg2ApABIAMgAjYClAEMBQsgASgCxAEhBiABKALAASEHIANBzAFqIAIQ3hsgA0EBNgK0AiADQZjvmwE2ArACIANCATcCvAIgA0GKBa1CIIZBiKObAa2ENwPoASADIANB6AFqNgK4AiADQfABaiADQbACahCNFSADQYQCaiADQdQBaigCADYCACADIAMpAswBNwL8ASAHIAYgA0HwAWoQhRUhAgJAIAEtAMgBQaIBRw0AIAEQxxEhBiABEIcOIAEgBhDlEQsgA0GBgICAeDYCkAEgAyACNgKUAQwECyABLQDIASEGCyADIAI2AtgBAkAgBkH/AXFBG0cNACABEIcOIANBkAFqQQhqIANBsAFqQQhqKAIANgIAIAMgAjYCoAEgAyAFNgKcASADIAMpArABIg83A5ABIA+nIQIMBgsgASgCxAEhAiABKALAASEHIANB3AFqIAYQ3hsgA0EBNgK0AiADQZjvmwE2ArACIANCATcCvAIgA0GKBa1CIIZByKibAa2ENwPoASADIANB6AFqNgK4AiADQfABaiADQbACahCNFSADQYQCaiADQeQBaigCADYCACADIAMpAtwBNwL8ASAHIAIgA0HwAWoQhRUhAgJAIAEtAMgBQaIBRw0AIAEQxxEhBiABEIcOIAEgBhDlEQsgA0GBgICAeDYCkAEgAyACNgKUASADQdgBahCpHwwCCyADQYGAgIB4NgKQASADIAc2ApQBDAILAAsgA0GwAWoQ1B0LQYGAgIB4IQILIAUQ7x8LAkACQCACQYCAgIB4ag4CAAEDCyABIANBIGoQ8AUgAygCkAFBgYCAgHhHDQMgA0GQAWoQshoMAwsgAygCkAEhAiABIANBIGoQ8AUgAkGBgICAeEcNAgsgA0GQAWoQshoMAQsgASABKAJ4QX5xIARBAXFyNgJ4IAMoApABIQIgAygCoAEhByADKAKcASEGIAMpApQBIQ8gA0EgahD9HiACQYCAgIB4Rg0AIAEgASgCeCINQf98cUGAAXI2AnggAyACNgKwAiADIAc2AsQCIAMgBjYCwAIgAyAPNwK0AiADIANBHGo2ArwCIAMgAUEBIA+nIA9CIIinENsYEK8JIAMoAgQhDgJAAkAgAygCAEEBcUUNACAAIA42AgQgA0GwAmoQ1B0gBhDvHyADQcQCahCpH0GBgICAeCECDAELIAAgDzcCBCABKAK8ASEMIAMoAhwhCRDcGiELIANBxABqQQA7AQAgAEEBOwEkIAAgBzYCICAAIAY2AhwgAEEANgIYIAAgDDYCFCAAIAk2AhAgACAONgIMIANBADYCOCADQgA3AjAgA0IANwI8IAMgCzYCLCADQQA2AiggA0KAgICAgAE3AiAgA0EgahDYHAsgACACNgIAIAEgDTYCeAwBCyAAQYCAgIB4NgIACyADQfACaiQAC5oOAQt/IwBB4AJrIgIkACACQaACaiABEMYXIAIoAqACIQMCQEE4RQ0AIAJB+ABqIAJBoAJqQQRqQTj8CgAACwJAAkAgA0EiRg0AIAIoAtwCIQECQEE4RQ0AIABBCGogAkH4AGpBOPwKAAALIAAgATYCQCAAIAM2AgQgAEGIgMQANgIADAELAkBBOEUNACACQQhqIAJB+ABqQTj8CgAACyABEOADAkACQAJAIAEoAgAoAlAgASgCCCIERg0AIAJBCGpBBGohAyABEL4JQS1HDQIgARCHBEHdAEYNAiABEIcEQS1GDQICQCABEMwbDQAgAEEEaiABELUKIABBiIDEADYCAAwCCyACQaACaiABEMYXIAIoAqACIQUCQEE4RQ0AIAJB+ABqIAJBpAJqQTj8CgAACwJAIAVBIkYNACACKALcAiEBAkBBOEUNACAAQQhqIAJB+ABqQTj8CgAACyAAIAE2AkAgACAFNgIEIABBiIDEADYCAAwCCwJAQThFDQAgAkHAAGogAkH4AGpBOPwKAAALIAJBCGpBCGohBQJAAkACQCACKAIIQf7///8HaiIGQQQgBkEESRsOBQIAAAABAgsgAyEFDAELIAJBCGpBHGohBQsgAkHAAGpBCGohAwJAAkACQCACKAJAQf7///8HaiIGQQQgBkEESRsOBQIAAAABAgsgAkHAAGpBBGohAwwBCyACQcAAakEcaiEDCyACQegBakEUaiADQRRqKAIANgIAIAJB6AFqQQhqIAVBCGooAgA2AgAgAiADKQIMNwL0ASACIAUpAgA3A+gBIAJBoAJqIAJBCGogASgCBCIDIAQQowwgAkGAAmpBCGoiBSACQaACakEQaiIHKQIANwMAIAJBgAJqQRBqIgggAkGgAmpBGGoiCSkCADcDACACQYACakEYaiIKIAJBwAJqIgsoAgA2AgAgAiACKQKoAjcDgAIgAigCpAIhAQJAIAIoAqACIgxBIkYNACAAIAIpAsQCNwIoIABBwABqIAJB3AJqKAIANgIAIABBOGogAkHUAmopAgA3AgAgAEEwaiACQcwCaikCADcCACAAQSRqIAooAgA2AgAgAEEcaiAIKQMANwIAIABBFGogBSkDADcCACAAIAIpA4ACNwIMIAAgATYCCCAAIAw2AgQgAEGIgMQANgIAIAZBBEkNBCACQcAAahDjFAwECyACQaACaiACQcAAaiADIAQQowwgAkH4AGpBCGogBykCADcDACACQfgAakEQaiAJKQIANwMAIAJB+ABqQRhqIAsoAgA2AgAgAiACKQKoAjcDeCACKAKkAiEFAkAgAigCoAIiBkEiRg0AIAAgAikCxAI3AiggAEHAAGogAkHcAmooAgA2AgAgAEE4aiACQdQCaikCADcCACAAQTBqIAJBzAJqKQIANwIAIABBJGogAkGQAWooAgA2AgAgAEEcaiACQYgBaikDADcCACAAQRRqIAJBgAFqKQMANwIAIAAgAikDeDcCDCAAIAU2AgggACAGNgIEIABBiIDEADYCAAwECyACQbABakEIaiACQfgAakEIaikDADcDACACQbABakEQaiACQfgAakEQaikDADcDACACQbABakEYaiACQfgAakEYaigCADYCACACQbABakEkaiACQegBakEIaikDADcCACACQdwBaiACQegBakEQaikDADcCACACIAIpA3g3A7ABIAIgAikD6AE3AswBAkAgASAFTQ0AIAJBAjYCoAIgAEEEaiADIAQgAkHoAWogAkGgAmoQ0QwgAEGIgMQANgIADAQLIAAgAikDgAI3AgQgAEEcaiACQYACakEYaigCADYCACAAQRRqIAJBgAJqQRBqKQMANwIAIABBDGogAkGAAmpBCGopAwA3AgACQEE0RQ0AIABBJGogAkGwAWpBNPwKAAALIAAgBTYCICAAIAE2AgAMAwsgAEEEaiABELUKIABBiIDEADYCAAsgAigCCEH+////B2pBBEkNASACQQhqEOMUDAELAkBBOEUNACACQaACaiACQQhqQTj8CgAACwJAAkACQAJAIAIoAqACQf7///8HaiIFQQQgBUEESSIFGw4FAQAAAgMACyACQQE2AnggAEEEaiABKAIEIAQgAkGgAmpBBGogAkH4AGoQ0QwgAEGIgMQANgIAIAUN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AgBBGkcNACACQYACaiABKAIAIAEoAgQgAEEIaiIGELUMIAIoAoACQTJGDQEgABDJASAAQThqIAJBgAJqQThqKQMANwMAIABBMGogAkGAAmpBMGopAwA3AwAgAEEoaiACQYACakEoaikDADcDACAAQSBqIAJBgAJqQSBqKQMANwMAIABBGGogAkGAAmpBGGopAwA3AwAgAEEQaiACQYACakEQaikDADcDACAGIAJBgAJqQQhqKQMANwMAIAAgAikDgAI3AwAMAQsgACABEEYLIANBDGohAyAFQXRqIgUNAAsLAkAgBEEUaigCACIDRQ0AIARBEGooAgAhACADQdgAbCEDA0AgACABEGggAEHYAGohACADQah/aiIDDQALCyAEKAIwIgBFDQQCQCAAKAIAQRpHDQAgAkHAAWogASgCACABKAIEIABBCGoiARC1DCACKALAAUEyRg0FIAAQyQEgAEE4aiACQcABakE4aikDADcDACAAQTBqIAJBwAFqQTBqKQMANwMAIABBKGogAkHAAWpBKGopAwA3AwAgAEEgaiACQcABakEgaikDADcDACAAQRhqIAJBwAFqQRhqKQMANwMAIABBEGogAkHAAWpBEGopAwA3AwAgASACQcABakEIaikDADcDACAAIAIpA8ABNwMADAULIAAgARBGDAQLAkAgACgCBCIAKAIAQRpHDQAgAkHAAGogASgCACABKAIEIABBCGoiARC1DCACKAJAQTJGDQQgABDJASAAQThqIAJBwABqQThqKQMANwMAIABBMGogAkHAAGpBMGopAwA3AwAgAEEoaiACQcAAakEoaikDADcDACAAQSBqIAJBwABqQSBqKQMANwMAIABBGGogAkHAAGpBGGopAwA3AwAgAEEQaiACQcAAakEQaikDADcDACABIAJBwABqQQhqKQMANwMAIAAgAikDQDcDAAwECyAAIAEQRgwDCyAAKAIQIgBFDQIgAEEIaigCACIDRQ0CIABBBGooAgAhACADQQxsIQMDQCAAIAEQywEgAEEMaiEAIANBdGoiAw0ADAMLCwJAIAAoAgQiACgCAEEaRw0AIAIgASgCACABKAIEIABBCGoiARC1DCACKAIAQTJGDQIgABDJASAAQThqIAJBOGopAwA3AwAgAEEwaiACQTBqKQMANwMAIABBKGogAkEoaikDADcDACAA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CwsCQCAAKAIkIgJFDQAgASACEKcBCyAAKAI0IgVFDQIgACgCMCECIAVBDGwhBQNAIAEgAigCABCnASACQQxqIQIgBUF0aiIFDQAMAwsLIAAoAgwiBUUNASAAKAIIIQIgBUEwbCEFA0AgAiABEI8DIAJBMGohAiAFQVBqIgUNAAwCCwsCQCAAKAIIIgJBBUYNACACQQNHDQAgASAAKAIMEKcBCwJAIAAoAjwiAkUNACABIAIQpwELIAAoAjgiBUUNACAAKAI0IQIgBUEMbCEFA0AgASACKAIAEKcBIAJBDGohAiAFQXRqIgUNAAsLC+ULAQd/IwBBwAJrIgIkAAJAIAAoAggiA0UNACAAKAIEIgQgA0EobGohBQNAAkACQAJAAkACQAJAAkAgBCgCAA4FBgABAgUGCyAEKAIEQQFHDQUgBCgCCCIAKAIAQRpHDQMgAkHAAWogASgCACABKAIEIABBCGoiAxC1DCACKALAAUEyRg0FIAAQyQEgAEE4aiACQcABakE4aikDADcDACAAQTBqIAJBwAFqQTBqKQMANwMAIABBKGogAkHAAWpBKGopAwA3AwAgAEEgaiACQcABakEgaikDADcDACAAQRhqIAJBwAFqQRhqKQMANwMAIABBEGogAkHAAWpBEGopAwA3AwAgAyACQcABakEIaikDADcDACAAIAIpA8ABNwMADAULIAQoAgQiACgCAEEaRw0BIAJBgAFqIAEoAgAgASgCBCAAQQhqIgMQtQwgAigCgAFBMkYNBCAAEMkBIABBOGogAkGAAWpBOGopAwA3AwAgAEEwaiACQYABakEwaikDADcDACAAQShqIAJBgAFqQShqKQMANwMAIABBIGogAkGAAWpBIGopAwA3AwAgAEEYaiACQYABakEYaikDADcDACAAQRBqIAJBgAFqQRBqKQMANwMAIAMgAkGAAWpBCGopAwA3AwAgACACKQOAATcDAAwECwJAIAQoAgQiBi0AbEECRw0AIAZBwABqIQADQCAAKAIYIgAtACxBAkYNAAsLAkAgBkGEAWooAgAiA0UNACAGQYABaigCACEAIANB2ABsIQMDQAJAAkACQAJAIAAoAgBBfGoOAgMAAQsgAEEEaigCACIHKAIAQRpHDQEgAkGAAmogASgCACABKAIEIAdBCGoiCBC1DCACKAKAAkEyRg0CIAcQyQEgB0E4aiACQYACakE4aikDADcDACAHQTBqIAJBgAJqQTBqKQMANwMAIAdBKGogAkGAAmpBKGopAwA3AwAgB0EgaiACQYACakEgaikDADcDACAHQRhqIAJBgAJqQRhqKQMANwMAIAdBEGogAkGAAmpBEGopAwA3AwAgCCACQYACakEIaikDADcDACAHIAIpA4ACNwMADAILIAAgARDFCAwBCyAHIAEQRgsgAEHYAGohACADQah/aiIDDQALCwJAIAZBmAFqKAIAIgBFDQAgAEEobCEDIAZBlAFqKAIAQQRqIQADQAJAAkACQAJAAkACQAJAIABBfGooAgAOBQYAAQIDBgsgACgCAEEBRw0FIABBBGooAgAiBygCAEEaRw0DIAJBwABqIAEoAgAgASgCBCAHQQhqIggQtQwgAigCQEEyRg0FIAcQyQEgB0E4aiACQcAAakE4aikDADcDACAHQTBqIAJBwABqQTBqKQMANwMAIAdBKGogAkHAAGpBKGopAwA3AwAgB0EgaiACQcAAakEgaikDADcDACAHQRhqIAJBwABqQRhqKQMANwMAIAdBEGogAkHAAGpBEGopAwA3AwAgCCACQcAAakEIaikDADcDACAHIAIpA0A3AwAMBQsgACgCACIHKAIAQRpHDQMgAiABKAIAIAEoAgQgB0EIaiIIELUMIAIoAgBBMkYNBCAHEMkBIAdBOGogAkE4aikDADcDACAHQTBqIAJBMGopAwA3AwAgB0EoaiACQShqKQMANwMAIAdBIGogAkEgaikDADcDACAHQRhqIAJBGGopAwA3AwAgB0EQaiACQRBqKQMANwMAIAggAkEIaikDADcDACAHIAIpAwA3AwAMBAsgACABELMGDAMLIAAgARCyAgwCCyAHIAEQRgwBCyAHIAEQRgsgAEEoaiEAIANBWGoiAw0ACwsgBi0APCIAQQZGDQMgAEECRw0DIAZBEGohAANAIAAoAhgiAC0ALEECRg0ADAQLCyAAIAEQRgwCCyAAIAEQRgwBCyAEQQxqKAIAIgNFDQAgBEEIaigCACEAIANBKGwhAwNAIAEgABC7AiAAQShqIQAgA0FYaiIDDQALCyAEQShqIgQgBUcNAAsLIAJBwAJqJAALyAwCFH8DfiMAQdAAayICJAAgACgCACEDAkACQCABKAIAIgRBkPqDAUEOIAEoAgQiBSgC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lwwCCX8DfiMAQZABayIBJAACQAJAIAAoAgQiAi0ATCIDQQdGDQAgACgCACEEQQAhBQJAAkBBAC0AzPCdAUUNAEEAKALQ8J0BIgVB/////wdJDQFBvLqYARD5FAALQQBBAToAzPCdAUEAQQE2AtTwnQFBAEGAxZgBNgLY8J0BQQBBADYC0PCdAQtBACAFNgLQ8J0BAkAgAigCAEECRg0AIARBNGoiBRCUBCACKAIAIQMgAUEUaiACKAIIIAIoAgwQ8xIgASADNgIQIARBOGohAyABQRBqEMgFIQogASABQRBqNgKIAQJAIAQoAkANACADIARByABqEOEGGgsgASADNgJUIAEgAUGIAWo2AlAgAUEIaiAEKAI4IAQoAjwgCiABQdAAakElEIYJAkACQCABKAIIQQFxRQ0AIAQoAjgiAyABKAIMIgZqIgctAAAhCCABQRBqQQhqKQIAIQsgASkCECEMIAcgCkIZiKciCToAACADIAQoAjwgBkF4anFqQQhqIAk6AAAgBCAEKAJEQQFqNgJEIAQgBCgCQCAIQQFxazYCQCADIAZBBHRrQXBqIgMgDDcCACADQQhqIAs3AgAMAQsgASgCFCABKAIYEI4gCyAFEP0MIAItAEwhAwsgAUHIAGpCADcDACABQcAAakIANwMAIAFBOGpCADcDACABQgA3AzAgAULzytHLp4zZsvQANwMoIAFCg9+R85bM3LfkADcDICABQuHklfPW7Nm87AA3AxggAUL1ys2D16zbt/MANwMQIAMgAUEQahC8ICACQRRqKAIAIAJBGGooAgAgAUEQahCmECABQRBqIAIoAgAiA0ECRxDOHAJAIANBAkYNACABQRBqIAMQzhwgAkEIaigCACACQQxqKAIAIAFBEGoQnx8LIAJBHGogAUEQahDIDSACKAI4IQggAUEQaiACKAI8IgMQmCEgA0EGdCEHQQAhBQJAA0AgByAFRg0BIAggBWoiA0E8ai0AACABQRBqELwgIANBBGooAgAgA0EIaigCACABQRBqEKYQIANBDGogAUEQahDIDSABQRBqIANBJGoiBigCACIDQYCAgIB4RxDOHAJAIANBgICAgHhGDQAgBiABQRBqEMgNCyAFQcAAaiEFDAALCyACKAJEIQggAUEQaiACKAJIIgMQmCEgCCADQRxsaiEJAkADQCAIIAlGDQEgCCgC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AgBBGkcNASACIAAoAgAgACgCBCABQQhqIgAQtQwgAigCAEEyRg0EIAEQyQEgAUE4aiACQThqKQMANwMAIAFBMGogAkEwaikDADcDACABQShqIAJBKGopAwA3AwAgAUEgaiACQSBqKQMANwMAIAFBGGogAkEYaikDADcDACABQRBqIAJBEGopAwA3AwAgACACQQhqKQMANwMAIAEgAikDADcDAAwECwJAIAEoAgQiAy0AbEECRw0AIANBwABqIQEDQCABKAIYIgEtACxBAkYNAAsLAkAgA0GEAWooAgAiBEUNACADQYABaigCACEBIARB2ABsIQQDQAJAAkACQAJAIAEoAgBBfGoOAgMAAQsgAUEEaigCACIFKAIAQRpHDQEgAkGAAmogACgCACAAKAIEIAVBCGoiBhC1DCACKAKAAkEyRg0CIAUQyQEgBUE4aiACQYACakE4aikDADcDACAFQTBqIAJBgAJqQTBqKQMANwMAIAVBKGogAkGAAmpBKGopAwA3AwAgBUEgaiACQYACakEgaikDADcDACAFQRhqIAJBgAJqQRhqKQMANwMAIAVBEGogAkGAAmpBEGopAwA3AwAgBiACQYACakEIaikDADcDACAFIAIpA4ACNwMADAILIAEgABDFCAwBCyAFIAAQRgsgAUHYAGohASAEQah/aiIEDQALCwJAIANBmAFqKAIAIgFFDQAgAUEobCEEIANBlAFqKAIAQQRqIQEDQAJAAkACQAJAAkACQAJAIAFBfGooAgAOBQYAAQIDBgsgASgCAEEBRw0FIAFBBGooAgAiBSgCAEEaRw0DIAJBwAFqIAAoAgAgACgCBCAFQQhqIgYQtQwgAigCwAFBMkYNBSAFEMkBIAVBOGogAkHAAWpBOGopAwA3AwAgBUEwaiACQcABakEwaikDADcDACAFQShqIAJBwAFqQShqKQMANwMAIAVBIGogAkHAAWpBIGopAwA3AwAgBUEYaiACQcABakEYaikDADcDACAFQRBqIAJBwAFqQRBqKQMANwMAIAYgAkHAAWpBCGopAwA3AwAgBSACKQPAATcDAAwFCyABKAIAIgUoAgBBGkcNAyACQYABaiAAKAIAIAAoAgQgBUEIaiIGELUMIAIoAoABQTJGDQQgBRDJASAFQThqIAJBgAFqQThqKQMANwMAIAVBMGogAkGAAWpBMGop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ACADQfAAakEIaiADQZABakEMaiIMKQIANwMAIAMgAykClAE3A3AgDCAIQQxqKQIANwIAIAsgCEEUaikCADcCACAJIAhBHGopAgA3AgAgAyAKNgKQASADIAgpAgQ3ApQBAkBBLEUNACADQcQAaiAIQSRqQSz8CgAACyADQShqQQhqIAhB3ABqKAIANgIAIAMgCCkCVDcDKAwBCyAILQBsIQcgCCgCUCEGIANBnAFqIAlBCGopAgA3AgAgA0GkAWogCUEQaikCADcCACADQawBaiAJQRhqKQIANwIAIAMgCjYCkAEgAyAJKQIANwKUAQJAQSxFDQAgA0HEAGogCEEkakEs/AoAAAsgA0EoakEIaiAIQdwAaigCADYCACADIAgpAlQ3AyhBgICAgHghBQsgBCAHQQFxOgBkIAIgBCkCUDcCGCACQSBqIARB2ABqIggoAgA2AgAgARCaCBogA0EoakEUaiAIKAIANgIAIAMgBCkCUDcCNAJAAkAgBUGAgICAeEYNACADQcgCaiADQfAAakEIaikDADcCACADQbwCakEUaiADQYABaigCADYCACADQbwCakEgaiACQRhqIgFBCGooAgA2AgAgAyADKQNwNwLAAiADIAEpAgA3AtQCIAMgBTYCvAICQEEkRQ0AIANBtAFqIAJBJPwKAAALIANBGGogA0G0AWoQmQ4gAygCHCECIAMoAhghCAJAIAMoAsQCIgEgBUcNACADQbwCakG4gYUBEPkVCyADKALAAiIJIAFBA3RqIgUgAjYCBCAFIAg2AgAgAyABQQFqIgE2AsQCAkACQAJAAkACQCABDgIBAgALIANBCGogA0G8AmoQ8RhBCiEBIAMoAgwhCAwDCyADQRBqIANByAJqEJ0VQQAhASADKAIUIQgMAQsgA0EANgLEAiAJKAIEIQggCSgCACEBCyADQbwCahDlFwtBAC0AwPGdARpBCBCFASICDQEMAwsCQEEkRQ0AIANBtAFqIAJBJPwKAAALIAMgA0G0AWoQmQ5BAC0AwPGdARogAygCBCEIIAMoAgAhAUEIEIUBIgJFDQILIAIgATYCACACIAg2AgQgBhCwAyAGQQhBBBCeEkEALQDA8Z0BGkHIABCFASIBRQ0BAkBBLEUNACABIANBxABqQSz8CgAACyABIAI2AiwgASADKQMoNwIwIAFBOGogA0EwaikD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CAkKCwwfHw0ODxARHxITFB8fFRYXGBkaGxwfHR8fCyAAKAIMQQR0IQQgACgCCCEAA0AgBEUNHwJAIAAoAgBBAkYNACAAQQxqIAEQyyELIABBEGohACAEQXBqIQQMAAsLIABBBGogARCnBgwdCyAAQSBqIAEQqAwMHAsgAEEEaiABEMshDBsLIABBDGogARDLIQwaCyAAQQRqIAEQyyEgAEEIaiABEMshDBkLIABBOGohBAJAAkACQAJAAkACQAJAAkACQAJAAkACQCADDgwBAgMEBQYHCAkKCwABCwJAAkAgACgCBA4DAAEMAAsgASAAQQhqELwPDAsLIAEgAEEIahD/CwwKCyABIABBCGoQ1xQMCQsgAEEIaiABEIIcDAgLIABBCGogARCYHQwHCyAAQQRqIAEQyyEMBgsgAEEEaiABENgYDAULIAEgAEEEahDEDwwECyABIABBBGoQxA8MAwsgASAAQQRqEKkaDAILIAEgAEEEahCxDwwBCyABIABBBGoQihULIAQgARDLIQwYCyAAQQhqIAEQghwMFwsgAEEIaiABEJgdDBYLIABBBGogARDLISAAQQhqIAEQyyEgAEEMaiABEMshDBULIABBBGohBAJAIAAtABhBBUcNACAAQRBqIAEQyyELIAQgARC+GCAAKAIoIAEQ2RgMFAsgAEEQaiABEMshAkAgACgCBEGAgICAeEYNACAAQQRqIAEQvhgLIAAoAiAgARDZGAwTCyAAQQRqIAEQhBkMEgsgAEEEaiABEIQZDBELIABBBGogARDLISAAKAIYIAEQ2RggACgCCCABEIQZDBALIAAoAiAiBEUNDiABIAQoAgwgBCgCEBC9GCAALQAoRQ0OIAJBCGogASgCKCABKAIsIAQoAgwgBCgCEBCOFyACIAIoAggiAyACKAIMajYCHCACIAM2AhggAkEYahCIEkUNDiABKAIcIAEoAiAgBCgCEBDgHiEDIAQoAgwhBCABIAMoAgBBIBDzFyABIARBKBDzFwwOCyAAQSBqIAEQzwEMDgsgACgCDCIERQ0NIABBDGogARDLISAEKAIAQR5HDQ0gBC0AKA0NIAEgBEEgaigCABCODgwNCyAAQQRqIAEQyyEMDAsgAEEEaiABEMshDAsLIABBIGoQ1hwMCgsgAEEEaiABELMNDAkLIABBBGogARDREAwICyABIABB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dEEAIQkDQCALIAlqIgdCgICAgMAANwIAIAdBCGpBADYCACAJQQxqIglB9AVHDQALQQAhBCALIAlqIglBADYCACAJQQRqQgQ3AgAgAkE4akHAADYCACACIAIpAnQ3AzAgAiAINgJEIAIgBjYCQCACIAo2AjwgCkEQaiEFIApBDGohA0EAIQcCQANAIAcgBSgCACIJTw0BIAcgCigCHCILTw0FIAIgAygCACAJIAooAhggBGooAgAiCBCoGyACKAIAIglFDQEgAigCQCILIAIoAgQiBksNBiACQTBqIAkgCxDrDyIGQT9xIgkgAigCOCILTw0HAkAgAigCNCAJQQxsaiIJKAIIIgsgCSgCAEcNACAJEO4VCyAJIAtBAWo2AgggCSgCBCALQQN0aiIJIAg2AgQgCSAGNgIAIAdBAWohByAEQQRqIQQMAAsLIAJB2ABqQRBqIAJBMGpBEGopAwA3AwAgAkHYAGpBCGogAkEwakEIaikDADcDACACIAIpAzA3A1gCQAJAIAEtACYiCUECRg0AIAlBAXENAQsgCiAKKAIAIglBAWo2AgAgCUF/TA0BIAEtACVFDQcgCigCEEHBAEkNByAKIAooAgAiCUF/ajYCACAJQQFHDQkMCAsgACACKQNYNwIAIABBADYCLCAAQQA2AhwgACAKNgIYIABBEGogAkHYAGpBEGopAwA3AgAgAEEIaiACQdgAakEIaikDADcCAAwJCwALQbzgmwEQ0xkAC0GMuYABQSVBoLqAARDdFwALIAcgC0H8uIABELMRAAsgCyAGQeC6gAEQjyAACyAJIAtB8LqAARCzEQALIAogCigCACIJQX9qNgIAIAlBAUcNAQsgChD7EQsgAEGAgICAeDYCACACQdgAahDeFyAKIAooAgAiCUF/ajYCACAJQQFHDQAgChD7EQsgAkGAAWokAAvVCgIMfwJ+IwBBgAFrIgEkACAAKAIAIgIoAgAhAyACQQA2AgAgA0EIaigCACECIANBBGooAgAhBCADKAJkIQVBBEEEEOcbIgMgBTYCACABQQE2AmQgASADNgJgIAFBATYCXCABQQA2AnAgAUKAgICAwAA3AmggAUEANgJ8IAFCgICAgMAANwJ0IAQgAmohBkEEIQdBACEIQQAhAwN/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJA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DQIgBiAJaiALNgIACyAKQQFqIgogBEcNAAsgByAEQRRsaiENIAAtAPsFIg5BAWohDyAOQQJ0QQRqIRAgACgC0AMhESAAKALUAyECIAAoAsQDIQkgACgCyAMhBANAAkACQAJAAkAgBygCDCIDIAVPDQAgByAGIANBAnRqKAIANgIMIAcoAAAiA0UNAwNAIAMgBE8NAiAJIANBCWxqIgMoAAEiCyAFTw0DIAMgBiALQQJ0aigCADYAASADKAAFIgNFDQQMAAsLIAMgBUGMxIABELMRAAsgAyAEQeytgAEQsxEACyALIAVBjMSAARCzEQALAkAgBygCBCIDRQ0AAkACQAJAIAIgA0kNACACIANrIgsgDk0NASARIANBAnRqIQMgECELA0AgAygCACIKIAVPDQMgAyAGIApBAnRqKAIANgIAIANBBGohAyALQXxqIgtFDQQMAAsLIAMgAkHMrYABEKMgAAsgDyALQdytgAEQjyAACyAKIAVBjMSAARCzEQALIAdBFGoiByANRw0ACyAMIAhBBEEEELURIAEoAgggBkEEQQQQtREgAUEwaiQADwsgCiAFQfzDgAEQsxEACyALIAVB7MOAARCzEQALIAUgBUHcw4ABELMRAAtBvOCbARDTGQALAAvYCgINfwF+IwBBwAFrIgMkAAJAAkACQCABLQCAAUEEcUUNACADQQA2AiwgA0KAgICAwAA3AiRBigWtQiCGQYijmwGthCEQIANBmAFqQQxqIQQgA0HAAGpBDGohBSABKALAASEGQQAhBwNAAkACQAJAAkACQCABLQDIASIIQRhHDQAgASgCwAEhCSABEIcOAkACQAJAAkAgAS0AyAENACABEIcOIANBEGogARC/CCADKAIUIQggAygCEEEBcQ0FIAMgCDYCMCABLQDIASIHQQFHDQIgARCHDgwBCyADQZgBaiABQQBBABCfAwJAAkAgAy0ArAFBAkYNACADQeAAakEQaiADQZgBakEQaikDADcDACADQeAAakEIaiADQZgBakEIaikDADcDACADIAMpA5gBNwNgQQhBwAAQ6x8iBw0BDA0LIAMoApgBIQgMBQsgB0EaNgIAAkBBOEUNACAHQQhqIANB4ABqQTj8CgAACyADQQU6AKABIAMgBzYCmAEgA0EYaiABIANBmAFqQQBBARBmIAMoAhwhCCADKAIYQQFxDQQLIAMgCDYCQCABLQDIASEHQQAhCgJAAkACQCABLQCBAUEgcUUNACAHQf8BcUESRw0AIANBCGogARCZBCADKAIMIQoCQCADKAIIQQFxRQ0AIAohCAwCCyABEIcOIAEtAMgBIQcLAkAgCg0AIAdB/wFxDQQLIANBmAFqIAEQ6wQgAygCnAEhCyADKAKYASIMQYCAgIB4Rw0BIAoQ8B8gCyEICyADQcAAahDrHgwECyADKAKgASENIAMgCBC/AyABKAK8ASEOIAMoAgAhDyADQgA3ArABIANBAzoArAEgA0EANgKoASADQgA3ArgBIANCADcCoAEgA0KAgICAwAA3ApgBQQhBwAAQ6x8iB0UNCiAHQgA3AiQgByAONgIgIAcgDzYCHCAHQQU6ABggByAINgIQIAcgDTYCDCAHIAs2AgggByAMNgIEIAdBFzYCACAKEPAfIAQQ7R4gA0GYAWoQsh8gASgCvAEhCwwGCyABKALEASEIIAEoAsABIQogA0E0aiAHEN4bIANBATYCnAEgA0GY75sBNgKYASADQgE3AqQBIAMgEDcDWCADIANB2ABqNgKgASADQcAAaiADQZgBahCNFSAFQQhqIANBNGpBCGooAgA2AgAgBSADKQI0NwIAIAogCCADQcAAahCFFSEIAkAgAS0AyAFBogFHDQAgARDHESEHIAEQhw4gASAHEOURCyADQTBqEOseDAILAkAgCEUNACABKAK8ASELIAghBwwFCyAJIQgMAQsgB0UNAiAIQdgARw0BIAEoAngiB0GAgAhxDQEgB0GAgCBxIQcCQAJAIAINACAHDQAgASgCxAEhByABKALAASEIIANBjoCAgHg2AmAgCCAHIANB4ABqEIUVIQggAS0AyAFBogFGDQEMAgsgBw0CIAEtAIABQQhxDQIgASgCvAEhByADQdqAgIB4NgJgIAYgByADQeAAahCFFSEIIAEtAMgBQaIBRw0BCyABEMcRIQcgARCHDiABIAcQ5RELIABBgICAgHg2AgAgACAINgIEIANBJGoQzB0MBQsgACADKQIkNwIAIABBCGogA0EkakEIaigCADYCAAwECyAAIAMpAiQ3AgAgAEEIaiADQSRqQQhqKAIANgIADAMLAkAgAygCLCIIIAMoAiRHDQAgA0EkahDDFgsgAygCKCAIQQxsaiIKIAs2AgggCiAJNgIEIAogBzYCACADIAhBAWoiBzYCLAwACwsgAEEANgIIIABCgICAgMAANwIACyADQcABaiQADwsAC/wJAQh/IABBAToAHCAAKAJYIQFBACECQQAhAwJAAkACQCAAKAJcIgRBIUkNAEEAIQVBACEGA0ACQCABIAZqIgctAABBwLKZAWotAABFDQAgBiEDDAMLAkAgB0EBai0AAEHAspkBai0AAEUNACAGIQNBASEFDAMLAkAgB0ECai0AAEHAspkBai0AAEUNACAGIQNBAiEFDAMLAkAgB0EDai0AAEHAspkBai0AAEUNACAGIQNBAyEFDAMLAkAgB0EEai0AAEHAspkBai0AAEUNACAGIQNBBCEFDAMLAkAgB0EFai0AAEHAspkBai0AAEUNACAGIQNBBSEFDAMLAkAgB0EGai0AAEHAspkBai0AAEUNACAGIQNBBiEFDAMLAkAgB0EHai0AAEHAspkBai0AAEUNACAGIQNBByEFDAMLAkAgB0EIai0AAEHAspkBai0AAEUNACAGIQNBCCEFDAMLAkAgB0EJai0AAEHAspkBai0AAEUNACAGIQNBCSEFDAMLAkAgB0EKai0AAEHAspkBai0AAEUNACAGIQNBCiEFDAMLAkAgB0ELai0AAEHAspkBai0AAEUNACAGIQNBCyEFDAMLAkAgB0EMai0AAEHAspkBai0AAEUNACAGIQNBDCEFDAMLAkAgB0ENai0AAEHAspkBai0AAEUNACAGIQNBDSEFDAMLAkAgB0EOai0AAEHAspkBai0AAEUNACAGIQNBDiEFDAMLAkAgB0EPai0AAEHAspkBai0AAEUNACAGIQNBDyEFDAMLAkAgB0EQai0AAEHAspkBai0AAEUNACAGIQNBECEFDAMLAkAgB0ERai0AAEHAspkBai0AAEUNACAGIQNBESEFDAMLAkAgB0ESai0AAEHAspkBai0AAEUNACAGIQNBEiEFDAMLAkAgB0ETai0AAEHAspkBai0AAEUNACAGIQNBEyEFDAMLAkAgB0EUai0AAEHAspkBai0AAEUNACAGIQNBFCEFDAMLAkAgB0EVai0AAEHAspkBai0AAEUNACAGIQNBFSEFDAMLAkAgB0EWai0AAEHAspkBai0AAEUNACAGIQNBFiEFDAMLAkAgB0EXai0AAEHAspkBai0AAEUNACAGIQNBFyEFDAML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AgwhByACIAIoAngiBUH//99+cSIGQYCAgAFyIgg2AnggAiAGQYCBgAFyIAhB//5fcSABKAIQIgktAAAbIgY2AnggAkGAAkEAIActAAAbIAZB//1fcXI2AnggA0HoAGogAhDCAiACIAU2AnggAygCbCEGIAMoAmgiBUGAgICAeEcNASAGIQoMAgsgAigCxAEhBiACKALAASEIIANBFGogBRDeGyADQQE2AmwgA0GY75sBNgJoIANCATcCdCADQYoFrUIghkGB2pgBrYQ3AyAgAyADQSBqNgJwIANBOGogA0HoAGoQjRUgA0HMAGogA0EcaigCADYCACADIAMpAhQ3AkQgCCAGIANBOGoQhRUhCiACLQDIAUGiAUcNASACEMcRIQUgAhCHDiACIAUQ5REMAQsgAyADKAJwIgg2AiggAyAGNgIkIAMgBTYCIAJAAkACQCACLQDIASIFQQFHDQAgAhCHDkEAIQoCQCACLQCBAUEgcUUNACACLQDIAUH/AXFBCUcNACADIAJBCRCYBCADKAIEIQogAygCAEEBcQ0CCyADIAo2AjggA0HoAGogAiAJLQAAIActAAAgBiAIEN0YEL8KIAMoAmwhCyADKAJoIgxBgYCAgHhHDQIgA0E4ahCpHyALIQoMAQsgAigCxAEhBiACKALAASEIIANBLGogBRDeGyADQQE2AmwgA0GY75sBNgJoIANCATcCdCADQYoFrUIghkGIo5sBrYQ3A1AgAyADQdAAajYCcCADQThqIANB6ABqEI0VIANBzABqIANBNGooAgA2AgAgAyADKQIsNwJEIAggBiADQThqEIUVIQogAi0AyAFBogFHDQAgAhDHESEFIAIQhw4gAiAFEOURCyADQSBqEMsdDAELIANB2ABqQQhqIANB+ABqKQIANwMAIAMgAykCcDcDWAJAIAxBgICAgHhHDQAgAi8BgAFBgMAAcUUNACAGIAhBBnRqIQgDQCAGIgUgCEYNASAFIAUgCEdBBnRqIQYgBSgCAEEERw0AIAUoAhAhDSAFKAIMIQUgA0GqgYCAeDYCaCACIAUgDSADQegAahCvGgwACwsgA0H8AGogAUEIaigCADYCACADQegAakEIaiADQSBqQQhqKAIANgIAIAMgAykCIDcDaCADIAEpAgA3AnQgBy0AACEFIAktAAAhBiACKAK8ASEIIAEoAhQo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IAAoAgQQvQEgASACOgAMDAgLIABBCGogARCCBQ8LAkACQAJAAkAgACgCBA4DAAECAAsgACgCCCICKAIIIgNFDQIgAigCBCICIANBOGxqIQQDQCACIAEQrgkCQCACQTBqKAIAIgNFDQAgASADEL0BCyACQThqIgIgBEcNAAwDCwsgACgCCCICKAIIIgNFDQEgAigCBCICIANBOGxqIQQDQCACIAEQrgkCQCACQTBqKAIAIgNFDQAgASADEL0BCyACQThqIgIgBEcNAAwCCwsgACgCCCABEJ0HCyABIAAoAgwQvQEgACgCECEADAQLAkACQAJAAkAgACgCBA4DAAECAAsgACgCCCICKAIIIgNFDQIgAigCBCICIANBOGxqIQQDQCACIAEQrgkCQCACQTBqKAIAIgNFDQAgASADEL0BCyACQThqIgIgBEcNAAwDCwsgACgCCCICKAIIIgNFDQEgAigCBCICIANBOGxqIQQDQCACIAEQrgkCQCACQTBqKAIAIgNFDQAgASADEL0BCyACQThqIgIgBEcNAAwCCwsgACgCCCABEJ0HCyABIAAoAgwQvQEgACgCECEADAMLAkAgACgCBCICQQJGDQACQCACQQFxRQ0AIAEgACgCCBC9AQwBCyAAKAIIIgIoAggiA0UNACACKAIEIgIgA0E4bGohBANAIAIgARCuCQJAIAJBMGooAgAiA0UNACABIAMQvQELIAJBOGoiAiAERw0ACwsCQCAAKAIYIgJFDQAgASACEL0BCwJAIAAoAhwiAkUNACABIAIQvQELIAAoAgwhAAwCCyABIAAoAgQQvQEgACgCCCEADAELIAEgACgCBBC9ASAAKAIIIQAMAAsLAkAgACgCBCIDQdAAaigCACICRQ0AIANBzABqKAIAIQAgAkEwbCECA0AgACABEPsCIABBMGohACACQVBqIgINAAsLAkACQAJAIAMoAgBBeWoOAgECAAsgAyABEK4JCyADQTBqKAIAIgJFDQAgA0EsaigCACEAIAJBMGwhAgNAIAAgARD7AiAAQTBqIQAgAkFQaiICDQALCyADKAJgQYCAgIB4Rg0AIANB6ABqKAIAIgJFDQAgA0HkAGooAgAhACACQTBsIQIDQCAAIAEQ+wIgAEEwaiEAIAJBUGoiAg0ACwsPCyABIAAoAgQQvQELgQoCB38BfiMAQSBrIgEk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CGohByADQQRqIQgMKAsgA0EQaiEHIANBDGohCAwnCyADQTRqIQcgA0EwaiEIDCYLIANBJGohByADQSBqIQgMJQsgA0EkaiEHIANBIGohCAwkCyADQRRqIQcgA0EQaiEIDCMLIANBIGohByADQRxqIQgMIgsgA0EYaiEHIANBFGohCAwhCyADQRRqIQcgA0EQaiEIDCALIANBFGohByADQRBqIQgMHwsgAygCCA4HFhcYGRobHBYLIANBIGohByADQRxqIQgMHQsgA0EQaiEHIANBDGohCAwcCyADQRhqIQcgA0EUaiEIDBsLIAMoAiAiCEEoaiEHIAhBJGohCAwaCyADQQhqIQcgA0EEaiEIDBkLIANBCGohByADQQRqIQgMGAsgA0EMaiEHIANBCGohCAwXCyADQQxqIQcgA0EIaiEIDBYLIANBHGohByADQRhqIQgMFQsgA0EsaiEHIANBKGohCAwUCyADQQhqIQcgA0EEaiEIDBMLIAMoAgQiCEEEaiEHDBILIANBFGohByADQRBqIQgMEQsgA0EQaiEHIANBDGohCAwQCyADQQxqIQcgA0EIaiEIDA8LIANBDGohByADQQhqIQgMDgsgA0EQaiEHIANBDGohCAwNCyADQRBqIQcgA0EMaiEIDAwLIANBEGohByADQQxqIQgMCwsgA0EUaiEHIANBEGohCAwKCyADQQxqIQcgA0EIaiEIDAkLIANBCGohByADQQRqIQgMCAsgA0EcaiEHIANBGGohCAwHCyADQRBqIQcgA0EMaiEIDAYLIANBEGohByADQQxqIQgMBQsgA0EUaiEHIANBEGohCAwECyADQRRqIQcgA0EQaiEIDAMLIANBJGohByADQSBqIQgMAgsgA0EkaiEHIANBIGohCAwBCyADQQhqIQcgA0EEaiEICyAIKAIAIQggAUEMaiAHKAIANgIAIAFBCGogCDYCACABQQRqIAM2AgAgAUESNgIAIAAgACgCCEEBajYCCCABQTBqIgEgBUcNAAtBAQulCQEDfwJAAkACQANAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCAA4TAA8PAQIDDw8EBRAODAsKCQgHBgALIAAoAgwiAkUNDiAAKAIIIQAgAkEwbCECA0AgACABEI8DIABBMGohACACQVBqIgINAAwPCwsgASAAKAIEEKcBIAAoAgghAAwLCyAAKAIMIgBFDQwgASAAEKcBDwsgACgCKCEADAkLIAEgACgCBBCnASAAKAIIIAEQjwMgACgCFCIADQgMCgsgASAAKAIQEKcBIAAoAgwiAkUNCSAAKAIIIgMgAkEYbGohBANAAkAgAygCFCIARQ0AIAEgABCnAQsCQCADQQhqKAIAIgJFDQAgA0EEaigCACEAIAJBMGwhAgNAIAAgARCPAyAAQTBqIQAgAkFQaiICDQALCyADQRhqIgMgBEYNCgwACwsgASAAKAIEEKcBDAgLIABBCGogARDQAw8LAkACQAJAAkAgACgCBA4DAAECAAsgACgCCCICKAIIIgNFDQIgAigCBCICIANBOGxqIQQDQCACIAEQrQkCQCACQTBqKAIAIgNFDQAgASADEKcBCyACQThqIgIgBEcNAAwDCwsgACgCCCICKAIIIgNFDQEgAigCBCICIANBOGxqIQQDQCACIAEQrQkCQCACQTBqKAIAIgNFDQAgASADEKcBCyACQThqIgIgBEcNAAwCCwsgACgCCCABEIwLCyABIAAoAgwQpwEgACgCECEADAQLAkACQAJAAkAgACgCBA4DAAECAAsgACgCCCICKAIIIgNFDQIgAigCBCICIANBOGxqIQQDQCACIAEQrQkCQCACQTBqKAIAIgNFDQAgASADEKcBCyACQThqIgIgBEcNAAwDCwsgACgCCCICKAIIIgNFDQEgAigCBCICIANBOGxqIQQDQCACIAEQrQkCQCACQTBqKAIAIgNFDQAgASADEKcBCyACQThqIgIgBEcNAAwCCwsgACgCCCABEIwLCyABIAAoAgwQpwEgACgCECEADAMLAkAgACgCBCICQQJGDQACQCACQQFxRQ0AIAEgACgCCBCnAQwBCyAAKAIIIgIoAggiA0UNACACKAIEIgIgA0E4bGohBANAIAIgARCtCQJAIAJBMGooAgAiA0UNACABIAMQpwELIAJBOGoiAiAERw0ACwsCQCAAKAIYIgJFDQAgASACEKcBCwJAIAAoAhwiAkUNACABIAIQpwELIAAoAgwhAAwCCyABIAAoAgQQpwEgACgCCCEADAELIAEgACgCBBCnASAAKAIIIQAMAAsLAkAgACgCBCIDKAJQIgJFDQAgAygCTCEAIAJBMGwhAgNAIAAgARCPAyAAQTBqIQAgAkFQaiIC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A0AgABCWAyAAQTBqIQAgAUFQaiIBDQALCyACKAJgQYCAgIB4Rg0AIAIoAmgiAUUNACACKAJkIQAgAUEwbCEBA0AgABCWAyAAQTBqIQAgAUFQaiIBDQALCw8LIAAoAgQQtQEL3QgBBn8jAEGAAmsiAiQAAkACQAJAAkADQAJAIAAoAgAiA0ECRg0AAkACQCADDgcHAQAEBgcFBwsACyAAKAIMIgNFDQUgACgCCCEAIANBKGwhAwNAAkAgACgCAEEHRg0AIAAgARCXAwsgAEEoaiEAIANBWGoiAw0ADAYLCyAAKAIEIQAMAAsLIAAoAgwiA0UNAiAAKAIIIQQgA0E4bCEFQQAhAANAAkACQAJAAkACQAJAAkAgBCAAaiIDKAIADgMAAQIACyADQQhqKAIAQQNHDQQgA0EMaigCACIGKAIAQRpHDQIgAkHAAWogASgCACABKAIEIAZBCGoiBxC1DCACKALAAUEyRg0EIAYQyQEgBkE4aiACQcABakE4aikDADcDACAGQTBqIAJBwAFqQTBqKQMANwMAIAZBKGogAkHAAWpBKGopAwA3AwAgBkEgaiACQcABakEgaikDADcDACAGQRhqIAJBwAFqQRhqKQMANwMAIAZBEGogAkHAAWpBEGopAwA3AwAgByACQcABakEIaikDADcDACAGIAIpA8ABNwMADAQLIANBMGooAgAiA0UNBCADKAIAQRpHDQIgAkGAAWogASgCACABKAIEIANBCGoiBhC1DCACKAKAAUEyRg0EIAMQyQEgA0E4aiACQYABakE4aikDADcDACADQTBqIAJBgAFqQTBqKQMANwMAIANBKGogAkGAAWpBKGopAwA3AwAgA0EgaiACQYABakEgaikDADcDACADQRhqIAJBgAFqQRhqKQMANwMAIANBEGogAkGAAWpBEGopAwA3AwAgBiACQYABakEIaikDADcDACADIAIpA4ABNwMADAQLIANBBGooAgAgARCDBAwDCyAGIAEQRgwBCyADIAEQRgwBCyADQShqKAIAIAEQgwQLIAUgAEE4aiIARw0ADAMLCwJAIAAoAgQiACgCAEEaRw0AIAIgASgCACABKAIEIABBCGoiAxC1DCACKAIAQTJGDQIgABDJASAAQThqIAJBOGopAwA3AwAgAEEwaiACQTBqKQMANwMAIABBKGogAkEoaikDADcDACAAQSBqIAJBIGopAwA3AwAgAEEYaiACQRhqKQMANwMAIABBEGogAkEQaikDADcDACADIAJBCGopAwA3AwAgACACKQMANwMADAILIAAgARBGDAELIAAoAgQgARCXAwJAIAAoAggiACgCAEEaRw0AIAJBwABqIAEoAgAgASgCBCAAQQhqIgMQtQwgAigCQEEyRg0BIAAQyQEgAEE4aiACQcAAakE4aikDADcDACAAQTBqIAJBwABqQTBqKQMANwMAIABBKGogAkHAAGpBKGopAwA3AwAgAEEgaiACQcAAakEgaikDADcDACAAQRhqIAJBwABqQRhqKQMANwMAIABBEGogAkHAAGpBEGopAwA3AwAgAyACQcAAakEIaikDADcDACAAIAIpA0A3AwAMAQsgACABEEYLIAJBgAJqJAAL2ggBBX8CQAJAAkACQAJAAkACQCAAKAIADggAAQUEBgYDAgALIAEgACgCIBCWAQ8LIAAoAiAiAiABENQFAkAgAkEUaigCACIARQ0AIAJBEGooAgAhAyAAQQxsIQQDQCADKAIAIQACQCABLQAkIgUNAAJAIAAoAgBBdGoiBkEHIAZBJkkbQXtqIgZBH0sNAEEBIAZ0Qa6igIB4cQ0BIAYNACAALQARRQ0BCyABQQM6ACQLIANBDGohAyABLQAlIQYgASAAEMYBIAAgARBSIAEgBjoAJSABIAU6ACQgASAAEJsBIARBdGoiBA0ACwsgAigCGEGAgICAeEYNBCABLQAmIQYgAUEAOgAmAkAgAkEgaigCACIDRQ0AIAJBHGooAgAhACADQTBsIQMgAS0AJSEEIAEtACQhBQNAIAFBAzoAJCAAIAEQdCABIAQ6ACUgASAFOgAkIABBMGohACADQVBqIgMNAAsLIAEgBjoAJg8LIAAoAgQiAC0ARSIDQQNGDQMCQCADQQJGDQACQCAAKAJAIgAtACVBAkYNACAAQSBqIAEQsA8PCyAAQQhqKAIAIgNFDQQgAEEEaigCACEAIANBOGwhAwNAAkACQCAAKAIAQQlHDQAgAS8BJCEEIAFBAzoAJCAAQQhqIAEQdCABIAQ7ASQMAQsgACABEOEDCyAAQThqIQAgA0FIaiIDDQAMBQsLIABBKGooAgAiA0UNAyAAQSRqKAIAIQAgA0E4bCEDA0ACQAJAIAAoAgBBCUcNACABLwEkIQQgAUEDOgAkIABBCGogARB0IAEgBDsBJAwBCyAAIAEQ4QMLIABBOGohACADQUhqIgMNAAwECwsgACgCBCIAQShqKAIAIgNFDQIgA0EwbCEEIABBJGooAgBBKGohAwNAAkAgAygCACIARQ0AAkAgAS0AJCIFDQACQCAAKAIAQXRqIgZBByAGQSZJG0F7aiIGQR9LDQBBASAGdEGuooCAeHENASAGDQAgAC0AEUUNAQsgAUEDOgAkCyABLQAlIQYgASAAEMYBIAAgARBSIAEgBjoAJSABIAU6ACQgASAAEJsBCyADQTBqIQMgBEFQaiIEDQAMAwsLIAAoAgQiAEEIaigCACIDRQ0BIABBBGooAgAiACADQThsaiEGA0AgACABEMcEIAEtACQhBSABQQI6ACQgAS0AJSEEAkAgAEEwaigCACIDRQ0AIAEgAxDGASADIAEQUiABIAQ6ACUgAUECOgAkIAEgAxCbAQsgASAEOgAlIAEgBToAJCAAQThqIgAgBkcNAAwCCwsgACgCBCIAQQhqKAIAIgNFDQAgAEEEaigCACIAIANBOGxqIQYDQCAAIAEQxwQgAS0AJCEFIAFBAjoAJCABLQAlIQQCQCAAQTBqKAIAIgNFDQAgASADEMYBIAMgARBSIAEgBDoAJSABQQI6ACQgASADEJsBCyABIAQ6ACUgASAFOgAkIABBOGoiACAGRw0ACwsLwwgBDX8jAEHgAGsiAyQAIANBIGogASACEPwLIAMoAiQhBAJAAkAgAygCIEEBcUUNACAAQQA2AgAgACAENgIEDAELAkACQAJAAkAgBEUNACADIAI2AiggA0EYaiAEQRBqIgUgAhCkDCADKAIcIAQgAygCGEEBcSIGGyEHAkAgBg0AIAMgBDYCMCAFEMIRIQggA0EQaiABIAIQ/AsgAygCFCEBIAMoAhBBAXENAyABDQJB/LyYARCbIAALIAUQwhEhASAFIAIQkw0hCQJAIAUQwhEiCCgCCCIKIAdNDQAgAyAIKAIEIAdBAnRqKAIAIgs2AiwCQCACIAtJDQAgBSALEJMNIQwgASgCHCENQQAhCkEAIQVBACEIIAEoAiAiDkUNBUEAIQUgDiEBA0ACQCABQQFLDQACQCANIAVBDGxqKAIEIgEgC0YNACAFIAEgC0lqIQULQQAhCCAOIQEDQAJAIAFBAUsNACANIAhBDGxqKAIEIgEgAkYNCSAIIAEgAklqIQgMCQsgCCABQQF2Ig8gCGoiCyANIAtBDGxqKAIEIAJLGyEIIAEgD2shAQwACwsgBSABQQF2IgggBWoiDyANIA9BDGxqKAIEIAtLGyEFIAEgCGshAQwACwsgA0EENgI0IANBnLyYATYCMCADQgM3AjwgA0EcNgJcIANBHDYCVCADQR02AkwgAyAEQegAajYCSCADIANByABqNgI4IAMgA0EsajYCWCADIANBKGo2AlAgA0EwakG8vJgBEIUbAAsgByAKQfS7mAEQsxEAC0Hku5gBEJsgAAsgAyABNgJIIAFBEGogAhCTDSELIANByABqEM0bIAgoAhwhD0EAIQpBACEFAkAgCCgCICIERQ0AQQAhBSAEIQEDQAJAIAFBAUsNACAPIAVBDGxqKAIEIgEgAkYNAiAFIAEgAklqIQUMAgsgBSABQQF2IgggBWoiDSAPIA1BDGxqKAIEIAJLGyEFIAEgCGshAQwACwsgA0EIaiAPIARBACAFQdy8mAEQ1RUCQCADKAIMIgJFDQAgAygCCCEBQQAhCgNAAkACQAJAIAEoAgAiCA4DAgABAgsgAUEIaigCACEIDAELQQQhCAsgAUEMaiEBIAggCmohCiACQX9qIgINAAsLIAAgCzYCCCAAQQA2AgQgACAHNgIAIAAgCyAFayAKajYCDAwCCyAAQQA2AgAgACABNgIEIANBMGoQzRsMAQsgBEEAIAYbIQsgB0EBaiEEIAkgDGshDyADIA0gDiAFIAhBzLyYARDVFQJAIAMoAgQiDUUNACADKAIAIQFBACEKA0ACQAJAAkAgASgCACICDgMCAAECCyABQQhqKAIAIQIMAQtBBCECCyABQQxqIQEgAiAKaiEKIA1Bf2oiDQ0ACwsgACAPNgIIIAAgBDYCBCAAIAs2AgAgACAFIA9qIAhrIApqNgIMCyADQeAAaiQAC6QIAhN/AX4CQAJAAkACQAJAIAEoAgBBAUcNAAJAIAEoAhwiAiABKAI0IgNGDQAgASgCMCEEIAMhBSACIAEoAjwiBkF/aiIHaiIIIANPDQIgASgCOCEJIAQgAmohCiACIAZqIQsgASgCGCIFIAJqIQwgBiAFayENIAIgASgCECIOa0EBaiEPIAEpAwghFSABKAIkIhBBf0YhESAQIRIgAiEFA0AgAiAFRw0DAkACQAJAIBUgBCAIajEAAIinQQFxDQAgASALNgIcIAshBSARDQJBACEIIAshBQwBCyAOIBIgDiASIA5LGyARGyITIAYgEyAGSxshFCATIQUCQAJAAkADQAJAIBQgBSIIRw0AQQAgEiARGyEUIA4hCANAAkAgFCAISQ0AIAEgCzYCHAJAIBBBf0YNACABQQA2AiQLIAAgCzYCCCAAIAI2AgQgAEEANgIADwsgCEF/aiIIIAZPDQUgCCACaiIFIANPDQMgCSAIai0AACAEIAVqLQAARg0ACyABIAw2AhwgDSEIIAwhBSARRQ0FDAYLIAIgCGogA08NAiAIQQFqIQUgCSAIai0AACAKIAhqLQAARg0ACyAPIAhqIQUgEQ0EQQAhCAwDCyAFIANBoNGbARCzEQALIAMgEyACaiIIIAMgCEsbIANBsNGbARCzEQALIAggBkGQ0ZsBELMRAAsgASAINgIkIAghEgsgBSAHaiIIIANJDQALIAMhBQwDCyAAQQI2AgAPCwJAAkAgAS0ADg0AIAEgAS0ADCIFQQFzOgAMIAEoAjQhAyABKAIwIQIgASgCBCIIRQ0BAkACQCAIIANJDQAgCCADRw0BDAMLIAIgCGosAABBv39KDQILIAIgAyAIIANBkOCbARCVHwALIABBAjYCAA8LAkACQAJAIAggA0YNAAJAAkAgAiAIaiICLAAAIgNBf0wNACADQf8BcSEDDAELIAItAAFBP3EhCSADQR9xIRQCQCADQV9LDQAgFEEGdCAJciEDDAELIAlBBnQgAi0AAkE/cXIhCQJAIANBcE8NACAJIBRBDHRyIQMMAQsgCUEGdCACLQADQT9xciAUQRJ0QYCA8ABxciEDC0EBIQIgBUEBcUUNAQwCCyAFQQFxDQEgAEECNgIAIAFBAToADg8LAkAgA0GAAUkNAEECIQIgA0GAEEkNAEEDQQQgA0GAgARJGyECCyAAIAg2AgQgAEEBNgIAIAAgAiAIaiIINgIIIAEgCDYCBA8LIAAgCDYCCCAAIAg2AgQgAEEANgIADwsgBUUNAQsgBSEIA0ACQAJAIAggA0kNACADIAhGDQQMAQsgBCAIaiwAAEG/f0wNACAIIQMMAwsgCEEBaiIIDQALC0EAIQMLIAAgAzYCCCAAIAI2AgQgAEEBNgIAIAEgBSADIAUgA0sbNgIcC80JAgJ/AX4CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCACIBQTQgAUG9gYCAeEgbQf8BcUFjag6dAQAUFBQUFBQUFBQBFBQUFAIUFBQDBBQUBRQUFBQUFBQUFBQUFBQUFAYUFBQUFBQUFBQUFBQUFBQUFBQUBxQUFBQUFBQUCBQUFBQUFBQUFBQUCRQUChQUFBQUFBQUFAsMFBQUFBQUFA0UFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUDhQUFA8QERQUFBQUFBQUFBQUFBQUFBQUEhMUCyAAKQMIIgNCA4NCAFINEyADpyIAIAAoAgAiAUF/ajYCACABQQFHDRMgACAAKAIQEMEbDwsgACkDCCIDQgODQgBSDRIgA6ciACAAKAIAIgFBf2o2AgAgAUEBRw0SIAAgACgCEBDBGw8LIAAoAgQgACgCCBCOIA8LIAAoAgQgACgCCBCOIA8LIAAoAgQgACgCCBCeIA8LIAEgACgCBBCOICAAKAIMIAAoAhAQjiAPCyAAKQMIIgNCA4NCAFINDSADpyIAIAAoAgAiAUF/ajYCACABQQFHDQ0gACAAKAIQEMEbDwsgACkDCCIDQgODQgBSDQwgA6ciACAAKAIAIgFBf2o2AgAgAUEBRw0MIAAgACgCEBDBGw8LIAApAwgiA0IDg0IAUg0LIAOnIgAgACgCACIBQX9qNgIAIAFBAUcNCyAAIAAoAhAQwRsPCyAAKQMIIgNCA4NCAFINCiADpyIAIAAoAgAiAUF/ajYCACABQQFHDQogACAAKAIQEMEbDwsgACkDCCIDQgODQgBSDQkgA6ciACAAKAIAIgFBf2o2AgAgAUEBRw0JIAAgACgCEBDBGw8LAkAgACkDCCIDQgODQgBSDQAgA6ciASABKAIAIgJBf2o2AgAgAkEBRw0AIAEgASgCEBDBGwsgACkDECIDQgODQgBSDQggA6ciACAAKAIAIgFBf2o2AgAgAUEBRw0IIAAgACgCEBDBGw8LIAApAwgiA0IDg0IAUg0HIAOnIgAgACgCACIBQX9qNgIAIAFBAUcNByAAIAAoAhAQwRsPCyAAKQMIIgNCA4NCAFINBiADpyIAIAAoAgAiAUF/ajYCACABQQFHDQYgACAAKAIQEMEbDwsCQCAAKQMIIgNCA4NCAFINACADpyIBIAEoAgAiAkF/ajYCACACQQFHDQAgASABKAIQEMEbCyAAKQMQIgNCA4NCAFINBSADpyIAIAAoAgAiAUF/ajYCACABQQFHDQUgACAAKAIQEMEbDwsgACkDCCIDQgODQgBSDQQgA6ciACAAKAIAIgFBf2o2AgAgAUEBRw0EIAAgACgCEBDBGw8LIAApAwgiA0IDg0IAUg0DIAOnIgAgACgCACIBQX9qNgIAIAFBAUcNAyAAIAAoAhAQwRsPCyAAKQMIIgNCA4NCAFINAiADpyIAIAAoAgAiAUF/ajYCACABQQFHDQIgACAAKAIQEMEbDwsgACkDCCIDQgODQgBSDQEgA6ciACAAKAIAIgFBf2o2AgAgAUEBRw0BIAAgACgCEBDBGw8LIAAoAgQiACgCACIBQQhqEJsDIAFBIEEIEJ4SIABBBEEEEJ4SCwuOCAIEfwF+IwBB8ABrIgUkACAFIAM2AgwgBSACNgIIAkACQAJAIAFBgQJJDQACQCAALACAAkG/f0wNAEGAAiEGDAILAkAgACwA/wFBv39MDQBB/wEhBgwCCyAAQf4BQf0BIAAsAP4BQb9/ShsiBmosAABBv39KDQEgACABQQAgBiAEEJUfAAtBACEHQQEhCCABIQYMAQtBBSEHQdiYgQEhCAsgBSAGNgIUIAUgADYCECAFIAc2AhwgBSAINgIYAkACQAJAAkAgAiABSyIGDQAgAyABSw0AIAIgA0sNAQJAIAJFDQAgAiABTw0AIAMgAiAAIAJqLAAAQb9/ShshAwsgBSADNgIgIAEhAgJAIAMgAU8NACADQQFqIgZBACADQX1qIgIgAiADSxsiB0kNAyAAIANqIQIgBiAHayEDAkADQCADRQ0BIANBf2ohAyACLAAAIQYgAkF/aiECIAZBQEgNAAsLIAMgB2ohAgsCQCACRQ0AAkAgAiABSQ0AIAIgAUYNAQwFCyAAIAJqLAAAQb9/TA0ECwJAAkACQCACIAFGDQACQAJAAkAgACACaiIGLAAAIgNBf0oNACAGLQABQT9xIQEgA0EfcSEAIANBX0sNASAAQQZ0IAFyIQMMAgsgBSADQf8BcTYCJEEBIQMMBAsgAUEGdCAGLQACQT9xciEBAkAgA0FwTw0AIAEgAEEMdHIhAwwBCyABQQZ0IAYtAANBP3FyIABBEnRBgIDwAHFyIgNBgIDEAEYNAQsgBSADNgIkIANBgAFPDQFBASEDDAILIAQQmyAACwJAIANBgBBPDQBBAiEDDAELQQNBBCADQYCABEkbIQMLIAUgAjYCKCAFIAMgAmo2AiwgBUEFNgI0IAVB4JmBATYCMCAFQgU3AjwgBUEQrUIghiIJIAVBGGqthDcDaCAFIAkgBUEQaq2ENwNgIAVB3QCtQiCGIAVBKGqthDcDWCAFQd4ArUIghiAFQSRqrYQ3A1AgBUEOrUIghiAFQSBqrYQ3A0ggBSAFQcgAajYCOCAFQTBqIAQQhRsACyAFIAIgAyAGGzYCKCAFQQM2AjQgBUGgmoEBNgIwIAVCAzcCPCAFQRCtQiCGIgkgBUEYaq2ENwNYIAUgCSAFQRBqrYQ3A1AgBUEOrUIghiAFQShqrYQ3A0ggBSAFQcgAajYCOCAFQTBqIAQQhRsACyAFQQQ2AjQgBUGAmYEBNgIwIAVCBDcCPCAFQRCtQiCGIgkgBUEYaq2ENwNgIAUgCSAFQRBqrYQ3A1ggBUEOrUIghiIJIAVBDGqthDcDUCAFIAkgBUEIaq2ENwNIIAUgBUHIAGo2AjggBUEwaiAEEIUbAAsgByAGQbiagQEQqSAACyAAIAEgAiABIAQQlR8AC4MJAg1/AX4jAEHwAGsiAiQAAkACQCABKAIYIgMoAggiBEUNACADKAIEIQUCQCAALQB+QQFxDQAgBEEGdCEEA0BBACEGAkAgBSgCAEF+ag4DBAAEAAsgBUHAAGohBSAEQUBqIgQNAAwCCwsgBEEGdCEEA0ACQCAFKAIAQXtqQXtNDQBBACEGDAMLIAVBwABqIQUgBEFAaiIEDQALC0EBIQYLIABBLGohBwJAAkACQCAALQB9DQAgAEEAOgB9DAELIABBADoAfUEBIQggAC0AfEEBRw0AIAEoAhAhCQwBCyACQeAAaiABKQMAIg8gASgCECIJELoYIAcgAikDYCACKAJoQQEQygtBACEIIAYNACACQeAAaiAPIAkQuhggByACKQNgIAIoAmgQ0QoLAkAgAC0AkAENACAJRQ0AIAJB4ABqIAEpAwAgCRC6GCAAQYABaiACKQNgIAIoAmgQ5wUaC0EAIQUgAkEgakEAKQOY+5wBIg83AgAgAkEwaiAPNwIAIAJBADYBWiACQQA2AhQgAkKAgICAgAE3AgwgAkKAgICAgAE3AkggAkKAgICAwAA3AjggAkEANgJQIAJBADoARCACQQA2AkAgAiAALwF4OwFYIAIgACgCdDYCVCACQQApA5D7nAEiDzcCGCACIA83AiggAiAALQB+OgBeAkADQCAFQdQARg0BIAAgBWpBLGoiBCgCACEKIAQgAkEMaiAFaiILKAIANgIAIAsgCjYCACAFQQRqIQUMAAsLAkAgBiAIcg0AIAJB4ABqIAEpAwAgCRC6GCAHIAIpA2AgAigCaBDRCgsCQCADKAIUIgVFDQAgAygCECEEIAVBDGwhCiAALQB5IQsgAC0AKCEGA0AgBCgCACEFIABBADoAeSAAQQA6ACgCQCAFKAIAQRpHDQAgAkHgAGogBSkDCCAFQRhqKAIAELoYIAcgAikDYCACKAJoENEKCyAFIAAQdyAAIAY6ACggACALOgB5IARBDGohBCAKQXRqIgoNAAsLAkAgAygCCCIFRQ0AIAMoAgQiBiAFQQZ0aiEIIAZBwABqIQUgAC0AeiEMIAAtAHkhDSAALQAoIQ4DQCAFIQsgAEEBOgAoIABBADoAeSAAIAAtAHtBAXM6AHoCQCAGKAI4IgVFDQAgBigCNCEEIAVBDGwhCgNAIAQoAgAhBSAAQQA6AHkgAEEAOgAoAkAgBSgCAEEaRw0AIAJB4ABqIAUpAwggBUEYaigCABC6GCAHIAIpA2AgAigCaBDRCgsgBEEMaiEEIAUgABB3IABBAToAKCAAQQA6AHkgCkF0aiIKDQALCyAAQQE6AHkgBiAAEOcEIAAgDToAeSAAIAw6AHogACAOOgAoIAsgCyAIRyIEQQZ0aiEFIAshBiAEDQALCwJAIAMoAhhBgICAgHhGDQAgA0EgaigCACIERQ0AIANBHGooAgAhBSAEQTBsIQQDQCAAQQA6AH0gBSAAEGsgBUEwaiEFIARBUGoiBA0ACwsgByACQQxqEJMDIAAgASkDACAJEIwPIAJB8ABqJAAL0AgBEn8jAEEgayICJAACQAJAAkAgACgCCCIDRQ0AIAEoAggiBEUNACABKAIEIQUgAyEGQQAhB0EAIQgDQAJAAkACQAJAAkACQAJAIAcgBk8NACAFIAhBA3RqIgkoAgQiCiAAKAIEIgsgB0EDdGoiDCgCACINSQ0DIAwoAgQiDCAJKAIAIg5JDQIgDiANIA4gDUsbIAogDCAKIAxJG0sNASAIIARPDQQgBiEKA0ACQCAJKAIAIg8gDSAPIA1LIgYbIAlBBGoiECgCACIOIAwgDiAMSSIRG00NACAKIQYMBgsCQCAGDQAgDCAOTQ0HCwJAAkACQAJAIAYNACAOIAxPDQELQYCAxAAhEiAGDQEMAgtB/KWFAUEoQaSmhQEQ3RcACyANIA8QpxciBiANIAZLGyETIA0gBiANIAZJGyESCwJAAkACQAJAAkACQAJAIBFFDQBBgMADIQ0CQCAOQf+vA0YNACAOQQFqIg1BgLADc0GAgLx/akH/j7x/TQ0FCyANIAwgDSAMSxshDiANIAwgDSAMSRshDSASQYCAxABHDQEgDSESIA4hEwsgEkGAgMQARg0CQYCAxAAhDUEBDQEMBAsgDUGAgMQARw0DCyAKIQYgEyEOIBIhDQwDC0GAgMQAIQ1BAEUNCSAKIQYMAgtB1KaFARCbIAALAkAgCiAAKAIARw0AIABBlKOFARD5FSAAKAIEIQsLIAAgCkEBaiIGNgIIIAsgCkEDdGoiCiATNgIEIAogEjYCAAsCQCAQKAIAIAxNDQAgDiEMDAYLIAlBCGohCSAOIQwgBiEKIAQgCEEBaiIIRw0ACyAOIQwgBCEIDAQLIAcgBkGEo4UBELMRAAtBtKOFAUHJAEGApIUBEN0XAAsCQCAGIAAoAgBHDQAgAEGQpIUBEPkVIAAoAgQhCwsgACAGQQFqIgo2AgggCyAGQQN0aiIGIAw2AgQgBiANNgIADAILIAhBAWohCCAGIQoMAgsCQCAGIAAoAgBHDQAgAEGko4UBEPkVCyAAIAZBAWoiCjYCCCAAKAIEIAZBA3RqIgYgDDYCBCAGIA02AgALIAdBAWohBwsCQCAHIANPIgwNACAKIQYgCCAESQ0BCwsCQCAMDQAgB0EDdCEMIApBA3QhDQNAIAcgCk8NBCAAKAIEIgYgDGoiCSgCACEIIAlBBGooAgAhCQJAIAogACgCAEcNACAAQfSihQEQ+RUgACgCBCEGCyAGIA1qIgYgCDYCACAAIApBAWoiCjYCCCAGQQRqIAk2AgAgDEEIaiEMIA1BCGohDSADIAdBAWoiB0cNAAsLIAogA0kNASAAQQA2AgggAiAANgIUIAIgACgCBCIMNgIMIAIgAzYCGCACIAogA2s2AhwgAiAMIANBA3RqNgIQIAJBDGoQ5AsgACAALQAMIAEtAAxxOgAMCyACQSBqJAAPCyADIApBhPOaARCPIAALIAcgCkHkooUBELMRAAu0CQIEfwF+IwBBMGsiBCQAAkACQAJAAkAgAS0AyAEiBUG1f2oiBkEfSw0AQQEgBnRBgYCCkHhxDQELIAVBtH9qQf8BcUHVAEkNACABKALEASEFIAEoAsABIQYgBEHCgICAeDYCGCAGIAUgBEEYahCFFSEFAkAgAS0AyAFBogFHDQAgARDHESEGIAEQhw4gASAGEOURCyAAIAU2AgAMAQsgASgCxAEhByABKALAASEGAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAVBzABGDQAgBUHoAEYNASAFQfN+aiIDQQdLDQNBASADdEGPAXFFDQMMBAtC0cLdi5aNHSEIIAEoAngiBUGAgAFxDQkCQCAFQYAEcUUNACAEQcKAgIB4NgIYIAYgByAEQRhqEIUVIQUCQCABLQDIAUGiAUcNACABEMcRIQYgARCHDiABIAYQ5RELIAAgBTYCAAwMCwJAIAVBggFxRQ0AIARBqICAgHg2AhggBiAHIARBGGoQhRUhBQJAIAEtAMgBQaIBRw0AIAEQxxEhBiABEIcOIAEgBhDlEQsgACAFNgIADAwLIANFDQEMCQsgAS0AgQFBIHFFDQlCweihy7YOIQgMCAsgBEHCgICAeDYCGCAGIAcgBEEYahCFFSEFAkAgAS0AyAFBogFHDQAgARDHESEGIAEQhw4gASAGEOURCyAAIAU2AgAMCQsCQAJAAkAgBUGDf2oOBgIBAQEDAwALIAVB8QBGDQIgBUHiAEYNAgsgBUHyAEsNAiAFQcsARg0DIAVB8QBGDQQgBUHaAEYNCCAFQeQARg0IIAVB6gBHDQUMCAtB/QAgARCICyEIIAEQhw4CQCAIQgODQgBSDQAgCKciBSAFKAIAIgVBAWo2AgAgBUF/TA0GCyAEQaeAgIB4NgIYIAQgCDcDICABIAYgByAEQRhqEK8aQQAhBSAAQQA2AhAgACAGNgIIIAAgCDcDACAAIAEoArwBNgIMDAkLIAUgARCICyEIIAEQhw4CQCAIQgODQgBSDQAgCKciBSAFKAIAIgVBAWo2AgAgBUF/TA0FCyAEQaeAgIB4NgIYIAQgCDcDICABIAYgByAEQRhqEIQNQQAhBSAAQQA2AhAgACAGNgIIIAAgCDcDACAAIAEoArwBNgIMDAgLIARBCGogASAGIAcQqhcgBCgCCCAEKAIMEPUVIQgMBAsgBEHLACABEIgLNwMQIAEQhw4CQCABLQB6QQRxRQ0AIAQQnBgiCDcDGCAEQRBqIARBGGoQtgshBSAIEMYdIAVFDQAgBEGqgICAeDYCGCABIAYgByAEQRhqEK8aC0EAIQUgAEEANgIQIAAgBjYCCCAAIAQpAxA3AwAgACABKAK8ATYCDAwGCyACRQ0DQtHypavGjRkhCAwCCyAFQcsASw0CQbKjmwFBKEGgv5sBEN0XCwALIAEQhw5BACEFIABBADYCECAAIAY2AgggACAINwMAIAAgASgCvAE2AgwMAgsgBEHCgICAeDYCGCAGIAcgBEEYahCFFSEFAkAgAS0AyAFBogFHDQAgARDHESEGIAEQhw4gASAGEOURCyAAIAU2AgALQQIhBQsgACAFOgAUIARBMGokAAumCAEKfyMAQSBrIgMkAEEAIQRBACEFAkACQCACRQ0AAkACQCABIAJJDQBBACACQXxqIgUgBSACSxsiBiACQX9qIgcgBiAHSRshCCAHIQUCQANAAkAgBSAGSw0AIAghBQwCCwJAIAUgAkkNACAFIAJB0OqEARCzEQALIAAgBWohCSAFQX9qIgohBSAJLAAAQb9/TA0ACyAKQQFqIQULAkACQCACIAVJDQBBACEJIAIgBUYNBQJAIAAgBWoiCywAACIKQX9KDQAgCkFASQ0GIAIgBWshDAJAAkACQAJAIApBYE8NAEECIQUMAQsgCkFwTw0BQQMhBQsgBSAMTQ0BDAgLQQQhBSAMQQRJDQcgCkF3Sw0HCyADQQxqIAsgBRDFBCADKAIMQQFGDQYgAyADKAIQIgUgAygCFGo2AhwgAyAFNgIYIANBGGoQogxBgIDEAEcNAEHA6oQBEJsgAAsCQAJAA0AgByAGTQ0BIAcgAk8NAiAAIAdqIQUgB0F/aiIJIQcgBSwAAEG/f0wNAAsgCUEBaiEICyACIAhJDQJBACEFIAIgCEYNBQJAIAAgCGoiBywAACIJQX9MDQAgCUH/AXEhBQwFCyAJQUBJDQUgAiAIayEKAkACQAJAAkAgCUFgTw0AQQIhBgwBCyAJQXBPDQFBAyEGCyAGIApNDQEMBwtBBCEGIApBBEkNBiAJQXdLDQYLIANBDGogByAGEMUEIAMoAgxBAUYNBSADIAMoAhAiBSADKAIUajYCHCADIAU2AhggA0EYahCiDCIFQYCAxABHDQRBwOqEARCbIAALIAcgAkHQ6oQBELMRAAsgBSACQeDqhAEQoyAACyAIIAJB4OqEARCjIAALIAIgAUHU0oQBEI8gAAsgBRDEDUH/AXEhBQsCQCABIAJNDQACQAJAAkAgACACaiIALAAAIgdBf0wNACAHQf8BcSECDAELQQAhCSAHQUBJDQMgASACayEGAkACQAJAAkAgB0FgTw0AQQIhAgwBCyAHQXBPDQFBAyECCyACIAZNDQEMBQsgB0F3Sw0EQQQhAiAGQQRJDQQLIANBDGogACACEMUEIAMoAgxBAUYNAyADIAMoAhAiAiADKAIUajYCHCADIAI2AhgCQAJAIANBGGoQogxBgIDEAEYNAAJAAkACQCAHQWBPDQBBAiECDAELIAdBcE8NAUEDIQILQQAhBCACIAZLDQUMAgtBACEEIAdBd0sNBEEEIQIgBkEETw0BDAQLQcDqhAEQmyAACyADQQxqIAAgAhDFBAJAIAMoAgxBAUcNAEEAIQQMAwsgAyADKAIQIgIgAygCFGo2AhwgAyACNgIYIANBGGoQogwiAkGAgMQARg0BCyACEMQNQf8BcSEEDAELQcDqhAEQmyAACyAFIARzQQFzIQkLIANBIGokACAJC/wIAQl/IwBBEGsiAiQAAkACQAJAAkACQCABKAIADgUEAAECAwQLIAEoAgRBAUcNAyAALQAoIQMgAEEAOgAoIAAtAHkhBCAAQQA6AHkCQCABKAIIIgEoAgBBGkcNACACIAEpAwggAUEYaigCABC6GCAAQSxqIAIpAwAgAigCCBDRCgsgASAAEHcgACADOgAoIAAgBDoAeQwDCyAALQAoIQMgAEEAOgAoIAAtAHkhBCAAQQA6AHkCQCABKAIEIgEoAgBBGkcNACACIAEpAwggAUEYaigCABC6GCAAQSxqIAIpAwAgAigCCBDRCgsgASAAEHcgACADOgAoIAAgBDoAeQwCCyABKAIEIgVBwABqIAAQwwoCQCAFQYQBaigCACIDRQ0AIAVBgAFqKAIAIQEgA0HYAGwhAyAAQSxqIQYDQAJAAkACQCABKAIAQXxqDgICAAELIAAtACghByAAQQA6ACggAC0AeSEIIABBADoAeQJAIAFBBGooAgAiBCgCAEEaRw0AIAIgBCkDCCAEQRhqKAIAELoYIAYgAikDACACKAIIENEKCyAEIAAQdyAAIAc6ACggACAIOgB5DAELIAEgABDJBgsgAUHYAGohASADQah/aiIDDQALCwJAIAVBmAFqKAIAIgNFDQAgBUGUAWooAgAhASADQShsIQMDQCABIAAQ+QMgAUEoaiEBIANBWGoiAw0ACwsgBS0APEEGRg0BIAVBEGogABDDCgwBCyABKAIMIgNFDQAgASgCCCIHIANBKGxqIQkgAEEsaiEKA0ACQAJAAkACQAJAIAcoAgAOBQQAAQIDBAsgBygCBEEBRw0DIAAtACghAyAAQQA6ACggAC0AeSEEIABBADoAeQJAIAcoAggiASgCAEEaRw0AIAIgASkDCCABQRhqKAIAELoYIAogAikDACACKAIIENEKCyABIAAQdyAAIAM6ACggACAEOgB5DAMLIAAtACghAyAAQQA6ACggAC0AeSEEIABBADoAeQJAIAcoAgQiASgCAEEaRw0AIAIgASkDCCABQRhqKAIAELoYIAogAikDACACKAIIENEKCyABIAAQdyAAIAM6ACggACAEOgB5DAILIAcoAgQiBkHAAGogABDDCgJAIAZBhAFqKAIAIgNFDQAgBkGAAWooAgAhASADQdgAbCEDA0ACQAJAAkAgASgCAEF8ag4CAgABCyAALQAoIQggAEEAOgAoIAAtAHkhBSAAQQA6AHkCQCABQQRqKAIAIgQoAgBBGkcNACACIAQpAwggBEEYaigCABC6GCAKIAIpAwAgAigCCBDRCgsgBCAAEHcgACAIOgAoIAAgBToAeQwBCyABIAAQyQYLIAFB2ABqIQEgA0Gof2oiAw0ACwsCQCAGQZgBaigCACIDRQ0AIAZBlAFqKAIAIQEgA0EobCEDA0AgASAAEPkDIAFBKGohASADQVhqIgMNAAsLIAYtADxBBkYNASAGQRBqIAAQwwoMAQsgB0EEaiAAEKQTCyAHQShqIgcgCUcNAAsLIAJBEGokAAuUCAEIfyMAQcAAayIDJAACQCACQYGAgCBPDQAgASACQQZ0IgJBA3YiBEF5bCACakEDdmohBUEAIQYgASECQQAhB0EAIQgCQAJAA0ACQCACIAVHDQAgB0H/AXFFDQILIAIgB0EBaiIJQfgBcUEDdmoiCkUNAiAGIAggAi0AACAHQf8BcXZBAXEbIQggBkEBaiEGIAlBB3EhByAKIQIMAAsLIAMgCEEBaiICNgIMIAMgBDYCJAJAIAIgBEsNAAJAIAJFDQAgAkEDdCEJA0AgA0EENgIEIANBroWbATYCACADIAlBA3YiAkEGIAJBBkkbIgI2AggCQAJAAkACQCACQX9qQQhPDQAgAiAJQQdxIgdqIQogAkF5bCACQQN0IgUgB3JqIgZBA3YgBkEHcUEAR2ohBiAHIQgCQCAJQQhJDQACQCACQQggB2siCE0NACACIAhrQQdxIgJFQQN0IAJyIQgMAQsgCiEICwJAAkAgBg0AQfIEIQIMAQsCQCAHDQBB8wRB9AQgCEH/AXFBCEYbIQIMAQsCQCAIQf8BcUEIRw0AQfUEIQIMAQtB9gRB9wQgBkEBRhshAgsgA0EkaiABIAYgByAIIAIREQACQAJAAkACQCADKAIkIgZFDQAgAygCNCICDQFBACEHDAILIAMoAigtAAAgAy0ALHEgAy0ALUEHcXYhBwwCCyACLQAAIAMtADhxIQcLAkAgAygCKCICRQ0AIAZBf2ohCANAIAggAmotAAAgB3IhByACQX9qIgYhAiAGDQALCyADKAIsIgJFDQAgAi0AACADKAIwIgJxQf8BcSACQQh2IgJBB3F2IAdBCCACQf8BcWsiAkEAIAJBCEkbQf8BcXRyIQcLIAdB/wFxIgJBGkkNASACQTRJDQICQAJAAkAgAkE+SQ0AQSshByACQUJqDgIGAgELIAdBfGohBwwFC0GoiJsBQQxBtIibARCMIQALQS8hBwwDCyADQQQ2AhAgA0HkgpsBNgIMIANCAzcCGCADQQ42AjggA0EONgIwIANBCTYCKCADQQg2AjwgAyADQSRqNgIUIAMgA0EIajYCNCADIANBPGo2AiwgAyADNgIkIANBDGpB5IObARCFGwALIAdBwQBqIQcMAQsgB0HHAGohBwsgCkEHcSEGIAkgBWsiCEF4cSEJIApBA3YhCgJAIAAoAggiAiAAKAIARw0AIABBmIibARDBDQsgCSAGciEJIAEgCmohASAAIAJBAWo2AgggACgCBCACaiAHOgAAIAhBB0sNAAsLIANBwABqJAAPCyADQQxqIANBJGoQ7BQAC0HI+5oBEJsgAAsgA0ECNgIkIANBfyACQQN0IAJB/////wFLGzYCKEHUpJsBQSsgA0EkakGU/JoBQdSEmwEQ6A8AC4gIAQd/AkACQCABQYAKTw0AIAFBBXYhAgJAAkACQCAAKAKgASIDRQ0AIANBf2ohBCADQQJ0IABqQXxqIQUgAyACakECdCAAakF8aiEGIANBKUkhAwNAIANFDQIgAiAEaiIHQShPDQMgBiAFKAIANgIAIAZBfGohBiAFQXxqIQUgBEF/aiIEQX9HDQALCyABQSBJDQMgAEEANgIAIAJBAWoiBEECRg0DIABBADYCBCAEQQNGDQMgAEEANgIIIARBBEYNAyAAQQA2AgwgBEEFRg0DIABBADYCECAEQQZGDQMgAEEANgIUIARBB0YNAyAAQQA2AhggBEEIRg0DIABBADYCHCAEQQlGDQMgAEEANgIgIARBCkYNAyAAQQA2AiQgBEELRg0DIABBADYCKCAEQQxGDQMgAEEANgIsIARBDUYNAyAAQQA2AjAgBEEORg0DIABBADYCNCAEQQ9GDQMgAEEANgI4IARBEEYNAyAAQQA2AjwgBEERRg0DIABBADYCQCAEQRJGDQMgAEEANgJEIARBE0YNAyAAQQA2AkggBEEURg0DIABBADYCTCAEQRVGDQMgAEEANgJQIARBFkYNAyAAQQA2AlQgBEEXRg0DIABBADYCWCAEQRhGDQMgAEEANgJcIARBGUYNAyAAQQA2AmAgBEEaRg0DIABBADYCZCAEQRtGDQMgAEEANgJoIARBHEYNAyAAQQA2AmwgBEEdRg0DIABBADYCcCAEQR5GDQMgAEEANgJ0IARBH0YNAyAAQQA2AnggBEEgRg0DIABBADYCfCAEQSFGDQMgAEEANgKAASAEQSJGDQMgAEEANgKEASAEQSNGDQMgAEEANgKIASAEQSRGDQMgAEEANgKMASAEQSVGDQMgAEEANgKQASAEQSZGDQMgAEEANgKUASAEQSdGDQMgAEEANgKYASAEQShGDQMgAEEANgKcASAEQSlGDQNBKEEoQdiogQEQsxEACyAEQShB2KiBARCzEQALIAdBKEHYqIEBELMRAAtBgqmBAUEdQdiogQEQ3RcACyAAKAKgASACaiEFAkAgAUEfcSIDDQAgACAFNgKgASAADwsCQAJAIAVBf2oiBEEnSw0AIAUhCCAAIARBAnRqKAIAQQAgAWsiBnYiBEUNAQJAIAVBJ0sNACAAIAVBAnRqIAQ2AgAgBUEBaiEIDAILIAVBKEHYqIEBELMRAAsgBEEoQdiogQEQsxEACwJAIAJBAWoiByAFTw0AIAZBH3EhASAFQQJ0IABqQXhqIQQDQCAEQQRqIgYgBCgCACABdiAGKAIAIAN0cjYCACAEQXxqIQQgByAFQX9qIgVJDQALCyAAIAJBAnRqIgQgBCgCACADdDYCACAAIAg2AqABIAALtwgCAX8BfiMAQTBrIgMkACADQRhqIAIgASgCAEEAEJUCAkACQCADLQAYQQRGDQAgAykDGCIEQv8Bg0IEUQ0AIAAgBDcCAAwBCyADQQA2AgwgA0EYaiACIANBDGpBsLebAUEGELkMAkAgAy0AGEEERg0AIAMpAxgiBEL/AYNCBFENACAAIAQ3AgAMAQsgA0EYaiACIANBDGpBsLqbAUEBELgMAkAgAy0AGEEERg0AIAMpAxgiBEL/AYNCBFENACAAIAQ3AgAMAQsgA0EYaiABQQhqIAIQhwECQCADLQAYQQRGDQAgAykDGCIEQv8Bg0IEUQ0AIAAgBDcCAAwBCwJAIAEoAjxFDQAgA0EYaiACIANBDGpB4sSbAUEBELgMAkAgAy0AGEEERg0AIAMpAxgiBEL/AYNCBFENACAAIAQ3AgAMAgsCQAJAAkACQCACLQBdDQAgA0EYaiACEOIOIAMtABhBBEYNACADKQMYIgRC/wGDQgRSDQELIANBADYCGCADQShqIAIgA0EYakHXrJsBQQEQuAwCQCADLQAoQQRGDQAgAykDKCIEQv8Bg0IEUg0DCwJAIAItAF0NACADQShqIAIQixICQCADLQAoQQRGDQAgAykDKCIEQv8Bg0IEUg0ECyACIAIoAjhBAWo2AjgLIANBKGogAiADQRhqQb/FmwFBBBC5DAJAIAMtAChBBEYNACADKQMoIgRC/wGDQgRSDQMLIANBKGogAiADQRhqQaHEmwFBARC4DAJAIAMtAChBBEYNACADKQMoIgRC/wGDQgRSDQMLAkAgAi0AXQ0AIANBKGogAhDiDiADLQAoQQRGDQAgAykDKCIEQv8Bg0IEUg0DCyADQShqIAFBPGogAhDZIAJAIAMtAChBBEYNACADKQMoIgRC/wGDQgRSDQMLIAItAF1BAUYNASACIAIoAjhBf2o2AjggA0EoaiACEIsSIAMtAChBBEYNASADKQMoIgRC/wGDQgRRDQEMAgsgACAENwIADAMLIANBKGogAiADQRhqQabEmwFBARC4DCADLQAoQQRGDQEgAykDKCIEQv8Bg0IEUQ0BCyAEQv8Bg0IEUQ0AIAAgBDcCAAwBCyADQRhqIAIgA0EMakGz/ZwBQQEQuAwCQCADLQAYQQRGDQAgAykDGCIEQv8Bg0IEUQ0AIAAgBDcCAAwBCwJAIAEtADRBA0YNACADQRhqIAIgA0EMakHjxJsBQQEQuAwCQCADLQAYQQRGDQAgAykDGCIEQv8Bg0IEUQ0AIAAgBDcCAAwCCyADQRhqIAFBIGogAhDNByADLQAYQQRGDQAgAykDGCIEQv8Bg0IEUQ0AIAAgBDcCAAwBCyADQRhqIAFBOGogAhDhHAJAIAMtABhBBEYNACADKQMYIgRC/wGDQgRRDQAgACAENwIADAELIABBBDoAAAsgA0EwaiQAC/sIAQh/IAEgAEHAAGoQhQoCQCAAKAKEASICRQ0AIAAoAoABIgMgAkHYAGxqIQQDQAJAAkAgAygCACICQQVHDQAgASADKAIEEIwBDAELIAJBBEYNAAJAAkACQCACDgQDAAECAwsgAygCBEEBRw0CIAEgAygCCBCMAQwCCyABIAMoAgQiBUHAAGoQhQoCQCAFKAKEASIGRQ0AIAUoAoABIQIgBkHYAGwhBgNAAkACQAJAIAIoAgBBfGoOAgIAAQsgASACQQRqKAIAEIwBDAELIAIgARD6BAsgAkHYAGohAiAGQah/aiIGDQALCwJAIAUoAngiAkUNACACELgYIAIoAgAgAkEEaigCABDAICACQRRBBBCeEgsgBUEANgJ4AkAgBSgCmAEiAkUNACAFKAKUASIHIAJBKGxqIQgDQAJAAkACQAJAAkAgBygCAA4FBAABAgMECyAHKAIEQQFHDQMgASAHKAIIEIwBDAMLIAEgBygCBBCMAQwCCyAHKAIEIglBwABqIAEQjQ8CQCAJQZgBaigCACIGRQ0AIAlBlAFqKAIAIQIgBkEobCEGA0AgASACEKEHIAJBKGohAiAGQVhqIgYNAAsLIAktADxBBkYNASABIAlBEGoQhQoMAQsgBygCDCICRQ0AIAJBKGwhBiAHKAIIQQRqIQIDQAJAAkACQAJAAkAgAkF8aigCAA4FBAABAgMECyACKAIAQQFHDQMgASACQQRqKAIAEIwBDAMLIAEgAigCABCMAQwCCyACIAEQgQkMAQsgAiABEO0GCyACQShqIQIgBkFYaiIGDQALCyAHQShqIgcgCEcNAAsLIAUtADxBBkYNASABIAVBEGoQhQoMAQsgAygCDCICRQ0AIAJBKGwhBiADKAIIQQRqIQIDQAJAAkACQAJAAkAgAkF8aigCAA4FBAABAgMECyACKAIAQQFHDQMgASACQQRqKAIAEIwBDAMLIAEgAigCABCMAQwCCyACIAEQgQkMAQsgAiABEO0GCyACQShqIQIgBkFYaiIGDQALCyADQdgAaiIDIARHDQALCwJAIAAoAngiAkUNACACELgYIAIoAgAgAkEEaigCABDAICACQRRBBBCeEgsgAEEANgJ4AkAgACgCmAEiAkUNACAAKAKUASIHIAJBKGxqIQMDQAJAAkACQAJAAkAgBygCAA4FBAABAgMECyAHKAIEQQFHDQMgASAHKAIIEIwBDAMLIAEgBygCBBCMAQwCCyAHKAIEIgJBwABqIAEQjQ8gAkGQAWogARDtBiACLQA8QQZGDQEgASACQRBqEIUKDAELIAcoAgwiAkUNACACQShsIQYgBygCCEEEaiECA0ACQAJAAkACQAJAIAJBfGooAgAOBQQAAQIDBAsgAigCAEEBRw0DIAEgAkEEaigCABCMAQwDCyABIAIoAgAQjAEMAgsgAiABEIEJDAELIAIgARCRIgsgAkEoaiECIAZBWGoiBg0ACwsgB0EoaiIHIANHDQALCwJAIAAtADxBBkYNACABIABBEGoQhQoLC9UIAQ1/IwBBwABrIgUkAAJAIAMoAggNAAJAIAEgACgC0AIiBk8NAAJAAkACQAJAAkAgACgCzAIgAUEUbGooAgBBfWpBBEkNACAFIAE2AgQgASAEKAIUIgZPDQQCQAJAIAQoAhAgAUECdGoiBygCACIIIAQoAhgiBkkNACAEKAIIIQkMAQsgCCAEKAIIIglPDQQgBCgCBCAIQQJ0aigCACABRg0CCyAFIAY2AgggBiAJTw0CIAQoAgQgBkECdGogATYCACAEIAZBAWo2AhggByAGNgIADAELAkAgAygCAA0AIANBhOGEARDpFQsgAygCBCIKIAE2AgAgBCgCGCEJIAQoAgQhCyAEKAIIIQwgBCgCECENIAQoAhQhDkEBIQ8DQCADIA9Bf2oiDzYCCCAFIAogD0ECdGooAgAiCDYCBAJAAkACQAJAAkACQCAIIA5PDQAgCSAMIAkgDEsbIRADQAJAIA0gCEECdGoiBigCACIBIAlPDQAgASAMTw0DIAsgAUECdGooAgAgCEYNBwsgBSAJNgIIIAkgEEYNAyALIAlBAnRqIAg2AgAgCCAOTw0FIAYgCTYCACAEIAlBAWoiCTYCGCAIIAAoAtACIgFPDQQCQAJAAkACQAJAAkAgACgCzAIgCEEUbGoiASgCAA4JDAwMAAIDAQwMDAsgASgCCCACcUUNCwsgASgCBCEIDAMLIAEoAggiBkUNCSABKAIEIgcoAgAhCAJAIAZBAnQiEUF8aiIBQQJ2IgYgAygCACAPa00NACADIA8gBkEEQQQQoBcgAygCCCEPCyADKAIEIQogEUEERg0BIAogD0ECdGohBiAPIBFBeGpBAnZqQQFqIQ8DQCAGIAcgAWooAgA2AgAgBkEEaiEGIAFBfGoiAQ0ADAILCyABKAIIIQYgASgCBCEIAkAgDyADKAIARw0AIANBlOGEARDpFSADKAIEIQoLIAogD0ECdGogBjYCACAPQQFqIQ8LIAMgDzYCCAsgBSAINgIEIAggDkkNAAsLIAggDkGk54QBELMRAAsgASAMQbTnhAEQsxEACyAFQQM2AhAgBUHs5oQBNgIMIAVCAzcCGCAFQb4BNgI4IAVBKjYCMCAFQSo2AiggBSAMNgI8IAUgBUEkajYCFCAFIAVBBGo2AjQgBSAFQTxqNgIsIAUgBUEIajYCJCAFQQxqQYTnhAEQhRsACyAIIAFB8LuEARCzEQALIAggDkGU54QBELMRAAsgDw0ACwsgBUHAAGokAA8LIAVBAzYCECAFQezmhAE2AgwgBUIDNwIYIAVBvgE2AjggBUEqNgIwIAVBKjYCKCAFIAk2AjwgBSAFQSRqNgIUIAUgBUEEajYCNCAFIAVBPGo2AiwgBSAFQQhqNgIkIAVBDGpBhOeEARCFGwALIAggCUG054QBELMRAAsgASAGQaTnhAEQsxEACyABIAZB8LuEARCzEQALQdzfhAFBIkH04IQBEN0XAAvcCAIIfwF+IwBBMGsiAiQAIAJBADYCFCACQoCAgIAQNwIMIAEoAmghAwJAAkAgASgCXCIEDQAgAyEFDAELA0ACQAJAIAEoAlgiBiwAACIFQX9MDQAgBUH/AXEhBQwBCyAGLQABQT9xIQcgBUEfcSEIAkAgBUFfSw0AIAhBBnQgB3IhBQwBCyAHQQZ0IAYtAAJBP3FyIQcCQCAFQXBPDQAgByAIQQx0ciEFDAELIAdBBnQgBi0AA0E/cXIgCEESdEGAgPAAcXIhBQsCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAFQVpqDhkEAQEBAQEBAQEBAQEBAQEBAQEBAQEBDAECAAsgBUGFf2oOAwsAAgALIAVBgAFPDQNBASEFDAQLIAEgBEF/ajYCXCABIAZBAWo2AlggASABKAJoIgZBAWo2AmhBAC0AwPGdARpBEBCFASIFRQ0EIAVBBjYCDCAFQY+vmQE2AgggBUEHNgIEIAVBiK+ZATYCACACQQI2AiQgAiAFNgIgIAJCsYCAgCg3AxggASAGIAJBGGoQ5x8MCAsgASAEQX9qNgJcIAEgBkEBajYCWCABIAEoAmgiBkEBajYCaEEALQDA8Z0BGkEQEIUBIgVFDQMgBUEKNgIMIAVBnK+ZATYCCCAFQQc2AgQgBUGVr5kBNgIAIAJBAjYCJCACIAU2AiAgAkKxgICAKDcDGCABIAYgAkEYahDnHwwHCyACQQxqIAEoAmAgAyABKAJsa2oiBSAFIAEoAmggA2tqEOIYIAJBGGogARBVAkAgAigCGCIFQYCAxABGDQACQAJAIAVBgAFJIgRFDQBBASEDDAELAkAgBUGAEE8NAEECIQMMAQtBA0EEIAVBgIAESRshAwsgAigCFCEHIAIoAiAhCCACKAIcIQkgAkEMaiADEOYbIAIoAhAgAigCFGohBiAEDQQgBUGAEEkNBQJAIAVBgIAESQ0AIAYgBUE/cUGAAXI6AAMgBiAFQRJ2QfABcjoAACAGIAVBBnZBP3FBgAFyOgACIAYgBUEMdkE/cUGAAXI6AAEMBwsgBiAFQT9xQYABcjoAAiAGIAVBDHZB4AFyOgAAIAYgBUEGdkE/cUGAAXI6AAEMBgsgAigCHCIFQQhqEJsDIAVBIEEIEJ4SDAYLAkAgBUGAEE8NAEECIQUMAQtBA0EEIAVBgIAESRshBQsgASAEIAVrIgQ2AlwgASAGIAVqNgJYIAEgASgCaCAFajYCaCAEDQYMBQsACyAGIAU6AAAMAQsgBiAFQT9xQYABcjoAASAGIAVBBnZBwAFyOgAACyACIAMgB2o2AhQgASgCaCEDIAkgCBCOIAsgASgCXCIEDQELCyABKAJoIQULIAJBDGogASgCYCADIAEoAmxraiIGIAYgBSADa2oQ4hggAkEMahDqHCEKAkAgASgCCEEKRg0AIAFBCGoQxAgLIAEgCjcDECABQQU2AgggAEGAlAE7AQAgAkEwaiQAC48HAgV/Bn4CQAJAAkAgASgCBCIEDQBBACECDAELIANBB3EhBSABKQMQIglC88rRy6eM2bL0AIUhCiAJQoPfkfOWzNy35ACFIQlBACEGQvXKzYPXrNu38wAhCwJAAkAgA0F4cSIHDQBC4eSV89bs2bzsACEMQQAhCAwBC0EAIQhC4eSV89bs2bzsACEMA0AgAiAIaikAACINIAqFIgogDHwiDCALIAl8IgsgCUINiYUiCXwiDiAJQhGJhSEJIAwgCkIQiYUiCkIViSAKIAtCIIl8IguFIQogDkIgiSEMIAsgDYUhCyAIQQhqIgggB0kNAAsgB0F/akF4cUEIaiEIC0IAIQ0CQCAFQQRJDQAgAiAIajUAACENQQQhBgsCQCAGQQFyIAVPDQAgAiAIaiAGajMAACAGQQN0rYYgDYQhDSAGQQJyIQYLAkAgBiAFTw0AIAIgBiAIamoxAAAgBkEDdK2GIA2EIQ0LIAEoAgwiCEUNASABKAIIIAEoAgAgDSADrUI4hoQiDSAKhSIKQhCJIAogDHwiCoUiDCALIAl8IgtCIIl8Ig4gDYUgCiALIAlCDYmFIgl8IgogCUIRiYUiCXwiCyAJQg2JhSIJIAxCFYkgDoUiDCAKQiCJQu4BhXwiCnwiDSAJQhGJhSIJQg2JIAkgDEIQiSAKhSIKIAtCIIl8Igt8IgmFIgxCEYkgDCAKQhWJIAuFIgogDUIgiXwiC3wiDIUiDUINiSANIApCEIkgC4UiCiAJQiCJfCIJfCILhSINIApCFYkgCYUiCSAMQiCJfCIKfCIMQiCJIg4gCUIQiSAKhSIJQhWJIgqFIA1CEYkgDIUiDIUiDUIgiKcgBHBBA3RqIgcoAgQgDELdAYUiDCAJIAtCIIl8Igl8IgtCIIkgCiAJhSIJQhCJIAkgDnwiCYUiCnwiDiAKQhWJhSIKQhCJIAogDEINiSALhSILIAl8IglCIIl8IgqFIgxCFYkgDCAJIAtCEYmFIgkgDnwiC0IgiXwiDIUiDkIQiSAOIAlCDYkgC4UiCSAKfCIKQiCJfCILhUIViSAJQhGJIAqFIglCDYkgCSAMfIUiCUIRiYUgCSALfCIJQiCIhSAJhadqIAcoAgAgDadsaiAIcEEDdGohCCAIQQAgCCgCACAIQQRqKAIAIAIgAxCZHBshAiAIQQhqIQgLIAAgCDYCBCAAIAI2AgAPC0H4xpgBEM8ZAAvQCAIEfwF+IwBB8ABrIgMkACADQTBqIAIgASgCACIEQQAQlQICQAJAIAMtADBBBEYNACADKQMwIgdC/wGDQgRRDQAgACAHNwIADAELAkACQCACLQBdDQACQAJAAkAgASkDCFANACADQRhqIAFBCGoiBRD+EQJAIAMoAhxBA0kNACACLQBiQf8BcUEITw0AIANBEGogBRD+ESADKAIQIAMoAhRB3wAQtRoNAgsgASgCBCEBIANBCGogBRD+ESADQTBqIAIgBCABIAMoAgggAygCDBC/DSADLQAwQQRGDQQgAykDMCIHQv8Bg0IEUQ0EIAAgBzcCAAwFCyABKAIEIQUgA0EwaiABQRBqENgQIANB4ABqIAIgBCAFIAMoAjQiASADKAI4EL8NIAMtAGBBBEYNASADKQNgIgdC/wGDQgRRDQEgACAHNwIAIAMoAjAgARCXIgwECyABKAIEIQEgAyAFEP4RIANBMGogAygCACADKAIEQd8AQQFBABC0ByADQeAAaiACIAQgASADKAI0IgUgAygCOBC/DQJAIAMtAGBBBEYNACADKQNgIgdC/wGDQgRRDQAgACAHNwIAIAMoAjAgBRCXIgwECyADKAIwIAUQlyIMAgsgAygCMCABEJciIANBMGogAiAEIAVB/MmbAUEBEL8NIAMtADBBBEYNASADKQMwIgdC/wGDQgRRDQEgACAHNwIADAILIAEoAhAhBSADQTBqEKsRIANBAjoAPCAFIANBMGoQtBMhBiADKAIwIAMoAjQQsSACQAJAIAbAQX9KDQAgA0EwahCrESADQQA6ADwgBSADQTBqELQTIQYgAygCMCADKAI0ELEgAkAgBsBBAUgNACADQSRqIAFBEGoQ2BAMAgsgA0HgAGpBCGogBRDTEyIFQQhqKAIANgIAIANB4ABqQQ9qIAVBD2otAAA6AAAgAyAFKQIANwNgIAMgBS8ADTsAbSADQQIgBS0ADGs6AGwgA0HUAGogA0HgAGoQmAogA0EUNgJQIANBATYCNCADQYDKmwE2AjAgA0IBNwI8IAMgA0HUAGo2AkwgAyADQcwAajYCOCADQSRqIANBMGoQjRUgAygCVCADKAJYEJciIAMoAmAgAygCZBCxICAFENghDAELIANB4ABqIAUQmAogA0EUNgJYIANBATYCNCADQYzKmwE2AjAgA0IBNwI8IAMgA0HgAGo2AlQgAyADQdQAajYCOCADQSRqIANBMGoQjRUgAygCYCADKAJkEJciCyADQTBqIAIgBCABKAIEIgUgAygCKCIBIAMoAiwQvw0CQAJAIAMtADBBBEYNACADKQMwIgdC/wGDQgRSDQELIANBMGogAiAEIAVB/MmbAUEBEL8NAkAgAy0AMEEERg0AIAMpAzAiB0L/AYNCBFINAQsgAygCJCABEJciDAELIAAgBzcCACADKAIkIAEQlyIMAQsgAEEEOgAACyADQfAAaiQAC8AIAQV/IwBB8ABrIg4kACAOIAw2AhAgDiALNgIMAkACQCAAIAEgBCACIAMgBSAGQQAQwARFDQBBASELDAELIAdBBGohDyAIIAlBA3RqIQQgDkE4akEEaiEAIAcoAgQhEEEBIQwDQAJAIAgiBiAERw0AQQAhCwwCCyAMIAYoAgRBAWoiCyAMIAtLGyIJIAxrQQFqIQwgBkEIaiEIAkADQAJAIAxBf2oiDA0AIAooAgAhDAJAAkAgBigCACIRKAIAIhIoAgAiC0GAgICAeEYNACAMQYCAgIB4Rg0AIBIoAggiDCAKKAIIRw0EIAxBAWohBiASKAIEQQhqIQwgCigCBEEIaiELA0AgBkF/aiIGRQ0CIAwoAgAiBSALKAIARw0FIAxBfGohAyALQXxqIQIgDEEMaiEMIAtBDGohCyADKAIAIAIoAgAgBRCSFUUNAAwFCwsgC0GAgICAeEcNAyAMQYCAgIB4Rw0DCyASKAIMIAooAgxHDQIgEigCECAKKAIQRw0CAkACQAJAAkAgDUH/AXEOAwABAgALIA5BLGogBygCABDwEiAOQSBqIA4oAjAiDCAOKAI0QQIQ3AggDkEJNgJkIA5BFDYCXCAOQQc2AlQgDiAHQSRqNgJQIA5BAzYCPCAOQbiUgAE2AjggDkIDNwJEIA4gDkEMajYCYCAOIA5BIGo2AlggDiAOQdAAajYCQCAOQRRqIA5BOGoQ8xQgDigCICAOKAIkEI4gIA4oAiwgDBCOIAwCCyAOQQQ2AjwgDkHQlIABNgI4IA5CBDcCRCAOQQk2AmwgDkEHNgJkIA5BBzYCXCAOQQc2AlQgDiAHNgJYIA4gB0E8ajYCYCAOIAdBJGo2AlAgDiAOQdAAajYCQCAOIA5BDGo2AmggDkEUaiAOQThqEPMUDAELIA5BAjYCVCAOQfCUgAE2AlAgDkICNwJcIA5BCTYCRCAOQQc2AjwgDiAPNgI4IA4gDkE4ajYCWCAOIA5BDGo2AkAgDkEUaiAOQdAAahDzFAsgDkHEAGogCkEcai8BADsBACAOQQI2AlQgDkHQn4UBNgJQIA5CATcCXCAOQRU2AjAgDiAKKQIUNwI8IA4gDkEsajYCWCAOIA5BOGo2AiwgDiAOQRRqNgI4IAEgDkHQAGoQrR4hCyAOKAIUIA4oAhgQjiAMBAsgDkEANgJgQQEhCyAOQQE2AlQgDkGAlYABNgJQIA5CBDcCWCABIA5B0ABqEK0eRQ0ADAMLCyAOQSxqIBAQ8BIgACARKAIAIgwpAhQ3AgAgAEEIaiAMQRxqLwEAOwEAQQEhCyAOQQE2AlQgDkGY75sBNgJQIA5CATcCXCAOQRU2AiQgDiAOQSBqNgJYIA4gDkEsajYCOCAOIA5BOGo2AiAgASAOQdAAahCtHiEGIA4oAiwgDigCMBCOICAJQQFqIQwgBkUNAAsLIA5B8ABqJAAgCwvaCAIGfwF+IwBB4AFrIgIkACACIAEQvgkiAzYCBAJAAkACQAJAIANB2wBHDQAgAkEIakEIaiIEIAEoAgAiA0HYAGooAgA2AgAgAiADKQJQNwMIIANB0ABqIQUCQCABEMwbDQAgAkEsaiAFQQhqKAIANgIAIAJBGGpBCGogBCgCADYCACACIAIpAwg3AxggAiAFKQIANwIkIAJBBDYCQCAAQQRqIAEoAgQgASgCCCACQRhqIAJBwABqENEMIABBiYDEADYCAAwECyABEL4JIgZB3gBGDQEMAgsgAkEANgJAIAJBBGpBmIKFASACQcAAakG0jIUBELQZAAsgARDMGw0AIAJBLGogBUEIaigCADYCACACQRhqQQhqIAJBCGpBCGooAgA2AgAgAiACKQMINwMYIAIgBSkCADcCJCACQQQ2AkAgAEEEaiABKAIEIAEoAgggAkEYaiACQcAAahDRDCAAQYmAxAA2AgAMAQsgAkHAAGpBCGoiAyAFQQhqKAIAIgQ2AgAgAkHAAGpBFGogBDYCACACIAUpAgAiCDcCTCACQRhqQRRqIAMpAwA3AgAgAkE0aiACQdAAaikDADcCACACQQA2AiAgAkKAgICAwAA3AhggAiAINwIkIAJBJGohBAJAAkADQCABEL4JQS1HDQEgAyABEK8MIAJBADoAYCACQoGAxIDQBTcCQCACQRhqIAJBwABqEI8IIAEQzBsNAAsgAkGYAWpBCGogAkEIakEIaigCACIDNgIAIAJBrAFqIAM2AgAgAiACKQMIIgg3A5gBIAIgCDcCpAEgAkEENgJAIABBBGogASgCBCABKAIIIAJBmAFqIAJBwABqENEMDAELAkAgAigCIA0AIAEQvglB3QBHDQAgAkHAAGpBCGogARCvDCACQQA6AGAgAkKBgMSA0As3AkAgAkEYaiACQcAAahCPCCABEMwbDQAgAkGsAWogBUEIaigCADYCACACQZgBakEIaiACQQhqQQhqKAIANgIAIAIgAikDCDcDmAEgAiAFKQIANwKkASACQQQ2AkAgAEEEaiABKAIEIAEoAgggAkGYAWogAkHAAGoQ0QwMAQsgAkGwAWpBFGogBUEIaigCADYCACACQbABakEIaiIBIAJBCGpBCGooAgA2AgAgAkHIAWpBCGoiAyAEQQhqKAIAIgc2AgAgAkHIAWpBFGogBzYCACACIAIpAwg3A7ABIAIgBSkCADcCvAEgAiAEKQIAIgg3A8gBIAIgCDcC1AECQEEkRQ0AIABB9ABqIAJBGGpBJPwKAAALIABCBDcCCCAAQoeAxAA3AgAgACAGQd4ARjoAcCAAIAIpA8gBNwIQIABBGGogAykDADcCACAAQSBqIAJByAFqQRBqKQMANwIAIAAgAikDsAE3AlggAEHgAGogASkDADcCACAAQegAaiACQbABakEQaikDADcCAAwBCyAAQYmAxAA2AgAgAkEYahDnFwsgAkHgAWokAAuCCAIMfwN+IwBBwABrIgIkACACIAE2AgwgACgCDCEDIAIgAkEMajYCEAJAIANBf0YNAAJAAkACQCADIAAoAgQiASABQQFqQQN2QQdsIAFBCEkbIgFBAXZJDQACQAJAIAEgAyABIANLGyIBQQ5JDQAgAUH+////AUsNBUF/IAFBA3RBCGpBB25Bf2pndkEBaiEBDAELQQRBCEEQIAFBB0kbIAFBA0kbIQELIAJBMGpBKEEIIAEQ+AwgAigCNCEEIAIoAjAiBUUNAiACKQI4IQ4CQCAEQQlqIgFFDQAgBUH/ASAB/AsACyACIA5CIIg+AiwgAiAOpyIGNgIoIAIgBDYCJCACIAU2AiAgAkEINgIcQQAhB0EAIQECQCADRQ0AIAVBCGohCCAAKAIAIgkpAwBCf4VCgIGChIiQoMCAf4MhDkEAIQEDQAJAIA5CAFINAANAIAFBCGohASAJQQhqIgkpAwBCgIGChIiQoMCAf4MiDkKAgYKEiJCgwIB/UQ0ACyAOQoCBgoSIkKDAgH+FIQ4LAkAgACgCAEEAIA56p0EDdiABaiIKa0EobGoiC0FYaikDACIPQgODQgBSDQAgD6cpAwghDwsgD6dB3cvdnnlsIA9CIIinakHdy92eeWwgC0FgaigCAGpB3cvdnnlsIQwCQCALQWhqKQMAIg9CA4NCAFINACAPpykDCCEPCwJAIAUgDCAPp2pB3cvdnnlsIA9CIIinakHdy92eeWxBD3ciDCAEcSILaikAAEKAgYKEiJCgwIB/gyIPQgBSDQBBCCENA0AgCyANaiELIA1BCGohDSAFIAsgBHEiC2opAABCgIGChIiQoMCAf4MiD1ANAAsLIA5Cf3whEAJAIAUgD3qnQQN2IAtqIARxIgtqLAAAQQBIDQAgBSkDAEKAgYKEiJCgwIB/g3qnQQN2IQsLIBAgDoMhDiAFIAtqIAxBGXYiDDoAACAIIAtBeGogBHFqIAw6AAAgBSALQX9zQShsaiILIAAoAgAgCkF/c0EobGoiCikAADcAACALQSBqIApBIGopAAA3AAAgC0EYaiAKQRhqKQAANwAAIAtBEGogCkEQaikAADcAACALQQhqIApBCGopAAA3AAAgA0F/aiIDDQALIAAoAgwhAQsgAiABNgIsIAIgBiABazYCKAJAA0AgB0EQRg0BIAAgB2oiASgCACEJIAEgAkEUaiAHakEMaiILKAIANgIAIAsgCTYCACAHQQRqIQcMAAsLIAIoAiQiAUUNASABIAFBKGxBL2pBeHEiCWpBCWoiAUUNASACKAIgIAlrIAFBCBCeEgwBCyAAIAJBEGpB8ARBKBCBBQtBgYCAgHghBAsgAkHAAGokACAEDwsQ2RkAC4UIAQR/AkACQAJAAkACQAJAAkAgACgCAA4IAAECAwYGBAUACwJAIAAoAiAiAkEIaigCACIDRQ0AIAEtAAANACACQQRqKAIAIQAgA0EMbCEDA0ACQCABLQAADQAgACgCACABEJUBCyAAQQxqIQAgA0F0aiIDDQALCwJAIAJBFGooAgAiA0UNACACQRBqKAIAIQAgA0HYAGwhAwNAIAAgARD2AiAAQdgAaiEAIANBqH9qIgMNAAsLIAIoAjAiAEUNBSABLQAADQUgACABEJUBDwsCQCAAKAIgIgRBCGooAgAiA0UNACAEQQRqKAIAIgAgA0EGdGohBQNAAkAgACICQThqKAIAIgNFDQAgAS0AAA0AIAJBNGooAgAhACADQQxsIQMDQAJAIAEtAAANACAAKAIAIAEQlQELIABBDGohACADQXRqIgMNAAsLIAIgARDzCCACQcAAaiIAIAVHDQALCwJAIARBFGooAgAiA0UNACABLQAADQAgBEEQaigCACEAIANBDGwhAwNAAkAgAS0AAA0AIAAoAgAgARCVAQsgAEEMaiEAIANBdGoiAw0ACwsgBCgCGEGAgICAeEYNBCAEQSBqKAIAIgNFDQQgAS0AAA0EIARBHGooAgAhACADQTBsIQMDQAJAIAEtAAANACAAIAEQ9AILIABBMGohACADQVBqIgMNAAwFCwsgACgCBCIAQQhqKAIAIgNFDQMgAEEEaigCACIAIANBOGxqIQIDQCAAIAEQ8wgCQCAAQTBqKAIAIgNFDQAgAS0AAA0AIAMgARCVAQsgAEE4aiIAIAJHDQAMBAsLIAAoAgQiAEEIaigCACIDRQ0CIABBBGooAgAiACADQThsaiECA0AgACABEPMIAkAgAEEwaigCACIDRQ0AIAEtAAANACADIAEQlQELIABBOGoiACACRw0ADAMLCyAAKAIEIgBBKGooAgAiA0UNASADQTBsIQMgAEEkaigCAEEoaiEAA0ACQCAAKAIAIgJFDQAgAS0AAA0AIAIgARCVAQsgAEEwaiEAIANBUGoiAw0ADAILCyAAKAIEIgAtAEUiA0EDRg0AAkAgA0ECRg0AAkAgACgCQCIALQAlQQJGDQAgAEEgaiABEP8PDwsgAEEIaigCACIDRQ0BIABBBGooAgAhACADQThsIQMDQAJAAkAgACgCAEEJRw0AIAEtAAANASAAQQhqIAEQ9AIMAQsgACABEOoDCyAAQThqIQAgA0FIaiIDDQAMAgsLIABBKGooAgAiA0UNACAAQSRqKAIAIQAgA0E4bCEDA0ACQAJAIAAoAgBBCUcNACABLQAADQEgAEEIaiABEPQCDAELIAAgARDqAwsgAEE4aiEAIANBSGoiAw0ACwsLuwgBBH8CQAJAAkACQAJAAkAgACgCAA4EAwABAgMLIAAoAgRBAUcNAiABLQAEQQFHDQICQAJAIAAoAggiACgCAEFmag4DBgABBQsgACgCCEEFRg0FDAQLIAAoAgxFDQMgAUEAOgAEDwsCQCAAKAIEIgItAGxBAkcNACACQcAAaiEAA0AgACgCGCIALQAsQQJGDQALCwJAIAJBhAFqKAIAIgBFDQAgAkGAAWooAgAiAyAAQdgAbGohBANAAkACQCADKAIAIgBBBUcNACABQQA6AAQMAQsgAEEERg0AAkACQAJAAkACQCAADgQFAAECBQsgAygCBEEBRw0EIAEtAARBAUcNBAJAAkAgAygCCCIAKAIAQWZqDgMFAAEECyAAKAIIQQVGDQQMAwsgACgCDEUNAiABQQA6AAQMBAsgASADKAIEEMILDAMLIANBDGooAgAiBUUNAiADQQhqKAIAIQAgBUEobCEFA0AgACABEI0FIABBKGohACAFQVhqIgUNAAwDCwsgACABENsBDAELIAFBADoABAsgA0HYAGoiAyAERw0ACwsCQCACQZgBaigCACIDRQ0AIAJBlAFqKAIAIQAgA0EobCEDA0AgACABEI0FIABBKGohACADQVhqIgMNAAsLIAItADwiAUEGRg0BIAFBAkcNASACQRBqIQEDQCABKAIYIgEtACxBAkYNAAwCCwsgACgCDCIDRQ0AIAAoAggiBSADQShsaiECA0ACQAJAAkACQAJAAkACQAJAAkAgBSgCAA4FCAABAgMICyAFKAIEQQFHDQcgAS0ABEEBRw0HAkACQCAFKAIIIgAoAgBBZmoOAwgAAQcLIAAoAghBBUYNBwwGCyAAKAIMRQ0FIAFBADoABAwHCyABLQAEQQFHDQYCQAJAIAUoAgQiACgCAEFmag4DBQABBAsgACgCCEEFRg0EDAMLIAAoAgxFDQIgAUEAOgAEDAYLAkAgBSgCBCIELQBsQQJHDQAgBEHAAGohAANAIAAoAhgiAC0ALEECRg0ACwsCQCAEKAKEASIDRQ0AIAQoAoABIQAgA0HYAGwhAwNAAkACQCAAKAIAQQVHDQAgAUEAOgAEDAELIAAgARDEBwsgAEHYAGohACADQah/aiIDDQALCwJAIAQoApgBIgNFDQAgBCgClAEhACADQShsIQMDQCAAIAEQjQUgAEEoaiEAIANBWGoiAw0ACwsgBC0APCIAQQZGDQUgAEECRw0FIARBEGohAANAIAAoAhgiAC0ALEECRg0ADAYLCyAFQQxqKAIAIgNFDQQgBUEIaigCACEAIANBKGwhAwNAIAEgABDiAyAAQShqIQAgA0FYaiIDDQAMBQsLIAAgARDbAQwDCyABQQA6AAQMAgsgACABENsBDAELIAFBADoABAsgBUEoaiIFIAJHDQALCw8LIAAgARDbAQ8LIAFBADoABAvSCAENfyMAQbABayICJAAgAkEoaiABEMICIAIoAiwhAwJAAkAgAigCKCIEQYCAgIB4Rw0AIABBgICAgHg2AgAgACADNgIEDAELIAIoAjAhBSACQQRBCEEoQcCnmwEQ2BRBACEGIAJBADYCFCACIAIoAgQiBzYCECACIAIoAgA2AgwgAiAENgIgIAIgAzYCGCACIAMgBUEGdCIIaiIJNgIkIAJB2ABqIQogAkHoAGpBBGohCyACQShqQQRyIQxBBCENAkACQANAAkACQAJAAkACQAJAIAhFDQACQCADKAIAIgVBB0YNACADQQRqIQQgAiAFNgIoAkBBPEUNACAMIARBPPwKAAALIANBwABqIQ4gBQ4EAgMEBQgLIANBwABqIQkLIAIgCTYCHCACQRhqEMMRAkAgAS0AyAEiA0EBRw0AIAEQhw4gAEEIaiACQQxqQQhqKAIANgIAIAAgAikCDDcCAAwJCyABKALEASEEIAEoAsABIQUgAkGMAWogAxDeGyACQQE2AiwgAkGY75sBNgIoIAJCATcCNCACQYoFrUIghkGIo5sBrYQ3AxggAiACQRhqNgIwIAJBmAFqIAJBKGoQjRUgAkGsAWogAkGUAWooAgA2AgAgAiACKQKMATcCpAEgBSAEIAJBmAFqEIUVIQMCQCABLQDIAUGiAUcNACABEMcRIQQgARCHDiABIAQQ5RELIABBgICAgHg2AgAgACADNgIEDAcLIAtBGGogA0EgaikCADcCACALQRBqIANBGGopAgA3AgAgC0EIaiADQRBqKQIANwIAIAsgA0EIaikCADcCAAwDCyACQegAakEYaiAEQRhqKAIANgIAIAJB6ABqQRBqIARBEGopAgA3AwAgAkHoAGpBCGogBEEIaikCADcDACACIAQpAgA3A2gMAgsgAkHoAGpBEGogBEEQaikCADcDACACQegAakEIaiAEQQhqKQIANwMAIAIgBCkCADcDaAwBCyACQegAakEYaiAEQRhqKAIANgIAIAJB6ABqQRBqIARBEGopAgA3AwAgAkHoAGpBCGogBEEIaikCADcDACACIAQpAgA3A2gLAkAgBiACKAIMRw0AIAJBDGoQvhYgAigCECEHCyAHIA1qIgNBfGogBTYCAAJAQSRFDQAgAyACQegAakEk/AoAAAsgAiAGQQFqIgY2AhQgChDMHQJAIAIoAihBBEkNACACQShqEOsSCyAIQUBqIQggDUEoaiENIA4hAwwACwsgAiAONgIcIAJBmAFqQQRyIAEtAMgBEN4bIAJB1wA2AqwBIAJB4KebATYCqAEgAkGwgICAeDYCmAEgASgCwAEgASgCxAEgAkGYAWoQhRUhAwJAIAEtAMgBQaIBRw0AIAEQxxEhBCABEIcOIAEgBBDlEQsgAEGAgICAeDYCACAAIAM2AgQgChDMHSACQShqEOsSIAJBGGoQwxELIAJBDGoQqx8LIAJBsAFqJAAL5AgCB38BfiMAQdAAayIBJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIAIgJBCEkNAAJAIAJBeGoOBAoMDgAKCyAAKAIEIgMoAghFDQEMDwsgAg4LDwECAwQFBgcJCw0ACyAAKAIEIgNBBGooAgAhAgJAIAMoAggiBEUNAANAIAIQsAMgAkEIaiECIARBf2oiBA0ACyADQQRqKAIAIQILIAMoAgAgAkEEQQgQwBEgA0EkQQQQnhIMDwsgACgCBCICKAIAIAJBBGooAgBBBEEcEMARIAJBPEEEEJ4SDA4LIAAoAgRBIEEEEJ4SDA0LIAAoAgRBGEEEEJ4SDAwLIAAoAgRBHEEEEJ4SDAsLIAAoAgQiAhDjFCACQThBBBCeEgwKCyAAKAIEQRxBBBCeEgwJCyAAKAIEIgIQkAMgAkH0AEEEEJ4SDAgLIAAoAgQiAygCJCgCAEEGSw0FCyAAKAIEIgIoAiQQsAMgAigCJEEIQQQQnhIgAkHEAEEEEJ4SDAYLIAAoAgQiAygCLCgCAEEGSw0DCyAAKAIEIgIQ5BQgAkHIAEEEEJ4SDAQLIAAoAgQiAygCCA0BCyAAKAIEIgNBBGooAgAhAgJAIAMoAggiBEUNAANAIAIQsAMgAkEIaiECIARBf2oiBA0ACyADQQRqKAIAIQILIAMoAgAgAkEEQQgQwBEgA0EkQQQQnhIMAgtBAC0AwPGdARpBCBCFASIERQ0CIAFByABqIgVCADcDACABQThqQQhqIgZCADcDACABQgA3AzggAUEYaiABQThqEJ0VIAAgASgCHDYCBCAAQQA2AgAgBCADNgIEIAQgAjYCACABIAQ2AihBASEEIAFBATYCJANAIAEgBEF/aiICNgIsIAEoAiggAkEDdGoiAygCACECIAEgAygCBCIHNgI0IAEgAjYCMAJAAkAgAkEISQ0AAkACQAJAAkAgAkF4ag4EAQIAAwELIAcoAgghAiAHQQA2AgggBygCBCEEIAFBADYCSCABIAI2AkQgASAHNgJAIAEgBCACQQN0ajYCPCABIAQ2AjggAUEkaiABQThqEJ8LDAMLIAcoAiQhAiAFQgA3AwAgBkIANwMAIAFCADcDOCABQQhqIAFBOGoQnRUgAikCACEIIAIgASgCDDYCBCACQQA2AgAgAyAINwIAIAEgBDYCLAwDCyAHKAIsIQIgBUIANwMAIAZCADcDACABQgA3AzggAUEQaiABQThqEJ0VIAIpAgAhCCACIAEoAhQ2AgQgAkEANgIAIAMgCDcCACABIAQ2AiwMAgsgBygCCCECIAdBADYCCCAHKAIEIQQgAUEANgJIIAEgAjYCRCABIAc2AkAgASAEIAJBA3RqNgI8IAEgBDYCOCABQSRqIAFBOGoQnwsLIAEoAiwhBAsgAUEwahCwAyAEDQALIAEoAiQgASgCKEEEQQgQwBELIAAoAgRBGEEEEJ4SCyABQdAAaiQADwsAC8IIAQl/IwBBIGsiAiQAIAEgASgCXCIDQX9qIgQ2AlwgASABKAJYIgVBAWoiBjYCWCABIAEoAmgiB0EBaiIINgJoQQAhCUEEIQoCQCAERQ0AIAYtAABB+wBHDQAgASAHQQJqIgg2AmggASADQX5qNgJcIAEgBUECajYCWEEBIQlBACEKCyACIAEgChDcBAJAAkACQCACKAIAIgRBAkYNACAEQQFxRQ0AAkAgAigCBCIKQYCAxABJDQAgASgCaCEBIAJBLEEQIAkbNgIQIAJB+MOZAUHow5kBIAkbNgIMIAJBpICAgHg2AgggACABIAEgAkEIahC1ITYCBAwCCwJAAkACQAJAAkACQAJAIApBgLADc0GAgLx/akGAkLx/SQ0AIAkNAQwGCwJAIAEoAmggCEYNACABIAg2AmggASABKAJkIAggASgCbGsiCms2AlwgASABKAJgIApqNgJYCyACQQhqIAFBBBDcBAJAAkAgAigCCCIKQQJGDQAgCkEBcUUNBUEAIQQgAigCDCIKQYCwA3NBgIC8f2pB/4+8f0sNBEECIQQgCkH/twNLDQQgASgCXCIGRQ0EIAZBAUYNBCABKAJYIgMtAABB/wFxQdwARw0EIAMtAAFB9QBHDQQgASAGQX5qNgJcIAEgA0ECajYCWCABIAEoAmgiBkECajYCaCACQQhqIAFBBBDcBCACKAIIIgRBAkcNAQsgAigCDCEBIABBAzYCACAAIAE2AgQMCQsgBEEBcUUNAyACKAIMIgRBgHhxQYC4A0YNAUECIQQgASgCaCAGRg0CIAEgBjYCaCABIAEoAmQgBiABKAJsayIGazYCXCABIAEoAmAgBmo2AlgMAgsCQCABKAJcIglFDQAgASgCWCIELQAAQf0ARw0AIAEgCUF/ajYCXCABIARBAWo2AlggASABKAJoQQFqNgJoDAULIAJBo4CAgHg2AgggASgCaCAIIAJBCGoQniEhASAAQQM2AgAgACABNgIEDAcLIApBCnQgBGpBgMiAZWohCkEBIQQLIAlFDQECQCABKAJcIglFDQAgASgCWCIGLQAAQf0ARw0AIAEgCUF/ajYCXCABIAZBAWo2AlggASABKAJoQQFqNgJoDAILIAJBo4CAgHg2AgggASgCaCAIIAJBCGoQniEhASAAQQM2AgAgACABNgIEDAULIAJBpICAgHg2AgggAkESQRAgCRs2AhAgAkGkxJkBQejDmQEgCRs2AgwgASgCaCAIIAJBCGoQtiEhASAAQQM2AgAgACABNgIEDAQLIAAgCjYCBCAAIAQ2AgAMAwsgACAKNgIEIABBADYCAAwCCyABKAJoIQEgAkESQRAgCRs2AhAgAkGkxJkBQejDmQEgCRs2AgwgAkGkgICAeDYCCCAAIAEgASACQQhqELUhNgIEIAIoAgQhCgsgAEEDNgIAIAQgChDTHAsgAkEgaiQAC7wIAQl/IwBB8AFrIgIkACACIAEoAsABIgM2AgwCQAJAAkAgAS0AyAFBzwBGDQBBCCEEDAELIAEQhw4CQAJAAkACQAJAAkACQAJAIAEtAMgBDQAgARCHDiACQTBqIAFBABCeASACKAI0IQUgAigCMCIEQQdGDQUgAkGYAWpBIGogAkEwakEgaikDADcDACACQZgBakEYaiACQTBqQRhqKQMANwMAIAJBmAFqQRBqIAJBMGpBEGopAwA3AwAgAiACKQM4NwOgASACIAU2ApwBIAIgBDYCmAEgAS0AyAEhBiABLQCBAUEgcUUNAyAGQf8BcUEJRw0DIAEoAsABIQcgARCHDiACIAEQkBUgAigCBCEGAkAgAigCAEEBcUUNACAGIQUMBQsgAkG4AWohCCACIAY2AjACQAJAAkAgBA4HAQAAAAICAgELIAJBsAFqIQgLIAEoArwBIQlBBEEMEOsfIgpFDQIgCiAJNgIIIAogBzYCBCAKIAY2AgAgCBCpHyAIIAo2AgAMAwsgAkEwahDkBgwCC0EHIQQMBgsACyABLQDIASEGCyAGQf8BcUEBRg0CIAEoAsQBIQUgASgCwAEhBCACQcQBaiAGEN4bIAJBATYCNCACQZjvmwE2AjAgAkIBNwI8IAJBigWtQiCGQYijmwGthDcD6AEgAiACQegBajYCOCACQdABaiACQTBqEI0VIAJB5AFqIAJBzAFqKAIANgIAIAIgAikCxAE3AtwBIAQgBSACQdABahCFFSEFIAEtAMgBQaIBRw0AIAEQxxEhBCABEIcOIAEgBBDlEQsgAkGYAWoQ6xILIABBCTYCACAAIAU2AgQMAwsgARCHDiACQRBqQRhqIAJBoAFqIgZBGGopAwA3AwAgAkEQakEQaiAGQRBqKQMANwMAIAJBEGpBCGogBkEIaikDADcDACACIAYpAwA3AxALIAJB0ABqIAJBEGpBGGopAwA3AwAgAkEwakEYaiACQRBqQRBqKQMANwMAIAJBMGpBEGogAkEQakEIaikDADcDACACIAIpAxA3AzggAkGYAWogAUEAEN8IIAIgATYCWCACIAU2AjQgAiAENgIwIAIoApgBIQYgAiACQQxqNgJcAkAgBkGAgICAeEcNACACKAKcASEBIAJBMGoQ8h4gAEEJNgIAIAAgATYCBAwCCyACQZABaiACQZgBakEQaikCADcDACACQYgBaiACQZgBakEIaikCADcDACACQeAAakEIaiACQTBqQQhqIgZBCGopAwA3AwAgAkHgAGpBEGogBkEQaikDADcDACACQeAAakEYaiAGQRhqKQMANwMAIAIgAikCmAE3A4ABIAIgBikDADcDYCABKAK8ASEBCyAAIAU2AgQgACAENgIAAkBBOEUNACAAQQhqIAJB4ABqQTj8CgAACyAAIAE2AkQgACADNgJACyACQfABaiQAC6oIAgx/AX4jAEHAAGsiAyQAAkACQAJAAkACQCACDQBBASEEQcsAIQVBACEGDAELIAEgAmohB0EBIQggASEJQQEhBCABLQAAIgohBgJAA0ACQAJAIAgNACAJIAdHDQEMAwsgCCAHIAlrTw0CIAkgCGohCUEAIQgLIARBAXQhBCAGQQF0IAktAABqIQYgCUEBaiEJDAALC0EBIQsCQCACQQFHDQBBzAAhBQwBCyADQQA6ACIgAS0AASEIIANBAToAIwJAAkAgCEH8q4UBai0AACAKQfyrhQFqLQAASQ0AQQAhDCAIIQ0gCiEIDAELQQAhCyADQQA6ACNBASEMIANBAToAIiAKIQ0LQQIhCSADQQI2AjQgA0KAgICA8B83AiwgAyAHNgIoIAMgATYCJANAAkACQCAJDQBBACEJAkAgAygCMCIHDQAMAgsgAyAHQX9qNgIwIAMoAiQiCiADKAIoRg0BIAMgCkEBajYCJCADIAMoAiwiB0EBajYCLCAKIQkMAQsgA0EANgI0IANBGGogA0EkaiAJENELIAMoAhwhCSADKAIYIQcLAkACQAJAAkAgCUUNACAJLQAAIglB/KuFAWotAAAiBSAIQf8BcSIKQfyrhQFqLQAASQ0BIAkgCkYNAiAFIA1B/wFxQfyrhQFqLQAATw0CIAdBgAJPDQcgAyAHOgAjIAchCyAJIQ0MAgsgDEH/AXEiByALQf8BcUcNAiADQQA2AiRBASADQSJqIANBI2ogA0EkakGg05gBEJcZAAsgAyAMOgAjIAdBgAJPDQQgAyAHOgAiIAwhCyAHIQwgCCENIAkhCAsgAygCNCEJDAELCwJAAkACQCACIAdNDQBBACEJIAEgB2otAAAiCEH8q4UBai0AAEH6AU0NAUHNACEFQQAhCwwCCyAHIAJB9O2DARCzEQALIAIgC0H/AXEiCk0NBCABIApqLQAAQRh0IAhBEHQgCkEIdHJyIAdyIQ1BzgAhC0HPACEFC0IAIQ8CQANAIAIgCUYNASABIAlqIQcgCUEBaiEJQgEgBzEAAIYgD4QhDwwACwsgA0EQaiABIAJBABDBCiADKAIUIQcgAygCECEJIANBCGogASACQQEQwQogAyABIAIgByADKAIMIAkgAygCCCIKSyIOGyAJIAogDhsiCRDOCCADKAIAIQogAygCBCEHCyAAIAI2AkAgACABNgI8IABBADYCOCAAIAU2AjAgACAENgIsIAAgBjYCKCAAIAw6ACEgACAIOgAgIAAgDTYCHCAAIAs2AhggACAJNgIQIAAgDzcDCCAAIAc2AgQgACAKQf8BcTYCACADQcAAaiQADwtB1KSbAUErIANBP2pB+OiDAUHs7IMBEOgPAAtB1KSbAUErIANBP2pB+OiDAUHc7IMBEOgPAAsgCiACQfzsgwEQsxEAC7QIAQV/IwBB0ANrIgMkAAJAAkAgAg0AIABBh4CAgHg2AgAMAQsgAkEEdCEEIAEhBQJAA0AgBEUNASAEQXBqIQQgBUEIaiEGIAVBEGohBSAGKAIADQALIABBh4CAgHg2AgAMAQsCQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAkEBRw0AIAFBBGooAgAhBCABQQhqKAIAIgVBAUcNASAAQYCAgIB4NgIAIAAgBC0AADoABAwMCwJAAkACQCACQQJHDQAgAUEIaiEGQQAhBANAIARBIEYNAiAGIARqIQUgBEEQaiEEIAUoAgBBAUYNAAsLQQAhBiACQQNGDQEMCQsgAUEIaigCAEUNAiABQRhqKAIARQ0DIAFBBGooAgAhBCAAQYGAgIB4NgIAIAAgBC0AADoABCAAIAFBFGooAgAtAAA6AAUMDAtBCCEEAkADQCAEQThGDQEgASAEaiEFIARBEGohBCAFKAIAQQFHDQkMAAsLIAFBCGooAgBFDQMgAUEYaigCAEUNBCABQShqKAIARQ0FIAFBJGooAgAtAABBGHQgAUEUaigCAC0AAEEQdCABQQRqKAIALQAAQQh0cnIhBkEBIQQMCAsgA0EwaiAEIAUQswMgAygCcCEEIAMoAmwhBgJAAkAgAygCaEEBcUUNACAGIQUMAQsgA0HEA2ogBEEBQQEQzQ0gAygCxANBAUYNBiADKALMAyEFIARFDQAgBSAGIAT8CgAACyADKAJcIQYgAygCWCEBIAMoAmAhAgJAQShFDQAgA0EIaiADQTBqQSj8CgAAC0EBIQcMCAtBAEEAQeTVhAEQsxEAC0EAQQBB9NWEARCzEQALQQBBAEGU1oQBELMRAAtBAEEAQaTWhAEQsxEAC0EAQQBBtNaEARCzEQALIAMoAsgDIAMoAswDQfzbgwEQqh4AC0EAIQQLAkAgBCAGckEBcUUNACAAQYKAgIB4NgIAIABBBmogBkEYdjoAACAAIAZBCHY7AQQMAwsgAkEBRw0BQQIhBwsCQEEoRQ0AIANBMGpBBGogA0EIakEo/AoAAAsgAEGDgICAeDYCAAJAQSxFDQAgAEEEaiADQTBqQSz8CgAACyAAIAQ2AkggACAFNgJEIAAgBzYCQCAAIAI2AjggACAGNgI0IAAgATYCMAwBCyADQTBqIAEgAhCUBQJAIAMoAjBBgICAgHhGDQBBkANFDQEgACADQTBqQZAD/AoAAAwBCyADQTBqEO8cIANBMGogASACEMAPAkAgAy0AMEECRg0AAkBBgAJFDQAgAEEEaiADQTBqQYAC/AoAAAsgAEGFgICAeDYCAAwBCyADQTBqIAEgAhC3AwJAIAMtADlBA0YNACAAIAMpAjA3AgQgAEGGgICAeDYCACAAQQxqIANBOGooAgA2AgAMAQsgAEGHgICAeDYCAAsgA0HQA2okAAv/BwIEfwJ+AkACQAJAAkACQAJAAkACQAJAAkAgACgCAA4JAAECAwQFBgcIAAsCQCAAKAIMIgFFDQAgACgCCCECIAFByABsIQEDQAJAAkACQCACKQMAIgVCAlgNAEEgIQMMAQsgAkEwakEANgIAIAVCAlENASAFp0EBcQ0BQRghAwsgAiADakEANgIACyACQcgAaiECIAFBuH9qIgENAAsLIAAoAhwiAkUNCCACQQhqKAIAIgFFDQggAkEEaigCACECIAFBDGwhAQNAIAIQtAUgAkEMaiECIAFBdGoiAQ0ADAkLCyAAQQhqEMEDDwsCQCAAKAIMIgFFDQAgACgCCCECIAFB0ABsIQEDQEEYIQMCQAJAAkACQCACKQMAIgZCfnwiBUICIAVCAlQbpw4DAAIBAAsgAkEIaigCAA0CQSAhAwwBCwJAIAanQQFxDQAgAkEYakEANgIACyACQSBqKQMAIgVCAlENASAFp0EBcQ0BQTghAwsgAiADakEANgIACyACQdAAaiECIAFBsH9qIgENAAsLIAAoAhwiAkUNBiACQQhqKAIAIgFFDQYgAkEEaigCACECIAFBDGwhAQNAIAIQtAUgAkEMaiECIAFBdGoiAQ0ADAcLCwJAAkAgACgCCA4DAAEHAAsCQCAALQAkQQJGDQAgAEEANgIgCwJAIAAoAigiA0EIaigCACIBRQ0AIANBBGooAgAhAiABQQxsIQEDQCACKAIAELUBIAJBDGohAiABQXRqIgENAAsLAkAgA0EUaigCACIBRQ0AIANBEGooAgAhAiABQdgAbCEBA0AgAhC6AiACQdgAaiECIAFBqH9qIgENAAsLIAMoAjAiAkUNBiACELUBDwsCQCAALQAkQQJGDQAgAEEANgIgCwJAIAAoAigiBEEIaigCACICRQ0AIARBBGooAgAiAyACQQZ0aiEAA0ACQCADQThqKAIAIgFFDQAgA0E0aigCACECIAFBDGwhAQNAIAIoAgAQtQEgAkEMaiECIAFBdGoiAQ0ACwsgAxC7CSADQcAAaiICIQMgAiAARw0ACwsCQCAEQRRqKAIAIgFFDQAgBEEQaigCACECIAFBDGwhAQNAIAIoAgAQtQEgAkEMaiECIAFBdGoiAQ0ACwsgBCgCGEGAgICAeEYNBSAEKAIgIgFFDQUgBCgCHCECIAFBMGwhAQNAIAIQlgMgAkEwaiECIAFBUGoiAQ0ADAYLCyAAKAIEELUBDwsgACgCECICRQ0DIAJBCGooAgAiAUUNAyACQQRqKAIAIQIgAUEMbCEBA0AgAhC0BSACQQxqIQIgAUF0aiIBDQAMBAsLIAAoAgRBADYCOA8LIAAoAgQQtQEPCyAAQQA2AiALC/AHAg5/AX4jAEHAAGsiASQAAkACQAJAIAAoAgwiAkF/Rg0AAkAgAiAAKAIEIgMgA0EBaiIEQQN2IgVBB2wgA0EISRsiBkEBdkkNACABQShqIAYgAiAGIAJLG0EBahDHCyABKAIsIQcgASgCKCIFRQ0DIAEoAjAhCCABIAc2AhwgAUKEgICAgAE3AhAgASAAQRBqNgIMIAEgBTYCGCAAKAIAIgkpAwAhDyABIAk2AjggASACNgI0IAFBADYCMCABIA9Cf4VCgIGChIiQoMCAf4M3AyggCUF8aiEEIAVBCGohCiABQRhqIQsgAiEMAkADQCAMRQ0BAkADQCABIAFBKGoQ8xUgASgCAEEBcQ0BIAEgASgCOCIGQQhqNgI4IAEgASgCMEEIajYCMCABIAYpAwhCf4VCgIGChIiQoMCAf4M3AygMAAsLIAEoAgQhBiABIAEoAjRBf2oiDDYCNCAFIAUgByAEIAYgASgCMGpBAnQiDWsoAgApAwgiDxCIECIGaiAPp0EZdiIDOgAAIAogByAGQXhqcWogAzoAACAFIAZBAnRrQXxqIAkgDWtBfGooAAA2AAAMAAsLIAEgAjYCJCABIAggAms2AiAgACALQQQQ+RcgASgCHCIGRQ0CIAEoAhggBiABKAIQIAEoAhQQ9BUMAgsgBSAEQQdxQQBHaiEHIAAoAgAiBSEGAkADQCAHRQ0BIAYgBikDACIPQn+FQgeIQoGChIiQoMCAAYMgD0L//v379+/fv/8AhHw3AwAgBkEIaiEGIAdBf2ohBwwACwsCQAJAIARBCEkNACAFIARqIAUpAAA3AAAMAQsgBEUNACAFQQhqIAUgBPwKAAALQQAhDQNAAkACQCAEIA0iBkYNACAGQQFqIQ0gBSAGai0AAEGAAUcNAiAFIAZBAnRrQXxqIQ4gACgCBCEJIAAoAgAhDEEAIAZrQQJ0IQsDQCAGIAMgBSALakF8aigCACkDCCIPpyIKcSIIayAMIAkgDxCIECIHIAhrcyADcUEISQ0CIAUgB2otAAAhAyAMIAdqIApBGXYiCjoAACAMIAkgB0F4anFqQQhqIAo6AAAgBSAHQQJ0a0F8aiEFAkAgA0H/AUYNACAOIAVBARD5FyAAKAIEIgkhAyAAKAIAIgwhBQwBCwsgDCAGakH/AToAACAMIAkgBkF4anFqQQhqQf8BOgAAIAUgDigAADYAACAJIQMgDCEFDAILIAAgAyADQQFqQQN2QQdsIANBCEkbIAJrNgIIDAMLIAwgBmogCkEZdiIHOgAAIAwgCSAGQXhqcWpBCGogBzoAAAwACwsQ2xkAC0GBgICAeCEHCyABQcAAaiQAIAcLmgkCCH8CfiMAQaALayIDJAAgA0KDgICAEDcCJCADQoOAgIAQNwIYIANCg4CAgBA3AjAgA0EAOgA5IANBgAI7ASwgA0ECNgIUIANBAToAICADQQJBASACQfUDSRsiBDoAOCADQaADaiADQRRqQRxqIAEgAhCwAgJAAkACQAJAIAMoAqADQQFHDQAgA0EQaiADQb4Dai8BADsBACADIAMpAbYDNwMIIAMtALUDIQEgAy0AtAMhBCADKAKwAyEFIAMoAqwDIQIgAygCqAMhBgwBCyADQcgIaiIBIANBvgNqLwEAOwEAIAMgAykBtgM3A8AIIAMpAqQDIQsgAykCrAMhDCADLwG0AyEFAkBByAJFDQAgA0E8akEcaiADQcADakHIAvwKAAALIANB1gBqIAEvAQA7AQAgAyAFOwFMIAMgDDcCRCADIAs3AjwgAyADKQPACDcBTgJAAkACQAJAAkAgAkH1A0kNACADQaADakECQQEgA0E8ahCRAQJAIAMoAqADIgFBgICAgHhHDQAgA0EQaiADQb4Dai8BADsBACADIAMpAbYDNwMIDAULIANBwAhqQQhqIgIgA0G+A2ovAQA7AQAgAyADKQG2AzcDwAggAy0AtQMhBSADLQC0AyEGIAMoArADIQcgAygCrAMhCCADKAKoAyEJIAMoAqQDIQoCQEGoAkUNACADQYgGaiADQcADakGoAvwKAAALIANBsAhqQQhqIAIvAQA7AQAgAyADKQPACDcDsAhBAC0AwPGdARpB0AIQhQEiAkUNASACIAU6AB0gAiAGOgAcIAIgBzYCGCACIAg2AhQgAiAJNgIQIAIgCjYCDCACIAE2AgggAkKBgICAEDcCACACIAMpA7AINwEeIAJBJmogA0G4CGovAQA7AQACQEGoAkUNACACQShqIANBiAZqQagC/AoAAAtBrN6DASEFDAMLIANBoANqQQBBASADQTxqEI0BIAMoAqADDQEgA0HACGpBCGoiAiADQb4Dai8BADsBACADIAMpAbYDNwPACCADLQC1AyEBIAMtALQDIQUgAygCsAMhBiADKAKsAyEHIAMoAqgDIQggAygCpAMhCQJAQcACRQ0AIANB0AhqIANBwANqQcAC/AoAAAsgA0GQC2pBCGogAi8BADsBACADIAMpA8AINwOQC0EALQDA8Z0BGkHkAhCFASICRQ0AIAIgAToAGSACIAU6ABggAiAGNgIUIAIgBzYCECACIAg2AgwgAiAJNgIIIAJCgYCAgBA3AgAgAiADKQOQCzcBGiACQSJqIANBmAtqLwEAOwEAAkBBwAJFDQAgAkEkaiADQdAIakHAAvwKAAALQZTfgwEhBQwCCwALIANBEGogA0G+A2ovAQA7AQAgAyADKQG2AzcDCAwBCyADLQA5IQEgA0E8ahDHEAwCCyADLQC1AyEBIAMtALQDIQQgAygCsAMhBSADKAKsAyECIAMoAqgDIQYgA0E8ahDHEAsgBkEDRg0AIABBAzoACQwBCyAAIAE6AAkgACAEOgAIIAAgBTYCBCAAIAI2AgAgACADLwEIOwEKCyADQaALaiQAC6wIAgR/AX4CQAJAAkACQAJAAkACQAJAAkAgACgCACIBQXxqQQAgAUF7akEISRsOCAECAwQFBgcIAAsCQAJAIAAoAggiAUEFRw0AIAApAxAiBUIDg0IAUg0BIAWnIgEgASgCACICQX9qNgIAIAJBAUcNASABIAEoAhAQwRsMAQsCQAJAAkACQAJAIAEOBAECAwQACyAAKQMYIAAoAiAQmxQMBAsgACkDEBDCGQwDCyAAQRBqEKcQDAILIAApAyAQuRgMAQsgAEEMahDNHgsCQCAAKAI8IgFFDQAgARCQASABQcAAQQgQnhILAkAgACgCQCIBRQ0AIAEoAgAiAhCrAiACQeAAQQgQnhIgAUEMQQQQnhILIAAoAjQhAwJAIAAoAjgiAkUNACADIQEDQCABKAIAIgQQkAEgBEHAAEEIEJ4SIAFBDGohASACQX9qIgINAAsLIAAoAjAgA0EEQQwQrxEPCyAAEJQNIAAoAkQhBAJAIAAoAkgiAkUNACAEIQEDQCABEJwJIAFBwABqIQEgAkF/aiICDQALCyAAKAJAIARBCEHAABCvESAAKAIgIgJBgICAgHhGDQUgACgCJCEEAkAgACgCKCIARQ0AIAQhAQNAIAEQ4wIgAUEwaiEBIABBf2oiAA0ACwsgAiAEQQhBMBCvEQ8LIABBCGoQlA0gAEEwahC3BQ8LAkAgACkDCCIFQgODQgBSDQAgBaciASABKAIAIgJBf2o2AgAgAkEBRw0AIAEgASgCEBDBGwsgAEEgahC3BQ8LIABBCGoQlA0CQCAAKAI8IgFFDQAgARCQASABQcAAQQgQnhILAkAgACgCQCIBRQ0AIAEoAgAiAhCrAiACQeAAQQgQnhIgAUEMQQQQnhILIAAoAjQhAwJAIAAoAjgiAkUNACADIQEDQCABKAIAIgQQkAEgBEHAAEEIEJ4SIAFBDGohASACQX9qIgINAAsLIAAoAjAgA0EEQQwQrxEPCwJAIAApAwgiBUIDg0IAUg0AIAWnIgEgASgCACICQX9qNgIAIAJBAUcNACABIAEoAhAQwRsLAkAgACgCJCIBRQ0AIAEQkAEgAUHAAEEIEJ4SCwJAIAAoAigiAUUNACABKAIAIgIQqwIgAkHgAEEIEJ4SIAFBDEEEEJ4SCyAAKAIwIQMCQCAAKAI0IgJFDQAgAyEBA0AgASgCACIEEJABIARBwABBCBCeEiABQQxqIQEgAkF/aiICDQALCyAAKAIsIANBBEEMEK8RDwsgAEEEahCbCSAAKAIEIAAoAghBCEEoEK8RIAAoAhAiAUUNACABKAIAIgAQqwIgAEHgAEEIEJ4SIAFBDEEEEJ4SCw8LIAAoAgghBAJAIAAoAgwiAkUNACAEIQEDQCABEOMCIAFBMGohASACQX9qIgINAAsLIAAoAgQgBEEIQTAQrxEL3AcCEH8BfiMAQRBrIgEkACABQQRqIAAoAhQiAiAAKAKwAiIDdiIEQQRBBBDNDSABKAIIIQUCQCABKAIEQQFGDQACQCAERQ0AIANBH3EhBkEAIQMgASgCDCIHIQgDQCAIIAM2AgAgCEEEaiEIIAQgA0EBaiIDRw0ACyAAKAIQIQkgBCEDIAQhCgJAAkACQAJAAkACQAJAA0AgCiILQX9qIQoDQCADIghFDQIgACAIQX9qIgMQzRhC////////flYNAAsCQCALIAhGDQBBACEIQQAgAiADIAZ0IgxrIgsgCyACSxshDUEAIAIgCiAGdCIOayILIAsgAksbIQ8gCSAOQQN0aiELIAkgDEEDdGohEANAIA8gCEYNByANIAhGDQYgCykDACERIAsgECkDADcDACAQIBE3AwAgC0EIaiELIBBBCGohECAIQQFqIgggBnZFDQALIAogBE8NBCADIARPDQMgByAKQQJ0aiIIKAIAIQsgCCAHIANBAnRqIhAoAgA2AgAgECALNgIACyAAIAo2AiggCg0AC0GO9YMBQTRBxPWDARDyEgALIAFBBGogBEEEQQQQzQ0gASgCCCEOIAEoAgRBAUYNBSABKAIMIQ0CQCAEQQJ0IgNFDQAgDSAHIAP8CgAAC0EAIQsDQAJAIAsgDSALQQJ0IhBqKAIAIgNGDQADQCADIgggBE8NByALIA0gCEECdGooAgAiA0cNAAsgByAQaiAINgIACyALQQFqIgsgBEcNAAsgACgCrAIhDEEAIQoDQAJAIAxFDQAgAiAKIAZ0IgsgAiALSRshCCAJIAtBA3RqIQMgDCEQAkACQANAIAIgCEYNASAEIAMpAwAiEUIriKciD00NAiADIAcgD0ECdGo1AgBCK4YgEUL///////8Bg4Q3AwAgA0EIaiEDIAtBAWohCyAIQQFqIQggEEF/aiIQRQ0DDAALCyALIAJBgPqDARCzEQALIA8gBEHU/YMBELMRAAsgCkEBaiIKIARHDQALAkACQCAAKAIgIghFDQAgACgCHCEDA0AgAygCACILIARPDQIgAyAHIAtBAnRqKAIANgIAIANBBGohAyAIQX9qIggNAAsLIA4gDUEEQQQQtREgBSAHQQRBBBC1ESABQRBqJAAPCyALIARB1P2DARCzEQALIAMgBEG0/YMBELMRAAsgCiAEQbT9gwEQsxEACyAMIAhqIAJB8PmDARCzEQALIA4gCGogAkHw+YMBELMRAAsgCCAEQcT9gwEQsxEACyAOIAEoAgxBvOCbARCqHgALQeD5gwEQmyAACyAFIAEoAgxBsJibARCqHgALvwcBCn8jAEHQAGsiASQAQYGAxAAhAgJAIAAoAgQiAyAAKAIQIgRJDQAgACADIARrIgM2AgQgACAAKAIAIgIgBGoiBTYCAAJAAkACQAJAAkACQAJAIARBAkcNACACLQAAIgRBv39qQV9xQQpqIARBUGogBEE5SxsiBEEPSw0BIAItAAEiAkG/f2pBX3FBCmogAkFQaiACQTlLGyICQRBPDQIgBEEEdCACciIEwEF/Sg0FQYCAxAAhAiAEQf8BcSIGQcABSQ0HQQIhBwJAIAZB4AFJDQACQCAEQf8BcSIGQfABTw0AQQMhBwwBCyAGQfgBTw0IQQQhBwtBACECIAFBADoADyABQQA7AA0gASAEOgAMIAEgBzYCCCAHQQF0QX5qIQggASABQQxqNgIEIAFBDGpBAWohBANAAkAgA0ECTw0AQYCAxAAhAgwJCyAAIANBfmoiAzYCBCAAIAUgAmoiCUECajYCACAJLQAAIgZBv39qQV9xQQpqIAZBUGogBkE5SxsiCkEPSw0EIAlBAWotAAAiBkG/f2pBX3FBCmogBkFQaiAGQTlLGyIGQRBPDQUgBCAKQQR0IAZyOgAAIARBAWohBCAIIAJBAmoiAkcNAAwHCwtBsqObAUEoQYyylwEQ3RcAC0GcspcBEJsgAAtBnLKXARCbIAALQZyylwEQmyAAC0GcspcBEJsgAAtBASEHIAFBATYCCCABQQA6AA8gAUEAOwANIAEgBDoADCABIAFBDGo2AgQLIAFBMGogAUEMaiAHEMUEQYCAxAAhAiABKAIwDQAgASgCNCEAIAEgASgCOCIDNgIUIAEgADYCECAAIANqIQQCQCADRQ0AAkACQCAALAAAIgNBf0wNACAAQQFqIQYgA0H/AXEhAgwBCyAALQABQT9xIQIgA0EfcSEGAkAgA0FfSw0AIAZBBnQgAnIhAiAAQQJqIQYMAQsgAkEGdCAALQACQT9xciECAkAgA0FwTw0AIAIgBkEMdHIhAiAAQQNqIQYMAQsgAkEGdCAALQADQT9xciAGQRJ0QYCA8ABxciECIABBBGohBgsCQCAGIARGDQAgBiwAAEF/ShoMAQsgAkGAgMQARw0BCyAAIAQQjxwhACABQQ6tQiCGIAFBzABqrYQ3A0AgAUEIrUIghiABQRBqrYQ3AzggAUH1Aa1CIIYgAUEEaq2ENwMwIAEgADYCTCABQQQ2AhwgAUGcs5cBNgIYIAFCAzcCJCABIAFBMGo2AiAgAUEYakG8s5cBEIUbAAsgAUHQAGokACACC44IAQd/IwBBIGsiAiQAAkACQAJAAkACQCABKAIADgUEAAECAwQLIAEoAgRBAUcNAyAALQA5IQMgAEEBOgA5IAEoAgggABBsIAAgAzoAOQwDCyAALQA5IQMgAEEBOgA5IAEoAgQgABBsIAAgAzoAOQwCCyAAIAEoAgQiBEHAAGoQxggCQCAEQYQBaigCACIBRQ0AIARBgAFqKAIAIgMgAUHYAGxqIQUgAkEMaiEGIAJBCGohBwNAAkACQAJAIAMoAgAiAUF8ag4CAgABCyADKAIEIQEgAC0AOSEIIABBAToAOSACQQM2AgggASAAEGwgACAIOgA5IAIoAggiAUEBSw0BIAcgAhCgGCAHIAIpAwAQ7xcgAUUNASACKAIMIgEgASgCACIBQX9qNgIAIAFBAUcNASAGEN8PDAELAkACQAJAIAEOBAMAAQIDCyADKAIEQQFHDQIgAC0AOSEBIABBAToAOSADKAIIIAAQbCAAIAE6ADkMAgsgAygCBCAAENYBDAELIAMoAgwhCCADKAIIIQEgAiAANgIAIAhFDQAgCEEobCEIA0AgAiABEOoEIAFBKGohASAIQVhqIggNAAsLIANB2ABqIgMgBUcNAAsLAkAgBCgCeCIBRQ0AIAAtADRBAUcNACAALQA6IQUgAC0AOSEHIABBgQI7ADkCQCABKAIIIgNFDQAgASgCBCEBIANBAnQhAwNAAkAgAC0ANEEBRw0AIAEoAgAhCCAAQYECOwA5IAggABD0ASAAQYECOwA5CyABQQRqIQEgA0F8aiIDDQALCyAAIAU6ADogACAHOgA5CwJAIARBmAFqKAIAIgFFDQAgAUEobCEDIARBlAFqKAIAQQRqIQEgAkEMaiEGIAJBCGohBwNAAkACQAJAAkACQCABQXxqKAIADgUEAAECAwQLIAEoAgBBAUcNAyABQQRqKAIAIQggAC0AOSEFIABBAToAOSACQQM2AgggCCAAEGwgACAFOgA5IAIoAggiCEEBSw0DIAcgAhCgGCAHIAIpAwAQ7xcgCEUNAyACKAIMIgggCCgCACIIQX9qNgIAIAhBAUcNAyAGEN8PDAMLIAEoAgAhCCAALQA5IQUgAEEBOgA5IAJBAzYCCCAIIAAQbCAAIAU6ADkgAigCCCIIQQFLDQIgByACEKAYIAcgAikDABDvFyAIRQ0CIAIoAgwiCCAIKAIAIghBf2o2AgAgCEEBRw0CIAYQ3w8MAgsgASAAEM0FDAELIAEgABD4AgsgAUEoaiEBIANBWGoiAw0ACwsgBC0APEEGRg0BIAAgBEEQahDGCAwBCyABKAIMIgNFDQAgASgCCCEBIANBKGwhAwNAIAAgARC7AyABQShqIQEgA0FYaiIDDQALCyACQSBqJAAL1AcBBX8jAEHQAWsiAiQAIAAoAgAhAwJAAkACQAJAAkACQAJAIAEoAgAOBQYAAQIFBgsgASgCBEEBRw0FIAEoAggiASgCAEEaRw0DIAJB0ABqIAMoAgAgA0EEaigCACABQQhqIgAQtQwgAigCUEEyRg0FIAEQyQEgAUE4aiACQdAAakE4aikDADcDACABQTBqIAJB0ABqQTBqKQMANwMAIAFBKGogAkHQAGpBKGopAwA3AwAgAUEgaiACQdAAakEgaikDADcDACABQRhqIAJB0ABqQRhqKQMANwMAIAFBEGogAkHQAGpBEGopAwA3AwAgACACQdAAakEIaikDADcDACABIAIpA1A3AwAMBQsgASgCBCIBKAIAQRpHDQEgAkEQaiADKAIAIANBBGooAgAgAUEIaiIAELUMIAIoAhBBMkYNBCABEMkBIAFBOGogAkEQakE4aikDADcDACABQTBqIAJBEGpBMGopAwA3AwAgAUEoaiACQRBqQShqKQMANwMAIAFBIGogAkEQakEgaikDADcDACABQRhqIAJBEGpBGGopAwA3AwAgAUEQaiACQRBqQRBqKQMANwMAIAAgAkEQakEIaikDADcDACABIAIpAxA3AwAMBAsCQCABKAIEIgQtAGxBAkcNACAEQcAAaiEBA0AgASgCGCIBLQAsQQJGDQALCwJAIARBhAFqKAIAIgBFDQAgBEGAAWooAgAhASAAQdgAbCEAA0ACQAJAAkACQCABKAIAQXxqDgIDAAELIAFBBGooAgAiBSgCAEEaRw0BIAJBkAFqIAMoAgAgA0EEaigCACAFQQhqIgYQtQwgAigCkAFBMkYNAiAFEMkBIAVBOGogAkGQAWpBOGopAwA3AwAgBUEwaiACQZABakEwaikDADcDACAFQShqIAJBkAFqQShqKQMANwMAIAVBIGogAkGQAWpBIGopAwA3AwAgBUEYaiACQZABakEYaikDADcDACAFQRBqIAJBkAFqQRBqKQMANwMAIAYgAkGQAWpBCGopAwA3AwAgBSACKQOQATcDAAwCCyABIAMQxQgMAQsgBSADEEYLIAFB2ABqIQEgAEGof2oiAA0ACwsgBEGYAWooAgAhACAEQZQBaigCACEBIAIgAzYCDAJAIABFDQAgAEEobCEAA0AgAkEMaiABELwDIAFBKGohASAAQVhqIgANAAsLIAQtADwiAUEGRg0DIAFBAkcNAyAEQRBqIQEDQCABKAIYIgEtACxBAkYNAAwECwsgASADEEYMAgsgASADEEYMAQsgAUEEaiADELICCyACQdABaiQAC40IAgd/AX4jAEHQAGsiAiQAIAIgARC+CSIDNgIMAkACQAJAAkACQAJAAkACQCADQdsARw0AIAJBKGpBCGoiBCABKAIAIgNB2ABqKAIANgIAIAIgAykCUDcDKCADQdAAaiEDIAEQmghFDQUgARC+CUE6Rw0FAkAgARCaCA0AIAMgAikDKDcCACADQQhqIAJBKGpBCGooAgA2AgAMBwsCQCABEL4JIgVB3gBHDQAgARCaCA0AIAMgAikDKDcCACADQQhqIAJBKGpBCGooAgA2AgAMBwsgAygCACEGAkADQCABEL4JQTpGDQEg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AAvSBwIBfwF+IwBBIGsiAyQAIANBEGogAiABKAIAQQAQlQICQAJAIAMtABBBBEYNACADKQMQIgRC/wGDQgRRDQAgACAENwIADAELAkAgAS0AKkUNACADQQA2AhAgA0EIaiACIANBEGpB3pabAUEFELkMAkAgAy0ACEEERg0AIAMpAwgiBEL/AYNCBFENACAAIAQ3AgAMAgsgA0EQaiACEOIOIAMtABBBBEYNACADKQMQIgRC/wGDQgRRDQAgACAENwIADAELAkAgAS0AKEUNACADQQA2AhAgA0EIaiACIANBEGpBw5ebAUECELkMAkAgAy0ACEEERg0AIAMpAwgiBEL/AYNCBFENACAAIAQ3AgAMAgsgA0EQaiACEOIOIAMtABBBBEYNACADKQMQIgRC/wGDQgRRDQAgACAENwIADAELAkAgAS0AKUUNACADQQA2AhAgA0EIaiACIANBEGpBsq2bAUEDELkMAkAgAy0ACEEERg0AIAMpAwgiBEL/AYNCBFENACAAIAQ3AgAMAgsgA0EQaiACEOIOIAMtABBBBEYNACADKQMQIgRC/wGDQgRRDQAgACAENwIADAELIANBEGogAUEIaiACELITAkAgAy0AEEEERg0AIAMpAxAiBEL/AYNCBFENACAAIAQ3AgAMAQsCQCABKAIgRQ0AIANBEGogAhDiDgJAIAMtABBBBEYNACADKQMQIgRC/wGDQgRRDQAgACAENwIADAILIANBADYCECADQQhqIAIgA0EQakHbxJsBQQcQuQwCQCADLQAIQQRGDQAgAykDCCIEQv8Bg0IEUQ0AIAAgBDcCAAwCCyADQRBqIAIQ4g4CQCADLQAQQQRGDQAgAykDECIEQv8Bg0IEUQ0AIAAgBDcCAAwCCyADQRBqIAFBIGogAhBPIAMtABBBBEYNACADKQMQIgRC/wGDQgRRDQAgACAENwIADAELAkACQAJAAkAgASgCJEUNAAJAIAItAF0NACADQRBqIAIQ4g4gAy0AEEEERg0AIAMpAxAiBEL/AYNCBFINBAsgA0EANgIQIANBCGogAiADQRBqQfuWmwFBARC4DAJAIAMtAAhBBEYNACADKQMIIgRC/wGDQgRRDQAgACAENwIADAULAkAgAi0AXQ0AIANBEGogAhDiDiADLQAQQQRGDQAgAykDECIEQv8Bg0IEUg0CCyADQRBq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IAAQ4AoCQAJAAkAgASgCDCICDQAgAS0AECEDAkAgACgCECIERQ0AQQEhAiAEQeS0lwFB1LSXASADQQFxIgUbQRlBECAFGxDtBQ0FCyAAIAM6AARBACECDAELAkAgASgCECIDQQFxDQAgAUKAgICAIDcCGCABIAI2AgwgASADNgIQIAEgAiADaiIFNgIUAkADQCABQQxqELoDQYCAvH9qDgICAQALCyAAKAIQIgRFDQMgBCgCAEEiIARBBGoiBigCACgCEBEIAA0CIAFCgICAgCA3AhggASAFNgIUIAEgAzYCECABIAI2AgwgAUEoaiEHA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAFBDGoQugMiA0GBgMQARg0AIANBgIDEAEYNCiADQSdGDQsCQCADQSFKDQAgA0F3ag4FBwQDAwgCCyADQSJGDQQgA0HcAEcNAkHcACEIQQAhCUECIQpBACELQQAhA0EAIQxB3AAhBQwNCyAEKAIAQSIgBEEEaigCACgCEBEIACECDBILIANFDQMLIANB/wVNDQkgAxDmB0UNCSABQSBqIAMQtAogASkAIiIOQjCIpyELIA5CEIinIQMgAS0AKyEKIAEtACohDCABLQAhIQggAS0AICEFIA6nIQkMCgtB3AAhBUHuACEIDAQLQdwAIQVBIiEIDAMLQdwAIQVBMCEIQQAhCUECIQpBACELDAMLQdwAIQVB9AAhCAwBC0HcACEFQfIAIQgLQQAhCUECIQpBACELQQAhAwtBACEMDAMLQdSkmwFBKyABQSBqQcSslwFBtKyXARDoDwALIAQoAgBBJyAGKAIAKAIQEQgADQUMAgtBgAEhBSADEOsLDQAgAUEgaiADELQKIAEpACIiDkIwiKchCyAOQhCIpyEDIAEtACshCiABLQAqIQwgAS0AISEIIAEtACAhBSAOpyEJCyABIAg6ACEgASAFOgAgIAEgC61CMIYgCa1C//8Dg4QgA61CEIaENwEiIAohDSAMIQADQAJAAkAgBUH/AXFBgAFHDQBBACEFIAdBADsBACABQgA3AyBBACENQQAhACADIQJBACEDDAELIABB/wFxIgIgDUH/AXFPDQIgAEEBaiEAIAFBIGogAmotAAAhAgsgBCgCACACIAYoAgAoAhARCAANBAwACwsLAkAgACgCECICRQ0AIAJB1LSX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NgKIASAAIAEoAgQgASgCCCACQTRqIAJBiAFqENEMDAQLIAJBMGogBkEIaigCADYCACACIAYpAgA3AigCQEEkRQ0AIABBBGogAkEQakEk/AoAAAsgAEEiNgIADAQLAkACQAJAIAEQvglBLUYiAw0AIAJByAFqIAEQrwwgAkGIAWogARDJCyACLQCMASEEIAIoAogBIgVBIkYNAQJAQTtFDQAgAEEFaiACQYgBakEFakE7/AoAAAsgACAEOgAEIAAgBTYCAAwFCyACQTRqIAEQrwwgAkHMAGogARCvDCACQQc6AGQgAiACQRBqIAJBzABqELYKIAIoAgBBAXENAwwBCyACQegAakEIaiACQcgBakEIaikCADcDACACQegAakEQaiACQcgBakEQaikCADcDACACIAIpAsgBNwNoIAIgBDoAgAEgAkEIaiACQRBqIAJB6ABqELYKIAIoAghBAXFFDQAgAigCDCEDIAJByAFqIAEQrwwCQCADIAIoAhgiBE8NACACQZQBaiACKAIUIANBHGxqIgNBCGopAgA3AgAgAkGcAWogA0EQaikCADcCACACQQ02AogBIAIgAykCADcCjAEgACABKAIEIAEoAgggAkHIAWogAkGIAWoQ0QwMBAsgAyAEQZCHhQEQsxEACyABEJoIDQALIAJB3AFqIAZBCGooAgAiAzYCACACQcgBakEIaiADNgIAIAIgBikCACIHNwLUASACIAc3A8gBIAJBDzYCiAEgACABKAIEIAEoAgggAkHIAWogAkGIAWoQ0QwMAQsgAigCBCEDIAJByAFqIAEQrwwCQCADIAIoAhgiBE8NACACQZQBaiACKAIUIANBHGxqIgNBCGopAgA3AgAgAkGcAWogA0EQaikCADcCACACQQ42AogBIAIgAykCADcCjAEgACABKAIEIAEoAgggAkHIAWogAkGIAWoQ0QwMAQsgAyAEQYCHhQEQsxEACyACKAIQIAIoAhRBBEEcEMARCyACQeABaiQAC44HAgp/AX4jAEEwayIDJAAgA0EYaiABIAIoAgwiBEEAEJUCAkACQCADLQAYQQRGDQAgAykDGCINQv8Bg0IEUQ0AIAAgDTcCAAwBCwJAAkACQAJAIARFDQAgA0EYaiABIAQQtBogAy0AGEEERg0AIAMpAxgiDUL/AYNCBFINAQsgASgCSEUNAiACLQAZIQUgA0EANgIQIANCgICAgMAANwIIIAIoAghBOGwhBiADIANBCGo2AhggAigCBCEHA0AgBkUNAiAGQUhqIQYgByADQRhqEJsKIAdBOGohBwwACwsgACANNwIADAILIAMoAhAhByADKAIMIQYgAyADKAIINgIgIAMgBjYCGCADIAYgB0EMbCIHaiIINgIkIAVB/wFxQQBHIQkDQAJAAkAgB0UNAAJAIAYoAgAiBUGAgICAeEYNACAGQQxqIQogBkEEaiILKAIAIQYgASgCSEUNAiADQShqIAEgCykCACINpyILIA1CIIinIgwgCyAMIAkQuwYgAy0AKEEERg0CIAMpAygiDUL/AYNCBFENAiAAIA03AgAgAyAKNgIcIAUgBhCXIiADQRhqEOUUDAULIAZBDGohCAsgAyAINgIcIANBGGoQ5RQMAgsgBSAGEJciIAdBdGohByAKIQYMAAsLAkAgAi0AGEUNACADQQA2AhggA0EIaiABIANBGGpB7qGbAUEHELkMAkAgAy0ACEEERg0AIAMpAwgiDUL/AYNCBFENACAAIA03AgAMAgsgA0EYaiABEOIOIAMtABhBBEYNACADKQMYIg1C/wGDQgRRDQAgACANNwIADAELIANBADYCGCADQQhqIAEgA0EYaiACLQAZQQJ0IgZB6OCdAWooAgAgBkHc4J0BaigCABC5DAJAIAMtAAhBBEYNACADKQMIIg1C/wGDQgRRDQAgACANNwIADAELIAIoAgQhBgJAAkACQCACKAIIIgdFDQAgBigCAEF/akEDSQ0BCyADQRhqIAEQ4g4gAy0AGEEERg0BIAMpAxgiDUL/AYNCBFENASAAIA03AgAMAgsgAS0AXQ0AIANBGGogARDiDiADLQAYQQRGDQAgAykDGCINQv8Bg0IEUQ0AIAAgDTcCAAwBCyADQRhqIAEgBCACKAIQIAYgBxCTBAJAIAMtABhBBEYNACADKQMYIg1C/wGDQgRRDQAgACANNwIADAELIABBBDoAAAsgA0EwaiQAC/UHAQl/IwBBwABrIgMkACABQQhqIQQCQAJAAkACQAJAAkACQCABKAIIQbmBgIB4Rw0AIAEoAhwhBSABKAIYIQYgASgCECEHIAEoAhQhCCADQTRqIAEoAgwiCSgCACACEOgDIAMoAjghCiADIAhBAUEBEMwNIAMoAgQhCyADKAIA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AkAgACgCAA4JAAECAwQFBwYHAAsgACgCHCIARQ0GIABBCGooAgAiAkUNBiAAQQRqKAIAIQAgAkEMbCECA0ACQAJAIAAoAgAiAw0AIABBBGooAgAgARDJBAwBCyABLQAADQAgAyABEJUBCyAAQQxqIQAgAkF0aiICDQAMBwsLIABBCGogARCtAw8LIAAoAhgNBCAAKAIcIgBFDQQgAEEIaigCACICRQ0EIABBBGooAgAhACACQQxsIQIDQAJAAkAgACgCACIDDQAgAEEEaigCACABEMkEDAELIAEtAAANACADIAEQlQELIABBDGohACACQXRqIgINAAwFCwsCQAJAIAAoAggOAwABBQALAkAgACgCKCIDQQhqKAIAIgJFDQAgAS0AAA0AIANBBGooAgAhACACQQxsIQIDQAJAIAEtAAANACAAKAIAIAEQlQELIABBDGohACACQXRqIgINAAsLAkAgA0EUaigCACICRQ0AIANBEGooAgAhACACQdgAbCECA0AgACABEPYCIABB2ABqIQAgAkGof2oiAg0ACwsgAygCMCIARQ0EIAEtAAANBCAAIAEQlQEPCwJAIAAoAigiBEEIaigCACICRQ0AIARBBGooAgAiACACQQZ0aiEFA0ACQCAAIgNBOGooAgAiAkUNACABLQAADQAgA0E0aigCACEAIAJBDGwhAgNAAkAgAS0AAA0AIAAoAgAgARCVAQsgAEEMaiEAIAJBdGoiAg0ACwsgAyABEPMIIANBwABqIgAgBUcNAAsLAkAgBEEUaigCACICRQ0AIAEtAAANACAEQRBqKAIAIQAgAkEMbCECA0ACQCABLQAADQAgACgCACABEJUBCyAAQQxqIQAgAkF0aiICDQALCyAEKAIYQYCAgIB4Rg0DIARBIGooAgAiAkUNAyABLQAADQMgBEEcaigCACEAIAJBMGwhAgNAAkAgAS0AAA0AIAAgARD0AgsgAEEwaiEAIAJBUGoiAg0ADAQLCyABLQAADQIgACgCBCABEJUBDwsgACgCECIARQ0BIABBCGooAgAiAkUNASAAQQRqKAIAIQAgAkEMbCECA0ACQAJAIAAoAgAiAw0AIABBBGooAgAgARDJBAwBCyABLQAADQAgAyABEJUBCyAAQQxqIQAgAkF0aiICDQAMAgsLIAEtAAANACAAKAIEIAEQlQELC9MHAQd/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IQYgAUEAOgB5AkAgACgCBCIDKAIAQRpHDQAgAiADKQMIIANBGGooAgAQuhggAUEsaiACKQMAIAIoAggQ0QoLIAMgARB3IAEgBToAKCABIAY6AHkLAkAgBCgCAEEHRg0AIAQgARDnBAsgACgCaCABEOcEIAAoAkhBgICAgHhGDQEgASAAQcgAahDNCQwBCwJAIAAoAghBA0cNACABLQAoIQMgAUEAOgAoIAEtAHkhBSABQQA6AHkCQCAAKAIMIgQoAgBBGkcNACACIAQpAwggBEEYaigCABC6GCABQSxqIAIpAwAgAigCCBDRCgsgBCABEHcgASADOgAoIAEgBToAeQsgASAAKAIoEN4ECyACQRBqJAALlQcBB38jAEEQayICJAACQAJAAkACQAJAIAAoAgAOBQQAAQIDBAsgACgCBEEBRw0DIAEtACghAyABQQA6ACggAS0AeSEEIAFBADoAeQJAIAAoAggiACgCAEEaRw0AIAIgACkDCCAAQRhqKAIAELoYIAFBLGogAikDACACKAIIENEKCyAAIAEQdyABIAM6ACggASAEOgB5DAMLIAEtACghAyABQQA6ACggAS0AeSEEIAFBADoAeQJAIAAoAgQiACgCAEEaRw0AIAIgACkDCCAAQRhqKAIAELoYIAFBLGogAikDACACKAIIENEKCyAAIAEQdyABIAM6ACggASAEOgB5DAILIAAoAgQiBUHAAGogARDDCgJAIAVBhAFqKAIAIgNFDQAgBUGAAWooAgAhACADQdgAbCEDIAFBLGohBgNAAkACQAJAIAAoAgBBfGoOAgIAAQsgAS0AKCEHIAFBADoAKCABLQB5IQggAUEAOgB5AkAgAEEEaigCACIEKAIAQRpHDQAgAiAEKQMIIARBGGooAgAQuhggBiACKQMAIAIoAggQ0QoLIAQgARB3IAEgBzoAKCABIAg6AHkMAQsgACABELoFCyAAQdgAaiEAIANBqH9qIgMNAAsLAkAgBUGYAWooAgAiAEUNACAFQZQBaigCACIEIABBKGxqIQcgAUEsaiEGA0ACQAJAAkACQAJAIAQoAgAOBQQAAQIDBAsgBCgCBEEBRw0DIAEtACghAyABQQA6ACggAS0AeSEIIAFBADoAeQJAIAQoAggiACgCAEEaRw0AIAIgACkDCCAAQRhqKAIAELoYIAYgAikDACACKAII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QQIQsRtFDQAgBCADIAZBAyAFQYC4mAEQmw8gEyENIAAgASAEKAIAIAQoAgQQmRxFDQALCwsgBEGAAWokACAKIAdHC+AGAQJ/IwBBwAFrIgIkAAJAAkACQAJAAkACQAJAIAEoAgAOAwABAgALIAFBCGogABCJBAwFCyABKAIwIgFFDQQgASgCAEEaRw0BIAJBgAFqIAAoAgAgACgCBCABQQhqIgAQtQwgAigCgAFBMkYNBCABEMkBIAFBOGogAkGAAWpBOGopAwA3AwAgAUEwaiACQYABakEwaikDADcDACABQShqIAJBgAFqQShqKQMANwMAIAFBIGogAkGAAWpBIGopAwA3AwAgAUEYaiACQYABakEYaikDADcDACABQRBqIAJBgAFqQRBqKQMANwMAIAAgAkGAAWpBCGopAwA3AwAgASACKQOAATcDAAwECwJAAkACQAJAAkAgASgCBCIBKAIADgcIAAECAwgECAsgAUEMaigCACIDRQ0HIAFBCGooAgAhASADQShsIQMDQAJAIAEoAgBBB0YNACABIAAQlwMLIAFBKGohASADQVhqIgMNAAwICwsgASgCBCAAEJcDDAYLIAFBDGooAgAiA0UNBSABQQhqKAIAIQEgA0E4bCEDA0AgACABEP4DIAFBOGohASADQUhqIgMNAAwGCwsgASgCBCAAEJcDIAEoAggiASgCAEEaRw0CIAJBwABqIAAoAgAgACgCBCABQQhqIgAQtQwgAigCQEEyRg0EIAEQyQEgAUE4aiACQcAAakE4aikDADcDACABQTBqIAJBwABqQTBqKQMANwMAIAFBKGogAkHAAGpBKGopAwA3AwAgAUEgaiACQcAAakEgaikDADcDACABQRhqIAJBwABqQRhqKQMANwMAIAFBEGogAkHAAGpBEGopAwA3AwAgACACQcAAakEIaikDADcDACABIAIpA0A3AwAMBAsgASgCBCIBKAIAQRpHDQIgAiAAKAIAIAAoAgQgAUEIaiIAELUMIAIoAgBBMkYNAyABEMkBIAFBOGogAkE4aikDADcDACABQTBqIAJBMGopAwA3AwAgAUEoaiACQShqKQMANwMAIAFBIGogAkEgaikDADcDACABQRhqIAJBGGopAwA3AwAgAUEQaiACQRBqKQMANwMAIAAgAkEIaikDADcDACABIAIpAwA3AwAMAwsg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sAMMAQsACyACEOUXCyAEQaABaiQAC4QHAgh/A34jAEGgAWsiASQAAkACQAJAAkACQAJAIAAoAgAOCAUFBQUAAQIDBQsgACgCDCICKAIAIAJBDGooAgAQxxpFDQQMAwsgACgCBCICKAIAIAJBDGooAgAQxxpFDQMMAgsgACgCDA0BDAILIAAoAgxFDQELQQAtAMDxnQEaAkACQEEcEIUBIgJFDQAQ3xIhAyACIAApAgA3AgAgAEEANgIAIAJBGGogAEEYaiIEKAIANgIAIAJBEGogAEEQaikCADcCACACQQhqIABBCGopAgA3AgAgBCADNgIAIAEgAjYCEEEBIQQgAUEBNgIMIAFBOGohAwNAIAFBGGpBCGoiBSABKAIQIgYgBEF/aiICQRxsaiIAQQxqKQIANwMAIAFBGGpBEGoiByAAQRRqKQIANwMAIAEgAjYCFCABIAApAgQ3AxgCQAJAAkACQAJAAkACQCAAKAIAIghBCEYNACADIAEpAxg3AgAgA0EIaiAFKQMANwIAIANBEGogBykDADcCACABIAg2AjQgCA4IBQUFBQIDAQQFCyABKAIMIQMgAkUNCCAGIQADQCAAEPUdIABBHGohACACQX9qIgINAAwJCwsgASgCQCEAIAFBADYCQCABKAI8IQIgAUEANgKcASABIAA2ApgBIAEgAzYClAEgASACIABBHGxqNgKQASABIAI2AowBIAFBDGogAUGMAWoQwwYMAwsgASgCQCECEN8SIQggAkEYaiIFKAIAIQcgBSAINgIAIAIpAgAhCSACQQA2AgAgAkEQaikCACEKIAJBCGopAgAhCyAAIAk3AgAgAEEIaiALNwIAIABBEGogCjcCACAAQRhqIAc2AgAgASAENgIUDAMLIAEoAjghAhDfEiEIIAJBGGoiBSgCACEHIAUgCDYCACACKQIAIQkgAkEANgIAIAJBEGopAgAhCiACQQhqKQIAIQsgACAJNwIAIABBCGogCzcCACAAQRBqIAo3AgAgAEEYaiAHNgIAIAEgBDYCFAwCCyABKAJAIQAgAUEANgJAIAEoAjwhAiABQQA2ApwBIAEgADYCmAEgASADNgKUASABIAIgAEEcbGo2ApABIAEgAjYCjAEgAUEMaiABQYwBahDDBgsgASgCFCEECyABQTRqEPUdIAQNAAsgASgCECEGIAEoAgwhAwwBCwALIAMgBkEEQRwQwBELIAFBoAFqJAALhAcCCn8BfiMAQfAAayICJAACQAJAIAEoAgBBA0YNACAALQB5IQMMAQsgAC0AKCEEIABBADoAKCAALQB5IQMgAEEAOgB5AkAgASgCBCIFKAIAQRpHDQAgAkHgAGogBSkDCCAFQRhqKAIAELoYIABBLGogAikDYCACKAJoENEKCyAFIAAQdyAAIAQ6ACggACADOgB5C0EAIQUgAkEgakEAKQOY+5wBIgw3AgAgAkEwaiAMNwIAIAIgAzoAWSACQQA2AhQgAkKAgICAgAE3AgwgAkEANgJAIAJBADoARCACQQA2AlAgAkEANgFaIAJCgICAgMAANwI4IAJCgICAgIABNwJIIAIgAC0AeDoAWCACIAAoAnQ2AlQgAkEAKQOQ+5wBIgw3AhggAiAMNwIoIAIgAC0AfjoAXiAAQSxqIQYCQANAIAVB1ABGDQEgACAFakEsaiIDKAIAIQQgAyACQQxqIAVqIgcoAgA2AgAgByAENgIAIAVBBGohBQwACwsCQCABKAIoIggoAhQiBUUNACAIKAIQIQMgBUEMbCEEIAAtAHkhByAALQAoIQEDQCADKAIAIQUgAEEAOgB5IABBADoAKAJAIAUoAgBBGkcNACACQeAAaiAFKQMIIAVBGGooAgAQuhggBiACKQNgIAIoAmgQ0QoLIANBDGohAyAFIAAQdyAAIAE6ACggACAHOgB5IARBdGoiBA0ACwsCQCAIKAIIIgVFDQAgCCgCBCIHIAVBBnRqIQEgAC0AeiEJIAAtAHkhCiAALQAoIQsDQCAAQQE6ACggAEEAOgB5IAAgAC0Ae0EBczoAegJAIAcoAjgiBUUNACAHKAI0IQMgBUEMbCEEA0AgAygCACEFIABBADoAeSAAQQA6ACgCQCAFKAIAQRpHDQAgAkHgAGogBSkDCCAFQRhqKAIAELoYIAYgAikDYCACKAJoENEKCyADQQxqIQMgBSAAEHcgAEEBOgAoIABBADoAeSAEQXRqIgQNAAsLIABBAToAeSAHIAAQ5wQgACAKOgB5IAAgCToAeiAAIAs6ACggB0HAAGoiBSEHIAUgAUcNAAsLAkAgCCgCGEGAgICAeEYNACAIQSBqKAIAIgNFDQAgCEEcaigCACEFIANBMGwhAwNAIABBADoAfSAFIAAQayAFQTBqIQUgA0FQaiIDDQALCyAGIAJBDGoQkwMgAkHwAGokAAvYBgEEfyMAQcABayICJAACQAJAAkACQAJAAkAgACgCAA4HBQABAgQFAwULIAAoAgwiA0UNBCAAKAIIIQAgA0EobCEDA0ACQCAAKAIAQQdGDQAgACABEJcDCyAAQShqIQAgA0FYaiIDDQAMBQsLIAAoAgQgARCXAwwDCyAAKAIMIgNFDQIgACgCCCEAIANBOGwhAwNAAkACQAJAAkACQCAAKAIADgMAAQIACyAAQQhqIAEQiQQMAwsgAEEwaigCACIERQ0CIAQoAgBBGkcNASACQYABaiABKAIAIAEoAgQgBEEIaiIFELUMIAIoAoABQTJGDQIgBBDJASAEQThqIAJBgAFqQThqKQMANwMAIARBMGogAkGAAWpBMGopAwA3AwAgBEEoaiACQYABakEoaikDADcDACAEQSBqIAJBgAFqQSBqKQMANwMAIARBGGogAkGAAWpBGGopAwA3AwAgBEEQaiACQYABakEQaikDADcDACAFIAJBgAFqQQhqKQMANwMAIAQgAikDgAE3AwAMAgsgAEEEaiABELgFDAELIAQgARBGCyAAQThqIQAgA0FIaiIDDQAMAwsLAkAgACgCBCIAKAIAQRpHDQAgAiABKAIAIAEoAgQgAEEIaiIBELUMIAIoAgBBMkYNAiAAEMkBIABBOGogAkE4aikDADcDACAAQTBqIAJBMGopAwA3AwAgAEEoaiACQShqKQMANwMAIABBIGogAkEgaikDADcDACAAQRhqIAJBGGopAwA3AwAgAEEQaiACQRBqKQMANwMAIAEgAkEIaikDADcDACAAIAIpAwA3AwAMAgsgACABEEYMAQsgACgCBCABEJcDAkAgACgCCCIAKAIAQRpHDQAgAkHAAGogASgCACABKAIEIABBCGoiARC1DCACKAJAQTJGDQEgABDJASAAQThqIAJBwABqQThqKQMANwMAIABBMGogAkHAAGpBMGopAwA3AwAgAEEoaiACQcAAakEoaikDADcDACAAQSBqIAJBwABqQSBqKQMANwMAIABBGGogAkHAAGpBGGopAwA3AwAgAEEQaiACQcAAakEQaikDADcDACABIAJBwABqQQhqKQMANwMAIAAgAikDQDcDAAwBCyAAIAEQRgsgAkHAAWokAAv9BgELfyMAQSBrIgIkAAJA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KAIAIQUMAQsgA0HoAGogBUEUaikCADcDACADQdgAakEIaiIGIAVBDGopAgA3AwAgA0H4AGogBEHQAGoiB0EIaigCADYCACADIAUpAgQ3A1ggAyAHKQIANwNwAkBBJEUNACADQfABaiACQST8CgAACyADQRBqIANB8AFqEJkOIAMoAhQhBSADKAIQIQcCQCAGKAIAIgIgAygCWEcNACADQdgAakH4gYUBEPkVCyADKAJcIAJBA3RqIgYgBTYCBCAGIAc2AgAgAyACQQFqNgJgIANBCGogA0HYAGoQ8RhBCiEFIAMoAgwhAgsgAyAFNgIcIANBIjYCGCADIAI2AiAgBCgCHCICRQ0BIAQgAkF/aiICNgIcIAQoAhggAkHwAGxqIQICQEHwAEUNACADQYABaiACQfAA/AoAAAsgAygCgAFBgICAgHhqDgIDAQILAkBByABFDQAgA0HwAWogBUEkakHIAPwKAAALIANByAJqIAVB5ABqKQIANwMAIANBwAJqIAVB3ABqKQIANwMAIAMgBSkCVDcDuAIgA0EVNgLUAiAAIAEoAgQgASgCCCADQbgCaiADQdQCahDRDCADQfABahDkFCADQYABahDlFyAEIAQoAhBBAWo2AhAgAhDlFwwECwJAQcAARQ0AIAAgA0EYakHAAPwKAAALIAQgBCgCEEEBajYCEAwDCyADQRxqIQUCQEHIAEUNACADQfABaiACQSRqQcgA/AoAAAsgA0HIAmogAkHkAGopAgA3AwAgA0HAAmogAkHcAGopAgA3AwAgAyACKQJUNwO4AiADQRU2AtQCIAAgASgCBCABKAIIIANBuAJqIANB1AJqENEMIANB8AFqEOQUIAUQsAMgBCAEKAIQQQFqNgIQIANBgAFqEOUXDAILQbKjmwFBKEGIgoUBEN0XAAtB6IGFARD4FAALIANB8AJqJAALxgYBA38jAEHAAWsiAiQAAkAgACgCAEEDRw0AAkAgACgCBCIDKAIAQRpHDQAgAkGAAWogASgCACABKAIEIANBCGoiBBC1DCACKAKAAUEyRg0BIAMQyQEgA0E4aiACQYABakE4aikDADcDACADQTBqIAJBgAFqQTBqKQMANwMAIANBKGogAkGAAWpBKGopAwA3AwAgA0EgaiACQYABakEgaikDADcDACADQRhqIAJBgAFqQRhqKQMANwMAIANBEGogAkGAAWpBEGopAwA3AwAgBCACQYABakEIaikDADcDACADIAIpA4ABNwMADAELIAMgARBGCwJAAkACQAJAAkACQAJAAkAgACgCICIAKAIADgcHAAECAwcEBwsgAEEMaigCACIDRQ0GIABBCGooAgAhACADQShsIQMDQAJAIAAoAgBBB0YNACAAIAEQlwMLIABBKGohACADQVhqIgMNAAwHCwsgACgCBCABEJcDDAULIABBDGooAgAiA0UNBCAAQQhqKAIAIQAgA0E4bCEDA0AgASAAEP4DIABBOGohACADQUhqIgMNAAwFCwsgACgCBCABEJcDIAAoAggiACgCAEEaRw0BIAJBwABqIAEoAgAgASgCBCAAQQhqIgEQtQwgAigCQEEyRg0DIAAQyQEgAEE4aiACQcAAakE4aikDADcDACAAQTBqIAJBwABqQTBqKQMANwMAIABBKGogAkHAAGpBKGopAwA3AwAgAEEgaiACQcAAakEgaikDADcDACAAQRhqIAJBwABqQRhqKQMANwMAIABBEGogAkHAAGpBEGopAwA3AwAgASACQcAAakEIaikDADcDACAAIAIpA0A3AwAMAwsgACgCBCIAKAIAQRpHDQEgAiABKAIAIAEoAgQgAEEIaiIBELUMIAIoAgBBMkYNAiAAEMkBIABBOGogAkE4aikDADcDACAAQTBqIAJBMGopAwA3AwAgAEEoaiACQShqKQMANwMAIABBIGogAkEgaikDADcDACAAQRhqIAJBGGopAwA3AwAgAEEQaiACQRBqKQMANwMAIAEgAkEIaikDADcDACAAIAIpAwA3AwAMAgsgACABEEYMAQsgACABEEYLIAJBwAFqJAAL+wYBA38jAEHwAGsiBiQAIAYgBDcDQCAGQThqIAZBwABqEP4RAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgBigCOCIHIAYoAjwiCEHEoJsBQQgQmRwNAAJAIAcgCEHMoJsBQQQQmRwNAAJAIAcgCEHQoJsBQQkQmRwNAAJAAkACQCAHIAhB2aCbAUEGEJkcDQAgByAIQd+gmwFBCRCZHA0BIAcgCEHooJsBQQQQmRxFDQ0gBQ0GIAEtAMkBDQ0gASgCeCABLQDIARCmFUUNDQwOCyABLQDJAUUNAQwMCwJAIAUNACABKAJ4IAEtAMgBEKYVRQ0MDAsL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GzYCACAHIAIpAgQ3AgwgB0EUaiACQQxqKQIANwIAIAdBHGogAkEEakEQaikCADcCACAHQSRqIAJBBGpBGGooAgA2AgAMAQsgAkEEakEUaiAAQRhqKQIANwIAIAJBEGogAEEQaikCADcCAEEAIQRBAC0AwPGdARogAiAAKQIINwIIQcAAEIUBIgdFDQMgB0EENgIIIAdBGzYCACAHIAIpAgQ3AgwgB0EUaiACQQxqKQIANwIAIAdBHGogAkEEakEQaikCADcCACAHQSRqIAJBBGpBGGooAgA2AgALQQIhBkEAIQULC0EALQDA8Z0BGkHAABCFASIARQ0AIAAgASkDADcDACAAQThqIAFBOGopAwA3AwAgAEEwaiABQTBqKQMANwMAIABBKGogAUEoaikDADcDACAAQSBqIAFBIGopAwA3AwAgAEEYaiABQRhqKQMANwMAIABBEGogAUEQaikDADcDACAAQQhqIAFBCGopAwA3AwBBAC0AwPGdARpBwAAQhQEiAUUNACABQQA6ADwgASAANgI4IAFCADcDMCABIAM2AiggAUIANwMgIAEgCDcCGCABIAQ2AhQgASAFNgIQIAEgBzYCDCABIAY2AgggAUEBNgIAIAJBIGokACABDwsAC90GAg5/A34jAEHwAGsiAiQAIAEoAsABIQMgARC3ASACQdAAaiABEJAKAkACQAJAAkACQAJAAkAgAi0AZEECRw0AIAIoAlAhAQwBCyACKQNYIRAgAikDUCERIAEtAMgBQQlHDQIgARCHDiABELcBIAJB0ABqIAEQkAogAi0AZEECRw0BIAIoAlAhASAREMYdCyAAQQY6ACwgACABNgIADAQLIAIpA1AhEiARUEUNASAQIREgEiEQC0EAIQQgAkEAOgAUIAJBADYCECACIBA+AgggAiAQQiCIPgIMQQMhBQwBCyACKAJYIQUgAiACKAJcIgY2AiQgAiADNgIgIAIgBjYCHCACIAU2AhggAiAQNwMIIAIgEjcDECASQiCIpyEEQQUhBQsgAiAFOgAsIAIgETcDACACQS1qIQcgAkEcaiEIIAJBFWohCSACQQRyIQoDQAJAAkAgAS0AyAFBCEcNACABEIcOIAEQtwEgAkHQAGogARCQCiACLQBkQQJHDQEgAigCUCEBIABBBjoALCAAIAE2AgAgAhDSFwwDC0EwRQ0CIAAg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QQFyIQsMBAsgA0EIdCADQRB0ckEBciELDAELIAtBgP7/B3EhAyALQQFxRQ0BIAtB////B3EiAUEQdiEOIAFBCHYhASADIQsLIAIgAToABiACIA46AAcCQCABQf8BcSAORg0AIAJBAjYCHCACQdDKhAE2AhggAkICNwIkIAJBxwA2AhQgAkHHADYCDCACIAJBCGo2AiAgAiACQQdqNgIQIAIgAkEGajYCCCAEIAUgAkEYahDOBQ0EDAILQQEhASACQQE2AhwgAkGY75sBNgIYIAJCATcCJCACQccANgIMIAIgAkEIajYCICACIAJBBmo2AgggBCAFIAJBGGoQzgVFDQEMBAsLQQEhASAEQa/EmwFBASAGEQwARQ0ADAILC0EBIQELIAJBMGokACABC6YHAgF/AXwjAEEwayICJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAALQAADhIAAQIDBAUGBwgJCgsMDQ4PEBEACyACIAAtAAE6AAggAkECNgIUIAJBzIuYATYCECACQgE3AhwgAkEDNgIsIAIgAkEoajYCGCACIAJBCGo2AiggASgCACABKAIEIAJBEGoQtx4hAQwRCyACIAApAwg3AwggAkECNgIUIAJB6IuYATYCECACQgE3AhwgAkEENgIsIAIgAkEoajYCGCACIAJBCGo2AiggASgCACABKAIEIAJBEGoQtx4hAQwQCyACIAApAwg3AwggAkECNgIUIAJB6IuYATYCECACQgE3AhwgAkEFNgIsIAIgAkEoajYCGCACIAJBCGo2AiggASgCACABKAIEIAJBEGoQtx4hAQwPCyAAKwMIIQMgAkECNgIUIAJBiIyYATYCECACQgE3AhwgAkEGNgIMIAIgAzkDKCACIAJBCGo2AhggAiACQShqNgIIIAEoAgAgASgCBCACQRBqELceIQEMDgsgAiAAKAIENgIIIAJBAjYCFCACQaSMmAE2AhAgAkIBNwIcIAJBBzYCLCACIAJBKGo2AhggAiACQQhqNgIoIAEoAgAgASgCBCACQRBqELceIQEMDQsgAiAAKQIENwIIIAJBATYCFCACQbyMmAE2AhAgAkIBNwIcIAJBCDYCLCACIAJBKGo2AhggAiACQQhqNgIoIAEoAgAgASgCBCACQRBqELceIQEMDAsgASgCAEG5i5gB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ECACQoCAgIDAADcCCAJAAkACQCADRQ0AIAJBCGogAxCwDiADIAIoAhwiBEsNAQsgAiADNgIcDAELIAJBFGogAyAEaxCwDgsgAkH8AWogAkEIakEYaigCADYCACACQfQBaiACQQhqQRBqKQIANwIAIAJB7AFqIAJBCGpBCGoiAykCADcCACACQcgBakEIaiACQYACakEIaikDADcDACACQcgBakEQaiACQYACakEQaikDADcDACACQcgBakEYaiACQYACakEYaigCADYCACACIAIpAgg3AuQBIAIgAikDgAI3A8gBIAJBADYCnAEgAkKAgICAwAA3ApQBIAJCBDcCjAEgAkIANwKEASACQoCAgIDAADcCfCADQQApA5j7nAE3AwAgAkEAKQOQ+5wBNwMIIAIgBTcDICACIAY3AxgCQEE4RQ0AIAJBOGogAkHIAWpBOPwKAAALIAJCATcDsAEgAkIANwOoASACQoCAgIDAADcDoAEgAkEANgK4ASACQQA2AnggAkIANwNwIAJBADYCKCACIAE2AsgBIAIgAkEIajYCzAEgAkHIAWoQ/wECQEHAAUUNACAAIAJBCGpBwAH8CgAACyACQaACaiQADwsgAkEBNgLMASACQbzlhAE2AsgBIAJCATcC1AEgAkEqNgKEAiACQbDihAE2AoACIAIgAkGAAmo2AtABIAJByAFqQbTmhAEQhRsAC+EFAgd/AX5BACECAkAgASgCCCIDIAEoAgQiBE8NACABKAIAIANqLQAAQfUARw0AQQEhAiABIANBAWoiAzYCCAsCQAJAIAMgBE8NACABKAIAIgUgA2otAABBUGoiBkH/AXEiB0EKSQ0BCyAAQQA2AgAgAEEAOgAEDwsgASADQQFqIgM2AggCQAJAAkAgBw0AQQAhBwwBCyAGQf8BcSEHA0ACQCAEIANHDQAgBCEDDAMLIAUgA2otAABBUGpB/wFxIgZBCUsNASABIANBAWoiAzYCCAJAIAetQgp+IglCIIinDQAgCaciCCAGaiIHIAhPDQELCyAAQQA2AgAgAEEAOgAEDwsgAyAETw0AIAUgA2otAABB3wBHDQAgASADQQFqIgM2AggLAkAgAyAHaiIGIANPDQAgAEEANgIAIABBADoABA8LIAEgBjYCCAJAAkACQAJAIAYgBEsNACADRQ0BIAMgBE8NASAFIANqLAAA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DQAgAiAJKQMIIAlBGGooAgAQuhggBiACKQMAIAIoAggQ0QoLIAkgARB3IAEgBzoAKCABIAg6AHkLIABBKGooAgAgARDnBAwCCyABIABBEGoQ8QogAEEIaiEJAkAgAEEwaigCACIARQ0AIAEtACghByABQQA6ACggAS0AeSEIIAFBADoAeQJAIAAoAgBBGkcNACACIAApAwggAEEYaigCABC6GCAGIAIpAwAgAigCCBDRCgsgACABEHcgASAHOgAoIAEgCDoAeQsgASAJEPsQDAELIABBBGooAgAgARDnBAsgBSADQThqIgNHDQAMAwsLIAAoAgQgARDnBCABLQAoIQMgAUEAOgAoIAEtAHkhBCABQQA6AHkCQCAAKAIIIgAoAgBBGkcNACACIAApAwggAEEYaigCABC6GCABQSxqIAIpAwAgAigCCBDRCgsgACABEHcgASADOgAoIAEgBDoAeQwBCyABLQAoIQMgAUEAOgAoIAEtAHkhBCABQQA6AHkCQCAAKAIEIgAoAgBBGkcNACACIAApAwggAEEYaigCABC6GCABQSxqIAIpAwAgAigCCBDRCgsgACABEHcgASADOgAoIAEgBDoAeQsgAkEQaiQAC+kFAQl/IwBB8AFrIgMkACADQaABakEEaiEEIANBCGpBCGohBSADQQhqQQRyIQYgACgCACEHAkACQANAIAEtAMgBIQACQAJAIActAAAiCEGkAUYNACADIAg6ANsBAkAgAEH/AXEiCUGjAUcNACADQdwBakGjARDeGyABKALEASEAIAEoAsABIQIgA0EBNgIMIANBmO+bATYCCCADQgE3AhQgA0GKBa1CIIYgA0HbAWqthDcD6AEgAyADQegBajYCECADQaABaiADQQhqEI0VIANBtAFqIANB5AFqKAIANgIAIAMgAykC3AE3AqwBIAEgAiAAIANBoAFqEK8aDAQLIAkgCEcNAQwDCyAAQf8BcUGjAUYNAgsgASgCwAEhCgJAAkAgAEH/AXFBGEYNAEEEIQhBACELQQAhCQwBCyADQaABaiABQQEQ7gIgAygCpAEhCCADKAKgASIJQYCAgIB4Rg0DIAMoAqgBIQsgAS0AyAEhAAsCQAJAIABB/wFxIgBB2ABGDQAgAEHfAEYNACABIAEoAngiAEH///v/fnFBgICAgAFyNgJ4IAMgCzYCqAEgAyAI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AkACQAJAIAIoAggiBEUNACABKAIIIgVFDQECQAJAAkACQAJAIARBAUcNACACKAIEIgIoAgBBAUYNASADQTRqIAEoAgQgBRDcEiADQRBqIANBNGogAkEBQQBB/OOCARCNHCgCABCUCCAAQQhqIANBEGpBCGooAgA2AgAgACADKQIQNwIAIABBDGogAygCHBDtEQwICyABKAIEIgYgBSACKAIEIgcgBBDrGEH/AXEOAgIDAQsgACABKAIEIAUQ3BIgAEEUakEAKALgj5sBNgIAIABBACkC2I+bATcCDAwGCyAAQQxqIAYgBRDcEiAAQQhqQQAoAuCPmwE2AgAgAEEAKQLYj5sBNwIADAULQQRBBBCJHSECIABBATYCCCAAIAI2AgQgAEEBNgIAIAJBATYCACAAQQApAtiPmwE3AgwgAEEUakEAKALgj5sBNgIADAQLIAcgBEECdGpBfGoiCEUNAgJAIAgoAgAiCWciCA0AIANBEGogBiAFENwSIAAgA0EQaiAHIAQQqAQMBAsgA0EoaiABIAgQiRQgA0E0aiACIAgQiRQgA0EQaiADQShqIAMoAjgiAiADKAI8EKgEIABBCGogA0EQakEIaigCADYCACAAIAMpAhA3AgAgA0EIaiADQSRqKAIANgIAIAMgAykCHDcDACADKAI0IAIQsSAgAEEMaiEAAkAgAygCBCADIAMoAgBBgICAgHhGGygCCEUNACAAIAMgCUUgCEEfcRCtCAwECyAAIAMQohcMAwsgA0EANgIgIANBATYCFCADQeTjggE2AhAgA0IENwIYIANBEGpBnOSCARCFGwALIABBCGpBACgC4I+bASICNgIAIABBACkC2I+bASIKNwIAIAAgCjcCDCAAQRRqIAI2AgAMAQtBjOSCARCbIAALIANBwABqJAALwQUBBn8jAEGwDmsiAyQAIAJBBHQhBCABQQhqKAIAIQUCQCACQQFGDQAgAUEYaiEGIARBcGpBBHYhBwNAIAYoAgAiCCAFIAggBUkbIQUgBkEQaiEGIAdBf2oiBw0ACwsgA0ECOwGMCSADQYCCiBA2AogJQQAhBiADQQA6AIQJIANC/////w83AvwIIANCBDcC9AggA0IANwLsCCADQoCAgIDAADcC5AgDQAJAIAMtAI0JDQACQCADKALsCEGAAUkNACADQQE6AI0JIANB5AhqEIcU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AHkMAgsgACgCBCIEQcAAaiABEMMKIARBgAFqKAIAIARBhAFqKAIAIAEQgggCQCAEQZgBaigCACIDRQ0AIARBlAFqKAIAIQAgA0EobCEDA0AgACABEJsHIABBKGohACADQVhqIgMNAAsLIAQtADxBBkYNASAEQRBqIAEQwwoMAQsgACgCDCIDRQ0AIAAoAggiBCADQShsaiEFIAFBLGohBgNAAkACQAJAAkACQCAEKAIADgUEAAECAwQLIAQoAgRBAUcNAyABLQAoIQMgAUEAOgAoIAEtAHkhByABQQA6AHkCQCAEKAIIIgAoAgBBGkcNACACIAApAwggAEEYaigCABC6GCAGIAIpAwAgAigCCBDRCgsgACABEHcgASADOgAoIAEgBzoAeQwDCyABLQAoIQMgAUEAOgAoIAEtAHkhByABQQA6AHkCQCAEKAIEIgAoAgBBGkcNACACIAApAwggAEEYaigCABC6GCAGIAIpAwAgAigCCBDRCgsgACABEHcgASADOgAoIAEgBzoAeQwCCyABIAQoAgQQ7wYMAQsgBEEMaigCACIDRQ0AIARBCGooAgAhACADQShsIQMDQCABIAAQoQMgAEEoaiEAIANBWGoiAw0ACwsgBEEoaiIEIAVHDQALCyACQRBqJAAL1QQCBH8BfiMAQYABayICJAACQAJAIAEtABRBAkYNACACQQhqIAAgARDSBSACLQA0QQZGDQAgAkE4akEoaiACQQhqQShqKQMANwMAIAJBOGpBIGogAkEIakEgaikDADcDACACQThqQRhqIAJBCGpBGGopAwA3AwAgAkE4akEQaiACQQhqQRBqKQMANwMAIAJBOGpBCGogAkEIakEIaikDADcDACACIAIpAwg3AzgCQAJAAkACQCACLQBkIgNBfWoiAEEBIABB/wFxQQNJG0H/AXEOAwACAQALIAJB8ABqQQhqIAJBFGopAgA3AwAgAkHuAGogAkEfai0AADoAACACIAIpAgw3A3AgAiACLwAdOwFsIAItAEwhBCACKAI4IQAMAgtBtuSaAUEPQYDlmgEQ3RcAC0EALQDA8Z0BGkEwEIUBIgBFDQIgACACKQMINwMAIABBKGogAkEIakEoaikDADcDACAAQSBqIAJBCGpBIGopAwA3AwAgAEEYaiACQQhqQRhqKQMANwMAIABBEGogAkEIakEQaikD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IQEDQCADIAFqQQhGDQIgACAGajEAACEKIAAgAWogCCAHiDwAACAKIAggCYNCCn58IQggAUEBaiEBIAUgBkEBaiIGakEIRw0ACyAIUA0DDAILQQAhBCAIQgBSDQEgAEEANgIADAMLIAZBeGpBgAZBjOqAARCzEQALA0AgCCIKIAmDQgp+IQggCiAHiKchAQJAAkAgBEGABkkNACABQf8BcUUNASAAQQE6AIgGDAELIAIgBGogAToAACAEQQFqIQQLIAhCAFINAAsLIAAgBDYCACAEQYAGSw0BIARBB2ohAQNAIAAgAWotAAANASAAIAFBeGo2AgAgAUF/aiIBQQdHDQALCw8LIARBf2pBgAZB3OmAARCzEQAL3gQCAn8BfiMAQcAAayIDJAACQAJAAkACQAJAAkACQAJAIAEoAgAOBQABAgMEAAsgA0EwaiACIAEoAhAiBEEAEJUCIAMtADBBBEYNBCADKQMwIgVC/wGDQgRRDQQgACAFNwIADAYLIANBMGogAUEIaiACEIcBIAMtADBBBEYNBCADKQMwIgVC/wGDQgRRDQQgACAFNwIADAULIANBMGogAUEIaiACENsUIAMtADBBBEYNAyADKQMwIgVC/wGDQgRRDQMgACAFNwIADAQLIANBMGogAUEEaiACEOIIIAMtADBBBEYNAiADKQMwIgVC/wGDQgRRDQIgACAFNwIADAMLIANBMGogAUEIaiACEKkDIAMtADBBBEYNASADKQMwIgVC/wGDQgRRDQEgACAFNwIADAILAkACQAJAIARFDQAgA0EwaiACIAQQtBogAy0AMEEERg0AIAMpAzAiBUL/AYNCBFINAQsgAUEIaiEBIAItAFwNASADQTBqIAEgAhDVEyADLQAwQQRGDQIgAykDMCIFQv8Bg0IEUQ0CIAAgBTcCAAwDCyAAIAU3AgAMAgsgA0EQaiABEP4RIANBMGogAygCECADKAIUEMYEIANBJGogAygCNCIBIAMoAjhBASACLQBiENABIANBCGogA0EkahDBEyADQRhqIAIgAygCCCADKAIMEMANAkAgAy0AGEEERg0AIAMpAxgiBUL/AYNCBFENACAAIAU3AgAgA0EkahCmHSADKAIwIAEQhR8MAgsgA0EkahCmHSADKAIwIAEQhR8LIABBBDoAAAsgA0HAAGokAAuPBQECfyMAQTBrIgMkAAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgBBfmoiBEEGIARBCUkbDgkAAQIDBAUGBwgACyADQQE2AhQgA0GY75sBNgIQIANCATcCHCADQYsCNgIMIAMgACkCCDcCKCADIANBCGo2AhggAyADQShqNgIIIAEgAiADQRBqELceIQAMCAsgAyAAQQRqNgIIIANBAjYCFCADQeDBmAE2AhAgA0IBNwIcIANB+gA2AiwgAyADQShqNgIYIAMgA0EIajYCKCABIAIgA0EQahC3HiEADAcLIANBADYCICADQQE2AhQgA0GEwpgBNgIQIANCBDcCGCABIAIgA0EQahC3HiEADAYLIANBADYCICADQQE2AhQgA0GUwpgBNgIQIANCBDcCGCABIAIgA0EQahC3HiEADAULIANBADYCICADQQE2AhQgA0GwwpgBNgIQIANCBDcCGCABIAIgA0EQahC3HiEADAQLIANBADYCICADQQE2AhQgA0HQwpgBNgIQIANCBDcCGCABIAIgA0EQahC3HiEADAMLIAMgADYCCCADQQE2AhQgA0GY75sBNgIQIANCATcCHCADQYwCNgIsIAMgA0EoajYCGCADIANBCGo2AiggASACIANBEGoQtx4hAAwCCyADIABBBGo2AgggA0ECNgIUIANB2MKYATYCECADQgE3AhwgA0H6ADYCLCADIANBKGo2AhggAyADQQhqNgIoIAEgAiADQRBqELceIQAMAQsgAyAAQQRqNgIIIANBATYCFCADQZjvmwE2AhAgA0IBNwIcIANB+gA2AiwgAyADQShqNgIYIAMgA0EIajYCKCABIAIgA0EQahC3HiEACyADQTBqJAAgAAv0BAEHfyMAQRBrIgIkACAAKAIAIQACQAJAAkACQAJAIAEoAgAOBQQAAQIDBAsgASgCBEEBRw0DIAAtACghAyAAQQA6ACggAC0AeSEEIABBADoAeQJAIAEoAggiASgCAEEaRw0AIAIgASkDCCABQRhqKAIAELoYIABBLGogAikDACACKAIIENEKCyABIAAQdyAAIAM6ACggACAEOgB5DAMLIAAtACghAyAAQQA6ACggAC0AeSEEIABBADoAeQJAIAEoAgQiASgCAEEaRw0AIAIgASkDCCABQRhqKAIAELoYIABBLGogAikDACACKAIIENEKCyABIAAQdyAAIAM6ACgg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BUUNAiAFIAQ2AAAgBUEEaiEEDAELQQAhAyAEIAVB////B3EiBUYNASACQQA2AhwgAiAFNgIYQQEhAyACQQE2AhQgAkEIaiACQRRqQfDSgAEQrhUgAigCCCEFIAIoAgwhBiAEQX9zQR92IARBgNCYARCJGiEEIAJBADYCHCACIAQ2AhggAkEBNgIUIAJBCGogAkEUakHw0oABEK4VIAIoAggiByACKAIMakF/akEAIAdrcSIHIARJDQEgACgCACAFIAZqQX9qQQAgBWtxIAUgBxDaAyIERQ0BCyAAIAFB////ByABQf///wdJG0GAgIBwcjYCCCAAIAQ2AgBBACEDCyACQSBqJAAgAwvpBAIEfwR+IwBB0ABrIgIkAAJAAkACQAJAAkACQAJAAkAgASgCAA4HBAEAAgADBgALIABBDDYCACAAIAEpAwA3AwggAEEoaiABQSBqKQMANwMAIABBIGogAUEYaikDADcDACAAQRhqIAFBEGopAwA3AwAgAEEQaiABQQhqKQMANwMADAYLIAJBEGogAUEQaikCADcDACACQQhqQRBqIAFBGGopAgA3AwAgAiABKQIINwMIIAEoAgQhAUELIQNBACEEDAMLIAJBEGogAUEQaikCADcDACACQQhqQRBqIAFBGGopAgA3AwAgAiABKQIINwMIIAEoAgQhAUELIQNBASEEDAILIABBCjYCACAAIAEpAgQ3AgQgARDYBwwDCyACQRBqIAFBFGopAgA3AwAgAkEYaiABQRxqKQIANwMAIAIgASkCDDcDCCABKAIkIQUgASgCCCEBQQAhAwsgACABNgIIIAAgBDYCBCAAIAM2AgAgACACKQMINwIMIAAgBTYCJCAAQRRqIAJBEGopAwA3AgAgAEEcaiACQRhqKQMANwIADAELIAJBIGogASgCBBCdBSACKAIkIQECQCACKAIgIgNBC0YNACACQRBqIAJBIGpBFGopAgAiBjcDACACQRhqIAJBIGpBHGopAgAiBzcDACACIAIpAiwiCDcDCCACKAJEIQQgAikDSCEJIAAgAigCKDYCCCAAIAE2AgQgACADNgIAIAAgCDcCDCAAQRRqIAY3AgAgAEEcaiAHNwIAIAAgCTcDKCAAIAQ2AiQMAQsgACABNgIMIABBBjYCCCAAQQw2AgALIAJB0ABqJAAL4AQBB38jAEEgayICJAAg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F2ogA0EWai0AADoAAAwCCyAAQQI6ABQgACACNgIADAELIAEoAsQBIQQgASgCwAEhAiADQcsAIAEQiAs3AwggARCHDiADEIoYIgs3AxggA0EYaiADQQhqELYLIQUgCxDGHQJAAkAgBQ0AIANCwcrZi8YNNwMYIANBGGogA0EIahC2CyEFQsHK2YvGDRDGHSAFRQ0BCyADQamAgIB4NgIYIAEgAiAEIANBGGoQhA0LIABBADYCGCAAQQA6ABQgAEEANgIQIAAgBDYCDCAAIAI2AgggACADKQMINwMACyADQTBqJAAL4AQCBn8BfiMAQYABayIDJAACQAJAAkACQCABLQDIASIEQYABRw0AIANBKGogARDDCyADKAIwIQUgAykDKCIJUA0CIANBADYCeCADIAMoAjQ2AnQgAyAFNgJwIANBADoAfCADIAk3A2hCACEJDAELAkAgBEHAAEYNACADQShqQQRyIAQQ3hsgA0EaNgI8IANByaibATYCOCADQbCAgIB4NgIoIAEoAsABIAEoAsQBIANBKGoQhRUhBSABLQDIAUGiAUcNAiABEMcRIQQgARCHDiABIAQQ5REMAgsgA0HoAGogARCsDUIBIQkLIANBCGpBEGogA0HwAGopAwA3AwAgA0EgaiADQegAakEQaikDADcDACADIAk3AwggAyADKQNoNwMQAkACQAJAAkAgAS0AyAFBAkcNACADQegAaiABEOcIIAMoAmgiBkGAgICAeEcNASADKAJsIQUMAwsgARCiDSIFDQJBAyEHDAELIANByABqIANB9ABqKQIANwMAIAMgAykCbDcDQEECIQcLIAEoArwBIQgCQEEIQdgAEOsfIgVFDQAgBSADKQMINwMAIAUgBjYCICAFQRhqIANBCGpBGGopAwA3AwAgBUEQaiADQQhqQRBqKQMANwMAIAVBCGogA0EIakEIaikDADcDAAJAQSFFDQAgBUEkaiADQcAAakEh/AoAAAtBACEBIAVBADoAUiAFIARBgAFGOgBRIAVBADoAUCAFIAg2AkwgBSACNgJIIAUgBzoARQwDCwALIANBCGoQuxwLQQEhAQsgACAFNgIEIAAgATYCACADQYABaiQAC88EAQl/IwBBMGsiAiQAAkACQAJAAkACQCABKAIAQYCAgIB4Rg0AAkACQCABKAIIIgNFDQAgA0EMbCIEQXRq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IAAgBSAJGygCADYCDA8LIAMgBEHMuIABELMRAAsgBSAEQdy4gAEQsxEACyAGIARBzLiAARCzEQALIAcgBEHcuIABELMRAAsgByAEQcy4gAEQsxEACyADIARB3LiAARCzEQALIAwgBEHMuIABELMRAAsgCSAEQdy4gAEQsxEACyAMIARBzLiAARCzEQALIAsgBEHcuIABELMRAAuxBAEHfwJAAkACQAJAAkACQAJAAkACQCACIAEoAggiBU8NAAJAIAEoAgQgAkEUbGoiBigCBCIHRQ0AIAcgASADQf8BcWotAEhqIgcgASgCICIITw0CIAEoAhwgB0ECdGogBDYCAAsCQCAGKAIAIgYNACABKAIUIQcMBwsgBiABKAIUIgdPDQIgA0H/AXEiCSABKAIQIgggBkEJbGoiCi0AACILSQ0GIAkgC0YNAyABQQxqIQogA0H/AXEhBQNAAkAgCCAGIgJBCWxqKAAFIgYNAEEAIQYMBwsgBiAHTw0FIAUgCCAGQQlsaiILLQAAIglLDQALIANB/wFxIAlJDQUgCyAENgABDAcLIAIgBUG8roABELMRAAsgByAIQcyugAEQsxEACyAGIAdB3K6AARCzEQALIAogBDYAAQwDCyAGIAdB7K6AARCzEQALAkAgByAKKAIARw0AIApB2LGAARDsFSABKAIQIQgLIAEgB0EBaiIFNgIUIAggB0EJbGoiASAGNgAFIAEgBDYAASABIAM6AAACQCACIAdLDQAgCCACQQlsaiAHNgAFDAILIAIgBUH8roABELMRAAsCQCAHIAEoAgxHDQAgAUEMakHYsYABEOwVIAEoAgghBQsgASAHQQFqNgIUIAEoAhAgB0EJbGoiCCAGNgAFIAggBDYAASAIIAM6AAAgAiAFTw0BIAEoAgQgAkEUbGogBzYCAAsgAEEDNgIADwsgAiAFQYyvgAEQsxEAC7QEAgV/AX4CQCABKAIwIgIgACgCkAFLDQAgACACNgKQAQsgAEEIaiECAkAgACgCCEEKRg0AIAIQxAgLIAAgASkDADcDACAAIAEoAig2AnggAEEYaiABQRhqKQMANwMAIABBEGogAUEQaikDADcDACACIAFBCGopAwA3AwACQCAAKAJoIAEoAiwiAkYNACAAIAI2AmggACAAKAJkIAIgACgCbGsiAms2AlwgACAAKAJgIAJqNgJYCwJAIAAoAiBBgICAgHhGDQAgASgCJCEDAkAgACgCKCIEIAEoAiAiAkkNACAAIAI2AiggBCACRg0AIAQgAmshBCAAKAIkIAJBBXRqIQIDQAJAIAIpAwAiB0IDg0IAUg0AIAenIgUgBSgCACIGQX9qNgIAIAZBAUcNACAFIAUoAhAQwRsLIAJBIGohAiAEQX9qIgQNAAsLIAAoAjQiAiADSQ0AIAAgAzYCNCACIANGDQAgAiADayEEIAAoAjAgA0EYbGohAgNAAkAgAikDACIHQgODQgBSDQAgB6ciBSAFKAIAIgZBf2o2AgAgBkEBRw0AIAUgBSgCEBDBGwsgAkEYaiECIARBf2oiBA0ACwsgACABKQNgNwPAASAAQcgBaiABQegAaigCADYCACAAQZgBahD8HiAAQbABaiABQdAAaikDADcDACAAQagBaiABQcgAaikDADcDACAAQaABaiABQcAAaikDADcDACAAIAEpAzg3A5gBIAAgASkDWDcDuAEL1AQDBn8CfgF8IwBBwABrIgIkACABKALAASEDIAIgAS0AyAEiBDoAHwJAAkACQAJAAkACQAJAAkACQAJAAkACQCAEQeQARg0AAkAgBEFAag4DAwQFAAsgBEHaAEYNASAEQeoARg0BIARB3n5qDgIFBgcLIAEQhw4gASgCvAEhBEECIQVCACEIDAgLIARB6gBGIQYgARCHDiABKAK8ASEEQQEhBUIAIQgMBwsgAkEgaiABEKwNIAIpAzAiCUKAgICAcIMhCCACLwAlIAItACdBEHRyIQEgAisDKCEKIAItACQhBiACKAIgIQQgCachB0EAIQUMBwsgAkEIaiABIAMgASgCxAEQqhcgAigCCCACKAIMEPUVIQkgARCGESEKIAEQhw4gCUKAgICAcIMhCCABKAK8ASIGQQh2IQEgCachB0EDIQUgAyEEDAYLIAJBEGogASADIAEoAsQBEKoXIAIoAhAgAigCFBD1FSEIIAEQyREhByABEIcOIAEoArwBIgZBCHYhASAIvyEKQQQhBUIAIQggAyEEDAULIAEQxxEhBCABEIcODAILIAEoAnAQgRshBAwBCyACQQE2AiQgAkHgu5sBNgIgIAJCATcCLCACQYoFrUIghiACQR9qrYQ3AzggAiACQThqNgIoIAJBIGpB6LubARCFGwALIABBBzYCACAAIAQ2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fGohAQNAIAcgAy0AAEYNAiADQQFqIQMgAUF/aiIBDQAMAwsLIAMgBU8NAQNAIAcgAy0AAEYNASADQQFqIgMgBUcNAAwCCwsgACADIAhrIARqIgM2AgRBASEGIAAgA0EBajYCCAsgACAGNgIAC9kDAQR/IwBBgAFrIgIkAAJAAkAgACgCDCIDKAIAQRpHDQAgAiABKAIAIAEoAgQgA0EIaiIEELUMIAIoAgBBMkYNASADEMkBIANBOGogAkE4aikDADcDACADQTBqIAJBMGopAwA3AwAgA0EoaiACQShqKQMANwMAIANBIGogAkEgaikDADcDACADQRhqIAJBGGopAwA3AwAgA0EQaiACQRBqKQMANwMAIAQgAkEIaikDADcDACADIAIpAwA3AwAMAQsgAyABEEYLAkAgACgCCCIDRQ0AIANBBHQhBCAAKAIEQQxqIQADQAJAAkAgACgCACIDKAIAQRpHDQAgAkHAAGogASgCACABKAIEIANBCGoiBRC1DCACKAJAQTJGDQEgAxDJASADQThqIAJBwABqQThqKQMANwMAIANBMGogAkHAAGpBMGopAwA3AwAgA0EoaiACQcAAakEoaikDADcDACADQSBqIAJBwABqQSBqKQMANwMAIANBGGogAkHAAGpBGGopAwA3AwAgA0EQaiACQcAAakEQaikDADcDACAFIAJBwABqQQhqKQMANwMAIAMgAikDQDcDAAwBCyADIAEQRgsgAEEQaiEAIARBcGoiBA0ACwsgAkGAAWokAAvdAwEFfyMAQYABayICJAACQAJAAkAgAS0AFEECRg0AIABBGjYCACAAIAEpAwA3AwggAEEYaiABQRBqKQMANwMAIABBEGogAUEIaikDADcDAAwBCyACQQhqIAEoAgAiA0EgaikDADcDACACQRBqIANBKGopAwA3AwAgAkEYakEIaiIEIANBCGopAwA3AwAgAiADKQMYNwMAIAIgAykDADcDGCADKAIUIQUgAygCECEGIAJBKGogAhDQBkEALQDA8Z0BGkHAABCFASIBRQ0BIAEgAikDKDcDACABQThqIAJBKGpBOGopAwA3AwAgAUEwaiACQShqQTBqKQMANwMAIAFBKGogAkEoakEoaikDADcDACABQSBqIAJBKGpBIGopAwA3AwAgAUEYaiACQShqQRhqKQMANwMAIAFBEGog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IAg6AHkLIAFBKGooAgAgABDnBAwCCyAAIAFBEGoQ8QogAUEIaiEJAkAgAUEwaigCACIBRQ0AIAAtACghByAAQQA6ACggAC0AeSEIIABBADoAeQJAIAEoAgBBGkcNACACIAEpAwggAUEYaigCABC6GCAGIAIpAwAgAigCCBDRCgsgASAAEHcgACAHOgAoIAAgCDoAeQsgACAJEPsQDAELIAFBBGooAgAgABDnBAsgBSADQThqIgNHDQALCyACQRBqJAAL2AMCA38CfiMAQcABayIDJAAgACgCMBCBEiEEIANBNGoiBSAAQTRqKAIANgIAIANBCGpBACkDmPucASIGNwMAIANBEGpBACkDkPucASIHNwMAIANBGGogBjcDACADIAA2AiAgAyAENgIkIANBAToAOSADQQE6ACggAyAAKQIsNwIsIAMgBzcDACADIAAoATo2ATogAyAALQA4OgA4IAMgAUEDEPkNIAMoAjAQgRIhACADQeAAakE0aiAFKAIANgIAIANB4ABqQQhqIAY3AwAgA0HgAGpBEGoiASAHNwMAIANB4ABqQRhqIAY3AwAgAyAANgKEASADQQE6AJkBIANBAToAiAEgAyADKQIsNwKMASADIAc3A2AgAyADKAE6NgGaASADIAMtADg6AJgBIAMgAzYCgAEgA0HgAGogAigCABDAAgJAIAMoAmQiAEUNACADKAJgIAMoAmwQkgwgACAAQQR0QRdqQXBxIgJqQQlqIgBFDQAgAygCYCACayAAQQgQnhILIAEQ1hUCQCADKAIEIgBFDQAgAygCACADKAIMEJIMIAAgAEEEdEEXakFwcSIBakEJaiIARQ0AIAMoAgAgAWsgAEEIEJ4SCyADQRBqENYVIANBwAFqJAAL0QMCCn8BfiMAQaABayICJAAgAiABKAIIIgNBCEEwQbSUmwEQ2BQgASgCACEEIAIoAgAhBSACKAIEIQYgAUEANgIAIAEoAgQhByABQQg2AgQgAUEANgIIIAJBADYCFCACIAY2AhAgAiAFNgIMIAIgByADQTBsIghqIgk2AiQgAiAENgIgIAIgBzYCGCACQShqQQRyIQogACkCDCEMIAAoAhQhC0EAIQBBACEEIAchAwJAA0AgCCAARg0BAkAgAygCACIFQRNGDQAgAiAFNgIoAkBBLEUNACAKIANBBGpBLPwKAAALIAIg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IANBEGpBDGogA0EgakEMaigAADYAACADIAMpACU3ABUgAyACOgAUIAMgATYCECADQRBqEPAEIABBCGogA0EQakEIaikCADcCACAAIAMpAhA3AgAMAwsgA0EgakGk54gBQaTriAEQnQsgACADQSBqEN0TDAILIANBIGpBsJiOAUG4mI4BEJ0LIAAgA0EgahDdEwwBCyADQSBqQaiYjgFBsJiOARCdCyAAIANBIGoQ3RMLIANBMGokAAu5AwIGfwF+IwBB4ABrIgQkACAEQQxqQSBBCEEQEMwNIAQoAhAhBQJAIAQoAgxBAUcNACAFIAQoAhRBjKWaARCqHgALIAQoAhQhBkEAEIESIQcgBEEMakEIaiIIQQA2AgAgBEEMakEwakIENwIAIARBDGpBOGoiCUEAOgAAIARBIGpBACkDmPucASIKNwIAIARBMGogCjcCACAEIAc2AlQgBEEANgJYIARCgICAgIABNwIMIARBADYCOCAEQoCAgICAATcCSCAEQQA7AVwgBEEAOgBeIARBADYCUCAEQQApA5D7nAEiCjcCGCAEIAo3AiggACACNgJIIAAgAToATCAAQQA7AE0gAEEAOgBPIABBMGpCBDcCACAAQThqIAkoAgA2AgAgACAEKQIMNwIAIABBCGogCCkCADcCACAAQRBqIARBDGpBEGopAgA3AgAgAEEYaiAEQQxqQRhqKQIANwIAIABBIGogBEEMakEgaikCADcCACAAQShqIARBDGpBKGopAgA3AgAgAEEBOwBRIAAgAzoAUCAAQQA2AkQgACAGNgJAIAAgBTYCPCAEQcgAahC9ECAEQeAAaiQAC7sDAQJ/AkACQAJAAkACQCABKAIADgUEAAECAwQLIAEoAgRBAUcNAyAAIAEoAggQjAEPCyAAIAEoAgQQjAEPCyAAIAEoAgQiAkHAAGoQhQoCQCACQYQBaigCACIDRQ0AIAJBgAFqKAIAIQEgA0HYAGwhAwNAAkACQAJAIAEoAgBBfGoOAgIAAQsgACABQQRqKAIAEIwBDAELIAEgABCyDQsgAUHYAGohASADQah/aiIDDQALCwJAIAIoAngiAUUNACABELgYIAEoAgAgAUEEaigCABDAICABQRRBBBCeEgsgAkEANgJ4AkAgAkGYAWooAgAiAUUNACABQShsIQMgAkGUAWooAgBBBGohAQNAAkAC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DDcCAAwBCyAEIAYoAiBBsJibARCqHgALIAZBwABqJAALhAMCBn8CfiMAQSBrIgMkAEEUIQQgACEJAkAgAELoB1QNAEEUIQQgACEKA0AgA0EMaiAEaiIFQX1qIAogCkKQzgCAIglCkM4Afn2nIgZB//8DcUHkAG4iB0EBdCIIQYHMmAFqLQAAOgAAIAVBfGogCEGAzJgBai0AADoAACAFQX9qIAYgB0HkAGxrQf//A3FBAXQiBkGBzJgBai0AADoAACAFQX5qIAZBgMyYAWotAAA6AAAgBEF8aiEEIApC/6ziBFYhBSAJIQogBQ0ACwsCQCAJQglYDQAgA0EMaiAEakF/aiAJpyIFIAVB//8DcUHkAG4iBUHkAGxrQf//A3FBAXQiBkGBzJgBai0AADoAACADQQxqIARBfmoiBGogBkGAzJgBai0AADoAACAFrSEJCwJAAkAgAFANACAJUA0BCyADQQxqIARBf2oiBGogCadBAXRBHnFBgcyYAWotAAA6AAALIAIgAUEBQQAgA0EMaiAEakEUIARrEMoFIQUgA0EgaiQAIAULqAMBBH8jAEEwayIDJAACQAJAIAItAAwiBEEBRw0AIAAgASkCADcCACAAQQhqIAFBCGopAgA3AgAMAQsCQAJAAkACQAJAAkACQAJAAkAgAS0ADCIFDgMBAAIBCyADIAIQ7hwgACADKQIANwIAIANBAiADLQAMazoADCAAQQhqIANBCGopAgA3AgAgASgCBCEEDAcLIARFDQEMAgsgBEUNAQsgASgCBCIEIAEoAgggAigCBCIGIAIoAggiAhDrGEH/AXEOAgIDAQsgA0EIaiABQQhqKAIANgIAIAMgASkCADcDACADQRRqIAMgAigCBCACKAIIENILIAAgBSADQRRqEJETDAQLIANBCGogAUEIaigCADYCACADIAEpAgA3AwAgA0EUaiAGIAIgAxCpByAAQQIgBWsgA0EUahCREwwDCyAAQQhqQQApAsjfggE3AgAgAEEAKQLA34IBNwIADAELIANBIGpBCGogAUEIaigCADYCACADIAEpAgA3AyAgA0EgaiAGIAIQ8h0gACAFIANBIGoQkRMMAQsgASgCACAEELEgCyADQTBqJAALsgMBAn8jAEHgAGsiAyQAAkACQAJAAkACQCABKAIALQAUIgRBAkYNACAEQQFxRQ0BCwJAAkACQAJAIAItABgOAwABAgALIANBOGpBpOeIAUGk64gBEJ0LIANBCGogA0E4ahDdEwwCCyADQThqQdTmiAFBpOeIARCdCyADQQhqIANBOGoQ3RMMAQsgA0E4akG8togBQdTmiAEQnQsgA0EIaiADQThqEN0TCyADQThqIAEoAgQgASgCCCACIANBCGoQqBcgA0EoakEIaiIBIANBOGpBDGopAgA3AwAgAyADKQI8NwMoAkAgAygCOCIEQYCAgIB4Rg0AIAAgAykCTDcCFCAAQSRqIANBOGpBJGooAgA2AgAgAEEcaiADQThqQRxqKQIANwIAIABBDGogASkDADcCACAAIAMpAyg3AgQgACAENgIADAQLIANBGGpBCGogASkDADcDACADIAMpAyg3AxggAi0AGQ0BDAILQYTBhQFBKEGswYUBEN0XAAsgA0EYahDwBAsgACADKQMYNwIEIABBgICAgHg2AgAgAEEMaiADQSBqKQMANwIACyADQeAAaiQAC4gDAQN/AkACQAJAIAEoAgQiAiABKAIQRg0AAkAgACgCFCICIAAoAgxHDQAgAEEMakHIoIUBEKEWCyAAIAJBAWoiAzYCFCAAKAIQIgQgAkEYbGoiACABKQIANwIAIABBCGogAUEIaikCADcCACAAQRBqIAFBEGopAgA3AgAgA0ECSQ0BAkAgA0EVSQ0AIAQgAxC9DA8LIAJBGGwhAEEAIQEDQCAEIAFBGGoiASAEahD4CCAAIAFHDQAMAgsLIAJBf2oiAiAAKAIIIgNPDQECQCAAKAIEIAJBDGxqIgAoAggiAiAAKAIARw0AIABB6KCFARChFgsgACgCBCACQRhsaiIDIAEpAgA3AgAgA0EQaiABQRBqKQIANwIAIANBCGogAUEIaikCADcCACAAIAJBAWoiATYCCCABQQJJDQAgACgCBCEAAkAgAUEVSQ0AIAAgARC9DA8LIAJBGGwhAkEAIQEDQCAAIAFBGGoiASAAahD4CCACIAFHDQALCw8LIAIgA0HYoIUBELMRAAuaAwEEfwJAAkACQAJAAkAgACgCAA4FBAABAgMECyAAKAIEQQFHDQMgACgCCCABEKgBDwsgACgCBCABEKgBDwsgASAAKAIEIgJBwABqEPsIAkAgAkGEAWooAgAiA0UNACACQYABaigCACIAIANB2ABsaiEEA0ACQAJA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AkACQAJAAkAgAygCAA4HBQABAgMFBAULIANBDGooAgAiAkUNBCADQQhqKAIAIQAgAkEobCECA0ACQCAAKAIAQQdGDQAgACABEPMICyAAQShqIQAgAkFYaiICDQAMBQsLIAMoAgQgARDzCAwDCyADQQxqKAIAIgBFDQIgA0EIaigCACEFIABBOGwhBkEAIQADQAJAAkACQAJAIAUgAGoiAigCAA4DAAECAAsCQCACQQhqKAIAQQNHDQAgAS0AAA0AIAJBDGooAgAgARCVAQsgAkEoaigCACABEPMIDAILIAJBMGooAgAiAkUNASABLQAADQEgAiABEJUBDAELIAJBBGooAgAgARDzCAsgBiAAQThqIgBHDQAMAwsLIAMoAgQgARDzCCABLQAADQEgAygCCCABEJUBDAELIAEtAAANACADKAIEIAEQlQELAkAgAygCMCIARQ0AIAEtAAANACAAIAEQlQELIANBOGoiAyAERw0ACwsLmAMBBX8CQCAAKAIIIgJFDQAgACgCBCIDIAJBOGxqIQQDQAJAAkACQAJAAkACQCADKAIADgcFAAECAwUEBQsgA0EMaigCACICRQ0EIANBCGooAgAhACACQShsIQIDQAJAIAAoAgBBB0YNACAAIAEQ8wgLIABBKGohACACQVhqIgINAAwFCwsgAygCBCABEPMIDAMLIANBDGooAgAiAEUNAiADQQhqKAIAIQUgAEE4bCEGQQAhAANAAkACQAJAAkAgBSAAaiICKAIADgMAAQIACwJAIAJBCGooAgBBA0cNACABLQAADQAgAkEMaigCACABEJUBCyACQShqKAIAIAEQ8wgMAgsgAkEwaigCACICRQ0BIAEtAAANASACIAEQlQEMAQsgAkEEaigCACABEPMICyAGIABBOGoiAEcNAAwDCwsgAygCBCABEPMIIAEtAAANASADKAIIIAEQlQEMAQsgAS0AAA0AIAMoAgQgARCVAQsCQCADKAIwIgBFDQAgAS0AAA0AIAAgARCVAQsgA0E4aiIDIARHDQALCwu7AwIBfwF+AkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIADgoAAQIDBAUGBwgJCgsgAEEIahDPEg8LIAAoAigiARDZASABQcAAQQgQnhIgAEEIahCDDw8LAkAgACgCCA0AIAApAxAiAkIDg0IAUg0IIAKnIgAgACgCACIBQX9qNgIAIAFBAUcNCCAAIAAoAhAQwRsPCyAAKAIMIgAQ2QEgAEHAAEEIEJ4SDwsgACgCBCIAENkBIABBwABBCBCeEg8LAkACQCAAKAIEIgAoAgBBA0YNACAAEO0NDAELIABBBGoQuhULIABBKEEIEJ4SDwsgACgCBCIBENkBIAFBwABBCBCeEiAAKAIIIgAQxgMgAEHgAEEIEJ4SDwsgACgCBCIBENkBIAFBwABBCBCeEiAAKAIIIgAQxgMgAEHgAEEIEJ4SDwsgACgCBCIAENkBIABBwABBCBCeEg8LIAAoAgQiARDZASABQcAAQQgQnhIgACgCCCIAEMYDIABB4ABBCBCeEg8LIAAoAgQiARDZASABQcAAQQgQnhIgACgCCCIAELgYIAAoAgAgAEEEaigCABDAICAAQRRBBBCeEgsLkAMBBH8jAEHgAGsiAiQAIAEoAsABIQMgAkE4aiABQQAQngEgAigCPCEEAkACQCACKAI4IgVBB0cNACAAQQc2AgAgACAENgIEDAELIAJBEGpBIGogAkE4akEgaikDADcDACACQRBqQRhqIAJBOGpBGGopAwA3AwAgAkEQakEQaiACQThqQRBqKQMANwMAIAIgAikDQDcDGCACIAQ2AhQgAiAFNgIQAkACQCABLQDIAUEXRw0AIAEQhw4gAkEIaiABQcAAEI4VIAIoAgwhBCACKAIIQQFxRQ0BIABBBzYCACAAIAQ2AgQgAkEQahDrEgwCC0EoRQ0BIAAgAkEQakEo/AoAAAwBCwJAIAEtAHlBwABxRQ0AIAEoArwBIQUgAkGqgYCAeDYCOCABIAMgBSACQThqEK8aCyABKAK8ASEFAkBBCEEoEOsfIgFFDQACQEEoRQ0AIAEgAkEQakEo/AoAAAsgACAFNgIQIAAgAzYCDCAAIAQ2AgggACABNgIEIABBBDYCAAwBCwALIAJB4ABqJAALjQMCBH8BfiMAQTBrIgMkACABKAIAIQQCQAJAAkACQCACKAJUDQAgASgCBCEFDAELIANBEGogBCABKAIEIgUQkxcgA0EgaiACIAMoAhBBABCVAiADLQAgQQRGDQAgAykDICIHQv8Bg0IEUg0BCyADQQhqIAQgBRCTFwJAAkACQCADKAIIIgZFDQAgA0EgaiACIAYQtBogAy0AIEEERg0AIAMpAyAiB0L/AYNCBFINAQsgA0EANgIgIANBGGogAiADQSBqQafEmwFBAxC4DCADLQAYQQRGDQEgAykDGCIHQv8Bg0IEUQ0BIAAgBzcCAAwDCyAAIAc3AgAMAgsgA0EgaiABIAIQ2iACQCADLQAgQQRGDQAgAykDICIHQv8Bg0IEUQ0AIAAgBzcCAAwCCyADIAQgBRCTFwJAAkAgAygCBCIBRQ0AIANBIGogAiABELQaIAMtACBBBEYNACADKQMgIgdC/wGDQgRSDQELIABBBDoAAAwCCyAAIAc3AgAMAQsgACAHNwIACyADQTBqJAALiAMCA38BfiMAQSBrIgMkACABKAIIIQQgA0EYaiACIAEoAgQiBUEAEJUCAkACQCADLQAYQQRGDQAgAykDGCIGQv8Bg0IEUQ0AIAAgBjcCAAwBCwJAAkACQCAFRQ0AIANBGGogAiAFELQaIAMtABhBBEYNACADKQMYIgZC/wGDQgRSDQELIANBADYCDCADQRhqIAIgA0EMakGwupsBQQEQuAwgAy0AGEEERg0BIAMpAxgiBkL/AYNCBFENASAAIAY3AgAMAgsgACAGNwIADAELIANBGGogASACENogAkAgAy0AGEEERg0AIAMpAxgiBkL/AYNCBFENACAAIAY3AgAMAQsCQAJAIARFDQAgA0EYaiACIARBf2oQtBogAy0AGEEERg0AIAMpAxgiBkL/AYNCBFINAQsgA0EYaiACIANBDGpBs/2cAUEBELgMAkAgAy0AGEEERg0AIAMpAxgiBkL/AYNCBFENACAAIAY3AgAMAgsgAEEEOgAADAELIAAgBjcCAAsgA0EgaiQAC6YDAgN/AX4CQAJAAkACQAJAAkACQCAAKAIADgYBAgMEBQYACyAAKAIEIgEQkAEgAUHAAEEIEJ4SDwsCQCAAKQMIIgRCA4NCAFINACAEpyIBIAEoAgAiAkF/ajYCACACQQFHDQAgASABKAIQEMEbCyAAKAIgIgFFDQQgASgCACICEKsCIAJB4ABBCBCeEiABQQxBBBCeEg8LIAAoAgghAwJAIAAoAgwiAkUNACADIQEDQAJAIAEoAgBBB0YNACABENgHCyABQShqIQEgAkF/aiICDQALCyAAKAIEIANBCEEoEK8RIAAoAhgiAUUNAyABKAIAIgIQqwIgAkHgAEEIEJ4SIAFBDEEEEJ4SDwsgACgCBCIBENgHIAFBKEEIEJ4SIAAoAhgiAUUNAiABKAIAIgIQqwIgAkHgAEEIEJ4SIAFBDEEEEJ4SDwsgAEEEahC4CiAAKAIEIAAoAghBCEE4EK8RIAAoAhgiAUUNASABKAIAIgIQqwIgAkHgAEEIEJ4SIAFBDEEEEJ4SDwsgAEEEahCbCCAAKAIIIgEQkAEgAUHAAEEIEJ4SCwvIAwECfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgAiAUE0IAFBvYGAgHhIG0H/AXEiAkFUag4JBAEBAQUGAQEHAAsCQCACQeB+ag4HEAEBARESEwALAkAgAkGTf2oOBAsBAQwACwJAIAJBhn9qDgINDgALAkAgAkHIfmoOAhQVAAsgAkEdRg0BIAJBJ0YNAiACQcQARg0HIAJB2ABGDQggAkHhAEYNCSACQYMBRg0OCw8LIAApAwgQxh0PCyAAKQMIEMYdDwsgACgCBCAAKAIIEJciDwsgACgCBCAAKAIIEJciDwsgACgCBCAAKAIIEJ4gDwsgASAAKAIEEJciIAAoAgwgACgCEBCXIg8LIAApAwgQxh0PCyAAKQMIEMYdDwsgACkDCBDGHQ8LIAApAwgQxh0PCyAAKQMIEMYdDwsgACkDCBDGHSAAKQMQEMYdDwsgACkDCBDGHQ8LIAApAwgQxh0PCyAAKQMIEMYdIAApAxAQxh0PCyAAKQMIEMYdDwsgACkDCBDGHQ8LIAApAwgQxh0PCyAAKQMIEMYdDwsgACgCBCIAEN8dIABBBEEEEJ4SC40DAQR/IAAoAgwhAgJAAkACQAJAIAFBgAJJDQAgACgCGCEDAkACQAJAIAIgAEcNACAAQRRBECAAKAIUIgIbaigCACIBDQFBACECDAILIAAoAggiASACNgIMIAIgATYCCAwBCyAAQRRqIABBEGogAhshBANAIAQhBSABIgJBFGogAkEQaiACKAIUIgEbIQQgAkEUQRAgARtqKAIAIgENAAsgBUEANgIACyADRQ0CAkACQCAAIAAoAhxBAnRB+OydAWoiASgCAEYNACADKAIQIABGDQEgAyACNgIUIAINAwwECyABIAI2AgAgAkUNBAwCCyADIAI2AhAgAg0BDAILAkAgAiAAKAIIIgRGDQAgBCACNgIMIAIgBDYCCA8LQQBBACgCkPCdAUF+IAFBA3Z3cTYCkPCdAQ8LIAIgAzYCGAJAIAAoAhAiAUUNACACIAE2AhAgASACNgIYCyAAKAIUIgFFDQAgAiABNgIUIAEgAjYCGA8LDwtBAEEAKAKU8J0BQX4gACgCHHdxNgKU8J0BC4ADAQV/AkACQAJAAkAgACgCAA0AAkAgACgCDCIBDQBBACECQQAhAwwDC0EBIQJBASEEAkAgACgCCCgCACIDQYABSQ0AQQIhBCADQYAQSQ0AQQNBBCADQYCABEkbIQQLQQAhAyABRQ0BIAAoAgggAUEDdGoiAEF4akUNAUEBIQICQAJAIABBfGooAgAiAEGAAU8NAEEBIQEMAQtBAiEBIABBgBBJDQBBA0EEIABBgIAESRshAQtBASEDDAILIAAoAgwiBEEARyEDQQEhAQJAIARFDQAgACgCCCAEQQF0aiIAQX5qRQ0AIABBf2osAABBf0ohBUEBIQFBASEEIAMhAgwDC0EBIQQgAyECDAELC0EBIQULQQAtAMDxnQEaAkBBNBCFASIADQAACyAAQgA3AhQgAEEBNgIQIAAgATYCDCAAIAM2AgggACAENgIEIAAgAjYCACAAQQA7ADEgACAFOgAwIABBHGpCADcCACAAQSRqQgA3AgAgAEEsakEANgIAIAALogMBBX8jAEHAAGsiBCQAIAQgAjYCBAJAAkAgAiABKAKAAyIFTw0AAkACQAJAAkACQCABKAL8AiACQQJ0aiIGKAIAIgcgASgChAMiBUkNACABKAL0AiEIDAELIAcgASgC9AIiCE8NBSABKALwAiAHQQJ0aigCACACRg0BCyAEIAU2AgggBSAISQ0BIARBAzYCECAEQezmhAE2AgwgBEIDNwIYIARBvgE2AjggBEEqNgIwIARBKjYCKCAEIAg2AjwgBCAEQSRqNgIUIAQgBEEEajYCNCAEIARBPGo2AiwgBCAEQQhqNgIkIARBDGpBhOeEARCFGwALIABBKjYCCCAAQbT3gwE2AgQgAEEvNgIADAELIAEoAvACIAVBAnRqIAI2AgAgASAFQQFqNgKEAyAGIAU2AgACQCABKALoAiIFIAEoAuACRw0AIAFB4AJqEI4WCyAAQTA2AgAgASAFQQFqNgLoAiABKALkAiAFQQR0aiIBIAM3AwggASACNgIACyAEQcAAaiQADwsgAiAFQaTnhAEQsxEACyAHIAhBtOeEARCzEQALwwMCA38DfgJAAkAgAUERSQ0AIAFBcGohA0EAIQRCxObBm+DF4owTIQZC05GMrYjR2p8kIQcDQCAGIQggACAEaiIFQQhqKQAAQtDj/MyihM6EpH+FIgZC/////w+DIAUpAAAgB4UiB0IgiH5CIIkgBkIgiCAHQv////8Pg36FIQYgCCEHIARBEGoiBCADSQ0ACyAAIANqIgQpAAggBoUhBiAEKQAAIAiFIQcMAQsCQCABQQdLDQACQAJAIAFBA0sNACABDQFC05GMrYjR2p8kIQdCxObBm+DF4owTIQYMAwsgADUAAELTkYytiNHanySFIQcgACABakF8ajUAAELE5sGb4MXijBOFIQYMAgsgACABakF/ajEAAEIIhiAAIAFBAXZqMQAAhELE5sGb4MXijBOFIQYgADEAAELTkYytiNHanySFIQcMAQsgACkAAELTkYytiNHanySFIQcgACABakF4aikAAELE5sGb4MXijBOFIQYLIAIgAigCACAHQv////8PgyAGQiCIfiABrYUgB0IgiCAGQv////8Pg35CIImFIganakHdy92eeWwgBkIgiKdqQcnB+P0AbEGj7rmcBGo2AgALlAMBAX8jAEEwayIEJAAgBCADOgAXIARBCGpBCEEIQTBBtL2bARDYFCAEQQA2AiAgBCAEKQMINwIYAkACQAJAAkACQAJAAkAgAkUNACABLQDIAUH/AXFBwABHDQAgASgCxAEiAyABKALAASICa0EMRw0AIAQgASACIAMQqhcgBCgCACIDIAQoAgQiAkHEvZsBQQwQmRwNAiADIAJB0L2bAUEMEJkcIQMgBCAEQS9qNgIoIAQgBEEXajYCJCADRQ0BDAMLIAQgBEEvajYCKCAEIARBF2o2AiQLIARBJGogASAEQRhqEIsFIgNFDQIMAwsgBCAEQS9qNgIoIAQgBEEXajYCJAsgASABKAJ4IgJBCHI2AnggBEEkaiABIARBGGoQiwUhAyABIAI2AnggAw0BCwJAIAEtAMgBQaMBRg0AIAQtABdB/wFxQaQBRg0AIAEQhw4LIAAgBCkCGDcCACAAQQhqIARBGGpBCGooAgA2AgAMAQsgAEGAgICAeDYCACAAIAM2AgQgBEEYahDJHQsgBEEwaiQAC6YDAQN/IwBBwABrIgMkACADQSRqIAJBCGooAgA2AgAg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LQAhIgQgAi0AICIATQ0AIAAgAkEYampBBGohBSAEIABrQf8BcSEDQQAhAANAIABBCkYNAyACQQhqIABqIAUgAGotAAAiBEFgaiAEIARBn39qQf8BcUEGSRsgBCAAQQFLGzoAACADIABBAWoiAEcNAAsLIAJBxABqIAJBCGogAxDFBCACKAJEQQFGDQIgAiACKQJINwI8IAJBDDYCOCACQQE2AhwgAkGY75sBNgIYIAJCATcCJCACIAJBPGo2AjQgAiACQTRqNgIgIAEoAgAgASgCBCACQRhqEM4FIQALIAJB0ABqJAAgAA8LQQpBCkGAnoUBELMRAAsgAiACKQJINwMYQdSkmwFBKyACQRhqQcj8hAFB8J2FARDoDwAL/QICBn8EfiMAQTBrIgIkAAJAAkACQCABLQAUIgNBAkYNACABKAIQIQQgASgCDCEFIAEoAgghBgJAIAEpAwAiCEIDg0IAUg0AIAinIgEgASgCACIBQQFqNgIAIAFBf0wNAwsgACAENgIQIAAgBTYCDCAAIAY2AgggACAINwMADAELQQAtAMDxnQEaQTAQhQEiA0UNASABKAIAIgEoAhQhBCABKAIQIQUgAkEYaiABQRhqEPAHIAEoAgwhBiABKAIIIQcCQCABKQMAIghCA4NCAFINACAIpyIBIAEoAgAiAUEBajYCACABQX9MDQILIAJBEGogAkEYakEQaikDACIJNwMAIAJBCGogAkEYakEIaikDACIKNwMAIAIgAikDGCILNwMAIAMgBDYCFCADIAU2AhAgAyAGNgIMIAMgBzYCCCADIAg3AwAgAyALNwMYIANBIGogCjcDACADQShqIAk3AwAgACADNgIAQQIhAwsgACADOgAUIAJBMGokAA8LAAuWAwEGfyMAQTBrIgIkAAJAAkACQAJAAkAgACgCBCIDDgMEAQIAC0EBIQQgASgCACIFQcyOmAFBByABKAIEIgYoAgwiBxEMAA0CIANBA3QhASAAKAIAIQBBACEDA0ACQCABDQBBACEEDAQLIAIgADYCFAJAIANFDQAgBUHTjpgBQQIgBxEMAA0ECyACQQI2AhwgAkGcjpgBNgIYIAJCATcCJCACQQs2AgggAiACQQRqNgIgIAIgAkEUajYCBCAFIAYgAkEYahC3Hg0DIABBCGohACADQX9qIQMgAUF4aiEBDAALCyACQQI2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AkACQAJAAkAgAL0iA0KAgICAgICACFMNACADQv/////////3/wBWDQNBgXghAQJAIANCIIgiBEKAgMD/A1ENACAEpyECDAILQYCAwP8DIQIgA6cNAUQAAAAAAAAAAA8LAkAgAEQAAAAAAAAAAGINAEQAAAAAAADwvyAAIACiow8LIANCAFMNASAARAAAAAAAAFBDor0iA0IgiKchAkHLdyEBCyACQeK+JWoiAkH//z9xQZ7Bmv8Daq1CIIYgA0L/////D4OEv0QAAAAAAADwv6AiACAAIABEAAAAAAAA4D+ioiIFob1CgICAgHCDvyIGRAAAIGVHFfc/oiIHIAJBFHYgAWq3IgigIgkgByAIIAmhoCAAIAahIAWhIAAgAEQAAAAAAAAAQKCjIgAgBSAAIACiIgcgB6IiACAAIABEn8Z40Amawz+iRK94jh3Fccw/oKJEBPqXmZmZ2T+goiAHIAAgACAARERSPt8S8cI/okTeA8uWZEbHP6CiRFmTIpQkSdI/oKJEk1VVVVVV5T+goqCgoqAiAEQAACBlRxX3P6IgACAGoEQAou8u/AXnPaKgoKAPCyAAIAChRAAAAAAAAAAAoyEACyAAC4sDAQV/IwBBIGsiAyQAAkACQCACLQAMIgRBAUcNACAAIAEpAgA3AgAgAEEIaiABQQhqKQIANwIAIAIoAgAgAigCBBCxIAwBCwJAAkACQAJAAkACQCABLQAMIgUOAwEAAgELIAAgAikCADcCACAAQQhqIAJBCGopAgA3AgAgASgCBCEGDAQLIARFDQEMAgsgBEUNAQsgA0EQaiABIAIQkw8gACAFIANBEGoQkRMMAgsCQAJAAkAgASgCBCIGIAEoAgggAigCBCIHIAIoAggQ6xhB/wFxDgIBAgALIANBEGpBCGogAkEIaigCADYCACADIAIpAgA3AxAgA0EEaiADQRBqIAEQ3BkgACAEIANBBGoQkRMMAwsgAEEIakEAKQLI34IBNwIAIABBACkCwN+CATcCACACKAIAIAcQsSAMAQsgA0EQakEIaiABQQhqKAIANgIAIAMgASkCADcDECADQQRqIANBEGogAhDcGSAAIAUgA0EEahCREwwBCyABKAIAIAYQsSALIANBIGokAAv2AgEDfyMAQRBrIgYkAAJAAkACQAJAAkACQCABKAIkIgctAOICDQAgBkEIaiAB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KAIEQdgAaiEEDAELIAFBEGohBAsgACAEKQIANwIMIABBFGogBEEIaigCADYCAAsCQAJAAkACQAJAAkACQAJAAkAgAkECIAJBCEkbDggAAQIDBAUGBwALIAFBBGohAgwHCyABQQhqIQIMBgsgAUHAAGohAgwFCyABQQRqIQIMBAsgAUEgaiECDAMLIAFBBGohAgwCCyABKAIEQdgAaiECDAELIAFBEGohAgsgACACKQIMNwIYIABBIGogAkEUaigCADYCAAJAIAMgACgCAEcNACAAEJsWCwJAQdgARQ0AIAAoAgQgA0HYAGxqIAFB2AD8CgAACyAAIANBAWo2AggL8AICCX8BfiMAQcAAayICJAAgASgCBCEDIAIgASgCCCIEQQRBEBDMDSACKAIEIQUCQAJAIAIoAgBBAUYNACACKAIIIQYCQCAFRQ0AIARBBHQhByAGIQggBSEJA0AgB0UNAUEALQDA8Z0BGiADKQIEIQsgAygCACEKQcAAEIUBIgFFDQMgAiADKAIMEEQgAUE4aiACQThqKQMANwMAIAFBMGogAkEwaikDADcDACABQShqIAJBKGopAwA3AwAgAUEgaiACQSBqKQMANwMAIAFBGGogAkEYaikDADcDACABQRBqIAJBEGopAwA3AwAgAUEIaiACQQhqKQMANwMAIAEgAikDADcDACAIQQxqIAE2AgAgCEEEaiALNwIAIAggCjYCACAIQRBqIQggB0FwaiEHIANBEGohAyAJQX9qIgkNAAsLIAAgBDYCCCAAIAY2AgQgACAFNgIAIAJBwABqJAAPCyAFIAIoAghBiJ+aARCqHgsAC+4CAQp/IwBBwABrIgIkACABKAIEIQMgAiABKAIIIgRBBEEMEMwNIAIoAgQhBQJAAkAgAigCAEEBRg0AIAIoAgghBgJAIAVFDQAgBEEMbCEHIAYhCCAFIQkDQCAHRQ0BQQAtAMDxnQEaIAMoAgghCiADKAIEIQtBwAAQhQEiAUUNAyACIAMoAgAQRCABQThqIAJBOGopAwA3AwAgAUEwaiACQTBqKQMANwMAIAFBKGogAkEoaikDADcDACABQSBqIAJBIGopAwA3AwAgAUEYaiACQRhqKQMANwMAIAFBEGogAkEQaikDADcDACABQQhqIAJBCGopAwA3AwAgASACKQMANwMAIAhBCGogCjYCACAIQQRq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IAJBIGogARCyBgJAIAIoAiBBgICAgHhGDQAgAkEQakEIaiACQSBqQQhqKAIANgIAIAIgAikCIDcDECACQQhqIAJBEGpB9MWFARDyEAJAAkAgAigCDCIDRQ0AIAIoAggiBCADEMQOIQUgACADNgIIIAAgBDYCBEEBIQMMAQtBACEDEN8SIQULIAAgBTYCGCAAIAM2AgAMAgtBgICAgHggAigCJBDBHiAAIAEQ2wc2AhggAEECNgIAIABBFGogAUEQaigCADYCACAAQQxqIAFBCGopAgA3AgAgACABKQIANwIEDAILIAJBADYCPCACQoCAgIAQNwI0IAJBJGogAkE0ahDcEyACQQE2AiAgACACQSBqENsHNgIYIABBAjYCACAAQRRqIAJBMGooAgA2AgAgAEEMaiACQShqKQIANwIAIAAgAikCIDcCBAsgARDCGgsgAkHAAGokAAvtAgEEfyMAQcAAayICJAACQAJAAkAgASgCDEUNACACQSBqIAEQsgYCQCACKAIgQYCAgIB4Rg0AIAJBEGpBCGogAkEgakEIaigCADYCACACIAIpAiA3AxAgAkEIaiACQRBqQfTFhQEQ8hACQAJAIAIoAgwiA0UNACACKAIIIgQgAxDEDiEFIAAgAzYCCCAAIAQ2AgRBASEDDAELQQAhAxDfEiEFCyAAIAU2AhggACADNgIADAILIAEQ2wchAyAAQQI2AgAgACADNgIYIAAgASkCADcCBCAAQQxqIAFBCGopAgA3AgAgAEEUaiABQRBqKAIANgIADAILIAJBADYCPCACQoCAgIAQNwI0IAJBJGogAkE0ahDcEyACQQE2AiAgAkEgahDbByEDIABBAjYCACAAIAM2AhggACACKQIgNwIEIABBDGogAkEoaikCADcCACAAQRRqIAJBMGooAgA2AgALIAEQwhoLIAJBwABqJAAL6QIBBn8jAEEQayIBJAACQAJAAkACQCAAKAIAIgJFDQBBACEDA0ACQCAAKAIIIgQgACgCBCIFTw0AIAIgBGotAABBxQBHDQAgACAEQQFqNgIIDAILAkACQAJAAkAgA0UNACAAKAIQIgZFDQAgBkHTjpgBQQIQ7QUNByAAKAIAIgJFDQEgACgCCCEEIAAoAgQhBQsgBCAFTw0AAkAgAiAEai0AAEG1f2oOAgIAAQsgACAEQQFqNgIIIAEgABDp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QAJAAkAgASgCAA4FBAABAgMECyABKAIEQQFHDQMgASgCCCAAEKgBDAMLIAEoAgQgABCoAQwCCyAAIAEoAgQiA0HAAGoQ+wgCQCADQYQBaigCACIERQ0AIANBgAFqKAIAIQEgBEHYAGwhBANAAkACQAJAIAEoAgBBfGoOAgIAAQsgAUEEaigCACAAEKgBDAELIAEgABDTCQsgAUHYAGohASAEQah/aiIEDQALCwJAIANBmAFqKAIAIgRFDQAgA0GUAWooAgAhASAEQShsIQQDQCABIAAQpgcgAUEoaiEBIARBWGoiBA0ACwsgAy0APEEGRg0BIAAgA0EQahD7CAwBCyABKAIMIQQgASgCCCEBIAIgADYCDCAERQ0AIARBKGwhAANAIAJBDGogARDSCCABQShqIQEgAEFYaiIADQALCyACQRBqJAAL1gICBn8BfiMAQSBrIgIkAAJAAkACQCABLQAUIgNBAkYNACABKAIQIQQgASgCDCEFIAEoAgghBgJAIAEpAwAiCEIDg0IAUg0AIAinIgEgASgCACIBQQFqNgIAIAFBf0wNAwsgACAENgIQIAAgBTYCDCAAIAY2AgggACAINwMADAELQQAtAMDxnQEaQTAQhQEiA0UNASABKAIAIgEoAhQhBCABKAIQIQUgAkEIaiABQRhqENMIIAEoAgwhBiABKAIIIQcCQCABKQMAIghCA4NCAFINACAIpyIBIAEoAgAiAUEBajYCACABQX9MDQILIAMgAikDCDcDGCADQShqIAJBGGopAwA3AwAgA0EgaiACQRBqKQMANwMAIAMgBDYCFCADIAU2AhAgAyAGNgIMIAMgBzYCCCADIAg3AwAgACADNgIAQQIhAwsgACADOgAUIAJBIGokAA8LAAvCAgICfwJ+AkAgAUUNAANAAkACQAJAAkAgACkDACIEQn18IgWnQQFqQQAgBUICVBsOAgECAAsgAEEQaikDACIFQgODQgBSDQIgBaciAiACKAIAIgNBf2o2AgAgA0EBRw0CIAIgAigCEBDBGwwCCwJAIABBIGopAwAiBUIDg0IAUg0AIAWnIgIgAigCACIDQX9qNgIAIANBAUcNACACIAIoAhAQwRsLIARCAlENASAAQQhqIQICQCAEQgBSDQAgAikDACIFQgODQgBSDQIgBaciAiACKAIAIgNBf2o2AgAgA0EBRw0C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/AoAAAsgAkEBdCECIANBBEkhASADQQF2IQMgAUUNAAsgBCACNgIQCyAFIAJGDQICQCAFIAJrIgNFDQAgBCgCDCIBIAJqIAEgA/wKAAALIAQgBTYCEAwCCyAGIAQoAhxBhN6CARCqHgALQYTfggFBEUGU3oIBEPISAAsgACAEKQIINwIAIABBCGogBEEIakEIaigCADYCAAsgBEEgaiQAC90CAQR/IAAoAgAiAUHAAGoQkxEgAUGAAWooAgAhAAJAIAEoAoQBIgJFDQADQAJAAkAgACgCAEEFRg0AIAAQ8ggMAQsgAEEEaigCACIDEJABIANBwABBCBCeEgsgAEHYAGohACACQX9qIgINAAsgAUGAAWooAgAhAAsgASgCfCAAQQhB2AAQrxECQCABKAJ4IgRFDQAgBEEEaigCACEAAkAgBCgCCCICRQ0AA0AgACgCACIDEKsCIANB4ABBCBCeEiAAQQRqIQAgAkF/aiICDQALIARBBGooAgAhAAsgBCgCACAAQQRBBBCvESAEQRRBBBCeEgsgAUGUAWooAgAhAAJAIAEoApgBIgJFDQADQCAAENQLIABBKGohACACQX9qIgINAAsgAUGUAWooAgAhAAsgASgCkAEgAEEIQSgQrxECQCABLQA8QQZGDQAgAUEQahCTEQsgAUGgAUEIEJ4SC9cCAQR/IAAoAgAiACgCICABELYcIABBOGogARD0FyAAKAIsQThsIQIgACgCKCEDQQAhAAJAA0AgAiAARg0BAkACQAJAAkACQAJAAkACQCADIABqIgQoAgBBfGoiBUEEIAVBB0kbDgcAAQIDBAUGAAsgBEEEaiABEIUZIARBGGooAgAgARC3HCAEQRxqKAIAIAEQthwMBgsgBEEEaiABEIUZIARBGGooAgAgARC3HCAEQRxqKAIAIAEQthwMBQsgBEEQaiABEMshIARBDGooAgAgARC3HAwECyAEQQRqIAEQyyEgBEEQaigCACABELccDAMLIARBMGogARDLISAEIAEQ0RcMAgsgBEEQaiABEMshIARBBGogARCFGSAEQRxqKAIAIAEQtxwgBEEgaigCACABELYcDAELIAEgBEEUaigCACAEQRhqKAIAEL0YCyAAQThqIQAMAAsLC/QCAQR/IwBB0ABrIgMkACABKALAASEEAkACQAJAIAEtAMgBIgVBAkcNACABEIcOIAEgASgCeCIFQf////99cTYCeCADQTBqIAEgAkEDEN4HIAEgBTYCeCADKAI0IQIgAygCMCIFQYCAgIB4Rw0BIABBgICAgHg2AgAgACACNgIEDAILIAEoAsQBIQIgA0EMaiAFEN4bIANBATYCNCADQZjvmwE2AjAgA0IBNwI8IANBigWtQiCGQeyhmwGthDcDSCADIANByABqNgI4IANBGGogA0EwahCNFSADQSxqIANBFGooAgA2AgAgAyADKQIMNwIkIAQgAiADQRhqEIUVIQICQCABLQDIAUGiAUcNACABEMcRIQUgARCHDiABIAUQ5RELIABBgICAgHg2AgAgACACNgIEDAELIAMoAjghBiAAQQA2AhQgACAENgIMIAAgBjYCCCAAIAI2AgQgACAFNgIAIAAgASgCvAE2AhALIANB0ABqJAAL5gICA38BfiMAQTBrIgIkAAJAAkACQAJAIAEtAMgBIgNBtX9qIgRBH0sNAEEBIAR0QYGAgpB4cQ0BCwJAIANBwABHDQAgAiABEKwNQgEhBQwCCyADQbR/akH/AXFB1QBJDQAgAkEYakEEciADEN4bIAJBFDYCLCACQeC/mwE2AiggAkGwgICAeDYCGCABKALAASABKALEASACQRhqEIUVIQQCQCABLQDIAUGiAUcNACABEMcRIQMgARCHDiABIAMQ5RELIABCAjcDACAAIAQ2AggMAgsgAkEYaiABEMMLIAIoAiAhAQJAIAIpAxgiBVBFDQAgAEICNwMAIAAgATYCCAwCCyACQQA2AhAgAiACKAIkNgIMIAIgATYCCCACQQA6ABQgAiAFNwMAQgAhBQsgACAFNwMAIAAgAikDADcDCCAAQRBqIAJBCGopAwA3AwAgAEEYaiACQRBqKQMANwMACyACQTBqJAALzQICA38BfiMAQSBrIgMkACABKAIMIQQgA0EQaiACIAEoAggiBUEAEJUCAkACQCADLQAQQQRGDQAgAykDECIGQv8Bg0IEUQ0AIAAgBjcCAAwBCwJAAkACQCAFRQ0AIANBEGogAiAFELQaIAMtABBBBEYNACADKQMQIgZC/wGDQgRSDQELIANBADYCECADQQhqIAIgA0EQakGP4JsBQQEQuAwgAy0ACEEERg0BIAMpAwgiBkL/AYNCBFENASAAIAY3AgAMAgsgACAGNwIADAELIANBEGogAiAFIAFBABDKBgJAIAMtABBBBEYNACADKQMQIgZC/wGDQgRRDQAgACAGNwIADAELAkACQCAERQ0AIANBEGogAiAEELQaIAMtABBBBEYNACADKQMQIgZC/wGDQgRSDQELIABBBDoAAAwBCyAAIAY3AgALIANBIGokAAvPAgICfwF+IwBBIGsiAyQAAkACQAJAAkAgASgCBCIERQ0AIANBGGogAiAEELQaIAMtABhBBEYNACADKQMYIgVC/wGDQgRSDQELIANBADYCDCADQRhqIAIgA0EMakGuxJsBQQEQuAwgAy0AGEEERg0BIAMpAxgiBUL/AYNCBFENASAAIAU3AgAMAgsgACAFNwIADAELIANBGGogASACENogAkAgAy0AGEEERg0AIAMpAxgiBUL/AYNCBFENACAAIAU3AgAMAQsgA0EYaiACIANBDGpBr8SbAUEBELgMAkAgAy0AGEEERg0AIAMpAxgiBUL/AYNCBFENACAAIAU3AgAMAQsCQAJAIAEoAggiAUUNACADQRhqIAIgARC0GiADLQAYQQRGDQAgAykDGCIFQv8Bg0IEUg0BCyAAQQQ6AAAMAQsgACAFNwIACyADQSBqJAALwQIBCH8jAEEQayIBJAAgACgCBCECAkAgACgCCCIDRQ0AIAIgA0ECdGpBfGoiBEUNACAEKAIADQAgA0ECdCEEIAJBfGohBSADQf////8DcSEGAkADQCAGIQcCQCAEDQBBACEHDAILIAdBf2ohBiAFIARqIQggBEF8aiEEIAgoAgBFDQALIAcgA0sNAQsgACAHNgIIIAchAwsCQAJAIAMgACgCACIEQQJ2Tw0AAkACQCAEDQBBACEEIAFBDGohBwwBCyABQQQ2AgwgBEECdCEEIAFBCGohBwsgByAENgIAIAEoAgwiBEUNACABKAIIIQcCQAJAIAMNACACIAQgBxCjHkEEIQcMAQsgAiAHIAQgA0ECdCIGENoDIgdFDQILIAAgAzYCACAAIAc2AgQLIAFBEGokAA8LIAQgBkHAkoMBEKoeAAv6AgEDfyAAKAI4IQECQCAAKAI8IgJFDQAgASEDA0AgAxCRGyADQRBqIQMgAkF/aiICDQALCyAAKAI0IAFBBEEQELURIAAoAkAgACgCREEEQQQQtREgACgCUCIDIAAoAlQQpBcgACgCTCADQQRBDBC1ESAAKAJoIgMgACgCbBDuGSAAKAJkIANBBEEUELURIAAoAnwhAQJAIAAoAoABIgJFDQAgASEDA0AgAygCACADQQRqKAIAQQRBCBC1ESADQRBqIQMgAkF/aiICDQALCyAAKAJ4IAFBBEEQELURIAAoAowBIgMgACgCkAEQ7xkgACgCiAEgA0EEQQwQtREgACgCmAEiAyAAKAKcARDvGSAAKAKUASADQQRBDBC1ESAAKAK8ASAAKALAAUEEQQgQtREgACgCzAEgACgC0AFBAUECELURIAAoAqABIAAoAqQBQQRBCBC1ESAAKAKsASAAKAKwAUEEQRAQtREgACgC3AEgACgC4AFBBEEQELURC9UCAQJ/AkACQAJAAkACQAJAAkAgAA4DAAECAAsgAS0AGA0CDAMLIAItACUNAyABKAIIIQAgASgCBCEBIAItACQhAyACQQA6ACQCQCAARQ0AIABBOGwhAANAAkACQCABKAIADQAgAiABQQhqELQEDAELIAEgAhDwCQsgAUE4aiEBIABBSGoiAA0ACwsgAiADOgAkDwsCQCABKAIADQAgAiABQQhqELQEDwsgASACEPAJDAILIAIoAiAtADRFDQELIAEtABkhAAJAIAItACUNACAAQf8BcUVBAXQhAwwCC0ECIQMgAEF/akH/AXFBAk8NAQsPCyACLQAkIQQgAiADOgAkAkAgASgCCCIARQ0AIAEoAgQhASAAQThsIQADQAJAAkAgASgCAA0AIAIgAUEIahC0BAwBCyABIAIQ8AkLIAFBOGohASAAQUhqIgANAAsLIAIgBDoAJAu4AgEFfyMAQSBrIQICQCABKAIEIgMgAUFoaigCAEkgASgCACIEIAFBZGooAgAiBUkgBCAFRhtBAUcNACACQQhqQRBqIAFBGGooAgA2AgAgAkEQaiABQRBqKQIANwMAIAIgASkCCDcDCCABQUhqIQUCQAJAA0AgBSIBQdAAaiABQTRqKAIANgIAIAFByABqIAFBLGopAgA3AgAgAUHAAGogAUEkaikCADcCACABQThqIAFBHGoiBSkCADcCACAFIABGDQEgAUFkaiEFIAMgAUEEaigCAEkgBCABKAIAIgZJIAQgBkYbDQALIAFBHGohBQwBCyABQRxqIQULIAFBHGogBDYCACAFIAM2AgQgBSACKQMINwIIIAVBEGogAkEQaikDADcC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IAEQlQEMAQsgAkEEaigCACABEPMICyAEIABBOGoiAEcNAAwDCwsgACgCBCABEPMIIAEtAAANASAAKAIIIAEQlQEPCyABLQAADQAgACgCBCABEJUBCwu+AgEDfwJAAkACQAJAAkADQAJAIAAoAgAiAkECRg0AAkACQCACDgcIAQAEBQgGCAsACyAAKAIMIgJFDQYgACgCCCEAIAJBKGwhAgNAAkAgACgCAEEHRg0AIAAgARCsCQsgAEEoaiEAIAJBWGoiAg0ADAcLCyAAKAIEIQAMAAsLIAAoAgwiAkUNAyAAKAIIIQMgAkE4bCEEQQAhAANAAkACQAJAAkAgAyAAaiICKAIADgMAAQIACwJAIAJBCGooAgBBA0cNACACQQxqKAIAIAEQqAELIAJBKGooAgAgARCsCQwCCyACQTBqKAIAIgJFDQEgAiABEKgBDAELIAJBBGooAgAgARCsCQsgBCAAQThqIgBHDQAMBAsLIAAoAgQgARCsCSAAQQhqIQAMAQsgAEEEaiEACyAAKAIAIAEQqAELC74CAQN/AkACQAJAAkACQANAAkAgACgCACICQQJGDQACQAJAIAIOBwgBAAQFCAYICwALIAAoAgwiAkUNBiAAKAIIIQAgAkEobCECA0ACQCAAKAIAQQdGDQAgACABEK0JCyAAQShqIQAgAkFYaiICDQAMBwsLIAAoAgQhAAwACwsgACgCDCICRQ0DIAAoAgghAyACQThsIQRBACEAA0ACQAJAAkACQCADIABqIgIoAgAOAwABAgALAkAgAkEIaigCAEEDRw0AIAEgAkEMaigCABCnAQsgAkEoaigCACABEIwLDAILIAJBMGooAgAiAkUNASABIAIQpwEMAQsgAkEEaigCACABEIwLCyAEIABBOGoiAEcNAAwECwsgACgCBCABEK0JIABBCGohAAwBCyAAQQRqIQALIAEgACgCABCnAQsLvgIBA38CQAJAAkACQAJAA0ACQCAAKAIAIgJBAkYNAAJAAkAgAg4HCAEABAUIBggLAAsgACgCDCICRQ0GIAAoAgghACACQShsIQIDQAJAIAAoAgBBB0YNACAAIAEQrgkLIABBKGohACACQVhqIgINAAwHCwsgACgCBCEADAALCyAAKAIMIgJFDQMgACgCCCEDIAJBOGwhBEEAIQADQAJAAkACQAJAIAMgAGoiAigC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IAY3AwAgAhCaGCIHNwMQIAIgAkEQahC2CyEFIAcQxh0CQCAFRQ0AIAJB4ICAgHg2AhAgASADIAQgAkEQahCvGgsgACAENgIUIAAgAzYCECAAIAY3AwggAEEFNgIADAELIAJBEGogARCLAwJAIAIoAhBBBUYNACAAIAIpAxA3AwAgAEEYaiACQRBqQRhqKQMANwMAIABBEGogAkEQakEQaikDADcDACAAQQhqIAJBEGpBCGopAwA3AwAMAQsgACACKAIUNgIEIABBBjYCAAsgAkEwaiQAC6ACAQN/IwBBgAFrIgIkACAAKAIAIQACQAJAAkAgASgCCCIDQYCAgBBxDQAgA0GAgIAgcQ0BIAAoAgBBASABEMcHIQAMAgsgACgCACEAQYEBIQMDQCACIANqQX5qIABBD3EiBEEwciAEQdcAaiAEQQpJGzoAACADQX9qIQMgAEEPSyEEIABBBHYhACAEDQALIAFBAUGIypsBQQIgAiADakF/akGBASADaxDKBSEADAELIAAoAgAhAEGBASEDA0AgAiADakF+aiAAQQ9xIgRBMHIgBEE3aiAEQQpJGzoAACADQX9qIQMgAEEPSyEEIABBBHYhACAEDQALIAFBAUGIypsBQQIgAiADakF/akGBASADaxDKBSEACyACQYABaiQAIAALsgICAn8BfiMAQcAAayICJAACQAJAAkACQAJAAkAgASgCAA4EAAECAwALAkAgASkDCCIEQgODQgBSDQAgBKciASABKAIAIgFBAWo2AgAgAUF/TA0FCyAAQQA2AgAgACAENwMIDAMLIAAgASkDADcDACAAQQhqIAFBCGopAwA3AwAMAgsgASgCBCEDELUdIQEgAiADEEQgAUE4aiACQThqKQMANwMAIAFBMGogAkEwaikDADcDACABQShqIAJBKGopAwA3AwAgAUEgaiACQSBqKQMANwMAIAFBGGogAkEYaikDADcDACABQRBqIAJBEGopAwA3AwAgAUEIaiACQQhqKQMANwMAIAEgAikDADcDACAAQQI2AgAgACABNgIEDAELIABBAzYCAAsgAkHAAGokAA8LAAu/AgEDfyMAQTBrIgMkAAJAIAEgACgCeEEIcUEDdhCuDw0AIANBEGogARC/AyADKAIUIQQgAygCECEFIANBq4GAgHg2AhggACAFIAQgA0EYahCvGgsCQCAA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BCIBEKoBIAFBwABBCBCeEgwFCyAAQQhqEK8SDAQLIABBCGoiASgCACAAQQxqKAIAEKQaIAAoAgQgASgCABDBICAAKAIYIgFFDQMgASgCACICEMMDIAJB4ABBCBCeEiABQQxBBBCeEgwDCyAAKAIEIgEQ4QogAUEoQQgQnhIgACgCGCIBRQ0CIAEoAgAiAhDDAyACQeAAQQgQnhIgAUEMQQQQnhIMAgsgAEEEahC4CiAAKAIEIABBCGooAgAQviAgACgCGCIBRQ0BIAEoAgAiAhDDAyACQeAAQQgQnhIgAUEMQQQQnhIMAQsgAEEEahDuCSAAKAIIIgEQqgEgAUHAAEEIEJ4SCyAAQShBCBCeEguQAgEFfyAAKAIEIQEgACgCACECIABChICAgMAANwIAIAAoAgghAwJAAkACQCABIAJHDQAgACgCECICRQ0BIAAoAgwiBCADKAIIIgFGDQIgAkEEdCIARQ0CIAMoAgQiBSABQQR0aiAFIARBBHRqIAD8CgAADAILIAEgAmtBBHYhAQNAAkAgAigCAEECRg0AIAJBDGooAgAiBBCqASAEQcAAQQgQnhILIAJBEGohAiABQX9qIgENAAsgACgCECICRQ0AAkAgACgCDCIEIAMoAggiAUYNACACQQR0IgBFDQAgAygCBCIFIAFBBHRqIAUgBEEEdGogAPwKAAALIAMgASACajYCCAsPCyADIAEgAmo2AggLswIBAn8gACgCACECAkADQAJAAkACQCACDgcEAAIBAgQEBAsgACgCDCICRQ0DIAAoAgghACACQShsIQIDQAJAAkACQCAAKAIADggAAQEBAQEBAgELIAEgAEEIahC0BAwBCyAAIAEQ8AkLIABBKGohACACQVhqIgINAAwECwsgACgCDCICRQ0CIAAoAgghACACQThsIQIDQAJAAkACQAJAIAAoAgAOAwABAgALAkAgAEEoaigCACIDKAIADQAgASADQQhqELQEDAMLIAMgARDwCQwCCyABIABBEGoQtAQMAQsCQCAAQQRqKAIAIgMoAgANACABIANBCGoQtAQMAQsgAyABEPAJCyAAQThqIQAgAkFIaiICDQAMAwsLIAAoAgQiACgCACICDQALIAEgAEEIahC0BAsLqAIBA38CQAJAAkACQAJAAkAgACgCAA4HBQABAgMFBAULIAAoAgwiAkUNBCAA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Rw0AQQEhAiAEKAIQIAQoAhRLDQILIAJFDQAgAxD/EgsgBEEwaiQADwsgBEEANgIoIARBATYCHCAEQcTmgwE2AhggBEIENwIgIARBGGpBoOKEARCFGwALpAICAn8BfiMAQdABayIEJAAgBEEIaiADENANIARB4ABqIAEgBEEIahDaBAJAIAEoAiANACABQX82AiACQCABKAIsIgMgASgCJEcNACABQSRqQbyEhQEQoBYLIAEoAiggA0GYAWxqIgVBiYDEADYCAAJAQdgARQ0AIAVBBGogBEHgAGpB2AD8CgAACyAFIAI6AFwgASADQQFqNgIsIAEgASgCIEEBajYCICAEQcABaiIDIAFB2ABqKAIAIgU2AgAgBEG4AWpBFGogBTYCACAAQQA2AgggAEKAgICAwAA3AgAgACABKQJQIgY3AgwgBCAGNwLEASAAQRRqIAMpAwA3AgAgAEEcaiAEQcgBaikDADcCACAEQdABaiQADwtBrISFARD4FAALlwIBBH8gACABQcAAahD7CAJAIAEoAoQBIgJFDQAgASgCgAEiAyACQdgAbGohBANAAkACQCADKAIAIgJBBUcNACADKAIEIAAQqAEMAQsgAkEERg0AAkACQAJAIAIOBAMAAQIDCyADKAIEQQFHDQIgAygCCCAAEKgBDAILIAAgAygCBBCPCgwBCyADKAIMIgVFDQAgAygCCCECIAVBKGwhBQNAIAIgABC5ByACQShqIQIgBUFYaiIFDQALCyADQdgAaiIDIARHDQALCwJAIAEoApgBIgJFDQAgASgClAEhAyACQShsIQIDQCADIAAQuQcgA0EoaiEDIAJBWGoiAg0ACwsCQCABLQA8QQZGDQAgACABQRBqEPsICwu3AgIDfwF+IwBBIGsiAiQAAkACQAJAAkACQCABLQDIASIDQbd/ag4DAAEAAQsgAS0AgwFBAXFFDQEgASgCxAEhAyABKALAASEEIAJBo4CAgHg2AgggBCADIAJBCGoQhRUhAwJAIAEtAMgBQaIBRw0AIAEQxxEhBCABEIcOIAEgBBDlEQsgACADNgIADAILIAJBCGpBBHIgAxDeGyACQQ42AhwgAkH0sZsBNgIYIAJBsICAgHg2AgggASgCwAEgASgCxAEgAkEIahCFFSEDAkAgAS0AyAFBogFHDQAgARDHESEEIAEQhw4gASAEEOURCyAAIAM2AgAMAQsgARDKESEFIAEQhw5BACEDIABBADYCECAAIAU3AwAgACABKQO4ATcDCAwBC0ECIQMLIAAgAzoAFCACQSBqJAALowIBAn8jAEEwayICJAACQAJAAkACQANAAkAgACgCAA4HAgMABAAFBQILIAAoAgQhAAwACwsgAkEIaiAAQQhqEP4RIAEoAgAgAigCCCACKAIMEOYaDAILIAAoAgwhAyACIAAoAggiADYCKCACQQA2AiAgAkEANgIYIAIgACADQShsajYCLANAIAJBGGoQ7hQiAEUNAiAAIAEQkQoMAAsLIAAoAgxBOGwhAyAAKAIIIQADQCADRQ0BAkACQAJAAkAgACgCAA4DAAECAAsgAEEoaigCACABEJEKDAILIAJBEGogAEEQahD+ESABKAIAIAIoAhAgAigCFBDmGgwBCyAAQQRqKAIAIAEQkQoLIABBOGohACADQUhqIQMMAAsLIAJBMGokAAujAgECfyMAQTBrIgIkAAJAAkACQAJAA0ACQCAAKAIADgcCAwAEAAUFAgsgACgCBCEADAALCyACQQhqIABBCGoQ/hEgASgCACACKAIIIAIoAgwQ5RoMAgsgACgCDCEDIAIgACgCCCIANgIoIAJBADYCICACQQA2AhggAiAAIANBKGxqNgIsA0AgAkEYahDuFCIARQ0CIAAgARCSCgwACwsgACgCDEE4bCEDIAAoAgghAANAIANFDQECQAJAAkACQCAAKAIADgMAAQIACyAAQShqKAIAIAEQkgoMAgsgAkEQaiAAQRBqEP4RIAEoAgAgAigCECACKAIUEOUaDAELIABBBGooAgAgARCSCgsgAEE4aiEAIANBSGohAwwACwsgAkEwaiQAC6MCAQJ/IwBBMGsiAiQAAkACQAJAAkADQAJAIAAoAgAOBwIDAAQABQUCCyAAKAIEIQAMAAsLIAJBCGogAEEIahD+ESABKAIAIAIoAgggAigCDBDjGgwCCyAAKAIMIQMgAiAAKAIIIgA2AiggAkEANgIgIAJBADYCGCACIAAgA0EobGo2AiwDQCACQRhqEO4UIgBFDQIgACABEJMKDAALCyAAKAIMQThsIQMgACgCCCEAA0AgA0UNAQJAAkACQAJAIAAoAgAOAwABAgALIABBKGooAgAgARCTCgwCCyACQRBqIABBEGoQ/hEgASgCACACKAIQIAIoAhQQ4xoMAQsgAEEEaigCACABEJMKCyAAQThqIQAgA0FIaiEDDAALCyACQTBqJAALowIBAn8jAEEwayICJAACQAJAAkACQANAAkAgACgCAA4HAgMABAAFBQILIAAoAgQhAAwACwsgAkEIaiAAQQhqEP4RIAEoAgAgAigCCCACKAIMEOQaDAILIAAoAgwhAyACIAAoAggiADYCKCACQQA2AiAgAkEANgIYIAIgACADQShsajYCLANAIAJBGGoQ7hQiAEUNAiAAIAEQlAoMAAsLIAAoAgxBOGwhAyAAKAIIIQADQCADRQ0BAkACQAJAAkAgACgCAA4DAAECAAsgAEEoaigCACABEJQKDAILIAJBEGogAEEQahD+ESABKAIAIAIoAhAgAigCFBDkGgwBCyAAQQRqKAIAIAEQlAoLIABBOGohACADQUhqIQMMAAsLIAJBMGokAAujAgECfyMAQTBrIgIkAAJAAkACQAJAA0ACQCAAKAIADgcCAwAEAAUFAgsgACgCBCEADAALCyACQQhqIABBCGoQ/hEgASgCACACKAIIIAIoAgwQ3RoMAgsgACgCDCEDIAIgACgCCCIANgIoIAJBADYCICACQQA2AhggAiAAIANBKGxqNgIsA0AgAkEYahDuFCIARQ0CIAAgARCVCgwACwsgACgCDEE4bCEDIAAoAgghAANAIANFDQECQAJAAkACQCAAKAIADgMAAQIACyAAQShqKAIAIAEQlQoMAgsgAkEQaiAAQRBqEP4RIAEoAgAgAigCECACKAIUEN0aDAELIABBBGooAgAgARCVCgsgAEE4aiEAIANBSGohAwwACwsgAkEwaiQAC6MCAQJ/IwBBMGsiAiQAAkACQAJAAkADQAJAIAAoAgAOBwIDAAQABQUCCyAAKAIEIQAMAAsLIAJBCGogAEEIahD+ESABKAIAIAIoAgggAigCDBDhGgwCCyAAKAIMIQMgAiAAKAIIIgA2AiggAkEANgIgIAJBADYCGCACIAAgA0EobGo2AiwDQCACQRhqEO4UIgBFDQIgACABEJYKDAALCyAAKAIMQThsIQMgACgCCCEAA0AgA0UNAQJAAkACQAJAIAAoAgAOAwABAgALIABBKGooAgAgARCWCgwCCyACQRBqIABBEGoQ/hEgASgCACACKAIQIAIoAhQQ4RoMAQsgAEEEaigCACABEJYKCyAAQThqIQAgA0FIaiEDDAALCyACQTBqJAALowIBAn8jAEEwayICJAACQAJAAkACQANAAkAgACgCAA4HAgMABAAFBQILIAAoAgQhAAwACwsgAkEIaiAAQQhqEP4RIAEoAgAgAigCCCACKAIMEOIaDAILIAAoAgwhAyACIAAoAggiADYCKCACQQA2AiAgAkEANgIYIAIgACADQShsajYCLANAIAJBGGoQ7hQiAEUNAiAAIAEQlwoMAAsLIAAoAgxBOGwhAyAAKAIIIQADQCADRQ0BAkACQAJAAkAgACgCAA4DAAECAAsgAEEoaigCACABEJcKDAILIAJBEGogAEEQahD+ESABKAIAIAIoAhAgAigCFBDiGgwBCyAAQQRqKAIAIAEQlwoLIABBOGohACADQUhqIQMMAAsLIAJBMGokAAuLAgEIfyMAQRBrIgIkACACQQRqIAEoAgQgASgCCEEQEL4BIAIoAgwhAwJAAkAgAS0ADEUNACACKAIIIQQMAQsCQCADIAIoAgRHDQAgAkEEakHIj5sBEMENCyACKAIIIgQgA2pBLToAACACIANBAWoiAzYCDAtBACEBQQAgA0EBdiIFayEGIAMgBGpBf2ohByADQQJJIQgCQANAIAYgAUYNASABQX9qIQMCQCAIDQAgBC0AACEJIAQgByABaiIBLQAAOgAAIAEgCToAACAEQQFqIQQgAyEBDAELCyADIAVBzNKbARCzEQALIAAgAikCBDcCACAAQQhqIAJBBGpBCGooAgA2AgAgAkEQaiQAC6MCAQJ/IwBBMGsiAiQAAkACQAJAAkADQAJAIAAoAgAOBwIDAAQABQUCCyAAKAIEIQAMAAsLIAJBCGogAEEIahD+ESABKAIAIAIoAgggAigCDBDgGgwCCyAAKAIMIQMgAiAAKAIIIgA2AiggAkEANgIgIAJBADYCGCACIAAgA0EobGo2AiwDQCACQRhqEO4UIgBFDQIgACABEJkKDAALCyAAKAIMQThsIQMgACgCCCEAA0AgA0UNAQJAAkACQAJAIAAoAgAOAwABAgALIABBKGooAgAgARCZCgwCCyACQRBqIABBEGoQ/hEgASgCACACKAIQIAIoAhQQ4BoMAQsgAEEEaigCACABEJkKCyAAQThqIQAgA0FIaiEDDAALCyACQTBqJAALowIBAn8jAEEwayIC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RQ0AIAEoAoABIQIgA0HYAGwhAwNAAkACQCACKAIAQQVHDQAgAC0AAA0BIAJBBGooAgAgABCVAQwBCyACIAAQuwgLIAJB2ABqIQIgA0Gof2oiAw0ACwsCQCABKAKYASIDRQ0AIAEoApQBIQIgA0EobCEDA0AgAiAAEMgGIAJBKGohAiADQVhqIgMNAAsLAkAgAS0APCICQQZGDQAgAkECRw0AIAFBEGohAgNAIAIoAhgiAi0ALEECRg0ACwsL8gEBBn8jAEEQayICJAACQCAAKAIIIgNFDQAgACgCBCEAIANBDGwhBCABQSxqIQUDQAJAAkAgACgCACIDDQAgAEEEaigCACIDIAEQ+AMgAygCAEEFRw0BIAIgAykDCCADQRhqKAIAELoYIAUgAikDACACKAIIENEKDAELIAEtACghBiABQQA6ACggAS0AeSEHIAFBADoAeQJAIAMoAgBBGkcNACACIAMpAwggA0EYaigCABC6GCAFIAIpAwAgAigCCBDRCgsgAyABEHcgASAGOgAoIAEgBzoAeQsgAEEMaiEAIARBdGoiBA0ACwsgAkEQaiQAC/sBAQR/IwBB0ABrIgMkACABKALAASEEAkACQCABLQDIASIFQfgARw0AIAEQhw4gACABQQEgBCACELMHDAELIAEoAsQBIQYgA0EMaiAFEN4bIANBATYCNCADQZjvmwE2AjAgA0IBNwI8IANBigWtQiCGQaytmwGthDcDSCADIANByABqNgI4IANBGGogA0EwahCNFSADQSxqIANBDGpBCGooAgA2AgAgAyADKQIMNwIkIAQgBiADQRhqEIUVIQQCQCABLQDIAUGiAUcNACABEMcRIQUgARCHDiABIAUQ5RELIABBCDYCACAAIAQ2AgQgAhDMHQsgA0HQAGokAAvxAQICfwJ+IwBBEGsiAyQAAkACQAJAIAEoAgBBBUYNACABKQIAIgVCIIghBgJAAkACQCAFpyIEQX1qIgFBAiABQQJJGw4DAAECAAtBASEBIANBAToABCADIAI2AgggA0EEahCXGiECDAMLIAJFDQMgAyAGpzoABSADQQA6AAQgAyACQX9qNgIIIANBBGoQlxohAkEBIQEMAgsgAyAGPgIMIAMgBDYCCCADQQM6AAQgA0EEahCXGiECQQEhAQwBCyABKAIEIQJBACEBCyAAIAI2AgQgACAB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NwIAIABBFGogA0EIakEUaikCADcCACAAIAU3AgQgACAENgIADAELAkAgBadBAXFFDQAgAEGAgICAeDYCACAAIAVCCIg8AAQMAQsCQCAFQoCAgICAEFQNACAAIAEoAgQgASgCCCACQQRqQQAQlw8MAQsgAEGAgICAeDYCACAAIAVCIIg8AAQLIANBMGokAAvsAQEIfyMAQRBrIgIkACAALQAoIQMgAEEBOgAoIAAtAHohBCAAIAAtAHtBAXM6AHogAC0AeSEFAkAgASgCOCIGRQ0AIAEoAjQhByAGQQxsIQggAEEsaiEJA0AgBygCACEGIABBADoAeSAAQQA6ACgCQCAGKAIAQRpHDQAgAiAGKQMIIAZBGGooAgAQuhggCSACKQMAIAIoAggQ0QoLIAdBDGohByAGIAAQdyAAQQE6ACggAEEAOgB5IAhBdGoiCA0ACwsgAEEBOgB5IAEgABDnBCAAIAU6AHkgACAEOgB6IAAgAzoAKCACQRBqJAAL9wEBAX8CQAJAA0ACQAJAAkAgASgCAA4HAAECBAIFBQALIAAgASkDCCABQRhqKAIAEPwQDwsgASgCDCICRQ0DIAEoAgghASACQShsIQIDQAJAIAEoAgBBB0YNACAAIAEQqAsLIAFBKGohASACQVhqIgINAAwECwsgASgCBCEBDAALCyABKAIMIgJFDQAgASgCCCEBIAJBOGwhAgNAAkACQAJAAkAgASgCAA4DAAECAAsgACABQShqKAIAEKgLDAILIAAgAUEQaikDACABQSBqKAIAEPwQDAELIAAgAUEEaigCABCoCwsgAUE4aiEBIAJBSGoiAg0ACwsL8wECA38CfiMAQeAAayICJAAgACgCMBCBEiEDIAJBNGogAEE0aigCADYCACACQQhqQQApA5j7nAEiBTcDACACQRBqIgRBACkDkPucASIGNwMAIAJBGGogBTcDACACIAA2AiAgAiADNgIkIAJBAToAOSACQQE6ACggAiAAKQIsNwIsIAIgBjcDACACIAAoATo2ATogAiAALQA4OgA4IAIgASgCABDAAgJAIAIoAgQiAEUNACACKAIAIAIoAgwQkgwgACAAQQR0QRdqQXBxIgFqQQlqIgBFDQAgAigCACABayAAQQgQnhILIAQQ1hUgAkHgAGokAAuMAgEBfyMAQeAAayICJAAgACgCACEAIAJB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AkEQaiEBIAJBDGohAgwECyABKAIEIgJBBGohAQwDCyABKAIEIgJBBGohAQwCCyABKAIEIgJBHGohASACQRhqIQIMAQsgASgCBCICQcwAaiEBIAJByABqIQILIAAgASgCADYCBCAAIAIoAgA2AgAL4AEBAX8jAEEQayITJAAgACgCACABIAIgACgCBCgCDBEMACECIBNBADoADSATIAI6AAwgEyAANgIIIBNBCGogAyAEIAUgBhChCSAHIAggCSAKEKEJIAsgDCANIA4QoQkgDyAQIBEgEhChCSESIBMtAA0iAiATLQAMIgFyIQACQCACQQFHDQAgAUEBcQ0AAkAgEigCACIALQAKQYABcQ0AIAAoAgBB17WXAUECIAAoAgQoAgwRDAAhAAwBCyAAKAIAQabEmwFBASAAKAIEKAIMEQwAIQALIBNBEGokACAAQQFxC84BAQN/IwBBIGsiAyQAAkACQAJAIAEgAmoiAiABTw0AQQAhBAwBC0EAIQQCQCACIAAoAgAiBUEBdCIBIAIgAUsbIgFBCCABQQhLGyIBQQBODQAMAQtBACECAkAgBUUNACADIAU2AhwgAyAAKAIENgIUQQEhAgsgAyACNgIYIANBCGogASADQRRqENkSIAMoAghBAUcNASADKAIQIQAgAygCDCEECyAEIABBnMeAARCqHgALIAMoAgwhAiAAIAE2AgAgACACNgIEIANBIGokAAvoAQECfyAAKAKgDSIBIAEoAgAiAUF/ajYCAAJAIAFBAUcNACAAKAKgDRDmDgsCQCAALQCsCkECRg0AIAAoAqAKIgEgASgCACIBQX9qNgIAIAFBAUcNACAAKAKgCiAAKAKkChDqDwsgACgCpA0iASABKAIAIgFBf2o2AgACQCABQQFHDQAgACgCpA0QpxkLAkAgACgCqA0iAUUNACABIAEoAgAiAkF/ajYCACACQQFHDQAgACgCqA0QpxkLIABBsApqEMQaIABByApqEM4YAkAgACgC5ApBA0YNACAAQeQKahClFwsgABDxGwvOAQEDfyMAQSBrIgMkAAJAAkACQCABIAJqIgIgAU8NAEEAIQQMAQtBACEEAkAgAiAAKAIAIgVBAXQiASACIAFLGyIBQQggAUEISxsiAUEATg0ADAELQQAhAgJAIAVFDQAgAyAFNgIcIAMgACgCBDYCFEEBIQILIAMg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MGsiAiQAIAEoAhQhAyABKQIEIQUgASgCECEEIAJBEGogARDdECACIAQ2AiAgAiAFNwIYIAIgAikDEDcCKCACIAQgA0EDdGo2AiQgAkEIaiACQRhqEOcOAkAgAigCCCIBDQBBqLiEARCbIAALIAIoAgwhBCAAIAIpAhg3AhggACABNgIwIABCBDcCECAAQgA3AgggAEKAgICAwAA3AgAgAEEoaiACQShqKQIANwIAIABBIGogAkEgaikCADcCACAAIAEgBEEDdGo2AjQgAkEwaiQAC84BAgF/AX4jAEEQayIEJAACQAJAAkAgA0EPSQ0AIANB/////wFLDQJBfyADQQN0QQduQX9qZ3ZBAWohAwwBC0EEQQhBECADQQhJGyADQQRJGyEDCyAEIAEgAiADEPgMIAQoAgQhAwJAAkAgBCgCACICDQAgACAEKAIINgIIIAAgAzYCBCAAQQA2AgAMAQsgBCkCCCEFAkAgA0EJaiIBRQ0AIAJB/wEgAfwLAAsgACAFNwIIIAAgAzYCBCAAIAI2AgALIARBEGokAA8LENkZAAvPAQEBfyMAQcAAayICJAACQAJAIAAoAgAiACgCAEEaRw0AIAIgASgCACABKAIEIABBCGoiARC1DCACKAIAQTJGDQEgABDJASAAQThqIAJBOGopAwA3AwAgAEEwaiACQTBqKQMANwMAIABBKGogAkEoaikDADcDACAAQSBqIAJBIGopAwA3AwAgAEEYaiACQRhqKQMANwMAIABBEGogAkEQaikDADcDACABIAJBCGopAwA3AwAgACACKQMANwMADAELIAAgARBGCyACQcAAaiQAC88BAQF/IwBBwABrIgIkAAJAAkAgASgCACIBKAIAQRpHDQAgAiAAKAIAIAAoAgQgAUEIaiIAELUMIAIoAgBBMkYNASABEMkBIAFBOGogAkE4aikDADcDACABQTBqIAJBMGopAwA3AwAgAUEoaiACQShqKQMANwMAIAFBIGogAkEgaikDADcDACABQRhqIAJBGGopAwA3AwAgAUEQaiACQRBqKQMANwMAIAAgAkEIaikDADcDACABIAIpAwA3AwAMAQsgASAAEEYLIAJBwABqJAALugEBBX8CQCADQQhJDQAgACAAIANBA3YiA0HwAGwiBGogACADQcQBbCIFaiADEIgMIQAgASABIARqIAEgBWog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AQtBAC0AwPGdARogAhCFASIFRQ0CCwJAIAJFDQAgBSABIAL8CgAACyAAIAI2AiQgACAFNgIgIAAgAjYCHCAAQRhqIARBGGooAgA2AgAgAEEQaiAEQRBqKQIANwIAIABBCGogBEEIaikCADcCACAAIAQpAgA3AgAgACADKQIANwIoIABBMGogA0EIaikCADcCACAAQThqIANBEGopAgA3AgAPC0G84JsBENMZCwALvQEBCX9BACECAkADQCACIAFGDQEgACACQRxsaiIDKAIIIQQgAygCBCEFQQAhBgJAA0AgBiAERg0BIAUgBkEMbGoiBygCCCEIIAcoAgQiCSEKAkADQCAIRQ0BIAooAgAgCkEEaigCABCOICAIQX9qIQggCkEUaiEKDAALCyAHKAIAIAlBBEEUEK8RIAZBAWohBgwACwsgAygCACAFQQRBDBCvESADKAIMIANBEGooAgAQjiAgAkEBaiECDAALCwu5AQECfwJAAkACQCAAKAIIIgIgAUkNACACIAFGDQEgAiABayECAkACQCAAKAIEIAFBAnRqIgMtAAAiAUH/AUYNACABIAFBAnZqIAFBA3FBAEdqQQJqIgEgAkkNASABIAJB/OGDARCzEQALIAAoAihBAmoiASACTw0DCyADIAFBAnRqKAIAIgFBASABQX9KGw8LIAEgAkHY8oMBEKMgAAtBAEEAQezhgwEQsxEACyABIAJBjOKDARCzEQALywEBA38jAEHQAGsiASQAIAAoAgAiAigCACEDIAJBADYCACADKAJQIQIgA0EANgJQAkAgAkUNACABQQhqIAIRAwACQCAAKAIEIgIoAgAiAygCOCIAQQJGDQAgAEUNACADKAJAIgBFDQAgAygCPCAAQQEQnhIgAigCACEDCwJAQcgARQ0AIAMgAUEIakHIAPwKAAALIAFB0ABqJABBAQ8LIAFBADYCGCABQQE2AgwgAUG4/5wBNgIIIAFCBDcCECABQQhqQaTvmwEQhRsAC7cBAgJ/AX4jAEEQayIDJAAgAyABIAIQuhgCQAJAIAMpAwAiAUIDgyIFQgBSDQAgAaciAiACKAIAIgJBAWo2AgAgAkF/TA0BCyAAQRBqIAEgAygCCCICEOcFGgJAAkAgACgCnAEiBEUNACAAKAKYASAEQSxsakFgaiABIAIQ5wUaDAELIAVCAFINACABpyIAIAAoAgAiAkF/ajYCACACQQFHDQAgACAAKAIQEMEbCyADQRBqJAAPCwALwgEBBH8jAEEgayIEJAACQANAIARBCGogASACIAMQxQIgBCgCCCECAkAgBC0ADCIFQQJHDQBBASEDDAILIAQtAA0hAwJAIAIoAgBBEkcNACACLQAUQW1qQf8BcUECTw0AIAIoAgQiBigCAEESRw0AIAYtABRBGEcNACACKAIQIQYgAigCDCEHIARBuICAgHg2AgggASAHIAYgBEEIahCvGgsgBUEBcQ0AC0EAIQMLIAAgAjYCBCAAIAM2AgAgBEEgaiQAC74BAgF/AX4jAEEQayIDJAAgA0EIaiACIAEoAghBABCVAgJAAkAgAy0ACEEERg0AIAMpAwgiBEL/AYNCBFENACAAIAQ3AgAMAQsgA0EIaiABIAIQ2iACQCADLQAIQQRGDQAgAykDCCIEQv8Bg0IEUQ0AIAAgBDcCAAwBCyADQQhqIAFBBGogAhDaCQJAIAMtAAhBBEYNACADKQMIIgRC/wGDQgRRDQAgACAENwIADAELIABBBDoAAAsgA0EQaiQAC8oBAQF/IwBBEGsiCyQAIAAoAgAgASACIAAoAgQoAgwRDAAhAiALQQA6AA0gCyACOgAMIAsgADYCCCALQQhqIAMgBCAFIAYQoQkgByAIIAkgChChCSEKIAstAA0iAiALLQAMIgFyIQACQCACQQFHDQAgAUEBcQ0AAkAgCigCACIALQAKQYABcQ0AIAAoAgBB17WXAUECIAAoAgQoAgwRDAAhAAwBCyAAKAIAQabEmwFBASAAKAIEKAIMEQwAIQALIAtBEGokACAAQQFxC7kBAgJ/AX4jAEEQayIEJAACQAJAAkAgAiADakF/akEAIAJrca0gAa1+IgZCIIinDQAgBqciA0GAgICAeCACa00NAQsgAEEANgIEQQEhAgwBCwJAIAMNACAAIAI2AghBACECIABBADYCBAwBCyAEQQhqIAIgAxDjGwJAIAQoAggiBUUNACAAIAU2AgggACABNgIEQQAhAgwBCyAAIAM2AgggACACNgIEQQEhAgsgACACNgIAIARBEGokAAvWAQECfyMAQRBrIgMkAAJAAkACQAJAIAJBf0wNACACQen///8HTw0BIAJBF2pB+P///wdxIgRB8f///wdPDQJBCCAEQQ9qQXhxENkfIgRFDQMgBCACNgIQIAQgADcDCCAEQQE2AgACQCACRQ0AIARBGGogASAC/AoAAAsgA0EQaiQAIAQPC0HUpJsBQSsgA0EPakHw1IIBQfDVggEQ6A8AC0HUpJsBQSsgA0EPakHw1IIBQYDWggEQ6A8AC0HUpJsBQSsgA0EPakHw1IIBQeDVggEQ6A8LAAu+AQEBfgJAAkACQCADIARqQX9qQQAgA2txrSABrX4iBUIgiKcNACAFpyIEQYCAgIB4IANrTQ0BCyAAQQA2AgRBASEDDAELAkAgBA0AIAAgAzYCCEEAIQMgAEEANgIEDAELQQAtAMDxnQEaAkACQCACRQ0AIAQgAxCAGiECDAELIAQgAxCGHSECCwJAIAJFDQAgACACNgIIIAAgATYCBEEAIQMMAQsgACAENgIIIAAgAzYCBEEBIQMLIAAgAzYCAAvAAQICfwF+IwBBIGsiAiQAIAJBDGogAUEEai8AADsBACACIAEoAAA2AghBACEBQQAtAMDxnQEaAkBBBhCFASIDRQ0AIAJBADYCGCACIAM2AhQgAkEDNgIQA0AgAyABaiACIAFqQQhqLwEAOwAAIAFBAmoiAUEGRw0ACyACKQMQIQQgAkEIaiIBQQM2AgAgAkEAOgAMIAIgBDcDACACEOQEIABBCGogASkDADcCACAAIAIpAwA3AgAgAkEgaiQADwsAC64BAQV/QQAhBQNAIAJBAXYiBiAFaiEHIAUgByABIAdBBHRqIggoAgAgAyAIKAIEIgggBCAIIARJGxCSFSIJIAggBGsgCRtBAEobIQUgAiAGayICQQFLDQALAkACQCABIAVBBHRqIgIoAgAgAyACKAIEIgUgBCAFIARJGxCSFSIHIAUgBGsgBxtFDQBBACEEDAELIAIoAgwhBSACKAIIIQQLIAAgBTYCBCAAIAQ2AgALoAEBBX4gACAAKQMYIgFCEIkgASAAKQMIfCIBhSICQhWJIAIgACkDECIDIAApAwB8IgRCIIl8IgKFIgVCEIkgBSABIANCDYkgBIUiA3wiAUIgiXwiBIUiBSACIAEgA0IRiYUiAXwiAkIgiXwiAzcDACAAIAVCFYkgA4U3AxggACABQg2JIAKFIgFCEYkgBCABfCIBhTcDECAAIAFCIIk3AwgL1wEAAkAgASACQcbLmwFBAhCZHEUNAEHeAA8LAkAgASACQbC3mwFBBhCZHEUNAEHfAA8LAkAgASACQcOXmwFBAhCZHEUNAEHgAA8LAkAgASACQcWXmwFBChCZHEUNAEHhAA8LAkAgASACQbDFmwFBAhCZHEUNAEGEAQ8LAkAgASACQbDEmwFBBRCZHEUNAEGdAQ8LAkAgASACQdCgmwFBCRCZHEUNAEGCAQ8LAkAgASACQYDNmwFBChCZHEUNAEGBAQ8LQYN/QaR/IAEgAkG7pJsBQQkQmRwbC88BAQF/IAAQ1hIgACgCBCIAQRRqIgEoAgAgAEEYaigCABC9GiAAKAIQIAEoAgAQnSACQCAAKAIAQQJGDQAgACgCBCAAQQhqKAIAEI4gCyAAKAIcIABBIGooAgAQniAgAEEsaiIBKAIAIABBMGooAgAQvhogACgCKCABKAIAEJ8gIABBOGoiASgCACAAQTxqKAIAEKsVIAAoAjQgASgCABCgICAAQcQAaiIBKAIAIABByABqKAIAENIMIAAoAkAgASgCABChICAAQdAAQQQQnhILvAEBA39BACEBAkACQAJAIAAoAgBBfGoOBAEBAgACCyAAKAIEIgAtAEVBA0YNASAAQSBqIQACQANAIAAtACVBAkYNASAAKAIgIQAMAAsLIAAoAghBOGwhAiAAKAIEQQhqIQADQCACRQ0BAkACQCAAQXhqKAIAIgNBAUYNACADQQlHDQQgACgCAEERRw0EIABBCGoQ4QxFDQQMAQsgABDhDEUNAwsgAkFIaiECIABBOGohAAwACwtBASEBCyABC88BAQF/IAAQ1hIgACgCBCIAQRRqIgEoAgAgAEEYaigCABC9GiAAKAIQIAEoAgAQnSACQCAAKAIAQQJGDQAgACgCBCAAQQhqKAIAEJciCyAAKAIcIABBIGooAgAQniAgAEEsaiIBKAIAIABBMGooAgAQvhogACgCKCABKAIAEJ8gIABBOGoiASgCACAAQTxqKAIAEKsVIAAoAjQgASgCABCgICAAQcQAaiIBKAIAIABByABqKAIAENIMIAAoAkAgASgCABChICAAQdAAQQQQnhILxwEBBX8jAEEQayICJABBASEDAkAgAEEEaiABKAIAIgQgASgCBCIFEJ8CDQACQAJAIAAoAgAiBi0AAEEERw0AIARBq96CAUELIAUoAgwRDABFDQEMAgsgAiAGNgIMIAFBpN6CAUEHIAJBDGpBGxCkCw0BCwJAIAAtAAVBBEcNACAALQAJQf8BcUEERw0AIAAtAAQNAEEAIQMgAC0ADUH/AXFFDQELIAEoAgBB/d2CAUEEIAEoAgQoAgwRDAAhAwsgAkEQaiQAIAMLvgEBA38CQAJAIAEgACgCCCIDTw0AIAAoAgQgAUEUbGooAgghAQJAAkACQCACRQ0AIAAoAighBCAAKAIsIQVBACEDA0AgAUUNAiABIAVPDQUgBCABQQN0aigCBCEBIAIgA0EBaiIDRw0ACwsgAUUNACABIAAoAiwiA0kNASABIANBnOODARCzEQALQfjygwEQmyAACyAAKAIoIAFBA3RqKAIADwsgASADQYyugAEQsxEACyABIAVBnOODARCzEQALugEBA38jAEEQayIDJAAgA0EIaiAAIAEQmxkgAygCDCEBIAMoAgghAAJAAkACQAJAIAJFDQBBACEEA0AgAUUNAiABIAAoAiwiBU8NBCAAKAIoIAFBA3RqKAIEIQEgAiAEQQFqIgRHDQALCyABRQ0AIAEgACgCLCIESQ0BIAEgBEGc44MBELMRAAtB+PKDARCbIAALIAAoAiggAUEDdGooAgAhASADQRBqJAAgAQ8LIAEgBUGc44MBELMRAAu6AQEDfyMAQSBrIgIkACAAKAIAIQNBACEAIAEoAgBB16ybAUEBIAEoAgQoAgwRDAAhBCACQQA6ABkgAiAEOgAYIAIgATYCFANAIAIgADoAHyACIAMgAEGAAXFBA3ZqIgEpAwAgAUEIaikDACAAQf8AcRCNEgJAIAIpAwBCAYNQDQAgAkEUaiACQR9qQccAEPQKGgsgAEH/AXFBAWoiAEH/AXEgAEYNAAsgAkEUahDBGiEAIAJBIGokACAAC7UBAgZ/AX4CQCAAKAIAIgEoAkgiAkEBcUUNACAAKAIEIQMCQCACQQJGDQAgASgCTCADKAJsSw0BC0EBIQICQCABKAJQQQFxRQ0AIAEoAlQhBEEBIQIgAygCcCEFQQAhAQJAIAMoArABQQFHDQAgAygCtAEiASADKAK4ASIGayAGIAFrIAEgBksbIQELIAEgBWpBfyAErSADNQKUAX4iB6cgB0IgiKcbTw0BCyACDwsgABDjA0EAC7kBAQF/IwBBEGsiBiQAAkACQCAFIARJDQAgBSADSw0BIAZCATcCCAJAAkAgBSAEayIFIAEoAkAiA08NAEEAIQUMAQsgBiABIAZBCGogAiAEaiAFIAEoAjwgAyABKAIwERUAQQAhBSAGKAIAQQFxRQ0AIAAgBigCBCAEaiIFNgIEIAAgBSADajYCCEEBIQULIAAgBTYCACAGQRBqJAAPCyAEIAVBzNeEARCpIAALIAUgA0HM14QBEI8gAAvXAQIEfwF+AkACQAJAAkACQCABKAIAIgIOAwABAgALQQAtAMDxnQEaQRwQhQEiA0UNAyABKAIEIgEpAgwhBiABKAIUIQQgAS8BGCEFIAMgARCoBSADIAU7ARggAyAENgIUIAMgBjcCDAwCC0EALQDA8Z0BGkEYEIUBIgNFDQIgASgCBCIBKQIMIQYgAS0AFCEEIAMgARCoBSADIAQ6ABQgAyAGNwIMDAELQQAtAMDxnQEaQSgQhQEiA0UNASADIAEoAgQQpwILIAAgAzYCBCAAIAI2AgAPCwALwQEBA38gAEEMaiECAkAgACgCCCIDRQ0AIAAoAgQhBCADQQxsIQMDQCABIAQoAgAQjAEgBEEMaiEEIANBdGoiAw0ACwsgASACEEkCQCAAKAIwIgRFDQAgASAEEIwBCwJAIAAoAjQiBEUNACAEEOQNIAQoAgAgBEEEaigCABDCICAEQRRBBBCeEgsgAEEANgI0AkAgACgCOCIERQ0AIAQQuBggBCgCACAEQQRqKAIAEMAgIARBFEEEEJ4SCyAAQQA2AjgL0wEBBH8gASgCCCECIAEoAgQhASAAKAIAIgMoAgBBrsSbAUEBEO8IAkACQAJAAkAgAkUNACACQRhsIQRBgAIhBQNAIAUiAkEBcQ0DAkAgAkGA/gNxQYACRg0AIAMoAgBB4sSbAUEBEO8ICyABIAAQnQEiBQ0CIAFBGGohASACQf+BfHFBgARyIQUgBEFoaiIEDQALIAJBAXENAwsgAygCAEGvxJsBQQEQ7whBACEFCyAFDwtBsqObAUEoQaSGmwEQ3RcAC0Gyo5sBQShBtIabARDdFwAL1gEAAkACQAJAAkACQAJAAkACQCAAKAIADggBAgMEBQYHAAELIAAoAgQiABC7HAJAIAAtAEVBA0YNACAAQSBqEPoaCyAAQdgAQQgQnhIPCyAAKQMIEMYdIABBIGoQ5R4PCyAAKQMIEMYdIAAoAiAQ2RoPCyAAKAIEEOwfDwsgACgCBBDtHw8LIAAoAgQQthsPCyAAKAIEIgApAwgQxh0gACgCIBDuHyAAQSRqEOQGIABBMEEIEJ4SDwsgACgCBCIAKQMAEMYdIABBIGoQqB8gAEEwQQgQnhILvQEBBH8jAEEQayIFJAACQAJAIAEoAgAiBg0AQQAhBiAFQQxqIQcMAQsgBSADNgIMIAYgBGwhBiABKAIEIQggBUEIaiEHCyAHIAY2AgACQAJAIAUoAgwiBkUNACAFKAIIIQcCQAJAIAINACAHRQ0BIAggByAGEJ4SDAELIAggByAGIAQgAmwiBBDaAyIDRQ0CCyABIAI2AgAgASADNgIEC0GBgICAeCEGCyAAIAQ2AgQgACAGNgIAIAVBEGokAAuzAQEEfyMAQRBrIgIkAEEDIQMgAC0AACIAIQQCQCAAQQpJDQBBASEDIAIgACAAQeQAbiIEQeQAbGtB/wFxQQF0IgVBgcyYAWotAAA6AA8gAiAFQYDMmAFqLQAAOgAOCwJAAkAgAEUNACAERQ0BCyACQQ1qIANBf2oiA2ogBEEBdEH+AXFBgcyYAWotAAA6AAALIAFBAUEBQQAgAkENaiADakEDIANrEMoFIQMgAkEQaiQAIAMLuAEBAX8jAEHQAGsiBCQAAkAgASgCIA0AIAFBfzYCICAEIAOtQv8Bg0IohiACrUL/AYNCIIaENwJEIARBATYCQCAEIAFBJGogBEHAAGoQ2wsgASABKAIgQQFqNgIgIABBCGohAiAEKAIEIQECQAJAIAQoAgAiA0EqRg0AQThFDQEgAiAEQQhqQTj8CgAADAELIAIgATYCAAsgACADNgIAIAAgATYCBCAEQdAAaiQADwtBlLGEARD4FAALrgEAAkACQCADIAFPDQAgACADQQxsaiIBKAIIIgMgAkkNAQJAIAMgASgCAEcNACABQeTHhAEQ7xULIAEoAgQgAkEDdGohAAJAIAMgAk0NACADIAJrQQN0IgJFDQAgAEEIaiAAIAL8CgAACyABIANBAWo2AgggACAFrUL/AYNCKIYgBK1C/wGDQiCGhCAGrYQ3AgAPCyADIAFBlMiEARCzEQALIAIgA0Hkx4QBELYRAAu9AQEFfyMAQSBrIgIkAAJAAkACQCABKAIIIgNFDQACQCABKAIEIgQtAABBAnFFDQAgAiADQXNqIgVBA3EiBjYCBCAGDQMgA0EMTQ0CIAQgBUECdjYACQsgAEEANgIMIAAgASkCADcCACAAQQhqIAFBCGooAgA2AgAgAkEgaiQADwtBAEEAQazdhAEQsxEAC0ENIANBjN+EARCPIAALIAJBADYCCEEAIAJBBGpBlLeYASACQQhqQZzfhAEQmRkAC78BAQV/AkACQCABIAAoAgxrIgJBAXQgAkEfdXMiA0H/AEsNACAAKAIIIQQMAQsgACgCCCECIAMhBQNAAkAgAiAAKAIARw0AIABBvN+EARDBDQsgACACQQFqIgQ2AgggACgCBCACaiAFQYB/cjoAACAFQf//AEshBiAEIQIgBUEHdiIDIQUgBg0ACwsCQCAEIAAoAgBHDQAgAEGs34QBEMENCyAAIAE2AgwgACAEQQFqNgIIIAAoAgQgBGogAzoAAAu8AQEEfyMAQTBrIgMkAEEAIQQCQCACKAIQIgUgAigCFCIGSw0AAkAgAigCAEF/akECSQ0AIANBDGogAEEEaiACKAIIIAIoAgwgBSAGEM4GIAMoAgwiBEEBRw0BIAMoAhAgAygCFE0NASADQQA2AiggA0EBNgIcIANBxOaDATYCGCADQgQ3AiAgA0EYakGg4oQBEIUbAAsgBSACKAIMTw0AIAAtAAQgAigCCCAFai0AAEYhBAsgA0EwaiQAIAQLvAEBBH8jAEEwayIDJABBACEEAkAgAigCECIFIAIoAhQiBksNAAJAIAIoAgBBf2pBAkkNACADQQxqIAAgAigCCCACKAIMIAUgBhCCDiADKAIMIgRBAUcNASADKAIQIAMoAhRNDQEgA0EANgIoIANBATYCHCADQcTmgwE2AhggA0IENwIgIANBGGpBoOKEARCFGwALIAUgAigCDE8NACAAIAIoAgggBWotAABqLQAAIQQLIANBMGokACAEQQFxC7wBAQN/IwBBgCBrIgIkAAJAAkACQAJAIAFBgJL0ASABQYCS9AFJGyIDIAEgAUEBdmsiBCADIARLGyIDQYEQSQ0AIANBAXQiBCADckF/TA0CAkACQCAEDQBBACEDQQEhBAwBC0EALQDA8Z0BGiAEEIUBIgRFDQQLIAAgASAEIAMgAUHBAEkQrAIgAyAEQQFBAhDAEQwBCyAAIAEgAkGAECABQcEASRCsAgsgAkGAIGokAA8LQaTXmwEQ0xkLAAu9AQEEfyAAKAIEIQEgACgCACECIABCgYCAgBA3AgAgACgCECEDAkACQAJAAkAgASACRg0AIAMNAQwDCyADRQ0CIAAoAgwiAiAAKAIIIgAoAggiAUYNASADRQ0BIAAoAgQiBCABaiAEIAJqIAP8CgAADAELAkAgACgCDCICIAAoAggiACgCCCIBRg0AIANFDQAgACgCBCIEIAFqIAQgAmogA/wKAAALIAAgASADajYCCA8LIAAgASADajYCCA8LC8cBAQR/IwBBEGsiAiQAIAEoAgwhAwJAAkACQAJAAkACQCABKAIEDgIAAQILIAMNAUEBIQRBACEBDAILIAMNACABKAIAIgMoAgQhASADKAIAIQQMAQsgACABEMUJDAELIAJBBGogAUEAQQFBARDbDCACKAIIIQUgAigCBEEBRg0BIAIoAgwhAwJAIAFFDQAgAyAEIAH8CgAACyAAIAE2AgggACADNgIEIAAgBTYCAAsgAkEQaiQADwsgBSACKAIMQbzgmwEQqh4AC6gBAgF/AX4CQAJAIAGtIAOtfiIFQiCIpw0AIAWnIgEgAkF/amoiBCABSQ0AIARBACACa3EiBCADQQhqaiIBIARJDQAgAUGAgICAeCACa0sNAAJAIAFFDQBBAC0AwPGdARogASACEIYdIQILIAJFDQEgAEEANgIMIAAgA0F/aiIBNgIEIAAgAiAEajYCACAAIAEgA0EDdkEHbCABQQhJGzYCCA8LENkZCwALxQEBA38jAEEgayIBJAAgACgCACICKAIAIQMgAkEANgIAIAMoAhAhAiADQQA2AhACQCACRQ0AIAFBCGogAhEDAAJAIAAoAgQiACgCACIDKAIAIgJBgoCAgHhIDQAgAiADQQRqKAIAEI4gIAAoAgAhAwsgAyABKQIINwIAIANBCGogAUEIakEIaigCADYCACABQSBqJABBAQ8LIAFBADYCGCABQQE2AgwgAUG4/5wBNgIIIAFCBDcCECABQQhqQaTvmwEQhRsAC7wBAgR/AX4gACgCBCEBAkAgACgCCCICRQ0AIAFBJGohAQNAAkAgAUFkaikDACIFQgODQgBSDQAgBaciAyADKAIAIgRBf2o2AgAgBEEBRw0AIAMgAygCEBDBGwsCQCABQXxqKAIAIgNFDQAgAxCrAiADQeAAQQgQnhILAkAgASgCACIDRQ0AIAMQqwIgA0HgAEEIEJ4SCyABQTBqIQEgAkF/aiICDQALIAAoAgQhAQsgACgCACABQQhBMBCvEQu6AQEFfyAAKAIAIAAoAgQgARD0HiAAKAJIQQZ0IQIgACgCRCEDQQAhBANAAkACQCACIARGDQACQCADIARqIgUoAgBBB0YNACAFIAEQjx4MAgsgBUE0aigCACAFQThqKAIAIAEQrhogBUEIaiEGAkAgBUEcai0AAEECRw0AIAVBDGooAgAhBSAGKAIAIAEQ9xEgBSABEN4DDAILIAYgARDdHQwBCyAAQSBqIAEQ+BwPCyAEQcAAaiEEDAALC80BAgN/AX4jAEEgayICJAAgASgCwAEhAyABEIcOAkACQCABKALAASABKAK8ASIERw0AIAJBCGogARDDCwJAIAIpAwgiBVBFDQAgAigCECEBIABCADcDACAAIAE2AggMAgsgACADNgIIIAAgBTcDACAAIAEoArwBNgIMDAELIAJB3YCAgHg2AgggAyAEIAJBCGoQhRUhAwJAIAEtAMgBQaIBRw0AIAEQxxEhBCABEIcOIAEgBBDlEQsgAEIANwMAIAAgAzYCCAsgAkEgaiQAC74BAQV/QQAhASAAQQAgAC0AACICIAJBAUYiAhs6AAACQCACDQAgABDKDyIDIQICQANAIAEhBCACIgUoAgQiAUUNASABIQIgASgCACAARw0ACyAFIAEoAgQiAjYCBAJAAkACQCADKAIIIAFGDQADQCACRQ0CAkAgAigCACAARw0AQQIhAgwECyACKAIEIQIMAAsLIAMgBDYCCAtBACECCyAAIAI6AAAgAUEANgIIEN4ZAAsgAEEAOgAAIAMQqhsLC98BAQJ/IwBBEGsiAiQAIAAoAgAoAgAiAEEBaiEDAkACQAJAAkACQAJAIAAtAAAOBQABAgMEAAsgASgCAEHE74MBQRQgASgCBCgCDBEMACEBDAQLIAEoAgBB2O+DAUEWIAEoAgQoAgwRDAAhAQwDCyACIAM2AgggAUHu74MBQRFB7s2ZAUEDIAJBCGpB/QAQjg0hAQwCCyACIAM2AgwgAUH/74MBQRZB7s2ZAUEDIAJBDGpB/QAQjg0hAQwBCyABKAIAQZXwgwFBECABKAIEKAIMEQwAIQELIAJBEGokACABC8IBAQJ/IwBBgAZrIgIkAEECIQMCQCABKQMAQgKFIAEpAwiEUA0AIAJBgANqIAEQsgQgAkHABGogAUGQBWoQsgQCQEHwAkUNACACQRBqIAJBgANqQfAC/AoAAAsgAkEIaiACQfwFaigCADYCACACIAIpAvQFNwMAIAIoAvAFIQMLAkBB8AJFDQAgACACQRBqQfAC/AoAAAsgACADNgLwAiAAIAIpAwA3AvQCIABB/AJqIAJBCGooAgA2AgAgAkGABmokAAu8AQEDfyMAQTBrIgQkAAJAIAIoAhAiBSACKAIUIgZLDQACQAJAIAIoAgBBf2pBAkkNACAEQQxqIABBBGogAigCCCACKAIMIAUgBhDOBiAEKAIMQQFHDQIgBCgCECAEKAIUTQ0BIARBADYCKCAEQQE2AhwgBEHE5oMBNgIYIARCBDcCICAEQRhqQaDihAEQhRsACyAFIAIoAgxPDQEgAC0ABCACKAIIIAVqLQAARw0BCyADEP8SCyAEQTBqJAALxwECBH8BfiMAQRBrIgIkACACIAEQtgIgAigCBCEDAkACQCACKAIAIgRBgYCAgHhHDQAgACADNgIEQQEhAQwBCyACLQAMIQUgASgCdEEIaiADIAIoAggQywMhBgJAIARBgICAgHhGDQAgBCADEI4gCwJAIAEoAghBCkYNACABQQhqEMQICyABIAY3AxAgAUECNgIIAkAgBUEBcUUNACABIAEtAIMBQQFyOgCDAQsgAEHLADoAAUEAIQELIAAgAToAACACQRBqJAALxQEBBH8jAEEQayICJAAgASgCDCEDAkACQAJAAkACQAJAIAEoAgQOAgABAgsgAw0BQQEhBEEAIQEMAgsgAw0AIAEoAgAiAygCBCEBIAMoAgAhBAwBCyAAIAEQxQkMAQsgAkEEaiABQQFBARDMDSACKAIIIQUgAigCBEEBRg0BIAIoAgwhAwJAIAFFDQAgAyAEIAH8CgAACyAAIAE2AgggACADNgIEIAAgBTYCAAsgAkEQaiQADwsgBSACKAIMQbzgmwEQqh4AC8gBAQV/IwBBMGsiAiQAAkACQCABvUL///////////8Ag0L/////////9/8AVQ0AIAEgAkELahD3ASACQQtqayEDIAJBC2ohBAwBCyACIAEQsxggAigCBCEDIAIoAgAhBAsgAkEkaiADQQFBARDMDSACKAIoIQUCQCACKAIkQQFGDQAgAigCLCEGAkAgA0UNACAGIAQgA/wKAAALIAAgAzYCCCAAIAY2AgQgACAFNgIAIAJBMGokAA8LIAUgAigCLEG84JsBEKoeAAu4AQEBfwJAIAAoAngiBEEBcUUNACADENkHDwsgASACIAMQhRUhAwJAIARBCHFFDQAgACADENUYDwsCQCAEQQJxRQ0AAkAgACgCSCIEIAAoAkBHDQAgAEHAAGpB7K2ZARCxFgsgACAEQQFqNgJIIAAoAkQgBEECdGogAzYCAA8LAkAgACgCVCIEIAAoAkxHDQAgAEHMAGpB/K2ZARCxFgsgACAEQQFqNgJUIAAoAlAgBEECdGogAzYCAAvEAQIEfwJ+IwBBIGsiAyQAIAMgASABKALAAUEBaiIEIAEoAsQBQX5qIgUQqhcgAygCACADKAIEEPUVIQcgA0EIaiABEPUPAkACQAJAAkAgAygCCEEBRw0AIAMgAygCDCIGNgIcIAINASAAQQI6ABggACAGNgIAIAcQxh0MAwsgAykDECEIDAELIANBHGoQ3x1CACEICyABEIcOIABBADoAGCAAIAg3AxAgACAFNgIMIAAgBDYCCCAAIAc3AwALIANBIGokAAvBAQACQCABQQFxRQ0AIAAgAjYCBCAAQQI2AgAgACACKQIANwIIDwsCQAJAAkACQCACKAIAQfr/u39qDgIBAgALIABBBDYCAA8LIAIoAgQiAigCAEGIgMQARg0BIABCBDcCCCAAIAI2AgQgAEEANgIADwsCQCACKAIMIgFFDQAgAEEANgIAIAAgAUF/ajYCDCAAIAIoAggiAjYCBCAAIAJB2ABqNgIIDwsgAEEENgIADwsgAEEBNgIAIAAgAkEEajYCBAu6AQEDfyMAQTBrIgQkAAJAIAIoAhAiBSACKAIUIgZLDQACQAJAIAIoAgBBf2pBAkkNACAEQQxqIAAgAigCCCACKAIMIAUgBhCCDiAEKAIMQQFHDQIgBCgCECAEKAIUTQ0BIARBADYCKCAEQQE2AhwgBEHE5oMBNgIYIARCBDcCICAEQRhqQaDihAEQhRsACyAFIAIoAgxPDQEgACACKAIIIAVqLQAAai0AAEUNAQsgAxD/EgsgBEEwaiQAC60BAQJ/AkACQCABQQNLDQAgAEF/aiEAA0ACQCABDQBBAQ8LIAAgAWohAiABQX9qIQEgAiwAAEF/Sg0AC0EAIQMMAQtBACEDIAAoAABBgIGChHhxDQBBBCAAQQNqQXxxIgIgAGsgAiAARhshAiABQXxqIQEDQAJAIAIgAUkNACAAIAFqKAAAQYCBgoR4cUUPCyAAIAJqKAIAQYCBgoR4cQ0BIAJBBGohAgwACwsgAwurAQEBfwJAAkACQAJAIAAOAwABAgALQQEhACABQQhqKAIAIgJFDQIgAUEEaigCACACQThsaiIBQUhqIgJFDQICQCABQXhqKAIAIgFFDQAgARCMDg8LIAIQ0xgPC0EBIQAgAUEIaigCACICRQ0BIAFBBGooAgAgAkE4bGoiAUFIaiICRQ0BAkAgAUF4aigCACIBRQ0AIAEQjA4PCyACENMYDwsgARDTGCEACyAAC7ABAQZ/IAEgASgCXCICQX9qIgM2AlwgASABKAJYIgRBAWoiBTYCWCABIAEoAmgiBkEBajYCaEELIQcCQCADRQ0AIAUtAABBPUcNACABIAZBAmo2AmggASACQX5qIgM2AlwgASAEQQJqIgU2AlhBMCEHIANFDQAgBS0AAEE9Rw0AIAEgBkEDajYCaCABIAJBfWo2AlwgASAEQQNqNgJYQTIhBwsgAEEAOgAAIAAgBzoAAQuwAQEGfyABIAEoAlwiAkF/aiIDNgJcIAEgASgCWCIEQQFqIgU2AlggASABKAJoIgZBAWo2AmhBCiEHAkAgA0UNACAFLQAAQT9HDQAgASAGQQJqNgJoIAEgAkF+aiIDNgJcIAEgBEECaiIFNgJYQTshByADRQ0AIAUtAABBPUcNACABIAZBA2o2AmggASACQX1qNgJcIAEgBEEDajYCWEEtIQcLIABBADoAACAAIAc6AAELvgECAX8BfiMAQRBrIgIkAAJAAkAgAS0AyAFBGUcNACACIAEQ/AwCQAJAIAIpAwBQRQ0AIAAgAigCCDYCCEICIQMMAQsgACACKQMANwMIIABBEGogAkEIaikDADcDAEIAIQMLIAAgAzcDAAwBCyACIAEQwwsCQAJAIAIpAwBQDQAgACACKQMANwMIIABBEGogAkEIaikDADcDAEIBIQMMAQsgACACKAIINgIIQgIhAwsgACADNwMACyACQRBqJAALrQEBAn8CQAJAIAFBA0sNACAAQX9qIQADQAJAIAENAEEBDwsgACABaiECIAFBf2ohASACLAAAQX9KDQALQQAhAwwBC0EAIQMgACgAAEGAgYKEeHENAEEEIABBA2pBfHEiAiAAayACIABGGyECIAFBfGohAQNAAkAgAiABSQ0AIAAgAWooAABBgIGChHhxRQ8LIAAgAmooAgBBgIGChHhxDQEgAkEEaiECDAALCyADC78BAQF/IwBBEGsiByQAIAAoAgAgASACIAAoAgQoAgwRDAAhAiAHQQA6AA0gByACOgAMIAcgADYCCCAHQQhqIAMgBCAFIAYQoQkhBiAHLQANIgIgBy0ADCIBciEAAkAgAkEBRw0AIAFBAXENAAJAIAYoAgAiAC0ACkGAAXENACAAKAIAQde1lwFBAiAAKAIEKAIMEQwAIQAMAQsgACgCAEGmxJsBQQEgACgCBCgCDBEMACEACyAHQRBqJAAgAEEBcQunAQEEfyAAKAIAIQIgACABEOkVAkAgACgCCCIBIAIgACgCDCIDa00NACAAKAIAIQQCQAJAIAIgAWsiBSADIAVrIgNNDQAgBCACayADTw0BCyAEIAVrIQICQCAFQQJ0IgNFDQAgACgCBCIFIAJBAnRqIAUgAUECdGogA/wKAAALIAAgAjYCCA8LIANBAnQiAUUNACAAKAIEIgAgAkECdGogACAB/AoAAAsL1AEBAX8jAEHAAGsiAiQAIAAoAgAhACACQfDpgwE2AjggAkGw64QBNgIwIAIgAEHgBGo2AiwgAkGg64QBNgIoIAIgAEHgAmo2AiQgAkGQ64QBNgIgIAIgAEHgAGo2AhwgAkHQ6YMBNgIYIAIgAEGEBWo2AhQgAkGA64QBNgIQIAIgAEGABWo2AgwgAkHw6oQBNgIIIAIgADYCBCACIABBiAVqNgI8IAIgAkE8ajYCNCABQbDshAFBA0H464QBQQcgAkEEakEHEP0JIQAgAkHAAGokACAAC7QBAQR/IwBBMGsiAiQAQQEhAwJAIAEoAgAiBEGz/IMBQQEgASgCBCIFKAIMEQwADQBBACEDIAAoAgAiAGgiAUEfSw0AA0AgAiABNgIMIAJBATYCFCACQaj8gwE2AhAgAkIBNwIcIAJBKjYCLCACIAJBKGo2AhggAiACQQxqNgIoAkAgBCAFIAJBEGoQzgVFDQBBASEDDAILIABBfiABd3EiAGgiAUEfTQ0ACwsgAkEwaiQAIAMLwwEBAn8jAEEgayICJAAgAkEAOgAQIAJC5ICAgKAfNwIIIAJCioCAgKABNwIAIAJBFGogAiABEJIBAkAgAigCFEGAgICAeEYNACACKAIcIgFFDQAgAUEEdCEDIAIoAhhBDGohAQNAIAFBADoAACABQRBqIQEgA0FwaiIDDQALCyACQRRqQQEQ2gECQAJAIAIoAhRBgICAgHhGDQAgACACKAIYIAIoAhwQgQ4MAQsgAEECOgAMCyACQRRqEPIbIAJBIGokAAu5AQECfyMAQcAAayICJAAgAiABNgIIIAJBADYCMCACQgA3AiggAiAAIAEgAkEoahDwCiIDNgIMAkAgASADIAAoAmRqIgNPDQAgAkEDNgIUIAJBvL2YATYCECACQgM3AhwgAkEcNgI8IAJBDjYCNCACQRw2AiwgAiAAQeQAajYCKCACIAJBKGo2AhggAiACQQhqNgI4IAIgAkEMajYCMCACQRBqQdS9mAEQhRsACyACQcAAaiQAIAEgA2sLugECAX8BfgJAAkACQAJAAkACQCAAKAIADgQBAgMEAAsgACkDECAAKAIYEJsUDwsgACkDCCICQgODQgBSDQMgAqciACAAKAIAIgFBf2o2AgAgAUEBRw0DIAAgACgCEBDBGw8LIABBCGoQpxAPCyAAKQMYIgJQDQEgAkIDg0IAUg0BIAKnIgAgACgCACIBQX9qNgIAIAFBAUcNASAAIAAoAhAQwRsPCyAAKAIEIgAQkAEgAEHAAEEIEJ4SCwu6AQIBfwF+AkACQAJAAkACQAJAIAAoAgAOBAECAwQACyAAKQMQIAAoAhgQoRQPCyAAKQMIIgJCA4NCAFINAyACpyIAIAAoAgAiAUF/ajYCACABQQFHDQMgACAAKAIQEMEbDwsgAEEIahCrEA8LIAApAxgiAlANASACQgODQgBSDQEgAqciACAAKAIAIgFBf2o2AgAgAUEBRw0BIAAgACgCEBDBGw8LIAAoAgQiABDJASAAQcAAQQgQnhILC84BAQF/IwBBwABrIgIkACAAKAIAIQAgAkHkk5oBNgI4IAJB1JOaATYCMCACIABBIGo2AiwgAkHw+5kBNgIoIAIgAEEqajYCJCACQfD7mQE2AiAgAiAAQSlqNgIcIAJB8PuZATYCGCACIABBKGo2AhQgAkG8/ZkBNgIQIAIgAEEIajYCDCACQfD3mQE2AgggAiAANgIEIAIgAEEkajYCPCACIAJBPGo2AjQgAUHElJoBQQtBjJSaAUEHIAJBBGpBBxD9CSEAIAJBwABqJAAgAAvOAQEBfyMAQcAAayICJAAgACgCACEAIAJB/JuaATYCOCACQbyDmgE2AjAgAiAAQRhqNgIsIAJBnI+aATYCKCACIAA2AiQgAkHw+5kBNgIgIAIgAEEhajYCHCACQfD7mQE2AhggAiAAQSBqNgIUIAJByP6ZATYCECACIABBDGo2AgwgAkHw95kBNgIIIAIgAEEQajYCBCACIABBHGo2AjwgAiACQTxqNgI0IAFBnJiaAUERQYycmgFBByACQQRqQQcQ/QkhACACQcAAaiQAIAAL0gEBAX8jAEHAAGsiAiQAIAAoAgAhACACQZj4mQE2AjggAkHMg5oBNgIwIAIgAEHRAGo2AiwgAkG4iJoBNgIoIAIgAEEgajYCJCACQaiImgE2AiAgAiAAQcAAajYCHCACQayDmgE2AhggAiAANgIUIAJBsPuZATYCECACIABBzABqNgIMIAJB8PeZATYCCCACIABBOGo2AgQgAiAAQdAAajYCPCACIAJBPGo2AjQgAUHqhpoBQQtByIiaAUEHIAJBBGpBBxD9CSEAIAJBwABqJAAgAAu6AQIBfwF+AkACQAJAAkACQAJAIAAoAgAOBAECAwQACyAAKQMQIAAoAhgQmxQPCyAAKQMIIgJCA4NCAFINAyACpyIAIAAoAgAiAUF/ajYCACABQQFHDQMgACAAKAIQEMEbDwsgAEEIahCnEA8LIAApAxgiAlANASACQgODQgBSDQEgAqciACAAKAIAIgFBf2o2AgAgAUEBRw0BIAAgACgCEBDBGw8LIAAoAgQiABDZASAAQcAAQQgQnhILC7gBAQR/AkAgACgCECIBRQ0AIAAoAhwiAiAAKAIUIgNrQThuIQQCQCACIANGDQADQCADEOMKAkAgA0EwaigCACICRQ0AIAIQ2QEgAkHAAEEIEJ4SCyADQThqIQMgBEF/aiIEDQALCyAAKAIYIAEQviALAkAgACgCAEUNACAAKAIEIgNFDQAgAxDZASADQcAAQQgQnhILAkAgACgCCEUNACAAKAIMIgNFDQAgAxDZASADQcAAQQgQnhILC7oBAgF/AX4CQAJAAkACQAJAAkAgACgCAA4EAQIDBAALIAApAxAgACgCGBCbFA8LIAApAwgiAkIDg0IAUg0DIAKnIgAgACgCACIBQX9qNgIAIAFBAUcNAyAAIAAoAhAQwRsPCyAAQQhqEKcQDwsgACkDGCICUA0BIAJCA4NCAFINASACpyIAIAAoAgAiAUF/ajYCACABQQFHDQEgACAAKAIQEMEbDwsgACgCBCIAEMEBIABBwABBCBCeEgsLpwECBX8CfkIBIAFCAYYiB30gByABQgBTGyEBIAAoAgghAgNAIABBAUECIAFCH4MiB0IghCAHIAFCBYciCEIAVRunQaz6mgFqLAAAIgNBf0oiBBsiBRDmGyAAKAIEIAAoAghqIQYCQCAEDQAgBiADQb8BcToAASADQcABcUEGdkFAciEDCyAGIAM6AAAgACAFIAJqIgI2AgggAUIfViEDIAghASADDQALC9UBAQJ/IwBBEGsiAiQAAkACQAJAAkACQAJAAkACQCABKAIADhMDAAACAAYGBgIEBgECAgMEBAUGAwsgASgCCCEDIAEoAgQhAQwGCyABKAIEIgEoAnwhAyABKAJ4IQEMBQsgASgCECEDIAEoAgwhAQwECyABKAIUIQMgASgCECEBDAMLIAEoAhghAyABKAIUIQEMAgsgAkEIaiABQQhqEPcLIAIoAgwhAyACKAIIIQEMAQsgASgCDCEDIAEoAgghAQsgACABNgIAIAAgAzYCBCACQRBqJAALqAEBAX8jAEEgayIDJAACQCABQf8BcUUNACADQRBqQgFCACABQX9qIgFB/wBxEIwSIAAgAUGAAXFBA3ZqIgEgASkDACADKQMQhDcDACABQQhqIgEgASkDACADKQMYhDcDAAsgA0IBQgAgAkH/AHEQjBIgACACQYABcUEDdmoiAiACKQMAIAMpAwCENwMAIAJBCGoiAiACKQMAIAMpAwiENwMAIANBIGokAAu4AQIDfwJ+IwBBEGsiAiQAIAIgASkDCCABKAIYELoYIAIpAwAhBSAAKAIYIQMgACACKAIINgIYIAApAxAhBiAAIAU3AxACQAJAIAEoAiAiAS0AJUECRg0AIAAgARCfDQwBCyAAIAEQ1gsLAkAgACkDECIFUA0AIAVCA4NCAFINACAFpyIBIAEoAgAiBEF/ajYCACAEQQFHDQAgASABKAIQEMEbCyAAIAM2AhggACAGNwMQIAJBEGokAAvNAQECfyMAQRBrIgIkAAJAAkAgAC0AAA0AIAAoAgQhAwJAIAAtAAFBAUYNACADKAIAKAIAQeLEmwFBARDvCAsgAEECOgABIAJBCGogAygCAEHCjZsBQQUQ/gUCQCACLQAIQQRGDQAgAikDCBCMHSEADAILIAMoAgAoAgBBocSbAUEBEO8IAkACQCABKAIAQYCAgIB4Rw0AIAMoAgAoAgBBiaSbAUEEEO8IDAELIAMgARDrDCIADQILQQAhAAwBCxDNHCEACyACQRBqJAAgAAvFAQECfyMAQTBrIgQkAAJAIAAtAABBAUYNACAAKAIEIQUCQCAALQABQQFGDQAgBSgCACgCAEHixJsBQQEQ7wgLIABBAjoAASAEQQhqIAUoAgAgASACEP4FAkACQCAELQAIQQRGDQAgBCkDCBCMHSEADAELIAUoAgAoAgBBocSbAUEBEO8IIAQgBEEIaiADEO0JIAUoAgAoAgAgBCgCACAEKAIEEO8IQQAhAAsgBEEwaiQAIAAPC0Gyo5sBQShBhIabARDdFwALvwEBBH8jAEEwayIBJABBACECAkACQAJAIAAtAMgBIgNBfWoOBAIBAQABCyAAEIcODAELIANBowFGDQAgAC0AyQFBAXENACAAKALEASECIAAoAsABIQQgAUEMaiADEN4bIAFBGGpBg5abAUEBEM8TIAFBLGogAUEUaigCADYCACABIAEpAgw3AiQgBCACIAFBGGoQhRUhAiAALQDIAUGiAUcNACAAEMcRIQMgABCHDiAAIAMQ5RELIAFBMGokACACC7gBAQF/IwBBIGsiBiQAIAYgASADIAQgBUEAQQAQnAVBAyEFIAYoAgAhBAJAAkAgBi0AFCIDQQNHDQAgACAENgIEDAELIAAgBikCBDcCDCAAIAYvABU7AB0gAEEUaiAGQQxqKQIANwIAIABBH2ogBkEXai0AADoAACAGKAIYIQUgACACNgIoIAAgBTYCICAAIAM6ABwgACAENgIIIAAgASgCvAE2AixBASEFCyAAIAU2AgAgBkEgaiQAC6UBAQV/IAAoAgAhASAAEMULAkAgACgCCCICIAEgACgCDCIDa00NACAAKAIAIQQCQAJAIAEgAmsiBSADIAVrIgNNDQAgBCABayADTw0BCyAEIAVrIQECQCAFQQJ0IgNFDQAgACgCBCIFIAFBAnRqIAUgAkECdGogA/wKAAALIAAgATYCCA8LIANBAnQiAkUNACAAKAIEIgAgAUECdGogACAC/AoAAAsLwgEBAn8jAEEgayICJAAgASgCACEDIAFBlYCAgHg2AgACQAJAIANBlYCAgHhGDQAgAkEIakEMaiABQQxqKAIANgIAIAIgASkCBDcCDCACIAM2AggCQAJAIANBgICAgHhHDQAgACACLQAMOgABIAJBCGoQ5hFBACEBDAELIAAgAkEIaiACQR9qQYCAgAEQ6ho2AgRBASEBCyAAIAE6AAAMAQtB4Y2AAUEQEKsYIQEgAEEBOgAAIAAgATYCBAsgAkEgaiQAC8QBAQF/QQAtAMDxnQEaAkBBChCFASIBDQAACyABQQQ6AAUgAUGACDsAACABQQA6AAkgAEEAOgBHIABBBDoAQyAAQQQ6AD8gAEEAOwA9IABBBDoAOSAAQQQ6ADUgAEEAOwAzIABBBDoALyAAQQQ6ACsgAEEAOwApIABBBDoAJSAAQQQ6ACEgAEEAOwAfIABBBDoAGyAAQQQ6ABcgAEEAOwAVIABBBDoAESAAQYAIOwEMIABBATYCCCAAIAE2AgQgAEEBNgIAC6ABAQN/IAJBA3EhAyAAIAJBDHEiBGohBSABIARqIQQDfwJAAkACQAJAIAJBA0sNAEEBIQICQCADQQFNDQAgBS8AACAELwAARw0CIANBfmohAyAEQQJqIQQgBUECaiEFCyADRQ0CIAUtAAAgBC0AAEYPCyAAKAAAIAEoAABGDQILQQAhAgsgAg8LIAJBfGohAiABQQRqIQEgAEEEaiEADAALC8YBAQJ/AkACQAJAAkACQAJAAkAgACgCAA4IBgECBgMEBQAGCyAAKAIIIgEgACgCDBDuGyAAKAIEIAEQsyAMBQsgACgCCCIBRQ0EIAAoAgQgAUEBEJ4SDwsgAEEEahDCGg8LIAAoAgwiABDzHSAAQRxBBBCeEg8LAkAgACgCDCIBRQ0AIAAoAhAiAkUNACABIAJBARCeEgsgACgCBCIAEPMdIABBHEEEEJ4SDwsgACgCCCIBIAAoAgwQ7hsgACgCBCABELMgDwsLwQEBAn8jAEEQayIFJABBEEEEEOcbIQYgBUEEaiADIAQQvxMgBkETOgAMIAZBCGogBUEEakEIaigCADYCACAGIAUpAgQ3AgBB0ABBBBDnGyIEIAI6AEwgBEEANgJIIARCgICAgMAANwJAIARCBDcCOCAEQgA3AjAgBEKAgICAwAA3AiggBEIENwIgIARCATcCGCAEIAY2AhQgBEEBNgIQIARBAjYCACAAQQE6AAggACAENgIEIAAgATYCACAFQRBqJAALsgEBAn8gACgCaCEDAkAgACgCeCIEQQhxRQ0AIAAgASADIAIQohMPCyABIAMgAhCFFSECAkAgBEECcUUNAAJAIAAoAkgiASAAKAJARw0AIABBwABqQeytmQEQsRYLIAAgAUEBajYCSCAAKAJEIAFBAnRqIAI2AgAPCwJAIAAoAlQiASAAKAJMRw0AIABBzABqQfytmQEQsRYLIAAgAUEBajYCVCAAKAJQIAFBAnRqIAI2AgAL7AEBAX9BACECAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABB/wFxQbR/ag5JAAsLCwsLCwsLCwsLCwsLCwsLCwsLCwELCwsLCwsLCwsLCwsLCwIKCgoKCgoKCgoKCgsKCgoJAwoKCgoKCgoKCgoEBQYHCgoKAQoLIAFBgAVxRQ0HDAoLIAFBCHFBA3YPCyABQYACcQ0IIAFBCHFBA3YPCyABQQhxDQcMBgsgAUEIcQ0GDAULIAFBCHENBQwECyABQQhxDQQMAwsgAUEIcQ0DDAILIAFBCHFBA3YhAgwBCyABQQhxDQELIAIPC0EBC70BAgN/An4jAEEgayICJAAgAkEIaiABIAEoAsABIgMgASgCxAEQqhcgAigCCCACKAIMEPUVIQUgAkEYaiABQRBqKQMANwMAIAEpAwghBiABQQo2AgggAiAGNwMQAkACQCAGpyIEQQpGDQAgBEEERg0BCyACQRBqEIoSQbKjmwFBKEGYwZsBEN0XAAsgAikDGCEGIAEQhw4gACADNgIIIAAgBTcDECAAIAY3AwAgACABKAK8ATYCDCACQSBqJAALzQEBAX8jAEHAAGsiAiQAIAJB8OmDATYCOCACQbDrhAE2AjAgAkGg64QBNgIoIAJBkOuEATYCICACQdDpgwE2AhggAkGA64QBNgIQIAJB8OqEATYCCCACIAA2AgQgAiAAQeAEajYCLCACIABB4AJqNgIkIAIgAEHgAGo2AhwgAiAAQYQFajYCFCACIABBgAVqNgIMIAIgAEGIBWo2AjwgAiACQTxqNgI0IAFBsOyEAUEDQfjrhAFBByACQQRqQQcQ/QkhACACQcAAaiQAIAALvwEBAX8jAEEQayICJAAgAUHoBGogACgCsAoQkxsCQAJAAkAgACgCyApBAkYNACABKALUBUGAgICAeEYNASABQQA2AugFCyABQdgEaiAAKALkCiAAKAKICxDFGiABQdgBaiAAEMoQAkAgACkDsA1CAoUgACkDuA2EUA0AIAEoAsgBQQJGDQIgAiABQRhqNgIMIAIgAEGwDWo2AgggAkEIahD6BwsgAkEQaiQADwtBnKCEARCbIAALQcyihAEQmyAAC6IBAQJ/AkACQCAAQQBIDQAgACECDAELIAFBLToAAEEAIABrIQIgAUEBaiEBCwJAIAJB4wBKDQACQCACQQlKDQAgASACQTBqOgAAIABBH3ZBAWoPCyABIAJBAXRBgMyYAWovAAA7AAAgAEEfdkECcg8LIAEgAkHkAG4iA0EwajoAACABIAIgA0HkAGxrQQF0QYDMmAFqLwAAOwABIABBH3ZBA2oLswEBBH8gAC0AJiECIABBADoAJiABKAIAIAAQxwQgAC0AJSEDIAEoAgQhAQJAIAAtACQiBA0AAkAgASgCAEF0aiIFQQcgBUEmSRtBe2oiBUEfSw0AQQEgBXRBrqKAgHhxDQEgBQ0AIAEtABFFDQELIABBAzoAJAsgACABEMYBIAEgABBSIAAgAzoAJSAAIAQ6ACQgACABEJsBIAAgAjoAJgJAIAEoAgBBGUcNACAAIAEQrgELC8cBAQF/IwBBwABrIgIkACACQeSTmgE2AjggAkHUk5oBNgIwIAJB8PuZATYCKCACQfD7mQE2AiAgAkHw+5kBNgIYIAJBvP2ZATYCECACQfD3mQE2AgggAiAANgIEIAIgAEEgajYCLCACIABBKmo2AiQgAiAAQSlqNgIcIAIgAEEoajYCFCACIABBCGo2AgwgAiAAQSRqNgI8IAIgAkE8ajYCNCABQcSUmgFBC0GMlJoBQQcgAkEEakEHEP0JIQAgAkHAAGokACAAC74BAQF/AkACQAJAAkAgACgCAA4EAwABAgMLIAAoAgRBAUcNAiABIAAoAggQjAEPCyAAKAIEIAEQpQMPCyAAKAIMIgJFDQAgAkEobCECIAAoAghBBGohAANAAkACQAJAAkACQCAAQXxqKAIADgUEAAECAwQLIAAoAgBBAUcNAyABIABBBGooAgAQjAEMAwsgASAAKAIAEIwBDAILIAAgARCBCQwBCyAAIAEQ7QYLIABBKGohACACQVhqIgINAAsLC7wBAQN/IAAoAgAiAkHAAGoQtBsgAkGQAWohAyACKAKEAUHYAGwhBCACKAKAASEAAkADQCAERQ0BAkACQAJAAkACQCAAKAIADgYEAQIDBAAECyAAQQRqIAEQyyEMAwsgAEEEaiABEJodDAILIABBBGogARCzDQwBCyAAQQRqIAEQ0RALIABB2ABqIQAgBEGof2ohBAwACwsgAigCeCABENkYIAMgARDREAJAIAItADxBBkYNACACQRBqELQbCwu7AQEEfyAAKAIAIgJBwABqIAEoAhQiAxCnGCACQZABaiEEIAIoAoQBQdgAbCEFIAIoAoABIQACQANAIAVFDQECQAJAAkACQAJAIAAoAgAOBgQBAgMEAAQLIABBBGogARDQIQwDCyAAQQRqIAEQnB0MAgsgAEEEaiABELQNDAELIABBBGogARDSEAsgAEHYAGohACAFQah/aiEFDAALCyAEIAEQ0hACQCACLQA8QQZGDQAgAkEQaiADEKcYCwuvAQEGfyAAQYgBaiECIAAoApABIgNBDGwgACgCjAEiBGpBdGohBSAAKAKIASEGIAEoAgAhBwNAAkACQAJAIAMNAEEAIQMMAQsgBSgCACAHTw0BCwJAIAMgBkcNACACEJIXIAAoAowBIQQLIAAgA0EBajYCkAEgBCADQQxsaiIDIAEpAgA3AgAgA0EIaiABQQhqKAIANgIADwsgACADQX9qIgM2ApABIAVBdGohBQwACwuxAQECfyMAQcAAayICJAAgASABKAJ4IgNB/3xxNgJ4IAIgAUEAEN0FIAEgAzYCeCACKAIAIQECQAJAIAItABQiA0ECRw0AIABBAjoAFCAAIAE2AgAMAQsgAkEgakEMaiACQQxqKQIANwIAIAJBIGpBHGogAkEcaigAADYAACACIAIpAgQ3AiQgAiACKQAVNwA1IAIgAzoANCACIAE2AiAgACACQSBqEJ4UCyACQcAAaiQAC5sBAQZ/QQAhAwJAIABFDQADQCAAQQRqIQQgAC8BMiIFQQJ0IQZBfyEHAkACQANAAkAgBg0AIAUhBwwCCyAEKAIAIQggB0EBaiEHIAZBfGohBiAEQQRqIQQgAiAISyACIAhJa0H/AXEiCEEBRg0ACyAIRQ0BCyABRQ0CIAFBf2ohASAAIAdBAnRqKAI0IQAMAQsLIABBNGohAwsgAwuwAQECfyMAQSBrIgIkACABQRAgAUEQSxshAwJAAkAgAUH+//8HSw0AIAIgA0F/c0EfdiADQYDQmAEQiRo2AhggAkEBNgIUIAJBADYCHCACQQhqIAJBFGpB8NKAARCuFSACKAIIIgEgASACKAIMakF/akEAIAFrcRDVHyIBDQEACyADEMEOIQELIAAgATYCBCAAIANB////ByADQf///wdJG0GAgIBwcjYCACACQSBqJAALsgEBA38jAEGAIGsiAiQAAkACQAJAAkAgAUHAhD0gAUHAhD1JGyIDIAEgAUEBdmsiBCADIARLGyIDQYEESQ0AIARB/////wFLDQIgA0EDdCIEQf3///8HTw0CQQAtAMDxnQEaIAQQhQEiBEUNAyAAIAEgBCADIAFBwQBJEK0CIAMgBEEEQQgQwBEMAQsgACABIAJBgAQgAUHBAEkQrQILIAJBgCBqJAAPC0Gk15sBENMZCwALrQEBA38jAEHgAGsiAyQAAkACQAJAIAEoAgAiBCgCXCIFQX9GDQAgBUEBaiEBDAELIANBADYCRCADQQRqIAEoAgQgASgCCCACIANBxABqENEMIAMoAgghASADKAIEIgVBIkYNAAJAQThFDQAgAEEIaiADQQRqQQhqQTj8CgAACyAAIAE2AgQgACAFNgIADAELIAAgATYCBCAEIAE2AlwgAEEiNgIACyADQeAAaiQAC7wBAQF/IwBBEGsiAiQAAkACQAJAAkACQCAAKAIAIgAoAgAOBAABAgMACyACIABBCGo2AgwgAUG11psBQQUgAkEMakHBAhCkCyEADAMLIAIgAEEEajYCDCABQbrWmwFBBSACQQxqQcICEKQLIQAMAgsgAiAAQQRqNgIMIAFBv9abAUEEIAJBDGpBwwIQpAshAAwBCyACIABBBGo2AgwgAUHD1psBQQYgAkEMakHEAhCkCyEACyACQRBqJAAgAAu8AQEBfyMAQRBrIgIkAAJAAkACQAJAAkAgACgCACIAKAIADgQAAQIDAAsgAiAAQQhqNgIMIAFB1PeZAUEDIAJBDGpBhwMQpAshAAwDCyACIABBBGo2AgwgAUG5hpoBQRAgAkEMakHWBBCkCyEADAILIAIgAEEEajYCDCABQa75mQFBCiACQQxqQekCEKQLIQAMAQsgAiAAQQRqNgIMIAFBuPmZAUELIAJBDGpB6gIQpAshAAsgAkEQaiQAIAALuwEBAX8CQCAAKAIAIgFBBEYNAAJAAkACQCABDgQDAAECAwsgACgCBEEBRw0CIAAoAggQtQEPCyAAKAIEEMYCDwsgACgCDCIBRQ0AIAFBKGwhASAAKAIIQQRqIQADQAJAAkACQAJAAkAgAEF8aigCAA4FBAABAgMECyAAKAIAQQFHDQMgAEEEaigCABC1AQwDCyAAKAIAELUBDAILIAAQpQcMAQsgABDkBQsgAEEoaiEAIAFBWGoiAQ0ACwsLtQEAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgAODAABAgMEBQYHCAkLCgsLIABBCGoQsx8PCyAAQQhqEPUfDwsgAEEIahD2HA8LIABBBGoQ6x4PCyAAQQRqEPwaDwsgAEEEahD3Hw8LIABBBGoQ9x8PCyAAQQRqEOseDwsgAEEEahD3Hw8LIABBBGoQ1yAPCwJAAkAgACgCBA4CAAECCyAAQQhqEPgfDwsgAEEIahD5HwsLsQECAX8BfiMAQRBrIgYkAAJAAkACQCAFRQ0AIAEgAhCsBQJAIAEtAExBAUcNACAGQQhqIAEQ7RICQCAGLQAIQQRGDQAgBikDCCIHQv8Bg0IEUg0DCyABQQA6AEwgASgCACECIAFBADYCACACQQFHDQAgASABKAIEEKwFCyABKAI0IAQgBRDaHyABIAQgBRC1BiABIAMQrAULIABBBDoAAAwBCyAAIAc3AgALIAZBEGokAAuxAQICfwF+IwBBEGsiBCQAAkACQAJAIANFDQACQCABLQBMQQFHDQAgBEEIaiABEO0SAkAgBC0ACEEERg0AIAQpAwgiBkL/AYNCBFINAwsgAUEAOgBMIAEoAgAhBSABQQA2AgAgBUEBRw0AIAEgASgCBBCsBQsgAUEAEKwFIAEoAjQgAiADENofIAEgAiADELUGIAFBABCsBQsgAEEEOgAADAELIAAgBjcCAAsgBEEQaiQAC6UBAQR/IwBBIGsiAiQAAkAgACgCACIDQQF0IgRBCCAEQQhLGyIEQQBODQBBAEEAIAEQqh4AC0EAIQUCQCADRQ0AIAIgAzYCHCACIAAoAgQ2AhRBASEFCyACIAU2AhggAkEIaiAEIAJBFGoQ2RICQCACKAIIQQFHDQAgAigCDCACKAIQIAEQqh4ACyACKAIMIQMgACAENgIAIAAgAzYCBCACQSBqJAALrAEBA38jAEGAIGsiAiQAAkACQAJAIAFBoMIeIAFBoMIeSRsiAyABIAFBAXZrIgQgAyAESxsiA0GBAkkNACACIANBBEEQEM0NIAIoAgQhAyACKAIAQQFGDQIgACABIAIoAggiBCADIAFBwQBJEPgBIARBABDtGSADIAQQtSAMAQsgACABIAJBgAIgAUHBAEkQ+AELIAJBgCBqJAAPCyADIAIoAghBpNebARCqHgALtQECAn8BfiAAKAIIIQECQAJAIAAoAhQiAkUNACAAIAJBf2oiAjYCFCAAKAIQIAJBDGxqKQIAIgOnQYCAgIB4Rg0AAkAgASAAKAIARw0AIABBhMeEARDqFQsgACgCBCICIAFBDGxqIAM3AgAMAQsCQCABIAAoAgBHDQAgAEGUx4QBEOoVCyAAKAIEIgIgAUEMbGpCgICAgMAANwIACyAAIAFBAWo2AgggAiABQQxsakEANgIIIAELnwEBBH8CQAJAIABB/wFLDQBBASEBIABB3wFxQb9/akH/AXFBGkkNASAAQd8ARg0BIABBUGpB/wFxQQpJDQELQQAhAUGDBiECA0AgASACQQF2IgMgAWoiBCAEQQN0Qby2iAFqKAIAIABLGyEBIAIgA2siAkEBSw0ACyABQQN0IgFBvLaIAWooAgAgAE0gACABQcC2iAFqKAIATXEhAQsgAQu+AQEDfyMAQSBrIgIkACACQgAQmAsCQAJAIAIoAgBBhICAgHhHDQBBAC0AwPGdARogAigCBCEDQRgQhQEiBEUNASAEIAM2AgggBEKBgICAEDcCACAEIAEpAgA3AgwgBEEUaiABQQhqKAIANgIAIABBjJeEATYCBCAAIAQ2AgAgAkEgaiQADwsgAkEQakEIaiACQQhqKQMANwMAIAIgAikDADcDEEHUpJsBQSsgAkEQakHI6IMBQfyWhAEQ6A8LAAu0AQECfyMAQRBrIgQkAAJAAkAgAS0ArA1BAUYNAAJAAkACQCABKQMAQgKFIAEpAwiEUA0AIAIoAsgEQQJGDQQgBCABIAJB2AFqIAMQ8gMgBCgCACIFQQJHDQEgBCgCBBC1EBoLIAAgASACIAMQvwQMAQsgBCgCBCEBIAAgBCkCCDcCCCAAIAE2AgQgACAFNgIACyAEQRBqJAAPC0Gyo5sBQShBzKGEARDdFwALQdyghAEQmyAAC68BAQR/IwBBIGsiAyQAAkACQCABDQAgAkEBQQAQ7QUhBAwBCyADIAE2AgwgAyAANgIIIAIoAgQhACACKAIAIQUCQANAIANBEGogA0EIahCHBiADKAIQIgFFDQEgAygCFCEGAkAgAygCHA0AIAIgASAGEO0FIQQMAwtBASEEIAUgASAGIAAoAgwRDAANAiAFQf3/AyAAKAIQEQgARQ0ADAILC0EAIQQLIANBIGokACAEC6cBAQJ/IAAoAgQhAiABIAAoAggiAxCYISADQQN0IQMCQANAIANFDQEgAigCACACQQRqKAIAIAEQ5R8gA0F4aiEDIAJBCGohAgwACwsgACgCECECIAEgACgCFCIDEJghIANBFGwhAwJAA0AgA0UNASACKAIMIAJBEGooAgAgARDlHyACQQRqKAIAIAJBCGooAgAgARCfHyADQWxqIQMgAkEUaiECDAALCwuqAQICfwF+AkACQCAAKAIAIgEtACVBAkcNACABQQRqKAIAIQACQCABKAIIIgJFDQADQCAAEOoGIABBOGohACACQX9qIgINAAsgAUEEaigCACEACyABKAIAIABBCEE4EK8RDAELAkAgASkDCCIDQgODQgBSDQAgA6ciACAAKAIAIgJBf2o2AgAgAkEBRw0AIAAgACgCEBDBGwsgAUEgahDJDQsgAUEoQQgQnhILvwEAAkAgASACQcSgmwFBCBCZHEUNAEHzAA8LAkAgASACQaLEmwFBAhCZHEUNAEH1AA8LAkAgASACQYTLmwFBBRCZHEUNAEHMAA8LAkAgASACQZK4mwFBBRCZHEUNAEH4AA8LAkAgASACQbHGmwFBBhCZHEUNAEH3AA8LAkAgASACQanFmwFBBxCZHEUNAEH2AA8LAkAgASACQZmkmwFBAxCZHEUNAEH0AA8LQZx/QaR/IAEgAkG8zZsBQQgQmRwbC6cBAQV/IwBBEGsiAyQAAkAgAUUNACABQQR0IQQgAEEMaiEBIAJBLGohBSACLQB5IQYgAi0AKCEHA0AgAkEAOgB5IAJBADoAKAJAIAEoAgAiACgCAEEaRw0AIAMgACkDCCAAQRhqKAIAELoYIAUgAykDACADKAIIENEKCyAAIAIQdyACIAc6ACggAiAGOgB5IAFBEGohASAEQXBqIgQNAAsLIANBEGokAAuoAQICfwF+AkACQAJAIAIgA2pBf2pBACACa3GtIAGtfiIGQiCIpw0AIAanIgRBgICAgHggAmtNDQELIABBADYCBEEBIQMMAQsCQCAEDQAgACACNgIIQQAhAyAAQQA2AgQMAQtBACEDQQAtAMDxnQEaAkAgBCACEIYdIgVFDQAgACAFNgIIIAAgATYCBAwBCyAAIAQ2AgggACACNgIEQQEhAwsgACADNgIAC6gBAgJ/AX4CQAJAAkAgAiADakF/akEAIAJrca0gAa1+IgZCIIinDQAgBqciBEGAgICAeCACa00NAQsgAEEANgIEQQEhAwwBCwJAIAQNACAAIAI2AghBACEDIABBADYCBAwBC0EAIQNBAC0AwPGdARoCQCAEIAIQhh0iBUUNACAAIAU2AgggACABNgIEDAELIAAgBDYCCCAAIAI2AgRBASEDCyAAIAM2AgALogEBBH8CQCABKAIEIgIgASgCACIDa0ECdiIEIAAoAgAgACgCCCIFa00NACAAIAUgBEEEQQwQoBcgACgCCCEFCwJAIAMgAkYNACABKAIIIQQgACgCBCAFQQxsaiEBA0AgAUEIaiAEKAIANgIAIAFBADYCACABQQRqIAJBfGoiAigCADYCACABQQxqIQEgBUEBaiEFIAIgA0cNAAsLIAAgBTYCCAu+AQECfyMAQTBrIgIkACACQgA3AiggAkIENwIgIAJCADcCGCACQgQ3AhAgAkIANwIIIAJCgICAgMAANwIAIAIgARCkCAJAQTBFIgMNACAAQQxqIAJBMPwKAAALIAJCADcCKCACQgQ3AiAgAkIANwIYIAJCBDcCECACQgA3AgggAkKAgICAwAA3AgAgAiABEKQIAkAgAw0AIABBPGogAkEw/AoAAAsgAEEANgIIIABCgICAgMAANwIAIAJBMGokAAu7AQECfwJAAkACQAJAAkAgASgCCA4CAQIACwJAQSRFDQAgAEEEaiABQST8CgAACyAAQYeAxAA2AgAPCyAAQYCAxAA2AgAgACABKQIMNwIEIABBFGogAUEcaikCADcCACAAQQxqIAFBFGopAgA3AgAMAQsgAUEANgIIIAEoAgQiAigCACIDQYiAxABGDQEgACADNgIAQdQARQ0AIABBBGogAkEEakHUAPwKAAALIAEQ5xcPC0HYnIUBEJsgAAusAQICfwF+IwBBEGsiAyQAAkACQAJAAkAgASgCCCIEIAEoAgRPDQAgASgCACAEai0AACACQf8BcUYNAQsgAEIANwMIDAELQQEhAiABIARBAWo2AgggAyABEOkHAkAgAy0AAA0A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fgJAAkAgAa0gAq1+IgVCIIinDQAgBaciAUF4Sw0AIAFBB2pBeHEiASACQQhqaiIDIAFJDQAgA0H4////B0sNAEEALQDA8Z0BGiADEIUBIgNFDQEgAEEANgIMIAAgAkF/aiIENgIEIAAgAyABajYCACAAIAQgAkEDdkEHbCACQQlJGzYCCA8LENkZCwALnwEBA38jAEGQA2siAyQAIAMgASACELQDAkACQCADKAIAQYeAgIB4Rg0AAkACQCACDQBBACEEDAELIAFBCGooAgAhBCACQQFGDQAgAUEYaiEBIAJBf2pB/////wBxIQIDQCABKAIAIgUgBCAFIARLGyEEIAFBEGohASACQX9qIgINAAsLIAAgAyAEEL0GDAELIABBAjoADAsgA0GQA2okAAucAQEBfwJAAkACQAJAIAUgBEkNACAFIANLDQEgBSAERg0CIAUgBGshBiACIARqIQNBACEFAkADQCABIAMgBWotAABqLQAADQEgBiAFQQFqIgVGDQQMAAsLIAAgBSAEaiIBNgIEQQEhBSAAIAFBAWo2AggMAwsgBCAFQczUhAEQqSAACyAFIANBzNSEARCPIAALQQAhBQsgACAFNgIAC5UBAQJ+AkAgASgCAEEAIAJrQShsaiICQVhqKQMAIgNCA4NCAFINACADpykDCCEDCyACQWBqKAIAIQECQCACQWhqKQMAIgRCA4NCAFINACAEpykDCCEECyADp0Hdy92eeWwgA0IgiKdqQd3L3Z55bCABakHdy92eeWwgBKdqQd3L3Z55bCAEQiCIp2pB3cvdnnlsQQ93rQuSAQEBf0H/ASEFAkAgA0H/AXFFDQBBf0EAIANrQQdxdEF/cyADQQdxdCEFCyAAQQg6AA4gACADOgANIAAgBToADCAAIAE2AgggACAEOgAWIABBADoAFSAAIAJBfmo2AgQgACABQQFqNgIAIAAgASACakF/ajYCECAAQX9BfyAEQQdxdEF/cyAEQf8BcUEIRhs6ABQLoQEAIABBADoAGCAAQX82AhQgACAGNgIQIAAgBTYCDCAAIAQ2AgggACADNgIEIAAgAjYCAAJAIAEoAhQiBiABKAIMRw0AIAFBDGpB5IebARCMFwsgASAGQQFqNgIUIAEoAhAgBkEcbGoiASAAKQIANwIAIAFBCGogAEEIaikCADcCACABQRBqIABBEGopAgA3AgAgAUEYaiAAQRhqKAIANgIAC58BAQF/IwBBIGsiAiQAAkACQAJAIAEtABRBAkYNACACIAAgASABKAIYEJAHIAItABRBA0cNASABLQAUQQJGDQAgACgCFCABEPwNGgsgASgCGCAAEK8HDAELIAEQgx4gAUEYaiACQRhqKQMANwMAIAFBEGogAkEQaikDADcDACABQQhqIAJBCGopAwA3AwAgASACKQMANwMACyACQSBqJAALqwEBAn8jAEEgayIBJAAgACgCmAEhAiAAQQs2ApgBAkACQCACQQtGDQAgAUEIaiAAQbABaigCADYCACABQRxqIABBpAFqKAIANgIAIAEgAjYCECABIAApAqgBNwMAIAEgACkCnAE3AhQgACABQRBqEMUZDAELIAEgABD5HAsgACAAKQPAATcDuAEgACABKQMANwLAASAAQcgBaiABQQhqKAIANgIAIAFBIGokAAujAQICfwF+IwBBEGsiBCQAAkACQAJAIANFDQACQCABLQBMQQFHDQAgBEEIaiABEO0SAkAgBC0ACEEERg0AIAQpAwgiBkL/AYNCBFINAwsgAUEAOgBMIAEoAgAhBSABQQA2AgAgBUEBRw0AIAEgASgCBBCsBQsgASgCNCACIAMQ2h8gASACIAMQtQYLIABBBDoAAAwBCyAAIAY3AgALIARBEGokAAucAQEEfyMAQRBrIgIkAAJAAkAgAS0ABEUNAEECIQMMAQsgASgCABAeIQQgAkEIahDCG0EBIQMgAigCDCAEIAIoAghBAXEiBRshBAJAIAVFDQAgAUEBOgAEIAQhAQwBCwJAAkAgBBAfDQBBACEDIAQQICEBDAELIAFBAToABEECIQMLIAQQkh8LIAAgATYCBCAAIAM2AgAgAkEQaiQAC7IBAQN/IwBBIGsiAyQAIANCABCYCwJAAkAgAygCAEGEgICAeEcNAEEALQDA8Z0BGiADKAIEIQRBEBCFASIFRQ0BIAUgAjoADSAFIAE6AAwgBSAENgIIIAVCgYCAgBA3AgAgAEH8l4QBNgIEIAAgBTYCACADQSBqJAAPCyADQRBqQQhqIANBCGopAwA3AwAgAyADKQMANwMQQdSkmwFBKyADQRBqQcjogwFB/JaEARDoDwsAC5UBAgF/An4gACAAKAI4QQFqNgI4IAAgAa1C/wGDIgMgACgCPCIBQQN0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aiECAkACQCAAKAIADQAgAikDACIEQgODQgBSDQEgBKciAiACKAIAIgNBf2o2AgAgA0EBRw0BIAIgAigCEBDBGwwBCyACEKcQCwJAIABBKGooAgAiAkUNACACEJABIAJBwABBCBCeEgsgAEEwaiEAIAFBf2oiAQ0ACwsLowECAX8BfiMAQRBrIgIkAAJAAkACQAJAIAAoAgAiACkDAEJ+fCIDQgIgA0ICVBunDgMAAQIACyACIABBCGo2AgQgAUHimZoBQQkgAkEEakGgBBCkCyEADAILIAIgAEEIajYCCCABQeuZmgFBByACQQhqQaEEEKQLIQAMAQsgAiAANgIMIAFB8pmaAUEFIAJBDGpBogQQpAshAAsgAkEQaiQAIAAL0wEBAn9BACECQQAhAwJAIAC9Qv///////////wCDQv/////////3/wBVDQAgAJ0iACAARAAAAAAAAPA9op1EAAAAAAAA8EGioSAApiIARAAAAAAAAPBBoCAAIABEAAAAAAAAAABjG/wDIQMLAkAgAb1C////////////AINC//////////f/AFUNACABnSIAIABEAAAAAAAA8D2inUQAAAAAAADwQaKhIACmIgBEAAAAAAAA8EGgIAAgAEQAAAAAAAAAAGMb/ANBH3EhAgsgAyACdLcL0wEBAn9BACECQQAhAwJAIAC9Qv///////////wCDQv/////////3/wBVDQAgAJ0iACAARAAAAAAAAPA9op1EAAAAAAAA8EGioSAApiIARAAAAAAAAPBBoCAAIABEAAAAAAAAAABjG/wDIQMLAkAgAb1C////////////AINC//////////f/AFUNACABnSIAIABEAAAAAAAA8D2inUQAAAAAAADwQaKhIACmIgBEAAAAAAAA8EGgIAAgAEQAAAAAAAAAAGMb/ANBH3EhAgsgAyACdbcL0wEBAn9BACECQQAhAwJAIAC9Qv///////////wCDQv/////////3/wBVDQAgAJ0iACAARAAAAAAAAPA9op1EAAAAAAAA8EGioSAApiIARAAAAAAAAPBBoCAAIABEAAAAAAAAAABjG/wDIQMLAkAgAb1C////////////AINC//////////f/AFUNACABnSIAIABEAAAAAAAA8D2inUQAAAAAAADwQaKhIACmIgBEAAAAAAAA8EGgIAAg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crcL0AEBAn9BACECQQAhAwJAIAC9Qv///////////wCDQv/////////3/wBVDQAgAJ0iACAARAAAAAAAAPA9op1EAAAAAAAA8EGioSAApiIARAAAAAAAAPBBoCAAIABEAAAAAAAAAABjG/wDIQMLAkAgAb1C////////////AINC//////////f/AFUNACABnSIAIABEAAAAAAAA8D2inUQAAAAAAADwQaKhIACmIgBEAAAAAAAA8EGgIAAgAEQAAAAAAAAAAGMb/AMhAgsgAiADc7cL0AEBAn9BACECQQAhAwJAIAC9Qv///////////wCDQv/////////3/wBVDQAgAJ0iACAARAAAAAAAAPA9op1EAAAAAAAA8EGioSAApiIARAAAAAAAAPBBoCAAIABEAAAAAAAAAABjG/wDIQMLAkAgAb1C////////////AINC//////////f/AFUNACABnSIAIABEAAAAAAAA8D2inUQAAAAAAADwQaKhIACmIgBEAAAAAAAA8EGgIAAgAEQAAAAAAAAAAGMb/AMhAgsgAiADcbcLjQEBBH8jAEEQayIDJAAgA0EIaiAAKAIAIgQgACgCBCABELUVIAMoAgghBSADLQAMIQYgACAAKAIMQQFqNgIMIAAgACgCCCAGQQFxazYCCCAEQQAgBWtBGGxqQWhqIgAgAikDADcDACAAQQhqIAJBCGopAwA3AwAgAEEQaiACQRBqKQMANwMAIANBEGokAAuYAQECfyMAQRBrIgYkAEEAIQcCQAJAAkAgAS0AyAFBhAFHDQAgARCHDiAGQQhqIAFBACABKALAARDwDSAGKAIMIQcgBigCCEEBcQ0BCyAAIAc2AiAgACACNgIYIABBAjoAFCAAIAEoArwBNgIcIAAgBa1CIIYgBK2ENwMADAELIAAgBzYCAEECIQMLIAAgAzoAJCAGQRBqJAALrAEBAn8jAEEgayIBJAACQAJAQQAoAujwnQENAAJAAkAgAEUNACAAKAIAIQIgAEEANgIAIAJFDQAgACgCBCEADAELQQBBACgC/OOdASIAQQFqNgL8450BIABFDQILQQAgADYC7PCdAUEAQQE2AujwnQELIAFBIGokAEHs8J0BDwsgAUEANgIYIAFBATYCDCABQdz3hAE2AgggAUIENwIQIAFBCGpB5PeEARCFGwALnwEBA38g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AEEoahDoHg8LIAAQkRcgAEEgahDyHiAAQegAahDwHiAAQcgAahDoHguUAQEDfyAAQRxqEN8VIAAoAgwgACgCEBDVGiAAKAIIIQEgACgCBCICIQMCQANAIAFFDQEgAykDABDGHSABQX9qIQEgA0EYaiEDDAALCyAAKAIAIAIQvSAgACgCNCEBIAAoAjAiAiEDAkADQCABRQ0BIAFBf2ohASADEI8PIANBPGohAwwACwsgACgCLCACQQRBPBCvEQuRAQEEfyMAQSBrIgIkACACQQhqQRBqIgMgAUEsaigCADYCACACQQhqQQhqIgQgAUEkaikCADcDACACIAEpAhw3AwhBFEEEEPseIgVBEGogAygCADYCACAFQQhqIAQpAwA3AgAgBSACKQMINwIAIAFBBGoQqx0gARDoISAAQbjdmwE2AgQgACAFNgIAIAJBIGokAAuCAQIBfwF+AkACQCABrSADrX4iBUIgiKcNACAFpyIBIAJBf2pqIgQgAUkNACAEQQAgAmtxIgEgA0EIamoiAyABSQ0BAkAgA0GAgICAeCACa0sNACAAIAE2AgggACADNgIEIAAgAjYCAA8LIABBADYCAA8LIABBADYCAA8LIABBADYCAAuFAQICfwF+IwBBEGsiBCQAIARBCGpBfyACIANqIgMgAyACSRsiA0H/////ByACrUIDfiIGp0EBdiAGQiCIpxsiBSADIAVLGxC4DSAEKAIIIQUgBCgCDCEDAkAgAkUNACADIAEgAvwKAAALIAAgBTYCCCAAIAI2AgQgACADNgIAIARBEGokAAuSAQEEfyMAQRBrIgMkAAJAAkAgASgCACIEIAIoAgAiBU8NACADQQhqIAJBCGooAgA2AgAgAyACKQIANwMAIAAgAyABKAIEIgYgASgCCBDSCwwBCyADQQhqIAFBCGooAgA2AgAgAyABKQIANwMAIAAgAyACKAIEIgYgAigCCBDSCyAFIQQLIAQgBhCxICADQRBqJAALiQEAAkACQCABQYABSQ0AAkAgAUGAEE8NACACIAFBP3FBgAFyOgABIAIgAUEGdkHAAXI6AABBAiEBDAILIAIgAUE/cUGAAXI6AAIgAiABQQx2QeABcjoAACACIAFBBnZBP3FBgAFyOgABQQMhAQwBCyACIAE6AABBASEBCyAAIAE2AgQgACACNgIAC4QBAgJ/AX4g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RkEfdDYC1AUgAEECNgLIAQuZAQECfyABKAKkDSgCxAIiAiACKAIAIgNBAWo2AgACQCADQX9KDQAACyAAIAIQkRQgAEHoBGogASgCsAoQzw0gASgCyAohAiAAQdgEaiABKALkCiABKAKICxDZDyAAQdgBaiABEP8MIABCADcD6AUgAEKAgICAwAA3A+AFIABCBDcD2AUgACACQQJGQR90NgLUBSAAQQI2AsgBC5kBAQJ/IAEoAqQNKALEAiICIAIoAgAiA0EBajYCAAJAIANBf0oNAAALIAAgAhCRFCAAQegEaiABKAKwChDPDSABKALICiECIABB2ARqIAEoAuQKIAEoAogLENkPIABB2AFqIAEQ/wwgAEIANwPoBSAAQoCAgIDAADcD4AUgAEIENwPYBSAAIAJBAkZBH3Q2AtQFIABBAjYCyAELgQEBBn8CQCABRQ0AQQAhAgNAIAAgAkEGdGoiA0E0aiIEKAIAIQUCQCADKAI4IgZFDQADQCAFKAIAIgcQkAEgB0HAAEEIEJ4SIAVBDGohBSAGQX9qIgYNAAsgBCgCACEFCyADKAIwIAVBBEEMEK8RIAMQ2AcgAkEBaiICIAFHDQALCwuXAQICfwF8IwBBMGsiAiQAAkACQCABKwMAIgREAAAAAAAAAABhDQACQAJAIAS9Qv///////////wCDQv/////////3/wBVDQAgBCACQRdqEPcBIAJBF2prIQEgAkEXaiEDDAELIAJBCGogBBCzGCACKAIMIQEgAigCCCEDCyAAIAMgARCfFAwBCyAAIAEQzRALIAJBMGokAAt6AQJ/IAAoAgAhAQJAIAAoAgQiACgCACICRQ0AIAEgACgCCEF/akF4cWpBCGogAhEDAAsCQCABQX9GDQAgASABKAIEIgJBf2o2AgQgAkEBRw0AIAEgACgCCCICQQQgAkEESxsiAiACIAAoAgRqQQdqQQAgAmtxEKMeCwuRAQEDfwJAAkBBACgC4PCdASICRQ0AIAEoAhAiAyACENUSIgJBDGooAgAiBEkNASADIARB3PaZARCzEQALQeCQmwFByABBiJKbARCMIQALIAJBCGooAgAgA0EDdGooAgAhAyACQQA6AAACQCADIAAoAixHDQAgAUEANgIQCyAAQQE6ADogACABEJcQIABBADoAOguQAQECfwJAAkACQAJAIAEoAgAi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IABBKGohACACQVhqIQIMAAsLC3oBAX8gACgCCEEobCECIAAoAgQhAAJAA0AgAkUNAQJAAkACQAJAAkAgACgCAA4FBAABAgMECyAAQQRqIAEQnB0MAwsgAEEEaiABENAhDAILIABBBGogARC0DQwBCyAAQQRqIAEQ0hALIABBKGohACACQVhqIQIMAAsLC3oBAX8gACgCCEEobCECIAAoAgQhAAJAA0AgAkUNAQJAAkACQAJAAkAgACgCAA4FBAABAgMECyAAQQRqIAEQoR0MAwsgAEEEaiABEKsEDAILIABBBGogARDfDQwBCyAAQQRqIAEQ0xALIABBKGohACACQVhqIQIMAAsLC3YBAX8gACgCCEE4bCECIAAoAgQhAANAAkACQCACRQ0AAkACQAJAIAAoAgAOAwABAgALIABBCGogARCjHSAAQShqIAEQ3CEMAwsgASAAQTBqEPMeDAILIABBBGogARDcIQwBCw8LIABBOGohACACQUhqIQIMAAsLdAIFfwF+IAAoAgQhAQJAIAAoAggiAkUNACABIQMDQAJAIAMpAwAiBkIDg0IAUg0AIAanIgQgBCgCACIFQX9qNgIAIAVBAUcNACAEIAQoAhAQwRsLIANBCGohAyACQX9qIgINAAsLIAAoAgAgAUEIQQgQrxELhgEBAX8jAEEgayICJAAgAkEANgIIIAJCgICAgBA3AgAgAkHgz5sBNgIQIAJCoICAgA43AhQgAiACNgIMAkAgASACQQxqEPkaRQ0AQfjPmwFBNyACQR9qQcSkmwFBsNCbARDoDwALIAAgAikCADcCACAAQQhqIAJBCGooAgA2AgAgAkEgaiQAC3YCA38BfiMAQRBrIgMkACABKAIUIQQgASgCECEFIAMgAUEIahD+ESADQQhqIAIgBSAEIAMoAgAgAygCBBC/DQJAAkAgAy0ACEEERg0AIAMpAwgiBkL/AYNCBFENACAAIAY3AgAMAQsgAEEEOgAACyADQRBqJAALhgEBAX8jAEEgayICJAAgAkEANgIIIAJCgICAgBA3AgAgAkHgz5sBNgIQIAJCoICAgA43AhQgAiACNgIMAkAgASACQQxqEMIhRQ0AQfjPmwFBNyACQR9qQcSkmwFBsNCbARDoDwALIAAgAikCADcCACAAQQhqIAJBCGooAgA2AgAgAkEgaiQAC3kBAX8jAEEQ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ATYCBCACIAA2AgwgAkEEakGM35sBQQcgAkEMakGWBRChCUGgq5sBQQYgAEEIakGYBRChCRC0ESEBIAJBEGokACABC2wBA38jAEEQayIBJAACQAJAIAAoAgAiAg0AQQAhAiABQQxqIQAMAQsgACgCBCEDIAFBATYCDCABQQhqIQALIAAgAjYCAAJAIAEoAgwiAEUNACABKAIIIgJFDQAgAyACIAAQnhILIAFBEGokAAtnAQF/IwBBEGsiBCQAAkACQCAADQBBACEAIARBDGohAwwBCyAEIAI2AgwgACADbCEAIARBCGohAwsgAyAANgIAAkAgBCgCDCIARQ0AIAQoAggiA0UNACABIAMgABCeEgsgBEEQaiQAC2cBAX8jAEEQayIEJAACQAJAIAANAEEAIQAgBEEMaiEDDAELIAQgAjYCDCAAIANsIQAgBEEIaiEDCyADIAA2AgACQCAEKAIMIgBFDQAgBCgCCCIDRQ0AIAEgAyAAEJ4SCyAEQRBqJAALagEBfwJAIAAoAggiAiAAKAIARw0AIAAQ4RULIAAgAkEBajYCCCAAKAIEIAJBBXRqIgAgASkDADcDACAAQQhqIAFBCGopAwA3AwAgAEEQaiABQRBqKQMANwMAIABBGGogAUEYaikDADcDAAtqAQF/AkAgACgCCCICIAAoAgBHDQAgABDjFQsgACACQQFqNgIIIAAoAgQgAkEFdGoiACABKQMANwMAIABBCGogAUEIaikDADcDACAAQRBqIAFBEGopAwA3AwAgAEEYaiABQRhqKQMANwMAC2kCAX8BfiMAQTBrIgMkACADIAE2AgQgAyAANgIAIANBAjYCDCADQayOgQE2AgggA0ICNwIUIANBDq1CIIYiBCADrYQ3AyggAyAEIANBBGqthDcDICADIANBIGo2AhAgA0EIaiACEIUbAAt5AQJ/IAAtAAQiASECAkAgAC0ABUUNAEEBIQICQCABQQFxDQACQCAAKAIAIgItAApBgAFxDQAgAigCAEHXtZcBQQIgAigCBCgCDBEMACECDAELIAIoAgBBpsSbAUEBIAIoAgQoAgwRDAAhAgsgACACOgAECyACQQFxC2cBAX8jAEEQayIEJAACQAJAIAANAEEAIQAgBEEMaiEDDAELIAQgAjYCDCAAIANsIQAgBEEIaiEDCyADIAA2AgACQCAEKAIMIgBFDQAgBCgCCCIDRQ0AIAEgAyAAEJ4SCyAEQRBqJAALaQIBfwF+IwBBMGsiAyQAIAMgATYCBCADIAA2AgAgA0EDNgIMIANBlMqAATYCCCADQgI3AhQgA0EOrUIghiIEIANBBGqthDcDKCADIAQgA62ENwMgIAMgA0EgajYCECADQQhqIAIQhRsAC2kCAX8BfiMAQTBrIgMkACADIAE2AgQgAyAANgIAIANBAzYCDCADQcDKgAE2AgggA0ICNwIUIANBDq1CIIYiBCADQQRqrYQ3AyggAyAEIAOthDcDICADIANBIGo2AhAgA0EIaiACEIUbAAtsAgF/AX4jAEEwayICJAAgAiABNgIEIAIgADYCACACQQM2AgwgAkHwyoABNgIIIAJCAjcCFCACQQ6tQiCGIgMgAkEEaq2ENwMoIAIgAyACrYQ3AyAgAiACQSBqNgIQIAJBCGpBvMiFARCFGwALZwEBfyMAQRBrIgQkAAJAAkAgAA0AQQAhACAEQQxqIQMMAQsgBCACNgIMIAAgA2whACAEQQhqIQMLIAMgADYCAAJAIAQoAgwiAEUNACAEKAIIIgNFDQAgASADIAAQnhILIARBEGokAAt8AQF/IwBBEGsiAyQAAkAgACgCBEEDRg0AIAEpAwBCtuvn6eHYxrZ2Ug0AIAEpAwhCtN+v6pWUsbIQUg0AIAEoAhANACABIABBBGo2AhALIANBCGogACAAKAIAKAIEEQcAIAMoAgggASACIAMoAgwoAigRCwAgA0EQaiQAC3EBAX9BDBCIGiIGQQI2AgggBiADNgIAIAYgBCADayAFajYCBCABIAYgASgCACIDIAMgAkYiAhs2AgACQCACDQAgACADIAQgBRCxGCAGEPMgDwsgACAGNgIMIAAgBTYCCCAAIAQ2AgQgAEGo0IABNgIAC2kCAX8BfiMAQTBrIgMkACADIAE2AgQgAyAANgIAIANBAjYCDCADQbD9gQE2AgggA0ICNwIUIANBDq1CIIYiBCADQQRqrYQ3AyggAyAEIAOthDcDICADIANBIGo2AhAgA0EIaiACEIUbAAtpAgF/AX4jAEEwayIDJAAgAyABNgIEIAMgADYCACADQQI2AgwgA0HQ/YEBNgIIIANCAjcCFCADQQ6tQiCGIgQgA0EEaq2ENwMoIAMgBCADrYQ3AyAgAyADQSBqNgIQIANBCGogAhCFGwALaQIBfwF+IwBBMGsiAyQAIAMgATYCBCADIAA2AgAgA0ECNgIMIANBhP6BATYCCCADQgI3AhQgA0EOrUIghiIEIANBBGqthDcDKCADIAQgA62ENwMgIAMgA0EgajYCECADQQhqIAIQhRsAC2kCAX8BfiMAQTBrIgMkACADIAE2AgQgAyAANgIAIANBAzYCDCADQej+gQE2AgggA0ICNwIUIANBDq1CIIYiBCADQQRqrYQ3AyggAyAEIAOthDcDICADIANBIGo2AhAgA0EIaiACEIUbAAtnAQF/IwBBEGsiBCQAAkACQCAADQBBACEAIARBDGohAwwBCyAEIAI2AgwgACADbCEAIARBCGohAwsgAyAANgIAAkAgBCgCDCIARQ0AIAQoAggiA0UNACABIAMgABCeEgsgBEEQaiQAC28BAn8jAEEQayIDJAACQAJAIAEoAgAgASgCCCIETQ0AIANBCGogASAEQQRBBBDtDCADKAIIIgRBgYCAgHhHDQEgASgCCCEECyAAIAQ2AgQgACABKAIENgIAIANBEGokAA8LIAQgAygCDCACEKoeAAtoAQJ/IwBBIGsiASQAIABBNGohAgJAIAAoAjBBAkYNACABIAA2AgggASACNgIMIAEgAUEfajYCGCABIAFBDGo2AhQgASABQQhqNgIQIABBMGogAUEQakHotJgBEJEGCyABQSBqJAAgAgttAQN/AkAgACgCDCIBIAAoAgQiAkYNACABIAJrQQZ2IQEDQCACQTRqIgMoAgAgAkE4aigCABClGiACQTBqKAIAIAMoAgAQxSAgAhDhCiACQcAAaiECIAFBf2oiAQ0ACwsgACgCCCAAKAIAEMcgC2oBA38CQCAALQAlQQJGDQADQCAAKAIgIgAtACVBAkcNAAsLAkAgACgCCCIBDQBBAA8LIAAoAgQhACABQThsQUhqIQECQANAIAAQ2goiAg0BIABBOGohACABIQMgAUFIaiEBIAMNAAsLIAILbwICfwF+IABBCGohAQJAAkAgACgCAA0AIAEpAwAiA0IDg0IAUg0BIAOnIgEgASgCACICQX9qNgIAIAJBAUcNASABIAEoAhAQwRsMAQsgARCnEAsCQCAAKAIoIgBFDQAgABDZASAAQcAAQQgQnhILC28BBH9BACECAkACQCABLQAlRQ0ADAELIAFBAToAJQJA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IgJBdmoOBAIBAQIACyACQdi/f2pBAkkNASACQYCAxABHDQALQQAhAgwBC0EBIQILIAFBEGokACACC2YBAn8gACgCCEEGdCECIAAoAgQhAwJAA0AgAkUNASADIAEQjx4gAkFAaiECIANBwABqIQMMAAsLIAAoAhAgACgCFCABEK4aIABBGGogARD4HCABIABBPGoQ0xcgAEHAAGogARD1HgtxAQF/AkAgACgCACIBQQpGDQACQAJAAkACQAJAAkAgAUF+aiIBQQEgAUEISRsOCAECAwQGBgUAAQsgAEEEahDfHQ8LIAApAwgQxh0PCyAAEPocDwsgACkDCBDQHQ8LIAApAwgQxh0PCyAAKAIEEIUeCwtuAQJ/IAEoAgAhAiABQQA2AgACQCABLQBMDQAgASgCBCEDIAEoAjQgASgCHCABKAIgENofAkAgASgCREUNACABQQA2AkAgASABKAI8QQFqNgI8CyABQQE6AEwgAkUNACABIAMQrAULIABBBDoAAAtXAQF+AkACQCADQcAAcQ0AIANFDQEgAiADQT9xrSIEhiABQQAgA2tBP3GtiIQhAiABIASGIQEMAQsgASADQT9xrYYhAkIAIQELIAAgATcDACAAIAI3AwgLVwEBfgJAAkAgA0HAAHENACADRQ0BIAJBACADa0E/ca2GIAEgA0E/ca0iBIiEIQEgAiAEiCECDAELIAIgA0E/ca2IIQFCACECCyAAIAE3AwAgACACNwMIC2UBAn8jAEEQayICJAAgAiABNgIIAkACQCABEIQdQf8BcSIDQQJGDQAgACADOgABQQAhAwwBCyAAIAJBCGogAkEPakGAgIABENkGNgIEQQEhAwsgACADOgAAIAEQkh8gAkEQaiQAC2EBAX8jAEEgayICJAACQCAAKAIIQQJGDQAgAiABNgIIIAIgADYCDCACIAJBH2o2AhggAiACQQxqNgIUIAIgAkEIajYCECAAQQhqIAJBEGpBkNaCARCRBgsgAkEgaiQAIAALYAECfyMAQRBrIgIkAAJAAkAgAA0AQQAhACACQQxqIQMMAQsgAkEBNgIMIAJBCGohAwsgAyAANgIAAkAgAigCDCIARQ0AIAIoAggiA0UNACABIAMgABCeEgsgAkEQaiQAC2QBBH8jAEEQayICJAAgAC0ADCEDIAJBBGogACgCBCAAKAIIQQoQvgEg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DAELIAJBCGogASgCBCIBKAIAIAEoAgQoAiQRBwAgAigCDCEDIAIoAgghAQsgACADNgIEIAAgATYCACACQRBqJAALXAEBfwJAIAAoAggiAyAAKAIARw0AIAAgAhCpFgsgACADQQFqNgIIIAAoAgQgA0EYbGoiACABKQMANwMAIABBCGogAUEIaikDADcDACAAQRBqIAFBEGopAwA3AwALWgECfyMAQRBrIgIkAAJAAkAgACgCACIDQQFqQX5xIANGDQAgAkEIaiAAELgZIAIoAgwhACACKAIIIQMMAQsgACgCCCEACyABIAMgABDtBSEDIAJBEGokACADC1wBA38CQCAAKAIMIgEgACgCBCICRg0AIAEgAmtBAnYhAQNAIAIoAgAiA0EIahCbAyADQSBBCBCeEiACQQRqIQIgAUF/aiIBDQALCyAAKAIIIAAoAgBBBEEEEK8RC10BA38CQCAAKAIMIgEgACgCBCICRg0AIAEgAmtBBHYhASACQQxqIQIDQCACKAIAIgMQqgEgA0HAAEEIEJ4SIAJBEGohAiABQX9qIgENAAsLIAAoAgggACgCABDEIAtnAQF/IwBBEGsiAiQAIAIgAEEUajYCDCABQbXWmwFBBUHQ95kBQQQgAEEIakGBAkGw/JkBQQQgAEEQakGAA0H5/ZkBQQMgAEGwAkH8/ZkBQQggAkEMakGGAxD4CyEAIAJBEGokACAAC2IBAX8jAEEQayICJAACQAJAIAAtABRBAkYNACACIAA2AgwgAUG11psBQQUgAkEMakHcAhCkCyEADAELIAIgADYCCCABQZeVmgFBDyACQQhqQZ0EEKQLIQALIAJBEGokACAAC2IBAX8jAEEQayICJAACQAJAIAAtABRBAkYNACACIAA2AgwgAUG11psBQQUgAkEMakHcAhCkCyEADAELIAIgADYCCCABQdyLmgFBCiACQQhqQaQDEKQLIQALIAJBEGokACAAC2IBAX8jAEEQayICJAACQAJAIAAtADRBBEYNACACIAA2AgwgAUHX/ZkBQQYgAkEMakG2AxCkCyEADAELIAIgADYCCCABQduSmgFBDCACQQhqQcoDEKQLIQALIAJBEGokACAAC2IBAX8jAEEQayICJAACQAJAIAAtABRBAkYNACACIAA2AgwgAUG11psBQQUgAkEMakHcAhCkCyEADAELIAIg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AyACQeAAQQgQnhIgAUEMQQQQnhILC1wBA38jAEEQayIDJAAgA0EIaiACQQFBAUG84JsBENgUIAMoAgghBCADKAIMIQUCQCACRQ0AIAUgASAC/AoAAAsgACACNgIIIAAgBTYCBCAAIAQ2AgAgA0EQaiQAC1oBAn8jAEEQayICJAACQAJAIAEtABRBAkcNACABKAIMIQMgASgCCCEBDAELIAJBCGogARCdFCACKAIMIQMgAigCCCEBCyAAIAE2AgAgACADNgIEIAJBEGokAAtuAQF+AkACQAJAAkACQAJAIAAoAgAOBgECAgMEBQALIAApAxAhASAAKQMIEMYdIAEQxh0PCyAAKQMIIAApAxgQ1iELDwsgACkDGBCnHw8LIAApAxAgACgCGBDXIQ8LIAApAwgQxh0gACkDEBDGHQtgAQF/IwBBEGsiASQAAkAgACgCAA0AIAEgACgCBBCBECAAELcfIABBCGogAUEIaikCADcCACAAIAEpAgA3AgAgACgCAA0AQbKjmwFBKEGA2JsBEN0XAAsgAUEQaiQAIAALWAEDfyMAQRBrIgEkABC4HSECIAAtAAwhAyABIABBBGooAgAgAEEIaigCABDcEiACIAEpAgA3AgAgASADOgAMIAJBCGogAUEIaikCADcCACABQRBqJAAgAgtXAQN/IwBBEGsiBCQAQQAhBUEAIQYCQCABLQDIAUESRw0AIARBCGogASACIAMQvwIgBCgCCEEBcSEGIAQoAgwhBQsgACAFNgIEIAAgBjYCACAEQRBqJAALWQIBfwF+IwBBEGsiAyQAIANBCGogAiABKAIIIAFBABDKBgJAAkAgAy0ACEEERg0AIAMpAwgiBEL/AYNCBFENACAAIAQ3AgAMAQsgAEEEOgAACyADQRBqJAALYwACQAJAIAEgAkGah4ABQQYQmRwNAAJAIAEgAkGgh4ABQQgQmRwNACAAIAEgAkGoh4ABQQIQgxA2AgRBASECDAILIABBAToAAUEAIQIMAQtBACECIABBADoAAQsgACACOgAAC1kBAX8jAEEgayIDJAACQCABQf//A0sNACAAIAE7AQQgAEEANgIAIANBIGokAA8LIANBADYCGCADQQE2AgwgA0GwiYABNgIIIANCBDcCECADQQhqIAIQhRsAC2EBBH8gACgCACECIAAoAgQhA0EAIQRBACEFAkAD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AyACIQQCQCABKAKIAiIFRQ0AIAJBAWohAyABLwGQAyEECyABQQhByANBmAMgAhsQox4gACAFNgIAIAAgBK1CIIYgA62ENwIEC1ABAn8jAEEQayIBJAACQCAAKAIQIgJFDQAgAUEEaiAAKAIEIAAoAgggAkEBahCRDyAAKAIMIAEoAgxrIAEoAgQgASgCCBCjHgsgAUEQaiQAC1IBAn9BACECAkAgACgCACgCACIDKAIAIAAoAgQoAgAgAUEEdGsiAEFwaigCAEcNACADKAIIIAMoAgwgAEF4aigCACAAQXxqKAIAEJkcIQILIAILWQEBfyABKAIMIQICQAJAAkACQCABKAIEDgIAAQILIAINAUEBIQFBACECDAILIAINACABKAIAIgEoAgQhAiABKAIAIQEMAQsgACABEMUJDwsgACABIAIQnxQLVAEBf0EALQDA8Z0BGgJAQSAQhQEiAw0AAAsgAyABNgIEIAMgADYCACADIAIpAwA3AwggA0EQaiACQQhqKQMANwMAIANBGGogAkEQaikDADcDACADC1gBAX8jAEEQayICJAAgAiAAQRBqNgIMIAFB1PeZAUEDQdD3mQFBBCAAQQhqQYECQYD4mQFBBSAAQcgDQYX4mQFBAyACQQxqQckDEK0MIQAgAkEQaiQAIAALWAEBfyMAQRBrIgIkACACIAA2AgwgAUHjgpoBQQlB0PeZAUEEIABBDGpBgQJBsPyZAUEEIABBFGpBgANB7IKaAUEFIAJBDGpB3gMQrQwhACACQRBqJAAgAAt0AQF8RAAAAAAAAPC/IQECQCAAvUL///////////8Ag0L/////////9/8AVQ0AIACdIgAgAEQAAAAAAADwPaKdRAAAAAAAAPBBoqEgAKYiAEQAAAAAAADwQaAgACAARAAAAAAAAAAAYxv8A0F/c7chAQsgAQtYAQF/IwBBIGsiACQAIABBoOudATYCCCAAQaDrnQE2AgwgACAAQR9qNgIYIAAgAEEMajYCFCAAIABBCGo2AhBBqOudASAAQRBqQZTzmgEQkQYgAEEgaiQAC0sBA38jAEEQayICJAAgAkEIaiABKAIAEL4DIAAgAigCDCIDIAEoAgwiBCADIARJGyADIAQgAyAESxsQvRggASAAEMshIAJBEGokAAtPAQN/IwBBEGsiAiQAQQAhA0EAIQQCQCABKAIAQQJGDQAgAkEIaiABEIURIAIoAgwhAyACKAIIIQQLIAAgAzYCBCAAIAQ2AgAgAkEQaiQAC08BA38jAEEQayICJABBACEDQQAhBAJAIAEoAgBBB0YNACACQQhqIAEQ0w0gAigCDCEDIAIoAgghBAsgACADNgIEIAAgBDYCACACQRBqJAALWQEBfyABKAIMIQICQAJAAkACQCABKAIEDgIAAQILIAINAUEBIQFBACECDAILIAINACABKAIAIgEoAgQhAiABKAIAIQEMAQsgACABEMUJDwsgACABIAIQzxMLUAECfyMAQRBrIgMkACABIAEoAngiBCACcjYCeCADQQhqIAEQswsgAygCCCECIAEgBDYCeCADKAIMIQEgACACNgIAIAAgATYCBCADQRBqJAALUgEDfyMAQRBrIgIkACABIAEoAngiA0H//3txNgJ4IAJBCGogARCzCyACKAIIIQQgASADNgJ4IAIoAgwhASAAIAQ2AgAgACABNgIEIAJBEGokAAtRAQN/IwBBEGsiAiQAIAEgASgCeCIDQYAgcjYCeCACQQhqIAEQuwQgAigCCCEEIAEgAzYCeCACKAIMIQEgACAENgIAIAAgATYCBCACQRBqJAALUgEDfyMAQRBrIgIkACABIAEoAngiA0H/v39xNgJ4IAJBCGogARCZBCACKAIIIQQgASADNgJ4IAIoAgwhASAAIAQ2AgAgACABNgIEIAJBEGokAAtKAQN/QQAhAwJAIAJFDQACQANAIAAtAAAiBCABLQAAIgVHDQEgAEEBaiEAIAFBAWohASACQX9qIgJFDQIMAAsLIAQgBWshAwsgAwtTAQN/IAAoAgghASAAKAIEIgIhAwJAA0AgAUUNAQJAIAMoAgBBgICAgHhGDQAgAxCpFQsgAUF/aiEBIANBIGohAwwACwsgACgCACACQQRBIBCvEQtQAAJAAkAgAUF/TA0AAkACQCABDQBBASECDAELQQAtAMDxnQEaIAFBARCAGiICRQ0CCyAAIAE2AgggACACNgIEIAAgATYCAA8LIAIQ0xkLAAtSAQF/AkACQAJAIAJFDQBBACEDIAEoAtQCIgFFDQFBACECDAILQQAhAiABKALQAiIBDQFBASEDC0EBIQIgAxDHHCEBCyAAIAE2AgQgACACNgIAC1UBAX9BDCECAkAgAS0AC0H+AUcNACABKAIIIQIgASgCACEBAkAgAkH///93Rg0AIAJB////B3EhAgwBCyABQXxqKAAAIQILIAAgAjYCBCAAIAE2AgALTQECfyMAQRBrIgEkAEEALQDA8Z0BGiABQQA6AA8CQEEBEIUBIgINAAALIAAgAUEPaq03AwAgACACrTcDCCACQQFBARCeEiABQRBqJAALSQEBfyMAQRBrIgUkACAFQQRqIAEgAhDcEiAFQQRqIAMgBBDyHSAAQQhqIAVBBGpBCGooAgA2AgAgACAFKQIENwIAIAVBEGokAAtWAQN/QQNBABD7BiEAQQBBACgCnOydASIBIAAgARs2ApzsnQECQCABDQAgAA8LAkAgACgCBCICRQ0AIAAoAgBBwAAgAkEGdBCjHgsgAEEQQQQQnhIgAQtNAQF/AkAgAUUNAANAIAAoAgAiAiACKAIAIgJBf2o2AgACQCACQQFHDQAgACgCACAAQQRqKAIAEPoXCyAAQQhqIQAgAUF/aiIBDQALCwtPAQF/IwBBEGsiAiQAAkAgASgCIEUNAEGEsYQBEPgUAAsgAUF/NgIgIAJCADcCACAAIAFBJGogAhDbCyABIAEoAiBBAWo2AiAgAkEQaiQAC0oBAn8CQCABRQ0AQQAhAgJAIABBCGoiAy0AACIAQQFxRQ0AQQEhAiAAQQJxRQ0AIAMgARDIFSECCyACDwtBAEEAQZzdhAEQsxEAC1IBAX9BAC0AwPGdARoCQEEYEIUBIgINAAALIAIgASkCADcCACACQRBqIAFBEGopAgA3AgAgAkEIaiABQQhqKQIANwIAIAAgAjYCBCAAQQA2AgALTQACQCADRQ0AAkACQCADIAJJDQAgAyACRw0BDAILIAEgA2osAABBv39KDQELIAEgAkEAIANBuI2FARCVHwALIAAgAzYCBCAAIAE2AgALUgEBfwJAAkAgAUGff2oiAUH/AXFBGU0NAEEAIQEMAQsgAUECdEH8B3EiAkHAvp0BaigCACEBIAJB2L2dAWooAgAhAgsgACACNgIEIAAgATYCAAtQAQJ/IAAgACgCBCIDIAJrNgIEIAAgACgCACADIAJJciIENgIAQQEhAwJAIAQNACAAKAIIIgAoAgAgASACIABBBGooAgAoAgwRDAAhAwsgAwtRAQR/IAAoAgQhAQJAIAAoAggiAkUNACABIQMDQCADKAIAIgQQqwIgBEHgAEEIEJ4SIANBBGohAyACQX9qIgINAAsLIAAoAgAgAUEEQQQQrxELUQEEfyAAKAIEIQECQCAAKAIIIgJFDQAgASEDA0AgAygCACIEEKsCIARB4ABBCBCeEiADQQRqIQMgAkF/aiICDQALCyAAKAIAIAFBBEEEEK8RC04CAX8BfgJAAkAgACgCAEEFRw0AIAApAwgiAkIDg0IAUg0BIAKnIgAgACgCACIBQX9qNgIAIAFBAUcNASAAIAAoAhAQwRsPCyAAEJUNCwtMAQJ/IAAoAghBBnQhAiAAKAIEIQMCQANAIAJFDQEgAyABEOYeIAJBQGohAiADQcAAaiEDDAALCyABIABBDGoQiBkgAEEYaiABEIEeC0wBAn8gACgCCEEGdCECIAAoAgQhAwJAA0AgAkUNASADIAEQ9h4gAkFAaiECIANBwABqIQMMAAsLIAEgAEEMahCNGSAAQRhqIAEQix4LTgEBfwJAAkACQCABQf8BcUG1f2oiAkEfSw0AQQEgAnRBgYCCkHhxDQELQQAhAiABQbR/akH/AXFB1ABLDQELIAEgABCrDUEBcyECCyACC1MBA38CQCAAKAIAIgFFDQACQCAAKAIEIgIoAgAiA0UNACABIAMRAwALAkAgAigCBCIDRQ0AIAEgAyACKAIIEJ4SCyAAKAIMIAAoAggoAgwRAwALC0kBAn8jAEEQayIDJAAgAUGAASACECohAiADQQhqEMIbIAMoAgwhASAAIAMoAghBAXEiBDYCACAAIAEgAiAEGzYCBCADQRBqJAALTQEDfyAAKAIEIQECQCAAKAIIIgJFDQAgASEDA0AgAygCACADQQRqKAIAEJYgIANBDGohAyACQX9qIgINAAsLIAAoAgAgAUEEQQwQsBELTQEDfyAAKAIIIQEgACgCBCICIQMCQANAIAFFDQEgAygCACADQQRqKAIAEI4gIAFBf2ohASADQRRqIQMMAAsLIAAoAgAgAkEEQRQQrxELSwAgAEEkaiEAAkADQCABRQ0BIABBXGoQsx0gAEFoahCQHAJAIAAoAgBBgICAgHhGDQAgABCQHAsgAUF/aiEBIABBwABqIQAMAAsLC1cBAX8CQAJAIAFB/////wNLDQAgAUECdCICQf3///8HTw0AQQAtAMDxnQEaIAIQhQEiAkUNASAAQQA2AgggACACNgIEIAAgATYCAA8LQaTXmwEQ0xkLAAtNAQF/AkAgAiAAKAIAIAAoAggiA2tNDQAgACADIAIQ+QsgACgCCCEDCwJAIAJFDQAgACgCBCADaiABIAL8CgAACyAAIAMgAmo2AghBAAtPAQF/IwBBEGsiAyQAAkAgASgCAA0AQdTSgAFBDCADQQ9qQbTSgAEgAhDoDwALIAAgASkCADcCACAAQQhqIAFBCGooAgA2AgAgA0EQaiQAC0cBAX8jAEEQayIEJAAgBEEEaiABIAIQ3BIgBEEEaiADEL0JIABBCGogBEEEakEIaigCADYCACAAIAQpAgQ3AgAgBEEQaiQAC0wBAn8jAEEQayICJAAgAkEIaiIDIAFBCGooAgA2AgAgAiABKQIANwMAIAIQ4wggAEEIaiADKAIANgIAIAAgAikDADcCACACQRBqJAALUgECfyAAKAIAIAAoAgRBBEEEELURIAAoAgwgACgCEBClIAJAIAAoAhwiAUUNACABIAEoAgAiAkF/ajYCACACQQFHDQAgACgCHCAAKAIgEOoPCwtIAAJAIAFFDQADQCAAKAIAIABBBGooAgBBBEEEELURIABBDGooAgAgAEEQaigCAEEEQQgQtREgAEE4aiEAIAFBf2oiAQ0ACwsLSwEDfyAAKAIMIgEgACgCBCICa0EcbiEDAkAgASACRg0AA0AgAhD1HSACQRxqIQIgA0F/aiIDDQALCyAAKAIIIAAoAgBBBEEcEMARC0cBBH8gASABIAIgAxCMECIEaiIFLQAAIQYgBSADp0EZdiIHOgAAIAEgAiAEQXhqcWpBCGogBzoAACAAIAY6AAQgACAENgIAC0cBBH8gASABIAIgAxCaDyIEaiIFLQAAIQYgBSADp0EZdiIHOgAAIAEgAiAEQXhqcWpBCGogBzoAACAAIAY6AAQgACAENgIAC0wBAX8CQCAAKAIIIgMgACgCAEcNACAAIAIQpRYLIAAgA0EBajYCCCAAKAIEIANBDGxqIgAgASkCADcCACAAQQhqIAFBCGooAgA2AgALTgEBfwJAIAFFDQADQAJAAkAgACgCAEEFRg0AIAAQ8ggMAQsgAEEEaigCACICEJABIAJBwABBCBCeEgsgAEHYAGohACABQX9qIgENAAsLC1UBAX8gACgCDCIBEKoBIAFBwABBCBCeEiAAEOsXIAAoAgAgACgCBBDEIAJAIAAoAhwiAEUNACAAELgYIAAoAgAgAEEEaigCABDAICAAQRRBBBCeEgsLVQEBfyAAKAIMIgEQyQEgAUHAAEEIEJ4SIAAQ6xcgACgCACAAKAIEEMQgAkAgACgCHCIARQ0AIAAQuBggACgCACAAQQRqKAIAEMAgIABBFEEEEJ4SCwtVAQF/IAAoAgwiARDZASABQcAAQQgQnhIgABDrFyAAKAIAIAAoAgQQxCACQCAAKAIcIgBFDQAgABC4GCAAKAIAIABBBGooAgAQwCAgAEEUQQQQnhILC1UBAX8gACgCDCIBEMEBIAFBwABBCBCeEiAAEOsXIAAoAgAgACgCBBDEIAJAIAAoAhwiAEUNACAAELgYIAAoAgAgAEEEaigCABDAICAAQRRBBBCeEgsLTQEDfyAAKAIEIQECQCAAKAIIIgJFDQAgASEDA0AgAygCACADQQRqKAIAEN0eIANBDGohAyACQX9qIgINAAsLIAAoAgAgAUEEQQwQrxELTAEBfwJAIAAoAggiAyAAKAIARw0AIAAgAhDqFQsgACADQQFqNgIIIAAoAgQgA0EMbGoiACABKQIANwIAIABBCGogAUEIaigCADYCAAtQAQF/IwBBEGsiAiQAIAJBCGogASABKAIAKAIEEQcAIAIgAigCCCACKAIMKAIYEQcAIAIoAgQhASAAIAIoAgA2AgAgACABNgIEIAJBEGokAAtQAQF/IwBBEGsiAiQAIAJBCGogASABKAIAKAIEEQcAIAIgAigCCCACKAIMKAIYEQcAIAIoAgQhASAAIAIoAgA2AgAgACABNgIEIAJBEGokAAtMAQF/AkACQCABQYABTw0AQQEhAwwBCwJAIAFBgBBPDQBBAiEDDAELQQNBBCABQYCABEkbIQMLIAEgAhDMDCAAIAM2AgQgACACNgIAC00AAkACQCABIAIQ2BNFDQAgACEBDAELIAAgASkCADcCACAAQRBqIAFBEGopAgA3AgAgAEEIaiABQQhqKQIANwIACyABQYGAgIB4NgIAC0oBAX8CQCAAKAIIIgIgACgCAEcNACAAEOQVCyAAIAJBAWo2AgggACgCBCACQQR0aiIAIAEpAwA3AwAgAEEIaiABQQhqKQMANwMAC08BAn8gACgCBCECIAAoAgAhAwJAIAAoAggiAC0AAEUNACADQdTFmwFBBCACKAIMEQwARQ0AQQEPCyAAIAFBCkY6AAAgAyABIAIoAhARCAALRgECfyMAQRBrIgMkACABIAIQIyECIANBCGoQwhsgAygCDCEBIAAgAygCCEEBcSIENgIAIAAgASACIAQbNgIEIANBEGokAAtNAQF/QQEhAgJAAkAgAEH/AXFBAUYNACABIQICQAJAAkAgAUH/AXEOAwADAQALIABB/wFxDQEMAwsgAEH/AXENAgtBACECCyACDwtBAgtEAQJ/AkAgACgCBCIBRQ0AIAAoAgAiAiAAKAIMEJkMIAEgAUEMbEETakF4cSIAakEJaiIBRQ0AIAIgAGsgAUEIEJ4SCwtSAQF/IwBBEGsiASQAAkBBAiAAdCIAQYCAgMAASQ0AIAEgAK03AwhB1KSbAUErIAFBCGpBiOmDAUG8hYQBEOgPAAsgAUEQaiQAIABBgICAgAJyC0wBAX8CQAJAIAFFDQBBACECAkAgAC0AAEECcUUNACABQQxNDQIgACgACSECCyACDwtBAEEAQazdhAEQsxEAC0ENIAFBrN6EARCPIAALTwEBfyAAKAKwASECIABBADYCsAECQCACQQFxDQBBhICEAUEfQaSAhAEQ8hIACyAAIAAoAnAgACgCtAEiAiABayABIAJrIAIgAUsbajYCcAtJAQF/IAAgASgCACICIAEoAgQiASgCCEF/akF4cWpBCGogASgCFBEHACACIAIoAgAiAEF/ajYCAAJAIABBAUcNACACIAEQ6g8LC14BAX8gASgCACIBIAEoAgAiAkEBajYCAAJAIAJBf0oNAAALIAAgARCRFCAAQYCAgIB4NgLUBSAAQYCAgIB4NgLoBCAAQYCAgIB4NgLYBCAAQQI2AsgEIABBAjYCyAELXgEBfyABKAJIIgEgASgCACICQQFqNgIAAkAgAkF/Sg0AAAsgACABEJEUIABBgICAgHg2AtQFIABBgICAgHg2AugEIABBgICAgHg2AtgEIABBAjYCyAQgAEECNgLIAQtfAQF/IAEoApADIgEgASgCACICQQFqNgIAAkAgAkF/Sg0AAAsgACABEJEUIABBgICAgHg2AtQFIABBgICAgHg2AugEIABBgICAgHg2AtgEIABBAjYCyAQgAEECNgLIAQtfAQF/IAEoAoACIgEgASgCACICQQFqNgIAAkAgAkF/Sg0AAAsgACABEJEUIABBgICAgHg2AtQFIABBgICA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KAIIQQR0IQIgACgCBCEAAkADQCACRQ0BIABBDGogARDLISACQXBqIQIgAEEQaiEADAALCws8AQJ/IAAgAhD/GyAAKAIIIQMCQCACQThsIgRFDQAgACgCBCADQThsaiABIAT8CgAACyAAIAMgAmo2AggLOgEBfyAAKAIIQQR0IQIgACgCBCEAAkADQCACRQ0BIABBDGogARCrBCACQXBqIQIgAEEQaiEADAALCws9AQJ/AkADQCABIgMgADYCDCADKAIQIgRFDQEgBEEEaiEBIAQoAgBBCEYNAAsLIANBEGoQtR8gAyACNgIQC0UBAX8CQAJAAkAgACgCACIAKAIADgIAAQILIAAoAggiAUUNASAAKAIEQQEgARCjHgwBCyAAQQRqEO8UCyAAQRRBBBCeEgs8AQF/IAAtABQhASAAQQE6ABQCQAJAIAENACAAQXhqIgAgACgCAEEBaiIBNgIAIAFFDQEgABCcIgsPCwALOgECfyMAQRBrIgEkACABQQRqIAAQ9wwgASgCCCIAIAEoAgwQCiECIAEoAgQgABCwICABQRBqJAAgAgs+AgF/AX4jAEEQayICJAAgAkEIaiABQQhBIEHwjIABEIMUIAIpAwghAyAAQQA2AgggACADNwIAIAJBEGokAAs+AgF/AX4jAEEQayICJAAgAkEIaiABQQhBEEGQjYABEIMUIAIpAwghAyAAQQA2AgggACADNwIAIAJBEGokAAs/AQF/IwBBEGsiAiQAIAIgACgCACgCADYCDCABQdbEgAFBDkHYq5cBQQMgAkEMakEnEI4NIQAgAkEQaiQAIAALOgEBfyMAQRBrIgIkACACQQA2AgwgAiABIAJBDGoQwBUgACACKAIAIAIoAgQQpgQhASACQRBqJAAgAQs4AAJAAkAgASACSw0AIAIgA00NASACIAMgBBCPIAALIAEgAiAEEKkgAAsgACACNgIEIAAgATYCAAtBAQF/IAAoAgAhAAJAIAEoAggiAkGAgIAQcQ0AAkAgAkGAgIAgcQ0AIAAgARCcIA8LIAAgARCzDw8LIAAgARC0Dws7AgF/AX4jAEEQayIDJAAgA0EIaiABQQFBASACENsTIAMpAwghBCAAQQA2AgggACAENwIAIANBEGokAAs7AgF/AX4jAEEQayIDJAAgA0EIaiABQQRBBCACENsTIAMpAwghBCAAQQA2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JAAgAUEIakEEIAAQyBwCQCABKAIIIgANAAALIAFBEGokACAACzQBAX8jAEEQayIDJAACQCAADQBBiM+YAUEOIANBD2pBtNKAASACEOgPAAsgA0EQaiQAIAELMQEBfyMAQRBrIgIkACACQQhqIAAQ4RcgASACKAIIIAIoAgwQ7QUhACACQRBqJAAgAAszAQF/IwBBEGsiAiQAIAIgADYCDCABQdS0mAFBESACQQxqQcIAEKQLIQAgAkEQaiQAIAALMgEBfyMAQRBrIgIkACACIAA2AgwgAUG8zZkBQQQgAkEMakEyEKQLIQAgAkEQaiQAIAALKwACQCAAIAFBAnRqQXxqIgANAEGwkoMBEJsgAAsgAa1CBYYgACgCAGetfQs0AQF/AkAgACgCCCIDIAAoAgBHDQAgACACEMENCyAAIANBAWo2AgggACgCBCADaiABOgAACy0AAkAgAyABTw0AIAEgAyAEEKMgAAsgACADIAFrNgIEIAAgAiABQQJ0ajYCAAstAAJAIAMgAU8NACABIAMgBBCjIAALIAAgAyABazYCBCAAIAIgAUECdGo2AgALMwEBfyMAQRBrIgIkACACIAA2AgwgAUHF7oMBQQogAkEMakH8ABCkCyEAIAJBEGokACAACzMBAX8jAEEQayICJAAgAiAANgIMIAFBkPWEAUEGIAJBDGpBpQEQpAshACACQRBqJAAgAAszAQF/IwBBEGsiAiQAIAIgADYCDCABQfz0hAFBByACQQxqQacBEKQLIQAgAkEQaiQAIAALMwEBfyMAQRBrIgIkACACIAA2AgwgAUHS9IQBQRIgAkEMakGoARCkCyEAIAJBEGokACAACzMBAX8jAEEQayICJAAgAiAANgIMIAFBwPSEAUEGIAJBDGpBqwEQpAshACACQRBqJAAgAAszAQF/IwBBEGsiAiQAIAIgADYCDCABQdbvhAFBCSACQQxqQa0BEKQLIQAgAkEQaiQAIAALNgEBf0EALQDA8Z0BGgJAQQwQhQEiAQ0AAAsgASAAKQIANwIAIAFBCGogAEEIaigCADYCACABCzIBAX8jAEEQayICJAAgAiAANgIMIAFBpO+EAUELIAJBDGpBMhCkCyEAIAJBEGokACAACzMBAX8jAEEQayICJAAgAiAANgIMIAFBmu+EAUEKIAJBDGpBwgAQpAshACACQRBqJAAg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Rw0AIAAgAiABEJIVRSEECyAECyUBAX8gASgCACECIAFBADYCACABKAIEIQEgAhCFHSAAIAEQjhILIAEBf0EAIQQCQCABIANHDQAgACACIAEQkhVFIQQLIAQLJQEBfyABKAIAIQIgAUEANgIAIAEoAgQhASACEIUdIAAgARDRAQsfACAAIAIQgQwgAEEQaiACQRBqEIEMIAJBCCABEJUJCx4AIAAoAiRBACAAKAIcGyAAKAIUIAAoAghqQQJ0agsiAQF/AkAgASAAKAIAIAAoAggiAmtNDQAgACACIAEQwgoLCyABAX9BACEEAkAgASADSQ0AIAIgACADEJIVRSEECyAECyQAAkAgAA0AQcT+nAFBMhDkIAALIAAgAiADIAQgASgCEBEPAAskAAJAIAANAEHE/pwBQTIQ5CAACyAAIAIgAyAEIAEoAhARDgALJAACQCAADQBBxP6cAUEyEOQgAAsgACACIAMgBCABKAIQEQ4ACyQAAkAgAA0AQcT+nAFBMhDkIAALIAAgAiADIAQgASgCEBEOAAskAAJAIAANAEHE/pwBQTIQ5CAACyAAIAIgAyAEIAEoAhARLwALJAACQCAADQBBxP6cAUEyEOQgAAsgACACIAMgBCABKAIQETkACyQAAkAgAA0AQcT+nAFBMhDkIAALIAAgAiADIAQgASgCEBE2AAskAAJAIAANAEHE/pwBQTIQ5CAACyAAIAIgAyAEIAEoAhARDwALIQACQCACRQ0AIAEgAhDZHyEBCyAAIAI2AgQgACABNgIACyIBAX8gACAAKAIAIgFBf2o2AgACQCABQQFHDQAgABDdEgsLIQAgACACEK4FIABBwABqIAJBwABqEK4FIAJBCCABEKwGCyQAIAAoAgAgACgCBEEEQQQQtREgACgCDCAAKAIQQQRBBBC1EQsfACAAIAIQigggAEEgaiACQSBqEIoIIAJBCCABEIYICx8AIAAgAhCJCCAAQQhqIAJBCGoQiQggAkEIIAEQgQgLHgAgASgCACACQQR0a0FwaigCAEHdy92eeWxBD3etCyYBAX9BAC0AwPGdARoCQEHAABCFASIBDQAACyABIAAoAgAQRCABCyQAIABBADYCECAAQQA6ABQgACABKQMINwMIIAAgASkDADcDAAslACABKAIAIAAtAABBAnRB5NydAWooAgBBBiABKAIEKAIM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NgIEIABBkNubATYCAAshACAAQoaOrZTj9K2WzQA3AwggAELB0czxy7CL0UE3AwALIQAgAELS98LKhY3E6Bk3AwggAEKh2uHa5tywu75/NwMACyAAIABCitrjnYXusOxqNwMIIABCno+sgc6Z2fZKNwMACyEAIABC37y4td/S3s86NwMIIABCvMPzmOfznfmBfzcDAAsTACAAQbDemwE2AgQgACABNgIACxMAIABB9N2bATYCBCAAIAE2AgALEwAgAEEoNgIEIABBwNGbATYCAAsNACAAIAFBAUEBEK8RCwwAIAAgASACEL0RAAsMACAAQYEBEDFBAEcLCwAgACABEARBAUYLCwAgACABEAhBAEcLDQAgACABQQRBBBCvEQsNACAAIAFBCEEgEK8RCw8AIAAoAgAgACgCBBCOIAsNACAAIAFBAUEBELARCw8AIAAoAgAgACgCBBCoHgsNACAAIAEgAhDFH0EACxAAQQAtAMDxnQEaIAAQhQELDQAgACABQQRBGBCwEQsPAEG0jYEBQSsgABDdFwALDgAgACgCAEEBIAEQxwcLDQAgACABQQRBEBCvEQsNACAAIAFBBEEIEK8RCw0AIAAgAUEEQRQQrxELDgAgACABQQRBwAAQrxELDQAgACABQQRBHBCvEQsOACAAKQMAQQEgARC1BwsMACAAIAEgAhC8EQALDQAgACABQQFBARC1EQsNACAAIAFBBEEEELURCw0AIAAgAUEEQQwQtRELDAAgACABIAIQdUEACw0AIAAgASACEKQBQQALDAAgACABIAIQvhEACwwAIABBDGogARCCDAsNACAAIAFBAUEBELkRCw8AIAAoAgAgACgCBBCrIAsNACAAIAEgAhCHGkEACw0AIAAoAgAoAghBAUYLDAAgASAAIAIQvxEACw0AIAAgAUEBQQEQnRILDQAgACABQQRBBBCdEgsPACAAKAIAIAAoAgQQpCALDQAgACABQQRBHBDAEQsOACAAKAIAQQJBARCeEgsNACAAIAFBBEEQEMARCw0AIAAgAUEEQQgQtRELDgAgACgCAEEMQQQQnhILDwAgACgCACgCACABEMgJCw0AIAAgAUEBQQEQlRILDQAgACABQQhBGBCVEgsPACAAKAIAIAAoAgQQuSALDQAgASAAQf8BcRDOHAsNACAAIAFBCEEYEK8RCw0AIAAgAUEIQTgQrxELDQAgACABQQhBIBCvEQsNACAAIAFBBEEEEK8RCw0AIAAgAUEIQSgQrxELDQAgACABQQhBMBCvEQsOACAAIAFBCEHYABCvEQsNACAAIAFBBEEQEK8RCw0AIAAgAUEEQQwQrxELDgAgACABQQhByAAQrxELDgAgACABQQhBwAAQrxELDQAgACABQQRBGBCvEQsOACAAIAFBCEHQABCvEQsNACAAIAFBBEEMEK8RCw8AIAAoAgAgACgCBBCOIAsNACAAIAIgASADEJQdCw0AIAAgAiABIAMQkx0LDwAgACgCACgCACABEJESCw8AIAAoAgAoAgAgARCABQsPACAAKAIAKAIAIAEQoQoLDQAgACABQQhBEBCvEQsSAEGyo5sBQShB5KGaARDdFwALDwAgACgCACAAKAIEEI4gCw8AIAAoAgAgACgCBBCOIAsNACAAIAFBBEEEEK8RCw8AIAAoAgAgACgCBBCOIAsPACAAEOseIAAoAgQQ8h8LDwAgACgCACAAKAIEEJciCw0AIAAgASgCACACEHMLDQAgACABKAIAIAIQRQsOACAAIAEoAgAgAhCoBgsNACABIABBBEEEEK8RCw0AIAAgASgCACACEEwLDwAgACgCACAAKAIEEJciCw8AIAAoAgggACgCDBCXIgsNACAAIAFBBEEMEK8RCwsAIAAjAGokACMACwkAIAAQA0EBRgsJACAAEAdBAUYLCQAgACABEDQACwsAIAAgARDxEkEACwwAIAAQ5R0gABDnIAsLACAAQSxBBBCeEgsJACAAEClBAEcLCQAgABAwQQBHCw4AIAFB4auXAUECEO0FCwsAIAEgACgCtAJNCwoAIAAgASACEFYLCwAgASAAKALQAk0LCgAgACABIAIQfAsLACABIAAoAsgCTQsLACAAIAEgAhCOAQsLACAAIAEgAhDKAQsLACAAKAIAIAEQagsLACAAQQxBBBCeEgsLACAAIAIgAxC1DwsLACACIAAgARDtBQsMACAAKAIAIAEQnxALCgAgABD4DxpBAQsOACABQeGrlwFBAhDtBQsJACAAEB1BAUYLDAAgACgCACABEO4MCwwAIAAoAgAgARD1BgsMACAAKAIAIAEQxhwLDAAgACgCACABEJwKCwoAIABBMGoQ5BcLDAAgACgCACABEMYcCwwAIAAoAgAgARCXEwsMACAAKAIAIAEQmBMLDAAgACgCACABEMgJCwwAIAAoAqQNQcQCagsLACAALQCsCkEBcQsMACAAKAKkDUHEAmoLDAAgACgCpA1BxAJqCwsAIAAoAowDQQJLCwsAIAAoAowDQQJLCwwAIAAoAgAgARD/DQsOACABQeGrlwFBAhDtBQsMACAAKAIAIAEQyx8LCgAgACABEI0hAAsKACAAIAEQmBsACwwAIAAoAgAgARDGHAsMACAAKAIAIAEQjQwLDAAgACABKQIANwMACwsAIAAgAUEEEPUXCwoAIAAQ1wIaQQELDAAgACgCACABEPERCwwAIAAoAgAgARCiGgsMACAAKAIAIAEQyBcLDAAgACgCACABELAbCwwAIAAoAgAgARD/DQsKACAAIAGtEJwPCwoAIAAQ+QwaQQELDAAgACgCACABENcfCwoAIAAQ1AwaQQELCwAgACABEOgJQQALCwAgACABIAIQhRULCwAgASAAIAIQtCELDAAgACABQZMCEPABCwwAIAAgAUGUAhDwAQsMACAAIAFBlQIQ8AELDAAgACABQZYCEPABCwwAIAAgAUGXAhDwAQsMACAAIAFBmAIQ8AELDAAgACABQZkCEPABCwwAIAAgAUGaAhDwAQsMACAAIAFBmwIQ8AELDAAgACABQZwCEPABCwwAIAAgAUGdAhDwAQsMACAAIAFBngIQ8AELDAAgACABQZ8CEPABCwwAIAAgAUGgAhDwAQsMACAAIAFBoQIQ8AELDAAgACABQaICEPABCwwAIAAgAUGjAhDwAQsMACAAIAFBpAIQ8AELDAAgACABQaUCEPABCwwAIAAgAUGmAhDwAQsMACAAIAFBpwIQ8AELCwAgACABIAIQhRULCwAgASAAIAIQnSELCwAgASAAIAIQtCELDAAgACgCACABEPMYCwwAIAAoAgAgARD3CAsMACAAKAIAIAEQ6B0LDAAgACgCACABENsQCwwAIAAoAgAgARD6CAsMACAAKAIAIAEQoRoLDAAgACgCACABELwJCwwAIAAoAgAgARDcAgsMACAAKAIAIAEQ1QQLDAAgACgCACABEIAFCwwAIAAoAgAgARC2DAsMACAAKAIAIAEQkRILDAAgACgCACABEKEKCwwAIAAoAgAgARCcIAsMACAAIAEpAhA3AwALDAAgACgCACABEI0MCwwAIAAoAgAgARCNDAsM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AAC5AgAAugIAACwAAAAEAAAAuwIAALoCAAAsAAAABAAAALwCAAC7AgAALAUgAL0CAAC+AgAAvwIAAMACAADBAgAAwgIAAMMCAADEAgAAxQIAAMYCAADHAgAAQ291bGRuJ3QgZGVzZXJpYWxpemUgaTY0IG9yIHU2NCBmcm9tIGEgQmlnSW50IG91dHNpZGUgaTY0OjpNSU4uLnU2NDo6TUFYIGJvdW5kcwD0riAAAQAAAGNhbGxlZCBgT3B0aW9uOjp1bndyYXBfdGhyb3coKWAgb24gYSBgTm9uZWAgdmFsdWUvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zZXJkZS0xLjAuMjI4L3NyYy9wcml2YXRlL2RlLnJzAAAACQYgAGQAAADtAQAAEQAAAAkGIABkAAAA8wEAABUAAAAJBiAAZAAAAOEBAAARAAAACQYgAGQAAADjAQAAFQAAAGNhbGxlZCBgUmVzdWx0Ojp1bndyYXBfdGhyb3coKWAgb24gYW4gYEVycmAgdmFsdWV2YWx1ZSBpcyBtaXNzaW5nTWFwQWNjZXNzOjpuZXh0X3ZhbHVlIGNhbGxlZCBiZWZvcmUgbmV4dF9rZXkvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zZXJkZV9jb3JlLTEuMC4yMjgvc3JjL2RlL3ZhbHVlLnJzHQcgAGcAAABnBQAAGwAAAGJpbmRpbmdzL2JpbmRpbmdfdHlwZXNjcmlwdF93YXNtL3NyYy9lcnJvcl9yZXBvcnRlci5ycwAAlAcgADYAAABfAAAAHAAAAJQHIAA2AAAAegAAADYAAACUByAANgAAAIwAAAAeAAAAlAcgADYAAACRAAAAFgAAAJQHIAA2AAAAdgAAABoAAABGYWlsZWQgdG8gcmVhZCBjb250ZW50cyBmb3IgbGFiZWwAAAAcCCAAIQAAADxub25lPiAgWyBgYCAob2Zmc2V0OiAsIGxlbmd0aDogXQoAAE4IIAADAAAAUQggAAIAAABTCCAACwAAAF4IIAAKAAAAk/0gAAMAAABoCCAAAgAAAGNhbm5vdCBjcmFzaCBi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AAByAwAAOgAAADgfIABtAAAAhAMAAEYAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9haG8tY29yYXNpY2stMS4xLjMvc3JjL3V0aWwvcmVtYXBwZXIucnNgISAAbAAAAHIAAAASAAAAYCEgAGwAAACMAAAAJAAAAGAhIABsAAAAkQAAACAAAABgISAAbAAAAJMAAAAdAAAAYCEgAGwAAACZAAAAHwAAAFBhdHRlcm5zYnlfaWRvcmRlcnRvdGFsX3BhdHRlcm5fYnl0ZXNpbXBtZW1vcnlfdXNhZ2VQYWNrZWRSYXJlQnl0ZU9mZnNldFJhcmVCeXRlc09uZWJ5dGUxUmFyZUJ5dGVzVHdvb2Zmc2V0c2J5dGUyUmFyZUJ5dGVzVGhyZWVieXRlM1N0YXJ0Qnl0ZXNPbmVTdGFydEJ5dGVzVHdvU3RhcnRCeXRlc1RocmVlL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvYWhvLWNvcmFzaWNrLTEuMS4zL3NyYy91dGlsL3ByaW1pdGl2ZXMucnMAySIgAG4AAADhAgAAAQAAAFN0YXRlSURFcnJvcgAAAAAEAAAABAAAAB4DAAAfAwAADAAAAAQAAAAgAwAAIQMAACIDAABsaWJyYXJ5L2FsbG9jL3NyYy9yYXdfdmVjL21vZC5yc3wjIAAgAAAALgIAABEAAABsaWJyYXJ5L2FsbG9jL3NyYy9zdHJpbmcucnMArCMgABsAAADoAQAAFwAAAAAAAAAAAAAAAQAAACMDAABhIGZvcm1hdHRpbmcgdHJhaXQgaW1wbGVtZW50YXRpb24gcmV0dXJuZWQgYW4gZXJyb3Igd2hlbiB0aGUgdW5kZXJseWluZyBzdHJlYW0gZGlkIG5vdGxpYnJhcnkvYWxsb2Mvc3JjL2ZtdC5ycwAAPiQgABgAAACKAgAADgAAAAAAAAAAAAAAAQAAACQDAABsaWJyYXJ5L2FsbG9jL3NyYy9zbGljZS5ycwAAeCQgABoAAAC+AQAAHQAAAGxpYnJhcnkvYWxsb2Mvc3JjL3N5bmMucnMAAACkJCAAGQAAAIQB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AQICAQICAgQBDAEBAQcBQQEEAggBBwEcAQQBBQEBAwcBAAIZARkBHwEZAR8BGQEfARkBHwEZAQgAHwYG1QcBEQIHAQIBBQU+IQFwLQoHEAEAHhIsABzkHgIBAAcBBAECAQ8BxTtEAwEDAQAEARsBAgEBAgEBCgEEAQEBAQYBBAEBAQEBAQMBAgEBAgEBAQEBAQEBAQECAQECBAEHAQQBBAEBAQoBEQUDAQUBEQAaBhoGGgAAIAAG3gIADgAPAAAAAAAFAAAAcAAHAC0BAQECAQIBAUgLMBUQAWUHAgYCAgEEIwEeG1sLOgkJARgEAQkBAwEFKwM7CSoYASA3AQEBBAgEAQMHCgIdAToBAQECBAgBCQEKAhoBAgI5AQQCBAICAwMBHgIDAQsCOQEEBQECBAEUAhYGAQE6AQECAQQIAQcDCgIeATsBAQEMAQkBKAEDATcBAQMFAwEEBwILAh0BOgECAgEBAwMBBAcCCwIcAjkCAQECBAgBCQEKAh0BSAEEAQIDAQEIAVEBAgcMCGIBAgkLB0kCGwEBAQEBNw4BBQECBQsBJAkBZgQBBgECAgIZAgQDEAQNAQICBgEPAQADAAQcAx0CHgJAAgEHCAECCwkBLQMBAXUCIgF2AwQCCQEGA9sCAgE6AQEHAQEBAQIIBgoCATAfMQQwCgQDJgkMAiAEAgY4AQECAwEBBTgIAgKYAwENAQcEAQYBAwLGQAABwyEAA40BYCAABmkCAAQBCiACUAIAAQMBBAEZAgUBlwIaEg0BJggZCwEBLAMwAQIEAgICASQBQwYCAgICDAEIAS8BMwEBAwICBQIBASoCCAHuAQIBBAEAAQAQEBAAAgAB4gGVBQADAQIFBCgDBAGlAgAEQQUAAk8ERgsxBHsBNg8pAQICCgMxBAICBwE9AyQFAQg+AQwCNAkBAQgEAgFfAwIEBgECAZ0BAwgVAjkCAQEBAQwBCQEOBwMFQwECBgEBAgEBAwQDAQEOAlUIAgMBARcBUQECBgEBAgEBAgEC6wECBAYCAQIbAlUIAgEBAmoBAQECCGUBAQECBAEFAAkBAvUBCgQEAZAEAgIEASAKKAYCBAgBCQYCAy4NAQIABwEGAQFSFgIHAQIBAnoGAwEBAgEHAQFIAgMBAQEAAgsCNAUFAxcBAAEGDwAMAwMABTsHAAE/BFEBCwIAAgAuAhcABQMGCAgCBx4ElAMANwQyCAEOARYFAQ8ABwERAgcBAgEFZAGgBwABPQQABP4CAAdtBwBggPAAMAp4AgUBAgMACoYKxgoACnYKBAZsCnYKdgoCBm4NcwoIB2cKaAcHE20KYAp2CkYUAApGCgAUAAPvCgYKFgoACoALpQoGCrYKVgqGCgYKAAEDBgYKxjMCBQA8ThYAHgABAAEZCQ4DAASKCh4IAQ8gCicPAAq8CgAGmgomCsYKFgpWCgAKAAoALQw5EQIAGyQEHQEIAYYFygoACBkHJwlLBRYGoAICEAIuQAk0Ah4DSwVoCBgIKQcABjAKBgoAH54KKgRwB4YegAo8CpAKBxT7CgAKdgoACmYKBhRMDAATXQoAClYd4wpGCgAKZhUAbwAKAApWCoYKAQcACgAXAAoAFAwUbBkAMgAKAAoACvcKAAmACgA7AQMBBEwtAQ8ADQAKAAAAAAAAAQAAAAAAAAAKAAAAAAAAAGQAAAAAAAAA6AMAAAAAAAAQJwAAAAAAAKCGAQAAAAAAQEIPAAAAAACAlpgAAAAAAADh9QUAAAAAAMqaOwAAAAAA5AtUAgAAAADodkgXAAAAABCl1OgAAAAAoHJOGAkAAABAehDzWgAAAIDGpH6NAwBsaWJyYXJ5L2NvcmUvc3JjL251bS9kZWMyZmx0L2RlY2ltYWxfc2VxLnJzALA0IAArAAAAVgAAACcAAACwNCAAKwAAAIgAAAATAAAAsDQgACsAAACwAAAAIAAAALA0IAArAAAAxwAAACUAAACwNCAAKwAAAPQAAAAVAAAAsDQgACsAAAD/AAAAGAAAAAAAAAgBCAMIBhAJEA0QEhgXGB0YJCArIDMgPCBGKFAoWyhnMHMwgDCOOJw4qzi7OMxA3UDvQAJJFUkpST5RU1FpUYBRmFmwWclZ42H9YRhiNGpQam1qi2qqcsly6XIKeyt7TXtwg5ODt4PcgwKMKIxPjHeUn5TIlPKcHAUcBRwFHAUFAgUBAgUGAgUDAQIFAQUGAgUHCAECBQMJAAYCBQEJBQMBAgUJBwYFBgIFBAgIAggBAgUCBAQBBAAGAgUBAgIABwADAQIFBgEAAwUBBQYCBQMABQEHBQcIAQIFAQUCBQgHCAkABgIFBwYCCQMJBAUDAQIFAwgBBAYJBwIGBQYCBQEJAAcDBAgGAwIIAQIFCQUDBgcEAwEGBAAGAgUEBwYIAwcBBQgCAAMBAgUCAwgEAQgFBwkBAAEFBgIFAQEJAgAJAggJBQUABwgBAgUFCQYABAYEBAcHBQMJAAYCBQIJCAACAwICAwgHBgkFAwECBQEECQABAQYBAQkDCAQHBgUGAgUHBAUABQgABQkGCQIDCAIIAQIFAwcCBQIJAAIJCAQGAQkBBAAGAgUBCAYCBgQFAQQJAgMACQUHAAMBAgUJAwEDAgIFBwQGAQUEBwgFAQUGAgUEBgUGBgECCAcDAAcHAwkCBQcIAQIFAgMCCAMABgQDBgUDCAYJBgIICQAGAgUBAQYEAQUDAgEIAgYJAwQIAQQEBQMBAgUFCAIABwYGAAkBAwQGBwQABwICBgUGAgUCCQEAAwgDAAQFBgcDAwcAAwYBAwIIAQIFAQQFBQEJAQUCAggDBgYIBQEIAAYGBAAGAgUHAgcFCQUHBgEEAQgDBAIFCQADAwIAAwECBQMGAwcJBwgIAAcACQEHAQIJBQEGBgABBQYCBQEIAQgJCAkEAAMFBAUIBQYEBwUIAwAABwgBAgUJAAkECQQHAAEHBwIJAggCAwcJAQUAAwkABgIFBAUEBwQHAwUACAgGBAYEAQEICQUHBQEJBQMBAgUCAgcDBwMGBwUEBAMCAwIABQkEBwgHBQkHBgUGAgUBAQMGCAYIAwcHAgEGAQYAAgkHAwkDBwkICAIIAQIFBQYIBAMEAQgIBgAIAAgAAQQIBgkGCAkJBAEEAAYCBQIIBAIBBwAJBAMABAAEAAAHBAMECAQECQcABwADAQIFAQQCAQAIBQQHAQUCAAIAAAMHAQcEAgIECAUDBQEFBgIFBwEABQQCBwMFBwYAAQAAAQgFCAcBAQIEAgYHBQcIAQIFAwUFAgcBAwYHCAgAAAUAAAkCCQMFBQYCAQMDBwgJAAYCBQEHBwYDBQYIAwkEAAACBQAEBgQGBwcIAQAGBggJBAUDAQIFCAgIAQcIBAEJBwAAAQIFAgMCAwMICQAFAwMEBAcCBgUGAgUEBAQACAkCAAkIBQAABgIGAQYBBgkEBQIGBgcCAwYDAggBAgUCAgIABAQGAAQJAgUAAwEDAAgACAQHAgYDAwMGAQgBBgQABgIFAQEBAAICAwACBAYCBQEFBgUEAAQCAwYDAQYGCAAJAAgCAAMBAgUFBQUBAQEFAQIDAQIFBwgCBwACAQEIAQUIAwQABAUEAQABBQYCBQIHBwUFBQcFBgEFBgIICQEDBQEABQkABwkBBwACAgcABQAHCAECBQEDCAcHBwgHCAAHCAEEBAUGBwUFAgkFAwkFCAUBAQMFAgUDCQAGAgUGCQMICAkDCQADCQAHAgIIAwcHBgQHBgkHCQIFBQYHBgIGCQUDAQIFAwQGCQQEBgkFAQkFAwYBBAEICAgCAwgECAkGAgcIAwgBAwQHBgUGAgUBBwMEBwIDBAcFCQcGCAAHAAkEBAEBCQIEBAgBAwkBCQAGBwMIAggBAgUIBgcDBgEHAwcJCAgEAAMFBAcCAAUJBgICBAAGCQUJBQMDBgkBBAAGAgUAALA0IAArAAAAbAEAABsAAACwNCAAKwAAAHEBAAATAAAAAAMGCQ0QExcaHSEkJysuMTU4OwAAAAAAAADwPwAAAAAAACRAAAAAAAAAWUAAAAAAAECPQAAAAAAAiMNAAAAAAABq+EAAAAAAgIQuQQAAAADQEmNBAAAAAITXl0EAAAAAZc3NQQAAACBfoAJCAAAA6HZIN0IAAACilBptQgAAQOWcMKJCAACQHsS81kIAADQm9WsMQwCA4Dd5w0FDAKDYhVc0dkMAyE5nbcGrQwA9kWDkWOFDQIy1eB2vFURQ7+LW5BpLRJLVTQbP8IBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbGlicmFyeS9jb3JlL3NyYy9udW0vZGVjMmZsdC9wYXJzZS5ycwAAABA8IAAlAAAArQAAABMAAABsaWJyYXJ5L2NvcmUvc3JjL251bS9kaXlfZmxvYXQucnMAAABIPCAAIQAAAC4AAAAJAAAAAQAAAAoAAABkAAAA6AMAABAnAACghgEAQEIPAICWmAAA4fUFAMqaO8Fv8oYjAAAAge+shVtBbS3uBAAAAR9qv2TtOG7tl6fa9Pk/6QNPGAABPpUuCZnfA/04FQ8v5HQj7PXP0wjcBMTasM28GX8zpgMmH+lOAgAAAXwumFuH075yn9nYhy8VEsZQ3mtwbkrPD9iV1W5xsiawZsatJDYVHVrTQjwOVP9jwHNVzBfv+WXyKLxV98fcgNztbvTO79xf91MFAGxpYnJhcnkvY29yZS9zcmMvbnVtL2ZsdDJkZWMvc3RyYXRlZ3kvZHJhZ29uLnJzYXNzZXJ0aW9uIGZhaWxlZDogZC5tYW50ID4gMABAPSAALwAAAHYAAAAFAAAAYXNzZXJ0aW9uIGZhaWxlZDogZC5taW51cyA+IDAAAABAPSAALwAAAHcAAAAFAAAAYXNzZXJ0aW9uIGZhaWxlZDogZC5wbHVzID4gMEA9IAAvAAAAeAAAAAUAAABAPSAALwAAAMIAAAAJAAAAQD0gAC8AAAD7AAAADQAAAEA9IAAvAAAAAgEAABIAAABhc3NlcnRpb24gZmFpbGVkOiBkLm1hbnQuY2hlY2tlZF9zdWIoZC5taW51cykuaXNfc29tZSgpAEA9IAAvAAAAegAAAAUAAABhc3NlcnRpb24gZmFpbGVkOiBkLm1hbnQuY2hlY2tlZF9hZGQoZC5wbHVzKS5pc19zb21lKCkAAEA9IAAvAAAAeQAAAAUAAABAPSAALwAAAHIBAAAkAAAAQD0gAC8AAAB3AQAALwAAAEA9IAAvAAAAhAEAABIAAABAPSAALwAAAGYBAAANAAAAQD0gAC8AAABMAQAAIgAAAEA9IAAvAAAADgEAAAUAAADfRRo9A88a5sH7zP4AAAAAysaaxxf+cKvc+9T+AAAAAE/cvL78sXf/9vvc/gAAAAAM1mtB75FWvhH85P4AAAAAPPx/kK0f0I0s/Oz+AAAAAIOaVTEoXFHTRvz0/gAAAAC1yaatj6xxnWH8/P4AAAAAy4vuI3cinOp7/AT/AAAAAG1TeECRScyulvwM/wAAAABXzrZdeRI8grH8FP8AAAAAN1b7TTaUEMLL/Bz/AAAAAE+YSDhv6paQ5vwk/wAAAADHOoIly4V01wD9LP8AAAAA9Je/l83PhqAb/TT/AAAAAOWsKheYCjTvNf08/wAAAACOsjUq+2c4slD9RP8AAAAAOz/G0t/UyIRr/Uz/AAAAALrN0xonRN3Fhf1U/wAAAACWySW7zp9rk6D9XP8AAAAAhKVifSRsrNu6/WT/AAAAAPbaXw1YZquj1f1s/wAAAAAm8cPek/ji8+/9dP8AAAAAuID/qqittbUK/nz/AAAAAItKfGwFX2KHJf6E/wAAAABTMME0YP+8yT/+jP8AAAAAVSa6kYyFTpZa/pT/AAAAAL1+KXAkd/nfdP6c/wAAAACPuOW4n73fpo/+pP8AAAAAlH10iM9fqfip/qz/AAAAAM+bqI+TcES5xP60/wAAAABrFQ+/+PAIit/+vP8AAAAAtjExZVUlsM35/sT/AAAAAKx/e9DG4j+ZFP/M/wAAAAAGOysqxBBc5C7/1P8AAAAA05JzaZkkJKpJ/9z/AAAAAA7KAIPytYf9Y//k/wAAAADrGhGSZAjlvH7/7P8AAAAAzIhQbwnMvIyZ//T/AAAAACxlGeJYF7fRs//8/wAAAAAAAAAAAABAnM7/BAAAAAAAAAAAABCl1Ojo/wwAAAAAAAAAYqzF63itAwAUAAAAAACECZT4eDk/gR4AHAAAAAAAsxUHyXvOl8A4ACQAAAAAAHBc6nvOMn6PUwAsAAAAAABogOmrpDjS1W0ANAAAAAAARSKaFyYnT5+IADwAAAAAACf7xNQxomPtogBEAAAAAACorciMOGXesL0ATAAAAAAA22WrGo4Ix4PYAFQAAAAAAJodcUL5HV3E8gBcAAAAAABY5xumLGlNkg0BZAAAAAAA6o1wGmTuAdonAWwAAAAAAEp375qZo22iQgF0AAAAAACFa320e3gJ8lwBfAAAAAAAdxjdeaHkVLR3AYQAAAAAAMLFm1uShluGkgGMAAAAAAA9XZbIxVM1yKwBlAAAAAAAs6CX+ly0KpXHAZwAAAAAAONfoJm9n0be4QGkAAAAAAAljDnbNMKbpfwBrAAAAAAAXJ+Yo3KaxvYWArQAAAAAAM6+6VRTv9y3MQK8AAAAAADiQSLyF/P8iEwCxAAAAAAApXhc05vOIMxmAswAAAAAAN9TIXvzWhaYgQLUAAAAAAA6MB+X3LWg4psC3AAAAAAAlrPjXFPR2ai2AuQAAAAAADxEp6TZfJv70ALsAAAAAAAQRKSnTEx2u+sC9AAAAAAAGpxAtu+Oq4sGA/wAAAAAACyEV6YQ7x/QIAMEAQAAAAApMZHp5aQQmzsDDAEAAAAAnQycofubEOdVAxQBAAAAACn0O2LZICiscAMcAQAAAACFz6d6XktEgIsDJAEAAAAALd2sA0DkIb+lAywBAAAAAI//RF4vnGeOwAM0AQAAAABBuIycnRcz1NoDPAEAAAAAqRvjtJLbGZ71A0QBAAAAANl337puv5brDwRMAQAAAABsaWJyYXJ5L2NvcmUvc3JjL251bS9mbHQyZGVjL3N0cmF0ZWd5L2dyaXN1LnJzAAAoRCAALgAAAH0AAAAVAAAAKEQgAC4AAACpAAAABQAAAChEIAAuAAAAqgAAAAUAAAAoRCAALgAAAKsAAAAFAAAAYXNzZXJ0aW9uIGZhaWxlZDogZC5tYW50ICsgZC5wbHVzIDwgKDEgPDwgNjEpAAAAKEQgAC4AAACvAAAABQAAAChEIAAuAAAACgEAABEAAAAoRCAALgAAAEABAAAJAAAAKEQgAC4AAACtAAAABQAAAChEIAAuAAAArAAAAAUAAABhc3NlcnRpb24gZmFpbGVkOiAhYnVmLmlzX2VtcHR5KCkAAAAoRCAALgAAANwBAAAFAAAAKEQgAC4AAAAzAgAAEQAAAChEIAAuAAAAbAIAAAkAAAAoRCAALgAAAOMCAAAmAAAAKEQgAC4AAADvAgAAJgAAAChEIAAuAAAAzAIAACYAAABsaWJyYXJ5L2NvcmUvc3JjL251bS9mbHQyZGVjL21vZC5ycwCcRSAAIwAAALsAAAAFAAAAYXNzZXJ0aW9uIGZhaWxlZDogYnVmWzBdID4gYicwJwCcRSAAIwAAALwAAAAFAAAAnEUgACMAAAAKAQAABQAAAJxFIAAjAAAACwEAAAUAAABlaW5mMGUwYXNzZXJ0aW9uIGZhaWxlZDogYnVmLmxlbigpID49IG1heGxlbpxFIAAjAAAAfgIAAA0AAABCb3Jyb3dFcnJvckJvcnJvd011dEVycm9yYWxyZWFkeSBib3Jyb3dlZDogAHVGIAASAAAAYWxyZWFkeSBtdXRhYmx5IGJvcnJvd2VkOiAAAJBGIAAaAAAAY2FsbGVkIGBPcHRpb246OnVud3JhcCgpYCBvbiBhIGBOb25lYCB2YWx1ZWV4cGxpY2l0IHBhbmljAAAA30YgAA4AAABpbmRleCBvdXQgb2YgYm91bmRzOiB0aGUgbGVuIGlzICBidXQgdGhlIGluZGV4IGlzIAAA+EYgACAAAAAYRyAAEgAAAAAAAAAEAAAABAAAAEMDAAAAAAAABAAAAAQAAABEAwAAYXNzZXJ0aW9uIGBsZWZ0ICByaWdodGAgZmFpbGVkCiAgbGVmdDogCiByaWdodDogXEcgABAAAABsRyAAFwAAAINHIAAJAAAAIHJpZ2h0YCBmYWlsZWQ6IAogIGxlZnQ6IAAAAFxHIAAQAAAApEcgABAAAAC0RyAACQAAAINHIAAJAAAAAAAAAAwAAAAEAAAARQMAAEYDAABHAwAAIHsKLAooCmF0dGVtcHRlZCB0byBiZWdpbiBhIG5ldyBtYXAgZW50cnkgd2l0aG91dCBjb21wbGV0aW5nIHRoZSBwcmV2aW91cyBvbmUAAAD/RyAARgAAAGxpYnJhcnkvY29yZS9zcmMvZm10L2J1aWxkZXJzLnJzUEggACAAAADZAwAADQAAAGF0dGVtcHRlZCB0byBmaW5pc2ggYSBtYXAgd2l0aCBhIHBhcnRpYWwgZW50cnkAAIBIIAAuAAAAUEggACAAAACxBAAADQAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBsaWJyYXJ5L2NvcmUvc3JjL2ZtdC9tb2QucnMACEkgABsAAAAgCQAACQAAAAhJIAAbAAAAmQoAACYAAAAISSAAGwAAAKIKAAAaAAAAbGlicmFyeS9jb3JlL3NyYy9zbGljZS9tZW1jaHIucnNUSSAAIAAAAIQAAAAeAAAAVEkgACAAAACgAAAACQAAAHVzZXItcHJvdmlkZWQgY29tcGFyaXNvbiBmdW5jdGlvbiBkb2VzIG5vdCBjb3JyZWN0bHkgaW1wbGVtZW50IGEgdG90YWwgb3JkZXKUSSAATAAAAGxpYnJhcnkvY29yZS9zcmMvc2xpY2Uvc29ydC9zaGFyZWQvc21hbGxzb3J0LnJzAOhJIAAvAAAAXAMAAAUAAABpbnZhbGlkIHV0Zi04IHNlcXVlbmNlIG9mICBieXRlcyBmcm9tIGluZGV4IChKIAAaAAAAQkogABIAAABpbmNvbXBsZXRlIHV0Zi04IGJ5dGUgc2VxdWVuY2UgZnJvbSBpbmRleCAAAGRKIAAqAAAAYXR0ZW1wdGVkIHRvIGluZGV4IHN0ciB1cCB0byBtYXhpbXVtIHVzaXplAACYSiAAKgAAAGxpYnJhcnkvY29yZS9zcmMvc3RyL21vZC5ycwEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMDAwMDAwMDAwMDAwMDAwQEBAQEAAAAAAAAAAAAAABsaWJyYXJ5L2NvcmUvc3JjL3N0ci9wYXR0ZXJuLnJzAADnSyAAHwAAAHEFAAASAAAA50sgAB8AAABxBQAAKAAAAOdLIAAfAAAAZAYAABUAAADnSyAAHwAAAJIGAAAVAAAA50sgAB8AAACTBgAAFQAAAFsuLi5dYmVnaW4gPD0gZW5kICggPD0gKSB3aGVuIHNsaWNpbmcgYABdTCAADgAAAGtMIAAEAAAAb0wgABAAAADu2yYAAQAAAGJ5dGUgaW5kZXggIGlzIG5vdCBhIGNoYXIgYm91bmRhcnk7IGl0IGlzIGluc2lkZSAgKGJ5dGVzICkgb2YgYACgTCAACwAAAKtMIAAmAAAA0UwgAAgAAADZTCAABgAAAO7bJgABAAAAIGlzIG91dCBvZiBib3VuZHMgb2YgYAAAoEwgAAsAAAAITSAAFgAAAO7bJgABAAAAzEogABsAAACeAQAALAAAAGxpYnJhcnkvY29yZS9zcmMvdW5pY29kZS9wcmludGFibGUucnMAAABITSAAJQAAABoAAAA2AAAASE0gACUAAAAKAAAAKwAAAAAGAQEDAQQCBQcHAggICQIKBQsCDgQQARECEgUTHBQBFQIXAhkNHAUdCB8BJAFqBGsCrwOxArwCzwLRAtQM1QnWAtcC2gHgBeEC5wToAu4g8AT4AvoE+wEMJzs+Tk+Pnp6fe4uTlqKyuoaxBgcJNj0+VvPQ0QQUGDY3Vld/qq6vvTXgEoeJjp4EDQ4REikxNDpFRklKTk9kZYqMjY+2wcPExsvWXLa3GxwHCAoLFBc2OTqoqdjZCTeQkagHCjs+ZmmPkhFvX7/u71pi9Pz/U1Samy4vJyhVnaCho6SnqK26vMQGCwwVHTo/RVGmp8zNoAcZGiIlPj/n7O//xcYEICMlJigzODpISkxQU1VWWFpcXmBjZWZrc3h9f4qkqq+wwNCur25v3d6TXiJ7BQMELQNmAwEvLoCCHQMxDxwEJAkeBSsFRAQOKoCqBiQEJAQoCDQLTgM0DIE3CRYKCBg7RTkDYwgJMBYFIQMbBQFAOARLBS8ECgcJB0AgJwQMCTYDOgUaBwQMB1BJNzMNMwcuCAoGJgMdCAKA0FIQAzcsCCoWGiYcFBcJTgQkCUQNGQcKBkgIJwl1C0I+KgY7BQoGUQYBBRADBQtZCAIdYh5ICAqApl4iRQsKBg0TOgYKBhQcLAQXgLk8ZFMMSAkKRkUbSAhTDUkHCoC2Ig4KBkYKHQNHSTcDDggKBjkHCoE2GQc7Ax1VAQ8yDYObZnULgMSKTGMNhDAQFgqPmwWCR5q5OobGgjkHKgRcBiYKRgooBROBsDqAxltlSwQ5BxFABQsCDpf4CITWKQqi54EzDwEdBg4ECIGMiQRrBQ0DCQcQj2CA+gaBtExHCXQ8gPYKcwhwFUZ6FAwUDFcJGYCHgUcDhUIPFYRQHwYGgNUrBT4hAXAtAxoEAoFAHxE6BQGB0CqA1isEAYHggPcpTAQKBAKDEURMPYDCPAYBBFUFGzQCgQ4sBGQMVgqArjgdDSwECQcCDgaAmoPYBBEDDQN3BF8GDAQBDwwEOAgKBigILAQCPoFUDB0DCgU4BxwGCQeA+oQGAAEDBQUGBgIHBggHCREKHAsZDBoNEA4MDwQQAxISEwkWARcEGAEZAxoHGwEcAh8WIAMrAy0LLgEwBDECMgGnBKkCqgSrCPoC+wX9Av4D/wmteHmLjaIwV1iLjJAc3Q4PS0z7/C4vP1xdX+KEjY6RkqmxurvFxsnK3uTl/wAEERIpMTQ3Ojs9SUpdhI6SqbG0urvGys7P5OUABA0OERIpMTQ6O0VGSUpeZGWEkZudyc7PDREpOjtFSVdbXF5fZGWNkam0urvFyd/k5fANEUVJZGWAhLK8vr/V1/Dxg4WLpKa+v8XHz9rbSJi9zcbOz0lOT1dZXl+Jjo+xtre/wcbH1xEWF1tc9vf+/4Btcd7fDh9ubxwdX31+rq9Nu7wWFx4fRkdOT1haXF5+f7XF1NXc8PH1cnOPdHWWJi4vp6+3v8fP19+aAECXmDCPH87P0tTO/05PWlsHCA8QJy/u725vNz0/QkWQkVNndcjJ0NHY2ef+/wAgXyKC3wSCRAgbBAYRgawOgKsFHwiBHAMZCAEELwQ0BAcDAQcGBxEKUA8SB1UHAwQcCgkDCAMHAwIDAwMMBAUDCwYBDhUFTgcbB1cHAgYXDFAEQwMtAwEEEQYPDDoEHSVfIG0EaiWAyAWCsAMaBoL9A1kHFgkYCRQMFAxqBgoGGgZZBysFRgosBAwEAQMxCywEGgYLA4CsBgoGLzGA9Ag8Aw8DPgU4CCsFgv8RGAgvES0DIQ8hD4CMBIKaFgsViJQFLwU7BwIOGAmAviJ0DIDWGoEQBYDhCfKeAzcJgVwUgLgIgN0VOwMKBjgIRggMBnQLHgNaBFkJgIMYHAoWCUwEgIoGq6QMFwQxoQSB2iYHDAUFgKYQgfUHASAqBkwEgI0EgL4DGwMPDYCAgICAgICAgPTugIDygICAgICAgICAgICAgICAgICAICGiIyQlJqcoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpb3F1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX6AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIBsaWJyYXJ5L2NvcmUvc3JjL251bS9iaWdudW0ucnMAOVQgAB4AAACrAQAAAQAAAGFzc2VydGlvbiBmYWlsZWQ6IG5vYm9ycm93YXNzZXJ0aW9uIGZhaWxlZDogZGlnaXRzIDwgNDBhc3NlcnRpb24gZmFpbGVkOiBvdGhlciA+IDAAAAAAAABa1juS1lP07j87oQYpqj8R+GVlG2a0WJUHxSSkWcrHSna/PqJ/4a66SfYtDfC8eV1Tb86K35la6dxzeRAsLNj0lAXBtiug2JFp6EuKmxsHeflGcaQ2yE62hOLebILiSJe3mI1NRHri4yWbFggjGxv9cn94sGqMbY73IA7l9fAw/k+fllyF7wiyNalRXjMtvb0jR7yzZiuL3oIT5jWAeCytdqxVMCD7FosxzK8hUMs7TJMXazzoudytPb8bKiS+St943YVLYuhT2Q2vojStbR3Xa6ozbz1x1IdoreVAjGRyhgaVAMuMjcmpwhgfUa/9DmhIusD97/A71PLeZiUbvRICbXSY/pV2pYRXS2D3MLZLAYiRPn471M6lLV44Nb2jnkHqNc5dSolCz7l1hoKsTAZSsuGges6ViYGTCZTR6+9Dcx8aSRlC++uh+Av5xebrFBCmYJufEvpmyvZOd3fgJhrU0DiCR5e4AP20IlWVmLAgiYJjsYxecyCesDVVXV9utFVivN0vNpCoxR2DqjT3iSHreyvVu0O0EvfkI9UBdezppS07ZVWqsGuabjYlIckzskf4ib7q1JwGwQqEbmm7wJ6ZdixuJQpESPENJcpD6nAGwMrbZFeGKs2WKFdeapIGBDi8Ej7tJ3WAvPLs9QQ3CAXGa5eN6HGSoOsuaDPGREqG96N+WDGHW0STHSHg+2rus3pMnq79aHIVuGQp2LoF6mBZ30UaPQPPGua9M44phyS5b6trMAZiwdCPVuD4edS206WWhryHuvHEs2wYd5iJpEiPPKirKSkutuCH3pT+q80aMyVJC7rZ3HGMFAsdf4vA8J9vG44oEFSOr9lN5F6u8OwHSqKxMhTpcdtQYZ322SzoyW4Fr5+sMSeJ0lwiOggcMb7KxprHF/5wqwb0qkgKY71tfXiBuZ09TdYIsdXazLssCU7r8JOCRvCFpY7FCGD1uyUhJu04I1hsp07y9gq48iqvqm8oByxuR9HhrrQNZq/1GspFeYTbpMyCTe2QyJ+N2VA8l5dlEs5/o6AotboH8Q/lDH39/pbBX8zIcmKpSe1THk/cvL78sXf/eg+7E5zo6CWxCTb3Pc+qn6zpVIxhkbF3HYwDdQ2DlccXJGrvufWd1SVvRNLQ43r5Ha1EayhzBUt3xWqDYs7smzLsCkP5Z+NO1XZFJPsB6MI/p82T90GcIorUVu15AqLzDxHBeHVSQ2vWRFY0jEFFmKmqeGuJEwqDDNZrQe+RVr5T1VbGa5jMI4/LxhFrNuztqIrst4a+vyw5PxzrAqKzlKnW8zIU1/d7B0/jpYOK4LlTzLA/2cz12skiXI8krVjoaP+cjw9As9G+lZnZNmw3kaEfwrkJCBAjLfv/j0RHhbWKpzIoDArUq/n5/7MVmebibFE/Mo8MyRY7/H+QrR/QjeOSZ3/Zpz2uSvuf9JgnRLGcd0HfzxHNmR36xzF/MZXdg9UR10NWQEBS/Bx/7z59inIla2bqNShIZjvkXquOHK3P7gUAZUMy2kBKnTZWsmPYgmoHQD7UvpBoTiLidU8+h5GiBOimRHdaAuKqWlPjDak2ywWi0BUVcYOaVTEoXFHTAz6HykRbWg2RgNUemdkShMKGlP4KeVjotuCKZv+PF6VyqDm+TZduYuOYLUD/c13OjxLILSE9CvuOfxyIf2j6gJkLnbw0ZuZ8cp8jap8COaGATsTrwf8fHE6HrERHQ4fJIGK1ZrL/J6MiqdcVGRTp+6i6YgCf//FLtcmmrY+scZ2ptD1gwz93byJ8EJmzF87E0yFNOLQPVcsrm1R/oJ0B9khqYEahUyp+++CUT4QCwZltQvzLRHTaLjkZemMlQzHACFP7/lURkfqIn1i87pM98Monun6rVTV5tWO3NXV8JpbeWDQvi1XBS6I8JYOSG7C7Fm8B++2qsZ7Li+4jdyKc6tzKwXmpFV5GXxd1doqVoZLJHhnsic36CzZdEhTt+km3e2YfZ+yA+c6E9BZZqHkc5RpA54An4beC0liuNwnMMY8QiJCwuOyy0QfvmYULP/6yFaq03OanH4bJagBnzs6935rU4ZPgkadnvUJgAEGh1ovgJG1cLLvI4G1TeECRScyuGG6Ic/fp+lhIaJaQ9Vt/2p6JalB1pDmvLQFeenmZj4gDlkJSyQaEbXiB9djXf7OqgzvTpnsI5cjW4TLPzV9g1WQKiJCaSh77Js1/oeA7XIV/BlWaoO7yXG/A38nYSrOmHkjqwEiqL/SLsFf8jh1g0CbaJPHalDvxV862XXkSPIJYCLfWCD3Fdu2BJLUXF8uibspkDEuMdlRoom2i3dx9ywn9fc9dL5SpAgsJCxVUXf5MfF1DNTv50+Gm5SaNVPqer20aSgHFe8SaEJ9wsOm4xhsJoZxBtpo1wNTGjBwkZ/hiS8kD0mMBw/hE/NeRdkCbHc9dQmPe4Hk2VvtNNpQQwuRC9RL8FVmYxCt64UO5lPKdk7IXe1tvPlpb7GzK85yXQpzP7iyZBacxcicIvTCEvVODgyp4/8ZQvU4xSuw85ewoZCQ1Vr/4pDbRXq4TRg+Umb424ZV3G4eEhfaZmBcTuT9uhFl7VeIo5SZ0wH7dV+fPieUv2uoaM0+YSDhv6paQIXbvXcjS8D9jvloGC6W8tKlTa3V6B+0P+23xx03O6+GUKMYSWUno073k9pzwYDONXNm7q9ctcWTsnTTELDmAsLPPqpZNeY29Z8VB9XdHoNygg1X8oNfw7GAbSfmqLOSJRHK1ncSGFvQ5Ypu31TddrNXOIsV1KBwxxzqCJcuFdNeLgms2kzJjfbxkcfee06iGlzEDApz/Xa7rvU21hghTqPz9gwKDf/XZZi2hYqjKZ9J7/STDY99y0GC8pD2p3oCDbR73WZ7LR0J46w2NUxZhpAjmdPCFvtlSVmZRcOhbec2LH5JsJy6QZ/bfMkZx2WuAtlPbo9gcugDzl7+Xzc+GoKQo0swOpOiA8H2v/cCDqMjNsgaAEs0iYWxdGz2xpNL6gV8IIFeAa3ljGjHG7qbDnLA7BXQ2MOPL/GC9d6qQ9MOcigYRRPzbvju5rBXVtPH0RC1IFVX7ku7F84stBREXmUocTS0V3Rt1tvDueEbVXL9dY6B4WtRi0uSsKheYCjTvNHzIFnGJ+4YOrHoOn4aAlaBNPa7mNV3UElcZ0kao4LoJocxZYIN0idesn4ZY0pjpS8k/cDik0SsGzCNUd4P/kc/dJ0ajBmN7CL8sKVVkf7ZC1bEXTMg7Gsrud3NqPR/kk0qeHV+6yiA+9SqIYoaTjpzugnJ7tH5UjbI1KvtnOLJDqiNPmmGe6TEfw/T5gcbe1JTs4gD6BWR+8/k4PBE8iwTd041AvIPeXnA4R4sVC65F1EixUKsklnaMBhnu2o3ZVwmb3STWrTvJF6TP1Kj4h9blgArXpUzlvB2NAwrT9qlMHyHNTM+fXitlcITMh3TUH2dpACDDR3Y7P8bS39TIhHPgQQD02ewpCc93xxcK+6WQWFIAcRBo9MzCVbmdzHnPtO5mQI0UgnG/mdWT4h+sgTBVQEjYTPHGLwDLONsnF6J8alBaDqCtuDvA/QbS8ZzKHIXk8BEI2aZKML2IRi5E/WOmHW0WSo+QLj52FeycSp7+hzIETo5ZmrrN0xonRN3F/Sk/heHx70AowYjhMJVU93z0juZZ7ivRuXj1jD7dlJrOWBkw+HS7gufWMjCOFDrBAa8fPDZSauOhjD+8sZmI8cGaJ8vD5kTc5benFQ9g9Za5wPheOhCrKd6lEdsSuLK85/C29kjUFXRWD9aRF2bf6yGtZDRbSRsRlcklu86fa5M07L4A2Q2xyvs772nCh0a4QqfuQE9RXT36CmsEsylY5hJRKhGjpbQM3ObC4g8a94+rcrrqhefwR5Ogc9uT4PSzVg9pZWch7Vm4iFDSuBjy4CxTwz7BaWgwc1Vyg3NPl4z7EzrHGEJBHs/qTmRQI72v+pgI+Z6S0eWDpWJ9JGys2zm/SrdG90XfcqddzpbDS4mDt44yjLqLa08R9YF8tJ6rZGUyPy+pbgaiVXKim2GG1r3+/g57UwrIhXWHRQH9E4Y2X1/pLHQGvedS6ZZB/JinBDe3IzgRSCygp6P8UTt/0cUEpSyGFVr3xEjmPROF74L7Iufbc02YmvXaXw1YZqujuuvg0tBgPsGz0bcQ7j+WzKgmmQcF+Y0xH8bllOnPu/9ScH9JRnfx/dObD/3xYdWfM6bv7Yvqtv7IglN8brrKx8CPa+kupWT+e2NoGwppvfmwc8ajes79PS0+IVGmYRacTghcpgyhvga4jWnlD/obw2IK889PSW5IJvHD3pP44vP6zO/Do9uJWrd2Omtc222YHOB1WkYplvhlFAmGM1KJviNYE/GXs7v2f1mLZ8CmK+4sLljtfaBqdO8Xt0A4SNuU3BxXtE6kwqjr3eRQRhoSuhPkbGFiTfOSZhUe5deglugXHcj5uiCwd2DNMu+GJF6RLhId3HQUzgq4gP+qqK21tbpWJBOSmYEN5mC/1RIZI+NpbO2X9v/hEI+cl8Wr7/WNwWP0Hvo/jcqzg/22lmtzsbJ8sab4jzC9oOS8ZHxG0N3e213Q9rN8rOQO9r4NLKKKa6k6QnrwzWudkrMuEbdKrcZTydKYbMGGRHdgetVkndi3qHsHv8dx6ItKfGwFX2KHckmtZNccRxEtXZvHxvY6qc+b2D0N5JjVeTSCeXi0idPDwk6NEB3/Sstg8UvLEDaEujlRWCpy387+uO0e/pRDpSiIZe60TpfCPieppj16lM4y6v4pYiI9c4e4KYhmzByBX1I/Wn01BgioJjQqgP9jofcmz7DcwgfKUjDBNGD/vMm18ALdk7OJ/Gd88UE4Pyz84qxD1HggrLvA7TYpg6ebnQ1MqoRLlEvVMamE82ORAsUR39RlXnmeCn3TZfC8NUP21RZK/7UXRk0upD8WlgHqmUVOjr/RzktQOY3Pm/uBZMDW4XEvhsJe5Ihww4J6on3wTFpOuydzdl1VJrqRjIVOlm/4ENX4B2o66q8otu8m4ruLNlUK94kEieXbsqOrsNrqLoTqzHSsRStvyU9Ga67Ikp2SEgDJiws7y7vjFwbaerdENxdAu27OCb2q3J2HkFnlFQUdEGoKQsy26qnCVPpXjy0jEkqCRqmfZGVU8+n4LbP5q5bcIpiTR71+KXAkd/nf91a8kyt+eFk27xnGdur7i1q2VTzbTutXA2ugdxTl+q7xI2sLkiLm7cSFiJVZnrna7exFjjarX+mbU3X99wK0iBS06xgCy9sRgajS/LUD4aoZoSafwr1S1qJSB3yjRJnVX0nwRjNt50ulk4Qt5sp/hdstVgxApHBvjrjluJ+936ZSuWsPUM1My7ImH6cHrZfQp6dGE6QAIH4veHPIJMxegsgoDIxmANSOO1aQ+i1/9qL6Mg8vgACJcsprNHn5HrTLuf/SOqBAK0+8hoHXtyah/qi/h0nIEPbiNvSw5jK4JJ/J1/QtfcrZDUMxXaA/5u3Guw1yeRw9UJGUfXSIz1+p+CqRzpdjTKR1fM5IteHbaZu6GuE+vq+GyRsCmyLaUkTCaGGZzq1b6PuiwkGrkGfV8sO5P0KZcuL6pRkJa7pgxZca1GfJn4fN3A9gywXpuLa9IMnBu4fpAFQTOD5HI2ck7Wg7sqrpIwEpC+OGDHbANpQhZa8Kcrag+c6bqI+TcES5aT5bjQ7kCPjCwpJzuIyV5wQOsjASHQu2ubk7SPN3vZDCSG9eK/LGsSioShrw1ey08xoLNrauOB4yUt0gbAso4rDhjcNj2sYlX1OKlCMHWY0OrThafkicVzforHnsSK+wUdjG8J1agy1EIhiYJxvb3GWO+GxFMeT4axUPv/jwCIr/WBtky56OG8Xa0u42LYusPy8iPX5GcuJ3kYeqhPit1w+7aswd2A5b6rqU6lK7zIbptMKfEkfpmKXpOaUn6n+oJGKzR9eYIz8OZIiOseSf0q06oBkNf+yOiT4V+e7uo4OsJAQwaM9TGSuOWreq6oyk1y0FPELDqF+2MTFlVSWwzU15BssS9JI3Eb8+X1UXjoDQC+S+i9i74tZuDrcqnbGgxA6drq7OaluLCtJkdQTeyHVSRFpagkXyLo0GvpKFFfsSZ9Xw8OLW7j0YxLZ7c+2ca2CFltZNRlVMHnWkWtAoxIa4JjxM4Zeq32WSTXEEM/WoZjBLn9k91at/e9DG4j+ZKUD+jgOoRuWWX5qEeNuPvzPQvXIEUpjefPfApVbSc+9ARG2PhWY+lq2amCd2Y6iVqEqkeRMA591ZwX6xU3wSu1JdDVgYwGBVr3HenWgb1+mmtBBuHvC4qg0Hq2IhcSaS6HDKBBOWs8rRyFW7aQ2wtiIN/cWXe2A9BTsrKsQQXORqUHy3fZq4jOMEW5p6irmOQrKtko5g83ccxvFAGe1nstMeWTeyOPBVozcukV/oAd+IZi/F3kZsa8bivLo7MWGLFaA9O0usIyN3G2ypin05rhoIDQpel+yrVSLHU+3cx9khSpCMNb3nlnV1XFQU6hyIVC7ad0HWUH7SknNpmSQkqum50NXRC+Xdh3fQw78trdRk6ERLxk5elbRKYtqXPOyEPhEL7zvxWr1h3frQvUsnpo7VzeqKrbHsupQ5Ra0esc/ySoGl7RjeZ/T8Q0sss86B185wh5TP6oAx/BRe919Coo0CTal5gyWhPjuaNfX30sowQ6ATWORuCQ3KAIPytYf9/FOIGG6dyotIfuCRt9F0nn40Vc9kol532p1YdiUGEsaegSoD/ko2lVHF7tOuh5b3BSL1g73dgzpSO3VEzRS+mkM1eXKWapLEJ4qSlQCabcGUghcPPAW3dbEs97qAAMnxOWPdEovGJFPue9p0UKAdlwReyusW/PbT6hoRkmQI5byF9bymHLv0iKVhlbZ9Sh7s5jJs0OPpMSsHXR2Sju6Sk9CfQ2IuMv86SbSkNjKqd7jDh9T6uf6+CVvhTcS+lJXmtKmJeWi+LkzZrLA693wdkBEK9ksBN50PD9hcCTXcJLSVjPOewYSEUxMOtEtCEy7hum+wBvKlZSjLiFBvCcy8jNRFLkS3hz/5/qokywv/669J1zkVpWmP977V7b3O/ubbHE2IWg5Ec7WXpbQ2QV9wiTEwlfiICmgx/M5hhBF3zKs+fLo2Kw3C/bxCeuXVlL/WTRtpBHaQMj21aWyvBb03hhCxwcJJmj+mI4RHG0esxadUHXIz3IDPDytlGeJYF7fRqaROQBNhw9M730+Nl24Sg+omMQisHFpkCtejcD0K16OkcD0K16NwPczMzMzMzMzMzczMzMzMzMwAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAKAAAAAAAAAAAAAAAAAAAADIAAAAAAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAAAAQJwAAAAAAAAAAAAAAAAAAFDDAAAAAAAAAAAAAAAAAAAk9AAAAAAAAAAAAAAAAACAlpgAAAAAAAAAAAAAAAAAILy+AAAAAAAAAAAAAAAAAChr7gAAAAAAAAAAAAAAAAD5ApUAAAAAAAAAAAAAAABAt0O6AAAAAAAAAAAAAAAAEKXU6AAAAAAAAAAAAAAAACrnhJEAAAAAAAAAAAAAAID0IOa1AAAAAAAAAAAAAACgMalf4wAAAAAAAAAAAAAABL/JG44AAAAAAAAAAAAAAMUuvKKxAAAAAAAAAAAAAEB2OmsL3gAAAAAAAAAAAADoiQQjx4oAAAAAAAAAAAAAYqzF63itAAAAAAAAAAAAgHoXtybX2AAAAAAAAAAAAJCsbjJ4hocAAAAAAAAAAAC0Vwo/FmipAAAAAAAAAAAAoe3MzhvC0wAAAAAAAAAAoIQUQGFRWYQAAAAAAAAAAMilGZC5pW+lAAAAAAAAAAA6DyD0J4/LzgAAAAAAAAAAhAmU+Hg5P4EAAAAAAAAAQOULuTbXB4+hAAAAAAAAAFDeTmcEzcnyyQAAAAAAAACkliKBRUB8b/wAAAAAAAAATZ21cCuorcWdAAAAAAAAIPAF40w2Ehk3xQAAAAAAAChsxhvgw1bfhPYAAAAAAAAyx1wRbDqWCxOaAAAAAABAfzyzFQfJe86XwAAAAAAAEJ9LINtIuxrCvfAAAAAAANSGHvSIDbVQmXaWAAAAAIBEFBMx61DipD8UvAAAAACgVdkX/SXlGo5PGesAAAAACKvPXb43z9C40e+SAAAAAOXKoVqtBQMFJ8artwAAAECePUrxGcdDxrC3luUAAADQBc2cbW9c6nvOMn6PAAAAoiMAguSL8+Qagr9dswAAgIosgKLdbjCeoWIvNeAAACCtNyAL1UXeAqWdPSGMAAA0zCL0JkXWlUMOBY0prwAAQX8rsXCWTHvUUUbw89oAQBFfdt0MPA/NJPMrdtiIAMhq+2kKiKVTAO7vtpMOqwB6RXoEDeqOaIDpq6Q40tWA2NaYRZCkckHwcetmY6OFUEeGfyvapkdRbE6mQDwMpyTZZ1+2kJCZZQfiz1BLz9Btz0H347T0/59E7YESj4GCpCGJeg7x+L/HlWgi1/Ihow1qKxlSLfevObsC64xv6suQRHafpvj0mwhqwyVwC+X+tNVTR9A28gJFIpoXJidPn5BllCxCYtcB1qqAne/wIsf1frm30jpNQovV4IQrrev4st6nZYeJ4NJ3hQwzO0yTmy/riJ/0Vcxj1abP/0kfeML7JWvHcWu/PIqQw38cJxbzeu9FOU5G74tWOtrPcdjtl6y1y+Pwi3WX7MjQQ45O6b0Xo74c7e5SPSf7xNQxomPt3UvuY6iqp0z4HPskX0VelGrvdD6pyuiPNuQ57rbWdblEKxKOU/3is0RdyKlkTNPnFraWcai822BKOh3qvg/kkM0x/kbpVYm83YikpK4THbVBvr2YY6uraxSrzU2aWGTi0S3tfjyWlsbsiqBwYLd+jaI8VM/lHR78qK3IjDhl3rDLSylDX6UlOxLZ+q+G/hXdvp7zE7cO70mrx/wtFL8tijdDeGwyaTVulvl7OdkuuawEVJYHf8PCSfv32oePeufXBul7yV50M9z92ui0mazwhqNx7T27KKBpvBEjIsDXrKgMzmgN6jIIxCvWqyqwDdjSkAHDkKQ/CvXbZasajgjHg/rgedrGZyZ5Uj9WobHKuKQ4WRiRuAFwVybPqwle/ebNhm9etSYCTO14YQvGWl6wgLQFWzFYgU9U1jmOd/F13KAhx7E9rmFjaUzIcdVtkxPJ6TgezRk6vANfOs5KSXhY+yPHZUCgSKsEe+TAzi1LF512nD8oZA3rYpodcUL5HV3ElINPMr3QpTsAZQ2Td2V09Xlk437sRI/KIF/ou2q/aJnLHk7PE4uZfuh24mpF78K/fqYhw9jtP56iFJvFFquz7x4Q6vNO6c/F5eyAO+5K0JUSSnJY0fGhux8oYcqpXUS7l9yOrkVuiiomcvk8FHUV6r2TMhrXCS31WOcbpixpTZJWnF9wJiY8WS7hos93w+C2bIN3DLAvi296mYvDVfSY5EdklQ+c+20L7D83mrWY346sXr2JQb0kR+cPxQDjfpeyV7Ys7JHs7VjhU/bAm1493+3jN2e2ZykvbPSZWCFbhot07oIA0uB5vYdxwK7p8WeuEaqjgAZZ2OzpjXAaZO4B2pWUzCBIbw7osliGkP40QYjd3H8UjQUJMd7upzQ+glGqFdSfWfBGS72W6tHBzeLl1BrJB3CsGJ5snjIjmcCtD4Ww3QTGa8/iA0X/a78wmVOmHBWGt0aD24QW/0bvfH/oz2OaZ2UYZBLmbl+MFa5P8YF+wGA/j37LT0l375qZo22infA4DzNevuMcVasBgAwJy8UsB9O/9a1cYyoWAqBPy/3298jHL3PZc37aTQHEEZ+e+prd3P3nZygdUaEBNdZGxrgBFVT94YGyZaUJQsKL2PcmQhqpfFoiH18HRmlZV+eaWGmw6Y14dTM3iZfDLy2hwa6DHGSx1lIAhGt9tHt4CfKapCO9XYxnwDJjzlBN60WX4EY2lrq3QPj/+wGlIGYXvZjYwzup5VC2/3pCzqg/Xey+zrSKEx/lo9+M6YDJR7qTNwGxNmwzb8YX8CPhu9mouIRBXURHAAu4Hexs2SoQ0+blkXQVWcANppIT5Mca6kOQL9torTeYyId3GN15oeRUtPsRw5hFvroplF5U2MkdauF61vP+1m0p9B27NCeeUuKMDGZYX6bkmRjk6QGxRecasI9/LvfPXcBeXWRCHRehIdxzH/r0Q3Vwdrp+SXKuBJWJqFMceUpJBmpp3tsO2kX6q5JoYxed24cEA9aSklDX+Na2QjxdhNKpRcLFm1uShluGsqlFupIjigsyt4LyNmjypx4U12h3rGyO/2Qjr0QC79Em2QxDldcHMh8fdu1qYTWDuAfoSb3mRH/nptOoxbkCpKYJYpxsIBZfoZAIEzdoA80PjHrDh6jbNmRa5WsiISKAiZcs2lRJScL9sN4Ga6kqoGy9txCqm9vyPV2WyMVTNcjHrOWUlIKSb4z0uzq3qEL6+Rcfujkjd8vXeLWEcqlpnPtuUxQEdir/DdfiJc8ThMO6SmgZhRP1/tGMW+/CGGX0aV3CX2ZYsn4COJnVeS+/mGF62fs/dy/vA4b/Slj77r762M/6D1X7qoRnv10uuqruOM+D+VMqupWyoJf6XLQqlYNh8nt0WpTd34g9OXRhdbrk+e6aEXH5lBfrjEfRuRLpXbiqAVbNN3ruErjMIrSrkTqzCsFV4GKsqhfmfyuhFrYJYE0xa5h7V5Sd3192SZzjC7ig/YV+Wu19wuv76a1BjgdzhL4Tj1gUHLPmemQZ0rHIjyWu2LJuWeNfoJm9n0beu/Ou2Y5fym/uOwSA1iPsilRYDUi5e94l6UoFIMwsp61qrhCapxpWr6SdBij/9xDZBNqUgFGhKxuGIgR5/5qqh0IIXfDSRPuQKCtFV79BlalTSnSsBxY6NfJ1Fi0vkvrT6FyRl4mbiEK3CS58XZt8hBHauv41YZVpJYw52zTCm6WVkGl+g7n6Qy7vBxLCsgLPu/QDXuRn+ZR99URLua9hgfV4wrru4Bsd3DIWnqcbuqEyF3NpKtliZJO/m4WRoijK/tzPA3WPe314rwLnNcuy/D7Uw0RSc9pcq61hsAG/752nZPpqE4gIOhYZehzCrmvF0P24RRiqighbn5ijcprG9kU9J1eeVK2KmWM/pocgPJpLhnj24lSsNn88z4+pKMvA3acWtBtqV4SfC8Pz0/L98NVRHKGiRG1lQ+dZeMS3npYls7Gk5UpknxRhcJa1ZUa87h/eDZ9dPYdZeQz8Iv9X6+qnVdEGtQyp2MuH3XX/FpPyiNVCJPGnCc6+6VRTv9y3L+uKU23tEQyBLiQqKO/T5fqlbajIaBaPEJ1WGnl1pI+8h0RpfQFu+VVE7GDXko2zrKmVw9yByTdqVSc5jfdw4BcUe/RT4ruFYpW4Q7iaRoyO7Mx4dG2Vk7u6plRmQVivsicAl9HIejhqadDpv1Eu254xwPwFe5kG4kEi8hfz/IgDH/i94+wfRFrSqu7dLzyrwyZ2rRzoJ9XxhlVq1TsL1nSw09gj4nGKVnR1YmUFx4VJToRnVi2H9mzREru+xjin22FlAaz4KLTHhddpbvgG0VK6vgHXNjPhnLMmAkVbpIJzNBdhRgLA7IRgsEIWck2jkAFd+dcC8CeleFzTm84gzPRBtPeNA+wxzpYzyEICKf9xUqF1cQRnfkE+IL1poXmfhtOE6cZiAA/RTWgsxAlYx2gI5qN4e8BSRWGCNzUMLvmCit/MVppwp8t8sUKhx7ybkbYLQHZgpoj+212TifmrwjWkDtCT+M9q/lI1+Ov3VvNDTRLEuPaDBd5TIXvzWhaYSnCLejN6csPWqOlZsPEbvlxMLlnAGE90DBNkcBzuou1z33lv8N5iEeeLPsbR1IWUqCusRVbL3YrhLs43BkqnuZI2F9crPpVtmbrBxYccEeg3BN3Mto36yKAUmdvUsQqRoiIKQJKYnB3IWX8SSl5NtUurDNC2vgMlOjAfl9y1oOId1g+EZK5ELiR+c96pcaSN0uWJ0v7s6lytXRBWFI4NsUdfLIc+qCV0GHWUa5nxUN0Zd/coThIv0S/JPOP/llKKb6qa2XBrvYJ7+wvcvzznrAtVARBNxmxjWvoO0+8LIdhOqgFU4PdHPHhc6eN1pxSHcQqBNOz6rGWWs+NcU9HZqA1NoUGnORh/fKAcNKhFENNQoAkSEUjeHk3kkSCJK+qDMgRGqwrtSpNgXbZoa7bkpD+FF1ZNqB34ufTjQgbkHc6OZp2rYBIlNvN4zumDrtKAGWBCa3wr18EwF0LkJFoHoR/4EoZb9kyy/JxSHa4wSckntpdn8jPg3jxEp6TZfJv7saN9Ae9AmBaliugGCC5BnU6G7mCVKB+OTq2iCIp5kcTiJyq5uvKm8aJYy4rs17X127F0Z2mvEK5lF7/W86aRmSnvqOChbcqsP91uzLAQ9r/zKtNYCgn9F46Uiv/clPPvsPUH70xL/N3ZnLYfCj34lY75ZBUQr71KD0Skp0xMdrvxN74a1BptnRNVjdFf31Pq7cVtIYlhyIQsVfjim2t0krSb5LT1PP0yd2q224KGEbehwh0iM4y8PxUFpJIj6NXkSjOl6j+vqw8tg6Y7FrEFjw5Ap/KHTcsp+COQylsdx7ISEFHv6SA+dPYsNL2y5HjfFlQlaySpTZEanEC2746ri45U98K2idAaIMPQo6tylq6xKbVzJKyEoejzxIxWDzzaHnSikC3X5clxGPsXlolliJKIZXp8pi9+jd75nfvrfqq36v6YG5C73TFWeIX6ph7VZaU+fyJ0KlXeNWuTXCgzhV8nh4+ViDrVVgNGuHPyf6Y38WjzuiqJiiyEV6YQ7x/QhS1DsGl1Ky2bsvZnavUTgnP8KQ5iKTucQl/0AcXymKKPe7SRuvNJgxN3cUJ2Lz/Lc5ohNqlwHCTX1A3TU/sO/hABqoPTjCPtBqXoYxRdyZ6qQEoyBDg29EjO4nxZtHvG1dDcPgXGQ7HagRvcb6Ea+AoFlI6Gt5TdKDGR6eWkEJsmgxwZtPJ8ynJ99WMfztTB8KNjH2EvHP3P3PI8pwFK8uyMPGc5O2O8AcoXhghBbpcT2IXgAwW+1YK8nadK0Um9GE6n2ESGLUuiK4VRnUWc7J4h0Q7W5/jdRTvzUoKr4ZMDtULJ5ZC7yhcKsOdiFtq4Q2KTOx91aj2dDJyh+5sQ59Q6eApnEsUM4ocBRX1hapDFJItmgCv7J9rpQZbc+YS09u0tgGD2+bFRZNK7Uzim4XNpOaD4c3hesn5jVTTjB43o4SNke0gL219evGoB3EmwYtosPZoazpH3dWvFAVNc3PsQeMxAoUF2uiljG+GzuYmdCst/yATpqSn0O2LZICisRM29n/pFY1Qz8cq6Dyky15VArUd5F3ypwNa+1KlZf4ZdSMzMq47tSXCM7kkUMB+odFr/v1byaFyML2pcGfwm0hEx/2/sLoNzt13C2Y9dWIOrfv/FU/0xyCX1MtDzdC6kVV5/t6h8Prpvsj/EMBI6zes1X+XSG84ohc+nel5LRICzgVvPY9GAeWbDURk2XlWgH2Iyw7wF4ddANKafw7VqyKf6/vMrR9mNUMGPhzRjhfpRuf7w9phPsdLYudQAXpOc0zOfVpq/0W4HT+gJgTW4w8gAR+yAL4YKyGJiTOFCpvT6wFgnYbsnzb19vc/M6eeYnHiXuBzVOIAs3awDQOQhv8NWveZjCkfgeBSYBFBd6u50rGzg/MxYGMsM3wJSelKVyOtDDB6ANw/9z5aD5hinurrmVI8lYAXT/YN8JCDfUOlpICrzLrjGR37SzRZ0i9KRQVT6Vx0z3EwdR4EcUS5HtlLp+K3kPxPg5ZihY+X52OOmI3fZ3Q8YWI//RF4vnGeOSHbqp+oJD1dlbmNvZGVfdXRmODogbmVlZCAgYnl0ZXMgdG8gZW5jb2RlIFUrIGJ1dCBidWZmZXIgaGFzIGp1c3QgAABwfSAAEgAAAIJ9IAATAAAAlX0gABUAAAACAAAAAAAAAAIAAAAAAAAAAAAAACAAAOACAAAAAAAAAAAABAAAAAAAAQAAACAAAOkCAAAAAAAAAAIAAAAAAAAAAgAAACAAAOBhdHRlbXB0IHRvIGNhbGN1bGF0ZSB0aGUgcmVtYWluZGVyIHdpdGggYSBkaXZpc29yIG9mIHplcm8AAAAMfiAAOQAAAGBhc3luYyBmbmAgcmVzdW1lZCBhZnRlciBjb21wbGV0aW9uAFB+IAAjAAAAcmFuZ2Ugc3RhcnQgaW5kZXggIG91dCBvZiByYW5nZSBmb3Igc2xpY2Ugb2YgbGVuZ3RoIHx+IAASAAAAjn4gACIAAAByYW5nZSBlbmQgaW5kZXggwH4gABAAAACOfiAAIgAAAHNsaWNlIGluZGV4IHN0YXJ0cyBhdCAgYnV0IGVuZHMgYXQgAOB+IAAWAAAA9n4gAA0AAABjb3B5X2Zyb21fc2xpY2U6IHNvdXJjZSBzbGljZSBsZW5ndGggKCkgZG9lcyBub3QgbWF0Y2ggZGVzdGluYXRpb24gc2xpY2UgbGVuZ3RoICgAAAAUfyAAJgAAADp/IAArAAAAsz4nAAEAAADCAgAASRIAAm0WQDQWHwA5tiSARQAsYE4FMKBOADRgU8BNYFaNpIBWDabAVqTXQFcA+YBibvogYz79QGOAAgFmNwcha+AeAXGaI6GYkC8BmjA0oZr7QwGbR0aBmwBhwZsAaOGbOWohnEBtQZz4hyGe1oxBoPCvgaAjseGg/LLBoQC8AaMA1CGjptZhpADfAamQ4uGr0OThruDnYa8A7iGwMPEhsgAAYrrgpiK7OrdCu6LOgrvh6wK8Xu5CvAD4grwe+qK8AADDvEsT47ywIwO9sCNUvQADAACDBCAAkQVgAF0ToAASFyAfDCBgH+8sICsqMKArb6ZgLAKo4Cwe++AtAP4gNp7/YDb9AeE2AQohNyQN4TerDmE5LxjhOTAc4UrzHuFOQDShUh5h4VPwamFUT2/hVJ28YVUAz2FWZdGhVgDaIVcA4KFYruIhWuzk4VvQ6GFcIADuXPABf11gBgAAZgkgAUAQ4AFpEyAG7hagBkYZ4AZwIOAHYCTgCXYnIAv9LKALBzDgC5IxIAwgpuAMMKhgDvCr4A4Q/2AQBwGhEOEC4RBYCKER+gwhE2AO4RZQFKEXUBYhGuAYoRrwG6EbUB8hHAAkIR0wYaEdYGrhHXBtIR6AbiEf8MxhH8DSoR/O1+EfQOGhIPDi4SDw5CEhx+hhIXHs4SEA8WEi8PuhI/r78iNpbnZhbGlkIGxlbmd0aGludmFsaWQgc3ltYm9sbm9uLXplcm8gdHJhaWxpbmcgYml0c2ludmFsaWQgcGFkZGluZyBsZW5ndGggYXQgAQAAAAAAAADMgSAABAAAAExlbmd0aFRyYWlsaW5nUGFkZGluZ0RlY29kZUVycm9ycG9zaXRpb24CAAAAAAAAAAAACAAAAAAAAAAAACAAAOkAADEAMgAzADQANQA2ADcAOAA5ADEwMTExMjEzMTQxNTE2MTcxODE5MjAyMTIyMjMyNDI1MjYyNzI4MjkzMDMxMzIzMzM0MzUzNjM3MzgzOTQwNDE0MjQzNDQ0NTQ2NDc0ODQ5NTA1MTUyNTM1NDU1NTY1NzU4NTk2MDYxNjI2MzY0NjU2NjY3Njg2OTcwNzE3MjczNzQ3NTc2Nzc3ODc5ODA4MTgyODM4NDg1ODY4Nzg4ODk5MDkxOTI5Mzk0OTU5Njk3OTg5OS1JbmZpbml0eQAAAAAAAAAAAAAAAAAAAHsPuxOc6OglT9y8vvyxd/+t6VSMYZGxd7EJNvc9z6qfGCRq77n1ndUdjAN1DYOVxx6tRGsocwVLJW9E0tDjevkz7ApD+WfjTnfFaoNizuybQKfNk/dBnCLVdkUk+wHowhARwXh1UkNritRW7XkCovOqqnhriRMKg9ZEVjSMQUWYVNVWxmuYzCMM1mtB75FWvqmK7LeGvr8sj8vGEWs27O2q1vMyFNf3ezk/HOsCorOUVMywP9nM9doHT+Olg4rguWn/nI8PQLPRySJcjyStWOiiH8K5CQgQI76Vmdk2bDeRi6cyKAwK1Kst+/+PREeFtW1RPzKPDMkW+fn/sxWZ5uLkkmd/2ac9rjv8f5CtH9CNnXdB388RzZlK+5/0mCdEsYTVEddDVkBAHfrHMX8xld1zJWtm6jUoSFL8HH/vPn2K0O4FAGVDMtpmO+Req44crYNqB0A+1L6QQEqdNlayY9iSogTopkR3WmhOIuJ1Tz6HN8sFotAVFXEC4qpaU+MNqQQ+h8pEW1oNg5pVMShcUdPDhpT+CnlY6JGA1R6Z2RKEc6g5vk2XbmK24Ipm/48XpZASyC0hPQr745gtQP9zXc6aC528NGbmfI5/HIh/aPqAgU7E68H/HxxynyNqnwI5oSFitWay/yejToesREdDh8mpumIAn//xSyKp1xUZFOn7qrQ9YMM/d2+1yaatj6xxndQhTTi0D1XLInwQmbMXzsRJamBGoVMqfiubVH+gnQH2bkL8y0R02i774JRPhALBmQlT+/5VEZH6ORl6YyVDMcDLJ7p+q1U1eYifWLzukz3w31g0L4tVwUu1Y7c1dXwmlhdvAfvtqrGeojwlg5IbsLvdysF5qRVeRsuL7iN3Ipzqyh4Z7InN+gtfF3V2ipWhknxmH2fsgPnONl0SFO36SbcbQOeAJ+G3goT0FlmoeRzlEYiQsLjsstHSWK43CcwxjxaqtNzmpx+GB++ZhQs//rKb1OGT4JGnZ8lqAGfOzr3f4SRtXCy7yOC9QmAAQaHWixluiHP36fpYbVN4QJFJzK6fiWpQdaQ5r0holpD1W3/aBJZCUskGhG0tAV56eZmPiIQ706Z7COXIeIH12Nd/s6plCoiQmkoe+9bhMs/NX2DVgAZVmqDu8lwmzX+h4DtchR9I6sBIqi/0b8DfydhKs6Yn2iTx2pQ78YuwV/yOHWDQWQi31gg9xXZXzrZdeRI8gm/KZAxLjHZU7YEktRcXy6IK/X3PXS+UqWiibaLd3H3LTXxdQzU7+dMCCwkLFVRd/rBtGkoBxXvE4ablJo1U+p4cCaGcQbaaNZoQn3Cw6bjGY0vJA9JjAcPA1MaMHCRn+B7PXUJj3uB5+ET815F2QJvlQvUS/BVZmDZW+002lBDCnpOyF3tbbz7EK3rhQ7mU8kOcz+4smQWnWlvsbMrznJdUg4MqeP/GUDFyJwi9MIS9KWQkNVa/+KS9TjFK7Dzl7Jq+NuGVdxuHNtFerhNGD5RAboRZe1XiKISF9pmYFxO50InlL9rqGjPlJnTAft1X5yJ2713I0vA/T5hIOG/qlpCqU2t1egftD2O+WgYLpby0lSjGEllJ6NP7bfHHTc7r4V3Zu6vXLXFkveT2nPBgM420z6qWTXmNveydNMQsOYCwoYNV/KDX8OxnxUH1d0eg3EVytZ3Ehhb0YBtJ+aos5InWziLFdSgcMTlim7fVN12sjIJrNpMyY33HOoIly4V015gxAwKc/12uvGRx957TqIb9/YMCg3/12eu9TbWGCFOofP0kw2PfctBmLaFiqMpn0m4e91mey0dCYLykPanegIMJ5nTwhb7ZUnjrDY1TFmGkjB+SbCcukGdWZlFw6Ft5zbdT26PYHLoA9t8yRnHZa4ClKNLMDqTogPOXv5fNz4agzrIGgBLNImHwfa/9wIOoyIJfCCBXgGt5bF0bPbGk0vqxOwV0NjDjy2MaMcbupsOcnYoGEUT82778YL13qpD0w0UtSBVV+5LuO7msFdW08fRLHE0tFd0bdcXziy0FEReZXmOgeFrUYtK28O54RtVcvzV8yBZxifuG5KwqF5gKNO+hTT2u5jVd1A6seg6fhoCVCqHMWWCDdIkSVxnSRqjgukzJP3A4pNEr16yfhljSmOnQ3SdGowZjewbMI1R3g/+RQ9WxF0zIOxoIvywpVWR/tpRKnh1fusogyu53c2o9H+Sd7oJye7R+VD71KohihpOORKojT5phnumNsjUq+2c4stWU7OIA+gVkMR/D9PmBxt4F3dONQLyD3n7z+Tg8ETyLRtRIsVCrJJZecDhHixULrlgJm90k1q07dowGGe7ajdnX5YAK16VM5ckXpM/UqPiHTR8hzUzPn168HY0DCtP2qSBnaQAgw0d2K2VwhMyHdNR04EEA9NnsKTs/xtLf1MiEkVhSAHEQaPQJz3fHFwr7pbXuZkCNFIJxzMJVuZ3Mec8xVUBI2Ezxxr+Z1ZPiH6yBfWpQWg6grbgvAMs42ycXoh2F5PARCNmmO8D9BtLxnMpkph1tFkqPkEowvYhGLkT9/4cyBE6OWZouPnYV7JxKnv4pP4Xh8e9Aus3TGidE3cV99I7mWe4r0SjBiOEwlVT3z1gZMPh0u4K5ePWMPt2UmgKvHzw2Umrj59YyMI4UOsHCmifLw+ZE3KGMP7yxmYjxusD4XjoQqynlt6cVD2D1lujwtvZI1BV03qUR2xK4srwirWQ0W0kbEVYP1pEXZt/rNey+ANkNscqVySW7zp9rk0On7kBPUV09+zvvacKHRrgTUSoRo6W0DPoKawSzKVjmrHK66oXn8Efc5sLiDxr3j1cPaWVnIe1Zk6Bz25Pg9LMtU8M+wWloMLiIUNK4GPLg/BM6xxhCQR5zVXKDc0+XjPuYCPmektHlz+pOZFAjva86v0q3RvdF34OlYn0kbKzbhLeOMoy6i2typ13OlsNLiWVlMj8vqW4GTxH1gXy0nqu+/v4Oe1MKyKJVcqKbYYbWN19f6Sx0Br2FdYdFAf0ThgU3tyM4EUgs51LplkH8mKfGBKUshhVa96Cno/xRO3/R/CLn23NNmJrESOY9E4Xvgrvr4NLQYD7B9dpfDVhmq6OpJpkHBfmNMbPRtxDuP5bMU3B/SUZ38f0fxuWU6c+7/zSm7+2L6rb+05sP/fFh1Z/Bj2vpLqVk/siCU3xuusrHsXPGo3rO/T17Y2gbCmm9+U8IXKYMob4GLT4hUaZhFpxjCvPPT0luSLiNaeUP+hvD+8zvw6PbiVom8cPek/ji8x3gdVpGKZb4t3Y6a1zbbZgkWBPxl7O79mUUCYYzUom+LS5Y7X2ganR/WYtnwKYr7t0cV7ROpMKo7xe3QDhI25QU5GxhYk3zkuvd5FBGGhK6GB3I+bogsHdmFR7l16CW6C8SHdx0FM4KYM0y74YkXpG7ViQTkpmBDbiA/6qorbW1amztl/b/4RDmYL/VEhkj48Jj9B76P43Kj5yXxavv9Y2zfLGm+I8wvbOD/baWa3Ox39td0PazfKyg5LxkfEbQ3WypOkJ68M1r5A72vg0soorHU8nSmGzBhp2Ssy4Rt0qtuKh7B7/HcehEd2B61WSd2HNJrWTXHEcRi0p8bAVfYofQm9g9DeSY1S1dm8fG9jqpxMJOjRAd/0p5NIJ5eLSJ07s5UVgqct/Oy2DxS8sQNoQpiGXutE6Xwv647R7+lEOlM+r+KWIiPXM+J6mmPXqUzmBSP1p9NQYIh7gpiGbMHIH4Js+w3MIHyqgmNCqA/2OhtvAC3ZOzifxSMME0YP+8yeOsQ9R4IKy7Z3zxQTg/LPwOTKqES5RL1cDtNimDp5udEt/UZV55ngoxqYTzY5ECxdYWSv+1F0ZNfdNl8Lw1Q/ZGTo6/0c5LUC6kPxaWAeqZ1+FxL4bCXuQ5jc+b+4FkwE1aTrsnc3ZdiHDDgnqiffBw+BDV+AdqOlUmupGMhU6WjDZVCveJBInqryi27ybiuy+E6sx0rEUr5duyo6uw2uqekhIAyYsLO2/JT0ZrrsiSRTcXQLtuzgnLu+MXBtp6txYFHRBqCkLMvarcnYeQWeUuIxJKgkapn7bqqcJU+leP+quW3CKYk0dkZVTz6fgts/hWvJMrfnhZvX4pcCR3+d9btlU8207rVzbvGcZ26vuL8iNrC5Ii5u0Da6B3FOX6ru7sRY42q1/pxIWIlVmeudoVtOsYAsvbEZtTdf33ArSIGqEmn8K9UtaBqNL8tQPhqmBJ8EYzbedLolIHfKNEmdXcLVYMQKRwb6WThC3myn+FU7lrD1DNTMuOuOW4n73fpqinRhOkACB+siYfpwetl9DJKAyMZgDUji94c8gkzF6C+zIPL4AAiXI7VpD6LX/2orr/0jqgQCtPyms0efketMupv4dJyBD24ryGgde3JqH+ytf0LX3K2Q029LDmMrgkn7wNcnkcPVCRQzFdoD/m7cYrkc6XY0ykdZR9dIjPX6n4uxrhPr6vhsl8zki14dtpm2lhmc6tW+j7GwKbItpSRMLEuT9CmXLi+qLCQauQZ9XyG9RnyZ+HzdylGQlrumDFlyHJwbuH6QBUD2DLBem4tr1pO7Kq6SMBKRM4PkcjZyTtImWvCnK2oPkL44YMdsA2lGo+W40O5Aj4zpuoj5NwRLkFDrIwEh0LtsLCknO4jJXnw0hvXivyxrG5uTtI83e9kPQaCza2rjgeKKhKGvDV7LSx4Y3DY9rGJTJS3SBsCyjiD604Wn5InFdfU4qUIwdZjVLYxvCdWoMtN+iseexIr7BmjvhsRTHk+EQiGJgnG9vcAFkbZMuejhtrFQ+/+PAIikAvIj1+RnLixdrS7jYti6wQu2rMHdgOW3eRh6qE+K3X6rTCnxJH6ZjqupTqUrvMhiVis0fXmCM/pek5pSfqf6iuOqAZDX/sjg5kiI6x5J/SrSQEMGjPUxmJPhX57u6jg9gtBTxCw6hfK45at6rqjKROeQbLEvSSN7YxMWVVJbDN0QvkvovYu+IRvz5fVReOgMUOna6uzmpb1m4OtyqdsaB2UkRaWoJF8osK0mR1BN7IE2fV8PDi1u4ujQa+koUV+2xghZbWTUZVPRjEtntz7ZyHuCY8TOGXqkwedaRa0CjEqWYwS5/ZPdXfZZJNcQQz9SpA/o4DqEblq3970MbiP5k00L1yBFKY3pZfmoR424+/QURtj4VmPpZ898ClVtJz76lKpHkTAOfdrZqYJ3ZjqJVTXQ1YGMBgVVnBfrFTfBK7p7QQbh7wuKqvcd6daBvX6elwygQTlrPKDQerYiFxJpIjDf3Fl3tgPdHIVbtpDbC2a1B8t32auIwFOysqxBBc5EOyrZKOYPN34wRbmnqKuY7UHlk3sjjwVRzG8UAZ7WeyiWYvxd5GbGujNy6RX+gB3xagPTtLrCMjxuK8ujsxYYsbCA0KXpfsq3cbbKmKfTmuIkqQjDW955ZVIsdT7dzH2VUu2ndB1lB+dXVcVBTqHIjqudDV0Qvl3dKSc2mZJCSqZehES8ZOXpWHd9DDvy2t1D8RC+878Vq9tEpi2pc87ISP1c3qiq2x7GHd+tC9Syem80qBpe0Y3me6lDlFrR6xz9jOcIeUz+qA9PxDSyyzzoGOAk2peYMloTH8FF73X0KiMUOgE1jkbgk+O5o19ffSyv1TiBhuncqLDcoAg/K1h/1+NFXPZKJed0h+4JG30XSenoEqA/5KNpXanVh2JQYSxgUi9YO93YM6UcXu066HlvdDNXlylmqSxFI7dUTNFL6alIIXDzwFt3UnipKVAJptwTlj3RKLxiRTsSz3uoAAyfEEXsrrFvz20+572nRQoB2XhfW8phy79IjqGhGSZAjlvOYybNDj6TErpWGVtn1KHuzQn0NiLjL/OgddHZKO7pKTw4fU+rn+vglJtKQ2Mqp3uLSpiXlovi5MW+FNxL6UleYRCvZLATedD9mssDr3fB2QlYzznsGEhFMP2FwJNdwktLpvsAbypWUoEw60S0ITLuHURS5Et4c/+cuIUG8JzLyMSdc5FaVpj/f+qiTLC//rrxxNiFoORHO1vtXtvc7+5tsxMJX4iApoMZeltDZBX3CJPny6NisNwv38zmGEEXfMq00baQR2kDI9vEJ65dWUv9YQscHCSZo/prVpbK8FvTeGVB1yM9yAzw8jhEcbR6zFp6mkTkATYcPTK2UZ4lgXt9HqJjEIrBxaZDvfT42XbhKDpHA9CtejcD0K16NwPQrXo83MzMzMzMzMzMzMzMzMzMwAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAAAAAAMgAAAAAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAAAABAnAAAAAAAAAAAAAAAAAAAUMMAAAAAAAAAAAAAAAAAACT0AAAAAAAAAAAAAAAAAICWmAAAAAAAAAAAAAAAAAAgvL4AAAAAAAAAAAAAAAAAKGvuAAAAAAAAAAAAAAAAAPkClQAAAAAAAAAAAAAAAEC3Q7oAAAAAAAAAAAAAAAAQpdToAAAAAAAAAAAAAAAAKueEkQAAAAAAAAAAAAAAgPQg5rUAAAAAAAAAAAAAAKAxqV/jAAAAAAAAAAAAAAAEv8kbjgAAAAAAAAAAAAAAxS68orEAAAAAAAAAAAAAQHY6awveAAAAAAAAAAAAAOiJBCPHigAAAAAAAAAAAABirMXreK0AAAAAAAAAAACAehe3JtfYAAAAAAAAAAAAkKxuMniGhwAAAAAAAAAAALRXCj8WaKkAAAAAAAAAAACh7czOG8LTAAAAAAAAAACghBRAYVFZhAAAAAAAAAAAyKUZkLmlb6UAAAAAAAAAADoPIPQnj8vOAAAAAAAAAECECZT4eDk/gQAAAAAAAABQ5Qu5NtcHj6EAAAAAAAAApN5OZwTNyfLJAAAAAAAAAE2WIoFFQHxv/AAAAAAAACDwnbVwK6itxZ0AAAAAAAAobAXjTDYSGTfFAAAAAAAAMsfGG+DDVt+E9gAAAAAAQH88XBFsOpYLE5oAAAAAABCfS7MVB8l7zpfAAAAAAADUhh4g20i7GsK98AAAAACARBQT9IgNtVCZdpYAAAAAoFXZFzHrUOKkPxS8AAAAAAirz139JeUajk8Z6wAAAADlyqFavjfP0LjR75IAAABAnj1K8a0FAwUnxqu3AAAA0AXNnG0Zx0PGsLeW5QAAAKIjAILkb1zqe84yfo8AAICKLICi3Yvz5BqCv12zAAAgrTcgC9VuMJ6hYi814AAANMwi9CZFRd4CpZ09IYwAAEF/K7FwltaVQw4FjSmvAEARX3bdDDxMe9RRRvDz2gDIavtpCoilD80k8yt22IgAekV6BA3qjlMA7u+2kw6rgNjWmEWQpHJogOmrpDjS1VBHhn8r2qZHQfBx62Zjo4Uk2WdftpCQmVFsTqZAPAynbc9B9+O09P9lB+LPUEvP0KUhiXoO8fi/n0TtgRKPgYIOaisZUi33r8eVaCLX8iGjkUR2n6b49Js5uwLrjG/qy7XVU0fQNvICCGrDJXAL5f6RZZQsQmLXAUUimhcmJ0+f9n65t9I6TULWqoCd7/Aix7Pep2WHieDSi9XghCut6/gw64if9FXMY3eFDDM7TJOb/CVrx3FrvzzVps//SR94wnvvRTlORu+LipDDfxwnFvOttcvj8It1l1Y62s9x2O2XGKO+HO3uUj3syNBDjk7pvd5L7mOoqqdMJ/vE1DGiY+1r73Q+qcroj/gc+yRfRV6URSsSjlP94rM25DnuttZ1uRe2lnGovNtgRF3IqWRM0+fOMf5G6VWJvEo6Heq+D+SQQr69mGOrq2vdiKSkrhMdtdIt7X48lpbGFKvNTZpYZOKjPFTP5R0e/OyKoHBgt36NzEspQ1+lJTuorciMOGXesL+e8xO3Du9JEtn6r4b+Fd04Q3hsMmk1bqvH/C0Uvy2KBVSWB3/DwkmW+Xs52S65rAfpe8ledDPc+/fah49659ekce09uyigaf3a6LSZrPCGDc5oDeoyCMS8ESMiwNesqJEBw5CkPwr1K9arKrAN2NL74HnaxmcmedtlqxqOCMeDOVkYkbgBcFdSP1ahscq4pIdvXrUmAkztJs+rCV795s21BVsxWIFPVHhhC8ZaXrCAIsexPa5hY2nWOY538XXcoOo4Hs0ZOrwDTMhx1W2TE8kkx2VAoEirBF86zkpJeFj7d5w/KGQN62J75MDOLUsXnZWDTzK90KU7mh1xQvkdXcR6ZON+7ESPygBlDZN3ZXT1zB5OzxOLmX4gX+i7ar9omX+mIcPY7T+e6HbiakXvwr8fEOrzTunPxaIUm8UWq7PvE0pyWNHxobvl7IA77krQlZjcjq5FbooqHyhhyqldRLu+kzIa1wkt9SZy+TwUdRXqV5xfcCYmPFlY5xumLGlNkm2DdwywL4tvLuGiz3fD4LZIZJUPnPttC3qZi8NV9JjkrV69iUG9JEfsPzeatZjfjli2LOyR7O1Y5w/FAON+l7Lu4zdntmcpL+FT9sCbXj3fde6CANLgeb1s9JlYIVuGixKqo4AGWdjsh3HArunxZ66WlMwgSG8O6OmNcBpk7gHa3tx/FI0FCTGyWIaQ/jRBiBbUn1nwRku93u6nND6CUaobyQdwrBiebJbq0cHN4uXUsd0ExmvP4gOeMiOZwK0PhR0VhrdGg9uERf9rvzCZU6ZkmmdlGGQS5hb/Ru98f+jPf8BgP49+y09uX4wVrk/xgZ7wOA8zXr7jSXfvmpmjbaLGLAfTv/WtXBxVqwGADAnL9/fIxy9z2XNjKhYCoE/L/fua3dz952coftpNAcQRn565ARVU/eGBsh1RoQE11kbGJ0IaqXxaIh9lpQlCwovY91lpsOmNeHUzXwdGaVlX55qvgxxksdZSADeJl8MvLaHBm6QjvV2MZ8CEa320e3gJ8uFGNpa6t0D4MmPOUE3rRZeZ2MM7qeVQtv/7AaUgZhe9v860ihMf5aP/ekLOqD9d7DgBsTZsM2/G34zpgMlHupOFQV1ERwALuBfwI+G72ai45pF0FVnADaYd7GzZKhDT5jDbaK03mMiHkhPkxxrqQ5D8EcOYRb66KXcY3Xmh5FS0e9bz/tZtKfSUXlTYyR1q4Q1mWF+m5JkYHbs0J55S4oyQfy73z13AXuTpAbFF5xqwdB/69EN1cHZdZEIdF6Eh3KlTHHlKSQZqun5Jcq4ElYmTaGMXnduHBGne2w7aRfqrt0I8XYTSqUUD1pKSUNf41rOpRbqSI4oLwsWbW5KGW4YfFNdod6xsjjK3gvI2aPKnJ9kMQ5XXBzL/ZCOvRALv0bkH6Em95kR/Hx927WphNYOnCWKcbCAWX+em06jFuQKkEIx6w4eo2zahkAgTN2gDzYqXLNpUSUnCZFrlayIhIoBtvbcQqpvb8v2w3gZrqSqgyKzllJSCkm89XZbIxVM1yPoXH7o5I3fLjPS7OreoQvr8blMUBHYq/9d4tYRyqWmcu0poGYUT9f4N1+IlzxOEw2pdwl9mWLJ+0Yxb78IYZfRietn7P3cv7wI4mdV5L7+Y+9jP+g9V+6oDhv9KWPvuvjnPg/lTKrqVhGe/XS66qu6EYfJ7dFqU3bKgl/pctCqV5fnumhFx+ZTfiD05dGF1ul64qgFWzTd6F+uMR9G5Euk7swrBVeBirO4SuMwitKuRCmBNMWuYe1eqF+Z/K6EWtgy4oP2FflrtlJ3fX3ZJnOMIc4S+E49YFH3C6/vprUGOyY8lrtiyblkcs+Z6ZBnSsbzzrtmOX8pv41+gmb2fRt5VWA1IuXveJe47BIDWI+yKa64QmqcaVq/pSgUgzCynrQXalIBRoSsbpJ0GKP/3ENlDCF3w0kT7kIYiBHn/mqqHVEp0rAcWOjUoK0VXv0GVqelckZeJm4hC8nUWLS+S+tMS2rr+NWGVabcJLnxdm3yElpBpfoO5+kMljDnbNMKbpbz0A17kZ/mULu8HEsKyAs/2eMK67uAbHX31REu5r2GBMxdzaSrZYmTcMhaepxu6of/czwN1j3t9k7+bhZGiKMo/1MNEUnPaXHivAuc1y7L8qGT6ahOICDqrrWGwAb/vndH9uEUYqooIFhl6HMKua8VGPSdXnlStilufmKNymsb2TIZ49uJUrDaZYz+mhyA8mt6nFrQbaleEfzzPj6koy8DWURyhokRtZZ8Lw/PT8v3wJrOxpOVKZJ9D51l4xLeelu8f3g2fXT2HFGFwlrVlRrzrp1XRBrUMqVl5DPwi/1fr84jVQiTxpwnYy4fddf8WkzDrilNt7REMzr7pVFO/3Lf7pW2oyGgWj4EuJCoo79PlvYdEaX0BbvkQnVYaeXWkj62plcPcgck3VUTsYNeSjbMYFHv0U+K7hWpVJzmN93Dgj+zMeHRtlZNilbhDuJpGjLMnAJfRyHo4u7qmVGZBWK+fMcD8BXuZBmpp0Om/US7bBB/4vePsH0TiQSLyF/P8iMQmdq0c6CfVWtKq7t0vPKt1sNPYI+JxivGGVWrVOwvWSk6EZ1Yth/ZWdHViZQXHhdxhZQGs+Ci0bNESu77GOKdTur4B1zYz4ceF12lu+AbRdDQXYUYCwOycsyYCRVukgpEBXfnXAvAnhGCwQhZyTaP1QbT3jQPsMaV4XNObziDMclKhdXEEZ37OljPIQgIp/4fThOnGYgAPQT4gvWmheZ9pCOajeHvAUtFNaCzECVjHg4rfzFaacKdFYYI3NQwu+ZK2C0B2YKaIy3yxQqHHvJs2pA7Qk/jPav7bXZOJ+avCRE0SxLj2gwX+UjX46/dW80twi3ozenLD3lMhe/NaFphdTC5ZwBhPdNao6Vmw8Ru+dN95b/DeYhEME2RwHO6i7akrrEVWy92K54s+xtHUhZSTNhfXKz6VbeEuzjcGSqe5OATdzLaN+siZusHFhxwR6KMiCkCSmJwdoBSZ29SxCpFMqwzQtr4DJchZfxJKXk21HtYPhGSuRC46MB+X3LWg4tPlidL+7OpcJH5z3qlxpI1IXyyHPqgldK1dEFYUjg2xGnf3KE4SL9EYdZRrmfFQ3XCqmtlwa72CL8k84/+WUooMVQEQTcZsY3v7C9y/POesT6oBVOD3Rzxa+g7T7wsh2HIKgTTs+qxleFzp43WnFIcOTaFBpzkYf5az41xT0dmoUaAJEhFI3h58oBw0qEUQ0zMERqsK7UqTTeSRIIkr6oNAhRdWTagd+GBdtmhrtuSkj2adq2ASJTa59ONCBuQdzhpgQmt8K9fB83jO6YOu0oAg+BKGW/ZMsjAXQuQkWgehKLaXZ/Iz4N78nFIdrjBJybKjfQHvQJgWPESnpNl8m/tPhu5glSgfjqWK6AYILkGd4ycqubrypvFOraIIinmRxNyxdGdprxCuoljLiuzXtfUq76jgoW3KrGUXv9bzppGZ9CrTWAoJ/Rc/3W7MsBD2v7H1B+9MS/zdjpSK/9yU8++P+WQVEK+9Stmcth8KPfiV8je+GtQabZ0PRKSnTEx2u+7FbSGJYciEE1WN0V/fU+q1m+S09Tz9MixV+OKba3SSosIdIjOMvD93arbbgoYRt0szpeo/r6sPFQWkkiPo1eQPQKfyh03LKS2DpjsWsQWPExBR7+kgPnT4I5DKWx3HshdUJWskqU2R9iw0vbLkeN+PVPfCtonQGhqcQLbvjquLsim1cySshKEgw9Cjq3KWrh90opAt1+XJ6PPEjFYPPNqTiGV6fKYvfnEY+xeWiWWIuOr+mBuQu92N3vmd++t+qmalPn8idCpVMVZ4hfqmHtVgJ4ePlYg61d41a5NcKDOFOPFo87oqiYpWA0a4c/J/poYtQ7BpdSstLIRXphDvH9B0/CkOYik7nJuy9mdq9ROCkHu0kbrzSYNCX/QBxfKYonSaITapcBwkE3dxQnYvP8sRAaqD04wj7dfUDdNT+w7+q0BKMgQ4NvQGpehjFF3JntbQ3D4FxkOxSM7ifFm0e8YLBZSOhreU3dqBG9xvoRr4J4McGbTyfMooMZHp5aQQm/GjYx9hLxz9cn31Yx/O1MHtjDxnOTtjvM/c8jynAUryFNiF4AMFvtUByheGCEFulxlOp9hEhi1Lgrydp0rRSb2fIdEO1uf43aIrhVGdRZzsBLVCyeWQu8pFO/NSgqvhk0RikzsfdWo9Fwqw52IW2rjVOngKZxLFDJ0MnKH7mxDnxiSLZoAr+yfihwFFfWFqkPftLYBg9vmx2ulBltz5hLR0aTmg+HN4XlFk0rtTOKbh6eEjZHtIC9uyfmNVNOMHjWPaLD2aGs6RX168agHcSbD8EHjMQKFBdvd1a8UBU1zcngrLf8gE6am6KWMb4bO5iUXNvZ/6RWNUKfQ7YtkgKKyWQK1HeRd8qTPxyroPKTLXXkjMzKuO7UnA1r7UqVl/hnVa/79W8mhccIzuSRQwH6gSMf9v7C6Dc4wvalwZ/CbSrH7/xVP9Mci3XcLZj11Yg1Zef7eofD66JfUy0PN0LqTsNV/l0hvOKG+yP8QwEjrNtIFbz2PRgHmFz6d6XktEgCBiMsO8BeHXZsNRGTZeVaCo+v7zK0fZjUA0pp/DtWrIUrn+8PaYT7FQwY+HNGOF+tQzn1aav9Fu0ti51ABek5zJAEfsgC+GCgdP6AmBNbjD+8BYJ2G7J83IYmJM4UKm9J14l7gc1TiAvX29z8zp55jEVr3mYwpH4CzdrANA5CG/daxs4PzMWBh4FJgEUF3q7snrQwwegDcPywzfAlJ6UpW75lSPJWAF0/3PloPmGKe6aiAq8y64xkf9g3wkIN9Q6UJU+lcdM9xMftLNFnSL0pFT6fit5D8T4B1HgRxRLke2pyN32d0PGFjlmKFj5fnY40l26qfqCQ9Xj/9EXi+cZ47bE+VRZczSLHM/1jU7gwGy0lhepn5/B/hPz0sDCuSB3oP3+ievrwT7kWEPQoYuEYtktfnxmtvFefY5k9InetWtvSJ4roFSNxh0CDjHsdhK2bYVCw2RkyKPSAWDHG/Hzocj201QdTjrsprGo+NKecKp7FFhpJIGpl9BuIycnRcz1DTTvKYbxMfbKPPXgcLun4QBCGyQIrW5EvPvTSJz6selAQqHNGsiaNfva+HqD+U5z0Fm1ACDFaHmdePM8ikvhIHRfwnB41pJYFMcgG/0OuWhxd9LsZyxWzhoI2CLsYleyrbXnt0DnnJGQiw47h0s9vzSRoNqwqIHbKkb47SS2xmehhgkBXOLCceT4htid1KgxagebcZP7su4ONuiOhVnCPcvcnVzdC9kZXBzL2hhc2hicm93bi0wLjE1LjMvc3JjL3Jhdy9tb2QucnMAALCpIAAqAAAAJQAAACgAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9oYXNoYnJvd24tMC4xNi4wL3NyYy9yYXcvbW9kLnJz7KkgAGQAAAAlAAAAKAAAAAAAAAAAAAAAAQAAAEgDAAAAAAAAAAAAAAEAAAAsAwAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvdHJpb21waGUtMC4xLjE0L3NyYy9hcmMucnMAgKogAF8AAAA1AQAADgAAAICqIABfAAAAbgEAAC0AAACAqiAAXwAAAG8BAAAOAAAAAAAAAAwAAAAEAAAASQMAAEoDAABjcmF0ZXMvaHN0ci9zcmMvZHluYW1pYy5ycwAAJKsgABoAAABpAAAAIAAAACSrIAAaAAAAcQAAACAAAABjcmF0ZXMvaHN0ci9zcmMvd3RmOC9tb2QucnMAYKsgABsAAADdAQAASgAAAGCrIAAbAAAA1gEAAD0AAABgqyAAGwAAAIQCAAAeAAAAYKsgABsAAACFAgAAMQAAAGCrIAAbAAAAkAIAAD0AAABgqyAAGwAAAIsCAAA9AAAAYKsgABsAAADyAgAAIgAAAGNyYXRlcy9oc3RyL3NyYy93dGY4X2F0b20ucnPsqyAAHAAAAFwBAAA5AAAAY3JhdGVzL2hzdHIvc3JjL2xpYi5ycwAAGKwgABYAAAAWAQAAPAAAADw+JwBvAAAAJAEAAA4AAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9qcy1zeXMtMC4zLjc3L3NyYy9saWIucnNyZXR1cm4gdGhpc1CsIABdAAAA+xgAAAEAAAAvKSYAcAAAAE0AAAAuAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvbWVtY2hyLTIuNy42L3NyYy9hcmNoL2FsbC90d293YXkucnPYrCAAaAAAAL8AAAAuAAAA2KwgAGgAAADHAAAAKQAAANisIABoAAAAzAAAADQAAADYrCAAaAAAANQAAAAkAAAA2KwgAGgAAADUAAAAMQAAANisIABoAAAA1wAAACIAAADYrCAAaAAAANcAAAAzAAAA2KwgAGgAAADxAAAALgAAANisIABoAAAA+AAAACkAAADYrCAAaAAAAP0AAAA0AAAA2KwgAGgAAAAEAQAAGAAAANisIABoAAAABAEAACUAAADYrCAAaAAAAMIBAAAdAAAA2KwgAGgAAADDAQAAGQAAANisIABoAAAACgIAABsAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9tZW1jaHItMi43LjYvc3JjL2FyY2gvYWxsL21vZC5ycwAAADCuIABlAAAALAAAAB4AAAA8c2VhcmNoZXIgZnVuY3Rpb24+AKiuIAATAAAAY2FsbDxzZWFyY2hlciBraW5kIHVuaW9uPgAAAMiuIAAVAAAARmluZGVyaGFzaBtbMTIzNDU2Nzg5G1swbQAAAFrrJgBKAAAACwIAABcAAABa6yYASgAAAAoCAAAyAAAASW9FcnJvck91dE9mQm91bmRzL3J1c3RjLzJlNjg4MmFjNWJlMjdhNzMyOTNkNmY3YWU1NjM5N2ZkZjMyODQ4ZGUvbGlicmFyeS9jb3JlL3NyYy9zbGljZS9pdGVyLnJzY2FwYWNpdHkgb3ZlcmZsb3cAAACEryAAEQAAAAAAAAAEAAAABAAAADIAAAA2ryAATgAAAPYFAAAVAAAAAAAAAAQAAAAAAAAAAQAAAG5lZ2F0aXZlIHZhbHVlcyBhcmUgbm9uLXplcm8vaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9udW0tYmlnaW50LTAuNC42L3NyYy9iaWdpbnQvc2hpZnQucnMAAADsryAAaQAAAGYAAAAoAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvbnVtLWJpZ2ludC0wLjQuNi9zcmMvYmlndWludC9hZGRpdGlvbi5ycwAAAGiwIABtAAAAOwAAABoAAABosCAAbQAAAGgAAABCAAAAaLAgAG0AAABpAAAANAAAAGiwIABtAAAAagAAACIAAABosCAAbQAAAG8AAAAXAAAAaLAgAG0AAACJAAAAGwAAAGiwIABtAAAAjgAAABsAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3Ny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NTU7MjUwOzI0MDM4OzI7MDM0OzEzOTswMzQzODsyOzI1NTswMDA7MjU1Mzg7MjsyMjA7MjIwOzIyMDM4OzI7MjQ4OzI0ODsyNTUzODsyOzI1NTsyMTU7MDAwMzg7MjsyMTg7MTY1OzAzMjM4OzI7MTI4OzEyODsxMjgzODsyOzAwMDsxMjg7MDAwMzg7MjsxNzM7MjU1OzA0NzM4OzI7MjQwOzI1NTsyNDAzODsyOzI1NTsxMDU7MTgwMzg7MjsyMDU7MDkyOzA5MjM4OzI7MDc1OzAwMDsxMzAzODsyOzI1NTsyNTU7MjQwMzg7MjsyNDA7MjMwOzE0MDM4OzI7MjMwOzIzMDsyNTAzODsyOzI1NTsyNDA7MjQ1Mzg7MjsxMjQ7MjUyOzAwMDM4OzI7MjU1OzI1MDsyMDUzODsyOzE3MzsyMTY7MjMwMzg7MjsyNDA7MTI4OzEyODM4OzI7MjI0OzI1NTsyNTUzODsyOzI1MDsyNTA7MjEwMzg7MjsyMTE7MjExOzIxMTM4OzI7MTQ0OzIzODsxNDQzODsyOzI1NTsxODI7MTkzMzg7MjsyNTU7MTYwOzEyMjM4OzI7MDMyOzE3ODsxNzAzODsyOzEzNTsyMDY7MjUwMzg7MjsxMTk7MTM2OzE1MzM4OzI7MTc2OzE5NjsyMjIzODsyOzI1NTsyNTU7MjI0Mzg7MjswMDA7MjU1OzAwMDM4OzI7MDUwOzIwNTswNTAzODsyOzI1MDsyNDA7MjMwMzg7MjsxMjg7MDAwOzAwMDM4OzI7MTAyOzIwNTsxNzAzODsyOzAwMDswMDA7MjA1Mzg7MjsxODY7MDg1OzIxMTM4OzI7MTQ3OzExMjsyMTkzODsyOzA2MDsxNzk7MTEzMzg7MjsxMjM7MTA0OzIzODM4OzI7MDAwOzI1MDsxNTQzODsyOzA3MjsyMDk7MjA0Mzg7MjsxOTk7MDIxOzEzMzM4OzI7MDI1OzAyNTsxMTIzODsyOzI0NTsyNTU7MjUwMzg7MjsyNTU7MjI4OzIyNTM4OzI7MjU1OzIyODsxODEzODsyOzI1NTsyMjI7MTczMzg7MjswMDA7MDAwOzEyODM4OzI7MjUzOzI0NTsyMzAzODsyOzEyODsxMjg7MDAwMzg7MjsxMDc7MTQyOzAzNTM4OzI7MjU1OzE2NTswMDAzODsyOzI1NTswNjk7MDAwMzg7MjsyMTg7MTEyOzIxNDM4OzI7MjM4OzIzMjsxNzAzODsyOzE1MjsyNTE7MTUyMzg7MjsxNzU7MjM4OzIzODM4OzI7MjE5OzExMjsxNDczODsyOzI1NTsyMzk7MjEzMzg7MjsyNTU7MjE4OzE4NTM4OzI7MjA1OzEzMzswNjMzODsyOzI1NTsxOTI7MjAzMzg7MjsyMjE7MTYwOzIyMTM4OzI7MTc2OzIyNDsyMzAzODsyOzEyODswMDA7MTI4Mzg7MjsxMDI7MDUxOzE1MzM4OzI7MjU1OzAwMDswMDAzODsyOzE4ODsxNDM7MTQzMzg7MjswNjU7MTA1OzIyNTM4OzI7MTM5OzA2OTswMTkzODsyOzI1MDsxMjg7MTE0Mzg7MjsyNDQ7MTY0OzA5NjM4OzI7MDQ2OzEzOTswODczODsyOzI1NTsyNDU7MjM4Mzg7MjsxNjA7MDgyOzA0NTM4OzI7MTkyOzE5MjsxOTIzODsyOzEzNTsyMDY7MjM1Mzg7MjsxMDY7MDkwOzIwNTM4OzI7MTEyOzEyODsxNDQzODsyOzI1NTsyNTA7MjUwMzg7MjswMDA7MjU1OzEyNzM4OzI7MDcwOzEzMDsxODAzODsyOzIxMDsxODA7MTQwMzg7MjswMDA7MTI4OzEyODM4OzI7MjE2OzE5MTsyMTYzODsyOzI1NTswOTk7MDcxMzg7MjswNjQ7MjI0OzIwODM4OzI7MjM4OzEzMDsyMzgzODsyOzI0NTsyMjI7MTc5Mzg7MjsyNTU7MjU1OzI1NTM4OzI7MjQ1OzI0NTsyNDUzODsyOzI1NTsyNTU7MDAwMzg7MjsxNTQ7MjA1OzA1MDQ4OzI7MjQwOzI0ODsyNTU0ODsyOzI1MDsyMzU7MjE1NDg7MjswMDA7MjU1OzI1NTQ4OzI7MTI3OzI1NTsyMTI0ODsyOzI0MDsyNTU7MjU1NDg7MjsyNDU7MjQ1OzIyMDQ4OzI7MjU1OzIyODsxOTY0ODsyOzAwMDswMDA7MDAwNDg7MjsyNTU7MjM1OzIwNTQ4OzI7MDAwOzAwMDsyNTU0ODsyOzEzODswNDM7MjI2NDg7MjsxNjU7MDQyOzA0MjQ4OzI7MjIyOzE4NDsxMzU0ODsyOzA5NTsxNTg7MTYwNDg7MjsxMjc7MjU1OzAwMDQ4OzI7MjEwOzEwNTswMzA0ODsyOzI1NTsxMjc7MDgwNDg7MjsxMDA7MTQ5OzIzNzQ4OzI7MjU1OzI0ODsyMjA0ODsyOzIyMDswMjA7MDYwNDg7MjswMDA7MDAwOzEzOTQ4OzI7MDAwOzEzOTsxMzk0ODsyOzE4NDsxMzQ7MDExNDg7MjsxNjk7MTY5OzE2OTQ4OzI7MDAwOzEwMDswMDA0ODsyOzE4OTsxODM7MTA3NDg7MjsxMzk7MDAwOzEzOTQ4OzI7MDg1OzEwNzswNDc0ODsyOzI1NTsxNDA7MDAwNDg7MjsxNTM7MDUwOzIwNDQ4OzI7MTM5OzAwMDswMDA0ODsyOzIzMzsxNTA7MTIyNDg7MjsxNDM7MTg4OzE0MzQ4OzI7MDcyOzA2MTsxMzk0ODsyOzA0NzswNzk7MDc5NDg7MjswMDA7MjA2OzIwOTQ4OzI7MTQ4OzAwMDsyMTE0ODsyOzI1NTswMjA7MTQ3NDg7MjswMDA7MTkxOzI1NTQ4OzI7MTA1OzEwNTsxMDU0ODsyOzAzMDsxNDQ7MjU1NDg7MjsxNzg7MDM0OzAzNDQ4OzI7MjU1OzI1MDsyNDA0ODsyOzAzNDsxMzk7MDM0NDg7MjsyNTU7MDAwOzI1NTQ4OzI7MjIwOzIyMDsyMjA0ODsyOzI0ODsyNDg7MjU1NDg7MjsyNTU7MjE1OzAwMDQ4OzI7MjE4OzE2NTswMzI0ODsyOzEyODsxMjg7MTI4NDg7MjswMDA7MTI4OzAwMDQ4OzI7MTczOzI1NTswNDc0ODsyOzI0MDsyNTU7MjQwNDg7MjsyNTU7MTA1OzE4MDQ4OzI7MjA1OzA5MjswOTI0ODsyOzA3NTswMDA7MTMwNDg7MjsyNTU7MjU1OzI0MDQ4OzI7MjQwOzIzMDsxNDA0ODsyOzIzMDsyMzA7MjUwNDg7MjsyNTU7MjQwOzI0NTQ4OzI7MTI0OzI1MjswMDA0ODsyOzI1NTsyNTA7MjA1NDg7MjsxNzM7MjE2OzIzMDQ4OzI7MjQwOzEyODsxMjg0ODsyOzIyNDsyNTU7MjU1NDg7MjsyNTA7MjUwOzIxMDQ4OzI7MjExOzIxMTsyMTE0ODsyOzE0NDsyMzg7MTQ0NDg7MjsyNTU7MTgyOzE5MzQ4OzI7MjU1OzE2MDsxMjI0ODsyOzAzMjsxNzg7MTcwNDg7MjsxMzU7MjA2OzI1MDQ4OzI7MTE5OzEzNjsxNTM0ODsyOzE3NjsxOTY7MjIyNDg7MjsyNTU7MjU1OzIyNDQ4OzI7MDAwOzI1NTswMDA0ODsyOzA1MDsyMDU7MDUwNDg7MjsyNTA7MjQwOzIzMDQ4OzI7MTI4OzAwMDswMDA0ODsyOzEwMjsyMDU7MTcwNDg7MjswMDA7MDAwOzIwNTQ4OzI7MTg2OzA4NTsyMTE0ODsyOzE0NzsxMTI7MjE5NDg7MjswNjA7MTc5OzExMzQ4OzI7MTIzOzEwNDsyMzg0ODsyOzAwMDsyNTA7MTU0NDg7MjswNzI7MjA5OzIwNDQ4OzI7MTk5OzAyMTsxMzM0ODsyOzAyNTswMjU7MTEyNDg7MjsyNDU7MjU1OzI1MDQ4OzI7MjU1OzIyODsyMjU0ODsyOzI1NTsyMjg7MTgxNDg7MjsyNTU7MjIyOzE3MzQ4OzI7MDAwOzAwMDsxMjg0ODsyOzI1MzsyNDU7MjMwNDg7MjsxMjg7MTI4OzAwMDQ4OzI7MTA3OzE0MjswMzU0ODsyOzI1NTsxNjU7MDAwNDg7MjsyNTU7MDY5OzAwMDQ4OzI7MjE4OzExMjsyMTQ0ODsyOzIzODsyMzI7MTcwNDg7MjsxNTI7MjUxOzE1MjQ4OzI7MTc1OzIzODsyMzg0ODsyOzIxOTsxMTI7MTQ3NDg7MjsyNTU7MjM5OzIxMzQ4OzI7MjU1OzIxODsxODU0ODsyOzIwNTsxMzM7MDYzNDg7MjsyNTU7MTkyOzIwMzQ4OzI7MjIxOzE2MDsyMjE0ODsyOzE3NjsyMjQ7MjMwNDg7MjsxMjg7MDAwOzEyODQ4OzI7MTAyOzA1MTsxNTM0ODsyOzI1NTswMDA7MDAwNDg7MjsxODg7MTQzOzE0MzQ4OzI7MDY1OzEwNTsyMjU0ODsyOzEzOTswNjk7MDE5NDg7MjsyNTA7MTI4OzExNDQ4OzI7MjQ0OzE2NDswOTY0ODsyOzA0NjsxMzk7MDg3NDg7MjsyNTU7MjQ1OzIzODQ4OzI7MTYwOzA4MjswNDU0ODsyOzE5MjsxOTI7MTkyNDg7MjsxMzU7MjA2OzIzNTQ4OzI7MTA2OzA5MDsyMDU0ODsyOzExMjsxMjg7MTQ0NDg7MjsyNTU7MjUwOzI1MDQ4OzI7MDAwOzI1NTsxMjc0ODsyOzA3MDsxMzA7MTgwNDg7MjsyMTA7MTgwOzE0MDQ4OzI7MDAwOzEyODsxMjg0ODsyOzIxNjsxOTE7MjE2NDg7MjsyNTU7MDk5OzA3MTQ4OzI7MDY0OzIyNDsyMDg0ODsyOzIzODsxMzA7MjM4NDg7MjsyNDU7MjIyOzE3OTQ4OzI7MjU1OzI1NTsyNTU0ODsyOzI0NTsyNDU7MjQ1NDg7MjsyNTU7MjU1OzAwMDQ4OzI7MTU0OzIwNTswNTAzODs1OzAzODs1OzEzODs1OzIzODs1OzMzODs1OzQzODs1OzUzODs1OzYzODs1OzczODs1OzgzODs1OzkzODs1OzEwMzg7NTsxMTM4OzU7MTIzODs1OzEzMzg7NTsxNDM4OzU7MTUzODs1OzE2Mzg7NTsxNzM4OzU7MTgzODs1OzE5Mzg7NTsyMDM4OzU7MjEzODs1OzIyMzg7NTsyMzM4OzU7MjQzODs1OzI1Mzg7NTsyNjM4OzU7MjczODs1OzI4Mzg7NTsyOTM4OzU7MzAzODs1OzMxMzg7NTszMjM4OzU7MzMzODs1OzM0Mzg7NTszNTM4OzU7MzYzODs1OzM3Mzg7NTszODM4OzU7MzkzODs1OzQwMzg7NTs0MTM4OzU7NDIzODs1OzQzMzg7NTs0NDM4OzU7NDUzODs1OzQ2Mzg7NTs0NzM4OzU7NDgzODs1OzQ5Mzg7NTs1MDM4OzU7NTEzODs1OzUyMzg7NTs1MzM4OzU7NTQzODs1OzU1Mzg7NTs1NjM4OzU7NTczODs1OzU4Mzg7NTs1OTM4OzU7NjAzODs1OzYxMzg7NTs2MjM4OzU7NjMzODs1OzY0Mzg7NTs2NTM4OzU7NjYzODs1OzY3Mzg7NTs2ODM4OzU7NjkzODs1OzcwMzg7NTs3MTM4OzU7NzIzODs1OzczMzg7NTs3NDM4OzU7NzUzODs1Ozc2Mzg7NTs3NzM4OzU7NzgzODs1Ozc5Mzg7NTs4MDM4OzU7ODEzODs1OzgyMzg7NTs4MzM4OzU7ODQzODs1Ozg1Mzg7NTs4NjM4OzU7ODczODs1Ozg4Mzg7NTs4OTM4OzU7OTAzODs1OzkxMzg7NTs5MjM4OzU7OTMzODs1Ozk0Mzg7NTs5NTM4OzU7OTYzODs1Ozk3Mzg7NTs5ODM4OzU7OTkzODs1OzEwMDM4OzU7MTAxMzg7NTsxMDIzODs1OzEwMzM4OzU7MTA0Mzg7NTsxMDUzODs1OzEwNjM4OzU7MTA3Mzg7NTsxMDgzODs1OzEwOTM4OzU7MTEwMzg7NTsxMTEzODs1OzExMjM4OzU7MTEzMzg7NTsxMTQzODs1OzExNTM4OzU7MTE2Mzg7NTsxMTczODs1OzExODM4OzU7MTE5Mzg7NTsxMjAzODs1OzEyMTM4OzU7MTIyMzg7NTsxMjMzODs1OzEyNDM4OzU7MTI1Mzg7NTsxMjYzODs1OzEyNzM4OzU7MTI4Mzg7NTsxMjkzODs1OzEzMDM4OzU7MTMxMzg7NTsxMzIzODs1OzEzMzM4OzU7MTM0Mzg7NTsxMzUzODs1OzEzNjM4OzU7MTM3Mzg7NTsxMzgzODs1OzEzOTM4OzU7MTQwMzg7NTsxNDEzODs1OzE0MjM4OzU7MTQzMzg7NTsxNDQzODs1OzE0NTM4OzU7MTQ2Mzg7NTsxNDczODs1OzE0ODM4OzU7MTQ5Mzg7NTsxNTAzODs1OzE1MTM4OzU7MTUyMzg7NTsxNTMzODs1OzE1NDM4OzU7MTU1Mzg7NTsxNTYzODs1OzE1NzM4OzU7MTU4Mzg7NTsxNTkzODs1OzE2MDM4OzU7MTYxMzg7NTsxNjIzODs1OzE2MzM4OzU7MTY0Mzg7NTsxNjUzODs1OzE2NjM4OzU7MTY3Mzg7NTsxNjgzODs1OzE2OTM4OzU7MTcwMzg7NTsxNzEzODs1OzE3MjM4OzU7MTczMzg7NTsxNzQzODs1OzE3NTM4OzU7MTc2Mzg7NTsxNzczODs1OzE3ODM4OzU7MTc5Mzg7NTsxODAzODs1OzE4MTM4OzU7MTgyMzg7NTsxODMzODs1OzE4NDM4OzU7MTg1Mzg7NTsxODYzODs1OzE4NzM4OzU7MTg4Mzg7NTsxODkzODs1OzE5MDM4OzU7MTkxMzg7NTsxOTIzODs1OzE5MzM4OzU7MTk0Mzg7NTsxOTUzODs1OzE5NjM4OzU7MTk3Mzg7NTsxOTgzODs1OzE5OTM4OzU7MjAwMzg7NTsyMDEzODs1OzIwMjM4OzU7MjAzMzg7NTsyMDQzODs1OzIwNTM4OzU7MjA2Mzg7NTsyMDczODs1OzIwODM4OzU7MjA5Mzg7NTsyMTAzODs1OzIxMTM4OzU7MjEyMzg7NTsyMTMzODs1OzIxNDM4OzU7MjE1Mzg7NTsyMTYzODs1OzIxNzM4OzU7MjE4Mzg7NTsyMTkzODs1OzIyMDM4OzU7MjIxMzg7NTsyMjIzODs1OzIyMzM4OzU7MjI0Mzg7NTsyMjUzODs1OzIyNjM4OzU7MjI3Mzg7NTsyMjgzODs1OzIyOTM4OzU7MjMwMzg7NTsyMzEzODs1OzIzMjM4OzU7MjMzMzg7NTsyMzQzODs1OzIzNTM4OzU7MjM2Mzg7NTsyMzczODs1OzIzODM4OzU7MjM5Mzg7NTsyNDAzODs1OzI0MTM4OzU7MjQyMzg7NTsyNDMzODs1OzI0NDM4OzU7MjQ1Mzg7NTsyNDYzODs1OzI0NzM4OzU7MjQ4Mzg7NTsyNDkzODs1OzI1MDM4OzU7MjUxMzg7NTsyNTIzODs1OzI1MzM4OzU7MjU0Mzg7NTsyNTU0ODs1OzA0ODs1OzE0ODs1OzI0ODs1OzM0ODs1OzQ0ODs1OzU0ODs1OzY0ODs1Ozc0ODs1Ozg0ODs1Ozk0ODs1OzEwNDg7NTsxMTQ4OzU7MTI0ODs1OzEzNDg7NTsxNDQ4OzU7MTU0ODs1OzE2NDg7NTsxNzQ4OzU7MTg0ODs1OzE5NDg7NTsyMDQ4OzU7MjE0ODs1OzIyNDg7NTsyMzQ4OzU7MjQ0ODs1OzI1NDg7NTsyNjQ4OzU7Mjc0ODs1OzI4NDg7NTsyOTQ4OzU7MzA0ODs1OzMxNDg7NTszMjQ4OzU7MzM0ODs1OzM0NDg7NTszNTQ4OzU7MzY0ODs1OzM3NDg7NTszODQ4OzU7Mzk0ODs1OzQwNDg7NTs0MTQ4OzU7NDI0ODs1OzQzNDg7NTs0NDQ4OzU7NDU0ODs1OzQ2NDg7NTs0NzQ4OzU7NDg0ODs1OzQ5NDg7NTs1MDQ4OzU7NTE0ODs1OzUyNDg7NTs1MzQ4OzU7NTQ0ODs1OzU1NDg7NTs1NjQ4OzU7NTc0ODs1OzU4NDg7NTs1OTQ4OzU7NjA0ODs1OzYxNDg7NTs2MjQ4OzU7NjM0ODs1OzY0NDg7NTs2NTQ4OzU7NjY0ODs1OzY3NDg7NTs2ODQ4OzU7Njk0ODs1OzcwNDg7NTs3MTQ4OzU7NzI0ODs1OzczNDg7NTs3NDQ4OzU7NzU0ODs1Ozc2NDg7NTs3NzQ4OzU7Nzg0ODs1Ozc5NDg7NTs4MDQ4OzU7ODE0ODs1OzgyNDg7NTs4MzQ4OzU7ODQ0ODs1Ozg1NDg7NTs4NjQ4OzU7ODc0ODs1Ozg4NDg7NTs4OTQ4OzU7OTA0ODs1OzkxNDg7NTs5MjQ4OzU7OTM0ODs1Ozk0NDg7NTs5NTQ4OzU7OTY0ODs1Ozk3NDg7NTs5ODQ4OzU7OTk0ODs1OzEwMDQ4OzU7MTAxNDg7NTsxMDI0ODs1OzEwMzQ4OzU7MTA0NDg7NTsxMDU0ODs1OzEwNjQ4OzU7MTA3NDg7NTsxMDg0ODs1OzEwOTQ4OzU7MTEwNDg7NTsxMTE0ODs1OzExMjQ4OzU7MTEzNDg7NTsxMTQ0ODs1OzExNTQ4OzU7MTE2NDg7NTsxMTc0ODs1OzExODQ4OzU7MTE5NDg7NTsxMjA0ODs1OzEyMTQ4OzU7MTIyNDg7NTsxMjM0ODs1OzEyNDQ4OzU7MTI1NDg7NTsxMjY0ODs1OzEyNzQ4OzU7MTI4NDg7NTsxMjk0ODs1OzEzMDQ4OzU7MTMxNDg7NTsxMzI0ODs1OzEzMzQ4OzU7MTM0NDg7NTsxMzU0ODs1OzEzNjQ4OzU7MTM3NDg7NTsxMzg0ODs1OzEzOTQ4OzU7MTQwNDg7NTsxNDE0ODs1OzE0MjQ4OzU7MTQzNDg7NTsxNDQ0ODs1OzE0NTQ4OzU7MTQ2NDg7NTsxNDc0ODs1OzE0ODQ4OzU7MTQ5NDg7NTsxNTA0ODs1OzE1MTQ4OzU7MTUyNDg7NTsxNTM0ODs1OzE1NDQ4OzU7MTU1NDg7NTsxNTY0ODs1OzE1NzQ4OzU7MTU4NDg7NTsxNTk0ODs1OzE2MDQ4OzU7MTYxNDg7NTsxNjI0ODs1OzE2MzQ4OzU7MTY0NDg7NTsxNjU0ODs1OzE2NjQ4OzU7MTY3NDg7NTsxNjg0ODs1OzE2OTQ4OzU7MTcwNDg7NTsxNzE0ODs1OzE3MjQ4OzU7MTczNDg7NTsxNzQ0ODs1OzE3NTQ4OzU7MTc2NDg7NTsxNzc0ODs1OzE3ODQ4OzU7MTc5NDg7NTsxODA0ODs1OzE4MTQ4OzU7MTgyNDg7NTsxODM0ODs1OzE4NDQ4OzU7MTg1NDg7NTsxODY0ODs1OzE4NzQ4OzU7MTg4NDg7NTsxODk0ODs1OzE5MDQ4OzU7MTkxNDg7NTsxOTI0ODs1OzE5MzQ4OzU7MTk0NDg7NTsxOTU0ODs1OzE5NjQ4OzU7MTk3NDg7NTsxOTg0ODs1OzE5OTQ4OzU7MjAwNDg7NTsyMDE0ODs1OzIwMjQ4OzU7MjAzNDg7NTsyMDQ0ODs1OzIwNTQ4OzU7MjA2NDg7NTsyMDc0ODs1OzIwODQ4OzU7MjA5NDg7NTsyMTA0ODs1OzIxMTQ4OzU7MjEyNDg7NTsyMTM0ODs1OzIxNDQ4OzU7MjE1NDg7NTsyMTY0ODs1OzIxNzQ4OzU7MjE4NDg7NTsyMTk0ODs1OzIyMDQ4OzU7MjIxNDg7NTsyMjI0ODs1OzIyMzQ4OzU7MjI0NDg7NTsyMjU0ODs1OzIyNjQ4OzU7MjI3NDg7NTsyMjg0ODs1OzIyOTQ4OzU7MjMwNDg7NTsyMzE0ODs1OzIzMjQ4OzU7MjMzNDg7NTsyMzQ0ODs1OzIzNTQ4OzU7MjM2NDg7NTsyMzc0ODs1OzIzODQ4OzU7MjM5NDg7NTsyNDA0ODs1OzI0MTQ4OzU7MjQyNDg7NTsyNDM0ODs1OzI0NDQ4OzU7MjQ1NDg7NTsyNDY0ODs1OzI0NzQ4OzU7MjQ4NDg7NTsyNDk0ODs1OzI1MDQ4OzU7MjUxNDg7NTsyNTI0ODs1OzI1MzQ4OzU7MjU0NDg7NTsyNTV46yAAbwAAAGsBAAAXAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcGFya2luZ19sb3RfY29yZS0wLjkuMTAvc3JjL3BhcmtpbmdfbG90LnJzAHjrIABvAAAASwAAABsAAAB46yAAbwAAAFIAAAAeAAAAeOsgAG8AAABOAAAAFQAAAHjrIABvAAAASgEAAAwAAABQYXJraW5nIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybQAAKOwgACYAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9wYXJraW5nX2xvdF9jb3JlLTAuOS4xMC9zcmMvdGhyZWFkX3Bhcmtlci93YXNtLnJzAABY7CAAdgAAABoAAAAJAAAAWOwgAHYAAAAqAAAACQAAAFADAAAMAAAABAAAAFEDAABSAwAAUwMAAAAAAAAAAAAAAQAAALACAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC0xLjEwLjYvc3JjL2J1aWxkZXJzLnJzAAAAGO0gAGEAAABHAAAACQAAAFN5bnRheCgKjO0gAAgAAABDb21waWxlZFRvb0JpZy9ydXN0Yy8yZTY4ODJhYzViZTI3YTczMjkzZDZmN2FlNTYzOTdmZGYzMjg0OGRlL2xpYnJhcnkvYWxsb2Mvc3JjL2JveGVkL2NvbnZlcnQucnOq7SAAUgAAAFIAAAATAAAAQWhvQ29yYXNpY2s6OnRyeV9maW5kIGlzIG5vdCBleHBlY3RlZCB0byBmYWlsL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvYWhvLWNvcmFzaWNrLTEuMS4zL3NyYy9haG9jb3Jhc2ljay5ycwA57iAAagAAAJYBAAAOAAAAVAMAAGQBAAAEAAAA+wIAAFQDAABkAQAABAAAAPwCAABVAwAA/gIAANoCAAD/AgAAAAMAAAEDAABWAwAAVwMAAAQDAAAFAwAABgMAAAcDAAAIAwAACQMAAAoDAAALAwAA+wIAALTuIABYAwAASAEAAAQAAADpAgAAWAMAAEgBAAAEAAAA6gIAAFkDAADsAgAA2gIAAO0CAADuAgAA7wIAAPACAABaAwAA8gIAAPMCAAD0AgAA9QIAAPYCAAD3AgAA+AIAAPkCAADpAgAAHO8gAFsDAABcAQAABAAAAMsAAABbAwAAXAEAAAQAAADXAgAA2AIAANkCAADaAgAA2wIAANwCAADdAgAA3gIAAFwDAADgAgAA4QIAAOICAADjAgAA5AIAAOUCAADmAgAA5wIAAMsAAACE7yAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvYWhvLWNvcmFzaWNrLTEuMS4zL3NyYy9kZmEucnMvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9haG8tY29yYXNpY2stMS4xLjMvc3JjL25mYS9jb250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AAAWAQAAFQAAAEludmFsaWRJbnB1dEFuY2hvcmVkSW52YWxpZElucHV0VW5hbmNob3JlZFVuc3VwcG9ydGVkU3RyZWFtVW5zdXBwb3J0ZWRPdmVybGFwcGluZ1Vuc3VwcG9ydGVkRW1wdHlidWNrZXRzaGFzaF9sZW5oYXNoXzJwb3cvcnVzdGMvMmU2ODgyYWM1YmUyN2E3MzI5M2Q2ZjdhZTU2Mzk3ZmRmMzI4NDhkZS9saWJyYXJ5L2FsbG9jL3NyYy9ib3hlZC5ycwA9+CAASgAAAOkGAAAfAAAATvAgAG0AAADFAAAAHAAAAE7wIABtAAAA3QAAABkAAABO8CAAbQAAAN0AAAAiAAAATvAgAG0AAADqAAAALQAAAE7wIABtAAAA5wAAAC0AAABO8CAAbQAAAOQAAAAtAAAATvAgAG0AAADhAAAALQAAAE7wIABtAAAA1AAAACkAAABO8CAAbQAAAM4AAAApAAAATvAgAG0AAAD1AAAAIAAAAE7wIABtAAAAGgEAABoAAABO8CAAbQAAADABAAAXAAAATvAgAG0AAAApAQAANwAAABzxIABwAAAAmQIAABoAAAAc8SAAcAAAAK0CAAArAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL2RmYS9vbmVwYXNzLnJziPkgAGwAAAA2AgAAHAAAAIj5IABsAAAAXAIAAAkAAACI+SAAbAAAAHICAAAsAAAAbXVsdGlwbGUgZXBzaWxvbiB0cmFuc2l0aW9ucyB0byBtYXRjaCBzdGF0ZQCI+SAAbAAAAGcCAAAxAAAAdG9vIG1hbnkgZXhwbGljaXQgY2FwdHVyaW5nIGdyb3VwcyAobWF4IGlzIDE2KW1hdGNoIHN0YXRlcyBzaG91bGQgYmUgYSBwcm9wZXIgc3Vic2V0IG9mIGFsbCBzdGF0ZXMAAIj5IABsAAAA7QIAADsAAABjb25mbGljdGluZyB0cmFuc2l0aW9uYXNzZXJ0aW9uIGZhaWxlZDogc2VsZi5kZmEuc3RhcnRzLmlzX2VtcHR5KCkAAIj5IABsAAAAMQMAABUAAABhc3NlcnRpb24gZmFpbGVkOiBzZWxm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Ymxpbmcgc3RhcnRzX2Zvcl9lYWNoX3BhdHRlcm4AEAIhAFMAAADk/iAAawAAAEEKAAARAAAA5P4gAGsAAABKCgAAGgAAAOT+IABrAAAAjgoAAB0AAADk/iAAawAAAJYKAAAbAAAA5P4gAGsAAACyCgAAMwAAAOT+IABrAAAAuwoAADMAAAAAAAAAAAAAAAAAAAACAAAAY2Fubm90IGJ1aWxkIGxhenkgREZBcyBmb3IgcmVnZXhlcyB3aXRoIFVuaWNvZGUgd29yZCBib3VuZGFyaWVzOyBzd2l0Y2ggdG8gQVNDSUkgd29yZCBib3VuZGFyaWVzLCBvciBoZXVyaXN0aWNhbGx5IGVuYWJsZSBVbmljb2RlIHdvcmQgYm91bmRhcmllcyBvciB1c2UgYSBkaWZmZXJlbnQgcmVnZXggZW5naW5lKSBhcmUgbm90IHN1cHBvcnRlZCBvciBlbmFibGVkcmV2ZXJzZSBzZWFyY2ggbXVzdCBtYXRjaCBpZiBmb3J3YXJkIHNlYXJjaCBkb2VzL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL2h5YnJpZC9yZWdleC5yc9sDIQBtAAAA8QEAAA4AAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvaHlicmlkL3NlYXJjaC5ycwAAWAQhAG4AAABZAAAAKQAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IHNpZCBiZWluZyB1bmtub3duIGlzIGEgYnVn2AQhAEQAAABYBCEAbgAAAB0BAAARAAAAWAQhAG4AAAAaAQAALQAAAFgEIQBuAAAAVwEAACkAAABYBCEAbgAAAK0BAAARAAAAWAQhAG4AAACqAQAALQAAAFgEIQBuAAAA+wEAACUAAABYBCEAbgAAACICAAARAAAAWAQhAG4AAAAdAgAAFQAAAFgEIQBuAAAA4gIAABQAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBmb3VuZCBpbXBvc3NpYmxlIGVycm9yIGluIG1ldGEgZW5naW5lOiAAAAC0BSEAUQAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy9tZXRhL2Vycm9yLnJzABAGIQBrAAAA7QAAABEAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvbWV0YS9saW1pdGVkLnJzAAAAjAYhAG0AAACOAAAAJQAAAIwGIQBtAAAA6AAAABQAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvbWV0YS9saXRlcmFsLnJzAAAAHAchAG0AAAAeAAAADQAAABwHIQBtAAAAPgAAAA4AAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBleHBlY3RlZCBsaXRlcmFsLCBnb3QgrAchAEAAAAAcByEAbQAAADgAAAAeAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZXhwZWN0ZWQgbGl0ZXJhbCBvciBjb25jYXQsIGdvdCAAAAQIIQBKAAAAHAchAG0AAAA8AAAAEgAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy9tZXRhL3JlZ2V4LnJzAGgIIQBrAAAAiAcAABMAAABoCCEAawAAAG8NAAASAAAAaAghAGsAAABlDQAAEgAAAGsDAAAIAAAABAAAAGwDAABtAwAAbQMAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5p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NgAcKCEAagAAAHgDAAAVAAAAHCghAGoAAACkAwAAKAAAABwoIQBqAAAAsAMAACYAAAAcKCEAagAAAL0DAAAQAAAAHCghAGoAAADMAwAAEAAAABwoIQBqAAAA2gMAADgAAAAcKCEAagAAADcEAAAxAAAAHCghAGoAAABMBAAAOAAAABwoIQBqAAAAWwQAADgAAAAcKCEAagAAAJ4EAAA4AAAAHCghAGoAAADIBAAAMQAAABwoIQBqAAAAQQYAAC0AAAAczSYAagAAAPABAAAeAAAAHM0mAGoAAADyAQAAGAAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy91dGlsL3ByZWZpbHRlci9ieXRlc2V0LnJzANQpIQB3AAAAIwAAABEAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvdXRpbC9wcmVmaWx0ZXIvbWVtY2hyLnJzAABcKiEAdgAAACcAAAAtAAAAXCohAHYAAABVAAAAFgAAAFwqIQB2AAAAVgAAABYAAABcKiEAdgAAAGQAAAA2AAAAXCohAHYAAACSAAAAFgAAAFwqIQB2AAAAkwAAABYAAABcKiEAdgAAAJQAAAAWAAAAXCohAHYAAACiAAAAPgAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy91dGlsL3ByZWZpbHRlci9tZW1tZW0ucnMAAFQrIQB2AAAAKwAAACcAAABUKyEAdgAAADsAAAAYAAAAYWhvLWNvcmFzaWNrIERGQSBzaG91bGQgbmV2ZXIgZmFpbC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy91dGlsL3ByZWZpbHRlci90ZWRkeS5ycwAOLCEAdQAAAHEAAAASAAAAAAAAAAEAAAABAAAAzgAAAN8DAADgAwAA4QMAAOIDAAAAAAAAAgAAAAEAAADQAAAA4wMAAOQDAADhAwAA4gMAAAAAAAADAAAAAQAAANEAAADlAwAA5gMAAOEDAADiAwAADwMAAEgAAAAIAAAA0gAAAOcDAADoAwAA6QMAAL4DAADqAwAAkAEAAAQAAADTAAAA6wMAAOwDAADtAwAA7gMAAAAAAAAAAQAAAQAAANQAAADvAwAA8AMAAOEDAADxAwAA8gMAAAwAAAAEAAAA1QAAAPMDAAD0AwAA9QMAAKEDAABTdGFydEJ5dGVNYXB7L2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL3V0aWwvd2lyZS5ycwCBLSEAagAAAFcCAAAOAAAAgS0hAGoAAAB4AwAADAAAAAAAAAAAAAAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy91dGlsL2RldGVybWluaXplL3N0YXRlLnJzFS4hAHcAAADyAAAAIwAAABUuIQB3AAAAjQEAAAkAAAAVLiEAdwAAAJgBAAAJAAAAFS4hAHcAAAC9AQAAIwAAABUuIQB3AAAAyAEAACMAAAAVLiEAdwAAAOMBAAA0AAAAFS4hAHcAAAAMAgAAHwAAABUuIQB3AAAAEAIAABkAAAAVLiEAdwAAACMCAAAgAAAAFS4hAHcAAAAjAgAAOQAAABUuIQB3AAAAMQIAAC8AAAAVLiEAdwAAAF4CAAAPAAAAFS4hAHcAAABnAgAADwAAABUuIQB3AAAAbwIAAA8AAAAVLiEAdwAAAIECAAA1AAAAFS4hAHcAAACHAgAANQAAABUuIQB3AAAAygIAADEAAAAVLiEAdwAAAMYCAAAJAAAAFS4hAHcAAAAAAwAACgAAABUuIQB3AAAA/QIAAA4AAAAVLiEAdwAAABwDAAAeAAAAYXNzZXJ0aW9uIGZhaWxlZDogc3RhY2suaXNfZW1wdHkoKS9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy91dGlsL2RldGVybWluaXplL21vZC5ycwD+LyEAdQAAAHgBAAAFAAAA/i8hAHUAAACAAQAACwAAAP4vIQB1AAAApAEAABsAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvdXRpbC9lbXB0eS5ycwCkMCEAawAAAPkAAAA6AAAA7M0mAGwAAAD7AwAACQAAAP///39QYXR0ZXJuU2V0IHNob3VsZCBoYXZlIHN1ZmZpY2llbnQgY2FwYWNpdHkAAOzNJgBsAAAAywQAAA4AAABxdWl0IHNlYXJjaCBhZnRlciBvYnNlcnZpbmcgYnl0ZSAgYXQgb2Zmc2V0IHAxIQAhAAAAkTEhAAsAAABnYXZlIHVwIHNlYXJjaGluZyBhdCBvZmZzZXQgrDEhABwAAABoYXlzdGFjayBvZiBsZW5ndGggIGlzIHRvbyBsb25nANAxIQATAAAA4zEhAAwAAAB1bmFuY2hvcmVkIHNlYXJjaGVzIGFyZSBub3Qgc3VwcG9ydGVkIG9yIGVuYWJsZWRhbmNob3JlZCBzZWFyY2hlcyBhcmUgbm90IHN1cHBvcnRlZCBvciBlbmFibGVkYW5jaG9yZWQgc2VhcmNoZXMgZm9yIGEgc3BlY2lmaWMgcGF0dGVybiAoXjIhACoAAACNAyEAHgAAAHNwYXJzZSBzZXQgY2FwYWNpdHkgY2Fubm90IGV4Y2NlZCAAAJgyIQAiAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL3V0aWwvc3BhcnNlX3NldC5yc8QyIQBwAAAAggAAAAkAAAAgZXhjZWVkcyBjYXBhY2l0eSBvZiAgd2hlbiBpbnNlcnRpbmcgAAAAAQAAAAAAAABEMyEAFQAAAFkzIQAQAAAAxDIhAHAAAACyAAAACQAAAMQyIQBwAAAAvQAAABQAAADEMiEAcAAAAMUAAAAgAAAAxDIhAHAAAADGAAAANAAAAMQyIQBwAAAA0QAAACEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL3V0aWwvdXRmOC5ycwAA1DQhAGoAAABDAAAAKwAAANQ0IQBqAAAAVQAAADgAAADUNCEAagAAAFgAAAAYAAAA9gMAAGAAAAAQAAAA9wMAAPgDAAAEAAAABAAAAMQAAAAAAAAAAAEAAAEAAAD5AwAAAAAAAAABAAABAAAAhQAAAAAAAAAgAAAAEAAAAPoDAABjb25maWduZmFzdHJpZGUyc3RhcnRfbWFwY2xhc3Nlc3F1aXRzZXRjYWNoZV9jYXBhY2l0eQAAAMA1IQAGAAAAxjUhAAMAAADJNSEABwAAANA1IQAJAAAA2TUhAAcAAADgNSEABwAAAOc1IQAOAAAAREZBAAAAAAABAAAAAQAAAJEAAAD7AwAAEAAAAAQAAAChAAAAAAAAAAEAAAABAAAA/AMAAAAAAAAwAAAAEAAAAP0DAAAAAAAACAAAAAQAAAD+AwAAAAAAAAQAAAAEAAAA/wMAAG1hdGNoX2tpbmRwcmVzdGFydHNfZm9yX2VhY2hfcGF0dGVybmJ5dGVfY2xhc3Nlc3VuaWNvZGVfd29yZF9ib3VuZGFyeXNwZWNpYWxpemVfc3RhcnRfc3RhdGVzc2tpcF9jYWNoZV9jYXBhY2l0eV9jaGVja21pbmltdW1fY2FjaGVfY2xlYXJfY291bnRtaW5pbXVtX2J5dGVzX3Blcl9zdGF0ZQAAAJQ2IQAKAAAAnjYhAAMAAAChNiEAFwAAALg2IQAMAAAAxDYhABUAAADgNSEABwAAANk2IQAXAAAA5zUhAA4AAADwNiEAGQAAAAk3IQAZAAAAIjchABcAAABDb25maWdDYWNoZUVycm9yTGF6eVN0YXRlSURMYXp5U3RhdGVJREVycm9yYXR0ZW1wdGVkZm9yd2FyZHJldmVyc2VSZWdleEluZm9SZWdleEluZm9JcHJvcHNfdW5pb24AAAAAAQAAAAEAAAAABAAAdXRmOF9lbXB0eWF1dG9wcmV3aGljaF9jYXB0dXJlc25mYV9zaXplX2xpbWl0b25lcGFzc19zaXplX2xpbWl0aHlicmlkX2NhY2hlX2NhcGFjaXR5aHlicmlkZGZhZGZhX3NpemVfbGltaXRkZmFfc3RhdGVfbGltaXRvbmVwYXNzYmFja3RyYWNrbGluZV90ZXJtaW5hdG9yAAAAlDYhAAoAAAAEOCEACgAAAA44IQAHAAAAnjYhAAMAAAAVOCEADgAAACM4IQAOAAAAMTghABIAAABDOCEAFQAAAFg4IQAGAAAAXjghAAMAAABhOCEADgAAAG84IQAPAAAAfjghAAcAAACFOCEACQAAALg2IQAMAAAAjjghAA8AAABQcmVncm91cF9pbmZvAAAAAQQAAAQAAAAEAAAAAgQAAAMEAAAQAAAABAAAAAQEAAAFBAAABAAAAAQAAAAGBAAABwQAABgAAAAEAAAACAQAAAkEAAAcAAAABAAAAAoEAAALBAAAPAEAAAQAAAAMBAAADQQAACAFAAAQAAAADgQAAAAAAAAEAAAABAAAAA8EAABpbmZvbmZhcmV2cGlrZXZtsDkhAAQAAACeNiEAAwAAAMY1IQADAAAAtDkhAAYAAAC6OSEABgAAAIU4IQAJAAAAfjghAAcAAABYOCEABgAAAF44IQADAAAAQ29yZVJldmVyc2VBbmNob3JlZGNvcmVSZXZlcnNlU3VmZml4UmV2ZXJzZUlubmVycHJlaW5uZXJQaWtlVk1QaWtlVk1FbmdpbmVCb3VuZGVkQmFja3RyYWNrZXJCb3VuZGVkQmFja3RyYWNrZXJFbmdpbmVPbmVQYXNzT25lUGFzc0VuZ2luZUh5YnJpZEh5YnJpZEVuZ2luZURGQUVuZ2luZVJldmVyc2VIeWJyaWRSZXZlcnNlSHlicmlkRW5naW5lUmV2ZXJzZURGQVJldmVyc2VERkFFbmdpbmV2aXNpdGVkX2NhcGFjaXR5QWxsSW1wbGljaXRUb29NYW55UGF0dGVybnNCeXRlU2V0Yml0c0dyb3VwSW5mb0dyb3VwSW5mb0lubmVyc2xvdF9yYW5nZXNuYW1lX3RvX2luZGV4aW5kZXhfdG9fbmFtZW1lbW9yeV9leHRyYUdyb3VwSW5mb0Vycm9yZXJyVG9vTWFueUdyb3Vwc21pbmltdW1NaXNzaW5nR3JvdXBzRmlyc3RNdXN0QmVVbm5hbWVkRHVwbGljYXRlcmVnZXg6IHRocmVhZCBJRCBhbGxvY2F0aW9uIHNwYWNlIGV4aGF1c3RlZAAArzshACsAAAAczSYAagAAAF4BAAARAAAAQWhvQ29yYXNpY2thY01lbWNock1lbWNocjJNZW1jaHIzTWVtbWVtZmluZGVyc2VhcmNoZXJhbmNob3JlZF9hY1ByZWZpbHRlcmlzX2Zhc3RtYXhfbmVlZGxlX2xlblNtYWxsSW5kZXhTbWFsbEluZGV4RXJyb3JQYXR0ZXJuSUQvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvdXRpbC9wcmltaXRpdmVzLnJzdDwhAHAAAADxAgAAAQAAAFBhdHRlcm5JREVycm9yAAB0PCEAcAAAAPICAAABAAAAU3RhdGVJRGNhbm5vdCBjcmVhdGUgaXRlcmF0b3IgZm9yIFN0YXRlSUQgd2hlbiBudW1iZXIgb2YgZWxlbWVudHMgZXhjZWVkIAAAABs9IQBCAAAATm9uV29yZEJ5dGVXb3JkQnl0ZVRleHRMaW5lTEZMaW5lQ1JDdXN0b21MaW5lVGVybWluYXRvclBhdHRlcm5TZXRJbnNlcnRFcnJvcmNhcGFjaXR5Tm9ZZXNQYXR0ZXJuUXVpdGJ5dGVHYXZlVXBIYXlzdGFja1Rvb0xvbmdsZW5VbnN1cHBvcnRlZEFuY2hvcmVkbW9kZQAQBAAADAAAAAQA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dGVyIGNsYXNzIHJhbmdlLCB0aGUgc3RhcnQgbXVzdCBiZSA8PSB0aGUgZW5kaW52YWxpZCByYW5nZSBib3VuZGFyeSwgbXVzdCBiZSBhIGxpdGVyYWx1bmNsb3NlZCBjaGFyYWN0ZXIgY2xhc3NkZWNpbWFsIGxpdGVyYWwgZW1wdHlkZWNpbWFsIGxpdGVyYWwgaW52YWxpZGhleGFkZWNpbWFsIGxpdGVyYWwgZW1wdHloZXhhZGVjaW1hbCBsaXRlcmFsIGlzIG5vdCBhIFVuaWNvZGUgc2NhbGFyIHZhbHVlaW52YWxpZCBoZXhhZGVjaW1hbCBkaWdpdGluY29tcGxldGUgZXNjYXBlIHNlcXVlbmNlLCByZWFjaGVkIGVuZCBvZiBwYXR0ZXJuIHByZW1hdHVyZWx5dW5yZWNvZ25pemVkIGVzY2FwZSBzZXF1ZW5jZWRhbmdsaW5nIGZsYWcgbmVnYXRpb24gb3BlcmF0b3JkdXBsaWNhdGUgZmxhZ2ZsYWcgbmVnYXRpb24gb3BlcmF0b3IgcmVwZWF0ZWRleHBlY3RlZCBmbGFnIGJ1dCBnb3QgZW5kIG9mIHJlZ2V4dW5yZWNvZ25pemVkIGZsYWdkdXBsaWNhdGUgY2FwdHVyZSBncm91cCBuYW1lZW1wdHkgY2FwdHVyZSBncm91cCBuYW1laW52YWxpZCBjYXB0dXJlIGdyb3VwIGNoYXJhY3RlcnVuY2xvc2VkIGNhcHR1cmUgZ3JvdXAgbmFtZXVuY2xvc2VkIGdyb3VwdW5vcGVuZWQgZ3JvdXBleGNlZWQgdGhlIG1heGltdW0gbnVtYmVyIG9mIG5lc3RlZCBwYXJlbnRoZXNlcy9icmFja2V0cyAo9kohADoAAACzPicAAQAAAGludmFsaWQgcmVwZXRpdGlvbiBjb3VudCByYW5nZSwgdGhlIHN0YXJ0IG11c3QgYmUgPD0gdGhlIGVuZHJlcGV0aXRpb24gcXVhbnRpZmllciBleHBlY3RzIGEgdmFsaWQgZGVjaW1hbHVuY2xvc2VkIGNvdW50ZWQgcmVwZXRpdGlvbnJlcGV0aXRpb24gb3BlcmF0b3IgbWlzc2luZyBleHByZXNzaW9uc3BlY2lhbCB3b3JkIGJvdW5kYXJ5IGFzc2VydGlvbiBpcyBlaXRoZXIgdW5jbG9zZWQgb3IgY29udGFpbnMgYW4gaW52YWxpZCBjaGFyYWN0ZXJ1bnJlY29nbml6ZWQgc3BlY2lhbCB3b3JkIGJvdW5kYXJ5IGFzc2VydGlvbiwgdmFsaWQgY2hvaWNlcyBhcmU6IHN0YXJ0LCBlbmQsIHN0YXJ0LWhhbGYgb3IgZW5kLWhhbGZmb3VuZCBlaXRoZXIgdGhlIGJlZ2lubmluZyBvZiBhIHNwZWNpYWwgd29yZCBib3VuZGFyeSBvciBhIGJvdW5kZWQgcmVwZXRpdGlvbiBvbiBhIFxiIHdpdGggYW4gb3BlbmluZyBicmFjZSwgYnV0IG5vIGNsb3NpbmcgYnJhY2VpbnZhbGlkIFVuaWNvZGUgY2hhcmFjdGVyIGNsYXNzYmFja3JlZmVyZW5jZXMgYXJlIG5vdCBzdXBwb3J0ZWRsb29rLWFyb3VuZCwgaW5jbHVkaW5nIGxvb2stYWhlYWQgYW5kIGxvb2stYmVoaW5kLCBpcyBub3Qgc3VwcG9ydGVkL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtc3ludGF4LTAuOC40L3NyYy9hc3QvbW9kLnJzYWxudW1hc2NpaWJsYW5rY250cmxkaWdpdGdyYXBobG93ZXJwcmludHB1bmN0c3BhY2V1cHBlcnhkaWdpdAAAo00hAGYAAADnBAAAFAAAAKNNIQBmAAAA8wQAACMAAACjTSEAZgAAAA8GAAAUAAAAo00hAGYAAADMBgAAGwAAACcgJy9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LXN5bnRheC0wLjguNC9zcmMvZGVidWcucnMAi04hAGQAAAAYAAAAPQAAAItOIQBkAAAAFQAAAA0AAACLTiEAZAAAADIAAAAbAAAAi04hAGQAAAAuAAAAIwAAAItOIQBkAAAAaAAAACsAAAABAAAAAQAAAHJlZ2V4IHBhcnNlIGVycm9yOgplcnJvcjogAABbTyEABwAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5p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U0hjXUFPpu2jx77h0cvG2dvO6vie7/////////////////////////////////////////////////////////////////////////////////////90cmllZCB0byB1bndyYXAgZXhwciBmcm9tIEhpckZyYW1lLCBnb3Q6IAAAAPxWIQApAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtc3ludGF4LTAuOC40L3NyYy9oaXIvdHJhbnNsYXRlLnJzMFchAGwAAAABAQAAEgAAAHRyaWVkIHRvIHVud3JhcCBVbmljb2RlIGNsYXNzIGZyb20gSGlyRnJhbWUsIGdvdDogAACsVyEAMgAAADBXIQBsAAAACgEAABIAAAB0cmllZCB0byB1bndyYXAgYnl0ZSBjbGFzcyBmcm9tIEhpckZyYW1lLCBnb3Q6IAD4VyEALwAAADBXIQBsAAAAFwEAABIAAAB0cmllZCB0byB1bndyYXAgcmVwZXRpdGlvbiBmcm9tIEhpckZyYW1lLCBnb3Q6IABAWCEALwAAADBXIQBsAAAAJQEAABEAAAB0cmllZCB0byB1bndyYXAgZ3JvdXAgZnJvbSBIaXJGcmFtZSwgZ290OiAAAIhYIQAqAAAAMFchAGwAAAA0AQAAEQAAAHRyaWVkIHRvIHVud3JhcCBhbHQgcGlwZSBmcm9tIEhpckZyYW1lLCBnb3Q6IAAAAMxYIQAtAAAAMFchAGwAAAA/AQAAEQAAADBXIQBsAAAATgEAACcAAAAwVyEAbAAAAE8BAAAXAAAAMFchAGwAAABOAQAACQAAADBXIQBsAAAArAEAAC4AAAAwVyEAbAAAAKMBAAAuAAAAMFchAGwAAAC3AQAAJwAAADBXIQBsAAAAuAEAABwAAAAwVyEAbAAAALwBAAAnAAAAMFchAGwAAAC9AQAALAAAADBXIQBsAAAAzgEAACAAAAAwVyEAbAAAAM8BAAAbAAAAMFchAGwAAADFAQAAHwAAADBXIQBsAAAA/gEAAC4AAAAwVyEAbAAAAPoBAAAuAAAAMFchAGwAAAAKAgAALgAAADBXIQBsAAAABgIAAC4AAAAwVyEAbAAAABkCAAAuAAAAMFchAGwAAAAUAgAALgAAADBXIQBsAAAAIAIAACoAAAAwVyEAbAAAACwCAAAuAAAAMFchAGwAAAAnAgAALgAAADBXIQBsAAAAPgIAAC8AAAAwVyEAbAAAAEUCAAAvAAAAMFchAGwAAAAzAgAALwAAADBXIQBsAAAAOgIAAC8AAAAwVyEAbAAAAIwCAAAmAAAAMFchAGwAAACNAgAAJgAAADBXIQBsAAAAjgIAACYAAAAwVyEAbAAAAHMCAAAmAAAAMFchAGwAAAB0AgAAJgAAADBXIQBsAAAAdQIAACYAAAAwVyEAbAAAALgCAAAcAAAAMFchAGwAAAC4AgAAKQAAADBXIQBsAAAAwwIAACwAAAAwVyEAbAAAAMcCAAATAAAAMFchAGwAAADRAgAALAAAADBXIQBsAAAA0wIAABUAAAAwVyEAbAAAANUCAAATAAAAMFchAGwAAADbAgAAHAAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGV4cGVjdGVkIGV4cHIgb3IgY29uY2F0LCBnb3QgVW5pY29kZSBjbGFzc4RbIQBUAAAAMFchAGwAAADpAgAAEQAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGV4cGVjdGVkIGV4cHIgb3IgY29uY2F0LCBnb3QgYnl0ZSBjbGFzcwAAAPBbIQBRAAAAMFchAGwAAADsAgAAEQAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGV4cGVjdGVkIGV4cHIgb3IgY29uY2F0LCBnb3QgcmVwZXRpdGlvbgAAAFxcIQBRAAAAMFchAGwAAADvAgAAEQAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGV4cGVjdGVkIGV4cHIgb3IgY29uY2F0LCBnb3QgZ3JvdXDIXCEATAAAADBXIQBsAAAA8gIAABEAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBleHBlY3RlZCBleHByIG9yIGNvbmNhdCwgZ290IGFsdCBtYXJrZXIAAAAsXSEAUQAAADBXIQBsAAAA9QIAABEAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBleHBlY3RlZCBleHByIG9yIGNvbmNhdCwgZ290IGFsdCBicmFuY2ggbWFya2VymF0hAFgAAAAwVyEAbAAAAPgCAAARAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZXhwZWN0ZWQgZXhwciBvciBhbHQsIGdvdCBVbmljb2RlIGNsYXNzAAAACF4hAFEAAAAwVyEAbAAAAAgDAAARAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZXhwZWN0ZWQgZXhwciBvciBhbHQsIGdvdCBieXRlIGNsYXNzAAB0XiEATgAAADBXIQBsAAAACwMAABEAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBleHBlY3RlZCBleHByIG9yIGFsdCwgZ290IHJlcGV0aXRpb24AANxeIQBOAAAAMFchAGwAAAAOAwAAEQAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGV4cGVjdGVkIGV4cHIgb3IgYWx0LCBnb3QgZ3JvdXAAAABEXyEASQAAADBXIQBsAAAAEQMAABEAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBleHBlY3RlZCBleHByIG9yIGFsdCwgZ290IGNvbmNhdCBtYXJrZXIAAACoXyEAUQAAADBXIQBsAAAAFAMAABEAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBleHBlY3RlZCBleHByIG9yIGFsdCwgZ290IGFsdCBicmFuY2ggbWFya2VyAAAAFGAhAFUAAAAwVyEAbAAAABcDAAARAAAAYXNzZXJ0aW9uIGZhaWxlZDogc2VsZi5mbGFncygpLnVuaWNvZGUoKTBXIQBsAAAAQwQAAAkAAAAMYXNzZXJ0aW9uIGZhaWxlZDogIXNlbGYuZmxhZ3MoKS51bmljb2RlKCkAADBXIQBsAAAAWQQAAAkAAAAwOUFaYXpBWmF6AH8JCSAgAB9/fzA5IX5heiB+IS86QFtge34JCQoKCwsMDA0NICBBWjA5QVpfX2F6MDlBRmFmVW5pY29kZSBub3QgYWxsb3dlZCBoZXJlcGF0dGVybiBjYW4gbWF0Y2ggaW52YWxpZCBVVEYtOGludmFsaWQgbGluZSB0ZXJtaW5hdG9yLCBtdXN0IGJlIEFTQ0lJVW5pY29kZSBwcm9wZXJ0eSBub3QgZm91bmRVbmljb2RlIHByb3BlcnR5IHZhbHVlIG5vdCBmb3VuZFVuaWNvZGUtYXdhcmUgUGVybCBjbGFzcyBub3QgZm91bmQgKG1ha2Ugc3VyZSB0aGUgdW5pY29kZS1wZXJsIGZlYXR1cmUgaXMgZW5hYmxlZClVbmljb2RlLWF3YXJlIGNhc2UgaW5zZW5zaXRpdml0eSBtYXRjaGluZyBpcyBub3QgYXZhaWxhYmxlIChtYWtlIHN1cmUgdGhlIHVuaWNvZGUtY2FzZSBmZWF0dXJlIGlzIGVuYWJsZWQpL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtc3ludGF4LTAuOC40L3NyYy9oaXIvbW9kLnJzAAAAi2IhAGYAAABXAQAAGQAAAItiIQBmAAAA7QEAABEAAACLYiEAZgAAAPIBAAAeAAAAi2IhAGYAAADbAQAAKQAAAItiIQBmAAAA3QEAACUAAACLYiEAZgAAAOYBAAAdAAAAi2IhAGYAAADoAQAAGQAAAItiIQBmAAAATwIAAB4AAACLYiEAZgAAAEgCAAAZAAAAi2IhAGYAAAC/BAAALgAAAItiIQBmAAAAwAQAACoAAABDbGFzc1VuaWNvZGVSYW5nZQAAAItiIQBmAAAAFQUAABgAAACLYiEAZgAAABQGAAAUAAAAi2IhAGYAAAAZBgAAFAAAAItiIQBmAAAAOgYAADYAAABDbGFzc0J5dGVzUmFuZ2XiiIUAAItiIQBmAAAAsQsAABQAAACLYiEAZgAAAMMLAAAUAAAAi2IhAGYAAAD/CwAADAAAAItiIQBmAAAA+QsAAC0AAACLYiEAZgAAAPkLAAAVAAAAi2IhAGYAAAD3CwAAEgAAAItiIQBmAAAA6AsAABkAAABhAAAAYgAAAGMAAABkAAAAZQAAAGYAAABnAAAAaAAAAGkAAABqAAAAawAAACohAABsAAAAbQAAAG4AAABvAAAAcAAAAHEAAAByAAAAcwAAAH8BAAB0AAAAdQAAAHYAAAB3AAAAeAAAAHkAAAB6AAAAQQAAAEIAAABDAAAARAAAAEUAAABGAAAARwAAAEgAAABJAAAASgAAAEsAAAAqIQAATAAAAE0AAABOAAAATwAAAFAAAABRAAAAUgAAAFMAAAB/AQAAVAAAAFUAAABWAAAAVwAAAFgAAABZAAAAWgAAAJwDAAC8AwAA4AAAAOEAAADiAAAA4wAAAOQAAADlAAAAKyEAAOYAAADnAAAA6AAAAOkAAADqAAAA6wAAAOwAAADtAAAA7gAAAO8AAADwAAAA8QAAAPIAAADzAAAA9AAAAPUAAAD2AAAA+AAAAPkAAAD6AAAA+wAAAPwAAAD9AAAA/gAAAJ4eAADAAAAAwQAAAMIAAADDAAAAxAAAAMUAAAArIQAAxgAAAMcAAADIAAAAyQAAAMoAAADLAAAAzAAAAM0AAADOAAAAzwAAANAAAADRAAAA0gAAANMAAADUAAAA1QAAANYAAADYAAAA2QAAANoAAADbAAAA3AAAAN0AAADeAAAAeAEAAAEBAAAAAQAAAwEAAAIBAAAFAQAABAEAAAcBAAAGAQAACQEAAAgBAAALAQAACgEAAA0BAAAMAQAADwEAAA4BAAARAQAAEAEAABMBAAASAQAAFQEAABQBAAAXAQAAFgEAABkBAAAYAQAAGwEAABoBAAAdAQAAHAEAAB8BAAAeAQAAIQEAACABAAAjAQAAIgEAACUBAAAkAQAAJwEAACYBAAApAQAAKAEAACsBAAAqAQAALQEAACwBAAAvAQAALgEAADMBAAAyAQAANQEAADQBAAA3AQAANgEAADoBAAA5AQAAPAEAADsBAAA+AQAAPQEAAEABAAA/AQAAQgEAAEEBAABEAQAAQwEAAEYBAABFAQAASAEAAEcBAABLAQAASgEAAE0BAABMAQAATwEAAE4BAABRAQAAUAEAAFMBAABSAQAAVQEAAFQBAABXAQAAVgEAAFkBAABYAQAAWwEAAFoBAABdAQAAXAEAAF8BAABeAQAAYQEAAGABAABjAQAAYgEAAGUBAABkAQAAZwEAAGYBAABpAQAAaAEAAGsBAABqAQAAbQEAAGwBAABvAQAAbgEAAHEBAABwAQAAcwEAAHIBAAB1AQAAdAEAAHcBAAB2AQAA/wAAAHoBAAB5AQAAfAEAAHsBAAB+AQAAfQEAAFMAAABzAAAAQwIAAFMCAACDAQAAggEAAIUBAACEAQAAVAIAAIgBAACHAQAAVgIAAFcCAACMAQAAiwEAAN0BAABZAgAAWwIAAJIBAACRAQAAYAIAAGMCAAD2AQAAaQIAAGgCAACZAQAAmAEAAD0CAABvAgAAcgIAACACAAB1AgAAoQEAAKABAACjAQAAogEAAKUBAACkAQAAgAIAAKgBAACnAQAAgwIAAK0BAACsAQAAiAIAALABAACvAQAAigIAAIsCAAC0AQAAswEAALYBAAC1AQAAkgIAALkBAAC4AQAAvQEAALwBAAD3AQAAxQEAAMYBAADEAQAAxgEAAMQBAADFAQAAyAEAAMkBAADHAQAAyQEAAMcBAADIAQAAywEAAMwBAADKAQAAzAEAAMoBAADLAQAAzgEAAM0BAADQAQAAzwEAANIBAADRAQAA1AEAANMBAADWAQAA1QEAANgBAADXAQAA2gEAANkBAADcAQAA2wEAAI4BAADfAQAA3gEAAOEBAADgAQAA4wEAAOIBAADlAQAA5AEAAOcBAADmAQAA6QEAAOgBAADrAQAA6gEAAO0BAADsAQAA7wEAAO4BAADyAQAA8wEAAPEBAADzAQAA8QEAAPIBAAD1AQAA9AEAAJUBAAC/AQAA+QEAAPgBAAD7AQAA+gEAAP0BAAD8AQAA/wEAAP4BAAABAgAAAAIAAAMCAAACAgAABQIAAAQCAAAHAgAABgIAAAkCAAAIAgAACwIAAAoCAAANAgAADAIAAA8CAAAOAgAAEQIAABACAAATAgAAEgIAABUCAAAUAgAAFwIAABYCAAAZAgAAGAIAABsCAAAaAgAAHQIAABwCAAAfAgAAHgIAAJ4BAAAjAgAAIgIAACUCAAAkAgAAJwIAACYCAAApAgAAKAIAACsCAAAqAgAALQIAACwCAAAvAgAALgIAADECAAAwAgAAMwIAADICAABlLAAAPAIAADsCAACaAQAAZiwAAH4sAAB/LAAAQgIAAEECAACAAQAAiQIAAIwCAABHAgAARgIAAEkCAABIAgAASwIAAEoCAABNAgAATAIAAE8CAABOAgAAbywAAG0sAABwLAAAgQEAAIYBAACJAQAAigEAAI8BAACQAQAAq6cAAJMBAACspwAAlAEAAI2nAACqpwAAlwEAAJYBAACupwAAYiwAAK2nAACcAQAAbiwAAJ0BAACfAQAAZCwAAKYBAADFpwAAqQEAALGnAACuAQAARAIAALEBAACyAQAARQIAALcBAACypwAAsKcAAJkDAAC5AwAAvh8AAHEDAABwAwAAcwMAAHIDAAB3AwAAdgMAAP0DAAD+AwAA/wMAAPMDAACsAwAArQMAAK4DAACvAwAAzAMAAM0DAADOAwAAsQMAALIDAADQAwAAswMAALQDAAC1AwAA9QMAALYDAAC3AwAAuAMAANEDAAD0AwAARQMAALkDAAC+HwAAugMAAPADAAC7AwAAtQAAALwDAAC9AwAAvgMAAL8DAADAAwAA1gMAAMEDAADxAwAAwgMAAMMDAADEAwAAxQMAAMYDAADVAwAAxwMAAMgDAADJAwAAJiEAAMoDAADLAwAAhgMAAIgDAACJAwAAigMAAJEDAACSAwAA0AMAAJMDAACUAwAAlQMAAPUDAACWAwAAlwMAAJgDAADRAwAA9AMAAEUDAACZAwAAvh8AAJoDAADwAwAAmwMAALUAAACcAwAAnQMAAJ4DAACfAwAAoAMAANYDAAChAwAA8QMAAKMDAADDAwAAowMAAMIDAACkAwAApQMAAKYDAADVAwAApwMAAKgDAACpAwAAJiEAAKoDAACrAwAAjAMAAI4DAACPAwAA1wMAAJIDAACyAwAAmAMAALgDAAD0AwAApgMAAMYDAACgAwAAwAMAAM8DAADZAwAA2AMAANsDAADaAwAA3QMAANwDAADfAwAA3gMAAOEDAADgAwAA4wMAAOIDAADlAwAA5AMAAOcDAADmAwAA6QMAAOgDAADrAwAA6gMAAO0DAADsAwAA7wMAAO4DAACaAwAAugMAAKEDAADBAwAA+QMAAH8DAACYAwAAuAMAANEDAACVAwAAtQMAAPgDAAD3AwAA8gMAAPsDAAD6AwAAewMAAHwDAAB9AwAAUAQAAFEEAABSBAAAUwQAAFQEAABVBAAAVgQAAFcEAABYBAAAWQQAAFoEAABbBAAAXAQAAF0EAABeBAAAXwQAADAEAAAxBAAAMgQAAIAcAAAzBAAANAQAAIEcAAA1BAAANgQAADcEAAA4BAAAOQQAADoEAAA7BAAAPAQAAD0EAAA+BAAAghwAAD8EAABABAAAQQQAAIMcAABCBAAAhBwAAIUcAABDBAAARAQAAEUEAABGBAAARwQAAEgEAABJBAAASgQAAIYcAABLBAAATAQAAE0EAABOBAAATwQAABAEAAARBAAAEgQAAIAcAAATBAAAFAQAAIEcAAAVBAAAFgQAABcEAAAYBAAAGQQAABoEAAAbBAAAHAQAAB0EAAAeBAAAghwAAB8EAAAgBAAAIQQAAIMcAAAiBAAAhBwAAIUcAAAjBAAAJAQAACUEAAAmBAAAJwQAACgEAAApBAAAKgQAAIYcAAArBAAALAQAAC0EAAAuBAAALwQAAAAEAAABBAAAAgQAAAMEAAAEBAAABQQAAAYEAAAHBAAACAQAAAkEAAAKBAAACwQAAAwEAAANBAAADgQAAA8EAABhBAAAYAQAAGMEAACHHAAAYgQAAIccAABlBAAAZAQAAGcEAABmBAAAaQQAAGgEAABrBAAAagQAAG0EAABsBAAAbwQAAG4EAABxBAAAcAQAAHMEAAByBAAAdQQAAHQEAAB3BAAAdgQAAHkEAAB4BAAAewQAAHoEAAB9BAAAfAQAAH8EAAB+BAAAgQQAAIAEAACLBAAAigQAAI0EAACMBAAAjwQAAI4EAACRBAAAkAQAAJMEAACSBAAAlQQAAJQEAACXBAAAlgQAAJkEAACYBAAAmwQAAJoEAACdBAAAnAQAAJ8EAACeBAAAoQQAAKAEAACjBAAAogQAAKUEAACkBAAApwQAAKYEAACpBAAAqAQAAKsEAACqBAAArQQAAKwEAACvBAAArgQAALEEAACwBAAAswQAALIEAAC1BAAAtAQAALcEAAC2BAAAuQQAALgEAAC7BAAAugQAAL0EAAC8BAAAvwQAAL4EAADPBAAAwgQAAMEEAADEBAAAwwQAAMYEAADFBAAAyAQAAMcEAADKBAAAyQQAAMwEAADLBAAAzgQAAM0EAADABAAA0QQAANAEAADTBAAA0gQAANUEAADUBAAA1wQAANYEAADZBAAA2AQAANsEAADaBAAA3QQAANwEAADfBAAA3gQAAOEEAADgBAAA4wQAAOIEAADlBAAA5AQAAOcEAADmBAAA6QQAAOgEAADrBAAA6gQAAO0EAADsBAAA7wQAAO4EAADxBAAA8AQAAPMEAADyBAAA9QQAAPQEAAD3BAAA9gQAAPkEAAD4BAAA+wQAAPoEAAD9BAAA/AQAAP8EAAD+BAAAAQUAAAAFAAADBQAAAgUAAAUFAAAEBQAABwUAAAYFAAAJBQAACAUAAAsFAAAKBQAADQUAAAwFAAAPBQAADgUAABEFAAAQBQAAEwUAABIFAAAVBQAAFAUAABcFAAAWBQAAGQUAABgFAAAbBQAAGgUAAB0FAAAcBQAAHwUAAB4FAAAhBQAAIAUAACMFAAAiBQAAJQUAACQFAAAnBQAAJgUAACkFAAAoBQAAKwUAACoFAAAtBQAALAUAAC8FAAAuBQAAYQUAAGIFAABjBQAAZAUAAGUFAABmBQAAZwUAAGgFAABpBQAAagUAAGsFAABsBQAAbQUAAG4FAABvBQAAcAUAAHEFAAByBQAAcwUAAHQFAAB1BQAAdgUAAHcFAAB4BQAAeQUAAHoFAAB7BQAAfAUAAH0FAAB+BQAAfwUAAIAFAACBBQAAggUAAIMFAACEBQAAhQUAAIYFAAAxBQAAMgUAADMFAAA0BQAANQUAADYFAAA3BQAAOAUAADkFAAA6BQAAOwUAADwFAAA9BQAAPgUAAD8FAABABQAAQQUAAEIFAABDBQAARAUAAEUFAABGBQAARwUAAEgFAABJBQAASgUAAEsFAABMBQAATQUAAE4FAABPBQAAUAUAAFEFAABSBQAAUwUAAFQFAABVBQAAVgUAAAAtAAABLQAAAi0AAAMtAAAELQAABS0AAAYtAAAHLQAACC0AAAktAAAKLQAACy0AAAwtAAANLQAADi0AAA8tAAAQLQAAES0AABItAAATLQAAFC0AABUtAAAWLQAAFy0AABgtAAAZLQAAGi0AABstAAAcLQAAHS0AAB4tAAAfLQAAIC0AACEtAAAiLQAAIy0AACQtAAAlLQAAJy0AAC0tAACQHAAAkRwAAJIcAACTHAAAlBwAAJUcAACWHAAAlxwAAJgcAACZHAAAmhwAAJscAACcHAAAnRwAAJ4cAACfHAAAoBwAAKEcAACiHAAAoxwAAKQcAAClHAAAphwAAKccAACoHAAAqRwAAKocAACrHAAArBwAAK0cAACuHAAArxwAALAcAACxHAAAshwAALMcAAC0HAAAtRwAALYcAAC3HAAAuBwAALkcAAC6HAAAvRwAAL4cAAC/HAAAcKsAAHGrAAByqwAAc6sAAHSrAAB1qwAAdqsAAHerAAB4qwAAeasAAHqrAAB7qwAAfKsAAH2rAAB+qwAAf6sAAICrAACBqwAAgqsAAIOr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AAA2HwAANx8AAEgfAABJHwAASh8AAEsfAABMHwAATR8AAEAfAABBHwAAQh8AAEMfAABEHwAARR8AAFkfAABbHwAAXR8AAF8fAABRHwAAUx8AAFUfAABXHwAAaB8AAGkfAABqHwAAax8AAGwfAABtHwAAbh8AAG8fAABgHwAAYR8AAGIfAABjHwAAZB8AAGUfAABmHwAAZx8AALofAAC7HwAAyB8AAMkfAADKHwAAyx8AANofAADbHwAA+B8AAPkfAADqHwAA6x8AAPofAAD7HwAAiB8AAIkfAACKHwAAix8AAIwfAACNHwAAjh8AAI8fAACAHwAAgR8AAIIfAACDHwAAhB8AAIUfAACGHwAAhx8AAJgfAACZHwAAmh8AAJsfAACcHwAAnR8AAJ4fAACfHwAAkB8AAJEfAACSHwAAkx8AAJQfAACVHwAAlh8AAJcfAACoHwAAqR8AAKofAACrHwAArB8AAK0fAACuHwAArx8AAKAfAAChHwAAoh8AAKMfAACkHwAApR8AAKYfAACnHwAAuB8AALkfAAC8HwAAsB8AALEfAABwHwAAcR8AALMfAABFAwAAmQMAALkDAADMHwAAch8AAHMfAAB0HwAAdR8AAMMfAADYHwAA2R8AANAfAADRHwAAdh8AAHcfAADoHwAA6R8AAOwfAADgHwAA4R8AAHofAAB7HwAA5R8AAPwfAAB4HwAAeR8AAHwfAAB9HwAA8x8AAKkDAADJAwAASwAAAGsAAADFAAAA5QAAAE4hAAAyIQAAcCEAAHEhAAByIQAAcyEAAHQhAAB1IQAAdiEAAHchAAB4IQAAeSEAAHohAAB7IQAAfCEAAH0hAAB+IQAAfyEAAGAhAABhIQAAYiEAAGMhAABkIQAAZSEAAGYhAABnIQAAaCEAAGkhAABqIQAAayEAAGwhAABtIQAAbiEAAG8hAACEIQAAgyEAANAkAADRJAAA0iQAANMkAADUJAAA1SQAANYkAADXJAAA2CQAANkkAADaJAAA2yQAANwkAADdJAAA3iQAAN8kAADgJAAA4SQAAOIkAADjJAAA5CQAAOUkAADmJAAA5yQAAOgkAADpJAAAtiQAALckAAC4JAAAuSQAALokAAC7JAAAvCQAAL0kAAC+JAAAvyQAAMAkAADBJAAAwiQAAMMkAADEJAAAxSQAAMYkAADHJAAAyCQAAMkkAADKJAAAyyQAAMwkAADNJAAAziQAAM8kAAAwLAAAMSwAADIsAAAzLAAANCwAADUsAAA2LAAANywAADgsAAA5LAAAOiwAADssAAA8LAAAPSwAAD4sAAA/LAAAQCwAAEEsAABCLAAAQywAAEQsAABFLAAARiwAAEcsAABILAAASSwAAEosAABLLAAATCwAAE0sAABOLAAATywAAFAsAABRLAAAUiwAAFMsAABULAAAVSwAAFYsAABXLAAAWCwAAFksAABaLAAAWywAAFwsAABdLAAAXiwAAF8sAAAALAAAASwAAAIsAAADLAAABCwAAAUsAAAGLAAABywAAAgsAAAJLAAACiwAAAssAAAMLAAADSwAAA4sAAAPLAAAECwAABEsAAASLAAAEywAABQsAAAVLAAAFiwAABcsAAAYLAAAGSwAABosAAAbLAAAHCwAAB0sAAAeLAAAHywAACAsAAAhLAAAIiwAACMsAAAkLAAAJSwAACYsAAAnLAAAKCwAACksAAAqLAAAKywAACwsAAAtLAAALiwAAC8sAABhLAAAYCwAAGsCAAB9HQAAfQIAADoCAAA+AgAAaCwAAGcsAABqLAAAaSwAAGwsAABrLAAAUQIAAHECAABQAgAAUgIAAHMsAAByLAAAdiwAAHUsAAA/AgAAQAIAAIEsAACALAAAgywAAIIsAACFLAAAhCwAAIcsAACGLAAAiSwAAIgsAACLLAAAiiwAAI0sAACMLAAAjywAAI4sAACRLAAAkCwAAJMsAACSLAAAlSwAAJQsAACXLAAAliwAAJksAACYLAAAmywAAJosAACdLAAAnCwAAJ8sAACeLAAAoSwAAKAsAACjLAAAoiwAAKUsAACkLAAApywAAKYsAACpLAAAqCwAAKssAACqLAAArSwAAKwsAACvLAAAriwAALEsAACwLAAAsywAALIsAAC1LAAAtCwAALcsAAC2LAAAuSwAALgsAAC7LAAAuiwAAL0sAAC8LAAAvywAAL4sAADBLAAAwCwAAMMsAADCLAAAxSwAAMQsAADHLAAAxiwAAMksAADILAAAyywAAMosAADNLAAAzCwAAM8sAADOLAAA0SwAANAsAADTLAAA0iwAANUsAADULAAA1ywAANYsAADZLAAA2CwAANssAADaLAAA3SwAANwsAADfLAAA3iwAAOEsAADgLAAA4ywAAOIsAADsLAAA6ywAAO4sAADtLAAA8ywAAPIsAACgEAAAoRAAAKIQAACjEAAApBAAAKUQAACmEAAApxAAAKgQAACpEAAAqhAAAKsQAACsEAAArRAAAK4QAACvEAAAsBAAALEQAACyEAAAsxAAALQQAAC1EAAAthAAALcQAAC4EAAAuRAAALoQAAC7EAAAvBAAAL0QAAC+EAAAvxAAAMAQAADBEAAAwhAAAMMQAADEEAAAxRAAAMcQAADNEAAAQaYAAECmAABDpgAAQqYAAEWmAABEpgAAR6YAAEamAABJpgAASKYAAIgcAABLpgAAiBwAAEqmAABNpgAATKYAAE+mAABOpgAAUaYAAFCmAABTpgAAUqYAAFWmAABUpgAAV6YAAFamAABZpgAAWKYAAFumAABapgAAXaYAAFymAABfpgAAXqYAAGGmAABgpgAAY6YAAGKmAABlpgAAZKYAAGemAABmpgAAaaYAAGimAABrpgAAaqYAAG2mAABspgAAgaYAAICmAACDpgAAgqYAAIWmAACEpgAAh6YAAIamAACJpgAAiKYAAIumAACKpgAAjaYAAIymAACPpgAAjqYAAJGmAACQpgAAk6YAAJKmAACVpgAAlKYAAJemAACWpgAAmaYAAJimAACbpgAAmqYAACOnAAAipwAAJacAACSnAAAnpwAAJqcAACmnAAAopwAAK6cAACqnAAAtpwAALKcAAC+nAAAupwAAM6cAADKnAAA1pwAANKcAADenAAA2pwAAOacAADinAAA7pwAAOqcAAD2nAAA8pwAAP6cAAD6nAABBpwAAQKcAAEOnAABCpwAARacAAESnAABHpwAARqcAAEmnAABIpwAAS6cAAEqnAABNpwAATKcAAE+nAABOpwAAUacAAFCnAABTpwAAUqcAAFWnAABUpwAAV6cAAFanAABZpwAAWKcAAFunAABapwAAXacAAFynAABfpwAAXqcAAGGnAABgpwAAY6cAAGKnAABlpwAAZKcAAGenAABmpwAAaacAAGinAABrpwAAaqcAAG2nAABspwAAb6cAAG6nAAB6pwAAeacAAHynAAB7pwAAeR0AAH+nAAB+pwAAgacAAICnAACDpwAAgqcAAIWnAACEpwAAh6cAAIanAACMpwAAi6cAAGUCAACRpwAAkKcAAJOnAACSpwAAxKcAAJenAACWpwAAmacAAJin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AQAA6QEAAekBAALpAQAD6QEABOkBAAXpAQAG6QEAB+kBAAjpAQAJ6QEACukBAAvpAQAM6QEADekBAA7pAQAP6QEAEOkBABHpAQAS6QEAE+kBABTpAQAV6QEAFukBABfpAQAY6QEAGekBABrpAQAb6QEAHOkBAB3pAQAe6QEAH+kBACDpAQAh6QEAQQAAAHxkIQABAAAAQgAAAIBkIQABAAAAQwAAAIRkIQABAAAARAAAAIhkIQABAAAARQAAAIxkIQABAAAARgAAAJBkIQABAAAARwAAAJRkIQABAAAASAAAAJhkIQABAAAASQAAAJxkIQABAAAASgAAAKBkIQABAAAASwAAAKRkIQACAAAATAAAAKxkIQABAAAATQAAALBkIQABAAAATgAAALRkIQABAAAATwAAALhkIQABAAAAUAAAALxkIQABAAAAUQAAAMBkIQABAAAAUgAAAMRkIQABAAAAUwAAAMhkIQACAAAAVAAAANBkIQABAAAAVQAAANRkIQABAAAAVgAAANhkIQABAAAAVwAAANxkIQABAAAAWAAAAOBkIQABAAAAWQAAAORkIQABAAAAWgAAAOhkIQABAAAAYQAAAOxkIQABAAAAYgAAAPBkIQABAAAAYwAAAPRkIQABAAAAZAAAAPhkIQABAAAAZQAAAPxkIQABAAAAZgAAAABlIQABAAAAZwAAAARlIQABAAAAaAAAAAhlIQABAAAAaQAAAAxlIQABAAAAagAAABBlIQABAAAAawAAABRlIQACAAAAbAAAABxlIQABAAAAbQAAACBlIQABAAAAbgAAACRlIQABAAAAbwAAAChlIQABAAAAcAAAACxlIQABAAAAcQAAADBlIQABAAAAcgAAADRlIQABAAAAcwAAADhlIQACAAAAdAAAAEBlIQABAAAAdQAAAERlIQABAAAAdgAAAEhlIQABAAAAdwAAAExlIQABAAAAeAAAAFBlIQABAAAAeQAAAFRlIQABAAAAegAAAFhlIQABAAAAtQAAAFxlIQACAAAAwAAAAGRlIQABAAAAwQAAAGhlIQABAAAAwgAAAGxlIQABAAAAwwAAAHBlIQABAAAAxAAAAHRlIQABAAAAxQAAAHhlIQACAAAAxgAAAIBlIQABAAAAxwAAAIRlIQABAAAAyAAAAIhlIQABAAAAyQAAAIxlIQABAAAAygAAAJBlIQABAAAAywAAAJRlIQABAAAAzAAAAJhlIQABAAAAzQAAAJxlIQABAAAAzgAAAKBlIQABAAAAzwAAAKRlIQABAAAA0AAAAKhlIQABAAAA0QAAAKxlIQABAAAA0gAAALBlIQABAAAA0wAAALRlIQABAAAA1AAAALhlIQABAAAA1QAAALxlIQABAAAA1gAAAMBlIQABAAAA2AAAAMRlIQABAAAA2QAAAMhlIQABAAAA2gAAAMxlIQABAAAA2wAAANBlIQABAAAA3AAAANRlIQABAAAA3QAAANhlIQABAAAA3gAAANxlIQABAAAA3wAAAOBlIQABAAAA4AAAAORlIQABAAAA4QAAAOhlIQABAAAA4gAAAOxlIQABAAAA4wAAAPBlIQABAAAA5AAAAPRlIQABAAAA5QAAAPhlIQACAAAA5gAAAABmIQABAAAA5wAAAARmIQABAAAA6AAAAAhmIQABAAAA6QAAAAxmIQABAAAA6gAAABBmIQABAAAA6wAAABRmIQABAAAA7AAAABhmIQABAAAA7QAAABxmIQABAAAA7gAAACBmIQABAAAA7wAAACRmIQABAAAA8AAAAChmIQABAAAA8QAAACxmIQABAAAA8gAAADBmIQABAAAA8wAAADRmIQABAAAA9AAAADhmIQABAAAA9QAAADxmIQABAAAA9gAAAEBmIQABAAAA+AAAAERmIQABAAAA+QAAAEhmIQABAAAA+gAAAExmIQABAAAA+wAAAFBmIQABAAAA/AAAAFRmIQABAAAA/QAAAFhmIQABAAAA/gAAAFxmIQABAAAA/wAAAGBmIQABAAAAAAEAAGRmIQABAAAAAQEAAGhmIQABAAAAAgEAAGxmIQABAAAAAwEAAHBmIQABAAAABAEAAHRmIQABAAAABQEAAHhmIQABAAAABgEAAHxmIQABAAAABwEAAIBmIQABAAAACAEAAIRmIQABAAAACQEAAIhmIQABAAAACgEAAIxmIQABAAAACwEAAJBmIQABAAAADAEAAJRmIQABAAAADQEAAJhmIQABAAAADgEAAJxmIQABAAAADwEAAKBmIQABAAAAEAEAAKRmIQABAAAAEQEAAKhmIQABAAAAEgEAAKxmIQABAAAAEwEAALBmIQABAAAAFAEAALRmIQABAAAAFQEAALhmIQABAAAAFgEAALxmIQABAAAAFwEAAMBmIQABAAAAGAEAAMRmIQABAAAAGQEAAMhmIQABAAAAGgEAAMxmIQABAAAAGwEAANBmIQABAAAAHAEAANRmIQABAAAAHQEAANhmIQABAAAAHgEAANxmIQABAAAAHwEAAOBmIQABAAAAIAEAAORmIQABAAAAIQEAAOhmIQABAAAAIgEAAOxmIQABAAAAIwEAAPBmIQABAAAAJAEAAPRmIQABAAAAJQEAAPhmIQABAAAAJgEAAPxmIQABAAAAJwEAAABnIQABAAAAKAEAAARnIQABAAAAKQEAAAhnIQABAAAAKgEAAAxnIQABAAAAKwEAABBnIQABAAAALAEAABRnIQABAAAALQEAABhnIQABAAAALgEAABxnIQABAAAALwEAACBnIQABAAAAMgEAACRnIQABAAAAMwEAAChnIQABAAAANAEAACxnIQABAAAANQEAADBnIQABAAAANgEAADRnIQABAAAANwEAADhnIQABAAAAOQEAADxnIQABAAAAOgEAAEBnIQABAAAAOwEAAERnIQABAAAAPAEAAEhnIQABAAAAPQEAAExnIQABAAAAPgEAAFBnIQABAAAAPwEAAFRnIQABAAAAQAEAAFhnIQABAAAAQQEAAFxnIQABAAAAQgEAAGBnIQABAAAAQwEAAGRnIQABAAAARAEAAGhnIQABAAAARQEAAGxnIQABAAAARgEAAHBnIQABAAAARwEAAHRnIQABAAAASAEAAHhnIQABAAAASgEAAHxnIQABAAAASwEAAIBnIQABAAAATAEAAIRnIQABAAAATQEAAIhnIQABAAAATgEAAIxnIQABAAAATwEAAJBnIQABAAAAUAEAAJRnIQABAAAAUQEAAJhnIQABAAAAUgEAAJxnIQABAAAAUwEAAKBnIQABAAAAVAEAAKRnIQABAAAAVQEAAKhnIQABAAAAVgEAAKxnIQABAAAAVwEAALBnIQABAAAAWAEAALRnIQABAAAAWQEAALhnIQABAAAAWgEAALxnIQABAAAAWwEAAMBnIQABAAAAXAEAAMRnIQABAAAAXQEAAMhnIQABAAAAXgEAAMxnIQABAAAAXwEAANBnIQABAAAAYAEAANRnIQABAAAAYQEAANhnIQABAAAAYgEAANxnIQABAAAAYwEAAOBnIQABAAAAZAEAAORnIQABAAAAZQEAAOhnIQABAAAAZgEAAOxnIQABAAAAZwEAAPBnIQABAAAAaAEAAPRnIQABAAAAaQEAAPhnIQABAAAAagEAAPxnIQABAAAAawEAAABoIQABAAAAbAEAAARoIQABAAAAbQEAAAhoIQABAAAAbgEAAAxoIQABAAAAbwEAABBoIQABAAAAcAEAABRoIQABAAAAcQEAABhoIQABAAAAcgEAABxoIQABAAAAcwEAACBoIQABAAAAdAEAACRoIQABAAAAdQEAAChoIQABAAAAdgEAACxoIQABAAAAdwEAADBoIQABAAAAeAEAADRoIQABAAAAeQEAADhoIQABAAAAegEAADxoIQABAAAAewEAAEBoIQABAAAAfAEAAERoIQABAAAAfQEAAEhoIQABAAAAfgEAAExoIQABAAAAfwEAAFBoIQACAAAAgAEAAFhoIQABAAAAgQEAAFxoIQABAAAAggEAAGBoIQABAAAAgwEAAGRoIQABAAAAhAEAAGhoIQABAAAAhQEAAGxoIQABAAAAhgEAAHBoIQABAAAAhwEAAHRoIQABAAAAiAEAAHhoIQABAAAAiQEAAHxoIQABAAAAigEAAIBoIQABAAAAiwEAAIRoIQABAAAAjAEAAIhoIQABAAAAjgEAAIxoIQABAAAAjwEAAJBoIQABAAAAkAEAAJRoIQABAAAAkQEAAJhoIQABAAAAkgEAAJxoIQABAAAAkwEAAKBoIQABAAAAlAEAAKRoIQABAAAAlQEAAKhoIQABAAAAlgEAAKxoIQABAAAAlwEAALBoIQABAAAAmAEAALRoIQABAAAAmQEAALhoIQABAAAAmgEAALxoIQABAAAAnAEAAMBoIQABAAAAnQEAAMRoIQABAAAAngEAAMhoIQABAAAAnwEAAMxoIQABAAAAoAEAANBoIQABAAAAoQEAANRoIQABAAAAogEAANhoIQABAAAAowEAANxoIQABAAAApAEAAOBoIQABAAAApQEAAORoIQABAAAApgEAAOhoIQABAAAApwEAAOxoIQABAAAAqAEAAPBoIQABAAAAqQEAAPRoIQABAAAArAEAAPhoIQABAAAArQEAAPxoIQABAAAArgEAAABpIQABAAAArwEAAARpIQABAAAAsAEAAAhpIQABAAAAsQEAAAxpIQABAAAAsgEAABBpIQABAAAAswEAABRpIQABAAAAtAEAABhpIQABAAAAtQEAABxpIQABAAAAtgEAACBpIQABAAAAtwEAACRpIQABAAAAuAEAAChpIQABAAAAuQEAACxpIQABAAAAvAEAADBpIQABAAAAvQEAADRpIQABAAAAvwEAADhpIQABAAAAxAEAADxpIQACAAAAxQEAAERpIQACAAAAxgEAAExpIQACAAAAxwEAAFRpIQACAAAAyAEAAFxpIQACAAAAyQEAAGRpIQACAAAAygEAAGxpIQACAAAAywEAAHRpIQACAAAAzAEAAHxpIQACAAAAzQEAAIRpIQABAAAAzgEAAIhpIQABAAAAzwEAAIxpIQABAAAA0AEAAJBpIQABAAAA0QEAAJRpIQABAAAA0gEAAJhpIQABAAAA0wEAAJxpIQABAAAA1AEAAKBpIQABAAAA1QEAAKRpIQABAAAA1gEAAKhpIQABAAAA1wEAAKxpIQABAAAA2AEAALBpIQABAAAA2QEAALRpIQABAAAA2gEAALhpIQABAAAA2wEAALxpIQABAAAA3AEAAMBpIQABAAAA3QEAAMRpIQABAAAA3gEAAMhpIQABAAAA3wEAAMxpIQABAAAA4AEAANBpIQABAAAA4QEAANRpIQABAAAA4gEAANhpIQABAAAA4wEAANxpIQABAAAA5AEAAOBpIQABAAAA5QEAAORpIQABAAAA5gEAAOhpIQABAAAA5wEAAOxpIQABAAAA6AEAAPBpIQABAAAA6QEAAPRpIQABAAAA6gEAAPhpIQABAAAA6wEAAPxpIQABAAAA7AEAAABqIQABAAAA7QEAAARqIQABAAAA7gEAAAhqIQABAAAA7wEAAAxqIQABAAAA8QEAABBqIQACAAAA8gEAABhqIQACAAAA8wEAACBqIQACAAAA9AEAAChqIQABAAAA9QEAACxqIQABAAAA9gEAADBqIQABAAAA9wEAADRqIQABAAAA+AEAADhqIQABAAAA+QEAADxqIQABAAAA+gEAAEBqIQABAAAA+wEAAERqIQABAAAA/AEAAEhqIQABAAAA/QEAAExqIQABAAAA/gEAAFBqIQABAAAA/wEAAFRqIQABAAAAAAIAAFhqIQABAAAAAQIAAFxqIQABAAAAAgIAAGBqIQABAAAAAwIAAGRqIQABAAAABAIAAGhqIQABAAAABQIAAGxqIQABAAAABgIAAHBqIQABAAAABwIAAHRqIQABAAAACAIAAHhqIQABAAAACQIAAHxqIQABAAAACgIAAIBqIQABAAAACwIAAIRqIQABAAAADAIAAIhqIQABAAAADQIAAIxqIQABAAAADgIAAJBqIQABAAAADwIAAJRqIQABAAAAEAIAAJhqIQABAAAAEQIAAJxqIQABAAAAEgIAAKBqIQABAAAAEwIAAKRqIQABAAAAFAIAAKhqIQABAAAAFQIAAKxqIQABAAAAFgIAALBqIQABAAAAFwIAALRqIQABAAAAGAIAALhqIQABAAAAGQIAALxqIQABAAAAGgIAAMBqIQABAAAAGwIAAMRqIQABAAAAHAIAAMhqIQABAAAAHQIAAMxqIQABAAAAHgIAANBqIQABAAAAHwIAANRqIQABAAAAIAIAANhqIQABAAAAIgIAANxqIQABAAAAIwIAAOBqIQABAAAAJAIAAORqIQABAAAAJQIAAOhqIQABAAAAJgIAAOxqIQABAAAAJwIAAPBqIQABAAAAKAIAAPRqIQABAAAAKQIAAPhqIQABAAAAKgIAAPxqIQABAAAAKwIAAABrIQABAAAALAIAAARrIQABAAAALQIAAAhrIQABAAAALgIAAAxrIQABAAAALwIAABBrIQABAAAAMAIAABRrIQABAAAAMQIAABhrIQABAAAAMgIAABxrIQABAAAAMwIAACBrIQABAAAAOgIAACRrIQABAAAAOwIAAChrIQABAAAAPAIAACxrIQABAAAAPQIAADBrIQABAAAAPgIAADRrIQABAAAAPwIAADhrIQABAAAAQAIAADxrIQABAAAAQQIAAEBrIQABAAAAQgIAAERrIQABAAAAQwIAAEhrIQABAAAARAIAAExrIQABAAAARQIAAFBrIQABAAAARgIAAFRrIQABAAAARwIAAFhrIQABAAAASAIAAFxrIQABAAAASQIAAGBrIQABAAAASgIAAGRrIQABAAAASwIAAGhrIQABAAAATAIAAGxrIQABAAAATQIAAHBrIQABAAAATgIAAHRrIQABAAAATwIAAHhrIQABAAAAUAIAAHxrIQABAAAAUQIAAIBrIQABAAAAUgIAAIRrIQABAAAAUwIAAIhrIQABAAAAVAIAAIxrIQABAAAAVgIAAJBrIQABAAAAVwIAAJRrIQABAAAAWQIAAJhrIQABAAAAWwIAAJxrIQABAAAAXAIAAKBrIQABAAAAYAIAAKRrIQABAAAAYQIAAKhrIQABAAAAYwIAAKxrIQABAAAAZQIAALBrIQABAAAAZgIAALRrIQABAAAAaAIAALhrIQABAAAAaQIAALxrIQABAAAAagIAAMBrIQABAAAAawIAAMRrIQABAAAAbAIAAMhrIQABAAAAbwIAAMxrIQABAAAAcQIAANBrIQABAAAAcgIAANRrIQABAAAAdQIAANhrIQABAAAAfQIAANxrIQABAAAAgAIAAOBrIQABAAAAggIAAORrIQABAAAAgwIAAOhrIQABAAAAhwIAAOxrIQABAAAAiAIAAPBrIQABAAAAiQIAAPRrIQABAAAAigIAAPhrIQABAAAAiwIAAPxrIQABAAAAjAIAAABsIQABAAAAkgIAAARsIQABAAAAnQIAAAhsIQABAAAAngIAAAxsIQABAAAARQMAABBsIQADAAAAcAMAABxsIQABAAAAcQMAACBsIQABAAAAcgMAACRsIQABAAAAcwMAAChsIQABAAAAdgMAACxsIQABAAAAdwMAADBsIQABAAAAewMAADRsIQABAAAAfAMAADhsIQABAAAAfQMAADxsIQABAAAAfwMAAEBsIQABAAAAhgMAAERsIQABAAAAiAMAAEhsIQABAAAAiQMAAExsIQABAAAAigMAAFBsIQABAAAAjAMAAFRsIQABAAAAjgMAAFhsIQABAAAAjwMAAFxsIQABAAAAkQMAAGBsIQABAAAAkgMAAGRsIQACAAAAkwMAAGxsIQABAAAAlAMAAHBsIQABAAAAlQMAAHRsIQACAAAAlgMAAHxsIQABAAAAlwMAAIBsIQABAAAAmAMAAIRsIQADAAAAmQMAAJBsIQADAAAAmgMAAJxsIQACAAAAmwMAAKRsIQABAAAAnAMAAKhsIQACAAAAnQMAALBsIQABAAAAngMAALRsIQABAAAAnwMAALhsIQABAAAAoAMAALxsIQACAAAAoQMAAMRsIQACAAAAowMAAMxsIQACAAAApAMAANRsIQABAAAApQMAANhsIQABAAAApgMAANxsIQACAAAApwMAAORsIQABAAAAqAMAAOhsIQABAAAAqQMAAOxsIQACAAAAqgMAAPRsIQABAAAAqwMAAPhsIQABAAAArAMAAPxsIQABAAAArQMAAABtIQABAAAArgMAAARtIQABAAAArwMAAAhtIQABAAAAsQMAAAxtIQABAAAAsgMAABBtIQACAAAAswMAABhtIQABAAAAtAMAABxtIQABAAAAtQMAACBtIQACAAAAtgMAAChtIQABAAAAtwMAACxtIQABAAAAuAMAADBtIQADAAAAuQMAADxtIQADAAAAugMAAEhtIQACAAAAuwMAAFBtIQABAAAAvAMAAFRtIQACAAAAvQMAAFxtIQABAAAAvgMAAGBtIQABAAAAvwMAAGRtIQABAAAAwAMAAGhtIQACAAAAwQMAAHBtIQACAAAAwgMAAHhtIQACAAAAwwMAAIBtIQACAAAAxAMAAIhtIQABAAAAxQMAAIxtIQABAAAAxgMAAJBtIQACAAAAxwMAAJhtIQABAAAAyAMAAJxtIQABAAAAyQMAAKBtIQACAAAAygMAAKhtIQABAAAAywMAAKxtIQABAAAAzAMAALBtIQABAAAAzQMAALRtIQABAAAAzgMAALhtIQABAAAAzwMAALxtIQABAAAA0AMAAMBtIQACAAAA0QMAAMhtIQADAAAA1QMAANRtIQACAAAA1gMAANxtIQACAAAA1wMAAORtIQABAAAA2AMAAOhtIQABAAAA2QMAAOxtIQABAAAA2gMAAPBtIQABAAAA2wMAAPRtIQABAAAA3AMAAPhtIQABAAAA3QMAAPxtIQABAAAA3gMAAABuIQABAAAA3wMAAARuIQABAAAA4AMAAAhuIQABAAAA4QMAAAxuIQABAAAA4gMAABBuIQABAAAA4wMAABRuIQABAAAA5AMAABhuIQABAAAA5QMAABxuIQABAAAA5gMAACBuIQABAAAA5wMAACRuIQABAAAA6AMAAChuIQABAAAA6QMAACxuIQABAAAA6gMAADBuIQABAAAA6wMAADRuIQABAAAA7AMAADhuIQABAAAA7QMAADxuIQABAAAA7gMAAEBuIQABAAAA7wMAAERuIQABAAAA8AMAAEhuIQACAAAA8QMAAFBuIQACAAAA8gMAAFhuIQABAAAA8wMAAFxuIQABAAAA9AMAAGBuIQADAAAA9QMAAGxuIQACAAAA9wMAAHRuIQABAAAA+AMAAHhuIQABAAAA+QMAAHxuIQABAAAA+gMAAIBuIQABAAAA+wMAAIRuIQABAAAA/QMAAIhuIQABAAAA/gMAAIxuIQABAAAA/wMAAJBuIQABAAAAAAQAAJRuIQABAAAAAQQAAJhuIQABAAAAAgQAAJxuIQABAAAAAwQAAKBuIQABAAAABAQAAKRuIQABAAAABQQAAKhuIQABAAAABgQAAKxuIQABAAAABwQAALBuIQABAAAACAQAALRuIQABAAAACQQAALhuIQABAAAACgQAALxuIQABAAAACwQAAMBuIQABAAAADAQAAMRuIQABAAAADQQAAMhuIQABAAAADgQAAMxuIQABAAAADwQAANBuIQABAAAAEAQAANRuIQABAAAAEQQAANhuIQABAAAAEgQAANxuIQACAAAAEwQAAORuIQABAAAAFAQAAOhuIQACAAAAFQQAAPBuIQABAAAAFgQAAPRuIQABAAAAFwQAAPhuIQABAAAAGAQAAPxuIQABAAAAGQQAAABvIQABAAAAGgQAAARvIQABAAAAGwQAAAhvIQABAAAAHAQAAAxvIQABAAAAHQQAABBvIQABAAAAHgQAABRvIQACAAAAHwQAABxvIQABAAAAIAQAACBvIQABAAAAIQQAACRvIQACAAAAIgQAACxvIQADAAAAIwQAADhvIQABAAAAJAQAADxvIQABAAAAJQQAAEBvIQABAAAAJgQAAERvIQABAAAAJwQAAEhvIQABAAAAKAQAAExvIQABAAAAKQQAAFBvIQABAAAAKgQAAFRvIQACAAAAKwQAAFxvIQABAAAALAQAAGBvIQABAAAALQQAAGRvIQABAAAALgQAAGhvIQABAAAALwQAAGxvIQABAAAAMAQAAHBvIQABAAAAMQQAAHRvIQABAAAAMgQAAHhvIQACAAAAMwQAAIBvIQABAAAANAQAAIRvIQACAAAANQQAAIxvIQABAAAANgQAAJBvIQABAAAANwQAAJRvIQABAAAAOAQAAJhvIQABAAAAOQQAAJxvIQABAAAAOgQAAKBvIQABAAAAOwQAAKRvIQABAAAAPAQAAKhvIQABAAAAPQQAAKxvIQABAAAAPgQAALBvIQACAAAAPwQAALhvIQABAAAAQAQAALxvIQABAAAAQQQAAMBvIQACAAAAQgQAAMhvIQADAAAAQwQAANRvIQABAAAARAQAANhvIQABAAAARQQAANxvIQABAAAARgQAAOBvIQABAAAARwQAAORvIQABAAAASAQAAOhvIQABAAAASQQAAOxvIQABAAAASgQAAPBvIQACAAAASwQAAPhvIQABAAAATAQAAPxvIQABAAAATQQAAABwIQABAAAATgQAAARwIQABAAAATwQAAAhwIQABAAAAUAQAAAxwIQABAAAAUQQAABBwIQABAAAAUgQAABRwIQABAAAAUwQAABhwIQABAAAAVAQAABxwIQABAAAAVQQAACBwIQABAAAAVgQAACRwIQABAAAAVwQAAChwIQABAAAAWAQAACxwIQABAAAAWQQAADBwIQABAAAAWgQAADRwIQABAAAAWwQAADhwIQABAAAAXAQAADxwIQABAAAAXQQAAEBwIQABAAAAXgQAAERwIQABAAAAXwQAAEhwIQABAAAAYAQAAExwIQABAAAAYQQAAFBwIQABAAAAYgQAAFRwIQACAAAAYwQAAFxwIQACAAAAZAQAAGRwIQABAAAAZQQAAGhwIQABAAAAZgQAAGxwIQABAAAAZwQAAHBwIQABAAAAaAQAAHRwIQABAAAAaQQAAHhwIQABAAAAagQAAHxwIQABAAAAawQAAIBwIQABAAAAbAQAAIRwIQABAAAAbQQAAIhwIQABAAAAbgQAAIxwIQABAAAAbwQAAJBwIQABAAAAcAQAAJRwIQABAAAAcQQAAJhwIQABAAAAcgQAAJxwIQABAAAAcwQAAKBwIQABAAAAdAQAAKRwIQABAAAAdQQAAKhwIQABAAAAdgQAAKxwIQABAAAAdwQAALBwIQABAAAAeAQAALRwIQABAAAAeQQAALhwIQABAAAAegQAALxwIQABAAAAewQAAMBwIQABAAAAfAQAAMRwIQABAAAAfQQAAMhwIQABAAAAfgQAAMxwIQABAAAAfwQAANBwIQABAAAAgAQAANRwIQABAAAAgQQAANhwIQABAAAAigQAANxwIQABAAAAiwQAAOBwIQABAAAAjAQAAORwIQABAAAAjQQAAOhwIQABAAAAjgQAAOxwIQABAAAAjwQAAPBwIQABAAAAkAQAAPRwIQABAAAAkQQAAPhwIQABAAAAkgQAAPxwIQABAAAAkwQAAABxIQABAAAAlAQAAARxIQABAAAAlQQAAAhxIQABAAAAlgQAAAxxIQABAAAAlwQAABBxIQABAAAAmAQAABRxIQABAAAAmQQAABhxIQABAAAAmgQAABxxIQABAAAAmwQAACBxIQABAAAAnAQAACRxIQABAAAAnQQAAChxIQABAAAAngQAACxxIQABAAAAnwQAADBxIQABAAAAoAQAADRxIQABAAAAoQQAADhxIQABAAAAogQAADxxIQABAAAAowQAAEBxIQABAAAApAQAAERxIQABAAAApQQAAEhxIQABAAAApgQAAExxIQABAAAApwQAAFBxIQABAAAAqAQAAFRxIQABAAAAqQQAAFhxIQABAAAAqgQAAFxxIQABAAAAqwQAAGBxIQABAAAArAQAAGRxIQABAAAArQQAAGhxIQABAAAArgQAAGxxIQABAAAArwQAAHBxIQABAAAAsAQAAHRxIQABAAAAsQQAAHhxIQABAAAAsgQAAHxxIQABAAAAswQAAIBxIQABAAAAtAQAAIRxIQABAAAAtQQAAIhxIQABAAAAtgQAAIxxIQABAAAAtwQAAJBxIQABAAAAuAQAAJRxIQABAAAAuQQAAJhxIQABAAAAugQAAJxxIQABAAAAuwQAAKBxIQABAAAAvAQAAKRxIQABAAAAvQQAAKhxIQABAAAAvgQAAKxxIQABAAAAvwQAALBxIQABAAAAwAQAALRxIQABAAAAwQQAALhxIQABAAAAwgQAALxxIQABAAAAwwQAAMBxIQABAAAAxAQAAMRxIQABAAAAxQQAAMhxIQABAAAAxgQAAMxxIQABAAAAxwQAANBxIQABAAAAyAQAANRxIQABAAAAyQQAANhxIQABAAAAygQAANxxIQABAAAAywQAAOBxIQABAAAAzAQAAORxIQABAAAAzQQAAOhxIQABAAAAzgQAAOxxIQABAAAAzwQAAPBxIQABAAAA0AQAAPRxIQABAAAA0QQAAPhxIQABAAAA0gQAAPxxIQABAAAA0wQAAAByIQABAAAA1AQAAARyIQABAAAA1QQAAAhyIQABAAAA1gQAAAxyIQABAAAA1wQAABByIQABAAAA2AQAABRyIQABAAAA2QQAABhyIQABAAAA2gQAABxyIQABAAAA2wQAACByIQABAAAA3AQAACRyIQABAAAA3QQAAChyIQABAAAA3gQAACxyIQABAAAA3wQAADByIQABAAAA4AQAADRyIQABAAAA4QQAADhyIQABAAAA4gQAADxyIQABAAAA4wQAAEByIQABAAAA5AQAAERyIQABAAAA5QQAAEhyIQABAAAA5gQAAExyIQABAAAA5wQAAFByIQABAAAA6AQAAFRyIQABAAAA6QQAAFhyIQABAAAA6gQAAFxyIQABAAAA6wQAAGByIQABAAAA7AQAAGRyIQABAAAA7QQAAGhyIQABAAAA7gQAAGxyIQABAAAA7wQAAHByIQABAAAA8AQAAHRyIQABAAAA8QQAAHhyIQABAAAA8gQAAHxyIQABAAAA8wQAAIByIQABAAAA9AQAAIRyIQABAAAA9QQAAIhyIQABAAAA9gQAAIxyIQABAAAA9wQAAJByIQABAAAA+AQAAJRyIQABAAAA+QQAAJhyIQABAAAA+gQAAJxyIQABAAAA+wQAAKByIQABAAAA/AQAAKRyIQABAAAA/QQAAKhyIQABAAAA/gQAAKxyIQABAAAA/wQAALByIQABAAAAAAUAALRyIQABAAAAAQUAALhyIQABAAAAAgUAALxyIQABAAAAAwUAAMByIQABAAAABAUAAMRyIQABAAAABQUAAMhyIQABAAAABgUAAMxyIQABAAAABwUAANByIQABAAAACAUAANRyIQABAAAACQUAANhyIQABAAAACgUAANxyIQABAAAACwUAAOByIQABAAAADAUAAORyIQABAAAADQUAAOhyIQABAAAADgUAAOxyIQABAAAADwUAAPByIQABAAAAEAUAAPRyIQABAAAAEQUAAPhyIQABAAAAEgUAAPxyIQABAAAAEwUAAABzIQABAAAAFAUAAARzIQABAAAAFQUAAAhzIQABAAAAFgUAAAxzIQABAAAAFwUAABBzIQABAAAAGAUAABRzIQABAAAAGQUAABhzIQABAAAAGgUAABxzIQABAAAAGwUAACBzIQABAAAAHAUAACRzIQABAAAAHQUAAChzIQABAAAAHgUAACxzIQABAAAAHwUAADBzIQABAAAAIAUAADRzIQABAAAAIQUAADhzIQABAAAAIgUAADxzIQABAAAAIwUAAEBzIQABAAAAJAUAAERzIQABAAAAJQUAAEhzIQABAAAAJgUAAExzIQABAAAAJwUAAFBzIQABAAAAKAUAAFRzIQABAAAAKQUAAFhzIQABAAAAKgUAAFxzIQABAAAAKwUAAGBzIQABAAAALAUAAGRzIQABAAAALQUAAGhzIQABAAAALgUAAGxzIQABAAAALwUAAHBzIQABAAAAMQUAAHRzIQABAAAAMgUAAHhzIQABAAAAMwUAAHxzIQABAAAANAUAAIBzIQABAAAANQUAAIRzIQABAAAANgUAAIhzIQABAAAANwUAAIxzIQABAAAAOAUAAJBzIQABAAAAOQUAAJRzIQABAAAAOgUAAJhzIQABAAAAOwUAAJxzIQABAAAAPAUAAKBzIQABAAAAPQUAAKRzIQABAAAAPgUAAKhzIQABAAAAPwUAAKxzIQABAAAAQAUAALBzIQABAAAAQQUAALRzIQABAAAAQgUAALhzIQABAAAAQwUAALxzIQABAAAARAUAAMBzIQABAAAARQUAAMRzIQABAAAARgUAAMhzIQABAAAARwUAAMxzIQABAAAASAUAANBzIQABAAAASQUAANRzIQABAAAASgUAANhzIQABAAAASwUAANxzIQABAAAATAUAAOBzIQABAAAATQUAAORzIQABAAAATgUAAOhzIQABAAAATwUAAOxzIQABAAAAUAUAAPBzIQABAAAAUQUAAPRzIQABAAAAUgUAAPhzIQABAAAAUwUAAPxzIQABAAAAVAUAAAB0IQABAAAAVQUAAAR0IQABAAAAVgUAAAh0IQABAAAAYQUAAAx0IQABAAAAYgUAABB0IQABAAAAYwUAABR0IQABAAAAZAUAABh0IQABAAAAZQUAABx0IQABAAAAZgUAACB0IQABAAAAZwUAACR0IQABAAAAaAUAACh0IQABAAAAaQUAACx0IQABAAAAagUAADB0IQABAAAAawUAADR0IQABAAAAbAUAADh0IQABAAAAbQUAADx0IQABAAAAbgUAAEB0IQABAAAAbwUAAER0IQABAAAAcAUAAEh0IQABAAAAcQUAAEx0IQABAAAAcgUAAFB0IQABAAAAcwUAAFR0IQABAAAAdAUAAFh0IQABAAAAdQUAAFx0IQABAAAAdgUAAGB0IQABAAAAdwUAAGR0IQABAAAAeAUAAGh0IQABAAAAeQUAAGx0IQABAAAAegUAAHB0IQABAAAAewUAAHR0IQABAAAAfAUAAHh0IQABAAAAfQUAAHx0IQABAAAAfgUAAIB0IQABAAAAfwUAAIR0IQABAAAAgAUAAIh0IQABAAAAgQUAAIx0IQABAAAAggUAAJB0IQABAAAAgwUAAJR0IQABAAAAhAUAAJh0IQABAAAAhQUAAJx0IQABAAAAhgUAAKB0IQABAAAAoBAAAKR0IQABAAAAoRAAAKh0IQABAAAAohAAAKx0IQABAAAAoxAAALB0IQABAAAApBAAALR0IQABAAAApRAAALh0IQABAAAAphAAALx0IQABAAAApxAAAMB0IQABAAAAqBAAAMR0IQABAAAAqRAAAMh0IQABAAAAqhAAAMx0IQABAAAAqxAAANB0IQABAAAArBAAANR0IQABAAAArRAAANh0IQABAAAArhAAANx0IQABAAAArxAAAOB0IQABAAAAsBAAAOR0IQABAAAAsRAAAOh0IQABAAAAshAAAOx0IQABAAAAsxAAAPB0IQABAAAAtBAAAPR0IQABAAAAtRAAAPh0IQABAAAAthAAAPx0IQABAAAAtxAAAAB1IQABAAAAuBAAAAR1IQABAAAAuRAAAAh1IQABAAAAuhAAAAx1IQABAAAAuxAAABB1IQABAAAAvBAAABR1IQABAAAAvRAAABh1IQABAAAAvhAAABx1IQABAAAAvxAAACB1IQABAAAAwBAAACR1IQABAAAAwRAAACh1IQABAAAAwhAAACx1IQABAAAAwxAAADB1IQABAAAAxBAAADR1IQABAAAAxRAAADh1IQABAAAAxxAAADx1IQABAAAAzRAAAEB1IQABAAAA0BAAAER1IQABAAAA0RAAAEh1IQABAAAA0hAAAEx1IQABAAAA0xAAAFB1IQABAAAA1BAAAFR1IQABAAAA1RAAAFh1IQABAAAA1hAAAFx1IQABAAAA1xAAAGB1IQABAAAA2BAAAGR1IQABAAAA2RAAAGh1IQABAAAA2hAAAGx1IQABAAAA2xAAAHB1IQABAAAA3BAAAHR1IQABAAAA3RAAAHh1IQABAAAA3hAAAHx1IQABAAAA3xAAAIB1IQABAAAA4BAAAIR1IQABAAAA4RAAAIh1IQABAAAA4hAAAIx1IQABAAAA4xAAAJB1IQABAAAA5BAAAJR1IQABAAAA5RAAAJh1IQABAAAA5hAAAJx1IQABAAAA5xAAAKB1IQABAAAA6BAAAKR1IQABAAAA6RAAAKh1IQABAAAA6hAAAKx1IQABAAAA6xAAALB1IQABAAAA7BAAALR1IQABAAAA7RAAALh1IQABAAAA7hAAALx1IQABAAAA7xAAAMB1IQABAAAA8BAAAMR1IQABAAAA8RAAAMh1IQABAAAA8hAAAMx1IQABAAAA8xAAANB1IQABAAAA9BAAANR1IQABAAAA9RAAANh1IQABAAAA9hAAANx1IQABAAAA9xAAAOB1IQABAAAA+BAAAOR1IQABAAAA+RAAAOh1IQABAAAA+hAAAOx1IQABAAAA/RAAAPB1IQABAAAA/hAAAPR1IQABAAAA/xAAAPh1IQABAAAAoBMAAPx1IQABAAAAoRMAAAB2IQABAAAAohMAAAR2IQABAAAAoxMAAAh2IQABAAAApBMAAAx2IQABAAAApRMAABB2IQABAAAAphMAABR2IQABAAAApxMAABh2IQABAAAAqBMAABx2IQABAAAAqRMAACB2IQABAAAAqhMAACR2IQABAAAAqxMAACh2IQABAAAArBMAACx2IQABAAAArRMAADB2IQABAAAArhMAADR2IQABAAAArxMAADh2IQABAAAAsBMAADx2IQABAAAAsRMAAEB2IQABAAAAshMAAER2IQABAAAAsxMAAEh2IQABAAAAtBMAAEx2IQABAAAAtRMAAFB2IQABAAAAthMAAFR2IQABAAAAtxMAAFh2IQABAAAAuBMAAFx2IQABAAAAuRMAAGB2IQABAAAAuhMAAGR2IQABAAAAuxMAAGh2IQABAAAAvBMAAGx2IQABAAAAvRMAAHB2IQABAAAAvhMAAHR2IQABAAAAvxMAAHh2IQABAAAAwBMAAHx2IQABAAAAwRMAAIB2IQABAAAAwhMAAIR2IQABAAAAwxMAAIh2IQABAAAAxBMAAIx2IQABAAAAxRMAAJB2IQABAAAAxhMAAJR2IQABAAAAxxMAAJh2IQABAAAAyBMAAJx2IQABAAAAyRMAAKB2IQABAAAAyhMAAKR2IQABAAAAyxMAAKh2IQABAAAAzBMAAKx2IQABAAAAzRMAALB2IQABAAAAzhMAALR2IQABAAAAzxMAALh2IQABAAAA0BMAALx2IQABAAAA0RMAAMB2IQABAAAA0hMAAMR2IQABAAAA0xMAAMh2IQABAAAA1BMAAMx2IQABAAAA1RMAANB2IQABAAAA1hMAANR2IQABAAAA1xMAANh2IQABAAAA2BMAANx2IQABAAAA2RMAAOB2IQABAAAA2hMAAOR2IQABAAAA2xMAAOh2IQABAAAA3BMAAOx2IQABAAAA3RMAAPB2IQABAAAA3hMAAPR2IQABAAAA3xMAAPh2IQABAAAA4BMAAPx2IQABAAAA4RMAAAB3IQABAAAA4hMAAAR3IQABAAAA4xMAAAh3IQABAAAA5BMAAAx3IQABAAAA5RMAABB3IQABAAAA5hMAABR3IQABAAAA5xMAABh3IQABAAAA6BMAABx3IQABAAAA6RMAACB3IQABAAAA6hMAACR3IQABAAAA6xMAACh3IQABAAAA7BMAACx3IQABAAAA7RMAADB3IQABAAAA7hMAADR3IQABAAAA7xMAADh3IQABAAAA8BMAADx3IQABAAAA8RMAAEB3IQABAAAA8hMAAER3IQABAAAA8xMAAEh3IQABAAAA9BMAAEx3IQABAAAA9RMAAFB3IQABAAAA+BMAAFR3IQABAAAA+RMAAFh3IQABAAAA+hMAAFx3IQABAAAA+xMAAGB3IQABAAAA/BMAAGR3IQABAAAA/RMAAGh3IQABAAAAgBwAAGx3IQACAAAAgRwAAHR3IQACAAAAghwAAHx3IQACAAAAgxwAAIR3IQACAAAAhBwAAIx3IQADAAAAhRwAAJh3IQADAAAAhhwAAKR3IQACAAAAhxwAAKx3IQACAAAAiBwAALR3IQACAAAAkBwAALx3IQABAAAAkRwAAMB3IQABAAAAkhwAAMR3IQABAAAAkxwAAMh3IQABAAAAlBwAAMx3IQABAAAAlRwAANB3IQABAAAAlhwAANR3IQABAAAAlxwAANh3IQABAAAAmBwAANx3IQABAAAAmRwAAOB3IQABAAAAmhwAAOR3IQABAAAAmxwAAOh3IQABAAAAnBwAAOx3IQABAAAAnRwAAPB3IQABAAAAnhwAAPR3IQABAAAAnxwAAPh3IQABAAAAoBwAAPx3IQABAAAAoRwAAAB4IQABAAAAohwAAAR4IQABAAAAoxwAAAh4IQABAAAApBwAAAx4IQABAAAApRwAABB4IQABAAAAphwAABR4IQABAAAApxwAABh4IQABAAAAqBwAABx4IQABAAAAqRwAACB4IQABAAAAqhwAACR4IQABAAAAqxwAACh4IQABAAAArBwAACx4IQABAAAArRwAADB4IQABAAAArhwAADR4IQABAAAArxwAADh4IQABAAAAsBwAADx4IQABAAAAsRwAAEB4IQABAAAAshwAAER4IQABAAAAsxwAAEh4IQABAAAAtBwAAEx4IQABAAAAtRwAAFB4IQABAAAAthwAAFR4IQABAAAAtxwAAFh4IQABAAAAuBwAAFx4IQABAAAAuRwAAGB4IQABAAAAuhwAAGR4IQABAAAAvRwAAGh4IQABAAAAvhwAAGx4IQABAAAAvxwAAHB4IQABAAAAeR0AAHR4IQABAAAAfR0AAHh4IQABAAAAjh0AAHx4IQABAAAAAB4AAIB4IQABAAAAAR4AAIR4IQABAAAAAh4AAIh4IQABAAAAAx4AAIx4IQABAAAABB4AAJB4IQABAAAABR4AAJR4IQABAAAABh4AAJh4IQABAAAABx4AAJx4IQABAAAACB4AAKB4IQABAAAACR4AAKR4IQABAAAACh4AAKh4IQABAAAACx4AAKx4IQABAAAADB4AALB4IQABAAAADR4AALR4IQABAAAADh4AALh4IQABAAAADx4AALx4IQABAAAAEB4AAMB4IQABAAAAER4AAMR4IQABAAAAEh4AAMh4IQABAAAAEx4AAMx4IQABAAAAFB4AANB4IQABAAAAFR4AANR4IQABAAAAFh4AANh4IQABAAAAFx4AANx4IQABAAAAGB4AAOB4IQABAAAAGR4AAOR4IQABAAAAGh4AAOh4IQABAAAAGx4AAOx4IQABAAAAHB4AAPB4IQABAAAAHR4AAPR4IQABAAAAHh4AAPh4IQABAAAAHx4AAPx4IQABAAAAIB4AAAB5IQABAAAAIR4AAAR5IQABAAAAIh4AAAh5IQABAAAAIx4AAAx5IQABAAAAJB4AABB5IQABAAAAJR4AABR5IQABAAAAJh4AABh5IQABAAAAJx4AABx5IQABAAAAKB4AACB5IQABAAAAKR4AACR5IQABAAAAKh4AACh5IQABAAAAKx4AACx5IQABAAAALB4AADB5IQABAAAALR4AADR5IQABAAAALh4AADh5IQABAAAALx4AADx5IQABAAAAMB4AAEB5IQABAAAAMR4AAER5IQABAAAAMh4AAEh5IQABAAAAMx4AAEx5IQABAAAANB4AAFB5IQABAAAANR4AAFR5IQABAAAANh4AAFh5IQABAAAANx4AAFx5IQABAAAAOB4AAGB5IQABAAAAOR4AAGR5IQABAAAAOh4AAGh5IQABAAAAOx4AAGx5IQABAAAAPB4AAHB5IQABAAAAPR4AAHR5IQABAAAAPh4AAHh5IQABAAAAPx4AAHx5IQABAAAAQB4AAIB5IQABAAAAQR4AAIR5IQABAAAAQh4AAIh5IQABAAAAQx4AAIx5IQABAAAARB4AAJB5IQABAAAARR4AAJR5IQABAAAARh4AAJh5IQABAAAARx4AAJx5IQABAAAASB4AAKB5IQABAAAASR4AAKR5IQABAAAASh4AAKh5IQABAAAASx4AAKx5IQABAAAATB4AALB5IQABAAAATR4AALR5IQABAAAATh4AALh5IQABAAAATx4AALx5IQABAAAAUB4AAMB5IQABAAAAUR4AAMR5IQABAAAAUh4AAMh5IQABAAAAUx4AAMx5IQABAAAAVB4AANB5IQABAAAAVR4AANR5IQABAAAAVh4AANh5IQABAAAAVx4AANx5IQABAAAAWB4AAOB5IQABAAAAWR4AAOR5IQABAAAAWh4AAOh5IQABAAAAWx4AAOx5IQABAAAAXB4AAPB5IQABAAAAXR4AAPR5IQABAAAAXh4AAPh5IQABAAAAXx4AAPx5IQABAAAAYB4AAAB6IQACAAAAYR4AAAh6IQACAAAAYh4AABB6IQABAAAAYx4AABR6IQABAAAAZB4AABh6IQABAAAAZR4AABx6IQABAAAAZh4AACB6IQABAAAAZx4AACR6IQABAAAAaB4AACh6IQABAAAAaR4AACx6IQABAAAAah4AADB6IQABAAAAax4AADR6IQABAAAAbB4AADh6IQABAAAAbR4AADx6IQABAAAAbh4AAEB6IQABAAAAbx4AAER6IQABAAAAcB4AAEh6IQABAAAAcR4AAEx6IQABAAAAch4AAFB6IQABAAAAcx4AAFR6IQABAAAAdB4AAFh6IQABAAAAdR4AAFx6IQABAAAAdh4AAGB6IQABAAAAdx4AAGR6IQABAAAAeB4AAGh6IQABAAAAeR4AAGx6IQABAAAAeh4AAHB6IQABAAAAex4AAHR6IQABAAAAfB4AAHh6IQABAAAAfR4AAHx6IQABAAAAfh4AAIB6IQABAAAAfx4AAIR6IQABAAAAgB4AAIh6IQABAAAAgR4AAIx6IQABAAAAgh4AAJB6IQABAAAAgx4AAJR6IQABAAAAhB4AAJh6IQABAAAAhR4AAJx6IQABAAAAhh4AAKB6IQABAAAAhx4AAKR6IQABAAAAiB4AAKh6IQABAAAAiR4AAKx6IQABAAAAih4AALB6IQABAAAAix4AALR6IQABAAAAjB4AALh6IQABAAAAjR4AALx6IQABAAAAjh4AAMB6IQABAAAAjx4AAMR6IQABAAAAkB4AAMh6IQABAAAAkR4AAMx6IQABAAAAkh4AANB6IQABAAAAkx4AANR6IQABAAAAlB4AANh6IQABAAAAlR4AANx6IQABAAAAmx4AAOB6IQACAAAAnh4AAOh6IQABAAAAoB4AAOx6IQABAAAAoR4AAPB6IQABAAAAoh4AAPR6IQABAAAAox4AAPh6IQABAAAApB4AAPx6IQABAAAApR4AAAB7IQABAAAAph4AAAR7IQABAAAApx4AAAh7IQABAAAAqB4AAAx7IQABAAAAqR4AABB7IQABAAAAqh4AABR7IQABAAAAqx4AABh7IQABAAAArB4AABx7IQABAAAArR4AACB7IQABAAAArh4AACR7IQABAAAArx4AACh7IQABAAAAsB4AACx7IQABAAAAsR4AADB7IQABAAAAsh4AADR7IQABAAAAsx4AADh7IQABAAAAtB4AADx7IQABAAAAtR4AAEB7IQABAAAAth4AAER7IQABAAAAtx4AAEh7IQABAAAAuB4AAEx7IQABAAAAuR4AAFB7IQABAAAAuh4AAFR7IQABAAAAux4AAFh7IQABAAAAvB4AAFx7IQABAAAAvR4AAGB7IQABAAAAvh4AAGR7IQABAAAAvx4AAGh7IQABAAAAwB4AAGx7IQABAAAAwR4AAHB7IQABAAAAwh4AAHR7IQABAAAAwx4AAHh7IQABAAAAxB4AAHx7IQABAAAAxR4AAIB7IQABAAAAxh4AAIR7IQABAAAAxx4AAIh7IQABAAAAyB4AAIx7IQABAAAAyR4AAJB7IQABAAAAyh4AAJR7IQABAAAAyx4AAJh7IQABAAAAzB4AAJx7IQABAAAAzR4AAKB7IQABAAAAzh4AAKR7IQABAAAAzx4AAKh7IQABAAAA0B4AAKx7IQABAAAA0R4AALB7IQABAAAA0h4AALR7IQABAAAA0x4AALh7IQABAAAA1B4AALx7IQABAAAA1R4AAMB7IQABAAAA1h4AAMR7IQABAAAA1x4AAMh7IQABAAAA2B4AAMx7IQABAAAA2R4AANB7IQABAAAA2h4AANR7IQABAAAA2x4AANh7IQABAAAA3B4AANx7IQABAAAA3R4AAOB7IQABAAAA3h4AAOR7IQABAAAA3x4AAOh7IQABAAAA4B4AAOx7IQABAAAA4R4AAPB7IQABAAAA4h4AAPR7IQABAAAA4x4AAPh7IQABAAAA5B4AAPx7IQABAAAA5R4AAAB8IQABAAAA5h4AAAR8IQABAAAA5x4AAAh8IQABAAAA6B4AAAx8IQABAAAA6R4AABB8IQABAAAA6h4AABR8IQABAAAA6x4AABh8IQABAAAA7B4AABx8IQABAAAA7R4AACB8IQABAAAA7h4AACR8IQABAAAA7x4AACh8IQABAAAA8B4AACx8IQABAAAA8R4AADB8IQABAAAA8h4AADR8IQABAAAA8x4AADh8IQABAAAA9B4AADx8IQABAAAA9R4AAEB8IQABAAAA9h4AAER8IQABAAAA9x4AAEh8IQABAAAA+B4AAEx8IQABAAAA+R4AAFB8IQABAAAA+h4AAFR8IQABAAAA+x4AAFh8IQABAAAA/B4AAFx8IQABAAAA/R4AAGB8IQABAAAA/h4AAGR8IQABAAAA/x4AAGh8IQABAAAAAB8AAGx8IQABAAAAAR8AAHB8IQABAAAAAh8AAHR8IQABAAAAAx8AAHh8IQABAAAABB8AAHx8IQABAAAABR8AAIB8IQABAAAABh8AAIR8IQABAAAABx8AAIh8IQABAAAACB8AAIx8IQABAAAACR8AAJB8IQABAAAACh8AAJR8IQABAAAACx8AAJh8IQABAAAADB8AAJx8IQABAAAADR8AAKB8IQABAAAADh8AAKR8IQABAAAADx8AAKh8IQABAAAAEB8AAKx8IQABAAAAER8AALB8IQABAAAAEh8AALR8IQABAAAAEx8AALh8IQABAAAAFB8AALx8IQABAAAAFR8AAMB8IQABAAAAGB8AAMR8IQABAAAAGR8AAMh8IQABAAAAGh8AAMx8IQABAAAAGx8AANB8IQABAAAAHB8AANR8IQABAAAAHR8AANh8IQABAAAAIB8AANx8IQABAAAAIR8AAOB8IQABAAAAIh8AAOR8IQABAAAAIx8AAOh8IQABAAAAJB8AAOx8IQABAAAAJR8AAPB8IQABAAAAJh8AAPR8IQABAAAAJx8AAPh8IQABAAAAKB8AAPx8IQABAAAAKR8AAAB9IQABAAAAKh8AAAR9IQABAAAAKx8AAAh9IQABAAAALB8AAAx9IQABAAAALR8AABB9IQABAAAALh8AABR9IQABAAAALx8AABh9IQABAAAAMB8AABx9IQABAAAAMR8AACB9IQABAAAAMh8AACR9IQABAAAAMx8AACh9IQABAAAANB8AACx9IQABAAAANR8AADB9IQABAAAANh8AADR9IQABAAAANx8AADh9IQABAAAAOB8AADx9IQABAAAAOR8AAEB9IQABAAAAOh8AAER9IQABAAAAOx8AAEh9IQABAAAAPB8AAEx9IQABAAAAPR8AAFB9IQABAAAAPh8AAFR9IQABAAAAPx8AAFh9IQABAAAAQB8AAFx9IQABAAAAQR8AAGB9IQABAAAAQh8AAGR9IQABAAAAQx8AAGh9IQABAAAARB8AAGx9IQABAAAARR8AAHB9IQABAAAASB8AAHR9IQABAAAASR8AAHh9IQABAAAASh8AAHx9IQABAAAASx8AAIB9IQABAAAATB8AAIR9IQABAAAATR8AAIh9IQABAAAAUR8AAIx9IQABAAAAUx8AAJB9IQABAAAAVR8AAJR9IQABAAAAVx8AAJh9IQABAAAAWR8AAJx9IQABAAAAWx8AAKB9IQABAAAAXR8AAKR9IQABAAAAXx8AAKh9IQABAAAAYB8AAKx9IQABAAAAYR8AALB9IQABAAAAYh8AALR9IQABAAAAYx8AALh9IQABAAAAZB8AALx9IQABAAAAZR8AAMB9IQABAAAAZh8AAMR9IQABAAAAZx8AAMh9IQABAAAAaB8AAMx9IQABAAAAaR8AANB9IQABAAAAah8AANR9IQABAAAAax8AANh9IQABAAAAbB8AANx9IQABAAAAbR8AAOB9IQABAAAAbh8AAOR9IQABAAAAbx8AAOh9IQABAAAAcB8AAOx9IQABAAAAcR8AAPB9IQABAAAAch8AAPR9IQABAAAAcx8AAPh9IQABAAAAdB8AAPx9IQABAAAAdR8AAAB+IQABAAAAdh8AAAR+IQABAAAAdx8AAAh+IQABAAAAeB8AAAx+IQABAAAAeR8AABB+IQABAAAAeh8AABR+IQABAAAAex8AABh+IQABAAAAfB8AABx+IQABAAAAfR8AACB+IQABAAAAgB8AACR+IQABAAAAgR8AACh+IQABAAAAgh8AACx+IQABAAAAgx8AADB+IQABAAAAhB8AADR+IQABAAAAhR8AADh+IQABAAAAhh8AADx+IQABAAAAhx8AAEB+IQABAAAAiB8AAER+IQABAAAAiR8AAEh+IQABAAAAih8AAEx+IQABAAAAix8AAFB+IQABAAAAjB8AAFR+IQABAAAAjR8AAFh+IQABAAAAjh8AAFx+IQABAAAAjx8AAGB+IQABAAAAkB8AAGR+IQABAAAAkR8AAGh+IQABAAAAkh8AAGx+IQABAAAAkx8AAHB+IQABAAAAlB8AAHR+IQABAAAAlR8AAHh+IQABAAAAlh8AAHx+IQABAAAAlx8AAIB+IQABAAAAmB8AAIR+IQABAAAAmR8AAIh+IQABAAAAmh8AAIx+IQABAAAAmx8AAJB+IQABAAAAnB8AAJR+IQABAAAAnR8AAJh+IQABAAAAnh8AAJx+IQABAAAAnx8AAKB+IQABAAAAoB8AAKR+IQABAAAAoR8AAKh+IQABAAAAoh8AAKx+IQABAAAAox8AALB+IQABAAAApB8AALR+IQABAAAApR8AALh+IQABAAAAph8AALx+IQABAAAApx8AAMB+IQABAAAAqB8AAMR+IQABAAAAqR8AAMh+IQABAAAAqh8AAMx+IQABAAAAqx8AANB+IQABAAAArB8AANR+IQABAAAArR8AANh+IQABAAAArh8AANx+IQABAAAArx8AAOB+IQABAAAAsB8AAOR+IQABAAAAsR8AAOh+IQABAAAAsx8AAOx+IQABAAAAuB8AAPB+IQABAAAAuR8AAPR+IQABAAAAuh8AAPh+IQABAAAAux8AAPx+IQABAAAAvB8AAAB/IQABAAAAvh8AAAR/IQADAAAAwx8AABB/IQABAAAAyB8AABR/IQABAAAAyR8AABh/IQABAAAAyh8AABx/IQABAAAAyx8AACB/IQABAAAAzB8AACR/IQABAAAA0B8AACh/IQABAAAA0R8AACx/IQABAAAA2B8AADB/IQABAAAA2R8AADR/IQABAAAA2h8AADh/IQABAAAA2x8AADx/IQABAAAA4B8AAEB/IQABAAAA4R8AAER/IQABAAAA5R8AAEh/IQABAAAA6B8AAEx/IQABAAAA6R8AAFB/IQABAAAA6h8AAFR/IQABAAAA6x8AAFh/IQABAAAA7B8AAFx/IQABAAAA8x8AAGB/IQABAAAA+B8AAGR/IQABAAAA+R8AAGh/IQABAAAA+h8AAGx/IQABAAAA+x8AAHB/IQABAAAA/B8AAHR/IQABAAAAJiEAAHh/IQACAAAAKiEAAIB/IQACAAAAKyEAAIh/IQACAAAAMiEAAJB/IQABAAAATiEAAJR/IQABAAAAYCEAAJh/IQABAAAAYSEAAJx/IQABAAAAYiEAAKB/IQABAAAAYyEAAKR/IQABAAAAZCEAAKh/IQABAAAAZSEAAKx/IQABAAAAZiEAALB/IQABAAAAZyEAALR/IQABAAAAaCEAALh/IQABAAAAaSEAALx/IQABAAAAaiEAAMB/IQABAAAAayEAAMR/IQABAAAAbCEAAMh/IQABAAAAbSEAAMx/IQABAAAAbiEAANB/IQABAAAAbyEAANR/IQABAAAAcCEAANh/IQABAAAAcSEAANx/IQABAAAAciEAAOB/IQABAAAAcyEAAOR/IQABAAAAdCEAAOh/IQABAAAAdSEAAOx/IQABAAAAdiEAAPB/IQABAAAAdyEAAPR/IQABAAAAeCEAAPh/IQABAAAAeSEAAPx/IQABAAAAeiEAAACAIQABAAAAeyEAAASAIQABAAAAfCEAAAiAIQABAAAAfSEAAAyAIQABAAAAfiEAABCAIQABAAAAfyEAABSAIQABAAAAgyEAABiAIQABAAAAhCEAAByAIQABAAAAtiQAACCAIQABAAAAtyQAACSAIQABAAAAuCQAACiAIQABAAAAuSQAACyAIQABAAAAuiQAADCAIQABAAAAuyQAADSAIQABAAAAvCQAADiAIQABAAAAvSQAADyAIQABAAAAviQAAECAIQABAAAAvyQAAESAIQABAAAAwCQAAEiAIQABAAAAwSQAAEyAIQABAAAAwiQAAFCAIQABAAAAwyQAAFSAIQABAAAAxCQAAFiAIQABAAAAxSQAAFyAIQABAAAAxiQAAGCAIQABAAAAxyQAAGSAIQABAAAAyCQAAGiAIQABAAAAySQAAGyAIQABAAAAyiQAAHCAIQABAAAAyyQAAHSAIQABAAAAzCQAAHiAIQABAAAAzSQAAHyAIQABAAAAziQAAICAIQABAAAAzyQAAISAIQABAAAA0CQAAIiAIQABAAAA0SQAAIyAIQABAAAA0iQAAJCAIQABAAAA0yQAAJSAIQABAAAA1CQAAJiAIQABAAAA1SQAAJyAIQABAAAA1iQAAKCAIQABAAAA1yQAAKSAIQABAAAA2CQAAKiAIQABAAAA2SQAAKyAIQABAAAA2iQAALCAIQABAAAA2yQAALSAIQABAAAA3CQAALiAIQABAAAA3SQAALyAIQABAAAA3iQAAMCAIQABAAAA3yQAAMSAIQABAAAA4CQAAMiAIQABAAAA4SQAAMyAIQABAAAA4iQAANCAIQABAAAA4yQAANSAIQABAAAA5CQAANiAIQABAAAA5SQAANyAIQABAAAA5iQAAOCAIQABAAAA5yQAAOSAIQABAAAA6CQAAOiAIQABAAAA6SQAAOyAIQABAAAAACwAAPCAIQABAAAAASwAAPSAIQABAAAAAiwAAPiAIQABAAAAAywAAPyAIQABAAAABCwAAACBIQABAAAABSwAAASBIQABAAAABiwAAAiBIQABAAAABywAAAyBIQABAAAACCwAABCBIQABAAAACSwAABSBIQABAAAACiwAABiBIQABAAAACywAAByBIQABAAAADCwAACCBIQABAAAADSwAACSBIQABAAAADiwAACiBIQABAAAADywAACyBIQABAAAAECwAADCBIQABAAAAESwAADSBIQABAAAAEiwAADiBIQABAAAAEywAADyBIQABAAAAFCwAAECBIQABAAAAFSwAAESBIQABAAAAFiwAAEiBIQABAAAAFywAAEyBIQABAAAAGCwAAFCBIQABAAAAGSwAAFSBIQABAAAAGiwAAFiBIQABAAAAGywAAFyBIQABAAAAHCwAAGCBIQABAAAAHSwAAGSBIQABAAAAHiwAAGiBIQABAAAAHywAAGyBIQABAAAAICwAAHCBIQABAAAAISwAAHSBIQABAAAAIiwAAHiBIQABAAAAIywAAHyBIQABAAAAJCwAAICBIQABAAAAJSwAAISBIQABAAAAJiwAAIiBIQABAAAAJywAAIyBIQABAAAAKCwAAJCBIQABAAAAKSwAAJSBIQABAAAAKiwAAJiBIQABAAAAKywAAJyBIQABAAAALCwAAKCBIQABAAAALSwAAKSBIQABAAAALiwAAKiBIQABAAAALywAAKyBIQABAAAAMCwAALCBIQABAAAAMSwAALSBIQABAAAAMiwAALiBIQABAAAAMywAALyBIQABAAAANCwAAMCBIQABAAAANSwAAMSBIQABAAAANiwAAMiBIQABAAAANywAAMyBIQABAAAAOCwAANCBIQABAAAAOSwAANSBIQABAAAAOiwAANiBIQABAAAAOywAANyBIQABAAAAPCwAAOCBIQABAAAAPSwAAOSBIQABAAAAPiwAAOiBIQABAAAAPywAAOyBIQABAAAAQCwAAPCBIQABAAAAQSwAAPSBIQABAAAAQiwAAPiBIQABAAAAQywAAPyBIQABAAAARCwAAACCIQABAAAARSwAAASCIQABAAAARiwAAAiCIQABAAAARywAAAyCIQABAAAASCwAABCCIQABAAAASSwAABSCIQABAAAASiwAABiCIQABAAAASywAAByCIQABAAAATCwAACCCIQABAAAATSwAACSCIQABAAAATiwAACiCIQABAAAATywAACyCIQABAAAAUCwAADCCIQABAAAAUSwAADSCIQABAAAAUiwAADiCIQABAAAAUywAADyCIQABAAAAVCwAAECCIQABAAAAVSwAAESCIQABAAAAViwAAEiCIQABAAAAVywAAEyCIQABAAAAWCwAAFCCIQABAAAAWSwAAFSCIQABAAAAWiwAAFiCIQABAAAAWywAAFyCIQABAAAAXCwAAGCCIQABAAAAXSwAAGSCIQABAAAAXiwAAGiCIQABAAAAXywAAGyCIQABAAAAYCwAAHCCIQABAAAAYSwAAHSCIQABAAAAYiwAAHiCIQABAAAAYywAAHyCIQABAAAAZCwAAICCIQABAAAAZSwAAISCIQABAAAAZiwAAIiCIQABAAAAZywAAIyCIQABAAAAaCwAAJCCIQABAAAAaSwAAJSCIQABAAAAaiwAAJiCIQABAAAAaywAAJyCIQABAAAAbCwAAKCCIQABAAAAbSwAAKSCIQABAAAAbiwAAKiCIQABAAAAbywAAKyCIQABAAAAcCwAALCCIQABAAAAciwAALSCIQABAAAAcywAALiCIQABAAAAdSwAALyCIQABAAAAdiwAAMCCIQABAAAAfiwAAMSCIQABAAAAfywAAMiCIQABAAAAgCwAAMyCIQABAAAAgSwAANCCIQABAAAAgiwAANSCIQABAAAAgywAANiCIQABAAAAhCwAANyCIQABAAAAhSwAAOCCIQABAAAAhiwAAOSCIQABAAAAhywAAOiCIQABAAAAiCwAAOyCIQABAAAAiSwAAPCCIQABAAAAiiwAAPSCIQABAAAAiywAAPiCIQABAAAAjCwAAPyCIQABAAAAjSwAAACDIQABAAAAjiwAAASDIQABAAAAjywAAAiDIQABAAAAkCwAAAyDIQABAAAAkSwAABCDIQABAAAAkiwAABSDIQABAAAAkywAABiDIQABAAAAlCwAAByDIQABAAAAlSwAACCDIQABAAAAliwAACSDIQABAAAAlywAACiDIQABAAAAmCwAACyDIQABAAAAmSwAADCDIQABAAAAmiwAADSDIQABAAAAmywAADiDIQABAAAAnCwAADyDIQABAAAAnSwAAECDIQABAAAAniwAAESDIQABAAAAnywAAEiDIQABAAAAoCwAAEyDIQABAAAAoSwAAFCDIQABAAAAoiwAAFSDIQABAAAAoywAAFiDIQABAAAApCwAAFyDIQABAAAApSwAAGCDIQABAAAApiwAAGSDIQABAAAApywAAGiDIQABAAAAqCwAAGyDIQABAAAAqSwAAHCDIQABAAAAqiwAAHSDIQABAAAAqywAAHiDIQABAAAArCwAAHyDIQABAAAArSwAAICDIQABAAAAriwAAISDIQABAAAArywAAIiDIQABAAAAsCwAAIyDIQABAAAAsSwAAJCDIQABAAAAsiwAAJSDIQABAAAAsywAAJiDIQABAAAAtCwAAJyDIQABAAAAtSwAAKCDIQABAAAAtiwAAKSDIQABAAAAtywAAKiDIQABAAAAuCwAAKyDIQABAAAAuSwAALCDIQABAAAAuiwAALSDIQABAAAAuywAALiDIQABAAAAvCwAALyDIQABAAAAvSwAAMCDIQABAAAAviwAAMSDIQABAAAAvywAAMiDIQABAAAAwCwAAMyDIQABAAAAwSwAANCDIQABAAAAwiwAANSDIQABAAAAwywAANiDIQABAAAAxCwAANyDIQABAAAAxSwAAOCDIQABAAAAxiwAAOSDIQABAAAAxywAAOiDIQABAAAAyCwAAOyDIQABAAAAySwAAPCDIQABAAAAyiwAAPSDIQABAAAAyywAAPiDIQABAAAAzCwAAPyDIQABAAAAzSwAAACEIQABAAAAziwAAASEIQABAAAAzywAAAiEIQABAAAA0CwAAAyEIQABAAAA0SwAABCEIQABAAAA0iwAABSEIQABAAAA0ywAABiEIQABAAAA1CwAAByEIQABAAAA1SwAACCEIQABAAAA1iwAACSEIQABAAAA1ywAACiEIQABAAAA2CwAACyEIQABAAAA2SwAADCEIQABAAAA2iwAADSEIQABAAAA2ywAADiEIQABAAAA3CwAADyEIQABAAAA3SwAAECEIQABAAAA3iwAAESEIQABAAAA3ywAAEiEIQABAAAA4CwAAEyEIQABAAAA4SwAAFCEIQABAAAA4iwAAFSEIQABAAAA4ywAAFiEIQABAAAA6ywAAFyEIQABAAAA7CwAAGCEIQABAAAA7SwAAGSEIQABAAAA7iwAAGiEIQABAAAA8iwAAGyEIQABAAAA8ywAAHCEIQABAAAAAC0AAHSEIQABAAAAAS0AAHiEIQABAAAAAi0AAHyEIQABAAAAAy0AAICEIQABAAAABC0AAISEIQABAAAABS0AAIiEIQABAAAABi0AAIyEIQABAAAABy0AAJCEIQABAAAACC0AAJSEIQABAAAACS0AAJiEIQABAAAACi0AAJyEIQABAAAACy0AAKCEIQABAAAADC0AAKSEIQABAAAADS0AAKiEIQABAAAADi0AAKyEIQABAAAADy0AALCEIQABAAAAEC0AALSEIQABAAAAES0AALiEIQABAAAAEi0AALyEIQABAAAAEy0AAMCEIQABAAAAFC0AAMSEIQABAAAAFS0AAMiEIQABAAAAFi0AAMyEIQABAAAAFy0AANCEIQABAAAAGC0AANSEIQABAAAAGS0AANiEIQABAAAAGi0AANyEIQABAAAAGy0AAOCEIQABAAAAHC0AAOSEIQABAAAAHS0AAOiEIQABAAAAHi0AAOyEIQABAAAAHy0AAPCEIQABAAAAIC0AAPSEIQABAAAAIS0AAPiEIQABAAAAIi0AAPyEIQABAAAAIy0AAACFIQABAAAAJC0AAASFIQABAAAAJS0AAAiFIQABAAAAJy0AAAyFIQABAAAALS0AABCFIQABAAAAQKYAABSFIQABAAAAQaYAABiFIQABAAAAQqYAAByFIQABAAAAQ6YAACCFIQABAAAARKYAACSFIQABAAAARaYAACiFIQABAAAARqYAACyFIQABAAAAR6YAADCFIQABAAAASKYAADSFIQABAAAASaYAADiFIQABAAAASqYAADyFIQACAAAAS6YAAESFIQACAAAATKYAAEyFIQABAAAATaYAAFCFIQABAAAATqYAAFSFIQABAAAAT6YAAFiFIQABAAAAUKYAAFyFIQABAAAAUaYAAGCFIQABAAAAUqYAAGSFIQABAAAAU6YAAGiFIQABAAAAVKYAAGyFIQABAAAAVaYAAHCFIQABAAAAVqYAAHSFIQABAAAAV6YAAHiFIQABAAAAWKYAAHyFIQABAAAAWaYAAICFIQABAAAAWqYAAISFIQABAAAAW6YAAIiFIQABAAAAXKYAAIyFIQABAAAAXaYAAJCFIQABAAAAXqYAAJSFIQABAAAAX6YAAJiFIQABAAAAYKYAAJyFIQABAAAAYaYAAKCFIQABAAAAYqYAAKSFIQABAAAAY6YAAKiFIQABAAAAZKYAAKyFIQABAAAAZaYAALCFIQABAAAAZqYAALSFIQABAAAAZ6YAALiFIQABAAAAaKYAALyFIQABAAAAaaYAAMCFIQABAAAAaqYAAMSFIQABAAAAa6YAAMiFIQABAAAAbKYAAMyFIQABAAAAbaYAANCFIQABAAAAgKYAANSFIQABAAAAgaYAANiFIQABAAAAgqYAANyFIQABAAAAg6YAAOCFIQABAAAAhKYAAOSFIQABAAAAhaYAAOiFIQABAAAAhqYAAOyFIQABAAAAh6YAAPCFIQABAAAAiKYAAPSFIQABAAAAiaYAAPiFIQABAAAAiqYAAPyFIQABAAAAi6YAAACGIQABAAAAjKYAAASGIQABAAAAjaYAAAiGIQABAAAAjqYAAAyGIQABAAAAj6YAABCGIQABAAAAkKYAABSGIQABAAAAkaYAABiGIQABAAAAkqYAAByGIQABAAAAk6YAACCGIQABAAAAlKYAACSGIQABAAAAlaYAACiGIQABAAAAlqYAACyGIQABAAAAl6YAADCGIQABAAAAmKYAADSGIQABAAAAmaYAADiGIQABAAAAmqYAADyGIQABAAAAm6YAAECGIQABAAAAIqcAAESGIQABAAAAI6cAAEiGIQABAAAAJKcAAEyGIQABAAAAJacAAFCGIQABAAAAJqcAAFSGIQABAAAAJ6cAAFiGIQABAAAAKKcAAFyGIQABAAAAKacAAGCGIQABAAAAKqcAAGSGIQABAAAAK6cAAGiGIQABAAAALKcAAGyGIQABAAAALacAAHCGIQABAAAALqcAAHSGIQABAAAAL6cAAHiGIQABAAAAMqcAAHyGIQABAAAAM6cAAICGIQABAAAANKcAAISGIQABAAAANacAAIiGIQABAAAANqcAAIyGIQABAAAAN6cAAJCGIQABAAAAOKcAAJSGIQABAAAAOacAAJiGIQABAAAAOqcAAJyGIQABAAAAO6cAAKCGIQABAAAAPKcAAKSGIQABAAAAPacAAKiGIQABAAAAPqcAAKyGIQABAAAAP6cAALCGIQABAAAAQKcAALSGIQABAAAAQacAALiGIQABAAAAQqcAALyGIQABAAAAQ6cAAMCGIQABAAAARKcAAMSGIQABAAAARacAAMiGIQABAAAARqcAAMyGIQABAAAAR6cAANCGIQABAAAASKcAANSGIQABAAAASacAANiGIQABAAAASqcAANyGIQABAAAAS6cAAOCGIQABAAAATKcAAOSGIQABAAAATacAAOiGIQABAAAATqcAAOyGIQABAAAAT6cAAPCGIQABAAAAUKcAAPSGIQABAAAAUacAAPiGIQABAAAAUqcAAPyGIQABAAAAU6cAAACHIQABAAAAVKcAAASHIQABAAAAVacAAAiHIQABAAAAVqcAAAyHIQABAAAAV6cAABCHIQABAAAAWKcAABSHIQABAAAAWacAABiHIQABAAAAWqcAAByHIQABAAAAW6cAACCHIQABAAAAXKcAACSHIQABAAAAXacAACiHIQABAAAAXqcAACyHIQABAAAAX6cAADCHIQABAAAAYKcAADSHIQABAAAAYacAADiHIQABAAAAYqcAADyHIQABAAAAY6cAAECHIQABAAAAZKcAAESHIQABAAAAZacAAEiHIQABAAAAZqcAAEyHIQABAAAAZ6cAAFCHIQABAAAAaKcAAFSHIQABAAAAaacAAFiHIQABAAAAaqcAAFyHIQABAAAAa6cAAGCHIQABAAAAbKcAAGSHIQABAAAAbacAAGiHIQABAAAAbqcAAGyHIQABAAAAb6cAAHCHIQABAAAAeacAAHSHIQABAAAAeqcAAHiHIQABAAAAe6cAAHyHIQABAAAAfKcAAICHIQABAAAAfacAAISHIQABAAAAfqcAAIiHIQABAAAAf6cAAIyHIQABAAAAgKcAAJCHIQABAAAAgacAAJSHIQABAAAAgqcAAJiHIQABAAAAg6cAAJyHIQABAAAAhKcAAKCHIQABAAAAhacAAKSHIQABAAAAhqcAAKiHIQABAAAAh6cAAKyHIQABAAAAi6cAALCHIQABAAAAjKcAALSHIQABAAAAjacAALiHIQABAAAAkKcAALyHIQABAAAAkacAAMCHIQABAAAAkqcAAMSHIQABAAAAk6cAAMiHIQABAAAAlKcAAMyHIQABAAAAlqcAANCHIQABAAAAl6cAANSHIQABAAAAmKcAANiHIQABAAAAmacAANyHIQABAAAAmqcAAOCHIQABAAAAm6cAAOSHIQABAAAAnKcAAOiHIQABAAAAnacAAOyHIQABAAAAnqcAAPCHIQABAAAAn6cAAPSHIQABAAAAoKcAAPiHIQABAAAAoacAAPyHIQABAAAAoqcAAACIIQABAAAAo6cAAASIIQABAAAApKcAAAiIIQABAAAApacAAAyIIQABAAAApqcAABCIIQABAAAAp6cAABSIIQABAAAAqKcAABiIIQABAAAAqacAAByIIQABAAAAqqcAACCIIQABAAAAq6cAACSIIQABAAAArKcAACiIIQABAAAAracAACyIIQABAAAArqcAADCIIQABAAAAsKcAADSIIQABAAAAsacAADiIIQABAAAAsqcAADyIIQABAAAAs6cAAECIIQABAAAAtKcAAESIIQABAAAAtacAAEiIIQABAAAAtqcAAEyIIQABAAAAt6cAAFCIIQABAAAAuKcAAFSIIQABAAAAuacAAFiIIQABAAAAuqcAAFyIIQABAAAAu6cAAGCIIQABAAAAvKcAAGSIIQABAAAAvacAAGiIIQABAAAAvqcAAGyIIQABAAAAv6cAAHCIIQABAAAAwKcAAHSIIQABAAAAwacAAHiIIQABAAAAwqcAAHyIIQABAAAAw6cAAICIIQABAAAAxKcAAISIIQABAAAAxacAAIiIIQABAAAAxqcAAIyIIQABAAAAx6cAAJCIIQABAAAAyKcAAJSIIQABAAAAyacAAJiIIQABAAAAyqcAAJyIIQABAAAA0KcAAKCIIQABAAAA0acAAKSIIQABAAAA1qcAAKiIIQABAAAA16cAAKyIIQABAAAA2KcAALCIIQABAAAA2acAALSIIQABAAAA9acAALiIIQABAAAA9qcAALyIIQABAAAAU6sAAMCIIQABAAAAcKsAAMSIIQABAAAAcasAAMiIIQABAAAAcqsAAMyIIQABAAAAc6sAANCIIQABAAAAdKsAANSIIQABAAAAdasAANiIIQABAAAAdqsAANyIIQABAAAAd6sAAOCIIQABAAAAeKsAAOSIIQABAAAAeasAAOiIIQABAAAAeqsAAOyIIQABAAAAe6sAAPCIIQABAAAAfKsAAPSIIQABAAAAfasAAPiIIQABAAAAfqsAAPyIIQABAAAAf6sAAACJIQABAAAAgKsAAASJIQABAAAAgasAAAiJIQABAAAAgqsAAAyJIQABAAAAg6sAABCJIQABAAAAhKsAABSJIQABAAAAhasAABiJIQABAAAAhqsAAByJIQABAAAAh6sAACCJIQABAAAAiKsAACSJIQABAAAAiasAACiJIQABAAAAiqsAACyJIQABAAAAi6sAADCJIQABAAAAjKsAADSJIQABAAAAjasAADiJIQABAAAAjqsAADyJIQABAAAAj6sAAECJIQABAAAAkKsAAESJIQABAAAAkasAAEiJIQABAAAAkqsAAEyJIQABAAAAk6sAAFCJIQABAAAAlKsAAFSJIQABAAAAlasAAFiJIQABAAAAlqsAAFyJIQABAAAAl6sAAGCJIQABAAAAmKsAAGSJIQABAAAAmasAAGiJIQABAAAAmqsAAGyJIQABAAAAm6sAAHCJIQABAAAAnKsAAHSJIQABAAAAnasAAHiJIQABAAAAnqsAAHyJIQABAAAAn6sAAICJIQABAAAAoKsAAISJIQABAAAAoasAAIiJIQABAAAAoqsAAIyJIQABAAAAo6sAAJCJIQABAAAApKsAAJSJIQABAAAApasAAJiJIQABAAAApqsAAJyJIQABAAAAp6sAAKCJIQABAAAAqKsAAKSJIQABAAAAqasAAKiJIQABAAAAqqsAAKyJIQABAAAAq6sAALCJIQABAAAArKsAALSJIQABAAAArasAALiJIQABAAAArqsAALyJIQABAAAAr6sAAMCJIQABAAAAsKsAAMSJIQABAAAAsasAAMiJIQABAAAAsqsAAMyJIQABAAAAs6sAANCJIQABAAAAtKsAANSJIQABAAAAtasAANiJIQABAAAAtqsAANyJIQABAAAAt6sAAOCJIQABAAAAuKsAAOSJIQABAAAAuasAAOiJIQABAAAAuqsAAOyJIQABAAAAu6sAAPCJIQABAAAAvKsAAPSJIQABAAAAvasAAPiJIQABAAAAvqsAAPyJIQABAAAAv6sAAACKIQABAAAAIf8AAASKIQABAAAAIv8AAAiKIQABAAAAI/8AAAyKIQABAAAAJP8AABCKIQABAAAAJf8AABSKIQABAAAAJv8AABiKIQABAAAAJ/8AAByKIQABAAAAKP8AACCKIQABAAAAKf8AACSKIQABAAAAKv8AACiKIQABAAAAK/8AACyKIQABAAAALP8AADCKIQABAAAALf8AADSKIQABAAAALv8AADiKIQABAAAAL/8AADyKIQABAAAAMP8AAECKIQABAAAAMf8AAESKIQABAAAAMv8AAEiKIQABAAAAM/8AAEyKIQABAAAANP8AAFCKIQABAAAANf8AAFSKIQABAAAANv8AAFiKIQABAAAAN/8AAFyKIQABAAAAOP8AAGCKIQABAAAAOf8AAGSKIQABAAAAOv8AAGiKIQABAAAAQf8AAGyKIQABAAAAQv8AAHCKIQABAAAAQ/8AAHSKIQABAAAARP8AAHiKIQABAAAARf8AAHyKIQABAAAARv8AAICKIQABAAAAR/8AAISKIQABAAAASP8AAIiKIQABAAAASf8AAIyKIQABAAAASv8AAJCKIQABAAAAS/8AAJSKIQABAAAATP8AAJiKIQABAAAATf8AAJyKIQABAAAATv8AAKCKIQABAAAAT/8AAKSKIQABAAAAUP8AAKiKIQABAAAAUf8AAKyKIQABAAAAUv8AALCKIQABAAAAU/8AALSKIQABAAAAVP8AALiKIQABAAAAVf8AALyKIQABAAAAVv8AAMCKIQABAAAAV/8AAMSKIQABAAAAWP8AAMiKIQABAAAAWf8AAMyKIQABAAAAWv8AANCKIQABAAAAAAQBANSKIQABAAAAAQQBANiKIQABAAAAAgQBANyKIQABAAAAAwQBAOCKIQABAAAABAQBAOSKIQABAAAABQQBAOiKIQABAAAABgQBAOyKIQABAAAABwQBAPCKIQABAAAACAQBAPSKIQABAAAACQQBAPiKIQABAAAACgQBAPyKIQABAAAACwQBAACLIQABAAAADAQBAASLIQABAAAADQQBAAiLIQABAAAADgQBAAyLIQABAAAADwQBABCLIQABAAAAEAQBABSLIQABAAAAEQQBABiLIQABAAAAEgQBAByLIQABAAAAEwQBACCLIQABAAAAFAQBACSLIQABAAAAFQQBACiLIQABAAAAFgQBACyLIQABAAAAFwQBADCLIQABAAAAGAQBADSLIQABAAAAGQQBADiLIQABAAAAGgQBADyLIQABAAAAGwQBAECLIQABAAAAHAQBAESLIQABAAAAHQQBAEiLIQABAAAAHgQBAEyLIQABAAAAHwQBAFCLIQABAAAAIAQBAFSLIQABAAAAIQQBAFiLIQABAAAAIgQBAFyLIQABAAAAIwQBAGCLIQABAAAAJAQBAGSLIQABAAAAJQQBAGiLIQABAAAAJgQBAGyLIQABAAAAJwQBAHCLIQABAAAAKAQBAHSLIQABAAAAKQQBAHiLIQABAAAAKgQBAHyLIQABAAAAKwQBAICLIQABAAAALAQBAISLIQABAAAALQQBAIiLIQABAAAALgQBAIyLIQABAAAALwQBAJCLIQABAAAAMAQBAJSLIQABAAAAMQQBAJiLIQABAAAAMgQBAJyLIQABAAAAMwQBAKCLIQABAAAANAQBAKSLIQABAAAANQQBAKiLIQABAAAANgQBAKyLIQABAAAANwQBALCLIQABAAAAOAQBALSLIQABAAAAOQQBALiLIQABAAAAOgQBALyLIQABAAAAOwQBAMCLIQABAAAAPAQBAMSLIQABAAAAPQQBAMiLIQABAAAAPgQBAMyLIQABAAAAPwQBANCLIQABAAAAQAQBANSLIQABAAAAQQQBANiLIQABAAAAQgQBANyLIQABAAAAQwQBAOCLIQABAAAARAQBAOSLIQABAAAARQQBAOiLIQABAAAARgQBAOyLIQABAAAARwQBAPCLIQABAAAASAQBAPSLIQABAAAASQQBAPiLIQABAAAASgQBAPyLIQABAAAASwQBAACMIQABAAAATAQBAASMIQABAAAATQQBAAiMIQABAAAATgQBAAyMIQABAAAATwQBABCMIQABAAAAsAQBABSMIQABAAAAsQQBABiMIQABAAAAsgQBAByMIQABAAAAswQBACCMIQABAAAAtAQBACSMIQABAAAAtQQBACiMIQABAAAAtgQBACyMIQABAAAAtwQBADCMIQABAAAAuAQBADSMIQABAAAAuQQBADiMIQABAAAAugQBADyMIQABAAAAuwQBAECMIQABAAAAvAQBAESMIQABAAAAvQQBAEiMIQABAAAAvgQBAEyMIQABAAAAvwQBAFCMIQABAAAAwAQBAFSMIQABAAAAwQQBAFiMIQABAAAAwgQBAFyMIQABAAAAwwQBAGCMIQABAAAAxAQBAGSMIQABAAAAxQQBAGiMIQABAAAAxgQBAGyMIQABAAAAxwQBAHCMIQABAAAAyAQBAHSMIQABAAAAyQQBAHiMIQABAAAAygQBAHyMIQABAAAAywQBAICMIQABAAAAzAQBAISMIQABAAAAzQQBAIiMIQABAAAAzgQBAIyMIQABAAAAzwQBAJCMIQABAAAA0AQBAJSMIQABAAAA0QQBAJiMIQABAAAA0gQBAJyMIQABAAAA0wQBAKCMIQABAAAA2AQBAKSMIQABAAAA2QQBAKiMIQABAAAA2gQBAKyMIQABAAAA2wQBALCMIQABAAAA3AQBALSMIQABAAAA3QQBALiMIQABAAAA3gQBALyMIQABAAAA3wQBAMCMIQABAAAA4AQBAMSMIQABAAAA4QQBAMiMIQABAAAA4gQBAMyMIQABAAAA4wQBANCMIQABAAAA5AQBANSMIQABAAAA5QQBANiMIQABAAAA5gQBANyMIQABAAAA5wQBAOCMIQABAAAA6AQBAOSMIQABAAAA6QQBAOiMIQABAAAA6gQBAOyMIQABAAAA6wQBAPCMIQABAAAA7AQBAPSMIQABAAAA7QQBAPiMIQABAAAA7gQBAPyMIQABAAAA7wQBAACNIQABAAAA8AQBAASNIQABAAAA8QQBAAiNIQABAAAA8gQBAAyNIQABAAAA8wQBABCNIQABAAAA9AQBABSNIQABAAAA9QQBABiNIQABAAAA9gQBAByNIQABAAAA9wQBACCNIQABAAAA+AQBACSNIQABAAAA+QQBACiNIQABAAAA+gQBACyNIQABAAAA+wQBADCNIQABAAAAcAUBADSNIQABAAAAcQUBADiNIQABAAAAcgUBADyNIQABAAAAcwUBAECNIQABAAAAdAUBAESNIQABAAAAdQUBAEiNIQABAAAAdgUBAEyNIQABAAAAdwUBAFCNIQABAAAAeAUBAFSNIQABAAAAeQUBAFiNIQABAAAAegUBAFyNIQABAAAAfAUBAGCNIQABAAAAfQUBAGSNIQABAAAAfgUBAGiNIQABAAAAfwUBAGyNIQABAAAAgAUBAHCNIQABAAAAgQUBAHSNIQABAAAAggUBAHiNIQABAAAAgwUBAHyNIQABAAAAhAUBAICNIQABAAAAhQUBAISNIQABAAAAhgUBAIiNIQABAAAAhwUBAIyNIQABAAAAiAUBAJCNIQABAAAAiQUBAJSNIQABAAAAigUBAJiNIQABAAAAjAUBAJyNIQABAAAAjQUBAKCNIQABAAAAjgUBAKSNIQABAAAAjwUBAKiNIQABAAAAkAUBAKyNIQABAAAAkQUBALCNIQABAAAAkgUBALSNIQABAAAAlAUBALiNIQABAAAAlQUBALyNIQABAAAAlwUBAMCNIQABAAAAmAUBAMSNIQABAAAAmQUBAMiNIQABAAAAmgUBAMyNIQABAAAAmwUBANCNIQABAAAAnAUBANSNIQABAAAAnQUBANiNIQABAAAAngUBANyNIQABAAAAnwUBAOCNIQABAAAAoAUBAOSNIQABAAAAoQUBAOiNIQABAAAAowUBAOyNIQABAAAApAUBAPCNIQABAAAApQUBAPSNIQABAAAApgUBAPiNIQABAAAApwUBAPyNIQABAAAAqAUBAACOIQABAAAAqQUBAASOIQABAAAAqgUBAAiOIQABAAAAqwUBAAyOIQABAAAArAUBABCOIQABAAAArQUBABSOIQABAAAArgUBABiOIQABAAAArwUBAByOIQABAAAAsAUBACCOIQABAAAAsQUBACSOIQABAAAAswUBACiOIQABAAAAtAUBACyOIQABAAAAtQUBADCOIQABAAAAtgUBADSOIQABAAAAtwUBADiOIQABAAAAuAUBADyOIQABAAAAuQUBAECOIQABAAAAuwUBAESOIQABAAAAvAUBAEiOIQABAAAAgAwBAEyOIQABAAAAgQwBAFCOIQABAAAAggwBAFSOIQABAAAAgwwBAFiOIQABAAAAhAwBAFyOIQABAAAAhQwBAGCOIQABAAAAhgwBAGSOIQABAAAAhwwBAGiOIQABAAAAiAwBAGyOIQABAAAAiQwBAHCOIQABAAAAigwBAHSOIQABAAAAiwwBAHiOIQABAAAAjAwBAHyOIQABAAAAjQwBAICOIQABAAAAjgwBAISOIQABAAAAjwwBAIiOIQABAAAAkAwBAIyOIQABAAAAkQwBAJCOIQABAAAAkgwBAJSOIQABAAAAkwwBAJiOIQABAAAAlAwBAJyOIQABAAAAlQwBAKCOIQABAAAAlgwBAKSOIQABAAAAlwwBAKiOIQABAAAAmAwBAKyOIQABAAAAmQwBALCOIQABAAAAmgwBALSOIQABAAAAmwwBALiOIQABAAAAnAwBALyOIQABAAAAnQwBAMCOIQABAAAAngwBAMSOIQABAAAAnwwBAMiOIQABAAAAoAwBAMyOIQABAAAAoQwBANCOIQABAAAAogwBANSOIQABAAAAowwBANiOIQABAAAApAwBANyOIQABAAAApQwBAOCOIQABAAAApgwBAOSOIQABAAAApwwBAOiOIQABAAAAqAwBAOyOIQABAAAAqQwBAPCOIQABAAAAqgwBAPSOIQABAAAAqwwBAPiOIQABAAAArAwBAPyOIQABAAAArQwBAACPIQABAAAArgwBAASPIQABAAAArwwBAAiPIQABAAAAsAwBAAyPIQABAAAAsQwBABCPIQABAAAAsgwBABSPIQABAAAAwAwBABiPIQABAAAAwQwBAByPIQABAAAAwgwBACCPIQABAAAAwwwBACSPIQABAAAAxAwBACiPIQABAAAAxQwBACyPIQABAAAAxgwBADCPIQABAAAAxwwBADSPIQABAAAAyAwBADiPIQABAAAAyQwBADyPIQABAAAAygwBAECPIQABAAAAywwBAESPIQABAAAAzAwBAEiPIQABAAAAzQwBAEyPIQABAAAAzgwBAFCPIQABAAAAzwwBAFSPIQABAAAA0AwBAFiPIQABAAAA0QwBAFyPIQABAAAA0gwBAGCPIQABAAAA0wwBAGSPIQABAAAA1AwBAGiPIQABAAAA1QwBAGyPIQABAAAA1gwBAHCPIQABAAAA1wwBAHSPIQABAAAA2AwBAHiPIQABAAAA2QwBAHyPIQABAAAA2gwBAICPIQABAAAA2wwBAISPIQABAAAA3AwBAIiPIQABAAAA3QwBAIyPIQABAAAA3gwBAJCPIQABAAAA3wwBAJSPIQABAAAA4AwBAJiPIQABAAAA4QwBAJyPIQABAAAA4gwBAKCPIQABAAAA4wwBAKSPIQABAAAA5AwBAKiPIQABAAAA5QwBAKyPIQABAAAA5gwBALCPIQABAAAA5wwBALSPIQABAAAA6AwBALiPIQABAAAA6QwBALyPIQABAAAA6gwBAMCPIQABAAAA6wwBAMSPIQABAAAA7AwBAMiPIQABAAAA7QwBAMyPIQABAAAA7gwBANCPIQABAAAA7wwBANSPIQABAAAA8AwBANiPIQABAAAA8QwBANyPIQABAAAA8gwBAOCPIQABAAAAoBgBAOSPIQABAAAAoRgBAOiPIQABAAAAohgBAOyPIQABAAAAoxgBAPCPIQABAAAApBgBAPSPIQABAAAApRgBAPiPIQABAAAAphgBAPyPIQABAAAApxgBAACQIQABAAAAqBgBAASQIQABAAAAqRgBAAiQIQABAAAAqhgBAAyQIQABAAAAqxgBABCQIQABAAAArBgBABSQIQABAAAArRgBABiQIQABAAAArhgBAByQIQABAAAArxgBACCQIQABAAAAsBgBACSQIQABAAAAsRgBACiQIQABAAAAshgBACyQIQABAAAAsxgBADCQIQABAAAAtBgBADSQIQABAAAAtRgBADiQIQABAAAAthgBADyQIQABAAAAtxgBAECQIQABAAAAuBgBAESQIQABAAAAuRgBAEiQIQABAAAAuhgBAEyQIQABAAAAuxgBAFCQIQABAAAAvBgBAFSQIQABAAAAvRgBAFiQIQABAAAAvhgBAFyQIQABAAAAvxgBAGCQIQABAAAAwBgBAGSQIQABAAAAwRgBAGiQIQABAAAAwhgBAGyQIQABAAAAwxgBAHCQIQABAAAAxBgBAHSQIQABAAAAxRgBAHiQIQABAAAAxhgBAHyQIQABAAAAxxgBAICQIQABAAAAyBgBAISQIQABAAAAyRgBAIiQIQABAAAAyhgBAIyQIQABAAAAyxgBAJCQIQABAAAAzBgBAJSQIQABAAAAzRgBAJiQIQABAAAAzhgBAJyQIQABAAAAzxgBAKCQIQABAAAA0BgBAKSQIQABAAAA0RgBAKiQIQABAAAA0hgBAKyQIQABAAAA0xgBALCQIQABAAAA1BgBALSQIQABAAAA1RgBALiQIQABAAAA1hgBALyQIQABAAAA1xgBAMCQIQABAAAA2BgBAMSQIQABAAAA2RgBAMiQIQABAAAA2hgBAMyQIQABAAAA2xgBANCQIQABAAAA3BgBANSQIQABAAAA3RgBANiQIQABAAAA3hgBANyQIQABAAAA3xgBAOCQIQABAAAAQG4BAOSQIQABAAAAQW4BAOiQIQABAAAAQm4BAOyQIQABAAAAQ24BAPCQIQABAAAARG4BAPSQIQABAAAARW4BAPiQIQABAAAARm4BAPyQIQABAAAAR24BAACRIQABAAAASG4BAASRIQABAAAASW4BAAiRIQABAAAASm4BAAyRIQABAAAAS24BABCRIQABAAAATG4BABSRIQABAAAATW4BABiRIQABAAAATm4BAByRIQABAAAAT24BACCRIQABAAAAUG4BACSRIQABAAAAUW4BACiRIQABAAAAUm4BACyRIQABAAAAU24BADCRIQABAAAAVG4BADSRIQABAAAAVW4BADiRIQABAAAAVm4BADyRIQABAAAAV24BAECRIQABAAAAWG4BAESRIQABAAAAWW4BAEiRIQABAAAAWm4BAEyRIQABAAAAW24BAFCRIQABAAAAXG4BAFSRIQABAAAAXW4BAFiRIQABAAAAXm4BAFyRIQABAAAAX24BAGCRIQABAAAAYG4BAGSRIQABAAAAYW4BAGiRIQABAAAAYm4BAGyRIQABAAAAY24BAHCRIQABAAAAZG4BAHSRIQABAAAAZW4BAHiRIQABAAAAZm4BAHyRIQABAAAAZ24BAICRIQABAAAAaG4BAISRIQABAAAAaW4BAIiRIQABAAAAam4BAIyRIQABAAAAa24BAJCRIQABAAAAbG4BAJSRIQABAAAAbW4BAJiRIQABAAAAbm4BAJyRIQABAAAAb24BAKCRIQABAAAAcG4BAKSRIQABAAAAcW4BAKiRIQABAAAAcm4BAKyRIQABAAAAc24BALCRIQABAAAAdG4BALSRIQABAAAAdW4BALiRIQABAAAAdm4BALyRIQABAAAAd24BAMCRIQABAAAAeG4BAMSRIQABAAAAeW4BAMiRIQABAAAAem4BAMyRIQABAAAAe24BANCRIQABAAAAfG4BANSRIQABAAAAfW4BANiRIQABAAAAfm4BANyRIQABAAAAf24BAOCRIQABAAAAAOkBAOSRIQABAAAAAekBAOiRIQABAAAAAukBAOyRIQABAAAAA+kBAPCRIQABAAAABOkBAPSRIQABAAAABekBAPiRIQABAAAABukBAPyRIQABAAAAB+kBAACSIQABAAAACOkBAASSIQABAAAACekBAAiSIQABAAAACukBAAySIQABAAAAC+kBABCSIQABAAAADOkBABSSIQABAAAADekBABiSIQABAAAADukBABySIQABAAAAD+kBACCSIQABAAAAEOkBACSSIQABAAAAEekBACiSIQABAAAAEukBACySIQABAAAAE+kBADCSIQABAAAAFOkBADSSIQABAAAAFekBADiSIQABAAAAFukBADySIQABAAAAF+kBAECSIQABAAAAGOkBAESSIQABAAAAGekBAEiSIQABAAAAGukBAEySIQABAAAAG+kBAFCSIQABAAAAHOkBAFSS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AAAgDwAAKQ8AAEAQAABJEAAAkBAAAJkQAADgFwAA6RcAABAYAAAZGAAARhkAAE8ZAADQGQAA2RkAAIAaAACJGgAAkBoAAJkaAABQGwAAWRsAALAbAAC5GwAAQBwAAEkcAABQHAAAWRwAACCmAAAppgAA0KgAANmoAAAAqQAACakAANCpAADZqQAA8KkAAPmpAABQqgAAWaoAAPCrAAD5qwAAEP8AABn/AACgBAEAqQQBADANAQA5DQEAZhABAG8QAQDwEAEA+RABADYRAQA/EQEA0BEBANkRAQDwEgEA+RIBAFAUAQBZFAEA0BQBANkUAQBQFgEAWRYBAMAWAQDJFgEAMBcBADkXAQDgGAEA6RgBAFAZAQBZGQEAUBwBAFkcAQBQHQEAWR0BAKAdAQCpHQEAUB8BAFkfAQBgagEAaWoBAMBqAQDJagEAUGsBAFlrAQDO1wEA/9cBAEDhAQBJ4QEA8OIBAPniAQDw5AEA+eQBAFDpAQBZ6QEA8PsBAPn7AQBhc3NpZ25lZCQaIgBmAAAA/QEAAEAAAABBU0NJSUFzc2lnbmVkQW55JBoiAGYAAAAGAgAALgAAAGFnZWFoZXhBU0NJSV9IZXhfRGlnaXRBbHBoYWJldGljYWxwaGFiZXRpY2FzY2lpaGV4ZGlnaXRiY0JpZGlfQ2xhc3NiaWRpY0JpZGlfQ29udHJvbGJpZGljbGFzc2JpZGljb250cm9sYmlkaW1CaWRpX01pcnJvcmVkYmlkaW1pcnJvcmVkYmlkaW1pcnJvcmluZ2dseXBoQmlkaV9NaXJyb3JpbmdfR2x5cGhiaWRpcGFpcmVkYnJhY2tldEJpZGlfUGFpcmVkX0JyYWNrZXRiaWRpcGFpcmVkYnJhY2tldHR5cGVCaWRpX1BhaXJlZF9CcmFja2V0X1R5cGVibGtibWdicGJicHRjYW5vbmljYWxjb21iaW5pbmdjbGFzc0Nhbm9uaWNhbF9Db21iaW5pbmdfQ2xhc3NjYXNlZENhc2VkY2FzZWZvbGRpbmdDYXNlX0ZvbGRpbmdjYXNlaWdub3JhYmxlQ2FzZV9JZ25vcmFibGVjY2NjZUNvbXBvc2l0aW9uX0V4Y2x1c2lvbmNoYW5nZXN3aGVuY2FzZWZvbGRlZENoYW5nZXNfV2hlbl9DYXNlZm9sZGVkY2hhbmdlc3doZW5jYXNlbWFwcGVkQ2hhbmdlc19XaGVuX0Nhc2VtYXBwZWRjaGFuZ2Vzd2hlbmxvd2VyY2FzZWRDaGFuZ2VzX1doZW5fTG93ZXJjYXNlZGNoYW5nZXN3aGVubmZrY2Nhc2Vmb2xkZWRDaGFuZ2VzX1doZW5fTkZLQ19DYXNlZm9sZGVkY2hhbmdlc3doZW50aXRsZWNhc2VkQ2hhbmdlc19XaGVuX1RpdGxlY2FzZWRjaGFuZ2Vzd2hlbnVwcGVyY2FzZWRDaGFuZ2VzX1doZW5fVXBwZXJjYXNlZGNpY2prYWNjb3VudGluZ251bWVyaWNrQWNjb3VudGluZ051bWVyaWNjamtjb21wYXRpYmlsaXR5dmFyaWFudGtDb21wYXRpYmlsaXR5VmFyaWFudGNqa2lpY29yZWtJSUNvcmVjamtpcmdnc291cmNla0lSR19HU291cmNlY2praXJnaHNvdXJjZWtJUkdfSFNvdXJjZWNqa2lyZ2pzb3VyY2VrSVJHX0pTb3VyY2VjamtpcmdrcHNvdXJjZWtJUkdfS1BTb3VyY2Vjamtpcmdrc291cmNla0lSR19LU291cmNlY2praXJnbXNvdXJjZWtJUkdfTVNvdXJjZWNqa2lyZ3Nzb3VyY2VrSVJHX1NTb3VyY2Vjamtpcmd0c291cmNla0lSR19UU291cmNlY2praXJndWtzb3VyY2VrSVJHX1VLU291cmNlY2praXJndXNvdXJjZWtJUkdfVVNvdXJjZWNqa2lyZ3Zzb3VyY2VrSVJHX1ZTb3VyY2VjamtvdGhlcm51bWVyaWNrT3RoZXJOdW1lcmljY2prcHJpbWFyeW51bWVyaWNrUHJpbWFyeU51bWVyaWNjamtyc3VuaWNvZGVrUlNVbmljb2RlY29tcGV4RnVsbF9Db21wb3NpdGlvbl9FeGNsdXNpb25jb21wb3NpdGlvbmV4Y2x1c2lvbmN3Y2Zjd2NtY3drY2Zjd2xjd3Rjd3VkYXNoRGFzaGRlY29tcG9zaXRpb25tYXBwaW5nRGVjb21wb3NpdGlvbl9NYXBwaW5nZGVjb21wb3NpdGlvbnR5cGVEZWNvbXBvc2l0aW9uX1R5cGVkZWZhdWx0aWdub3JhYmxlY29kZXBvaW50RGVmYXVsdF9JZ25vcmFibGVfQ29kZV9Qb2ludGRlcERlcHJlY2F0ZWRkZXByZWNhdGVkZGlkaWFEaWFjcml0aWNkaWFjcml0aWNkbWR0ZWFFYXN0X0FzaWFuX1dpZHRoZWFzdGFzaWFud2lkdGhlYmFzZUVtb2ppX01vZGlmaWVyX0Jhc2VlY29tcEVtb2ppX0NvbXBvbmVudGVtb2RFbW9qaV9Nb2RpZmllcmVtb2ppRW1vamllbW9qaWNvbXBvbmVudGVtb2ppbW9kaWZpZXJlbW9qaW1vZGlmaWVyYmFzZWVtb2ppcHJlc2VudGF0aW9uRW1vamlfUHJlc2VudGF0aW9uZXByZXNlcXVpZGVvRXF1aXZhbGVudF9VbmlmaWVkX0lkZW9ncmFwaGVxdWl2YWxlbnR1bmlmaWVkaWRlb2dyYXBoZXhwYW5kc29ubmZjRXhwYW5kc19Pbl9ORkNleHBhbmRzb25uZmRFeHBhbmRzX09uX05GRGV4cGFuZHNvbm5ma2NFeHBhbmRzX09uX05GS0NleHBhbmRzb25uZmtkRXhwYW5kc19Pbl9ORktEZXh0RXh0ZW5kZXJleHRlbmRlZHBpY3RvZ3JhcGhpY0V4dGVuZGVkX1BpY3RvZ3JhcGhpY2V4dGVuZGVyZXh0cGljdGZjbmZrY0ZDX05GS0NfQ2xvc3VyZWZjbmZrY2Nsb3N1cmVmdWxsY29tcG9zaXRpb25leGNsdXNpb25nY2djYmdlbmVyYWxjYXRlZ29yeWdyYXBoZW1lYmFzZUdyYXBoZW1lX0Jhc2VncmFwaGVtZWNsdXN0ZXJicmVha2dyYXBoZW1lZXh0ZW5kR3JhcGhlbWVfRXh0ZW5kZ3JhcGhlbWVsaW5rR3JhcGhlbWVfTGlua2dyYmFzZWdyZXh0Z3JsaW5raGFuZ3Vsc3lsbGFibGV0eXBlSGFuZ3VsX1N5bGxhYmxlX1R5cGVoZXhIZXhfRGlnaXRoZXhkaWdpdGhzdGh5cGhlbkh5cGhlbmlkY0lEX0NvbnRpbnVlaWRjb250aW51ZWlkZW9JZGVvZ3JhcGhpY2lkZW9ncmFwaGljaWRzSURfU3RhcnRpZHNiSURTX0JpbmFyeV9PcGVyYXRvcmlkc2JpbmFyeW9wZXJhdG9yaWRzdElEU19UcmluYXJ5X09wZXJhdG9yaWRzdGFydGlkc3RyaW5hcnlvcGVyYXRvcmluZGljcG9zaXRpb25hbGNhdGVnb3J5SW5kaWNfUG9zaXRpb25hbF9DYXRlZ29yeWluZGljc3lsbGFiaWNjYXRlZ29yeUluZGljX1N5bGxhYmljX0NhdGVnb3J5aW5wY2luc2Npc2NJU09fQ29tbWVudGphbW9zaG9ydG5hbWVKYW1vX1Nob3J0X05hbWVqZ0pvaW5pbmdfR3JvdXBqb2luY0pvaW5fQ29udHJvbGpvaW5jb250cm9sam9pbmluZ2dyb3Vwam9pbmluZ3R5cGVKb2luaW5nX1R5cGVqc25qdGthY2NvdW50aW5nbnVtZXJpY2tjb21wYXRpYmlsaXR5dmFyaWFudGtpaWNvcmVraXJnZ3NvdXJjZWtpcmdoc291cmNla2lyZ2pzb3VyY2VraXJna3Bzb3VyY2VraXJna3NvdXJjZWtpcmdtc291cmNla2lyZ3Nzb3VyY2VraXJndHNvdXJjZWtpcmd1a3NvdXJjZWtpcmd1c291cmNla2lyZ3Zzb3VyY2Vrb3RoZXJudW1lcmlja3ByaW1hcnludW1lcmlja3JzdW5pY29kZWxiTGluZV9CcmVha0xvd2VyY2FzZV9NYXBwaW5nbGluZWJyZWFrbG9lTG9naWNhbF9PcmRlcl9FeGNlcHRpb25sb2dpY2Fsb3JkZXJleGNlcHRpb25Mb3dlcmNhc2Vsb3dlcmNhc2Vsb3dlcmNhc2VtYXBwaW5nbWF0aE1hdGhuYU5hbWVuYTFVbmljb2RlXzFfTmFtZW5hbWVhbGlhc05hbWVfQWxpYXNuY2hhck5vbmNoYXJhY3Rlcl9Db2RlX1BvaW50bmZjcWNORkNfUXVpY2tfQ2hlY2tuZmNxdWlja2NoZWNrbmZkcWNORkRfUXVpY2tfQ2hlY2tuZmRxdWlja2NoZWNrbmZrY2Nhc2Vmb2xkTkZLQ19DYXNlZm9sZG5ma2NjZm5ma2NxY05GS0NfUXVpY2tfQ2hlY2tuZmtjcXVpY2tjaGVja25ma2RxY05GS0RfUXVpY2tfQ2hlY2tuZmtkcXVpY2tjaGVja25vbmNoYXJhY3RlcmNvZGVwb2ludG50TnVtZXJpY19UeXBlbnVtZXJpY3R5cGVudW1lcmljdmFsdWVOdW1lcmljX1ZhbHVlbnZvYWxwaGFPdGhlcl9BbHBoYWJldGljb2NvbW1lbnRvZGlPdGhlcl9EZWZhdWx0X0lnbm9yYWJsZV9Db2RlX1BvaW50b2dyZXh0T3RoZXJfR3JhcGhlbWVfRXh0ZW5kb2lkY090aGVyX0lEX0NvbnRpbnVlb2lkc090aGVyX0lEX1N0YXJ0b2xvd2VyT3RoZXJfTG93ZXJjYXNlb21hdGhPdGhlcl9NYXRob3RoZXJhbHBoYWJldGljb3RoZXJkZWZhdWx0aWdub3JhYmxlY29kZXBvaW50b3RoZXJncmFwaGVtZWV4dGVuZG90aGVyaWRjb250aW51ZW90aGVyaWRzdGFydG90aGVybG93ZXJjYXNlb3RoZXJtYXRob3RoZXJ1cHBlcmNhc2VPdGhlcl9VcHBlcmNhc2VvdXBwZXJwYXRzeW5QYXR0ZXJuX1N5bnRheHBhdHRlcm5zeW50YXhwYXR0ZXJud2hpdGVzcGFjZVBhdHRlcm5fV2hpdGVfU3BhY2VwYXR3c3BjbVByZXBlbmRlZF9Db25jYXRlbmF0aW9uX01hcmtwcmVwZW5kZWRjb25jYXRlbmF0aW9ubWFya3FtYXJrUXVvdGF0aW9uX01hcmtxdW90YXRpb25tYXJrcmFkaWNhbFJhZGljYWxyZWdpb25hbGluZGljYXRvclJlZ2lvbmFsX0luZGljYXRvcnJpc2JzY2ZTaW1wbGVfQ2FzZV9Gb2xkaW5nc2NyaXB0ZXh0ZW5zaW9uc3NjeHNkU29mdF9Eb3R0ZWRzZW50ZW5jZWJyZWFrc2VudGVuY2V0ZXJtaW5hbFNlbnRlbmNlX1Rlcm1pbmFsc2Zjc2ltcGxlY2FzZWZvbGRpbmdzaW1wbGVsb3dlcmNhc2VtYXBwaW5nU2ltcGxlX0xvd2VyY2FzZV9NYXBwaW5nc2ltcGxldGl0bGVjYXNlbWFwcGluZ1NpbXBsZV9UaXRsZWNhc2VfTWFwcGluZ3NpbXBsZXVwcGVyY2FzZW1hcHBpbmdTaW1wbGVfVXBwZXJjYXNlX01hcHBpbmdzbGNzb2Z0ZG90dGVkV2hpdGVfU3BhY2VzdGNzdGVybXN1Y3RjVGl0bGVjYXNlX01hcHBpbmd0ZXJtVGVybWluYWxfUHVuY3R1YXRpb250ZXJtaW5hbHB1bmN0dWF0aW9udGl0bGVjYXNlbWFwcGluZ3VjVXBwZXJjYXNlX01hcHBpbmd1aWRlb1VuaWZpZWRfSWRlb2dyYXBodW5pY29k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AABIVyIABAAAAL5XIgADAAAAT1ciAAQAAADBVyIAAwAAAFZXIgAEAAAAxFciAAMAAABdVyIABAAAAGNhc2VkbGV0dGVyQ2FzZWRfTGV0dGVyY2NDb250cm9sRm9ybWF0Y2xvc2VwdW5jdHVhdGlvbkNsb3NlX1B1bmN0dWF0aW9uY25jb1ByaXZhdGVfVXNlY29tYmluaW5nbWFya2Nvbm5lY3RvcnB1bmN0dWF0aW9uQ29ubmVjdG9yX1B1bmN0dWF0aW9uY29udHJvbGNzU3Vycm9nYXRlY3VycmVuY3lzeW1ib2xDdXJyZW5jeV9TeW1ib2xkYXNocHVuY3R1YXRpb25EYXNoX1B1bmN0dWF0aW9uZGVjaW1hbG51bWJlckRlY2ltYWxfTnVtYmVyZW5jbG9zaW5nbWFya0VuY2xvc2luZ19NYXJrZmluYWxwdW5jdHVhdGlvbkZpbmFsX1B1bmN0dWF0aW9uZm9ybWF0aW5pdGlhbHB1bmN0dWF0aW9uSW5pdGlhbF9QdW5jdHVhdGlvbkxldHRlcmxldHRlcmxldHRlcm51bWJlckxldHRlcl9OdW1iZXJsaW5lc2VwYXJhdG9yTGluZV9TZXBhcmF0b3JsbExvd2VyY2FzZV9MZXR0ZXJsbU1vZGlmaWVyX0xldHRlcmxvT3RoZXJfTGV0dGVybG93ZXJjYXNlbGV0dGVyVGl0bGVjYXNlX0xldHRlcmx1VXBwZXJjYXNlX0xldHRlcm1hcmttYXRoc3ltYm9sTWF0aF9TeW1ib2xtY1NwYWNpbmdfTWFya21lbW5Ob25zcGFjaW5nX01hcmttb2RpZmllcmxldHRlcm1vZGlmaWVyc3ltYm9sTW9kaWZpZXJfU3ltYm9sbmRubG5vT3RoZXJfTnVtYmVybm9uc3BhY2luZ21hcmtvcGVucHVuY3R1YXRpb25PcGVuX1B1bmN0dWF0aW9ub3RoZXJvdGhlcmxldHRlcm90aGVybnVtYmVyb3RoZXJwdW5jdHVhdGlvbk90aGVyX1B1bmN0dWF0aW9ub3RoZXJzeW1ib2xPdGhlcl9TeW1ib2xQdW5jdHVhdGlvbnBhcmFncmFwaHNlcGFyYXRvclBhcmFncmFwaF9TZXBhcmF0b3JwY3BkcGVwZnBvcHJpdmF0ZXVzZXBzcHVuY3R1YXRpb25zZXBh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IgADAAAAql0iAAUAAAC+FiYABQAAACxkIgACAAAALmQiAAcAAAA1ZCIABwAAAC5kIgAHAAAA7UMiABEAAAD+QyIAEgAAABBEIgACAAAA/kMiABIAAABiXiIAAgAAADxkIgALAAAAg14iAAsAAAA8ZCIACwAAAEdkIgABAAAASGQiAAEAAABJZCIAAQAAAEpkIgABAAAAS2QiAAIAAAC+FiYABQAAAGlxJgADAAAATWQiAAMAAABhZGxhbUFkbGFtYWRsbWFnaGJDYXVjYXNpYW5fQWxiYW5pYW5haG9tQWhvbWFuYXRvbGlhbmhpZXJvZ2x5cGhzQW5hdG9saWFuX0hpZXJvZ2x5cGhzYXJhYkFyYWJpY2FyYWJpY2FybWVuaWFuQXJtZW5pYW5hcm1pSW1wZXJpYWxfQXJhbWFpY2FybW5hdmVzdGFuQXZlc3RhbmF2c3RiYWxpQmFsaW5lc2ViYWxpbmVzZWJhbXVCYW11bWJhbXVtYmFzc0Jhc3NhX1ZhaGJhc3NhdmFoYmF0YWtCYXRha2JhdGtiZW5nQmVuZ2FsaWJlbmdhbGliaGFpa3N1a2lCaGFpa3N1a2liaGtzYm9wb0JvcG9tb2ZvYm9wb21vZm9icmFoQnJhaG1pYnJhaG1pYnJhaUJyYWlsbGVicmFpbGxlYnVnaUJ1Z2luZXNlYnVnaW5lc2VidWhkQnVoaWRidWhpZGNha21DaGFrbWFjYW5hZGlhbmFib3JpZ2luYWxDYW5hZGlhbl9BYm9yaWdpbmFsY2Fuc2NhcmlDYXJpYW5jYXJpYW5jYXVjYXNpYW5hbGJhbmlhbmNoYWttYWNoYW1DaGFtY2hlckNoZXJva2VlY2hlcm9rZWVjaG9yYXNtaWFuQ2hvcmFzbWlhbmNocnNjb21tb25Db21tb25jb3B0Q29wdGljY29wdGljY3BtbkN5cHJvX01pbm9hbmNwcnRDeXByaW90Y3VuZWlmb3JtQ3VuZWlmb3JtY3lwcmlvdGN5cHJvbWlub2FuY3lyaWxsaWNDeXJpbGxpY2N5cmxkZXNlcmV0RGVzZXJldGRldmFEZXZhbmFnYXJpZGV2YW5hZ2FyaWRpYWtEaXZlc19Ba3VydWRpdmVzYWt1cnVkb2dyRG9ncmFkb2dyYWRzcnRkdXBsRHVwbG95YW5kdXBsb3lhbmVneXBFZ3lwdGlhbl9IaWVyb2dseXBoc2VneXB0aWFuaGllcm9nbHlwaHNlbGJhRWxiYXNhbmVsYmFzYW5lbHltRWx5bWFpY2VseW1haWNldGhpRXRoaW9waWNldGhpb3BpY2dlb3JHZW9yZ2lhbmdlb3JnaWFuZ2xhZ0dsYWdvbGl0aWNnbGFnb2xpdGljZ29uZ0d1bmphbGFfR29uZGlnb25tTWFzYXJhbV9Hb25kaWdvdGhHb3RoaWNnb3RoaWNncmFuR3JhbnRoYWdyYW50aGFncmVla0dyZWVrZ3Jla2d1amFyYXRpR3VqYXJhdGlndWpyZ3VuamFsYWdvbmRpZ3VybXVraGlHdXJtdWtoaWd1cnVoYW5IYW5oYW5nSGFuZ3VsaGFuZ3VsaGFuaWhhbmlmaXJvaGluZ3lhSGFuaWZpX1JvaGluZ3lhaGFub0hhbnVub29oYW51bm9vaGF0ckhhdHJhbmhhdHJhbmhlYnJIZWJyZXdoZWJyZXdoaXJhSGlyYWdhbmFoaXJhZ2FuYWhsdXdobW5nUGFoYXdoX0htb25naG1ucE55aWFrZW5nX1B1YWNodWVfSG1vbmdocmt0S2F0YWthbmFfT3JfSGlyYWdhbmFodW5nT2xkX0h1bmdhcmlhbmltcGVyaWFsYXJhbWFpY2luaGVyaXRlZEluaGVyaXRlZGluc2NyaXB0aW9uYWxwYWhsYXZpSW5zY3JpcHRpb25hbF9QYWhsYXZpaW5zY3JpcHRpb25hbHBhcnRoaWFuSW5zY3JpcHRpb25hbF9QYXJ0aGlhbml0YWxPbGRfSXRhbGljamF2YUphdmFuZXNlamF2YW5lc2VrYWl0aGlLYWl0aGlrYWxpS2F5YWhfTGlrYW5hS2F0YWthbmFrYW5uYWRhS2FubmFkYWthdGFrYW5ha2F0YWthbmFvcmhpcmFnYW5ha2F3aUthd2lrYXlhaGxpa2hhcktoYXJvc2h0aGlraGFyb3NodGhpa2hpdGFuc21hbGxzY3JpcHRLaGl0YW5fU21hbGxfU2NyaXB0a2htZXJLaG1lcmtobXJraG9qS2hvamtpa2hvamtpa2h1ZGF3YWRpS2h1ZGF3YWRpa2l0c2tuZGFrdGhpbGFuYVRhaV9UaGFtbGFvTGFvbGFvb2xhdGluTGF0aW5sYXRubGVwY0xlcGNoYWxlcGNoYWxpbWJMaW1idWxpbWJ1bGluYUxpbmVhcl9BbGluYkxpbmVhcl9CbGluZWFyYWxpbmVhcmJsaXN1TGlzdWx5Y2lMeWNpYW5seWNpYW5seWRpTHlkaWFubHlkaWFubWFoYWphbmlNYWhhamFuaW1haGptYWthTWFrYXNhcm1ha2FzYXJtYWxheWFsYW1NYWxheWFsYW1tYW5kTWFuZGFpY21hbmRhaWNtYW5pTWFuaWNoYWVhbm1hbmljaGFlYW5tYXJjTWFyY2hlbm1hcmNoZW5tYXNhcmFtZ29uZGltZWRlZmFpZHJpbk1lZGVmYWlkcmlubWVkZm1lZXRlaW1heWVrTWVldGVpX01heWVrbWVuZE1lbmRlX0tpa2FrdWltZW5kZWtpa2FrdWltZXJjTWVyb2l0aWNfQ3Vyc2l2ZW1lcm9NZXJvaXRpY19IaWVyb2dseXBoc21lcm9pdGljY3Vyc2l2ZW1lcm9pdGljaGllcm9nbHlwaHNtaWFvTWlhb21seW1tb2RpTW9kaW1vbmdNb25nb2xpYW5tb25nb2xpYW5tcm9Ncm9tcm9vbXRlaW11bHRNdWx0YW5pbXVsdGFuaW15YW5tYXJNeWFubWFybXltcm5hYmF0YWVhbk5hYmF0YWVhbm5hZ21OYWdfTXVuZGFyaW5hZ211bmRhcmluYW5kTmFuZGluYWdhcmluYW5kaW5hZ2FyaW5hcmJPbGRfTm9ydGhfQXJhYmlhbm5iYXRuZXdhTmV3YW5ld3RhaWx1ZU5ld19UYWlfTHVlbmtvTmtvbmtvb25zaHVOdXNodW51c2h1bnlpYWtlbmdwdWFjaHVlaG1vbmdvZ2FtT2doYW1vZ2hhbW9sY2hpa2lPbF9DaGlraW9sY2tvbGRodW5nYXJpYW5vbGRpdGFsaWNvbGRub3J0aGFyYWJpYW5vbGRwZXJtaWNPbGRfUGVybWljb2xkcGVyc2lhbk9sZF9QZXJzaWFub2xkc29nZGlhbk9sZF9Tb2dkaWFub2xkc291dGhhcmFiaWFuT2xkX1NvdXRoX0FyYWJpYW5vbGR0dXJraWNPbGRfVHVya2ljb2xkdXlnaHVyT2xkX1V5Z2h1cm9yaXlhT3JpeWFvcmtob3J5YW9zYWdlT3NhZ2Vvc2dlb3NtYU9zbWFueWFvc21hbnlhb3VncnBhaGF3aGhtb25ncGFsbVBhbG15cmVuZXBhbG15cmVuZXBhdWNQYXVfQ2luX0hhdXBhdWNpbmhhdXBlcm1waGFnUGhhZ3NfUGFwaGFnc3BhcGhsaXBobHBQc2FsdGVyX1BhaGxhdmlwaG54UGhvZW5pY2lhbnBob2VuaWNpYW5wbHJkcHJ0aXBzYWx0ZXJwYWhsYXZpcWFhY3FhYWlyZWphbmdSZWphbmdyam5ncm9oZ3J1bmljUnVuaWNydW5yc2FtYXJpdGFuU2FtYXJpdGFuc2FtcnNhcmJzYXVyU2F1cmFzaHRyYXNhdXJhc2h0cmFzZ253U2lnbldyaXRpbmdzaGFyYWRhU2hhcmFkYXNoYXZpYW5TaGF2aWFuc2hhd3NocmRzaWRkU2lkZGhhbXNpZGRoYW1zaWdud3JpdGluZ3NpbmRzaW5oU2luaGFsYXNpbmhhbGFzb2dkU29nZGlhbnNvZ2RpYW5zb2dvc29yYVNvcmFfU29tcGVuZ3NvcmFzb21wZW5nc295b1NveW9tYm9zb3lvbWJvc3VuZFN1bmRhbmVzZXN1bmRhbmVzZXN5bG9TeWxvdGlfTmFncmlzeWxvdGluYWdyaXN5cmNTeXJpYWNzeXJpYWN0YWdhbG9nVGFnYWxvZ3RhZ2JUYWdiYW53YXRhZ2JhbndhdGFpbGVUYWlfTGV0YWl0aGFtdGFpdmlldFRhaV9WaWV0dGFrclRha3JpdGFrcml0YWxldGFsdXRhbWlsVGFtaWx0YW1sdGFuZ1Rhbmd1dHRhbmdzYVRhbmdzYXRhbmd1dHRhdnR0ZWx1VGVsdWd1dGVsdWd1dGZuZ1RpZmluYWdodGdsZ3RoYWFUaGFhbmF0aGFhbmF0aGFpVGhhaXRpYmV0YW5UaWJldGFudGlidHRpZmluYWdodGlyaFRpcmh1dGF0aXJodXRhdG5zYXRvdG9Ub3RvdWdhclVnYXJpdGljdWdhcml0aWN2YWlWYWl2YWlpdml0aFZpdGhrdXFpdml0aGt1cWl3YW5jaG9XYW5jaG93YXJhV2FyYW5nX0NpdGl3YXJhbmdjaXRpd2Nob3hwZW94c3V4eWV6aVllemlkaXllemlkaXlpWWl5aWlpemFuYWJhemFyc3F1YXJlWmFuYWJhemFyX1NxdWFyZXphbmJ6aW5oenl5eXp6enoAAAAQZiIABQAAABVmIgAFAAAAGmYiAAQA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IgAEAAAAi20iABAAAACbbSIABAAAAJ9tIgAUAAAAs20iAA8AAACLbSIAEAAAAMJtIgATAAAAn20iABQAAADVbSIABAAAANltIgAEAAAA3W0iAAQAAADobCIACQAAAOFtIgAEAAAA5W0iAAQAAADpbSIABAAAAO1tIgAJAAAA9m0iAAkAAADtbSIACQAAAP9tIgADAAAAAm4iAAMAAAAFbiIABAAAAAJuIgADAAAACW4iAAQAAABebSIADAAAAA1uIgAEAAAAEW4iAAcAAAAYbiIABwAAABFuIgAHAAAAH24iAAcAAAAmbiIABwAAAC1uIgAEAAAAJm4iAAcAAAAxbiIACQAAADpuIgAJAAAAQ24iAAQAAABHbiIACwAAAFJuIgAKAAAAR24iAAsAAABcbiIABAAAAGBuIgALAAAAa24iAAsAAABgbiIACwAAAHZuIgAEAAAAem4iABEAAACLbiIABAAAADpuIgAJAAAAj24iAAQAAACTbiIABAAAAJduIgAJAAAAoG4iAAsAAACrbiIAAwAAAK5uIgADAAAAsW4iAAQAAACubiIAAwAAALVuIgAEAAAAuW4iAAUAAAC+biIABQAAALluIgAFAAAAw24iABQAAACAaiIAFgAAANduIgAEAAAA224iAAUAAADgbiIABQAAANtuIgAFAAAA5W4iAAcAAADsbiIACAAAAPRuIgAEAAAA7G4iAAgAAAD4biIADAAAALJqIgANAAAABG8iAAkAAAA4ayIACgAAAA1vIgAPAAAAem4iABEAAAAcbyIACQAAACVvIgAKAAAAL28iAAoAAAA5byIACwAAAERvIgAKAAAATm8iAAsAAABZbyIADwAAAGhvIgARAAAAeW8iAAkAAACCbyIACgAAAIxvIgAJAAAAlW8iAAoAAACfbyIABQAAAKRvIgAFAAAAqW8iAAQAAACCbyIACgAAAK1vIgAEAAAApG8iAAUAAACxbyIABQAAALZvIgAFAAAAu28iAAQAAAC2byIABQAAAL9vIgAEAAAAw28iAAcAAADKbyIABwAAAMNvIgAHAAAA0W8iAAQAAACVbyIACgAAANVvIgALAAAAcGoiAAwAAADgbyIABAAAAORvIgAJAAAA7W8iAAkAAADkbyIACQAAAPZvIgAEAAAA+m8iAAsAAAAFcCIACQAAAPpvIgALAAAADnAiAAQA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AADPHgAAzx4AANEeAADRHgAA0x4AANMeAADVHgAA1R4AANceAADXHgAA2R4AANkeAADbHgAA2x4AAN0eAADdHgAA3x4AAN8eAADhHgAA4R4AAOMeAADjHgAA5R4AAOUeAADnHgAA5x4AAOkeAADpHgAA6x4AAOseAADtHgAA7R4AAO8eAADvHgAA8R4AAPEeAADzHgAA8x4AAPUeAAD1HgAA9x4AAPceAAD5HgAA+R4AAPseAAD7HgAA/R4AAP0eAAD/HgAABx8AABAfAAAVHwAAIB8AACcfAAAwHwAANx8AAEAfAABFHwAAUB8AAFcfAABgHwAAZx8AAHAfAAB9HwAAgB8AAIcfAACQHwAAlx8AAKAfAACnHwAAsB8AALQfAAC2HwAAtx8AAL4fAAC+HwAAwh8AAMQfAADGHwAAxx8AANAfAADTHwAA1h8AANcfAADgHwAA5x8AAPIfAAD0HwAA9h8AAPcfAAAKIQAACiEAAA4hAAAPIQAAEyEAABMhAAAvIQAALyEAADQhAAA0IQAAOSEAADkhAAA8IQAAPSEAAEYhAABJIQAATiEAAE4hAACEIQAAhCEAADAsAABfLAAAYSwAAGEsAABlLAAAZiwAAGgsAABoLAAAaiwAAGosAABsLAAAbCwAAHEsAABxLAAAcywAAHQsAAB2LAAAeywAAIEsAACBLAAAgywAAIMsAACFLAAAhSwAAIcsAACHLAAAiSwAAIksAACLLAAAiywAAI0sAACNLAAAjywAAI8sAACRLAAAkSwAAJMsAACTLAAAlSwAAJUsAACXLAAAlywAAJksAACZLAAAmywAAJssAACdLAAAnSwAAJ8sAACfLAAAoSwAAKEsAACjLAAAoywAAKUsAAClLAAApywAAKcsAACpLAAAqSwAAKssAACrLAAArSwAAK0sAACvLAAArywAALEsAACxLAAAsywAALMsAAC1LAAAtSwAALcsAAC3LAAAuSwAALksAAC7LAAAuywAAL0sAAC9LAAAvywAAL8sAADBLAAAwSwAAMMsAADDLAAAxSwAAMUsAADHLAAAxywAAMksAADJLAAAyywAAMssAADNLAAAzSwAAM8sAADPLAAA0SwAANEsAADTLAAA0ywAANUsAADVLAAA1ywAANcsAADZLAAA2SwAANssAADbLAAA3SwAAN0sAADfLAAA3ywAAOEsAADhLAAA4ywAAOQsAADsLAAA7CwAAO4sAADuLAAA8ywAAPMsAAAALQAAJS0AACctAAAnLQAALS0AAC0tAABBpgAAQaYAAEOmAABDpgAARaYAAEWmAABHpgAAR6YAAEmmAABJpgAAS6YAAEumAABNpgAATaYAAE+mAABPpgAAUaYAAFGmAABTpgAAU6YAAFWmAABVpgAAV6YAAFemAABZpgAAWaYAAFumAABbpgAAXaYAAF2mAABfpgAAX6YAAGGmAABhpgAAY6YAAGOmAABlpgAAZaYAAGemAABnpgAAaaYAAGmmAABrpgAAa6YAAG2mAABtpgAAgaYAAIGmAACDpgAAg6YAAIWmAACFpgAAh6YAAIemAACJpgAAiaYAAIumAACLpgAAjaYAAI2mAACPpgAAj6YAAJGmAACRpgAAk6YAAJOmAACVpgAAlaYAAJemAACXpgAAmaYAAJmmAACbpgAAm6YAACOnAAAjpwAAJacAACWnAAAnpwAAJ6cAACmnAAAppwAAK6cAACunAAAtpwAALacAAC+nAAAxpwAAM6cAADOnAAA1pwAANacAADenAAA3pwAAOacAADmnAAA7pwAAO6cAAD2nAAA9pwAAP6cAAD+nAABBpwAAQacAAEOnAABDpwAARacAAEWnAABHpwAAR6cAAEmnAABJpwAAS6cAAEunAABNpwAATacAAE+nAABPpwAAUacAAFGnAABTpwAAU6cAAFWnAABVpwAAV6cAAFenAABZpwAAWacAAFunAABbpwAAXacAAF2nAABfpwAAX6cAAGGnAABhpwAAY6cAAGOnAABlpwAAZacAAGenAABnpwAAaacAAGmnAABrpwAAa6cAAG2nAABtpwAAb6cAAG+nAABxpwAAeKcAAHqnAAB6pwAAfKcAAHynAAB/pwAAf6cAAIGnAACBpwAAg6cAAIOnAACFpwAAhacAAIenAACHpwAAjKcAAIynAACOpwAAjqcAAJGnAACRpwAAk6cAAJWnAACXpwAAl6cAAJmnAACZpwAAm6cAAJunAACdpwAAnacAAJ+nAACfpwAAoacAAKGnAACjpwAAo6cAAKWnAAClpwAAp6cAAKenAACppwAAqacAAK+nAACvpwAAtacAALWnAAC3pwAAt6cAALmnAAC5pwAAu6cAALunAAC9pwAAvacAAL+nAAC/pwAAwacAAMGn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AAD6HgAA+h4AAPweAAD8HgAA/h4AAP4eAAAIHwAADx8AABgfAAAdHwAAKB8AAC8fAAA4HwAAPx8AAEgfAABNHwAAWR8AAFkfAABbHwAAWx8AAF0fAABdHwAAXx8AAF8fAABoHwAAbx8AALgfAAC7HwAAyB8AAMsfAADYHwAA2x8AAOgfAADsHwAA+B8AAPsfAAACIQAAAiEAAAchAAAHIQAACyEAAA0hAAAQIQAAEiEAABUhAAAVIQAAGSEAAB0hAAAkIQAAJCEAACYhAAAmIQAAKCEAACghAAAqIQAALSEAADAhAAAzIQAAPiEAAD8hAABFIQAARSEAAIMhAACDIQAAACwAAC8sAABgLAAAYCwAAGIsAABkLAAAZywAAGcsAABpLAAAaSwAAGssAABrLAAAbSwAAHAsAAByLAAAciwAAHUsAAB1LAAAfiwAAIAsAACCLAAAgiwAAIQsAACELAAAhiwAAIYsAACILAAAiCwAAIosAACKLAAAjCwAAIwsAACOLAAAjiwAAJAsAACQLAAAkiwAAJIsAACULAAAlCwAAJYsAACWLAAAmCwAAJgsAACaLAAAmiwAAJwsAACcLAAAniwAAJ4sAACgLAAAoCwAAKIsAACiLAAApCwAAKQsAACmLAAApiwAAKgsAACoLAAAqiwAAKosAACsLAAArCwAAK4sAACuLAAAsCwAALAsAACyLAAAsiwAALQsAAC0LAAAtiwAALYsAAC4LAAAuCwAALosAAC6LAAAvCwAALwsAAC+LAAAviwAAMAsAADALAAAwiwAAMIsAADELAAAxCwAAMYsAADGLAAAyCwAAMgsAADKLAAAyiwAAMwsAADMLAAAziwAAM4sAADQLAAA0CwAANIsAADSLAAA1CwAANQsAADWLAAA1iwAANgsAADYLAAA2iwAANosAADcLAAA3CwAAN4sAADeLAAA4CwAAOAsAADiLAAA4iwAAOssAADrLAAA7SwAAO0sAADyLAAA8iwAAECmAABApgAAQqYAAEKmAABEpgAARKYAAEamAABGpgAASKYAAEimAABKpgAASqYAAEymAABMpgAATqYAAE6mAABQpgAAUKYAAFKmAABSpgAAVKYAAFSmAABWpgAAVqYAAFimAABYpgAAWqYAAFqmAABcpgAAXKYAAF6mAABepgAAYKYAAGCmAABipgAAYqYAAGSmAABkpgAAZqYAAGamAABopgAAaKYAAGqmAABqpgAAbKYAAGymAACApgAAgKYAAIKmAACCpgAAhKYAAISmAACGpgAAhqYAAIimAACIpgAAiqYAAIqmAACMpgAAjKYAAI6mAACOpgAAkKYAAJCmAACSpgAAkqYAAJSmAACUpgAAlqYAAJamAACYpgAAmKYAAJqmAACapgAAIqcAACKnAAAkpwAAJKcAACanAAAmpwAAKKcAACinAAAqpwAAKqcAACynAAAspwAALqcAAC6nAAAypwAAMqcAADSnAAA0pwAANqcAADanAAA4pwAAOKcAADqnAAA6pwAAPKcAADynAAA+pwAAPqcAAECnAABApwAAQqcAAEKnAABEpwAARKcAAEanAABGpwAASKcAAEinAABKpwAASqcAAEynAABMpwAATqcAAE6nAABQpwAAUKcAAFKnAABSpwAAVKcAAFSnAABWpwAAVqcAAFinAABYpwAAWqcAAFqnAABcpwAAXKcAAF6nAABepwAAYKcAAGCnAABipwAAYqcAAGSnAABkpwAAZqcAAGanAABopwAAaKcAAGqnAABqpwAAbKcAAGynAABupwAAbqcAAHmnAAB5pwAAe6cAAHunAAB9pwAAfqcAAICnAACApwAAgqcAAIKnAACEpwAAhKcAAIanAACGpwAAi6cAAIunAACNpwAAjacAAJCnAACQpwAAkqcAAJKnAACWpwAAlqcAAJinAACYpwAAmqcAAJqnAACcpwAAnKcAAJ6nAACepwAAoKcAAKCnAACipwAAoqcAAKSnAACkpwAApqcAAKanAACopwAAqKcAAKqnAACupwAAsKcAALSnAAC2pwAAtqcAALinAAC4pwAAuqcAALqnAAC8pwAAvKcAAL6nAAC+pwAAwKcAAMCnAADCpwAAwqcAAMSnAADHpwAAyacAAMmnAADQpwAA0KcAANanAADWpwAA2KcAANinAAD1pwAA9acAACH/AAA6/wAAAAQBACcEAQCwBAEA0wQBAHAFAQB6BQEAfAUBAIoFAQCMBQEAkgUBAJQFAQCVBQEAgAwBALIMAQCgGAEAvxgBAEBuAQBfbgEAANQBABnUAQA01AEATdQBAGjUAQCB1AEAnNQBAJzUAQCe1AEAn9QBAKLUAQCi1AEApdQBAKbUAQCp1AEArNQBAK7UAQC11AEA0NQBAOnU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IwADAAAAEW4iAAcAAACgoyMABQAAACZuIgAHAAAAyKMjAAMAAAA6biIACQAAAOCjIwACAAAAR24iAAsAAADwoyMAAQAAAGBuIgALAAAA+KMjAAMAAACgbiIACwAAABCkIwAEAAAAk24iAAQAAAAwpCMAAgAAAK5uIgADAAAAQKQjAAIAAAC5biIABQAAAFCkIwACAAAAgGoiABYAAABgpCMABAAAANtuIgAFAAAAgKQjAAEAAADsbiIACAAAAIikIwABAAAAsmoiAA0AAACQpCMAAwAAADhrIgAKAAAAqKQjAAIAAAB6biIAEQAAALikIwABAAAAJW8iAAoAAADApCMAAQAAADlvIgALAAAAyKQjAAIAAABObyIACwAAANikIwABAAAAaG8iABEAAADgpCMAAQAAAIJvIgAKAAAA6KQjAAEAAACVbyIACgAAAPCkIwABAAAApG8iAAUAAAD4pCMADgAAALZvIgAFAAAAaKUjAAIAAADDbyIABwAAAHilIwACAAAAcGoiAAwAAACIpSMABQAAAORvIgAJAAAAsKUjAAEAAAD6byIACwAAALilIwABAAAAFnAiAAgAAADApSMAAQAAAEBwIgAKAAAAyKUjAAIAAAAtcCIADwAAANilIwADAAAAeHAiAAYAAADwpSMAAgAAAItwIgAFAAAAAKYjAAIAAACdcCIACQAAABCmIwACAAAAsnAiAAoAAAAgpiMAAgAAANxwIgAHAAAAMKYjAAEAAADqcCIABwAAADimIwABAAAA/XAiAAcAAABApiMAAgAAAMpwIgALAAAAUKYjAAMAAAAecSIABwAAAGimIwANAAAAMHEiAAcAAADQpiMAAQAAAEZxIgAMAAAA2KYjAAIAAABhcSIABwAAAOimIwABAAAAc3EiAAkAAADwpiMAAgAAAIlxIgAMAAAAAKcjAAEAAACkcSIABgAAAAinIwAEAAAAt3EiAAcAAAAopyMAAgAAAMJxIgAIAAAAOKcjAAMAAADXcSIABgAAAFCnIwACAAAALWwiAAgAAABgpyMABQAAAOtxIgAIAAAAiKcjAAIAAAD3cSIABQAAAJinIwACAAAADnIiAAUAAACopyMAEgAAACdyIgAGAAAAOKgjAAIAAAAbciIABgAAAEioIwAEAAAAO3IiAAYAAABoqCMADQAAAFtyIgAGAAAA0KgjAAEA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AQBRCQAAUgkAAGQJAABlCQAAAA0AAAwNAAAODQAAEA0AABINAABEDQAARg0AAEgNAABKDQAATw0AAFQNAABjDQAAZg0AAH8NAADaHAAA2hwAADCoAAAyqAAAQAYAAEAGAABACAAAWwgAAF4IAABeCAAAQAYAAEAGAADACgEA5goBAOsKAQD2CgEAZAkAAGUJAAAAHQEABh0BAAgdAQAJHQEACx0BADYdAQA6HQEAOh0BADwdAQA9HQEAPx0BAEcdAQBQHQEAWR0BADCoAAA5qAAAABYBAEQWAQBQFgEAWRYBAAAYAAAZGAAAIBgAAHgYAACAGAAAqhgAAC8gAAAvIAAAYBYBAGwWAQBmCgAAbwoAAIASAQCGEgEAiBIBAIgSAQCKEgEAjRIBAI8SAQCdEgEAnxIBAKkSAQAAEAAAnxAAAC6pAAAuqQAA4KkAAP6pAABgqgAAf6oAAGQJAABlCQAA5gwAAO8MAADpHAAA6RwAAPIcAADyHAAA+hwAAPocAAAwqAAANagAAKAZAQCnGQEAqhkBANcZAQDaGQEA5BkBAAwGAAAMBgAAGwYAABsGAAAfBgAAHwYAAMAHAAD6BwAA/QcAAP8HAAA+/QAAP/0AAIMEAACDBAAAUAMBAHoDAQBABgAAQAYAAPIKAQDyCgEAcA8BAIkPAQBRCQAAUgkAAGQJAABlCQAAAQsAAAMLAAAFCwAADAsAAA8LAAAQCwAAEwsAACgLAAAqCwAAMAsAADILAAAzCwAANQsAADkLAAA8CwAARAsAAEcLAABICwAASwsAAE0LAABVCwAAVwsAAFwLAABdCwAAXwsAAGMLAABmCwAAdwsAANocAADaHAAA8hwAAPIcAAACGAAAAxgAAAUYAAAFGAAAQKgAAHeoAABABgAAQAYAAIALAQCRCwEAmQsBAJwLAQCpCwEArwsBAFEJAABRCQAA1xwAANccAADZHAAA2RwAANwcAADdHAAA4BwAAOAcAACAEQEA3xEBAGQJAABlCQAAgQ0AAIMNAACFDQAAlg0AAJoNAACxDQAAsw0AALsNAAC9DQAAvQ0AAMANAADGDQAAyg0AAMoNAADPDQAA1A0AANYNAADWDQAA2A0AAN8NAADmDQAA7w0AAPINAAD0DQAA4REBAPQRAQBABgAAQAYAADAPAQBZDwEAZAkAAGUJAADmCQAA7wkAAACo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AADGHgAAyB4AAMgeAADKHgAAyh4AAMweAADMHgAAzh4AAM4eAADQHgAA0B4AANIeAADSHgAA1B4AANQeAADWHgAA1h4AANgeAADYHgAA2h4AANoeAADcHgAA3B4AAN4eAADeHgAA4B4AAOAeAADiHgAA4h4AAOQeAADkHgAA5h4AAOYeAADoHgAA6B4AAOoeAADqHgAA7B4AAOweAADuHgAA7h4AAPAeAADwHgAA8h4AAPIeAAD0HgAA9B4AAPYeAAD2HgAA+B4AAPgeAAD6HgAA+h4AAPweAAD8HgAA/h4AAP4eAAAIHwAADx8AABgfAAAdHwAAKB8AAC8fAAA4HwAAPx8AAEgfAABNHwAAWR8AAFkfAABbHwAAWx8AAF0fAABdHwAAXx8AAF8fAABoHwAAbx8AAIAfAACvHwAAsh8AALQfAAC3HwAAvB8AAMIfAADEHwAAxx8AAMwfAADYHwAA2x8AAOgfAADsHwAA8h8AAPQfAAD3HwAA/B8AACYhAAAmIQAAKiEAACshAAAyIQAAMiEAAGAhAABvIQAAgyEAAIMhAAC2JAAAzyQAAAAsAAAvLAAAYCwAAGAsAABiLAAAZCwAAGcsAABnLAAAaSwAAGksAABrLAAAaywAAG0sAABwLAAAciwAAHIsAAB1LAAAdSwAAH4sAACALAAAgiwAAIIsAACELAAAhCwAAIYsAACGLAAAiCwAAIgsAACKLAAAiiwAAIwsAACMLAAAjiwAAI4sAACQLAAAkCwAAJIsAACSLAAAlCwAAJQsAACWLAAAliwAAJgsAACYLAAAmiwAAJosAACcLAAAnCwAAJ4sAACeLAAAoCwAAKAsAACiLAAAoiwAAKQsAACkLAAApiwAAKYsAACoLAAAqCwAAKosAACqLAAArCwAAKwsAACuLAAAriwAALAsAACwLAAAsiwAALIsAAC0LAAAtCwAALYsAAC2LAAAuCwAALgsAAC6LAAAuiwAALwsAAC8LAAAviwAAL4sAADALAAAwCwAAMIsAADCLAAAxCwAAMQsAADGLAAAxiwAAMgsAADILAAAyiwAAMosAADMLAAAzCwAAM4sAADOLAAA0CwAANAsAADSLAAA0iwAANQsAADULAAA1iwAANYsAADYLAAA2CwAANosAADaLAAA3CwAANwsAADeLAAA3iwAAOAsAADgLAAA4iwAAOIsAADrLAAA6ywAAO0sAADtLAAA8iwAAPIsAABApgAAQKYAAEKmAABCpgAARKYAAESmAABGpgAARqYAAEimAABIpgAASqYAAEqmAABMpgAATKYAAE6mAABOpgAAUKYAAFCmAABSpgAAUqYAAFSmAABUpgAAVqYAAFamAABYpgAAWKYAAFqmAABapgAAXKYAAFymAABepgAAXqYAAGCmAABgpgAAYqYAAGKmAABkpgAAZKYAAGamAABmpgAAaKYAAGimAABqpgAAaqYAAGymAABspgAAgKYAAICmAACCpgAAgqYAAISmAACEpgAAhqYAAIamAACIpgAAiKYAAIqmAACKpgAAjKYAAIymAACOpgAAjqYAAJCmAACQpgAAkqYAAJKmAACUpgAAlKYAAJamAACWpgAAmKYAAJimAACapgAAmqYAACKnAAAipwAAJKcAACSnAAAmpwAAJqcAACinAAAopwAAKqcAACqnAAAspwAALKcAAC6nAAAupwAAMqcAADKnAAA0pwAANKcAADanAAA2pwAAOKcAADinAAA6pwAAOqcAADynAAA8pwAAPqcAAD6nAABApwAAQKcAAEKnAABCpwAARKcAAESnAABGpwAARqcAAEinAABIpwAASqcAAEqnAABMpwAATKcAAE6nAABOpwAAUKcAAFCnAABSpwAAUqcAAFSnAABUpwAAVqcAAFanAABYpwAAWKcAAFqnAABapwAAXKcAAFynAABepwAAXqcAAGCnAABgpwAAYqcAAGKnAABkpwAAZKcAAGanAABmpwAAaKcAAGinAABqpwAAaqcAAGynAABspwAAbqcAAG6nAAB5pwAAeacAAHunAAB7pwAAfacAAH6nAACApwAAgKcAAIKnAACCpwAAhKcAAISnAACGpwAAhqcAAIunAACLpwAAjacAAI2nAACQpwAAkKcAAJKnAACSpwAAlqcAAJanAACYpwAAmKcAAJqnAACapwAAnKcAAJynAACepwAAnqcAAKCnAACgpwAAoqcAAKKnAACkpwAApKcAAKanAACmpwAAqKcAAKinAACqpwAArqcAALCnAAC0pwAAtqcAALanAAC4pwAAuKcAALqnAAC6pwAAvKcAALynAAC+pwAAvqcAAMCnAADApwAAwqcAAMKnAADEpwAAx6cAAMmnAADJpwAA0KcAANCnAADWpwAA1qcAANin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AAA0HgAANh4AADYeAAA4HgAAOB4AADoeAAA6HgAAPB4AADweAAA+HgAAPh4AAEAeAABAHgAAQh4AAEIeAABEHgAARB4AAEYeAABGHgAASB4AAEgeAABKHgAASh4AAEweAABMHgAATh4AAE4eAABQHgAAUB4AAFIeAABSHgAAVB4AAFQeAABWHgAAVh4AAFgeAABYHgAAWh4AAFoeAABcHgAAXB4AAF4eAABeHgAAYB4AAGAeAABiHgAAYh4AAGQeAABkHgAAZh4AAGYeAABoHgAAaB4AAGoeAABqHgAAbB4AAGweAABuHgAAbh4AAHAeAABwHgAAch4AAHIeAAB0HgAAdB4AAHYeAAB2HgAAeB4AAHgeAAB6HgAAeh4AAHweAAB8HgAAfh4AAH4eAACAHgAAgB4AAIIeAACCHgAAhB4AAIQeAACGHgAAhh4AAIgeAACIHgAAih4AAIoeAACMHgAAjB4AAI4eAACOHgAAkB4AAJAeAACSHgAAkh4AAJQeAACUHgAAnh4AAJ4eAACgHgAAoB4AAKIeAACiHgAApB4AAKQeAACmHgAAph4AAKgeAACoHgAAqh4AAKoeAACsHgAArB4AAK4eAACuHgAAsB4AALAeAACyHgAAsh4AALQeAAC0HgAAth4AALYeAAC4HgAAuB4AALoeAAC6HgAAvB4AALweAAC+HgAAvh4AAMAeAADAHgAAwh4AAMIeAADEHgAAxB4AAMYeAADGHgAAyB4AAMgeAADKHgAAyh4AAMweAADMHgAAzh4AAM4eAADQHgAA0B4AANIeAADSHgAA1B4AANQeAADWHgAA1h4AANgeAADYHgAA2h4AANoeAADcHgAA3B4AAN4eAADeHgAA4B4AAOAeAADiHgAA4h4AAOQeAADkHgAA5h4AAOYeAADoHgAA6B4AAOoeAADqHgAA7B4AAOweAADuHgAA7h4AAPAeAADwHgAA8h4AAPIeAAD0HgAA9B4AAPYeAAD2HgAA+B4AAPgeAAD6HgAA+h4AAPweAAD8HgAA/h4AAP4eAAAIHwAADx8AABgfAAAdHwAAKB8AAC8fAAA4HwAAPx8AAEgfAABNHwAAWR8AAFkfAABbHwAAWx8AAF0fAABdHwAAXx8AAF8fAABoHwAAbx8AAIgfAACPHwAAmB8AAJ8fAACoHwAArx8AALgfAAC8HwAAyB8AAMwfAADYHwAA2x8AAOgfAADsHwAA+B8AAPwfAAAmIQAAJiEAACohAAArIQAAMiEAADIhAABgIQAAbyEAAIMhAACDIQAAtiQAAM8kAAAALAAALywAAGAsAABgLAAAYiwAAGQsAABnLAAAZywAAGksAABpLAAAaywAAGssAABtLAAAcCwAAHIsAAByLAAAdSwAAHUsAAB+LAAAgCwAAIIsAACCLAAAhCwAAIQsAACGLAAAhiwAAIgsAACILAAAiiwAAIosAACMLAAAjCwAAI4sAACOLAAAkCwAAJAsAACSLAAAkiwAAJQsAACULAAAliwAAJYsAACYLAAAmCwAAJosAACaLAAAnCwAAJwsAACeLAAAniwAAKAsAACgLAAAoiwAAKIsAACkLAAApCwAAKYsAACmLAAAqCwAAKgsAACqLAAAqiwAAKwsAACsLAAAriwAAK4sAACwLAAAsCwAALIsAACyLAAAtCwAALQsAAC2LAAAtiwAALgsAAC4LAAAuiwAALosAAC8LAAAvCwAAL4sAAC+LAAAwCwAAMAsAADCLAAAwiwAAMQsAADELAAAxiwAAMYsAADILAAAyCwAAMosAADKLAAAzCwAAMwsAADOLAAAziwAANAsAADQLAAA0iwAANIsAADULAAA1CwAANYsAADWLAAA2CwAANgsAADaLAAA2iwAANwsAADcLAAA3iwAAN4sAADgLAAA4CwAAOIsAADiLAAA6ywAAOssAADtLAAA7SwAAPIsAADyLAAAQKYAAECmAABCpgAAQqYAAESmAABEpgAARqYAAEamAABIpgAASKYAAEqmAABKpgAATKYAAEymAABOpgAATqYAAFCmAABQpgAAUqYAAFKmAABUpgAAVKYAAFamAABWpgAAWKYAAFimAABapgAAWqYAAFymAABcpgAAXqYAAF6mAABgpgAAYKYAAGKmAABipgAAZKYAAGSmAABmpgAAZqYAAGimAABopgAAaqYAAGqmAABspgAAbKYAAICmAACApgAAgqYAAIKmAACEpgAAhKYAAIamAACGpgAAiKYAAIimAACKpgAAiqYAAIymAACMpgAAjqYAAI6mAACQpgAAkKYAAJKmAACSpgAAlKYAAJSmAACWpgAAlqYAAJimAACYpgAAmqYAAJqmAAAipwAAIqcAACSnAAAkpwAAJqcAACanAAAopwAAKKcAACqnAAAqpwAALKcAACynAAAupwAALqcAADKnAAAypwAANKcAADSnAAA2pwAANqcAADinAAA4pwAAOqcAADqnAAA8pwAAPKcAAD6nAAA+pwAAQKcAAECnAABCpwAAQqcAAESnAABEpwAARqcAAEanAABIpwAASKcAAEqnAABKpwAATKcAAEynAABOpwAATqcAAFCnAABQpwAAUqcAAFKnAABUpwAAVKcAAFanAABWpwAAWKcAAFinAABapwAAWqcAAFynAABcpwAAXqcAAF6nAABgpwAAYKcAAGKnAABipwAAZKcAAGSnAABmpwAAZqcAAGinAABopwAAaqcAAGqnAABspwAAbKcAAG6nAABupwAAeacAAHmnAAB7pwAAe6cAAH2nAAB+pwAAgKcAAICnAACCpwAAgqcAAISnAACEpwAAhqcAAIanAACLpwAAi6cAAI2nAACNpwAAkKcAAJCnAACSpwAAkqcAAJanAACWpwAAmKcAAJinAACapwAAmqcAAJynAACcpwAAnqcAAJ6nAACgpwAAoKcAAKKnAACipwAApKcAAKSnAACmpwAApqcAAKinAACopwAAqqcAAK6nAACwpwAAtKcAALanAAC2pwAAuKcAALinAAC6pwAAuqcAALynAAC8pwAAvqcAAL6nAADApwAAwKcAAMKnAADCpwAAxKcAAMenAADJpwAAyacAANCnAADQpwAA1qcAANanAADYpwAA2KcAAPWnAAD1pwAAIf8AADr/AAAABAEAJwQBALAEAQDTBAEAcAUBAHoFAQB8BQEAigUBAIwFAQCSBQEAlAUBAJUFAQCADAEAsgwBAKAYAQC/GAEAQG4BAF9uAQAA6QEAIekBAGEAAAB6AAAAtQAAALUAAADfAAAA9gAAAPgAAAD/AAAAAQEAAAEBAAADAQAAAwEAAAUBAAAFAQAABwEAAAcBAAAJAQAACQEAAAsBAAALAQAADQEAAA0BAAAPAQAADwEAABEBAAARAQAAEwEAABMBAAAVAQAAFQEAABcBAAAXAQAAGQEAABkBAAAbAQAAGwEAAB0BAAAdAQAAHwEAAB8BAAAhAQAAIQEAACMBAAAjAQAAJQEAACUBAAAnAQAAJwEAACkBAAApAQAAKwEAACsBAAAtAQAALQEAAC8BAAAvAQAAMQEAADEBAAAzAQAAMwEAADUBAAA1AQAANwEAADcB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AACnHgAAqR4AAKkeAACrHgAAqx4AAK0eAACtHgAArx4AAK8eAACxHgAAsR4AALMeAACzHgAAtR4AALUeAAC3HgAAtx4AALkeAAC5HgAAux4AALseAAC9HgAAvR4AAL8eAAC/HgAAwR4AAMEeAADDHgAAwx4AAMUeAADFHgAAxx4AAMceAADJHgAAyR4AAMseAADLHgAAzR4AAM0eAADPHgAAzx4AANEeAADRHgAA0x4AANMeAADVHgAA1R4AANceAADXHgAA2R4AANkeAADbHgAA2x4AAN0eAADdHgAA3x4AAN8eAADhHgAA4R4AAOMeAADjHgAA5R4AAOUeAADnHgAA5x4AAOkeAADpHgAA6x4AAOseAADtHgAA7R4AAO8eAADvHgAA8R4AAPEeAADzHgAA8x4AAPUeAAD1HgAA9x4AAPceAAD5HgAA+R4AAPseAAD7HgAA/R4AAP0eAAD/HgAABx8AABAfAAAVHwAAIB8AACcfAAAwHwAANx8AAEAfAABFHwAAUB8AAFcfAABgHwAAZx8AAHAfAAB9HwAAgB8AAIcfAACQHwAAlx8AAKAfAACnHwAAsB8AALQfAAC2HwAAtx8AAL4fAAC+HwAAwh8AAMQfAADGHwAAxx8AANAfAADTHwAA1h8AANcfAADgHwAA5x8AAPIfAAD0HwAA9h8AAPcfAABOIQAATiEAAHAhAAB/IQAAhCEAAIQhAADQJAAA6SQAADAsAABfLAAAYSwAAGEsAABlLAAAZiwAAGgsAABoLAAAaiwAAGosAABsLAAAbCwAAHMsAABzLAAAdiwAAHYsAACBLAAAgSwAAIMsAACDLAAAhSwAAIUsAACHLAAAhywAAIksAACJLAAAiywAAIssAACNLAAAjSwAAI8sAACPLAAAkSwAAJEsAACTLAAAkywAAJUsAACVLAAAlywAAJcsAACZLAAAmSwAAJssAACbLAAAnSwAAJ0sAACfLAAAnywAAKEsAAChLAAAoywAAKMsAAClLAAApSwAAKcsAACnLAAAqSwAAKksAACrLAAAqywAAK0sAACtLAAArywAAK8sAACxLAAAsSwAALMsAACzLAAAtSwAALUsAAC3LAAAtywAALksAAC5LAAAuywAALssAAC9LAAAvSwAAL8sAAC/LAAAwSwAAMEsAADDLAAAwywAAMUsAADFLAAAxywAAMcsAADJLAAAySwAAMssAADLLAAAzSwAAM0sAADPLAAAzywAANEsAADRLAAA0ywAANMsAADVLAAA1SwAANcsAADXLAAA2SwAANksAADbLAAA2ywAAN0sAADdLAAA3ywAAN8sAADhLAAA4SwAAOMsAADjLAAA7CwAAOwsAADuLAAA7iwAAPMsAADzLAAAAC0AACUtAAAnLQAAJy0AAC0tAAAtLQAAQaYAAEGmAABDpgAAQ6YAAEWmAABFpgAAR6YAAEemAABJpgAASaYAAEumAABLpgAATaYAAE2mAABPpgAAT6YAAFGmAABRpgAAU6YAAFOmAABVpgAAVaYAAFemAABXpgAAWaYAAFmmAABbpgAAW6YAAF2mAABdpgAAX6YAAF+mAABhpgAAYaYAAGOmAABjpgAAZaYAAGWmAABnpgAAZ6YAAGmmAABppgAAa6YAAGumAABtpgAAbaYAAIGmAACBpgAAg6YAAIOmAACFpgAAhaYAAIemAACHpgAAiaYAAImmAACLpgAAi6YAAI2mAACNpgAAj6YAAI+mAACRpgAAkaYAAJOmAACTpgAAlaYAAJWmAACXpgAAl6YAAJmmAACZpgAAm6YAAJumAAAjpwAAI6cAACWnAAAlpwAAJ6cAACenAAAppwAAKacAACunAAArpwAALacAAC2nAAAvpwAAL6cAADOnAAAzpwAANacAADWnAAA3pwAAN6cAADmnAAA5pwAAO6cAADunAAA9pwAAPacAAD+nAAA/pwAAQacAAEGnAABDpwAAQ6cAAEWnAABFpwAAR6cAAEenAABJpwAASacAAEunAABLpwAATacAAE2nAABPpwAAT6cAAFGnAABRpwAAU6cAAFOnAABVpwAAVacAAFenAABXpwAAWacAAFmnAABbpwAAW6cAAF2nAABdpwAAX6cAAF+nAABhpwAAYacAAGOnAABjpwAAZacAAGWnAABnpwAAZ6cAAGmnAABppwAAa6cAAGunAABtpwAAbacAAG+nAABvpwAAeqcAAHqnAAB8pwAAfKcAAH+nAAB/pwAAgacAAIGnAACDpwAAg6cAAIWnAACFpwAAh6cAAIenAACMpwAAjKcAAJGnAACRpwAAk6cAAJSnAACXpwAAl6cAAJmnAACZpwAAm6cAAJunAACdpwAAnacAAJ+nAACfpwAAoacAAKGnAACjpwAAo6cAAKWn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AAAdHgAAHR4AAB8eAAAfHgAAIR4AACEeAAAjHgAAIx4AACUeAAAlHgAAJx4AACceAAApHgAAKR4AACseAAArHgAALR4AAC0eAAAvHgAALx4AADEeAAAxHgAAMx4AADMeAAA1HgAANR4AADceAAA3HgAAOR4AADkeAAA7HgAAOx4AAD0eAAA9HgAAPx4AAD8eAABBHgAAQR4AAEMeAABDHgAARR4AAEUeAABHHgAARx4AAEkeAABJHgAASx4AAEseAABNHgAATR4AAE8eAABPHgAAUR4AAFEeAABTHgAAUx4AAFUeAABVHgAAVx4AAFceAABZHgAAWR4AAFseAABbHgAAXR4AAF0eAABfHgAAXx4AAGEeAABhHgAAYx4AAGMeAABlHgAAZR4AAGceAABnHgAAaR4AAGkeAABrHgAAax4AAG0eAABtHgAAbx4AAG8eAABxHgAAcR4AAHMeAABzHgAAdR4AAHUeAAB3HgAAdx4AAHkeAAB5HgAAex4AAHseAAB9HgAAfR4AAH8eAAB/HgAAgR4AAIEeAACDHgAAgx4AAIUeAACFHgAAhx4AAIceAACJHgAAiR4AAIseAACLHgAAjR4AAI0eAACPHgAAjx4AAJEeAACRHgAAkx4AAJMeAACVHgAAmx4AAKEeAAChHgAAox4AAKMeAAClHgAApR4AAKceAACnHgAAqR4AAKkeAACrHgAAqx4AAK0eAACtHgAArx4AAK8eAACxHgAAsR4AALMeAACzHgAAtR4AALUeAAC3HgAAtx4AALkeAAC5HgAAux4AALseAAC9HgAAvR4AAL8eAAC/HgAAwR4AAMEeAADDHgAAwx4AAMUeAADFHgAAxx4AAMceAADJHgAAyR4AAMseAADLHgAAzR4AAM0eAADPHgAAzx4AANEeAADRHgAA0x4AANMeAADVHgAA1R4AANceAADXHgAA2R4AANkeAADbHgAA2x4AAN0eAADdHgAA3x4AAN8eAADhHgAA4R4AAOMeAADjHgAA5R4AAOUeAADnHgAA5x4AAOkeAADpHgAA6x4AAOseAADtHgAA7R4AAO8eAADvHgAA8R4AAPEeAADzHgAA8x4AAPUeAAD1HgAA9x4AAPceAAD5HgAA+R4AAPseAAD7HgAA/R4AAP0eAAD/HgAABx8AABAfAAAVHwAAIB8AACcfAAAwHwAANx8AAEAfAABFHwAAUB8AAFcfAABgHwAAZx8AAHAfAAB9HwAAgB8AALQfAAC2HwAAtx8AALwfAAC8HwAAvh8AAL4fAADCHwAAxB8AAMYfAADHHwAAzB8AAMwfAADQHwAA0x8AANYfAADXHwAA4B8AAOcfAADyHwAA9B8AAPYfAAD3HwAA/B8AAPwfAABOIQAATiEAAHAhAAB/IQAAhCEAAIQhAADQJAAA6SQAADAsAABfLAAAYSwAAGEsAABlLAAAZiwAAGgsAABoLAAAaiwAAGosAABsLAAAbCwAAHMsAABzLAAAdiwAAHYsAACBLAAAgSwAAIMsAACDLAAAhSwAAIUsAACHLAAAhywAAIksAACJLAAAiywAAIssAACNLAAAjSwAAI8sAACPLAAAkSwAAJEsAACTLAAAkywAAJUsAACVLAAAlywAAJcsAACZLAAAmSwAAJssAACbLAAAnSwAAJ0sAACfLAAAnywAAKEsAAChLAAAoywAAKMsAAClLAAApSwAAKcsAACnLAAAqSwAAKksAACrLAAAqywAAK0sAACtLAAArywAAK8sAACxLAAAsSwAALMsAACzLAAAtSwAALUsAAC3LAAAtywAALksAAC5LAAAuywAALssAAC9LAAAvSwAAL8sAAC/LAAAwSwAAMEsAADDLAAAwywAAMUsAADFLAAAxywAAMcsAADJLAAAySwAAMssAADLLAAAzSwAAM0sAADPLAAAzywAANEsAADRLAAA0ywAANMsAADVLAAA1SwAANcsAADXLAAA2SwAANksAADbLAAA2ywAAN0sAADdLAAA3ywAAN8sAADhLAAA4SwAAOMsAADjLAAA7CwAAOwsAADuLAAA7iwAAPMsAADzLAAAAC0AACUtAAAnLQAAJy0AAC0tAAAtLQAAQaYAAEGmAABDpgAAQ6YAAEWmAABFpgAAR6YAAEemAABJpgAASaYAAEumAABLpgAATaYAAE2mAABPpgAAT6YAAFGmAABRpgAAU6YAAFOmAABVpgAAVaYAAFemAABXpgAAWaYAAFmmAABbpgAAW6YAAF2mAABdpgAAX6YAAF+mAABhpgAAYaYAAGOmAABjpgAAZaYAAGWmAABnpgAAZ6YAAGmmAABppgAAa6YAAGumAABtpgAAbaYAAIGmAACBpgAAg6YAAIOmAACFpgAAhaYAAIemAACHpgAAiaYAAImmAACLpgAAi6YAAI2mAACNpgAAj6YAAI+mAACRpgAAkaYAAJOmAACTpgAAlaYAAJWmAACXpgAAl6YAAJmmAACZpgAAm6YAAJumAAAjpwAAI6cAACWnAAAlpwAAJ6cAACenAAAppwAAKacAACunAAArpwAALacAAC2nAAAvpwAAL6cAADOnAAAzpwAANacAADWnAAA3pwAAN6cAADmnAAA5pwAAO6cAADunAAA9pwAAPacAAD+nAAA/pwAAQacAAEGnAABDpwAAQ6cAAEWnAABFpwAAR6cAAEenAABJpwAASacAAEunAABLpwAATacAAE2nAABPpwAAT6cAAFGnAABRpwAAU6cAAFOnAABVpwAAVacAAFenAABXpwAAWacAAFmnAABbpwAAW6cAAF2nAABdpwAAX6cAAF+nAABhpwAAYacAAGOnAABjpwAAZacAAGWnAABnpwAAZ6cAAGmnAABppwAAa6cAAGunAABtpwAAbacAAG+nAABvpwAAeqcAAHqnAAB8pwAAfKcAAH+nAAB/pwAAgacAAIGnAACDpwAAg6cAAIWnAACFpwAAh6cAAIenAACMpwAAjKcAAJGnAACRpwAAk6cAAJSnAACXpwAAl6cAAJmnAACZpwAAm6cAAJunAACdpwAAnacAAJ+nAACfpwAAoacAAKGnAACjpwAAo6cAAKWnAAClpwAAp6cAAKenAACppwAAqacAALWnAAC1pwAAt6cAALenAAC5pwAAuacAALunAAC7pwAAvacAAL2nAAC/pwAAv6cAAMGnAADBpwAAw6cAAMOnAADIpwAAyKcAAMqnAADKpwAA0acAANGnAADXpwAA16cAANmnAADZpwAA9qcAAPanAABTqwAAU6sAAHCrAAC/qwAAAPsAAAb7AAAT+wAAF/sAAEH/AABa/wAAKAQBAE8EAQDYBAEA+wQBAJcFAQChBQEAowUBALEFAQCzBQEAuQUBALsFAQC8BQEAwAwBAPIMAQDAGAEA3xgBAGBuAQB/bgEAIukBAEPpAQAtAAAALQAAAIoFAACKBQAAvgUAAL4FAAAAFAAAABQAAAYYAAAGGAAAECAAABUgAABTIAAAUyAAAHsgAAB7IAAAiyAAAIsgAAASIgAAEiIAABcuAAAXLgAAGi4AABouAAA6LgAAOy4AAEAuAABALgAAXS4AAF0uAAAcMAAAHDAAADAw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AABZHgAAWR4AAFseAABbHgAAXR4AAF0eAABfHgAAXx4AAGEeAABhHgAAYx4AAGMeAABlHgAAZR4AAGceAABnHgAAaR4AAGkeAABrHgAAax4AAG0eAABtHgAAbx4AAG8eAABxHgAAcR4AAHMeAABzHgAAdR4AAHUeAAB3HgAAdx4AAHkeAAB5HgAAex4AAHseAAB9HgAAfR4AAH8eAAB/HgAAgR4AAIEeAACDHgAAgx4AAIUeAACFHgAAhx4AAIceAACJHgAAiR4AAIseAACLHgAAjR4AAI0eAACPHgAAjx4AAJEeAACRHgAAkx4AAJMeAACVHgAAnR4AAJ8eAACfHgAAoR4AAKEeAACjHgAAox4AAKUeAAClHgAApx4AAKceAACpHgAAqR4AAKseAACrHgAArR4AAK0eAACvHgAArx4AALEeAACxHgAAsx4AALMeAAC1HgAAtR4AALceAAC3HgAAuR4AALkeAAC7HgAAux4AAL0eAAC9HgAAvx4AAL8eAADBHgAAwR4AAMMeAADDHgAAxR4AAMUeAADHHgAAxx4AAMkeAADJHgAAyx4AAMseAADNHgAAzR4AAM8eAADPHgAA0R4AANEeAADTHgAA0x4AANUeAADVHgAA1x4AANceAADZHgAA2R4AANseAADbHgAA3R4AAN0eAADfHgAA3x4AAOEeAADhHgAA4x4AAOMeAADlHgAA5R4AAOceAADnHgAA6R4AAOkeAADrHgAA6x4AAO0eAADtHgAA7x4AAO8eAADxHgAA8R4AAPMeAADzHgAA9R4AAPUeAAD3HgAA9x4AAPkeAAD5HgAA+x4AAPseAAD9HgAA/R4AAP8eAAAHHwAAEB8AABUfAAAgHwAAJx8AADAfAAA3HwAAQB8AAEUfAABQHwAAVx8AAGAfAABnHwAAcB8AAH0fAACAHwAAhx8AAJAfAACXHwAAoB8AAKcfAACwHwAAtB8AALYfAAC3HwAAvh8AAL4fAADCHwAAxB8AAMYfAADHHwAA0B8AANMfAADWHwAA1x8AAOAfAADnHwAA8h8AAPQfAAD2HwAA9x8AAHEgAABxIAAAfyAAAH8gAACQIAAAnCAAAAohAAAKIQAADiEAAA8hAAATIQAAEyEAAC8hAAAvIQAANCEAADQhAAA5IQAAOSEAADwhAAA9IQAARiEAAEkhAABOIQAATiEAAHAhAAB/IQAAhCEAAIQhAADQJAAA6SQAADAsAABfLAAAYSwAAGEsAABlLAAAZiwAAGgsAABoLAAAaiwAAGosAABsLAAAbCwAAHEsAABxLAAAcywAAHQsAAB2LAAAfSwAAIEsAACBLAAAgywAAIMsAACFLAAAhSwAAIcsAACHLAAAiSwAAIksAACLLAAAiywAAI0sAACNLAAAjywAAI8sAACRLAAAkSwAAJMsAACTLAAAlSwAAJUsAACXLAAAlywAAJksAACZLAAAmywAAJssAACdLAAAnSwAAJ8sAACfLAAAoSwAAKEsAACjLAAAoywAAKUsAAClLAAApywAAKcsAACpLAAAqSwAAKssAACrLAAArSwAAK0sAACvLAAArywAALEsAACxLAAAsywAALMsAAC1LAAAtSwAALcsAAC3LAAAuSwAALksAAC7LAAAuywAAL0sAAC9LAAAvywAAL8sAADBLAAAwSwAAMMsAADDLAAAxSwAAMUsAADHLAAAxywAAMksAADJLAAAyywAAMssAADNLAAAzSwAAM8sAADPLAAA0SwAANEsAADTLAAA0ywAANUsAADVLAAA1ywAANcsAADZLAAA2SwAANssAADbLAAA3SwAAN0sAADfLAAA3ywAAOEsAADhLAAA4ywAAOQsAADsLAAA7CwAAO4sAADuLAAA8ywAAPMsAAAALQAAJS0AACctAAAnLQAALS0AAC0tAABBpgAAQaYAAEOmAABDpgAARaYAAEWmAABHpgAAR6YAAEmmAABJpgAAS6YAAEumAABNpgAATaYAAE+mAABPpgAAUaYAAFGmAABTpgAAU6YAAFWmAABVpgAAV6YAAFemAABZpgAAWaYAAFumAABbpgAAXaYAAF2mAABfpgAAX6YAAGGmAABhpgAAY6YAAGOmAABlpgAAZaYAAGemAABnpgAAaaYAAGmmAABrpgAAa6YAAG2mAABtpgAAgaYAAIGmAACDpgAAg6YAAIWmAACFpgAAh6YAAIemAACJpgAAiaYAAIumAACLpgAAjaYAAI2mAACPpgAAj6YAAJGmAACRpgAAk6YAAJOmAACVpgAAlaYAAJemAACXpgAAmaYAAJmmAACbpgAAnaYAACOnAAAjpwAAJacAACWnAAAnpwAAJ6cAACmnAAAppwAAK6cAACunAAAtpwAALacAAC+nAAAxpwAAM6cAADOnAAA1pwAANacAADenAAA3pwAAOacAADmnAAA7pwAAO6cAAD2nAAA9pwAAP6cAAD+nAABBpwAAQacAAEOnAABDpwAARacAAEWnAABHpwAAR6cAAEmnAABJpwAAS6cAAEunAABNpwAATacAAE+nAABPpwAAUacAAFGnAABTpwAAU6cAAFWnAABVpwAAV6cAAFenAABZpwAAWacAAFunAABbpwAAXacAAF2nAABfpwAAX6cAAGGnAABhpwAAY6cAAGOnAABlpwAAZacAAGenAABnpwAAaacAAGmnAABrpwAAa6cAAG2nAABtpwAAb6cAAHinAAB6pwAAeqcAAHynAAB8pwAAf6cAAH+nAACBpwAAgacAAIOnAACDpwAAhacAAIWnAACHpwAAh6cAAIynAACMpwAAjqcAAI6nAACRpwAAkacAAJOnAACVpwAAl6cAAJenAACZpwAAmacAAJunAACbpwAAnacAAJ2nAACfpwAAn6cAAKGnAAChpwAAo6cAAKOnAAClpwAApacAAKenAACnpwAAqacAAKmnAACvpwAAr6cAALWnAAC1pwAAt6cAALenAAC5pwAAuacAALunAAC7pwAAvacAAL2nAAC/pwAAv6cAAMGnAADBpwAAw6cAAMOnAADIpwAAyKcAAMqnAADKpwAA0acAANGnAADTpwAA06cAANWnAADVpwAA16cAANenAADZpwAA2acAAPKnAAD0pwAA9qcAAPanAAD4pwAA+qcAADCrAABaqwAAXKsAAGmrAABwqwAAv6sAAAD7AAAG+wAAE/sAABf7AABB/wAAWv8AACgEAQBPBAEA2AQBAPsEAQCXBQEAoQUBAKMFAQCxBQEAswUBALkFAQC7BQEAvAUBAIAHAQCABwEAgwcBAIUHAQCHBwEAsAcBALIHAQC6BwEAwAwBAPIMAQDAGAEA3xgBAGBuAQB/bgEAGtQBADPUAQBO1AEAVNQBAFbUAQBn1AEAgtQBAJvUAQC21AEAudQBALvUAQC71AEAvdQBAMPUAQDF1AEAz9QBAOrUAQAD1QEAHtUBADfVAQBS1QEAa9UBAIbVAQCf1QEAutUBANPVAQDu1QEAB9YBACLWAQA71gEAVtYBAG/WAQCK1gEApdYBAMLWAQDa1gEA3NYBAOHWAQD81gEAFNcBABbXAQAb1wEANtcBAE7XAQBQ1wEAVdcBAHDX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AABgHgAAYB4AAGIeAABiHgAAZB4AAGQeAABmHgAAZh4AAGgeAABoHgAAah4AAGoeAABsHgAAbB4AAG4eAABuHgAAcB4AAHAeAAByHgAAch4AAHQeAAB0HgAAdh4AAHYeAAB4HgAAeB4AAHoeAAB6HgAAfB4AAHweAAB+HgAAfh4AAIAeAACAHgAAgh4AAIIeAACEHgAAhB4AAIYeAACGHgAAiB4AAIgeAACKHgAAih4AAIweAACMHgAAjh4AAI4eAACQHgAAkB4AAJIeAACSHgAAlB4AAJQeAACeHgAAnh4AAKAeAACgHgAAoh4AAKIeAACkHgAApB4AAKYeAACmHgAAqB4AAKgeAACqHgAAqh4AAKweAACsHgAArh4AAK4eAACwHgAAsB4AALIeAACyHgAAtB4AALQeAAC2HgAAth4AALgeAAC4HgAAuh4AALoeAAC8HgAAvB4AAL4eAAC+HgAAwB4AAMAeAADCHgAAwh4AAMQeAADEHgAAxh4AAMYeAADIHgAAyB4AAMoeAADKHgAAzB4AAMweAADOHgAAzh4AANAeAADQHgAA0h4AANIeAADUHgAA1B4AANYeAADWHgAA2B4AANgeAADaHgAA2h4AANweAADcHgAA3h4AAN4eAADgHgAA4B4AAOIeAADiHgAA5B4AAOQeAADmHgAA5h4AAOgeAADoHgAA6h4AAOoeAADsHgAA7B4AAO4eAADuHgAA8B4AAPAeAADyHgAA8h4AAPQeAAD0HgAA9h4AAPYeAAD4HgAA+B4AAPoeAAD6HgAA/B4AAPweAAD+HgAA/h4AAAgfAAAPHwAAGB8AAB0fAAAoHwAALx8AADgfAAA/HwAASB8AAE0fAABZHwAAWR8AAFsfAABbHwAAXR8AAF0fAABfHwAAXx8AAGgfAABvHwAAuB8AALsfAADIHwAAyx8AANgfAADbHwAA6B8AAOwfAAD4HwAA+x8AAAIhAAACIQAAByEAAAchAAALIQAADSEAABAhAAASIQAAFSEAABUhAAAZIQAAHSEAACQhAAAkIQAAJiEAACYhAAAoIQAAKCEAACohAAAtIQAAMCEAADMhAAA+IQAAPyEAAEUhAABFIQAAYCEAAG8hAACDIQAAgyEAALYkAADPJAAAACwAAC8sAABgLAAAYCwAAGIsAABkLAAAZywAAGcsAABpLAAAaSwAAGssAABrLAAAbSwAAHAsAAByLAAAciwAAHUsAAB1LAAAfiwAAIAsAACCLAAAgiwAAIQsAACELAAAhiwAAIYsAACILAAAiCwAAIosAACKLAAAjCwAAIwsAACOLAAAjiwAAJAsAACQLAAAkiwAAJIsAACULAAAlCwAAJYsAACWLAAAmCwAAJgsAACaLAAAmiwAAJwsAACcLAAAniwAAJ4sAACgLAAAoCwAAKIsAACiLAAApCwAAKQsAACmLAAApiwAAKgsAACoLAAAqiwAAKosAACsLAAArCwAAK4sAACuLAAAsCwAALAsAACyLAAAsiwAALQsAAC0LAAAtiwAALYsAAC4LAAAuCwAALosAAC6LAAAvCwAALwsAAC+LAAAviwAAMAsAADALAAAwiwAAMIsAADELAAAxCwAAMYsAADGLAAAyCwAAMgsAADKLAAAyiwAAMwsAADMLAAAziwAAM4sAADQLAAA0CwAANIsAADSLAAA1CwAANQsAADWLAAA1iwAANgsAADYLAAA2iwAANosAADcLAAA3CwAAN4sAADeLAAA4CwAAOAsAADiLAAA4iwAAOssAADrLAAA7SwAAO0sAADyLAAA8iwAAECmAABApgAAQqYAAEKmAABEpgAARKYAAEamAABGpgAASKYAAEimAABKpgAASqYAAEymAABMpgAATqYAAE6mAABQpgAAUKYAAFKmAABSpgAAVKYAAFSmAABWpgAAVqYAAFimAABYpgAAWqYAAFqmAABcpgAAXKYAAF6mAABepgAAYKYAAGCmAABipgAAYqYAAGSmAABkpgAAZqYAAGamAABopgAAaKYAAGqmAABqpgAAbKYAAGymAACApgAAgKYAAIKmAACCpgAAhKYAAISmAACGpgAAhqYAAIimAACIpgAAiqYAAIqmAACMpgAAjKYAAI6mAACOpgAAkKYAAJCmAACSpgAAkqYAAJSmAACUpgAAlqYAAJamAACYpgAAmKYAAJqmAACapgAAIqcAACKnAAAkpwAAJKcAACanAAAmpwAAKKcAACinAAAqpwAAKqcAACynAAAspwAALqcAAC6nAAAypwAAMqcAADSnAAA0pwAANqcAADanAAA4pwAAOKcAADqnAAA6pwAAPKcAADynAAA+pwAAPqcAAECnAABApwAAQqcAAEKnAABEpwAARKcAAEanAABGpwAASKcAAEin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AAD3AwAAgQQAAIoEAAAvBQAAMQUAAFYFAABZBQAAWQUAAGAFAACIBQAA0AUAAOoFAADvBQAA8gUAACAGAABKBgAAbgYAAG8GAABxBgAA0wYAANUGAADVBgAA5QYAAOYGAADuBgAA7wYAAPoGAAD8BgAA/wYAAP8GAAAQBwAAEAcAABIHAAAvBwAATQcAAKUHAACxBwAAsQcAAMoHAADqBwAA9AcAAPUHAAD6BwAA+gcAAAAIAAAVCAAAGggAABoIAAAkCAAAJAgAACgIAAAoCAAAQAgAAFgIAABgCAAAaggAAHAIAACHCAAAiQgAAI4IAACgCAAAyQgAAAQJAAA5CQAAPQkAAD0JAABQCQAAUAkAAFgJAABhCQAAcQkAAIAJAACFCQAAjAkAAI8JAACQCQAAkwkAAKgJAACqCQAAsAkAALIJAACyCQAAtgkAALkJAAC9CQAAvQkAAM4JAADOCQAA3AkAAN0JAADfCQAA4QkAAPAJAADxCQAA/AkAAPwJAAAFCgAACgoAAA8KAAAQCgAAEwoAACgKAAAqCgAAMAoAADIKAAAzCgAANQoAADYKAAA4CgAAOQoAAFkKAABcCgAAXgoAAF4KAAByCgAAdAoAAIUKAACNCgAAjwoAAJEKAACTCgAAqAoAAKoKAACwCgAAsgoAALMKAAC1CgAAuQoAAL0KAAC9CgAA0AoAANAKAADgCgAA4QoAAPkKAAD5CgAABQsAAAwLAAAPCwAAEAsAABMLAAAoCwAAKgsAADALAAAyCwAAMwsAADULAAA5CwAAPQsAAD0LAABcCwAAXQsAAF8LAABhCwAAcQsAAHELAACDCwAAgwsAAIULAACKCwAAjgsAAJALAACSCwAAlQsAAJkLAACaCwAAnAsAAJwLAACeCwAAnwsAAKMLAACkCwAAqAsAAKoLAACuCwAAuQsAANALAADQCwAABQwAAAwMAAAODAAAEAwAABIMAAAoDAAAKgwAADkMAAA9DAAAPQwAAFgMAABaDAAAXQwAAF0MAABgDAAAYQwAAIAMAACADAAAhQwAAIwMAACODAAAkAwAAJIMAACoDAAAqgwAALMMAAC1DAAAuQwAAL0MAAC9DAAA3QwAAN4MAADgDAAA4QwAAPEMAADyDAAABA0AAAwNAAAODQAAEA0AABINAAA6DQAAPQ0AAD0NAABODQAATg0AAFQN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AQCF0QEAi9EBAKrRAQCt0QEAQtIBAETSAQAA2gEANtoBADvaAQBs2gEAddoBAHXaAQCE2gEAhNoBAJvaAQCf2gEAodoBAK/aAQAA4AEABuABAAjgAQAY4AEAG+ABACHgAQAj4AEAJOABACbgAQAq4AEAj+ABAI/gAQAw4QEANuEBAK7iAQCu4gEA7OIBAO/iAQDs5AEA7+QBANDoAQDW6AEAROkBAErpAQD78wEA//MBACAADgB/AA4AAAEOAO8BDgAAEQAAXxEAAGCpAAB8qQAACgAAAAoAAAAArAAAAKwAABysAAAcrAAAOKwAADisAABUrAAAVKwAAHCsAABwrAAAjKwAAIysAACorAAAqKwAAMSsAADErAAA4KwAAOCsAAD8rAAA/KwAABitAAAYrQAANK0AADStAABQrQAAUK0AAGytAABsrQAAiK0AAIitAACkrQAApK0AAMCtAADArQAA3K0AANytAAD4rQAA+K0AABSuAAAUrgAAMK4AADCuAABMrgAATK4AAGiuAABorgAAhK4AAISuAACgrgAAoK4AALyuAAC8rgAA2K4AANiuAAD0rgAA9K4AABCvAAAQrwAALK8AACyvAABIrwAASK8AAGSvAABkrwAAgK8AAICvAACcrwAAnK8AALivAAC4rwAA1K8AANSvAADwrwAA8K8AAAywAAAMsAAAKLAAACiwAABEsAAARLAAAGCwAABgsAAAfLAAAHywAACYsAAAmLAAALSwAAC0sAAA0LAAANCwAADssAAA7LAAAAixAAAIsQAAJLEAACSxAABAsQAAQLEAAFyxAABcsQAAeLEAAHixAACUsQAAlLEAALCxAACwsQAAzLEAAMyxAADosQAA6LEAAASyAAAEsgAAILIAACCyAAA8sgAAPLIAAFiyAABYsgAAdLIAAHSyAACQsgAAkLIAAKyyAACssgAAyLIAAMiyAADksgAA5LIAAACzAAAAswAAHLMAAByzAAA4swAAOLMAAFSzAABUswAAcLMAAHCzAACMswAAjLMAAKizAACoswAAxLMAAMSzAADgswAA4LMAAPyzAAD8swAAGLQAABi0AAA0tAAANLQAAFC0AABQtAAAbLQAAGy0AACItAAAiLQAAKS0AACktAAAwLQAAMC0AADctAAA3LQAAPi0AAD4tAAAFLUAABS1AAAwtQAAMLUAAEy1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AAChrgAAu64AAL2uAADXrgAA2a4AAPOuAAD1rgAAD68AABGvAAArrwAALa8AAEevAABJrwAAY68AAGWvAAB/rwAAga8AAJuvAACdrwAAt68AALmvAADTrwAA1a8AAO+vAADxrwAAC7AAAA2wAAAnsAAAKbAAAEOwAABFsAAAX7AAAGGwAAB7sAAAfbAAAJewAACZsAAAs7AAALWwAADPsAAA0bAAAOuwAADtsAAAB7EAAAmxAAAjsQAAJbEAAD+xAABBsQAAW7EAAF2xAAB3sQAAebEAAJOxAACVsQAAr7EAALGxAADLsQAAzbEAAOexAADpsQAAA7IAAAWyAAAfsgAAIbIAADuyAAA9sgAAV7IAAFmyAABzsgAAdbIAAI+yAACRsgAAq7IAAK2yAADHsgAAybIAAOOyAADlsgAA/7IAAAGzAAAbswAAHbMAADezAAA5swAAU7MAAFWzAABvswAAcbMAAIuzAACNswAAp7MAAKmzAADDswAAxbMAAN+zAADhswAA+7MAAP2zAAAXtAAAGbQAADO0AAA1tAAAT7QAAFG0AABrtAAAbbQAAIe0AACJtAAAo7QAAKW0AAC/tAAAwbQAANu0AADdtAAA97QAAPm0AAATtQAAFbUAAC+1AAAxtQAAS7UAAE21AABntQAAabUAAIO1AACFtQAAn7UAAKG1AAC7tQAAvbUAANe1AADZtQAA87UAAPW1AAAPtgAAEbYAACu2AAAttgAAR7YAAEm2AABjtgAAZbYAAH+2AACBtgAAm7YAAJ22AAC3tgAAubYAANO2AADVtgAA77YAAPG2AAALtwAADbcAACe3AAAptwAAQ7cAAEW3AABftwAAYbcAAHu3AAB9twAAl7cAAJm3AACztwAAtbcAAM+3AADRtwAA67cAAO23AAAHuAAACbgAACO4AAAluAAAP7gAAEG4AABbuAAAXbgAAHe4AAB5uAAAk7gAAJW4AACvuAAAsbgAAMu4AADNuAAA57gAAOm4AAADuQAABbkAAB+5AAAhuQAAO7kAAD25AABXuQAAWbkAAHO5AAB1uQAAj7kAAJG5AACruQAArbkAAMe5AADJuQAA47kAAOW5AAD/uQAAAboAABu6AAAdugAAN7oAADm6AABTugAAVboAAG+6AABxugAAi7oAAI26AACnugAAqboAAMO6AADFugAA37oAAOG6AAD7ugAA/boAABe7AAAZuwAAM7sAADW7AABPuwAAUbsAAGu7AABtuwAAh7sAAIm7AACjuwAApbsAAL+7AADBuwAA27sAAN27AAD3uwAA+bsAABO8AAAVvAAAL7wAADG8AABLvAAATbwAAGe8AABpvAAAg7wAAIW8AACfvAAAobwAALu8AAC9vAAA17wAANm8AADzvAAA9bwAAA+9AAARvQAAK70AAC29AABHvQAASb0AAGO9AABlvQAAf70AAIG9AACbvQAAnb0AALe9AAC5vQAA070AANW9AADvvQAA8b0AAAu+AAANvgAAJ74AACm+AABDvgAARb4AAF++AABhvgAAe74AAH2+AACXvgAAmb4AALO+AAC1vgAAz74AANG+AADrvgAA7b4AAAe/AAAJvwAAI78AACW/AAA/vwAAQb8AAFu/AABdvwAAd78AAHm/AACTvwAAlb8AAK+/AACxvwAAy78AAM2/AADnvwAA6b8AAAPAAAAFwAAAH8AAACHAAAA7wAAAPcAAAFfAAABZwAAAc8AAAHXAAACPwAAAkcAAAKvAAACtwAAAx8AAAMnAAADjwAAA5cAAAP/AAAABwQAAG8EAAB3BAAA3wQAAOcEAAFPBAABVwQAAb8EAAHHBAACLwQAAjcEAAKfBAACpwQAAw8EAAMXBAADfwQAA4cEAAPvBAAD9wQAAF8IAABnCAAAzwgAANcIAAE/CAABRwgAAa8IAAG3CAACHwgAAicIAAKPCAAClwgAAv8IAAMHCAADbwgAA3cIAAPfCAAD5wgAAE8MAABXDAAAvwwAAMcMAAEvDAABNwwAAZ8MAAGnDAACDwwAAhcMAAJ/DAAChwwAAu8MAAL3DAADXwwAA2cMAAPPDAAD1wwAAD8QAABHEAAArxAAALcQAAEfEAABJxAAAY8QAAGXEAAB/xAAAgcQAAJvEAACdxAAAt8QAALnEAADTxAAA1cQAAO/EAADxxAAAC8UAAA3FAAAnxQAAKcUAAEPFAABFxQAAX8UAAGHFAAB7xQAAfcUAAJfFAACZxQAAs8UAALXFAADPxQAA0cUAAOvFAADtxQAAB8YAAAnGAAAjxgAAJcYAAD/GAABBxgAAW8YAAF3GAAB3xgAAecYAAJPGAACVxgAAr8YAALHGAADLxgAAzcYAAOfGAADpxgAAA8cAAAXHAAAfxwAAIccAADvHAAA9xwAAV8cAAFnHAABzxwAAdccAAI/HAACRxwAAq8cAAK3HAADHxwAAyccAAOPHAADlxwAA/8cAAAHIAAAbyAAAHcgAADfIAAA5yAAAU8gAAFXIAABvyAAAccgAAIvIAACNyAAAp8gAAKnIAADDyAAAxcgAAN/IAADhyAAA+8gAAP3IAAAXyQAAGckAADPJAAA1yQAAT8kAAFHJAABryQAAbckAAIfJAACJyQAAo8kAAKXJAAC/yQAAwckAANvJAADdyQAA98kAAPnJAAATygAAFcoAAC/KAAAxygAAS8oAAE3KAABnygAAacoAAIPKAACFygAAn8oAAKHKAAC7ygAAvcoAANfKAADZygAA88oAAPXKAAAPywAAEcsAACvLAAAtywAAR8sAAEnLAABjywAAZcsAAH/LAACBywAAm8sAAJ3LAAC3ywAAucsAANPLAADVywAA78sAAPHLAAALzAAADcwAACfMAAApzAAAQ8wAAEXMAABfzAAAYcwAAHvMAAB9zAAAl8wAAJnMAACzzAAAtcwAAM/MAADRzAAA68wAAO3MAAAHzQAACc0AACPNAAAlzQAAP80AAEHNAABbzQAAXc0AAHfNAAB5zQAAk80AAJXNAACvzQAAsc0AAMvNAADNzQAA580AAOnNAAADzgAABc4AAB/OAAAhzgAAO84AAD3OAABXzgAAWc4AAHPOAAB1zgAAj84AAJHOAACrzgAArc4AAMfOAADJzgAA484AAOXOAAD/zgAAAc8AABvPAAAdzwAAN88AADnPAABTzwAAVc8AAG/PAABxzwAAi88AAI3PAACnzwAAqc8AAMPPAADFzwAA388AAOHPAAD7zwAA/c8AABfQAAAZ0AAAM9AAADXQAABP0AAAUdAAAGvQAABt0AAAh9AAAInQAACj0AAApdAAAL/QAADB0AAA29AAAN3QAAD30AAA+dAAABPRAAAV0QAAL9EAADHRAABL0QAATdEAAGfRAABp0QAAg9EAAIXRAACf0QAAodEAALvRAAC90QAA19EAANnRAADz0QAA9dEAAA/SAAAR0gAAK9IAAC3SAABH0gAASdIAAGPSAABl0gAAf9IAAIHSAACb0gAAndIAALfSAAC50gAA09IAANXSAADv0gAA8dIAAAvTAAAN0wAAJ9MAACnTAABD0wAARdMAAF/TAABh0wAAe9MAAH3T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AAATCwAAKAsAACoLAAAwCwAAMgsAADMLAAA1CwAAOQsAAD0LAAA9CwAAXAsAAF0LAABfCwAAYQsAAHELAABxCwAAgwsAAIMLAACFCwAAigsAAI4LAACQCwAAkgsAAJULAACZCwAAmgsAAJwLAACcCwAAngsAAJ8LAACjCwAApAsAAKgLAACqCwAArgsAALkLAADQCwAA0AsAAAUMAAAMDAAADgwAABAMAAASDAAAKAwAACoMAAA5DAAAPQwAAD0MAABYDAAAWgwAAF0MAABdDAAAYAwAAGEMAACADAAAgAwAAIUMAACMDAAAjgwAAJAMAACSDAAAqAwAAKoMAACzDAAAtQwAALkMAAC9DAAAvQwAAN0MAADeDAAA4AwAAOEMAADxDAAA8gwAAAQNAAAMDQAADg0AABANAAASDQAAOg0AAD0NAAA9DQAATg0AAE4NAABUDQAAVg0AAF8NAABhDQAAeg0AAH8NAACFDQAAlg0AAJoNAACxDQAAsw0AALsNAAC9DQAAvQ0AAMANAADGDQAAAA8AAAAPAABADwAARw8AAEkPAABsDwAAiA8AAIwPAACgEAAAxRAAAMcQAADHEAAAzRAAAM0QAADQEAAA+hAAAPwQAABIEgAAShIAAE0SAABQEgAAVhIAAFgSAABYEgAAWhIAAF0SAABgEgAAiBIAAIoSAACNEgAAkBIAALASAACyEgAAtRIAALgSAAC+EgAAwBIAAMASAADCEgAAxRIAAMgSAADWEgAA2BIAABATAAASEwAAFRMAABgTAABaEwAAgBMAAI8TAACgEwAA9RMAAPgTAAD9EwAAARQAAGwWAABvFgAAfxYAAIEWAACaFgAAoBYAAOoWAADuFgAA+BYAAAAXAAARFwAAHxcAADEXAABAFwAAURcAAGAXAABsFwAAbhcAAHAXAAAgGAAAeBgAAIAYAACEGAAAhxgAAKgYAACqGAAAqhgAALAYAAD1GAAAABkAAB4ZAAAAGgAAFhoAAAUbAAAzGwAARRsAAEwbAACDGwAAoBsAAK4bAACvGwAAuhsAAOUbAAAAHAAAIxwAAE0cAABPHAAAWhwAAH0cAACAHAAAiBwAAJAcAAC6HAAAvRwAAL8cAADpHAAA7BwAAO4cAADzHAAA9RwAAPYcAAD6HAAA+hwAAAAdAAC/HQAAAB4AABUfAAAYHwAAHR8AACAf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AAA9HgAAPx4AAD8eAABBHgAAQR4AAEMeAABDHgAARR4AAEUeAABHHgAARx4AAEkeAABJHgAASx4AAEseAABNHgAATR4AAE8eAABPHgAAUR4AAFEeAABTHgAAUx4AAFUeAABVHgAAVx4AAFceAABZHgAAWR4AAFseAABbHgAAXR4AAF0eAABfHgAAXx4AAGEeAABhHgAAYx4AAGMeAABlHgAAZR4AAGceAABnHgAAaR4AAGkeAABrHgAAax4AAG0eAABtHgAAbx4AAG8eAABxHgAAcR4AAHMeAABzHgAAdR4AAHUeAAB3HgAAdx4AAHkeAAB5HgAAex4AAHseAAB9HgAAfR4AAH8eAAB/HgAAgR4AAIEeAACDHgAAgx4AAIUeAACFHgAAhx4AAIceAACJHgAAiR4AAIseAACLHgAAjR4AAI0eAACPHgAAjx4AAJEeAACRHgAAkx4AAJMeAACVHgAAnR4AAJ8eAACfHgAAoR4AAKEeAACjHgAAox4AAKUeAAClHgAApx4AAKceAACpHgAAqR4AAKseAACrHgAArR4AAK0eAACvHgAArx4AALEeAACxHgAAsx4AALMeAAC1HgAAtR4AALceAAC3HgAAuR4AALkeAAC7HgAAux4AAL0eAAC9HgAAvx4AAL8eAADBHgAAwR4AAMMeAADDHgAAxR4AAMUeAADHHgAAxx4AAMkeAADJHgAAyx4AAMseAADNHgAAzR4AAM8eAADPHgAA0R4AANEeAADTHgAA0x4AANUeAADVHgAA1x4AANceAADZHgAA2R4AANseAADbHgAA3R4AAN0eAADfHgAA3x4AAOEeAADhHgAA4x4AAOMeAADlHgAA5R4AAOceAADnHgAA6R4AAOkeAADrHgAA6x4AAO0eAADtHgAA7x4AAO8eAADxHgAA8R4AAPMeAADzHgAA9R4AAPUeAAD3HgAA9x4AAPkeAAD5HgAA+x4AAPseAAD9HgAA/R4AAP8eAAAHHwAAEB8AABUfAAAgHwAAJx8AADAfAAA3HwAAQB8AAEUfAABQHwAAVx8AAGAfAABnHwAAcB8AAH0fAACAHwAAhx8AAJAfAACXHwAAoB8AAKcfAACwHwAAtB8AALYfAAC3HwAAvh8AAL4fAADCHwAAxB8AAMYfAADHHwAA0B8AANMfAADWHwAA1x8AAOAfAADnHwAA8h8AAPQfAAD2HwAA9x8AAHEgAABxIAAAfyAAAH8gAACQIAAAnCAAAAohAAAKIQAADiEAAA8hAAATIQAAEyEAAC8hAAAvIQAANCEAADQhAAA5IQAAOSEAADwhAAA9IQAARiEAAEkhAABOIQAATiEAAHAhAAB/IQAAhCEAAIQhAADQJAAA6SQAADAsAABfLAAAYSwAAGEsAABlLAAAZiwAAGgsAABoLAAAaiwAAGosAABsLAAAbCwAAHEsAABxLAAAcywAAHQsAAB2LAAAfSwAAIEsAACBLAAAgywAAIMsAACFLAAAhSwAAIcsAACHLAAAiSwAAIksAACLLAAAiywAAI0sAACNLAAAjywAAI8sAACRLAAAkSwAAJMsAACTLAAAlSwAAJUsAACXLAAAlywAAJksAACZLAAAmywAAJssAACdLAAAnSwAAJ8sAACfLAAAoSwAAKEsAACjLAAAoywAAKUsAAClLAAApywAAKcsAACpLAAAqSwAAKssAACrLAAArSwAAK0sAACvLAAArywAALEsAACxLAAAsywAALMsAAC1LAAAtSwAALcsAAC3LAAAuSwAALksAAC7LAAAuywAAL0sAAC9LAAAvywAAL8sAADBLAAAwSwAAMMsAADDLAAAxSwAAMUsAADHLAAAxywAAMksAADJLAAAyywAAMssAADNLAAAzSwAAM8sAADPLAAA0SwAANEsAADTLAAA0ywAANUsAADVLAAA1ywAANcsAADZLAAA2SwAANssAADbLAAA3SwAAN0sAADfLAAA3ywAAOEsAADhLAAA4ywAAOQsAADsLAAA7CwAAO4sAADuLAAA8ywAAPMsAAAALQAAJS0AACctAAAnLQAALS0AAC0tAABBpgAAQaYAAEOmAABDpgAARaYAAEWmAABHpgAAR6YAAEmmAABJpgAAS6YAAEumAABNpgAATaYAAE+mAABPpgAAUaYAAFGmAABTpgAAU6YAAFWmAABVpgAAV6YAAFemAABZpgAAWaYAAFumAABbpgAAXaYAAF2mAABfpgAAX6YAAGGmAABhpgAAY6YAAGOmAABlpgAAZaYAAGemAABnpgAAaaYAAGmmAABrpgAAa6YAAG2mAABtpgAAgaYAAIGmAACDpgAAg6YAAIWmAACFpgAAh6YAAIemAACJpgAAiaYAAIumAACLpgAAjaYAAI2mAACPpgAAj6YAAJGmAACRpgAAk6YAAJOmAACVpgAAlaYAAJemAACXpgAAmaYAAJmmAACbpgAAnaYAACOnAAAjpwAAJacAACWnAAAnpwAAJ6cAACmnAAAppwAAK6cAACunAAAtpwAALacAAC+nAAAxpwAAM6cAADOnAAA1pwAANacAADenAAA3pwAAOacAADmnAAA7pwAAO6cAAD2nAAA9pwAAP6cAAD+nAABBpwAAQacAAEOnAABDpwAARacAAEWnAABHpwAAR6cAAEmnAABJpwAAS6cAAEunAABNpwAATacAAE+nAABPpwAAUacAAFGnAABTpwAAU6cAAFWnAABVpwAAV6cAAFenAABZpwAAWacAAFunAABbpwAAXacAAF2nAABfpwAAX6cAAGGnAABhpwAAY6cAAGOnAABlpwAAZacAAGenAABnpwAAaacAAGmnAABrpwAAa6cAAG2nAABtpwAAb6cAAHinAAB6pwAAeqcAAHynAAB8pwAAf6cAAH+nAACBpwAAgacAAIOnAACDpwAAhacAAIWnAACHpwAAh6cAAIynAACMpwAAjqcAAI6nAACRpwAAkacAAJOnAACVpwAAl6cAAJenAACZpwAAmacAAJunAACbpwAAnacAAJ2nAACfpwAAn6cAAKGnAAChpwAAo6cAAKOnAAClpwAApacAAKenAACnpwAAqacAAKmnAACvpwAAr6cAALWnAAC1pwAAt6cAALenAAC5pwAAuacAALunAAC7pwAAvacAAL2nAAC/pwAAv6cAAMGnAADBpwAAw6cAAMOnAADIpwAAyKcAAMqnAADKpwAA0acAANGnAADTpwAA06cAANWnAADVpwAA16cAANenAADZpwAA2acAAPKnAAD0pwAA9qcAAPanAAD4pwAA+qcAADCrAABaqwAAXKsAAGmrAABwqwAAv6sAAAD7AAAG+wAAE/sAABf7AABB/wAAWv8AACgEAQBPBAEA2AQBAPsEAQCXBQEAoQUBAKMFAQCxBQEAswUBALkFAQC7BQEAvAUBAIAHAQCABwEAgwcBAIUHAQCHBwEAsAcBALIHAQC6BwEAwAwBAPIMAQDAGAEA3xgBAGBuAQB/bgEAGtQBADPUAQBO1AEAVNQBAFbUAQBn1AEAgtQBAJvUAQC21AEAudQBALvUAQC71AEAvdQBAMPUAQDF1AEAz9QBAOrUAQAD1QEAHtUBADfV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AADmHgAA5h4AAOgeAADoHgAA6h4AAOoeAADsHgAA7B4AAO4eAADuHgAA8B4AAPAeAADyHgAA8h4AAPQeAAD0HgAA9h4AAPYeAAD4HgAA+B4AAPoeAAD6HgAA/B4AAPweAAD+HgAA/h4AAAgfAAAPHwAAGB8AAB0fAAAoHwAALx8AADgfAAA/HwAASB8AAE0fAABZHwAAWR8AAFsfAABbHwAAXR8AAF0fAABfHwAAXx8AAGgfAABvHwAAiB8AAI8fAACYHwAAnx8AAKgfAACvHwAAuB8AALwfAADIHwAAzB8AANgfAADbHwAA6B8AAOwfAAD4HwAA/B8AAAIhAAACIQAAByEAAAchAAALIQAADSEAABAhAAASIQAAFSEAABUhAAAZIQAAHSEAACQhAAAkIQAAJiEAACYhAAAoIQAAKCEAACohAAAtIQAAMCEAADMhAAA+IQAAPyEAAEUhAABFIQAAYCEAAG8hAACDIQAAgyEAALYkAADPJAAAACwAAC8sAABgLAAAYCwAAGIsAABkLAAAZywAAGcsAABpLAAAaSwAAGssAABrLAAAbSwAAHAsAAByLAAAciwAAHUsAAB1LAAAfiwAAIAsAACCLAAAgiwAAIQsAACELAAAhiwAAIYsAACILAAAiCwAAIosAACKLAAAjCwAAIwsAACOLAAAjiwAAJAsAACQLAAAkiwAAJIsAACULAAAlCwAAJYsAACWLAAAmCwAAJgsAACaLAAAmiwAAJwsAACcLAAAniwAAJ4sAACgLAAAoCwAAKIsAACiLAAApCwAAKQsAACmLAAApiwAAKgsAACoLAAAqiwAAKosAACsLAAArCwAAK4sAACuLAAAsCwAALAsAACyLAAAsiwAALQsAAC0LAAAtiwAALYsAAC4LAAAuCwAALosAAC6LAAAvCwAALwsAAC+LAAAviwAAMAsAADALAAAwiwAAMIsAADELAAAxCwAAMYsAADGLAAAyCwAAMgsAADKLAAAyiwAAMwsAADMLAAAziwAAM4sAADQLAAA0CwAANIsAADSLAAA1CwAANQsAADWLAAA1iwAANgsAADYLAAA2iwAANosAADcLAAA3CwAAN4sAADeLAAA4CwAAOAsAADiLAAA4iwAAOssAADrLAAA7SwAAO0sAADyLAAA8iwAAECmAABApgAAQqYAAEKmAABEpgAARKYAAEamAABGpgAASKYAAEimAABKpgAASqYAAEymAABMpgAATqYAAE6mAABQpgAAUKYAAFKmAABSpgAAVKYAAFSmAABWpgAAVqYAAFimAABYpgAAWqYAAFqmAABcpgAAXKYAAF6mAABepgAAYKYAAGCmAABipgAAYqYAAGSmAABkpgAAZqYAAGamAABopgAAaKYAAGqmAABqpgAAbKYAAGymAACApgAAgKYAAIKmAACCpgAAhKYAAISmAACGpgAAhqYAAIimAACIpgAAiqYAAIqmAACMpgAAjKYAAI6mAACOpgAAkKYAAJCmAACSpgAAkqYAAJSmAACUpgAAlqYAAJamAACYpgAAmKYAAJqmAACapgAAIqcAACKnAAAkpwAAJKcAACanAAAmpwAAKKcAACinAAAqpwAAKqcAACynAAAspwAALqcAAC6nAAAypwAAMqcAADSnAAA0pwAANqcAADanAAA4pwAAOKcAADqnAAA6pwAAPKcAADynAAA+pwAAPqcAAECnAABApwAAQqcAAEKnAABEpwAARKcAAEanAABGpwAASKcAAEinAABKpwAASqcAAEynAABMpwAATqcAAE6nAABQpwAAUKcAAFKnAABSpwAAVKcAAFSnAABWpwAAVqcAAFinAABYpwAAWqcAAFqnAABcpwAAXKcAAF6nAABepwAAYKcAAGCnAABipwAAYqcAAGSnAABkpwAAZqcAAGanAABopwAAaKcAAGqnAABqpwAAbKcAAGynAABupwAAbqcAAHmnAAB5pwAAe6cAAHunAAB9pwAAfqcAAICnAACApwAAgqcAAIKnAACEpwAAhKcAAIanAACGpwAAi6cAAIunAACNpwAAjacAAJCnAACQpwAAkqcAAJKnAACWpwAAlqcAAJinAACYpwAAmqcAAJqnAACcpwAAnKcAAJ6nAACepwAAoKcAAKCnAACipwAAoqcAAKSnAACkpwAApqcAAKanAACopwAAqKcAAKqnAACupwAAsKcAALSnAAC2pwAAtqcAALinAAC4pwAAuqcAALqnAAC8pwAAvKcAAL6nAAC+pwAAwKcAAMCnAADCpwAAwqcAAMSnAADHpwAAyacAAMmnAADQpwAA0KcAANanAADWpwAA2KcAANinAAD1pwAA9acAACH/AAA6/wAAAAQBACcEAQCwBAEA0wQBAHAFAQB6BQEAfAUBAIoFAQCMBQEAkgUBAJQFAQCVBQEAgAwBALIMAQCgGAEAvxgBAEBuAQBfbgEAANQBABnUAQA01AEATdQBAGjUAQCB1AEAnNQBAJzUAQCe1AEAn9QBAKLUAQCi1AEApdQBAKbUAQCp1AEArNQBAK7UAQC11AEA0NQBAOnUAQAE1QEABdUBAAfVAQAK1QEADdUBABTVAQAW1QEAHNUBADjVAQA51QEAO9UBAD7VAQBA1QEARNUBAEbVAQBG1QEAStUBAFDVAQBs1QEAhdUBAKDVAQC51QEA1NUBAO3VAQAI1gEAIdYBADzWAQBV1gEAcNYBAInWAQCo1gEAwNYBAOLWAQD61gEAHNcBADTXAQBW1wEAbtcBAJDXAQCo1wEAytcBAMrXAQAA6QEAIekBADDxAQBJ8QEAUPEBAGnxAQBw8QEAifEBAJaHIgAFAAAAaIYlAAQAAAC+YyIAAgAAAOA4JQABAAAAoociAAUAAACIhiUALQAAAPRjIgAGAAAA8IclADkBAAAoWyIABgAAALiRJQAVAAAAIGQiAAIAAADwRCUAAQAAALWHIgAFAAAAYJIlAJ0CAAC6hyIABwAAAEinJQBBAAAArociAAcAAABQqSUAHwIAAM+HIgAJAAAASLolABMAAADvhyIABQAAAOC6JQBNAAAA44ciAAMAAABIvSUAAgAAAOuHIgACAAAAWL0lAAkAAAD2hyIABQAAAKC9JQCMAgAAJBoiAGYAAAB3AwAAHAAAACQaIgBmAAAAqgMAAAkAAAAkGiIAZgAAAKsDAAAJAAAAJBoiAGYAAACuAwAADwAAACQaIgBmAAAAoAMAAA0AAAAkGiIAZgAAAJ0DAAANAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtc3ludGF4LTAuOC40L3NyYy91dGY4LnJzAEDTJQBjAAAAQQEAABoAAABA0yUAYwAAALQBAAAtAAAAQNMlAGMAAAC1AQAAKwAAAEDTJQBjAAAAuAEAAAkAAABJbnRlcnZhbFNldHJhbmdlc2ZvbGRlZExpdGVyYWxDbGFzc1VuaWNvZGVDbGFzc0J5dGVzUmVwZXRpdGlvbkdyb3Vwb2xkX2ZsYWdzQ29uY2F0QWx0ZXJuYXRpb25BbHRlcm5hdGlvbkJyYW5jaAAAAAAAAAEAAAABAAAA/AMAAAAAAAAEAAAABAAAABkEAABjYXNlX2luc2Vuc2l0aXZlbXVsdGlfbGluZWRvdF9tYXRjaGVzX25ld19saW5lc3dhcF9ncmVlZHVuaWNvZGVjcmxmAHTUJQAQAAAAhNQlAAoAAACO1CUAFAAAAKLUJQAKAAAArNQlAAcAAACz1CUABAAAAEZsYWdzTG9va0NhcHR1cmVTdGFydEVuZFN0YXJ0TEZFbmRMRlN0YXJ0Q1JMRkVuZENSTEZXb3JkQXNjaWlXb3JkQXNjaWlOZWdhdGVXb3JkVW5pY29kZVdvcmRVbmljb2RlTmVnYXRlV29yZFN0YXJ0QXNjaWlXb3JkRW5kQXNjaWlXb3JkU3RhcnRVbmljb2RlV29yZEVuZFVuaWNvZGVXb3JkU3RhcnRIYWxmQXNjaWlXb3JkRW5kSGFsZkFzY2lpV29yZFN0YXJ0SGFsZlVuaWNvZGVXb3JkRW5kSGFsZlVuaWNvZGVpbmRleG1pbm1heGdyZWVkeSgpL3J1c3RjLzJlNjg4MmFjNWJlMjdhNzMyOTNkNmY3YWU1NjM5N2ZkZjMyODQ4ZGUvbGlicmFyeS9jb3JlL3NyYy9vcHMvZnVuY3Rpb24ucnMA49UlAFAAAACmAAAABQAAAAAAAAAAAAAAAQAAABoEAABJbnZhbGlkRGlnaXRQb3NPdmVyZmxvd05lZ092ZXJmbG93WmVybwAAAAAAAAwAAAAEAAAAGwQAABwEAAAdBAAAX1pOL3J1c3QvZGVwcy9ydXN0Yy1kZW1hbmdsZS0wLjEuMjQvc3JjL2xlZ2FjeS5ycwAAAJfWJQAuAAAAPQAAAAsAAACX1iUALgAAADoAAAALAAAAl9YlAC4AAAA2AAAACwAAAJfWJQAuAAAAZgAAABwAAACX1iUALgAAAG8AAAAnAAAAl9YlAC4AAABwAAAAHQAAAJfWJQAuAAAAcgAAACEAAACX1iUALgAAAHMAAAAaAAAAOjoAAJfWJQAuAAAAfgAAAB0AAACX1iUALgAAALQAAAAmAAAAl9YlAC4AAAC1AAAAIQAAAJfWJQAuAAAAigAAAEkAAACX1iUALgAAAIsAAAAfAAAAl9YlAC4AAACLAAAALwAAAEMAAACX1iUALgAAAJ0AAAA1AAAAl9YlAC4A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Q+xOCrQYMC4wYW55IHZhbHVlAAAAAAgAAAAEAAAAIQQAACIEAAAjBAAAdW5pdGEgYm9vbGVhbmEgc3RyaW5nYnl0ZSBhcnJheWJvb2xlYW4gYMMFJgAJAAAA7tsmAAEAAABpbnRlZ2VyIGAAAADcBSYACQAAAO7bJgABAAAAZmxvYXRpbmcgcG9pbnQgYPgFJgAQAAAA7tsmAAEAAABjaGFyYWN0ZXIgYAAYBiYACwAAAO7bJgABAAAAc3RyaW5nIAA0BiYABwAAAHVuaXQgdmFsdWVPcHRpb24gdmFsdWVuZXd0eXBlIHN0cnVjdHNlcXVlbmNldW5pdCB2YXJpYW50bmV3dHlwZSB2YXJpYW50dHVwbGUgdmFyaWFudHN0cnVjdCB2YXJpYW50L2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc2VyZGVfY29yZS0xLjAuMjI4L3NyYy9kZS9tb2QucnMApgYmAGUAAAAkCQAAEgAAAO7bJgABAAAA7tsmAAEAAABgIG9yIGAAAO7bJgABAAAALAcmAAYAAADu2yYAAQAAAG9uZSBvZiAsIC4wACQEAAAMAAAABAAAACUEAAAmBAAAJwQAAAAAAAAAAAAAAQAAALACAABA6CYATwAAADkGAAAUAAAAQOgmAE8AAAA5BgAAIQAAAEDoJgBPAAAALQYAABQAAABA6CYATwAAAC0GAAAhAAAADNEmAEsAAAAyCAAAHgAAAEDoJgBPAAAAugQAACQAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zZXJkZV9qc29uLTEuMC4xNDAvc3JjL2Vycm9yLnJzRU9GIHdoaWxlIHBhcnNpbmcgYSBsaXN0RU9GIHdoaWxlIHBhcnNpbmcgYW4gb2JqZWN0RU9GIHdoaWxlIHBhcnNpbmcgYSBzdHJpbmdFT0Ygd2hpbGUgcGFyc2luZyBhIHZhbHVlZXhwZWN0ZWQgYDpgZXhwZWN0ZWQgYCxgIG9yIGBdYGV4cGVjdGVkIGAsYCBvciBgfWBleHBlY3RlZCBpZGVudGV4cGVjdGVkIHZhbHVlZXhwZWN0ZWQgYCJgaW52YWxpZCBlc2NhcGVpbnZhbGlkIG51bWJlcm51bWJlciBvdXQgb2YgcmFuZ2VpbnZhbGlkIHVuaWNvZGUgY29kZSBwb2ludGNvbnRyb2wgY2hhcmFjdGVyIChcdTAwMDAtXHUwMDFGKSBmb3VuZCB3aGlsZSBwYXJzaW5nIGEgc3RyaW5na2V5IG11c3QgYmUgYSBzdHJpbmdpbnZhbGlkIHZhbHVlOiBleHBlY3RlZCBrZXkgdG8gYmUgYSBudW1iZXIgaW4gcXVvdGVzZmxvYXQga2V5IG11c3QgYmUgZmluaXRlIChnb3QgTmFOIG9yICsvLWluZilsb25lIGxlYWRpbmcgc3Vycm9nYXRlIGluIGhleCBlc2NhcGV0cmFpbGluZyBjb21tYXRyYWlsaW5nIGNoYXJhY3RlcnN1bmV4cGVjdGVkIGVuZCBvZiBoZXggZXNjYXBlcmVjdXJzaW9uIGxpbWl0IGV4Y2VlZGVkIGF0IGxpbmUgIGNvbHVtbiAAAAABAAAAAAAAAHgKJgAJAAAAgQomAAgAAABFcnJvcigsIGxpbmU6ICwgY29sdW1uOiCkCiYABgAAAKoKJgAIAAAAsgomAAoAAACzPicAAQAAAOAHJgBkAAAA9wEAACEAAADgByYAZAAAAPsBAAAMAAAA4AcmAGQAAAACAgAAIQAAAOAHJgBkAAAACwIAACoAAADgByYAZAAAAA8CAAAsAAAAaW52YWxpZCB0eXBlOiAsIGV4cGVjdGVkIAAAACwLJgAOAAAAOgsmAAsAAAAAAAAAAAAAAAEAAAAoBAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc2VyZGUtd2FzbS1iaW5kZ2VuLTAuNi41L3NyYy9saWIucnNoCyYAaAAAADUAAAAOAAAAAAAAAAAAAAABAAAALAMAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3NtYXJ0c3RyaW5nLTEuMC4xL3NyYy9pbmxpbmUucnPwCyYAZAAAACsAAAArAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc21hcnRzdHJpbmctMS4wLjEvc3JjL2JveGVkLnJzAGQMJgBjAAAAQQAAAA4AAABkDCYAYwAAAHYAAAAkAAAAOiAAAAAAAAAEAAAABAAAACkEAAAvcnVzdC9kZXBzL2RsbWFsbG9jLTAuMi44L3NyYy9kbG1hbGxvYy5yc2Fzc2VydGlvbiBmYWlsZWQ6IHBzaXplID49IHNpemUgKyBtaW5fb3ZlcmhlYWQA/AwmACkAAACsBAAACQAAAGFzc2VydGlvbiBmYWlsZWQ6IHBzaXplIDw9IHNpemUgKyBtYXhfb3ZlcmhlYWQAAPwMJgApAAAAsgQAAA0AAAB1c2Ugb2Ygc3RkOjp0aHJlYWQ6OmN1cnJlbnQoKSBpcyBub3QgcG9zc2libGUgYWZ0ZXIgdGhlIHRocmVhZCdzIGxvY2FsIGRhdGEgaGFzIGJlZW4gZGVzdHJveWVkAACkDSYAXgAAAGxpYnJhcnkvc3RkL3NyYy90aHJlYWQvY3VycmVudC5ycwAAAAwOJgAhAAAAAQEAAAkAAABBY2Nlc3NFcnJvcmNhbm5vdCBhY2Nlc3MgYSBUaHJlYWQgTG9jYWwgU3RvcmFnZSB2YWx1ZSBkdXJpbmcgb3IgYWZ0ZXIgZGVzdHJ1Y3Rpb246IABLDiYASAAAAGxpYnJhcnkvc3RkL3NyYy90aHJlYWQvbW9kLnJzZmFpbGVkIHRvIGdlbmVyYXRlIHVuaXF1ZSB0aHJlYWQgSUQ6IGJpdHNwYWNlIGV4aGF1c3RlZLkOJgA3AAAAnA4mAB0AAACpBAAADQAAAGxpYnJhcnkvc3RkL3NyYy9zeW5jL2xhenlfbG9jay5ycwAAAAgPJgAhAAAA0QAAABMAAABsaWJyYXJ5L3N0ZC9zcmMvYmFja3RyYWNlLnJzdW5zdXBwb3J0ZWQgYmFja3RyYWNlZGlzYWJsZWQgYmFja3RyYWNlADwPJgAcAAAAigEAAB0AAAAqBAAAEAAAAAQAAAArBAAALAQAAFdvdWxkQmxvY2tlbnRpdHkgbm90IGZvdW5kcGVybWlzc2lvbiBkZW5pZWRjb25uZWN0aW9uIHJlZnVzZWRjb25uZWN0aW9uIHJlc2V0aG9zdCB1bnJlYWNoYWJsZW5ldHdvcmsgdW5yZWFjaGFibGVjb25uZWN0aW9uIGFib3J0ZWRub3QgY29ubmVjdGVkYWRkcmVzcyBpbiB1c2VhZGRyZXNzIG5vdCBhdmFpbGFibGVuZXR3b3JrIGRvd25icm9rZW4gcGlwZWVudGl0eSBhbHJlYWR5IGV4aXN0c29wZXJhdGlvbiB3b3VsZCBibG9ja25vdCBhIGRpcmVjdG9yeWlzIGEgZGlyZWN0b3J5ZGlyZWN0b3J5IG5vdCBlbXB0eXJlYWQtb25seSBmaWxlc3lzdGVtIG9yIHN0b3JhZ2UgbWVkaXVtZmlsZXN5c3RlbSBsb29wIG9yIGluZGlyZWN0aW9uIGxpbWl0IChlLmcuIHN5bWxpbmsgbG9vcClzdGFsZSBuZXR3b3JrIGZpbGUgaGFuZGxlaW52YWxpZCBpbnB1dCBwYXJhbWV0ZXJpbnZhbGlkIGRhdGF0aW1lZCBvdXR3cml0ZSB6ZXJvbm8gc3RvcmFnZSBzcGFjZXNlZWsgb24gdW5zZWVrYWJsZSBmaWxlcXVvdGEgZXhjZWVkZWRmaWxlIHRvbyBsYXJnZXJlc291cmNlIGJ1c3lleGVjdXRhYmxlIGZpbGUgYnVzeWRlYWRsb2NrY3Jvc3MtZGV2aWNlIGxpbmsgb3IgcmVuYW1ldG9vIG1hbnkgbGlua3NpbnZhbGlkIGZpbGVuYW1lYXJndW1lbnQgbGlzdCB0b28gbG9uZ29wZXJhdGlvbiBpbnRlcnJ1cHRlZHVuc3VwcG9ydGVkdW5leHBlY3RlZCBlbmQgb2YgZmlsZW91dCBvZiBtZW1vcnlpbiBwcm9ncmVzc290aGVyIGVycm9ydW5jYXRlZ29yaXplZCBlcnJvck9zY29kZUtpbmRDdXN0b20gKG9zIGVycm9yIAAAAQAAAAAAAACrEiYACwAAALM+JwABAAAAbGlicmFyeS9zdGQvc3JjL3BhdGgucnMA0BImABcAAADTAgAAIQAAANASJgAXAAAA+gIAACwAAADQEiYAFwAAAPwCAAAmAAAA0BImABcAAAAJAwAAJwAAANASJgAXAAAAFQMAACcAAADQEiYAFwAAAH8DAAApAAAA0BImABcAAACAAwAAKwAAANASJgAXAAAAlQMAAC8AAADQEiYAFwAAAI0DAAAvAAAA0BImABcAAACbAwAAKwAAAGxpYnJhcnkvc3RkL3NyYy9zeXMvc3luYy9tdXRleC9ub190aHJlYWRzLnJziBMmACwAAAATAAAACQAAAGxpYnJhcnkvc3RkL3NyYy9zeW5jL3BvaXNvbi9vbmNlLnJzAMQTJgAjAAAA1gAAABQAAAA8dW5rbm93bj7vv71saWJyYXJ5L3N0ZC9zcmMvLi4vLi4vYmFja3RyYWNlL3NyYy9zeW1ib2xpemUvbW9kLnJzBBQmADQAAABnAQAAMAAAAAEAAAAAAAAA6AwmAAIAAAACAAAAAAAAAAAABAAAAAAAAAAAACAAAOggLSAAAQAAAAAAAABwFCYAAwAAAAIAAAAAAAAAAQAAAAEAAAAAAAAAIAAA6CAgICAgICAgICAgICAgICAgICBhdCAAACHiJgABAAAATm90Rm91bmRQZXJtaXNzaW9uRGVuaWVkQ29ubmVjdGlvblJlZnVzZWRDb25uZWN0aW9uUmVzZXRIb3N0VW5yZWFjaGFibGVOZXR3b3JrVW5yZWFjaGFibGVDb25uZWN0aW9uQWJvcnRlZE5vdENvbm5lY3RlZEFkZHJJblVzZUFkZHJOb3RBdmFpbGFibGVOZXR3b3JrRG93bkJyb2tlblBpcGVBbHJlYWR5RXhpc3RzTm90QURpcmVjdG9yeUlzQURpcmVjdG9yeURpcmVjdG9yeU5vdEVtcHR5UmVhZE9ubHlGaWxlc3lzdGVtRmlsZXN5c3RlbUxvb3BTdGFsZU5ldHdvcmtGaWxlSGFuZGxlSW52YWxpZElucHV0SW52YWxpZERhdGFUaW1lZE91dFdyaXRlWmVyb1N0b3JhZ2VGdWxsTm90U2Vla2FibGVRdW90YUV4Y2VlZGVkRmlsZVRvb0xhcmdlUmVzb3VyY2VCdXN5RXhlY3V0YWJsZUZpbGVCdXN5RGVhZGxvY2tDcm9zc2VzRGV2aWNlc1Rvb01hbnlMaW5rc0ludmFsaWRGaWxlbmFtZUFyZ3VtZW50TGlzdFRvb0xvbmdJbnRlcnJ1cHRlZFVuc3VwcG9ydGVkVW5leHBlY3RlZEVvZk91dE9mTWVtb3J5SW5Qcm9ncmVzc090aGVyVW5jYXRlZ29yaXplZG9wZXJhdGlvbiBzdWNjZXNzZnVsT25jZSBpbnN0YW5jZSBoYXMgcHJldmlvdXNseSBiZWVuIHBvaXNvbmVkAADkFiYAKgAAAG9uZS10aW1lIGluaXRpYWxpemF0aW9uIG1heSBub3QgYmUgcGVyZm9ybWVkIHJlY3Vyc2l2ZWx5GBcmADgAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9ydXN0Yy1oYXNoLTIuMS4xL3NyYy9saWIucnNYFyYAYAAAACMBAAAcAAAAWBcmAGAAAAAkAQAAKAAAAFgXJgBgAAAAJQEAACgAAABYFyYAYAAAAAgBAAArAAAAWBcmAGAAAAAIAQAAQgAAAFgXJgBgAAAABQEAACsAAABYFyYAYAAAAAUBAABCAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvdW5pY29kZS13aWR0aC0wLjIuMi9zcmMvdGFibGVzLnJzAAAoGCYAZgAAALgAAAAVAAAAKBgmAGYAAAC+AAAAGQAAAG9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm2wGCYAKAAAACQAAAAAAAAAAgAAANgYJgBjYW5ub3QgcmVjdXJzaXZlbHkgYWNxdWlyZSBtdXRlePAYJgAgAAAAL3J1c3RjLzJlNjg4MmFjNWJlMjdhNzMyOTNkNmY3YWU1NjM5N2ZkZjMyODQ4ZGUvbGlicmFyeS9zdGQvc3JjL3N5cy9zeW5jL211dGV4L25vX3RocmVhZHMucnMYGSYAXAAAABMAAAAJAAAArAIAAAwAAAAEAAAALQQAAC4EAACvAgAAAAAAAAAAAAABAAAAsAIAAAAAAAAAAAAAAQAAAC8EAAAAAAAABAAAAAQAAAA1AQAAAAAAAAQAAAAEAAAAMAQAAC9ydXN0Yy8yZTY4ODJhYzViZTI3YTczMjkzZDZmN2FlNTYzOTdmZGYzMjg0OGRlL2xpYnJhcnkvc3RkL3NyYy9wYXRoLnJzANwZJgBHAAAAuAwAABsAAADcGSYARwAAANsMAAAhAAAA3BkmAEcAAADODAAAIgAAAFRyeUZyb21TbGljZUVycm9yAAAAAAAAAAwAAAAEAAAAMQQAADIEAAAAAAAADAAAAAQAAAAzBAAANAQAAGNy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b2RlZ2VuL3NyYy9saWIucnMAFSwmACIAAACKAAAAWwAAAGwqJgACAAAAqComAAIAAAAVLCYAIgAAADsEAAAxAAAAqiomAAQAAAAVLCYAIgAAADoEAABBAAAAFSwmACIAAABMBAAAMQAAABUsJgAiAAAAQwQAADsAAABoKyYAAwAAABUsJgAiAAAAPQQAADgAAABcdTAwMDAAALgsJgAGAAAAXHUwMMgsJgAEAAAAIlx1ANQsJgADAAAAWGImAAIAAAAMvSYAAQAAAAy9JgABAAAADL0mAAEAAABcAFwjX19QVVJFX18vaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zbWFydHN0cmluZy0xLjAuMS9zcmMvb3BzLnJzAAAADC0mAGEAAAB6AAAAOwAAAE4EAAAMAAAABAAAAE8EAABQBAAArwIAAAAAAAAAAAAAAQAAAFEEAAAvcnVzdGMvMmU2ODgyYWM1YmUyN2E3MzI5M2Q2ZjdhZTU2Mzk3ZmRmMzI4NDhkZS9saWJyYXJ5L2NvcmUvc3JjL2NoYXIvbWV0aG9kcy5yc6gtJgBQAAAAEgcAAAkAAAAvaG9tZS9ub2RlL2J1aWxkL2RlcHMvc3djL2NyYXRlcy9oc3RyL3NyYy93dGY4L21vZC5yc1BhcnNlSW50RXJyb3JPa0VyclBhcnNlRmxvYXRFcnJvclVuZXhwZWN0ZWQgZW9mRGVjbGFyYXRpb24gaXMgbm90IGFsbG93ZWRVc2luZyBkZWNsYXJhdGlvbiBpcyBub3QgYWxsb3dlZFVzaW5nIGRlY2xhcmF0aW9uIGlzIG5vdCBhbGxvd2VkIGluIGZvci1pbiBsb29wVXNpbmcgZGVjbGFyYXRpb24gaXMgbm90IGVuYWJsZWQuIFNldCBqc2MucGFyc2VyLmV4cGxpY2l0UmVzb3VyY2VNYW5hZ2VtZW50IHRvIHRydWVVc2luZyBkZWNsYXJhdGlvbiBvbmx5IGFsbG93cyBpZGVudGlmaWVyc1VzaW5nIGRlY2xhcmF0aW9uIHJlcXVpcmVzIGluaXRpYWxpemVycHJpdmF0ZSBuYW1lcyBhcmUgbm90IGFsbG93ZWQgaW4gaW50ZXJmYWNlSW52YWxpZCBgc3VwZXIoKWBJbnZhbGlkIGFjY2VzcyB0byBzdXBlckluZGV4IHN1cGVyIHdpdGggcHJpdmF0ZSBuYW1lIGlzIG5vdCBhbGxvd2VkJ25ldy50YXJnZXQnIGlzIG9ubHkgYWxsb3dlZCBpbiB0aGUgYm9keSBvZiBhIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLCBmdW5jdGlvbiBleHByZXNzaW9uLCBvciBjbGFzcy5JbXBvcnQgaXMgbm90IGFsbG93ZWQgaGVyZUFuIGFycm93IGZ1bmN0aW9uIGlzIG5vdCBhbGxvd2VkIGhlcmVgZXhwb3J0YCBpcyBub3QgYWxsb3dlZCBoZXJlQSBnZXR0ZXIgb3IgYSBzZXR0ZXIgY2Fubm90IGJlIHJlYWRvbmx5QSBnZXR0ZXIgb3IgYSBzZXR0ZXIgY2Fubm90IGJlIG9wdGlvbmFsQSBgZ2V0YCBhY2Nlc3NvciBjYW5ub3QgaGF2ZSBwYXJhbWV0ZXJzQSBgc2V0YCBhY2Nlc3NvciBtdXN0IGhhdmUgZXhhY3RseSBvbmUgcGFyYW1ldGVydG9wIGxldmVsIGF3YWl0IGlzIG9ubHkgYWxsb3dlZCBpbiBtb2R1bGVMZWdhY3kgZGVjaW1hbCBlc2NhcGUgaXMgbm90IHBlcm1pdHRlZCBpbiBzdHJpY3QgbW9kZUxlZ2FjeSBvY3RhbCBlc2NhcGUgaXMgbm90IHBlcm1pdHRlZCBpbiBzdHJpY3QgbW9kZUludmFsaWQgY2hhcmFjdGVyIGluIGlkZW50aWZpZXJhIGJpbmFyeWFuIG9jdGFsYSBkZWNpbWFsYSBoZXhhZGVjaW1hbEV4cGVjdGVkICBkaWdpdC0yJgAJAAAANjImAAYAAABjcmF0ZXMvc3djX2VjbWFfcGFyc2VyL3NyYy9lcnJvci5ycwBMMiYAIwAAAEIBAAAaAAAAU2V0dGVyIHNob3VsZCBoYXZlIGV4YWN0bHkgb25lIHBhcmFtZXRlclJlc3QgcGF0dGVybiBpcyBub3QgYWxsb3dlZCBpbiBzZXR0ZXJVbnRlcm1pbmF0ZWQgYmxvY2sgY29tbWVudFVudGVybWluYXRlZCBzdHJpbmcgY29uc3RhbnRFeHBlY3RlZCB1bmljb2RlIGVzY2FwZVVuZXhwZWN0ZWQgZXNjYXBlIHNlcXVlbmNlIGluIHJlc2VydmVkIHdvcmQ6IAAaMyYALQAAAFVudGVybWluYXRlZCByZWdleHAgbGl0ZXJhbFVudGVybWluYXRlZCB0ZW1wbGF0ZUlkZW50aWZpZXIgY2Fubm90IGZvbGxvdyBudW1iZXJVbmV4cGVjdGVkIGNoYXJhY3RlciCfMyYAFQAAAEludmFsaWQgc3RyaW5nIGVzY2FwZUludmFsaWQgdW5pY29kZSBlc2NhcGVCYWQgY2hhcmFjdGVyIGVzY2FwZSBzZXF1ZW5jZSwgZXhwZWN0ZWQgAOczJgAoAAAARXhwZWN0ZWQgKywgLSBvciBkZWNpbWFsIGRpZ2l0IGFmdGVyIGVMZWdhY3kgY29tbWVudHMgY2Fubm90IGJlIHVzZWQgaW4gbW9kdWxlIGNvZGVgIGNhbm5vdCBiZSB1c2VkIGFzIGFuIGlkZW50aWZpZXIgaW4gc3RyaWN0IG1vZGUA7tsmAAEAAABrNCYAMAAAAGBhd2FpdGAgY2Fubm90IGJlIHVzZWQgYXMgYW4gaWRlbnRpZmllciBpbiBhbiBhc3luYyBjb250ZXh0J2V2YWwnIGFuZCAnYXJndW1lbnRzJyBjYW5ub3QgYmUgdXNlZCBhcyBhIGJpbmRpbmcgaWRlbnRpZmllciBpbiBzdHJpY3QgbW9kZSdhcmd1bWVudHMnIGlzIG9ubHkgYWxsb3dlZCBpbiBmdW5jdGlvbnMgYW5kIGNsYXNzIG1ldGhvZHNJbGxlZ2FsICd1c2Ugc3RyaWN0JyBkaXJlY3RpdmUgaW4gZnVuY3Rpb24gd2l0aCBub24tc2ltcGxlIHBhcmFtZXRlciBsaXN0LicqKicgY2Fubm90IGJlIGFwcGxpZWQgdG8gdW5hcnkvYXdhaXQgZXhwcmVzc2lvbi5VbmV4cGVjdGVkIHRva2VuICcjJ0xpbmVCcmVhayBjYW5ub3QgZm9sbG93ICd0aHJvdydVbmV4cGVjdGVkIGxpbmUgYnJlYWsgYmV0d2VlbiBhcnJvdyBoZWFkIGFuZCBhcnJvd1VuZXhwZWN0ZWQgdG9rZW4gYGAuIEV4cGVjdGVkIABNNiYAEgAAAF82JgAMAAAAICwgb3IgAAB/NiYAAwAAACBvciBVbmV4cGVjdGVkIHRva2VuLiBEaWQgeW91IG1lYW4gAJA2JgAfAAAAZOImAAEAAABjYW5ub3QgaW1wb3J0IGFzIHJlc2VydmVkIHdvcmRhc3NpZ25tZW50IHByb3BlcnR5IGlzIGludmFsaWQgc3ludGF4RXhwZWN0ZWQgJycsIGdvdCAnJwAAAzcmAAoAAAANNyYACAAAABU3JgABAAAARXhwZWN0ZWQgJzsnLCAnfScgb3IgPGVvZj5hd2FpdCogaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBhc3luYyBmdW5jdGlvbnMgcHJvcG9zYWwuIFVzZSBQcm9taXNlLmFsbCgpIGluc3RlYWQuQ2Fubm90IHVzZSBhIHJlc2VydmVkIHdvcmQgYXMgYSBzaG9ydGhhbmQgcHJvcGVydHlOdWxsaXNoIGNvYWxlc2Npbmcgb3BlcmF0b3IoPz8pIHJlcXVpcmVzIHBhcmVucyB3aGVuIG1peGluZyB3aXRoIGxvZ2ljYWwgb3BlcmF0b3JzQSBzd2l0Y2ggYmxvY2sgY2Fubm90IGhhdmUgbXVsdGlwbGUgZGVmYXVsdHNUcmFpbGluZyBjb21tYSBpc24ndCBwZXJtaXR0ZWQgYWZ0ZXIgYSByZXN0IGVsZW1lbnRSZXN0IGVsZW1lbnQgbXVzdCBiZSBmaW5hbCBlbGVtZW50UGFyZW50aGVzaXplZCBleHByZXNzaW9uIGNhbm5vdCBjb250YWluIHNwcmVhZCBvcGVyYXRvclBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbiBjYW5ub3QgYmUgZW1wdHlOb3QgYSBwYXR0ZXJuTm90IGFuIGV4cHJlc3Npb25DYW5ub3QgYXNzaWduIHRvIHRoaXNJbnZhbGlkIGFzc2lnbm1lbnQgdGFyZ2V0RXhwZWN0ZWQgaWRlbnRFeHBlY3RlZCAnOycgb3IgbGluZSBicmVha0xhYmVsICBpcyBhbHJlYWR5IGRlY2xhcmVkAAAAdzkmAAYAAAB9OSYAFAAAAEFuIGFzeW5jIGZ1bmN0aW9uIGNhbm5vdCBiZSBnZW5lcmF0b3InaW1wb3J0JywgYW5kICdleHBvcnQnIGFyZSBub3QgcGVybWl0dGVkIGhlcmUnaW1wb3J0JywgYW5kICdleHBvcnQnIGNhbm5vdCBiZSB1c2VkIG91dHNpZGUgb2YgbW9kdWxlIGNvZGUnaW1wb3J0Lm1ldGEnIGNhbm5vdCBiZSB1c2VkIG91dHNpZGUgb2YgbW9kdWxlIGNvZGUuRGVzdHJ1Y3R1cmluZyBiaW5kaW5ncyByZXF1aXJlIGluaXRpYWxpemVyc1dpdGggc3RhdGVtZW50IGFyZSBub3QgYWxsb3dlZCBpbiBzdHJpY3QgbW9kZVJldHVybiBzdGF0ZW1lbnQgaXMgbm90IGFsbG93ZWQgaGVyZUV4cGVjdGVkIG9uZSB2YXJpYWJsZSBiaW5kaW5nVW5leHBlY3RlZCBpbml0aWFsaXplciBpbiBmb3IgaW4vb2YgbG9vcEdlbmVyYXRvciBvciBhc3luYyBmdW5jdGlvbiBjYW5ub3QgYmUgbGFiZWxsZWRGdW5jdGlvbiBjYW5ub3QgYmUgbGFiZWxsZWQgaW4gc3RyaWN0IG1vZGUneWllbGQnIGNhbm5vdCBiZSB1c2VkIGFzIGEgcGFyYW1ldGVyIHdpdGhpbiBnZW5lcmF0b3JgYXdhaXRgIGV4cHJlc3Npb25zIGNhbm5vdCBiZSB1c2VkIGluIGEgcGFyYW1ldGVyIGluaXRpYWxpemVyLmZvciBhd2FpdCBzeW50YXggaXMgdmFsaWQgb25seSBmb3IgZm9yLW9mIHN0YXRlbWVudGF3YWl0IGlzbid0IGFsbG93ZWQgaW4gbm9uLWFzeW5jIGZ1bmN0aW9uVW50ZXJtaW5hdGVkIEpTWCBjb250ZW50c0pTWCBhdHRyaWJ1dGVzIG11c3Qgb25seSBiZSBhc3NpZ25lZCBhIG5vbi1lbXB0eSBleHByZXNzaW9uSlNYIHZhbHVlIHNob3VsZCBiZSBlaXRoZXIgYW4gZXhwcmVzc2lvbiBvciBhIHF1b3RlZCBKU1ggdGV4dEV4cGVjdGVkIGNvcnJlc3BvbmRpbmcgSlNYIGNsb3NpbmcgdGFnIGZvciA8PkV4cGVjdGVkIGNvcnJlc3BvbmRpbmcgSlNYIGNsb3NpbmcgdGFnIGZvciA8AAAADT0mACwAAACvyyYAAQAAAExlYWRpbmcgZGVjb3JhdG9ycyBtdXN0IGJlIGF0dGFjaGVkIHRvIGEgY2xhc3MgZGVjbGFyYXRpb25Vc2luZyB0aGUgZXhwb3J0IGtleXdvcmQgYmV0d2VlbiBhIGRlY29yYXRvciBhbmQgYSBjbGFzcyBpcyBub3QgYWxsb3dlZC4gUGxlYXNlIHVzZSBgZXhwb3J0IEBkZWMgY2xhc3NgIGluc3RlYWQuQSByZXF1aXJlZCBlbGVtZW50IGNhbm5vdCBmb2xsb3cgYW4gb3B0aW9uYWwgZWxlbWVudC5UeXBlc2NyaXB0IHBhcmFtZXRlciBwcm9wZXJ0eSBtdXN0IGJlIGFuIGlkZW50aWZpZXIgb3IgYXNzaWdubWVudCBwYXR0ZXJuVW5leHBlY3RlZCBzcGFjZSBiZXR3ZWVuICMgYW5kIGlkZW50aWZpZXJDb25zdHJ1Y3RvciBjYW4ndCBiZSBhbiBhc3luYyBmdW5jdGlvbkNsYXNzZXMgbWF5IG5vdCBoYXZlIGEgbm9uLXN0YXRpYyBmaWVsZCBuYW1lZCAnY29uc3RydWN0b3InQ2xhc3NlcyBjYW4ndCBoYXZlIGEgcHJpdmF0ZSBmaWVsZCBuYW1lZCAnI2NvbnN0cnVjdG9yJy4nIG1vZGlmaWVyIGNhbm5vdCBiZSB1c2VkIHdpdGggYSBwcml2YXRlIGlkZW50aWZpZXIAAAAVNyYAAQAAADY/JgAzAAAAQ2xhc3MgY29uc3RydWN0b3IgY2FuJ3QgYmUgYW4gYWNjZXNzb3IuQSBtZXRob2QgY2Fubm90IGJlIHJlYWRvbmx5QSBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgZ2VuZXJhdG9yQSBjbGFzcyBjYW4gb25seSBoYXZlIG9uZSBjb25zdHJ1Y3RvckEgYmluZGluZyBwYXR0ZXJuIHBhcmFtZXRlciBjYW5ub3QgYmUgb3B0aW9uYWwgaW4gYW4gaW1wbGVtZW50YXRpb24gc2lnbmF0dXJlLlN1cGVyIGNhbGwgY2Fubm90IGJlIG9wdGlvbmFsQ29uc3RydWN0b3IgaW4vYWZ0ZXIgYW4gb3B0aW9uYWwgY2hhaW5pbmcgaXMgbm90IGFsbG93ZWQuVGFnZ2VkIHRlbXBsYXRlIGxpdGVyYWwgaXMgbm90IGFsbG93ZWQgaW4gb3B0aW9uYWwgY2hhaW4uVHJhaWxpbmcgY29tbWEgaXMgZGlzYWxsb3dlZCBpbnNpZGUgaW1wb3J0KC4uLikgYXJndW1lbnRzYGltcG9ydCgpYCByZXF1aXJlcyBleGFjdGx5IG9uZSBvciB0d28gYXJndW1lbnRzZXhwb3J0IGRlZmF1bHQgc3RhdGVtZW50cyByZXF1aXJlZCBmcm9tICcuLi4nO2AgY2Fubm90IGJlIHVzZWQgd2l0aG91dCBgZnJvbWAgY2xhdXNlAADu2yYAAQAAAHhBJgAmAAAAYC4uLmAgbXVzdCBiZSBmb2xsb3dlZCBieSBhbiBpZGVudGlmaWVyIGluIGRlY2xhcmF0aW9uIGNvbnRleHRzQSBudW1lcmljIHNlcGFyYXRvciBpcyBvbmx5IGFsbG93ZWQgYmV0d2VlbiB0d28gZGlnaXRzQSBzdHJpbmcgbGl0ZXJhbCBjYW5ub3QgYmUgdXNlZCBhcyBhbiBpbXBvcnRlZCBiaW5kaW5nLgotIERpZCB5b3UgbWVhbiBgaW1wb3J0IHsgIiIgYXMgZm9vIH1gPwAlQiYAUgAAAHdCJgAMAAAAQSBzdHJpbmcgbGl0ZXJhbCBjYW5ub3QgYmUgdXNlZCBhcyBhbiBleHBvcnRlZCBiaW5kaW5nIHdpdGhvdXQgYGZyb21gLidjb25zdCcgZGVjbGFyYXRpb25zIG11c3QgYmUgaW5pdGlhbGl6ZWREdXBsaWNhdGVkIHJlZ3VsYXIgZXhwcmVzc2lvbiBmbGFnICcnLgJDJgAkAAAAJkMmAAIAAABVbmtub3duIHJlZ3VsYXIgZXhwcmVzc2lvbiBmbGFncy5FeHBlY3RlZCBhbiBpZGVudGlmaWVyRXhwZWN0ZWQgYSBzZW1pY29sb25UcmFpbGluZyBjb21tYSBpcyBub3QgYWxsb3dlZEEgcmVzdCBwYXJhbWV0ZXIgbXVzdCBiZSBsYXN0IGluIGEgcGFyYW1ldGVyIGxpc3RQYXJhbWV0ZXIgY2Fubm90IGhhdmUgcXVlc3Rpb24gbWFyayBhbmQgaW5pdGlhbGl6ZXInIG1vZGlmaWVyIG11c3QgcHJlY2VkZSAnJyBtb2RpZmllci4VNyYAAQAAAAREJgAZAAAAHUQmAAsAAAAnIG1vZGlmaWVyIGFscmVhZHkgc2Vlbi4VNyYAAQAAAEBEJgAYAAAAYGRlY2xhcmVgIG1vZGlmaWVyIGNhbm5vdCBhcHBlYXIgb24gY2xhc3MgZWxlbWVudHMgb2YgdGhpcyBraW5kYGRlY2xhcmVgIG1vZGlmaWVyIG5vdCBhbGxvd2VkIGZvciBjb2RlIGFscmVhZHkgaW4gYW4gYW1iaWVudCBjb250ZXh0YGFzeW5jYCBtb2RpZmllciBjYW5ub3QgYmUgdXNlZCBoZXJlQSByZXN0IHBhcmFtZXRlciBjYW5ub3QgYmUgb3B0aW9uYWxBIHJlc3QgcGFyYW1ldGVyIGNhbm5vdCBoYXZlIGFuIGluaXRpYWxpemVyanNjLnRhcmdldCBzaG91bGQgYmUgZXM1IG9yIHVwcGVyIHRvIHVzZSBnZXR0ZXIgLyBzZXR0ZXJMZWdhY3kgb2N0YWwgbGl0ZXJhbHMgYXJlIG5vdCBhdmFpbGFibGUgd2hlbiB0YXJnZXRpbmcgRUNNQVNjcmlwdCA1IGFuZCBoaWdoZXInIG1vZGlmaWVyIGNhbm5vdCBhcHBlYXIgb24gYSBjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbgAAABU3JgABAAAA5EUmADUAAABUeXBlIHBhcmFtZXRlcnMgY2Fubm90IGFwcGVhciBvbiBhIGNvbnN0cnVjdG9yIGRlY2xhcmF0aW9uQW4gaW5kZXggc2lnbmF0dXJlIG11c3QgaGF2ZSBleGFjdGx5IG9uZSBwYXJhbWV0ZXJUeXBlIHBhcmFtZXRlciBsaXN0IGNhbm5vdCBiZSBlbXB0eUludmFsaWQgdXNlIG9mICdhcmd1bWVudHMnIGluIHN0cmljdCBtb2RlJ2RlbGV0ZScgY2Fubm90IGJlIGNhbGxlZCBvbiBhbiBpZGVudGlmaWVyIGluIHN0cmljdCBtb2RlQSAnYnJlYWsnIHN0YXRlbWVudCBjYW4gb25seSBiZSB1c2VkIHdpdGhpbiBhbiBlbmNsb3NpbmcgaXRlcmF0aW9uIG9yIHN3aXRjaCBzdGF0ZW1lbnRUaGUgbGVmdC1oYW5kIHNpZGUgb2YgYSBgZm9yLi4ub2ZgIHN0YXRlbWVudCBtYXkgbm90IGJlIGBhc3luY2BKdW1wIHRhcmdldCBjYW5ub3QgY3Jvc3MgZnVuY3Rpb24gYm91bmRhcnlFeHByZXNzaW9uIGV4cGVjdGVkdHlwZSBleHBlY3RlZER1cGxpY2F0ZSBsYWJlbEEgJ2NvbnRpbnVlJyBzdGF0ZW1lbnQgY2FuIG9ubHkganVtcCB0byBhIGxhYmVsIG9mIGFuIGVuY2xvc2luZyBpdGVyYXRpb24gc3RhdGVtZW50QSAnYnJlYWsnIHN0YXRlbWVudCBjYW4gb25seSBqdW1wIHRvIGEgbGFiZWwgb2YgYW4gZW5jbG9zaW5nIHN0YXRlbWVudFZhcmlhYmxlIGRlY2xhcmF0aW9uIGxpc3QgY2Fubm90IGJlIGVtcHR5bGl0ZXJhbCBpbiBhbiBpbXBvcnQgdHlwZSBzaG91bGQgYmUgc3RyaW5nIGxpdGVyYWxBbiBvYmplY3QgbWVtYmVyIGNhbm5vdCBiZSBkZWNsYXJlZCBvcHRpb25hbENvbXB1dGVkIHByb3BlcnR5IG5hbWVzIGFyZSBub3QgYWxsb3dlZCBpbiBlbnVtc0EgY29tbWEgZXhwcmVzc2lvbiBpcyBub3QgYWxsb3dlZCBpbiBhIGNvbXB1dGVkIHByb3BlcnR5IG5hbWVgZXh0ZW5kc2AgY2xhdXNlIGFscmVhZHkgc2Vlbi4nZXh0ZW5kcycgY2xhdXNlIG11c3QgcHJlY2VkZSAnaW1wbGVtZW50cycgY2xhdXNlLkNsYXNzZXMgY2FuIG9ubHkgZXh0ZW5kIGEgc2luZ2xlIGNsYXNzYGltcGxlbWVudHNgIGNsYXVzZSBhbHJlYWR5IHNlZW5BbiBpbXBsZW1lbnRhdGlvbiBjYW5ub3QgYmUgZGVjbGFyZWQgaW4gYW1iaWVudCBjb250ZXh0c01vZGlmaWVycyBjYW5ub3QgYXBwZWFyIGhlcmVNZXJnZSBjb25mbGljdCBtYXJrZXIgZW5jb3VudGVyZWQuVHlwZSBhbm5vdGF0aW9uIGNhbm5vdCBhcHBlYXIgb24gYSBjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbkNhdGNoIGNsYXVzZSB2YXJpYWJsZSBjYW5ub3QgaGF2ZSBhIHR5cGUgYW5ub3RhdGlvbmBhYnN0cmFjdGAgbW9kaWZpZXIgY2FuIG9ubHkgYXBwZWFyIG9uIGEgY2xhc3Mgb3IgbWV0aG9kIGRlY2xhcmF0aW9uJyBtb2RpZmllciBjYW5ub3QgYmUgdXNlZCB3aXRoICcAAAAVNyYAAQAAAFVLJgAgAAAAHUQmAAsAAABBYnN0cmFjdCBtZXRob2RzIGNhbiBvbmx5IGFwcGVhciB3aXRoaW4gYW4gYWJzdHJhY3QgY2xhc3MuQWJzdHJhY3QgbWV0aG9kIGNhbm5vdCBoYXZlIGFuIGltcGxlbWVudGF0aW9uLkFic3RyYWN0IHByb3BlcnR5IGNhbm5vdCBoYXZlIGFuIGluaXRpYWxpemVyLicgbW9kaWZpZXIgY2Fubm90IGFwcGVhciBvbiBhIHR5cGUgcGFyYW1ldGVyAAAAFTcmAAEAAAAlTCYALAAAACcgbW9kaWZpZXIgY2FuIG9ubHkgYXBwZWFyIG9uIGEgdHlwZSBwYXJhbWV0ZXIgb2YgYSBjbGFzcywgaW50ZXJmYWNlIG9yIHR5cGUgYWxpYXMAABU3JgABAAAAZEwmAFIAAAAnIG1vZGlmaWVyIGNhbiBvbmx5IGFwcGVhciBvbiBhIHR5cGUgcGFyYW1ldGVyIG9mIGEgZnVuY3Rpb24sIG1ldGhvZCBvciBjbGFzcwAAABU3JgABAAAAyEwmAE0AAABUaGUgJ3R5cGUnIG1vZGlmaWVyIGNhbm5vdCBiZSB1c2VkIG9uIGEgbmFtZWQgaW1wb3J0IHdoZW4gJ2ltcG9ydCB0eXBlJyBpcyB1c2VkIG9uIGl0cyBpbXBvcnQgc3RhdGVtZW50LlRoZSAndHlwZScgbW9kaWZpZXIgY2Fubm90IGJlIHVzZWQgb24gYSBuYW1lZCBleHBvcnQgd2hlbiAnZXhwb3J0IHR5cGUnIGlzIHVzZWQgb24gaXRzIGV4cG9ydCBzdGF0ZW1lbnQuQSBwYXJhbWV0ZXIgcHJvcGVydHkgaXMgb25seSBhbGxvd2VkIGluIGEgY29uc3RydWN0b3IgaW1wbGVtZW50YXRpb25BIHBhcmFtZXRlciBpbml0aWFsaXplciBpcyBvbmx5IGFsbG93ZWQgaW4gYSBmdW5jdGlvbiBvciBjb25zdHJ1Y3RvciBpbXBsZW1lbnRhdGlvblRoZSBsZWZ0LWhhbmQgc2lkZSBvZiBhbiBhc3NpZ25tZW50IGV4cHJlc3Npb24gbXVzdCBiZSBhIHZhcmlhYmxlIG9yIGEgcHJvcGVydHkgYWNjZXNzLlRoZSAnd2l0aCcgc3RhdGVtZW50IGlzIG5vdCBzdXBwb3J0ZWQuIEFsbCBzeW1ib2xzIGluIGEgJ3dpdGgnIGJsb2NrIHdpbGwgaGF2ZSB0eXBlICdhbnknLkludmFsaWQgY2xhc3MgbmFtZWludGVyZmFjZSBuYW1lIGlzIGludmFsaWRBbiBlbnVtIG1lbWJlciBjYW5ub3QgaGF2ZSBhIG51bWVyaWMgbmFtZVRoZSBsZWZ0LWhhbmQgc2lkZSBvZiBhICdmb3IuLi5vZicgc3RhdGVtZW50IGNhbm5vdCB1c2UgYSB0eXBlIGFubm90YXRpb25UaGUgbGVmdC1oYW5kIHNpZGUgb2YgYSAnZm9yLi4uaW4nIHN0YXRlbWVudCBjYW5ub3QgYmUgYSBkZXN0cnVjdHVyaW5nIHBhdHRlcm5BbiBpbnRlcmZhY2UgY2FuIG9ubHkgZXh0ZW5kIGFuIGlkZW50aWZpZXIvcXVhbGlmaWVkLW5hbWUgd2l0aCBvcHRpb25hbCB0eXBlIGFyZ3VtZW50cy5UaGUgb3BlcmFuZCBvZiBhIGRlbGV0ZSBvcGVyYXRvciBtdXN0IGJlIGEgcHJvcGVydHkgcmVmZXJlbmNlLlRoaXMgbWVtYmVyIGNhbm5vdCBoYXZlIGFuICdvdmVycmlkZScgbW9kaWZpZXIgYmVjYXVzZSBpdHMgY29udGFpbmluZyBjbGFzcyBkb2VzIG5vdCBleHRlbmQgYW5vdGhlciBjbGFzcy5EZWNvcmF0b3JzIG1heSBub3QgYXBwZWFyIGFmdGVyIGBleHBvcnRgIG9yIGBleHBvcnQgZGVmYXVsdGAgaWYgdGhleSBhbHNvIGFwcGVhciBiZWZvcmUgYGV4cG9ydGAuQW4gYWNjZXNzaWJpbGl0eSBtb2RpZmllciBjYW5ub3QgYmUgdXNlZCB3aXRoIGEgcHJpdmF0ZSBpZGVudGlmaWVyLlR5cGUgYW5ub3RhdGlvbnMgbXVzdCBjb21lIGJlZm9yZSBkZWZhdWx0IGFzc2lnbm1lbnRzVHlwZXNjcmlwdCBub24tbnVsbCBhc3NlcnRpb24gb3BlcmF0b3IgaXMgbm90IGFsbG93ZWQgd2l0aCAnAANSJgA8AAAAFTcmAAEAAABUaGlzIHN5bnRheCBpcyByZXNlcnZlZCBpbiBmaWxlcyB3aXRoIHRoZSAubXRzIG9yIC5jdHMgZXh0ZW5zaW9uLiBVc2UgYW4gYGFzYCBleHByZXNzaW9uIGluc3RlYWQuVGhpcyBzeW50YXggaXMgcmVzZXJ2ZWQgaW4gZmlsZXMg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AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAAEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAABAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEAAAAAAAAAAAAAAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBPT09PTw8PDw8ID4+Pj4gY3JhdGVzL3N3Y19lY21hX3BhcnNlci9zcmMvbGV4ZXIvbW9kLnJzAABPYCYAJwAAAHEBAAAWAAAACC4mADUAAADRAAAAFAAAAE9gJgAnAAAA2AEAACgAAABPYCYAJwAAAOQBAAAeAAAAT2AmACcAAACYAAAAFQAAAMBUJgAzAAAAMQAAABcAAADAVCYAMwAAADYAAAAeAAAAT2AmACcAAACTAgAAJgAAAE9gJgAnAAAA/AIAACoAAABmYWlsZWQgdG8gcGFyc2UgZmxvYXQgbGl0ZXJhbAAAAE9gJgAnAAAATAQAABkAAABPYCYAJwAAAPsDAABWAAAAT2AmACcAAACtBAAAPgAAAL7LJgABAAAAA8smAAEAAABPYCYAJwAAAO4EAAAlAAAAT2AmACcAAADvBAAANQAAAGZhaWxlZCB0byBwYXJzZSBudW1iZXIgYXMgY2hhcgAAT2AmACcAAADQBAAADgAAAGZhaWxlZCB0byBwYXJzZSBzdHJpbmcgYXMgbnVtYmVyT2AmACcAAADOBAAALwAAADQgaGV4IGNoYXJhY3RlcnMxLTYgaGV4IGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIDAgdG8gMTBGRkZGLjEtNiBoZXggY2hhcmFjdGVyczIgaGV4IGNoYXJhY3RlcnMAAE9gJgAnAAAAYAYAADkAAABcdQAAWGImAAIAAAACAAAAAAAAAAAABAAAAAAAAAAAACAAAOl8fHx8fCAAAE9gJgAnAAAAZggAACAAAABPYCYAJwAAAKsIAAAmAAAAAQAAAAAAAABj4iYAAQAAAAEAAAAAAAAAIeImAAEAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBVc2luZyBpcyBub3QgYSB2YWxpZCBkZWNsYXJhdGlvbiBmb3IgYGRlY2xhcmVgIGtleXdvcmTEYiYAYAAAAGNyYXRlcy9zd2NfZWNtYV9wYXJzZXIvc3JjL3BhcnNlci90eXBlc2NyaXB0LnJzACxjJgAvAAAALAAAABwAAABFb2ZEZWNsTm90QWxsb3dlZFVzaW5nRGVjbE5vdEFsbG93ZWRVc2luZ0RlY2xOb3RBbGxvd2VkRm9yRm9ySW5Mb29wVXNpbmdEZWNsTm90RW5hYmxlZEludmFsaWROYW1lSW5Vc2luZ0RlY2xJbml0UmVxdWlyZWRGb3JVc2luZ0RlY2xQcml2YXRlTmFtZUluSW50ZXJmYWNlSW52YWxpZFN1cGVyQ2FsbEludmFsaWRTdXBlckludmFsaWRTdXBlclByaXZhdGVOYW1lSW52YWxpZE5ld1RhcmdldEludmFsaWRJbXBvcnRBcnJvd05vdEFsbG93ZWRFeHBvcnROb3RBbGxvd2VkR2V0dGVyU2V0dGVyQ2Fubm90QmVSZWFkb25seUdldHRlclNldHRlckNhbm5vdEJlT3B0aW9uYWxHZXR0ZXJQYXJhbVNldHRlclBhcmFtVG9wTGV2ZWxBd2FpdEluU2NyaXB0TGVnYWN5RGVjaW1hbExlZ2FjeU9jdGFsSW52YWxpZElkZW50Q2hhckV4cGVjdGVkRGlnaXRyYWRpeFNldHRlclBhcmFtUmVxdWlyZWRSZXN0UGF0SW5TZXR0ZXJVbnRlcm1pbmF0ZWRCbG9ja0NvbW1lbnRVbnRlcm1pbmF0ZWRTdHJMaXRFeHBlY3RlZFVuaWNvZGVFc2NhcGVFc2NhcGVJblJlc2VydmVkV29yZHdvcmRVbnRlcm1pbmF0ZWRSZWdFeHBVbnRlcm1pbmF0ZWRUcGxJZGVudEFmdGVyTnVtVW5leHBlY3RlZENoYXJJbnZhbGlkU3RyRXNjYXBlSW52YWxpZFVuaWNvZGVFc2NhcGVCYWRDaGFyYWN0ZXJFc2NhcGVTZXF1ZW5jZWV4cGVjdGVkTnVtTGl0VGVybWluYXRlZFdpdGhFeHBMZWdhY3lDb21tZW50SW5Nb2R1bGVJbnZhbGlkSWRlbnRJblN0cmljdEludmFsaWRJZGVudEluQXN5bmNFdmFsQW5kQXJndW1lbnRzSW5TdHJpY3RBcmd1bWVudHNJbkNsYXNzRmllbGRJbGxlZ2FsTGFuZ3VhZ2VNb2RlRGlyZWN0aXZlVW5hcnlJbkV4cGxlZnRfc3Bhbkhhc2hMaW5lQnJlYWtJblRocm93TGluZUJyZWFrQmVmb3JlQXJyb3dVbmV4cGVjdGVkZ290VW5leHBlY3RlZFRva2VuV2l0aFN1Z2dlc3Rpb25zY2FuZGlkYXRlX2xpc3RSZXNlcnZlZFdvcmRJbkltcG9ydEFzc2lnblByb3BlcnR5RXhwZWN0ZWRFeHBlY3RlZFNlbWlGb3JFeHByU3RtdEF3YWl0U3RhclJlc2VydmVkV29yZEluT2JqU2hvcnRoYW5kT3JQYXROdWxsaXNoQ29hbGVzY2luZ1dpdGhMb2dpY2FsT3BNdWx0aXBsZURlZmF1bHRwcmV2aW91c0NvbW1hQWZ0ZXJSZXN0RWxlbWVudE5vbkxhc3RSZXN0UGFyYW1TcHJlYWRJblBhcmVuRXhwckVtcHR5UGFyZW5FeHBySW52YWxpZFBhdEludmFsaWRFeHByTm90U2ltcGxlQXNzaWduSW52YWxpZEFzc2lnblRhcmdldEV4cGVjdGVkSWRlbnRFeHBlY3RlZFNlbWlEdXBsaWNhdGVMYWJlbEFzeW5jR2VuZXJhdG9yTm9uVG9wTGV2ZWxJbXBvcnRFeHBvcnRJbXBvcnRFeHBvcnRJblNjcmlwdEltcG9ydE1ldGFJblNjcmlwdFBhdFZhcldpdGhvdXRJbml0V2l0aEluU3RyaWN0UmV0dXJuTm90QWxsb3dlZFRvb01hbnlWYXJJbkZvckluSGVhZFZhckluaXRpYWxpemVySW5Gb3JJbkhlYWRMYWJlbGxlZEdlbmVyYXRvck9yQXN5bmNMYWJlbGxlZEZ1bmN0aW9uSW5TdHJpY3RZaWVsZFBhcmFtSW5HZW5Bd2FpdFBhcmFtSW5Bc3luY0F3YWl0Rm9yU3RtdEF3YWl0SW5GdW5jdGlvblVudGVybWluYXRlZEpTWENvbnRlbnRzRW1wdHlKU1hBdHRySW52YWxpZEpTWFZhbHVlSlNYRXhwZWN0ZWRDbG9zaW5nVGFnRm9yTHRHdEpTWEV4cGVjdGVkQ2xvc2luZ1RhZ0ludmFsaWRMZWFkaW5nRGVjb3JhdG9yRGVjb3JhdG9yT25FeHBvcnRUc1JlcXVpcmVkQWZ0ZXJPcHRpb25hbFRzSW52YWxpZFBhcmFtUHJvcFBhdFNwYWNlQmV0d2Vlbkhhc2hBbmRJZGVudEFzeW5jQ29uc3RydWN0b3JQcm9wZXJ0eU5hbWVkQ29uc3RydWN0b3JQcml2YXRlQ29uc3RydWN0b3JQcml2YXRlTmFtZU1vZGlmaWVyQ29uc3RydWN0b3JBY2Nlc3NvclJlYWRPbmx5TWV0aG9kR2VuZXJhdG9yQ29uc3RydWN0b3JEdXBsaWNhdGVDb25zdHJ1Y3RvclRzQmluZGluZ1BhdENhbm5vdEJlT3B0aW9uYWxTdXBlckNhbGxPcHRpb25hbE9wdENoYWluQ2Fubm90Rm9sbG93Q29uc3RydWN0b3JDYWxsVGFnZ2VkVHBsSW5PcHRDaGFpblRyYWlsaW5nQ29tbWFJbnNpZGVJbXBvcnRJbXBvcnRSZXF1aXJlc09uZU9yVHdvQXJnc0V4cG9ydERlZmF1bHRXaXRoT3V0RnJvbUV4cG9ydEV4cGVjdEZyb21Eb3RzV2l0aG91dElkZW50aWZpZXJOdW1lcmljU2VwYXJhdG9ySXNBbGxvd2VkT25seUJldHdlZW5Ud29EaWdpdHNJbXBvcnRCaW5kaW5nSXNTdHJpbmdFeHBvcnRCaW5kaW5nSXNTdHJpbmdDb25zdERlY2xhcmF0aW9uc1JlcXVpcmVJbml0aWFsaXphdGlvbkR1cGxpY2F0ZWRSZWdFeHBGbGFnc1Vua25vd25SZWdFeHBGbGFnc1RTMTAwM1RTMTAwNVRTMTAwOVRTMTAxNFRTMTAxNVRTMTAyOVRTMTAzMFRTMTAzMVRTMTAzOFRTMTA0MlRTMTA0N1RTMTA0OFRTMTA1NlRTMTA4NVRTMTA4OVRTMTA5MlRTMTA5NlRTMTA5OFRTMTEwMFRTMTEwMlRTMTEwNVRTMTEwNlRTMTEwN1RTMTEwOVRTMTExMFRTMTExNFRTMTExNVRTMTExNlRTMTEyM1RTMTE0MVRTMTE2MlRTMTE2NFRTMTE3MVRTMTE3MlRTMTE3M1RTMTE3NFRTMTE3NVRTMTE4M1RTMTE4NFRTMTE4NVRTMTA5M1RTMTE5NlRTMTI0MlRTMTI0M1RTMTI0NFRTMTI0NVRTMTI2N1RTMTI3M1RTMTI3NFRTMTI3N1RTMjIwNlRTMjIwN1RTMjM2OVRTMjM3MVRTMjQwNlRTMjQxMFRTMjQxNFRTMjQyN1RTMjQ1MlRTMjQ4M1RTMjQ5MVRTMjQ5OVRTMjcwM1RTNDExMlRTODAzOFRTMTgwMTBUU1R5cGVBbm5vdGF0aW9uQWZ0ZXJBc3NpZ25Uc05vbk51bGxBc3NlcnRpb25Ob3RBbGxvd2VkV2l0aExhYmVsaW5uZXJub3RlUmVzZXJ2ZWRUeXBlQXNzZXJ0aW9uUmVzZXJ2ZWRBcnJvd1R5cGVQYXJhbUVtcHR5VHlwZUFyZ3VtZW50TGlzdHF1b3RhbXBhcG9zbHRndG5ic3BpZXhjbGNlbnRwb3VuZGN1cnJlbnllbmJydmJhcnNlY3R1bWxjb3B5b3JkZmxhcXVvbm90c2h5cmVnbWFjcmRlZ3BsdXNtbnN1cDJzdXAzYWN1dGVtaWNyb3BhcmFtaWRkb3RjZWRpbHN1cDFvcmRtcmFxdW9mcmFjMTRmcmFjMTJmcmFjMzRpcXVlc3RBZ3JhdmVBYWN1dGVBY2lyY0F0aWxkZUF1bWxBcmluZ0FFbGlnQ2NlZGlsRWdyYXZlRWFjdXRlRWNpcmNFdW1sSWdyYXZlSWFjdXRlSWNpcmNJdW1sRVRITnRpbGRlT2dyYXZlT2FjdXRlT2NpcmNPdGlsZGVPdW1sdGltZXNPc2xhc2hVZ3JhdmVVYWN1dGVVY2lyY1V1bWxZYWN1dGVUSE9STnN6bGlnYWdyYXZlYWFjdXRlYWNpcmNhdGlsZGVhdW1sYXJpbmdhZWxpZ2NjZWRpbGVncmF2ZWVhY3V0ZWVjaXJjZXVtbGlncmF2ZWlhY3V0ZWljaXJjaXVtbGV0aG50aWxkZW9ncmF2ZW9hY3V0ZW9jaXJjb3RpbGRlb3VtbGRpdmlkZW9zbGFzaHVncmF2ZXVhY3V0ZXVjaXJjdXVtbHlhY3V0ZXRob3JueXVtbE9FbGlnb2VsaWdTY2Fyb25zY2Fyb25ZdW1sZm5vZmNpcmN0aWxkZUFscGhhQmV0YUdhbW1hRGVsdGFFcHNpbG9uWmV0YUV0YVRoZXRhSW90YUthcHBhTGFtYmRhTXVOdVhpT21pY3JvblBpUmhvU2lnbWFUYXVVcHNpbG9uUGhpQ2hpUHNpT21lZ2FhbHBoYWJldGFnYW1tYWRlbHRhZXBzaWxvbnpldGFldGF0aGV0YWlvdGFrYXBwYWxhbWJkYW11bnV4aW9taWNyb25waXJob3NpZ21hZnNpZ21hdGF1dXBzaWxvbnBoaWNoaXBzaW9tZWdhdGhldGFzeW11cHNpaHBpdmVuc3BlbXNwdGhpbnNwenduanp3amxybXJsbW5kYXNobWRhc2hsc3F1b3JzcXVvc2JxdW9sZHF1b3JkcXVvYmRxdW9kYWdnZXJEYWdnZXJidWxsaGVsbGlwcGVybWlscHJpbWVQcmltZWxzYXF1b3JzYXF1b29saW5lZnJhc2xldXJvaW1hZ2V3ZWllcnByZWFsdHJhZGVhbGVmc3ltbGFycnVhcnJyYXJyZGFycmhhcnJjcmFycmxBcnJ1QXJyckFycmRBcnJoQXJyZm9yYWxscGFydGV4aXN0ZW1wdHluYWJsYWlzaW5ub3Rpbm5pcHJvZHN1bW1pbnVzbG93YXN0cmFkaWNpbmZpbmFuZ2FuZG9yY2FwY3VwaW50dGhlcmU0c2ltY29uZ2FzeW1wbmVlcXVpdmxlZ2VzdWJzdXBuc3Vic3ViZXN1cGVvcGx1c290aW1lc3BlcnBzZG90bGNlaWxyY2VpbGxmbG9vcnJmbG9vcmxhbmdyYW5nbG96c3BhZGVzY2x1YnNoZWFydHNkaWFtc1QEAABUBAAAVAQAAFQEAABUBAAAVAQAAFQEAABUBAAAVAQAAFQEAABUBAAAVAQAAFQEAABUBAAAVAQAAFQEAABUBAAAVAQAAFQEAABUBAAAVAQAAFQEAABUBAAAVAQAAFQEAABUBAAAVAQAAFQEAABUBAAAVAQAAFQEAABUBAAAVAQAAFUEAABWBAAAVwQAAFgEAABZBAAAWgQAAFYEAABbBAAAXAQAAF0EAABeBAAAXwQAAGAEAABhBAAAYgQAAGMEAABkBAAAZAQAAGQEAABkBAAAZAQAAGQEAABkBAAAZAQAAGQEAABlBAAAZgQAAGcEAABoBAAAaQQAAGoEAABrBAAAWAQAAFgEAABYBAAAWAQAAFgEAABYBAAAWAQAAFgEAABYBAAAWAQAAFgEAABYBAAAWAQAAFgEAABYBAAAWAQAAFgEAABYBAAAWAQAAFgEAABYBAAAWAQAAFgEAABYBAAAWAQAAFgEAABsBAAAWAQAAG0EAABuBAAAWAQAAG8EAABwBAAAcQQAAHIEAABzBAAAdAQAAHUEAAB2BAAAWAQAAHcEAABYBAAAeAQAAHkEAAB6BAAAewQAAHwEAAB9BAAAWAQAAH4EAAB/BAAAgAQAAIEEAACCBAAAgwQAAFgEAACEBAAAWAQAAIUEAACGBAAAhwQAAIgEAABUBAAAiQQAAIkEAACJBAAAiQQAAIkEAACJBAAAiQQAAIkEAACJBAAAiQQAAIkEAACJBAAAiQQAAIkEAACJBAAAiQQAAIkEAACJBAAAiQQAAIkEAACJBAAAiQQAAIkEAACJBAAAiQQAAIkEAACJBAAAiQQAAIkEAACJBAAAiQQAAIkEAACJBAAAiQQAAIkEAACJBAAAiQQAAIkEAACJBAAAiQQAAIkEAACJBAAAiQQAAIkEAACJBAAAiQQAAIkEAACJBAAAiQQAAIkEAACJBAAAiQQAAIkEAACJBAAAiQQAAIkEAACJBAAAiQQAAIkEAACJBAAAiQQAAIkEAACJBAAAiQQAAIkEAACJBAAAiQQAAIkEAACJBAAAiQQAAIkEAACJBAAAiQQAAIkEAACJBAAAiQQAAIkEAACJBAAAiQQAAIkEAACJBAAAiQQAAIkEAACJBAAAiQQAAIkEAACJBAAAiQQAAIkEAACJBAAAiQQAAIkEAACJBAAAiQQAAIkEAACJBAAAiQQAAIkEAACJBAAAiQQAAIkEAACJBAAAiQQAAIkEAACJBAAAiQQAAIkEAACJBAAAiQQAAIkEAACJBAAAiQQAAIkEAACJBAAAiQQAAIkEAACJBAAAiQQAAIkEAACJBAAAiQQAAIkEAACJBAAAiQQAAIkEAACJBAAAiQQAAIkEAABXb3JkVGVtcGxhdGVKc3hUZXh0AIoEAACKBAAAigQAAIoEAACKBAAAigQAAIoEAACKBAAAigQAAIsEAACMBAAAiwQAAIsEAACMBAAAigQAAIoEAACKBAAAigQAAIoEAACKBAAAigQAAIoEAACKBAAAigQAAIoEAACKBAAAigQAAIoEAACKBAAAigQAAIoEAACKBAAAiwQAAIoEAACKBAAAigQAAIoEAACKBAAAigQAAIoEAACKBAAAigQAAIoEAACKBAAAigQAAIoEAACKBAAAjQQAAIoEAACKBAAAigQAAIoEAACKBAAAigQAAIoEAACKBAAAigQAAIoEAACKBAAAigQAAIoEAACKBAAAigQAAIoEAACKBAAAigQAAIoEAACKBAAAigQAAIoEAACKBAAAigQAAIoEAACKBAAAigQAAIoEAACKBAAAigQAAIoEAACKBAAAigQAAIoEAACKBAAAigQAAIoEAACKBAAAigQAAIoEAACKBAAAigQAAIoEAACKBAAAigQAAIoEAACKBAAAigQAAIoEAACKBAAAigQAAIoEAACKBAAAigQAAIoEAACKBAAAigQAAIoEAACKBAAAigQAAIoEAACKBAAAigQAAIoEAACKBAAAigQAAIoEAACKBAAAigQAAIoEAACKBAAAigQAAIoEAACKBAAAigQAAIoEAACKBAAAigQAAIoEAACKBAAAjgQAAI4EAACOBAAAjgQAAI4EAACOBAAAjgQAAI4EAACOBAAAjgQAAI4EAACOBAAAjgQAAI4EAACOBAAAjgQAAI4EAACOBAAAjgQAAI4EAACOBAAAjgQAAI4EAACOBAAAjgQAAI4EAACOBAAAjgQAAI4EAACOBAAAjgQAAI4EAACOBAAAjgQAAI4EAACOBAAAjgQAAI4EAACOBAAAjgQAAI4EAACOBAAAjgQAAI4EAACOBAAAjgQAAI4EAACOBAAAjgQAAI4EAACOBAAAjgQAAI4EAACOBAAAjgQAAI4EAACOBAAAjgQAAI4EAACOBAAAjgQAAI4EAACOBAAAjgQAAI4EAACOBAAAjgQAAI4EAACOBAAAjgQAAI4EAACOBAAAjgQAAI4EAACOBAAAjgQAAI4EAACOBAAAjgQAAI4EAACOBAAAjgQAAI4EAACOBAAAjgQAAI4EAACOBAAAjgQAAI4EAACOBAAAjgQAAI4EAACOBAAAjgQAAI4EAACOBAAAjgQAAI4EAACOBAAAjgQAAI4EAACOBAAAjgQAAI4EAACOBAAAjgQAAI4EAACOBAAAjgQAAI4EAACOBAAAjgQAAI4EAACOBAAAjgQAAI4EAACOBAAAjgQAAI4EAACOBAAAjgQAAI4EAACOBAAAjgQAAI4EAACOBAAAjgQAAI4EAABtZXNzYWdlc3RydWN0IFRzU3ludGF4L2hvbWUvbm9kZS9idWlsZC9kZXBzL3N3Yy9jcmF0ZXMvc3djX2NvbW1vbi9zcmMvc3ludGF4X3Bvcy9oeWdpZW5lLnJzABZ7JgBFAAAA0AEAADYAAABjYWxsZWQgZXhwZWN0IG9uIAAAAGx7JgARAAAAL2hvbWUvbm9kZS9idWlsZC9kZXBzL3N3Yy9jcmF0ZXMvc3djX2VjbWFfYXN0L3NyYy9wYXQucnOIeyYAOAAAAA0AAAAUAAAAc3BhblN0ckJvb2xOdW1CaWdJbnRSZWdleEpTWFRleHQAAAAACAAAAAQAAAABAQAAdmFsdWVyYXdUcGxleHByc3F1YXNpcwAAAAAAAAQAAAAEAAAAhgEAAFByaXZhdGVQdWJsaWNUaGlzVW5hcnlVcGRhdGVCaW5NZW1iZXJTdXBlclByb3BDb25kQ2FsbE5ld1NlcUxpdFRhZ2dlZFRwbEFycm93WWllbGRNZXRhUHJvcEF3YWl0UGFyZW5KU1hNZW1iZXJKU1hOYW1lc3BhY2VkTmFtZUpTWEVtcHR5SlNYRWxlbWVudEpTWEZyYWdtZW50VHNUeXBlQXNzZXJ0aW9uVHNDb25zdEFzc2VydGlvblRzTm9uTnVsbFRzQXNUc0luc3RhbnRpYXRpb25Uc1NhdGlzZmllc1ByaXZhdGVOYW1lT3B0Q2hhaW5leHBmbGFnc1Nob3J0aGFuZEtleVZhbHVlR2V0dGVyU2V0dGVyTWV0aG9kQmxvY2tFbXB0eURlYnVnZ2VyV2l0aFJldHVybkxhYmVsZWRCcmVha0NvbnRpbnVlSWZTd2l0Y2hUaHJvd1RyeVdoaWxlRG9XaGlsZUZvckZvckluRm9yT2ZEZWNsU3VwZXJOdW1iZXIAAAAAAAQAAAAEAAAAgAEAAJQEAAAMAAAABAAAAEcCAACVBAAADAAAAAQAAACWBAAAlwQAAAQAAAAEAAAAkwEAAAAAAAABAAAAAQAAAEsBAACYBAAABAAAAAQAAAAFAgAAmQQAAAQAAAAEAAAAkAEAAAAAAAAEAAAABAAAAJoEAABjdHh0ZGVjb3JhdG9yc2JvZHlzdXBlcl9jbGFzc2lzX2Fic3RyYWN0dHlwZV9wYXJhbXNzdXBlcl90eXBlX3BhcmFtc9B7JgAEAAAAMH4mAAQAAAA0fiYACgAAAD5+JgAEAAAAQn4mAAsAAABNfiYACwAAAFh+JgALAAAAY34mABEAAACA5iYACgAAAJsEAAAYAAAACAAAAEgBAABGbkRlY2xpZGVudEltcG9ydEZuRXhwcgAAAAAABAAAAAQAAABmAgAAcGhhc2VzeW1vcHRpb25hbEpTWEF0dHJuYW1lSlNYRW1wdHlFeHByAAAAAAAEAAAABAAAAEkBAABSZXN0UGF0ZG90M190b2tlbmFyZ3R5cGVfYW5unAQAAAQAAAAEAAAAegEAAElmU3RtdHRlc3Rjb25zYWx0VmFyRGVjbGtpbmRkZWNsc0JpbkV4cHJvcGxlZnRyaWdodE5ld0V4cHJjYWxsZWVhcmdzdHlwZV9hcmdzT3B0Q2FsbFNlcUV4cHJBcnJheVBhdGVsZW1zVXNpbmdEZWNsUGF0Rm9yU3RtdGluaXR1cGRhdGVUcnlTdG10YmxvY2toYW5kbGVyZmluYWxpemVyQXJyYXlMaXRDYWxsRXhwckNvbmRFeHByVGhpc0V4cHJKU1hNZW1iZXJFeHByQXNzaWduUGF0T2JqZWN0UGF0cHJvcHNDb21wdXRlZEV4cHJTdG10ZXhwcldpdGhTdG10b2JqQ2xhc3NEZWNsaXNfYXdhaXQAAACdBAAADAAAAAQAAACeBAAAnwQAAAQAAAAEAAAAoAQAAHBhcmFtc2lzX2FzeW5jaXNfZ2VuZXJhdG9ycmV0dXJuX3R5cGUAAADQeyYABAAAADB+JgAEAAAAkIAmAAYAAAA+fiYABAAAAJaAJgAIAAAAnoAmAAwAAABYfiYACwAAAKqAJgALAAAAQXJyb3dFeHByQXdhaXRFeHByQ2xhc3NFeHByT2JqZWN0TGl0UGFyZW5FeHBydGFndHBsVW5hcnlFeHByWWllbGRFeHByZGVsZWdhdGVQYXJhbXBhdG9wZW5pbmdjaGlsZHJlbmNsb3NpbmdCbG9ja1N0bXRzdG10c0JyZWFrU3RtdGxhYmVsRW1wdHlTdG10Rm9ySW5TdG10Rm9yT2ZTdG10VGhyb3dTdG10V2hpbGVTdG10oQQAACAAAAAIAAAA1QEAAKIEAAAEAAAABAAAANYBAAAAAAAAAQAAAAEAAACjBAAAa2V5aXNfc3RhdGljYWNjZXNzaWJpbGl0eWlzX29wdGlvbmFsaXNfb3ZlcnJpZGVkZWZpbml0ZQDQeyYABAAAANyBJgADAAAAAHwmAAUAAABAfyYACAAAAN+BJgAJAAAANH4mAAoAAADogSYADQAAAE1+JgALAAAA9YEmAAsAAAAAgiYACwAAAFPiJgAIAAAA7tAmAAcAAAALgiYACAAAAENsYXNzUHJvcERlY29yYXRvckFzc2lnbkV4cHJNZW1iZXJFeHBycHJvcFRwbEVsZW1lbnR0YWlsY29va2VkVXBkYXRlRXhwcnByZWZpeElkZW50TmFtZUFzc2lnblByb3BHZXR0ZXJQcm9wTWV0aG9kUHJvcFNldHRlclByb3B0aGlzX3BhcmFtcGFyYW1SZXR1cm5TdG10U3dpdGNoQ2FzZVN3aXRjaFN0bXRkaXNjcmltaW5hbnRjYXNlc0pTWEV4cHJDb250YWluZXJDYXRjaENsYXVzZURvV2hpbGVTdG10TGFiZWxlZFN0bXRDb25zdHJ1Y3RvclByaXZhdGVNZXRob2RQcml2YXRlUHJvcFRzSW5kZXhTaWduYXR1cmVTdGF0aWNCbG9ja0F1dG9BY2Nlc3NvcqQEAAAEAAAABAAAAKUEAAAAAAAAAQAAAAEAAACmBAAA0HsmAAQAAADcgSYAAwAAAGnlJgAIAAAAcH8mAAQAAADfgSYACQAAAOiBJgANAAAATX4mAAsAAAD1gSYACwAAAACCJgALAAAAQ2xhc3NNZXRob2QApwQAAAwAAAAEAAAAqAQAAKkEAAAYAAAABAAAAKoEAADQeyYABAAAADB+JgAEAAAA3IEmAAMAAACQgCYABgAAAD5+JgAEAAAA6IEmAA0AAAD1gSYACwAAAKsEAAAQAAAACAAAAKwEAADQeyYABAAAADB+JgAEAAAA3IEmAAMAAAAAfCYABQAAAEB/JgAIAAAA34EmAAkAAAA0fiYACgAAAOiBJgANAAAA9YEmAAsAAAAAgiYACwAAAFPiJgAIAAAAC4ImAAgAAABTaW1wbGVFeHByT3JTcHJlYWRzcHJlYWRNZXRhUHJvcEV4cHJPcHRDaGFpbkV4cHJiYXNlU3ByZWFkUHJvcAAArQQAAAwAAAAEAAAArgQAAJCAJgAGAAAANH4mAAoAAADQeyYABAAAADB+JgAEAAAAPn4mAAQAAACegCYADAAAAJaAJgAIAAAAWH4mAAsAAACqgCYACwAAAEZ1bmN0aW9uTW9kdWxlRGVjbFN0bXRBc3NpZ25QYXRQcm9wS2V5VmFsdWVQcm9wQ29udGludWVTdG10RGVidWdnZXJTdG10VHNLZXl3b3JkVHlwZVRzVGhpc1R5cGVUc0ZuT3JDb25zdHJ1Y3RvclR5cGVUc1R5cGVSZWZUc1R5cGVRdWVyeVRzVHlwZUxpdFRzQXJyYXlUeXBlVHNUdXBsZVR5cGVUc09wdGlvbmFsVHlwZVRzUmVzdFR5cGVUc1VuaW9uT3JJbnRlcnNlY3Rpb25UeXBlVHNDb25kaXRpb25hbFR5cGVUc0luZmVyVHlwZVRzUGFyZW50aGVzaXplZFR5cGVUc1R5cGVPcGVyYXRvclRzSW5kZXhlZEFjY2Vzc1R5cGVUc01hcHBlZFR5cGVUc0xpdFR5cGVUc1R5cGVQcmVkaWNhdGVUc0ltcG9ydFR5cGUArwQAACAAAAAIAAAAsAQAANB7JgAEAAAA3IEmAAMAAAAAfCYABQAAAEB/JgAIAAAA34EmAAkAAAA0fiYACgAAAOiBJgANAAAATX4mAAsAAAAAgiYACwAAAAuCJgAIAAAAVmFyRGVjbGFyYXRvclNwcmVhZEVsZW1lbnRTdXBlclByb3BFeHByQmluZGluZ0lkZW50aWRKU1hTcHJlYWRDaGlsZEtleVZhbHVlUGF0UHJvcFRzQXNFeHByAACxBAAADAAAAAQAAAAzAgAAVHNGblR5cGVsaXRUc1R5cGVBbm5tZW1iZXJzdHlwZV9uYW1lSlNYQ2xvc2luZ0VsZW1lbnRuc0pTWE9wZW5pbmdFbGVtZW50YXR0cnNzZWxmX2Nsb3NpbmcAAACyBAAABAAAAAQAAACHAQAARXhwb3J0QWxsc3JjdHlwZV9vbmx5Q29tcHV0ZWRQcm9wTmFtZVRzRW51bURlY2xpc19jb25zdEpTWENsb3NpbmdGcmFnbWVudEpTWE9wZW5pbmdGcmFnbWVudEV4cG9ydERlY2xkZWNsAAAAswQAAAwAAAAEAAAAtAQAALUEAAAEAAAABAAAALYEAABzcGVjaWZpZXJzAADQeyYABAAAAKSIJgAKAAAAIYgmAAMAAAAkiCYACQAAAL/iJgAEAAAA9H4mAAUAAABJbXBvcnREZWNsRXhwb3J0TmFtZWRFeHBvcnREZWZhdWx0RGVjbEV4cG9ydERlZmF1bHRFeHByVHNJbXBvcnRFcXVhbHNUc0V4cG9ydEFzc2lnbm1lbnRUc05hbWVzcGFjZUV4cG9ydGVsZW1fdHlwZXR5cGVfcGFyYW1Uc0VudGl0eU5hbWVUc0V4dGVybmFsTW9kdWxlUmVmAAAAAAAABAAAAAQAAAC3BAAA0HsmAAQAAAA0fiYACgAAAOiBJgANAAAAAIImAAsAAABT4iYACAAAAAWDJgAFAAAAVHNQYXJhbVByb3BlbGVtX3R5cGVzAAAAuAQAAAQAAAAEAAAAuQQAAAAAAAAEAAAABAAAALoEAABpc19pbmlzX291dGNvbnN0cmFpbnQAAADQeyYABAAAAAt/JgAEAAAA9IkmAAUAAAD5iSYABgAAAEeIJgAIAAAA/4kmAAoAAADk4yYABwAAAFRzVHlwZVBhcmFtZXhwcl9uYW1lVHNVbmlvblR5cGV0eXBlc1RzSW50ZXJmYWNlRGVjbEV2YWx1YXRpb25Tb3VyY2VEZWZlck5hbWVkRXhwb3J0VHNRdWFsaWZpZWROYW1lVHNFbnVtTWVtYmVycXVhbGlmaWVyYXR0cmlidXRlcwAAAAAAAAABAAAAAQAAALsEAAC8BAAAMAAAAAgAAAC9BAAAbmFtZV90eXBlAAAA0HsmAAQAAABT4iYACAAAAFGJJgAKAAAA6IomAAkAAAD8fiYACAAAAEB/JgAIAAAAvgQAACAAAAAIAAAAJAIAAAAAAAAEAAAABAAAAL8EAADQeyYABAAAAO7QJgAHAAAA9dAmAAYAAABf0CYACQAAAHOHJgACAAAAPn4mAAQAAABUc01vZHVsZURlY2xUc1RwbExpdFR5cGVQcm90ZWN0ZWRUcnVlUGx1c01pbnVzVHNNb2R1bGVCbG9ja1RzTm9uTnVsbEV4cHJUc0NhbGxTaWduYXR1cmVEZWNsVHNDb25zdHJ1Y3RTaWduYXR1cmVEZWNsVHNQcm9wZXJ0eVNpZ25hdHVyZVRzR2V0dGVyU2lnbmF0dXJlVHNTZXR0ZXJTaWduYXR1cmVUc01ldGhvZFNpZ25hdHVyZVRzVHVwbGVFbGVtZW50dHlUc0ludGVyZmFjZUJvZHnABAAADAAAAAQAAADBBAAAAAAAAAQAAAAEAAAAwgQAANB7JgAEAAAAc4cmAAIAAADu0CYABwAAAFh+JgALAAAAW+ImAAcAAAA+fiYABAAAAFRzTmFtZXNwYWNlRGVjbFRzU2F0aXNmaWVzRXhwclRzVHlwZUFsaWFzRGVjbFRzVHlwZVBhcmFtRGVjbHBhcmFtX25hbWVOYW1lc3BhY2VEZWZhdWx0TmFtZWRjaGVja190eXBlZXh0ZW5kc190eXBldHJ1ZV90eXBlZmFsc2VfdHlwZVRzQ29uc3RydWN0b3JUeXBlY29tcHV0ZWRUc0FueUtleXdvcmRUc1Vua25vd25LZXl3b3JkVHNOdW1iZXJLZXl3b3JkVHNPYmplY3RLZXl3b3JkVHNCb29sZWFuS2V5d29yZFRzQmlnSW50S2V5d29yZFRzU3RyaW5nS2V5d29yZFRzU3ltYm9sS2V5d29yZFRzVm9pZEtleXdvcmRUc1VuZGVmaW5lZEtleXdvcmRUc051bGxLZXl3b3JkVHNOZXZlcktleXdvcmRUc0ludHJpbnNpY0tleXdvcmQAAAAABAAAAAQAAAA0AgAA0HsmAAQAAADcgSYAAwAAADGNJgAIAAAA/H4mAAgAAACQgCYABgAAAEB/JgAIAAAAWH4mAAsAAABUc0V4cHJXaXRoVHlwZUFyZ3NUc0ltcG9ydEVxdWFsc0RlY2xpc19leHBvcnRpc190eXBlX29ubHltb2R1bGVfcmVmVHNJbnRlcnNlY3Rpb25UeXBlVHNJbXBvcnRDYWxsT3B0aW9uc29ial90eXBlaW5kZXhfdHlwZQAA0HsmAAQAAABT4iYACAAAANyBJgADAAAAMY0mAAgAAAD8fiYACAAAAEB/JgAIAAAARXhwb3J0TmFtZWRTcGVjaWZpZXJvcmlnZXhwb3J0ZWRJbXBvcnROYW1lZFNwZWNpZmllcmxvY2FsaW1wb3J0ZWRUc05hbWVzcGFjZUV4cG9ydERlY2xJbXBvcnRTdGFyQXNTcGVjaWZpZXJFeHBvcnREZWZhdWx0U3BlY2lmaWVySW1wb3J0RGVmYXVsdFNwZWNpZmllcgBa6yYASgAAAKgBAAAfAAAAVHNUeXBlUGFyYW1JbnN0YW50aWF0aW9uRXhwb3J0TmFtZXNwYWNlU3BlY2lmaWVyL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvaW5kZXhtYXAtMi4xMi4wL3NyYy9tYXAvY29yZS5yc8iPJgBkAAAAOwAAACMAAABpbmRleCBub3QgZm91bmQAyI8mAGQAAABLAAAACgAAAMiPJgBkAAAAGgIAAA0AAADIjyYAZAAAAKICAAAsAAAAyI8mAGQAAAB6AgAAIgAAAGFzc2VydGlvbiBmYWlsZWQ6IGluZGljZXMuY2FwYWNpdHkoKSAtIGluZGljZXMubGVuKCkgPj0gZW50cmllcy5sZW4oKQAAAMiPJgBkAAAAVAAAAAUAAADIjyYAZAAAAFYAAABEAAAAyI8mAGQAAABMAQAAFgAAAMiPJgBkAAAAWAEAADgAAADIjyYAZAAAAMgBAAA0AAAAyI8mAGQAAAAzAAAADwAAAEWyJgA6AAAAdwYAABQAAABjcmF0ZXMvc3djX2VjbWFfdHJhbnNmb3Jtc19iYXNlL3NyYy9maXhlci5yc0SRJgAsAAAAxgAAAEAAAABEkSYALAAAAG8DAAAjAAAARJEmACwAAAB/AwAAMQAAAESRJgAsAAAAiwMAACkAAABjcmF0ZXMvc3djX2VjbWFfdHJhbnNmb3Jtc19iYXNlL3NyYy9oZWxwZXJzL21vZC5yc0Bzd2MvaGVscGVycy9fL18AAOKRJgAQAAAAY3JhdGVzL3N3Y19lY21hX3RyYW5zZm9ybXNfYmFzZS9zcmMvcmVuYW1lL2FuYWx5emVyL3JldmVyc2VfbWFwLnJzAAD8kSYAQgAAAA4AAAAsAAAAY3JhdGVzL3N3Y19lY21hX3RyYW5zZm9ybXNfYmFzZS9zcmMvcmVuYW1lL2FuYWx5emVyL21vZC5ycwAAUJImADoAAAAuAAAAGwAAAFCSJgA6AAAAOgAAADcAAABQkiYAOgAAAIsAAAAdAAAATWFya2VyIHByb3ZpZGVkIHRvIHJlc29sdmVyIHNob3VsZCBub3QgYmUgdGhlIHJvb3QgbWFyawC8kiYANwAAAGNyYXRlcy9zd2NfZWNtYV90cmFuc2Zvcm1zX2Jhc2Uvc3JjL3Jlc29sdmVyL21vZC5ycwD8kiYAMwAAAIcAAAAFAAAA/JImADMAAADUBgAANgAAAMMEAACwkSYAMgAAAPsAAAABAAAAX2FwcGx5X2RlY29yYXRlZF9kZXNjcmlwdG9yQHN3Yy9oZWxwZXJzL18vX2FwcGx5X2RlY29yYXRlZF9kZXNjcmlwdG9yX2FycmF5X2xpa2VfdG9fYXJyYXlAc3djL2hlbHBlcnMvXy9fYXJyYXlfbGlrZV90b19hcnJheV9hcnJheV93aXRoX2hvbGVzQHN3Yy9oZWxwZXJzL18vX2FycmF5X3dpdGhfaG9sZXNfYXJyYXlfd2l0aG91dF9ob2xlc0Bzd2MvaGVscGVycy9fL19hcnJheV93aXRob3V0X2hvbGVzX2Fzc2VydF90aGlzX2luaXRpYWxpemVkQHN3Yy9oZWxwZXJzL18vX2Fzc2VydF90aGlzX2luaXRpYWxpemVkX2FzeW5jX2dlbmVyYXRvckBzd2MvaGVscGVycy9fL19hc3luY19nZW5lcmF0b3JfYXN5bmNfZ2VuZXJhdG9yX2RlbGVnYXRlQHN3Yy9oZWxwZXJzL18vX2FzeW5jX2dlbmVyYXRvcl9kZWxlZ2F0ZV9hc3luY19pdGVyYXRvckBzd2MvaGVscGVycy9fL19hc3luY19pdGVyYXRvcl9hc3luY190b19nZW5lcmF0b3JAc3djL2hlbHBlcnMvXy9fYXN5bmNfdG9fZ2VuZXJhdG9yX2F3YWl0X2FzeW5jX2dlbmVyYXRvckBzd2MvaGVscGVycy9fL19hd2FpdF9hc3luY19nZW5lcmF0b3JfYXdhaXRfdmFsdWVAc3djL2hlbHBlcnMvXy9fYXdhaXRfdmFsdWVfY2FsbF9zdXBlckBzd2MvaGVscGVycy9fL19jYWxsX3N1cGVyX2NoZWNrX3ByaXZhdGVfcmVkZWNsYXJhdGlvbkBzd2MvaGVscGVycy9fL19jaGVja19wcml2YXRlX3JlZGVjbGFyYXRpb25fY2xhc3NfYXBwbHlfZGVzY3JpcHRvcl9kZXN0cnVjdHVyZUBzd2MvaGVscGVycy9fL19jbGFzc19hcHBseV9kZXNjcmlwdG9yX2Rlc3RydWN0dXJlX2NsYXNzX2FwcGx5X2Rlc2NyaXB0b3JfZ2V0QHN3Yy9oZWxwZXJzL18vX2NsYXNzX2FwcGx5X2Rlc2NyaXB0b3JfZ2V0X2NsYXNzX2FwcGx5X2Rlc2NyaXB0b3Jfc2V0QHN3Yy9oZWxwZXJzL18vX2NsYXNzX2FwcGx5X2Rlc2NyaXB0b3Jfc2V0X2NsYXNzX2FwcGx5X2Rlc2NyaXB0b3JfdXBkYXRlQHN3Yy9oZWxwZXJzL18vX2NsYXNzX2FwcGx5X2Rlc2NyaXB0b3JfdXBkYXRlX2NsYXNzX2NhbGxfY2hlY2tAc3djL2hlbHBlcnMvXy9fY2xhc3NfY2FsbF9jaGVja19jbGFzc19jaGVja19wcml2YXRlX3N0YXRpY19maWVsZF9kZXNjcmlwdG9yQHN3Yy9oZWxwZXJzL18vX2NsYXNzX2NoZWNrX3ByaXZhdGVfc3RhdGljX2ZpZWxkX2Rlc2NyaXB0b3JfY2xhc3NfZXh0cmFjdF9maWVsZF9kZXNjcmlwdG9yQHN3Yy9oZWxwZXJzL18vX2NsYXNzX2V4dHJhY3RfZmllbGRfZGVzY3JpcHRvcl9jbGFzc19uYW1lX3Rkel9lcnJvckBzd2MvaGVscGVycy9fL19jbGFzc19uYW1lX3Rkel9lcnJvcl9jbGFzc19wcml2YXRlX2ZpZWxkX2dldEBzd2MvaGVscGVycy9fL19jbGFzc19wcml2YXRlX2ZpZWxkX2dldF9jbGFzc19wcml2YXRlX2ZpZWxkX2luaXRAc3djL2hlbHBlcnMvXy9fY2xhc3NfcHJpdmF0ZV9maWVsZF9pbml0X2NsYXNzX3ByaXZhdGVfZmllbGRfbG9vc2VfYmFzZUBzd2MvaGVscGVycy9fL19jbGFzc19wcml2YXRlX2ZpZWxkX2xvb3NlX2Jhc2VfY2xhc3NfcHJpdmF0ZV9maWVsZF9sb29zZV9rZXlAc3djL2hlbHBlcnMvXy9fY2xhc3NfcHJpdmF0ZV9maWVsZF9sb29zZV9rZXlfY2xhc3NfcHJpdmF0ZV9maWVsZF9zZXRAc3djL2hlbHBlcnMvXy9fY2xhc3NfcHJpdmF0ZV9maWVsZF9zZXRfY2xhc3NfcHJpdmF0ZV9maWVsZF91cGRhdGVAc3djL2hlbHBlcnMvXy9fY2xhc3NfcHJpdmF0ZV9maWVsZF91cGRhdGVfY2xhc3NfcHJpdmF0ZV9tZXRob2RfZ2V0QHN3Yy9oZWxwZXJzL18vX2NsYXNzX3ByaXZhdGVfbWV0aG9kX2dldF9jbGFzc19wcml2YXRlX21ldGhvZF9pbml0QHN3Yy9oZWxwZXJzL18vX2NsYXNzX3ByaXZhdGVfbWV0aG9kX2luaXRfY2xhc3NfcHJpdmF0ZV9tZXRob2Rfc2V0QHN3Yy9oZWxwZXJzL18vX2NsYXNzX3ByaXZhdGVfbWV0aG9kX3NldF9jbGFzc19zdGF0aWNfcHJpdmF0ZV9maWVsZF9zcGVjX2dldEBzd2MvaGVscGVycy9fL19jbGFzc19zdGF0aWNfcHJpdmF0ZV9maWVsZF9zcGVjX2dldF9jbGFzc19zdGF0aWNfcHJpdmF0ZV9maWVsZF9zcGVjX3NldEBzd2MvaGVscGVycy9fL19jbGFzc19zdGF0aWNfcHJpdmF0ZV9maWVsZF9zcGVjX3NldF9jbGFzc19zdGF0aWNfcHJpdmF0ZV9maWVsZF91cGRhdGVAc3djL2hlbHBlcnMvXy9fY2xhc3Nfc3RhdGljX3ByaXZhdGVfZmllbGRfdXBkYXRlX2NvbnN0cnVjdEBzd2MvaGVscGVycy9fL19jb25zdHJ1Y3RfY3JlYXRlX2NsYXNzQHN3Yy9oZWxwZXJzL18vX2NyZWF0ZV9jbGFzc19kZWNvcmF0ZUBzd2MvaGVscGVycy9fL19kZWNvcmF0ZV9kZWZhdWx0c0Bzd2MvaGVscGVycy9fL19kZWZhdWx0c19kZWZpbmVfZW51bWVyYWJsZV9wcm9wZXJ0aWVzQHN3Yy9oZWxwZXJzL18vX2RlZmluZV9lbnVtZXJhYmxlX3Byb3BlcnRpZXNfZGVmaW5lX3Byb3BlcnR5QHN3Yy9oZWxwZXJzL18vX2RlZmluZV9wcm9wZXJ0eV9leHBvcnRfc3RhckBzd2MvaGVscGVycy9fL19leHBvcnRfc3Rhcl9leHRlbmRzQHN3Yy9oZWxwZXJzL18vX2V4dGVuZHNfZ2V0QHN3Yy9oZWxwZXJzL18vX2dldF9nZXRfcHJvdG90eXBlX29mQHN3Yy9oZWxwZXJzL18vX2dldF9wcm90b3R5cGVfb2ZfaW5oZXJpdHNAc3djL2hlbHBlcnMvXy9faW5oZXJpdHNfaW5oZXJpdHNfbG9vc2VAc3djL2hlbHBlcnMvXy9faW5oZXJpdHNfbG9vc2VfaW5pdGlhbGl6ZXJfZGVmaW5lX3Byb3BlcnR5QHN3Yy9oZWxwZXJzL18vX2luaXRpYWxpemVyX2RlZmluZV9wcm9wZXJ0eV9pbml0aWFsaXplcl93YXJuaW5nX2hlbHBlckBzd2MvaGVscGVycy9fL19pbml0aWFsaXplcl93YXJuaW5nX2hlbHBlcl9pbnN0YW5jZW9mQHN3Yy9oZWxwZXJzL18vX2luc3RhbmNlb2ZfaW50ZXJvcF9yZXF1aXJlX2RlZmF1bHRAc3djL2hlbHBlcnMvXy9faW50ZXJvcF9yZXF1aXJlX2RlZmF1bHRfaW50ZXJvcF9yZXF1aXJlX3dpbGRjYXJkQHN3Yy9oZWxwZXJzL18vX2ludGVyb3BfcmVxdWlyZV93aWxkY2FyZF9pc19uYXRpdmVfZnVuY3Rpb25Ac3djL2hlbHBlcnMvXy9faXNfbmF0aXZlX2Z1bmN0aW9uX2l0ZXJhYmxlX3RvX2FycmF5QHN3Yy9oZWxwZXJzL18vX2l0ZXJhYmxlX3RvX2FycmF5X2l0ZXJhYmxlX3RvX2FycmF5X2xpbWl0QHN3Yy9oZWxwZXJzL18vX2l0ZXJhYmxlX3RvX2FycmF5X2xpbWl0X2l0ZXJhYmxlX3RvX2FycmF5X2xpbWl0X2xvb3NlQHN3Yy9oZWxwZXJzL18vX2l0ZXJhYmxlX3RvX2FycmF5X2xpbWl0X2xvb3NlX2pzeEBzd2MvaGVscGVycy9fL19qc3hfbmV3X2Fycm93X2NoZWNrQHN3Yy9oZWxwZXJzL18vX25ld19hcnJvd19jaGVja19ub25faXRlcmFibGVfcmVzdEBzd2MvaGVscGVycy9fL19ub25faXRlcmFibGVfcmVzdF9ub25faXRlcmFibGVfc3ByZWFkQHN3Yy9oZWxwZXJzL18vX25vbl9pdGVyYWJsZV9zcHJlYWRfb2JqZWN0X2Rlc3RydWN0dXJpbmdfZW1wdHlAc3djL2hlbHBlcnMvXy9fb2JqZWN0X2Rlc3RydWN0dXJpbmdfZW1wdHlfb2JqZWN0X3NwcmVhZEBzd2MvaGVscGVycy9fL19vYmplY3Rfc3ByZWFkX29iamVjdF9zcHJlYWRfcHJvcHNAc3djL2hlbHBlcnMvXy9fb2JqZWN0X3NwcmVhZF9wcm9wc19vYmplY3Rfd2l0aG91dF9wcm9wZXJ0aWVzQHN3Yy9oZWxwZXJzL18vX29iamVjdF93aXRob3V0X3Byb3BlcnRpZXNfb2JqZWN0X3dpdGhvdXRfcHJvcGVydGllc19sb29zZUBzd2MvaGVscGVycy9fL19vYmplY3Rfd2l0aG91dF9wcm9wZXJ0aWVzX2xvb3NlX292ZXJsb2FkX3lpZWxkQHN3Yy9oZWxwZXJzL18vX292ZXJsb2FkX3lpZWxkX3Bvc3NpYmxlX2NvbnN0cnVjdG9yX3JldHVybkBzd2MvaGVscGVycy9fL19wb3NzaWJsZV9jb25zdHJ1Y3Rvcl9yZXR1cm5fcmVhZF9vbmx5X2Vycm9yQHN3Yy9oZWxwZXJzL18vX3JlYWRfb25seV9lcnJvcl9zZXRAc3djL2hlbHBlcnMvXy9fc2V0X3NldF9wcm90b3R5cGVfb2ZAc3djL2hlbHBlcnMvXy9fc2V0X3Byb3RvdHlwZV9vZl9za2lwX2ZpcnN0X2dlbmVyYXRvcl9uZXh0QHN3Yy9oZWxwZXJzL18vX3NraXBfZmlyc3RfZ2VuZXJhdG9yX25leHRfc2xpY2VkX3RvX2FycmF5QHN3Yy9oZWxwZXJzL18vX3NsaWNlZF90b19hcnJheV9zbGljZWRfdG9fYXJyYXlfbG9vc2VAc3djL2hlbHBlcnMvXy9fc2xpY2VkX3RvX2FycmF5X2xvb3NlX3N1cGVyX3Byb3BfYmFzZUBzd2MvaGVscGVycy9fL19zdXBlcl9wcm9wX2Jhc2VfdGFnZ2VkX3RlbXBsYXRlX2xpdGVyYWxAc3djL2hlbHBlcnMvXy9fdGFnZ2VkX3RlbXBsYXRlX2xpdGVyYWxfdGFnZ2VkX3RlbXBsYXRlX2xpdGVyYWxfbG9vc2VAc3djL2hlbHBlcnMvXy9fdGFnZ2VkX3RlbXBsYXRlX2xpdGVyYWxfbG9vc2VfdGhyb3dAc3djL2hlbHBlcnMvXy9fdGhyb3dfdG9fYXJyYXlAc3djL2hlbHBlcnMvXy9fdG9fYXJyYXlfdG9fY29uc3VtYWJsZV9hcnJheUBzd2MvaGVscGVycy9fL190b19jb25zdW1hYmxlX2FycmF5X3RvX3ByaW1pdGl2ZUBzd2MvaGVscGVycy9fL190b19wcmltaXRpdmVfdG9fcHJvcGVydHlfa2V5QHN3Yy9oZWxwZXJzL18vX3RvX3Byb3BlcnR5X2tleV91cGRhdGVAc3djL2hlbHBlcnMvXy9fdXBkYXRlX3R5cGVfb2ZAc3djL2hlbHBlcnMvXy9fdHlwZV9vZl91bnN1cHBvcnRlZF9pdGVyYWJsZV90b19hcnJheUBzd2MvaGVscGVycy9fL191bnN1cHBvcnRlZF9pdGVyYWJsZV90b19hcnJheV93cmFwX2FzeW5jX2dlbmVyYXRvckBzd2MvaGVscGVycy9fL193cmFwX2FzeW5jX2dlbmVyYXRvcl93cmFwX25hdGl2ZV9zdXBlckBzd2MvaGVscGVycy9fL193cmFwX25hdGl2ZV9zdXBlcl93cml0ZV9vbmx5X2Vycm9yQHN3Yy9oZWxwZXJzL18vX3dyaXRlX29ubHlfZXJyb3JfY2xhc3NfcHJpdmF0ZV9maWVsZF9kZXN0cnVjdHVyZUBzd2MvaGVscGVycy9fL19jbGFzc19wcml2YXRlX2ZpZWxkX2Rlc3RydWN0dXJlX2NsYXNzX3N0YXRpY19wcml2YXRlX2ZpZWxkX2Rlc3RydWN0dXJlQHN3Yy9oZWxwZXJzL18vX2NsYXNzX3N0YXRpY19wcml2YXRlX2ZpZWxkX2Rlc3RydWN0dXJlX2NsYXNzX3N0YXRpY19wcml2YXRlX21ldGhvZF9nZXRAc3djL2hlbHBlcnMvXy9fY2xhc3Nfc3RhdGljX3ByaXZhdGVfbWV0aG9kX2dldF9jbGFzc19jaGVja19wcml2YXRlX3N0YXRpY19hY2Nlc3NAc3djL2hlbHBlcnMvXy9fY2xhc3NfY2hlY2tfcHJpdmF0ZV9zdGF0aWNfYWNjZXNzX2lzX25hdGl2ZV9yZWZsZWN0X2NvbnN0cnVjdEBzd2MvaGVscGVycy9fL19pc19uYXRpdmVfcmVmbGVjdF9jb25zdHJ1Y3RfY3JlYXRlX3N1cGVyQHN3Yy9oZWxwZXJzL18vX2NyZWF0ZV9zdXBlcl9jcmVhdGVfZm9yX29mX2l0ZXJhdG9yX2hlbHBlcl9sb29zZUBzd2MvaGVscGVycy9fL19jcmVhdGVfZm9yX29mX2l0ZXJhdG9yX2hlbHBlcl9sb29zZV90c19kZWNvcmF0ZUBzd2MvaGVscGVycy9fL190c19kZWNvcmF0ZV90c19nZW5lcmF0b3JAc3djL2hlbHBlcnMvXy9fdHNfZ2VuZXJhdG9yX3RzX21ldGFkYXRhQHN3Yy9oZWxwZXJzL18vX3RzX21ldGFkYXRhX3RzX3BhcmFtQHN3Yy9oZWxwZXJzL18vX3RzX3BhcmFtX3RzX3ZhbHVlc0Bzd2MvaGVscGVycy9fL190c192YWx1ZXNfdHNfYWRkX2Rpc3Bvc2FibGVfcmVzb3VyY2VAc3djL2hlbHBlcnMvXy9fdHNfYWRkX2Rpc3Bvc2FibGVfcmVzb3VyY2VfdHNfZGlzcG9zZV9yZXNvdXJjZXNAc3djL2hlbHBlcnMvXy9fdHNfZGlzcG9zZV9yZXNvdXJjZXNfdHNfcmV3cml0ZV9yZWxhdGl2ZV9pbXBvcnRfZXh0ZW5zaW9uQHN3Yy9oZWxwZXJzL18vX3RzX3Jld3JpdGVfcmVsYXRpdmVfaW1wb3J0X2V4dGVuc2lvbl9hcHBseV9kZWNzXzIyMDNfckBzd2MvaGVscGVycy9fL19hcHBseV9kZWNzXzIyMDNfcl9pZGVudGl0eUBzd2MvaGVscGVycy9fL19pZGVudGl0eV9kaXNwb3NlQHN3Yy9oZWxwZXJzL18vX2Rpc3Bvc2VfdXNpbmdAc3djL2hlbHBlcnMvXy9fdXNpbmdfdXNpbmdfY3R4QHN3Yy9oZWxwZXJzL18vX3VzaW5nX2N0eGFwcGx5X2RlY29yYXRlZF9kZXNjcmlwdG9yYXJyYXlfbGlrZV90b19hcnJheWFycmF5X3dpdGhfaG9sZXNhcnJheV93aXRob3V0X2hvbGVzYXNzZXJ0X3RoaXNfaW5pdGlhbGl6ZWRhc3luY19nZW5lcmF0b3Jhc3luY19nZW5lcmF0b3JfZGVsZWdhdGVhc3luY19pdGVyYXRvcmFzeW5jX3RvX2dlbmVyYXRvcmF3YWl0X2FzeW5jX2dlbmVyYXRvcmF3YWl0X3ZhbHVlY2FsbF9zdXBlcmNoZWNrX3ByaXZhdGVfcmVkZWNsYXJhdGlvbmNsYXNzX2FwcGx5X2Rlc2NyaXB0b3JfZGVzdHJ1Y3R1cmVjbGFzc19hcHBseV9kZXNjcmlwdG9yX2dldGNsYXNzX2FwcGx5X2Rlc2NyaXB0b3Jfc2V0Y2xhc3NfYXBwbHlfZGVzY3JpcHRvcl91cGRhdGVjbGFzc19jYWxsX2NoZWNrY2xhc3NfY2hlY2tfcHJpdmF0ZV9zdGF0aWNfZmllbGRfZGVzY3JpcHRvcmNsYXNzX2V4dHJhY3RfZmllbGRfZGVzY3JpcHRvcmNsYXNzX25hbWVfdGR6X2Vycm9yY2xhc3NfcHJpdmF0ZV9maWVsZF9nZXRjbGFzc19wcml2YXRlX2ZpZWxkX2luaXRjbGFzc19wcml2YXRlX2ZpZWxkX2xvb3NlX2Jhc2VjbGFzc19wcml2YXRlX2ZpZWxkX2xvb3NlX2tleWNsYXNzX3ByaXZhdGVfZmllbGRfc2V0Y2xhc3NfcHJpdmF0ZV9maWVsZF91cGRhdGVjbGFzc19wcml2YXRlX21ldGhvZF9nZXRjbGFzc19wcml2YXRlX21ldGhvZF9pbml0Y2xhc3NfcHJpdmF0ZV9tZXRob2Rfc2V0Y2xhc3Nfc3RhdGljX3ByaXZhdGVfZmllbGRfc3BlY19nZXRjbGFzc19zdGF0aWNfcHJpdmF0ZV9maWVsZF9zcGVjX3NldGNsYXNzX3N0YXRpY19wcml2YXRlX2ZpZWxkX3VwZGF0ZWNvbnN0cnVjdGNyZWF0ZV9jbGFzc2RlY29yYXRlZGVmYXVsdHNkZWZpbmVfZW51bWVyYWJsZV9wcm9wZXJ0aWVzZGVmaW5lX3Byb3BlcnR5ZXhwb3J0X3N0YXJnZXRfcHJvdG90eXBlX29maW5oZXJpdHNpbmhlcml0c19sb29zZWluaXRpYWxpemVyX2RlZmluZV9wcm9wZXJ0eWluaXRpYWxpemVyX3dhcm5pbmdfaGVscGVyaW50ZXJvcF9yZXF1aXJlX2RlZmF1bHRpbnRlcm9wX3JlcXVpcmVfd2lsZGNhcmRpc19uYXRpdmVfZnVuY3Rpb25pdGVyYWJsZV90b19hcnJheWl0ZXJhYmxlX3RvX2FycmF5X2xpbWl0aXRlcmFibGVfdG9fYXJyYXlfbGltaXRfbG9vc2Vqc3huZXdfYXJyb3dfY2hlY2tub25faXRlcmFibGVfcmVzdG5vbl9pdGVyYWJsZV9zcHJlYWRvYmplY3RfZGVzdHJ1Y3R1cmluZ19lbXB0eW9iamVjdF9zcHJlYWRvYmplY3Rfc3ByZWFkX3Byb3Bzb2JqZWN0X3dpdGhvdXRfcHJvcGVydGllc29iamVjdF93aXRob3V0X3Byb3BlcnRpZXNfbG9vc2VvdmVybG9hZF95aWVsZHBvc3NpYmxlX2NvbnN0cnVjdG9yX3JldHVybnJlYWRfb25seV9lcnJvcnNldF9wcm90b3R5cGVfb2Zza2lwX2ZpcnN0X2dlbmVyYXRvcl9uZXh0c2xpY2VkX3RvX2FycmF5c2xpY2VkX3RvX2FycmF5X2xvb3Nlc3VwZXJfcHJvcF9iYXNldGFnZ2VkX3RlbXBsYXRlX2xpdGVyYWx0YWdnZWRfdGVtcGxhdGVfbGl0ZXJhbF9sb29zZXRvX2FycmF5dG9fY29uc3VtYWJsZV9hcnJheXRvX3ByaW1pdGl2ZXRvX3Byb3BlcnR5X2tleXR5cGVfb2Z1bnN1cHBvcnRlZF9pdGVyYWJsZV90b19hcnJheXdyYXBfYXN5bmNfZ2VuZXJhdG9yd3JhcF9uYXRpdmVfc3VwZXJ3cml0ZV9vbmx5X2Vycm9yY2xhc3NfcHJpdmF0ZV9maWVsZF9kZXN0cnVjdHVyZWNsYXNzX3N0YXRpY19wcml2YXRlX2ZpZWxkX2Rlc3RydWN0dXJlY2xhc3Nfc3RhdGljX3ByaXZhdGVfbWV0aG9kX2dldGNsYXNzX2NoZWNrX3ByaXZhdGVfc3RhdGljX2FjY2Vzc2lzX25hdGl2ZV9yZWZsZWN0X2NvbnN0cnVjdGNyZWF0ZV9zdXBlcmNyZWF0ZV9mb3Jfb2ZfaXRlcmF0b3JfaGVscGVyX2xvb3NldHNfZGVjb3JhdGV0c19nZW5lcmF0b3J0c19tZXRhZGF0YXRzX3BhcmFtdHNfdmFsdWVzdHNfYWRkX2Rpc3Bvc2FibGVfcmVzb3VyY2V0c19kaXNwb3NlX3Jlc291cmNlc3RzX3Jld3JpdGVfcmVsYXRpdmVfaW1wb3J0X2V4dGVuc2lvbmFwcGx5X2RlY3NfMjIwM19yaWRlbnRpdHlkaXNwb3NldXNpbmdfY3R4YXJndW1lbnRzbm90IGltcGxlbWVudGVkL2hvbWUvbm9kZS9idWlsZC9kZXBzL3N3Yy9jcmF0ZXMvc3djX2VjbWFfdXRpbHMvc3JjL2xpYi5ycwBFsiYAOgAAAPwJAAA+AAAAxAQAAAQAAAAEAAAAegEAAEWyJgA6AAAACgoAADwAAABFsiYAOgAAAOkJAAAmAAAATgQAAAwAAAAEAAAATwQAAFAEAACvAgAAAAAAAAAAAAABAAAAUQQAAENsYXNzRm5WYXJVc2luZ1RzSW50ZXJmYWNlVHNUeXBlQWxpYXNUc0VudW1Uc01vZHVsZWNyYXRlcy9zd2NfZWNtYV90cmFuc2Zvcm1zX3R5cGVzY3JpcHQvc3JjL3NlbWFudGljLnJzG7MmADUAAABTAQAAKwAAABuzJgA1AAAA7gEAACQAAABuYW1lc3BhY2UgYmxvY2sgc3RhY2sgc2hvdWxkIGNvbnRhaW4gY3VycmVudCBibG9jawAAG7MmADUAAAD1AQAADgAAAGNyYXRlcy9zd2NfZWNtYV90cmFuc2Zvcm1zX3R5cGVzY3JpcHQvc3JjL3RyYW5zZm9ybS5ycwAAtLMmADYAAACQAAAAFwAAALSzJgA2AAAArAAAABIAAAC0syYANgAAABMBAAAoAAAAtLMmADYAAAAUAQAALQAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGRlc3RydWN0dXJpbmcgcGF0dGVybiBpbnNpZGUgVHNQYXJhbWV0ZXJQcm9wZXJ0eQAALLQmAFoAAAC0syYANgAAAAABAAAhAAAAtLMmADYAAAAxAQAAEgAAALSzJgA2AAAA6wEAACwAAAC0syYANgAAADADAAAnAAAAtLMmADYAAAAtAwAAMgAAALSzJgA2AAAAswMAAEEAAAC0syYANgAAACYEAAANAAAAtLMmADYAAACGBAAAHwAAALSzJgA2AAAAhwQAAB8AAAC0syYANgAAAK8EAAAfAAAAtLMmADYAAAC3BAAAHQAAALSzJgA2AAAA0wQAACMAAAC0syYANgAAAH8EAAAxAAAAxQQAACgAAAAIAAAAQAEAALSzJgA2AAAAkgQAAEAAAABJbXBvcnQgZGVjbGFyYXRpb25zIGluIGEgbmFtZXNwYWNlIGNhbm5vdCByZWZlcmVuY2UgYSBtb2R1bGUuRVNNLXN0eWxlIG1vZHVsZSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwZXJtaXR0ZWQgaW4gYSBuYW1lc3BhY2UutLMmADYAAABHBQAAIwAAALSzJgA2AAAAHQUAACsAAAC0syYANgAAACkFAABRAAAAtLMmADYAAAAsBQAAHwAAALSzJgA2AAAANgUAAFYAAAC0syYANgAAADgFAAAfAAAAZXhwb3J0cwC0syYANgAAAG4GAAAjAAAAtLMmADYAAAByBgAAHwAAALSzJgA2AAAAKQYAABoAAAC0syYANgAAACsGAAAaAAAASW1wb3J0IGFzc2lnbm1lbnQgY2Fubm90IGJlIHVzZWQgd2hlbiB0YXJnZXRpbmcgRUNNQVNjcmlwdCBtb2R1bGVzLiBDb25zaWRlciB1c2luZyBgaW1wb3J0ICogYXMgbnMgZnJvbSAibW9kImAsIGBpbXBvcnQge2F9IGZyb20gIm1vZCJgLCBgaW1wb3J0IGQgZnJvbSAibW9kImAsIG9yIGFub3RoZXIgbW9kdWxlIGZvcm1hdCBpbnN0ZWFkLkV4cG9ydCBhc3NpZ25tZW50IGNhbm5vdCBiZSB1c2VkIHdoZW4gdGFyZ2V0aW5nIEVDTUFTY3JpcHQgbW9kdWxlcy4gQ29uc2lkZXIgdXNpbmcgYGV4cG9ydCBkZWZhdWx0YCBvciBhbm90aGVyIG1vZHVsZSBmb3JtYXQgaW5zdGVhZC5Pbmx5IGFtYmllbnQgbW9kdWxlcyBjYW4gdXNlIHF1b3RlZCBuYW1lcy60syYANgAAANcGAAAOAAAAY3JhdGVzL3N3Y19lY21hX3RyYW5zZm9ybXNfdHlwZXNjcmlwdC9zcmMvdHNfZW51bS5yc05hTkluZmluaXR5ACS4JgA0AAAAuAAAABIAAAABAAAAAAAAAAEAAAAAAAAAJLgmADQAAADiAAAAGgAAAGNyYXRlcy9zd2NfZWNtYV90cmFuc2Zvcm1zX3R5cGVzY3JpcHQvc3JjL3R5cGVzY3JpcHQucnMAlLgmADcAAAA7AAAALAAAAJS4JgA3AAAAUwAAABAAAABfY3JlYXRlUmVxdWlyZV9fcmVxdWlyZWNyZWF0ZVJlcXVpcmVOBAAADAAAAAQAAABPBAAAUAQAAK8CAAAAAAAAAAAAAAEAAABRBAAAL3J1c3RjLzJlNjg4MmFjNWJlMjdhNzMyOTNkNmY3YWU1NjM5N2ZkZjMyODQ4ZGUvbGlicmFyeS9hbGxvYy9zcmMvdmVjL21vZC5yczi5JgBMAAAAVgoAACQAAAAAAAAADAAAAAQAAADKBAAAywQAAGNvbnN0cnVjdG9yIHNob3VsZCBoYXZlIGEgYm9keWNyYXRlcy9zd2NfZWNtYV91dGlscy9zcmMvY29uc3RydWN0b3IucnMAAMa5JgAoAAAADgAAACAAAABTeW1ib2wAAAEAAAAAAAAAfNUmAAEAAABzdXBlcl8AABi6JgAGAAAAfNUmAAEAAAAYySYAPQAAAHoCAAAUAAAAGMkmAD0AAACiAgAAPAAAABjJJgA9AAAAkQIAAD4AAACsAgAADAAAAAQAAAAtBAAAzQQAAK8CAAAAAAAAAAAAAAEAAACwAgAAQOgmAE8AAAAKAgAANwAAAM4EAAAsAAAABAAAAM8EAADQBAAA0QQAANIEAADTBAAA1AQAALYCAAAkc2VyZGVfanNvbjo6cHJpdmF0ZTo6UmF3VmFsdWVyYW5nZSAgb3V0IG9mIGJvdW5kczog3romAAYAAADkuiYAEAAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL2JpdHZlYy0xLjAuMS9zcmMvc2xpY2UvYXBpLnJzAAAEuyYAYgAAAI4KAAABAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc2VyZGVfanNvbi0xLjAuMTQwL3NyYy9zZXIucnMAAHi7JgBiAAAADQYAABIAAAB4uyYAYgAAAEwIAAAzAAAAdXV1dXV1dXVidG51ZnJ1dXV1dXV1dXV1dXV1dXV1dXUAACIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHi7JgBiAAAAPwgAAEAAAAAiXCJcXFxiXGZcblxyXHQAeMkmAF4AAAA0AAAABQAAAEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8vaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi93eXotMC41LjEvc3JjL2NvbXUucnMAAGy9JgBaAAAAJwEAAAIAAADVBAAADAAAAAQAAADWBAAA1wQAAK8CAAAAAAAAAAAAAAEAAAATBAAAdTgAANgEAAAUAAAABAAAANkEAAAAAAAACAAAAAQAAADaBAAAL3J1c3RjLzJlNjg4MmFjNWJlMjdhNzMyOTNkNmY3YWU1NjM5N2ZkZjMyODQ4ZGUvbGlicmFyeS9hbGxvYy9zcmMvY29sbGVjdGlvbnMvYnRyZWUvbmF2aWdhdGUucnMAJL4mAF8AAADGAAAAJwAAAC9ydXN0Yy8yZTY4ODJhYzViZTI3YTczMjkzZDZmN2FlNTYzOTdmZGYzMjg0OGRlL2xpYnJhcnkvYWxsb2Mvc3JjL2NvbGxlY3Rpb25zL2J0cmVlL21hcC9lbnRyeS5yc5S+JgBgAAAAoQEAAC4AAAAvcnVzdGMvMmU2ODgyYWM1YmUyN2E3MzI5M2Q2ZjdhZTU2Mzk3ZmRmMzI4NDhkZS9saWJyYXJ5L2FsbG9jL3NyYy9jb2xsZWN0aW9ucy9idHJlZS9ub2RlLnJzYXNzZXJ0aW9uIGZhaWxlZDogZWRnZS5oZWlnaHQgPT0gc2VsZi5oZWlnaHQgLSAxAAS/JgBbAAAArQIAAAkAAABhc3NlcnRpb24gZmFpbGVkOiBzcmMubGVuKCkgPT0gZHN0LmxlbigpBL8mAFsAAABKBwAABQAAAAS/JgBbAAAAxwQAACMAAAAEvyYAWwAAAAoFAAAkAAAAYXNzZXJ0aW9uIGZhaWxlZDogZWRnZS5oZWlnaHQgPT0gc2VsZi5ub2RlLmhlaWdodCAtIDEAAAAEvyYAWwAAAPoDAAAJAAAAJL4mAF8AAABYAgAAMAAAACS+JgBfAAAAFgIAAC8AAAAkviYAXwAAAKEAAAAkAAAAYXR0ZW1wdCB0byBqb2luIGludG8gY29sbGVjdGlvbiB3aXRoIGxlbiA+IHVzaXplOjpNQVgvcnVzdGMvMmU2ODgyYWM1YmUyN2E3MzI5M2Q2ZjdhZTU2Mzk3ZmRmMzI4NDhkZS9saWJyYXJ5L2FsbG9jL3NyYy9zdHIucnMAAAClwCYASAAAAJoAAAAKAAAApcAmAEgAAACdAAAAFgAAAKXAJgBIAAAAsQAAABYAAABOdWxsUHRyRXJyb3JJbmNsdWRlZEV4Y2x1ZGVkVW5ib3VuZGVkY2Fubm90ICBiaXRzIGZyb20gYSAtYml0IHJlZ2lvbkXBJgAHAAAAJMsmAAEAAABMwSYADQAAAFnBJgALAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvYml0dmVjLTEuMC4xL3NyYy9maWVsZC5ycwAAhMEmAF4AAAAOAgAAAgAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL2JpdHZlYy0xLjAuMS9zcmMvc2xpY2UucnMAAPTBJgBeAAAA9wAAAB8AAAD0wSYAXgAAAE8BAAAjAAAAaW5kZXggIG91dCBvZiByYW5nZTogAAAAdMImAAYAAAB6wiYADwAAAPTBJgBeAAAAMQYAAAMAAAAuLmxvYWRCaXRTcGFuRXJyb3I8Pjo6AACywiYADQAAAL/CJgADAAAATnVsbE1pc2FsaWduZWRUb29Mb25nVG9vSGlnaE1pc2FsaWduRXJyb3IAAAABAAAAeLsmAGIAAAB/AgAAKgAAAHi7JgBiAAAApAIAACoAAAB4uyYAYgAAAPwBAAAqAAAAeLsmAGIAAAAKAgAAKgAAAGV4cGVjdGVkIFJhd1ZhbHVlY3JhdGVzL3N3Y19zb3VyY2VtYXAvc3JjL2J1aWxkZXIucnNVwyYAIwAAAGwAAAAaAAAAVcMmACMAAABtAAAAIgAAAENhbm5vdCBzZXQgc291cmNlcyBmb3IgdG9tYnN0b25lIHNvdXJjZSBpZAAAVcMmACMAAACDAAAACQAAAFXDJgAjAAAAhwAAAB0AAABVwyYAIwAAAAoBAAAVAAAAY3JhdGVzL3N3Y19zb3VyY2VtYXAvc3JjL2VuY29kZXIucnMA9MMmACMAAAA3AAAADQAAAGludmFsaWQgYnl0ZfTDJgAjAAAAIwAAABIAAABpbnZhbGlkIHV0Zjj0wyYAIwAAAGYAAAAhAAAA9MMmACMAAABYAAAAEQAAAGJhZCBqc29uOiAAAHDEJgAKAAAAbGVmdG92ZXIgY3VyL3NoaWZ0IGluIHZscSBkZWNvZGV2bHEgZGVjb2RlIGRpZCBub3QgcHJvZHVjZSBhbnkgdmFsdWVzdmxxIGRlY29kZSBjYXVzZWQgYW4gb3ZlcmZsb3dnb3QgIHNlZ21lbnRzLCBleHBlY3RlZCA0IG9yIDXmxCYABAAAAOrEJgAaAAAAYmFkIHJlZmVyZW5jZSB0byBzb3VyY2UgIwAAABTFJgAZAAAAYmFkIHJlZmVyZW5jZSB0byBuYW1lICMAOMUmABcAAABlbmNvdW50ZXJlZCBpbmNvbXBhdGlibGUgc291cmNlbWFwIGZvcm1hdHRoZSBwcm92aWRlZCBkYXRhIFVSTCBpcyBpbnZhbGlkY2Fubm90IGZsYXR0ZW4gdGhlIGluZGV4ZWQgc291cmNlbWFwOiAAocUmACYAAABpbnZhbGlkIG1hZ2ljIG51bWJlciBmb3IgcmFtIGJ1bmRsZWludmFsaWQgbW9kdWxlIGluZGV4IGluIHJhbSBidW5kbGVpbnZhbGlkIHJhbSBidW5kbGUgbW9kdWxlIGVudHJ5bm90IGEgcmFtIGJ1bmRsZWludmFsaWQgcmFuZ2UgbWFwcGluZyBpbmRleDogAAAARMYmAB0AAABpbnZhbGlkIGJhc2U2NCBjaGFyYWN0ZXI6IAAAbMYmABoAAABodHRwOmh0dHBzOgABAAAAAAAAALrLJgABAAAAbGluZWNvbHVtbm9mZnNldHVybG1hcG5hbWVzbWFwcGluZ3N2ZXJzaW9uZmlsZXNvdXJjZXNzb3VyY2VSb290c291cmNlc0NvbnRlbnRzZWN0aW9uc3Njb3Blc3JhbmdlTWFwcGluZ3NpZ25vcmVMaXN0eF9mYWNlYm9va19vZmZzZXRzeF9tZXRyb19tb2R1bGVfcGF0aHN4X2ZhY2Vib29rX3NvdXJjZXNkZWJ1Z19pZGRlYnVnSWQvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9udW0tYmlnaW50LTAuNC42L3NyYy9iaWdpbnQucnNlxyYAYwAAAGwDAAAPAAAAAAAAAAQAAAAAAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvbnVtLWJpZ2ludC0wLjQuNi9zcmMvYmlndWludC9jb252ZXJ0LnJz5McmAGwAAADwAQAAFgAAAGNhbm5vdCBhY2Nlc3MgYSBzY29wZWQgdGhyZWFkIGxvY2FsIHZhcmlhYmxlIHdpdGhvdXQgY2FsbGluZyBgc2V0YCBmaXJzdC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3Njb3BlZC10bHMtMS4wLjEvc3JjL2xpYi5yc6jIJgBgAAAAqAAAAAkAAAAvaG9tZS9ub2RlL2J1aWxkL2RlcHMvc3djL2NyYXRlcy9zd2NfY29tbW9uL3NyYy9zb3VyY2VfbWFwLnJzAAAAGMkmAD0AAAA9BQAASgAAABjJJgA9AAAAagUAACYAAAAvcnVzdGMvMmU2ODgyYWM1YmUyN2E3MzI5M2Q2ZjdhZTU2Mzk3ZmRmMzI4NDhkZS9saWJyYXJ5L2FsbG9jL3NyYy92ZWMvc3BlY19mcm9tX2l0ZXJfbmVzdGVkLnJzAAB4ySYAXgAAABMAAAAFAAAAL2hvbWUvbm9kZS9idWlsZC9kZXBzL3N3Yy9jcmF0ZXMvc3djX2VjbWFfdHJhbnNmb3Jtc19iYXNlL3NyYy9yZW5hbWUvb3BzLnJzAOjJJgBLAAAASgIAABcAAADoySYASwAAAE8CAAARAAAA6MkmAEsAAAAeAQAAGQAAAOjJJgBLAAAARwEAABkAAADoySYASwAAAHsBAAAcAAAA6MkmAEsAAAC7AQAAFwAAAOjJJgBLAAAAwAEAABEAAADoySYASwAAAH4CAAASAAAAL2hvbWUvbm9kZS9idWlsZC9kZXBzL3N3Yy9jcmF0ZXMvc3djX2VjbWFfY29kZWdlbi9zcmMvdGV4dF93cml0ZXIvYmFzaWNfaW1wbC5yczu0yiYATwAAAE4BAAAQAAAAtMomAE8AAABZAQAAGgAAACAAAAC0yiYATwAAAIsBAAAgAAAAtMomAE8AAACQAQAAGAAAALTKJgBPAAAAfwEAACMAAAB2YXJsZXRjb25zdE5vbmUtKyF+dHlwZW9mdm9pZGRlbGV0ZT0rPS09Kj0vPSU9PDw9Pj49Pj4+PXw9Xj0mPSoqPSYmPXx8PT8/PT09IT09PT0hPT08PD0+Pj08PD4+Pj4+Ki8lfF4mfHwmJmluaW5zdGFuY2VvZioqPz8rKy0tL3J1c3RjLzJlNjg4MmFjNWJlMjdhNzMyOTNkNmY3YWU1NjM5N2ZkZjMyODQ4ZGUvbGlicmFyeS9jb3JlL3NyYy9pdGVyL3RyYWl0cy9pdGVyYXRvci5ycwDXyyYAWAAAANMHAAAJAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL3V0aWwvaXRlci5yc3VuZXhwZWN0ZWQgcmVnZXggZmluZCBlcnJvcjogCnRvIGhhbmRsZSBmaW5kIGVycm9ycywgdXNlICd0cnknIG9yICdzZWFyY2gnIG1ldGhvZHOqzCYAHQAAAMfMJgA1AAAAQMwmAGoAAAB+AQAAGQAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy91dGlsL3Bvb2wucnMAABzNJgBqAAAAPQIAABwAAAAczSYAagAAAEQCAAAyAAAAHM0mAGoAAABeAgAAHAAAABzNJgBqAAAAawIAADIAAAAczSYAagAAAG8CAAAXAAAAAgAAABzNJgBqAAAAAQMAABUAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvdXRpbC9zZWFyY2gucnNpbnZhbGlkIHNwYW4gIGZvciBoYXlzdGFjayBvZiBsZW5ndGggAAAAWM4mAA0AAABlziYAGAAAAOzNJgBsAAAAqgEAAAkAAABhc3NlcnRpb24gZmFpbGVkOiBzcGFuLmxvID49IHNlbGYuaW5wdXQuc3RhcnRfcG9zKCkgJiYgc3Bhbi5oaSA8PSBzZWxmLmlucHV0LmVuZF9wb3MoKS9ob21lL25vZGUvYnVpbGQvZGVwcy9zd2MvY3JhdGVzL3N3Y19lY21hX3BhcnNlci9zcmMvbGV4ZXIvc3RhdGUucnMAAAD2ziYAQwAAAFEAAAAJAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogAABMzyYAKgAAAAIAAAAAAAAAAgAAAAAAAAAAAAAAIACA4C9ob21lL25vZGUvYnVpbGQvZGVwcy9zd2MvY3JhdGVzL3N3Y19lY21hX3BhcnNlci9zcmMvbGV4ZXIvdG9rZW4ucnMAmM8mAEMAAAB9AQAAEQAAAC9ob21lL25vZGUvYnVpbGQvZGVwcy9zd2MvY3JhdGVzL3N3Y19lY21hX3BhcnNlci9zcmMvbGV4ZXIvY2FwdHVyaW5nLnJzAOzPJgBHAAAAPgAAAAsAAABhYnN0cmFjdGVudW1pbnRlcmZhY2Vtb2R1bGVuYW1lc3BhY2V0eXBlL2hvbWUvbm9kZS9idWlsZC9kZXBzL3N3Yy9jcmF0ZXMvc3djX2VjbWFfcGFyc2VyL3NyYy9wYXJzZXIvdHlwZXNjcmlwdC5ycwAAAGzQJgBJAAAAOwAAABcAAABs0CYASQAAAD8AAAARAAAACgkAAGzQJgBJAAAAcQEAACAAAAACA2RlY2xhcmVnbG9iYWwSkI+OkZ1ZkI6PkXNRjGCLbC9ydXN0Yy8yZTY4ODJhYzViZTI3YTczMjkzZDZmN2FlNTYzOTdmZGYzMjg0OGRlL2xpYnJhcnkvYWxsb2Mvc3JjL3N0cmluZy5ycwAM0SYASwAAAOgB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c3djL2NyYXRlcy9zd2NfZWNtYV9wYXJzZXIvc3JjL3BhcnNlci9pZGVudC5yc1zfJgBEAAAAzAAAAA0AAABsZXQgaXMgcmVzZXJ2ZWQgaW4gY29uc3QsIGxldCwgY2xhc3MgZGVjbGFyYXRpb25pZGVudGlmaWVyIG9yIHN0cmluZy9ob21lL25vZGUvYnVpbGQvZGVwcy9zd2MvY3JhdGVzL3N3Y19lY21hX3BhcnNlci9zcmMvcGFyc2VyL2lucHV0LnJz9N8mAEQAAACDAQAAIAAAAPTfJgBEAAAAZAAAAA0AAAD03yYARAAAAJwAAAANAAAA9N8mAEQAAACOAAAADQAAAPTfJgBEAAAAhwAAAA0AAAD03yYARAAAAHIAAAANAAAA9N8mAEQAAAB5AAAADQAAAPTfJgBEAAAAgAAAAA0AAAD03yYARAAAAJUAAAANAAAAL2hvbWUvbm9kZS9idWlsZC9kZXBzL3N3Yy9jcmF0ZXMvc3djX2VjbWFfcGFyc2VyL3NyYy9wYXJzZXIvb2JqZWN0LnJzAAAAyOAmAEUAAAAWAAAAHQAAAMjgJgBFAAAAGQAAABcAAAAuLi4gLCAqLCAgKCwgWywgOiwgLCA/LCA9LCBhbiBpZGVudGlmaWVyLCBwdWJsaWMsIHByb3RlY3RlZCwgcHJpdmF0ZSwgcmVhZG9ubHksIDwuLi4uICwgKiwgICgsIFssIDosICwgPywgPSBvciBhbiBpZGVudGlmaWVyaWRlbnRpZmllcgAAyOAmAEUAAACfAQAAIgAAAGFuIGlkZW50aWZpZXIvaG9tZS9ub2RlL2J1aWxkL2RlcHMvc3djL2NyYXRlcy9zd2NfZWNtYV9jb2RlZ2VuL3NyYy90eXBlc2NyaXB0LnJzZXhwb3J0bmV3OmFzPT59Li4udGhpc1tdaW5mZXJwdWJsaWNwcm90ZWN0ZWRwcml2YXRlb3ZlcnJpZGVyZWFkb25seWV4dGVuZHMsLj8AAADV4SYAQwAAABUCAAAiAAAAJHsAANXhJgBDAAAAGAIAACEAAAB1bmRlZmluZWRrZXlvZnVuaXF1ZXNhdGlzZmllc2Fzc2VydHNpc2dldHNldHJlcXVpcmV3aXRoALTKJgBPAAAAgAAAABoAAAAgICAgtMomAE8AAACZAAAAGAAAAC9ob21lL25vZGUvYnVpbGQvZGVwcy9zd2MvY3JhdGVzL3N3Y19lY21hX2NvZGVnZW4vc3JjL21vZHVsZV9kZWNscy5yc2Zyb21hc3NlcnQA6OImAEUAAAChAAAAIAAAAGFzc2VydGlvbiBmYWlsZWQ6IHNlbGYuc3BlY2lmaWVycy5sZW4oKSA8PSAy6OImAEUAAACvAAAAFQAAAOjiJgBFAAAAZQEAACgAAABub3QgaW1wbGVtZW50ZWQ6IGNvZGVnZW4gb2YgYGV4cG9ydCBkZWZhdWx0IGZyb20gJ2Zvbyc7YJTjJgA4AAAA6OImAEUAAAAHAQAAEQAAAGRlZmF1bHQvaG9tZS9ub2RlL2J1aWxkL2RlcHMvc3djL2NyYXRlcy9zd2NfZWNtYV9jb2RlZ2VuL3NyYy9saWIucnMA6+MmADwAAADIAwAAEgAAAOvjJgA8AAAAOQIAAEgAAADr4yYAPAAAADoCAAAoAAAA6+MmADwAAAD+AAAATAAAAOvjJgA8AAAAAQEAACcAAAA8LzwvPjw+L2hvbWUvbm9kZS9idWlsZC9kZXBzL3N3Yy9jcmF0ZXMvc3djX2VjbWFfY29kZWdlbi9zcmMvbGl0LnJzAH/kJgA8AAAA/wAAADQAAABmYWxzZXRydWV1c2Ugc3RyaWN0c2NyaXB0XHV7PCEtLVx4M2MhLS0tLT4tLVx4M2VuLTB4/eQmAAMAAAAweAAACOUmAAIAAAAvaG9tZS9ub2RlL2J1aWxkL2RlcHMvc3djL2NyYXRlcy9zd2NfZWNtYV9jb2RlZ2VuL3NyYy9kZWNsLnJzAAAAFOUmAD0AAABDAAAAPwAAAGNsYXNzZnVuY3Rpb24AAAAU5SYAPQAAALQAAAAXAAAAYXdhaXQvaG9tZS9ub2RlL2J1aWxkL2RlcHMvc3djL2NyYXRlcy9zd2NfZWNtYV9jb2RlZ2VuL3NyYy9zdG10LnJzaWZlbHNlZm9ydHJ5ZmluYWxseWJyZWFrb2Z0aHJvd3doaWxlcmV0dXJuY2FzZYnlJgA9AAAAEQEAAB0AAACJ5SYAPQAAABQBAABBAAAAc3dpdGNoY2F0Y2gAieUmAD0AAADjAAAAPwAAAGRvY29udGludWVkZWJ1Z2dlci9ob21lL25vZGUvYnVpbGQvZGVwcy9zd2MvY3JhdGVzL3N3Y19lY21hX2NvZGVnZW4vc3JjL2NsYXNzLnJzaW1wbGVtZW50c3N0YXRpY0LmJgA+AAAAMQEAABcAAABjb25zdHJ1Y3RvcgBC5iYAPgAAAEQCAAAXAAAAYWNjZXNzb3JC5iYAPgAAAPEAAAAXAAAAL2hvbWUvbm9kZS9idWlsZC9kZXBzL3N3Yy9jcmF0ZXMvc3djX2VjbWFfY29kZWdlbi9zcmMvb2JqZWN0LnJzANTmJgA/AAAAzAAAABcAAADU5iYAPwAAAJMAAABBAAAALy8vKiovIGlzIGFscmVhZHkgcmVuYW1lZCB0byAsIGJ1dCBpdCdzIHJlbmFtZWQgYXMgAEzPJgAqAAAAOucmABcAAABR5yYAFgAAAC9ob21lL25vZGUvYnVpbGQvZGVwcy9zd2MvY3JhdGVzL3N3Y19lY21hX3RyYW5zZm9ybXNfYmFzZS9zcmMvcmVuYW1lL21vZC5ycwCA5yYASwAAABEBAAAZAAAAZXZhbNsEAAAMAAAABAAAAC0EAACuAgAArwIAAGEgRGlzcGxheSBpbXBsZW1lbnRhdGlvbiByZXR1cm5lZCBhbiBlcnJvciB1bmV4cGVjdGVkbHkADNEmAEsAAADwCgAADgAAAC9ydXN0Yy8yZTY4ODJhYzViZTI3YTczMjkzZDZmN2FlNTYzOTdmZGYzMjg0OGRlL2xpYnJhcnkvY29yZS9zcmMvc3RyL3BhdHRlcm4ucnMAQOgmAE8AAADiBQAAFAAAAEDoJgBPAAAA4gUAACEAAABA6CYATwAAANYFAAAhAAAAZGVzY3JpcHRpb24oKSBpcyBkZXByZWNhdGVkOyB1c2UgRGlzcGxheW1pZCA+IGxlbgAAAOjoJgAJAAAAL3J1c3RjLzJlNjg4MmFjNWJlMjdhNzMyOTNkNmY3YWU1NjM5N2ZkZjMyODQ4ZGUvbGlicmFyeS9jb3JlL3NyYy9zbGljZS9tb2QucnMAAAD86CYATQAAAOwDAAArAAAAL3J1c3RjLzJlNjg4MmFjNWJlMjdhNzMyOTNkNmY3YWU1NjM5N2ZkZjMyODQ4ZGUvbGlicmFyeS9jb3JlL3NyYy9zbGljZS9zb3J0L3N0YWJsZS9kcmlmdC5ycwBc6SYAWwAAAP8AAAAZAAAAXOkmAFsAAADyAAAAEgAAAFzpJgBbAAAAzgAAACQAAABc6SYAWwAAANEAAAAkAAAAXOkmAFsAAABAAAAAIgAAAC9ydXN0Yy8yZTY4ODJhYzViZTI3YTczMjkzZDZmN2FlNTYzOTdmZGYzMjg0OGRlL2xpYnJhcnkvY29yZS9zcmMvc2xpY2Uvc29ydC9zdGFibGUvcXVpY2tzb3J0LnJzAAjqJgBfAAAATgAAAB8AAAAI6iYAXwAAAEgAAAAXAAAAAAAAAAQAAAAEAAAAYAAAAAAAAAAEAAAABAAAANwEAADdBAAACAAAAAQAAADeBAAA3wQAAAwAAAAEAAAA4AQAAN8EAAAMAAAABAAAAJcCAADgBAAAuOomALYCAADhBAAAuAIAAOIEAAC5AgAA4wQAABQAAAAEAAAA5AQAAOMEAAAUAAAABAAAAJgCAADkBAAA9OomALYCAADlBAAA5gQAALYCAAC5AgAARXJyb3JJZGVudEFycmF5UmVzdE9iamVjdEFzc2lnbkludmFsaWRFeHByL3J1c3RjLzJlNjg4MmFjNWJlMjdhNzMyOTNkNmY3YWU1NjM5N2ZkZjMyODQ4ZGUvbGlicmFyeS9hbGxvYy9zcmMvc2xpY2UucnNa6yYASgAAAGIDAAAJAAAAL3J1c3RjLzJlNjg4MmFjNWJlMjdhNzMyOTNkNmY3YWU1NjM5N2ZkZjMyODQ4ZGUvbGlicmFyeS9hbGxvYy9zcmMvYm9ycm93LnJzALTrJgBLAAAAFQEAACUAAABVdGY4RXJyb3J2YWxpZF91cF90b2Vycm9yX2xlbjxpbnZhbGlkPkZyb21VdGY4RXJyb3JieXRlc2Vycm9ySW9VdGY4QmFkSnNvblZscUxlZnRvdmVyVmxxTm9WYWx1ZXNWbHFPdmVyZmxvd0JhZFNlZ21lbnRTaXplQmFkU291cmNlUmVmZXJlbmNlQmFkTmFtZVJlZmVyZW5jZUluY29tcGF0aWJsZVNvdXJjZU1hcEludmFsaWREYXRhVXJsQ2Fubm90RmxhdHRlbkludmFsaWRSYW1CdW5kbGVNYWdpY0ludmFsaWRSYW1CdW5kbGVJbmRleEludmFsaWRSYW1CdW5kbGVFbnRyeU5vdEFSYW1CdW5kbGVJbnZhbGlkUmFuZ2VNYXBwaW5nSW5kZXhJbnZhbGlkQmFzZTY0U29tZWludmFsaWQgdXRmLTg6IGNvcnJ1cHQgY29udGVudHMA6+MmADwAAAB4CAAAIgAAAOvj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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////////////////////////////////////z8//////z8//6r///8/////////31/cH88P/x/cHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAQgBP//f////3///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKAE//9/////f///////////////////////////////////////////////////////////////////////DwD//3/4//////8P////////////////////////////////w/8DAB9QAAAAAAAAAAAAAAAAAAAAAN+8QNf///v///////////+//////////////////////////////////8P/AwAfUAAA///////////////////fvMDX///7////////////v///////////////////////A/z///////////////////////////7///9/Av//////AQAAAAAAAAAA////hwcA//////////////////////v8///////////////////////////+////fwL//////wH+/////7+2AP///4cHAAAAAAD//////wcAAADA/v//////////////LwBgwACcAAD9////AAAA4P////////////8/AAIAAPz///8HMAQAAP8H////////////w////////////////++f//3/nwAA/////////+f///////////////8DAP///////z8k//8/BBABAAD///8B/wf///9+AAD//////wMAAAAAAADw////////IwAAAf8DAP7/4Z/5///9xSMAQACwAwADEP//////PwAA////D/8H////foD////////////7////////////////////z//+/++f+f///cXzn3mAsM//A1Dgh/n///1tAwAAAF4AABwA4L/7///97SMAAAEAAwAAAuCf+f///e0jAAAAsAMAAgDoxz3WGMf/AwAAAQAAAAAA7of5///9bdOHOQJewP8/AO6/+////e3zvzsBAM//AP7un/n///3t85854LDP/wIA7Mc91hjH/8PHPYEAwP8AAODf/f///f8jAAAAJwMAAADh3/3///3vIwAAAGADAAYA8N/9/////ycAQHCAAwAA/OD/f/z///svfwAAAAAAAAD/3/3///3/8989YCfP/wAA79/9///97/PfPWBgz/8OAP/f/f//////333wgM//APzu/3/8///7L3+EX//A/wwA/v//////DQB/AAAAAAAAANb3//+v/w0gXwAA8AAAAAABAAAAAAAAAP/+////HwAAAB8AAAAAAAAAAAAAAAAAAP7///////8H/3//AwAAAADW9///r///P19///MAAAAAAQAAA/8DoML//v///x/+/9////7///8fQAAAAAAAAAD//////wcAgAAAPzxiwOH/A0AAAP////+/IP//////9////////////////////////////////////////////////////z8AAP///////////P///////wAAAAAA/w////////////8D////////////P/////+/IP//////9///////////////////////////////////////////////////fwD//z8A/wAAAL////////0HAAAAAAAAAAD///////////89fz3//////z3/////PX89/3//////////Pf//////////BwAAAAD//wAA/////////////z8/////////////PX89//////89/////z1/Pf9//////////z3//////////+cA/gMA//8AAP////////////8/P/7/////////////////////////////////////////////////////////////////////////////////////////////////////////////AwAAAAAAAAAAAAAAAP////////////////+f///+//8H////////////x/8B//8DgP//AwD//wMA/98BAP///////w8AAACAEAAAAAD/////////////////n////v//B////////////8f/Af//P4D//x8A//8PAP/fDQD/////////////jzD/AwAAAAAAAP//////////////Af//////Bf//////////PwD///9/AAAAAAAA////Px8A//////8P////AwAAAAAAAAC4/wP//////////////wH//////wf//////////z8A////f/8P/w/A/////z8fAP//////D////wP/BwAAAAD//38A////////HwAAAAAAAAAAAIAAAAAAAAAAAAAAAOD//////w8A4B8AAAAAAAD4////AcAA/P////8/AAAA////D/////////9/////n/8D/wOAAP+//38AAAAAAAD///////////8f/wMA+A8A//////////////////8PAP////8PAAAAAOAA/P///z//B///////5wAAAAAA3m8E////////////////////////////////AAAAAAAAAAD/////////AP/j//////8//wf//////+cAAPf/////B////////////////////////////////////////////////////////////////////////////////////wcAAAAAAAAAAAAAAAAAAAKAAAD/HwAAAAAAAAAAAAAAAIT8Lz9Q/f/z4EMAAP//////AQAAAAAAAAAAAAAAAAAAADAAAAAAAIABABAAAAACgAAA/x8AAAAAAAD/H+L/AQCE/C8/UP3/8+BDAAD//////wEAAAAAAAAAAAAAAAAAAP////////////////////////////////////8feAwA/////78g/////////4AAAP//fwB/f39/f39/fwAAAAD/////////////////////////////////////H/gPAP////+/IP////////+AAID//38Af39/f39/f3//////4AAAAP4DPh/+////////////f/j+//////////////fg///////+/////////////38AAP////8AAAAAAAD//+AAAAD+/z4f/v///////////3/+/v//////////////4P///////v////////////9/AAD/////AAAAAAAA/////////////////////////x8AAAAAAAAAAP//////P////////////////////////////////////////////////////////////////////////////////////wD/H///AAwAAP//////fwCA////P/////////////8AAAAAgP/8////////////////+f////////8/6x8AAPz//x////8PAAD////////wv///////////////////AwAAAID//P////////////////n/////////P+sfAAD8/7v3//8HAAAA////////DwD8//////8PAAAAAAAAAPxoAPz//z8A//9/AAAA////H/D//////wcAAIAAAN//AHz//////xAAAP///////w8A//////////8/AP8D////6P//////P/////8PAP///x///////////wGA/wP///9///////8BAAD3DwAA//9/xP///////2I+BQAAOP8HHAB+fn4Af3////////f/A///////////////////BwAAAP///////38A/z//A///f/z//////////wcAADj//3wAfn5+AH9////////3/wP///////////////////83/wP/////////////////P/////////////////8DAAAAAH8A+KD//X9f2/////////////////8DAAAA+P///////////////////////z//////////////////AwAAAAB/APjg//1/X9v/////////////////AwAAAPj//////wAAAAAAAAAAAAAAAAAA3/////////////////////8fAAAAAP7//wf+//8HwP////////////9//Pz8HAAAAAD//wAA//8YAADgAAAAAN//////////////////////HwAA/wP+//+H/v//B+D/////////////f/z8/BwAAAAA/+///3///7f/P/8/AAAAAP///////////////////wcAAAAAAAAAAP///////x8AAAAAAAAAAAAAAAAAAAAAAP/v//9///+3/z//PwAAAAD///////////////////8HAAAAAAAAAAD///////8fAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAA////H////////wEAAAAAAP////8A4P///wf/////PwD///8//////w//PgAAAAAAAAAAAAAAAAAAAAAAAAAAAP///x////////8BAAEAAAD/////AOD///8H//////8H////P/////8P/z4AAAAAAP////////////////////////8/AAD/////D/////8P//////8A////////DwD/9//3t//7//sb////////DwD/////////////////////////P/8D/////w//////D///////AP///////w8A//f/97f/+//7G////////w8AP/3/////v5H//z8A//9/AP///38AAAAAAAAAAP//NwD//z8A////AwAAAAAAAAAA/////////8AAAAAAAAAAAAEA7/7//z8AAAAAAP///x////8fAAAAAP/+//8fAAAA////////PwD//z8A//8HAP//AwAAAAAAAAAAAAAAAABv8O/+//8/hwAAAAD///8f////HwAAAAD//v//fwAAAP///////z8A//8/AP//BwD//wMAAAAAAAAAAAAAAAAA////////////AQAAAAAAAP///////wcA////////BwD/////DwAAAAD8//8/gP//PwAAAAAAAAAAAAAAAAAAAP///////////wEAAAAAAAD///////8HAP///////wcA//////8A/wP/////P77//z8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////8DAwAcAAAAAAAAAP///x+AAP//PwAAAAAA//8DAAAAAAD//x8AAAD//38AAAAAAAAAAAAAAAAAAAAAAP//////GwMAHAAAAAAAAPD///8fgAD/////AQAAAP//PwAAAAAA//8fAAAA//9/APj///////8AAAAAAAAAJgD4//////8AAAAA////AQAA+P///38AAACQAP////9HAPj//////wcAHgAAFAAAAAD//////////38AAADA/z+A/////////wcEAP///wH/A////////9//8AD/////TwD//////////x/e/xcAAAAA///7//8PAIABAAAAAAAAAH+9/7//Af//////fwAAAADgn/n///3tIwAAAeADAAAA/0v/////vwAAAAoAAAAAAP//+//////AAwAAAAAAAAB/vf+//wH/////////B/8D75/5///97fufOYHgzx8fAP9L/////7//pfcPAAYAAAD///////8fAIAHAIADAAAA////////AACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////38AAAAAAA8AAAAA////////////B//DAwAAAP//////////vwD/AwAAAAAAAAAAAAAAAAAAAAAAAAAA////////P/8BAAA/AAAAAP///////wAAEAAAAAAAAAD//////wcAAQAAAAAAAAAA////BwAAAAB/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////////xEA/wMAAAAA/////////wH/A///DwAAAP///+f/D/8DfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////8PAAAAAAAAAAAAAAAAAAD//////////wAAAIB/8m////8AgAIAAAAAAAAAAAAAAP/8/////wEACgAAAP////////8HAAAAAAAAAAAAAAAA////////////AwCAf/Jv////v/kPAP8DAAAAAAAAAAD//P///////BsAAAAB+P////8HBAAAAfD//////wMAIAAA////////////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8BAAAA/////////3+AAP///////////yMAAP///////////wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AQD/A//9////fwAAAQAAAAAA/P///wAAAAAAAAAAAAAAAAAAf/v/////AQBAAAAAv/3///8DAAEAAAAAAAAAAAAAAAD//f////9//wEA/wMAAPz////8///+fwAAAAAAAAAAAH/7/////3+0/wD/A7/9////f/sB/wMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//BwD0//3///8PAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//38A///9/////8cHAP8HAAAAAAAAAAAAAAEAAAAAAAAAAAD/////////////////fwAA////////////////////////////////DwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////8BAP///////wAAfgAAAP//////////////////////////////////////////////////////////////////////////BwAEAAAAJwDwAP///////////////////////////////wAA//8/AP//////////////////////////////////////////////////////////////////////////////A///////////////////////////////////////////fwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////wMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////Af///38AAP///////////38AAP///z8AAP///////wAADwAAAPj//+D//wAAAAAAAAAAAAAAAAAA/////////wH///9//wP///////////9//wP///8/HwD///////9/AA8A/wP4///g//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////x8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////8f/wMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////////wAAAAAAAAAAAAAAAAAAAAD///////////8HAQAAAAAAAAD4/wAAAAAAAAAACwAAAAAAAAAAAAAA//////////8AAAAAAAAAAAAAAAAAAAAA////////////h/////////+A//8AAAAAAAAAABsAAwD//////////////////////////////////z8AAAAAgP8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADvb/////////////////////////////////////////8PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////z///38AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////8H/x//Af8DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADg4wf45w8AAAA8AAAAAAAAAAAAAP////////////////8H/x//Af9jAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///9/4AcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf2//fwAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/A//////////////f///////////fZN7/6+//////////v+ff3////3tf/P3//////////////////////////////////////////////////////z/////9///3////9///3////9///3////9//////f////3///cPAAAAAAAA//////////////////////////8//////f//9/////f//9/////f//9/////f/////3////9///3z////////////////3/4//////8fIAAQAAD4/v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////8AAAAAAAAAAP////////8/AAAAAAAAAAAAAAAAAAAAAAAA//////8fgD8AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB////52wf/////////PwAAAIAAAAAAAAAAAAAAAAAAAP//////H/8//0MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////PwAA//////8PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///38AAP////////8DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///w8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////PwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////wMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////B////////////////////////////////x8AAAAAAAAA//////////8PCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////8fAH8AAAAAAP///////////w//AwAAAAAAAAAAAAAAAAAAAAAAAAAA7////5b+9wqE6paqlvf3Xv/7/w/u+/8PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////8AAAAA////////////////////////////////////////////////////////////////////////////////AQD//////z////////////////////////////////////////////////////////////////////////////////////////////8H////////////////////////////////////////////////////////AwD/////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAP//////////////PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECAgIDBAUGBwgJCgsMDQICAgICAgIOAgICAgICAg4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ICAgICAgICAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgICAgMCAgQCBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHQICHgICAgICAgIfICEiIwIkJSYnKCkCKgICAgIrLAICAgItLgICAi8wMTIzAgICAgICNAICNTY3Ajg5Ojs8PT4/OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUACAkFCAgJDREVGR0gCSTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUoCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI5OTk5SwICAgICTE1OTwICAlACUVICAgICAgICAgICAgICU1QCAlUCVgICV1hZWltcXV5fYGFiYwJkZWZnAmgCaWprbG0Cbm9wcQJycwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQICAgICAgICAgICAgICAgICAnZ3AgICeAICAnl6OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5e3x9AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAn45OX85OYACAgICAgICAgICAgICAgICAgICgQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICAgKDhIUChgICAgICAgICAgICAgKHiAICAgICAgICAgKJincCAosCAgKMAo0CjgICAo+QAgICAgICAgICAgICApGSApOUApWWl5iZmpucAp0CAp6foKECAgICAgICAgICOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5oh0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAowICAgKkpQIEAgUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0CAh4CAgICAgICHyAhIiMCJCUmJygpAioCAgICpqeoqaqrrC6tOa6vsLGyswICAgICArQCAjU2NwI4OTo7PD0+tTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUsCAgICArZNTreJincCAosCAgKMAo0CjgICAo+QAgICAgICAgICAgICApGSuLmUApWWl5iZmpucAp0CAp6foKECAgICAgICAgICVVV1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVVVVUVAFBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUBAAAAAAAAAAAAABBBEFVVVVVVV1VVVVVVVVVVVVFVVQAAQFT13VVVVVVVVVVVFQAAAAAAVVVVVfxdVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUFABQAFARQVVVVVVVVVRVRVVVVVVVVVQAAAAAAAEBVVVVVVVVVVVXVV1VVVVVVVVVVVVVVBQAAVFVVVVVVVVVVVVVVVVUVAABVVVFVVVVVVQUQAAABAVBVVVVVVVVVVVVVAVVVVVVV/////39VVVVQFQAAVVVVVVVVVVVVVQUAAAAAAAAAAAAAAAAAQFVVVVVVVVVVVVVVVVVFVAEAVFEBAFVVBVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVEAVRVUVUVVVUFVVVVVVVVRUFVVVVVVVVVVVVVVVVVVVRBFRRQUVVVVVVVVVVQUVVVQVVVVVVVVVVVVVVVVVVVVAEQVFFVVVVVBVVVVVVVBQBRVVVVVVVVVVVVVVVVVVUEAVRVUVUBVVUFVVVVVVVVVUVVVVVVVVVVVVVVVVVVVUVUVVVRVRVVVVVVVVVVVVVVVFRVVVVVVVVVVVVVVVVVBFQFBFBVQVVVBVVVVVVVVVVRVVVVVVVVVVVVVVVVVVUURAUEUFVBVVUFVVVVVVVVVVBVVVVVVVVVVVVVVVVVFUQBVFVBVRVVVQVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVVVVVRRUFRFUVVVVVVVVVVVVVVVVVVVVVVVVVVVVRAEBVVRUAQFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVEAAFRVVQBAVVVVVVVVVVVVVVVVVVVVVVVVUFVVVVVVVRFRVVVVVVVVVVVVVVVVVQEAAEAABFUBAAABAAAAAAAAAABUVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAQQAQUFVVVVVVVVQBVRVVVUBVFVVRUFVUVVVVVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVWqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUBVVVVVVVVVVVVVVVVBVBVVVVVVVUFVFVVVVVVVQVVVVVVVVVVBVVVVX///ff//ddfd9bV11UQAFBVRQEAAFVXUVVVVVVVVVVVVVUVAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQVVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQBVUVUVVAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVcVFFVVVVVVVVVVVVVVVVVVRQBARAEAVBUAABRVVVVVVVVVVVVVVVUAAAAAAAAAAAAAAFAAAABVVVVVVQBVVVVVVVVVVVVVVVUAAFAFVFVVVVVVVVVVFQAAVVVVUFVVVVVVVVUFUABQVVVVVVVVVVVVVVVVVUVQEQBVVVVVVVVVVVVVVVVVVQAABVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQAAAAAQAVFFVVFBVVVVVVVVVVVVVVVVVVVVVVQAAAAAAAAAAAAAAAAAAAABVVRUAVVVVVVVVBUBVVVVVVVVVVVVVVVUAAAAAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAAAAAAAAAABUVVVVVVVVVVVV9VVVVWlVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf1X11VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV9VVVVVVVfVVVVVVVVqqpVVVVV////VVVVVVVVVVVVVdVVVaWq1VVVVV1V9VVVVVV9VV9VdVVXVVVVVXVV9V11XVVd9VVVVVVVVVVXVVVVVVVVVVV31d9VVVVVVVVVVVVVVVVVVVX9VVVVVVVVV1VV1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVXVV1VVVVVVVVVVVVVVVVddVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVQVVVVVVVVVVVVVVVVVVVV/f///////////////19V1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAAAAAAAAAAKqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqVVVVqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpaVVVVVVVVqqqqqqqqqqqqqqqqqqoKAKqqqmqpqqqqqqqqqqqqqqqqqqqqqqqqqqpqgaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpVqaqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqKqqqqqqqqqqqmqqqqqqqqqqqqqqqqqqqqqqqqqqqqpaVZWqqqqqqqqqqqqqqmqqqqqqqqqqqqqqVVWqqqqqqqqqqqqqqqqqqqpWqqqqqqqqqqqqqqqqqmpVVVVVVVVVVVVVVVVVX1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVAAABQVVVVVVVVVQVVVVVVVVVVVVVVVVVVVVVVVVVVVVBVVVVFRRVVVVVVVVVBVVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUFVVVVVVVQAAAABQVUUVVVVVVVVVVVVVBQBQVVVVVVUVAAAQVVVVqqqqqqqqqlZAVVVVVVVVVVVVVVUVBVBQVFVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVVVUBQEFBVVUVVVVUVVVVVVVVVVVVVVVUVVVVVVVVVVVVVVVVBBRUBVFVVVVVVVVVVVVVUFVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVRRVVVVVaqqqqqqqqqqqlVVVQAAAAAAQBUAAAAAAAAAAAAAAABVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUMAADwqqpaVQAAAACqqqqqqqqqqmqqqqqqaqpVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVqaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqVlVVVVVVVVVVVVVVVVVVBVRVVVVVVVVVVVVVVVVVVVWqalVVAABUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQVAVQFBVQBVVVVVVVVVVVVVQBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUFVVVVVVVXVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQBVVVVVVVVVVVVVVVVVVVVVAVBVVVVVVVVVVVVVVVVVVRVUVVVVVVVVVVVVVVVVVVVVVVVVBQBVVVVVVVVVVVVVVVVVVVVVVQUAAFRVVVVVVVVVVVVVVQVQVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVVVVVVVVVVVVVVVVVUAAABAVVVVVVVVVVVVVRRUVRVQVVVVVVVVVVVVVVUVQEFVRVVVVVVVVVVVVVVVVVVVVUBVVVVVVVVVVRUAAQBUVVVVVVVVVVVVVVVVVVUVVVVVUFVVVVVVVVVVVVVVVQUAQARVARRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVQAFVFUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFRUAQFVVVVVVUFVVVVVVVVVVVVVVVVUVRFRVVVFVFVVVVQUAVABUVVVVVVVVVVVVVVVVVVVVVRQARBFQBUBVVVVBVVVVVVVVVVVVVVVVVVVVVVVVVVVVAAAFRFVVVVVVRVVVVVVVVVVVVVVVVVVVVVVVVVVVFABEEQRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRUFUFUQVFVVVVVVVVBVVVVVVVVVVVVVVVVVVVVVVVVVVRUAQBFUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVRAABVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVEQUQAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFQAAQVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFUVABFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUABVVUVVVVVVVVVQEAQFVVVVVVVVVVVRUAFEBVFVVVAUABVVVVVVVVVVVVVQAAAABAUFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUERFVVVVVVVVVVVVVVVVVVVVVVVQBAABBVVVVVVVVVVVVVVVVVVVVVVVVVVQUAAAAAAAUABEFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUBQEUQAABVVVVVVVVVVVVVVVVVVVVVVVVQEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVUVVVAVVVVVVVVVVVVVVVVBUBVQFVVVVVVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUFQAAAFBVVVVVVVVVVVVVVVVVVVVVVQUAAFABVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAFRVVVVVVVVVVVVVVVVVVQBAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVdVXVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVVRVAVVVVVVVVVVVVVVVVVVVVVVVVVapUVVWgalVVqqqqqqqqqqqqqqqqqqqqqqqqqqqqWlVVVVVVVVVVVZWqqqqqqqqqalVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVaqpqmmqqqqqqqqqqmpVVVVlVVVVVVVVVWpZVVVVqlVVqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpVVVVVVVVVVUEAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAAAAAAAAAAAAAAFAAAAAAAEBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUBUAEAAAAAQAEAVVVVVVVVVQVQVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVBVRVVVVVVVVVVVVVVVVVVaqqqqqqqqqqqqqqqqqqqqqqqqqqqmpVVaqqqqqqalVVAAAAAAAAAAAAAAAAAEAVAAAAAAAAAAAAAAAAVFVRVVVVVFVVVVUVAAEAAABVVVVVVVVVVVVVVVVVVVVVVVVVVQBAAAAAABQAEARAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVVUAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVRVUFVVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAEBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAQFVVVVVVVVVVVVVVVVVVV1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVXVVVVVVVVVVVVVVVVVVVVVdf3/f1VVVVVVVVVVVVVVVVVVVVVVVfX///////9uVVVVqqq6qqqqqur6v79VqqpWVV9VVVWqWlVVVVVVVf//////////V1VV/f/f///////////////////////3//////9VVVX/////////////f9X/VVVV/////1dX//////////////////////9/9//////////////////////////////////////////////////////////////X////////////////////X1VV1X////////9VVVVVdVVVVVVVVX1VVVVXVVVVVVVVVVVVVVVVVVVVVVVVVVXV////////////////////////////VVVVVVVVVVVVVVVV//////////////////////9fVVd//Vf/VVXVV1X//1dVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX///9VV1VVVVVVVf//////////////f///3/////////////////////////////////////////////////////////////9VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV////V///f/X/////////////////f1f9////1///f9X//1dVqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqlpVVVVVVVVVVVmWVWGqpVmqVVVVVVWVVVVVVVVVVZVVVQAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAABVVVVVVZVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRUAlmpaWmqqBUCmWZVlVVVVVVVVVVUAAAAAVVZVValWVVVVVVVVVVVVVlVVVVVVVVVVAAAAAAAAAABUVVVVlVlZVVVlVVVpVVVVVVVVVVVVVVWqqqpqqqqqVaqqWlVVVVlVqqqqVVVVVWVVVVpVVVVVpWVWVVVVlVVVVVVVVaaWmpZZWWWplqqqZlWqVVpZVVpWZVVVVWqqpaVaVVVVpapaVVVZWVVVWVVVVVVVlVVVVVVVVVVVVVVVVVVVVVVVVVVVZVX1VVVVaVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqlWqqqqqqqqqqqpWVVWqqqqqpVpVVZqqWlWlpVVaWqWWpVpVVVWlWlWVVVVVfVVpWaVVr1VmVVVVVaqqVVVmVf///1VVVZqaappVVVXVVVWlqtVVVaVdVfVVVVVVvVWvqrqqq6qqmlW6qvquuq5VXfVVVVVVVVVVV1VVVVVZVVVVd9XfVVVVVVVVVaWqqqqqqqqq/VVVVVVVVVdVVdVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV1VdVVVVVVVVVVVVVVVVXrVpVVVVVVVVVVVWqqqqqqqqqaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjMAAMCqqlpVAAAAAKqqqqqqqqqqaqqqqqpqqlVVVVVVVVVVVVVVVQVUVVVVVVVVVVVVVVVVVVVVqmpVVQAAVFmqqqpWqqqqqqqqqlqqqqqqqqqqqqqqqqqqqlpVqqqqqqqqqrr+/7+qqqqqVlVVVVVVVVVVVVVVVVX1////////JQUAAAwAAAAEAAAALQQAACYFAACvAgAAMDEyMzQ1Njc4OWFiY2RlZi9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3V1aWQtMS4xNi4wL3NyYy9mbXQucnMA6DwnAFsAAAC7AAAADQAAAOg8JwBbAAAAswAAABUAAADoPCcAWwAAALYAAAANAAAA6DwnAFsAAAC3AAAADQAAAAAAAAD//////////4g9JwAAAAAAAAAAAAAAAAAvcnVzdGMvMmU2ODgyYWM1YmUyN2E3MzI5M2Q2ZjdhZTU2Mzk3ZmRmMzI4NDhkZS9saWJyYXJ5L3N0ZC9zcmMvdGhyZWFkL2xvY2FsLnJzAKA9JwBPAAAAGQEAABkAAABUcmllZCB0byBzaHJpbmsgdG8gYSBsYXJnZXIgY2FwYWNpdHkAPicAJAAAALRBJwBQAAAAuQIAAAkAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi93YXNtLWJpbmRnZW4tMC4yLjEwMC9zcmMvY29udmVydC9zbGljZXMucnNKc1ZhbHVlKCmrPicACAAAALM+JwABAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvd2FzbS1iaW5kZ2VuLTAuMi4xMDAvc3JjL2NhY2hlL2ludGVybi5ycwAAAMQ+JwBtAAAAGgAAACsAAABjbG9zdXJlIGludm9rZWQgcmVjdXJzaXZlbHkgb3IgYWZ0ZXIgYmVpbmcgZHJvcHBlZAAAKAUAAAQAAAAEAAAAKQUAACoFAABMYXp5IGluc3RhbmNlIGhhcyBwcmV2aW91c2x5IGJlZW4gcG9pc29uZWQAAIw/JwAqAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvb25jZV9jZWxsLTEuMjEuMy9zcmMvbGliLnJzwD8nAGAAAAAIAwAAGQAAAHJlZW50cmFudCBpbml0AAAwQCcADgAAAMA/JwBgAAAAegIAAA0AAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi93YXNtLWJpbmRnZW4tZnV0dXJlcy0wLjQuNTAvc3JjL3F1ZXVlLnJzAAAAWEAnAG0AAAAlAAAALgAAAFhAJwBtAAAAKAAAACkAAABYQCcAbQAAAD4AAAAaAAAAWEAnAG0AAAA+AAAAJwAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3dhc20tYmluZGdlbi1mdXR1cmVzLTAuNC41MC9zcmMvdGFzay9zaW5nbGV0aHJlYWQucnMAAAAIQScAeQAAACIAAAAVAAAALAUAAC0FAAAuBQAALwUAAAhBJwB5AAAAZwAAACUAAAAvcnVzdGMvMmU2ODgyYWM1YmUyN2E3MzI5M2Q2ZjdhZTU2Mzk3ZmRmMzI4NDhk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AAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgA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JgCAyyYAgssmAITLJgCGyyYAicsmAIzLJgCQyyYAkssmAJTLJgCWyyYAmcsmAJzLJgCfyyYAAQAAAAEAAAABAAAAAQAAAAYAAAAEAAAABgAAAGfLJgBoyyYAacsmAGrLJgBryyYAccsmAHXLJgAFAAAABgAAAAgAAACV4iYAmuImAFPiJgAGAAAACgAAAAkAAAAJAAAAAgAAAAUAAAAJAAAABQAAAAYAAAAGAAAAAgAAAAMAAAAIAAAABwAAAAcAAAAJAAAABgAAAAgAAAAHAAAAAwAAAAYAAAAGAAAABgAAAAQAAAAJAAAABgAAAAcAAAAFAAAACAAAAAUAAAAJAAAABAAAAAYAAAACAAAADgAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAIAAAADAAAAAgAAAAIAAAACAAAAAgAAAAEAAAACAAAAAgAAAAMAAAADAAAABAAAAAIAAAACAAAAAgAAAAMAAAADAAAAAwAAAAMAAAACAAAAAgAAAAIAAAADAAAAAwAAAAIAAAACAAAAAgAAAAIAAAADAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAADQAAAAsA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", "base64"); var wasmModule = new WebAssembly.Module(bytes); var wasmInstance = new WebAssembly.Instance(wasmModule, imports); wasm = wasmInstance.exports; diff --git a/deps/amaro/dist/package.json b/deps/amaro/dist/package.json index 6ac346490e1d95..99a1362b1c6682 100644 --- a/deps/amaro/dist/package.json +++ b/deps/amaro/dist/package.json @@ -4,7 +4,7 @@ "강동윤 <kdy1997.dev@gmail.com>" ], "description": "wasm module for swc", - "version": "1.15.11", + "version": "1.15.18", "license": "Apache-2.0", "repository": { "type": "git", diff --git a/deps/amaro/package.json b/deps/amaro/package.json index 6722d424d7562e..d8d5c9f497b90d 100644 --- a/deps/amaro/package.json +++ b/deps/amaro/package.json @@ -1,6 +1,6 @@ { "name": "amaro", - "version": "1.1.7", + "version": "1.1.8", "description": "Node.js TypeScript wrapper", "license": "MIT", "type": "commonjs", diff --git a/deps/googletest/include/gtest/gtest-test-part.h b/deps/googletest/include/gtest/gtest-test-part.h index 90380a973070b9..ce1e21945cf399 100644 --- a/deps/googletest/include/gtest/gtest-test-part.h +++ b/deps/googletest/include/gtest/gtest-test-part.h @@ -37,6 +37,7 @@ #include <iosfwd> #include <ostream> #include <string> +#include <string_view> #include <vector> #include "gtest/internal/gtest-internal.h" @@ -65,10 +66,10 @@ class GTEST_API_ [[nodiscard]] TestPartResult { // C'tor. TestPartResult does NOT have a default constructor. // Always use this constructor (with parameters) to create a // TestPartResult object. - TestPartResult(Type a_type, const char* a_file_name, int a_line_number, - const char* a_message) + TestPartResult(Type a_type, std::string_view a_file_name, int a_line_number, + std::string_view a_message) : type_(a_type), - file_name_(a_file_name == nullptr ? "" : a_file_name), + file_name_(a_file_name), line_number_(a_line_number), summary_(ExtractSummary(a_message)), message_(a_message) {} @@ -112,7 +113,7 @@ class GTEST_API_ [[nodiscard]] TestPartResult { // Gets the summary of the failure message by omitting the stack // trace in it. - static std::string ExtractSummary(const char* message); + static std::string ExtractSummary(std::string_view message); // The name of the source file where the test part took place, or // "" if the source file is unknown. diff --git a/deps/googletest/include/gtest/gtest.h b/deps/googletest/include/gtest/gtest.h index b63685380c8a14..4218adebde20d8 100644 --- a/deps/googletest/include/gtest/gtest.h +++ b/deps/googletest/include/gtest/gtest.h @@ -57,6 +57,7 @@ #include <set> #include <sstream> #include <string> +#include <string_view> #include <type_traits> #include <vector> @@ -1246,7 +1247,7 @@ class GTEST_API_ [[nodiscard]] UnitTest { // eventually call this to report their results. The user code // should use the assertion macros instead of calling this directly. void AddTestPartResult(TestPartResult::Type result_type, - const char* file_name, int line_number, + std::string_view file_name, int line_number, const std::string& message, const std::string& os_stack_trace) GTEST_LOCK_EXCLUDED_(mutex_); @@ -1619,6 +1620,8 @@ class GTEST_API_ [[nodiscard]] AssertHelper { // Constructor. AssertHelper(TestPartResult::Type type, const char* file, int line, const char* message); + AssertHelper(TestPartResult::Type type, std::string_view file, int line, + std::string_view message); ~AssertHelper(); // Message assignment is a semantic trick to enable assertion @@ -1632,12 +1635,12 @@ class GTEST_API_ [[nodiscard]] AssertHelper { // re-using stack space even for temporary variables, so every EXPECT_EQ // reserves stack space for another AssertHelper. struct AssertHelperData { - AssertHelperData(TestPartResult::Type t, const char* srcfile, int line_num, - const char* msg) + AssertHelperData(TestPartResult::Type t, std::string_view srcfile, + int line_num, std::string_view msg) : type(t), file(srcfile), line(line_num), message(msg) {} TestPartResult::Type const type; - const char* const file; + const std::string_view file; int const line; std::string const message; diff --git a/deps/googletest/include/gtest/internal/gtest-internal.h b/deps/googletest/include/gtest/internal/gtest-internal.h index 4379137d77eba3..7096355d5dd6be 100644 --- a/deps/googletest/include/gtest/internal/gtest-internal.h +++ b/deps/googletest/include/gtest/internal/gtest-internal.h @@ -1452,8 +1452,7 @@ class [[nodiscard]] NeverThrown { ; \ else \ fail(::testing::internal::GetBoolAssertionFailureMessage( \ - gtest_ar_, text, #actual, #expected) \ - .c_str()) + gtest_ar_, text, #actual, #expected)) #define GTEST_TEST_NO_FATAL_FAILURE_(statement, fail) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ diff --git a/deps/googletest/include/gtest/internal/gtest-port.h b/deps/googletest/include/gtest/internal/gtest-port.h index 3ea95ba5560714..b607e0adee74f4 100644 --- a/deps/googletest/include/gtest/internal/gtest-port.h +++ b/deps/googletest/include/gtest/internal/gtest-port.h @@ -1236,9 +1236,6 @@ class GTEST_API_ [[nodiscard]] AutoHandle { // Nothing to do here. #else -GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \ -/* class A needs to have dll-interface to be used by clients of class B */) - // Allows a controller thread to pause execution of newly created // threads until notified. Instances of this class must be created // and destroyed in the controller thread. @@ -1246,6 +1243,39 @@ GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \ // This class is only for testing Google Test's own constructs. Do not // use it in user tests, either directly or indirectly. // TODO(b/203539622): Replace unconditionally with absl::Notification. +#ifdef GTEST_OS_WINDOWS_MINGW +// GCC version < 13 with the win32 thread model does not provide std::mutex and +// std::condition_variable in the <mutex> and <condition_variable> headers. So +// we implement the Notification class using a Windows manual-reset event. See +// https://gcc.gnu.org/gcc-13/changes.html#windows. +class GTEST_API_ [[nodiscard]] Notification { + public: + Notification(); + Notification(const Notification&) = delete; + Notification& operator=(const Notification&) = delete; + ~Notification(); + + // Notifies all threads created with this notification to start. Must + // be called from the controller thread. + void Notify(); + + // Blocks until the controller thread notifies. Must be called from a test + // thread. + void WaitForNotification(); + + private: + // Assume that Win32 HANDLE type is equivalent to void*. Doing so allows us to + // avoid including <windows.h> in this header file. Including <windows.h> is + // undesirable because it defines a lot of symbols and macros that tend to + // conflict with client code. This assumption is verified by + // WindowsTypesTest.HANDLEIsVoidStar. + typedef void* Handle; + Handle event_; +}; +#else +GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \ +/* class A needs to have dll-interface to be used by clients of class B */) + class GTEST_API_ [[nodiscard]] Notification { public: Notification() : notified_(false) {} @@ -1273,6 +1303,7 @@ class GTEST_API_ [[nodiscard]] Notification { bool notified_; }; GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 +#endif // GTEST_OS_WINDOWS_MINGW #endif // GTEST_HAS_NOTIFICATION_ // On MinGW, we can have both GTEST_OS_WINDOWS and GTEST_HAS_PTHREAD diff --git a/deps/googletest/src/gtest-port.cc b/deps/googletest/src/gtest-port.cc index f8ecb37c48d943..d34a693e4500f2 100644 --- a/deps/googletest/src/gtest-port.cc +++ b/deps/googletest/src/gtest-port.cc @@ -303,6 +303,22 @@ bool AutoHandle::IsCloseable() const { return handle_ != nullptr && handle_ != INVALID_HANDLE_VALUE; } +#if !GTEST_HAS_NOTIFICATION_ && defined(GTEST_OS_WINDOWS_MINGW) +Notification::Notification() { + // Create a manual-reset event object. + event_ = ::CreateEvent(nullptr, TRUE, FALSE, nullptr); + GTEST_CHECK_(event_ != nullptr); +} + +Notification::~Notification() { ::CloseHandle(event_); } + +void Notification::Notify() { GTEST_CHECK_(::SetEvent(event_)); } + +void Notification::WaitForNotification() { + GTEST_CHECK_(::WaitForSingleObject(event_, INFINITE) == WAIT_OBJECT_0); +} +#endif // !GTEST_HAS_NOTIFICATION_ && defined(GTEST_OS_WINDOWS_MINGW) + Mutex::Mutex() : owner_thread_id_(0), type_(kDynamic), diff --git a/deps/googletest/src/gtest-test-part.cc b/deps/googletest/src/gtest-test-part.cc index 6f8ddd7c485c2f..c7f993c8b4304d 100644 --- a/deps/googletest/src/gtest-test-part.cc +++ b/deps/googletest/src/gtest-test-part.cc @@ -34,7 +34,9 @@ #include <ostream> #include <string> +#include <string_view> +#include "gtest/internal/gtest-internal.h" #include "gtest/internal/gtest-port.h" #include "src/gtest-internal-inl.h" @@ -42,9 +44,9 @@ namespace testing { // Gets the summary of the failure message by omitting the stack trace // in it. -std::string TestPartResult::ExtractSummary(const char* message) { - const char* const stack_trace = strstr(message, internal::kStackTraceMarker); - return stack_trace == nullptr ? message : std::string(message, stack_trace); +std::string TestPartResult::ExtractSummary(const std::string_view message) { + auto stack_trace = message.find(internal::kStackTraceMarker); + return std::string(message.substr(0, stack_trace)); } // Prints a TestPartResult object. diff --git a/deps/googletest/src/gtest.cc b/deps/googletest/src/gtest.cc index 193f880be27fff..8a3801807e7dfa 100644 --- a/deps/googletest/src/gtest.cc +++ b/deps/googletest/src/gtest.cc @@ -58,6 +58,7 @@ #include <ostream> // NOLINT #include <set> #include <sstream> +#include <string_view> #include <unordered_set> #include <utility> #include <vector> @@ -485,6 +486,15 @@ bool ShouldEmitStackTraceForResultType(TestPartResult::Type type) { // AssertHelper constructor. AssertHelper::AssertHelper(TestPartResult::Type type, const char* file, int line, const char* message) + : AssertHelper( + type, file == nullptr ? std::string_view() : std::string_view(file), + line, + message == nullptr ? std::string_view() : std::string_view(message)) { +} + +AssertHelper::AssertHelper(TestPartResult::Type type, + const std::string_view file, int line, + const std::string_view message) : data_(new AssertHelperData(type, file, line, message)) {} AssertHelper::~AssertHelper() { delete data_; } @@ -875,7 +885,11 @@ class PositiveAndNegativeUnitTestFilter { // and does not match the negative filter. bool MatchesTest(const std::string& test_suite_name, const std::string& test_name) const { +#ifdef GTEST_HAS_ABSL + return MatchesName(absl::StrCat(test_suite_name, ".", test_name)); +#else return MatchesName(test_suite_name + "." + test_name); +#endif } // Returns true if and only if name matches the positive filter and does not @@ -2547,8 +2561,9 @@ void ReportFailureInUnknownLocation(TestPartResult::Type result_type, // AddTestPartResult. UnitTest::GetInstance()->AddTestPartResult( result_type, - nullptr, // No info about the source file where the exception occurred. - -1, // We have no info on which line caused the exception. + std::string_view(), // No info about the source file where the exception + // occurred. + -1, // We have no info on which line caused the exception. message, ""); // No stack trace, either. } @@ -5428,8 +5443,8 @@ Environment* UnitTest::AddEnvironment(Environment* env) { // this to report their results. The user code should use the // assertion macros instead of calling this directly. void UnitTest::AddTestPartResult(TestPartResult::Type result_type, - const char* file_name, int line_number, - const std::string& message, + const std::string_view file_name, + int line_number, const std::string& message, const std::string& os_stack_trace) GTEST_LOCK_EXCLUDED_(mutex_) { Message msg; diff --git a/deps/icu-small/source/data/in/icudt78l.dat.bz2 b/deps/icu-small/source/data/in/icudt78l.dat.bz2 index 1ae38435e2cdde..5be75974fa3edd 100644 Binary files a/deps/icu-small/source/data/in/icudt78l.dat.bz2 and b/deps/icu-small/source/data/in/icudt78l.dat.bz2 differ diff --git a/deps/llhttp/.gitignore b/deps/llhttp/.gitignore new file mode 100644 index 00000000000000..98438a2cd3230c --- /dev/null +++ b/deps/llhttp/.gitignore @@ -0,0 +1 @@ +libllhttp.pc diff --git a/deps/llhttp/CMakeLists.txt b/deps/llhttp/CMakeLists.txt index 56f0098c2c5c49..6398043145c879 100644 --- a/deps/llhttp/CMakeLists.txt +++ b/deps/llhttp/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.25.0) cmake_policy(SET CMP0069 NEW) -project(llhttp VERSION 9.3.0) +project(llhttp VERSION 9.3.1) include(GNUInstallDirs) set(CMAKE_C_STANDARD 99) @@ -24,8 +24,8 @@ endif() # Options # # Generic option -option(BUILD_SHARED_LIBS "Build shared libraries (.dll/.so)" ON) -option(BUILD_STATIC_LIBS "Build static libraries (.lib/.a)" OFF) +option(LLHTTP_BUILD_SHARED_LIBS "Build shared libraries (.dll/.so)" ON) +option(LLHTTP_BUILD_STATIC_LIBS "Build static libraries (.lib/.a)" OFF) # Source code set(LLHTTP_SOURCES @@ -80,7 +80,7 @@ function(config_library target) ) endfunction(config_library target) -if(BUILD_SHARED_LIBS) +if(LLHTTP_BUILD_SHARED_LIBS) add_library(llhttp_shared SHARED ${llhttp_src} ) @@ -88,13 +88,11 @@ if(BUILD_SHARED_LIBS) config_library(llhttp_shared) endif() -if(BUILD_STATIC_LIBS) +if(LLHTTP_BUILD_STATIC_LIBS) add_library(llhttp_static STATIC ${llhttp_src} ) - if(BUILD_SHARED_LIBS) - add_library(llhttp::llhttp ALIAS llhttp_shared) - else() + if(NOT LLHTTP_BUILD_SHARED_LIBS) add_library(llhttp::llhttp ALIAS llhttp_static) endif() config_library(llhttp_static) @@ -113,6 +111,6 @@ message(STATUS "Project configure summary:") message(STATUS "") message(STATUS " CMake build type .................: ${CMAKE_BUILD_TYPE}") message(STATUS " Install prefix ...................: ${CMAKE_INSTALL_PREFIX}") -message(STATUS " Build shared library .............: ${BUILD_SHARED_LIBS}") -message(STATUS " Build static library .............: ${BUILD_STATIC_LIBS}") +message(STATUS " Build shared library .............: ${LLHTTP_BUILD_SHARED_LIBS}") +message(STATUS " Build static library .............: ${LLHTTP_BUILD_STATIC_LIBS}") message(STATUS "") diff --git a/deps/llhttp/README.md b/deps/llhttp/README.md index 70af44ff0f5a16..008b7e622bc962 100644 --- a/deps/llhttp/README.md +++ b/deps/llhttp/README.md @@ -435,14 +435,16 @@ If you want to use this library in a CMake project as a static library, you can FetchContent_Declare(llhttp URL "https://github.com/nodejs/llhttp/archive/refs/tags/release/v8.1.0.tar.gz") -set(BUILD_SHARED_LIBS OFF CACHE INTERNAL "") -set(BUILD_STATIC_LIBS ON CACHE INTERNAL "") +set(LLHTTP_BUILD_SHARED_LIBS OFF CACHE INTERNAL "") +set(LLHTTP_BUILD_STATIC_LIBS ON CACHE INTERNAL "") FetchContent_MakeAvailable(llhttp) # Link with the llhttp_static target target_link_libraries(${EXAMPLE_PROJECT_NAME} ${PROJECT_LIBRARIES} llhttp_static ${PROJECT_NAME}) ``` +If using a version prior to 9.3.0, the `LLHTTP_BUILD_SHARED_LIBS` and `LLHTTP_BUILD_STATIC_LIBS` options are known as `BUILD_SHARED_LIBS` and `BUILD_STATIC_LIBS` and should be used instead. + _Note that using the git repo directly (e.g., via a git repo url and tag) will not work with FetchContent_Declare because [CMakeLists.txt](./CMakeLists.txt) requires string replacements (e.g., `_RELEASE_`) before it will build._ ## Building on Windows diff --git a/deps/llhttp/include/llhttp.h b/deps/llhttp/include/llhttp.h index 60544596a9942c..194fee8c906ed3 100644 --- a/deps/llhttp/include/llhttp.h +++ b/deps/llhttp/include/llhttp.h @@ -4,7 +4,7 @@ #define LLHTTP_VERSION_MAJOR 9 #define LLHTTP_VERSION_MINOR 3 -#define LLHTTP_VERSION_PATCH 0 +#define LLHTTP_VERSION_PATCH 1 #ifndef INCLUDE_LLHTTP_ITSELF_H_ #define INCLUDE_LLHTTP_ITSELF_H_ @@ -58,10 +58,8 @@ enum llhttp_errno { HPE_OK = 0, HPE_INTERNAL = 1, HPE_STRICT = 2, - HPE_CR_EXPECTED = 25, HPE_LF_EXPECTED = 3, HPE_UNEXPECTED_CONTENT_LENGTH = 4, - HPE_UNEXPECTED_SPACE = 30, HPE_CLOSED_CONNECTION = 5, HPE_INVALID_METHOD = 6, HPE_INVALID_URL = 7, @@ -82,15 +80,17 @@ enum llhttp_errno { HPE_PAUSED_UPGRADE = 22, HPE_PAUSED_H2_UPGRADE = 23, HPE_USER = 24, + HPE_CR_EXPECTED = 25, HPE_CB_URL_COMPLETE = 26, HPE_CB_STATUS_COMPLETE = 27, - HPE_CB_METHOD_COMPLETE = 32, - HPE_CB_VERSION_COMPLETE = 33, HPE_CB_HEADER_FIELD_COMPLETE = 28, HPE_CB_HEADER_VALUE_COMPLETE = 29, + HPE_UNEXPECTED_SPACE = 30, + HPE_CB_RESET = 31, + HPE_CB_METHOD_COMPLETE = 32, + HPE_CB_VERSION_COMPLETE = 33, HPE_CB_CHUNK_EXTENSION_NAME_COMPLETE = 34, HPE_CB_CHUNK_EXTENSION_VALUE_COMPLETE = 35, - HPE_CB_RESET = 31, HPE_CB_PROTOCOL_COMPLETE = 38 }; typedef enum llhttp_errno llhttp_errno_t; @@ -294,10 +294,8 @@ typedef enum llhttp_status llhttp_status_t; XX(0, OK, OK) \ XX(1, INTERNAL, INTERNAL) \ XX(2, STRICT, STRICT) \ - XX(25, CR_EXPECTED, CR_EXPECTED) \ XX(3, LF_EXPECTED, LF_EXPECTED) \ XX(4, UNEXPECTED_CONTENT_LENGTH, UNEXPECTED_CONTENT_LENGTH) \ - XX(30, UNEXPECTED_SPACE, UNEXPECTED_SPACE) \ XX(5, CLOSED_CONNECTION, CLOSED_CONNECTION) \ XX(6, INVALID_METHOD, INVALID_METHOD) \ XX(7, INVALID_URL, INVALID_URL) \ @@ -318,15 +316,17 @@ typedef enum llhttp_status llhttp_status_t; XX(22, PAUSED_UPGRADE, PAUSED_UPGRADE) \ XX(23, PAUSED_H2_UPGRADE, PAUSED_H2_UPGRADE) \ XX(24, USER, USER) \ + XX(25, CR_EXPECTED, CR_EXPECTED) \ XX(26, CB_URL_COMPLETE, CB_URL_COMPLETE) \ XX(27, CB_STATUS_COMPLETE, CB_STATUS_COMPLETE) \ - XX(32, CB_METHOD_COMPLETE, CB_METHOD_COMPLETE) \ - XX(33, CB_VERSION_COMPLETE, CB_VERSION_COMPLETE) \ XX(28, CB_HEADER_FIELD_COMPLETE, CB_HEADER_FIELD_COMPLETE) \ XX(29, CB_HEADER_VALUE_COMPLETE, CB_HEADER_VALUE_COMPLETE) \ + XX(30, UNEXPECTED_SPACE, UNEXPECTED_SPACE) \ + XX(31, CB_RESET, CB_RESET) \ + XX(32, CB_METHOD_COMPLETE, CB_METHOD_COMPLETE) \ + XX(33, CB_VERSION_COMPLETE, CB_VERSION_COMPLETE) \ XX(34, CB_CHUNK_EXTENSION_NAME_COMPLETE, CB_CHUNK_EXTENSION_NAME_COMPLETE) \ XX(35, CB_CHUNK_EXTENSION_VALUE_COMPLETE, CB_CHUNK_EXTENSION_VALUE_COMPLETE) \ - XX(31, CB_RESET, CB_RESET) \ XX(38, CB_PROTOCOL_COMPLETE, CB_PROTOCOL_COMPLETE) \ diff --git a/deps/llhttp/src/llhttp.c b/deps/llhttp/src/llhttp.c index aa4c468209700c..515ba512abbdb0 100644 --- a/deps/llhttp/src/llhttp.c +++ b/deps/llhttp/src/llhttp.c @@ -10,7 +10,7 @@ #endif /* _MSC_VER */ #endif /* __SSE4_2__ */ -#ifdef __ARM_NEON__ +#if defined(__ARM_NEON__) || defined(__ARM_NEON) #include <arm_neon.h> #endif /* __ARM_NEON__ */ @@ -1542,7 +1542,7 @@ static llparse_state_t llhttp__internal__run( 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -2625,7 +2625,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_header_value_otherwise; } #endif /* __SSE4_2__ */ - #ifdef __ARM_NEON__ + #if defined(__ARM_NEON__) || defined(__ARM_NEON) while (endp - p >= 16) { uint8x16_t input; uint8x16_t single; @@ -2639,19 +2639,23 @@ static llparse_state_t llhttp__internal__run( /* Find first character that does not match `ranges` */ single = vceqq_u8(input, vdupq_n_u8(0x9)); mask = single; - single = vandq_u16( + single = vandq_u8( vcgeq_u8(input, vdupq_n_u8(' ')), vcleq_u8(input, vdupq_n_u8('~')) ); - mask = vorrq_u16(mask, single); - single = vandq_u16( + mask = vorrq_u8(mask, single); + single = vandq_u8( vcgeq_u8(input, vdupq_n_u8(0x80)), vcleq_u8(input, vdupq_n_u8(0xff)) ); - mask = vorrq_u16(mask, single); - narrow = vshrn_n_u16(mask, 4); + mask = vorrq_u8(mask, single); + narrow = vshrn_n_u16(vreinterpretq_u16_u8(mask), 4); match_mask = ~vget_lane_u64(vreinterpret_u64_u8(narrow), 0); - match_len = __builtin_ctzll(match_mask) >> 2; + if (match_mask == 0) { + match_len = 16; + } else { + match_len = __builtin_ctzll(match_mask) >> 2; + } if (match_len != 16) { p += match_len; goto s_n_llhttp__internal__n_header_value_otherwise; diff --git a/deps/minimatch/README.md b/deps/minimatch/README.md index 01da9c8616fb79..2203ca6718fa18 100644 --- a/deps/minimatch/README.md +++ b/deps/minimatch/README.md @@ -7,6 +7,43 @@ This is the matching library used internally by npm. It works by converting glob expressions into JavaScript `RegExp` objects. +## Important Security Consideration! + +> [!WARNING] +> This library uses JavaScript regular expressions. Please read +> the following warning carefully, and be thoughtful about what +> you provide to this library in production systems. + +_Any_ library in JavaScript that deals with matching string +patterns using regular expressions will be subject to +[ReDoS](https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS) +if the pattern is generated using untrusted input. + +Efforts have been made to mitigate risk as much as is feasible in +such a library, providing maximum recursion depths and so forth, +but these measures can only ultimately protect against accidents, +not malice. A dedicated attacker can _always_ find patterns that +cannot be defended against by a bash-compatible glob pattern +matching system that uses JavaScript regular expressions. + +To be extremely clear: + +> [!WARNING] +> **If you create a system where you take user input, and use +> that input as the source of a Regular Expression pattern, in +> this or any extant glob matcher in JavaScript, you will be +> pwned.** + +A future version of this library _may_ use a different matching +algorithm which does not exhibit backtracking problems. If and +when that happens, it will likely be a sweeping change, and those +improvements will **not** be backported to legacy versions. + +In the near term, it is not reasonable to continue to play +whack-a-mole with security advisories, and so any future ReDoS +reports will be considered "working as intended", and resolved +entirely by this warning. + ## Usage ```js @@ -157,7 +194,9 @@ Returns a function that tests its supplied argument, suitable for use with `Array.filter`. Example: ```javascript -var javascripts = fileList.filter(minimatch.filter('*.js', { matchBase: true })) +var javascripts = fileList.filter( + minimatch.filter('*.js', { matchBase: true }), +) ``` ### minimatch.escape(pattern, options = {}) @@ -394,6 +433,42 @@ separators in file paths for comparison.) Defaults to the value of `process.platform`. +### maxGlobstarRecursion + +Max number of non-adjacent `**` patterns to recursively walk +down. + +The default of `200` is almost certainly high enough for most +purposes, and can handle absurdly excessive patterns. + +If the limit is exceeded (which would require very excessively +long patterns and paths containing lots of `**` patterns!), then +it is treated as non-matching, even if the path would normally +match the pattern provided. + +That is, this is an intentional false negative, deemed an +acceptable break in correctness for security and performance. + +### maxExtglobRecursion + +Max depth to traverse for nested extglobs like `*(a|b|c)` + +Default is 2, which is quite low, but any higher value swiftly +results in punishing performance impacts. Note that this is _not_ +relevant when the globstar types can be safely coalesced into a +single set. + +For example, `*(a|@(b|c)|d)` would be flattened into +`*(a|b|c|d)`. Thus, many common extglobs will retain good +performance and never hit this limit, even if they are +excessively deep and complicated. + +If the limit is hit, then the extglob characters are simply not +parsed, and the pattern effectively switches into `noextglob: +true` mode for the contents of that nested sub-pattern. This will +typically _not_ result in a match, but is considered a valid +trade-off for security and performance. + ## Comparisons to other fnmatch/glob implementations While strict compliance with the existing standards is a diff --git a/deps/minimatch/dist/commonjs/assert-valid-pattern.d.ts b/deps/minimatch/dist/commonjs/assert-valid-pattern.d.ts index 8e318b23a033e2..34d7a78a0c5144 100644 --- a/deps/minimatch/dist/commonjs/assert-valid-pattern.d.ts +++ b/deps/minimatch/dist/commonjs/assert-valid-pattern.d.ts @@ -1,2 +1,2 @@ -export declare const assertValidPattern: (pattern: any) => void; +export declare const assertValidPattern: (pattern: unknown) => void; //# sourceMappingURL=assert-valid-pattern.d.ts.map \ No newline at end of file diff --git a/deps/minimatch/dist/commonjs/assert-valid-pattern.d.ts.map b/deps/minimatch/dist/commonjs/assert-valid-pattern.d.ts.map index c61c0310949955..30ddcd51f6eae8 100644 --- a/deps/minimatch/dist/commonjs/assert-valid-pattern.d.ts.map +++ b/deps/minimatch/dist/commonjs/assert-valid-pattern.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"assert-valid-pattern.d.ts","sourceRoot":"","sources":["../../src/assert-valid-pattern.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,kBAAkB,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAUlD,CAAA"} \ No newline at end of file +{"version":3,"file":"assert-valid-pattern.d.ts","sourceRoot":"","sources":["../../src/assert-valid-pattern.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,kBAAkB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAUtD,CAAA"} \ No newline at end of file diff --git a/deps/minimatch/dist/commonjs/assert-valid-pattern.js.map b/deps/minimatch/dist/commonjs/assert-valid-pattern.js.map index 69fea07aac6213..9fc27a931c7e3f 100644 --- a/deps/minimatch/dist/commonjs/assert-valid-pattern.js.map +++ b/deps/minimatch/dist/commonjs/assert-valid-pattern.js.map @@ -1 +1 @@ -{"version":3,"file":"assert-valid-pattern.js","sourceRoot":"","sources":["../../src/assert-valid-pattern.ts"],"names":[],"mappings":";;;AAAA,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAE,CAAA;AAC7B,MAAM,kBAAkB,GAA2B,CACxD,OAAY,EACe,EAAE;IAC7B,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,MAAM,IAAI,SAAS,CAAC,iBAAiB,CAAC,CAAA;IACxC,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,GAAG,kBAAkB,EAAE,CAAC;QACxC,MAAM,IAAI,SAAS,CAAC,qBAAqB,CAAC,CAAA;IAC5C,CAAC;AACH,CAAC,CAAA;AAVY,QAAA,kBAAkB,sBAU9B","sourcesContent":["const MAX_PATTERN_LENGTH = 1024 * 64\nexport const assertValidPattern: (pattern: any) => void = (\n pattern: any,\n): asserts pattern is string => {\n if (typeof pattern !== 'string') {\n throw new TypeError('invalid pattern')\n }\n\n if (pattern.length > MAX_PATTERN_LENGTH) {\n throw new TypeError('pattern is too long')\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"assert-valid-pattern.js","sourceRoot":"","sources":["../../src/assert-valid-pattern.ts"],"names":[],"mappings":";;;AAAA,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAE,CAAA;AAC7B,MAAM,kBAAkB,GAA+B,CAC5D,OAAgB,EACW,EAAE;IAC7B,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,MAAM,IAAI,SAAS,CAAC,iBAAiB,CAAC,CAAA;IACxC,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,GAAG,kBAAkB,EAAE,CAAC;QACxC,MAAM,IAAI,SAAS,CAAC,qBAAqB,CAAC,CAAA;IAC5C,CAAC;AACH,CAAC,CAAA;AAVY,QAAA,kBAAkB,sBAU9B","sourcesContent":["const MAX_PATTERN_LENGTH = 1024 * 64\nexport const assertValidPattern: (pattern: unknown) => void = (\n pattern: unknown,\n): asserts pattern is string => {\n if (typeof pattern !== 'string') {\n throw new TypeError('invalid pattern')\n }\n\n if (pattern.length > MAX_PATTERN_LENGTH) {\n throw new TypeError('pattern is too long')\n }\n}\n"]} \ No newline at end of file diff --git a/deps/minimatch/dist/commonjs/ast.d.ts b/deps/minimatch/dist/commonjs/ast.d.ts index b8c1e5448e6392..27845ea71fb977 100644 --- a/deps/minimatch/dist/commonjs/ast.d.ts +++ b/deps/minimatch/dist/commonjs/ast.d.ts @@ -3,6 +3,8 @@ export type ExtglobType = '!' | '?' | '+' | '*' | '@'; export declare class AST { #private; type: ExtglobType | null; + id: number; + get depth(): number; constructor(type: ExtglobType | null, parent?: AST, options?: MinimatchOptions); get hasMagic(): boolean | undefined; toString(): string; diff --git a/deps/minimatch/dist/commonjs/ast.d.ts.map b/deps/minimatch/dist/commonjs/ast.d.ts.map index e15945067ab3a1..ec7f7898870ff2 100644 --- a/deps/minimatch/dist/commonjs/ast.d.ts.map +++ b/deps/minimatch/dist/commonjs/ast.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../../src/ast.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAwCvD,MAAM,MAAM,WAAW,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;AAkCrD,qBAAa,GAAG;;IACd,IAAI,EAAE,WAAW,GAAG,IAAI,CAAA;gBAiBtB,IAAI,EAAE,WAAW,GAAG,IAAI,EACxB,MAAM,CAAC,EAAE,GAAG,EACZ,OAAO,GAAE,gBAAqB;IAahC,IAAI,QAAQ,IAAI,OAAO,GAAG,SAAS,CAUlC;IAGD,QAAQ,IAAI,MAAM;IA+ClB,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,MAAM,GAAG,GAAG,CAAC,EAAE;IAY/B,MAAM;IAgBN,OAAO,IAAI,OAAO;IAgBlB,KAAK,IAAI,OAAO;IAYhB,MAAM,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM;IAKzB,KAAK,CAAC,MAAM,EAAE,GAAG;IAsIjB,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB;IAQ/D,WAAW,IAAI,QAAQ,GAAG,MAAM;IA2BhC,IAAI,OAAO,qBAEV;IAuED,cAAc,CACZ,QAAQ,CAAC,EAAE,OAAO,GACjB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC;CAmMjE"} \ No newline at end of file +{"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../../src/ast.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAwCvD,MAAM,MAAM,WAAW,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;AA6IrD,qBAAa,GAAG;;IACd,IAAI,EAAE,WAAW,GAAG,IAAI,CAAA;IAexB,EAAE,SAAO;IAET,IAAI,KAAK,IAAI,MAAM,CAElB;gBAgBC,IAAI,EAAE,WAAW,GAAG,IAAI,EACxB,MAAM,CAAC,EAAE,GAAG,EACZ,OAAO,GAAE,gBAAqB;IAahC,IAAI,QAAQ,IAAI,OAAO,GAAG,SAAS,CAUlC;IAGD,QAAQ,IAAI,MAAM;IA+ClB,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,MAAM,GAAG,GAAG,CAAC,EAAE;IAe/B,MAAM;IAkBN,OAAO,IAAI,OAAO;IAgBlB,KAAK,IAAI,OAAO;IAYhB,MAAM,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM;IAKzB,KAAK,CAAC,MAAM,EAAE,GAAG;IAwQjB,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB;IAQ/D,WAAW,IAAI,QAAQ,GAAG,MAAM;IA2BhC,IAAI,OAAO,qBAEV;IAuED,cAAc,CACZ,QAAQ,CAAC,EAAE,OAAO,GACjB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC;CA6OjE"} \ No newline at end of file diff --git a/deps/minimatch/dist/commonjs/ast.js b/deps/minimatch/dist/commonjs/ast.js index fd7f3d73ed31dd..5e657838e669ce 100644 --- a/deps/minimatch/dist/commonjs/ast.js +++ b/deps/minimatch/dist/commonjs/ast.js @@ -1,11 +1,113 @@ "use strict"; // parse a single path portion +var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.AST = void 0; const brace_expressions_js_1 = require("./brace-expressions.js"); const unescape_js_1 = require("./unescape.js"); const types = new Set(['!', '?', '+', '*', '@']); const isExtglobType = (c) => types.has(c); +const isExtglobAST = (c) => isExtglobType(c.type); +// Map of which extglob types can adopt the children of a nested extglob +// +// anything but ! can adopt a matching type: +// +(a|+(b|c)|d) => +(a|b|c|d) +// *(a|*(b|c)|d) => *(a|b|c|d) +// @(a|@(b|c)|d) => @(a|b|c|d) +// ?(a|?(b|c)|d) => ?(a|b|c|d) +// +// * can adopt anything, because 0 or repetition is allowed +// *(a|?(b|c)|d) => *(a|b|c|d) +// *(a|+(b|c)|d) => *(a|b|c|d) +// *(a|@(b|c)|d) => *(a|b|c|d) +// +// + can adopt @, because 1 or repetition is allowed +// +(a|@(b|c)|d) => +(a|b|c|d) +// +// + and @ CANNOT adopt *, because 0 would be allowed +// +(a|*(b|c)|d) => would match "", on *(b|c) +// @(a|*(b|c)|d) => would match "", on *(b|c) +// +// + and @ CANNOT adopt ?, because 0 would be allowed +// +(a|?(b|c)|d) => would match "", on ?(b|c) +// @(a|?(b|c)|d) => would match "", on ?(b|c) +// +// ? can adopt @, because 0 or 1 is allowed +// ?(a|@(b|c)|d) => ?(a|b|c|d) +// +// ? and @ CANNOT adopt * or +, because >1 would be allowed +// ?(a|*(b|c)|d) => would match bbb on *(b|c) +// @(a|*(b|c)|d) => would match bbb on *(b|c) +// ?(a|+(b|c)|d) => would match bbb on +(b|c) +// @(a|+(b|c)|d) => would match bbb on +(b|c) +// +// ! CANNOT adopt ! (nothing else can either) +// !(a|!(b|c)|d) => !(a|b|c|d) would fail to match on b (not not b|c) +// +// ! can adopt @ +// !(a|@(b|c)|d) => !(a|b|c|d) +// +// ! CANNOT adopt * +// !(a|*(b|c)|d) => !(a|b|c|d) would match on bbb, not allowed +// +// ! CANNOT adopt + +// !(a|+(b|c)|d) => !(a|b|c|d) would match on bbb, not allowed +// +// ! CANNOT adopt ? +// x!(a|?(b|c)|d) => x!(a|b|c|d) would fail to match "x" +const adoptionMap = new Map([ + ['!', ['@']], + ['?', ['?', '@']], + ['@', ['@']], + ['*', ['*', '+', '?', '@']], + ['+', ['+', '@']], +]); +// nested extglobs that can be adopted in, but with the addition of +// a blank '' element. +const adoptionWithSpaceMap = new Map([ + ['!', ['?']], + ['@', ['?']], + ['+', ['?', '*']], +]); +// union of the previous two maps +const adoptionAnyMap = new Map([ + ['!', ['?', '@']], + ['?', ['?', '@']], + ['@', ['?', '@']], + ['*', ['*', '+', '?', '@']], + ['+', ['+', '@', '?', '*']], +]); +// Extglobs that can take over their parent if they are the only child +// the key is parent, value maps child to resulting extglob parent type +// '@' is omitted because it's a special case. An `@` extglob with a single +// member can always be usurped by that subpattern. +const usurpMap = new Map([ + ['!', new Map([['!', '@']])], + [ + '?', + new Map([ + ['*', '*'], + ['+', '*'], + ]), + ], + [ + '@', + new Map([ + ['!', '!'], + ['?', '?'], + ['@', '@'], + ['*', '*'], + ['+', '+'], + ]), + ], + [ + '+', + new Map([ + ['?', '*'], + ['*', '*'], + ]), + ], +]); // Patterns that get prepended to bind to the start of either the // entire string, or just a single path portion, to prevent dots // and/or traversal patterns, when needed. @@ -29,6 +131,7 @@ const star = qmark + '*?'; const starNoEmpty = qmark + '+?'; // remove the \ chars that we added if we end up doing a nonmagic compare // const deslash = (s: string) => s.replace(/\\(.)/g, '$1') +let ID = 0; class AST { type; #root; @@ -44,6 +147,22 @@ class AST { // set to true if it's an extglob with no children // (which really means one child of '') #emptyExt = false; + id = ++ID; + get depth() { + return (this.#parent?.depth ?? -1) + 1; + } + [Symbol.for('nodejs.util.inspect.custom')]() { + return { + '@@type': 'AST', + id: this.id, + type: this.type, + root: this.#root.id, + parent: this.#parent?.id, + depth: this.depth, + partsLength: this.#parts.length, + parts: this.#parts, + }; + } constructor(type, parent, options = {}) { this.type = type; // extglobs are inherently magical @@ -122,7 +241,8 @@ class AST { if (p === '') continue; /* c8 ignore start */ - if (typeof p !== 'string' && !(p instanceof AST && p.#parent === this)) { + if (typeof p !== 'string' && + !(p instanceof _a && p.#parent === this)) { throw new Error('invalid part: ' + p); } /* c8 ignore stop */ @@ -130,8 +250,10 @@ class AST { } } toJSON() { - const ret = this.type === null - ? this.#parts.slice().map(p => (typeof p === 'string' ? p : p.toJSON())) + const ret = this.type === null ? + this.#parts + .slice() + .map(p => (typeof p === 'string' ? p : p.toJSON())) : [this.type, ...this.#parts.map(p => p.toJSON())]; if (this.isStart() && !this.type) ret.unshift([]); @@ -154,7 +276,7 @@ class AST { const p = this.#parent; for (let i = 0; i < this.#parentIndex; i++) { const pp = p.#parts[i]; - if (!(pp instanceof AST && pp.type === '!')) { + if (!(pp instanceof _a && pp.type === '!')) { return false; } } @@ -182,13 +304,14 @@ class AST { this.push(part.clone(this)); } clone(parent) { - const c = new AST(this.type, parent); + const c = new _a(this.type, parent); for (const p of this.#parts) { c.copyIn(p); } return c; } - static #parseAST(str, ast, pos, opt) { + static #parseAST(str, ast, pos, opt, extDepth) { + const maxDepth = opt.maxExtglobRecursion ?? 2; let escaping = false; let inBrace = false; let braceStart = -1; @@ -225,11 +348,17 @@ class AST { acc += c; continue; } - if (!opt.noext && isExtglobType(c) && str.charAt(i) === '(') { + // we don't have to check for adoption here, because that's + // done at the other recursion point. + const doRecurse = !opt.noext && + isExtglobType(c) && + str.charAt(i) === '(' && + extDepth <= maxDepth; + if (doRecurse) { ast.push(acc); acc = ''; - const ext = new AST(c, ast); - i = AST.#parseAST(str, ext, i, opt); + const ext = new _a(c, ast); + i = _a.#parseAST(str, ext, i, opt, extDepth + 1); ast.push(ext); continue; } @@ -241,7 +370,7 @@ class AST { // some kind of extglob, pos is at the ( // find the next | or ) let i = pos + 1; - let part = new AST(null, ast); + let part = new _a(null, ast); const parts = []; let acc = ''; while (i < str.length) { @@ -272,19 +401,26 @@ class AST { acc += c; continue; } - if (isExtglobType(c) && str.charAt(i) === '(') { + const doRecurse = !opt.noext && + isExtglobType(c) && + str.charAt(i) === '(' && + /* c8 ignore start - the maxDepth is sufficient here */ + (extDepth <= maxDepth || (ast && ast.#canAdoptType(c))); + /* c8 ignore stop */ + if (doRecurse) { + const depthAdd = ast && ast.#canAdoptType(c) ? 0 : 1; part.push(acc); acc = ''; - const ext = new AST(c, part); + const ext = new _a(c, part); part.push(ext); - i = AST.#parseAST(str, ext, i, opt); + i = _a.#parseAST(str, ext, i, opt, extDepth + depthAdd); continue; } if (c === '|') { part.push(acc); acc = ''; parts.push(part); - part = new AST(null, ast); + part = new _a(null, ast); continue; } if (c === ')') { @@ -306,9 +442,82 @@ class AST { ast.#parts = [str.substring(pos - 1)]; return i; } + #canAdoptWithSpace(child) { + return this.#canAdopt(child, adoptionWithSpaceMap); + } + #canAdopt(child, map = adoptionMap) { + if (!child || + typeof child !== 'object' || + child.type !== null || + child.#parts.length !== 1 || + this.type === null) { + return false; + } + const gc = child.#parts[0]; + if (!gc || typeof gc !== 'object' || gc.type === null) { + return false; + } + return this.#canAdoptType(gc.type, map); + } + #canAdoptType(c, map = adoptionAnyMap) { + return !!map.get(this.type)?.includes(c); + } + #adoptWithSpace(child, index) { + const gc = child.#parts[0]; + const blank = new _a(null, gc, this.options); + blank.#parts.push(''); + gc.push(blank); + this.#adopt(child, index); + } + #adopt(child, index) { + const gc = child.#parts[0]; + this.#parts.splice(index, 1, ...gc.#parts); + for (const p of gc.#parts) { + if (typeof p === 'object') + p.#parent = this; + } + this.#toString = undefined; + } + #canUsurpType(c) { + const m = usurpMap.get(this.type); + return !!(m?.has(c)); + } + #canUsurp(child) { + if (!child || + typeof child !== 'object' || + child.type !== null || + child.#parts.length !== 1 || + this.type === null || + this.#parts.length !== 1) { + return false; + } + const gc = child.#parts[0]; + if (!gc || typeof gc !== 'object' || gc.type === null) { + return false; + } + return this.#canUsurpType(gc.type); + } + #usurp(child) { + const m = usurpMap.get(this.type); + const gc = child.#parts[0]; + const nt = m?.get(gc.type); + /* c8 ignore start - impossible */ + if (!nt) + return false; + /* c8 ignore stop */ + this.#parts = gc.#parts; + for (const p of this.#parts) { + if (typeof p === 'object') { + p.#parent = this; + } + } + this.type = nt; + this.#toString = undefined; + this.#emptyExt = false; + } static fromGlob(pattern, options = {}) { - const ast = new AST(null, undefined, options); - AST.#parseAST(pattern, ast, 0, options); + const ast = new _a(null, undefined, options); + _a.#parseAST(pattern, ast, 0, options, 0); return ast; } // returns the regular expression if there's magic, or the unescaped @@ -412,16 +621,18 @@ class AST { // or start or whatever) and prepend ^ or / at the Regexp construction. toRegExpSource(allowDot) { const dot = allowDot ?? !!this.#options.dot; - if (this.#root === this) + if (this.#root === this) { + this.#flatten(); this.#fillNegs(); - if (!this.type) { + } + if (!isExtglobAST(this)) { const noEmpty = this.isStart() && this.isEnd() && !this.#parts.some(s => typeof s !== 'string'); const src = this.#parts .map(p => { - const [re, _, hasMagic, uflag] = typeof p === 'string' - ? AST.#parseGlob(p, this.#hasMagic, noEmpty) + const [re, _, hasMagic, uflag] = typeof p === 'string' ? + _a.#parseGlob(p, this.#hasMagic, noEmpty) : p.toRegExpSource(allowDot); this.#hasMagic = this.#hasMagic || hasMagic; this.#uflag = this.#uflag || uflag; @@ -450,7 +661,10 @@ class AST { // no need to prevent dots if it can't match a dot, or if a // sub-pattern will be preventing it anyway. const needNoDot = !dot && !allowDot && aps.has(src.charAt(0)); - start = needNoTrav ? startNoTraversal : needNoDot ? startNoDot : ''; + start = + needNoTrav ? startNoTraversal + : needNoDot ? startNoDot + : ''; } } } @@ -480,14 +694,14 @@ class AST { // invalid extglob, has to at least be *something* present, if it's // the entire path portion. const s = this.toString(); - this.#parts = [s]; - this.type = null; - this.#hasMagic = undefined; + const me = this; + me.#parts = [s]; + me.type = null; + me.#hasMagic = undefined; return [s, (0, unescape_js_1.unescape)(this.toString()), false, false]; } - // XXX abstract out this map method - let bodyDotAllowed = !repeated || allowDot || dot || !startNoDot - ? '' + let bodyDotAllowed = !repeated || allowDot || dot || !startNoDot ? + '' : this.#partsToRegExp(true); if (bodyDotAllowed === body) { bodyDotAllowed = ''; @@ -501,20 +715,16 @@ class AST { final = (this.isStart() && !dot ? startNoDot : '') + starNoEmpty; } else { - const close = this.type === '!' - ? // !() must match something,but !(x) can match '' - '))' + - (this.isStart() && !dot && !allowDot ? startNoDot : '') + - star + - ')' - : this.type === '@' - ? ')' - : this.type === '?' - ? ')?' - : this.type === '+' && bodyDotAllowed - ? ')' - : this.type === '*' && bodyDotAllowed - ? `)?` + const close = this.type === '!' ? + // !() must match something,but !(x) can match '' + '))' + + (this.isStart() && !dot && !allowDot ? startNoDot : '') + + star + + ')' + : this.type === '@' ? ')' + : this.type === '?' ? ')?' + : this.type === '+' && bodyDotAllowed ? ')' + : this.type === '*' && bodyDotAllowed ? `)?` : `)${this.type}`; final = start + body + close; } @@ -525,6 +735,42 @@ class AST { this.#uflag, ]; } + #flatten() { + if (!isExtglobAST(this)) { + for (const p of this.#parts) { + if (typeof p === 'object') { + p.#flatten(); + } + } + } + else { + // do up to 10 passes to flatten as much as possible + let iterations = 0; + let done = false; + do { + done = true; + for (let i = 0; i < this.#parts.length; i++) { + const c = this.#parts[i]; + if (typeof c === 'object') { + c.#flatten(); + if (this.#canAdopt(c)) { + done = false; + this.#adopt(c, i); + } + else if (this.#canAdoptWithSpace(c)) { + done = false; + this.#adoptWithSpace(c, i); + } + else if (this.#canUsurp(c)) { + done = false; + this.#usurp(c); + } + } + } + } while (!done && ++iterations < 10); + } + this.#toString = undefined; + } #partsToRegExp(dot) { return this.#parts .map(p => { @@ -546,6 +792,8 @@ class AST { let escaping = false; let re = ''; let uflag = false; + // multiple stars that aren't globstars coalesce into one * + let inStar = false; for (let i = 0; i < glob.length; i++) { const c = glob.charAt(i); if (escaping) { @@ -553,6 +801,17 @@ class AST { re += (reSpecials.has(c) ? '\\' : '') + c; continue; } + if (c === '*') { + if (inStar) + continue; + inStar = true; + re += noEmpty && /^[*]+$/.test(glob) ? starNoEmpty : star; + hasMagic = true; + continue; + } + else { + inStar = false; + } if (c === '\\') { if (i === glob.length - 1) { re += '\\\\'; @@ -572,11 +831,6 @@ class AST { continue; } } - if (c === '*') { - re += noEmpty && glob === '*' ? starNoEmpty : star; - hasMagic = true; - continue; - } if (c === '?') { re += qmark; hasMagic = true; @@ -588,4 +842,5 @@ class AST { } } exports.AST = AST; +_a = AST; //# sourceMappingURL=ast.js.map \ No newline at end of file diff --git a/deps/minimatch/dist/commonjs/ast.js.map b/deps/minimatch/dist/commonjs/ast.js.map index 58a8abe90989b9..6affc8b7f647a8 100644 --- a/deps/minimatch/dist/commonjs/ast.js.map +++ b/deps/minimatch/dist/commonjs/ast.js.map @@ -1 +1 @@ -{"version":3,"file":"ast.js","sourceRoot":"","sources":["../../src/ast.ts"],"names":[],"mappings":"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","sourcesContent":["// parse a single path portion\n\nimport { parseClass } from './brace-expressions.js'\nimport { MinimatchOptions, MMRegExp } from './index.js'\nimport { unescape } from './unescape.js'\n\n// classes [] are handled by the parseClass method\n// for positive extglobs, we sub-parse the contents, and combine,\n// with the appropriate regexp close.\n// for negative extglobs, we sub-parse the contents, but then\n// have to include the rest of the pattern, then the parent, etc.,\n// as the thing that cannot be because RegExp negative lookaheads\n// are different from globs.\n//\n// So for example:\n// a@(i|w!(x|y)z|j)b => ^a(i|w((!?(x|y)zb).*)z|j)b$\n// 1 2 3 4 5 6 1 2 3 46 5 6\n//\n// Assembling the extglob requires not just the negated patterns themselves,\n// but also anything following the negative patterns up to the boundary\n// of the current pattern, plus anything following in the parent pattern.\n//\n//\n// So, first, we parse the string into an AST of extglobs, without turning\n// anything into regexps yet.\n//\n// ['a', {@ [['i'], ['w', {!['x', 'y']}, 'z'], ['j']]}, 'b']\n//\n// Then, for all the negative extglobs, we append whatever comes after in\n// each parent as their tail\n//\n// ['a', {@ [['i'], ['w', {!['x', 'y'], 'z', 'b'}, 'z'], ['j']]}, 'b']\n//\n// Lastly, we turn each of these pieces into a regexp, and join\n//\n// v----- .* because there's more following,\n// v v otherwise, .+ because it must be\n// v v *something* there.\n// ['^a', {@ ['i', 'w(?:(!?(?:x|y).*zb$).*)z', 'j' ]}, 'b$']\n// copy what follows into here--^^^^^\n// ['^a', '(?:i|w(?:(?!(?:x|y).*zb$).*)z|j)', 'b$']\n// ['^a(?:i|w(?:(?!(?:x|y).*zb$).*)z|j)b$']\n\nexport type ExtglobType = '!' | '?' | '+' | '*' | '@'\nconst types = new Set<ExtglobType>(['!', '?', '+', '*', '@'])\nconst isExtglobType = (c: string): c is ExtglobType =>\n types.has(c as ExtglobType)\n\n// Patterns that get prepended to bind to the start of either the\n// entire string, or just a single path portion, to prevent dots\n// and/or traversal patterns, when needed.\n// Exts don't need the ^ or / bit, because the root binds that already.\nconst startNoTraversal = '(?!(?:^|/)\\\\.\\\\.?(?:$|/))'\nconst startNoDot = '(?!\\\\.)'\n\n// characters that indicate a start of pattern needs the \"no dots\" bit,\n// because a dot *might* be matched. ( is not in the list, because in\n// the case of a child extglob, it will handle the prevention itself.\nconst addPatternStart = new Set(['[', '.'])\n// cases where traversal is A-OK, no dot prevention needed\nconst justDots = new Set(['..', '.'])\nconst reSpecials = new Set('().*{}+?[]^$\\\\!')\nconst regExpEscape = (s: string) =>\n s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\n// any single thing other than /\nconst qmark = '[^/]'\n\n// * => any number of characters\nconst star = qmark + '*?'\n// use + when we need to ensure that *something* matches, because the * is\n// the only thing in the path portion.\nconst starNoEmpty = qmark + '+?'\n\n// remove the \\ chars that we added if we end up doing a nonmagic compare\n// const deslash = (s: string) => s.replace(/\\\\(.)/g, '$1')\n\nexport class AST {\n type: ExtglobType | null\n readonly #root: AST\n\n #hasMagic?: boolean\n #uflag: boolean = false\n #parts: (string | AST)[] = []\n readonly #parent?: AST\n readonly #parentIndex: number\n #negs: AST[]\n #filledNegs: boolean = false\n #options: MinimatchOptions\n #toString?: string\n // set to true if it's an extglob with no children\n // (which really means one child of '')\n #emptyExt: boolean = false\n\n constructor(\n type: ExtglobType | null,\n parent?: AST,\n options: MinimatchOptions = {},\n ) {\n this.type = type\n // extglobs are inherently magical\n if (type) this.#hasMagic = true\n this.#parent = parent\n this.#root = this.#parent ? this.#parent.#root : this\n this.#options = this.#root === this ? options : this.#root.#options\n this.#negs = this.#root === this ? [] : this.#root.#negs\n if (type === '!' && !this.#root.#filledNegs) this.#negs.push(this)\n this.#parentIndex = this.#parent ? this.#parent.#parts.length : 0\n }\n\n get hasMagic(): boolean | undefined {\n /* c8 ignore start */\n if (this.#hasMagic !== undefined) return this.#hasMagic\n /* c8 ignore stop */\n for (const p of this.#parts) {\n if (typeof p === 'string') continue\n if (p.type || p.hasMagic) return (this.#hasMagic = true)\n }\n // note: will be undefined until we generate the regexp src and find out\n return this.#hasMagic\n }\n\n // reconstructs the pattern\n toString(): string {\n if (this.#toString !== undefined) return this.#toString\n if (!this.type) {\n return (this.#toString = this.#parts.map(p => String(p)).join(''))\n } else {\n return (this.#toString =\n this.type + '(' + this.#parts.map(p => String(p)).join('|') + ')')\n }\n }\n\n #fillNegs() {\n /* c8 ignore start */\n if (this !== this.#root) throw new Error('should only call on root')\n if (this.#filledNegs) return this\n /* c8 ignore stop */\n\n // call toString() once to fill this out\n this.toString()\n this.#filledNegs = true\n let n: AST | undefined\n while ((n = this.#negs.pop())) {\n if (n.type !== '!') continue\n // walk up the tree, appending everthing that comes AFTER parentIndex\n let p: AST | undefined = n\n let pp = p.#parent\n while (pp) {\n for (\n let i = p.#parentIndex + 1;\n !pp.type && i < pp.#parts.length;\n i++\n ) {\n for (const part of n.#parts) {\n /* c8 ignore start */\n if (typeof part === 'string') {\n throw new Error('string part in extglob AST??')\n }\n /* c8 ignore stop */\n part.copyIn(pp.#parts[i])\n }\n }\n p = pp\n pp = p.#parent\n }\n }\n return this\n }\n\n push(...parts: (string | AST)[]) {\n for (const p of parts) {\n if (p === '') continue\n /* c8 ignore start */\n if (typeof p !== 'string' && !(p instanceof AST && p.#parent === this)) {\n throw new Error('invalid part: ' + p)\n }\n /* c8 ignore stop */\n this.#parts.push(p)\n }\n }\n\n toJSON() {\n const ret: any[] =\n this.type === null\n ? this.#parts.slice().map(p => (typeof p === 'string' ? p : p.toJSON()))\n : [this.type, ...this.#parts.map(p => (p as AST).toJSON())]\n if (this.isStart() && !this.type) ret.unshift([])\n if (\n this.isEnd() &&\n (this === this.#root ||\n (this.#root.#filledNegs && this.#parent?.type === '!'))\n ) {\n ret.push({})\n }\n return ret\n }\n\n isStart(): boolean {\n if (this.#root === this) return true\n // if (this.type) return !!this.#parent?.isStart()\n if (!this.#parent?.isStart()) return false\n if (this.#parentIndex === 0) return true\n // if everything AHEAD of this is a negation, then it's still the \"start\"\n const p = this.#parent\n for (let i = 0; i < this.#parentIndex; i++) {\n const pp = p.#parts[i]\n if (!(pp instanceof AST && pp.type === '!')) {\n return false\n }\n }\n return true\n }\n\n isEnd(): boolean {\n if (this.#root === this) return true\n if (this.#parent?.type === '!') return true\n if (!this.#parent?.isEnd()) return false\n if (!this.type) return this.#parent?.isEnd()\n // if not root, it'll always have a parent\n /* c8 ignore start */\n const pl = this.#parent ? this.#parent.#parts.length : 0\n /* c8 ignore stop */\n return this.#parentIndex === pl - 1\n }\n\n copyIn(part: AST | string) {\n if (typeof part === 'string') this.push(part)\n else this.push(part.clone(this))\n }\n\n clone(parent: AST) {\n const c = new AST(this.type, parent)\n for (const p of this.#parts) {\n c.copyIn(p)\n }\n return c\n }\n\n static #parseAST(\n str: string,\n ast: AST,\n pos: number,\n opt: MinimatchOptions,\n ): number {\n let escaping = false\n let inBrace = false\n let braceStart = -1\n let braceNeg = false\n if (ast.type === null) {\n // outside of a extglob, append until we find a start\n let i = pos\n let acc = ''\n while (i < str.length) {\n const c = str.charAt(i++)\n // still accumulate escapes at this point, but we do ignore\n // starts that are escaped\n if (escaping || c === '\\\\') {\n escaping = !escaping\n acc += c\n continue\n }\n\n if (inBrace) {\n if (i === braceStart + 1) {\n if (c === '^' || c === '!') {\n braceNeg = true\n }\n } else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {\n inBrace = false\n }\n acc += c\n continue\n } else if (c === '[') {\n inBrace = true\n braceStart = i\n braceNeg = false\n acc += c\n continue\n }\n\n if (!opt.noext && isExtglobType(c) && str.charAt(i) === '(') {\n ast.push(acc)\n acc = ''\n const ext = new AST(c, ast)\n i = AST.#parseAST(str, ext, i, opt)\n ast.push(ext)\n continue\n }\n acc += c\n }\n ast.push(acc)\n return i\n }\n\n // some kind of extglob, pos is at the (\n // find the next | or )\n let i = pos + 1\n let part = new AST(null, ast)\n const parts: AST[] = []\n let acc = ''\n while (i < str.length) {\n const c = str.charAt(i++)\n // still accumulate escapes at this point, but we do ignore\n // starts that are escaped\n if (escaping || c === '\\\\') {\n escaping = !escaping\n acc += c\n continue\n }\n\n if (inBrace) {\n if (i === braceStart + 1) {\n if (c === '^' || c === '!') {\n braceNeg = true\n }\n } else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {\n inBrace = false\n }\n acc += c\n continue\n } else if (c === '[') {\n inBrace = true\n braceStart = i\n braceNeg = false\n acc += c\n continue\n }\n\n if (isExtglobType(c) && str.charAt(i) === '(') {\n part.push(acc)\n acc = ''\n const ext = new AST(c, part)\n part.push(ext)\n i = AST.#parseAST(str, ext, i, opt)\n continue\n }\n if (c === '|') {\n part.push(acc)\n acc = ''\n parts.push(part)\n part = new AST(null, ast)\n continue\n }\n if (c === ')') {\n if (acc === '' && ast.#parts.length === 0) {\n ast.#emptyExt = true\n }\n part.push(acc)\n acc = ''\n ast.push(...parts, part)\n return i\n }\n acc += c\n }\n\n // unfinished extglob\n // if we got here, it was a malformed extglob! not an extglob, but\n // maybe something else in there.\n ast.type = null\n ast.#hasMagic = undefined\n ast.#parts = [str.substring(pos - 1)]\n return i\n }\n\n static fromGlob(pattern: string, options: MinimatchOptions = {}) {\n const ast = new AST(null, undefined, options)\n AST.#parseAST(pattern, ast, 0, options)\n return ast\n }\n\n // returns the regular expression if there's magic, or the unescaped\n // string if not.\n toMMPattern(): MMRegExp | string {\n // should only be called on root\n /* c8 ignore start */\n if (this !== this.#root) return this.#root.toMMPattern()\n /* c8 ignore stop */\n const glob = this.toString()\n const [re, body, hasMagic, uflag] = this.toRegExpSource()\n // if we're in nocase mode, and not nocaseMagicOnly, then we do\n // still need a regular expression if we have to case-insensitively\n // match capital/lowercase characters.\n const anyMagic =\n hasMagic ||\n this.#hasMagic ||\n (this.#options.nocase &&\n !this.#options.nocaseMagicOnly &&\n glob.toUpperCase() !== glob.toLowerCase())\n if (!anyMagic) {\n return body\n }\n\n const flags = (this.#options.nocase ? 'i' : '') + (uflag ? 'u' : '')\n return Object.assign(new RegExp(`^${re}$`, flags), {\n _src: re,\n _glob: glob,\n })\n }\n\n get options() {\n return this.#options\n }\n\n // returns the string match, the regexp source, whether there's magic\n // in the regexp (so a regular expression is required) and whether or\n // not the uflag is needed for the regular expression (for posix classes)\n // TODO: instead of injecting the start/end at this point, just return\n // the BODY of the regexp, along with the start/end portions suitable\n // for binding the start/end in either a joined full-path makeRe context\n // (where we bind to (^|/), or a standalone matchPart context (where\n // we bind to ^, and not /). Otherwise slashes get duped!\n //\n // In part-matching mode, the start is:\n // - if not isStart: nothing\n // - if traversal possible, but not allowed: ^(?!\\.\\.?$)\n // - if dots allowed or not possible: ^\n // - if dots possible and not allowed: ^(?!\\.)\n // end is:\n // - if not isEnd(): nothing\n // - else: $\n //\n // In full-path matching mode, we put the slash at the START of the\n // pattern, so start is:\n // - if first pattern: same as part-matching mode\n // - if not isStart(): nothing\n // - if traversal possible, but not allowed: /(?!\\.\\.?(?:$|/))\n // - if dots allowed or not possible: /\n // - if dots possible and not allowed: /(?!\\.)\n // end is:\n // - if last pattern, same as part-matching mode\n // - else nothing\n //\n // Always put the (?:$|/) on negated tails, though, because that has to be\n // there to bind the end of the negated pattern portion, and it's easier to\n // just stick it in now rather than try to inject it later in the middle of\n // the pattern.\n //\n // We can just always return the same end, and leave it up to the caller\n // to know whether it's going to be used joined or in parts.\n // And, if the start is adjusted slightly, can do the same there:\n // - if not isStart: nothing\n // - if traversal possible, but not allowed: (?:/|^)(?!\\.\\.?$)\n // - if dots allowed or not possible: (?:/|^)\n // - if dots possible and not allowed: (?:/|^)(?!\\.)\n //\n // But it's better to have a simpler binding without a conditional, for\n // performance, so probably better to return both start options.\n //\n // Then the caller just ignores the end if it's not the first pattern,\n // and the start always gets applied.\n //\n // But that's always going to be $ if it's the ending pattern, or nothing,\n // so the caller can just attach $ at the end of the pattern when building.\n //\n // So the todo is:\n // - better detect what kind of start is needed\n // - return both flavors of starting pattern\n // - attach $ at the end of the pattern when creating the actual RegExp\n //\n // Ah, but wait, no, that all only applies to the root when the first pattern\n // is not an extglob. If the first pattern IS an extglob, then we need all\n // that dot prevention biz to live in the extglob portions, because eg\n // +(*|.x*) can match .xy but not .yx.\n //\n // So, return the two flavors if it's #root and the first child is not an\n // AST, otherwise leave it to the child AST to handle it, and there,\n // use the (?:^|/) style of start binding.\n //\n // Even simplified further:\n // - Since the start for a join is eg /(?!\\.) and the start for a part\n // is ^(?!\\.), we can just prepend (?!\\.) to the pattern (either root\n // or start or whatever) and prepend ^ or / at the Regexp construction.\n toRegExpSource(\n allowDot?: boolean,\n ): [re: string, body: string, hasMagic: boolean, uflag: boolean] {\n const dot = allowDot ?? !!this.#options.dot\n if (this.#root === this) this.#fillNegs()\n if (!this.type) {\n const noEmpty =\n this.isStart() &&\n this.isEnd() &&\n !this.#parts.some(s => typeof s !== 'string')\n const src = this.#parts\n .map(p => {\n const [re, _, hasMagic, uflag] =\n typeof p === 'string'\n ? AST.#parseGlob(p, this.#hasMagic, noEmpty)\n : p.toRegExpSource(allowDot)\n this.#hasMagic = this.#hasMagic || hasMagic\n this.#uflag = this.#uflag || uflag\n return re\n })\n .join('')\n\n let start = ''\n if (this.isStart()) {\n if (typeof this.#parts[0] === 'string') {\n // this is the string that will match the start of the pattern,\n // so we need to protect against dots and such.\n\n // '.' and '..' cannot match unless the pattern is that exactly,\n // even if it starts with . or dot:true is set.\n const dotTravAllowed =\n this.#parts.length === 1 && justDots.has(this.#parts[0])\n if (!dotTravAllowed) {\n const aps = addPatternStart\n // check if we have a possibility of matching . or ..,\n // and prevent that.\n const needNoTrav =\n // dots are allowed, and the pattern starts with [ or .\n (dot && aps.has(src.charAt(0))) ||\n // the pattern starts with \\., and then [ or .\n (src.startsWith('\\\\.') && aps.has(src.charAt(2))) ||\n // the pattern starts with \\.\\., and then [ or .\n (src.startsWith('\\\\.\\\\.') && aps.has(src.charAt(4)))\n // no need to prevent dots if it can't match a dot, or if a\n // sub-pattern will be preventing it anyway.\n const needNoDot = !dot && !allowDot && aps.has(src.charAt(0))\n\n start = needNoTrav ? startNoTraversal : needNoDot ? startNoDot : ''\n }\n }\n }\n\n // append the \"end of path portion\" pattern to negation tails\n let end = ''\n if (\n this.isEnd() &&\n this.#root.#filledNegs &&\n this.#parent?.type === '!'\n ) {\n end = '(?:$|\\\\/)'\n }\n const final = start + src + end\n return [\n final,\n unescape(src),\n (this.#hasMagic = !!this.#hasMagic),\n this.#uflag,\n ]\n }\n\n // We need to calculate the body *twice* if it's a repeat pattern\n // at the start, once in nodot mode, then again in dot mode, so a\n // pattern like *(?) can match 'x.y'\n\n const repeated = this.type === '*' || this.type === '+'\n // some kind of extglob\n const start = this.type === '!' ? '(?:(?!(?:' : '(?:'\n let body = this.#partsToRegExp(dot)\n\n if (this.isStart() && this.isEnd() && !body && this.type !== '!') {\n // invalid extglob, has to at least be *something* present, if it's\n // the entire path portion.\n const s = this.toString()\n this.#parts = [s]\n this.type = null\n this.#hasMagic = undefined\n return [s, unescape(this.toString()), false, false]\n }\n\n // XXX abstract out this map method\n let bodyDotAllowed =\n !repeated || allowDot || dot || !startNoDot\n ? ''\n : this.#partsToRegExp(true)\n if (bodyDotAllowed === body) {\n bodyDotAllowed = ''\n }\n if (bodyDotAllowed) {\n body = `(?:${body})(?:${bodyDotAllowed})*?`\n }\n\n // an empty !() is exactly equivalent to a starNoEmpty\n let final = ''\n if (this.type === '!' && this.#emptyExt) {\n final = (this.isStart() && !dot ? startNoDot : '') + starNoEmpty\n } else {\n const close =\n this.type === '!'\n ? // !() must match something,but !(x) can match ''\n '))' +\n (this.isStart() && !dot && !allowDot ? startNoDot : '') +\n star +\n ')'\n : this.type === '@'\n ? ')'\n : this.type === '?'\n ? ')?'\n : this.type === '+' && bodyDotAllowed\n ? ')'\n : this.type === '*' && bodyDotAllowed\n ? `)?`\n : `)${this.type}`\n final = start + body + close\n }\n return [\n final,\n unescape(body),\n (this.#hasMagic = !!this.#hasMagic),\n this.#uflag,\n ]\n }\n\n #partsToRegExp(dot: boolean) {\n return this.#parts\n .map(p => {\n // extglob ASTs should only contain parent ASTs\n /* c8 ignore start */\n if (typeof p === 'string') {\n throw new Error('string type in extglob ast??')\n }\n /* c8 ignore stop */\n // can ignore hasMagic, because extglobs are already always magic\n const [re, _, _hasMagic, uflag] = p.toRegExpSource(dot)\n this.#uflag = this.#uflag || uflag\n return re\n })\n .filter(p => !(this.isStart() && this.isEnd()) || !!p)\n .join('|')\n }\n\n static #parseGlob(\n glob: string,\n hasMagic: boolean | undefined,\n noEmpty: boolean = false,\n ): [re: string, body: string, hasMagic: boolean, uflag: boolean] {\n let escaping = false\n let re = ''\n let uflag = false\n for (let i = 0; i < glob.length; i++) {\n const c = glob.charAt(i)\n if (escaping) {\n escaping = false\n re += (reSpecials.has(c) ? '\\\\' : '') + c\n continue\n }\n if (c === '\\\\') {\n if (i === glob.length - 1) {\n re += '\\\\\\\\'\n } else {\n escaping = true\n }\n continue\n }\n if (c === '[') {\n const [src, needUflag, consumed, magic] = parseClass(glob, i)\n if (consumed) {\n re += src\n uflag = uflag || needUflag\n i += consumed - 1\n hasMagic = hasMagic || magic\n continue\n }\n }\n if (c === '*') {\n re += noEmpty && glob === '*' ? starNoEmpty : star\n hasMagic = true\n continue\n }\n if (c === '?') {\n re += qmark\n hasMagic = true\n continue\n }\n re += regExpEscape(c)\n }\n return [re, unescape(glob), !!hasMagic, uflag]\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"ast.js","sourceRoot":"","sources":["../../src/ast.ts"],"names":[],"mappings":"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","sourcesContent":["// parse a single path portion\n\nimport { parseClass } from './brace-expressions.js'\nimport { MinimatchOptions, MMRegExp } from './index.js'\nimport { unescape } from './unescape.js'\n\n// classes [] are handled by the parseClass method\n// for positive extglobs, we sub-parse the contents, and combine,\n// with the appropriate regexp close.\n// for negative extglobs, we sub-parse the contents, but then\n// have to include the rest of the pattern, then the parent, etc.,\n// as the thing that cannot be because RegExp negative lookaheads\n// are different from globs.\n//\n// So for example:\n// a@(i|w!(x|y)z|j)b => ^a(i|w((!?(x|y)zb).*)z|j)b$\n// 1 2 3 4 5 6 1 2 3 46 5 6\n//\n// Assembling the extglob requires not just the negated patterns themselves,\n// but also anything following the negative patterns up to the boundary\n// of the current pattern, plus anything following in the parent pattern.\n//\n//\n// So, first, we parse the string into an AST of extglobs, without turning\n// anything into regexps yet.\n//\n// ['a', {@ [['i'], ['w', {!['x', 'y']}, 'z'], ['j']]}, 'b']\n//\n// Then, for all the negative extglobs, we append whatever comes after in\n// each parent as their tail\n//\n// ['a', {@ [['i'], ['w', {!['x', 'y'], 'z', 'b'}, 'z'], ['j']]}, 'b']\n//\n// Lastly, we turn each of these pieces into a regexp, and join\n//\n// v----- .* because there's more following,\n// v v otherwise, .+ because it must be\n// v v *something* there.\n// ['^a', {@ ['i', 'w(?:(!?(?:x|y).*zb$).*)z', 'j' ]}, 'b$']\n// copy what follows into here--^^^^^\n// ['^a', '(?:i|w(?:(?!(?:x|y).*zb$).*)z|j)', 'b$']\n// ['^a(?:i|w(?:(?!(?:x|y).*zb$).*)z|j)b$']\n\nexport type ExtglobType = '!' | '?' | '+' | '*' | '@'\nconst types = new Set<ExtglobType>(['!', '?', '+', '*', '@'])\nconst isExtglobType = (c: string | null): c is ExtglobType =>\n types.has(c as ExtglobType)\nconst isExtglobAST = (c: AST): c is AST & { type: ExtglobType } =>\n isExtglobType(c.type)\n\n// Map of which extglob types can adopt the children of a nested extglob\n//\n// anything but ! can adopt a matching type:\n// +(a|+(b|c)|d) => +(a|b|c|d)\n// *(a|*(b|c)|d) => *(a|b|c|d)\n// @(a|@(b|c)|d) => @(a|b|c|d)\n// ?(a|?(b|c)|d) => ?(a|b|c|d)\n//\n// * can adopt anything, because 0 or repetition is allowed\n// *(a|?(b|c)|d) => *(a|b|c|d)\n// *(a|+(b|c)|d) => *(a|b|c|d)\n// *(a|@(b|c)|d) => *(a|b|c|d)\n//\n// + can adopt @, because 1 or repetition is allowed\n// +(a|@(b|c)|d) => +(a|b|c|d)\n//\n// + and @ CANNOT adopt *, because 0 would be allowed\n// +(a|*(b|c)|d) => would match \"\", on *(b|c)\n// @(a|*(b|c)|d) => would match \"\", on *(b|c)\n//\n// + and @ CANNOT adopt ?, because 0 would be allowed\n// +(a|?(b|c)|d) => would match \"\", on ?(b|c)\n// @(a|?(b|c)|d) => would match \"\", on ?(b|c)\n//\n// ? can adopt @, because 0 or 1 is allowed\n// ?(a|@(b|c)|d) => ?(a|b|c|d)\n//\n// ? and @ CANNOT adopt * or +, because >1 would be allowed\n// ?(a|*(b|c)|d) => would match bbb on *(b|c)\n// @(a|*(b|c)|d) => would match bbb on *(b|c)\n// ?(a|+(b|c)|d) => would match bbb on +(b|c)\n// @(a|+(b|c)|d) => would match bbb on +(b|c)\n//\n// ! CANNOT adopt ! (nothing else can either)\n// !(a|!(b|c)|d) => !(a|b|c|d) would fail to match on b (not not b|c)\n//\n// ! can adopt @\n// !(a|@(b|c)|d) => !(a|b|c|d)\n//\n// ! CANNOT adopt *\n// !(a|*(b|c)|d) => !(a|b|c|d) would match on bbb, not allowed\n//\n// ! CANNOT adopt +\n// !(a|+(b|c)|d) => !(a|b|c|d) would match on bbb, not allowed\n//\n// ! CANNOT adopt ?\n// x!(a|?(b|c)|d) => x!(a|b|c|d) would fail to match \"x\"\nconst adoptionMap = new Map<ExtglobType, ExtglobType[]>([\n ['!', ['@']],\n ['?', ['?', '@']],\n ['@', ['@']],\n ['*', ['*', '+', '?', '@']],\n ['+', ['+', '@']],\n])\n\n// nested extglobs that can be adopted in, but with the addition of\n// a blank '' element.\nconst adoptionWithSpaceMap = new Map<ExtglobType, ExtglobType[]>([\n ['!', ['?']],\n ['@', ['?']],\n ['+', ['?', '*']],\n])\n\n// union of the previous two maps\nconst adoptionAnyMap = new Map<ExtglobType, ExtglobType[]>([\n ['!', ['?', '@']],\n ['?', ['?', '@']],\n ['@', ['?', '@']],\n ['*', ['*', '+', '?', '@']],\n ['+', ['+', '@', '?', '*']],\n])\n\n// Extglobs that can take over their parent if they are the only child\n// the key is parent, value maps child to resulting extglob parent type\n// '@' is omitted because it's a special case. An `@` extglob with a single\n// member can always be usurped by that subpattern.\nconst usurpMap = new Map<ExtglobType, Map<ExtglobType | null, ExtglobType | null>>([\n ['!', new Map([['!', '@']])],\n [\n '?',\n new Map([\n ['*', '*'],\n ['+', '*'],\n ]),\n ],\n [\n '@',\n new Map([\n ['!', '!'],\n ['?', '?'],\n ['@', '@'],\n ['*', '*'],\n ['+', '+'],\n ]),\n ],\n [\n '+',\n new Map([\n ['?', '*'],\n ['*', '*'],\n ]),\n ],\n])\n\n// Patterns that get prepended to bind to the start of either the\n// entire string, or just a single path portion, to prevent dots\n// and/or traversal patterns, when needed.\n// Exts don't need the ^ or / bit, because the root binds that already.\nconst startNoTraversal = '(?!(?:^|/)\\\\.\\\\.?(?:$|/))'\nconst startNoDot = '(?!\\\\.)'\n\n// characters that indicate a start of pattern needs the \"no dots\" bit,\n// because a dot *might* be matched. ( is not in the list, because in\n// the case of a child extglob, it will handle the prevention itself.\nconst addPatternStart = new Set(['[', '.'])\n// cases where traversal is A-OK, no dot prevention needed\nconst justDots = new Set(['..', '.'])\nconst reSpecials = new Set('().*{}+?[]^$\\\\!')\nconst regExpEscape = (s: string) =>\n s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\n// any single thing other than /\nconst qmark = '[^/]'\n\n// * => any number of characters\nconst star = qmark + '*?'\n// use + when we need to ensure that *something* matches, because the * is\n// the only thing in the path portion.\nconst starNoEmpty = qmark + '+?'\n\n// remove the \\ chars that we added if we end up doing a nonmagic compare\n// const deslash = (s: string) => s.replace(/\\\\(.)/g, '$1')\n\nlet ID = 0\nexport class AST {\n type: ExtglobType | null\n readonly #root: AST\n\n #hasMagic?: boolean\n #uflag: boolean = false\n #parts: (string | AST)[] = []\n #parent?: AST\n #parentIndex: number\n #negs: AST[]\n #filledNegs: boolean = false\n #options: MinimatchOptions\n #toString?: string\n // set to true if it's an extglob with no children\n // (which really means one child of '')\n #emptyExt: boolean = false\n id = ++ID\n\n get depth(): number {\n return (this.#parent?.depth ?? -1) + 1\n }\n\n [Symbol.for('nodejs.util.inspect.custom')]() {\n return {\n '@@type': 'AST',\n id: this.id,\n type: this.type,\n root: this.#root.id,\n parent: this.#parent?.id,\n depth: this.depth,\n partsLength: this.#parts.length,\n parts: this.#parts,\n }\n }\n\n constructor(\n type: ExtglobType | null,\n parent?: AST,\n options: MinimatchOptions = {},\n ) {\n this.type = type\n // extglobs are inherently magical\n if (type) this.#hasMagic = true\n this.#parent = parent\n this.#root = this.#parent ? this.#parent.#root : this\n this.#options = this.#root === this ? options : this.#root.#options\n this.#negs = this.#root === this ? [] : this.#root.#negs\n if (type === '!' && !this.#root.#filledNegs) this.#negs.push(this)\n this.#parentIndex = this.#parent ? this.#parent.#parts.length : 0\n }\n\n get hasMagic(): boolean | undefined {\n /* c8 ignore start */\n if (this.#hasMagic !== undefined) return this.#hasMagic\n /* c8 ignore stop */\n for (const p of this.#parts) {\n if (typeof p === 'string') continue\n if (p.type || p.hasMagic) return (this.#hasMagic = true)\n }\n // note: will be undefined until we generate the regexp src and find out\n return this.#hasMagic\n }\n\n // reconstructs the pattern\n toString(): string {\n if (this.#toString !== undefined) return this.#toString\n if (!this.type) {\n return (this.#toString = this.#parts.map(p => String(p)).join(''))\n } else {\n return (this.#toString =\n this.type + '(' + this.#parts.map(p => String(p)).join('|') + ')')\n }\n }\n\n #fillNegs() {\n /* c8 ignore start */\n if (this !== this.#root) throw new Error('should only call on root')\n if (this.#filledNegs) return this\n /* c8 ignore stop */\n\n // call toString() once to fill this out\n this.toString()\n this.#filledNegs = true\n let n: AST | undefined\n while ((n = this.#negs.pop())) {\n if (n.type !== '!') continue\n // walk up the tree, appending everthing that comes AFTER parentIndex\n let p: AST | undefined = n\n let pp = p.#parent\n while (pp) {\n for (\n let i = p.#parentIndex + 1;\n !pp.type && i < pp.#parts.length;\n i++\n ) {\n for (const part of n.#parts) {\n /* c8 ignore start */\n if (typeof part === 'string') {\n throw new Error('string part in extglob AST??')\n }\n /* c8 ignore stop */\n part.copyIn(pp.#parts[i])\n }\n }\n p = pp\n pp = p.#parent\n }\n }\n return this\n }\n\n push(...parts: (string | AST)[]) {\n for (const p of parts) {\n if (p === '') continue\n /* c8 ignore start */\n if (\n typeof p !== 'string' &&\n !(p instanceof AST && p.#parent === this)\n ) {\n throw new Error('invalid part: ' + p)\n }\n /* c8 ignore stop */\n this.#parts.push(p)\n }\n }\n\n toJSON() {\n const ret: any[] =\n this.type === null ?\n this.#parts\n .slice()\n .map(p => (typeof p === 'string' ? p : p.toJSON()))\n : [this.type, ...this.#parts.map(p => (p as AST).toJSON())]\n if (this.isStart() && !this.type) ret.unshift([])\n if (\n this.isEnd() &&\n (this === this.#root ||\n (this.#root.#filledNegs && this.#parent?.type === '!'))\n ) {\n ret.push({})\n }\n return ret\n }\n\n isStart(): boolean {\n if (this.#root === this) return true\n // if (this.type) return !!this.#parent?.isStart()\n if (!this.#parent?.isStart()) return false\n if (this.#parentIndex === 0) return true\n // if everything AHEAD of this is a negation, then it's still the \"start\"\n const p = this.#parent\n for (let i = 0; i < this.#parentIndex; i++) {\n const pp = p.#parts[i]\n if (!(pp instanceof AST && pp.type === '!')) {\n return false\n }\n }\n return true\n }\n\n isEnd(): boolean {\n if (this.#root === this) return true\n if (this.#parent?.type === '!') return true\n if (!this.#parent?.isEnd()) return false\n if (!this.type) return this.#parent?.isEnd()\n // if not root, it'll always have a parent\n /* c8 ignore start */\n const pl = this.#parent ? this.#parent.#parts.length : 0\n /* c8 ignore stop */\n return this.#parentIndex === pl - 1\n }\n\n copyIn(part: AST | string) {\n if (typeof part === 'string') this.push(part)\n else this.push(part.clone(this))\n }\n\n clone(parent: AST) {\n const c = new AST(this.type, parent)\n for (const p of this.#parts) {\n c.copyIn(p)\n }\n return c\n }\n\n static #parseAST(\n str: string,\n ast: AST,\n pos: number,\n opt: MinimatchOptions,\n extDepth: number,\n ): number {\n const maxDepth = opt.maxExtglobRecursion ?? 2\n let escaping = false\n let inBrace = false\n let braceStart = -1\n let braceNeg = false\n if (ast.type === null) {\n // outside of a extglob, append until we find a start\n let i = pos\n let acc = ''\n while (i < str.length) {\n const c = str.charAt(i++)\n // still accumulate escapes at this point, but we do ignore\n // starts that are escaped\n if (escaping || c === '\\\\') {\n escaping = !escaping\n acc += c\n continue\n }\n\n if (inBrace) {\n if (i === braceStart + 1) {\n if (c === '^' || c === '!') {\n braceNeg = true\n }\n } else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {\n inBrace = false\n }\n acc += c\n continue\n } else if (c === '[') {\n inBrace = true\n braceStart = i\n braceNeg = false\n acc += c\n continue\n }\n\n // we don't have to check for adoption here, because that's\n // done at the other recursion point.\n const doRecurse =\n !opt.noext &&\n isExtglobType(c) &&\n str.charAt(i) === '(' &&\n extDepth <= maxDepth\n if (doRecurse) {\n ast.push(acc)\n acc = ''\n const ext = new AST(c, ast)\n i = AST.#parseAST(str, ext, i, opt, extDepth + 1)\n ast.push(ext)\n continue\n }\n acc += c\n }\n ast.push(acc)\n return i\n }\n\n // some kind of extglob, pos is at the (\n // find the next | or )\n let i = pos + 1\n let part = new AST(null, ast)\n const parts: AST[] = []\n let acc = ''\n while (i < str.length) {\n const c = str.charAt(i++)\n // still accumulate escapes at this point, but we do ignore\n // starts that are escaped\n if (escaping || c === '\\\\') {\n escaping = !escaping\n acc += c\n continue\n }\n\n if (inBrace) {\n if (i === braceStart + 1) {\n if (c === '^' || c === '!') {\n braceNeg = true\n }\n } else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {\n inBrace = false\n }\n acc += c\n continue\n } else if (c === '[') {\n inBrace = true\n braceStart = i\n braceNeg = false\n acc += c\n continue\n }\n\n const doRecurse =\n !opt.noext &&\n isExtglobType(c) &&\n str.charAt(i) === '(' &&\n /* c8 ignore start - the maxDepth is sufficient here */\n (extDepth <= maxDepth || (ast && ast.#canAdoptType(c)))\n /* c8 ignore stop */\n if (doRecurse) {\n const depthAdd = ast && ast.#canAdoptType(c) ? 0 : 1\n part.push(acc)\n acc = ''\n const ext = new AST(c, part)\n part.push(ext)\n i = AST.#parseAST(str, ext, i, opt, extDepth + depthAdd)\n continue\n }\n if (c === '|') {\n part.push(acc)\n acc = ''\n parts.push(part)\n part = new AST(null, ast)\n continue\n }\n if (c === ')') {\n if (acc === '' && ast.#parts.length === 0) {\n ast.#emptyExt = true\n }\n part.push(acc)\n acc = ''\n ast.push(...parts, part)\n return i\n }\n acc += c\n }\n\n // unfinished extglob\n // if we got here, it was a malformed extglob! not an extglob, but\n // maybe something else in there.\n ast.type = null\n ast.#hasMagic = undefined\n ast.#parts = [str.substring(pos - 1)]\n return i\n }\n\n #canAdoptWithSpace(child?: AST | string): child is AST & {\n type: null\n parts: [AST & { type: ExtglobType }]\n } {\n return this.#canAdopt(child, adoptionWithSpaceMap)\n }\n\n #canAdopt(\n child?: AST | string,\n map: Map<ExtglobType, ExtglobType[]> = adoptionMap,\n ): child is AST & {\n type: null\n parts: [AST & { type: ExtglobType }]\n } {\n if (\n !child ||\n typeof child !== 'object' ||\n child.type !== null ||\n child.#parts.length !== 1 ||\n this.type === null\n ) {\n return false\n }\n const gc = child.#parts[0]\n if (!gc || typeof gc !== 'object' || gc.type === null) {\n return false\n }\n return (this as AST & { type: ExtglobType }).#canAdoptType(\n gc.type,\n map,\n )\n }\n #canAdoptType(\n c: string,\n map: Map<ExtglobType, ExtglobType[]> = adoptionAnyMap,\n ): c is ExtglobType {\n return !!map.get(this.type as ExtglobType)?.includes(c as ExtglobType)\n }\n\n #adoptWithSpace(\n this: AST & { type: ExtglobType },\n child: AST & {\n type: null\n },\n index: number,\n ) {\n const gc = child.#parts[0] as AST & { type: ExtglobType }\n const blank = new AST(null, gc, this.options)\n blank.#parts.push('')\n gc.push(blank)\n this.#adopt(child, index)\n }\n\n #adopt(\n child: AST & {\n type: null\n },\n index: number,\n ) {\n const gc = child.#parts[0] as AST & { type: ExtglobType }\n this.#parts.splice(index, 1, ...gc.#parts)\n for (const p of gc.#parts) {\n if (typeof p === 'object') p.#parent = this\n }\n this.#toString = undefined\n }\n\n #canUsurpType(c: string): boolean {\n const m = usurpMap.get(this.type as ExtglobType)\n return !!(m?.has(c as ExtglobType))\n }\n\n #canUsurp (\n child?: AST | string,\n ): child is AST & {\n type: null\n parts: [AST & { type: ExtglobType }]\n } {\n if (\n !child ||\n typeof child !== 'object' ||\n child.type !== null ||\n child.#parts.length !== 1 ||\n this.type === null ||\n this.#parts.length !== 1\n ) {\n return false\n }\n const gc = child.#parts[0]\n if (!gc || typeof gc !== 'object' || gc.type === null) {\n return false\n }\n return (this as AST & { type: ExtglobType }).#canUsurpType(gc.type)\n }\n\n #usurp(this: AST & { type: ExtglobType }, child: AST & { type: null }) {\n const m = usurpMap.get(this.type as ExtglobType)\n const gc = child.#parts[0] as AST & { type: ExtglobType }\n const nt = m?.get(gc.type)\n /* c8 ignore start - impossible */\n if (!nt) return false\n /* c8 ignore stop */\n this.#parts = gc.#parts\n for (const p of this.#parts) {\n if (typeof p === 'object') {\n p.#parent = this\n }\n }\n this.type = nt\n this.#toString = undefined\n this.#emptyExt = false\n }\n\n static fromGlob(pattern: string, options: MinimatchOptions = {}) {\n const ast = new AST(null, undefined, options)\n AST.#parseAST(pattern, ast, 0, options, 0)\n return ast\n }\n\n // returns the regular expression if there's magic, or the unescaped\n // string if not.\n toMMPattern(): MMRegExp | string {\n // should only be called on root\n /* c8 ignore start */\n if (this !== this.#root) return this.#root.toMMPattern()\n /* c8 ignore stop */\n const glob = this.toString()\n const [re, body, hasMagic, uflag] = this.toRegExpSource()\n // if we're in nocase mode, and not nocaseMagicOnly, then we do\n // still need a regular expression if we have to case-insensitively\n // match capital/lowercase characters.\n const anyMagic =\n hasMagic ||\n this.#hasMagic ||\n (this.#options.nocase &&\n !this.#options.nocaseMagicOnly &&\n glob.toUpperCase() !== glob.toLowerCase())\n if (!anyMagic) {\n return body\n }\n\n const flags = (this.#options.nocase ? 'i' : '') + (uflag ? 'u' : '')\n return Object.assign(new RegExp(`^${re}$`, flags), {\n _src: re,\n _glob: glob,\n })\n }\n\n get options() {\n return this.#options\n }\n\n // returns the string match, the regexp source, whether there's magic\n // in the regexp (so a regular expression is required) and whether or\n // not the uflag is needed for the regular expression (for posix classes)\n // TODO: instead of injecting the start/end at this point, just return\n // the BODY of the regexp, along with the start/end portions suitable\n // for binding the start/end in either a joined full-path makeRe context\n // (where we bind to (^|/), or a standalone matchPart context (where\n // we bind to ^, and not /). Otherwise slashes get duped!\n //\n // In part-matching mode, the start is:\n // - if not isStart: nothing\n // - if traversal possible, but not allowed: ^(?!\\.\\.?$)\n // - if dots allowed or not possible: ^\n // - if dots possible and not allowed: ^(?!\\.)\n // end is:\n // - if not isEnd(): nothing\n // - else: $\n //\n // In full-path matching mode, we put the slash at the START of the\n // pattern, so start is:\n // - if first pattern: same as part-matching mode\n // - if not isStart(): nothing\n // - if traversal possible, but not allowed: /(?!\\.\\.?(?:$|/))\n // - if dots allowed or not possible: /\n // - if dots possible and not allowed: /(?!\\.)\n // end is:\n // - if last pattern, same as part-matching mode\n // - else nothing\n //\n // Always put the (?:$|/) on negated tails, though, because that has to be\n // there to bind the end of the negated pattern portion, and it's easier to\n // just stick it in now rather than try to inject it later in the middle of\n // the pattern.\n //\n // We can just always return the same end, and leave it up to the caller\n // to know whether it's going to be used joined or in parts.\n // And, if the start is adjusted slightly, can do the same there:\n // - if not isStart: nothing\n // - if traversal possible, but not allowed: (?:/|^)(?!\\.\\.?$)\n // - if dots allowed or not possible: (?:/|^)\n // - if dots possible and not allowed: (?:/|^)(?!\\.)\n //\n // But it's better to have a simpler binding without a conditional, for\n // performance, so probably better to return both start options.\n //\n // Then the caller just ignores the end if it's not the first pattern,\n // and the start always gets applied.\n //\n // But that's always going to be $ if it's the ending pattern, or nothing,\n // so the caller can just attach $ at the end of the pattern when building.\n //\n // So the todo is:\n // - better detect what kind of start is needed\n // - return both flavors of starting pattern\n // - attach $ at the end of the pattern when creating the actual RegExp\n //\n // Ah, but wait, no, that all only applies to the root when the first pattern\n // is not an extglob. If the first pattern IS an extglob, then we need all\n // that dot prevention biz to live in the extglob portions, because eg\n // +(*|.x*) can match .xy but not .yx.\n //\n // So, return the two flavors if it's #root and the first child is not an\n // AST, otherwise leave it to the child AST to handle it, and there,\n // use the (?:^|/) style of start binding.\n //\n // Even simplified further:\n // - Since the start for a join is eg /(?!\\.) and the start for a part\n // is ^(?!\\.), we can just prepend (?!\\.) to the pattern (either root\n // or start or whatever) and prepend ^ or / at the Regexp construction.\n toRegExpSource(\n allowDot?: boolean,\n ): [re: string, body: string, hasMagic: boolean, uflag: boolean] {\n const dot = allowDot ?? !!this.#options.dot\n if (this.#root === this) {\n this.#flatten()\n this.#fillNegs()\n }\n if (!isExtglobAST(this)) {\n const noEmpty =\n this.isStart() &&\n this.isEnd() &&\n !this.#parts.some(s => typeof s !== 'string')\n const src = this.#parts\n .map(p => {\n const [re, _, hasMagic, uflag] =\n typeof p === 'string' ?\n AST.#parseGlob(p, this.#hasMagic, noEmpty)\n : p.toRegExpSource(allowDot)\n this.#hasMagic = this.#hasMagic || hasMagic\n this.#uflag = this.#uflag || uflag\n return re\n })\n .join('')\n\n let start = ''\n if (this.isStart()) {\n if (typeof this.#parts[0] === 'string') {\n // this is the string that will match the start of the pattern,\n // so we need to protect against dots and such.\n\n // '.' and '..' cannot match unless the pattern is that exactly,\n // even if it starts with . or dot:true is set.\n const dotTravAllowed =\n this.#parts.length === 1 && justDots.has(this.#parts[0])\n if (!dotTravAllowed) {\n const aps = addPatternStart\n // check if we have a possibility of matching . or ..,\n // and prevent that.\n const needNoTrav =\n // dots are allowed, and the pattern starts with [ or .\n (dot && aps.has(src.charAt(0))) ||\n // the pattern starts with \\., and then [ or .\n (src.startsWith('\\\\.') && aps.has(src.charAt(2))) ||\n // the pattern starts with \\.\\., and then [ or .\n (src.startsWith('\\\\.\\\\.') && aps.has(src.charAt(4)))\n // no need to prevent dots if it can't match a dot, or if a\n // sub-pattern will be preventing it anyway.\n const needNoDot = !dot && !allowDot && aps.has(src.charAt(0))\n\n start =\n needNoTrav ? startNoTraversal\n : needNoDot ? startNoDot\n : ''\n }\n }\n }\n\n // append the \"end of path portion\" pattern to negation tails\n let end = ''\n if (\n this.isEnd() &&\n this.#root.#filledNegs &&\n this.#parent?.type === '!'\n ) {\n end = '(?:$|\\\\/)'\n }\n const final = start + src + end\n return [\n final,\n unescape(src),\n (this.#hasMagic = !!this.#hasMagic),\n this.#uflag,\n ]\n }\n\n // We need to calculate the body *twice* if it's a repeat pattern\n // at the start, once in nodot mode, then again in dot mode, so a\n // pattern like *(?) can match 'x.y'\n\n const repeated = this.type === '*' || this.type === '+'\n // some kind of extglob\n const start = this.type === '!' ? '(?:(?!(?:' : '(?:'\n let body = this.#partsToRegExp(dot)\n\n if (this.isStart() && this.isEnd() && !body && this.type !== '!') {\n // invalid extglob, has to at least be *something* present, if it's\n // the entire path portion.\n const s = this.toString()\n const me = this as AST\n me.#parts = [s]\n me.type = null\n me.#hasMagic = undefined\n return [s, unescape(this.toString()), false, false]\n }\n\n let bodyDotAllowed =\n !repeated || allowDot || dot || !startNoDot ?\n ''\n : this.#partsToRegExp(true)\n if (bodyDotAllowed === body) {\n bodyDotAllowed = ''\n }\n if (bodyDotAllowed) {\n body = `(?:${body})(?:${bodyDotAllowed})*?`\n }\n\n // an empty !() is exactly equivalent to a starNoEmpty\n let final = ''\n if (this.type === '!' && this.#emptyExt) {\n final = (this.isStart() && !dot ? startNoDot : '') + starNoEmpty\n } else {\n const close =\n this.type === '!' ?\n // !() must match something,but !(x) can match ''\n '))' +\n (this.isStart() && !dot && !allowDot ? startNoDot : '') +\n star +\n ')'\n : this.type === '@' ? ')'\n : this.type === '?' ? ')?'\n : this.type === '+' && bodyDotAllowed ? ')'\n : this.type === '*' && bodyDotAllowed ? `)?`\n : `)${this.type}`\n final = start + body + close\n }\n return [\n final,\n unescape(body),\n (this.#hasMagic = !!this.#hasMagic),\n this.#uflag,\n ]\n }\n\n #flatten() {\n if (!isExtglobAST(this)) {\n for (const p of this.#parts) {\n if (typeof p === 'object') {\n p.#flatten()\n }\n }\n } else {\n // do up to 10 passes to flatten as much as possible\n let iterations = 0\n let done = false\n do {\n done = true\n for (let i = 0; i < this.#parts.length; i++) {\n const c = this.#parts[i]\n if (typeof c === 'object') {\n c.#flatten()\n if (this.#canAdopt(c)) {\n done = false\n this.#adopt(c, i)\n } else if (this.#canAdoptWithSpace(c)) {\n done = false\n this.#adoptWithSpace(c, i)\n } else if (this.#canUsurp(c)) {\n done = false\n this.#usurp(c)\n }\n }\n }\n } while (!done && ++iterations < 10)\n }\n this.#toString = undefined\n }\n\n #partsToRegExp(this: AST & { type: ExtglobType }, dot: boolean) {\n return this.#parts\n .map(p => {\n // extglob ASTs should only contain parent ASTs\n /* c8 ignore start */\n if (typeof p === 'string') {\n throw new Error('string type in extglob ast??')\n }\n /* c8 ignore stop */\n // can ignore hasMagic, because extglobs are already always magic\n const [re, _, _hasMagic, uflag] = p.toRegExpSource(dot)\n this.#uflag = this.#uflag || uflag\n return re\n })\n .filter(p => !(this.isStart() && this.isEnd()) || !!p)\n .join('|')\n }\n\n static #parseGlob(\n glob: string,\n hasMagic: boolean | undefined,\n noEmpty: boolean = false,\n ): [re: string, body: string, hasMagic: boolean, uflag: boolean] {\n let escaping = false\n let re = ''\n let uflag = false\n // multiple stars that aren't globstars coalesce into one *\n let inStar = false\n for (let i = 0; i < glob.length; i++) {\n const c = glob.charAt(i)\n if (escaping) {\n escaping = false\n re += (reSpecials.has(c) ? '\\\\' : '') + c\n continue\n }\n if (c === '*') {\n if (inStar) continue\n inStar = true\n re += noEmpty && /^[*]+$/.test(glob) ? starNoEmpty : star\n hasMagic = true\n continue\n } else {\n inStar = false\n }\n if (c === '\\\\') {\n if (i === glob.length - 1) {\n re += '\\\\\\\\'\n } else {\n escaping = true\n }\n continue\n }\n if (c === '[') {\n const [src, needUflag, consumed, magic] = parseClass(glob, i)\n if (consumed) {\n re += src\n uflag = uflag || needUflag\n i += consumed - 1\n hasMagic = hasMagic || magic\n continue\n }\n }\n if (c === '?') {\n re += qmark\n hasMagic = true\n continue\n }\n re += regExpEscape(c)\n }\n return [re, unescape(glob), !!hasMagic, uflag]\n }\n}\n"]} \ No newline at end of file diff --git a/deps/minimatch/dist/commonjs/brace-expressions.d.ts.map b/deps/minimatch/dist/commonjs/brace-expressions.d.ts.map index 3293e23708527c..09b4c11060de78 100644 --- a/deps/minimatch/dist/commonjs/brace-expressions.d.ts.map +++ b/deps/minimatch/dist/commonjs/brace-expressions.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"brace-expressions.d.ts","sourceRoot":"","sources":["../../src/brace-expressions.ts"],"names":[],"mappings":"AA+BA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,EAAE,MAAM;IACX,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,OAAO;CAClB,CAAA;AAQD,eAAO,MAAM,UAAU,GACrB,MAAM,MAAM,EACZ,UAAU,MAAM,KACf,gBA6HF,CAAA"} \ No newline at end of file +{"version":3,"file":"brace-expressions.d.ts","sourceRoot":"","sources":["../../src/brace-expressions.ts"],"names":[],"mappings":"AAgCA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,EAAE,MAAM;IACX,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,OAAO;CAClB,CAAA;AAQD,eAAO,MAAM,UAAU,GACrB,MAAM,MAAM,EACZ,UAAU,MAAM,KACf,gBA2HF,CAAA"} \ No newline at end of file diff --git a/deps/minimatch/dist/commonjs/brace-expressions.js b/deps/minimatch/dist/commonjs/brace-expressions.js index 0e13eefc4cfee2..2b7b03712b874e 100644 --- a/deps/minimatch/dist/commonjs/brace-expressions.js +++ b/deps/minimatch/dist/commonjs/brace-expressions.js @@ -141,10 +141,8 @@ const parseClass = (glob, position) => { } const sranges = '[' + (negate ? '^' : '') + rangesToString(ranges) + ']'; const snegs = '[' + (negate ? '' : '^') + rangesToString(negs) + ']'; - const comb = ranges.length && negs.length - ? '(' + sranges + '|' + snegs + ')' - : ranges.length - ? sranges + const comb = ranges.length && negs.length ? '(' + sranges + '|' + snegs + ')' + : ranges.length ? sranges : snegs; return [comb, uflag, endPos - pos, true]; }; diff --git a/deps/minimatch/dist/commonjs/brace-expressions.js.map b/deps/minimatch/dist/commonjs/brace-expressions.js.map index 4fab2f6171b8ce..3cc3b343b530fd 100644 --- a/deps/minimatch/dist/commonjs/brace-expressions.js.map +++ b/deps/minimatch/dist/commonjs/brace-expressions.js.map @@ -1 +1 @@ -{"version":3,"file":"brace-expressions.js","sourceRoot":"","sources":["../../src/brace-expressions.ts"],"names":[],"mappings":"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","sourcesContent":["// translate the various posix character classes into unicode properties\n// this works across all unicode locales\n\n// { <posix class>: [<translation>, /u flag required, negated]\nconst posixClasses: { [k: string]: [e: string, u: boolean, n?: boolean] } = {\n '[:alnum:]': ['\\\\p{L}\\\\p{Nl}\\\\p{Nd}', true],\n '[:alpha:]': ['\\\\p{L}\\\\p{Nl}', true],\n '[:ascii:]': ['\\\\x' + '00-\\\\x' + '7f', false],\n '[:blank:]': ['\\\\p{Zs}\\\\t', true],\n '[:cntrl:]': ['\\\\p{Cc}', true],\n '[:digit:]': ['\\\\p{Nd}', true],\n '[:graph:]': ['\\\\p{Z}\\\\p{C}', true, true],\n '[:lower:]': ['\\\\p{Ll}', true],\n '[:print:]': ['\\\\p{C}', true],\n '[:punct:]': ['\\\\p{P}', true],\n '[:space:]': ['\\\\p{Z}\\\\t\\\\r\\\\n\\\\v\\\\f', true],\n '[:upper:]': ['\\\\p{Lu}', true],\n '[:word:]': ['\\\\p{L}\\\\p{Nl}\\\\p{Nd}\\\\p{Pc}', true],\n '[:xdigit:]': ['A-Fa-f0-9', false],\n}\n\n// only need to escape a few things inside of brace expressions\n// escapes: [ \\ ] -\nconst braceEscape = (s: string) => s.replace(/[[\\]\\\\-]/g, '\\\\$&')\n// escape all regexp magic characters\nconst regexpEscape = (s: string) =>\n s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\n// everything has already been escaped, we just have to join\nconst rangesToString = (ranges: string[]): string => ranges.join('')\n\nexport type ParseClassResult = [\n src: string,\n uFlag: boolean,\n consumed: number,\n hasMagic: boolean,\n]\n\n// takes a glob string at a posix brace expression, and returns\n// an equivalent regular expression source, and boolean indicating\n// whether the /u flag needs to be applied, and the number of chars\n// consumed to parse the character class.\n// This also removes out of order ranges, and returns ($.) if the\n// entire class just no good.\nexport const parseClass = (\n glob: string,\n position: number,\n): ParseClassResult => {\n const pos = position\n /* c8 ignore start */\n if (glob.charAt(pos) !== '[') {\n throw new Error('not in a brace expression')\n }\n /* c8 ignore stop */\n const ranges: string[] = []\n const negs: string[] = []\n\n let i = pos + 1\n let sawStart = false\n let uflag = false\n let escaping = false\n let negate = false\n let endPos = pos\n let rangeStart = ''\n WHILE: while (i < glob.length) {\n const c = glob.charAt(i)\n if ((c === '!' || c === '^') && i === pos + 1) {\n negate = true\n i++\n continue\n }\n\n if (c === ']' && sawStart && !escaping) {\n endPos = i + 1\n break\n }\n\n sawStart = true\n if (c === '\\\\') {\n if (!escaping) {\n escaping = true\n i++\n continue\n }\n // escaped \\ char, fall through and treat like normal char\n }\n if (c === '[' && !escaping) {\n // either a posix class, a collation equivalent, or just a [\n for (const [cls, [unip, u, neg]] of Object.entries(posixClasses)) {\n if (glob.startsWith(cls, i)) {\n // invalid, [a-[] is fine, but not [a-[:alpha]]\n if (rangeStart) {\n return ['$.', false, glob.length - pos, true]\n }\n i += cls.length\n if (neg) negs.push(unip)\n else ranges.push(unip)\n uflag = uflag || u\n continue WHILE\n }\n }\n }\n\n // now it's just a normal character, effectively\n escaping = false\n if (rangeStart) {\n // throw this range away if it's not valid, but others\n // can still match.\n if (c > rangeStart) {\n ranges.push(braceEscape(rangeStart) + '-' + braceEscape(c))\n } else if (c === rangeStart) {\n ranges.push(braceEscape(c))\n }\n rangeStart = ''\n i++\n continue\n }\n\n // now might be the start of a range.\n // can be either c-d or c-] or c<more...>] or c] at this point\n if (glob.startsWith('-]', i + 1)) {\n ranges.push(braceEscape(c + '-'))\n i += 2\n continue\n }\n if (glob.startsWith('-', i + 1)) {\n rangeStart = c\n i += 2\n continue\n }\n\n // not the start of a range, just a single character\n ranges.push(braceEscape(c))\n i++\n }\n\n if (endPos < i) {\n // didn't see the end of the class, not a valid class,\n // but might still be valid as a literal match.\n return ['', false, 0, false]\n }\n\n // if we got no ranges and no negates, then we have a range that\n // cannot possibly match anything, and that poisons the whole glob\n if (!ranges.length && !negs.length) {\n return ['$.', false, glob.length - pos, true]\n }\n\n // if we got one positive range, and it's a single character, then that's\n // not actually a magic pattern, it's just that one literal character.\n // we should not treat that as \"magic\", we should just return the literal\n // character. [_] is a perfectly valid way to escape glob magic chars.\n if (\n negs.length === 0 &&\n ranges.length === 1 &&\n /^\\\\?.$/.test(ranges[0]) &&\n !negate\n ) {\n const r = ranges[0].length === 2 ? ranges[0].slice(-1) : ranges[0]\n return [regexpEscape(r), false, endPos - pos, false]\n }\n\n const sranges = '[' + (negate ? '^' : '') + rangesToString(ranges) + ']'\n const snegs = '[' + (negate ? '' : '^') + rangesToString(negs) + ']'\n const comb =\n ranges.length && negs.length\n ? '(' + sranges + '|' + snegs + ')'\n : ranges.length\n ? sranges\n : snegs\n\n return [comb, uflag, endPos - pos, true]\n}\n"]} \ No newline at end of file +{"version":3,"file":"brace-expressions.js","sourceRoot":"","sources":["../../src/brace-expressions.ts"],"names":[],"mappings":"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","sourcesContent":["// translate the various posix character classes into unicode properties\n// this works across all unicode locales\n\n// { <posix class>: [<translation>, /u flag required, negated]\nconst posixClasses: { [k: string]: [e: string, u: boolean, n?: boolean] } =\n {\n '[:alnum:]': ['\\\\p{L}\\\\p{Nl}\\\\p{Nd}', true],\n '[:alpha:]': ['\\\\p{L}\\\\p{Nl}', true],\n '[:ascii:]': ['\\\\x' + '00-\\\\x' + '7f', false],\n '[:blank:]': ['\\\\p{Zs}\\\\t', true],\n '[:cntrl:]': ['\\\\p{Cc}', true],\n '[:digit:]': ['\\\\p{Nd}', true],\n '[:graph:]': ['\\\\p{Z}\\\\p{C}', true, true],\n '[:lower:]': ['\\\\p{Ll}', true],\n '[:print:]': ['\\\\p{C}', true],\n '[:punct:]': ['\\\\p{P}', true],\n '[:space:]': ['\\\\p{Z}\\\\t\\\\r\\\\n\\\\v\\\\f', true],\n '[:upper:]': ['\\\\p{Lu}', true],\n '[:word:]': ['\\\\p{L}\\\\p{Nl}\\\\p{Nd}\\\\p{Pc}', true],\n '[:xdigit:]': ['A-Fa-f0-9', false],\n }\n\n// only need to escape a few things inside of brace expressions\n// escapes: [ \\ ] -\nconst braceEscape = (s: string) => s.replace(/[[\\]\\\\-]/g, '\\\\$&')\n// escape all regexp magic characters\nconst regexpEscape = (s: string) =>\n s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\n// everything has already been escaped, we just have to join\nconst rangesToString = (ranges: string[]): string => ranges.join('')\n\nexport type ParseClassResult = [\n src: string,\n uFlag: boolean,\n consumed: number,\n hasMagic: boolean,\n]\n\n// takes a glob string at a posix brace expression, and returns\n// an equivalent regular expression source, and boolean indicating\n// whether the /u flag needs to be applied, and the number of chars\n// consumed to parse the character class.\n// This also removes out of order ranges, and returns ($.) if the\n// entire class just no good.\nexport const parseClass = (\n glob: string,\n position: number,\n): ParseClassResult => {\n const pos = position\n /* c8 ignore start */\n if (glob.charAt(pos) !== '[') {\n throw new Error('not in a brace expression')\n }\n /* c8 ignore stop */\n const ranges: string[] = []\n const negs: string[] = []\n\n let i = pos + 1\n let sawStart = false\n let uflag = false\n let escaping = false\n let negate = false\n let endPos = pos\n let rangeStart = ''\n WHILE: while (i < glob.length) {\n const c = glob.charAt(i)\n if ((c === '!' || c === '^') && i === pos + 1) {\n negate = true\n i++\n continue\n }\n\n if (c === ']' && sawStart && !escaping) {\n endPos = i + 1\n break\n }\n\n sawStart = true\n if (c === '\\\\') {\n if (!escaping) {\n escaping = true\n i++\n continue\n }\n // escaped \\ char, fall through and treat like normal char\n }\n if (c === '[' && !escaping) {\n // either a posix class, a collation equivalent, or just a [\n for (const [cls, [unip, u, neg]] of Object.entries(posixClasses)) {\n if (glob.startsWith(cls, i)) {\n // invalid, [a-[] is fine, but not [a-[:alpha]]\n if (rangeStart) {\n return ['$.', false, glob.length - pos, true]\n }\n i += cls.length\n if (neg) negs.push(unip)\n else ranges.push(unip)\n uflag = uflag || u\n continue WHILE\n }\n }\n }\n\n // now it's just a normal character, effectively\n escaping = false\n if (rangeStart) {\n // throw this range away if it's not valid, but others\n // can still match.\n if (c > rangeStart) {\n ranges.push(braceEscape(rangeStart) + '-' + braceEscape(c))\n } else if (c === rangeStart) {\n ranges.push(braceEscape(c))\n }\n rangeStart = ''\n i++\n continue\n }\n\n // now might be the start of a range.\n // can be either c-d or c-] or c<more...>] or c] at this point\n if (glob.startsWith('-]', i + 1)) {\n ranges.push(braceEscape(c + '-'))\n i += 2\n continue\n }\n if (glob.startsWith('-', i + 1)) {\n rangeStart = c\n i += 2\n continue\n }\n\n // not the start of a range, just a single character\n ranges.push(braceEscape(c))\n i++\n }\n\n if (endPos < i) {\n // didn't see the end of the class, not a valid class,\n // but might still be valid as a literal match.\n return ['', false, 0, false]\n }\n\n // if we got no ranges and no negates, then we have a range that\n // cannot possibly match anything, and that poisons the whole glob\n if (!ranges.length && !negs.length) {\n return ['$.', false, glob.length - pos, true]\n }\n\n // if we got one positive range, and it's a single character, then that's\n // not actually a magic pattern, it's just that one literal character.\n // we should not treat that as \"magic\", we should just return the literal\n // character. [_] is a perfectly valid way to escape glob magic chars.\n if (\n negs.length === 0 &&\n ranges.length === 1 &&\n /^\\\\?.$/.test(ranges[0]) &&\n !negate\n ) {\n const r = ranges[0].length === 2 ? ranges[0].slice(-1) : ranges[0]\n return [regexpEscape(r), false, endPos - pos, false]\n }\n\n const sranges = '[' + (negate ? '^' : '') + rangesToString(ranges) + ']'\n const snegs = '[' + (negate ? '' : '^') + rangesToString(negs) + ']'\n const comb =\n ranges.length && negs.length ? '(' + sranges + '|' + snegs + ')'\n : ranges.length ? sranges\n : snegs\n\n return [comb, uflag, endPos - pos, true]\n}\n"]} \ No newline at end of file diff --git a/deps/minimatch/dist/commonjs/escape.js b/deps/minimatch/dist/commonjs/escape.js index 6fb634fb41033c..83a713a2550770 100644 --- a/deps/minimatch/dist/commonjs/escape.js +++ b/deps/minimatch/dist/commonjs/escape.js @@ -18,12 +18,12 @@ const escape = (s, { windowsPathsNoEscape = false, magicalBraces = false, } = {} // that make those magic, and escaping ! as [!] isn't valid, // because [!]] is a valid glob class meaning not ']'. if (magicalBraces) { - return windowsPathsNoEscape - ? s.replace(/[?*()[\]{}]/g, '[$&]') + return windowsPathsNoEscape ? + s.replace(/[?*()[\]{}]/g, '[$&]') : s.replace(/[?*()[\]\\{}]/g, '\\$&'); } - return windowsPathsNoEscape - ? s.replace(/[?*()[\]]/g, '[$&]') + return windowsPathsNoEscape ? + s.replace(/[?*()[\]]/g, '[$&]') : s.replace(/[?*()[\]\\]/g, '\\$&'); }; exports.escape = escape; diff --git a/deps/minimatch/dist/commonjs/escape.js.map b/deps/minimatch/dist/commonjs/escape.js.map index bcc96bf499be98..442faeda338922 100644 --- a/deps/minimatch/dist/commonjs/escape.js.map +++ b/deps/minimatch/dist/commonjs/escape.js.map @@ -1 +1 @@ -{"version":3,"file":"escape.js","sourceRoot":"","sources":["../../src/escape.ts"],"names":[],"mappings":";;;AAEA;;;;;;;;;;;GAWG;AACI,MAAM,MAAM,GAAG,CACpB,CAAS,EACT,EACE,oBAAoB,GAAG,KAAK,EAC5B,aAAa,GAAG,KAAK,MAC+C,EAAE,EACxE,EAAE;IACF,wDAAwD;IACxD,4DAA4D;IAC5D,sDAAsD;IACtD,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,oBAAoB;YACzB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC;YACnC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAA;IACzC,CAAC;IACD,OAAO,oBAAoB;QACzB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC;QACjC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC,CAAA;AACvC,CAAC,CAAA;AAlBY,QAAA,MAAM,UAkBlB","sourcesContent":["import { MinimatchOptions } from './index.js'\n\n/**\n * Escape all magic characters in a glob pattern.\n *\n * If the {@link MinimatchOptions.windowsPathsNoEscape}\n * option is used, then characters are escaped by wrapping in `[]`, because\n * a magic character wrapped in a character class can only be satisfied by\n * that exact character. In this mode, `\\` is _not_ escaped, because it is\n * not interpreted as a magic character, but instead as a path separator.\n *\n * If the {@link MinimatchOptions.magicalBraces} option is used,\n * then braces (`{` and `}`) will be escaped.\n */\nexport const escape = (\n s: string,\n {\n windowsPathsNoEscape = false,\n magicalBraces = false,\n }: Pick<MinimatchOptions, 'windowsPathsNoEscape' | 'magicalBraces'> = {},\n) => {\n // don't need to escape +@! because we escape the parens\n // that make those magic, and escaping ! as [!] isn't valid,\n // because [!]] is a valid glob class meaning not ']'.\n if (magicalBraces) {\n return windowsPathsNoEscape\n ? s.replace(/[?*()[\\]{}]/g, '[$&]')\n : s.replace(/[?*()[\\]\\\\{}]/g, '\\\\$&')\n }\n return windowsPathsNoEscape\n ? s.replace(/[?*()[\\]]/g, '[$&]')\n : s.replace(/[?*()[\\]\\\\]/g, '\\\\$&')\n}\n"]} \ No newline at end of file +{"version":3,"file":"escape.js","sourceRoot":"","sources":["../../src/escape.ts"],"names":[],"mappings":";;;AAEA;;;;;;;;;;;GAWG;AACI,MAAM,MAAM,GAAG,CACpB,CAAS,EACT,EACE,oBAAoB,GAAG,KAAK,EAC5B,aAAa,GAAG,KAAK,MAC+C,EAAE,EACxE,EAAE;IACF,wDAAwD;IACxD,4DAA4D;IAC5D,sDAAsD;IACtD,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,oBAAoB,CAAC,CAAC;YACzB,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC;YACnC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAA;IACzC,CAAC;IACD,OAAO,oBAAoB,CAAC,CAAC;QACzB,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC;QACjC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC,CAAA;AACvC,CAAC,CAAA;AAlBY,QAAA,MAAM,UAkBlB","sourcesContent":["import { MinimatchOptions } from './index.js'\n\n/**\n * Escape all magic characters in a glob pattern.\n *\n * If the {@link MinimatchOptions.windowsPathsNoEscape}\n * option is used, then characters are escaped by wrapping in `[]`, because\n * a magic character wrapped in a character class can only be satisfied by\n * that exact character. In this mode, `\\` is _not_ escaped, because it is\n * not interpreted as a magic character, but instead as a path separator.\n *\n * If the {@link MinimatchOptions.magicalBraces} option is used,\n * then braces (`{` and `}`) will be escaped.\n */\nexport const escape = (\n s: string,\n {\n windowsPathsNoEscape = false,\n magicalBraces = false,\n }: Pick<MinimatchOptions, 'windowsPathsNoEscape' | 'magicalBraces'> = {},\n) => {\n // don't need to escape +@! because we escape the parens\n // that make those magic, and escaping ! as [!] isn't valid,\n // because [!]] is a valid glob class meaning not ']'.\n if (magicalBraces) {\n return windowsPathsNoEscape ?\n s.replace(/[?*()[\\]{}]/g, '[$&]')\n : s.replace(/[?*()[\\]\\\\{}]/g, '\\\\$&')\n }\n return windowsPathsNoEscape ?\n s.replace(/[?*()[\\]]/g, '[$&]')\n : s.replace(/[?*()[\\]\\\\]/g, '\\\\$&')\n}\n"]} \ No newline at end of file diff --git a/deps/minimatch/dist/commonjs/index.d.ts b/deps/minimatch/dist/commonjs/index.d.ts index 968eb143d868b2..137bd803690752 100644 --- a/deps/minimatch/dist/commonjs/index.d.ts +++ b/deps/minimatch/dist/commonjs/index.d.ts @@ -1,26 +1,104 @@ import { AST } from './ast.js'; export type Platform = 'aix' | 'android' | 'darwin' | 'freebsd' | 'haiku' | 'linux' | 'openbsd' | 'sunos' | 'win32' | 'cygwin' | 'netbsd'; export interface MinimatchOptions { + /** do not expand `{x,y}` style braces */ nobrace?: boolean; + /** do not treat patterns starting with `#` as a comment */ nocomment?: boolean; + /** do not treat patterns starting with `!` as a negation */ nonegate?: boolean; + /** print LOTS of debugging output */ debug?: boolean; + /** treat `**` the same as `*` */ noglobstar?: boolean; + /** do not expand extglobs like `+(a|b)` */ noext?: boolean; + /** return the pattern if nothing matches */ nonull?: boolean; + /** treat `\\` as a path separator, not an escape character */ windowsPathsNoEscape?: boolean; + /** + * inverse of {@link MinimatchOptions.windowsPathsNoEscape} + * @deprecated + */ allowWindowsEscape?: boolean; + /** + * Compare a partial path to a pattern. As long as the parts + * of the path that are present are not contradicted by the + * pattern, it will be treated as a match. This is useful in + * applications where you're walking through a folder structure, + * and don't yet have the full path, but want to ensure that you + * do not walk down paths that can never be a match. + */ partial?: boolean; + /** allow matches that start with `.` even if the pattern does not */ dot?: boolean; + /** ignore case */ nocase?: boolean; + /** ignore case only in wildcard patterns */ nocaseMagicOnly?: boolean; + /** consider braces to be "magic" for the purpose of `hasMagic` */ magicalBraces?: boolean; + /** + * If set, then patterns without slashes will be matched + * against the basename of the path if it contains slashes. + * For example, `a?b` would match the path `/xyz/123/acb`, but + * not `/xyz/acb/123`. + */ matchBase?: boolean; + /** invert the results of negated matches */ flipNegate?: boolean; + /** do not collapse multiple `/` into a single `/` */ preserveMultipleSlashes?: boolean; + /** + * A number indicating the level of optimization that should be done + * to the pattern prior to parsing and using it for matches. + */ optimizationLevel?: number; + /** operating system platform */ platform?: Platform; + /** + * When a pattern starts with a UNC path or drive letter, and in + * `nocase:true` mode, do not convert the root portions of the + * pattern into a case-insensitive regular expression, and instead + * leave them as strings. + * + * This is the default when the platform is `win32` and + * `nocase:true` is set. + */ windowsNoMagicRoot?: boolean; + /** + * max number of `{...}` patterns to expand. Default 100_000. + */ + braceExpandMax?: number; + /** + * Max number of non-adjacent `**` patterns to recursively walk down. + * + * The default of 200 is almost certainly high enough for most purposes, + * and can handle absurdly excessive patterns. + */ + maxGlobstarRecursion?: number; + /** + * Max depth to traverse for nested extglobs like `*(a|b|c)` + * + * Default is 2, which is quite low, but any higher value + * swiftly results in punishing performance impacts. Note + * that this is *not* relevant when the globstar types can + * be safely coalesced into a single set. + * + * For example, `*(a|@(b|c)|d)` would be flattened into + * `*(a|b|c|d)`. Thus, many common extglobs will retain good + * performance and never hit this limit, even if they are + * excessively deep and complicated. + * + * If the limit is hit, then the extglob characters are simply + * not parsed, and the pattern effectively switches into + * `noextglob: true` mode for the contents of that nested + * sub-pattern. This will typically _not_ result in a match, + * but is considered a valid trade-off for security and + * performance. + */ + maxExtglobRecursion?: number; } export declare const minimatch: { (p: string, pattern: string, options?: MinimatchOptions): boolean; @@ -51,6 +129,7 @@ export type MMRegExp = RegExp & { export type ParseReturnFiltered = string | MMRegExp | typeof GLOBSTAR; export type ParseReturn = ParseReturnFiltered | false; export declare class Minimatch { + #private; options: MinimatchOptions; set: ParseReturnFiltered[][]; pattern: string; @@ -67,6 +146,7 @@ export declare class Minimatch { isWindows: boolean; platform: Platform; windowsNoMagicRoot: boolean; + maxGlobstarRecursion: number; regexp: false | null | MMRegExp; constructor(pattern: string, options?: MinimatchOptions); hasMagic(): boolean; diff --git a/deps/minimatch/dist/commonjs/index.d.ts.map b/deps/minimatch/dist/commonjs/index.d.ts.map index f241c28bf9a753..1c65035ac63c5a 100644 --- a/deps/minimatch/dist/commonjs/index.d.ts.map +++ b/deps/minimatch/dist/commonjs/index.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAe,MAAM,UAAU,CAAA;AAI3C,MAAM,MAAM,QAAQ,GAChB,KAAK,GACL,SAAS,GACT,QAAQ,GACR,SAAS,GACT,OAAO,GACP,OAAO,GACP,SAAS,GACT,OAAO,GACP,OAAO,GACP,QAAQ,GACR,QAAQ,CAAA;AAEZ,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,uBAAuB,CAAC,EAAE,OAAO,CAAA;IACjC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC7B;AAED,eAAO,MAAM,SAAS;QACjB,MAAM,WACA,MAAM,YACN,gBAAgB;;;sBAyGf,MAAM,YAAW,gBAAgB,MAC1C,GAAG,MAAM;oBAOkB,gBAAgB,KAAG,OAAO,SAAS;2BAmFtD,MAAM,YACN,gBAAgB;sBA2BK,MAAM,YAAW,gBAAgB;kBAKzD,MAAM,EAAE,WACL,MAAM,YACN,gBAAgB;;;;;CA7N1B,CAAA;AAgED,MAAM,MAAM,GAAG,GAAG,IAAI,GAAG,GAAG,CAAA;AAQ5B,eAAO,MAAM,GAAG,KAAgE,CAAA;AAGhF,eAAO,MAAM,QAAQ,eAAwB,CAAA;AAmB7C,eAAO,MAAM,MAAM,GAChB,SAAS,MAAM,EAAE,UAAS,gBAAqB,MAC/C,GAAG,MAAM,YACsB,CAAA;AAMlC,eAAO,MAAM,QAAQ,GAAI,KAAK,gBAAgB,KAAG,OAAO,SAqEvD,CAAA;AAaD,eAAO,MAAM,WAAW,GACtB,SAAS,MAAM,EACf,UAAS,gBAAqB,aAY/B,CAAA;AAeD,eAAO,MAAM,MAAM,GAAI,SAAS,MAAM,EAAE,UAAS,gBAAqB,qBAC5B,CAAA;AAG1C,eAAO,MAAM,KAAK,GAChB,MAAM,MAAM,EAAE,EACd,SAAS,MAAM,EACf,UAAS,gBAAqB,aAQ/B,CAAA;AAQD,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,QAAQ,CAAA;AACrE,MAAM,MAAM,WAAW,GAAG,mBAAmB,GAAG,KAAK,CAAA;AAErD,qBAAa,SAAS;IACpB,OAAO,EAAE,gBAAgB,CAAA;IACzB,GAAG,EAAE,mBAAmB,EAAE,EAAE,CAAA;IAC5B,OAAO,EAAE,MAAM,CAAA;IAEf,oBAAoB,EAAE,OAAO,CAAA;IAC7B,QAAQ,EAAE,OAAO,CAAA;IACjB,MAAM,EAAE,OAAO,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,OAAO,CAAA;IACd,uBAAuB,EAAE,OAAO,CAAA;IAChC,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,SAAS,EAAE,MAAM,EAAE,EAAE,CAAA;IACrB,MAAM,EAAE,OAAO,CAAA;IAEf,SAAS,EAAE,OAAO,CAAA;IAClB,QAAQ,EAAE,QAAQ,CAAA;IAClB,kBAAkB,EAAE,OAAO,CAAA;IAE3B,MAAM,EAAE,KAAK,GAAG,IAAI,GAAG,QAAQ,CAAA;gBACnB,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB;IAkC3D,QAAQ,IAAI,OAAO;IAYnB,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE;IAEjB,IAAI;IA0FJ,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE;IA8BhC,yBAAyB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE;IAiB/C,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE;IAoBtC,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IA6D7C,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE;IA0F1C,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,EAAE;IAkBxD,UAAU,CACR,CAAC,EAAE,MAAM,EAAE,EACX,CAAC,EAAE,MAAM,EAAE,EACX,YAAY,GAAE,OAAe,GAC5B,KAAK,GAAG,MAAM,EAAE;IA+CnB,WAAW;IAqBX,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,OAAO,GAAE,OAAe;IAiNzE,WAAW;IAIX,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW;IAiDnC,MAAM;IAwGN,UAAU,CAAC,CAAC,EAAE,MAAM;IAepB,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,UAAe;IAiEvC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,gBAAgB;CAGtC;AAED,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA"} \ No newline at end of file +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/deps/minimatch/dist/commonjs/index.js b/deps/minimatch/dist/commonjs/index.js index 966dc9b8bb2165..c176ffce042b01 100644 --- a/deps/minimatch/dist/commonjs/index.js +++ b/deps/minimatch/dist/commonjs/index.js @@ -1,7 +1,7 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.unescape = exports.escape = exports.AST = exports.Minimatch = exports.match = exports.makeRe = exports.braceExpand = exports.defaults = exports.filter = exports.GLOBSTAR = exports.sep = exports.minimatch = void 0; -const brace_expansion_1 = require("@isaacs/brace-expansion"); +const brace_expansion_1 = require("brace-expansion"); const assert_valid_pattern_js_1 = require("./assert-valid-pattern.js"); const ast_js_1 = require("./ast.js"); const escape_js_1 = require("./escape.js"); @@ -67,8 +67,8 @@ const qmarksTestNoExtDot = ([$0]) => { return (f) => f.length === len && f !== '.' && f !== '..'; }; /* c8 ignore start */ -const defaultPlatform = (typeof process === 'object' && process - ? (typeof process.env === 'object' && +const defaultPlatform = (typeof process === 'object' && process ? + (typeof process.env === 'object' && process.env && process.env.__MINIMATCH_TESTING_PLATFORM__) || process.platform @@ -154,7 +154,7 @@ const braceExpand = (pattern, options = {}) => { // shortcut. no need to expand. return [pattern]; } - return (0, brace_expansion_1.expand)(pattern); + return (0, brace_expansion_1.expand)(pattern, { max: options.braceExpandMax }); }; exports.braceExpand = braceExpand; exports.minimatch.braceExpand = exports.braceExpand; @@ -202,16 +202,20 @@ class Minimatch { isWindows; platform; windowsNoMagicRoot; + maxGlobstarRecursion; regexp; constructor(pattern, options = {}) { (0, assert_valid_pattern_js_1.assertValidPattern)(pattern); options = options || {}; this.options = options; + this.maxGlobstarRecursion = options.maxGlobstarRecursion ?? 200; this.pattern = pattern; this.platform = options.platform || defaultPlatform; this.isWindows = this.platform === 'win32'; + // avoid the annoying deprecation flag lol + const awe = ('allowWindow' + 'sEscape'); this.windowsPathsNoEscape = - !!options.windowsPathsNoEscape || options.allowWindowsEscape === false; + !!options.windowsPathsNoEscape || options[awe] === false; if (this.windowsPathsNoEscape) { this.pattern = this.pattern.replace(/\\/g, '/'); } @@ -224,8 +228,8 @@ class Minimatch { this.partial = !!options.partial; this.nocase = !!this.options.nocase; this.windowsNoMagicRoot = - options.windowsNoMagicRoot !== undefined - ? options.windowsNoMagicRoot + options.windowsNoMagicRoot !== undefined ? + options.windowsNoMagicRoot : !!(this.isWindows && this.nocase); this.globSet = []; this.globParts = []; @@ -288,7 +292,10 @@ class Minimatch { !globMagic.test(s[3]); const isDrive = /^[a-z]:/i.test(s[0]); if (isUNC) { - return [...s.slice(0, 4), ...s.slice(4).map(ss => this.parse(ss))]; + return [ + ...s.slice(0, 4), + ...s.slice(4).map(ss => this.parse(ss)), + ]; } else if (isDrive) { return [s[0], ...s.slice(1).map(ss => this.parse(ss))]; @@ -320,7 +327,7 @@ class Minimatch { // to the right as possible, even if it increases the number // of patterns that we have to process. preprocess(globParts) { - // if we're not in globstar mode, then turn all ** into * + // if we're not in globstar mode, then turn ** into * if (this.options.noglobstar) { for (let i = 0; i < globParts.length; i++) { for (let j = 0; j < globParts[i].length; j++) { @@ -606,7 +613,8 @@ class Minimatch { // out of pattern, then that's fine, as long as all // the parts match. matchOne(file, pattern, partial = false) { - const options = this.options; + let fileStartIndex = 0; + let patternStartIndex = 0; // UNC paths like //?/X:/... can match X:/... and vice versa // Drive letters in absolute drive or unc paths are always compared // case-insensitively. @@ -624,18 +632,22 @@ class Minimatch { pattern[2] === '?' && typeof pattern[3] === 'string' && /^[a-z]:$/i.test(pattern[3]); - const fdi = fileUNC ? 3 : fileDrive ? 0 : undefined; - const pdi = patternUNC ? 3 : patternDrive ? 0 : undefined; + const fdi = fileUNC ? 3 + : fileDrive ? 0 + : undefined; + const pdi = patternUNC ? 3 + : patternDrive ? 0 + : undefined; if (typeof fdi === 'number' && typeof pdi === 'number') { - const [fd, pd] = [file[fdi], pattern[pdi]]; + const [fd, pd] = [ + file[fdi], + pattern[pdi], + ]; + // start matching at the drive letter index of each if (fd.toLowerCase() === pd.toLowerCase()) { pattern[pdi] = fd; - if (pdi > fdi) { - pattern = pattern.slice(pdi); - } - else if (fdi > pdi) { - file = file.slice(fdi); - } + patternStartIndex = pdi; + fileStartIndex = fdi; } } } @@ -645,99 +657,185 @@ class Minimatch { if (optimizationLevel >= 2) { file = this.levelTwoFileOptimize(file); } - this.debug('matchOne', this, { file, pattern }); - this.debug('matchOne', file.length, pattern.length); - for (var fi = 0, pi = 0, fl = file.length, pl = pattern.length; fi < fl && pi < pl; fi++, pi++) { + if (pattern.includes(exports.GLOBSTAR)) { + return this.#matchGlobstar(file, pattern, partial, fileStartIndex, patternStartIndex); + } + return this.#matchOne(file, pattern, partial, fileStartIndex, patternStartIndex); + } + #matchGlobstar(file, pattern, partial, fileIndex, patternIndex) { + // split the pattern into head, tail, and middle of ** delimited parts + const firstgs = pattern.indexOf(exports.GLOBSTAR, patternIndex); + const lastgs = pattern.lastIndexOf(exports.GLOBSTAR); + // split the pattern up into globstar-delimited sections + // the tail has to be at the end, and the others just have + // to be found in order from the head. + const [head, body, tail] = partial ? [ + pattern.slice(patternIndex, firstgs), + pattern.slice(firstgs + 1), + [], + ] : [ + pattern.slice(patternIndex, firstgs), + pattern.slice(firstgs + 1, lastgs), + pattern.slice(lastgs + 1), + ]; + // check the head, from the current file/pattern index. + if (head.length) { + const fileHead = file.slice(fileIndex, fileIndex + head.length); + if (!this.#matchOne(fileHead, head, partial, 0, 0)) { + return false; + } + fileIndex += head.length; + patternIndex += head.length; + } + // now we know the head matches! + // if the last portion is not empty, it MUST match the end + // check the tail + let fileTailMatch = 0; + if (tail.length) { + // if head + tail > file, then we cannot possibly match + if (tail.length + fileIndex > file.length) + return false; + // try to match the tail + let tailStart = file.length - tail.length; + if (this.#matchOne(file, tail, partial, tailStart, 0)) { + fileTailMatch = tail.length; + } + else { + // affordance for stuff like a/**/* matching a/b/ + // if the last file portion is '', and there's more to the pattern + // then try without the '' bit. + if (file[file.length - 1] !== '' || + fileIndex + tail.length === file.length) { + return false; + } + tailStart--; + if (!this.#matchOne(file, tail, partial, tailStart, 0)) { + return false; + } + fileTailMatch = tail.length + 1; + } + } + // now we know the tail matches! + // the middle is zero or more portions wrapped in **, possibly + // containing more ** sections. + // so a/**/b/**/c/**/d has become **/b/**/c/** + // if it's empty, it means a/**/b, just verify we have no bad dots + // if there's no tail, so it ends on /**, then we must have *something* + // after the head, or it's not a matc + if (!body.length) { + let sawSome = !!fileTailMatch; + for (let i = fileIndex; i < file.length - fileTailMatch; i++) { + const f = String(file[i]); + sawSome = true; + if (f === '.' || + f === '..' || + (!this.options.dot && f.startsWith('.'))) { + return false; + } + } + // in partial mode, we just need to get past all file parts + return partial || sawSome; + } + // now we know that there's one or more body sections, which can + // be matched anywhere from the 0 index (because the head was pruned) + // through to the length-fileTailMatch index. + // split the body up into sections, and note the minimum index it can + // be found at (start with the length of all previous segments) + // [section, before, after] + const bodySegments = [[[], 0]]; + let currentBody = bodySegments[0]; + let nonGsParts = 0; + const nonGsPartsSums = [0]; + for (const b of body) { + if (b === exports.GLOBSTAR) { + nonGsPartsSums.push(nonGsParts); + currentBody = [[], 0]; + bodySegments.push(currentBody); + } + else { + currentBody[0].push(b); + nonGsParts++; + } + } + let i = bodySegments.length - 1; + const fileLength = file.length - fileTailMatch; + for (const b of bodySegments) { + b[1] = fileLength - (nonGsPartsSums[i--] + b[0].length); + } + return !!this.#matchGlobStarBodySections(file, bodySegments, fileIndex, 0, partial, 0, !!fileTailMatch); + } + // return false for "nope, not matching" + // return null for "not matching, cannot keep trying" + #matchGlobStarBodySections(file, + // pattern section, last possible position for it + bodySegments, fileIndex, bodyIndex, partial, globStarDepth, sawTail) { + // take the first body segment, and walk from fileIndex to its "after" + // value at the end + // If it doesn't match at that position, we increment, until we hit + // that final possible position, and give up. + // If it does match, then advance and try to rest. + // If any of them fail we keep walking forward. + // this is still a bit recursively painful, but it's more constrained + // than previous implementations, because we never test something that + // can't possibly be a valid matching condition. + const bs = bodySegments[bodyIndex]; + if (!bs) { + // just make sure that there's no bad dots + for (let i = fileIndex; i < file.length; i++) { + sawTail = true; + const f = file[i]; + if (f === '.' || + f === '..' || + (!this.options.dot && f.startsWith('.'))) { + return false; + } + } + return sawTail; + } + // have a non-globstar body section to test + const [body, after] = bs; + while (fileIndex <= after) { + const m = this.#matchOne(file.slice(0, fileIndex + body.length), body, partial, fileIndex, 0); + // if limit exceeded, no match. intentional false negative, + // acceptable break in correctness for security. + if (m && globStarDepth < this.maxGlobstarRecursion) { + // match! see if the rest match. if so, we're done! + const sub = this.#matchGlobStarBodySections(file, bodySegments, fileIndex + body.length, bodyIndex + 1, partial, globStarDepth + 1, sawTail); + if (sub !== false) { + return sub; + } + } + const f = file[fileIndex]; + if (f === '.' || + f === '..' || + (!this.options.dot && f.startsWith('.'))) { + return false; + } + fileIndex++; + } + // walked off. no point continuing + return partial || null; + } + #matchOne(file, pattern, partial, fileIndex, patternIndex) { + let fi; + let pi; + let pl; + let fl; + for (fi = fileIndex, + pi = patternIndex, + fl = file.length, + pl = pattern.length; fi < fl && pi < pl; fi++, pi++) { this.debug('matchOne loop'); - var p = pattern[pi]; - var f = file[fi]; + let p = pattern[pi]; + let f = file[fi]; this.debug(pattern, p, f); // should be impossible. // some invalid regexp stuff in the set. /* c8 ignore start */ - if (p === false) { + if (p === false || p === exports.GLOBSTAR) { return false; } /* c8 ignore stop */ - if (p === exports.GLOBSTAR) { - this.debug('GLOBSTAR', [pattern, p, f]); - // "**" - // a/**/b/**/c would match the following: - // a/b/x/y/z/c - // a/x/y/z/b/c - // a/b/x/b/x/c - // a/b/c - // To do this, take the rest of the pattern after - // the **, and see if it would match the file remainder. - // If so, return success. - // If not, the ** "swallows" a segment, and try again. - // This is recursively awful. - // - // a/**/b/**/c matching a/b/x/y/z/c - // - a matches a - // - doublestar - // - matchOne(b/x/y/z/c, b/**/c) - // - b matches b - // - doublestar - // - matchOne(x/y/z/c, c) -> no - // - matchOne(y/z/c, c) -> no - // - matchOne(z/c, c) -> no - // - matchOne(c, c) yes, hit - var fr = fi; - var pr = pi + 1; - if (pr === pl) { - this.debug('** at the end'); - // a ** at the end will just swallow the rest. - // We have found a match. - // however, it will not swallow /.x, unless - // options.dot is set. - // . and .. are *never* matched by **, for explosively - // exponential reasons. - for (; fi < fl; fi++) { - if (file[fi] === '.' || - file[fi] === '..' || - (!options.dot && file[fi].charAt(0) === '.')) - return false; - } - return true; - } - // ok, let's see if we can swallow whatever we can. - while (fr < fl) { - var swallowee = file[fr]; - this.debug('\nglobstar while', file, fr, pattern, pr, swallowee); - // XXX remove this slice. Just pass the start index. - if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { - this.debug('globstar found match!', fr, fl, swallowee); - // found a match. - return true; - } - else { - // can't swallow "." or ".." ever. - // can only swallow ".foo" when explicitly asked. - if (swallowee === '.' || - swallowee === '..' || - (!options.dot && swallowee.charAt(0) === '.')) { - this.debug('dot detected!', file, fr, pattern, pr); - break; - } - // ** swallows a segment, and continue. - this.debug('globstar swallow a segment, and continue'); - fr++; - } - } - // no match was found. - // However, in partial mode, we can't say this is necessarily over. - /* c8 ignore start */ - if (partial) { - // ran out of file - this.debug('\n>>> no match, partial?', file, fr, pattern, pr); - if (fr === fl) { - return true; - } - } - /* c8 ignore stop */ - return false; - } // something other than ** // non-magic patterns just have to match exactly // patterns with magic have been turned into regexps. @@ -808,21 +906,19 @@ class Minimatch { fastTest = options.dot ? starTestDot : starTest; } else if ((m = pattern.match(starDotExtRE))) { - fastTest = (options.nocase - ? options.dot - ? starDotExtTestNocaseDot + fastTest = (options.nocase ? + options.dot ? + starDotExtTestNocaseDot : starDotExtTestNocase - : options.dot - ? starDotExtTestDot + : options.dot ? starDotExtTestDot : starDotExtTest)(m[1]); } else if ((m = pattern.match(qmarksRE))) { - fastTest = (options.nocase - ? options.dot - ? qmarksTestNocaseDot + fastTest = (options.nocase ? + options.dot ? + qmarksTestNocaseDot : qmarksTestNocase - : options.dot - ? qmarksTestDot + : options.dot ? qmarksTestDot : qmarksTest)(m); } else if ((m = pattern.match(starDotStarRE))) { @@ -853,10 +949,8 @@ class Minimatch { return this.regexp; } const options = this.options; - const twoStar = options.noglobstar - ? star - : options.dot - ? twoStarDot + const twoStar = options.noglobstar ? star + : options.dot ? twoStarDot : twoStarNoDot; const flags = new Set(options.nocase ? ['i'] : []); // regexpify non-globstar patterns @@ -872,11 +966,9 @@ class Minimatch { for (const f of p.flags.split('')) flags.add(f); } - return typeof p === 'string' - ? regExpEscape(p) - : p === exports.GLOBSTAR - ? exports.GLOBSTAR - : p._src; + return (typeof p === 'string' ? regExpEscape(p) + : p === exports.GLOBSTAR ? exports.GLOBSTAR + : p._src); }); pp.forEach((p, i) => { const next = pp[i + 1]; diff --git a/deps/minimatch/dist/commonjs/index.js.map b/deps/minimatch/dist/commonjs/index.js.map index 2f4ecefa7f9eb4..fc4dea5d2f2ff8 100644 --- a/deps/minimatch/dist/commonjs/index.js.map +++ b/deps/minimatch/dist/commonjs/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { expand } from '@isaacs/brace-expansion'\nimport { assertValidPattern } from './assert-valid-pattern.js'\nimport { AST, ExtglobType } from './ast.js'\nimport { escape } from './escape.js'\nimport { unescape } from './unescape.js'\n\nexport type Platform =\n | 'aix'\n | 'android'\n | 'darwin'\n | 'freebsd'\n | 'haiku'\n | 'linux'\n | 'openbsd'\n | 'sunos'\n | 'win32'\n | 'cygwin'\n | 'netbsd'\n\nexport interface MinimatchOptions {\n nobrace?: boolean\n nocomment?: boolean\n nonegate?: boolean\n debug?: boolean\n noglobstar?: boolean\n noext?: boolean\n nonull?: boolean\n windowsPathsNoEscape?: boolean\n allowWindowsEscape?: boolean\n partial?: boolean\n dot?: boolean\n nocase?: boolean\n nocaseMagicOnly?: boolean\n magicalBraces?: boolean\n matchBase?: boolean\n flipNegate?: boolean\n preserveMultipleSlashes?: boolean\n optimizationLevel?: number\n platform?: Platform\n windowsNoMagicRoot?: boolean\n}\n\nexport const minimatch = (\n p: string,\n pattern: string,\n options: MinimatchOptions = {},\n) => {\n assertValidPattern(pattern)\n\n // shortcut: comments match nothing.\n if (!options.nocomment && pattern.charAt(0) === '#') {\n return false\n }\n\n return new Minimatch(pattern, options).match(p)\n}\n\n// Optimized checking for the most common glob patterns.\nconst starDotExtRE = /^\\*+([^+@!?\\*\\[\\(]*)$/\nconst starDotExtTest = (ext: string) => (f: string) =>\n !f.startsWith('.') && f.endsWith(ext)\nconst starDotExtTestDot = (ext: string) => (f: string) => f.endsWith(ext)\nconst starDotExtTestNocase = (ext: string) => {\n ext = ext.toLowerCase()\n return (f: string) => !f.startsWith('.') && f.toLowerCase().endsWith(ext)\n}\nconst starDotExtTestNocaseDot = (ext: string) => {\n ext = ext.toLowerCase()\n return (f: string) => f.toLowerCase().endsWith(ext)\n}\nconst starDotStarRE = /^\\*+\\.\\*+$/\nconst starDotStarTest = (f: string) => !f.startsWith('.') && f.includes('.')\nconst starDotStarTestDot = (f: string) =>\n f !== '.' && f !== '..' && f.includes('.')\nconst dotStarRE = /^\\.\\*+$/\nconst dotStarTest = (f: string) => f !== '.' && f !== '..' && f.startsWith('.')\nconst starRE = /^\\*+$/\nconst starTest = (f: string) => f.length !== 0 && !f.startsWith('.')\nconst starTestDot = (f: string) => f.length !== 0 && f !== '.' && f !== '..'\nconst qmarksRE = /^\\?+([^+@!?\\*\\[\\(]*)?$/\nconst qmarksTestNocase = ([$0, ext = '']: RegExpMatchArray) => {\n const noext = qmarksTestNoExt([$0])\n if (!ext) return noext\n ext = ext.toLowerCase()\n return (f: string) => noext(f) && f.toLowerCase().endsWith(ext)\n}\nconst qmarksTestNocaseDot = ([$0, ext = '']: RegExpMatchArray) => {\n const noext = qmarksTestNoExtDot([$0])\n if (!ext) return noext\n ext = ext.toLowerCase()\n return (f: string) => noext(f) && f.toLowerCase().endsWith(ext)\n}\nconst qmarksTestDot = ([$0, ext = '']: RegExpMatchArray) => {\n const noext = qmarksTestNoExtDot([$0])\n return !ext ? noext : (f: string) => noext(f) && f.endsWith(ext)\n}\nconst qmarksTest = ([$0, ext = '']: RegExpMatchArray) => {\n const noext = qmarksTestNoExt([$0])\n return !ext ? noext : (f: string) => noext(f) && f.endsWith(ext)\n}\nconst qmarksTestNoExt = ([$0]: RegExpMatchArray) => {\n const len = $0.length\n return (f: string) => f.length === len && !f.startsWith('.')\n}\nconst qmarksTestNoExtDot = ([$0]: RegExpMatchArray) => {\n const len = $0.length\n return (f: string) => f.length === len && f !== '.' && f !== '..'\n}\n\n/* c8 ignore start */\nconst defaultPlatform: Platform = (\n typeof process === 'object' && process\n ? (typeof process.env === 'object' &&\n process.env &&\n process.env.__MINIMATCH_TESTING_PLATFORM__) ||\n process.platform\n : 'posix'\n) as Platform\n\nexport type Sep = '\\\\' | '/'\n\nconst path: { [k: string]: { sep: Sep } } = {\n win32: { sep: '\\\\' },\n posix: { sep: '/' },\n}\n/* c8 ignore stop */\n\nexport const sep = defaultPlatform === 'win32' ? path.win32.sep : path.posix.sep\nminimatch.sep = sep\n\nexport const GLOBSTAR = Symbol('globstar **')\nminimatch.GLOBSTAR = GLOBSTAR\n\n// any single thing other than /\n// don't need to escape / when using new RegExp()\nconst qmark = '[^/]'\n\n// * => any number of characters\nconst star = qmark + '*?'\n\n// ** when dots are allowed. Anything goes, except .. and .\n// not (^ or / followed by one or two dots followed by $ or /),\n// followed by anything, any number of times.\nconst twoStarDot = '(?:(?!(?:\\\\/|^)(?:\\\\.{1,2})($|\\\\/)).)*?'\n\n// not a ^ or / followed by a dot,\n// followed by anything, any number of times.\nconst twoStarNoDot = '(?:(?!(?:\\\\/|^)\\\\.).)*?'\n\nexport const filter =\n (pattern: string, options: MinimatchOptions = {}) =>\n (p: string) =>\n minimatch(p, pattern, options)\nminimatch.filter = filter\n\nconst ext = (a: MinimatchOptions, b: MinimatchOptions = {}) =>\n Object.assign({}, a, b)\n\nexport const defaults = (def: MinimatchOptions): typeof minimatch => {\n if (!def || typeof def !== 'object' || !Object.keys(def).length) {\n return minimatch\n }\n\n const orig = minimatch\n\n const m = (p: string, pattern: string, options: MinimatchOptions = {}) =>\n orig(p, pattern, ext(def, options))\n\n return Object.assign(m, {\n Minimatch: class Minimatch extends orig.Minimatch {\n constructor(pattern: string, options: MinimatchOptions = {}) {\n super(pattern, ext(def, options))\n }\n static defaults(options: MinimatchOptions) {\n return orig.defaults(ext(def, options)).Minimatch\n }\n },\n\n AST: class AST extends orig.AST {\n /* c8 ignore start */\n constructor(\n type: ExtglobType | null,\n parent?: AST,\n options: MinimatchOptions = {},\n ) {\n super(type, parent, ext(def, options))\n }\n /* c8 ignore stop */\n\n static fromGlob(pattern: string, options: MinimatchOptions = {}) {\n return orig.AST.fromGlob(pattern, ext(def, options))\n }\n },\n\n unescape: (\n s: string,\n options: Pick<\n MinimatchOptions,\n 'windowsPathsNoEscape' | 'magicalBraces'\n > = {},\n ) => orig.unescape(s, ext(def, options)),\n\n escape: (\n s: string,\n options: Pick<\n MinimatchOptions,\n 'windowsPathsNoEscape' | 'magicalBraces'\n > = {},\n ) => orig.escape(s, ext(def, options)),\n\n filter: (pattern: string, options: MinimatchOptions = {}) =>\n orig.filter(pattern, ext(def, options)),\n\n defaults: (options: MinimatchOptions) => orig.defaults(ext(def, options)),\n\n makeRe: (pattern: string, options: MinimatchOptions = {}) =>\n orig.makeRe(pattern, ext(def, options)),\n\n braceExpand: (pattern: string, options: MinimatchOptions = {}) =>\n orig.braceExpand(pattern, ext(def, options)),\n\n match: (list: string[], pattern: string, options: MinimatchOptions = {}) =>\n orig.match(list, pattern, ext(def, options)),\n\n sep: orig.sep,\n GLOBSTAR: GLOBSTAR as typeof GLOBSTAR,\n })\n}\nminimatch.defaults = defaults\n\n// Brace expansion:\n// a{b,c}d -> abd acd\n// a{b,}c -> abc ac\n// a{0..3}d -> a0d a1d a2d a3d\n// a{b,c{d,e}f}g -> abg acdfg acefg\n// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg\n//\n// Invalid sets are not expanded.\n// a{2..}b -> a{2..}b\n// a{b}c -> a{b}c\nexport const braceExpand = (\n pattern: string,\n options: MinimatchOptions = {},\n) => {\n assertValidPattern(pattern)\n\n // Thanks to Yeting Li <https://github.com/yetingli> for\n // improving this regexp to avoid a ReDOS vulnerability.\n if (options.nobrace || !/\\{(?:(?!\\{).)*\\}/.test(pattern)) {\n // shortcut. no need to expand.\n return [pattern]\n }\n\n return expand(pattern)\n}\nminimatch.braceExpand = braceExpand\n\n// parse a component of the expanded set.\n// At this point, no pattern may contain \"/\" in it\n// so we're going to return a 2d array, where each entry is the full\n// pattern, split on '/', and then turned into a regular expression.\n// A regexp is made at the end which joins each array with an\n// escaped /, and another full one which joins each regexp with |.\n//\n// Following the lead of Bash 4.1, note that \"**\" only has special meaning\n// when it is the *only* thing in a path portion. Otherwise, any series\n// of * is equivalent to a single *. Globstar behavior is enabled by\n// default, and can be disabled by setting options.noglobstar.\n\nexport const makeRe = (pattern: string, options: MinimatchOptions = {}) =>\n new Minimatch(pattern, options).makeRe()\nminimatch.makeRe = makeRe\n\nexport const match = (\n list: string[],\n pattern: string,\n options: MinimatchOptions = {},\n) => {\n const mm = new Minimatch(pattern, options)\n list = list.filter(f => mm.match(f))\n if (mm.options.nonull && !list.length) {\n list.push(pattern)\n }\n return list\n}\nminimatch.match = match\n\n// replace stuff like \\* with *\nconst globMagic = /[?*]|[+@!]\\(.*?\\)|\\[|\\]/\nconst regExpEscape = (s: string) =>\n s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\nexport type MMRegExp = RegExp & {\n _src?: string\n _glob?: string\n}\n\nexport type ParseReturnFiltered = string | MMRegExp | typeof GLOBSTAR\nexport type ParseReturn = ParseReturnFiltered | false\n\nexport class Minimatch {\n options: MinimatchOptions\n set: ParseReturnFiltered[][]\n pattern: string\n\n windowsPathsNoEscape: boolean\n nonegate: boolean\n negate: boolean\n comment: boolean\n empty: boolean\n preserveMultipleSlashes: boolean\n partial: boolean\n globSet: string[]\n globParts: string[][]\n nocase: boolean\n\n isWindows: boolean\n platform: Platform\n windowsNoMagicRoot: boolean\n\n regexp: false | null | MMRegExp\n constructor(pattern: string, options: MinimatchOptions = {}) {\n assertValidPattern(pattern)\n\n options = options || {}\n this.options = options\n this.pattern = pattern\n this.platform = options.platform || defaultPlatform\n this.isWindows = this.platform === 'win32'\n this.windowsPathsNoEscape =\n !!options.windowsPathsNoEscape || options.allowWindowsEscape === false\n if (this.windowsPathsNoEscape) {\n this.pattern = this.pattern.replace(/\\\\/g, '/')\n }\n this.preserveMultipleSlashes = !!options.preserveMultipleSlashes\n this.regexp = null\n this.negate = false\n this.nonegate = !!options.nonegate\n this.comment = false\n this.empty = false\n this.partial = !!options.partial\n this.nocase = !!this.options.nocase\n this.windowsNoMagicRoot =\n options.windowsNoMagicRoot !== undefined\n ? options.windowsNoMagicRoot\n : !!(this.isWindows && this.nocase)\n\n this.globSet = []\n this.globParts = []\n this.set = []\n\n // make the set of regexps etc.\n this.make()\n }\n\n hasMagic(): boolean {\n if (this.options.magicalBraces && this.set.length > 1) {\n return true\n }\n for (const pattern of this.set) {\n for (const part of pattern) {\n if (typeof part !== 'string') return true\n }\n }\n return false\n }\n\n debug(..._: any[]) {}\n\n make() {\n const pattern = this.pattern\n const options = this.options\n\n // empty patterns and comments match nothing.\n if (!options.nocomment && pattern.charAt(0) === '#') {\n this.comment = true\n return\n }\n\n if (!pattern) {\n this.empty = true\n return\n }\n\n // step 1: figure out negation, etc.\n this.parseNegate()\n\n // step 2: expand braces\n this.globSet = [...new Set(this.braceExpand())]\n\n if (options.debug) {\n this.debug = (...args: any[]) => console.error(...args)\n }\n\n this.debug(this.pattern, this.globSet)\n\n // step 3: now we have a set, so turn each one into a series of\n // path-portion matching patterns.\n // These will be regexps, except in the case of \"**\", which is\n // set to the GLOBSTAR object for globstar behavior,\n // and will not contain any / characters\n //\n // First, we preprocess to make the glob pattern sets a bit simpler\n // and deduped. There are some perf-killing patterns that can cause\n // problems with a glob walk, but we can simplify them down a bit.\n const rawGlobParts = this.globSet.map(s => this.slashSplit(s))\n this.globParts = this.preprocess(rawGlobParts)\n this.debug(this.pattern, this.globParts)\n\n // glob --> regexps\n let set = this.globParts.map((s, _, __) => {\n if (this.isWindows && this.windowsNoMagicRoot) {\n // check if it's a drive or unc path.\n const isUNC =\n s[0] === '' &&\n s[1] === '' &&\n (s[2] === '?' || !globMagic.test(s[2])) &&\n !globMagic.test(s[3])\n const isDrive = /^[a-z]:/i.test(s[0])\n if (isUNC) {\n return [...s.slice(0, 4), ...s.slice(4).map(ss => this.parse(ss))]\n } else if (isDrive) {\n return [s[0], ...s.slice(1).map(ss => this.parse(ss))]\n }\n }\n return s.map(ss => this.parse(ss))\n })\n\n this.debug(this.pattern, set)\n\n // filter out everything that didn't compile properly.\n this.set = set.filter(\n s => s.indexOf(false) === -1,\n ) as ParseReturnFiltered[][]\n\n // do not treat the ? in UNC paths as magic\n if (this.isWindows) {\n for (let i = 0; i < this.set.length; i++) {\n const p = this.set[i]\n if (\n p[0] === '' &&\n p[1] === '' &&\n this.globParts[i][2] === '?' &&\n typeof p[3] === 'string' &&\n /^[a-z]:$/i.test(p[3])\n ) {\n p[2] = '?'\n }\n }\n }\n\n this.debug(this.pattern, this.set)\n }\n\n // various transforms to equivalent pattern sets that are\n // faster to process in a filesystem walk. The goal is to\n // eliminate what we can, and push all ** patterns as far\n // to the right as possible, even if it increases the number\n // of patterns that we have to process.\n preprocess(globParts: string[][]) {\n // if we're not in globstar mode, then turn all ** into *\n if (this.options.noglobstar) {\n for (let i = 0; i < globParts.length; i++) {\n for (let j = 0; j < globParts[i].length; j++) {\n if (globParts[i][j] === '**') {\n globParts[i][j] = '*'\n }\n }\n }\n }\n\n const { optimizationLevel = 1 } = this.options\n\n if (optimizationLevel >= 2) {\n // aggressive optimization for the purpose of fs walking\n globParts = this.firstPhasePreProcess(globParts)\n globParts = this.secondPhasePreProcess(globParts)\n } else if (optimizationLevel >= 1) {\n // just basic optimizations to remove some .. parts\n globParts = this.levelOneOptimize(globParts)\n } else {\n // just collapse multiple ** portions into one\n globParts = this.adjascentGlobstarOptimize(globParts)\n }\n\n return globParts\n }\n\n // just get rid of adjascent ** portions\n adjascentGlobstarOptimize(globParts: string[][]) {\n return globParts.map(parts => {\n let gs: number = -1\n while (-1 !== (gs = parts.indexOf('**', gs + 1))) {\n let i = gs\n while (parts[i + 1] === '**') {\n i++\n }\n if (i !== gs) {\n parts.splice(gs, i - gs)\n }\n }\n return parts\n })\n }\n\n // get rid of adjascent ** and resolve .. portions\n levelOneOptimize(globParts: string[][]) {\n return globParts.map(parts => {\n parts = parts.reduce((set: string[], part) => {\n const prev = set[set.length - 1]\n if (part === '**' && prev === '**') {\n return set\n }\n if (part === '..') {\n if (prev && prev !== '..' && prev !== '.' && prev !== '**') {\n set.pop()\n return set\n }\n }\n set.push(part)\n return set\n }, [])\n return parts.length === 0 ? [''] : parts\n })\n }\n\n levelTwoFileOptimize(parts: string | string[]) {\n if (!Array.isArray(parts)) {\n parts = this.slashSplit(parts)\n }\n let didSomething: boolean = false\n do {\n didSomething = false\n // <pre>/<e>/<rest> -> <pre>/<rest>\n if (!this.preserveMultipleSlashes) {\n for (let i = 1; i < parts.length - 1; i++) {\n const p = parts[i]\n // don't squeeze out UNC patterns\n if (i === 1 && p === '' && parts[0] === '') continue\n if (p === '.' || p === '') {\n didSomething = true\n parts.splice(i, 1)\n i--\n }\n }\n if (\n parts[0] === '.' &&\n parts.length === 2 &&\n (parts[1] === '.' || parts[1] === '')\n ) {\n didSomething = true\n parts.pop()\n }\n }\n\n // <pre>/<p>/../<rest> -> <pre>/<rest>\n let dd: number = 0\n while (-1 !== (dd = parts.indexOf('..', dd + 1))) {\n const p = parts[dd - 1]\n if (p && p !== '.' && p !== '..' && p !== '**') {\n didSomething = true\n parts.splice(dd - 1, 2)\n dd -= 2\n }\n }\n } while (didSomething)\n return parts.length === 0 ? [''] : parts\n }\n\n // First phase: single-pattern processing\n // <pre> is 1 or more portions\n // <rest> is 1 or more portions\n // <p> is any portion other than ., .., '', or **\n // <e> is . or ''\n //\n // **/.. is *brutal* for filesystem walking performance, because\n // it effectively resets the recursive walk each time it occurs,\n // and ** cannot be reduced out by a .. pattern part like a regexp\n // or most strings (other than .., ., and '') can be.\n //\n // <pre>/**/../<p>/<p>/<rest> -> {<pre>/../<p>/<p>/<rest>,<pre>/**/<p>/<p>/<rest>}\n // <pre>/<e>/<rest> -> <pre>/<rest>\n // <pre>/<p>/../<rest> -> <pre>/<rest>\n // **/**/<rest> -> **/<rest>\n //\n // **/*/<rest> -> */**/<rest> <== not valid because ** doesn't follow\n // this WOULD be allowed if ** did follow symlinks, or * didn't\n firstPhasePreProcess(globParts: string[][]) {\n let didSomething = false\n do {\n didSomething = false\n // <pre>/**/../<p>/<p>/<rest> -> {<pre>/../<p>/<p>/<rest>,<pre>/**/<p>/<p>/<rest>}\n for (let parts of globParts) {\n let gs: number = -1\n while (-1 !== (gs = parts.indexOf('**', gs + 1))) {\n let gss: number = gs\n while (parts[gss + 1] === '**') {\n // <pre>/**/**/<rest> -> <pre>/**/<rest>\n gss++\n }\n // eg, if gs is 2 and gss is 4, that means we have 3 **\n // parts, and can remove 2 of them.\n if (gss > gs) {\n parts.splice(gs + 1, gss - gs)\n }\n\n let next = parts[gs + 1]\n const p = parts[gs + 2]\n const p2 = parts[gs + 3]\n if (next !== '..') continue\n if (\n !p ||\n p === '.' ||\n p === '..' ||\n !p2 ||\n p2 === '.' ||\n p2 === '..'\n ) {\n continue\n }\n didSomething = true\n // edit parts in place, and push the new one\n parts.splice(gs, 1)\n const other = parts.slice(0)\n other[gs] = '**'\n globParts.push(other)\n gs--\n }\n\n // <pre>/<e>/<rest> -> <pre>/<rest>\n if (!this.preserveMultipleSlashes) {\n for (let i = 1; i < parts.length - 1; i++) {\n const p = parts[i]\n // don't squeeze out UNC patterns\n if (i === 1 && p === '' && parts[0] === '') continue\n if (p === '.' || p === '') {\n didSomething = true\n parts.splice(i, 1)\n i--\n }\n }\n if (\n parts[0] === '.' &&\n parts.length === 2 &&\n (parts[1] === '.' || parts[1] === '')\n ) {\n didSomething = true\n parts.pop()\n }\n }\n\n // <pre>/<p>/../<rest> -> <pre>/<rest>\n let dd: number = 0\n while (-1 !== (dd = parts.indexOf('..', dd + 1))) {\n const p = parts[dd - 1]\n if (p && p !== '.' && p !== '..' && p !== '**') {\n didSomething = true\n const needDot = dd === 1 && parts[dd + 1] === '**'\n const splin = needDot ? ['.'] : []\n parts.splice(dd - 1, 2, ...splin)\n if (parts.length === 0) parts.push('')\n dd -= 2\n }\n }\n }\n } while (didSomething)\n\n return globParts\n }\n\n // second phase: multi-pattern dedupes\n // {<pre>/*/<rest>,<pre>/<p>/<rest>} -> <pre>/*/<rest>\n // {<pre>/<rest>,<pre>/<rest>} -> <pre>/<rest>\n // {<pre>/**/<rest>,<pre>/<rest>} -> <pre>/**/<rest>\n //\n // {<pre>/**/<rest>,<pre>/**/<p>/<rest>} -> <pre>/**/<rest>\n // ^-- not valid because ** doens't follow symlinks\n secondPhasePreProcess(globParts: string[][]): string[][] {\n for (let i = 0; i < globParts.length - 1; i++) {\n for (let j = i + 1; j < globParts.length; j++) {\n const matched = this.partsMatch(\n globParts[i],\n globParts[j],\n !this.preserveMultipleSlashes,\n )\n if (matched) {\n globParts[i] = []\n globParts[j] = matched\n break\n }\n }\n }\n return globParts.filter(gs => gs.length)\n }\n\n partsMatch(\n a: string[],\n b: string[],\n emptyGSMatch: boolean = false,\n ): false | string[] {\n let ai = 0\n let bi = 0\n let result: string[] = []\n let which: string = ''\n while (ai < a.length && bi < b.length) {\n if (a[ai] === b[bi]) {\n result.push(which === 'b' ? b[bi] : a[ai])\n ai++\n bi++\n } else if (emptyGSMatch && a[ai] === '**' && b[bi] === a[ai + 1]) {\n result.push(a[ai])\n ai++\n } else if (emptyGSMatch && b[bi] === '**' && a[ai] === b[bi + 1]) {\n result.push(b[bi])\n bi++\n } else if (\n a[ai] === '*' &&\n b[bi] &&\n (this.options.dot || !b[bi].startsWith('.')) &&\n b[bi] !== '**'\n ) {\n if (which === 'b') return false\n which = 'a'\n result.push(a[ai])\n ai++\n bi++\n } else if (\n b[bi] === '*' &&\n a[ai] &&\n (this.options.dot || !a[ai].startsWith('.')) &&\n a[ai] !== '**'\n ) {\n if (which === 'a') return false\n which = 'b'\n result.push(b[bi])\n ai++\n bi++\n } else {\n return false\n }\n }\n // if we fall out of the loop, it means they two are identical\n // as long as their lengths match\n return a.length === b.length && result\n }\n\n parseNegate() {\n if (this.nonegate) return\n\n const pattern = this.pattern\n let negate = false\n let negateOffset = 0\n\n for (let i = 0; i < pattern.length && pattern.charAt(i) === '!'; i++) {\n negate = !negate\n negateOffset++\n }\n\n if (negateOffset) this.pattern = pattern.slice(negateOffset)\n this.negate = negate\n }\n\n // set partial to true to test if, for example,\n // \"/a/b\" matches the start of \"/*/b/*/d\"\n // Partial means, if you run out of file before you run\n // out of pattern, then that's fine, as long as all\n // the parts match.\n matchOne(file: string[], pattern: ParseReturn[], partial: boolean = false) {\n const options = this.options\n\n // UNC paths like //?/X:/... can match X:/... and vice versa\n // Drive letters in absolute drive or unc paths are always compared\n // case-insensitively.\n if (this.isWindows) {\n const fileDrive = typeof file[0] === 'string' && /^[a-z]:$/i.test(file[0])\n const fileUNC =\n !fileDrive &&\n file[0] === '' &&\n file[1] === '' &&\n file[2] === '?' &&\n /^[a-z]:$/i.test(file[3])\n\n const patternDrive =\n typeof pattern[0] === 'string' && /^[a-z]:$/i.test(pattern[0])\n const patternUNC =\n !patternDrive &&\n pattern[0] === '' &&\n pattern[1] === '' &&\n pattern[2] === '?' &&\n typeof pattern[3] === 'string' &&\n /^[a-z]:$/i.test(pattern[3])\n\n const fdi = fileUNC ? 3 : fileDrive ? 0 : undefined\n const pdi = patternUNC ? 3 : patternDrive ? 0 : undefined\n if (typeof fdi === 'number' && typeof pdi === 'number') {\n const [fd, pd]: [string, string] = [file[fdi], pattern[pdi] as string]\n if (fd.toLowerCase() === pd.toLowerCase()) {\n pattern[pdi] = fd\n if (pdi > fdi) {\n pattern = pattern.slice(pdi)\n } else if (fdi > pdi) {\n file = file.slice(fdi)\n }\n }\n }\n }\n\n // resolve and reduce . and .. portions in the file as well.\n // don't need to do the second phase, because it's only one string[]\n const { optimizationLevel = 1 } = this.options\n if (optimizationLevel >= 2) {\n file = this.levelTwoFileOptimize(file)\n }\n\n this.debug('matchOne', this, { file, pattern })\n this.debug('matchOne', file.length, pattern.length)\n\n for (\n var fi = 0, pi = 0, fl = file.length, pl = pattern.length;\n fi < fl && pi < pl;\n fi++, pi++\n ) {\n this.debug('matchOne loop')\n var p = pattern[pi]\n var f = file[fi]\n\n this.debug(pattern, p, f)\n\n // should be impossible.\n // some invalid regexp stuff in the set.\n /* c8 ignore start */\n if (p === false) {\n return false\n }\n /* c8 ignore stop */\n\n if (p === GLOBSTAR) {\n this.debug('GLOBSTAR', [pattern, p, f])\n\n // \"**\"\n // a/**/b/**/c would match the following:\n // a/b/x/y/z/c\n // a/x/y/z/b/c\n // a/b/x/b/x/c\n // a/b/c\n // To do this, take the rest of the pattern after\n // the **, and see if it would match the file remainder.\n // If so, return success.\n // If not, the ** \"swallows\" a segment, and try again.\n // This is recursively awful.\n //\n // a/**/b/**/c matching a/b/x/y/z/c\n // - a matches a\n // - doublestar\n // - matchOne(b/x/y/z/c, b/**/c)\n // - b matches b\n // - doublestar\n // - matchOne(x/y/z/c, c) -> no\n // - matchOne(y/z/c, c) -> no\n // - matchOne(z/c, c) -> no\n // - matchOne(c, c) yes, hit\n var fr = fi\n var pr = pi + 1\n if (pr === pl) {\n this.debug('** at the end')\n // a ** at the end will just swallow the rest.\n // We have found a match.\n // however, it will not swallow /.x, unless\n // options.dot is set.\n // . and .. are *never* matched by **, for explosively\n // exponential reasons.\n for (; fi < fl; fi++) {\n if (\n file[fi] === '.' ||\n file[fi] === '..' ||\n (!options.dot && file[fi].charAt(0) === '.')\n )\n return false\n }\n return true\n }\n\n // ok, let's see if we can swallow whatever we can.\n while (fr < fl) {\n var swallowee = file[fr]\n\n this.debug('\\nglobstar while', file, fr, pattern, pr, swallowee)\n\n // XXX remove this slice. Just pass the start index.\n if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {\n this.debug('globstar found match!', fr, fl, swallowee)\n // found a match.\n return true\n } else {\n // can't swallow \".\" or \"..\" ever.\n // can only swallow \".foo\" when explicitly asked.\n if (\n swallowee === '.' ||\n swallowee === '..' ||\n (!options.dot && swallowee.charAt(0) === '.')\n ) {\n this.debug('dot detected!', file, fr, pattern, pr)\n break\n }\n\n // ** swallows a segment, and continue.\n this.debug('globstar swallow a segment, and continue')\n fr++\n }\n }\n\n // no match was found.\n // However, in partial mode, we can't say this is necessarily over.\n /* c8 ignore start */\n if (partial) {\n // ran out of file\n this.debug('\\n>>> no match, partial?', file, fr, pattern, pr)\n if (fr === fl) {\n return true\n }\n }\n /* c8 ignore stop */\n return false\n }\n\n // something other than **\n // non-magic patterns just have to match exactly\n // patterns with magic have been turned into regexps.\n let hit: boolean\n if (typeof p === 'string') {\n hit = f === p\n this.debug('string match', p, f, hit)\n } else {\n hit = p.test(f)\n this.debug('pattern match', p, f, hit)\n }\n\n if (!hit) return false\n }\n\n // Note: ending in / means that we'll get a final \"\"\n // at the end of the pattern. This can only match a\n // corresponding \"\" at the end of the file.\n // If the file ends in /, then it can only match a\n // a pattern that ends in /, unless the pattern just\n // doesn't have any more for it. But, a/b/ should *not*\n // match \"a/b/*\", even though \"\" matches against the\n // [^/]*? pattern, except in partial mode, where it might\n // simply not be reached yet.\n // However, a/b/ should still satisfy a/*\n\n // now either we fell off the end of the pattern, or we're done.\n if (fi === fl && pi === pl) {\n // ran out of pattern and filename at the same time.\n // an exact hit!\n return true\n } else if (fi === fl) {\n // ran out of file, but still had pattern left.\n // this is ok if we're doing the match as part of\n // a glob fs traversal.\n return partial\n } else if (pi === pl) {\n // ran out of pattern, still have file left.\n // this is only acceptable if we're on the very last\n // empty segment of a file with a trailing slash.\n // a/* should match a/b/\n return fi === fl - 1 && file[fi] === ''\n\n /* c8 ignore start */\n } else {\n // should be unreachable.\n throw new Error('wtf?')\n }\n /* c8 ignore stop */\n }\n\n braceExpand() {\n return braceExpand(this.pattern, this.options)\n }\n\n parse(pattern: string): ParseReturn {\n assertValidPattern(pattern)\n\n const options = this.options\n\n // shortcuts\n if (pattern === '**') return GLOBSTAR\n if (pattern === '') return ''\n\n // far and away, the most common glob pattern parts are\n // *, *.*, and *.<ext> Add a fast check method for those.\n let m: RegExpMatchArray | null\n let fastTest: null | ((f: string) => boolean) = null\n if ((m = pattern.match(starRE))) {\n fastTest = options.dot ? starTestDot : starTest\n } else if ((m = pattern.match(starDotExtRE))) {\n fastTest = (\n options.nocase\n ? options.dot\n ? starDotExtTestNocaseDot\n : starDotExtTestNocase\n : options.dot\n ? starDotExtTestDot\n : starDotExtTest\n )(m[1])\n } else if ((m = pattern.match(qmarksRE))) {\n fastTest = (\n options.nocase\n ? options.dot\n ? qmarksTestNocaseDot\n : qmarksTestNocase\n : options.dot\n ? qmarksTestDot\n : qmarksTest\n )(m)\n } else if ((m = pattern.match(starDotStarRE))) {\n fastTest = options.dot ? starDotStarTestDot : starDotStarTest\n } else if ((m = pattern.match(dotStarRE))) {\n fastTest = dotStarTest\n }\n\n const re = AST.fromGlob(pattern, this.options).toMMPattern()\n if (fastTest && typeof re === 'object') {\n // Avoids overriding in frozen environments\n Reflect.defineProperty(re, 'test', { value: fastTest })\n }\n return re\n }\n\n makeRe() {\n if (this.regexp || this.regexp === false) return this.regexp\n\n // at this point, this.set is a 2d array of partial\n // pattern strings, or \"**\".\n //\n // It's better to use .match(). This function shouldn't\n // be used, really, but it's pretty convenient sometimes,\n // when you just want to work with a regex.\n const set = this.set\n\n if (!set.length) {\n this.regexp = false\n return this.regexp\n }\n const options = this.options\n\n const twoStar = options.noglobstar\n ? star\n : options.dot\n ? twoStarDot\n : twoStarNoDot\n const flags = new Set(options.nocase ? ['i'] : [])\n\n // regexpify non-globstar patterns\n // if ** is only item, then we just do one twoStar\n // if ** is first, and there are more, prepend (\\/|twoStar\\/)? to next\n // if ** is last, append (\\/twoStar|) to previous\n // if ** is in the middle, append (\\/|\\/twoStar\\/) to previous\n // then filter out GLOBSTAR symbols\n let re = set\n .map(pattern => {\n const pp: (string | typeof GLOBSTAR)[] = pattern.map(p => {\n if (p instanceof RegExp) {\n for (const f of p.flags.split('')) flags.add(f)\n }\n return typeof p === 'string'\n ? regExpEscape(p)\n : p === GLOBSTAR\n ? GLOBSTAR\n : p._src\n }) as (string | typeof GLOBSTAR)[]\n pp.forEach((p, i) => {\n const next = pp[i + 1]\n const prev = pp[i - 1]\n if (p !== GLOBSTAR || prev === GLOBSTAR) {\n return\n }\n if (prev === undefined) {\n if (next !== undefined && next !== GLOBSTAR) {\n pp[i + 1] = '(?:\\\\/|' + twoStar + '\\\\/)?' + next\n } else {\n pp[i] = twoStar\n }\n } else if (next === undefined) {\n pp[i - 1] = prev + '(?:\\\\/|\\\\/' + twoStar + ')?'\n } else if (next !== GLOBSTAR) {\n pp[i - 1] = prev + '(?:\\\\/|\\\\/' + twoStar + '\\\\/)' + next\n pp[i + 1] = GLOBSTAR\n }\n })\n const filtered = pp.filter(p => p !== GLOBSTAR)\n\n // For partial matches, we need to make the pattern match\n // any prefix of the full path. We do this by generating\n // alternative patterns that match progressively longer prefixes.\n if (this.partial && filtered.length >= 1) {\n const prefixes: string[] = []\n for (let i = 1; i <= filtered.length; i++) {\n prefixes.push(filtered.slice(0, i).join('/'))\n }\n return '(?:' + prefixes.join('|') + ')'\n }\n\n return filtered.join('/')\n })\n .join('|')\n\n // need to wrap in parens if we had more than one thing with |,\n // otherwise only the first will be anchored to ^ and the last to $\n const [open, close] = set.length > 1 ? ['(?:', ')'] : ['', '']\n // must match entire pattern\n // ending in a * or ** will make it less strict.\n re = '^' + open + re + close + '$'\n\n // In partial mode, '/' should always match as it's a valid prefix for any pattern\n if (this.partial) {\n re = '^(?:\\\\/|' + open + re.slice(1, -1) + close + ')$'\n }\n\n // can match anything, as long as it's not this.\n if (this.negate) re = '^(?!' + re + ').+$'\n\n try {\n this.regexp = new RegExp(re, [...flags].join(''))\n /* c8 ignore start */\n } catch (ex) {\n // should be impossible\n this.regexp = false\n }\n /* c8 ignore stop */\n return this.regexp\n }\n\n slashSplit(p: string) {\n // if p starts with // on windows, we preserve that\n // so that UNC paths aren't broken. Otherwise, any number of\n // / characters are coalesced into one, unless\n // preserveMultipleSlashes is set to true.\n if (this.preserveMultipleSlashes) {\n return p.split('/')\n } else if (this.isWindows && /^\\/\\/[^\\/]+/.test(p)) {\n // add an extra '' for the one we lose\n return ['', ...p.split(/\\/+/)]\n } else {\n return p.split(/\\/+/)\n }\n }\n\n match(f: string, partial = this.partial) {\n this.debug('match', f, this.pattern)\n // short-circuit in the case of busted things.\n // comments, etc.\n if (this.comment) {\n return false\n }\n if (this.empty) {\n return f === ''\n }\n\n if (f === '/' && partial) {\n return true\n }\n\n const options = this.options\n\n // windows: need to use /, not \\\n if (this.isWindows) {\n f = f.split('\\\\').join('/')\n }\n\n // treat the test path as a set of pathparts.\n const ff = this.slashSplit(f)\n this.debug(this.pattern, 'split', ff)\n\n // just ONE of the pattern sets in this.set needs to match\n // in order for it to be valid. If negating, then just one\n // match means that we have failed.\n // Either way, return on the first hit.\n\n const set = this.set\n this.debug(this.pattern, 'set', set)\n\n // Find the basename of the path by looking for the last non-empty segment\n let filename: string = ff[ff.length - 1]\n if (!filename) {\n for (let i = ff.length - 2; !filename && i >= 0; i--) {\n filename = ff[i]\n }\n }\n\n for (let i = 0; i < set.length; i++) {\n const pattern = set[i]\n let file = ff\n if (options.matchBase && pattern.length === 1) {\n file = [filename]\n }\n const hit = this.matchOne(file, pattern, partial)\n if (hit) {\n if (options.flipNegate) {\n return true\n }\n return !this.negate\n }\n }\n\n // didn't get any hits. this is success if it's a negative\n // pattern, failure otherwise.\n if (options.flipNegate) {\n return false\n }\n return this.negate\n }\n\n static defaults(def: MinimatchOptions) {\n return minimatch.defaults(def).Minimatch\n }\n}\n/* c8 ignore start */\nexport { AST } from './ast.js'\nexport { escape } from './escape.js'\nexport { unescape } from './unescape.js'\n/* c8 ignore stop */\nminimatch.AST = AST\nminimatch.Minimatch = Minimatch\nminimatch.escape = escape\nminimatch.unescape = unescape\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { expand } from 'brace-expansion'\nimport { assertValidPattern } from './assert-valid-pattern.js'\nimport { AST, ExtglobType } from './ast.js'\nimport { escape } from './escape.js'\nimport { unescape } from './unescape.js'\n\nexport type Platform =\n | 'aix'\n | 'android'\n | 'darwin'\n | 'freebsd'\n | 'haiku'\n | 'linux'\n | 'openbsd'\n | 'sunos'\n | 'win32'\n | 'cygwin'\n | 'netbsd'\n\nexport interface MinimatchOptions {\n /** do not expand `{x,y}` style braces */\n nobrace?: boolean\n /** do not treat patterns starting with `#` as a comment */\n nocomment?: boolean\n /** do not treat patterns starting with `!` as a negation */\n nonegate?: boolean\n /** print LOTS of debugging output */\n debug?: boolean\n /** treat `**` the same as `*` */\n noglobstar?: boolean\n /** do not expand extglobs like `+(a|b)` */\n noext?: boolean\n /** return the pattern if nothing matches */\n nonull?: boolean\n /** treat `\\\\` as a path separator, not an escape character */\n windowsPathsNoEscape?: boolean\n /**\n * inverse of {@link MinimatchOptions.windowsPathsNoEscape}\n * @deprecated\n */\n allowWindowsEscape?: boolean\n /**\n * Compare a partial path to a pattern. As long as the parts\n * of the path that are present are not contradicted by the\n * pattern, it will be treated as a match. This is useful in\n * applications where you're walking through a folder structure,\n * and don't yet have the full path, but want to ensure that you\n * do not walk down paths that can never be a match.\n */\n partial?: boolean\n /** allow matches that start with `.` even if the pattern does not */\n dot?: boolean\n /** ignore case */\n nocase?: boolean\n /** ignore case only in wildcard patterns */\n nocaseMagicOnly?: boolean\n /** consider braces to be \"magic\" for the purpose of `hasMagic` */\n magicalBraces?: boolean\n /**\n * If set, then patterns without slashes will be matched\n * against the basename of the path if it contains slashes.\n * For example, `a?b` would match the path `/xyz/123/acb`, but\n * not `/xyz/acb/123`.\n */\n matchBase?: boolean\n /** invert the results of negated matches */\n flipNegate?: boolean\n /** do not collapse multiple `/` into a single `/` */\n preserveMultipleSlashes?: boolean\n /**\n * A number indicating the level of optimization that should be done\n * to the pattern prior to parsing and using it for matches.\n */\n optimizationLevel?: number\n /** operating system platform */\n platform?: Platform\n /**\n * When a pattern starts with a UNC path or drive letter, and in\n * `nocase:true` mode, do not convert the root portions of the\n * pattern into a case-insensitive regular expression, and instead\n * leave them as strings.\n *\n * This is the default when the platform is `win32` and\n * `nocase:true` is set.\n */\n windowsNoMagicRoot?: boolean\n /**\n * max number of `{...}` patterns to expand. Default 100_000.\n */\n braceExpandMax?: number\n /**\n * Max number of non-adjacent `**` patterns to recursively walk down.\n *\n * The default of 200 is almost certainly high enough for most purposes,\n * and can handle absurdly excessive patterns.\n */\n maxGlobstarRecursion?: number\n\n /**\n * Max depth to traverse for nested extglobs like `*(a|b|c)`\n *\n * Default is 2, which is quite low, but any higher value\n * swiftly results in punishing performance impacts. Note\n * that this is *not* relevant when the globstar types can\n * be safely coalesced into a single set.\n *\n * For example, `*(a|@(b|c)|d)` would be flattened into\n * `*(a|b|c|d)`. Thus, many common extglobs will retain good\n * performance and never hit this limit, even if they are\n * excessively deep and complicated.\n *\n * If the limit is hit, then the extglob characters are simply\n * not parsed, and the pattern effectively switches into\n * `noextglob: true` mode for the contents of that nested\n * sub-pattern. This will typically _not_ result in a match,\n * but is considered a valid trade-off for security and\n * performance.\n */\n maxExtglobRecursion?: number\n}\n\nexport const minimatch = (\n p: string,\n pattern: string,\n options: MinimatchOptions = {},\n) => {\n assertValidPattern(pattern)\n\n // shortcut: comments match nothing.\n if (!options.nocomment && pattern.charAt(0) === '#') {\n return false\n }\n\n return new Minimatch(pattern, options).match(p)\n}\n\n// Optimized checking for the most common glob patterns.\nconst starDotExtRE = /^\\*+([^+@!?\\*\\[\\(]*)$/\nconst starDotExtTest = (ext: string) => (f: string) =>\n !f.startsWith('.') && f.endsWith(ext)\nconst starDotExtTestDot = (ext: string) => (f: string) => f.endsWith(ext)\nconst starDotExtTestNocase = (ext: string) => {\n ext = ext.toLowerCase()\n return (f: string) => !f.startsWith('.') && f.toLowerCase().endsWith(ext)\n}\nconst starDotExtTestNocaseDot = (ext: string) => {\n ext = ext.toLowerCase()\n return (f: string) => f.toLowerCase().endsWith(ext)\n}\nconst starDotStarRE = /^\\*+\\.\\*+$/\nconst starDotStarTest = (f: string) =>\n !f.startsWith('.') && f.includes('.')\nconst starDotStarTestDot = (f: string) =>\n f !== '.' && f !== '..' && f.includes('.')\nconst dotStarRE = /^\\.\\*+$/\nconst dotStarTest = (f: string) =>\n f !== '.' && f !== '..' && f.startsWith('.')\nconst starRE = /^\\*+$/\nconst starTest = (f: string) => f.length !== 0 && !f.startsWith('.')\nconst starTestDot = (f: string) =>\n f.length !== 0 && f !== '.' && f !== '..'\nconst qmarksRE = /^\\?+([^+@!?\\*\\[\\(]*)?$/\nconst qmarksTestNocase = ([$0, ext = '']: RegExpMatchArray) => {\n const noext = qmarksTestNoExt([$0])\n if (!ext) return noext\n ext = ext.toLowerCase()\n return (f: string) => noext(f) && f.toLowerCase().endsWith(ext)\n}\nconst qmarksTestNocaseDot = ([$0, ext = '']: RegExpMatchArray) => {\n const noext = qmarksTestNoExtDot([$0])\n if (!ext) return noext\n ext = ext.toLowerCase()\n return (f: string) => noext(f) && f.toLowerCase().endsWith(ext)\n}\nconst qmarksTestDot = ([$0, ext = '']: RegExpMatchArray) => {\n const noext = qmarksTestNoExtDot([$0])\n return !ext ? noext : (f: string) => noext(f) && f.endsWith(ext)\n}\nconst qmarksTest = ([$0, ext = '']: RegExpMatchArray) => {\n const noext = qmarksTestNoExt([$0])\n return !ext ? noext : (f: string) => noext(f) && f.endsWith(ext)\n}\nconst qmarksTestNoExt = ([$0]: RegExpMatchArray) => {\n const len = $0.length\n return (f: string) => f.length === len && !f.startsWith('.')\n}\nconst qmarksTestNoExtDot = ([$0]: RegExpMatchArray) => {\n const len = $0.length\n return (f: string) => f.length === len && f !== '.' && f !== '..'\n}\n\n/* c8 ignore start */\nconst defaultPlatform: Platform = (\n typeof process === 'object' && process ?\n (typeof process.env === 'object' &&\n process.env &&\n process.env.__MINIMATCH_TESTING_PLATFORM__) ||\n process.platform\n : 'posix') as Platform\n\nexport type Sep = '\\\\' | '/'\n\nconst path: { [k: string]: { sep: Sep } } = {\n win32: { sep: '\\\\' },\n posix: { sep: '/' },\n}\n/* c8 ignore stop */\n\nexport const sep =\n defaultPlatform === 'win32' ? path.win32.sep : path.posix.sep\nminimatch.sep = sep\n\nexport const GLOBSTAR = Symbol('globstar **')\nminimatch.GLOBSTAR = GLOBSTAR\n\n// any single thing other than /\n// don't need to escape / when using new RegExp()\nconst qmark = '[^/]'\n\n// * => any number of characters\nconst star = qmark + '*?'\n\n// ** when dots are allowed. Anything goes, except .. and .\n// not (^ or / followed by one or two dots followed by $ or /),\n// followed by anything, any number of times.\nconst twoStarDot = '(?:(?!(?:\\\\/|^)(?:\\\\.{1,2})($|\\\\/)).)*?'\n\n// not a ^ or / followed by a dot,\n// followed by anything, any number of times.\nconst twoStarNoDot = '(?:(?!(?:\\\\/|^)\\\\.).)*?'\n\nexport const filter =\n (pattern: string, options: MinimatchOptions = {}) =>\n (p: string) =>\n minimatch(p, pattern, options)\nminimatch.filter = filter\n\nconst ext = (a: MinimatchOptions, b: MinimatchOptions = {}) =>\n Object.assign({}, a, b)\n\nexport const defaults = (def: MinimatchOptions): typeof minimatch => {\n if (!def || typeof def !== 'object' || !Object.keys(def).length) {\n return minimatch\n }\n\n const orig = minimatch\n\n const m = (p: string, pattern: string, options: MinimatchOptions = {}) =>\n orig(p, pattern, ext(def, options))\n\n return Object.assign(m, {\n Minimatch: class Minimatch extends orig.Minimatch {\n constructor(pattern: string, options: MinimatchOptions = {}) {\n super(pattern, ext(def, options))\n }\n static defaults(options: MinimatchOptions) {\n return orig.defaults(ext(def, options)).Minimatch\n }\n },\n\n AST: class AST extends orig.AST {\n /* c8 ignore start */\n constructor(\n type: ExtglobType | null,\n parent?: AST,\n options: MinimatchOptions = {},\n ) {\n super(type, parent, ext(def, options))\n }\n /* c8 ignore stop */\n\n static fromGlob(pattern: string, options: MinimatchOptions = {}) {\n return orig.AST.fromGlob(pattern, ext(def, options))\n }\n },\n\n unescape: (\n s: string,\n options: Pick<\n MinimatchOptions,\n 'windowsPathsNoEscape' | 'magicalBraces'\n > = {},\n ) => orig.unescape(s, ext(def, options)),\n\n escape: (\n s: string,\n options: Pick<\n MinimatchOptions,\n 'windowsPathsNoEscape' | 'magicalBraces'\n > = {},\n ) => orig.escape(s, ext(def, options)),\n\n filter: (pattern: string, options: MinimatchOptions = {}) =>\n orig.filter(pattern, ext(def, options)),\n\n defaults: (options: MinimatchOptions) =>\n orig.defaults(ext(def, options)),\n\n makeRe: (pattern: string, options: MinimatchOptions = {}) =>\n orig.makeRe(pattern, ext(def, options)),\n\n braceExpand: (pattern: string, options: MinimatchOptions = {}) =>\n orig.braceExpand(pattern, ext(def, options)),\n\n match: (\n list: string[],\n pattern: string,\n options: MinimatchOptions = {},\n ) => orig.match(list, pattern, ext(def, options)),\n\n sep: orig.sep,\n GLOBSTAR: GLOBSTAR as typeof GLOBSTAR,\n })\n}\nminimatch.defaults = defaults\n\n// Brace expansion:\n// a{b,c}d -> abd acd\n// a{b,}c -> abc ac\n// a{0..3}d -> a0d a1d a2d a3d\n// a{b,c{d,e}f}g -> abg acdfg acefg\n// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg\n//\n// Invalid sets are not expanded.\n// a{2..}b -> a{2..}b\n// a{b}c -> a{b}c\nexport const braceExpand = (\n pattern: string,\n options: MinimatchOptions = {},\n) => {\n assertValidPattern(pattern)\n\n // Thanks to Yeting Li <https://github.com/yetingli> for\n // improving this regexp to avoid a ReDOS vulnerability.\n if (options.nobrace || !/\\{(?:(?!\\{).)*\\}/.test(pattern)) {\n // shortcut. no need to expand.\n return [pattern]\n }\n\n return expand(pattern, { max: options.braceExpandMax })\n}\nminimatch.braceExpand = braceExpand\n\n// parse a component of the expanded set.\n// At this point, no pattern may contain \"/\" in it\n// so we're going to return a 2d array, where each entry is the full\n// pattern, split on '/', and then turned into a regular expression.\n// A regexp is made at the end which joins each array with an\n// escaped /, and another full one which joins each regexp with |.\n//\n// Following the lead of Bash 4.1, note that \"**\" only has special meaning\n// when it is the *only* thing in a path portion. Otherwise, any series\n// of * is equivalent to a single *. Globstar behavior is enabled by\n// default, and can be disabled by setting options.noglobstar.\n\nexport const makeRe = (pattern: string, options: MinimatchOptions = {}) =>\n new Minimatch(pattern, options).makeRe()\nminimatch.makeRe = makeRe\n\nexport const match = (\n list: string[],\n pattern: string,\n options: MinimatchOptions = {},\n) => {\n const mm = new Minimatch(pattern, options)\n list = list.filter(f => mm.match(f))\n if (mm.options.nonull && !list.length) {\n list.push(pattern)\n }\n return list\n}\nminimatch.match = match\n\n// replace stuff like \\* with *\nconst globMagic = /[?*]|[+@!]\\(.*?\\)|\\[|\\]/\nconst regExpEscape = (s: string) =>\n s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\nexport type MMRegExp = RegExp & {\n _src?: string\n _glob?: string\n}\n\nexport type ParseReturnFiltered = string | MMRegExp | typeof GLOBSTAR\nexport type ParseReturn = ParseReturnFiltered | false\n\nexport class Minimatch {\n options: MinimatchOptions\n set: ParseReturnFiltered[][]\n pattern: string\n\n windowsPathsNoEscape: boolean\n nonegate: boolean\n negate: boolean\n comment: boolean\n empty: boolean\n preserveMultipleSlashes: boolean\n partial: boolean\n globSet: string[]\n globParts: string[][]\n nocase: boolean\n\n isWindows: boolean\n platform: Platform\n windowsNoMagicRoot: boolean\n maxGlobstarRecursion: number\n\n regexp: false | null | MMRegExp\n constructor(pattern: string, options: MinimatchOptions = {}) {\n assertValidPattern(pattern)\n\n options = options || {}\n this.options = options\n this.maxGlobstarRecursion = options.maxGlobstarRecursion ?? 200\n this.pattern = pattern\n this.platform = options.platform || defaultPlatform\n this.isWindows = this.platform === 'win32'\n // avoid the annoying deprecation flag lol\n const awe = ('allowWindow' + 'sEscape') as keyof MinimatchOptions\n this.windowsPathsNoEscape =\n !!options.windowsPathsNoEscape || options[awe] === false\n if (this.windowsPathsNoEscape) {\n this.pattern = this.pattern.replace(/\\\\/g, '/')\n }\n this.preserveMultipleSlashes = !!options.preserveMultipleSlashes\n this.regexp = null\n this.negate = false\n this.nonegate = !!options.nonegate\n this.comment = false\n this.empty = false\n this.partial = !!options.partial\n this.nocase = !!this.options.nocase\n this.windowsNoMagicRoot =\n options.windowsNoMagicRoot !== undefined ?\n options.windowsNoMagicRoot\n : !!(this.isWindows && this.nocase)\n\n this.globSet = []\n this.globParts = []\n this.set = []\n\n // make the set of regexps etc.\n this.make()\n }\n\n hasMagic(): boolean {\n if (this.options.magicalBraces && this.set.length > 1) {\n return true\n }\n for (const pattern of this.set) {\n for (const part of pattern) {\n if (typeof part !== 'string') return true\n }\n }\n return false\n }\n\n debug(..._: any[]) {}\n\n make() {\n const pattern = this.pattern\n const options = this.options\n\n // empty patterns and comments match nothing.\n if (!options.nocomment && pattern.charAt(0) === '#') {\n this.comment = true\n return\n }\n\n if (!pattern) {\n this.empty = true\n return\n }\n\n // step 1: figure out negation, etc.\n this.parseNegate()\n\n // step 2: expand braces\n this.globSet = [...new Set(this.braceExpand())]\n\n if (options.debug) {\n this.debug = (...args: any[]) => console.error(...args)\n }\n\n this.debug(this.pattern, this.globSet)\n\n // step 3: now we have a set, so turn each one into a series of\n // path-portion matching patterns.\n // These will be regexps, except in the case of \"**\", which is\n // set to the GLOBSTAR object for globstar behavior,\n // and will not contain any / characters\n //\n // First, we preprocess to make the glob pattern sets a bit simpler\n // and deduped. There are some perf-killing patterns that can cause\n // problems with a glob walk, but we can simplify them down a bit.\n const rawGlobParts = this.globSet.map(s => this.slashSplit(s))\n this.globParts = this.preprocess(rawGlobParts)\n this.debug(this.pattern, this.globParts)\n\n // glob --> regexps\n let set = this.globParts.map((s, _, __) => {\n if (this.isWindows && this.windowsNoMagicRoot) {\n // check if it's a drive or unc path.\n const isUNC =\n s[0] === '' &&\n s[1] === '' &&\n (s[2] === '?' || !globMagic.test(s[2])) &&\n !globMagic.test(s[3])\n const isDrive = /^[a-z]:/i.test(s[0])\n if (isUNC) {\n return [\n ...s.slice(0, 4),\n ...s.slice(4).map(ss => this.parse(ss)),\n ]\n } else if (isDrive) {\n return [s[0], ...s.slice(1).map(ss => this.parse(ss))]\n }\n }\n return s.map(ss => this.parse(ss))\n })\n\n this.debug(this.pattern, set)\n\n // filter out everything that didn't compile properly.\n this.set = set.filter(\n s => s.indexOf(false) === -1,\n ) as ParseReturnFiltered[][]\n\n // do not treat the ? in UNC paths as magic\n if (this.isWindows) {\n for (let i = 0; i < this.set.length; i++) {\n const p = this.set[i]\n if (\n p[0] === '' &&\n p[1] === '' &&\n this.globParts[i][2] === '?' &&\n typeof p[3] === 'string' &&\n /^[a-z]:$/i.test(p[3])\n ) {\n p[2] = '?'\n }\n }\n }\n\n this.debug(this.pattern, this.set)\n }\n\n // various transforms to equivalent pattern sets that are\n // faster to process in a filesystem walk. The goal is to\n // eliminate what we can, and push all ** patterns as far\n // to the right as possible, even if it increases the number\n // of patterns that we have to process.\n preprocess(globParts: string[][]) {\n // if we're not in globstar mode, then turn ** into *\n if (this.options.noglobstar) {\n for (let i = 0; i < globParts.length; i++) {\n for (let j = 0; j < globParts[i].length; j++) {\n if (globParts[i][j] === '**') {\n globParts[i][j] = '*'\n }\n }\n }\n }\n\n const { optimizationLevel = 1 } = this.options\n\n if (optimizationLevel >= 2) {\n // aggressive optimization for the purpose of fs walking\n globParts = this.firstPhasePreProcess(globParts)\n globParts = this.secondPhasePreProcess(globParts)\n } else if (optimizationLevel >= 1) {\n // just basic optimizations to remove some .. parts\n globParts = this.levelOneOptimize(globParts)\n } else {\n // just collapse multiple ** portions into one\n globParts = this.adjascentGlobstarOptimize(globParts)\n }\n\n return globParts\n }\n\n // just get rid of adjascent ** portions\n adjascentGlobstarOptimize(globParts: string[][]) {\n return globParts.map(parts => {\n let gs: number = -1\n while (-1 !== (gs = parts.indexOf('**', gs + 1))) {\n let i = gs\n while (parts[i + 1] === '**') {\n i++\n }\n if (i !== gs) {\n parts.splice(gs, i - gs)\n }\n }\n return parts\n })\n }\n\n // get rid of adjascent ** and resolve .. portions\n levelOneOptimize(globParts: string[][]) {\n return globParts.map(parts => {\n parts = parts.reduce((set: string[], part) => {\n const prev = set[set.length - 1]\n if (part === '**' && prev === '**') {\n return set\n }\n if (part === '..') {\n if (prev && prev !== '..' && prev !== '.' && prev !== '**') {\n set.pop()\n return set\n }\n }\n set.push(part)\n return set\n }, [])\n return parts.length === 0 ? [''] : parts\n })\n }\n\n levelTwoFileOptimize(parts: string | string[]) {\n if (!Array.isArray(parts)) {\n parts = this.slashSplit(parts)\n }\n let didSomething: boolean = false\n do {\n didSomething = false\n // <pre>/<e>/<rest> -> <pre>/<rest>\n if (!this.preserveMultipleSlashes) {\n for (let i = 1; i < parts.length - 1; i++) {\n const p = parts[i]\n // don't squeeze out UNC patterns\n if (i === 1 && p === '' && parts[0] === '') continue\n if (p === '.' || p === '') {\n didSomething = true\n parts.splice(i, 1)\n i--\n }\n }\n if (\n parts[0] === '.' &&\n parts.length === 2 &&\n (parts[1] === '.' || parts[1] === '')\n ) {\n didSomething = true\n parts.pop()\n }\n }\n\n // <pre>/<p>/../<rest> -> <pre>/<rest>\n let dd: number = 0\n while (-1 !== (dd = parts.indexOf('..', dd + 1))) {\n const p = parts[dd - 1]\n if (p && p !== '.' && p !== '..' && p !== '**') {\n didSomething = true\n parts.splice(dd - 1, 2)\n dd -= 2\n }\n }\n } while (didSomething)\n return parts.length === 0 ? [''] : parts\n }\n\n // First phase: single-pattern processing\n // <pre> is 1 or more portions\n // <rest> is 1 or more portions\n // <p> is any portion other than ., .., '', or **\n // <e> is . or ''\n //\n // **/.. is *brutal* for filesystem walking performance, because\n // it effectively resets the recursive walk each time it occurs,\n // and ** cannot be reduced out by a .. pattern part like a regexp\n // or most strings (other than .., ., and '') can be.\n //\n // <pre>/**/../<p>/<p>/<rest> -> {<pre>/../<p>/<p>/<rest>,<pre>/**/<p>/<p>/<rest>}\n // <pre>/<e>/<rest> -> <pre>/<rest>\n // <pre>/<p>/../<rest> -> <pre>/<rest>\n // **/**/<rest> -> **/<rest>\n //\n // **/*/<rest> -> */**/<rest> <== not valid because ** doesn't follow\n // this WOULD be allowed if ** did follow symlinks, or * didn't\n firstPhasePreProcess(globParts: string[][]) {\n let didSomething = false\n do {\n didSomething = false\n // <pre>/**/../<p>/<p>/<rest> -> {<pre>/../<p>/<p>/<rest>,<pre>/**/<p>/<p>/<rest>}\n for (let parts of globParts) {\n let gs: number = -1\n while (-1 !== (gs = parts.indexOf('**', gs + 1))) {\n let gss: number = gs\n while (parts[gss + 1] === '**') {\n // <pre>/**/**/<rest> -> <pre>/**/<rest>\n gss++\n }\n // eg, if gs is 2 and gss is 4, that means we have 3 **\n // parts, and can remove 2 of them.\n if (gss > gs) {\n parts.splice(gs + 1, gss - gs)\n }\n\n let next = parts[gs + 1]\n const p = parts[gs + 2]\n const p2 = parts[gs + 3]\n if (next !== '..') continue\n if (\n !p ||\n p === '.' ||\n p === '..' ||\n !p2 ||\n p2 === '.' ||\n p2 === '..'\n ) {\n continue\n }\n didSomething = true\n // edit parts in place, and push the new one\n parts.splice(gs, 1)\n const other = parts.slice(0)\n other[gs] = '**'\n globParts.push(other)\n gs--\n }\n\n // <pre>/<e>/<rest> -> <pre>/<rest>\n if (!this.preserveMultipleSlashes) {\n for (let i = 1; i < parts.length - 1; i++) {\n const p = parts[i]\n // don't squeeze out UNC patterns\n if (i === 1 && p === '' && parts[0] === '') continue\n if (p === '.' || p === '') {\n didSomething = true\n parts.splice(i, 1)\n i--\n }\n }\n if (\n parts[0] === '.' &&\n parts.length === 2 &&\n (parts[1] === '.' || parts[1] === '')\n ) {\n didSomething = true\n parts.pop()\n }\n }\n\n // <pre>/<p>/../<rest> -> <pre>/<rest>\n let dd: number = 0\n while (-1 !== (dd = parts.indexOf('..', dd + 1))) {\n const p = parts[dd - 1]\n if (p && p !== '.' && p !== '..' && p !== '**') {\n didSomething = true\n const needDot = dd === 1 && parts[dd + 1] === '**'\n const splin = needDot ? ['.'] : []\n parts.splice(dd - 1, 2, ...splin)\n if (parts.length === 0) parts.push('')\n dd -= 2\n }\n }\n }\n } while (didSomething)\n\n return globParts\n }\n\n // second phase: multi-pattern dedupes\n // {<pre>/*/<rest>,<pre>/<p>/<rest>} -> <pre>/*/<rest>\n // {<pre>/<rest>,<pre>/<rest>} -> <pre>/<rest>\n // {<pre>/**/<rest>,<pre>/<rest>} -> <pre>/**/<rest>\n //\n // {<pre>/**/<rest>,<pre>/**/<p>/<rest>} -> <pre>/**/<rest>\n // ^-- not valid because ** doens't follow symlinks\n secondPhasePreProcess(globParts: string[][]): string[][] {\n for (let i = 0; i < globParts.length - 1; i++) {\n for (let j = i + 1; j < globParts.length; j++) {\n const matched = this.partsMatch(\n globParts[i],\n globParts[j],\n !this.preserveMultipleSlashes,\n )\n if (matched) {\n globParts[i] = []\n globParts[j] = matched\n break\n }\n }\n }\n return globParts.filter(gs => gs.length)\n }\n\n partsMatch(\n a: string[],\n b: string[],\n emptyGSMatch: boolean = false,\n ): false | string[] {\n let ai = 0\n let bi = 0\n let result: string[] = []\n let which: string = ''\n while (ai < a.length && bi < b.length) {\n if (a[ai] === b[bi]) {\n result.push(which === 'b' ? b[bi] : a[ai])\n ai++\n bi++\n } else if (emptyGSMatch && a[ai] === '**' && b[bi] === a[ai + 1]) {\n result.push(a[ai])\n ai++\n } else if (emptyGSMatch && b[bi] === '**' && a[ai] === b[bi + 1]) {\n result.push(b[bi])\n bi++\n } else if (\n a[ai] === '*' &&\n b[bi] &&\n (this.options.dot || !b[bi].startsWith('.')) &&\n b[bi] !== '**'\n ) {\n if (which === 'b') return false\n which = 'a'\n result.push(a[ai])\n ai++\n bi++\n } else if (\n b[bi] === '*' &&\n a[ai] &&\n (this.options.dot || !a[ai].startsWith('.')) &&\n a[ai] !== '**'\n ) {\n if (which === 'a') return false\n which = 'b'\n result.push(b[bi])\n ai++\n bi++\n } else {\n return false\n }\n }\n // if we fall out of the loop, it means they two are identical\n // as long as their lengths match\n return a.length === b.length && result\n }\n\n parseNegate() {\n if (this.nonegate) return\n\n const pattern = this.pattern\n let negate = false\n let negateOffset = 0\n\n for (let i = 0; i < pattern.length && pattern.charAt(i) === '!'; i++) {\n negate = !negate\n negateOffset++\n }\n\n if (negateOffset) this.pattern = pattern.slice(negateOffset)\n this.negate = negate\n }\n\n // set partial to true to test if, for example,\n // \"/a/b\" matches the start of \"/*/b/*/d\"\n // Partial means, if you run out of file before you run\n // out of pattern, then that's fine, as long as all\n // the parts match.\n matchOne(\n file: string[],\n pattern: ParseReturn[],\n partial: boolean = false,\n ) {\n let fileStartIndex = 0\n let patternStartIndex = 0\n\n // UNC paths like //?/X:/... can match X:/... and vice versa\n // Drive letters in absolute drive or unc paths are always compared\n // case-insensitively.\n if (this.isWindows) {\n const fileDrive =\n typeof file[0] === 'string' && /^[a-z]:$/i.test(file[0])\n const fileUNC =\n !fileDrive &&\n file[0] === '' &&\n file[1] === '' &&\n file[2] === '?' &&\n /^[a-z]:$/i.test(file[3])\n\n const patternDrive =\n typeof pattern[0] === 'string' && /^[a-z]:$/i.test(pattern[0])\n const patternUNC =\n !patternDrive &&\n pattern[0] === '' &&\n pattern[1] === '' &&\n pattern[2] === '?' &&\n typeof pattern[3] === 'string' &&\n /^[a-z]:$/i.test(pattern[3])\n\n const fdi =\n fileUNC ? 3\n : fileDrive ? 0\n : undefined\n const pdi =\n patternUNC ? 3\n : patternDrive ? 0\n : undefined\n if (typeof fdi === 'number' && typeof pdi === 'number') {\n const [fd, pd]: [string, string] = [\n file[fdi],\n pattern[pdi] as string,\n ]\n // start matching at the drive letter index of each\n if (fd.toLowerCase() === pd.toLowerCase()) {\n pattern[pdi] = fd\n patternStartIndex = pdi\n fileStartIndex = fdi\n }\n }\n }\n\n // resolve and reduce . and .. portions in the file as well.\n // don't need to do the second phase, because it's only one string[]\n const { optimizationLevel = 1 } = this.options\n if (optimizationLevel >= 2) {\n file = this.levelTwoFileOptimize(file)\n }\n\n if (pattern.includes(GLOBSTAR)) {\n return this.#matchGlobstar(\n file,\n pattern,\n partial,\n fileStartIndex,\n patternStartIndex,\n )\n }\n\n return this.#matchOne(\n file,\n pattern,\n partial,\n fileStartIndex,\n patternStartIndex,\n )\n }\n\n #matchGlobstar(\n file: string[],\n pattern: ParseReturn[],\n partial: boolean,\n fileIndex: number,\n patternIndex: number,\n ) {\n // split the pattern into head, tail, and middle of ** delimited parts\n const firstgs = pattern.indexOf(GLOBSTAR, patternIndex)\n const lastgs = pattern.lastIndexOf(GLOBSTAR)\n\n // split the pattern up into globstar-delimited sections\n // the tail has to be at the end, and the others just have\n // to be found in order from the head.\n const [head, body, tail] = partial ? [\n pattern.slice(patternIndex, firstgs),\n pattern.slice(firstgs + 1),\n [],\n ] : [\n pattern.slice(patternIndex, firstgs),\n pattern.slice(firstgs + 1, lastgs),\n pattern.slice(lastgs + 1),\n ]\n\n // check the head, from the current file/pattern index.\n if (head.length) {\n const fileHead = file.slice(fileIndex, fileIndex + head.length)\n if (!this.#matchOne(fileHead, head, partial, 0, 0)) {\n return false\n }\n fileIndex += head.length\n patternIndex += head.length\n }\n // now we know the head matches!\n\n // if the last portion is not empty, it MUST match the end\n // check the tail\n let fileTailMatch: number = 0\n if (tail.length) {\n // if head + tail > file, then we cannot possibly match\n if (tail.length + fileIndex > file.length) return false\n\n // try to match the tail\n let tailStart = file.length - tail.length\n if (this.#matchOne(file, tail, partial, tailStart, 0)) {\n fileTailMatch = tail.length\n } else {\n // affordance for stuff like a/**/* matching a/b/\n // if the last file portion is '', and there's more to the pattern\n // then try without the '' bit.\n if (\n file[file.length - 1] !== '' ||\n fileIndex + tail.length === file.length\n ) {\n return false\n }\n tailStart--\n if (!this.#matchOne(file, tail, partial, tailStart, 0)) {\n return false\n }\n fileTailMatch = tail.length + 1\n }\n }\n\n // now we know the tail matches!\n\n // the middle is zero or more portions wrapped in **, possibly\n // containing more ** sections.\n // so a/**/b/**/c/**/d has become **/b/**/c/**\n // if it's empty, it means a/**/b, just verify we have no bad dots\n // if there's no tail, so it ends on /**, then we must have *something*\n // after the head, or it's not a matc\n if (!body.length) {\n let sawSome = !!fileTailMatch\n for (let i = fileIndex; i < file.length - fileTailMatch; i++) {\n const f = String(file[i])\n sawSome = true\n if (\n f === '.' ||\n f === '..' ||\n (!this.options.dot && f.startsWith('.'))\n ) {\n return false\n }\n }\n // in partial mode, we just need to get past all file parts\n return partial || sawSome\n }\n\n // now we know that there's one or more body sections, which can\n // be matched anywhere from the 0 index (because the head was pruned)\n // through to the length-fileTailMatch index.\n // split the body up into sections, and note the minimum index it can\n // be found at (start with the length of all previous segments)\n // [section, before, after]\n const bodySegments: [ParseReturn[], number][] = [[[], 0]]\n let currentBody: [ParseReturn[], number] = bodySegments[0]\n let nonGsParts = 0\n const nonGsPartsSums: number[] = [0]\n for (const b of body) {\n if (b === GLOBSTAR) {\n nonGsPartsSums.push(nonGsParts)\n currentBody = [[], 0]\n bodySegments.push(currentBody)\n } else {\n currentBody[0].push(b)\n nonGsParts++\n }\n }\n let i = bodySegments.length - 1\n const fileLength = file.length - fileTailMatch\n for (const b of bodySegments) {\n b[1] = fileLength - ((nonGsPartsSums[i--] as number) + b[0].length)\n }\n\n return !!this.#matchGlobStarBodySections(\n file,\n bodySegments,\n fileIndex,\n 0,\n partial,\n 0,\n !!fileTailMatch,\n )\n }\n\n // return false for \"nope, not matching\"\n // return null for \"not matching, cannot keep trying\"\n #matchGlobStarBodySections(\n file: string[],\n // pattern section, last possible position for it\n bodySegments: [ParseReturn[], number][],\n fileIndex: number,\n bodyIndex: number,\n partial: boolean,\n globStarDepth: number,\n sawTail: boolean,\n ): boolean | null {\n // take the first body segment, and walk from fileIndex to its \"after\"\n // value at the end\n // If it doesn't match at that position, we increment, until we hit\n // that final possible position, and give up.\n // If it does match, then advance and try to rest.\n // If any of them fail we keep walking forward.\n // this is still a bit recursively painful, but it's more constrained\n // than previous implementations, because we never test something that\n // can't possibly be a valid matching condition.\n const bs = bodySegments[bodyIndex]\n if (!bs) {\n // just make sure that there's no bad dots\n for (let i = fileIndex; i < file.length; i++) {\n sawTail = true\n const f = file[i]\n if (\n f === '.' ||\n f === '..' ||\n (!this.options.dot && f.startsWith('.'))\n ) {\n return false\n }\n }\n return sawTail\n }\n\n // have a non-globstar body section to test\n const [body, after] = bs\n while (fileIndex <= after) {\n const m = this.#matchOne(\n file.slice(0, fileIndex + body.length),\n body,\n partial,\n fileIndex,\n 0,\n )\n // if limit exceeded, no match. intentional false negative,\n // acceptable break in correctness for security.\n if (m && globStarDepth < this.maxGlobstarRecursion) {\n // match! see if the rest match. if so, we're done!\n const sub = this.#matchGlobStarBodySections(\n file,\n bodySegments,\n fileIndex + body.length,\n bodyIndex + 1,\n partial,\n globStarDepth + 1,\n sawTail,\n )\n if (sub !== false) {\n return sub\n }\n }\n const f = file[fileIndex]\n if (\n f === '.' ||\n f === '..' ||\n (!this.options.dot && f.startsWith('.'))\n ) {\n return false\n }\n\n fileIndex++\n }\n // walked off. no point continuing\n return partial || null\n }\n\n #matchOne(\n file: string[],\n pattern: ParseReturn[],\n partial: boolean,\n fileIndex: number,\n patternIndex: number,\n ) {\n let fi: number\n let pi: number\n let pl: number\n let fl: number\n for (\n fi = fileIndex,\n pi = patternIndex,\n fl = file.length,\n pl = pattern.length;\n fi < fl && pi < pl;\n fi++, pi++\n ) {\n this.debug('matchOne loop')\n let p = pattern[pi]\n let f = file[fi]\n\n this.debug(pattern, p, f)\n\n // should be impossible.\n // some invalid regexp stuff in the set.\n /* c8 ignore start */\n if (p === false || p === GLOBSTAR) {\n return false\n }\n /* c8 ignore stop */\n\n // something other than **\n // non-magic patterns just have to match exactly\n // patterns with magic have been turned into regexps.\n let hit: boolean\n if (typeof p === 'string') {\n hit = f === p\n this.debug('string match', p, f, hit)\n } else {\n hit = p.test(f)\n this.debug('pattern match', p, f, hit)\n }\n\n if (!hit) return false\n }\n\n // Note: ending in / means that we'll get a final \"\"\n // at the end of the pattern. This can only match a\n // corresponding \"\" at the end of the file.\n // If the file ends in /, then it can only match a\n // a pattern that ends in /, unless the pattern just\n // doesn't have any more for it. But, a/b/ should *not*\n // match \"a/b/*\", even though \"\" matches against the\n // [^/]*? pattern, except in partial mode, where it might\n // simply not be reached yet.\n // However, a/b/ should still satisfy a/*\n\n // now either we fell off the end of the pattern, or we're done.\n if (fi === fl && pi === pl) {\n // ran out of pattern and filename at the same time.\n // an exact hit!\n return true\n } else if (fi === fl) {\n // ran out of file, but still had pattern left.\n // this is ok if we're doing the match as part of\n // a glob fs traversal.\n return partial\n } else if (pi === pl) {\n // ran out of pattern, still have file left.\n // this is only acceptable if we're on the very last\n // empty segment of a file with a trailing slash.\n // a/* should match a/b/\n return fi === fl - 1 && file[fi] === ''\n\n /* c8 ignore start */\n } else {\n // should be unreachable.\n throw new Error('wtf?')\n }\n /* c8 ignore stop */\n }\n\n braceExpand() {\n return braceExpand(this.pattern, this.options)\n }\n\n parse(pattern: string): ParseReturn {\n assertValidPattern(pattern)\n\n const options = this.options\n\n // shortcuts\n if (pattern === '**') return GLOBSTAR\n if (pattern === '') return ''\n\n // far and away, the most common glob pattern parts are\n // *, *.*, and *.<ext> Add a fast check method for those.\n let m: RegExpMatchArray | null\n let fastTest: null | ((f: string) => boolean) = null\n if ((m = pattern.match(starRE))) {\n fastTest = options.dot ? starTestDot : starTest\n } else if ((m = pattern.match(starDotExtRE))) {\n fastTest = (\n options.nocase ?\n options.dot ?\n starDotExtTestNocaseDot\n : starDotExtTestNocase\n : options.dot ? starDotExtTestDot\n : starDotExtTest)(m[1])\n } else if ((m = pattern.match(qmarksRE))) {\n fastTest = (\n options.nocase ?\n options.dot ?\n qmarksTestNocaseDot\n : qmarksTestNocase\n : options.dot ? qmarksTestDot\n : qmarksTest)(m)\n } else if ((m = pattern.match(starDotStarRE))) {\n fastTest = options.dot ? starDotStarTestDot : starDotStarTest\n } else if ((m = pattern.match(dotStarRE))) {\n fastTest = dotStarTest\n }\n\n const re = AST.fromGlob(pattern, this.options).toMMPattern()\n if (fastTest && typeof re === 'object') {\n // Avoids overriding in frozen environments\n Reflect.defineProperty(re, 'test', { value: fastTest })\n }\n return re\n }\n\n makeRe() {\n if (this.regexp || this.regexp === false) return this.regexp\n\n // at this point, this.set is a 2d array of partial\n // pattern strings, or \"**\".\n //\n // It's better to use .match(). This function shouldn't\n // be used, really, but it's pretty convenient sometimes,\n // when you just want to work with a regex.\n const set = this.set\n\n if (!set.length) {\n this.regexp = false\n return this.regexp\n }\n const options = this.options\n\n const twoStar =\n options.noglobstar ? star\n : options.dot ? twoStarDot\n : twoStarNoDot\n const flags = new Set(options.nocase ? ['i'] : [])\n\n // regexpify non-globstar patterns\n // if ** is only item, then we just do one twoStar\n // if ** is first, and there are more, prepend (\\/|twoStar\\/)? to next\n // if ** is last, append (\\/twoStar|) to previous\n // if ** is in the middle, append (\\/|\\/twoStar\\/) to previous\n // then filter out GLOBSTAR symbols\n let re = set\n .map(pattern => {\n const pp: (string | typeof GLOBSTAR)[] = pattern.map(p => {\n if (p instanceof RegExp) {\n for (const f of p.flags.split('')) flags.add(f)\n }\n return (\n typeof p === 'string' ? regExpEscape(p)\n : p === GLOBSTAR ? GLOBSTAR\n : p._src\n )\n }) as (string | typeof GLOBSTAR)[]\n pp.forEach((p, i) => {\n const next = pp[i + 1]\n const prev = pp[i - 1]\n if (p !== GLOBSTAR || prev === GLOBSTAR) {\n return\n }\n if (prev === undefined) {\n if (next !== undefined && next !== GLOBSTAR) {\n pp[i + 1] = '(?:\\\\/|' + twoStar + '\\\\/)?' + next\n } else {\n pp[i] = twoStar\n }\n } else if (next === undefined) {\n pp[i - 1] = prev + '(?:\\\\/|\\\\/' + twoStar + ')?'\n } else if (next !== GLOBSTAR) {\n pp[i - 1] = prev + '(?:\\\\/|\\\\/' + twoStar + '\\\\/)' + next\n pp[i + 1] = GLOBSTAR\n }\n })\n const filtered = pp.filter(p => p !== GLOBSTAR)\n\n // For partial matches, we need to make the pattern match\n // any prefix of the full path. We do this by generating\n // alternative patterns that match progressively longer prefixes.\n if (this.partial && filtered.length >= 1) {\n const prefixes: string[] = []\n for (let i = 1; i <= filtered.length; i++) {\n prefixes.push(filtered.slice(0, i).join('/'))\n }\n return '(?:' + prefixes.join('|') + ')'\n }\n\n return filtered.join('/')\n })\n .join('|')\n\n // need to wrap in parens if we had more than one thing with |,\n // otherwise only the first will be anchored to ^ and the last to $\n const [open, close] = set.length > 1 ? ['(?:', ')'] : ['', '']\n // must match entire pattern\n // ending in a * or ** will make it less strict.\n re = '^' + open + re + close + '$'\n\n // In partial mode, '/' should always match as it's a valid prefix for any pattern\n if (this.partial) {\n re = '^(?:\\\\/|' + open + re.slice(1, -1) + close + ')$'\n }\n\n // can match anything, as long as it's not this.\n if (this.negate) re = '^(?!' + re + ').+$'\n\n try {\n this.regexp = new RegExp(re, [...flags].join(''))\n /* c8 ignore start */\n } catch (ex) {\n // should be impossible\n this.regexp = false\n }\n /* c8 ignore stop */\n return this.regexp\n }\n\n slashSplit(p: string) {\n // if p starts with // on windows, we preserve that\n // so that UNC paths aren't broken. Otherwise, any number of\n // / characters are coalesced into one, unless\n // preserveMultipleSlashes is set to true.\n if (this.preserveMultipleSlashes) {\n return p.split('/')\n } else if (this.isWindows && /^\\/\\/[^\\/]+/.test(p)) {\n // add an extra '' for the one we lose\n return ['', ...p.split(/\\/+/)]\n } else {\n return p.split(/\\/+/)\n }\n }\n\n match(f: string, partial = this.partial) {\n this.debug('match', f, this.pattern)\n // short-circuit in the case of busted things.\n // comments, etc.\n if (this.comment) {\n return false\n }\n if (this.empty) {\n return f === ''\n }\n\n if (f === '/' && partial) {\n return true\n }\n\n const options = this.options\n\n // windows: need to use /, not \\\n if (this.isWindows) {\n f = f.split('\\\\').join('/')\n }\n\n // treat the test path as a set of pathparts.\n const ff = this.slashSplit(f)\n this.debug(this.pattern, 'split', ff)\n\n // just ONE of the pattern sets in this.set needs to match\n // in order for it to be valid. If negating, then just one\n // match means that we have failed.\n // Either way, return on the first hit.\n\n const set = this.set\n this.debug(this.pattern, 'set', set)\n\n // Find the basename of the path by looking for the last non-empty segment\n let filename: string = ff[ff.length - 1]\n if (!filename) {\n for (let i = ff.length - 2; !filename && i >= 0; i--) {\n filename = ff[i]\n }\n }\n\n for (let i = 0; i < set.length; i++) {\n const pattern = set[i]\n let file = ff\n if (options.matchBase && pattern.length === 1) {\n file = [filename]\n }\n const hit = this.matchOne(file, pattern, partial)\n if (hit) {\n if (options.flipNegate) {\n return true\n }\n return !this.negate\n }\n }\n\n // didn't get any hits. this is success if it's a negative\n // pattern, failure otherwise.\n if (options.flipNegate) {\n return false\n }\n return this.negate\n }\n\n static defaults(def: MinimatchOptions) {\n return minimatch.defaults(def).Minimatch\n }\n}\n/* c8 ignore start */\nexport { AST } from './ast.js'\nexport { escape } from './escape.js'\nexport { unescape } from './unescape.js'\n/* c8 ignore stop */\nminimatch.AST = AST\nminimatch.Minimatch = Minimatch\nminimatch.escape = escape\nminimatch.unescape = unescape\n"]} \ No newline at end of file diff --git a/deps/minimatch/dist/commonjs/unescape.js b/deps/minimatch/dist/commonjs/unescape.js index 171098d8a4ceb5..db8d0c847d21b1 100644 --- a/deps/minimatch/dist/commonjs/unescape.js +++ b/deps/minimatch/dist/commonjs/unescape.js @@ -22,14 +22,14 @@ exports.unescape = void 0; */ const unescape = (s, { windowsPathsNoEscape = false, magicalBraces = true, } = {}) => { if (magicalBraces) { - return windowsPathsNoEscape - ? s.replace(/\[([^\/\\])\]/g, '$1') + return windowsPathsNoEscape ? + s.replace(/\[([^\/\\])\]/g, '$1') : s .replace(/((?!\\).|^)\[([^\/\\])\]/g, '$1$2') .replace(/\\([^\/])/g, '$1'); } - return windowsPathsNoEscape - ? s.replace(/\[([^\/\\{}])\]/g, '$1') + return windowsPathsNoEscape ? + s.replace(/\[([^\/\\{}])\]/g, '$1') : s .replace(/((?!\\).|^)\[([^\/\\{}])\]/g, '$1$2') .replace(/\\([^\/{}])/g, '$1'); diff --git a/deps/minimatch/dist/commonjs/unescape.js.map b/deps/minimatch/dist/commonjs/unescape.js.map index c66031e863239c..8039823a097313 100644 --- a/deps/minimatch/dist/commonjs/unescape.js.map +++ b/deps/minimatch/dist/commonjs/unescape.js.map @@ -1 +1 @@ -{"version":3,"file":"unescape.js","sourceRoot":"","sources":["../../src/unescape.ts"],"names":[],"mappings":";;;AAEA;;;;;;;;;;;;;;;;;;GAkBG;AAEI,MAAM,QAAQ,GAAG,CACtB,CAAS,EACT,EACE,oBAAoB,GAAG,KAAK,EAC5B,aAAa,GAAG,IAAI,MACgD,EAAE,EACxE,EAAE;IACF,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,oBAAoB;YACzB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC;YACnC,CAAC,CAAC,CAAC;iBACE,OAAO,CAAC,2BAA2B,EAAE,MAAM,CAAC;iBAC5C,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,CAAA;IACpC,CAAC;IACD,OAAO,oBAAoB;QACzB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,IAAI,CAAC;QACrC,CAAC,CAAC,CAAC;aACE,OAAO,CAAC,6BAA6B,EAAE,MAAM,CAAC;aAC9C,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,CAAA;AACtC,CAAC,CAAA;AAnBY,QAAA,QAAQ,YAmBpB","sourcesContent":["import { MinimatchOptions } from './index.js'\n\n/**\n * Un-escape a string that has been escaped with {@link escape}.\n *\n * If the {@link MinimatchOptions.windowsPathsNoEscape} option is used, then\n * square-bracket escapes are removed, but not backslash escapes.\n *\n * For example, it will turn the string `'[*]'` into `*`, but it will not\n * turn `'\\\\*'` into `'*'`, because `\\` is a path separator in\n * `windowsPathsNoEscape` mode.\n *\n * When `windowsPathsNoEscape` is not set, then both square-bracket escapes and\n * backslash escapes are removed.\n *\n * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped\n * or unescaped.\n *\n * When `magicalBraces` is not set, escapes of braces (`{` and `}`) will not be\n * unescaped.\n */\n\nexport const unescape = (\n s: string,\n {\n windowsPathsNoEscape = false,\n magicalBraces = true,\n }: Pick<MinimatchOptions, 'windowsPathsNoEscape' | 'magicalBraces'> = {},\n) => {\n if (magicalBraces) {\n return windowsPathsNoEscape\n ? s.replace(/\\[([^\\/\\\\])\\]/g, '$1')\n : s\n .replace(/((?!\\\\).|^)\\[([^\\/\\\\])\\]/g, '$1$2')\n .replace(/\\\\([^\\/])/g, '$1')\n }\n return windowsPathsNoEscape\n ? s.replace(/\\[([^\\/\\\\{}])\\]/g, '$1')\n : s\n .replace(/((?!\\\\).|^)\\[([^\\/\\\\{}])\\]/g, '$1$2')\n .replace(/\\\\([^\\/{}])/g, '$1')\n}\n"]} \ No newline at end of file +{"version":3,"file":"unescape.js","sourceRoot":"","sources":["../../src/unescape.ts"],"names":[],"mappings":";;;AAEA;;;;;;;;;;;;;;;;;;GAkBG;AAEI,MAAM,QAAQ,GAAG,CACtB,CAAS,EACT,EACE,oBAAoB,GAAG,KAAK,EAC5B,aAAa,GAAG,IAAI,MACgD,EAAE,EACxE,EAAE;IACF,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,oBAAoB,CAAC,CAAC;YACzB,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC;YACnC,CAAC,CAAC,CAAC;iBACE,OAAO,CAAC,2BAA2B,EAAE,MAAM,CAAC;iBAC5C,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,CAAA;IACpC,CAAC;IACD,OAAO,oBAAoB,CAAC,CAAC;QACzB,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,IAAI,CAAC;QACrC,CAAC,CAAC,CAAC;aACE,OAAO,CAAC,6BAA6B,EAAE,MAAM,CAAC;aAC9C,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,CAAA;AACtC,CAAC,CAAA;AAnBY,QAAA,QAAQ,YAmBpB","sourcesContent":["import { MinimatchOptions } from './index.js'\n\n/**\n * Un-escape a string that has been escaped with {@link escape}.\n *\n * If the {@link MinimatchOptions.windowsPathsNoEscape} option is used, then\n * square-bracket escapes are removed, but not backslash escapes.\n *\n * For example, it will turn the string `'[*]'` into `*`, but it will not\n * turn `'\\\\*'` into `'*'`, because `\\` is a path separator in\n * `windowsPathsNoEscape` mode.\n *\n * When `windowsPathsNoEscape` is not set, then both square-bracket escapes and\n * backslash escapes are removed.\n *\n * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped\n * or unescaped.\n *\n * When `magicalBraces` is not set, escapes of braces (`{` and `}`) will not be\n * unescaped.\n */\n\nexport const unescape = (\n s: string,\n {\n windowsPathsNoEscape = false,\n magicalBraces = true,\n }: Pick<MinimatchOptions, 'windowsPathsNoEscape' | 'magicalBraces'> = {},\n) => {\n if (magicalBraces) {\n return windowsPathsNoEscape ?\n s.replace(/\\[([^\\/\\\\])\\]/g, '$1')\n : s\n .replace(/((?!\\\\).|^)\\[([^\\/\\\\])\\]/g, '$1$2')\n .replace(/\\\\([^\\/])/g, '$1')\n }\n return windowsPathsNoEscape ?\n s.replace(/\\[([^\\/\\\\{}])\\]/g, '$1')\n : s\n .replace(/((?!\\\\).|^)\\[([^\\/\\\\{}])\\]/g, '$1$2')\n .replace(/\\\\([^\\/{}])/g, '$1')\n}\n"]} \ No newline at end of file diff --git a/deps/minimatch/dist/esm/assert-valid-pattern.d.ts b/deps/minimatch/dist/esm/assert-valid-pattern.d.ts index 8e318b23a033e2..34d7a78a0c5144 100644 --- a/deps/minimatch/dist/esm/assert-valid-pattern.d.ts +++ b/deps/minimatch/dist/esm/assert-valid-pattern.d.ts @@ -1,2 +1,2 @@ -export declare const assertValidPattern: (pattern: any) => void; +export declare const assertValidPattern: (pattern: unknown) => void; //# sourceMappingURL=assert-valid-pattern.d.ts.map \ No newline at end of file diff --git a/deps/minimatch/dist/esm/assert-valid-pattern.d.ts.map b/deps/minimatch/dist/esm/assert-valid-pattern.d.ts.map index c61c0310949955..30ddcd51f6eae8 100644 --- a/deps/minimatch/dist/esm/assert-valid-pattern.d.ts.map +++ b/deps/minimatch/dist/esm/assert-valid-pattern.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"assert-valid-pattern.d.ts","sourceRoot":"","sources":["../../src/assert-valid-pattern.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,kBAAkB,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAUlD,CAAA"} \ No newline at end of file +{"version":3,"file":"assert-valid-pattern.d.ts","sourceRoot":"","sources":["../../src/assert-valid-pattern.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,kBAAkB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAUtD,CAAA"} \ No newline at end of file diff --git a/deps/minimatch/dist/esm/assert-valid-pattern.js.map b/deps/minimatch/dist/esm/assert-valid-pattern.js.map index c4cd82a9796970..550f61df5a845c 100644 --- a/deps/minimatch/dist/esm/assert-valid-pattern.js.map +++ b/deps/minimatch/dist/esm/assert-valid-pattern.js.map @@ -1 +1 @@ -{"version":3,"file":"assert-valid-pattern.js","sourceRoot":"","sources":["../../src/assert-valid-pattern.ts"],"names":[],"mappings":"AAAA,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAE,CAAA;AACpC,MAAM,CAAC,MAAM,kBAAkB,GAA2B,CACxD,OAAY,EACe,EAAE;IAC7B,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,MAAM,IAAI,SAAS,CAAC,iBAAiB,CAAC,CAAA;IACxC,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,GAAG,kBAAkB,EAAE,CAAC;QACxC,MAAM,IAAI,SAAS,CAAC,qBAAqB,CAAC,CAAA;IAC5C,CAAC;AACH,CAAC,CAAA","sourcesContent":["const MAX_PATTERN_LENGTH = 1024 * 64\nexport const assertValidPattern: (pattern: any) => void = (\n pattern: any,\n): asserts pattern is string => {\n if (typeof pattern !== 'string') {\n throw new TypeError('invalid pattern')\n }\n\n if (pattern.length > MAX_PATTERN_LENGTH) {\n throw new TypeError('pattern is too long')\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"assert-valid-pattern.js","sourceRoot":"","sources":["../../src/assert-valid-pattern.ts"],"names":[],"mappings":"AAAA,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAE,CAAA;AACpC,MAAM,CAAC,MAAM,kBAAkB,GAA+B,CAC5D,OAAgB,EACW,EAAE;IAC7B,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,MAAM,IAAI,SAAS,CAAC,iBAAiB,CAAC,CAAA;IACxC,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,GAAG,kBAAkB,EAAE,CAAC;QACxC,MAAM,IAAI,SAAS,CAAC,qBAAqB,CAAC,CAAA;IAC5C,CAAC;AACH,CAAC,CAAA","sourcesContent":["const MAX_PATTERN_LENGTH = 1024 * 64\nexport const assertValidPattern: (pattern: unknown) => void = (\n pattern: unknown,\n): asserts pattern is string => {\n if (typeof pattern !== 'string') {\n throw new TypeError('invalid pattern')\n }\n\n if (pattern.length > MAX_PATTERN_LENGTH) {\n throw new TypeError('pattern is too long')\n }\n}\n"]} \ No newline at end of file diff --git a/deps/minimatch/dist/esm/ast.d.ts b/deps/minimatch/dist/esm/ast.d.ts index b8c1e5448e6392..27845ea71fb977 100644 --- a/deps/minimatch/dist/esm/ast.d.ts +++ b/deps/minimatch/dist/esm/ast.d.ts @@ -3,6 +3,8 @@ export type ExtglobType = '!' | '?' | '+' | '*' | '@'; export declare class AST { #private; type: ExtglobType | null; + id: number; + get depth(): number; constructor(type: ExtglobType | null, parent?: AST, options?: MinimatchOptions); get hasMagic(): boolean | undefined; toString(): string; diff --git a/deps/minimatch/dist/esm/ast.d.ts.map b/deps/minimatch/dist/esm/ast.d.ts.map index e15945067ab3a1..ec7f7898870ff2 100644 --- a/deps/minimatch/dist/esm/ast.d.ts.map +++ b/deps/minimatch/dist/esm/ast.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../../src/ast.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAwCvD,MAAM,MAAM,WAAW,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;AAkCrD,qBAAa,GAAG;;IACd,IAAI,EAAE,WAAW,GAAG,IAAI,CAAA;gBAiBtB,IAAI,EAAE,WAAW,GAAG,IAAI,EACxB,MAAM,CAAC,EAAE,GAAG,EACZ,OAAO,GAAE,gBAAqB;IAahC,IAAI,QAAQ,IAAI,OAAO,GAAG,SAAS,CAUlC;IAGD,QAAQ,IAAI,MAAM;IA+ClB,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,MAAM,GAAG,GAAG,CAAC,EAAE;IAY/B,MAAM;IAgBN,OAAO,IAAI,OAAO;IAgBlB,KAAK,IAAI,OAAO;IAYhB,MAAM,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM;IAKzB,KAAK,CAAC,MAAM,EAAE,GAAG;IAsIjB,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB;IAQ/D,WAAW,IAAI,QAAQ,GAAG,MAAM;IA2BhC,IAAI,OAAO,qBAEV;IAuED,cAAc,CACZ,QAAQ,CAAC,EAAE,OAAO,GACjB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC;CAmMjE"} \ No newline at end of file +{"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../../src/ast.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAwCvD,MAAM,MAAM,WAAW,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;AA6IrD,qBAAa,GAAG;;IACd,IAAI,EAAE,WAAW,GAAG,IAAI,CAAA;IAexB,EAAE,SAAO;IAET,IAAI,KAAK,IAAI,MAAM,CAElB;gBAgBC,IAAI,EAAE,WAAW,GAAG,IAAI,EACxB,MAAM,CAAC,EAAE,GAAG,EACZ,OAAO,GAAE,gBAAqB;IAahC,IAAI,QAAQ,IAAI,OAAO,GAAG,SAAS,CAUlC;IAGD,QAAQ,IAAI,MAAM;IA+ClB,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,MAAM,GAAG,GAAG,CAAC,EAAE;IAe/B,MAAM;IAkBN,OAAO,IAAI,OAAO;IAgBlB,KAAK,IAAI,OAAO;IAYhB,MAAM,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM;IAKzB,KAAK,CAAC,MAAM,EAAE,GAAG;IAwQjB,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB;IAQ/D,WAAW,IAAI,QAAQ,GAAG,MAAM;IA2BhC,IAAI,OAAO,qBAEV;IAuED,cAAc,CACZ,QAAQ,CAAC,EAAE,OAAO,GACjB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC;CA6OjE"} \ No newline at end of file diff --git a/deps/minimatch/dist/esm/ast.js b/deps/minimatch/dist/esm/ast.js index e4547b16131b6c..943a86ceb43ac1 100644 --- a/deps/minimatch/dist/esm/ast.js +++ b/deps/minimatch/dist/esm/ast.js @@ -1,8 +1,110 @@ // parse a single path portion +var _a; import { parseClass } from './brace-expressions.js'; import { unescape } from './unescape.js'; const types = new Set(['!', '?', '+', '*', '@']); const isExtglobType = (c) => types.has(c); +const isExtglobAST = (c) => isExtglobType(c.type); +// Map of which extglob types can adopt the children of a nested extglob +// +// anything but ! can adopt a matching type: +// +(a|+(b|c)|d) => +(a|b|c|d) +// *(a|*(b|c)|d) => *(a|b|c|d) +// @(a|@(b|c)|d) => @(a|b|c|d) +// ?(a|?(b|c)|d) => ?(a|b|c|d) +// +// * can adopt anything, because 0 or repetition is allowed +// *(a|?(b|c)|d) => *(a|b|c|d) +// *(a|+(b|c)|d) => *(a|b|c|d) +// *(a|@(b|c)|d) => *(a|b|c|d) +// +// + can adopt @, because 1 or repetition is allowed +// +(a|@(b|c)|d) => +(a|b|c|d) +// +// + and @ CANNOT adopt *, because 0 would be allowed +// +(a|*(b|c)|d) => would match "", on *(b|c) +// @(a|*(b|c)|d) => would match "", on *(b|c) +// +// + and @ CANNOT adopt ?, because 0 would be allowed +// +(a|?(b|c)|d) => would match "", on ?(b|c) +// @(a|?(b|c)|d) => would match "", on ?(b|c) +// +// ? can adopt @, because 0 or 1 is allowed +// ?(a|@(b|c)|d) => ?(a|b|c|d) +// +// ? and @ CANNOT adopt * or +, because >1 would be allowed +// ?(a|*(b|c)|d) => would match bbb on *(b|c) +// @(a|*(b|c)|d) => would match bbb on *(b|c) +// ?(a|+(b|c)|d) => would match bbb on +(b|c) +// @(a|+(b|c)|d) => would match bbb on +(b|c) +// +// ! CANNOT adopt ! (nothing else can either) +// !(a|!(b|c)|d) => !(a|b|c|d) would fail to match on b (not not b|c) +// +// ! can adopt @ +// !(a|@(b|c)|d) => !(a|b|c|d) +// +// ! CANNOT adopt * +// !(a|*(b|c)|d) => !(a|b|c|d) would match on bbb, not allowed +// +// ! CANNOT adopt + +// !(a|+(b|c)|d) => !(a|b|c|d) would match on bbb, not allowed +// +// ! CANNOT adopt ? +// x!(a|?(b|c)|d) => x!(a|b|c|d) would fail to match "x" +const adoptionMap = new Map([ + ['!', ['@']], + ['?', ['?', '@']], + ['@', ['@']], + ['*', ['*', '+', '?', '@']], + ['+', ['+', '@']], +]); +// nested extglobs that can be adopted in, but with the addition of +// a blank '' element. +const adoptionWithSpaceMap = new Map([ + ['!', ['?']], + ['@', ['?']], + ['+', ['?', '*']], +]); +// union of the previous two maps +const adoptionAnyMap = new Map([ + ['!', ['?', '@']], + ['?', ['?', '@']], + ['@', ['?', '@']], + ['*', ['*', '+', '?', '@']], + ['+', ['+', '@', '?', '*']], +]); +// Extglobs that can take over their parent if they are the only child +// the key is parent, value maps child to resulting extglob parent type +// '@' is omitted because it's a special case. An `@` extglob with a single +// member can always be usurped by that subpattern. +const usurpMap = new Map([ + ['!', new Map([['!', '@']])], + [ + '?', + new Map([ + ['*', '*'], + ['+', '*'], + ]), + ], + [ + '@', + new Map([ + ['!', '!'], + ['?', '?'], + ['@', '@'], + ['*', '*'], + ['+', '+'], + ]), + ], + [ + '+', + new Map([ + ['?', '*'], + ['*', '*'], + ]), + ], +]); // Patterns that get prepended to bind to the start of either the // entire string, or just a single path portion, to prevent dots // and/or traversal patterns, when needed. @@ -26,6 +128,7 @@ const star = qmark + '*?'; const starNoEmpty = qmark + '+?'; // remove the \ chars that we added if we end up doing a nonmagic compare // const deslash = (s: string) => s.replace(/\\(.)/g, '$1') +let ID = 0; export class AST { type; #root; @@ -41,6 +144,22 @@ export class AST { // set to true if it's an extglob with no children // (which really means one child of '') #emptyExt = false; + id = ++ID; + get depth() { + return (this.#parent?.depth ?? -1) + 1; + } + [Symbol.for('nodejs.util.inspect.custom')]() { + return { + '@@type': 'AST', + id: this.id, + type: this.type, + root: this.#root.id, + parent: this.#parent?.id, + depth: this.depth, + partsLength: this.#parts.length, + parts: this.#parts, + }; + } constructor(type, parent, options = {}) { this.type = type; // extglobs are inherently magical @@ -119,7 +238,8 @@ export class AST { if (p === '') continue; /* c8 ignore start */ - if (typeof p !== 'string' && !(p instanceof AST && p.#parent === this)) { + if (typeof p !== 'string' && + !(p instanceof _a && p.#parent === this)) { throw new Error('invalid part: ' + p); } /* c8 ignore stop */ @@ -127,8 +247,10 @@ export class AST { } } toJSON() { - const ret = this.type === null - ? this.#parts.slice().map(p => (typeof p === 'string' ? p : p.toJSON())) + const ret = this.type === null ? + this.#parts + .slice() + .map(p => (typeof p === 'string' ? p : p.toJSON())) : [this.type, ...this.#parts.map(p => p.toJSON())]; if (this.isStart() && !this.type) ret.unshift([]); @@ -151,7 +273,7 @@ export class AST { const p = this.#parent; for (let i = 0; i < this.#parentIndex; i++) { const pp = p.#parts[i]; - if (!(pp instanceof AST && pp.type === '!')) { + if (!(pp instanceof _a && pp.type === '!')) { return false; } } @@ -179,13 +301,14 @@ export class AST { this.push(part.clone(this)); } clone(parent) { - const c = new AST(this.type, parent); + const c = new _a(this.type, parent); for (const p of this.#parts) { c.copyIn(p); } return c; } - static #parseAST(str, ast, pos, opt) { + static #parseAST(str, ast, pos, opt, extDepth) { + const maxDepth = opt.maxExtglobRecursion ?? 2; let escaping = false; let inBrace = false; let braceStart = -1; @@ -222,11 +345,17 @@ export class AST { acc += c; continue; } - if (!opt.noext && isExtglobType(c) && str.charAt(i) === '(') { + // we don't have to check for adoption here, because that's + // done at the other recursion point. + const doRecurse = !opt.noext && + isExtglobType(c) && + str.charAt(i) === '(' && + extDepth <= maxDepth; + if (doRecurse) { ast.push(acc); acc = ''; - const ext = new AST(c, ast); - i = AST.#parseAST(str, ext, i, opt); + const ext = new _a(c, ast); + i = _a.#parseAST(str, ext, i, opt, extDepth + 1); ast.push(ext); continue; } @@ -238,7 +367,7 @@ export class AST { // some kind of extglob, pos is at the ( // find the next | or ) let i = pos + 1; - let part = new AST(null, ast); + let part = new _a(null, ast); const parts = []; let acc = ''; while (i < str.length) { @@ -269,19 +398,26 @@ export class AST { acc += c; continue; } - if (isExtglobType(c) && str.charAt(i) === '(') { + const doRecurse = !opt.noext && + isExtglobType(c) && + str.charAt(i) === '(' && + /* c8 ignore start - the maxDepth is sufficient here */ + (extDepth <= maxDepth || (ast && ast.#canAdoptType(c))); + /* c8 ignore stop */ + if (doRecurse) { + const depthAdd = ast && ast.#canAdoptType(c) ? 0 : 1; part.push(acc); acc = ''; - const ext = new AST(c, part); + const ext = new _a(c, part); part.push(ext); - i = AST.#parseAST(str, ext, i, opt); + i = _a.#parseAST(str, ext, i, opt, extDepth + depthAdd); continue; } if (c === '|') { part.push(acc); acc = ''; parts.push(part); - part = new AST(null, ast); + part = new _a(null, ast); continue; } if (c === ')') { @@ -303,9 +439,82 @@ export class AST { ast.#parts = [str.substring(pos - 1)]; return i; } + #canAdoptWithSpace(child) { + return this.#canAdopt(child, adoptionWithSpaceMap); + } + #canAdopt(child, map = adoptionMap) { + if (!child || + typeof child !== 'object' || + child.type !== null || + child.#parts.length !== 1 || + this.type === null) { + return false; + } + const gc = child.#parts[0]; + if (!gc || typeof gc !== 'object' || gc.type === null) { + return false; + } + return this.#canAdoptType(gc.type, map); + } + #canAdoptType(c, map = adoptionAnyMap) { + return !!map.get(this.type)?.includes(c); + } + #adoptWithSpace(child, index) { + const gc = child.#parts[0]; + const blank = new _a(null, gc, this.options); + blank.#parts.push(''); + gc.push(blank); + this.#adopt(child, index); + } + #adopt(child, index) { + const gc = child.#parts[0]; + this.#parts.splice(index, 1, ...gc.#parts); + for (const p of gc.#parts) { + if (typeof p === 'object') + p.#parent = this; + } + this.#toString = undefined; + } + #canUsurpType(c) { + const m = usurpMap.get(this.type); + return !!(m?.has(c)); + } + #canUsurp(child) { + if (!child || + typeof child !== 'object' || + child.type !== null || + child.#parts.length !== 1 || + this.type === null || + this.#parts.length !== 1) { + return false; + } + const gc = child.#parts[0]; + if (!gc || typeof gc !== 'object' || gc.type === null) { + return false; + } + return this.#canUsurpType(gc.type); + } + #usurp(child) { + const m = usurpMap.get(this.type); + const gc = child.#parts[0]; + const nt = m?.get(gc.type); + /* c8 ignore start - impossible */ + if (!nt) + return false; + /* c8 ignore stop */ + this.#parts = gc.#parts; + for (const p of this.#parts) { + if (typeof p === 'object') { + p.#parent = this; + } + } + this.type = nt; + this.#toString = undefined; + this.#emptyExt = false; + } static fromGlob(pattern, options = {}) { - const ast = new AST(null, undefined, options); - AST.#parseAST(pattern, ast, 0, options); + const ast = new _a(null, undefined, options); + _a.#parseAST(pattern, ast, 0, options, 0); return ast; } // returns the regular expression if there's magic, or the unescaped @@ -409,16 +618,18 @@ export class AST { // or start or whatever) and prepend ^ or / at the Regexp construction. toRegExpSource(allowDot) { const dot = allowDot ?? !!this.#options.dot; - if (this.#root === this) + if (this.#root === this) { + this.#flatten(); this.#fillNegs(); - if (!this.type) { + } + if (!isExtglobAST(this)) { const noEmpty = this.isStart() && this.isEnd() && !this.#parts.some(s => typeof s !== 'string'); const src = this.#parts .map(p => { - const [re, _, hasMagic, uflag] = typeof p === 'string' - ? AST.#parseGlob(p, this.#hasMagic, noEmpty) + const [re, _, hasMagic, uflag] = typeof p === 'string' ? + _a.#parseGlob(p, this.#hasMagic, noEmpty) : p.toRegExpSource(allowDot); this.#hasMagic = this.#hasMagic || hasMagic; this.#uflag = this.#uflag || uflag; @@ -447,7 +658,10 @@ export class AST { // no need to prevent dots if it can't match a dot, or if a // sub-pattern will be preventing it anyway. const needNoDot = !dot && !allowDot && aps.has(src.charAt(0)); - start = needNoTrav ? startNoTraversal : needNoDot ? startNoDot : ''; + start = + needNoTrav ? startNoTraversal + : needNoDot ? startNoDot + : ''; } } } @@ -477,14 +691,14 @@ export class AST { // invalid extglob, has to at least be *something* present, if it's // the entire path portion. const s = this.toString(); - this.#parts = [s]; - this.type = null; - this.#hasMagic = undefined; + const me = this; + me.#parts = [s]; + me.type = null; + me.#hasMagic = undefined; return [s, unescape(this.toString()), false, false]; } - // XXX abstract out this map method - let bodyDotAllowed = !repeated || allowDot || dot || !startNoDot - ? '' + let bodyDotAllowed = !repeated || allowDot || dot || !startNoDot ? + '' : this.#partsToRegExp(true); if (bodyDotAllowed === body) { bodyDotAllowed = ''; @@ -498,20 +712,16 @@ export class AST { final = (this.isStart() && !dot ? startNoDot : '') + starNoEmpty; } else { - const close = this.type === '!' - ? // !() must match something,but !(x) can match '' - '))' + - (this.isStart() && !dot && !allowDot ? startNoDot : '') + - star + - ')' - : this.type === '@' - ? ')' - : this.type === '?' - ? ')?' - : this.type === '+' && bodyDotAllowed - ? ')' - : this.type === '*' && bodyDotAllowed - ? `)?` + const close = this.type === '!' ? + // !() must match something,but !(x) can match '' + '))' + + (this.isStart() && !dot && !allowDot ? startNoDot : '') + + star + + ')' + : this.type === '@' ? ')' + : this.type === '?' ? ')?' + : this.type === '+' && bodyDotAllowed ? ')' + : this.type === '*' && bodyDotAllowed ? `)?` : `)${this.type}`; final = start + body + close; } @@ -522,6 +732,42 @@ export class AST { this.#uflag, ]; } + #flatten() { + if (!isExtglobAST(this)) { + for (const p of this.#parts) { + if (typeof p === 'object') { + p.#flatten(); + } + } + } + else { + // do up to 10 passes to flatten as much as possible + let iterations = 0; + let done = false; + do { + done = true; + for (let i = 0; i < this.#parts.length; i++) { + const c = this.#parts[i]; + if (typeof c === 'object') { + c.#flatten(); + if (this.#canAdopt(c)) { + done = false; + this.#adopt(c, i); + } + else if (this.#canAdoptWithSpace(c)) { + done = false; + this.#adoptWithSpace(c, i); + } + else if (this.#canUsurp(c)) { + done = false; + this.#usurp(c); + } + } + } + } while (!done && ++iterations < 10); + } + this.#toString = undefined; + } #partsToRegExp(dot) { return this.#parts .map(p => { @@ -543,6 +789,8 @@ export class AST { let escaping = false; let re = ''; let uflag = false; + // multiple stars that aren't globstars coalesce into one * + let inStar = false; for (let i = 0; i < glob.length; i++) { const c = glob.charAt(i); if (escaping) { @@ -550,6 +798,17 @@ export class AST { re += (reSpecials.has(c) ? '\\' : '') + c; continue; } + if (c === '*') { + if (inStar) + continue; + inStar = true; + re += noEmpty && /^[*]+$/.test(glob) ? starNoEmpty : star; + hasMagic = true; + continue; + } + else { + inStar = false; + } if (c === '\\') { if (i === glob.length - 1) { re += '\\\\'; @@ -569,11 +828,6 @@ export class AST { continue; } } - if (c === '*') { - re += noEmpty && glob === '*' ? starNoEmpty : star; - hasMagic = true; - continue; - } if (c === '?') { re += qmark; hasMagic = true; @@ -584,4 +838,5 @@ export class AST { return [re, unescape(glob), !!hasMagic, uflag]; } } +_a = AST; //# sourceMappingURL=ast.js.map \ No newline at end of file diff --git a/deps/minimatch/dist/esm/ast.js.map b/deps/minimatch/dist/esm/ast.js.map index 87bc3f24662158..abf30629460b79 100644 --- a/deps/minimatch/dist/esm/ast.js.map +++ b/deps/minimatch/dist/esm/ast.js.map @@ -1 +1 @@ -{"version":3,"file":"ast.js","sourceRoot":"","sources":["../../src/ast.ts"],"names":[],"mappings":"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","sourcesContent":["// parse a single path portion\n\nimport { parseClass } from './brace-expressions.js'\nimport { MinimatchOptions, MMRegExp } from './index.js'\nimport { unescape } from './unescape.js'\n\n// classes [] are handled by the parseClass method\n// for positive extglobs, we sub-parse the contents, and combine,\n// with the appropriate regexp close.\n// for negative extglobs, we sub-parse the contents, but then\n// have to include the rest of the pattern, then the parent, etc.,\n// as the thing that cannot be because RegExp negative lookaheads\n// are different from globs.\n//\n// So for example:\n// a@(i|w!(x|y)z|j)b => ^a(i|w((!?(x|y)zb).*)z|j)b$\n// 1 2 3 4 5 6 1 2 3 46 5 6\n//\n// Assembling the extglob requires not just the negated patterns themselves,\n// but also anything following the negative patterns up to the boundary\n// of the current pattern, plus anything following in the parent pattern.\n//\n//\n// So, first, we parse the string into an AST of extglobs, without turning\n// anything into regexps yet.\n//\n// ['a', {@ [['i'], ['w', {!['x', 'y']}, 'z'], ['j']]}, 'b']\n//\n// Then, for all the negative extglobs, we append whatever comes after in\n// each parent as their tail\n//\n// ['a', {@ [['i'], ['w', {!['x', 'y'], 'z', 'b'}, 'z'], ['j']]}, 'b']\n//\n// Lastly, we turn each of these pieces into a regexp, and join\n//\n// v----- .* because there's more following,\n// v v otherwise, .+ because it must be\n// v v *something* there.\n// ['^a', {@ ['i', 'w(?:(!?(?:x|y).*zb$).*)z', 'j' ]}, 'b$']\n// copy what follows into here--^^^^^\n// ['^a', '(?:i|w(?:(?!(?:x|y).*zb$).*)z|j)', 'b$']\n// ['^a(?:i|w(?:(?!(?:x|y).*zb$).*)z|j)b$']\n\nexport type ExtglobType = '!' | '?' | '+' | '*' | '@'\nconst types = new Set<ExtglobType>(['!', '?', '+', '*', '@'])\nconst isExtglobType = (c: string): c is ExtglobType =>\n types.has(c as ExtglobType)\n\n// Patterns that get prepended to bind to the start of either the\n// entire string, or just a single path portion, to prevent dots\n// and/or traversal patterns, when needed.\n// Exts don't need the ^ or / bit, because the root binds that already.\nconst startNoTraversal = '(?!(?:^|/)\\\\.\\\\.?(?:$|/))'\nconst startNoDot = '(?!\\\\.)'\n\n// characters that indicate a start of pattern needs the \"no dots\" bit,\n// because a dot *might* be matched. ( is not in the list, because in\n// the case of a child extglob, it will handle the prevention itself.\nconst addPatternStart = new Set(['[', '.'])\n// cases where traversal is A-OK, no dot prevention needed\nconst justDots = new Set(['..', '.'])\nconst reSpecials = new Set('().*{}+?[]^$\\\\!')\nconst regExpEscape = (s: string) =>\n s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\n// any single thing other than /\nconst qmark = '[^/]'\n\n// * => any number of characters\nconst star = qmark + '*?'\n// use + when we need to ensure that *something* matches, because the * is\n// the only thing in the path portion.\nconst starNoEmpty = qmark + '+?'\n\n// remove the \\ chars that we added if we end up doing a nonmagic compare\n// const deslash = (s: string) => s.replace(/\\\\(.)/g, '$1')\n\nexport class AST {\n type: ExtglobType | null\n readonly #root: AST\n\n #hasMagic?: boolean\n #uflag: boolean = false\n #parts: (string | AST)[] = []\n readonly #parent?: AST\n readonly #parentIndex: number\n #negs: AST[]\n #filledNegs: boolean = false\n #options: MinimatchOptions\n #toString?: string\n // set to true if it's an extglob with no children\n // (which really means one child of '')\n #emptyExt: boolean = false\n\n constructor(\n type: ExtglobType | null,\n parent?: AST,\n options: MinimatchOptions = {},\n ) {\n this.type = type\n // extglobs are inherently magical\n if (type) this.#hasMagic = true\n this.#parent = parent\n this.#root = this.#parent ? this.#parent.#root : this\n this.#options = this.#root === this ? options : this.#root.#options\n this.#negs = this.#root === this ? [] : this.#root.#negs\n if (type === '!' && !this.#root.#filledNegs) this.#negs.push(this)\n this.#parentIndex = this.#parent ? this.#parent.#parts.length : 0\n }\n\n get hasMagic(): boolean | undefined {\n /* c8 ignore start */\n if (this.#hasMagic !== undefined) return this.#hasMagic\n /* c8 ignore stop */\n for (const p of this.#parts) {\n if (typeof p === 'string') continue\n if (p.type || p.hasMagic) return (this.#hasMagic = true)\n }\n // note: will be undefined until we generate the regexp src and find out\n return this.#hasMagic\n }\n\n // reconstructs the pattern\n toString(): string {\n if (this.#toString !== undefined) return this.#toString\n if (!this.type) {\n return (this.#toString = this.#parts.map(p => String(p)).join(''))\n } else {\n return (this.#toString =\n this.type + '(' + this.#parts.map(p => String(p)).join('|') + ')')\n }\n }\n\n #fillNegs() {\n /* c8 ignore start */\n if (this !== this.#root) throw new Error('should only call on root')\n if (this.#filledNegs) return this\n /* c8 ignore stop */\n\n // call toString() once to fill this out\n this.toString()\n this.#filledNegs = true\n let n: AST | undefined\n while ((n = this.#negs.pop())) {\n if (n.type !== '!') continue\n // walk up the tree, appending everthing that comes AFTER parentIndex\n let p: AST | undefined = n\n let pp = p.#parent\n while (pp) {\n for (\n let i = p.#parentIndex + 1;\n !pp.type && i < pp.#parts.length;\n i++\n ) {\n for (const part of n.#parts) {\n /* c8 ignore start */\n if (typeof part === 'string') {\n throw new Error('string part in extglob AST??')\n }\n /* c8 ignore stop */\n part.copyIn(pp.#parts[i])\n }\n }\n p = pp\n pp = p.#parent\n }\n }\n return this\n }\n\n push(...parts: (string | AST)[]) {\n for (const p of parts) {\n if (p === '') continue\n /* c8 ignore start */\n if (typeof p !== 'string' && !(p instanceof AST && p.#parent === this)) {\n throw new Error('invalid part: ' + p)\n }\n /* c8 ignore stop */\n this.#parts.push(p)\n }\n }\n\n toJSON() {\n const ret: any[] =\n this.type === null\n ? this.#parts.slice().map(p => (typeof p === 'string' ? p : p.toJSON()))\n : [this.type, ...this.#parts.map(p => (p as AST).toJSON())]\n if (this.isStart() && !this.type) ret.unshift([])\n if (\n this.isEnd() &&\n (this === this.#root ||\n (this.#root.#filledNegs && this.#parent?.type === '!'))\n ) {\n ret.push({})\n }\n return ret\n }\n\n isStart(): boolean {\n if (this.#root === this) return true\n // if (this.type) return !!this.#parent?.isStart()\n if (!this.#parent?.isStart()) return false\n if (this.#parentIndex === 0) return true\n // if everything AHEAD of this is a negation, then it's still the \"start\"\n const p = this.#parent\n for (let i = 0; i < this.#parentIndex; i++) {\n const pp = p.#parts[i]\n if (!(pp instanceof AST && pp.type === '!')) {\n return false\n }\n }\n return true\n }\n\n isEnd(): boolean {\n if (this.#root === this) return true\n if (this.#parent?.type === '!') return true\n if (!this.#parent?.isEnd()) return false\n if (!this.type) return this.#parent?.isEnd()\n // if not root, it'll always have a parent\n /* c8 ignore start */\n const pl = this.#parent ? this.#parent.#parts.length : 0\n /* c8 ignore stop */\n return this.#parentIndex === pl - 1\n }\n\n copyIn(part: AST | string) {\n if (typeof part === 'string') this.push(part)\n else this.push(part.clone(this))\n }\n\n clone(parent: AST) {\n const c = new AST(this.type, parent)\n for (const p of this.#parts) {\n c.copyIn(p)\n }\n return c\n }\n\n static #parseAST(\n str: string,\n ast: AST,\n pos: number,\n opt: MinimatchOptions,\n ): number {\n let escaping = false\n let inBrace = false\n let braceStart = -1\n let braceNeg = false\n if (ast.type === null) {\n // outside of a extglob, append until we find a start\n let i = pos\n let acc = ''\n while (i < str.length) {\n const c = str.charAt(i++)\n // still accumulate escapes at this point, but we do ignore\n // starts that are escaped\n if (escaping || c === '\\\\') {\n escaping = !escaping\n acc += c\n continue\n }\n\n if (inBrace) {\n if (i === braceStart + 1) {\n if (c === '^' || c === '!') {\n braceNeg = true\n }\n } else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {\n inBrace = false\n }\n acc += c\n continue\n } else if (c === '[') {\n inBrace = true\n braceStart = i\n braceNeg = false\n acc += c\n continue\n }\n\n if (!opt.noext && isExtglobType(c) && str.charAt(i) === '(') {\n ast.push(acc)\n acc = ''\n const ext = new AST(c, ast)\n i = AST.#parseAST(str, ext, i, opt)\n ast.push(ext)\n continue\n }\n acc += c\n }\n ast.push(acc)\n return i\n }\n\n // some kind of extglob, pos is at the (\n // find the next | or )\n let i = pos + 1\n let part = new AST(null, ast)\n const parts: AST[] = []\n let acc = ''\n while (i < str.length) {\n const c = str.charAt(i++)\n // still accumulate escapes at this point, but we do ignore\n // starts that are escaped\n if (escaping || c === '\\\\') {\n escaping = !escaping\n acc += c\n continue\n }\n\n if (inBrace) {\n if (i === braceStart + 1) {\n if (c === '^' || c === '!') {\n braceNeg = true\n }\n } else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {\n inBrace = false\n }\n acc += c\n continue\n } else if (c === '[') {\n inBrace = true\n braceStart = i\n braceNeg = false\n acc += c\n continue\n }\n\n if (isExtglobType(c) && str.charAt(i) === '(') {\n part.push(acc)\n acc = ''\n const ext = new AST(c, part)\n part.push(ext)\n i = AST.#parseAST(str, ext, i, opt)\n continue\n }\n if (c === '|') {\n part.push(acc)\n acc = ''\n parts.push(part)\n part = new AST(null, ast)\n continue\n }\n if (c === ')') {\n if (acc === '' && ast.#parts.length === 0) {\n ast.#emptyExt = true\n }\n part.push(acc)\n acc = ''\n ast.push(...parts, part)\n return i\n }\n acc += c\n }\n\n // unfinished extglob\n // if we got here, it was a malformed extglob! not an extglob, but\n // maybe something else in there.\n ast.type = null\n ast.#hasMagic = undefined\n ast.#parts = [str.substring(pos - 1)]\n return i\n }\n\n static fromGlob(pattern: string, options: MinimatchOptions = {}) {\n const ast = new AST(null, undefined, options)\n AST.#parseAST(pattern, ast, 0, options)\n return ast\n }\n\n // returns the regular expression if there's magic, or the unescaped\n // string if not.\n toMMPattern(): MMRegExp | string {\n // should only be called on root\n /* c8 ignore start */\n if (this !== this.#root) return this.#root.toMMPattern()\n /* c8 ignore stop */\n const glob = this.toString()\n const [re, body, hasMagic, uflag] = this.toRegExpSource()\n // if we're in nocase mode, and not nocaseMagicOnly, then we do\n // still need a regular expression if we have to case-insensitively\n // match capital/lowercase characters.\n const anyMagic =\n hasMagic ||\n this.#hasMagic ||\n (this.#options.nocase &&\n !this.#options.nocaseMagicOnly &&\n glob.toUpperCase() !== glob.toLowerCase())\n if (!anyMagic) {\n return body\n }\n\n const flags = (this.#options.nocase ? 'i' : '') + (uflag ? 'u' : '')\n return Object.assign(new RegExp(`^${re}$`, flags), {\n _src: re,\n _glob: glob,\n })\n }\n\n get options() {\n return this.#options\n }\n\n // returns the string match, the regexp source, whether there's magic\n // in the regexp (so a regular expression is required) and whether or\n // not the uflag is needed for the regular expression (for posix classes)\n // TODO: instead of injecting the start/end at this point, just return\n // the BODY of the regexp, along with the start/end portions suitable\n // for binding the start/end in either a joined full-path makeRe context\n // (where we bind to (^|/), or a standalone matchPart context (where\n // we bind to ^, and not /). Otherwise slashes get duped!\n //\n // In part-matching mode, the start is:\n // - if not isStart: nothing\n // - if traversal possible, but not allowed: ^(?!\\.\\.?$)\n // - if dots allowed or not possible: ^\n // - if dots possible and not allowed: ^(?!\\.)\n // end is:\n // - if not isEnd(): nothing\n // - else: $\n //\n // In full-path matching mode, we put the slash at the START of the\n // pattern, so start is:\n // - if first pattern: same as part-matching mode\n // - if not isStart(): nothing\n // - if traversal possible, but not allowed: /(?!\\.\\.?(?:$|/))\n // - if dots allowed or not possible: /\n // - if dots possible and not allowed: /(?!\\.)\n // end is:\n // - if last pattern, same as part-matching mode\n // - else nothing\n //\n // Always put the (?:$|/) on negated tails, though, because that has to be\n // there to bind the end of the negated pattern portion, and it's easier to\n // just stick it in now rather than try to inject it later in the middle of\n // the pattern.\n //\n // We can just always return the same end, and leave it up to the caller\n // to know whether it's going to be used joined or in parts.\n // And, if the start is adjusted slightly, can do the same there:\n // - if not isStart: nothing\n // - if traversal possible, but not allowed: (?:/|^)(?!\\.\\.?$)\n // - if dots allowed or not possible: (?:/|^)\n // - if dots possible and not allowed: (?:/|^)(?!\\.)\n //\n // But it's better to have a simpler binding without a conditional, for\n // performance, so probably better to return both start options.\n //\n // Then the caller just ignores the end if it's not the first pattern,\n // and the start always gets applied.\n //\n // But that's always going to be $ if it's the ending pattern, or nothing,\n // so the caller can just attach $ at the end of the pattern when building.\n //\n // So the todo is:\n // - better detect what kind of start is needed\n // - return both flavors of starting pattern\n // - attach $ at the end of the pattern when creating the actual RegExp\n //\n // Ah, but wait, no, that all only applies to the root when the first pattern\n // is not an extglob. If the first pattern IS an extglob, then we need all\n // that dot prevention biz to live in the extglob portions, because eg\n // +(*|.x*) can match .xy but not .yx.\n //\n // So, return the two flavors if it's #root and the first child is not an\n // AST, otherwise leave it to the child AST to handle it, and there,\n // use the (?:^|/) style of start binding.\n //\n // Even simplified further:\n // - Since the start for a join is eg /(?!\\.) and the start for a part\n // is ^(?!\\.), we can just prepend (?!\\.) to the pattern (either root\n // or start or whatever) and prepend ^ or / at the Regexp construction.\n toRegExpSource(\n allowDot?: boolean,\n ): [re: string, body: string, hasMagic: boolean, uflag: boolean] {\n const dot = allowDot ?? !!this.#options.dot\n if (this.#root === this) this.#fillNegs()\n if (!this.type) {\n const noEmpty =\n this.isStart() &&\n this.isEnd() &&\n !this.#parts.some(s => typeof s !== 'string')\n const src = this.#parts\n .map(p => {\n const [re, _, hasMagic, uflag] =\n typeof p === 'string'\n ? AST.#parseGlob(p, this.#hasMagic, noEmpty)\n : p.toRegExpSource(allowDot)\n this.#hasMagic = this.#hasMagic || hasMagic\n this.#uflag = this.#uflag || uflag\n return re\n })\n .join('')\n\n let start = ''\n if (this.isStart()) {\n if (typeof this.#parts[0] === 'string') {\n // this is the string that will match the start of the pattern,\n // so we need to protect against dots and such.\n\n // '.' and '..' cannot match unless the pattern is that exactly,\n // even if it starts with . or dot:true is set.\n const dotTravAllowed =\n this.#parts.length === 1 && justDots.has(this.#parts[0])\n if (!dotTravAllowed) {\n const aps = addPatternStart\n // check if we have a possibility of matching . or ..,\n // and prevent that.\n const needNoTrav =\n // dots are allowed, and the pattern starts with [ or .\n (dot && aps.has(src.charAt(0))) ||\n // the pattern starts with \\., and then [ or .\n (src.startsWith('\\\\.') && aps.has(src.charAt(2))) ||\n // the pattern starts with \\.\\., and then [ or .\n (src.startsWith('\\\\.\\\\.') && aps.has(src.charAt(4)))\n // no need to prevent dots if it can't match a dot, or if a\n // sub-pattern will be preventing it anyway.\n const needNoDot = !dot && !allowDot && aps.has(src.charAt(0))\n\n start = needNoTrav ? startNoTraversal : needNoDot ? startNoDot : ''\n }\n }\n }\n\n // append the \"end of path portion\" pattern to negation tails\n let end = ''\n if (\n this.isEnd() &&\n this.#root.#filledNegs &&\n this.#parent?.type === '!'\n ) {\n end = '(?:$|\\\\/)'\n }\n const final = start + src + end\n return [\n final,\n unescape(src),\n (this.#hasMagic = !!this.#hasMagic),\n this.#uflag,\n ]\n }\n\n // We need to calculate the body *twice* if it's a repeat pattern\n // at the start, once in nodot mode, then again in dot mode, so a\n // pattern like *(?) can match 'x.y'\n\n const repeated = this.type === '*' || this.type === '+'\n // some kind of extglob\n const start = this.type === '!' ? '(?:(?!(?:' : '(?:'\n let body = this.#partsToRegExp(dot)\n\n if (this.isStart() && this.isEnd() && !body && this.type !== '!') {\n // invalid extglob, has to at least be *something* present, if it's\n // the entire path portion.\n const s = this.toString()\n this.#parts = [s]\n this.type = null\n this.#hasMagic = undefined\n return [s, unescape(this.toString()), false, false]\n }\n\n // XXX abstract out this map method\n let bodyDotAllowed =\n !repeated || allowDot || dot || !startNoDot\n ? ''\n : this.#partsToRegExp(true)\n if (bodyDotAllowed === body) {\n bodyDotAllowed = ''\n }\n if (bodyDotAllowed) {\n body = `(?:${body})(?:${bodyDotAllowed})*?`\n }\n\n // an empty !() is exactly equivalent to a starNoEmpty\n let final = ''\n if (this.type === '!' && this.#emptyExt) {\n final = (this.isStart() && !dot ? startNoDot : '') + starNoEmpty\n } else {\n const close =\n this.type === '!'\n ? // !() must match something,but !(x) can match ''\n '))' +\n (this.isStart() && !dot && !allowDot ? startNoDot : '') +\n star +\n ')'\n : this.type === '@'\n ? ')'\n : this.type === '?'\n ? ')?'\n : this.type === '+' && bodyDotAllowed\n ? ')'\n : this.type === '*' && bodyDotAllowed\n ? `)?`\n : `)${this.type}`\n final = start + body + close\n }\n return [\n final,\n unescape(body),\n (this.#hasMagic = !!this.#hasMagic),\n this.#uflag,\n ]\n }\n\n #partsToRegExp(dot: boolean) {\n return this.#parts\n .map(p => {\n // extglob ASTs should only contain parent ASTs\n /* c8 ignore start */\n if (typeof p === 'string') {\n throw new Error('string type in extglob ast??')\n }\n /* c8 ignore stop */\n // can ignore hasMagic, because extglobs are already always magic\n const [re, _, _hasMagic, uflag] = p.toRegExpSource(dot)\n this.#uflag = this.#uflag || uflag\n return re\n })\n .filter(p => !(this.isStart() && this.isEnd()) || !!p)\n .join('|')\n }\n\n static #parseGlob(\n glob: string,\n hasMagic: boolean | undefined,\n noEmpty: boolean = false,\n ): [re: string, body: string, hasMagic: boolean, uflag: boolean] {\n let escaping = false\n let re = ''\n let uflag = false\n for (let i = 0; i < glob.length; i++) {\n const c = glob.charAt(i)\n if (escaping) {\n escaping = false\n re += (reSpecials.has(c) ? '\\\\' : '') + c\n continue\n }\n if (c === '\\\\') {\n if (i === glob.length - 1) {\n re += '\\\\\\\\'\n } else {\n escaping = true\n }\n continue\n }\n if (c === '[') {\n const [src, needUflag, consumed, magic] = parseClass(glob, i)\n if (consumed) {\n re += src\n uflag = uflag || needUflag\n i += consumed - 1\n hasMagic = hasMagic || magic\n continue\n }\n }\n if (c === '*') {\n re += noEmpty && glob === '*' ? starNoEmpty : star\n hasMagic = true\n continue\n }\n if (c === '?') {\n re += qmark\n hasMagic = true\n continue\n }\n re += regExpEscape(c)\n }\n return [re, unescape(glob), !!hasMagic, uflag]\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"ast.js","sourceRoot":"","sources":["../../src/ast.ts"],"names":[],"mappings":"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","sourcesContent":["// parse a single path portion\n\nimport { parseClass } from './brace-expressions.js'\nimport { MinimatchOptions, MMRegExp } from './index.js'\nimport { unescape } from './unescape.js'\n\n// classes [] are handled by the parseClass method\n// for positive extglobs, we sub-parse the contents, and combine,\n// with the appropriate regexp close.\n// for negative extglobs, we sub-parse the contents, but then\n// have to include the rest of the pattern, then the parent, etc.,\n// as the thing that cannot be because RegExp negative lookaheads\n// are different from globs.\n//\n// So for example:\n// a@(i|w!(x|y)z|j)b => ^a(i|w((!?(x|y)zb).*)z|j)b$\n// 1 2 3 4 5 6 1 2 3 46 5 6\n//\n// Assembling the extglob requires not just the negated patterns themselves,\n// but also anything following the negative patterns up to the boundary\n// of the current pattern, plus anything following in the parent pattern.\n//\n//\n// So, first, we parse the string into an AST of extglobs, without turning\n// anything into regexps yet.\n//\n// ['a', {@ [['i'], ['w', {!['x', 'y']}, 'z'], ['j']]}, 'b']\n//\n// Then, for all the negative extglobs, we append whatever comes after in\n// each parent as their tail\n//\n// ['a', {@ [['i'], ['w', {!['x', 'y'], 'z', 'b'}, 'z'], ['j']]}, 'b']\n//\n// Lastly, we turn each of these pieces into a regexp, and join\n//\n// v----- .* because there's more following,\n// v v otherwise, .+ because it must be\n// v v *something* there.\n// ['^a', {@ ['i', 'w(?:(!?(?:x|y).*zb$).*)z', 'j' ]}, 'b$']\n// copy what follows into here--^^^^^\n// ['^a', '(?:i|w(?:(?!(?:x|y).*zb$).*)z|j)', 'b$']\n// ['^a(?:i|w(?:(?!(?:x|y).*zb$).*)z|j)b$']\n\nexport type ExtglobType = '!' | '?' | '+' | '*' | '@'\nconst types = new Set<ExtglobType>(['!', '?', '+', '*', '@'])\nconst isExtglobType = (c: string | null): c is ExtglobType =>\n types.has(c as ExtglobType)\nconst isExtglobAST = (c: AST): c is AST & { type: ExtglobType } =>\n isExtglobType(c.type)\n\n// Map of which extglob types can adopt the children of a nested extglob\n//\n// anything but ! can adopt a matching type:\n// +(a|+(b|c)|d) => +(a|b|c|d)\n// *(a|*(b|c)|d) => *(a|b|c|d)\n// @(a|@(b|c)|d) => @(a|b|c|d)\n// ?(a|?(b|c)|d) => ?(a|b|c|d)\n//\n// * can adopt anything, because 0 or repetition is allowed\n// *(a|?(b|c)|d) => *(a|b|c|d)\n// *(a|+(b|c)|d) => *(a|b|c|d)\n// *(a|@(b|c)|d) => *(a|b|c|d)\n//\n// + can adopt @, because 1 or repetition is allowed\n// +(a|@(b|c)|d) => +(a|b|c|d)\n//\n// + and @ CANNOT adopt *, because 0 would be allowed\n// +(a|*(b|c)|d) => would match \"\", on *(b|c)\n// @(a|*(b|c)|d) => would match \"\", on *(b|c)\n//\n// + and @ CANNOT adopt ?, because 0 would be allowed\n// +(a|?(b|c)|d) => would match \"\", on ?(b|c)\n// @(a|?(b|c)|d) => would match \"\", on ?(b|c)\n//\n// ? can adopt @, because 0 or 1 is allowed\n// ?(a|@(b|c)|d) => ?(a|b|c|d)\n//\n// ? and @ CANNOT adopt * or +, because >1 would be allowed\n// ?(a|*(b|c)|d) => would match bbb on *(b|c)\n// @(a|*(b|c)|d) => would match bbb on *(b|c)\n// ?(a|+(b|c)|d) => would match bbb on +(b|c)\n// @(a|+(b|c)|d) => would match bbb on +(b|c)\n//\n// ! CANNOT adopt ! (nothing else can either)\n// !(a|!(b|c)|d) => !(a|b|c|d) would fail to match on b (not not b|c)\n//\n// ! can adopt @\n// !(a|@(b|c)|d) => !(a|b|c|d)\n//\n// ! CANNOT adopt *\n// !(a|*(b|c)|d) => !(a|b|c|d) would match on bbb, not allowed\n//\n// ! CANNOT adopt +\n// !(a|+(b|c)|d) => !(a|b|c|d) would match on bbb, not allowed\n//\n// ! CANNOT adopt ?\n// x!(a|?(b|c)|d) => x!(a|b|c|d) would fail to match \"x\"\nconst adoptionMap = new Map<ExtglobType, ExtglobType[]>([\n ['!', ['@']],\n ['?', ['?', '@']],\n ['@', ['@']],\n ['*', ['*', '+', '?', '@']],\n ['+', ['+', '@']],\n])\n\n// nested extglobs that can be adopted in, but with the addition of\n// a blank '' element.\nconst adoptionWithSpaceMap = new Map<ExtglobType, ExtglobType[]>([\n ['!', ['?']],\n ['@', ['?']],\n ['+', ['?', '*']],\n])\n\n// union of the previous two maps\nconst adoptionAnyMap = new Map<ExtglobType, ExtglobType[]>([\n ['!', ['?', '@']],\n ['?', ['?', '@']],\n ['@', ['?', '@']],\n ['*', ['*', '+', '?', '@']],\n ['+', ['+', '@', '?', '*']],\n])\n\n// Extglobs that can take over their parent if they are the only child\n// the key is parent, value maps child to resulting extglob parent type\n// '@' is omitted because it's a special case. An `@` extglob with a single\n// member can always be usurped by that subpattern.\nconst usurpMap = new Map<ExtglobType, Map<ExtglobType | null, ExtglobType | null>>([\n ['!', new Map([['!', '@']])],\n [\n '?',\n new Map([\n ['*', '*'],\n ['+', '*'],\n ]),\n ],\n [\n '@',\n new Map([\n ['!', '!'],\n ['?', '?'],\n ['@', '@'],\n ['*', '*'],\n ['+', '+'],\n ]),\n ],\n [\n '+',\n new Map([\n ['?', '*'],\n ['*', '*'],\n ]),\n ],\n])\n\n// Patterns that get prepended to bind to the start of either the\n// entire string, or just a single path portion, to prevent dots\n// and/or traversal patterns, when needed.\n// Exts don't need the ^ or / bit, because the root binds that already.\nconst startNoTraversal = '(?!(?:^|/)\\\\.\\\\.?(?:$|/))'\nconst startNoDot = '(?!\\\\.)'\n\n// characters that indicate a start of pattern needs the \"no dots\" bit,\n// because a dot *might* be matched. ( is not in the list, because in\n// the case of a child extglob, it will handle the prevention itself.\nconst addPatternStart = new Set(['[', '.'])\n// cases where traversal is A-OK, no dot prevention needed\nconst justDots = new Set(['..', '.'])\nconst reSpecials = new Set('().*{}+?[]^$\\\\!')\nconst regExpEscape = (s: string) =>\n s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\n// any single thing other than /\nconst qmark = '[^/]'\n\n// * => any number of characters\nconst star = qmark + '*?'\n// use + when we need to ensure that *something* matches, because the * is\n// the only thing in the path portion.\nconst starNoEmpty = qmark + '+?'\n\n// remove the \\ chars that we added if we end up doing a nonmagic compare\n// const deslash = (s: string) => s.replace(/\\\\(.)/g, '$1')\n\nlet ID = 0\nexport class AST {\n type: ExtglobType | null\n readonly #root: AST\n\n #hasMagic?: boolean\n #uflag: boolean = false\n #parts: (string | AST)[] = []\n #parent?: AST\n #parentIndex: number\n #negs: AST[]\n #filledNegs: boolean = false\n #options: MinimatchOptions\n #toString?: string\n // set to true if it's an extglob with no children\n // (which really means one child of '')\n #emptyExt: boolean = false\n id = ++ID\n\n get depth(): number {\n return (this.#parent?.depth ?? -1) + 1\n }\n\n [Symbol.for('nodejs.util.inspect.custom')]() {\n return {\n '@@type': 'AST',\n id: this.id,\n type: this.type,\n root: this.#root.id,\n parent: this.#parent?.id,\n depth: this.depth,\n partsLength: this.#parts.length,\n parts: this.#parts,\n }\n }\n\n constructor(\n type: ExtglobType | null,\n parent?: AST,\n options: MinimatchOptions = {},\n ) {\n this.type = type\n // extglobs are inherently magical\n if (type) this.#hasMagic = true\n this.#parent = parent\n this.#root = this.#parent ? this.#parent.#root : this\n this.#options = this.#root === this ? options : this.#root.#options\n this.#negs = this.#root === this ? [] : this.#root.#negs\n if (type === '!' && !this.#root.#filledNegs) this.#negs.push(this)\n this.#parentIndex = this.#parent ? this.#parent.#parts.length : 0\n }\n\n get hasMagic(): boolean | undefined {\n /* c8 ignore start */\n if (this.#hasMagic !== undefined) return this.#hasMagic\n /* c8 ignore stop */\n for (const p of this.#parts) {\n if (typeof p === 'string') continue\n if (p.type || p.hasMagic) return (this.#hasMagic = true)\n }\n // note: will be undefined until we generate the regexp src and find out\n return this.#hasMagic\n }\n\n // reconstructs the pattern\n toString(): string {\n if (this.#toString !== undefined) return this.#toString\n if (!this.type) {\n return (this.#toString = this.#parts.map(p => String(p)).join(''))\n } else {\n return (this.#toString =\n this.type + '(' + this.#parts.map(p => String(p)).join('|') + ')')\n }\n }\n\n #fillNegs() {\n /* c8 ignore start */\n if (this !== this.#root) throw new Error('should only call on root')\n if (this.#filledNegs) return this\n /* c8 ignore stop */\n\n // call toString() once to fill this out\n this.toString()\n this.#filledNegs = true\n let n: AST | undefined\n while ((n = this.#negs.pop())) {\n if (n.type !== '!') continue\n // walk up the tree, appending everthing that comes AFTER parentIndex\n let p: AST | undefined = n\n let pp = p.#parent\n while (pp) {\n for (\n let i = p.#parentIndex + 1;\n !pp.type && i < pp.#parts.length;\n i++\n ) {\n for (const part of n.#parts) {\n /* c8 ignore start */\n if (typeof part === 'string') {\n throw new Error('string part in extglob AST??')\n }\n /* c8 ignore stop */\n part.copyIn(pp.#parts[i])\n }\n }\n p = pp\n pp = p.#parent\n }\n }\n return this\n }\n\n push(...parts: (string | AST)[]) {\n for (const p of parts) {\n if (p === '') continue\n /* c8 ignore start */\n if (\n typeof p !== 'string' &&\n !(p instanceof AST && p.#parent === this)\n ) {\n throw new Error('invalid part: ' + p)\n }\n /* c8 ignore stop */\n this.#parts.push(p)\n }\n }\n\n toJSON() {\n const ret: any[] =\n this.type === null ?\n this.#parts\n .slice()\n .map(p => (typeof p === 'string' ? p : p.toJSON()))\n : [this.type, ...this.#parts.map(p => (p as AST).toJSON())]\n if (this.isStart() && !this.type) ret.unshift([])\n if (\n this.isEnd() &&\n (this === this.#root ||\n (this.#root.#filledNegs && this.#parent?.type === '!'))\n ) {\n ret.push({})\n }\n return ret\n }\n\n isStart(): boolean {\n if (this.#root === this) return true\n // if (this.type) return !!this.#parent?.isStart()\n if (!this.#parent?.isStart()) return false\n if (this.#parentIndex === 0) return true\n // if everything AHEAD of this is a negation, then it's still the \"start\"\n const p = this.#parent\n for (let i = 0; i < this.#parentIndex; i++) {\n const pp = p.#parts[i]\n if (!(pp instanceof AST && pp.type === '!')) {\n return false\n }\n }\n return true\n }\n\n isEnd(): boolean {\n if (this.#root === this) return true\n if (this.#parent?.type === '!') return true\n if (!this.#parent?.isEnd()) return false\n if (!this.type) return this.#parent?.isEnd()\n // if not root, it'll always have a parent\n /* c8 ignore start */\n const pl = this.#parent ? this.#parent.#parts.length : 0\n /* c8 ignore stop */\n return this.#parentIndex === pl - 1\n }\n\n copyIn(part: AST | string) {\n if (typeof part === 'string') this.push(part)\n else this.push(part.clone(this))\n }\n\n clone(parent: AST) {\n const c = new AST(this.type, parent)\n for (const p of this.#parts) {\n c.copyIn(p)\n }\n return c\n }\n\n static #parseAST(\n str: string,\n ast: AST,\n pos: number,\n opt: MinimatchOptions,\n extDepth: number,\n ): number {\n const maxDepth = opt.maxExtglobRecursion ?? 2\n let escaping = false\n let inBrace = false\n let braceStart = -1\n let braceNeg = false\n if (ast.type === null) {\n // outside of a extglob, append until we find a start\n let i = pos\n let acc = ''\n while (i < str.length) {\n const c = str.charAt(i++)\n // still accumulate escapes at this point, but we do ignore\n // starts that are escaped\n if (escaping || c === '\\\\') {\n escaping = !escaping\n acc += c\n continue\n }\n\n if (inBrace) {\n if (i === braceStart + 1) {\n if (c === '^' || c === '!') {\n braceNeg = true\n }\n } else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {\n inBrace = false\n }\n acc += c\n continue\n } else if (c === '[') {\n inBrace = true\n braceStart = i\n braceNeg = false\n acc += c\n continue\n }\n\n // we don't have to check for adoption here, because that's\n // done at the other recursion point.\n const doRecurse =\n !opt.noext &&\n isExtglobType(c) &&\n str.charAt(i) === '(' &&\n extDepth <= maxDepth\n if (doRecurse) {\n ast.push(acc)\n acc = ''\n const ext = new AST(c, ast)\n i = AST.#parseAST(str, ext, i, opt, extDepth + 1)\n ast.push(ext)\n continue\n }\n acc += c\n }\n ast.push(acc)\n return i\n }\n\n // some kind of extglob, pos is at the (\n // find the next | or )\n let i = pos + 1\n let part = new AST(null, ast)\n const parts: AST[] = []\n let acc = ''\n while (i < str.length) {\n const c = str.charAt(i++)\n // still accumulate escapes at this point, but we do ignore\n // starts that are escaped\n if (escaping || c === '\\\\') {\n escaping = !escaping\n acc += c\n continue\n }\n\n if (inBrace) {\n if (i === braceStart + 1) {\n if (c === '^' || c === '!') {\n braceNeg = true\n }\n } else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {\n inBrace = false\n }\n acc += c\n continue\n } else if (c === '[') {\n inBrace = true\n braceStart = i\n braceNeg = false\n acc += c\n continue\n }\n\n const doRecurse =\n !opt.noext &&\n isExtglobType(c) &&\n str.charAt(i) === '(' &&\n /* c8 ignore start - the maxDepth is sufficient here */\n (extDepth <= maxDepth || (ast && ast.#canAdoptType(c)))\n /* c8 ignore stop */\n if (doRecurse) {\n const depthAdd = ast && ast.#canAdoptType(c) ? 0 : 1\n part.push(acc)\n acc = ''\n const ext = new AST(c, part)\n part.push(ext)\n i = AST.#parseAST(str, ext, i, opt, extDepth + depthAdd)\n continue\n }\n if (c === '|') {\n part.push(acc)\n acc = ''\n parts.push(part)\n part = new AST(null, ast)\n continue\n }\n if (c === ')') {\n if (acc === '' && ast.#parts.length === 0) {\n ast.#emptyExt = true\n }\n part.push(acc)\n acc = ''\n ast.push(...parts, part)\n return i\n }\n acc += c\n }\n\n // unfinished extglob\n // if we got here, it was a malformed extglob! not an extglob, but\n // maybe something else in there.\n ast.type = null\n ast.#hasMagic = undefined\n ast.#parts = [str.substring(pos - 1)]\n return i\n }\n\n #canAdoptWithSpace(child?: AST | string): child is AST & {\n type: null\n parts: [AST & { type: ExtglobType }]\n } {\n return this.#canAdopt(child, adoptionWithSpaceMap)\n }\n\n #canAdopt(\n child?: AST | string,\n map: Map<ExtglobType, ExtglobType[]> = adoptionMap,\n ): child is AST & {\n type: null\n parts: [AST & { type: ExtglobType }]\n } {\n if (\n !child ||\n typeof child !== 'object' ||\n child.type !== null ||\n child.#parts.length !== 1 ||\n this.type === null\n ) {\n return false\n }\n const gc = child.#parts[0]\n if (!gc || typeof gc !== 'object' || gc.type === null) {\n return false\n }\n return (this as AST & { type: ExtglobType }).#canAdoptType(\n gc.type,\n map,\n )\n }\n #canAdoptType(\n c: string,\n map: Map<ExtglobType, ExtglobType[]> = adoptionAnyMap,\n ): c is ExtglobType {\n return !!map.get(this.type as ExtglobType)?.includes(c as ExtglobType)\n }\n\n #adoptWithSpace(\n this: AST & { type: ExtglobType },\n child: AST & {\n type: null\n },\n index: number,\n ) {\n const gc = child.#parts[0] as AST & { type: ExtglobType }\n const blank = new AST(null, gc, this.options)\n blank.#parts.push('')\n gc.push(blank)\n this.#adopt(child, index)\n }\n\n #adopt(\n child: AST & {\n type: null\n },\n index: number,\n ) {\n const gc = child.#parts[0] as AST & { type: ExtglobType }\n this.#parts.splice(index, 1, ...gc.#parts)\n for (const p of gc.#parts) {\n if (typeof p === 'object') p.#parent = this\n }\n this.#toString = undefined\n }\n\n #canUsurpType(c: string): boolean {\n const m = usurpMap.get(this.type as ExtglobType)\n return !!(m?.has(c as ExtglobType))\n }\n\n #canUsurp (\n child?: AST | string,\n ): child is AST & {\n type: null\n parts: [AST & { type: ExtglobType }]\n } {\n if (\n !child ||\n typeof child !== 'object' ||\n child.type !== null ||\n child.#parts.length !== 1 ||\n this.type === null ||\n this.#parts.length !== 1\n ) {\n return false\n }\n const gc = child.#parts[0]\n if (!gc || typeof gc !== 'object' || gc.type === null) {\n return false\n }\n return (this as AST & { type: ExtglobType }).#canUsurpType(gc.type)\n }\n\n #usurp(this: AST & { type: ExtglobType }, child: AST & { type: null }) {\n const m = usurpMap.get(this.type as ExtglobType)\n const gc = child.#parts[0] as AST & { type: ExtglobType }\n const nt = m?.get(gc.type)\n /* c8 ignore start - impossible */\n if (!nt) return false\n /* c8 ignore stop */\n this.#parts = gc.#parts\n for (const p of this.#parts) {\n if (typeof p === 'object') {\n p.#parent = this\n }\n }\n this.type = nt\n this.#toString = undefined\n this.#emptyExt = false\n }\n\n static fromGlob(pattern: string, options: MinimatchOptions = {}) {\n const ast = new AST(null, undefined, options)\n AST.#parseAST(pattern, ast, 0, options, 0)\n return ast\n }\n\n // returns the regular expression if there's magic, or the unescaped\n // string if not.\n toMMPattern(): MMRegExp | string {\n // should only be called on root\n /* c8 ignore start */\n if (this !== this.#root) return this.#root.toMMPattern()\n /* c8 ignore stop */\n const glob = this.toString()\n const [re, body, hasMagic, uflag] = this.toRegExpSource()\n // if we're in nocase mode, and not nocaseMagicOnly, then we do\n // still need a regular expression if we have to case-insensitively\n // match capital/lowercase characters.\n const anyMagic =\n hasMagic ||\n this.#hasMagic ||\n (this.#options.nocase &&\n !this.#options.nocaseMagicOnly &&\n glob.toUpperCase() !== glob.toLowerCase())\n if (!anyMagic) {\n return body\n }\n\n const flags = (this.#options.nocase ? 'i' : '') + (uflag ? 'u' : '')\n return Object.assign(new RegExp(`^${re}$`, flags), {\n _src: re,\n _glob: glob,\n })\n }\n\n get options() {\n return this.#options\n }\n\n // returns the string match, the regexp source, whether there's magic\n // in the regexp (so a regular expression is required) and whether or\n // not the uflag is needed for the regular expression (for posix classes)\n // TODO: instead of injecting the start/end at this point, just return\n // the BODY of the regexp, along with the start/end portions suitable\n // for binding the start/end in either a joined full-path makeRe context\n // (where we bind to (^|/), or a standalone matchPart context (where\n // we bind to ^, and not /). Otherwise slashes get duped!\n //\n // In part-matching mode, the start is:\n // - if not isStart: nothing\n // - if traversal possible, but not allowed: ^(?!\\.\\.?$)\n // - if dots allowed or not possible: ^\n // - if dots possible and not allowed: ^(?!\\.)\n // end is:\n // - if not isEnd(): nothing\n // - else: $\n //\n // In full-path matching mode, we put the slash at the START of the\n // pattern, so start is:\n // - if first pattern: same as part-matching mode\n // - if not isStart(): nothing\n // - if traversal possible, but not allowed: /(?!\\.\\.?(?:$|/))\n // - if dots allowed or not possible: /\n // - if dots possible and not allowed: /(?!\\.)\n // end is:\n // - if last pattern, same as part-matching mode\n // - else nothing\n //\n // Always put the (?:$|/) on negated tails, though, because that has to be\n // there to bind the end of the negated pattern portion, and it's easier to\n // just stick it in now rather than try to inject it later in the middle of\n // the pattern.\n //\n // We can just always return the same end, and leave it up to the caller\n // to know whether it's going to be used joined or in parts.\n // And, if the start is adjusted slightly, can do the same there:\n // - if not isStart: nothing\n // - if traversal possible, but not allowed: (?:/|^)(?!\\.\\.?$)\n // - if dots allowed or not possible: (?:/|^)\n // - if dots possible and not allowed: (?:/|^)(?!\\.)\n //\n // But it's better to have a simpler binding without a conditional, for\n // performance, so probably better to return both start options.\n //\n // Then the caller just ignores the end if it's not the first pattern,\n // and the start always gets applied.\n //\n // But that's always going to be $ if it's the ending pattern, or nothing,\n // so the caller can just attach $ at the end of the pattern when building.\n //\n // So the todo is:\n // - better detect what kind of start is needed\n // - return both flavors of starting pattern\n // - attach $ at the end of the pattern when creating the actual RegExp\n //\n // Ah, but wait, no, that all only applies to the root when the first pattern\n // is not an extglob. If the first pattern IS an extglob, then we need all\n // that dot prevention biz to live in the extglob portions, because eg\n // +(*|.x*) can match .xy but not .yx.\n //\n // So, return the two flavors if it's #root and the first child is not an\n // AST, otherwise leave it to the child AST to handle it, and there,\n // use the (?:^|/) style of start binding.\n //\n // Even simplified further:\n // - Since the start for a join is eg /(?!\\.) and the start for a part\n // is ^(?!\\.), we can just prepend (?!\\.) to the pattern (either root\n // or start or whatever) and prepend ^ or / at the Regexp construction.\n toRegExpSource(\n allowDot?: boolean,\n ): [re: string, body: string, hasMagic: boolean, uflag: boolean] {\n const dot = allowDot ?? !!this.#options.dot\n if (this.#root === this) {\n this.#flatten()\n this.#fillNegs()\n }\n if (!isExtglobAST(this)) {\n const noEmpty =\n this.isStart() &&\n this.isEnd() &&\n !this.#parts.some(s => typeof s !== 'string')\n const src = this.#parts\n .map(p => {\n const [re, _, hasMagic, uflag] =\n typeof p === 'string' ?\n AST.#parseGlob(p, this.#hasMagic, noEmpty)\n : p.toRegExpSource(allowDot)\n this.#hasMagic = this.#hasMagic || hasMagic\n this.#uflag = this.#uflag || uflag\n return re\n })\n .join('')\n\n let start = ''\n if (this.isStart()) {\n if (typeof this.#parts[0] === 'string') {\n // this is the string that will match the start of the pattern,\n // so we need to protect against dots and such.\n\n // '.' and '..' cannot match unless the pattern is that exactly,\n // even if it starts with . or dot:true is set.\n const dotTravAllowed =\n this.#parts.length === 1 && justDots.has(this.#parts[0])\n if (!dotTravAllowed) {\n const aps = addPatternStart\n // check if we have a possibility of matching . or ..,\n // and prevent that.\n const needNoTrav =\n // dots are allowed, and the pattern starts with [ or .\n (dot && aps.has(src.charAt(0))) ||\n // the pattern starts with \\., and then [ or .\n (src.startsWith('\\\\.') && aps.has(src.charAt(2))) ||\n // the pattern starts with \\.\\., and then [ or .\n (src.startsWith('\\\\.\\\\.') && aps.has(src.charAt(4)))\n // no need to prevent dots if it can't match a dot, or if a\n // sub-pattern will be preventing it anyway.\n const needNoDot = !dot && !allowDot && aps.has(src.charAt(0))\n\n start =\n needNoTrav ? startNoTraversal\n : needNoDot ? startNoDot\n : ''\n }\n }\n }\n\n // append the \"end of path portion\" pattern to negation tails\n let end = ''\n if (\n this.isEnd() &&\n this.#root.#filledNegs &&\n this.#parent?.type === '!'\n ) {\n end = '(?:$|\\\\/)'\n }\n const final = start + src + end\n return [\n final,\n unescape(src),\n (this.#hasMagic = !!this.#hasMagic),\n this.#uflag,\n ]\n }\n\n // We need to calculate the body *twice* if it's a repeat pattern\n // at the start, once in nodot mode, then again in dot mode, so a\n // pattern like *(?) can match 'x.y'\n\n const repeated = this.type === '*' || this.type === '+'\n // some kind of extglob\n const start = this.type === '!' ? '(?:(?!(?:' : '(?:'\n let body = this.#partsToRegExp(dot)\n\n if (this.isStart() && this.isEnd() && !body && this.type !== '!') {\n // invalid extglob, has to at least be *something* present, if it's\n // the entire path portion.\n const s = this.toString()\n const me = this as AST\n me.#parts = [s]\n me.type = null\n me.#hasMagic = undefined\n return [s, unescape(this.toString()), false, false]\n }\n\n let bodyDotAllowed =\n !repeated || allowDot || dot || !startNoDot ?\n ''\n : this.#partsToRegExp(true)\n if (bodyDotAllowed === body) {\n bodyDotAllowed = ''\n }\n if (bodyDotAllowed) {\n body = `(?:${body})(?:${bodyDotAllowed})*?`\n }\n\n // an empty !() is exactly equivalent to a starNoEmpty\n let final = ''\n if (this.type === '!' && this.#emptyExt) {\n final = (this.isStart() && !dot ? startNoDot : '') + starNoEmpty\n } else {\n const close =\n this.type === '!' ?\n // !() must match something,but !(x) can match ''\n '))' +\n (this.isStart() && !dot && !allowDot ? startNoDot : '') +\n star +\n ')'\n : this.type === '@' ? ')'\n : this.type === '?' ? ')?'\n : this.type === '+' && bodyDotAllowed ? ')'\n : this.type === '*' && bodyDotAllowed ? `)?`\n : `)${this.type}`\n final = start + body + close\n }\n return [\n final,\n unescape(body),\n (this.#hasMagic = !!this.#hasMagic),\n this.#uflag,\n ]\n }\n\n #flatten() {\n if (!isExtglobAST(this)) {\n for (const p of this.#parts) {\n if (typeof p === 'object') {\n p.#flatten()\n }\n }\n } else {\n // do up to 10 passes to flatten as much as possible\n let iterations = 0\n let done = false\n do {\n done = true\n for (let i = 0; i < this.#parts.length; i++) {\n const c = this.#parts[i]\n if (typeof c === 'object') {\n c.#flatten()\n if (this.#canAdopt(c)) {\n done = false\n this.#adopt(c, i)\n } else if (this.#canAdoptWithSpace(c)) {\n done = false\n this.#adoptWithSpace(c, i)\n } else if (this.#canUsurp(c)) {\n done = false\n this.#usurp(c)\n }\n }\n }\n } while (!done && ++iterations < 10)\n }\n this.#toString = undefined\n }\n\n #partsToRegExp(this: AST & { type: ExtglobType }, dot: boolean) {\n return this.#parts\n .map(p => {\n // extglob ASTs should only contain parent ASTs\n /* c8 ignore start */\n if (typeof p === 'string') {\n throw new Error('string type in extglob ast??')\n }\n /* c8 ignore stop */\n // can ignore hasMagic, because extglobs are already always magic\n const [re, _, _hasMagic, uflag] = p.toRegExpSource(dot)\n this.#uflag = this.#uflag || uflag\n return re\n })\n .filter(p => !(this.isStart() && this.isEnd()) || !!p)\n .join('|')\n }\n\n static #parseGlob(\n glob: string,\n hasMagic: boolean | undefined,\n noEmpty: boolean = false,\n ): [re: string, body: string, hasMagic: boolean, uflag: boolean] {\n let escaping = false\n let re = ''\n let uflag = false\n // multiple stars that aren't globstars coalesce into one *\n let inStar = false\n for (let i = 0; i < glob.length; i++) {\n const c = glob.charAt(i)\n if (escaping) {\n escaping = false\n re += (reSpecials.has(c) ? '\\\\' : '') + c\n continue\n }\n if (c === '*') {\n if (inStar) continue\n inStar = true\n re += noEmpty && /^[*]+$/.test(glob) ? starNoEmpty : star\n hasMagic = true\n continue\n } else {\n inStar = false\n }\n if (c === '\\\\') {\n if (i === glob.length - 1) {\n re += '\\\\\\\\'\n } else {\n escaping = true\n }\n continue\n }\n if (c === '[') {\n const [src, needUflag, consumed, magic] = parseClass(glob, i)\n if (consumed) {\n re += src\n uflag = uflag || needUflag\n i += consumed - 1\n hasMagic = hasMagic || magic\n continue\n }\n }\n if (c === '?') {\n re += qmark\n hasMagic = true\n continue\n }\n re += regExpEscape(c)\n }\n return [re, unescape(glob), !!hasMagic, uflag]\n }\n}\n"]} \ No newline at end of file diff --git a/deps/minimatch/dist/esm/brace-expressions.d.ts.map b/deps/minimatch/dist/esm/brace-expressions.d.ts.map index 3293e23708527c..09b4c11060de78 100644 --- a/deps/minimatch/dist/esm/brace-expressions.d.ts.map +++ b/deps/minimatch/dist/esm/brace-expressions.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"brace-expressions.d.ts","sourceRoot":"","sources":["../../src/brace-expressions.ts"],"names":[],"mappings":"AA+BA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,EAAE,MAAM;IACX,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,OAAO;CAClB,CAAA;AAQD,eAAO,MAAM,UAAU,GACrB,MAAM,MAAM,EACZ,UAAU,MAAM,KACf,gBA6HF,CAAA"} \ No newline at end of file +{"version":3,"file":"brace-expressions.d.ts","sourceRoot":"","sources":["../../src/brace-expressions.ts"],"names":[],"mappings":"AAgCA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,EAAE,MAAM;IACX,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,OAAO;CAClB,CAAA;AAQD,eAAO,MAAM,UAAU,GACrB,MAAM,MAAM,EACZ,UAAU,MAAM,KACf,gBA2HF,CAAA"} \ No newline at end of file diff --git a/deps/minimatch/dist/esm/brace-expressions.js b/deps/minimatch/dist/esm/brace-expressions.js index c629d6ae816e27..4b49d40bd74210 100644 --- a/deps/minimatch/dist/esm/brace-expressions.js +++ b/deps/minimatch/dist/esm/brace-expressions.js @@ -138,10 +138,8 @@ export const parseClass = (glob, position) => { } const sranges = '[' + (negate ? '^' : '') + rangesToString(ranges) + ']'; const snegs = '[' + (negate ? '' : '^') + rangesToString(negs) + ']'; - const comb = ranges.length && negs.length - ? '(' + sranges + '|' + snegs + ')' - : ranges.length - ? sranges + const comb = ranges.length && negs.length ? '(' + sranges + '|' + snegs + ')' + : ranges.length ? sranges : snegs; return [comb, uflag, endPos - pos, true]; }; diff --git a/deps/minimatch/dist/esm/brace-expressions.js.map b/deps/minimatch/dist/esm/brace-expressions.js.map index d988fd9fed0fcd..184b5a89c11f4c 100644 --- a/deps/minimatch/dist/esm/brace-expressions.js.map +++ b/deps/minimatch/dist/esm/brace-expressions.js.map @@ -1 +1 @@ -{"version":3,"file":"brace-expressions.js","sourceRoot":"","sources":["../../src/brace-expressions.ts"],"names":[],"mappings":"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","sourcesContent":["// translate the various posix character classes into unicode properties\n// this works across all unicode locales\n\n// { <posix class>: [<translation>, /u flag required, negated]\nconst posixClasses: { [k: string]: [e: string, u: boolean, n?: boolean] } = {\n '[:alnum:]': ['\\\\p{L}\\\\p{Nl}\\\\p{Nd}', true],\n '[:alpha:]': ['\\\\p{L}\\\\p{Nl}', true],\n '[:ascii:]': ['\\\\x' + '00-\\\\x' + '7f', false],\n '[:blank:]': ['\\\\p{Zs}\\\\t', true],\n '[:cntrl:]': ['\\\\p{Cc}', true],\n '[:digit:]': ['\\\\p{Nd}', true],\n '[:graph:]': ['\\\\p{Z}\\\\p{C}', true, true],\n '[:lower:]': ['\\\\p{Ll}', true],\n '[:print:]': ['\\\\p{C}', true],\n '[:punct:]': ['\\\\p{P}', true],\n '[:space:]': ['\\\\p{Z}\\\\t\\\\r\\\\n\\\\v\\\\f', true],\n '[:upper:]': ['\\\\p{Lu}', true],\n '[:word:]': ['\\\\p{L}\\\\p{Nl}\\\\p{Nd}\\\\p{Pc}', true],\n '[:xdigit:]': ['A-Fa-f0-9', false],\n}\n\n// only need to escape a few things inside of brace expressions\n// escapes: [ \\ ] -\nconst braceEscape = (s: string) => s.replace(/[[\\]\\\\-]/g, '\\\\$&')\n// escape all regexp magic characters\nconst regexpEscape = (s: string) =>\n s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\n// everything has already been escaped, we just have to join\nconst rangesToString = (ranges: string[]): string => ranges.join('')\n\nexport type ParseClassResult = [\n src: string,\n uFlag: boolean,\n consumed: number,\n hasMagic: boolean,\n]\n\n// takes a glob string at a posix brace expression, and returns\n// an equivalent regular expression source, and boolean indicating\n// whether the /u flag needs to be applied, and the number of chars\n// consumed to parse the character class.\n// This also removes out of order ranges, and returns ($.) if the\n// entire class just no good.\nexport const parseClass = (\n glob: string,\n position: number,\n): ParseClassResult => {\n const pos = position\n /* c8 ignore start */\n if (glob.charAt(pos) !== '[') {\n throw new Error('not in a brace expression')\n }\n /* c8 ignore stop */\n const ranges: string[] = []\n const negs: string[] = []\n\n let i = pos + 1\n let sawStart = false\n let uflag = false\n let escaping = false\n let negate = false\n let endPos = pos\n let rangeStart = ''\n WHILE: while (i < glob.length) {\n const c = glob.charAt(i)\n if ((c === '!' || c === '^') && i === pos + 1) {\n negate = true\n i++\n continue\n }\n\n if (c === ']' && sawStart && !escaping) {\n endPos = i + 1\n break\n }\n\n sawStart = true\n if (c === '\\\\') {\n if (!escaping) {\n escaping = true\n i++\n continue\n }\n // escaped \\ char, fall through and treat like normal char\n }\n if (c === '[' && !escaping) {\n // either a posix class, a collation equivalent, or just a [\n for (const [cls, [unip, u, neg]] of Object.entries(posixClasses)) {\n if (glob.startsWith(cls, i)) {\n // invalid, [a-[] is fine, but not [a-[:alpha]]\n if (rangeStart) {\n return ['$.', false, glob.length - pos, true]\n }\n i += cls.length\n if (neg) negs.push(unip)\n else ranges.push(unip)\n uflag = uflag || u\n continue WHILE\n }\n }\n }\n\n // now it's just a normal character, effectively\n escaping = false\n if (rangeStart) {\n // throw this range away if it's not valid, but others\n // can still match.\n if (c > rangeStart) {\n ranges.push(braceEscape(rangeStart) + '-' + braceEscape(c))\n } else if (c === rangeStart) {\n ranges.push(braceEscape(c))\n }\n rangeStart = ''\n i++\n continue\n }\n\n // now might be the start of a range.\n // can be either c-d or c-] or c<more...>] or c] at this point\n if (glob.startsWith('-]', i + 1)) {\n ranges.push(braceEscape(c + '-'))\n i += 2\n continue\n }\n if (glob.startsWith('-', i + 1)) {\n rangeStart = c\n i += 2\n continue\n }\n\n // not the start of a range, just a single character\n ranges.push(braceEscape(c))\n i++\n }\n\n if (endPos < i) {\n // didn't see the end of the class, not a valid class,\n // but might still be valid as a literal match.\n return ['', false, 0, false]\n }\n\n // if we got no ranges and no negates, then we have a range that\n // cannot possibly match anything, and that poisons the whole glob\n if (!ranges.length && !negs.length) {\n return ['$.', false, glob.length - pos, true]\n }\n\n // if we got one positive range, and it's a single character, then that's\n // not actually a magic pattern, it's just that one literal character.\n // we should not treat that as \"magic\", we should just return the literal\n // character. [_] is a perfectly valid way to escape glob magic chars.\n if (\n negs.length === 0 &&\n ranges.length === 1 &&\n /^\\\\?.$/.test(ranges[0]) &&\n !negate\n ) {\n const r = ranges[0].length === 2 ? ranges[0].slice(-1) : ranges[0]\n return [regexpEscape(r), false, endPos - pos, false]\n }\n\n const sranges = '[' + (negate ? '^' : '') + rangesToString(ranges) + ']'\n const snegs = '[' + (negate ? '' : '^') + rangesToString(negs) + ']'\n const comb =\n ranges.length && negs.length\n ? '(' + sranges + '|' + snegs + ')'\n : ranges.length\n ? sranges\n : snegs\n\n return [comb, uflag, endPos - pos, true]\n}\n"]} \ No newline at end of file +{"version":3,"file":"brace-expressions.js","sourceRoot":"","sources":["../../src/brace-expressions.ts"],"names":[],"mappings":"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","sourcesContent":["// translate the various posix character classes into unicode properties\n// this works across all unicode locales\n\n// { <posix class>: [<translation>, /u flag required, negated]\nconst posixClasses: { [k: string]: [e: string, u: boolean, n?: boolean] } =\n {\n '[:alnum:]': ['\\\\p{L}\\\\p{Nl}\\\\p{Nd}', true],\n '[:alpha:]': ['\\\\p{L}\\\\p{Nl}', true],\n '[:ascii:]': ['\\\\x' + '00-\\\\x' + '7f', false],\n '[:blank:]': ['\\\\p{Zs}\\\\t', true],\n '[:cntrl:]': ['\\\\p{Cc}', true],\n '[:digit:]': ['\\\\p{Nd}', true],\n '[:graph:]': ['\\\\p{Z}\\\\p{C}', true, true],\n '[:lower:]': ['\\\\p{Ll}', true],\n '[:print:]': ['\\\\p{C}', true],\n '[:punct:]': ['\\\\p{P}', true],\n '[:space:]': ['\\\\p{Z}\\\\t\\\\r\\\\n\\\\v\\\\f', true],\n '[:upper:]': ['\\\\p{Lu}', true],\n '[:word:]': ['\\\\p{L}\\\\p{Nl}\\\\p{Nd}\\\\p{Pc}', true],\n '[:xdigit:]': ['A-Fa-f0-9', false],\n }\n\n// only need to escape a few things inside of brace expressions\n// escapes: [ \\ ] -\nconst braceEscape = (s: string) => s.replace(/[[\\]\\\\-]/g, '\\\\$&')\n// escape all regexp magic characters\nconst regexpEscape = (s: string) =>\n s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\n// everything has already been escaped, we just have to join\nconst rangesToString = (ranges: string[]): string => ranges.join('')\n\nexport type ParseClassResult = [\n src: string,\n uFlag: boolean,\n consumed: number,\n hasMagic: boolean,\n]\n\n// takes a glob string at a posix brace expression, and returns\n// an equivalent regular expression source, and boolean indicating\n// whether the /u flag needs to be applied, and the number of chars\n// consumed to parse the character class.\n// This also removes out of order ranges, and returns ($.) if the\n// entire class just no good.\nexport const parseClass = (\n glob: string,\n position: number,\n): ParseClassResult => {\n const pos = position\n /* c8 ignore start */\n if (glob.charAt(pos) !== '[') {\n throw new Error('not in a brace expression')\n }\n /* c8 ignore stop */\n const ranges: string[] = []\n const negs: string[] = []\n\n let i = pos + 1\n let sawStart = false\n let uflag = false\n let escaping = false\n let negate = false\n let endPos = pos\n let rangeStart = ''\n WHILE: while (i < glob.length) {\n const c = glob.charAt(i)\n if ((c === '!' || c === '^') && i === pos + 1) {\n negate = true\n i++\n continue\n }\n\n if (c === ']' && sawStart && !escaping) {\n endPos = i + 1\n break\n }\n\n sawStart = true\n if (c === '\\\\') {\n if (!escaping) {\n escaping = true\n i++\n continue\n }\n // escaped \\ char, fall through and treat like normal char\n }\n if (c === '[' && !escaping) {\n // either a posix class, a collation equivalent, or just a [\n for (const [cls, [unip, u, neg]] of Object.entries(posixClasses)) {\n if (glob.startsWith(cls, i)) {\n // invalid, [a-[] is fine, but not [a-[:alpha]]\n if (rangeStart) {\n return ['$.', false, glob.length - pos, true]\n }\n i += cls.length\n if (neg) negs.push(unip)\n else ranges.push(unip)\n uflag = uflag || u\n continue WHILE\n }\n }\n }\n\n // now it's just a normal character, effectively\n escaping = false\n if (rangeStart) {\n // throw this range away if it's not valid, but others\n // can still match.\n if (c > rangeStart) {\n ranges.push(braceEscape(rangeStart) + '-' + braceEscape(c))\n } else if (c === rangeStart) {\n ranges.push(braceEscape(c))\n }\n rangeStart = ''\n i++\n continue\n }\n\n // now might be the start of a range.\n // can be either c-d or c-] or c<more...>] or c] at this point\n if (glob.startsWith('-]', i + 1)) {\n ranges.push(braceEscape(c + '-'))\n i += 2\n continue\n }\n if (glob.startsWith('-', i + 1)) {\n rangeStart = c\n i += 2\n continue\n }\n\n // not the start of a range, just a single character\n ranges.push(braceEscape(c))\n i++\n }\n\n if (endPos < i) {\n // didn't see the end of the class, not a valid class,\n // but might still be valid as a literal match.\n return ['', false, 0, false]\n }\n\n // if we got no ranges and no negates, then we have a range that\n // cannot possibly match anything, and that poisons the whole glob\n if (!ranges.length && !negs.length) {\n return ['$.', false, glob.length - pos, true]\n }\n\n // if we got one positive range, and it's a single character, then that's\n // not actually a magic pattern, it's just that one literal character.\n // we should not treat that as \"magic\", we should just return the literal\n // character. [_] is a perfectly valid way to escape glob magic chars.\n if (\n negs.length === 0 &&\n ranges.length === 1 &&\n /^\\\\?.$/.test(ranges[0]) &&\n !negate\n ) {\n const r = ranges[0].length === 2 ? ranges[0].slice(-1) : ranges[0]\n return [regexpEscape(r), false, endPos - pos, false]\n }\n\n const sranges = '[' + (negate ? '^' : '') + rangesToString(ranges) + ']'\n const snegs = '[' + (negate ? '' : '^') + rangesToString(negs) + ']'\n const comb =\n ranges.length && negs.length ? '(' + sranges + '|' + snegs + ')'\n : ranges.length ? sranges\n : snegs\n\n return [comb, uflag, endPos - pos, true]\n}\n"]} \ No newline at end of file diff --git a/deps/minimatch/dist/esm/escape.js b/deps/minimatch/dist/esm/escape.js index bab968ff3d83c9..46d0ec8858e5b3 100644 --- a/deps/minimatch/dist/esm/escape.js +++ b/deps/minimatch/dist/esm/escape.js @@ -15,12 +15,12 @@ export const escape = (s, { windowsPathsNoEscape = false, magicalBraces = false, // that make those magic, and escaping ! as [!] isn't valid, // because [!]] is a valid glob class meaning not ']'. if (magicalBraces) { - return windowsPathsNoEscape - ? s.replace(/[?*()[\]{}]/g, '[$&]') + return windowsPathsNoEscape ? + s.replace(/[?*()[\]{}]/g, '[$&]') : s.replace(/[?*()[\]\\{}]/g, '\\$&'); } - return windowsPathsNoEscape - ? s.replace(/[?*()[\]]/g, '[$&]') + return windowsPathsNoEscape ? + s.replace(/[?*()[\]]/g, '[$&]') : s.replace(/[?*()[\]\\]/g, '\\$&'); }; //# sourceMappingURL=escape.js.map \ No newline at end of file diff --git a/deps/minimatch/dist/esm/escape.js.map b/deps/minimatch/dist/esm/escape.js.map index 5d7f282ad11eb1..f6733c65f13df2 100644 --- a/deps/minimatch/dist/esm/escape.js.map +++ b/deps/minimatch/dist/esm/escape.js.map @@ -1 +1 @@ -{"version":3,"file":"escape.js","sourceRoot":"","sources":["../../src/escape.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CACpB,CAAS,EACT,EACE,oBAAoB,GAAG,KAAK,EAC5B,aAAa,GAAG,KAAK,MAC+C,EAAE,EACxE,EAAE;IACF,wDAAwD;IACxD,4DAA4D;IAC5D,sDAAsD;IACtD,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,oBAAoB;YACzB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC;YACnC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAA;IACzC,CAAC;IACD,OAAO,oBAAoB;QACzB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC;QACjC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC,CAAA;AACvC,CAAC,CAAA","sourcesContent":["import { MinimatchOptions } from './index.js'\n\n/**\n * Escape all magic characters in a glob pattern.\n *\n * If the {@link MinimatchOptions.windowsPathsNoEscape}\n * option is used, then characters are escaped by wrapping in `[]`, because\n * a magic character wrapped in a character class can only be satisfied by\n * that exact character. In this mode, `\\` is _not_ escaped, because it is\n * not interpreted as a magic character, but instead as a path separator.\n *\n * If the {@link MinimatchOptions.magicalBraces} option is used,\n * then braces (`{` and `}`) will be escaped.\n */\nexport const escape = (\n s: string,\n {\n windowsPathsNoEscape = false,\n magicalBraces = false,\n }: Pick<MinimatchOptions, 'windowsPathsNoEscape' | 'magicalBraces'> = {},\n) => {\n // don't need to escape +@! because we escape the parens\n // that make those magic, and escaping ! as [!] isn't valid,\n // because [!]] is a valid glob class meaning not ']'.\n if (magicalBraces) {\n return windowsPathsNoEscape\n ? s.replace(/[?*()[\\]{}]/g, '[$&]')\n : s.replace(/[?*()[\\]\\\\{}]/g, '\\\\$&')\n }\n return windowsPathsNoEscape\n ? s.replace(/[?*()[\\]]/g, '[$&]')\n : s.replace(/[?*()[\\]\\\\]/g, '\\\\$&')\n}\n"]} \ No newline at end of file +{"version":3,"file":"escape.js","sourceRoot":"","sources":["../../src/escape.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CACpB,CAAS,EACT,EACE,oBAAoB,GAAG,KAAK,EAC5B,aAAa,GAAG,KAAK,MAC+C,EAAE,EACxE,EAAE;IACF,wDAAwD;IACxD,4DAA4D;IAC5D,sDAAsD;IACtD,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,oBAAoB,CAAC,CAAC;YACzB,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC;YACnC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAA;IACzC,CAAC;IACD,OAAO,oBAAoB,CAAC,CAAC;QACzB,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC;QACjC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC,CAAA;AACvC,CAAC,CAAA","sourcesContent":["import { MinimatchOptions } from './index.js'\n\n/**\n * Escape all magic characters in a glob pattern.\n *\n * If the {@link MinimatchOptions.windowsPathsNoEscape}\n * option is used, then characters are escaped by wrapping in `[]`, because\n * a magic character wrapped in a character class can only be satisfied by\n * that exact character. In this mode, `\\` is _not_ escaped, because it is\n * not interpreted as a magic character, but instead as a path separator.\n *\n * If the {@link MinimatchOptions.magicalBraces} option is used,\n * then braces (`{` and `}`) will be escaped.\n */\nexport const escape = (\n s: string,\n {\n windowsPathsNoEscape = false,\n magicalBraces = false,\n }: Pick<MinimatchOptions, 'windowsPathsNoEscape' | 'magicalBraces'> = {},\n) => {\n // don't need to escape +@! because we escape the parens\n // that make those magic, and escaping ! as [!] isn't valid,\n // because [!]] is a valid glob class meaning not ']'.\n if (magicalBraces) {\n return windowsPathsNoEscape ?\n s.replace(/[?*()[\\]{}]/g, '[$&]')\n : s.replace(/[?*()[\\]\\\\{}]/g, '\\\\$&')\n }\n return windowsPathsNoEscape ?\n s.replace(/[?*()[\\]]/g, '[$&]')\n : s.replace(/[?*()[\\]\\\\]/g, '\\\\$&')\n}\n"]} \ No newline at end of file diff --git a/deps/minimatch/dist/esm/index.d.ts b/deps/minimatch/dist/esm/index.d.ts index 968eb143d868b2..137bd803690752 100644 --- a/deps/minimatch/dist/esm/index.d.ts +++ b/deps/minimatch/dist/esm/index.d.ts @@ -1,26 +1,104 @@ import { AST } from './ast.js'; export type Platform = 'aix' | 'android' | 'darwin' | 'freebsd' | 'haiku' | 'linux' | 'openbsd' | 'sunos' | 'win32' | 'cygwin' | 'netbsd'; export interface MinimatchOptions { + /** do not expand `{x,y}` style braces */ nobrace?: boolean; + /** do not treat patterns starting with `#` as a comment */ nocomment?: boolean; + /** do not treat patterns starting with `!` as a negation */ nonegate?: boolean; + /** print LOTS of debugging output */ debug?: boolean; + /** treat `**` the same as `*` */ noglobstar?: boolean; + /** do not expand extglobs like `+(a|b)` */ noext?: boolean; + /** return the pattern if nothing matches */ nonull?: boolean; + /** treat `\\` as a path separator, not an escape character */ windowsPathsNoEscape?: boolean; + /** + * inverse of {@link MinimatchOptions.windowsPathsNoEscape} + * @deprecated + */ allowWindowsEscape?: boolean; + /** + * Compare a partial path to a pattern. As long as the parts + * of the path that are present are not contradicted by the + * pattern, it will be treated as a match. This is useful in + * applications where you're walking through a folder structure, + * and don't yet have the full path, but want to ensure that you + * do not walk down paths that can never be a match. + */ partial?: boolean; + /** allow matches that start with `.` even if the pattern does not */ dot?: boolean; + /** ignore case */ nocase?: boolean; + /** ignore case only in wildcard patterns */ nocaseMagicOnly?: boolean; + /** consider braces to be "magic" for the purpose of `hasMagic` */ magicalBraces?: boolean; + /** + * If set, then patterns without slashes will be matched + * against the basename of the path if it contains slashes. + * For example, `a?b` would match the path `/xyz/123/acb`, but + * not `/xyz/acb/123`. + */ matchBase?: boolean; + /** invert the results of negated matches */ flipNegate?: boolean; + /** do not collapse multiple `/` into a single `/` */ preserveMultipleSlashes?: boolean; + /** + * A number indicating the level of optimization that should be done + * to the pattern prior to parsing and using it for matches. + */ optimizationLevel?: number; + /** operating system platform */ platform?: Platform; + /** + * When a pattern starts with a UNC path or drive letter, and in + * `nocase:true` mode, do not convert the root portions of the + * pattern into a case-insensitive regular expression, and instead + * leave them as strings. + * + * This is the default when the platform is `win32` and + * `nocase:true` is set. + */ windowsNoMagicRoot?: boolean; + /** + * max number of `{...}` patterns to expand. Default 100_000. + */ + braceExpandMax?: number; + /** + * Max number of non-adjacent `**` patterns to recursively walk down. + * + * The default of 200 is almost certainly high enough for most purposes, + * and can handle absurdly excessive patterns. + */ + maxGlobstarRecursion?: number; + /** + * Max depth to traverse for nested extglobs like `*(a|b|c)` + * + * Default is 2, which is quite low, but any higher value + * swiftly results in punishing performance impacts. Note + * that this is *not* relevant when the globstar types can + * be safely coalesced into a single set. + * + * For example, `*(a|@(b|c)|d)` would be flattened into + * `*(a|b|c|d)`. Thus, many common extglobs will retain good + * performance and never hit this limit, even if they are + * excessively deep and complicated. + * + * If the limit is hit, then the extglob characters are simply + * not parsed, and the pattern effectively switches into + * `noextglob: true` mode for the contents of that nested + * sub-pattern. This will typically _not_ result in a match, + * but is considered a valid trade-off for security and + * performance. + */ + maxExtglobRecursion?: number; } export declare const minimatch: { (p: string, pattern: string, options?: MinimatchOptions): boolean; @@ -51,6 +129,7 @@ export type MMRegExp = RegExp & { export type ParseReturnFiltered = string | MMRegExp | typeof GLOBSTAR; export type ParseReturn = ParseReturnFiltered | false; export declare class Minimatch { + #private; options: MinimatchOptions; set: ParseReturnFiltered[][]; pattern: string; @@ -67,6 +146,7 @@ export declare class Minimatch { isWindows: boolean; platform: Platform; windowsNoMagicRoot: boolean; + maxGlobstarRecursion: number; regexp: false | null | MMRegExp; constructor(pattern: string, options?: MinimatchOptions); hasMagic(): boolean; diff --git a/deps/minimatch/dist/esm/index.d.ts.map b/deps/minimatch/dist/esm/index.d.ts.map index f241c28bf9a753..1c65035ac63c5a 100644 --- a/deps/minimatch/dist/esm/index.d.ts.map +++ b/deps/minimatch/dist/esm/index.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/deps/minimatch/dist/esm/index.js b/deps/minimatch/dist/esm/index.js index e83823fa6e1b55..a9e0602187c7fd 100644 --- a/deps/minimatch/dist/esm/index.js +++ b/deps/minimatch/dist/esm/index.js @@ -1,4 +1,4 @@ -import { expand } from '@isaacs/brace-expansion'; +import { expand } from 'brace-expansion'; import { assertValidPattern } from './assert-valid-pattern.js'; import { AST } from './ast.js'; import { escape } from './escape.js'; @@ -63,8 +63,8 @@ const qmarksTestNoExtDot = ([$0]) => { return (f) => f.length === len && f !== '.' && f !== '..'; }; /* c8 ignore start */ -const defaultPlatform = (typeof process === 'object' && process - ? (typeof process.env === 'object' && +const defaultPlatform = (typeof process === 'object' && process ? + (typeof process.env === 'object' && process.env && process.env.__MINIMATCH_TESTING_PLATFORM__) || process.platform @@ -148,7 +148,7 @@ export const braceExpand = (pattern, options = {}) => { // shortcut. no need to expand. return [pattern]; } - return expand(pattern); + return expand(pattern, { max: options.braceExpandMax }); }; minimatch.braceExpand = braceExpand; // parse a component of the expanded set. @@ -193,16 +193,20 @@ export class Minimatch { isWindows; platform; windowsNoMagicRoot; + maxGlobstarRecursion; regexp; constructor(pattern, options = {}) { assertValidPattern(pattern); options = options || {}; this.options = options; + this.maxGlobstarRecursion = options.maxGlobstarRecursion ?? 200; this.pattern = pattern; this.platform = options.platform || defaultPlatform; this.isWindows = this.platform === 'win32'; + // avoid the annoying deprecation flag lol + const awe = ('allowWindow' + 'sEscape'); this.windowsPathsNoEscape = - !!options.windowsPathsNoEscape || options.allowWindowsEscape === false; + !!options.windowsPathsNoEscape || options[awe] === false; if (this.windowsPathsNoEscape) { this.pattern = this.pattern.replace(/\\/g, '/'); } @@ -215,8 +219,8 @@ export class Minimatch { this.partial = !!options.partial; this.nocase = !!this.options.nocase; this.windowsNoMagicRoot = - options.windowsNoMagicRoot !== undefined - ? options.windowsNoMagicRoot + options.windowsNoMagicRoot !== undefined ? + options.windowsNoMagicRoot : !!(this.isWindows && this.nocase); this.globSet = []; this.globParts = []; @@ -279,7 +283,10 @@ export class Minimatch { !globMagic.test(s[3]); const isDrive = /^[a-z]:/i.test(s[0]); if (isUNC) { - return [...s.slice(0, 4), ...s.slice(4).map(ss => this.parse(ss))]; + return [ + ...s.slice(0, 4), + ...s.slice(4).map(ss => this.parse(ss)), + ]; } else if (isDrive) { return [s[0], ...s.slice(1).map(ss => this.parse(ss))]; @@ -311,7 +318,7 @@ export class Minimatch { // to the right as possible, even if it increases the number // of patterns that we have to process. preprocess(globParts) { - // if we're not in globstar mode, then turn all ** into * + // if we're not in globstar mode, then turn ** into * if (this.options.noglobstar) { for (let i = 0; i < globParts.length; i++) { for (let j = 0; j < globParts[i].length; j++) { @@ -597,7 +604,8 @@ export class Minimatch { // out of pattern, then that's fine, as long as all // the parts match. matchOne(file, pattern, partial = false) { - const options = this.options; + let fileStartIndex = 0; + let patternStartIndex = 0; // UNC paths like //?/X:/... can match X:/... and vice versa // Drive letters in absolute drive or unc paths are always compared // case-insensitively. @@ -615,18 +623,22 @@ export class Minimatch { pattern[2] === '?' && typeof pattern[3] === 'string' && /^[a-z]:$/i.test(pattern[3]); - const fdi = fileUNC ? 3 : fileDrive ? 0 : undefined; - const pdi = patternUNC ? 3 : patternDrive ? 0 : undefined; + const fdi = fileUNC ? 3 + : fileDrive ? 0 + : undefined; + const pdi = patternUNC ? 3 + : patternDrive ? 0 + : undefined; if (typeof fdi === 'number' && typeof pdi === 'number') { - const [fd, pd] = [file[fdi], pattern[pdi]]; + const [fd, pd] = [ + file[fdi], + pattern[pdi], + ]; + // start matching at the drive letter index of each if (fd.toLowerCase() === pd.toLowerCase()) { pattern[pdi] = fd; - if (pdi > fdi) { - pattern = pattern.slice(pdi); - } - else if (fdi > pdi) { - file = file.slice(fdi); - } + patternStartIndex = pdi; + fileStartIndex = fdi; } } } @@ -636,99 +648,185 @@ export class Minimatch { if (optimizationLevel >= 2) { file = this.levelTwoFileOptimize(file); } - this.debug('matchOne', this, { file, pattern }); - this.debug('matchOne', file.length, pattern.length); - for (var fi = 0, pi = 0, fl = file.length, pl = pattern.length; fi < fl && pi < pl; fi++, pi++) { + if (pattern.includes(GLOBSTAR)) { + return this.#matchGlobstar(file, pattern, partial, fileStartIndex, patternStartIndex); + } + return this.#matchOne(file, pattern, partial, fileStartIndex, patternStartIndex); + } + #matchGlobstar(file, pattern, partial, fileIndex, patternIndex) { + // split the pattern into head, tail, and middle of ** delimited parts + const firstgs = pattern.indexOf(GLOBSTAR, patternIndex); + const lastgs = pattern.lastIndexOf(GLOBSTAR); + // split the pattern up into globstar-delimited sections + // the tail has to be at the end, and the others just have + // to be found in order from the head. + const [head, body, tail] = partial ? [ + pattern.slice(patternIndex, firstgs), + pattern.slice(firstgs + 1), + [], + ] : [ + pattern.slice(patternIndex, firstgs), + pattern.slice(firstgs + 1, lastgs), + pattern.slice(lastgs + 1), + ]; + // check the head, from the current file/pattern index. + if (head.length) { + const fileHead = file.slice(fileIndex, fileIndex + head.length); + if (!this.#matchOne(fileHead, head, partial, 0, 0)) { + return false; + } + fileIndex += head.length; + patternIndex += head.length; + } + // now we know the head matches! + // if the last portion is not empty, it MUST match the end + // check the tail + let fileTailMatch = 0; + if (tail.length) { + // if head + tail > file, then we cannot possibly match + if (tail.length + fileIndex > file.length) + return false; + // try to match the tail + let tailStart = file.length - tail.length; + if (this.#matchOne(file, tail, partial, tailStart, 0)) { + fileTailMatch = tail.length; + } + else { + // affordance for stuff like a/**/* matching a/b/ + // if the last file portion is '', and there's more to the pattern + // then try without the '' bit. + if (file[file.length - 1] !== '' || + fileIndex + tail.length === file.length) { + return false; + } + tailStart--; + if (!this.#matchOne(file, tail, partial, tailStart, 0)) { + return false; + } + fileTailMatch = tail.length + 1; + } + } + // now we know the tail matches! + // the middle is zero or more portions wrapped in **, possibly + // containing more ** sections. + // so a/**/b/**/c/**/d has become **/b/**/c/** + // if it's empty, it means a/**/b, just verify we have no bad dots + // if there's no tail, so it ends on /**, then we must have *something* + // after the head, or it's not a matc + if (!body.length) { + let sawSome = !!fileTailMatch; + for (let i = fileIndex; i < file.length - fileTailMatch; i++) { + const f = String(file[i]); + sawSome = true; + if (f === '.' || + f === '..' || + (!this.options.dot && f.startsWith('.'))) { + return false; + } + } + // in partial mode, we just need to get past all file parts + return partial || sawSome; + } + // now we know that there's one or more body sections, which can + // be matched anywhere from the 0 index (because the head was pruned) + // through to the length-fileTailMatch index. + // split the body up into sections, and note the minimum index it can + // be found at (start with the length of all previous segments) + // [section, before, after] + const bodySegments = [[[], 0]]; + let currentBody = bodySegments[0]; + let nonGsParts = 0; + const nonGsPartsSums = [0]; + for (const b of body) { + if (b === GLOBSTAR) { + nonGsPartsSums.push(nonGsParts); + currentBody = [[], 0]; + bodySegments.push(currentBody); + } + else { + currentBody[0].push(b); + nonGsParts++; + } + } + let i = bodySegments.length - 1; + const fileLength = file.length - fileTailMatch; + for (const b of bodySegments) { + b[1] = fileLength - (nonGsPartsSums[i--] + b[0].length); + } + return !!this.#matchGlobStarBodySections(file, bodySegments, fileIndex, 0, partial, 0, !!fileTailMatch); + } + // return false for "nope, not matching" + // return null for "not matching, cannot keep trying" + #matchGlobStarBodySections(file, + // pattern section, last possible position for it + bodySegments, fileIndex, bodyIndex, partial, globStarDepth, sawTail) { + // take the first body segment, and walk from fileIndex to its "after" + // value at the end + // If it doesn't match at that position, we increment, until we hit + // that final possible position, and give up. + // If it does match, then advance and try to rest. + // If any of them fail we keep walking forward. + // this is still a bit recursively painful, but it's more constrained + // than previous implementations, because we never test something that + // can't possibly be a valid matching condition. + const bs = bodySegments[bodyIndex]; + if (!bs) { + // just make sure that there's no bad dots + for (let i = fileIndex; i < file.length; i++) { + sawTail = true; + const f = file[i]; + if (f === '.' || + f === '..' || + (!this.options.dot && f.startsWith('.'))) { + return false; + } + } + return sawTail; + } + // have a non-globstar body section to test + const [body, after] = bs; + while (fileIndex <= after) { + const m = this.#matchOne(file.slice(0, fileIndex + body.length), body, partial, fileIndex, 0); + // if limit exceeded, no match. intentional false negative, + // acceptable break in correctness for security. + if (m && globStarDepth < this.maxGlobstarRecursion) { + // match! see if the rest match. if so, we're done! + const sub = this.#matchGlobStarBodySections(file, bodySegments, fileIndex + body.length, bodyIndex + 1, partial, globStarDepth + 1, sawTail); + if (sub !== false) { + return sub; + } + } + const f = file[fileIndex]; + if (f === '.' || + f === '..' || + (!this.options.dot && f.startsWith('.'))) { + return false; + } + fileIndex++; + } + // walked off. no point continuing + return partial || null; + } + #matchOne(file, pattern, partial, fileIndex, patternIndex) { + let fi; + let pi; + let pl; + let fl; + for (fi = fileIndex, + pi = patternIndex, + fl = file.length, + pl = pattern.length; fi < fl && pi < pl; fi++, pi++) { this.debug('matchOne loop'); - var p = pattern[pi]; - var f = file[fi]; + let p = pattern[pi]; + let f = file[fi]; this.debug(pattern, p, f); // should be impossible. // some invalid regexp stuff in the set. /* c8 ignore start */ - if (p === false) { + if (p === false || p === GLOBSTAR) { return false; } /* c8 ignore stop */ - if (p === GLOBSTAR) { - this.debug('GLOBSTAR', [pattern, p, f]); - // "**" - // a/**/b/**/c would match the following: - // a/b/x/y/z/c - // a/x/y/z/b/c - // a/b/x/b/x/c - // a/b/c - // To do this, take the rest of the pattern after - // the **, and see if it would match the file remainder. - // If so, return success. - // If not, the ** "swallows" a segment, and try again. - // This is recursively awful. - // - // a/**/b/**/c matching a/b/x/y/z/c - // - a matches a - // - doublestar - // - matchOne(b/x/y/z/c, b/**/c) - // - b matches b - // - doublestar - // - matchOne(x/y/z/c, c) -> no - // - matchOne(y/z/c, c) -> no - // - matchOne(z/c, c) -> no - // - matchOne(c, c) yes, hit - var fr = fi; - var pr = pi + 1; - if (pr === pl) { - this.debug('** at the end'); - // a ** at the end will just swallow the rest. - // We have found a match. - // however, it will not swallow /.x, unless - // options.dot is set. - // . and .. are *never* matched by **, for explosively - // exponential reasons. - for (; fi < fl; fi++) { - if (file[fi] === '.' || - file[fi] === '..' || - (!options.dot && file[fi].charAt(0) === '.')) - return false; - } - return true; - } - // ok, let's see if we can swallow whatever we can. - while (fr < fl) { - var swallowee = file[fr]; - this.debug('\nglobstar while', file, fr, pattern, pr, swallowee); - // XXX remove this slice. Just pass the start index. - if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { - this.debug('globstar found match!', fr, fl, swallowee); - // found a match. - return true; - } - else { - // can't swallow "." or ".." ever. - // can only swallow ".foo" when explicitly asked. - if (swallowee === '.' || - swallowee === '..' || - (!options.dot && swallowee.charAt(0) === '.')) { - this.debug('dot detected!', file, fr, pattern, pr); - break; - } - // ** swallows a segment, and continue. - this.debug('globstar swallow a segment, and continue'); - fr++; - } - } - // no match was found. - // However, in partial mode, we can't say this is necessarily over. - /* c8 ignore start */ - if (partial) { - // ran out of file - this.debug('\n>>> no match, partial?', file, fr, pattern, pr); - if (fr === fl) { - return true; - } - } - /* c8 ignore stop */ - return false; - } // something other than ** // non-magic patterns just have to match exactly // patterns with magic have been turned into regexps. @@ -799,21 +897,19 @@ export class Minimatch { fastTest = options.dot ? starTestDot : starTest; } else if ((m = pattern.match(starDotExtRE))) { - fastTest = (options.nocase - ? options.dot - ? starDotExtTestNocaseDot + fastTest = (options.nocase ? + options.dot ? + starDotExtTestNocaseDot : starDotExtTestNocase - : options.dot - ? starDotExtTestDot + : options.dot ? starDotExtTestDot : starDotExtTest)(m[1]); } else if ((m = pattern.match(qmarksRE))) { - fastTest = (options.nocase - ? options.dot - ? qmarksTestNocaseDot + fastTest = (options.nocase ? + options.dot ? + qmarksTestNocaseDot : qmarksTestNocase - : options.dot - ? qmarksTestDot + : options.dot ? qmarksTestDot : qmarksTest)(m); } else if ((m = pattern.match(starDotStarRE))) { @@ -844,10 +940,8 @@ export class Minimatch { return this.regexp; } const options = this.options; - const twoStar = options.noglobstar - ? star - : options.dot - ? twoStarDot + const twoStar = options.noglobstar ? star + : options.dot ? twoStarDot : twoStarNoDot; const flags = new Set(options.nocase ? ['i'] : []); // regexpify non-globstar patterns @@ -863,11 +957,9 @@ export class Minimatch { for (const f of p.flags.split('')) flags.add(f); } - return typeof p === 'string' - ? regExpEscape(p) - : p === GLOBSTAR - ? GLOBSTAR - : p._src; + return (typeof p === 'string' ? regExpEscape(p) + : p === GLOBSTAR ? GLOBSTAR + : p._src); }); pp.forEach((p, i) => { const next = pp[i + 1]; diff --git a/deps/minimatch/dist/esm/index.js.map b/deps/minimatch/dist/esm/index.js.map index bbbc70e01cc3cd..2dc46400d4755b 100644 --- a/deps/minimatch/dist/esm/index.js.map +++ b/deps/minimatch/dist/esm/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { expand } from '@isaacs/brace-expansion'\nimport { assertValidPattern } from './assert-valid-pattern.js'\nimport { AST, ExtglobType } from './ast.js'\nimport { escape } from './escape.js'\nimport { unescape } from './unescape.js'\n\nexport type Platform =\n | 'aix'\n | 'android'\n | 'darwin'\n | 'freebsd'\n | 'haiku'\n | 'linux'\n | 'openbsd'\n | 'sunos'\n | 'win32'\n | 'cygwin'\n | 'netbsd'\n\nexport interface MinimatchOptions {\n nobrace?: boolean\n nocomment?: boolean\n nonegate?: boolean\n debug?: boolean\n noglobstar?: boolean\n noext?: boolean\n nonull?: boolean\n windowsPathsNoEscape?: boolean\n allowWindowsEscape?: boolean\n partial?: boolean\n dot?: boolean\n nocase?: boolean\n nocaseMagicOnly?: boolean\n magicalBraces?: boolean\n matchBase?: boolean\n flipNegate?: boolean\n preserveMultipleSlashes?: boolean\n optimizationLevel?: number\n platform?: Platform\n windowsNoMagicRoot?: boolean\n}\n\nexport const minimatch = (\n p: string,\n pattern: string,\n options: MinimatchOptions = {},\n) => {\n assertValidPattern(pattern)\n\n // shortcut: comments match nothing.\n if (!options.nocomment && pattern.charAt(0) === '#') {\n return false\n }\n\n return new Minimatch(pattern, options).match(p)\n}\n\n// Optimized checking for the most common glob patterns.\nconst starDotExtRE = /^\\*+([^+@!?\\*\\[\\(]*)$/\nconst starDotExtTest = (ext: string) => (f: string) =>\n !f.startsWith('.') && f.endsWith(ext)\nconst starDotExtTestDot = (ext: string) => (f: string) => f.endsWith(ext)\nconst starDotExtTestNocase = (ext: string) => {\n ext = ext.toLowerCase()\n return (f: string) => !f.startsWith('.') && f.toLowerCase().endsWith(ext)\n}\nconst starDotExtTestNocaseDot = (ext: string) => {\n ext = ext.toLowerCase()\n return (f: string) => f.toLowerCase().endsWith(ext)\n}\nconst starDotStarRE = /^\\*+\\.\\*+$/\nconst starDotStarTest = (f: string) => !f.startsWith('.') && f.includes('.')\nconst starDotStarTestDot = (f: string) =>\n f !== '.' && f !== '..' && f.includes('.')\nconst dotStarRE = /^\\.\\*+$/\nconst dotStarTest = (f: string) => f !== '.' && f !== '..' && f.startsWith('.')\nconst starRE = /^\\*+$/\nconst starTest = (f: string) => f.length !== 0 && !f.startsWith('.')\nconst starTestDot = (f: string) => f.length !== 0 && f !== '.' && f !== '..'\nconst qmarksRE = /^\\?+([^+@!?\\*\\[\\(]*)?$/\nconst qmarksTestNocase = ([$0, ext = '']: RegExpMatchArray) => {\n const noext = qmarksTestNoExt([$0])\n if (!ext) return noext\n ext = ext.toLowerCase()\n return (f: string) => noext(f) && f.toLowerCase().endsWith(ext)\n}\nconst qmarksTestNocaseDot = ([$0, ext = '']: RegExpMatchArray) => {\n const noext = qmarksTestNoExtDot([$0])\n if (!ext) return noext\n ext = ext.toLowerCase()\n return (f: string) => noext(f) && f.toLowerCase().endsWith(ext)\n}\nconst qmarksTestDot = ([$0, ext = '']: RegExpMatchArray) => {\n const noext = qmarksTestNoExtDot([$0])\n return !ext ? noext : (f: string) => noext(f) && f.endsWith(ext)\n}\nconst qmarksTest = ([$0, ext = '']: RegExpMatchArray) => {\n const noext = qmarksTestNoExt([$0])\n return !ext ? noext : (f: string) => noext(f) && f.endsWith(ext)\n}\nconst qmarksTestNoExt = ([$0]: RegExpMatchArray) => {\n const len = $0.length\n return (f: string) => f.length === len && !f.startsWith('.')\n}\nconst qmarksTestNoExtDot = ([$0]: RegExpMatchArray) => {\n const len = $0.length\n return (f: string) => f.length === len && f !== '.' && f !== '..'\n}\n\n/* c8 ignore start */\nconst defaultPlatform: Platform = (\n typeof process === 'object' && process\n ? (typeof process.env === 'object' &&\n process.env &&\n process.env.__MINIMATCH_TESTING_PLATFORM__) ||\n process.platform\n : 'posix'\n) as Platform\n\nexport type Sep = '\\\\' | '/'\n\nconst path: { [k: string]: { sep: Sep } } = {\n win32: { sep: '\\\\' },\n posix: { sep: '/' },\n}\n/* c8 ignore stop */\n\nexport const sep = defaultPlatform === 'win32' ? path.win32.sep : path.posix.sep\nminimatch.sep = sep\n\nexport const GLOBSTAR = Symbol('globstar **')\nminimatch.GLOBSTAR = GLOBSTAR\n\n// any single thing other than /\n// don't need to escape / when using new RegExp()\nconst qmark = '[^/]'\n\n// * => any number of characters\nconst star = qmark + '*?'\n\n// ** when dots are allowed. Anything goes, except .. and .\n// not (^ or / followed by one or two dots followed by $ or /),\n// followed by anything, any number of times.\nconst twoStarDot = '(?:(?!(?:\\\\/|^)(?:\\\\.{1,2})($|\\\\/)).)*?'\n\n// not a ^ or / followed by a dot,\n// followed by anything, any number of times.\nconst twoStarNoDot = '(?:(?!(?:\\\\/|^)\\\\.).)*?'\n\nexport const filter =\n (pattern: string, options: MinimatchOptions = {}) =>\n (p: string) =>\n minimatch(p, pattern, options)\nminimatch.filter = filter\n\nconst ext = (a: MinimatchOptions, b: MinimatchOptions = {}) =>\n Object.assign({}, a, b)\n\nexport const defaults = (def: MinimatchOptions): typeof minimatch => {\n if (!def || typeof def !== 'object' || !Object.keys(def).length) {\n return minimatch\n }\n\n const orig = minimatch\n\n const m = (p: string, pattern: string, options: MinimatchOptions = {}) =>\n orig(p, pattern, ext(def, options))\n\n return Object.assign(m, {\n Minimatch: class Minimatch extends orig.Minimatch {\n constructor(pattern: string, options: MinimatchOptions = {}) {\n super(pattern, ext(def, options))\n }\n static defaults(options: MinimatchOptions) {\n return orig.defaults(ext(def, options)).Minimatch\n }\n },\n\n AST: class AST extends orig.AST {\n /* c8 ignore start */\n constructor(\n type: ExtglobType | null,\n parent?: AST,\n options: MinimatchOptions = {},\n ) {\n super(type, parent, ext(def, options))\n }\n /* c8 ignore stop */\n\n static fromGlob(pattern: string, options: MinimatchOptions = {}) {\n return orig.AST.fromGlob(pattern, ext(def, options))\n }\n },\n\n unescape: (\n s: string,\n options: Pick<\n MinimatchOptions,\n 'windowsPathsNoEscape' | 'magicalBraces'\n > = {},\n ) => orig.unescape(s, ext(def, options)),\n\n escape: (\n s: string,\n options: Pick<\n MinimatchOptions,\n 'windowsPathsNoEscape' | 'magicalBraces'\n > = {},\n ) => orig.escape(s, ext(def, options)),\n\n filter: (pattern: string, options: MinimatchOptions = {}) =>\n orig.filter(pattern, ext(def, options)),\n\n defaults: (options: MinimatchOptions) => orig.defaults(ext(def, options)),\n\n makeRe: (pattern: string, options: MinimatchOptions = {}) =>\n orig.makeRe(pattern, ext(def, options)),\n\n braceExpand: (pattern: string, options: MinimatchOptions = {}) =>\n orig.braceExpand(pattern, ext(def, options)),\n\n match: (list: string[], pattern: string, options: MinimatchOptions = {}) =>\n orig.match(list, pattern, ext(def, options)),\n\n sep: orig.sep,\n GLOBSTAR: GLOBSTAR as typeof GLOBSTAR,\n })\n}\nminimatch.defaults = defaults\n\n// Brace expansion:\n// a{b,c}d -> abd acd\n// a{b,}c -> abc ac\n// a{0..3}d -> a0d a1d a2d a3d\n// a{b,c{d,e}f}g -> abg acdfg acefg\n// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg\n//\n// Invalid sets are not expanded.\n// a{2..}b -> a{2..}b\n// a{b}c -> a{b}c\nexport const braceExpand = (\n pattern: string,\n options: MinimatchOptions = {},\n) => {\n assertValidPattern(pattern)\n\n // Thanks to Yeting Li <https://github.com/yetingli> for\n // improving this regexp to avoid a ReDOS vulnerability.\n if (options.nobrace || !/\\{(?:(?!\\{).)*\\}/.test(pattern)) {\n // shortcut. no need to expand.\n return [pattern]\n }\n\n return expand(pattern)\n}\nminimatch.braceExpand = braceExpand\n\n// parse a component of the expanded set.\n// At this point, no pattern may contain \"/\" in it\n// so we're going to return a 2d array, where each entry is the full\n// pattern, split on '/', and then turned into a regular expression.\n// A regexp is made at the end which joins each array with an\n// escaped /, and another full one which joins each regexp with |.\n//\n// Following the lead of Bash 4.1, note that \"**\" only has special meaning\n// when it is the *only* thing in a path portion. Otherwise, any series\n// of * is equivalent to a single *. Globstar behavior is enabled by\n// default, and can be disabled by setting options.noglobstar.\n\nexport const makeRe = (pattern: string, options: MinimatchOptions = {}) =>\n new Minimatch(pattern, options).makeRe()\nminimatch.makeRe = makeRe\n\nexport const match = (\n list: string[],\n pattern: string,\n options: MinimatchOptions = {},\n) => {\n const mm = new Minimatch(pattern, options)\n list = list.filter(f => mm.match(f))\n if (mm.options.nonull && !list.length) {\n list.push(pattern)\n }\n return list\n}\nminimatch.match = match\n\n// replace stuff like \\* with *\nconst globMagic = /[?*]|[+@!]\\(.*?\\)|\\[|\\]/\nconst regExpEscape = (s: string) =>\n s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\nexport type MMRegExp = RegExp & {\n _src?: string\n _glob?: string\n}\n\nexport type ParseReturnFiltered = string | MMRegExp | typeof GLOBSTAR\nexport type ParseReturn = ParseReturnFiltered | false\n\nexport class Minimatch {\n options: MinimatchOptions\n set: ParseReturnFiltered[][]\n pattern: string\n\n windowsPathsNoEscape: boolean\n nonegate: boolean\n negate: boolean\n comment: boolean\n empty: boolean\n preserveMultipleSlashes: boolean\n partial: boolean\n globSet: string[]\n globParts: string[][]\n nocase: boolean\n\n isWindows: boolean\n platform: Platform\n windowsNoMagicRoot: boolean\n\n regexp: false | null | MMRegExp\n constructor(pattern: string, options: MinimatchOptions = {}) {\n assertValidPattern(pattern)\n\n options = options || {}\n this.options = options\n this.pattern = pattern\n this.platform = options.platform || defaultPlatform\n this.isWindows = this.platform === 'win32'\n this.windowsPathsNoEscape =\n !!options.windowsPathsNoEscape || options.allowWindowsEscape === false\n if (this.windowsPathsNoEscape) {\n this.pattern = this.pattern.replace(/\\\\/g, '/')\n }\n this.preserveMultipleSlashes = !!options.preserveMultipleSlashes\n this.regexp = null\n this.negate = false\n this.nonegate = !!options.nonegate\n this.comment = false\n this.empty = false\n this.partial = !!options.partial\n this.nocase = !!this.options.nocase\n this.windowsNoMagicRoot =\n options.windowsNoMagicRoot !== undefined\n ? options.windowsNoMagicRoot\n : !!(this.isWindows && this.nocase)\n\n this.globSet = []\n this.globParts = []\n this.set = []\n\n // make the set of regexps etc.\n this.make()\n }\n\n hasMagic(): boolean {\n if (this.options.magicalBraces && this.set.length > 1) {\n return true\n }\n for (const pattern of this.set) {\n for (const part of pattern) {\n if (typeof part !== 'string') return true\n }\n }\n return false\n }\n\n debug(..._: any[]) {}\n\n make() {\n const pattern = this.pattern\n const options = this.options\n\n // empty patterns and comments match nothing.\n if (!options.nocomment && pattern.charAt(0) === '#') {\n this.comment = true\n return\n }\n\n if (!pattern) {\n this.empty = true\n return\n }\n\n // step 1: figure out negation, etc.\n this.parseNegate()\n\n // step 2: expand braces\n this.globSet = [...new Set(this.braceExpand())]\n\n if (options.debug) {\n this.debug = (...args: any[]) => console.error(...args)\n }\n\n this.debug(this.pattern, this.globSet)\n\n // step 3: now we have a set, so turn each one into a series of\n // path-portion matching patterns.\n // These will be regexps, except in the case of \"**\", which is\n // set to the GLOBSTAR object for globstar behavior,\n // and will not contain any / characters\n //\n // First, we preprocess to make the glob pattern sets a bit simpler\n // and deduped. There are some perf-killing patterns that can cause\n // problems with a glob walk, but we can simplify them down a bit.\n const rawGlobParts = this.globSet.map(s => this.slashSplit(s))\n this.globParts = this.preprocess(rawGlobParts)\n this.debug(this.pattern, this.globParts)\n\n // glob --> regexps\n let set = this.globParts.map((s, _, __) => {\n if (this.isWindows && this.windowsNoMagicRoot) {\n // check if it's a drive or unc path.\n const isUNC =\n s[0] === '' &&\n s[1] === '' &&\n (s[2] === '?' || !globMagic.test(s[2])) &&\n !globMagic.test(s[3])\n const isDrive = /^[a-z]:/i.test(s[0])\n if (isUNC) {\n return [...s.slice(0, 4), ...s.slice(4).map(ss => this.parse(ss))]\n } else if (isDrive) {\n return [s[0], ...s.slice(1).map(ss => this.parse(ss))]\n }\n }\n return s.map(ss => this.parse(ss))\n })\n\n this.debug(this.pattern, set)\n\n // filter out everything that didn't compile properly.\n this.set = set.filter(\n s => s.indexOf(false) === -1,\n ) as ParseReturnFiltered[][]\n\n // do not treat the ? in UNC paths as magic\n if (this.isWindows) {\n for (let i = 0; i < this.set.length; i++) {\n const p = this.set[i]\n if (\n p[0] === '' &&\n p[1] === '' &&\n this.globParts[i][2] === '?' &&\n typeof p[3] === 'string' &&\n /^[a-z]:$/i.test(p[3])\n ) {\n p[2] = '?'\n }\n }\n }\n\n this.debug(this.pattern, this.set)\n }\n\n // various transforms to equivalent pattern sets that are\n // faster to process in a filesystem walk. The goal is to\n // eliminate what we can, and push all ** patterns as far\n // to the right as possible, even if it increases the number\n // of patterns that we have to process.\n preprocess(globParts: string[][]) {\n // if we're not in globstar mode, then turn all ** into *\n if (this.options.noglobstar) {\n for (let i = 0; i < globParts.length; i++) {\n for (let j = 0; j < globParts[i].length; j++) {\n if (globParts[i][j] === '**') {\n globParts[i][j] = '*'\n }\n }\n }\n }\n\n const { optimizationLevel = 1 } = this.options\n\n if (optimizationLevel >= 2) {\n // aggressive optimization for the purpose of fs walking\n globParts = this.firstPhasePreProcess(globParts)\n globParts = this.secondPhasePreProcess(globParts)\n } else if (optimizationLevel >= 1) {\n // just basic optimizations to remove some .. parts\n globParts = this.levelOneOptimize(globParts)\n } else {\n // just collapse multiple ** portions into one\n globParts = this.adjascentGlobstarOptimize(globParts)\n }\n\n return globParts\n }\n\n // just get rid of adjascent ** portions\n adjascentGlobstarOptimize(globParts: string[][]) {\n return globParts.map(parts => {\n let gs: number = -1\n while (-1 !== (gs = parts.indexOf('**', gs + 1))) {\n let i = gs\n while (parts[i + 1] === '**') {\n i++\n }\n if (i !== gs) {\n parts.splice(gs, i - gs)\n }\n }\n return parts\n })\n }\n\n // get rid of adjascent ** and resolve .. portions\n levelOneOptimize(globParts: string[][]) {\n return globParts.map(parts => {\n parts = parts.reduce((set: string[], part) => {\n const prev = set[set.length - 1]\n if (part === '**' && prev === '**') {\n return set\n }\n if (part === '..') {\n if (prev && prev !== '..' && prev !== '.' && prev !== '**') {\n set.pop()\n return set\n }\n }\n set.push(part)\n return set\n }, [])\n return parts.length === 0 ? [''] : parts\n })\n }\n\n levelTwoFileOptimize(parts: string | string[]) {\n if (!Array.isArray(parts)) {\n parts = this.slashSplit(parts)\n }\n let didSomething: boolean = false\n do {\n didSomething = false\n // <pre>/<e>/<rest> -> <pre>/<rest>\n if (!this.preserveMultipleSlashes) {\n for (let i = 1; i < parts.length - 1; i++) {\n const p = parts[i]\n // don't squeeze out UNC patterns\n if (i === 1 && p === '' && parts[0] === '') continue\n if (p === '.' || p === '') {\n didSomething = true\n parts.splice(i, 1)\n i--\n }\n }\n if (\n parts[0] === '.' &&\n parts.length === 2 &&\n (parts[1] === '.' || parts[1] === '')\n ) {\n didSomething = true\n parts.pop()\n }\n }\n\n // <pre>/<p>/../<rest> -> <pre>/<rest>\n let dd: number = 0\n while (-1 !== (dd = parts.indexOf('..', dd + 1))) {\n const p = parts[dd - 1]\n if (p && p !== '.' && p !== '..' && p !== '**') {\n didSomething = true\n parts.splice(dd - 1, 2)\n dd -= 2\n }\n }\n } while (didSomething)\n return parts.length === 0 ? [''] : parts\n }\n\n // First phase: single-pattern processing\n // <pre> is 1 or more portions\n // <rest> is 1 or more portions\n // <p> is any portion other than ., .., '', or **\n // <e> is . or ''\n //\n // **/.. is *brutal* for filesystem walking performance, because\n // it effectively resets the recursive walk each time it occurs,\n // and ** cannot be reduced out by a .. pattern part like a regexp\n // or most strings (other than .., ., and '') can be.\n //\n // <pre>/**/../<p>/<p>/<rest> -> {<pre>/../<p>/<p>/<rest>,<pre>/**/<p>/<p>/<rest>}\n // <pre>/<e>/<rest> -> <pre>/<rest>\n // <pre>/<p>/../<rest> -> <pre>/<rest>\n // **/**/<rest> -> **/<rest>\n //\n // **/*/<rest> -> */**/<rest> <== not valid because ** doesn't follow\n // this WOULD be allowed if ** did follow symlinks, or * didn't\n firstPhasePreProcess(globParts: string[][]) {\n let didSomething = false\n do {\n didSomething = false\n // <pre>/**/../<p>/<p>/<rest> -> {<pre>/../<p>/<p>/<rest>,<pre>/**/<p>/<p>/<rest>}\n for (let parts of globParts) {\n let gs: number = -1\n while (-1 !== (gs = parts.indexOf('**', gs + 1))) {\n let gss: number = gs\n while (parts[gss + 1] === '**') {\n // <pre>/**/**/<rest> -> <pre>/**/<rest>\n gss++\n }\n // eg, if gs is 2 and gss is 4, that means we have 3 **\n // parts, and can remove 2 of them.\n if (gss > gs) {\n parts.splice(gs + 1, gss - gs)\n }\n\n let next = parts[gs + 1]\n const p = parts[gs + 2]\n const p2 = parts[gs + 3]\n if (next !== '..') continue\n if (\n !p ||\n p === '.' ||\n p === '..' ||\n !p2 ||\n p2 === '.' ||\n p2 === '..'\n ) {\n continue\n }\n didSomething = true\n // edit parts in place, and push the new one\n parts.splice(gs, 1)\n const other = parts.slice(0)\n other[gs] = '**'\n globParts.push(other)\n gs--\n }\n\n // <pre>/<e>/<rest> -> <pre>/<rest>\n if (!this.preserveMultipleSlashes) {\n for (let i = 1; i < parts.length - 1; i++) {\n const p = parts[i]\n // don't squeeze out UNC patterns\n if (i === 1 && p === '' && parts[0] === '') continue\n if (p === '.' || p === '') {\n didSomething = true\n parts.splice(i, 1)\n i--\n }\n }\n if (\n parts[0] === '.' &&\n parts.length === 2 &&\n (parts[1] === '.' || parts[1] === '')\n ) {\n didSomething = true\n parts.pop()\n }\n }\n\n // <pre>/<p>/../<rest> -> <pre>/<rest>\n let dd: number = 0\n while (-1 !== (dd = parts.indexOf('..', dd + 1))) {\n const p = parts[dd - 1]\n if (p && p !== '.' && p !== '..' && p !== '**') {\n didSomething = true\n const needDot = dd === 1 && parts[dd + 1] === '**'\n const splin = needDot ? ['.'] : []\n parts.splice(dd - 1, 2, ...splin)\n if (parts.length === 0) parts.push('')\n dd -= 2\n }\n }\n }\n } while (didSomething)\n\n return globParts\n }\n\n // second phase: multi-pattern dedupes\n // {<pre>/*/<rest>,<pre>/<p>/<rest>} -> <pre>/*/<rest>\n // {<pre>/<rest>,<pre>/<rest>} -> <pre>/<rest>\n // {<pre>/**/<rest>,<pre>/<rest>} -> <pre>/**/<rest>\n //\n // {<pre>/**/<rest>,<pre>/**/<p>/<rest>} -> <pre>/**/<rest>\n // ^-- not valid because ** doens't follow symlinks\n secondPhasePreProcess(globParts: string[][]): string[][] {\n for (let i = 0; i < globParts.length - 1; i++) {\n for (let j = i + 1; j < globParts.length; j++) {\n const matched = this.partsMatch(\n globParts[i],\n globParts[j],\n !this.preserveMultipleSlashes,\n )\n if (matched) {\n globParts[i] = []\n globParts[j] = matched\n break\n }\n }\n }\n return globParts.filter(gs => gs.length)\n }\n\n partsMatch(\n a: string[],\n b: string[],\n emptyGSMatch: boolean = false,\n ): false | string[] {\n let ai = 0\n let bi = 0\n let result: string[] = []\n let which: string = ''\n while (ai < a.length && bi < b.length) {\n if (a[ai] === b[bi]) {\n result.push(which === 'b' ? b[bi] : a[ai])\n ai++\n bi++\n } else if (emptyGSMatch && a[ai] === '**' && b[bi] === a[ai + 1]) {\n result.push(a[ai])\n ai++\n } else if (emptyGSMatch && b[bi] === '**' && a[ai] === b[bi + 1]) {\n result.push(b[bi])\n bi++\n } else if (\n a[ai] === '*' &&\n b[bi] &&\n (this.options.dot || !b[bi].startsWith('.')) &&\n b[bi] !== '**'\n ) {\n if (which === 'b') return false\n which = 'a'\n result.push(a[ai])\n ai++\n bi++\n } else if (\n b[bi] === '*' &&\n a[ai] &&\n (this.options.dot || !a[ai].startsWith('.')) &&\n a[ai] !== '**'\n ) {\n if (which === 'a') return false\n which = 'b'\n result.push(b[bi])\n ai++\n bi++\n } else {\n return false\n }\n }\n // if we fall out of the loop, it means they two are identical\n // as long as their lengths match\n return a.length === b.length && result\n }\n\n parseNegate() {\n if (this.nonegate) return\n\n const pattern = this.pattern\n let negate = false\n let negateOffset = 0\n\n for (let i = 0; i < pattern.length && pattern.charAt(i) === '!'; i++) {\n negate = !negate\n negateOffset++\n }\n\n if (negateOffset) this.pattern = pattern.slice(negateOffset)\n this.negate = negate\n }\n\n // set partial to true to test if, for example,\n // \"/a/b\" matches the start of \"/*/b/*/d\"\n // Partial means, if you run out of file before you run\n // out of pattern, then that's fine, as long as all\n // the parts match.\n matchOne(file: string[], pattern: ParseReturn[], partial: boolean = false) {\n const options = this.options\n\n // UNC paths like //?/X:/... can match X:/... and vice versa\n // Drive letters in absolute drive or unc paths are always compared\n // case-insensitively.\n if (this.isWindows) {\n const fileDrive = typeof file[0] === 'string' && /^[a-z]:$/i.test(file[0])\n const fileUNC =\n !fileDrive &&\n file[0] === '' &&\n file[1] === '' &&\n file[2] === '?' &&\n /^[a-z]:$/i.test(file[3])\n\n const patternDrive =\n typeof pattern[0] === 'string' && /^[a-z]:$/i.test(pattern[0])\n const patternUNC =\n !patternDrive &&\n pattern[0] === '' &&\n pattern[1] === '' &&\n pattern[2] === '?' &&\n typeof pattern[3] === 'string' &&\n /^[a-z]:$/i.test(pattern[3])\n\n const fdi = fileUNC ? 3 : fileDrive ? 0 : undefined\n const pdi = patternUNC ? 3 : patternDrive ? 0 : undefined\n if (typeof fdi === 'number' && typeof pdi === 'number') {\n const [fd, pd]: [string, string] = [file[fdi], pattern[pdi] as string]\n if (fd.toLowerCase() === pd.toLowerCase()) {\n pattern[pdi] = fd\n if (pdi > fdi) {\n pattern = pattern.slice(pdi)\n } else if (fdi > pdi) {\n file = file.slice(fdi)\n }\n }\n }\n }\n\n // resolve and reduce . and .. portions in the file as well.\n // don't need to do the second phase, because it's only one string[]\n const { optimizationLevel = 1 } = this.options\n if (optimizationLevel >= 2) {\n file = this.levelTwoFileOptimize(file)\n }\n\n this.debug('matchOne', this, { file, pattern })\n this.debug('matchOne', file.length, pattern.length)\n\n for (\n var fi = 0, pi = 0, fl = file.length, pl = pattern.length;\n fi < fl && pi < pl;\n fi++, pi++\n ) {\n this.debug('matchOne loop')\n var p = pattern[pi]\n var f = file[fi]\n\n this.debug(pattern, p, f)\n\n // should be impossible.\n // some invalid regexp stuff in the set.\n /* c8 ignore start */\n if (p === false) {\n return false\n }\n /* c8 ignore stop */\n\n if (p === GLOBSTAR) {\n this.debug('GLOBSTAR', [pattern, p, f])\n\n // \"**\"\n // a/**/b/**/c would match the following:\n // a/b/x/y/z/c\n // a/x/y/z/b/c\n // a/b/x/b/x/c\n // a/b/c\n // To do this, take the rest of the pattern after\n // the **, and see if it would match the file remainder.\n // If so, return success.\n // If not, the ** \"swallows\" a segment, and try again.\n // This is recursively awful.\n //\n // a/**/b/**/c matching a/b/x/y/z/c\n // - a matches a\n // - doublestar\n // - matchOne(b/x/y/z/c, b/**/c)\n // - b matches b\n // - doublestar\n // - matchOne(x/y/z/c, c) -> no\n // - matchOne(y/z/c, c) -> no\n // - matchOne(z/c, c) -> no\n // - matchOne(c, c) yes, hit\n var fr = fi\n var pr = pi + 1\n if (pr === pl) {\n this.debug('** at the end')\n // a ** at the end will just swallow the rest.\n // We have found a match.\n // however, it will not swallow /.x, unless\n // options.dot is set.\n // . and .. are *never* matched by **, for explosively\n // exponential reasons.\n for (; fi < fl; fi++) {\n if (\n file[fi] === '.' ||\n file[fi] === '..' ||\n (!options.dot && file[fi].charAt(0) === '.')\n )\n return false\n }\n return true\n }\n\n // ok, let's see if we can swallow whatever we can.\n while (fr < fl) {\n var swallowee = file[fr]\n\n this.debug('\\nglobstar while', file, fr, pattern, pr, swallowee)\n\n // XXX remove this slice. Just pass the start index.\n if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {\n this.debug('globstar found match!', fr, fl, swallowee)\n // found a match.\n return true\n } else {\n // can't swallow \".\" or \"..\" ever.\n // can only swallow \".foo\" when explicitly asked.\n if (\n swallowee === '.' ||\n swallowee === '..' ||\n (!options.dot && swallowee.charAt(0) === '.')\n ) {\n this.debug('dot detected!', file, fr, pattern, pr)\n break\n }\n\n // ** swallows a segment, and continue.\n this.debug('globstar swallow a segment, and continue')\n fr++\n }\n }\n\n // no match was found.\n // However, in partial mode, we can't say this is necessarily over.\n /* c8 ignore start */\n if (partial) {\n // ran out of file\n this.debug('\\n>>> no match, partial?', file, fr, pattern, pr)\n if (fr === fl) {\n return true\n }\n }\n /* c8 ignore stop */\n return false\n }\n\n // something other than **\n // non-magic patterns just have to match exactly\n // patterns with magic have been turned into regexps.\n let hit: boolean\n if (typeof p === 'string') {\n hit = f === p\n this.debug('string match', p, f, hit)\n } else {\n hit = p.test(f)\n this.debug('pattern match', p, f, hit)\n }\n\n if (!hit) return false\n }\n\n // Note: ending in / means that we'll get a final \"\"\n // at the end of the pattern. This can only match a\n // corresponding \"\" at the end of the file.\n // If the file ends in /, then it can only match a\n // a pattern that ends in /, unless the pattern just\n // doesn't have any more for it. But, a/b/ should *not*\n // match \"a/b/*\", even though \"\" matches against the\n // [^/]*? pattern, except in partial mode, where it might\n // simply not be reached yet.\n // However, a/b/ should still satisfy a/*\n\n // now either we fell off the end of the pattern, or we're done.\n if (fi === fl && pi === pl) {\n // ran out of pattern and filename at the same time.\n // an exact hit!\n return true\n } else if (fi === fl) {\n // ran out of file, but still had pattern left.\n // this is ok if we're doing the match as part of\n // a glob fs traversal.\n return partial\n } else if (pi === pl) {\n // ran out of pattern, still have file left.\n // this is only acceptable if we're on the very last\n // empty segment of a file with a trailing slash.\n // a/* should match a/b/\n return fi === fl - 1 && file[fi] === ''\n\n /* c8 ignore start */\n } else {\n // should be unreachable.\n throw new Error('wtf?')\n }\n /* c8 ignore stop */\n }\n\n braceExpand() {\n return braceExpand(this.pattern, this.options)\n }\n\n parse(pattern: string): ParseReturn {\n assertValidPattern(pattern)\n\n const options = this.options\n\n // shortcuts\n if (pattern === '**') return GLOBSTAR\n if (pattern === '') return ''\n\n // far and away, the most common glob pattern parts are\n // *, *.*, and *.<ext> Add a fast check method for those.\n let m: RegExpMatchArray | null\n let fastTest: null | ((f: string) => boolean) = null\n if ((m = pattern.match(starRE))) {\n fastTest = options.dot ? starTestDot : starTest\n } else if ((m = pattern.match(starDotExtRE))) {\n fastTest = (\n options.nocase\n ? options.dot\n ? starDotExtTestNocaseDot\n : starDotExtTestNocase\n : options.dot\n ? starDotExtTestDot\n : starDotExtTest\n )(m[1])\n } else if ((m = pattern.match(qmarksRE))) {\n fastTest = (\n options.nocase\n ? options.dot\n ? qmarksTestNocaseDot\n : qmarksTestNocase\n : options.dot\n ? qmarksTestDot\n : qmarksTest\n )(m)\n } else if ((m = pattern.match(starDotStarRE))) {\n fastTest = options.dot ? starDotStarTestDot : starDotStarTest\n } else if ((m = pattern.match(dotStarRE))) {\n fastTest = dotStarTest\n }\n\n const re = AST.fromGlob(pattern, this.options).toMMPattern()\n if (fastTest && typeof re === 'object') {\n // Avoids overriding in frozen environments\n Reflect.defineProperty(re, 'test', { value: fastTest })\n }\n return re\n }\n\n makeRe() {\n if (this.regexp || this.regexp === false) return this.regexp\n\n // at this point, this.set is a 2d array of partial\n // pattern strings, or \"**\".\n //\n // It's better to use .match(). This function shouldn't\n // be used, really, but it's pretty convenient sometimes,\n // when you just want to work with a regex.\n const set = this.set\n\n if (!set.length) {\n this.regexp = false\n return this.regexp\n }\n const options = this.options\n\n const twoStar = options.noglobstar\n ? star\n : options.dot\n ? twoStarDot\n : twoStarNoDot\n const flags = new Set(options.nocase ? ['i'] : [])\n\n // regexpify non-globstar patterns\n // if ** is only item, then we just do one twoStar\n // if ** is first, and there are more, prepend (\\/|twoStar\\/)? to next\n // if ** is last, append (\\/twoStar|) to previous\n // if ** is in the middle, append (\\/|\\/twoStar\\/) to previous\n // then filter out GLOBSTAR symbols\n let re = set\n .map(pattern => {\n const pp: (string | typeof GLOBSTAR)[] = pattern.map(p => {\n if (p instanceof RegExp) {\n for (const f of p.flags.split('')) flags.add(f)\n }\n return typeof p === 'string'\n ? regExpEscape(p)\n : p === GLOBSTAR\n ? GLOBSTAR\n : p._src\n }) as (string | typeof GLOBSTAR)[]\n pp.forEach((p, i) => {\n const next = pp[i + 1]\n const prev = pp[i - 1]\n if (p !== GLOBSTAR || prev === GLOBSTAR) {\n return\n }\n if (prev === undefined) {\n if (next !== undefined && next !== GLOBSTAR) {\n pp[i + 1] = '(?:\\\\/|' + twoStar + '\\\\/)?' + next\n } else {\n pp[i] = twoStar\n }\n } else if (next === undefined) {\n pp[i - 1] = prev + '(?:\\\\/|\\\\/' + twoStar + ')?'\n } else if (next !== GLOBSTAR) {\n pp[i - 1] = prev + '(?:\\\\/|\\\\/' + twoStar + '\\\\/)' + next\n pp[i + 1] = GLOBSTAR\n }\n })\n const filtered = pp.filter(p => p !== GLOBSTAR)\n\n // For partial matches, we need to make the pattern match\n // any prefix of the full path. We do this by generating\n // alternative patterns that match progressively longer prefixes.\n if (this.partial && filtered.length >= 1) {\n const prefixes: string[] = []\n for (let i = 1; i <= filtered.length; i++) {\n prefixes.push(filtered.slice(0, i).join('/'))\n }\n return '(?:' + prefixes.join('|') + ')'\n }\n\n return filtered.join('/')\n })\n .join('|')\n\n // need to wrap in parens if we had more than one thing with |,\n // otherwise only the first will be anchored to ^ and the last to $\n const [open, close] = set.length > 1 ? ['(?:', ')'] : ['', '']\n // must match entire pattern\n // ending in a * or ** will make it less strict.\n re = '^' + open + re + close + '$'\n\n // In partial mode, '/' should always match as it's a valid prefix for any pattern\n if (this.partial) {\n re = '^(?:\\\\/|' + open + re.slice(1, -1) + close + ')$'\n }\n\n // can match anything, as long as it's not this.\n if (this.negate) re = '^(?!' + re + ').+$'\n\n try {\n this.regexp = new RegExp(re, [...flags].join(''))\n /* c8 ignore start */\n } catch (ex) {\n // should be impossible\n this.regexp = false\n }\n /* c8 ignore stop */\n return this.regexp\n }\n\n slashSplit(p: string) {\n // if p starts with // on windows, we preserve that\n // so that UNC paths aren't broken. Otherwise, any number of\n // / characters are coalesced into one, unless\n // preserveMultipleSlashes is set to true.\n if (this.preserveMultipleSlashes) {\n return p.split('/')\n } else if (this.isWindows && /^\\/\\/[^\\/]+/.test(p)) {\n // add an extra '' for the one we lose\n return ['', ...p.split(/\\/+/)]\n } else {\n return p.split(/\\/+/)\n }\n }\n\n match(f: string, partial = this.partial) {\n this.debug('match', f, this.pattern)\n // short-circuit in the case of busted things.\n // comments, etc.\n if (this.comment) {\n return false\n }\n if (this.empty) {\n return f === ''\n }\n\n if (f === '/' && partial) {\n return true\n }\n\n const options = this.options\n\n // windows: need to use /, not \\\n if (this.isWindows) {\n f = f.split('\\\\').join('/')\n }\n\n // treat the test path as a set of pathparts.\n const ff = this.slashSplit(f)\n this.debug(this.pattern, 'split', ff)\n\n // just ONE of the pattern sets in this.set needs to match\n // in order for it to be valid. If negating, then just one\n // match means that we have failed.\n // Either way, return on the first hit.\n\n const set = this.set\n this.debug(this.pattern, 'set', set)\n\n // Find the basename of the path by looking for the last non-empty segment\n let filename: string = ff[ff.length - 1]\n if (!filename) {\n for (let i = ff.length - 2; !filename && i >= 0; i--) {\n filename = ff[i]\n }\n }\n\n for (let i = 0; i < set.length; i++) {\n const pattern = set[i]\n let file = ff\n if (options.matchBase && pattern.length === 1) {\n file = [filename]\n }\n const hit = this.matchOne(file, pattern, partial)\n if (hit) {\n if (options.flipNegate) {\n return true\n }\n return !this.negate\n }\n }\n\n // didn't get any hits. this is success if it's a negative\n // pattern, failure otherwise.\n if (options.flipNegate) {\n return false\n }\n return this.negate\n }\n\n static defaults(def: MinimatchOptions) {\n return minimatch.defaults(def).Minimatch\n }\n}\n/* c8 ignore start */\nexport { AST } from './ast.js'\nexport { escape } from './escape.js'\nexport { unescape } from './unescape.js'\n/* c8 ignore stop */\nminimatch.AST = AST\nminimatch.Minimatch = Minimatch\nminimatch.escape = escape\nminimatch.unescape = unescape\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,EAAE,GAAG,EAAe,MAAM,UAAU,CAAA;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAqHxC,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,CAAS,EACT,OAAe,EACf,UAA4B,EAAE,EAC9B,EAAE;IACF,kBAAkB,CAAC,OAAO,CAAC,CAAA;IAE3B,oCAAoC;IACpC,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;QACpD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,OAAO,IAAI,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AACjD,CAAC,CAAA;AAED,wDAAwD;AACxD,MAAM,YAAY,GAAG,uBAAuB,CAAA;AAC5C,MAAM,cAAc,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,CAAC,CAAS,EAAE,EAAE,CACpD,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;AACvC,MAAM,iBAAiB,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;AACzE,MAAM,oBAAoB,GAAG,CAAC,GAAW,EAAE,EAAE;IAC3C,GAAG,GAAG,GAAG,CAAC,WAAW,EAAE,CAAA;IACvB,OAAO,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;AAC3E,CAAC,CAAA;AACD,MAAM,uBAAuB,GAAG,CAAC,GAAW,EAAE,EAAE;IAC9C,GAAG,GAAG,GAAG,CAAC,WAAW,EAAE,CAAA;IACvB,OAAO,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;AACrD,CAAC,CAAA;AACD,MAAM,aAAa,GAAG,YAAY,CAAA;AAClC,MAAM,eAAe,GAAG,CAAC,CAAS,EAAE,EAAE,CACpC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;AACvC,MAAM,kBAAkB,GAAG,CAAC,CAAS,EAAE,EAAE,CACvC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;AAC5C,MAAM,SAAS,GAAG,SAAS,CAAA;AAC3B,MAAM,WAAW,GAAG,CAAC,CAAS,EAAE,EAAE,CAChC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;AAC9C,MAAM,MAAM,GAAG,OAAO,CAAA;AACtB,MAAM,QAAQ,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;AACpE,MAAM,WAAW,GAAG,CAAC,CAAS,EAAE,EAAE,CAChC,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAA;AAC3C,MAAM,QAAQ,GAAG,wBAAwB,CAAA;AACzC,MAAM,gBAAgB,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,CAAmB,EAAE,EAAE;IAC5D,MAAM,KAAK,GAAG,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACnC,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAA;IACtB,GAAG,GAAG,GAAG,CAAC,WAAW,EAAE,CAAA;IACvB,OAAO,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;AACjE,CAAC,CAAA;AACD,MAAM,mBAAmB,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,CAAmB,EAAE,EAAE;IAC/D,MAAM,KAAK,GAAG,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACtC,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAA;IACtB,GAAG,GAAG,GAAG,CAAC,WAAW,EAAE,CAAA;IACvB,OAAO,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;AACjE,CAAC,CAAA;AACD,MAAM,aAAa,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,CAAmB,EAAE,EAAE;IACzD,MAAM,KAAK,GAAG,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACtC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;AAClE,CAAC,CAAA;AACD,MAAM,UAAU,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,CAAmB,EAAE,EAAE;IACtD,MAAM,KAAK,GAAG,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACnC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;AAClE,CAAC,CAAA;AACD,MAAM,eAAe,GAAG,CAAC,CAAC,EAAE,CAAmB,EAAE,EAAE;IACjD,MAAM,GAAG,GAAG,EAAE,CAAC,MAAM,CAAA;IACrB,OAAO,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;AAC9D,CAAC,CAAA;AACD,MAAM,kBAAkB,GAAG,CAAC,CAAC,EAAE,CAAmB,EAAE,EAAE;IACpD,MAAM,GAAG,GAAG,EAAE,CAAC,MAAM,CAAA;IACrB,OAAO,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAA;AACnE,CAAC,CAAA;AAED,qBAAqB;AACrB,MAAM,eAAe,GAAa,CAChC,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC;IACtC,CAAC,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ;QAC9B,OAAO,CAAC,GAAG;QACX,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC;QAC7C,OAAO,CAAC,QAAQ;IAClB,CAAC,CAAC,OAAO,CAAa,CAAA;AAIxB,MAAM,IAAI,GAAkC;IAC1C,KAAK,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE;IACpB,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE;CACpB,CAAA;AACD,oBAAoB;AAEpB,MAAM,CAAC,MAAM,GAAG,GACd,eAAe,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAA;AAC/D,SAAS,CAAC,GAAG,GAAG,GAAG,CAAA;AAEnB,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,aAAa,CAAC,CAAA;AAC7C,SAAS,CAAC,QAAQ,GAAG,QAAQ,CAAA;AAE7B,gCAAgC;AAChC,iDAAiD;AACjD,MAAM,KAAK,GAAG,MAAM,CAAA;AAEpB,gCAAgC;AAChC,MAAM,IAAI,GAAG,KAAK,GAAG,IAAI,CAAA;AAEzB,4DAA4D;AAC5D,+DAA+D;AAC/D,6CAA6C;AAC7C,MAAM,UAAU,GAAG,yCAAyC,CAAA;AAE5D,kCAAkC;AAClC,6CAA6C;AAC7C,MAAM,YAAY,GAAG,yBAAyB,CAAA;AAE9C,MAAM,CAAC,MAAM,MAAM,GACjB,CAAC,OAAe,EAAE,UAA4B,EAAE,EAAE,EAAE,CACpD,CAAC,CAAS,EAAE,EAAE,CACZ,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;AAClC,SAAS,CAAC,MAAM,GAAG,MAAM,CAAA;AAEzB,MAAM,GAAG,GAAG,CAAC,CAAmB,EAAE,IAAsB,EAAE,EAAE,EAAE,CAC5D,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;AAEzB,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,GAAqB,EAAoB,EAAE;IAClE,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;QAChE,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,MAAM,IAAI,GAAG,SAAS,CAAA;IAEtB,MAAM,CAAC,GAAG,CAAC,CAAS,EAAE,OAAe,EAAE,UAA4B,EAAE,EAAE,EAAE,CACvE,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAA;IAErC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE;QACtB,SAAS,EAAE,MAAM,SAAU,SAAQ,IAAI,CAAC,SAAS;YAC/C,YAAY,OAAe,EAAE,UAA4B,EAAE;gBACzD,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAA;YACnC,CAAC;YACD,MAAM,CAAC,QAAQ,CAAC,OAAyB;gBACvC,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAA;YACnD,CAAC;SACF;QAED,GAAG,EAAE,MAAM,GAAI,SAAQ,IAAI,CAAC,GAAG;YAC7B,qBAAqB;YACrB,YACE,IAAwB,EACxB,MAAY,EACZ,UAA4B,EAAE;gBAE9B,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAA;YACxC,CAAC;YACD,oBAAoB;YAEpB,MAAM,CAAC,QAAQ,CAAC,OAAe,EAAE,UAA4B,EAAE;gBAC7D,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAA;YACtD,CAAC;SACF;QAED,QAAQ,EAAE,CACR,CAAS,EACT,UAGI,EAAE,EACN,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAExC,MAAM,EAAE,CACN,CAAS,EACT,UAGI,EAAE,EACN,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAEtC,MAAM,EAAE,CAAC,OAAe,EAAE,UAA4B,EAAE,EAAE,EAAE,CAC1D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAEzC,QAAQ,EAAE,CAAC,OAAyB,EAAE,EAAE,CACtC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAElC,MAAM,EAAE,CAAC,OAAe,EAAE,UAA4B,EAAE,EAAE,EAAE,CAC1D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAEzC,WAAW,EAAE,CAAC,OAAe,EAAE,UAA4B,EAAE,EAAE,EAAE,CAC/D,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAE9C,KAAK,EAAE,CACL,IAAc,EACd,OAAe,EACf,UAA4B,EAAE,EAC9B,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAEjD,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,QAAQ,EAAE,QAA2B;KACtC,CAAC,CAAA;AACJ,CAAC,CAAA;AACD,SAAS,CAAC,QAAQ,GAAG,QAAQ,CAAA;AAE7B,mBAAmB;AACnB,qBAAqB;AACrB,mBAAmB;AACnB,8BAA8B;AAC9B,mCAAmC;AACnC,2CAA2C;AAC3C,EAAE;AACF,iCAAiC;AACjC,qBAAqB;AACrB,iBAAiB;AACjB,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,OAAe,EACf,UAA4B,EAAE,EAC9B,EAAE;IACF,kBAAkB,CAAC,OAAO,CAAC,CAAA;IAE3B,wDAAwD;IACxD,wDAAwD;IACxD,IAAI,OAAO,CAAC,OAAO,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACzD,+BAA+B;QAC/B,OAAO,CAAC,OAAO,CAAC,CAAA;IAClB,CAAC;IAED,OAAO,MAAM,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC,CAAA;AACzD,CAAC,CAAA;AACD,SAAS,CAAC,WAAW,GAAG,WAAW,CAAA;AAEnC,yCAAyC;AACzC,kDAAkD;AAClD,oEAAoE;AACpE,oEAAoE;AACpE,6DAA6D;AAC7D,kEAAkE;AAClE,EAAE;AACF,0EAA0E;AAC1E,wEAAwE;AACxE,qEAAqE;AACrE,8DAA8D;AAE9D,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,OAAe,EAAE,UAA4B,EAAE,EAAE,EAAE,CACxE,IAAI,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,MAAM,EAAE,CAAA;AAC1C,SAAS,CAAC,MAAM,GAAG,MAAM,CAAA;AAEzB,MAAM,CAAC,MAAM,KAAK,GAAG,CACnB,IAAc,EACd,OAAe,EACf,UAA4B,EAAE,EAC9B,EAAE;IACF,MAAM,EAAE,GAAG,IAAI,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IAC1C,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IACpC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACtC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACpB,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AACD,SAAS,CAAC,KAAK,GAAG,KAAK,CAAA;AAEvB,+BAA+B;AAC/B,MAAM,SAAS,GAAG,yBAAyB,CAAA;AAC3C,MAAM,YAAY,GAAG,CAAC,CAAS,EAAE,EAAE,CACjC,CAAC,CAAC,OAAO,CAAC,0BAA0B,EAAE,MAAM,CAAC,CAAA;AAU/C,MAAM,OAAO,SAAS;IACpB,OAAO,CAAkB;IACzB,GAAG,CAAyB;IAC5B,OAAO,CAAQ;IAEf,oBAAoB,CAAS;IAC7B,QAAQ,CAAS;IACjB,MAAM,CAAS;IACf,OAAO,CAAS;IAChB,KAAK,CAAS;IACd,uBAAuB,CAAS;IAChC,OAAO,CAAS;IAChB,OAAO,CAAU;IACjB,SAAS,CAAY;IACrB,MAAM,CAAS;IAEf,SAAS,CAAS;IAClB,QAAQ,CAAU;IAClB,kBAAkB,CAAS;IAC3B,oBAAoB,CAAQ;IAE5B,MAAM,CAAyB;IAC/B,YAAY,OAAe,EAAE,UAA4B,EAAE;QACzD,kBAAkB,CAAC,OAAO,CAAC,CAAA;QAE3B,OAAO,GAAG,OAAO,IAAI,EAAE,CAAA;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,IAAI,GAAG,CAAA;QAC/D,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,eAAe,CAAA;QACnD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,KAAK,OAAO,CAAA;QAC1C,0CAA0C;QAC1C,MAAM,GAAG,GAAG,CAAC,aAAa,GAAG,SAAS,CAA2B,CAAA;QACjE,IAAI,CAAC,oBAAoB;YACvB,CAAC,CAAC,OAAO,CAAC,oBAAoB,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAA;QAC1D,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC9B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QACjD,CAAC;QACD,IAAI,CAAC,uBAAuB,GAAG,CAAC,CAAC,OAAO,CAAC,uBAAuB,CAAA;QAChE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;QAClB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;QACnB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAA;QAClC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;QACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,CAAA;QAChC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAA;QACnC,IAAI,CAAC,kBAAkB;YACrB,OAAO,CAAC,kBAAkB,KAAK,SAAS,CAAC,CAAC;gBACxC,OAAO,CAAC,kBAAkB;gBAC5B,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,CAAA;QAErC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAA;QACjB,IAAI,CAAC,SAAS,GAAG,EAAE,CAAA;QACnB,IAAI,CAAC,GAAG,GAAG,EAAE,CAAA;QAEb,+BAA+B;QAC/B,IAAI,CAAC,IAAI,EAAE,CAAA;IACb,CAAC;IAED,QAAQ;QACN,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtD,OAAO,IAAI,CAAA;QACb,CAAC;QACD,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YAC/B,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;gBAC3B,IAAI,OAAO,IAAI,KAAK,QAAQ;oBAAE,OAAO,IAAI,CAAA;YAC3C,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,KAAK,CAAC,GAAG,CAAQ,IAAG,CAAC;IAErB,IAAI;QACF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;QAE5B,6CAA6C;QAC7C,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACpD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;YACnB,OAAM;QACR,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;YACjB,OAAM;QACR,CAAC;QAED,oCAAoC;QACpC,IAAI,CAAC,WAAW,EAAE,CAAA;QAElB,wBAAwB;QACxB,IAAI,CAAC,OAAO,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;QAE/C,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,IAAW,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAA;QACzD,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;QAEtC,+DAA+D;QAC/D,kCAAkC;QAClC,8DAA8D;QAC9D,oDAAoD;QACpD,wCAAwC;QACxC,EAAE;QACF,mEAAmE;QACnE,oEAAoE;QACpE,kEAAkE;QAClE,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;QAC9D,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAA;QAC9C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;QAExC,mBAAmB;QACnB,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE;YACxC,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC9C,qCAAqC;gBACrC,MAAM,KAAK,GACT,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;oBACX,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;oBACX,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBACvC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;gBACvB,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;gBACrC,IAAI,KAAK,EAAE,CAAC;oBACV,OAAO;wBACL,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;wBAChB,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;qBACxC,CAAA;gBACH,CAAC;qBAAM,IAAI,OAAO,EAAE,CAAC;oBACnB,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;gBACxD,CAAC;YACH,CAAC;YACD,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAA;QACpC,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QAE7B,sDAAsD;QACtD,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CACnB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CACF,CAAA;QAE5B,2CAA2C;QAC3C,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACzC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;gBACrB,IACE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;oBACX,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;oBACX,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG;oBAC5B,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,QAAQ;oBACxB,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACtB,CAAC;oBACD,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAA;gBACZ,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAA;IACpC,CAAC;IAED,yDAAyD;IACzD,0DAA0D;IAC1D,yDAAyD;IACzD,4DAA4D;IAC5D,uCAAuC;IACvC,UAAU,CAAC,SAAqB;QAC9B,qDAAqD;QACrD,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;YAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC7C,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;wBAC7B,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAA;oBACvB,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,EAAE,iBAAiB,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,CAAA;QAE9C,IAAI,iBAAiB,IAAI,CAAC,EAAE,CAAC;YAC3B,wDAAwD;YACxD,SAAS,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAA;YAChD,SAAS,GAAG,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAA;QACnD,CAAC;aAAM,IAAI,iBAAiB,IAAI,CAAC,EAAE,CAAC;YAClC,mDAAmD;YACnD,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAA;QAC9C,CAAC;aAAM,CAAC;YACN,8CAA8C;YAC9C,SAAS,GAAG,IAAI,CAAC,yBAAyB,CAAC,SAAS,CAAC,CAAA;QACvD,CAAC;QAED,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,wCAAwC;IACxC,yBAAyB,CAAC,SAAqB;QAC7C,OAAO,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YAC3B,IAAI,EAAE,GAAW,CAAC,CAAC,CAAA;YACnB,OAAO,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjD,IAAI,CAAC,GAAG,EAAE,CAAA;gBACV,OAAO,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;oBAC7B,CAAC,EAAE,CAAA;gBACL,CAAC;gBACD,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;oBACb,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,CAAA;gBAC1B,CAAC;YACH,CAAC;YACD,OAAO,KAAK,CAAA;QACd,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,kDAAkD;IAClD,gBAAgB,CAAC,SAAqB;QACpC,OAAO,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YAC3B,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAa,EAAE,IAAI,EAAE,EAAE;gBAC3C,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;gBAChC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;oBACnC,OAAO,GAAG,CAAA;gBACZ,CAAC;gBACD,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;oBAClB,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;wBAC3D,GAAG,CAAC,GAAG,EAAE,CAAA;wBACT,OAAO,GAAG,CAAA;oBACZ,CAAC;gBACH,CAAC;gBACD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBACd,OAAO,GAAG,CAAA;YACZ,CAAC,EAAE,EAAE,CAAC,CAAA;YACN,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;QAC1C,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,oBAAoB,CAAC,KAAwB;QAC3C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;QAChC,CAAC;QACD,IAAI,YAAY,GAAY,KAAK,CAAA;QACjC,GAAG,CAAC;YACF,YAAY,GAAG,KAAK,CAAA;YACpB,mCAAmC;YACnC,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE,CAAC;gBAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC1C,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;oBAClB,iCAAiC;oBACjC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE;wBAAE,SAAQ;oBACpD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;wBAC1B,YAAY,GAAG,IAAI,CAAA;wBACnB,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;wBAClB,CAAC,EAAE,CAAA;oBACL,CAAC;gBACH,CAAC;gBACD,IACE,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG;oBAChB,KAAK,CAAC,MAAM,KAAK,CAAC;oBAClB,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,EACrC,CAAC;oBACD,YAAY,GAAG,IAAI,CAAA;oBACnB,KAAK,CAAC,GAAG,EAAE,CAAA;gBACb,CAAC;YACH,CAAC;YAED,sCAAsC;YACtC,IAAI,EAAE,GAAW,CAAC,CAAA;YAClB,OAAO,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjD,MAAM,CAAC,GAAG,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;gBACvB,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;oBAC/C,YAAY,GAAG,IAAI,CAAA;oBACnB,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;oBACvB,EAAE,IAAI,CAAC,CAAA;gBACT,CAAC;YACH,CAAC;QACH,CAAC,QAAQ,YAAY,EAAC;QACtB,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;IAC1C,CAAC;IAED,yCAAyC;IACzC,8BAA8B;IAC9B,+BAA+B;IAC/B,iDAAiD;IACjD,iBAAiB;IACjB,EAAE;IACF,gEAAgE;IAChE,gEAAgE;IAChE,kEAAkE;IAClE,qDAAqD;IACrD,EAAE;IACF,kFAAkF;IAClF,mCAAmC;IACnC,sCAAsC;IACtC,4BAA4B;IAC5B,EAAE;IACF,qEAAqE;IACrE,+DAA+D;IAC/D,oBAAoB,CAAC,SAAqB;QACxC,IAAI,YAAY,GAAG,KAAK,CAAA;QACxB,GAAG,CAAC;YACF,YAAY,GAAG,KAAK,CAAA;YACpB,kFAAkF;YAClF,KAAK,IAAI,KAAK,IAAI,SAAS,EAAE,CAAC;gBAC5B,IAAI,EAAE,GAAW,CAAC,CAAC,CAAA;gBACnB,OAAO,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBACjD,IAAI,GAAG,GAAW,EAAE,CAAA;oBACpB,OAAO,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;wBAC/B,wCAAwC;wBACxC,GAAG,EAAE,CAAA;oBACP,CAAC;oBACD,uDAAuD;oBACvD,mCAAmC;oBACnC,IAAI,GAAG,GAAG,EAAE,EAAE,CAAC;wBACb,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,CAAA;oBAChC,CAAC;oBAED,IAAI,IAAI,GAAG,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;oBACxB,MAAM,CAAC,GAAG,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;oBACvB,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;oBACxB,IAAI,IAAI,KAAK,IAAI;wBAAE,SAAQ;oBAC3B,IACE,CAAC,CAAC;wBACF,CAAC,KAAK,GAAG;wBACT,CAAC,KAAK,IAAI;wBACV,CAAC,EAAE;wBACH,EAAE,KAAK,GAAG;wBACV,EAAE,KAAK,IAAI,EACX,CAAC;wBACD,SAAQ;oBACV,CAAC;oBACD,YAAY,GAAG,IAAI,CAAA;oBACnB,4CAA4C;oBAC5C,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;oBACnB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;oBAC5B,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,CAAA;oBAChB,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;oBACrB,EAAE,EAAE,CAAA;gBACN,CAAC;gBAED,mCAAmC;gBACnC,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE,CAAC;oBAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;wBAC1C,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;wBAClB,iCAAiC;wBACjC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE;4BAAE,SAAQ;wBACpD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;4BAC1B,YAAY,GAAG,IAAI,CAAA;4BACnB,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;4BAClB,CAAC,EAAE,CAAA;wBACL,CAAC;oBACH,CAAC;oBACD,IACE,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG;wBAChB,KAAK,CAAC,MAAM,KAAK,CAAC;wBAClB,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,EACrC,CAAC;wBACD,YAAY,GAAG,IAAI,CAAA;wBACnB,KAAK,CAAC,GAAG,EAAE,CAAA;oBACb,CAAC;gBACH,CAAC;gBAED,sCAAsC;gBACtC,IAAI,EAAE,GAAW,CAAC,CAAA;gBAClB,OAAO,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBACjD,MAAM,CAAC,GAAG,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;oBACvB,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;wBAC/C,YAAY,GAAG,IAAI,CAAA;wBACnB,MAAM,OAAO,GAAG,EAAE,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,IAAI,CAAA;wBAClD,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;wBAClC,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC,CAAA;wBACjC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;4BAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;wBACtC,EAAE,IAAI,CAAC,CAAA;oBACT,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC,QAAQ,YAAY,EAAC;QAEtB,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,sCAAsC;IACtC,sDAAsD;IACtD,8CAA8C;IAC9C,oDAAoD;IACpD,EAAE;IACF,2DAA2D;IAC3D,mDAAmD;IACnD,qBAAqB,CAAC,SAAqB;QACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAC7B,SAAS,CAAC,CAAC,CAAC,EACZ,SAAS,CAAC,CAAC,CAAC,EACZ,CAAC,IAAI,CAAC,uBAAuB,CAC9B,CAAA;gBACD,IAAI,OAAO,EAAE,CAAC;oBACZ,SAAS,CAAC,CAAC,CAAC,GAAG,EAAE,CAAA;oBACjB,SAAS,CAAC,CAAC,CAAC,GAAG,OAAO,CAAA;oBACtB,MAAK;gBACP,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAA;IAC1C,CAAC;IAED,UAAU,CACR,CAAW,EACX,CAAW,EACX,eAAwB,KAAK;QAE7B,IAAI,EAAE,GAAG,CAAC,CAAA;QACV,IAAI,EAAE,GAAG,CAAC,CAAA;QACV,IAAI,MAAM,GAAa,EAAE,CAAA;QACzB,IAAI,KAAK,GAAW,EAAE,CAAA;QACtB,OAAO,EAAE,GAAG,CAAC,CAAC,MAAM,IAAI,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;YACtC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;gBACpB,MAAM,CAAC,IAAI,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;gBAC1C,EAAE,EAAE,CAAA;gBACJ,EAAE,EAAE,CAAA;YACN,CAAC;iBAAM,IAAI,YAAY,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;gBACjE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;gBAClB,EAAE,EAAE,CAAA;YACN,CAAC;iBAAM,IAAI,YAAY,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;gBACjE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;gBAClB,EAAE,EAAE,CAAA;YACN,CAAC;iBAAM,IACL,CAAC,CAAC,EAAE,CAAC,KAAK,GAAG;gBACb,CAAC,CAAC,EAAE,CAAC;gBACL,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;gBAC5C,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,EACd,CAAC;gBACD,IAAI,KAAK,KAAK,GAAG;oBAAE,OAAO,KAAK,CAAA;gBAC/B,KAAK,GAAG,GAAG,CAAA;gBACX,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;gBAClB,EAAE,EAAE,CAAA;gBACJ,EAAE,EAAE,CAAA;YACN,CAAC;iBAAM,IACL,CAAC,CAAC,EAAE,CAAC,KAAK,GAAG;gBACb,CAAC,CAAC,EAAE,CAAC;gBACL,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;gBAC5C,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,EACd,CAAC;gBACD,IAAI,KAAK,KAAK,GAAG;oBAAE,OAAO,KAAK,CAAA;gBAC/B,KAAK,GAAG,GAAG,CAAA;gBACX,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;gBAClB,EAAE,EAAE,CAAA;gBACJ,EAAE,EAAE,CAAA;YACN,CAAC;iBAAM,CAAC;gBACN,OAAO,KAAK,CAAA;YACd,CAAC;QACH,CAAC;QACD,8DAA8D;QAC9D,iCAAiC;QACjC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,MAAM,CAAA;IACxC,CAAC;IAED,WAAW;QACT,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAM;QAEzB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;QAC5B,IAAI,MAAM,GAAG,KAAK,CAAA;QAClB,IAAI,YAAY,GAAG,CAAC,CAAA;QAEpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YACrE,MAAM,GAAG,CAAC,MAAM,CAAA;YAChB,YAAY,EAAE,CAAA;QAChB,CAAC;QAED,IAAI,YAAY;YAAE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;QAC5D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;IAED,+CAA+C;IAC/C,yCAAyC;IACzC,uDAAuD;IACvD,mDAAmD;IACnD,mBAAmB;IACnB,QAAQ,CACN,IAAc,EACd,OAAsB,EACtB,UAAmB,KAAK;QAExB,IAAI,cAAc,GAAG,CAAC,CAAA;QACtB,IAAI,iBAAiB,GAAG,CAAC,CAAA;QAEzB,4DAA4D;QAC5D,mEAAmE;QACnE,sBAAsB;QACtB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,MAAM,SAAS,GACb,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;YAC1D,MAAM,OAAO,GACX,CAAC,SAAS;gBACV,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE;gBACd,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE;gBACd,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG;gBACf,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;YAE3B,MAAM,YAAY,GAChB,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;YAChE,MAAM,UAAU,GACd,CAAC,YAAY;gBACb,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE;gBACjB,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE;gBACjB,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG;gBAClB,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,QAAQ;gBAC9B,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;YAE9B,MAAM,GAAG,GACP,OAAO,CAAC,CAAC,CAAC,CAAC;gBACX,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;oBACf,CAAC,CAAC,SAAS,CAAA;YACb,MAAM,GAAG,GACP,UAAU,CAAC,CAAC,CAAC,CAAC;gBACd,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;oBAClB,CAAC,CAAC,SAAS,CAAA;YACb,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;gBACvD,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAqB;oBACjC,IAAI,CAAC,GAAG,CAAC;oBACT,OAAO,CAAC,GAAG,CAAW;iBACvB,CAAA;gBACD,mDAAmD;gBACnD,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;oBAC1C,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAA;oBACjB,iBAAiB,GAAG,GAAG,CAAA;oBACvB,cAAc,GAAG,GAAG,CAAA;gBACtB,CAAC;YACH,CAAC;QACH,CAAC;QAED,4DAA4D;QAC5D,oEAAoE;QACpE,MAAM,EAAE,iBAAiB,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,CAAA;QAC9C,IAAI,iBAAiB,IAAI,CAAC,EAAE,CAAC;YAC3B,IAAI,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAA;QACxC,CAAC;QAED,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAC,cAAc,CACxB,IAAI,EACJ,OAAO,EACP,OAAO,EACP,cAAc,EACd,iBAAiB,CAClB,CAAA;QACH,CAAC;QAED,OAAO,IAAI,CAAC,SAAS,CACnB,IAAI,EACJ,OAAO,EACP,OAAO,EACP,cAAc,EACd,iBAAiB,CAClB,CAAA;IACH,CAAC;IAED,cAAc,CACZ,IAAc,EACd,OAAsB,EACtB,OAAgB,EAChB,SAAiB,EACjB,YAAoB;QAEpB,sEAAsE;QACtE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;QACvD,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAA;QAE5C,wDAAwD;QACxD,0DAA0D;QAC1D,sCAAsC;QACtC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;YACnC,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,OAAO,CAAC;YACpC,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;YAC1B,EAAE;SACH,CAAC,CAAC,CAAC;YACF,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,OAAO,CAAC;YACpC,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,EAAE,MAAM,CAAC;YAClC,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;SAC1B,CAAA;QAED,uDAAuD;QACvD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,CAAA;YAC/D,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBACnD,OAAO,KAAK,CAAA;YACd,CAAC;YACD,SAAS,IAAI,IAAI,CAAC,MAAM,CAAA;YACxB,YAAY,IAAI,IAAI,CAAC,MAAM,CAAA;QAC7B,CAAC;QACD,gCAAgC;QAEhC,0DAA0D;QAC1D,iBAAiB;QACjB,IAAI,aAAa,GAAW,CAAC,CAAA;QAC7B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,uDAAuD;YACvD,IAAI,IAAI,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC,MAAM;gBAAE,OAAO,KAAK,CAAA;YAEvD,wBAAwB;YACxB,IAAI,SAAS,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;YACzC,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC;gBACtD,aAAa,GAAG,IAAI,CAAC,MAAM,CAAA;YAC7B,CAAC;iBAAM,CAAC;gBACN,iDAAiD;gBACjD,kEAAkE;gBAClE,+BAA+B;gBAC/B,IACE,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE;oBAC5B,SAAS,GAAG,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,EACvC,CAAC;oBACD,OAAO,KAAK,CAAA;gBACd,CAAC;gBACD,SAAS,EAAE,CAAA;gBACX,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC;oBACvD,OAAO,KAAK,CAAA;gBACd,CAAC;gBACD,aAAa,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAA;YACjC,CAAC;QACH,CAAC;QAED,gCAAgC;QAEhC,8DAA8D;QAC9D,+BAA+B;QAC/B,8CAA8C;QAC9C,kEAAkE;QAClE,uEAAuE;QACvE,qCAAqC;QACrC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,IAAI,OAAO,GAAG,CAAC,CAAC,aAAa,CAAA;YAC7B,KAAK,IAAI,CAAC,GAAG,SAAS,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7D,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;gBACzB,OAAO,GAAG,IAAI,CAAA;gBACd,IACE,CAAC,KAAK,GAAG;oBACT,CAAC,KAAK,IAAI;oBACV,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EACxC,CAAC;oBACD,OAAO,KAAK,CAAA;gBACd,CAAC;YACH,CAAC;YACD,2DAA2D;YAC3D,OAAO,OAAO,IAAI,OAAO,CAAA;QAC3B,CAAC;QAED,gEAAgE;QAChE,qEAAqE;QACrE,6CAA6C;QAC7C,qEAAqE;QACrE,+DAA+D;QAC/D,2BAA2B;QAC3B,MAAM,YAAY,GAA8B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA;QACzD,IAAI,WAAW,GAA4B,YAAY,CAAC,CAAC,CAAC,CAAA;QAC1D,IAAI,UAAU,GAAG,CAAC,CAAA;QAClB,MAAM,cAAc,GAAa,CAAC,CAAC,CAAC,CAAA;QACpC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;gBACnB,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;gBAC/B,WAAW,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;gBACrB,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;YAChC,CAAC;iBAAM,CAAC;gBACN,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBACtB,UAAU,EAAE,CAAA;YACd,CAAC;QACH,CAAC;QACD,IAAI,CAAC,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,CAAA;QAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,GAAG,aAAa,CAAA;QAC9C,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;YAC7B,CAAC,CAAC,CAAC,CAAC,GAAG,UAAU,GAAG,CAAE,cAAc,CAAC,CAAC,EAAE,CAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;QACrE,CAAC;QAED,OAAO,CAAC,CAAC,IAAI,CAAC,0BAA0B,CACtC,IAAI,EACJ,YAAY,EACZ,SAAS,EACT,CAAC,EACD,OAAO,EACP,CAAC,EACD,CAAC,CAAC,aAAa,CAChB,CAAA;IACH,CAAC;IAED,wCAAwC;IACxC,qDAAqD;IACrD,0BAA0B,CACxB,IAAc;IACd,iDAAiD;IACjD,YAAuC,EACvC,SAAiB,EACjB,SAAiB,EACjB,OAAgB,EAChB,aAAqB,EACrB,OAAgB;QAEhB,sEAAsE;QACtE,mBAAmB;QACnB,mEAAmE;QACnE,6CAA6C;QAC7C,kDAAkD;QAClD,+CAA+C;QAC/C,qEAAqE;QACrE,sEAAsE;QACtE,gDAAgD;QAChD,MAAM,EAAE,GAAG,YAAY,CAAC,SAAS,CAAC,CAAA;QAClC,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,0CAA0C;YAC1C,KAAK,IAAI,CAAC,GAAG,SAAS,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7C,OAAO,GAAG,IAAI,CAAA;gBACd,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;gBACjB,IACE,CAAC,KAAK,GAAG;oBACT,CAAC,KAAK,IAAI;oBACV,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EACxC,CAAC;oBACD,OAAO,KAAK,CAAA;gBACd,CAAC;YACH,CAAC;YACD,OAAO,OAAO,CAAA;QAChB,CAAC;QAED,2CAA2C;QAC3C,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,EAAE,CAAA;QACxB,OAAO,SAAS,IAAI,KAAK,EAAE,CAAC;YAC1B,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CACtB,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,EACtC,IAAI,EACJ,OAAO,EACP,SAAS,EACT,CAAC,CACF,CAAA;YACD,2DAA2D;YAC3D,gDAAgD;YAChD,IAAI,CAAC,IAAI,aAAa,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBACnD,mDAAmD;gBACnD,MAAM,GAAG,GAAG,IAAI,CAAC,0BAA0B,CACzC,IAAI,EACJ,YAAY,EACZ,SAAS,GAAG,IAAI,CAAC,MAAM,EACvB,SAAS,GAAG,CAAC,EACb,OAAO,EACP,aAAa,GAAG,CAAC,EACjB,OAAO,CACR,CAAA;gBACD,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;oBAClB,OAAO,GAAG,CAAA;gBACZ,CAAC;YACH,CAAC;YACD,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAA;YACzB,IACE,CAAC,KAAK,GAAG;gBACT,CAAC,KAAK,IAAI;gBACV,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EACxC,CAAC;gBACD,OAAO,KAAK,CAAA;YACd,CAAC;YAED,SAAS,EAAE,CAAA;QACb,CAAC;QACD,kCAAkC;QAClC,OAAO,OAAO,IAAI,IAAI,CAAA;IACxB,CAAC;IAED,SAAS,CACP,IAAc,EACd,OAAsB,EACtB,OAAgB,EAChB,SAAiB,EACjB,YAAoB;QAEpB,IAAI,EAAU,CAAA;QACd,IAAI,EAAU,CAAA;QACd,IAAI,EAAU,CAAA;QACd,IAAI,EAAU,CAAA;QACd,KACE,EAAE,GAAG,SAAS;YACZ,EAAE,GAAG,YAAY;YACjB,EAAE,GAAG,IAAI,CAAC,MAAM;YAChB,EAAE,GAAG,OAAO,CAAC,MAAM,EACrB,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,EAClB,EAAE,EAAE,EAAE,EAAE,EAAE,EACV,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAA;YAC3B,IAAI,CAAC,GAAG,OAAO,CAAC,EAAE,CAAC,CAAA;YACnB,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAA;YAEhB,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;YAEzB,wBAAwB;YACxB,wCAAwC;YACxC,qBAAqB;YACrB,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;gBAClC,OAAO,KAAK,CAAA;YACd,CAAC;YACD,oBAAoB;YAEpB,0BAA0B;YAC1B,gDAAgD;YAChD,qDAAqD;YACrD,IAAI,GAAY,CAAA;YAChB,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;gBAC1B,GAAG,GAAG,CAAC,KAAK,CAAC,CAAA;gBACb,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAA;YACvC,CAAC;iBAAM,CAAC;gBACN,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBACf,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAA;YACxC,CAAC;YAED,IAAI,CAAC,GAAG;gBAAE,OAAO,KAAK,CAAA;QACxB,CAAC;QAED,oDAAoD;QACpD,oDAAoD;QACpD,2CAA2C;QAC3C,kDAAkD;QAClD,oDAAoD;QACpD,uDAAuD;QACvD,oDAAoD;QACpD,yDAAyD;QACzD,6BAA6B;QAC7B,yCAAyC;QAEzC,gEAAgE;QAChE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC3B,oDAAoD;YACpD,gBAAgB;YAChB,OAAO,IAAI,CAAA;QACb,CAAC;aAAM,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACrB,+CAA+C;YAC/C,iDAAiD;YACjD,uBAAuB;YACvB,OAAO,OAAO,CAAA;QAChB,CAAC;aAAM,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACrB,4CAA4C;YAC5C,oDAAoD;YACpD,iDAAiD;YACjD,wBAAwB;YACxB,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAA;YAEvC,qBAAqB;QACvB,CAAC;aAAM,CAAC;YACN,yBAAyB;YACzB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAA;QACzB,CAAC;QACD,oBAAoB;IACtB,CAAC;IAED,WAAW;QACT,OAAO,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;IAChD,CAAC;IAED,KAAK,CAAC,OAAe;QACnB,kBAAkB,CAAC,OAAO,CAAC,CAAA;QAE3B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;QAE5B,YAAY;QACZ,IAAI,OAAO,KAAK,IAAI;YAAE,OAAO,QAAQ,CAAA;QACrC,IAAI,OAAO,KAAK,EAAE;YAAE,OAAO,EAAE,CAAA;QAE7B,uDAAuD;QACvD,0DAA0D;QAC1D,IAAI,CAA0B,CAAA;QAC9B,IAAI,QAAQ,GAAoC,IAAI,CAAA;QACpD,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YAChC,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAA;QACjD,CAAC;aAAM,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;YAC7C,QAAQ,GAAG,CACT,OAAO,CAAC,MAAM,CAAC,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,CAAC;oBACX,uBAAuB;oBACzB,CAAC,CAAC,oBAAoB;gBACxB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,iBAAiB;oBACjC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAC3B,CAAC;aAAM,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;YACzC,QAAQ,GAAG,CACT,OAAO,CAAC,MAAM,CAAC,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,CAAC;oBACX,mBAAmB;oBACrB,CAAC,CAAC,gBAAgB;gBACpB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa;oBAC7B,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;QACpB,CAAC;aAAM,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;YAC9C,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,eAAe,CAAA;QAC/D,CAAC;aAAM,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;YAC1C,QAAQ,GAAG,WAAW,CAAA;QACxB,CAAC;QAED,MAAM,EAAE,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAA;QAC5D,IAAI,QAAQ,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE,CAAC;YACvC,2CAA2C;YAC3C,OAAO,CAAC,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;QACzD,CAAC;QACD,OAAO,EAAE,CAAA;IACX,CAAC;IAED,MAAM;QACJ,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK;YAAE,OAAO,IAAI,CAAC,MAAM,CAAA;QAE5D,mDAAmD;QACnD,4BAA4B;QAC5B,EAAE;QACF,wDAAwD;QACxD,yDAAyD;QACzD,2CAA2C;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAA;QAEpB,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;YACnB,OAAO,IAAI,CAAC,MAAM,CAAA;QACpB,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;QAE5B,MAAM,OAAO,GACX,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI;YACzB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU;gBAC1B,CAAC,CAAC,YAAY,CAAA;QAChB,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAElD,kCAAkC;QAClC,kDAAkD;QAClD,sEAAsE;QACtE,iDAAiD;QACjD,8DAA8D;QAC9D,mCAAmC;QACnC,IAAI,EAAE,GAAG,GAAG;aACT,GAAG,CAAC,OAAO,CAAC,EAAE;YACb,MAAM,EAAE,GAAiC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;gBACvD,IAAI,CAAC,YAAY,MAAM,EAAE,CAAC;oBACxB,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;wBAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;gBACjD,CAAC;gBACD,OAAO,CACL,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;oBACvC,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ;wBAC3B,CAAC,CAAC,CAAC,CAAC,IAAI,CACT,CAAA;YACH,CAAC,CAAiC,CAAA;YAClC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBAClB,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;gBACtB,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;gBACtB,IAAI,CAAC,KAAK,QAAQ,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACxC,OAAM;gBACR,CAAC;gBACD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;oBACvB,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;wBAC5C,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,IAAI,CAAA;oBAClD,CAAC;yBAAM,CAAC;wBACN,EAAE,CAAC,CAAC,CAAC,GAAG,OAAO,CAAA;oBACjB,CAAC;gBACH,CAAC;qBAAM,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;oBAC9B,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,YAAY,GAAG,OAAO,GAAG,IAAI,CAAA;gBAClD,CAAC;qBAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC7B,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,YAAY,GAAG,OAAO,GAAG,MAAM,GAAG,IAAI,CAAA;oBACzD,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAA;gBACtB,CAAC;YACH,CAAC,CAAC,CAAA;YACF,MAAM,QAAQ,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAA;YAE/C,yDAAyD;YACzD,wDAAwD;YACxD,iEAAiE;YACjE,IAAI,IAAI,CAAC,OAAO,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBACzC,MAAM,QAAQ,GAAa,EAAE,CAAA;gBAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC1C,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;gBAC/C,CAAC;gBACD,OAAO,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAA;YACzC,CAAC;YAED,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC3B,CAAC,CAAC;aACD,IAAI,CAAC,GAAG,CAAC,CAAA;QAEZ,+DAA+D;QAC/D,mEAAmE;QACnE,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QAC9D,4BAA4B;QAC5B,gDAAgD;QAChD,EAAE,GAAG,GAAG,GAAG,IAAI,GAAG,EAAE,GAAG,KAAK,GAAG,GAAG,CAAA;QAElC,kFAAkF;QAClF,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,EAAE,GAAG,UAAU,GAAG,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,IAAI,CAAA;QACzD,CAAC;QAED,gDAAgD;QAChD,IAAI,IAAI,CAAC,MAAM;YAAE,EAAE,GAAG,MAAM,GAAG,EAAE,GAAG,MAAM,CAAA;QAE1C,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;YACjD,qBAAqB;QACvB,CAAC;QAAC,OAAO,EAAE,EAAE,CAAC;YACZ,uBAAuB;YACvB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;QACrB,CAAC;QACD,oBAAoB;QACpB,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;IAED,UAAU,CAAC,CAAS;QAClB,mDAAmD;QACnD,6DAA6D;QAC7D,8CAA8C;QAC9C,0CAA0C;QAC1C,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;YACjC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACrB,CAAC;aAAM,IAAI,IAAI,CAAC,SAAS,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACnD,sCAAsC;YACtC,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAA;QAChC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QACvB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,CAAS,EAAE,OAAO,GAAG,IAAI,CAAC,OAAO;QACrC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;QACpC,8CAA8C;QAC9C,iBAAiB;QACjB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,KAAK,CAAA;QACd,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,EAAE,CAAA;QACjB,CAAC;QAED,IAAI,CAAC,KAAK,GAAG,IAAI,OAAO,EAAE,CAAC;YACzB,OAAO,IAAI,CAAA;QACb,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;QAE5B,gCAAgC;QAChC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC7B,CAAC;QAED,6CAA6C;QAC7C,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;QAC7B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,CAAA;QAErC,0DAA0D;QAC1D,2DAA2D;QAC3D,mCAAmC;QACnC,uCAAuC;QAEvC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAA;QACpB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA;QAEpC,0EAA0E;QAC1E,IAAI,QAAQ,GAAW,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QACxC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBACrD,QAAQ,GAAG,EAAE,CAAC,CAAC,CAAC,CAAA;YAClB,CAAC;QACH,CAAC;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;YACtB,IAAI,IAAI,GAAG,EAAE,CAAA;YACb,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC9C,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAA;YACnB,CAAC;YACD,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;YACjD,IAAI,GAAG,EAAE,CAAC;gBACR,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;oBACvB,OAAO,IAAI,CAAA;gBACb,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAA;YACrB,CAAC;QACH,CAAC;QAED,2DAA2D;QAC3D,8BAA8B;QAC9B,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YACvB,OAAO,KAAK,CAAA;QACd,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,GAAqB;QACnC,OAAO,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,SAAS,CAAA;IAC1C,CAAC;CACF;AACD,qBAAqB;AACrB,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,oBAAoB;AACpB,SAAS,CAAC,GAAG,GAAG,GAAG,CAAA;AACnB,SAAS,CAAC,SAAS,GAAG,SAAS,CAAA;AAC/B,SAAS,CAAC,MAAM,GAAG,MAAM,CAAA;AACzB,SAAS,CAAC,QAAQ,GAAG,QAAQ,CAAA","sourcesContent":["import { expand } from 'brace-expansion'\nimport { assertValidPattern } from './assert-valid-pattern.js'\nimport { AST, ExtglobType } from './ast.js'\nimport { escape } from './escape.js'\nimport { unescape } from './unescape.js'\n\nexport type Platform =\n | 'aix'\n | 'android'\n | 'darwin'\n | 'freebsd'\n | 'haiku'\n | 'linux'\n | 'openbsd'\n | 'sunos'\n | 'win32'\n | 'cygwin'\n | 'netbsd'\n\nexport interface MinimatchOptions {\n /** do not expand `{x,y}` style braces */\n nobrace?: boolean\n /** do not treat patterns starting with `#` as a comment */\n nocomment?: boolean\n /** do not treat patterns starting with `!` as a negation */\n nonegate?: boolean\n /** print LOTS of debugging output */\n debug?: boolean\n /** treat `**` the same as `*` */\n noglobstar?: boolean\n /** do not expand extglobs like `+(a|b)` */\n noext?: boolean\n /** return the pattern if nothing matches */\n nonull?: boolean\n /** treat `\\\\` as a path separator, not an escape character */\n windowsPathsNoEscape?: boolean\n /**\n * inverse of {@link MinimatchOptions.windowsPathsNoEscape}\n * @deprecated\n */\n allowWindowsEscape?: boolean\n /**\n * Compare a partial path to a pattern. As long as the parts\n * of the path that are present are not contradicted by the\n * pattern, it will be treated as a match. This is useful in\n * applications where you're walking through a folder structure,\n * and don't yet have the full path, but want to ensure that you\n * do not walk down paths that can never be a match.\n */\n partial?: boolean\n /** allow matches that start with `.` even if the pattern does not */\n dot?: boolean\n /** ignore case */\n nocase?: boolean\n /** ignore case only in wildcard patterns */\n nocaseMagicOnly?: boolean\n /** consider braces to be \"magic\" for the purpose of `hasMagic` */\n magicalBraces?: boolean\n /**\n * If set, then patterns without slashes will be matched\n * against the basename of the path if it contains slashes.\n * For example, `a?b` would match the path `/xyz/123/acb`, but\n * not `/xyz/acb/123`.\n */\n matchBase?: boolean\n /** invert the results of negated matches */\n flipNegate?: boolean\n /** do not collapse multiple `/` into a single `/` */\n preserveMultipleSlashes?: boolean\n /**\n * A number indicating the level of optimization that should be done\n * to the pattern prior to parsing and using it for matches.\n */\n optimizationLevel?: number\n /** operating system platform */\n platform?: Platform\n /**\n * When a pattern starts with a UNC path or drive letter, and in\n * `nocase:true` mode, do not convert the root portions of the\n * pattern into a case-insensitive regular expression, and instead\n * leave them as strings.\n *\n * This is the default when the platform is `win32` and\n * `nocase:true` is set.\n */\n windowsNoMagicRoot?: boolean\n /**\n * max number of `{...}` patterns to expand. Default 100_000.\n */\n braceExpandMax?: number\n /**\n * Max number of non-adjacent `**` patterns to recursively walk down.\n *\n * The default of 200 is almost certainly high enough for most purposes,\n * and can handle absurdly excessive patterns.\n */\n maxGlobstarRecursion?: number\n\n /**\n * Max depth to traverse for nested extglobs like `*(a|b|c)`\n *\n * Default is 2, which is quite low, but any higher value\n * swiftly results in punishing performance impacts. Note\n * that this is *not* relevant when the globstar types can\n * be safely coalesced into a single set.\n *\n * For example, `*(a|@(b|c)|d)` would be flattened into\n * `*(a|b|c|d)`. Thus, many common extglobs will retain good\n * performance and never hit this limit, even if they are\n * excessively deep and complicated.\n *\n * If the limit is hit, then the extglob characters are simply\n * not parsed, and the pattern effectively switches into\n * `noextglob: true` mode for the contents of that nested\n * sub-pattern. This will typically _not_ result in a match,\n * but is considered a valid trade-off for security and\n * performance.\n */\n maxExtglobRecursion?: number\n}\n\nexport const minimatch = (\n p: string,\n pattern: string,\n options: MinimatchOptions = {},\n) => {\n assertValidPattern(pattern)\n\n // shortcut: comments match nothing.\n if (!options.nocomment && pattern.charAt(0) === '#') {\n return false\n }\n\n return new Minimatch(pattern, options).match(p)\n}\n\n// Optimized checking for the most common glob patterns.\nconst starDotExtRE = /^\\*+([^+@!?\\*\\[\\(]*)$/\nconst starDotExtTest = (ext: string) => (f: string) =>\n !f.startsWith('.') && f.endsWith(ext)\nconst starDotExtTestDot = (ext: string) => (f: string) => f.endsWith(ext)\nconst starDotExtTestNocase = (ext: string) => {\n ext = ext.toLowerCase()\n return (f: string) => !f.startsWith('.') && f.toLowerCase().endsWith(ext)\n}\nconst starDotExtTestNocaseDot = (ext: string) => {\n ext = ext.toLowerCase()\n return (f: string) => f.toLowerCase().endsWith(ext)\n}\nconst starDotStarRE = /^\\*+\\.\\*+$/\nconst starDotStarTest = (f: string) =>\n !f.startsWith('.') && f.includes('.')\nconst starDotStarTestDot = (f: string) =>\n f !== '.' && f !== '..' && f.includes('.')\nconst dotStarRE = /^\\.\\*+$/\nconst dotStarTest = (f: string) =>\n f !== '.' && f !== '..' && f.startsWith('.')\nconst starRE = /^\\*+$/\nconst starTest = (f: string) => f.length !== 0 && !f.startsWith('.')\nconst starTestDot = (f: string) =>\n f.length !== 0 && f !== '.' && f !== '..'\nconst qmarksRE = /^\\?+([^+@!?\\*\\[\\(]*)?$/\nconst qmarksTestNocase = ([$0, ext = '']: RegExpMatchArray) => {\n const noext = qmarksTestNoExt([$0])\n if (!ext) return noext\n ext = ext.toLowerCase()\n return (f: string) => noext(f) && f.toLowerCase().endsWith(ext)\n}\nconst qmarksTestNocaseDot = ([$0, ext = '']: RegExpMatchArray) => {\n const noext = qmarksTestNoExtDot([$0])\n if (!ext) return noext\n ext = ext.toLowerCase()\n return (f: string) => noext(f) && f.toLowerCase().endsWith(ext)\n}\nconst qmarksTestDot = ([$0, ext = '']: RegExpMatchArray) => {\n const noext = qmarksTestNoExtDot([$0])\n return !ext ? noext : (f: string) => noext(f) && f.endsWith(ext)\n}\nconst qmarksTest = ([$0, ext = '']: RegExpMatchArray) => {\n const noext = qmarksTestNoExt([$0])\n return !ext ? noext : (f: string) => noext(f) && f.endsWith(ext)\n}\nconst qmarksTestNoExt = ([$0]: RegExpMatchArray) => {\n const len = $0.length\n return (f: string) => f.length === len && !f.startsWith('.')\n}\nconst qmarksTestNoExtDot = ([$0]: RegExpMatchArray) => {\n const len = $0.length\n return (f: string) => f.length === len && f !== '.' && f !== '..'\n}\n\n/* c8 ignore start */\nconst defaultPlatform: Platform = (\n typeof process === 'object' && process ?\n (typeof process.env === 'object' &&\n process.env &&\n process.env.__MINIMATCH_TESTING_PLATFORM__) ||\n process.platform\n : 'posix') as Platform\n\nexport type Sep = '\\\\' | '/'\n\nconst path: { [k: string]: { sep: Sep } } = {\n win32: { sep: '\\\\' },\n posix: { sep: '/' },\n}\n/* c8 ignore stop */\n\nexport const sep =\n defaultPlatform === 'win32' ? path.win32.sep : path.posix.sep\nminimatch.sep = sep\n\nexport const GLOBSTAR = Symbol('globstar **')\nminimatch.GLOBSTAR = GLOBSTAR\n\n// any single thing other than /\n// don't need to escape / when using new RegExp()\nconst qmark = '[^/]'\n\n// * => any number of characters\nconst star = qmark + '*?'\n\n// ** when dots are allowed. Anything goes, except .. and .\n// not (^ or / followed by one or two dots followed by $ or /),\n// followed by anything, any number of times.\nconst twoStarDot = '(?:(?!(?:\\\\/|^)(?:\\\\.{1,2})($|\\\\/)).)*?'\n\n// not a ^ or / followed by a dot,\n// followed by anything, any number of times.\nconst twoStarNoDot = '(?:(?!(?:\\\\/|^)\\\\.).)*?'\n\nexport const filter =\n (pattern: string, options: MinimatchOptions = {}) =>\n (p: string) =>\n minimatch(p, pattern, options)\nminimatch.filter = filter\n\nconst ext = (a: MinimatchOptions, b: MinimatchOptions = {}) =>\n Object.assign({}, a, b)\n\nexport const defaults = (def: MinimatchOptions): typeof minimatch => {\n if (!def || typeof def !== 'object' || !Object.keys(def).length) {\n return minimatch\n }\n\n const orig = minimatch\n\n const m = (p: string, pattern: string, options: MinimatchOptions = {}) =>\n orig(p, pattern, ext(def, options))\n\n return Object.assign(m, {\n Minimatch: class Minimatch extends orig.Minimatch {\n constructor(pattern: string, options: MinimatchOptions = {}) {\n super(pattern, ext(def, options))\n }\n static defaults(options: MinimatchOptions) {\n return orig.defaults(ext(def, options)).Minimatch\n }\n },\n\n AST: class AST extends orig.AST {\n /* c8 ignore start */\n constructor(\n type: ExtglobType | null,\n parent?: AST,\n options: MinimatchOptions = {},\n ) {\n super(type, parent, ext(def, options))\n }\n /* c8 ignore stop */\n\n static fromGlob(pattern: string, options: MinimatchOptions = {}) {\n return orig.AST.fromGlob(pattern, ext(def, options))\n }\n },\n\n unescape: (\n s: string,\n options: Pick<\n MinimatchOptions,\n 'windowsPathsNoEscape' | 'magicalBraces'\n > = {},\n ) => orig.unescape(s, ext(def, options)),\n\n escape: (\n s: string,\n options: Pick<\n MinimatchOptions,\n 'windowsPathsNoEscape' | 'magicalBraces'\n > = {},\n ) => orig.escape(s, ext(def, options)),\n\n filter: (pattern: string, options: MinimatchOptions = {}) =>\n orig.filter(pattern, ext(def, options)),\n\n defaults: (options: MinimatchOptions) =>\n orig.defaults(ext(def, options)),\n\n makeRe: (pattern: string, options: MinimatchOptions = {}) =>\n orig.makeRe(pattern, ext(def, options)),\n\n braceExpand: (pattern: string, options: MinimatchOptions = {}) =>\n orig.braceExpand(pattern, ext(def, options)),\n\n match: (\n list: string[],\n pattern: string,\n options: MinimatchOptions = {},\n ) => orig.match(list, pattern, ext(def, options)),\n\n sep: orig.sep,\n GLOBSTAR: GLOBSTAR as typeof GLOBSTAR,\n })\n}\nminimatch.defaults = defaults\n\n// Brace expansion:\n// a{b,c}d -> abd acd\n// a{b,}c -> abc ac\n// a{0..3}d -> a0d a1d a2d a3d\n// a{b,c{d,e}f}g -> abg acdfg acefg\n// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg\n//\n// Invalid sets are not expanded.\n// a{2..}b -> a{2..}b\n// a{b}c -> a{b}c\nexport const braceExpand = (\n pattern: string,\n options: MinimatchOptions = {},\n) => {\n assertValidPattern(pattern)\n\n // Thanks to Yeting Li <https://github.com/yetingli> for\n // improving this regexp to avoid a ReDOS vulnerability.\n if (options.nobrace || !/\\{(?:(?!\\{).)*\\}/.test(pattern)) {\n // shortcut. no need to expand.\n return [pattern]\n }\n\n return expand(pattern, { max: options.braceExpandMax })\n}\nminimatch.braceExpand = braceExpand\n\n// parse a component of the expanded set.\n// At this point, no pattern may contain \"/\" in it\n// so we're going to return a 2d array, where each entry is the full\n// pattern, split on '/', and then turned into a regular expression.\n// A regexp is made at the end which joins each array with an\n// escaped /, and another full one which joins each regexp with |.\n//\n// Following the lead of Bash 4.1, note that \"**\" only has special meaning\n// when it is the *only* thing in a path portion. Otherwise, any series\n// of * is equivalent to a single *. Globstar behavior is enabled by\n// default, and can be disabled by setting options.noglobstar.\n\nexport const makeRe = (pattern: string, options: MinimatchOptions = {}) =>\n new Minimatch(pattern, options).makeRe()\nminimatch.makeRe = makeRe\n\nexport const match = (\n list: string[],\n pattern: string,\n options: MinimatchOptions = {},\n) => {\n const mm = new Minimatch(pattern, options)\n list = list.filter(f => mm.match(f))\n if (mm.options.nonull && !list.length) {\n list.push(pattern)\n }\n return list\n}\nminimatch.match = match\n\n// replace stuff like \\* with *\nconst globMagic = /[?*]|[+@!]\\(.*?\\)|\\[|\\]/\nconst regExpEscape = (s: string) =>\n s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\nexport type MMRegExp = RegExp & {\n _src?: string\n _glob?: string\n}\n\nexport type ParseReturnFiltered = string | MMRegExp | typeof GLOBSTAR\nexport type ParseReturn = ParseReturnFiltered | false\n\nexport class Minimatch {\n options: MinimatchOptions\n set: ParseReturnFiltered[][]\n pattern: string\n\n windowsPathsNoEscape: boolean\n nonegate: boolean\n negate: boolean\n comment: boolean\n empty: boolean\n preserveMultipleSlashes: boolean\n partial: boolean\n globSet: string[]\n globParts: string[][]\n nocase: boolean\n\n isWindows: boolean\n platform: Platform\n windowsNoMagicRoot: boolean\n maxGlobstarRecursion: number\n\n regexp: false | null | MMRegExp\n constructor(pattern: string, options: MinimatchOptions = {}) {\n assertValidPattern(pattern)\n\n options = options || {}\n this.options = options\n this.maxGlobstarRecursion = options.maxGlobstarRecursion ?? 200\n this.pattern = pattern\n this.platform = options.platform || defaultPlatform\n this.isWindows = this.platform === 'win32'\n // avoid the annoying deprecation flag lol\n const awe = ('allowWindow' + 'sEscape') as keyof MinimatchOptions\n this.windowsPathsNoEscape =\n !!options.windowsPathsNoEscape || options[awe] === false\n if (this.windowsPathsNoEscape) {\n this.pattern = this.pattern.replace(/\\\\/g, '/')\n }\n this.preserveMultipleSlashes = !!options.preserveMultipleSlashes\n this.regexp = null\n this.negate = false\n this.nonegate = !!options.nonegate\n this.comment = false\n this.empty = false\n this.partial = !!options.partial\n this.nocase = !!this.options.nocase\n this.windowsNoMagicRoot =\n options.windowsNoMagicRoot !== undefined ?\n options.windowsNoMagicRoot\n : !!(this.isWindows && this.nocase)\n\n this.globSet = []\n this.globParts = []\n this.set = []\n\n // make the set of regexps etc.\n this.make()\n }\n\n hasMagic(): boolean {\n if (this.options.magicalBraces && this.set.length > 1) {\n return true\n }\n for (const pattern of this.set) {\n for (const part of pattern) {\n if (typeof part !== 'string') return true\n }\n }\n return false\n }\n\n debug(..._: any[]) {}\n\n make() {\n const pattern = this.pattern\n const options = this.options\n\n // empty patterns and comments match nothing.\n if (!options.nocomment && pattern.charAt(0) === '#') {\n this.comment = true\n return\n }\n\n if (!pattern) {\n this.empty = true\n return\n }\n\n // step 1: figure out negation, etc.\n this.parseNegate()\n\n // step 2: expand braces\n this.globSet = [...new Set(this.braceExpand())]\n\n if (options.debug) {\n this.debug = (...args: any[]) => console.error(...args)\n }\n\n this.debug(this.pattern, this.globSet)\n\n // step 3: now we have a set, so turn each one into a series of\n // path-portion matching patterns.\n // These will be regexps, except in the case of \"**\", which is\n // set to the GLOBSTAR object for globstar behavior,\n // and will not contain any / characters\n //\n // First, we preprocess to make the glob pattern sets a bit simpler\n // and deduped. There are some perf-killing patterns that can cause\n // problems with a glob walk, but we can simplify them down a bit.\n const rawGlobParts = this.globSet.map(s => this.slashSplit(s))\n this.globParts = this.preprocess(rawGlobParts)\n this.debug(this.pattern, this.globParts)\n\n // glob --> regexps\n let set = this.globParts.map((s, _, __) => {\n if (this.isWindows && this.windowsNoMagicRoot) {\n // check if it's a drive or unc path.\n const isUNC =\n s[0] === '' &&\n s[1] === '' &&\n (s[2] === '?' || !globMagic.test(s[2])) &&\n !globMagic.test(s[3])\n const isDrive = /^[a-z]:/i.test(s[0])\n if (isUNC) {\n return [\n ...s.slice(0, 4),\n ...s.slice(4).map(ss => this.parse(ss)),\n ]\n } else if (isDrive) {\n return [s[0], ...s.slice(1).map(ss => this.parse(ss))]\n }\n }\n return s.map(ss => this.parse(ss))\n })\n\n this.debug(this.pattern, set)\n\n // filter out everything that didn't compile properly.\n this.set = set.filter(\n s => s.indexOf(false) === -1,\n ) as ParseReturnFiltered[][]\n\n // do not treat the ? in UNC paths as magic\n if (this.isWindows) {\n for (let i = 0; i < this.set.length; i++) {\n const p = this.set[i]\n if (\n p[0] === '' &&\n p[1] === '' &&\n this.globParts[i][2] === '?' &&\n typeof p[3] === 'string' &&\n /^[a-z]:$/i.test(p[3])\n ) {\n p[2] = '?'\n }\n }\n }\n\n this.debug(this.pattern, this.set)\n }\n\n // various transforms to equivalent pattern sets that are\n // faster to process in a filesystem walk. The goal is to\n // eliminate what we can, and push all ** patterns as far\n // to the right as possible, even if it increases the number\n // of patterns that we have to process.\n preprocess(globParts: string[][]) {\n // if we're not in globstar mode, then turn ** into *\n if (this.options.noglobstar) {\n for (let i = 0; i < globParts.length; i++) {\n for (let j = 0; j < globParts[i].length; j++) {\n if (globParts[i][j] === '**') {\n globParts[i][j] = '*'\n }\n }\n }\n }\n\n const { optimizationLevel = 1 } = this.options\n\n if (optimizationLevel >= 2) {\n // aggressive optimization for the purpose of fs walking\n globParts = this.firstPhasePreProcess(globParts)\n globParts = this.secondPhasePreProcess(globParts)\n } else if (optimizationLevel >= 1) {\n // just basic optimizations to remove some .. parts\n globParts = this.levelOneOptimize(globParts)\n } else {\n // just collapse multiple ** portions into one\n globParts = this.adjascentGlobstarOptimize(globParts)\n }\n\n return globParts\n }\n\n // just get rid of adjascent ** portions\n adjascentGlobstarOptimize(globParts: string[][]) {\n return globParts.map(parts => {\n let gs: number = -1\n while (-1 !== (gs = parts.indexOf('**', gs + 1))) {\n let i = gs\n while (parts[i + 1] === '**') {\n i++\n }\n if (i !== gs) {\n parts.splice(gs, i - gs)\n }\n }\n return parts\n })\n }\n\n // get rid of adjascent ** and resolve .. portions\n levelOneOptimize(globParts: string[][]) {\n return globParts.map(parts => {\n parts = parts.reduce((set: string[], part) => {\n const prev = set[set.length - 1]\n if (part === '**' && prev === '**') {\n return set\n }\n if (part === '..') {\n if (prev && prev !== '..' && prev !== '.' && prev !== '**') {\n set.pop()\n return set\n }\n }\n set.push(part)\n return set\n }, [])\n return parts.length === 0 ? [''] : parts\n })\n }\n\n levelTwoFileOptimize(parts: string | string[]) {\n if (!Array.isArray(parts)) {\n parts = this.slashSplit(parts)\n }\n let didSomething: boolean = false\n do {\n didSomething = false\n // <pre>/<e>/<rest> -> <pre>/<rest>\n if (!this.preserveMultipleSlashes) {\n for (let i = 1; i < parts.length - 1; i++) {\n const p = parts[i]\n // don't squeeze out UNC patterns\n if (i === 1 && p === '' && parts[0] === '') continue\n if (p === '.' || p === '') {\n didSomething = true\n parts.splice(i, 1)\n i--\n }\n }\n if (\n parts[0] === '.' &&\n parts.length === 2 &&\n (parts[1] === '.' || parts[1] === '')\n ) {\n didSomething = true\n parts.pop()\n }\n }\n\n // <pre>/<p>/../<rest> -> <pre>/<rest>\n let dd: number = 0\n while (-1 !== (dd = parts.indexOf('..', dd + 1))) {\n const p = parts[dd - 1]\n if (p && p !== '.' && p !== '..' && p !== '**') {\n didSomething = true\n parts.splice(dd - 1, 2)\n dd -= 2\n }\n }\n } while (didSomething)\n return parts.length === 0 ? [''] : parts\n }\n\n // First phase: single-pattern processing\n // <pre> is 1 or more portions\n // <rest> is 1 or more portions\n // <p> is any portion other than ., .., '', or **\n // <e> is . or ''\n //\n // **/.. is *brutal* for filesystem walking performance, because\n // it effectively resets the recursive walk each time it occurs,\n // and ** cannot be reduced out by a .. pattern part like a regexp\n // or most strings (other than .., ., and '') can be.\n //\n // <pre>/**/../<p>/<p>/<rest> -> {<pre>/../<p>/<p>/<rest>,<pre>/**/<p>/<p>/<rest>}\n // <pre>/<e>/<rest> -> <pre>/<rest>\n // <pre>/<p>/../<rest> -> <pre>/<rest>\n // **/**/<rest> -> **/<rest>\n //\n // **/*/<rest> -> */**/<rest> <== not valid because ** doesn't follow\n // this WOULD be allowed if ** did follow symlinks, or * didn't\n firstPhasePreProcess(globParts: string[][]) {\n let didSomething = false\n do {\n didSomething = false\n // <pre>/**/../<p>/<p>/<rest> -> {<pre>/../<p>/<p>/<rest>,<pre>/**/<p>/<p>/<rest>}\n for (let parts of globParts) {\n let gs: number = -1\n while (-1 !== (gs = parts.indexOf('**', gs + 1))) {\n let gss: number = gs\n while (parts[gss + 1] === '**') {\n // <pre>/**/**/<rest> -> <pre>/**/<rest>\n gss++\n }\n // eg, if gs is 2 and gss is 4, that means we have 3 **\n // parts, and can remove 2 of them.\n if (gss > gs) {\n parts.splice(gs + 1, gss - gs)\n }\n\n let next = parts[gs + 1]\n const p = parts[gs + 2]\n const p2 = parts[gs + 3]\n if (next !== '..') continue\n if (\n !p ||\n p === '.' ||\n p === '..' ||\n !p2 ||\n p2 === '.' ||\n p2 === '..'\n ) {\n continue\n }\n didSomething = true\n // edit parts in place, and push the new one\n parts.splice(gs, 1)\n const other = parts.slice(0)\n other[gs] = '**'\n globParts.push(other)\n gs--\n }\n\n // <pre>/<e>/<rest> -> <pre>/<rest>\n if (!this.preserveMultipleSlashes) {\n for (let i = 1; i < parts.length - 1; i++) {\n const p = parts[i]\n // don't squeeze out UNC patterns\n if (i === 1 && p === '' && parts[0] === '') continue\n if (p === '.' || p === '') {\n didSomething = true\n parts.splice(i, 1)\n i--\n }\n }\n if (\n parts[0] === '.' &&\n parts.length === 2 &&\n (parts[1] === '.' || parts[1] === '')\n ) {\n didSomething = true\n parts.pop()\n }\n }\n\n // <pre>/<p>/../<rest> -> <pre>/<rest>\n let dd: number = 0\n while (-1 !== (dd = parts.indexOf('..', dd + 1))) {\n const p = parts[dd - 1]\n if (p && p !== '.' && p !== '..' && p !== '**') {\n didSomething = true\n const needDot = dd === 1 && parts[dd + 1] === '**'\n const splin = needDot ? ['.'] : []\n parts.splice(dd - 1, 2, ...splin)\n if (parts.length === 0) parts.push('')\n dd -= 2\n }\n }\n }\n } while (didSomething)\n\n return globParts\n }\n\n // second phase: multi-pattern dedupes\n // {<pre>/*/<rest>,<pre>/<p>/<rest>} -> <pre>/*/<rest>\n // {<pre>/<rest>,<pre>/<rest>} -> <pre>/<rest>\n // {<pre>/**/<rest>,<pre>/<rest>} -> <pre>/**/<rest>\n //\n // {<pre>/**/<rest>,<pre>/**/<p>/<rest>} -> <pre>/**/<rest>\n // ^-- not valid because ** doens't follow symlinks\n secondPhasePreProcess(globParts: string[][]): string[][] {\n for (let i = 0; i < globParts.length - 1; i++) {\n for (let j = i + 1; j < globParts.length; j++) {\n const matched = this.partsMatch(\n globParts[i],\n globParts[j],\n !this.preserveMultipleSlashes,\n )\n if (matched) {\n globParts[i] = []\n globParts[j] = matched\n break\n }\n }\n }\n return globParts.filter(gs => gs.length)\n }\n\n partsMatch(\n a: string[],\n b: string[],\n emptyGSMatch: boolean = false,\n ): false | string[] {\n let ai = 0\n let bi = 0\n let result: string[] = []\n let which: string = ''\n while (ai < a.length && bi < b.length) {\n if (a[ai] === b[bi]) {\n result.push(which === 'b' ? b[bi] : a[ai])\n ai++\n bi++\n } else if (emptyGSMatch && a[ai] === '**' && b[bi] === a[ai + 1]) {\n result.push(a[ai])\n ai++\n } else if (emptyGSMatch && b[bi] === '**' && a[ai] === b[bi + 1]) {\n result.push(b[bi])\n bi++\n } else if (\n a[ai] === '*' &&\n b[bi] &&\n (this.options.dot || !b[bi].startsWith('.')) &&\n b[bi] !== '**'\n ) {\n if (which === 'b') return false\n which = 'a'\n result.push(a[ai])\n ai++\n bi++\n } else if (\n b[bi] === '*' &&\n a[ai] &&\n (this.options.dot || !a[ai].startsWith('.')) &&\n a[ai] !== '**'\n ) {\n if (which === 'a') return false\n which = 'b'\n result.push(b[bi])\n ai++\n bi++\n } else {\n return false\n }\n }\n // if we fall out of the loop, it means they two are identical\n // as long as their lengths match\n return a.length === b.length && result\n }\n\n parseNegate() {\n if (this.nonegate) return\n\n const pattern = this.pattern\n let negate = false\n let negateOffset = 0\n\n for (let i = 0; i < pattern.length && pattern.charAt(i) === '!'; i++) {\n negate = !negate\n negateOffset++\n }\n\n if (negateOffset) this.pattern = pattern.slice(negateOffset)\n this.negate = negate\n }\n\n // set partial to true to test if, for example,\n // \"/a/b\" matches the start of \"/*/b/*/d\"\n // Partial means, if you run out of file before you run\n // out of pattern, then that's fine, as long as all\n // the parts match.\n matchOne(\n file: string[],\n pattern: ParseReturn[],\n partial: boolean = false,\n ) {\n let fileStartIndex = 0\n let patternStartIndex = 0\n\n // UNC paths like //?/X:/... can match X:/... and vice versa\n // Drive letters in absolute drive or unc paths are always compared\n // case-insensitively.\n if (this.isWindows) {\n const fileDrive =\n typeof file[0] === 'string' && /^[a-z]:$/i.test(file[0])\n const fileUNC =\n !fileDrive &&\n file[0] === '' &&\n file[1] === '' &&\n file[2] === '?' &&\n /^[a-z]:$/i.test(file[3])\n\n const patternDrive =\n typeof pattern[0] === 'string' && /^[a-z]:$/i.test(pattern[0])\n const patternUNC =\n !patternDrive &&\n pattern[0] === '' &&\n pattern[1] === '' &&\n pattern[2] === '?' &&\n typeof pattern[3] === 'string' &&\n /^[a-z]:$/i.test(pattern[3])\n\n const fdi =\n fileUNC ? 3\n : fileDrive ? 0\n : undefined\n const pdi =\n patternUNC ? 3\n : patternDrive ? 0\n : undefined\n if (typeof fdi === 'number' && typeof pdi === 'number') {\n const [fd, pd]: [string, string] = [\n file[fdi],\n pattern[pdi] as string,\n ]\n // start matching at the drive letter index of each\n if (fd.toLowerCase() === pd.toLowerCase()) {\n pattern[pdi] = fd\n patternStartIndex = pdi\n fileStartIndex = fdi\n }\n }\n }\n\n // resolve and reduce . and .. portions in the file as well.\n // don't need to do the second phase, because it's only one string[]\n const { optimizationLevel = 1 } = this.options\n if (optimizationLevel >= 2) {\n file = this.levelTwoFileOptimize(file)\n }\n\n if (pattern.includes(GLOBSTAR)) {\n return this.#matchGlobstar(\n file,\n pattern,\n partial,\n fileStartIndex,\n patternStartIndex,\n )\n }\n\n return this.#matchOne(\n file,\n pattern,\n partial,\n fileStartIndex,\n patternStartIndex,\n )\n }\n\n #matchGlobstar(\n file: string[],\n pattern: ParseReturn[],\n partial: boolean,\n fileIndex: number,\n patternIndex: number,\n ) {\n // split the pattern into head, tail, and middle of ** delimited parts\n const firstgs = pattern.indexOf(GLOBSTAR, patternIndex)\n const lastgs = pattern.lastIndexOf(GLOBSTAR)\n\n // split the pattern up into globstar-delimited sections\n // the tail has to be at the end, and the others just have\n // to be found in order from the head.\n const [head, body, tail] = partial ? [\n pattern.slice(patternIndex, firstgs),\n pattern.slice(firstgs + 1),\n [],\n ] : [\n pattern.slice(patternIndex, firstgs),\n pattern.slice(firstgs + 1, lastgs),\n pattern.slice(lastgs + 1),\n ]\n\n // check the head, from the current file/pattern index.\n if (head.length) {\n const fileHead = file.slice(fileIndex, fileIndex + head.length)\n if (!this.#matchOne(fileHead, head, partial, 0, 0)) {\n return false\n }\n fileIndex += head.length\n patternIndex += head.length\n }\n // now we know the head matches!\n\n // if the last portion is not empty, it MUST match the end\n // check the tail\n let fileTailMatch: number = 0\n if (tail.length) {\n // if head + tail > file, then we cannot possibly match\n if (tail.length + fileIndex > file.length) return false\n\n // try to match the tail\n let tailStart = file.length - tail.length\n if (this.#matchOne(file, tail, partial, tailStart, 0)) {\n fileTailMatch = tail.length\n } else {\n // affordance for stuff like a/**/* matching a/b/\n // if the last file portion is '', and there's more to the pattern\n // then try without the '' bit.\n if (\n file[file.length - 1] !== '' ||\n fileIndex + tail.length === file.length\n ) {\n return false\n }\n tailStart--\n if (!this.#matchOne(file, tail, partial, tailStart, 0)) {\n return false\n }\n fileTailMatch = tail.length + 1\n }\n }\n\n // now we know the tail matches!\n\n // the middle is zero or more portions wrapped in **, possibly\n // containing more ** sections.\n // so a/**/b/**/c/**/d has become **/b/**/c/**\n // if it's empty, it means a/**/b, just verify we have no bad dots\n // if there's no tail, so it ends on /**, then we must have *something*\n // after the head, or it's not a matc\n if (!body.length) {\n let sawSome = !!fileTailMatch\n for (let i = fileIndex; i < file.length - fileTailMatch; i++) {\n const f = String(file[i])\n sawSome = true\n if (\n f === '.' ||\n f === '..' ||\n (!this.options.dot && f.startsWith('.'))\n ) {\n return false\n }\n }\n // in partial mode, we just need to get past all file parts\n return partial || sawSome\n }\n\n // now we know that there's one or more body sections, which can\n // be matched anywhere from the 0 index (because the head was pruned)\n // through to the length-fileTailMatch index.\n // split the body up into sections, and note the minimum index it can\n // be found at (start with the length of all previous segments)\n // [section, before, after]\n const bodySegments: [ParseReturn[], number][] = [[[], 0]]\n let currentBody: [ParseReturn[], number] = bodySegments[0]\n let nonGsParts = 0\n const nonGsPartsSums: number[] = [0]\n for (const b of body) {\n if (b === GLOBSTAR) {\n nonGsPartsSums.push(nonGsParts)\n currentBody = [[], 0]\n bodySegments.push(currentBody)\n } else {\n currentBody[0].push(b)\n nonGsParts++\n }\n }\n let i = bodySegments.length - 1\n const fileLength = file.length - fileTailMatch\n for (const b of bodySegments) {\n b[1] = fileLength - ((nonGsPartsSums[i--] as number) + b[0].length)\n }\n\n return !!this.#matchGlobStarBodySections(\n file,\n bodySegments,\n fileIndex,\n 0,\n partial,\n 0,\n !!fileTailMatch,\n )\n }\n\n // return false for \"nope, not matching\"\n // return null for \"not matching, cannot keep trying\"\n #matchGlobStarBodySections(\n file: string[],\n // pattern section, last possible position for it\n bodySegments: [ParseReturn[], number][],\n fileIndex: number,\n bodyIndex: number,\n partial: boolean,\n globStarDepth: number,\n sawTail: boolean,\n ): boolean | null {\n // take the first body segment, and walk from fileIndex to its \"after\"\n // value at the end\n // If it doesn't match at that position, we increment, until we hit\n // that final possible position, and give up.\n // If it does match, then advance and try to rest.\n // If any of them fail we keep walking forward.\n // this is still a bit recursively painful, but it's more constrained\n // than previous implementations, because we never test something that\n // can't possibly be a valid matching condition.\n const bs = bodySegments[bodyIndex]\n if (!bs) {\n // just make sure that there's no bad dots\n for (let i = fileIndex; i < file.length; i++) {\n sawTail = true\n const f = file[i]\n if (\n f === '.' ||\n f === '..' ||\n (!this.options.dot && f.startsWith('.'))\n ) {\n return false\n }\n }\n return sawTail\n }\n\n // have a non-globstar body section to test\n const [body, after] = bs\n while (fileIndex <= after) {\n const m = this.#matchOne(\n file.slice(0, fileIndex + body.length),\n body,\n partial,\n fileIndex,\n 0,\n )\n // if limit exceeded, no match. intentional false negative,\n // acceptable break in correctness for security.\n if (m && globStarDepth < this.maxGlobstarRecursion) {\n // match! see if the rest match. if so, we're done!\n const sub = this.#matchGlobStarBodySections(\n file,\n bodySegments,\n fileIndex + body.length,\n bodyIndex + 1,\n partial,\n globStarDepth + 1,\n sawTail,\n )\n if (sub !== false) {\n return sub\n }\n }\n const f = file[fileIndex]\n if (\n f === '.' ||\n f === '..' ||\n (!this.options.dot && f.startsWith('.'))\n ) {\n return false\n }\n\n fileIndex++\n }\n // walked off. no point continuing\n return partial || null\n }\n\n #matchOne(\n file: string[],\n pattern: ParseReturn[],\n partial: boolean,\n fileIndex: number,\n patternIndex: number,\n ) {\n let fi: number\n let pi: number\n let pl: number\n let fl: number\n for (\n fi = fileIndex,\n pi = patternIndex,\n fl = file.length,\n pl = pattern.length;\n fi < fl && pi < pl;\n fi++, pi++\n ) {\n this.debug('matchOne loop')\n let p = pattern[pi]\n let f = file[fi]\n\n this.debug(pattern, p, f)\n\n // should be impossible.\n // some invalid regexp stuff in the set.\n /* c8 ignore start */\n if (p === false || p === GLOBSTAR) {\n return false\n }\n /* c8 ignore stop */\n\n // something other than **\n // non-magic patterns just have to match exactly\n // patterns with magic have been turned into regexps.\n let hit: boolean\n if (typeof p === 'string') {\n hit = f === p\n this.debug('string match', p, f, hit)\n } else {\n hit = p.test(f)\n this.debug('pattern match', p, f, hit)\n }\n\n if (!hit) return false\n }\n\n // Note: ending in / means that we'll get a final \"\"\n // at the end of the pattern. This can only match a\n // corresponding \"\" at the end of the file.\n // If the file ends in /, then it can only match a\n // a pattern that ends in /, unless the pattern just\n // doesn't have any more for it. But, a/b/ should *not*\n // match \"a/b/*\", even though \"\" matches against the\n // [^/]*? pattern, except in partial mode, where it might\n // simply not be reached yet.\n // However, a/b/ should still satisfy a/*\n\n // now either we fell off the end of the pattern, or we're done.\n if (fi === fl && pi === pl) {\n // ran out of pattern and filename at the same time.\n // an exact hit!\n return true\n } else if (fi === fl) {\n // ran out of file, but still had pattern left.\n // this is ok if we're doing the match as part of\n // a glob fs traversal.\n return partial\n } else if (pi === pl) {\n // ran out of pattern, still have file left.\n // this is only acceptable if we're on the very last\n // empty segment of a file with a trailing slash.\n // a/* should match a/b/\n return fi === fl - 1 && file[fi] === ''\n\n /* c8 ignore start */\n } else {\n // should be unreachable.\n throw new Error('wtf?')\n }\n /* c8 ignore stop */\n }\n\n braceExpand() {\n return braceExpand(this.pattern, this.options)\n }\n\n parse(pattern: string): ParseReturn {\n assertValidPattern(pattern)\n\n const options = this.options\n\n // shortcuts\n if (pattern === '**') return GLOBSTAR\n if (pattern === '') return ''\n\n // far and away, the most common glob pattern parts are\n // *, *.*, and *.<ext> Add a fast check method for those.\n let m: RegExpMatchArray | null\n let fastTest: null | ((f: string) => boolean) = null\n if ((m = pattern.match(starRE))) {\n fastTest = options.dot ? starTestDot : starTest\n } else if ((m = pattern.match(starDotExtRE))) {\n fastTest = (\n options.nocase ?\n options.dot ?\n starDotExtTestNocaseDot\n : starDotExtTestNocase\n : options.dot ? starDotExtTestDot\n : starDotExtTest)(m[1])\n } else if ((m = pattern.match(qmarksRE))) {\n fastTest = (\n options.nocase ?\n options.dot ?\n qmarksTestNocaseDot\n : qmarksTestNocase\n : options.dot ? qmarksTestDot\n : qmarksTest)(m)\n } else if ((m = pattern.match(starDotStarRE))) {\n fastTest = options.dot ? starDotStarTestDot : starDotStarTest\n } else if ((m = pattern.match(dotStarRE))) {\n fastTest = dotStarTest\n }\n\n const re = AST.fromGlob(pattern, this.options).toMMPattern()\n if (fastTest && typeof re === 'object') {\n // Avoids overriding in frozen environments\n Reflect.defineProperty(re, 'test', { value: fastTest })\n }\n return re\n }\n\n makeRe() {\n if (this.regexp || this.regexp === false) return this.regexp\n\n // at this point, this.set is a 2d array of partial\n // pattern strings, or \"**\".\n //\n // It's better to use .match(). This function shouldn't\n // be used, really, but it's pretty convenient sometimes,\n // when you just want to work with a regex.\n const set = this.set\n\n if (!set.length) {\n this.regexp = false\n return this.regexp\n }\n const options = this.options\n\n const twoStar =\n options.noglobstar ? star\n : options.dot ? twoStarDot\n : twoStarNoDot\n const flags = new Set(options.nocase ? ['i'] : [])\n\n // regexpify non-globstar patterns\n // if ** is only item, then we just do one twoStar\n // if ** is first, and there are more, prepend (\\/|twoStar\\/)? to next\n // if ** is last, append (\\/twoStar|) to previous\n // if ** is in the middle, append (\\/|\\/twoStar\\/) to previous\n // then filter out GLOBSTAR symbols\n let re = set\n .map(pattern => {\n const pp: (string | typeof GLOBSTAR)[] = pattern.map(p => {\n if (p instanceof RegExp) {\n for (const f of p.flags.split('')) flags.add(f)\n }\n return (\n typeof p === 'string' ? regExpEscape(p)\n : p === GLOBSTAR ? GLOBSTAR\n : p._src\n )\n }) as (string | typeof GLOBSTAR)[]\n pp.forEach((p, i) => {\n const next = pp[i + 1]\n const prev = pp[i - 1]\n if (p !== GLOBSTAR || prev === GLOBSTAR) {\n return\n }\n if (prev === undefined) {\n if (next !== undefined && next !== GLOBSTAR) {\n pp[i + 1] = '(?:\\\\/|' + twoStar + '\\\\/)?' + next\n } else {\n pp[i] = twoStar\n }\n } else if (next === undefined) {\n pp[i - 1] = prev + '(?:\\\\/|\\\\/' + twoStar + ')?'\n } else if (next !== GLOBSTAR) {\n pp[i - 1] = prev + '(?:\\\\/|\\\\/' + twoStar + '\\\\/)' + next\n pp[i + 1] = GLOBSTAR\n }\n })\n const filtered = pp.filter(p => p !== GLOBSTAR)\n\n // For partial matches, we need to make the pattern match\n // any prefix of the full path. We do this by generating\n // alternative patterns that match progressively longer prefixes.\n if (this.partial && filtered.length >= 1) {\n const prefixes: string[] = []\n for (let i = 1; i <= filtered.length; i++) {\n prefixes.push(filtered.slice(0, i).join('/'))\n }\n return '(?:' + prefixes.join('|') + ')'\n }\n\n return filtered.join('/')\n })\n .join('|')\n\n // need to wrap in parens if we had more than one thing with |,\n // otherwise only the first will be anchored to ^ and the last to $\n const [open, close] = set.length > 1 ? ['(?:', ')'] : ['', '']\n // must match entire pattern\n // ending in a * or ** will make it less strict.\n re = '^' + open + re + close + '$'\n\n // In partial mode, '/' should always match as it's a valid prefix for any pattern\n if (this.partial) {\n re = '^(?:\\\\/|' + open + re.slice(1, -1) + close + ')$'\n }\n\n // can match anything, as long as it's not this.\n if (this.negate) re = '^(?!' + re + ').+$'\n\n try {\n this.regexp = new RegExp(re, [...flags].join(''))\n /* c8 ignore start */\n } catch (ex) {\n // should be impossible\n this.regexp = false\n }\n /* c8 ignore stop */\n return this.regexp\n }\n\n slashSplit(p: string) {\n // if p starts with // on windows, we preserve that\n // so that UNC paths aren't broken. Otherwise, any number of\n // / characters are coalesced into one, unless\n // preserveMultipleSlashes is set to true.\n if (this.preserveMultipleSlashes) {\n return p.split('/')\n } else if (this.isWindows && /^\\/\\/[^\\/]+/.test(p)) {\n // add an extra '' for the one we lose\n return ['', ...p.split(/\\/+/)]\n } else {\n return p.split(/\\/+/)\n }\n }\n\n match(f: string, partial = this.partial) {\n this.debug('match', f, this.pattern)\n // short-circuit in the case of busted things.\n // comments, etc.\n if (this.comment) {\n return false\n }\n if (this.empty) {\n return f === ''\n }\n\n if (f === '/' && partial) {\n return true\n }\n\n const options = this.options\n\n // windows: need to use /, not \\\n if (this.isWindows) {\n f = f.split('\\\\').join('/')\n }\n\n // treat the test path as a set of pathparts.\n const ff = this.slashSplit(f)\n this.debug(this.pattern, 'split', ff)\n\n // just ONE of the pattern sets in this.set needs to match\n // in order for it to be valid. If negating, then just one\n // match means that we have failed.\n // Either way, return on the first hit.\n\n const set = this.set\n this.debug(this.pattern, 'set', set)\n\n // Find the basename of the path by looking for the last non-empty segment\n let filename: string = ff[ff.length - 1]\n if (!filename) {\n for (let i = ff.length - 2; !filename && i >= 0; i--) {\n filename = ff[i]\n }\n }\n\n for (let i = 0; i < set.length; i++) {\n const pattern = set[i]\n let file = ff\n if (options.matchBase && pattern.length === 1) {\n file = [filename]\n }\n const hit = this.matchOne(file, pattern, partial)\n if (hit) {\n if (options.flipNegate) {\n return true\n }\n return !this.negate\n }\n }\n\n // didn't get any hits. this is success if it's a negative\n // pattern, failure otherwise.\n if (options.flipNegate) {\n return false\n }\n return this.negate\n }\n\n static defaults(def: MinimatchOptions) {\n return minimatch.defaults(def).Minimatch\n }\n}\n/* c8 ignore start */\nexport { AST } from './ast.js'\nexport { escape } from './escape.js'\nexport { unescape } from './unescape.js'\n/* c8 ignore stop */\nminimatch.AST = AST\nminimatch.Minimatch = Minimatch\nminimatch.escape = escape\nminimatch.unescape = unescape\n"]} \ No newline at end of file diff --git a/deps/minimatch/dist/esm/unescape.js b/deps/minimatch/dist/esm/unescape.js index dfa408d39853bc..b31bd40a028407 100644 --- a/deps/minimatch/dist/esm/unescape.js +++ b/deps/minimatch/dist/esm/unescape.js @@ -19,14 +19,14 @@ */ export const unescape = (s, { windowsPathsNoEscape = false, magicalBraces = true, } = {}) => { if (magicalBraces) { - return windowsPathsNoEscape - ? s.replace(/\[([^\/\\])\]/g, '$1') + return windowsPathsNoEscape ? + s.replace(/\[([^\/\\])\]/g, '$1') : s .replace(/((?!\\).|^)\[([^\/\\])\]/g, '$1$2') .replace(/\\([^\/])/g, '$1'); } - return windowsPathsNoEscape - ? s.replace(/\[([^\/\\{}])\]/g, '$1') + return windowsPathsNoEscape ? + s.replace(/\[([^\/\\{}])\]/g, '$1') : s .replace(/((?!\\).|^)\[([^\/\\{}])\]/g, '$1$2') .replace(/\\([^\/{}])/g, '$1'); diff --git a/deps/minimatch/dist/esm/unescape.js.map b/deps/minimatch/dist/esm/unescape.js.map index 4fcd51319ac0a1..288321b86c686d 100644 --- a/deps/minimatch/dist/esm/unescape.js.map +++ b/deps/minimatch/dist/esm/unescape.js.map @@ -1 +1 @@ -{"version":3,"file":"unescape.js","sourceRoot":"","sources":["../../src/unescape.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,CAAS,EACT,EACE,oBAAoB,GAAG,KAAK,EAC5B,aAAa,GAAG,IAAI,MACgD,EAAE,EACxE,EAAE;IACF,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,oBAAoB;YACzB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC;YACnC,CAAC,CAAC,CAAC;iBACE,OAAO,CAAC,2BAA2B,EAAE,MAAM,CAAC;iBAC5C,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,CAAA;IACpC,CAAC;IACD,OAAO,oBAAoB;QACzB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,IAAI,CAAC;QACrC,CAAC,CAAC,CAAC;aACE,OAAO,CAAC,6BAA6B,EAAE,MAAM,CAAC;aAC9C,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,CAAA;AACtC,CAAC,CAAA","sourcesContent":["import { MinimatchOptions } from './index.js'\n\n/**\n * Un-escape a string that has been escaped with {@link escape}.\n *\n * If the {@link MinimatchOptions.windowsPathsNoEscape} option is used, then\n * square-bracket escapes are removed, but not backslash escapes.\n *\n * For example, it will turn the string `'[*]'` into `*`, but it will not\n * turn `'\\\\*'` into `'*'`, because `\\` is a path separator in\n * `windowsPathsNoEscape` mode.\n *\n * When `windowsPathsNoEscape` is not set, then both square-bracket escapes and\n * backslash escapes are removed.\n *\n * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped\n * or unescaped.\n *\n * When `magicalBraces` is not set, escapes of braces (`{` and `}`) will not be\n * unescaped.\n */\n\nexport const unescape = (\n s: string,\n {\n windowsPathsNoEscape = false,\n magicalBraces = true,\n }: Pick<MinimatchOptions, 'windowsPathsNoEscape' | 'magicalBraces'> = {},\n) => {\n if (magicalBraces) {\n return windowsPathsNoEscape\n ? s.replace(/\\[([^\\/\\\\])\\]/g, '$1')\n : s\n .replace(/((?!\\\\).|^)\\[([^\\/\\\\])\\]/g, '$1$2')\n .replace(/\\\\([^\\/])/g, '$1')\n }\n return windowsPathsNoEscape\n ? s.replace(/\\[([^\\/\\\\{}])\\]/g, '$1')\n : s\n .replace(/((?!\\\\).|^)\\[([^\\/\\\\{}])\\]/g, '$1$2')\n .replace(/\\\\([^\\/{}])/g, '$1')\n}\n"]} \ No newline at end of file +{"version":3,"file":"unescape.js","sourceRoot":"","sources":["../../src/unescape.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,CAAS,EACT,EACE,oBAAoB,GAAG,KAAK,EAC5B,aAAa,GAAG,IAAI,MACgD,EAAE,EACxE,EAAE;IACF,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,oBAAoB,CAAC,CAAC;YACzB,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC;YACnC,CAAC,CAAC,CAAC;iBACE,OAAO,CAAC,2BAA2B,EAAE,MAAM,CAAC;iBAC5C,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,CAAA;IACpC,CAAC;IACD,OAAO,oBAAoB,CAAC,CAAC;QACzB,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,IAAI,CAAC;QACrC,CAAC,CAAC,CAAC;aACE,OAAO,CAAC,6BAA6B,EAAE,MAAM,CAAC;aAC9C,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,CAAA;AACtC,CAAC,CAAA","sourcesContent":["import { MinimatchOptions } from './index.js'\n\n/**\n * Un-escape a string that has been escaped with {@link escape}.\n *\n * If the {@link MinimatchOptions.windowsPathsNoEscape} option is used, then\n * square-bracket escapes are removed, but not backslash escapes.\n *\n * For example, it will turn the string `'[*]'` into `*`, but it will not\n * turn `'\\\\*'` into `'*'`, because `\\` is a path separator in\n * `windowsPathsNoEscape` mode.\n *\n * When `windowsPathsNoEscape` is not set, then both square-bracket escapes and\n * backslash escapes are removed.\n *\n * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped\n * or unescaped.\n *\n * When `magicalBraces` is not set, escapes of braces (`{` and `}`) will not be\n * unescaped.\n */\n\nexport const unescape = (\n s: string,\n {\n windowsPathsNoEscape = false,\n magicalBraces = true,\n }: Pick<MinimatchOptions, 'windowsPathsNoEscape' | 'magicalBraces'> = {},\n) => {\n if (magicalBraces) {\n return windowsPathsNoEscape ?\n s.replace(/\\[([^\\/\\\\])\\]/g, '$1')\n : s\n .replace(/((?!\\\\).|^)\\[([^\\/\\\\])\\]/g, '$1$2')\n .replace(/\\\\([^\\/])/g, '$1')\n }\n return windowsPathsNoEscape ?\n s.replace(/\\[([^\\/\\\\{}])\\]/g, '$1')\n : s\n .replace(/((?!\\\\).|^)\\[([^\\/\\\\{}])\\]/g, '$1$2')\n .replace(/\\\\([^\\/{}])/g, '$1')\n}\n"]} \ No newline at end of file diff --git a/deps/minimatch/index.js b/deps/minimatch/index.js index 519a68f788d64a..d28609b10808f9 100644 --- a/deps/minimatch/index.js +++ b/deps/minimatch/index.js @@ -4,9 +4,9 @@ var __commonJS = (cb, mod) => function __require() { return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; }; -// node_modules/@isaacs/balanced-match/dist/commonjs/index.js +// node_modules/balanced-match/dist/commonjs/index.js var require_commonjs = __commonJS({ - "node_modules/@isaacs/balanced-match/dist/commonjs/index.js"(exports2) { + "node_modules/balanced-match/dist/commonjs/index.js"(exports2) { "use strict"; Object.defineProperty(exports2, "__esModule", { value: true }); exports2.range = exports2.balanced = void 0; @@ -66,9 +66,9 @@ var require_commonjs = __commonJS({ } }); -// node_modules/@isaacs/brace-expansion/dist/commonjs/index.js +// node_modules/brace-expansion/dist/commonjs/index.js var require_commonjs2 = __commonJS({ - "node_modules/@isaacs/brace-expansion/dist/commonjs/index.js"(exports2) { + "node_modules/brace-expansion/dist/commonjs/index.js"(exports2) { "use strict"; Object.defineProperty(exports2, "__esModule", { value: true }); exports2.EXPANSION_MAX = void 0; @@ -88,7 +88,7 @@ var require_commonjs2 = __commonJS({ var openPattern = /\\{/g; var closePattern = /\\}/g; var commaPattern = /\\,/g; - var periodPattern = /\\./g; + var periodPattern = /\\\./g; exports2.EXPANSION_MAX = 1e5; function numeric(str) { return !isNaN(str) ? parseInt(str, 10) : str.charCodeAt(0); @@ -391,12 +391,60 @@ var require_unescape = __commonJS({ var require_ast = __commonJS({ "dist/commonjs/ast.js"(exports2) { "use strict"; + var _a; Object.defineProperty(exports2, "__esModule", { value: true }); exports2.AST = void 0; var brace_expressions_js_1 = require_brace_expressions(); var unescape_js_12 = require_unescape(); var types = /* @__PURE__ */ new Set(["!", "?", "+", "*", "@"]); var isExtglobType = (c) => types.has(c); + var isExtglobAST = (c) => isExtglobType(c.type); + var adoptionMap = /* @__PURE__ */ new Map([ + ["!", ["@"]], + ["?", ["?", "@"]], + ["@", ["@"]], + ["*", ["*", "+", "?", "@"]], + ["+", ["+", "@"]] + ]); + var adoptionWithSpaceMap = /* @__PURE__ */ new Map([ + ["!", ["?"]], + ["@", ["?"]], + ["+", ["?", "*"]] + ]); + var adoptionAnyMap = /* @__PURE__ */ new Map([ + ["!", ["?", "@"]], + ["?", ["?", "@"]], + ["@", ["?", "@"]], + ["*", ["*", "+", "?", "@"]], + ["+", ["+", "@", "?", "*"]] + ]); + var usurpMap = /* @__PURE__ */ new Map([ + ["!", /* @__PURE__ */ new Map([["!", "@"]])], + [ + "?", + /* @__PURE__ */ new Map([ + ["*", "*"], + ["+", "*"] + ]) + ], + [ + "@", + /* @__PURE__ */ new Map([ + ["!", "!"], + ["?", "?"], + ["@", "@"], + ["*", "*"], + ["+", "+"] + ]) + ], + [ + "+", + /* @__PURE__ */ new Map([ + ["?", "*"], + ["*", "*"] + ]) + ] + ]); var startNoTraversal = "(?!(?:^|/)\\.\\.?(?:$|/))"; var startNoDot = "(?!\\.)"; var addPatternStart = /* @__PURE__ */ new Set(["[", "."]); @@ -406,7 +454,8 @@ var require_ast = __commonJS({ var qmark2 = "[^/]"; var star2 = qmark2 + "*?"; var starNoEmpty = qmark2 + "+?"; - var AST = class _AST { + var ID = 0; + var AST = class { type; #root; #hasMagic; @@ -421,6 +470,22 @@ var require_ast = __commonJS({ // set to true if it's an extglob with no children // (which really means one child of '') #emptyExt = false; + id = ++ID; + get depth() { + return (this.#parent?.depth ?? -1) + 1; + } + [/* @__PURE__ */ Symbol.for("nodejs.util.inspect.custom")]() { + return { + "@@type": "AST", + id: this.id, + type: this.type, + root: this.#root.id, + parent: this.#parent?.id, + depth: this.depth, + partsLength: this.#parts.length, + parts: this.#parts + }; + } constructor(type, parent, options = {}) { this.type = type; if (type) @@ -486,7 +551,7 @@ var require_ast = __commonJS({ for (const p of parts) { if (p === "") continue; - if (typeof p !== "string" && !(p instanceof _AST && p.#parent === this)) { + if (typeof p !== "string" && !(p instanceof _a && p.#parent === this)) { throw new Error("invalid part: " + p); } this.#parts.push(p); @@ -511,7 +576,7 @@ var require_ast = __commonJS({ const p = this.#parent; for (let i = 0; i < this.#parentIndex; i++) { const pp = p.#parts[i]; - if (!(pp instanceof _AST && pp.type === "!")) { + if (!(pp instanceof _a && pp.type === "!")) { return false; } } @@ -536,13 +601,14 @@ var require_ast = __commonJS({ this.push(part.clone(this)); } clone(parent) { - const c = new _AST(this.type, parent); + const c = new _a(this.type, parent); for (const p of this.#parts) { c.copyIn(p); } return c; } - static #parseAST(str, ast, pos, opt) { + static #parseAST(str, ast, pos, opt, extDepth) { + const maxDepth = opt.maxExtglobRecursion ?? 2; let escaping = false; let inBrace = false; let braceStart = -1; @@ -574,11 +640,12 @@ var require_ast = __commonJS({ acc2 += c; continue; } - if (!opt.noext && isExtglobType(c) && str.charAt(i2) === "(") { + const doRecurse = !opt.noext && isExtglobType(c) && str.charAt(i2) === "(" && extDepth <= maxDepth; + if (doRecurse) { ast.push(acc2); acc2 = ""; - const ext2 = new _AST(c, ast); - i2 = _AST.#parseAST(str, ext2, i2, opt); + const ext2 = new _a(c, ast); + i2 = _a.#parseAST(str, ext2, i2, opt, extDepth + 1); ast.push(ext2); continue; } @@ -588,7 +655,7 @@ var require_ast = __commonJS({ return i2; } let i = pos + 1; - let part = new _AST(null, ast); + let part = new _a(null, ast); const parts = []; let acc = ""; while (i < str.length) { @@ -615,19 +682,22 @@ var require_ast = __commonJS({ acc += c; continue; } - if (isExtglobType(c) && str.charAt(i) === "(") { + const doRecurse = !opt.noext && isExtglobType(c) && str.charAt(i) === "(" && /* c8 ignore start - the maxDepth is sufficient here */ + (extDepth <= maxDepth || ast && ast.#canAdoptType(c)); + if (doRecurse) { + const depthAdd = ast && ast.#canAdoptType(c) ? 0 : 1; part.push(acc); acc = ""; - const ext2 = new _AST(c, part); + const ext2 = new _a(c, part); part.push(ext2); - i = _AST.#parseAST(str, ext2, i, opt); + i = _a.#parseAST(str, ext2, i, opt, extDepth + depthAdd); continue; } if (c === "|") { part.push(acc); acc = ""; parts.push(part); - part = new _AST(null, ast); + part = new _a(null, ast); continue; } if (c === ")") { @@ -646,9 +716,71 @@ var require_ast = __commonJS({ ast.#parts = [str.substring(pos - 1)]; return i; } + #canAdoptWithSpace(child) { + return this.#canAdopt(child, adoptionWithSpaceMap); + } + #canAdopt(child, map = adoptionMap) { + if (!child || typeof child !== "object" || child.type !== null || child.#parts.length !== 1 || this.type === null) { + return false; + } + const gc = child.#parts[0]; + if (!gc || typeof gc !== "object" || gc.type === null) { + return false; + } + return this.#canAdoptType(gc.type, map); + } + #canAdoptType(c, map = adoptionAnyMap) { + return !!map.get(this.type)?.includes(c); + } + #adoptWithSpace(child, index) { + const gc = child.#parts[0]; + const blank = new _a(null, gc, this.options); + blank.#parts.push(""); + gc.push(blank); + this.#adopt(child, index); + } + #adopt(child, index) { + const gc = child.#parts[0]; + this.#parts.splice(index, 1, ...gc.#parts); + for (const p of gc.#parts) { + if (typeof p === "object") + p.#parent = this; + } + this.#toString = void 0; + } + #canUsurpType(c) { + const m = usurpMap.get(this.type); + return !!m?.has(c); + } + #canUsurp(child) { + if (!child || typeof child !== "object" || child.type !== null || child.#parts.length !== 1 || this.type === null || this.#parts.length !== 1) { + return false; + } + const gc = child.#parts[0]; + if (!gc || typeof gc !== "object" || gc.type === null) { + return false; + } + return this.#canUsurpType(gc.type); + } + #usurp(child) { + const m = usurpMap.get(this.type); + const gc = child.#parts[0]; + const nt = m?.get(gc.type); + if (!nt) + return false; + this.#parts = gc.#parts; + for (const p of this.#parts) { + if (typeof p === "object") { + p.#parent = this; + } + } + this.type = nt; + this.#toString = void 0; + this.#emptyExt = false; + } static fromGlob(pattern, options = {}) { - const ast = new _AST(null, void 0, options); - _AST.#parseAST(pattern, ast, 0, options); + const ast = new _a(null, void 0, options); + _a.#parseAST(pattern, ast, 0, options, 0); return ast; } // returns the regular expression if there's magic, or the unescaped @@ -742,12 +874,14 @@ var require_ast = __commonJS({ // or start or whatever) and prepend ^ or / at the Regexp construction. toRegExpSource(allowDot) { const dot = allowDot ?? !!this.#options.dot; - if (this.#root === this) + if (this.#root === this) { + this.#flatten(); this.#fillNegs(); - if (!this.type) { + } + if (!isExtglobAST(this)) { const noEmpty = this.isStart() && this.isEnd() && !this.#parts.some((s) => typeof s !== "string"); const src = this.#parts.map((p) => { - const [re, _, hasMagic, uflag] = typeof p === "string" ? _AST.#parseGlob(p, this.#hasMagic, noEmpty) : p.toRegExpSource(allowDot); + const [re, _, hasMagic, uflag] = typeof p === "string" ? _a.#parseGlob(p, this.#hasMagic, noEmpty) : p.toRegExpSource(allowDot); this.#hasMagic = this.#hasMagic || hasMagic; this.#uflag = this.#uflag || uflag; return re; @@ -786,9 +920,10 @@ var require_ast = __commonJS({ let body = this.#partsToRegExp(dot); if (this.isStart() && this.isEnd() && !body && this.type !== "!") { const s = this.toString(); - this.#parts = [s]; - this.type = null; - this.#hasMagic = void 0; + const me = this; + me.#parts = [s]; + me.type = null; + me.#hasMagic = void 0; return [s, (0, unescape_js_12.unescape)(this.toString()), false, false]; } let bodyDotAllowed = !repeated || allowDot || dot || !startNoDot ? "" : this.#partsToRegExp(true); @@ -815,6 +950,38 @@ var require_ast = __commonJS({ this.#uflag ]; } + #flatten() { + if (!isExtglobAST(this)) { + for (const p of this.#parts) { + if (typeof p === "object") { + p.#flatten(); + } + } + } else { + let iterations = 0; + let done = false; + do { + done = true; + for (let i = 0; i < this.#parts.length; i++) { + const c = this.#parts[i]; + if (typeof c === "object") { + c.#flatten(); + if (this.#canAdopt(c)) { + done = false; + this.#adopt(c, i); + } else if (this.#canAdoptWithSpace(c)) { + done = false; + this.#adoptWithSpace(c, i); + } else if (this.#canUsurp(c)) { + done = false; + this.#usurp(c); + } + } + } + } while (!done && ++iterations < 10); + } + this.#toString = void 0; + } #partsToRegExp(dot) { return this.#parts.map((p) => { if (typeof p === "string") { @@ -829,6 +996,7 @@ var require_ast = __commonJS({ let escaping = false; let re = ""; let uflag = false; + let inStar = false; for (let i = 0; i < glob.length; i++) { const c = glob.charAt(i); if (escaping) { @@ -836,6 +1004,16 @@ var require_ast = __commonJS({ re += (reSpecials.has(c) ? "\\" : "") + c; continue; } + if (c === "*") { + if (inStar) + continue; + inStar = true; + re += noEmpty && /^[*]+$/.test(glob) ? starNoEmpty : star2; + hasMagic = true; + continue; + } else { + inStar = false; + } if (c === "\\") { if (i === glob.length - 1) { re += "\\\\"; @@ -854,11 +1032,6 @@ var require_ast = __commonJS({ continue; } } - if (c === "*") { - re += noEmpty && glob === "*" ? starNoEmpty : star2; - hasMagic = true; - continue; - } if (c === "?") { re += qmark2; hasMagic = true; @@ -870,6 +1043,7 @@ var require_ast = __commonJS({ } }; exports2.AST = AST; + _a = AST; } }); @@ -1015,7 +1189,7 @@ var braceExpand = (pattern, options = {}) => { if (options.nobrace || !/\{(?:(?!\{).)*\}/.test(pattern)) { return [pattern]; } - return (0, brace_expansion_1.expand)(pattern); + return (0, brace_expansion_1.expand)(pattern, { max: options.braceExpandMax }); }; exports.braceExpand = braceExpand; exports.minimatch.braceExpand = exports.braceExpand; @@ -1051,15 +1225,18 @@ var Minimatch = class { isWindows; platform; windowsNoMagicRoot; + maxGlobstarRecursion; regexp; constructor(pattern, options = {}) { (0, assert_valid_pattern_js_1.assertValidPattern)(pattern); options = options || {}; this.options = options; + this.maxGlobstarRecursion = options.maxGlobstarRecursion ?? 200; this.pattern = pattern; this.platform = options.platform || defaultPlatform; this.isWindows = this.platform === "win32"; - this.windowsPathsNoEscape = !!options.windowsPathsNoEscape || options.allowWindowsEscape === false; + const awe = "allowWindowsEscape"; + this.windowsPathsNoEscape = !!options.windowsPathsNoEscape || options[awe] === false; if (this.windowsPathsNoEscape) { this.pattern = this.pattern.replace(/\\/g, "/"); } @@ -1116,7 +1293,10 @@ var Minimatch = class { const isUNC = s[0] === "" && s[1] === "" && (s[2] === "?" || !globMagic.test(s[2])) && !globMagic.test(s[3]); const isDrive = /^[a-z]:/i.test(s[0]); if (isUNC) { - return [...s.slice(0, 4), ...s.slice(4).map((ss) => this.parse(ss))]; + return [ + ...s.slice(0, 4), + ...s.slice(4).map((ss) => this.parse(ss)) + ]; } else if (isDrive) { return [s[0], ...s.slice(1).map((ss) => this.parse(ss))]; } @@ -1388,7 +1568,8 @@ var Minimatch = class { // out of pattern, then that's fine, as long as all // the parts match. matchOne(file, pattern, partial = false) { - const options = this.options; + let fileStartIndex = 0; + let patternStartIndex = 0; if (this.isWindows) { const fileDrive = typeof file[0] === "string" && /^[a-z]:$/i.test(file[0]); const fileUNC = !fileDrive && file[0] === "" && file[1] === "" && file[2] === "?" && /^[a-z]:$/i.test(file[3]); @@ -1397,14 +1578,14 @@ var Minimatch = class { const fdi = fileUNC ? 3 : fileDrive ? 0 : void 0; const pdi = patternUNC ? 3 : patternDrive ? 0 : void 0; if (typeof fdi === "number" && typeof pdi === "number") { - const [fd, pd] = [file[fdi], pattern[pdi]]; + const [fd, pd] = [ + file[fdi], + pattern[pdi] + ]; if (fd.toLowerCase() === pd.toLowerCase()) { pattern[pdi] = fd; - if (pdi > fdi) { - pattern = pattern.slice(pdi); - } else if (fdi > pdi) { - file = file.slice(fdi); - } + patternStartIndex = pdi; + fileStartIndex = fdi; } } } @@ -1412,49 +1593,123 @@ var Minimatch = class { if (optimizationLevel >= 2) { file = this.levelTwoFileOptimize(file); } - this.debug("matchOne", this, { file, pattern }); - this.debug("matchOne", file.length, pattern.length); - for (var fi = 0, pi = 0, fl = file.length, pl = pattern.length; fi < fl && pi < pl; fi++, pi++) { - this.debug("matchOne loop"); - var p = pattern[pi]; - var f = file[fi]; - this.debug(pattern, p, f); - if (p === false) { + if (pattern.includes(exports.GLOBSTAR)) { + return this.#matchGlobstar(file, pattern, partial, fileStartIndex, patternStartIndex); + } + return this.#matchOne(file, pattern, partial, fileStartIndex, patternStartIndex); + } + #matchGlobstar(file, pattern, partial, fileIndex, patternIndex) { + const firstgs = pattern.indexOf(exports.GLOBSTAR, patternIndex); + const lastgs = pattern.lastIndexOf(exports.GLOBSTAR); + const [head, body, tail] = partial ? [ + pattern.slice(patternIndex, firstgs), + pattern.slice(firstgs + 1), + [] + ] : [ + pattern.slice(patternIndex, firstgs), + pattern.slice(firstgs + 1, lastgs), + pattern.slice(lastgs + 1) + ]; + if (head.length) { + const fileHead = file.slice(fileIndex, fileIndex + head.length); + if (!this.#matchOne(fileHead, head, partial, 0, 0)) { return false; } - if (p === exports.GLOBSTAR) { - this.debug("GLOBSTAR", [pattern, p, f]); - var fr = fi; - var pr = pi + 1; - if (pr === pl) { - this.debug("** at the end"); - for (; fi < fl; fi++) { - if (file[fi] === "." || file[fi] === ".." || !options.dot && file[fi].charAt(0) === ".") - return false; - } - return true; + fileIndex += head.length; + patternIndex += head.length; + } + let fileTailMatch = 0; + if (tail.length) { + if (tail.length + fileIndex > file.length) + return false; + let tailStart = file.length - tail.length; + if (this.#matchOne(file, tail, partial, tailStart, 0)) { + fileTailMatch = tail.length; + } else { + if (file[file.length - 1] !== "" || fileIndex + tail.length === file.length) { + return false; } - while (fr < fl) { - var swallowee = file[fr]; - this.debug("\nglobstar while", file, fr, pattern, pr, swallowee); - if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { - this.debug("globstar found match!", fr, fl, swallowee); - return true; - } else { - if (swallowee === "." || swallowee === ".." || !options.dot && swallowee.charAt(0) === ".") { - this.debug("dot detected!", file, fr, pattern, pr); - break; - } - this.debug("globstar swallow a segment, and continue"); - fr++; - } + tailStart--; + if (!this.#matchOne(file, tail, partial, tailStart, 0)) { + return false; } - if (partial) { - this.debug("\n>>> no match, partial?", file, fr, pattern, pr); - if (fr === fl) { - return true; - } + fileTailMatch = tail.length + 1; + } + } + if (!body.length) { + let sawSome = !!fileTailMatch; + for (let i2 = fileIndex; i2 < file.length - fileTailMatch; i2++) { + const f = String(file[i2]); + sawSome = true; + if (f === "." || f === ".." || !this.options.dot && f.startsWith(".")) { + return false; + } + } + return partial || sawSome; + } + const bodySegments = [[[], 0]]; + let currentBody = bodySegments[0]; + let nonGsParts = 0; + const nonGsPartsSums = [0]; + for (const b of body) { + if (b === exports.GLOBSTAR) { + nonGsPartsSums.push(nonGsParts); + currentBody = [[], 0]; + bodySegments.push(currentBody); + } else { + currentBody[0].push(b); + nonGsParts++; + } + } + let i = bodySegments.length - 1; + const fileLength = file.length - fileTailMatch; + for (const b of bodySegments) { + b[1] = fileLength - (nonGsPartsSums[i--] + b[0].length); + } + return !!this.#matchGlobStarBodySections(file, bodySegments, fileIndex, 0, partial, 0, !!fileTailMatch); + } + // return false for "nope, not matching" + // return null for "not matching, cannot keep trying" + #matchGlobStarBodySections(file, bodySegments, fileIndex, bodyIndex, partial, globStarDepth, sawTail) { + const bs = bodySegments[bodyIndex]; + if (!bs) { + for (let i = fileIndex; i < file.length; i++) { + sawTail = true; + const f = file[i]; + if (f === "." || f === ".." || !this.options.dot && f.startsWith(".")) { + return false; } + } + return sawTail; + } + const [body, after] = bs; + while (fileIndex <= after) { + const m = this.#matchOne(file.slice(0, fileIndex + body.length), body, partial, fileIndex, 0); + if (m && globStarDepth < this.maxGlobstarRecursion) { + const sub = this.#matchGlobStarBodySections(file, bodySegments, fileIndex + body.length, bodyIndex + 1, partial, globStarDepth + 1, sawTail); + if (sub !== false) { + return sub; + } + } + const f = file[fileIndex]; + if (f === "." || f === ".." || !this.options.dot && f.startsWith(".")) { + return false; + } + fileIndex++; + } + return partial || null; + } + #matchOne(file, pattern, partial, fileIndex, patternIndex) { + let fi; + let pi; + let pl; + let fl; + for (fi = fileIndex, pi = patternIndex, fl = file.length, pl = pattern.length; fi < fl && pi < pl; fi++, pi++) { + this.debug("matchOne loop"); + let p = pattern[pi]; + let f = file[fi]; + this.debug(pattern, p, f); + if (p === false || p === exports.GLOBSTAR) { return false; } let hit; diff --git a/deps/minimatch/package-lock.json b/deps/minimatch/package-lock.json index c789330ac0c26e..1022f59865f99d 100644 --- a/deps/minimatch/package-lock.json +++ b/deps/minimatch/package-lock.json @@ -1,27 +1,27 @@ { "name": "minimatch", - "version": "10.1.2", + "version": "10.2.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "minimatch", - "version": "10.1.2", + "version": "10.2.4", "license": "BlueOak-1.0.0", "dependencies": { - "@isaacs/brace-expansion": "^5.0.1" + "brace-expansion": "^5.0.2" }, "devDependencies": { - "@types/node": "^24.0.0", + "@types/node": "^25.3.0", "esbuild": "^0.27.3", "mkdirp": "^3.0.1", "prettier": "^3.6.2", - "tap": "^21.1.0", + "tap": "^21.6.2", "tshy": "^3.0.2", "typedoc": "^0.28.5" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -513,39 +513,31 @@ "node": ">=18" } }, - "node_modules/@gerrit0/mini-shiki": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-3.22.0.tgz", - "integrity": "sha512-jMpciqEVUBKE1QwU64S4saNMzpsSza6diNCk4MWAeCxO2+LFi2FIFmL2S0VDLzEJCxuvCbU783xi8Hp/gkM5CQ==", + "node_modules/@gar/promise-retry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@gar/promise-retry/-/promise-retry-1.0.2.tgz", + "integrity": "sha512-Lm/ZLhDZcBECta3TmCQSngiQykFdfw+QtI1/GYMsZd4l3nG+P8WLB16XuS7WaBGLQ+9E+cOcWQsth9cayuGt8g==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/engine-oniguruma": "^3.22.0", - "@shikijs/langs": "^3.22.0", - "@shikijs/themes": "^3.22.0", - "@shikijs/types": "^3.22.0", - "@shikijs/vscode-textmate": "^10.0.2" - } - }, - "node_modules/@isaacs/balanced-match": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", - "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", - "license": "MIT", + "retry": "^0.13.1" + }, "engines": { - "node": "20 || >=22" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@isaacs/brace-expansion": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.1.tgz", - "integrity": "sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ==", + "node_modules/@gerrit0/mini-shiki": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-3.23.0.tgz", + "integrity": "sha512-bEMORlG0cqdjVyCEuU0cDQbORWX+kYCeo0kV1lbxF5bt4r7SID2l9bqsxJEM0zndaxpOUT7riCyIVEuqq/Ynxg==", + "dev": true, "license": "MIT", "dependencies": { - "@isaacs/balanced-match": "^4.0.1" - }, - "engines": { - "node": "20 || >=22" + "@shikijs/engine-oniguruma": "^3.23.0", + "@shikijs/langs": "^3.23.0", + "@shikijs/themes": "^3.23.0", + "@shikijs/types": "^3.23.0", + "@shikijs/vscode-textmate": "^10.0.2" } }, "node_modules/@isaacs/cliui": { @@ -622,6 +614,19 @@ "node": ">=0.3.1" } }, + "node_modules/@isaacs/which": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@isaacs/which/-/which-7.0.4.tgz", + "integrity": "sha512-qXToWZFY9CKvWsveV3R5VHNJLQkHTIJXO9J4Xa1UgNwVCRA2LEsmvWC84MIdnezFLsjn2Q+GzbL/8yVF1/ozJw==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^4.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", @@ -691,18 +696,18 @@ } }, "node_modules/@npmcli/git": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-7.0.1.tgz", - "integrity": "sha512-+XTFxK2jJF/EJJ5SoAzXk3qwIDfvFc5/g+bD274LZ7uY7LE8sTfG6Z8rOanPl2ZEvZWqNvmEdtXC25cE54VcoA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-7.0.2.tgz", + "integrity": "sha512-oeolHDjExNAJAnlYP2qzNjMX/Xi9bmu78C9dIGr4xjobrSKbuMYCph8lTzn4vnW3NjIqVmw/f8BCfouqyJXlRg==", "dev": true, "license": "ISC", "dependencies": { + "@gar/promise-retry": "^1.0.0", "@npmcli/promise-spawn": "^9.0.0", "ini": "^6.0.0", "lru-cache": "^11.2.1", "npm-pick-manifest": "^11.0.1", "proc-log": "^6.0.0", - "promise-retry": "^2.0.1", "semver": "^7.3.5", "which": "^6.0.0" }, @@ -710,22 +715,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@npmcli/git/node_modules/which": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-6.0.0.tgz", - "integrity": "sha512-f+gEpIKMR9faW/JgAgPK1D7mekkFoqbmiwvNzuhsHetni20QSgzg9Vhn0g2JSJkkfehQnqdUAx7/e15qS1lPxg==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, "node_modules/@npmcli/installed-package-contents": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-4.0.0.tgz", @@ -754,9 +743,9 @@ } }, "node_modules/@npmcli/package-json": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-7.0.4.tgz", - "integrity": "sha512-0wInJG3j/K40OJt/33ax47WfWMzZTm6OQxB9cDhTt5huCP2a9g2GnlsxmfN+PulItNPIpPrZ+kfwwUil7eHcZQ==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-7.0.5.tgz", + "integrity": "sha512-iVuTlG3ORq2iaVa1IWUxAO/jIp77tUKBhoMjuzYW2kL4MLN1bi/ofqkZ7D7OOwh8coAx1/S2ge0rMdGv8sLSOQ==", "dev": true, "license": "ISC", "dependencies": { @@ -766,7 +755,7 @@ "json-parse-even-better-errors": "^5.0.0", "proc-log": "^6.0.0", "semver": "^7.5.3", - "validate-npm-package-license": "^3.0.4" + "spdx-expression-parse": "^4.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" @@ -785,22 +774,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@npmcli/promise-spawn/node_modules/which": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-6.0.0.tgz", - "integrity": "sha512-f+gEpIKMR9faW/JgAgPK1D7mekkFoqbmiwvNzuhsHetni20QSgzg9Vhn0g2JSJkkfehQnqdUAx7/e15qS1lPxg==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, "node_modules/@npmcli/redact": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-4.0.0.tgz", @@ -812,9 +785,9 @@ } }, "node_modules/@npmcli/run-script": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-10.0.3.tgz", - "integrity": "sha512-ER2N6itRkzWbbtVmZ9WKaWxVlKlOeBFF1/7xx+KA5J1xKa4JjUwBdb6tDpk0v1qA+d+VDwHI9qmLcXSWcmi+Rw==", + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-10.0.4.tgz", + "integrity": "sha512-mGUWr1uMnf0le2TwfOZY4SFxZGXGfm4Jtay/nwAa2FLNAKXUoUwaGwBMNH36UHPtinWfTSJ3nqFQr0091CxVGg==", "dev": true, "license": "ISC", "dependencies": { @@ -822,24 +795,7 @@ "@npmcli/package-json": "^7.0.0", "@npmcli/promise-spawn": "^9.0.0", "node-gyp": "^12.1.0", - "proc-log": "^6.0.0", - "which": "^6.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/@npmcli/run-script/node_modules/which": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-6.0.0.tgz", - "integrity": "sha512-f+gEpIKMR9faW/JgAgPK1D7mekkFoqbmiwvNzuhsHetni20QSgzg9Vhn0g2JSJkkfehQnqdUAx7/e15qS1lPxg==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" + "proc-log": "^6.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" @@ -857,40 +813,40 @@ } }, "node_modules/@shikijs/engine-oniguruma": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.22.0.tgz", - "integrity": "sha512-DyXsOG0vGtNtl7ygvabHd7Mt5EY8gCNqR9Y7Lpbbd/PbJvgWrqaKzH1JW6H6qFkuUa8aCxoiYVv8/YfFljiQxA==", + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.23.0.tgz", + "integrity": "sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "3.22.0", + "@shikijs/types": "3.23.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "node_modules/@shikijs/langs": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.22.0.tgz", - "integrity": "sha512-x/42TfhWmp6H00T6uwVrdTJGKgNdFbrEdhaDwSR5fd5zhQ1Q46bHq9EO61SCEWJR0HY7z2HNDMaBZp8JRmKiIA==", + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.23.0.tgz", + "integrity": "sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "3.22.0" + "@shikijs/types": "3.23.0" } }, "node_modules/@shikijs/themes": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.22.0.tgz", - "integrity": "sha512-o+tlOKqsr6FE4+mYJG08tfCFDS+3CG20HbldXeVoyP+cYSUxDhrFf3GPjE60U55iOkkjbpY2uC3It/eeja35/g==", + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.23.0.tgz", + "integrity": "sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "3.22.0" + "@shikijs/types": "3.23.0" } }, "node_modules/@shikijs/types": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.22.0.tgz", - "integrity": "sha512-491iAekgKDBFE67z70Ok5a8KBMsQ2IJwOWw3us/7ffQkIBCyOQfm/aNwVMBUriP02QshIfgHCBSIYAl3u2eWjg==", + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.23.0.tgz", + "integrity": "sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==", "dev": true, "license": "MIT", "dependencies": { @@ -986,9 +942,9 @@ } }, "node_modules/@tapjs/after": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@tapjs/after/-/after-3.3.1.tgz", - "integrity": "sha512-/RZb0DZxfHP74ursSByTpgKU6jVUtNOtoQ3/prf76+5+G7Q7D7QIQtlrH3bUgk84DI89j+4Nc2DTkMCOLy7BWQ==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@tapjs/after/-/after-3.3.4.tgz", + "integrity": "sha512-Y8DL0F9Ux6Swe7b5g4qLFgJUEFrVr5fhmVOENw4D/x7rDRyx/3c86Ya1p9iJrpkE2RnvdGq9AxR/rTM137Y7Lg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -998,13 +954,13 @@ "node": "20 || >=22" }, "peerDependencies": { - "@tapjs/core": "4.4.1" + "@tapjs/core": "4.5.2" } }, "node_modules/@tapjs/after-each": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tapjs/after-each/-/after-each-4.3.1.tgz", - "integrity": "sha512-kgRbmhKisIl31FsCxFkDmZLNj0qCdNte0aarVLsaFq1LVJOtpITdBfnuiKigrLj4Go9XiASmIpGrU8h1uYF2Xw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@tapjs/after-each/-/after-each-4.3.4.tgz", + "integrity": "sha512-TM1OWz7Ht3aimbT/MLYnoywI9SBGsTus6TQ+94n1yjr1izO3K21PP5Q9UYdqZ2Qq1WiZmGa+CZKUZANUn1ZcvQ==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -1014,13 +970,13 @@ "node": "20 || >=22" }, "peerDependencies": { - "@tapjs/core": "4.4.1" + "@tapjs/core": "4.5.2" } }, "node_modules/@tapjs/asserts": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tapjs/asserts/-/asserts-4.3.1.tgz", - "integrity": "sha512-PyBE1/umvg/o9Ntg3gryWaamCFHhMV0zSdoD6n5saexa8AYUb9XM6XA4y7uXRisdSFVVnD8/yX0OAWsQhryE0g==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@tapjs/asserts/-/asserts-4.3.4.tgz", + "integrity": "sha512-1kf2q0oQ7LCZKy5l4Oe7/ZVijhJ9YxbS4qmqGtj7cYwOw4Q78KNLwthh14c9EBbI2QHKUDS2LaLM8a1qMLmPiA==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -1036,13 +992,13 @@ "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { - "@tapjs/core": "4.4.1" + "@tapjs/core": "4.5.2" } }, "node_modules/@tapjs/before": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tapjs/before/-/before-4.3.1.tgz", - "integrity": "sha512-zxa+DrruCGJhTQCLjYa8nfyYihLsWBWCEgiSvtwOkQKNZhxcaLmH/W85zEWKJ+MnZaa4wVqkyyRkhAM12eq0Lg==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@tapjs/before/-/before-4.3.4.tgz", + "integrity": "sha512-53n/8/RktPkbCuZveDTYiplbrzWjFkYAnmYCrFixESsFoUrkfTCPjeCRmojBS14zuRdVe4kLsX6XWYkaUpLdZA==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -1052,13 +1008,13 @@ "node": "20 || >=22" }, "peerDependencies": { - "@tapjs/core": "4.4.1" + "@tapjs/core": "4.5.2" } }, "node_modules/@tapjs/before-each": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tapjs/before-each/-/before-each-4.3.1.tgz", - "integrity": "sha512-vPCbni80H7/6JtQY2LoO4kiRmuyOwPJXpgR2SRrH9Aq07EVveSlgMkKJxomkbuE5lGr/l6zhO/TZDPnuorSvrg==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@tapjs/before-each/-/before-each-4.3.4.tgz", + "integrity": "sha512-WkLsDvCjBrxrRkyhEBpfmGObUsf8Eb+tsqlxnGUG67XbPMkwkP/AoUPonc/g1Nv+pwtR+t5j6maNblrubWuG3A==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -1068,33 +1024,33 @@ "node": "20 || >=22" }, "peerDependencies": { - "@tapjs/core": "4.4.1" + "@tapjs/core": "4.5.2" } }, "node_modules/@tapjs/chdir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@tapjs/chdir/-/chdir-3.3.1.tgz", - "integrity": "sha512-8awqiQswpJRtlOdag+wV/ezuX1kv9YKiG3DAKcNVr7exkGr61StL7qV1cdHah2rPAXlJv6blgDIYbR80d3s9qA==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@tapjs/chdir/-/chdir-3.3.4.tgz", + "integrity": "sha512-B37eGrs47xseJ7dm9ikhStX7KNqflvZViT2lMqVACeNvoxSpRgy1pu7cPix4wKvBlZCtNYaOD8iDNm+5nDfvSQ==", "dev": true, "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" }, "peerDependencies": { - "@tapjs/core": "4.4.1" + "@tapjs/core": "4.5.2" } }, "node_modules/@tapjs/config": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/@tapjs/config/-/config-5.4.1.tgz", - "integrity": "sha512-ZK1Zs58ALGWx6Zxd0fDlN9VlGNxoudpXZqjlr2asC/Zu6v5oyilN9CX2r9PWHyTHNe6b/TpfpOvt2gTCTpuROA==", + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@tapjs/config/-/config-5.5.2.tgz", + "integrity": "sha512-GQyKl40fGamoSvT4SsfQfZyaHT8fboNW5OhrA1hhMc34di5j/efiD15VlNVbPGE51BZSs5M3Jw7YukF2/Cg8CA==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "@tapjs/core": "4.4.1", - "@tapjs/test": "4.3.1", + "@tapjs/core": "4.5.2", + "@tapjs/test": "4.4.2", "chalk": "^5.6.2", - "jackspeak": "^4.1.2", + "jackspeak": "^4.2.3", "polite-json": "^5.0.0", "tap-yaml": "4.3.0", "walk-up-path": "^4.0.0" @@ -1106,20 +1062,20 @@ "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { - "@tapjs/core": "4.4.1", - "@tapjs/test": "4.3.1" + "@tapjs/core": "4.5.2", + "@tapjs/test": "4.4.2" } }, "node_modules/@tapjs/core": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@tapjs/core/-/core-4.4.1.tgz", - "integrity": "sha512-zEeDgt6YNOKXs4NfGGZ1Lz5aLTlHNCUpwvx5hVl7CuL+/noudWZvL39Vy2rKb+zZnTSgF7b34DqGLoy8+jgpfg==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/@tapjs/core/-/core-4.5.2.tgz", + "integrity": "sha512-0KKabYyBN4W2CRgnD0rOhDvexbMLMPuT0OElQTz5ezCsx1QGtuUHP9TmRXEGCJAoeL44Us0L2DxPpS4BUW1KEQ==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "@tapjs/processinfo": "^3.1.9", "@tapjs/stack": "4.3.0", - "@tapjs/test": "4.3.1", + "@tapjs/test": "4.4.2", "async-hook-domain": "^4.0.1", "diff": "^8.0.2", "is-actual-promise": "^1.0.1", @@ -1151,9 +1107,9 @@ } }, "node_modules/@tapjs/filter": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tapjs/filter/-/filter-4.3.1.tgz", - "integrity": "sha512-oyoqmUcHjYvr5f7LOryVB9ruEtjTiABdwZghx3XgeRnaNiVX3J9J8/xvdctnkbDB7cq3g9Ao2DYzweDl6Zfvhg==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@tapjs/filter/-/filter-4.3.4.tgz", + "integrity": "sha512-Bpbahk/Bv30ZfGoDpZVjGhvg8Cq2yqCZcawd+4qtTTSDY+V7GEpdJGu2/2EvwXP+s4PklPx2kFry8X9m6OtAog==", "dev": true, "license": "BlueOak-1.0.0", "engines": { @@ -1163,13 +1119,13 @@ "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { - "@tapjs/core": "4.4.1" + "@tapjs/core": "4.5.2" } }, "node_modules/@tapjs/fixture": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tapjs/fixture/-/fixture-4.3.1.tgz", - "integrity": "sha512-x3w6Ro4H6UAxNSkDTtmz73kVCjZP4TNY2m+wLLiRdi8fa3lCn7WfvHUn9zoATgRFjgOnG4XrXSkjybhqHZ4Ibw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@tapjs/fixture/-/fixture-4.3.4.tgz", + "integrity": "sha512-zRv1vD2H/2abt0S5Yr5ICV/ZaIqXmusBZ6H4Qbih9oE2jvbs6AVDz5Td0adZbWurtHrPLuOFTIz2UsbJfhCCcw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -1183,36 +1139,36 @@ "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { - "@tapjs/core": "4.4.1" + "@tapjs/core": "4.5.2" } }, "node_modules/@tapjs/intercept": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tapjs/intercept/-/intercept-4.3.1.tgz", - "integrity": "sha512-AvfZwFqAh8g+226HRVMUwoHm1ncf6xMHRQfcsPPIMtjnIrbJZjr2S2uM9qTWTnlk2EVgerqfyh3H8R6ykJsGIg==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@tapjs/intercept/-/intercept-4.3.4.tgz", + "integrity": "sha512-7ifEMPmp4yKHQ7PqdPwCetipFLvCegbIyKigEDds/p03ZNFJjgF06D9T4vc/m0sA5SKkPrHVTOU0UzaSrliP7w==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "@tapjs/after": "3.3.1", + "@tapjs/after": "3.3.4", "@tapjs/stack": "4.3.0" }, "engines": { "node": "20 || >=22" }, "peerDependencies": { - "@tapjs/core": "4.4.1" + "@tapjs/core": "4.5.2" } }, "node_modules/@tapjs/mock": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tapjs/mock/-/mock-4.3.1.tgz", - "integrity": "sha512-oiR34RhC0+h0fqLNHkDA5QmQXmVJkujvdGwUEBxR3HzUIKZWp5SfVw4dY2/Lvl33tPBOtsFDFuqnpt3+f6SrXg==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@tapjs/mock/-/mock-4.4.2.tgz", + "integrity": "sha512-B6SfNWjWCPvjN9CaHe45lEcl2ZFDkQIUoF5jPthwi2mYxHLfyFFEqorZJhguoTs7ToeXvIqquqE/Luk9IeuKBQ==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "@tapjs/after": "3.3.1", + "@tapjs/after": "3.3.4", "@tapjs/stack": "4.3.0", - "resolve-import": "^2.1.1", + "resolve-import": "^2.4.0", "walk-up-path": "^4.0.0" }, "engines": { @@ -1222,13 +1178,13 @@ "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { - "@tapjs/core": "4.4.1" + "@tapjs/core": "4.5.2" } }, "node_modules/@tapjs/node-serialize": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tapjs/node-serialize/-/node-serialize-4.3.1.tgz", - "integrity": "sha512-dOsTr75HFESskVvuv8L6SAw23c2WtF6aoNkaD9SwtbTQZxvZQNGMechWPWYGaMsHB+aB+6EBg1MVnqWHQrOVcw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@tapjs/node-serialize/-/node-serialize-4.3.4.tgz", + "integrity": "sha512-SECDvjBS7NVCiCZ6vEtMwtxxSuR61NHBva+PlIQ1mU0asoTYxV9lpRNEAb9UHFKpquEDlk+bLg2iN01a2nfMuw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -1243,7 +1199,7 @@ "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { - "@tapjs/core": "4.4.1" + "@tapjs/core": "4.5.2" } }, "node_modules/@tapjs/processinfo": { @@ -1264,13 +1220,13 @@ } }, "node_modules/@tapjs/reporter": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@tapjs/reporter/-/reporter-4.4.1.tgz", - "integrity": "sha512-kOppWVcv3sa0fmsBrpzwJiUZbwEdhixBAg0J39dUDMDdNIYrefVUSJsi7f1Agi9uRRXeJfZlUw23tII4CV06rQ==", + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@tapjs/reporter/-/reporter-4.4.4.tgz", + "integrity": "sha512-svWmpJgMQxe4iiKOVr/Hi5kGHJNBDp2Nr8gD0aQuAQ4fp9gOh2LFQXa2Jv7LBKhMjC7UaiW/X7k1qEVk2nOfvg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "@tapjs/config": "5.4.1", + "@tapjs/config": "5.5.2", "@tapjs/stack": "4.3.0", "chalk": "^5.6.2", "ink": "^5.2.1", @@ -1291,44 +1247,44 @@ "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { - "@tapjs/core": "4.4.1" + "@tapjs/core": "4.5.2" } }, "node_modules/@tapjs/run": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@tapjs/run/-/run-4.4.1.tgz", - "integrity": "sha512-mVD9FCknr1mkkCv1vMKL2x4pmpka8ArqHufMP8Mb3Etj6blfePNv0Mu75RWVN9bKYzKAkqPGLenDBPb9hnbUgg==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/@tapjs/run/-/run-4.5.2.tgz", + "integrity": "sha512-Oq5YZvoGxEohRWK8P1wHPIAnudEOHPd/bIWawFtRn0ZGvF7bRduZlHpf4eEIrRHKY84G/I3fmC354604cejxiQ==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "@tapjs/after": "3.3.1", - "@tapjs/before": "4.3.1", - "@tapjs/config": "5.4.1", + "@isaacs/which": "^7.0.4", + "@tapjs/after": "3.3.4", + "@tapjs/before": "4.3.4", + "@tapjs/config": "5.5.2", "@tapjs/processinfo": "^3.1.9", - "@tapjs/reporter": "4.4.1", - "@tapjs/spawn": "4.3.1", - "@tapjs/stdin": "4.3.1", - "@tapjs/test": "4.3.1", + "@tapjs/reporter": "4.4.4", + "@tapjs/spawn": "4.3.4", + "@tapjs/stdin": "4.3.4", + "@tapjs/test": "4.4.2", "c8": "^10.1.3", "chalk": "^5.6.2", "chokidar": "^4.0.2", "foreground-child": "^4.0.0", - "glob": "^13.0.0", + "glob": "^13.0.2", "minipass": "^7.0.4", "mkdirp": "^3.0.1", "node-options-to-argv": "^1.0.0", "opener": "^1.5.2", "pacote": "^21.0.4", "path-scurry": "^2.0.0", - "resolve-import": "^2.0.0", + "resolve-import": "^2.4.0", "rimraf": "^6.0.0", "semver": "^7.7.2", "signal-exit": "^4.1.0", "tap-parser": "18.3.0", "tap-yaml": "4.3.0", "tcompare": "9.3.0", - "trivial-deferred": "^2.0.0", - "which": "^5.0.0" + "trivial-deferred": "^2.0.0" }, "bin": { "tap-run": "dist/esm/index.js" @@ -1340,13 +1296,13 @@ "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { - "@tapjs/core": "4.4.1" + "@tapjs/core": "4.5.2" } }, "node_modules/@tapjs/snapshot": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tapjs/snapshot/-/snapshot-4.3.1.tgz", - "integrity": "sha512-xPE5yxnck9EhpbH2i60xIB9HxgG39wSyn6Hj+UQal/lDgprbdYNG+36Owdp52TNHOL14GcVO3aiqyOy4UdkN6A==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@tapjs/snapshot/-/snapshot-4.3.4.tgz", + "integrity": "sha512-2sJXaGLJUMakkdJd5iDWRucgyHX7f5eP05m4weqWq9dLzX7p1JFOrWXUwns8RCIY7VX9Vx+4jENlxJOywYjyqg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -1361,20 +1317,20 @@ "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { - "@tapjs/core": "4.4.1" + "@tapjs/core": "4.5.2" } }, "node_modules/@tapjs/spawn": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tapjs/spawn/-/spawn-4.3.1.tgz", - "integrity": "sha512-bQ5Mb0F8Vm07TDe3DYFEzuIN1aCbRyFPYjM6cD62iszT0B4znaXL4PseRXB0VoL9cxJICeNm6AiT0G9PF09z4Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@tapjs/spawn/-/spawn-4.3.4.tgz", + "integrity": "sha512-qQY2SSLkXknpL1kndLS1bCPo9vYKV8Ka93UPIllvDEwaY3oUMghh++EOE4dyUxQPgMFpmoUoj8kSbm2hotevbQ==", "dev": true, "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" }, "peerDependencies": { - "@tapjs/core": "4.4.1" + "@tapjs/core": "4.5.2" } }, "node_modules/@tapjs/stack": { @@ -1391,51 +1347,51 @@ } }, "node_modules/@tapjs/stdin": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tapjs/stdin/-/stdin-4.3.1.tgz", - "integrity": "sha512-wD4bJM+1LmnDkBpR7aLJ6tlwDM/OT0RaiHPFgRrpDv7FB50LeR3h9wh7s+c+Ysc9OgZDkLNLkvG9jIhb937bZA==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@tapjs/stdin/-/stdin-4.3.4.tgz", + "integrity": "sha512-0kFeaPEGwNWx8R0z9Uq93/CNhAg+9NbTPZW+GXsjuHQSG125g7VZBNBAg2IMeQmVQ9bUWa3+f5TNp/JnLVvJmg==", "dev": true, "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" }, "peerDependencies": { - "@tapjs/core": "4.4.1" + "@tapjs/core": "4.5.2" } }, "node_modules/@tapjs/test": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tapjs/test/-/test-4.3.1.tgz", - "integrity": "sha512-NOsYB1VhaSPmWqrvsdeVnUuklNtJwFEQnybPHjVCqq0ecjP/SZKW+nnVzt9ISAPF+FDtQisqgJV2/Y54jzhpgA==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@tapjs/test/-/test-4.4.2.tgz", + "integrity": "sha512-YuUgTffPNGzodjeHOsaF/j0/5B/bAqtfgwqUkqa3mWdwqzlmB2AcIA6lBtLaQfbjG8wgGNwYfs3McgxkGRqxfA==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/ts-node-temp-fork-for-pr-2009": "^10.9.7", - "@tapjs/after": "3.3.1", - "@tapjs/after-each": "4.3.1", - "@tapjs/asserts": "4.3.1", - "@tapjs/before": "4.3.1", - "@tapjs/before-each": "4.3.1", - "@tapjs/chdir": "3.3.1", - "@tapjs/filter": "4.3.1", - "@tapjs/fixture": "4.3.1", - "@tapjs/intercept": "4.3.1", - "@tapjs/mock": "4.3.1", - "@tapjs/node-serialize": "4.3.1", - "@tapjs/snapshot": "4.3.1", - "@tapjs/spawn": "4.3.1", - "@tapjs/stdin": "4.3.1", - "@tapjs/typescript": "3.5.1", - "@tapjs/worker": "4.3.1", - "glob": "^13.0.0", - "jackspeak": "^4.1.2", + "@tapjs/after": "3.3.4", + "@tapjs/after-each": "4.3.4", + "@tapjs/asserts": "4.3.4", + "@tapjs/before": "4.3.4", + "@tapjs/before-each": "4.3.4", + "@tapjs/chdir": "3.3.4", + "@tapjs/filter": "4.3.4", + "@tapjs/fixture": "4.3.4", + "@tapjs/intercept": "4.3.4", + "@tapjs/mock": "4.4.2", + "@tapjs/node-serialize": "4.3.4", + "@tapjs/snapshot": "4.3.4", + "@tapjs/spawn": "4.3.4", + "@tapjs/stdin": "4.3.4", + "@tapjs/typescript": "3.5.4", + "@tapjs/worker": "4.3.4", + "glob": "^13.0.2", + "jackspeak": "^4.2.3", "mkdirp": "^3.0.0", "package-json-from-dist": "^1.0.0", - "resolve-import": "^2.1.1", + "resolve-import": "^2.4.0", "rimraf": "^6.0.0", - "sync-content": "^2.0.1", + "sync-content": "^2.0.4", "tap-parser": "18.3.0", - "tshy": "^3.1.3", + "tshy": "^3.3.2", "typescript": "5.9", "walk-up-path": "^4.0.0" }, @@ -1446,13 +1402,13 @@ "node": "20 || >=22" }, "peerDependencies": { - "@tapjs/core": "4.4.1" + "@tapjs/core": "4.5.2" } }, "node_modules/@tapjs/typescript": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/@tapjs/typescript/-/typescript-3.5.1.tgz", - "integrity": "sha512-4clGpzF1OTjLZYlavI167rCseSVsLpd5ygBAf297o468VEtpRAJPYx1IjoPrnGWC/M5iJadsCrTlIuBYABw81g==", + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/@tapjs/typescript/-/typescript-3.5.4.tgz", + "integrity": "sha512-z8O10CpbPYoHA876Dlg40qXtM058akP76HNQy+EdNE+AhFo7kold4YBgyjYRU7WDWNlp2B/MPgsy/OZ4PRXQWw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -1462,20 +1418,20 @@ "node": "20 || >=22" }, "peerDependencies": { - "@tapjs/core": "4.4.1" + "@tapjs/core": "4.5.2" } }, "node_modules/@tapjs/worker": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tapjs/worker/-/worker-4.3.1.tgz", - "integrity": "sha512-RInbFaGUH+KsAl/ozRVCMhpXaQPsvwEQ7PiKprpXgKjxjUrzwlkAbFAxo4K79axCWWdm6JUD5pH93n0FJ75jYQ==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@tapjs/worker/-/worker-4.3.4.tgz", + "integrity": "sha512-AvmfwMgJXB/eOwIti/rOvw1l1eHsxUex3lyrhiC6uK5iOmbHWBOFsGHwEfc7Z4eertPM6FUqnZxkxkTEVGueig==", "dev": true, "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" }, "peerDependencies": { - "@tapjs/core": "4.4.1" + "@tapjs/core": "4.5.2" } }, "node_modules/@tsconfig/node14": { @@ -1548,13 +1504,13 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.10.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.12.tgz", - "integrity": "sha512-68e+T28EbdmLSTkPgs3+UacC6rzmqrcWFPQs1C8mwJhI/r5Uxr0yEuQotczNRROd1gq30NGxee+fo0rSIxpyAw==", + "version": "25.3.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.3.tgz", + "integrity": "sha512-DpzbrH7wIcBaJibpKo9nnSQL0MTRdnWttGyE5haGwK86xgMOkFLp7vEyfQPGLOJh5wNYiJ3V9PmUMDhV9u8kkQ==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~7.16.0" + "undici-types": "~7.18.0" } }, "node_modules/@types/unist": { @@ -1564,6 +1520,123 @@ "dev": true, "license": "MIT" }, + "node_modules/@typescript/native-preview": { + "version": "7.0.0-dev.20260228.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview/-/native-preview-7.0.0-dev.20260228.1.tgz", + "integrity": "sha512-kEUE54Shr4VfD1aVlxBkT9EVRkdSklINPxcUdFDwWQYh+uNRfgM/KmGUapbhCnoaat8ALRv30X6r6Eu3WiEhGg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsgo": "bin/tsgo.js" + }, + "optionalDependencies": { + "@typescript/native-preview-darwin-arm64": "7.0.0-dev.20260228.1", + "@typescript/native-preview-darwin-x64": "7.0.0-dev.20260228.1", + "@typescript/native-preview-linux-arm": "7.0.0-dev.20260228.1", + "@typescript/native-preview-linux-arm64": "7.0.0-dev.20260228.1", + "@typescript/native-preview-linux-x64": "7.0.0-dev.20260228.1", + "@typescript/native-preview-win32-arm64": "7.0.0-dev.20260228.1", + "@typescript/native-preview-win32-x64": "7.0.0-dev.20260228.1" + } + }, + "node_modules/@typescript/native-preview-darwin-arm64": { + "version": "7.0.0-dev.20260228.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-darwin-arm64/-/native-preview-darwin-arm64-7.0.0-dev.20260228.1.tgz", + "integrity": "sha512-WzU0dbBNrEC/qS/axWxcxSosQNg422SdEq/aPf/98RDjYQVy1ILH0UU1aOyzROujPyUBPeVho71MrFEhb9uh6g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@typescript/native-preview-darwin-x64": { + "version": "7.0.0-dev.20260228.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-darwin-x64/-/native-preview-darwin-x64-7.0.0-dev.20260228.1.tgz", + "integrity": "sha512-6QJ3PApmZoc87exMhashVL/gjNG+1Ph5OkUT3GXblM5PucXdEuVr1d86TC0O31EBbqUWWKUbp+U/BiTko1gOHw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@typescript/native-preview-linux-arm": { + "version": "7.0.0-dev.20260228.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-arm/-/native-preview-linux-arm-7.0.0-dev.20260228.1.tgz", + "integrity": "sha512-H2rKa7vjt/kfzlz+sdXW5VU/f8PcemCbW4JLcAi4esSUSDYDNsOHYCgLdrOrvUA9IBK86kunkTsJVvKJLpy+jQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@typescript/native-preview-linux-arm64": { + "version": "7.0.0-dev.20260228.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-arm64/-/native-preview-linux-arm64-7.0.0-dev.20260228.1.tgz", + "integrity": "sha512-oVJ689FnZuwm0+MEFtbWcI9kqCfU8+7/z23d2SgMl5M4NKYk5CqUsOtm6IGwZRRLJONKhmSdAzOCSbMN9UTLEg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@typescript/native-preview-linux-x64": { + "version": "7.0.0-dev.20260228.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-x64/-/native-preview-linux-x64-7.0.0-dev.20260228.1.tgz", + "integrity": "sha512-W4/N02tp9CSd+ZO5p6KyyKqXmqMA2vtVcvnjBLyPDZQ4KgUAeRMJFzH/7ME2BN3BxZCplX5WFXfmI6fkc+1z+w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@typescript/native-preview-win32-arm64": { + "version": "7.0.0-dev.20260228.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-win32-arm64/-/native-preview-win32-arm64-7.0.0-dev.20260228.1.tgz", + "integrity": "sha512-AB6NhxIInyeIzINJLhIzNo4qQOEHp/YvATptTK6vcngBq9syb2ST6UAMIAtl2Vj1m9wjMpUyHzzcJK/1c1MemA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@typescript/native-preview-win32-x64": { + "version": "7.0.0-dev.20260228.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-win32-x64/-/native-preview-win32-x64-7.0.0-dev.20260228.1.tgz", + "integrity": "sha512-9Wq1d0ZbrJcF6NoODw4+SRNdcZtKMmm2w32Wlo+r6ZIziBF5HFWvJcwGXNE0pbFpX6H/Gs8dhLaDKZU2dLoWOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/abbrev": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-4.0.0.tgz", @@ -1575,9 +1648,9 @@ } }, "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, "license": "MIT", "bin": { @@ -1588,9 +1661,9 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", "dev": true, "license": "MIT", "dependencies": { @@ -1690,20 +1763,24 @@ } }, "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } }, "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" } }, "node_modules/c8": { @@ -2116,17 +2193,6 @@ "dev": true, "license": "MIT" }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -2363,9 +2429,9 @@ } }, "node_modules/get-east-asian-width": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", - "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", + "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", "dev": true, "license": "MIT", "engines": { @@ -2376,18 +2442,18 @@ } }, "node_modules/glob": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.1.tgz", - "integrity": "sha512-B7U/vJpE3DkJ5WXTgTpTRN63uV42DseiXXKMwG14LQBXmsdeIoHAPbU/MEo6II0k5ED74uc2ZGTC6MwHFQhF6w==", + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "minimatch": "^10.1.2", - "minipass": "^7.1.2", - "path-scurry": "^2.0.0" + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -2466,9 +2532,9 @@ } }, "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", "dev": true, "license": "MIT", "optional": true, @@ -2477,6 +2543,10 @@ }, "engines": { "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/ignore-walk": { @@ -2638,9 +2708,9 @@ } }, "node_modules/isexe": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.3.tgz", - "integrity": "sha512-+DAwQUtT9h86RsYHuBuSf583mEx34Z8ZTf8BXVrDDvHkUN/0e9c+UX3SHUUxSsZ3ZDfKY6sK7VdCJ96269O5+A==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", + "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", "dev": true, "license": "BlueOak-1.0.0", "engines": { @@ -2719,6 +2789,15 @@ "node": "^20.17.0 || >=22.9.0" } }, + "node_modules/jsonc-simple-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jsonc-simple-parser/-/jsonc-simple-parser-3.0.0.tgz", + "integrity": "sha512-0qi9Kuj4JPar4/3b9wZteuPZrTeFzXsQyOZj7hksnReCZN3Vr17Doz7w/i3E9XH7vRkVTHhHES+r1h97I+hfww==", + "dev": true, + "dependencies": { + "reghex": "^3.0.2" + } + }, "node_modules/jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", @@ -2769,9 +2848,9 @@ } }, "node_modules/lru-cache": { - "version": "11.2.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.5.tgz", - "integrity": "sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==", + "version": "11.2.6", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", + "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", "dev": true, "license": "BlueOak-1.0.0", "engines": { @@ -2809,12 +2888,13 @@ "license": "ISC" }, "node_modules/make-fetch-happen": { - "version": "15.0.3", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-15.0.3.tgz", - "integrity": "sha512-iyyEpDty1mwW3dGlYXAJqC/azFn5PPvgKVwXayOGBSmKLxhKZ9fg4qIan2ePpp1vJIwfFiO34LAPZgq9SZW9Aw==", + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-15.0.4.tgz", + "integrity": "sha512-vM2sG+wbVeVGYcCm16mM3d5fuem9oC28n436HjsGO3LcxoTI8LNVa4rwZDn3f76+cWyT4GGJDxjTYU1I2nr6zw==", "dev": true, "license": "ISC", "dependencies": { + "@gar/promise-retry": "^1.0.0", "@npmcli/agent": "^4.0.0", "cacache": "^20.0.1", "http-cache-semantics": "^4.1.1", @@ -2824,7 +2904,6 @@ "minipass-pipeline": "^1.2.4", "negotiator": "^1.0.0", "proc-log": "^6.0.0", - "promise-retry": "^2.0.1", "ssri": "^13.0.0" }, "engines": { @@ -2832,9 +2911,9 @@ } }, "node_modules/markdown-it": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", - "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.1.tgz", + "integrity": "sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==", "dev": true, "license": "MIT", "dependencies": { @@ -2867,27 +2946,27 @@ } }, "node_modules/minimatch": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.2.tgz", - "integrity": "sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw==", + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "@isaacs/brace-expansion": "^5.0.1" + "brace-expansion": "^5.0.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "engines": { "node": ">=16 || 14 >=14.17" } @@ -2906,9 +2985,9 @@ } }, "node_modules/minipass-fetch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-5.0.1.tgz", - "integrity": "sha512-yHK8pb0iCGat0lDrs/D6RZmCdaBT64tULXjdxjSMAqoDi18Q3qKEUTHypHQZQd9+FYpIS+lkvpq6C/R6SbUeRw==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-5.0.2.tgz", + "integrity": "sha512-2d0q2a8eCi2IRg/IGubCNRJoYbA1+YPXAzQVRFmB45gdGZafyivnZ5YSEfo3JikbjGxOdntGFvBQGqaSMXlAFQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2920,7 +2999,7 @@ "node": "^20.17.0 || >=22.9.0" }, "optionalDependencies": { - "encoding": "^0.1.13" + "iconv-lite": "^0.7.2" } }, "node_modules/minipass-flush": { @@ -3073,22 +3152,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/node-gyp/node_modules/which": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-6.0.0.tgz", - "integrity": "sha512-f+gEpIKMR9faW/JgAgPK1D7mekkFoqbmiwvNzuhsHetni20QSgzg9Vhn0g2JSJkkfehQnqdUAx7/e15qS1lPxg==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, "node_modules/node-options-to-argv": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-options-to-argv/-/node-options-to-argv-1.0.0.tgz", @@ -3165,9 +3228,9 @@ } }, "node_modules/npm-packlist": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-10.0.3.tgz", - "integrity": "sha512-zPukTwJMOu5X5uvm0fztwS5Zxyvmk38H/LfidkOMt3gbZVCyro2cD/ETzwzVPcWZA3JOyPznfUN/nkyFiyUbxg==", + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-10.0.4.tgz", + "integrity": "sha512-uMW73iajD8hiH4ZBxEV3HC+eTnppIqwakjOYuvgddnalIw2lJguKviK1pcUJDlIWm1wSJkchpDZDSVVsZEYRng==", "dev": true, "license": "ISC", "dependencies": { @@ -3293,12 +3356,13 @@ "license": "BlueOak-1.0.0" }, "node_modules/pacote": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-21.2.0.tgz", - "integrity": "sha512-OwidJA8uHuGYxoZhe4DBv3JJqGg4ojjVV5dwvVxRKq+bOBpgYMbYd/onIvSU1sv5nQIsb+zp4/0uqv6giFQVjg==", + "version": "21.4.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-21.4.0.tgz", + "integrity": "sha512-DR7mn7HUOomAX1BORnpYy678qVIidbvOojkBscqy27dRKN+s/hLeQT1MeYYrx1Cxh62jyKjiWiDV7RTTqB+ZEQ==", "dev": true, "license": "ISC", "dependencies": { + "@gar/promise-retry": "^1.0.0", "@npmcli/git": "^7.0.0", "@npmcli/installed-package-contents": "^4.0.0", "@npmcli/package-json": "^7.0.0", @@ -3312,7 +3376,6 @@ "npm-pick-manifest": "^11.0.1", "npm-registry-fetch": "^19.0.0", "proc-log": "^6.0.0", - "promise-retry": "^2.0.1", "sigstore": "^4.0.0", "ssri": "^13.0.0", "tar": "^7.4.3" @@ -3355,9 +3418,9 @@ } }, "node_modules/path-scurry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", - "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -3365,7 +3428,7 @@ "minipass": "^7.1.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -3488,6 +3551,16 @@ "node": ">=10" } }, + "node_modules/promise-retry/node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/punycode.js": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", @@ -3580,6 +3653,13 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/reghex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/reghex/-/reghex-3.0.2.tgz", + "integrity": "sha512-Zb9DJ5u6GhgqRSBnxV2QSnLqEwcKxHWFA1N2yUa4ZUAO1P8jlWKYtWZ6/ooV6yylspGXJX0O/uNzEv0xrCtwaA==", + "dev": true, + "license": "MIT" + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -3591,9 +3671,9 @@ } }, "node_modules/resolve-import": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/resolve-import/-/resolve-import-2.1.1.tgz", - "integrity": "sha512-pgTo41KMWjSZNNA4Ptgs+AtB+/w+a2/MDm6VzZiEnt2op2rXHYK/EYdRYhBsPlGN1naYMogJopBoJxtHgGTHEA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/resolve-import/-/resolve-import-2.4.0.tgz", + "integrity": "sha512-gLWKdA5tiv5j/D7ipR47u3ovbVfzFPrctTdw2Ulnpmr6PPVVSvPKGNWu09jXVNlOSLLAeD6CA13bjIelpWttSw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -3632,9 +3712,9 @@ "license": "ISC" }, "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "dev": true, "license": "MIT", "engines": { @@ -3642,13 +3722,13 @@ } }, "node_modules/rimraf": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.2.tgz", - "integrity": "sha512-cFCkPslJv7BAXJsYlK1dZsbP8/ZNLkCAQ0bi1hf5EKX2QHegmDFEFA6QhuYJlk7UDdc+02JjO80YSOrWPpw06g==", + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.3.tgz", + "integrity": "sha512-LKg+Cr2ZF61fkcaK1UdkH2yEBBKnYjTyWzTJT6KNPcSPaiT7HSdhtMXQuN5wkTX0Xu72KQ1l8S42rlmexS2hSA==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "glob": "^13.0.0", + "glob": "^13.0.3", "package-json-from-dist": "^1.0.1" }, "bin": { @@ -3820,17 +3900,6 @@ "node": ">= 14" } }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, "node_modules/spdx-exceptions": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", @@ -3839,9 +3908,9 @@ "license": "CC-BY-3.0" }, "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", + "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3850,16 +3919,16 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.22", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", - "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", + "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", "dev": true, "license": "CC0-1.0" }, "node_modules/ssri": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-13.0.0.tgz", - "integrity": "sha512-yizwGBpbCn4YomB2lzhZqrHLJoqFGXihNbib3ozhqF/cIp5ue+xSmOQrjNasEE62hFxsCcg/V/z23t4n8jMEng==", + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-13.0.1.tgz", + "integrity": "sha512-QUiRf1+u9wPTL/76GTYlKttDEBWV1ga9ZXW8BG6kfdeyyM8LGPix9gROyg9V2+P0xNyF3X2Go526xKFdMZrHSQ==", "dev": true, "license": "ISC", "dependencies": { @@ -3973,13 +4042,13 @@ } }, "node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -4026,17 +4095,16 @@ } }, "node_modules/sync-content": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/sync-content/-/sync-content-2.0.3.tgz", - "integrity": "sha512-gKE1q9t4qBDkWqJElji6HSM2OBLK6QooA0LjYg5TYJLE7rca95u2/RKpMZ15WfW9Ri3qbFJRfiS0zbSQqvlf4w==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sync-content/-/sync-content-2.0.4.tgz", + "integrity": "sha512-w3ioiBmbaogob33WdLnuwFk+8tpePI58CTWKqtdAgEqc2hfGuSwP02gPETqNX/3PLS5skv5a1wQR0gbaa2W0XQ==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "glob": "^13.0.0", + "glob": "^13.0.1", "mkdirp": "^3.0.1", "path-scurry": "^2.0.0", - "rimraf": "^6.0.0", - "tshy": "^3.1.0" + "rimraf": "^6.0.0" }, "bin": { "sync-content": "dist/esm/bin.mjs" @@ -4049,32 +4117,32 @@ } }, "node_modules/tap": { - "version": "21.5.1", - "resolved": "https://registry.npmjs.org/tap/-/tap-21.5.1.tgz", - "integrity": "sha512-uhS20sTR4Q+/T2ovawxgVLjdsTQuU+xFz9htRwlx5jwkaWiv+1xes/0ZW5IlO+hlQp9iQH3rj30FNRlnN2ZVtw==", + "version": "21.6.2", + "resolved": "https://registry.npmjs.org/tap/-/tap-21.6.2.tgz", + "integrity": "sha512-rEuxX+EVGQ6JOEyRnLQ80fa7v5s8yutpRA11LAjP6t/B6I0/mTWkaW0NfVoX5XDX3z5x9HVEt2dojSrJLcyp9A==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "@tapjs/after": "3.3.1", - "@tapjs/after-each": "4.3.1", - "@tapjs/asserts": "4.3.1", - "@tapjs/before": "4.3.1", - "@tapjs/before-each": "4.3.1", - "@tapjs/chdir": "3.3.1", - "@tapjs/core": "4.4.1", - "@tapjs/filter": "4.3.1", - "@tapjs/fixture": "4.3.1", - "@tapjs/intercept": "4.3.1", - "@tapjs/mock": "4.3.1", - "@tapjs/node-serialize": "4.3.1", - "@tapjs/run": "4.4.1", - "@tapjs/snapshot": "4.3.1", - "@tapjs/spawn": "4.3.1", - "@tapjs/stdin": "4.3.1", - "@tapjs/test": "4.3.1", - "@tapjs/typescript": "3.5.1", - "@tapjs/worker": "4.3.1", - "resolve-import": "^2.1.1" + "@tapjs/after": "3.3.4", + "@tapjs/after-each": "4.3.4", + "@tapjs/asserts": "4.3.4", + "@tapjs/before": "4.3.4", + "@tapjs/before-each": "4.3.4", + "@tapjs/chdir": "3.3.4", + "@tapjs/core": "4.5.2", + "@tapjs/filter": "4.3.4", + "@tapjs/fixture": "4.3.4", + "@tapjs/intercept": "4.3.4", + "@tapjs/mock": "4.4.2", + "@tapjs/node-serialize": "4.3.4", + "@tapjs/run": "4.5.2", + "@tapjs/snapshot": "4.3.4", + "@tapjs/spawn": "4.3.4", + "@tapjs/stdin": "4.3.4", + "@tapjs/test": "4.4.2", + "@tapjs/typescript": "3.5.4", + "@tapjs/worker": "4.3.4", + "resolve-import": "^2.4.0" }, "bin": { "tap": "dist/esm/run.mjs" @@ -4118,9 +4186,9 @@ } }, "node_modules/tar": { - "version": "7.5.7", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.7.tgz", - "integrity": "sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==", + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.9.tgz", + "integrity": "sha512-BTLcK0xsDh2+PUe9F6c2TlRp4zOOBMTkoQHQIWSIzI0R7KG46uEwq4OPk2W7bZcprBMsuaeFsqwYr7pjh6CuHg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -4149,15 +4217,15 @@ } }, "node_modules/test-exclude": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", - "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.2.tgz", + "integrity": "sha512-u9E6A+ZDYdp7a4WnarkXPZOx8Ilz46+kby6p1yZ8zsGTz9gYa6FIS7lj2oezzNKmtdyyJNNmmXDppga5GB7kSw==", "dev": true, "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^10.4.1", - "minimatch": "^9.0.4" + "minimatch": "^10.2.2" }, "engines": { "node": ">=18" @@ -4181,6 +4249,23 @@ "node": ">=12" } }, + "node_modules/test-exclude/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, "node_modules/test-exclude/node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -4227,6 +4312,22 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/test-exclude/node_modules/glob/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/test-exclude/node_modules/jackspeak": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", @@ -4250,22 +4351,6 @@ "dev": true, "license": "ISC" }, - "node_modules/test-exclude/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/test-exclude/node_modules/path-scurry": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", @@ -4347,19 +4432,21 @@ } }, "node_modules/tshy": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/tshy/-/tshy-3.1.3.tgz", - "integrity": "sha512-ZdPC4TpXbSKJDZoRULD8cwv6F1C0t0XK1lPtPWAtWzmMp7b2JL+YcGpmd+pwwP2jHbbOhPebNpGgg2iwmscSAA==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/tshy/-/tshy-3.3.2.tgz", + "integrity": "sha512-vOIXkqMtBWNjKUR/c99+6N50LhWdnKG1xE3+5wf8IPdzxx2lcIFPvbGgFdBBgoTMbdNb8mz06MUm7hY+TFnJcw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { + "@typescript/native-preview": "^7.0.0-dev.20260218.1", "chalk": "^5.6.2", "chokidar": "^4.0.3", "foreground-child": "^4.0.0", + "jsonc-simple-parser": "^3.0.0", "minimatch": "^10.0.3", "mkdirp": "^3.0.1", "polite-json": "^5.0.0", - "resolve-import": "^2.1.1", + "resolve-import": "^2.4.0", "rimraf": "^6.1.2", "sync-content": "^2.0.3", "typescript": "^5.9.3", @@ -4401,9 +4488,9 @@ } }, "node_modules/typedoc": { - "version": "0.28.16", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.28.16.tgz", - "integrity": "sha512-x4xW77QC3i5DUFMBp0qjukOTnr/sSg+oEs86nB3LjDslvAmwe/PUGDWbe3GrIqt59oTqoXK5GRK9tAa0sYMiog==", + "version": "0.28.17", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.28.17.tgz", + "integrity": "sha512-ZkJ2G7mZrbxrKxinTQMjFqsCoYY6a5Luwv2GKbTnBCEgV2ihYm5CflA9JnJAwH0pZWavqfYxmDkFHPt4yx2oDQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -4424,14 +4511,31 @@ "typescript": "5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x" } }, + "node_modules/typedoc/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/typedoc/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, "node_modules/typedoc/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -4462,9 +4566,9 @@ "license": "MIT" }, "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", "dev": true, "license": "MIT" }, @@ -4537,17 +4641,6 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, "node_modules/validate-npm-package-name": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-7.0.2.tgz", @@ -4569,19 +4662,19 @@ } }, "node_modules/which": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz", + "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", "dev": true, "license": "ISC", "dependencies": { - "isexe": "^3.1.1" + "isexe": "^4.0.0" }, "bin": { "node-which": "bin/which.js" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/widest-line": { diff --git a/deps/minimatch/package.json b/deps/minimatch/package.json index e303df7cc58550..d4d13530281b7e 100644 --- a/deps/minimatch/package.json +++ b/deps/minimatch/package.json @@ -2,7 +2,7 @@ "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me)", "name": "minimatch", "description": "a glob matcher in javascript", - "version": "10.1.2", + "version": "10.2.4", "repository": { "type": "git", "url": "git@github.com:isaacs/minimatch" @@ -34,20 +34,20 @@ "presnap": "npm run prepare", "test": "tap", "snap": "tap", - "format": "prettier --write . --log-level warn", + "format": "prettier --write .", "benchmark": "node benchmark/index.js", "typedoc": "typedoc --tsconfig .tshy/esm.json ./src/*.ts", "node-build": "esbuild ./dist/commonjs/index.js --bundle --platform=node --outfile=index.js" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "devDependencies": { - "@types/node": "^24.0.0", + "@types/node": "^25.3.0", "esbuild": "^0.27.3", "mkdirp": "^3.0.1", "prettier": "^3.6.2", - "tap": "^21.1.0", + "tap": "^21.6.2", "tshy": "^3.0.2", "typedoc": "^0.28.5" }, @@ -64,6 +64,6 @@ "type": "module", "module": "./dist/esm/index.js", "dependencies": { - "@isaacs/brace-expansion": "^5.0.1" + "brace-expansion": "^5.0.2" } } diff --git a/deps/nbytes/.release-please-manifest.json b/deps/nbytes/.release-please-manifest.json new file mode 100644 index 00000000000000..c05df9b5541987 --- /dev/null +++ b/deps/nbytes/.release-please-manifest.json @@ -0,0 +1,3 @@ +{ + ".": "0.1.3" +} diff --git a/deps/nbytes/CHANGELOG.md b/deps/nbytes/CHANGELOG.md new file mode 100644 index 00000000000000..067a946eb30cbd --- /dev/null +++ b/deps/nbytes/CHANGELOG.md @@ -0,0 +1,8 @@ +# Changelog + +## [0.1.3](https://github.com/nodejs/nbytes/compare/v0.1.2...v0.1.3) (2026-02-18) + + +### Bug Fixes + +* use arithmetic HexEncode instead of lookups ([#12](https://github.com/nodejs/nbytes/issues/12)) ([8011baf](https://github.com/nodejs/nbytes/commit/8011baff1dfecf48b5feca21cb29b72e3562c919)) diff --git a/deps/nbytes/CMakeLists.txt b/deps/nbytes/CMakeLists.txt index f2efa3c52ba1d1..5ac0e31aaa4fce 100644 --- a/deps/nbytes/CMakeLists.txt +++ b/deps/nbytes/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.28) -project(nbytes) +project(nbytes VERSION 0.1.3) # x-release-please-version set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED True) @@ -40,3 +40,16 @@ install( ARCHIVE COMPONENT nbytes_development INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" ) + +# Configure and install pkg-config file +configure_file( + "${PROJECT_SOURCE_DIR}/nbytes.pc.in" + "${PROJECT_BINARY_DIR}/nbytes.pc" + @ONLY +) + +install( + FILES "${PROJECT_BINARY_DIR}/nbytes.pc" + DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig" + COMPONENT nbytes_development +) diff --git a/deps/nbytes/include/nbytes.h b/deps/nbytes/include/nbytes.h index 525a91735c954a..3a2bcc605bfa58 100644 --- a/deps/nbytes/include/nbytes.h +++ b/deps/nbytes/include/nbytes.h @@ -836,12 +836,12 @@ size_t SearchString(const char *haystack, size_t haystack_length, // ============================================================================ // Version metadata -#define NBYTES_VERSION "0.1.1" +#define NBYTES_VERSION "0.1.3" // x-release-please-version enum { - NBYTES_VERSION_MAJOR = 0, - NBYTES_VERSION_MINOR = 1, - NBYTES_VERSION_REVISION = 1, + NBYTES_VERSION_MAJOR = 0, // x-release-please-major + NBYTES_VERSION_MINOR = 1, // x-release-please-minor + NBYTES_VERSION_REVISION = 3, // x-release-please-patch }; } // namespace nbytes diff --git a/deps/nbytes/nbytes.pc.in b/deps/nbytes/nbytes.pc.in new file mode 100644 index 00000000000000..24119b190e69e6 --- /dev/null +++ b/deps/nbytes/nbytes.pc.in @@ -0,0 +1,10 @@ +prefix=@CMAKE_INSTALL_PREFIX@ +exec_prefix=${prefix} +libdir=@CMAKE_INSTALL_FULL_LIBDIR@ +includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@ + +Name: nbytes +Description: Library of byte handling functions extracted from Node.js core +Version: @PROJECT_VERSION@ +Libs: -L${libdir} -lnbytes +Cflags: -I${includedir} diff --git a/deps/nbytes/release-please-config.json b/deps/nbytes/release-please-config.json new file mode 100644 index 00000000000000..079304597b6d88 --- /dev/null +++ b/deps/nbytes/release-please-config.json @@ -0,0 +1,11 @@ +{ + "packages": { + ".": { + "release-type": "simple", + "extra-files": [ + "CMakeLists.txt", + "include/nbytes.h" + ] + } + } +} diff --git a/deps/nbytes/src/nbytes.cpp b/deps/nbytes/src/nbytes.cpp index a827809adbacd3..09e2665f8c67e4 100644 --- a/deps/nbytes/src/nbytes.cpp +++ b/deps/nbytes/src/nbytes.cpp @@ -157,6 +157,11 @@ const int8_t unhex_table[256] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}; +inline constexpr char nibble(uint8_t x) { + uint8_t add = (x >= 10) ? ('a' - 10) : '0'; + return x + add; +} + size_t HexEncode(const char *src, size_t slen, char *dst, size_t dlen) { // We know how much we'll write, just make sure that there's space. NBYTES_ASSERT_TRUE(dlen >= MultiplyWithOverflowCheck<size_t>(slen, 2u) && @@ -164,10 +169,9 @@ size_t HexEncode(const char *src, size_t slen, char *dst, size_t dlen) { dlen = slen * 2; for (size_t i = 0, k = 0; k < dlen; i += 1, k += 2) { - static const char hex[] = "0123456789abcdef"; uint8_t val = static_cast<uint8_t>(src[i]); - dst[k + 0] = hex[val >> 4]; - dst[k + 1] = hex[val & 15]; + dst[k + 0] = nibble(val >> 4); + dst[k + 1] = nibble(val & 15); } return dlen; diff --git a/deps/ncrypto/ncrypto.cc b/deps/ncrypto/ncrypto.cc index 461819ce0fa732..3e3e8d4720a456 100644 --- a/deps/ncrypto/ncrypto.cc +++ b/deps/ncrypto/ncrypto.cc @@ -777,11 +777,15 @@ bool PrintGeneralName(const BIOPointer& out, const GENERAL_NAME* gen) { // Note that the preferred name syntax (see RFCs 5280 and 1034) with // wildcards is a subset of what we consider "safe", so spec-compliant DNS // names will never need to be escaped. - PrintAltName(out, reinterpret_cast<const char*>(name->data), name->length); + PrintAltName(out, + reinterpret_cast<const char*>(ASN1_STRING_get0_data(name)), + ASN1_STRING_length(name)); } else if (gen->type == GEN_EMAIL) { ASN1_IA5STRING* name = gen->d.rfc822Name; BIO_write(out.get(), "email:", 6); - PrintAltName(out, reinterpret_cast<const char*>(name->data), name->length); + PrintAltName(out, + reinterpret_cast<const char*>(ASN1_STRING_get0_data(name)), + ASN1_STRING_length(name)); } else if (gen->type == GEN_URI) { ASN1_IA5STRING* name = gen->d.uniformResourceIdentifier; BIO_write(out.get(), "URI:", 4); @@ -789,7 +793,9 @@ bool PrintGeneralName(const BIOPointer& out, const GENERAL_NAME* gen) { // with a few exceptions, most notably URIs that contains commas (see // RFC 2396). In other words, most legitimate URIs will not require // escaping. - PrintAltName(out, reinterpret_cast<const char*>(name->data), name->length); + PrintAltName(out, + reinterpret_cast<const char*>(ASN1_STRING_get0_data(name)), + ASN1_STRING_length(name)); } else if (gen->type == GEN_DIRNAME) { // Earlier versions of Node.js used X509_NAME_oneline to print the X509_NAME // object. The format was non standard and should be avoided. The use of @@ -822,17 +828,18 @@ bool PrintGeneralName(const BIOPointer& out, const GENERAL_NAME* gen) { } else if (gen->type == GEN_IPADD) { BIO_printf(out.get(), "IP Address:"); const ASN1_OCTET_STRING* ip = gen->d.ip; - const unsigned char* b = ip->data; - if (ip->length == 4) { + const unsigned char* b = ASN1_STRING_get0_data(ip); + int ip_len = ASN1_STRING_length(ip); + if (ip_len == 4) { BIO_printf(out.get(), "%d.%d.%d.%d", b[0], b[1], b[2], b[3]); - } else if (ip->length == 16) { + } else if (ip_len == 16) { for (unsigned int j = 0; j < 8; j++) { uint16_t pair = (b[2 * j] << 8) | b[2 * j + 1]; BIO_printf(out.get(), (j == 0) ? "%X" : ":%X", pair); } } else { #if OPENSSL_VERSION_MAJOR >= 3 - BIO_printf(out.get(), "<invalid length=%d>", ip->length); + BIO_printf(out.get(), "<invalid length=%d>", ip_len); #else BIO_printf(out.get(), "<invalid>"); #endif @@ -882,15 +889,15 @@ bool PrintGeneralName(const BIOPointer& out, const GENERAL_NAME* gen) { if (unicode) { auto name = gen->d.otherName->value->value.utf8string; PrintAltName(out, - reinterpret_cast<const char*>(name->data), - name->length, + reinterpret_cast<const char*>(ASN1_STRING_get0_data(name)), + ASN1_STRING_length(name), AltNameOption::UTF8, prefix); } else { auto name = gen->d.otherName->value->value.ia5string; PrintAltName(out, - reinterpret_cast<const char*>(name->data), - name->length, + reinterpret_cast<const char*>(ASN1_STRING_get0_data(name)), + ASN1_STRING_length(name), AltNameOption::NONE, prefix); } @@ -911,11 +918,14 @@ bool PrintGeneralName(const BIOPointer& out, const GENERAL_NAME* gen) { } } // namespace -bool SafeX509SubjectAltNamePrint(const BIOPointer& out, X509_EXTENSION* ext) { - auto ret = OBJ_obj2nid(X509_EXTENSION_get_object(ext)); +bool SafeX509SubjectAltNamePrint(const BIOPointer& out, + const X509_EXTENSION* ext) { + // const_cast needed for OpenSSL < 4.0 which lacks const-correctness + auto* mext = const_cast<X509_EXTENSION*>(ext); + auto ret = OBJ_obj2nid(X509_EXTENSION_get_object(mext)); if (ret != NID_subject_alt_name) return false; - GENERAL_NAMES* names = static_cast<GENERAL_NAMES*>(X509V3_EXT_d2i(ext)); + GENERAL_NAMES* names = static_cast<GENERAL_NAMES*>(X509V3_EXT_d2i(mext)); if (names == nullptr) return false; bool ok = true; @@ -934,12 +944,14 @@ bool SafeX509SubjectAltNamePrint(const BIOPointer& out, X509_EXTENSION* ext) { return ok; } -bool SafeX509InfoAccessPrint(const BIOPointer& out, X509_EXTENSION* ext) { - auto ret = OBJ_obj2nid(X509_EXTENSION_get_object(ext)); +bool SafeX509InfoAccessPrint(const BIOPointer& out, const X509_EXTENSION* ext) { + // const_cast needed for OpenSSL < 4.0 which lacks const-correctness + auto* mext = const_cast<X509_EXTENSION*>(ext); + auto ret = OBJ_obj2nid(X509_EXTENSION_get_object(mext)); if (ret != NID_info_access) return false; AUTHORITY_INFO_ACCESS* descs = - static_cast<AUTHORITY_INFO_ACCESS*>(X509V3_EXT_d2i(ext)); + static_cast<AUTHORITY_INFO_ACCESS*>(X509V3_EXT_d2i(mext)); if (descs == nullptr) return false; bool ok = true; @@ -1083,7 +1095,7 @@ BIOPointer X509View::getValidFrom() const { if (cert_ == nullptr) return {}; BIOPointer bio(BIO_new(BIO_s_mem())); if (!bio) return {}; - ASN1_TIME_print(bio.get(), X509_get_notBefore(cert_)); + ASN1_TIME_print(bio.get(), X509_get0_notBefore(cert_)); return bio; } @@ -1092,7 +1104,7 @@ BIOPointer X509View::getValidTo() const { if (cert_ == nullptr) return {}; BIOPointer bio(BIO_new(BIO_s_mem())); if (!bio) return {}; - ASN1_TIME_print(bio.get(), X509_get_notAfter(cert_)); + ASN1_TIME_print(bio.get(), X509_get0_notAfter(cert_)); return bio; } @@ -1470,6 +1482,7 @@ BIOPointer BIOPointer::NewSecMem() { } BIOPointer BIOPointer::New(const BIO_METHOD* method) { + if (method == nullptr) return {}; return BIOPointer(BIO_new(method)); } @@ -3525,8 +3538,38 @@ bool ECKeyPointer::setPublicKey(const ECPointPointer& pub) { bool ECKeyPointer::setPublicKeyRaw(const BignumPointer& x, const BignumPointer& y) { if (!key_) return false; - return EC_KEY_set_public_key_affine_coordinates( - key_.get(), x.get(), y.get()) == 1; + const EC_GROUP* group = EC_KEY_get0_group(key_.get()); + if (group == nullptr) return false; + + // For curves with cofactor h=1, use EC_POINT_oct2point + + // EC_KEY_set_public_key instead of EC_KEY_set_public_key_affine_coordinates. + // The latter internally calls EC_KEY_check_key() which performs a scalar + // multiplication (n*Q) for order validation — redundant when h=1 since every + // on-curve point already has order n. EC_POINT_oct2point validates the point + // is on the curve, which is sufficient. For curves with h!=1, fall back to + // the full check. + auto cofactor = BignumPointer::New(); + if (!cofactor || !EC_GROUP_get_cofactor(group, cofactor.get(), nullptr) || + !cofactor.isOne()) { + return EC_KEY_set_public_key_affine_coordinates( + key_.get(), x.get(), y.get()) == 1; + } + + // Field element byte length: ceil(degree_bits / 8). + size_t field_len = (EC_GROUP_get_degree(group) + 7) / 8; + // Build an uncompressed point: 0x04 || x || y, each padded to field_len. + size_t uncompressed_len = 1 + 2 * field_len; + auto buf = DataPointer::Alloc(uncompressed_len); + if (!buf) return false; + unsigned char* ptr = static_cast<unsigned char*>(buf.get()); + ptr[0] = POINT_CONVERSION_UNCOMPRESSED; + x.encodePaddedInto(ptr + 1, field_len); + y.encodePaddedInto(ptr + 1 + field_len, field_len); + + auto point = ECPointPointer::New(group); + if (!point) return false; + if (!point.setFromBuffer({ptr, uncompressed_len}, group)) return false; + return EC_KEY_set_public_key(key_.get(), point.get()) == 1; } bool ECKeyPointer::setPrivateKey(const BignumPointer& priv) { @@ -4642,12 +4685,12 @@ bool X509Name::Iterator::operator!=(const Iterator& other) const { std::pair<std::string, std::string> X509Name::Iterator::operator*() const { if (loc_ == name_.total_) return {{}, {}}; - X509_NAME_ENTRY* entry = X509_NAME_get_entry(name_, loc_); + const X509_NAME_ENTRY* entry = X509_NAME_get_entry(name_, loc_); if (entry == nullptr) [[unlikely]] return {{}, {}}; - ASN1_OBJECT* name = X509_NAME_ENTRY_get_object(entry); - ASN1_STRING* value = X509_NAME_ENTRY_get_data(entry); + const ASN1_OBJECT* name = X509_NAME_ENTRY_get_object(entry); + const ASN1_STRING* value = X509_NAME_ENTRY_get_data(entry); if (name == nullptr || value == nullptr) [[unlikely]] { return {{}, {}}; diff --git a/deps/ncrypto/ncrypto.h b/deps/ncrypto/ncrypto.h index 70623d740b72e2..4f86702da88267 100644 --- a/deps/ncrypto/ncrypto.h +++ b/deps/ncrypto/ncrypto.h @@ -1582,8 +1582,9 @@ int NoPasswordCallback(char* buf, int size, int rwflag, void* u); int PasswordCallback(char* buf, int size, int rwflag, void* u); -bool SafeX509SubjectAltNamePrint(const BIOPointer& out, X509_EXTENSION* ext); -bool SafeX509InfoAccessPrint(const BIOPointer& out, X509_EXTENSION* ext); +bool SafeX509SubjectAltNamePrint(const BIOPointer& out, + const X509_EXTENSION* ext); +bool SafeX509InfoAccessPrint(const BIOPointer& out, const X509_EXTENSION* ext); // ============================================================================ // SPKAC diff --git a/deps/npm/docs/content/commands/npm-audit.md b/deps/npm/docs/content/commands/npm-audit.md index f7d4e06718c96f..e0b80373ad181b 100644 --- a/deps/npm/docs/content/commands/npm-audit.md +++ b/deps/npm/docs/content/commands/npm-audit.md @@ -44,6 +44,16 @@ The `audit signatures` command will also verify the provenance attestations of d Because provenance attestations are such a new feature, security features may be added to (or changed in) the attestation format over time. To ensure that you're always able to verify attestation signatures check that you're running the latest version of the npm CLI. Please note this often means updating npm beyond the version that ships with Node.js. +To include the full sigstore attestation bundles in JSON output, use: + +```bash +$ npm audit signatures --json --include-attestations +``` + +This adds a `verified` array to the JSON output containing the attestation +bundles (DSSE envelopes, verification material, and transparency log entries) +for each verified package. + The npm CLI supports registry signatures and signing keys provided by any registry if the following conventions are followed: 1. Signatures are provided in the package's `packument` in each published version within the `dist` object: @@ -357,6 +367,18 @@ run any pre- or post-scripts. +#### `include-attestations` + +* Default: false +* Type: Boolean + +When used with `npm audit signatures --json`, includes the full sigstore +attestation bundles in the JSON output for each verified package. The +bundles contain DSSE envelopes, verification material, and transparency log +entries. + + + #### `workspace` * Default: diff --git a/deps/npm/docs/content/commands/npm-install-test.md b/deps/npm/docs/content/commands/npm-install-test.md index d576d335a66481..8291409edfb835 100644 --- a/deps/npm/docs/content/commands/npm-install-test.md +++ b/deps/npm/docs/content/commands/npm-install-test.md @@ -281,6 +281,8 @@ of a relative number of days. This config cannot be used with: `before` +This value is not exported to the environment for child processes. + #### `bin-links` * Default: true diff --git a/deps/npm/docs/content/commands/npm-install.md b/deps/npm/docs/content/commands/npm-install.md index 34c5ee6b1878da..77a34667725c3f 100644 --- a/deps/npm/docs/content/commands/npm-install.md +++ b/deps/npm/docs/content/commands/npm-install.md @@ -623,6 +623,8 @@ of a relative number of days. This config cannot be used with: `before` +This value is not exported to the environment for child processes. + #### `bin-links` * Default: true diff --git a/deps/npm/docs/content/commands/npm-ls.md b/deps/npm/docs/content/commands/npm-ls.md index 63db0081de3a24..ddcb05d2c6ae5c 100644 --- a/deps/npm/docs/content/commands/npm-ls.md +++ b/deps/npm/docs/content/commands/npm-ls.md @@ -23,7 +23,7 @@ Note that nested packages will *also* show the paths to the specified packages. For example, running `npm ls promzard` in npm's source tree will show: ```bash -npm@11.11.0 /path/to/npm +npm@11.12.1 /path/to/npm └─┬ init-package-json@0.0.4 └── promzard@0.1.5 ``` diff --git a/deps/npm/docs/content/commands/npm-outdated.md b/deps/npm/docs/content/commands/npm-outdated.md index b05f8b5a5c0e1b..f635cb90565d2f 100644 --- a/deps/npm/docs/content/commands/npm-outdated.md +++ b/deps/npm/docs/content/commands/npm-outdated.md @@ -182,6 +182,8 @@ of a relative number of days. This config cannot be used with: `before` +This value is not exported to the environment for child processes. + ### See Also * [package spec](/using-npm/package-spec) diff --git a/deps/npm/docs/content/commands/npm-publish.md b/deps/npm/docs/content/commands/npm-publish.md index 95429d0bdc7518..c69e187429eabb 100644 --- a/deps/npm/docs/content/commands/npm-publish.md +++ b/deps/npm/docs/content/commands/npm-publish.md @@ -54,6 +54,8 @@ A `package` is interpreted the same way as other commands (like `npm install`) a * f) a `<name>` that has a "latest" tag satisfying (e) * g) a `<git remote url>` that resolves to (a) +If either (a) or (b) is specified as a relative path, it should begin with an explicit `./` prefix. + The publish will fail if the package name and version combination already exists in the specified registry. Once a package is published with a given name and version, that specific name and version combination can never be used again, even if it is removed with [`npm unpublish`](/commands/npm-unpublish). diff --git a/deps/npm/docs/content/commands/npm-trust.md b/deps/npm/docs/content/commands/npm-trust.md index cdd00c26851b01..e780330db878de 100644 --- a/deps/npm/docs/content/commands/npm-trust.md +++ b/deps/npm/docs/content/commands/npm-trust.md @@ -6,10 +6,6 @@ description: Manage trusted publishing relationships between packages and CI/CD ### Synopsis -```bash -npm trust -``` - Note: This command is unaware of workspaces. ### Prerequisites diff --git a/deps/npm/docs/content/commands/npm-update.md b/deps/npm/docs/content/commands/npm-update.md index 2011a1e235b2c5..60cb3c9ada4c2c 100644 --- a/deps/npm/docs/content/commands/npm-update.md +++ b/deps/npm/docs/content/commands/npm-update.md @@ -347,6 +347,8 @@ of a relative number of days. This config cannot be used with: `before` +This value is not exported to the environment for child processes. + #### `bin-links` * Default: true diff --git a/deps/npm/docs/content/commands/npm.md b/deps/npm/docs/content/commands/npm.md index e85c05b84902a1..2013ee7f8205f1 100644 --- a/deps/npm/docs/content/commands/npm.md +++ b/deps/npm/docs/content/commands/npm.md @@ -14,7 +14,7 @@ Note: This command is unaware of workspaces. ### Version -11.11.0 +11.12.1 ### Description diff --git a/deps/npm/docs/content/using-npm/config.md b/deps/npm/docs/content/using-npm/config.md index ff897d9f71b02f..96df0ae0058c69 100644 --- a/deps/npm/docs/content/using-npm/config.md +++ b/deps/npm/docs/content/using-npm/config.md @@ -770,6 +770,18 @@ the order in which omit/include are specified on the command-line. +#### `include-attestations` + +* Default: false +* Type: Boolean + +When used with `npm audit signatures --json`, includes the full sigstore +attestation bundles in the JSON output for each verified package. The +bundles contain DSSE envelopes, verification material, and transparency log +entries. + + + #### `include-staged` * Default: false @@ -1086,6 +1098,8 @@ of a relative number of days. This config cannot be used with: `before` +This value is not exported to the environment for child processes. + #### `name` * Default: null diff --git a/deps/npm/docs/content/using-npm/scripts.md b/deps/npm/docs/content/using-npm/scripts.md index df4e1fcc754d38..91de8f22d47f0a 100644 --- a/deps/npm/docs/content/using-npm/scripts.md +++ b/deps/npm/docs/content/using-npm/scripts.md @@ -241,10 +241,6 @@ For more details, see: - [npm v7 release notes](https://github.com/npm/cli/releases/tag/v7.0.0) - [Discussion about script working directory reliability in npm v6 and earlier](https://github.com/npm/npm/issues/12356) -### User - -When npm is run as root, scripts are always run with the effective uid and gid of the working directory owner. - ### Environment Package scripts run in an environment where many pieces of information are made available regarding the setup of npm and the current state of the process. diff --git a/deps/npm/docs/content/using-npm/workspaces.md b/deps/npm/docs/content/using-npm/workspaces.md index 57344341be76c3..09d569748cd23f 100644 --- a/deps/npm/docs/content/using-npm/workspaces.md +++ b/deps/npm/docs/content/using-npm/workspaces.md @@ -88,24 +88,25 @@ npm install abbrev -w a **Adding a workspace as a dependency of another workspace:** -If you want to add workspace **b** as a dependency of workspace **a**, you can use the workspace protocol in the dependency specifier: +The same approach works when adding one workspace as a dependency of another. +If you want to add workspace **b** as a dependency of workspace **a**, run: ``` -npm install b@workspace:* -w a +npm install b -w a ``` -This will add an entry to workspace **a**'s `package.json` like: +npm will detect that **b** is a workspace and automatically symlink it rather +than fetching it from the registry. The resulting entry in workspace **a**'s +`package.json` will use a standard version range: ```json { "dependencies": { - "b": "workspace:*" + "b": "^1.0.0" } } ``` -The `workspace:` protocol tells npm to link to the local workspace rather than fetching from the registry. The `*` version means it will use whatever version is defined in workspace **b**'s `package.json`. - Note: other installing commands such as `uninstall`, `ci`, etc will also respect the provided `workspace` configuration. ### Using workspaces diff --git a/deps/npm/docs/lib/index.js b/deps/npm/docs/lib/index.js index 1056fd4e120fc8..d7a5e83ccf5062 100644 --- a/deps/npm/docs/lib/index.js +++ b/deps/npm/docs/lib/index.js @@ -94,7 +94,7 @@ const getCommandByDoc = (docFile, docExt, commandLoader = defaultCommandLoader) name, workspaces, definitions: name === 'npx' ? {} : resolvedDefs, - usage: usage.map(u => `${usagePrefix} ${u}`.trim()).join('\n'), + usage: usage?.map(u => `${usagePrefix} ${u}`.trim()).join('\n'), } } @@ -104,25 +104,32 @@ const replaceUsage = (src, { path, commandLoader }) => { const replacer = assertPlaceholder(src, path, TAGS.USAGE) const { usage, name, workspaces } = getCommandByDoc(path, DOC_EXT, commandLoader) - const synopsis = ['```bash', usage] + const synopsis = [] - const cmdAliases = Object.keys(aliases).reduce((p, c) => { - if (aliases[c] === name) { - p.push(c) + if (usage) { + synopsis.push('```bash', usage) + + const cmdAliases = Object.keys(aliases).reduce((p, c) => { + if (aliases[c] === name) { + p.push(c) + } + return p + }, []) + + if (cmdAliases.length === 1) { + synopsis.push('', `alias: ${cmdAliases[0]}`) + } else if (cmdAliases.length > 1) { + synopsis.push('', `aliases: ${cmdAliases.join(', ')}`) } - return p - }, []) - if (cmdAliases.length === 1) { - synopsis.push('', `alias: ${cmdAliases[0]}`) - } else if (cmdAliases.length > 1) { - synopsis.push('', `aliases: ${cmdAliases.join(', ')}`) + synopsis.push('```') } - synopsis.push('```') - if (!workspaces) { - synopsis.push('', 'Note: This command is unaware of workspaces.') + if (synopsis.length) { + synopsis.push('') + } + synopsis.push('Note: This command is unaware of workspaces.') } return src.replace(replacer, synopsis.join('\n')) diff --git a/deps/npm/docs/output/commands/npm-access.html b/deps/npm/docs/output/commands/npm-access.html index 703b4b0c59bd55..fc29ba6a871af0 100644 --- a/deps/npm/docs/output/commands/npm-access.html +++ b/deps/npm/docs/output/commands/npm-access.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-access----11110"> +<h1 id="----npm-access----11121"> <span>npm-access</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Set access level on published packages</span> </header> diff --git a/deps/npm/docs/output/commands/npm-adduser.html b/deps/npm/docs/output/commands/npm-adduser.html index 2694392d938b10..b9fb04905a4df5 100644 --- a/deps/npm/docs/output/commands/npm-adduser.html +++ b/deps/npm/docs/output/commands/npm-adduser.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-adduser----11110"> +<h1 id="----npm-adduser----11121"> <span>npm-adduser</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Add a registry user account</span> </header> diff --git a/deps/npm/docs/output/commands/npm-audit.html b/deps/npm/docs/output/commands/npm-audit.html index 424288ea335503..9cd06e991464b3 100644 --- a/deps/npm/docs/output/commands/npm-audit.html +++ b/deps/npm/docs/output/commands/npm-audit.html @@ -186,16 +186,16 @@ <section id="content"> <header class="title"> -<h1 id="----npm-audit----11110"> +<h1 id="----npm-audit----11121"> <span>npm-audit</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Run a security audit</span> </header> <section id="table_of_contents"> <h2 id="table-of-contents">Table of contents</h2> -<div id="_table_of_contents"><ul><li><a href="#synopsis">Synopsis</a></li><li><a href="#description">Description</a></li><li><a href="#package-lock">Package lock</a></li><li><a href="#audit-signatures">Audit Signatures</a></li><li><a href="#audit-endpoints">Audit Endpoints</a></li><ul><li><a href="#bulk-advisory-endpoint">Bulk Advisory Endpoint</a></li><li><a href="#quick-audit-endpoint">Quick Audit Endpoint</a></li><li><a href="#scrubbing">Scrubbing</a></li><li><a href="#calculating-meta-vulnerabilities-and-remediations">Calculating Meta-Vulnerabilities and Remediations</a></li></ul><li><a href="#exit-code">Exit Code</a></li><li><a href="#examples">Examples</a></li><li><a href="#configuration">Configuration</a></li><ul><li><a href="#audit-level"><code>audit-level</code></a></li><li><a href="#dry-run"><code>dry-run</code></a></li><li><a href="#force"><code>force</code></a></li><li><a href="#json"><code>json</code></a></li><li><a href="#package-lock-only"><code>package-lock-only</code></a></li><li><a href="#package-lock2"><code>package-lock</code></a></li><li><a href="#omit"><code>omit</code></a></li><li><a href="#include"><code>include</code></a></li><li><a href="#foreground-scripts"><code>foreground-scripts</code></a></li><li><a href="#ignore-scripts"><code>ignore-scripts</code></a></li><li><a href="#workspace"><code>workspace</code></a></li><li><a href="#workspaces"><code>workspaces</code></a></li><li><a href="#include-workspace-root"><code>include-workspace-root</code></a></li><li><a href="#install-links"><code>install-links</code></a></li></ul><li><a href="#see-also">See Also</a></li></ul></div> +<div id="_table_of_contents"><ul><li><a href="#synopsis">Synopsis</a></li><li><a href="#description">Description</a></li><li><a href="#package-lock">Package lock</a></li><li><a href="#audit-signatures">Audit Signatures</a></li><li><a href="#audit-endpoints">Audit Endpoints</a></li><ul><li><a href="#bulk-advisory-endpoint">Bulk Advisory Endpoint</a></li><li><a href="#quick-audit-endpoint">Quick Audit Endpoint</a></li><li><a href="#scrubbing">Scrubbing</a></li><li><a href="#calculating-meta-vulnerabilities-and-remediations">Calculating Meta-Vulnerabilities and Remediations</a></li></ul><li><a href="#exit-code">Exit Code</a></li><li><a href="#examples">Examples</a></li><li><a href="#configuration">Configuration</a></li><ul><li><a href="#audit-level"><code>audit-level</code></a></li><li><a href="#dry-run"><code>dry-run</code></a></li><li><a href="#force"><code>force</code></a></li><li><a href="#json"><code>json</code></a></li><li><a href="#package-lock-only"><code>package-lock-only</code></a></li><li><a href="#package-lock2"><code>package-lock</code></a></li><li><a href="#omit"><code>omit</code></a></li><li><a href="#include"><code>include</code></a></li><li><a href="#foreground-scripts"><code>foreground-scripts</code></a></li><li><a href="#ignore-scripts"><code>ignore-scripts</code></a></li><li><a href="#include-attestations"><code>include-attestations</code></a></li><li><a href="#workspace"><code>workspace</code></a></li><li><a href="#workspaces"><code>workspaces</code></a></li><li><a href="#include-workspace-root"><code>include-workspace-root</code></a></li><li><a href="#install-links"><code>install-links</code></a></li></ul><li><a href="#see-also">See Also</a></li></ul></div> </section> <div id="_content"><h3 id="synopsis">Synopsis</h3> @@ -222,6 +222,12 @@ <h3 id="audit-signatures">Audit Signatures</h3> <p>The <code>audit signatures</code> command will also verify the provenance attestations of downloaded packages. Because provenance attestations are such a new feature, security features may be added to (or changed in) the attestation format over time. To ensure that you're always able to verify attestation signatures check that you're running the latest version of the npm CLI. Please note this often means updating npm beyond the version that ships with Node.js.</p> +<p>To include the full sigstore attestation bundles in JSON output, use:</p> +<pre><code class="language-bash">$ npm audit signatures --json --include-attestations +</code></pre> +<p>This adds a <code>verified</code> array to the JSON output containing the attestation +bundles (DSSE envelopes, verification material, and transparency log entries) +for each verified package.</p> <p>The npm CLI supports registry signatures and signing keys provided by any registry if the following conventions are followed:</p> <ol> <li>Signatures are provided in the package's <code>packument</code> in each published version within the <code>dist</code> object:</li> @@ -439,6 +445,15 @@ <h4 id="ignore-scripts"><code>ignore-scripts</code></h4> <code>npm start</code>, <code>npm stop</code>, <code>npm restart</code>, <code>npm test</code>, and <code>npm run</code> will still run their intended script if <code>ignore-scripts</code> is set, but they will <em>not</em> run any pre- or post-scripts.</p> +<h4 id="include-attestations"><code>include-attestations</code></h4> +<ul> +<li>Default: false</li> +<li>Type: Boolean</li> +</ul> +<p>When used with <code>npm audit signatures --json</code>, includes the full sigstore +attestation bundles in the JSON output for each verified package. The +bundles contain DSSE envelopes, verification material, and transparency log +entries.</p> <h4 id="workspace"><code>workspace</code></h4> <ul> <li>Default:</li> diff --git a/deps/npm/docs/output/commands/npm-bugs.html b/deps/npm/docs/output/commands/npm-bugs.html index 511a206d1b055d..2b040aad7a9742 100644 --- a/deps/npm/docs/output/commands/npm-bugs.html +++ b/deps/npm/docs/output/commands/npm-bugs.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-bugs----11110"> +<h1 id="----npm-bugs----11121"> <span>npm-bugs</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Report bugs for a package in a web browser</span> </header> diff --git a/deps/npm/docs/output/commands/npm-cache.html b/deps/npm/docs/output/commands/npm-cache.html index 1e6e9e45c1cc57..59bc15e64b4f78 100644 --- a/deps/npm/docs/output/commands/npm-cache.html +++ b/deps/npm/docs/output/commands/npm-cache.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-cache----11110"> +<h1 id="----npm-cache----11121"> <span>npm-cache</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Manipulates packages cache</span> </header> diff --git a/deps/npm/docs/output/commands/npm-ci.html b/deps/npm/docs/output/commands/npm-ci.html index af7b4c27d41ddd..e713c926853b7a 100644 --- a/deps/npm/docs/output/commands/npm-ci.html +++ b/deps/npm/docs/output/commands/npm-ci.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-ci----11110"> +<h1 id="----npm-ci----11121"> <span>npm-ci</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Clean install a project</span> </header> diff --git a/deps/npm/docs/output/commands/npm-completion.html b/deps/npm/docs/output/commands/npm-completion.html index 50759a5f865c8d..868929c5cf1294 100644 --- a/deps/npm/docs/output/commands/npm-completion.html +++ b/deps/npm/docs/output/commands/npm-completion.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-completion----11110"> +<h1 id="----npm-completion----11121"> <span>npm-completion</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Tab Completion for npm</span> </header> diff --git a/deps/npm/docs/output/commands/npm-config.html b/deps/npm/docs/output/commands/npm-config.html index c54962e9094d67..5f5ace326516ec 100644 --- a/deps/npm/docs/output/commands/npm-config.html +++ b/deps/npm/docs/output/commands/npm-config.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-config----11110"> +<h1 id="----npm-config----11121"> <span>npm-config</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Manage the npm configuration files</span> </header> diff --git a/deps/npm/docs/output/commands/npm-dedupe.html b/deps/npm/docs/output/commands/npm-dedupe.html index f2ef16750b3369..21749194ae31bc 100644 --- a/deps/npm/docs/output/commands/npm-dedupe.html +++ b/deps/npm/docs/output/commands/npm-dedupe.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-dedupe----11110"> +<h1 id="----npm-dedupe----11121"> <span>npm-dedupe</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Reduce duplication in the package tree</span> </header> diff --git a/deps/npm/docs/output/commands/npm-deprecate.html b/deps/npm/docs/output/commands/npm-deprecate.html index 716191ad4afa87..0fb8cadb29d5ba 100644 --- a/deps/npm/docs/output/commands/npm-deprecate.html +++ b/deps/npm/docs/output/commands/npm-deprecate.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-deprecate----11110"> +<h1 id="----npm-deprecate----11121"> <span>npm-deprecate</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Deprecate a version of a package</span> </header> diff --git a/deps/npm/docs/output/commands/npm-diff.html b/deps/npm/docs/output/commands/npm-diff.html index 1c9fada601ef9d..7ed4d107d8ae48 100644 --- a/deps/npm/docs/output/commands/npm-diff.html +++ b/deps/npm/docs/output/commands/npm-diff.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-diff----11110"> +<h1 id="----npm-diff----11121"> <span>npm-diff</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">The registry diff command</span> </header> diff --git a/deps/npm/docs/output/commands/npm-dist-tag.html b/deps/npm/docs/output/commands/npm-dist-tag.html index a12638e23e496c..f4a5b6f8e5ca57 100644 --- a/deps/npm/docs/output/commands/npm-dist-tag.html +++ b/deps/npm/docs/output/commands/npm-dist-tag.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-dist-tag----11110"> +<h1 id="----npm-dist-tag----11121"> <span>npm-dist-tag</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Modify package distribution tags</span> </header> diff --git a/deps/npm/docs/output/commands/npm-docs.html b/deps/npm/docs/output/commands/npm-docs.html index 4db6e52b4f681d..17244edf83a6be 100644 --- a/deps/npm/docs/output/commands/npm-docs.html +++ b/deps/npm/docs/output/commands/npm-docs.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-docs----11110"> +<h1 id="----npm-docs----11121"> <span>npm-docs</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Open documentation for a package in a web browser</span> </header> diff --git a/deps/npm/docs/output/commands/npm-doctor.html b/deps/npm/docs/output/commands/npm-doctor.html index ab8172dcc93055..eda670272c9296 100644 --- a/deps/npm/docs/output/commands/npm-doctor.html +++ b/deps/npm/docs/output/commands/npm-doctor.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-doctor----11110"> +<h1 id="----npm-doctor----11121"> <span>npm-doctor</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Check the health of your npm environment</span> </header> diff --git a/deps/npm/docs/output/commands/npm-edit.html b/deps/npm/docs/output/commands/npm-edit.html index 0f08e1698a91f4..1f3ce25c4b064a 100644 --- a/deps/npm/docs/output/commands/npm-edit.html +++ b/deps/npm/docs/output/commands/npm-edit.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-edit----11110"> +<h1 id="----npm-edit----11121"> <span>npm-edit</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Edit an installed package</span> </header> diff --git a/deps/npm/docs/output/commands/npm-exec.html b/deps/npm/docs/output/commands/npm-exec.html index 44a91638730ee1..4e6c048645c38a 100644 --- a/deps/npm/docs/output/commands/npm-exec.html +++ b/deps/npm/docs/output/commands/npm-exec.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-exec----11110"> +<h1 id="----npm-exec----11121"> <span>npm-exec</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Run a command from a local or remote npm package</span> </header> diff --git a/deps/npm/docs/output/commands/npm-explain.html b/deps/npm/docs/output/commands/npm-explain.html index dde3546884c2c6..6bae2eef58312c 100644 --- a/deps/npm/docs/output/commands/npm-explain.html +++ b/deps/npm/docs/output/commands/npm-explain.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-explain----11110"> +<h1 id="----npm-explain----11121"> <span>npm-explain</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Explain installed packages</span> </header> diff --git a/deps/npm/docs/output/commands/npm-explore.html b/deps/npm/docs/output/commands/npm-explore.html index e636584ffdcbce..554827e26da756 100644 --- a/deps/npm/docs/output/commands/npm-explore.html +++ b/deps/npm/docs/output/commands/npm-explore.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-explore----11110"> +<h1 id="----npm-explore----11121"> <span>npm-explore</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Browse an installed package</span> </header> diff --git a/deps/npm/docs/output/commands/npm-find-dupes.html b/deps/npm/docs/output/commands/npm-find-dupes.html index 0d82625008b36e..808a61c64167c1 100644 --- a/deps/npm/docs/output/commands/npm-find-dupes.html +++ b/deps/npm/docs/output/commands/npm-find-dupes.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-find-dupes----11110"> +<h1 id="----npm-find-dupes----11121"> <span>npm-find-dupes</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Find duplication in the package tree</span> </header> diff --git a/deps/npm/docs/output/commands/npm-fund.html b/deps/npm/docs/output/commands/npm-fund.html index 5fc4fc3eb6a57e..282ceffce8563f 100644 --- a/deps/npm/docs/output/commands/npm-fund.html +++ b/deps/npm/docs/output/commands/npm-fund.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-fund----11110"> +<h1 id="----npm-fund----11121"> <span>npm-fund</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Retrieve funding information</span> </header> diff --git a/deps/npm/docs/output/commands/npm-get.html b/deps/npm/docs/output/commands/npm-get.html index 813ba55be475b2..3a3cf6c4a626b1 100644 --- a/deps/npm/docs/output/commands/npm-get.html +++ b/deps/npm/docs/output/commands/npm-get.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-get----11110"> +<h1 id="----npm-get----11121"> <span>npm-get</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Get a value from the npm configuration</span> </header> diff --git a/deps/npm/docs/output/commands/npm-help-search.html b/deps/npm/docs/output/commands/npm-help-search.html index dccf8d128b3d22..bbfe72d189246a 100644 --- a/deps/npm/docs/output/commands/npm-help-search.html +++ b/deps/npm/docs/output/commands/npm-help-search.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-help-search----11110"> +<h1 id="----npm-help-search----11121"> <span>npm-help-search</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Search npm help documentation</span> </header> diff --git a/deps/npm/docs/output/commands/npm-help.html b/deps/npm/docs/output/commands/npm-help.html index 22f69c8f68d9bf..28af6a41d2c2fe 100644 --- a/deps/npm/docs/output/commands/npm-help.html +++ b/deps/npm/docs/output/commands/npm-help.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-help----11110"> +<h1 id="----npm-help----11121"> <span>npm-help</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Get help on npm</span> </header> diff --git a/deps/npm/docs/output/commands/npm-init.html b/deps/npm/docs/output/commands/npm-init.html index b495f87f83b837..0822f07ef6e0f8 100644 --- a/deps/npm/docs/output/commands/npm-init.html +++ b/deps/npm/docs/output/commands/npm-init.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-init----11110"> +<h1 id="----npm-init----11121"> <span>npm-init</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Create a package.json file</span> </header> diff --git a/deps/npm/docs/output/commands/npm-install-ci-test.html b/deps/npm/docs/output/commands/npm-install-ci-test.html index 2b05373fb8ee8f..ac340b4f0af3fd 100644 --- a/deps/npm/docs/output/commands/npm-install-ci-test.html +++ b/deps/npm/docs/output/commands/npm-install-ci-test.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-install-ci-test----11110"> +<h1 id="----npm-install-ci-test----11121"> <span>npm-install-ci-test</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Install a project with a clean slate and run tests</span> </header> diff --git a/deps/npm/docs/output/commands/npm-install-test.html b/deps/npm/docs/output/commands/npm-install-test.html index 6b7ed9b5531f33..4f3b150a4a1967 100644 --- a/deps/npm/docs/output/commands/npm-install-test.html +++ b/deps/npm/docs/output/commands/npm-install-test.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-install-test----11110"> +<h1 id="----npm-install-test----11121"> <span>npm-install-test</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Install package(s) and run tests</span> </header> @@ -402,6 +402,7 @@ <h4 id="min-release-age"><code>min-release-age</code></h4> <p>This flag is a complement to <code>before</code>, which accepts an exact date instead of a relative number of days.</p> <p>This config cannot be used with: <code>before</code></p> +<p>This value is not exported to the environment for child processes.</p> <h4 id="bin-links"><code>bin-links</code></h4> <ul> <li>Default: true</li> diff --git a/deps/npm/docs/output/commands/npm-install.html b/deps/npm/docs/output/commands/npm-install.html index b0d72b6006cece..af3fd1724aeac1 100644 --- a/deps/npm/docs/output/commands/npm-install.html +++ b/deps/npm/docs/output/commands/npm-install.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-install----11110"> +<h1 id="----npm-install----11121"> <span>npm-install</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Install a package</span> </header> @@ -677,6 +677,7 @@ <h4 id="min-release-age"><code>min-release-age</code></h4> <p>This flag is a complement to <code>before</code>, which accepts an exact date instead of a relative number of days.</p> <p>This config cannot be used with: <code>before</code></p> +<p>This value is not exported to the environment for child processes.</p> <h4 id="bin-links"><code>bin-links</code></h4> <ul> <li>Default: true</li> diff --git a/deps/npm/docs/output/commands/npm-link.html b/deps/npm/docs/output/commands/npm-link.html index 857eff466dab14..dce1cd126c74a0 100644 --- a/deps/npm/docs/output/commands/npm-link.html +++ b/deps/npm/docs/output/commands/npm-link.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-link----11110"> +<h1 id="----npm-link----11121"> <span>npm-link</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Symlink a package folder</span> </header> diff --git a/deps/npm/docs/output/commands/npm-ll.html b/deps/npm/docs/output/commands/npm-ll.html index 02b17bede5dede..324f2fc7574735 100644 --- a/deps/npm/docs/output/commands/npm-ll.html +++ b/deps/npm/docs/output/commands/npm-ll.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-ll----11110"> +<h1 id="----npm-ll----11121"> <span>npm-ll</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">List installed packages</span> </header> diff --git a/deps/npm/docs/output/commands/npm-login.html b/deps/npm/docs/output/commands/npm-login.html index 5e4cdff4ec54b1..3469d2b6432aad 100644 --- a/deps/npm/docs/output/commands/npm-login.html +++ b/deps/npm/docs/output/commands/npm-login.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-login----11110"> +<h1 id="----npm-login----11121"> <span>npm-login</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Login to a registry user account</span> </header> diff --git a/deps/npm/docs/output/commands/npm-logout.html b/deps/npm/docs/output/commands/npm-logout.html index 9dfbc04b73ea03..75200db0db47e3 100644 --- a/deps/npm/docs/output/commands/npm-logout.html +++ b/deps/npm/docs/output/commands/npm-logout.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-logout----11110"> +<h1 id="----npm-logout----11121"> <span>npm-logout</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Log out of the registry</span> </header> diff --git a/deps/npm/docs/output/commands/npm-ls.html b/deps/npm/docs/output/commands/npm-ls.html index 18e2535e780293..8e9edae452abe2 100644 --- a/deps/npm/docs/output/commands/npm-ls.html +++ b/deps/npm/docs/output/commands/npm-ls.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-ls----11110"> +<h1 id="----npm-ls----11121"> <span>npm-ls</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">List installed packages</span> </header> @@ -209,7 +209,7 @@ <h3 id="description">Description</h3> <p>Positional arguments are <code>name@version-range</code> identifiers, which will limit the results to only the paths to the packages named. Note that nested packages will <em>also</em> show the paths to the specified packages. For example, running <code>npm ls promzard</code> in npm's source tree will show:</p> -<pre><code class="language-bash">npm@11.11.0 /path/to/npm +<pre><code class="language-bash">npm@11.12.1 /path/to/npm └─┬ init-package-json@0.0.4 └── promzard@0.1.5 </code></pre> diff --git a/deps/npm/docs/output/commands/npm-org.html b/deps/npm/docs/output/commands/npm-org.html index f12c24ccd08677..22657f36b8727a 100644 --- a/deps/npm/docs/output/commands/npm-org.html +++ b/deps/npm/docs/output/commands/npm-org.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-org----11110"> +<h1 id="----npm-org----11121"> <span>npm-org</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Manage orgs</span> </header> diff --git a/deps/npm/docs/output/commands/npm-outdated.html b/deps/npm/docs/output/commands/npm-outdated.html index 85013138e96410..c19a6b4900927c 100644 --- a/deps/npm/docs/output/commands/npm-outdated.html +++ b/deps/npm/docs/output/commands/npm-outdated.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-outdated----11110"> +<h1 id="----npm-outdated----11121"> <span>npm-outdated</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Check for outdated packages</span> </header> @@ -341,6 +341,7 @@ <h4 id="min-release-age"><code>min-release-age</code></h4> <p>This flag is a complement to <code>before</code>, which accepts an exact date instead of a relative number of days.</p> <p>This config cannot be used with: <code>before</code></p> +<p>This value is not exported to the environment for child processes.</p> <h3 id="see-also">See Also</h3> <ul> <li><a href="../using-npm/package-spec.html">package spec</a></li> diff --git a/deps/npm/docs/output/commands/npm-owner.html b/deps/npm/docs/output/commands/npm-owner.html index 418a012852bbba..7712718fd66615 100644 --- a/deps/npm/docs/output/commands/npm-owner.html +++ b/deps/npm/docs/output/commands/npm-owner.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-owner----11110"> +<h1 id="----npm-owner----11121"> <span>npm-owner</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Manage package owners</span> </header> diff --git a/deps/npm/docs/output/commands/npm-pack.html b/deps/npm/docs/output/commands/npm-pack.html index 9e7bc2495c4953..cdcd15b910c862 100644 --- a/deps/npm/docs/output/commands/npm-pack.html +++ b/deps/npm/docs/output/commands/npm-pack.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-pack----11110"> +<h1 id="----npm-pack----11121"> <span>npm-pack</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Create a tarball from a package</span> </header> diff --git a/deps/npm/docs/output/commands/npm-ping.html b/deps/npm/docs/output/commands/npm-ping.html index 5d4cf7159bd5f5..db7b4741c06ba3 100644 --- a/deps/npm/docs/output/commands/npm-ping.html +++ b/deps/npm/docs/output/commands/npm-ping.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-ping----11110"> +<h1 id="----npm-ping----11121"> <span>npm-ping</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Ping npm registry</span> </header> diff --git a/deps/npm/docs/output/commands/npm-pkg.html b/deps/npm/docs/output/commands/npm-pkg.html index e7f28ef03626a1..13a3549b580c3d 100644 --- a/deps/npm/docs/output/commands/npm-pkg.html +++ b/deps/npm/docs/output/commands/npm-pkg.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-pkg----11110"> +<h1 id="----npm-pkg----11121"> <span>npm-pkg</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Manages your package.json</span> </header> diff --git a/deps/npm/docs/output/commands/npm-prefix.html b/deps/npm/docs/output/commands/npm-prefix.html index a296f1c2e6b4dd..8da182a2e749a7 100644 --- a/deps/npm/docs/output/commands/npm-prefix.html +++ b/deps/npm/docs/output/commands/npm-prefix.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-prefix----11110"> +<h1 id="----npm-prefix----11121"> <span>npm-prefix</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Display prefix</span> </header> diff --git a/deps/npm/docs/output/commands/npm-profile.html b/deps/npm/docs/output/commands/npm-profile.html index c33cc5765687ca..d983bcdc4c2959 100644 --- a/deps/npm/docs/output/commands/npm-profile.html +++ b/deps/npm/docs/output/commands/npm-profile.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-profile----11110"> +<h1 id="----npm-profile----11121"> <span>npm-profile</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Change settings on your registry profile</span> </header> diff --git a/deps/npm/docs/output/commands/npm-prune.html b/deps/npm/docs/output/commands/npm-prune.html index 7294045e9ffe65..ca7b6c433add08 100644 --- a/deps/npm/docs/output/commands/npm-prune.html +++ b/deps/npm/docs/output/commands/npm-prune.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-prune----11110"> +<h1 id="----npm-prune----11121"> <span>npm-prune</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Remove extraneous packages</span> </header> diff --git a/deps/npm/docs/output/commands/npm-publish.html b/deps/npm/docs/output/commands/npm-publish.html index 6aab3b9374a5e2..17dc857fd2badc 100644 --- a/deps/npm/docs/output/commands/npm-publish.html +++ b/deps/npm/docs/output/commands/npm-publish.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-publish----11110"> +<h1 id="----npm-publish----11121"> <span>npm-publish</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Publish a package</span> </header> @@ -228,6 +228,7 @@ <h3 id="examples">Examples</h3> <li>f) a <code><name></code> that has a "latest" tag satisfying (e)</li> <li>g) a <code><git remote url></code> that resolves to (a)</li> </ul> +<p>If either (a) or (b) is specified as a relative path, it should begin with an explicit <code>./</code> prefix.</p> <p>The publish will fail if the package name and version combination already exists in the specified registry.</p> <p>Once a package is published with a given name and version, that specific name and version combination can never be used again, even if it is removed with <a href="../commands/npm-unpublish.html"><code>npm unpublish</code></a>.</p> <p>As of <code>npm@5</code>, both a sha1sum and an integrity field with a sha512sum of the tarball will be submitted to the registry during publication. diff --git a/deps/npm/docs/output/commands/npm-query.html b/deps/npm/docs/output/commands/npm-query.html index 56c1b211099f28..f1a1650a101967 100644 --- a/deps/npm/docs/output/commands/npm-query.html +++ b/deps/npm/docs/output/commands/npm-query.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-query----11110"> +<h1 id="----npm-query----11121"> <span>npm-query</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Dependency selector query</span> </header> diff --git a/deps/npm/docs/output/commands/npm-rebuild.html b/deps/npm/docs/output/commands/npm-rebuild.html index 26d26ffe16f47b..94969d6c331c7f 100644 --- a/deps/npm/docs/output/commands/npm-rebuild.html +++ b/deps/npm/docs/output/commands/npm-rebuild.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-rebuild----11110"> +<h1 id="----npm-rebuild----11121"> <span>npm-rebuild</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Rebuild a package</span> </header> diff --git a/deps/npm/docs/output/commands/npm-repo.html b/deps/npm/docs/output/commands/npm-repo.html index ef019253fa5109..2c1243ef0247c1 100644 --- a/deps/npm/docs/output/commands/npm-repo.html +++ b/deps/npm/docs/output/commands/npm-repo.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-repo----11110"> +<h1 id="----npm-repo----11121"> <span>npm-repo</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Open package repository page in the browser</span> </header> diff --git a/deps/npm/docs/output/commands/npm-restart.html b/deps/npm/docs/output/commands/npm-restart.html index 123e15d48d85b4..776d742edcb859 100644 --- a/deps/npm/docs/output/commands/npm-restart.html +++ b/deps/npm/docs/output/commands/npm-restart.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-restart----11110"> +<h1 id="----npm-restart----11121"> <span>npm-restart</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Restart a package</span> </header> diff --git a/deps/npm/docs/output/commands/npm-root.html b/deps/npm/docs/output/commands/npm-root.html index c87ed80cc733ad..12d8e38c7414d7 100644 --- a/deps/npm/docs/output/commands/npm-root.html +++ b/deps/npm/docs/output/commands/npm-root.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-root----11110"> +<h1 id="----npm-root----11121"> <span>npm-root</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Display npm root</span> </header> diff --git a/deps/npm/docs/output/commands/npm-run.html b/deps/npm/docs/output/commands/npm-run.html index 363590f8443e2d..ea63a7e17bb527 100644 --- a/deps/npm/docs/output/commands/npm-run.html +++ b/deps/npm/docs/output/commands/npm-run.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-run----11110"> +<h1 id="----npm-run----11121"> <span>npm-run</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Run arbitrary package scripts</span> </header> diff --git a/deps/npm/docs/output/commands/npm-sbom.html b/deps/npm/docs/output/commands/npm-sbom.html index 66cfa902200837..d656ee241b6a7b 100644 --- a/deps/npm/docs/output/commands/npm-sbom.html +++ b/deps/npm/docs/output/commands/npm-sbom.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-sbom----11110"> +<h1 id="----npm-sbom----11121"> <span>npm-sbom</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Generate a Software Bill of Materials (SBOM)</span> </header> diff --git a/deps/npm/docs/output/commands/npm-search.html b/deps/npm/docs/output/commands/npm-search.html index 17af8e24ab6979..94f58f495a6629 100644 --- a/deps/npm/docs/output/commands/npm-search.html +++ b/deps/npm/docs/output/commands/npm-search.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-search----11110"> +<h1 id="----npm-search----11121"> <span>npm-search</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Search for packages</span> </header> diff --git a/deps/npm/docs/output/commands/npm-set.html b/deps/npm/docs/output/commands/npm-set.html index c106498372d977..363a444be92aa1 100644 --- a/deps/npm/docs/output/commands/npm-set.html +++ b/deps/npm/docs/output/commands/npm-set.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-set----11110"> +<h1 id="----npm-set----11121"> <span>npm-set</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Set a value in the npm configuration</span> </header> diff --git a/deps/npm/docs/output/commands/npm-shrinkwrap.html b/deps/npm/docs/output/commands/npm-shrinkwrap.html index 2c9592acf95945..f5cbb0c34edc42 100644 --- a/deps/npm/docs/output/commands/npm-shrinkwrap.html +++ b/deps/npm/docs/output/commands/npm-shrinkwrap.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-shrinkwrap----11110"> +<h1 id="----npm-shrinkwrap----11121"> <span>npm-shrinkwrap</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Lock down dependency versions for publication</span> </header> diff --git a/deps/npm/docs/output/commands/npm-star.html b/deps/npm/docs/output/commands/npm-star.html index b922de136847bb..3533e05441276f 100644 --- a/deps/npm/docs/output/commands/npm-star.html +++ b/deps/npm/docs/output/commands/npm-star.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-star----11110"> +<h1 id="----npm-star----11121"> <span>npm-star</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Mark your favorite packages</span> </header> diff --git a/deps/npm/docs/output/commands/npm-stars.html b/deps/npm/docs/output/commands/npm-stars.html index b2bcb0584e61f0..0b34ca23a66c80 100644 --- a/deps/npm/docs/output/commands/npm-stars.html +++ b/deps/npm/docs/output/commands/npm-stars.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-stars----11110"> +<h1 id="----npm-stars----11121"> <span>npm-stars</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">View packages marked as favorites</span> </header> diff --git a/deps/npm/docs/output/commands/npm-start.html b/deps/npm/docs/output/commands/npm-start.html index 577e283ca51278..d08c5474a3b97c 100644 --- a/deps/npm/docs/output/commands/npm-start.html +++ b/deps/npm/docs/output/commands/npm-start.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-start----11110"> +<h1 id="----npm-start----11121"> <span>npm-start</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Start a package</span> </header> diff --git a/deps/npm/docs/output/commands/npm-stop.html b/deps/npm/docs/output/commands/npm-stop.html index 2b54db5b7463f3..64b460da80b30e 100644 --- a/deps/npm/docs/output/commands/npm-stop.html +++ b/deps/npm/docs/output/commands/npm-stop.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-stop----11110"> +<h1 id="----npm-stop----11121"> <span>npm-stop</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Stop a package</span> </header> diff --git a/deps/npm/docs/output/commands/npm-team.html b/deps/npm/docs/output/commands/npm-team.html index 3c7eae9e8967bb..4a2891e78f6c68 100644 --- a/deps/npm/docs/output/commands/npm-team.html +++ b/deps/npm/docs/output/commands/npm-team.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-team----11110"> +<h1 id="----npm-team----11121"> <span>npm-team</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Manage organization teams and team memberships</span> </header> diff --git a/deps/npm/docs/output/commands/npm-test.html b/deps/npm/docs/output/commands/npm-test.html index 2bd1be34b98cd1..9a4d40757e343b 100644 --- a/deps/npm/docs/output/commands/npm-test.html +++ b/deps/npm/docs/output/commands/npm-test.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-test----11110"> +<h1 id="----npm-test----11121"> <span>npm-test</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Test a package</span> </header> diff --git a/deps/npm/docs/output/commands/npm-token.html b/deps/npm/docs/output/commands/npm-token.html index 4e1121c7dab2b4..328d7aeb798b6f 100644 --- a/deps/npm/docs/output/commands/npm-token.html +++ b/deps/npm/docs/output/commands/npm-token.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-token----11110"> +<h1 id="----npm-token----11121"> <span>npm-token</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Manage your authentication tokens</span> </header> diff --git a/deps/npm/docs/output/commands/npm-trust.html b/deps/npm/docs/output/commands/npm-trust.html index 777b1b91529baf..7814567feb0a1e 100644 --- a/deps/npm/docs/output/commands/npm-trust.html +++ b/deps/npm/docs/output/commands/npm-trust.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-trust----11110"> +<h1 id="----npm-trust----11121"> <span>npm-trust</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Manage trusted publishing relationships between packages and CI/CD providers</span> </header> @@ -199,8 +199,6 @@ <h2 id="table-of-contents">Table of contents</h2> </section> <div id="_content"><h3 id="synopsis">Synopsis</h3> -<pre><code class="language-bash">npm trust -</code></pre> <p>Note: This command is unaware of workspaces.</p> <h3 id="prerequisites">Prerequisites</h3> <p>Before using npm trust commands, ensure the following requirements are met:</p> diff --git a/deps/npm/docs/output/commands/npm-undeprecate.html b/deps/npm/docs/output/commands/npm-undeprecate.html index 961da2379eee38..f92ff69ee51fb6 100644 --- a/deps/npm/docs/output/commands/npm-undeprecate.html +++ b/deps/npm/docs/output/commands/npm-undeprecate.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-undeprecate----11110"> +<h1 id="----npm-undeprecate----11121"> <span>npm-undeprecate</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Undeprecate a version of a package</span> </header> diff --git a/deps/npm/docs/output/commands/npm-uninstall.html b/deps/npm/docs/output/commands/npm-uninstall.html index 70dff9cfcfb4cc..35e934b77ec199 100644 --- a/deps/npm/docs/output/commands/npm-uninstall.html +++ b/deps/npm/docs/output/commands/npm-uninstall.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-uninstall----11110"> +<h1 id="----npm-uninstall----11121"> <span>npm-uninstall</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Remove a package</span> </header> diff --git a/deps/npm/docs/output/commands/npm-unpublish.html b/deps/npm/docs/output/commands/npm-unpublish.html index b31d1337409445..4091e5c782d264 100644 --- a/deps/npm/docs/output/commands/npm-unpublish.html +++ b/deps/npm/docs/output/commands/npm-unpublish.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-unpublish----11110"> +<h1 id="----npm-unpublish----11121"> <span>npm-unpublish</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Remove a package from the registry</span> </header> diff --git a/deps/npm/docs/output/commands/npm-unstar.html b/deps/npm/docs/output/commands/npm-unstar.html index 2b66840d5d748e..6be57361f2a502 100644 --- a/deps/npm/docs/output/commands/npm-unstar.html +++ b/deps/npm/docs/output/commands/npm-unstar.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-unstar----11110"> +<h1 id="----npm-unstar----11121"> <span>npm-unstar</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Remove an item from your favorite packages</span> </header> diff --git a/deps/npm/docs/output/commands/npm-update.html b/deps/npm/docs/output/commands/npm-update.html index 062f516cdcc1e7..0a30a7356746f8 100644 --- a/deps/npm/docs/output/commands/npm-update.html +++ b/deps/npm/docs/output/commands/npm-update.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-update----11110"> +<h1 id="----npm-update----11121"> <span>npm-update</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Update packages</span> </header> @@ -442,6 +442,7 @@ <h4 id="min-release-age"><code>min-release-age</code></h4> <p>This flag is a complement to <code>before</code>, which accepts an exact date instead of a relative number of days.</p> <p>This config cannot be used with: <code>before</code></p> +<p>This value is not exported to the environment for child processes.</p> <h4 id="bin-links"><code>bin-links</code></h4> <ul> <li>Default: true</li> diff --git a/deps/npm/docs/output/commands/npm-version.html b/deps/npm/docs/output/commands/npm-version.html index afc26227983beb..1d3e9cc5f74fe0 100644 --- a/deps/npm/docs/output/commands/npm-version.html +++ b/deps/npm/docs/output/commands/npm-version.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-version----11110"> +<h1 id="----npm-version----11121"> <span>npm-version</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Bump a package version</span> </header> diff --git a/deps/npm/docs/output/commands/npm-view.html b/deps/npm/docs/output/commands/npm-view.html index 962fb3e917a597..e93a7028ec7667 100644 --- a/deps/npm/docs/output/commands/npm-view.html +++ b/deps/npm/docs/output/commands/npm-view.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-view----11110"> +<h1 id="----npm-view----11121"> <span>npm-view</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">View registry info</span> </header> diff --git a/deps/npm/docs/output/commands/npm-whoami.html b/deps/npm/docs/output/commands/npm-whoami.html index bbe839b749e927..ca4e63f8736443 100644 --- a/deps/npm/docs/output/commands/npm-whoami.html +++ b/deps/npm/docs/output/commands/npm-whoami.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-whoami----11110"> +<h1 id="----npm-whoami----11121"> <span>npm-whoami</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Display npm username</span> </header> diff --git a/deps/npm/docs/output/commands/npm.html b/deps/npm/docs/output/commands/npm.html index f2426536a0a57e..901b9d11514e3f 100644 --- a/deps/npm/docs/output/commands/npm.html +++ b/deps/npm/docs/output/commands/npm.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm----11110"> +<h1 id="----npm----11121"> <span>npm</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">javascript package manager</span> </header> @@ -203,7 +203,7 @@ <h2 id="table-of-contents">Table of contents</h2> </code></pre> <p>Note: This command is unaware of workspaces.</p> <h3 id="version">Version</h3> -<p>11.11.0</p> +<p>11.12.1</p> <h3 id="description">Description</h3> <p>npm is the package manager for the Node JavaScript platform. It puts modules in place so that node can find them, and manages dependency conflicts intelligently.</p> diff --git a/deps/npm/docs/output/commands/npx.html b/deps/npm/docs/output/commands/npx.html index 1d8e36310c207d..00f5702e081fcc 100644 --- a/deps/npm/docs/output/commands/npx.html +++ b/deps/npm/docs/output/commands/npx.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npx----11110"> +<h1 id="----npx----11121"> <span>npx</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Run a command from a local or remote npm package</span> </header> diff --git a/deps/npm/docs/output/configuring-npm/folders.html b/deps/npm/docs/output/configuring-npm/folders.html index 47da8cc4d77d2e..974d42b2c656a9 100644 --- a/deps/npm/docs/output/configuring-npm/folders.html +++ b/deps/npm/docs/output/configuring-npm/folders.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----folders----11110"> +<h1 id="----folders----11121"> <span>Folders</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Folder structures used by npm</span> </header> diff --git a/deps/npm/docs/output/configuring-npm/install.html b/deps/npm/docs/output/configuring-npm/install.html index ff278db8f72ece..0fda7ec593cefa 100644 --- a/deps/npm/docs/output/configuring-npm/install.html +++ b/deps/npm/docs/output/configuring-npm/install.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----install----11110"> +<h1 id="----install----11121"> <span>Install</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Download and install node and npm</span> </header> diff --git a/deps/npm/docs/output/configuring-npm/npm-global.html b/deps/npm/docs/output/configuring-npm/npm-global.html index 47da8cc4d77d2e..974d42b2c656a9 100644 --- a/deps/npm/docs/output/configuring-npm/npm-global.html +++ b/deps/npm/docs/output/configuring-npm/npm-global.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----folders----11110"> +<h1 id="----folders----11121"> <span>Folders</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Folder structures used by npm</span> </header> diff --git a/deps/npm/docs/output/configuring-npm/npm-json.html b/deps/npm/docs/output/configuring-npm/npm-json.html index 5b6c4ae33b70c8..07422781b58f05 100644 --- a/deps/npm/docs/output/configuring-npm/npm-json.html +++ b/deps/npm/docs/output/configuring-npm/npm-json.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----packagejson----11110"> +<h1 id="----packagejson----11121"> <span>package.json</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Specifics of npm's package.json handling</span> </header> diff --git a/deps/npm/docs/output/configuring-npm/npm-shrinkwrap-json.html b/deps/npm/docs/output/configuring-npm/npm-shrinkwrap-json.html index 6576d09f77fbd1..0eea07f189f72c 100644 --- a/deps/npm/docs/output/configuring-npm/npm-shrinkwrap-json.html +++ b/deps/npm/docs/output/configuring-npm/npm-shrinkwrap-json.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npm-shrinkwrapjson----11110"> +<h1 id="----npm-shrinkwrapjson----11121"> <span>npm-shrinkwrap.json</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">A publishable lockfile</span> </header> diff --git a/deps/npm/docs/output/configuring-npm/npmrc.html b/deps/npm/docs/output/configuring-npm/npmrc.html index 34b344f7da087c..1f91d117c07f84 100644 --- a/deps/npm/docs/output/configuring-npm/npmrc.html +++ b/deps/npm/docs/output/configuring-npm/npmrc.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----npmrc----11110"> +<h1 id="----npmrc----11121"> <span>.npmrc</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">The npm config files</span> </header> diff --git a/deps/npm/docs/output/configuring-npm/package-json.html b/deps/npm/docs/output/configuring-npm/package-json.html index 5b6c4ae33b70c8..07422781b58f05 100644 --- a/deps/npm/docs/output/configuring-npm/package-json.html +++ b/deps/npm/docs/output/configuring-npm/package-json.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----packagejson----11110"> +<h1 id="----packagejson----11121"> <span>package.json</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Specifics of npm's package.json handling</span> </header> diff --git a/deps/npm/docs/output/configuring-npm/package-lock-json.html b/deps/npm/docs/output/configuring-npm/package-lock-json.html index 1b6398d7315a41..9eedd77093b0c3 100644 --- a/deps/npm/docs/output/configuring-npm/package-lock-json.html +++ b/deps/npm/docs/output/configuring-npm/package-lock-json.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----package-lockjson----11110"> +<h1 id="----package-lockjson----11121"> <span>package-lock.json</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">A manifestation of the manifest</span> </header> diff --git a/deps/npm/docs/output/using-npm/config.html b/deps/npm/docs/output/using-npm/config.html index c80f9aef29940a..0d0ef99c6b6335 100644 --- a/deps/npm/docs/output/using-npm/config.html +++ b/deps/npm/docs/output/using-npm/config.html @@ -186,16 +186,16 @@ <section id="content"> <header class="title"> -<h1 id="----config----11110"> +<h1 id="----config----11121"> <span>Config</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">About npm configuration</span> </header> <section id="table_of_contents"> <h2 id="table-of-contents">Table of contents</h2> -<div id="_table_of_contents"><ul><li><a href="#description">Description</a></li><ul><li><a href="#command-line-flags">Command Line Flags</a></li><li><a href="#environment-variables">Environment Variables</a></li><li><a href="#npmrc-files">npmrc Files</a></li><li><a href="#default-configs">Default Configs</a></li></ul><li><a href="#shorthands-and-other-cli-niceties">Shorthands and Other CLI Niceties</a></li><li><a href="#config-settings">Config Settings</a></li><ul><li><a href="#auth"><code>_auth</code></a></li><li><a href="#access"><code>access</code></a></li><li><a href="#all"><code>all</code></a></li><li><a href="#allow-git"><code>allow-git</code></a></li><li><a href="#allow-same-version"><code>allow-same-version</code></a></li><li><a href="#audit"><code>audit</code></a></li><li><a href="#audit-level"><code>audit-level</code></a></li><li><a href="#auth-type"><code>auth-type</code></a></li><li><a href="#before"><code>before</code></a></li><li><a href="#bin-links"><code>bin-links</code></a></li><li><a href="#browser"><code>browser</code></a></li><li><a href="#bypass-2fa"><code>bypass-2fa</code></a></li><li><a href="#ca"><code>ca</code></a></li><li><a href="#cache"><code>cache</code></a></li><li><a href="#cafile"><code>cafile</code></a></li><li><a href="#call"><code>call</code></a></li><li><a href="#cidr"><code>cidr</code></a></li><li><a href="#color"><code>color</code></a></li><li><a href="#commit-hooks"><code>commit-hooks</code></a></li><li><a href="#cpu"><code>cpu</code></a></li><li><a href="#depth"><code>depth</code></a></li><li><a href="#description2"><code>description</code></a></li><li><a href="#diff"><code>diff</code></a></li><li><a href="#diff-dst-prefix"><code>diff-dst-prefix</code></a></li><li><a href="#diff-ignore-all-space"><code>diff-ignore-all-space</code></a></li><li><a href="#diff-name-only"><code>diff-name-only</code></a></li><li><a href="#diff-no-prefix"><code>diff-no-prefix</code></a></li><li><a href="#diff-src-prefix"><code>diff-src-prefix</code></a></li><li><a href="#diff-text"><code>diff-text</code></a></li><li><a href="#diff-unified"><code>diff-unified</code></a></li><li><a href="#dry-run"><code>dry-run</code></a></li><li><a href="#editor"><code>editor</code></a></li><li><a href="#engine-strict"><code>engine-strict</code></a></li><li><a href="#expect-result-count"><code>expect-result-count</code></a></li><li><a href="#expect-results"><code>expect-results</code></a></li><li><a href="#expires"><code>expires</code></a></li><li><a href="#fetch-retries"><code>fetch-retries</code></a></li><li><a href="#fetch-retry-factor"><code>fetch-retry-factor</code></a></li><li><a href="#fetch-retry-maxtimeout"><code>fetch-retry-maxtimeout</code></a></li><li><a href="#fetch-retry-mintimeout"><code>fetch-retry-mintimeout</code></a></li><li><a href="#fetch-timeout"><code>fetch-timeout</code></a></li><li><a href="#force"><code>force</code></a></li><li><a href="#foreground-scripts"><code>foreground-scripts</code></a></li><li><a href="#format-package-lock"><code>format-package-lock</code></a></li><li><a href="#fund"><code>fund</code></a></li><li><a href="#git"><code>git</code></a></li><li><a href="#git-tag-version"><code>git-tag-version</code></a></li><li><a href="#global"><code>global</code></a></li><li><a href="#globalconfig"><code>globalconfig</code></a></li><li><a href="#heading"><code>heading</code></a></li><li><a href="#https-proxy"><code>https-proxy</code></a></li><li><a href="#if-present"><code>if-present</code></a></li><li><a href="#ignore-scripts"><code>ignore-scripts</code></a></li><li><a href="#include"><code>include</code></a></li><li><a href="#include-staged"><code>include-staged</code></a></li><li><a href="#include-workspace-root"><code>include-workspace-root</code></a></li><li><a href="#init-author-email"><code>init-author-email</code></a></li><li><a href="#init-author-name"><code>init-author-name</code></a></li><li><a href="#init-author-url"><code>init-author-url</code></a></li><li><a href="#init-license"><code>init-license</code></a></li><li><a href="#init-module"><code>init-module</code></a></li><li><a href="#init-private"><code>init-private</code></a></li><li><a href="#init-type"><code>init-type</code></a></li><li><a href="#init-version"><code>init-version</code></a></li><li><a href="#install-links"><code>install-links</code></a></li><li><a href="#install-strategy"><code>install-strategy</code></a></li><li><a href="#json"><code>json</code></a></li><li><a href="#legacy-peer-deps"><code>legacy-peer-deps</code></a></li><li><a href="#libc"><code>libc</code></a></li><li><a href="#link"><code>link</code></a></li><li><a href="#local-address"><code>local-address</code></a></li><li><a href="#location"><code>location</code></a></li><li><a href="#lockfile-version"><code>lockfile-version</code></a></li><li><a href="#loglevel"><code>loglevel</code></a></li><li><a href="#logs-dir"><code>logs-dir</code></a></li><li><a href="#logs-max"><code>logs-max</code></a></li><li><a href="#long"><code>long</code></a></li><li><a href="#maxsockets"><code>maxsockets</code></a></li><li><a href="#message"><code>message</code></a></li><li><a href="#min-release-age"><code>min-release-age</code></a></li><li><a href="#name"><code>name</code></a></li><li><a href="#node-gyp"><code>node-gyp</code></a></li><li><a href="#node-options"><code>node-options</code></a></li><li><a href="#noproxy"><code>noproxy</code></a></li><li><a href="#offline"><code>offline</code></a></li><li><a href="#omit"><code>omit</code></a></li><li><a href="#omit-lockfile-registry-resolved"><code>omit-lockfile-registry-resolved</code></a></li><li><a href="#orgs"><code>orgs</code></a></li><li><a href="#orgs-permission"><code>orgs-permission</code></a></li><li><a href="#os"><code>os</code></a></li><li><a href="#otp"><code>otp</code></a></li><li><a href="#pack-destination"><code>pack-destination</code></a></li><li><a href="#package"><code>package</code></a></li><li><a href="#package-lock"><code>package-lock</code></a></li><li><a href="#package-lock-only"><code>package-lock-only</code></a></li><li><a href="#packages"><code>packages</code></a></li><li><a href="#packages-all"><code>packages-all</code></a></li><li><a href="#packages-and-scopes-permission"><code>packages-and-scopes-permission</code></a></li><li><a href="#parseable"><code>parseable</code></a></li><li><a href="#password"><code>password</code></a></li><li><a href="#prefer-dedupe"><code>prefer-dedupe</code></a></li><li><a href="#prefer-offline"><code>prefer-offline</code></a></li><li><a href="#prefer-online"><code>prefer-online</code></a></li><li><a href="#prefix"><code>prefix</code></a></li><li><a href="#preid"><code>preid</code></a></li><li><a href="#progress"><code>progress</code></a></li><li><a href="#provenance"><code>provenance</code></a></li><li><a href="#provenance-file"><code>provenance-file</code></a></li><li><a href="#proxy"><code>proxy</code></a></li><li><a href="#read-only"><code>read-only</code></a></li><li><a href="#rebuild-bundle"><code>rebuild-bundle</code></a></li><li><a href="#registry"><code>registry</code></a></li><li><a href="#replace-registry-host"><code>replace-registry-host</code></a></li><li><a href="#save"><code>save</code></a></li><li><a href="#save-bundle"><code>save-bundle</code></a></li><li><a href="#save-dev"><code>save-dev</code></a></li><li><a href="#save-exact"><code>save-exact</code></a></li><li><a href="#save-optional"><code>save-optional</code></a></li><li><a href="#save-peer"><code>save-peer</code></a></li><li><a href="#save-prefix"><code>save-prefix</code></a></li><li><a href="#save-prod"><code>save-prod</code></a></li><li><a href="#sbom-format"><code>sbom-format</code></a></li><li><a href="#sbom-type"><code>sbom-type</code></a></li><li><a href="#scope"><code>scope</code></a></li><li><a href="#scopes"><code>scopes</code></a></li><li><a href="#script-shell"><code>script-shell</code></a></li><li><a href="#searchexclude"><code>searchexclude</code></a></li><li><a href="#searchlimit"><code>searchlimit</code></a></li><li><a href="#searchopts"><code>searchopts</code></a></li><li><a href="#searchstaleness"><code>searchstaleness</code></a></li><li><a href="#shell"><code>shell</code></a></li><li><a href="#sign-git-commit"><code>sign-git-commit</code></a></li><li><a href="#sign-git-tag"><code>sign-git-tag</code></a></li><li><a href="#strict-peer-deps"><code>strict-peer-deps</code></a></li><li><a href="#strict-ssl"><code>strict-ssl</code></a></li><li><a href="#tag"><code>tag</code></a></li><li><a href="#tag-version-prefix"><code>tag-version-prefix</code></a></li><li><a href="#timing"><code>timing</code></a></li><li><a href="#token-description"><code>token-description</code></a></li><li><a href="#umask"><code>umask</code></a></li><li><a href="#unicode"><code>unicode</code></a></li><li><a href="#update-notifier"><code>update-notifier</code></a></li><li><a href="#usage"><code>usage</code></a></li><li><a href="#user-agent"><code>user-agent</code></a></li><li><a href="#userconfig"><code>userconfig</code></a></li><li><a href="#version"><code>version</code></a></li><li><a href="#versions"><code>versions</code></a></li><li><a href="#viewer"><code>viewer</code></a></li><li><a href="#which"><code>which</code></a></li><li><a href="#workspace"><code>workspace</code></a></li><li><a href="#workspaces"><code>workspaces</code></a></li><li><a href="#workspaces-update"><code>workspaces-update</code></a></li><li><a href="#yes"><code>yes</code></a></li><li><a href="#also"><code>also</code></a></li><li><a href="#cache-max"><code>cache-max</code></a></li><li><a href="#cache-min"><code>cache-min</code></a></li><li><a href="#cert"><code>cert</code></a></li><li><a href="#dev"><code>dev</code></a></li><li><a href="#global-style"><code>global-style</code></a></li><li><a href="#initauthoremail"><code>init.author.email</code></a></li><li><a href="#initauthorname"><code>init.author.name</code></a></li><li><a href="#initauthorurl"><code>init.author.url</code></a></li><li><a href="#initlicense"><code>init.license</code></a></li><li><a href="#initmodule"><code>init.module</code></a></li><li><a href="#initversion"><code>init.version</code></a></li><li><a href="#key"><code>key</code></a></li><li><a href="#legacy-bundling"><code>legacy-bundling</code></a></li><li><a href="#only"><code>only</code></a></li><li><a href="#optional"><code>optional</code></a></li><li><a href="#production"><code>production</code></a></li><li><a href="#shrinkwrap"><code>shrinkwrap</code></a></li></ul><li><a href="#see-also">See also</a></li></ul></div> +<div id="_table_of_contents"><ul><li><a href="#description">Description</a></li><ul><li><a href="#command-line-flags">Command Line Flags</a></li><li><a href="#environment-variables">Environment Variables</a></li><li><a href="#npmrc-files">npmrc Files</a></li><li><a href="#default-configs">Default Configs</a></li></ul><li><a href="#shorthands-and-other-cli-niceties">Shorthands and Other CLI Niceties</a></li><li><a href="#config-settings">Config Settings</a></li><ul><li><a href="#auth"><code>_auth</code></a></li><li><a href="#access"><code>access</code></a></li><li><a href="#all"><code>all</code></a></li><li><a href="#allow-git"><code>allow-git</code></a></li><li><a href="#allow-same-version"><code>allow-same-version</code></a></li><li><a href="#audit"><code>audit</code></a></li><li><a href="#audit-level"><code>audit-level</code></a></li><li><a href="#auth-type"><code>auth-type</code></a></li><li><a href="#before"><code>before</code></a></li><li><a href="#bin-links"><code>bin-links</code></a></li><li><a href="#browser"><code>browser</code></a></li><li><a href="#bypass-2fa"><code>bypass-2fa</code></a></li><li><a href="#ca"><code>ca</code></a></li><li><a href="#cache"><code>cache</code></a></li><li><a href="#cafile"><code>cafile</code></a></li><li><a href="#call"><code>call</code></a></li><li><a href="#cidr"><code>cidr</code></a></li><li><a href="#color"><code>color</code></a></li><li><a href="#commit-hooks"><code>commit-hooks</code></a></li><li><a href="#cpu"><code>cpu</code></a></li><li><a href="#depth"><code>depth</code></a></li><li><a href="#description2"><code>description</code></a></li><li><a href="#diff"><code>diff</code></a></li><li><a href="#diff-dst-prefix"><code>diff-dst-prefix</code></a></li><li><a href="#diff-ignore-all-space"><code>diff-ignore-all-space</code></a></li><li><a href="#diff-name-only"><code>diff-name-only</code></a></li><li><a href="#diff-no-prefix"><code>diff-no-prefix</code></a></li><li><a href="#diff-src-prefix"><code>diff-src-prefix</code></a></li><li><a href="#diff-text"><code>diff-text</code></a></li><li><a href="#diff-unified"><code>diff-unified</code></a></li><li><a href="#dry-run"><code>dry-run</code></a></li><li><a href="#editor"><code>editor</code></a></li><li><a href="#engine-strict"><code>engine-strict</code></a></li><li><a href="#expect-result-count"><code>expect-result-count</code></a></li><li><a href="#expect-results"><code>expect-results</code></a></li><li><a href="#expires"><code>expires</code></a></li><li><a href="#fetch-retries"><code>fetch-retries</code></a></li><li><a href="#fetch-retry-factor"><code>fetch-retry-factor</code></a></li><li><a href="#fetch-retry-maxtimeout"><code>fetch-retry-maxtimeout</code></a></li><li><a href="#fetch-retry-mintimeout"><code>fetch-retry-mintimeout</code></a></li><li><a href="#fetch-timeout"><code>fetch-timeout</code></a></li><li><a href="#force"><code>force</code></a></li><li><a href="#foreground-scripts"><code>foreground-scripts</code></a></li><li><a href="#format-package-lock"><code>format-package-lock</code></a></li><li><a href="#fund"><code>fund</code></a></li><li><a href="#git"><code>git</code></a></li><li><a href="#git-tag-version"><code>git-tag-version</code></a></li><li><a href="#global"><code>global</code></a></li><li><a href="#globalconfig"><code>globalconfig</code></a></li><li><a href="#heading"><code>heading</code></a></li><li><a href="#https-proxy"><code>https-proxy</code></a></li><li><a href="#if-present"><code>if-present</code></a></li><li><a href="#ignore-scripts"><code>ignore-scripts</code></a></li><li><a href="#include"><code>include</code></a></li><li><a href="#include-attestations"><code>include-attestations</code></a></li><li><a href="#include-staged"><code>include-staged</code></a></li><li><a href="#include-workspace-root"><code>include-workspace-root</code></a></li><li><a href="#init-author-email"><code>init-author-email</code></a></li><li><a href="#init-author-name"><code>init-author-name</code></a></li><li><a href="#init-author-url"><code>init-author-url</code></a></li><li><a href="#init-license"><code>init-license</code></a></li><li><a href="#init-module"><code>init-module</code></a></li><li><a href="#init-private"><code>init-private</code></a></li><li><a href="#init-type"><code>init-type</code></a></li><li><a href="#init-version"><code>init-version</code></a></li><li><a href="#install-links"><code>install-links</code></a></li><li><a href="#install-strategy"><code>install-strategy</code></a></li><li><a href="#json"><code>json</code></a></li><li><a href="#legacy-peer-deps"><code>legacy-peer-deps</code></a></li><li><a href="#libc"><code>libc</code></a></li><li><a href="#link"><code>link</code></a></li><li><a href="#local-address"><code>local-address</code></a></li><li><a href="#location"><code>location</code></a></li><li><a href="#lockfile-version"><code>lockfile-version</code></a></li><li><a href="#loglevel"><code>loglevel</code></a></li><li><a href="#logs-dir"><code>logs-dir</code></a></li><li><a href="#logs-max"><code>logs-max</code></a></li><li><a href="#long"><code>long</code></a></li><li><a href="#maxsockets"><code>maxsockets</code></a></li><li><a href="#message"><code>message</code></a></li><li><a href="#min-release-age"><code>min-release-age</code></a></li><li><a href="#name"><code>name</code></a></li><li><a href="#node-gyp"><code>node-gyp</code></a></li><li><a href="#node-options"><code>node-options</code></a></li><li><a href="#noproxy"><code>noproxy</code></a></li><li><a href="#offline"><code>offline</code></a></li><li><a href="#omit"><code>omit</code></a></li><li><a href="#omit-lockfile-registry-resolved"><code>omit-lockfile-registry-resolved</code></a></li><li><a href="#orgs"><code>orgs</code></a></li><li><a href="#orgs-permission"><code>orgs-permission</code></a></li><li><a href="#os"><code>os</code></a></li><li><a href="#otp"><code>otp</code></a></li><li><a href="#pack-destination"><code>pack-destination</code></a></li><li><a href="#package"><code>package</code></a></li><li><a href="#package-lock"><code>package-lock</code></a></li><li><a href="#package-lock-only"><code>package-lock-only</code></a></li><li><a href="#packages"><code>packages</code></a></li><li><a href="#packages-all"><code>packages-all</code></a></li><li><a href="#packages-and-scopes-permission"><code>packages-and-scopes-permission</code></a></li><li><a href="#parseable"><code>parseable</code></a></li><li><a href="#password"><code>password</code></a></li><li><a href="#prefer-dedupe"><code>prefer-dedupe</code></a></li><li><a href="#prefer-offline"><code>prefer-offline</code></a></li><li><a href="#prefer-online"><code>prefer-online</code></a></li><li><a href="#prefix"><code>prefix</code></a></li><li><a href="#preid"><code>preid</code></a></li><li><a href="#progress"><code>progress</code></a></li><li><a href="#provenance"><code>provenance</code></a></li><li><a href="#provenance-file"><code>provenance-file</code></a></li><li><a href="#proxy"><code>proxy</code></a></li><li><a href="#read-only"><code>read-only</code></a></li><li><a href="#rebuild-bundle"><code>rebuild-bundle</code></a></li><li><a href="#registry"><code>registry</code></a></li><li><a href="#replace-registry-host"><code>replace-registry-host</code></a></li><li><a href="#save"><code>save</code></a></li><li><a href="#save-bundle"><code>save-bundle</code></a></li><li><a href="#save-dev"><code>save-dev</code></a></li><li><a href="#save-exact"><code>save-exact</code></a></li><li><a href="#save-optional"><code>save-optional</code></a></li><li><a href="#save-peer"><code>save-peer</code></a></li><li><a href="#save-prefix"><code>save-prefix</code></a></li><li><a href="#save-prod"><code>save-prod</code></a></li><li><a href="#sbom-format"><code>sbom-format</code></a></li><li><a href="#sbom-type"><code>sbom-type</code></a></li><li><a href="#scope"><code>scope</code></a></li><li><a href="#scopes"><code>scopes</code></a></li><li><a href="#script-shell"><code>script-shell</code></a></li><li><a href="#searchexclude"><code>searchexclude</code></a></li><li><a href="#searchlimit"><code>searchlimit</code></a></li><li><a href="#searchopts"><code>searchopts</code></a></li><li><a href="#searchstaleness"><code>searchstaleness</code></a></li><li><a href="#shell"><code>shell</code></a></li><li><a href="#sign-git-commit"><code>sign-git-commit</code></a></li><li><a href="#sign-git-tag"><code>sign-git-tag</code></a></li><li><a href="#strict-peer-deps"><code>strict-peer-deps</code></a></li><li><a href="#strict-ssl"><code>strict-ssl</code></a></li><li><a href="#tag"><code>tag</code></a></li><li><a href="#tag-version-prefix"><code>tag-version-prefix</code></a></li><li><a href="#timing"><code>timing</code></a></li><li><a href="#token-description"><code>token-description</code></a></li><li><a href="#umask"><code>umask</code></a></li><li><a href="#unicode"><code>unicode</code></a></li><li><a href="#update-notifier"><code>update-notifier</code></a></li><li><a href="#usage"><code>usage</code></a></li><li><a href="#user-agent"><code>user-agent</code></a></li><li><a href="#userconfig"><code>userconfig</code></a></li><li><a href="#version"><code>version</code></a></li><li><a href="#versions"><code>versions</code></a></li><li><a href="#viewer"><code>viewer</code></a></li><li><a href="#which"><code>which</code></a></li><li><a href="#workspace"><code>workspace</code></a></li><li><a href="#workspaces"><code>workspaces</code></a></li><li><a href="#workspaces-update"><code>workspaces-update</code></a></li><li><a href="#yes"><code>yes</code></a></li><li><a href="#also"><code>also</code></a></li><li><a href="#cache-max"><code>cache-max</code></a></li><li><a href="#cache-min"><code>cache-min</code></a></li><li><a href="#cert"><code>cert</code></a></li><li><a href="#dev"><code>dev</code></a></li><li><a href="#global-style"><code>global-style</code></a></li><li><a href="#initauthoremail"><code>init.author.email</code></a></li><li><a href="#initauthorname"><code>init.author.name</code></a></li><li><a href="#initauthorurl"><code>init.author.url</code></a></li><li><a href="#initlicense"><code>init.license</code></a></li><li><a href="#initmodule"><code>init.module</code></a></li><li><a href="#initversion"><code>init.version</code></a></li><li><a href="#key"><code>key</code></a></li><li><a href="#legacy-bundling"><code>legacy-bundling</code></a></li><li><a href="#only"><code>only</code></a></li><li><a href="#optional"><code>optional</code></a></li><li><a href="#production"><code>production</code></a></li><li><a href="#shrinkwrap"><code>shrinkwrap</code></a></li></ul><li><a href="#see-also">See also</a></li></ul></div> </section> <div id="_content"><h3 id="description">Description</h3> @@ -756,6 +756,15 @@ <h4 id="include"><code>include</code></h4> <p>This is the inverse of <code>--omit=<type></code>.</p> <p>Dependency types specified in <code>--include</code> will not be omitted, regardless of the order in which omit/include are specified on the command-line.</p> +<h4 id="include-attestations"><code>include-attestations</code></h4> +<ul> +<li>Default: false</li> +<li>Type: Boolean</li> +</ul> +<p>When used with <code>npm audit signatures --json</code>, includes the full sigstore +attestation bundles in the JSON output for each verified package. The +bundles contain DSSE envelopes, verification material, and transparency log +entries.</p> <h4 id="include-staged"><code>include-staged</code></h4> <ul> <li>Default: false</li> @@ -983,6 +992,7 @@ <h4 id="min-release-age"><code>min-release-age</code></h4> <p>This flag is a complement to <code>before</code>, which accepts an exact date instead of a relative number of days.</p> <p>This config cannot be used with: <code>before</code></p> +<p>This value is not exported to the environment for child processes.</p> <h4 id="name"><code>name</code></h4> <ul> <li>Default: null</li> diff --git a/deps/npm/docs/output/using-npm/dependency-selectors.html b/deps/npm/docs/output/using-npm/dependency-selectors.html index d05e6b11d01bce..98647db6cbde4d 100644 --- a/deps/npm/docs/output/using-npm/dependency-selectors.html +++ b/deps/npm/docs/output/using-npm/dependency-selectors.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----dependency-selectors----11110"> +<h1 id="----dependency-selectors----11121"> <span>Dependency Selectors</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Dependency Selector Syntax & Querying</span> </header> diff --git a/deps/npm/docs/output/using-npm/developers.html b/deps/npm/docs/output/using-npm/developers.html index 30cc68a686b84e..017ed86fef451d 100644 --- a/deps/npm/docs/output/using-npm/developers.html +++ b/deps/npm/docs/output/using-npm/developers.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----developers----11110"> +<h1 id="----developers----11121"> <span>Developers</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Developer guide</span> </header> diff --git a/deps/npm/docs/output/using-npm/logging.html b/deps/npm/docs/output/using-npm/logging.html index 1169069dd85831..ba8b0b1132fd83 100644 --- a/deps/npm/docs/output/using-npm/logging.html +++ b/deps/npm/docs/output/using-npm/logging.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----logging----11110"> +<h1 id="----logging----11121"> <span>Logging</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Why, What & How we Log</span> </header> diff --git a/deps/npm/docs/output/using-npm/orgs.html b/deps/npm/docs/output/using-npm/orgs.html index 103db8e1b477ea..b761c39e1d4648 100644 --- a/deps/npm/docs/output/using-npm/orgs.html +++ b/deps/npm/docs/output/using-npm/orgs.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----organizations----11110"> +<h1 id="----organizations----11121"> <span>Organizations</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Working with teams & organizations</span> </header> diff --git a/deps/npm/docs/output/using-npm/package-spec.html b/deps/npm/docs/output/using-npm/package-spec.html index 9ca82242a8fee0..3459ab9906b253 100644 --- a/deps/npm/docs/output/using-npm/package-spec.html +++ b/deps/npm/docs/output/using-npm/package-spec.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----package-spec----11110"> +<h1 id="----package-spec----11121"> <span>Package spec</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Package name specifier</span> </header> diff --git a/deps/npm/docs/output/using-npm/registry.html b/deps/npm/docs/output/using-npm/registry.html index 63d5d7f6c48b43..22a6220ca11145 100644 --- a/deps/npm/docs/output/using-npm/registry.html +++ b/deps/npm/docs/output/using-npm/registry.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----registry----11110"> +<h1 id="----registry----11121"> <span>Registry</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">The JavaScript Package Registry</span> </header> diff --git a/deps/npm/docs/output/using-npm/removal.html b/deps/npm/docs/output/using-npm/removal.html index 330f6bd6467780..0eab4f7bf7b098 100644 --- a/deps/npm/docs/output/using-npm/removal.html +++ b/deps/npm/docs/output/using-npm/removal.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----removal----11110"> +<h1 id="----removal----11121"> <span>Removal</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Cleaning the slate</span> </header> diff --git a/deps/npm/docs/output/using-npm/scope.html b/deps/npm/docs/output/using-npm/scope.html index 59a73ec4c0a501..7083e3a3e03e62 100644 --- a/deps/npm/docs/output/using-npm/scope.html +++ b/deps/npm/docs/output/using-npm/scope.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----scope----11110"> +<h1 id="----scope----11121"> <span>Scope</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Scoped packages</span> </header> diff --git a/deps/npm/docs/output/using-npm/scripts.html b/deps/npm/docs/output/using-npm/scripts.html index 0b8857e3799fb8..710045adf98fa0 100644 --- a/deps/npm/docs/output/using-npm/scripts.html +++ b/deps/npm/docs/output/using-npm/scripts.html @@ -186,16 +186,16 @@ <section id="content"> <header class="title"> -<h1 id="----scripts----11110"> +<h1 id="----scripts----11121"> <span>Scripts</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">How npm handles the "scripts" field</span> </header> <section id="table_of_contents"> <h2 id="table-of-contents">Table of contents</h2> -<div id="_table_of_contents"><ul><li><a href="#description">Description</a></li><li><a href="#pre--post-scripts">Pre & Post Scripts</a></li><li><a href="#life-cycle-scripts">Life Cycle Scripts</a></li><ul><li><a href="#prepare-and-prepublish">Prepare and Prepublish</a></li><li><a href="#dependencies">Dependencies</a></li></ul><li><a href="#life-cycle-operation-order">Life Cycle Operation Order</a></li><ul><li><a href="#npm-cache-add"><a href="../commands/npm-cache.html"><code>npm cache add</code></a></a></li><li><a href="#npm-ci"><a href="../commands/npm-ci.html"><code>npm ci</code></a></a></li><li><a href="#npm-diff"><a href="../commands/npm-diff.html"><code>npm diff</code></a></a></li><li><a href="#npm-install"><a href="../commands/npm-install.html"><code>npm install</code></a></a></li><li><a href="#npm-pack"><a href="../commands/npm-pack.html"><code>npm pack</code></a></a></li><li><a href="#npm-publish"><a href="../commands/npm-publish.html"><code>npm publish</code></a></a></li><li><a href="#npm-rebuild"><a href="../commands/npm-rebuild.html"><code>npm rebuild</code></a></a></li><li><a href="#npm-restart"><a href="../commands/npm-restart.html"><code>npm restart</code></a></a></li><li><a href="#npm-run-user-defined"><a href="../commands/npm-run.html"><code>npm run <user defined></code></a></a></li><li><a href="#npm-start"><a href="../commands/npm-start.html"><code>npm start</code></a></a></li><li><a href="#npm-stop"><a href="../commands/npm-stop.html"><code>npm stop</code></a></a></li><li><a href="#npm-test"><a href="../commands/npm-test.html"><code>npm test</code></a></a></li><li><a href="#npm-version"><a href="../commands/npm-version.html"><code>npm version</code></a></a></li><li><a href="#a-note-on-a-lack-of-npm-uninstall-scripts">A Note on a lack of <a href="../commands/npm-uninstall.html"><code>npm uninstall</code></a> scripts</a></li></ul><li><a href="#working-directory-for-scripts">Working Directory for Scripts</a></li><ul><li><a href="#historical-behavior-in-older-npm-versions">Historical Behavior in Older npm Versions</a></li></ul><li><a href="#user">User</a></li><li><a href="#environment">Environment</a></li><ul><li><a href="#path">path</a></li><li><a href="#packagejson-vars">package.json vars</a></li><li><a href="#current-lifecycle-event">current lifecycle event</a></li></ul><li><a href="#examples">Examples</a></li><li><a href="#exiting">Exiting</a></li><li><a href="#best-practices">Best Practices</a></li><li><a href="#see-also">See Also</a></li></ul></div> +<div id="_table_of_contents"><ul><li><a href="#description">Description</a></li><li><a href="#pre--post-scripts">Pre & Post Scripts</a></li><li><a href="#life-cycle-scripts">Life Cycle Scripts</a></li><ul><li><a href="#prepare-and-prepublish">Prepare and Prepublish</a></li><li><a href="#dependencies">Dependencies</a></li></ul><li><a href="#life-cycle-operation-order">Life Cycle Operation Order</a></li><ul><li><a href="#npm-cache-add"><a href="../commands/npm-cache.html"><code>npm cache add</code></a></a></li><li><a href="#npm-ci"><a href="../commands/npm-ci.html"><code>npm ci</code></a></a></li><li><a href="#npm-diff"><a href="../commands/npm-diff.html"><code>npm diff</code></a></a></li><li><a href="#npm-install"><a href="../commands/npm-install.html"><code>npm install</code></a></a></li><li><a href="#npm-pack"><a href="../commands/npm-pack.html"><code>npm pack</code></a></a></li><li><a href="#npm-publish"><a href="../commands/npm-publish.html"><code>npm publish</code></a></a></li><li><a href="#npm-rebuild"><a href="../commands/npm-rebuild.html"><code>npm rebuild</code></a></a></li><li><a href="#npm-restart"><a href="../commands/npm-restart.html"><code>npm restart</code></a></a></li><li><a href="#npm-run-user-defined"><a href="../commands/npm-run.html"><code>npm run <user defined></code></a></a></li><li><a href="#npm-start"><a href="../commands/npm-start.html"><code>npm start</code></a></a></li><li><a href="#npm-stop"><a href="../commands/npm-stop.html"><code>npm stop</code></a></a></li><li><a href="#npm-test"><a href="../commands/npm-test.html"><code>npm test</code></a></a></li><li><a href="#npm-version"><a href="../commands/npm-version.html"><code>npm version</code></a></a></li><li><a href="#a-note-on-a-lack-of-npm-uninstall-scripts">A Note on a lack of <a href="../commands/npm-uninstall.html"><code>npm uninstall</code></a> scripts</a></li></ul><li><a href="#working-directory-for-scripts">Working Directory for Scripts</a></li><ul><li><a href="#historical-behavior-in-older-npm-versions">Historical Behavior in Older npm Versions</a></li></ul><li><a href="#environment">Environment</a></li><ul><li><a href="#path">path</a></li><li><a href="#packagejson-vars">package.json vars</a></li><li><a href="#current-lifecycle-event">current lifecycle event</a></li></ul><li><a href="#examples">Examples</a></li><li><a href="#exiting">Exiting</a></li><li><a href="#best-practices">Best Practices</a></li><li><a href="#see-also">See Also</a></li></ul></div> </section> <div id="_content"><h3 id="description">Description</h3> @@ -421,8 +421,6 @@ <h4 id="historical-behavior-in-older-npm-versions">Historical Behavior in Older <li><a href="https://github.com/npm/cli/releases/tag/v7.0.0">npm v7 release notes</a></li> <li><a href="https://github.com/npm/npm/issues/12356">Discussion about script working directory reliability in npm v6 and earlier</a></li> </ul> -<h3 id="user">User</h3> -<p>When npm is run as root, scripts are always run with the effective uid and gid of the working directory owner.</p> <h3 id="environment">Environment</h3> <p>Package scripts run in an environment where many pieces of information are made available regarding the setup of npm and the current state of the process.</p> <h4 id="path">path</h4> diff --git a/deps/npm/docs/output/using-npm/workspaces.html b/deps/npm/docs/output/using-npm/workspaces.html index 9b4982f2a0de29..be0ce097c25254 100644 --- a/deps/npm/docs/output/using-npm/workspaces.html +++ b/deps/npm/docs/output/using-npm/workspaces.html @@ -186,9 +186,9 @@ <section id="content"> <header class="title"> -<h1 id="----workspaces----11110"> +<h1 id="----workspaces----11121"> <span>Workspaces</span> - <span class="version">@11.11.0</span> + <span class="version">@11.12.1</span> </h1> <span class="description">Working with workspaces</span> </header> @@ -253,17 +253,19 @@ <h3 id="adding-dependencies-to-a-workspace">Adding dependencies to a workspace</ <pre><code>npm install abbrev -w a </code></pre> <p><strong>Adding a workspace as a dependency of another workspace:</strong></p> -<p>If you want to add workspace <strong>b</strong> as a dependency of workspace <strong>a</strong>, you can use the workspace protocol in the dependency specifier:</p> -<pre><code>npm install b@workspace:* -w a +<p>The same approach works when adding one workspace as a dependency of another. +If you want to add workspace <strong>b</strong> as a dependency of workspace <strong>a</strong>, run:</p> +<pre><code>npm install b -w a </code></pre> -<p>This will add an entry to workspace <strong>a</strong>'s <code>package.json</code> like:</p> +<p>npm will detect that <strong>b</strong> is a workspace and automatically symlink it rather +than fetching it from the registry. The resulting entry in workspace <strong>a</strong>'s +<code>package.json</code> will use a standard version range:</p> <pre><code class="language-json">{ "dependencies": { - "b": "workspace:*" + "b": "^1.0.0" } } </code></pre> -<p>The <code>workspace:</code> protocol tells npm to link to the local workspace rather than fetching from the registry. The <code>*</code> version means it will use whatever version is defined in workspace <strong>b</strong>'s <code>package.json</code>.</p> <p>Note: other installing commands such as <code>uninstall</code>, <code>ci</code>, etc will also respect the provided <code>workspace</code> configuration.</p> <h3 id="using-workspaces">Using workspaces</h3> <p>Given the <a href="https://nodejs.org/dist/latest-v14.x/docs/api/modules.html#modules_all_together">specifics of how Node.js handles module resolution</a> it's possible to consume any defined workspace by its declared <code>package.json</code> <code>name</code>. diff --git a/deps/npm/lib/arborist-cmd.js b/deps/npm/lib/arborist-cmd.js index f0167887b06996..2206b043791631 100644 --- a/deps/npm/lib/arborist-cmd.js +++ b/deps/npm/lib/arborist-cmd.js @@ -1,9 +1,7 @@ const { log } = require('proc-log') const BaseCommand = require('./base-cmd.js') -// This is the base for all commands whose execWorkspaces just gets -// a list of workspace names and passes it on to new Arborist() to -// be able to run a filtered Arborist.reify() at some point. +// This is the base for all commands whose execWorkspaces just gets a list of workspace names and passes it on to new Arborist() to be able to run a filtered Arborist.reify() at some point. class ArboristCmd extends BaseCommand { get isArboristCmd () { return true @@ -25,8 +23,7 @@ class ArboristCmd extends BaseCommand { const { config } = this.npm - // when location isn't set and global isn't true check for a package.json at - // the localPrefix and set the location to project if found + // when location isn't set and global isn't true check for a package.json at the localPrefix and set the location to project if found const locationProject = config.get('location') === 'project' || ( config.isDefault('location') // this is different then `npm.global` which falls back to checking @@ -35,8 +32,7 @@ class ArboristCmd extends BaseCommand { && npm.localPackage ) - // if audit is not set and we are in global mode and location is not project - // and we assume its not a project related context, then we set audit=false + // if audit is not set and we are in global mode and location is not project and we assume its not a project related context, then we set audit=false if (config.isDefault('audit') && (this.npm.global || !locationProject)) { config.set('audit', false) } else if (this.npm.global && config.get('audit')) { diff --git a/deps/npm/lib/base-cmd.js b/deps/npm/lib/base-cmd.js index 8b846316a4b96f..089ec680c74250 100644 --- a/deps/npm/lib/base-cmd.js +++ b/deps/npm/lib/base-cmd.js @@ -17,8 +17,7 @@ class BaseCommand { // Number of expected positional arguments (null = unlimited/unchecked) static positionals = null - // this is a static so that we can read from it without instantiating a command - // which would require loading the config + // this is a static so that we can read from it without instantiating a command which would require loading the config static get describeUsage () { return this.getUsage() } @@ -29,8 +28,7 @@ class BaseCommand { const wrapWidth = 80 const { description, usage = [''], name } = this - // Resolve to a definitions array: if the command has its own definitions, use - // those directly; otherwise resolve params from the global definitions pool. + // Resolve to a definitions array: if the command has its own definitions, use those directly; otherwise resolve params from the global definitions pool. let cmdDefs if (this.definitions) { cmdDefs = this.definitions @@ -45,10 +43,15 @@ class BaseCommand { `${description}`, '', 'Usage:', - ...usage.map(u => `npm ${fullCommandName} ${u}`.trim()), ] + if (usage) { + fullUsage.push(...usage.map(u => `npm ${fullCommandName} ${u}`.trim())) + } if (this.subcommands) { + for (const sub in this.subcommands) { + fullUsage.push(`npm ${fullCommandName} ${sub} ${this.subcommands[sub].usage}`) + } fullUsage.push('') fullUsage.push('Subcommands:') const subcommandEntries = Object.entries(this.subcommands) @@ -392,8 +395,7 @@ class BaseCommand { throw this.usageError(`Unknown flag${unknownFlags.length > 1 ? 's' : ''}: ${flagList}`) } - // Remove warnings for command-specific definitions that npm's global config - // doesn't know about (these were queued as "unknown" during config.load()) + // Remove warnings for command-specific definitions that npm's global config doesn't know about (these were queued as "unknown" during config.load()) for (const def of commandDefinitions) { this.npm.config.removeWarning(def.key) if (def.alias && Array.isArray(def.alias)) { @@ -403,8 +405,7 @@ class BaseCommand { } } - // Remove warnings for unknown positionals that were actually consumed as flag values - // by command-specific definitions (e.g., --id <value> where --id is command-specific) + // Remove warnings for unknown positionals that were actually consumed as flag values by command-specific definitions (e.g., --id <value> where --id is command-specific) const remainsSet = new Set(remains) for (const unknownPos of this.npm.config.getUnknownPositionals()) { if (!remainsSet.has(unknownPos)) { diff --git a/deps/npm/lib/cli/entry.js b/deps/npm/lib/cli/entry.js index a068d22c55cbf1..962c62a5766dae 100644 --- a/deps/npm/lib/cli/entry.js +++ b/deps/npm/lib/cli/entry.js @@ -1,7 +1,6 @@ // Separated out for easier unit testing module.exports = async (process, validateEngines) => { - // set it here so that regardless of what happens later, we don't - // leak any private CLI configs to other programs + // set it here so that regardless of what happens later, we don't leak any private CLI configs to other programs process.title = 'npm' // Patch the global fs module here at the app level @@ -20,11 +19,13 @@ module.exports = async (process, validateEngines) => { log.info('using', 'npm@%s', npm.version) log.info('using', 'node@%s', process.version) - // At this point we've required a few files and can be pretty sure we don't contain invalid syntax for this version of node. It's possible a lazy require would, but that's unlikely enough that it's not worth catching anymore and we attach the more important exit handlers. + // At this point we've required a few files and can be pretty sure we don't contain invalid syntax for this version of node. + // It's possible a lazy require would, but that's unlikely enough that it's not worth catching anymore and we attach the more important exit handlers. validateEngines.off() exitHandler.registerUncaughtHandlers() - // It is now safe to log a warning if they are using a version of node that is not going to fail on syntax errors but is still unsupported and untested and might not work reliably. This is safe to use the logger now which we want since this will show up in the error log too. + // It is now safe to log a warning if they are using a version of node that is not going to fail on syntax errors but is still unsupported and untested and might not work reliably. + // This is safe to use the logger now which we want since this will show up in the error log too. if (!satisfies(validateEngines.node, validateEngines.engines)) { log.warn('cli', validateEngines.unsupportedMessage) } @@ -57,9 +58,8 @@ module.exports = async (process, validateEngines) => { const execPromise = npm.exec(command, args) - // this is async but we don't await it, since its ok if it doesnt - // finish before the command finishes running. it uses command and argv - // so it must be initiated here, after the command name is set + // this is async but we don't await it, since its ok if it doesnt finish before the command finishes running. + // it uses command and argv so it must be initiated here, after the command name is set const updateNotifier = require('./update-notifier.js') // eslint-disable-next-line promise/catch-or-return updateNotifier(npm).then((msg) => (npm.updateNotification = msg)) diff --git a/deps/npm/lib/cli/exit-handler.js b/deps/npm/lib/cli/exit-handler.js index f4fbcd9d834f16..2c95d0d909a371 100644 --- a/deps/npm/lib/cli/exit-handler.js +++ b/deps/npm/lib/cli/exit-handler.js @@ -52,8 +52,7 @@ class ExitHandler { #handleProcessExitAndReset = (code) => { this.#handleProcessExit(code) - // Reset all the state. This is only relevant for tests since - // in reality the process fully exits here. + // Reset all the state. This is only relevant for tests since in reality the process fully exits here. this.#process.off('exit', this.#handleProcessExitAndReset) this.#process.off('uncaughtException', this.#handleExit) this.#process.off('unhandledRejection', this.#handleExit) @@ -115,9 +114,8 @@ class ExitHandler { } #logConsoleError (err) { - // Run our error message formatters on all errors even if we - // have no npm or an unloaded npm. This will clean the error - // and possible return a formatted message about EACCESS or something. + // Run our error message formatters on all errors even if we have no npm or an unloaded npm. + // This will clean the error and possible return a formatted message about EACCESS or something. const { summary, detail } = errorMessage(err, this.#npm) const formatted = [...new Set([...summary, ...detail].flat().filter(Boolean))].join('\n') // If we didn't get anything from the formatted message then just display the full stack @@ -147,9 +145,7 @@ class ExitHandler { return this.#process.exit(this.#process.exitCode || getExitCodeFromError(err) || 1) } - // npm was never loaded but we still might have a config loading error or - // something similar that we can run through the error message formatter - // to give the user a clue as to what happened.s + // npm was never loaded but we still might have a config loading error or something similar that we can run through the error message formatter to give the user a clue as to what happened. if (!this.#loaded) { this.#logConsoleError(new Error('Exit prior to config file resolving', { cause: err })) return this.#process.exit(this.#process.exitCode || getExitCodeFromError(err) || 1) @@ -157,14 +153,12 @@ class ExitHandler { this.#exitErrorMessage = err?.suppressError === true ? false : !!err - // Prefer the exit code of the error, then the current process exit code, - // then set it to 1 if we still have an error. Otherwise, we call process.exit - // with undefined so that it can determine the final exit code + // Prefer the exit code of the error, then the current process exit code, then set it to 1 if we still have an error. + // Otherwise, we call process.exit with undefined so that it can determine the final exit code const exitCode = err?.exitCode ?? this.#process.exitCode ?? (err ? 1 : undefined) - // explicitly call process.exit now so we don't hang on things like the - // update notifier, also flush stdout/err beforehand because process.exit doesn't - // wait for that to happen. + // explicitly call process.exit now so we don't hang on things like the update notifier + // also flush stdout/err beforehand because process.exit doesn't wait for that to happen. this.#process.stderr.write('', () => this.#process.stdout.write('', () => { this.#process.exit(exitCode) })) diff --git a/deps/npm/lib/cli/update-notifier.js b/deps/npm/lib/cli/update-notifier.js index 20a22900268934..893a6f0ccdbe0c 100644 --- a/deps/npm/lib/cli/update-notifier.js +++ b/deps/npm/lib/cli/update-notifier.js @@ -1,6 +1,4 @@ -// print a banner telling the user to upgrade npm to latest -// but not in CI, and not if we're doing that already. -// Check daily for betas, and weekly otherwise. +// print a banner telling the user to upgrade npm to latest but not in CI, and not if we're doing that already. const ciInfo = require('ci-info') const gt = require('semver/functions/gt') @@ -14,11 +12,9 @@ const DAILY = 1000 * 60 * 60 * 24 const WEEKLY = DAILY * 7 // don't put it in the _cacache folder, just in npm's cache -const lastCheckedFile = npm => - resolve(npm.flatOptions.cache, '../_update-notifier-last-checked') +const lastCheckedFile = npm => resolve(npm.flatOptions.cache, '../_update-notifier-last-checked') -// Actual check for updates. This is a separate function so that we only load -// this if we are doing the actual update +// Actual check for updates. This is a separate function so that we only load this if we are doing the actual update const updateCheck = async (npm, spec, version, current) => { const pacote = require('pacote') @@ -36,10 +32,8 @@ const updateCheck = async (npm, spec, version, current) => { const latest = mani.version - // if the current version is *greater* than latest, we're on a 'next' - // and should get the updates from that release train. - // Note that this isn't another http request over the network, because - // the packument will be cached by pacote from previous request. + // if the current version is *greater* than latest, we're on a 'next' and should get the updates from that release train. + // Note that this isn't another http request over the network, because the packument will be cached by pacote from previous request. if (gt(version, latest) && spec === '*') { return updateNotifier(npm, `^${version}`) } @@ -51,9 +45,8 @@ const updateCheck = async (npm, spec, version, current) => { const chalk = npm.logChalk - // ok! notify the user about this update they should get. - // The message is saved for printing at process exit so it will not get - // lost in any other messages being printed as part of the command. + // ok! notify the user about this update they should get. + // The message is saved for printing at process exit so it will not get lost in any other messages being printed as part of the command. const update = parse(mani.version) const type = update.major !== current.major ? 'major' : update.minor !== current.minor ? 'minor' @@ -62,18 +55,20 @@ const updateCheck = async (npm, spec, version, current) => { const typec = type === 'major' ? 'red' : type === 'minor' ? 'yellow' : 'cyan' - const cmd = `npm install -g npm@${latest}` - const message = `\nNew ${chalk[typec](type)} version of npm available! ` + - `${chalk[typec](current)} -> ${chalk.blue(latest)}\n` + - `Changelog: ${chalk.blue(`https://github.com/npm/cli/releases/tag/v${latest}`)}\n` + - `To update run: ${chalk.underline(cmd)}\n` + const message = [ + '', + `New ${chalk[typec](type)} version of npm available! ${chalk[typec](current)} -> ${chalk.blue(latest)}`, + `Changelog: ${chalk.blue(`https://github.com/npm/cli/releases/tag/v${latest}`)}`, + `To update run: ${chalk.underline(`npm install -g npm@${latest}`)}`, + '', + ].join('\n') return message } const updateNotifier = async (npm, spec = '*') => { - // if we're on a prerelease train, then updates are coming fast - // check for a new one daily. otherwise, weekly. + // if we're on a prerelease train, then updates are coming fast check for a new one daily. + // otherwise, weekly. const { version } = npm const current = parse(version) @@ -94,15 +89,15 @@ const updateNotifier = async (npm, spec = '*') => { return null } - // intentional. do not await this. it's a best-effort update. if this - // fails, it's ok. might be using /dev/null as the cache or something weird - // like that. + // intentional. do not await this. it's a best-effort update. + // if this fails, it's ok. + // might be using /dev/null as the cache or something weird like that. writeFile(lastCheckedFile(npm), '').catch(() => {}) return updateCheck(npm, spec, version, current) } -module.exports = npm => { +module.exports = async npm => { if ( // opted out !npm.config.get('update-notifier') @@ -113,7 +108,7 @@ module.exports = npm => { // CI || ciInfo.isCI ) { - return Promise.resolve(null) + return null } return updateNotifier(npm) diff --git a/deps/npm/lib/cli/validate-engines.js b/deps/npm/lib/cli/validate-engines.js index 971cc6bb518676..d9d38157564c9f 100644 --- a/deps/npm/lib/cli/validate-engines.js +++ b/deps/npm/lib/cli/validate-engines.js @@ -1,9 +1,6 @@ -// This is separate to indicate that it should contain code we expect to work in -// all versions of node >= 6. This is a best effort to catch syntax errors to -// give users a good error message if they are using a node version that doesn't -// allow syntax we are using such as private properties, etc. This file is -// linted with ecmaVersion=6 so we don't use invalid syntax, which is set in the -// .eslintrc.local.json file +// This is separate to indicate that it should contain code we expect to work in all versions of node >= 6. +// This is a best effort to catch syntax errors to give users a good error message if they are using a node version that doesn't allow syntax we are using such as private properties, etc. +// This file is linted with ecmaVersion=6 so we don't use invalid syntax, which is set in the .eslintrc.local.json file const { engines: { node: engines }, version } = require('../../package.json') const npm = `v${version}` @@ -15,8 +12,7 @@ module.exports = (process, getCli) => { const brokenMessage = `ERROR: npm ${npm} is known not to run on Node.js ${node}. This version of npm supports the following node versions: \`${engines}\`. You can find the latest version at https://nodejs.org/.` - // coverage ignored because this is only hit in very unsupported node versions - // and it's a best effort attempt to show something nice in those cases + // coverage ignored because this is only hit in very unsupported node versions and it's a best effort attempt to show something nice in those cases /* istanbul ignore next */ const syntaxErrorHandler = (err) => { if (err instanceof SyntaxError) { diff --git a/deps/npm/lib/commands/audit.js b/deps/npm/lib/commands/audit.js index 97d0729da9618d..39e3a599fc37e1 100644 --- a/deps/npm/lib/commands/audit.js +++ b/deps/npm/lib/commands/audit.js @@ -19,6 +19,7 @@ class Audit extends ArboristWorkspaceCmd { 'include', 'foreground-scripts', 'ignore-scripts', + 'include-attestations', ...super.params, ] @@ -36,7 +37,7 @@ class Audit extends ArboristWorkspaceCmd { case 'signatures': return [] default: - throw Object.assign(new Error(argv[2] + ' not recognized'), { + throw Object.assign(new Error(`${argv[2]} not recognized`), { code: 'EUSAGE', }) } diff --git a/deps/npm/lib/commands/cache.js b/deps/npm/lib/commands/cache.js index 580997b66c6f71..e1d1dcad88df6d 100644 --- a/deps/npm/lib/commands/cache.js +++ b/deps/npm/lib/commands/cache.js @@ -131,20 +131,14 @@ class Cache extends BaseCommand { const cachePath = this.npm.flatOptions.cache if (args.length === 0) { if (!this.npm.config.get('force')) { - throw new Error(`As of npm@5, the npm cache self-heals from corruption issues - by treating integrity mismatches as cache misses. As a result, - data extracted from the cache is guaranteed to be valid. If you - want to make sure everything is consistent, use \`npm cache verify\` - instead. Deleting the cache can only make npm go slower, and is - not likely to correct any problems you may be encountering! + throw new Error(`As of npm@5, the npm cache self-heals from corruption issues by treating integrity mismatches as cache misses. +As a result, data extracted from the cache is guaranteed to be valid. +If you want to make sure everything is consistent, use \`npm cache verify\` instead. +Deleting the cache can only make npm go slower, and is not likely to correct any problems you may be encountering! - On the other hand, if you're debugging an issue with the installer, - or race conditions that depend on the timing of writing to an empty - cache, you can use \`npm install --cache /tmp/empty-cache\` to use a - temporary cache instead of nuking the actual one. +On the other hand, if you're debugging an issue with the installer, or race conditions that depend on the timing of writing to an empty cache, you can use \`npm install --cache /tmp/empty-cache\` to use a temporary cache instead of removing the actual one. - If you're sure you want to delete the entire cache, rerun this command - with --force.`) +If you're sure you want to delete the entire cache, rerun this command with --force.`) } return fs.rm(cachePath, { recursive: true, force: true }) } @@ -175,9 +169,7 @@ class Cache extends BaseCommand { await Promise.all(args.map(async spec => { log.silly('cache add', 'spec', spec) - // we ask pacote for the thing, and then just throw the data - // away so that it tee-pipes it into the cache like it does - // for a normal request. + // we ask pacote for the thing, and then just throw the data away so that it tee-pipes it into the cache like it does for a normal request. await pacote.tarball.stream(spec, stream => { stream.resume() return stream.promise() diff --git a/deps/npm/lib/commands/ci.js b/deps/npm/lib/commands/ci.js index 7480e645a4e0d5..f6c97aea30f70a 100644 --- a/deps/npm/lib/commands/ci.js +++ b/deps/npm/lib/commands/ci.js @@ -36,6 +36,8 @@ class CI extends ArboristWorkspaceCmd { }) } + const dryRun = this.npm.config.get('dry-run') + const ignoreScripts = this.npm.config.get('ignore-scripts') const where = this.npm.prefix const Arborist = require('@npmcli/arborist') const opts = { @@ -46,46 +48,42 @@ class CI extends ArboristWorkspaceCmd { workspaces: this.workspaceNames, } - const arb = new Arborist(opts) - await arb.loadVirtual().catch(er => { - log.verbose('loadVirtual', er.stack) + // generate an inventory from the virtual tree in the lockfile + const virtualArb = new Arborist(opts) + try { + await virtualArb.loadVirtual() + } catch (err) { + log.verbose('loadVirtual', err.stack) const msg = 'The `npm ci` command can only install with an existing package-lock.json or\n' + 'npm-shrinkwrap.json with lockfileVersion >= 1. Run an install with npm@5 or\n' + 'later to generate a package-lock.json file, then try again.' throw this.usageError(msg) - }) - - // retrieves inventory of packages from loaded virtual tree (lock file) - const virtualInventory = new Map(arb.virtualTree.inventory) + } + const virtualInventory = new Map(virtualArb.virtualTree.inventory) - // build ideal tree step needs to come right after retrieving the virtual - // inventory since it's going to erase the previous ref to virtualTree + // Now we make our real Arborist. + // We need a new one because the virtual tree fromt the lockfile can have extraneous dependencies in it that won't install on this platform + const arb = new Arborist(opts) await arb.buildIdealTree() - // verifies that the packages from the ideal tree will match - // the same versions that are present in the virtual tree (lock file) - // throws a validation error in case of mismatches + // Verifies that the packages from the ideal tree will match the same versions that are present in the virtual tree (lock file). const errors = validateLockfile(virtualInventory, arb.idealTree.inventory) if (errors.length) { throw this.usageError( - '`npm ci` can only install packages when your package.json and ' + - 'package-lock.json or npm-shrinkwrap.json are in sync. Please ' + - 'update your lock file with `npm install` ' + - 'before continuing.\n\n' + + '`npm ci` can only install packages when your package.json and package-lock.json or npm-shrinkwrap.json are in sync. ' + + 'Please update your lock file with `npm install` before continuing.\n\n' + errors.join('\n') ) } - const dryRun = this.npm.config.get('dry-run') if (!dryRun) { const workspacePaths = await getWorkspaces([], { path: this.npm.localPrefix, includeWorkspaceRoot: true, }) - // Only remove node_modules after we've successfully loaded the virtual - // tree and validated the lockfile + // Only remove node_modules after we've successfully loaded the virtual tree and validated the lockfile await time.start('npm-ci:rm', async () => { return await Promise.all([...workspacePaths.values()].map(async modulePath => { const fullPath = path.join(modulePath, 'node_modules') @@ -100,7 +98,6 @@ class CI extends ArboristWorkspaceCmd { await arb.reify(opts) - const ignoreScripts = this.npm.config.get('ignore-scripts') // run the same set of scripts that `npm install` runs. if (!ignoreScripts) { const scripts = [ diff --git a/deps/npm/lib/commands/completion.js b/deps/npm/lib/commands/completion.js index bfb01b8d08843b..499afcb5c68bcf 100644 --- a/deps/npm/lib/commands/completion.js +++ b/deps/npm/lib/commands/completion.js @@ -1,32 +1,24 @@ -// Each command has a completion function that takes an options object and a cb -// The callback gets called with an error and an array of possible completions. -// The options object is built up based on the environment variables set by -// zsh or bash when calling a function for completion, based on the cursor -// position and the command line thus far. These are: +// Each command has a completion function that takes an options object and a cb The callback gets called with an error and an array of possible completions. +// The options object is built up based on the environment variables set by zsh or bash when calling a function for completion, based on the cursor position and the command line thus far. +// These are: // COMP_CWORD: the index of the "word" in the command line being completed // COMP_LINE: the full command line thus far as a string // COMP_POINT: the cursor index at the point of triggering completion // -// We parse the command line with nopt, like npm does, and then create an -// options object containing: +// We parse the command line with nopt, like npm does, and then create an options object containing: // words: array of words in the command line // w: the index of the word being completed (ie, COMP_CWORD) // word: the word being completed // line: the COMP_LINE // lineLength -// point: the COMP_POINT, usually equal to line length, but not always, eg if -// the user has pressed the left-arrow to complete an earlier word +// point: the COMP_POINT, usually equal to line length, but not always, eg if the user has pressed the left-arrow to complete an earlier word // partialLine: the line up to the point // partialWord: the word being completed (which might be ''), up to the point // conf: a nopt parse of the command line // -// When the implementation completion method returns its list of strings, -// and arrays of strings, we filter that by any that start with the -// partialWord, since only those can possibly be valid matches. +// When the implementation completion method returns its list of strings, and arrays of strings, we filter that by any that start with the partialWord, since only those can possibly be valid matches. // -// Matches are wrapped with ' to escape them, if necessary, and then printed -// one per line for the shell completion method to consume in IFS=$'\n' mode -// as an array. +// Matches are wrapped with ' to escape them, if necessary, and then printed one per line for the shell completion method to consume in IFS=$'\n' mode as an array. const fs = require('node:fs/promises') const nopt = require('nopt') @@ -43,9 +35,7 @@ const fileExists = (file) => fs.stat(file).then(s => s.isFile()).catch(() => fal class Completion extends BaseCommand { static description = 'Tab Completion for npm' static name = 'completion' - // Completion command uses args differently - they represent the command line - // being completed, not actual arguments to this command, so we use an empty - // definitions object to prevent flag validation + // Completion command uses args differently - they represent the command line being completed, not actual arguments to this command, so we use an empty definitions object to prevent flag validation static definitions = [] // completion for the completion command @@ -85,9 +75,7 @@ class Completion extends BaseCommand { return dumpScript(resolve(this.npm.npmRoot, 'lib', 'utils', 'completion.sh')) } - // ok we're actually looking at the envs and outputting the suggestions - // get the partial line and partial word, - // if the point isn't at the end. + // ok we're actually looking at the envs and outputting the suggestions get the partial line and partial word, if the point isn't at the end. // ie, tabbing at: npm foo b|ar const w = +COMP_CWORD const line = COMP_LINE @@ -123,8 +111,7 @@ class Completion extends BaseCommand { raw: args, } - // try to find the npm command and subcommand early for flag completion - // this helps with custom command definitions from subcommands + // try to find the npm command and subcommand early for flag completion this helps with custom command definitions from subcommands const types = Object.entries(definitions).reduce((acc, [key, def]) => { acc[key] = def.type return acc @@ -155,8 +142,7 @@ class Completion extends BaseCommand { Object.keys(parsed).forEach(k => this.npm.config.set(k, parsed[k])) - // at this point, if words[1] is some kind of npm command, - // then complete on it. + // at this point, if words[1] is some kind of npm command, then complete on it. // otherwise, do nothing try { const { completion } = Npm.cmd(cmd) @@ -169,18 +155,11 @@ class Completion extends BaseCommand { } } - // The command should respond with an array. Loop over that, - // wrapping quotes around any that have spaces, and writing - // them to stdout. + // The command should respond with an array. + // Loop over that, wrapping quotes around any that have spaces, and writing them to stdout. // If any of the items are arrays, then join them with a space. - // Ie, returning ['a', 'b c', ['d', 'e']] would allow it to expand - // to: 'a', 'b c', or 'd' 'e' + // e.g. returning ['a', 'b c', ['d', 'e']] would allow it to expand to: 'a', 'b c', or 'd' 'e' wrap (opts, compls) { - // TODO this was dead code, leaving it in case we find some command we - // forgot that requires this. if so *that command should fix its - // completions* - // compls = compls.map(w => !/\s+/.test(w) ? w : '\'' + w + '\'') - if (opts.partialWord) { compls = compls.filter(c => c.startsWith(opts.partialWord)) } @@ -204,14 +183,10 @@ const dumpScript = async (p) => { // Darwin is a pain sometimes. // - // This is necessary because the "source" or "." program in - // bash on OS X closes its file argument before reading - // from it, meaning that you get exactly 1 write, which will - // work most of the time, and will always raise an EPIPE. + // This is necessary because the "source" or "." program in bash on OS X closes its file argument before reading from it, meaning that you get exactly 1 write, which will work most of the time, and will always raise an EPIPE. // - // Really, one should not be tossing away EPIPE errors, or any - // errors, so casually. But, without this, `. <(npm completion)` - // can never ever work on OS X. + // Really, one should not be tossing away EPIPE errors, or any errors, so casually. + // But, without this, `. <(npm completion)` can never ever work on OS X. // TODO Ignoring coverage, see 'non EPIPE errors cause failures' test. /* istanbul ignore next */ if (er.errno === 'EPIPE') { @@ -274,8 +249,8 @@ const getCustomConfigNames = (customDefs) => { return [...names] } -// the current word has a dash. Return the config names, -// with the same number of dashes as the current word has. +// the current word has a dash. +// Return the config names with the same number of dashes as the current word has. const configCompl = (opts, cmd, subCmd, npm) => { const word = opts.word const split = word.match(/^(-+)((?:no-)*)(.*)$/) @@ -330,8 +305,7 @@ const isFlag = (word, cmd, subCmd, npm) => { (Array.isArray(type) && type.includes(Boolean)) } - // No custom definitions found, should not reach here in normal flow - // since configCompl returns empty array when no custom defs exist + // No custom definitions found, should not reach here in normal flow since configCompl returns empty array when no custom defs exist return false } diff --git a/deps/npm/lib/commands/config.js b/deps/npm/lib/commands/config.js index ce26a46b877dab..015850c48304a6 100644 --- a/deps/npm/lib/commands/config.js +++ b/deps/npm/lib/commands/config.js @@ -9,14 +9,11 @@ const { log, output } = require('proc-log') const BaseCommand = require('../base-cmd.js') const { redact } = require('@npmcli/redact') -// These are the config values to swap with "protected". It does not catch -// every single sensitive thing a user may put in the npmrc file but it gets -// the common ones. This is distinct from nerfDarts because that is used to -// validate valid configs during "npm config set", and folks may have old -// invalid entries lying around in a config file that we still want to protect -// when running "npm config list" -// This is a more general list of values to consider protected. You cannot -// "npm config get" them, and they will not display during "npm config list" +// These are the config values to swap with "protected". +// It does not catch every single sensitive thing a user may put in the npmrc file but it gets the common ones. +// This is distinct from nerfDarts because that is used to validate valid configs during "npm config set", and folks may have old invalid entries lying around in a config file that we still want to protect when running "npm config list" +// This is a more general list of values to consider protected. +// You cannot "npm config get" them, and they will not display during "npm config list" const protected = [ 'auth', 'authToken', @@ -27,8 +24,7 @@ const protected = [ 'username', ] -// take an array of `[key, value, k2=v2, k3, v3, ...]` and turn into -// { key: value, k2: v2, k3: v3 } +// take an array of `[key, value, k2=v2, k3, v3, ...]` and turn into { key: value, k2: v2, k3: v3 } const keyValues = args => { const kv = {} for (let i = 0; i < args.length; i++) { diff --git a/deps/npm/lib/commands/dedupe.js b/deps/npm/lib/commands/dedupe.js index 3b7365c2011d3f..a931cabd646043 100644 --- a/deps/npm/lib/commands/dedupe.js +++ b/deps/npm/lib/commands/dedupe.js @@ -36,10 +36,9 @@ class Dedupe extends ArboristWorkspaceCmd { ...this.npm.flatOptions, path: where, dryRun, - // Saving during dedupe would only update if one of your direct - // dependencies was also duplicated somewhere in your tree. It would be - // confusing if running this were to also update your package.json. In - // order to reduce potential confusion we set this to false. + // Saving during dedupe would only update if one of your direct dependencies was also duplicated somewhere in your tree. + // It would be confusing if running this were to also update your package.json. + // In order to reduce potential confusion we set this to false. save: false, workspaces: this.workspaceNames, } diff --git a/deps/npm/lib/commands/diff.js b/deps/npm/lib/commands/diff.js index d104218b3d7efa..ecc0e0aa682675 100644 --- a/deps/npm/lib/commands/diff.js +++ b/deps/npm/lib/commands/diff.js @@ -45,11 +45,7 @@ class Diff extends BaseCommand { this.prefix = this.npm.prefix } - // this is the "top" directory, one up from node_modules - // in global mode we have to walk one up from globalDir because our - // node_modules is sometimes under ./lib, and in global mode we're only ever - // walking through node_modules (because we will have been given a package - // name already) + // this is the "top" directory, one up from node_modules in global mode we have to walk one up from globalDir because our node_modules is sometimes under ./lib, and in global mode we're only ever walking through node_modules (because we will have been given a package name already) if (this.npm.global) { this.top = resolve(this.npm.globalDir, '..') } else { @@ -100,8 +96,7 @@ class Diff extends BaseCommand { return this.findVersionsByPackageName(specs) } - // no arguments, defaults to comparing cwd - // to its latest published registry version + // no arguments, defaults to comparing cwd to its latest published registry version if (!a) { const pkgName = await this.packageName() return [ @@ -110,8 +105,7 @@ class Diff extends BaseCommand { ] } - // single argument, used to compare wanted versions of an - // installed dependency or to compare the cwd to a published version + // single argument, used to compare wanted versions of an installed dependency or to compare the cwd to a published version let noPackageJson let pkgName try { @@ -125,9 +119,7 @@ class Diff extends BaseCommand { const missingPackageJson = this.usageError('Needs multiple arguments to compare or run from a project dir.') - // using a valid semver range, that means it should just diff - // the cwd against a published version to the registry using the - // same project name and the provided semver range + // using a valid semver range, that means it should just diff the cwd against a published version to the registry using the same project name and the provided semver range if (semver.validRange(a)) { if (!pkgName) { throw missingPackageJson @@ -138,9 +130,7 @@ class Diff extends BaseCommand { ] } - // when using a single package name as arg and it's part of the current - // install tree, then retrieve the current installed version and compare - // it against the same value `npm outdated` would suggest you to update to + // when using a single package name as arg and it's part of the current install tree, then retrieve the current installed version and compare it against the same value `npm outdated` would suggest you to update to const spec = npa(a) if (spec.registry) { let actualTree @@ -181,10 +171,9 @@ class Diff extends BaseCommand { const aSpec = `file:${node.realpath}` - // finds what version of the package to compare against, if an exact - // version or tag was passed than it should use that; otherwise, - // work from the top of the arborist tree to find the original semver - // range declared in the package that depends on the package. + // finds what version of the package to compare against + // if an exact version or tag was passed than it should use that + // otherwise, work from the top of the arborist tree to find the original semver range declared in the package that depends on the package. let bSpec if (spec.rawSpec !== '*') { bSpec = spec.rawSpec @@ -193,7 +182,7 @@ class Diff extends BaseCommand { tryRootNodeSpec() || tryAnySpec() - // figure out what to compare against, + // figure out what to compare against // follows same logic to npm outdated "Wanted" results const packument = await pacote.packument(spec, { ...this.npm.flatOptions, @@ -242,8 +231,7 @@ class Diff extends BaseCommand { return [`${pkgName}@${a}`, `${pkgName}@${b}`] } - // otherwise uses the name from the other arg to - // figure out the spec.name of what to compare + // otherwise uses the name from the other arg to figure out the spec.name of what to compare if (!semverA && semverB) { return [a, `${npa(a).name}@${b}`] } diff --git a/deps/npm/lib/commands/dist-tag.js b/deps/npm/lib/commands/dist-tag.js index 655ec0d17539ef..4b51e839d78aa8 100644 --- a/deps/npm/lib/commands/dist-tag.js +++ b/deps/npm/lib/commands/dist-tag.js @@ -49,8 +49,7 @@ class DistTag extends BaseCommand { } if (!pkg) { - // when only using the pkg name the default behavior - // should be listing the existing tags + // when only using the pkg name the default behavior should be listing the existing tags return this.list(cmdName, opts) } else { throw this.usageError() @@ -183,8 +182,7 @@ class DistTag extends BaseCommand { output.standard(`${name}:`) await this.list(npa(name), this.npm.flatOptions) } catch { - // set the exitCode directly, but ignore the error - // since it will have already been logged by this.list() + // set the exitCode directly, but ignore the error since it will have already been logged by this.list() process.exitCode = 1 } } diff --git a/deps/npm/lib/commands/doctor.js b/deps/npm/lib/commands/doctor.js index 0d948da231187b..f01b05bead27ad 100644 --- a/deps/npm/lib/commands/doctor.js +++ b/deps/npm/lib/commands/doctor.js @@ -29,8 +29,7 @@ const maskLabel = mask => { const checks = [ { - // Ping is left in as a legacy command but is listed as "connection" to - // make more sense to more people + // Ping is left in as a legacy command but is listed as "connection" to make more sense to more people groups: ['connection', 'ping', 'registry'], title: 'Connecting to the registry', cmd: 'checkPing', diff --git a/deps/npm/lib/commands/exec.js b/deps/npm/lib/commands/exec.js index c91222ffe3230d..5b1d117889a1ee 100644 --- a/deps/npm/lib/commands/exec.js +++ b/deps/npm/lib/commands/exec.js @@ -46,8 +46,7 @@ class Exec extends BaseCommand { if (!runPath) { runPath = process.cwd() } else { - // We have to consider if the workspace has its own separate versions - // libnpmexec will walk up to localDir after looking here + // We have to consider if the workspace has its own separate versions libnpmexec will walk up to localDir after looking here localBin = resolve(this.npm.localDir, name, 'node_modules', '.bin') // We also need to look for `bin` entries in the workspace package.json // libnpmexec will NOT look in the project root for the bin entry @@ -65,9 +64,8 @@ class Exec extends BaseCommand { const scriptShell = this.npm.config.get('script-shell') || undefined const packages = this.npm.config.get('package') const yes = this.npm.config.get('yes') - // --prefix sets both of these to the same thing, meaning the global prefix - // is invalid (i.e. no lib/node_modules). This is not a trivial thing to - // untangle and fix so we work around it here. + // --prefix sets both of these to the same thing, meaning the global prefix is invalid (i.e. no lib/node_modules). + // This is not a trivial thing to untangle and fix so we work around it here. if (this.npm.localPrefix !== this.npm.globalPrefix) { globalPath = resolve(globalDir, '..') } @@ -78,8 +76,7 @@ class Exec extends BaseCommand { return libexec({ ...flatOptions, - // we explicitly set packageLockOnly to false because if it's true - // when we try to install a missing package, we won't actually install it + // we explicitly set packageLockOnly to false because if it's true when we try to install a missing package, we won't actually install it packageLockOnly: false, // what the user asked to run args[0] is run by default args: [...args], // copy args so they don't get mutated diff --git a/deps/npm/lib/commands/explore.js b/deps/npm/lib/commands/explore.js index d0d2e5c3ef8912..b8891deda4dce0 100644 --- a/deps/npm/lib/commands/explore.js +++ b/deps/npm/lib/commands/explore.js @@ -31,9 +31,7 @@ class Explore extends BaseCommand { throw this.usageError() } - // run as if running a script named '_explore', which we set to either - // the set of arguments, or the shell config, and let @npmcli/run-script - // handle all the escaping and PATH setup stuff. + // run as if running a script named '_explore', which we set to either the set of arguments, or the shell config, and let @npmcli/run-script handle all the escaping and PATH setup stuff. const { content: pkg } = await pkgJson.normalize(path).catch(er => { log.error('explore', `It doesn't look like ${pkgname} is installed.`) diff --git a/deps/npm/lib/commands/find-dupes.js b/deps/npm/lib/commands/find-dupes.js index 735ac7c4a7ed09..15b312e6a7aec8 100644 --- a/deps/npm/lib/commands/find-dupes.js +++ b/deps/npm/lib/commands/find-dupes.js @@ -1,6 +1,5 @@ const ArboristWorkspaceCmd = require('../arborist-cmd.js') -// dedupe duplicated packages, or find them in the tree class FindDupes extends ArboristWorkspaceCmd { static description = 'Find duplication in the package tree' static name = 'find-dupes' diff --git a/deps/npm/lib/commands/fund.js b/deps/npm/lib/commands/fund.js index a281912d77b326..6f5ed8af015054 100644 --- a/deps/npm/lib/commands/fund.js +++ b/deps/npm/lib/commands/fund.js @@ -98,8 +98,7 @@ class Fund extends ArboristWorkspaceCmd { const result = depth({ tree: fundingInfo, - // composes human readable package name - // and creates a new archy item for readable output + // composes human readable package name and creates a new archy item for readable output visit: ({ name, version, funding }) => { const [fundingSource] = [].concat(normalizeFunding(funding)).filter(isValidFunding) const { url } = fundingSource || {} @@ -126,8 +125,7 @@ class Fund extends ArboristWorkspaceCmd { return item }, - // puts child nodes back into returned archy - // output while also filtering out missing items + // puts child nodes back into returned archy output while also filtering out missing items leave: (item, children) => { if (item) { item.nodes = children.filter(Boolean) @@ -136,8 +134,7 @@ class Fund extends ArboristWorkspaceCmd { return item }, - // turns tree-like object return by libnpmfund - // into children to be properly read by treeverse + // turns tree-like object return by libnpmfund into children to be properly read by treeverse getChildren: node => Object.keys(node.dependencies || {}).map(key => ({ name: key, @@ -166,8 +163,7 @@ class Fund extends ArboristWorkspaceCmd { } } } else { - // tries to retrieve a package from arborist inventory - // by matching resulted package name from the provided spec + // tries to retrieve a package from arborist inventory by matching resulted package name from the provided spec const [item] = [...tree.inventory.query('name', arg.name)] .filter(i => semver.valid(i.package.version)) .sort((a, b) => semver.rcompare(a.package.version, b.package.version)) diff --git a/deps/npm/lib/commands/help-search.js b/deps/npm/lib/commands/help-search.js index f5f6ec05cfa593..cb8075918dba10 100644 --- a/deps/npm/lib/commands/help-search.js +++ b/deps/npm/lib/commands/help-search.js @@ -53,7 +53,8 @@ class HelpSearch extends BaseCommand { // if a line has a search term, then skip it and the next line. // if the next line has a search term, then skip all 3 - // otherwise, set the line to null. then remove the nulls. + // otherwise, set the line to null + // finally, remove the nulls for (let i = 0; i < lines.length; i++) { const line = lines[i] const nextLine = lines[i + 1] @@ -123,11 +124,9 @@ class HelpSearch extends BaseCommand { }) } - // sort results by number of results found, then by number of hits - // then by number of matching lines + // sort results by number of results found, then by number of hits then by number of matching lines - // coverage is ignored here because the contents of results are - // nondeterministic due to either glob or readFiles or Object.entries + // coverage is ignored here because the contents of results are nondeterministic due to either glob or readFiles or Object.entries return results.sort(/* istanbul ignore next */ (a, b) => a.found.length > b.found.length ? -1 : a.found.length < b.found.length ? 1 diff --git a/deps/npm/lib/commands/help.js b/deps/npm/lib/commands/help.js index 6eca85b4b0fe00..a684667e324117 100644 --- a/deps/npm/lib/commands/help.js +++ b/deps/npm/lib/commands/help.js @@ -10,12 +10,10 @@ const BaseCommand = require('../base-cmd.js') const globify = pattern => pattern.split('\\').join('/') // Strips out the number from foo.7 or foo.7. or foo.7.tgz -// We don't currently compress our man pages but if we ever did this would -// seamlessly continue supporting it +// We don't currently compress our man pages but if we ever did this would seamlessly continue supporting it const manNumberRegex = /\.(\d+)(\.[^/\\]*)?$/ // hardcoded names for man sections -// XXX: these are used in the docs workspace and should be exported -// from npm so section names can changed more easily +// XXX: these are used in the docs workspace and should be exported from npm so section names can changed more easily const manSectionNames = { 1: 'commands', 5: 'configuring-npm', @@ -46,8 +44,7 @@ class Help extends BaseCommand { } async exec (args) { - // By default we search all of our man subdirectories, but if the user has - // asked for a specific one we limit the search to just there + // By default we search all of our man subdirectories, but if the user has asked for a specific one we limit the search to just there const manSearch = /^\d+$/.test(args[0]) ? `man${args.shift()}` : 'man*' if (!args.length) { @@ -66,8 +63,7 @@ class Help extends BaseCommand { const f = globify(path.resolve(this.npm.npmRoot, `man/${manSearch}/?(npm-)${arg}.[0-9]*`)) const [man] = await glob(f).then(r => r.sort((a, b) => { - // Because the glob is (subtly) different from manNumberRegex, - // we can't rely on it passing. + // Because the glob is (subtly) different from manNumberRegex, we can't rely on it passing. const aManNumberMatch = a.match(manNumberRegex)?.[1] || 999 const bManNumberMatch = b.match(manNumberRegex)?.[1] || 999 if (aManNumberMatch !== bManNumberMatch) { diff --git a/deps/npm/lib/commands/init.js b/deps/npm/lib/commands/init.js index 290c8ea78ccda0..17ae655223fc74 100644 --- a/deps/npm/lib/commands/init.js +++ b/deps/npm/lib/commands/init.js @@ -56,9 +56,8 @@ class Init extends BaseCommand { await this.exec(args) } - // reads package.json for the top-level folder first, by doing this we - // ensure the command throw if no package.json is found before trying - // to create a workspace package.json file or its folders + // reads package.json for the top-level folder first + // by doing this we ensure the command throw if no package.json is found before trying to create a workspace package.json file or its folders const { content: pkg } = await PackageJson.normalize(this.npm.localPrefix).catch(err => { if (err.code === 'ENOENT') { log.warn('init', 'Missing package.json. Try with `--include-workspace-root`.') @@ -66,8 +65,7 @@ class Init extends BaseCommand { throw err }) - // these are workspaces that are being created, so we can't use - // this.setWorkspaces() + // these are workspaces that are being created, so we can't use this.setWorkspaces() const filters = this.npm.config.get('workspace') const wPath = filterArg => resolve(this.npm.localPrefix, filterArg) @@ -161,11 +159,9 @@ class Init extends BaseCommand { 'This utility will walk you through creating a package.json file.', 'It only covers the most common items, and tries to guess sensible defaults.', '', - 'See `npm help init` for definitive documentation on these fields', - 'and exactly what they do.', + 'See `npm help init` for definitive documentation on these fields and exactly what they do.', '', - 'Use `npm install <pkg>` afterwards to install a package and', - 'save it as a dependency in the package.json file.', + 'Use `npm install <pkg>` afterwards to install a package and save it as a dependency in the package.json file.', '', 'Press ^C at any time to quit.', ].join('\n')) @@ -195,10 +191,7 @@ class Init extends BaseCommand { } } - // if a create-pkg didn't generate a package.json at the workspace - // folder level, it might not be recognized as a workspace by - // mapWorkspaces, so we're just going to avoid touching the - // top-level package.json + // if a create-pkg didn't generate a package.json at the workspace folder level, it might not be recognized as a workspace by mapWorkspaces, so we're just going to avoid touching the top-level package.json try { statSync(resolve(workspacePath, 'package.json')) } catch { diff --git a/deps/npm/lib/commands/install-ci-test.js b/deps/npm/lib/commands/install-ci-test.js index 4b9dd269f8c748..2503d4ddbf4800 100644 --- a/deps/npm/lib/commands/install-ci-test.js +++ b/deps/npm/lib/commands/install-ci-test.js @@ -1,7 +1,5 @@ const CI = require('./ci.js') -// npm install-ci-test -// Runs `npm ci` and then runs `npm test` class InstallCITest extends CI { static description = 'Install a project with a clean slate and run tests' static name = 'install-ci-test' diff --git a/deps/npm/lib/commands/install-test.js b/deps/npm/lib/commands/install-test.js index e21ca7c929c55e..60335ac0d8f651 100644 --- a/deps/npm/lib/commands/install-test.js +++ b/deps/npm/lib/commands/install-test.js @@ -1,7 +1,5 @@ const Install = require('./install.js') -// npm install-test -// Runs `npm install` and then runs `npm test` class InstallTest extends Install { static description = 'Install package(s) and run tests' static name = 'install-test' diff --git a/deps/npm/lib/commands/install.js b/deps/npm/lib/commands/install.js index 43647c6bf7e88d..5970fddfdfe4fa 100644 --- a/deps/npm/lib/commands/install.js +++ b/deps/npm/lib/commands/install.js @@ -11,8 +11,7 @@ class Install extends ArboristWorkspaceCmd { static description = 'Install a package' static name = 'install' - // These are in the order they will show up in when running "-h" - // If adding to this list, consider adding also to ci.js + // These are in the order they will show up in when running "-h" If adding to this list, consider adding also to ci.js static params = [ 'save', 'save-exact', @@ -54,10 +53,8 @@ class Install extends ArboristWorkspaceCmd { } if (/\//.test(partialWord)) { - // Complete fully to folder if there is exactly one match and it - // is a folder containing a package.json file. If that is not the - // case we return 0 matches, which will trigger the default bash - // complete. + // Complete fully to folder if there is exactly one match and it is a folder containing a package.json file. + // If that is not the case we return 0 matches, which will trigger the default bash complete. const lastSlashIdx = partialWord.lastIndexOf('/') const partialName = partialWord.slice(lastSlashIdx + 1) const partialPath = partialWord.slice(0, lastSlashIdx) || '/' @@ -93,9 +90,7 @@ class Install extends ArboristWorkspaceCmd { return [] // invalid dir: no matching } } - // Note: there used to be registry completion here, - // but it stopped making sense somewhere around - // 50,000 packages on the registry + // Note: there used to be registry completion here, but it stopped making sense somewhere around 50,000 packages on the registry } async exec (args) { @@ -134,8 +129,7 @@ class Install extends ArboristWorkspaceCmd { args = ['.'] } - // throw usage error if trying to install empty package - // name to global space, e.g: `npm i -g ""` + // throw usage error if trying to install empty package name to global space, e.g: `npm i -g ""` if (where === globalTop && !args.every(Boolean)) { throw this.usageError() } diff --git a/deps/npm/lib/commands/link.js b/deps/npm/lib/commands/link.js index e36e5bededcba0..e166a0051299a7 100644 --- a/deps/npm/lib/commands/link.js +++ b/deps/npm/lib/commands/link.js @@ -61,8 +61,7 @@ class Link extends ArboristWorkspaceCmd { } async linkInstall (args) { - // load current packages from the global space, - // and then add symlinks installs locally + // load current packages from the global space, and then add symlinks installs locally const globalTop = resolve(this.npm.globalDir, '..') const Arborist = require('@npmcli/arborist') const globalOpts = { @@ -80,8 +79,7 @@ class Link extends ArboristWorkspaceCmd { !node.isRoot || args.some(a => npa(a).name === kid), }) - // any extra arg that is missing from the current - // global space should be reified there first + // any extra arg that is missing from the current global space should be reified there first const missing = this.missingArgsFromTree(globals, args) if (missing.length) { await globalArb.reify({ @@ -102,8 +100,7 @@ class Link extends ArboristWorkspaceCmd { } } - // npm link should not save=true by default unless you're - // using any of --save-dev or other types + // npm link should not save=true by default unless you're using any of --save-dev or other types const save = Boolean( (this.npm.config.find('save') !== 'default' && @@ -151,8 +148,7 @@ class Link extends ArboristWorkspaceCmd { await reifyFinish(this.npm, arb) } - // Returns a list of items that can't be fulfilled by - // things found in the current arborist inventory + // Returns a list of items that can't be fulfilled by things found in the current arborist inventory missingArgsFromTree (tree, args) { if (tree.isLink) { return this.missingArgsFromTree(tree.target, args) @@ -163,8 +159,8 @@ class Link extends ArboristWorkspaceCmd { const arg = npa(a) const nodes = tree.children.values() const argFound = [...nodes].every(node => { - // TODO: write tests for unmatching version specs, this is hard to test - // atm but should be simple once we have a mocked registry again + // TODO: write tests for unmatching version specs + // this is hard to test atm but should be simple once we have a mocked registry again if (arg.name !== node.name /* istanbul ignore next */ || ( arg.version && /* istanbul ignore next */ @@ -177,8 +173,7 @@ class Link extends ArboristWorkspaceCmd { return argFound }) - // remote nodes from the loaded tree in order - // to avoid dropping them later when reifying + // remote nodes from the loaded tree in order to avoid dropping them later when reifying for (const node of foundNodes) { node.parent = null } diff --git a/deps/npm/lib/commands/ls.js b/deps/npm/lib/commands/ls.js index 0ea8704a50573a..5dacd3919882e8 100644 --- a/deps/npm/lib/commands/ls.js +++ b/deps/npm/lib/commands/ls.js @@ -57,6 +57,7 @@ class LS extends ArboristWorkspaceCmd { const unicode = this.npm.config.get('unicode') const packageLockOnly = this.npm.config.get('package-lock-only') const workspacesEnabled = this.npm.flatOptions.workspacesEnabled + const installStrategy = this.npm.flatOptions.installStrategy const path = global ? resolve(this.npm.globalDir, '..') : this.npm.prefix @@ -71,8 +72,7 @@ class LS extends ArboristWorkspaceCmd { const tree = await this.initTree({ arb, args, packageLockOnly }) // filters by workspaces nodes when using -w <workspace-name> - // We only have to filter the first layer of edges, so we don't - // explore anything that isn't part of the selected workspace set. + // We only have to filter the first layer of edges, so we don't explore anything that isn't part of the selected workspace set. let wsNodes if (this.workspaceNames && this.workspaceNames.length) { wsNodes = arb.workspaceNodes(tree, this.workspaceNames) @@ -119,9 +119,7 @@ class LS extends ArboristWorkspaceCmd { // tree traversal happens here, using treeverse.breadth const result = await breadth({ tree, - // recursive method, `node` is going to be the current elem (starting from - // the `tree` obj) that was just visited in the `visit` method below - // `nodeResult` is going to be the returned `item` from `visit` + // recursive method, `node` is going to be the current elem (starting from the `tree` obj) that was just visited in the `visit` method below `nodeResult` is going to be the returned `item` from `visit` getChildren (node, nodeResult) { const seenPaths = new Set() const workspace = node.isWorkspace @@ -136,6 +134,9 @@ class LS extends ArboristWorkspaceCmd { link, omit, }) : () => true) + .filter(installStrategy === 'linked' + ? filterLinkedStrategyEdges({ node, currentDepth }) + : () => true) .map(mapEdgesToNodes({ seenPaths })) .concat(appendExtraneousChildren({ node, seenPaths })) .sort(sortAlphabetically) @@ -146,8 +147,7 @@ class LS extends ArboristWorkspaceCmd { seenNodes, })) }, - // visit each `node` of the `tree`, returning an `item` - these are - // the elements that will be used to build the final output + // visit each `node` of the `tree`, returning an `item` - these are the elements that will be used to build the final output visit (node) { node[_problems] = getProblems(node, { global }) @@ -260,14 +260,12 @@ const getProblems = (node, { global }) => { return problems } -// annotates _parent and _include metadata into the resulting -// item obj allowing for filtering out results during output +// annotates _parent and _include metadata into the resulting item obj allowing for filtering out results during output const augmentItemWithIncludeMetadata = (node, item) => { item[_parent] = node[_parent] item[_include] = node[_include] - // append current item to its parent.nodes which is the - // structure expected by archy in order to print tree + // append current item to its parent.nodes which is the structure expected by archy in order to print tree if (node[_include]) { // includes all ancestors of included node let p = node[_parent] @@ -353,9 +351,8 @@ const getJsonOutputItem = (node, { global, long }) => { item.resolved = node.resolved } - // if the node is the project root, do not add the overridden flag. the project root can't be - // overridden anyway, and if we add the flag it causes undesirable behavior when `npm ls --json` - // is ran in an empty directory since we end up printing an object with only an overridden prop + // if the node is the project root, do not add the overridden flag. + // the project root can't be overridden anyway, and if we add the flag it causes undesirable behavior when `npm ls --json` is ran in an empty directory since we end up printing an object with only an overridden prop if (!node.isProjectRoot) { item.overridden = node.overridden } @@ -403,6 +400,34 @@ const getJsonOutputItem = (node, { global, long }) => { return augmentItemWithIncludeMetadata(node, item) } +// In linked strategy, two types of edges produce false UNMET DEPENDENCYs: +// 1. Workspace edges for undeclared workspaces: the lockfile records edges from root to ALL workspaces, but only declared workspaces are hoisted to root/node_modules in linked mode. Undeclared ones are intentionally absent. +// 2. Dev edges on non-root packages: store package link targets have no parent in the node tree, so they are treated as "top" nodes and their devDependencies are loaded as edges. Those devDeps are never installed. +const filterLinkedStrategyEdges = ({ node, currentDepth }) => { + const declaredDeps = new Set(Object.keys(Object.assign({}, + node.target.package.dependencies, + node.target.package.devDependencies, + node.target.package.optionalDependencies, + node.target.package.peerDependencies + ))) + + return (edge) => { + // Skip workspace edges for undeclared workspaces at root level + if (currentDepth === 0 && edge.type === 'workspace' && edge.missing) { + if (!declaredDeps.has(edge.name)) { + return false + } + } + + // Skip dev edges for non-root packages (store packages) + if (currentDepth > 0 && edge.dev) { + return false + } + + return true + } +} + const filterByEdgesTypes = ({ link, omit }) => (edge) => { for (const omitType of omit) { if (edge[omitType]) { @@ -421,18 +446,15 @@ const appendExtraneousChildren = ({ node, seenPaths }) => const mapEdgesToNodes = ({ seenPaths }) => (edge) => { let node = edge.to - // if the edge is linking to a missing node, we go ahead - // and create a new obj that will represent the missing node + // if the edge is linking to a missing node, we go ahead and create a new obj that will represent the missing node if (edge.missing || (edge.optional && !node)) { const { name, spec } = edge const pkgid = `${name}@${spec}` node = { name, pkgid, [_missing]: edge.from.pkgid } } - // keeps track of a set of seen paths to avoid the edge case in which a tree - // item would appear twice given that it's a children of an extraneous item, - // so it's marked extraneous but it will ALSO show up in edgesOuts of - // its parent so it ends up as two diff nodes if we don't track it + // keeps track of a set of seen paths to avoid the edge case in which a tree item would appear twice given that it's a children of an extraneous item + // so it's marked extraneous but it will ALSO show up in edgesOuts of its parent so it ends up as two diff nodes if we don't track it if (node.path) { seenPaths.add(node.path) } @@ -461,9 +483,7 @@ const augmentNodesWithMetadata = ({ nodeResult, seenNodes, }) => (node) => { - // if the original edge was a deduped dep, treeverse will fail to - // revisit that node in tree traversal logic, so we make it so that - // we have a diff obj for deduped nodes: + // if the original edge was a deduped dep, treeverse will fail to revisit that node in tree traversal logic, so we make it so that we have a diff obj for deduped nodes: if (seenNodes.has(node.path)) { const { realpath, root } = node const targetLocation = root ? relative(root.realpath, realpath) @@ -488,18 +508,14 @@ const augmentNodesWithMetadata = ({ seenNodes.set(node.path, node) } - // _parent is going to be a ref to a treeverse-visited node (returned from - // getHumanOutputItem, getJsonOutputItem, etc) so that we have an easy - // shortcut to place new nodes in their right place during tree traversal + // _parent is going to be a ref to a treeverse-visited node (returned from getHumanOutputItem, getJsonOutputItem, etc) so that we have an easy shortcut to place new nodes in their right place during tree traversal node[_parent] = nodeResult // _include is the property that allow us to filter based on position args // e.g: `npm ls foo`, `npm ls simple-output@2` - // _filteredBy is used to apply extra color info to the item that - // was used in args in order to filter + // _filteredBy is used to apply extra color info to the item that was used in args in order to filter node[_filteredBy] = node[_include] = filterByPositionalArgs(args, { node: seenNodes.get(node.path) }) - // _depth keeps track of how many levels deep tree traversal currently is - // so that we can `npm ls --depth=1` + // _depth keeps track of how many levels deep tree traversal currently is so that we can `npm ls --depth=1` node[_depth] = currentDepth + 1 return node @@ -508,9 +524,7 @@ const augmentNodesWithMetadata = ({ const sortAlphabetically = ({ pkgid: a }, { pkgid: b }) => localeCompare(a, b) const humanOutput = ({ chalk, result, seenItems, unicode }) => { - // we need to traverse the entire tree in order to determine which items - // should be included (since a nested transitive included dep will make it - // so that all its ancestors should be displayed) + // we need to traverse the entire tree in order to determine which items should be included (since a nested transitive included dep will make it so that all its ancestors should be displayed) // here is where we put items in their expected place for archy output for (const item of seenItems) { if (item[_include] && item[_parent]) { @@ -539,13 +553,10 @@ const jsonOutput = ({ path, problems, result, rootError, seenItems }) => { result.invalid = true } - // we need to traverse the entire tree in order to determine which items - // should be included (since a nested transitive included dep will make it - // so that all its ancestors should be displayed) + // we need to traverse the entire tree in order to determine which items should be included (since a nested transitive included dep will make it so that all its ancestors should be displayed) // here is where we put items in their expected place for json output for (const item of seenItems) { - // append current item to its parent item.dependencies obj in order - // to provide a json object structure that represents the installed tree + // append current item to its parent item.dependencies obj in order to provide a json object structure that represents the installed tree if (item[_include] && item[_parent]) { if (!item[_parent].dependencies) { item[_parent].dependencies = {} diff --git a/deps/npm/lib/commands/org.js b/deps/npm/lib/commands/org.js index 3daf9e550fb729..4ece9e19d60bc4 100644 --- a/deps/npm/lib/commands/org.js +++ b/deps/npm/lib/commands/org.js @@ -110,9 +110,7 @@ class Org extends BaseCommand { output.standard([user, org, userCount, true].join('\t')) } else if (!this.npm.silent) { output.standard( - `Successfully removed ${user} from ${org}. You now have ${userCount} member${ - userCount === 1 ? '' : 's' - } in this org.` + `Successfully removed ${user} from ${org}. You now have ${userCount} member${userCount === 1 ? '' : 's'} in this org.` ) } } diff --git a/deps/npm/lib/commands/outdated.js b/deps/npm/lib/commands/outdated.js index 6c2d4cdcd9581d..e6f2cd006b60fb 100644 --- a/deps/npm/lib/commands/outdated.js +++ b/deps/npm/lib/commands/outdated.js @@ -95,8 +95,7 @@ class Outdated extends ArboristWorkspaceCmd { } #getEdges (nodes, type) { - // when no nodes are provided then it should only read direct deps - // from the root node and its workspaces direct dependencies + // when no nodes are provided then it should only read direct deps from the root node and its workspaces direct dependencies if (!nodes) { this.#getEdgesOut(this.#tree) this.#getWorkspacesEdges() @@ -170,8 +169,7 @@ class Outdated extends ArboristWorkspaceCmd { } } - // deps different from prod not currently - // on disk are not included in the output + // deps different from prod not currently on disk are not included in the output if (edge.error === MISSING && type !== 'dependencies') { return } @@ -204,8 +202,8 @@ class Outdated extends ArboristWorkspaceCmd { }) } } catch (err) { - // silently catch and ignore ETARGET, E403 & - // E404 errors, deps are just skipped + // silently catch and ignore ETARGET, E403 & E404 errors + // deps are just skipped if (!['ETARGET', 'E404', 'E404'].includes(err.code)) { throw err } @@ -261,10 +259,8 @@ class Outdated extends ArboristWorkspaceCmd { } #json (list) { - // TODO(BREAKING_CHANGE): this should just return an array. It's a list and - // turing it into an object with keys is lossy since multiple items in the - // list could have the same key. For now we hack that by only changing - // top level values into arrays if they have multiple outdated items + // TODO(BREAKING_CHANGE): this should just return an array. + // It's a list and turning it into an object with keys is lossy since multiple items in the list could have the same key. For now we hack that by only changing top level values into arrays if they have multiple outdated items return list.reduce((acc, d) => { const dep = { current: d.current, diff --git a/deps/npm/lib/commands/pack.js b/deps/npm/lib/commands/pack.js index fdde78f6afe238..ca57de03997b41 100644 --- a/deps/npm/lib/commands/pack.js +++ b/deps/npm/lib/commands/pack.js @@ -31,14 +31,14 @@ class Pack extends BaseCommand { const json = this.npm.config.get('json') const Arborist = require('@npmcli/arborist') - // Get the manifests and filenames first so we can bail early on manifest - // errors before making any tarballs + // Get the manifests and filenames first so we can bail early on manifest errors before making any tarballs const manifests = [] for (const arg of args) { const spec = npa(arg) const manifest = await pacote.manifest(spec, { ...this.npm.flatOptions, Arborist, + preferOnline: true, _isRoot: true, }) if (!manifest._id) { @@ -47,8 +47,7 @@ class Pack extends BaseCommand { manifests.push({ arg, manifest }) } - // Load tarball names up for printing afterward to isolate from the - // noise generated during packing + // Load tarball names up for printing afterward to isolate from the noise generated during packing const tarballs = [] for (const { arg, manifest } of manifests) { const tarballData = await libpack(arg, { @@ -56,6 +55,7 @@ class Pack extends BaseCommand { foregroundScripts: this.npm.config.isDefault('foreground-scripts') ? true : this.npm.config.get('foreground-scripts'), + preferOnline: true, prefix: this.npm.localPrefix, workspaces: this.workspacePaths, }) @@ -63,8 +63,8 @@ class Pack extends BaseCommand { } for (const [index, tar] of Object.entries(tarballs)) { - // XXX(BREAKING_CHANGE): publish outputs a json object with package - // names as keys. Pack should do the same here instead of an array + // XXX(BREAKING_CHANGE): publish outputs a json object with package names as keys. + // Pack should do the same here instead of an array logTar(tar, { unicode, json, key: index }) if (!json) { output.standard(tar.filename.replace(/^@/, '').replace(/\//, '-')) @@ -73,9 +73,7 @@ class Pack extends BaseCommand { } async execWorkspaces (args) { - // If they either ask for nothing, or explicitly include '.' in the args, - // we effectively translate that into each workspace requested - + // If they either ask for nothing, or explicitly include '.' in the args, we effectively translate that into each workspace requested const useWorkspaces = args.length === 0 || args.includes('.') if (!useWorkspaces) { diff --git a/deps/npm/lib/commands/pkg.js b/deps/npm/lib/commands/pkg.js index 5a236f6e622709..3eccb24769eb6e 100644 --- a/deps/npm/lib/commands/pkg.js +++ b/deps/npm/lib/commands/pkg.js @@ -63,19 +63,17 @@ class Pkg extends BaseCommand { if (args.length) { result = new Queryable(result).query(args) - // in case there's only a single argument and a single result from the query - // just prints that one element to stdout. - // TODO(BREAKING_CHANGE): much like other places where we unwrap single - // item arrays this should go away. it makes the behavior unknown for users - // who don't already know the shape of the data. + // in case there's only a single argument and a single result from the query just prints that one element to stdout. + // TODO(BREAKING_CHANGE): much like other places where we unwrap single item arrays this should go away. + // it makes the behavior unknown for users who don't already know the shape of the data. if (Object.keys(result).length === 1 && args.length === 1) { result = result[args] } } // The display layer is responsible for calling JSON.stringify on the result - // TODO: https://github.com/npm/cli/issues/5508 a raw mode has been requested similar - // to jq -r. If that was added then this method should no longer set `json:true` all the time + // TODO: https://github.com/npm/cli/issues/5508 a raw mode has been requested similar to jq -r. + // If that was added then this method should no longer set `json:true` all the time output.buffer(workspace ? { [workspace]: result } : result) } diff --git a/deps/npm/lib/commands/profile.js b/deps/npm/lib/commands/profile.js index 2e11f93788f99e..926eb02f49c22d 100644 --- a/deps/npm/lib/commands/profile.js +++ b/deps/npm/lib/commands/profile.js @@ -259,8 +259,7 @@ class Profile extends BaseCommand { }, } - // if they're using legacy auth currently then we have to - // update them to a bearer token before continuing. + // if they're using legacy auth currently then we have to update them to a bearer token before continuing. const creds = this.npm.config.getCredentialsByURI(this.npm.config.get('registry')) const auth = {} @@ -287,11 +286,7 @@ class Profile extends BaseCommand { ) if (!result.token) { - throw new Error( - `Your registry ${this.npm.config.get('registry')} does not seem to ` + - 'support bearer tokens. Bearer tokens are required for ' + - 'two-factor authentication' - ) + throw new Error(`Your registry ${this.npm.config.get('registry')} does not seem to support bearer tokens. Bearer tokens are required for two-factor authentication.`) } this.npm.config.setCredentialsByURI( @@ -321,35 +316,23 @@ class Profile extends BaseCommand { const badResponse = typeof challenge.tfa !== 'string' || !/^otpauth:[/][/]/.test(challenge.tfa) if (badResponse) { - throw new Error( - 'Unknown error enabling two-factor authentication. Expected otpauth URL' + - ', got: ' + inspect(challenge.tfa) - ) + throw new Error(`Unknown error enabling two-factor authentication. Expected otpauth URL, got: ${inspect(challenge.tfa)}`) } const otpauth = new URL(challenge.tfa) const secret = otpauth.searchParams.get('secret') const code = await qrcode(challenge.tfa) - output.standard( - 'Scan into your authenticator app:\n' + code + '\n Or enter code:', secret - ) + output.standard('Scan into your authenticator app:\n' + code + '\n Or enter code:', secret) - const interactiveOTP = - await readUserInfo.otp('And an OTP code from your authenticator: ') + const interactiveOTP = await readUserInfo.otp('And an OTP code from your authenticator: ') log.info('profile', 'Finalizing two-factor authentication') const result = await set({ tfa: [interactiveOTP] }, conf) - output.standard( - '2FA successfully enabled. Below are your recovery codes, ' + - 'please print these out.' - ) - output.standard( - 'You will need these to recover access to your account ' + - 'if you lose your authentication device.' - ) + output.standard('2FA successfully enabled. Below are your recovery codes, please print these out.') + output.standard('You will need these to recover access to your account if you lose your authentication device.') for (const tfaCode of result.tfa) { output.standard('\t' + tfaCode) diff --git a/deps/npm/lib/commands/prune.js b/deps/npm/lib/commands/prune.js index 1bcf8a9576316c..d91b0030524431 100644 --- a/deps/npm/lib/commands/prune.js +++ b/deps/npm/lib/commands/prune.js @@ -1,7 +1,6 @@ const reifyFinish = require('../utils/reify-finish.js') const ArboristWorkspaceCmd = require('../arborist-cmd.js') -// prune extraneous packages class Prune extends ArboristWorkspaceCmd { static description = 'Remove extraneous packages' static name = 'prune' diff --git a/deps/npm/lib/commands/publish.js b/deps/npm/lib/commands/publish.js index 3c8cbfb825129f..98478ae1e95f1d 100644 --- a/deps/npm/lib/commands/publish.js +++ b/deps/npm/lib/commands/publish.js @@ -9,10 +9,8 @@ const npmFetch = require('npm-registry-fetch') const { redactLog: replaceInfo } = require('@npmcli/redact') const { otplease } = require('../utils/auth.js') const { getContents, logTar } = require('../utils/tar.js') -// for historical reasons, publishConfig in package.json can contain ANY config -// keys that npm supports in .npmrc files and elsewhere. We *may* want to -// revisit this at some point, and have a minimal set that's a SemVer-major -// change that ought to get a RFC written on it. +// for historical reasons, publishConfig in package.json can contain ANY config keys that npm supports in .npmrc files and elsewhere. +// We *may* want to revisit this at some point, and have a minimal set that's a SemVer-major change that ought to get a RFC written on it. const { flatten } = require('@npmcli/config/lib/definitions') const pkgJson = require('@npmcli/package-json') const BaseCommand = require('../base-cmd.js') @@ -83,8 +81,7 @@ class Publish extends BaseCommand { const opts = { ...this.npm.flatOptions, progress: false } - // you can publish name@version, ./foo.tgz, etc. - // even though the default is the 'file:.' cwd. + // you can publish name@version, ./foo.tgz, etc even though the default is the 'file:.' cwd. const spec = npa(args[0]) let manifest = await this.#getManifest(spec, opts) @@ -111,9 +108,7 @@ class Publish extends BaseCommand { const pkgContents = await getContents(manifest, tarballData) const logPkg = () => logTar(pkgContents, { unicode, json, key: workspace }) - // The purpose of re-reading the manifest is in case it changed, - // so that we send the latest and greatest thing to the registry - // note that publishConfig might have changed as well! + // The purpose of re-reading the manifest is in case it changed, so that we send the latest and greatest thing to the registry note that publishConfig might have changed as well! manifest = await this.#getManifest(spec, opts, true) const force = this.npm.config.get('force') const isDefaultTag = this.npm.config.isDefault('tag') && !manifest.publishConfig?.tag @@ -125,8 +120,7 @@ class Publish extends BaseCommand { } } - // If we are not in JSON mode then we show the user the contents of the tarball - // before it is published so they can see it while their otp is pending + // If we are not in JSON mode then we show the user the contents of the tarball before it is published so they can see it while their otp is pending if (!json) { logPkg() } @@ -188,8 +182,7 @@ class Publish extends BaseCommand { await otplease(this.npm, opts, o => libpub(manifest, tarballData, o)) } - // In json mode we don't log until the publish has completed as this will - // add it to the output only if completes successfully + // In json mode we don't log until the publish has completed as this will add it to the output only if completes successfully if (json) { logPkg() } @@ -267,8 +260,7 @@ class Publish extends BaseCommand { } if (manifest.publishConfig) { const cliFlags = this.npm.config.data.get('cli').raw - // Filter out properties set in CLI flags to prioritize them over - // corresponding `publishConfig` settings + // Filter out properties set in CLI flags to prioritize them over corresponding `publishConfig` settings const filteredPublishConfig = Object.fromEntries( Object.entries(manifest.publishConfig).filter(([key]) => !(key in cliFlags))) if (logWarnings) { diff --git a/deps/npm/lib/commands/run.js b/deps/npm/lib/commands/run.js index bed82a6a08701b..4547679754ea96 100644 --- a/deps/npm/lib/commands/run.js +++ b/deps/npm/lib/commands/run.js @@ -113,7 +113,8 @@ class RunScript extends BaseCommand { ? ` --workspace=${pkg._id || pkg.name}` : '' throw new Error([ - `Missing script: "${event}"${suggestions}\n`, + `Missing script: "${event}"${suggestions}`, + '', 'To see a list of scripts, run:', ` npm run${wsArg}`, ].join('\n')) @@ -213,8 +214,7 @@ class RunScript extends BaseCommand { } } - // Return true to indicate that something was output for this path - // that should be separated from others + // Return true to indicate that something was output for this path that should be separated from others return true } } diff --git a/deps/npm/lib/commands/sbom.js b/deps/npm/lib/commands/sbom.js index 98452d646dfe82..fb3d81bb2d368f 100644 --- a/deps/npm/lib/commands/sbom.js +++ b/deps/npm/lib/commands/sbom.js @@ -62,8 +62,7 @@ class SBOM extends BaseCommand { // Populate the response with the list of unique nodes (sorted by location) this.#buildResponse(items.sort((a, b) => localeCompare(a.location, b.location))) - // TODO(BREAKING_CHANGE): all sbom output is in json mode but setting it before - // any of the errors will cause those to be thrown in json mode. + // TODO(BREAKING_CHANGE): all sbom output is in json mode but setting it before any of the errors will cause those to be thrown in json mode. this.npm.config.set('json', true) output.standard(JSON.stringify(this.#response, null, 2), { [META]: true, redact: false }) } @@ -79,8 +78,7 @@ class SBOM extends BaseCommand { const omit = this.npm.flatOptions.omit const workspacesEnabled = this.npm.flatOptions.workspacesEnabled - // If omit is specified, omit all nodes and their children which match the - // specified selectors + // If omit is specified, omit all nodes and their children which match the specified selectors const omits = omit.reduce((acc, o) => `${acc}:not(.${o})`, '') if (!workspacesEnabled) { diff --git a/deps/npm/lib/commands/shrinkwrap.js b/deps/npm/lib/commands/shrinkwrap.js index 86215c18e62dd8..e8d3a256f195fd 100644 --- a/deps/npm/lib/commands/shrinkwrap.js +++ b/deps/npm/lib/commands/shrinkwrap.js @@ -31,11 +31,8 @@ class Shrinkwrap extends BaseCommand { const oldFilename = meta.filename const notSW = !newFile && basename(oldFilename) !== 'npm-shrinkwrap.json' - // The computed lockfile version of a hidden lockfile is always 3 - // even if the actual value of the property is a different. - // When shrinkwrap is run with only a hidden lockfile we want to - // set the shrinkwrap lockfile version as whatever was explicitly - // requested with a fallback to the actual value from the hidden + // The computed lockfile version of a hidden lockfile is always 3 even if the actual value of the property is a different. + // When shrinkwrap is run with only a hidden lockfile we want to set the shrinkwrap lockfile version as whatever was explicitly requested with a fallback to the actual value from the hidden // lockfile. if (meta.hiddenLockfile) { meta.lockfileVersion = arb.options.lockfileVersion || diff --git a/deps/npm/lib/commands/team.js b/deps/npm/lib/commands/team.js index 98f5d2d16b0084..2cac0fb24660c2 100644 --- a/deps/npm/lib/commands/team.js +++ b/deps/npm/lib/commands/team.js @@ -40,9 +40,9 @@ class Team extends BaseCommand { async exec ([cmd, entity = '', user = '']) { // Entities are in the format <scope>:<team> - // XXX: "description" option to libnpmteam is used as a description of the - // team, but in npm's options, this is a boolean meaning "show the - // description in npm search output". Hence its being set to null here. + // XXX: "description" option to libnpmteam is used as a description of the team, but in npm's options + // this is a boolean meaning "show the description in npm search output". + // Hence its being set to null here. await otplease(this.npm, { ...this.npm.flatOptions }, opts => { entity = entity.replace(/^@/, '') switch (cmd) { diff --git a/deps/npm/lib/commands/trust/index.js b/deps/npm/lib/commands/trust/index.js index 9c3bf070a4ce1a..9b866a2cd5e61a 100644 --- a/deps/npm/lib/commands/trust/index.js +++ b/deps/npm/lib/commands/trust/index.js @@ -3,6 +3,7 @@ const BaseCommand = require('../../base-cmd.js') class Trust extends BaseCommand { static description = 'Create a trusted relationship between a package and a OIDC provider' static name = 'trust' + static usage = null static subcommands = { github: require('./github.js'), diff --git a/deps/npm/lib/commands/unpublish.js b/deps/npm/lib/commands/unpublish.js index 73d9d038045586..fc390a2b9edff7 100644 --- a/deps/npm/lib/commands/unpublish.js +++ b/deps/npm/lib/commands/unpublish.js @@ -9,9 +9,7 @@ const getIdentity = require('../utils/get-identity.js') const { otplease } = require('../utils/auth.js') const BaseCommand = require('../base-cmd.js') -const LAST_REMAINING_VERSION_ERROR = 'Refusing to delete the last version of the package. ' + -'It will block from republishing a new version for 24 hours.\n' + -'Run with --force to do this.' +const LAST_REMAINING_VERSION_ERROR = 'Refusing to delete the last version of the package. It will block from republishing a new version for 24 hours.\nRun with --force to do this.' class Unpublish extends BaseCommand { static description = 'Remove a package from the registry' @@ -45,9 +43,7 @@ class Unpublish extends BaseCommand { } const access = await libaccess.getPackages(username, opts) - // do a bit of filtering at this point, so that we don't need - // to fetch versions for more than one thing, but also don't - // accidentally unpublish a whole project + // do a bit of filtering at this point, so that we don't need to fetch versions for more than one thing, but also don't accidentally unpublish a whole project let pkgs = Object.keys(access) if (!partialWord || !pkgs.length) { return pkgs @@ -85,10 +81,7 @@ class Unpublish extends BaseCommand { if (args.length) { spec = npa(args[0]) if (spec.type !== 'version' && spec.rawSpec !== '*') { - throw this.usageError( - 'Can only unpublish a single version, or the entire project.\n' + - 'Tags and ranges are not supported.' - ) + throw this.usageError('Can only unpublish a single version, or the entire project.\nTags and ranges are not supported.') } } @@ -96,10 +89,7 @@ class Unpublish extends BaseCommand { log.silly('unpublish', 'spec', spec) if (spec?.rawSpec === '*' && !force) { - throw this.usageError( - 'Refusing to delete entire project.\n' + - 'Run with --force to do this.' - ) + throw this.usageError('Refusing to delete entire project.\nRun with --force to do this.') } const opts = { ...this.npm.flatOptions } @@ -111,14 +101,12 @@ class Unpublish extends BaseCommand { } catch (err) { if (err.code === 'ENOENT' || err.code === 'ENOTDIR') { if (!spec) { - // We needed a local package.json to figure out what package to - // unpublish + // We needed a local package.json to figure out what package to unpublish throw this.usageError() } } else { // folks should know if ANY local package.json had a parsing error. - // They may be relying on `publishConfig` to be loading and we don't - // want to ignore errors in that case. + // They may be relying on `publishConfig` to be loading and we don't want to ignore errors in that case. throw err } } @@ -131,19 +119,14 @@ class Unpublish extends BaseCommand { log.verbose('unpublish', manifest) pkgVersion = manifest.version ? `@${manifest.version}` : '' if (!manifest.version && !force) { - throw this.usageError( - 'Refusing to delete entire project.\n' + - 'Run with --force to do this.' - ) + throw this.usageError('Refusing to delete entire project.\nRun with --force to do this.') } } - // If localPrefix has a package.json with a name that matches the package - // being unpublished, load up the publishConfig + // If localPrefix has a package.json with a name that matches the package being unpublished, load up the publishConfig if (manifest?.name === spec.name && manifest.publishConfig) { const cliFlags = this.npm.config.data.get('cli').raw - // Filter out properties set in CLI flags to prioritize them over - // corresponding `publishConfig` settings + // Filter out properties set in CLI flags to prioritize them over corresponding `publishConfig` settings const filteredPublishConfig = Object.fromEntries( Object.entries(manifest.publishConfig).filter(([key]) => !(key in cliFlags))) for (const key in filteredPublishConfig) { diff --git a/deps/npm/lib/commands/update.js b/deps/npm/lib/commands/update.js index 38e83f3f6bb953..ed1416d70c13e2 100644 --- a/deps/npm/lib/commands/update.js +++ b/deps/npm/lib/commands/update.js @@ -39,8 +39,7 @@ class Update extends ArboristWorkspaceCmd { const global = path.resolve(this.npm.globalDir, '..') const where = this.npm.global ? global : this.npm.prefix - // In the context of `npm update` the save - // config value should default to `false` + // In the context of `npm update` the save config value should default to `false` const save = this.npm.config.isDefault('save') ? false : this.npm.config.get('save') diff --git a/deps/npm/lib/commands/view.js b/deps/npm/lib/commands/view.js index 44b94dfccb05a6..28393c823d65f4 100644 --- a/deps/npm/lib/commands/view.js +++ b/deps/npm/lib/commands/view.js @@ -31,8 +31,7 @@ class View extends BaseCommand { static async completion (opts, npm) { if (opts.conf.argv.remain.length <= 2) { - // There used to be registry completion here, but it stopped - // making sense somewhere around 50,000 packages on the registry + // There used to be registry completion here, but it stopped making sense somewhere around 50,000 packages on the registry return } // have the package, get the fields @@ -103,8 +102,7 @@ class View extends BaseCommand { const wholePackument = !args.length const json = this.npm.config.get('json') - // If we are viewing many packages and outputting individual fields then - // output the name before doing any async activity + // If we are viewing many packages and outputting individual fields then output the name before doing any async activity if (!json && !wholePackument && workspace) { output.standard(`${name}:`) } @@ -241,11 +239,10 @@ class View extends BaseCommand { }) if (json) { - // TODO(BREAKING_CHANGE): all unwrapping should be removed. Users should know - // based on their arguments if they can expect an array or an object. And this - // unwrapping can break that assumption. Eg `npm view abbrev@^2` should always - // return an array, but currently since there is only one version matching `^2` - // this will return a single object instead. + // TODO(BREAKING_CHANGE): all unwrapping should be removed. + // Users should know based on their arguments if they can expect an array or an object. + // And this unwrapping can break that assumption. + // e.g. `npm view abbrev@^2` should always return an array, but currently since there is only one version matching `^2` this will return a single object instead. const first = Object.keys(res[0] || {}) const jsonRes = first.length === 1 ? res.map(m => m[first[0]]) : res if (jsonRes.length === 0) { diff --git a/deps/npm/lib/lifecycle-cmd.js b/deps/npm/lib/lifecycle-cmd.js index eb3cc1c9beed7f..e4604b6115131e 100644 --- a/deps/npm/lib/lifecycle-cmd.js +++ b/deps/npm/lib/lifecycle-cmd.js @@ -1,7 +1,7 @@ const BaseCommand = require('./base-cmd.js') // The implementation of commands that are just "run a script" -// restart, start, stop, test +// e.g. restart, start, stop, test class LifecycleCmd extends BaseCommand { static usage = ['[-- <args>]'] static isShellout = true diff --git a/deps/npm/lib/npm.js b/deps/npm/lib/npm.js index d30554d400f07f..b2ab377e95d71f 100644 --- a/deps/npm/lib/npm.js +++ b/deps/npm/lib/npm.js @@ -43,18 +43,13 @@ class Npm { #logFile = new LogFile() #timers = new Timers() - // all these options are only used by tests in order to make testing more - // closely resemble real world usage. for now, npm has no programmatic API so - // it is ok to add stuff here, but we should not rely on it more than - // necessary. XXX: make these options not necessary by refactoring @npmcli/config + // All these options are only used by tests in order to make testing more closely resemble real world usage. + // For now, npm has no programmatic API so it is ok to add stuff here, but we should not rely on it more than necessary. + // XXX: make these options not necessary by refactoring @npmcli/config // - npmRoot: this is where npm looks for docs files and the builtin config - // - argv: this allows tests to extend argv in the same way the argv would - // be passed in via a CLI arg. - // - excludeNpmCwd: this is a hack to get @npmcli/config to stop walking up - // dirs to set a local prefix when it encounters the `npmRoot`. this - // allows tests created by tap inside this repo to not set the local - // prefix to `npmRoot` since that is the first dir it would encounter when - // doing implicit detection + // - argv: this allows tests to extend argv in the same way the argv would be passed in via a CLI arg. + // - excludeNpmCwd: this is a hack to get @npmcli/config to stop walking up dirs to set a local prefix when it encounters the `npmRoot`. + // this allows tests created by tap inside this repo to not set the local prefix to `npmRoot` since that is the first dir it would encounter when doing implicit detection constructor ({ stdout = process.stdout, stderr = process.stderr, @@ -108,13 +103,11 @@ class Npm { } // Remove first argv since that is our command as typed - // Note that this might not be the actual name of the command - // due to aliases, etc. But we use the raw form of it later - // in user output so it must be preserved as is. + // Note that this might not be the actual name of the command due to aliases, etc. + // But we use the raw form of it later in user output so it must be preserved as is. const commandArg = this.argv.shift() - // This is the actual name of the command that will be run or - // undefined if deref could not find a match + // This is the actual name of the command that will be run or undefined if deref could not find a match const command = deref(commandArg) await this.#display.load({ @@ -137,47 +130,38 @@ class Npm { return { exec: false } } - // mkdir this separately since the logs dir can be set to - // a different location. if this fails, then we don't have - // a cache dir, but we don't want to fail immediately since - // the command might not need a cache dir (like `npm --version`) + // mkdir this separately since the logs dir can be set to a different location. + // if this fails, then we don't have a cache dir, but we don't want to fail immediately since the command might not need a cache dir (like `npm --version`) await time.start('npm:load:mkdirpcache', () => fs.mkdir(this.cache, { recursive: true }) .catch((e) => log.verbose('cache', `could not create cache: ${e}`))) - // it's ok if this fails. user might have specified an invalid dir - // which we will tell them about at the end + // it's ok if this fails. user might have specified an invalid dir which we will tell them about at the end if (this.config.get('logs-max') > 0) { await time.start('npm:load:mkdirplogs', () => fs.mkdir(this.#logsDir, { recursive: true }) .catch((e) => log.verbose('logfile', `could not create logs-dir: ${e}`))) } - // note: this MUST be shorter than the actual argv length, because it - // uses the same memory, so node will truncate it if it's too long. - // We time this because setting process.title is slow sometimes but we - // have to do it for security reasons. But still helpful to know how slow it is. + // note: this MUST be shorter than the actual argv length, because it uses the same memory, so node will truncate it if it's too long. + // We time this because setting process.title is slow sometimes but we have to do it for security reasons. But still helpful to know how slow it is. time.start('npm:load:setTitle', () => { const { parsedArgv: { cooked, remain } } = this.config - // Secrets are mostly in configs, so title is set using only the positional args - // to keep those from being leaked. We still do a best effort replaceInfo. + // Secrets are mostly in configs, so title is set using only the positional args to keep those from being leaked. + // We still do a best effort replaceInfo. this.#title = ['npm'].concat(replaceInfo(remain)).join(' ').trim() process.title = this.#title - // The cooked argv is also logged separately for debugging purposes. It is - // cleaned as a best effort by replacing known secrets like basic auth - // password and strings that look like npm tokens. XXX: for this to be - // safer the config should create a sanitized version of the argv as it - // has the full context of what each option contains. + // The cooked argv is also logged separately for debugging purposes. + // It is cleaned as a best effort by replacing known secrets like basic auth password and strings that look like npm tokens. + // XXX: for this to be safer the config should create a sanitized version of the argv as it has the full context of what each option contains. this.#argvClean = replaceInfo(cooked) log.verbose('title', this.title) log.verbose('argv', this.#argvClean.map(JSON.stringify).join(' ')) }) // logFile.load returns a promise that resolves when old logs are done being cleaned. - // We save this promise to an array so that we can await it in tests to ensure more - // deterministic logging behavior. The process will also hang open if this were to - // take a long time to resolve, but that is why process.exit is called explicitly - // in the exit-handler. + // We save this promise to an array so that we can await it in tests to ensure more deterministic logging behavior. + // The process will also hang open if this were to take a long time to resolve, but that is why process.exit is called explicitly in the exit-handler. this.unrefPromises.push(this.#logFile.load({ command, path: this.logPath, @@ -221,8 +205,7 @@ class Npm { const Command = this.constructor.cmd(cmd) const command = new Command(this) - // since 'test', 'start', 'stop', etc. commands re-enter this function - // to call the run command, we need to only set it one time. + // since 'test', 'start', 'stop', etc. commands re-enter this function to call the run command, we need to only set it one time. if (!this.#command) { this.#command = command process.env.npm_command = this.command @@ -235,8 +218,7 @@ class Npm { this.config.logWarnings() } - // this needs to be rest after because some commands run - // this.npm.config.checkUnknown('publishConfig', key) + // this needs to be rest after because some commands run this.npm.config.checkUnknown('publishConfig', key) this.config.warn = true return this.execCommandClass(command, args, [cmd]) @@ -327,8 +309,7 @@ class Npm { } } - // This gets called at the end of the exit handler and - // during any tests to cleanup all of our listeners + // This gets called at the end of the exit handler and during any tests to cleanup all of our listeners // Everything in here should be synchronous unload () { this.#timers.off() @@ -347,8 +328,7 @@ class Npm { output.flush({ [META]: true, - // json can be set during a command so we send the - // final value of it to the display layer here + // json can be set during a command so we send the final value of it to the display layer here json: this.loaded && this.config.get('json'), jsonError: jsonError(err, this), }) @@ -437,9 +417,7 @@ class Npm { return flat } - // color and logColor are a special derived values that takes into - // consideration not only the config, but whether or not we are operating - // in a tty with the associated output (stdout/stderr) + // color and logColor are a special derived values that takes into consideration not only the config, but whether or not we are operating in a tty with the associated output (stdout/stderr) get color () { return this.flatOptions.color } diff --git a/deps/npm/lib/package-url-cmd.js b/deps/npm/lib/package-url-cmd.js index 26c61b521ae60a..5a45b92057245b 100644 --- a/deps/npm/lib/package-url-cmd.js +++ b/deps/npm/lib/package-url-cmd.js @@ -45,9 +45,8 @@ class PackageUrlCommand extends BaseCommand { return this.exec(this.workspacePaths) } - // given a manifest, try to get the hosted git info from it based on - // repository (if a string) or repository.url (if an object) returns null - // if it's not a valid repo, or not a known hosted repo + // given a manifest, try to get the hosted git info from it based on repository (if a string) or repository.url (if an object) + // returns null if it's not a valid repo, or not a known hosted repo hostedFromMani (mani) { const hostedGitInfo = require('hosted-git-info') const r = mani.repository diff --git a/deps/npm/lib/utils/audit-error.js b/deps/npm/lib/utils/audit-error.js index c56ec9ba86f185..a93dbb15de7802 100644 --- a/deps/npm/lib/utils/audit-error.js +++ b/deps/npm/lib/utils/audit-error.js @@ -1,13 +1,12 @@ const { log, output } = require('proc-log') const { redactLog: replaceInfo } = require('@npmcli/redact') -// print an error or just nothing if the audit report has an error -// this is called by the audit command, and by the reify-output util -// prints a JSON version of the error if it's --json -// returns 'true' if there was an error, false otherwise +// Print an error or just nothing if the audit report has an error. +// This is called by the audit command, and by the reify-output util prints a JSON version of the error if it's --json. +// Returns 'true' if there was an error, false otherwise. const auditError = (npm, report) => { - if (!report || !report.error) { + if (!report?.error) { return false } @@ -34,6 +33,7 @@ const auditError = (npm, report) => { output.standard(body) } + // XXX we should throw a real error here throw 'audit endpoint returned an error' } diff --git a/deps/npm/lib/utils/auth.js b/deps/npm/lib/utils/auth.js index a617ab9430b2ab..f93e6a3b9c3257 100644 --- a/deps/npm/lib/utils/auth.js +++ b/deps/npm/lib/utils/auth.js @@ -52,9 +52,8 @@ const adduser = async (npm, { creds, ...opts }) => { const username = await read.username('Username:', creds.username) const password = await read.password('Password:', creds.password) const email = await read.email('Email (this will be public):', creds.email) - // npm registry quirk: If you "add" an existing user with their current - // password, it's effectively a login, and if that account has otp you'll - // be prompted for it. + // npm registry quirk: + // If you "add" an existing user with their current password, it's effectively a login, and if that account has otp you'll be prompted for it. res = await otplease(npm, opts, (reqOpts) => adduserCouch(username, email, password, reqOpts)) } diff --git a/deps/npm/lib/utils/cmd-list.js b/deps/npm/lib/utils/cmd-list.js index ec1d50dcc0c560..8740977cb7619a 100644 --- a/deps/npm/lib/utils/cmd-list.js +++ b/deps/npm/lib/utils/cmd-list.js @@ -162,9 +162,8 @@ const deref = (c) => { const abbrevs = abbrev(commands.concat(Object.keys(aliases))) - // first deref the abbrev, if there is one - // then resolve any aliases - // so `npm install-cl` will resolve to `install-clean` then to `ci` + // first deref the abbrev, + // if there is one then resolve any aliases so `npm install-cl` will resolve to `install-clean` then to `ci` let a = abbrevs[c] while (aliases[a]) { a = aliases[a] diff --git a/deps/npm/lib/utils/error-message.js b/deps/npm/lib/utils/error-message.js index 9faf4c339b1a5d..ab01ca621d18bf 100644 --- a/deps/npm/lib/utils/error-message.js +++ b/deps/npm/lib/utils/error-message.js @@ -17,9 +17,8 @@ const errorMessage = (er, npm) => { const { report } = require('./explain-eresolve.js') summary.push(['ERESOLVE', er.message]) detail.push(['', '']) - // XXX(display): error messages are logged so we use the logColor since that is based - // on stderr. This should be handled solely by the display layer so it could also be - // printed to stdout if necessary. + // XXX(display): error messages are logged so we use the logColor since that is based on stderr. + // This should be handled solely by the display layer so it could also be printed to stdout if necessary. const { explanation, file } = report(er, npm.logChalk, npm.noColorChalk) detail.push(['', explanation]) files.push(['eresolve-report.txt', file]) @@ -42,8 +41,7 @@ const errorMessage = (er, npm) => { summary.push(['', er]) detail.push(['', [ '', - 'If you are behind a proxy, please make sure that the', - "'proxy' config is set properly. See: 'npm help config'", + `If you are behind a proxy, please make sure that the 'proxy' config is set properly. See: 'npm help config'`, ].join('\n')]) break @@ -59,8 +57,7 @@ const errorMessage = (er, npm) => { log.verbose(er.stack) summary.push(['', [ '', - 'Your cache folder contains root-owned files, due to a bug in', - 'previous versions of npm which has since been addressed.', + 'Your cache folder contains root-owned files, due to a bug in previous versions of npm which has since been addressed.', '', 'To permanently fix this problem, please run:', ` sudo chown -R ${process.getuid()}:${process.getgid()} "${npm.config.get('cache')}"`, @@ -71,15 +68,12 @@ const errorMessage = (er, npm) => { '', 'The operation was rejected by your operating system.', ...process.platform === 'win32' ? [ - "It's possible that the file was already in use (by a text editor or antivirus),", - 'or that you lack permissions to access it.', + `It's possible that the file was already in use (by a text editor or antivirus), or that you lack permissions to access it.`, ] : [ 'It is likely you do not have the permissions to access this file as the current user', ], '', - 'If you believe this might be a permissions issue, please double-check the', - 'permissions of the file and its containing directories, or try running', - 'the command again as root/Administrator.', + 'If you believe this might be a permissions issue, please double-check the permissions of the file and its containing directories, or try running the command again as root/Administrator.', ].join('\n')]) } break @@ -138,8 +132,7 @@ const errorMessage = (er, npm) => { summary.push(['', 'This operation requires a one-time password from your authenticator.']) detail.push(['', [ 'You can provide a one-time password by passing --otp=<code> to the command you ran.', - 'If you already provided a one-time password then it is likely that you either typoed', - 'it, or it timed out. Please try again.', + 'If you already provided a one-time password then it is likely that you either typoed it, or it timed out. Please try again.', ].join('\n')]) } } else { @@ -160,14 +153,12 @@ const errorMessage = (er, npm) => { } else if (auth.includes('Basic')) { summary.push(['', 'Incorrect or missing password.']) detail.push(['', [ - 'If you were trying to login, change your password, create an', - 'authentication token or enable two-factor authentication then', - 'that means you likely typed your password in incorrectly.', + 'If you were trying to login, change your password, create an authentication token or enable two-factor authentication then that means you likely typed your password in incorrectly.', 'Please try again, or recover your password at:', ' https://www.npmjs.com/forgot', '', - 'If you were doing some other operation then your saved credentials are', - 'probably out of date. To correct this please try logging in again with:', + 'If you were doing some other operation then your saved credentials are probably out of date.', + 'To correct this please try logging in again with:', ' npm login', ].join('\n')]) } else { @@ -207,7 +198,7 @@ const errorMessage = (er, npm) => { case 'EPUBLISHCONFLICT': summary.push(['publish fail', 'Cannot publish over existing version.']) - detail.push(['publish fail', "Update the 'version' field in package.json and try again."]) + detail.push(['publish fail', `Update the 'version' field in package.json and try again.`]) detail.push(['publish fail', '']) detail.push(['publish fail', 'To automatically increment version numbers, see:']) detail.push(['publish fail', ' npm help version']) @@ -217,8 +208,7 @@ const errorMessage = (er, npm) => { summary.push(['git', er.message]) summary.push(['git', ` ${er.path}`]) detail.push(['git', [ - 'Refusing to remove it. Update manually,', - 'or move it out of the way first.', + 'Refusing to remove it. Update manually, or move it out of the way first.', ].join('\n')]) break @@ -290,25 +280,21 @@ const errorMessage = (er, npm) => { 'This is a problem related to network connectivity.', 'In most cases you are behind a proxy or have bad network settings.', '', - 'If you are behind a proxy, please make sure that the', - "'proxy' config is set properly. See: 'npm help config'", + `If you are behind a proxy, please make sure that the 'proxy' config is set properly. See: 'npm help config'`, ].join('\n')]) break case 'ETARGET': summary.push(['notarget', er.message]) detail.push(['notarget', [ - 'In most cases you or one of your dependencies are requesting', - "a package version that doesn't exist.", + `In most cases you or one of your dependencies are requesting a package version that doesn't exist.`, ].join('\n')]) break case 'E403': summary.push(['403', er.message]) detail.push(['403', [ - 'In most cases, you or one of your dependencies are requesting', - 'a package version that is forbidden by your security policy, or', - 'on a server you do not have access to.', + 'In most cases, you or one of your dependencies are requesting a package version that is forbidden by your security policy, or on a server you do not have access to.', ].join('\n')]) break @@ -334,8 +320,7 @@ const errorMessage = (er, npm) => { case 'EROFS': summary.push(['rofs', er.message]) detail.push(['rofs', [ - 'Often virtualized file systems, or other file systems', - "that don't support symlinks, give this error.", + `Often virtualized file systems, or other file systems that don't support symlinks, give this error.`, ].join('\n')]) break @@ -354,7 +339,7 @@ const errorMessage = (er, npm) => { summary.push(['typeerror', er.stack]) detail.push(['typeerror', [ 'This is an error with npm itself. Please report this error at:', - ' https://github.com/npm/cli/issues', + 'https://github.com/npm/cli/issues', ].join('\n')]) break @@ -395,10 +380,8 @@ const getExitCodeFromError = (err) => { } const getError = (err, { npm, command, pkg }) => { - // if we got a command that just shells out to something else, then it - // will presumably print its own errors and exit with a proper status - // code if there's a problem. If we got an error with a code=0, then... - // something else went wrong along the way, so maybe an npm problem? + // if we got a command that just shells out to something else, then it will presumably print its own errors and exit with a proper status code if there's a problem. + // If we got an error with a code=0, then... something else went wrong along the way, so maybe an npm problem? if (command?.constructor?.isShellout && typeof err.code === 'number' && err.code) { return { exitCode: err.code, @@ -438,10 +421,9 @@ const getError = (err, { npm, command, pkg }) => { } } - // Anything after this is not suppressed and get more logged information + // Anything after this is not suppressed and gets more logged information - // add a code to the error if it doesnt have one and mutate some properties - // so they have redacted information + // add a code to the error if it doesnt have one and mutate some properties so they have redacted information err.code ??= err.message.match(/^(?:Error: )?(E[A-Z]+)/)?.[1] // this mutates the error and redacts stack/message const { summary, detail, files, json } = errorMessage(err, npm) diff --git a/deps/npm/lib/utils/explain-dep.js b/deps/npm/lib/utils/explain-dep.js index 4e9e93454e8a28..6c84aa4ebbc396 100644 --- a/deps/npm/lib/utils/explain-dep.js +++ b/deps/npm/lib/utils/explain-dep.js @@ -1,9 +1,9 @@ const { relative } = require('node:path') -const explainNode = (node, depth, chalk) => +const explainNode = (node, depth, chalk, seen = new Set()) => printNode(node, chalk) + - explainDependents(node, depth, chalk) + - explainLinksIn(node, depth, chalk) + explainDependents(node, depth, chalk, seen) + + explainLinksIn(node, depth, chalk, seen) const colorType = (type, chalk) => { const style = type === 'extraneous' ? chalk.red @@ -34,24 +34,24 @@ const printNode = (node, chalk) => { (node.location ? chalk.dim(`\n${node.location}`) : '') } -const explainLinksIn = ({ linksIn }, depth, chalk) => { +const explainLinksIn = ({ linksIn }, depth, chalk, seen) => { if (!linksIn || !linksIn.length || depth <= 0) { return '' } - const messages = linksIn.map(link => explainNode(link, depth - 1, chalk)) + const messages = linksIn.map(link => explainNode(link, depth - 1, chalk, seen)) const str = '\n' + messages.join('\n') return str.split('\n').join('\n ') } -const explainDependents = ({ dependents }, depth, chalk) => { +const explainDependents = ({ dependents }, depth, chalk, seen) => { if (!dependents || !dependents.length || depth <= 0) { return '' } const max = Math.ceil(depth / 2) const messages = dependents.slice(0, max) - .map(edge => explainEdge(edge, depth, chalk)) + .map(edge => explainEdge(edge, depth, chalk, seen)) // show just the names of the first 5 deps that overflowed the list if (dependents.length > max) { @@ -75,7 +75,10 @@ const explainDependents = ({ dependents }, depth, chalk) => { return str.split('\n').join('\n ') } -const explainEdge = ({ name, type, bundled, from, spec, rawSpec, overridden }, depth, chalk) => { +const explainEdge = ( + { name, type, bundled, from, spec, rawSpec, overridden }, + depth, chalk, seen = new Set() +) => { let dep = type === 'workspace' ? chalk.bold(relative(from.location, spec.slice('file:'.length))) : `${name}@"${spec}"` @@ -83,21 +86,31 @@ const explainEdge = ({ name, type, bundled, from, spec, rawSpec, overridden }, d dep = `${colorType('overridden', chalk)} ${dep} (was "${rawSpec}")` } - const fromMsg = ` from ${explainFrom(from, depth, chalk)}` + const fromMsg = ` from ${explainFrom(from, depth, chalk, seen)}` return (type === 'prod' ? '' : `${colorType(type, chalk)} `) + (bundled ? `${colorType('bundled', chalk)} ` : '') + `${dep}${fromMsg}` } -const explainFrom = (from, depth, chalk) => { +const explainFrom = (from, depth, chalk, seen) => { if (!from.name && !from.version) { return 'the root project' } - return printNode(from, chalk) + - explainDependents(from, depth - 1, chalk) + - explainLinksIn(from, depth - 1, chalk) + // Prevent infinite recursion from cycles in the dependency graph (e.g. linked strategy store nodes). Use stack-based tracking so diamond dependencies (same node reached via different paths) are still explained, but recursive cycles are broken. + const nodeId = `${from.name}@${from.version}:${from.location}` + if (seen.has(nodeId)) { + return printNode(from, chalk) + } + seen.add(nodeId) + + const result = printNode(from, chalk) + + explainDependents(from, depth - 1, chalk, seen) + + explainLinksIn(from, depth - 1, chalk, seen) + + seen.delete(nodeId) + return result } module.exports = { explainNode, printNode, explainEdge } diff --git a/deps/npm/lib/utils/explain-eresolve.js b/deps/npm/lib/utils/explain-eresolve.js index f3c6ae23a479db..41152a8f4a20f5 100644 --- a/deps/npm/lib/utils/explain-eresolve.js +++ b/deps/npm/lib/utils/explain-eresolve.js @@ -1,12 +1,9 @@ -// this is called when an ERESOLVE error is caught in the exit-handler, -// or when there's a log.warn('eresolve', msg, explanation), to turn it -// into a human-intelligible explanation of what's wrong and how to fix. +// this is called when an ERESOLVE error is caught in the exit-handler, or when there's a log.warn('eresolve', msg, explanation), to turn it into a human-intelligible explanation of what's wrong and how to fix. const { explainEdge, explainNode, printNode } = require('./explain-dep.js') -// expl is an explanation object that comes from Arborist. It looks like: +// expl is an explanation object that comes from Arborist. // Depth is how far we want to want to descend into the object making a report. -// The full report (ie, depth=Infinity) is always written to the cache folder -// at ${cache}/eresolve-report.txt along with full json. +// The full report (ie, depth=Infinity) is always written to the cache folder at ${cache}/eresolve-report.txt along with full json. const explain = (expl, chalk, depth) => { const { edge, dep, current, peerConflict, currentEdge } = expl @@ -18,9 +15,7 @@ const explain = (expl, chalk, depth) => { out.push('While resolving: ' + printNode(whileInstalling, chalk)) } - // it "should" be impossible for an ERESOLVE explanation to lack both - // current and currentEdge, but better to have a less helpful error - // than a crashing failure. + // it "should" be impossible for an ERESOLVE explanation to lack both current and currentEdge, but better to have a less helpful error than a crashing failure. if (current) { out.push('Found: ' + explainNode(current, depth, chalk)) } else if (peerConflict && peerConflict.current) { @@ -55,9 +50,7 @@ const report = (expl, chalk, noColorChalk) => { ? arr.join(' or ') : arr.map((v, i, l) => i + 1 === l.length ? `or ${v}` : v).join(', ') - const fix = `Fix the upstream dependency conflict, or retry -this command with ${or(flags)} -to accept an incorrect (and potentially broken) dependency resolution.` + const fix = `Fix the upstream dependency conflict, or retry this command with ${or(flags)} to accept an incorrect (and potentially broken) dependency resolution.` return { explanation: `${explain(expl, chalk, 4)}\n\n${fix}`, diff --git a/deps/npm/lib/utils/format-bytes.js b/deps/npm/lib/utils/format-bytes.js index b5c53484825eb2..d111c8cab09454 100644 --- a/deps/npm/lib/utils/format-bytes.js +++ b/deps/npm/lib/utils/format-bytes.js @@ -1,6 +1,5 @@ // Convert bytes to printable output, for file reporting in tarballs -// Only supports up to GB because that's way larger than anything the registry -// supports anyways. +// Only supports up to GB because that's way larger than anything the registry supports anyways. const formatBytes = (bytes, space = true) => { let spacer = '' diff --git a/deps/npm/lib/utils/format-search-stream.js b/deps/npm/lib/utils/format-search-stream.js index 6d4e20a2d63407..fd5f6c2385cc34 100644 --- a/deps/npm/lib/utils/format-search-stream.js +++ b/deps/npm/lib/utils/format-search-stream.js @@ -12,8 +12,7 @@ const { Minipass } = require('minipass') // date: Date // can be null, // } // -// The returned stream will format this package data -// into a byte stream of formatted, displayable output. +// The returned stream will format this package data into a byte stream of formatted, displayable output. function filter (data, exclude) { const words = [data.name] @@ -81,7 +80,10 @@ class TextOutputStream extends Minipass { constructor (opts) { super() - // Consider a search for "cowboys" and "boy". If we highlight "boys" first the "cowboys" string will no longer string match because of the ansi highlighting added to "boys". If we highlight "boy" second then the ansi reset at the end will make the highlighting only on "cowboy" with a normal "s". Neither is perfect but at least the first option doesn't do partial highlighting. So, we sort strings smaller to larger + // Consider a search for "cowboys" and "boy". + // If we highlight "boys" first the "cowboys" string will no longer string match because of the ansi highlighting added to "boys". + // If we highlight "boy" second then the ansi reset at the end will make the highlighting only on "cowboy" with a normal "s". + // Neither is perfect but at least the first option doesn't do partial highlighting. So, we sort strings smaller to larger this.#args = opts.args .map(s => s.toLowerCase()) .filter(Boolean) diff --git a/deps/npm/lib/utils/get-identity.js b/deps/npm/lib/utils/get-identity.js index d8f59da14247a1..a523a7c716d36c 100644 --- a/deps/npm/lib/utils/get-identity.js +++ b/deps/npm/lib/utils/get-identity.js @@ -17,8 +17,7 @@ module.exports = async (npm, opts) => { } } - // At this point, even if they have a credentials object, it doesn't have a - // valid token. + // At this point, even if they have a credentials object, it doesn't have a valid token. throw Object.assign( new Error('This command requires you to be logged in.'), { code: 'ENEEDAUTH' } diff --git a/deps/npm/lib/utils/log-file.js b/deps/npm/lib/utils/log-file.js index c7c1d754009a3c..14b00b180564d3 100644 --- a/deps/npm/lib/utils/log-file.js +++ b/deps/npm/lib/utils/log-file.js @@ -13,14 +13,12 @@ class LogFiles { #logStream = [] // We cap log files at a certain number of log events per file. - // Note that each log event can write more than one line to the - // file. Then we rotate log files once this number of events is reached + // Note that each log event can write more than one line to the file. + // Then we rotate log files once this number of events is reached #MAX_LOGS_PER_FILE = null - // Now that we write logs continuously we need to have a backstop - // here for infinite loops that still log. This is also partially handled - // by the config.get('max-files') option, but this is a failsafe to - // prevent runaway log file creation + // Now that we write logs continuously we need to have a backstop here for infinite loops that still log. + // This is also partially handled by the config.get('max-files') option, but this is a failsafe to prevent runaway log file creation #MAX_FILES_PER_PROCESS = null #fileLogCount = 0 @@ -53,8 +51,7 @@ class LogFiles { return } - // dir is user configurable and is required to exist so - // this can error if the dir is missing or not configured correctly + // dir is user configurable and is required to exist so this can error if the dir is missing or not configured correctly this.#path = path this.#logsMax = logsMax this.#timing = timing @@ -66,8 +63,7 @@ class LogFiles { log.verbose('logfile', `logs-max:${logsMax} dir:${this.#path}`) - // Write the contents of our array buffer to our new file stream and - // set that as the new log logstream for future writes + // Write the contents of our array buffer to our new file stream and set that as the new log logstream for future writes // if logs max is 0 then the user does not want a log file if (this.#logsMax > 0) { const initialFile = this.#openLogFile() @@ -106,8 +102,7 @@ class LogFiles { } #logHandler = (level, ...args) => { - // Ignore pause and resume events since we - // write everything to the log file + // Ignore pause and resume events since we write everything to the log file if (level === 'pause' || level === 'resume') { return } @@ -118,8 +113,7 @@ class LogFiles { } if (this.#isBuffered) { - // Cant do anything but buffer the output if we don't - // have a file stream yet + // Cant do anything but buffer the output if we don't have a file stream yet this.#logStream.push([level, ...args]) return } @@ -166,43 +160,35 @@ class LogFiles { try { // Pad with zeros so that our log files are always sorted properly - // We never want to write files ending in `-9.log` and `-10.log` because - // log file cleaning is done by deleting the oldest so in this example - // `-10.log` would be deleted next + // We never want to write files ending in `-9.log` and `-10.log` because log file cleaning is done by deleting the oldest. + // So in this example `-10.log` would be deleted next. const f = this.#getLogFilePath(padZero(count, this.#MAX_FILES_PER_PROCESS)) - // Some effort was made to make the async, but we need to write logs - // during process.on('exit') which has to be synchronous. So in order - // to never drop log messages, it is easiest to make it sync all the time - // and this was measured to be about 1.5% slower for 40k lines of output + // Some effort was made to make the async, but we need to write logs during process.on('exit') which has to be synchronous. + // So in order to never drop log messages, it is easiest to make it sync all the time and this was measured to be about 1.5% slower for 40k lines of output const logStream = new fsMiniPass.WriteStreamSync(f, { flags: 'a' }) if (count > 0) { - // Reset file log count if we are opening - // after our first file + // Reset file log count if we are opening after our first file this.#fileLogCount = 0 } this.#files.push(logStream.path) return logStream } catch (e) { - // If the user has a readonly logdir then we don't want to - // warn this on every command so it should be verbose + // If the user has a readonly logdir then we don't want to warn this on every command so it should be verbose log.verbose('logfile', `could not be created: ${e}`) } } async #cleanLogs () { - // module to clean out the old log files - // this is a best-effort attempt. if a rm fails, we just - // log a message about it and move on. We do return a - // Promise that succeeds when we've tried to delete everything, - // just for the benefit of testing this function properly. + // module to clean out the old log files this is a best-effort attempt. + // if a rm fails, we just log a message about it and move on. + // We do return a Promise that succeeds when we've tried to delete everything, just for the benefit of testing this function properly. try { const logPath = this.#getLogFilePath() const patternFileName = basename(logPath) // tell glob to only match digits .replace(/\d/g, 'd') - // Handle the old (prior to 8.2.0) log file names which did not have a - // counter suffix + // Handle the old (prior to 8.2.0) log file names which did not have a counter suffix .replace('-.log', '') let files = await fs.readdir( diff --git a/deps/npm/lib/utils/oidc.js b/deps/npm/lib/utils/oidc.js index 690bc96dba4a4a..00f32c642621c6 100644 --- a/deps/npm/lib/utils/oidc.js +++ b/deps/npm/lib/utils/oidc.js @@ -8,9 +8,8 @@ const libaccess = require('libnpmaccess') /** * Handles OpenID Connect (OIDC) token retrieval and exchange for CI environments. * - * This function is designed to work in Continuous Integration (CI) environments such as GitHub Actions, - * GitLab, and CircleCI. It retrieves an OIDC token from the CI environment, exchanges it for an npm token, and - * sets the token in the provided configuration for authentication with the npm registry. + * This function is designed to work in Continuous Integration (CI) environments such as GitHub Actions, GitLab, and CircleCI. + * It retrieves an OIDC token from the CI environment, exchanges it for an npm token, and sets the token in the provided configuration for authentication with the npm registry. * * This function is intended to never throw, as it mutates the state of the `opts` and `config` objects on success. * OIDC is always an optional feature, and the function should not throw if OIDC is not configured by the registry. @@ -70,8 +69,7 @@ async function oidc ({ packageName, registry, opts, config }) { } /** - * The specification for an audience is `npm:registry.npmjs.org`, - * where "registry.npmjs.org" can be any supported registry. + * The specification for an audience is `npm:registry.npmjs.org`, where "registry.npmjs.org" can be any supported registry. */ const audience = `npm:${new URL(registry).hostname}` const url = new URL(process.env.ACTIONS_ID_TOKEN_REQUEST_URL) @@ -135,9 +133,8 @@ async function oidc ({ packageName, registry, opts, config }) { } /* - * The "opts" object is a clone of npm.flatOptions and is passed through the `publish` command, - * eventually reaching `otplease`. To ensure the token is accessible during the publishing process, - * it must be directly attached to the `opts` object. + * The "opts" object is a clone of npm.flatOptions and is passed through the `publish` command, eventually reaching `otplease`. + * To ensure the token is accessible during the publishing process, it must be directly attached to the `opts` object. * Additionally, the token is required by the "live" configuration or getters within `config`. */ opts[authTokenKey] = response.token diff --git a/deps/npm/lib/utils/open-url.js b/deps/npm/lib/utils/open-url.js index 9aa04b13822776..7d25a4bef6cc48 100644 --- a/deps/npm/lib/utils/open-url.js +++ b/deps/npm/lib/utils/open-url.js @@ -34,8 +34,7 @@ const openUrl = async (npm, url, title, isFile) => { return } - // We pass this in as true from the help command so we know we don't have to - // check the protocol + // We pass this in as true from the help command so we know we don't have to check the protocol if (!isFile) { assertValidUrl(url) } @@ -87,8 +86,7 @@ const openUrlPrompt = async (npm, url, title, prompt, { signal }) => { } } -// Rearrange arguments and return a function that takes the two arguments -// returned from the npm-profile methods that take an opener +// Rearrange arguments and return a function that takes the two arguments returned from the npm-profile methods that take an opener const createOpener = (npm, title, prompt = 'Press ENTER to open in the browser...') => (url, opts) => openUrlPrompt(npm, url, title, prompt, opts) diff --git a/deps/npm/lib/utils/ping.js b/deps/npm/lib/utils/ping.js index 3d47ca1ecaf545..92a7a7b6c68672 100644 --- a/deps/npm/lib/utils/ping.js +++ b/deps/npm/lib/utils/ping.js @@ -1,5 +1,4 @@ -// ping the npm registry -// used by the ping and doctor commands +// ping the npm registry used by the ping and doctor commands const npmFetch = require('npm-registry-fetch') module.exports = async (flatOptions) => { const res = await npmFetch('/-/ping', { ...flatOptions, cache: false }) diff --git a/deps/npm/lib/utils/queryable.js b/deps/npm/lib/utils/queryable.js index 7e51194eaf1fc7..e18222e83fcfa6 100644 --- a/deps/npm/lib/utils/queryable.js +++ b/deps/npm/lib/utils/queryable.js @@ -4,9 +4,8 @@ const _append = Symbol('append') const sqBracketsMatcher = str => str.match(/(.+)\[([^\]]+)\]\.?(.*)$/) -// replaces any occurrence of an empty-brackets (e.g: []) with a special -// Symbol(append) to represent it, this is going to be useful for the setter -// method that will push values to the end of the array when finding these +// replaces any occurrence of an empty-brackets (e.g: []) with a special Symbol(append) to represent it +// this is going to be useful for the setter method that will push values to the end of the array when finding these const replaceAppendSymbols = str => { const matchEmptyBracket = str.match(/^(.*)\[\]\.?(.*)$/) @@ -28,22 +27,17 @@ const parseKeys = key => { if (index) { const preSqBracketPortion = index[1] - // we want to have a `new String` wrapper here in order to differentiate - // between multiple occurrences of the same string, e.g: - // foo.bar[foo.bar] should split into { foo: { bar: { 'foo.bar': {} } } + // we want to have a `new String` wrapper here in order to differentiate between multiple occurrences of the same string, + // e.g: foo.bar[foo.bar] should split into { foo: { bar: { 'foo.bar': {} } } /* eslint-disable-next-line no-new-wrappers */ const foundKey = new String(index[2]) const postSqBracketPortion = index[3] - // we keep track of items found during this step to make sure - // we don't try to split-separate keys that were defined within - // square brackets, since the key name itself might contain dots + // we keep track of items found during this step to make sure we don't try to split-separate keys that were defined within square brackets, since the key name itself might contain dots sqBracketItems.add(foundKey) - // returns an array that contains either dot-separate items (that will - // be split apart during the next step OR the fully parsed keys - // read from square brackets, e.g: - // foo.bar[1.0.0].a.b -> ['foo.bar', '1.0.0', 'a.b'] + // returns an array that contains either dot-separate items (that will be split apart during the next step OR the fully parsed keys read from square brackets + // e.g: foo.bar[1.0.0].a.b -> ['foo.bar', '1.0.0', 'a.b'] return [ ...parseSqBrackets(preSqBracketPortion), foundKey, @@ -51,22 +45,19 @@ const parseKeys = key => { ] } - // at the end of parsing, any usage of the special empty-bracket syntax - // (e.g: foo.array[]) has not yet been parsed, here we'll take care - // of parsing it and adding a special symbol to represent it in - // the resulting list of keys + // at the end of parsing, any usage of the special empty-bracket syntax (e.g: foo.array[]) has not yet been parsed + // here we'll take care of parsing it and adding a special symbol to represent it in the resulting list of keys return replaceAppendSymbols(str) } const res = [] - // starts by parsing items defined as square brackets, those might be - // representing properties that have a dot in the name or just array - // indexes, e.g: foo[1.0.0] or list[0] + // starts by parsing items defined as square brackets + // those might be representing properties that have a dot in the name or just array indexes + // e.g: foo[1.0.0] or list[0] const sqBracketKeys = parseSqBrackets(key.trim()) for (const k of sqBracketKeys) { - // keys parsed from square brackets should just be added to list of - // resulting keys as they might have dots as part of the key + // keys parsed from square brackets should just be added to list of resulting keys as they might have dots as part of the key if (sqBracketItems.has(k)) { res.push(k) } else { @@ -78,15 +69,12 @@ const parseKeys = key => { } } - // returns an ordered list of strings in which each entry - // represents a key in an object defined by the previous entry + // returns an ordered list of strings in which each entry represents a key in an object defined by the previous entry return res } const getter = ({ data, key }, { unwrapSingleItemArrays = true } = {}) => { - // keys are a list in which each entry represents the name of - // a property that should be walked through the object in order to - // return the final found value + // keys are a list in which each entry represents the name of a property that should be walked through the object in order to return the final found value const keys = parseKeys(key) let _data = data let label = '' @@ -99,10 +87,8 @@ const getter = ({ data, key }, { unwrapSingleItemArrays = true } = {}) => { }) } - // extra logic to take into account printing array, along with its - // special syntax in which using a dot-sep property name after an - // array will expand it's results, e.g: - // arr.name -> arr[0].name=value, arr[1].name=value, ... + // extra logic to take into account printing array, along with its special syntax in which using a dot-sep property name after an array will expand it's results + // e.g: arr.name -> arr[0].name=value, arr[1].name=value, ... const maybeIndex = Number(k) if (Array.isArray(_data) && !Number.isInteger(maybeIndex)) { _data = _data.reduce((acc, i, index) => { @@ -120,8 +106,7 @@ const getter = ({ data, key }, { unwrapSingleItemArrays = true } = {}) => { label += k } - // these are some legacy expectations from - // the old API consumed by lib/view.js + // these are some legacy expectations from the old API consumed by lib/view.js if (unwrapSingleItemArrays && Array.isArray(_data) && _data.length <= 1) { _data = _data[0] } @@ -132,14 +117,13 @@ const getter = ({ data, key }, { unwrapSingleItemArrays = true } = {}) => { } const setter = ({ data, key, value, force }) => { - // setter goes to recursively transform the provided data obj, - // setting properties from the list of parsed keys, e.g: - // ['foo', 'bar', 'baz'] -> { foo: { bar: { baz: {} } } + // setter goes to recursively transform the provided data obj + // setting properties from the list of parsed keys + // e.g: ['foo', 'bar', 'baz'] -> { foo: { bar: { baz: {} } } const keys = parseKeys(key) const setKeys = (_data, _key) => { - // handles array indexes, converting valid integers to numbers, - // note that occurrences of Symbol(append) will throw, - // so we just ignore these for now + // handles array indexes, converting valid integers to numbers + // note that occurrences of Symbol(append) will throw so we just ignore these for now let maybeIndex = Number.NaN try { maybeIndex = Number(_key) @@ -150,23 +134,21 @@ const setter = ({ data, key, value, force }) => { _key = maybeIndex } - // creates new array in case key is an index - // and the array obj is not yet defined + // creates new array in case key is an index and the array obj is not yet defined const keyIsAnArrayIndex = _key === maybeIndex || _key === _append const dataHasNoItems = !Object.keys(_data).length if (keyIsAnArrayIndex && dataHasNoItems && !Array.isArray(_data)) { _data = [] } - // converting from array to an object is also possible, in case the - // user is using force mode, we should also convert existing arrays - // to an empty object if the current _data is an array + // converting from array to an object is also possible, in case the user is using force mode + // we should also convert existing arrays to an empty object if the current _data is an array if (force && Array.isArray(_data) && !keyIsAnArrayIndex) { _data = { ..._data } } - // the _append key is a special key that is used to represent - // the empty-bracket notation, e.g: arr[] -> arr[arr.length] + // the _append key is a special key that is used to represent the empty-bracket notation + // e.g: arr[] -> arr[arr.length] if (_key === _append) { if (!Array.isArray(_data)) { throw Object.assign(new Error(`Can't use append syntax in non-Array element`), { @@ -176,14 +158,12 @@ const setter = ({ data, key, value, force }) => { _key = _data.length } - // retrieves the next data object to recursively iterate on, + // retrieves the next data object to recursively iterate on // throws if trying to override a literal value or add props to an array const next = () => { const haveContents = !force && _data[_key] != null && value !== _delete const shouldNotOverrideLiteralValue = !(typeof _data[_key] === 'object') - // if the next obj to recurse is an array and the next key to be - // appended to the resulting obj is not an array index, then it - // should throw since we can't append arbitrary props to arrays + // if the next obj to recurse is an array and the next key to be appended to the resulting obj is not an array index, then it should throw since we can't append arbitrary props to arrays const shouldNotAddPropsToArrays = typeof keys[0] !== 'symbol' && Array.isArray(_data[_key]) && Number.isNaN(Number(keys[0])) @@ -205,9 +185,8 @@ const setter = ({ data, key, value, force }) => { return typeof _data[_key] === 'object' ? _data[_key] || {} : {} } - // sets items from the parsed array of keys as objects, recurses to - // setKeys in case there are still items to be handled; otherwise, it - // just sets the original value set by the user + // sets items from the parsed array of keys as objects, recurses to setKeys in case there are still items to be handled + // otherwise, it just sets the original value set by the user if (keys.length) { _data[_key] = setKeys(next(), keys.shift()) } else { @@ -246,9 +225,8 @@ class Queryable { } query (queries, opts) { - // this ugly interface here is meant to be a compatibility layer - // with the legacy API lib/view.js is consuming, if at some point - // we refactor that command then we can revisit making this nicer + // this ugly interface here is meant to be a compatibility layer with the legacy API lib/view.js is consuming + // if at some point we refactor that command then we can revisit making this nicer if (queries === Queryable.ALL) { return { [Queryable.ALL]: this.#data } } @@ -278,8 +256,7 @@ class Queryable { } } - // creates objects along the way for the provided `query` parameter - // and assigns `value` to the last property of the query chain + // creates objects along the way for the provided `query` parameter and assigns `value` to the last property of the query chain set (query, value, { force } = {}) { setter({ data: this.#data, diff --git a/deps/npm/lib/utils/reify-finish.js b/deps/npm/lib/utils/reify-finish.js index 410c19730cdf4c..5e1330f4937bbd 100644 --- a/deps/npm/lib/utils/reify-finish.js +++ b/deps/npm/lib/utils/reify-finish.js @@ -4,30 +4,18 @@ const { writeFile } = require('node:fs/promises') const { resolve } = require('node:path') const reifyFinish = async (npm, arb) => { - await saveBuiltinConfig(npm, arb) - reifyOutput(npm, arb) -} - -const saveBuiltinConfig = async (npm, arb) => { - const { options: { global }, actualTree } = arb - if (!global) { - return - } - - // if we are using a builtin config, and just installed npm as - // a top-level global package, we have to preserve that config. - const npmNode = actualTree.inventory.get('node_modules/npm') - if (!npmNode) { - return + // if we are using a builtin config, and just installed npm as a top-level global package, we have to preserve that config. + if (arb.options.global) { + const npmNode = arb.actualTree.inventory.get('node_modules/npm') + if (npmNode) { + const builtinConf = npm.config.data.get('builtin') + if (!builtinConf.loadError) { + const content = ini.stringify(builtinConf.raw).trim() + '\n' + await writeFile(resolve(npmNode.path, 'npmrc'), content) + } + } } - - const builtinConf = npm.config.data.get('builtin') - if (builtinConf.loadError) { - return - } - - const content = ini.stringify(builtinConf.raw).trim() + '\n' - await writeFile(resolve(npmNode.path, 'npmrc'), content) + reifyOutput(npm, arb) } module.exports = reifyFinish diff --git a/deps/npm/lib/utils/reify-output.js b/deps/npm/lib/utils/reify-output.js index 48a5525d87f802..99427faaf66488 100644 --- a/deps/npm/lib/utils/reify-output.js +++ b/deps/npm/lib/utils/reify-output.js @@ -20,13 +20,10 @@ const auditError = require('./audit-error.js') const reifyOutput = (npm, arb) => { const { diff, actualTree } = arb - // note: fails and crashes if we're running audit fix and there was an error - // which is a good thing, because there's no point printing all this other - // stuff in that case! + // note: fails and crashes if we're running audit fix and there was an error which is a good thing, because there's no point printing all this other stuff in that case! const auditReport = auditError(npm, arb.auditReport) ? null : arb.auditReport - // don't print any info in --silent mode, but we still need to - // set the exitCode properly from the audit report, if we have one. + // don't print any info in --silent mode, but we still need to set the exitCode properly from the audit report, if we have one. if (npm.silent) { getAuditReport(npm, auditReport) return @@ -124,12 +121,10 @@ const reifyOutput = (npm, arb) => { } } -// if we're running `npm audit fix`, then we print the full audit report -// at the end if there's still stuff, because it's silly for `npm audit` -// to tell you to run `npm audit` for details. otherwise, use the summary -// report. if we get here, we know it's not quiet or json. -// If the loglevel is silent, then we just run the report -// to get the exitCode set appropriately. +// if we're running `npm audit fix`, then we print the full audit report at the end if there's still stuff, because it's silly for `npm audit` to tell you to run `npm audit` for details. +// otherwise, use the summary report. +// if we get here, we know it's not quiet or json. +// If the loglevel is silent, then we just run the report to get the exitCode set appropriately. const printAuditReport = (npm, report) => { const res = getAuditReport(npm, report) if (!res || !res.report) { @@ -143,8 +138,8 @@ const getAuditReport = (npm, report) => { return } - // when in silent mode, we print nothing. the JSON output is - // going to just JSON.stringify() the report object. + // when in silent mode, we print nothing. + // the JSON output is going to just JSON.stringify() the report object. const reporter = npm.silent ? 'quiet' : npm.flatOptions.json ? 'quiet' : npm.command !== 'audit' ? 'install' diff --git a/deps/npm/lib/utils/update-workspaces.js b/deps/npm/lib/utils/update-workspaces.js index 892f366e9980a2..c44abfba7bd108 100644 --- a/deps/npm/lib/utils/update-workspaces.js +++ b/deps/npm/lib/utils/update-workspaces.js @@ -13,16 +13,13 @@ async function updateWorkspaces ({ return } - // default behavior is to not save by default in order to avoid - // race condition problems when publishing multiple workspaces - // that have dependencies on one another, it might still be useful - // in some cases, which then need to set --save + // default behavior is to not save by default in order to avoid race condition problems when publishing multiple workspaces that have dependencies on one another + // it might still be useful in some cases, which then need to set --save const save = config.isDefault('save') ? false : config.get('save') - // runs a minimalistic reify update, targeting only the workspaces - // that had version updates and skipping fund/audit/save + // runs a minimalistic reify update, targeting only the workspaces that had version updates and skipping fund/audit/save const opts = { ...flatOptions, audit: false, diff --git a/deps/npm/lib/utils/verify-signatures.js b/deps/npm/lib/utils/verify-signatures.js index c9b39591eadc8a..a4824d86d13ab6 100644 --- a/deps/npm/lib/utils/verify-signatures.js +++ b/deps/npm/lib/utils/verify-signatures.js @@ -17,6 +17,7 @@ class VerifySignatures { this.invalid = [] this.missing = [] this.checkedPackages = new Set() + this.verified = [] this.auditedWithKeysCount = 0 this.verifiedSignatureCount = 0 this.verifiedAttestationCount = 0 @@ -43,8 +44,7 @@ class VerifySignatures { log.verbose('verifying registry signatures') await pMap(edges, (e) => this.getVerifiedInfo(e), { concurrency: 20, stopOnError: true }) - // Didn't find any dependencies that could be verified, e.g. only local - // deps, missing version, not on a registry etc. + // Didn't find any dependencies that could be verified, e.g. only local deps, missing version, not on a registry etc. if (!this.auditedWithKeysCount && !this.verifiedAttestationCount) { throw new Error('found no dependencies to audit that were installed from ' + 'a supported registry') @@ -60,7 +60,11 @@ class VerifySignatures { } if (this.npm.config.get('json')) { - output.buffer({ invalid, missing }) + const result = { invalid, missing } + if (this.npm.config.get('include-attestations')) { + result.verified = this.verified + } + output.buffer(result) return } const end = process.hrtime.bigint() @@ -88,6 +92,9 @@ class VerifySignatures { } else { output.standard(`${this.verifiedAttestationCount} packages have ${verifiedBold} attestations`) } + if (!this.npm.config.get('include-attestations')) { + output.standard('(use --json --include-attestations to view attestation details)') + } output.standard() } @@ -289,6 +296,7 @@ class VerifySignatures { _integrity: integrity, _signatures, _attestations, + _attestationBundles, _resolved: resolved, } = await pacote.manifest(`${name}@${version}`, { verifySignatures: true, @@ -301,6 +309,7 @@ class VerifySignatures { integrity, signatures, attestations: _attestations, + attestationBundles: _attestationBundles, resolved, } return result @@ -318,17 +327,15 @@ class VerifySignatures { } this.checkedPackages.add(location) - // We only "audit" or verify the signature, or the presence of it, on - // packages whose registry returns signing keys + // We only "audit" or verify the signature, or the presence of it, on packages whose registry returns signing keys const keys = this.keys.get(registry) || [] if (keys.length) { this.auditedWithKeysCount += 1 } try { - const { integrity, signatures, attestations, resolved } = await this.verifySignatures( - name, version, registry - ) + const { integrity, signatures, attestations, attestationBundles, resolved } = + await this.verifySignatures(name, version, registry) // Currently we only care about missing signatures on registries that provide a public key // We could make this configurable in the future with a strict/paranoid mode @@ -345,11 +352,19 @@ class VerifySignatures { }) } - // Track verified attestations separately to registry signatures, as all - // packages on registries with signing keys are expected to have registry - // signatures, but not all packages have provenance and publish attestations. + // Track verified attestations separately to registry signatures, as all packages on registries with signing keys are expected to have registry signatures, but not all packages have provenance and publish attestations. if (attestations) { this.verifiedAttestationCount += 1 + if (this.npm.config.get('include-attestations')) { + this.verified.push({ + name, + version, + location, + registry, + attestations, + attestationBundles, + }) + } } } catch (e) { if (e.code === 'EINTEGRITYSIGNATURE' || e.code === 'EATTESTATIONVERIFY') { diff --git a/deps/npm/man/man1/npm-access.1 b/deps/npm/man/man1/npm-access.1 index 56bda5adf7c1a7..fe5817bd028550 100644 --- a/deps/npm/man/man1/npm-access.1 +++ b/deps/npm/man/man1/npm-access.1 @@ -1,4 +1,4 @@ -.TH "NPM-ACCESS" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-ACCESS" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-access\fR - Set access level on published packages .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-adduser.1 b/deps/npm/man/man1/npm-adduser.1 index b0a8a368f157a6..ef295a68a0448e 100644 --- a/deps/npm/man/man1/npm-adduser.1 +++ b/deps/npm/man/man1/npm-adduser.1 @@ -1,4 +1,4 @@ -.TH "NPM-ADDUSER" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-ADDUSER" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-adduser\fR - Add a registry user account .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-audit.1 b/deps/npm/man/man1/npm-audit.1 index ae1e4ff9c846ed..e2547bf58265bc 100644 --- a/deps/npm/man/man1/npm-audit.1 +++ b/deps/npm/man/man1/npm-audit.1 @@ -1,4 +1,4 @@ -.TH "NPM-AUDIT" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-AUDIT" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-audit\fR - Run a security audit .SS "Synopsis" @@ -34,6 +34,16 @@ $ npm audit signatures .P The \fBaudit signatures\fR command will also verify the provenance attestations of downloaded packages. Because provenance attestations are such a new feature, security features may be added to (or changed in) the attestation format over time. To ensure that you're always able to verify attestation signatures check that you're running the latest version of the npm CLI. Please note this often means updating npm beyond the version that ships with Node.js. .P +To include the full sigstore attestation bundles in JSON output, use: +.P +.RS 2 +.nf +$ npm audit signatures --json --include-attestations +.fi +.RE +.P +This adds a \fBverified\fR array to the JSON output containing the attestation bundles (DSSE envelopes, verification material, and transparency log entries) for each verified package. +.P The npm CLI supports registry signatures and signing keys provided by any registry if the following conventions are followed: .RS 0 .IP 1. 4 @@ -369,6 +379,16 @@ Type: Boolean If true, npm does not run scripts specified in package.json files. .P Note that commands explicitly intended to run a particular script, such as \fBnpm start\fR, \fBnpm stop\fR, \fBnpm restart\fR, \fBnpm test\fR, and \fBnpm run\fR will still run their intended script if \fBignore-scripts\fR is set, but they will \fInot\fR run any pre- or post-scripts. +.SS "\fBinclude-attestations\fR" +.RS 0 +.IP \(bu 4 +Default: false +.IP \(bu 4 +Type: Boolean +.RE 0 + +.P +When used with \fBnpm audit signatures --json\fR, includes the full sigstore attestation bundles in the JSON output for each verified package. The bundles contain DSSE envelopes, verification material, and transparency log entries. .SS "\fBworkspace\fR" .RS 0 .IP \(bu 4 diff --git a/deps/npm/man/man1/npm-bugs.1 b/deps/npm/man/man1/npm-bugs.1 index 24106ee21fe71e..fa16e14c8d1419 100644 --- a/deps/npm/man/man1/npm-bugs.1 +++ b/deps/npm/man/man1/npm-bugs.1 @@ -1,4 +1,4 @@ -.TH "NPM-BUGS" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-BUGS" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-bugs\fR - Report bugs for a package in a web browser .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-cache.1 b/deps/npm/man/man1/npm-cache.1 index ac8ce843afa6ef..4bbc439ed78a0a 100644 --- a/deps/npm/man/man1/npm-cache.1 +++ b/deps/npm/man/man1/npm-cache.1 @@ -1,4 +1,4 @@ -.TH "NPM-CACHE" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-CACHE" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-cache\fR - Manipulates packages cache .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-ci.1 b/deps/npm/man/man1/npm-ci.1 index 7c1a4c33f5a5fb..97528d31e77c07 100644 --- a/deps/npm/man/man1/npm-ci.1 +++ b/deps/npm/man/man1/npm-ci.1 @@ -1,4 +1,4 @@ -.TH "NPM-CI" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-CI" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-ci\fR - Clean install a project .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-completion.1 b/deps/npm/man/man1/npm-completion.1 index 858399832a39e1..7996ae51424e02 100644 --- a/deps/npm/man/man1/npm-completion.1 +++ b/deps/npm/man/man1/npm-completion.1 @@ -1,4 +1,4 @@ -.TH "NPM-COMPLETION" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-COMPLETION" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-completion\fR - Tab Completion for npm .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-config.1 b/deps/npm/man/man1/npm-config.1 index 4cb726ffd2cdab..29621e37b88807 100644 --- a/deps/npm/man/man1/npm-config.1 +++ b/deps/npm/man/man1/npm-config.1 @@ -1,4 +1,4 @@ -.TH "NPM-CONFIG" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-CONFIG" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-config\fR - Manage the npm configuration files .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-dedupe.1 b/deps/npm/man/man1/npm-dedupe.1 index 69b8f89e831765..fbf53bfbedbc28 100644 --- a/deps/npm/man/man1/npm-dedupe.1 +++ b/deps/npm/man/man1/npm-dedupe.1 @@ -1,4 +1,4 @@ -.TH "NPM-DEDUPE" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-DEDUPE" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-dedupe\fR - Reduce duplication in the package tree .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-deprecate.1 b/deps/npm/man/man1/npm-deprecate.1 index c81e6f048c0e2a..092e0270c8040e 100644 --- a/deps/npm/man/man1/npm-deprecate.1 +++ b/deps/npm/man/man1/npm-deprecate.1 @@ -1,4 +1,4 @@ -.TH "NPM-DEPRECATE" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-DEPRECATE" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-deprecate\fR - Deprecate a version of a package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-diff.1 b/deps/npm/man/man1/npm-diff.1 index e502ea264ef881..1dd968ae5d644c 100644 --- a/deps/npm/man/man1/npm-diff.1 +++ b/deps/npm/man/man1/npm-diff.1 @@ -1,4 +1,4 @@ -.TH "NPM-DIFF" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-DIFF" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-diff\fR - The registry diff command .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-dist-tag.1 b/deps/npm/man/man1/npm-dist-tag.1 index 8e3f3c1ca8eb15..6670e19b8a36f9 100644 --- a/deps/npm/man/man1/npm-dist-tag.1 +++ b/deps/npm/man/man1/npm-dist-tag.1 @@ -1,4 +1,4 @@ -.TH "NPM-DIST-TAG" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-DIST-TAG" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-dist-tag\fR - Modify package distribution tags .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-docs.1 b/deps/npm/man/man1/npm-docs.1 index ad43cda739b107..d8c56b505a97e1 100644 --- a/deps/npm/man/man1/npm-docs.1 +++ b/deps/npm/man/man1/npm-docs.1 @@ -1,4 +1,4 @@ -.TH "NPM-DOCS" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-DOCS" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-docs\fR - Open documentation for a package in a web browser .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-doctor.1 b/deps/npm/man/man1/npm-doctor.1 index 8d5bda4832eb20..1467c59172d481 100644 --- a/deps/npm/man/man1/npm-doctor.1 +++ b/deps/npm/man/man1/npm-doctor.1 @@ -1,4 +1,4 @@ -.TH "NPM-DOCTOR" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-DOCTOR" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-doctor\fR - Check the health of your npm environment .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-edit.1 b/deps/npm/man/man1/npm-edit.1 index 35c025535a70fc..f13a69a4a7fb60 100644 --- a/deps/npm/man/man1/npm-edit.1 +++ b/deps/npm/man/man1/npm-edit.1 @@ -1,4 +1,4 @@ -.TH "NPM-EDIT" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-EDIT" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-edit\fR - Edit an installed package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-exec.1 b/deps/npm/man/man1/npm-exec.1 index c4ae1db70f6f0d..267d42cd4c7979 100644 --- a/deps/npm/man/man1/npm-exec.1 +++ b/deps/npm/man/man1/npm-exec.1 @@ -1,4 +1,4 @@ -.TH "NPM-EXEC" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-EXEC" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-exec\fR - Run a command from a local or remote npm package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-explain.1 b/deps/npm/man/man1/npm-explain.1 index 99b4f567a5a4bb..ee9fae25c4f827 100644 --- a/deps/npm/man/man1/npm-explain.1 +++ b/deps/npm/man/man1/npm-explain.1 @@ -1,4 +1,4 @@ -.TH "NPM-EXPLAIN" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-EXPLAIN" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-explain\fR - Explain installed packages .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-explore.1 b/deps/npm/man/man1/npm-explore.1 index 6d508bbaf80d46..39c3b059382285 100644 --- a/deps/npm/man/man1/npm-explore.1 +++ b/deps/npm/man/man1/npm-explore.1 @@ -1,4 +1,4 @@ -.TH "NPM-EXPLORE" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-EXPLORE" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-explore\fR - Browse an installed package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-find-dupes.1 b/deps/npm/man/man1/npm-find-dupes.1 index afea51be5d5864..c607a2473d4869 100644 --- a/deps/npm/man/man1/npm-find-dupes.1 +++ b/deps/npm/man/man1/npm-find-dupes.1 @@ -1,4 +1,4 @@ -.TH "NPM-FIND-DUPES" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-FIND-DUPES" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-find-dupes\fR - Find duplication in the package tree .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-fund.1 b/deps/npm/man/man1/npm-fund.1 index a4d9c91b177fe1..75120f042dfbb4 100644 --- a/deps/npm/man/man1/npm-fund.1 +++ b/deps/npm/man/man1/npm-fund.1 @@ -1,4 +1,4 @@ -.TH "NPM-FUND" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-FUND" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-fund\fR - Retrieve funding information .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-get.1 b/deps/npm/man/man1/npm-get.1 index 7c436651daa492..ed7e2133a83270 100644 --- a/deps/npm/man/man1/npm-get.1 +++ b/deps/npm/man/man1/npm-get.1 @@ -1,4 +1,4 @@ -.TH "NPM-GET" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-GET" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-get\fR - Get a value from the npm configuration .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-help-search.1 b/deps/npm/man/man1/npm-help-search.1 index c49353ee685556..171b3563193162 100644 --- a/deps/npm/man/man1/npm-help-search.1 +++ b/deps/npm/man/man1/npm-help-search.1 @@ -1,4 +1,4 @@ -.TH "NPM-HELP-SEARCH" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-HELP-SEARCH" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-help-search\fR - Search npm help documentation .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-help.1 b/deps/npm/man/man1/npm-help.1 index 7c208d49e76a57..2dcdb3758e1189 100644 --- a/deps/npm/man/man1/npm-help.1 +++ b/deps/npm/man/man1/npm-help.1 @@ -1,4 +1,4 @@ -.TH "NPM-HELP" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-HELP" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-help\fR - Get help on npm .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-init.1 b/deps/npm/man/man1/npm-init.1 index 16f1d1980b4725..101d656bfb5ea4 100644 --- a/deps/npm/man/man1/npm-init.1 +++ b/deps/npm/man/man1/npm-init.1 @@ -1,4 +1,4 @@ -.TH "NPM-INIT" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-INIT" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-init\fR - Create a package.json file .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-install-ci-test.1 b/deps/npm/man/man1/npm-install-ci-test.1 index 45ef15113df761..c002a1303b98f3 100644 --- a/deps/npm/man/man1/npm-install-ci-test.1 +++ b/deps/npm/man/man1/npm-install-ci-test.1 @@ -1,4 +1,4 @@ -.TH "NPM-INSTALL-CI-TEST" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-INSTALL-CI-TEST" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-install-ci-test\fR - Install a project with a clean slate and run tests .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-install-test.1 b/deps/npm/man/man1/npm-install-test.1 index 82e58aaf14e043..622c89df74af5d 100644 --- a/deps/npm/man/man1/npm-install-test.1 +++ b/deps/npm/man/man1/npm-install-test.1 @@ -1,4 +1,4 @@ -.TH "NPM-INSTALL-TEST" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-INSTALL-TEST" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-install-test\fR - Install package(s) and run tests .SS "Synopsis" @@ -243,6 +243,8 @@ If set, npm will build the npm tree such that only versions that were available This flag is a complement to \fBbefore\fR, which accepts an exact date instead of a relative number of days. .P This config cannot be used with: \fBbefore\fR +.P +This value is not exported to the environment for child processes. .SS "\fBbin-links\fR" .RS 0 .IP \(bu 4 diff --git a/deps/npm/man/man1/npm-install.1 b/deps/npm/man/man1/npm-install.1 index 3b40d3633608b2..9221a74d6ec11c 100644 --- a/deps/npm/man/man1/npm-install.1 +++ b/deps/npm/man/man1/npm-install.1 @@ -1,4 +1,4 @@ -.TH "NPM-INSTALL" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-INSTALL" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-install\fR - Install a package .SS "Synopsis" @@ -633,6 +633,8 @@ If set, npm will build the npm tree such that only versions that were available This flag is a complement to \fBbefore\fR, which accepts an exact date instead of a relative number of days. .P This config cannot be used with: \fBbefore\fR +.P +This value is not exported to the environment for child processes. .SS "\fBbin-links\fR" .RS 0 .IP \(bu 4 diff --git a/deps/npm/man/man1/npm-link.1 b/deps/npm/man/man1/npm-link.1 index 4b554a2492751a..855137368a7ec5 100644 --- a/deps/npm/man/man1/npm-link.1 +++ b/deps/npm/man/man1/npm-link.1 @@ -1,4 +1,4 @@ -.TH "NPM-LINK" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-LINK" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-link\fR - Symlink a package folder .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-ll.1 b/deps/npm/man/man1/npm-ll.1 index 712a4b96c37cb5..c0752d0dca049c 100644 --- a/deps/npm/man/man1/npm-ll.1 +++ b/deps/npm/man/man1/npm-ll.1 @@ -1,4 +1,4 @@ -.TH "NPM-LL" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-LL" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-ll\fR - List installed packages .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-login.1 b/deps/npm/man/man1/npm-login.1 index 84ee231156b786..59809a10c7217a 100644 --- a/deps/npm/man/man1/npm-login.1 +++ b/deps/npm/man/man1/npm-login.1 @@ -1,4 +1,4 @@ -.TH "NPM-LOGIN" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-LOGIN" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-login\fR - Login to a registry user account .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-logout.1 b/deps/npm/man/man1/npm-logout.1 index 35fe68417a461e..530d8216fb6a24 100644 --- a/deps/npm/man/man1/npm-logout.1 +++ b/deps/npm/man/man1/npm-logout.1 @@ -1,4 +1,4 @@ -.TH "NPM-LOGOUT" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-LOGOUT" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-logout\fR - Log out of the registry .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-ls.1 b/deps/npm/man/man1/npm-ls.1 index b3028b8dd393ed..51afaf81e0f6c0 100644 --- a/deps/npm/man/man1/npm-ls.1 +++ b/deps/npm/man/man1/npm-ls.1 @@ -1,4 +1,4 @@ -.TH "NPM-LS" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-LS" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-ls\fR - List installed packages .SS "Synopsis" @@ -20,7 +20,7 @@ Positional arguments are \fBname@version-range\fR identifiers, which will limit .P .RS 2 .nf -npm@11.11.0 /path/to/npm +npm@11.12.1 /path/to/npm └─┬ init-package-json@0.0.4 └── promzard@0.1.5 .fi diff --git a/deps/npm/man/man1/npm-org.1 b/deps/npm/man/man1/npm-org.1 index 83fb117858ec88..5aa0c33d6dad71 100644 --- a/deps/npm/man/man1/npm-org.1 +++ b/deps/npm/man/man1/npm-org.1 @@ -1,4 +1,4 @@ -.TH "NPM-ORG" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-ORG" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-org\fR - Manage orgs .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-outdated.1 b/deps/npm/man/man1/npm-outdated.1 index 3c0e64bdf84935..adaf686880c67f 100644 --- a/deps/npm/man/man1/npm-outdated.1 +++ b/deps/npm/man/man1/npm-outdated.1 @@ -1,4 +1,4 @@ -.TH "NPM-OUTDATED" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-OUTDATED" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-outdated\fR - Check for outdated packages .SS "Synopsis" @@ -195,6 +195,8 @@ If set, npm will build the npm tree such that only versions that were available This flag is a complement to \fBbefore\fR, which accepts an exact date instead of a relative number of days. .P This config cannot be used with: \fBbefore\fR +.P +This value is not exported to the environment for child processes. .SS "See Also" .RS 0 .IP \(bu 4 diff --git a/deps/npm/man/man1/npm-owner.1 b/deps/npm/man/man1/npm-owner.1 index 81b2fec8ff27ac..29e15fcd5cbc10 100644 --- a/deps/npm/man/man1/npm-owner.1 +++ b/deps/npm/man/man1/npm-owner.1 @@ -1,4 +1,4 @@ -.TH "NPM-OWNER" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-OWNER" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-owner\fR - Manage package owners .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-pack.1 b/deps/npm/man/man1/npm-pack.1 index 8f5488d7a3b7a6..7e9e44926960cc 100644 --- a/deps/npm/man/man1/npm-pack.1 +++ b/deps/npm/man/man1/npm-pack.1 @@ -1,4 +1,4 @@ -.TH "NPM-PACK" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-PACK" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-pack\fR - Create a tarball from a package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-ping.1 b/deps/npm/man/man1/npm-ping.1 index a80faff74ff914..616d928771c2e6 100644 --- a/deps/npm/man/man1/npm-ping.1 +++ b/deps/npm/man/man1/npm-ping.1 @@ -1,4 +1,4 @@ -.TH "NPM-PING" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-PING" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-ping\fR - Ping npm registry .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-pkg.1 b/deps/npm/man/man1/npm-pkg.1 index 8667ddbe27c6ff..0a7a4a2eda63ce 100644 --- a/deps/npm/man/man1/npm-pkg.1 +++ b/deps/npm/man/man1/npm-pkg.1 @@ -1,4 +1,4 @@ -.TH "NPM-PKG" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-PKG" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-pkg\fR - Manages your package.json .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-prefix.1 b/deps/npm/man/man1/npm-prefix.1 index 6cd9f675b34fb5..58fdc6e0637cf9 100644 --- a/deps/npm/man/man1/npm-prefix.1 +++ b/deps/npm/man/man1/npm-prefix.1 @@ -1,4 +1,4 @@ -.TH "NPM-PREFIX" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-PREFIX" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-prefix\fR - Display prefix .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-profile.1 b/deps/npm/man/man1/npm-profile.1 index 67b1c3170e518f..f4d456a011d2ed 100644 --- a/deps/npm/man/man1/npm-profile.1 +++ b/deps/npm/man/man1/npm-profile.1 @@ -1,4 +1,4 @@ -.TH "NPM-PROFILE" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-PROFILE" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-profile\fR - Change settings on your registry profile .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-prune.1 b/deps/npm/man/man1/npm-prune.1 index 2569575bbb1a28..5cc3651dda1ead 100644 --- a/deps/npm/man/man1/npm-prune.1 +++ b/deps/npm/man/man1/npm-prune.1 @@ -1,4 +1,4 @@ -.TH "NPM-PRUNE" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-PRUNE" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-prune\fR - Remove extraneous packages .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-publish.1 b/deps/npm/man/man1/npm-publish.1 index bab2c123579bb1..305d75cb590968 100644 --- a/deps/npm/man/man1/npm-publish.1 +++ b/deps/npm/man/man1/npm-publish.1 @@ -1,4 +1,4 @@ -.TH "NPM-PUBLISH" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-PUBLISH" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-publish\fR - Publish a package .SS "Synopsis" @@ -65,6 +65,8 @@ f) a \fB<name>\fR that has a "latest" tag satisfying (e) g) a \fB<git remote url>\fR that resolves to (a) .RE 0 +.P +If either (a) or (b) is specified as a relative path, it should begin with an explicit \fB./\fR prefix. .P The publish will fail if the package name and version combination already exists in the specified registry. .P diff --git a/deps/npm/man/man1/npm-query.1 b/deps/npm/man/man1/npm-query.1 index 0811845c1c4ae2..982c771d4c6624 100644 --- a/deps/npm/man/man1/npm-query.1 +++ b/deps/npm/man/man1/npm-query.1 @@ -1,4 +1,4 @@ -.TH "NPM-QUERY" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-QUERY" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-query\fR - Dependency selector query .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-rebuild.1 b/deps/npm/man/man1/npm-rebuild.1 index d138bf51dc91c4..1542cb847a9fd5 100644 --- a/deps/npm/man/man1/npm-rebuild.1 +++ b/deps/npm/man/man1/npm-rebuild.1 @@ -1,4 +1,4 @@ -.TH "NPM-REBUILD" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-REBUILD" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-rebuild\fR - Rebuild a package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-repo.1 b/deps/npm/man/man1/npm-repo.1 index 8746de5cc2ea39..d36c0ae61635b4 100644 --- a/deps/npm/man/man1/npm-repo.1 +++ b/deps/npm/man/man1/npm-repo.1 @@ -1,4 +1,4 @@ -.TH "NPM-REPO" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-REPO" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-repo\fR - Open package repository page in the browser .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-restart.1 b/deps/npm/man/man1/npm-restart.1 index 81a86e23397605..7c4eb5f61d8ef8 100644 --- a/deps/npm/man/man1/npm-restart.1 +++ b/deps/npm/man/man1/npm-restart.1 @@ -1,4 +1,4 @@ -.TH "NPM-RESTART" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-RESTART" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-restart\fR - Restart a package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-root.1 b/deps/npm/man/man1/npm-root.1 index 537d4c306a120f..dec2ae082ab0ea 100644 --- a/deps/npm/man/man1/npm-root.1 +++ b/deps/npm/man/man1/npm-root.1 @@ -1,4 +1,4 @@ -.TH "NPM-ROOT" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-ROOT" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-root\fR - Display npm root .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-run.1 b/deps/npm/man/man1/npm-run.1 index 20a5032fe62a85..226c791c846b26 100644 --- a/deps/npm/man/man1/npm-run.1 +++ b/deps/npm/man/man1/npm-run.1 @@ -1,4 +1,4 @@ -.TH "NPM-RUN" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-RUN" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-run\fR - Run arbitrary package scripts .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-sbom.1 b/deps/npm/man/man1/npm-sbom.1 index 7894164e892e64..3c51502f529880 100644 --- a/deps/npm/man/man1/npm-sbom.1 +++ b/deps/npm/man/man1/npm-sbom.1 @@ -1,4 +1,4 @@ -.TH "NPM-SBOM" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-SBOM" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-sbom\fR - Generate a Software Bill of Materials (SBOM) .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-search.1 b/deps/npm/man/man1/npm-search.1 index 22ef258454ae15..2481037a382c04 100644 --- a/deps/npm/man/man1/npm-search.1 +++ b/deps/npm/man/man1/npm-search.1 @@ -1,4 +1,4 @@ -.TH "NPM-SEARCH" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-SEARCH" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-search\fR - Search for packages .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-set.1 b/deps/npm/man/man1/npm-set.1 index ef485c3521738e..b77a942abfa1f3 100644 --- a/deps/npm/man/man1/npm-set.1 +++ b/deps/npm/man/man1/npm-set.1 @@ -1,4 +1,4 @@ -.TH "NPM-SET" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-SET" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-set\fR - Set a value in the npm configuration .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-shrinkwrap.1 b/deps/npm/man/man1/npm-shrinkwrap.1 index 846b7affa62b6c..5f0ed829e939b9 100644 --- a/deps/npm/man/man1/npm-shrinkwrap.1 +++ b/deps/npm/man/man1/npm-shrinkwrap.1 @@ -1,4 +1,4 @@ -.TH "NPM-SHRINKWRAP" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-SHRINKWRAP" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-shrinkwrap\fR - Lock down dependency versions for publication .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-star.1 b/deps/npm/man/man1/npm-star.1 index bdc27193d061c1..d70556d2c65c51 100644 --- a/deps/npm/man/man1/npm-star.1 +++ b/deps/npm/man/man1/npm-star.1 @@ -1,4 +1,4 @@ -.TH "NPM-STAR" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-STAR" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-star\fR - Mark your favorite packages .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-stars.1 b/deps/npm/man/man1/npm-stars.1 index 6a49b6305e4dd4..11707121f7af14 100644 --- a/deps/npm/man/man1/npm-stars.1 +++ b/deps/npm/man/man1/npm-stars.1 @@ -1,4 +1,4 @@ -.TH "NPM-STARS" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-STARS" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-stars\fR - View packages marked as favorites .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-start.1 b/deps/npm/man/man1/npm-start.1 index 5f783b75308e67..4c138de64d3126 100644 --- a/deps/npm/man/man1/npm-start.1 +++ b/deps/npm/man/man1/npm-start.1 @@ -1,4 +1,4 @@ -.TH "NPM-START" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-START" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-start\fR - Start a package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-stop.1 b/deps/npm/man/man1/npm-stop.1 index b417dd8a7e5e13..386f070a906553 100644 --- a/deps/npm/man/man1/npm-stop.1 +++ b/deps/npm/man/man1/npm-stop.1 @@ -1,4 +1,4 @@ -.TH "NPM-STOP" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-STOP" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-stop\fR - Stop a package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-team.1 b/deps/npm/man/man1/npm-team.1 index b48019f33e5249..f6ed3de147b149 100644 --- a/deps/npm/man/man1/npm-team.1 +++ b/deps/npm/man/man1/npm-team.1 @@ -1,4 +1,4 @@ -.TH "NPM-TEAM" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-TEAM" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-team\fR - Manage organization teams and team memberships .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-test.1 b/deps/npm/man/man1/npm-test.1 index b06b0b1ff8eb11..fe1c15b35895de 100644 --- a/deps/npm/man/man1/npm-test.1 +++ b/deps/npm/man/man1/npm-test.1 @@ -1,4 +1,4 @@ -.TH "NPM-TEST" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-TEST" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-test\fR - Test a package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-token.1 b/deps/npm/man/man1/npm-token.1 index c31030d09f1e59..c1b0e1acb21157 100644 --- a/deps/npm/man/man1/npm-token.1 +++ b/deps/npm/man/man1/npm-token.1 @@ -1,4 +1,4 @@ -.TH "NPM-TOKEN" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-TOKEN" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-token\fR - Manage your authentication tokens .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-trust.1 b/deps/npm/man/man1/npm-trust.1 index 2b2223c9384307..81e67e7c17b800 100644 --- a/deps/npm/man/man1/npm-trust.1 +++ b/deps/npm/man/man1/npm-trust.1 @@ -1,14 +1,8 @@ -.TH "NPM-TRUST" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-TRUST" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-trust\fR - Manage trusted publishing relationships between packages and CI/CD providers .SS "Synopsis" .P -.RS 2 -.nf -npm trust -.fi -.RE -.P Note: This command is unaware of workspaces. .SS "Prerequisites" .P diff --git a/deps/npm/man/man1/npm-undeprecate.1 b/deps/npm/man/man1/npm-undeprecate.1 index 7fccdf4d79b87b..7d2848a33ef9f7 100644 --- a/deps/npm/man/man1/npm-undeprecate.1 +++ b/deps/npm/man/man1/npm-undeprecate.1 @@ -1,4 +1,4 @@ -.TH "NPM-UNDEPRECATE" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-UNDEPRECATE" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-undeprecate\fR - Undeprecate a version of a package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-uninstall.1 b/deps/npm/man/man1/npm-uninstall.1 index 8c2645515bf469..5255c3104c7e1b 100644 --- a/deps/npm/man/man1/npm-uninstall.1 +++ b/deps/npm/man/man1/npm-uninstall.1 @@ -1,4 +1,4 @@ -.TH "NPM-UNINSTALL" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-UNINSTALL" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-uninstall\fR - Remove a package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-unpublish.1 b/deps/npm/man/man1/npm-unpublish.1 index debc77cae0b8cd..a10179d140cb17 100644 --- a/deps/npm/man/man1/npm-unpublish.1 +++ b/deps/npm/man/man1/npm-unpublish.1 @@ -1,4 +1,4 @@ -.TH "NPM-UNPUBLISH" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-UNPUBLISH" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-unpublish\fR - Remove a package from the registry .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-unstar.1 b/deps/npm/man/man1/npm-unstar.1 index 48f1e1e60112e4..21ddfa859aead3 100644 --- a/deps/npm/man/man1/npm-unstar.1 +++ b/deps/npm/man/man1/npm-unstar.1 @@ -1,4 +1,4 @@ -.TH "NPM-UNSTAR" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-UNSTAR" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-unstar\fR - Remove an item from your favorite packages .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-update.1 b/deps/npm/man/man1/npm-update.1 index 6444774c6aee1e..83acac8d81f052 100644 --- a/deps/npm/man/man1/npm-update.1 +++ b/deps/npm/man/man1/npm-update.1 @@ -1,4 +1,4 @@ -.TH "NPM-UPDATE" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-UPDATE" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-update\fR - Update packages .SS "Synopsis" @@ -315,6 +315,8 @@ If set, npm will build the npm tree such that only versions that were available This flag is a complement to \fBbefore\fR, which accepts an exact date instead of a relative number of days. .P This config cannot be used with: \fBbefore\fR +.P +This value is not exported to the environment for child processes. .SS "\fBbin-links\fR" .RS 0 .IP \(bu 4 diff --git a/deps/npm/man/man1/npm-version.1 b/deps/npm/man/man1/npm-version.1 index fa5c13186c76fd..709a8bfb00c34d 100644 --- a/deps/npm/man/man1/npm-version.1 +++ b/deps/npm/man/man1/npm-version.1 @@ -1,4 +1,4 @@ -.TH "NPM-VERSION" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-VERSION" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-version\fR - Bump a package version .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-view.1 b/deps/npm/man/man1/npm-view.1 index a8b7f368ddd0c4..d45d8b38277c9d 100644 --- a/deps/npm/man/man1/npm-view.1 +++ b/deps/npm/man/man1/npm-view.1 @@ -1,4 +1,4 @@ -.TH "NPM-VIEW" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-VIEW" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-view\fR - View registry info .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-whoami.1 b/deps/npm/man/man1/npm-whoami.1 index ee79598fadc52f..f246bfc4781cb2 100644 --- a/deps/npm/man/man1/npm-whoami.1 +++ b/deps/npm/man/man1/npm-whoami.1 @@ -1,4 +1,4 @@ -.TH "NPM-WHOAMI" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM-WHOAMI" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-whoami\fR - Display npm username .SS "Synopsis" diff --git a/deps/npm/man/man1/npm.1 b/deps/npm/man/man1/npm.1 index 8c2522323757ea..a7ca1f48a0f4bc 100644 --- a/deps/npm/man/man1/npm.1 +++ b/deps/npm/man/man1/npm.1 @@ -1,4 +1,4 @@ -.TH "NPM" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPM" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm\fR - javascript package manager .SS "Synopsis" @@ -12,7 +12,7 @@ npm Note: This command is unaware of workspaces. .SS "Version" .P -11.11.0 +11.12.1 .SS "Description" .P npm is the package manager for the Node JavaScript platform. It puts modules in place so that node can find them, and manages dependency conflicts intelligently. diff --git a/deps/npm/man/man1/npx.1 b/deps/npm/man/man1/npx.1 index ac1e6a4b2a30e6..050afc7ab98e21 100644 --- a/deps/npm/man/man1/npx.1 +++ b/deps/npm/man/man1/npx.1 @@ -1,4 +1,4 @@ -.TH "NPX" "1" "February 2026" "NPM@11.11.0" "" +.TH "NPX" "1" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpx\fR - Run a command from a local or remote npm package .SS "Synopsis" diff --git a/deps/npm/man/man5/folders.5 b/deps/npm/man/man5/folders.5 index dfbffb819d79b6..6d8dbbe2d0930d 100644 --- a/deps/npm/man/man5/folders.5 +++ b/deps/npm/man/man5/folders.5 @@ -1,4 +1,4 @@ -.TH "FOLDERS" "5" "February 2026" "NPM@11.11.0" "" +.TH "FOLDERS" "5" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBFolders\fR - Folder structures used by npm .SS "Description" diff --git a/deps/npm/man/man5/install.5 b/deps/npm/man/man5/install.5 index 1ed6027eb63623..8ebd081e06497d 100644 --- a/deps/npm/man/man5/install.5 +++ b/deps/npm/man/man5/install.5 @@ -1,4 +1,4 @@ -.TH "INSTALL" "5" "February 2026" "NPM@11.11.0" "" +.TH "INSTALL" "5" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBInstall\fR - Download and install node and npm .SS "Description" diff --git a/deps/npm/man/man5/npm-global.5 b/deps/npm/man/man5/npm-global.5 index dfbffb819d79b6..6d8dbbe2d0930d 100644 --- a/deps/npm/man/man5/npm-global.5 +++ b/deps/npm/man/man5/npm-global.5 @@ -1,4 +1,4 @@ -.TH "FOLDERS" "5" "February 2026" "NPM@11.11.0" "" +.TH "FOLDERS" "5" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBFolders\fR - Folder structures used by npm .SS "Description" diff --git a/deps/npm/man/man5/npm-json.5 b/deps/npm/man/man5/npm-json.5 index bae7f6290e798a..02241289fdd8a0 100644 --- a/deps/npm/man/man5/npm-json.5 +++ b/deps/npm/man/man5/npm-json.5 @@ -1,4 +1,4 @@ -.TH "PACKAGE.JSON" "5" "February 2026" "NPM@11.11.0" "" +.TH "PACKAGE.JSON" "5" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBpackage.json\fR - Specifics of npm's package.json handling .SS "Description" diff --git a/deps/npm/man/man5/npm-shrinkwrap-json.5 b/deps/npm/man/man5/npm-shrinkwrap-json.5 index 4a6d0d279330a0..34361a3d7bc5e3 100644 --- a/deps/npm/man/man5/npm-shrinkwrap-json.5 +++ b/deps/npm/man/man5/npm-shrinkwrap-json.5 @@ -1,4 +1,4 @@ -.TH "NPM-SHRINKWRAP.JSON" "5" "February 2026" "NPM@11.11.0" "" +.TH "NPM-SHRINKWRAP.JSON" "5" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBnpm-shrinkwrap.json\fR - A publishable lockfile .SS "Description" diff --git a/deps/npm/man/man5/npmrc.5 b/deps/npm/man/man5/npmrc.5 index f788802907bef4..bf27bcb5939f20 100644 --- a/deps/npm/man/man5/npmrc.5 +++ b/deps/npm/man/man5/npmrc.5 @@ -1,4 +1,4 @@ -.TH ".NPMRC" "5" "February 2026" "NPM@11.11.0" "" +.TH ".NPMRC" "5" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fB.npmrc\fR - The npm config files .SS "Description" diff --git a/deps/npm/man/man5/package-json.5 b/deps/npm/man/man5/package-json.5 index bae7f6290e798a..02241289fdd8a0 100644 --- a/deps/npm/man/man5/package-json.5 +++ b/deps/npm/man/man5/package-json.5 @@ -1,4 +1,4 @@ -.TH "PACKAGE.JSON" "5" "February 2026" "NPM@11.11.0" "" +.TH "PACKAGE.JSON" "5" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBpackage.json\fR - Specifics of npm's package.json handling .SS "Description" diff --git a/deps/npm/man/man5/package-lock-json.5 b/deps/npm/man/man5/package-lock-json.5 index d95af3d209fe33..63ee956145c2a7 100644 --- a/deps/npm/man/man5/package-lock-json.5 +++ b/deps/npm/man/man5/package-lock-json.5 @@ -1,4 +1,4 @@ -.TH "PACKAGE-LOCK.JSON" "5" "February 2026" "NPM@11.11.0" "" +.TH "PACKAGE-LOCK.JSON" "5" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBpackage-lock.json\fR - A manifestation of the manifest .SS "Description" diff --git a/deps/npm/man/man7/config.7 b/deps/npm/man/man7/config.7 index 6fa65fc4a6cf9a..8452593e01eb4b 100644 --- a/deps/npm/man/man7/config.7 +++ b/deps/npm/man/man7/config.7 @@ -1,4 +1,4 @@ -.TH "CONFIG" "7" "February 2026" "NPM@11.11.0" "" +.TH "CONFIG" "7" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBConfig\fR - About npm configuration .SS "Description" @@ -801,6 +801,16 @@ Option that allows for defining which types of dependencies to install. This is the inverse of \fB--omit=<type>\fR. .P Dependency types specified in \fB--include\fR will not be omitted, regardless of the order in which omit/include are specified on the command-line. +.SS "\fBinclude-attestations\fR" +.RS 0 +.IP \(bu 4 +Default: false +.IP \(bu 4 +Type: Boolean +.RE 0 + +.P +When used with \fBnpm audit signatures --json\fR, includes the full sigstore attestation bundles in the JSON output for each verified package. The bundles contain DSSE envelopes, verification material, and transparency log entries. .SS "\fBinclude-staged\fR" .RS 0 .IP \(bu 4 @@ -1109,6 +1119,8 @@ If set, npm will build the npm tree such that only versions that were available This flag is a complement to \fBbefore\fR, which accepts an exact date instead of a relative number of days. .P This config cannot be used with: \fBbefore\fR +.P +This value is not exported to the environment for child processes. .SS "\fBname\fR" .RS 0 .IP \(bu 4 diff --git a/deps/npm/man/man7/dependency-selectors.7 b/deps/npm/man/man7/dependency-selectors.7 index 6f81407c07bea7..9ad3c02c5cc23c 100644 --- a/deps/npm/man/man7/dependency-selectors.7 +++ b/deps/npm/man/man7/dependency-selectors.7 @@ -1,4 +1,4 @@ -.TH "SELECTORS" "7" "February 2026" "NPM@11.11.0" "" +.TH "SELECTORS" "7" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBSelectors\fR - Dependency Selector Syntax & Querying .SS "Description" diff --git a/deps/npm/man/man7/developers.7 b/deps/npm/man/man7/developers.7 index 888e6ab1e0f981..809ae04b8ab770 100644 --- a/deps/npm/man/man7/developers.7 +++ b/deps/npm/man/man7/developers.7 @@ -1,4 +1,4 @@ -.TH "DEVELOPERS" "7" "February 2026" "NPM@11.11.0" "" +.TH "DEVELOPERS" "7" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBDevelopers\fR - Developer guide .SS "Description" diff --git a/deps/npm/man/man7/logging.7 b/deps/npm/man/man7/logging.7 index 41b6b0b1799c12..434e1af696ceeb 100644 --- a/deps/npm/man/man7/logging.7 +++ b/deps/npm/man/man7/logging.7 @@ -1,4 +1,4 @@ -.TH "LOGGING" "7" "February 2026" "NPM@11.11.0" "" +.TH "LOGGING" "7" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBLogging\fR - Why, What & How we Log .SS "Description" diff --git a/deps/npm/man/man7/orgs.7 b/deps/npm/man/man7/orgs.7 index dbebbe0bd09973..325210226876e5 100644 --- a/deps/npm/man/man7/orgs.7 +++ b/deps/npm/man/man7/orgs.7 @@ -1,4 +1,4 @@ -.TH "ORGANIZATIONS" "7" "February 2026" "NPM@11.11.0" "" +.TH "ORGANIZATIONS" "7" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBOrganizations\fR - Working with teams & organizations .SS "Description" diff --git a/deps/npm/man/man7/package-spec.7 b/deps/npm/man/man7/package-spec.7 index 2e4c1e0ddf5035..fbcfeafd019d5d 100644 --- a/deps/npm/man/man7/package-spec.7 +++ b/deps/npm/man/man7/package-spec.7 @@ -1,4 +1,4 @@ -.TH "SPEC" "7" "February 2026" "NPM@11.11.0" "" +.TH "SPEC" "7" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBspec\fR - Package name specifier .SS "Description" diff --git a/deps/npm/man/man7/registry.7 b/deps/npm/man/man7/registry.7 index 7ea6e6ced1a911..f2be8c14b15940 100644 --- a/deps/npm/man/man7/registry.7 +++ b/deps/npm/man/man7/registry.7 @@ -1,4 +1,4 @@ -.TH "REGISTRY" "7" "February 2026" "NPM@11.11.0" "" +.TH "REGISTRY" "7" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBRegistry\fR - The JavaScript Package Registry .SS "Description" diff --git a/deps/npm/man/man7/removal.7 b/deps/npm/man/man7/removal.7 index 2e9b4ea94e581a..7b8773deb192ba 100644 --- a/deps/npm/man/man7/removal.7 +++ b/deps/npm/man/man7/removal.7 @@ -1,4 +1,4 @@ -.TH "REMOVAL" "7" "February 2026" "NPM@11.11.0" "" +.TH "REMOVAL" "7" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBRemoval\fR - Cleaning the slate .SS "Synopsis" diff --git a/deps/npm/man/man7/scope.7 b/deps/npm/man/man7/scope.7 index 70f869a059961e..f8b9d4a406532f 100644 --- a/deps/npm/man/man7/scope.7 +++ b/deps/npm/man/man7/scope.7 @@ -1,4 +1,4 @@ -.TH "SCOPE" "7" "February 2026" "NPM@11.11.0" "" +.TH "SCOPE" "7" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBScope\fR - Scoped packages .SS "Description" diff --git a/deps/npm/man/man7/scripts.7 b/deps/npm/man/man7/scripts.7 index 561bea6c784a7e..7244c685d5b83e 100644 --- a/deps/npm/man/man7/scripts.7 +++ b/deps/npm/man/man7/scripts.7 @@ -1,4 +1,4 @@ -.TH "SCRIPTS" "7" "February 2026" "NPM@11.11.0" "" +.TH "SCRIPTS" "7" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBScripts\fR - How npm handles the "scripts" field .SS "Description" @@ -319,9 +319,6 @@ For more details, see: \fBDiscussion about script working directory reliability in npm v6 and earlier\fR \fI\(lahttps://github.com/npm/npm/issues/12356\(ra\fR .RE 0 -.SS "User" -.P -When npm is run as root, scripts are always run with the effective uid and gid of the working directory owner. .SS "Environment" .P Package scripts run in an environment where many pieces of information are made available regarding the setup of npm and the current state of the process. diff --git a/deps/npm/man/man7/workspaces.7 b/deps/npm/man/man7/workspaces.7 index a8a8c4b0c8cedd..4c4ed3324d997b 100644 --- a/deps/npm/man/man7/workspaces.7 +++ b/deps/npm/man/man7/workspaces.7 @@ -1,4 +1,4 @@ -.TH "WORKSPACES" "7" "February 2026" "NPM@11.11.0" "" +.TH "WORKSPACES" "7" "March 2026" "NPM@11.12.1" "" .SH "NAME" \fBWorkspaces\fR - Working with workspaces .SS "Description" @@ -90,28 +90,26 @@ npm install abbrev -w a .P \fBAdding a workspace as a dependency of another workspace:\fR .P -If you want to add workspace \fBb\fR as a dependency of workspace \fBa\fR, you can use the workspace protocol in the dependency specifier: +The same approach works when adding one workspace as a dependency of another. If you want to add workspace \fBb\fR as a dependency of workspace \fBa\fR, run: .P .RS 2 .nf -npm install b@workspace:* -w a +npm install b -w a .fi .RE .P -This will add an entry to workspace \fBa\fR's \fBpackage.json\fR like: +npm will detect that \fBb\fR is a workspace and automatically symlink it rather than fetching it from the registry. The resulting entry in workspace \fBa\fR's \fBpackage.json\fR will use a standard version range: .P .RS 2 .nf { "dependencies": { - "b": "workspace:*" + "b": "^1.0.0" } } .fi .RE .P -The \fBworkspace:\fR protocol tells npm to link to the local workspace rather than fetching from the registry. The \fB*\fR version means it will use whatever version is defined in workspace \fBb\fR's \fBpackage.json\fR. -.P Note: other installing commands such as \fBuninstall\fR, \fBci\fR, etc will also respect the provided \fBworkspace\fR configuration. .SS "Using workspaces" .P diff --git a/deps/npm/node_modules/@gar/promise-retry/LICENSE b/deps/npm/node_modules/@gar/promise-retry/LICENSE index db5e914de1f585..581fd125674145 100644 --- a/deps/npm/node_modules/@gar/promise-retry/LICENSE +++ b/deps/npm/node_modules/@gar/promise-retry/LICENSE @@ -1,3 +1,4 @@ +Copyright (c) 2011 Tim Koschützki (tim@debuggable.com), Felix Geisendörfer (felix@debuggable.com) Copyright (c) 2014 IndigoUnited Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/deps/npm/node_modules/@gar/promise-retry/lib/index.js b/deps/npm/node_modules/@gar/promise-retry/lib/index.js index 9033419793aaf6..be4598498e4a00 100644 --- a/deps/npm/node_modules/@gar/promise-retry/lib/index.js +++ b/deps/npm/node_modules/@gar/promise-retry/lib/index.js @@ -1,9 +1,44 @@ -const retry = require('retry') +const { RetryOperation } = require('./retry') -const isRetryError = (err) => err?.code === 'EPROMISERETRY' && Object.hasOwn(err, 'retried') +const createTimeout = (attempt, opts) => Math.min(Math.round((1 + (opts.randomize ? Math.random() : 0)) * Math.max(opts.minTimeout, 1) * Math.pow(opts.factor, attempt)), opts.maxTimeout) +const isRetryError = err => err?.code === 'EPROMISERETRY' && Object.hasOwn(err, 'retried') -async function promiseRetry (fn, options = {}) { - const operation = retry.operation(options) +const promiseRetry = async (fn, options = {}) => { + let timeouts = [] + if (options instanceof Array) { + timeouts = [...options] + } else { + if (options.retries === Infinity) { + options.forever = true + delete options.retries + } + const opts = { + retries: 10, + factor: 2, + minTimeout: 1 * 1000, + maxTimeout: Infinity, + randomize: false, + ...options + } + if (opts.minTimeout > opts.maxTimeout) { + throw new Error('minTimeout is greater than maxTimeout') + } + if (opts.retries) { + for (let i = 0; i < opts.retries; i++) { + timeouts.push(createTimeout(i, opts)) + } + // sort the array numerically ascending (since the timeouts may be out of order at factor < 1) + timeouts.sort((a, b) => a - b) + } else if (options.forever) { + timeouts.push(createTimeout(0, opts)) + } + } + + const operation = new RetryOperation(timeouts, { + forever: options.forever, + unref: options.unref, + maxRetryTime: options.maxRetryTime + }) return new Promise(function (resolve, reject) { operation.attempt(async number => { @@ -13,13 +48,12 @@ async function promiseRetry (fn, options = {}) { }, number, operation) return resolve(result) } catch (err) { - if (isRetryError(err)) { - if (operation.retry(err.retried || new Error())) { - return - } + if (!isRetryError(err)) { + return reject(err) + } + if (!operation.retry(err.retried || new Error())) { return reject(err.retried) } - return reject(err) } }) }) diff --git a/deps/npm/node_modules/@gar/promise-retry/lib/retry.js b/deps/npm/node_modules/@gar/promise-retry/lib/retry.js new file mode 100644 index 00000000000000..e2d13dfaee5727 --- /dev/null +++ b/deps/npm/node_modules/@gar/promise-retry/lib/retry.js @@ -0,0 +1,109 @@ +class RetryOperation { + #attempts = 1 + #cachedTimeouts = null + #errors = [] + #fn = null + #maxRetryTime + #operationStart = null + #originalTimeouts + #timeouts + #timer = null + #unref + + constructor (timeouts, options = {}) { + this.#originalTimeouts = [...timeouts] + this.#timeouts = [...timeouts] + this.#unref = options.unref + this.#maxRetryTime = options.maxRetryTime || Infinity + if (options.forever) { + this.#cachedTimeouts = [...this.#timeouts] + } + } + + get timeouts () { + return [...this.#timeouts] + } + + get errors () { + return [...this.#errors] + } + + get attempts () { + return this.#attempts + } + + get mainError () { + let mainError = null + if (this.#errors.length) { + let mainErrorCount = 0 + const counts = {} + for (let i = 0; i < this.#errors.length; i++) { + const error = this.#errors[i] + const { message } = error + if (!counts[message]) { + counts[message] = 0 + } + counts[message]++ + + if (counts[message] >= mainErrorCount) { + mainError = error + mainErrorCount = counts[message] + } + } + } + return mainError + } + + reset () { + this.#attempts = 1 + this.#timeouts = [...this.#originalTimeouts] + } + + stop () { + if (this.#timer) { + clearTimeout(this.#timer) + } + + this.#timeouts = [] + this.#cachedTimeouts = null + } + + retry (err) { + this.#errors.push(err) + if (new Date().getTime() - this.#operationStart >= this.#maxRetryTime) { + // XXX This puts the timeout error first, meaning it will never show as mainError, there may be no way to ever see this + this.#errors.unshift(new Error('RetryOperation timeout occurred')) + return false + } + + let timeout = this.#timeouts.shift() + if (timeout === undefined) { + // We're out of timeouts, clear the last error and repeat the final timeout + if (this.#cachedTimeouts) { + this.#errors.pop() + timeout = this.#cachedTimeouts.at(-1) + } else { + return false + } + } + + // TODO what if there already is a timer? + this.#timer = setTimeout(() => { + this.#attempts++ + this.#fn(this.#attempts) + }, timeout) + + if (this.#unref) { + this.#timer.unref() + } + + return true + } + + attempt (fn) { + this.#fn = fn + this.#operationStart = new Date().getTime() + this.#fn(this.#attempts) + } +} +module.exports = { RetryOperation } diff --git a/deps/npm/node_modules/@gar/promise-retry/node_modules/retry/License b/deps/npm/node_modules/@gar/promise-retry/node_modules/retry/License deleted file mode 100644 index 0b58de379fb308..00000000000000 --- a/deps/npm/node_modules/@gar/promise-retry/node_modules/retry/License +++ /dev/null @@ -1,21 +0,0 @@ -Copyright (c) 2011: -Tim Koschützki (tim@debuggable.com) -Felix Geisendörfer (felix@debuggable.com) - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. diff --git a/deps/npm/node_modules/@gar/promise-retry/node_modules/retry/example/dns.js b/deps/npm/node_modules/@gar/promise-retry/node_modules/retry/example/dns.js deleted file mode 100644 index 446729b6f9af6b..00000000000000 --- a/deps/npm/node_modules/@gar/promise-retry/node_modules/retry/example/dns.js +++ /dev/null @@ -1,31 +0,0 @@ -var dns = require('dns'); -var retry = require('../lib/retry'); - -function faultTolerantResolve(address, cb) { - var opts = { - retries: 2, - factor: 2, - minTimeout: 1 * 1000, - maxTimeout: 2 * 1000, - randomize: true - }; - var operation = retry.operation(opts); - - operation.attempt(function(currentAttempt) { - dns.resolve(address, function(err, addresses) { - if (operation.retry(err)) { - return; - } - - cb(operation.mainError(), operation.errors(), addresses); - }); - }); -} - -faultTolerantResolve('nodejs.org', function(err, errors, addresses) { - console.warn('err:'); - console.log(err); - - console.warn('addresses:'); - console.log(addresses); -}); \ No newline at end of file diff --git a/deps/npm/node_modules/@gar/promise-retry/node_modules/retry/example/stop.js b/deps/npm/node_modules/@gar/promise-retry/node_modules/retry/example/stop.js deleted file mode 100644 index e1ceafeebafc51..00000000000000 --- a/deps/npm/node_modules/@gar/promise-retry/node_modules/retry/example/stop.js +++ /dev/null @@ -1,40 +0,0 @@ -var retry = require('../lib/retry'); - -function attemptAsyncOperation(someInput, cb) { - var opts = { - retries: 2, - factor: 2, - minTimeout: 1 * 1000, - maxTimeout: 2 * 1000, - randomize: true - }; - var operation = retry.operation(opts); - - operation.attempt(function(currentAttempt) { - failingAsyncOperation(someInput, function(err, result) { - - if (err && err.message === 'A fatal error') { - operation.stop(); - return cb(err); - } - - if (operation.retry(err)) { - return; - } - - cb(operation.mainError(), operation.errors(), result); - }); - }); -} - -attemptAsyncOperation('test input', function(err, errors, result) { - console.warn('err:'); - console.log(err); - - console.warn('result:'); - console.log(result); -}); - -function failingAsyncOperation(input, cb) { - return setImmediate(cb.bind(null, new Error('A fatal error'))); -} diff --git a/deps/npm/node_modules/@gar/promise-retry/node_modules/retry/index.js b/deps/npm/node_modules/@gar/promise-retry/node_modules/retry/index.js deleted file mode 100644 index ee62f3a112c28b..00000000000000 --- a/deps/npm/node_modules/@gar/promise-retry/node_modules/retry/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./lib/retry'); \ No newline at end of file diff --git a/deps/npm/node_modules/@gar/promise-retry/node_modules/retry/lib/retry.js b/deps/npm/node_modules/@gar/promise-retry/node_modules/retry/lib/retry.js deleted file mode 100644 index 5e85e79197d36c..00000000000000 --- a/deps/npm/node_modules/@gar/promise-retry/node_modules/retry/lib/retry.js +++ /dev/null @@ -1,100 +0,0 @@ -var RetryOperation = require('./retry_operation'); - -exports.operation = function(options) { - var timeouts = exports.timeouts(options); - return new RetryOperation(timeouts, { - forever: options && (options.forever || options.retries === Infinity), - unref: options && options.unref, - maxRetryTime: options && options.maxRetryTime - }); -}; - -exports.timeouts = function(options) { - if (options instanceof Array) { - return [].concat(options); - } - - var opts = { - retries: 10, - factor: 2, - minTimeout: 1 * 1000, - maxTimeout: Infinity, - randomize: false - }; - for (var key in options) { - opts[key] = options[key]; - } - - if (opts.minTimeout > opts.maxTimeout) { - throw new Error('minTimeout is greater than maxTimeout'); - } - - var timeouts = []; - for (var i = 0; i < opts.retries; i++) { - timeouts.push(this.createTimeout(i, opts)); - } - - if (options && options.forever && !timeouts.length) { - timeouts.push(this.createTimeout(i, opts)); - } - - // sort the array numerically ascending - timeouts.sort(function(a,b) { - return a - b; - }); - - return timeouts; -}; - -exports.createTimeout = function(attempt, opts) { - var random = (opts.randomize) - ? (Math.random() + 1) - : 1; - - var timeout = Math.round(random * Math.max(opts.minTimeout, 1) * Math.pow(opts.factor, attempt)); - timeout = Math.min(timeout, opts.maxTimeout); - - return timeout; -}; - -exports.wrap = function(obj, options, methods) { - if (options instanceof Array) { - methods = options; - options = null; - } - - if (!methods) { - methods = []; - for (var key in obj) { - if (typeof obj[key] === 'function') { - methods.push(key); - } - } - } - - for (var i = 0; i < methods.length; i++) { - var method = methods[i]; - var original = obj[method]; - - obj[method] = function retryWrapper(original) { - var op = exports.operation(options); - var args = Array.prototype.slice.call(arguments, 1); - var callback = args.pop(); - - args.push(function(err) { - if (op.retry(err)) { - return; - } - if (err) { - arguments[0] = op.mainError(); - } - callback.apply(this, arguments); - }); - - op.attempt(function() { - original.apply(obj, args); - }); - }.bind(obj, original); - obj[method].options = options; - } -}; diff --git a/deps/npm/node_modules/@gar/promise-retry/node_modules/retry/lib/retry_operation.js b/deps/npm/node_modules/@gar/promise-retry/node_modules/retry/lib/retry_operation.js deleted file mode 100644 index 105ce72b2be8e1..00000000000000 --- a/deps/npm/node_modules/@gar/promise-retry/node_modules/retry/lib/retry_operation.js +++ /dev/null @@ -1,162 +0,0 @@ -function RetryOperation(timeouts, options) { - // Compatibility for the old (timeouts, retryForever) signature - if (typeof options === 'boolean') { - options = { forever: options }; - } - - this._originalTimeouts = JSON.parse(JSON.stringify(timeouts)); - this._timeouts = timeouts; - this._options = options || {}; - this._maxRetryTime = options && options.maxRetryTime || Infinity; - this._fn = null; - this._errors = []; - this._attempts = 1; - this._operationTimeout = null; - this._operationTimeoutCb = null; - this._timeout = null; - this._operationStart = null; - this._timer = null; - - if (this._options.forever) { - this._cachedTimeouts = this._timeouts.slice(0); - } -} -module.exports = RetryOperation; - -RetryOperation.prototype.reset = function() { - this._attempts = 1; - this._timeouts = this._originalTimeouts.slice(0); -} - -RetryOperation.prototype.stop = function() { - if (this._timeout) { - clearTimeout(this._timeout); - } - if (this._timer) { - clearTimeout(this._timer); - } - - this._timeouts = []; - this._cachedTimeouts = null; -}; - -RetryOperation.prototype.retry = function(err) { - if (this._timeout) { - clearTimeout(this._timeout); - } - - if (!err) { - return false; - } - var currentTime = new Date().getTime(); - if (err && currentTime - this._operationStart >= this._maxRetryTime) { - this._errors.push(err); - this._errors.unshift(new Error('RetryOperation timeout occurred')); - return false; - } - - this._errors.push(err); - - var timeout = this._timeouts.shift(); - if (timeout === undefined) { - if (this._cachedTimeouts) { - // retry forever, only keep last error - this._errors.splice(0, this._errors.length - 1); - timeout = this._cachedTimeouts.slice(-1); - } else { - return false; - } - } - - var self = this; - this._timer = setTimeout(function() { - self._attempts++; - - if (self._operationTimeoutCb) { - self._timeout = setTimeout(function() { - self._operationTimeoutCb(self._attempts); - }, self._operationTimeout); - - if (self._options.unref) { - self._timeout.unref(); - } - } - - self._fn(self._attempts); - }, timeout); - - if (this._options.unref) { - this._timer.unref(); - } - - return true; -}; - -RetryOperation.prototype.attempt = function(fn, timeoutOps) { - this._fn = fn; - - if (timeoutOps) { - if (timeoutOps.timeout) { - this._operationTimeout = timeoutOps.timeout; - } - if (timeoutOps.cb) { - this._operationTimeoutCb = timeoutOps.cb; - } - } - - var self = this; - if (this._operationTimeoutCb) { - this._timeout = setTimeout(function() { - self._operationTimeoutCb(); - }, self._operationTimeout); - } - - this._operationStart = new Date().getTime(); - - this._fn(this._attempts); -}; - -RetryOperation.prototype.try = function(fn) { - console.log('Using RetryOperation.try() is deprecated'); - this.attempt(fn); -}; - -RetryOperation.prototype.start = function(fn) { - console.log('Using RetryOperation.start() is deprecated'); - this.attempt(fn); -}; - -RetryOperation.prototype.start = RetryOperation.prototype.try; - -RetryOperation.prototype.errors = function() { - return this._errors; -}; - -RetryOperation.prototype.attempts = function() { - return this._attempts; -}; - -RetryOperation.prototype.mainError = function() { - if (this._errors.length === 0) { - return null; - } - - var counts = {}; - var mainError = null; - var mainErrorCount = 0; - - for (var i = 0; i < this._errors.length; i++) { - var error = this._errors[i]; - var message = error.message; - var count = (counts[message] || 0) + 1; - - counts[message] = count; - - if (count >= mainErrorCount) { - mainError = error; - mainErrorCount = count; - } - } - - return mainError; -}; diff --git a/deps/npm/node_modules/@gar/promise-retry/node_modules/retry/package.json b/deps/npm/node_modules/@gar/promise-retry/node_modules/retry/package.json deleted file mode 100644 index 48f35e8cff2859..00000000000000 --- a/deps/npm/node_modules/@gar/promise-retry/node_modules/retry/package.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "author": "Tim Koschützki <tim@debuggable.com> (http://debuggable.com/)", - "name": "retry", - "description": "Abstraction for exponential and custom retry strategies for failed operations.", - "license": "MIT", - "version": "0.13.1", - "homepage": "https://github.com/tim-kos/node-retry", - "repository": { - "type": "git", - "url": "git://github.com/tim-kos/node-retry.git" - }, - "files": [ - "lib", - "example" - ], - "directories": { - "lib": "./lib" - }, - "main": "index.js", - "engines": { - "node": ">= 4" - }, - "dependencies": {}, - "devDependencies": { - "fake": "0.2.0", - "istanbul": "^0.4.5", - "tape": "^4.8.0" - }, - "scripts": { - "test": "./node_modules/.bin/istanbul cover ./node_modules/tape/bin/tape ./test/integration/*.js", - "release:major": "env SEMANTIC=major npm run release", - "release:minor": "env SEMANTIC=minor npm run release", - "release:patch": "env SEMANTIC=patch npm run release", - "release": "npm version ${SEMANTIC:-patch} -m \"Release %s\" && git push && git push --tags && npm publish" - } -} diff --git a/deps/npm/node_modules/@gar/promise-retry/package.json b/deps/npm/node_modules/@gar/promise-retry/package.json index 0bd8e31a2aa021..ab73b70283b311 100644 --- a/deps/npm/node_modules/@gar/promise-retry/package.json +++ b/deps/npm/node_modules/@gar/promise-retry/package.json @@ -1,6 +1,6 @@ { "name": "@gar/promise-retry", - "version": "1.0.2", + "version": "1.0.3", "description": "Retries a function that returns a promise, leveraging the power of the retry module.", "main": "./lib/index.js", "files": [ @@ -39,9 +39,6 @@ "replay" ], "license": "MIT", - "dependencies": { - "retry": "^0.13.1" - }, "engines": { "node": "^20.17.0 || >=22.9.0" } diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/arborist/isolated-reifier.js b/deps/npm/node_modules/@npmcli/arborist/lib/arborist/isolated-reifier.js index 8da64ce965b7ea..121ad0effc8f6d 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/arborist/isolated-reifier.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/arborist/isolated-reifier.js @@ -1,71 +1,103 @@ -const _makeIdealGraph = Symbol('makeIdealGraph') -const _createIsolatedTree = Symbol.for('createIsolatedTree') const { mkdirSync } = require('node:fs') const pacote = require('pacote') const { join } = require('node:path') const { depth } = require('treeverse') const crypto = require('node:crypto') +const { IsolatedNode, IsolatedLink } = require('../isolated-classes.js') -// cache complicated function results -const memoize = (fn) => { - const memo = new Map() - return async function (arg) { - const key = arg - if (memo.has(key)) { - return memo.get(key) - } - const result = {} - memo.set(key, result) - await fn(result, arg) - return result - } +// generate short hash key based on the dependency tree starting at this node +const getKey = (startNode) => { + const deps = [] + const branch = [] + depth({ + tree: startNode, + getChildren: node => node.dependencies, + visit: node => { + branch.push(`${node.packageName}@${node.version}`) + deps.push(`${branch.join('->')}::${node.resolved}`) + }, + leave: () => { + branch.pop() + }, + }) + deps.sort() + // TODO these replaces were originally to deal with node 14 not supporting base64url and likely don't need to happen anymore + // Changing this is a pretty significant breaking change, but removing parts of the hash increases collision possibilities (even if slight). + const hash = crypto.createHash('shake256', { outputLength: 16 }) + .update(deps.join(',')) + .digest('base64') + .replace(/\+/g, '-') + .replace(/\//g, '_') + .replace(/=+$/m, '') + return `${startNode.packageName}@${startNode.version}-${hash}` } module.exports = cls => class IsolatedReifier extends cls { + #externalProxies = new Map() + #omit = new Set() + #rootDeclaredDeps = new Set() + #processedEdges = new Set() + #workspaceProxies = new Map() + + #generateChild (node, location, pkg, isInStore, root) { + const newChild = new IsolatedNode({ + isInStore, + location, + name: node.packageName || node.name, + optional: node.optional, + package: pkg, + parent: root, + path: join(this.idealGraph.localPath, location), + resolved: node.resolved, + root, + }) + // XXX top is from place-dep not lib/node.js + newChild.top = { path: this.idealGraph.localPath } + root.children.set(newChild.location, newChild) + root.inventory.set(newChild.location, newChild) + } + /** * Create an ideal graph. * * An implementation of npm RFC-0042 * https://github.com/npm/rfcs/blob/main/accepted/0042-isolated-mode.md * - * This entire file should be considered technical debt that will be resolved - * with an Arborist refactor or rewrite. Embedded logic in Nodes and Links, - * and the incremental state of building trees and reifying contains too many - * assumptions to do a linked mode properly. + * This entire file should be considered technical debt that will be resolved with an Arborist refactor or rewrite. + * Embedded logic in Nodes and Links, and the incremental state of building trees and reifying contains too many assumptions to do a linked mode properly. * - * Instead, this approach takes a tree built from build-ideal-tree, and - * returns a new tree-like structure without the embedded logic of Node and - * Link classes. + * Instead, this approach takes a tree built from build-ideal-tree, and returns a new tree-like structure without the embedded logic of Node and Link classes. * - * Since the RFC requires leaving the package-lock in place, this approach - * temporarily replaces the tree state for a couple of steps of reifying. + * Since the RFC requires leaving the package-lock in place, this approach temporarily replaces the tree state for a couple of steps of reifying. * **/ - async [_makeIdealGraph] (options) { - /* Make sure that the ideal tree is build as the rest of - * the algorithm depends on it. - */ - const bitOpt = { - ...options, - complete: false, - } - await this.buildIdealTree(bitOpt) + async makeIdealGraph () { const idealTree = this.idealTree + this.#omit = new Set(this.options.omit) + const omit = this.#omit - this.rootNode = {} - const root = this.rootNode - this.counter = 0 + // npm auto-creates 'workspace' edges from root to all workspaces. + // For isolated/linked mode, only include workspaces that root explicitly declares as dependencies. + // When omitting dep types, exclude those from the declared set so their workspaces aren't hoisted. + const rootPkg = idealTree.package + this.#rootDeclaredDeps = new Set(Object.keys(Object.assign({}, + rootPkg.dependencies, + (!omit.has('dev') && rootPkg.devDependencies), + (!omit.has('optional') && rootPkg.optionalDependencies), + (!omit.has('peer') && rootPkg.peerDependencies) + ))) - // memoize to cache generating proxy Nodes - this.externalProxyMemo = memoize(this.externalProxy.bind(this)) - this.workspaceProxyMemo = memoize(this.workspaceProxy.bind(this)) + // XXX this sometimes acts like a node too + this.idealGraph = { + external: [], + isProjectRoot: true, + localLocation: idealTree.location, + localPath: idealTree.path, + path: idealTree.path, + } + this.counter = 0 - root.external = [] - root.isProjectRoot = true - root.localLocation = idealTree.location - root.localPath = idealTree.path - root.workspaces = await Promise.all( - Array.from(idealTree.fsChildren.values(), this.workspaceProxyMemo)) + this.idealGraph.workspaces = await Promise.all(Array.from(idealTree.fsChildren.values(), w => this.#workspaceProxy(w))) const processed = new Set() const queue = [idealTree, ...idealTree.fsChildren] while (queue.length !== 0) { @@ -74,32 +106,44 @@ module.exports = cls => class IsolatedReifier extends cls { continue } processed.add(next.location) - next.edgesOut.forEach(e => { - if (!e.to || (next.package.bundleDependencies || next.package.bundledDependencies || []).includes(e.to.name)) { - return + next.edgesOut.forEach(edge => { + if (edge.to && !(next.package.bundleDependencies || next.package.bundledDependencies || []).includes(edge.to.name) && !edge.to.shouldOmit?.(omit)) { + queue.push(edge.to) } - queue.push(e.to) }) - if (!next.isProjectRoot && !next.isWorkspace && !next.inert) { - root.external.push(await this.externalProxyMemo(next)) + // local `file:` deps are in fsChildren but are not workspaces. + // they are already handled as workspace-like proxies above and should not go through the external/store extraction path. + if (!next.isProjectRoot && !next.isWorkspace && !next.inert && !idealTree.fsChildren.has(next) && !idealTree.fsChildren.has(next.target)) { + this.idealGraph.external.push(await this.#externalProxy(next)) } } - await this.assignCommonProperties(idealTree, root) - - this.idealGraph = root + await this.#assignCommonProperties(idealTree, this.idealGraph) } - async workspaceProxy (result, node) { + async #workspaceProxy (node) { + if (this.#workspaceProxies.has(node)) { + return this.#workspaceProxies.get(node) + } + const result = {} + // XXX this goes recursive if we don't set here because assignCommonProperties also calls this.#workspaceProxy + this.#workspaceProxies.set(node, result) result.localLocation = node.location result.localPath = node.path result.isWorkspace = true result.resolved = node.resolved - await this.assignCommonProperties(node, result) + await this.#assignCommonProperties(node, result) + return result } - async externalProxy (result, node) { - await this.assignCommonProperties(node, result) + async #externalProxy (node) { + if (this.#externalProxies.has(node)) { + return this.#externalProxies.get(node) + } + const result = {} + // XXX this goes recursive if we don't set here because assignCommonProperties also calls this.#externalProxy + this.#externalProxies.set(node, result) + await this.#assignCommonProperties(node, result, !node.hasShrinkwrap) if (node.hasShrinkwrap) { const dir = join( node.root.path, @@ -108,8 +152,7 @@ module.exports = cls => class IsolatedReifier extends cls { `${node.packageName}@${node.version}` ) mkdirSync(dir, { recursive: true }) - // TODO this approach feels wrong - // and shouldn't be necessary for shrinkwraps + // TODO this approach feels wrong and shouldn't be necessary for shrinkwraps await pacote.extract(node.resolved, dir, { ...this.options, resolved: node.resolved, @@ -117,65 +160,100 @@ module.exports = cls => class IsolatedReifier extends cls { }) const Arborist = this.constructor const arb = new Arborist({ ...this.options, path: dir }) - await arb[_makeIdealGraph]({ dev: false }) - this.rootNode.external.push(...arb.idealGraph.external) - arb.idealGraph.external.forEach(e => { - e.root = this.rootNode - e.id = `${node.id}=>${e.id}` + // Make sure that the ideal tree is build as the rest of the algorithm depends on it. + await arb.buildIdealTree({ + complete: false, + dev: false, }) + await arb.makeIdealGraph() + this.idealGraph.external.push(...arb.idealGraph.external) + for (const edge of arb.idealGraph.external) { + edge.root = this.idealGraph + edge.id = `${node.id}=>${edge.id}` + } result.localDependencies = [] result.externalDependencies = arb.idealGraph.externalDependencies result.externalOptionalDependencies = arb.idealGraph.externalOptionalDependencies result.dependencies = [ ...result.externalDependencies, - ...result.localDependencies, ...result.externalOptionalDependencies, ] } result.optional = node.optional result.resolved = node.resolved result.version = node.version + return result } - async assignCommonProperties (node, result) { - function validEdgesOut (node) { - return [...node.edgesOut.values()].filter(e => e.to && e.to.target && !(node.package.bundledDependencies || node.package.bundleDependencies || []).includes(e.to.name)) + async #assignCommonProperties (node, result, populateDeps = true) { + result.root = this.idealGraph + // XXX does anything need this? + result.id = this.counter++ + /* istanbul ignore next - packageName is always set for real packages */ + result.name = result.isWorkspace ? (node.packageName || node.name) : node.name + result.packageName = node.packageName || node.name + result.package = { ...node.package } + result.package.bundleDependencies = undefined + + if (!populateDeps) { + return + } + + let edges = [...node.edgesOut.values()].filter(edge => + edge.to?.target && + !(node.package.bundledDependencies || node.package.bundleDependencies)?.includes(edge.to.name) + ) + + // Only omit edge types for root and workspace nodes (matching shouldOmit scope) + if ((node.isProjectRoot || node.isWorkspace) && this.#omit.size) { + edges = edges.filter(edge => { + if (edge.dev && this.#omit.has('dev')) { + return false + } + if (edge.optional && this.#omit.has('optional')) { + return false + } + if (edge.peer && this.#omit.has('peer')) { + return false + } + return true + }) } - const edges = validEdgesOut(node) - const optionalDeps = edges.filter(e => e.optional).map(e => e.to.target) - const nonOptionalDeps = edges.filter(e => !e.optional).map(e => e.to.target) - // When legacyPeerDeps is enabled, peer dep edges are not created on the - // node. Resolve them from the tree so they get symlinked in the store. + let nonOptionalDeps = edges.filter(edge => !edge.optional).map(edge => edge.to.target) + + // npm auto-creates 'workspace' edges from root to all workspaces. + // For isolated/linked mode, only include workspaces that root explicitly declares as dependencies. + if (node.isProjectRoot) { + nonOptionalDeps = nonOptionalDeps.filter(n => !n.isWorkspace || this.#rootDeclaredDeps.has(n.packageName)) + } + + // When legacyPeerDeps is enabled, peer dep edges are not created on the node. + // Resolve them from the tree so they get symlinked in the store. const peerDeps = node.package.peerDependencies if (peerDeps && node.legacyPeerDeps) { - const edgeNames = new Set(edges.map(e => e.name)) - for (const peerName of Object.keys(peerDeps)) { + const edgeNames = new Set(edges.map(edge => edge.name)) + for (const peerName in peerDeps) { if (!edgeNames.has(peerName)) { const resolved = node.resolve(peerName) if (resolved && resolved !== node && !resolved.inert) { - nonOptionalDeps.push(resolved) + nonOptionalDeps.push(resolved.target) } } } } - result.localDependencies = await Promise.all(nonOptionalDeps.filter(n => n.isWorkspace).map(this.workspaceProxyMemo)) - result.externalDependencies = await Promise.all(nonOptionalDeps.filter(n => !n.isWorkspace && !n.inert).map(this.externalProxyMemo)) - result.externalOptionalDependencies = await Promise.all(optionalDeps.filter(n => !n.inert).map(this.externalProxyMemo)) + // local `file:` deps (non-workspace fsChildren) should be treated as local dependencies, not external, so they get symlinked directly instead of being extracted into the store. + const isLocal = (n) => n.isWorkspace || node.fsChildren?.has(n) + const optionalDeps = edges.filter(edge => edge.optional).map(edge => edge.to.target) + result.localDependencies = await Promise.all(nonOptionalDeps.filter(isLocal).map(n => this.#workspaceProxy(n))) + result.externalDependencies = await Promise.all(nonOptionalDeps.filter(n => !isLocal(n) && !n.inert).map(n => this.#externalProxy(n))) + result.externalOptionalDependencies = await Promise.all(optionalDeps.filter(n => !n.inert).map(n => this.#externalProxy(n))) result.dependencies = [ ...result.externalDependencies, ...result.localDependencies, ...result.externalOptionalDependencies, ] - result.root = this.rootNode - result.id = this.counter++ - /* istanbul ignore next - packageName is always set for real packages */ - result.name = result.isWorkspace ? (node.packageName || node.name) : node.name - result.packageName = node.packageName || node.name - result.package = { ...node.package } - result.package.bundleDependencies = undefined - result.hasInstallScript = node.hasInstallScript } async #createBundledTree () { @@ -217,261 +295,178 @@ module.exports = cls => class IsolatedReifier extends cls { nodes.set(to.location, { location: to.location, resolved: to.resolved, name: to.name, optional: to.optional, pkg: { ...to.package, bundleDependencies: undefined } }) edges.push({ from: from.isRoot ? 'root' : from.location, to: to.location }) - to.edgesOut.forEach(e => { + to.edgesOut.forEach(edge => { // an edge out should always have a to /* istanbul ignore else */ - if (e.to) { - queue.push({ from: e.from, to: e.to }) + if (edge.to) { + queue.push({ from: edge.from, to: edge.to }) } }) } return { edges, nodes } } - async [_createIsolatedTree] () { - await this[_makeIdealGraph](this.options) - - const proxiedIdealTree = this.idealGraph - + async createIsolatedTree () { + await this.makeIdealGraph() const bundledTree = await this.#createBundledTree() - const treeHash = (startNode) => { - // generate short hash based on the dependency tree - // starting at this node - const deps = [] - const branch = [] - depth({ - tree: startNode, - getChildren: node => node.dependencies, - filter: node => node, - visit: node => { - branch.push(`${node.packageName}@${node.version}`) - deps.push(`${branch.join('->')}::${node.resolved}`) - }, - leave: () => { - branch.pop() - }, - }) - deps.sort() - return crypto.createHash('shake256', { outputLength: 16 }) - .update(deps.join(',')) - .digest('base64') - // Node v14 doesn't support base64url - .replace(/\+/g, '-') - .replace(/\//g, '_') - .replace(/=+$/m, '') - } - - const getKey = (idealTreeNode) => { - return `${idealTreeNode.packageName}@${idealTreeNode.version}-${treeHash(idealTreeNode)}` - } - - const root = { - fsChildren: [], - integrity: null, - inventory: new Map(), - isLink: false, - isRoot: true, - binPaths: [], - edgesIn: new Set(), - edgesOut: new Map(), - hasShrinkwrap: false, - parent: null, - // TODO: we should probably not reference this.idealTree - resolved: this.idealTree.resolved, - isTop: true, - path: proxiedIdealTree.root.localPath, - realpath: proxiedIdealTree.root.localPath, - package: proxiedIdealTree.root.package, - meta: { loadedFromDisk: false }, - global: false, - isProjectRoot: true, - children: [], - } - // root.inventory.set('', t) - // root.meta = this.idealTree.meta - // TODO We should mock better the inventory object because it is used by audit-report.js ... maybe - root.inventory.query = () => { - return [] - } + const root = new IsolatedNode(this.idealGraph) + root.root = root + root.inventory.set('', root) const processed = new Set() - proxiedIdealTree.workspaces.forEach(c => { - const workspace = { - edgesIn: new Set(), - edgesOut: new Map(), - children: [], - hasInstallScript: c.hasInstallScript, - binPaths: [], - package: c.package, + for (const c of this.idealGraph.workspaces) { + const wsName = c.packageName + // XXX parent? root? + const workspace = new IsolatedNode({ location: c.localLocation, + name: wsName, + package: c.package, path: c.localPath, - realpath: c.localPath, resolved: c.resolved, - } - root.fsChildren.push(workspace) + }) + root.fsChildren.add(workspace) root.inventory.set(workspace.location, workspace) - }) - const generateChild = (node, location, pkg, inStore) => { - const newChild = { - global: false, - globalTop: false, - isProjectRoot: false, - isTop: false, - location, - name: node.packageName || node.name, - optional: node.optional, - top: { path: proxiedIdealTree.root.localPath }, - children: [], - edgesIn: new Set(), - edgesOut: new Map(), - binPaths: [], - fsChildren: [], - /* istanbul ignore next -- emulate Node */ - getBundler () { - return null - }, - hasShrinkwrap: false, - inDepBundle: false, - integrity: null, - isLink: false, - isRoot: false, - isInStore: inStore, - path: join(proxiedIdealTree.root.localPath, location), - realpath: join(proxiedIdealTree.root.localPath, location), - resolved: node.resolved, - version: pkg.version, - package: pkg, + root.workspaces.set(wsName, workspace.path) + + // Create workspace Link. For root declared deps, link at root node_modules/. For undeclared deps, link at the workspace's own node_modules/ (self-link). + const isDeclared = this.#rootDeclaredDeps.has(wsName) + const wsLink = new IsolatedLink({ + location: isDeclared ? join('node_modules', wsName) : join(c.localLocation, 'node_modules', wsName), + name: wsName, + package: workspace.package, + parent: root, + path: isDeclared ? join(root.path, 'node_modules', wsName) : join(root.path, c.localLocation, 'node_modules', wsName), + realpath: workspace.path, + root, + target: workspace, + }) + if (!isDeclared) { + workspace.children.set(wsName, wsLink) } - newChild.target = newChild - root.children.push(newChild) - root.inventory.set(newChild.location, newChild) + root.children.set(wsName, wsLink) + root.inventory.set(wsLink.location, wsLink) + workspace.linksIn.add(wsLink) } - proxiedIdealTree.external.forEach(c => { + + this.idealGraph.external.forEach(c => { const key = getKey(c) if (processed.has(key)) { return } processed.add(key) const location = join('node_modules', '.store', key, 'node_modules', c.packageName) - generateChild(c, location, c.package, true) + this.#generateChild(c, location, c.package, true, root) }) + bundledTree.nodes.forEach(node => { - generateChild(node, node.location, node.pkg, false) + this.#generateChild(node, node.location, node.pkg, false, root) }) - bundledTree.edges.forEach(e => { - const from = e.from === 'root' ? root : root.inventory.get(e.from) - const to = root.inventory.get(e.to) + + bundledTree.edges.forEach(edge => { + const from = edge.from === 'root' ? root : root.inventory.get(edge.from) + const to = root.inventory.get(edge.to) // Maybe optional should be propagated from the original edge - const edge = { optional: false, from, to } - from.edgesOut.set(to.name, edge) - to.edgesIn.add(edge) + const newEdge = { optional: false, from, to } + from.edgesOut.set(to.name, newEdge) + to.edgesIn.add(newEdge) }) - const memo = new Set() - function processEdges (node, externalEdge) { - externalEdge = !!externalEdge - const key = getKey(node) - if (memo.has(key)) { - return - } - memo.add(key) - - let from, nmFolder - if (externalEdge) { - const fromLocation = join('node_modules', '.store', key, 'node_modules', node.packageName) - from = root.children.find(c => c.location === fromLocation) - nmFolder = join('node_modules', '.store', key, 'node_modules') - } else { - from = node.isProjectRoot ? root : root.fsChildren.find(c => c.location === node.localLocation) - nmFolder = join(node.localLocation, 'node_modules') - } - /* istanbul ignore next - strict-peer-deps can exclude nodes from the tree */ - if (!from) { - return - } + this.#processEdges(this.idealGraph, false, root) + for (const node of this.idealGraph.workspaces) { + this.#processEdges(node, false, root) + } + return root + } - const processDeps = (dep, optional, external) => { - optional = !!optional - external = !!external + #processEdges (node, externalEdge, root) { + const key = getKey(node) + if (this.#processedEdges.has(key)) { + return + } + this.#processedEdges.add(key) - const location = join(nmFolder, dep.name) - const binNames = dep.package.bin && Object.keys(dep.package.bin) || [] - const toKey = getKey(dep) + let from, nmFolder + if (externalEdge) { + const fromLocation = join('node_modules', '.store', key, 'node_modules', node.packageName) + from = root.children.get(fromLocation) + nmFolder = join('node_modules', '.store', key, 'node_modules') + } else { + from = node.isProjectRoot ? root : root.inventory.get(node.localLocation) + nmFolder = join(node.localLocation, 'node_modules') + } + /* istanbul ignore next - strict-peer-deps can exclude nodes from the tree */ + if (!from) { + return + } - let target - if (external) { - const toLocation = join('node_modules', '.store', toKey, 'node_modules', dep.packageName) - target = root.children.find(c => c.location === toLocation) - } else { - target = root.fsChildren.find(c => c.location === dep.localLocation) - } - // TODO: we should no-op is an edge has already been created with the same fromKey and toKey - /* istanbul ignore next - strict-peer-deps can exclude nodes from the tree */ - if (!target) { - return - } + for (const dep of node.localDependencies) { + this.#processEdges(dep, false, root) + // nonOptional, local + this.#processDeps(dep, false, false, root, from, nmFolder) + } + for (const dep of node.externalDependencies) { + this.#processEdges(dep, true, root) + // nonOptional, external + this.#processDeps(dep, false, true, root, from, nmFolder) + } + for (const dep of node.externalOptionalDependencies) { + this.#processEdges(dep, true, root) + // optional, external + this.#processDeps(dep, true, true, root, from, nmFolder) + } + } - binNames.forEach(bn => { - target.binPaths.push(join(from.realpath, 'node_modules', '.bin', bn)) - }) - - const link = { - global: false, - globalTop: false, - isProjectRoot: false, - edgesIn: new Set(), - edgesOut: new Map(), - binPaths: [], - isTop: false, - optional, - location: location, - path: join(dep.root.localPath, nmFolder, dep.name), - realpath: target.path, - name: toKey, - resolved: dep.resolved, - top: { path: dep.root.localPath }, - children: [], - fsChildren: [], - isLink: true, - isStoreLink: true, - isRoot: false, - package: { _id: 'abc', bundleDependencies: undefined, deprecated: undefined, bin: target.package.bin, scripts: dep.package.scripts }, - target, - } - const newEdge1 = { optional, from, to: link } - from.edgesOut.set(dep.name, newEdge1) - link.edgesIn.add(newEdge1) - const newEdge2 = { optional: false, from: link, to: target } - link.edgesOut.set(dep.name, newEdge2) - target.edgesIn.add(newEdge2) - root.children.push(link) - } + #processDeps (dep, optional, external, root, from, nmFolder) { + const toKey = getKey(dep) - for (const dep of node.localDependencies) { - processEdges(dep, false) - // nonOptional, local - processDeps(dep, false, false) - } - for (const dep of node.externalDependencies) { - processEdges(dep, true) - // nonOptional, external - processDeps(dep, false, true) - } - for (const dep of node.externalOptionalDependencies) { - processEdges(dep, true) - // optional, external - processDeps(dep, true, true) + let target + if (external) { + const toLocation = join('node_modules', '.store', toKey, 'node_modules', dep.packageName) + target = root.children.get(toLocation) + } else { + target = root.inventory.get(dep.localLocation) + } + // TODO: we should no-op is an edge has already been created with the same fromKey and toKey + /* istanbul ignore next - strict-peer-deps can exclude nodes from the tree */ + if (!target) { + return + } + + if (dep.package.bin) { + for (const bn in dep.package.bin) { + target.binPaths.push(join(dep.root.localPath, nmFolder, '.bin', bn)) } } - processEdges(proxiedIdealTree, false) - for (const node of proxiedIdealTree.workspaces) { - processEdges(node, false) + const pkg = { + _id: dep.package._id, + bin: target.package.bin, + bundleDependencies: undefined, + deprecated: undefined, + scripts: dep.package.scripts, + version: dep.package.version, } - root.children.forEach(c => c.parent = root) - root.children.forEach(c => c.root = root) - root.root = root - root.target = root - return root + const link = new IsolatedLink({ + isStoreLink: true, + location: join(nmFolder, dep.name), + name: toKey, + optional, + parent: root, + package: pkg, + path: join(dep.root.localPath, nmFolder, dep.name), + realpath: target.path, + resolved: external ? `file:.store/${toKey}/node_modules/${dep.packageName}` : dep.resolved, + root, + target, + }) + // XXX top is from place-dep not lib/link.js + link.top = { path: dep.root.localPath } + const newEdge1 = { optional, from, to: link } + from.edgesOut.set(dep.name, newEdge1) + link.edgesIn.add(newEdge1) + const newEdge2 = { optional: false, from: link, to: target } + link.edgesOut.set(dep.name, newEdge2) + target.edgesIn.add(newEdge2) + root.children.set(link.location, link) } } diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/arborist/rebuild.js b/deps/npm/node_modules/@npmcli/arborist/lib/arborist/rebuild.js index 317cfc1df8a728..d4cce1ac02776c 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/arborist/rebuild.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/arborist/rebuild.js @@ -9,6 +9,7 @@ const runScript = require('@npmcli/run-script') const { callLimit: promiseCallLimit } = require('promise-call-limit') const { depth: dfwalk } = require('treeverse') const { isNodeGypPackage, defaultGypInstallScript } = require('@npmcli/node-gyp') +const { promiseRetry } = require('@gar/promise-retry') const { log, time } = require('proc-log') const { resolve } = require('node:path') @@ -381,13 +382,20 @@ module.exports = cls => class Builder extends cls { const timeEnd = time.start(`build:link:${node.location}`) - const p = binLinks({ + // On Windows, antivirus/indexer can transiently lock files, causing EPERM/EACCES/EBUSY on the rename inside write-file-atomic (used by bin-links/fix-bin.js), so, retry with backoff. + const p = promiseRetry((retry) => binLinks({ pkg: node.package, path: node.path, top: !!(node.isTop || node.globalTop), force: this.options.force, global: !!node.globalTop, - }) + }).catch(/* istanbul ignore next - Windows-only transient antivirus locks */ err => { + if (process.platform === 'win32' && + (err.code === 'EPERM' || err.code === 'EACCES' || err.code === 'EBUSY')) { + return retry(err) + } + throw err + }), { retries: 5, minTimeout: 500 }) await (this.#doHandleOptionalFailure ? this[_handleOptionalFailure](node, p) diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/arborist/reify.js b/deps/npm/node_modules/@npmcli/arborist/lib/arborist/reify.js index 5f376e94a4cecf..44ac7cd34dcbc1 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/arborist/reify.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/arborist/reify.js @@ -8,9 +8,10 @@ const promiseAllRejectLate = require('promise-all-reject-late') const runScript = require('@npmcli/run-script') const { callLimit: promiseCallLimit } = require('promise-call-limit') const { depth: dfwalk } = require('treeverse') -const { dirname, resolve, relative, join } = require('node:path') +const { dirname, resolve, relative, join, sep } = require('node:path') const { log, time } = require('proc-log') -const { lstat, mkdir, rm, symlink } = require('node:fs/promises') +const { existsSync } = require('node:fs') +const { lstat, mkdir, readdir, rm, symlink } = require('node:fs/promises') const { moveFile } = require('@npmcli/fs') const { subset, intersects } = require('semver') const { walkUp } = require('walk-up-path') @@ -26,6 +27,7 @@ const retirePath = require('../retire-path.js') const treeCheck = require('../tree-check.js') const { defaultLockfileVersion } = require('../shrinkwrap.js') const { saveTypeMap, hasSubKey } = require('../add-rm-pkg-deps.js') +const { IsolatedNode, IsolatedLink } = require('../isolated-classes.js') // Part of steps (steps need refactoring before we can do anything about these) const _retireShallowNodes = Symbol.for('retireShallowNodes') @@ -63,8 +65,6 @@ const _resolvedAdd = Symbol.for('resolvedAdd') // used by build-ideal-tree mixin const _addNodeToTrashList = Symbol.for('addNodeToTrashList') -const _createIsolatedTree = Symbol.for('createIsolatedTree') - module.exports = cls => class Reifier extends cls { #bundleMissing = new Set() // child nodes we'd EXPECT to be included in a bundle, but aren't #bundleUnpacked = new Set() // the nodes we unpack to read their bundles @@ -75,6 +75,7 @@ module.exports = cls => class Reifier extends cls { #shrinkwrapInflated = new Set() #sparseTreeDirs = new Set() #sparseTreeRoots = new Set() + #linkedActualForDiff = null constructor (options) { super(options) @@ -115,16 +116,23 @@ module.exports = cls => class Reifier extends cls { // this is currently technical debt which will be resolved in a refactor // of Node/Link trees log.warn('reify', 'The "linked" install strategy is EXPERIMENTAL and may contain bugs.') - this.idealTree = await this[_createIsolatedTree]() + this.idealTree = await this.createIsolatedTree() + if (this.actualTree) { + this.#linkedActualForDiff = this.#buildLinkedActualForDiff( + this.idealTree, this.actualTree + ) + } } await this[_diffTrees]() await this.#reifyPackages() if (linked) { + await this.#cleanOrphanedStoreEntries() // swap back in the idealTree // so that the lockfile is preserved this.idealTree = oldTree } await this[_saveIdealTree](options) + this.#linkedActualForDiff = null // clean inert for (const node of this.idealTree.inventory.values()) { if (node.inert) { @@ -146,7 +154,7 @@ module.exports = cls => class Reifier extends cls { // was not changed, delete anything in the ideal and not actual. // Then we move the entire idealTree over to this.actualTree, and // save the hidden lockfile. - if (this.diff && this.diff.filterSet.size) { + if (this.diff && this.diff.filterSet.size && !linked) { const reroot = new Set() const { filterSet } = this.diff @@ -422,13 +430,18 @@ module.exports = cls => class Reifier extends cls { if (includeWorkspaces) { // add all ws nodes to filterNodes for (const ws of this.options.workspaces) { - const ideal = this.idealTree.children.get && this.idealTree.children.get(ws) + const ideal = this.idealTree.children.get(ws) if (ideal) { filterNodes.push(ideal) } - const actual = this.actualTree.children.get(ws) - if (actual) { - filterNodes.push(actual) + // Skip actual-side filterNodes when using the linked diff wrapper. + // Those nodes have root===actualTree, not root===linkedActualForDiff, and Diff.calculate requires filterNode.root to match actual. + // The ideal filterNode alone is sufficient to scope the workspace diff. + if (!this.#linkedActualForDiff) { + const actual = this.actualTree.children.get(ws) + if (actual) { + filterNodes.push(actual) + } } } } @@ -450,7 +463,7 @@ module.exports = cls => class Reifier extends cls { omit: this.#omit, shrinkwrapInflated: this.#shrinkwrapInflated, filterNodes, - actual: this.actualTree, + actual: this.#linkedActualForDiff || this.actualTree, ideal: this.idealTree, }) @@ -573,6 +586,7 @@ module.exports = cls => class Reifier extends cls { // if the directory already exists, made will be undefined. if that's the case // we don't want to remove it because we aren't the ones who created it so we // omit it from the #sparseTreeRoots + /* istanbul ignore next -- pre-existing: mkdir returns undefined when dir exists, covered in reify tests but lost in aggregate coverage merge */ if (made) { this.#sparseTreeRoots.add(made) } @@ -789,6 +803,63 @@ module.exports = cls => class Reifier extends cls { return join(filePath) } + // Build a flat actual tree wrapper for linked installs so the diff can correctly match store entries that already exist on disk. + // The proxy tree from createIsolatedTree() is flat (all children on root), but loadActual() produces a nested tree where store entries are deep link targets. + // This wrapper surfaces them at the root level for comparison. + #buildLinkedActualForDiff (idealTree, actualTree) { + // Combined Map keyed by path (how allChildren() in diff.js keys) + const combined = new Map() + + // Create synthetic actual entries for ALL ideal children that exist on disk. + // The isolated ideal tree is flat (all entries as root children), but loadActual() produces a nested tree where workspace deps are under fsChildren and store entries are deep link targets. + // Synthetic entries ensure the diff compares matching resolved/integrity values (e.g. workspace links have resolved=undefined in the ideal tree but resolved="file:../packages/..." in the actual tree). + for (const child of idealTree.children.values()) { + if (combined.has(child.path) || !existsSync(child.path)) { + continue + } + // Skip store links whose ideal realpath doesn't exist on disk yet — the store hash changed and the symlink needs recreating via ADD. + if (child.isLink && child.resolved?.startsWith('file:.store/') && !existsSync(child.realpath)) { + continue + } + let entry + if (child.isLink) { + entry = new IsolatedLink(child) + } else { + entry = new IsolatedNode(child) + } + if (child.isLink && combined.has(child.realpath)) { + entry.target = combined.get(child.realpath) + } + combined.set(child.path, entry) + } + + // Proxy .get(name) to original actual tree for filterNodes compatibility + // (scoped workspace installs use .get(name), allChildren uses .values()) + const origGet = actualTree.children.get.bind(actualTree.children) + const combinedGet = combined.get.bind(combined) + /* istanbul ignore next -- only reached during scoped workspace installs */ + combined.get = (key) => combinedGet(key) || origGet(key) + + let wrapper + /* istanbul ignore next - untested! */ + if (actualTree.isLink) { + wrapper = new IsolatedLink(actualTree) + } else { + wrapper = new IsolatedNode(actualTree) + } + wrapper.root = wrapper + wrapper.binPaths = actualTree.binPaths + wrapper.children = combined + wrapper.edgesOut = actualTree.edgesOut + // Use empty fsChildren so that allChildren() only picks up entries from the combined map. + // The actual fsChildren have real children with different resolved values (e.g. file:../../../node_modules/.store/... vs file:.store/...) that would overwrite our synthetic entries in allChildren(). + wrapper.fsChildren = new Set() + wrapper.integrity = actualTree.integrity + wrapper.inventory = actualTree.inventory + + return wrapper + } + #registryResolved (resolved) { // the default registry url is a magic value meaning "the currently // configured registry". @@ -1247,6 +1318,41 @@ module.exports = cls => class Reifier extends cls { timeEnd() } + // After a linked install, scan node_modules/.store/ and remove any directories that are not referenced by the current ideal tree. + // Store entries become orphaned when dependencies are updated or removed, because the diff never sees the old store keys. + async #cleanOrphanedStoreEntries () { + const storeDir = resolve(this.path, 'node_modules', '.store') + let entries + try { + entries = await readdir(storeDir) + } catch { + return + } + + // Collect valid store keys from the isolated ideal tree (location: node_modules/.store/{key}/node_modules/{pkg}) + const validKeys = new Set() + for (const child of this.idealTree.children.values()) { + if (child.isInStore) { + const key = child.location.split(sep)[2] + validKeys.add(key) + } + } + + const orphaned = entries.filter(e => !validKeys.has(e)) + if (!orphaned.length) { + return + } + + log.silly('reify', 'cleaning orphaned store entries', orphaned) + await promiseAllRejectLate( + orphaned.map(e => + rm(resolve(storeDir, e), { recursive: true, force: true }) + .catch(/* istanbul ignore next -- rm with force rarely fails */ + er => log.warn('cleanup', `Failed to remove orphaned store entry ${e}`, er)) + ) + ) + } + // last but not least, we save the ideal tree metadata to the package-lock // or shrinkwrap file, and any additions or removals to package.json async [_saveIdealTree] (options) { diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/audit-report.js b/deps/npm/node_modules/@npmcli/arborist/lib/audit-report.js index ce274635d3b7ca..3e74e100b6c537 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/audit-report.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/audit-report.js @@ -296,6 +296,8 @@ class AuditReport extends Map { if ( !node.version || node.isRoot || + node.isLink || + node.linksIn?.size > 0 || (this.filterSet && this.filterSet?.size !== 0 && !this.filterSet?.has(node)) ) { return false diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/diff.js b/deps/npm/node_modules/@npmcli/arborist/lib/diff.js index 465657cc624222..5a20749ad135db 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/diff.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/diff.js @@ -71,6 +71,7 @@ class Diff { tree: filterNode, visit: node => filterSet.add(node), getChildren: node => { + const orig = node node = node.target const loc = node.location const idealNode = ideal.inventory.get(loc) @@ -87,7 +88,12 @@ class Diff { } } - return ideals.concat(actuals) + const result = ideals.concat(actuals) + // Include link targets so store entries end up in filterSet + if (orig.isLink) { + result.push(node) + } + return result }, }) } diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/inventory.js b/deps/npm/node_modules/@npmcli/arborist/lib/inventory.js index 7b3f294fdab2c3..5e4a67eeed1032 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/inventory.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/inventory.js @@ -1,5 +1,4 @@ -// a class to manage an inventory and set of indexes of a set of objects based -// on specific fields. +// a class to manage an inventory and set of indexes of a set of objects based on specific fields. const { hasOwnProperty } = Object.prototype const debug = require('./debug.js') diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/isolated-classes.js b/deps/npm/node_modules/@npmcli/arborist/lib/isolated-classes.js new file mode 100644 index 00000000000000..d9770a386791f5 --- /dev/null +++ b/deps/npm/node_modules/@npmcli/arborist/lib/isolated-classes.js @@ -0,0 +1,138 @@ +// Alternate versions of different classes that we use for isolated mode +const CaseInsensitiveMap = require('./case-insensitive-map.js') +const { resolve } = require('node:path') + +// fake lib/inventory.js +class IsolatedInventory extends Map { + query () { + return [] + } +} + +// fake lib/node.js +class IsolatedNode { + binPaths = [] + children = new CaseInsensitiveMap() + edgesIn = new Set() + edgesOut = new CaseInsensitiveMap() + fsChildren = new Set() + hasShrinkwrap = false + integrity = null + inventory = new IsolatedInventory() + isInStore = false + linksIn = new Set() + meta = { loadedFromDisk: false } + optional = false + parent = null + root = null + tops = new Set() + workspaces = new Map() + + constructor (options) { + this.location = options.location + this.name = options.name + this.package = options.package + this.path = options.path + this.realpath = !this.isLink ? this.path : resolve(options.realpath) + + if (options.parent) { + this.parent = options.parent + } + if (options.resolved) { + this.resolved = options.resolved + } + if (options.root) { + this.root = options.root + } + if (options.isInStore) { + this.isInStore = true + } + if (options.optional) { + this.optional = true + } + } + + get isRoot () { + return this === this.root + } + + // The idealGraph is where this is set to true + get isProjectRoot () { + return false + } + + get inDepBundle () { + return false + } + + get isLink () { + return false + } + + get isTop () { + return !this.parent + } + + /* istanbul ignore next -- emulate lib/node.js */ + get global () { + return false + } + + get globalTop () { + return false + } + + /* istanbul ignore next -- emulate lib/node.js */ + set target (t) { + // nop + // In the real lib/node.js this throws in debug mode + } + + get target () { + return this + } + + /* istanbul ignore next -- emulate lib/node.js */ + getBundler () { + return null + } + + /* istanbul ignore next -- emulate lib/node.js */ + get hasInstallScript () { + const { hasInstallScript, scripts } = this.package + const { install, preinstall, postinstall } = scripts || {} + return !!(hasInstallScript || install || preinstall || postinstall) + } + + get version () { + return this.package.version + } +} + +// fake lib/link.js +class IsolatedLink extends IsolatedNode { + #target + isStoreLink = false + + constructor (options) { + super(options) + this.#target = options.target + if (options.isStoreLink) { + this.isStoreLink = true + } + } + + get isLink () { + return true + } + + set target (t) { + this.#target = t + } + + get target () { + return this.#target + } +} + +module.exports = { IsolatedNode, IsolatedLink } diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/node.js b/deps/npm/node_modules/@npmcli/arborist/lib/node.js index c0891df4af1e4c..451ede1e52cbf6 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/node.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/node.js @@ -73,35 +73,34 @@ class Node { constructor (options) { // NB: path can be null if it's a link target const { - root, - path, - realpath, - parent, - error, - meta, - fsParent, - resolved, - integrity, - // allow setting name explicitly when we haven't set a path yet - name, children, + dev = true, + devOptional = true, + dummy = false, + error, + extraneous = true, fsChildren, + fsParent, + global = false, + hasShrinkwrap, + inert = false, installLinks = false, + integrity, + isInStore = false, legacyPeerDeps = false, linksIn, - isInStore = false, - hasShrinkwrap, - overrides, loadOverrides = false, - extraneous = true, - dev = true, + meta, + name, // allow setting name explicitly when we haven't set a path yet optional = true, - devOptional = true, + overrides, + parent, + path, peer = true, - global = false, - dummy = false, + realpath, + resolved, + root, sourceReference = null, - inert = false, } = options // this object gives querySelectorAll somewhere to stash context about a node // while processing a query diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/override-set.js b/deps/npm/node_modules/@npmcli/arborist/lib/override-set.js index b4a11ba589df77..ab597a7f33bd4a 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/override-set.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/override-set.js @@ -195,8 +195,29 @@ class OverrideSet { } } - // The override sets are incomparable. Neither one contains the other. - log.silly('Conflicting override sets', first, second) + // The override sets are incomparable (e.g. siblings like the "react" and "react-dom" children of the root override set). Check if they have semantically conflicting rules before treating this as an error. + if (this.haveConflictingRules(first, second)) { + log.silly('Conflicting override sets', first, second) + return undefined + } + + // The override sets are structurally incomparable but have compatible rules. Fall back to their nearest common ancestor so the node still has a valid override set. + return this.findCommonAncestor(first, second) + } + + static findCommonAncestor (first, second) { + const firstAncestors = [] + for (const ancestor of first.ancestry()) { + firstAncestors.push(ancestor) + } + for (const secondAnc of second.ancestry()) { + for (const firstAnc of firstAncestors) { + if (firstAnc.isEqual(secondAnc)) { + return firstAnc + } + } + } + return null } static doOverrideSetsConflict (first, second) { diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/query-selector-all.js b/deps/npm/node_modules/@npmcli/arborist/lib/query-selector-all.js index 71cfee736d9ccb..626af0c908e9cd 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/query-selector-all.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/query-selector-all.js @@ -793,9 +793,14 @@ const hasParent = (node, compareNodes) => { compareNode = compareNode.target } - // follows logical parent for link ancestors + // Follows logical parent for link ancestors (e.g. workspaces whose target lives outside node_modules). + // Only match if the node has a link whose parent is the compareNode. Without this check, nodes deep in the store (linked strategy) would incorrectly match as children of root via their fsParent chain. if (node.isTop && (node.resolveParent === compareNode)) { - return true + for (const link of node.linksIn) { + if (link.parent === compareNode) { + return true + } + } } // follows edges-in to check if they match a possible parent for (const edge of node.edgesIn) { diff --git a/deps/npm/node_modules/@npmcli/arborist/package.json b/deps/npm/node_modules/@npmcli/arborist/package.json index 3b49201fe966b8..58ddb99f8e3593 100644 --- a/deps/npm/node_modules/@npmcli/arborist/package.json +++ b/deps/npm/node_modules/@npmcli/arborist/package.json @@ -1,8 +1,9 @@ { "name": "@npmcli/arborist", - "version": "9.4.0", + "version": "9.4.2", "description": "Manage node_modules trees", "dependencies": { + "@gar/promise-retry": "^1.0.0", "@isaacs/string-locale-compare": "^1.1.0", "@npmcli/fs": "^5.0.0", "@npmcli/installed-package-contents": "^4.0.0", diff --git a/deps/npm/node_modules/@npmcli/config/lib/definitions/definitions.js b/deps/npm/node_modules/@npmcli/config/lib/definitions/definitions.js index 0de8142d3ca77b..c3e5cd2b430189 100644 --- a/deps/npm/node_modules/@npmcli/config/lib/definitions/definitions.js +++ b/deps/npm/node_modules/@npmcli/config/lib/definitions/definitions.js @@ -946,6 +946,17 @@ const definitions = { `, flatten, }), + 'include-attestations': new Definition('include-attestations', { + default: false, + type: Boolean, + description: ` + When used with \`npm audit signatures --json\`, includes the full + sigstore attestation bundles in the JSON output for each verified + package. The bundles contain DSSE envelopes, verification material, + and transparency log entries. + `, + flatten, + }), 'init-author-email': new Definition('init-author-email', { default: '', hint: '<email>', @@ -1353,6 +1364,7 @@ const definitions = { hint: '<days>', type: [null, Number], exclusive: ['before'], + envExport: false, description: ` If set, npm will build the npm tree such that only versions that were available more than the given number of days ago will be installed. If diff --git a/deps/npm/node_modules/@npmcli/config/lib/index.js b/deps/npm/node_modules/@npmcli/config/lib/index.js index 8520a02b6ed77c..a1acb7969b29f6 100644 --- a/deps/npm/node_modules/@npmcli/config/lib/index.js +++ b/deps/npm/node_modules/@npmcli/config/lib/index.js @@ -582,7 +582,7 @@ class Config { } } else { conf.raw = obj - for (const [key, value] of Object.entries(obj)) { + outer: for (const [key, value] of Object.entries(obj)) { const k = envReplace(key, this.env) const v = this.parseField(value, k) if (where !== 'default') { @@ -590,6 +590,13 @@ class Config { if (this.definitions[key]?.exclusive) { for (const exclusive of this.definitions[key].exclusive) { if (!this.isDefault(exclusive)) { + // when loading from env, skip only if sibling was explicitly set via CLI + if (where === 'env') { + const cliData = this.data.get('cli').data + if (Object.hasOwn(cliData, exclusive)) { + continue outer + } + } throw new TypeError(`--${key} cannot be provided when using --${exclusive}`) } } diff --git a/deps/npm/node_modules/@npmcli/config/package.json b/deps/npm/node_modules/@npmcli/config/package.json index 980a53d738b48d..5da16efc6cc4c3 100644 --- a/deps/npm/node_modules/@npmcli/config/package.json +++ b/deps/npm/node_modules/@npmcli/config/package.json @@ -1,6 +1,6 @@ { "name": "@npmcli/config", - "version": "10.7.1", + "version": "10.8.1", "files": [ "bin/", "lib/" diff --git a/deps/npm/node_modules/@npmcli/run-script/lib/set-path.js b/deps/npm/node_modules/@npmcli/run-script/lib/set-path.js index c59c270d9969a0..0344cc0b736f43 100644 --- a/deps/npm/node_modules/@npmcli/run-script/lib/set-path.js +++ b/deps/npm/node_modules/@npmcli/run-script/lib/set-path.js @@ -1,3 +1,4 @@ +const { log } = require('proc-log') const { resolve, dirname, delimiter } = require('path') // the path here is relative, even though it does not need to be // in order to make the posix tests pass in windows @@ -14,6 +15,13 @@ const setPATH = (projectPath, binPaths, env) => { const pathArr = [] if (binPaths) { + for (const bin of binPaths) { + if (bin.includes(delimiter)) { + const event = env.npm_lifecycle_event + const context = event ? `"${event}" script` : 'script execution' + log.warn('run-script', `Path contains delimiter ("${delimiter}"), ${context} may not behave as expected.`) + } + } pathArr.push(...binPaths) } // unshift the ./node_modules/.bin from every folder diff --git a/deps/npm/node_modules/@npmcli/run-script/package.json b/deps/npm/node_modules/@npmcli/run-script/package.json index 9ddb499084173c..6f782661de3488 100644 --- a/deps/npm/node_modules/@npmcli/run-script/package.json +++ b/deps/npm/node_modules/@npmcli/run-script/package.json @@ -1,6 +1,6 @@ { "name": "@npmcli/run-script", - "version": "10.0.3", + "version": "10.0.4", "description": "Run a lifecycle script for a package (descendant of npm-lifecycle)", "author": "GitHub Inc.", "license": "ISC", @@ -16,7 +16,7 @@ }, "devDependencies": { "@npmcli/eslint-config": "^6.0.0", - "@npmcli/template-oss": "4.28.0", + "@npmcli/template-oss": "4.29.0", "spawk": "^1.8.1", "tap": "^16.0.1" }, @@ -25,8 +25,7 @@ "@npmcli/package-json": "^7.0.0", "@npmcli/promise-spawn": "^9.0.0", "node-gyp": "^12.1.0", - "proc-log": "^6.0.0", - "which": "^6.0.0" + "proc-log": "^6.0.0" }, "files": [ "bin/", @@ -42,7 +41,7 @@ }, "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.28.0", + "version": "4.29.0", "publish": "true" }, "tap": { diff --git a/deps/npm/node_modules/@sigstore/core/dist/crypto.js b/deps/npm/node_modules/@sigstore/core/dist/crypto.js index 296b5ba43e86a0..8d8110ee423476 100644 --- a/deps/npm/node_modules/@sigstore/core/dist/crypto.js +++ b/deps/npm/node_modules/@sigstore/core/dist/crypto.js @@ -25,7 +25,16 @@ limitations under the License. const crypto_1 = __importDefault(require("crypto")); function createPublicKey(key, type = 'spki') { if (typeof key === 'string') { - return crypto_1.default.createPublicKey(key); + if (key.startsWith('-----')) { + return crypto_1.default.createPublicKey(key); + } + else { + return crypto_1.default.createPublicKey({ + key: Buffer.from(key, 'base64'), + format: 'der', + type: type, + }); + } } else { return crypto_1.default.createPublicKey({ key, format: 'der', type: type }); diff --git a/deps/npm/node_modules/@sigstore/core/package.json b/deps/npm/node_modules/@sigstore/core/package.json index 8cd757103e7a11..0564a373c6fa31 100644 --- a/deps/npm/node_modules/@sigstore/core/package.json +++ b/deps/npm/node_modules/@sigstore/core/package.json @@ -1,6 +1,6 @@ { "name": "@sigstore/core", - "version": "3.1.0", + "version": "3.2.0", "description": "Base library for Sigstore", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/deps/npm/node_modules/@sigstore/sign/dist/external/fetch.js b/deps/npm/node_modules/@sigstore/sign/dist/external/fetch.js index 116090f3c641ef..9f65c8a7607fde 100644 --- a/deps/npm/node_modules/@sigstore/sign/dist/external/fetch.js +++ b/deps/npm/node_modules/@sigstore/sign/dist/external/fetch.js @@ -19,15 +19,15 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ +const promise_retry_1 = require("@gar/promise-retry"); const http2_1 = require("http2"); const make_fetch_happen_1 = __importDefault(require("make-fetch-happen")); const proc_log_1 = require("proc-log"); -const promise_retry_1 = __importDefault(require("promise-retry")); const util_1 = require("../util"); const error_1 = require("./error"); const { HTTP2_HEADER_LOCATION, HTTP2_HEADER_CONTENT_TYPE, HTTP2_HEADER_USER_AGENT, HTTP_STATUS_INTERNAL_SERVER_ERROR, HTTP_STATUS_TOO_MANY_REQUESTS, HTTP_STATUS_REQUEST_TIMEOUT, } = http2_1.constants; async function fetchWithRetry(url, options) { - return (0, promise_retry_1.default)(async (retry, attemptNum) => { + return (0, promise_retry_1.promiseRetry)(async (retry, attemptNum) => { const method = options.method || 'POST'; const headers = { [HTTP2_HEADER_USER_AGENT]: util_1.ua.getUserAgent(), diff --git a/deps/npm/node_modules/@sigstore/sign/package.json b/deps/npm/node_modules/@sigstore/sign/package.json index 0f844a8735a891..c6b3f184a7bf1d 100644 --- a/deps/npm/node_modules/@sigstore/sign/package.json +++ b/deps/npm/node_modules/@sigstore/sign/package.json @@ -1,6 +1,6 @@ { "name": "@sigstore/sign", - "version": "4.1.0", + "version": "4.1.1", "description": "Sigstore signing library", "main": "dist/index.js", "types": "dist/index.d.ts", @@ -27,18 +27,17 @@ }, "devDependencies": { "@sigstore/jest": "^0.0.0", - "@sigstore/mock": "^0.11.0", + "@sigstore/mock": "^0.12.0", "@sigstore/rekor-types": "^4.0.0", - "@types/make-fetch-happen": "^10.0.4", - "@types/promise-retry": "^1.1.6" + "@types/make-fetch-happen": "^10.0.4" }, "dependencies": { "@sigstore/bundle": "^4.0.0", - "@sigstore/core": "^3.1.0", + "@sigstore/core": "^3.2.0", "@sigstore/protobuf-specs": "^0.5.0", - "make-fetch-happen": "^15.0.3", + "make-fetch-happen": "^15.0.4", "proc-log": "^6.1.0", - "promise-retry": "^2.0.1" + "@gar/promise-retry": "^1.0.2" }, "engines": { "node": "^20.17.0 || >=22.9.0" diff --git a/deps/npm/node_modules/@sigstore/tuf/package.json b/deps/npm/node_modules/@sigstore/tuf/package.json index a782796c45ed6c..b1fd9bebe135d0 100644 --- a/deps/npm/node_modules/@sigstore/tuf/package.json +++ b/deps/npm/node_modules/@sigstore/tuf/package.json @@ -1,6 +1,6 @@ { "name": "@sigstore/tuf", - "version": "4.0.1", + "version": "4.0.2", "description": "Client for the Sigstore TUF repository", "main": "dist/index.js", "types": "dist/index.d.ts", @@ -28,7 +28,7 @@ }, "devDependencies": { "@sigstore/jest": "^0.0.0", - "@tufjs/repo-mock": "^4.0.0", + "@tufjs/repo-mock": "^4.0.1", "@types/make-fetch-happen": "^10.0.4" }, "dependencies": { diff --git a/deps/npm/node_modules/@sigstore/tuf/seeds.json b/deps/npm/node_modules/@sigstore/tuf/seeds.json index 54cb71f29ef0cf..2bd03b34f7db8d 100644 --- a/deps/npm/node_modules/@sigstore/tuf/seeds.json +++ b/deps/npm/node_modules/@sigstore/tuf/seeds.json @@ -1 +1 @@ -{"https://tuf-repo-cdn.sigstore.dev":{"root.json":"ewogInNpZ25hdHVyZXMiOiBbCiAgewogICAia2V5aWQiOiAiNmYyNjAwODlkNTkyM2RhZjIwMTY2Y2E2NTdjNTQzYWY2MTgzNDZhYjk3MTg4NGE5OTk2MmIwMTk4OGJiZTBjMyIsCiAgICJzaWciOiAiIgogIH0sCiAgewogICAia2V5aWQiOiAiZTcxYTU0ZDU0MzgzNWJhODZhZGFkOTQ2MDM3OWM3NjQxZmI4NzI2ZDE2NGVhNzY2ODAxYTFjNTIyYWJhN2VhMiIsCiAgICJzaWciOiAiMzA0NTAyMjEwMGJiZGRkNDY0ZjgwNjZjZWI4OGJhNzg3Mzc1YzEyY2Q2MzMwNjgwZTA4YzI5MTA3MDNlNjUzOGM3MWNjNzlhZDIwMjIwNTE5MGIwNmU0NTM3ZmU5NjFiM2VmODFmZTY4ZWRjZDAwODljMTlmOTE5YWZlZDQyM2I5YWFmZDcwMDY0MTE1MyIKICB9LAogIHsKICAgImtleWlkIjogIjIyZjRjYWVjNmQ4ZTZmOTU1NWFmNjZiM2Q0YzNjYjA2YTNiYjIzZmRjN2UzOWM5MTZjNjFmNDYyZTZmNTJiMDYiLAogICAic2lnIjogIjMwNDQwMjIwNjkzMDZjZDUyNTdmNzMyYTc0MGMxYWZlNjBhOGU0MzNjNWRlNThlYWZlYWRiZTk5YzMzNmM5YzcxZDE5OGNmODAyMjAwZDc3Mzk1M2FlN2RiYzQ4ZDNlNWJhZDlhNmY2NGJhZmZmMTk2YjdlMmFkNGE1MmExOTUxOTM2N2Q0N2RjMDQyIgogIH0sCiAgewogICAia2V5aWQiOiAiNjE2NDM4MzgxMjViNDQwYjQwZGI2OTQyZjVjYjVhMzFjMGRjMDQzNjgzMTZlYjJhYWE1OGI5NTkwNGE1ODIyMiIsCiAgICJzaWciOiAiMzA0NDAyMjA0ZDIxYTJlYzgwZGY2NmU2MWY2ZmUyOTEyOTUxZGM0N2RmODM2MDM2ZjhjMGFiMTA4MTZkMzc1ZTcxZGJmNzllMDIyMDU0N2FkY2UxYWZkZjA0ZTY3OTRlZmEyMDNkZDUyNjRjNmY3ZTBlZjc4ZTU3ZmU5MzRiMGQyNmNiOTk0ZWVjNzYiCiAgfSwKICB7CiAgICJrZXlpZCI6ICJhNjg3ZTViZjRmYWI4MmIwZWU1OGQ0NmUwNWM5NTM1MTQ1YTJjOWFmYjQ1OGY0M2Q0MmI0NWNhMGZkY2UyYTcwIiwKICAgInNpZyI6ICIzMDQ1MDIyMDYwODI2NDk2NTU3MTQ0ZWIxNjQ5ODkzZWQ1ZjZmNGVhNTQ1MzZmZWIwY2E4MmY4Yjg5YWU2NDFiZTM5NzQzZTUwMjIxMDBhZDcxMThiNWU5ZDQ4MzczMjYyMDZlNDEyZmM2ZGEyOTk5OTI1ZDExMDMyOGE3YzE2NmIwNmM2MjQzMzZjOTNmIgogIH0sCiAgewogICAia2V5aWQiOiAiMTgzZTY0ZjM3NjcwZGMxM2NhMGQyODk5NWEzMDUzZjM3NDA5NTRkZGNlNDQzMjFhNDFlNDY1MzRjZjQ0ZTYzMiIsCiAgICJzaWciOiAiMzA0NjAyMjEwMGQ4MTc5NDM5YzJlNzNlYjBjMTczM2FiZWU3ZmFmODMyZGNhZWE3MjYzZWRjYjQ5MTk4OTFjM2EyNDdmMDU5MjMwMjIxMDBlMWE0MzdlMDc5N2U4MDNmOWI3MmRjOWQyZDkyMTU1YjBhMjI3MGMyNGVmZGQ1ZjRiM2E1ZDhmMGIwZjQzMWE3IgogIH0KIF0sCiAic2lnbmVkIjogewogICJfdHlwZSI6ICJyb290IiwKICAiY29uc2lzdGVudF9zbmFwc2hvdCI6IHRydWUsCiAgImV4cGlyZXMiOiAiMjAyNi0wMS0yMlQxMzowNTo1OVoiLAogICJrZXlzIjogewogICAiMGM4NzQzMmMzYmYwOWZkOTkxODlmZGMzMmZhNWVhZWRmNGU0YTVmYWM3YmFiNzNmYTA0YTJlMGZjNjRhZjZmNSI6IHsKICAgICJrZXlpZF9oYXNoX2FsZ29yaXRobXMiOiBbCiAgICAgInNoYTI1NiIsCiAgICAgInNoYTUxMiIKICAgIF0sCiAgICAia2V5dHlwZSI6ICJlY2RzYSIsCiAgICAia2V5dmFsIjogewogICAgICJwdWJsaWMiOiAiLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRVdSaUdyNStqKzNKNVNzSCtadHI1bkUySDJ3TzdcbkJWK25PM3M5M2dMY2ExOHFUT3pIWTFvV3lBR0R5a01Tc0dUVUJTdDlEK0FuMEtmS3NEMm1mU000MlE9PVxuLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tXG4iCiAgICB9LAogICAgInNjaGVtZSI6ICJlY2RzYS1zaGEyLW5pc3RwMjU2IiwKICAgICJ4LXR1Zi1vbi1jaS1vbmxpbmUtdXJpIjogImdjcGttczpwcm9qZWN0cy9zaWdzdG9yZS1yb290LXNpZ25pbmcvbG9jYXRpb25zL2dsb2JhbC9rZXlSaW5ncy9yb290L2NyeXB0b0tleXMvdGltZXN0YW1wL2NyeXB0b0tleVZlcnNpb25zLzEiCiAgIH0sCiAgICIxODNlNjRmMzc2NzBkYzEzY2EwZDI4OTk1YTMwNTNmMzc0MDk1NGRkY2U0NDMyMWE0MWU0NjUzNGNmNDRlNjMyIjogewogICAgImtleXR5cGUiOiAiZWNkc2EiLAogICAgImtleXZhbCI6IHsKICAgICAicHVibGljIjogIi0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tXG5NRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVNeHBQT0pDSVo1b3RHNDEwNmZHSnNlRVFpM1Y5XG5wa01ZUTR1eVY5VGoxTTdXSFhJeUxHK2prZnZ1RzBnbFExSlpiUlpaQlYzZ0FSNHNvamRHSElTZW93PT1cbi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLVxuIgogICAgfSwKICAgICJzY2hlbWUiOiAiZWNkc2Etc2hhMi1uaXN0cDI1NiIsCiAgICAieC10dWYtb24tY2kta2V5b3duZXIiOiAiQGxhbmNlIgogICB9LAogICAiMjJmNGNhZWM2ZDhlNmY5NTU1YWY2NmIzZDRjM2NiMDZhM2JiMjNmZGM3ZTM5YzkxNmM2MWY0NjJlNmY1MmIwNiI6IHsKICAgICJrZXlpZF9oYXNoX2FsZ29yaXRobXMiOiBbCiAgICAgInNoYTI1NiIsCiAgICAgInNoYTUxMiIKICAgIF0sCiAgICAia2V5dHlwZSI6ICJlY2RzYSIsCiAgICAia2V5dmFsIjogewogICAgICJwdWJsaWMiOiAiLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRXpCelZPbUhDUG9qTVZMU0kzNjRXaWlWOE5QckRcbjZJZ1J4Vmxpc2t6L3YreTNKRVI1bWNWR2NPTmxpRGNXTUM1SjJsZkhtalBOUGhiNEg3eG04THpmU0E9PVxuLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tXG4iCiAgICB9LAogICAgInNjaGVtZSI6ICJlY2RzYS1zaGEyLW5pc3RwMjU2IiwKICAgICJ4LXR1Zi1vbi1jaS1rZXlvd25lciI6ICJAc2FudGlhZ290b3JyZXMiCiAgIH0sCiAgICI2MTY0MzgzODEyNWI0NDBiNDBkYjY5NDJmNWNiNWEzMWMwZGMwNDM2ODMxNmViMmFhYTU4Yjk1OTA0YTU4MjIyIjogewogICAgImtleWlkX2hhc2hfYWxnb3JpdGhtcyI6IFsKICAgICAic2hhMjU2IiwKICAgICAic2hhNTEyIgogICAgXSwKICAgICJrZXl0eXBlIjogImVjZHNhIiwKICAgICJrZXl2YWwiOiB7CiAgICAgInB1YmxpYyI6ICItLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLVxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFaW5pa1NzQVFtWWtOZUg1ZVlxL0NuSXpMYWFjT1xueGxTYWF3UURPd3FLeS90Q3F4cTV4eFBTSmMyMUs0V0loczlHeU9rS2Z6dWVZM0dJTHpjTUpaNGNXdz09XG4tLS0tLUVORCBQVUJMSUMgS0VZLS0tLS1cbiIKICAgIH0sCiAgICAic2NoZW1lIjogImVjZHNhLXNoYTItbmlzdHAyNTYiLAogICAgIngtdHVmLW9uLWNpLWtleW93bmVyIjogIkBib2JjYWxsYXdheSIKICAgfSwKICAgImE2ODdlNWJmNGZhYjgyYjBlZTU4ZDQ2ZTA1Yzk1MzUxNDVhMmM5YWZiNDU4ZjQzZDQyYjQ1Y2EwZmRjZTJhNzAiOiB7CiAgICAia2V5aWRfaGFzaF9hbGdvcml0aG1zIjogWwogICAgICJzaGEyNTYiLAogICAgICJzaGE1MTIiCiAgICBdLAogICAgImtleXR5cGUiOiAiZWNkc2EiLAogICAgImtleXZhbCI6IHsKICAgICAicHVibGljIjogIi0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tXG5NRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUUwZ2hyaDkyTHcxWXIzaWRHVjVXcUN0TURCOEN4XG4rRDhoZEM0dzJaTE5JcGxWUm9WR0xza1lhM2doZU15T2ppSjhrUGkxNWFRMi8vN1Arb2o3VXZKUEd3PT1cbi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLVxuIgogICAgfSwKICAgICJzY2hlbWUiOiAiZWNkc2Etc2hhMi1uaXN0cDI1NiIsCiAgICAieC10dWYtb24tY2kta2V5b3duZXIiOiAiQGpvc2h1YWdsIgogICB9LAogICAiZTcxYTU0ZDU0MzgzNWJhODZhZGFkOTQ2MDM3OWM3NjQxZmI4NzI2ZDE2NGVhNzY2ODAxYTFjNTIyYWJhN2VhMiI6IHsKICAgICJrZXlpZF9oYXNoX2FsZ29yaXRobXMiOiBbCiAgICAgInNoYTI1NiIsCiAgICAgInNoYTUxMiIKICAgIF0sCiAgICAia2V5dHlwZSI6ICJlY2RzYSIsCiAgICAia2V5dmFsIjogewogICAgICJwdWJsaWMiOiAiLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRUVYc3ozU1pYRmI4ak1WNDJqNnBKbHlqYmpSOEtcbk4zQndvY2V4cTZMTUliNXFzV0tPUXZMTjE2TlVlZkxjNEhzd09vdW1Sc1ZWYWFqU3BRUzZmb2JrUnc9PVxuLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tXG4iCiAgICB9LAogICAgInNjaGVtZSI6ICJlY2RzYS1zaGEyLW5pc3RwMjU2IiwKICAgICJ4LXR1Zi1vbi1jaS1rZXlvd25lciI6ICJAbW5tNjc4IgogICB9CiAgfSwKICAicm9sZXMiOiB7CiAgICJyb290IjogewogICAgImtleWlkcyI6IFsKICAgICAiZTcxYTU0ZDU0MzgzNWJhODZhZGFkOTQ2MDM3OWM3NjQxZmI4NzI2ZDE2NGVhNzY2ODAxYTFjNTIyYWJhN2VhMiIsCiAgICAgIjIyZjRjYWVjNmQ4ZTZmOTU1NWFmNjZiM2Q0YzNjYjA2YTNiYjIzZmRjN2UzOWM5MTZjNjFmNDYyZTZmNTJiMDYiLAogICAgICI2MTY0MzgzODEyNWI0NDBiNDBkYjY5NDJmNWNiNWEzMWMwZGMwNDM2ODMxNmViMmFhYTU4Yjk1OTA0YTU4MjIyIiwKICAgICAiYTY4N2U1YmY0ZmFiODJiMGVlNThkNDZlMDVjOTUzNTE0NWEyYzlhZmI0NThmNDNkNDJiNDVjYTBmZGNlMmE3MCIsCiAgICAgIjE4M2U2NGYzNzY3MGRjMTNjYTBkMjg5OTVhMzA1M2YzNzQwOTU0ZGRjZTQ0MzIxYTQxZTQ2NTM0Y2Y0NGU2MzIiCiAgICBdLAogICAgInRocmVzaG9sZCI6IDMKICAgfSwKICAgInNuYXBzaG90IjogewogICAgImtleWlkcyI6IFsKICAgICAiMGM4NzQzMmMzYmYwOWZkOTkxODlmZGMzMmZhNWVhZWRmNGU0YTVmYWM3YmFiNzNmYTA0YTJlMGZjNjRhZjZmNSIKICAgIF0sCiAgICAidGhyZXNob2xkIjogMSwKICAgICJ4LXR1Zi1vbi1jaS1leHBpcnktcGVyaW9kIjogMzY1MCwKICAgICJ4LXR1Zi1vbi1jaS1zaWduaW5nLXBlcmlvZCI6IDM2NQogICB9LAogICAidGFyZ2V0cyI6IHsKICAgICJrZXlpZHMiOiBbCiAgICAgImU3MWE1NGQ1NDM4MzViYTg2YWRhZDk0NjAzNzljNzY0MWZiODcyNmQxNjRlYTc2NjgwMWExYzUyMmFiYTdlYTIiLAogICAgICIyMmY0Y2FlYzZkOGU2Zjk1NTVhZjY2YjNkNGMzY2IwNmEzYmIyM2ZkYzdlMzljOTE2YzYxZjQ2MmU2ZjUyYjA2IiwKICAgICAiNjE2NDM4MzgxMjViNDQwYjQwZGI2OTQyZjVjYjVhMzFjMGRjMDQzNjgzMTZlYjJhYWE1OGI5NTkwNGE1ODIyMiIsCiAgICAgImE2ODdlNWJmNGZhYjgyYjBlZTU4ZDQ2ZTA1Yzk1MzUxNDVhMmM5YWZiNDU4ZjQzZDQyYjQ1Y2EwZmRjZTJhNzAiLAogICAgICIxODNlNjRmMzc2NzBkYzEzY2EwZDI4OTk1YTMwNTNmMzc0MDk1NGRkY2U0NDMyMWE0MWU0NjUzNGNmNDRlNjMyIgogICAgXSwKICAgICJ0aHJlc2hvbGQiOiAzCiAgIH0sCiAgICJ0aW1lc3RhbXAiOiB7CiAgICAia2V5aWRzIjogWwogICAgICIwYzg3NDMyYzNiZjA5ZmQ5OTE4OWZkYzMyZmE1ZWFlZGY0ZTRhNWZhYzdiYWI3M2ZhMDRhMmUwZmM2NGFmNmY1IgogICAgXSwKICAgICJ0aHJlc2hvbGQiOiAxLAogICAgIngtdHVmLW9uLWNpLWV4cGlyeS1wZXJpb2QiOiA3LAogICAgIngtdHVmLW9uLWNpLXNpZ25pbmctcGVyaW9kIjogNgogICB9CiAgfSwKICAic3BlY192ZXJzaW9uIjogIjEuMCIsCiAgInZlcnNpb24iOiAxMywKICAieC10dWYtb24tY2ktZXhwaXJ5LXBlcmlvZCI6IDE5NywKICAieC10dWYtb24tY2ktc2lnbmluZy1wZXJpb2QiOiA0NgogfQp9","targets":{"trusted_root.json":"ewogICJtZWRpYVR5cGUiOiAiYXBwbGljYXRpb24vdm5kLmRldi5zaWdzdG9yZS50cnVzdGVkcm9vdCtqc29uO3ZlcnNpb249MC4xIiwKICAidGxvZ3MiOiBbCiAgICB7CiAgICAgICJiYXNlVXJsIjogImh0dHBzOi8vcmVrb3Iuc2lnc3RvcmUuZGV2IiwKICAgICAgImhhc2hBbGdvcml0aG0iOiAiU0hBMl8yNTYiLAogICAgICAicHVibGljS2V5IjogewogICAgICAgICJyYXdCeXRlcyI6ICJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUUyRzJZKzJ0YWJkVFY1QmNHaUJJeDBhOWZBRndya0JibUxTR3RrczRMM3FYNnlZWTB6dWZCbmhDOFVyL2l5NTVHaFdQLzlBL2JZMkxoQzMwTTkrUll0dz09IiwKICAgICAgICAia2V5RGV0YWlscyI6ICJQS0lYX0VDRFNBX1AyNTZfU0hBXzI1NiIsCiAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgInN0YXJ0IjogIjIwMjEtMDEtMTJUMTE6NTM6MjdaIgogICAgICAgIH0KICAgICAgfSwKICAgICAgImxvZ0lkIjogewogICAgICAgICJrZXlJZCI6ICJ3Tkk5YXRRR2x6K1ZXZk82TFJ5Z0g0UVVmWS84VzRSRndpVDVpNVdSZ0IwPSIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgImJhc2VVcmwiOiAiaHR0cHM6Ly9sb2cyMDI1LTEucmVrb3Iuc2lnc3RvcmUuZGV2IiwKICAgICAgImhhc2hBbGdvcml0aG0iOiAiU0hBMl8yNTYiLAogICAgICAicHVibGljS2V5IjogewogICAgICAgICJyYXdCeXRlcyI6ICJNQ293QlFZREsyVndBeUVBdDhybHAxa25Hd2pmYmNYQVlQWUFrbjBYaUx6MXg4TzR0MFlrRWhpZTI0ND0iLAogICAgICAgICJrZXlEZXRhaWxzIjogIlBLSVhfRUQyNTUxOSIsCiAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgInN0YXJ0IjogIjIwMjUtMDktMjNUMDA6MDA6MDBaIgogICAgICAgIH0KICAgICAgfSwKICAgICAgImxvZ0lkIjogewogICAgICAgICJrZXlJZCI6ICJ6eEdaRlZ2ZDBGRW1qUjhXckZ3TWRjQUo5dnRhWS9RWGY0NFkxd1VlUDZBPSIKICAgICAgfQogICAgfQogIF0sCiAgImNlcnRpZmljYXRlQXV0aG9yaXRpZXMiOiBbCiAgICB7CiAgICAgICJzdWJqZWN0IjogewogICAgICAgICJvcmdhbml6YXRpb24iOiAic2lnc3RvcmUuZGV2IiwKICAgICAgICAiY29tbW9uTmFtZSI6ICJzaWdzdG9yZSIKICAgICAgfSwKICAgICAgInVyaSI6ICJodHRwczovL2Z1bGNpby5zaWdzdG9yZS5kZXYiLAogICAgICAiY2VydENoYWluIjogewogICAgICAgICJjZXJ0aWZpY2F0ZXMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJyYXdCeXRlcyI6ICJNSUlCK0RDQ0FYNmdBd0lCQWdJVE5Wa0Rab0Npb2ZQRHN5N2RmbTZnZUxidWh6QUtCZ2dxaGtqT1BRUURBekFxTVJVd0V3WURWUVFLRXd4emFXZHpkRzl5WlM1a1pYWXhFVEFQQmdOVkJBTVRDSE5wWjNOMGIzSmxNQjRYRFRJeE1ETXdOekF6TWpBeU9Wb1hEVE14TURJeU16QXpNakF5T1Zvd0tqRVZNQk1HQTFVRUNoTU1jMmxuYzNSdmNtVXVaR1YyTVJFd0R3WURWUVFERXdoemFXZHpkRzl5WlRCMk1CQUdCeXFHU000OUFnRUdCU3VCQkFBaUEySUFCTFN5QTdJaTVrK3BOTzhaRVdZMHlsZW1XRG93T2tOYTNrTCtHWkU1WjVHV2VoTDkvQTliUk5BM1JicnNaNWkwSmNhc3RhUkw3U3A1ZnAvakQ1ZHhxYy9VZFRWbmx2UzE2YW4rMllmc3dlL1F1TG9sUlVDcmNPRTIrMmlBNSt0emQ2Tm1NR1F3RGdZRFZSMFBBUUgvQkFRREFnRUdNQklHQTFVZEV3RUIvd1FJTUFZQkFmOENBUUV3SFFZRFZSME9CQllFRk1qRkhRQkJtaVFwTWxFazZ3MnVTdTFLQnRQc01COEdBMVVkSXdRWU1CYUFGTWpGSFFCQm1pUXBNbEVrNncydVN1MUtCdFBzTUFvR0NDcUdTTTQ5QkFNREEyZ0FNR1VDTUg4bGlXSmZNdWk2dlhYQmhqRGdZNE13c2xtTi9USnhWZS84M1dyRm9td21OZjA1NnkxWDQ4RjljNG0zYTNvelhBSXhBS2pSYXk1L2FqL2pzS0tHSWttUWF0akk4dXVwSHIvK0N4RnZhSldtcFlxTmtMREdSVSs5b3J6aDVoSTJScmN1YVE9PSIKICAgICAgICAgIH0KICAgICAgICBdCiAgICAgIH0sCiAgICAgICJ2YWxpZEZvciI6IHsKICAgICAgICAic3RhcnQiOiAiMjAyMS0wMy0wN1QwMzoyMDoyOVoiLAogICAgICAgICJlbmQiOiAiMjAyMi0xMi0zMVQyMzo1OTo1OS45OTlaIgogICAgICB9CiAgICB9LAogICAgewogICAgICAic3ViamVjdCI6IHsKICAgICAgICAib3JnYW5pemF0aW9uIjogInNpZ3N0b3JlLmRldiIsCiAgICAgICAgImNvbW1vbk5hbWUiOiAic2lnc3RvcmUiCiAgICAgIH0sCiAgICAgICJ1cmkiOiAiaHR0cHM6Ly9mdWxjaW8uc2lnc3RvcmUuZGV2IiwKICAgICAgImNlcnRDaGFpbiI6IHsKICAgICAgICAiY2VydGlmaWNhdGVzIjogWwogICAgICAgICAgewogICAgICAgICAgICAicmF3Qnl0ZXMiOiAiTUlJQ0dqQ0NBYUdnQXdJQkFnSVVBTG5WaVZmblUwYnJKYXNtUmtIcm4vVW5mYVF3Q2dZSUtvWkl6ajBFQXdNd0tqRVZNQk1HQTFVRUNoTU1jMmxuYzNSdmNtVXVaR1YyTVJFd0R3WURWUVFERXdoemFXZHpkRzl5WlRBZUZ3MHlNakEwTVRNeU1EQTJNVFZhRncwek1URXdNRFV4TXpVMk5UaGFNRGN4RlRBVEJnTlZCQW9UREhOcFozTjBiM0psTG1SbGRqRWVNQndHQTFVRUF4TVZjMmxuYzNSdmNtVXRhVzUwWlhKdFpXUnBZWFJsTUhZd0VBWUhLb1pJemowQ0FRWUZLNEVFQUNJRFlnQUU4UlZTL3lzSCtOT3Z1RFp5UEladGlsZ1VGOU5sYXJZcEFkOUhQMXZCQkgxVTVDVjc3TFNTN3MwWmlING5FN0h2N3B0UzZMdnZSL1NUazc5OExWZ016TGxKNEhlSWZGM3RIU2FleExjWXBTQVNyMWtTME4vUmdCSnovOWpXQ2lYbm8zc3dlVEFPQmdOVkhROEJBZjhFQkFNQ0FRWXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUhBd013RWdZRFZSMFRBUUgvQkFnd0JnRUIvd0lCQURBZEJnTlZIUTRFRmdRVTM5UHB6MVlrRVpiNXFOanBLRldpeGk0WVpEOHdId1lEVlIwakJCZ3dGb0FVV01BZVg1RkZwV2FwZXN5UW9aTWkwQ3JGeGZvd0NnWUlLb1pJemowRUF3TURad0F3WkFJd1BDc1FLNERZaVpZRFBJYURpNUhGS25meFh4NkFTU1ZtRVJmc3luWUJpWDJYNlNKUm5aVTg0LzlEWmRuRnZ2eG1BakJPdDZRcEJsYzRKLzBEeHZrVENxcGNsdnppTDZCQ0NQbmpkbElCM1B1M0J4c1BteWdVWTdJaTJ6YmRDZGxpaW93PSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJyYXdCeXRlcyI6ICJNSUlCOXpDQ0FYeWdBd0lCQWdJVUFMWk5BUEZkeEhQd2plRGxvRHd5WUNoQU8vNHdDZ1lJS29aSXpqMEVBd013S2pFVk1CTUdBMVVFQ2hNTWMybG5jM1J2Y21VdVpHVjJNUkV3RHdZRFZRUURFd2h6YVdkemRHOXlaVEFlRncweU1URXdNRGN4TXpVMk5UbGFGdzB6TVRFd01EVXhNelUyTlRoYU1Db3hGVEFUQmdOVkJBb1RESE5wWjNOMGIzSmxMbVJsZGpFUk1BOEdBMVVFQXhNSWMybG5jM1J2Y21Vd2RqQVFCZ2NxaGtqT1BRSUJCZ1VyZ1FRQUlnTmlBQVQ3WGVGVDRyYjNQUUd3UzRJYWp0TGszL09sbnBnYW5nYUJjbFlwc1lCcjVpKzR5bkIwN2NlYjNMUDBPSU9aZHhleFg2OWM1aVZ1eUpSUStIejA1eWkrVUYzdUJXQWxIcGlTNXNoMCtIMkdIRTdTWHJrMUVDNW0xVHIxOUw5Z2c5MmpZekJoTUE0R0ExVWREd0VCL3dRRUF3SUJCakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlJZd0I1ZmtVV2xacWw2ekpDaGt5TFFLc1hGK2pBZkJnTlZIU01FR0RBV2dCUll3QjVma1VXbFpxbDZ6SkNoa3lMUUtzWEYrakFLQmdncWhrak9QUVFEQXdOcEFEQm1BakVBajFuSGVYWnArMTNOV0JOYStFRHNEUDhHMVdXZzF0Q01XUC9XSFBxcGFWbzBqaHN3ZU5GWmdTczBlRTd3WUk0cUFqRUEyV0I5b3Q5OHNJa29GM3ZaWWRkMy9WdFdCNWI5VE5NZWE3SXgvc3RKNVRmY0xMZUFCTEU0Qk5KT3NRNHZuQkhKIgogICAgICAgICAgfQogICAgICAgIF0KICAgICAgfSwKICAgICAgInZhbGlkRm9yIjogewogICAgICAgICJzdGFydCI6ICIyMDIyLTA0LTEzVDIwOjA2OjE1WiIKICAgICAgfQogICAgfQogIF0sCiAgImN0bG9ncyI6IFsKICAgIHsKICAgICAgImJhc2VVcmwiOiAiaHR0cHM6Ly9jdGZlLnNpZ3N0b3JlLmRldi90ZXN0IiwKICAgICAgImhhc2hBbGdvcml0aG0iOiAiU0hBMl8yNTYiLAogICAgICAicHVibGljS2V5IjogewogICAgICAgICJyYXdCeXRlcyI6ICJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUViZndSK1JKdWRYc2NnUkJScEtYMVhGRHkzUHl1ZER4ei9TZm5SaTFmVDhla3BmQmQyTzF1b3o3anIzWjhuS3p4QTY5RVVRK2VGQ0ZJM3pldWJQV1U3dz09IiwKICAgICAgICAia2V5RGV0YWlscyI6ICJQS0lYX0VDRFNBX1AyNTZfU0hBXzI1NiIsCiAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgInN0YXJ0IjogIjIwMjEtMDMtMTRUMDA6MDA6MDBaIiwKICAgICAgICAgICJlbmQiOiAiMjAyMi0xMC0zMVQyMzo1OTo1OS45OTlaIgogICAgICAgIH0KICAgICAgfSwKICAgICAgImxvZ0lkIjogewogICAgICAgICJrZXlJZCI6ICJDR0NTOENoUy8yaEYwZEZySjRTY1JXY1lyQlk5d3pqU2JlYThJZ1kyYjNJPSIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgImJhc2VVcmwiOiAiaHR0cHM6Ly9jdGZlLnNpZ3N0b3JlLmRldi8yMDIyIiwKICAgICAgImhhc2hBbGdvcml0aG0iOiAiU0hBMl8yNTYiLAogICAgICAicHVibGljS2V5IjogewogICAgICAgICJyYXdCeXRlcyI6ICJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVpUFNsRmkwQ21GVGZFakNVcUY5SHVDRWNZWE5LQWFZYWxJSm1CWjh5eWV6UGpUcWh4cktCcE1uYW9jVnRMSkJJMWVNM3VYblF6UUdBSmRKNGdzOUZ5dz09IiwKICAgICAgICAia2V5RGV0YWlscyI6ICJQS0lYX0VDRFNBX1AyNTZfU0hBXzI1NiIsCiAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgInN0YXJ0IjogIjIwMjItMTAtMjBUMDA6MDA6MDBaIgogICAgICAgIH0KICAgICAgfSwKICAgICAgImxvZ0lkIjogewogICAgICAgICJrZXlJZCI6ICIzVDB3YXNiSEVUSmpHUjRjbVdjM0FxSktYcmplUEszL2g0cHlnQzhwN280PSIKICAgICAgfQogICAgfQogIF0sCiAgInRpbWVzdGFtcEF1dGhvcml0aWVzIjogWwogICAgewogICAgICAic3ViamVjdCI6IHsKICAgICAgICAib3JnYW5pemF0aW9uIjogInNpZ3N0b3JlLmRldiIsCiAgICAgICAgImNvbW1vbk5hbWUiOiAic2lnc3RvcmUtdHNhLXNlbGZzaWduZWQiCiAgICAgIH0sCiAgICAgICJ1cmkiOiAiaHR0cHM6Ly90aW1lc3RhbXAuc2lnc3RvcmUuZGV2L2FwaS92MS90aW1lc3RhbXAiLAogICAgICAiY2VydENoYWluIjogewogICAgICAgICJjZXJ0aWZpY2F0ZXMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJyYXdCeXRlcyI6ICJNSUlDRURDQ0FaYWdBd0lCQWdJVU9oTlVMd3lRWWU2OHdVTXZ5NHFPaXlvaml3d3dDZ1lJS29aSXpqMEVBd013T1RFVk1CTUdBMVVFQ2hNTWMybG5jM1J2Y21VdVpHVjJNU0F3SGdZRFZRUURFeGR6YVdkemRHOXlaUzEwYzJFdGMyVnNabk5wWjI1bFpEQWVGdzB5TlRBME1EZ3dOalU1TkROYUZ3MHpOVEEwTURZd05qVTVORE5hTUM0eEZUQVRCZ05WQkFvVERITnBaM04wYjNKbExtUmxkakVWTUJNR0ExVUVBeE1NYzJsbmMzUnZjbVV0ZEhOaE1IWXdFQVlIS29aSXpqMENBUVlGSzRFRUFDSURZZ0FFNHJhMlo4aEtOaWcyVDlrRmpDQVRvR0czMGpreStXUXYzQnpMK21LdmgxU0tOUi9Vd3V3c2ZOQ2c0c3J5b1lBZDhFNmlzb3ZWQTNNNGFvTmRtOVFEaTUwWjhuVEV5dnFnZkRQdFRJd1hJdGZpVy9BRmYxVjd1d2tia0FvajB4eGNvMm93YURBT0JnTlZIUThCQWY4RUJBTUNCNEF3SFFZRFZSME9CQllFRkluOWVVT0h6OUJsUnNNQ1JzY3NjMXQ5dE9zRE1COEdBMVVkSXdRWU1CYUFGSmpzQWU5L3UxSC8xSlVlYjRxSW1GTUhpYzYvTUJZR0ExVWRKUUVCL3dRTU1Bb0dDQ3NHQVFVRkJ3TUlNQW9HQ0NxR1NNNDlCQU1EQTJnQU1HVUNNRHRwc1YvNkthTzBxeUYvVU1zWDJhU1VYS1FGZG9HVHB0UUdjMGZ0cTFjc3VsSFBHRzZkc215TU5kM0pCK0czRVFJeEFPYWp2QmNqcEptS2I0TnYrMlRhb2o4VWM1K2I2aWg2RlhDQ0tyYVNxdXBlMDd6cXN3TWNYSlRlMWNFeHZIdnZsdz09IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInJhd0J5dGVzIjogIk1JSUI5ekNDQVh5Z0F3SUJBZ0lVVjdmMEdMRE9vRXpJaDhMWFNXODBPSmlVcDE0d0NnWUlLb1pJemowRUF3TXdPVEVWTUJNR0ExVUVDaE1NYzJsbmMzUnZjbVV1WkdWMk1TQXdIZ1lEVlFRREV4ZHphV2R6ZEc5eVpTMTBjMkV0YzJWc1puTnBaMjVsWkRBZUZ3MHlOVEEwTURnd05qVTVORE5hRncwek5UQTBNRFl3TmpVNU5ETmFNRGt4RlRBVEJnTlZCQW9UREhOcFozTjBiM0psTG1SbGRqRWdNQjRHQTFVRUF4TVhjMmxuYzNSdmNtVXRkSE5oTFhObGJHWnphV2R1WldRd2RqQVFCZ2NxaGtqT1BRSUJCZ1VyZ1FRQUlnTmlBQVFVUU50ZlJUL291M1lBVGE2d0Iva0tUZTcwY2ZKd3lSSUJvdk1udDhSY0pwaC9DT0U4MnV5UzZGbXBwTExMMVZCUEdjUGZwUVBZSk5Yeld3aThpY3doS1E2Vy9RZTJoM29lYkJiMkZIcHdOSkRxbytUTWFDL3RkZmt2L0VsSkI3MmpSVEJETUE0R0ExVWREd0VCL3dRRUF3SUJCakFTQmdOVkhSTUJBZjhFQ0RBR0FRSC9BZ0VBTUIwR0ExVWREZ1FXQkJTWTdBSHZmN3RSLzlTVkhtK0tpSmhUQjRuT3Z6QUtCZ2dxaGtqT1BRUURBd05wQURCbUFqRUF3R0VHcmZHWlIxY2VuMVI4L0RUVk1JOTQzTHNzWm1KUnREcC9pN1NmR0htR1JQNmdSYnVqOXZPSzNiNjdaMFFRQWpFQXVUMkg2NzNMUUVhSFRjeVFTWnJrcDRtWDdXd2ttRitzVmJrWVk1bVhOK1JNSDEzS1VFSEhPcUFTYWVtWVdLL0UiCiAgICAgICAgICB9CiAgICAgICAgXQogICAgICB9LAogICAgICAidmFsaWRGb3IiOiB7CiAgICAgICAgInN0YXJ0IjogIjIwMjUtMDctMDRUMDA6MDA6MDBaIgogICAgICB9CiAgICB9CiAgXQp9Cg==","registry.npmjs.org%2Fkeys.json":"ewogICAgImtleXMiOiBbCiAgICAgICAgewogICAgICAgICAgICAia2V5SWQiOiAiU0hBMjU2OmpsM2J3c3d1ODBQampva0NnaDBvMnc1YzJVNExoUUFFNTdnajljejFrekEiLAogICAgICAgICAgICAia2V5VXNhZ2UiOiAibnBtOnNpZ25hdHVyZXMiLAogICAgICAgICAgICAicHVibGljS2V5IjogewogICAgICAgICAgICAgICAgInJhd0J5dGVzIjogIk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRTFPbGIzek1BRkZ4WEtIaUlrUU81Y0ozWWhsNWk2VVBwK0lodXRlQkpidUhjQTVVb2dLbzBFV3RsV3dXNktTYUtvVE5FWUw3SmxDUWlWbmtoQmt0VWdnPT0iLAogICAgICAgICAgICAgICAgImtleURldGFpbHMiOiAiUEtJWF9FQ0RTQV9QMjU2X1NIQV8yNTYiLAogICAgICAgICAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgICAgICAgICAgICJzdGFydCI6ICIxOTk5LTAxLTAxVDAwOjAwOjAwLjAwMFoiLAogICAgICAgICAgICAgICAgICAgICJlbmQiOiAiMjAyNS0wMS0yOVQwMDowMDowMC4wMDBaIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJrZXlJZCI6ICJTSEEyNTY6amwzYndzd3U4MFBqam9rQ2doMG8ydzVjMlU0TGhRQUU1N2dqOWN6MWt6QSIsCiAgICAgICAgICAgICJrZXlVc2FnZSI6ICJucG06YXR0ZXN0YXRpb25zIiwKICAgICAgICAgICAgInB1YmxpY0tleSI6IHsKICAgICAgICAgICAgICAgICJyYXdCeXRlcyI6ICJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUUxT2xiM3pNQUZGeFhLSGlJa1FPNWNKM1lobDVpNlVQcCtJaHV0ZUJKYnVIY0E1VW9nS28wRVd0bFd3VzZLU2FLb1RORVlMN0psQ1FpVm5raEJrdFVnZz09IiwKICAgICAgICAgICAgICAgICJrZXlEZXRhaWxzIjogIlBLSVhfRUNEU0FfUDI1Nl9TSEFfMjU2IiwKICAgICAgICAgICAgICAgICJ2YWxpZEZvciI6IHsKICAgICAgICAgICAgICAgICAgICAic3RhcnQiOiAiMjAyMi0xMi0wMVQwMDowMDowMC4wMDBaIiwKICAgICAgICAgICAgICAgICAgICAiZW5kIjogIjIwMjUtMDEtMjlUMDA6MDA6MDAuMDAwWiIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAia2V5SWQiOiAiU0hBMjU2OkRoUTh3UjVBUEJ2RkhMRi8rVGMrQVl2UE9kVHBjSURxT2h4c0JIUndDN1UiLAogICAgICAgICAgICAia2V5VXNhZ2UiOiAibnBtOnNpZ25hdHVyZXMiLAogICAgICAgICAgICAicHVibGljS2V5IjogewogICAgICAgICAgICAgICAgInJhd0J5dGVzIjogIk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRVk2WWE3VysrN2FVUHp2TVRyZXpINlljeDNjK0hPS1lDY05HeWJKWlNDSnEvZmQ3UWE4dXVBS3RkSWtVUXRRaUVLRVJoQW1FNWxNTUpoUDhPa0RPYTJnPT0iLAogICAgICAgICAgICAgICAgImtleURldGFpbHMiOiAiUEtJWF9FQ0RTQV9QMjU2X1NIQV8yNTYiLAogICAgICAgICAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgICAgICAgICAgICJzdGFydCI6ICIyMDI1LTAxLTEzVDAwOjAwOjAwLjAwMFoiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgImtleUlkIjogIlNIQTI1NjpEaFE4d1I1QVBCdkZITEYvK1RjK0FZdlBPZFRwY0lEcU9oeHNCSFJ3QzdVIiwKICAgICAgICAgICAgImtleVVzYWdlIjogIm5wbTphdHRlc3RhdGlvbnMiLAogICAgICAgICAgICAicHVibGljS2V5IjogewogICAgICAgICAgICAgICAgInJhd0J5dGVzIjogIk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRVk2WWE3VysrN2FVUHp2TVRyZXpINlljeDNjK0hPS1lDY05HeWJKWlNDSnEvZmQ3UWE4dXVBS3RkSWtVUXRRaUVLRVJoQW1FNWxNTUpoUDhPa0RPYTJnPT0iLAogICAgICAgICAgICAgICAgImtleURldGFpbHMiOiAiUEtJWF9FQ0RTQV9QMjU2X1NIQV8yNTYiLAogICAgICAgICAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgICAgICAgICAgICJzdGFydCI6ICIyMDI1LTAxLTEzVDAwOjAwOjAwLjAwMFoiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICBdCn0K"}}} +{"https://tuf-repo-cdn.sigstore.dev":{"root.json":"ewogInNpZ25hdHVyZXMiOiBbCiAgewogICAia2V5aWQiOiAiZTcxYTU0ZDU0MzgzNWJhODZhZGFkOTQ2MDM3OWM3NjQxZmI4NzI2ZDE2NGVhNzY2ODAxYTFjNTIyYWJhN2VhMiIsCiAgICJzaWciOiAiMzA0NjAyMjEwMGUwNGM5NzA2Mjk5YmU1ZDhjMmIxNGZiNTBiY2Q1YjljMjQxZjEwNTk3MTUzZGZlMjJmOTQzZWZlODk2YjUxNTAwMjIxMDBjZmQ3YjlmMDZhNTkwMDc4NGUzMTJkMDJiOGUzMzZlZGJiM2IyZmFiNjFhYzE0NTUwYjMxMTJiNGY5ZTMzZGY0IgogIH0sCiAgewogICAia2V5aWQiOiAiMjJmNGNhZWM2ZDhlNmY5NTU1YWY2NmIzZDRjM2NiMDZhM2JiMjNmZGM3ZTM5YzkxNmM2MWY0NjJlNmY1MmIwNiIsCiAgICJzaWciOiAiIgogIH0sCiAgewogICAia2V5aWQiOiAiNjE2NDM4MzgxMjViNDQwYjQwZGI2OTQyZjVjYjVhMzFjMGRjMDQzNjgzMTZlYjJhYWE1OGI5NTkwNGE1ODIyMiIsCiAgICJzaWciOiAiMzA0NTAyMjEwMGNjMzA4YWU3ZDM5MGZhNzgyZWUzMzc2ZGRmYWE5Mjk4MzUwMTZlODZkYWQ4MWY2OWUyZGU3ZWMxZTE3NDQzMmUwMjIwNWZiMTk5MDZhMzFjY2UxNDZjMjk2MjQ0NDNjMGQwYzJmMzNlZTgwZGFjMzlkNzIxMTRmOTM5NjA3Y2MyMjkzNyIKICB9LAogIHsKICAgImtleWlkIjogImE2ODdlNWJmNGZhYjgyYjBlZTU4ZDQ2ZTA1Yzk1MzUxNDVhMmM5YWZiNDU4ZjQzZDQyYjQ1Y2EwZmRjZTJhNzAiLAogICAic2lnIjogIjMwNDUwMjIwM2Y4YWZmN2EzMGUwNWE4YzNkOTA0YjY3MWFiMWE2ZTRlOGE2ZjUwOGI3Y2ZhMGM3ODBlNzI5NzZiZWU3YTIyNzAyMjEwMGY2NGM5Yjc2NTUyNmYzNGQ5ZWExNjMzOWNmMjM4ODkzZTFjMzM2OGI0ZjA5MTBhNjFhMWFmMjdkZGEwMWViYjkiCiAgfSwKICB7CiAgICJrZXlpZCI6ICIxODNlNjRmMzc2NzBkYzEzY2EwZDI4OTk1YTMwNTNmMzc0MDk1NGRkY2U0NDMyMWE0MWU0NjUzNGNmNDRlNjMyIiwKICAgInNpZyI6ICIzMDQ1MDIyMDIzNjNjYTI0OWFlZmE2ZDVmNjFjNDA4YTMyY2RkMDc5YjAzNGE3ODg4ZGRmMjEzNmRjNDUxNWVkNGE3Mjg0MTgwMjIxMDBiMDRlY2E0MmJjNTEwY2NiYmY1ZDMwNzgzYWFhOTM2YjFmMTM3Y2E3YTAxN2VlOWQ5MGQzNzEwNDMyZGEwNDI3IgogIH0KIF0sCiAic2lnbmVkIjogewogICJfdHlwZSI6ICJyb290IiwKICAiY29uc2lzdGVudF9zbmFwc2hvdCI6IHRydWUsCiAgImV4cGlyZXMiOiAiMjAyNi0wNi0yMlQxMzoyNzowMVoiLAogICJrZXlzIjogewogICAiMGM4NzQzMmMzYmYwOWZkOTkxODlmZGMzMmZhNWVhZWRmNGU0YTVmYWM3YmFiNzNmYTA0YTJlMGZjNjRhZjZmNSI6IHsKICAgICJrZXlpZF9oYXNoX2FsZ29yaXRobXMiOiBbCiAgICAgInNoYTI1NiIsCiAgICAgInNoYTUxMiIKICAgIF0sCiAgICAia2V5dHlwZSI6ICJlY2RzYSIsCiAgICAia2V5dmFsIjogewogICAgICJwdWJsaWMiOiAiLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRVdSaUdyNStqKzNKNVNzSCtadHI1bkUySDJ3TzdcbkJWK25PM3M5M2dMY2ExOHFUT3pIWTFvV3lBR0R5a01Tc0dUVUJTdDlEK0FuMEtmS3NEMm1mU000MlE9PVxuLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tXG4iCiAgICB9LAogICAgInNjaGVtZSI6ICJlY2RzYS1zaGEyLW5pc3RwMjU2IiwKICAgICJ4LXR1Zi1vbi1jaS1vbmxpbmUtdXJpIjogImdjcGttczpwcm9qZWN0cy9zaWdzdG9yZS1yb290LXNpZ25pbmcvbG9jYXRpb25zL2dsb2JhbC9rZXlSaW5ncy9yb290L2NyeXB0b0tleXMvdGltZXN0YW1wL2NyeXB0b0tleVZlcnNpb25zLzEiCiAgIH0sCiAgICIxODNlNjRmMzc2NzBkYzEzY2EwZDI4OTk1YTMwNTNmMzc0MDk1NGRkY2U0NDMyMWE0MWU0NjUzNGNmNDRlNjMyIjogewogICAgImtleXR5cGUiOiAiZWNkc2EiLAogICAgImtleXZhbCI6IHsKICAgICAicHVibGljIjogIi0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tXG5NRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVNeHBQT0pDSVo1b3RHNDEwNmZHSnNlRVFpM1Y5XG5wa01ZUTR1eVY5VGoxTTdXSFhJeUxHK2prZnZ1RzBnbFExSlpiUlpaQlYzZ0FSNHNvamRHSElTZW93PT1cbi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLVxuIgogICAgfSwKICAgICJzY2hlbWUiOiAiZWNkc2Etc2hhMi1uaXN0cDI1NiIsCiAgICAieC10dWYtb24tY2kta2V5b3duZXIiOiAiQGxhbmNlIgogICB9LAogICAiMjJmNGNhZWM2ZDhlNmY5NTU1YWY2NmIzZDRjM2NiMDZhM2JiMjNmZGM3ZTM5YzkxNmM2MWY0NjJlNmY1MmIwNiI6IHsKICAgICJrZXlpZF9oYXNoX2FsZ29yaXRobXMiOiBbCiAgICAgInNoYTI1NiIsCiAgICAgInNoYTUxMiIKICAgIF0sCiAgICAia2V5dHlwZSI6ICJlY2RzYSIsCiAgICAia2V5dmFsIjogewogICAgICJwdWJsaWMiOiAiLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRXpCelZPbUhDUG9qTVZMU0kzNjRXaWlWOE5QckRcbjZJZ1J4Vmxpc2t6L3YreTNKRVI1bWNWR2NPTmxpRGNXTUM1SjJsZkhtalBOUGhiNEg3eG04THpmU0E9PVxuLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tXG4iCiAgICB9LAogICAgInNjaGVtZSI6ICJlY2RzYS1zaGEyLW5pc3RwMjU2IiwKICAgICJ4LXR1Zi1vbi1jaS1rZXlvd25lciI6ICJAc2FudGlhZ290b3JyZXMiCiAgIH0sCiAgICI2MTY0MzgzODEyNWI0NDBiNDBkYjY5NDJmNWNiNWEzMWMwZGMwNDM2ODMxNmViMmFhYTU4Yjk1OTA0YTU4MjIyIjogewogICAgImtleWlkX2hhc2hfYWxnb3JpdGhtcyI6IFsKICAgICAic2hhMjU2IiwKICAgICAic2hhNTEyIgogICAgXSwKICAgICJrZXl0eXBlIjogImVjZHNhIiwKICAgICJrZXl2YWwiOiB7CiAgICAgInB1YmxpYyI6ICItLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLVxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFaW5pa1NzQVFtWWtOZUg1ZVlxL0NuSXpMYWFjT1xueGxTYWF3UURPd3FLeS90Q3F4cTV4eFBTSmMyMUs0V0loczlHeU9rS2Z6dWVZM0dJTHpjTUpaNGNXdz09XG4tLS0tLUVORCBQVUJMSUMgS0VZLS0tLS1cbiIKICAgIH0sCiAgICAic2NoZW1lIjogImVjZHNhLXNoYTItbmlzdHAyNTYiLAogICAgIngtdHVmLW9uLWNpLWtleW93bmVyIjogIkBib2JjYWxsYXdheSIKICAgfSwKICAgImE2ODdlNWJmNGZhYjgyYjBlZTU4ZDQ2ZTA1Yzk1MzUxNDVhMmM5YWZiNDU4ZjQzZDQyYjQ1Y2EwZmRjZTJhNzAiOiB7CiAgICAia2V5aWRfaGFzaF9hbGdvcml0aG1zIjogWwogICAgICJzaGEyNTYiLAogICAgICJzaGE1MTIiCiAgICBdLAogICAgImtleXR5cGUiOiAiZWNkc2EiLAogICAgImtleXZhbCI6IHsKICAgICAicHVibGljIjogIi0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tXG5NRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUUwZ2hyaDkyTHcxWXIzaWRHVjVXcUN0TURCOEN4XG4rRDhoZEM0dzJaTE5JcGxWUm9WR0xza1lhM2doZU15T2ppSjhrUGkxNWFRMi8vN1Arb2o3VXZKUEd3PT1cbi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLVxuIgogICAgfSwKICAgICJzY2hlbWUiOiAiZWNkc2Etc2hhMi1uaXN0cDI1NiIsCiAgICAieC10dWYtb24tY2kta2V5b3duZXIiOiAiQGpvc2h1YWdsIgogICB9LAogICAiZTcxYTU0ZDU0MzgzNWJhODZhZGFkOTQ2MDM3OWM3NjQxZmI4NzI2ZDE2NGVhNzY2ODAxYTFjNTIyYWJhN2VhMiI6IHsKICAgICJrZXlpZF9oYXNoX2FsZ29yaXRobXMiOiBbCiAgICAgInNoYTI1NiIsCiAgICAgInNoYTUxMiIKICAgIF0sCiAgICAia2V5dHlwZSI6ICJlY2RzYSIsCiAgICAia2V5dmFsIjogewogICAgICJwdWJsaWMiOiAiLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRUVYc3ozU1pYRmI4ak1WNDJqNnBKbHlqYmpSOEtcbk4zQndvY2V4cTZMTUliNXFzV0tPUXZMTjE2TlVlZkxjNEhzd09vdW1Sc1ZWYWFqU3BRUzZmb2JrUnc9PVxuLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tXG4iCiAgICB9LAogICAgInNjaGVtZSI6ICJlY2RzYS1zaGEyLW5pc3RwMjU2IiwKICAgICJ4LXR1Zi1vbi1jaS1rZXlvd25lciI6ICJAbW5tNjc4IgogICB9CiAgfSwKICAicm9sZXMiOiB7CiAgICJyb290IjogewogICAgImtleWlkcyI6IFsKICAgICAiZTcxYTU0ZDU0MzgzNWJhODZhZGFkOTQ2MDM3OWM3NjQxZmI4NzI2ZDE2NGVhNzY2ODAxYTFjNTIyYWJhN2VhMiIsCiAgICAgIjIyZjRjYWVjNmQ4ZTZmOTU1NWFmNjZiM2Q0YzNjYjA2YTNiYjIzZmRjN2UzOWM5MTZjNjFmNDYyZTZmNTJiMDYiLAogICAgICI2MTY0MzgzODEyNWI0NDBiNDBkYjY5NDJmNWNiNWEzMWMwZGMwNDM2ODMxNmViMmFhYTU4Yjk1OTA0YTU4MjIyIiwKICAgICAiYTY4N2U1YmY0ZmFiODJiMGVlNThkNDZlMDVjOTUzNTE0NWEyYzlhZmI0NThmNDNkNDJiNDVjYTBmZGNlMmE3MCIsCiAgICAgIjE4M2U2NGYzNzY3MGRjMTNjYTBkMjg5OTVhMzA1M2YzNzQwOTU0ZGRjZTQ0MzIxYTQxZTQ2NTM0Y2Y0NGU2MzIiCiAgICBdLAogICAgInRocmVzaG9sZCI6IDMKICAgfSwKICAgInNuYXBzaG90IjogewogICAgImtleWlkcyI6IFsKICAgICAiMGM4NzQzMmMzYmYwOWZkOTkxODlmZGMzMmZhNWVhZWRmNGU0YTVmYWM3YmFiNzNmYTA0YTJlMGZjNjRhZjZmNSIKICAgIF0sCiAgICAidGhyZXNob2xkIjogMSwKICAgICJ4LXR1Zi1vbi1jaS1leHBpcnktcGVyaW9kIjogMzY1MCwKICAgICJ4LXR1Zi1vbi1jaS1zaWduaW5nLXBlcmlvZCI6IDM2NQogICB9LAogICAidGFyZ2V0cyI6IHsKICAgICJrZXlpZHMiOiBbCiAgICAgImU3MWE1NGQ1NDM4MzViYTg2YWRhZDk0NjAzNzljNzY0MWZiODcyNmQxNjRlYTc2NjgwMWExYzUyMmFiYTdlYTIiLAogICAgICIyMmY0Y2FlYzZkOGU2Zjk1NTVhZjY2YjNkNGMzY2IwNmEzYmIyM2ZkYzdlMzljOTE2YzYxZjQ2MmU2ZjUyYjA2IiwKICAgICAiNjE2NDM4MzgxMjViNDQwYjQwZGI2OTQyZjVjYjVhMzFjMGRjMDQzNjgzMTZlYjJhYWE1OGI5NTkwNGE1ODIyMiIsCiAgICAgImE2ODdlNWJmNGZhYjgyYjBlZTU4ZDQ2ZTA1Yzk1MzUxNDVhMmM5YWZiNDU4ZjQzZDQyYjQ1Y2EwZmRjZTJhNzAiLAogICAgICIxODNlNjRmMzc2NzBkYzEzY2EwZDI4OTk1YTMwNTNmMzc0MDk1NGRkY2U0NDMyMWE0MWU0NjUzNGNmNDRlNjMyIgogICAgXSwKICAgICJ0aHJlc2hvbGQiOiAzCiAgIH0sCiAgICJ0aW1lc3RhbXAiOiB7CiAgICAia2V5aWRzIjogWwogICAgICIwYzg3NDMyYzNiZjA5ZmQ5OTE4OWZkYzMyZmE1ZWFlZGY0ZTRhNWZhYzdiYWI3M2ZhMDRhMmUwZmM2NGFmNmY1IgogICAgXSwKICAgICJ0aHJlc2hvbGQiOiAxLAogICAgIngtdHVmLW9uLWNpLWV4cGlyeS1wZXJpb2QiOiA3LAogICAgIngtdHVmLW9uLWNpLXNpZ25pbmctcGVyaW9kIjogNgogICB9CiAgfSwKICAic3BlY192ZXJzaW9uIjogIjEuMCIsCiAgInZlcnNpb24iOiAxNCwKICAieC10dWYtb24tY2ktZXhwaXJ5LXBlcmlvZCI6IDE5NywKICAieC10dWYtb24tY2ktc2lnbmluZy1wZXJpb2QiOiA0NgogfQp9","targets":{"trusted_root.json":"ewogICJtZWRpYVR5cGUiOiAiYXBwbGljYXRpb24vdm5kLmRldi5zaWdzdG9yZS50cnVzdGVkcm9vdCtqc29uO3ZlcnNpb249MC4xIiwKICAidGxvZ3MiOiBbCiAgICB7CiAgICAgICJiYXNlVXJsIjogImh0dHBzOi8vcmVrb3Iuc2lnc3RvcmUuZGV2IiwKICAgICAgImhhc2hBbGdvcml0aG0iOiAiU0hBMl8yNTYiLAogICAgICAicHVibGljS2V5IjogewogICAgICAgICJyYXdCeXRlcyI6ICJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUUyRzJZKzJ0YWJkVFY1QmNHaUJJeDBhOWZBRndya0JibUxTR3RrczRMM3FYNnlZWTB6dWZCbmhDOFVyL2l5NTVHaFdQLzlBL2JZMkxoQzMwTTkrUll0dz09IiwKICAgICAgICAia2V5RGV0YWlscyI6ICJQS0lYX0VDRFNBX1AyNTZfU0hBXzI1NiIsCiAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgInN0YXJ0IjogIjIwMjEtMDEtMTJUMTE6NTM6MjdaIgogICAgICAgIH0KICAgICAgfSwKICAgICAgImxvZ0lkIjogewogICAgICAgICJrZXlJZCI6ICJ3Tkk5YXRRR2x6K1ZXZk82TFJ5Z0g0UVVmWS84VzRSRndpVDVpNVdSZ0IwPSIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgImJhc2VVcmwiOiAiaHR0cHM6Ly9sb2cyMDI1LTEucmVrb3Iuc2lnc3RvcmUuZGV2IiwKICAgICAgImhhc2hBbGdvcml0aG0iOiAiU0hBMl8yNTYiLAogICAgICAicHVibGljS2V5IjogewogICAgICAgICJyYXdCeXRlcyI6ICJNQ293QlFZREsyVndBeUVBdDhybHAxa25Hd2pmYmNYQVlQWUFrbjBYaUx6MXg4TzR0MFlrRWhpZTI0ND0iLAogICAgICAgICJrZXlEZXRhaWxzIjogIlBLSVhfRUQyNTUxOSIsCiAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgInN0YXJ0IjogIjIwMjUtMDktMjNUMDA6MDA6MDBaIgogICAgICAgIH0KICAgICAgfSwKICAgICAgImxvZ0lkIjogewogICAgICAgICJrZXlJZCI6ICJ6eEdaRlZ2ZDBGRW1qUjhXckZ3TWRjQUo5dnRhWS9RWGY0NFkxd1VlUDZBPSIKICAgICAgfQogICAgfQogIF0sCiAgImNlcnRpZmljYXRlQXV0aG9yaXRpZXMiOiBbCiAgICB7CiAgICAgICJzdWJqZWN0IjogewogICAgICAgICJvcmdhbml6YXRpb24iOiAic2lnc3RvcmUuZGV2IiwKICAgICAgICAiY29tbW9uTmFtZSI6ICJzaWdzdG9yZSIKICAgICAgfSwKICAgICAgInVyaSI6ICJodHRwczovL2Z1bGNpby5zaWdzdG9yZS5kZXYiLAogICAgICAiY2VydENoYWluIjogewogICAgICAgICJjZXJ0aWZpY2F0ZXMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJyYXdCeXRlcyI6ICJNSUlCK0RDQ0FYNmdBd0lCQWdJVE5Wa0Rab0Npb2ZQRHN5N2RmbTZnZUxidWh6QUtCZ2dxaGtqT1BRUURBekFxTVJVd0V3WURWUVFLRXd4emFXZHpkRzl5WlM1a1pYWXhFVEFQQmdOVkJBTVRDSE5wWjNOMGIzSmxNQjRYRFRJeE1ETXdOekF6TWpBeU9Wb1hEVE14TURJeU16QXpNakF5T1Zvd0tqRVZNQk1HQTFVRUNoTU1jMmxuYzNSdmNtVXVaR1YyTVJFd0R3WURWUVFERXdoemFXZHpkRzl5WlRCMk1CQUdCeXFHU000OUFnRUdCU3VCQkFBaUEySUFCTFN5QTdJaTVrK3BOTzhaRVdZMHlsZW1XRG93T2tOYTNrTCtHWkU1WjVHV2VoTDkvQTliUk5BM1JicnNaNWkwSmNhc3RhUkw3U3A1ZnAvakQ1ZHhxYy9VZFRWbmx2UzE2YW4rMllmc3dlL1F1TG9sUlVDcmNPRTIrMmlBNSt0emQ2Tm1NR1F3RGdZRFZSMFBBUUgvQkFRREFnRUdNQklHQTFVZEV3RUIvd1FJTUFZQkFmOENBUUV3SFFZRFZSME9CQllFRk1qRkhRQkJtaVFwTWxFazZ3MnVTdTFLQnRQc01COEdBMVVkSXdRWU1CYUFGTWpGSFFCQm1pUXBNbEVrNncydVN1MUtCdFBzTUFvR0NDcUdTTTQ5QkFNREEyZ0FNR1VDTUg4bGlXSmZNdWk2dlhYQmhqRGdZNE13c2xtTi9USnhWZS84M1dyRm9td21OZjA1NnkxWDQ4RjljNG0zYTNvelhBSXhBS2pSYXk1L2FqL2pzS0tHSWttUWF0akk4dXVwSHIvK0N4RnZhSldtcFlxTmtMREdSVSs5b3J6aDVoSTJScmN1YVE9PSIKICAgICAgICAgIH0KICAgICAgICBdCiAgICAgIH0sCiAgICAgICJ2YWxpZEZvciI6IHsKICAgICAgICAic3RhcnQiOiAiMjAyMS0wMy0wN1QwMzoyMDoyOVoiLAogICAgICAgICJlbmQiOiAiMjAyMi0xMi0zMVQyMzo1OTo1OS45OTlaIgogICAgICB9CiAgICB9LAogICAgewogICAgICAic3ViamVjdCI6IHsKICAgICAgICAib3JnYW5pemF0aW9uIjogInNpZ3N0b3JlLmRldiIsCiAgICAgICAgImNvbW1vbk5hbWUiOiAic2lnc3RvcmUiCiAgICAgIH0sCiAgICAgICJ1cmkiOiAiaHR0cHM6Ly9mdWxjaW8uc2lnc3RvcmUuZGV2IiwKICAgICAgImNlcnRDaGFpbiI6IHsKICAgICAgICAiY2VydGlmaWNhdGVzIjogWwogICAgICAgICAgewogICAgICAgICAgICAicmF3Qnl0ZXMiOiAiTUlJQ0dqQ0NBYUdnQXdJQkFnSVVBTG5WaVZmblUwYnJKYXNtUmtIcm4vVW5mYVF3Q2dZSUtvWkl6ajBFQXdNd0tqRVZNQk1HQTFVRUNoTU1jMmxuYzNSdmNtVXVaR1YyTVJFd0R3WURWUVFERXdoemFXZHpkRzl5WlRBZUZ3MHlNakEwTVRNeU1EQTJNVFZhRncwek1URXdNRFV4TXpVMk5UaGFNRGN4RlRBVEJnTlZCQW9UREhOcFozTjBiM0psTG1SbGRqRWVNQndHQTFVRUF4TVZjMmxuYzNSdmNtVXRhVzUwWlhKdFpXUnBZWFJsTUhZd0VBWUhLb1pJemowQ0FRWUZLNEVFQUNJRFlnQUU4UlZTL3lzSCtOT3Z1RFp5UEladGlsZ1VGOU5sYXJZcEFkOUhQMXZCQkgxVTVDVjc3TFNTN3MwWmlING5FN0h2N3B0UzZMdnZSL1NUazc5OExWZ016TGxKNEhlSWZGM3RIU2FleExjWXBTQVNyMWtTME4vUmdCSnovOWpXQ2lYbm8zc3dlVEFPQmdOVkhROEJBZjhFQkFNQ0FRWXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUhBd013RWdZRFZSMFRBUUgvQkFnd0JnRUIvd0lCQURBZEJnTlZIUTRFRmdRVTM5UHB6MVlrRVpiNXFOanBLRldpeGk0WVpEOHdId1lEVlIwakJCZ3dGb0FVV01BZVg1RkZwV2FwZXN5UW9aTWkwQ3JGeGZvd0NnWUlLb1pJemowRUF3TURad0F3WkFJd1BDc1FLNERZaVpZRFBJYURpNUhGS25meFh4NkFTU1ZtRVJmc3luWUJpWDJYNlNKUm5aVTg0LzlEWmRuRnZ2eG1BakJPdDZRcEJsYzRKLzBEeHZrVENxcGNsdnppTDZCQ0NQbmpkbElCM1B1M0J4c1BteWdVWTdJaTJ6YmRDZGxpaW93PSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJyYXdCeXRlcyI6ICJNSUlCOXpDQ0FYeWdBd0lCQWdJVUFMWk5BUEZkeEhQd2plRGxvRHd5WUNoQU8vNHdDZ1lJS29aSXpqMEVBd013S2pFVk1CTUdBMVVFQ2hNTWMybG5jM1J2Y21VdVpHVjJNUkV3RHdZRFZRUURFd2h6YVdkemRHOXlaVEFlRncweU1URXdNRGN4TXpVMk5UbGFGdzB6TVRFd01EVXhNelUyTlRoYU1Db3hGVEFUQmdOVkJBb1RESE5wWjNOMGIzSmxMbVJsZGpFUk1BOEdBMVVFQXhNSWMybG5jM1J2Y21Vd2RqQVFCZ2NxaGtqT1BRSUJCZ1VyZ1FRQUlnTmlBQVQ3WGVGVDRyYjNQUUd3UzRJYWp0TGszL09sbnBnYW5nYUJjbFlwc1lCcjVpKzR5bkIwN2NlYjNMUDBPSU9aZHhleFg2OWM1aVZ1eUpSUStIejA1eWkrVUYzdUJXQWxIcGlTNXNoMCtIMkdIRTdTWHJrMUVDNW0xVHIxOUw5Z2c5MmpZekJoTUE0R0ExVWREd0VCL3dRRUF3SUJCakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlJZd0I1ZmtVV2xacWw2ekpDaGt5TFFLc1hGK2pBZkJnTlZIU01FR0RBV2dCUll3QjVma1VXbFpxbDZ6SkNoa3lMUUtzWEYrakFLQmdncWhrak9QUVFEQXdOcEFEQm1BakVBajFuSGVYWnArMTNOV0JOYStFRHNEUDhHMVdXZzF0Q01XUC9XSFBxcGFWbzBqaHN3ZU5GWmdTczBlRTd3WUk0cUFqRUEyV0I5b3Q5OHNJa29GM3ZaWWRkMy9WdFdCNWI5VE5NZWE3SXgvc3RKNVRmY0xMZUFCTEU0Qk5KT3NRNHZuQkhKIgogICAgICAgICAgfQogICAgICAgIF0KICAgICAgfSwKICAgICAgInZhbGlkRm9yIjogewogICAgICAgICJzdGFydCI6ICIyMDIyLTA0LTEzVDIwOjA2OjE1WiIKICAgICAgfQogICAgfQogIF0sCiAgImN0bG9ncyI6IFsKICAgIHsKICAgICAgImJhc2VVcmwiOiAiaHR0cHM6Ly9jdGZlLnNpZ3N0b3JlLmRldi90ZXN0IiwKICAgICAgImhhc2hBbGdvcml0aG0iOiAiU0hBMl8yNTYiLAogICAgICAicHVibGljS2V5IjogewogICAgICAgICJyYXdCeXRlcyI6ICJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUViZndSK1JKdWRYc2NnUkJScEtYMVhGRHkzUHl1ZER4ei9TZm5SaTFmVDhla3BmQmQyTzF1b3o3anIzWjhuS3p4QTY5RVVRK2VGQ0ZJM3pldWJQV1U3dz09IiwKICAgICAgICAia2V5RGV0YWlscyI6ICJQS0lYX0VDRFNBX1AyNTZfU0hBXzI1NiIsCiAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgInN0YXJ0IjogIjIwMjEtMDMtMTRUMDA6MDA6MDBaIiwKICAgICAgICAgICJlbmQiOiAiMjAyMi0xMC0zMVQyMzo1OTo1OS45OTlaIgogICAgICAgIH0KICAgICAgfSwKICAgICAgImxvZ0lkIjogewogICAgICAgICJrZXlJZCI6ICJDR0NTOENoUy8yaEYwZEZySjRTY1JXY1lyQlk5d3pqU2JlYThJZ1kyYjNJPSIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgImJhc2VVcmwiOiAiaHR0cHM6Ly9jdGZlLnNpZ3N0b3JlLmRldi8yMDIyIiwKICAgICAgImhhc2hBbGdvcml0aG0iOiAiU0hBMl8yNTYiLAogICAgICAicHVibGljS2V5IjogewogICAgICAgICJyYXdCeXRlcyI6ICJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVpUFNsRmkwQ21GVGZFakNVcUY5SHVDRWNZWE5LQWFZYWxJSm1CWjh5eWV6UGpUcWh4cktCcE1uYW9jVnRMSkJJMWVNM3VYblF6UUdBSmRKNGdzOUZ5dz09IiwKICAgICAgICAia2V5RGV0YWlscyI6ICJQS0lYX0VDRFNBX1AyNTZfU0hBXzI1NiIsCiAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgInN0YXJ0IjogIjIwMjItMTAtMjBUMDA6MDA6MDBaIgogICAgICAgIH0KICAgICAgfSwKICAgICAgImxvZ0lkIjogewogICAgICAgICJrZXlJZCI6ICIzVDB3YXNiSEVUSmpHUjRjbVdjM0FxSktYcmplUEszL2g0cHlnQzhwN280PSIKICAgICAgfQogICAgfQogIF0sCiAgInRpbWVzdGFtcEF1dGhvcml0aWVzIjogWwogICAgewogICAgICAic3ViamVjdCI6IHsKICAgICAgICAib3JnYW5pemF0aW9uIjogInNpZ3N0b3JlLmRldiIsCiAgICAgICAgImNvbW1vbk5hbWUiOiAic2lnc3RvcmUtdHNhLXNlbGZzaWduZWQiCiAgICAgIH0sCiAgICAgICJ1cmkiOiAiaHR0cHM6Ly90aW1lc3RhbXAuc2lnc3RvcmUuZGV2L2FwaS92MS90aW1lc3RhbXAiLAogICAgICAiY2VydENoYWluIjogewogICAgICAgICJjZXJ0aWZpY2F0ZXMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJyYXdCeXRlcyI6ICJNSUlDRURDQ0FaYWdBd0lCQWdJVU9oTlVMd3lRWWU2OHdVTXZ5NHFPaXlvaml3d3dDZ1lJS29aSXpqMEVBd013T1RFVk1CTUdBMVVFQ2hNTWMybG5jM1J2Y21VdVpHVjJNU0F3SGdZRFZRUURFeGR6YVdkemRHOXlaUzEwYzJFdGMyVnNabk5wWjI1bFpEQWVGdzB5TlRBME1EZ3dOalU1TkROYUZ3MHpOVEEwTURZd05qVTVORE5hTUM0eEZUQVRCZ05WQkFvVERITnBaM04wYjNKbExtUmxkakVWTUJNR0ExVUVBeE1NYzJsbmMzUnZjbVV0ZEhOaE1IWXdFQVlIS29aSXpqMENBUVlGSzRFRUFDSURZZ0FFNHJhMlo4aEtOaWcyVDlrRmpDQVRvR0czMGpreStXUXYzQnpMK21LdmgxU0tOUi9Vd3V3c2ZOQ2c0c3J5b1lBZDhFNmlzb3ZWQTNNNGFvTmRtOVFEaTUwWjhuVEV5dnFnZkRQdFRJd1hJdGZpVy9BRmYxVjd1d2tia0FvajB4eGNvMm93YURBT0JnTlZIUThCQWY4RUJBTUNCNEF3SFFZRFZSME9CQllFRkluOWVVT0h6OUJsUnNNQ1JzY3NjMXQ5dE9zRE1COEdBMVVkSXdRWU1CYUFGSmpzQWU5L3UxSC8xSlVlYjRxSW1GTUhpYzYvTUJZR0ExVWRKUUVCL3dRTU1Bb0dDQ3NHQVFVRkJ3TUlNQW9HQ0NxR1NNNDlCQU1EQTJnQU1HVUNNRHRwc1YvNkthTzBxeUYvVU1zWDJhU1VYS1FGZG9HVHB0UUdjMGZ0cTFjc3VsSFBHRzZkc215TU5kM0pCK0czRVFJeEFPYWp2QmNqcEptS2I0TnYrMlRhb2o4VWM1K2I2aWg2RlhDQ0tyYVNxdXBlMDd6cXN3TWNYSlRlMWNFeHZIdnZsdz09IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInJhd0J5dGVzIjogIk1JSUI5ekNDQVh5Z0F3SUJBZ0lVVjdmMEdMRE9vRXpJaDhMWFNXODBPSmlVcDE0d0NnWUlLb1pJemowRUF3TXdPVEVWTUJNR0ExVUVDaE1NYzJsbmMzUnZjbVV1WkdWMk1TQXdIZ1lEVlFRREV4ZHphV2R6ZEc5eVpTMTBjMkV0YzJWc1puTnBaMjVsWkRBZUZ3MHlOVEEwTURnd05qVTVORE5hRncwek5UQTBNRFl3TmpVNU5ETmFNRGt4RlRBVEJnTlZCQW9UREhOcFozTjBiM0psTG1SbGRqRWdNQjRHQTFVRUF4TVhjMmxuYzNSdmNtVXRkSE5oTFhObGJHWnphV2R1WldRd2RqQVFCZ2NxaGtqT1BRSUJCZ1VyZ1FRQUlnTmlBQVFVUU50ZlJUL291M1lBVGE2d0Iva0tUZTcwY2ZKd3lSSUJvdk1udDhSY0pwaC9DT0U4MnV5UzZGbXBwTExMMVZCUEdjUGZwUVBZSk5Yeld3aThpY3doS1E2Vy9RZTJoM29lYkJiMkZIcHdOSkRxbytUTWFDL3RkZmt2L0VsSkI3MmpSVEJETUE0R0ExVWREd0VCL3dRRUF3SUJCakFTQmdOVkhSTUJBZjhFQ0RBR0FRSC9BZ0VBTUIwR0ExVWREZ1FXQkJTWTdBSHZmN3RSLzlTVkhtK0tpSmhUQjRuT3Z6QUtCZ2dxaGtqT1BRUURBd05wQURCbUFqRUF3R0VHcmZHWlIxY2VuMVI4L0RUVk1JOTQzTHNzWm1KUnREcC9pN1NmR0htR1JQNmdSYnVqOXZPSzNiNjdaMFFRQWpFQXVUMkg2NzNMUUVhSFRjeVFTWnJrcDRtWDdXd2ttRitzVmJrWVk1bVhOK1JNSDEzS1VFSEhPcUFTYWVtWVdLL0UiCiAgICAgICAgICB9CiAgICAgICAgXQogICAgICB9LAogICAgICAidmFsaWRGb3IiOiB7CiAgICAgICAgInN0YXJ0IjogIjIwMjUtMDctMDRUMDA6MDA6MDBaIgogICAgICB9CiAgICB9CiAgXQp9Cg==","registry.npmjs.org%2Fkeys.json":"ewogICAgImtleXMiOiBbCiAgICAgICAgewogICAgICAgICAgICAia2V5SWQiOiAiU0hBMjU2OmpsM2J3c3d1ODBQampva0NnaDBvMnc1YzJVNExoUUFFNTdnajljejFrekEiLAogICAgICAgICAgICAia2V5VXNhZ2UiOiAibnBtOnNpZ25hdHVyZXMiLAogICAgICAgICAgICAicHVibGljS2V5IjogewogICAgICAgICAgICAgICAgInJhd0J5dGVzIjogIk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRTFPbGIzek1BRkZ4WEtIaUlrUU81Y0ozWWhsNWk2VVBwK0lodXRlQkpidUhjQTVVb2dLbzBFV3RsV3dXNktTYUtvVE5FWUw3SmxDUWlWbmtoQmt0VWdnPT0iLAogICAgICAgICAgICAgICAgImtleURldGFpbHMiOiAiUEtJWF9FQ0RTQV9QMjU2X1NIQV8yNTYiLAogICAgICAgICAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgICAgICAgICAgICJzdGFydCI6ICIxOTk5LTAxLTAxVDAwOjAwOjAwLjAwMFoiLAogICAgICAgICAgICAgICAgICAgICJlbmQiOiAiMjAyNS0wMS0yOVQwMDowMDowMC4wMDBaIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJrZXlJZCI6ICJTSEEyNTY6amwzYndzd3U4MFBqam9rQ2doMG8ydzVjMlU0TGhRQUU1N2dqOWN6MWt6QSIsCiAgICAgICAgICAgICJrZXlVc2FnZSI6ICJucG06YXR0ZXN0YXRpb25zIiwKICAgICAgICAgICAgInB1YmxpY0tleSI6IHsKICAgICAgICAgICAgICAgICJyYXdCeXRlcyI6ICJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUUxT2xiM3pNQUZGeFhLSGlJa1FPNWNKM1lobDVpNlVQcCtJaHV0ZUJKYnVIY0E1VW9nS28wRVd0bFd3VzZLU2FLb1RORVlMN0psQ1FpVm5raEJrdFVnZz09IiwKICAgICAgICAgICAgICAgICJrZXlEZXRhaWxzIjogIlBLSVhfRUNEU0FfUDI1Nl9TSEFfMjU2IiwKICAgICAgICAgICAgICAgICJ2YWxpZEZvciI6IHsKICAgICAgICAgICAgICAgICAgICAic3RhcnQiOiAiMjAyMi0xMi0wMVQwMDowMDowMC4wMDBaIiwKICAgICAgICAgICAgICAgICAgICAiZW5kIjogIjIwMjUtMDEtMjlUMDA6MDA6MDAuMDAwWiIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAia2V5SWQiOiAiU0hBMjU2OkRoUTh3UjVBUEJ2RkhMRi8rVGMrQVl2UE9kVHBjSURxT2h4c0JIUndDN1UiLAogICAgICAgICAgICAia2V5VXNhZ2UiOiAibnBtOnNpZ25hdHVyZXMiLAogICAgICAgICAgICAicHVibGljS2V5IjogewogICAgICAgICAgICAgICAgInJhd0J5dGVzIjogIk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRVk2WWE3VysrN2FVUHp2TVRyZXpINlljeDNjK0hPS1lDY05HeWJKWlNDSnEvZmQ3UWE4dXVBS3RkSWtVUXRRaUVLRVJoQW1FNWxNTUpoUDhPa0RPYTJnPT0iLAogICAgICAgICAgICAgICAgImtleURldGFpbHMiOiAiUEtJWF9FQ0RTQV9QMjU2X1NIQV8yNTYiLAogICAgICAgICAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgICAgICAgICAgICJzdGFydCI6ICIyMDI1LTAxLTEzVDAwOjAwOjAwLjAwMFoiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgImtleUlkIjogIlNIQTI1NjpEaFE4d1I1QVBCdkZITEYvK1RjK0FZdlBPZFRwY0lEcU9oeHNCSFJ3QzdVIiwKICAgICAgICAgICAgImtleVVzYWdlIjogIm5wbTphdHRlc3RhdGlvbnMiLAogICAgICAgICAgICAicHVibGljS2V5IjogewogICAgICAgICAgICAgICAgInJhd0J5dGVzIjogIk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRVk2WWE3VysrN2FVUHp2TVRyZXpINlljeDNjK0hPS1lDY05HeWJKWlNDSnEvZmQ3UWE4dXVBS3RkSWtVUXRRaUVLRVJoQW1FNWxNTUpoUDhPa0RPYTJnPT0iLAogICAgICAgICAgICAgICAgImtleURldGFpbHMiOiAiUEtJWF9FQ0RTQV9QMjU2X1NIQV8yNTYiLAogICAgICAgICAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgICAgICAgICAgICJzdGFydCI6ICIyMDI1LTAxLTEzVDAwOjAwOjAwLjAwMFoiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICBdCn0K"}}} diff --git a/deps/npm/node_modules/brace-expansion/dist/commonjs/index.js b/deps/npm/node_modules/brace-expansion/dist/commonjs/index.js index 2caa572c59de67..3323b505d9c05e 100644 --- a/deps/npm/node_modules/brace-expansion/dist/commonjs/index.js +++ b/deps/npm/node_modules/brace-expansion/dist/commonjs/index.js @@ -17,7 +17,7 @@ const slashPattern = /\\\\/g; const openPattern = /\\{/g; const closePattern = /\\}/g; const commaPattern = /\\,/g; -const periodPattern = /\\./g; +const periodPattern = /\\\./g; exports.EXPANSION_MAX = 100_000; function numeric(str) { return !isNaN(str) ? parseInt(str, 10) : str.charCodeAt(0); diff --git a/deps/npm/node_modules/brace-expansion/dist/esm/index.js b/deps/npm/node_modules/brace-expansion/dist/esm/index.js index ec682796e358b2..ca4124926adfd3 100644 --- a/deps/npm/node_modules/brace-expansion/dist/esm/index.js +++ b/deps/npm/node_modules/brace-expansion/dist/esm/index.js @@ -13,7 +13,7 @@ const slashPattern = /\\\\/g; const openPattern = /\\{/g; const closePattern = /\\}/g; const commaPattern = /\\,/g; -const periodPattern = /\\./g; +const periodPattern = /\\\./g; export const EXPANSION_MAX = 100_000; function numeric(str) { return !isNaN(str) ? parseInt(str, 10) : str.charCodeAt(0); diff --git a/deps/npm/node_modules/brace-expansion/package.json b/deps/npm/node_modules/brace-expansion/package.json index c921f0bed27ce9..c2d66fa17cb035 100644 --- a/deps/npm/node_modules/brace-expansion/package.json +++ b/deps/npm/node_modules/brace-expansion/package.json @@ -1,7 +1,7 @@ { "name": "brace-expansion", "description": "Brace expansion as known from sh/bash", - "version": "5.0.3", + "version": "5.0.4", "files": [ "dist" ], diff --git a/deps/npm/node_modules/cacache/lib/content/write.js b/deps/npm/node_modules/cacache/lib/content/write.js index e7187abca8788a..8deb91c066a964 100644 --- a/deps/npm/node_modules/cacache/lib/content/write.js +++ b/deps/npm/node_modules/cacache/lib/content/write.js @@ -10,7 +10,7 @@ const Pipeline = require('minipass-pipeline') const Flush = require('minipass-flush') const path = require('path') const ssri = require('ssri') -const uniqueFilename = require('unique-filename') +const { tmpName } = require('../util/tmp') const fsm = require('fs-minipass') module.exports = write @@ -152,7 +152,7 @@ async function pipeToTmp (inputStream, cache, tmpTarget, opts) { } async function makeTmp (cache, opts) { - const tmpTarget = uniqueFilename(path.join(cache, 'tmp'), opts.tmpPrefix) + const tmpTarget = tmpName(cache, opts.tmpPrefix) await fs.mkdir(path.dirname(tmpTarget), { recursive: true }) return { target: tmpTarget, diff --git a/deps/npm/node_modules/cacache/lib/entry-index.js b/deps/npm/node_modules/cacache/lib/entry-index.js index 0e09b10818d097..a8fdf93a03e424 100644 --- a/deps/npm/node_modules/cacache/lib/entry-index.js +++ b/deps/npm/node_modules/cacache/lib/entry-index.js @@ -12,7 +12,7 @@ const { const { Minipass } = require('minipass') const path = require('path') const ssri = require('ssri') -const uniqueFilename = require('unique-filename') +const { tmpName } = require('./util/tmp') const contentPath = require('./content/path') const hashToSegments = require('./util/hash-to-segments') @@ -69,7 +69,7 @@ async function compact (cache, key, matchFn, opts = {}) { }).join('\n') const setup = async () => { - const target = uniqueFilename(path.join(cache, 'tmp'), opts.tmpPrefix) + const target = tmpName(cache, opts.tmpPrefix) await mkdir(path.dirname(target), { recursive: true }) return { target, diff --git a/deps/npm/node_modules/cacache/lib/util/tmp.js b/deps/npm/node_modules/cacache/lib/util/tmp.js index 0bf5302136ebeb..d5c088e1e6de01 100644 --- a/deps/npm/node_modules/cacache/lib/util/tmp.js +++ b/deps/npm/node_modules/cacache/lib/util/tmp.js @@ -1,11 +1,17 @@ 'use strict' +const crypto = require('crypto') const { withTempDir } = require('@npmcli/fs') const fs = require('fs/promises') const path = require('path') module.exports.mkdir = mktmpdir +module.exports.tmpName = function tmpName (cache, tmpPrefix) { + const id = crypto.randomUUID() + return path.join(cache, 'tmp', tmpPrefix ? `${tmpPrefix}-${id}` : id) +} + async function mktmpdir (cache, opts = {}) { const { tmpPrefix } = opts const tmpDir = path.join(cache, 'tmp') diff --git a/deps/npm/node_modules/cacache/package.json b/deps/npm/node_modules/cacache/package.json index fb8eb5f66edf93..170e43646fa2b1 100644 --- a/deps/npm/node_modules/cacache/package.json +++ b/deps/npm/node_modules/cacache/package.json @@ -1,6 +1,6 @@ { "name": "cacache", - "version": "20.0.3", + "version": "20.0.4", "cache-version": { "content": "2", "index": "5" @@ -55,12 +55,11 @@ "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "p-map": "^7.0.2", - "ssri": "^13.0.0", - "unique-filename": "^5.0.0" + "ssri": "^13.0.0" }, "devDependencies": { "@npmcli/eslint-config": "^6.0.1", - "@npmcli/template-oss": "4.28.0", + "@npmcli/template-oss": "4.29.0", "tap": "^16.0.0" }, "engines": { @@ -69,7 +68,7 @@ "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", "windowsCI": false, - "version": "4.28.0", + "version": "4.29.0", "publish": "true" }, "author": "GitHub Inc.", diff --git a/deps/npm/node_modules/err-code/bower.json b/deps/npm/node_modules/err-code/bower.json deleted file mode 100644 index a39cb702cedb21..00000000000000 --- a/deps/npm/node_modules/err-code/bower.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "name": "err-code", - "version": "1.1.1", - "description": "Create new error instances with a code and additional properties", - "main": "index.umd.js", - "homepage": "https://github.com/IndigoUnited/js-err-code", - "authors": [ - "IndigoUnited <hello@indigounited.com> (http://indigounited.com)" - ], - "moduleType": [ - "amd", - "globals", - "node" - ], - "keywords": [ - "error", - "err", - "code", - "properties", - "property" - ], - "license": "MIT", - "ignore": [ - "**/.*", - "node_modules", - "bower_components", - "test", - "tests" - ] -} diff --git a/deps/npm/node_modules/err-code/index.js b/deps/npm/node_modules/err-code/index.js deleted file mode 100644 index 9ff3e9c5de4c2c..00000000000000 --- a/deps/npm/node_modules/err-code/index.js +++ /dev/null @@ -1,47 +0,0 @@ -'use strict'; - -function assign(obj, props) { - for (const key in props) { - Object.defineProperty(obj, key, { - value: props[key], - enumerable: true, - configurable: true, - }); - } - - return obj; -} - -function createError(err, code, props) { - if (!err || typeof err === 'string') { - throw new TypeError('Please pass an Error to err-code'); - } - - if (!props) { - props = {}; - } - - if (typeof code === 'object') { - props = code; - code = undefined; - } - - if (code != null) { - props.code = code; - } - - try { - return assign(err, props); - } catch (_) { - props.message = err.message; - props.stack = err.stack; - - const ErrClass = function () {}; - - ErrClass.prototype = Object.create(Object.getPrototypeOf(err)); - - return assign(new ErrClass(), props); - } -} - -module.exports = createError; diff --git a/deps/npm/node_modules/err-code/index.umd.js b/deps/npm/node_modules/err-code/index.umd.js deleted file mode 100644 index 41007269d3d039..00000000000000 --- a/deps/npm/node_modules/err-code/index.umd.js +++ /dev/null @@ -1,51 +0,0 @@ -(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.errCode = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){ -'use strict'; - -function assign(obj, props) { - for (const key in props) { - Object.defineProperty(obj, key, { - value: props[key], - enumerable: true, - configurable: true, - }); - } - - return obj; -} - -function createError(err, code, props) { - if (!err || typeof err === 'string') { - throw new TypeError('Please pass an Error to err-code'); - } - - if (!props) { - props = {}; - } - - if (typeof code === 'object') { - props = code; - code = undefined; - } - - if (code != null) { - props.code = code; - } - - try { - return assign(err, props); - } catch (_) { - props.message = err.message; - props.stack = err.stack; - - const ErrClass = function () {}; - - ErrClass.prototype = Object.create(Object.getPrototypeOf(err)); - - return assign(new ErrClass(), props); - } -} - -module.exports = createError; - -},{}]},{},[1])(1) -}); diff --git a/deps/npm/node_modules/err-code/package.json b/deps/npm/node_modules/err-code/package.json deleted file mode 100644 index 8c6007b394559a..00000000000000 --- a/deps/npm/node_modules/err-code/package.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "err-code", - "version": "2.0.3", - "description": "Create an error with a code", - "main": "index.js", - "scripts": { - "lint": "eslint '{*.js,test/**/*.js}' --ignore-pattern *.umd.js", - "test": "mocha --bail", - "browserify": "browserify -s err-code index.js > index.umd.js" - }, - "bugs": { - "url": "https://github.com/IndigoUnited/js-err-code/issues/" - }, - "repository": { - "type": "git", - "url": "git://github.com/IndigoUnited/js-err-code.git" - }, - "keywords": [ - "error", - "err", - "code", - "properties", - "property" - ], - "author": "IndigoUnited <hello@indigounited.com> (http://indigounited.com)", - "license": "MIT", - "devDependencies": { - "@satazor/eslint-config": "^3.0.0", - "browserify": "^16.5.1", - "eslint": "^7.2.0", - "expect.js": "^0.3.1", - "mocha": "^8.0.1" - } -} diff --git a/deps/npm/node_modules/err-code/test/test.js b/deps/npm/node_modules/err-code/test/test.js deleted file mode 100644 index 22ba0a8a1a8c1f..00000000000000 --- a/deps/npm/node_modules/err-code/test/test.js +++ /dev/null @@ -1,159 +0,0 @@ -'use strict'; - -const errcode = require('../index'); -const expect = require('expect.js'); - -describe('errcode', () => { - describe('string as first argument', () => { - it('should throw an error', () => { - expect(() => { errcode('my message'); }).to.throwError((err) => { - expect(err).to.be.a(TypeError); - }); - }); - }); - - describe('error as first argument', () => { - it('should accept an error and do nothing', () => { - const myErr = new Error('my message'); - const err = errcode(myErr); - - expect(err).to.be(myErr); - expect(err.hasOwnProperty(err.code)).to.be(false); - }); - - it('should accept an error and add a code', () => { - const myErr = new Error('my message'); - const err = errcode(myErr, 'ESOME'); - - expect(err).to.be(myErr); - expect(err.code).to.be('ESOME'); - }); - - it('should accept an error object and add code & properties', () => { - const myErr = new Error('my message'); - const err = errcode(myErr, 'ESOME', { foo: 'bar', bar: 'foo' }); - - expect(err).to.be.an(Error); - expect(err.code).to.be('ESOME'); - expect(err.foo).to.be('bar'); - expect(err.bar).to.be('foo'); - }); - - it('should create an error object without code but with properties', () => { - const myErr = new Error('my message'); - const err = errcode(myErr, { foo: 'bar', bar: 'foo' }); - - expect(err).to.be.an(Error); - expect(err.code).to.be(undefined); - expect(err.foo).to.be('bar'); - expect(err.bar).to.be('foo'); - }); - - it('should set a non-writable field', () => { - const myErr = new Error('my message'); - - Object.defineProperty(myErr, 'code', { - value: 'derp', - writable: false, - }); - const err = errcode(myErr, 'ERR_WAT'); - - expect(err).to.be.an(Error); - expect(err.stack).to.equal(myErr.stack); - expect(err.code).to.be('ERR_WAT'); - }); - - it('should add a code to frozen object', () => { - const myErr = new Error('my message'); - const err = errcode(Object.freeze(myErr), 'ERR_WAT'); - - expect(err).to.be.an(Error); - expect(err.stack).to.equal(myErr.stack); - expect(err.code).to.be('ERR_WAT'); - }); - - it('should to set a field that throws at assignment time', () => { - const myErr = new Error('my message'); - - Object.defineProperty(myErr, 'code', { - enumerable: true, - set() { - throw new Error('Nope!'); - }, - get() { - return 'derp'; - }, - }); - const err = errcode(myErr, 'ERR_WAT'); - - expect(err).to.be.an(Error); - expect(err.stack).to.equal(myErr.stack); - expect(err.code).to.be('ERR_WAT'); - }); - - it('should retain error type', () => { - const myErr = new TypeError('my message'); - - Object.defineProperty(myErr, 'code', { - value: 'derp', - writable: false, - }); - const err = errcode(myErr, 'ERR_WAT'); - - expect(err).to.be.a(TypeError); - expect(err.stack).to.equal(myErr.stack); - expect(err.code).to.be('ERR_WAT'); - }); - - it('should add a code to a class that extends Error', () => { - class CustomError extends Error { - set code(val) { - throw new Error('Nope!'); - } - } - - const myErr = new CustomError('my message'); - - Object.defineProperty(myErr, 'code', { - value: 'derp', - writable: false, - configurable: false, - }); - const err = errcode(myErr, 'ERR_WAT'); - - expect(err).to.be.a(CustomError); - expect(err.stack).to.equal(myErr.stack); - expect(err.code).to.be('ERR_WAT'); - - // original prototype chain should be intact - expect(() => { - const otherErr = new CustomError('my message'); - - otherErr.code = 'derp'; - }).to.throwError(); - }); - - it('should support errors that are not Errors', () => { - const err = errcode({ - message: 'Oh noes!', - }, 'ERR_WAT'); - - expect(err.message).to.be('Oh noes!'); - expect(err.code).to.be('ERR_WAT'); - }); - }); - - describe('falsy first arguments', () => { - it('should not allow passing null as the first argument', () => { - expect(() => { errcode(null); }).to.throwError((err) => { - expect(err).to.be.a(TypeError); - }); - }); - - it('should not allow passing undefined as the first argument', () => { - expect(() => { errcode(undefined); }).to.throwError((err) => { - expect(err).to.be.a(TypeError); - }); - }); - }); -}); diff --git a/deps/npm/node_modules/imurmurhash/imurmurhash.js b/deps/npm/node_modules/imurmurhash/imurmurhash.js deleted file mode 100644 index e63146a2b7e70b..00000000000000 --- a/deps/npm/node_modules/imurmurhash/imurmurhash.js +++ /dev/null @@ -1,138 +0,0 @@ -/** - * @preserve - * JS Implementation of incremental MurmurHash3 (r150) (as of May 10, 2013) - * - * @author <a href="mailto:jensyt@gmail.com">Jens Taylor</a> - * @see http://github.com/homebrewing/brauhaus-diff - * @author <a href="mailto:gary.court@gmail.com">Gary Court</a> - * @see http://github.com/garycourt/murmurhash-js - * @author <a href="mailto:aappleby@gmail.com">Austin Appleby</a> - * @see http://sites.google.com/site/murmurhash/ - */ -(function(){ - var cache; - - // Call this function without `new` to use the cached object (good for - // single-threaded environments), or with `new` to create a new object. - // - // @param {string} key A UTF-16 or ASCII string - // @param {number} seed An optional positive integer - // @return {object} A MurmurHash3 object for incremental hashing - function MurmurHash3(key, seed) { - var m = this instanceof MurmurHash3 ? this : cache; - m.reset(seed) - if (typeof key === 'string' && key.length > 0) { - m.hash(key); - } - - if (m !== this) { - return m; - } - }; - - // Incrementally add a string to this hash - // - // @param {string} key A UTF-16 or ASCII string - // @return {object} this - MurmurHash3.prototype.hash = function(key) { - var h1, k1, i, top, len; - - len = key.length; - this.len += len; - - k1 = this.k1; - i = 0; - switch (this.rem) { - case 0: k1 ^= len > i ? (key.charCodeAt(i++) & 0xffff) : 0; - case 1: k1 ^= len > i ? (key.charCodeAt(i++) & 0xffff) << 8 : 0; - case 2: k1 ^= len > i ? (key.charCodeAt(i++) & 0xffff) << 16 : 0; - case 3: - k1 ^= len > i ? (key.charCodeAt(i) & 0xff) << 24 : 0; - k1 ^= len > i ? (key.charCodeAt(i++) & 0xff00) >> 8 : 0; - } - - this.rem = (len + this.rem) & 3; // & 3 is same as % 4 - len -= this.rem; - if (len > 0) { - h1 = this.h1; - while (1) { - k1 = (k1 * 0x2d51 + (k1 & 0xffff) * 0xcc9e0000) & 0xffffffff; - k1 = (k1 << 15) | (k1 >>> 17); - k1 = (k1 * 0x3593 + (k1 & 0xffff) * 0x1b870000) & 0xffffffff; - - h1 ^= k1; - h1 = (h1 << 13) | (h1 >>> 19); - h1 = (h1 * 5 + 0xe6546b64) & 0xffffffff; - - if (i >= len) { - break; - } - - k1 = ((key.charCodeAt(i++) & 0xffff)) ^ - ((key.charCodeAt(i++) & 0xffff) << 8) ^ - ((key.charCodeAt(i++) & 0xffff) << 16); - top = key.charCodeAt(i++); - k1 ^= ((top & 0xff) << 24) ^ - ((top & 0xff00) >> 8); - } - - k1 = 0; - switch (this.rem) { - case 3: k1 ^= (key.charCodeAt(i + 2) & 0xffff) << 16; - case 2: k1 ^= (key.charCodeAt(i + 1) & 0xffff) << 8; - case 1: k1 ^= (key.charCodeAt(i) & 0xffff); - } - - this.h1 = h1; - } - - this.k1 = k1; - return this; - }; - - // Get the result of this hash - // - // @return {number} The 32-bit hash - MurmurHash3.prototype.result = function() { - var k1, h1; - - k1 = this.k1; - h1 = this.h1; - - if (k1 > 0) { - k1 = (k1 * 0x2d51 + (k1 & 0xffff) * 0xcc9e0000) & 0xffffffff; - k1 = (k1 << 15) | (k1 >>> 17); - k1 = (k1 * 0x3593 + (k1 & 0xffff) * 0x1b870000) & 0xffffffff; - h1 ^= k1; - } - - h1 ^= this.len; - - h1 ^= h1 >>> 16; - h1 = (h1 * 0xca6b + (h1 & 0xffff) * 0x85eb0000) & 0xffffffff; - h1 ^= h1 >>> 13; - h1 = (h1 * 0xae35 + (h1 & 0xffff) * 0xc2b20000) & 0xffffffff; - h1 ^= h1 >>> 16; - - return h1 >>> 0; - }; - - // Reset the hash object for reuse - // - // @param {number} seed An optional positive integer - MurmurHash3.prototype.reset = function(seed) { - this.h1 = typeof seed === 'number' ? seed : 0; - this.rem = this.k1 = this.len = 0; - return this; - }; - - // A cached object to use. This can be safely used if you're in a single- - // threaded environment, otherwise you need to create new hashes to use. - cache = new MurmurHash3(); - - if (typeof(module) != 'undefined') { - module.exports = MurmurHash3; - } else { - this.MurmurHash3 = MurmurHash3; - } -}()); diff --git a/deps/npm/node_modules/imurmurhash/imurmurhash.min.js b/deps/npm/node_modules/imurmurhash/imurmurhash.min.js deleted file mode 100644 index dc0ee88d6b69c9..00000000000000 --- a/deps/npm/node_modules/imurmurhash/imurmurhash.min.js +++ /dev/null @@ -1,12 +0,0 @@ -/** - * @preserve - * JS Implementation of incremental MurmurHash3 (r150) (as of May 10, 2013) - * - * @author <a href="mailto:jensyt@gmail.com">Jens Taylor</a> - * @see http://github.com/homebrewing/brauhaus-diff - * @author <a href="mailto:gary.court@gmail.com">Gary Court</a> - * @see http://github.com/garycourt/murmurhash-js - * @author <a href="mailto:aappleby@gmail.com">Austin Appleby</a> - * @see http://sites.google.com/site/murmurhash/ - */ -!function(){function t(h,r){var s=this instanceof t?this:e;return s.reset(r),"string"==typeof h&&h.length>0&&s.hash(h),s!==this?s:void 0}var e;t.prototype.hash=function(t){var e,h,r,s,i;switch(i=t.length,this.len+=i,h=this.k1,r=0,this.rem){case 0:h^=i>r?65535&t.charCodeAt(r++):0;case 1:h^=i>r?(65535&t.charCodeAt(r++))<<8:0;case 2:h^=i>r?(65535&t.charCodeAt(r++))<<16:0;case 3:h^=i>r?(255&t.charCodeAt(r))<<24:0,h^=i>r?(65280&t.charCodeAt(r++))>>8:0}if(this.rem=3&i+this.rem,i-=this.rem,i>0){for(e=this.h1;;){if(h=4294967295&11601*h+3432906752*(65535&h),h=h<<15|h>>>17,h=4294967295&13715*h+461832192*(65535&h),e^=h,e=e<<13|e>>>19,e=4294967295&5*e+3864292196,r>=i)break;h=65535&t.charCodeAt(r++)^(65535&t.charCodeAt(r++))<<8^(65535&t.charCodeAt(r++))<<16,s=t.charCodeAt(r++),h^=(255&s)<<24^(65280&s)>>8}switch(h=0,this.rem){case 3:h^=(65535&t.charCodeAt(r+2))<<16;case 2:h^=(65535&t.charCodeAt(r+1))<<8;case 1:h^=65535&t.charCodeAt(r)}this.h1=e}return this.k1=h,this},t.prototype.result=function(){var t,e;return t=this.k1,e=this.h1,t>0&&(t=4294967295&11601*t+3432906752*(65535&t),t=t<<15|t>>>17,t=4294967295&13715*t+461832192*(65535&t),e^=t),e^=this.len,e^=e>>>16,e=4294967295&51819*e+2246770688*(65535&e),e^=e>>>13,e=4294967295&44597*e+3266445312*(65535&e),e^=e>>>16,e>>>0},t.prototype.reset=function(t){return this.h1="number"==typeof t?t:0,this.rem=this.k1=this.len=0,this},e=new t,"undefined"!=typeof module?module.exports=t:this.MurmurHash3=t}(); \ No newline at end of file diff --git a/deps/npm/node_modules/imurmurhash/package.json b/deps/npm/node_modules/imurmurhash/package.json deleted file mode 100644 index 8a93edb55a2245..00000000000000 --- a/deps/npm/node_modules/imurmurhash/package.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "imurmurhash", - "version": "0.1.4", - "description": "An incremental implementation of MurmurHash3", - "homepage": "https://github.com/jensyt/imurmurhash-js", - "main": "imurmurhash.js", - "files": [ - "imurmurhash.js", - "imurmurhash.min.js", - "package.json", - "README.md" - ], - "repository": { - "type": "git", - "url": "https://github.com/jensyt/imurmurhash-js" - }, - "bugs": { - "url": "https://github.com/jensyt/imurmurhash-js/issues" - }, - "keywords": [ - "murmur", - "murmurhash", - "murmurhash3", - "hash", - "incremental" - ], - "author": { - "name": "Jens Taylor", - "email": "jensyt@gmail.com", - "url": "https://github.com/homebrewing" - }, - "license": "MIT", - "dependencies": { - }, - "devDependencies": { - }, - "engines": { - "node": ">=0.8.19" - } -} diff --git a/deps/npm/node_modules/libnpmdiff/package.json b/deps/npm/node_modules/libnpmdiff/package.json index c2a14dedcbef4c..943fa219aeff65 100644 --- a/deps/npm/node_modules/libnpmdiff/package.json +++ b/deps/npm/node_modules/libnpmdiff/package.json @@ -1,6 +1,6 @@ { "name": "libnpmdiff", - "version": "8.1.3", + "version": "8.1.5", "description": "The registry diff", "repository": { "type": "git", @@ -47,7 +47,7 @@ "tap": "^16.3.8" }, "dependencies": { - "@npmcli/arborist": "^9.4.0", + "@npmcli/arborist": "^9.4.2", "@npmcli/installed-package-contents": "^4.0.0", "binary-extensions": "^3.0.0", "diff": "^8.0.2", diff --git a/deps/npm/node_modules/libnpmexec/package.json b/deps/npm/node_modules/libnpmexec/package.json index 99c11b81bc2d84..1338bc4073236d 100644 --- a/deps/npm/node_modules/libnpmexec/package.json +++ b/deps/npm/node_modules/libnpmexec/package.json @@ -1,6 +1,6 @@ { "name": "libnpmexec", - "version": "10.2.3", + "version": "10.2.5", "files": [ "bin/", "lib/" @@ -61,7 +61,7 @@ }, "dependencies": { "@gar/promise-retry": "^1.0.0", - "@npmcli/arborist": "^9.4.0", + "@npmcli/arborist": "^9.4.2", "@npmcli/package-json": "^7.0.0", "@npmcli/run-script": "^10.0.0", "ci-info": "^4.0.0", diff --git a/deps/npm/node_modules/libnpmfund/package.json b/deps/npm/node_modules/libnpmfund/package.json index 2e8a755b8d0b50..3ab87f9c7a394d 100644 --- a/deps/npm/node_modules/libnpmfund/package.json +++ b/deps/npm/node_modules/libnpmfund/package.json @@ -1,6 +1,6 @@ { "name": "libnpmfund", - "version": "7.0.17", + "version": "7.0.19", "main": "lib/index.js", "files": [ "bin/", @@ -46,7 +46,7 @@ "tap": "^16.3.8" }, "dependencies": { - "@npmcli/arborist": "^9.4.0" + "@npmcli/arborist": "^9.4.2" }, "engines": { "node": "^20.17.0 || >=22.9.0" diff --git a/deps/npm/node_modules/libnpmpack/package.json b/deps/npm/node_modules/libnpmpack/package.json index cf0822a7775fc9..ad76fc3b746010 100644 --- a/deps/npm/node_modules/libnpmpack/package.json +++ b/deps/npm/node_modules/libnpmpack/package.json @@ -1,6 +1,6 @@ { "name": "libnpmpack", - "version": "9.1.3", + "version": "9.1.5", "description": "Programmatic API for the bits behind npm pack", "author": "GitHub Inc.", "main": "lib/index.js", @@ -37,7 +37,7 @@ "bugs": "https://github.com/npm/libnpmpack/issues", "homepage": "https://npmjs.com/package/libnpmpack", "dependencies": { - "@npmcli/arborist": "^9.4.0", + "@npmcli/arborist": "^9.4.2", "@npmcli/run-script": "^10.0.0", "npm-package-arg": "^13.0.0", "pacote": "^21.0.2" diff --git a/deps/npm/node_modules/lru-cache/dist/commonjs/index.js b/deps/npm/node_modules/lru-cache/dist/commonjs/index.js index 03473f2cc06ac3..a97b9f7ecc5301 100644 --- a/deps/npm/node_modules/lru-cache/dist/commonjs/index.js +++ b/deps/npm/node_modules/lru-cache/dist/commonjs/index.js @@ -452,31 +452,38 @@ class LRUCache { this.#setItemTTL = (index, ttl, start = this.#perf.now()) => { starts[index] = ttl !== 0 ? start : 0; ttls[index] = ttl; - // clear out the purge timer if we're setting TTL to 0, and - // previously had a ttl purge timer running, so it doesn't - // fire unnecessarily. - if (purgeTimers?.[index]) { - clearTimeout(purgeTimers[index]); - purgeTimers[index] = undefined; - } - if (ttl !== 0 && purgeTimers) { - const t = setTimeout(() => { - if (this.#isStale(index)) { - this.#delete(this.#keyList[index], 'expire'); - } - }, ttl + 1); - // unref() not supported on all platforms - /* c8 ignore start */ - if (t.unref) { - t.unref(); - } - /* c8 ignore stop */ - purgeTimers[index] = t; - } + setPurgetTimer(index, ttl); }; this.#updateItemAge = index => { starts[index] = ttls[index] !== 0 ? this.#perf.now() : 0; + setPurgetTimer(index, ttls[index]); }; + // clear out the purge timer if we're setting TTL to 0, and + // previously had a ttl purge timer running, so it doesn't + // fire unnecessarily. Don't need to do this if we're not doing + // autopurge. + const setPurgetTimer = !this.ttlAutopurge ? + () => { } + : (index, ttl) => { + if (purgeTimers?.[index]) { + clearTimeout(purgeTimers[index]); + purgeTimers[index] = undefined; + } + if (ttl && ttl !== 0 && purgeTimers) { + const t = setTimeout(() => { + if (this.#isStale(index)) { + this.#delete(this.#keyList[index], 'expire'); + } + }, ttl + 1); + // unref() not supported on all platforms + /* c8 ignore start */ + if (t.unref) { + t.unref(); + } + /* c8 ignore stop */ + purgeTimers[index] = t; + } + }; this.#statusTTL = (status, index) => { if (ttls[index]) { const ttl = ttls[index]; @@ -1219,8 +1226,7 @@ class LRUCache { if (this.#valList[index] === p) { // if we allow stale on fetch rejections, then we need to ensure that // the stale value is not removed from the cache when the fetch fails. - const del = !noDelete || - !proceed && bf.__staleWhileFetching === undefined; + const del = !noDelete || (!proceed && bf.__staleWhileFetching === undefined); if (del) { this.#delete(k, 'fetch'); } diff --git a/deps/npm/node_modules/lru-cache/dist/commonjs/index.min.js b/deps/npm/node_modules/lru-cache/dist/commonjs/index.min.js index 2be540a202670b..5a001c2d833615 100644 --- a/deps/npm/node_modules/lru-cache/dist/commonjs/index.min.js +++ b/deps/npm/node_modules/lru-cache/dist/commonjs/index.min.js @@ -1,2 +1,2 @@ -"use strict";Object.defineProperty(exports,"__esModule",{value:!0});exports.LRUCache=void 0;var x=typeof performance=="object"&&performance&&typeof performance.now=="function"?performance:Date,U=new Set,R=typeof process=="object"&&process?process:{},I=(a,t,e,i)=>{typeof R.emitWarning=="function"?R.emitWarning(a,t,e,i):console.error(`[${e}] ${t}: ${a}`)},C=globalThis.AbortController,L=globalThis.AbortSignal;if(typeof C>"u"){L=class{onabort;_onabort=[];reason;aborted=!1;addEventListener(i,s){this._onabort.push(s)}},C=class{constructor(){t()}signal=new L;abort(i){if(!this.signal.aborted){this.signal.reason=i,this.signal.aborted=!0;for(let s of this.signal._onabort)s(i);this.signal.onabort?.(i)}}};let a=R.env?.LRU_CACHE_IGNORE_AC_WARNING!=="1",t=()=>{a&&(a=!1,I("AbortController is not defined. If using lru-cache in node 14, load an AbortController polyfill from the `node-abort-controller` package. A minimal polyfill is provided for use by LRUCache.fetch(), but it should not be relied upon in other contexts (eg, passing it to other APIs that use AbortController/AbortSignal might have undesirable effects). You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.","NO_ABORT_CONTROLLER","ENOTSUP",t))}}var G=a=>!U.has(a),H=Symbol("type"),y=a=>a&&a===Math.floor(a)&&a>0&&isFinite(a),M=a=>y(a)?a<=Math.pow(2,8)?Uint8Array:a<=Math.pow(2,16)?Uint16Array:a<=Math.pow(2,32)?Uint32Array:a<=Number.MAX_SAFE_INTEGER?z:null:null,z=class extends Array{constructor(t){super(t),this.fill(0)}},W=class a{heap;length;static#o=!1;static create(t){let e=M(t);if(!e)return[];a.#o=!0;let i=new a(t,e);return a.#o=!1,i}constructor(t,e){if(!a.#o)throw new TypeError("instantiate Stack using Stack.create(n)");this.heap=new e(t),this.length=0}push(t){this.heap[this.length++]=t}pop(){return this.heap[--this.length]}},D=class a{#o;#c;#w;#C;#S;#L;#U;#m;get perf(){return this.#m}ttl;ttlResolution;ttlAutopurge;updateAgeOnGet;updateAgeOnHas;allowStale;noDisposeOnSet;noUpdateTTL;maxEntrySize;sizeCalculation;noDeleteOnFetchRejection;noDeleteOnStaleGet;allowStaleOnFetchAbort;allowStaleOnFetchRejection;ignoreFetchAbort;#n;#_;#s;#i;#t;#a;#u;#l;#h;#b;#r;#y;#A;#d;#g;#T;#v;#f;#I;static unsafeExposeInternals(t){return{starts:t.#A,ttls:t.#d,autopurgeTimers:t.#g,sizes:t.#y,keyMap:t.#s,keyList:t.#i,valList:t.#t,next:t.#a,prev:t.#u,get head(){return t.#l},get tail(){return t.#h},free:t.#b,isBackgroundFetch:e=>t.#e(e),backgroundFetch:(e,i,s,h)=>t.#G(e,i,s,h),moveToTail:e=>t.#D(e),indexes:e=>t.#F(e),rindexes:e=>t.#O(e),isStale:e=>t.#p(e)}}get max(){return this.#o}get maxSize(){return this.#c}get calculatedSize(){return this.#_}get size(){return this.#n}get fetchMethod(){return this.#L}get memoMethod(){return this.#U}get dispose(){return this.#w}get onInsert(){return this.#C}get disposeAfter(){return this.#S}constructor(t){let{max:e=0,ttl:i,ttlResolution:s=1,ttlAutopurge:h,updateAgeOnGet:n,updateAgeOnHas:o,allowStale:r,dispose:f,onInsert:m,disposeAfter:c,noDisposeOnSet:d,noUpdateTTL:g,maxSize:A=0,maxEntrySize:p=0,sizeCalculation:_,fetchMethod:l,memoMethod:w,noDeleteOnFetchRejection:b,noDeleteOnStaleGet:S,allowStaleOnFetchRejection:u,allowStaleOnFetchAbort:T,ignoreFetchAbort:F,perf:v}=t;if(v!==void 0&&typeof v?.now!="function")throw new TypeError("perf option must have a now() method if specified");if(this.#m=v??x,e!==0&&!y(e))throw new TypeError("max option must be a nonnegative integer");let O=e?M(e):Array;if(!O)throw new Error("invalid max value: "+e);if(this.#o=e,this.#c=A,this.maxEntrySize=p||this.#c,this.sizeCalculation=_,this.sizeCalculation){if(!this.#c&&!this.maxEntrySize)throw new TypeError("cannot set sizeCalculation without setting maxSize or maxEntrySize");if(typeof this.sizeCalculation!="function")throw new TypeError("sizeCalculation set to non-function")}if(w!==void 0&&typeof w!="function")throw new TypeError("memoMethod must be a function if defined");if(this.#U=w,l!==void 0&&typeof l!="function")throw new TypeError("fetchMethod must be a function if specified");if(this.#L=l,this.#v=!!l,this.#s=new Map,this.#i=new Array(e).fill(void 0),this.#t=new Array(e).fill(void 0),this.#a=new O(e),this.#u=new O(e),this.#l=0,this.#h=0,this.#b=W.create(e),this.#n=0,this.#_=0,typeof f=="function"&&(this.#w=f),typeof m=="function"&&(this.#C=m),typeof c=="function"?(this.#S=c,this.#r=[]):(this.#S=void 0,this.#r=void 0),this.#T=!!this.#w,this.#I=!!this.#C,this.#f=!!this.#S,this.noDisposeOnSet=!!d,this.noUpdateTTL=!!g,this.noDeleteOnFetchRejection=!!b,this.allowStaleOnFetchRejection=!!u,this.allowStaleOnFetchAbort=!!T,this.ignoreFetchAbort=!!F,this.maxEntrySize!==0){if(this.#c!==0&&!y(this.#c))throw new TypeError("maxSize must be a positive integer if specified");if(!y(this.maxEntrySize))throw new TypeError("maxEntrySize must be a positive integer if specified");this.#B()}if(this.allowStale=!!r,this.noDeleteOnStaleGet=!!S,this.updateAgeOnGet=!!n,this.updateAgeOnHas=!!o,this.ttlResolution=y(s)||s===0?s:1,this.ttlAutopurge=!!h,this.ttl=i||0,this.ttl){if(!y(this.ttl))throw new TypeError("ttl must be a positive integer if specified");this.#j()}if(this.#o===0&&this.ttl===0&&this.#c===0)throw new TypeError("At least one of max, maxSize, or ttl is required");if(!this.ttlAutopurge&&!this.#o&&!this.#c){let E="LRU_CACHE_UNBOUNDED";G(E)&&(U.add(E),I("TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.","UnboundedCacheWarning",E,a))}}getRemainingTTL(t){return this.#s.has(t)?1/0:0}#j(){let t=new z(this.#o),e=new z(this.#o);this.#d=t,this.#A=e;let i=this.ttlAutopurge?new Array(this.#o):void 0;this.#g=i,this.#N=(n,o,r=this.#m.now())=>{if(e[n]=o!==0?r:0,t[n]=o,i?.[n]&&(clearTimeout(i[n]),i[n]=void 0),o!==0&&i){let f=setTimeout(()=>{this.#p(n)&&this.#E(this.#i[n],"expire")},o+1);f.unref&&f.unref(),i[n]=f}},this.#R=n=>{e[n]=t[n]!==0?this.#m.now():0},this.#z=(n,o)=>{if(t[o]){let r=t[o],f=e[o];if(!r||!f)return;n.ttl=r,n.start=f,n.now=s||h();let m=n.now-f;n.remainingTTL=r-m}};let s=0,h=()=>{let n=this.#m.now();if(this.ttlResolution>0){s=n;let o=setTimeout(()=>s=0,this.ttlResolution);o.unref&&o.unref()}return n};this.getRemainingTTL=n=>{let o=this.#s.get(n);if(o===void 0)return 0;let r=t[o],f=e[o];if(!r||!f)return 1/0;let m=(s||h())-f;return r-m},this.#p=n=>{let o=e[n],r=t[n];return!!r&&!!o&&(s||h())-o>r}}#R=()=>{};#z=()=>{};#N=()=>{};#p=()=>!1;#B(){let t=new z(this.#o);this.#_=0,this.#y=t,this.#W=e=>{this.#_-=t[e],t[e]=0},this.#P=(e,i,s,h)=>{if(this.#e(i))return 0;if(!y(s))if(h){if(typeof h!="function")throw new TypeError("sizeCalculation must be a function");if(s=h(i,e),!y(s))throw new TypeError("sizeCalculation return invalid (expect positive integer)")}else throw new TypeError("invalid size value (must be positive integer). When maxSize or maxEntrySize is used, sizeCalculation or size must be set.");return s},this.#M=(e,i,s)=>{if(t[e]=i,this.#c){let h=this.#c-t[e];for(;this.#_>h;)this.#x(!0)}this.#_+=t[e],s&&(s.entrySize=i,s.totalCalculatedSize=this.#_)}}#W=t=>{};#M=(t,e,i)=>{};#P=(t,e,i,s)=>{if(i||s)throw new TypeError("cannot set size without setting maxSize or maxEntrySize on cache");return 0};*#F({allowStale:t=this.allowStale}={}){if(this.#n)for(let e=this.#h;!(!this.#H(e)||((t||!this.#p(e))&&(yield e),e===this.#l));)e=this.#u[e]}*#O({allowStale:t=this.allowStale}={}){if(this.#n)for(let e=this.#l;!(!this.#H(e)||((t||!this.#p(e))&&(yield e),e===this.#h));)e=this.#a[e]}#H(t){return t!==void 0&&this.#s.get(this.#i[t])===t}*entries(){for(let t of this.#F())this.#t[t]!==void 0&&this.#i[t]!==void 0&&!this.#e(this.#t[t])&&(yield[this.#i[t],this.#t[t]])}*rentries(){for(let t of this.#O())this.#t[t]!==void 0&&this.#i[t]!==void 0&&!this.#e(this.#t[t])&&(yield[this.#i[t],this.#t[t]])}*keys(){for(let t of this.#F()){let e=this.#i[t];e!==void 0&&!this.#e(this.#t[t])&&(yield e)}}*rkeys(){for(let t of this.#O()){let e=this.#i[t];e!==void 0&&!this.#e(this.#t[t])&&(yield e)}}*values(){for(let t of this.#F())this.#t[t]!==void 0&&!this.#e(this.#t[t])&&(yield this.#t[t])}*rvalues(){for(let t of this.#O())this.#t[t]!==void 0&&!this.#e(this.#t[t])&&(yield this.#t[t])}[Symbol.iterator](){return this.entries()}[Symbol.toStringTag]="LRUCache";find(t,e={}){for(let i of this.#F()){let s=this.#t[i],h=this.#e(s)?s.__staleWhileFetching:s;if(h!==void 0&&t(h,this.#i[i],this))return this.get(this.#i[i],e)}}forEach(t,e=this){for(let i of this.#F()){let s=this.#t[i],h=this.#e(s)?s.__staleWhileFetching:s;h!==void 0&&t.call(e,h,this.#i[i],this)}}rforEach(t,e=this){for(let i of this.#O()){let s=this.#t[i],h=this.#e(s)?s.__staleWhileFetching:s;h!==void 0&&t.call(e,h,this.#i[i],this)}}purgeStale(){let t=!1;for(let e of this.#O({allowStale:!0}))this.#p(e)&&(this.#E(this.#i[e],"expire"),t=!0);return t}info(t){let e=this.#s.get(t);if(e===void 0)return;let i=this.#t[e],s=this.#e(i)?i.__staleWhileFetching:i;if(s===void 0)return;let h={value:s};if(this.#d&&this.#A){let n=this.#d[e],o=this.#A[e];if(n&&o){let r=n-(this.#m.now()-o);h.ttl=r,h.start=Date.now()}}return this.#y&&(h.size=this.#y[e]),h}dump(){let t=[];for(let e of this.#F({allowStale:!0})){let i=this.#i[e],s=this.#t[e],h=this.#e(s)?s.__staleWhileFetching:s;if(h===void 0||i===void 0)continue;let n={value:h};if(this.#d&&this.#A){n.ttl=this.#d[e];let o=this.#m.now()-this.#A[e];n.start=Math.floor(Date.now()-o)}this.#y&&(n.size=this.#y[e]),t.unshift([i,n])}return t}load(t){this.clear();for(let[e,i]of t){if(i.start){let s=Date.now()-i.start;i.start=this.#m.now()-s}this.set(e,i.value,i)}}set(t,e,i={}){if(e===void 0)return this.delete(t),this;let{ttl:s=this.ttl,start:h,noDisposeOnSet:n=this.noDisposeOnSet,sizeCalculation:o=this.sizeCalculation,status:r}=i,{noUpdateTTL:f=this.noUpdateTTL}=i,m=this.#P(t,e,i.size||0,o);if(this.maxEntrySize&&m>this.maxEntrySize)return r&&(r.set="miss",r.maxEntrySizeExceeded=!0),this.#E(t,"set"),this;let c=this.#n===0?void 0:this.#s.get(t);if(c===void 0)c=this.#n===0?this.#h:this.#b.length!==0?this.#b.pop():this.#n===this.#o?this.#x(!1):this.#n,this.#i[c]=t,this.#t[c]=e,this.#s.set(t,c),this.#a[this.#h]=c,this.#u[c]=this.#h,this.#h=c,this.#n++,this.#M(c,m,r),r&&(r.set="add"),f=!1,this.#I&&this.#C?.(e,t,"add");else{this.#D(c);let d=this.#t[c];if(e!==d){if(this.#v&&this.#e(d)){d.__abortController.abort(new Error("replaced"));let{__staleWhileFetching:g}=d;g!==void 0&&!n&&(this.#T&&this.#w?.(g,t,"set"),this.#f&&this.#r?.push([g,t,"set"]))}else n||(this.#T&&this.#w?.(d,t,"set"),this.#f&&this.#r?.push([d,t,"set"]));if(this.#W(c),this.#M(c,m,r),this.#t[c]=e,r){r.set="replace";let g=d&&this.#e(d)?d.__staleWhileFetching:d;g!==void 0&&(r.oldValue=g)}}else r&&(r.set="update");this.#I&&this.onInsert?.(e,t,e===d?"update":"replace")}if(s!==0&&!this.#d&&this.#j(),this.#d&&(f||this.#N(c,s,h),r&&this.#z(r,c)),!n&&this.#f&&this.#r){let d=this.#r,g;for(;g=d?.shift();)this.#S?.(...g)}return this}pop(){try{for(;this.#n;){let t=this.#t[this.#l];if(this.#x(!0),this.#e(t)){if(t.__staleWhileFetching)return t.__staleWhileFetching}else if(t!==void 0)return t}}finally{if(this.#f&&this.#r){let t=this.#r,e;for(;e=t?.shift();)this.#S?.(...e)}}}#x(t){let e=this.#l,i=this.#i[e],s=this.#t[e];return this.#v&&this.#e(s)?s.__abortController.abort(new Error("evicted")):(this.#T||this.#f)&&(this.#T&&this.#w?.(s,i,"evict"),this.#f&&this.#r?.push([s,i,"evict"])),this.#W(e),this.#g?.[e]&&(clearTimeout(this.#g[e]),this.#g[e]=void 0),t&&(this.#i[e]=void 0,this.#t[e]=void 0,this.#b.push(e)),this.#n===1?(this.#l=this.#h=0,this.#b.length=0):this.#l=this.#a[e],this.#s.delete(i),this.#n--,e}has(t,e={}){let{updateAgeOnHas:i=this.updateAgeOnHas,status:s}=e,h=this.#s.get(t);if(h!==void 0){let n=this.#t[h];if(this.#e(n)&&n.__staleWhileFetching===void 0)return!1;if(this.#p(h))s&&(s.has="stale",this.#z(s,h));else return i&&this.#R(h),s&&(s.has="hit",this.#z(s,h)),!0}else s&&(s.has="miss");return!1}peek(t,e={}){let{allowStale:i=this.allowStale}=e,s=this.#s.get(t);if(s===void 0||!i&&this.#p(s))return;let h=this.#t[s];return this.#e(h)?h.__staleWhileFetching:h}#G(t,e,i,s){let h=e===void 0?void 0:this.#t[e];if(this.#e(h))return h;let n=new C,{signal:o}=i;o?.addEventListener("abort",()=>n.abort(o.reason),{signal:n.signal});let r={signal:n.signal,options:i,context:s},f=(p,_=!1)=>{let{aborted:l}=n.signal,w=i.ignoreFetchAbort&&p!==void 0,b=i.ignoreFetchAbort||!!(i.allowStaleOnFetchAbort&&p!==void 0);if(i.status&&(l&&!_?(i.status.fetchAborted=!0,i.status.fetchError=n.signal.reason,w&&(i.status.fetchAbortIgnored=!0)):i.status.fetchResolved=!0),l&&!w&&!_)return c(n.signal.reason,b);let S=g,u=this.#t[e];return(u===g||w&&_&&u===void 0)&&(p===void 0?S.__staleWhileFetching!==void 0?this.#t[e]=S.__staleWhileFetching:this.#E(t,"fetch"):(i.status&&(i.status.fetchUpdated=!0),this.set(t,p,r.options))),p},m=p=>(i.status&&(i.status.fetchRejected=!0,i.status.fetchError=p),c(p,!1)),c=(p,_)=>{let{aborted:l}=n.signal,w=l&&i.allowStaleOnFetchAbort,b=w||i.allowStaleOnFetchRejection,S=b||i.noDeleteOnFetchRejection,u=g;if(this.#t[e]===g&&(!S||!_&&u.__staleWhileFetching===void 0?this.#E(t,"fetch"):w||(this.#t[e]=u.__staleWhileFetching)),b)return i.status&&u.__staleWhileFetching!==void 0&&(i.status.returnedStale=!0),u.__staleWhileFetching;if(u.__returned===u)throw p},d=(p,_)=>{let l=this.#L?.(t,h,r);l&&l instanceof Promise&&l.then(w=>p(w===void 0?void 0:w),_),n.signal.addEventListener("abort",()=>{(!i.ignoreFetchAbort||i.allowStaleOnFetchAbort)&&(p(void 0),i.allowStaleOnFetchAbort&&(p=w=>f(w,!0)))})};i.status&&(i.status.fetchDispatched=!0);let g=new Promise(d).then(f,m),A=Object.assign(g,{__abortController:n,__staleWhileFetching:h,__returned:void 0});return e===void 0?(this.set(t,A,{...r.options,status:void 0}),e=this.#s.get(t)):this.#t[e]=A,A}#e(t){if(!this.#v)return!1;let e=t;return!!e&&e instanceof Promise&&e.hasOwnProperty("__staleWhileFetching")&&e.__abortController instanceof C}async fetch(t,e={}){let{allowStale:i=this.allowStale,updateAgeOnGet:s=this.updateAgeOnGet,noDeleteOnStaleGet:h=this.noDeleteOnStaleGet,ttl:n=this.ttl,noDisposeOnSet:o=this.noDisposeOnSet,size:r=0,sizeCalculation:f=this.sizeCalculation,noUpdateTTL:m=this.noUpdateTTL,noDeleteOnFetchRejection:c=this.noDeleteOnFetchRejection,allowStaleOnFetchRejection:d=this.allowStaleOnFetchRejection,ignoreFetchAbort:g=this.ignoreFetchAbort,allowStaleOnFetchAbort:A=this.allowStaleOnFetchAbort,context:p,forceRefresh:_=!1,status:l,signal:w}=e;if(!this.#v)return l&&(l.fetch="get"),this.get(t,{allowStale:i,updateAgeOnGet:s,noDeleteOnStaleGet:h,status:l});let b={allowStale:i,updateAgeOnGet:s,noDeleteOnStaleGet:h,ttl:n,noDisposeOnSet:o,size:r,sizeCalculation:f,noUpdateTTL:m,noDeleteOnFetchRejection:c,allowStaleOnFetchRejection:d,allowStaleOnFetchAbort:A,ignoreFetchAbort:g,status:l,signal:w},S=this.#s.get(t);if(S===void 0){l&&(l.fetch="miss");let u=this.#G(t,S,b,p);return u.__returned=u}else{let u=this.#t[S];if(this.#e(u)){let E=i&&u.__staleWhileFetching!==void 0;return l&&(l.fetch="inflight",E&&(l.returnedStale=!0)),E?u.__staleWhileFetching:u.__returned=u}let T=this.#p(S);if(!_&&!T)return l&&(l.fetch="hit"),this.#D(S),s&&this.#R(S),l&&this.#z(l,S),u;let F=this.#G(t,S,b,p),O=F.__staleWhileFetching!==void 0&&i;return l&&(l.fetch=T?"stale":"refresh",O&&T&&(l.returnedStale=!0)),O?F.__staleWhileFetching:F.__returned=F}}async forceFetch(t,e={}){let i=await this.fetch(t,e);if(i===void 0)throw new Error("fetch() returned undefined");return i}memo(t,e={}){let i=this.#U;if(!i)throw new Error("no memoMethod provided to constructor");let{context:s,forceRefresh:h,...n}=e,o=this.get(t,n);if(!h&&o!==void 0)return o;let r=i(t,o,{options:n,context:s});return this.set(t,r,n),r}get(t,e={}){let{allowStale:i=this.allowStale,updateAgeOnGet:s=this.updateAgeOnGet,noDeleteOnStaleGet:h=this.noDeleteOnStaleGet,status:n}=e,o=this.#s.get(t);if(o!==void 0){let r=this.#t[o],f=this.#e(r);return n&&this.#z(n,o),this.#p(o)?(n&&(n.get="stale"),f?(n&&i&&r.__staleWhileFetching!==void 0&&(n.returnedStale=!0),i?r.__staleWhileFetching:void 0):(h||this.#E(t,"expire"),n&&i&&(n.returnedStale=!0),i?r:void 0)):(n&&(n.get="hit"),f?r.__staleWhileFetching:(this.#D(o),s&&this.#R(o),r))}else n&&(n.get="miss")}#k(t,e){this.#u[e]=t,this.#a[t]=e}#D(t){t!==this.#h&&(t===this.#l?this.#l=this.#a[t]:this.#k(this.#u[t],this.#a[t]),this.#k(this.#h,t),this.#h=t)}delete(t){return this.#E(t,"delete")}#E(t,e){let i=!1;if(this.#n!==0){let s=this.#s.get(t);if(s!==void 0)if(this.#g?.[s]&&(clearTimeout(this.#g?.[s]),this.#g[s]=void 0),i=!0,this.#n===1)this.#V(e);else{this.#W(s);let h=this.#t[s];if(this.#e(h)?h.__abortController.abort(new Error("deleted")):(this.#T||this.#f)&&(this.#T&&this.#w?.(h,t,e),this.#f&&this.#r?.push([h,t,e])),this.#s.delete(t),this.#i[s]=void 0,this.#t[s]=void 0,s===this.#h)this.#h=this.#u[s];else if(s===this.#l)this.#l=this.#a[s];else{let n=this.#u[s];this.#a[n]=this.#a[s];let o=this.#a[s];this.#u[o]=this.#u[s]}this.#n--,this.#b.push(s)}}if(this.#f&&this.#r?.length){let s=this.#r,h;for(;h=s?.shift();)this.#S?.(...h)}return i}clear(){return this.#V("delete")}#V(t){for(let e of this.#O({allowStale:!0})){let i=this.#t[e];if(this.#e(i))i.__abortController.abort(new Error("deleted"));else{let s=this.#i[e];this.#T&&this.#w?.(i,s,t),this.#f&&this.#r?.push([i,s,t])}}if(this.#s.clear(),this.#t.fill(void 0),this.#i.fill(void 0),this.#d&&this.#A){this.#d.fill(0),this.#A.fill(0);for(let e of this.#g??[])e!==void 0&&clearTimeout(e);this.#g?.fill(void 0)}if(this.#y&&this.#y.fill(0),this.#l=0,this.#h=0,this.#b.length=0,this.#_=0,this.#n=0,this.#f&&this.#r){let e=this.#r,i;for(;i=e?.shift();)this.#S?.(...i)}}};exports.LRUCache=D; +"use strict";Object.defineProperty(exports,"__esModule",{value:!0});exports.LRUCache=void 0;var G=typeof performance=="object"&&performance&&typeof performance.now=="function"?performance:Date,U=new Set,R=typeof process=="object"&&process?process:{},I=(c,t,e,i)=>{typeof R.emitWarning=="function"?R.emitWarning(c,t,e,i):console.error(`[${e}] ${t}: ${c}`)},C=globalThis.AbortController,L=globalThis.AbortSignal;if(typeof C>"u"){L=class{onabort;_onabort=[];reason;aborted=!1;addEventListener(i,s){this._onabort.push(s)}},C=class{constructor(){t()}signal=new L;abort(i){if(!this.signal.aborted){this.signal.reason=i,this.signal.aborted=!0;for(let s of this.signal._onabort)s(i);this.signal.onabort?.(i)}}};let c=R.env?.LRU_CACHE_IGNORE_AC_WARNING!=="1",t=()=>{c&&(c=!1,I("AbortController is not defined. If using lru-cache in node 14, load an AbortController polyfill from the `node-abort-controller` package. A minimal polyfill is provided for use by LRUCache.fetch(), but it should not be relied upon in other contexts (eg, passing it to other APIs that use AbortController/AbortSignal might have undesirable effects). You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.","NO_ABORT_CONTROLLER","ENOTSUP",t))}}var x=c=>!U.has(c),H=Symbol("type"),y=c=>c&&c===Math.floor(c)&&c>0&&isFinite(c),M=c=>y(c)?c<=Math.pow(2,8)?Uint8Array:c<=Math.pow(2,16)?Uint16Array:c<=Math.pow(2,32)?Uint32Array:c<=Number.MAX_SAFE_INTEGER?z:null:null,z=class extends Array{constructor(t){super(t),this.fill(0)}},W=class c{heap;length;static#o=!1;static create(t){let e=M(t);if(!e)return[];c.#o=!0;let i=new c(t,e);return c.#o=!1,i}constructor(t,e){if(!c.#o)throw new TypeError("instantiate Stack using Stack.create(n)");this.heap=new e(t),this.length=0}push(t){this.heap[this.length++]=t}pop(){return this.heap[--this.length]}},D=class c{#o;#c;#w;#C;#S;#L;#U;#m;get perf(){return this.#m}ttl;ttlResolution;ttlAutopurge;updateAgeOnGet;updateAgeOnHas;allowStale;noDisposeOnSet;noUpdateTTL;maxEntrySize;sizeCalculation;noDeleteOnFetchRejection;noDeleteOnStaleGet;allowStaleOnFetchAbort;allowStaleOnFetchRejection;ignoreFetchAbort;#n;#_;#s;#i;#t;#a;#u;#l;#h;#b;#r;#y;#A;#d;#g;#T;#v;#f;#I;static unsafeExposeInternals(t){return{starts:t.#A,ttls:t.#d,autopurgeTimers:t.#g,sizes:t.#y,keyMap:t.#s,keyList:t.#i,valList:t.#t,next:t.#a,prev:t.#u,get head(){return t.#l},get tail(){return t.#h},free:t.#b,isBackgroundFetch:e=>t.#e(e),backgroundFetch:(e,i,s,n)=>t.#x(e,i,s,n),moveToTail:e=>t.#D(e),indexes:e=>t.#F(e),rindexes:e=>t.#O(e),isStale:e=>t.#p(e)}}get max(){return this.#o}get maxSize(){return this.#c}get calculatedSize(){return this.#_}get size(){return this.#n}get fetchMethod(){return this.#L}get memoMethod(){return this.#U}get dispose(){return this.#w}get onInsert(){return this.#C}get disposeAfter(){return this.#S}constructor(t){let{max:e=0,ttl:i,ttlResolution:s=1,ttlAutopurge:n,updateAgeOnGet:o,updateAgeOnHas:h,allowStale:r,dispose:a,onInsert:w,disposeAfter:f,noDisposeOnSet:d,noUpdateTTL:g,maxSize:A=0,maxEntrySize:p=0,sizeCalculation:_,fetchMethod:l,memoMethod:S,noDeleteOnFetchRejection:b,noDeleteOnStaleGet:m,allowStaleOnFetchRejection:u,allowStaleOnFetchAbort:T,ignoreFetchAbort:F,perf:v}=t;if(v!==void 0&&typeof v?.now!="function")throw new TypeError("perf option must have a now() method if specified");if(this.#m=v??G,e!==0&&!y(e))throw new TypeError("max option must be a nonnegative integer");let O=e?M(e):Array;if(!O)throw new Error("invalid max value: "+e);if(this.#o=e,this.#c=A,this.maxEntrySize=p||this.#c,this.sizeCalculation=_,this.sizeCalculation){if(!this.#c&&!this.maxEntrySize)throw new TypeError("cannot set sizeCalculation without setting maxSize or maxEntrySize");if(typeof this.sizeCalculation!="function")throw new TypeError("sizeCalculation set to non-function")}if(S!==void 0&&typeof S!="function")throw new TypeError("memoMethod must be a function if defined");if(this.#U=S,l!==void 0&&typeof l!="function")throw new TypeError("fetchMethod must be a function if specified");if(this.#L=l,this.#v=!!l,this.#s=new Map,this.#i=new Array(e).fill(void 0),this.#t=new Array(e).fill(void 0),this.#a=new O(e),this.#u=new O(e),this.#l=0,this.#h=0,this.#b=W.create(e),this.#n=0,this.#_=0,typeof a=="function"&&(this.#w=a),typeof w=="function"&&(this.#C=w),typeof f=="function"?(this.#S=f,this.#r=[]):(this.#S=void 0,this.#r=void 0),this.#T=!!this.#w,this.#I=!!this.#C,this.#f=!!this.#S,this.noDisposeOnSet=!!d,this.noUpdateTTL=!!g,this.noDeleteOnFetchRejection=!!b,this.allowStaleOnFetchRejection=!!u,this.allowStaleOnFetchAbort=!!T,this.ignoreFetchAbort=!!F,this.maxEntrySize!==0){if(this.#c!==0&&!y(this.#c))throw new TypeError("maxSize must be a positive integer if specified");if(!y(this.maxEntrySize))throw new TypeError("maxEntrySize must be a positive integer if specified");this.#B()}if(this.allowStale=!!r,this.noDeleteOnStaleGet=!!m,this.updateAgeOnGet=!!o,this.updateAgeOnHas=!!h,this.ttlResolution=y(s)||s===0?s:1,this.ttlAutopurge=!!n,this.ttl=i||0,this.ttl){if(!y(this.ttl))throw new TypeError("ttl must be a positive integer if specified");this.#j()}if(this.#o===0&&this.ttl===0&&this.#c===0)throw new TypeError("At least one of max, maxSize, or ttl is required");if(!this.ttlAutopurge&&!this.#o&&!this.#c){let E="LRU_CACHE_UNBOUNDED";x(E)&&(U.add(E),I("TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.","UnboundedCacheWarning",E,c))}}getRemainingTTL(t){return this.#s.has(t)?1/0:0}#j(){let t=new z(this.#o),e=new z(this.#o);this.#d=t,this.#A=e;let i=this.ttlAutopurge?new Array(this.#o):void 0;this.#g=i,this.#N=(h,r,a=this.#m.now())=>{e[h]=r!==0?a:0,t[h]=r,s(h,r)},this.#R=h=>{e[h]=t[h]!==0?this.#m.now():0,s(h,t[h])};let s=this.ttlAutopurge?(h,r)=>{if(i?.[h]&&(clearTimeout(i[h]),i[h]=void 0),r&&r!==0&&i){let a=setTimeout(()=>{this.#p(h)&&this.#E(this.#i[h],"expire")},r+1);a.unref&&a.unref(),i[h]=a}}:()=>{};this.#z=(h,r)=>{if(t[r]){let a=t[r],w=e[r];if(!a||!w)return;h.ttl=a,h.start=w,h.now=n||o();let f=h.now-w;h.remainingTTL=a-f}};let n=0,o=()=>{let h=this.#m.now();if(this.ttlResolution>0){n=h;let r=setTimeout(()=>n=0,this.ttlResolution);r.unref&&r.unref()}return h};this.getRemainingTTL=h=>{let r=this.#s.get(h);if(r===void 0)return 0;let a=t[r],w=e[r];if(!a||!w)return 1/0;let f=(n||o())-w;return a-f},this.#p=h=>{let r=e[h],a=t[h];return!!a&&!!r&&(n||o())-r>a}}#R=()=>{};#z=()=>{};#N=()=>{};#p=()=>!1;#B(){let t=new z(this.#o);this.#_=0,this.#y=t,this.#W=e=>{this.#_-=t[e],t[e]=0},this.#P=(e,i,s,n)=>{if(this.#e(i))return 0;if(!y(s))if(n){if(typeof n!="function")throw new TypeError("sizeCalculation must be a function");if(s=n(i,e),!y(s))throw new TypeError("sizeCalculation return invalid (expect positive integer)")}else throw new TypeError("invalid size value (must be positive integer). When maxSize or maxEntrySize is used, sizeCalculation or size must be set.");return s},this.#M=(e,i,s)=>{if(t[e]=i,this.#c){let n=this.#c-t[e];for(;this.#_>n;)this.#G(!0)}this.#_+=t[e],s&&(s.entrySize=i,s.totalCalculatedSize=this.#_)}}#W=t=>{};#M=(t,e,i)=>{};#P=(t,e,i,s)=>{if(i||s)throw new TypeError("cannot set size without setting maxSize or maxEntrySize on cache");return 0};*#F({allowStale:t=this.allowStale}={}){if(this.#n)for(let e=this.#h;!(!this.#H(e)||((t||!this.#p(e))&&(yield e),e===this.#l));)e=this.#u[e]}*#O({allowStale:t=this.allowStale}={}){if(this.#n)for(let e=this.#l;!(!this.#H(e)||((t||!this.#p(e))&&(yield e),e===this.#h));)e=this.#a[e]}#H(t){return t!==void 0&&this.#s.get(this.#i[t])===t}*entries(){for(let t of this.#F())this.#t[t]!==void 0&&this.#i[t]!==void 0&&!this.#e(this.#t[t])&&(yield[this.#i[t],this.#t[t]])}*rentries(){for(let t of this.#O())this.#t[t]!==void 0&&this.#i[t]!==void 0&&!this.#e(this.#t[t])&&(yield[this.#i[t],this.#t[t]])}*keys(){for(let t of this.#F()){let e=this.#i[t];e!==void 0&&!this.#e(this.#t[t])&&(yield e)}}*rkeys(){for(let t of this.#O()){let e=this.#i[t];e!==void 0&&!this.#e(this.#t[t])&&(yield e)}}*values(){for(let t of this.#F())this.#t[t]!==void 0&&!this.#e(this.#t[t])&&(yield this.#t[t])}*rvalues(){for(let t of this.#O())this.#t[t]!==void 0&&!this.#e(this.#t[t])&&(yield this.#t[t])}[Symbol.iterator](){return this.entries()}[Symbol.toStringTag]="LRUCache";find(t,e={}){for(let i of this.#F()){let s=this.#t[i],n=this.#e(s)?s.__staleWhileFetching:s;if(n!==void 0&&t(n,this.#i[i],this))return this.get(this.#i[i],e)}}forEach(t,e=this){for(let i of this.#F()){let s=this.#t[i],n=this.#e(s)?s.__staleWhileFetching:s;n!==void 0&&t.call(e,n,this.#i[i],this)}}rforEach(t,e=this){for(let i of this.#O()){let s=this.#t[i],n=this.#e(s)?s.__staleWhileFetching:s;n!==void 0&&t.call(e,n,this.#i[i],this)}}purgeStale(){let t=!1;for(let e of this.#O({allowStale:!0}))this.#p(e)&&(this.#E(this.#i[e],"expire"),t=!0);return t}info(t){let e=this.#s.get(t);if(e===void 0)return;let i=this.#t[e],s=this.#e(i)?i.__staleWhileFetching:i;if(s===void 0)return;let n={value:s};if(this.#d&&this.#A){let o=this.#d[e],h=this.#A[e];if(o&&h){let r=o-(this.#m.now()-h);n.ttl=r,n.start=Date.now()}}return this.#y&&(n.size=this.#y[e]),n}dump(){let t=[];for(let e of this.#F({allowStale:!0})){let i=this.#i[e],s=this.#t[e],n=this.#e(s)?s.__staleWhileFetching:s;if(n===void 0||i===void 0)continue;let o={value:n};if(this.#d&&this.#A){o.ttl=this.#d[e];let h=this.#m.now()-this.#A[e];o.start=Math.floor(Date.now()-h)}this.#y&&(o.size=this.#y[e]),t.unshift([i,o])}return t}load(t){this.clear();for(let[e,i]of t){if(i.start){let s=Date.now()-i.start;i.start=this.#m.now()-s}this.set(e,i.value,i)}}set(t,e,i={}){if(e===void 0)return this.delete(t),this;let{ttl:s=this.ttl,start:n,noDisposeOnSet:o=this.noDisposeOnSet,sizeCalculation:h=this.sizeCalculation,status:r}=i,{noUpdateTTL:a=this.noUpdateTTL}=i,w=this.#P(t,e,i.size||0,h);if(this.maxEntrySize&&w>this.maxEntrySize)return r&&(r.set="miss",r.maxEntrySizeExceeded=!0),this.#E(t,"set"),this;let f=this.#n===0?void 0:this.#s.get(t);if(f===void 0)f=this.#n===0?this.#h:this.#b.length!==0?this.#b.pop():this.#n===this.#o?this.#G(!1):this.#n,this.#i[f]=t,this.#t[f]=e,this.#s.set(t,f),this.#a[this.#h]=f,this.#u[f]=this.#h,this.#h=f,this.#n++,this.#M(f,w,r),r&&(r.set="add"),a=!1,this.#I&&this.#C?.(e,t,"add");else{this.#D(f);let d=this.#t[f];if(e!==d){if(this.#v&&this.#e(d)){d.__abortController.abort(new Error("replaced"));let{__staleWhileFetching:g}=d;g!==void 0&&!o&&(this.#T&&this.#w?.(g,t,"set"),this.#f&&this.#r?.push([g,t,"set"]))}else o||(this.#T&&this.#w?.(d,t,"set"),this.#f&&this.#r?.push([d,t,"set"]));if(this.#W(f),this.#M(f,w,r),this.#t[f]=e,r){r.set="replace";let g=d&&this.#e(d)?d.__staleWhileFetching:d;g!==void 0&&(r.oldValue=g)}}else r&&(r.set="update");this.#I&&this.onInsert?.(e,t,e===d?"update":"replace")}if(s!==0&&!this.#d&&this.#j(),this.#d&&(a||this.#N(f,s,n),r&&this.#z(r,f)),!o&&this.#f&&this.#r){let d=this.#r,g;for(;g=d?.shift();)this.#S?.(...g)}return this}pop(){try{for(;this.#n;){let t=this.#t[this.#l];if(this.#G(!0),this.#e(t)){if(t.__staleWhileFetching)return t.__staleWhileFetching}else if(t!==void 0)return t}}finally{if(this.#f&&this.#r){let t=this.#r,e;for(;e=t?.shift();)this.#S?.(...e)}}}#G(t){let e=this.#l,i=this.#i[e],s=this.#t[e];return this.#v&&this.#e(s)?s.__abortController.abort(new Error("evicted")):(this.#T||this.#f)&&(this.#T&&this.#w?.(s,i,"evict"),this.#f&&this.#r?.push([s,i,"evict"])),this.#W(e),this.#g?.[e]&&(clearTimeout(this.#g[e]),this.#g[e]=void 0),t&&(this.#i[e]=void 0,this.#t[e]=void 0,this.#b.push(e)),this.#n===1?(this.#l=this.#h=0,this.#b.length=0):this.#l=this.#a[e],this.#s.delete(i),this.#n--,e}has(t,e={}){let{updateAgeOnHas:i=this.updateAgeOnHas,status:s}=e,n=this.#s.get(t);if(n!==void 0){let o=this.#t[n];if(this.#e(o)&&o.__staleWhileFetching===void 0)return!1;if(this.#p(n))s&&(s.has="stale",this.#z(s,n));else return i&&this.#R(n),s&&(s.has="hit",this.#z(s,n)),!0}else s&&(s.has="miss");return!1}peek(t,e={}){let{allowStale:i=this.allowStale}=e,s=this.#s.get(t);if(s===void 0||!i&&this.#p(s))return;let n=this.#t[s];return this.#e(n)?n.__staleWhileFetching:n}#x(t,e,i,s){let n=e===void 0?void 0:this.#t[e];if(this.#e(n))return n;let o=new C,{signal:h}=i;h?.addEventListener("abort",()=>o.abort(h.reason),{signal:o.signal});let r={signal:o.signal,options:i,context:s},a=(p,_=!1)=>{let{aborted:l}=o.signal,S=i.ignoreFetchAbort&&p!==void 0,b=i.ignoreFetchAbort||!!(i.allowStaleOnFetchAbort&&p!==void 0);if(i.status&&(l&&!_?(i.status.fetchAborted=!0,i.status.fetchError=o.signal.reason,S&&(i.status.fetchAbortIgnored=!0)):i.status.fetchResolved=!0),l&&!S&&!_)return f(o.signal.reason,b);let m=g,u=this.#t[e];return(u===g||S&&_&&u===void 0)&&(p===void 0?m.__staleWhileFetching!==void 0?this.#t[e]=m.__staleWhileFetching:this.#E(t,"fetch"):(i.status&&(i.status.fetchUpdated=!0),this.set(t,p,r.options))),p},w=p=>(i.status&&(i.status.fetchRejected=!0,i.status.fetchError=p),f(p,!1)),f=(p,_)=>{let{aborted:l}=o.signal,S=l&&i.allowStaleOnFetchAbort,b=S||i.allowStaleOnFetchRejection,m=b||i.noDeleteOnFetchRejection,u=g;if(this.#t[e]===g&&(!m||!_&&u.__staleWhileFetching===void 0?this.#E(t,"fetch"):S||(this.#t[e]=u.__staleWhileFetching)),b)return i.status&&u.__staleWhileFetching!==void 0&&(i.status.returnedStale=!0),u.__staleWhileFetching;if(u.__returned===u)throw p},d=(p,_)=>{let l=this.#L?.(t,n,r);l&&l instanceof Promise&&l.then(S=>p(S===void 0?void 0:S),_),o.signal.addEventListener("abort",()=>{(!i.ignoreFetchAbort||i.allowStaleOnFetchAbort)&&(p(void 0),i.allowStaleOnFetchAbort&&(p=S=>a(S,!0)))})};i.status&&(i.status.fetchDispatched=!0);let g=new Promise(d).then(a,w),A=Object.assign(g,{__abortController:o,__staleWhileFetching:n,__returned:void 0});return e===void 0?(this.set(t,A,{...r.options,status:void 0}),e=this.#s.get(t)):this.#t[e]=A,A}#e(t){if(!this.#v)return!1;let e=t;return!!e&&e instanceof Promise&&e.hasOwnProperty("__staleWhileFetching")&&e.__abortController instanceof C}async fetch(t,e={}){let{allowStale:i=this.allowStale,updateAgeOnGet:s=this.updateAgeOnGet,noDeleteOnStaleGet:n=this.noDeleteOnStaleGet,ttl:o=this.ttl,noDisposeOnSet:h=this.noDisposeOnSet,size:r=0,sizeCalculation:a=this.sizeCalculation,noUpdateTTL:w=this.noUpdateTTL,noDeleteOnFetchRejection:f=this.noDeleteOnFetchRejection,allowStaleOnFetchRejection:d=this.allowStaleOnFetchRejection,ignoreFetchAbort:g=this.ignoreFetchAbort,allowStaleOnFetchAbort:A=this.allowStaleOnFetchAbort,context:p,forceRefresh:_=!1,status:l,signal:S}=e;if(!this.#v)return l&&(l.fetch="get"),this.get(t,{allowStale:i,updateAgeOnGet:s,noDeleteOnStaleGet:n,status:l});let b={allowStale:i,updateAgeOnGet:s,noDeleteOnStaleGet:n,ttl:o,noDisposeOnSet:h,size:r,sizeCalculation:a,noUpdateTTL:w,noDeleteOnFetchRejection:f,allowStaleOnFetchRejection:d,allowStaleOnFetchAbort:A,ignoreFetchAbort:g,status:l,signal:S},m=this.#s.get(t);if(m===void 0){l&&(l.fetch="miss");let u=this.#x(t,m,b,p);return u.__returned=u}else{let u=this.#t[m];if(this.#e(u)){let E=i&&u.__staleWhileFetching!==void 0;return l&&(l.fetch="inflight",E&&(l.returnedStale=!0)),E?u.__staleWhileFetching:u.__returned=u}let T=this.#p(m);if(!_&&!T)return l&&(l.fetch="hit"),this.#D(m),s&&this.#R(m),l&&this.#z(l,m),u;let F=this.#x(t,m,b,p),O=F.__staleWhileFetching!==void 0&&i;return l&&(l.fetch=T?"stale":"refresh",O&&T&&(l.returnedStale=!0)),O?F.__staleWhileFetching:F.__returned=F}}async forceFetch(t,e={}){let i=await this.fetch(t,e);if(i===void 0)throw new Error("fetch() returned undefined");return i}memo(t,e={}){let i=this.#U;if(!i)throw new Error("no memoMethod provided to constructor");let{context:s,forceRefresh:n,...o}=e,h=this.get(t,o);if(!n&&h!==void 0)return h;let r=i(t,h,{options:o,context:s});return this.set(t,r,o),r}get(t,e={}){let{allowStale:i=this.allowStale,updateAgeOnGet:s=this.updateAgeOnGet,noDeleteOnStaleGet:n=this.noDeleteOnStaleGet,status:o}=e,h=this.#s.get(t);if(h!==void 0){let r=this.#t[h],a=this.#e(r);return o&&this.#z(o,h),this.#p(h)?(o&&(o.get="stale"),a?(o&&i&&r.__staleWhileFetching!==void 0&&(o.returnedStale=!0),i?r.__staleWhileFetching:void 0):(n||this.#E(t,"expire"),o&&i&&(o.returnedStale=!0),i?r:void 0)):(o&&(o.get="hit"),a?r.__staleWhileFetching:(this.#D(h),s&&this.#R(h),r))}else o&&(o.get="miss")}#k(t,e){this.#u[e]=t,this.#a[t]=e}#D(t){t!==this.#h&&(t===this.#l?this.#l=this.#a[t]:this.#k(this.#u[t],this.#a[t]),this.#k(this.#h,t),this.#h=t)}delete(t){return this.#E(t,"delete")}#E(t,e){let i=!1;if(this.#n!==0){let s=this.#s.get(t);if(s!==void 0)if(this.#g?.[s]&&(clearTimeout(this.#g?.[s]),this.#g[s]=void 0),i=!0,this.#n===1)this.#V(e);else{this.#W(s);let n=this.#t[s];if(this.#e(n)?n.__abortController.abort(new Error("deleted")):(this.#T||this.#f)&&(this.#T&&this.#w?.(n,t,e),this.#f&&this.#r?.push([n,t,e])),this.#s.delete(t),this.#i[s]=void 0,this.#t[s]=void 0,s===this.#h)this.#h=this.#u[s];else if(s===this.#l)this.#l=this.#a[s];else{let o=this.#u[s];this.#a[o]=this.#a[s];let h=this.#a[s];this.#u[h]=this.#u[s]}this.#n--,this.#b.push(s)}}if(this.#f&&this.#r?.length){let s=this.#r,n;for(;n=s?.shift();)this.#S?.(...n)}return i}clear(){return this.#V("delete")}#V(t){for(let e of this.#O({allowStale:!0})){let i=this.#t[e];if(this.#e(i))i.__abortController.abort(new Error("deleted"));else{let s=this.#i[e];this.#T&&this.#w?.(i,s,t),this.#f&&this.#r?.push([i,s,t])}}if(this.#s.clear(),this.#t.fill(void 0),this.#i.fill(void 0),this.#d&&this.#A){this.#d.fill(0),this.#A.fill(0);for(let e of this.#g??[])e!==void 0&&clearTimeout(e);this.#g?.fill(void 0)}if(this.#y&&this.#y.fill(0),this.#l=0,this.#h=0,this.#b.length=0,this.#_=0,this.#n=0,this.#f&&this.#r){let e=this.#r,i;for(;i=e?.shift();)this.#S?.(...i)}}};exports.LRUCache=D; //# sourceMappingURL=index.min.js.map diff --git a/deps/npm/node_modules/lru-cache/dist/esm/index.js b/deps/npm/node_modules/lru-cache/dist/esm/index.js index c66c4b9e31a3ad..882d85dd71e51f 100644 --- a/deps/npm/node_modules/lru-cache/dist/esm/index.js +++ b/deps/npm/node_modules/lru-cache/dist/esm/index.js @@ -449,31 +449,38 @@ export class LRUCache { this.#setItemTTL = (index, ttl, start = this.#perf.now()) => { starts[index] = ttl !== 0 ? start : 0; ttls[index] = ttl; - // clear out the purge timer if we're setting TTL to 0, and - // previously had a ttl purge timer running, so it doesn't - // fire unnecessarily. - if (purgeTimers?.[index]) { - clearTimeout(purgeTimers[index]); - purgeTimers[index] = undefined; - } - if (ttl !== 0 && purgeTimers) { - const t = setTimeout(() => { - if (this.#isStale(index)) { - this.#delete(this.#keyList[index], 'expire'); - } - }, ttl + 1); - // unref() not supported on all platforms - /* c8 ignore start */ - if (t.unref) { - t.unref(); - } - /* c8 ignore stop */ - purgeTimers[index] = t; - } + setPurgetTimer(index, ttl); }; this.#updateItemAge = index => { starts[index] = ttls[index] !== 0 ? this.#perf.now() : 0; + setPurgetTimer(index, ttls[index]); }; + // clear out the purge timer if we're setting TTL to 0, and + // previously had a ttl purge timer running, so it doesn't + // fire unnecessarily. Don't need to do this if we're not doing + // autopurge. + const setPurgetTimer = !this.ttlAutopurge ? + () => { } + : (index, ttl) => { + if (purgeTimers?.[index]) { + clearTimeout(purgeTimers[index]); + purgeTimers[index] = undefined; + } + if (ttl && ttl !== 0 && purgeTimers) { + const t = setTimeout(() => { + if (this.#isStale(index)) { + this.#delete(this.#keyList[index], 'expire'); + } + }, ttl + 1); + // unref() not supported on all platforms + /* c8 ignore start */ + if (t.unref) { + t.unref(); + } + /* c8 ignore stop */ + purgeTimers[index] = t; + } + }; this.#statusTTL = (status, index) => { if (ttls[index]) { const ttl = ttls[index]; @@ -1216,8 +1223,7 @@ export class LRUCache { if (this.#valList[index] === p) { // if we allow stale on fetch rejections, then we need to ensure that // the stale value is not removed from the cache when the fetch fails. - const del = !noDelete || - !proceed && bf.__staleWhileFetching === undefined; + const del = !noDelete || (!proceed && bf.__staleWhileFetching === undefined); if (del) { this.#delete(k, 'fetch'); } diff --git a/deps/npm/node_modules/lru-cache/dist/esm/index.min.js b/deps/npm/node_modules/lru-cache/dist/esm/index.min.js index 81f29da1dea9f1..bb72f37e7d0643 100644 --- a/deps/npm/node_modules/lru-cache/dist/esm/index.min.js +++ b/deps/npm/node_modules/lru-cache/dist/esm/index.min.js @@ -1,2 +1,2 @@ -var M=typeof performance=="object"&&performance&&typeof performance.now=="function"?performance:Date,I=new Set,R=typeof process=="object"&&process?process:{},x=(a,t,e,i)=>{typeof R.emitWarning=="function"?R.emitWarning(a,t,e,i):console.error(`[${e}] ${t}: ${a}`)},C=globalThis.AbortController,D=globalThis.AbortSignal;if(typeof C>"u"){D=class{onabort;_onabort=[];reason;aborted=!1;addEventListener(i,s){this._onabort.push(s)}},C=class{constructor(){t()}signal=new D;abort(i){if(!this.signal.aborted){this.signal.reason=i,this.signal.aborted=!0;for(let s of this.signal._onabort)s(i);this.signal.onabort?.(i)}}};let a=R.env?.LRU_CACHE_IGNORE_AC_WARNING!=="1",t=()=>{a&&(a=!1,x("AbortController is not defined. If using lru-cache in node 14, load an AbortController polyfill from the `node-abort-controller` package. A minimal polyfill is provided for use by LRUCache.fetch(), but it should not be relied upon in other contexts (eg, passing it to other APIs that use AbortController/AbortSignal might have undesirable effects). You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.","NO_ABORT_CONTROLLER","ENOTSUP",t))}}var G=a=>!I.has(a),H=Symbol("type"),y=a=>a&&a===Math.floor(a)&&a>0&&isFinite(a),U=a=>y(a)?a<=Math.pow(2,8)?Uint8Array:a<=Math.pow(2,16)?Uint16Array:a<=Math.pow(2,32)?Uint32Array:a<=Number.MAX_SAFE_INTEGER?z:null:null,z=class extends Array{constructor(t){super(t),this.fill(0)}},W=class a{heap;length;static#o=!1;static create(t){let e=U(t);if(!e)return[];a.#o=!0;let i=new a(t,e);return a.#o=!1,i}constructor(t,e){if(!a.#o)throw new TypeError("instantiate Stack using Stack.create(n)");this.heap=new e(t),this.length=0}push(t){this.heap[this.length++]=t}pop(){return this.heap[--this.length]}},L=class a{#o;#c;#w;#C;#S;#L;#I;#m;get perf(){return this.#m}ttl;ttlResolution;ttlAutopurge;updateAgeOnGet;updateAgeOnHas;allowStale;noDisposeOnSet;noUpdateTTL;maxEntrySize;sizeCalculation;noDeleteOnFetchRejection;noDeleteOnStaleGet;allowStaleOnFetchAbort;allowStaleOnFetchRejection;ignoreFetchAbort;#n;#_;#s;#i;#t;#a;#u;#l;#h;#b;#r;#y;#A;#d;#g;#T;#v;#f;#x;static unsafeExposeInternals(t){return{starts:t.#A,ttls:t.#d,autopurgeTimers:t.#g,sizes:t.#y,keyMap:t.#s,keyList:t.#i,valList:t.#t,next:t.#a,prev:t.#u,get head(){return t.#l},get tail(){return t.#h},free:t.#b,isBackgroundFetch:e=>t.#e(e),backgroundFetch:(e,i,s,h)=>t.#G(e,i,s,h),moveToTail:e=>t.#D(e),indexes:e=>t.#F(e),rindexes:e=>t.#O(e),isStale:e=>t.#p(e)}}get max(){return this.#o}get maxSize(){return this.#c}get calculatedSize(){return this.#_}get size(){return this.#n}get fetchMethod(){return this.#L}get memoMethod(){return this.#I}get dispose(){return this.#w}get onInsert(){return this.#C}get disposeAfter(){return this.#S}constructor(t){let{max:e=0,ttl:i,ttlResolution:s=1,ttlAutopurge:h,updateAgeOnGet:n,updateAgeOnHas:o,allowStale:r,dispose:f,onInsert:m,disposeAfter:c,noDisposeOnSet:d,noUpdateTTL:g,maxSize:A=0,maxEntrySize:p=0,sizeCalculation:_,fetchMethod:l,memoMethod:w,noDeleteOnFetchRejection:b,noDeleteOnStaleGet:S,allowStaleOnFetchRejection:u,allowStaleOnFetchAbort:T,ignoreFetchAbort:F,perf:v}=t;if(v!==void 0&&typeof v?.now!="function")throw new TypeError("perf option must have a now() method if specified");if(this.#m=v??M,e!==0&&!y(e))throw new TypeError("max option must be a nonnegative integer");let O=e?U(e):Array;if(!O)throw new Error("invalid max value: "+e);if(this.#o=e,this.#c=A,this.maxEntrySize=p||this.#c,this.sizeCalculation=_,this.sizeCalculation){if(!this.#c&&!this.maxEntrySize)throw new TypeError("cannot set sizeCalculation without setting maxSize or maxEntrySize");if(typeof this.sizeCalculation!="function")throw new TypeError("sizeCalculation set to non-function")}if(w!==void 0&&typeof w!="function")throw new TypeError("memoMethod must be a function if defined");if(this.#I=w,l!==void 0&&typeof l!="function")throw new TypeError("fetchMethod must be a function if specified");if(this.#L=l,this.#v=!!l,this.#s=new Map,this.#i=new Array(e).fill(void 0),this.#t=new Array(e).fill(void 0),this.#a=new O(e),this.#u=new O(e),this.#l=0,this.#h=0,this.#b=W.create(e),this.#n=0,this.#_=0,typeof f=="function"&&(this.#w=f),typeof m=="function"&&(this.#C=m),typeof c=="function"?(this.#S=c,this.#r=[]):(this.#S=void 0,this.#r=void 0),this.#T=!!this.#w,this.#x=!!this.#C,this.#f=!!this.#S,this.noDisposeOnSet=!!d,this.noUpdateTTL=!!g,this.noDeleteOnFetchRejection=!!b,this.allowStaleOnFetchRejection=!!u,this.allowStaleOnFetchAbort=!!T,this.ignoreFetchAbort=!!F,this.maxEntrySize!==0){if(this.#c!==0&&!y(this.#c))throw new TypeError("maxSize must be a positive integer if specified");if(!y(this.maxEntrySize))throw new TypeError("maxEntrySize must be a positive integer if specified");this.#B()}if(this.allowStale=!!r,this.noDeleteOnStaleGet=!!S,this.updateAgeOnGet=!!n,this.updateAgeOnHas=!!o,this.ttlResolution=y(s)||s===0?s:1,this.ttlAutopurge=!!h,this.ttl=i||0,this.ttl){if(!y(this.ttl))throw new TypeError("ttl must be a positive integer if specified");this.#j()}if(this.#o===0&&this.ttl===0&&this.#c===0)throw new TypeError("At least one of max, maxSize, or ttl is required");if(!this.ttlAutopurge&&!this.#o&&!this.#c){let E="LRU_CACHE_UNBOUNDED";G(E)&&(I.add(E),x("TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.","UnboundedCacheWarning",E,a))}}getRemainingTTL(t){return this.#s.has(t)?1/0:0}#j(){let t=new z(this.#o),e=new z(this.#o);this.#d=t,this.#A=e;let i=this.ttlAutopurge?new Array(this.#o):void 0;this.#g=i,this.#N=(n,o,r=this.#m.now())=>{if(e[n]=o!==0?r:0,t[n]=o,i?.[n]&&(clearTimeout(i[n]),i[n]=void 0),o!==0&&i){let f=setTimeout(()=>{this.#p(n)&&this.#E(this.#i[n],"expire")},o+1);f.unref&&f.unref(),i[n]=f}},this.#R=n=>{e[n]=t[n]!==0?this.#m.now():0},this.#z=(n,o)=>{if(t[o]){let r=t[o],f=e[o];if(!r||!f)return;n.ttl=r,n.start=f,n.now=s||h();let m=n.now-f;n.remainingTTL=r-m}};let s=0,h=()=>{let n=this.#m.now();if(this.ttlResolution>0){s=n;let o=setTimeout(()=>s=0,this.ttlResolution);o.unref&&o.unref()}return n};this.getRemainingTTL=n=>{let o=this.#s.get(n);if(o===void 0)return 0;let r=t[o],f=e[o];if(!r||!f)return 1/0;let m=(s||h())-f;return r-m},this.#p=n=>{let o=e[n],r=t[n];return!!r&&!!o&&(s||h())-o>r}}#R=()=>{};#z=()=>{};#N=()=>{};#p=()=>!1;#B(){let t=new z(this.#o);this.#_=0,this.#y=t,this.#W=e=>{this.#_-=t[e],t[e]=0},this.#P=(e,i,s,h)=>{if(this.#e(i))return 0;if(!y(s))if(h){if(typeof h!="function")throw new TypeError("sizeCalculation must be a function");if(s=h(i,e),!y(s))throw new TypeError("sizeCalculation return invalid (expect positive integer)")}else throw new TypeError("invalid size value (must be positive integer). When maxSize or maxEntrySize is used, sizeCalculation or size must be set.");return s},this.#U=(e,i,s)=>{if(t[e]=i,this.#c){let h=this.#c-t[e];for(;this.#_>h;)this.#M(!0)}this.#_+=t[e],s&&(s.entrySize=i,s.totalCalculatedSize=this.#_)}}#W=t=>{};#U=(t,e,i)=>{};#P=(t,e,i,s)=>{if(i||s)throw new TypeError("cannot set size without setting maxSize or maxEntrySize on cache");return 0};*#F({allowStale:t=this.allowStale}={}){if(this.#n)for(let e=this.#h;!(!this.#H(e)||((t||!this.#p(e))&&(yield e),e===this.#l));)e=this.#u[e]}*#O({allowStale:t=this.allowStale}={}){if(this.#n)for(let e=this.#l;!(!this.#H(e)||((t||!this.#p(e))&&(yield e),e===this.#h));)e=this.#a[e]}#H(t){return t!==void 0&&this.#s.get(this.#i[t])===t}*entries(){for(let t of this.#F())this.#t[t]!==void 0&&this.#i[t]!==void 0&&!this.#e(this.#t[t])&&(yield[this.#i[t],this.#t[t]])}*rentries(){for(let t of this.#O())this.#t[t]!==void 0&&this.#i[t]!==void 0&&!this.#e(this.#t[t])&&(yield[this.#i[t],this.#t[t]])}*keys(){for(let t of this.#F()){let e=this.#i[t];e!==void 0&&!this.#e(this.#t[t])&&(yield e)}}*rkeys(){for(let t of this.#O()){let e=this.#i[t];e!==void 0&&!this.#e(this.#t[t])&&(yield e)}}*values(){for(let t of this.#F())this.#t[t]!==void 0&&!this.#e(this.#t[t])&&(yield this.#t[t])}*rvalues(){for(let t of this.#O())this.#t[t]!==void 0&&!this.#e(this.#t[t])&&(yield this.#t[t])}[Symbol.iterator](){return this.entries()}[Symbol.toStringTag]="LRUCache";find(t,e={}){for(let i of this.#F()){let s=this.#t[i],h=this.#e(s)?s.__staleWhileFetching:s;if(h!==void 0&&t(h,this.#i[i],this))return this.get(this.#i[i],e)}}forEach(t,e=this){for(let i of this.#F()){let s=this.#t[i],h=this.#e(s)?s.__staleWhileFetching:s;h!==void 0&&t.call(e,h,this.#i[i],this)}}rforEach(t,e=this){for(let i of this.#O()){let s=this.#t[i],h=this.#e(s)?s.__staleWhileFetching:s;h!==void 0&&t.call(e,h,this.#i[i],this)}}purgeStale(){let t=!1;for(let e of this.#O({allowStale:!0}))this.#p(e)&&(this.#E(this.#i[e],"expire"),t=!0);return t}info(t){let e=this.#s.get(t);if(e===void 0)return;let i=this.#t[e],s=this.#e(i)?i.__staleWhileFetching:i;if(s===void 0)return;let h={value:s};if(this.#d&&this.#A){let n=this.#d[e],o=this.#A[e];if(n&&o){let r=n-(this.#m.now()-o);h.ttl=r,h.start=Date.now()}}return this.#y&&(h.size=this.#y[e]),h}dump(){let t=[];for(let e of this.#F({allowStale:!0})){let i=this.#i[e],s=this.#t[e],h=this.#e(s)?s.__staleWhileFetching:s;if(h===void 0||i===void 0)continue;let n={value:h};if(this.#d&&this.#A){n.ttl=this.#d[e];let o=this.#m.now()-this.#A[e];n.start=Math.floor(Date.now()-o)}this.#y&&(n.size=this.#y[e]),t.unshift([i,n])}return t}load(t){this.clear();for(let[e,i]of t){if(i.start){let s=Date.now()-i.start;i.start=this.#m.now()-s}this.set(e,i.value,i)}}set(t,e,i={}){if(e===void 0)return this.delete(t),this;let{ttl:s=this.ttl,start:h,noDisposeOnSet:n=this.noDisposeOnSet,sizeCalculation:o=this.sizeCalculation,status:r}=i,{noUpdateTTL:f=this.noUpdateTTL}=i,m=this.#P(t,e,i.size||0,o);if(this.maxEntrySize&&m>this.maxEntrySize)return r&&(r.set="miss",r.maxEntrySizeExceeded=!0),this.#E(t,"set"),this;let c=this.#n===0?void 0:this.#s.get(t);if(c===void 0)c=this.#n===0?this.#h:this.#b.length!==0?this.#b.pop():this.#n===this.#o?this.#M(!1):this.#n,this.#i[c]=t,this.#t[c]=e,this.#s.set(t,c),this.#a[this.#h]=c,this.#u[c]=this.#h,this.#h=c,this.#n++,this.#U(c,m,r),r&&(r.set="add"),f=!1,this.#x&&this.#C?.(e,t,"add");else{this.#D(c);let d=this.#t[c];if(e!==d){if(this.#v&&this.#e(d)){d.__abortController.abort(new Error("replaced"));let{__staleWhileFetching:g}=d;g!==void 0&&!n&&(this.#T&&this.#w?.(g,t,"set"),this.#f&&this.#r?.push([g,t,"set"]))}else n||(this.#T&&this.#w?.(d,t,"set"),this.#f&&this.#r?.push([d,t,"set"]));if(this.#W(c),this.#U(c,m,r),this.#t[c]=e,r){r.set="replace";let g=d&&this.#e(d)?d.__staleWhileFetching:d;g!==void 0&&(r.oldValue=g)}}else r&&(r.set="update");this.#x&&this.onInsert?.(e,t,e===d?"update":"replace")}if(s!==0&&!this.#d&&this.#j(),this.#d&&(f||this.#N(c,s,h),r&&this.#z(r,c)),!n&&this.#f&&this.#r){let d=this.#r,g;for(;g=d?.shift();)this.#S?.(...g)}return this}pop(){try{for(;this.#n;){let t=this.#t[this.#l];if(this.#M(!0),this.#e(t)){if(t.__staleWhileFetching)return t.__staleWhileFetching}else if(t!==void 0)return t}}finally{if(this.#f&&this.#r){let t=this.#r,e;for(;e=t?.shift();)this.#S?.(...e)}}}#M(t){let e=this.#l,i=this.#i[e],s=this.#t[e];return this.#v&&this.#e(s)?s.__abortController.abort(new Error("evicted")):(this.#T||this.#f)&&(this.#T&&this.#w?.(s,i,"evict"),this.#f&&this.#r?.push([s,i,"evict"])),this.#W(e),this.#g?.[e]&&(clearTimeout(this.#g[e]),this.#g[e]=void 0),t&&(this.#i[e]=void 0,this.#t[e]=void 0,this.#b.push(e)),this.#n===1?(this.#l=this.#h=0,this.#b.length=0):this.#l=this.#a[e],this.#s.delete(i),this.#n--,e}has(t,e={}){let{updateAgeOnHas:i=this.updateAgeOnHas,status:s}=e,h=this.#s.get(t);if(h!==void 0){let n=this.#t[h];if(this.#e(n)&&n.__staleWhileFetching===void 0)return!1;if(this.#p(h))s&&(s.has="stale",this.#z(s,h));else return i&&this.#R(h),s&&(s.has="hit",this.#z(s,h)),!0}else s&&(s.has="miss");return!1}peek(t,e={}){let{allowStale:i=this.allowStale}=e,s=this.#s.get(t);if(s===void 0||!i&&this.#p(s))return;let h=this.#t[s];return this.#e(h)?h.__staleWhileFetching:h}#G(t,e,i,s){let h=e===void 0?void 0:this.#t[e];if(this.#e(h))return h;let n=new C,{signal:o}=i;o?.addEventListener("abort",()=>n.abort(o.reason),{signal:n.signal});let r={signal:n.signal,options:i,context:s},f=(p,_=!1)=>{let{aborted:l}=n.signal,w=i.ignoreFetchAbort&&p!==void 0,b=i.ignoreFetchAbort||!!(i.allowStaleOnFetchAbort&&p!==void 0);if(i.status&&(l&&!_?(i.status.fetchAborted=!0,i.status.fetchError=n.signal.reason,w&&(i.status.fetchAbortIgnored=!0)):i.status.fetchResolved=!0),l&&!w&&!_)return c(n.signal.reason,b);let S=g,u=this.#t[e];return(u===g||w&&_&&u===void 0)&&(p===void 0?S.__staleWhileFetching!==void 0?this.#t[e]=S.__staleWhileFetching:this.#E(t,"fetch"):(i.status&&(i.status.fetchUpdated=!0),this.set(t,p,r.options))),p},m=p=>(i.status&&(i.status.fetchRejected=!0,i.status.fetchError=p),c(p,!1)),c=(p,_)=>{let{aborted:l}=n.signal,w=l&&i.allowStaleOnFetchAbort,b=w||i.allowStaleOnFetchRejection,S=b||i.noDeleteOnFetchRejection,u=g;if(this.#t[e]===g&&(!S||!_&&u.__staleWhileFetching===void 0?this.#E(t,"fetch"):w||(this.#t[e]=u.__staleWhileFetching)),b)return i.status&&u.__staleWhileFetching!==void 0&&(i.status.returnedStale=!0),u.__staleWhileFetching;if(u.__returned===u)throw p},d=(p,_)=>{let l=this.#L?.(t,h,r);l&&l instanceof Promise&&l.then(w=>p(w===void 0?void 0:w),_),n.signal.addEventListener("abort",()=>{(!i.ignoreFetchAbort||i.allowStaleOnFetchAbort)&&(p(void 0),i.allowStaleOnFetchAbort&&(p=w=>f(w,!0)))})};i.status&&(i.status.fetchDispatched=!0);let g=new Promise(d).then(f,m),A=Object.assign(g,{__abortController:n,__staleWhileFetching:h,__returned:void 0});return e===void 0?(this.set(t,A,{...r.options,status:void 0}),e=this.#s.get(t)):this.#t[e]=A,A}#e(t){if(!this.#v)return!1;let e=t;return!!e&&e instanceof Promise&&e.hasOwnProperty("__staleWhileFetching")&&e.__abortController instanceof C}async fetch(t,e={}){let{allowStale:i=this.allowStale,updateAgeOnGet:s=this.updateAgeOnGet,noDeleteOnStaleGet:h=this.noDeleteOnStaleGet,ttl:n=this.ttl,noDisposeOnSet:o=this.noDisposeOnSet,size:r=0,sizeCalculation:f=this.sizeCalculation,noUpdateTTL:m=this.noUpdateTTL,noDeleteOnFetchRejection:c=this.noDeleteOnFetchRejection,allowStaleOnFetchRejection:d=this.allowStaleOnFetchRejection,ignoreFetchAbort:g=this.ignoreFetchAbort,allowStaleOnFetchAbort:A=this.allowStaleOnFetchAbort,context:p,forceRefresh:_=!1,status:l,signal:w}=e;if(!this.#v)return l&&(l.fetch="get"),this.get(t,{allowStale:i,updateAgeOnGet:s,noDeleteOnStaleGet:h,status:l});let b={allowStale:i,updateAgeOnGet:s,noDeleteOnStaleGet:h,ttl:n,noDisposeOnSet:o,size:r,sizeCalculation:f,noUpdateTTL:m,noDeleteOnFetchRejection:c,allowStaleOnFetchRejection:d,allowStaleOnFetchAbort:A,ignoreFetchAbort:g,status:l,signal:w},S=this.#s.get(t);if(S===void 0){l&&(l.fetch="miss");let u=this.#G(t,S,b,p);return u.__returned=u}else{let u=this.#t[S];if(this.#e(u)){let E=i&&u.__staleWhileFetching!==void 0;return l&&(l.fetch="inflight",E&&(l.returnedStale=!0)),E?u.__staleWhileFetching:u.__returned=u}let T=this.#p(S);if(!_&&!T)return l&&(l.fetch="hit"),this.#D(S),s&&this.#R(S),l&&this.#z(l,S),u;let F=this.#G(t,S,b,p),O=F.__staleWhileFetching!==void 0&&i;return l&&(l.fetch=T?"stale":"refresh",O&&T&&(l.returnedStale=!0)),O?F.__staleWhileFetching:F.__returned=F}}async forceFetch(t,e={}){let i=await this.fetch(t,e);if(i===void 0)throw new Error("fetch() returned undefined");return i}memo(t,e={}){let i=this.#I;if(!i)throw new Error("no memoMethod provided to constructor");let{context:s,forceRefresh:h,...n}=e,o=this.get(t,n);if(!h&&o!==void 0)return o;let r=i(t,o,{options:n,context:s});return this.set(t,r,n),r}get(t,e={}){let{allowStale:i=this.allowStale,updateAgeOnGet:s=this.updateAgeOnGet,noDeleteOnStaleGet:h=this.noDeleteOnStaleGet,status:n}=e,o=this.#s.get(t);if(o!==void 0){let r=this.#t[o],f=this.#e(r);return n&&this.#z(n,o),this.#p(o)?(n&&(n.get="stale"),f?(n&&i&&r.__staleWhileFetching!==void 0&&(n.returnedStale=!0),i?r.__staleWhileFetching:void 0):(h||this.#E(t,"expire"),n&&i&&(n.returnedStale=!0),i?r:void 0)):(n&&(n.get="hit"),f?r.__staleWhileFetching:(this.#D(o),s&&this.#R(o),r))}else n&&(n.get="miss")}#k(t,e){this.#u[e]=t,this.#a[t]=e}#D(t){t!==this.#h&&(t===this.#l?this.#l=this.#a[t]:this.#k(this.#u[t],this.#a[t]),this.#k(this.#h,t),this.#h=t)}delete(t){return this.#E(t,"delete")}#E(t,e){let i=!1;if(this.#n!==0){let s=this.#s.get(t);if(s!==void 0)if(this.#g?.[s]&&(clearTimeout(this.#g?.[s]),this.#g[s]=void 0),i=!0,this.#n===1)this.#V(e);else{this.#W(s);let h=this.#t[s];if(this.#e(h)?h.__abortController.abort(new Error("deleted")):(this.#T||this.#f)&&(this.#T&&this.#w?.(h,t,e),this.#f&&this.#r?.push([h,t,e])),this.#s.delete(t),this.#i[s]=void 0,this.#t[s]=void 0,s===this.#h)this.#h=this.#u[s];else if(s===this.#l)this.#l=this.#a[s];else{let n=this.#u[s];this.#a[n]=this.#a[s];let o=this.#a[s];this.#u[o]=this.#u[s]}this.#n--,this.#b.push(s)}}if(this.#f&&this.#r?.length){let s=this.#r,h;for(;h=s?.shift();)this.#S?.(...h)}return i}clear(){return this.#V("delete")}#V(t){for(let e of this.#O({allowStale:!0})){let i=this.#t[e];if(this.#e(i))i.__abortController.abort(new Error("deleted"));else{let s=this.#i[e];this.#T&&this.#w?.(i,s,t),this.#f&&this.#r?.push([i,s,t])}}if(this.#s.clear(),this.#t.fill(void 0),this.#i.fill(void 0),this.#d&&this.#A){this.#d.fill(0),this.#A.fill(0);for(let e of this.#g??[])e!==void 0&&clearTimeout(e);this.#g?.fill(void 0)}if(this.#y&&this.#y.fill(0),this.#l=0,this.#h=0,this.#b.length=0,this.#_=0,this.#n=0,this.#f&&this.#r){let e=this.#r,i;for(;i=e?.shift();)this.#S?.(...i)}}};export{L as LRUCache}; +var x=typeof performance=="object"&&performance&&typeof performance.now=="function"?performance:Date,I=new Set,R=typeof process=="object"&&process?process:{},U=(c,t,e,i)=>{typeof R.emitWarning=="function"?R.emitWarning(c,t,e,i):console.error(`[${e}] ${t}: ${c}`)},C=globalThis.AbortController,D=globalThis.AbortSignal;if(typeof C>"u"){D=class{onabort;_onabort=[];reason;aborted=!1;addEventListener(i,s){this._onabort.push(s)}},C=class{constructor(){t()}signal=new D;abort(i){if(!this.signal.aborted){this.signal.reason=i,this.signal.aborted=!0;for(let s of this.signal._onabort)s(i);this.signal.onabort?.(i)}}};let c=R.env?.LRU_CACHE_IGNORE_AC_WARNING!=="1",t=()=>{c&&(c=!1,U("AbortController is not defined. If using lru-cache in node 14, load an AbortController polyfill from the `node-abort-controller` package. A minimal polyfill is provided for use by LRUCache.fetch(), but it should not be relied upon in other contexts (eg, passing it to other APIs that use AbortController/AbortSignal might have undesirable effects). You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.","NO_ABORT_CONTROLLER","ENOTSUP",t))}}var G=c=>!I.has(c),H=Symbol("type"),y=c=>c&&c===Math.floor(c)&&c>0&&isFinite(c),M=c=>y(c)?c<=Math.pow(2,8)?Uint8Array:c<=Math.pow(2,16)?Uint16Array:c<=Math.pow(2,32)?Uint32Array:c<=Number.MAX_SAFE_INTEGER?z:null:null,z=class extends Array{constructor(t){super(t),this.fill(0)}},W=class c{heap;length;static#o=!1;static create(t){let e=M(t);if(!e)return[];c.#o=!0;let i=new c(t,e);return c.#o=!1,i}constructor(t,e){if(!c.#o)throw new TypeError("instantiate Stack using Stack.create(n)");this.heap=new e(t),this.length=0}push(t){this.heap[this.length++]=t}pop(){return this.heap[--this.length]}},L=class c{#o;#c;#w;#C;#S;#L;#I;#m;get perf(){return this.#m}ttl;ttlResolution;ttlAutopurge;updateAgeOnGet;updateAgeOnHas;allowStale;noDisposeOnSet;noUpdateTTL;maxEntrySize;sizeCalculation;noDeleteOnFetchRejection;noDeleteOnStaleGet;allowStaleOnFetchAbort;allowStaleOnFetchRejection;ignoreFetchAbort;#n;#_;#s;#i;#t;#a;#u;#l;#h;#b;#r;#y;#A;#d;#g;#T;#v;#f;#U;static unsafeExposeInternals(t){return{starts:t.#A,ttls:t.#d,autopurgeTimers:t.#g,sizes:t.#y,keyMap:t.#s,keyList:t.#i,valList:t.#t,next:t.#a,prev:t.#u,get head(){return t.#l},get tail(){return t.#h},free:t.#b,isBackgroundFetch:e=>t.#e(e),backgroundFetch:(e,i,s,n)=>t.#G(e,i,s,n),moveToTail:e=>t.#D(e),indexes:e=>t.#F(e),rindexes:e=>t.#O(e),isStale:e=>t.#p(e)}}get max(){return this.#o}get maxSize(){return this.#c}get calculatedSize(){return this.#_}get size(){return this.#n}get fetchMethod(){return this.#L}get memoMethod(){return this.#I}get dispose(){return this.#w}get onInsert(){return this.#C}get disposeAfter(){return this.#S}constructor(t){let{max:e=0,ttl:i,ttlResolution:s=1,ttlAutopurge:n,updateAgeOnGet:o,updateAgeOnHas:h,allowStale:r,dispose:a,onInsert:w,disposeAfter:f,noDisposeOnSet:d,noUpdateTTL:g,maxSize:A=0,maxEntrySize:p=0,sizeCalculation:_,fetchMethod:l,memoMethod:S,noDeleteOnFetchRejection:b,noDeleteOnStaleGet:m,allowStaleOnFetchRejection:u,allowStaleOnFetchAbort:T,ignoreFetchAbort:F,perf:v}=t;if(v!==void 0&&typeof v?.now!="function")throw new TypeError("perf option must have a now() method if specified");if(this.#m=v??x,e!==0&&!y(e))throw new TypeError("max option must be a nonnegative integer");let O=e?M(e):Array;if(!O)throw new Error("invalid max value: "+e);if(this.#o=e,this.#c=A,this.maxEntrySize=p||this.#c,this.sizeCalculation=_,this.sizeCalculation){if(!this.#c&&!this.maxEntrySize)throw new TypeError("cannot set sizeCalculation without setting maxSize or maxEntrySize");if(typeof this.sizeCalculation!="function")throw new TypeError("sizeCalculation set to non-function")}if(S!==void 0&&typeof S!="function")throw new TypeError("memoMethod must be a function if defined");if(this.#I=S,l!==void 0&&typeof l!="function")throw new TypeError("fetchMethod must be a function if specified");if(this.#L=l,this.#v=!!l,this.#s=new Map,this.#i=new Array(e).fill(void 0),this.#t=new Array(e).fill(void 0),this.#a=new O(e),this.#u=new O(e),this.#l=0,this.#h=0,this.#b=W.create(e),this.#n=0,this.#_=0,typeof a=="function"&&(this.#w=a),typeof w=="function"&&(this.#C=w),typeof f=="function"?(this.#S=f,this.#r=[]):(this.#S=void 0,this.#r=void 0),this.#T=!!this.#w,this.#U=!!this.#C,this.#f=!!this.#S,this.noDisposeOnSet=!!d,this.noUpdateTTL=!!g,this.noDeleteOnFetchRejection=!!b,this.allowStaleOnFetchRejection=!!u,this.allowStaleOnFetchAbort=!!T,this.ignoreFetchAbort=!!F,this.maxEntrySize!==0){if(this.#c!==0&&!y(this.#c))throw new TypeError("maxSize must be a positive integer if specified");if(!y(this.maxEntrySize))throw new TypeError("maxEntrySize must be a positive integer if specified");this.#B()}if(this.allowStale=!!r,this.noDeleteOnStaleGet=!!m,this.updateAgeOnGet=!!o,this.updateAgeOnHas=!!h,this.ttlResolution=y(s)||s===0?s:1,this.ttlAutopurge=!!n,this.ttl=i||0,this.ttl){if(!y(this.ttl))throw new TypeError("ttl must be a positive integer if specified");this.#j()}if(this.#o===0&&this.ttl===0&&this.#c===0)throw new TypeError("At least one of max, maxSize, or ttl is required");if(!this.ttlAutopurge&&!this.#o&&!this.#c){let E="LRU_CACHE_UNBOUNDED";G(E)&&(I.add(E),U("TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.","UnboundedCacheWarning",E,c))}}getRemainingTTL(t){return this.#s.has(t)?1/0:0}#j(){let t=new z(this.#o),e=new z(this.#o);this.#d=t,this.#A=e;let i=this.ttlAutopurge?new Array(this.#o):void 0;this.#g=i,this.#N=(h,r,a=this.#m.now())=>{e[h]=r!==0?a:0,t[h]=r,s(h,r)},this.#R=h=>{e[h]=t[h]!==0?this.#m.now():0,s(h,t[h])};let s=this.ttlAutopurge?(h,r)=>{if(i?.[h]&&(clearTimeout(i[h]),i[h]=void 0),r&&r!==0&&i){let a=setTimeout(()=>{this.#p(h)&&this.#E(this.#i[h],"expire")},r+1);a.unref&&a.unref(),i[h]=a}}:()=>{};this.#z=(h,r)=>{if(t[r]){let a=t[r],w=e[r];if(!a||!w)return;h.ttl=a,h.start=w,h.now=n||o();let f=h.now-w;h.remainingTTL=a-f}};let n=0,o=()=>{let h=this.#m.now();if(this.ttlResolution>0){n=h;let r=setTimeout(()=>n=0,this.ttlResolution);r.unref&&r.unref()}return h};this.getRemainingTTL=h=>{let r=this.#s.get(h);if(r===void 0)return 0;let a=t[r],w=e[r];if(!a||!w)return 1/0;let f=(n||o())-w;return a-f},this.#p=h=>{let r=e[h],a=t[h];return!!a&&!!r&&(n||o())-r>a}}#R=()=>{};#z=()=>{};#N=()=>{};#p=()=>!1;#B(){let t=new z(this.#o);this.#_=0,this.#y=t,this.#W=e=>{this.#_-=t[e],t[e]=0},this.#P=(e,i,s,n)=>{if(this.#e(i))return 0;if(!y(s))if(n){if(typeof n!="function")throw new TypeError("sizeCalculation must be a function");if(s=n(i,e),!y(s))throw new TypeError("sizeCalculation return invalid (expect positive integer)")}else throw new TypeError("invalid size value (must be positive integer). When maxSize or maxEntrySize is used, sizeCalculation or size must be set.");return s},this.#M=(e,i,s)=>{if(t[e]=i,this.#c){let n=this.#c-t[e];for(;this.#_>n;)this.#x(!0)}this.#_+=t[e],s&&(s.entrySize=i,s.totalCalculatedSize=this.#_)}}#W=t=>{};#M=(t,e,i)=>{};#P=(t,e,i,s)=>{if(i||s)throw new TypeError("cannot set size without setting maxSize or maxEntrySize on cache");return 0};*#F({allowStale:t=this.allowStale}={}){if(this.#n)for(let e=this.#h;!(!this.#H(e)||((t||!this.#p(e))&&(yield e),e===this.#l));)e=this.#u[e]}*#O({allowStale:t=this.allowStale}={}){if(this.#n)for(let e=this.#l;!(!this.#H(e)||((t||!this.#p(e))&&(yield e),e===this.#h));)e=this.#a[e]}#H(t){return t!==void 0&&this.#s.get(this.#i[t])===t}*entries(){for(let t of this.#F())this.#t[t]!==void 0&&this.#i[t]!==void 0&&!this.#e(this.#t[t])&&(yield[this.#i[t],this.#t[t]])}*rentries(){for(let t of this.#O())this.#t[t]!==void 0&&this.#i[t]!==void 0&&!this.#e(this.#t[t])&&(yield[this.#i[t],this.#t[t]])}*keys(){for(let t of this.#F()){let e=this.#i[t];e!==void 0&&!this.#e(this.#t[t])&&(yield e)}}*rkeys(){for(let t of this.#O()){let e=this.#i[t];e!==void 0&&!this.#e(this.#t[t])&&(yield e)}}*values(){for(let t of this.#F())this.#t[t]!==void 0&&!this.#e(this.#t[t])&&(yield this.#t[t])}*rvalues(){for(let t of this.#O())this.#t[t]!==void 0&&!this.#e(this.#t[t])&&(yield this.#t[t])}[Symbol.iterator](){return this.entries()}[Symbol.toStringTag]="LRUCache";find(t,e={}){for(let i of this.#F()){let s=this.#t[i],n=this.#e(s)?s.__staleWhileFetching:s;if(n!==void 0&&t(n,this.#i[i],this))return this.get(this.#i[i],e)}}forEach(t,e=this){for(let i of this.#F()){let s=this.#t[i],n=this.#e(s)?s.__staleWhileFetching:s;n!==void 0&&t.call(e,n,this.#i[i],this)}}rforEach(t,e=this){for(let i of this.#O()){let s=this.#t[i],n=this.#e(s)?s.__staleWhileFetching:s;n!==void 0&&t.call(e,n,this.#i[i],this)}}purgeStale(){let t=!1;for(let e of this.#O({allowStale:!0}))this.#p(e)&&(this.#E(this.#i[e],"expire"),t=!0);return t}info(t){let e=this.#s.get(t);if(e===void 0)return;let i=this.#t[e],s=this.#e(i)?i.__staleWhileFetching:i;if(s===void 0)return;let n={value:s};if(this.#d&&this.#A){let o=this.#d[e],h=this.#A[e];if(o&&h){let r=o-(this.#m.now()-h);n.ttl=r,n.start=Date.now()}}return this.#y&&(n.size=this.#y[e]),n}dump(){let t=[];for(let e of this.#F({allowStale:!0})){let i=this.#i[e],s=this.#t[e],n=this.#e(s)?s.__staleWhileFetching:s;if(n===void 0||i===void 0)continue;let o={value:n};if(this.#d&&this.#A){o.ttl=this.#d[e];let h=this.#m.now()-this.#A[e];o.start=Math.floor(Date.now()-h)}this.#y&&(o.size=this.#y[e]),t.unshift([i,o])}return t}load(t){this.clear();for(let[e,i]of t){if(i.start){let s=Date.now()-i.start;i.start=this.#m.now()-s}this.set(e,i.value,i)}}set(t,e,i={}){if(e===void 0)return this.delete(t),this;let{ttl:s=this.ttl,start:n,noDisposeOnSet:o=this.noDisposeOnSet,sizeCalculation:h=this.sizeCalculation,status:r}=i,{noUpdateTTL:a=this.noUpdateTTL}=i,w=this.#P(t,e,i.size||0,h);if(this.maxEntrySize&&w>this.maxEntrySize)return r&&(r.set="miss",r.maxEntrySizeExceeded=!0),this.#E(t,"set"),this;let f=this.#n===0?void 0:this.#s.get(t);if(f===void 0)f=this.#n===0?this.#h:this.#b.length!==0?this.#b.pop():this.#n===this.#o?this.#x(!1):this.#n,this.#i[f]=t,this.#t[f]=e,this.#s.set(t,f),this.#a[this.#h]=f,this.#u[f]=this.#h,this.#h=f,this.#n++,this.#M(f,w,r),r&&(r.set="add"),a=!1,this.#U&&this.#C?.(e,t,"add");else{this.#D(f);let d=this.#t[f];if(e!==d){if(this.#v&&this.#e(d)){d.__abortController.abort(new Error("replaced"));let{__staleWhileFetching:g}=d;g!==void 0&&!o&&(this.#T&&this.#w?.(g,t,"set"),this.#f&&this.#r?.push([g,t,"set"]))}else o||(this.#T&&this.#w?.(d,t,"set"),this.#f&&this.#r?.push([d,t,"set"]));if(this.#W(f),this.#M(f,w,r),this.#t[f]=e,r){r.set="replace";let g=d&&this.#e(d)?d.__staleWhileFetching:d;g!==void 0&&(r.oldValue=g)}}else r&&(r.set="update");this.#U&&this.onInsert?.(e,t,e===d?"update":"replace")}if(s!==0&&!this.#d&&this.#j(),this.#d&&(a||this.#N(f,s,n),r&&this.#z(r,f)),!o&&this.#f&&this.#r){let d=this.#r,g;for(;g=d?.shift();)this.#S?.(...g)}return this}pop(){try{for(;this.#n;){let t=this.#t[this.#l];if(this.#x(!0),this.#e(t)){if(t.__staleWhileFetching)return t.__staleWhileFetching}else if(t!==void 0)return t}}finally{if(this.#f&&this.#r){let t=this.#r,e;for(;e=t?.shift();)this.#S?.(...e)}}}#x(t){let e=this.#l,i=this.#i[e],s=this.#t[e];return this.#v&&this.#e(s)?s.__abortController.abort(new Error("evicted")):(this.#T||this.#f)&&(this.#T&&this.#w?.(s,i,"evict"),this.#f&&this.#r?.push([s,i,"evict"])),this.#W(e),this.#g?.[e]&&(clearTimeout(this.#g[e]),this.#g[e]=void 0),t&&(this.#i[e]=void 0,this.#t[e]=void 0,this.#b.push(e)),this.#n===1?(this.#l=this.#h=0,this.#b.length=0):this.#l=this.#a[e],this.#s.delete(i),this.#n--,e}has(t,e={}){let{updateAgeOnHas:i=this.updateAgeOnHas,status:s}=e,n=this.#s.get(t);if(n!==void 0){let o=this.#t[n];if(this.#e(o)&&o.__staleWhileFetching===void 0)return!1;if(this.#p(n))s&&(s.has="stale",this.#z(s,n));else return i&&this.#R(n),s&&(s.has="hit",this.#z(s,n)),!0}else s&&(s.has="miss");return!1}peek(t,e={}){let{allowStale:i=this.allowStale}=e,s=this.#s.get(t);if(s===void 0||!i&&this.#p(s))return;let n=this.#t[s];return this.#e(n)?n.__staleWhileFetching:n}#G(t,e,i,s){let n=e===void 0?void 0:this.#t[e];if(this.#e(n))return n;let o=new C,{signal:h}=i;h?.addEventListener("abort",()=>o.abort(h.reason),{signal:o.signal});let r={signal:o.signal,options:i,context:s},a=(p,_=!1)=>{let{aborted:l}=o.signal,S=i.ignoreFetchAbort&&p!==void 0,b=i.ignoreFetchAbort||!!(i.allowStaleOnFetchAbort&&p!==void 0);if(i.status&&(l&&!_?(i.status.fetchAborted=!0,i.status.fetchError=o.signal.reason,S&&(i.status.fetchAbortIgnored=!0)):i.status.fetchResolved=!0),l&&!S&&!_)return f(o.signal.reason,b);let m=g,u=this.#t[e];return(u===g||S&&_&&u===void 0)&&(p===void 0?m.__staleWhileFetching!==void 0?this.#t[e]=m.__staleWhileFetching:this.#E(t,"fetch"):(i.status&&(i.status.fetchUpdated=!0),this.set(t,p,r.options))),p},w=p=>(i.status&&(i.status.fetchRejected=!0,i.status.fetchError=p),f(p,!1)),f=(p,_)=>{let{aborted:l}=o.signal,S=l&&i.allowStaleOnFetchAbort,b=S||i.allowStaleOnFetchRejection,m=b||i.noDeleteOnFetchRejection,u=g;if(this.#t[e]===g&&(!m||!_&&u.__staleWhileFetching===void 0?this.#E(t,"fetch"):S||(this.#t[e]=u.__staleWhileFetching)),b)return i.status&&u.__staleWhileFetching!==void 0&&(i.status.returnedStale=!0),u.__staleWhileFetching;if(u.__returned===u)throw p},d=(p,_)=>{let l=this.#L?.(t,n,r);l&&l instanceof Promise&&l.then(S=>p(S===void 0?void 0:S),_),o.signal.addEventListener("abort",()=>{(!i.ignoreFetchAbort||i.allowStaleOnFetchAbort)&&(p(void 0),i.allowStaleOnFetchAbort&&(p=S=>a(S,!0)))})};i.status&&(i.status.fetchDispatched=!0);let g=new Promise(d).then(a,w),A=Object.assign(g,{__abortController:o,__staleWhileFetching:n,__returned:void 0});return e===void 0?(this.set(t,A,{...r.options,status:void 0}),e=this.#s.get(t)):this.#t[e]=A,A}#e(t){if(!this.#v)return!1;let e=t;return!!e&&e instanceof Promise&&e.hasOwnProperty("__staleWhileFetching")&&e.__abortController instanceof C}async fetch(t,e={}){let{allowStale:i=this.allowStale,updateAgeOnGet:s=this.updateAgeOnGet,noDeleteOnStaleGet:n=this.noDeleteOnStaleGet,ttl:o=this.ttl,noDisposeOnSet:h=this.noDisposeOnSet,size:r=0,sizeCalculation:a=this.sizeCalculation,noUpdateTTL:w=this.noUpdateTTL,noDeleteOnFetchRejection:f=this.noDeleteOnFetchRejection,allowStaleOnFetchRejection:d=this.allowStaleOnFetchRejection,ignoreFetchAbort:g=this.ignoreFetchAbort,allowStaleOnFetchAbort:A=this.allowStaleOnFetchAbort,context:p,forceRefresh:_=!1,status:l,signal:S}=e;if(!this.#v)return l&&(l.fetch="get"),this.get(t,{allowStale:i,updateAgeOnGet:s,noDeleteOnStaleGet:n,status:l});let b={allowStale:i,updateAgeOnGet:s,noDeleteOnStaleGet:n,ttl:o,noDisposeOnSet:h,size:r,sizeCalculation:a,noUpdateTTL:w,noDeleteOnFetchRejection:f,allowStaleOnFetchRejection:d,allowStaleOnFetchAbort:A,ignoreFetchAbort:g,status:l,signal:S},m=this.#s.get(t);if(m===void 0){l&&(l.fetch="miss");let u=this.#G(t,m,b,p);return u.__returned=u}else{let u=this.#t[m];if(this.#e(u)){let E=i&&u.__staleWhileFetching!==void 0;return l&&(l.fetch="inflight",E&&(l.returnedStale=!0)),E?u.__staleWhileFetching:u.__returned=u}let T=this.#p(m);if(!_&&!T)return l&&(l.fetch="hit"),this.#D(m),s&&this.#R(m),l&&this.#z(l,m),u;let F=this.#G(t,m,b,p),O=F.__staleWhileFetching!==void 0&&i;return l&&(l.fetch=T?"stale":"refresh",O&&T&&(l.returnedStale=!0)),O?F.__staleWhileFetching:F.__returned=F}}async forceFetch(t,e={}){let i=await this.fetch(t,e);if(i===void 0)throw new Error("fetch() returned undefined");return i}memo(t,e={}){let i=this.#I;if(!i)throw new Error("no memoMethod provided to constructor");let{context:s,forceRefresh:n,...o}=e,h=this.get(t,o);if(!n&&h!==void 0)return h;let r=i(t,h,{options:o,context:s});return this.set(t,r,o),r}get(t,e={}){let{allowStale:i=this.allowStale,updateAgeOnGet:s=this.updateAgeOnGet,noDeleteOnStaleGet:n=this.noDeleteOnStaleGet,status:o}=e,h=this.#s.get(t);if(h!==void 0){let r=this.#t[h],a=this.#e(r);return o&&this.#z(o,h),this.#p(h)?(o&&(o.get="stale"),a?(o&&i&&r.__staleWhileFetching!==void 0&&(o.returnedStale=!0),i?r.__staleWhileFetching:void 0):(n||this.#E(t,"expire"),o&&i&&(o.returnedStale=!0),i?r:void 0)):(o&&(o.get="hit"),a?r.__staleWhileFetching:(this.#D(h),s&&this.#R(h),r))}else o&&(o.get="miss")}#k(t,e){this.#u[e]=t,this.#a[t]=e}#D(t){t!==this.#h&&(t===this.#l?this.#l=this.#a[t]:this.#k(this.#u[t],this.#a[t]),this.#k(this.#h,t),this.#h=t)}delete(t){return this.#E(t,"delete")}#E(t,e){let i=!1;if(this.#n!==0){let s=this.#s.get(t);if(s!==void 0)if(this.#g?.[s]&&(clearTimeout(this.#g?.[s]),this.#g[s]=void 0),i=!0,this.#n===1)this.#V(e);else{this.#W(s);let n=this.#t[s];if(this.#e(n)?n.__abortController.abort(new Error("deleted")):(this.#T||this.#f)&&(this.#T&&this.#w?.(n,t,e),this.#f&&this.#r?.push([n,t,e])),this.#s.delete(t),this.#i[s]=void 0,this.#t[s]=void 0,s===this.#h)this.#h=this.#u[s];else if(s===this.#l)this.#l=this.#a[s];else{let o=this.#u[s];this.#a[o]=this.#a[s];let h=this.#a[s];this.#u[h]=this.#u[s]}this.#n--,this.#b.push(s)}}if(this.#f&&this.#r?.length){let s=this.#r,n;for(;n=s?.shift();)this.#S?.(...n)}return i}clear(){return this.#V("delete")}#V(t){for(let e of this.#O({allowStale:!0})){let i=this.#t[e];if(this.#e(i))i.__abortController.abort(new Error("deleted"));else{let s=this.#i[e];this.#T&&this.#w?.(i,s,t),this.#f&&this.#r?.push([i,s,t])}}if(this.#s.clear(),this.#t.fill(void 0),this.#i.fill(void 0),this.#d&&this.#A){this.#d.fill(0),this.#A.fill(0);for(let e of this.#g??[])e!==void 0&&clearTimeout(e);this.#g?.fill(void 0)}if(this.#y&&this.#y.fill(0),this.#l=0,this.#h=0,this.#b.length=0,this.#_=0,this.#n=0,this.#f&&this.#r){let e=this.#r,i;for(;i=e?.shift();)this.#S?.(...i)}}};export{L as LRUCache}; //# sourceMappingURL=index.min.js.map diff --git a/deps/npm/node_modules/lru-cache/package.json b/deps/npm/node_modules/lru-cache/package.json index 1554184f053da4..aac56efd1920ed 100644 --- a/deps/npm/node_modules/lru-cache/package.json +++ b/deps/npm/node_modules/lru-cache/package.json @@ -1,7 +1,7 @@ { "name": "lru-cache", "description": "A cache object that deletes the least-recently-used items.", - "version": "11.2.6", + "version": "11.2.7", "author": "Isaac Z. Schlueter <i@izs.me>", "keywords": [ "mru", @@ -66,14 +66,6 @@ "engines": { "node": "20 || >=22" }, - "tap": { - "node-arg": [ - "--expose-gc" - ], - "plugin": [ - "@tapjs/clock" - ] - }, "exports": { "./raw": { "import": { diff --git a/deps/npm/node_modules/make-fetch-happen/lib/remote.js b/deps/npm/node_modules/make-fetch-happen/lib/remote.js index 5dd17c58b28a22..061759638f05cb 100644 --- a/deps/npm/node_modules/make-fetch-happen/lib/remote.js +++ b/deps/npm/node_modules/make-fetch-happen/lib/remote.js @@ -3,6 +3,7 @@ const fetch = require('minipass-fetch') const { promiseRetry } = require('@gar/promise-retry') const ssri = require('ssri') const { log } = require('proc-log') +const { redact: cleanUrl } = require('@npmcli/redact') const CachingMinipassPipeline = require('./pipeline.js') const { getAgent } = require('@npmcli/agent') @@ -55,6 +56,7 @@ const remoteFetch = (request, options) => { return promiseRetry(async (retryHandler, attemptNum) => { const req = new fetch.Request(request, _opts) + const url = cleanUrl(req.url) try { let res = await fetch(req, _opts) if (_opts.integrity && res.status === 200) { @@ -92,7 +94,7 @@ const remoteFetch = (request, options) => { } /* eslint-disable-next-line max-len */ - log.http('fetch', `${req.method} ${req.url} attempt ${attemptNum} failed with ${res.status}`) + log.http('fetch', `${req.method} ${url} attempt ${attemptNum} failed with ${res.status}`) return retryHandler(res) } @@ -116,7 +118,7 @@ const remoteFetch = (request, options) => { options.onRetry(err) } - log.http('fetch', `${req.method} ${req.url} attempt ${attemptNum} failed with ${err.code}`) + log.http('fetch', `${req.method} ${url} attempt ${attemptNum} failed with ${err.code}`) return retryHandler(err) } }, options.retry).catch((err) => { diff --git a/deps/npm/node_modules/make-fetch-happen/package.json b/deps/npm/node_modules/make-fetch-happen/package.json index 5090b5042756fe..1d06ac4889c3e3 100644 --- a/deps/npm/node_modules/make-fetch-happen/package.json +++ b/deps/npm/node_modules/make-fetch-happen/package.json @@ -1,6 +1,6 @@ { "name": "make-fetch-happen", - "version": "15.0.4", + "version": "15.0.5", "description": "Opinionated, caching, retrying fetch client", "main": "lib/index.js", "files": [ @@ -35,6 +35,7 @@ "dependencies": { "@gar/promise-retry": "^1.0.0", "@npmcli/agent": "^4.0.0", + "@npmcli/redact": "^4.0.0", "cacache": "^20.0.1", "http-cache-semantics": "^4.1.1", "minipass": "^7.0.2", diff --git a/deps/npm/node_modules/minimatch/dist/commonjs/ast.js b/deps/npm/node_modules/minimatch/dist/commonjs/ast.js index 909b2daa0517dc..682be214093f9b 100644 --- a/deps/npm/node_modules/minimatch/dist/commonjs/ast.js +++ b/deps/npm/node_modules/minimatch/dist/commonjs/ast.js @@ -1,11 +1,113 @@ "use strict"; // parse a single path portion +var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.AST = void 0; const brace_expressions_js_1 = require("./brace-expressions.js"); const unescape_js_1 = require("./unescape.js"); const types = new Set(['!', '?', '+', '*', '@']); const isExtglobType = (c) => types.has(c); +const isExtglobAST = (c) => isExtglobType(c.type); +// Map of which extglob types can adopt the children of a nested extglob +// +// anything but ! can adopt a matching type: +// +(a|+(b|c)|d) => +(a|b|c|d) +// *(a|*(b|c)|d) => *(a|b|c|d) +// @(a|@(b|c)|d) => @(a|b|c|d) +// ?(a|?(b|c)|d) => ?(a|b|c|d) +// +// * can adopt anything, because 0 or repetition is allowed +// *(a|?(b|c)|d) => *(a|b|c|d) +// *(a|+(b|c)|d) => *(a|b|c|d) +// *(a|@(b|c)|d) => *(a|b|c|d) +// +// + can adopt @, because 1 or repetition is allowed +// +(a|@(b|c)|d) => +(a|b|c|d) +// +// + and @ CANNOT adopt *, because 0 would be allowed +// +(a|*(b|c)|d) => would match "", on *(b|c) +// @(a|*(b|c)|d) => would match "", on *(b|c) +// +// + and @ CANNOT adopt ?, because 0 would be allowed +// +(a|?(b|c)|d) => would match "", on ?(b|c) +// @(a|?(b|c)|d) => would match "", on ?(b|c) +// +// ? can adopt @, because 0 or 1 is allowed +// ?(a|@(b|c)|d) => ?(a|b|c|d) +// +// ? and @ CANNOT adopt * or +, because >1 would be allowed +// ?(a|*(b|c)|d) => would match bbb on *(b|c) +// @(a|*(b|c)|d) => would match bbb on *(b|c) +// ?(a|+(b|c)|d) => would match bbb on +(b|c) +// @(a|+(b|c)|d) => would match bbb on +(b|c) +// +// ! CANNOT adopt ! (nothing else can either) +// !(a|!(b|c)|d) => !(a|b|c|d) would fail to match on b (not not b|c) +// +// ! can adopt @ +// !(a|@(b|c)|d) => !(a|b|c|d) +// +// ! CANNOT adopt * +// !(a|*(b|c)|d) => !(a|b|c|d) would match on bbb, not allowed +// +// ! CANNOT adopt + +// !(a|+(b|c)|d) => !(a|b|c|d) would match on bbb, not allowed +// +// ! CANNOT adopt ? +// x!(a|?(b|c)|d) => x!(a|b|c|d) would fail to match "x" +const adoptionMap = new Map([ + ['!', ['@']], + ['?', ['?', '@']], + ['@', ['@']], + ['*', ['*', '+', '?', '@']], + ['+', ['+', '@']], +]); +// nested extglobs that can be adopted in, but with the addition of +// a blank '' element. +const adoptionWithSpaceMap = new Map([ + ['!', ['?']], + ['@', ['?']], + ['+', ['?', '*']], +]); +// union of the previous two maps +const adoptionAnyMap = new Map([ + ['!', ['?', '@']], + ['?', ['?', '@']], + ['@', ['?', '@']], + ['*', ['*', '+', '?', '@']], + ['+', ['+', '@', '?', '*']], +]); +// Extglobs that can take over their parent if they are the only child +// the key is parent, value maps child to resulting extglob parent type +// '@' is omitted because it's a special case. An `@` extglob with a single +// member can always be usurped by that subpattern. +const usurpMap = new Map([ + ['!', new Map([['!', '@']])], + [ + '?', + new Map([ + ['*', '*'], + ['+', '*'], + ]), + ], + [ + '@', + new Map([ + ['!', '!'], + ['?', '?'], + ['@', '@'], + ['*', '*'], + ['+', '+'], + ]), + ], + [ + '+', + new Map([ + ['?', '*'], + ['*', '*'], + ]), + ], +]); // Patterns that get prepended to bind to the start of either the // entire string, or just a single path portion, to prevent dots // and/or traversal patterns, when needed. @@ -29,6 +131,7 @@ const star = qmark + '*?'; const starNoEmpty = qmark + '+?'; // remove the \ chars that we added if we end up doing a nonmagic compare // const deslash = (s: string) => s.replace(/\\(.)/g, '$1') +let ID = 0; class AST { type; #root; @@ -44,6 +147,22 @@ class AST { // set to true if it's an extglob with no children // (which really means one child of '') #emptyExt = false; + id = ++ID; + get depth() { + return (this.#parent?.depth ?? -1) + 1; + } + [Symbol.for('nodejs.util.inspect.custom')]() { + return { + '@@type': 'AST', + id: this.id, + type: this.type, + root: this.#root.id, + parent: this.#parent?.id, + depth: this.depth, + partsLength: this.#parts.length, + parts: this.#parts, + }; + } constructor(type, parent, options = {}) { this.type = type; // extglobs are inherently magical @@ -123,7 +242,7 @@ class AST { continue; /* c8 ignore start */ if (typeof p !== 'string' && - !(p instanceof AST && p.#parent === this)) { + !(p instanceof _a && p.#parent === this)) { throw new Error('invalid part: ' + p); } /* c8 ignore stop */ @@ -157,7 +276,7 @@ class AST { const p = this.#parent; for (let i = 0; i < this.#parentIndex; i++) { const pp = p.#parts[i]; - if (!(pp instanceof AST && pp.type === '!')) { + if (!(pp instanceof _a && pp.type === '!')) { return false; } } @@ -185,13 +304,14 @@ class AST { this.push(part.clone(this)); } clone(parent) { - const c = new AST(this.type, parent); + const c = new _a(this.type, parent); for (const p of this.#parts) { c.copyIn(p); } return c; } - static #parseAST(str, ast, pos, opt) { + static #parseAST(str, ast, pos, opt, extDepth) { + const maxDepth = opt.maxExtglobRecursion ?? 2; let escaping = false; let inBrace = false; let braceStart = -1; @@ -228,11 +348,17 @@ class AST { acc += c; continue; } - if (!opt.noext && isExtglobType(c) && str.charAt(i) === '(') { + // we don't have to check for adoption here, because that's + // done at the other recursion point. + const doRecurse = !opt.noext && + isExtglobType(c) && + str.charAt(i) === '(' && + extDepth <= maxDepth; + if (doRecurse) { ast.push(acc); acc = ''; - const ext = new AST(c, ast); - i = AST.#parseAST(str, ext, i, opt); + const ext = new _a(c, ast); + i = _a.#parseAST(str, ext, i, opt, extDepth + 1); ast.push(ext); continue; } @@ -244,7 +370,7 @@ class AST { // some kind of extglob, pos is at the ( // find the next | or ) let i = pos + 1; - let part = new AST(null, ast); + let part = new _a(null, ast); const parts = []; let acc = ''; while (i < str.length) { @@ -275,19 +401,26 @@ class AST { acc += c; continue; } - if (isExtglobType(c) && str.charAt(i) === '(') { + const doRecurse = !opt.noext && + isExtglobType(c) && + str.charAt(i) === '(' && + /* c8 ignore start - the maxDepth is sufficient here */ + (extDepth <= maxDepth || (ast && ast.#canAdoptType(c))); + /* c8 ignore stop */ + if (doRecurse) { + const depthAdd = ast && ast.#canAdoptType(c) ? 0 : 1; part.push(acc); acc = ''; - const ext = new AST(c, part); + const ext = new _a(c, part); part.push(ext); - i = AST.#parseAST(str, ext, i, opt); + i = _a.#parseAST(str, ext, i, opt, extDepth + depthAdd); continue; } if (c === '|') { part.push(acc); acc = ''; parts.push(part); - part = new AST(null, ast); + part = new _a(null, ast); continue; } if (c === ')') { @@ -309,9 +442,82 @@ class AST { ast.#parts = [str.substring(pos - 1)]; return i; } + #canAdoptWithSpace(child) { + return this.#canAdopt(child, adoptionWithSpaceMap); + } + #canAdopt(child, map = adoptionMap) { + if (!child || + typeof child !== 'object' || + child.type !== null || + child.#parts.length !== 1 || + this.type === null) { + return false; + } + const gc = child.#parts[0]; + if (!gc || typeof gc !== 'object' || gc.type === null) { + return false; + } + return this.#canAdoptType(gc.type, map); + } + #canAdoptType(c, map = adoptionAnyMap) { + return !!map.get(this.type)?.includes(c); + } + #adoptWithSpace(child, index) { + const gc = child.#parts[0]; + const blank = new _a(null, gc, this.options); + blank.#parts.push(''); + gc.push(blank); + this.#adopt(child, index); + } + #adopt(child, index) { + const gc = child.#parts[0]; + this.#parts.splice(index, 1, ...gc.#parts); + for (const p of gc.#parts) { + if (typeof p === 'object') + p.#parent = this; + } + this.#toString = undefined; + } + #canUsurpType(c) { + const m = usurpMap.get(this.type); + return !!(m?.has(c)); + } + #canUsurp(child) { + if (!child || + typeof child !== 'object' || + child.type !== null || + child.#parts.length !== 1 || + this.type === null || + this.#parts.length !== 1) { + return false; + } + const gc = child.#parts[0]; + if (!gc || typeof gc !== 'object' || gc.type === null) { + return false; + } + return this.#canUsurpType(gc.type); + } + #usurp(child) { + const m = usurpMap.get(this.type); + const gc = child.#parts[0]; + const nt = m?.get(gc.type); + /* c8 ignore start - impossible */ + if (!nt) + return false; + /* c8 ignore stop */ + this.#parts = gc.#parts; + for (const p of this.#parts) { + if (typeof p === 'object') { + p.#parent = this; + } + } + this.type = nt; + this.#toString = undefined; + this.#emptyExt = false; + } static fromGlob(pattern, options = {}) { - const ast = new AST(null, undefined, options); - AST.#parseAST(pattern, ast, 0, options); + const ast = new _a(null, undefined, options); + _a.#parseAST(pattern, ast, 0, options, 0); return ast; } // returns the regular expression if there's magic, or the unescaped @@ -415,16 +621,18 @@ class AST { // or start or whatever) and prepend ^ or / at the Regexp construction. toRegExpSource(allowDot) { const dot = allowDot ?? !!this.#options.dot; - if (this.#root === this) + if (this.#root === this) { + this.#flatten(); this.#fillNegs(); - if (!this.type) { + } + if (!isExtglobAST(this)) { const noEmpty = this.isStart() && this.isEnd() && !this.#parts.some(s => typeof s !== 'string'); const src = this.#parts .map(p => { const [re, _, hasMagic, uflag] = typeof p === 'string' ? - AST.#parseGlob(p, this.#hasMagic, noEmpty) + _a.#parseGlob(p, this.#hasMagic, noEmpty) : p.toRegExpSource(allowDot); this.#hasMagic = this.#hasMagic || hasMagic; this.#uflag = this.#uflag || uflag; @@ -486,12 +694,12 @@ class AST { // invalid extglob, has to at least be *something* present, if it's // the entire path portion. const s = this.toString(); - this.#parts = [s]; - this.type = null; - this.#hasMagic = undefined; + const me = this; + me.#parts = [s]; + me.type = null; + me.#hasMagic = undefined; return [s, (0, unescape_js_1.unescape)(this.toString()), false, false]; } - // XXX abstract out this map method let bodyDotAllowed = !repeated || allowDot || dot || !startNoDot ? '' : this.#partsToRegExp(true); @@ -527,6 +735,42 @@ class AST { this.#uflag, ]; } + #flatten() { + if (!isExtglobAST(this)) { + for (const p of this.#parts) { + if (typeof p === 'object') { + p.#flatten(); + } + } + } + else { + // do up to 10 passes to flatten as much as possible + let iterations = 0; + let done = false; + do { + done = true; + for (let i = 0; i < this.#parts.length; i++) { + const c = this.#parts[i]; + if (typeof c === 'object') { + c.#flatten(); + if (this.#canAdopt(c)) { + done = false; + this.#adopt(c, i); + } + else if (this.#canAdoptWithSpace(c)) { + done = false; + this.#adoptWithSpace(c, i); + } + else if (this.#canUsurp(c)) { + done = false; + this.#usurp(c); + } + } + } + } while (!done && ++iterations < 10); + } + this.#toString = undefined; + } #partsToRegExp(dot) { return this.#parts .map(p => { @@ -598,4 +842,5 @@ class AST { } } exports.AST = AST; +_a = AST; //# sourceMappingURL=ast.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/minimatch/dist/commonjs/index.js b/deps/npm/node_modules/minimatch/dist/commonjs/index.js index 5a0ba2a87fb036..b28f9b455ecf8b 100644 --- a/deps/npm/node_modules/minimatch/dist/commonjs/index.js +++ b/deps/npm/node_modules/minimatch/dist/commonjs/index.js @@ -202,11 +202,13 @@ class Minimatch { isWindows; platform; windowsNoMagicRoot; + maxGlobstarRecursion; regexp; constructor(pattern, options = {}) { (0, assert_valid_pattern_js_1.assertValidPattern)(pattern); options = options || {}; this.options = options; + this.maxGlobstarRecursion = options.maxGlobstarRecursion ?? 200; this.pattern = pattern; this.platform = options.platform || defaultPlatform; this.isWindows = this.platform === 'win32'; @@ -611,7 +613,8 @@ class Minimatch { // out of pattern, then that's fine, as long as all // the parts match. matchOne(file, pattern, partial = false) { - const options = this.options; + let fileStartIndex = 0; + let patternStartIndex = 0; // UNC paths like //?/X:/... can match X:/... and vice versa // Drive letters in absolute drive or unc paths are always compared // case-insensitively. @@ -640,14 +643,11 @@ class Minimatch { file[fdi], pattern[pdi], ]; + // start matching at the drive letter index of each if (fd.toLowerCase() === pd.toLowerCase()) { pattern[pdi] = fd; - if (pdi > fdi) { - pattern = pattern.slice(pdi); - } - else if (fdi > pdi) { - file = file.slice(fdi); - } + patternStartIndex = pdi; + fileStartIndex = fdi; } } } @@ -657,99 +657,185 @@ class Minimatch { if (optimizationLevel >= 2) { file = this.levelTwoFileOptimize(file); } - this.debug('matchOne', this, { file, pattern }); - this.debug('matchOne', file.length, pattern.length); - for (var fi = 0, pi = 0, fl = file.length, pl = pattern.length; fi < fl && pi < pl; fi++, pi++) { + if (pattern.includes(exports.GLOBSTAR)) { + return this.#matchGlobstar(file, pattern, partial, fileStartIndex, patternStartIndex); + } + return this.#matchOne(file, pattern, partial, fileStartIndex, patternStartIndex); + } + #matchGlobstar(file, pattern, partial, fileIndex, patternIndex) { + // split the pattern into head, tail, and middle of ** delimited parts + const firstgs = pattern.indexOf(exports.GLOBSTAR, patternIndex); + const lastgs = pattern.lastIndexOf(exports.GLOBSTAR); + // split the pattern up into globstar-delimited sections + // the tail has to be at the end, and the others just have + // to be found in order from the head. + const [head, body, tail] = partial ? [ + pattern.slice(patternIndex, firstgs), + pattern.slice(firstgs + 1), + [], + ] : [ + pattern.slice(patternIndex, firstgs), + pattern.slice(firstgs + 1, lastgs), + pattern.slice(lastgs + 1), + ]; + // check the head, from the current file/pattern index. + if (head.length) { + const fileHead = file.slice(fileIndex, fileIndex + head.length); + if (!this.#matchOne(fileHead, head, partial, 0, 0)) { + return false; + } + fileIndex += head.length; + patternIndex += head.length; + } + // now we know the head matches! + // if the last portion is not empty, it MUST match the end + // check the tail + let fileTailMatch = 0; + if (tail.length) { + // if head + tail > file, then we cannot possibly match + if (tail.length + fileIndex > file.length) + return false; + // try to match the tail + let tailStart = file.length - tail.length; + if (this.#matchOne(file, tail, partial, tailStart, 0)) { + fileTailMatch = tail.length; + } + else { + // affordance for stuff like a/**/* matching a/b/ + // if the last file portion is '', and there's more to the pattern + // then try without the '' bit. + if (file[file.length - 1] !== '' || + fileIndex + tail.length === file.length) { + return false; + } + tailStart--; + if (!this.#matchOne(file, tail, partial, tailStart, 0)) { + return false; + } + fileTailMatch = tail.length + 1; + } + } + // now we know the tail matches! + // the middle is zero or more portions wrapped in **, possibly + // containing more ** sections. + // so a/**/b/**/c/**/d has become **/b/**/c/** + // if it's empty, it means a/**/b, just verify we have no bad dots + // if there's no tail, so it ends on /**, then we must have *something* + // after the head, or it's not a matc + if (!body.length) { + let sawSome = !!fileTailMatch; + for (let i = fileIndex; i < file.length - fileTailMatch; i++) { + const f = String(file[i]); + sawSome = true; + if (f === '.' || + f === '..' || + (!this.options.dot && f.startsWith('.'))) { + return false; + } + } + // in partial mode, we just need to get past all file parts + return partial || sawSome; + } + // now we know that there's one or more body sections, which can + // be matched anywhere from the 0 index (because the head was pruned) + // through to the length-fileTailMatch index. + // split the body up into sections, and note the minimum index it can + // be found at (start with the length of all previous segments) + // [section, before, after] + const bodySegments = [[[], 0]]; + let currentBody = bodySegments[0]; + let nonGsParts = 0; + const nonGsPartsSums = [0]; + for (const b of body) { + if (b === exports.GLOBSTAR) { + nonGsPartsSums.push(nonGsParts); + currentBody = [[], 0]; + bodySegments.push(currentBody); + } + else { + currentBody[0].push(b); + nonGsParts++; + } + } + let i = bodySegments.length - 1; + const fileLength = file.length - fileTailMatch; + for (const b of bodySegments) { + b[1] = fileLength - (nonGsPartsSums[i--] + b[0].length); + } + return !!this.#matchGlobStarBodySections(file, bodySegments, fileIndex, 0, partial, 0, !!fileTailMatch); + } + // return false for "nope, not matching" + // return null for "not matching, cannot keep trying" + #matchGlobStarBodySections(file, + // pattern section, last possible position for it + bodySegments, fileIndex, bodyIndex, partial, globStarDepth, sawTail) { + // take the first body segment, and walk from fileIndex to its "after" + // value at the end + // If it doesn't match at that position, we increment, until we hit + // that final possible position, and give up. + // If it does match, then advance and try to rest. + // If any of them fail we keep walking forward. + // this is still a bit recursively painful, but it's more constrained + // than previous implementations, because we never test something that + // can't possibly be a valid matching condition. + const bs = bodySegments[bodyIndex]; + if (!bs) { + // just make sure that there's no bad dots + for (let i = fileIndex; i < file.length; i++) { + sawTail = true; + const f = file[i]; + if (f === '.' || + f === '..' || + (!this.options.dot && f.startsWith('.'))) { + return false; + } + } + return sawTail; + } + // have a non-globstar body section to test + const [body, after] = bs; + while (fileIndex <= after) { + const m = this.#matchOne(file.slice(0, fileIndex + body.length), body, partial, fileIndex, 0); + // if limit exceeded, no match. intentional false negative, + // acceptable break in correctness for security. + if (m && globStarDepth < this.maxGlobstarRecursion) { + // match! see if the rest match. if so, we're done! + const sub = this.#matchGlobStarBodySections(file, bodySegments, fileIndex + body.length, bodyIndex + 1, partial, globStarDepth + 1, sawTail); + if (sub !== false) { + return sub; + } + } + const f = file[fileIndex]; + if (f === '.' || + f === '..' || + (!this.options.dot && f.startsWith('.'))) { + return false; + } + fileIndex++; + } + // walked off. no point continuing + return partial || null; + } + #matchOne(file, pattern, partial, fileIndex, patternIndex) { + let fi; + let pi; + let pl; + let fl; + for (fi = fileIndex, + pi = patternIndex, + fl = file.length, + pl = pattern.length; fi < fl && pi < pl; fi++, pi++) { this.debug('matchOne loop'); - var p = pattern[pi]; - var f = file[fi]; + let p = pattern[pi]; + let f = file[fi]; this.debug(pattern, p, f); // should be impossible. // some invalid regexp stuff in the set. /* c8 ignore start */ - if (p === false) { + if (p === false || p === exports.GLOBSTAR) { return false; } /* c8 ignore stop */ - if (p === exports.GLOBSTAR) { - this.debug('GLOBSTAR', [pattern, p, f]); - // "**" - // a/**/b/**/c would match the following: - // a/b/x/y/z/c - // a/x/y/z/b/c - // a/b/x/b/x/c - // a/b/c - // To do this, take the rest of the pattern after - // the **, and see if it would match the file remainder. - // If so, return success. - // If not, the ** "swallows" a segment, and try again. - // This is recursively awful. - // - // a/**/b/**/c matching a/b/x/y/z/c - // - a matches a - // - doublestar - // - matchOne(b/x/y/z/c, b/**/c) - // - b matches b - // - doublestar - // - matchOne(x/y/z/c, c) -> no - // - matchOne(y/z/c, c) -> no - // - matchOne(z/c, c) -> no - // - matchOne(c, c) yes, hit - var fr = fi; - var pr = pi + 1; - if (pr === pl) { - this.debug('** at the end'); - // a ** at the end will just swallow the rest. - // We have found a match. - // however, it will not swallow /.x, unless - // options.dot is set. - // . and .. are *never* matched by **, for explosively - // exponential reasons. - for (; fi < fl; fi++) { - if (file[fi] === '.' || - file[fi] === '..' || - (!options.dot && file[fi].charAt(0) === '.')) - return false; - } - return true; - } - // ok, let's see if we can swallow whatever we can. - while (fr < fl) { - var swallowee = file[fr]; - this.debug('\nglobstar while', file, fr, pattern, pr, swallowee); - // XXX remove this slice. Just pass the start index. - if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { - this.debug('globstar found match!', fr, fl, swallowee); - // found a match. - return true; - } - else { - // can't swallow "." or ".." ever. - // can only swallow ".foo" when explicitly asked. - if (swallowee === '.' || - swallowee === '..' || - (!options.dot && swallowee.charAt(0) === '.')) { - this.debug('dot detected!', file, fr, pattern, pr); - break; - } - // ** swallows a segment, and continue. - this.debug('globstar swallow a segment, and continue'); - fr++; - } - } - // no match was found. - // However, in partial mode, we can't say this is necessarily over. - /* c8 ignore start */ - if (partial) { - // ran out of file - this.debug('\n>>> no match, partial?', file, fr, pattern, pr); - if (fr === fl) { - return true; - } - } - /* c8 ignore stop */ - return false; - } // something other than ** // non-magic patterns just have to match exactly // patterns with magic have been turned into regexps. diff --git a/deps/npm/node_modules/minimatch/dist/esm/ast.js b/deps/npm/node_modules/minimatch/dist/esm/ast.js index bcc9d72b0f9cc0..4501f7208dbc02 100644 --- a/deps/npm/node_modules/minimatch/dist/esm/ast.js +++ b/deps/npm/node_modules/minimatch/dist/esm/ast.js @@ -1,8 +1,110 @@ // parse a single path portion +var _a; import { parseClass } from './brace-expressions.js'; import { unescape } from './unescape.js'; const types = new Set(['!', '?', '+', '*', '@']); const isExtglobType = (c) => types.has(c); +const isExtglobAST = (c) => isExtglobType(c.type); +// Map of which extglob types can adopt the children of a nested extglob +// +// anything but ! can adopt a matching type: +// +(a|+(b|c)|d) => +(a|b|c|d) +// *(a|*(b|c)|d) => *(a|b|c|d) +// @(a|@(b|c)|d) => @(a|b|c|d) +// ?(a|?(b|c)|d) => ?(a|b|c|d) +// +// * can adopt anything, because 0 or repetition is allowed +// *(a|?(b|c)|d) => *(a|b|c|d) +// *(a|+(b|c)|d) => *(a|b|c|d) +// *(a|@(b|c)|d) => *(a|b|c|d) +// +// + can adopt @, because 1 or repetition is allowed +// +(a|@(b|c)|d) => +(a|b|c|d) +// +// + and @ CANNOT adopt *, because 0 would be allowed +// +(a|*(b|c)|d) => would match "", on *(b|c) +// @(a|*(b|c)|d) => would match "", on *(b|c) +// +// + and @ CANNOT adopt ?, because 0 would be allowed +// +(a|?(b|c)|d) => would match "", on ?(b|c) +// @(a|?(b|c)|d) => would match "", on ?(b|c) +// +// ? can adopt @, because 0 or 1 is allowed +// ?(a|@(b|c)|d) => ?(a|b|c|d) +// +// ? and @ CANNOT adopt * or +, because >1 would be allowed +// ?(a|*(b|c)|d) => would match bbb on *(b|c) +// @(a|*(b|c)|d) => would match bbb on *(b|c) +// ?(a|+(b|c)|d) => would match bbb on +(b|c) +// @(a|+(b|c)|d) => would match bbb on +(b|c) +// +// ! CANNOT adopt ! (nothing else can either) +// !(a|!(b|c)|d) => !(a|b|c|d) would fail to match on b (not not b|c) +// +// ! can adopt @ +// !(a|@(b|c)|d) => !(a|b|c|d) +// +// ! CANNOT adopt * +// !(a|*(b|c)|d) => !(a|b|c|d) would match on bbb, not allowed +// +// ! CANNOT adopt + +// !(a|+(b|c)|d) => !(a|b|c|d) would match on bbb, not allowed +// +// ! CANNOT adopt ? +// x!(a|?(b|c)|d) => x!(a|b|c|d) would fail to match "x" +const adoptionMap = new Map([ + ['!', ['@']], + ['?', ['?', '@']], + ['@', ['@']], + ['*', ['*', '+', '?', '@']], + ['+', ['+', '@']], +]); +// nested extglobs that can be adopted in, but with the addition of +// a blank '' element. +const adoptionWithSpaceMap = new Map([ + ['!', ['?']], + ['@', ['?']], + ['+', ['?', '*']], +]); +// union of the previous two maps +const adoptionAnyMap = new Map([ + ['!', ['?', '@']], + ['?', ['?', '@']], + ['@', ['?', '@']], + ['*', ['*', '+', '?', '@']], + ['+', ['+', '@', '?', '*']], +]); +// Extglobs that can take over their parent if they are the only child +// the key is parent, value maps child to resulting extglob parent type +// '@' is omitted because it's a special case. An `@` extglob with a single +// member can always be usurped by that subpattern. +const usurpMap = new Map([ + ['!', new Map([['!', '@']])], + [ + '?', + new Map([ + ['*', '*'], + ['+', '*'], + ]), + ], + [ + '@', + new Map([ + ['!', '!'], + ['?', '?'], + ['@', '@'], + ['*', '*'], + ['+', '+'], + ]), + ], + [ + '+', + new Map([ + ['?', '*'], + ['*', '*'], + ]), + ], +]); // Patterns that get prepended to bind to the start of either the // entire string, or just a single path portion, to prevent dots // and/or traversal patterns, when needed. @@ -26,6 +128,7 @@ const star = qmark + '*?'; const starNoEmpty = qmark + '+?'; // remove the \ chars that we added if we end up doing a nonmagic compare // const deslash = (s: string) => s.replace(/\\(.)/g, '$1') +let ID = 0; export class AST { type; #root; @@ -41,6 +144,22 @@ export class AST { // set to true if it's an extglob with no children // (which really means one child of '') #emptyExt = false; + id = ++ID; + get depth() { + return (this.#parent?.depth ?? -1) + 1; + } + [Symbol.for('nodejs.util.inspect.custom')]() { + return { + '@@type': 'AST', + id: this.id, + type: this.type, + root: this.#root.id, + parent: this.#parent?.id, + depth: this.depth, + partsLength: this.#parts.length, + parts: this.#parts, + }; + } constructor(type, parent, options = {}) { this.type = type; // extglobs are inherently magical @@ -120,7 +239,7 @@ export class AST { continue; /* c8 ignore start */ if (typeof p !== 'string' && - !(p instanceof AST && p.#parent === this)) { + !(p instanceof _a && p.#parent === this)) { throw new Error('invalid part: ' + p); } /* c8 ignore stop */ @@ -154,7 +273,7 @@ export class AST { const p = this.#parent; for (let i = 0; i < this.#parentIndex; i++) { const pp = p.#parts[i]; - if (!(pp instanceof AST && pp.type === '!')) { + if (!(pp instanceof _a && pp.type === '!')) { return false; } } @@ -182,13 +301,14 @@ export class AST { this.push(part.clone(this)); } clone(parent) { - const c = new AST(this.type, parent); + const c = new _a(this.type, parent); for (const p of this.#parts) { c.copyIn(p); } return c; } - static #parseAST(str, ast, pos, opt) { + static #parseAST(str, ast, pos, opt, extDepth) { + const maxDepth = opt.maxExtglobRecursion ?? 2; let escaping = false; let inBrace = false; let braceStart = -1; @@ -225,11 +345,17 @@ export class AST { acc += c; continue; } - if (!opt.noext && isExtglobType(c) && str.charAt(i) === '(') { + // we don't have to check for adoption here, because that's + // done at the other recursion point. + const doRecurse = !opt.noext && + isExtglobType(c) && + str.charAt(i) === '(' && + extDepth <= maxDepth; + if (doRecurse) { ast.push(acc); acc = ''; - const ext = new AST(c, ast); - i = AST.#parseAST(str, ext, i, opt); + const ext = new _a(c, ast); + i = _a.#parseAST(str, ext, i, opt, extDepth + 1); ast.push(ext); continue; } @@ -241,7 +367,7 @@ export class AST { // some kind of extglob, pos is at the ( // find the next | or ) let i = pos + 1; - let part = new AST(null, ast); + let part = new _a(null, ast); const parts = []; let acc = ''; while (i < str.length) { @@ -272,19 +398,26 @@ export class AST { acc += c; continue; } - if (isExtglobType(c) && str.charAt(i) === '(') { + const doRecurse = !opt.noext && + isExtglobType(c) && + str.charAt(i) === '(' && + /* c8 ignore start - the maxDepth is sufficient here */ + (extDepth <= maxDepth || (ast && ast.#canAdoptType(c))); + /* c8 ignore stop */ + if (doRecurse) { + const depthAdd = ast && ast.#canAdoptType(c) ? 0 : 1; part.push(acc); acc = ''; - const ext = new AST(c, part); + const ext = new _a(c, part); part.push(ext); - i = AST.#parseAST(str, ext, i, opt); + i = _a.#parseAST(str, ext, i, opt, extDepth + depthAdd); continue; } if (c === '|') { part.push(acc); acc = ''; parts.push(part); - part = new AST(null, ast); + part = new _a(null, ast); continue; } if (c === ')') { @@ -306,9 +439,82 @@ export class AST { ast.#parts = [str.substring(pos - 1)]; return i; } + #canAdoptWithSpace(child) { + return this.#canAdopt(child, adoptionWithSpaceMap); + } + #canAdopt(child, map = adoptionMap) { + if (!child || + typeof child !== 'object' || + child.type !== null || + child.#parts.length !== 1 || + this.type === null) { + return false; + } + const gc = child.#parts[0]; + if (!gc || typeof gc !== 'object' || gc.type === null) { + return false; + } + return this.#canAdoptType(gc.type, map); + } + #canAdoptType(c, map = adoptionAnyMap) { + return !!map.get(this.type)?.includes(c); + } + #adoptWithSpace(child, index) { + const gc = child.#parts[0]; + const blank = new _a(null, gc, this.options); + blank.#parts.push(''); + gc.push(blank); + this.#adopt(child, index); + } + #adopt(child, index) { + const gc = child.#parts[0]; + this.#parts.splice(index, 1, ...gc.#parts); + for (const p of gc.#parts) { + if (typeof p === 'object') + p.#parent = this; + } + this.#toString = undefined; + } + #canUsurpType(c) { + const m = usurpMap.get(this.type); + return !!(m?.has(c)); + } + #canUsurp(child) { + if (!child || + typeof child !== 'object' || + child.type !== null || + child.#parts.length !== 1 || + this.type === null || + this.#parts.length !== 1) { + return false; + } + const gc = child.#parts[0]; + if (!gc || typeof gc !== 'object' || gc.type === null) { + return false; + } + return this.#canUsurpType(gc.type); + } + #usurp(child) { + const m = usurpMap.get(this.type); + const gc = child.#parts[0]; + const nt = m?.get(gc.type); + /* c8 ignore start - impossible */ + if (!nt) + return false; + /* c8 ignore stop */ + this.#parts = gc.#parts; + for (const p of this.#parts) { + if (typeof p === 'object') { + p.#parent = this; + } + } + this.type = nt; + this.#toString = undefined; + this.#emptyExt = false; + } static fromGlob(pattern, options = {}) { - const ast = new AST(null, undefined, options); - AST.#parseAST(pattern, ast, 0, options); + const ast = new _a(null, undefined, options); + _a.#parseAST(pattern, ast, 0, options, 0); return ast; } // returns the regular expression if there's magic, or the unescaped @@ -412,16 +618,18 @@ export class AST { // or start or whatever) and prepend ^ or / at the Regexp construction. toRegExpSource(allowDot) { const dot = allowDot ?? !!this.#options.dot; - if (this.#root === this) + if (this.#root === this) { + this.#flatten(); this.#fillNegs(); - if (!this.type) { + } + if (!isExtglobAST(this)) { const noEmpty = this.isStart() && this.isEnd() && !this.#parts.some(s => typeof s !== 'string'); const src = this.#parts .map(p => { const [re, _, hasMagic, uflag] = typeof p === 'string' ? - AST.#parseGlob(p, this.#hasMagic, noEmpty) + _a.#parseGlob(p, this.#hasMagic, noEmpty) : p.toRegExpSource(allowDot); this.#hasMagic = this.#hasMagic || hasMagic; this.#uflag = this.#uflag || uflag; @@ -483,12 +691,12 @@ export class AST { // invalid extglob, has to at least be *something* present, if it's // the entire path portion. const s = this.toString(); - this.#parts = [s]; - this.type = null; - this.#hasMagic = undefined; + const me = this; + me.#parts = [s]; + me.type = null; + me.#hasMagic = undefined; return [s, unescape(this.toString()), false, false]; } - // XXX abstract out this map method let bodyDotAllowed = !repeated || allowDot || dot || !startNoDot ? '' : this.#partsToRegExp(true); @@ -524,6 +732,42 @@ export class AST { this.#uflag, ]; } + #flatten() { + if (!isExtglobAST(this)) { + for (const p of this.#parts) { + if (typeof p === 'object') { + p.#flatten(); + } + } + } + else { + // do up to 10 passes to flatten as much as possible + let iterations = 0; + let done = false; + do { + done = true; + for (let i = 0; i < this.#parts.length; i++) { + const c = this.#parts[i]; + if (typeof c === 'object') { + c.#flatten(); + if (this.#canAdopt(c)) { + done = false; + this.#adopt(c, i); + } + else if (this.#canAdoptWithSpace(c)) { + done = false; + this.#adoptWithSpace(c, i); + } + else if (this.#canUsurp(c)) { + done = false; + this.#usurp(c); + } + } + } + } while (!done && ++iterations < 10); + } + this.#toString = undefined; + } #partsToRegExp(dot) { return this.#parts .map(p => { @@ -594,4 +838,5 @@ export class AST { return [re, unescape(glob), !!hasMagic, uflag]; } } +_a = AST; //# sourceMappingURL=ast.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/minimatch/dist/esm/index.js b/deps/npm/node_modules/minimatch/dist/esm/index.js index 3175327db5efbf..ac45d7c48e309f 100644 --- a/deps/npm/node_modules/minimatch/dist/esm/index.js +++ b/deps/npm/node_modules/minimatch/dist/esm/index.js @@ -193,11 +193,13 @@ export class Minimatch { isWindows; platform; windowsNoMagicRoot; + maxGlobstarRecursion; regexp; constructor(pattern, options = {}) { assertValidPattern(pattern); options = options || {}; this.options = options; + this.maxGlobstarRecursion = options.maxGlobstarRecursion ?? 200; this.pattern = pattern; this.platform = options.platform || defaultPlatform; this.isWindows = this.platform === 'win32'; @@ -602,7 +604,8 @@ export class Minimatch { // out of pattern, then that's fine, as long as all // the parts match. matchOne(file, pattern, partial = false) { - const options = this.options; + let fileStartIndex = 0; + let patternStartIndex = 0; // UNC paths like //?/X:/... can match X:/... and vice versa // Drive letters in absolute drive or unc paths are always compared // case-insensitively. @@ -631,14 +634,11 @@ export class Minimatch { file[fdi], pattern[pdi], ]; + // start matching at the drive letter index of each if (fd.toLowerCase() === pd.toLowerCase()) { pattern[pdi] = fd; - if (pdi > fdi) { - pattern = pattern.slice(pdi); - } - else if (fdi > pdi) { - file = file.slice(fdi); - } + patternStartIndex = pdi; + fileStartIndex = fdi; } } } @@ -648,99 +648,185 @@ export class Minimatch { if (optimizationLevel >= 2) { file = this.levelTwoFileOptimize(file); } - this.debug('matchOne', this, { file, pattern }); - this.debug('matchOne', file.length, pattern.length); - for (var fi = 0, pi = 0, fl = file.length, pl = pattern.length; fi < fl && pi < pl; fi++, pi++) { + if (pattern.includes(GLOBSTAR)) { + return this.#matchGlobstar(file, pattern, partial, fileStartIndex, patternStartIndex); + } + return this.#matchOne(file, pattern, partial, fileStartIndex, patternStartIndex); + } + #matchGlobstar(file, pattern, partial, fileIndex, patternIndex) { + // split the pattern into head, tail, and middle of ** delimited parts + const firstgs = pattern.indexOf(GLOBSTAR, patternIndex); + const lastgs = pattern.lastIndexOf(GLOBSTAR); + // split the pattern up into globstar-delimited sections + // the tail has to be at the end, and the others just have + // to be found in order from the head. + const [head, body, tail] = partial ? [ + pattern.slice(patternIndex, firstgs), + pattern.slice(firstgs + 1), + [], + ] : [ + pattern.slice(patternIndex, firstgs), + pattern.slice(firstgs + 1, lastgs), + pattern.slice(lastgs + 1), + ]; + // check the head, from the current file/pattern index. + if (head.length) { + const fileHead = file.slice(fileIndex, fileIndex + head.length); + if (!this.#matchOne(fileHead, head, partial, 0, 0)) { + return false; + } + fileIndex += head.length; + patternIndex += head.length; + } + // now we know the head matches! + // if the last portion is not empty, it MUST match the end + // check the tail + let fileTailMatch = 0; + if (tail.length) { + // if head + tail > file, then we cannot possibly match + if (tail.length + fileIndex > file.length) + return false; + // try to match the tail + let tailStart = file.length - tail.length; + if (this.#matchOne(file, tail, partial, tailStart, 0)) { + fileTailMatch = tail.length; + } + else { + // affordance for stuff like a/**/* matching a/b/ + // if the last file portion is '', and there's more to the pattern + // then try without the '' bit. + if (file[file.length - 1] !== '' || + fileIndex + tail.length === file.length) { + return false; + } + tailStart--; + if (!this.#matchOne(file, tail, partial, tailStart, 0)) { + return false; + } + fileTailMatch = tail.length + 1; + } + } + // now we know the tail matches! + // the middle is zero or more portions wrapped in **, possibly + // containing more ** sections. + // so a/**/b/**/c/**/d has become **/b/**/c/** + // if it's empty, it means a/**/b, just verify we have no bad dots + // if there's no tail, so it ends on /**, then we must have *something* + // after the head, or it's not a matc + if (!body.length) { + let sawSome = !!fileTailMatch; + for (let i = fileIndex; i < file.length - fileTailMatch; i++) { + const f = String(file[i]); + sawSome = true; + if (f === '.' || + f === '..' || + (!this.options.dot && f.startsWith('.'))) { + return false; + } + } + // in partial mode, we just need to get past all file parts + return partial || sawSome; + } + // now we know that there's one or more body sections, which can + // be matched anywhere from the 0 index (because the head was pruned) + // through to the length-fileTailMatch index. + // split the body up into sections, and note the minimum index it can + // be found at (start with the length of all previous segments) + // [section, before, after] + const bodySegments = [[[], 0]]; + let currentBody = bodySegments[0]; + let nonGsParts = 0; + const nonGsPartsSums = [0]; + for (const b of body) { + if (b === GLOBSTAR) { + nonGsPartsSums.push(nonGsParts); + currentBody = [[], 0]; + bodySegments.push(currentBody); + } + else { + currentBody[0].push(b); + nonGsParts++; + } + } + let i = bodySegments.length - 1; + const fileLength = file.length - fileTailMatch; + for (const b of bodySegments) { + b[1] = fileLength - (nonGsPartsSums[i--] + b[0].length); + } + return !!this.#matchGlobStarBodySections(file, bodySegments, fileIndex, 0, partial, 0, !!fileTailMatch); + } + // return false for "nope, not matching" + // return null for "not matching, cannot keep trying" + #matchGlobStarBodySections(file, + // pattern section, last possible position for it + bodySegments, fileIndex, bodyIndex, partial, globStarDepth, sawTail) { + // take the first body segment, and walk from fileIndex to its "after" + // value at the end + // If it doesn't match at that position, we increment, until we hit + // that final possible position, and give up. + // If it does match, then advance and try to rest. + // If any of them fail we keep walking forward. + // this is still a bit recursively painful, but it's more constrained + // than previous implementations, because we never test something that + // can't possibly be a valid matching condition. + const bs = bodySegments[bodyIndex]; + if (!bs) { + // just make sure that there's no bad dots + for (let i = fileIndex; i < file.length; i++) { + sawTail = true; + const f = file[i]; + if (f === '.' || + f === '..' || + (!this.options.dot && f.startsWith('.'))) { + return false; + } + } + return sawTail; + } + // have a non-globstar body section to test + const [body, after] = bs; + while (fileIndex <= after) { + const m = this.#matchOne(file.slice(0, fileIndex + body.length), body, partial, fileIndex, 0); + // if limit exceeded, no match. intentional false negative, + // acceptable break in correctness for security. + if (m && globStarDepth < this.maxGlobstarRecursion) { + // match! see if the rest match. if so, we're done! + const sub = this.#matchGlobStarBodySections(file, bodySegments, fileIndex + body.length, bodyIndex + 1, partial, globStarDepth + 1, sawTail); + if (sub !== false) { + return sub; + } + } + const f = file[fileIndex]; + if (f === '.' || + f === '..' || + (!this.options.dot && f.startsWith('.'))) { + return false; + } + fileIndex++; + } + // walked off. no point continuing + return partial || null; + } + #matchOne(file, pattern, partial, fileIndex, patternIndex) { + let fi; + let pi; + let pl; + let fl; + for (fi = fileIndex, + pi = patternIndex, + fl = file.length, + pl = pattern.length; fi < fl && pi < pl; fi++, pi++) { this.debug('matchOne loop'); - var p = pattern[pi]; - var f = file[fi]; + let p = pattern[pi]; + let f = file[fi]; this.debug(pattern, p, f); // should be impossible. // some invalid regexp stuff in the set. /* c8 ignore start */ - if (p === false) { + if (p === false || p === GLOBSTAR) { return false; } /* c8 ignore stop */ - if (p === GLOBSTAR) { - this.debug('GLOBSTAR', [pattern, p, f]); - // "**" - // a/**/b/**/c would match the following: - // a/b/x/y/z/c - // a/x/y/z/b/c - // a/b/x/b/x/c - // a/b/c - // To do this, take the rest of the pattern after - // the **, and see if it would match the file remainder. - // If so, return success. - // If not, the ** "swallows" a segment, and try again. - // This is recursively awful. - // - // a/**/b/**/c matching a/b/x/y/z/c - // - a matches a - // - doublestar - // - matchOne(b/x/y/z/c, b/**/c) - // - b matches b - // - doublestar - // - matchOne(x/y/z/c, c) -> no - // - matchOne(y/z/c, c) -> no - // - matchOne(z/c, c) -> no - // - matchOne(c, c) yes, hit - var fr = fi; - var pr = pi + 1; - if (pr === pl) { - this.debug('** at the end'); - // a ** at the end will just swallow the rest. - // We have found a match. - // however, it will not swallow /.x, unless - // options.dot is set. - // . and .. are *never* matched by **, for explosively - // exponential reasons. - for (; fi < fl; fi++) { - if (file[fi] === '.' || - file[fi] === '..' || - (!options.dot && file[fi].charAt(0) === '.')) - return false; - } - return true; - } - // ok, let's see if we can swallow whatever we can. - while (fr < fl) { - var swallowee = file[fr]; - this.debug('\nglobstar while', file, fr, pattern, pr, swallowee); - // XXX remove this slice. Just pass the start index. - if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { - this.debug('globstar found match!', fr, fl, swallowee); - // found a match. - return true; - } - else { - // can't swallow "." or ".." ever. - // can only swallow ".foo" when explicitly asked. - if (swallowee === '.' || - swallowee === '..' || - (!options.dot && swallowee.charAt(0) === '.')) { - this.debug('dot detected!', file, fr, pattern, pr); - break; - } - // ** swallows a segment, and continue. - this.debug('globstar swallow a segment, and continue'); - fr++; - } - } - // no match was found. - // However, in partial mode, we can't say this is necessarily over. - /* c8 ignore start */ - if (partial) { - // ran out of file - this.debug('\n>>> no match, partial?', file, fr, pattern, pr); - if (fr === fl) { - return true; - } - } - /* c8 ignore stop */ - return false; - } // something other than ** // non-magic patterns just have to match exactly // patterns with magic have been turned into regexps. diff --git a/deps/npm/node_modules/minimatch/package.json b/deps/npm/node_modules/minimatch/package.json index 6d4fc25af97a05..7967489f17fe98 100644 --- a/deps/npm/node_modules/minimatch/package.json +++ b/deps/npm/node_modules/minimatch/package.json @@ -2,7 +2,7 @@ "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me)", "name": "minimatch", "description": "a glob matcher in javascript", - "version": "10.2.2", + "version": "10.2.4", "repository": { "type": "git", "url": "git@github.com:isaacs/minimatch" @@ -45,7 +45,7 @@ "@types/node": "^25.3.0", "mkdirp": "^3.0.1", "prettier": "^3.6.2", - "tap": "^21.6.1", + "tap": "^21.6.2", "tshy": "^3.0.2", "typedoc": "^0.28.5" }, diff --git a/deps/npm/node_modules/pacote/lib/registry.js b/deps/npm/node_modules/pacote/lib/registry.js index 1bfee0dd5e2990..f50b27956dbeb6 100644 --- a/deps/npm/node_modules/pacote/lib/registry.js +++ b/deps/npm/node_modules/pacote/lib/registry.js @@ -342,6 +342,7 @@ class RegistryFetcher extends Fetcher { } } mani._attestations = dist.attestations + mani._attestationBundles = attestations } else { mani._attestations = dist.attestations } diff --git a/deps/npm/node_modules/pacote/package.json b/deps/npm/node_modules/pacote/package.json index 566ad698cf89ec..d7dfa447f6abd8 100644 --- a/deps/npm/node_modules/pacote/package.json +++ b/deps/npm/node_modules/pacote/package.json @@ -1,6 +1,6 @@ { "name": "pacote", - "version": "21.4.0", + "version": "21.5.0", "description": "JavaScript package downloader", "author": "GitHub Inc.", "bin": { @@ -28,7 +28,7 @@ "devDependencies": { "@npmcli/arborist": "^9.0.2", "@npmcli/eslint-config": "^6.0.0", - "@npmcli/template-oss": "4.28.0", + "@npmcli/template-oss": "4.29.0", "hosted-git-info": "^9.0.0", "mutate-fs": "^2.1.1", "nock": "^13.2.4", @@ -73,7 +73,7 @@ }, "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.28.0", + "version": "4.29.0", "windowsCI": false, "publish": "true" } diff --git a/deps/npm/node_modules/promise-retry/LICENSE b/deps/npm/node_modules/promise-retry/LICENSE deleted file mode 100644 index db5e914de1f585..00000000000000 --- a/deps/npm/node_modules/promise-retry/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2014 IndigoUnited - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/deps/npm/node_modules/promise-retry/index.js b/deps/npm/node_modules/promise-retry/index.js deleted file mode 100644 index 5df48ae91602d6..00000000000000 --- a/deps/npm/node_modules/promise-retry/index.js +++ /dev/null @@ -1,52 +0,0 @@ -'use strict'; - -var errcode = require('err-code'); -var retry = require('retry'); - -var hasOwn = Object.prototype.hasOwnProperty; - -function isRetryError(err) { - return err && err.code === 'EPROMISERETRY' && hasOwn.call(err, 'retried'); -} - -function promiseRetry(fn, options) { - var temp; - var operation; - - if (typeof fn === 'object' && typeof options === 'function') { - // Swap options and fn when using alternate signature (options, fn) - temp = options; - options = fn; - fn = temp; - } - - operation = retry.operation(options); - - return new Promise(function (resolve, reject) { - operation.attempt(function (number) { - Promise.resolve() - .then(function () { - return fn(function (err) { - if (isRetryError(err)) { - err = err.retried; - } - - throw errcode(new Error('Retrying'), 'EPROMISERETRY', { retried: err }); - }, number); - }) - .then(resolve, function (err) { - if (isRetryError(err)) { - err = err.retried; - - if (operation.retry(err || new Error())) { - return; - } - } - - reject(err); - }); - }); - }); -} - -module.exports = promiseRetry; diff --git a/deps/npm/node_modules/promise-retry/package.json b/deps/npm/node_modules/promise-retry/package.json deleted file mode 100644 index 6842de823fd198..00000000000000 --- a/deps/npm/node_modules/promise-retry/package.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "name": "promise-retry", - "version": "2.0.1", - "description": "Retries a function that returns a promise, leveraging the power of the retry module.", - "main": "index.js", - "scripts": { - "test": "mocha --bail -t 10000" - }, - "bugs": { - "url": "https://github.com/IndigoUnited/node-promise-retry/issues/" - }, - "repository": { - "type": "git", - "url": "git://github.com/IndigoUnited/node-promise-retry.git" - }, - "keywords": [ - "retry", - "promise", - "backoff", - "repeat", - "replay" - ], - "author": "IndigoUnited <hello@indigounited.com> (http://indigounited.com)", - "license": "MIT", - "devDependencies": { - "expect.js": "^0.3.1", - "mocha": "^8.0.1", - "sleep-promise": "^8.0.1" - }, - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } -} diff --git a/deps/npm/node_modules/promise-retry/test/test.js b/deps/npm/node_modules/promise-retry/test/test.js deleted file mode 100644 index 466b0991e0f558..00000000000000 --- a/deps/npm/node_modules/promise-retry/test/test.js +++ /dev/null @@ -1,263 +0,0 @@ -'use strict'; - -var expect = require('expect.js'); -var promiseRetry = require('../'); -var promiseDelay = require('sleep-promise'); - -describe('promise-retry', function () { - it('should call fn again if retry was called', function () { - var count = 0; - - return promiseRetry(function (retry) { - count += 1; - - return promiseDelay(10) - .then(function () { - if (count <= 2) { - retry(new Error('foo')); - } - - return 'final'; - }); - }, { factor: 1 }) - .then(function (value) { - expect(value).to.be('final'); - expect(count).to.be(3); - }, function () { - throw new Error('should not fail'); - }); - }); - - it('should call fn with the attempt number', function () { - var count = 0; - - return promiseRetry(function (retry, number) { - count += 1; - expect(count).to.equal(number); - - return promiseDelay(10) - .then(function () { - if (count <= 2) { - retry(new Error('foo')); - } - - return 'final'; - }); - }, { factor: 1 }) - .then(function (value) { - expect(value).to.be('final'); - expect(count).to.be(3); - }, function () { - throw new Error('should not fail'); - }); - }); - - it('should not retry on fulfillment if retry was not called', function () { - var count = 0; - - return promiseRetry(function () { - count += 1; - - return promiseDelay(10) - .then(function () { - return 'final'; - }); - }) - .then(function (value) { - expect(value).to.be('final'); - expect(count).to.be(1); - }, function () { - throw new Error('should not fail'); - }); - }); - - it('should not retry on rejection if retry was not called', function () { - var count = 0; - - return promiseRetry(function () { - count += 1; - - return promiseDelay(10) - .then(function () { - throw new Error('foo'); - }); - }) - .then(function () { - throw new Error('should not succeed'); - }, function (err) { - expect(err.message).to.be('foo'); - expect(count).to.be(1); - }); - }); - - it('should not retry on rejection if nr of retries is 0', function () { - var count = 0; - - return promiseRetry(function (retry) { - count += 1; - - return promiseDelay(10) - .then(function () { - throw new Error('foo'); - }) - .catch(retry); - }, { retries : 0 }) - .then(function () { - throw new Error('should not succeed'); - }, function (err) { - expect(err.message).to.be('foo'); - expect(count).to.be(1); - }); - }); - - it('should reject the promise if the retries were exceeded', function () { - var count = 0; - - return promiseRetry(function (retry) { - count += 1; - - return promiseDelay(10) - .then(function () { - throw new Error('foo'); - }) - .catch(retry); - }, { retries: 2, factor: 1 }) - .then(function () { - throw new Error('should not succeed'); - }, function (err) { - expect(err.message).to.be('foo'); - expect(count).to.be(3); - }); - }); - - it('should pass options to the underlying retry module', function () { - var count = 0; - - return promiseRetry(function (retry) { - return promiseDelay(10) - .then(function () { - if (count < 2) { - count += 1; - retry(new Error('foo')); - } - - return 'final'; - }); - }, { retries: 1, factor: 1 }) - .then(function () { - throw new Error('should not succeed'); - }, function (err) { - expect(err.message).to.be('foo'); - }); - }); - - it('should convert direct fulfillments into promises', function () { - return promiseRetry(function () { - return 'final'; - }, { factor: 1 }) - .then(function (value) { - expect(value).to.be('final'); - }, function () { - throw new Error('should not fail'); - }); - }); - - it('should convert direct rejections into promises', function () { - promiseRetry(function () { - throw new Error('foo'); - }, { retries: 1, factor: 1 }) - .then(function () { - throw new Error('should not succeed'); - }, function (err) { - expect(err.message).to.be('foo'); - }); - }); - - it('should not crash on undefined rejections', function () { - return promiseRetry(function () { - throw undefined; - }, { retries: 1, factor: 1 }) - .then(function () { - throw new Error('should not succeed'); - }, function (err) { - expect(err).to.be(undefined); - }) - .then(function () { - return promiseRetry(function (retry) { - retry(); - }, { retries: 1, factor: 1 }); - }) - .then(function () { - throw new Error('should not succeed'); - }, function (err) { - expect(err).to.be(undefined); - }); - }); - - it('should retry if retry() was called with undefined', function () { - var count = 0; - - return promiseRetry(function (retry) { - count += 1; - - return promiseDelay(10) - .then(function () { - if (count <= 2) { - retry(); - } - - return 'final'; - }); - }, { factor: 1 }) - .then(function (value) { - expect(value).to.be('final'); - expect(count).to.be(3); - }, function () { - throw new Error('should not fail'); - }); - }); - - it('should work with several retries in the same chain', function () { - var count = 0; - - return promiseRetry(function (retry) { - count += 1; - - return promiseDelay(10) - .then(function () { - retry(new Error('foo')); - }) - .catch(function (err) { - retry(err); - }); - }, { retries: 1, factor: 1 }) - .then(function () { - throw new Error('should not succeed'); - }, function (err) { - expect(err.message).to.be('foo'); - expect(count).to.be(2); - }); - }); - - it('should allow options to be passed first', function () { - var count = 0; - - return promiseRetry({ factor: 1 }, function (retry) { - count += 1; - - return promiseDelay(10) - .then(function () { - if (count <= 2) { - retry(new Error('foo')); - } - - return 'final'; - }); - }).then(function (value) { - expect(value).to.be('final'); - expect(count).to.be(3); - }, function () { - throw new Error('should not fail'); - }); - }); -}); diff --git a/deps/npm/node_modules/retry/License b/deps/npm/node_modules/retry/License deleted file mode 100644 index 0b58de379fb308..00000000000000 --- a/deps/npm/node_modules/retry/License +++ /dev/null @@ -1,21 +0,0 @@ -Copyright (c) 2011: -Tim Koschützki (tim@debuggable.com) -Felix Geisendörfer (felix@debuggable.com) - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. diff --git a/deps/npm/node_modules/retry/Makefile b/deps/npm/node_modules/retry/Makefile deleted file mode 100644 index 1968d8ff8b07bc..00000000000000 --- a/deps/npm/node_modules/retry/Makefile +++ /dev/null @@ -1,18 +0,0 @@ -SHELL := /bin/bash - -release-major: test - npm version major -m "Release %s" - git push - npm publish - -release-minor: test - npm version minor -m "Release %s" - git push - npm publish - -release-patch: test - npm version patch -m "Release %s" - git push - npm publish - -.PHONY: test release-major release-minor release-patch diff --git a/deps/npm/node_modules/retry/equation.gif b/deps/npm/node_modules/retry/equation.gif deleted file mode 100644 index 97107237ba19f5..00000000000000 Binary files a/deps/npm/node_modules/retry/equation.gif and /dev/null differ diff --git a/deps/npm/node_modules/retry/example/dns.js b/deps/npm/node_modules/retry/example/dns.js deleted file mode 100644 index 446729b6f9af6b..00000000000000 --- a/deps/npm/node_modules/retry/example/dns.js +++ /dev/null @@ -1,31 +0,0 @@ -var dns = require('dns'); -var retry = require('../lib/retry'); - -function faultTolerantResolve(address, cb) { - var opts = { - retries: 2, - factor: 2, - minTimeout: 1 * 1000, - maxTimeout: 2 * 1000, - randomize: true - }; - var operation = retry.operation(opts); - - operation.attempt(function(currentAttempt) { - dns.resolve(address, function(err, addresses) { - if (operation.retry(err)) { - return; - } - - cb(operation.mainError(), operation.errors(), addresses); - }); - }); -} - -faultTolerantResolve('nodejs.org', function(err, errors, addresses) { - console.warn('err:'); - console.log(err); - - console.warn('addresses:'); - console.log(addresses); -}); \ No newline at end of file diff --git a/deps/npm/node_modules/retry/example/stop.js b/deps/npm/node_modules/retry/example/stop.js deleted file mode 100644 index e1ceafeebafc51..00000000000000 --- a/deps/npm/node_modules/retry/example/stop.js +++ /dev/null @@ -1,40 +0,0 @@ -var retry = require('../lib/retry'); - -function attemptAsyncOperation(someInput, cb) { - var opts = { - retries: 2, - factor: 2, - minTimeout: 1 * 1000, - maxTimeout: 2 * 1000, - randomize: true - }; - var operation = retry.operation(opts); - - operation.attempt(function(currentAttempt) { - failingAsyncOperation(someInput, function(err, result) { - - if (err && err.message === 'A fatal error') { - operation.stop(); - return cb(err); - } - - if (operation.retry(err)) { - return; - } - - cb(operation.mainError(), operation.errors(), result); - }); - }); -} - -attemptAsyncOperation('test input', function(err, errors, result) { - console.warn('err:'); - console.log(err); - - console.warn('result:'); - console.log(result); -}); - -function failingAsyncOperation(input, cb) { - return setImmediate(cb.bind(null, new Error('A fatal error'))); -} diff --git a/deps/npm/node_modules/retry/index.js b/deps/npm/node_modules/retry/index.js deleted file mode 100644 index ee62f3a112c28b..00000000000000 --- a/deps/npm/node_modules/retry/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./lib/retry'); \ No newline at end of file diff --git a/deps/npm/node_modules/retry/lib/retry.js b/deps/npm/node_modules/retry/lib/retry.js deleted file mode 100644 index dcb57680727948..00000000000000 --- a/deps/npm/node_modules/retry/lib/retry.js +++ /dev/null @@ -1,100 +0,0 @@ -var RetryOperation = require('./retry_operation'); - -exports.operation = function(options) { - var timeouts = exports.timeouts(options); - return new RetryOperation(timeouts, { - forever: options && options.forever, - unref: options && options.unref, - maxRetryTime: options && options.maxRetryTime - }); -}; - -exports.timeouts = function(options) { - if (options instanceof Array) { - return [].concat(options); - } - - var opts = { - retries: 10, - factor: 2, - minTimeout: 1 * 1000, - maxTimeout: Infinity, - randomize: false - }; - for (var key in options) { - opts[key] = options[key]; - } - - if (opts.minTimeout > opts.maxTimeout) { - throw new Error('minTimeout is greater than maxTimeout'); - } - - var timeouts = []; - for (var i = 0; i < opts.retries; i++) { - timeouts.push(this.createTimeout(i, opts)); - } - - if (options && options.forever && !timeouts.length) { - timeouts.push(this.createTimeout(i, opts)); - } - - // sort the array numerically ascending - timeouts.sort(function(a,b) { - return a - b; - }); - - return timeouts; -}; - -exports.createTimeout = function(attempt, opts) { - var random = (opts.randomize) - ? (Math.random() + 1) - : 1; - - var timeout = Math.round(random * opts.minTimeout * Math.pow(opts.factor, attempt)); - timeout = Math.min(timeout, opts.maxTimeout); - - return timeout; -}; - -exports.wrap = function(obj, options, methods) { - if (options instanceof Array) { - methods = options; - options = null; - } - - if (!methods) { - methods = []; - for (var key in obj) { - if (typeof obj[key] === 'function') { - methods.push(key); - } - } - } - - for (var i = 0; i < methods.length; i++) { - var method = methods[i]; - var original = obj[method]; - - obj[method] = function retryWrapper(original) { - var op = exports.operation(options); - var args = Array.prototype.slice.call(arguments, 1); - var callback = args.pop(); - - args.push(function(err) { - if (op.retry(err)) { - return; - } - if (err) { - arguments[0] = op.mainError(); - } - callback.apply(this, arguments); - }); - - op.attempt(function() { - original.apply(obj, args); - }); - }.bind(obj, original); - obj[method].options = options; - } -}; diff --git a/deps/npm/node_modules/retry/lib/retry_operation.js b/deps/npm/node_modules/retry/lib/retry_operation.js deleted file mode 100644 index 1e564696fe7e07..00000000000000 --- a/deps/npm/node_modules/retry/lib/retry_operation.js +++ /dev/null @@ -1,158 +0,0 @@ -function RetryOperation(timeouts, options) { - // Compatibility for the old (timeouts, retryForever) signature - if (typeof options === 'boolean') { - options = { forever: options }; - } - - this._originalTimeouts = JSON.parse(JSON.stringify(timeouts)); - this._timeouts = timeouts; - this._options = options || {}; - this._maxRetryTime = options && options.maxRetryTime || Infinity; - this._fn = null; - this._errors = []; - this._attempts = 1; - this._operationTimeout = null; - this._operationTimeoutCb = null; - this._timeout = null; - this._operationStart = null; - - if (this._options.forever) { - this._cachedTimeouts = this._timeouts.slice(0); - } -} -module.exports = RetryOperation; - -RetryOperation.prototype.reset = function() { - this._attempts = 1; - this._timeouts = this._originalTimeouts; -} - -RetryOperation.prototype.stop = function() { - if (this._timeout) { - clearTimeout(this._timeout); - } - - this._timeouts = []; - this._cachedTimeouts = null; -}; - -RetryOperation.prototype.retry = function(err) { - if (this._timeout) { - clearTimeout(this._timeout); - } - - if (!err) { - return false; - } - var currentTime = new Date().getTime(); - if (err && currentTime - this._operationStart >= this._maxRetryTime) { - this._errors.unshift(new Error('RetryOperation timeout occurred')); - return false; - } - - this._errors.push(err); - - var timeout = this._timeouts.shift(); - if (timeout === undefined) { - if (this._cachedTimeouts) { - // retry forever, only keep last error - this._errors.splice(this._errors.length - 1, this._errors.length); - this._timeouts = this._cachedTimeouts.slice(0); - timeout = this._timeouts.shift(); - } else { - return false; - } - } - - var self = this; - var timer = setTimeout(function() { - self._attempts++; - - if (self._operationTimeoutCb) { - self._timeout = setTimeout(function() { - self._operationTimeoutCb(self._attempts); - }, self._operationTimeout); - - if (self._options.unref) { - self._timeout.unref(); - } - } - - self._fn(self._attempts); - }, timeout); - - if (this._options.unref) { - timer.unref(); - } - - return true; -}; - -RetryOperation.prototype.attempt = function(fn, timeoutOps) { - this._fn = fn; - - if (timeoutOps) { - if (timeoutOps.timeout) { - this._operationTimeout = timeoutOps.timeout; - } - if (timeoutOps.cb) { - this._operationTimeoutCb = timeoutOps.cb; - } - } - - var self = this; - if (this._operationTimeoutCb) { - this._timeout = setTimeout(function() { - self._operationTimeoutCb(); - }, self._operationTimeout); - } - - this._operationStart = new Date().getTime(); - - this._fn(this._attempts); -}; - -RetryOperation.prototype.try = function(fn) { - console.log('Using RetryOperation.try() is deprecated'); - this.attempt(fn); -}; - -RetryOperation.prototype.start = function(fn) { - console.log('Using RetryOperation.start() is deprecated'); - this.attempt(fn); -}; - -RetryOperation.prototype.start = RetryOperation.prototype.try; - -RetryOperation.prototype.errors = function() { - return this._errors; -}; - -RetryOperation.prototype.attempts = function() { - return this._attempts; -}; - -RetryOperation.prototype.mainError = function() { - if (this._errors.length === 0) { - return null; - } - - var counts = {}; - var mainError = null; - var mainErrorCount = 0; - - for (var i = 0; i < this._errors.length; i++) { - var error = this._errors[i]; - var message = error.message; - var count = (counts[message] || 0) + 1; - - counts[message] = count; - - if (count >= mainErrorCount) { - mainError = error; - mainErrorCount = count; - } - } - - return mainError; -}; diff --git a/deps/npm/node_modules/retry/package.json b/deps/npm/node_modules/retry/package.json deleted file mode 100644 index 73c7259707aeef..00000000000000 --- a/deps/npm/node_modules/retry/package.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "author": "Tim Koschützki <tim@debuggable.com> (http://debuggable.com/)", - "name": "retry", - "description": "Abstraction for exponential and custom retry strategies for failed operations.", - "license": "MIT", - "version": "0.12.0", - "homepage": "https://github.com/tim-kos/node-retry", - "repository": { - "type": "git", - "url": "git://github.com/tim-kos/node-retry.git" - }, - "directories": { - "lib": "./lib" - }, - "main": "index", - "engines": { - "node": ">= 4" - }, - "dependencies": {}, - "devDependencies": { - "fake": "0.2.0", - "istanbul": "^0.4.5", - "tape": "^4.8.0" - }, - "scripts": { - "test": "./node_modules/.bin/istanbul cover ./node_modules/tape/bin/tape ./test/integration/*.js", - "release:major": "env SEMANTIC=major npm run release", - "release:minor": "env SEMANTIC=minor npm run release", - "release:patch": "env SEMANTIC=patch npm run release", - "release": "npm version ${SEMANTIC:-patch} -m \"Release %s\" && git push && git push --tags && npm publish" - } -} diff --git a/deps/npm/node_modules/retry/test/common.js b/deps/npm/node_modules/retry/test/common.js deleted file mode 100644 index 224720696ebac8..00000000000000 --- a/deps/npm/node_modules/retry/test/common.js +++ /dev/null @@ -1,10 +0,0 @@ -var common = module.exports; -var path = require('path'); - -var rootDir = path.join(__dirname, '..'); -common.dir = { - lib: rootDir + '/lib' -}; - -common.assert = require('assert'); -common.fake = require('fake'); \ No newline at end of file diff --git a/deps/npm/node_modules/retry/test/integration/test-forever.js b/deps/npm/node_modules/retry/test/integration/test-forever.js deleted file mode 100644 index b41307cb529f12..00000000000000 --- a/deps/npm/node_modules/retry/test/integration/test-forever.js +++ /dev/null @@ -1,24 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var retry = require(common.dir.lib + '/retry'); - -(function testForeverUsesFirstTimeout() { - var operation = retry.operation({ - retries: 0, - minTimeout: 100, - maxTimeout: 100, - forever: true - }); - - operation.attempt(function(numAttempt) { - console.log('>numAttempt', numAttempt); - var err = new Error("foo"); - if (numAttempt == 10) { - operation.stop(); - } - - if (operation.retry(err)) { - return; - } - }); -})(); diff --git a/deps/npm/node_modules/retry/test/integration/test-retry-operation.js b/deps/npm/node_modules/retry/test/integration/test-retry-operation.js deleted file mode 100644 index e351bb683ed449..00000000000000 --- a/deps/npm/node_modules/retry/test/integration/test-retry-operation.js +++ /dev/null @@ -1,258 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var fake = common.fake.create(); -var retry = require(common.dir.lib + '/retry'); - -(function testReset() { - var error = new Error('some error'); - var operation = retry.operation([1, 2, 3]); - var attempts = 0; - - var finalCallback = fake.callback('finalCallback'); - fake.expectAnytime(finalCallback); - - var expectedFinishes = 1; - var finishes = 0; - - var fn = function() { - operation.attempt(function(currentAttempt) { - attempts++; - assert.equal(currentAttempt, attempts); - if (operation.retry(error)) { - return; - } - - finishes++ - assert.equal(expectedFinishes, finishes); - assert.strictEqual(attempts, 4); - assert.strictEqual(operation.attempts(), attempts); - assert.strictEqual(operation.mainError(), error); - - if (finishes < 2) { - attempts = 0; - expectedFinishes++; - operation.reset(); - fn() - } else { - finalCallback(); - } - }); - }; - - fn(); -})(); - -(function testErrors() { - var operation = retry.operation(); - - var error = new Error('some error'); - var error2 = new Error('some other error'); - operation._errors.push(error); - operation._errors.push(error2); - - assert.deepEqual(operation.errors(), [error, error2]); -})(); - -(function testMainErrorReturnsMostFrequentError() { - var operation = retry.operation(); - var error = new Error('some error'); - var error2 = new Error('some other error'); - - operation._errors.push(error); - operation._errors.push(error2); - operation._errors.push(error); - - assert.strictEqual(operation.mainError(), error); -})(); - -(function testMainErrorReturnsLastErrorOnEqualCount() { - var operation = retry.operation(); - var error = new Error('some error'); - var error2 = new Error('some other error'); - - operation._errors.push(error); - operation._errors.push(error2); - - assert.strictEqual(operation.mainError(), error2); -})(); - -(function testAttempt() { - var operation = retry.operation(); - var fn = new Function(); - - var timeoutOpts = { - timeout: 1, - cb: function() {} - }; - operation.attempt(fn, timeoutOpts); - - assert.strictEqual(fn, operation._fn); - assert.strictEqual(timeoutOpts.timeout, operation._operationTimeout); - assert.strictEqual(timeoutOpts.cb, operation._operationTimeoutCb); -})(); - -(function testRetry() { - var error = new Error('some error'); - var operation = retry.operation([1, 2, 3]); - var attempts = 0; - - var finalCallback = fake.callback('finalCallback'); - fake.expectAnytime(finalCallback); - - var fn = function() { - operation.attempt(function(currentAttempt) { - attempts++; - assert.equal(currentAttempt, attempts); - if (operation.retry(error)) { - return; - } - - assert.strictEqual(attempts, 4); - assert.strictEqual(operation.attempts(), attempts); - assert.strictEqual(operation.mainError(), error); - finalCallback(); - }); - }; - - fn(); -})(); - -(function testRetryForever() { - var error = new Error('some error'); - var operation = retry.operation({ retries: 3, forever: true }); - var attempts = 0; - - var finalCallback = fake.callback('finalCallback'); - fake.expectAnytime(finalCallback); - - var fn = function() { - operation.attempt(function(currentAttempt) { - attempts++; - assert.equal(currentAttempt, attempts); - if (attempts !== 6 && operation.retry(error)) { - return; - } - - assert.strictEqual(attempts, 6); - assert.strictEqual(operation.attempts(), attempts); - assert.strictEqual(operation.mainError(), error); - finalCallback(); - }); - }; - - fn(); -})(); - -(function testRetryForeverNoRetries() { - var error = new Error('some error'); - var delay = 50 - var operation = retry.operation({ - retries: null, - forever: true, - minTimeout: delay, - maxTimeout: delay - }); - - var attempts = 0; - var startTime = new Date().getTime(); - - var finalCallback = fake.callback('finalCallback'); - fake.expectAnytime(finalCallback); - - var fn = function() { - operation.attempt(function(currentAttempt) { - attempts++; - assert.equal(currentAttempt, attempts); - if (attempts !== 4 && operation.retry(error)) { - return; - } - - var endTime = new Date().getTime(); - var minTime = startTime + (delay * 3); - var maxTime = minTime + 20 // add a little headroom for code execution time - assert(endTime >= minTime) - assert(endTime < maxTime) - assert.strictEqual(attempts, 4); - assert.strictEqual(operation.attempts(), attempts); - assert.strictEqual(operation.mainError(), error); - finalCallback(); - }); - }; - - fn(); -})(); - -(function testStop() { - var error = new Error('some error'); - var operation = retry.operation([1, 2, 3]); - var attempts = 0; - - var finalCallback = fake.callback('finalCallback'); - fake.expectAnytime(finalCallback); - - var fn = function() { - operation.attempt(function(currentAttempt) { - attempts++; - assert.equal(currentAttempt, attempts); - - if (attempts === 2) { - operation.stop(); - - assert.strictEqual(attempts, 2); - assert.strictEqual(operation.attempts(), attempts); - assert.strictEqual(operation.mainError(), error); - finalCallback(); - } - - if (operation.retry(error)) { - return; - } - }); - }; - - fn(); -})(); - -(function testMaxRetryTime() { - var error = new Error('some error'); - var maxRetryTime = 30; - var operation = retry.operation({ - minTimeout: 1, - maxRetryTime: maxRetryTime - }); - var attempts = 0; - - var finalCallback = fake.callback('finalCallback'); - fake.expectAnytime(finalCallback); - - var longAsyncFunction = function (wait, callback){ - setTimeout(callback, wait); - }; - - var fn = function() { - var startTime = new Date().getTime(); - operation.attempt(function(currentAttempt) { - attempts++; - assert.equal(currentAttempt, attempts); - - if (attempts !== 2) { - if (operation.retry(error)) { - return; - } - } else { - var curTime = new Date().getTime(); - longAsyncFunction(maxRetryTime - (curTime - startTime - 1), function(){ - if (operation.retry(error)) { - assert.fail('timeout should be occurred'); - return; - } - - assert.strictEqual(operation.mainError(), error); - finalCallback(); - }); - } - }); - }; - - fn(); -})(); diff --git a/deps/npm/node_modules/retry/test/integration/test-retry-wrap.js b/deps/npm/node_modules/retry/test/integration/test-retry-wrap.js deleted file mode 100644 index 3d2b6bfa6436d2..00000000000000 --- a/deps/npm/node_modules/retry/test/integration/test-retry-wrap.js +++ /dev/null @@ -1,101 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var fake = common.fake.create(); -var retry = require(common.dir.lib + '/retry'); - -function getLib() { - return { - fn1: function() {}, - fn2: function() {}, - fn3: function() {} - }; -} - -(function wrapAll() { - var lib = getLib(); - retry.wrap(lib); - assert.equal(lib.fn1.name, 'bound retryWrapper'); - assert.equal(lib.fn2.name, 'bound retryWrapper'); - assert.equal(lib.fn3.name, 'bound retryWrapper'); -}()); - -(function wrapAllPassOptions() { - var lib = getLib(); - retry.wrap(lib, {retries: 2}); - assert.equal(lib.fn1.name, 'bound retryWrapper'); - assert.equal(lib.fn2.name, 'bound retryWrapper'); - assert.equal(lib.fn3.name, 'bound retryWrapper'); - assert.equal(lib.fn1.options.retries, 2); - assert.equal(lib.fn2.options.retries, 2); - assert.equal(lib.fn3.options.retries, 2); -}()); - -(function wrapDefined() { - var lib = getLib(); - retry.wrap(lib, ['fn2', 'fn3']); - assert.notEqual(lib.fn1.name, 'bound retryWrapper'); - assert.equal(lib.fn2.name, 'bound retryWrapper'); - assert.equal(lib.fn3.name, 'bound retryWrapper'); -}()); - -(function wrapDefinedAndPassOptions() { - var lib = getLib(); - retry.wrap(lib, {retries: 2}, ['fn2', 'fn3']); - assert.notEqual(lib.fn1.name, 'bound retryWrapper'); - assert.equal(lib.fn2.name, 'bound retryWrapper'); - assert.equal(lib.fn3.name, 'bound retryWrapper'); - assert.equal(lib.fn2.options.retries, 2); - assert.equal(lib.fn3.options.retries, 2); -}()); - -(function runWrappedWithoutError() { - var callbackCalled; - var lib = {method: function(a, b, callback) { - assert.equal(a, 1); - assert.equal(b, 2); - assert.equal(typeof callback, 'function'); - callback(); - }}; - retry.wrap(lib); - lib.method(1, 2, function() { - callbackCalled = true; - }); - assert.ok(callbackCalled); -}()); - -(function runWrappedSeveralWithoutError() { - var callbacksCalled = 0; - var lib = { - fn1: function (a, callback) { - assert.equal(a, 1); - assert.equal(typeof callback, 'function'); - callback(); - }, - fn2: function (a, callback) { - assert.equal(a, 2); - assert.equal(typeof callback, 'function'); - callback(); - } - }; - retry.wrap(lib, {}, ['fn1', 'fn2']); - lib.fn1(1, function() { - callbacksCalled++; - }); - lib.fn2(2, function() { - callbacksCalled++; - }); - assert.equal(callbacksCalled, 2); -}()); - -(function runWrappedWithError() { - var callbackCalled; - var lib = {method: function(callback) { - callback(new Error('Some error')); - }}; - retry.wrap(lib, {retries: 1}); - lib.method(function(err) { - callbackCalled = true; - assert.ok(err instanceof Error); - }); - assert.ok(!callbackCalled); -}()); diff --git a/deps/npm/node_modules/retry/test/integration/test-timeouts.js b/deps/npm/node_modules/retry/test/integration/test-timeouts.js deleted file mode 100644 index 7206b0fb0b01d0..00000000000000 --- a/deps/npm/node_modules/retry/test/integration/test-timeouts.js +++ /dev/null @@ -1,69 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var retry = require(common.dir.lib + '/retry'); - -(function testDefaultValues() { - var timeouts = retry.timeouts(); - - assert.equal(timeouts.length, 10); - assert.equal(timeouts[0], 1000); - assert.equal(timeouts[1], 2000); - assert.equal(timeouts[2], 4000); -})(); - -(function testDefaultValuesWithRandomize() { - var minTimeout = 5000; - var timeouts = retry.timeouts({ - minTimeout: minTimeout, - randomize: true - }); - - assert.equal(timeouts.length, 10); - assert.ok(timeouts[0] > minTimeout); - assert.ok(timeouts[1] > timeouts[0]); - assert.ok(timeouts[2] > timeouts[1]); -})(); - -(function testPassedTimeoutsAreUsed() { - var timeoutsArray = [1000, 2000, 3000]; - var timeouts = retry.timeouts(timeoutsArray); - assert.deepEqual(timeouts, timeoutsArray); - assert.notStrictEqual(timeouts, timeoutsArray); -})(); - -(function testTimeoutsAreWithinBoundaries() { - var minTimeout = 1000; - var maxTimeout = 10000; - var timeouts = retry.timeouts({ - minTimeout: minTimeout, - maxTimeout: maxTimeout - }); - for (var i = 0; i < timeouts; i++) { - assert.ok(timeouts[i] >= minTimeout); - assert.ok(timeouts[i] <= maxTimeout); - } -})(); - -(function testTimeoutsAreIncremental() { - var timeouts = retry.timeouts(); - var lastTimeout = timeouts[0]; - for (var i = 0; i < timeouts; i++) { - assert.ok(timeouts[i] > lastTimeout); - lastTimeout = timeouts[i]; - } -})(); - -(function testTimeoutsAreIncrementalForFactorsLessThanOne() { - var timeouts = retry.timeouts({ - retries: 3, - factor: 0.5 - }); - - var expected = [250, 500, 1000]; - assert.deepEqual(expected, timeouts); -})(); - -(function testRetries() { - var timeouts = retry.timeouts({retries: 2}); - assert.strictEqual(timeouts.length, 2); -})(); diff --git a/deps/npm/node_modules/tar/dist/commonjs/index.min.js b/deps/npm/node_modules/tar/dist/commonjs/index.min.js index 4ae8fa0dbc3e38..d7e71f819af1a5 100644 --- a/deps/npm/node_modules/tar/dist/commonjs/index.min.js +++ b/deps/npm/node_modules/tar/dist/commonjs/index.min.js @@ -1,4 +1,4 @@ -"use strict";var d=(s,e)=>()=>(e||s((e={exports:{}}).exports,e),e.exports);var We=d(C=>{"use strict";var yo=C&&C.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(C,"__esModule",{value:!0});C.Minipass=C.isWritable=C.isReadable=C.isStream=void 0;var Br=typeof process=="object"&&process?process:{stdout:null,stderr:null},es=require("node:events"),xr=yo(require("node:stream")),Eo=require("node:string_decoder"),bo=s=>!!s&&typeof s=="object"&&(s instanceof Wt||s instanceof xr.default||(0,C.isReadable)(s)||(0,C.isWritable)(s));C.isStream=bo;var So=s=>!!s&&typeof s=="object"&&s instanceof es.EventEmitter&&typeof s.pipe=="function"&&s.pipe!==xr.default.Writable.prototype.pipe;C.isReadable=So;var go=s=>!!s&&typeof s=="object"&&s instanceof es.EventEmitter&&typeof s.write=="function"&&typeof s.end=="function";C.isWritable=go;var le=Symbol("EOF"),ue=Symbol("maybeEmitEnd"),_e=Symbol("emittedEnd"),zt=Symbol("emittingEnd"),ft=Symbol("emittedError"),kt=Symbol("closed"),zr=Symbol("read"),jt=Symbol("flush"),kr=Symbol("flushChunk"),K=Symbol("encoding"),Ue=Symbol("decoder"),R=Symbol("flowing"),dt=Symbol("paused"),qe=Symbol("resume"),O=Symbol("buffer"),I=Symbol("pipes"),v=Symbol("bufferLength"),Ki=Symbol("bufferPush"),xt=Symbol("bufferShift"),N=Symbol("objectMode"),y=Symbol("destroyed"),Vi=Symbol("error"),$i=Symbol("emitData"),jr=Symbol("emitEnd"),Xi=Symbol("emitEnd2"),J=Symbol("async"),Qi=Symbol("abort"),Ut=Symbol("aborted"),mt=Symbol("signal"),Pe=Symbol("dataListeners"),k=Symbol("discarded"),pt=s=>Promise.resolve().then(s),Ro=s=>s(),Oo=s=>s==="end"||s==="finish"||s==="prefinish",vo=s=>s instanceof ArrayBuffer||!!s&&typeof s=="object"&&s.constructor&&s.constructor.name==="ArrayBuffer"&&s.byteLength>=0,To=s=>!Buffer.isBuffer(s)&&ArrayBuffer.isView(s),qt=class{src;dest;opts;ondrain;constructor(e,t,i){this.src=e,this.dest=t,this.opts=i,this.ondrain=()=>e[qe](),this.dest.on("drain",this.ondrain)}unpipe(){this.dest.removeListener("drain",this.ondrain)}proxyErrors(e){}end(){this.unpipe(),this.opts.end&&this.dest.end()}},Ji=class extends qt{unpipe(){this.src.removeListener("error",this.proxyErrors),super.unpipe()}constructor(e,t,i){super(e,t,i),this.proxyErrors=r=>t.emit("error",r),e.on("error",this.proxyErrors)}},Do=s=>!!s.objectMode,Po=s=>!s.objectMode&&!!s.encoding&&s.encoding!=="buffer",Wt=class extends es.EventEmitter{[R]=!1;[dt]=!1;[I]=[];[O]=[];[N];[K];[J];[Ue];[le]=!1;[_e]=!1;[zt]=!1;[kt]=!1;[ft]=null;[v]=0;[y]=!1;[mt];[Ut]=!1;[Pe]=0;[k]=!1;writable=!0;readable=!0;constructor(...e){let t=e[0]||{};if(super(),t.objectMode&&typeof t.encoding=="string")throw new TypeError("Encoding and objectMode may not be used together");Do(t)?(this[N]=!0,this[K]=null):Po(t)?(this[K]=t.encoding,this[N]=!1):(this[N]=!1,this[K]=null),this[J]=!!t.async,this[Ue]=this[K]?new Eo.StringDecoder(this[K]):null,t&&t.debugExposeBuffer===!0&&Object.defineProperty(this,"buffer",{get:()=>this[O]}),t&&t.debugExposePipes===!0&&Object.defineProperty(this,"pipes",{get:()=>this[I]});let{signal:i}=t;i&&(this[mt]=i,i.aborted?this[Qi]():i.addEventListener("abort",()=>this[Qi]()))}get bufferLength(){return this[v]}get encoding(){return this[K]}set encoding(e){throw new Error("Encoding must be set at instantiation time")}setEncoding(e){throw new Error("Encoding must be set at instantiation time")}get objectMode(){return this[N]}set objectMode(e){throw new Error("objectMode must be set at instantiation time")}get async(){return this[J]}set async(e){this[J]=this[J]||!!e}[Qi](){this[Ut]=!0,this.emit("abort",this[mt]?.reason),this.destroy(this[mt]?.reason)}get aborted(){return this[Ut]}set aborted(e){}write(e,t,i){if(this[Ut])return!1;if(this[le])throw new Error("write after end");if(this[y])return this.emit("error",Object.assign(new Error("Cannot call write after a stream was destroyed"),{code:"ERR_STREAM_DESTROYED"})),!0;typeof t=="function"&&(i=t,t="utf8"),t||(t="utf8");let r=this[J]?pt:Ro;if(!this[N]&&!Buffer.isBuffer(e)){if(To(e))e=Buffer.from(e.buffer,e.byteOffset,e.byteLength);else if(vo(e))e=Buffer.from(e);else if(typeof e!="string")throw new Error("Non-contiguous data written to non-objectMode stream")}return this[N]?(this[R]&&this[v]!==0&&this[jt](!0),this[R]?this.emit("data",e):this[Ki](e),this[v]!==0&&this.emit("readable"),i&&r(i),this[R]):e.length?(typeof e=="string"&&!(t===this[K]&&!this[Ue]?.lastNeed)&&(e=Buffer.from(e,t)),Buffer.isBuffer(e)&&this[K]&&(e=this[Ue].write(e)),this[R]&&this[v]!==0&&this[jt](!0),this[R]?this.emit("data",e):this[Ki](e),this[v]!==0&&this.emit("readable"),i&&r(i),this[R]):(this[v]!==0&&this.emit("readable"),i&&r(i),this[R])}read(e){if(this[y])return null;if(this[k]=!1,this[v]===0||e===0||e&&e>this[v])return this[ue](),null;this[N]&&(e=null),this[O].length>1&&!this[N]&&(this[O]=[this[K]?this[O].join(""):Buffer.concat(this[O],this[v])]);let t=this[zr](e||null,this[O][0]);return this[ue](),t}[zr](e,t){if(this[N])this[xt]();else{let i=t;e===i.length||e===null?this[xt]():typeof i=="string"?(this[O][0]=i.slice(e),t=i.slice(0,e),this[v]-=e):(this[O][0]=i.subarray(e),t=i.subarray(0,e),this[v]-=e)}return this.emit("data",t),!this[O].length&&!this[le]&&this.emit("drain"),t}end(e,t,i){return typeof e=="function"&&(i=e,e=void 0),typeof t=="function"&&(i=t,t="utf8"),e!==void 0&&this.write(e,t),i&&this.once("end",i),this[le]=!0,this.writable=!1,(this[R]||!this[dt])&&this[ue](),this}[qe](){this[y]||(!this[Pe]&&!this[I].length&&(this[k]=!0),this[dt]=!1,this[R]=!0,this.emit("resume"),this[O].length?this[jt]():this[le]?this[ue]():this.emit("drain"))}resume(){return this[qe]()}pause(){this[R]=!1,this[dt]=!0,this[k]=!1}get destroyed(){return this[y]}get flowing(){return this[R]}get paused(){return this[dt]}[Ki](e){this[N]?this[v]+=1:this[v]+=e.length,this[O].push(e)}[xt](){return this[N]?this[v]-=1:this[v]-=this[O][0].length,this[O].shift()}[jt](e=!1){do;while(this[kr](this[xt]())&&this[O].length);!e&&!this[O].length&&!this[le]&&this.emit("drain")}[kr](e){return this.emit("data",e),this[R]}pipe(e,t){if(this[y])return e;this[k]=!1;let i=this[_e];return t=t||{},e===Br.stdout||e===Br.stderr?t.end=!1:t.end=t.end!==!1,t.proxyErrors=!!t.proxyErrors,i?t.end&&e.end():(this[I].push(t.proxyErrors?new Ji(this,e,t):new qt(this,e,t)),this[J]?pt(()=>this[qe]()):this[qe]()),e}unpipe(e){let t=this[I].find(i=>i.dest===e);t&&(this[I].length===1?(this[R]&&this[Pe]===0&&(this[R]=!1),this[I]=[]):this[I].splice(this[I].indexOf(t),1),t.unpipe())}addListener(e,t){return this.on(e,t)}on(e,t){let i=super.on(e,t);if(e==="data")this[k]=!1,this[Pe]++,!this[I].length&&!this[R]&&this[qe]();else if(e==="readable"&&this[v]!==0)super.emit("readable");else if(Oo(e)&&this[_e])super.emit(e),this.removeAllListeners(e);else if(e==="error"&&this[ft]){let r=t;this[J]?pt(()=>r.call(this,this[ft])):r.call(this,this[ft])}return i}removeListener(e,t){return this.off(e,t)}off(e,t){let i=super.off(e,t);return e==="data"&&(this[Pe]=this.listeners("data").length,this[Pe]===0&&!this[k]&&!this[I].length&&(this[R]=!1)),i}removeAllListeners(e){let t=super.removeAllListeners(e);return(e==="data"||e===void 0)&&(this[Pe]=0,!this[k]&&!this[I].length&&(this[R]=!1)),t}get emittedEnd(){return this[_e]}[ue](){!this[zt]&&!this[_e]&&!this[y]&&this[O].length===0&&this[le]&&(this[zt]=!0,this.emit("end"),this.emit("prefinish"),this.emit("finish"),this[kt]&&this.emit("close"),this[zt]=!1)}emit(e,...t){let i=t[0];if(e!=="error"&&e!=="close"&&e!==y&&this[y])return!1;if(e==="data")return!this[N]&&!i?!1:this[J]?(pt(()=>this[$i](i)),!0):this[$i](i);if(e==="end")return this[jr]();if(e==="close"){if(this[kt]=!0,!this[_e]&&!this[y])return!1;let n=super.emit("close");return this.removeAllListeners("close"),n}else if(e==="error"){this[ft]=i,super.emit(Vi,i);let n=!this[mt]||this.listeners("error").length?super.emit("error",i):!1;return this[ue](),n}else if(e==="resume"){let n=super.emit("resume");return this[ue](),n}else if(e==="finish"||e==="prefinish"){let n=super.emit(e);return this.removeAllListeners(e),n}let r=super.emit(e,...t);return this[ue](),r}[$i](e){for(let i of this[I])i.dest.write(e)===!1&&this.pause();let t=this[k]?!1:super.emit("data",e);return this[ue](),t}[jr](){return this[_e]?!1:(this[_e]=!0,this.readable=!1,this[J]?(pt(()=>this[Xi]()),!0):this[Xi]())}[Xi](){if(this[Ue]){let t=this[Ue].end();if(t){for(let i of this[I])i.dest.write(t);this[k]||super.emit("data",t)}}for(let t of this[I])t.end();let e=super.emit("end");return this.removeAllListeners("end"),e}async collect(){let e=Object.assign([],{dataLength:0});this[N]||(e.dataLength=0);let t=this.promise();return this.on("data",i=>{e.push(i),this[N]||(e.dataLength+=i.length)}),await t,e}async concat(){if(this[N])throw new Error("cannot concat in objectMode");let e=await this.collect();return this[K]?e.join(""):Buffer.concat(e,e.dataLength)}async promise(){return new Promise((e,t)=>{this.on(y,()=>t(new Error("stream destroyed"))),this.on("error",i=>t(i)),this.on("end",()=>e())})}[Symbol.asyncIterator](){this[k]=!1;let e=!1,t=async()=>(this.pause(),e=!0,{value:void 0,done:!0});return{next:()=>{if(e)return t();let r=this.read();if(r!==null)return Promise.resolve({done:!1,value:r});if(this[le])return t();let n,o,a=c=>{this.off("data",h),this.off("end",l),this.off(y,u),t(),o(c)},h=c=>{this.off("error",a),this.off("end",l),this.off(y,u),this.pause(),n({value:c,done:!!this[le]})},l=()=>{this.off("error",a),this.off("data",h),this.off(y,u),t(),n({done:!0,value:void 0})},u=()=>a(new Error("stream destroyed"));return new Promise((c,E)=>{o=E,n=c,this.once(y,u),this.once("error",a),this.once("end",l),this.once("data",h)})},throw:t,return:t,[Symbol.asyncIterator](){return this}}}[Symbol.iterator](){this[k]=!1;let e=!1,t=()=>(this.pause(),this.off(Vi,t),this.off(y,t),this.off("end",t),e=!0,{done:!0,value:void 0}),i=()=>{if(e)return t();let r=this.read();return r===null?t():{done:!1,value:r}};return this.once("end",t),this.once(Vi,t),this.once(y,t),{next:i,throw:t,return:t,[Symbol.iterator](){return this}}}destroy(e){if(this[y])return e?this.emit("error",e):this.emit(y),this;this[y]=!0,this[k]=!0,this[O].length=0,this[v]=0;let t=this;return typeof t.close=="function"&&!this[kt]&&t.close(),e?this.emit("error",e):this.emit(y),this}static get isStream(){return C.isStream}};C.Minipass=Wt});var Ke=d(W=>{"use strict";var Ur=W&&W.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(W,"__esModule",{value:!0});W.WriteStreamSync=W.WriteStream=W.ReadStreamSync=W.ReadStream=void 0;var No=Ur(require("events")),B=Ur(require("fs")),Mo=We(),Lo=B.default.writev,ye=Symbol("_autoClose"),$=Symbol("_close"),_t=Symbol("_ended"),p=Symbol("_fd"),ts=Symbol("_finished"),fe=Symbol("_flags"),is=Symbol("_flush"),os=Symbol("_handleChunk"),as=Symbol("_makeBuf"),yt=Symbol("_mode"),Ht=Symbol("_needDrain"),Ge=Symbol("_onerror"),Ye=Symbol("_onopen"),ss=Symbol("_onread"),He=Symbol("_onwrite"),Ee=Symbol("_open"),V=Symbol("_path"),we=Symbol("_pos"),ee=Symbol("_queue"),Ze=Symbol("_read"),rs=Symbol("_readSize"),ce=Symbol("_reading"),wt=Symbol("_remain"),ns=Symbol("_size"),Zt=Symbol("_write"),Ne=Symbol("_writing"),Gt=Symbol("_defaultFlag"),Me=Symbol("_errored"),Yt=class extends Mo.Minipass{[Me]=!1;[p];[V];[rs];[ce]=!1;[ns];[wt];[ye];constructor(e,t){if(t=t||{},super(t),this.readable=!0,this.writable=!1,typeof e!="string")throw new TypeError("path must be a string");this[Me]=!1,this[p]=typeof t.fd=="number"?t.fd:void 0,this[V]=e,this[rs]=t.readSize||16*1024*1024,this[ce]=!1,this[ns]=typeof t.size=="number"?t.size:1/0,this[wt]=this[ns],this[ye]=typeof t.autoClose=="boolean"?t.autoClose:!0,typeof this[p]=="number"?this[Ze]():this[Ee]()}get fd(){return this[p]}get path(){return this[V]}write(){throw new TypeError("this is a readable stream")}end(){throw new TypeError("this is a readable stream")}[Ee](){B.default.open(this[V],"r",(e,t)=>this[Ye](e,t))}[Ye](e,t){e?this[Ge](e):(this[p]=t,this.emit("open",t),this[Ze]())}[as](){return Buffer.allocUnsafe(Math.min(this[rs],this[wt]))}[Ze](){if(!this[ce]){this[ce]=!0;let e=this[as]();if(e.length===0)return process.nextTick(()=>this[ss](null,0,e));B.default.read(this[p],e,0,e.length,null,(t,i,r)=>this[ss](t,i,r))}}[ss](e,t,i){this[ce]=!1,e?this[Ge](e):this[os](t,i)&&this[Ze]()}[$](){if(this[ye]&&typeof this[p]=="number"){let e=this[p];this[p]=void 0,B.default.close(e,t=>t?this.emit("error",t):this.emit("close"))}}[Ge](e){this[ce]=!0,this[$](),this.emit("error",e)}[os](e,t){let i=!1;return this[wt]-=e,e>0&&(i=super.write(e<t.length?t.subarray(0,e):t)),(e===0||this[wt]<=0)&&(i=!1,this[$](),super.end()),i}emit(e,...t){switch(e){case"prefinish":case"finish":return!1;case"drain":return typeof this[p]=="number"&&this[Ze](),!1;case"error":return this[Me]?!1:(this[Me]=!0,super.emit(e,...t));default:return super.emit(e,...t)}}};W.ReadStream=Yt;var hs=class extends Yt{[Ee](){let e=!0;try{this[Ye](null,B.default.openSync(this[V],"r")),e=!1}finally{e&&this[$]()}}[Ze](){let e=!0;try{if(!this[ce]){this[ce]=!0;do{let t=this[as](),i=t.length===0?0:B.default.readSync(this[p],t,0,t.length,null);if(!this[os](i,t))break}while(!0);this[ce]=!1}e=!1}finally{e&&this[$]()}}[$](){if(this[ye]&&typeof this[p]=="number"){let e=this[p];this[p]=void 0,B.default.closeSync(e),this.emit("close")}}};W.ReadStreamSync=hs;var Kt=class extends No.default{readable=!1;writable=!0;[Me]=!1;[Ne]=!1;[_t]=!1;[ee]=[];[Ht]=!1;[V];[yt];[ye];[p];[Gt];[fe];[ts]=!1;[we];constructor(e,t){t=t||{},super(t),this[V]=e,this[p]=typeof t.fd=="number"?t.fd:void 0,this[yt]=t.mode===void 0?438:t.mode,this[we]=typeof t.start=="number"?t.start:void 0,this[ye]=typeof t.autoClose=="boolean"?t.autoClose:!0;let i=this[we]!==void 0?"r+":"w";this[Gt]=t.flags===void 0,this[fe]=t.flags===void 0?i:t.flags,this[p]===void 0&&this[Ee]()}emit(e,...t){if(e==="error"){if(this[Me])return!1;this[Me]=!0}return super.emit(e,...t)}get fd(){return this[p]}get path(){return this[V]}[Ge](e){this[$](),this[Ne]=!0,this.emit("error",e)}[Ee](){B.default.open(this[V],this[fe],this[yt],(e,t)=>this[Ye](e,t))}[Ye](e,t){this[Gt]&&this[fe]==="r+"&&e&&e.code==="ENOENT"?(this[fe]="w",this[Ee]()):e?this[Ge](e):(this[p]=t,this.emit("open",t),this[Ne]||this[is]())}end(e,t){return e&&this.write(e,t),this[_t]=!0,!this[Ne]&&!this[ee].length&&typeof this[p]=="number"&&this[He](null,0),this}write(e,t){return typeof e=="string"&&(e=Buffer.from(e,t)),this[_t]?(this.emit("error",new Error("write() after end()")),!1):this[p]===void 0||this[Ne]||this[ee].length?(this[ee].push(e),this[Ht]=!0,!1):(this[Ne]=!0,this[Zt](e),!0)}[Zt](e){B.default.write(this[p],e,0,e.length,this[we],(t,i)=>this[He](t,i))}[He](e,t){e?this[Ge](e):(this[we]!==void 0&&typeof t=="number"&&(this[we]+=t),this[ee].length?this[is]():(this[Ne]=!1,this[_t]&&!this[ts]?(this[ts]=!0,this[$](),this.emit("finish")):this[Ht]&&(this[Ht]=!1,this.emit("drain"))))}[is](){if(this[ee].length===0)this[_t]&&this[He](null,0);else if(this[ee].length===1)this[Zt](this[ee].pop());else{let e=this[ee];this[ee]=[],Lo(this[p],e,this[we],(t,i)=>this[He](t,i))}}[$](){if(this[ye]&&typeof this[p]=="number"){let e=this[p];this[p]=void 0,B.default.close(e,t=>t?this.emit("error",t):this.emit("close"))}}};W.WriteStream=Kt;var ls=class extends Kt{[Ee](){let e;if(this[Gt]&&this[fe]==="r+")try{e=B.default.openSync(this[V],this[fe],this[yt])}catch(t){if(t?.code==="ENOENT")return this[fe]="w",this[Ee]();throw t}else e=B.default.openSync(this[V],this[fe],this[yt]);this[Ye](null,e)}[$](){if(this[ye]&&typeof this[p]=="number"){let e=this[p];this[p]=void 0,B.default.closeSync(e),this.emit("close")}}[Zt](e){let t=!0;try{this[He](null,B.default.writeSync(this[p],e,0,e.length,this[we])),t=!1}finally{if(t)try{this[$]()}catch{}}}};W.WriteStreamSync=ls});var Vt=d(b=>{"use strict";Object.defineProperty(b,"__esModule",{value:!0});b.dealias=b.isNoFile=b.isFile=b.isAsync=b.isSync=b.isAsyncNoFile=b.isSyncNoFile=b.isAsyncFile=b.isSyncFile=void 0;var Ao=new Map([["C","cwd"],["f","file"],["z","gzip"],["P","preservePaths"],["U","unlink"],["strip-components","strip"],["stripComponents","strip"],["keep-newer","newer"],["keepNewer","newer"],["keep-newer-files","newer"],["keepNewerFiles","newer"],["k","keep"],["keep-existing","keep"],["keepExisting","keep"],["m","noMtime"],["no-mtime","noMtime"],["p","preserveOwner"],["L","follow"],["h","follow"],["onentry","onReadEntry"]]),Io=s=>!!s.sync&&!!s.file;b.isSyncFile=Io;var Co=s=>!s.sync&&!!s.file;b.isAsyncFile=Co;var Fo=s=>!!s.sync&&!s.file;b.isSyncNoFile=Fo;var Bo=s=>!s.sync&&!s.file;b.isAsyncNoFile=Bo;var zo=s=>!!s.sync;b.isSync=zo;var ko=s=>!s.sync;b.isAsync=ko;var jo=s=>!!s.file;b.isFile=jo;var xo=s=>!s.file;b.isNoFile=xo;var Uo=s=>{let e=Ao.get(s);return e||s},qo=(s={})=>{if(!s)return{};let e={};for(let[t,i]of Object.entries(s)){let r=Uo(t);e[r]=i}return e.chmod===void 0&&e.noChmod===!1&&(e.chmod=!0),delete e.noChmod,e};b.dealias=qo});var Ve=d($t=>{"use strict";Object.defineProperty($t,"__esModule",{value:!0});$t.makeCommand=void 0;var Et=Vt(),Wo=(s,e,t,i,r)=>Object.assign((n=[],o,a)=>{Array.isArray(n)&&(o=n,n={}),typeof o=="function"&&(a=o,o=void 0),o?o=Array.from(o):o=[];let h=(0,Et.dealias)(n);if(r?.(h,o),(0,Et.isSyncFile)(h)){if(typeof a=="function")throw new TypeError("callback not supported for sync tar functions");return s(h,o)}else if((0,Et.isAsyncFile)(h)){let l=e(h,o),u=a||void 0;return u?l.then(()=>u(),u):l}else if((0,Et.isSyncNoFile)(h)){if(typeof a=="function")throw new TypeError("callback not supported for sync tar functions");return t(h,o)}else if((0,Et.isAsyncNoFile)(h)){if(typeof a=="function")throw new TypeError("callback only supported with file option");return i(h,o)}else throw new Error("impossible options??")},{syncFile:s,asyncFile:e,syncNoFile:t,asyncNoFile:i,validate:r});$t.makeCommand=Wo});var us=d($e=>{"use strict";var Ho=$e&&$e.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty($e,"__esModule",{value:!0});$e.constants=void 0;var Zo=Ho(require("zlib")),Go=Zo.default.constants||{ZLIB_VERNUM:4736};$e.constants=Object.freeze(Object.assign(Object.create(null),{Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_VERSION_ERROR:-6,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,DEFLATE:1,INFLATE:2,GZIP:3,GUNZIP:4,DEFLATERAW:5,INFLATERAW:6,UNZIP:7,BROTLI_DECODE:8,BROTLI_ENCODE:9,Z_MIN_WINDOWBITS:8,Z_MAX_WINDOWBITS:15,Z_DEFAULT_WINDOWBITS:15,Z_MIN_CHUNK:64,Z_MAX_CHUNK:1/0,Z_DEFAULT_CHUNK:16384,Z_MIN_MEMLEVEL:1,Z_MAX_MEMLEVEL:9,Z_DEFAULT_MEMLEVEL:8,Z_MIN_LEVEL:-1,Z_MAX_LEVEL:9,Z_DEFAULT_LEVEL:-1,BROTLI_OPERATION_PROCESS:0,BROTLI_OPERATION_FLUSH:1,BROTLI_OPERATION_FINISH:2,BROTLI_OPERATION_EMIT_METADATA:3,BROTLI_MODE_GENERIC:0,BROTLI_MODE_TEXT:1,BROTLI_MODE_FONT:2,BROTLI_DEFAULT_MODE:0,BROTLI_MIN_QUALITY:0,BROTLI_MAX_QUALITY:11,BROTLI_DEFAULT_QUALITY:11,BROTLI_MIN_WINDOW_BITS:10,BROTLI_MAX_WINDOW_BITS:24,BROTLI_LARGE_MAX_WINDOW_BITS:30,BROTLI_DEFAULT_WINDOW:22,BROTLI_MIN_INPUT_BLOCK_BITS:16,BROTLI_MAX_INPUT_BLOCK_BITS:24,BROTLI_PARAM_MODE:0,BROTLI_PARAM_QUALITY:1,BROTLI_PARAM_LGWIN:2,BROTLI_PARAM_LGBLOCK:3,BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING:4,BROTLI_PARAM_SIZE_HINT:5,BROTLI_PARAM_LARGE_WINDOW:6,BROTLI_PARAM_NPOSTFIX:7,BROTLI_PARAM_NDIRECT:8,BROTLI_DECODER_RESULT_ERROR:0,BROTLI_DECODER_RESULT_SUCCESS:1,BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT:2,BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION:0,BROTLI_DECODER_PARAM_LARGE_WINDOW:1,BROTLI_DECODER_NO_ERROR:0,BROTLI_DECODER_SUCCESS:1,BROTLI_DECODER_NEEDS_MORE_INPUT:2,BROTLI_DECODER_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE:-1,BROTLI_DECODER_ERROR_FORMAT_RESERVED:-2,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE:-3,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET:-4,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME:-5,BROTLI_DECODER_ERROR_FORMAT_CL_SPACE:-6,BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE:-7,BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT:-8,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1:-9,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2:-10,BROTLI_DECODER_ERROR_FORMAT_TRANSFORM:-11,BROTLI_DECODER_ERROR_FORMAT_DICTIONARY:-12,BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS:-13,BROTLI_DECODER_ERROR_FORMAT_PADDING_1:-14,BROTLI_DECODER_ERROR_FORMAT_PADDING_2:-15,BROTLI_DECODER_ERROR_FORMAT_DISTANCE:-16,BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET:-19,BROTLI_DECODER_ERROR_INVALID_ARGUMENTS:-20,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES:-21,BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS:-22,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP:-25,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1:-26,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2:-27,BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES:-30,BROTLI_DECODER_ERROR_UNREACHABLE:-31},Go))});var vs=d(f=>{"use strict";var Yo=f&&f.__createBinding||(Object.create?(function(s,e,t,i){i===void 0&&(i=t);var r=Object.getOwnPropertyDescriptor(e,t);(!r||("get"in r?!e.__esModule:r.writable||r.configurable))&&(r={enumerable:!0,get:function(){return e[t]}}),Object.defineProperty(s,i,r)}):(function(s,e,t,i){i===void 0&&(i=t),s[i]=e[t]})),Ko=f&&f.__setModuleDefault||(Object.create?(function(s,e){Object.defineProperty(s,"default",{enumerable:!0,value:e})}):function(s,e){s.default=e}),Vo=f&&f.__importStar||(function(){var s=function(e){return s=Object.getOwnPropertyNames||function(t){var i=[];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(i[i.length]=r);return i},s(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var i=s(e),r=0;r<i.length;r++)i[r]!=="default"&&Yo(t,e,i[r]);return Ko(t,e),t}})(),$o=f&&f.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(f,"__esModule",{value:!0});f.ZstdDecompress=f.ZstdCompress=f.BrotliDecompress=f.BrotliCompress=f.Unzip=f.InflateRaw=f.DeflateRaw=f.Gunzip=f.Gzip=f.Inflate=f.Deflate=f.Zlib=f.ZlibError=f.constants=void 0;var ds=$o(require("assert")),Le=require("buffer"),Xo=We(),qr=Vo(require("zlib")),te=us(),Qo=us();Object.defineProperty(f,"constants",{enumerable:!0,get:function(){return Qo.constants}});var Jo=Le.Buffer.concat,Wr=Object.getOwnPropertyDescriptor(Le.Buffer,"concat"),ea=s=>s,cs=Wr?.writable===!0||Wr?.set!==void 0?s=>{Le.Buffer.concat=s?ea:Jo}:s=>{},Ae=Symbol("_superWrite"),Ie=class extends Error{code;errno;constructor(e,t){super("zlib: "+e.message,{cause:e}),this.code=e.code,this.errno=e.errno,this.code||(this.code="ZLIB_ERROR"),this.message="zlib: "+e.message,Error.captureStackTrace(this,t??this.constructor)}get name(){return"ZlibError"}};f.ZlibError=Ie;var fs=Symbol("flushFlag"),bt=class extends Xo.Minipass{#e=!1;#i=!1;#s;#n;#r;#t;#o;get sawError(){return this.#e}get handle(){return this.#t}get flushFlag(){return this.#s}constructor(e,t){if(!e||typeof e!="object")throw new TypeError("invalid options for ZlibBase constructor");if(super(e),this.#s=e.flush??0,this.#n=e.finishFlush??0,this.#r=e.fullFlushFlag??0,typeof qr[t]!="function")throw new TypeError("Compression method not supported: "+t);try{this.#t=new qr[t](e)}catch(i){throw new Ie(i,this.constructor)}this.#o=i=>{this.#e||(this.#e=!0,this.close(),this.emit("error",i))},this.#t?.on("error",i=>this.#o(new Ie(i))),this.once("end",()=>this.close)}close(){this.#t&&(this.#t.close(),this.#t=void 0,this.emit("close"))}reset(){if(!this.#e)return(0,ds.default)(this.#t,"zlib binding closed"),this.#t.reset?.()}flush(e){this.ended||(typeof e!="number"&&(e=this.#r),this.write(Object.assign(Le.Buffer.alloc(0),{[fs]:e})))}end(e,t,i){return typeof e=="function"&&(i=e,t=void 0,e=void 0),typeof t=="function"&&(i=t,t=void 0),e&&(t?this.write(e,t):this.write(e)),this.flush(this.#n),this.#i=!0,super.end(i)}get ended(){return this.#i}[Ae](e){return super.write(e)}write(e,t,i){if(typeof t=="function"&&(i=t,t="utf8"),typeof e=="string"&&(e=Le.Buffer.from(e,t)),this.#e)return;(0,ds.default)(this.#t,"zlib binding closed");let r=this.#t._handle,n=r.close;r.close=()=>{};let o=this.#t.close;this.#t.close=()=>{},cs(!0);let a;try{let l=typeof e[fs]=="number"?e[fs]:this.#s;a=this.#t._processChunk(e,l),cs(!1)}catch(l){cs(!1),this.#o(new Ie(l,this.write))}finally{this.#t&&(this.#t._handle=r,r.close=n,this.#t.close=o,this.#t.removeAllListeners("error"))}this.#t&&this.#t.on("error",l=>this.#o(new Ie(l,this.write)));let h;if(a)if(Array.isArray(a)&&a.length>0){let l=a[0];h=this[Ae](Le.Buffer.from(l));for(let u=1;u<a.length;u++)h=this[Ae](a[u])}else h=this[Ae](Le.Buffer.from(a));return i&&i(),h}},ie=class extends bt{#e;#i;constructor(e,t){e=e||{},e.flush=e.flush||te.constants.Z_NO_FLUSH,e.finishFlush=e.finishFlush||te.constants.Z_FINISH,e.fullFlushFlag=te.constants.Z_FULL_FLUSH,super(e,t),this.#e=e.level,this.#i=e.strategy}params(e,t){if(!this.sawError){if(!this.handle)throw new Error("cannot switch params when binding is closed");if(!this.handle.params)throw new Error("not supported in this implementation");if(this.#e!==e||this.#i!==t){this.flush(te.constants.Z_SYNC_FLUSH),(0,ds.default)(this.handle,"zlib binding closed");let i=this.handle.flush;this.handle.flush=(r,n)=>{typeof r=="function"&&(n=r,r=this.flushFlag),this.flush(r),n?.()};try{this.handle.params(e,t)}finally{this.handle.flush=i}this.handle&&(this.#e=e,this.#i=t)}}}};f.Zlib=ie;var ms=class extends ie{constructor(e){super(e,"Deflate")}};f.Deflate=ms;var ps=class extends ie{constructor(e){super(e,"Inflate")}};f.Inflate=ps;var _s=class extends ie{#e;constructor(e){super(e,"Gzip"),this.#e=e&&!!e.portable}[Ae](e){return this.#e?(this.#e=!1,e[9]=255,super[Ae](e)):super[Ae](e)}};f.Gzip=_s;var ws=class extends ie{constructor(e){super(e,"Gunzip")}};f.Gunzip=ws;var ys=class extends ie{constructor(e){super(e,"DeflateRaw")}};f.DeflateRaw=ys;var Es=class extends ie{constructor(e){super(e,"InflateRaw")}};f.InflateRaw=Es;var bs=class extends ie{constructor(e){super(e,"Unzip")}};f.Unzip=bs;var Xt=class extends bt{constructor(e,t){e=e||{},e.flush=e.flush||te.constants.BROTLI_OPERATION_PROCESS,e.finishFlush=e.finishFlush||te.constants.BROTLI_OPERATION_FINISH,e.fullFlushFlag=te.constants.BROTLI_OPERATION_FLUSH,super(e,t)}},Ss=class extends Xt{constructor(e){super(e,"BrotliCompress")}};f.BrotliCompress=Ss;var gs=class extends Xt{constructor(e){super(e,"BrotliDecompress")}};f.BrotliDecompress=gs;var Qt=class extends bt{constructor(e,t){e=e||{},e.flush=e.flush||te.constants.ZSTD_e_continue,e.finishFlush=e.finishFlush||te.constants.ZSTD_e_end,e.fullFlushFlag=te.constants.ZSTD_e_flush,super(e,t)}},Rs=class extends Qt{constructor(e){super(e,"ZstdCompress")}};f.ZstdCompress=Rs;var Os=class extends Qt{constructor(e){super(e,"ZstdDecompress")}};f.ZstdDecompress=Os});var Gr=d(Xe=>{"use strict";Object.defineProperty(Xe,"__esModule",{value:!0});Xe.parse=Xe.encode=void 0;var ta=(s,e)=>{if(Number.isSafeInteger(s))s<0?sa(s,e):ia(s,e);else throw Error("cannot encode number outside of javascript safe integer range");return e};Xe.encode=ta;var ia=(s,e)=>{e[0]=128;for(var t=e.length;t>1;t--)e[t-1]=s&255,s=Math.floor(s/256)},sa=(s,e)=>{e[0]=255;var t=!1;s=s*-1;for(var i=e.length;i>1;i--){var r=s&255;s=Math.floor(s/256),t?e[i-1]=Hr(r):r===0?e[i-1]=0:(t=!0,e[i-1]=Zr(r))}},ra=s=>{let e=s[0],t=e===128?oa(s.subarray(1,s.length)):e===255?na(s):null;if(t===null)throw Error("invalid base256 encoding");if(!Number.isSafeInteger(t))throw Error("parsed number outside of javascript safe integer range");return t};Xe.parse=ra;var na=s=>{for(var e=s.length,t=0,i=!1,r=e-1;r>-1;r--){var n=Number(s[r]),o;i?o=Hr(n):n===0?o=n:(i=!0,o=Zr(n)),o!==0&&(t-=o*Math.pow(256,e-r-1))}return t},oa=s=>{for(var e=s.length,t=0,i=e-1;i>-1;i--){var r=Number(s[i]);r!==0&&(t+=r*Math.pow(256,e-i-1))}return t},Hr=s=>(255^s)&255,Zr=s=>(255^s)+1&255});var Ts=d(j=>{"use strict";Object.defineProperty(j,"__esModule",{value:!0});j.code=j.name=j.isName=j.isCode=void 0;var aa=s=>j.name.has(s);j.isCode=aa;var ha=s=>j.code.has(s);j.isName=ha;j.name=new Map([["0","File"],["","OldFile"],["1","Link"],["2","SymbolicLink"],["3","CharacterDevice"],["4","BlockDevice"],["5","Directory"],["6","FIFO"],["7","ContiguousFile"],["g","GlobalExtendedHeader"],["x","ExtendedHeader"],["A","SolarisACL"],["D","GNUDumpDir"],["I","Inode"],["K","NextFileHasLongLinkpath"],["L","NextFileHasLongPath"],["M","ContinuationFile"],["N","OldGnuLongPath"],["S","SparseFile"],["V","TapeVolumeHeader"],["X","OldExtendedHeader"]]);j.code=new Map(Array.from(j.name).map(s=>[s[1],s[0]]))});var Je=d(se=>{"use strict";var la=se&&se.__createBinding||(Object.create?(function(s,e,t,i){i===void 0&&(i=t);var r=Object.getOwnPropertyDescriptor(e,t);(!r||("get"in r?!e.__esModule:r.writable||r.configurable))&&(r={enumerable:!0,get:function(){return e[t]}}),Object.defineProperty(s,i,r)}):(function(s,e,t,i){i===void 0&&(i=t),s[i]=e[t]})),ua=se&&se.__setModuleDefault||(Object.create?(function(s,e){Object.defineProperty(s,"default",{enumerable:!0,value:e})}):function(s,e){s.default=e}),Yr=se&&se.__importStar||(function(){var s=function(e){return s=Object.getOwnPropertyNames||function(t){var i=[];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(i[i.length]=r);return i},s(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var i=s(e),r=0;r<i.length;r++)i[r]!=="default"&&la(t,e,i[r]);return ua(t,e),t}})();Object.defineProperty(se,"__esModule",{value:!0});se.Header=void 0;var Qe=require("node:path"),Kr=Yr(Gr()),St=Yr(Ts()),Ns=class{cksumValid=!1;needPax=!1;nullBlock=!1;block;path;mode;uid;gid;size;cksum;#e="Unsupported";linkpath;uname;gname;devmaj=0;devmin=0;atime;ctime;mtime;charset;comment;constructor(e,t=0,i,r){Buffer.isBuffer(e)?this.decode(e,t||0,i,r):e&&this.#i(e)}decode(e,t,i,r){if(t||(t=0),!e||!(e.length>=t+512))throw new Error("need 512 bytes for header");this.path=i?.path??Ce(e,t,100),this.mode=i?.mode??r?.mode??be(e,t+100,8),this.uid=i?.uid??r?.uid??be(e,t+108,8),this.gid=i?.gid??r?.gid??be(e,t+116,8),this.size=i?.size??r?.size??be(e,t+124,12),this.mtime=i?.mtime??r?.mtime??Ds(e,t+136,12),this.cksum=be(e,t+148,12),r&&this.#i(r,!0),i&&this.#i(i);let n=Ce(e,t+156,1);if(St.isCode(n)&&(this.#e=n||"0"),this.#e==="0"&&this.path.slice(-1)==="/"&&(this.#e="5"),this.#e==="5"&&(this.size=0),this.linkpath=Ce(e,t+157,100),e.subarray(t+257,t+265).toString()==="ustar\x0000")if(this.uname=i?.uname??r?.uname??Ce(e,t+265,32),this.gname=i?.gname??r?.gname??Ce(e,t+297,32),this.devmaj=i?.devmaj??r?.devmaj??be(e,t+329,8)??0,this.devmin=i?.devmin??r?.devmin??be(e,t+337,8)??0,e[t+475]!==0){let a=Ce(e,t+345,155);this.path=a+"/"+this.path}else{let a=Ce(e,t+345,130);a&&(this.path=a+"/"+this.path),this.atime=i?.atime??r?.atime??Ds(e,t+476,12),this.ctime=i?.ctime??r?.ctime??Ds(e,t+488,12)}let o=256;for(let a=t;a<t+148;a++)o+=e[a];for(let a=t+156;a<t+512;a++)o+=e[a];this.cksumValid=o===this.cksum,this.cksum===void 0&&o===256&&(this.nullBlock=!0)}#i(e,t=!1){Object.assign(this,Object.fromEntries(Object.entries(e).filter(([i,r])=>!(r==null||i==="path"&&t||i==="linkpath"&&t||i==="global"))))}encode(e,t=0){if(e||(e=this.block=Buffer.alloc(512)),this.#e==="Unsupported"&&(this.#e="0"),!(e.length>=t+512))throw new Error("need 512 bytes for header");let i=this.ctime||this.atime?130:155,r=ca(this.path||"",i),n=r[0],o=r[1];this.needPax=!!r[2],this.needPax=Fe(e,t,100,n)||this.needPax,this.needPax=Se(e,t+100,8,this.mode)||this.needPax,this.needPax=Se(e,t+108,8,this.uid)||this.needPax,this.needPax=Se(e,t+116,8,this.gid)||this.needPax,this.needPax=Se(e,t+124,12,this.size)||this.needPax,this.needPax=Ps(e,t+136,12,this.mtime)||this.needPax,e[t+156]=this.#e.charCodeAt(0),this.needPax=Fe(e,t+157,100,this.linkpath)||this.needPax,e.write("ustar\x0000",t+257,8),this.needPax=Fe(e,t+265,32,this.uname)||this.needPax,this.needPax=Fe(e,t+297,32,this.gname)||this.needPax,this.needPax=Se(e,t+329,8,this.devmaj)||this.needPax,this.needPax=Se(e,t+337,8,this.devmin)||this.needPax,this.needPax=Fe(e,t+345,i,o)||this.needPax,e[t+475]!==0?this.needPax=Fe(e,t+345,155,o)||this.needPax:(this.needPax=Fe(e,t+345,130,o)||this.needPax,this.needPax=Ps(e,t+476,12,this.atime)||this.needPax,this.needPax=Ps(e,t+488,12,this.ctime)||this.needPax);let a=256;for(let h=t;h<t+148;h++)a+=e[h];for(let h=t+156;h<t+512;h++)a+=e[h];return this.cksum=a,Se(e,t+148,8,this.cksum),this.cksumValid=!0,this.needPax}get type(){return this.#e==="Unsupported"?this.#e:St.name.get(this.#e)}get typeKey(){return this.#e}set type(e){let t=String(St.code.get(e));if(St.isCode(t)||t==="Unsupported")this.#e=t;else if(St.isCode(e))this.#e=e;else throw new TypeError("invalid entry type: "+e)}};se.Header=Ns;var ca=(s,e)=>{let i=s,r="",n,o=Qe.posix.parse(s).root||".";if(Buffer.byteLength(i)<100)n=[i,r,!1];else{r=Qe.posix.dirname(i),i=Qe.posix.basename(i);do Buffer.byteLength(i)<=100&&Buffer.byteLength(r)<=e?n=[i,r,!1]:Buffer.byteLength(i)>100&&Buffer.byteLength(r)<=e?n=[i.slice(0,99),r,!0]:(i=Qe.posix.join(Qe.posix.basename(r),i),r=Qe.posix.dirname(r));while(r!==o&&n===void 0);n||(n=[s.slice(0,99),"",!0])}return n},Ce=(s,e,t)=>s.subarray(e,e+t).toString("utf8").replace(/\0.*/,""),Ds=(s,e,t)=>fa(be(s,e,t)),fa=s=>s===void 0?void 0:new Date(s*1e3),be=(s,e,t)=>Number(s[e])&128?Kr.parse(s.subarray(e,e+t)):ma(s,e,t),da=s=>isNaN(s)?void 0:s,ma=(s,e,t)=>da(parseInt(s.subarray(e,e+t).toString("utf8").replace(/\0.*$/,"").trim(),8)),pa={12:8589934591,8:2097151},Se=(s,e,t,i)=>i===void 0?!1:i>pa[t]||i<0?(Kr.encode(i,s.subarray(e,e+t)),!0):(_a(s,e,t,i),!1),_a=(s,e,t,i)=>s.write(wa(i,t),e,t,"ascii"),wa=(s,e)=>ya(Math.floor(s).toString(8),e),ya=(s,e)=>(s.length===e-1?s:new Array(e-s.length-1).join("0")+s+" ")+"\0",Ps=(s,e,t,i)=>i===void 0?!1:Se(s,e,t,i.getTime()/1e3),Ea=new Array(156).join("\0"),Fe=(s,e,t,i)=>i===void 0?!1:(s.write(i+Ea,e,t,"utf8"),i.length!==Buffer.byteLength(i)||i.length>t)});var ei=d(Jt=>{"use strict";Object.defineProperty(Jt,"__esModule",{value:!0});Jt.Pax=void 0;var ba=require("node:path"),Sa=Je(),Ms=class s{atime;mtime;ctime;charset;comment;gid;uid;gname;uname;linkpath;dev;ino;nlink;path;size;mode;global;constructor(e,t=!1){this.atime=e.atime,this.charset=e.charset,this.comment=e.comment,this.ctime=e.ctime,this.dev=e.dev,this.gid=e.gid,this.global=t,this.gname=e.gname,this.ino=e.ino,this.linkpath=e.linkpath,this.mtime=e.mtime,this.nlink=e.nlink,this.path=e.path,this.size=e.size,this.uid=e.uid,this.uname=e.uname}encode(){let e=this.encodeBody();if(e==="")return Buffer.allocUnsafe(0);let t=Buffer.byteLength(e),i=512*Math.ceil(1+t/512),r=Buffer.allocUnsafe(i);for(let n=0;n<512;n++)r[n]=0;new Sa.Header({path:("PaxHeader/"+(0,ba.basename)(this.path??"")).slice(0,99),mode:this.mode||420,uid:this.uid,gid:this.gid,size:t,mtime:this.mtime,type:this.global?"GlobalExtendedHeader":"ExtendedHeader",linkpath:"",uname:this.uname||"",gname:this.gname||"",devmaj:0,devmin:0,atime:this.atime,ctime:this.ctime}).encode(r),r.write(e,512,t,"utf8");for(let n=t+512;n<r.length;n++)r[n]=0;return r}encodeBody(){return this.encodeField("path")+this.encodeField("ctime")+this.encodeField("atime")+this.encodeField("dev")+this.encodeField("ino")+this.encodeField("nlink")+this.encodeField("charset")+this.encodeField("comment")+this.encodeField("gid")+this.encodeField("gname")+this.encodeField("linkpath")+this.encodeField("mtime")+this.encodeField("size")+this.encodeField("uid")+this.encodeField("uname")}encodeField(e){if(this[e]===void 0)return"";let t=this[e],i=t instanceof Date?t.getTime()/1e3:t,r=" "+(e==="dev"||e==="ino"||e==="nlink"?"SCHILY.":"")+e+"="+i+` +"use strict";var d=(s,e)=>()=>(e||s((e={exports:{}}).exports,e),e.exports);var We=d(C=>{"use strict";var yo=C&&C.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(C,"__esModule",{value:!0});C.Minipass=C.isWritable=C.isReadable=C.isStream=void 0;var Br=typeof process=="object"&&process?process:{stdout:null,stderr:null},es=require("node:events"),xr=yo(require("node:stream")),Eo=require("node:string_decoder"),bo=s=>!!s&&typeof s=="object"&&(s instanceof Wt||s instanceof xr.default||(0,C.isReadable)(s)||(0,C.isWritable)(s));C.isStream=bo;var So=s=>!!s&&typeof s=="object"&&s instanceof es.EventEmitter&&typeof s.pipe=="function"&&s.pipe!==xr.default.Writable.prototype.pipe;C.isReadable=So;var go=s=>!!s&&typeof s=="object"&&s instanceof es.EventEmitter&&typeof s.write=="function"&&typeof s.end=="function";C.isWritable=go;var le=Symbol("EOF"),ue=Symbol("maybeEmitEnd"),_e=Symbol("emittedEnd"),zt=Symbol("emittingEnd"),ft=Symbol("emittedError"),kt=Symbol("closed"),zr=Symbol("read"),jt=Symbol("flush"),kr=Symbol("flushChunk"),K=Symbol("encoding"),Ue=Symbol("decoder"),R=Symbol("flowing"),dt=Symbol("paused"),qe=Symbol("resume"),O=Symbol("buffer"),I=Symbol("pipes"),v=Symbol("bufferLength"),Ki=Symbol("bufferPush"),xt=Symbol("bufferShift"),N=Symbol("objectMode"),y=Symbol("destroyed"),Vi=Symbol("error"),$i=Symbol("emitData"),jr=Symbol("emitEnd"),Xi=Symbol("emitEnd2"),J=Symbol("async"),Qi=Symbol("abort"),Ut=Symbol("aborted"),mt=Symbol("signal"),Pe=Symbol("dataListeners"),k=Symbol("discarded"),pt=s=>Promise.resolve().then(s),Ro=s=>s(),Oo=s=>s==="end"||s==="finish"||s==="prefinish",vo=s=>s instanceof ArrayBuffer||!!s&&typeof s=="object"&&s.constructor&&s.constructor.name==="ArrayBuffer"&&s.byteLength>=0,To=s=>!Buffer.isBuffer(s)&&ArrayBuffer.isView(s),qt=class{src;dest;opts;ondrain;constructor(e,t,i){this.src=e,this.dest=t,this.opts=i,this.ondrain=()=>e[qe](),this.dest.on("drain",this.ondrain)}unpipe(){this.dest.removeListener("drain",this.ondrain)}proxyErrors(e){}end(){this.unpipe(),this.opts.end&&this.dest.end()}},Ji=class extends qt{unpipe(){this.src.removeListener("error",this.proxyErrors),super.unpipe()}constructor(e,t,i){super(e,t,i),this.proxyErrors=r=>this.dest.emit("error",r),e.on("error",this.proxyErrors)}},Do=s=>!!s.objectMode,Po=s=>!s.objectMode&&!!s.encoding&&s.encoding!=="buffer",Wt=class extends es.EventEmitter{[R]=!1;[dt]=!1;[I]=[];[O]=[];[N];[K];[J];[Ue];[le]=!1;[_e]=!1;[zt]=!1;[kt]=!1;[ft]=null;[v]=0;[y]=!1;[mt];[Ut]=!1;[Pe]=0;[k]=!1;writable=!0;readable=!0;constructor(...e){let t=e[0]||{};if(super(),t.objectMode&&typeof t.encoding=="string")throw new TypeError("Encoding and objectMode may not be used together");Do(t)?(this[N]=!0,this[K]=null):Po(t)?(this[K]=t.encoding,this[N]=!1):(this[N]=!1,this[K]=null),this[J]=!!t.async,this[Ue]=this[K]?new Eo.StringDecoder(this[K]):null,t&&t.debugExposeBuffer===!0&&Object.defineProperty(this,"buffer",{get:()=>this[O]}),t&&t.debugExposePipes===!0&&Object.defineProperty(this,"pipes",{get:()=>this[I]});let{signal:i}=t;i&&(this[mt]=i,i.aborted?this[Qi]():i.addEventListener("abort",()=>this[Qi]()))}get bufferLength(){return this[v]}get encoding(){return this[K]}set encoding(e){throw new Error("Encoding must be set at instantiation time")}setEncoding(e){throw new Error("Encoding must be set at instantiation time")}get objectMode(){return this[N]}set objectMode(e){throw new Error("objectMode must be set at instantiation time")}get async(){return this[J]}set async(e){this[J]=this[J]||!!e}[Qi](){this[Ut]=!0,this.emit("abort",this[mt]?.reason),this.destroy(this[mt]?.reason)}get aborted(){return this[Ut]}set aborted(e){}write(e,t,i){if(this[Ut])return!1;if(this[le])throw new Error("write after end");if(this[y])return this.emit("error",Object.assign(new Error("Cannot call write after a stream was destroyed"),{code:"ERR_STREAM_DESTROYED"})),!0;typeof t=="function"&&(i=t,t="utf8"),t||(t="utf8");let r=this[J]?pt:Ro;if(!this[N]&&!Buffer.isBuffer(e)){if(To(e))e=Buffer.from(e.buffer,e.byteOffset,e.byteLength);else if(vo(e))e=Buffer.from(e);else if(typeof e!="string")throw new Error("Non-contiguous data written to non-objectMode stream")}return this[N]?(this[R]&&this[v]!==0&&this[jt](!0),this[R]?this.emit("data",e):this[Ki](e),this[v]!==0&&this.emit("readable"),i&&r(i),this[R]):e.length?(typeof e=="string"&&!(t===this[K]&&!this[Ue]?.lastNeed)&&(e=Buffer.from(e,t)),Buffer.isBuffer(e)&&this[K]&&(e=this[Ue].write(e)),this[R]&&this[v]!==0&&this[jt](!0),this[R]?this.emit("data",e):this[Ki](e),this[v]!==0&&this.emit("readable"),i&&r(i),this[R]):(this[v]!==0&&this.emit("readable"),i&&r(i),this[R])}read(e){if(this[y])return null;if(this[k]=!1,this[v]===0||e===0||e&&e>this[v])return this[ue](),null;this[N]&&(e=null),this[O].length>1&&!this[N]&&(this[O]=[this[K]?this[O].join(""):Buffer.concat(this[O],this[v])]);let t=this[zr](e||null,this[O][0]);return this[ue](),t}[zr](e,t){if(this[N])this[xt]();else{let i=t;e===i.length||e===null?this[xt]():typeof i=="string"?(this[O][0]=i.slice(e),t=i.slice(0,e),this[v]-=e):(this[O][0]=i.subarray(e),t=i.subarray(0,e),this[v]-=e)}return this.emit("data",t),!this[O].length&&!this[le]&&this.emit("drain"),t}end(e,t,i){return typeof e=="function"&&(i=e,e=void 0),typeof t=="function"&&(i=t,t="utf8"),e!==void 0&&this.write(e,t),i&&this.once("end",i),this[le]=!0,this.writable=!1,(this[R]||!this[dt])&&this[ue](),this}[qe](){this[y]||(!this[Pe]&&!this[I].length&&(this[k]=!0),this[dt]=!1,this[R]=!0,this.emit("resume"),this[O].length?this[jt]():this[le]?this[ue]():this.emit("drain"))}resume(){return this[qe]()}pause(){this[R]=!1,this[dt]=!0,this[k]=!1}get destroyed(){return this[y]}get flowing(){return this[R]}get paused(){return this[dt]}[Ki](e){this[N]?this[v]+=1:this[v]+=e.length,this[O].push(e)}[xt](){return this[N]?this[v]-=1:this[v]-=this[O][0].length,this[O].shift()}[jt](e=!1){do;while(this[kr](this[xt]())&&this[O].length);!e&&!this[O].length&&!this[le]&&this.emit("drain")}[kr](e){return this.emit("data",e),this[R]}pipe(e,t){if(this[y])return e;this[k]=!1;let i=this[_e];return t=t||{},e===Br.stdout||e===Br.stderr?t.end=!1:t.end=t.end!==!1,t.proxyErrors=!!t.proxyErrors,i?t.end&&e.end():(this[I].push(t.proxyErrors?new Ji(this,e,t):new qt(this,e,t)),this[J]?pt(()=>this[qe]()):this[qe]()),e}unpipe(e){let t=this[I].find(i=>i.dest===e);t&&(this[I].length===1?(this[R]&&this[Pe]===0&&(this[R]=!1),this[I]=[]):this[I].splice(this[I].indexOf(t),1),t.unpipe())}addListener(e,t){return this.on(e,t)}on(e,t){let i=super.on(e,t);if(e==="data")this[k]=!1,this[Pe]++,!this[I].length&&!this[R]&&this[qe]();else if(e==="readable"&&this[v]!==0)super.emit("readable");else if(Oo(e)&&this[_e])super.emit(e),this.removeAllListeners(e);else if(e==="error"&&this[ft]){let r=t;this[J]?pt(()=>r.call(this,this[ft])):r.call(this,this[ft])}return i}removeListener(e,t){return this.off(e,t)}off(e,t){let i=super.off(e,t);return e==="data"&&(this[Pe]=this.listeners("data").length,this[Pe]===0&&!this[k]&&!this[I].length&&(this[R]=!1)),i}removeAllListeners(e){let t=super.removeAllListeners(e);return(e==="data"||e===void 0)&&(this[Pe]=0,!this[k]&&!this[I].length&&(this[R]=!1)),t}get emittedEnd(){return this[_e]}[ue](){!this[zt]&&!this[_e]&&!this[y]&&this[O].length===0&&this[le]&&(this[zt]=!0,this.emit("end"),this.emit("prefinish"),this.emit("finish"),this[kt]&&this.emit("close"),this[zt]=!1)}emit(e,...t){let i=t[0];if(e!=="error"&&e!=="close"&&e!==y&&this[y])return!1;if(e==="data")return!this[N]&&!i?!1:this[J]?(pt(()=>this[$i](i)),!0):this[$i](i);if(e==="end")return this[jr]();if(e==="close"){if(this[kt]=!0,!this[_e]&&!this[y])return!1;let n=super.emit("close");return this.removeAllListeners("close"),n}else if(e==="error"){this[ft]=i,super.emit(Vi,i);let n=!this[mt]||this.listeners("error").length?super.emit("error",i):!1;return this[ue](),n}else if(e==="resume"){let n=super.emit("resume");return this[ue](),n}else if(e==="finish"||e==="prefinish"){let n=super.emit(e);return this.removeAllListeners(e),n}let r=super.emit(e,...t);return this[ue](),r}[$i](e){for(let i of this[I])i.dest.write(e)===!1&&this.pause();let t=this[k]?!1:super.emit("data",e);return this[ue](),t}[jr](){return this[_e]?!1:(this[_e]=!0,this.readable=!1,this[J]?(pt(()=>this[Xi]()),!0):this[Xi]())}[Xi](){if(this[Ue]){let t=this[Ue].end();if(t){for(let i of this[I])i.dest.write(t);this[k]||super.emit("data",t)}}for(let t of this[I])t.end();let e=super.emit("end");return this.removeAllListeners("end"),e}async collect(){let e=Object.assign([],{dataLength:0});this[N]||(e.dataLength=0);let t=this.promise();return this.on("data",i=>{e.push(i),this[N]||(e.dataLength+=i.length)}),await t,e}async concat(){if(this[N])throw new Error("cannot concat in objectMode");let e=await this.collect();return this[K]?e.join(""):Buffer.concat(e,e.dataLength)}async promise(){return new Promise((e,t)=>{this.on(y,()=>t(new Error("stream destroyed"))),this.on("error",i=>t(i)),this.on("end",()=>e())})}[Symbol.asyncIterator](){this[k]=!1;let e=!1,t=async()=>(this.pause(),e=!0,{value:void 0,done:!0});return{next:()=>{if(e)return t();let r=this.read();if(r!==null)return Promise.resolve({done:!1,value:r});if(this[le])return t();let n,o,a=c=>{this.off("data",h),this.off("end",l),this.off(y,u),t(),o(c)},h=c=>{this.off("error",a),this.off("end",l),this.off(y,u),this.pause(),n({value:c,done:!!this[le]})},l=()=>{this.off("error",a),this.off("data",h),this.off(y,u),t(),n({done:!0,value:void 0})},u=()=>a(new Error("stream destroyed"));return new Promise((c,E)=>{o=E,n=c,this.once(y,u),this.once("error",a),this.once("end",l),this.once("data",h)})},throw:t,return:t,[Symbol.asyncIterator](){return this},[Symbol.asyncDispose]:async()=>{}}}[Symbol.iterator](){this[k]=!1;let e=!1,t=()=>(this.pause(),this.off(Vi,t),this.off(y,t),this.off("end",t),e=!0,{done:!0,value:void 0}),i=()=>{if(e)return t();let r=this.read();return r===null?t():{done:!1,value:r}};return this.once("end",t),this.once(Vi,t),this.once(y,t),{next:i,throw:t,return:t,[Symbol.iterator](){return this},[Symbol.dispose]:()=>{}}}destroy(e){if(this[y])return e?this.emit("error",e):this.emit(y),this;this[y]=!0,this[k]=!0,this[O].length=0,this[v]=0;let t=this;return typeof t.close=="function"&&!this[kt]&&t.close(),e?this.emit("error",e):this.emit(y),this}static get isStream(){return C.isStream}};C.Minipass=Wt});var Ke=d(W=>{"use strict";var Ur=W&&W.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(W,"__esModule",{value:!0});W.WriteStreamSync=W.WriteStream=W.ReadStreamSync=W.ReadStream=void 0;var No=Ur(require("events")),B=Ur(require("fs")),Mo=We(),Lo=B.default.writev,ye=Symbol("_autoClose"),$=Symbol("_close"),_t=Symbol("_ended"),p=Symbol("_fd"),ts=Symbol("_finished"),fe=Symbol("_flags"),is=Symbol("_flush"),os=Symbol("_handleChunk"),as=Symbol("_makeBuf"),yt=Symbol("_mode"),Ht=Symbol("_needDrain"),Ge=Symbol("_onerror"),Ye=Symbol("_onopen"),ss=Symbol("_onread"),He=Symbol("_onwrite"),Ee=Symbol("_open"),V=Symbol("_path"),we=Symbol("_pos"),ee=Symbol("_queue"),Ze=Symbol("_read"),rs=Symbol("_readSize"),ce=Symbol("_reading"),wt=Symbol("_remain"),ns=Symbol("_size"),Zt=Symbol("_write"),Ne=Symbol("_writing"),Gt=Symbol("_defaultFlag"),Me=Symbol("_errored"),Yt=class extends Mo.Minipass{[Me]=!1;[p];[V];[rs];[ce]=!1;[ns];[wt];[ye];constructor(e,t){if(t=t||{},super(t),this.readable=!0,this.writable=!1,typeof e!="string")throw new TypeError("path must be a string");this[Me]=!1,this[p]=typeof t.fd=="number"?t.fd:void 0,this[V]=e,this[rs]=t.readSize||16*1024*1024,this[ce]=!1,this[ns]=typeof t.size=="number"?t.size:1/0,this[wt]=this[ns],this[ye]=typeof t.autoClose=="boolean"?t.autoClose:!0,typeof this[p]=="number"?this[Ze]():this[Ee]()}get fd(){return this[p]}get path(){return this[V]}write(){throw new TypeError("this is a readable stream")}end(){throw new TypeError("this is a readable stream")}[Ee](){B.default.open(this[V],"r",(e,t)=>this[Ye](e,t))}[Ye](e,t){e?this[Ge](e):(this[p]=t,this.emit("open",t),this[Ze]())}[as](){return Buffer.allocUnsafe(Math.min(this[rs],this[wt]))}[Ze](){if(!this[ce]){this[ce]=!0;let e=this[as]();if(e.length===0)return process.nextTick(()=>this[ss](null,0,e));B.default.read(this[p],e,0,e.length,null,(t,i,r)=>this[ss](t,i,r))}}[ss](e,t,i){this[ce]=!1,e?this[Ge](e):this[os](t,i)&&this[Ze]()}[$](){if(this[ye]&&typeof this[p]=="number"){let e=this[p];this[p]=void 0,B.default.close(e,t=>t?this.emit("error",t):this.emit("close"))}}[Ge](e){this[ce]=!0,this[$](),this.emit("error",e)}[os](e,t){let i=!1;return this[wt]-=e,e>0&&(i=super.write(e<t.length?t.subarray(0,e):t)),(e===0||this[wt]<=0)&&(i=!1,this[$](),super.end()),i}emit(e,...t){switch(e){case"prefinish":case"finish":return!1;case"drain":return typeof this[p]=="number"&&this[Ze](),!1;case"error":return this[Me]?!1:(this[Me]=!0,super.emit(e,...t));default:return super.emit(e,...t)}}};W.ReadStream=Yt;var hs=class extends Yt{[Ee](){let e=!0;try{this[Ye](null,B.default.openSync(this[V],"r")),e=!1}finally{e&&this[$]()}}[Ze](){let e=!0;try{if(!this[ce]){this[ce]=!0;do{let t=this[as](),i=t.length===0?0:B.default.readSync(this[p],t,0,t.length,null);if(!this[os](i,t))break}while(!0);this[ce]=!1}e=!1}finally{e&&this[$]()}}[$](){if(this[ye]&&typeof this[p]=="number"){let e=this[p];this[p]=void 0,B.default.closeSync(e),this.emit("close")}}};W.ReadStreamSync=hs;var Kt=class extends No.default{readable=!1;writable=!0;[Me]=!1;[Ne]=!1;[_t]=!1;[ee]=[];[Ht]=!1;[V];[yt];[ye];[p];[Gt];[fe];[ts]=!1;[we];constructor(e,t){t=t||{},super(t),this[V]=e,this[p]=typeof t.fd=="number"?t.fd:void 0,this[yt]=t.mode===void 0?438:t.mode,this[we]=typeof t.start=="number"?t.start:void 0,this[ye]=typeof t.autoClose=="boolean"?t.autoClose:!0;let i=this[we]!==void 0?"r+":"w";this[Gt]=t.flags===void 0,this[fe]=t.flags===void 0?i:t.flags,this[p]===void 0&&this[Ee]()}emit(e,...t){if(e==="error"){if(this[Me])return!1;this[Me]=!0}return super.emit(e,...t)}get fd(){return this[p]}get path(){return this[V]}[Ge](e){this[$](),this[Ne]=!0,this.emit("error",e)}[Ee](){B.default.open(this[V],this[fe],this[yt],(e,t)=>this[Ye](e,t))}[Ye](e,t){this[Gt]&&this[fe]==="r+"&&e&&e.code==="ENOENT"?(this[fe]="w",this[Ee]()):e?this[Ge](e):(this[p]=t,this.emit("open",t),this[Ne]||this[is]())}end(e,t){return e&&this.write(e,t),this[_t]=!0,!this[Ne]&&!this[ee].length&&typeof this[p]=="number"&&this[He](null,0),this}write(e,t){return typeof e=="string"&&(e=Buffer.from(e,t)),this[_t]?(this.emit("error",new Error("write() after end()")),!1):this[p]===void 0||this[Ne]||this[ee].length?(this[ee].push(e),this[Ht]=!0,!1):(this[Ne]=!0,this[Zt](e),!0)}[Zt](e){B.default.write(this[p],e,0,e.length,this[we],(t,i)=>this[He](t,i))}[He](e,t){e?this[Ge](e):(this[we]!==void 0&&typeof t=="number"&&(this[we]+=t),this[ee].length?this[is]():(this[Ne]=!1,this[_t]&&!this[ts]?(this[ts]=!0,this[$](),this.emit("finish")):this[Ht]&&(this[Ht]=!1,this.emit("drain"))))}[is](){if(this[ee].length===0)this[_t]&&this[He](null,0);else if(this[ee].length===1)this[Zt](this[ee].pop());else{let e=this[ee];this[ee]=[],Lo(this[p],e,this[we],(t,i)=>this[He](t,i))}}[$](){if(this[ye]&&typeof this[p]=="number"){let e=this[p];this[p]=void 0,B.default.close(e,t=>t?this.emit("error",t):this.emit("close"))}}};W.WriteStream=Kt;var ls=class extends Kt{[Ee](){let e;if(this[Gt]&&this[fe]==="r+")try{e=B.default.openSync(this[V],this[fe],this[yt])}catch(t){if(t?.code==="ENOENT")return this[fe]="w",this[Ee]();throw t}else e=B.default.openSync(this[V],this[fe],this[yt]);this[Ye](null,e)}[$](){if(this[ye]&&typeof this[p]=="number"){let e=this[p];this[p]=void 0,B.default.closeSync(e),this.emit("close")}}[Zt](e){let t=!0;try{this[He](null,B.default.writeSync(this[p],e,0,e.length,this[we])),t=!1}finally{if(t)try{this[$]()}catch{}}}};W.WriteStreamSync=ls});var Vt=d(b=>{"use strict";Object.defineProperty(b,"__esModule",{value:!0});b.dealias=b.isNoFile=b.isFile=b.isAsync=b.isSync=b.isAsyncNoFile=b.isSyncNoFile=b.isAsyncFile=b.isSyncFile=void 0;var Ao=new Map([["C","cwd"],["f","file"],["z","gzip"],["P","preservePaths"],["U","unlink"],["strip-components","strip"],["stripComponents","strip"],["keep-newer","newer"],["keepNewer","newer"],["keep-newer-files","newer"],["keepNewerFiles","newer"],["k","keep"],["keep-existing","keep"],["keepExisting","keep"],["m","noMtime"],["no-mtime","noMtime"],["p","preserveOwner"],["L","follow"],["h","follow"],["onentry","onReadEntry"]]),Io=s=>!!s.sync&&!!s.file;b.isSyncFile=Io;var Co=s=>!s.sync&&!!s.file;b.isAsyncFile=Co;var Fo=s=>!!s.sync&&!s.file;b.isSyncNoFile=Fo;var Bo=s=>!s.sync&&!s.file;b.isAsyncNoFile=Bo;var zo=s=>!!s.sync;b.isSync=zo;var ko=s=>!s.sync;b.isAsync=ko;var jo=s=>!!s.file;b.isFile=jo;var xo=s=>!s.file;b.isNoFile=xo;var Uo=s=>{let e=Ao.get(s);return e||s},qo=(s={})=>{if(!s)return{};let e={};for(let[t,i]of Object.entries(s)){let r=Uo(t);e[r]=i}return e.chmod===void 0&&e.noChmod===!1&&(e.chmod=!0),delete e.noChmod,e};b.dealias=qo});var Ve=d($t=>{"use strict";Object.defineProperty($t,"__esModule",{value:!0});$t.makeCommand=void 0;var Et=Vt(),Wo=(s,e,t,i,r)=>Object.assign((n=[],o,a)=>{Array.isArray(n)&&(o=n,n={}),typeof o=="function"&&(a=o,o=void 0),o?o=Array.from(o):o=[];let h=(0,Et.dealias)(n);if(r?.(h,o),(0,Et.isSyncFile)(h)){if(typeof a=="function")throw new TypeError("callback not supported for sync tar functions");return s(h,o)}else if((0,Et.isAsyncFile)(h)){let l=e(h,o),u=a||void 0;return u?l.then(()=>u(),u):l}else if((0,Et.isSyncNoFile)(h)){if(typeof a=="function")throw new TypeError("callback not supported for sync tar functions");return t(h,o)}else if((0,Et.isAsyncNoFile)(h)){if(typeof a=="function")throw new TypeError("callback only supported with file option");return i(h,o)}else throw new Error("impossible options??")},{syncFile:s,asyncFile:e,syncNoFile:t,asyncNoFile:i,validate:r});$t.makeCommand=Wo});var us=d($e=>{"use strict";var Ho=$e&&$e.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty($e,"__esModule",{value:!0});$e.constants=void 0;var Zo=Ho(require("zlib")),Go=Zo.default.constants||{ZLIB_VERNUM:4736};$e.constants=Object.freeze(Object.assign(Object.create(null),{Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_VERSION_ERROR:-6,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,DEFLATE:1,INFLATE:2,GZIP:3,GUNZIP:4,DEFLATERAW:5,INFLATERAW:6,UNZIP:7,BROTLI_DECODE:8,BROTLI_ENCODE:9,Z_MIN_WINDOWBITS:8,Z_MAX_WINDOWBITS:15,Z_DEFAULT_WINDOWBITS:15,Z_MIN_CHUNK:64,Z_MAX_CHUNK:1/0,Z_DEFAULT_CHUNK:16384,Z_MIN_MEMLEVEL:1,Z_MAX_MEMLEVEL:9,Z_DEFAULT_MEMLEVEL:8,Z_MIN_LEVEL:-1,Z_MAX_LEVEL:9,Z_DEFAULT_LEVEL:-1,BROTLI_OPERATION_PROCESS:0,BROTLI_OPERATION_FLUSH:1,BROTLI_OPERATION_FINISH:2,BROTLI_OPERATION_EMIT_METADATA:3,BROTLI_MODE_GENERIC:0,BROTLI_MODE_TEXT:1,BROTLI_MODE_FONT:2,BROTLI_DEFAULT_MODE:0,BROTLI_MIN_QUALITY:0,BROTLI_MAX_QUALITY:11,BROTLI_DEFAULT_QUALITY:11,BROTLI_MIN_WINDOW_BITS:10,BROTLI_MAX_WINDOW_BITS:24,BROTLI_LARGE_MAX_WINDOW_BITS:30,BROTLI_DEFAULT_WINDOW:22,BROTLI_MIN_INPUT_BLOCK_BITS:16,BROTLI_MAX_INPUT_BLOCK_BITS:24,BROTLI_PARAM_MODE:0,BROTLI_PARAM_QUALITY:1,BROTLI_PARAM_LGWIN:2,BROTLI_PARAM_LGBLOCK:3,BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING:4,BROTLI_PARAM_SIZE_HINT:5,BROTLI_PARAM_LARGE_WINDOW:6,BROTLI_PARAM_NPOSTFIX:7,BROTLI_PARAM_NDIRECT:8,BROTLI_DECODER_RESULT_ERROR:0,BROTLI_DECODER_RESULT_SUCCESS:1,BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT:2,BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION:0,BROTLI_DECODER_PARAM_LARGE_WINDOW:1,BROTLI_DECODER_NO_ERROR:0,BROTLI_DECODER_SUCCESS:1,BROTLI_DECODER_NEEDS_MORE_INPUT:2,BROTLI_DECODER_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE:-1,BROTLI_DECODER_ERROR_FORMAT_RESERVED:-2,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE:-3,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET:-4,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME:-5,BROTLI_DECODER_ERROR_FORMAT_CL_SPACE:-6,BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE:-7,BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT:-8,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1:-9,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2:-10,BROTLI_DECODER_ERROR_FORMAT_TRANSFORM:-11,BROTLI_DECODER_ERROR_FORMAT_DICTIONARY:-12,BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS:-13,BROTLI_DECODER_ERROR_FORMAT_PADDING_1:-14,BROTLI_DECODER_ERROR_FORMAT_PADDING_2:-15,BROTLI_DECODER_ERROR_FORMAT_DISTANCE:-16,BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET:-19,BROTLI_DECODER_ERROR_INVALID_ARGUMENTS:-20,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES:-21,BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS:-22,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP:-25,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1:-26,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2:-27,BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES:-30,BROTLI_DECODER_ERROR_UNREACHABLE:-31},Go))});var vs=d(f=>{"use strict";var Yo=f&&f.__createBinding||(Object.create?(function(s,e,t,i){i===void 0&&(i=t);var r=Object.getOwnPropertyDescriptor(e,t);(!r||("get"in r?!e.__esModule:r.writable||r.configurable))&&(r={enumerable:!0,get:function(){return e[t]}}),Object.defineProperty(s,i,r)}):(function(s,e,t,i){i===void 0&&(i=t),s[i]=e[t]})),Ko=f&&f.__setModuleDefault||(Object.create?(function(s,e){Object.defineProperty(s,"default",{enumerable:!0,value:e})}):function(s,e){s.default=e}),Vo=f&&f.__importStar||(function(){var s=function(e){return s=Object.getOwnPropertyNames||function(t){var i=[];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(i[i.length]=r);return i},s(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var i=s(e),r=0;r<i.length;r++)i[r]!=="default"&&Yo(t,e,i[r]);return Ko(t,e),t}})(),$o=f&&f.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(f,"__esModule",{value:!0});f.ZstdDecompress=f.ZstdCompress=f.BrotliDecompress=f.BrotliCompress=f.Unzip=f.InflateRaw=f.DeflateRaw=f.Gunzip=f.Gzip=f.Inflate=f.Deflate=f.Zlib=f.ZlibError=f.constants=void 0;var ds=$o(require("assert")),Le=require("buffer"),Xo=We(),qr=Vo(require("zlib")),te=us(),Qo=us();Object.defineProperty(f,"constants",{enumerable:!0,get:function(){return Qo.constants}});var Jo=Le.Buffer.concat,Wr=Object.getOwnPropertyDescriptor(Le.Buffer,"concat"),ea=s=>s,cs=Wr?.writable===!0||Wr?.set!==void 0?s=>{Le.Buffer.concat=s?ea:Jo}:s=>{},Ae=Symbol("_superWrite"),Ie=class extends Error{code;errno;constructor(e,t){super("zlib: "+e.message,{cause:e}),this.code=e.code,this.errno=e.errno,this.code||(this.code="ZLIB_ERROR"),this.message="zlib: "+e.message,Error.captureStackTrace(this,t??this.constructor)}get name(){return"ZlibError"}};f.ZlibError=Ie;var fs=Symbol("flushFlag"),bt=class extends Xo.Minipass{#e=!1;#i=!1;#s;#n;#r;#t;#o;get sawError(){return this.#e}get handle(){return this.#t}get flushFlag(){return this.#s}constructor(e,t){if(!e||typeof e!="object")throw new TypeError("invalid options for ZlibBase constructor");if(super(e),this.#s=e.flush??0,this.#n=e.finishFlush??0,this.#r=e.fullFlushFlag??0,typeof qr[t]!="function")throw new TypeError("Compression method not supported: "+t);try{this.#t=new qr[t](e)}catch(i){throw new Ie(i,this.constructor)}this.#o=i=>{this.#e||(this.#e=!0,this.close(),this.emit("error",i))},this.#t?.on("error",i=>this.#o(new Ie(i))),this.once("end",()=>this.close)}close(){this.#t&&(this.#t.close(),this.#t=void 0,this.emit("close"))}reset(){if(!this.#e)return(0,ds.default)(this.#t,"zlib binding closed"),this.#t.reset?.()}flush(e){this.ended||(typeof e!="number"&&(e=this.#r),this.write(Object.assign(Le.Buffer.alloc(0),{[fs]:e})))}end(e,t,i){return typeof e=="function"&&(i=e,t=void 0,e=void 0),typeof t=="function"&&(i=t,t=void 0),e&&(t?this.write(e,t):this.write(e)),this.flush(this.#n),this.#i=!0,super.end(i)}get ended(){return this.#i}[Ae](e){return super.write(e)}write(e,t,i){if(typeof t=="function"&&(i=t,t="utf8"),typeof e=="string"&&(e=Le.Buffer.from(e,t)),this.#e)return;(0,ds.default)(this.#t,"zlib binding closed");let r=this.#t._handle,n=r.close;r.close=()=>{};let o=this.#t.close;this.#t.close=()=>{},cs(!0);let a;try{let l=typeof e[fs]=="number"?e[fs]:this.#s;a=this.#t._processChunk(e,l),cs(!1)}catch(l){cs(!1),this.#o(new Ie(l,this.write))}finally{this.#t&&(this.#t._handle=r,r.close=n,this.#t.close=o,this.#t.removeAllListeners("error"))}this.#t&&this.#t.on("error",l=>this.#o(new Ie(l,this.write)));let h;if(a)if(Array.isArray(a)&&a.length>0){let l=a[0];h=this[Ae](Le.Buffer.from(l));for(let u=1;u<a.length;u++)h=this[Ae](a[u])}else h=this[Ae](Le.Buffer.from(a));return i&&i(),h}},ie=class extends bt{#e;#i;constructor(e,t){e=e||{},e.flush=e.flush||te.constants.Z_NO_FLUSH,e.finishFlush=e.finishFlush||te.constants.Z_FINISH,e.fullFlushFlag=te.constants.Z_FULL_FLUSH,super(e,t),this.#e=e.level,this.#i=e.strategy}params(e,t){if(!this.sawError){if(!this.handle)throw new Error("cannot switch params when binding is closed");if(!this.handle.params)throw new Error("not supported in this implementation");if(this.#e!==e||this.#i!==t){this.flush(te.constants.Z_SYNC_FLUSH),(0,ds.default)(this.handle,"zlib binding closed");let i=this.handle.flush;this.handle.flush=(r,n)=>{typeof r=="function"&&(n=r,r=this.flushFlag),this.flush(r),n?.()};try{this.handle.params(e,t)}finally{this.handle.flush=i}this.handle&&(this.#e=e,this.#i=t)}}}};f.Zlib=ie;var ms=class extends ie{constructor(e){super(e,"Deflate")}};f.Deflate=ms;var ps=class extends ie{constructor(e){super(e,"Inflate")}};f.Inflate=ps;var _s=class extends ie{#e;constructor(e){super(e,"Gzip"),this.#e=e&&!!e.portable}[Ae](e){return this.#e?(this.#e=!1,e[9]=255,super[Ae](e)):super[Ae](e)}};f.Gzip=_s;var ws=class extends ie{constructor(e){super(e,"Gunzip")}};f.Gunzip=ws;var ys=class extends ie{constructor(e){super(e,"DeflateRaw")}};f.DeflateRaw=ys;var Es=class extends ie{constructor(e){super(e,"InflateRaw")}};f.InflateRaw=Es;var bs=class extends ie{constructor(e){super(e,"Unzip")}};f.Unzip=bs;var Xt=class extends bt{constructor(e,t){e=e||{},e.flush=e.flush||te.constants.BROTLI_OPERATION_PROCESS,e.finishFlush=e.finishFlush||te.constants.BROTLI_OPERATION_FINISH,e.fullFlushFlag=te.constants.BROTLI_OPERATION_FLUSH,super(e,t)}},Ss=class extends Xt{constructor(e){super(e,"BrotliCompress")}};f.BrotliCompress=Ss;var gs=class extends Xt{constructor(e){super(e,"BrotliDecompress")}};f.BrotliDecompress=gs;var Qt=class extends bt{constructor(e,t){e=e||{},e.flush=e.flush||te.constants.ZSTD_e_continue,e.finishFlush=e.finishFlush||te.constants.ZSTD_e_end,e.fullFlushFlag=te.constants.ZSTD_e_flush,super(e,t)}},Rs=class extends Qt{constructor(e){super(e,"ZstdCompress")}};f.ZstdCompress=Rs;var Os=class extends Qt{constructor(e){super(e,"ZstdDecompress")}};f.ZstdDecompress=Os});var Gr=d(Xe=>{"use strict";Object.defineProperty(Xe,"__esModule",{value:!0});Xe.parse=Xe.encode=void 0;var ta=(s,e)=>{if(Number.isSafeInteger(s))s<0?sa(s,e):ia(s,e);else throw Error("cannot encode number outside of javascript safe integer range");return e};Xe.encode=ta;var ia=(s,e)=>{e[0]=128;for(var t=e.length;t>1;t--)e[t-1]=s&255,s=Math.floor(s/256)},sa=(s,e)=>{e[0]=255;var t=!1;s=s*-1;for(var i=e.length;i>1;i--){var r=s&255;s=Math.floor(s/256),t?e[i-1]=Hr(r):r===0?e[i-1]=0:(t=!0,e[i-1]=Zr(r))}},ra=s=>{let e=s[0],t=e===128?oa(s.subarray(1,s.length)):e===255?na(s):null;if(t===null)throw Error("invalid base256 encoding");if(!Number.isSafeInteger(t))throw Error("parsed number outside of javascript safe integer range");return t};Xe.parse=ra;var na=s=>{for(var e=s.length,t=0,i=!1,r=e-1;r>-1;r--){var n=Number(s[r]),o;i?o=Hr(n):n===0?o=n:(i=!0,o=Zr(n)),o!==0&&(t-=o*Math.pow(256,e-r-1))}return t},oa=s=>{for(var e=s.length,t=0,i=e-1;i>-1;i--){var r=Number(s[i]);r!==0&&(t+=r*Math.pow(256,e-i-1))}return t},Hr=s=>(255^s)&255,Zr=s=>(255^s)+1&255});var Ts=d(j=>{"use strict";Object.defineProperty(j,"__esModule",{value:!0});j.code=j.name=j.isName=j.isCode=void 0;var aa=s=>j.name.has(s);j.isCode=aa;var ha=s=>j.code.has(s);j.isName=ha;j.name=new Map([["0","File"],["","OldFile"],["1","Link"],["2","SymbolicLink"],["3","CharacterDevice"],["4","BlockDevice"],["5","Directory"],["6","FIFO"],["7","ContiguousFile"],["g","GlobalExtendedHeader"],["x","ExtendedHeader"],["A","SolarisACL"],["D","GNUDumpDir"],["I","Inode"],["K","NextFileHasLongLinkpath"],["L","NextFileHasLongPath"],["M","ContinuationFile"],["N","OldGnuLongPath"],["S","SparseFile"],["V","TapeVolumeHeader"],["X","OldExtendedHeader"]]);j.code=new Map(Array.from(j.name).map(s=>[s[1],s[0]]))});var Je=d(se=>{"use strict";var la=se&&se.__createBinding||(Object.create?(function(s,e,t,i){i===void 0&&(i=t);var r=Object.getOwnPropertyDescriptor(e,t);(!r||("get"in r?!e.__esModule:r.writable||r.configurable))&&(r={enumerable:!0,get:function(){return e[t]}}),Object.defineProperty(s,i,r)}):(function(s,e,t,i){i===void 0&&(i=t),s[i]=e[t]})),ua=se&&se.__setModuleDefault||(Object.create?(function(s,e){Object.defineProperty(s,"default",{enumerable:!0,value:e})}):function(s,e){s.default=e}),Yr=se&&se.__importStar||(function(){var s=function(e){return s=Object.getOwnPropertyNames||function(t){var i=[];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(i[i.length]=r);return i},s(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var i=s(e),r=0;r<i.length;r++)i[r]!=="default"&&la(t,e,i[r]);return ua(t,e),t}})();Object.defineProperty(se,"__esModule",{value:!0});se.Header=void 0;var Qe=require("node:path"),Kr=Yr(Gr()),St=Yr(Ts()),Ns=class{cksumValid=!1;needPax=!1;nullBlock=!1;block;path;mode;uid;gid;size;cksum;#e="Unsupported";linkpath;uname;gname;devmaj=0;devmin=0;atime;ctime;mtime;charset;comment;constructor(e,t=0,i,r){Buffer.isBuffer(e)?this.decode(e,t||0,i,r):e&&this.#i(e)}decode(e,t,i,r){if(t||(t=0),!e||!(e.length>=t+512))throw new Error("need 512 bytes for header");this.path=i?.path??Ce(e,t,100),this.mode=i?.mode??r?.mode??be(e,t+100,8),this.uid=i?.uid??r?.uid??be(e,t+108,8),this.gid=i?.gid??r?.gid??be(e,t+116,8),this.size=i?.size??r?.size??be(e,t+124,12),this.mtime=i?.mtime??r?.mtime??Ds(e,t+136,12),this.cksum=be(e,t+148,12),r&&this.#i(r,!0),i&&this.#i(i);let n=Ce(e,t+156,1);if(St.isCode(n)&&(this.#e=n||"0"),this.#e==="0"&&this.path.slice(-1)==="/"&&(this.#e="5"),this.#e==="5"&&(this.size=0),this.linkpath=Ce(e,t+157,100),e.subarray(t+257,t+265).toString()==="ustar\x0000")if(this.uname=i?.uname??r?.uname??Ce(e,t+265,32),this.gname=i?.gname??r?.gname??Ce(e,t+297,32),this.devmaj=i?.devmaj??r?.devmaj??be(e,t+329,8)??0,this.devmin=i?.devmin??r?.devmin??be(e,t+337,8)??0,e[t+475]!==0){let a=Ce(e,t+345,155);this.path=a+"/"+this.path}else{let a=Ce(e,t+345,130);a&&(this.path=a+"/"+this.path),this.atime=i?.atime??r?.atime??Ds(e,t+476,12),this.ctime=i?.ctime??r?.ctime??Ds(e,t+488,12)}let o=256;for(let a=t;a<t+148;a++)o+=e[a];for(let a=t+156;a<t+512;a++)o+=e[a];this.cksumValid=o===this.cksum,this.cksum===void 0&&o===256&&(this.nullBlock=!0)}#i(e,t=!1){Object.assign(this,Object.fromEntries(Object.entries(e).filter(([i,r])=>!(r==null||i==="path"&&t||i==="linkpath"&&t||i==="global"))))}encode(e,t=0){if(e||(e=this.block=Buffer.alloc(512)),this.#e==="Unsupported"&&(this.#e="0"),!(e.length>=t+512))throw new Error("need 512 bytes for header");let i=this.ctime||this.atime?130:155,r=ca(this.path||"",i),n=r[0],o=r[1];this.needPax=!!r[2],this.needPax=Fe(e,t,100,n)||this.needPax,this.needPax=Se(e,t+100,8,this.mode)||this.needPax,this.needPax=Se(e,t+108,8,this.uid)||this.needPax,this.needPax=Se(e,t+116,8,this.gid)||this.needPax,this.needPax=Se(e,t+124,12,this.size)||this.needPax,this.needPax=Ps(e,t+136,12,this.mtime)||this.needPax,e[t+156]=this.#e.charCodeAt(0),this.needPax=Fe(e,t+157,100,this.linkpath)||this.needPax,e.write("ustar\x0000",t+257,8),this.needPax=Fe(e,t+265,32,this.uname)||this.needPax,this.needPax=Fe(e,t+297,32,this.gname)||this.needPax,this.needPax=Se(e,t+329,8,this.devmaj)||this.needPax,this.needPax=Se(e,t+337,8,this.devmin)||this.needPax,this.needPax=Fe(e,t+345,i,o)||this.needPax,e[t+475]!==0?this.needPax=Fe(e,t+345,155,o)||this.needPax:(this.needPax=Fe(e,t+345,130,o)||this.needPax,this.needPax=Ps(e,t+476,12,this.atime)||this.needPax,this.needPax=Ps(e,t+488,12,this.ctime)||this.needPax);let a=256;for(let h=t;h<t+148;h++)a+=e[h];for(let h=t+156;h<t+512;h++)a+=e[h];return this.cksum=a,Se(e,t+148,8,this.cksum),this.cksumValid=!0,this.needPax}get type(){return this.#e==="Unsupported"?this.#e:St.name.get(this.#e)}get typeKey(){return this.#e}set type(e){let t=String(St.code.get(e));if(St.isCode(t)||t==="Unsupported")this.#e=t;else if(St.isCode(e))this.#e=e;else throw new TypeError("invalid entry type: "+e)}};se.Header=Ns;var ca=(s,e)=>{let i=s,r="",n,o=Qe.posix.parse(s).root||".";if(Buffer.byteLength(i)<100)n=[i,r,!1];else{r=Qe.posix.dirname(i),i=Qe.posix.basename(i);do Buffer.byteLength(i)<=100&&Buffer.byteLength(r)<=e?n=[i,r,!1]:Buffer.byteLength(i)>100&&Buffer.byteLength(r)<=e?n=[i.slice(0,99),r,!0]:(i=Qe.posix.join(Qe.posix.basename(r),i),r=Qe.posix.dirname(r));while(r!==o&&n===void 0);n||(n=[s.slice(0,99),"",!0])}return n},Ce=(s,e,t)=>s.subarray(e,e+t).toString("utf8").replace(/\0.*/,""),Ds=(s,e,t)=>fa(be(s,e,t)),fa=s=>s===void 0?void 0:new Date(s*1e3),be=(s,e,t)=>Number(s[e])&128?Kr.parse(s.subarray(e,e+t)):ma(s,e,t),da=s=>isNaN(s)?void 0:s,ma=(s,e,t)=>da(parseInt(s.subarray(e,e+t).toString("utf8").replace(/\0.*$/,"").trim(),8)),pa={12:8589934591,8:2097151},Se=(s,e,t,i)=>i===void 0?!1:i>pa[t]||i<0?(Kr.encode(i,s.subarray(e,e+t)),!0):(_a(s,e,t,i),!1),_a=(s,e,t,i)=>s.write(wa(i,t),e,t,"ascii"),wa=(s,e)=>ya(Math.floor(s).toString(8),e),ya=(s,e)=>(s.length===e-1?s:new Array(e-s.length-1).join("0")+s+" ")+"\0",Ps=(s,e,t,i)=>i===void 0?!1:Se(s,e,t,i.getTime()/1e3),Ea=new Array(156).join("\0"),Fe=(s,e,t,i)=>i===void 0?!1:(s.write(i+Ea,e,t,"utf8"),i.length!==Buffer.byteLength(i)||i.length>t)});var ei=d(Jt=>{"use strict";Object.defineProperty(Jt,"__esModule",{value:!0});Jt.Pax=void 0;var ba=require("node:path"),Sa=Je(),Ms=class s{atime;mtime;ctime;charset;comment;gid;uid;gname;uname;linkpath;dev;ino;nlink;path;size;mode;global;constructor(e,t=!1){this.atime=e.atime,this.charset=e.charset,this.comment=e.comment,this.ctime=e.ctime,this.dev=e.dev,this.gid=e.gid,this.global=t,this.gname=e.gname,this.ino=e.ino,this.linkpath=e.linkpath,this.mtime=e.mtime,this.nlink=e.nlink,this.path=e.path,this.size=e.size,this.uid=e.uid,this.uname=e.uname}encode(){let e=this.encodeBody();if(e==="")return Buffer.allocUnsafe(0);let t=Buffer.byteLength(e),i=512*Math.ceil(1+t/512),r=Buffer.allocUnsafe(i);for(let n=0;n<512;n++)r[n]=0;new Sa.Header({path:("PaxHeader/"+(0,ba.basename)(this.path??"")).slice(0,99),mode:this.mode||420,uid:this.uid,gid:this.gid,size:t,mtime:this.mtime,type:this.global?"GlobalExtendedHeader":"ExtendedHeader",linkpath:"",uname:this.uname||"",gname:this.gname||"",devmaj:0,devmin:0,atime:this.atime,ctime:this.ctime}).encode(r),r.write(e,512,t,"utf8");for(let n=t+512;n<r.length;n++)r[n]=0;return r}encodeBody(){return this.encodeField("path")+this.encodeField("ctime")+this.encodeField("atime")+this.encodeField("dev")+this.encodeField("ino")+this.encodeField("nlink")+this.encodeField("charset")+this.encodeField("comment")+this.encodeField("gid")+this.encodeField("gname")+this.encodeField("linkpath")+this.encodeField("mtime")+this.encodeField("size")+this.encodeField("uid")+this.encodeField("uname")}encodeField(e){if(this[e]===void 0)return"";let t=this[e],i=t instanceof Date?t.getTime()/1e3:t,r=" "+(e==="dev"||e==="ino"||e==="nlink"?"SCHILY.":"")+e+"="+i+` `,n=Buffer.byteLength(r),o=Math.floor(Math.log(n)/Math.log(10))+1;return n+o>=Math.pow(10,o)&&(o+=1),o+n+r}static parse(e,t,i=!1){return new s(ga(Ra(e),t),i)}};Jt.Pax=Ms;var ga=(s,e)=>e?Object.assign({},e,s):s,Ra=s=>s.replace(/\n$/,"").split(` -`).reduce(Oa,Object.create(null)),Oa=(s,e)=>{let t=parseInt(e,10);if(t!==Buffer.byteLength(e)+1)return s;e=e.slice((t+" ").length);let i=e.split("="),r=i.shift();if(!r)return s;let n=r.replace(/^SCHILY\.(dev|ino|nlink)/,"$1"),o=i.join("=");return s[n]=/^([A-Z]+\.)?([mac]|birth|creation)time$/.test(n)?new Date(Number(o)*1e3):/^[0-9]+$/.test(o)?+o:o,s}});var et=d(ti=>{"use strict";Object.defineProperty(ti,"__esModule",{value:!0});ti.normalizeWindowsPath=void 0;var va=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform;ti.normalizeWindowsPath=va!=="win32"?s=>s:s=>s&&s.replace(/\\/g,"/")});var ri=d(si=>{"use strict";Object.defineProperty(si,"__esModule",{value:!0});si.ReadEntry=void 0;var Ta=We(),ii=et(),Ls=class extends Ta.Minipass{extended;globalExtended;header;startBlockSize;blockRemain;remain;type;meta=!1;ignore=!1;path;mode;uid;gid;uname;gname;size=0;mtime;atime;ctime;linkpath;dev;ino;nlink;invalid=!1;absolute;unsupported=!1;constructor(e,t,i){switch(super({}),this.pause(),this.extended=t,this.globalExtended=i,this.header=e,this.remain=e.size??0,this.startBlockSize=512*Math.ceil(this.remain/512),this.blockRemain=this.startBlockSize,this.type=e.type,this.type){case"File":case"OldFile":case"Link":case"SymbolicLink":case"CharacterDevice":case"BlockDevice":case"Directory":case"FIFO":case"ContiguousFile":case"GNUDumpDir":break;case"NextFileHasLongLinkpath":case"NextFileHasLongPath":case"OldGnuLongPath":case"GlobalExtendedHeader":case"ExtendedHeader":case"OldExtendedHeader":this.meta=!0;break;default:this.ignore=!0}if(!e.path)throw new Error("no path provided for tar.ReadEntry");this.path=(0,ii.normalizeWindowsPath)(e.path),this.mode=e.mode,this.mode&&(this.mode=this.mode&4095),this.uid=e.uid,this.gid=e.gid,this.uname=e.uname,this.gname=e.gname,this.size=this.remain,this.mtime=e.mtime,this.atime=e.atime,this.ctime=e.ctime,this.linkpath=e.linkpath?(0,ii.normalizeWindowsPath)(e.linkpath):void 0,this.uname=e.uname,this.gname=e.gname,t&&this.#e(t),i&&this.#e(i,!0)}write(e){let t=e.length;if(t>this.blockRemain)throw new Error("writing more to entry than is appropriate");let i=this.remain,r=this.blockRemain;return this.remain=Math.max(0,i-t),this.blockRemain=Math.max(0,r-t),this.ignore?!0:i>=t?super.write(e):super.write(e.subarray(0,i))}#e(e,t=!1){e.path&&(e.path=(0,ii.normalizeWindowsPath)(e.path)),e.linkpath&&(e.linkpath=(0,ii.normalizeWindowsPath)(e.linkpath)),Object.assign(this,Object.fromEntries(Object.entries(e).filter(([i,r])=>!(r==null||i==="path"&&t))))}};si.ReadEntry=Ls});var oi=d(ni=>{"use strict";Object.defineProperty(ni,"__esModule",{value:!0});ni.warnMethod=void 0;var Da=(s,e,t,i={})=>{s.file&&(i.file=s.file),s.cwd&&(i.cwd=s.cwd),i.code=t instanceof Error&&t.code||e,i.tarCode=e,!s.strict&&i.recoverable!==!1?(t instanceof Error&&(i=Object.assign(t,i),t=t.message),s.emit("warn",e,t,i)):t instanceof Error?s.emit("error",Object.assign(t,i)):s.emit("error",Object.assign(new Error(`${e}: ${t}`),i))};ni.warnMethod=Da});var mi=d(di=>{"use strict";Object.defineProperty(di,"__esModule",{value:!0});di.Parser=void 0;var Pa=require("events"),As=vs(),Vr=Je(),$r=ei(),Na=ri(),Ma=oi(),La=1024*1024,zs=Buffer.from([31,139]),ks=Buffer.from([40,181,47,253]),Aa=Math.max(zs.length,ks.length),H=Symbol("state"),Be=Symbol("writeEntry"),de=Symbol("readEntry"),Is=Symbol("nextEntry"),Xr=Symbol("processEntry"),re=Symbol("extendedHeader"),gt=Symbol("globalExtendedHeader"),ge=Symbol("meta"),Qr=Symbol("emitMeta"),_=Symbol("buffer"),me=Symbol("queue"),Re=Symbol("ended"),Cs=Symbol("emittedEnd"),ze=Symbol("emit"),S=Symbol("unzip"),ai=Symbol("consumeChunk"),hi=Symbol("consumeChunkSub"),Fs=Symbol("consumeBody"),Jr=Symbol("consumeMeta"),en=Symbol("consumeHeader"),Rt=Symbol("consuming"),Bs=Symbol("bufferConcat"),li=Symbol("maybeEnd"),tt=Symbol("writing"),Oe=Symbol("aborted"),ui=Symbol("onDone"),ke=Symbol("sawValidEntry"),ci=Symbol("sawNullBlock"),fi=Symbol("sawEOF"),tn=Symbol("closeStream"),Ia=()=>!0,js=class extends Pa.EventEmitter{file;strict;maxMetaEntrySize;filter;brotli;zstd;writable=!0;readable=!1;[me]=[];[_];[de];[Be];[H]="begin";[ge]="";[re];[gt];[Re]=!1;[S];[Oe]=!1;[ke];[ci]=!1;[fi]=!1;[tt]=!1;[Rt]=!1;[Cs]=!1;constructor(e={}){super(),this.file=e.file||"",this.on(ui,()=>{(this[H]==="begin"||this[ke]===!1)&&this.warn("TAR_BAD_ARCHIVE","Unrecognized archive format")}),e.ondone?this.on(ui,e.ondone):this.on(ui,()=>{this.emit("prefinish"),this.emit("finish"),this.emit("end")}),this.strict=!!e.strict,this.maxMetaEntrySize=e.maxMetaEntrySize||La,this.filter=typeof e.filter=="function"?e.filter:Ia;let t=e.file&&(e.file.endsWith(".tar.br")||e.file.endsWith(".tbr"));this.brotli=!(e.gzip||e.zstd)&&e.brotli!==void 0?e.brotli:t?void 0:!1;let i=e.file&&(e.file.endsWith(".tar.zst")||e.file.endsWith(".tzst"));this.zstd=!(e.gzip||e.brotli)&&e.zstd!==void 0?e.zstd:i?!0:void 0,this.on("end",()=>this[tn]()),typeof e.onwarn=="function"&&this.on("warn",e.onwarn),typeof e.onReadEntry=="function"&&this.on("entry",e.onReadEntry)}warn(e,t,i={}){(0,Ma.warnMethod)(this,e,t,i)}[en](e,t){this[ke]===void 0&&(this[ke]=!1);let i;try{i=new Vr.Header(e,t,this[re],this[gt])}catch(r){return this.warn("TAR_ENTRY_INVALID",r)}if(i.nullBlock)this[ci]?(this[fi]=!0,this[H]==="begin"&&(this[H]="header"),this[ze]("eof")):(this[ci]=!0,this[ze]("nullBlock"));else if(this[ci]=!1,!i.cksumValid)this.warn("TAR_ENTRY_INVALID","checksum failure",{header:i});else if(!i.path)this.warn("TAR_ENTRY_INVALID","path is required",{header:i});else{let r=i.type;if(/^(Symbolic)?Link$/.test(r)&&!i.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath required",{header:i});else if(!/^(Symbolic)?Link$/.test(r)&&!/^(Global)?ExtendedHeader$/.test(r)&&i.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath forbidden",{header:i});else{let n=this[Be]=new Na.ReadEntry(i,this[re],this[gt]);if(!this[ke])if(n.remain){let o=()=>{n.invalid||(this[ke]=!0)};n.on("end",o)}else this[ke]=!0;n.meta?n.size>this.maxMetaEntrySize?(n.ignore=!0,this[ze]("ignoredEntry",n),this[H]="ignore",n.resume()):n.size>0&&(this[ge]="",n.on("data",o=>this[ge]+=o),this[H]="meta"):(this[re]=void 0,n.ignore=n.ignore||!this.filter(n.path,n),n.ignore?(this[ze]("ignoredEntry",n),this[H]=n.remain?"ignore":"header",n.resume()):(n.remain?this[H]="body":(this[H]="header",n.end()),this[de]?this[me].push(n):(this[me].push(n),this[Is]())))}}}[tn](){queueMicrotask(()=>this.emit("close"))}[Xr](e){let t=!0;if(!e)this[de]=void 0,t=!1;else if(Array.isArray(e)){let[i,...r]=e;this.emit(i,...r)}else this[de]=e,this.emit("entry",e),e.emittedEnd||(e.on("end",()=>this[Is]()),t=!1);return t}[Is](){do;while(this[Xr](this[me].shift()));if(!this[me].length){let e=this[de];!e||e.flowing||e.size===e.remain?this[tt]||this.emit("drain"):e.once("drain",()=>this.emit("drain"))}}[Fs](e,t){let i=this[Be];if(!i)throw new Error("attempt to consume body without entry??");let r=i.blockRemain??0,n=r>=e.length&&t===0?e:e.subarray(t,t+r);return i.write(n),i.blockRemain||(this[H]="header",this[Be]=void 0,i.end()),n.length}[Jr](e,t){let i=this[Be],r=this[Fs](e,t);return!this[Be]&&i&&this[Qr](i),r}[ze](e,t,i){!this[me].length&&!this[de]?this.emit(e,t,i):this[me].push([e,t,i])}[Qr](e){switch(this[ze]("meta",this[ge]),e.type){case"ExtendedHeader":case"OldExtendedHeader":this[re]=$r.Pax.parse(this[ge],this[re],!1);break;case"GlobalExtendedHeader":this[gt]=$r.Pax.parse(this[ge],this[gt],!0);break;case"NextFileHasLongPath":case"OldGnuLongPath":{let t=this[re]??Object.create(null);this[re]=t,t.path=this[ge].replace(/\0.*/,"");break}case"NextFileHasLongLinkpath":{let t=this[re]||Object.create(null);this[re]=t,t.linkpath=this[ge].replace(/\0.*/,"");break}default:throw new Error("unknown meta: "+e.type)}}abort(e){this[Oe]=!0,this.emit("abort",e),this.warn("TAR_ABORT",e,{recoverable:!1})}write(e,t,i){if(typeof t=="function"&&(i=t,t=void 0),typeof e=="string"&&(e=Buffer.from(e,typeof t=="string"?t:"utf8")),this[Oe])return i?.(),!1;if((this[S]===void 0||this.brotli===void 0&&this[S]===!1)&&e){if(this[_]&&(e=Buffer.concat([this[_],e]),this[_]=void 0),e.length<Aa)return this[_]=e,i?.(),!0;for(let h=0;this[S]===void 0&&h<zs.length;h++)e[h]!==zs[h]&&(this[S]=!1);let o=!1;if(this[S]===!1&&this.zstd!==!1){o=!0;for(let h=0;h<ks.length;h++)if(e[h]!==ks[h]){o=!1;break}}let a=this.brotli===void 0&&!o;if(this[S]===!1&&a)if(e.length<512)if(this[Re])this.brotli=!0;else return this[_]=e,i?.(),!0;else try{new Vr.Header(e.subarray(0,512)),this.brotli=!1}catch{this.brotli=!0}if(this[S]===void 0||this[S]===!1&&(this.brotli||o)){let h=this[Re];this[Re]=!1,this[S]=this[S]===void 0?new As.Unzip({}):o?new As.ZstdDecompress({}):new As.BrotliDecompress({}),this[S].on("data",u=>this[ai](u)),this[S].on("error",u=>this.abort(u)),this[S].on("end",()=>{this[Re]=!0,this[ai]()}),this[tt]=!0;let l=!!this[S][h?"end":"write"](e);return this[tt]=!1,i?.(),l}}this[tt]=!0,this[S]?this[S].write(e):this[ai](e),this[tt]=!1;let n=this[me].length?!1:this[de]?this[de].flowing:!0;return!n&&!this[me].length&&this[de]?.once("drain",()=>this.emit("drain")),i?.(),n}[Bs](e){e&&!this[Oe]&&(this[_]=this[_]?Buffer.concat([this[_],e]):e)}[li](){if(this[Re]&&!this[Cs]&&!this[Oe]&&!this[Rt]){this[Cs]=!0;let e=this[Be];if(e&&e.blockRemain){let t=this[_]?this[_].length:0;this.warn("TAR_BAD_ARCHIVE",`Truncated input (needed ${e.blockRemain} more bytes, only ${t} available)`,{entry:e}),this[_]&&e.write(this[_]),e.end()}this[ze](ui)}}[ai](e){if(this[Rt]&&e)this[Bs](e);else if(!e&&!this[_])this[li]();else if(e){if(this[Rt]=!0,this[_]){this[Bs](e);let t=this[_];this[_]=void 0,this[hi](t)}else this[hi](e);for(;this[_]&&this[_]?.length>=512&&!this[Oe]&&!this[fi];){let t=this[_];this[_]=void 0,this[hi](t)}this[Rt]=!1}(!this[_]||this[Re])&&this[li]()}[hi](e){let t=0,i=e.length;for(;t+512<=i&&!this[Oe]&&!this[fi];)switch(this[H]){case"begin":case"header":this[en](e,t),t+=512;break;case"ignore":case"body":t+=this[Fs](e,t);break;case"meta":t+=this[Jr](e,t);break;default:throw new Error("invalid state: "+this[H])}t<i&&(this[_]?this[_]=Buffer.concat([e.subarray(t),this[_]]):this[_]=e.subarray(t))}end(e,t,i){return typeof e=="function"&&(i=e,t=void 0,e=void 0),typeof t=="function"&&(i=t,t=void 0),typeof e=="string"&&(e=Buffer.from(e,t)),i&&this.once("finish",i),this[Oe]||(this[S]?(e&&this[S].write(e),this[S].end()):(this[Re]=!0,(this.brotli===void 0||this.zstd===void 0)&&(e=e||Buffer.alloc(0)),e&&this.write(e),this[li]())),this}};di.Parser=js});var _i=d(pi=>{"use strict";Object.defineProperty(pi,"__esModule",{value:!0});pi.stripTrailingSlashes=void 0;var Ca=s=>{let e=s.length-1,t=-1;for(;e>-1&&s.charAt(e)==="/";)t=e,e--;return t===-1?s:s.slice(0,t)};pi.stripTrailingSlashes=Ca});var st=d(F=>{"use strict";var Fa=F&&F.__createBinding||(Object.create?(function(s,e,t,i){i===void 0&&(i=t);var r=Object.getOwnPropertyDescriptor(e,t);(!r||("get"in r?!e.__esModule:r.writable||r.configurable))&&(r={enumerable:!0,get:function(){return e[t]}}),Object.defineProperty(s,i,r)}):(function(s,e,t,i){i===void 0&&(i=t),s[i]=e[t]})),Ba=F&&F.__setModuleDefault||(Object.create?(function(s,e){Object.defineProperty(s,"default",{enumerable:!0,value:e})}):function(s,e){s.default=e}),za=F&&F.__importStar||(function(){var s=function(e){return s=Object.getOwnPropertyNames||function(t){var i=[];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(i[i.length]=r);return i},s(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var i=s(e),r=0;r<i.length;r++)i[r]!=="default"&&Fa(t,e,i[r]);return Ba(t,e),t}})(),ka=F&&F.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(F,"__esModule",{value:!0});F.list=F.filesFilter=void 0;var ja=za(Ke()),it=ka(require("node:fs")),sn=require("path"),xa=Ve(),wi=mi(),xs=_i(),Ua=s=>{let e=s.onReadEntry;s.onReadEntry=e?t=>{e(t),t.resume()}:t=>t.resume()},qa=(s,e)=>{let t=new Map(e.map(n=>[(0,xs.stripTrailingSlashes)(n),!0])),i=s.filter,r=(n,o="")=>{let a=o||(0,sn.parse)(n).root||".",h;if(n===a)h=!1;else{let l=t.get(n);l!==void 0?h=l:h=r((0,sn.dirname)(n),a)}return t.set(n,h),h};s.filter=i?(n,o)=>i(n,o)&&r((0,xs.stripTrailingSlashes)(n)):n=>r((0,xs.stripTrailingSlashes)(n))};F.filesFilter=qa;var Wa=s=>{let e=new wi.Parser(s),t=s.file,i;try{i=it.default.openSync(t,"r");let r=it.default.fstatSync(i),n=s.maxReadSize||16*1024*1024;if(r.size<n){let o=Buffer.allocUnsafe(r.size),a=it.default.readSync(i,o,0,r.size,0);e.end(a===o.byteLength?o:o.subarray(0,a))}else{let o=0,a=Buffer.allocUnsafe(n);for(;o<r.size;){let h=it.default.readSync(i,a,0,n,o);if(h===0)break;o+=h,e.write(a.subarray(0,h))}e.end()}}finally{if(typeof i=="number")try{it.default.closeSync(i)}catch{}}},Ha=(s,e)=>{let t=new wi.Parser(s),i=s.maxReadSize||16*1024*1024,r=s.file;return new Promise((o,a)=>{t.on("error",a),t.on("end",o),it.default.stat(r,(h,l)=>{if(h)a(h);else{let u=new ja.ReadStream(r,{readSize:i,size:l.size});u.on("error",a),u.pipe(t)}})})};F.list=(0,xa.makeCommand)(Wa,Ha,s=>new wi.Parser(s),s=>new wi.Parser(s),(s,e)=>{e?.length&&(0,F.filesFilter)(s,e),s.noResume||Ua(s)})});var rn=d(yi=>{"use strict";Object.defineProperty(yi,"__esModule",{value:!0});yi.modeFix=void 0;var Za=(s,e,t)=>(s&=4095,t&&(s=(s|384)&-19),e&&(s&256&&(s|=64),s&32&&(s|=8),s&4&&(s|=1)),s);yi.modeFix=Za});var Us=d(Ei=>{"use strict";Object.defineProperty(Ei,"__esModule",{value:!0});Ei.stripAbsolutePath=void 0;var Ga=require("node:path"),{isAbsolute:Ya,parse:nn}=Ga.win32,Ka=s=>{let e="",t=nn(s);for(;Ya(s)||t.root;){let i=s.charAt(0)==="/"&&s.slice(0,4)!=="//?/"?"/":t.root;s=s.slice(i.length),e+=i,t=nn(s)}return[e,s]};Ei.stripAbsolutePath=Ka});var Ws=d(rt=>{"use strict";Object.defineProperty(rt,"__esModule",{value:!0});rt.decode=rt.encode=void 0;var bi=["|","<",">","?",":"],qs=bi.map(s=>String.fromCharCode(61440+s.charCodeAt(0))),Va=new Map(bi.map((s,e)=>[s,qs[e]])),$a=new Map(qs.map((s,e)=>[s,bi[e]])),Xa=s=>bi.reduce((e,t)=>e.split(t).join(Va.get(t)),s);rt.encode=Xa;var Qa=s=>qs.reduce((e,t)=>e.split(t).join($a.get(t)),s);rt.decode=Qa});var er=d(M=>{"use strict";var Ja=M&&M.__createBinding||(Object.create?(function(s,e,t,i){i===void 0&&(i=t);var r=Object.getOwnPropertyDescriptor(e,t);(!r||("get"in r?!e.__esModule:r.writable||r.configurable))&&(r={enumerable:!0,get:function(){return e[t]}}),Object.defineProperty(s,i,r)}):(function(s,e,t,i){i===void 0&&(i=t),s[i]=e[t]})),eh=M&&M.__setModuleDefault||(Object.create?(function(s,e){Object.defineProperty(s,"default",{enumerable:!0,value:e})}):function(s,e){s.default=e}),th=M&&M.__importStar||(function(){var s=function(e){return s=Object.getOwnPropertyNames||function(t){var i=[];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(i[i.length]=r);return i},s(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var i=s(e),r=0;r<i.length;r++)i[r]!=="default"&&Ja(t,e,i[r]);return eh(t,e),t}})(),cn=M&&M.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(M,"__esModule",{value:!0});M.WriteEntryTar=M.WriteEntrySync=M.WriteEntry=void 0;var oe=cn(require("fs")),fn=We(),on=cn(require("path")),dn=Je(),mn=rn(),ne=et(),pn=Vt(),_n=ei(),wn=Us(),ih=_i(),yn=oi(),sh=th(Ws()),En=(s,e)=>e?(s=(0,ne.normalizeWindowsPath)(s).replace(/^\.(\/|$)/,""),(0,ih.stripTrailingSlashes)(e)+"/"+s):(0,ne.normalizeWindowsPath)(s),rh=16*1024*1024,an=Symbol("process"),hn=Symbol("file"),ln=Symbol("directory"),Zs=Symbol("symlink"),un=Symbol("hardlink"),Ot=Symbol("header"),Si=Symbol("read"),Gs=Symbol("lstat"),gi=Symbol("onlstat"),Ys=Symbol("onread"),Ks=Symbol("onreadlink"),Vs=Symbol("openfile"),$s=Symbol("onopenfile"),ve=Symbol("close"),Ri=Symbol("mode"),Xs=Symbol("awaitDrain"),Hs=Symbol("ondrain"),ae=Symbol("prefix"),Oi=class extends fn.Minipass{path;portable;myuid=process.getuid&&process.getuid()||0;myuser=process.env.USER||"";maxReadSize;linkCache;statCache;preservePaths;cwd;strict;mtime;noPax;noMtime;prefix;fd;blockLen=0;blockRemain=0;buf;pos=0;remain=0;length=0;offset=0;win32;absolute;header;type;linkpath;stat;onWriteEntry;#e=!1;constructor(e,t={}){let i=(0,pn.dealias)(t);super(),this.path=(0,ne.normalizeWindowsPath)(e),this.portable=!!i.portable,this.maxReadSize=i.maxReadSize||rh,this.linkCache=i.linkCache||new Map,this.statCache=i.statCache||new Map,this.preservePaths=!!i.preservePaths,this.cwd=(0,ne.normalizeWindowsPath)(i.cwd||process.cwd()),this.strict=!!i.strict,this.noPax=!!i.noPax,this.noMtime=!!i.noMtime,this.mtime=i.mtime,this.prefix=i.prefix?(0,ne.normalizeWindowsPath)(i.prefix):void 0,this.onWriteEntry=i.onWriteEntry,typeof i.onwarn=="function"&&this.on("warn",i.onwarn);let r=!1;if(!this.preservePaths){let[o,a]=(0,wn.stripAbsolutePath)(this.path);o&&typeof a=="string"&&(this.path=a,r=o)}this.win32=!!i.win32||process.platform==="win32",this.win32&&(this.path=sh.decode(this.path.replace(/\\/g,"/")),e=e.replace(/\\/g,"/")),this.absolute=(0,ne.normalizeWindowsPath)(i.absolute||on.default.resolve(this.cwd,e)),this.path===""&&(this.path="./"),r&&this.warn("TAR_ENTRY_INFO",`stripping ${r} from absolute path`,{entry:this,path:r+this.path});let n=this.statCache.get(this.absolute);n?this[gi](n):this[Gs]()}warn(e,t,i={}){return(0,yn.warnMethod)(this,e,t,i)}emit(e,...t){return e==="error"&&(this.#e=!0),super.emit(e,...t)}[Gs](){oe.default.lstat(this.absolute,(e,t)=>{if(e)return this.emit("error",e);this[gi](t)})}[gi](e){this.statCache.set(this.absolute,e),this.stat=e,e.isFile()||(e.size=0),this.type=nh(e),this.emit("stat",e),this[an]()}[an](){switch(this.type){case"File":return this[hn]();case"Directory":return this[ln]();case"SymbolicLink":return this[Zs]();default:return this.end()}}[Ri](e){return(0,mn.modeFix)(e,this.type==="Directory",this.portable)}[ae](e){return En(e,this.prefix)}[Ot](){if(!this.stat)throw new Error("cannot write header before stat");this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.onWriteEntry?.(this),this.header=new dn.Header({path:this[ae](this.path),linkpath:this.type==="Link"&&this.linkpath!==void 0?this[ae](this.linkpath):this.linkpath,mode:this[Ri](this.stat.mode),uid:this.portable?void 0:this.stat.uid,gid:this.portable?void 0:this.stat.gid,size:this.stat.size,mtime:this.noMtime?void 0:this.mtime||this.stat.mtime,type:this.type==="Unsupported"?void 0:this.type,uname:this.portable?void 0:this.stat.uid===this.myuid?this.myuser:"",atime:this.portable?void 0:this.stat.atime,ctime:this.portable?void 0:this.stat.ctime}),this.header.encode()&&!this.noPax&&super.write(new _n.Pax({atime:this.portable?void 0:this.header.atime,ctime:this.portable?void 0:this.header.ctime,gid:this.portable?void 0:this.header.gid,mtime:this.noMtime?void 0:this.mtime||this.header.mtime,path:this[ae](this.path),linkpath:this.type==="Link"&&this.linkpath!==void 0?this[ae](this.linkpath):this.linkpath,size:this.header.size,uid:this.portable?void 0:this.header.uid,uname:this.portable?void 0:this.header.uname,dev:this.portable?void 0:this.stat.dev,ino:this.portable?void 0:this.stat.ino,nlink:this.portable?void 0:this.stat.nlink}).encode());let e=this.header?.block;if(!e)throw new Error("failed to encode header");super.write(e)}[ln](){if(!this.stat)throw new Error("cannot create directory entry without stat");this.path.slice(-1)!=="/"&&(this.path+="/"),this.stat.size=0,this[Ot](),this.end()}[Zs](){oe.default.readlink(this.absolute,(e,t)=>{if(e)return this.emit("error",e);this[Ks](t)})}[Ks](e){this.linkpath=(0,ne.normalizeWindowsPath)(e),this[Ot](),this.end()}[un](e){if(!this.stat)throw new Error("cannot create link entry without stat");this.type="Link",this.linkpath=(0,ne.normalizeWindowsPath)(on.default.relative(this.cwd,e)),this.stat.size=0,this[Ot](),this.end()}[hn](){if(!this.stat)throw new Error("cannot create file entry without stat");if(this.stat.nlink>1){let e=`${this.stat.dev}:${this.stat.ino}`,t=this.linkCache.get(e);if(t?.indexOf(this.cwd)===0)return this[un](t);this.linkCache.set(e,this.absolute)}if(this[Ot](),this.stat.size===0)return this.end();this[Vs]()}[Vs](){oe.default.open(this.absolute,"r",(e,t)=>{if(e)return this.emit("error",e);this[$s](t)})}[$s](e){if(this.fd=e,this.#e)return this[ve]();if(!this.stat)throw new Error("should stat before calling onopenfile");this.blockLen=512*Math.ceil(this.stat.size/512),this.blockRemain=this.blockLen;let t=Math.min(this.blockLen,this.maxReadSize);this.buf=Buffer.allocUnsafe(t),this.offset=0,this.pos=0,this.remain=this.stat.size,this.length=this.buf.length,this[Si]()}[Si](){let{fd:e,buf:t,offset:i,length:r,pos:n}=this;if(e===void 0||t===void 0)throw new Error("cannot read file without first opening");oe.default.read(e,t,i,r,n,(o,a)=>{if(o)return this[ve](()=>this.emit("error",o));this[Ys](a)})}[ve](e=()=>{}){this.fd!==void 0&&oe.default.close(this.fd,e)}[Ys](e){if(e<=0&&this.remain>0){let r=Object.assign(new Error("encountered unexpected EOF"),{path:this.absolute,syscall:"read",code:"EOF"});return this[ve](()=>this.emit("error",r))}if(e>this.remain){let r=Object.assign(new Error("did not encounter expected EOF"),{path:this.absolute,syscall:"read",code:"EOF"});return this[ve](()=>this.emit("error",r))}if(!this.buf)throw new Error("should have created buffer prior to reading");if(e===this.remain)for(let r=e;r<this.length&&e<this.blockRemain;r++)this.buf[r+this.offset]=0,e++,this.remain++;let t=this.offset===0&&e===this.buf.length?this.buf:this.buf.subarray(this.offset,this.offset+e);this.write(t)?this[Hs]():this[Xs](()=>this[Hs]())}[Xs](e){this.once("drain",e)}write(e,t,i){if(typeof t=="function"&&(i=t,t=void 0),typeof e=="string"&&(e=Buffer.from(e,typeof t=="string"?t:"utf8")),this.blockRemain<e.length){let r=Object.assign(new Error("writing more data than expected"),{path:this.absolute});return this.emit("error",r)}return this.remain-=e.length,this.blockRemain-=e.length,this.pos+=e.length,this.offset+=e.length,super.write(e,null,i)}[Hs](){if(!this.remain)return this.blockRemain&&super.write(Buffer.alloc(this.blockRemain)),this[ve](e=>e?this.emit("error",e):this.end());if(!this.buf)throw new Error("buffer lost somehow in ONDRAIN");this.offset>=this.length&&(this.buf=Buffer.allocUnsafe(Math.min(this.blockRemain,this.buf.length)),this.offset=0),this.length=this.buf.length-this.offset,this[Si]()}};M.WriteEntry=Oi;var Qs=class extends Oi{sync=!0;[Gs](){this[gi](oe.default.lstatSync(this.absolute))}[Zs](){this[Ks](oe.default.readlinkSync(this.absolute))}[Vs](){this[$s](oe.default.openSync(this.absolute,"r"))}[Si](){let e=!0;try{let{fd:t,buf:i,offset:r,length:n,pos:o}=this;if(t===void 0||i===void 0)throw new Error("fd and buf must be set in READ method");let a=oe.default.readSync(t,i,r,n,o);this[Ys](a),e=!1}finally{if(e)try{this[ve](()=>{})}catch{}}}[Xs](e){e()}[ve](e=()=>{}){this.fd!==void 0&&oe.default.closeSync(this.fd),e()}};M.WriteEntrySync=Qs;var Js=class extends fn.Minipass{blockLen=0;blockRemain=0;buf=0;pos=0;remain=0;length=0;preservePaths;portable;strict;noPax;noMtime;readEntry;type;prefix;path;mode;uid;gid;uname;gname;header;mtime;atime;ctime;linkpath;size;onWriteEntry;warn(e,t,i={}){return(0,yn.warnMethod)(this,e,t,i)}constructor(e,t={}){let i=(0,pn.dealias)(t);super(),this.preservePaths=!!i.preservePaths,this.portable=!!i.portable,this.strict=!!i.strict,this.noPax=!!i.noPax,this.noMtime=!!i.noMtime,this.onWriteEntry=i.onWriteEntry,this.readEntry=e;let{type:r}=e;if(r==="Unsupported")throw new Error("writing entry that should be ignored");this.type=r,this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.prefix=i.prefix,this.path=(0,ne.normalizeWindowsPath)(e.path),this.mode=e.mode!==void 0?this[Ri](e.mode):void 0,this.uid=this.portable?void 0:e.uid,this.gid=this.portable?void 0:e.gid,this.uname=this.portable?void 0:e.uname,this.gname=this.portable?void 0:e.gname,this.size=e.size,this.mtime=this.noMtime?void 0:i.mtime||e.mtime,this.atime=this.portable?void 0:e.atime,this.ctime=this.portable?void 0:e.ctime,this.linkpath=e.linkpath!==void 0?(0,ne.normalizeWindowsPath)(e.linkpath):void 0,typeof i.onwarn=="function"&&this.on("warn",i.onwarn);let n=!1;if(!this.preservePaths){let[a,h]=(0,wn.stripAbsolutePath)(this.path);a&&typeof h=="string"&&(this.path=h,n=a)}this.remain=e.size,this.blockRemain=e.startBlockSize,this.onWriteEntry?.(this),this.header=new dn.Header({path:this[ae](this.path),linkpath:this.type==="Link"&&this.linkpath!==void 0?this[ae](this.linkpath):this.linkpath,mode:this.mode,uid:this.portable?void 0:this.uid,gid:this.portable?void 0:this.gid,size:this.size,mtime:this.noMtime?void 0:this.mtime,type:this.type,uname:this.portable?void 0:this.uname,atime:this.portable?void 0:this.atime,ctime:this.portable?void 0:this.ctime}),n&&this.warn("TAR_ENTRY_INFO",`stripping ${n} from absolute path`,{entry:this,path:n+this.path}),this.header.encode()&&!this.noPax&&super.write(new _n.Pax({atime:this.portable?void 0:this.atime,ctime:this.portable?void 0:this.ctime,gid:this.portable?void 0:this.gid,mtime:this.noMtime?void 0:this.mtime,path:this[ae](this.path),linkpath:this.type==="Link"&&this.linkpath!==void 0?this[ae](this.linkpath):this.linkpath,size:this.size,uid:this.portable?void 0:this.uid,uname:this.portable?void 0:this.uname,dev:this.portable?void 0:this.readEntry.dev,ino:this.portable?void 0:this.readEntry.ino,nlink:this.portable?void 0:this.readEntry.nlink}).encode());let o=this.header?.block;if(!o)throw new Error("failed to encode header");super.write(o),e.pipe(this)}[ae](e){return En(e,this.prefix)}[Ri](e){return(0,mn.modeFix)(e,this.type==="Directory",this.portable)}write(e,t,i){typeof t=="function"&&(i=t,t=void 0),typeof e=="string"&&(e=Buffer.from(e,typeof t=="string"?t:"utf8"));let r=e.length;if(r>this.blockRemain)throw new Error("writing more to entry than is appropriate");return this.blockRemain-=r,super.write(e,i)}end(e,t,i){return this.blockRemain&&super.write(Buffer.alloc(this.blockRemain)),typeof e=="function"&&(i=e,t=void 0,e=void 0),typeof t=="function"&&(i=t,t=void 0),typeof e=="string"&&(e=Buffer.from(e,t??"utf8")),i&&this.once("finish",i),e?super.end(e,i):super.end(i),this}};M.WriteEntryTar=Js;var nh=s=>s.isFile()?"File":s.isDirectory()?"Directory":s.isSymbolicLink()?"SymbolicLink":"Unsupported"});var bn=d(ot=>{"use strict";Object.defineProperty(ot,"__esModule",{value:!0});ot.Node=ot.Yallist=void 0;var tr=class s{tail;head;length=0;static create(e=[]){return new s(e)}constructor(e=[]){for(let t of e)this.push(t)}*[Symbol.iterator](){for(let e=this.head;e;e=e.next)yield e.value}removeNode(e){if(e.list!==this)throw new Error("removing node which does not belong to this list");let t=e.next,i=e.prev;return t&&(t.prev=i),i&&(i.next=t),e===this.head&&(this.head=t),e===this.tail&&(this.tail=i),this.length--,e.next=void 0,e.prev=void 0,e.list=void 0,t}unshiftNode(e){if(e===this.head)return;e.list&&e.list.removeNode(e);let t=this.head;e.list=this,e.next=t,t&&(t.prev=e),this.head=e,this.tail||(this.tail=e),this.length++}pushNode(e){if(e===this.tail)return;e.list&&e.list.removeNode(e);let t=this.tail;e.list=this,e.prev=t,t&&(t.next=e),this.tail=e,this.head||(this.head=e),this.length++}push(...e){for(let t=0,i=e.length;t<i;t++)ah(this,e[t]);return this.length}unshift(...e){for(var t=0,i=e.length;t<i;t++)hh(this,e[t]);return this.length}pop(){if(!this.tail)return;let e=this.tail.value,t=this.tail;return this.tail=this.tail.prev,this.tail?this.tail.next=void 0:this.head=void 0,t.list=void 0,this.length--,e}shift(){if(!this.head)return;let e=this.head.value,t=this.head;return this.head=this.head.next,this.head?this.head.prev=void 0:this.tail=void 0,t.list=void 0,this.length--,e}forEach(e,t){t=t||this;for(let i=this.head,r=0;i;r++)e.call(t,i.value,r,this),i=i.next}forEachReverse(e,t){t=t||this;for(let i=this.tail,r=this.length-1;i;r--)e.call(t,i.value,r,this),i=i.prev}get(e){let t=0,i=this.head;for(;i&&t<e;t++)i=i.next;if(t===e&&i)return i.value}getReverse(e){let t=0,i=this.tail;for(;i&&t<e;t++)i=i.prev;if(t===e&&i)return i.value}map(e,t){t=t||this;let i=new s;for(let r=this.head;r;)i.push(e.call(t,r.value,this)),r=r.next;return i}mapReverse(e,t){t=t||this;var i=new s;for(let r=this.tail;r;)i.push(e.call(t,r.value,this)),r=r.prev;return i}reduce(e,t){let i,r=this.head;if(arguments.length>1)i=t;else if(this.head)r=this.head.next,i=this.head.value;else throw new TypeError("Reduce of empty list with no initial value");for(var n=0;r;n++)i=e(i,r.value,n),r=r.next;return i}reduceReverse(e,t){let i,r=this.tail;if(arguments.length>1)i=t;else if(this.tail)r=this.tail.prev,i=this.tail.value;else throw new TypeError("Reduce of empty list with no initial value");for(let n=this.length-1;r;n--)i=e(i,r.value,n),r=r.prev;return i}toArray(){let e=new Array(this.length);for(let t=0,i=this.head;i;t++)e[t]=i.value,i=i.next;return e}toArrayReverse(){let e=new Array(this.length);for(let t=0,i=this.tail;i;t++)e[t]=i.value,i=i.prev;return e}slice(e=0,t=this.length){t<0&&(t+=this.length),e<0&&(e+=this.length);let i=new s;if(t<e||t<0)return i;e<0&&(e=0),t>this.length&&(t=this.length);let r=this.head,n=0;for(n=0;r&&n<e;n++)r=r.next;for(;r&&n<t;n++,r=r.next)i.push(r.value);return i}sliceReverse(e=0,t=this.length){t<0&&(t+=this.length),e<0&&(e+=this.length);let i=new s;if(t<e||t<0)return i;e<0&&(e=0),t>this.length&&(t=this.length);let r=this.length,n=this.tail;for(;n&&r>t;r--)n=n.prev;for(;n&&r>e;r--,n=n.prev)i.push(n.value);return i}splice(e,t=0,...i){e>this.length&&(e=this.length-1),e<0&&(e=this.length+e);let r=this.head;for(let o=0;r&&o<e;o++)r=r.next;let n=[];for(let o=0;r&&o<t;o++)n.push(r.value),r=this.removeNode(r);r?r!==this.tail&&(r=r.prev):r=this.tail;for(let o of i)r=oh(this,r,o);return n}reverse(){let e=this.head,t=this.tail;for(let i=e;i;i=i.prev){let r=i.prev;i.prev=i.next,i.next=r}return this.head=t,this.tail=e,this}};ot.Yallist=tr;function oh(s,e,t){let i=e,r=e?e.next:s.head,n=new nt(t,i,r,s);return n.next===void 0&&(s.tail=n),n.prev===void 0&&(s.head=n),s.length++,n}function ah(s,e){s.tail=new nt(e,s.tail,void 0,s),s.head||(s.head=s.tail),s.length++}function hh(s,e){s.head=new nt(e,void 0,s.head,s),s.tail||(s.tail=s.head),s.length++}var nt=class{list;next;prev;value;constructor(e,t,i,r){this.list=r,this.value=e,t?(t.next=this,this.prev=t):this.prev=void 0,i?(i.prev=this,this.next=i):this.next=void 0}};ot.Node=nt});var Ai=d(L=>{"use strict";var lh=L&&L.__createBinding||(Object.create?(function(s,e,t,i){i===void 0&&(i=t);var r=Object.getOwnPropertyDescriptor(e,t);(!r||("get"in r?!e.__esModule:r.writable||r.configurable))&&(r={enumerable:!0,get:function(){return e[t]}}),Object.defineProperty(s,i,r)}):(function(s,e,t,i){i===void 0&&(i=t),s[i]=e[t]})),uh=L&&L.__setModuleDefault||(Object.create?(function(s,e){Object.defineProperty(s,"default",{enumerable:!0,value:e})}):function(s,e){s.default=e}),ch=L&&L.__importStar||(function(){var s=function(e){return s=Object.getOwnPropertyNames||function(t){var i=[];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(i[i.length]=r);return i},s(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var i=s(e),r=0;r<i.length;r++)i[r]!=="default"&&lh(t,e,i[r]);return uh(t,e),t}})(),vn=L&&L.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(L,"__esModule",{value:!0});L.PackSync=L.Pack=L.PackJob=void 0;var Mi=vn(require("fs")),hr=er(),Dt=class{path;absolute;entry;stat;readdir;pending=!1;ignore=!1;piped=!1;constructor(e,t){this.path=e||"./",this.absolute=t}};L.PackJob=Dt;var fh=We(),ir=ch(vs()),dh=bn(),mh=ri(),ph=oi(),Sn=Buffer.alloc(1024),vi=Symbol("onStat"),vt=Symbol("ended"),X=Symbol("queue"),je=Symbol("current"),xe=Symbol("process"),Tt=Symbol("processing"),sr=Symbol("processJob"),Q=Symbol("jobs"),rr=Symbol("jobDone"),Ti=Symbol("addFSEntry"),gn=Symbol("addTarEntry"),lr=Symbol("stat"),ur=Symbol("readdir"),Di=Symbol("onreaddir"),Pi=Symbol("pipe"),Rn=Symbol("entry"),nr=Symbol("entryOpt"),Ni=Symbol("writeEntryClass"),Tn=Symbol("write"),or=Symbol("ondrain"),On=vn(require("path")),ar=et(),Li=class extends fh.Minipass{sync=!1;opt;cwd;maxReadSize;preservePaths;strict;noPax;prefix;linkCache;statCache;file;portable;zip;readdirCache;noDirRecurse;follow;noMtime;mtime;filter;jobs;[Ni];onWriteEntry;[X];[Q]=0;[Tt]=!1;[vt]=!1;constructor(e={}){if(super(),this.opt=e,this.file=e.file||"",this.cwd=e.cwd||process.cwd(),this.maxReadSize=e.maxReadSize,this.preservePaths=!!e.preservePaths,this.strict=!!e.strict,this.noPax=!!e.noPax,this.prefix=(0,ar.normalizeWindowsPath)(e.prefix||""),this.linkCache=e.linkCache||new Map,this.statCache=e.statCache||new Map,this.readdirCache=e.readdirCache||new Map,this.onWriteEntry=e.onWriteEntry,this[Ni]=hr.WriteEntry,typeof e.onwarn=="function"&&this.on("warn",e.onwarn),this.portable=!!e.portable,e.gzip||e.brotli||e.zstd){if((e.gzip?1:0)+(e.brotli?1:0)+(e.zstd?1:0)>1)throw new TypeError("gzip, brotli, zstd are mutually exclusive");if(e.gzip&&(typeof e.gzip!="object"&&(e.gzip={}),this.portable&&(e.gzip.portable=!0),this.zip=new ir.Gzip(e.gzip)),e.brotli&&(typeof e.brotli!="object"&&(e.brotli={}),this.zip=new ir.BrotliCompress(e.brotli)),e.zstd&&(typeof e.zstd!="object"&&(e.zstd={}),this.zip=new ir.ZstdCompress(e.zstd)),!this.zip)throw new Error("impossible");let t=this.zip;t.on("data",i=>super.write(i)),t.on("end",()=>super.end()),t.on("drain",()=>this[or]()),this.on("resume",()=>t.resume())}else this.on("drain",this[or]);this.noDirRecurse=!!e.noDirRecurse,this.follow=!!e.follow,this.noMtime=!!e.noMtime,e.mtime&&(this.mtime=e.mtime),this.filter=typeof e.filter=="function"?e.filter:()=>!0,this[X]=new dh.Yallist,this[Q]=0,this.jobs=Number(e.jobs)||4,this[Tt]=!1,this[vt]=!1}[Tn](e){return super.write(e)}add(e){return this.write(e),this}end(e,t,i){return typeof e=="function"&&(i=e,e=void 0),typeof t=="function"&&(i=t,t=void 0),e&&this.add(e),this[vt]=!0,this[xe](),i&&i(),this}write(e){if(this[vt])throw new Error("write after end");return e instanceof mh.ReadEntry?this[gn](e):this[Ti](e),this.flowing}[gn](e){let t=(0,ar.normalizeWindowsPath)(On.default.resolve(this.cwd,e.path));if(!this.filter(e.path,e))e.resume();else{let i=new Dt(e.path,t);i.entry=new hr.WriteEntryTar(e,this[nr](i)),i.entry.on("end",()=>this[rr](i)),this[Q]+=1,this[X].push(i)}this[xe]()}[Ti](e){let t=(0,ar.normalizeWindowsPath)(On.default.resolve(this.cwd,e));this[X].push(new Dt(e,t)),this[xe]()}[lr](e){e.pending=!0,this[Q]+=1;let t=this.follow?"stat":"lstat";Mi.default[t](e.absolute,(i,r)=>{e.pending=!1,this[Q]-=1,i?this.emit("error",i):this[vi](e,r)})}[vi](e,t){this.statCache.set(e.absolute,t),e.stat=t,this.filter(e.path,t)?t.isFile()&&t.nlink>1&&e===this[je]&&!this.linkCache.get(`${t.dev}:${t.ino}`)&&!this.sync&&this[sr](e):e.ignore=!0,this[xe]()}[ur](e){e.pending=!0,this[Q]+=1,Mi.default.readdir(e.absolute,(t,i)=>{if(e.pending=!1,this[Q]-=1,t)return this.emit("error",t);this[Di](e,i)})}[Di](e,t){this.readdirCache.set(e.absolute,t),e.readdir=t,this[xe]()}[xe](){if(!this[Tt]){this[Tt]=!0;for(let e=this[X].head;e&&this[Q]<this.jobs;e=e.next)if(this[sr](e.value),e.value.ignore){let t=e.next;this[X].removeNode(e),e.next=t}this[Tt]=!1,this[vt]&&!this[X].length&&this[Q]===0&&(this.zip?this.zip.end(Sn):(super.write(Sn),super.end()))}}get[je](){return this[X]&&this[X].head&&this[X].head.value}[rr](e){this[X].shift(),this[Q]-=1,this[xe]()}[sr](e){if(!e.pending){if(e.entry){e===this[je]&&!e.piped&&this[Pi](e);return}if(!e.stat){let t=this.statCache.get(e.absolute);t?this[vi](e,t):this[lr](e)}if(e.stat&&!e.ignore){if(!this.noDirRecurse&&e.stat.isDirectory()&&!e.readdir){let t=this.readdirCache.get(e.absolute);if(t?this[Di](e,t):this[ur](e),!e.readdir)return}if(e.entry=this[Rn](e),!e.entry){e.ignore=!0;return}e===this[je]&&!e.piped&&this[Pi](e)}}}[nr](e){return{onwarn:(t,i,r)=>this.warn(t,i,r),noPax:this.noPax,cwd:this.cwd,absolute:e.absolute,preservePaths:this.preservePaths,maxReadSize:this.maxReadSize,strict:this.strict,portable:this.portable,linkCache:this.linkCache,statCache:this.statCache,noMtime:this.noMtime,mtime:this.mtime,prefix:this.prefix,onWriteEntry:this.onWriteEntry}}[Rn](e){this[Q]+=1;try{return new this[Ni](e.path,this[nr](e)).on("end",()=>this[rr](e)).on("error",i=>this.emit("error",i))}catch(t){this.emit("error",t)}}[or](){this[je]&&this[je].entry&&this[je].entry.resume()}[Pi](e){e.piped=!0,e.readdir&&e.readdir.forEach(r=>{let n=e.path,o=n==="./"?"":n.replace(/\/*$/,"/");this[Ti](o+r)});let t=e.entry,i=this.zip;if(!t)throw new Error("cannot pipe without source");i?t.on("data",r=>{i.write(r)||t.pause()}):t.on("data",r=>{super.write(r)||t.pause()})}pause(){return this.zip&&this.zip.pause(),super.pause()}warn(e,t,i={}){(0,ph.warnMethod)(this,e,t,i)}};L.Pack=Li;var cr=class extends Li{sync=!0;constructor(e){super(e),this[Ni]=hr.WriteEntrySync}pause(){}resume(){}[lr](e){let t=this.follow?"statSync":"lstatSync";this[vi](e,Mi.default[t](e.absolute))}[ur](e){this[Di](e,Mi.default.readdirSync(e.absolute))}[Pi](e){let t=e.entry,i=this.zip;if(e.readdir&&e.readdir.forEach(r=>{let n=e.path,o=n==="./"?"":n.replace(/\/*$/,"/");this[Ti](o+r)}),!t)throw new Error("Cannot pipe without source");i?t.on("data",r=>{i.write(r)}):t.on("data",r=>{super[Tn](r)})}};L.PackSync=cr});var fr=d(at=>{"use strict";var _h=at&&at.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(at,"__esModule",{value:!0});at.create=void 0;var Dn=Ke(),Pn=_h(require("node:path")),Nn=st(),wh=Ve(),Ii=Ai(),yh=(s,e)=>{let t=new Ii.PackSync(s),i=new Dn.WriteStreamSync(s.file,{mode:s.mode||438});t.pipe(i),Mn(t,e)},Eh=(s,e)=>{let t=new Ii.Pack(s),i=new Dn.WriteStream(s.file,{mode:s.mode||438});t.pipe(i);let r=new Promise((n,o)=>{i.on("error",o),i.on("close",n),t.on("error",o)});return Ln(t,e),r},Mn=(s,e)=>{e.forEach(t=>{t.charAt(0)==="@"?(0,Nn.list)({file:Pn.default.resolve(s.cwd,t.slice(1)),sync:!0,noResume:!0,onReadEntry:i=>s.add(i)}):s.add(t)}),s.end()},Ln=async(s,e)=>{for(let t=0;t<e.length;t++){let i=String(e[t]);i.charAt(0)==="@"?await(0,Nn.list)({file:Pn.default.resolve(String(s.cwd),i.slice(1)),noResume:!0,onReadEntry:r=>{s.add(r)}}):s.add(i)}s.end()},bh=(s,e)=>{let t=new Ii.PackSync(s);return Mn(t,e),t},Sh=(s,e)=>{let t=new Ii.Pack(s);return Ln(t,e),t};at.create=(0,wh.makeCommand)(yh,Eh,bh,Sh,(s,e)=>{if(!e?.length)throw new TypeError("no paths specified to add to archive")})});var Cn=d(ht=>{"use strict";var gh=ht&&ht.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(ht,"__esModule",{value:!0});ht.getWriteFlag=void 0;var An=gh(require("fs")),Rh=process.env.__FAKE_PLATFORM__||process.platform,Oh=Rh==="win32",{O_CREAT:vh,O_TRUNC:Th,O_WRONLY:Dh}=An.default.constants,In=Number(process.env.__FAKE_FS_O_FILENAME__)||An.default.constants.UV_FS_O_FILEMAP||0,Ph=Oh&&!!In,Nh=512*1024,Mh=In|Th|vh|Dh;ht.getWriteFlag=Ph?s=>s<Nh?Mh:"w":()=>"w"});var Bn=d(he=>{"use strict";var Fn=he&&he.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(he,"__esModule",{value:!0});he.chownrSync=he.chownr=void 0;var Fi=Fn(require("node:fs")),Pt=Fn(require("node:path")),dr=(s,e,t)=>{try{return Fi.default.lchownSync(s,e,t)}catch(i){if(i?.code!=="ENOENT")throw i}},Ci=(s,e,t,i)=>{Fi.default.lchown(s,e,t,r=>{i(r&&r?.code!=="ENOENT"?r:null)})},Lh=(s,e,t,i,r)=>{if(e.isDirectory())(0,he.chownr)(Pt.default.resolve(s,e.name),t,i,n=>{if(n)return r(n);let o=Pt.default.resolve(s,e.name);Ci(o,t,i,r)});else{let n=Pt.default.resolve(s,e.name);Ci(n,t,i,r)}},Ah=(s,e,t,i)=>{Fi.default.readdir(s,{withFileTypes:!0},(r,n)=>{if(r){if(r.code==="ENOENT")return i();if(r.code!=="ENOTDIR"&&r.code!=="ENOTSUP")return i(r)}if(r||!n.length)return Ci(s,e,t,i);let o=n.length,a=null,h=l=>{if(!a){if(l)return i(a=l);if(--o===0)return Ci(s,e,t,i)}};for(let l of n)Lh(s,l,e,t,h)})};he.chownr=Ah;var Ih=(s,e,t,i)=>{e.isDirectory()&&(0,he.chownrSync)(Pt.default.resolve(s,e.name),t,i),dr(Pt.default.resolve(s,e.name),t,i)},Ch=(s,e,t)=>{let i;try{i=Fi.default.readdirSync(s,{withFileTypes:!0})}catch(r){let n=r;if(n?.code==="ENOENT")return;if(n?.code==="ENOTDIR"||n?.code==="ENOTSUP")return dr(s,e,t);throw n}for(let r of i)Ih(s,r,e,t);return dr(s,e,t)};he.chownrSync=Ch});var zn=d(Bi=>{"use strict";Object.defineProperty(Bi,"__esModule",{value:!0});Bi.CwdError=void 0;var mr=class extends Error{path;code;syscall="chdir";constructor(e,t){super(`${t}: Cannot cd into '${e}'`),this.path=e,this.code=t}get name(){return"CwdError"}};Bi.CwdError=mr});var _r=d(zi=>{"use strict";Object.defineProperty(zi,"__esModule",{value:!0});zi.SymlinkError=void 0;var pr=class extends Error{path;symlink;syscall="symlink";code="TAR_SYMLINK_ERROR";constructor(e,t){super("TAR_SYMLINK_ERROR: Cannot extract through symbolic link"),this.symlink=e,this.path=t}get name(){return"SymlinkError"}};zi.SymlinkError=pr});var qn=d(Te=>{"use strict";var yr=Te&&Te.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(Te,"__esModule",{value:!0});Te.mkdirSync=Te.mkdir=void 0;var kn=Bn(),x=yr(require("node:fs")),Fh=yr(require("node:fs/promises")),ki=yr(require("node:path")),jn=zn(),pe=et(),xn=_r(),Bh=(s,e)=>{x.default.stat(s,(t,i)=>{(t||!i.isDirectory())&&(t=new jn.CwdError(s,t?.code||"ENOTDIR")),e(t)})},zh=(s,e,t)=>{s=(0,pe.normalizeWindowsPath)(s);let i=e.umask??18,r=e.mode|448,n=(r&i)!==0,o=e.uid,a=e.gid,h=typeof o=="number"&&typeof a=="number"&&(o!==e.processUid||a!==e.processGid),l=e.preserve,u=e.unlink,c=(0,pe.normalizeWindowsPath)(e.cwd),E=(w,P)=>{w?t(w):P&&h?(0,kn.chownr)(P,o,a,Cr=>E(Cr)):n?x.default.chmod(s,r,t):t()};if(s===c)return Bh(s,E);if(l)return Fh.default.mkdir(s,{mode:r,recursive:!0}).then(w=>E(null,w??void 0),E);let A=(0,pe.normalizeWindowsPath)(ki.default.relative(c,s)).split("/");wr(c,A,r,u,c,void 0,E)};Te.mkdir=zh;var wr=(s,e,t,i,r,n,o)=>{if(!e.length)return o(null,n);let a=e.shift(),h=(0,pe.normalizeWindowsPath)(ki.default.resolve(s+"/"+a));x.default.mkdir(h,t,Un(h,e,t,i,r,n,o))},Un=(s,e,t,i,r,n,o)=>a=>{a?x.default.lstat(s,(h,l)=>{if(h)h.path=h.path&&(0,pe.normalizeWindowsPath)(h.path),o(h);else if(l.isDirectory())wr(s,e,t,i,r,n,o);else if(i)x.default.unlink(s,u=>{if(u)return o(u);x.default.mkdir(s,t,Un(s,e,t,i,r,n,o))});else{if(l.isSymbolicLink())return o(new xn.SymlinkError(s,s+"/"+e.join("/")));o(a)}}):(n=n||s,wr(s,e,t,i,r,n,o))},kh=s=>{let e=!1,t;try{e=x.default.statSync(s).isDirectory()}catch(i){t=i?.code}finally{if(!e)throw new jn.CwdError(s,t??"ENOTDIR")}},jh=(s,e)=>{s=(0,pe.normalizeWindowsPath)(s);let t=e.umask??18,i=e.mode|448,r=(i&t)!==0,n=e.uid,o=e.gid,a=typeof n=="number"&&typeof o=="number"&&(n!==e.processUid||o!==e.processGid),h=e.preserve,l=e.unlink,u=(0,pe.normalizeWindowsPath)(e.cwd),c=w=>{w&&a&&(0,kn.chownrSync)(w,n,o),r&&x.default.chmodSync(s,i)};if(s===u)return kh(u),c();if(h)return c(x.default.mkdirSync(s,{mode:i,recursive:!0})??void 0);let D=(0,pe.normalizeWindowsPath)(ki.default.relative(u,s)).split("/"),A;for(let w=D.shift(),P=u;w&&(P+="/"+w);w=D.shift()){P=(0,pe.normalizeWindowsPath)(ki.default.resolve(P));try{x.default.mkdirSync(P,i),A=A||P}catch{let Fr=x.default.lstatSync(P);if(Fr.isDirectory())continue;if(l){x.default.unlinkSync(P),x.default.mkdirSync(P,i),A=A||P;continue}else if(Fr.isSymbolicLink())return new xn.SymlinkError(P,P+"/"+D.join("/"))}}return c(A)};Te.mkdirSync=jh});var Hn=d(ji=>{"use strict";Object.defineProperty(ji,"__esModule",{value:!0});ji.normalizeUnicode=void 0;var Er=Object.create(null),Wn=1e4,lt=new Set,xh=s=>{lt.has(s)?lt.delete(s):Er[s]=s.normalize("NFD").toLocaleLowerCase("en").toLocaleUpperCase("en"),lt.add(s);let e=Er[s],t=lt.size-Wn;if(t>Wn/10){for(let i of lt)if(lt.delete(i),delete Er[i],--t<=0)break}return e};ji.normalizeUnicode=xh});var Gn=d(xi=>{"use strict";Object.defineProperty(xi,"__esModule",{value:!0});xi.PathReservations=void 0;var Zn=require("node:path"),Uh=Hn(),qh=_i(),Wh=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform,Hh=Wh==="win32",Zh=s=>s.split("/").slice(0,-1).reduce((t,i)=>{let r=t[t.length-1];return r!==void 0&&(i=(0,Zn.join)(r,i)),t.push(i||"/"),t},[]),br=class{#e=new Map;#i=new Map;#s=new Set;reserve(e,t){e=Hh?["win32 parallelization disabled"]:e.map(r=>(0,qh.stripTrailingSlashes)((0,Zn.join)((0,Uh.normalizeUnicode)(r))));let i=new Set(e.map(r=>Zh(r)).reduce((r,n)=>r.concat(n)));this.#i.set(t,{dirs:i,paths:e});for(let r of e){let n=this.#e.get(r);n?n.push(t):this.#e.set(r,[t])}for(let r of i){let n=this.#e.get(r);if(!n)this.#e.set(r,[new Set([t])]);else{let o=n[n.length-1];o instanceof Set?o.add(t):n.push(new Set([t]))}}return this.#r(t)}#n(e){let t=this.#i.get(e);if(!t)throw new Error("function does not have any path reservations");return{paths:t.paths.map(i=>this.#e.get(i)),dirs:[...t.dirs].map(i=>this.#e.get(i))}}check(e){let{paths:t,dirs:i}=this.#n(e);return t.every(r=>r&&r[0]===e)&&i.every(r=>r&&r[0]instanceof Set&&r[0].has(e))}#r(e){return this.#s.has(e)||!this.check(e)?!1:(this.#s.add(e),e(()=>this.#t(e)),!0)}#t(e){if(!this.#s.has(e))return!1;let t=this.#i.get(e);if(!t)throw new Error("invalid reservation");let{paths:i,dirs:r}=t,n=new Set;for(let o of i){let a=this.#e.get(o);if(!a||a?.[0]!==e)continue;let h=a[1];if(!h){this.#e.delete(o);continue}if(a.shift(),typeof h=="function")n.add(h);else for(let l of h)n.add(l)}for(let o of r){let a=this.#e.get(o),h=a?.[0];if(!(!a||!(h instanceof Set)))if(h.size===1&&a.length===1){this.#e.delete(o);continue}else if(h.size===1){a.shift();let l=a[0];typeof l=="function"&&n.add(l)}else h.delete(e)}return this.#s.delete(e),n.forEach(o=>this.#r(o)),!0}};xi.PathReservations=br});var Yn=d(Ui=>{"use strict";Object.defineProperty(Ui,"__esModule",{value:!0});Ui.umask=void 0;var Gh=()=>process.umask();Ui.umask=Gh});var Lr=d(z=>{"use strict";var Yh=z&&z.__createBinding||(Object.create?(function(s,e,t,i){i===void 0&&(i=t);var r=Object.getOwnPropertyDescriptor(e,t);(!r||("get"in r?!e.__esModule:r.writable||r.configurable))&&(r={enumerable:!0,get:function(){return e[t]}}),Object.defineProperty(s,i,r)}):(function(s,e,t,i){i===void 0&&(i=t),s[i]=e[t]})),Kh=z&&z.__setModuleDefault||(Object.create?(function(s,e){Object.defineProperty(s,"default",{enumerable:!0,value:e})}):function(s,e){s.default=e}),so=z&&z.__importStar||(function(){var s=function(e){return s=Object.getOwnPropertyNames||function(t){var i=[];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(i[i.length]=r);return i},s(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var i=s(e),r=0;r<i.length;r++)i[r]!=="default"&&Yh(t,e,i[r]);return Kh(t,e),t}})(),Mr=z&&z.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(z,"__esModule",{value:!0});z.UnpackSync=z.Unpack=void 0;var Vh=so(Ke()),$h=Mr(require("node:assert")),ro=require("node:crypto"),m=Mr(require("node:fs")),g=Mr(require("node:path")),no=Cn(),oo=qn(),U=et(),Xh=mi(),Qh=Us(),Kn=so(Ws()),Jh=Gn(),ao=_r(),el=Yn(),Vn=Symbol("onEntry"),Or=Symbol("checkFs"),$n=Symbol("checkFs2"),vr=Symbol("isReusable"),Z=Symbol("makeFs"),Tr=Symbol("file"),Dr=Symbol("directory"),Wi=Symbol("link"),Xn=Symbol("symlink"),Qn=Symbol("hardlink"),Mt=Symbol("ensureNoSymlink"),Jn=Symbol("unsupported"),eo=Symbol("checkPath"),Sr=Symbol("stripAbsolutePath"),De=Symbol("mkdir"),T=Symbol("onError"),qi=Symbol("pending"),to=Symbol("pend"),ut=Symbol("unpend"),gr=Symbol("ended"),Rr=Symbol("maybeClose"),Pr=Symbol("skip"),Lt=Symbol("doChown"),At=Symbol("uid"),It=Symbol("gid"),Ct=Symbol("checkedCwd"),tl=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform,Ft=tl==="win32",il=1024,sl=(s,e)=>{if(!Ft)return m.default.unlink(s,e);let t=s+".DELETE."+(0,ro.randomBytes)(16).toString("hex");m.default.rename(s,t,i=>{if(i)return e(i);m.default.unlink(t,e)})},rl=s=>{if(!Ft)return m.default.unlinkSync(s);let e=s+".DELETE."+(0,ro.randomBytes)(16).toString("hex");m.default.renameSync(s,e),m.default.unlinkSync(e)},io=(s,e,t)=>s!==void 0&&s===s>>>0?s:e!==void 0&&e===e>>>0?e:t,Hi=class extends Xh.Parser{[gr]=!1;[Ct]=!1;[qi]=0;reservations=new Jh.PathReservations;transform;writable=!0;readable=!1;uid;gid;setOwner;preserveOwner;processGid;processUid;maxDepth;forceChown;win32;newer;keep;noMtime;preservePaths;unlink;cwd;strip;processUmask;umask;dmode;fmode;chmod;constructor(e={}){if(e.ondone=()=>{this[gr]=!0,this[Rr]()},super(e),this.transform=e.transform,this.chmod=!!e.chmod,typeof e.uid=="number"||typeof e.gid=="number"){if(typeof e.uid!="number"||typeof e.gid!="number")throw new TypeError("cannot set owner without number uid and gid");if(e.preserveOwner)throw new TypeError("cannot preserve owner in archive and also set owner explicitly");this.uid=e.uid,this.gid=e.gid,this.setOwner=!0}else this.uid=void 0,this.gid=void 0,this.setOwner=!1;e.preserveOwner===void 0&&typeof e.uid!="number"?this.preserveOwner=!!(process.getuid&&process.getuid()===0):this.preserveOwner=!!e.preserveOwner,this.processUid=(this.preserveOwner||this.setOwner)&&process.getuid?process.getuid():void 0,this.processGid=(this.preserveOwner||this.setOwner)&&process.getgid?process.getgid():void 0,this.maxDepth=typeof e.maxDepth=="number"?e.maxDepth:il,this.forceChown=e.forceChown===!0,this.win32=!!e.win32||Ft,this.newer=!!e.newer,this.keep=!!e.keep,this.noMtime=!!e.noMtime,this.preservePaths=!!e.preservePaths,this.unlink=!!e.unlink,this.cwd=(0,U.normalizeWindowsPath)(g.default.resolve(e.cwd||process.cwd())),this.strip=Number(e.strip)||0,this.processUmask=this.chmod?typeof e.processUmask=="number"?e.processUmask:(0,el.umask)():0,this.umask=typeof e.umask=="number"?e.umask:this.processUmask,this.dmode=e.dmode||511&~this.umask,this.fmode=e.fmode||438&~this.umask,this.on("entry",t=>this[Vn](t))}warn(e,t,i={}){return(e==="TAR_BAD_ARCHIVE"||e==="TAR_ABORT")&&(i.recoverable=!1),super.warn(e,t,i)}[Rr](){this[gr]&&this[qi]===0&&(this.emit("prefinish"),this.emit("finish"),this.emit("end"))}[Sr](e,t){let i=e[t],{type:r}=e;if(!i||this.preservePaths)return!0;let n=i.split("/");if(n.includes("..")||Ft&&/^[a-z]:\.\.$/i.test(n[0]??"")){if(t==="path"||r==="Link")return this.warn("TAR_ENTRY_ERROR",`${t} contains '..'`,{entry:e,[t]:i}),!1;{let h=g.default.posix.dirname(e.path),l=g.default.posix.normalize(g.default.posix.join(h,i));if(l.startsWith("../")||l==="..")return this.warn("TAR_ENTRY_ERROR",`${t} escapes extraction directory`,{entry:e,[t]:i}),!1}}let[o,a]=(0,Qh.stripAbsolutePath)(i);return o&&(e[t]=String(a),this.warn("TAR_ENTRY_INFO",`stripping ${o} from absolute ${t}`,{entry:e,[t]:i})),!0}[eo](e){let t=(0,U.normalizeWindowsPath)(e.path),i=t.split("/");if(this.strip){if(i.length<this.strip)return!1;if(e.type==="Link"){let r=(0,U.normalizeWindowsPath)(String(e.linkpath)).split("/");if(r.length>=this.strip)e.linkpath=r.slice(this.strip).join("/");else return!1}i.splice(0,this.strip),e.path=i.join("/")}if(isFinite(this.maxDepth)&&i.length>this.maxDepth)return this.warn("TAR_ENTRY_ERROR","path excessively deep",{entry:e,path:t,depth:i.length,maxDepth:this.maxDepth}),!1;if(!this[Sr](e,"path")||!this[Sr](e,"linkpath"))return!1;if(g.default.isAbsolute(e.path)?e.absolute=(0,U.normalizeWindowsPath)(g.default.resolve(e.path)):e.absolute=(0,U.normalizeWindowsPath)(g.default.resolve(this.cwd,e.path)),!this.preservePaths&&typeof e.absolute=="string"&&e.absolute.indexOf(this.cwd+"/")!==0&&e.absolute!==this.cwd)return this.warn("TAR_ENTRY_ERROR","path escaped extraction target",{entry:e,path:(0,U.normalizeWindowsPath)(e.path),resolvedPath:e.absolute,cwd:this.cwd}),!1;if(e.absolute===this.cwd&&e.type!=="Directory"&&e.type!=="GNUDumpDir")return!1;if(this.win32){let{root:r}=g.default.win32.parse(String(e.absolute));e.absolute=r+Kn.encode(String(e.absolute).slice(r.length));let{root:n}=g.default.win32.parse(e.path);e.path=n+Kn.encode(e.path.slice(n.length))}return!0}[Vn](e){if(!this[eo](e))return e.resume();switch($h.default.equal(typeof e.absolute,"string"),e.type){case"Directory":case"GNUDumpDir":e.mode&&(e.mode=e.mode|448);case"File":case"OldFile":case"ContiguousFile":case"Link":case"SymbolicLink":return this[Or](e);default:return this[Jn](e)}}[T](e,t){e.name==="CwdError"?this.emit("error",e):(this.warn("TAR_ENTRY_ERROR",e,{entry:t}),this[ut](),t.resume())}[De](e,t,i){(0,oo.mkdir)((0,U.normalizeWindowsPath)(e),{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cwd:this.cwd,mode:t},i)}[Lt](e){return this.forceChown||this.preserveOwner&&(typeof e.uid=="number"&&e.uid!==this.processUid||typeof e.gid=="number"&&e.gid!==this.processGid)||typeof this.uid=="number"&&this.uid!==this.processUid||typeof this.gid=="number"&&this.gid!==this.processGid}[At](e){return io(this.uid,e.uid,this.processUid)}[It](e){return io(this.gid,e.gid,this.processGid)}[Tr](e,t){let i=typeof e.mode=="number"?e.mode&4095:this.fmode,r=new Vh.WriteStream(String(e.absolute),{flags:(0,no.getWriteFlag)(e.size),mode:i,autoClose:!1});r.on("error",h=>{r.fd&&m.default.close(r.fd,()=>{}),r.write=()=>!0,this[T](h,e),t()});let n=1,o=h=>{if(h){r.fd&&m.default.close(r.fd,()=>{}),this[T](h,e),t();return}--n===0&&r.fd!==void 0&&m.default.close(r.fd,l=>{l?this[T](l,e):this[ut](),t()})};r.on("finish",()=>{let h=String(e.absolute),l=r.fd;if(typeof l=="number"&&e.mtime&&!this.noMtime){n++;let u=e.atime||new Date,c=e.mtime;m.default.futimes(l,u,c,E=>E?m.default.utimes(h,u,c,D=>o(D&&E)):o())}if(typeof l=="number"&&this[Lt](e)){n++;let u=this[At](e),c=this[It](e);typeof u=="number"&&typeof c=="number"&&m.default.fchown(l,u,c,E=>E?m.default.chown(h,u,c,D=>o(D&&E)):o())}o()});let a=this.transform&&this.transform(e)||e;a!==e&&(a.on("error",h=>{this[T](h,e),t()}),e.pipe(a)),a.pipe(r)}[Dr](e,t){let i=typeof e.mode=="number"?e.mode&4095:this.dmode;this[De](String(e.absolute),i,r=>{if(r){this[T](r,e),t();return}let n=1,o=()=>{--n===0&&(t(),this[ut](),e.resume())};e.mtime&&!this.noMtime&&(n++,m.default.utimes(String(e.absolute),e.atime||new Date,e.mtime,o)),this[Lt](e)&&(n++,m.default.chown(String(e.absolute),Number(this[At](e)),Number(this[It](e)),o)),o()})}[Jn](e){e.unsupported=!0,this.warn("TAR_ENTRY_UNSUPPORTED",`unsupported entry type: ${e.type}`,{entry:e}),e.resume()}[Xn](e,t){let i=(0,U.normalizeWindowsPath)(g.default.relative(this.cwd,g.default.resolve(g.default.dirname(String(e.absolute)),String(e.linkpath)))).split("/");this[Mt](e,this.cwd,i,()=>this[Wi](e,String(e.linkpath),"symlink",t),r=>{this[T](r,e),t()})}[Qn](e,t){let i=(0,U.normalizeWindowsPath)(g.default.resolve(this.cwd,String(e.linkpath))),r=(0,U.normalizeWindowsPath)(String(e.linkpath)).split("/");this[Mt](e,this.cwd,r,()=>this[Wi](e,i,"link",t),n=>{this[T](n,e),t()})}[Mt](e,t,i,r,n){let o=i.shift();if(this.preservePaths||o===void 0)return r();let a=g.default.resolve(t,o);m.default.lstat(a,(h,l)=>{if(h)return r();if(l?.isSymbolicLink())return n(new ao.SymlinkError(a,g.default.resolve(a,i.join("/"))));this[Mt](e,a,i,r,n)})}[to](){this[qi]++}[ut](){this[qi]--,this[Rr]()}[Pr](e){this[ut](),e.resume()}[vr](e,t){return e.type==="File"&&!this.unlink&&t.isFile()&&t.nlink<=1&&!Ft}[Or](e){this[to]();let t=[e.path];e.linkpath&&t.push(e.linkpath),this.reservations.reserve(t,i=>this[$n](e,i))}[$n](e,t){let i=a=>{t(a)},r=()=>{this[De](this.cwd,this.dmode,a=>{if(a){this[T](a,e),i();return}this[Ct]=!0,n()})},n=()=>{if(e.absolute!==this.cwd){let a=(0,U.normalizeWindowsPath)(g.default.dirname(String(e.absolute)));if(a!==this.cwd)return this[De](a,this.dmode,h=>{if(h){this[T](h,e),i();return}o()})}o()},o=()=>{m.default.lstat(String(e.absolute),(a,h)=>{if(h&&(this.keep||this.newer&&h.mtime>(e.mtime??h.mtime))){this[Pr](e),i();return}if(a||this[vr](e,h))return this[Z](null,e,i);if(h.isDirectory()){if(e.type==="Directory"){let l=this.chmod&&e.mode&&(h.mode&4095)!==e.mode,u=c=>this[Z](c??null,e,i);return l?m.default.chmod(String(e.absolute),Number(e.mode),u):u()}if(e.absolute!==this.cwd)return m.default.rmdir(String(e.absolute),l=>this[Z](l??null,e,i))}if(e.absolute===this.cwd)return this[Z](null,e,i);sl(String(e.absolute),l=>this[Z](l??null,e,i))})};this[Ct]?n():r()}[Z](e,t,i){if(e){this[T](e,t),i();return}switch(t.type){case"File":case"OldFile":case"ContiguousFile":return this[Tr](t,i);case"Link":return this[Qn](t,i);case"SymbolicLink":return this[Xn](t,i);case"Directory":case"GNUDumpDir":return this[Dr](t,i)}}[Wi](e,t,i,r){m.default[i](t,String(e.absolute),n=>{n?this[T](n,e):(this[ut](),e.resume()),r()})}};z.Unpack=Hi;var Nt=s=>{try{return[null,s()]}catch(e){return[e,null]}},Nr=class extends Hi{sync=!0;[Z](e,t){return super[Z](e,t,()=>{})}[Or](e){if(!this[Ct]){let n=this[De](this.cwd,this.dmode);if(n)return this[T](n,e);this[Ct]=!0}if(e.absolute!==this.cwd){let n=(0,U.normalizeWindowsPath)(g.default.dirname(String(e.absolute)));if(n!==this.cwd){let o=this[De](n,this.dmode);if(o)return this[T](o,e)}}let[t,i]=Nt(()=>m.default.lstatSync(String(e.absolute)));if(i&&(this.keep||this.newer&&i.mtime>(e.mtime??i.mtime)))return this[Pr](e);if(t||this[vr](e,i))return this[Z](null,e);if(i.isDirectory()){if(e.type==="Directory"){let o=this.chmod&&e.mode&&(i.mode&4095)!==e.mode,[a]=o?Nt(()=>{m.default.chmodSync(String(e.absolute),Number(e.mode))}):[];return this[Z](a,e)}let[n]=Nt(()=>m.default.rmdirSync(String(e.absolute)));this[Z](n,e)}let[r]=e.absolute===this.cwd?[]:Nt(()=>rl(String(e.absolute)));this[Z](r,e)}[Tr](e,t){let i=typeof e.mode=="number"?e.mode&4095:this.fmode,r=a=>{let h;try{m.default.closeSync(n)}catch(l){h=l}(a||h)&&this[T](a||h,e),t()},n;try{n=m.default.openSync(String(e.absolute),(0,no.getWriteFlag)(e.size),i)}catch(a){return r(a)}let o=this.transform&&this.transform(e)||e;o!==e&&(o.on("error",a=>this[T](a,e)),e.pipe(o)),o.on("data",a=>{try{m.default.writeSync(n,a,0,a.length)}catch(h){r(h)}}),o.on("end",()=>{let a=null;if(e.mtime&&!this.noMtime){let h=e.atime||new Date,l=e.mtime;try{m.default.futimesSync(n,h,l)}catch(u){try{m.default.utimesSync(String(e.absolute),h,l)}catch{a=u}}}if(this[Lt](e)){let h=this[At](e),l=this[It](e);try{m.default.fchownSync(n,Number(h),Number(l))}catch(u){try{m.default.chownSync(String(e.absolute),Number(h),Number(l))}catch{a=a||u}}}r(a)})}[Dr](e,t){let i=typeof e.mode=="number"?e.mode&4095:this.dmode,r=this[De](String(e.absolute),i);if(r){this[T](r,e),t();return}if(e.mtime&&!this.noMtime)try{m.default.utimesSync(String(e.absolute),e.atime||new Date,e.mtime)}catch{}if(this[Lt](e))try{m.default.chownSync(String(e.absolute),Number(this[At](e)),Number(this[It](e)))}catch{}t(),e.resume()}[De](e,t){try{return(0,oo.mkdirSync)((0,U.normalizeWindowsPath)(e),{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cwd:this.cwd,mode:t})}catch(i){return i}}[Mt](e,t,i,r,n){if(this.preservePaths||!i.length)return r();let o=t;for(let a of i){o=g.default.resolve(o,a);let[h,l]=Nt(()=>m.default.lstatSync(o));if(h)return r();if(l.isSymbolicLink())return n(new ao.SymlinkError(o,g.default.resolve(t,i.join("/"))))}r()}[Wi](e,t,i,r){let n=`${i}Sync`;try{m.default[n](t,String(e.absolute)),r(),e.resume()}catch(o){return this[T](o,e)}}};z.UnpackSync=Nr});var Ar=d(G=>{"use strict";var nl=G&&G.__createBinding||(Object.create?(function(s,e,t,i){i===void 0&&(i=t);var r=Object.getOwnPropertyDescriptor(e,t);(!r||("get"in r?!e.__esModule:r.writable||r.configurable))&&(r={enumerable:!0,get:function(){return e[t]}}),Object.defineProperty(s,i,r)}):(function(s,e,t,i){i===void 0&&(i=t),s[i]=e[t]})),ol=G&&G.__setModuleDefault||(Object.create?(function(s,e){Object.defineProperty(s,"default",{enumerable:!0,value:e})}):function(s,e){s.default=e}),al=G&&G.__importStar||(function(){var s=function(e){return s=Object.getOwnPropertyNames||function(t){var i=[];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(i[i.length]=r);return i},s(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var i=s(e),r=0;r<i.length;r++)i[r]!=="default"&&nl(t,e,i[r]);return ol(t,e),t}})(),hl=G&&G.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(G,"__esModule",{value:!0});G.extract=void 0;var ho=al(Ke()),lo=hl(require("node:fs")),ll=st(),ul=Ve(),Zi=Lr(),cl=s=>{let e=new Zi.UnpackSync(s),t=s.file,i=lo.default.statSync(t),r=s.maxReadSize||16*1024*1024;new ho.ReadStreamSync(t,{readSize:r,size:i.size}).pipe(e)},fl=(s,e)=>{let t=new Zi.Unpack(s),i=s.maxReadSize||16*1024*1024,r=s.file;return new Promise((o,a)=>{t.on("error",a),t.on("close",o),lo.default.stat(r,(h,l)=>{if(h)a(h);else{let u=new ho.ReadStream(r,{readSize:i,size:l.size});u.on("error",a),u.pipe(t)}})})};G.extract=(0,ul.makeCommand)(cl,fl,s=>new Zi.UnpackSync(s),s=>new Zi.Unpack(s),(s,e)=>{e?.length&&(0,ll.filesFilter)(s,e)})});var Gi=d(ct=>{"use strict";var uo=ct&&ct.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(ct,"__esModule",{value:!0});ct.replace=void 0;var co=Ke(),q=uo(require("node:fs")),fo=uo(require("node:path")),mo=Je(),po=st(),dl=Ve(),ml=Vt(),_o=Ai(),pl=(s,e)=>{let t=new _o.PackSync(s),i=!0,r,n;try{try{r=q.default.openSync(s.file,"r+")}catch(h){if(h?.code==="ENOENT")r=q.default.openSync(s.file,"w+");else throw h}let o=q.default.fstatSync(r),a=Buffer.alloc(512);e:for(n=0;n<o.size;n+=512){for(let u=0,c=0;u<512;u+=c){if(c=q.default.readSync(r,a,u,a.length-u,n+u),n===0&&a[0]===31&&a[1]===139)throw new Error("cannot append to compressed archives");if(!c)break e}let h=new mo.Header(a);if(!h.cksumValid)break;let l=512*Math.ceil((h.size||0)/512);if(n+l+512>o.size)break;n+=l,s.mtimeCache&&h.mtime&&s.mtimeCache.set(String(h.path),h.mtime)}i=!1,_l(s,t,n,r,e)}finally{if(i)try{q.default.closeSync(r)}catch{}}},_l=(s,e,t,i,r)=>{let n=new co.WriteStreamSync(s.file,{fd:i,start:t});e.pipe(n),yl(e,r)},wl=(s,e)=>{e=Array.from(e);let t=new _o.Pack(s),i=(n,o,a)=>{let h=(D,A)=>{D?q.default.close(n,w=>a(D)):a(null,A)},l=0;if(o===0)return h(null,0);let u=0,c=Buffer.alloc(512),E=(D,A)=>{if(D||typeof A>"u")return h(D);if(u+=A,u<512&&A)return q.default.read(n,c,u,c.length-u,l+u,E);if(l===0&&c[0]===31&&c[1]===139)return h(new Error("cannot append to compressed archives"));if(u<512)return h(null,l);let w=new mo.Header(c);if(!w.cksumValid)return h(null,l);let P=512*Math.ceil((w.size??0)/512);if(l+P+512>o||(l+=P+512,l>=o))return h(null,l);s.mtimeCache&&w.mtime&&s.mtimeCache.set(String(w.path),w.mtime),u=0,q.default.read(n,c,0,512,l,E)};q.default.read(n,c,0,512,l,E)};return new Promise((n,o)=>{t.on("error",o);let a="r+",h=(l,u)=>{if(l&&l.code==="ENOENT"&&a==="r+")return a="w+",q.default.open(s.file,a,h);if(l||!u)return o(l);q.default.fstat(u,(c,E)=>{if(c)return q.default.close(u,()=>o(c));i(u,E.size,(D,A)=>{if(D)return o(D);let w=new co.WriteStream(s.file,{fd:u,start:A});t.pipe(w),w.on("error",o),w.on("close",n),El(t,e)})})};q.default.open(s.file,a,h)})},yl=(s,e)=>{e.forEach(t=>{t.charAt(0)==="@"?(0,po.list)({file:fo.default.resolve(s.cwd,t.slice(1)),sync:!0,noResume:!0,onReadEntry:i=>s.add(i)}):s.add(t)}),s.end()},El=async(s,e)=>{for(let t=0;t<e.length;t++){let i=String(e[t]);i.charAt(0)==="@"?await(0,po.list)({file:fo.default.resolve(String(s.cwd),i.slice(1)),noResume:!0,onReadEntry:r=>s.add(r)}):s.add(i)}s.end()};ct.replace=(0,dl.makeCommand)(pl,wl,()=>{throw new TypeError("file is required")},()=>{throw new TypeError("file is required")},(s,e)=>{if(!(0,ml.isFile)(s))throw new TypeError("file is required");if(s.gzip||s.brotli||s.zstd||s.file.endsWith(".br")||s.file.endsWith(".tbr"))throw new TypeError("cannot append to compressed archives");if(!e?.length)throw new TypeError("no paths specified to add/replace")})});var Ir=d(Yi=>{"use strict";Object.defineProperty(Yi,"__esModule",{value:!0});Yi.update=void 0;var bl=Ve(),Bt=Gi();Yi.update=(0,bl.makeCommand)(Bt.replace.syncFile,Bt.replace.asyncFile,Bt.replace.syncNoFile,Bt.replace.asyncNoFile,(s,e=[])=>{Bt.replace.validate?.(s,e),Sl(s)});var Sl=s=>{let e=s.filter;s.mtimeCache||(s.mtimeCache=new Map),s.filter=e?(t,i)=>e(t,i)&&!((s.mtimeCache?.get(t)??i.mtime??0)>(i.mtime??0)):(t,i)=>!((s.mtimeCache?.get(t)??i.mtime??0)>(i.mtime??0))}});var wo=exports&&exports.__createBinding||(Object.create?(function(s,e,t,i){i===void 0&&(i=t);var r=Object.getOwnPropertyDescriptor(e,t);(!r||("get"in r?!e.__esModule:r.writable||r.configurable))&&(r={enumerable:!0,get:function(){return e[t]}}),Object.defineProperty(s,i,r)}):(function(s,e,t,i){i===void 0&&(i=t),s[i]=e[t]})),gl=exports&&exports.__setModuleDefault||(Object.create?(function(s,e){Object.defineProperty(s,"default",{enumerable:!0,value:e})}):function(s,e){s.default=e}),Y=exports&&exports.__exportStar||function(s,e){for(var t in s)t!=="default"&&!Object.prototype.hasOwnProperty.call(e,t)&&wo(e,s,t)},Rl=exports&&exports.__importStar||(function(){var s=function(e){return s=Object.getOwnPropertyNames||function(t){var i=[];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(i[i.length]=r);return i},s(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var i=s(e),r=0;r<i.length;r++)i[r]!=="default"&&wo(t,e,i[r]);return gl(t,e),t}})();Object.defineProperty(exports,"__esModule",{value:!0});exports.u=exports.types=exports.r=exports.t=exports.x=exports.c=void 0;Y(fr(),exports);var Ol=fr();Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return Ol.create}});Y(Ar(),exports);var vl=Ar();Object.defineProperty(exports,"x",{enumerable:!0,get:function(){return vl.extract}});Y(Je(),exports);Y(st(),exports);var Tl=st();Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return Tl.list}});Y(Ai(),exports);Y(mi(),exports);Y(ei(),exports);Y(ri(),exports);Y(Gi(),exports);var Dl=Gi();Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return Dl.replace}});exports.types=Rl(Ts());Y(Lr(),exports);Y(Ir(),exports);var Pl=Ir();Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return Pl.update}});Y(er(),exports); +`).reduce(Oa,Object.create(null)),Oa=(s,e)=>{let t=parseInt(e,10);if(t!==Buffer.byteLength(e)+1)return s;e=e.slice((t+" ").length);let i=e.split("="),r=i.shift();if(!r)return s;let n=r.replace(/^SCHILY\.(dev|ino|nlink)/,"$1"),o=i.join("=");return s[n]=/^([A-Z]+\.)?([mac]|birth|creation)time$/.test(n)?new Date(Number(o)*1e3):/^[0-9]+$/.test(o)?+o:o,s}});var et=d(ti=>{"use strict";Object.defineProperty(ti,"__esModule",{value:!0});ti.normalizeWindowsPath=void 0;var va=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform;ti.normalizeWindowsPath=va!=="win32"?s=>s:s=>s&&s.replace(/\\/g,"/")});var ri=d(si=>{"use strict";Object.defineProperty(si,"__esModule",{value:!0});si.ReadEntry=void 0;var Ta=We(),ii=et(),Ls=class extends Ta.Minipass{extended;globalExtended;header;startBlockSize;blockRemain;remain;type;meta=!1;ignore=!1;path;mode;uid;gid;uname;gname;size=0;mtime;atime;ctime;linkpath;dev;ino;nlink;invalid=!1;absolute;unsupported=!1;constructor(e,t,i){switch(super({}),this.pause(),this.extended=t,this.globalExtended=i,this.header=e,this.remain=e.size??0,this.startBlockSize=512*Math.ceil(this.remain/512),this.blockRemain=this.startBlockSize,this.type=e.type,this.type){case"File":case"OldFile":case"Link":case"SymbolicLink":case"CharacterDevice":case"BlockDevice":case"Directory":case"FIFO":case"ContiguousFile":case"GNUDumpDir":break;case"NextFileHasLongLinkpath":case"NextFileHasLongPath":case"OldGnuLongPath":case"GlobalExtendedHeader":case"ExtendedHeader":case"OldExtendedHeader":this.meta=!0;break;default:this.ignore=!0}if(!e.path)throw new Error("no path provided for tar.ReadEntry");this.path=(0,ii.normalizeWindowsPath)(e.path),this.mode=e.mode,this.mode&&(this.mode=this.mode&4095),this.uid=e.uid,this.gid=e.gid,this.uname=e.uname,this.gname=e.gname,this.size=this.remain,this.mtime=e.mtime,this.atime=e.atime,this.ctime=e.ctime,this.linkpath=e.linkpath?(0,ii.normalizeWindowsPath)(e.linkpath):void 0,this.uname=e.uname,this.gname=e.gname,t&&this.#e(t),i&&this.#e(i,!0)}write(e){let t=e.length;if(t>this.blockRemain)throw new Error("writing more to entry than is appropriate");let i=this.remain,r=this.blockRemain;return this.remain=Math.max(0,i-t),this.blockRemain=Math.max(0,r-t),this.ignore?!0:i>=t?super.write(e):super.write(e.subarray(0,i))}#e(e,t=!1){e.path&&(e.path=(0,ii.normalizeWindowsPath)(e.path)),e.linkpath&&(e.linkpath=(0,ii.normalizeWindowsPath)(e.linkpath)),Object.assign(this,Object.fromEntries(Object.entries(e).filter(([i,r])=>!(r==null||i==="path"&&t))))}};si.ReadEntry=Ls});var oi=d(ni=>{"use strict";Object.defineProperty(ni,"__esModule",{value:!0});ni.warnMethod=void 0;var Da=(s,e,t,i={})=>{s.file&&(i.file=s.file),s.cwd&&(i.cwd=s.cwd),i.code=t instanceof Error&&t.code||e,i.tarCode=e,!s.strict&&i.recoverable!==!1?(t instanceof Error&&(i=Object.assign(t,i),t=t.message),s.emit("warn",e,t,i)):t instanceof Error?s.emit("error",Object.assign(t,i)):s.emit("error",Object.assign(new Error(`${e}: ${t}`),i))};ni.warnMethod=Da});var mi=d(di=>{"use strict";Object.defineProperty(di,"__esModule",{value:!0});di.Parser=void 0;var Pa=require("events"),As=vs(),Vr=Je(),$r=ei(),Na=ri(),Ma=oi(),La=1024*1024,zs=Buffer.from([31,139]),ks=Buffer.from([40,181,47,253]),Aa=Math.max(zs.length,ks.length),H=Symbol("state"),Be=Symbol("writeEntry"),de=Symbol("readEntry"),Is=Symbol("nextEntry"),Xr=Symbol("processEntry"),re=Symbol("extendedHeader"),gt=Symbol("globalExtendedHeader"),ge=Symbol("meta"),Qr=Symbol("emitMeta"),_=Symbol("buffer"),me=Symbol("queue"),Re=Symbol("ended"),Cs=Symbol("emittedEnd"),ze=Symbol("emit"),S=Symbol("unzip"),ai=Symbol("consumeChunk"),hi=Symbol("consumeChunkSub"),Fs=Symbol("consumeBody"),Jr=Symbol("consumeMeta"),en=Symbol("consumeHeader"),Rt=Symbol("consuming"),Bs=Symbol("bufferConcat"),li=Symbol("maybeEnd"),tt=Symbol("writing"),Oe=Symbol("aborted"),ui=Symbol("onDone"),ke=Symbol("sawValidEntry"),ci=Symbol("sawNullBlock"),fi=Symbol("sawEOF"),tn=Symbol("closeStream"),Ia=()=>!0,js=class extends Pa.EventEmitter{file;strict;maxMetaEntrySize;filter;brotli;zstd;writable=!0;readable=!1;[me]=[];[_];[de];[Be];[H]="begin";[ge]="";[re];[gt];[Re]=!1;[S];[Oe]=!1;[ke];[ci]=!1;[fi]=!1;[tt]=!1;[Rt]=!1;[Cs]=!1;constructor(e={}){super(),this.file=e.file||"",this.on(ui,()=>{(this[H]==="begin"||this[ke]===!1)&&this.warn("TAR_BAD_ARCHIVE","Unrecognized archive format")}),e.ondone?this.on(ui,e.ondone):this.on(ui,()=>{this.emit("prefinish"),this.emit("finish"),this.emit("end")}),this.strict=!!e.strict,this.maxMetaEntrySize=e.maxMetaEntrySize||La,this.filter=typeof e.filter=="function"?e.filter:Ia;let t=e.file&&(e.file.endsWith(".tar.br")||e.file.endsWith(".tbr"));this.brotli=!(e.gzip||e.zstd)&&e.brotli!==void 0?e.brotli:t?void 0:!1;let i=e.file&&(e.file.endsWith(".tar.zst")||e.file.endsWith(".tzst"));this.zstd=!(e.gzip||e.brotli)&&e.zstd!==void 0?e.zstd:i?!0:void 0,this.on("end",()=>this[tn]()),typeof e.onwarn=="function"&&this.on("warn",e.onwarn),typeof e.onReadEntry=="function"&&this.on("entry",e.onReadEntry)}warn(e,t,i={}){(0,Ma.warnMethod)(this,e,t,i)}[en](e,t){this[ke]===void 0&&(this[ke]=!1);let i;try{i=new Vr.Header(e,t,this[re],this[gt])}catch(r){return this.warn("TAR_ENTRY_INVALID",r)}if(i.nullBlock)this[ci]?(this[fi]=!0,this[H]==="begin"&&(this[H]="header"),this[ze]("eof")):(this[ci]=!0,this[ze]("nullBlock"));else if(this[ci]=!1,!i.cksumValid)this.warn("TAR_ENTRY_INVALID","checksum failure",{header:i});else if(!i.path)this.warn("TAR_ENTRY_INVALID","path is required",{header:i});else{let r=i.type;if(/^(Symbolic)?Link$/.test(r)&&!i.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath required",{header:i});else if(!/^(Symbolic)?Link$/.test(r)&&!/^(Global)?ExtendedHeader$/.test(r)&&i.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath forbidden",{header:i});else{let n=this[Be]=new Na.ReadEntry(i,this[re],this[gt]);if(!this[ke])if(n.remain){let o=()=>{n.invalid||(this[ke]=!0)};n.on("end",o)}else this[ke]=!0;n.meta?n.size>this.maxMetaEntrySize?(n.ignore=!0,this[ze]("ignoredEntry",n),this[H]="ignore",n.resume()):n.size>0&&(this[ge]="",n.on("data",o=>this[ge]+=o),this[H]="meta"):(this[re]=void 0,n.ignore=n.ignore||!this.filter(n.path,n),n.ignore?(this[ze]("ignoredEntry",n),this[H]=n.remain?"ignore":"header",n.resume()):(n.remain?this[H]="body":(this[H]="header",n.end()),this[de]?this[me].push(n):(this[me].push(n),this[Is]())))}}}[tn](){queueMicrotask(()=>this.emit("close"))}[Xr](e){let t=!0;if(!e)this[de]=void 0,t=!1;else if(Array.isArray(e)){let[i,...r]=e;this.emit(i,...r)}else this[de]=e,this.emit("entry",e),e.emittedEnd||(e.on("end",()=>this[Is]()),t=!1);return t}[Is](){do;while(this[Xr](this[me].shift()));if(!this[me].length){let e=this[de];!e||e.flowing||e.size===e.remain?this[tt]||this.emit("drain"):e.once("drain",()=>this.emit("drain"))}}[Fs](e,t){let i=this[Be];if(!i)throw new Error("attempt to consume body without entry??");let r=i.blockRemain??0,n=r>=e.length&&t===0?e:e.subarray(t,t+r);return i.write(n),i.blockRemain||(this[H]="header",this[Be]=void 0,i.end()),n.length}[Jr](e,t){let i=this[Be],r=this[Fs](e,t);return!this[Be]&&i&&this[Qr](i),r}[ze](e,t,i){!this[me].length&&!this[de]?this.emit(e,t,i):this[me].push([e,t,i])}[Qr](e){switch(this[ze]("meta",this[ge]),e.type){case"ExtendedHeader":case"OldExtendedHeader":this[re]=$r.Pax.parse(this[ge],this[re],!1);break;case"GlobalExtendedHeader":this[gt]=$r.Pax.parse(this[ge],this[gt],!0);break;case"NextFileHasLongPath":case"OldGnuLongPath":{let t=this[re]??Object.create(null);this[re]=t,t.path=this[ge].replace(/\0.*/,"");break}case"NextFileHasLongLinkpath":{let t=this[re]||Object.create(null);this[re]=t,t.linkpath=this[ge].replace(/\0.*/,"");break}default:throw new Error("unknown meta: "+e.type)}}abort(e){this[Oe]=!0,this.emit("abort",e),this.warn("TAR_ABORT",e,{recoverable:!1})}write(e,t,i){if(typeof t=="function"&&(i=t,t=void 0),typeof e=="string"&&(e=Buffer.from(e,typeof t=="string"?t:"utf8")),this[Oe])return i?.(),!1;if((this[S]===void 0||this.brotli===void 0&&this[S]===!1)&&e){if(this[_]&&(e=Buffer.concat([this[_],e]),this[_]=void 0),e.length<Aa)return this[_]=e,i?.(),!0;for(let h=0;this[S]===void 0&&h<zs.length;h++)e[h]!==zs[h]&&(this[S]=!1);let o=!1;if(this[S]===!1&&this.zstd!==!1){o=!0;for(let h=0;h<ks.length;h++)if(e[h]!==ks[h]){o=!1;break}}let a=this.brotli===void 0&&!o;if(this[S]===!1&&a)if(e.length<512)if(this[Re])this.brotli=!0;else return this[_]=e,i?.(),!0;else try{new Vr.Header(e.subarray(0,512)),this.brotli=!1}catch{this.brotli=!0}if(this[S]===void 0||this[S]===!1&&(this.brotli||o)){let h=this[Re];this[Re]=!1,this[S]=this[S]===void 0?new As.Unzip({}):o?new As.ZstdDecompress({}):new As.BrotliDecompress({}),this[S].on("data",u=>this[ai](u)),this[S].on("error",u=>this.abort(u)),this[S].on("end",()=>{this[Re]=!0,this[ai]()}),this[tt]=!0;let l=!!this[S][h?"end":"write"](e);return this[tt]=!1,i?.(),l}}this[tt]=!0,this[S]?this[S].write(e):this[ai](e),this[tt]=!1;let n=this[me].length?!1:this[de]?this[de].flowing:!0;return!n&&!this[me].length&&this[de]?.once("drain",()=>this.emit("drain")),i?.(),n}[Bs](e){e&&!this[Oe]&&(this[_]=this[_]?Buffer.concat([this[_],e]):e)}[li](){if(this[Re]&&!this[Cs]&&!this[Oe]&&!this[Rt]){this[Cs]=!0;let e=this[Be];if(e&&e.blockRemain){let t=this[_]?this[_].length:0;this.warn("TAR_BAD_ARCHIVE",`Truncated input (needed ${e.blockRemain} more bytes, only ${t} available)`,{entry:e}),this[_]&&e.write(this[_]),e.end()}this[ze](ui)}}[ai](e){if(this[Rt]&&e)this[Bs](e);else if(!e&&!this[_])this[li]();else if(e){if(this[Rt]=!0,this[_]){this[Bs](e);let t=this[_];this[_]=void 0,this[hi](t)}else this[hi](e);for(;this[_]&&this[_]?.length>=512&&!this[Oe]&&!this[fi];){let t=this[_];this[_]=void 0,this[hi](t)}this[Rt]=!1}(!this[_]||this[Re])&&this[li]()}[hi](e){let t=0,i=e.length;for(;t+512<=i&&!this[Oe]&&!this[fi];)switch(this[H]){case"begin":case"header":this[en](e,t),t+=512;break;case"ignore":case"body":t+=this[Fs](e,t);break;case"meta":t+=this[Jr](e,t);break;default:throw new Error("invalid state: "+this[H])}t<i&&(this[_]?this[_]=Buffer.concat([e.subarray(t),this[_]]):this[_]=e.subarray(t))}end(e,t,i){return typeof e=="function"&&(i=e,t=void 0,e=void 0),typeof t=="function"&&(i=t,t=void 0),typeof e=="string"&&(e=Buffer.from(e,t)),i&&this.once("finish",i),this[Oe]||(this[S]?(e&&this[S].write(e),this[S].end()):(this[Re]=!0,(this.brotli===void 0||this.zstd===void 0)&&(e=e||Buffer.alloc(0)),e&&this.write(e),this[li]())),this}};di.Parser=js});var _i=d(pi=>{"use strict";Object.defineProperty(pi,"__esModule",{value:!0});pi.stripTrailingSlashes=void 0;var Ca=s=>{let e=s.length-1,t=-1;for(;e>-1&&s.charAt(e)==="/";)t=e,e--;return t===-1?s:s.slice(0,t)};pi.stripTrailingSlashes=Ca});var st=d(F=>{"use strict";var Fa=F&&F.__createBinding||(Object.create?(function(s,e,t,i){i===void 0&&(i=t);var r=Object.getOwnPropertyDescriptor(e,t);(!r||("get"in r?!e.__esModule:r.writable||r.configurable))&&(r={enumerable:!0,get:function(){return e[t]}}),Object.defineProperty(s,i,r)}):(function(s,e,t,i){i===void 0&&(i=t),s[i]=e[t]})),Ba=F&&F.__setModuleDefault||(Object.create?(function(s,e){Object.defineProperty(s,"default",{enumerable:!0,value:e})}):function(s,e){s.default=e}),za=F&&F.__importStar||(function(){var s=function(e){return s=Object.getOwnPropertyNames||function(t){var i=[];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(i[i.length]=r);return i},s(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var i=s(e),r=0;r<i.length;r++)i[r]!=="default"&&Fa(t,e,i[r]);return Ba(t,e),t}})(),ka=F&&F.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(F,"__esModule",{value:!0});F.list=F.filesFilter=void 0;var ja=za(Ke()),it=ka(require("node:fs")),sn=require("path"),xa=Ve(),wi=mi(),xs=_i(),Ua=s=>{let e=s.onReadEntry;s.onReadEntry=e?t=>{e(t),t.resume()}:t=>t.resume()},qa=(s,e)=>{let t=new Map(e.map(n=>[(0,xs.stripTrailingSlashes)(n),!0])),i=s.filter,r=(n,o="")=>{let a=o||(0,sn.parse)(n).root||".",h;if(n===a)h=!1;else{let l=t.get(n);l!==void 0?h=l:h=r((0,sn.dirname)(n),a)}return t.set(n,h),h};s.filter=i?(n,o)=>i(n,o)&&r((0,xs.stripTrailingSlashes)(n)):n=>r((0,xs.stripTrailingSlashes)(n))};F.filesFilter=qa;var Wa=s=>{let e=new wi.Parser(s),t=s.file,i;try{i=it.default.openSync(t,"r");let r=it.default.fstatSync(i),n=s.maxReadSize||16*1024*1024;if(r.size<n){let o=Buffer.allocUnsafe(r.size),a=it.default.readSync(i,o,0,r.size,0);e.end(a===o.byteLength?o:o.subarray(0,a))}else{let o=0,a=Buffer.allocUnsafe(n);for(;o<r.size;){let h=it.default.readSync(i,a,0,n,o);if(h===0)break;o+=h,e.write(a.subarray(0,h))}e.end()}}finally{if(typeof i=="number")try{it.default.closeSync(i)}catch{}}},Ha=(s,e)=>{let t=new wi.Parser(s),i=s.maxReadSize||16*1024*1024,r=s.file;return new Promise((o,a)=>{t.on("error",a),t.on("end",o),it.default.stat(r,(h,l)=>{if(h)a(h);else{let u=new ja.ReadStream(r,{readSize:i,size:l.size});u.on("error",a),u.pipe(t)}})})};F.list=(0,xa.makeCommand)(Wa,Ha,s=>new wi.Parser(s),s=>new wi.Parser(s),(s,e)=>{e?.length&&(0,F.filesFilter)(s,e),s.noResume||Ua(s)})});var rn=d(yi=>{"use strict";Object.defineProperty(yi,"__esModule",{value:!0});yi.modeFix=void 0;var Za=(s,e,t)=>(s&=4095,t&&(s=(s|384)&-19),e&&(s&256&&(s|=64),s&32&&(s|=8),s&4&&(s|=1)),s);yi.modeFix=Za});var Us=d(Ei=>{"use strict";Object.defineProperty(Ei,"__esModule",{value:!0});Ei.stripAbsolutePath=void 0;var Ga=require("node:path"),{isAbsolute:Ya,parse:nn}=Ga.win32,Ka=s=>{let e="",t=nn(s);for(;Ya(s)||t.root;){let i=s.charAt(0)==="/"&&s.slice(0,4)!=="//?/"?"/":t.root;s=s.slice(i.length),e+=i,t=nn(s)}return[e,s]};Ei.stripAbsolutePath=Ka});var Ws=d(rt=>{"use strict";Object.defineProperty(rt,"__esModule",{value:!0});rt.decode=rt.encode=void 0;var bi=["|","<",">","?",":"],qs=bi.map(s=>String.fromCharCode(61440+s.charCodeAt(0))),Va=new Map(bi.map((s,e)=>[s,qs[e]])),$a=new Map(qs.map((s,e)=>[s,bi[e]])),Xa=s=>bi.reduce((e,t)=>e.split(t).join(Va.get(t)),s);rt.encode=Xa;var Qa=s=>qs.reduce((e,t)=>e.split(t).join($a.get(t)),s);rt.decode=Qa});var er=d(M=>{"use strict";var Ja=M&&M.__createBinding||(Object.create?(function(s,e,t,i){i===void 0&&(i=t);var r=Object.getOwnPropertyDescriptor(e,t);(!r||("get"in r?!e.__esModule:r.writable||r.configurable))&&(r={enumerable:!0,get:function(){return e[t]}}),Object.defineProperty(s,i,r)}):(function(s,e,t,i){i===void 0&&(i=t),s[i]=e[t]})),eh=M&&M.__setModuleDefault||(Object.create?(function(s,e){Object.defineProperty(s,"default",{enumerable:!0,value:e})}):function(s,e){s.default=e}),th=M&&M.__importStar||(function(){var s=function(e){return s=Object.getOwnPropertyNames||function(t){var i=[];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(i[i.length]=r);return i},s(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var i=s(e),r=0;r<i.length;r++)i[r]!=="default"&&Ja(t,e,i[r]);return eh(t,e),t}})(),cn=M&&M.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(M,"__esModule",{value:!0});M.WriteEntryTar=M.WriteEntrySync=M.WriteEntry=void 0;var oe=cn(require("fs")),fn=We(),on=cn(require("path")),dn=Je(),mn=rn(),ne=et(),pn=Vt(),_n=ei(),wn=Us(),ih=_i(),yn=oi(),sh=th(Ws()),En=(s,e)=>e?(s=(0,ne.normalizeWindowsPath)(s).replace(/^\.(\/|$)/,""),(0,ih.stripTrailingSlashes)(e)+"/"+s):(0,ne.normalizeWindowsPath)(s),rh=16*1024*1024,an=Symbol("process"),hn=Symbol("file"),ln=Symbol("directory"),Zs=Symbol("symlink"),un=Symbol("hardlink"),Ot=Symbol("header"),Si=Symbol("read"),Gs=Symbol("lstat"),gi=Symbol("onlstat"),Ys=Symbol("onread"),Ks=Symbol("onreadlink"),Vs=Symbol("openfile"),$s=Symbol("onopenfile"),ve=Symbol("close"),Ri=Symbol("mode"),Xs=Symbol("awaitDrain"),Hs=Symbol("ondrain"),ae=Symbol("prefix"),Oi=class extends fn.Minipass{path;portable;myuid=process.getuid&&process.getuid()||0;myuser=process.env.USER||"";maxReadSize;linkCache;statCache;preservePaths;cwd;strict;mtime;noPax;noMtime;prefix;fd;blockLen=0;blockRemain=0;buf;pos=0;remain=0;length=0;offset=0;win32;absolute;header;type;linkpath;stat;onWriteEntry;#e=!1;constructor(e,t={}){let i=(0,pn.dealias)(t);super(),this.path=(0,ne.normalizeWindowsPath)(e),this.portable=!!i.portable,this.maxReadSize=i.maxReadSize||rh,this.linkCache=i.linkCache||new Map,this.statCache=i.statCache||new Map,this.preservePaths=!!i.preservePaths,this.cwd=(0,ne.normalizeWindowsPath)(i.cwd||process.cwd()),this.strict=!!i.strict,this.noPax=!!i.noPax,this.noMtime=!!i.noMtime,this.mtime=i.mtime,this.prefix=i.prefix?(0,ne.normalizeWindowsPath)(i.prefix):void 0,this.onWriteEntry=i.onWriteEntry,typeof i.onwarn=="function"&&this.on("warn",i.onwarn);let r=!1;if(!this.preservePaths){let[o,a]=(0,wn.stripAbsolutePath)(this.path);o&&typeof a=="string"&&(this.path=a,r=o)}this.win32=!!i.win32||process.platform==="win32",this.win32&&(this.path=sh.decode(this.path.replace(/\\/g,"/")),e=e.replace(/\\/g,"/")),this.absolute=(0,ne.normalizeWindowsPath)(i.absolute||on.default.resolve(this.cwd,e)),this.path===""&&(this.path="./"),r&&this.warn("TAR_ENTRY_INFO",`stripping ${r} from absolute path`,{entry:this,path:r+this.path});let n=this.statCache.get(this.absolute);n?this[gi](n):this[Gs]()}warn(e,t,i={}){return(0,yn.warnMethod)(this,e,t,i)}emit(e,...t){return e==="error"&&(this.#e=!0),super.emit(e,...t)}[Gs](){oe.default.lstat(this.absolute,(e,t)=>{if(e)return this.emit("error",e);this[gi](t)})}[gi](e){this.statCache.set(this.absolute,e),this.stat=e,e.isFile()||(e.size=0),this.type=nh(e),this.emit("stat",e),this[an]()}[an](){switch(this.type){case"File":return this[hn]();case"Directory":return this[ln]();case"SymbolicLink":return this[Zs]();default:return this.end()}}[Ri](e){return(0,mn.modeFix)(e,this.type==="Directory",this.portable)}[ae](e){return En(e,this.prefix)}[Ot](){if(!this.stat)throw new Error("cannot write header before stat");this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.onWriteEntry?.(this),this.header=new dn.Header({path:this[ae](this.path),linkpath:this.type==="Link"&&this.linkpath!==void 0?this[ae](this.linkpath):this.linkpath,mode:this[Ri](this.stat.mode),uid:this.portable?void 0:this.stat.uid,gid:this.portable?void 0:this.stat.gid,size:this.stat.size,mtime:this.noMtime?void 0:this.mtime||this.stat.mtime,type:this.type==="Unsupported"?void 0:this.type,uname:this.portable?void 0:this.stat.uid===this.myuid?this.myuser:"",atime:this.portable?void 0:this.stat.atime,ctime:this.portable?void 0:this.stat.ctime}),this.header.encode()&&!this.noPax&&super.write(new _n.Pax({atime:this.portable?void 0:this.header.atime,ctime:this.portable?void 0:this.header.ctime,gid:this.portable?void 0:this.header.gid,mtime:this.noMtime?void 0:this.mtime||this.header.mtime,path:this[ae](this.path),linkpath:this.type==="Link"&&this.linkpath!==void 0?this[ae](this.linkpath):this.linkpath,size:this.header.size,uid:this.portable?void 0:this.header.uid,uname:this.portable?void 0:this.header.uname,dev:this.portable?void 0:this.stat.dev,ino:this.portable?void 0:this.stat.ino,nlink:this.portable?void 0:this.stat.nlink}).encode());let e=this.header?.block;if(!e)throw new Error("failed to encode header");super.write(e)}[ln](){if(!this.stat)throw new Error("cannot create directory entry without stat");this.path.slice(-1)!=="/"&&(this.path+="/"),this.stat.size=0,this[Ot](),this.end()}[Zs](){oe.default.readlink(this.absolute,(e,t)=>{if(e)return this.emit("error",e);this[Ks](t)})}[Ks](e){this.linkpath=(0,ne.normalizeWindowsPath)(e),this[Ot](),this.end()}[un](e){if(!this.stat)throw new Error("cannot create link entry without stat");this.type="Link",this.linkpath=(0,ne.normalizeWindowsPath)(on.default.relative(this.cwd,e)),this.stat.size=0,this[Ot](),this.end()}[hn](){if(!this.stat)throw new Error("cannot create file entry without stat");if(this.stat.nlink>1){let e=`${this.stat.dev}:${this.stat.ino}`,t=this.linkCache.get(e);if(t?.indexOf(this.cwd)===0)return this[un](t);this.linkCache.set(e,this.absolute)}if(this[Ot](),this.stat.size===0)return this.end();this[Vs]()}[Vs](){oe.default.open(this.absolute,"r",(e,t)=>{if(e)return this.emit("error",e);this[$s](t)})}[$s](e){if(this.fd=e,this.#e)return this[ve]();if(!this.stat)throw new Error("should stat before calling onopenfile");this.blockLen=512*Math.ceil(this.stat.size/512),this.blockRemain=this.blockLen;let t=Math.min(this.blockLen,this.maxReadSize);this.buf=Buffer.allocUnsafe(t),this.offset=0,this.pos=0,this.remain=this.stat.size,this.length=this.buf.length,this[Si]()}[Si](){let{fd:e,buf:t,offset:i,length:r,pos:n}=this;if(e===void 0||t===void 0)throw new Error("cannot read file without first opening");oe.default.read(e,t,i,r,n,(o,a)=>{if(o)return this[ve](()=>this.emit("error",o));this[Ys](a)})}[ve](e=()=>{}){this.fd!==void 0&&oe.default.close(this.fd,e)}[Ys](e){if(e<=0&&this.remain>0){let r=Object.assign(new Error("encountered unexpected EOF"),{path:this.absolute,syscall:"read",code:"EOF"});return this[ve](()=>this.emit("error",r))}if(e>this.remain){let r=Object.assign(new Error("did not encounter expected EOF"),{path:this.absolute,syscall:"read",code:"EOF"});return this[ve](()=>this.emit("error",r))}if(!this.buf)throw new Error("should have created buffer prior to reading");if(e===this.remain)for(let r=e;r<this.length&&e<this.blockRemain;r++)this.buf[r+this.offset]=0,e++,this.remain++;let t=this.offset===0&&e===this.buf.length?this.buf:this.buf.subarray(this.offset,this.offset+e);this.write(t)?this[Hs]():this[Xs](()=>this[Hs]())}[Xs](e){this.once("drain",e)}write(e,t,i){if(typeof t=="function"&&(i=t,t=void 0),typeof e=="string"&&(e=Buffer.from(e,typeof t=="string"?t:"utf8")),this.blockRemain<e.length){let r=Object.assign(new Error("writing more data than expected"),{path:this.absolute});return this.emit("error",r)}return this.remain-=e.length,this.blockRemain-=e.length,this.pos+=e.length,this.offset+=e.length,super.write(e,null,i)}[Hs](){if(!this.remain)return this.blockRemain&&super.write(Buffer.alloc(this.blockRemain)),this[ve](e=>e?this.emit("error",e):this.end());if(!this.buf)throw new Error("buffer lost somehow in ONDRAIN");this.offset>=this.length&&(this.buf=Buffer.allocUnsafe(Math.min(this.blockRemain,this.buf.length)),this.offset=0),this.length=this.buf.length-this.offset,this[Si]()}};M.WriteEntry=Oi;var Qs=class extends Oi{sync=!0;[Gs](){this[gi](oe.default.lstatSync(this.absolute))}[Zs](){this[Ks](oe.default.readlinkSync(this.absolute))}[Vs](){this[$s](oe.default.openSync(this.absolute,"r"))}[Si](){let e=!0;try{let{fd:t,buf:i,offset:r,length:n,pos:o}=this;if(t===void 0||i===void 0)throw new Error("fd and buf must be set in READ method");let a=oe.default.readSync(t,i,r,n,o);this[Ys](a),e=!1}finally{if(e)try{this[ve](()=>{})}catch{}}}[Xs](e){e()}[ve](e=()=>{}){this.fd!==void 0&&oe.default.closeSync(this.fd),e()}};M.WriteEntrySync=Qs;var Js=class extends fn.Minipass{blockLen=0;blockRemain=0;buf=0;pos=0;remain=0;length=0;preservePaths;portable;strict;noPax;noMtime;readEntry;type;prefix;path;mode;uid;gid;uname;gname;header;mtime;atime;ctime;linkpath;size;onWriteEntry;warn(e,t,i={}){return(0,yn.warnMethod)(this,e,t,i)}constructor(e,t={}){let i=(0,pn.dealias)(t);super(),this.preservePaths=!!i.preservePaths,this.portable=!!i.portable,this.strict=!!i.strict,this.noPax=!!i.noPax,this.noMtime=!!i.noMtime,this.onWriteEntry=i.onWriteEntry,this.readEntry=e;let{type:r}=e;if(r==="Unsupported")throw new Error("writing entry that should be ignored");this.type=r,this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.prefix=i.prefix,this.path=(0,ne.normalizeWindowsPath)(e.path),this.mode=e.mode!==void 0?this[Ri](e.mode):void 0,this.uid=this.portable?void 0:e.uid,this.gid=this.portable?void 0:e.gid,this.uname=this.portable?void 0:e.uname,this.gname=this.portable?void 0:e.gname,this.size=e.size,this.mtime=this.noMtime?void 0:i.mtime||e.mtime,this.atime=this.portable?void 0:e.atime,this.ctime=this.portable?void 0:e.ctime,this.linkpath=e.linkpath!==void 0?(0,ne.normalizeWindowsPath)(e.linkpath):void 0,typeof i.onwarn=="function"&&this.on("warn",i.onwarn);let n=!1;if(!this.preservePaths){let[a,h]=(0,wn.stripAbsolutePath)(this.path);a&&typeof h=="string"&&(this.path=h,n=a)}this.remain=e.size,this.blockRemain=e.startBlockSize,this.onWriteEntry?.(this),this.header=new dn.Header({path:this[ae](this.path),linkpath:this.type==="Link"&&this.linkpath!==void 0?this[ae](this.linkpath):this.linkpath,mode:this.mode,uid:this.portable?void 0:this.uid,gid:this.portable?void 0:this.gid,size:this.size,mtime:this.noMtime?void 0:this.mtime,type:this.type,uname:this.portable?void 0:this.uname,atime:this.portable?void 0:this.atime,ctime:this.portable?void 0:this.ctime}),n&&this.warn("TAR_ENTRY_INFO",`stripping ${n} from absolute path`,{entry:this,path:n+this.path}),this.header.encode()&&!this.noPax&&super.write(new _n.Pax({atime:this.portable?void 0:this.atime,ctime:this.portable?void 0:this.ctime,gid:this.portable?void 0:this.gid,mtime:this.noMtime?void 0:this.mtime,path:this[ae](this.path),linkpath:this.type==="Link"&&this.linkpath!==void 0?this[ae](this.linkpath):this.linkpath,size:this.size,uid:this.portable?void 0:this.uid,uname:this.portable?void 0:this.uname,dev:this.portable?void 0:this.readEntry.dev,ino:this.portable?void 0:this.readEntry.ino,nlink:this.portable?void 0:this.readEntry.nlink}).encode());let o=this.header?.block;if(!o)throw new Error("failed to encode header");super.write(o),e.pipe(this)}[ae](e){return En(e,this.prefix)}[Ri](e){return(0,mn.modeFix)(e,this.type==="Directory",this.portable)}write(e,t,i){typeof t=="function"&&(i=t,t=void 0),typeof e=="string"&&(e=Buffer.from(e,typeof t=="string"?t:"utf8"));let r=e.length;if(r>this.blockRemain)throw new Error("writing more to entry than is appropriate");return this.blockRemain-=r,super.write(e,i)}end(e,t,i){return this.blockRemain&&super.write(Buffer.alloc(this.blockRemain)),typeof e=="function"&&(i=e,t=void 0,e=void 0),typeof t=="function"&&(i=t,t=void 0),typeof e=="string"&&(e=Buffer.from(e,t??"utf8")),i&&this.once("finish",i),e?super.end(e,i):super.end(i),this}};M.WriteEntryTar=Js;var nh=s=>s.isFile()?"File":s.isDirectory()?"Directory":s.isSymbolicLink()?"SymbolicLink":"Unsupported"});var bn=d(ot=>{"use strict";Object.defineProperty(ot,"__esModule",{value:!0});ot.Node=ot.Yallist=void 0;var tr=class s{tail;head;length=0;static create(e=[]){return new s(e)}constructor(e=[]){for(let t of e)this.push(t)}*[Symbol.iterator](){for(let e=this.head;e;e=e.next)yield e.value}removeNode(e){if(e.list!==this)throw new Error("removing node which does not belong to this list");let t=e.next,i=e.prev;return t&&(t.prev=i),i&&(i.next=t),e===this.head&&(this.head=t),e===this.tail&&(this.tail=i),this.length--,e.next=void 0,e.prev=void 0,e.list=void 0,t}unshiftNode(e){if(e===this.head)return;e.list&&e.list.removeNode(e);let t=this.head;e.list=this,e.next=t,t&&(t.prev=e),this.head=e,this.tail||(this.tail=e),this.length++}pushNode(e){if(e===this.tail)return;e.list&&e.list.removeNode(e);let t=this.tail;e.list=this,e.prev=t,t&&(t.next=e),this.tail=e,this.head||(this.head=e),this.length++}push(...e){for(let t=0,i=e.length;t<i;t++)ah(this,e[t]);return this.length}unshift(...e){for(var t=0,i=e.length;t<i;t++)hh(this,e[t]);return this.length}pop(){if(!this.tail)return;let e=this.tail.value,t=this.tail;return this.tail=this.tail.prev,this.tail?this.tail.next=void 0:this.head=void 0,t.list=void 0,this.length--,e}shift(){if(!this.head)return;let e=this.head.value,t=this.head;return this.head=this.head.next,this.head?this.head.prev=void 0:this.tail=void 0,t.list=void 0,this.length--,e}forEach(e,t){t=t||this;for(let i=this.head,r=0;i;r++)e.call(t,i.value,r,this),i=i.next}forEachReverse(e,t){t=t||this;for(let i=this.tail,r=this.length-1;i;r--)e.call(t,i.value,r,this),i=i.prev}get(e){let t=0,i=this.head;for(;i&&t<e;t++)i=i.next;if(t===e&&i)return i.value}getReverse(e){let t=0,i=this.tail;for(;i&&t<e;t++)i=i.prev;if(t===e&&i)return i.value}map(e,t){t=t||this;let i=new s;for(let r=this.head;r;)i.push(e.call(t,r.value,this)),r=r.next;return i}mapReverse(e,t){t=t||this;var i=new s;for(let r=this.tail;r;)i.push(e.call(t,r.value,this)),r=r.prev;return i}reduce(e,t){let i,r=this.head;if(arguments.length>1)i=t;else if(this.head)r=this.head.next,i=this.head.value;else throw new TypeError("Reduce of empty list with no initial value");for(var n=0;r;n++)i=e(i,r.value,n),r=r.next;return i}reduceReverse(e,t){let i,r=this.tail;if(arguments.length>1)i=t;else if(this.tail)r=this.tail.prev,i=this.tail.value;else throw new TypeError("Reduce of empty list with no initial value");for(let n=this.length-1;r;n--)i=e(i,r.value,n),r=r.prev;return i}toArray(){let e=new Array(this.length);for(let t=0,i=this.head;i;t++)e[t]=i.value,i=i.next;return e}toArrayReverse(){let e=new Array(this.length);for(let t=0,i=this.tail;i;t++)e[t]=i.value,i=i.prev;return e}slice(e=0,t=this.length){t<0&&(t+=this.length),e<0&&(e+=this.length);let i=new s;if(t<e||t<0)return i;e<0&&(e=0),t>this.length&&(t=this.length);let r=this.head,n=0;for(n=0;r&&n<e;n++)r=r.next;for(;r&&n<t;n++,r=r.next)i.push(r.value);return i}sliceReverse(e=0,t=this.length){t<0&&(t+=this.length),e<0&&(e+=this.length);let i=new s;if(t<e||t<0)return i;e<0&&(e=0),t>this.length&&(t=this.length);let r=this.length,n=this.tail;for(;n&&r>t;r--)n=n.prev;for(;n&&r>e;r--,n=n.prev)i.push(n.value);return i}splice(e,t=0,...i){e>this.length&&(e=this.length-1),e<0&&(e=this.length+e);let r=this.head;for(let o=0;r&&o<e;o++)r=r.next;let n=[];for(let o=0;r&&o<t;o++)n.push(r.value),r=this.removeNode(r);r?r!==this.tail&&(r=r.prev):r=this.tail;for(let o of i)r=oh(this,r,o);return n}reverse(){let e=this.head,t=this.tail;for(let i=e;i;i=i.prev){let r=i.prev;i.prev=i.next,i.next=r}return this.head=t,this.tail=e,this}};ot.Yallist=tr;function oh(s,e,t){let i=e,r=e?e.next:s.head,n=new nt(t,i,r,s);return n.next===void 0&&(s.tail=n),n.prev===void 0&&(s.head=n),s.length++,n}function ah(s,e){s.tail=new nt(e,s.tail,void 0,s),s.head||(s.head=s.tail),s.length++}function hh(s,e){s.head=new nt(e,void 0,s.head,s),s.tail||(s.tail=s.head),s.length++}var nt=class{list;next;prev;value;constructor(e,t,i,r){this.list=r,this.value=e,t?(t.next=this,this.prev=t):this.prev=void 0,i?(i.prev=this,this.next=i):this.next=void 0}};ot.Node=nt});var Ai=d(L=>{"use strict";var lh=L&&L.__createBinding||(Object.create?(function(s,e,t,i){i===void 0&&(i=t);var r=Object.getOwnPropertyDescriptor(e,t);(!r||("get"in r?!e.__esModule:r.writable||r.configurable))&&(r={enumerable:!0,get:function(){return e[t]}}),Object.defineProperty(s,i,r)}):(function(s,e,t,i){i===void 0&&(i=t),s[i]=e[t]})),uh=L&&L.__setModuleDefault||(Object.create?(function(s,e){Object.defineProperty(s,"default",{enumerable:!0,value:e})}):function(s,e){s.default=e}),ch=L&&L.__importStar||(function(){var s=function(e){return s=Object.getOwnPropertyNames||function(t){var i=[];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(i[i.length]=r);return i},s(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var i=s(e),r=0;r<i.length;r++)i[r]!=="default"&&lh(t,e,i[r]);return uh(t,e),t}})(),vn=L&&L.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(L,"__esModule",{value:!0});L.PackSync=L.Pack=L.PackJob=void 0;var Mi=vn(require("fs")),hr=er(),Dt=class{path;absolute;entry;stat;readdir;pending=!1;ignore=!1;piped=!1;constructor(e,t){this.path=e||"./",this.absolute=t}};L.PackJob=Dt;var fh=We(),ir=ch(vs()),dh=bn(),mh=ri(),ph=oi(),Sn=Buffer.alloc(1024),vi=Symbol("onStat"),vt=Symbol("ended"),X=Symbol("queue"),je=Symbol("current"),xe=Symbol("process"),Tt=Symbol("processing"),sr=Symbol("processJob"),Q=Symbol("jobs"),rr=Symbol("jobDone"),Ti=Symbol("addFSEntry"),gn=Symbol("addTarEntry"),lr=Symbol("stat"),ur=Symbol("readdir"),Di=Symbol("onreaddir"),Pi=Symbol("pipe"),Rn=Symbol("entry"),nr=Symbol("entryOpt"),Ni=Symbol("writeEntryClass"),Tn=Symbol("write"),or=Symbol("ondrain"),On=vn(require("path")),ar=et(),Li=class extends fh.Minipass{sync=!1;opt;cwd;maxReadSize;preservePaths;strict;noPax;prefix;linkCache;statCache;file;portable;zip;readdirCache;noDirRecurse;follow;noMtime;mtime;filter;jobs;[Ni];onWriteEntry;[X];[Q]=0;[Tt]=!1;[vt]=!1;constructor(e={}){if(super(),this.opt=e,this.file=e.file||"",this.cwd=e.cwd||process.cwd(),this.maxReadSize=e.maxReadSize,this.preservePaths=!!e.preservePaths,this.strict=!!e.strict,this.noPax=!!e.noPax,this.prefix=(0,ar.normalizeWindowsPath)(e.prefix||""),this.linkCache=e.linkCache||new Map,this.statCache=e.statCache||new Map,this.readdirCache=e.readdirCache||new Map,this.onWriteEntry=e.onWriteEntry,this[Ni]=hr.WriteEntry,typeof e.onwarn=="function"&&this.on("warn",e.onwarn),this.portable=!!e.portable,e.gzip||e.brotli||e.zstd){if((e.gzip?1:0)+(e.brotli?1:0)+(e.zstd?1:0)>1)throw new TypeError("gzip, brotli, zstd are mutually exclusive");if(e.gzip&&(typeof e.gzip!="object"&&(e.gzip={}),this.portable&&(e.gzip.portable=!0),this.zip=new ir.Gzip(e.gzip)),e.brotli&&(typeof e.brotli!="object"&&(e.brotli={}),this.zip=new ir.BrotliCompress(e.brotli)),e.zstd&&(typeof e.zstd!="object"&&(e.zstd={}),this.zip=new ir.ZstdCompress(e.zstd)),!this.zip)throw new Error("impossible");let t=this.zip;t.on("data",i=>super.write(i)),t.on("end",()=>super.end()),t.on("drain",()=>this[or]()),this.on("resume",()=>t.resume())}else this.on("drain",this[or]);this.noDirRecurse=!!e.noDirRecurse,this.follow=!!e.follow,this.noMtime=!!e.noMtime,e.mtime&&(this.mtime=e.mtime),this.filter=typeof e.filter=="function"?e.filter:()=>!0,this[X]=new dh.Yallist,this[Q]=0,this.jobs=Number(e.jobs)||4,this[Tt]=!1,this[vt]=!1}[Tn](e){return super.write(e)}add(e){return this.write(e),this}end(e,t,i){return typeof e=="function"&&(i=e,e=void 0),typeof t=="function"&&(i=t,t=void 0),e&&this.add(e),this[vt]=!0,this[xe](),i&&i(),this}write(e){if(this[vt])throw new Error("write after end");return e instanceof mh.ReadEntry?this[gn](e):this[Ti](e),this.flowing}[gn](e){let t=(0,ar.normalizeWindowsPath)(On.default.resolve(this.cwd,e.path));if(!this.filter(e.path,e))e.resume();else{let i=new Dt(e.path,t);i.entry=new hr.WriteEntryTar(e,this[nr](i)),i.entry.on("end",()=>this[rr](i)),this[Q]+=1,this[X].push(i)}this[xe]()}[Ti](e){let t=(0,ar.normalizeWindowsPath)(On.default.resolve(this.cwd,e));this[X].push(new Dt(e,t)),this[xe]()}[lr](e){e.pending=!0,this[Q]+=1;let t=this.follow?"stat":"lstat";Mi.default[t](e.absolute,(i,r)=>{e.pending=!1,this[Q]-=1,i?this.emit("error",i):this[vi](e,r)})}[vi](e,t){this.statCache.set(e.absolute,t),e.stat=t,this.filter(e.path,t)?t.isFile()&&t.nlink>1&&e===this[je]&&!this.linkCache.get(`${t.dev}:${t.ino}`)&&!this.sync&&this[sr](e):e.ignore=!0,this[xe]()}[ur](e){e.pending=!0,this[Q]+=1,Mi.default.readdir(e.absolute,(t,i)=>{if(e.pending=!1,this[Q]-=1,t)return this.emit("error",t);this[Di](e,i)})}[Di](e,t){this.readdirCache.set(e.absolute,t),e.readdir=t,this[xe]()}[xe](){if(!this[Tt]){this[Tt]=!0;for(let e=this[X].head;e&&this[Q]<this.jobs;e=e.next)if(this[sr](e.value),e.value.ignore){let t=e.next;this[X].removeNode(e),e.next=t}this[Tt]=!1,this[vt]&&!this[X].length&&this[Q]===0&&(this.zip?this.zip.end(Sn):(super.write(Sn),super.end()))}}get[je](){return this[X]&&this[X].head&&this[X].head.value}[rr](e){this[X].shift(),this[Q]-=1,this[xe]()}[sr](e){if(!e.pending){if(e.entry){e===this[je]&&!e.piped&&this[Pi](e);return}if(!e.stat){let t=this.statCache.get(e.absolute);t?this[vi](e,t):this[lr](e)}if(e.stat&&!e.ignore){if(!this.noDirRecurse&&e.stat.isDirectory()&&!e.readdir){let t=this.readdirCache.get(e.absolute);if(t?this[Di](e,t):this[ur](e),!e.readdir)return}if(e.entry=this[Rn](e),!e.entry){e.ignore=!0;return}e===this[je]&&!e.piped&&this[Pi](e)}}}[nr](e){return{onwarn:(t,i,r)=>this.warn(t,i,r),noPax:this.noPax,cwd:this.cwd,absolute:e.absolute,preservePaths:this.preservePaths,maxReadSize:this.maxReadSize,strict:this.strict,portable:this.portable,linkCache:this.linkCache,statCache:this.statCache,noMtime:this.noMtime,mtime:this.mtime,prefix:this.prefix,onWriteEntry:this.onWriteEntry}}[Rn](e){this[Q]+=1;try{return new this[Ni](e.path,this[nr](e)).on("end",()=>this[rr](e)).on("error",i=>this.emit("error",i))}catch(t){this.emit("error",t)}}[or](){this[je]&&this[je].entry&&this[je].entry.resume()}[Pi](e){e.piped=!0,e.readdir&&e.readdir.forEach(r=>{let n=e.path,o=n==="./"?"":n.replace(/\/*$/,"/");this[Ti](o+r)});let t=e.entry,i=this.zip;if(!t)throw new Error("cannot pipe without source");i?t.on("data",r=>{i.write(r)||t.pause()}):t.on("data",r=>{super.write(r)||t.pause()})}pause(){return this.zip&&this.zip.pause(),super.pause()}warn(e,t,i={}){(0,ph.warnMethod)(this,e,t,i)}};L.Pack=Li;var cr=class extends Li{sync=!0;constructor(e){super(e),this[Ni]=hr.WriteEntrySync}pause(){}resume(){}[lr](e){let t=this.follow?"statSync":"lstatSync";this[vi](e,Mi.default[t](e.absolute))}[ur](e){this[Di](e,Mi.default.readdirSync(e.absolute))}[Pi](e){let t=e.entry,i=this.zip;if(e.readdir&&e.readdir.forEach(r=>{let n=e.path,o=n==="./"?"":n.replace(/\/*$/,"/");this[Ti](o+r)}),!t)throw new Error("Cannot pipe without source");i?t.on("data",r=>{i.write(r)}):t.on("data",r=>{super[Tn](r)})}};L.PackSync=cr});var fr=d(at=>{"use strict";var _h=at&&at.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(at,"__esModule",{value:!0});at.create=void 0;var Dn=Ke(),Pn=_h(require("node:path")),Nn=st(),wh=Ve(),Ii=Ai(),yh=(s,e)=>{let t=new Ii.PackSync(s),i=new Dn.WriteStreamSync(s.file,{mode:s.mode||438});t.pipe(i),Mn(t,e)},Eh=(s,e)=>{let t=new Ii.Pack(s),i=new Dn.WriteStream(s.file,{mode:s.mode||438});t.pipe(i);let r=new Promise((n,o)=>{i.on("error",o),i.on("close",n),t.on("error",o)});return Ln(t,e),r},Mn=(s,e)=>{e.forEach(t=>{t.charAt(0)==="@"?(0,Nn.list)({file:Pn.default.resolve(s.cwd,t.slice(1)),sync:!0,noResume:!0,onReadEntry:i=>s.add(i)}):s.add(t)}),s.end()},Ln=async(s,e)=>{for(let t=0;t<e.length;t++){let i=String(e[t]);i.charAt(0)==="@"?await(0,Nn.list)({file:Pn.default.resolve(String(s.cwd),i.slice(1)),noResume:!0,onReadEntry:r=>{s.add(r)}}):s.add(i)}s.end()},bh=(s,e)=>{let t=new Ii.PackSync(s);return Mn(t,e),t},Sh=(s,e)=>{let t=new Ii.Pack(s);return Ln(t,e),t};at.create=(0,wh.makeCommand)(yh,Eh,bh,Sh,(s,e)=>{if(!e?.length)throw new TypeError("no paths specified to add to archive")})});var Cn=d(ht=>{"use strict";var gh=ht&&ht.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(ht,"__esModule",{value:!0});ht.getWriteFlag=void 0;var An=gh(require("fs")),Rh=process.env.__FAKE_PLATFORM__||process.platform,Oh=Rh==="win32",{O_CREAT:vh,O_TRUNC:Th,O_WRONLY:Dh}=An.default.constants,In=Number(process.env.__FAKE_FS_O_FILENAME__)||An.default.constants.UV_FS_O_FILEMAP||0,Ph=Oh&&!!In,Nh=512*1024,Mh=In|Th|vh|Dh;ht.getWriteFlag=Ph?s=>s<Nh?Mh:"w":()=>"w"});var Bn=d(he=>{"use strict";var Fn=he&&he.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(he,"__esModule",{value:!0});he.chownrSync=he.chownr=void 0;var Fi=Fn(require("node:fs")),Pt=Fn(require("node:path")),dr=(s,e,t)=>{try{return Fi.default.lchownSync(s,e,t)}catch(i){if(i?.code!=="ENOENT")throw i}},Ci=(s,e,t,i)=>{Fi.default.lchown(s,e,t,r=>{i(r&&r?.code!=="ENOENT"?r:null)})},Lh=(s,e,t,i,r)=>{if(e.isDirectory())(0,he.chownr)(Pt.default.resolve(s,e.name),t,i,n=>{if(n)return r(n);let o=Pt.default.resolve(s,e.name);Ci(o,t,i,r)});else{let n=Pt.default.resolve(s,e.name);Ci(n,t,i,r)}},Ah=(s,e,t,i)=>{Fi.default.readdir(s,{withFileTypes:!0},(r,n)=>{if(r){if(r.code==="ENOENT")return i();if(r.code!=="ENOTDIR"&&r.code!=="ENOTSUP")return i(r)}if(r||!n.length)return Ci(s,e,t,i);let o=n.length,a=null,h=l=>{if(!a){if(l)return i(a=l);if(--o===0)return Ci(s,e,t,i)}};for(let l of n)Lh(s,l,e,t,h)})};he.chownr=Ah;var Ih=(s,e,t,i)=>{e.isDirectory()&&(0,he.chownrSync)(Pt.default.resolve(s,e.name),t,i),dr(Pt.default.resolve(s,e.name),t,i)},Ch=(s,e,t)=>{let i;try{i=Fi.default.readdirSync(s,{withFileTypes:!0})}catch(r){let n=r;if(n?.code==="ENOENT")return;if(n?.code==="ENOTDIR"||n?.code==="ENOTSUP")return dr(s,e,t);throw n}for(let r of i)Ih(s,r,e,t);return dr(s,e,t)};he.chownrSync=Ch});var zn=d(Bi=>{"use strict";Object.defineProperty(Bi,"__esModule",{value:!0});Bi.CwdError=void 0;var mr=class extends Error{path;code;syscall="chdir";constructor(e,t){super(`${t}: Cannot cd into '${e}'`),this.path=e,this.code=t}get name(){return"CwdError"}};Bi.CwdError=mr});var _r=d(zi=>{"use strict";Object.defineProperty(zi,"__esModule",{value:!0});zi.SymlinkError=void 0;var pr=class extends Error{path;symlink;syscall="symlink";code="TAR_SYMLINK_ERROR";constructor(e,t){super("TAR_SYMLINK_ERROR: Cannot extract through symbolic link"),this.symlink=e,this.path=t}get name(){return"SymlinkError"}};zi.SymlinkError=pr});var qn=d(Te=>{"use strict";var yr=Te&&Te.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(Te,"__esModule",{value:!0});Te.mkdirSync=Te.mkdir=void 0;var kn=Bn(),x=yr(require("node:fs")),Fh=yr(require("node:fs/promises")),ki=yr(require("node:path")),jn=zn(),pe=et(),xn=_r(),Bh=(s,e)=>{x.default.stat(s,(t,i)=>{(t||!i.isDirectory())&&(t=new jn.CwdError(s,t?.code||"ENOTDIR")),e(t)})},zh=(s,e,t)=>{s=(0,pe.normalizeWindowsPath)(s);let i=e.umask??18,r=e.mode|448,n=(r&i)!==0,o=e.uid,a=e.gid,h=typeof o=="number"&&typeof a=="number"&&(o!==e.processUid||a!==e.processGid),l=e.preserve,u=e.unlink,c=(0,pe.normalizeWindowsPath)(e.cwd),E=(w,P)=>{w?t(w):P&&h?(0,kn.chownr)(P,o,a,Cr=>E(Cr)):n?x.default.chmod(s,r,t):t()};if(s===c)return Bh(s,E);if(l)return Fh.default.mkdir(s,{mode:r,recursive:!0}).then(w=>E(null,w??void 0),E);let A=(0,pe.normalizeWindowsPath)(ki.default.relative(c,s)).split("/");wr(c,A,r,u,c,void 0,E)};Te.mkdir=zh;var wr=(s,e,t,i,r,n,o)=>{if(!e.length)return o(null,n);let a=e.shift(),h=(0,pe.normalizeWindowsPath)(ki.default.resolve(s+"/"+a));x.default.mkdir(h,t,Un(h,e,t,i,r,n,o))},Un=(s,e,t,i,r,n,o)=>a=>{a?x.default.lstat(s,(h,l)=>{if(h)h.path=h.path&&(0,pe.normalizeWindowsPath)(h.path),o(h);else if(l.isDirectory())wr(s,e,t,i,r,n,o);else if(i)x.default.unlink(s,u=>{if(u)return o(u);x.default.mkdir(s,t,Un(s,e,t,i,r,n,o))});else{if(l.isSymbolicLink())return o(new xn.SymlinkError(s,s+"/"+e.join("/")));o(a)}}):(n=n||s,wr(s,e,t,i,r,n,o))},kh=s=>{let e=!1,t;try{e=x.default.statSync(s).isDirectory()}catch(i){t=i?.code}finally{if(!e)throw new jn.CwdError(s,t??"ENOTDIR")}},jh=(s,e)=>{s=(0,pe.normalizeWindowsPath)(s);let t=e.umask??18,i=e.mode|448,r=(i&t)!==0,n=e.uid,o=e.gid,a=typeof n=="number"&&typeof o=="number"&&(n!==e.processUid||o!==e.processGid),h=e.preserve,l=e.unlink,u=(0,pe.normalizeWindowsPath)(e.cwd),c=w=>{w&&a&&(0,kn.chownrSync)(w,n,o),r&&x.default.chmodSync(s,i)};if(s===u)return kh(u),c();if(h)return c(x.default.mkdirSync(s,{mode:i,recursive:!0})??void 0);let D=(0,pe.normalizeWindowsPath)(ki.default.relative(u,s)).split("/"),A;for(let w=D.shift(),P=u;w&&(P+="/"+w);w=D.shift()){P=(0,pe.normalizeWindowsPath)(ki.default.resolve(P));try{x.default.mkdirSync(P,i),A=A||P}catch{let Fr=x.default.lstatSync(P);if(Fr.isDirectory())continue;if(l){x.default.unlinkSync(P),x.default.mkdirSync(P,i),A=A||P;continue}else if(Fr.isSymbolicLink())return new xn.SymlinkError(P,P+"/"+D.join("/"))}}return c(A)};Te.mkdirSync=jh});var Hn=d(ji=>{"use strict";Object.defineProperty(ji,"__esModule",{value:!0});ji.normalizeUnicode=void 0;var Er=Object.create(null),Wn=1e4,lt=new Set,xh=s=>{lt.has(s)?lt.delete(s):Er[s]=s.normalize("NFD").toLocaleLowerCase("en").toLocaleUpperCase("en"),lt.add(s);let e=Er[s],t=lt.size-Wn;if(t>Wn/10){for(let i of lt)if(lt.delete(i),delete Er[i],--t<=0)break}return e};ji.normalizeUnicode=xh});var Gn=d(xi=>{"use strict";Object.defineProperty(xi,"__esModule",{value:!0});xi.PathReservations=void 0;var Zn=require("node:path"),Uh=Hn(),qh=_i(),Wh=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform,Hh=Wh==="win32",Zh=s=>s.split("/").slice(0,-1).reduce((t,i)=>{let r=t[t.length-1];return r!==void 0&&(i=(0,Zn.join)(r,i)),t.push(i||"/"),t},[]),br=class{#e=new Map;#i=new Map;#s=new Set;reserve(e,t){e=Hh?["win32 parallelization disabled"]:e.map(r=>(0,qh.stripTrailingSlashes)((0,Zn.join)((0,Uh.normalizeUnicode)(r))));let i=new Set(e.map(r=>Zh(r)).reduce((r,n)=>r.concat(n)));this.#i.set(t,{dirs:i,paths:e});for(let r of e){let n=this.#e.get(r);n?n.push(t):this.#e.set(r,[t])}for(let r of i){let n=this.#e.get(r);if(!n)this.#e.set(r,[new Set([t])]);else{let o=n[n.length-1];o instanceof Set?o.add(t):n.push(new Set([t]))}}return this.#r(t)}#n(e){let t=this.#i.get(e);if(!t)throw new Error("function does not have any path reservations");return{paths:t.paths.map(i=>this.#e.get(i)),dirs:[...t.dirs].map(i=>this.#e.get(i))}}check(e){let{paths:t,dirs:i}=this.#n(e);return t.every(r=>r&&r[0]===e)&&i.every(r=>r&&r[0]instanceof Set&&r[0].has(e))}#r(e){return this.#s.has(e)||!this.check(e)?!1:(this.#s.add(e),e(()=>this.#t(e)),!0)}#t(e){if(!this.#s.has(e))return!1;let t=this.#i.get(e);if(!t)throw new Error("invalid reservation");let{paths:i,dirs:r}=t,n=new Set;for(let o of i){let a=this.#e.get(o);if(!a||a?.[0]!==e)continue;let h=a[1];if(!h){this.#e.delete(o);continue}if(a.shift(),typeof h=="function")n.add(h);else for(let l of h)n.add(l)}for(let o of r){let a=this.#e.get(o),h=a?.[0];if(!(!a||!(h instanceof Set)))if(h.size===1&&a.length===1){this.#e.delete(o);continue}else if(h.size===1){a.shift();let l=a[0];typeof l=="function"&&n.add(l)}else h.delete(e)}return this.#s.delete(e),n.forEach(o=>this.#r(o)),!0}};xi.PathReservations=br});var Yn=d(Ui=>{"use strict";Object.defineProperty(Ui,"__esModule",{value:!0});Ui.umask=void 0;var Gh=()=>process.umask();Ui.umask=Gh});var Lr=d(z=>{"use strict";var Yh=z&&z.__createBinding||(Object.create?(function(s,e,t,i){i===void 0&&(i=t);var r=Object.getOwnPropertyDescriptor(e,t);(!r||("get"in r?!e.__esModule:r.writable||r.configurable))&&(r={enumerable:!0,get:function(){return e[t]}}),Object.defineProperty(s,i,r)}):(function(s,e,t,i){i===void 0&&(i=t),s[i]=e[t]})),Kh=z&&z.__setModuleDefault||(Object.create?(function(s,e){Object.defineProperty(s,"default",{enumerable:!0,value:e})}):function(s,e){s.default=e}),so=z&&z.__importStar||(function(){var s=function(e){return s=Object.getOwnPropertyNames||function(t){var i=[];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(i[i.length]=r);return i},s(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var i=s(e),r=0;r<i.length;r++)i[r]!=="default"&&Yh(t,e,i[r]);return Kh(t,e),t}})(),Mr=z&&z.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(z,"__esModule",{value:!0});z.UnpackSync=z.Unpack=void 0;var Vh=so(Ke()),$h=Mr(require("node:assert")),ro=require("node:crypto"),m=Mr(require("node:fs")),g=Mr(require("node:path")),no=Cn(),oo=qn(),U=et(),Xh=mi(),Qh=Us(),Kn=so(Ws()),Jh=Gn(),ao=_r(),el=Yn(),Vn=Symbol("onEntry"),Or=Symbol("checkFs"),$n=Symbol("checkFs2"),vr=Symbol("isReusable"),Z=Symbol("makeFs"),Tr=Symbol("file"),Dr=Symbol("directory"),Wi=Symbol("link"),Xn=Symbol("symlink"),Qn=Symbol("hardlink"),Mt=Symbol("ensureNoSymlink"),Jn=Symbol("unsupported"),eo=Symbol("checkPath"),Sr=Symbol("stripAbsolutePath"),De=Symbol("mkdir"),T=Symbol("onError"),qi=Symbol("pending"),to=Symbol("pend"),ut=Symbol("unpend"),gr=Symbol("ended"),Rr=Symbol("maybeClose"),Pr=Symbol("skip"),Lt=Symbol("doChown"),At=Symbol("uid"),It=Symbol("gid"),Ct=Symbol("checkedCwd"),tl=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform,Ft=tl==="win32",il=1024,sl=(s,e)=>{if(!Ft)return m.default.unlink(s,e);let t=s+".DELETE."+(0,ro.randomBytes)(16).toString("hex");m.default.rename(s,t,i=>{if(i)return e(i);m.default.unlink(t,e)})},rl=s=>{if(!Ft)return m.default.unlinkSync(s);let e=s+".DELETE."+(0,ro.randomBytes)(16).toString("hex");m.default.renameSync(s,e),m.default.unlinkSync(e)},io=(s,e,t)=>s!==void 0&&s===s>>>0?s:e!==void 0&&e===e>>>0?e:t,Hi=class extends Xh.Parser{[gr]=!1;[Ct]=!1;[qi]=0;reservations=new Jh.PathReservations;transform;writable=!0;readable=!1;uid;gid;setOwner;preserveOwner;processGid;processUid;maxDepth;forceChown;win32;newer;keep;noMtime;preservePaths;unlink;cwd;strip;processUmask;umask;dmode;fmode;chmod;constructor(e={}){if(e.ondone=()=>{this[gr]=!0,this[Rr]()},super(e),this.transform=e.transform,this.chmod=!!e.chmod,typeof e.uid=="number"||typeof e.gid=="number"){if(typeof e.uid!="number"||typeof e.gid!="number")throw new TypeError("cannot set owner without number uid and gid");if(e.preserveOwner)throw new TypeError("cannot preserve owner in archive and also set owner explicitly");this.uid=e.uid,this.gid=e.gid,this.setOwner=!0}else this.uid=void 0,this.gid=void 0,this.setOwner=!1;e.preserveOwner===void 0&&typeof e.uid!="number"?this.preserveOwner=!!(process.getuid&&process.getuid()===0):this.preserveOwner=!!e.preserveOwner,this.processUid=(this.preserveOwner||this.setOwner)&&process.getuid?process.getuid():void 0,this.processGid=(this.preserveOwner||this.setOwner)&&process.getgid?process.getgid():void 0,this.maxDepth=typeof e.maxDepth=="number"?e.maxDepth:il,this.forceChown=e.forceChown===!0,this.win32=!!e.win32||Ft,this.newer=!!e.newer,this.keep=!!e.keep,this.noMtime=!!e.noMtime,this.preservePaths=!!e.preservePaths,this.unlink=!!e.unlink,this.cwd=(0,U.normalizeWindowsPath)(g.default.resolve(e.cwd||process.cwd())),this.strip=Number(e.strip)||0,this.processUmask=this.chmod?typeof e.processUmask=="number"?e.processUmask:(0,el.umask)():0,this.umask=typeof e.umask=="number"?e.umask:this.processUmask,this.dmode=e.dmode||511&~this.umask,this.fmode=e.fmode||438&~this.umask,this.on("entry",t=>this[Vn](t))}warn(e,t,i={}){return(e==="TAR_BAD_ARCHIVE"||e==="TAR_ABORT")&&(i.recoverable=!1),super.warn(e,t,i)}[Rr](){this[gr]&&this[qi]===0&&(this.emit("prefinish"),this.emit("finish"),this.emit("end"))}[Sr](e,t){let i=e[t],{type:r}=e;if(!i||this.preservePaths)return!0;let[n,o]=(0,Qh.stripAbsolutePath)(i),a=o.replace(/\\/g,"/").split("/");if(a.includes("..")||Ft&&/^[a-z]:\.\.$/i.test(a[0]??"")){if(t==="path"||r==="Link")return this.warn("TAR_ENTRY_ERROR",`${t} contains '..'`,{entry:e,[t]:i}),!1;{let h=g.default.posix.dirname(e.path),l=g.default.posix.normalize(g.default.posix.join(h,a.join("/")));if(l.startsWith("../")||l==="..")return this.warn("TAR_ENTRY_ERROR",`${t} escapes extraction directory`,{entry:e,[t]:i}),!1}}return n&&(e[t]=String(o),this.warn("TAR_ENTRY_INFO",`stripping ${n} from absolute ${t}`,{entry:e,[t]:i})),!0}[eo](e){let t=(0,U.normalizeWindowsPath)(e.path),i=t.split("/");if(this.strip){if(i.length<this.strip)return!1;if(e.type==="Link"){let r=(0,U.normalizeWindowsPath)(String(e.linkpath)).split("/");if(r.length>=this.strip)e.linkpath=r.slice(this.strip).join("/");else return!1}i.splice(0,this.strip),e.path=i.join("/")}if(isFinite(this.maxDepth)&&i.length>this.maxDepth)return this.warn("TAR_ENTRY_ERROR","path excessively deep",{entry:e,path:t,depth:i.length,maxDepth:this.maxDepth}),!1;if(!this[Sr](e,"path")||!this[Sr](e,"linkpath"))return!1;if(g.default.isAbsolute(e.path)?e.absolute=(0,U.normalizeWindowsPath)(g.default.resolve(e.path)):e.absolute=(0,U.normalizeWindowsPath)(g.default.resolve(this.cwd,e.path)),!this.preservePaths&&typeof e.absolute=="string"&&e.absolute.indexOf(this.cwd+"/")!==0&&e.absolute!==this.cwd)return this.warn("TAR_ENTRY_ERROR","path escaped extraction target",{entry:e,path:(0,U.normalizeWindowsPath)(e.path),resolvedPath:e.absolute,cwd:this.cwd}),!1;if(e.absolute===this.cwd&&e.type!=="Directory"&&e.type!=="GNUDumpDir")return!1;if(this.win32){let{root:r}=g.default.win32.parse(String(e.absolute));e.absolute=r+Kn.encode(String(e.absolute).slice(r.length));let{root:n}=g.default.win32.parse(e.path);e.path=n+Kn.encode(e.path.slice(n.length))}return!0}[Vn](e){if(!this[eo](e))return e.resume();switch($h.default.equal(typeof e.absolute,"string"),e.type){case"Directory":case"GNUDumpDir":e.mode&&(e.mode=e.mode|448);case"File":case"OldFile":case"ContiguousFile":case"Link":case"SymbolicLink":return this[Or](e);default:return this[Jn](e)}}[T](e,t){e.name==="CwdError"?this.emit("error",e):(this.warn("TAR_ENTRY_ERROR",e,{entry:t}),this[ut](),t.resume())}[De](e,t,i){(0,oo.mkdir)((0,U.normalizeWindowsPath)(e),{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cwd:this.cwd,mode:t},i)}[Lt](e){return this.forceChown||this.preserveOwner&&(typeof e.uid=="number"&&e.uid!==this.processUid||typeof e.gid=="number"&&e.gid!==this.processGid)||typeof this.uid=="number"&&this.uid!==this.processUid||typeof this.gid=="number"&&this.gid!==this.processGid}[At](e){return io(this.uid,e.uid,this.processUid)}[It](e){return io(this.gid,e.gid,this.processGid)}[Tr](e,t){let i=typeof e.mode=="number"?e.mode&4095:this.fmode,r=new Vh.WriteStream(String(e.absolute),{flags:(0,no.getWriteFlag)(e.size),mode:i,autoClose:!1});r.on("error",h=>{r.fd&&m.default.close(r.fd,()=>{}),r.write=()=>!0,this[T](h,e),t()});let n=1,o=h=>{if(h){r.fd&&m.default.close(r.fd,()=>{}),this[T](h,e),t();return}--n===0&&r.fd!==void 0&&m.default.close(r.fd,l=>{l?this[T](l,e):this[ut](),t()})};r.on("finish",()=>{let h=String(e.absolute),l=r.fd;if(typeof l=="number"&&e.mtime&&!this.noMtime){n++;let u=e.atime||new Date,c=e.mtime;m.default.futimes(l,u,c,E=>E?m.default.utimes(h,u,c,D=>o(D&&E)):o())}if(typeof l=="number"&&this[Lt](e)){n++;let u=this[At](e),c=this[It](e);typeof u=="number"&&typeof c=="number"&&m.default.fchown(l,u,c,E=>E?m.default.chown(h,u,c,D=>o(D&&E)):o())}o()});let a=this.transform&&this.transform(e)||e;a!==e&&(a.on("error",h=>{this[T](h,e),t()}),e.pipe(a)),a.pipe(r)}[Dr](e,t){let i=typeof e.mode=="number"?e.mode&4095:this.dmode;this[De](String(e.absolute),i,r=>{if(r){this[T](r,e),t();return}let n=1,o=()=>{--n===0&&(t(),this[ut](),e.resume())};e.mtime&&!this.noMtime&&(n++,m.default.utimes(String(e.absolute),e.atime||new Date,e.mtime,o)),this[Lt](e)&&(n++,m.default.chown(String(e.absolute),Number(this[At](e)),Number(this[It](e)),o)),o()})}[Jn](e){e.unsupported=!0,this.warn("TAR_ENTRY_UNSUPPORTED",`unsupported entry type: ${e.type}`,{entry:e}),e.resume()}[Xn](e,t){let i=(0,U.normalizeWindowsPath)(g.default.relative(this.cwd,g.default.resolve(g.default.dirname(String(e.absolute)),String(e.linkpath)))).split("/");this[Mt](e,this.cwd,i,()=>this[Wi](e,String(e.linkpath),"symlink",t),r=>{this[T](r,e),t()})}[Qn](e,t){let i=(0,U.normalizeWindowsPath)(g.default.resolve(this.cwd,String(e.linkpath))),r=(0,U.normalizeWindowsPath)(String(e.linkpath)).split("/");this[Mt](e,this.cwd,r,()=>this[Wi](e,i,"link",t),n=>{this[T](n,e),t()})}[Mt](e,t,i,r,n){let o=i.shift();if(this.preservePaths||o===void 0)return r();let a=g.default.resolve(t,o);m.default.lstat(a,(h,l)=>{if(h)return r();if(l?.isSymbolicLink())return n(new ao.SymlinkError(a,g.default.resolve(a,i.join("/"))));this[Mt](e,a,i,r,n)})}[to](){this[qi]++}[ut](){this[qi]--,this[Rr]()}[Pr](e){this[ut](),e.resume()}[vr](e,t){return e.type==="File"&&!this.unlink&&t.isFile()&&t.nlink<=1&&!Ft}[Or](e){this[to]();let t=[e.path];e.linkpath&&t.push(e.linkpath),this.reservations.reserve(t,i=>this[$n](e,i))}[$n](e,t){let i=a=>{t(a)},r=()=>{this[De](this.cwd,this.dmode,a=>{if(a){this[T](a,e),i();return}this[Ct]=!0,n()})},n=()=>{if(e.absolute!==this.cwd){let a=(0,U.normalizeWindowsPath)(g.default.dirname(String(e.absolute)));if(a!==this.cwd)return this[De](a,this.dmode,h=>{if(h){this[T](h,e),i();return}o()})}o()},o=()=>{m.default.lstat(String(e.absolute),(a,h)=>{if(h&&(this.keep||this.newer&&h.mtime>(e.mtime??h.mtime))){this[Pr](e),i();return}if(a||this[vr](e,h))return this[Z](null,e,i);if(h.isDirectory()){if(e.type==="Directory"){let l=this.chmod&&e.mode&&(h.mode&4095)!==e.mode,u=c=>this[Z](c??null,e,i);return l?m.default.chmod(String(e.absolute),Number(e.mode),u):u()}if(e.absolute!==this.cwd)return m.default.rmdir(String(e.absolute),l=>this[Z](l??null,e,i))}if(e.absolute===this.cwd)return this[Z](null,e,i);sl(String(e.absolute),l=>this[Z](l??null,e,i))})};this[Ct]?n():r()}[Z](e,t,i){if(e){this[T](e,t),i();return}switch(t.type){case"File":case"OldFile":case"ContiguousFile":return this[Tr](t,i);case"Link":return this[Qn](t,i);case"SymbolicLink":return this[Xn](t,i);case"Directory":case"GNUDumpDir":return this[Dr](t,i)}}[Wi](e,t,i,r){m.default[i](t,String(e.absolute),n=>{n?this[T](n,e):(this[ut](),e.resume()),r()})}};z.Unpack=Hi;var Nt=s=>{try{return[null,s()]}catch(e){return[e,null]}},Nr=class extends Hi{sync=!0;[Z](e,t){return super[Z](e,t,()=>{})}[Or](e){if(!this[Ct]){let n=this[De](this.cwd,this.dmode);if(n)return this[T](n,e);this[Ct]=!0}if(e.absolute!==this.cwd){let n=(0,U.normalizeWindowsPath)(g.default.dirname(String(e.absolute)));if(n!==this.cwd){let o=this[De](n,this.dmode);if(o)return this[T](o,e)}}let[t,i]=Nt(()=>m.default.lstatSync(String(e.absolute)));if(i&&(this.keep||this.newer&&i.mtime>(e.mtime??i.mtime)))return this[Pr](e);if(t||this[vr](e,i))return this[Z](null,e);if(i.isDirectory()){if(e.type==="Directory"){let o=this.chmod&&e.mode&&(i.mode&4095)!==e.mode,[a]=o?Nt(()=>{m.default.chmodSync(String(e.absolute),Number(e.mode))}):[];return this[Z](a,e)}let[n]=Nt(()=>m.default.rmdirSync(String(e.absolute)));this[Z](n,e)}let[r]=e.absolute===this.cwd?[]:Nt(()=>rl(String(e.absolute)));this[Z](r,e)}[Tr](e,t){let i=typeof e.mode=="number"?e.mode&4095:this.fmode,r=a=>{let h;try{m.default.closeSync(n)}catch(l){h=l}(a||h)&&this[T](a||h,e),t()},n;try{n=m.default.openSync(String(e.absolute),(0,no.getWriteFlag)(e.size),i)}catch(a){return r(a)}let o=this.transform&&this.transform(e)||e;o!==e&&(o.on("error",a=>this[T](a,e)),e.pipe(o)),o.on("data",a=>{try{m.default.writeSync(n,a,0,a.length)}catch(h){r(h)}}),o.on("end",()=>{let a=null;if(e.mtime&&!this.noMtime){let h=e.atime||new Date,l=e.mtime;try{m.default.futimesSync(n,h,l)}catch(u){try{m.default.utimesSync(String(e.absolute),h,l)}catch{a=u}}}if(this[Lt](e)){let h=this[At](e),l=this[It](e);try{m.default.fchownSync(n,Number(h),Number(l))}catch(u){try{m.default.chownSync(String(e.absolute),Number(h),Number(l))}catch{a=a||u}}}r(a)})}[Dr](e,t){let i=typeof e.mode=="number"?e.mode&4095:this.dmode,r=this[De](String(e.absolute),i);if(r){this[T](r,e),t();return}if(e.mtime&&!this.noMtime)try{m.default.utimesSync(String(e.absolute),e.atime||new Date,e.mtime)}catch{}if(this[Lt](e))try{m.default.chownSync(String(e.absolute),Number(this[At](e)),Number(this[It](e)))}catch{}t(),e.resume()}[De](e,t){try{return(0,oo.mkdirSync)((0,U.normalizeWindowsPath)(e),{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cwd:this.cwd,mode:t})}catch(i){return i}}[Mt](e,t,i,r,n){if(this.preservePaths||!i.length)return r();let o=t;for(let a of i){o=g.default.resolve(o,a);let[h,l]=Nt(()=>m.default.lstatSync(o));if(h)return r();if(l.isSymbolicLink())return n(new ao.SymlinkError(o,g.default.resolve(t,i.join("/"))))}r()}[Wi](e,t,i,r){let n=`${i}Sync`;try{m.default[n](t,String(e.absolute)),r(),e.resume()}catch(o){return this[T](o,e)}}};z.UnpackSync=Nr});var Ar=d(G=>{"use strict";var nl=G&&G.__createBinding||(Object.create?(function(s,e,t,i){i===void 0&&(i=t);var r=Object.getOwnPropertyDescriptor(e,t);(!r||("get"in r?!e.__esModule:r.writable||r.configurable))&&(r={enumerable:!0,get:function(){return e[t]}}),Object.defineProperty(s,i,r)}):(function(s,e,t,i){i===void 0&&(i=t),s[i]=e[t]})),ol=G&&G.__setModuleDefault||(Object.create?(function(s,e){Object.defineProperty(s,"default",{enumerable:!0,value:e})}):function(s,e){s.default=e}),al=G&&G.__importStar||(function(){var s=function(e){return s=Object.getOwnPropertyNames||function(t){var i=[];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(i[i.length]=r);return i},s(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var i=s(e),r=0;r<i.length;r++)i[r]!=="default"&&nl(t,e,i[r]);return ol(t,e),t}})(),hl=G&&G.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(G,"__esModule",{value:!0});G.extract=void 0;var ho=al(Ke()),lo=hl(require("node:fs")),ll=st(),ul=Ve(),Zi=Lr(),cl=s=>{let e=new Zi.UnpackSync(s),t=s.file,i=lo.default.statSync(t),r=s.maxReadSize||16*1024*1024;new ho.ReadStreamSync(t,{readSize:r,size:i.size}).pipe(e)},fl=(s,e)=>{let t=new Zi.Unpack(s),i=s.maxReadSize||16*1024*1024,r=s.file;return new Promise((o,a)=>{t.on("error",a),t.on("close",o),lo.default.stat(r,(h,l)=>{if(h)a(h);else{let u=new ho.ReadStream(r,{readSize:i,size:l.size});u.on("error",a),u.pipe(t)}})})};G.extract=(0,ul.makeCommand)(cl,fl,s=>new Zi.UnpackSync(s),s=>new Zi.Unpack(s),(s,e)=>{e?.length&&(0,ll.filesFilter)(s,e)})});var Gi=d(ct=>{"use strict";var uo=ct&&ct.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(ct,"__esModule",{value:!0});ct.replace=void 0;var co=Ke(),q=uo(require("node:fs")),fo=uo(require("node:path")),mo=Je(),po=st(),dl=Ve(),ml=Vt(),_o=Ai(),pl=(s,e)=>{let t=new _o.PackSync(s),i=!0,r,n;try{try{r=q.default.openSync(s.file,"r+")}catch(h){if(h?.code==="ENOENT")r=q.default.openSync(s.file,"w+");else throw h}let o=q.default.fstatSync(r),a=Buffer.alloc(512);e:for(n=0;n<o.size;n+=512){for(let u=0,c=0;u<512;u+=c){if(c=q.default.readSync(r,a,u,a.length-u,n+u),n===0&&a[0]===31&&a[1]===139)throw new Error("cannot append to compressed archives");if(!c)break e}let h=new mo.Header(a);if(!h.cksumValid)break;let l=512*Math.ceil((h.size||0)/512);if(n+l+512>o.size)break;n+=l,s.mtimeCache&&h.mtime&&s.mtimeCache.set(String(h.path),h.mtime)}i=!1,_l(s,t,n,r,e)}finally{if(i)try{q.default.closeSync(r)}catch{}}},_l=(s,e,t,i,r)=>{let n=new co.WriteStreamSync(s.file,{fd:i,start:t});e.pipe(n),yl(e,r)},wl=(s,e)=>{e=Array.from(e);let t=new _o.Pack(s),i=(n,o,a)=>{let h=(D,A)=>{D?q.default.close(n,w=>a(D)):a(null,A)},l=0;if(o===0)return h(null,0);let u=0,c=Buffer.alloc(512),E=(D,A)=>{if(D||typeof A>"u")return h(D);if(u+=A,u<512&&A)return q.default.read(n,c,u,c.length-u,l+u,E);if(l===0&&c[0]===31&&c[1]===139)return h(new Error("cannot append to compressed archives"));if(u<512)return h(null,l);let w=new mo.Header(c);if(!w.cksumValid)return h(null,l);let P=512*Math.ceil((w.size??0)/512);if(l+P+512>o||(l+=P+512,l>=o))return h(null,l);s.mtimeCache&&w.mtime&&s.mtimeCache.set(String(w.path),w.mtime),u=0,q.default.read(n,c,0,512,l,E)};q.default.read(n,c,0,512,l,E)};return new Promise((n,o)=>{t.on("error",o);let a="r+",h=(l,u)=>{if(l&&l.code==="ENOENT"&&a==="r+")return a="w+",q.default.open(s.file,a,h);if(l||!u)return o(l);q.default.fstat(u,(c,E)=>{if(c)return q.default.close(u,()=>o(c));i(u,E.size,(D,A)=>{if(D)return o(D);let w=new co.WriteStream(s.file,{fd:u,start:A});t.pipe(w),w.on("error",o),w.on("close",n),El(t,e)})})};q.default.open(s.file,a,h)})},yl=(s,e)=>{e.forEach(t=>{t.charAt(0)==="@"?(0,po.list)({file:fo.default.resolve(s.cwd,t.slice(1)),sync:!0,noResume:!0,onReadEntry:i=>s.add(i)}):s.add(t)}),s.end()},El=async(s,e)=>{for(let t=0;t<e.length;t++){let i=String(e[t]);i.charAt(0)==="@"?await(0,po.list)({file:fo.default.resolve(String(s.cwd),i.slice(1)),noResume:!0,onReadEntry:r=>s.add(r)}):s.add(i)}s.end()};ct.replace=(0,dl.makeCommand)(pl,wl,()=>{throw new TypeError("file is required")},()=>{throw new TypeError("file is required")},(s,e)=>{if(!(0,ml.isFile)(s))throw new TypeError("file is required");if(s.gzip||s.brotli||s.zstd||s.file.endsWith(".br")||s.file.endsWith(".tbr"))throw new TypeError("cannot append to compressed archives");if(!e?.length)throw new TypeError("no paths specified to add/replace")})});var Ir=d(Yi=>{"use strict";Object.defineProperty(Yi,"__esModule",{value:!0});Yi.update=void 0;var bl=Ve(),Bt=Gi();Yi.update=(0,bl.makeCommand)(Bt.replace.syncFile,Bt.replace.asyncFile,Bt.replace.syncNoFile,Bt.replace.asyncNoFile,(s,e=[])=>{Bt.replace.validate?.(s,e),Sl(s)});var Sl=s=>{let e=s.filter;s.mtimeCache||(s.mtimeCache=new Map),s.filter=e?(t,i)=>e(t,i)&&!((s.mtimeCache?.get(t)??i.mtime??0)>(i.mtime??0)):(t,i)=>!((s.mtimeCache?.get(t)??i.mtime??0)>(i.mtime??0))}});var wo=exports&&exports.__createBinding||(Object.create?(function(s,e,t,i){i===void 0&&(i=t);var r=Object.getOwnPropertyDescriptor(e,t);(!r||("get"in r?!e.__esModule:r.writable||r.configurable))&&(r={enumerable:!0,get:function(){return e[t]}}),Object.defineProperty(s,i,r)}):(function(s,e,t,i){i===void 0&&(i=t),s[i]=e[t]})),gl=exports&&exports.__setModuleDefault||(Object.create?(function(s,e){Object.defineProperty(s,"default",{enumerable:!0,value:e})}):function(s,e){s.default=e}),Y=exports&&exports.__exportStar||function(s,e){for(var t in s)t!=="default"&&!Object.prototype.hasOwnProperty.call(e,t)&&wo(e,s,t)},Rl=exports&&exports.__importStar||(function(){var s=function(e){return s=Object.getOwnPropertyNames||function(t){var i=[];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(i[i.length]=r);return i},s(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var i=s(e),r=0;r<i.length;r++)i[r]!=="default"&&wo(t,e,i[r]);return gl(t,e),t}})();Object.defineProperty(exports,"__esModule",{value:!0});exports.u=exports.types=exports.r=exports.t=exports.x=exports.c=void 0;Y(fr(),exports);var Ol=fr();Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return Ol.create}});Y(Ar(),exports);var vl=Ar();Object.defineProperty(exports,"x",{enumerable:!0,get:function(){return vl.extract}});Y(Je(),exports);Y(st(),exports);var Tl=st();Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return Tl.list}});Y(Ai(),exports);Y(mi(),exports);Y(ei(),exports);Y(ri(),exports);Y(Gi(),exports);var Dl=Gi();Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return Dl.replace}});exports.types=Rl(Ts());Y(Lr(),exports);Y(Ir(),exports);var Pl=Ir();Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return Pl.update}});Y(er(),exports); //# sourceMappingURL=index.min.js.map diff --git a/deps/npm/node_modules/tar/dist/commonjs/unpack.js b/deps/npm/node_modules/tar/dist/commonjs/unpack.js index dce465312bc7e6..7248fbacfc93a1 100644 --- a/deps/npm/node_modules/tar/dist/commonjs/unpack.js +++ b/deps/npm/node_modules/tar/dist/commonjs/unpack.js @@ -260,7 +260,9 @@ class Unpack extends parse_js_1.Parser { const { type } = entry; if (!p || this.preservePaths) return true; - const parts = p.split('/'); + // strip off the root + const [root, stripped] = (0, strip_absolute_path_js_1.stripAbsolutePath)(p); + const parts = stripped.replace(/\\/g, '/').split('/'); if (parts.includes('..') || /* c8 ignore next */ (isWindows && /^[a-z]:\.\.$/i.test(parts[0] ?? ''))) { @@ -281,7 +283,7 @@ class Unpack extends parse_js_1.Parser { // `path.posix` is safe to use because we're operating on // tar paths, not a filesystem. const entryDir = node_path_1.default.posix.dirname(entry.path); - const resolved = node_path_1.default.posix.normalize(node_path_1.default.posix.join(entryDir, p)); + const resolved = node_path_1.default.posix.normalize(node_path_1.default.posix.join(entryDir, parts.join('/'))); // If the resolved path escapes (starts with ..), reject it if (resolved.startsWith('../') || resolved === '..') { this.warn('TAR_ENTRY_ERROR', `${field} escapes extraction directory`, { @@ -292,8 +294,6 @@ class Unpack extends parse_js_1.Parser { } } } - // strip off the root - const [root, stripped] = (0, strip_absolute_path_js_1.stripAbsolutePath)(p); if (root) { // ok, but triggers warning about stripping root entry[field] = String(stripped); diff --git a/deps/npm/node_modules/tar/dist/esm/index.min.js b/deps/npm/node_modules/tar/dist/esm/index.min.js index 4e06ce82dfbdef..40a573e4cce6c3 100644 --- a/deps/npm/node_modules/tar/dist/esm/index.min.js +++ b/deps/npm/node_modules/tar/dist/esm/index.min.js @@ -1,4 +1,4 @@ -var Dr=Object.defineProperty;var Ar=(s,t)=>{for(var e in t)Dr(s,e,{get:t[e],enumerable:!0})};import Hr from"events";import I from"fs";import{EventEmitter as Oi}from"node:events";import Ds from"node:stream";import{StringDecoder as Ir}from"node:string_decoder";var Ts=typeof process=="object"&&process?process:{stdout:null,stderr:null},Cr=s=>!!s&&typeof s=="object"&&(s instanceof A||s instanceof Ds||Fr(s)||kr(s)),Fr=s=>!!s&&typeof s=="object"&&s instanceof Oi&&typeof s.pipe=="function"&&s.pipe!==Ds.Writable.prototype.pipe,kr=s=>!!s&&typeof s=="object"&&s instanceof Oi&&typeof s.write=="function"&&typeof s.end=="function",q=Symbol("EOF"),j=Symbol("maybeEmitEnd"),rt=Symbol("emittedEnd"),xe=Symbol("emittingEnd"),jt=Symbol("emittedError"),Le=Symbol("closed"),xs=Symbol("read"),Ne=Symbol("flush"),Ls=Symbol("flushChunk"),z=Symbol("encoding"),Mt=Symbol("decoder"),b=Symbol("flowing"),Qt=Symbol("paused"),Bt=Symbol("resume"),g=Symbol("buffer"),D=Symbol("pipes"),_=Symbol("bufferLength"),Si=Symbol("bufferPush"),De=Symbol("bufferShift"),L=Symbol("objectMode"),w=Symbol("destroyed"),yi=Symbol("error"),Ri=Symbol("emitData"),Ns=Symbol("emitEnd"),bi=Symbol("emitEnd2"),Z=Symbol("async"),gi=Symbol("abort"),Ae=Symbol("aborted"),Jt=Symbol("signal"),yt=Symbol("dataListeners"),C=Symbol("discarded"),te=s=>Promise.resolve().then(s),vr=s=>s(),Mr=s=>s==="end"||s==="finish"||s==="prefinish",Br=s=>s instanceof ArrayBuffer||!!s&&typeof s=="object"&&s.constructor&&s.constructor.name==="ArrayBuffer"&&s.byteLength>=0,Pr=s=>!Buffer.isBuffer(s)&&ArrayBuffer.isView(s),Ie=class{src;dest;opts;ondrain;constructor(t,e,i){this.src=t,this.dest=e,this.opts=i,this.ondrain=()=>t[Bt](),this.dest.on("drain",this.ondrain)}unpipe(){this.dest.removeListener("drain",this.ondrain)}proxyErrors(t){}end(){this.unpipe(),this.opts.end&&this.dest.end()}},_i=class extends Ie{unpipe(){this.src.removeListener("error",this.proxyErrors),super.unpipe()}constructor(t,e,i){super(t,e,i),this.proxyErrors=r=>e.emit("error",r),t.on("error",this.proxyErrors)}},zr=s=>!!s.objectMode,Ur=s=>!s.objectMode&&!!s.encoding&&s.encoding!=="buffer",A=class extends Oi{[b]=!1;[Qt]=!1;[D]=[];[g]=[];[L];[z];[Z];[Mt];[q]=!1;[rt]=!1;[xe]=!1;[Le]=!1;[jt]=null;[_]=0;[w]=!1;[Jt];[Ae]=!1;[yt]=0;[C]=!1;writable=!0;readable=!0;constructor(...t){let e=t[0]||{};if(super(),e.objectMode&&typeof e.encoding=="string")throw new TypeError("Encoding and objectMode may not be used together");zr(e)?(this[L]=!0,this[z]=null):Ur(e)?(this[z]=e.encoding,this[L]=!1):(this[L]=!1,this[z]=null),this[Z]=!!e.async,this[Mt]=this[z]?new Ir(this[z]):null,e&&e.debugExposeBuffer===!0&&Object.defineProperty(this,"buffer",{get:()=>this[g]}),e&&e.debugExposePipes===!0&&Object.defineProperty(this,"pipes",{get:()=>this[D]});let{signal:i}=e;i&&(this[Jt]=i,i.aborted?this[gi]():i.addEventListener("abort",()=>this[gi]()))}get bufferLength(){return this[_]}get encoding(){return this[z]}set encoding(t){throw new Error("Encoding must be set at instantiation time")}setEncoding(t){throw new Error("Encoding must be set at instantiation time")}get objectMode(){return this[L]}set objectMode(t){throw new Error("objectMode must be set at instantiation time")}get async(){return this[Z]}set async(t){this[Z]=this[Z]||!!t}[gi](){this[Ae]=!0,this.emit("abort",this[Jt]?.reason),this.destroy(this[Jt]?.reason)}get aborted(){return this[Ae]}set aborted(t){}write(t,e,i){if(this[Ae])return!1;if(this[q])throw new Error("write after end");if(this[w])return this.emit("error",Object.assign(new Error("Cannot call write after a stream was destroyed"),{code:"ERR_STREAM_DESTROYED"})),!0;typeof e=="function"&&(i=e,e="utf8"),e||(e="utf8");let r=this[Z]?te:vr;if(!this[L]&&!Buffer.isBuffer(t)){if(Pr(t))t=Buffer.from(t.buffer,t.byteOffset,t.byteLength);else if(Br(t))t=Buffer.from(t);else if(typeof t!="string")throw new Error("Non-contiguous data written to non-objectMode stream")}return this[L]?(this[b]&&this[_]!==0&&this[Ne](!0),this[b]?this.emit("data",t):this[Si](t),this[_]!==0&&this.emit("readable"),i&&r(i),this[b]):t.length?(typeof t=="string"&&!(e===this[z]&&!this[Mt]?.lastNeed)&&(t=Buffer.from(t,e)),Buffer.isBuffer(t)&&this[z]&&(t=this[Mt].write(t)),this[b]&&this[_]!==0&&this[Ne](!0),this[b]?this.emit("data",t):this[Si](t),this[_]!==0&&this.emit("readable"),i&&r(i),this[b]):(this[_]!==0&&this.emit("readable"),i&&r(i),this[b])}read(t){if(this[w])return null;if(this[C]=!1,this[_]===0||t===0||t&&t>this[_])return this[j](),null;this[L]&&(t=null),this[g].length>1&&!this[L]&&(this[g]=[this[z]?this[g].join(""):Buffer.concat(this[g],this[_])]);let e=this[xs](t||null,this[g][0]);return this[j](),e}[xs](t,e){if(this[L])this[De]();else{let i=e;t===i.length||t===null?this[De]():typeof i=="string"?(this[g][0]=i.slice(t),e=i.slice(0,t),this[_]-=t):(this[g][0]=i.subarray(t),e=i.subarray(0,t),this[_]-=t)}return this.emit("data",e),!this[g].length&&!this[q]&&this.emit("drain"),e}end(t,e,i){return typeof t=="function"&&(i=t,t=void 0),typeof e=="function"&&(i=e,e="utf8"),t!==void 0&&this.write(t,e),i&&this.once("end",i),this[q]=!0,this.writable=!1,(this[b]||!this[Qt])&&this[j](),this}[Bt](){this[w]||(!this[yt]&&!this[D].length&&(this[C]=!0),this[Qt]=!1,this[b]=!0,this.emit("resume"),this[g].length?this[Ne]():this[q]?this[j]():this.emit("drain"))}resume(){return this[Bt]()}pause(){this[b]=!1,this[Qt]=!0,this[C]=!1}get destroyed(){return this[w]}get flowing(){return this[b]}get paused(){return this[Qt]}[Si](t){this[L]?this[_]+=1:this[_]+=t.length,this[g].push(t)}[De](){return this[L]?this[_]-=1:this[_]-=this[g][0].length,this[g].shift()}[Ne](t=!1){do;while(this[Ls](this[De]())&&this[g].length);!t&&!this[g].length&&!this[q]&&this.emit("drain")}[Ls](t){return this.emit("data",t),this[b]}pipe(t,e){if(this[w])return t;this[C]=!1;let i=this[rt];return e=e||{},t===Ts.stdout||t===Ts.stderr?e.end=!1:e.end=e.end!==!1,e.proxyErrors=!!e.proxyErrors,i?e.end&&t.end():(this[D].push(e.proxyErrors?new _i(this,t,e):new Ie(this,t,e)),this[Z]?te(()=>this[Bt]()):this[Bt]()),t}unpipe(t){let e=this[D].find(i=>i.dest===t);e&&(this[D].length===1?(this[b]&&this[yt]===0&&(this[b]=!1),this[D]=[]):this[D].splice(this[D].indexOf(e),1),e.unpipe())}addListener(t,e){return this.on(t,e)}on(t,e){let i=super.on(t,e);if(t==="data")this[C]=!1,this[yt]++,!this[D].length&&!this[b]&&this[Bt]();else if(t==="readable"&&this[_]!==0)super.emit("readable");else if(Mr(t)&&this[rt])super.emit(t),this.removeAllListeners(t);else if(t==="error"&&this[jt]){let r=e;this[Z]?te(()=>r.call(this,this[jt])):r.call(this,this[jt])}return i}removeListener(t,e){return this.off(t,e)}off(t,e){let i=super.off(t,e);return t==="data"&&(this[yt]=this.listeners("data").length,this[yt]===0&&!this[C]&&!this[D].length&&(this[b]=!1)),i}removeAllListeners(t){let e=super.removeAllListeners(t);return(t==="data"||t===void 0)&&(this[yt]=0,!this[C]&&!this[D].length&&(this[b]=!1)),e}get emittedEnd(){return this[rt]}[j](){!this[xe]&&!this[rt]&&!this[w]&&this[g].length===0&&this[q]&&(this[xe]=!0,this.emit("end"),this.emit("prefinish"),this.emit("finish"),this[Le]&&this.emit("close"),this[xe]=!1)}emit(t,...e){let i=e[0];if(t!=="error"&&t!=="close"&&t!==w&&this[w])return!1;if(t==="data")return!this[L]&&!i?!1:this[Z]?(te(()=>this[Ri](i)),!0):this[Ri](i);if(t==="end")return this[Ns]();if(t==="close"){if(this[Le]=!0,!this[rt]&&!this[w])return!1;let n=super.emit("close");return this.removeAllListeners("close"),n}else if(t==="error"){this[jt]=i,super.emit(yi,i);let n=!this[Jt]||this.listeners("error").length?super.emit("error",i):!1;return this[j](),n}else if(t==="resume"){let n=super.emit("resume");return this[j](),n}else if(t==="finish"||t==="prefinish"){let n=super.emit(t);return this.removeAllListeners(t),n}let r=super.emit(t,...e);return this[j](),r}[Ri](t){for(let i of this[D])i.dest.write(t)===!1&&this.pause();let e=this[C]?!1:super.emit("data",t);return this[j](),e}[Ns](){return this[rt]?!1:(this[rt]=!0,this.readable=!1,this[Z]?(te(()=>this[bi]()),!0):this[bi]())}[bi](){if(this[Mt]){let e=this[Mt].end();if(e){for(let i of this[D])i.dest.write(e);this[C]||super.emit("data",e)}}for(let e of this[D])e.end();let t=super.emit("end");return this.removeAllListeners("end"),t}async collect(){let t=Object.assign([],{dataLength:0});this[L]||(t.dataLength=0);let e=this.promise();return this.on("data",i=>{t.push(i),this[L]||(t.dataLength+=i.length)}),await e,t}async concat(){if(this[L])throw new Error("cannot concat in objectMode");let t=await this.collect();return this[z]?t.join(""):Buffer.concat(t,t.dataLength)}async promise(){return new Promise((t,e)=>{this.on(w,()=>e(new Error("stream destroyed"))),this.on("error",i=>e(i)),this.on("end",()=>t())})}[Symbol.asyncIterator](){this[C]=!1;let t=!1,e=async()=>(this.pause(),t=!0,{value:void 0,done:!0});return{next:()=>{if(t)return e();let r=this.read();if(r!==null)return Promise.resolve({done:!1,value:r});if(this[q])return e();let n,o,h=d=>{this.off("data",a),this.off("end",l),this.off(w,c),e(),o(d)},a=d=>{this.off("error",h),this.off("end",l),this.off(w,c),this.pause(),n({value:d,done:!!this[q]})},l=()=>{this.off("error",h),this.off("data",a),this.off(w,c),e(),n({done:!0,value:void 0})},c=()=>h(new Error("stream destroyed"));return new Promise((d,S)=>{o=S,n=d,this.once(w,c),this.once("error",h),this.once("end",l),this.once("data",a)})},throw:e,return:e,[Symbol.asyncIterator](){return this}}}[Symbol.iterator](){this[C]=!1;let t=!1,e=()=>(this.pause(),this.off(yi,e),this.off(w,e),this.off("end",e),t=!0,{done:!0,value:void 0}),i=()=>{if(t)return e();let r=this.read();return r===null?e():{done:!1,value:r}};return this.once("end",e),this.once(yi,e),this.once(w,e),{next:i,throw:e,return:e,[Symbol.iterator](){return this}}}destroy(t){if(this[w])return t?this.emit("error",t):this.emit(w),this;this[w]=!0,this[C]=!0,this[g].length=0,this[_]=0;let e=this;return typeof e.close=="function"&&!this[Le]&&e.close(),t?this.emit("error",t):this.emit(w),this}static get isStream(){return Cr}};var Wr=I.writev,ot=Symbol("_autoClose"),H=Symbol("_close"),ee=Symbol("_ended"),m=Symbol("_fd"),Ti=Symbol("_finished"),J=Symbol("_flags"),xi=Symbol("_flush"),Ai=Symbol("_handleChunk"),Ii=Symbol("_makeBuf"),se=Symbol("_mode"),Ce=Symbol("_needDrain"),Ut=Symbol("_onerror"),Ht=Symbol("_onopen"),Li=Symbol("_onread"),Pt=Symbol("_onwrite"),ht=Symbol("_open"),U=Symbol("_path"),nt=Symbol("_pos"),Y=Symbol("_queue"),zt=Symbol("_read"),Ni=Symbol("_readSize"),Q=Symbol("_reading"),ie=Symbol("_remain"),Di=Symbol("_size"),Fe=Symbol("_write"),Rt=Symbol("_writing"),ke=Symbol("_defaultFlag"),bt=Symbol("_errored"),gt=class extends A{[bt]=!1;[m];[U];[Ni];[Q]=!1;[Di];[ie];[ot];constructor(t,e){if(e=e||{},super(e),this.readable=!0,this.writable=!1,typeof t!="string")throw new TypeError("path must be a string");this[bt]=!1,this[m]=typeof e.fd=="number"?e.fd:void 0,this[U]=t,this[Ni]=e.readSize||16*1024*1024,this[Q]=!1,this[Di]=typeof e.size=="number"?e.size:1/0,this[ie]=this[Di],this[ot]=typeof e.autoClose=="boolean"?e.autoClose:!0,typeof this[m]=="number"?this[zt]():this[ht]()}get fd(){return this[m]}get path(){return this[U]}write(){throw new TypeError("this is a readable stream")}end(){throw new TypeError("this is a readable stream")}[ht](){I.open(this[U],"r",(t,e)=>this[Ht](t,e))}[Ht](t,e){t?this[Ut](t):(this[m]=e,this.emit("open",e),this[zt]())}[Ii](){return Buffer.allocUnsafe(Math.min(this[Ni],this[ie]))}[zt](){if(!this[Q]){this[Q]=!0;let t=this[Ii]();if(t.length===0)return process.nextTick(()=>this[Li](null,0,t));I.read(this[m],t,0,t.length,null,(e,i,r)=>this[Li](e,i,r))}}[Li](t,e,i){this[Q]=!1,t?this[Ut](t):this[Ai](e,i)&&this[zt]()}[H](){if(this[ot]&&typeof this[m]=="number"){let t=this[m];this[m]=void 0,I.close(t,e=>e?this.emit("error",e):this.emit("close"))}}[Ut](t){this[Q]=!0,this[H](),this.emit("error",t)}[Ai](t,e){let i=!1;return this[ie]-=t,t>0&&(i=super.write(t<e.length?e.subarray(0,t):e)),(t===0||this[ie]<=0)&&(i=!1,this[H](),super.end()),i}emit(t,...e){switch(t){case"prefinish":case"finish":return!1;case"drain":return typeof this[m]=="number"&&this[zt](),!1;case"error":return this[bt]?!1:(this[bt]=!0,super.emit(t,...e));default:return super.emit(t,...e)}}},ve=class extends gt{[ht](){let t=!0;try{this[Ht](null,I.openSync(this[U],"r")),t=!1}finally{t&&this[H]()}}[zt](){let t=!0;try{if(!this[Q]){this[Q]=!0;do{let e=this[Ii](),i=e.length===0?0:I.readSync(this[m],e,0,e.length,null);if(!this[Ai](i,e))break}while(!0);this[Q]=!1}t=!1}finally{t&&this[H]()}}[H](){if(this[ot]&&typeof this[m]=="number"){let t=this[m];this[m]=void 0,I.closeSync(t),this.emit("close")}}},tt=class extends Hr{readable=!1;writable=!0;[bt]=!1;[Rt]=!1;[ee]=!1;[Y]=[];[Ce]=!1;[U];[se];[ot];[m];[ke];[J];[Ti]=!1;[nt];constructor(t,e){e=e||{},super(e),this[U]=t,this[m]=typeof e.fd=="number"?e.fd:void 0,this[se]=e.mode===void 0?438:e.mode,this[nt]=typeof e.start=="number"?e.start:void 0,this[ot]=typeof e.autoClose=="boolean"?e.autoClose:!0;let i=this[nt]!==void 0?"r+":"w";this[ke]=e.flags===void 0,this[J]=e.flags===void 0?i:e.flags,this[m]===void 0&&this[ht]()}emit(t,...e){if(t==="error"){if(this[bt])return!1;this[bt]=!0}return super.emit(t,...e)}get fd(){return this[m]}get path(){return this[U]}[Ut](t){this[H](),this[Rt]=!0,this.emit("error",t)}[ht](){I.open(this[U],this[J],this[se],(t,e)=>this[Ht](t,e))}[Ht](t,e){this[ke]&&this[J]==="r+"&&t&&t.code==="ENOENT"?(this[J]="w",this[ht]()):t?this[Ut](t):(this[m]=e,this.emit("open",e),this[Rt]||this[xi]())}end(t,e){return t&&this.write(t,e),this[ee]=!0,!this[Rt]&&!this[Y].length&&typeof this[m]=="number"&&this[Pt](null,0),this}write(t,e){return typeof t=="string"&&(t=Buffer.from(t,e)),this[ee]?(this.emit("error",new Error("write() after end()")),!1):this[m]===void 0||this[Rt]||this[Y].length?(this[Y].push(t),this[Ce]=!0,!1):(this[Rt]=!0,this[Fe](t),!0)}[Fe](t){I.write(this[m],t,0,t.length,this[nt],(e,i)=>this[Pt](e,i))}[Pt](t,e){t?this[Ut](t):(this[nt]!==void 0&&typeof e=="number"&&(this[nt]+=e),this[Y].length?this[xi]():(this[Rt]=!1,this[ee]&&!this[Ti]?(this[Ti]=!0,this[H](),this.emit("finish")):this[Ce]&&(this[Ce]=!1,this.emit("drain"))))}[xi](){if(this[Y].length===0)this[ee]&&this[Pt](null,0);else if(this[Y].length===1)this[Fe](this[Y].pop());else{let t=this[Y];this[Y]=[],Wr(this[m],t,this[nt],(e,i)=>this[Pt](e,i))}}[H](){if(this[ot]&&typeof this[m]=="number"){let t=this[m];this[m]=void 0,I.close(t,e=>e?this.emit("error",e):this.emit("close"))}}},Wt=class extends tt{[ht](){let t;if(this[ke]&&this[J]==="r+")try{t=I.openSync(this[U],this[J],this[se])}catch(e){if(e?.code==="ENOENT")return this[J]="w",this[ht]();throw e}else t=I.openSync(this[U],this[J],this[se]);this[Ht](null,t)}[H](){if(this[ot]&&typeof this[m]=="number"){let t=this[m];this[m]=void 0,I.closeSync(t),this.emit("close")}}[Fe](t){let e=!0;try{this[Pt](null,I.writeSync(this[m],t,0,t.length,this[nt])),e=!1}finally{if(e)try{this[H]()}catch{}}}};import or from"node:path";import Vt from"node:fs";import{dirname as bn,parse as gn}from"path";var Gr=new Map([["C","cwd"],["f","file"],["z","gzip"],["P","preservePaths"],["U","unlink"],["strip-components","strip"],["stripComponents","strip"],["keep-newer","newer"],["keepNewer","newer"],["keep-newer-files","newer"],["keepNewerFiles","newer"],["k","keep"],["keep-existing","keep"],["keepExisting","keep"],["m","noMtime"],["no-mtime","noMtime"],["p","preserveOwner"],["L","follow"],["h","follow"],["onentry","onReadEntry"]]),As=s=>!!s.sync&&!!s.file,Is=s=>!s.sync&&!!s.file,Cs=s=>!!s.sync&&!s.file,Fs=s=>!s.sync&&!s.file;var ks=s=>!!s.file;var Zr=s=>{let t=Gr.get(s);return t||s},re=(s={})=>{if(!s)return{};let t={};for(let[e,i]of Object.entries(s)){let r=Zr(e);t[r]=i}return t.chmod===void 0&&t.noChmod===!1&&(t.chmod=!0),delete t.noChmod,t};var K=(s,t,e,i,r)=>Object.assign((n=[],o,h)=>{Array.isArray(n)&&(o=n,n={}),typeof o=="function"&&(h=o,o=void 0),o?o=Array.from(o):o=[];let a=re(n);if(r?.(a,o),As(a)){if(typeof h=="function")throw new TypeError("callback not supported for sync tar functions");return s(a,o)}else if(Is(a)){let l=t(a,o),c=h||void 0;return c?l.then(()=>c(),c):l}else if(Cs(a)){if(typeof h=="function")throw new TypeError("callback not supported for sync tar functions");return e(a,o)}else if(Fs(a)){if(typeof h=="function")throw new TypeError("callback only supported with file option");return i(a,o)}else throw new Error("impossible options??")},{syncFile:s,asyncFile:t,syncNoFile:e,asyncNoFile:i,validate:r});import{EventEmitter as wn}from"events";import vi from"assert";import{Buffer as _t}from"buffer";import*as vs from"zlib";import Yr from"zlib";var Kr=Yr.constants||{ZLIB_VERNUM:4736},M=Object.freeze(Object.assign(Object.create(null),{Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_VERSION_ERROR:-6,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,DEFLATE:1,INFLATE:2,GZIP:3,GUNZIP:4,DEFLATERAW:5,INFLATERAW:6,UNZIP:7,BROTLI_DECODE:8,BROTLI_ENCODE:9,Z_MIN_WINDOWBITS:8,Z_MAX_WINDOWBITS:15,Z_DEFAULT_WINDOWBITS:15,Z_MIN_CHUNK:64,Z_MAX_CHUNK:1/0,Z_DEFAULT_CHUNK:16384,Z_MIN_MEMLEVEL:1,Z_MAX_MEMLEVEL:9,Z_DEFAULT_MEMLEVEL:8,Z_MIN_LEVEL:-1,Z_MAX_LEVEL:9,Z_DEFAULT_LEVEL:-1,BROTLI_OPERATION_PROCESS:0,BROTLI_OPERATION_FLUSH:1,BROTLI_OPERATION_FINISH:2,BROTLI_OPERATION_EMIT_METADATA:3,BROTLI_MODE_GENERIC:0,BROTLI_MODE_TEXT:1,BROTLI_MODE_FONT:2,BROTLI_DEFAULT_MODE:0,BROTLI_MIN_QUALITY:0,BROTLI_MAX_QUALITY:11,BROTLI_DEFAULT_QUALITY:11,BROTLI_MIN_WINDOW_BITS:10,BROTLI_MAX_WINDOW_BITS:24,BROTLI_LARGE_MAX_WINDOW_BITS:30,BROTLI_DEFAULT_WINDOW:22,BROTLI_MIN_INPUT_BLOCK_BITS:16,BROTLI_MAX_INPUT_BLOCK_BITS:24,BROTLI_PARAM_MODE:0,BROTLI_PARAM_QUALITY:1,BROTLI_PARAM_LGWIN:2,BROTLI_PARAM_LGBLOCK:3,BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING:4,BROTLI_PARAM_SIZE_HINT:5,BROTLI_PARAM_LARGE_WINDOW:6,BROTLI_PARAM_NPOSTFIX:7,BROTLI_PARAM_NDIRECT:8,BROTLI_DECODER_RESULT_ERROR:0,BROTLI_DECODER_RESULT_SUCCESS:1,BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT:2,BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION:0,BROTLI_DECODER_PARAM_LARGE_WINDOW:1,BROTLI_DECODER_NO_ERROR:0,BROTLI_DECODER_SUCCESS:1,BROTLI_DECODER_NEEDS_MORE_INPUT:2,BROTLI_DECODER_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE:-1,BROTLI_DECODER_ERROR_FORMAT_RESERVED:-2,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE:-3,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET:-4,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME:-5,BROTLI_DECODER_ERROR_FORMAT_CL_SPACE:-6,BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE:-7,BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT:-8,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1:-9,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2:-10,BROTLI_DECODER_ERROR_FORMAT_TRANSFORM:-11,BROTLI_DECODER_ERROR_FORMAT_DICTIONARY:-12,BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS:-13,BROTLI_DECODER_ERROR_FORMAT_PADDING_1:-14,BROTLI_DECODER_ERROR_FORMAT_PADDING_2:-15,BROTLI_DECODER_ERROR_FORMAT_DISTANCE:-16,BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET:-19,BROTLI_DECODER_ERROR_INVALID_ARGUMENTS:-20,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES:-21,BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS:-22,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP:-25,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1:-26,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2:-27,BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES:-30,BROTLI_DECODER_ERROR_UNREACHABLE:-31},Kr));var Vr=_t.concat,Ms=Object.getOwnPropertyDescriptor(_t,"concat"),$r=s=>s,Fi=Ms?.writable===!0||Ms?.set!==void 0?s=>{_t.concat=s?$r:Vr}:s=>{},Ot=Symbol("_superWrite"),Gt=class extends Error{code;errno;constructor(t,e){super("zlib: "+t.message,{cause:t}),this.code=t.code,this.errno=t.errno,this.code||(this.code="ZLIB_ERROR"),this.message="zlib: "+t.message,Error.captureStackTrace(this,e??this.constructor)}get name(){return"ZlibError"}},ki=Symbol("flushFlag"),ne=class extends A{#t=!1;#i=!1;#s;#n;#r;#e;#o;get sawError(){return this.#t}get handle(){return this.#e}get flushFlag(){return this.#s}constructor(t,e){if(!t||typeof t!="object")throw new TypeError("invalid options for ZlibBase constructor");if(super(t),this.#s=t.flush??0,this.#n=t.finishFlush??0,this.#r=t.fullFlushFlag??0,typeof vs[e]!="function")throw new TypeError("Compression method not supported: "+e);try{this.#e=new vs[e](t)}catch(i){throw new Gt(i,this.constructor)}this.#o=i=>{this.#t||(this.#t=!0,this.close(),this.emit("error",i))},this.#e?.on("error",i=>this.#o(new Gt(i))),this.once("end",()=>this.close)}close(){this.#e&&(this.#e.close(),this.#e=void 0,this.emit("close"))}reset(){if(!this.#t)return vi(this.#e,"zlib binding closed"),this.#e.reset?.()}flush(t){this.ended||(typeof t!="number"&&(t=this.#r),this.write(Object.assign(_t.alloc(0),{[ki]:t})))}end(t,e,i){return typeof t=="function"&&(i=t,e=void 0,t=void 0),typeof e=="function"&&(i=e,e=void 0),t&&(e?this.write(t,e):this.write(t)),this.flush(this.#n),this.#i=!0,super.end(i)}get ended(){return this.#i}[Ot](t){return super.write(t)}write(t,e,i){if(typeof e=="function"&&(i=e,e="utf8"),typeof t=="string"&&(t=_t.from(t,e)),this.#t)return;vi(this.#e,"zlib binding closed");let r=this.#e._handle,n=r.close;r.close=()=>{};let o=this.#e.close;this.#e.close=()=>{},Fi(!0);let h;try{let l=typeof t[ki]=="number"?t[ki]:this.#s;h=this.#e._processChunk(t,l),Fi(!1)}catch(l){Fi(!1),this.#o(new Gt(l,this.write))}finally{this.#e&&(this.#e._handle=r,r.close=n,this.#e.close=o,this.#e.removeAllListeners("error"))}this.#e&&this.#e.on("error",l=>this.#o(new Gt(l,this.write)));let a;if(h)if(Array.isArray(h)&&h.length>0){let l=h[0];a=this[Ot](_t.from(l));for(let c=1;c<h.length;c++)a=this[Ot](h[c])}else a=this[Ot](_t.from(h));return i&&i(),a}},Me=class extends ne{#t;#i;constructor(t,e){t=t||{},t.flush=t.flush||M.Z_NO_FLUSH,t.finishFlush=t.finishFlush||M.Z_FINISH,t.fullFlushFlag=M.Z_FULL_FLUSH,super(t,e),this.#t=t.level,this.#i=t.strategy}params(t,e){if(!this.sawError){if(!this.handle)throw new Error("cannot switch params when binding is closed");if(!this.handle.params)throw new Error("not supported in this implementation");if(this.#t!==t||this.#i!==e){this.flush(M.Z_SYNC_FLUSH),vi(this.handle,"zlib binding closed");let i=this.handle.flush;this.handle.flush=(r,n)=>{typeof r=="function"&&(n=r,r=this.flushFlag),this.flush(r),n?.()};try{this.handle.params(t,e)}finally{this.handle.flush=i}this.handle&&(this.#t=t,this.#i=e)}}}};var Be=class extends Me{#t;constructor(t){super(t,"Gzip"),this.#t=t&&!!t.portable}[Ot](t){return this.#t?(this.#t=!1,t[9]=255,super[Ot](t)):super[Ot](t)}};var Pe=class extends Me{constructor(t){super(t,"Unzip")}},ze=class extends ne{constructor(t,e){t=t||{},t.flush=t.flush||M.BROTLI_OPERATION_PROCESS,t.finishFlush=t.finishFlush||M.BROTLI_OPERATION_FINISH,t.fullFlushFlag=M.BROTLI_OPERATION_FLUSH,super(t,e)}},Ue=class extends ze{constructor(t){super(t,"BrotliCompress")}},He=class extends ze{constructor(t){super(t,"BrotliDecompress")}},We=class extends ne{constructor(t,e){t=t||{},t.flush=t.flush||M.ZSTD_e_continue,t.finishFlush=t.finishFlush||M.ZSTD_e_end,t.fullFlushFlag=M.ZSTD_e_flush,super(t,e)}},Ge=class extends We{constructor(t){super(t,"ZstdCompress")}},Ze=class extends We{constructor(t){super(t,"ZstdDecompress")}};import{posix as Zt}from"node:path";var Bs=(s,t)=>{if(Number.isSafeInteger(s))s<0?jr(s,t):qr(s,t);else throw Error("cannot encode number outside of javascript safe integer range");return t},qr=(s,t)=>{t[0]=128;for(var e=t.length;e>1;e--)t[e-1]=s&255,s=Math.floor(s/256)},jr=(s,t)=>{t[0]=255;var e=!1;s=s*-1;for(var i=t.length;i>1;i--){var r=s&255;s=Math.floor(s/256),e?t[i-1]=zs(r):r===0?t[i-1]=0:(e=!0,t[i-1]=Us(r))}},Ps=s=>{let t=s[0],e=t===128?Jr(s.subarray(1,s.length)):t===255?Qr(s):null;if(e===null)throw Error("invalid base256 encoding");if(!Number.isSafeInteger(e))throw Error("parsed number outside of javascript safe integer range");return e},Qr=s=>{for(var t=s.length,e=0,i=!1,r=t-1;r>-1;r--){var n=Number(s[r]),o;i?o=zs(n):n===0?o=n:(i=!0,o=Us(n)),o!==0&&(e-=o*Math.pow(256,t-r-1))}return e},Jr=s=>{for(var t=s.length,e=0,i=t-1;i>-1;i--){var r=Number(s[i]);r!==0&&(e+=r*Math.pow(256,t-i-1))}return e},zs=s=>(255^s)&255,Us=s=>(255^s)+1&255;var Mi={};Ar(Mi,{code:()=>Ye,isCode:()=>oe,isName:()=>en,name:()=>he});var oe=s=>he.has(s),en=s=>Ye.has(s),he=new Map([["0","File"],["","OldFile"],["1","Link"],["2","SymbolicLink"],["3","CharacterDevice"],["4","BlockDevice"],["5","Directory"],["6","FIFO"],["7","ContiguousFile"],["g","GlobalExtendedHeader"],["x","ExtendedHeader"],["A","SolarisACL"],["D","GNUDumpDir"],["I","Inode"],["K","NextFileHasLongLinkpath"],["L","NextFileHasLongPath"],["M","ContinuationFile"],["N","OldGnuLongPath"],["S","SparseFile"],["V","TapeVolumeHeader"],["X","OldExtendedHeader"]]),Ye=new Map(Array.from(he).map(s=>[s[1],s[0]]));var F=class{cksumValid=!1;needPax=!1;nullBlock=!1;block;path;mode;uid;gid;size;cksum;#t="Unsupported";linkpath;uname;gname;devmaj=0;devmin=0;atime;ctime;mtime;charset;comment;constructor(t,e=0,i,r){Buffer.isBuffer(t)?this.decode(t,e||0,i,r):t&&this.#i(t)}decode(t,e,i,r){if(e||(e=0),!t||!(t.length>=e+512))throw new Error("need 512 bytes for header");this.path=i?.path??Tt(t,e,100),this.mode=i?.mode??r?.mode??at(t,e+100,8),this.uid=i?.uid??r?.uid??at(t,e+108,8),this.gid=i?.gid??r?.gid??at(t,e+116,8),this.size=i?.size??r?.size??at(t,e+124,12),this.mtime=i?.mtime??r?.mtime??Bi(t,e+136,12),this.cksum=at(t,e+148,12),r&&this.#i(r,!0),i&&this.#i(i);let n=Tt(t,e+156,1);if(oe(n)&&(this.#t=n||"0"),this.#t==="0"&&this.path.slice(-1)==="/"&&(this.#t="5"),this.#t==="5"&&(this.size=0),this.linkpath=Tt(t,e+157,100),t.subarray(e+257,e+265).toString()==="ustar\x0000")if(this.uname=i?.uname??r?.uname??Tt(t,e+265,32),this.gname=i?.gname??r?.gname??Tt(t,e+297,32),this.devmaj=i?.devmaj??r?.devmaj??at(t,e+329,8)??0,this.devmin=i?.devmin??r?.devmin??at(t,e+337,8)??0,t[e+475]!==0){let h=Tt(t,e+345,155);this.path=h+"/"+this.path}else{let h=Tt(t,e+345,130);h&&(this.path=h+"/"+this.path),this.atime=i?.atime??r?.atime??Bi(t,e+476,12),this.ctime=i?.ctime??r?.ctime??Bi(t,e+488,12)}let o=256;for(let h=e;h<e+148;h++)o+=t[h];for(let h=e+156;h<e+512;h++)o+=t[h];this.cksumValid=o===this.cksum,this.cksum===void 0&&o===256&&(this.nullBlock=!0)}#i(t,e=!1){Object.assign(this,Object.fromEntries(Object.entries(t).filter(([i,r])=>!(r==null||i==="path"&&e||i==="linkpath"&&e||i==="global"))))}encode(t,e=0){if(t||(t=this.block=Buffer.alloc(512)),this.#t==="Unsupported"&&(this.#t="0"),!(t.length>=e+512))throw new Error("need 512 bytes for header");let i=this.ctime||this.atime?130:155,r=sn(this.path||"",i),n=r[0],o=r[1];this.needPax=!!r[2],this.needPax=xt(t,e,100,n)||this.needPax,this.needPax=lt(t,e+100,8,this.mode)||this.needPax,this.needPax=lt(t,e+108,8,this.uid)||this.needPax,this.needPax=lt(t,e+116,8,this.gid)||this.needPax,this.needPax=lt(t,e+124,12,this.size)||this.needPax,this.needPax=Pi(t,e+136,12,this.mtime)||this.needPax,t[e+156]=this.#t.charCodeAt(0),this.needPax=xt(t,e+157,100,this.linkpath)||this.needPax,t.write("ustar\x0000",e+257,8),this.needPax=xt(t,e+265,32,this.uname)||this.needPax,this.needPax=xt(t,e+297,32,this.gname)||this.needPax,this.needPax=lt(t,e+329,8,this.devmaj)||this.needPax,this.needPax=lt(t,e+337,8,this.devmin)||this.needPax,this.needPax=xt(t,e+345,i,o)||this.needPax,t[e+475]!==0?this.needPax=xt(t,e+345,155,o)||this.needPax:(this.needPax=xt(t,e+345,130,o)||this.needPax,this.needPax=Pi(t,e+476,12,this.atime)||this.needPax,this.needPax=Pi(t,e+488,12,this.ctime)||this.needPax);let h=256;for(let a=e;a<e+148;a++)h+=t[a];for(let a=e+156;a<e+512;a++)h+=t[a];return this.cksum=h,lt(t,e+148,8,this.cksum),this.cksumValid=!0,this.needPax}get type(){return this.#t==="Unsupported"?this.#t:he.get(this.#t)}get typeKey(){return this.#t}set type(t){let e=String(Ye.get(t));if(oe(e)||e==="Unsupported")this.#t=e;else if(oe(t))this.#t=t;else throw new TypeError("invalid entry type: "+t)}},sn=(s,t)=>{let i=s,r="",n,o=Zt.parse(s).root||".";if(Buffer.byteLength(i)<100)n=[i,r,!1];else{r=Zt.dirname(i),i=Zt.basename(i);do Buffer.byteLength(i)<=100&&Buffer.byteLength(r)<=t?n=[i,r,!1]:Buffer.byteLength(i)>100&&Buffer.byteLength(r)<=t?n=[i.slice(0,99),r,!0]:(i=Zt.join(Zt.basename(r),i),r=Zt.dirname(r));while(r!==o&&n===void 0);n||(n=[s.slice(0,99),"",!0])}return n},Tt=(s,t,e)=>s.subarray(t,t+e).toString("utf8").replace(/\0.*/,""),Bi=(s,t,e)=>rn(at(s,t,e)),rn=s=>s===void 0?void 0:new Date(s*1e3),at=(s,t,e)=>Number(s[t])&128?Ps(s.subarray(t,t+e)):on(s,t,e),nn=s=>isNaN(s)?void 0:s,on=(s,t,e)=>nn(parseInt(s.subarray(t,t+e).toString("utf8").replace(/\0.*$/,"").trim(),8)),hn={12:8589934591,8:2097151},lt=(s,t,e,i)=>i===void 0?!1:i>hn[e]||i<0?(Bs(i,s.subarray(t,t+e)),!0):(an(s,t,e,i),!1),an=(s,t,e,i)=>s.write(ln(i,e),t,e,"ascii"),ln=(s,t)=>cn(Math.floor(s).toString(8),t),cn=(s,t)=>(s.length===t-1?s:new Array(t-s.length-1).join("0")+s+" ")+"\0",Pi=(s,t,e,i)=>i===void 0?!1:lt(s,t,e,i.getTime()/1e3),fn=new Array(156).join("\0"),xt=(s,t,e,i)=>i===void 0?!1:(s.write(i+fn,t,e,"utf8"),i.length!==Buffer.byteLength(i)||i.length>e);import{basename as dn}from"node:path";var ct=class s{atime;mtime;ctime;charset;comment;gid;uid;gname;uname;linkpath;dev;ino;nlink;path;size;mode;global;constructor(t,e=!1){this.atime=t.atime,this.charset=t.charset,this.comment=t.comment,this.ctime=t.ctime,this.dev=t.dev,this.gid=t.gid,this.global=e,this.gname=t.gname,this.ino=t.ino,this.linkpath=t.linkpath,this.mtime=t.mtime,this.nlink=t.nlink,this.path=t.path,this.size=t.size,this.uid=t.uid,this.uname=t.uname}encode(){let t=this.encodeBody();if(t==="")return Buffer.allocUnsafe(0);let e=Buffer.byteLength(t),i=512*Math.ceil(1+e/512),r=Buffer.allocUnsafe(i);for(let n=0;n<512;n++)r[n]=0;new F({path:("PaxHeader/"+dn(this.path??"")).slice(0,99),mode:this.mode||420,uid:this.uid,gid:this.gid,size:e,mtime:this.mtime,type:this.global?"GlobalExtendedHeader":"ExtendedHeader",linkpath:"",uname:this.uname||"",gname:this.gname||"",devmaj:0,devmin:0,atime:this.atime,ctime:this.ctime}).encode(r),r.write(t,512,e,"utf8");for(let n=e+512;n<r.length;n++)r[n]=0;return r}encodeBody(){return this.encodeField("path")+this.encodeField("ctime")+this.encodeField("atime")+this.encodeField("dev")+this.encodeField("ino")+this.encodeField("nlink")+this.encodeField("charset")+this.encodeField("comment")+this.encodeField("gid")+this.encodeField("gname")+this.encodeField("linkpath")+this.encodeField("mtime")+this.encodeField("size")+this.encodeField("uid")+this.encodeField("uname")}encodeField(t){if(this[t]===void 0)return"";let e=this[t],i=e instanceof Date?e.getTime()/1e3:e,r=" "+(t==="dev"||t==="ino"||t==="nlink"?"SCHILY.":"")+t+"="+i+` +var Dr=Object.defineProperty;var Ar=(s,t)=>{for(var e in t)Dr(s,e,{get:t[e],enumerable:!0})};import Hr from"events";import I from"fs";import{EventEmitter as Oi}from"node:events";import Ds from"node:stream";import{StringDecoder as Ir}from"node:string_decoder";var Ts=typeof process=="object"&&process?process:{stdout:null,stderr:null},Cr=s=>!!s&&typeof s=="object"&&(s instanceof A||s instanceof Ds||Fr(s)||kr(s)),Fr=s=>!!s&&typeof s=="object"&&s instanceof Oi&&typeof s.pipe=="function"&&s.pipe!==Ds.Writable.prototype.pipe,kr=s=>!!s&&typeof s=="object"&&s instanceof Oi&&typeof s.write=="function"&&typeof s.end=="function",q=Symbol("EOF"),j=Symbol("maybeEmitEnd"),rt=Symbol("emittedEnd"),xe=Symbol("emittingEnd"),jt=Symbol("emittedError"),Le=Symbol("closed"),xs=Symbol("read"),Ne=Symbol("flush"),Ls=Symbol("flushChunk"),z=Symbol("encoding"),Mt=Symbol("decoder"),b=Symbol("flowing"),Qt=Symbol("paused"),Bt=Symbol("resume"),g=Symbol("buffer"),D=Symbol("pipes"),_=Symbol("bufferLength"),Si=Symbol("bufferPush"),De=Symbol("bufferShift"),L=Symbol("objectMode"),w=Symbol("destroyed"),yi=Symbol("error"),Ri=Symbol("emitData"),Ns=Symbol("emitEnd"),bi=Symbol("emitEnd2"),Z=Symbol("async"),gi=Symbol("abort"),Ae=Symbol("aborted"),Jt=Symbol("signal"),yt=Symbol("dataListeners"),C=Symbol("discarded"),te=s=>Promise.resolve().then(s),vr=s=>s(),Mr=s=>s==="end"||s==="finish"||s==="prefinish",Br=s=>s instanceof ArrayBuffer||!!s&&typeof s=="object"&&s.constructor&&s.constructor.name==="ArrayBuffer"&&s.byteLength>=0,Pr=s=>!Buffer.isBuffer(s)&&ArrayBuffer.isView(s),Ie=class{src;dest;opts;ondrain;constructor(t,e,i){this.src=t,this.dest=e,this.opts=i,this.ondrain=()=>t[Bt](),this.dest.on("drain",this.ondrain)}unpipe(){this.dest.removeListener("drain",this.ondrain)}proxyErrors(t){}end(){this.unpipe(),this.opts.end&&this.dest.end()}},_i=class extends Ie{unpipe(){this.src.removeListener("error",this.proxyErrors),super.unpipe()}constructor(t,e,i){super(t,e,i),this.proxyErrors=r=>this.dest.emit("error",r),t.on("error",this.proxyErrors)}},zr=s=>!!s.objectMode,Ur=s=>!s.objectMode&&!!s.encoding&&s.encoding!=="buffer",A=class extends Oi{[b]=!1;[Qt]=!1;[D]=[];[g]=[];[L];[z];[Z];[Mt];[q]=!1;[rt]=!1;[xe]=!1;[Le]=!1;[jt]=null;[_]=0;[w]=!1;[Jt];[Ae]=!1;[yt]=0;[C]=!1;writable=!0;readable=!0;constructor(...t){let e=t[0]||{};if(super(),e.objectMode&&typeof e.encoding=="string")throw new TypeError("Encoding and objectMode may not be used together");zr(e)?(this[L]=!0,this[z]=null):Ur(e)?(this[z]=e.encoding,this[L]=!1):(this[L]=!1,this[z]=null),this[Z]=!!e.async,this[Mt]=this[z]?new Ir(this[z]):null,e&&e.debugExposeBuffer===!0&&Object.defineProperty(this,"buffer",{get:()=>this[g]}),e&&e.debugExposePipes===!0&&Object.defineProperty(this,"pipes",{get:()=>this[D]});let{signal:i}=e;i&&(this[Jt]=i,i.aborted?this[gi]():i.addEventListener("abort",()=>this[gi]()))}get bufferLength(){return this[_]}get encoding(){return this[z]}set encoding(t){throw new Error("Encoding must be set at instantiation time")}setEncoding(t){throw new Error("Encoding must be set at instantiation time")}get objectMode(){return this[L]}set objectMode(t){throw new Error("objectMode must be set at instantiation time")}get async(){return this[Z]}set async(t){this[Z]=this[Z]||!!t}[gi](){this[Ae]=!0,this.emit("abort",this[Jt]?.reason),this.destroy(this[Jt]?.reason)}get aborted(){return this[Ae]}set aborted(t){}write(t,e,i){if(this[Ae])return!1;if(this[q])throw new Error("write after end");if(this[w])return this.emit("error",Object.assign(new Error("Cannot call write after a stream was destroyed"),{code:"ERR_STREAM_DESTROYED"})),!0;typeof e=="function"&&(i=e,e="utf8"),e||(e="utf8");let r=this[Z]?te:vr;if(!this[L]&&!Buffer.isBuffer(t)){if(Pr(t))t=Buffer.from(t.buffer,t.byteOffset,t.byteLength);else if(Br(t))t=Buffer.from(t);else if(typeof t!="string")throw new Error("Non-contiguous data written to non-objectMode stream")}return this[L]?(this[b]&&this[_]!==0&&this[Ne](!0),this[b]?this.emit("data",t):this[Si](t),this[_]!==0&&this.emit("readable"),i&&r(i),this[b]):t.length?(typeof t=="string"&&!(e===this[z]&&!this[Mt]?.lastNeed)&&(t=Buffer.from(t,e)),Buffer.isBuffer(t)&&this[z]&&(t=this[Mt].write(t)),this[b]&&this[_]!==0&&this[Ne](!0),this[b]?this.emit("data",t):this[Si](t),this[_]!==0&&this.emit("readable"),i&&r(i),this[b]):(this[_]!==0&&this.emit("readable"),i&&r(i),this[b])}read(t){if(this[w])return null;if(this[C]=!1,this[_]===0||t===0||t&&t>this[_])return this[j](),null;this[L]&&(t=null),this[g].length>1&&!this[L]&&(this[g]=[this[z]?this[g].join(""):Buffer.concat(this[g],this[_])]);let e=this[xs](t||null,this[g][0]);return this[j](),e}[xs](t,e){if(this[L])this[De]();else{let i=e;t===i.length||t===null?this[De]():typeof i=="string"?(this[g][0]=i.slice(t),e=i.slice(0,t),this[_]-=t):(this[g][0]=i.subarray(t),e=i.subarray(0,t),this[_]-=t)}return this.emit("data",e),!this[g].length&&!this[q]&&this.emit("drain"),e}end(t,e,i){return typeof t=="function"&&(i=t,t=void 0),typeof e=="function"&&(i=e,e="utf8"),t!==void 0&&this.write(t,e),i&&this.once("end",i),this[q]=!0,this.writable=!1,(this[b]||!this[Qt])&&this[j](),this}[Bt](){this[w]||(!this[yt]&&!this[D].length&&(this[C]=!0),this[Qt]=!1,this[b]=!0,this.emit("resume"),this[g].length?this[Ne]():this[q]?this[j]():this.emit("drain"))}resume(){return this[Bt]()}pause(){this[b]=!1,this[Qt]=!0,this[C]=!1}get destroyed(){return this[w]}get flowing(){return this[b]}get paused(){return this[Qt]}[Si](t){this[L]?this[_]+=1:this[_]+=t.length,this[g].push(t)}[De](){return this[L]?this[_]-=1:this[_]-=this[g][0].length,this[g].shift()}[Ne](t=!1){do;while(this[Ls](this[De]())&&this[g].length);!t&&!this[g].length&&!this[q]&&this.emit("drain")}[Ls](t){return this.emit("data",t),this[b]}pipe(t,e){if(this[w])return t;this[C]=!1;let i=this[rt];return e=e||{},t===Ts.stdout||t===Ts.stderr?e.end=!1:e.end=e.end!==!1,e.proxyErrors=!!e.proxyErrors,i?e.end&&t.end():(this[D].push(e.proxyErrors?new _i(this,t,e):new Ie(this,t,e)),this[Z]?te(()=>this[Bt]()):this[Bt]()),t}unpipe(t){let e=this[D].find(i=>i.dest===t);e&&(this[D].length===1?(this[b]&&this[yt]===0&&(this[b]=!1),this[D]=[]):this[D].splice(this[D].indexOf(e),1),e.unpipe())}addListener(t,e){return this.on(t,e)}on(t,e){let i=super.on(t,e);if(t==="data")this[C]=!1,this[yt]++,!this[D].length&&!this[b]&&this[Bt]();else if(t==="readable"&&this[_]!==0)super.emit("readable");else if(Mr(t)&&this[rt])super.emit(t),this.removeAllListeners(t);else if(t==="error"&&this[jt]){let r=e;this[Z]?te(()=>r.call(this,this[jt])):r.call(this,this[jt])}return i}removeListener(t,e){return this.off(t,e)}off(t,e){let i=super.off(t,e);return t==="data"&&(this[yt]=this.listeners("data").length,this[yt]===0&&!this[C]&&!this[D].length&&(this[b]=!1)),i}removeAllListeners(t){let e=super.removeAllListeners(t);return(t==="data"||t===void 0)&&(this[yt]=0,!this[C]&&!this[D].length&&(this[b]=!1)),e}get emittedEnd(){return this[rt]}[j](){!this[xe]&&!this[rt]&&!this[w]&&this[g].length===0&&this[q]&&(this[xe]=!0,this.emit("end"),this.emit("prefinish"),this.emit("finish"),this[Le]&&this.emit("close"),this[xe]=!1)}emit(t,...e){let i=e[0];if(t!=="error"&&t!=="close"&&t!==w&&this[w])return!1;if(t==="data")return!this[L]&&!i?!1:this[Z]?(te(()=>this[Ri](i)),!0):this[Ri](i);if(t==="end")return this[Ns]();if(t==="close"){if(this[Le]=!0,!this[rt]&&!this[w])return!1;let n=super.emit("close");return this.removeAllListeners("close"),n}else if(t==="error"){this[jt]=i,super.emit(yi,i);let n=!this[Jt]||this.listeners("error").length?super.emit("error",i):!1;return this[j](),n}else if(t==="resume"){let n=super.emit("resume");return this[j](),n}else if(t==="finish"||t==="prefinish"){let n=super.emit(t);return this.removeAllListeners(t),n}let r=super.emit(t,...e);return this[j](),r}[Ri](t){for(let i of this[D])i.dest.write(t)===!1&&this.pause();let e=this[C]?!1:super.emit("data",t);return this[j](),e}[Ns](){return this[rt]?!1:(this[rt]=!0,this.readable=!1,this[Z]?(te(()=>this[bi]()),!0):this[bi]())}[bi](){if(this[Mt]){let e=this[Mt].end();if(e){for(let i of this[D])i.dest.write(e);this[C]||super.emit("data",e)}}for(let e of this[D])e.end();let t=super.emit("end");return this.removeAllListeners("end"),t}async collect(){let t=Object.assign([],{dataLength:0});this[L]||(t.dataLength=0);let e=this.promise();return this.on("data",i=>{t.push(i),this[L]||(t.dataLength+=i.length)}),await e,t}async concat(){if(this[L])throw new Error("cannot concat in objectMode");let t=await this.collect();return this[z]?t.join(""):Buffer.concat(t,t.dataLength)}async promise(){return new Promise((t,e)=>{this.on(w,()=>e(new Error("stream destroyed"))),this.on("error",i=>e(i)),this.on("end",()=>t())})}[Symbol.asyncIterator](){this[C]=!1;let t=!1,e=async()=>(this.pause(),t=!0,{value:void 0,done:!0});return{next:()=>{if(t)return e();let r=this.read();if(r!==null)return Promise.resolve({done:!1,value:r});if(this[q])return e();let n,o,h=d=>{this.off("data",a),this.off("end",l),this.off(w,c),e(),o(d)},a=d=>{this.off("error",h),this.off("end",l),this.off(w,c),this.pause(),n({value:d,done:!!this[q]})},l=()=>{this.off("error",h),this.off("data",a),this.off(w,c),e(),n({done:!0,value:void 0})},c=()=>h(new Error("stream destroyed"));return new Promise((d,S)=>{o=S,n=d,this.once(w,c),this.once("error",h),this.once("end",l),this.once("data",a)})},throw:e,return:e,[Symbol.asyncIterator](){return this},[Symbol.asyncDispose]:async()=>{}}}[Symbol.iterator](){this[C]=!1;let t=!1,e=()=>(this.pause(),this.off(yi,e),this.off(w,e),this.off("end",e),t=!0,{done:!0,value:void 0}),i=()=>{if(t)return e();let r=this.read();return r===null?e():{done:!1,value:r}};return this.once("end",e),this.once(yi,e),this.once(w,e),{next:i,throw:e,return:e,[Symbol.iterator](){return this},[Symbol.dispose]:()=>{}}}destroy(t){if(this[w])return t?this.emit("error",t):this.emit(w),this;this[w]=!0,this[C]=!0,this[g].length=0,this[_]=0;let e=this;return typeof e.close=="function"&&!this[Le]&&e.close(),t?this.emit("error",t):this.emit(w),this}static get isStream(){return Cr}};var Wr=I.writev,ot=Symbol("_autoClose"),H=Symbol("_close"),ee=Symbol("_ended"),m=Symbol("_fd"),Ti=Symbol("_finished"),J=Symbol("_flags"),xi=Symbol("_flush"),Ai=Symbol("_handleChunk"),Ii=Symbol("_makeBuf"),se=Symbol("_mode"),Ce=Symbol("_needDrain"),Ut=Symbol("_onerror"),Ht=Symbol("_onopen"),Li=Symbol("_onread"),Pt=Symbol("_onwrite"),ht=Symbol("_open"),U=Symbol("_path"),nt=Symbol("_pos"),Y=Symbol("_queue"),zt=Symbol("_read"),Ni=Symbol("_readSize"),Q=Symbol("_reading"),ie=Symbol("_remain"),Di=Symbol("_size"),Fe=Symbol("_write"),Rt=Symbol("_writing"),ke=Symbol("_defaultFlag"),bt=Symbol("_errored"),gt=class extends A{[bt]=!1;[m];[U];[Ni];[Q]=!1;[Di];[ie];[ot];constructor(t,e){if(e=e||{},super(e),this.readable=!0,this.writable=!1,typeof t!="string")throw new TypeError("path must be a string");this[bt]=!1,this[m]=typeof e.fd=="number"?e.fd:void 0,this[U]=t,this[Ni]=e.readSize||16*1024*1024,this[Q]=!1,this[Di]=typeof e.size=="number"?e.size:1/0,this[ie]=this[Di],this[ot]=typeof e.autoClose=="boolean"?e.autoClose:!0,typeof this[m]=="number"?this[zt]():this[ht]()}get fd(){return this[m]}get path(){return this[U]}write(){throw new TypeError("this is a readable stream")}end(){throw new TypeError("this is a readable stream")}[ht](){I.open(this[U],"r",(t,e)=>this[Ht](t,e))}[Ht](t,e){t?this[Ut](t):(this[m]=e,this.emit("open",e),this[zt]())}[Ii](){return Buffer.allocUnsafe(Math.min(this[Ni],this[ie]))}[zt](){if(!this[Q]){this[Q]=!0;let t=this[Ii]();if(t.length===0)return process.nextTick(()=>this[Li](null,0,t));I.read(this[m],t,0,t.length,null,(e,i,r)=>this[Li](e,i,r))}}[Li](t,e,i){this[Q]=!1,t?this[Ut](t):this[Ai](e,i)&&this[zt]()}[H](){if(this[ot]&&typeof this[m]=="number"){let t=this[m];this[m]=void 0,I.close(t,e=>e?this.emit("error",e):this.emit("close"))}}[Ut](t){this[Q]=!0,this[H](),this.emit("error",t)}[Ai](t,e){let i=!1;return this[ie]-=t,t>0&&(i=super.write(t<e.length?e.subarray(0,t):e)),(t===0||this[ie]<=0)&&(i=!1,this[H](),super.end()),i}emit(t,...e){switch(t){case"prefinish":case"finish":return!1;case"drain":return typeof this[m]=="number"&&this[zt](),!1;case"error":return this[bt]?!1:(this[bt]=!0,super.emit(t,...e));default:return super.emit(t,...e)}}},ve=class extends gt{[ht](){let t=!0;try{this[Ht](null,I.openSync(this[U],"r")),t=!1}finally{t&&this[H]()}}[zt](){let t=!0;try{if(!this[Q]){this[Q]=!0;do{let e=this[Ii](),i=e.length===0?0:I.readSync(this[m],e,0,e.length,null);if(!this[Ai](i,e))break}while(!0);this[Q]=!1}t=!1}finally{t&&this[H]()}}[H](){if(this[ot]&&typeof this[m]=="number"){let t=this[m];this[m]=void 0,I.closeSync(t),this.emit("close")}}},tt=class extends Hr{readable=!1;writable=!0;[bt]=!1;[Rt]=!1;[ee]=!1;[Y]=[];[Ce]=!1;[U];[se];[ot];[m];[ke];[J];[Ti]=!1;[nt];constructor(t,e){e=e||{},super(e),this[U]=t,this[m]=typeof e.fd=="number"?e.fd:void 0,this[se]=e.mode===void 0?438:e.mode,this[nt]=typeof e.start=="number"?e.start:void 0,this[ot]=typeof e.autoClose=="boolean"?e.autoClose:!0;let i=this[nt]!==void 0?"r+":"w";this[ke]=e.flags===void 0,this[J]=e.flags===void 0?i:e.flags,this[m]===void 0&&this[ht]()}emit(t,...e){if(t==="error"){if(this[bt])return!1;this[bt]=!0}return super.emit(t,...e)}get fd(){return this[m]}get path(){return this[U]}[Ut](t){this[H](),this[Rt]=!0,this.emit("error",t)}[ht](){I.open(this[U],this[J],this[se],(t,e)=>this[Ht](t,e))}[Ht](t,e){this[ke]&&this[J]==="r+"&&t&&t.code==="ENOENT"?(this[J]="w",this[ht]()):t?this[Ut](t):(this[m]=e,this.emit("open",e),this[Rt]||this[xi]())}end(t,e){return t&&this.write(t,e),this[ee]=!0,!this[Rt]&&!this[Y].length&&typeof this[m]=="number"&&this[Pt](null,0),this}write(t,e){return typeof t=="string"&&(t=Buffer.from(t,e)),this[ee]?(this.emit("error",new Error("write() after end()")),!1):this[m]===void 0||this[Rt]||this[Y].length?(this[Y].push(t),this[Ce]=!0,!1):(this[Rt]=!0,this[Fe](t),!0)}[Fe](t){I.write(this[m],t,0,t.length,this[nt],(e,i)=>this[Pt](e,i))}[Pt](t,e){t?this[Ut](t):(this[nt]!==void 0&&typeof e=="number"&&(this[nt]+=e),this[Y].length?this[xi]():(this[Rt]=!1,this[ee]&&!this[Ti]?(this[Ti]=!0,this[H](),this.emit("finish")):this[Ce]&&(this[Ce]=!1,this.emit("drain"))))}[xi](){if(this[Y].length===0)this[ee]&&this[Pt](null,0);else if(this[Y].length===1)this[Fe](this[Y].pop());else{let t=this[Y];this[Y]=[],Wr(this[m],t,this[nt],(e,i)=>this[Pt](e,i))}}[H](){if(this[ot]&&typeof this[m]=="number"){let t=this[m];this[m]=void 0,I.close(t,e=>e?this.emit("error",e):this.emit("close"))}}},Wt=class extends tt{[ht](){let t;if(this[ke]&&this[J]==="r+")try{t=I.openSync(this[U],this[J],this[se])}catch(e){if(e?.code==="ENOENT")return this[J]="w",this[ht]();throw e}else t=I.openSync(this[U],this[J],this[se]);this[Ht](null,t)}[H](){if(this[ot]&&typeof this[m]=="number"){let t=this[m];this[m]=void 0,I.closeSync(t),this.emit("close")}}[Fe](t){let e=!0;try{this[Pt](null,I.writeSync(this[m],t,0,t.length,this[nt])),e=!1}finally{if(e)try{this[H]()}catch{}}}};import or from"node:path";import Vt from"node:fs";import{dirname as bn,parse as gn}from"path";var Gr=new Map([["C","cwd"],["f","file"],["z","gzip"],["P","preservePaths"],["U","unlink"],["strip-components","strip"],["stripComponents","strip"],["keep-newer","newer"],["keepNewer","newer"],["keep-newer-files","newer"],["keepNewerFiles","newer"],["k","keep"],["keep-existing","keep"],["keepExisting","keep"],["m","noMtime"],["no-mtime","noMtime"],["p","preserveOwner"],["L","follow"],["h","follow"],["onentry","onReadEntry"]]),As=s=>!!s.sync&&!!s.file,Is=s=>!s.sync&&!!s.file,Cs=s=>!!s.sync&&!s.file,Fs=s=>!s.sync&&!s.file;var ks=s=>!!s.file;var Zr=s=>{let t=Gr.get(s);return t||s},re=(s={})=>{if(!s)return{};let t={};for(let[e,i]of Object.entries(s)){let r=Zr(e);t[r]=i}return t.chmod===void 0&&t.noChmod===!1&&(t.chmod=!0),delete t.noChmod,t};var K=(s,t,e,i,r)=>Object.assign((n=[],o,h)=>{Array.isArray(n)&&(o=n,n={}),typeof o=="function"&&(h=o,o=void 0),o?o=Array.from(o):o=[];let a=re(n);if(r?.(a,o),As(a)){if(typeof h=="function")throw new TypeError("callback not supported for sync tar functions");return s(a,o)}else if(Is(a)){let l=t(a,o),c=h||void 0;return c?l.then(()=>c(),c):l}else if(Cs(a)){if(typeof h=="function")throw new TypeError("callback not supported for sync tar functions");return e(a,o)}else if(Fs(a)){if(typeof h=="function")throw new TypeError("callback only supported with file option");return i(a,o)}else throw new Error("impossible options??")},{syncFile:s,asyncFile:t,syncNoFile:e,asyncNoFile:i,validate:r});import{EventEmitter as wn}from"events";import vi from"assert";import{Buffer as _t}from"buffer";import*as vs from"zlib";import Yr from"zlib";var Kr=Yr.constants||{ZLIB_VERNUM:4736},M=Object.freeze(Object.assign(Object.create(null),{Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_VERSION_ERROR:-6,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,DEFLATE:1,INFLATE:2,GZIP:3,GUNZIP:4,DEFLATERAW:5,INFLATERAW:6,UNZIP:7,BROTLI_DECODE:8,BROTLI_ENCODE:9,Z_MIN_WINDOWBITS:8,Z_MAX_WINDOWBITS:15,Z_DEFAULT_WINDOWBITS:15,Z_MIN_CHUNK:64,Z_MAX_CHUNK:1/0,Z_DEFAULT_CHUNK:16384,Z_MIN_MEMLEVEL:1,Z_MAX_MEMLEVEL:9,Z_DEFAULT_MEMLEVEL:8,Z_MIN_LEVEL:-1,Z_MAX_LEVEL:9,Z_DEFAULT_LEVEL:-1,BROTLI_OPERATION_PROCESS:0,BROTLI_OPERATION_FLUSH:1,BROTLI_OPERATION_FINISH:2,BROTLI_OPERATION_EMIT_METADATA:3,BROTLI_MODE_GENERIC:0,BROTLI_MODE_TEXT:1,BROTLI_MODE_FONT:2,BROTLI_DEFAULT_MODE:0,BROTLI_MIN_QUALITY:0,BROTLI_MAX_QUALITY:11,BROTLI_DEFAULT_QUALITY:11,BROTLI_MIN_WINDOW_BITS:10,BROTLI_MAX_WINDOW_BITS:24,BROTLI_LARGE_MAX_WINDOW_BITS:30,BROTLI_DEFAULT_WINDOW:22,BROTLI_MIN_INPUT_BLOCK_BITS:16,BROTLI_MAX_INPUT_BLOCK_BITS:24,BROTLI_PARAM_MODE:0,BROTLI_PARAM_QUALITY:1,BROTLI_PARAM_LGWIN:2,BROTLI_PARAM_LGBLOCK:3,BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING:4,BROTLI_PARAM_SIZE_HINT:5,BROTLI_PARAM_LARGE_WINDOW:6,BROTLI_PARAM_NPOSTFIX:7,BROTLI_PARAM_NDIRECT:8,BROTLI_DECODER_RESULT_ERROR:0,BROTLI_DECODER_RESULT_SUCCESS:1,BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT:2,BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION:0,BROTLI_DECODER_PARAM_LARGE_WINDOW:1,BROTLI_DECODER_NO_ERROR:0,BROTLI_DECODER_SUCCESS:1,BROTLI_DECODER_NEEDS_MORE_INPUT:2,BROTLI_DECODER_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE:-1,BROTLI_DECODER_ERROR_FORMAT_RESERVED:-2,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE:-3,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET:-4,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME:-5,BROTLI_DECODER_ERROR_FORMAT_CL_SPACE:-6,BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE:-7,BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT:-8,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1:-9,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2:-10,BROTLI_DECODER_ERROR_FORMAT_TRANSFORM:-11,BROTLI_DECODER_ERROR_FORMAT_DICTIONARY:-12,BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS:-13,BROTLI_DECODER_ERROR_FORMAT_PADDING_1:-14,BROTLI_DECODER_ERROR_FORMAT_PADDING_2:-15,BROTLI_DECODER_ERROR_FORMAT_DISTANCE:-16,BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET:-19,BROTLI_DECODER_ERROR_INVALID_ARGUMENTS:-20,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES:-21,BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS:-22,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP:-25,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1:-26,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2:-27,BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES:-30,BROTLI_DECODER_ERROR_UNREACHABLE:-31},Kr));var Vr=_t.concat,Ms=Object.getOwnPropertyDescriptor(_t,"concat"),$r=s=>s,Fi=Ms?.writable===!0||Ms?.set!==void 0?s=>{_t.concat=s?$r:Vr}:s=>{},Ot=Symbol("_superWrite"),Gt=class extends Error{code;errno;constructor(t,e){super("zlib: "+t.message,{cause:t}),this.code=t.code,this.errno=t.errno,this.code||(this.code="ZLIB_ERROR"),this.message="zlib: "+t.message,Error.captureStackTrace(this,e??this.constructor)}get name(){return"ZlibError"}},ki=Symbol("flushFlag"),ne=class extends A{#t=!1;#i=!1;#s;#n;#r;#e;#o;get sawError(){return this.#t}get handle(){return this.#e}get flushFlag(){return this.#s}constructor(t,e){if(!t||typeof t!="object")throw new TypeError("invalid options for ZlibBase constructor");if(super(t),this.#s=t.flush??0,this.#n=t.finishFlush??0,this.#r=t.fullFlushFlag??0,typeof vs[e]!="function")throw new TypeError("Compression method not supported: "+e);try{this.#e=new vs[e](t)}catch(i){throw new Gt(i,this.constructor)}this.#o=i=>{this.#t||(this.#t=!0,this.close(),this.emit("error",i))},this.#e?.on("error",i=>this.#o(new Gt(i))),this.once("end",()=>this.close)}close(){this.#e&&(this.#e.close(),this.#e=void 0,this.emit("close"))}reset(){if(!this.#t)return vi(this.#e,"zlib binding closed"),this.#e.reset?.()}flush(t){this.ended||(typeof t!="number"&&(t=this.#r),this.write(Object.assign(_t.alloc(0),{[ki]:t})))}end(t,e,i){return typeof t=="function"&&(i=t,e=void 0,t=void 0),typeof e=="function"&&(i=e,e=void 0),t&&(e?this.write(t,e):this.write(t)),this.flush(this.#n),this.#i=!0,super.end(i)}get ended(){return this.#i}[Ot](t){return super.write(t)}write(t,e,i){if(typeof e=="function"&&(i=e,e="utf8"),typeof t=="string"&&(t=_t.from(t,e)),this.#t)return;vi(this.#e,"zlib binding closed");let r=this.#e._handle,n=r.close;r.close=()=>{};let o=this.#e.close;this.#e.close=()=>{},Fi(!0);let h;try{let l=typeof t[ki]=="number"?t[ki]:this.#s;h=this.#e._processChunk(t,l),Fi(!1)}catch(l){Fi(!1),this.#o(new Gt(l,this.write))}finally{this.#e&&(this.#e._handle=r,r.close=n,this.#e.close=o,this.#e.removeAllListeners("error"))}this.#e&&this.#e.on("error",l=>this.#o(new Gt(l,this.write)));let a;if(h)if(Array.isArray(h)&&h.length>0){let l=h[0];a=this[Ot](_t.from(l));for(let c=1;c<h.length;c++)a=this[Ot](h[c])}else a=this[Ot](_t.from(h));return i&&i(),a}},Me=class extends ne{#t;#i;constructor(t,e){t=t||{},t.flush=t.flush||M.Z_NO_FLUSH,t.finishFlush=t.finishFlush||M.Z_FINISH,t.fullFlushFlag=M.Z_FULL_FLUSH,super(t,e),this.#t=t.level,this.#i=t.strategy}params(t,e){if(!this.sawError){if(!this.handle)throw new Error("cannot switch params when binding is closed");if(!this.handle.params)throw new Error("not supported in this implementation");if(this.#t!==t||this.#i!==e){this.flush(M.Z_SYNC_FLUSH),vi(this.handle,"zlib binding closed");let i=this.handle.flush;this.handle.flush=(r,n)=>{typeof r=="function"&&(n=r,r=this.flushFlag),this.flush(r),n?.()};try{this.handle.params(t,e)}finally{this.handle.flush=i}this.handle&&(this.#t=t,this.#i=e)}}}};var Be=class extends Me{#t;constructor(t){super(t,"Gzip"),this.#t=t&&!!t.portable}[Ot](t){return this.#t?(this.#t=!1,t[9]=255,super[Ot](t)):super[Ot](t)}};var Pe=class extends Me{constructor(t){super(t,"Unzip")}},ze=class extends ne{constructor(t,e){t=t||{},t.flush=t.flush||M.BROTLI_OPERATION_PROCESS,t.finishFlush=t.finishFlush||M.BROTLI_OPERATION_FINISH,t.fullFlushFlag=M.BROTLI_OPERATION_FLUSH,super(t,e)}},Ue=class extends ze{constructor(t){super(t,"BrotliCompress")}},He=class extends ze{constructor(t){super(t,"BrotliDecompress")}},We=class extends ne{constructor(t,e){t=t||{},t.flush=t.flush||M.ZSTD_e_continue,t.finishFlush=t.finishFlush||M.ZSTD_e_end,t.fullFlushFlag=M.ZSTD_e_flush,super(t,e)}},Ge=class extends We{constructor(t){super(t,"ZstdCompress")}},Ze=class extends We{constructor(t){super(t,"ZstdDecompress")}};import{posix as Zt}from"node:path";var Bs=(s,t)=>{if(Number.isSafeInteger(s))s<0?jr(s,t):qr(s,t);else throw Error("cannot encode number outside of javascript safe integer range");return t},qr=(s,t)=>{t[0]=128;for(var e=t.length;e>1;e--)t[e-1]=s&255,s=Math.floor(s/256)},jr=(s,t)=>{t[0]=255;var e=!1;s=s*-1;for(var i=t.length;i>1;i--){var r=s&255;s=Math.floor(s/256),e?t[i-1]=zs(r):r===0?t[i-1]=0:(e=!0,t[i-1]=Us(r))}},Ps=s=>{let t=s[0],e=t===128?Jr(s.subarray(1,s.length)):t===255?Qr(s):null;if(e===null)throw Error("invalid base256 encoding");if(!Number.isSafeInteger(e))throw Error("parsed number outside of javascript safe integer range");return e},Qr=s=>{for(var t=s.length,e=0,i=!1,r=t-1;r>-1;r--){var n=Number(s[r]),o;i?o=zs(n):n===0?o=n:(i=!0,o=Us(n)),o!==0&&(e-=o*Math.pow(256,t-r-1))}return e},Jr=s=>{for(var t=s.length,e=0,i=t-1;i>-1;i--){var r=Number(s[i]);r!==0&&(e+=r*Math.pow(256,t-i-1))}return e},zs=s=>(255^s)&255,Us=s=>(255^s)+1&255;var Mi={};Ar(Mi,{code:()=>Ye,isCode:()=>oe,isName:()=>en,name:()=>he});var oe=s=>he.has(s),en=s=>Ye.has(s),he=new Map([["0","File"],["","OldFile"],["1","Link"],["2","SymbolicLink"],["3","CharacterDevice"],["4","BlockDevice"],["5","Directory"],["6","FIFO"],["7","ContiguousFile"],["g","GlobalExtendedHeader"],["x","ExtendedHeader"],["A","SolarisACL"],["D","GNUDumpDir"],["I","Inode"],["K","NextFileHasLongLinkpath"],["L","NextFileHasLongPath"],["M","ContinuationFile"],["N","OldGnuLongPath"],["S","SparseFile"],["V","TapeVolumeHeader"],["X","OldExtendedHeader"]]),Ye=new Map(Array.from(he).map(s=>[s[1],s[0]]));var F=class{cksumValid=!1;needPax=!1;nullBlock=!1;block;path;mode;uid;gid;size;cksum;#t="Unsupported";linkpath;uname;gname;devmaj=0;devmin=0;atime;ctime;mtime;charset;comment;constructor(t,e=0,i,r){Buffer.isBuffer(t)?this.decode(t,e||0,i,r):t&&this.#i(t)}decode(t,e,i,r){if(e||(e=0),!t||!(t.length>=e+512))throw new Error("need 512 bytes for header");this.path=i?.path??Tt(t,e,100),this.mode=i?.mode??r?.mode??at(t,e+100,8),this.uid=i?.uid??r?.uid??at(t,e+108,8),this.gid=i?.gid??r?.gid??at(t,e+116,8),this.size=i?.size??r?.size??at(t,e+124,12),this.mtime=i?.mtime??r?.mtime??Bi(t,e+136,12),this.cksum=at(t,e+148,12),r&&this.#i(r,!0),i&&this.#i(i);let n=Tt(t,e+156,1);if(oe(n)&&(this.#t=n||"0"),this.#t==="0"&&this.path.slice(-1)==="/"&&(this.#t="5"),this.#t==="5"&&(this.size=0),this.linkpath=Tt(t,e+157,100),t.subarray(e+257,e+265).toString()==="ustar\x0000")if(this.uname=i?.uname??r?.uname??Tt(t,e+265,32),this.gname=i?.gname??r?.gname??Tt(t,e+297,32),this.devmaj=i?.devmaj??r?.devmaj??at(t,e+329,8)??0,this.devmin=i?.devmin??r?.devmin??at(t,e+337,8)??0,t[e+475]!==0){let h=Tt(t,e+345,155);this.path=h+"/"+this.path}else{let h=Tt(t,e+345,130);h&&(this.path=h+"/"+this.path),this.atime=i?.atime??r?.atime??Bi(t,e+476,12),this.ctime=i?.ctime??r?.ctime??Bi(t,e+488,12)}let o=256;for(let h=e;h<e+148;h++)o+=t[h];for(let h=e+156;h<e+512;h++)o+=t[h];this.cksumValid=o===this.cksum,this.cksum===void 0&&o===256&&(this.nullBlock=!0)}#i(t,e=!1){Object.assign(this,Object.fromEntries(Object.entries(t).filter(([i,r])=>!(r==null||i==="path"&&e||i==="linkpath"&&e||i==="global"))))}encode(t,e=0){if(t||(t=this.block=Buffer.alloc(512)),this.#t==="Unsupported"&&(this.#t="0"),!(t.length>=e+512))throw new Error("need 512 bytes for header");let i=this.ctime||this.atime?130:155,r=sn(this.path||"",i),n=r[0],o=r[1];this.needPax=!!r[2],this.needPax=xt(t,e,100,n)||this.needPax,this.needPax=lt(t,e+100,8,this.mode)||this.needPax,this.needPax=lt(t,e+108,8,this.uid)||this.needPax,this.needPax=lt(t,e+116,8,this.gid)||this.needPax,this.needPax=lt(t,e+124,12,this.size)||this.needPax,this.needPax=Pi(t,e+136,12,this.mtime)||this.needPax,t[e+156]=this.#t.charCodeAt(0),this.needPax=xt(t,e+157,100,this.linkpath)||this.needPax,t.write("ustar\x0000",e+257,8),this.needPax=xt(t,e+265,32,this.uname)||this.needPax,this.needPax=xt(t,e+297,32,this.gname)||this.needPax,this.needPax=lt(t,e+329,8,this.devmaj)||this.needPax,this.needPax=lt(t,e+337,8,this.devmin)||this.needPax,this.needPax=xt(t,e+345,i,o)||this.needPax,t[e+475]!==0?this.needPax=xt(t,e+345,155,o)||this.needPax:(this.needPax=xt(t,e+345,130,o)||this.needPax,this.needPax=Pi(t,e+476,12,this.atime)||this.needPax,this.needPax=Pi(t,e+488,12,this.ctime)||this.needPax);let h=256;for(let a=e;a<e+148;a++)h+=t[a];for(let a=e+156;a<e+512;a++)h+=t[a];return this.cksum=h,lt(t,e+148,8,this.cksum),this.cksumValid=!0,this.needPax}get type(){return this.#t==="Unsupported"?this.#t:he.get(this.#t)}get typeKey(){return this.#t}set type(t){let e=String(Ye.get(t));if(oe(e)||e==="Unsupported")this.#t=e;else if(oe(t))this.#t=t;else throw new TypeError("invalid entry type: "+t)}},sn=(s,t)=>{let i=s,r="",n,o=Zt.parse(s).root||".";if(Buffer.byteLength(i)<100)n=[i,r,!1];else{r=Zt.dirname(i),i=Zt.basename(i);do Buffer.byteLength(i)<=100&&Buffer.byteLength(r)<=t?n=[i,r,!1]:Buffer.byteLength(i)>100&&Buffer.byteLength(r)<=t?n=[i.slice(0,99),r,!0]:(i=Zt.join(Zt.basename(r),i),r=Zt.dirname(r));while(r!==o&&n===void 0);n||(n=[s.slice(0,99),"",!0])}return n},Tt=(s,t,e)=>s.subarray(t,t+e).toString("utf8").replace(/\0.*/,""),Bi=(s,t,e)=>rn(at(s,t,e)),rn=s=>s===void 0?void 0:new Date(s*1e3),at=(s,t,e)=>Number(s[t])&128?Ps(s.subarray(t,t+e)):on(s,t,e),nn=s=>isNaN(s)?void 0:s,on=(s,t,e)=>nn(parseInt(s.subarray(t,t+e).toString("utf8").replace(/\0.*$/,"").trim(),8)),hn={12:8589934591,8:2097151},lt=(s,t,e,i)=>i===void 0?!1:i>hn[e]||i<0?(Bs(i,s.subarray(t,t+e)),!0):(an(s,t,e,i),!1),an=(s,t,e,i)=>s.write(ln(i,e),t,e,"ascii"),ln=(s,t)=>cn(Math.floor(s).toString(8),t),cn=(s,t)=>(s.length===t-1?s:new Array(t-s.length-1).join("0")+s+" ")+"\0",Pi=(s,t,e,i)=>i===void 0?!1:lt(s,t,e,i.getTime()/1e3),fn=new Array(156).join("\0"),xt=(s,t,e,i)=>i===void 0?!1:(s.write(i+fn,t,e,"utf8"),i.length!==Buffer.byteLength(i)||i.length>e);import{basename as dn}from"node:path";var ct=class s{atime;mtime;ctime;charset;comment;gid;uid;gname;uname;linkpath;dev;ino;nlink;path;size;mode;global;constructor(t,e=!1){this.atime=t.atime,this.charset=t.charset,this.comment=t.comment,this.ctime=t.ctime,this.dev=t.dev,this.gid=t.gid,this.global=e,this.gname=t.gname,this.ino=t.ino,this.linkpath=t.linkpath,this.mtime=t.mtime,this.nlink=t.nlink,this.path=t.path,this.size=t.size,this.uid=t.uid,this.uname=t.uname}encode(){let t=this.encodeBody();if(t==="")return Buffer.allocUnsafe(0);let e=Buffer.byteLength(t),i=512*Math.ceil(1+e/512),r=Buffer.allocUnsafe(i);for(let n=0;n<512;n++)r[n]=0;new F({path:("PaxHeader/"+dn(this.path??"")).slice(0,99),mode:this.mode||420,uid:this.uid,gid:this.gid,size:e,mtime:this.mtime,type:this.global?"GlobalExtendedHeader":"ExtendedHeader",linkpath:"",uname:this.uname||"",gname:this.gname||"",devmaj:0,devmin:0,atime:this.atime,ctime:this.ctime}).encode(r),r.write(t,512,e,"utf8");for(let n=e+512;n<r.length;n++)r[n]=0;return r}encodeBody(){return this.encodeField("path")+this.encodeField("ctime")+this.encodeField("atime")+this.encodeField("dev")+this.encodeField("ino")+this.encodeField("nlink")+this.encodeField("charset")+this.encodeField("comment")+this.encodeField("gid")+this.encodeField("gname")+this.encodeField("linkpath")+this.encodeField("mtime")+this.encodeField("size")+this.encodeField("uid")+this.encodeField("uname")}encodeField(t){if(this[t]===void 0)return"";let e=this[t],i=e instanceof Date?e.getTime()/1e3:e,r=" "+(t==="dev"||t==="ino"||t==="nlink"?"SCHILY.":"")+t+"="+i+` `,n=Buffer.byteLength(r),o=Math.floor(Math.log(n)/Math.log(10))+1;return n+o>=Math.pow(10,o)&&(o+=1),o+n+r}static parse(t,e,i=!1){return new s(un(mn(t),e),i)}},un=(s,t)=>t?Object.assign({},t,s):s,mn=s=>s.replace(/\n$/,"").split(` -`).reduce(pn,Object.create(null)),pn=(s,t)=>{let e=parseInt(t,10);if(e!==Buffer.byteLength(t)+1)return s;t=t.slice((e+" ").length);let i=t.split("="),r=i.shift();if(!r)return s;let n=r.replace(/^SCHILY\.(dev|ino|nlink)/,"$1"),o=i.join("=");return s[n]=/^([A-Z]+\.)?([mac]|birth|creation)time$/.test(n)?new Date(Number(o)*1e3):/^[0-9]+$/.test(o)?+o:o,s};var En=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform,f=En!=="win32"?s=>s:s=>s&&s.replace(/\\/g,"/");var Yt=class extends A{extended;globalExtended;header;startBlockSize;blockRemain;remain;type;meta=!1;ignore=!1;path;mode;uid;gid;uname;gname;size=0;mtime;atime;ctime;linkpath;dev;ino;nlink;invalid=!1;absolute;unsupported=!1;constructor(t,e,i){switch(super({}),this.pause(),this.extended=e,this.globalExtended=i,this.header=t,this.remain=t.size??0,this.startBlockSize=512*Math.ceil(this.remain/512),this.blockRemain=this.startBlockSize,this.type=t.type,this.type){case"File":case"OldFile":case"Link":case"SymbolicLink":case"CharacterDevice":case"BlockDevice":case"Directory":case"FIFO":case"ContiguousFile":case"GNUDumpDir":break;case"NextFileHasLongLinkpath":case"NextFileHasLongPath":case"OldGnuLongPath":case"GlobalExtendedHeader":case"ExtendedHeader":case"OldExtendedHeader":this.meta=!0;break;default:this.ignore=!0}if(!t.path)throw new Error("no path provided for tar.ReadEntry");this.path=f(t.path),this.mode=t.mode,this.mode&&(this.mode=this.mode&4095),this.uid=t.uid,this.gid=t.gid,this.uname=t.uname,this.gname=t.gname,this.size=this.remain,this.mtime=t.mtime,this.atime=t.atime,this.ctime=t.ctime,this.linkpath=t.linkpath?f(t.linkpath):void 0,this.uname=t.uname,this.gname=t.gname,e&&this.#t(e),i&&this.#t(i,!0)}write(t){let e=t.length;if(e>this.blockRemain)throw new Error("writing more to entry than is appropriate");let i=this.remain,r=this.blockRemain;return this.remain=Math.max(0,i-e),this.blockRemain=Math.max(0,r-e),this.ignore?!0:i>=e?super.write(t):super.write(t.subarray(0,i))}#t(t,e=!1){t.path&&(t.path=f(t.path)),t.linkpath&&(t.linkpath=f(t.linkpath)),Object.assign(this,Object.fromEntries(Object.entries(t).filter(([i,r])=>!(r==null||i==="path"&&e))))}};var Lt=(s,t,e,i={})=>{s.file&&(i.file=s.file),s.cwd&&(i.cwd=s.cwd),i.code=e instanceof Error&&e.code||t,i.tarCode=t,!s.strict&&i.recoverable!==!1?(e instanceof Error&&(i=Object.assign(e,i),e=e.message),s.emit("warn",t,e,i)):e instanceof Error?s.emit("error",Object.assign(e,i)):s.emit("error",Object.assign(new Error(`${t}: ${e}`),i))};var Sn=1024*1024,Gi=Buffer.from([31,139]),Zi=Buffer.from([40,181,47,253]),yn=Math.max(Gi.length,Zi.length),B=Symbol("state"),Nt=Symbol("writeEntry"),et=Symbol("readEntry"),zi=Symbol("nextEntry"),Hs=Symbol("processEntry"),V=Symbol("extendedHeader"),ae=Symbol("globalExtendedHeader"),ft=Symbol("meta"),Ws=Symbol("emitMeta"),p=Symbol("buffer"),it=Symbol("queue"),dt=Symbol("ended"),Ui=Symbol("emittedEnd"),Dt=Symbol("emit"),y=Symbol("unzip"),Ke=Symbol("consumeChunk"),Ve=Symbol("consumeChunkSub"),Hi=Symbol("consumeBody"),Gs=Symbol("consumeMeta"),Zs=Symbol("consumeHeader"),le=Symbol("consuming"),Wi=Symbol("bufferConcat"),$e=Symbol("maybeEnd"),Kt=Symbol("writing"),ut=Symbol("aborted"),Xe=Symbol("onDone"),At=Symbol("sawValidEntry"),qe=Symbol("sawNullBlock"),je=Symbol("sawEOF"),Ys=Symbol("closeStream"),Rn=()=>!0,st=class extends wn{file;strict;maxMetaEntrySize;filter;brotli;zstd;writable=!0;readable=!1;[it]=[];[p];[et];[Nt];[B]="begin";[ft]="";[V];[ae];[dt]=!1;[y];[ut]=!1;[At];[qe]=!1;[je]=!1;[Kt]=!1;[le]=!1;[Ui]=!1;constructor(t={}){super(),this.file=t.file||"",this.on(Xe,()=>{(this[B]==="begin"||this[At]===!1)&&this.warn("TAR_BAD_ARCHIVE","Unrecognized archive format")}),t.ondone?this.on(Xe,t.ondone):this.on(Xe,()=>{this.emit("prefinish"),this.emit("finish"),this.emit("end")}),this.strict=!!t.strict,this.maxMetaEntrySize=t.maxMetaEntrySize||Sn,this.filter=typeof t.filter=="function"?t.filter:Rn;let e=t.file&&(t.file.endsWith(".tar.br")||t.file.endsWith(".tbr"));this.brotli=!(t.gzip||t.zstd)&&t.brotli!==void 0?t.brotli:e?void 0:!1;let i=t.file&&(t.file.endsWith(".tar.zst")||t.file.endsWith(".tzst"));this.zstd=!(t.gzip||t.brotli)&&t.zstd!==void 0?t.zstd:i?!0:void 0,this.on("end",()=>this[Ys]()),typeof t.onwarn=="function"&&this.on("warn",t.onwarn),typeof t.onReadEntry=="function"&&this.on("entry",t.onReadEntry)}warn(t,e,i={}){Lt(this,t,e,i)}[Zs](t,e){this[At]===void 0&&(this[At]=!1);let i;try{i=new F(t,e,this[V],this[ae])}catch(r){return this.warn("TAR_ENTRY_INVALID",r)}if(i.nullBlock)this[qe]?(this[je]=!0,this[B]==="begin"&&(this[B]="header"),this[Dt]("eof")):(this[qe]=!0,this[Dt]("nullBlock"));else if(this[qe]=!1,!i.cksumValid)this.warn("TAR_ENTRY_INVALID","checksum failure",{header:i});else if(!i.path)this.warn("TAR_ENTRY_INVALID","path is required",{header:i});else{let r=i.type;if(/^(Symbolic)?Link$/.test(r)&&!i.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath required",{header:i});else if(!/^(Symbolic)?Link$/.test(r)&&!/^(Global)?ExtendedHeader$/.test(r)&&i.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath forbidden",{header:i});else{let n=this[Nt]=new Yt(i,this[V],this[ae]);if(!this[At])if(n.remain){let o=()=>{n.invalid||(this[At]=!0)};n.on("end",o)}else this[At]=!0;n.meta?n.size>this.maxMetaEntrySize?(n.ignore=!0,this[Dt]("ignoredEntry",n),this[B]="ignore",n.resume()):n.size>0&&(this[ft]="",n.on("data",o=>this[ft]+=o),this[B]="meta"):(this[V]=void 0,n.ignore=n.ignore||!this.filter(n.path,n),n.ignore?(this[Dt]("ignoredEntry",n),this[B]=n.remain?"ignore":"header",n.resume()):(n.remain?this[B]="body":(this[B]="header",n.end()),this[et]?this[it].push(n):(this[it].push(n),this[zi]())))}}}[Ys](){queueMicrotask(()=>this.emit("close"))}[Hs](t){let e=!0;if(!t)this[et]=void 0,e=!1;else if(Array.isArray(t)){let[i,...r]=t;this.emit(i,...r)}else this[et]=t,this.emit("entry",t),t.emittedEnd||(t.on("end",()=>this[zi]()),e=!1);return e}[zi](){do;while(this[Hs](this[it].shift()));if(!this[it].length){let t=this[et];!t||t.flowing||t.size===t.remain?this[Kt]||this.emit("drain"):t.once("drain",()=>this.emit("drain"))}}[Hi](t,e){let i=this[Nt];if(!i)throw new Error("attempt to consume body without entry??");let r=i.blockRemain??0,n=r>=t.length&&e===0?t:t.subarray(e,e+r);return i.write(n),i.blockRemain||(this[B]="header",this[Nt]=void 0,i.end()),n.length}[Gs](t,e){let i=this[Nt],r=this[Hi](t,e);return!this[Nt]&&i&&this[Ws](i),r}[Dt](t,e,i){!this[it].length&&!this[et]?this.emit(t,e,i):this[it].push([t,e,i])}[Ws](t){switch(this[Dt]("meta",this[ft]),t.type){case"ExtendedHeader":case"OldExtendedHeader":this[V]=ct.parse(this[ft],this[V],!1);break;case"GlobalExtendedHeader":this[ae]=ct.parse(this[ft],this[ae],!0);break;case"NextFileHasLongPath":case"OldGnuLongPath":{let e=this[V]??Object.create(null);this[V]=e,e.path=this[ft].replace(/\0.*/,"");break}case"NextFileHasLongLinkpath":{let e=this[V]||Object.create(null);this[V]=e,e.linkpath=this[ft].replace(/\0.*/,"");break}default:throw new Error("unknown meta: "+t.type)}}abort(t){this[ut]=!0,this.emit("abort",t),this.warn("TAR_ABORT",t,{recoverable:!1})}write(t,e,i){if(typeof e=="function"&&(i=e,e=void 0),typeof t=="string"&&(t=Buffer.from(t,typeof e=="string"?e:"utf8")),this[ut])return i?.(),!1;if((this[y]===void 0||this.brotli===void 0&&this[y]===!1)&&t){if(this[p]&&(t=Buffer.concat([this[p],t]),this[p]=void 0),t.length<yn)return this[p]=t,i?.(),!0;for(let a=0;this[y]===void 0&&a<Gi.length;a++)t[a]!==Gi[a]&&(this[y]=!1);let o=!1;if(this[y]===!1&&this.zstd!==!1){o=!0;for(let a=0;a<Zi.length;a++)if(t[a]!==Zi[a]){o=!1;break}}let h=this.brotli===void 0&&!o;if(this[y]===!1&&h)if(t.length<512)if(this[dt])this.brotli=!0;else return this[p]=t,i?.(),!0;else try{new F(t.subarray(0,512)),this.brotli=!1}catch{this.brotli=!0}if(this[y]===void 0||this[y]===!1&&(this.brotli||o)){let a=this[dt];this[dt]=!1,this[y]=this[y]===void 0?new Pe({}):o?new Ze({}):new He({}),this[y].on("data",c=>this[Ke](c)),this[y].on("error",c=>this.abort(c)),this[y].on("end",()=>{this[dt]=!0,this[Ke]()}),this[Kt]=!0;let l=!!this[y][a?"end":"write"](t);return this[Kt]=!1,i?.(),l}}this[Kt]=!0,this[y]?this[y].write(t):this[Ke](t),this[Kt]=!1;let n=this[it].length?!1:this[et]?this[et].flowing:!0;return!n&&!this[it].length&&this[et]?.once("drain",()=>this.emit("drain")),i?.(),n}[Wi](t){t&&!this[ut]&&(this[p]=this[p]?Buffer.concat([this[p],t]):t)}[$e](){if(this[dt]&&!this[Ui]&&!this[ut]&&!this[le]){this[Ui]=!0;let t=this[Nt];if(t&&t.blockRemain){let e=this[p]?this[p].length:0;this.warn("TAR_BAD_ARCHIVE",`Truncated input (needed ${t.blockRemain} more bytes, only ${e} available)`,{entry:t}),this[p]&&t.write(this[p]),t.end()}this[Dt](Xe)}}[Ke](t){if(this[le]&&t)this[Wi](t);else if(!t&&!this[p])this[$e]();else if(t){if(this[le]=!0,this[p]){this[Wi](t);let e=this[p];this[p]=void 0,this[Ve](e)}else this[Ve](t);for(;this[p]&&this[p]?.length>=512&&!this[ut]&&!this[je];){let e=this[p];this[p]=void 0,this[Ve](e)}this[le]=!1}(!this[p]||this[dt])&&this[$e]()}[Ve](t){let e=0,i=t.length;for(;e+512<=i&&!this[ut]&&!this[je];)switch(this[B]){case"begin":case"header":this[Zs](t,e),e+=512;break;case"ignore":case"body":e+=this[Hi](t,e);break;case"meta":e+=this[Gs](t,e);break;default:throw new Error("invalid state: "+this[B])}e<i&&(this[p]?this[p]=Buffer.concat([t.subarray(e),this[p]]):this[p]=t.subarray(e))}end(t,e,i){return typeof t=="function"&&(i=t,e=void 0,t=void 0),typeof e=="function"&&(i=e,e=void 0),typeof t=="string"&&(t=Buffer.from(t,e)),i&&this.once("finish",i),this[ut]||(this[y]?(t&&this[y].write(t),this[y].end()):(this[dt]=!0,(this.brotli===void 0||this.zstd===void 0)&&(t=t||Buffer.alloc(0)),t&&this.write(t),this[$e]())),this}};var mt=s=>{let t=s.length-1,e=-1;for(;t>-1&&s.charAt(t)==="/";)e=t,t--;return e===-1?s:s.slice(0,e)};var _n=s=>{let t=s.onReadEntry;s.onReadEntry=t?e=>{t(e),e.resume()}:e=>e.resume()},Yi=(s,t)=>{let e=new Map(t.map(n=>[mt(n),!0])),i=s.filter,r=(n,o="")=>{let h=o||gn(n).root||".",a;if(n===h)a=!1;else{let l=e.get(n);l!==void 0?a=l:a=r(bn(n),h)}return e.set(n,a),a};s.filter=i?(n,o)=>i(n,o)&&r(mt(n)):n=>r(mt(n))},On=s=>{let t=new st(s),e=s.file,i;try{i=Vt.openSync(e,"r");let r=Vt.fstatSync(i),n=s.maxReadSize||16*1024*1024;if(r.size<n){let o=Buffer.allocUnsafe(r.size),h=Vt.readSync(i,o,0,r.size,0);t.end(h===o.byteLength?o:o.subarray(0,h))}else{let o=0,h=Buffer.allocUnsafe(n);for(;o<r.size;){let a=Vt.readSync(i,h,0,n,o);if(a===0)break;o+=a,t.write(h.subarray(0,a))}t.end()}}finally{if(typeof i=="number")try{Vt.closeSync(i)}catch{}}},Tn=(s,t)=>{let e=new st(s),i=s.maxReadSize||16*1024*1024,r=s.file;return new Promise((o,h)=>{e.on("error",h),e.on("end",o),Vt.stat(r,(a,l)=>{if(a)h(a);else{let c=new gt(r,{readSize:i,size:l.size});c.on("error",h),c.pipe(e)}})})},It=K(On,Tn,s=>new st(s),s=>new st(s),(s,t)=>{t?.length&&Yi(s,t),s.noResume||_n(s)});import ci from"fs";import $ from"fs";import Xs from"path";var Ki=(s,t,e)=>(s&=4095,e&&(s=(s|384)&-19),t&&(s&256&&(s|=64),s&32&&(s|=8),s&4&&(s|=1)),s);import{win32 as xn}from"node:path";var{isAbsolute:Ln,parse:Ks}=xn,ce=s=>{let t="",e=Ks(s);for(;Ln(s)||e.root;){let i=s.charAt(0)==="/"&&s.slice(0,4)!=="//?/"?"/":e.root;s=s.slice(i.length),t+=i,e=Ks(s)}return[t,s]};var Qe=["|","<",">","?",":"],Vi=Qe.map(s=>String.fromCharCode(61440+s.charCodeAt(0))),Nn=new Map(Qe.map((s,t)=>[s,Vi[t]])),Dn=new Map(Vi.map((s,t)=>[s,Qe[t]])),$i=s=>Qe.reduce((t,e)=>t.split(e).join(Nn.get(e)),s),Vs=s=>Vi.reduce((t,e)=>t.split(e).join(Dn.get(e)),s);var tr=(s,t)=>t?(s=f(s).replace(/^\.(\/|$)/,""),mt(t)+"/"+s):f(s),An=16*1024*1024,qs=Symbol("process"),js=Symbol("file"),Qs=Symbol("directory"),qi=Symbol("symlink"),Js=Symbol("hardlink"),fe=Symbol("header"),Je=Symbol("read"),ji=Symbol("lstat"),ti=Symbol("onlstat"),Qi=Symbol("onread"),Ji=Symbol("onreadlink"),ts=Symbol("openfile"),es=Symbol("onopenfile"),pt=Symbol("close"),ei=Symbol("mode"),is=Symbol("awaitDrain"),Xi=Symbol("ondrain"),X=Symbol("prefix"),de=class extends A{path;portable;myuid=process.getuid&&process.getuid()||0;myuser=process.env.USER||"";maxReadSize;linkCache;statCache;preservePaths;cwd;strict;mtime;noPax;noMtime;prefix;fd;blockLen=0;blockRemain=0;buf;pos=0;remain=0;length=0;offset=0;win32;absolute;header;type;linkpath;stat;onWriteEntry;#t=!1;constructor(t,e={}){let i=re(e);super(),this.path=f(t),this.portable=!!i.portable,this.maxReadSize=i.maxReadSize||An,this.linkCache=i.linkCache||new Map,this.statCache=i.statCache||new Map,this.preservePaths=!!i.preservePaths,this.cwd=f(i.cwd||process.cwd()),this.strict=!!i.strict,this.noPax=!!i.noPax,this.noMtime=!!i.noMtime,this.mtime=i.mtime,this.prefix=i.prefix?f(i.prefix):void 0,this.onWriteEntry=i.onWriteEntry,typeof i.onwarn=="function"&&this.on("warn",i.onwarn);let r=!1;if(!this.preservePaths){let[o,h]=ce(this.path);o&&typeof h=="string"&&(this.path=h,r=o)}this.win32=!!i.win32||process.platform==="win32",this.win32&&(this.path=Vs(this.path.replace(/\\/g,"/")),t=t.replace(/\\/g,"/")),this.absolute=f(i.absolute||Xs.resolve(this.cwd,t)),this.path===""&&(this.path="./"),r&&this.warn("TAR_ENTRY_INFO",`stripping ${r} from absolute path`,{entry:this,path:r+this.path});let n=this.statCache.get(this.absolute);n?this[ti](n):this[ji]()}warn(t,e,i={}){return Lt(this,t,e,i)}emit(t,...e){return t==="error"&&(this.#t=!0),super.emit(t,...e)}[ji](){$.lstat(this.absolute,(t,e)=>{if(t)return this.emit("error",t);this[ti](e)})}[ti](t){this.statCache.set(this.absolute,t),this.stat=t,t.isFile()||(t.size=0),this.type=In(t),this.emit("stat",t),this[qs]()}[qs](){switch(this.type){case"File":return this[js]();case"Directory":return this[Qs]();case"SymbolicLink":return this[qi]();default:return this.end()}}[ei](t){return Ki(t,this.type==="Directory",this.portable)}[X](t){return tr(t,this.prefix)}[fe](){if(!this.stat)throw new Error("cannot write header before stat");this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.onWriteEntry?.(this),this.header=new F({path:this[X](this.path),linkpath:this.type==="Link"&&this.linkpath!==void 0?this[X](this.linkpath):this.linkpath,mode:this[ei](this.stat.mode),uid:this.portable?void 0:this.stat.uid,gid:this.portable?void 0:this.stat.gid,size:this.stat.size,mtime:this.noMtime?void 0:this.mtime||this.stat.mtime,type:this.type==="Unsupported"?void 0:this.type,uname:this.portable?void 0:this.stat.uid===this.myuid?this.myuser:"",atime:this.portable?void 0:this.stat.atime,ctime:this.portable?void 0:this.stat.ctime}),this.header.encode()&&!this.noPax&&super.write(new ct({atime:this.portable?void 0:this.header.atime,ctime:this.portable?void 0:this.header.ctime,gid:this.portable?void 0:this.header.gid,mtime:this.noMtime?void 0:this.mtime||this.header.mtime,path:this[X](this.path),linkpath:this.type==="Link"&&this.linkpath!==void 0?this[X](this.linkpath):this.linkpath,size:this.header.size,uid:this.portable?void 0:this.header.uid,uname:this.portable?void 0:this.header.uname,dev:this.portable?void 0:this.stat.dev,ino:this.portable?void 0:this.stat.ino,nlink:this.portable?void 0:this.stat.nlink}).encode());let t=this.header?.block;if(!t)throw new Error("failed to encode header");super.write(t)}[Qs](){if(!this.stat)throw new Error("cannot create directory entry without stat");this.path.slice(-1)!=="/"&&(this.path+="/"),this.stat.size=0,this[fe](),this.end()}[qi](){$.readlink(this.absolute,(t,e)=>{if(t)return this.emit("error",t);this[Ji](e)})}[Ji](t){this.linkpath=f(t),this[fe](),this.end()}[Js](t){if(!this.stat)throw new Error("cannot create link entry without stat");this.type="Link",this.linkpath=f(Xs.relative(this.cwd,t)),this.stat.size=0,this[fe](),this.end()}[js](){if(!this.stat)throw new Error("cannot create file entry without stat");if(this.stat.nlink>1){let t=`${this.stat.dev}:${this.stat.ino}`,e=this.linkCache.get(t);if(e?.indexOf(this.cwd)===0)return this[Js](e);this.linkCache.set(t,this.absolute)}if(this[fe](),this.stat.size===0)return this.end();this[ts]()}[ts](){$.open(this.absolute,"r",(t,e)=>{if(t)return this.emit("error",t);this[es](e)})}[es](t){if(this.fd=t,this.#t)return this[pt]();if(!this.stat)throw new Error("should stat before calling onopenfile");this.blockLen=512*Math.ceil(this.stat.size/512),this.blockRemain=this.blockLen;let e=Math.min(this.blockLen,this.maxReadSize);this.buf=Buffer.allocUnsafe(e),this.offset=0,this.pos=0,this.remain=this.stat.size,this.length=this.buf.length,this[Je]()}[Je](){let{fd:t,buf:e,offset:i,length:r,pos:n}=this;if(t===void 0||e===void 0)throw new Error("cannot read file without first opening");$.read(t,e,i,r,n,(o,h)=>{if(o)return this[pt](()=>this.emit("error",o));this[Qi](h)})}[pt](t=()=>{}){this.fd!==void 0&&$.close(this.fd,t)}[Qi](t){if(t<=0&&this.remain>0){let r=Object.assign(new Error("encountered unexpected EOF"),{path:this.absolute,syscall:"read",code:"EOF"});return this[pt](()=>this.emit("error",r))}if(t>this.remain){let r=Object.assign(new Error("did not encounter expected EOF"),{path:this.absolute,syscall:"read",code:"EOF"});return this[pt](()=>this.emit("error",r))}if(!this.buf)throw new Error("should have created buffer prior to reading");if(t===this.remain)for(let r=t;r<this.length&&t<this.blockRemain;r++)this.buf[r+this.offset]=0,t++,this.remain++;let e=this.offset===0&&t===this.buf.length?this.buf:this.buf.subarray(this.offset,this.offset+t);this.write(e)?this[Xi]():this[is](()=>this[Xi]())}[is](t){this.once("drain",t)}write(t,e,i){if(typeof e=="function"&&(i=e,e=void 0),typeof t=="string"&&(t=Buffer.from(t,typeof e=="string"?e:"utf8")),this.blockRemain<t.length){let r=Object.assign(new Error("writing more data than expected"),{path:this.absolute});return this.emit("error",r)}return this.remain-=t.length,this.blockRemain-=t.length,this.pos+=t.length,this.offset+=t.length,super.write(t,null,i)}[Xi](){if(!this.remain)return this.blockRemain&&super.write(Buffer.alloc(this.blockRemain)),this[pt](t=>t?this.emit("error",t):this.end());if(!this.buf)throw new Error("buffer lost somehow in ONDRAIN");this.offset>=this.length&&(this.buf=Buffer.allocUnsafe(Math.min(this.blockRemain,this.buf.length)),this.offset=0),this.length=this.buf.length-this.offset,this[Je]()}},ii=class extends de{sync=!0;[ji](){this[ti]($.lstatSync(this.absolute))}[qi](){this[Ji]($.readlinkSync(this.absolute))}[ts](){this[es]($.openSync(this.absolute,"r"))}[Je](){let t=!0;try{let{fd:e,buf:i,offset:r,length:n,pos:o}=this;if(e===void 0||i===void 0)throw new Error("fd and buf must be set in READ method");let h=$.readSync(e,i,r,n,o);this[Qi](h),t=!1}finally{if(t)try{this[pt](()=>{})}catch{}}}[is](t){t()}[pt](t=()=>{}){this.fd!==void 0&&$.closeSync(this.fd),t()}},si=class extends A{blockLen=0;blockRemain=0;buf=0;pos=0;remain=0;length=0;preservePaths;portable;strict;noPax;noMtime;readEntry;type;prefix;path;mode;uid;gid;uname;gname;header;mtime;atime;ctime;linkpath;size;onWriteEntry;warn(t,e,i={}){return Lt(this,t,e,i)}constructor(t,e={}){let i=re(e);super(),this.preservePaths=!!i.preservePaths,this.portable=!!i.portable,this.strict=!!i.strict,this.noPax=!!i.noPax,this.noMtime=!!i.noMtime,this.onWriteEntry=i.onWriteEntry,this.readEntry=t;let{type:r}=t;if(r==="Unsupported")throw new Error("writing entry that should be ignored");this.type=r,this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.prefix=i.prefix,this.path=f(t.path),this.mode=t.mode!==void 0?this[ei](t.mode):void 0,this.uid=this.portable?void 0:t.uid,this.gid=this.portable?void 0:t.gid,this.uname=this.portable?void 0:t.uname,this.gname=this.portable?void 0:t.gname,this.size=t.size,this.mtime=this.noMtime?void 0:i.mtime||t.mtime,this.atime=this.portable?void 0:t.atime,this.ctime=this.portable?void 0:t.ctime,this.linkpath=t.linkpath!==void 0?f(t.linkpath):void 0,typeof i.onwarn=="function"&&this.on("warn",i.onwarn);let n=!1;if(!this.preservePaths){let[h,a]=ce(this.path);h&&typeof a=="string"&&(this.path=a,n=h)}this.remain=t.size,this.blockRemain=t.startBlockSize,this.onWriteEntry?.(this),this.header=new F({path:this[X](this.path),linkpath:this.type==="Link"&&this.linkpath!==void 0?this[X](this.linkpath):this.linkpath,mode:this.mode,uid:this.portable?void 0:this.uid,gid:this.portable?void 0:this.gid,size:this.size,mtime:this.noMtime?void 0:this.mtime,type:this.type,uname:this.portable?void 0:this.uname,atime:this.portable?void 0:this.atime,ctime:this.portable?void 0:this.ctime}),n&&this.warn("TAR_ENTRY_INFO",`stripping ${n} from absolute path`,{entry:this,path:n+this.path}),this.header.encode()&&!this.noPax&&super.write(new ct({atime:this.portable?void 0:this.atime,ctime:this.portable?void 0:this.ctime,gid:this.portable?void 0:this.gid,mtime:this.noMtime?void 0:this.mtime,path:this[X](this.path),linkpath:this.type==="Link"&&this.linkpath!==void 0?this[X](this.linkpath):this.linkpath,size:this.size,uid:this.portable?void 0:this.uid,uname:this.portable?void 0:this.uname,dev:this.portable?void 0:this.readEntry.dev,ino:this.portable?void 0:this.readEntry.ino,nlink:this.portable?void 0:this.readEntry.nlink}).encode());let o=this.header?.block;if(!o)throw new Error("failed to encode header");super.write(o),t.pipe(this)}[X](t){return tr(t,this.prefix)}[ei](t){return Ki(t,this.type==="Directory",this.portable)}write(t,e,i){typeof e=="function"&&(i=e,e=void 0),typeof t=="string"&&(t=Buffer.from(t,typeof e=="string"?e:"utf8"));let r=t.length;if(r>this.blockRemain)throw new Error("writing more to entry than is appropriate");return this.blockRemain-=r,super.write(t,i)}end(t,e,i){return this.blockRemain&&super.write(Buffer.alloc(this.blockRemain)),typeof t=="function"&&(i=t,e=void 0,t=void 0),typeof e=="function"&&(i=e,e=void 0),typeof t=="string"&&(t=Buffer.from(t,e??"utf8")),i&&this.once("finish",i),t?super.end(t,i):super.end(i),this}},In=s=>s.isFile()?"File":s.isDirectory()?"Directory":s.isSymbolicLink()?"SymbolicLink":"Unsupported";var ri=class s{tail;head;length=0;static create(t=[]){return new s(t)}constructor(t=[]){for(let e of t)this.push(e)}*[Symbol.iterator](){for(let t=this.head;t;t=t.next)yield t.value}removeNode(t){if(t.list!==this)throw new Error("removing node which does not belong to this list");let e=t.next,i=t.prev;return e&&(e.prev=i),i&&(i.next=e),t===this.head&&(this.head=e),t===this.tail&&(this.tail=i),this.length--,t.next=void 0,t.prev=void 0,t.list=void 0,e}unshiftNode(t){if(t===this.head)return;t.list&&t.list.removeNode(t);let e=this.head;t.list=this,t.next=e,e&&(e.prev=t),this.head=t,this.tail||(this.tail=t),this.length++}pushNode(t){if(t===this.tail)return;t.list&&t.list.removeNode(t);let e=this.tail;t.list=this,t.prev=e,e&&(e.next=t),this.tail=t,this.head||(this.head=t),this.length++}push(...t){for(let e=0,i=t.length;e<i;e++)Fn(this,t[e]);return this.length}unshift(...t){for(var e=0,i=t.length;e<i;e++)kn(this,t[e]);return this.length}pop(){if(!this.tail)return;let t=this.tail.value,e=this.tail;return this.tail=this.tail.prev,this.tail?this.tail.next=void 0:this.head=void 0,e.list=void 0,this.length--,t}shift(){if(!this.head)return;let t=this.head.value,e=this.head;return this.head=this.head.next,this.head?this.head.prev=void 0:this.tail=void 0,e.list=void 0,this.length--,t}forEach(t,e){e=e||this;for(let i=this.head,r=0;i;r++)t.call(e,i.value,r,this),i=i.next}forEachReverse(t,e){e=e||this;for(let i=this.tail,r=this.length-1;i;r--)t.call(e,i.value,r,this),i=i.prev}get(t){let e=0,i=this.head;for(;i&&e<t;e++)i=i.next;if(e===t&&i)return i.value}getReverse(t){let e=0,i=this.tail;for(;i&&e<t;e++)i=i.prev;if(e===t&&i)return i.value}map(t,e){e=e||this;let i=new s;for(let r=this.head;r;)i.push(t.call(e,r.value,this)),r=r.next;return i}mapReverse(t,e){e=e||this;var i=new s;for(let r=this.tail;r;)i.push(t.call(e,r.value,this)),r=r.prev;return i}reduce(t,e){let i,r=this.head;if(arguments.length>1)i=e;else if(this.head)r=this.head.next,i=this.head.value;else throw new TypeError("Reduce of empty list with no initial value");for(var n=0;r;n++)i=t(i,r.value,n),r=r.next;return i}reduceReverse(t,e){let i,r=this.tail;if(arguments.length>1)i=e;else if(this.tail)r=this.tail.prev,i=this.tail.value;else throw new TypeError("Reduce of empty list with no initial value");for(let n=this.length-1;r;n--)i=t(i,r.value,n),r=r.prev;return i}toArray(){let t=new Array(this.length);for(let e=0,i=this.head;i;e++)t[e]=i.value,i=i.next;return t}toArrayReverse(){let t=new Array(this.length);for(let e=0,i=this.tail;i;e++)t[e]=i.value,i=i.prev;return t}slice(t=0,e=this.length){e<0&&(e+=this.length),t<0&&(t+=this.length);let i=new s;if(e<t||e<0)return i;t<0&&(t=0),e>this.length&&(e=this.length);let r=this.head,n=0;for(n=0;r&&n<t;n++)r=r.next;for(;r&&n<e;n++,r=r.next)i.push(r.value);return i}sliceReverse(t=0,e=this.length){e<0&&(e+=this.length),t<0&&(t+=this.length);let i=new s;if(e<t||e<0)return i;t<0&&(t=0),e>this.length&&(e=this.length);let r=this.length,n=this.tail;for(;n&&r>e;r--)n=n.prev;for(;n&&r>t;r--,n=n.prev)i.push(n.value);return i}splice(t,e=0,...i){t>this.length&&(t=this.length-1),t<0&&(t=this.length+t);let r=this.head;for(let o=0;r&&o<t;o++)r=r.next;let n=[];for(let o=0;r&&o<e;o++)n.push(r.value),r=this.removeNode(r);r?r!==this.tail&&(r=r.prev):r=this.tail;for(let o of i)r=Cn(this,r,o);return n}reverse(){let t=this.head,e=this.tail;for(let i=t;i;i=i.prev){let r=i.prev;i.prev=i.next,i.next=r}return this.head=e,this.tail=t,this}};function Cn(s,t,e){let i=t,r=t?t.next:s.head,n=new ue(e,i,r,s);return n.next===void 0&&(s.tail=n),n.prev===void 0&&(s.head=n),s.length++,n}function Fn(s,t){s.tail=new ue(t,s.tail,void 0,s),s.head||(s.head=s.tail),s.length++}function kn(s,t){s.head=new ue(t,void 0,s.head,s),s.tail||(s.tail=s.head),s.length++}var ue=class{list;next;prev;value;constructor(t,e,i,r){this.list=r,this.value=t,e?(e.next=this,this.prev=e):this.prev=void 0,i?(i.prev=this,this.next=i):this.next=void 0}};import rr from"path";var fi=class{path;absolute;entry;stat;readdir;pending=!1;ignore=!1;piped=!1;constructor(t,e){this.path=t||"./",this.absolute=e}},er=Buffer.alloc(1024),ni=Symbol("onStat"),me=Symbol("ended"),W=Symbol("queue"),Ct=Symbol("current"),Ft=Symbol("process"),pe=Symbol("processing"),ss=Symbol("processJob"),G=Symbol("jobs"),rs=Symbol("jobDone"),oi=Symbol("addFSEntry"),ir=Symbol("addTarEntry"),hs=Symbol("stat"),as=Symbol("readdir"),hi=Symbol("onreaddir"),ai=Symbol("pipe"),sr=Symbol("entry"),ns=Symbol("entryOpt"),li=Symbol("writeEntryClass"),nr=Symbol("write"),os=Symbol("ondrain"),Et=class extends A{sync=!1;opt;cwd;maxReadSize;preservePaths;strict;noPax;prefix;linkCache;statCache;file;portable;zip;readdirCache;noDirRecurse;follow;noMtime;mtime;filter;jobs;[li];onWriteEntry;[W];[G]=0;[pe]=!1;[me]=!1;constructor(t={}){if(super(),this.opt=t,this.file=t.file||"",this.cwd=t.cwd||process.cwd(),this.maxReadSize=t.maxReadSize,this.preservePaths=!!t.preservePaths,this.strict=!!t.strict,this.noPax=!!t.noPax,this.prefix=f(t.prefix||""),this.linkCache=t.linkCache||new Map,this.statCache=t.statCache||new Map,this.readdirCache=t.readdirCache||new Map,this.onWriteEntry=t.onWriteEntry,this[li]=de,typeof t.onwarn=="function"&&this.on("warn",t.onwarn),this.portable=!!t.portable,t.gzip||t.brotli||t.zstd){if((t.gzip?1:0)+(t.brotli?1:0)+(t.zstd?1:0)>1)throw new TypeError("gzip, brotli, zstd are mutually exclusive");if(t.gzip&&(typeof t.gzip!="object"&&(t.gzip={}),this.portable&&(t.gzip.portable=!0),this.zip=new Be(t.gzip)),t.brotli&&(typeof t.brotli!="object"&&(t.brotli={}),this.zip=new Ue(t.brotli)),t.zstd&&(typeof t.zstd!="object"&&(t.zstd={}),this.zip=new Ge(t.zstd)),!this.zip)throw new Error("impossible");let e=this.zip;e.on("data",i=>super.write(i)),e.on("end",()=>super.end()),e.on("drain",()=>this[os]()),this.on("resume",()=>e.resume())}else this.on("drain",this[os]);this.noDirRecurse=!!t.noDirRecurse,this.follow=!!t.follow,this.noMtime=!!t.noMtime,t.mtime&&(this.mtime=t.mtime),this.filter=typeof t.filter=="function"?t.filter:()=>!0,this[W]=new ri,this[G]=0,this.jobs=Number(t.jobs)||4,this[pe]=!1,this[me]=!1}[nr](t){return super.write(t)}add(t){return this.write(t),this}end(t,e,i){return typeof t=="function"&&(i=t,t=void 0),typeof e=="function"&&(i=e,e=void 0),t&&this.add(t),this[me]=!0,this[Ft](),i&&i(),this}write(t){if(this[me])throw new Error("write after end");return t instanceof Yt?this[ir](t):this[oi](t),this.flowing}[ir](t){let e=f(rr.resolve(this.cwd,t.path));if(!this.filter(t.path,t))t.resume();else{let i=new fi(t.path,e);i.entry=new si(t,this[ns](i)),i.entry.on("end",()=>this[rs](i)),this[G]+=1,this[W].push(i)}this[Ft]()}[oi](t){let e=f(rr.resolve(this.cwd,t));this[W].push(new fi(t,e)),this[Ft]()}[hs](t){t.pending=!0,this[G]+=1;let e=this.follow?"stat":"lstat";ci[e](t.absolute,(i,r)=>{t.pending=!1,this[G]-=1,i?this.emit("error",i):this[ni](t,r)})}[ni](t,e){this.statCache.set(t.absolute,e),t.stat=e,this.filter(t.path,e)?e.isFile()&&e.nlink>1&&t===this[Ct]&&!this.linkCache.get(`${e.dev}:${e.ino}`)&&!this.sync&&this[ss](t):t.ignore=!0,this[Ft]()}[as](t){t.pending=!0,this[G]+=1,ci.readdir(t.absolute,(e,i)=>{if(t.pending=!1,this[G]-=1,e)return this.emit("error",e);this[hi](t,i)})}[hi](t,e){this.readdirCache.set(t.absolute,e),t.readdir=e,this[Ft]()}[Ft](){if(!this[pe]){this[pe]=!0;for(let t=this[W].head;t&&this[G]<this.jobs;t=t.next)if(this[ss](t.value),t.value.ignore){let e=t.next;this[W].removeNode(t),t.next=e}this[pe]=!1,this[me]&&!this[W].length&&this[G]===0&&(this.zip?this.zip.end(er):(super.write(er),super.end()))}}get[Ct](){return this[W]&&this[W].head&&this[W].head.value}[rs](t){this[W].shift(),this[G]-=1,this[Ft]()}[ss](t){if(!t.pending){if(t.entry){t===this[Ct]&&!t.piped&&this[ai](t);return}if(!t.stat){let e=this.statCache.get(t.absolute);e?this[ni](t,e):this[hs](t)}if(t.stat&&!t.ignore){if(!this.noDirRecurse&&t.stat.isDirectory()&&!t.readdir){let e=this.readdirCache.get(t.absolute);if(e?this[hi](t,e):this[as](t),!t.readdir)return}if(t.entry=this[sr](t),!t.entry){t.ignore=!0;return}t===this[Ct]&&!t.piped&&this[ai](t)}}}[ns](t){return{onwarn:(e,i,r)=>this.warn(e,i,r),noPax:this.noPax,cwd:this.cwd,absolute:t.absolute,preservePaths:this.preservePaths,maxReadSize:this.maxReadSize,strict:this.strict,portable:this.portable,linkCache:this.linkCache,statCache:this.statCache,noMtime:this.noMtime,mtime:this.mtime,prefix:this.prefix,onWriteEntry:this.onWriteEntry}}[sr](t){this[G]+=1;try{return new this[li](t.path,this[ns](t)).on("end",()=>this[rs](t)).on("error",i=>this.emit("error",i))}catch(e){this.emit("error",e)}}[os](){this[Ct]&&this[Ct].entry&&this[Ct].entry.resume()}[ai](t){t.piped=!0,t.readdir&&t.readdir.forEach(r=>{let n=t.path,o=n==="./"?"":n.replace(/\/*$/,"/");this[oi](o+r)});let e=t.entry,i=this.zip;if(!e)throw new Error("cannot pipe without source");i?e.on("data",r=>{i.write(r)||e.pause()}):e.on("data",r=>{super.write(r)||e.pause()})}pause(){return this.zip&&this.zip.pause(),super.pause()}warn(t,e,i={}){Lt(this,t,e,i)}},kt=class extends Et{sync=!0;constructor(t){super(t),this[li]=ii}pause(){}resume(){}[hs](t){let e=this.follow?"statSync":"lstatSync";this[ni](t,ci[e](t.absolute))}[as](t){this[hi](t,ci.readdirSync(t.absolute))}[ai](t){let e=t.entry,i=this.zip;if(t.readdir&&t.readdir.forEach(r=>{let n=t.path,o=n==="./"?"":n.replace(/\/*$/,"/");this[oi](o+r)}),!e)throw new Error("Cannot pipe without source");i?e.on("data",r=>{i.write(r)}):e.on("data",r=>{super[nr](r)})}};var vn=(s,t)=>{let e=new kt(s),i=new Wt(s.file,{mode:s.mode||438});e.pipe(i),hr(e,t)},Mn=(s,t)=>{let e=new Et(s),i=new tt(s.file,{mode:s.mode||438});e.pipe(i);let r=new Promise((n,o)=>{i.on("error",o),i.on("close",n),e.on("error",o)});return ar(e,t),r},hr=(s,t)=>{t.forEach(e=>{e.charAt(0)==="@"?It({file:or.resolve(s.cwd,e.slice(1)),sync:!0,noResume:!0,onReadEntry:i=>s.add(i)}):s.add(e)}),s.end()},ar=async(s,t)=>{for(let e=0;e<t.length;e++){let i=String(t[e]);i.charAt(0)==="@"?await It({file:or.resolve(String(s.cwd),i.slice(1)),noResume:!0,onReadEntry:r=>{s.add(r)}}):s.add(i)}s.end()},Bn=(s,t)=>{let e=new kt(s);return hr(e,t),e},Pn=(s,t)=>{let e=new Et(s);return ar(e,t),e},zn=K(vn,Mn,Bn,Pn,(s,t)=>{if(!t?.length)throw new TypeError("no paths specified to add to archive")});import Lr from"node:fs";import io from"node:assert";import{randomBytes as xr}from"node:crypto";import u from"node:fs";import R from"node:path";import lr from"fs";var Un=process.env.__FAKE_PLATFORM__||process.platform,Hn=Un==="win32",{O_CREAT:Wn,O_TRUNC:Gn,O_WRONLY:Zn}=lr.constants,cr=Number(process.env.__FAKE_FS_O_FILENAME__)||lr.constants.UV_FS_O_FILEMAP||0,Yn=Hn&&!!cr,Kn=512*1024,Vn=cr|Gn|Wn|Zn,ls=Yn?s=>s<Kn?Vn:"w":()=>"w";import ui from"node:fs";import Ee from"node:path";var cs=(s,t,e)=>{try{return ui.lchownSync(s,t,e)}catch(i){if(i?.code!=="ENOENT")throw i}},di=(s,t,e,i)=>{ui.lchown(s,t,e,r=>{i(r&&r?.code!=="ENOENT"?r:null)})},$n=(s,t,e,i,r)=>{if(t.isDirectory())fs(Ee.resolve(s,t.name),e,i,n=>{if(n)return r(n);let o=Ee.resolve(s,t.name);di(o,e,i,r)});else{let n=Ee.resolve(s,t.name);di(n,e,i,r)}},fs=(s,t,e,i)=>{ui.readdir(s,{withFileTypes:!0},(r,n)=>{if(r){if(r.code==="ENOENT")return i();if(r.code!=="ENOTDIR"&&r.code!=="ENOTSUP")return i(r)}if(r||!n.length)return di(s,t,e,i);let o=n.length,h=null,a=l=>{if(!h){if(l)return i(h=l);if(--o===0)return di(s,t,e,i)}};for(let l of n)$n(s,l,t,e,a)})},Xn=(s,t,e,i)=>{t.isDirectory()&&ds(Ee.resolve(s,t.name),e,i),cs(Ee.resolve(s,t.name),e,i)},ds=(s,t,e)=>{let i;try{i=ui.readdirSync(s,{withFileTypes:!0})}catch(r){let n=r;if(n?.code==="ENOENT")return;if(n?.code==="ENOTDIR"||n?.code==="ENOTSUP")return cs(s,t,e);throw n}for(let r of i)Xn(s,r,t,e);return cs(s,t,e)};import k from"node:fs";import qn from"node:fs/promises";import mi from"node:path";var we=class extends Error{path;code;syscall="chdir";constructor(t,e){super(`${e}: Cannot cd into '${t}'`),this.path=t,this.code=e}get name(){return"CwdError"}};var wt=class extends Error{path;symlink;syscall="symlink";code="TAR_SYMLINK_ERROR";constructor(t,e){super("TAR_SYMLINK_ERROR: Cannot extract through symbolic link"),this.symlink=t,this.path=e}get name(){return"SymlinkError"}};var jn=(s,t)=>{k.stat(s,(e,i)=>{(e||!i.isDirectory())&&(e=new we(s,e?.code||"ENOTDIR")),t(e)})},fr=(s,t,e)=>{s=f(s);let i=t.umask??18,r=t.mode|448,n=(r&i)!==0,o=t.uid,h=t.gid,a=typeof o=="number"&&typeof h=="number"&&(o!==t.processUid||h!==t.processGid),l=t.preserve,c=t.unlink,d=f(t.cwd),S=(E,x)=>{E?e(E):x&&a?fs(x,o,h,_s=>S(_s)):n?k.chmod(s,r,e):e()};if(s===d)return jn(s,S);if(l)return qn.mkdir(s,{mode:r,recursive:!0}).then(E=>S(null,E??void 0),S);let N=f(mi.relative(d,s)).split("/");us(d,N,r,c,d,void 0,S)},us=(s,t,e,i,r,n,o)=>{if(!t.length)return o(null,n);let h=t.shift(),a=f(mi.resolve(s+"/"+h));k.mkdir(a,e,dr(a,t,e,i,r,n,o))},dr=(s,t,e,i,r,n,o)=>h=>{h?k.lstat(s,(a,l)=>{if(a)a.path=a.path&&f(a.path),o(a);else if(l.isDirectory())us(s,t,e,i,r,n,o);else if(i)k.unlink(s,c=>{if(c)return o(c);k.mkdir(s,e,dr(s,t,e,i,r,n,o))});else{if(l.isSymbolicLink())return o(new wt(s,s+"/"+t.join("/")));o(h)}}):(n=n||s,us(s,t,e,i,r,n,o))},Qn=s=>{let t=!1,e;try{t=k.statSync(s).isDirectory()}catch(i){e=i?.code}finally{if(!t)throw new we(s,e??"ENOTDIR")}},ur=(s,t)=>{s=f(s);let e=t.umask??18,i=t.mode|448,r=(i&e)!==0,n=t.uid,o=t.gid,h=typeof n=="number"&&typeof o=="number"&&(n!==t.processUid||o!==t.processGid),a=t.preserve,l=t.unlink,c=f(t.cwd),d=E=>{E&&h&&ds(E,n,o),r&&k.chmodSync(s,i)};if(s===c)return Qn(c),d();if(a)return d(k.mkdirSync(s,{mode:i,recursive:!0})??void 0);let T=f(mi.relative(c,s)).split("/"),N;for(let E=T.shift(),x=c;E&&(x+="/"+E);E=T.shift()){x=f(mi.resolve(x));try{k.mkdirSync(x,i),N=N||x}catch{let Os=k.lstatSync(x);if(Os.isDirectory())continue;if(l){k.unlinkSync(x),k.mkdirSync(x,i),N=N||x;continue}else if(Os.isSymbolicLink())return new wt(x,x+"/"+T.join("/"))}}return d(N)};import{join as Er}from"node:path";var ms=Object.create(null),mr=1e4,$t=new Set,pr=s=>{$t.has(s)?$t.delete(s):ms[s]=s.normalize("NFD").toLocaleLowerCase("en").toLocaleUpperCase("en"),$t.add(s);let t=ms[s],e=$t.size-mr;if(e>mr/10){for(let i of $t)if($t.delete(i),delete ms[i],--e<=0)break}return t};var Jn=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform,to=Jn==="win32",eo=s=>s.split("/").slice(0,-1).reduce((e,i)=>{let r=e[e.length-1];return r!==void 0&&(i=Er(r,i)),e.push(i||"/"),e},[]),pi=class{#t=new Map;#i=new Map;#s=new Set;reserve(t,e){t=to?["win32 parallelization disabled"]:t.map(r=>mt(Er(pr(r))));let i=new Set(t.map(r=>eo(r)).reduce((r,n)=>r.concat(n)));this.#i.set(e,{dirs:i,paths:t});for(let r of t){let n=this.#t.get(r);n?n.push(e):this.#t.set(r,[e])}for(let r of i){let n=this.#t.get(r);if(!n)this.#t.set(r,[new Set([e])]);else{let o=n[n.length-1];o instanceof Set?o.add(e):n.push(new Set([e]))}}return this.#r(e)}#n(t){let e=this.#i.get(t);if(!e)throw new Error("function does not have any path reservations");return{paths:e.paths.map(i=>this.#t.get(i)),dirs:[...e.dirs].map(i=>this.#t.get(i))}}check(t){let{paths:e,dirs:i}=this.#n(t);return e.every(r=>r&&r[0]===t)&&i.every(r=>r&&r[0]instanceof Set&&r[0].has(t))}#r(t){return this.#s.has(t)||!this.check(t)?!1:(this.#s.add(t),t(()=>this.#e(t)),!0)}#e(t){if(!this.#s.has(t))return!1;let e=this.#i.get(t);if(!e)throw new Error("invalid reservation");let{paths:i,dirs:r}=e,n=new Set;for(let o of i){let h=this.#t.get(o);if(!h||h?.[0]!==t)continue;let a=h[1];if(!a){this.#t.delete(o);continue}if(h.shift(),typeof a=="function")n.add(a);else for(let l of a)n.add(l)}for(let o of r){let h=this.#t.get(o),a=h?.[0];if(!(!h||!(a instanceof Set)))if(a.size===1&&h.length===1){this.#t.delete(o);continue}else if(a.size===1){h.shift();let l=h[0];typeof l=="function"&&n.add(l)}else a.delete(t)}return this.#s.delete(t),n.forEach(o=>this.#r(o)),!0}};var wr=()=>process.umask();var Sr=Symbol("onEntry"),Ss=Symbol("checkFs"),yr=Symbol("checkFs2"),ys=Symbol("isReusable"),P=Symbol("makeFs"),Rs=Symbol("file"),bs=Symbol("directory"),wi=Symbol("link"),Rr=Symbol("symlink"),br=Symbol("hardlink"),ye=Symbol("ensureNoSymlink"),gr=Symbol("unsupported"),_r=Symbol("checkPath"),ps=Symbol("stripAbsolutePath"),St=Symbol("mkdir"),O=Symbol("onError"),Ei=Symbol("pending"),Or=Symbol("pend"),Xt=Symbol("unpend"),Es=Symbol("ended"),ws=Symbol("maybeClose"),gs=Symbol("skip"),Re=Symbol("doChown"),be=Symbol("uid"),ge=Symbol("gid"),_e=Symbol("checkedCwd"),so=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform,Oe=so==="win32",ro=1024,no=(s,t)=>{if(!Oe)return u.unlink(s,t);let e=s+".DELETE."+xr(16).toString("hex");u.rename(s,e,i=>{if(i)return t(i);u.unlink(e,t)})},oo=s=>{if(!Oe)return u.unlinkSync(s);let t=s+".DELETE."+xr(16).toString("hex");u.renameSync(s,t),u.unlinkSync(t)},Tr=(s,t,e)=>s!==void 0&&s===s>>>0?s:t!==void 0&&t===t>>>0?t:e,qt=class extends st{[Es]=!1;[_e]=!1;[Ei]=0;reservations=new pi;transform;writable=!0;readable=!1;uid;gid;setOwner;preserveOwner;processGid;processUid;maxDepth;forceChown;win32;newer;keep;noMtime;preservePaths;unlink;cwd;strip;processUmask;umask;dmode;fmode;chmod;constructor(t={}){if(t.ondone=()=>{this[Es]=!0,this[ws]()},super(t),this.transform=t.transform,this.chmod=!!t.chmod,typeof t.uid=="number"||typeof t.gid=="number"){if(typeof t.uid!="number"||typeof t.gid!="number")throw new TypeError("cannot set owner without number uid and gid");if(t.preserveOwner)throw new TypeError("cannot preserve owner in archive and also set owner explicitly");this.uid=t.uid,this.gid=t.gid,this.setOwner=!0}else this.uid=void 0,this.gid=void 0,this.setOwner=!1;t.preserveOwner===void 0&&typeof t.uid!="number"?this.preserveOwner=!!(process.getuid&&process.getuid()===0):this.preserveOwner=!!t.preserveOwner,this.processUid=(this.preserveOwner||this.setOwner)&&process.getuid?process.getuid():void 0,this.processGid=(this.preserveOwner||this.setOwner)&&process.getgid?process.getgid():void 0,this.maxDepth=typeof t.maxDepth=="number"?t.maxDepth:ro,this.forceChown=t.forceChown===!0,this.win32=!!t.win32||Oe,this.newer=!!t.newer,this.keep=!!t.keep,this.noMtime=!!t.noMtime,this.preservePaths=!!t.preservePaths,this.unlink=!!t.unlink,this.cwd=f(R.resolve(t.cwd||process.cwd())),this.strip=Number(t.strip)||0,this.processUmask=this.chmod?typeof t.processUmask=="number"?t.processUmask:wr():0,this.umask=typeof t.umask=="number"?t.umask:this.processUmask,this.dmode=t.dmode||511&~this.umask,this.fmode=t.fmode||438&~this.umask,this.on("entry",e=>this[Sr](e))}warn(t,e,i={}){return(t==="TAR_BAD_ARCHIVE"||t==="TAR_ABORT")&&(i.recoverable=!1),super.warn(t,e,i)}[ws](){this[Es]&&this[Ei]===0&&(this.emit("prefinish"),this.emit("finish"),this.emit("end"))}[ps](t,e){let i=t[e],{type:r}=t;if(!i||this.preservePaths)return!0;let n=i.split("/");if(n.includes("..")||Oe&&/^[a-z]:\.\.$/i.test(n[0]??"")){if(e==="path"||r==="Link")return this.warn("TAR_ENTRY_ERROR",`${e} contains '..'`,{entry:t,[e]:i}),!1;{let a=R.posix.dirname(t.path),l=R.posix.normalize(R.posix.join(a,i));if(l.startsWith("../")||l==="..")return this.warn("TAR_ENTRY_ERROR",`${e} escapes extraction directory`,{entry:t,[e]:i}),!1}}let[o,h]=ce(i);return o&&(t[e]=String(h),this.warn("TAR_ENTRY_INFO",`stripping ${o} from absolute ${e}`,{entry:t,[e]:i})),!0}[_r](t){let e=f(t.path),i=e.split("/");if(this.strip){if(i.length<this.strip)return!1;if(t.type==="Link"){let r=f(String(t.linkpath)).split("/");if(r.length>=this.strip)t.linkpath=r.slice(this.strip).join("/");else return!1}i.splice(0,this.strip),t.path=i.join("/")}if(isFinite(this.maxDepth)&&i.length>this.maxDepth)return this.warn("TAR_ENTRY_ERROR","path excessively deep",{entry:t,path:e,depth:i.length,maxDepth:this.maxDepth}),!1;if(!this[ps](t,"path")||!this[ps](t,"linkpath"))return!1;if(R.isAbsolute(t.path)?t.absolute=f(R.resolve(t.path)):t.absolute=f(R.resolve(this.cwd,t.path)),!this.preservePaths&&typeof t.absolute=="string"&&t.absolute.indexOf(this.cwd+"/")!==0&&t.absolute!==this.cwd)return this.warn("TAR_ENTRY_ERROR","path escaped extraction target",{entry:t,path:f(t.path),resolvedPath:t.absolute,cwd:this.cwd}),!1;if(t.absolute===this.cwd&&t.type!=="Directory"&&t.type!=="GNUDumpDir")return!1;if(this.win32){let{root:r}=R.win32.parse(String(t.absolute));t.absolute=r+$i(String(t.absolute).slice(r.length));let{root:n}=R.win32.parse(t.path);t.path=n+$i(t.path.slice(n.length))}return!0}[Sr](t){if(!this[_r](t))return t.resume();switch(io.equal(typeof t.absolute,"string"),t.type){case"Directory":case"GNUDumpDir":t.mode&&(t.mode=t.mode|448);case"File":case"OldFile":case"ContiguousFile":case"Link":case"SymbolicLink":return this[Ss](t);default:return this[gr](t)}}[O](t,e){t.name==="CwdError"?this.emit("error",t):(this.warn("TAR_ENTRY_ERROR",t,{entry:e}),this[Xt](),e.resume())}[St](t,e,i){fr(f(t),{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cwd:this.cwd,mode:e},i)}[Re](t){return this.forceChown||this.preserveOwner&&(typeof t.uid=="number"&&t.uid!==this.processUid||typeof t.gid=="number"&&t.gid!==this.processGid)||typeof this.uid=="number"&&this.uid!==this.processUid||typeof this.gid=="number"&&this.gid!==this.processGid}[be](t){return Tr(this.uid,t.uid,this.processUid)}[ge](t){return Tr(this.gid,t.gid,this.processGid)}[Rs](t,e){let i=typeof t.mode=="number"?t.mode&4095:this.fmode,r=new tt(String(t.absolute),{flags:ls(t.size),mode:i,autoClose:!1});r.on("error",a=>{r.fd&&u.close(r.fd,()=>{}),r.write=()=>!0,this[O](a,t),e()});let n=1,o=a=>{if(a){r.fd&&u.close(r.fd,()=>{}),this[O](a,t),e();return}--n===0&&r.fd!==void 0&&u.close(r.fd,l=>{l?this[O](l,t):this[Xt](),e()})};r.on("finish",()=>{let a=String(t.absolute),l=r.fd;if(typeof l=="number"&&t.mtime&&!this.noMtime){n++;let c=t.atime||new Date,d=t.mtime;u.futimes(l,c,d,S=>S?u.utimes(a,c,d,T=>o(T&&S)):o())}if(typeof l=="number"&&this[Re](t)){n++;let c=this[be](t),d=this[ge](t);typeof c=="number"&&typeof d=="number"&&u.fchown(l,c,d,S=>S?u.chown(a,c,d,T=>o(T&&S)):o())}o()});let h=this.transform&&this.transform(t)||t;h!==t&&(h.on("error",a=>{this[O](a,t),e()}),t.pipe(h)),h.pipe(r)}[bs](t,e){let i=typeof t.mode=="number"?t.mode&4095:this.dmode;this[St](String(t.absolute),i,r=>{if(r){this[O](r,t),e();return}let n=1,o=()=>{--n===0&&(e(),this[Xt](),t.resume())};t.mtime&&!this.noMtime&&(n++,u.utimes(String(t.absolute),t.atime||new Date,t.mtime,o)),this[Re](t)&&(n++,u.chown(String(t.absolute),Number(this[be](t)),Number(this[ge](t)),o)),o()})}[gr](t){t.unsupported=!0,this.warn("TAR_ENTRY_UNSUPPORTED",`unsupported entry type: ${t.type}`,{entry:t}),t.resume()}[Rr](t,e){let i=f(R.relative(this.cwd,R.resolve(R.dirname(String(t.absolute)),String(t.linkpath)))).split("/");this[ye](t,this.cwd,i,()=>this[wi](t,String(t.linkpath),"symlink",e),r=>{this[O](r,t),e()})}[br](t,e){let i=f(R.resolve(this.cwd,String(t.linkpath))),r=f(String(t.linkpath)).split("/");this[ye](t,this.cwd,r,()=>this[wi](t,i,"link",e),n=>{this[O](n,t),e()})}[ye](t,e,i,r,n){let o=i.shift();if(this.preservePaths||o===void 0)return r();let h=R.resolve(e,o);u.lstat(h,(a,l)=>{if(a)return r();if(l?.isSymbolicLink())return n(new wt(h,R.resolve(h,i.join("/"))));this[ye](t,h,i,r,n)})}[Or](){this[Ei]++}[Xt](){this[Ei]--,this[ws]()}[gs](t){this[Xt](),t.resume()}[ys](t,e){return t.type==="File"&&!this.unlink&&e.isFile()&&e.nlink<=1&&!Oe}[Ss](t){this[Or]();let e=[t.path];t.linkpath&&e.push(t.linkpath),this.reservations.reserve(e,i=>this[yr](t,i))}[yr](t,e){let i=h=>{e(h)},r=()=>{this[St](this.cwd,this.dmode,h=>{if(h){this[O](h,t),i();return}this[_e]=!0,n()})},n=()=>{if(t.absolute!==this.cwd){let h=f(R.dirname(String(t.absolute)));if(h!==this.cwd)return this[St](h,this.dmode,a=>{if(a){this[O](a,t),i();return}o()})}o()},o=()=>{u.lstat(String(t.absolute),(h,a)=>{if(a&&(this.keep||this.newer&&a.mtime>(t.mtime??a.mtime))){this[gs](t),i();return}if(h||this[ys](t,a))return this[P](null,t,i);if(a.isDirectory()){if(t.type==="Directory"){let l=this.chmod&&t.mode&&(a.mode&4095)!==t.mode,c=d=>this[P](d??null,t,i);return l?u.chmod(String(t.absolute),Number(t.mode),c):c()}if(t.absolute!==this.cwd)return u.rmdir(String(t.absolute),l=>this[P](l??null,t,i))}if(t.absolute===this.cwd)return this[P](null,t,i);no(String(t.absolute),l=>this[P](l??null,t,i))})};this[_e]?n():r()}[P](t,e,i){if(t){this[O](t,e),i();return}switch(e.type){case"File":case"OldFile":case"ContiguousFile":return this[Rs](e,i);case"Link":return this[br](e,i);case"SymbolicLink":return this[Rr](e,i);case"Directory":case"GNUDumpDir":return this[bs](e,i)}}[wi](t,e,i,r){u[i](e,String(t.absolute),n=>{n?this[O](n,t):(this[Xt](),t.resume()),r()})}},Se=s=>{try{return[null,s()]}catch(t){return[t,null]}},Te=class extends qt{sync=!0;[P](t,e){return super[P](t,e,()=>{})}[Ss](t){if(!this[_e]){let n=this[St](this.cwd,this.dmode);if(n)return this[O](n,t);this[_e]=!0}if(t.absolute!==this.cwd){let n=f(R.dirname(String(t.absolute)));if(n!==this.cwd){let o=this[St](n,this.dmode);if(o)return this[O](o,t)}}let[e,i]=Se(()=>u.lstatSync(String(t.absolute)));if(i&&(this.keep||this.newer&&i.mtime>(t.mtime??i.mtime)))return this[gs](t);if(e||this[ys](t,i))return this[P](null,t);if(i.isDirectory()){if(t.type==="Directory"){let o=this.chmod&&t.mode&&(i.mode&4095)!==t.mode,[h]=o?Se(()=>{u.chmodSync(String(t.absolute),Number(t.mode))}):[];return this[P](h,t)}let[n]=Se(()=>u.rmdirSync(String(t.absolute)));this[P](n,t)}let[r]=t.absolute===this.cwd?[]:Se(()=>oo(String(t.absolute)));this[P](r,t)}[Rs](t,e){let i=typeof t.mode=="number"?t.mode&4095:this.fmode,r=h=>{let a;try{u.closeSync(n)}catch(l){a=l}(h||a)&&this[O](h||a,t),e()},n;try{n=u.openSync(String(t.absolute),ls(t.size),i)}catch(h){return r(h)}let o=this.transform&&this.transform(t)||t;o!==t&&(o.on("error",h=>this[O](h,t)),t.pipe(o)),o.on("data",h=>{try{u.writeSync(n,h,0,h.length)}catch(a){r(a)}}),o.on("end",()=>{let h=null;if(t.mtime&&!this.noMtime){let a=t.atime||new Date,l=t.mtime;try{u.futimesSync(n,a,l)}catch(c){try{u.utimesSync(String(t.absolute),a,l)}catch{h=c}}}if(this[Re](t)){let a=this[be](t),l=this[ge](t);try{u.fchownSync(n,Number(a),Number(l))}catch(c){try{u.chownSync(String(t.absolute),Number(a),Number(l))}catch{h=h||c}}}r(h)})}[bs](t,e){let i=typeof t.mode=="number"?t.mode&4095:this.dmode,r=this[St](String(t.absolute),i);if(r){this[O](r,t),e();return}if(t.mtime&&!this.noMtime)try{u.utimesSync(String(t.absolute),t.atime||new Date,t.mtime)}catch{}if(this[Re](t))try{u.chownSync(String(t.absolute),Number(this[be](t)),Number(this[ge](t)))}catch{}e(),t.resume()}[St](t,e){try{return ur(f(t),{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cwd:this.cwd,mode:e})}catch(i){return i}}[ye](t,e,i,r,n){if(this.preservePaths||!i.length)return r();let o=e;for(let h of i){o=R.resolve(o,h);let[a,l]=Se(()=>u.lstatSync(o));if(a)return r();if(l.isSymbolicLink())return n(new wt(o,R.resolve(e,i.join("/"))))}r()}[wi](t,e,i,r){let n=`${i}Sync`;try{u[n](e,String(t.absolute)),r(),t.resume()}catch(o){return this[O](o,t)}}};var ho=s=>{let t=new Te(s),e=s.file,i=Lr.statSync(e),r=s.maxReadSize||16*1024*1024;new ve(e,{readSize:r,size:i.size}).pipe(t)},ao=(s,t)=>{let e=new qt(s),i=s.maxReadSize||16*1024*1024,r=s.file;return new Promise((o,h)=>{e.on("error",h),e.on("close",o),Lr.stat(r,(a,l)=>{if(a)h(a);else{let c=new gt(r,{readSize:i,size:l.size});c.on("error",h),c.pipe(e)}})})},lo=K(ho,ao,s=>new Te(s),s=>new qt(s),(s,t)=>{t?.length&&Yi(s,t)});import v from"node:fs";import Nr from"node:path";var co=(s,t)=>{let e=new kt(s),i=!0,r,n;try{try{r=v.openSync(s.file,"r+")}catch(a){if(a?.code==="ENOENT")r=v.openSync(s.file,"w+");else throw a}let o=v.fstatSync(r),h=Buffer.alloc(512);t:for(n=0;n<o.size;n+=512){for(let c=0,d=0;c<512;c+=d){if(d=v.readSync(r,h,c,h.length-c,n+c),n===0&&h[0]===31&&h[1]===139)throw new Error("cannot append to compressed archives");if(!d)break t}let a=new F(h);if(!a.cksumValid)break;let l=512*Math.ceil((a.size||0)/512);if(n+l+512>o.size)break;n+=l,s.mtimeCache&&a.mtime&&s.mtimeCache.set(String(a.path),a.mtime)}i=!1,fo(s,e,n,r,t)}finally{if(i)try{v.closeSync(r)}catch{}}},fo=(s,t,e,i,r)=>{let n=new Wt(s.file,{fd:i,start:e});t.pipe(n),mo(t,r)},uo=(s,t)=>{t=Array.from(t);let e=new Et(s),i=(n,o,h)=>{let a=(T,N)=>{T?v.close(n,E=>h(T)):h(null,N)},l=0;if(o===0)return a(null,0);let c=0,d=Buffer.alloc(512),S=(T,N)=>{if(T||typeof N>"u")return a(T);if(c+=N,c<512&&N)return v.read(n,d,c,d.length-c,l+c,S);if(l===0&&d[0]===31&&d[1]===139)return a(new Error("cannot append to compressed archives"));if(c<512)return a(null,l);let E=new F(d);if(!E.cksumValid)return a(null,l);let x=512*Math.ceil((E.size??0)/512);if(l+x+512>o||(l+=x+512,l>=o))return a(null,l);s.mtimeCache&&E.mtime&&s.mtimeCache.set(String(E.path),E.mtime),c=0,v.read(n,d,0,512,l,S)};v.read(n,d,0,512,l,S)};return new Promise((n,o)=>{e.on("error",o);let h="r+",a=(l,c)=>{if(l&&l.code==="ENOENT"&&h==="r+")return h="w+",v.open(s.file,h,a);if(l||!c)return o(l);v.fstat(c,(d,S)=>{if(d)return v.close(c,()=>o(d));i(c,S.size,(T,N)=>{if(T)return o(T);let E=new tt(s.file,{fd:c,start:N});e.pipe(E),E.on("error",o),E.on("close",n),po(e,t)})})};v.open(s.file,h,a)})},mo=(s,t)=>{t.forEach(e=>{e.charAt(0)==="@"?It({file:Nr.resolve(s.cwd,e.slice(1)),sync:!0,noResume:!0,onReadEntry:i=>s.add(i)}):s.add(e)}),s.end()},po=async(s,t)=>{for(let e=0;e<t.length;e++){let i=String(t[e]);i.charAt(0)==="@"?await It({file:Nr.resolve(String(s.cwd),i.slice(1)),noResume:!0,onReadEntry:r=>s.add(r)}):s.add(i)}s.end()},vt=K(co,uo,()=>{throw new TypeError("file is required")},()=>{throw new TypeError("file is required")},(s,t)=>{if(!ks(s))throw new TypeError("file is required");if(s.gzip||s.brotli||s.zstd||s.file.endsWith(".br")||s.file.endsWith(".tbr"))throw new TypeError("cannot append to compressed archives");if(!t?.length)throw new TypeError("no paths specified to add/replace")});var Eo=K(vt.syncFile,vt.asyncFile,vt.syncNoFile,vt.asyncNoFile,(s,t=[])=>{vt.validate?.(s,t),wo(s)}),wo=s=>{let t=s.filter;s.mtimeCache||(s.mtimeCache=new Map),s.filter=t?(e,i)=>t(e,i)&&!((s.mtimeCache?.get(e)??i.mtime??0)>(i.mtime??0)):(e,i)=>!((s.mtimeCache?.get(e)??i.mtime??0)>(i.mtime??0))};export{F as Header,Et as Pack,fi as PackJob,kt as PackSync,st as Parser,ct as Pax,Yt as ReadEntry,qt as Unpack,Te as UnpackSync,de as WriteEntry,ii as WriteEntrySync,si as WriteEntryTar,zn as c,zn as create,lo as extract,Yi as filesFilter,It as list,vt as r,vt as replace,It as t,Mi as types,Eo as u,Eo as update,lo as x}; +`).reduce(pn,Object.create(null)),pn=(s,t)=>{let e=parseInt(t,10);if(e!==Buffer.byteLength(t)+1)return s;t=t.slice((e+" ").length);let i=t.split("="),r=i.shift();if(!r)return s;let n=r.replace(/^SCHILY\.(dev|ino|nlink)/,"$1"),o=i.join("=");return s[n]=/^([A-Z]+\.)?([mac]|birth|creation)time$/.test(n)?new Date(Number(o)*1e3):/^[0-9]+$/.test(o)?+o:o,s};var En=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform,f=En!=="win32"?s=>s:s=>s&&s.replace(/\\/g,"/");var Yt=class extends A{extended;globalExtended;header;startBlockSize;blockRemain;remain;type;meta=!1;ignore=!1;path;mode;uid;gid;uname;gname;size=0;mtime;atime;ctime;linkpath;dev;ino;nlink;invalid=!1;absolute;unsupported=!1;constructor(t,e,i){switch(super({}),this.pause(),this.extended=e,this.globalExtended=i,this.header=t,this.remain=t.size??0,this.startBlockSize=512*Math.ceil(this.remain/512),this.blockRemain=this.startBlockSize,this.type=t.type,this.type){case"File":case"OldFile":case"Link":case"SymbolicLink":case"CharacterDevice":case"BlockDevice":case"Directory":case"FIFO":case"ContiguousFile":case"GNUDumpDir":break;case"NextFileHasLongLinkpath":case"NextFileHasLongPath":case"OldGnuLongPath":case"GlobalExtendedHeader":case"ExtendedHeader":case"OldExtendedHeader":this.meta=!0;break;default:this.ignore=!0}if(!t.path)throw new Error("no path provided for tar.ReadEntry");this.path=f(t.path),this.mode=t.mode,this.mode&&(this.mode=this.mode&4095),this.uid=t.uid,this.gid=t.gid,this.uname=t.uname,this.gname=t.gname,this.size=this.remain,this.mtime=t.mtime,this.atime=t.atime,this.ctime=t.ctime,this.linkpath=t.linkpath?f(t.linkpath):void 0,this.uname=t.uname,this.gname=t.gname,e&&this.#t(e),i&&this.#t(i,!0)}write(t){let e=t.length;if(e>this.blockRemain)throw new Error("writing more to entry than is appropriate");let i=this.remain,r=this.blockRemain;return this.remain=Math.max(0,i-e),this.blockRemain=Math.max(0,r-e),this.ignore?!0:i>=e?super.write(t):super.write(t.subarray(0,i))}#t(t,e=!1){t.path&&(t.path=f(t.path)),t.linkpath&&(t.linkpath=f(t.linkpath)),Object.assign(this,Object.fromEntries(Object.entries(t).filter(([i,r])=>!(r==null||i==="path"&&e))))}};var Lt=(s,t,e,i={})=>{s.file&&(i.file=s.file),s.cwd&&(i.cwd=s.cwd),i.code=e instanceof Error&&e.code||t,i.tarCode=t,!s.strict&&i.recoverable!==!1?(e instanceof Error&&(i=Object.assign(e,i),e=e.message),s.emit("warn",t,e,i)):e instanceof Error?s.emit("error",Object.assign(e,i)):s.emit("error",Object.assign(new Error(`${t}: ${e}`),i))};var Sn=1024*1024,Gi=Buffer.from([31,139]),Zi=Buffer.from([40,181,47,253]),yn=Math.max(Gi.length,Zi.length),B=Symbol("state"),Nt=Symbol("writeEntry"),et=Symbol("readEntry"),zi=Symbol("nextEntry"),Hs=Symbol("processEntry"),V=Symbol("extendedHeader"),ae=Symbol("globalExtendedHeader"),ft=Symbol("meta"),Ws=Symbol("emitMeta"),p=Symbol("buffer"),it=Symbol("queue"),dt=Symbol("ended"),Ui=Symbol("emittedEnd"),Dt=Symbol("emit"),y=Symbol("unzip"),Ke=Symbol("consumeChunk"),Ve=Symbol("consumeChunkSub"),Hi=Symbol("consumeBody"),Gs=Symbol("consumeMeta"),Zs=Symbol("consumeHeader"),le=Symbol("consuming"),Wi=Symbol("bufferConcat"),$e=Symbol("maybeEnd"),Kt=Symbol("writing"),ut=Symbol("aborted"),Xe=Symbol("onDone"),At=Symbol("sawValidEntry"),qe=Symbol("sawNullBlock"),je=Symbol("sawEOF"),Ys=Symbol("closeStream"),Rn=()=>!0,st=class extends wn{file;strict;maxMetaEntrySize;filter;brotli;zstd;writable=!0;readable=!1;[it]=[];[p];[et];[Nt];[B]="begin";[ft]="";[V];[ae];[dt]=!1;[y];[ut]=!1;[At];[qe]=!1;[je]=!1;[Kt]=!1;[le]=!1;[Ui]=!1;constructor(t={}){super(),this.file=t.file||"",this.on(Xe,()=>{(this[B]==="begin"||this[At]===!1)&&this.warn("TAR_BAD_ARCHIVE","Unrecognized archive format")}),t.ondone?this.on(Xe,t.ondone):this.on(Xe,()=>{this.emit("prefinish"),this.emit("finish"),this.emit("end")}),this.strict=!!t.strict,this.maxMetaEntrySize=t.maxMetaEntrySize||Sn,this.filter=typeof t.filter=="function"?t.filter:Rn;let e=t.file&&(t.file.endsWith(".tar.br")||t.file.endsWith(".tbr"));this.brotli=!(t.gzip||t.zstd)&&t.brotli!==void 0?t.brotli:e?void 0:!1;let i=t.file&&(t.file.endsWith(".tar.zst")||t.file.endsWith(".tzst"));this.zstd=!(t.gzip||t.brotli)&&t.zstd!==void 0?t.zstd:i?!0:void 0,this.on("end",()=>this[Ys]()),typeof t.onwarn=="function"&&this.on("warn",t.onwarn),typeof t.onReadEntry=="function"&&this.on("entry",t.onReadEntry)}warn(t,e,i={}){Lt(this,t,e,i)}[Zs](t,e){this[At]===void 0&&(this[At]=!1);let i;try{i=new F(t,e,this[V],this[ae])}catch(r){return this.warn("TAR_ENTRY_INVALID",r)}if(i.nullBlock)this[qe]?(this[je]=!0,this[B]==="begin"&&(this[B]="header"),this[Dt]("eof")):(this[qe]=!0,this[Dt]("nullBlock"));else if(this[qe]=!1,!i.cksumValid)this.warn("TAR_ENTRY_INVALID","checksum failure",{header:i});else if(!i.path)this.warn("TAR_ENTRY_INVALID","path is required",{header:i});else{let r=i.type;if(/^(Symbolic)?Link$/.test(r)&&!i.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath required",{header:i});else if(!/^(Symbolic)?Link$/.test(r)&&!/^(Global)?ExtendedHeader$/.test(r)&&i.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath forbidden",{header:i});else{let n=this[Nt]=new Yt(i,this[V],this[ae]);if(!this[At])if(n.remain){let o=()=>{n.invalid||(this[At]=!0)};n.on("end",o)}else this[At]=!0;n.meta?n.size>this.maxMetaEntrySize?(n.ignore=!0,this[Dt]("ignoredEntry",n),this[B]="ignore",n.resume()):n.size>0&&(this[ft]="",n.on("data",o=>this[ft]+=o),this[B]="meta"):(this[V]=void 0,n.ignore=n.ignore||!this.filter(n.path,n),n.ignore?(this[Dt]("ignoredEntry",n),this[B]=n.remain?"ignore":"header",n.resume()):(n.remain?this[B]="body":(this[B]="header",n.end()),this[et]?this[it].push(n):(this[it].push(n),this[zi]())))}}}[Ys](){queueMicrotask(()=>this.emit("close"))}[Hs](t){let e=!0;if(!t)this[et]=void 0,e=!1;else if(Array.isArray(t)){let[i,...r]=t;this.emit(i,...r)}else this[et]=t,this.emit("entry",t),t.emittedEnd||(t.on("end",()=>this[zi]()),e=!1);return e}[zi](){do;while(this[Hs](this[it].shift()));if(!this[it].length){let t=this[et];!t||t.flowing||t.size===t.remain?this[Kt]||this.emit("drain"):t.once("drain",()=>this.emit("drain"))}}[Hi](t,e){let i=this[Nt];if(!i)throw new Error("attempt to consume body without entry??");let r=i.blockRemain??0,n=r>=t.length&&e===0?t:t.subarray(e,e+r);return i.write(n),i.blockRemain||(this[B]="header",this[Nt]=void 0,i.end()),n.length}[Gs](t,e){let i=this[Nt],r=this[Hi](t,e);return!this[Nt]&&i&&this[Ws](i),r}[Dt](t,e,i){!this[it].length&&!this[et]?this.emit(t,e,i):this[it].push([t,e,i])}[Ws](t){switch(this[Dt]("meta",this[ft]),t.type){case"ExtendedHeader":case"OldExtendedHeader":this[V]=ct.parse(this[ft],this[V],!1);break;case"GlobalExtendedHeader":this[ae]=ct.parse(this[ft],this[ae],!0);break;case"NextFileHasLongPath":case"OldGnuLongPath":{let e=this[V]??Object.create(null);this[V]=e,e.path=this[ft].replace(/\0.*/,"");break}case"NextFileHasLongLinkpath":{let e=this[V]||Object.create(null);this[V]=e,e.linkpath=this[ft].replace(/\0.*/,"");break}default:throw new Error("unknown meta: "+t.type)}}abort(t){this[ut]=!0,this.emit("abort",t),this.warn("TAR_ABORT",t,{recoverable:!1})}write(t,e,i){if(typeof e=="function"&&(i=e,e=void 0),typeof t=="string"&&(t=Buffer.from(t,typeof e=="string"?e:"utf8")),this[ut])return i?.(),!1;if((this[y]===void 0||this.brotli===void 0&&this[y]===!1)&&t){if(this[p]&&(t=Buffer.concat([this[p],t]),this[p]=void 0),t.length<yn)return this[p]=t,i?.(),!0;for(let a=0;this[y]===void 0&&a<Gi.length;a++)t[a]!==Gi[a]&&(this[y]=!1);let o=!1;if(this[y]===!1&&this.zstd!==!1){o=!0;for(let a=0;a<Zi.length;a++)if(t[a]!==Zi[a]){o=!1;break}}let h=this.brotli===void 0&&!o;if(this[y]===!1&&h)if(t.length<512)if(this[dt])this.brotli=!0;else return this[p]=t,i?.(),!0;else try{new F(t.subarray(0,512)),this.brotli=!1}catch{this.brotli=!0}if(this[y]===void 0||this[y]===!1&&(this.brotli||o)){let a=this[dt];this[dt]=!1,this[y]=this[y]===void 0?new Pe({}):o?new Ze({}):new He({}),this[y].on("data",c=>this[Ke](c)),this[y].on("error",c=>this.abort(c)),this[y].on("end",()=>{this[dt]=!0,this[Ke]()}),this[Kt]=!0;let l=!!this[y][a?"end":"write"](t);return this[Kt]=!1,i?.(),l}}this[Kt]=!0,this[y]?this[y].write(t):this[Ke](t),this[Kt]=!1;let n=this[it].length?!1:this[et]?this[et].flowing:!0;return!n&&!this[it].length&&this[et]?.once("drain",()=>this.emit("drain")),i?.(),n}[Wi](t){t&&!this[ut]&&(this[p]=this[p]?Buffer.concat([this[p],t]):t)}[$e](){if(this[dt]&&!this[Ui]&&!this[ut]&&!this[le]){this[Ui]=!0;let t=this[Nt];if(t&&t.blockRemain){let e=this[p]?this[p].length:0;this.warn("TAR_BAD_ARCHIVE",`Truncated input (needed ${t.blockRemain} more bytes, only ${e} available)`,{entry:t}),this[p]&&t.write(this[p]),t.end()}this[Dt](Xe)}}[Ke](t){if(this[le]&&t)this[Wi](t);else if(!t&&!this[p])this[$e]();else if(t){if(this[le]=!0,this[p]){this[Wi](t);let e=this[p];this[p]=void 0,this[Ve](e)}else this[Ve](t);for(;this[p]&&this[p]?.length>=512&&!this[ut]&&!this[je];){let e=this[p];this[p]=void 0,this[Ve](e)}this[le]=!1}(!this[p]||this[dt])&&this[$e]()}[Ve](t){let e=0,i=t.length;for(;e+512<=i&&!this[ut]&&!this[je];)switch(this[B]){case"begin":case"header":this[Zs](t,e),e+=512;break;case"ignore":case"body":e+=this[Hi](t,e);break;case"meta":e+=this[Gs](t,e);break;default:throw new Error("invalid state: "+this[B])}e<i&&(this[p]?this[p]=Buffer.concat([t.subarray(e),this[p]]):this[p]=t.subarray(e))}end(t,e,i){return typeof t=="function"&&(i=t,e=void 0,t=void 0),typeof e=="function"&&(i=e,e=void 0),typeof t=="string"&&(t=Buffer.from(t,e)),i&&this.once("finish",i),this[ut]||(this[y]?(t&&this[y].write(t),this[y].end()):(this[dt]=!0,(this.brotli===void 0||this.zstd===void 0)&&(t=t||Buffer.alloc(0)),t&&this.write(t),this[$e]())),this}};var mt=s=>{let t=s.length-1,e=-1;for(;t>-1&&s.charAt(t)==="/";)e=t,t--;return e===-1?s:s.slice(0,e)};var _n=s=>{let t=s.onReadEntry;s.onReadEntry=t?e=>{t(e),e.resume()}:e=>e.resume()},Yi=(s,t)=>{let e=new Map(t.map(n=>[mt(n),!0])),i=s.filter,r=(n,o="")=>{let h=o||gn(n).root||".",a;if(n===h)a=!1;else{let l=e.get(n);l!==void 0?a=l:a=r(bn(n),h)}return e.set(n,a),a};s.filter=i?(n,o)=>i(n,o)&&r(mt(n)):n=>r(mt(n))},On=s=>{let t=new st(s),e=s.file,i;try{i=Vt.openSync(e,"r");let r=Vt.fstatSync(i),n=s.maxReadSize||16*1024*1024;if(r.size<n){let o=Buffer.allocUnsafe(r.size),h=Vt.readSync(i,o,0,r.size,0);t.end(h===o.byteLength?o:o.subarray(0,h))}else{let o=0,h=Buffer.allocUnsafe(n);for(;o<r.size;){let a=Vt.readSync(i,h,0,n,o);if(a===0)break;o+=a,t.write(h.subarray(0,a))}t.end()}}finally{if(typeof i=="number")try{Vt.closeSync(i)}catch{}}},Tn=(s,t)=>{let e=new st(s),i=s.maxReadSize||16*1024*1024,r=s.file;return new Promise((o,h)=>{e.on("error",h),e.on("end",o),Vt.stat(r,(a,l)=>{if(a)h(a);else{let c=new gt(r,{readSize:i,size:l.size});c.on("error",h),c.pipe(e)}})})},It=K(On,Tn,s=>new st(s),s=>new st(s),(s,t)=>{t?.length&&Yi(s,t),s.noResume||_n(s)});import ci from"fs";import $ from"fs";import Xs from"path";var Ki=(s,t,e)=>(s&=4095,e&&(s=(s|384)&-19),t&&(s&256&&(s|=64),s&32&&(s|=8),s&4&&(s|=1)),s);import{win32 as xn}from"node:path";var{isAbsolute:Ln,parse:Ks}=xn,ce=s=>{let t="",e=Ks(s);for(;Ln(s)||e.root;){let i=s.charAt(0)==="/"&&s.slice(0,4)!=="//?/"?"/":e.root;s=s.slice(i.length),t+=i,e=Ks(s)}return[t,s]};var Qe=["|","<",">","?",":"],Vi=Qe.map(s=>String.fromCharCode(61440+s.charCodeAt(0))),Nn=new Map(Qe.map((s,t)=>[s,Vi[t]])),Dn=new Map(Vi.map((s,t)=>[s,Qe[t]])),$i=s=>Qe.reduce((t,e)=>t.split(e).join(Nn.get(e)),s),Vs=s=>Vi.reduce((t,e)=>t.split(e).join(Dn.get(e)),s);var tr=(s,t)=>t?(s=f(s).replace(/^\.(\/|$)/,""),mt(t)+"/"+s):f(s),An=16*1024*1024,qs=Symbol("process"),js=Symbol("file"),Qs=Symbol("directory"),qi=Symbol("symlink"),Js=Symbol("hardlink"),fe=Symbol("header"),Je=Symbol("read"),ji=Symbol("lstat"),ti=Symbol("onlstat"),Qi=Symbol("onread"),Ji=Symbol("onreadlink"),ts=Symbol("openfile"),es=Symbol("onopenfile"),pt=Symbol("close"),ei=Symbol("mode"),is=Symbol("awaitDrain"),Xi=Symbol("ondrain"),X=Symbol("prefix"),de=class extends A{path;portable;myuid=process.getuid&&process.getuid()||0;myuser=process.env.USER||"";maxReadSize;linkCache;statCache;preservePaths;cwd;strict;mtime;noPax;noMtime;prefix;fd;blockLen=0;blockRemain=0;buf;pos=0;remain=0;length=0;offset=0;win32;absolute;header;type;linkpath;stat;onWriteEntry;#t=!1;constructor(t,e={}){let i=re(e);super(),this.path=f(t),this.portable=!!i.portable,this.maxReadSize=i.maxReadSize||An,this.linkCache=i.linkCache||new Map,this.statCache=i.statCache||new Map,this.preservePaths=!!i.preservePaths,this.cwd=f(i.cwd||process.cwd()),this.strict=!!i.strict,this.noPax=!!i.noPax,this.noMtime=!!i.noMtime,this.mtime=i.mtime,this.prefix=i.prefix?f(i.prefix):void 0,this.onWriteEntry=i.onWriteEntry,typeof i.onwarn=="function"&&this.on("warn",i.onwarn);let r=!1;if(!this.preservePaths){let[o,h]=ce(this.path);o&&typeof h=="string"&&(this.path=h,r=o)}this.win32=!!i.win32||process.platform==="win32",this.win32&&(this.path=Vs(this.path.replace(/\\/g,"/")),t=t.replace(/\\/g,"/")),this.absolute=f(i.absolute||Xs.resolve(this.cwd,t)),this.path===""&&(this.path="./"),r&&this.warn("TAR_ENTRY_INFO",`stripping ${r} from absolute path`,{entry:this,path:r+this.path});let n=this.statCache.get(this.absolute);n?this[ti](n):this[ji]()}warn(t,e,i={}){return Lt(this,t,e,i)}emit(t,...e){return t==="error"&&(this.#t=!0),super.emit(t,...e)}[ji](){$.lstat(this.absolute,(t,e)=>{if(t)return this.emit("error",t);this[ti](e)})}[ti](t){this.statCache.set(this.absolute,t),this.stat=t,t.isFile()||(t.size=0),this.type=In(t),this.emit("stat",t),this[qs]()}[qs](){switch(this.type){case"File":return this[js]();case"Directory":return this[Qs]();case"SymbolicLink":return this[qi]();default:return this.end()}}[ei](t){return Ki(t,this.type==="Directory",this.portable)}[X](t){return tr(t,this.prefix)}[fe](){if(!this.stat)throw new Error("cannot write header before stat");this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.onWriteEntry?.(this),this.header=new F({path:this[X](this.path),linkpath:this.type==="Link"&&this.linkpath!==void 0?this[X](this.linkpath):this.linkpath,mode:this[ei](this.stat.mode),uid:this.portable?void 0:this.stat.uid,gid:this.portable?void 0:this.stat.gid,size:this.stat.size,mtime:this.noMtime?void 0:this.mtime||this.stat.mtime,type:this.type==="Unsupported"?void 0:this.type,uname:this.portable?void 0:this.stat.uid===this.myuid?this.myuser:"",atime:this.portable?void 0:this.stat.atime,ctime:this.portable?void 0:this.stat.ctime}),this.header.encode()&&!this.noPax&&super.write(new ct({atime:this.portable?void 0:this.header.atime,ctime:this.portable?void 0:this.header.ctime,gid:this.portable?void 0:this.header.gid,mtime:this.noMtime?void 0:this.mtime||this.header.mtime,path:this[X](this.path),linkpath:this.type==="Link"&&this.linkpath!==void 0?this[X](this.linkpath):this.linkpath,size:this.header.size,uid:this.portable?void 0:this.header.uid,uname:this.portable?void 0:this.header.uname,dev:this.portable?void 0:this.stat.dev,ino:this.portable?void 0:this.stat.ino,nlink:this.portable?void 0:this.stat.nlink}).encode());let t=this.header?.block;if(!t)throw new Error("failed to encode header");super.write(t)}[Qs](){if(!this.stat)throw new Error("cannot create directory entry without stat");this.path.slice(-1)!=="/"&&(this.path+="/"),this.stat.size=0,this[fe](),this.end()}[qi](){$.readlink(this.absolute,(t,e)=>{if(t)return this.emit("error",t);this[Ji](e)})}[Ji](t){this.linkpath=f(t),this[fe](),this.end()}[Js](t){if(!this.stat)throw new Error("cannot create link entry without stat");this.type="Link",this.linkpath=f(Xs.relative(this.cwd,t)),this.stat.size=0,this[fe](),this.end()}[js](){if(!this.stat)throw new Error("cannot create file entry without stat");if(this.stat.nlink>1){let t=`${this.stat.dev}:${this.stat.ino}`,e=this.linkCache.get(t);if(e?.indexOf(this.cwd)===0)return this[Js](e);this.linkCache.set(t,this.absolute)}if(this[fe](),this.stat.size===0)return this.end();this[ts]()}[ts](){$.open(this.absolute,"r",(t,e)=>{if(t)return this.emit("error",t);this[es](e)})}[es](t){if(this.fd=t,this.#t)return this[pt]();if(!this.stat)throw new Error("should stat before calling onopenfile");this.blockLen=512*Math.ceil(this.stat.size/512),this.blockRemain=this.blockLen;let e=Math.min(this.blockLen,this.maxReadSize);this.buf=Buffer.allocUnsafe(e),this.offset=0,this.pos=0,this.remain=this.stat.size,this.length=this.buf.length,this[Je]()}[Je](){let{fd:t,buf:e,offset:i,length:r,pos:n}=this;if(t===void 0||e===void 0)throw new Error("cannot read file without first opening");$.read(t,e,i,r,n,(o,h)=>{if(o)return this[pt](()=>this.emit("error",o));this[Qi](h)})}[pt](t=()=>{}){this.fd!==void 0&&$.close(this.fd,t)}[Qi](t){if(t<=0&&this.remain>0){let r=Object.assign(new Error("encountered unexpected EOF"),{path:this.absolute,syscall:"read",code:"EOF"});return this[pt](()=>this.emit("error",r))}if(t>this.remain){let r=Object.assign(new Error("did not encounter expected EOF"),{path:this.absolute,syscall:"read",code:"EOF"});return this[pt](()=>this.emit("error",r))}if(!this.buf)throw new Error("should have created buffer prior to reading");if(t===this.remain)for(let r=t;r<this.length&&t<this.blockRemain;r++)this.buf[r+this.offset]=0,t++,this.remain++;let e=this.offset===0&&t===this.buf.length?this.buf:this.buf.subarray(this.offset,this.offset+t);this.write(e)?this[Xi]():this[is](()=>this[Xi]())}[is](t){this.once("drain",t)}write(t,e,i){if(typeof e=="function"&&(i=e,e=void 0),typeof t=="string"&&(t=Buffer.from(t,typeof e=="string"?e:"utf8")),this.blockRemain<t.length){let r=Object.assign(new Error("writing more data than expected"),{path:this.absolute});return this.emit("error",r)}return this.remain-=t.length,this.blockRemain-=t.length,this.pos+=t.length,this.offset+=t.length,super.write(t,null,i)}[Xi](){if(!this.remain)return this.blockRemain&&super.write(Buffer.alloc(this.blockRemain)),this[pt](t=>t?this.emit("error",t):this.end());if(!this.buf)throw new Error("buffer lost somehow in ONDRAIN");this.offset>=this.length&&(this.buf=Buffer.allocUnsafe(Math.min(this.blockRemain,this.buf.length)),this.offset=0),this.length=this.buf.length-this.offset,this[Je]()}},ii=class extends de{sync=!0;[ji](){this[ti]($.lstatSync(this.absolute))}[qi](){this[Ji]($.readlinkSync(this.absolute))}[ts](){this[es]($.openSync(this.absolute,"r"))}[Je](){let t=!0;try{let{fd:e,buf:i,offset:r,length:n,pos:o}=this;if(e===void 0||i===void 0)throw new Error("fd and buf must be set in READ method");let h=$.readSync(e,i,r,n,o);this[Qi](h),t=!1}finally{if(t)try{this[pt](()=>{})}catch{}}}[is](t){t()}[pt](t=()=>{}){this.fd!==void 0&&$.closeSync(this.fd),t()}},si=class extends A{blockLen=0;blockRemain=0;buf=0;pos=0;remain=0;length=0;preservePaths;portable;strict;noPax;noMtime;readEntry;type;prefix;path;mode;uid;gid;uname;gname;header;mtime;atime;ctime;linkpath;size;onWriteEntry;warn(t,e,i={}){return Lt(this,t,e,i)}constructor(t,e={}){let i=re(e);super(),this.preservePaths=!!i.preservePaths,this.portable=!!i.portable,this.strict=!!i.strict,this.noPax=!!i.noPax,this.noMtime=!!i.noMtime,this.onWriteEntry=i.onWriteEntry,this.readEntry=t;let{type:r}=t;if(r==="Unsupported")throw new Error("writing entry that should be ignored");this.type=r,this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.prefix=i.prefix,this.path=f(t.path),this.mode=t.mode!==void 0?this[ei](t.mode):void 0,this.uid=this.portable?void 0:t.uid,this.gid=this.portable?void 0:t.gid,this.uname=this.portable?void 0:t.uname,this.gname=this.portable?void 0:t.gname,this.size=t.size,this.mtime=this.noMtime?void 0:i.mtime||t.mtime,this.atime=this.portable?void 0:t.atime,this.ctime=this.portable?void 0:t.ctime,this.linkpath=t.linkpath!==void 0?f(t.linkpath):void 0,typeof i.onwarn=="function"&&this.on("warn",i.onwarn);let n=!1;if(!this.preservePaths){let[h,a]=ce(this.path);h&&typeof a=="string"&&(this.path=a,n=h)}this.remain=t.size,this.blockRemain=t.startBlockSize,this.onWriteEntry?.(this),this.header=new F({path:this[X](this.path),linkpath:this.type==="Link"&&this.linkpath!==void 0?this[X](this.linkpath):this.linkpath,mode:this.mode,uid:this.portable?void 0:this.uid,gid:this.portable?void 0:this.gid,size:this.size,mtime:this.noMtime?void 0:this.mtime,type:this.type,uname:this.portable?void 0:this.uname,atime:this.portable?void 0:this.atime,ctime:this.portable?void 0:this.ctime}),n&&this.warn("TAR_ENTRY_INFO",`stripping ${n} from absolute path`,{entry:this,path:n+this.path}),this.header.encode()&&!this.noPax&&super.write(new ct({atime:this.portable?void 0:this.atime,ctime:this.portable?void 0:this.ctime,gid:this.portable?void 0:this.gid,mtime:this.noMtime?void 0:this.mtime,path:this[X](this.path),linkpath:this.type==="Link"&&this.linkpath!==void 0?this[X](this.linkpath):this.linkpath,size:this.size,uid:this.portable?void 0:this.uid,uname:this.portable?void 0:this.uname,dev:this.portable?void 0:this.readEntry.dev,ino:this.portable?void 0:this.readEntry.ino,nlink:this.portable?void 0:this.readEntry.nlink}).encode());let o=this.header?.block;if(!o)throw new Error("failed to encode header");super.write(o),t.pipe(this)}[X](t){return tr(t,this.prefix)}[ei](t){return Ki(t,this.type==="Directory",this.portable)}write(t,e,i){typeof e=="function"&&(i=e,e=void 0),typeof t=="string"&&(t=Buffer.from(t,typeof e=="string"?e:"utf8"));let r=t.length;if(r>this.blockRemain)throw new Error("writing more to entry than is appropriate");return this.blockRemain-=r,super.write(t,i)}end(t,e,i){return this.blockRemain&&super.write(Buffer.alloc(this.blockRemain)),typeof t=="function"&&(i=t,e=void 0,t=void 0),typeof e=="function"&&(i=e,e=void 0),typeof t=="string"&&(t=Buffer.from(t,e??"utf8")),i&&this.once("finish",i),t?super.end(t,i):super.end(i),this}},In=s=>s.isFile()?"File":s.isDirectory()?"Directory":s.isSymbolicLink()?"SymbolicLink":"Unsupported";var ri=class s{tail;head;length=0;static create(t=[]){return new s(t)}constructor(t=[]){for(let e of t)this.push(e)}*[Symbol.iterator](){for(let t=this.head;t;t=t.next)yield t.value}removeNode(t){if(t.list!==this)throw new Error("removing node which does not belong to this list");let e=t.next,i=t.prev;return e&&(e.prev=i),i&&(i.next=e),t===this.head&&(this.head=e),t===this.tail&&(this.tail=i),this.length--,t.next=void 0,t.prev=void 0,t.list=void 0,e}unshiftNode(t){if(t===this.head)return;t.list&&t.list.removeNode(t);let e=this.head;t.list=this,t.next=e,e&&(e.prev=t),this.head=t,this.tail||(this.tail=t),this.length++}pushNode(t){if(t===this.tail)return;t.list&&t.list.removeNode(t);let e=this.tail;t.list=this,t.prev=e,e&&(e.next=t),this.tail=t,this.head||(this.head=t),this.length++}push(...t){for(let e=0,i=t.length;e<i;e++)Fn(this,t[e]);return this.length}unshift(...t){for(var e=0,i=t.length;e<i;e++)kn(this,t[e]);return this.length}pop(){if(!this.tail)return;let t=this.tail.value,e=this.tail;return this.tail=this.tail.prev,this.tail?this.tail.next=void 0:this.head=void 0,e.list=void 0,this.length--,t}shift(){if(!this.head)return;let t=this.head.value,e=this.head;return this.head=this.head.next,this.head?this.head.prev=void 0:this.tail=void 0,e.list=void 0,this.length--,t}forEach(t,e){e=e||this;for(let i=this.head,r=0;i;r++)t.call(e,i.value,r,this),i=i.next}forEachReverse(t,e){e=e||this;for(let i=this.tail,r=this.length-1;i;r--)t.call(e,i.value,r,this),i=i.prev}get(t){let e=0,i=this.head;for(;i&&e<t;e++)i=i.next;if(e===t&&i)return i.value}getReverse(t){let e=0,i=this.tail;for(;i&&e<t;e++)i=i.prev;if(e===t&&i)return i.value}map(t,e){e=e||this;let i=new s;for(let r=this.head;r;)i.push(t.call(e,r.value,this)),r=r.next;return i}mapReverse(t,e){e=e||this;var i=new s;for(let r=this.tail;r;)i.push(t.call(e,r.value,this)),r=r.prev;return i}reduce(t,e){let i,r=this.head;if(arguments.length>1)i=e;else if(this.head)r=this.head.next,i=this.head.value;else throw new TypeError("Reduce of empty list with no initial value");for(var n=0;r;n++)i=t(i,r.value,n),r=r.next;return i}reduceReverse(t,e){let i,r=this.tail;if(arguments.length>1)i=e;else if(this.tail)r=this.tail.prev,i=this.tail.value;else throw new TypeError("Reduce of empty list with no initial value");for(let n=this.length-1;r;n--)i=t(i,r.value,n),r=r.prev;return i}toArray(){let t=new Array(this.length);for(let e=0,i=this.head;i;e++)t[e]=i.value,i=i.next;return t}toArrayReverse(){let t=new Array(this.length);for(let e=0,i=this.tail;i;e++)t[e]=i.value,i=i.prev;return t}slice(t=0,e=this.length){e<0&&(e+=this.length),t<0&&(t+=this.length);let i=new s;if(e<t||e<0)return i;t<0&&(t=0),e>this.length&&(e=this.length);let r=this.head,n=0;for(n=0;r&&n<t;n++)r=r.next;for(;r&&n<e;n++,r=r.next)i.push(r.value);return i}sliceReverse(t=0,e=this.length){e<0&&(e+=this.length),t<0&&(t+=this.length);let i=new s;if(e<t||e<0)return i;t<0&&(t=0),e>this.length&&(e=this.length);let r=this.length,n=this.tail;for(;n&&r>e;r--)n=n.prev;for(;n&&r>t;r--,n=n.prev)i.push(n.value);return i}splice(t,e=0,...i){t>this.length&&(t=this.length-1),t<0&&(t=this.length+t);let r=this.head;for(let o=0;r&&o<t;o++)r=r.next;let n=[];for(let o=0;r&&o<e;o++)n.push(r.value),r=this.removeNode(r);r?r!==this.tail&&(r=r.prev):r=this.tail;for(let o of i)r=Cn(this,r,o);return n}reverse(){let t=this.head,e=this.tail;for(let i=t;i;i=i.prev){let r=i.prev;i.prev=i.next,i.next=r}return this.head=e,this.tail=t,this}};function Cn(s,t,e){let i=t,r=t?t.next:s.head,n=new ue(e,i,r,s);return n.next===void 0&&(s.tail=n),n.prev===void 0&&(s.head=n),s.length++,n}function Fn(s,t){s.tail=new ue(t,s.tail,void 0,s),s.head||(s.head=s.tail),s.length++}function kn(s,t){s.head=new ue(t,void 0,s.head,s),s.tail||(s.tail=s.head),s.length++}var ue=class{list;next;prev;value;constructor(t,e,i,r){this.list=r,this.value=t,e?(e.next=this,this.prev=e):this.prev=void 0,i?(i.prev=this,this.next=i):this.next=void 0}};import rr from"path";var fi=class{path;absolute;entry;stat;readdir;pending=!1;ignore=!1;piped=!1;constructor(t,e){this.path=t||"./",this.absolute=e}},er=Buffer.alloc(1024),ni=Symbol("onStat"),me=Symbol("ended"),W=Symbol("queue"),Ct=Symbol("current"),Ft=Symbol("process"),pe=Symbol("processing"),ss=Symbol("processJob"),G=Symbol("jobs"),rs=Symbol("jobDone"),oi=Symbol("addFSEntry"),ir=Symbol("addTarEntry"),hs=Symbol("stat"),as=Symbol("readdir"),hi=Symbol("onreaddir"),ai=Symbol("pipe"),sr=Symbol("entry"),ns=Symbol("entryOpt"),li=Symbol("writeEntryClass"),nr=Symbol("write"),os=Symbol("ondrain"),Et=class extends A{sync=!1;opt;cwd;maxReadSize;preservePaths;strict;noPax;prefix;linkCache;statCache;file;portable;zip;readdirCache;noDirRecurse;follow;noMtime;mtime;filter;jobs;[li];onWriteEntry;[W];[G]=0;[pe]=!1;[me]=!1;constructor(t={}){if(super(),this.opt=t,this.file=t.file||"",this.cwd=t.cwd||process.cwd(),this.maxReadSize=t.maxReadSize,this.preservePaths=!!t.preservePaths,this.strict=!!t.strict,this.noPax=!!t.noPax,this.prefix=f(t.prefix||""),this.linkCache=t.linkCache||new Map,this.statCache=t.statCache||new Map,this.readdirCache=t.readdirCache||new Map,this.onWriteEntry=t.onWriteEntry,this[li]=de,typeof t.onwarn=="function"&&this.on("warn",t.onwarn),this.portable=!!t.portable,t.gzip||t.brotli||t.zstd){if((t.gzip?1:0)+(t.brotli?1:0)+(t.zstd?1:0)>1)throw new TypeError("gzip, brotli, zstd are mutually exclusive");if(t.gzip&&(typeof t.gzip!="object"&&(t.gzip={}),this.portable&&(t.gzip.portable=!0),this.zip=new Be(t.gzip)),t.brotli&&(typeof t.brotli!="object"&&(t.brotli={}),this.zip=new Ue(t.brotli)),t.zstd&&(typeof t.zstd!="object"&&(t.zstd={}),this.zip=new Ge(t.zstd)),!this.zip)throw new Error("impossible");let e=this.zip;e.on("data",i=>super.write(i)),e.on("end",()=>super.end()),e.on("drain",()=>this[os]()),this.on("resume",()=>e.resume())}else this.on("drain",this[os]);this.noDirRecurse=!!t.noDirRecurse,this.follow=!!t.follow,this.noMtime=!!t.noMtime,t.mtime&&(this.mtime=t.mtime),this.filter=typeof t.filter=="function"?t.filter:()=>!0,this[W]=new ri,this[G]=0,this.jobs=Number(t.jobs)||4,this[pe]=!1,this[me]=!1}[nr](t){return super.write(t)}add(t){return this.write(t),this}end(t,e,i){return typeof t=="function"&&(i=t,t=void 0),typeof e=="function"&&(i=e,e=void 0),t&&this.add(t),this[me]=!0,this[Ft](),i&&i(),this}write(t){if(this[me])throw new Error("write after end");return t instanceof Yt?this[ir](t):this[oi](t),this.flowing}[ir](t){let e=f(rr.resolve(this.cwd,t.path));if(!this.filter(t.path,t))t.resume();else{let i=new fi(t.path,e);i.entry=new si(t,this[ns](i)),i.entry.on("end",()=>this[rs](i)),this[G]+=1,this[W].push(i)}this[Ft]()}[oi](t){let e=f(rr.resolve(this.cwd,t));this[W].push(new fi(t,e)),this[Ft]()}[hs](t){t.pending=!0,this[G]+=1;let e=this.follow?"stat":"lstat";ci[e](t.absolute,(i,r)=>{t.pending=!1,this[G]-=1,i?this.emit("error",i):this[ni](t,r)})}[ni](t,e){this.statCache.set(t.absolute,e),t.stat=e,this.filter(t.path,e)?e.isFile()&&e.nlink>1&&t===this[Ct]&&!this.linkCache.get(`${e.dev}:${e.ino}`)&&!this.sync&&this[ss](t):t.ignore=!0,this[Ft]()}[as](t){t.pending=!0,this[G]+=1,ci.readdir(t.absolute,(e,i)=>{if(t.pending=!1,this[G]-=1,e)return this.emit("error",e);this[hi](t,i)})}[hi](t,e){this.readdirCache.set(t.absolute,e),t.readdir=e,this[Ft]()}[Ft](){if(!this[pe]){this[pe]=!0;for(let t=this[W].head;t&&this[G]<this.jobs;t=t.next)if(this[ss](t.value),t.value.ignore){let e=t.next;this[W].removeNode(t),t.next=e}this[pe]=!1,this[me]&&!this[W].length&&this[G]===0&&(this.zip?this.zip.end(er):(super.write(er),super.end()))}}get[Ct](){return this[W]&&this[W].head&&this[W].head.value}[rs](t){this[W].shift(),this[G]-=1,this[Ft]()}[ss](t){if(!t.pending){if(t.entry){t===this[Ct]&&!t.piped&&this[ai](t);return}if(!t.stat){let e=this.statCache.get(t.absolute);e?this[ni](t,e):this[hs](t)}if(t.stat&&!t.ignore){if(!this.noDirRecurse&&t.stat.isDirectory()&&!t.readdir){let e=this.readdirCache.get(t.absolute);if(e?this[hi](t,e):this[as](t),!t.readdir)return}if(t.entry=this[sr](t),!t.entry){t.ignore=!0;return}t===this[Ct]&&!t.piped&&this[ai](t)}}}[ns](t){return{onwarn:(e,i,r)=>this.warn(e,i,r),noPax:this.noPax,cwd:this.cwd,absolute:t.absolute,preservePaths:this.preservePaths,maxReadSize:this.maxReadSize,strict:this.strict,portable:this.portable,linkCache:this.linkCache,statCache:this.statCache,noMtime:this.noMtime,mtime:this.mtime,prefix:this.prefix,onWriteEntry:this.onWriteEntry}}[sr](t){this[G]+=1;try{return new this[li](t.path,this[ns](t)).on("end",()=>this[rs](t)).on("error",i=>this.emit("error",i))}catch(e){this.emit("error",e)}}[os](){this[Ct]&&this[Ct].entry&&this[Ct].entry.resume()}[ai](t){t.piped=!0,t.readdir&&t.readdir.forEach(r=>{let n=t.path,o=n==="./"?"":n.replace(/\/*$/,"/");this[oi](o+r)});let e=t.entry,i=this.zip;if(!e)throw new Error("cannot pipe without source");i?e.on("data",r=>{i.write(r)||e.pause()}):e.on("data",r=>{super.write(r)||e.pause()})}pause(){return this.zip&&this.zip.pause(),super.pause()}warn(t,e,i={}){Lt(this,t,e,i)}},kt=class extends Et{sync=!0;constructor(t){super(t),this[li]=ii}pause(){}resume(){}[hs](t){let e=this.follow?"statSync":"lstatSync";this[ni](t,ci[e](t.absolute))}[as](t){this[hi](t,ci.readdirSync(t.absolute))}[ai](t){let e=t.entry,i=this.zip;if(t.readdir&&t.readdir.forEach(r=>{let n=t.path,o=n==="./"?"":n.replace(/\/*$/,"/");this[oi](o+r)}),!e)throw new Error("Cannot pipe without source");i?e.on("data",r=>{i.write(r)}):e.on("data",r=>{super[nr](r)})}};var vn=(s,t)=>{let e=new kt(s),i=new Wt(s.file,{mode:s.mode||438});e.pipe(i),hr(e,t)},Mn=(s,t)=>{let e=new Et(s),i=new tt(s.file,{mode:s.mode||438});e.pipe(i);let r=new Promise((n,o)=>{i.on("error",o),i.on("close",n),e.on("error",o)});return ar(e,t),r},hr=(s,t)=>{t.forEach(e=>{e.charAt(0)==="@"?It({file:or.resolve(s.cwd,e.slice(1)),sync:!0,noResume:!0,onReadEntry:i=>s.add(i)}):s.add(e)}),s.end()},ar=async(s,t)=>{for(let e=0;e<t.length;e++){let i=String(t[e]);i.charAt(0)==="@"?await It({file:or.resolve(String(s.cwd),i.slice(1)),noResume:!0,onReadEntry:r=>{s.add(r)}}):s.add(i)}s.end()},Bn=(s,t)=>{let e=new kt(s);return hr(e,t),e},Pn=(s,t)=>{let e=new Et(s);return ar(e,t),e},zn=K(vn,Mn,Bn,Pn,(s,t)=>{if(!t?.length)throw new TypeError("no paths specified to add to archive")});import Lr from"node:fs";import io from"node:assert";import{randomBytes as xr}from"node:crypto";import u from"node:fs";import R from"node:path";import lr from"fs";var Un=process.env.__FAKE_PLATFORM__||process.platform,Hn=Un==="win32",{O_CREAT:Wn,O_TRUNC:Gn,O_WRONLY:Zn}=lr.constants,cr=Number(process.env.__FAKE_FS_O_FILENAME__)||lr.constants.UV_FS_O_FILEMAP||0,Yn=Hn&&!!cr,Kn=512*1024,Vn=cr|Gn|Wn|Zn,ls=Yn?s=>s<Kn?Vn:"w":()=>"w";import ui from"node:fs";import Ee from"node:path";var cs=(s,t,e)=>{try{return ui.lchownSync(s,t,e)}catch(i){if(i?.code!=="ENOENT")throw i}},di=(s,t,e,i)=>{ui.lchown(s,t,e,r=>{i(r&&r?.code!=="ENOENT"?r:null)})},$n=(s,t,e,i,r)=>{if(t.isDirectory())fs(Ee.resolve(s,t.name),e,i,n=>{if(n)return r(n);let o=Ee.resolve(s,t.name);di(o,e,i,r)});else{let n=Ee.resolve(s,t.name);di(n,e,i,r)}},fs=(s,t,e,i)=>{ui.readdir(s,{withFileTypes:!0},(r,n)=>{if(r){if(r.code==="ENOENT")return i();if(r.code!=="ENOTDIR"&&r.code!=="ENOTSUP")return i(r)}if(r||!n.length)return di(s,t,e,i);let o=n.length,h=null,a=l=>{if(!h){if(l)return i(h=l);if(--o===0)return di(s,t,e,i)}};for(let l of n)$n(s,l,t,e,a)})},Xn=(s,t,e,i)=>{t.isDirectory()&&ds(Ee.resolve(s,t.name),e,i),cs(Ee.resolve(s,t.name),e,i)},ds=(s,t,e)=>{let i;try{i=ui.readdirSync(s,{withFileTypes:!0})}catch(r){let n=r;if(n?.code==="ENOENT")return;if(n?.code==="ENOTDIR"||n?.code==="ENOTSUP")return cs(s,t,e);throw n}for(let r of i)Xn(s,r,t,e);return cs(s,t,e)};import k from"node:fs";import qn from"node:fs/promises";import mi from"node:path";var we=class extends Error{path;code;syscall="chdir";constructor(t,e){super(`${e}: Cannot cd into '${t}'`),this.path=t,this.code=e}get name(){return"CwdError"}};var wt=class extends Error{path;symlink;syscall="symlink";code="TAR_SYMLINK_ERROR";constructor(t,e){super("TAR_SYMLINK_ERROR: Cannot extract through symbolic link"),this.symlink=t,this.path=e}get name(){return"SymlinkError"}};var jn=(s,t)=>{k.stat(s,(e,i)=>{(e||!i.isDirectory())&&(e=new we(s,e?.code||"ENOTDIR")),t(e)})},fr=(s,t,e)=>{s=f(s);let i=t.umask??18,r=t.mode|448,n=(r&i)!==0,o=t.uid,h=t.gid,a=typeof o=="number"&&typeof h=="number"&&(o!==t.processUid||h!==t.processGid),l=t.preserve,c=t.unlink,d=f(t.cwd),S=(E,x)=>{E?e(E):x&&a?fs(x,o,h,_s=>S(_s)):n?k.chmod(s,r,e):e()};if(s===d)return jn(s,S);if(l)return qn.mkdir(s,{mode:r,recursive:!0}).then(E=>S(null,E??void 0),S);let N=f(mi.relative(d,s)).split("/");us(d,N,r,c,d,void 0,S)},us=(s,t,e,i,r,n,o)=>{if(!t.length)return o(null,n);let h=t.shift(),a=f(mi.resolve(s+"/"+h));k.mkdir(a,e,dr(a,t,e,i,r,n,o))},dr=(s,t,e,i,r,n,o)=>h=>{h?k.lstat(s,(a,l)=>{if(a)a.path=a.path&&f(a.path),o(a);else if(l.isDirectory())us(s,t,e,i,r,n,o);else if(i)k.unlink(s,c=>{if(c)return o(c);k.mkdir(s,e,dr(s,t,e,i,r,n,o))});else{if(l.isSymbolicLink())return o(new wt(s,s+"/"+t.join("/")));o(h)}}):(n=n||s,us(s,t,e,i,r,n,o))},Qn=s=>{let t=!1,e;try{t=k.statSync(s).isDirectory()}catch(i){e=i?.code}finally{if(!t)throw new we(s,e??"ENOTDIR")}},ur=(s,t)=>{s=f(s);let e=t.umask??18,i=t.mode|448,r=(i&e)!==0,n=t.uid,o=t.gid,h=typeof n=="number"&&typeof o=="number"&&(n!==t.processUid||o!==t.processGid),a=t.preserve,l=t.unlink,c=f(t.cwd),d=E=>{E&&h&&ds(E,n,o),r&&k.chmodSync(s,i)};if(s===c)return Qn(c),d();if(a)return d(k.mkdirSync(s,{mode:i,recursive:!0})??void 0);let T=f(mi.relative(c,s)).split("/"),N;for(let E=T.shift(),x=c;E&&(x+="/"+E);E=T.shift()){x=f(mi.resolve(x));try{k.mkdirSync(x,i),N=N||x}catch{let Os=k.lstatSync(x);if(Os.isDirectory())continue;if(l){k.unlinkSync(x),k.mkdirSync(x,i),N=N||x;continue}else if(Os.isSymbolicLink())return new wt(x,x+"/"+T.join("/"))}}return d(N)};import{join as Er}from"node:path";var ms=Object.create(null),mr=1e4,$t=new Set,pr=s=>{$t.has(s)?$t.delete(s):ms[s]=s.normalize("NFD").toLocaleLowerCase("en").toLocaleUpperCase("en"),$t.add(s);let t=ms[s],e=$t.size-mr;if(e>mr/10){for(let i of $t)if($t.delete(i),delete ms[i],--e<=0)break}return t};var Jn=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform,to=Jn==="win32",eo=s=>s.split("/").slice(0,-1).reduce((e,i)=>{let r=e[e.length-1];return r!==void 0&&(i=Er(r,i)),e.push(i||"/"),e},[]),pi=class{#t=new Map;#i=new Map;#s=new Set;reserve(t,e){t=to?["win32 parallelization disabled"]:t.map(r=>mt(Er(pr(r))));let i=new Set(t.map(r=>eo(r)).reduce((r,n)=>r.concat(n)));this.#i.set(e,{dirs:i,paths:t});for(let r of t){let n=this.#t.get(r);n?n.push(e):this.#t.set(r,[e])}for(let r of i){let n=this.#t.get(r);if(!n)this.#t.set(r,[new Set([e])]);else{let o=n[n.length-1];o instanceof Set?o.add(e):n.push(new Set([e]))}}return this.#r(e)}#n(t){let e=this.#i.get(t);if(!e)throw new Error("function does not have any path reservations");return{paths:e.paths.map(i=>this.#t.get(i)),dirs:[...e.dirs].map(i=>this.#t.get(i))}}check(t){let{paths:e,dirs:i}=this.#n(t);return e.every(r=>r&&r[0]===t)&&i.every(r=>r&&r[0]instanceof Set&&r[0].has(t))}#r(t){return this.#s.has(t)||!this.check(t)?!1:(this.#s.add(t),t(()=>this.#e(t)),!0)}#e(t){if(!this.#s.has(t))return!1;let e=this.#i.get(t);if(!e)throw new Error("invalid reservation");let{paths:i,dirs:r}=e,n=new Set;for(let o of i){let h=this.#t.get(o);if(!h||h?.[0]!==t)continue;let a=h[1];if(!a){this.#t.delete(o);continue}if(h.shift(),typeof a=="function")n.add(a);else for(let l of a)n.add(l)}for(let o of r){let h=this.#t.get(o),a=h?.[0];if(!(!h||!(a instanceof Set)))if(a.size===1&&h.length===1){this.#t.delete(o);continue}else if(a.size===1){h.shift();let l=h[0];typeof l=="function"&&n.add(l)}else a.delete(t)}return this.#s.delete(t),n.forEach(o=>this.#r(o)),!0}};var wr=()=>process.umask();var Sr=Symbol("onEntry"),Ss=Symbol("checkFs"),yr=Symbol("checkFs2"),ys=Symbol("isReusable"),P=Symbol("makeFs"),Rs=Symbol("file"),bs=Symbol("directory"),wi=Symbol("link"),Rr=Symbol("symlink"),br=Symbol("hardlink"),ye=Symbol("ensureNoSymlink"),gr=Symbol("unsupported"),_r=Symbol("checkPath"),ps=Symbol("stripAbsolutePath"),St=Symbol("mkdir"),O=Symbol("onError"),Ei=Symbol("pending"),Or=Symbol("pend"),Xt=Symbol("unpend"),Es=Symbol("ended"),ws=Symbol("maybeClose"),gs=Symbol("skip"),Re=Symbol("doChown"),be=Symbol("uid"),ge=Symbol("gid"),_e=Symbol("checkedCwd"),so=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform,Oe=so==="win32",ro=1024,no=(s,t)=>{if(!Oe)return u.unlink(s,t);let e=s+".DELETE."+xr(16).toString("hex");u.rename(s,e,i=>{if(i)return t(i);u.unlink(e,t)})},oo=s=>{if(!Oe)return u.unlinkSync(s);let t=s+".DELETE."+xr(16).toString("hex");u.renameSync(s,t),u.unlinkSync(t)},Tr=(s,t,e)=>s!==void 0&&s===s>>>0?s:t!==void 0&&t===t>>>0?t:e,qt=class extends st{[Es]=!1;[_e]=!1;[Ei]=0;reservations=new pi;transform;writable=!0;readable=!1;uid;gid;setOwner;preserveOwner;processGid;processUid;maxDepth;forceChown;win32;newer;keep;noMtime;preservePaths;unlink;cwd;strip;processUmask;umask;dmode;fmode;chmod;constructor(t={}){if(t.ondone=()=>{this[Es]=!0,this[ws]()},super(t),this.transform=t.transform,this.chmod=!!t.chmod,typeof t.uid=="number"||typeof t.gid=="number"){if(typeof t.uid!="number"||typeof t.gid!="number")throw new TypeError("cannot set owner without number uid and gid");if(t.preserveOwner)throw new TypeError("cannot preserve owner in archive and also set owner explicitly");this.uid=t.uid,this.gid=t.gid,this.setOwner=!0}else this.uid=void 0,this.gid=void 0,this.setOwner=!1;t.preserveOwner===void 0&&typeof t.uid!="number"?this.preserveOwner=!!(process.getuid&&process.getuid()===0):this.preserveOwner=!!t.preserveOwner,this.processUid=(this.preserveOwner||this.setOwner)&&process.getuid?process.getuid():void 0,this.processGid=(this.preserveOwner||this.setOwner)&&process.getgid?process.getgid():void 0,this.maxDepth=typeof t.maxDepth=="number"?t.maxDepth:ro,this.forceChown=t.forceChown===!0,this.win32=!!t.win32||Oe,this.newer=!!t.newer,this.keep=!!t.keep,this.noMtime=!!t.noMtime,this.preservePaths=!!t.preservePaths,this.unlink=!!t.unlink,this.cwd=f(R.resolve(t.cwd||process.cwd())),this.strip=Number(t.strip)||0,this.processUmask=this.chmod?typeof t.processUmask=="number"?t.processUmask:wr():0,this.umask=typeof t.umask=="number"?t.umask:this.processUmask,this.dmode=t.dmode||511&~this.umask,this.fmode=t.fmode||438&~this.umask,this.on("entry",e=>this[Sr](e))}warn(t,e,i={}){return(t==="TAR_BAD_ARCHIVE"||t==="TAR_ABORT")&&(i.recoverable=!1),super.warn(t,e,i)}[ws](){this[Es]&&this[Ei]===0&&(this.emit("prefinish"),this.emit("finish"),this.emit("end"))}[ps](t,e){let i=t[e],{type:r}=t;if(!i||this.preservePaths)return!0;let[n,o]=ce(i),h=o.replace(/\\/g,"/").split("/");if(h.includes("..")||Oe&&/^[a-z]:\.\.$/i.test(h[0]??"")){if(e==="path"||r==="Link")return this.warn("TAR_ENTRY_ERROR",`${e} contains '..'`,{entry:t,[e]:i}),!1;{let a=R.posix.dirname(t.path),l=R.posix.normalize(R.posix.join(a,h.join("/")));if(l.startsWith("../")||l==="..")return this.warn("TAR_ENTRY_ERROR",`${e} escapes extraction directory`,{entry:t,[e]:i}),!1}}return n&&(t[e]=String(o),this.warn("TAR_ENTRY_INFO",`stripping ${n} from absolute ${e}`,{entry:t,[e]:i})),!0}[_r](t){let e=f(t.path),i=e.split("/");if(this.strip){if(i.length<this.strip)return!1;if(t.type==="Link"){let r=f(String(t.linkpath)).split("/");if(r.length>=this.strip)t.linkpath=r.slice(this.strip).join("/");else return!1}i.splice(0,this.strip),t.path=i.join("/")}if(isFinite(this.maxDepth)&&i.length>this.maxDepth)return this.warn("TAR_ENTRY_ERROR","path excessively deep",{entry:t,path:e,depth:i.length,maxDepth:this.maxDepth}),!1;if(!this[ps](t,"path")||!this[ps](t,"linkpath"))return!1;if(R.isAbsolute(t.path)?t.absolute=f(R.resolve(t.path)):t.absolute=f(R.resolve(this.cwd,t.path)),!this.preservePaths&&typeof t.absolute=="string"&&t.absolute.indexOf(this.cwd+"/")!==0&&t.absolute!==this.cwd)return this.warn("TAR_ENTRY_ERROR","path escaped extraction target",{entry:t,path:f(t.path),resolvedPath:t.absolute,cwd:this.cwd}),!1;if(t.absolute===this.cwd&&t.type!=="Directory"&&t.type!=="GNUDumpDir")return!1;if(this.win32){let{root:r}=R.win32.parse(String(t.absolute));t.absolute=r+$i(String(t.absolute).slice(r.length));let{root:n}=R.win32.parse(t.path);t.path=n+$i(t.path.slice(n.length))}return!0}[Sr](t){if(!this[_r](t))return t.resume();switch(io.equal(typeof t.absolute,"string"),t.type){case"Directory":case"GNUDumpDir":t.mode&&(t.mode=t.mode|448);case"File":case"OldFile":case"ContiguousFile":case"Link":case"SymbolicLink":return this[Ss](t);default:return this[gr](t)}}[O](t,e){t.name==="CwdError"?this.emit("error",t):(this.warn("TAR_ENTRY_ERROR",t,{entry:e}),this[Xt](),e.resume())}[St](t,e,i){fr(f(t),{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cwd:this.cwd,mode:e},i)}[Re](t){return this.forceChown||this.preserveOwner&&(typeof t.uid=="number"&&t.uid!==this.processUid||typeof t.gid=="number"&&t.gid!==this.processGid)||typeof this.uid=="number"&&this.uid!==this.processUid||typeof this.gid=="number"&&this.gid!==this.processGid}[be](t){return Tr(this.uid,t.uid,this.processUid)}[ge](t){return Tr(this.gid,t.gid,this.processGid)}[Rs](t,e){let i=typeof t.mode=="number"?t.mode&4095:this.fmode,r=new tt(String(t.absolute),{flags:ls(t.size),mode:i,autoClose:!1});r.on("error",a=>{r.fd&&u.close(r.fd,()=>{}),r.write=()=>!0,this[O](a,t),e()});let n=1,o=a=>{if(a){r.fd&&u.close(r.fd,()=>{}),this[O](a,t),e();return}--n===0&&r.fd!==void 0&&u.close(r.fd,l=>{l?this[O](l,t):this[Xt](),e()})};r.on("finish",()=>{let a=String(t.absolute),l=r.fd;if(typeof l=="number"&&t.mtime&&!this.noMtime){n++;let c=t.atime||new Date,d=t.mtime;u.futimes(l,c,d,S=>S?u.utimes(a,c,d,T=>o(T&&S)):o())}if(typeof l=="number"&&this[Re](t)){n++;let c=this[be](t),d=this[ge](t);typeof c=="number"&&typeof d=="number"&&u.fchown(l,c,d,S=>S?u.chown(a,c,d,T=>o(T&&S)):o())}o()});let h=this.transform&&this.transform(t)||t;h!==t&&(h.on("error",a=>{this[O](a,t),e()}),t.pipe(h)),h.pipe(r)}[bs](t,e){let i=typeof t.mode=="number"?t.mode&4095:this.dmode;this[St](String(t.absolute),i,r=>{if(r){this[O](r,t),e();return}let n=1,o=()=>{--n===0&&(e(),this[Xt](),t.resume())};t.mtime&&!this.noMtime&&(n++,u.utimes(String(t.absolute),t.atime||new Date,t.mtime,o)),this[Re](t)&&(n++,u.chown(String(t.absolute),Number(this[be](t)),Number(this[ge](t)),o)),o()})}[gr](t){t.unsupported=!0,this.warn("TAR_ENTRY_UNSUPPORTED",`unsupported entry type: ${t.type}`,{entry:t}),t.resume()}[Rr](t,e){let i=f(R.relative(this.cwd,R.resolve(R.dirname(String(t.absolute)),String(t.linkpath)))).split("/");this[ye](t,this.cwd,i,()=>this[wi](t,String(t.linkpath),"symlink",e),r=>{this[O](r,t),e()})}[br](t,e){let i=f(R.resolve(this.cwd,String(t.linkpath))),r=f(String(t.linkpath)).split("/");this[ye](t,this.cwd,r,()=>this[wi](t,i,"link",e),n=>{this[O](n,t),e()})}[ye](t,e,i,r,n){let o=i.shift();if(this.preservePaths||o===void 0)return r();let h=R.resolve(e,o);u.lstat(h,(a,l)=>{if(a)return r();if(l?.isSymbolicLink())return n(new wt(h,R.resolve(h,i.join("/"))));this[ye](t,h,i,r,n)})}[Or](){this[Ei]++}[Xt](){this[Ei]--,this[ws]()}[gs](t){this[Xt](),t.resume()}[ys](t,e){return t.type==="File"&&!this.unlink&&e.isFile()&&e.nlink<=1&&!Oe}[Ss](t){this[Or]();let e=[t.path];t.linkpath&&e.push(t.linkpath),this.reservations.reserve(e,i=>this[yr](t,i))}[yr](t,e){let i=h=>{e(h)},r=()=>{this[St](this.cwd,this.dmode,h=>{if(h){this[O](h,t),i();return}this[_e]=!0,n()})},n=()=>{if(t.absolute!==this.cwd){let h=f(R.dirname(String(t.absolute)));if(h!==this.cwd)return this[St](h,this.dmode,a=>{if(a){this[O](a,t),i();return}o()})}o()},o=()=>{u.lstat(String(t.absolute),(h,a)=>{if(a&&(this.keep||this.newer&&a.mtime>(t.mtime??a.mtime))){this[gs](t),i();return}if(h||this[ys](t,a))return this[P](null,t,i);if(a.isDirectory()){if(t.type==="Directory"){let l=this.chmod&&t.mode&&(a.mode&4095)!==t.mode,c=d=>this[P](d??null,t,i);return l?u.chmod(String(t.absolute),Number(t.mode),c):c()}if(t.absolute!==this.cwd)return u.rmdir(String(t.absolute),l=>this[P](l??null,t,i))}if(t.absolute===this.cwd)return this[P](null,t,i);no(String(t.absolute),l=>this[P](l??null,t,i))})};this[_e]?n():r()}[P](t,e,i){if(t){this[O](t,e),i();return}switch(e.type){case"File":case"OldFile":case"ContiguousFile":return this[Rs](e,i);case"Link":return this[br](e,i);case"SymbolicLink":return this[Rr](e,i);case"Directory":case"GNUDumpDir":return this[bs](e,i)}}[wi](t,e,i,r){u[i](e,String(t.absolute),n=>{n?this[O](n,t):(this[Xt](),t.resume()),r()})}},Se=s=>{try{return[null,s()]}catch(t){return[t,null]}},Te=class extends qt{sync=!0;[P](t,e){return super[P](t,e,()=>{})}[Ss](t){if(!this[_e]){let n=this[St](this.cwd,this.dmode);if(n)return this[O](n,t);this[_e]=!0}if(t.absolute!==this.cwd){let n=f(R.dirname(String(t.absolute)));if(n!==this.cwd){let o=this[St](n,this.dmode);if(o)return this[O](o,t)}}let[e,i]=Se(()=>u.lstatSync(String(t.absolute)));if(i&&(this.keep||this.newer&&i.mtime>(t.mtime??i.mtime)))return this[gs](t);if(e||this[ys](t,i))return this[P](null,t);if(i.isDirectory()){if(t.type==="Directory"){let o=this.chmod&&t.mode&&(i.mode&4095)!==t.mode,[h]=o?Se(()=>{u.chmodSync(String(t.absolute),Number(t.mode))}):[];return this[P](h,t)}let[n]=Se(()=>u.rmdirSync(String(t.absolute)));this[P](n,t)}let[r]=t.absolute===this.cwd?[]:Se(()=>oo(String(t.absolute)));this[P](r,t)}[Rs](t,e){let i=typeof t.mode=="number"?t.mode&4095:this.fmode,r=h=>{let a;try{u.closeSync(n)}catch(l){a=l}(h||a)&&this[O](h||a,t),e()},n;try{n=u.openSync(String(t.absolute),ls(t.size),i)}catch(h){return r(h)}let o=this.transform&&this.transform(t)||t;o!==t&&(o.on("error",h=>this[O](h,t)),t.pipe(o)),o.on("data",h=>{try{u.writeSync(n,h,0,h.length)}catch(a){r(a)}}),o.on("end",()=>{let h=null;if(t.mtime&&!this.noMtime){let a=t.atime||new Date,l=t.mtime;try{u.futimesSync(n,a,l)}catch(c){try{u.utimesSync(String(t.absolute),a,l)}catch{h=c}}}if(this[Re](t)){let a=this[be](t),l=this[ge](t);try{u.fchownSync(n,Number(a),Number(l))}catch(c){try{u.chownSync(String(t.absolute),Number(a),Number(l))}catch{h=h||c}}}r(h)})}[bs](t,e){let i=typeof t.mode=="number"?t.mode&4095:this.dmode,r=this[St](String(t.absolute),i);if(r){this[O](r,t),e();return}if(t.mtime&&!this.noMtime)try{u.utimesSync(String(t.absolute),t.atime||new Date,t.mtime)}catch{}if(this[Re](t))try{u.chownSync(String(t.absolute),Number(this[be](t)),Number(this[ge](t)))}catch{}e(),t.resume()}[St](t,e){try{return ur(f(t),{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cwd:this.cwd,mode:e})}catch(i){return i}}[ye](t,e,i,r,n){if(this.preservePaths||!i.length)return r();let o=e;for(let h of i){o=R.resolve(o,h);let[a,l]=Se(()=>u.lstatSync(o));if(a)return r();if(l.isSymbolicLink())return n(new wt(o,R.resolve(e,i.join("/"))))}r()}[wi](t,e,i,r){let n=`${i}Sync`;try{u[n](e,String(t.absolute)),r(),t.resume()}catch(o){return this[O](o,t)}}};var ho=s=>{let t=new Te(s),e=s.file,i=Lr.statSync(e),r=s.maxReadSize||16*1024*1024;new ve(e,{readSize:r,size:i.size}).pipe(t)},ao=(s,t)=>{let e=new qt(s),i=s.maxReadSize||16*1024*1024,r=s.file;return new Promise((o,h)=>{e.on("error",h),e.on("close",o),Lr.stat(r,(a,l)=>{if(a)h(a);else{let c=new gt(r,{readSize:i,size:l.size});c.on("error",h),c.pipe(e)}})})},lo=K(ho,ao,s=>new Te(s),s=>new qt(s),(s,t)=>{t?.length&&Yi(s,t)});import v from"node:fs";import Nr from"node:path";var co=(s,t)=>{let e=new kt(s),i=!0,r,n;try{try{r=v.openSync(s.file,"r+")}catch(a){if(a?.code==="ENOENT")r=v.openSync(s.file,"w+");else throw a}let o=v.fstatSync(r),h=Buffer.alloc(512);t:for(n=0;n<o.size;n+=512){for(let c=0,d=0;c<512;c+=d){if(d=v.readSync(r,h,c,h.length-c,n+c),n===0&&h[0]===31&&h[1]===139)throw new Error("cannot append to compressed archives");if(!d)break t}let a=new F(h);if(!a.cksumValid)break;let l=512*Math.ceil((a.size||0)/512);if(n+l+512>o.size)break;n+=l,s.mtimeCache&&a.mtime&&s.mtimeCache.set(String(a.path),a.mtime)}i=!1,fo(s,e,n,r,t)}finally{if(i)try{v.closeSync(r)}catch{}}},fo=(s,t,e,i,r)=>{let n=new Wt(s.file,{fd:i,start:e});t.pipe(n),mo(t,r)},uo=(s,t)=>{t=Array.from(t);let e=new Et(s),i=(n,o,h)=>{let a=(T,N)=>{T?v.close(n,E=>h(T)):h(null,N)},l=0;if(o===0)return a(null,0);let c=0,d=Buffer.alloc(512),S=(T,N)=>{if(T||typeof N>"u")return a(T);if(c+=N,c<512&&N)return v.read(n,d,c,d.length-c,l+c,S);if(l===0&&d[0]===31&&d[1]===139)return a(new Error("cannot append to compressed archives"));if(c<512)return a(null,l);let E=new F(d);if(!E.cksumValid)return a(null,l);let x=512*Math.ceil((E.size??0)/512);if(l+x+512>o||(l+=x+512,l>=o))return a(null,l);s.mtimeCache&&E.mtime&&s.mtimeCache.set(String(E.path),E.mtime),c=0,v.read(n,d,0,512,l,S)};v.read(n,d,0,512,l,S)};return new Promise((n,o)=>{e.on("error",o);let h="r+",a=(l,c)=>{if(l&&l.code==="ENOENT"&&h==="r+")return h="w+",v.open(s.file,h,a);if(l||!c)return o(l);v.fstat(c,(d,S)=>{if(d)return v.close(c,()=>o(d));i(c,S.size,(T,N)=>{if(T)return o(T);let E=new tt(s.file,{fd:c,start:N});e.pipe(E),E.on("error",o),E.on("close",n),po(e,t)})})};v.open(s.file,h,a)})},mo=(s,t)=>{t.forEach(e=>{e.charAt(0)==="@"?It({file:Nr.resolve(s.cwd,e.slice(1)),sync:!0,noResume:!0,onReadEntry:i=>s.add(i)}):s.add(e)}),s.end()},po=async(s,t)=>{for(let e=0;e<t.length;e++){let i=String(t[e]);i.charAt(0)==="@"?await It({file:Nr.resolve(String(s.cwd),i.slice(1)),noResume:!0,onReadEntry:r=>s.add(r)}):s.add(i)}s.end()},vt=K(co,uo,()=>{throw new TypeError("file is required")},()=>{throw new TypeError("file is required")},(s,t)=>{if(!ks(s))throw new TypeError("file is required");if(s.gzip||s.brotli||s.zstd||s.file.endsWith(".br")||s.file.endsWith(".tbr"))throw new TypeError("cannot append to compressed archives");if(!t?.length)throw new TypeError("no paths specified to add/replace")});var Eo=K(vt.syncFile,vt.asyncFile,vt.syncNoFile,vt.asyncNoFile,(s,t=[])=>{vt.validate?.(s,t),wo(s)}),wo=s=>{let t=s.filter;s.mtimeCache||(s.mtimeCache=new Map),s.filter=t?(e,i)=>t(e,i)&&!((s.mtimeCache?.get(e)??i.mtime??0)>(i.mtime??0)):(e,i)=>!((s.mtimeCache?.get(e)??i.mtime??0)>(i.mtime??0))};export{F as Header,Et as Pack,fi as PackJob,kt as PackSync,st as Parser,ct as Pax,Yt as ReadEntry,qt as Unpack,Te as UnpackSync,de as WriteEntry,ii as WriteEntrySync,si as WriteEntryTar,zn as c,zn as create,lo as extract,Yi as filesFilter,It as list,vt as r,vt as replace,It as t,Mi as types,Eo as u,Eo as update,lo as x}; //# sourceMappingURL=index.min.js.map diff --git a/deps/npm/node_modules/tar/dist/esm/unpack.js b/deps/npm/node_modules/tar/dist/esm/unpack.js index 1d0b53d1df4e66..bc277018e4f169 100644 --- a/deps/npm/node_modules/tar/dist/esm/unpack.js +++ b/deps/npm/node_modules/tar/dist/esm/unpack.js @@ -221,7 +221,9 @@ export class Unpack extends Parser { const { type } = entry; if (!p || this.preservePaths) return true; - const parts = p.split('/'); + // strip off the root + const [root, stripped] = stripAbsolutePath(p); + const parts = stripped.replace(/\\/g, '/').split('/'); if (parts.includes('..') || /* c8 ignore next */ (isWindows && /^[a-z]:\.\.$/i.test(parts[0] ?? ''))) { @@ -242,7 +244,7 @@ export class Unpack extends Parser { // `path.posix` is safe to use because we're operating on // tar paths, not a filesystem. const entryDir = path.posix.dirname(entry.path); - const resolved = path.posix.normalize(path.posix.join(entryDir, p)); + const resolved = path.posix.normalize(path.posix.join(entryDir, parts.join('/'))); // If the resolved path escapes (starts with ..), reject it if (resolved.startsWith('../') || resolved === '..') { this.warn('TAR_ENTRY_ERROR', `${field} escapes extraction directory`, { @@ -253,8 +255,6 @@ export class Unpack extends Parser { } } } - // strip off the root - const [root, stripped] = stripAbsolutePath(p); if (root) { // ok, but triggers warning about stripping root entry[field] = String(stripped); diff --git a/deps/npm/node_modules/tar/package.json b/deps/npm/node_modules/tar/package.json index 7565cf8144df33..27cdae830128d7 100644 --- a/deps/npm/node_modules/tar/package.json +++ b/deps/npm/node_modules/tar/package.json @@ -2,7 +2,7 @@ "author": "Isaac Z. Schlueter", "name": "tar", "description": "tar for node", - "version": "7.5.9", + "version": "7.5.11", "repository": { "type": "git", "url": "https://github.com/isaacs/node-tar.git" @@ -28,18 +28,18 @@ "yallist": "^5.0.0" }, "devDependencies": { - "@types/node": "^25.0.9", + "@types/node": "^25.3.3", "chmodr": "^2.0.2", "end-of-stream": "^1.4.3", "esbuild": "^0.27.3", "events-to-array": "^2.0.3", "mutate-fs": "^2.1.1", "nock": "^13.5.4", - "prettier": "^3.8.0", + "prettier": "^3.8.1", "rimraf": "^6.1.2", - "tap": "^21.5.0", - "tshy": "^3.1.0", - "typedoc": "^0.28.16" + "tap": "^21.6.2", + "tshy": "^3.3.2", + "typedoc": "^0.28.17" }, "license": "BlueOak-1.0.0", "engines": { diff --git a/deps/npm/node_modules/unique-filename/LICENSE b/deps/npm/node_modules/unique-filename/LICENSE deleted file mode 100644 index 69619c125ea7ef..00000000000000 --- a/deps/npm/node_modules/unique-filename/LICENSE +++ /dev/null @@ -1,5 +0,0 @@ -Copyright npm, Inc - -Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/deps/npm/node_modules/unique-filename/lib/index.js b/deps/npm/node_modules/unique-filename/lib/index.js deleted file mode 100644 index d067d2e709809a..00000000000000 --- a/deps/npm/node_modules/unique-filename/lib/index.js +++ /dev/null @@ -1,7 +0,0 @@ -var path = require('path') - -var uniqueSlug = require('unique-slug') - -module.exports = function (filepath, prefix, uniq) { - return path.join(filepath, (prefix ? prefix + '-' : '') + uniqueSlug(uniq)) -} diff --git a/deps/npm/node_modules/unique-filename/package.json b/deps/npm/node_modules/unique-filename/package.json deleted file mode 100644 index 57892db1fc2c6c..00000000000000 --- a/deps/npm/node_modules/unique-filename/package.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "name": "unique-filename", - "version": "5.0.0", - "description": "Generate a unique filename for use in temporary directories or caches.", - "main": "lib/index.js", - "scripts": { - "test": "tap", - "lint": "npm run eslint", - "postlint": "template-oss-check", - "template-oss-apply": "template-oss-apply --force", - "lintfix": "npm run eslint -- --fix", - "snap": "tap", - "posttest": "npm run lint", - "eslint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/npm/unique-filename.git" - }, - "keywords": [], - "author": "GitHub Inc.", - "license": "ISC", - "bugs": { - "url": "https://github.com/iarna/unique-filename/issues" - }, - "homepage": "https://github.com/iarna/unique-filename", - "devDependencies": { - "@npmcli/eslint-config": "^5.0.0", - "@npmcli/template-oss": "4.27.1", - "tap": "^16.3.0" - }, - "dependencies": { - "unique-slug": "^6.0.0" - }, - "files": [ - "bin/", - "lib/" - ], - "engines": { - "node": "^20.17.0 || >=22.9.0" - }, - "templateOSS": { - "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.27.1", - "publish": true - }, - "tap": { - "nyc-arg": [ - "--exclude", - "tap-snapshots/**" - ] - } -} diff --git a/deps/npm/node_modules/unique-slug/LICENSE b/deps/npm/node_modules/unique-slug/LICENSE deleted file mode 100644 index 7953647e7760b8..00000000000000 --- a/deps/npm/node_modules/unique-slug/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright npm, Inc - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/deps/npm/node_modules/unique-slug/lib/index.js b/deps/npm/node_modules/unique-slug/lib/index.js deleted file mode 100644 index 1bac84d95d7307..00000000000000 --- a/deps/npm/node_modules/unique-slug/lib/index.js +++ /dev/null @@ -1,11 +0,0 @@ -'use strict' -var MurmurHash3 = require('imurmurhash') - -module.exports = function (uniq) { - if (uniq) { - var hash = new MurmurHash3(uniq) - return ('00000000' + hash.result().toString(16)).slice(-8) - } else { - return (Math.random().toString(16) + '0000000').slice(2, 10) - } -} diff --git a/deps/npm/node_modules/unique-slug/package.json b/deps/npm/node_modules/unique-slug/package.json deleted file mode 100644 index 88df517c0335e6..00000000000000 --- a/deps/npm/node_modules/unique-slug/package.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "name": "unique-slug", - "version": "6.0.0", - "description": "Generate a unique character string suitible for use in files and URLs.", - "main": "lib/index.js", - "scripts": { - "test": "tap", - "lint": "npm run eslint", - "postlint": "template-oss-check", - "template-oss-apply": "template-oss-apply --force", - "lintfix": "npm run eslint -- --fix", - "snap": "tap", - "posttest": "npm run lint", - "eslint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"" - }, - "keywords": [], - "author": "GitHub Inc.", - "license": "ISC", - "devDependencies": { - "@npmcli/eslint-config": "^5.0.0", - "@npmcli/template-oss": "4.27.1", - "tap": "^16.3.0" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/npm/unique-slug.git" - }, - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "files": [ - "bin/", - "lib/" - ], - "engines": { - "node": "^20.17.0 || >=22.9.0" - }, - "templateOSS": { - "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.27.1", - "publish": true - }, - "tap": { - "nyc-arg": [ - "--exclude", - "tap-snapshots/**" - ] - } -} diff --git a/deps/npm/node_modules/write-file-atomic/lib/index.js b/deps/npm/node_modules/write-file-atomic/lib/index.js index 6013894cd1f4fc..d470cdd18de8c3 100644 --- a/deps/npm/node_modules/write-file-atomic/lib/index.js +++ b/deps/npm/node_modules/write-file-atomic/lib/index.js @@ -5,7 +5,7 @@ module.exports._getTmpname = getTmpname // for testing module.exports._cleanupOnExit = cleanupOnExit const fs = require('fs') -const MurmurHash3 = require('imurmurhash') +const crypto = require('node:crypto') const { onExit } = require('signal-exit') const path = require('path') const { promisify } = require('util') @@ -28,11 +28,13 @@ const threadId = (function getId () { let invocations = 0 function getTmpname (filename) { return filename + '.' + - MurmurHash3(__filename) - .hash(String(process.pid)) - .hash(String(threadId)) - .hash(String(++invocations)) - .result() + crypto.createHash('sha1') + .update(__filename) + .update(String(process.pid)) + .update(String(threadId)) + .update(String(++invocations)) + .digest() + .readUInt32BE(0) } function cleanupOnExit (tmpfile) { diff --git a/deps/npm/node_modules/write-file-atomic/package.json b/deps/npm/node_modules/write-file-atomic/package.json index c72d839f0e6611..da35aeec25414f 100644 --- a/deps/npm/node_modules/write-file-atomic/package.json +++ b/deps/npm/node_modules/write-file-atomic/package.json @@ -1,6 +1,6 @@ { "name": "write-file-atomic", - "version": "7.0.0", + "version": "7.0.1", "description": "Write files in an atomic fashion w/configurable ownership", "main": "./lib/index.js", "scripts": { @@ -28,12 +28,11 @@ }, "homepage": "https://github.com/npm/write-file-atomic", "dependencies": { - "imurmurhash": "^0.1.4", "signal-exit": "^4.0.1" }, "devDependencies": { - "@npmcli/eslint-config": "^5.0.0", - "@npmcli/template-oss": "4.27.1", + "@npmcli/eslint-config": "^6.0.0", + "@npmcli/template-oss": "4.28.1", "tap": "^16.0.1" }, "files": [ @@ -46,7 +45,7 @@ "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", "windowsCI": false, - "version": "4.27.1", + "version": "4.28.1", "publish": "true" }, "tap": { diff --git a/deps/npm/package.json b/deps/npm/package.json index 46ebacd5ade907..022dfee6f4bd91 100644 --- a/deps/npm/package.json +++ b/deps/npm/package.json @@ -1,5 +1,5 @@ { - "version": "11.11.0", + "version": "11.12.1", "name": "npm", "description": "a package manager for JavaScript", "workspaces": [ @@ -52,19 +52,19 @@ }, "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^9.4.0", - "@npmcli/config": "^10.7.1", + "@npmcli/arborist": "^9.4.2", + "@npmcli/config": "^10.8.1", "@npmcli/fs": "^5.0.0", "@npmcli/map-workspaces": "^5.0.3", "@npmcli/metavuln-calculator": "^9.0.3", "@npmcli/package-json": "^7.0.5", "@npmcli/promise-spawn": "^9.0.1", "@npmcli/redact": "^4.0.0", - "@npmcli/run-script": "^10.0.3", - "@sigstore/tuf": "^4.0.1", + "@npmcli/run-script": "^10.0.4", + "@sigstore/tuf": "^4.0.2", "abbrev": "^4.0.0", "archy": "~1.0.0", - "cacache": "^20.0.3", + "cacache": "^20.0.4", "chalk": "^5.6.2", "ci-info": "^4.4.0", "fastest-levenshtein": "^1.0.16", @@ -77,17 +77,17 @@ "is-cidr": "^6.0.3", "json-parse-even-better-errors": "^5.0.0", "libnpmaccess": "^10.0.3", - "libnpmdiff": "^8.1.3", - "libnpmexec": "^10.2.3", - "libnpmfund": "^7.0.17", + "libnpmdiff": "^8.1.5", + "libnpmexec": "^10.2.5", + "libnpmfund": "^7.0.19", "libnpmorg": "^8.0.1", - "libnpmpack": "^9.1.3", + "libnpmpack": "^9.1.5", "libnpmpublish": "^11.1.3", "libnpmsearch": "^9.0.1", "libnpmteam": "^8.0.2", "libnpmversion": "^8.0.3", - "make-fetch-happen": "^15.0.4", - "minimatch": "^10.2.2", + "make-fetch-happen": "^15.0.5", + "minimatch": "^10.2.4", "minipass": "^7.1.3", "minipass-pipeline": "^1.2.4", "ms": "^2.1.2", @@ -101,7 +101,7 @@ "npm-registry-fetch": "^19.1.1", "npm-user-validate": "^4.0.0", "p-map": "^7.0.4", - "pacote": "^21.4.0", + "pacote": "^21.5.0", "parse-conflict-json": "^5.0.1", "proc-log": "^6.1.0", "qrcode-terminal": "^0.12.0", @@ -110,7 +110,7 @@ "spdx-expression-parse": "^4.0.0", "ssri": "^13.0.1", "supports-color": "^10.2.2", - "tar": "^7.5.9", + "tar": "^7.5.11", "text-table": "~0.2.0", "tiny-relative-date": "^2.0.2", "treeverse": "^3.0.0", diff --git a/deps/npm/tap-snapshots/test/lib/commands/audit.js.test.cjs b/deps/npm/tap-snapshots/test/lib/commands/audit.js.test.cjs index 843cf7c8dd3708..3a4cec0d6cead6 100644 --- a/deps/npm/tap-snapshots/test/lib/commands/audit.js.test.cjs +++ b/deps/npm/tap-snapshots/test/lib/commands/audit.js.test.cjs @@ -305,6 +305,7 @@ audited 1 package in xxx 1 package has a verified registry signature 1 package has a verified attestation +(use --json --include-attestations to view attestation details) ` exports[`test/lib/commands/audit.js TAP audit signatures with valid signatures > must match snapshot 1`] = ` diff --git a/deps/npm/tap-snapshots/test/lib/commands/config.js.test.cjs b/deps/npm/tap-snapshots/test/lib/commands/config.js.test.cjs index bae0cc8ede3947..6617b3a0827f76 100644 --- a/deps/npm/tap-snapshots/test/lib/commands/config.js.test.cjs +++ b/deps/npm/tap-snapshots/test/lib/commands/config.js.test.cjs @@ -72,6 +72,7 @@ exports[`test/lib/commands/config.js TAP config list --json > output matches sna "include": [], "include-staged": false, "include-workspace-root": false, + "include-attestations": false, "init-author-email": "", "init-author-name": "", "init-author-url": "", @@ -248,6 +249,7 @@ https-proxy = null if-present = false ignore-scripts = false include = [] +include-attestations = false include-staged = false include-workspace-root = false init-author-email = "" diff --git a/deps/npm/tap-snapshots/test/lib/commands/init.js.test.cjs b/deps/npm/tap-snapshots/test/lib/commands/init.js.test.cjs index 821193a55e1a98..d8c31b95d9d7d7 100644 --- a/deps/npm/tap-snapshots/test/lib/commands/init.js.test.cjs +++ b/deps/npm/tap-snapshots/test/lib/commands/init.js.test.cjs @@ -9,11 +9,9 @@ exports[`test/lib/commands/init.js TAP displays output > displays helper info 1` This utility will walk you through creating a package.json file. It only covers the most common items, and tries to guess sensible defaults. -See \`npm help init\` for definitive documentation on these fields -and exactly what they do. +See \`npm help init\` for definitive documentation on these fields and exactly what they do. -Use \`npm install <pkg>\` afterwards to install a package and -save it as a dependency in the package.json file. +Use \`npm install <pkg>\` afterwards to install a package and save it as a dependency in the package.json file. Press ^C at any time to quit. ` diff --git a/deps/npm/tap-snapshots/test/lib/commands/install.js.test.cjs b/deps/npm/tap-snapshots/test/lib/commands/install.js.test.cjs index 6143eacb57ffa2..dd618ee3688f19 100644 --- a/deps/npm/tap-snapshots/test/lib/commands/install.js.test.cjs +++ b/deps/npm/tap-snapshots/test/lib/commands/install.js.test.cjs @@ -134,9 +134,9 @@ silly logfile done cleaning log files verbose stack Error: The developer of this package has specified the following through devEngines verbose stack Invalid devEngines.runtime verbose stack Invalid name "nondescript" does not match "node" for "runtime" -verbose stack at Install.checkDevEngines ({CWD}/lib/base-cmd.js:244:27) -verbose stack at MockNpm.execCommandClass ({CWD}/lib/npm.js:310:7) -verbose stack at MockNpm.exec ({CWD}/lib/npm.js:209:9) +verbose stack at Install.checkDevEngines ({CWD}/lib/base-cmd.js:247:27) +verbose stack at MockNpm.execCommandClass ({CWD}/lib/npm.js:292:7) +verbose stack at MockNpm.exec ({CWD}/lib/npm.js:193:9) error code EBADDEVENGINES error EBADDEVENGINES The developer of this package has specified the following through devEngines error EBADDEVENGINES Invalid devEngines.runtime @@ -199,9 +199,9 @@ warn EBADDEVENGINES } verbose stack Error: The developer of this package has specified the following through devEngines verbose stack Invalid devEngines.runtime verbose stack Invalid name "nondescript" does not match "node" for "runtime" -verbose stack at Install.checkDevEngines ({CWD}/lib/base-cmd.js:244:27) -verbose stack at MockNpm.execCommandClass ({CWD}/lib/npm.js:310:7) -verbose stack at MockNpm.exec ({CWD}/lib/npm.js:209:9) +verbose stack at Install.checkDevEngines ({CWD}/lib/base-cmd.js:247:27) +verbose stack at MockNpm.execCommandClass ({CWD}/lib/npm.js:292:7) +verbose stack at MockNpm.exec ({CWD}/lib/npm.js:193:9) error code EBADDEVENGINES error EBADDEVENGINES The developer of this package has specified the following through devEngines error EBADDEVENGINES Invalid devEngines.runtime @@ -225,9 +225,9 @@ silly logfile done cleaning log files verbose stack Error: The developer of this package has specified the following through devEngines verbose stack Invalid devEngines.runtime verbose stack Invalid name "nondescript" does not match "node" for "runtime" -verbose stack at Install.checkDevEngines ({CWD}/lib/base-cmd.js:244:27) -verbose stack at MockNpm.execCommandClass ({CWD}/lib/npm.js:310:7) -verbose stack at MockNpm.exec ({CWD}/lib/npm.js:209:9) +verbose stack at Install.checkDevEngines ({CWD}/lib/base-cmd.js:247:27) +verbose stack at MockNpm.execCommandClass ({CWD}/lib/npm.js:292:7) +verbose stack at MockNpm.exec ({CWD}/lib/npm.js:193:9) error code EBADDEVENGINES error EBADDEVENGINES The developer of this package has specified the following through devEngines error EBADDEVENGINES Invalid devEngines.runtime diff --git a/deps/npm/tap-snapshots/test/lib/docs.js.test.cjs b/deps/npm/tap-snapshots/test/lib/docs.js.test.cjs index c0f7bf8fb278ca..dbdcba2d7c3218 100644 --- a/deps/npm/tap-snapshots/test/lib/docs.js.test.cjs +++ b/deps/npm/tap-snapshots/test/lib/docs.js.test.cjs @@ -821,6 +821,18 @@ the order in which omit/include are specified on the command-line. +#### \`include-attestations\` + +* Default: false +* Type: Boolean + +When used with \`npm audit signatures --json\`, includes the full sigstore +attestation bundles in the JSON output for each verified package. The +bundles contain DSSE envelopes, verification material, and transparency log +entries. + + + #### \`include-staged\` * Default: false @@ -1137,6 +1149,8 @@ of a relative number of days. This config cannot be used with: \`before\` +This value is not exported to the environment for child processes. + #### \`name\` * Default: null @@ -2302,6 +2316,7 @@ Array [ "include", "include-staged", "include-workspace-root", + "include-attestations", "init-author-email", "init-author-name", "init-author-url", @@ -2476,6 +2491,7 @@ Array [ "include", "include-staged", "include-workspace-root", + "include-attestations", "init-private", "install-links", "install-strategy", @@ -2643,6 +2659,7 @@ Object { "httpsProxy": null, "ifPresent": false, "ignoreScripts": false, + "includeAttestations": false, "includeStaged": false, "includeWorkspaceRoot": false, "initPrivate": false, @@ -2869,7 +2886,7 @@ Options: [--json] [--package-lock-only] [--no-package-lock] [--omit <dev|optional|peer> [--omit <dev|optional|peer> ...]] [--include <prod|dev|optional|peer> [--include <prod|dev|optional|peer> ...]] -[--foreground-scripts] [--ignore-scripts] +[--foreground-scripts] [--ignore-scripts] [--include-attestations] [-w|--workspace <workspace-name> [-w|--workspace <workspace-name> ...]] [--workspaces] [--include-workspace-root] [--install-links] @@ -2903,6 +2920,9 @@ Options: --ignore-scripts If true, npm does not run scripts specified in package.json files. + --include-attestations + When used with \`npm audit signatures --json\`, includes the full + -w|--workspace Enable running a command in the context of the configured workspaces of the @@ -2932,6 +2952,7 @@ npm audit [fix|signatures] #### \`include\` #### \`foreground-scripts\` #### \`ignore-scripts\` +#### \`include-attestations\` #### \`workspace\` #### \`workspaces\` #### \`include-workspace-root\` @@ -5782,7 +5803,11 @@ exports[`test/lib/docs.js TAP usage trust > must match snapshot 1`] = ` Create a trusted relationship between a package and a OIDC provider Usage: -npm trust +npm trust github [package] --file [--repo|--repository] [--env|--environment] [-y|--yes] +npm trust gitlab [package] --file [--project|--repo|--repository] [--env|--environment] [-y|--yes] +npm trust circleci [package] --org-id <uuid> --project-id <uuid> --pipeline-definition-id <uuid> --vcs-origin <origin> [--context-id <uuid>...] [-y|--yes] +npm trust list [package] +npm trust revoke [package] --id=<trust-id> Subcommands: github @@ -5804,10 +5829,6 @@ Run "npm trust <subcommand> --help" for more info on a subcommand. Run "npm help trust" for more info -\`\`\`bash -npm trust -\`\`\` - Note: This command is unaware of workspaces. #### Synopsis diff --git a/deps/npm/tap-snapshots/test/lib/utils/error-message.js.test.cjs b/deps/npm/tap-snapshots/test/lib/utils/error-message.js.test.cjs index 463cdae374c93d..d41a85d99ff855 100644 --- a/deps/npm/tap-snapshots/test/lib/utils/error-message.js.test.cjs +++ b/deps/npm/tap-snapshots/test/lib/utils/error-message.js.test.cjs @@ -370,9 +370,7 @@ Object { The operation was rejected by your operating system. It is likely you do not have the permissions to access this file as the current user - If you believe this might be a permissions issue, please double-check the - permissions of the file and its containing directories, or try running - the command again as root/Administrator. + If you believe this might be a permissions issue, please double-check the permissions of the file and its containing directories, or try running the command again as root/Administrator. ), ], ], @@ -403,9 +401,7 @@ Object { The operation was rejected by your operating system. It is likely you do not have the permissions to access this file as the current user - If you believe this might be a permissions issue, please double-check the - permissions of the file and its containing directories, or try running - the command again as root/Administrator. + If you believe this might be a permissions issue, please double-check the permissions of the file and its containing directories, or try running the command again as root/Administrator. ), ], ], @@ -436,9 +432,7 @@ Object { The operation was rejected by your operating system. It is likely you do not have the permissions to access this file as the current user - If you believe this might be a permissions issue, please double-check the - permissions of the file and its containing directories, or try running - the command again as root/Administrator. + If you believe this might be a permissions issue, please double-check the permissions of the file and its containing directories, or try running the command again as root/Administrator. ), ], ], @@ -469,9 +463,7 @@ Object { The operation was rejected by your operating system. It is likely you do not have the permissions to access this file as the current user - If you believe this might be a permissions issue, please double-check the - permissions of the file and its containing directories, or try running - the command again as root/Administrator. + If you believe this might be a permissions issue, please double-check the permissions of the file and its containing directories, or try running the command again as root/Administrator. ), ], ], @@ -502,9 +494,7 @@ Object { The operation was rejected by your operating system. It is likely you do not have the permissions to access this file as the current user - If you believe this might be a permissions issue, please double-check the - permissions of the file and its containing directories, or try running - the command again as root/Administrator. + If you believe this might be a permissions issue, please double-check the permissions of the file and its containing directories, or try running the command again as root/Administrator. ), ], ], @@ -538,8 +528,7 @@ Object { "", String( - Your cache folder contains root-owned files, due to a bug in - previous versions of npm which has since been addressed. + Your cache folder contains root-owned files, due to a bug in previous versions of npm which has since been addressed. To permanently fix this problem, please run: sudo chown -R 867:5309 "{CWD}/cache" @@ -567,8 +556,7 @@ Object { "", String( - Your cache folder contains root-owned files, due to a bug in - previous versions of npm which has since been addressed. + Your cache folder contains root-owned files, due to a bug in previous versions of npm which has since been addressed. To permanently fix this problem, please run: sudo chown -R 867:5309 "{CWD}/cache" @@ -596,8 +584,7 @@ Object { "", String( - Your cache folder contains root-owned files, due to a bug in - previous versions of npm which has since been addressed. + Your cache folder contains root-owned files, due to a bug in previous versions of npm which has since been addressed. To permanently fix this problem, please run: sudo chown -R 867:5309 "{CWD}/cache" @@ -625,12 +612,9 @@ Object { String( The operation was rejected by your operating system. - It's possible that the file was already in use (by a text editor or antivirus), - or that you lack permissions to access it. + It's possible that the file was already in use (by a text editor or antivirus), or that you lack permissions to access it. - If you believe this might be a permissions issue, please double-check the - permissions of the file and its containing directories, or try running - the command again as root/Administrator. + If you believe this might be a permissions issue, please double-check the permissions of the file and its containing directories, or try running the command again as root/Administrator. ), ], ], @@ -659,12 +643,9 @@ Object { String( The operation was rejected by your operating system. - It's possible that the file was already in use (by a text editor or antivirus), - or that you lack permissions to access it. + It's possible that the file was already in use (by a text editor or antivirus), or that you lack permissions to access it. - If you believe this might be a permissions issue, please double-check the - permissions of the file and its containing directories, or try running - the command again as root/Administrator. + If you believe this might be a permissions issue, please double-check the permissions of the file and its containing directories, or try running the command again as root/Administrator. ), ], ], @@ -693,12 +674,9 @@ Object { String( The operation was rejected by your operating system. - It's possible that the file was already in use (by a text editor or antivirus), - or that you lack permissions to access it. + It's possible that the file was already in use (by a text editor or antivirus), or that you lack permissions to access it. - If you believe this might be a permissions issue, please double-check the - permissions of the file and its containing directories, or try running - the command again as root/Administrator. + If you believe this might be a permissions issue, please double-check the permissions of the file and its containing directories, or try running the command again as root/Administrator. ), ], ], @@ -727,12 +705,9 @@ Object { String( The operation was rejected by your operating system. - It's possible that the file was already in use (by a text editor or antivirus), - or that you lack permissions to access it. + It's possible that the file was already in use (by a text editor or antivirus), or that you lack permissions to access it. - If you believe this might be a permissions issue, please double-check the - permissions of the file and its containing directories, or try running - the command again as root/Administrator. + If you believe this might be a permissions issue, please double-check the permissions of the file and its containing directories, or try running the command again as root/Administrator. ), ], ], @@ -761,12 +736,9 @@ Object { String( The operation was rejected by your operating system. - It's possible that the file was already in use (by a text editor or antivirus), - or that you lack permissions to access it. + It's possible that the file was already in use (by a text editor or antivirus), or that you lack permissions to access it. - If you believe this might be a permissions issue, please double-check the - permissions of the file and its containing directories, or try running - the command again as root/Administrator. + If you believe this might be a permissions issue, please double-check the permissions of the file and its containing directories, or try running the command again as root/Administrator. ), ], ], @@ -800,12 +772,9 @@ Object { String( The operation was rejected by your operating system. - It's possible that the file was already in use (by a text editor or antivirus), - or that you lack permissions to access it. + It's possible that the file was already in use (by a text editor or antivirus), or that you lack permissions to access it. - If you believe this might be a permissions issue, please double-check the - permissions of the file and its containing directories, or try running - the command again as root/Administrator. + If you believe this might be a permissions issue, please double-check the permissions of the file and its containing directories, or try running the command again as root/Administrator. ), ], ], @@ -839,12 +808,9 @@ Object { String( The operation was rejected by your operating system. - It's possible that the file was already in use (by a text editor or antivirus), - or that you lack permissions to access it. + It's possible that the file was already in use (by a text editor or antivirus), or that you lack permissions to access it. - If you believe this might be a permissions issue, please double-check the - permissions of the file and its containing directories, or try running - the command again as root/Administrator. + If you believe this might be a permissions issue, please double-check the permissions of the file and its containing directories, or try running the command again as root/Administrator. ), ], ], @@ -878,12 +844,9 @@ Object { String( The operation was rejected by your operating system. - It's possible that the file was already in use (by a text editor or antivirus), - or that you lack permissions to access it. + It's possible that the file was already in use (by a text editor or antivirus), or that you lack permissions to access it. - If you believe this might be a permissions issue, please double-check the - permissions of the file and its containing directories, or try running - the command again as root/Administrator. + If you believe this might be a permissions issue, please double-check the permissions of the file and its containing directories, or try running the command again as root/Administrator. ), ], ], @@ -980,8 +943,7 @@ Object { "", String( You can provide a one-time password by passing --otp=<code> to the command you ran. - If you already provided a one-time password then it is likely that you either typoed - it, or it timed out. Please try again. + If you already provided a one-time password then it is likely that you either typoed it, or it timed out. Please try again. ), ], ], @@ -1001,8 +963,7 @@ Object { "", String( You can provide a one-time password by passing --otp=<code> to the command you ran. - If you already provided a one-time password then it is likely that you either typoed - it, or it timed out. Please try again. + If you already provided a one-time password then it is likely that you either typoed it, or it timed out. Please try again. ), ], ], @@ -1058,14 +1019,12 @@ Object { Array [ "", String( - If you were trying to login, change your password, create an - authentication token or enable two-factor authentication then - that means you likely typed your password in incorrectly. + If you were trying to login, change your password, create an authentication token or enable two-factor authentication then that means you likely typed your password in incorrectly. Please try again, or recover your password at: https://www.npmjs.com/forgot - If you were doing some other operation then your saved credentials are - probably out of date. To correct this please try logging in again with: + If you were doing some other operation then your saved credentials are probably out of date. + To correct this please try logging in again with: npm login ), ], @@ -1171,8 +1130,7 @@ Object { This is a problem related to network connectivity. In most cases you are behind a proxy or have bad network settings. - If you are behind a proxy, please make sure that the - 'proxy' config is set properly. See: 'npm help config' + If you are behind a proxy, please make sure that the 'proxy' config is set properly. See: 'npm help config' ), ], ], @@ -1194,8 +1152,7 @@ Object { This is a problem related to network connectivity. In most cases you are behind a proxy or have bad network settings. - If you are behind a proxy, please make sure that the - 'proxy' config is set properly. See: 'npm help config' + If you are behind a proxy, please make sure that the 'proxy' config is set properly. See: 'npm help config' ), ], ], @@ -1217,8 +1174,7 @@ Object { This is a problem related to network connectivity. In most cases you are behind a proxy or have bad network settings. - If you are behind a proxy, please make sure that the - 'proxy' config is set properly. See: 'npm help config' + If you are behind a proxy, please make sure that the 'proxy' config is set properly. See: 'npm help config' ), ], ], @@ -1281,10 +1237,7 @@ Object { "detail": Array [ Array [ "rofs", - String( - Often virtualized file systems, or other file systems - that don't support symlinks, give this error. - ), + "Often virtualized file systems, or other file systems that don't support symlinks, give this error.", ], ], "summary": Array [ @@ -1324,7 +1277,7 @@ Object { "typeerror", String( This is an error with npm itself. Please report this error at: - https://github.com/npm/cli/issues + https://github.com/npm/cli/issues ), ], ], @@ -1344,7 +1297,7 @@ Object { "typeerror", String( This is an error with npm itself. Please report this error at: - https://github.com/npm/cli/issues + https://github.com/npm/cli/issues ), ], ], @@ -1364,7 +1317,7 @@ Object { "typeerror", String( This is an error with npm itself. Please report this error at: - https://github.com/npm/cli/issues + https://github.com/npm/cli/issues ), ], ], @@ -1405,7 +1358,7 @@ Object { "typeerror", String( This is an error with npm itself. Please report this error at: - https://github.com/npm/cli/issues + https://github.com/npm/cli/issues ), ], ], @@ -1423,10 +1376,7 @@ Object { "detail": Array [ Array [ "notarget", - String( - In most cases you or one of your dependencies are requesting - a package version that doesn't exist. - ), + "In most cases you or one of your dependencies are requesting a package version that doesn't exist.", ], ], "summary": Array [ @@ -1443,11 +1393,7 @@ Object { "detail": Array [ Array [ "403", - String( - In most cases, you or one of your dependencies are requesting - a package version that is forbidden by your security policy, or - on a server you do not have access to. - ), + "In most cases, you or one of your dependencies are requesting a package version that is forbidden by your security policy, or on a server you do not have access to.", ], ], "summary": Array [ @@ -1468,8 +1414,7 @@ Object { This is a problem related to network connectivity. In most cases you are behind a proxy or have bad network settings. - If you are behind a proxy, please make sure that the - 'proxy' config is set properly. See: 'npm help config' + If you are behind a proxy, please make sure that the 'proxy' config is set properly. See: 'npm help config' ), ], ], @@ -1489,8 +1434,7 @@ Object { "", String( - If you are behind a proxy, please make sure that the - 'proxy' config is set properly. See: 'npm help config' + If you are behind a proxy, please make sure that the 'proxy' config is set properly. See: 'npm help config' ), ], ], @@ -1563,10 +1507,7 @@ Object { "detail": Array [ Array [ "git", - String( - Refusing to remove it. Update manually, - or move it out of the way first. - ), + "Refusing to remove it. Update manually, or move it out of the way first.", ], ], "summary": Array [ @@ -1633,8 +1574,7 @@ Object { This is a problem related to network connectivity. In most cases you are behind a proxy or have bad network settings. - If you are behind a proxy, please make sure that the - 'proxy' config is set properly. See: 'npm help config' + If you are behind a proxy, please make sure that the 'proxy' config is set properly. See: 'npm help config' ), ], ], diff --git a/deps/npm/tap-snapshots/test/lib/utils/explain-dep.js.test.cjs b/deps/npm/tap-snapshots/test/lib/utils/explain-dep.js.test.cjs index 34620d5c749bc0..60fca466bb43f2 100644 --- a/deps/npm/tap-snapshots/test/lib/utils/explain-dep.js.test.cjs +++ b/deps/npm/tap-snapshots/test/lib/utils/explain-dep.js.test.cjs @@ -5,6 +5,28 @@ * Make sure to inspect the output below. Do not ignore changes! */ 'use strict' +exports[`test/lib/utils/explain-dep.js TAP basic > circular dependency does not recurse infinitely 1`] = ` +cycle-a@1.0.0 +node_modules/cycle-a + cycle-a@"1.x" from cycle-b@2.0.0 + node_modules/cycle-b + cycle-b@"2.x" from cycle-a@1.0.0 + node_modules/cycle-a + cycle-a@"1.x" from cycle-b@2.0.0 + node_modules/cycle-b +` + +exports[`test/lib/utils/explain-dep.js TAP basic > circular dependency from other side 1`] = ` +cycle-b@2.0.0 +node_modules/cycle-b + cycle-b@"2.x" from cycle-a@1.0.0 + node_modules/cycle-a + cycle-a@"1.x" from cycle-b@2.0.0 + node_modules/cycle-b + cycle-b@"2.x" from cycle-a@1.0.0 + node_modules/cycle-a +` + exports[`test/lib/utils/explain-dep.js TAP basic > ellipses test one 1`] = ` manydep@1.0.0 manydep@"1.0.0" from prod-dep@1.2.3 @@ -21,6 +43,11 @@ manydep@1.0.0 6 more (optdep, extra-neos, deep-dev, peer, the root project, a package with a pretty long name) ` +exports[`test/lib/utils/explain-dep.js TAP basic > explainEdge without seen parameter 1`] = ` +some-dep@"1.x" from parent-pkg@2.0.0 +node_modules/parent-pkg +` + exports[`test/lib/utils/explain-dep.js TAP basic bundled > explain color deep 1`] = ` bundle-of-joy@1.0.0 bundled node_modules/bundle-of-joy diff --git a/deps/npm/tap-snapshots/test/lib/utils/explain-eresolve.js.test.cjs b/deps/npm/tap-snapshots/test/lib/utils/explain-eresolve.js.test.cjs index 5190ead244697c..ac3f8607cc6c8e 100644 --- a/deps/npm/tap-snapshots/test/lib/utils/explain-eresolve.js.test.cjs +++ b/deps/npm/tap-snapshots/test/lib/utils/explain-eresolve.js.test.cjs @@ -42,9 +42,7 @@ peer @isaacs/testing-peer-dep-conflict-chain-d@"1" from @isaacs/testing-peer-dep node_modules/@isaacs/testing-peer-dep-conflict-chain-c @isaacs/testing-peer-dep-conflict-chain-c@"1" from the root project -Fix the upstream dependency conflict, or retry -this command with --force or --legacy-peer-deps -to accept an incorrect (and potentially broken) dependency resolution. +Fix the upstream dependency conflict, or retry this command with --force or --legacy-peer-deps to accept an incorrect (and potentially broken) dependency resolution. ` exports[`test/lib/utils/explain-eresolve.js TAP basic chain-conflict > report with color 1`] = ` @@ -58,9 +56,7 @@ Could not resolve dependency: node_modules/@isaacs/testing-peer-dep-conflict-chain-c @isaacs/testing-peer-dep-conflict-chain-c@"1" from the root project -Fix the upstream dependency conflict, or retry -this command with --force or --legacy-peer-deps -to accept an incorrect (and potentially broken) dependency resolution. +Fix the upstream dependency conflict, or retry this command with --force or --legacy-peer-deps to accept an incorrect (and potentially broken) dependency resolution. ` exports[`test/lib/utils/explain-eresolve.js TAP basic chain-conflict > report with no color 1`] = ` @@ -74,9 +70,7 @@ peer @isaacs/testing-peer-dep-conflict-chain-d@"1" from @isaacs/testing-peer-dep node_modules/@isaacs/testing-peer-dep-conflict-chain-c @isaacs/testing-peer-dep-conflict-chain-c@"1" from the root project -Fix the upstream dependency conflict, or retry -this command with --force or --legacy-peer-deps -to accept an incorrect (and potentially broken) dependency resolution. +Fix the upstream dependency conflict, or retry this command with --force or --legacy-peer-deps to accept an incorrect (and potentially broken) dependency resolution. ` exports[`test/lib/utils/explain-eresolve.js TAP basic cycleNested > explain with color, depth of 2 1`] = ` @@ -136,9 +130,7 @@ node_modules/@isaacs/peer-dep-cycle-c node_modules/@isaacs/peer-dep-cycle-a @isaacs/peer-dep-cycle-a@"1.x" from the root project -Fix the upstream dependency conflict, or retry -this command with --no-strict-peer-deps, --force, or --legacy-peer-deps -to accept an incorrect (and potentially broken) dependency resolution. +Fix the upstream dependency conflict, or retry this command with --no-strict-peer-deps, --force, or --legacy-peer-deps to accept an incorrect (and potentially broken) dependency resolution. ` exports[`test/lib/utils/explain-eresolve.js TAP basic cycleNested > report with color 1`] = ` @@ -159,9 +151,7 @@ Conflicting peer dependency: @isaacs/peer-dep-cycle-c@1.0.0 node_modules/@isaacs/peer-dep-cycle-a @isaacs/peer-dep-cycle-a@"1.x" from the root project -Fix the upstream dependency conflict, or retry -this command with --no-strict-peer-deps, --force, or --legacy-peer-deps -to accept an incorrect (and potentially broken) dependency resolution. +Fix the upstream dependency conflict, or retry this command with --no-strict-peer-deps, --force, or --legacy-peer-deps to accept an incorrect (and potentially broken) dependency resolution. ` exports[`test/lib/utils/explain-eresolve.js TAP basic cycleNested > report with no color 1`] = ` @@ -182,9 +172,7 @@ node_modules/@isaacs/peer-dep-cycle-c node_modules/@isaacs/peer-dep-cycle-a @isaacs/peer-dep-cycle-a@"1.x" from the root project -Fix the upstream dependency conflict, or retry -this command with --no-strict-peer-deps, --force, or --legacy-peer-deps -to accept an incorrect (and potentially broken) dependency resolution. +Fix the upstream dependency conflict, or retry this command with --no-strict-peer-deps, --force, or --legacy-peer-deps to accept an incorrect (and potentially broken) dependency resolution. ` exports[`test/lib/utils/explain-eresolve.js TAP basic eslint-plugin case > explain with color, depth of 2 1`] = ` @@ -256,9 +244,7 @@ node_modules/eslint node_modules/eslint-plugin-eslint-plugin dev eslint-plugin-eslint-plugin@"^3.1.0" from the root project -Fix the upstream dependency conflict, or retry -this command with --force or --legacy-peer-deps -to accept an incorrect (and potentially broken) dependency resolution. +Fix the upstream dependency conflict, or retry this command with --force or --legacy-peer-deps to accept an incorrect (and potentially broken) dependency resolution. ` exports[`test/lib/utils/explain-eresolve.js TAP basic eslint-plugin case > report with color 1`] = ` @@ -280,9 +266,7 @@ Conflicting peer dependency: eslint@7.31.0 node_modules/eslint-plugin-eslint-plugin dev eslint-plugin-eslint-plugin@"^3.1.0" from the root project -Fix the upstream dependency conflict, or retry -this command with --force or --legacy-peer-deps -to accept an incorrect (and potentially broken) dependency resolution. +Fix the upstream dependency conflict, or retry this command with --force or --legacy-peer-deps to accept an incorrect (and potentially broken) dependency resolution. ` exports[`test/lib/utils/explain-eresolve.js TAP basic eslint-plugin case > report with no color 1`] = ` @@ -304,9 +288,7 @@ node_modules/eslint node_modules/eslint-plugin-eslint-plugin dev eslint-plugin-eslint-plugin@"^3.1.0" from the root project -Fix the upstream dependency conflict, or retry -this command with --force or --legacy-peer-deps -to accept an incorrect (and potentially broken) dependency resolution. +Fix the upstream dependency conflict, or retry this command with --force or --legacy-peer-deps to accept an incorrect (and potentially broken) dependency resolution. ` exports[`test/lib/utils/explain-eresolve.js TAP basic gatsby > explain with color, depth of 2 1`] = ` @@ -374,9 +356,7 @@ node_modules/ink-box node_modules/gatsby gatsby@"" from the root project -Fix the upstream dependency conflict, or retry -this command with --no-strict-peer-deps, --force, or --legacy-peer-deps -to accept an incorrect (and potentially broken) dependency resolution. +Fix the upstream dependency conflict, or retry this command with --no-strict-peer-deps, --force, or --legacy-peer-deps to accept an incorrect (and potentially broken) dependency resolution. ` exports[`test/lib/utils/explain-eresolve.js TAP basic gatsby > report with color 1`] = ` @@ -401,9 +381,7 @@ Could not resolve dependency: gatsby-cli@"^2.12.107" from gatsby@2.24.74 node_modules/gatsby -Fix the upstream dependency conflict, or retry -this command with --no-strict-peer-deps, --force, or --legacy-peer-deps -to accept an incorrect (and potentially broken) dependency resolution. +Fix the upstream dependency conflict, or retry this command with --no-strict-peer-deps, --force, or --legacy-peer-deps to accept an incorrect (and potentially broken) dependency resolution. ` exports[`test/lib/utils/explain-eresolve.js TAP basic gatsby > report with no color 1`] = ` @@ -428,9 +406,7 @@ node_modules/ink-box gatsby-cli@"^2.12.107" from gatsby@2.24.74 node_modules/gatsby -Fix the upstream dependency conflict, or retry -this command with --no-strict-peer-deps, --force, or --legacy-peer-deps -to accept an incorrect (and potentially broken) dependency resolution. +Fix the upstream dependency conflict, or retry this command with --no-strict-peer-deps, --force, or --legacy-peer-deps to accept an incorrect (and potentially broken) dependency resolution. ` exports[`test/lib/utils/explain-eresolve.js TAP basic no current node, but has current edge > explain with color, depth of 2 1`] = ` @@ -464,9 +440,7 @@ peer eslint@"^6.0.0" from eslint-plugin-jsdoc@22.2.0 node_modules/eslint-plugin-jsdoc dev eslint-plugin-jsdoc@"^22.1.0" from the root project -Fix the upstream dependency conflict, or retry -this command with --force or --legacy-peer-deps -to accept an incorrect (and potentially broken) dependency resolution. +Fix the upstream dependency conflict, or retry this command with --force or --legacy-peer-deps to accept an incorrect (and potentially broken) dependency resolution. ` exports[`test/lib/utils/explain-eresolve.js TAP basic no current node, but has current edge > report with color 1`] = ` @@ -478,9 +452,7 @@ Could not resolve dependency: node_modules/eslint-plugin-jsdoc dev eslint-plugin-jsdoc@"^22.1.0" from the root project -Fix the upstream dependency conflict, or retry -this command with --force or --legacy-peer-deps -to accept an incorrect (and potentially broken) dependency resolution. +Fix the upstream dependency conflict, or retry this command with --force or --legacy-peer-deps to accept an incorrect (and potentially broken) dependency resolution. ` exports[`test/lib/utils/explain-eresolve.js TAP basic no current node, but has current edge > report with no color 1`] = ` @@ -492,9 +464,7 @@ peer eslint@"^6.0.0" from eslint-plugin-jsdoc@22.2.0 node_modules/eslint-plugin-jsdoc dev eslint-plugin-jsdoc@"^22.1.0" from the root project -Fix the upstream dependency conflict, or retry -this command with --force or --legacy-peer-deps -to accept an incorrect (and potentially broken) dependency resolution. +Fix the upstream dependency conflict, or retry this command with --force or --legacy-peer-deps to accept an incorrect (and potentially broken) dependency resolution. ` exports[`test/lib/utils/explain-eresolve.js TAP basic no current node, no current edge, idk > explain with color, depth of 2 1`] = ` @@ -534,9 +504,7 @@ peer eslint@"^6.0.0" from eslint-plugin-jsdoc@22.2.0 node_modules/eslint-plugin-jsdoc dev eslint-plugin-jsdoc@"^22.1.0" from the root project -Fix the upstream dependency conflict, or retry -this command with --force or --legacy-peer-deps -to accept an incorrect (and potentially broken) dependency resolution. +Fix the upstream dependency conflict, or retry this command with --force or --legacy-peer-deps to accept an incorrect (and potentially broken) dependency resolution. ` exports[`test/lib/utils/explain-eresolve.js TAP basic no current node, no current edge, idk > report with color 1`] = ` @@ -550,9 +518,7 @@ Could not resolve dependency: node_modules/eslint-plugin-jsdoc dev eslint-plugin-jsdoc@"^22.1.0" from the root project -Fix the upstream dependency conflict, or retry -this command with --force or --legacy-peer-deps -to accept an incorrect (and potentially broken) dependency resolution. +Fix the upstream dependency conflict, or retry this command with --force or --legacy-peer-deps to accept an incorrect (and potentially broken) dependency resolution. ` exports[`test/lib/utils/explain-eresolve.js TAP basic no current node, no current edge, idk > report with no color 1`] = ` @@ -566,9 +532,7 @@ peer eslint@"^6.0.0" from eslint-plugin-jsdoc@22.2.0 node_modules/eslint-plugin-jsdoc dev eslint-plugin-jsdoc@"^22.1.0" from the root project -Fix the upstream dependency conflict, or retry -this command with --force or --legacy-peer-deps -to accept an incorrect (and potentially broken) dependency resolution. +Fix the upstream dependency conflict, or retry this command with --force or --legacy-peer-deps to accept an incorrect (and potentially broken) dependency resolution. ` exports[`test/lib/utils/explain-eresolve.js TAP basic withShrinkwrap > explain with color, depth of 2 1`] = ` @@ -613,9 +577,7 @@ node_modules/@isaacs/peer-dep-cycle-b node_modules/@isaacs/peer-dep-cycle-a @isaacs/peer-dep-cycle-a@"1.x" from the root project -Fix the upstream dependency conflict, or retry -this command with --no-strict-peer-deps, --force, or --legacy-peer-deps -to accept an incorrect (and potentially broken) dependency resolution. +Fix the upstream dependency conflict, or retry this command with --no-strict-peer-deps, --force, or --legacy-peer-deps to accept an incorrect (and potentially broken) dependency resolution. ` exports[`test/lib/utils/explain-eresolve.js TAP basic withShrinkwrap > report with color 1`] = ` @@ -631,9 +593,7 @@ Could not resolve dependency: node_modules/@isaacs/peer-dep-cycle-a @isaacs/peer-dep-cycle-a@"1.x" from the root project -Fix the upstream dependency conflict, or retry -this command with --no-strict-peer-deps, --force, or --legacy-peer-deps -to accept an incorrect (and potentially broken) dependency resolution. +Fix the upstream dependency conflict, or retry this command with --no-strict-peer-deps, --force, or --legacy-peer-deps to accept an incorrect (and potentially broken) dependency resolution. ` exports[`test/lib/utils/explain-eresolve.js TAP basic withShrinkwrap > report with no color 1`] = ` @@ -649,7 +609,5 @@ node_modules/@isaacs/peer-dep-cycle-b node_modules/@isaacs/peer-dep-cycle-a @isaacs/peer-dep-cycle-a@"1.x" from the root project -Fix the upstream dependency conflict, or retry -this command with --no-strict-peer-deps, --force, or --legacy-peer-deps -to accept an incorrect (and potentially broken) dependency resolution. +Fix the upstream dependency conflict, or retry this command with --no-strict-peer-deps, --force, or --legacy-peer-deps to accept an incorrect (and potentially broken) dependency resolution. ` diff --git a/deps/npm/test/lib/base-cmd.js b/deps/npm/test/lib/base-cmd.js index 21e83d729b0b8c..41bade7298b900 100644 --- a/deps/npm/test/lib/base-cmd.js +++ b/deps/npm/test/lib/base-cmd.js @@ -221,6 +221,7 @@ t.test('getUsage() with no params and no definitions', async t => { class TestCommand extends BaseCommand { static name = 'test-command' static description = 'Test command description' + static usage = [''] } const usage = TestCommand.describeUsage diff --git a/deps/npm/test/lib/commands/audit.js b/deps/npm/test/lib/commands/audit.js index 4103ff8dec8c16..04d09f1aee4695 100644 --- a/deps/npm/test/lib/commands/audit.js +++ b/deps/npm/test/lib/commands/audit.js @@ -1850,9 +1850,99 @@ t.test('audit signatures', async t => { t.notOk(process.exitCode, 'should exit successfully') t.match(joinedOutput(), /1 package has a verified attestation/) + t.match(joinedOutput(), /use --json --include-attestations to view attestation details/) t.matchSnapshot(joinedOutput()) }) + t.test('with valid attestations and --include-attestations (human-readable)', async t => { + const { npm, joinedOutput } = await loadMockNpm(t, { + prefixDir: installWithValidAttestations, + config: { + 'include-attestations': true, + }, + mocks: { + pacote: t.mock('pacote', { + sigstore: { verify: async () => true }, + }), + }, + }) + const registry = new MockRegistry({ tap: t, registry: npm.config.get('registry') }) + await manifestWithValidAttestations({ registry }) + const fixture = fs.readFileSync( + path.resolve(__dirname, '../../fixtures/sigstore/valid-sigstore-attestations.json'), + 'utf8' + ) + registry.nock.get('/-/npm/v1/attestations/sigstore@1.0.0').reply(200, fixture) + mockTUF({ npm, target: TUF_VALID_KEYS_TARGET }) + + await npm.exec('audit', ['signatures']) + + t.notOk(process.exitCode, 'should exit successfully') + t.match(joinedOutput(), /1 package has a verified attestation/) + t.notMatch(joinedOutput(), /use --json --include-attestations to view attestation details/) + }) + + t.test('with valid attestations --json --include-attestations', async t => { + const { npm, joinedOutput } = await loadMockNpm(t, { + prefixDir: installWithValidAttestations, + config: { + json: true, + 'include-attestations': true, + }, + mocks: { + pacote: t.mock('pacote', { + sigstore: { verify: async () => true }, + }), + }, + }) + const registry = new MockRegistry({ tap: t, registry: npm.config.get('registry') }) + await manifestWithValidAttestations({ registry }) + const fixture = fs.readFileSync( + path.resolve(__dirname, '../../fixtures/sigstore/valid-sigstore-attestations.json'), + 'utf8' + ) + registry.nock.get('/-/npm/v1/attestations/sigstore@1.0.0').reply(200, fixture) + mockTUF({ npm, target: TUF_VALID_KEYS_TARGET }) + + await npm.exec('audit', ['signatures']) + + t.notOk(process.exitCode, 'should exit successfully') + const jsonOutput = JSON.parse(joinedOutput()) + t.ok(jsonOutput.verified, 'should include verified array') + t.equal(jsonOutput.verified.length, 1, 'should have one verified package') + t.equal(jsonOutput.verified[0].name, 'sigstore', 'should have correct package name') + t.equal(jsonOutput.verified[0].version, '1.0.0', 'should have correct version') + t.ok(jsonOutput.verified[0].attestations, 'should include attestations') + }) + + t.test('with valid attestations --json without --include-attestations', async t => { + const { npm, joinedOutput } = await loadMockNpm(t, { + prefixDir: installWithValidAttestations, + config: { + json: true, + }, + mocks: { + pacote: t.mock('pacote', { + sigstore: { verify: async () => true }, + }), + }, + }) + const registry = new MockRegistry({ tap: t, registry: npm.config.get('registry') }) + await manifestWithValidAttestations({ registry }) + const fixture = fs.readFileSync( + path.resolve(__dirname, '../../fixtures/sigstore/valid-sigstore-attestations.json'), + 'utf8' + ) + registry.nock.get('/-/npm/v1/attestations/sigstore@1.0.0').reply(200, fixture) + mockTUF({ npm, target: TUF_VALID_KEYS_TARGET }) + + await npm.exec('audit', ['signatures']) + + t.notOk(process.exitCode, 'should exit successfully') + const jsonOutput = JSON.parse(joinedOutput()) + t.notOk(jsonOutput.verified, 'should not include verified array') + }) + t.test('with keyless attestations and no registry keys', async t => { const { npm, joinedOutput } = await loadMockNpm(t, { prefixDir: installWithValidAttestations, diff --git a/deps/npm/test/lib/commands/ls.js b/deps/npm/test/lib/commands/ls.js index 1de85b8cfd0959..ab98773bc68e5c 100644 --- a/deps/npm/test/lib/commands/ls.js +++ b/deps/npm/test/lib/commands/ls.js @@ -5301,3 +5301,107 @@ t.test('completion', async t => { const res = await ls.completion({ conf: { argv: { remain: ['npm', 'ls'] } } }) t.type(res, Array) }) + +t.test('ls --install-strategy=linked', async t => { + t.test('should not report undeclared workspaces as UNMET DEPENDENCY', async t => { + const { result, ls } = await mockLs(t, { + config: { + 'install-strategy': 'linked', + }, + prefixDir: { + 'package.json': JSON.stringify({ + name: 'test-linked-ws', + version: '1.0.0', + workspaces: ['packages/*'], + dependencies: { 'workspace-a': '*' }, + }), + packages: { + 'workspace-a': { + 'package.json': JSON.stringify({ + name: 'workspace-a', + version: '1.0.0', + }), + }, + 'workspace-b': { + 'package.json': JSON.stringify({ + name: 'workspace-b', + version: '1.0.0', + }), + }, + }, + node_modules: { + 'workspace-a': t.fixture('symlink', '../packages/workspace-a'), + // workspace-b intentionally NOT linked (undeclared in dependencies) + }, + }, + }) + await ls.exec([]) + const output = cleanCwd(result()) + t.notMatch(output, /UNMET DEPENDENCY/, 'should not report undeclared workspace as UNMET DEPENDENCY') + t.match(output, /workspace-a/, 'should list declared workspace') + }) + + t.test('should not report devDeps of store packages as UNMET DEPENDENCY', async t => { + const { result, ls } = await mockLs(t, { + config: { + 'install-strategy': 'linked', + }, + prefixDir: { + 'package.json': JSON.stringify({ + name: 'test-linked-store', + version: '1.0.0', + dependencies: { nopt: '^1.0.0' }, + }), + node_modules: { + nopt: t.fixture('symlink', '.store/nopt@1.0.0/node_modules/nopt'), + '.store': { + 'nopt@1.0.0': { + node_modules: { + nopt: { + 'package.json': JSON.stringify({ + name: 'nopt', + version: '1.0.0', + devDependencies: { tap: '^16.0.0' }, + }), + }, + }, + }, + }, + }, + }, + }) + await ls.exec([]) + const output = cleanCwd(result()) + t.notMatch(output, /UNMET DEPENDENCY/, 'should not report devDeps of store packages') + t.match(output, /nopt/, 'should list the dependency') + }) + + t.test('should still report declared workspace as UNMET DEPENDENCY when missing', async t => { + const { ls } = await mockLs(t, { + config: { + 'install-strategy': 'linked', + }, + prefixDir: { + 'package.json': JSON.stringify({ + name: 'test-linked-ws-missing', + version: '1.0.0', + workspaces: ['packages/*'], + dependencies: { 'workspace-a': '*' }, + }), + packages: { + 'workspace-a': { + 'package.json': JSON.stringify({ + name: 'workspace-a', + version: '1.0.0', + }), + }, + }, + node_modules: { + // workspace-a is declared but its symlink is missing + }, + }, + }) + await t.rejects(ls.exec([]), { code: 'ELSPROBLEMS' }, + 'should report declared workspace as UNMET DEPENDENCY') + }) +}) diff --git a/deps/npm/test/lib/utils/explain-dep.js b/deps/npm/test/lib/utils/explain-dep.js index a90c0e90d5da63..2a9a93f2b529e3 100644 --- a/deps/npm/test/lib/utils/explain-dep.js +++ b/deps/npm/test/lib/utils/explain-dep.js @@ -1,6 +1,6 @@ const { resolve } = require('node:path') const t = require('tap') -const { explainNode, printNode } = require('../../../lib/utils/explain-dep.js') +const { explainNode, printNode, explainEdge } = require('../../../lib/utils/explain-dep.js') const { cleanCwd } = require('../../fixtures/clean-snapshot') t.cleanSnapshot = (str) => cleanCwd(str) @@ -268,6 +268,47 @@ t.test('basic', async t => { }) } + // Regression test for https://github.com/npm/cli/issues/9109 + // Circular dependency graphs (common in linked strategy store nodes) should not cause infinite recursion in explainNode. + const cycleA = { + name: 'cycle-a', + version: '1.0.0', + location: 'node_modules/cycle-a', + dependents: [], + } + const cycleB = { + name: 'cycle-b', + version: '2.0.0', + location: 'node_modules/cycle-b', + dependents: [{ + type: 'prod', + name: 'cycle-b', + spec: '2.x', + from: cycleA, + }], + } + cycleA.dependents = [{ + type: 'prod', + name: 'cycle-a', + spec: '1.x', + from: cycleB, + }] + t.matchSnapshot(explainNode(cycleA, Infinity, noColor), 'circular dependency does not recurse infinitely') + t.matchSnapshot(explainNode(cycleB, Infinity, noColor), 'circular dependency from other side') + + // explainEdge called without seen parameter (covers default seen = new Set() branch on explainEdge and explainFrom) + t.matchSnapshot(explainEdge({ + type: 'prod', + name: 'some-dep', + spec: '1.x', + from: { + name: 'parent-pkg', + version: '2.0.0', + location: 'node_modules/parent-pkg', + dependents: [], + }, + }, 2, noColor), 'explainEdge without seen parameter') + // make sure that we show the last one if it's the only one that would // hit the ... cases.manyDeps.dependents.pop() diff --git a/deps/openssl/config/archs/aix-gcc/asm/apps/progs.c b/deps/openssl/config/archs/aix-gcc/asm/apps/progs.c deleted file mode 100644 index f594c302c42ec6..00000000000000 --- a/deps/openssl/config/archs/aix-gcc/asm/apps/progs.c +++ /dev/null @@ -1,397 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by apps/progs.pl - * - * Copyright 1995-2022 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "progs.h" - -FUNCTION functions[] = { - {FT_general, "asn1parse", asn1parse_main, asn1parse_options, NULL, NULL}, - {FT_general, "ca", ca_main, ca_options, NULL, NULL}, -#ifndef OPENSSL_NO_SOCK - {FT_general, "ciphers", ciphers_main, ciphers_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_CMP - {FT_general, "cmp", cmp_main, cmp_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_CMS - {FT_general, "cms", cms_main, cms_options, NULL, NULL}, -#endif - {FT_general, "crl", crl_main, crl_options, NULL, NULL}, - {FT_general, "crl2pkcs7", crl2pkcs7_main, crl2pkcs7_options, NULL, NULL}, - {FT_general, "dgst", dgst_main, dgst_options, NULL, NULL}, -#ifndef OPENSSL_NO_DH - {FT_general, "dhparam", dhparam_main, dhparam_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_DSA - {FT_general, "dsa", dsa_main, dsa_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_DSA - {FT_general, "dsaparam", dsaparam_main, dsaparam_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_EC - {FT_general, "ec", ec_main, ec_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_EC - {FT_general, "ecparam", ecparam_main, ecparam_options, NULL, NULL}, -#endif - {FT_general, "enc", enc_main, enc_options, NULL, NULL}, -#ifndef OPENSSL_NO_ENGINE - {FT_general, "engine", engine_main, engine_options, NULL, NULL}, -#endif - {FT_general, "errstr", errstr_main, errstr_options, NULL, NULL}, - {FT_general, "fipsinstall", fipsinstall_main, fipsinstall_options, NULL, NULL}, -#ifndef OPENSSL_NO_DSA - {FT_general, "gendsa", gendsa_main, gendsa_options, NULL, NULL}, -#endif - {FT_general, "genpkey", genpkey_main, genpkey_options, NULL, NULL}, -#ifndef OPENSSL_NO_RSA - {FT_general, "genrsa", genrsa_main, genrsa_options, NULL, NULL}, -#endif - {FT_general, "help", help_main, help_options, NULL, NULL}, - {FT_general, "info", info_main, info_options, NULL, NULL}, - {FT_general, "kdf", kdf_main, kdf_options, NULL, NULL}, - {FT_general, "list", list_main, list_options, NULL, NULL}, - {FT_general, "mac", mac_main, mac_options, NULL, NULL}, - {FT_general, "nseq", nseq_main, nseq_options, NULL, NULL}, -#ifndef OPENSSL_NO_OCSP - {FT_general, "ocsp", ocsp_main, ocsp_options, NULL, NULL}, -#endif - {FT_general, "passwd", passwd_main, passwd_options, NULL, NULL}, - {FT_general, "pkcs12", pkcs12_main, pkcs12_options, NULL, NULL}, - {FT_general, "pkcs7", pkcs7_main, pkcs7_options, NULL, NULL}, - {FT_general, "pkcs8", pkcs8_main, pkcs8_options, NULL, NULL}, - {FT_general, "pkey", pkey_main, pkey_options, NULL, NULL}, - {FT_general, "pkeyparam", pkeyparam_main, pkeyparam_options, NULL, NULL}, - {FT_general, "pkeyutl", pkeyutl_main, pkeyutl_options, NULL, NULL}, - {FT_general, "prime", prime_main, prime_options, NULL, NULL}, - {FT_general, "rand", rand_main, rand_options, NULL, NULL}, - {FT_general, "rehash", rehash_main, rehash_options, NULL, NULL}, - {FT_general, "req", req_main, req_options, NULL, NULL}, - {FT_general, "rsa", rsa_main, rsa_options, NULL, NULL}, -#if !defined(OPENSSL_NO_DEPRECATED_3_0) && !defined(OPENSSL_NO_RSA) - {FT_general, "rsautl", rsautl_main, rsautl_options, "pkeyutl", "3.0"}, -#endif -#ifndef OPENSSL_NO_SOCK - {FT_general, "s_client", s_client_main, s_client_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_SOCK - {FT_general, "s_server", s_server_main, s_server_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_SOCK - {FT_general, "s_time", s_time_main, s_time_options, NULL, NULL}, -#endif - {FT_general, "sess_id", sess_id_main, sess_id_options, NULL, NULL}, - {FT_general, "smime", smime_main, smime_options, NULL, NULL}, - {FT_general, "speed", speed_main, speed_options, NULL, NULL}, - {FT_general, "spkac", spkac_main, spkac_options, NULL, NULL}, -#ifndef OPENSSL_NO_SRP - {FT_general, "srp", srp_main, srp_options, NULL, NULL}, -#endif - {FT_general, "storeutl", storeutl_main, storeutl_options, NULL, NULL}, -#ifndef OPENSSL_NO_TS - {FT_general, "ts", ts_main, ts_options, NULL, NULL}, -#endif - {FT_general, "verify", verify_main, verify_options, NULL, NULL}, - {FT_general, "version", version_main, version_options, NULL, NULL}, - {FT_general, "x509", x509_main, x509_options, NULL, NULL}, -#ifndef OPENSSL_NO_MD2 - {FT_md, "md2", dgst_main, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_MD4 - {FT_md, "md4", dgst_main, NULL, NULL}, -#endif - {FT_md, "md5", dgst_main, NULL, NULL}, - {FT_md, "sha1", dgst_main, NULL, NULL}, - {FT_md, "sha224", dgst_main, NULL, NULL}, - {FT_md, "sha256", dgst_main, NULL, NULL}, - {FT_md, "sha384", dgst_main, NULL, NULL}, - {FT_md, "sha512", dgst_main, NULL, NULL}, - {FT_md, "sha512-224", dgst_main, NULL, NULL}, - {FT_md, "sha512-256", dgst_main, NULL, NULL}, - {FT_md, "sha3-224", dgst_main, NULL, NULL}, - {FT_md, "sha3-256", dgst_main, NULL, NULL}, - {FT_md, "sha3-384", dgst_main, NULL, NULL}, - {FT_md, "sha3-512", dgst_main, NULL, NULL}, - {FT_md, "shake128", dgst_main, NULL, NULL}, - {FT_md, "shake256", dgst_main, NULL, NULL}, -#ifndef OPENSSL_NO_MDC2 - {FT_md, "mdc2", dgst_main, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_RMD160 - {FT_md, "rmd160", dgst_main, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_BLAKE2 - {FT_md, "blake2b512", dgst_main, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_BLAKE2 - {FT_md, "blake2s256", dgst_main, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_SM3 - {FT_md, "sm3", dgst_main, NULL, NULL}, -#endif - {FT_cipher, "aes-128-cbc", enc_main, enc_options, NULL}, - {FT_cipher, "aes-128-ecb", enc_main, enc_options, NULL}, - {FT_cipher, "aes-192-cbc", enc_main, enc_options, NULL}, - {FT_cipher, "aes-192-ecb", enc_main, enc_options, NULL}, - {FT_cipher, "aes-256-cbc", enc_main, enc_options, NULL}, - {FT_cipher, "aes-256-ecb", enc_main, enc_options, NULL}, -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-ctr", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-cfb1", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-cfb8", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-ctr", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-cfb1", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-cfb8", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-ctr", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-cfb1", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-cfb8", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-128-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-128-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-192-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-192-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-256-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-256-ecb", enc_main, enc_options, NULL}, -#endif - {FT_cipher, "base64", enc_main, enc_options, NULL}, -#ifdef ZLIB - {FT_cipher, "zlib", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des3", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "desx", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC4 - {FT_cipher, "rc4", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC4 - {FT_cipher, "rc4-40", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede3", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede3-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede3-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede3-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-64-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-40-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast5-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast5-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast5-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast5-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-ctr", enc_main, enc_options, NULL}, -#endif - {0, NULL, NULL, NULL, NULL} -}; diff --git a/deps/openssl/config/archs/aix-gcc/asm/providers/common/der/der_digests_gen.c b/deps/openssl/config/archs/aix-gcc/asm/providers/common/der/der_digests_gen.c deleted file mode 100644 index e4e14e82e5648a..00000000000000 --- a/deps/openssl/config/archs/aix-gcc/asm/providers/common/der/der_digests_gen.c +++ /dev/null @@ -1,160 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_digests_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_digests.h" - -/* Well known OIDs precompiled */ - -/* - * sigAlgs OBJECT IDENTIFIER ::= { nistAlgorithms 3 } - */ -const unsigned char ossl_der_oid_sigAlgs[DER_OID_SZ_sigAlgs] = { - DER_OID_V_sigAlgs -}; - -/* - * id-sha1 OBJECT IDENTIFIER ::= { iso(1) - * identified-organization(3) oiw(14) - * secsig(3) algorithms(2) 26 } - */ -const unsigned char ossl_der_oid_id_sha1[DER_OID_SZ_id_sha1] = { - DER_OID_V_id_sha1 -}; - -/* - * id-md2 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 2 } - */ -const unsigned char ossl_der_oid_id_md2[DER_OID_SZ_id_md2] = { - DER_OID_V_id_md2 -}; - -/* - * id-md5 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 5 } - */ -const unsigned char ossl_der_oid_id_md5[DER_OID_SZ_id_md5] = { - DER_OID_V_id_md5 -}; - -/* - * id-sha256 OBJECT IDENTIFIER ::= { hashAlgs 1 } - */ -const unsigned char ossl_der_oid_id_sha256[DER_OID_SZ_id_sha256] = { - DER_OID_V_id_sha256 -}; - -/* - * id-sha384 OBJECT IDENTIFIER ::= { hashAlgs 2 } - */ -const unsigned char ossl_der_oid_id_sha384[DER_OID_SZ_id_sha384] = { - DER_OID_V_id_sha384 -}; - -/* - * id-sha512 OBJECT IDENTIFIER ::= { hashAlgs 3 } - */ -const unsigned char ossl_der_oid_id_sha512[DER_OID_SZ_id_sha512] = { - DER_OID_V_id_sha512 -}; - -/* - * id-sha224 OBJECT IDENTIFIER ::= { hashAlgs 4 } - */ -const unsigned char ossl_der_oid_id_sha224[DER_OID_SZ_id_sha224] = { - DER_OID_V_id_sha224 -}; - -/* - * id-sha512-224 OBJECT IDENTIFIER ::= { hashAlgs 5 } - */ -const unsigned char ossl_der_oid_id_sha512_224[DER_OID_SZ_id_sha512_224] = { - DER_OID_V_id_sha512_224 -}; - -/* - * id-sha512-256 OBJECT IDENTIFIER ::= { hashAlgs 6 } - */ -const unsigned char ossl_der_oid_id_sha512_256[DER_OID_SZ_id_sha512_256] = { - DER_OID_V_id_sha512_256 -}; - -/* - * id-sha3-224 OBJECT IDENTIFIER ::= { hashAlgs 7 } - */ -const unsigned char ossl_der_oid_id_sha3_224[DER_OID_SZ_id_sha3_224] = { - DER_OID_V_id_sha3_224 -}; - -/* - * id-sha3-256 OBJECT IDENTIFIER ::= { hashAlgs 8 } - */ -const unsigned char ossl_der_oid_id_sha3_256[DER_OID_SZ_id_sha3_256] = { - DER_OID_V_id_sha3_256 -}; - -/* - * id-sha3-384 OBJECT IDENTIFIER ::= { hashAlgs 9 } - */ -const unsigned char ossl_der_oid_id_sha3_384[DER_OID_SZ_id_sha3_384] = { - DER_OID_V_id_sha3_384 -}; - -/* - * id-sha3-512 OBJECT IDENTIFIER ::= { hashAlgs 10 } - */ -const unsigned char ossl_der_oid_id_sha3_512[DER_OID_SZ_id_sha3_512] = { - DER_OID_V_id_sha3_512 -}; - -/* - * id-shake128 OBJECT IDENTIFIER ::= { hashAlgs 11 } - */ -const unsigned char ossl_der_oid_id_shake128[DER_OID_SZ_id_shake128] = { - DER_OID_V_id_shake128 -}; - -/* - * id-shake256 OBJECT IDENTIFIER ::= { hashAlgs 12 } - */ -const unsigned char ossl_der_oid_id_shake256[DER_OID_SZ_id_shake256] = { - DER_OID_V_id_shake256 -}; - -/* - * id-shake128-len OBJECT IDENTIFIER ::= { hashAlgs 17 } - */ -const unsigned char ossl_der_oid_id_shake128_len[DER_OID_SZ_id_shake128_len] = { - DER_OID_V_id_shake128_len -}; - -/* - * id-shake256-len OBJECT IDENTIFIER ::= { hashAlgs 18 } - */ -const unsigned char ossl_der_oid_id_shake256_len[DER_OID_SZ_id_shake256_len] = { - DER_OID_V_id_shake256_len -}; - -/* - * id-KMACWithSHAKE128 OBJECT IDENTIFIER ::={hashAlgs 19} - */ -const unsigned char ossl_der_oid_id_KMACWithSHAKE128[DER_OID_SZ_id_KMACWithSHAKE128] = { - DER_OID_V_id_KMACWithSHAKE128 -}; - -/* - * id-KMACWithSHAKE256 OBJECT IDENTIFIER ::={ hashAlgs 20} - */ -const unsigned char ossl_der_oid_id_KMACWithSHAKE256[DER_OID_SZ_id_KMACWithSHAKE256] = { - DER_OID_V_id_KMACWithSHAKE256 -}; - diff --git a/deps/openssl/config/archs/aix-gcc/asm/providers/common/der/der_dsa_gen.c b/deps/openssl/config/archs/aix-gcc/asm/providers/common/der/der_dsa_gen.c deleted file mode 100644 index e5cfe91e0f2510..00000000000000 --- a/deps/openssl/config/archs/aix-gcc/asm/providers/common/der/der_dsa_gen.c +++ /dev/null @@ -1,94 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_dsa_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -/* - * DSA low level APIs are deprecated for public use, but still ok for - * internal use. - */ -#include "internal/deprecated.h" - -#include "prov/der_dsa.h" - -/* Well known OIDs precompiled */ - -/* - * id-dsa OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) x9-57(10040) x9algorithm(4) 1 } - */ -const unsigned char ossl_der_oid_id_dsa[DER_OID_SZ_id_dsa] = { - DER_OID_V_id_dsa -}; - -/* - * id-dsa-with-sha1 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) x9-57 (10040) x9algorithm(4) 3 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha1[DER_OID_SZ_id_dsa_with_sha1] = { - DER_OID_V_id_dsa_with_sha1 -}; - -/* - * id-dsa-with-sha224 OBJECT IDENTIFIER ::= { sigAlgs 1 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha224[DER_OID_SZ_id_dsa_with_sha224] = { - DER_OID_V_id_dsa_with_sha224 -}; - -/* - * id-dsa-with-sha256 OBJECT IDENTIFIER ::= { sigAlgs 2 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha256[DER_OID_SZ_id_dsa_with_sha256] = { - DER_OID_V_id_dsa_with_sha256 -}; - -/* - * id-dsa-with-sha384 OBJECT IDENTIFIER ::= { sigAlgs 3 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha384[DER_OID_SZ_id_dsa_with_sha384] = { - DER_OID_V_id_dsa_with_sha384 -}; - -/* - * id-dsa-with-sha512 OBJECT IDENTIFIER ::= { sigAlgs 4 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha512[DER_OID_SZ_id_dsa_with_sha512] = { - DER_OID_V_id_dsa_with_sha512 -}; - -/* - * id-dsa-with-sha3-224 OBJECT IDENTIFIER ::= { sigAlgs 5 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha3_224[DER_OID_SZ_id_dsa_with_sha3_224] = { - DER_OID_V_id_dsa_with_sha3_224 -}; - -/* - * id-dsa-with-sha3-256 OBJECT IDENTIFIER ::= { sigAlgs 6 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha3_256[DER_OID_SZ_id_dsa_with_sha3_256] = { - DER_OID_V_id_dsa_with_sha3_256 -}; - -/* - * id-dsa-with-sha3-384 OBJECT IDENTIFIER ::= { sigAlgs 7 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha3_384[DER_OID_SZ_id_dsa_with_sha3_384] = { - DER_OID_V_id_dsa_with_sha3_384 -}; - -/* - * id-dsa-with-sha3-512 OBJECT IDENTIFIER ::= { sigAlgs 8 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha3_512[DER_OID_SZ_id_dsa_with_sha3_512] = { - DER_OID_V_id_dsa_with_sha3_512 -}; - diff --git a/deps/openssl/config/archs/aix-gcc/asm/providers/common/der/der_ec_gen.c b/deps/openssl/config/archs/aix-gcc/asm/providers/common/der/der_ec_gen.c deleted file mode 100644 index e1ed54ba05b6ff..00000000000000 --- a/deps/openssl/config/archs/aix-gcc/asm/providers/common/der/der_ec_gen.c +++ /dev/null @@ -1,279 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_ec_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_ec.h" - -/* Well known OIDs precompiled */ - -/* - * ecdsa-with-SHA1 OBJECT IDENTIFIER ::= { id-ecSigType 1 } - */ -const unsigned char ossl_der_oid_ecdsa_with_SHA1[DER_OID_SZ_ecdsa_with_SHA1] = { - DER_OID_V_ecdsa_with_SHA1 -}; - -/* - * id-ecPublicKey OBJECT IDENTIFIER ::= { id-publicKeyType 1 } - */ -const unsigned char ossl_der_oid_id_ecPublicKey[DER_OID_SZ_id_ecPublicKey] = { - DER_OID_V_id_ecPublicKey -}; - -/* - * c2pnb163v1 OBJECT IDENTIFIER ::= { c-TwoCurve 1 } - */ -const unsigned char ossl_der_oid_c2pnb163v1[DER_OID_SZ_c2pnb163v1] = { - DER_OID_V_c2pnb163v1 -}; - -/* - * c2pnb163v2 OBJECT IDENTIFIER ::= { c-TwoCurve 2 } - */ -const unsigned char ossl_der_oid_c2pnb163v2[DER_OID_SZ_c2pnb163v2] = { - DER_OID_V_c2pnb163v2 -}; - -/* - * c2pnb163v3 OBJECT IDENTIFIER ::= { c-TwoCurve 3 } - */ -const unsigned char ossl_der_oid_c2pnb163v3[DER_OID_SZ_c2pnb163v3] = { - DER_OID_V_c2pnb163v3 -}; - -/* - * c2pnb176w1 OBJECT IDENTIFIER ::= { c-TwoCurve 4 } - */ -const unsigned char ossl_der_oid_c2pnb176w1[DER_OID_SZ_c2pnb176w1] = { - DER_OID_V_c2pnb176w1 -}; - -/* - * c2tnb191v1 OBJECT IDENTIFIER ::= { c-TwoCurve 5 } - */ -const unsigned char ossl_der_oid_c2tnb191v1[DER_OID_SZ_c2tnb191v1] = { - DER_OID_V_c2tnb191v1 -}; - -/* - * c2tnb191v2 OBJECT IDENTIFIER ::= { c-TwoCurve 6 } - */ -const unsigned char ossl_der_oid_c2tnb191v2[DER_OID_SZ_c2tnb191v2] = { - DER_OID_V_c2tnb191v2 -}; - -/* - * c2tnb191v3 OBJECT IDENTIFIER ::= { c-TwoCurve 7 } - */ -const unsigned char ossl_der_oid_c2tnb191v3[DER_OID_SZ_c2tnb191v3] = { - DER_OID_V_c2tnb191v3 -}; - -/* - * c2onb191v4 OBJECT IDENTIFIER ::= { c-TwoCurve 8 } - */ -const unsigned char ossl_der_oid_c2onb191v4[DER_OID_SZ_c2onb191v4] = { - DER_OID_V_c2onb191v4 -}; - -/* - * c2onb191v5 OBJECT IDENTIFIER ::= { c-TwoCurve 9 } - */ -const unsigned char ossl_der_oid_c2onb191v5[DER_OID_SZ_c2onb191v5] = { - DER_OID_V_c2onb191v5 -}; - -/* - * c2pnb208w1 OBJECT IDENTIFIER ::= { c-TwoCurve 10 } - */ -const unsigned char ossl_der_oid_c2pnb208w1[DER_OID_SZ_c2pnb208w1] = { - DER_OID_V_c2pnb208w1 -}; - -/* - * c2tnb239v1 OBJECT IDENTIFIER ::= { c-TwoCurve 11 } - */ -const unsigned char ossl_der_oid_c2tnb239v1[DER_OID_SZ_c2tnb239v1] = { - DER_OID_V_c2tnb239v1 -}; - -/* - * c2tnb239v2 OBJECT IDENTIFIER ::= { c-TwoCurve 12 } - */ -const unsigned char ossl_der_oid_c2tnb239v2[DER_OID_SZ_c2tnb239v2] = { - DER_OID_V_c2tnb239v2 -}; - -/* - * c2tnb239v3 OBJECT IDENTIFIER ::= { c-TwoCurve 13 } - */ -const unsigned char ossl_der_oid_c2tnb239v3[DER_OID_SZ_c2tnb239v3] = { - DER_OID_V_c2tnb239v3 -}; - -/* - * c2onb239v4 OBJECT IDENTIFIER ::= { c-TwoCurve 14 } - */ -const unsigned char ossl_der_oid_c2onb239v4[DER_OID_SZ_c2onb239v4] = { - DER_OID_V_c2onb239v4 -}; - -/* - * c2onb239v5 OBJECT IDENTIFIER ::= { c-TwoCurve 15 } - */ -const unsigned char ossl_der_oid_c2onb239v5[DER_OID_SZ_c2onb239v5] = { - DER_OID_V_c2onb239v5 -}; - -/* - * c2pnb272w1 OBJECT IDENTIFIER ::= { c-TwoCurve 16 } - */ -const unsigned char ossl_der_oid_c2pnb272w1[DER_OID_SZ_c2pnb272w1] = { - DER_OID_V_c2pnb272w1 -}; - -/* - * c2pnb304w1 OBJECT IDENTIFIER ::= { c-TwoCurve 17 } - */ -const unsigned char ossl_der_oid_c2pnb304w1[DER_OID_SZ_c2pnb304w1] = { - DER_OID_V_c2pnb304w1 -}; - -/* - * c2tnb359v1 OBJECT IDENTIFIER ::= { c-TwoCurve 18 } - */ -const unsigned char ossl_der_oid_c2tnb359v1[DER_OID_SZ_c2tnb359v1] = { - DER_OID_V_c2tnb359v1 -}; - -/* - * c2pnb368w1 OBJECT IDENTIFIER ::= { c-TwoCurve 19 } - */ -const unsigned char ossl_der_oid_c2pnb368w1[DER_OID_SZ_c2pnb368w1] = { - DER_OID_V_c2pnb368w1 -}; - -/* - * c2tnb431r1 OBJECT IDENTIFIER ::= { c-TwoCurve 20 } - */ -const unsigned char ossl_der_oid_c2tnb431r1[DER_OID_SZ_c2tnb431r1] = { - DER_OID_V_c2tnb431r1 -}; - -/* - * prime192v1 OBJECT IDENTIFIER ::= { primeCurve 1 } - */ -const unsigned char ossl_der_oid_prime192v1[DER_OID_SZ_prime192v1] = { - DER_OID_V_prime192v1 -}; - -/* - * prime192v2 OBJECT IDENTIFIER ::= { primeCurve 2 } - */ -const unsigned char ossl_der_oid_prime192v2[DER_OID_SZ_prime192v2] = { - DER_OID_V_prime192v2 -}; - -/* - * prime192v3 OBJECT IDENTIFIER ::= { primeCurve 3 } - */ -const unsigned char ossl_der_oid_prime192v3[DER_OID_SZ_prime192v3] = { - DER_OID_V_prime192v3 -}; - -/* - * prime239v1 OBJECT IDENTIFIER ::= { primeCurve 4 } - */ -const unsigned char ossl_der_oid_prime239v1[DER_OID_SZ_prime239v1] = { - DER_OID_V_prime239v1 -}; - -/* - * prime239v2 OBJECT IDENTIFIER ::= { primeCurve 5 } - */ -const unsigned char ossl_der_oid_prime239v2[DER_OID_SZ_prime239v2] = { - DER_OID_V_prime239v2 -}; - -/* - * prime239v3 OBJECT IDENTIFIER ::= { primeCurve 6 } - */ -const unsigned char ossl_der_oid_prime239v3[DER_OID_SZ_prime239v3] = { - DER_OID_V_prime239v3 -}; - -/* - * prime256v1 OBJECT IDENTIFIER ::= { primeCurve 7 } - */ -const unsigned char ossl_der_oid_prime256v1[DER_OID_SZ_prime256v1] = { - DER_OID_V_prime256v1 -}; - -/* - * ecdsa-with-SHA224 OBJECT IDENTIFIER ::= { iso(1) member-body(2) - * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 1 } - */ -const unsigned char ossl_der_oid_ecdsa_with_SHA224[DER_OID_SZ_ecdsa_with_SHA224] = { - DER_OID_V_ecdsa_with_SHA224 -}; - -/* - * ecdsa-with-SHA256 OBJECT IDENTIFIER ::= { iso(1) member-body(2) - * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 2 } - */ -const unsigned char ossl_der_oid_ecdsa_with_SHA256[DER_OID_SZ_ecdsa_with_SHA256] = { - DER_OID_V_ecdsa_with_SHA256 -}; - -/* - * ecdsa-with-SHA384 OBJECT IDENTIFIER ::= { iso(1) member-body(2) - * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 3 } - */ -const unsigned char ossl_der_oid_ecdsa_with_SHA384[DER_OID_SZ_ecdsa_with_SHA384] = { - DER_OID_V_ecdsa_with_SHA384 -}; - -/* - * ecdsa-with-SHA512 OBJECT IDENTIFIER ::= { iso(1) member-body(2) - * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 4 } - */ -const unsigned char ossl_der_oid_ecdsa_with_SHA512[DER_OID_SZ_ecdsa_with_SHA512] = { - DER_OID_V_ecdsa_with_SHA512 -}; - -/* - * id-ecdsa-with-sha3-224 OBJECT IDENTIFIER ::= { sigAlgs 9 } - */ -const unsigned char ossl_der_oid_id_ecdsa_with_sha3_224[DER_OID_SZ_id_ecdsa_with_sha3_224] = { - DER_OID_V_id_ecdsa_with_sha3_224 -}; - -/* - * id-ecdsa-with-sha3-256 OBJECT IDENTIFIER ::= { sigAlgs 10 } - */ -const unsigned char ossl_der_oid_id_ecdsa_with_sha3_256[DER_OID_SZ_id_ecdsa_with_sha3_256] = { - DER_OID_V_id_ecdsa_with_sha3_256 -}; - -/* - * id-ecdsa-with-sha3-384 OBJECT IDENTIFIER ::= { sigAlgs 11 } - */ -const unsigned char ossl_der_oid_id_ecdsa_with_sha3_384[DER_OID_SZ_id_ecdsa_with_sha3_384] = { - DER_OID_V_id_ecdsa_with_sha3_384 -}; - -/* - * id-ecdsa-with-sha3-512 OBJECT IDENTIFIER ::= { sigAlgs 12 } - */ -const unsigned char ossl_der_oid_id_ecdsa_with_sha3_512[DER_OID_SZ_id_ecdsa_with_sha3_512] = { - DER_OID_V_id_ecdsa_with_sha3_512 -}; - diff --git a/deps/openssl/config/archs/aix-gcc/asm/providers/common/der/der_ecx_gen.c b/deps/openssl/config/archs/aix-gcc/asm/providers/common/der/der_ecx_gen.c deleted file mode 100644 index ba7bf14b5e156d..00000000000000 --- a/deps/openssl/config/archs/aix-gcc/asm/providers/common/der/der_ecx_gen.c +++ /dev/null @@ -1,44 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_ecx_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_ecx.h" - -/* Well known OIDs precompiled */ - -/* - * id-X25519 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 110 } - */ -const unsigned char ossl_der_oid_id_X25519[DER_OID_SZ_id_X25519] = { - DER_OID_V_id_X25519 -}; - -/* - * id-X448 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 111 } - */ -const unsigned char ossl_der_oid_id_X448[DER_OID_SZ_id_X448] = { - DER_OID_V_id_X448 -}; - -/* - * id-Ed25519 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 112 } - */ -const unsigned char ossl_der_oid_id_Ed25519[DER_OID_SZ_id_Ed25519] = { - DER_OID_V_id_Ed25519 -}; - -/* - * id-Ed448 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 113 } - */ -const unsigned char ossl_der_oid_id_Ed448[DER_OID_SZ_id_Ed448] = { - DER_OID_V_id_Ed448 -}; - diff --git a/deps/openssl/config/archs/aix-gcc/asm/providers/common/der/der_rsa_gen.c b/deps/openssl/config/archs/aix-gcc/asm/providers/common/der/der_rsa_gen.c deleted file mode 100644 index a3431798402f3f..00000000000000 --- a/deps/openssl/config/archs/aix-gcc/asm/providers/common/der/der_rsa_gen.c +++ /dev/null @@ -1,174 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_rsa_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_rsa.h" - -/* Well known OIDs precompiled */ - -/* - * hashAlgs OBJECT IDENTIFIER ::= { nistAlgorithms 2 } - */ -const unsigned char ossl_der_oid_hashAlgs[DER_OID_SZ_hashAlgs] = { - DER_OID_V_hashAlgs -}; - -/* - * rsaEncryption OBJECT IDENTIFIER ::= { pkcs-1 1 } - */ -const unsigned char ossl_der_oid_rsaEncryption[DER_OID_SZ_rsaEncryption] = { - DER_OID_V_rsaEncryption -}; - -/* - * id-RSAES-OAEP OBJECT IDENTIFIER ::= { pkcs-1 7 } - */ -const unsigned char ossl_der_oid_id_RSAES_OAEP[DER_OID_SZ_id_RSAES_OAEP] = { - DER_OID_V_id_RSAES_OAEP -}; - -/* - * id-pSpecified OBJECT IDENTIFIER ::= { pkcs-1 9 } - */ -const unsigned char ossl_der_oid_id_pSpecified[DER_OID_SZ_id_pSpecified] = { - DER_OID_V_id_pSpecified -}; - -/* - * id-RSASSA-PSS OBJECT IDENTIFIER ::= { pkcs-1 10 } - */ -const unsigned char ossl_der_oid_id_RSASSA_PSS[DER_OID_SZ_id_RSASSA_PSS] = { - DER_OID_V_id_RSASSA_PSS -}; - -/* - * md2WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 2 } - */ -const unsigned char ossl_der_oid_md2WithRSAEncryption[DER_OID_SZ_md2WithRSAEncryption] = { - DER_OID_V_md2WithRSAEncryption -}; - -/* - * md5WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 4 } - */ -const unsigned char ossl_der_oid_md5WithRSAEncryption[DER_OID_SZ_md5WithRSAEncryption] = { - DER_OID_V_md5WithRSAEncryption -}; - -/* - * sha1WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 5 } - */ -const unsigned char ossl_der_oid_sha1WithRSAEncryption[DER_OID_SZ_sha1WithRSAEncryption] = { - DER_OID_V_sha1WithRSAEncryption -}; - -/* - * sha224WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 14 } - */ -const unsigned char ossl_der_oid_sha224WithRSAEncryption[DER_OID_SZ_sha224WithRSAEncryption] = { - DER_OID_V_sha224WithRSAEncryption -}; - -/* - * sha256WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 11 } - */ -const unsigned char ossl_der_oid_sha256WithRSAEncryption[DER_OID_SZ_sha256WithRSAEncryption] = { - DER_OID_V_sha256WithRSAEncryption -}; - -/* - * sha384WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 12 } - */ -const unsigned char ossl_der_oid_sha384WithRSAEncryption[DER_OID_SZ_sha384WithRSAEncryption] = { - DER_OID_V_sha384WithRSAEncryption -}; - -/* - * sha512WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 13 } - */ -const unsigned char ossl_der_oid_sha512WithRSAEncryption[DER_OID_SZ_sha512WithRSAEncryption] = { - DER_OID_V_sha512WithRSAEncryption -}; - -/* - * sha512-224WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 15 } - */ -const unsigned char ossl_der_oid_sha512_224WithRSAEncryption[DER_OID_SZ_sha512_224WithRSAEncryption] = { - DER_OID_V_sha512_224WithRSAEncryption -}; - -/* - * sha512-256WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 16 } - */ -const unsigned char ossl_der_oid_sha512_256WithRSAEncryption[DER_OID_SZ_sha512_256WithRSAEncryption] = { - DER_OID_V_sha512_256WithRSAEncryption -}; - -/* - * id-mgf1 OBJECT IDENTIFIER ::= { pkcs-1 8 } - */ -const unsigned char ossl_der_oid_id_mgf1[DER_OID_SZ_id_mgf1] = { - DER_OID_V_id_mgf1 -}; - -/* - * id-rsassa-pkcs1-v1_5-with-sha3-224 OBJECT IDENTIFIER ::= { sigAlgs 13 } - */ -const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_224[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_224] = { - DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_224 -}; - -/* - * id-rsassa-pkcs1-v1_5-with-sha3-256 OBJECT IDENTIFIER ::= { sigAlgs 14 } - */ -const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_256[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_256] = { - DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_256 -}; - -/* - * id-rsassa-pkcs1-v1_5-with-sha3-384 OBJECT IDENTIFIER ::= { sigAlgs 15 } - */ -const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_384[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_384] = { - DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_384 -}; - -/* - * id-rsassa-pkcs1-v1_5-with-sha3-512 OBJECT IDENTIFIER ::= { sigAlgs 16 } - */ -const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_512[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_512] = { - DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_512 -}; - -/* - * md4WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 3 } - */ -const unsigned char ossl_der_oid_md4WithRSAEncryption[DER_OID_SZ_md4WithRSAEncryption] = { - DER_OID_V_md4WithRSAEncryption -}; - -/* - * ripemd160WithRSAEncryption OBJECT IDENTIFIER ::= { - * iso(1) identified-organization(3) teletrust(36) algorithm(3) signatureAlgorithm(3) rsaSignature(1) 2 - * } - */ -const unsigned char ossl_der_oid_ripemd160WithRSAEncryption[DER_OID_SZ_ripemd160WithRSAEncryption] = { - DER_OID_V_ripemd160WithRSAEncryption -}; - -/* - * mdc2WithRSASignature OBJECT IDENTIFIER ::= { - * iso(1) identified-organization(3) oiw(14) secsig(3) algorithms(2) mdc2WithRSASignature(14) - * } - */ -const unsigned char ossl_der_oid_mdc2WithRSASignature[DER_OID_SZ_mdc2WithRSASignature] = { - DER_OID_V_mdc2WithRSASignature -}; - diff --git a/deps/openssl/config/archs/aix-gcc/asm/providers/common/der/der_sm2_gen.c b/deps/openssl/config/archs/aix-gcc/asm/providers/common/der/der_sm2_gen.c deleted file mode 100644 index 6424ea166b7e15..00000000000000 --- a/deps/openssl/config/archs/aix-gcc/asm/providers/common/der/der_sm2_gen.c +++ /dev/null @@ -1,30 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_sm2_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_sm2.h" - -/* Well known OIDs precompiled */ - -/* - * sm2-with-SM3 OBJECT IDENTIFIER ::= { sm-scheme 501 } - */ -const unsigned char ossl_der_oid_sm2_with_SM3[DER_OID_SZ_sm2_with_SM3] = { - DER_OID_V_sm2_with_SM3 -}; - -/* - * curveSM2 OBJECT IDENTIFIER ::= { sm-scheme 301 } - */ -const unsigned char ossl_der_oid_curveSM2[DER_OID_SZ_curveSM2] = { - DER_OID_V_curveSM2 -}; - diff --git a/deps/openssl/config/archs/aix-gcc/asm/providers/common/der/der_wrap_gen.c b/deps/openssl/config/archs/aix-gcc/asm/providers/common/der/der_wrap_gen.c deleted file mode 100644 index 6cf93972f48b6d..00000000000000 --- a/deps/openssl/config/archs/aix-gcc/asm/providers/common/der/der_wrap_gen.c +++ /dev/null @@ -1,46 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_wrap_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_wrap.h" - -/* Well known OIDs precompiled */ - -/* - * id-alg-CMS3DESwrap OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs-9(9) smime(16) alg(3) 6 - * } - */ -const unsigned char ossl_der_oid_id_alg_CMS3DESwrap[DER_OID_SZ_id_alg_CMS3DESwrap] = { - DER_OID_V_id_alg_CMS3DESwrap -}; - -/* - * id-aes128-wrap OBJECT IDENTIFIER ::= { aes 5 } - */ -const unsigned char ossl_der_oid_id_aes128_wrap[DER_OID_SZ_id_aes128_wrap] = { - DER_OID_V_id_aes128_wrap -}; - -/* - * id-aes192-wrap OBJECT IDENTIFIER ::= { aes 25 } - */ -const unsigned char ossl_der_oid_id_aes192_wrap[DER_OID_SZ_id_aes192_wrap] = { - DER_OID_V_id_aes192_wrap -}; - -/* - * id-aes256-wrap OBJECT IDENTIFIER ::= { aes 45 } - */ -const unsigned char ossl_der_oid_id_aes256_wrap[DER_OID_SZ_id_aes256_wrap] = { - DER_OID_V_id_aes256_wrap -}; - diff --git a/deps/openssl/config/archs/aix-gcc/asm/providers/fips.ld b/deps/openssl/config/archs/aix-gcc/asm/providers/fips.ld deleted file mode 100644 index 8d6632bf3866af..00000000000000 --- a/deps/openssl/config/archs/aix-gcc/asm/providers/fips.ld +++ /dev/null @@ -1 +0,0 @@ -OSSL_provider_init diff --git a/deps/openssl/config/archs/aix-gcc/asm/providers/legacy.ld b/deps/openssl/config/archs/aix-gcc/asm/providers/legacy.ld deleted file mode 100644 index 8d6632bf3866af..00000000000000 --- a/deps/openssl/config/archs/aix-gcc/asm/providers/legacy.ld +++ /dev/null @@ -1 +0,0 @@ -OSSL_provider_init diff --git a/deps/openssl/config/archs/aix-gcc/asm_avx2/apps/progs.c b/deps/openssl/config/archs/aix-gcc/asm_avx2/apps/progs.c deleted file mode 100644 index f594c302c42ec6..00000000000000 --- a/deps/openssl/config/archs/aix-gcc/asm_avx2/apps/progs.c +++ /dev/null @@ -1,397 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by apps/progs.pl - * - * Copyright 1995-2022 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "progs.h" - -FUNCTION functions[] = { - {FT_general, "asn1parse", asn1parse_main, asn1parse_options, NULL, NULL}, - {FT_general, "ca", ca_main, ca_options, NULL, NULL}, -#ifndef OPENSSL_NO_SOCK - {FT_general, "ciphers", ciphers_main, ciphers_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_CMP - {FT_general, "cmp", cmp_main, cmp_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_CMS - {FT_general, "cms", cms_main, cms_options, NULL, NULL}, -#endif - {FT_general, "crl", crl_main, crl_options, NULL, NULL}, - {FT_general, "crl2pkcs7", crl2pkcs7_main, crl2pkcs7_options, NULL, NULL}, - {FT_general, "dgst", dgst_main, dgst_options, NULL, NULL}, -#ifndef OPENSSL_NO_DH - {FT_general, "dhparam", dhparam_main, dhparam_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_DSA - {FT_general, "dsa", dsa_main, dsa_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_DSA - {FT_general, "dsaparam", dsaparam_main, dsaparam_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_EC - {FT_general, "ec", ec_main, ec_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_EC - {FT_general, "ecparam", ecparam_main, ecparam_options, NULL, NULL}, -#endif - {FT_general, "enc", enc_main, enc_options, NULL, NULL}, -#ifndef OPENSSL_NO_ENGINE - {FT_general, "engine", engine_main, engine_options, NULL, NULL}, -#endif - {FT_general, "errstr", errstr_main, errstr_options, NULL, NULL}, - {FT_general, "fipsinstall", fipsinstall_main, fipsinstall_options, NULL, NULL}, -#ifndef OPENSSL_NO_DSA - {FT_general, "gendsa", gendsa_main, gendsa_options, NULL, NULL}, -#endif - {FT_general, "genpkey", genpkey_main, genpkey_options, NULL, NULL}, -#ifndef OPENSSL_NO_RSA - {FT_general, "genrsa", genrsa_main, genrsa_options, NULL, NULL}, -#endif - {FT_general, "help", help_main, help_options, NULL, NULL}, - {FT_general, "info", info_main, info_options, NULL, NULL}, - {FT_general, "kdf", kdf_main, kdf_options, NULL, NULL}, - {FT_general, "list", list_main, list_options, NULL, NULL}, - {FT_general, "mac", mac_main, mac_options, NULL, NULL}, - {FT_general, "nseq", nseq_main, nseq_options, NULL, NULL}, -#ifndef OPENSSL_NO_OCSP - {FT_general, "ocsp", ocsp_main, ocsp_options, NULL, NULL}, -#endif - {FT_general, "passwd", passwd_main, passwd_options, NULL, NULL}, - {FT_general, "pkcs12", pkcs12_main, pkcs12_options, NULL, NULL}, - {FT_general, "pkcs7", pkcs7_main, pkcs7_options, NULL, NULL}, - {FT_general, "pkcs8", pkcs8_main, pkcs8_options, NULL, NULL}, - {FT_general, "pkey", pkey_main, pkey_options, NULL, NULL}, - {FT_general, "pkeyparam", pkeyparam_main, pkeyparam_options, NULL, NULL}, - {FT_general, "pkeyutl", pkeyutl_main, pkeyutl_options, NULL, NULL}, - {FT_general, "prime", prime_main, prime_options, NULL, NULL}, - {FT_general, "rand", rand_main, rand_options, NULL, NULL}, - {FT_general, "rehash", rehash_main, rehash_options, NULL, NULL}, - {FT_general, "req", req_main, req_options, NULL, NULL}, - {FT_general, "rsa", rsa_main, rsa_options, NULL, NULL}, -#if !defined(OPENSSL_NO_DEPRECATED_3_0) && !defined(OPENSSL_NO_RSA) - {FT_general, "rsautl", rsautl_main, rsautl_options, "pkeyutl", "3.0"}, -#endif -#ifndef OPENSSL_NO_SOCK - {FT_general, "s_client", s_client_main, s_client_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_SOCK - {FT_general, "s_server", s_server_main, s_server_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_SOCK - {FT_general, "s_time", s_time_main, s_time_options, NULL, NULL}, -#endif - {FT_general, "sess_id", sess_id_main, sess_id_options, NULL, NULL}, - {FT_general, "smime", smime_main, smime_options, NULL, NULL}, - {FT_general, "speed", speed_main, speed_options, NULL, NULL}, - {FT_general, "spkac", spkac_main, spkac_options, NULL, NULL}, -#ifndef OPENSSL_NO_SRP - {FT_general, "srp", srp_main, srp_options, NULL, NULL}, -#endif - {FT_general, "storeutl", storeutl_main, storeutl_options, NULL, NULL}, -#ifndef OPENSSL_NO_TS - {FT_general, "ts", ts_main, ts_options, NULL, NULL}, -#endif - {FT_general, "verify", verify_main, verify_options, NULL, NULL}, - {FT_general, "version", version_main, version_options, NULL, NULL}, - {FT_general, "x509", x509_main, x509_options, NULL, NULL}, -#ifndef OPENSSL_NO_MD2 - {FT_md, "md2", dgst_main, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_MD4 - {FT_md, "md4", dgst_main, NULL, NULL}, -#endif - {FT_md, "md5", dgst_main, NULL, NULL}, - {FT_md, "sha1", dgst_main, NULL, NULL}, - {FT_md, "sha224", dgst_main, NULL, NULL}, - {FT_md, "sha256", dgst_main, NULL, NULL}, - {FT_md, "sha384", dgst_main, NULL, NULL}, - {FT_md, "sha512", dgst_main, NULL, NULL}, - {FT_md, "sha512-224", dgst_main, NULL, NULL}, - {FT_md, "sha512-256", dgst_main, NULL, NULL}, - {FT_md, "sha3-224", dgst_main, NULL, NULL}, - {FT_md, "sha3-256", dgst_main, NULL, NULL}, - {FT_md, "sha3-384", dgst_main, NULL, NULL}, - {FT_md, "sha3-512", dgst_main, NULL, NULL}, - {FT_md, "shake128", dgst_main, NULL, NULL}, - {FT_md, "shake256", dgst_main, NULL, NULL}, -#ifndef OPENSSL_NO_MDC2 - {FT_md, "mdc2", dgst_main, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_RMD160 - {FT_md, "rmd160", dgst_main, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_BLAKE2 - {FT_md, "blake2b512", dgst_main, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_BLAKE2 - {FT_md, "blake2s256", dgst_main, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_SM3 - {FT_md, "sm3", dgst_main, NULL, NULL}, -#endif - {FT_cipher, "aes-128-cbc", enc_main, enc_options, NULL}, - {FT_cipher, "aes-128-ecb", enc_main, enc_options, NULL}, - {FT_cipher, "aes-192-cbc", enc_main, enc_options, NULL}, - {FT_cipher, "aes-192-ecb", enc_main, enc_options, NULL}, - {FT_cipher, "aes-256-cbc", enc_main, enc_options, NULL}, - {FT_cipher, "aes-256-ecb", enc_main, enc_options, NULL}, -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-ctr", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-cfb1", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-cfb8", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-ctr", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-cfb1", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-cfb8", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-ctr", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-cfb1", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-cfb8", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-128-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-128-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-192-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-192-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-256-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-256-ecb", enc_main, enc_options, NULL}, -#endif - {FT_cipher, "base64", enc_main, enc_options, NULL}, -#ifdef ZLIB - {FT_cipher, "zlib", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des3", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "desx", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC4 - {FT_cipher, "rc4", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC4 - {FT_cipher, "rc4-40", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede3", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede3-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede3-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede3-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-64-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-40-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast5-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast5-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast5-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast5-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-ctr", enc_main, enc_options, NULL}, -#endif - {0, NULL, NULL, NULL, NULL} -}; diff --git a/deps/openssl/config/archs/aix-gcc/asm_avx2/providers/common/der/der_digests_gen.c b/deps/openssl/config/archs/aix-gcc/asm_avx2/providers/common/der/der_digests_gen.c deleted file mode 100644 index e4e14e82e5648a..00000000000000 --- a/deps/openssl/config/archs/aix-gcc/asm_avx2/providers/common/der/der_digests_gen.c +++ /dev/null @@ -1,160 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_digests_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_digests.h" - -/* Well known OIDs precompiled */ - -/* - * sigAlgs OBJECT IDENTIFIER ::= { nistAlgorithms 3 } - */ -const unsigned char ossl_der_oid_sigAlgs[DER_OID_SZ_sigAlgs] = { - DER_OID_V_sigAlgs -}; - -/* - * id-sha1 OBJECT IDENTIFIER ::= { iso(1) - * identified-organization(3) oiw(14) - * secsig(3) algorithms(2) 26 } - */ -const unsigned char ossl_der_oid_id_sha1[DER_OID_SZ_id_sha1] = { - DER_OID_V_id_sha1 -}; - -/* - * id-md2 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 2 } - */ -const unsigned char ossl_der_oid_id_md2[DER_OID_SZ_id_md2] = { - DER_OID_V_id_md2 -}; - -/* - * id-md5 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 5 } - */ -const unsigned char ossl_der_oid_id_md5[DER_OID_SZ_id_md5] = { - DER_OID_V_id_md5 -}; - -/* - * id-sha256 OBJECT IDENTIFIER ::= { hashAlgs 1 } - */ -const unsigned char ossl_der_oid_id_sha256[DER_OID_SZ_id_sha256] = { - DER_OID_V_id_sha256 -}; - -/* - * id-sha384 OBJECT IDENTIFIER ::= { hashAlgs 2 } - */ -const unsigned char ossl_der_oid_id_sha384[DER_OID_SZ_id_sha384] = { - DER_OID_V_id_sha384 -}; - -/* - * id-sha512 OBJECT IDENTIFIER ::= { hashAlgs 3 } - */ -const unsigned char ossl_der_oid_id_sha512[DER_OID_SZ_id_sha512] = { - DER_OID_V_id_sha512 -}; - -/* - * id-sha224 OBJECT IDENTIFIER ::= { hashAlgs 4 } - */ -const unsigned char ossl_der_oid_id_sha224[DER_OID_SZ_id_sha224] = { - DER_OID_V_id_sha224 -}; - -/* - * id-sha512-224 OBJECT IDENTIFIER ::= { hashAlgs 5 } - */ -const unsigned char ossl_der_oid_id_sha512_224[DER_OID_SZ_id_sha512_224] = { - DER_OID_V_id_sha512_224 -}; - -/* - * id-sha512-256 OBJECT IDENTIFIER ::= { hashAlgs 6 } - */ -const unsigned char ossl_der_oid_id_sha512_256[DER_OID_SZ_id_sha512_256] = { - DER_OID_V_id_sha512_256 -}; - -/* - * id-sha3-224 OBJECT IDENTIFIER ::= { hashAlgs 7 } - */ -const unsigned char ossl_der_oid_id_sha3_224[DER_OID_SZ_id_sha3_224] = { - DER_OID_V_id_sha3_224 -}; - -/* - * id-sha3-256 OBJECT IDENTIFIER ::= { hashAlgs 8 } - */ -const unsigned char ossl_der_oid_id_sha3_256[DER_OID_SZ_id_sha3_256] = { - DER_OID_V_id_sha3_256 -}; - -/* - * id-sha3-384 OBJECT IDENTIFIER ::= { hashAlgs 9 } - */ -const unsigned char ossl_der_oid_id_sha3_384[DER_OID_SZ_id_sha3_384] = { - DER_OID_V_id_sha3_384 -}; - -/* - * id-sha3-512 OBJECT IDENTIFIER ::= { hashAlgs 10 } - */ -const unsigned char ossl_der_oid_id_sha3_512[DER_OID_SZ_id_sha3_512] = { - DER_OID_V_id_sha3_512 -}; - -/* - * id-shake128 OBJECT IDENTIFIER ::= { hashAlgs 11 } - */ -const unsigned char ossl_der_oid_id_shake128[DER_OID_SZ_id_shake128] = { - DER_OID_V_id_shake128 -}; - -/* - * id-shake256 OBJECT IDENTIFIER ::= { hashAlgs 12 } - */ -const unsigned char ossl_der_oid_id_shake256[DER_OID_SZ_id_shake256] = { - DER_OID_V_id_shake256 -}; - -/* - * id-shake128-len OBJECT IDENTIFIER ::= { hashAlgs 17 } - */ -const unsigned char ossl_der_oid_id_shake128_len[DER_OID_SZ_id_shake128_len] = { - DER_OID_V_id_shake128_len -}; - -/* - * id-shake256-len OBJECT IDENTIFIER ::= { hashAlgs 18 } - */ -const unsigned char ossl_der_oid_id_shake256_len[DER_OID_SZ_id_shake256_len] = { - DER_OID_V_id_shake256_len -}; - -/* - * id-KMACWithSHAKE128 OBJECT IDENTIFIER ::={hashAlgs 19} - */ -const unsigned char ossl_der_oid_id_KMACWithSHAKE128[DER_OID_SZ_id_KMACWithSHAKE128] = { - DER_OID_V_id_KMACWithSHAKE128 -}; - -/* - * id-KMACWithSHAKE256 OBJECT IDENTIFIER ::={ hashAlgs 20} - */ -const unsigned char ossl_der_oid_id_KMACWithSHAKE256[DER_OID_SZ_id_KMACWithSHAKE256] = { - DER_OID_V_id_KMACWithSHAKE256 -}; - diff --git a/deps/openssl/config/archs/aix-gcc/asm_avx2/providers/common/der/der_dsa_gen.c b/deps/openssl/config/archs/aix-gcc/asm_avx2/providers/common/der/der_dsa_gen.c deleted file mode 100644 index e5cfe91e0f2510..00000000000000 --- a/deps/openssl/config/archs/aix-gcc/asm_avx2/providers/common/der/der_dsa_gen.c +++ /dev/null @@ -1,94 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_dsa_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -/* - * DSA low level APIs are deprecated for public use, but still ok for - * internal use. - */ -#include "internal/deprecated.h" - -#include "prov/der_dsa.h" - -/* Well known OIDs precompiled */ - -/* - * id-dsa OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) x9-57(10040) x9algorithm(4) 1 } - */ -const unsigned char ossl_der_oid_id_dsa[DER_OID_SZ_id_dsa] = { - DER_OID_V_id_dsa -}; - -/* - * id-dsa-with-sha1 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) x9-57 (10040) x9algorithm(4) 3 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha1[DER_OID_SZ_id_dsa_with_sha1] = { - DER_OID_V_id_dsa_with_sha1 -}; - -/* - * id-dsa-with-sha224 OBJECT IDENTIFIER ::= { sigAlgs 1 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha224[DER_OID_SZ_id_dsa_with_sha224] = { - DER_OID_V_id_dsa_with_sha224 -}; - -/* - * id-dsa-with-sha256 OBJECT IDENTIFIER ::= { sigAlgs 2 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha256[DER_OID_SZ_id_dsa_with_sha256] = { - DER_OID_V_id_dsa_with_sha256 -}; - -/* - * id-dsa-with-sha384 OBJECT IDENTIFIER ::= { sigAlgs 3 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha384[DER_OID_SZ_id_dsa_with_sha384] = { - DER_OID_V_id_dsa_with_sha384 -}; - -/* - * id-dsa-with-sha512 OBJECT IDENTIFIER ::= { sigAlgs 4 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha512[DER_OID_SZ_id_dsa_with_sha512] = { - DER_OID_V_id_dsa_with_sha512 -}; - -/* - * id-dsa-with-sha3-224 OBJECT IDENTIFIER ::= { sigAlgs 5 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha3_224[DER_OID_SZ_id_dsa_with_sha3_224] = { - DER_OID_V_id_dsa_with_sha3_224 -}; - -/* - * id-dsa-with-sha3-256 OBJECT IDENTIFIER ::= { sigAlgs 6 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha3_256[DER_OID_SZ_id_dsa_with_sha3_256] = { - DER_OID_V_id_dsa_with_sha3_256 -}; - -/* - * id-dsa-with-sha3-384 OBJECT IDENTIFIER ::= { sigAlgs 7 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha3_384[DER_OID_SZ_id_dsa_with_sha3_384] = { - DER_OID_V_id_dsa_with_sha3_384 -}; - -/* - * id-dsa-with-sha3-512 OBJECT IDENTIFIER ::= { sigAlgs 8 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha3_512[DER_OID_SZ_id_dsa_with_sha3_512] = { - DER_OID_V_id_dsa_with_sha3_512 -}; - diff --git a/deps/openssl/config/archs/aix-gcc/asm_avx2/providers/common/der/der_ec_gen.c b/deps/openssl/config/archs/aix-gcc/asm_avx2/providers/common/der/der_ec_gen.c deleted file mode 100644 index e1ed54ba05b6ff..00000000000000 --- a/deps/openssl/config/archs/aix-gcc/asm_avx2/providers/common/der/der_ec_gen.c +++ /dev/null @@ -1,279 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_ec_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_ec.h" - -/* Well known OIDs precompiled */ - -/* - * ecdsa-with-SHA1 OBJECT IDENTIFIER ::= { id-ecSigType 1 } - */ -const unsigned char ossl_der_oid_ecdsa_with_SHA1[DER_OID_SZ_ecdsa_with_SHA1] = { - DER_OID_V_ecdsa_with_SHA1 -}; - -/* - * id-ecPublicKey OBJECT IDENTIFIER ::= { id-publicKeyType 1 } - */ -const unsigned char ossl_der_oid_id_ecPublicKey[DER_OID_SZ_id_ecPublicKey] = { - DER_OID_V_id_ecPublicKey -}; - -/* - * c2pnb163v1 OBJECT IDENTIFIER ::= { c-TwoCurve 1 } - */ -const unsigned char ossl_der_oid_c2pnb163v1[DER_OID_SZ_c2pnb163v1] = { - DER_OID_V_c2pnb163v1 -}; - -/* - * c2pnb163v2 OBJECT IDENTIFIER ::= { c-TwoCurve 2 } - */ -const unsigned char ossl_der_oid_c2pnb163v2[DER_OID_SZ_c2pnb163v2] = { - DER_OID_V_c2pnb163v2 -}; - -/* - * c2pnb163v3 OBJECT IDENTIFIER ::= { c-TwoCurve 3 } - */ -const unsigned char ossl_der_oid_c2pnb163v3[DER_OID_SZ_c2pnb163v3] = { - DER_OID_V_c2pnb163v3 -}; - -/* - * c2pnb176w1 OBJECT IDENTIFIER ::= { c-TwoCurve 4 } - */ -const unsigned char ossl_der_oid_c2pnb176w1[DER_OID_SZ_c2pnb176w1] = { - DER_OID_V_c2pnb176w1 -}; - -/* - * c2tnb191v1 OBJECT IDENTIFIER ::= { c-TwoCurve 5 } - */ -const unsigned char ossl_der_oid_c2tnb191v1[DER_OID_SZ_c2tnb191v1] = { - DER_OID_V_c2tnb191v1 -}; - -/* - * c2tnb191v2 OBJECT IDENTIFIER ::= { c-TwoCurve 6 } - */ -const unsigned char ossl_der_oid_c2tnb191v2[DER_OID_SZ_c2tnb191v2] = { - DER_OID_V_c2tnb191v2 -}; - -/* - * c2tnb191v3 OBJECT IDENTIFIER ::= { c-TwoCurve 7 } - */ -const unsigned char ossl_der_oid_c2tnb191v3[DER_OID_SZ_c2tnb191v3] = { - DER_OID_V_c2tnb191v3 -}; - -/* - * c2onb191v4 OBJECT IDENTIFIER ::= { c-TwoCurve 8 } - */ -const unsigned char ossl_der_oid_c2onb191v4[DER_OID_SZ_c2onb191v4] = { - DER_OID_V_c2onb191v4 -}; - -/* - * c2onb191v5 OBJECT IDENTIFIER ::= { c-TwoCurve 9 } - */ -const unsigned char ossl_der_oid_c2onb191v5[DER_OID_SZ_c2onb191v5] = { - DER_OID_V_c2onb191v5 -}; - -/* - * c2pnb208w1 OBJECT IDENTIFIER ::= { c-TwoCurve 10 } - */ -const unsigned char ossl_der_oid_c2pnb208w1[DER_OID_SZ_c2pnb208w1] = { - DER_OID_V_c2pnb208w1 -}; - -/* - * c2tnb239v1 OBJECT IDENTIFIER ::= { c-TwoCurve 11 } - */ -const unsigned char ossl_der_oid_c2tnb239v1[DER_OID_SZ_c2tnb239v1] = { - DER_OID_V_c2tnb239v1 -}; - -/* - * c2tnb239v2 OBJECT IDENTIFIER ::= { c-TwoCurve 12 } - */ -const unsigned char ossl_der_oid_c2tnb239v2[DER_OID_SZ_c2tnb239v2] = { - DER_OID_V_c2tnb239v2 -}; - -/* - * c2tnb239v3 OBJECT IDENTIFIER ::= { c-TwoCurve 13 } - */ -const unsigned char ossl_der_oid_c2tnb239v3[DER_OID_SZ_c2tnb239v3] = { - DER_OID_V_c2tnb239v3 -}; - -/* - * c2onb239v4 OBJECT IDENTIFIER ::= { c-TwoCurve 14 } - */ -const unsigned char ossl_der_oid_c2onb239v4[DER_OID_SZ_c2onb239v4] = { - DER_OID_V_c2onb239v4 -}; - -/* - * c2onb239v5 OBJECT IDENTIFIER ::= { c-TwoCurve 15 } - */ -const unsigned char ossl_der_oid_c2onb239v5[DER_OID_SZ_c2onb239v5] = { - DER_OID_V_c2onb239v5 -}; - -/* - * c2pnb272w1 OBJECT IDENTIFIER ::= { c-TwoCurve 16 } - */ -const unsigned char ossl_der_oid_c2pnb272w1[DER_OID_SZ_c2pnb272w1] = { - DER_OID_V_c2pnb272w1 -}; - -/* - * c2pnb304w1 OBJECT IDENTIFIER ::= { c-TwoCurve 17 } - */ -const unsigned char ossl_der_oid_c2pnb304w1[DER_OID_SZ_c2pnb304w1] = { - DER_OID_V_c2pnb304w1 -}; - -/* - * c2tnb359v1 OBJECT IDENTIFIER ::= { c-TwoCurve 18 } - */ -const unsigned char ossl_der_oid_c2tnb359v1[DER_OID_SZ_c2tnb359v1] = { - DER_OID_V_c2tnb359v1 -}; - -/* - * c2pnb368w1 OBJECT IDENTIFIER ::= { c-TwoCurve 19 } - */ -const unsigned char ossl_der_oid_c2pnb368w1[DER_OID_SZ_c2pnb368w1] = { - DER_OID_V_c2pnb368w1 -}; - -/* - * c2tnb431r1 OBJECT IDENTIFIER ::= { c-TwoCurve 20 } - */ -const unsigned char ossl_der_oid_c2tnb431r1[DER_OID_SZ_c2tnb431r1] = { - DER_OID_V_c2tnb431r1 -}; - -/* - * prime192v1 OBJECT IDENTIFIER ::= { primeCurve 1 } - */ -const unsigned char ossl_der_oid_prime192v1[DER_OID_SZ_prime192v1] = { - DER_OID_V_prime192v1 -}; - -/* - * prime192v2 OBJECT IDENTIFIER ::= { primeCurve 2 } - */ -const unsigned char ossl_der_oid_prime192v2[DER_OID_SZ_prime192v2] = { - DER_OID_V_prime192v2 -}; - -/* - * prime192v3 OBJECT IDENTIFIER ::= { primeCurve 3 } - */ -const unsigned char ossl_der_oid_prime192v3[DER_OID_SZ_prime192v3] = { - DER_OID_V_prime192v3 -}; - -/* - * prime239v1 OBJECT IDENTIFIER ::= { primeCurve 4 } - */ -const unsigned char ossl_der_oid_prime239v1[DER_OID_SZ_prime239v1] = { - DER_OID_V_prime239v1 -}; - -/* - * prime239v2 OBJECT IDENTIFIER ::= { primeCurve 5 } - */ -const unsigned char ossl_der_oid_prime239v2[DER_OID_SZ_prime239v2] = { - DER_OID_V_prime239v2 -}; - -/* - * prime239v3 OBJECT IDENTIFIER ::= { primeCurve 6 } - */ -const unsigned char ossl_der_oid_prime239v3[DER_OID_SZ_prime239v3] = { - DER_OID_V_prime239v3 -}; - -/* - * prime256v1 OBJECT IDENTIFIER ::= { primeCurve 7 } - */ -const unsigned char ossl_der_oid_prime256v1[DER_OID_SZ_prime256v1] = { - DER_OID_V_prime256v1 -}; - -/* - * ecdsa-with-SHA224 OBJECT IDENTIFIER ::= { iso(1) member-body(2) - * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 1 } - */ -const unsigned char ossl_der_oid_ecdsa_with_SHA224[DER_OID_SZ_ecdsa_with_SHA224] = { - DER_OID_V_ecdsa_with_SHA224 -}; - -/* - * ecdsa-with-SHA256 OBJECT IDENTIFIER ::= { iso(1) member-body(2) - * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 2 } - */ -const unsigned char ossl_der_oid_ecdsa_with_SHA256[DER_OID_SZ_ecdsa_with_SHA256] = { - DER_OID_V_ecdsa_with_SHA256 -}; - -/* - * ecdsa-with-SHA384 OBJECT IDENTIFIER ::= { iso(1) member-body(2) - * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 3 } - */ -const unsigned char ossl_der_oid_ecdsa_with_SHA384[DER_OID_SZ_ecdsa_with_SHA384] = { - DER_OID_V_ecdsa_with_SHA384 -}; - -/* - * ecdsa-with-SHA512 OBJECT IDENTIFIER ::= { iso(1) member-body(2) - * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 4 } - */ -const unsigned char ossl_der_oid_ecdsa_with_SHA512[DER_OID_SZ_ecdsa_with_SHA512] = { - DER_OID_V_ecdsa_with_SHA512 -}; - -/* - * id-ecdsa-with-sha3-224 OBJECT IDENTIFIER ::= { sigAlgs 9 } - */ -const unsigned char ossl_der_oid_id_ecdsa_with_sha3_224[DER_OID_SZ_id_ecdsa_with_sha3_224] = { - DER_OID_V_id_ecdsa_with_sha3_224 -}; - -/* - * id-ecdsa-with-sha3-256 OBJECT IDENTIFIER ::= { sigAlgs 10 } - */ -const unsigned char ossl_der_oid_id_ecdsa_with_sha3_256[DER_OID_SZ_id_ecdsa_with_sha3_256] = { - DER_OID_V_id_ecdsa_with_sha3_256 -}; - -/* - * id-ecdsa-with-sha3-384 OBJECT IDENTIFIER ::= { sigAlgs 11 } - */ -const unsigned char ossl_der_oid_id_ecdsa_with_sha3_384[DER_OID_SZ_id_ecdsa_with_sha3_384] = { - DER_OID_V_id_ecdsa_with_sha3_384 -}; - -/* - * id-ecdsa-with-sha3-512 OBJECT IDENTIFIER ::= { sigAlgs 12 } - */ -const unsigned char ossl_der_oid_id_ecdsa_with_sha3_512[DER_OID_SZ_id_ecdsa_with_sha3_512] = { - DER_OID_V_id_ecdsa_with_sha3_512 -}; - diff --git a/deps/openssl/config/archs/aix-gcc/asm_avx2/providers/common/der/der_ecx_gen.c b/deps/openssl/config/archs/aix-gcc/asm_avx2/providers/common/der/der_ecx_gen.c deleted file mode 100644 index ba7bf14b5e156d..00000000000000 --- a/deps/openssl/config/archs/aix-gcc/asm_avx2/providers/common/der/der_ecx_gen.c +++ /dev/null @@ -1,44 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_ecx_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_ecx.h" - -/* Well known OIDs precompiled */ - -/* - * id-X25519 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 110 } - */ -const unsigned char ossl_der_oid_id_X25519[DER_OID_SZ_id_X25519] = { - DER_OID_V_id_X25519 -}; - -/* - * id-X448 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 111 } - */ -const unsigned char ossl_der_oid_id_X448[DER_OID_SZ_id_X448] = { - DER_OID_V_id_X448 -}; - -/* - * id-Ed25519 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 112 } - */ -const unsigned char ossl_der_oid_id_Ed25519[DER_OID_SZ_id_Ed25519] = { - DER_OID_V_id_Ed25519 -}; - -/* - * id-Ed448 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 113 } - */ -const unsigned char ossl_der_oid_id_Ed448[DER_OID_SZ_id_Ed448] = { - DER_OID_V_id_Ed448 -}; - diff --git a/deps/openssl/config/archs/aix-gcc/asm_avx2/providers/common/der/der_rsa_gen.c b/deps/openssl/config/archs/aix-gcc/asm_avx2/providers/common/der/der_rsa_gen.c deleted file mode 100644 index a3431798402f3f..00000000000000 --- a/deps/openssl/config/archs/aix-gcc/asm_avx2/providers/common/der/der_rsa_gen.c +++ /dev/null @@ -1,174 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_rsa_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_rsa.h" - -/* Well known OIDs precompiled */ - -/* - * hashAlgs OBJECT IDENTIFIER ::= { nistAlgorithms 2 } - */ -const unsigned char ossl_der_oid_hashAlgs[DER_OID_SZ_hashAlgs] = { - DER_OID_V_hashAlgs -}; - -/* - * rsaEncryption OBJECT IDENTIFIER ::= { pkcs-1 1 } - */ -const unsigned char ossl_der_oid_rsaEncryption[DER_OID_SZ_rsaEncryption] = { - DER_OID_V_rsaEncryption -}; - -/* - * id-RSAES-OAEP OBJECT IDENTIFIER ::= { pkcs-1 7 } - */ -const unsigned char ossl_der_oid_id_RSAES_OAEP[DER_OID_SZ_id_RSAES_OAEP] = { - DER_OID_V_id_RSAES_OAEP -}; - -/* - * id-pSpecified OBJECT IDENTIFIER ::= { pkcs-1 9 } - */ -const unsigned char ossl_der_oid_id_pSpecified[DER_OID_SZ_id_pSpecified] = { - DER_OID_V_id_pSpecified -}; - -/* - * id-RSASSA-PSS OBJECT IDENTIFIER ::= { pkcs-1 10 } - */ -const unsigned char ossl_der_oid_id_RSASSA_PSS[DER_OID_SZ_id_RSASSA_PSS] = { - DER_OID_V_id_RSASSA_PSS -}; - -/* - * md2WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 2 } - */ -const unsigned char ossl_der_oid_md2WithRSAEncryption[DER_OID_SZ_md2WithRSAEncryption] = { - DER_OID_V_md2WithRSAEncryption -}; - -/* - * md5WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 4 } - */ -const unsigned char ossl_der_oid_md5WithRSAEncryption[DER_OID_SZ_md5WithRSAEncryption] = { - DER_OID_V_md5WithRSAEncryption -}; - -/* - * sha1WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 5 } - */ -const unsigned char ossl_der_oid_sha1WithRSAEncryption[DER_OID_SZ_sha1WithRSAEncryption] = { - DER_OID_V_sha1WithRSAEncryption -}; - -/* - * sha224WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 14 } - */ -const unsigned char ossl_der_oid_sha224WithRSAEncryption[DER_OID_SZ_sha224WithRSAEncryption] = { - DER_OID_V_sha224WithRSAEncryption -}; - -/* - * sha256WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 11 } - */ -const unsigned char ossl_der_oid_sha256WithRSAEncryption[DER_OID_SZ_sha256WithRSAEncryption] = { - DER_OID_V_sha256WithRSAEncryption -}; - -/* - * sha384WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 12 } - */ -const unsigned char ossl_der_oid_sha384WithRSAEncryption[DER_OID_SZ_sha384WithRSAEncryption] = { - DER_OID_V_sha384WithRSAEncryption -}; - -/* - * sha512WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 13 } - */ -const unsigned char ossl_der_oid_sha512WithRSAEncryption[DER_OID_SZ_sha512WithRSAEncryption] = { - DER_OID_V_sha512WithRSAEncryption -}; - -/* - * sha512-224WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 15 } - */ -const unsigned char ossl_der_oid_sha512_224WithRSAEncryption[DER_OID_SZ_sha512_224WithRSAEncryption] = { - DER_OID_V_sha512_224WithRSAEncryption -}; - -/* - * sha512-256WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 16 } - */ -const unsigned char ossl_der_oid_sha512_256WithRSAEncryption[DER_OID_SZ_sha512_256WithRSAEncryption] = { - DER_OID_V_sha512_256WithRSAEncryption -}; - -/* - * id-mgf1 OBJECT IDENTIFIER ::= { pkcs-1 8 } - */ -const unsigned char ossl_der_oid_id_mgf1[DER_OID_SZ_id_mgf1] = { - DER_OID_V_id_mgf1 -}; - -/* - * id-rsassa-pkcs1-v1_5-with-sha3-224 OBJECT IDENTIFIER ::= { sigAlgs 13 } - */ -const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_224[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_224] = { - DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_224 -}; - -/* - * id-rsassa-pkcs1-v1_5-with-sha3-256 OBJECT IDENTIFIER ::= { sigAlgs 14 } - */ -const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_256[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_256] = { - DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_256 -}; - -/* - * id-rsassa-pkcs1-v1_5-with-sha3-384 OBJECT IDENTIFIER ::= { sigAlgs 15 } - */ -const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_384[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_384] = { - DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_384 -}; - -/* - * id-rsassa-pkcs1-v1_5-with-sha3-512 OBJECT IDENTIFIER ::= { sigAlgs 16 } - */ -const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_512[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_512] = { - DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_512 -}; - -/* - * md4WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 3 } - */ -const unsigned char ossl_der_oid_md4WithRSAEncryption[DER_OID_SZ_md4WithRSAEncryption] = { - DER_OID_V_md4WithRSAEncryption -}; - -/* - * ripemd160WithRSAEncryption OBJECT IDENTIFIER ::= { - * iso(1) identified-organization(3) teletrust(36) algorithm(3) signatureAlgorithm(3) rsaSignature(1) 2 - * } - */ -const unsigned char ossl_der_oid_ripemd160WithRSAEncryption[DER_OID_SZ_ripemd160WithRSAEncryption] = { - DER_OID_V_ripemd160WithRSAEncryption -}; - -/* - * mdc2WithRSASignature OBJECT IDENTIFIER ::= { - * iso(1) identified-organization(3) oiw(14) secsig(3) algorithms(2) mdc2WithRSASignature(14) - * } - */ -const unsigned char ossl_der_oid_mdc2WithRSASignature[DER_OID_SZ_mdc2WithRSASignature] = { - DER_OID_V_mdc2WithRSASignature -}; - diff --git a/deps/openssl/config/archs/aix-gcc/asm_avx2/providers/common/der/der_sm2_gen.c b/deps/openssl/config/archs/aix-gcc/asm_avx2/providers/common/der/der_sm2_gen.c deleted file mode 100644 index 6424ea166b7e15..00000000000000 --- a/deps/openssl/config/archs/aix-gcc/asm_avx2/providers/common/der/der_sm2_gen.c +++ /dev/null @@ -1,30 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_sm2_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_sm2.h" - -/* Well known OIDs precompiled */ - -/* - * sm2-with-SM3 OBJECT IDENTIFIER ::= { sm-scheme 501 } - */ -const unsigned char ossl_der_oid_sm2_with_SM3[DER_OID_SZ_sm2_with_SM3] = { - DER_OID_V_sm2_with_SM3 -}; - -/* - * curveSM2 OBJECT IDENTIFIER ::= { sm-scheme 301 } - */ -const unsigned char ossl_der_oid_curveSM2[DER_OID_SZ_curveSM2] = { - DER_OID_V_curveSM2 -}; - diff --git a/deps/openssl/config/archs/aix-gcc/asm_avx2/providers/common/der/der_wrap_gen.c b/deps/openssl/config/archs/aix-gcc/asm_avx2/providers/common/der/der_wrap_gen.c deleted file mode 100644 index 6cf93972f48b6d..00000000000000 --- a/deps/openssl/config/archs/aix-gcc/asm_avx2/providers/common/der/der_wrap_gen.c +++ /dev/null @@ -1,46 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_wrap_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_wrap.h" - -/* Well known OIDs precompiled */ - -/* - * id-alg-CMS3DESwrap OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs-9(9) smime(16) alg(3) 6 - * } - */ -const unsigned char ossl_der_oid_id_alg_CMS3DESwrap[DER_OID_SZ_id_alg_CMS3DESwrap] = { - DER_OID_V_id_alg_CMS3DESwrap -}; - -/* - * id-aes128-wrap OBJECT IDENTIFIER ::= { aes 5 } - */ -const unsigned char ossl_der_oid_id_aes128_wrap[DER_OID_SZ_id_aes128_wrap] = { - DER_OID_V_id_aes128_wrap -}; - -/* - * id-aes192-wrap OBJECT IDENTIFIER ::= { aes 25 } - */ -const unsigned char ossl_der_oid_id_aes192_wrap[DER_OID_SZ_id_aes192_wrap] = { - DER_OID_V_id_aes192_wrap -}; - -/* - * id-aes256-wrap OBJECT IDENTIFIER ::= { aes 45 } - */ -const unsigned char ossl_der_oid_id_aes256_wrap[DER_OID_SZ_id_aes256_wrap] = { - DER_OID_V_id_aes256_wrap -}; - diff --git a/deps/openssl/config/archs/aix-gcc/asm_avx2/providers/fips.ld b/deps/openssl/config/archs/aix-gcc/asm_avx2/providers/fips.ld deleted file mode 100644 index 8d6632bf3866af..00000000000000 --- a/deps/openssl/config/archs/aix-gcc/asm_avx2/providers/fips.ld +++ /dev/null @@ -1 +0,0 @@ -OSSL_provider_init diff --git a/deps/openssl/config/archs/aix-gcc/asm_avx2/providers/legacy.ld b/deps/openssl/config/archs/aix-gcc/asm_avx2/providers/legacy.ld deleted file mode 100644 index 8d6632bf3866af..00000000000000 --- a/deps/openssl/config/archs/aix-gcc/asm_avx2/providers/legacy.ld +++ /dev/null @@ -1 +0,0 @@ -OSSL_provider_init diff --git a/deps/openssl/config/archs/aix-gcc/no-asm/apps/progs.c b/deps/openssl/config/archs/aix-gcc/no-asm/apps/progs.c deleted file mode 100644 index f594c302c42ec6..00000000000000 --- a/deps/openssl/config/archs/aix-gcc/no-asm/apps/progs.c +++ /dev/null @@ -1,397 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by apps/progs.pl - * - * Copyright 1995-2022 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "progs.h" - -FUNCTION functions[] = { - {FT_general, "asn1parse", asn1parse_main, asn1parse_options, NULL, NULL}, - {FT_general, "ca", ca_main, ca_options, NULL, NULL}, -#ifndef OPENSSL_NO_SOCK - {FT_general, "ciphers", ciphers_main, ciphers_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_CMP - {FT_general, "cmp", cmp_main, cmp_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_CMS - {FT_general, "cms", cms_main, cms_options, NULL, NULL}, -#endif - {FT_general, "crl", crl_main, crl_options, NULL, NULL}, - {FT_general, "crl2pkcs7", crl2pkcs7_main, crl2pkcs7_options, NULL, NULL}, - {FT_general, "dgst", dgst_main, dgst_options, NULL, NULL}, -#ifndef OPENSSL_NO_DH - {FT_general, "dhparam", dhparam_main, dhparam_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_DSA - {FT_general, "dsa", dsa_main, dsa_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_DSA - {FT_general, "dsaparam", dsaparam_main, dsaparam_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_EC - {FT_general, "ec", ec_main, ec_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_EC - {FT_general, "ecparam", ecparam_main, ecparam_options, NULL, NULL}, -#endif - {FT_general, "enc", enc_main, enc_options, NULL, NULL}, -#ifndef OPENSSL_NO_ENGINE - {FT_general, "engine", engine_main, engine_options, NULL, NULL}, -#endif - {FT_general, "errstr", errstr_main, errstr_options, NULL, NULL}, - {FT_general, "fipsinstall", fipsinstall_main, fipsinstall_options, NULL, NULL}, -#ifndef OPENSSL_NO_DSA - {FT_general, "gendsa", gendsa_main, gendsa_options, NULL, NULL}, -#endif - {FT_general, "genpkey", genpkey_main, genpkey_options, NULL, NULL}, -#ifndef OPENSSL_NO_RSA - {FT_general, "genrsa", genrsa_main, genrsa_options, NULL, NULL}, -#endif - {FT_general, "help", help_main, help_options, NULL, NULL}, - {FT_general, "info", info_main, info_options, NULL, NULL}, - {FT_general, "kdf", kdf_main, kdf_options, NULL, NULL}, - {FT_general, "list", list_main, list_options, NULL, NULL}, - {FT_general, "mac", mac_main, mac_options, NULL, NULL}, - {FT_general, "nseq", nseq_main, nseq_options, NULL, NULL}, -#ifndef OPENSSL_NO_OCSP - {FT_general, "ocsp", ocsp_main, ocsp_options, NULL, NULL}, -#endif - {FT_general, "passwd", passwd_main, passwd_options, NULL, NULL}, - {FT_general, "pkcs12", pkcs12_main, pkcs12_options, NULL, NULL}, - {FT_general, "pkcs7", pkcs7_main, pkcs7_options, NULL, NULL}, - {FT_general, "pkcs8", pkcs8_main, pkcs8_options, NULL, NULL}, - {FT_general, "pkey", pkey_main, pkey_options, NULL, NULL}, - {FT_general, "pkeyparam", pkeyparam_main, pkeyparam_options, NULL, NULL}, - {FT_general, "pkeyutl", pkeyutl_main, pkeyutl_options, NULL, NULL}, - {FT_general, "prime", prime_main, prime_options, NULL, NULL}, - {FT_general, "rand", rand_main, rand_options, NULL, NULL}, - {FT_general, "rehash", rehash_main, rehash_options, NULL, NULL}, - {FT_general, "req", req_main, req_options, NULL, NULL}, - {FT_general, "rsa", rsa_main, rsa_options, NULL, NULL}, -#if !defined(OPENSSL_NO_DEPRECATED_3_0) && !defined(OPENSSL_NO_RSA) - {FT_general, "rsautl", rsautl_main, rsautl_options, "pkeyutl", "3.0"}, -#endif -#ifndef OPENSSL_NO_SOCK - {FT_general, "s_client", s_client_main, s_client_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_SOCK - {FT_general, "s_server", s_server_main, s_server_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_SOCK - {FT_general, "s_time", s_time_main, s_time_options, NULL, NULL}, -#endif - {FT_general, "sess_id", sess_id_main, sess_id_options, NULL, NULL}, - {FT_general, "smime", smime_main, smime_options, NULL, NULL}, - {FT_general, "speed", speed_main, speed_options, NULL, NULL}, - {FT_general, "spkac", spkac_main, spkac_options, NULL, NULL}, -#ifndef OPENSSL_NO_SRP - {FT_general, "srp", srp_main, srp_options, NULL, NULL}, -#endif - {FT_general, "storeutl", storeutl_main, storeutl_options, NULL, NULL}, -#ifndef OPENSSL_NO_TS - {FT_general, "ts", ts_main, ts_options, NULL, NULL}, -#endif - {FT_general, "verify", verify_main, verify_options, NULL, NULL}, - {FT_general, "version", version_main, version_options, NULL, NULL}, - {FT_general, "x509", x509_main, x509_options, NULL, NULL}, -#ifndef OPENSSL_NO_MD2 - {FT_md, "md2", dgst_main, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_MD4 - {FT_md, "md4", dgst_main, NULL, NULL}, -#endif - {FT_md, "md5", dgst_main, NULL, NULL}, - {FT_md, "sha1", dgst_main, NULL, NULL}, - {FT_md, "sha224", dgst_main, NULL, NULL}, - {FT_md, "sha256", dgst_main, NULL, NULL}, - {FT_md, "sha384", dgst_main, NULL, NULL}, - {FT_md, "sha512", dgst_main, NULL, NULL}, - {FT_md, "sha512-224", dgst_main, NULL, NULL}, - {FT_md, "sha512-256", dgst_main, NULL, NULL}, - {FT_md, "sha3-224", dgst_main, NULL, NULL}, - {FT_md, "sha3-256", dgst_main, NULL, NULL}, - {FT_md, "sha3-384", dgst_main, NULL, NULL}, - {FT_md, "sha3-512", dgst_main, NULL, NULL}, - {FT_md, "shake128", dgst_main, NULL, NULL}, - {FT_md, "shake256", dgst_main, NULL, NULL}, -#ifndef OPENSSL_NO_MDC2 - {FT_md, "mdc2", dgst_main, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_RMD160 - {FT_md, "rmd160", dgst_main, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_BLAKE2 - {FT_md, "blake2b512", dgst_main, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_BLAKE2 - {FT_md, "blake2s256", dgst_main, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_SM3 - {FT_md, "sm3", dgst_main, NULL, NULL}, -#endif - {FT_cipher, "aes-128-cbc", enc_main, enc_options, NULL}, - {FT_cipher, "aes-128-ecb", enc_main, enc_options, NULL}, - {FT_cipher, "aes-192-cbc", enc_main, enc_options, NULL}, - {FT_cipher, "aes-192-ecb", enc_main, enc_options, NULL}, - {FT_cipher, "aes-256-cbc", enc_main, enc_options, NULL}, - {FT_cipher, "aes-256-ecb", enc_main, enc_options, NULL}, -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-ctr", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-cfb1", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-cfb8", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-ctr", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-cfb1", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-cfb8", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-ctr", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-cfb1", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-cfb8", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-128-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-128-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-192-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-192-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-256-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-256-ecb", enc_main, enc_options, NULL}, -#endif - {FT_cipher, "base64", enc_main, enc_options, NULL}, -#ifdef ZLIB - {FT_cipher, "zlib", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des3", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "desx", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC4 - {FT_cipher, "rc4", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC4 - {FT_cipher, "rc4-40", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede3", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede3-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede3-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede3-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-64-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-40-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast5-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast5-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast5-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast5-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-ctr", enc_main, enc_options, NULL}, -#endif - {0, NULL, NULL, NULL, NULL} -}; diff --git a/deps/openssl/config/archs/aix-gcc/no-asm/providers/common/der/der_digests_gen.c b/deps/openssl/config/archs/aix-gcc/no-asm/providers/common/der/der_digests_gen.c deleted file mode 100644 index e4e14e82e5648a..00000000000000 --- a/deps/openssl/config/archs/aix-gcc/no-asm/providers/common/der/der_digests_gen.c +++ /dev/null @@ -1,160 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_digests_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_digests.h" - -/* Well known OIDs precompiled */ - -/* - * sigAlgs OBJECT IDENTIFIER ::= { nistAlgorithms 3 } - */ -const unsigned char ossl_der_oid_sigAlgs[DER_OID_SZ_sigAlgs] = { - DER_OID_V_sigAlgs -}; - -/* - * id-sha1 OBJECT IDENTIFIER ::= { iso(1) - * identified-organization(3) oiw(14) - * secsig(3) algorithms(2) 26 } - */ -const unsigned char ossl_der_oid_id_sha1[DER_OID_SZ_id_sha1] = { - DER_OID_V_id_sha1 -}; - -/* - * id-md2 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 2 } - */ -const unsigned char ossl_der_oid_id_md2[DER_OID_SZ_id_md2] = { - DER_OID_V_id_md2 -}; - -/* - * id-md5 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 5 } - */ -const unsigned char ossl_der_oid_id_md5[DER_OID_SZ_id_md5] = { - DER_OID_V_id_md5 -}; - -/* - * id-sha256 OBJECT IDENTIFIER ::= { hashAlgs 1 } - */ -const unsigned char ossl_der_oid_id_sha256[DER_OID_SZ_id_sha256] = { - DER_OID_V_id_sha256 -}; - -/* - * id-sha384 OBJECT IDENTIFIER ::= { hashAlgs 2 } - */ -const unsigned char ossl_der_oid_id_sha384[DER_OID_SZ_id_sha384] = { - DER_OID_V_id_sha384 -}; - -/* - * id-sha512 OBJECT IDENTIFIER ::= { hashAlgs 3 } - */ -const unsigned char ossl_der_oid_id_sha512[DER_OID_SZ_id_sha512] = { - DER_OID_V_id_sha512 -}; - -/* - * id-sha224 OBJECT IDENTIFIER ::= { hashAlgs 4 } - */ -const unsigned char ossl_der_oid_id_sha224[DER_OID_SZ_id_sha224] = { - DER_OID_V_id_sha224 -}; - -/* - * id-sha512-224 OBJECT IDENTIFIER ::= { hashAlgs 5 } - */ -const unsigned char ossl_der_oid_id_sha512_224[DER_OID_SZ_id_sha512_224] = { - DER_OID_V_id_sha512_224 -}; - -/* - * id-sha512-256 OBJECT IDENTIFIER ::= { hashAlgs 6 } - */ -const unsigned char ossl_der_oid_id_sha512_256[DER_OID_SZ_id_sha512_256] = { - DER_OID_V_id_sha512_256 -}; - -/* - * id-sha3-224 OBJECT IDENTIFIER ::= { hashAlgs 7 } - */ -const unsigned char ossl_der_oid_id_sha3_224[DER_OID_SZ_id_sha3_224] = { - DER_OID_V_id_sha3_224 -}; - -/* - * id-sha3-256 OBJECT IDENTIFIER ::= { hashAlgs 8 } - */ -const unsigned char ossl_der_oid_id_sha3_256[DER_OID_SZ_id_sha3_256] = { - DER_OID_V_id_sha3_256 -}; - -/* - * id-sha3-384 OBJECT IDENTIFIER ::= { hashAlgs 9 } - */ -const unsigned char ossl_der_oid_id_sha3_384[DER_OID_SZ_id_sha3_384] = { - DER_OID_V_id_sha3_384 -}; - -/* - * id-sha3-512 OBJECT IDENTIFIER ::= { hashAlgs 10 } - */ -const unsigned char ossl_der_oid_id_sha3_512[DER_OID_SZ_id_sha3_512] = { - DER_OID_V_id_sha3_512 -}; - -/* - * id-shake128 OBJECT IDENTIFIER ::= { hashAlgs 11 } - */ -const unsigned char ossl_der_oid_id_shake128[DER_OID_SZ_id_shake128] = { - DER_OID_V_id_shake128 -}; - -/* - * id-shake256 OBJECT IDENTIFIER ::= { hashAlgs 12 } - */ -const unsigned char ossl_der_oid_id_shake256[DER_OID_SZ_id_shake256] = { - DER_OID_V_id_shake256 -}; - -/* - * id-shake128-len OBJECT IDENTIFIER ::= { hashAlgs 17 } - */ -const unsigned char ossl_der_oid_id_shake128_len[DER_OID_SZ_id_shake128_len] = { - DER_OID_V_id_shake128_len -}; - -/* - * id-shake256-len OBJECT IDENTIFIER ::= { hashAlgs 18 } - */ -const unsigned char ossl_der_oid_id_shake256_len[DER_OID_SZ_id_shake256_len] = { - DER_OID_V_id_shake256_len -}; - -/* - * id-KMACWithSHAKE128 OBJECT IDENTIFIER ::={hashAlgs 19} - */ -const unsigned char ossl_der_oid_id_KMACWithSHAKE128[DER_OID_SZ_id_KMACWithSHAKE128] = { - DER_OID_V_id_KMACWithSHAKE128 -}; - -/* - * id-KMACWithSHAKE256 OBJECT IDENTIFIER ::={ hashAlgs 20} - */ -const unsigned char ossl_der_oid_id_KMACWithSHAKE256[DER_OID_SZ_id_KMACWithSHAKE256] = { - DER_OID_V_id_KMACWithSHAKE256 -}; - diff --git a/deps/openssl/config/archs/aix-gcc/no-asm/providers/common/der/der_dsa_gen.c b/deps/openssl/config/archs/aix-gcc/no-asm/providers/common/der/der_dsa_gen.c deleted file mode 100644 index e5cfe91e0f2510..00000000000000 --- a/deps/openssl/config/archs/aix-gcc/no-asm/providers/common/der/der_dsa_gen.c +++ /dev/null @@ -1,94 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_dsa_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -/* - * DSA low level APIs are deprecated for public use, but still ok for - * internal use. - */ -#include "internal/deprecated.h" - -#include "prov/der_dsa.h" - -/* Well known OIDs precompiled */ - -/* - * id-dsa OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) x9-57(10040) x9algorithm(4) 1 } - */ -const unsigned char ossl_der_oid_id_dsa[DER_OID_SZ_id_dsa] = { - DER_OID_V_id_dsa -}; - -/* - * id-dsa-with-sha1 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) x9-57 (10040) x9algorithm(4) 3 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha1[DER_OID_SZ_id_dsa_with_sha1] = { - DER_OID_V_id_dsa_with_sha1 -}; - -/* - * id-dsa-with-sha224 OBJECT IDENTIFIER ::= { sigAlgs 1 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha224[DER_OID_SZ_id_dsa_with_sha224] = { - DER_OID_V_id_dsa_with_sha224 -}; - -/* - * id-dsa-with-sha256 OBJECT IDENTIFIER ::= { sigAlgs 2 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha256[DER_OID_SZ_id_dsa_with_sha256] = { - DER_OID_V_id_dsa_with_sha256 -}; - -/* - * id-dsa-with-sha384 OBJECT IDENTIFIER ::= { sigAlgs 3 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha384[DER_OID_SZ_id_dsa_with_sha384] = { - DER_OID_V_id_dsa_with_sha384 -}; - -/* - * id-dsa-with-sha512 OBJECT IDENTIFIER ::= { sigAlgs 4 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha512[DER_OID_SZ_id_dsa_with_sha512] = { - DER_OID_V_id_dsa_with_sha512 -}; - -/* - * id-dsa-with-sha3-224 OBJECT IDENTIFIER ::= { sigAlgs 5 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha3_224[DER_OID_SZ_id_dsa_with_sha3_224] = { - DER_OID_V_id_dsa_with_sha3_224 -}; - -/* - * id-dsa-with-sha3-256 OBJECT IDENTIFIER ::= { sigAlgs 6 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha3_256[DER_OID_SZ_id_dsa_with_sha3_256] = { - DER_OID_V_id_dsa_with_sha3_256 -}; - -/* - * id-dsa-with-sha3-384 OBJECT IDENTIFIER ::= { sigAlgs 7 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha3_384[DER_OID_SZ_id_dsa_with_sha3_384] = { - DER_OID_V_id_dsa_with_sha3_384 -}; - -/* - * id-dsa-with-sha3-512 OBJECT IDENTIFIER ::= { sigAlgs 8 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha3_512[DER_OID_SZ_id_dsa_with_sha3_512] = { - DER_OID_V_id_dsa_with_sha3_512 -}; - diff --git a/deps/openssl/config/archs/aix-gcc/no-asm/providers/common/der/der_ec_gen.c b/deps/openssl/config/archs/aix-gcc/no-asm/providers/common/der/der_ec_gen.c deleted file mode 100644 index e1ed54ba05b6ff..00000000000000 --- a/deps/openssl/config/archs/aix-gcc/no-asm/providers/common/der/der_ec_gen.c +++ /dev/null @@ -1,279 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_ec_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_ec.h" - -/* Well known OIDs precompiled */ - -/* - * ecdsa-with-SHA1 OBJECT IDENTIFIER ::= { id-ecSigType 1 } - */ -const unsigned char ossl_der_oid_ecdsa_with_SHA1[DER_OID_SZ_ecdsa_with_SHA1] = { - DER_OID_V_ecdsa_with_SHA1 -}; - -/* - * id-ecPublicKey OBJECT IDENTIFIER ::= { id-publicKeyType 1 } - */ -const unsigned char ossl_der_oid_id_ecPublicKey[DER_OID_SZ_id_ecPublicKey] = { - DER_OID_V_id_ecPublicKey -}; - -/* - * c2pnb163v1 OBJECT IDENTIFIER ::= { c-TwoCurve 1 } - */ -const unsigned char ossl_der_oid_c2pnb163v1[DER_OID_SZ_c2pnb163v1] = { - DER_OID_V_c2pnb163v1 -}; - -/* - * c2pnb163v2 OBJECT IDENTIFIER ::= { c-TwoCurve 2 } - */ -const unsigned char ossl_der_oid_c2pnb163v2[DER_OID_SZ_c2pnb163v2] = { - DER_OID_V_c2pnb163v2 -}; - -/* - * c2pnb163v3 OBJECT IDENTIFIER ::= { c-TwoCurve 3 } - */ -const unsigned char ossl_der_oid_c2pnb163v3[DER_OID_SZ_c2pnb163v3] = { - DER_OID_V_c2pnb163v3 -}; - -/* - * c2pnb176w1 OBJECT IDENTIFIER ::= { c-TwoCurve 4 } - */ -const unsigned char ossl_der_oid_c2pnb176w1[DER_OID_SZ_c2pnb176w1] = { - DER_OID_V_c2pnb176w1 -}; - -/* - * c2tnb191v1 OBJECT IDENTIFIER ::= { c-TwoCurve 5 } - */ -const unsigned char ossl_der_oid_c2tnb191v1[DER_OID_SZ_c2tnb191v1] = { - DER_OID_V_c2tnb191v1 -}; - -/* - * c2tnb191v2 OBJECT IDENTIFIER ::= { c-TwoCurve 6 } - */ -const unsigned char ossl_der_oid_c2tnb191v2[DER_OID_SZ_c2tnb191v2] = { - DER_OID_V_c2tnb191v2 -}; - -/* - * c2tnb191v3 OBJECT IDENTIFIER ::= { c-TwoCurve 7 } - */ -const unsigned char ossl_der_oid_c2tnb191v3[DER_OID_SZ_c2tnb191v3] = { - DER_OID_V_c2tnb191v3 -}; - -/* - * c2onb191v4 OBJECT IDENTIFIER ::= { c-TwoCurve 8 } - */ -const unsigned char ossl_der_oid_c2onb191v4[DER_OID_SZ_c2onb191v4] = { - DER_OID_V_c2onb191v4 -}; - -/* - * c2onb191v5 OBJECT IDENTIFIER ::= { c-TwoCurve 9 } - */ -const unsigned char ossl_der_oid_c2onb191v5[DER_OID_SZ_c2onb191v5] = { - DER_OID_V_c2onb191v5 -}; - -/* - * c2pnb208w1 OBJECT IDENTIFIER ::= { c-TwoCurve 10 } - */ -const unsigned char ossl_der_oid_c2pnb208w1[DER_OID_SZ_c2pnb208w1] = { - DER_OID_V_c2pnb208w1 -}; - -/* - * c2tnb239v1 OBJECT IDENTIFIER ::= { c-TwoCurve 11 } - */ -const unsigned char ossl_der_oid_c2tnb239v1[DER_OID_SZ_c2tnb239v1] = { - DER_OID_V_c2tnb239v1 -}; - -/* - * c2tnb239v2 OBJECT IDENTIFIER ::= { c-TwoCurve 12 } - */ -const unsigned char ossl_der_oid_c2tnb239v2[DER_OID_SZ_c2tnb239v2] = { - DER_OID_V_c2tnb239v2 -}; - -/* - * c2tnb239v3 OBJECT IDENTIFIER ::= { c-TwoCurve 13 } - */ -const unsigned char ossl_der_oid_c2tnb239v3[DER_OID_SZ_c2tnb239v3] = { - DER_OID_V_c2tnb239v3 -}; - -/* - * c2onb239v4 OBJECT IDENTIFIER ::= { c-TwoCurve 14 } - */ -const unsigned char ossl_der_oid_c2onb239v4[DER_OID_SZ_c2onb239v4] = { - DER_OID_V_c2onb239v4 -}; - -/* - * c2onb239v5 OBJECT IDENTIFIER ::= { c-TwoCurve 15 } - */ -const unsigned char ossl_der_oid_c2onb239v5[DER_OID_SZ_c2onb239v5] = { - DER_OID_V_c2onb239v5 -}; - -/* - * c2pnb272w1 OBJECT IDENTIFIER ::= { c-TwoCurve 16 } - */ -const unsigned char ossl_der_oid_c2pnb272w1[DER_OID_SZ_c2pnb272w1] = { - DER_OID_V_c2pnb272w1 -}; - -/* - * c2pnb304w1 OBJECT IDENTIFIER ::= { c-TwoCurve 17 } - */ -const unsigned char ossl_der_oid_c2pnb304w1[DER_OID_SZ_c2pnb304w1] = { - DER_OID_V_c2pnb304w1 -}; - -/* - * c2tnb359v1 OBJECT IDENTIFIER ::= { c-TwoCurve 18 } - */ -const unsigned char ossl_der_oid_c2tnb359v1[DER_OID_SZ_c2tnb359v1] = { - DER_OID_V_c2tnb359v1 -}; - -/* - * c2pnb368w1 OBJECT IDENTIFIER ::= { c-TwoCurve 19 } - */ -const unsigned char ossl_der_oid_c2pnb368w1[DER_OID_SZ_c2pnb368w1] = { - DER_OID_V_c2pnb368w1 -}; - -/* - * c2tnb431r1 OBJECT IDENTIFIER ::= { c-TwoCurve 20 } - */ -const unsigned char ossl_der_oid_c2tnb431r1[DER_OID_SZ_c2tnb431r1] = { - DER_OID_V_c2tnb431r1 -}; - -/* - * prime192v1 OBJECT IDENTIFIER ::= { primeCurve 1 } - */ -const unsigned char ossl_der_oid_prime192v1[DER_OID_SZ_prime192v1] = { - DER_OID_V_prime192v1 -}; - -/* - * prime192v2 OBJECT IDENTIFIER ::= { primeCurve 2 } - */ -const unsigned char ossl_der_oid_prime192v2[DER_OID_SZ_prime192v2] = { - DER_OID_V_prime192v2 -}; - -/* - * prime192v3 OBJECT IDENTIFIER ::= { primeCurve 3 } - */ -const unsigned char ossl_der_oid_prime192v3[DER_OID_SZ_prime192v3] = { - DER_OID_V_prime192v3 -}; - -/* - * prime239v1 OBJECT IDENTIFIER ::= { primeCurve 4 } - */ -const unsigned char ossl_der_oid_prime239v1[DER_OID_SZ_prime239v1] = { - DER_OID_V_prime239v1 -}; - -/* - * prime239v2 OBJECT IDENTIFIER ::= { primeCurve 5 } - */ -const unsigned char ossl_der_oid_prime239v2[DER_OID_SZ_prime239v2] = { - DER_OID_V_prime239v2 -}; - -/* - * prime239v3 OBJECT IDENTIFIER ::= { primeCurve 6 } - */ -const unsigned char ossl_der_oid_prime239v3[DER_OID_SZ_prime239v3] = { - DER_OID_V_prime239v3 -}; - -/* - * prime256v1 OBJECT IDENTIFIER ::= { primeCurve 7 } - */ -const unsigned char ossl_der_oid_prime256v1[DER_OID_SZ_prime256v1] = { - DER_OID_V_prime256v1 -}; - -/* - * ecdsa-with-SHA224 OBJECT IDENTIFIER ::= { iso(1) member-body(2) - * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 1 } - */ -const unsigned char ossl_der_oid_ecdsa_with_SHA224[DER_OID_SZ_ecdsa_with_SHA224] = { - DER_OID_V_ecdsa_with_SHA224 -}; - -/* - * ecdsa-with-SHA256 OBJECT IDENTIFIER ::= { iso(1) member-body(2) - * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 2 } - */ -const unsigned char ossl_der_oid_ecdsa_with_SHA256[DER_OID_SZ_ecdsa_with_SHA256] = { - DER_OID_V_ecdsa_with_SHA256 -}; - -/* - * ecdsa-with-SHA384 OBJECT IDENTIFIER ::= { iso(1) member-body(2) - * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 3 } - */ -const unsigned char ossl_der_oid_ecdsa_with_SHA384[DER_OID_SZ_ecdsa_with_SHA384] = { - DER_OID_V_ecdsa_with_SHA384 -}; - -/* - * ecdsa-with-SHA512 OBJECT IDENTIFIER ::= { iso(1) member-body(2) - * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 4 } - */ -const unsigned char ossl_der_oid_ecdsa_with_SHA512[DER_OID_SZ_ecdsa_with_SHA512] = { - DER_OID_V_ecdsa_with_SHA512 -}; - -/* - * id-ecdsa-with-sha3-224 OBJECT IDENTIFIER ::= { sigAlgs 9 } - */ -const unsigned char ossl_der_oid_id_ecdsa_with_sha3_224[DER_OID_SZ_id_ecdsa_with_sha3_224] = { - DER_OID_V_id_ecdsa_with_sha3_224 -}; - -/* - * id-ecdsa-with-sha3-256 OBJECT IDENTIFIER ::= { sigAlgs 10 } - */ -const unsigned char ossl_der_oid_id_ecdsa_with_sha3_256[DER_OID_SZ_id_ecdsa_with_sha3_256] = { - DER_OID_V_id_ecdsa_with_sha3_256 -}; - -/* - * id-ecdsa-with-sha3-384 OBJECT IDENTIFIER ::= { sigAlgs 11 } - */ -const unsigned char ossl_der_oid_id_ecdsa_with_sha3_384[DER_OID_SZ_id_ecdsa_with_sha3_384] = { - DER_OID_V_id_ecdsa_with_sha3_384 -}; - -/* - * id-ecdsa-with-sha3-512 OBJECT IDENTIFIER ::= { sigAlgs 12 } - */ -const unsigned char ossl_der_oid_id_ecdsa_with_sha3_512[DER_OID_SZ_id_ecdsa_with_sha3_512] = { - DER_OID_V_id_ecdsa_with_sha3_512 -}; - diff --git a/deps/openssl/config/archs/aix-gcc/no-asm/providers/common/der/der_ecx_gen.c b/deps/openssl/config/archs/aix-gcc/no-asm/providers/common/der/der_ecx_gen.c deleted file mode 100644 index ba7bf14b5e156d..00000000000000 --- a/deps/openssl/config/archs/aix-gcc/no-asm/providers/common/der/der_ecx_gen.c +++ /dev/null @@ -1,44 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_ecx_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_ecx.h" - -/* Well known OIDs precompiled */ - -/* - * id-X25519 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 110 } - */ -const unsigned char ossl_der_oid_id_X25519[DER_OID_SZ_id_X25519] = { - DER_OID_V_id_X25519 -}; - -/* - * id-X448 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 111 } - */ -const unsigned char ossl_der_oid_id_X448[DER_OID_SZ_id_X448] = { - DER_OID_V_id_X448 -}; - -/* - * id-Ed25519 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 112 } - */ -const unsigned char ossl_der_oid_id_Ed25519[DER_OID_SZ_id_Ed25519] = { - DER_OID_V_id_Ed25519 -}; - -/* - * id-Ed448 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 113 } - */ -const unsigned char ossl_der_oid_id_Ed448[DER_OID_SZ_id_Ed448] = { - DER_OID_V_id_Ed448 -}; - diff --git a/deps/openssl/config/archs/aix-gcc/no-asm/providers/common/der/der_rsa_gen.c b/deps/openssl/config/archs/aix-gcc/no-asm/providers/common/der/der_rsa_gen.c deleted file mode 100644 index a3431798402f3f..00000000000000 --- a/deps/openssl/config/archs/aix-gcc/no-asm/providers/common/der/der_rsa_gen.c +++ /dev/null @@ -1,174 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_rsa_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_rsa.h" - -/* Well known OIDs precompiled */ - -/* - * hashAlgs OBJECT IDENTIFIER ::= { nistAlgorithms 2 } - */ -const unsigned char ossl_der_oid_hashAlgs[DER_OID_SZ_hashAlgs] = { - DER_OID_V_hashAlgs -}; - -/* - * rsaEncryption OBJECT IDENTIFIER ::= { pkcs-1 1 } - */ -const unsigned char ossl_der_oid_rsaEncryption[DER_OID_SZ_rsaEncryption] = { - DER_OID_V_rsaEncryption -}; - -/* - * id-RSAES-OAEP OBJECT IDENTIFIER ::= { pkcs-1 7 } - */ -const unsigned char ossl_der_oid_id_RSAES_OAEP[DER_OID_SZ_id_RSAES_OAEP] = { - DER_OID_V_id_RSAES_OAEP -}; - -/* - * id-pSpecified OBJECT IDENTIFIER ::= { pkcs-1 9 } - */ -const unsigned char ossl_der_oid_id_pSpecified[DER_OID_SZ_id_pSpecified] = { - DER_OID_V_id_pSpecified -}; - -/* - * id-RSASSA-PSS OBJECT IDENTIFIER ::= { pkcs-1 10 } - */ -const unsigned char ossl_der_oid_id_RSASSA_PSS[DER_OID_SZ_id_RSASSA_PSS] = { - DER_OID_V_id_RSASSA_PSS -}; - -/* - * md2WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 2 } - */ -const unsigned char ossl_der_oid_md2WithRSAEncryption[DER_OID_SZ_md2WithRSAEncryption] = { - DER_OID_V_md2WithRSAEncryption -}; - -/* - * md5WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 4 } - */ -const unsigned char ossl_der_oid_md5WithRSAEncryption[DER_OID_SZ_md5WithRSAEncryption] = { - DER_OID_V_md5WithRSAEncryption -}; - -/* - * sha1WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 5 } - */ -const unsigned char ossl_der_oid_sha1WithRSAEncryption[DER_OID_SZ_sha1WithRSAEncryption] = { - DER_OID_V_sha1WithRSAEncryption -}; - -/* - * sha224WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 14 } - */ -const unsigned char ossl_der_oid_sha224WithRSAEncryption[DER_OID_SZ_sha224WithRSAEncryption] = { - DER_OID_V_sha224WithRSAEncryption -}; - -/* - * sha256WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 11 } - */ -const unsigned char ossl_der_oid_sha256WithRSAEncryption[DER_OID_SZ_sha256WithRSAEncryption] = { - DER_OID_V_sha256WithRSAEncryption -}; - -/* - * sha384WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 12 } - */ -const unsigned char ossl_der_oid_sha384WithRSAEncryption[DER_OID_SZ_sha384WithRSAEncryption] = { - DER_OID_V_sha384WithRSAEncryption -}; - -/* - * sha512WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 13 } - */ -const unsigned char ossl_der_oid_sha512WithRSAEncryption[DER_OID_SZ_sha512WithRSAEncryption] = { - DER_OID_V_sha512WithRSAEncryption -}; - -/* - * sha512-224WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 15 } - */ -const unsigned char ossl_der_oid_sha512_224WithRSAEncryption[DER_OID_SZ_sha512_224WithRSAEncryption] = { - DER_OID_V_sha512_224WithRSAEncryption -}; - -/* - * sha512-256WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 16 } - */ -const unsigned char ossl_der_oid_sha512_256WithRSAEncryption[DER_OID_SZ_sha512_256WithRSAEncryption] = { - DER_OID_V_sha512_256WithRSAEncryption -}; - -/* - * id-mgf1 OBJECT IDENTIFIER ::= { pkcs-1 8 } - */ -const unsigned char ossl_der_oid_id_mgf1[DER_OID_SZ_id_mgf1] = { - DER_OID_V_id_mgf1 -}; - -/* - * id-rsassa-pkcs1-v1_5-with-sha3-224 OBJECT IDENTIFIER ::= { sigAlgs 13 } - */ -const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_224[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_224] = { - DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_224 -}; - -/* - * id-rsassa-pkcs1-v1_5-with-sha3-256 OBJECT IDENTIFIER ::= { sigAlgs 14 } - */ -const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_256[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_256] = { - DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_256 -}; - -/* - * id-rsassa-pkcs1-v1_5-with-sha3-384 OBJECT IDENTIFIER ::= { sigAlgs 15 } - */ -const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_384[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_384] = { - DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_384 -}; - -/* - * id-rsassa-pkcs1-v1_5-with-sha3-512 OBJECT IDENTIFIER ::= { sigAlgs 16 } - */ -const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_512[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_512] = { - DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_512 -}; - -/* - * md4WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 3 } - */ -const unsigned char ossl_der_oid_md4WithRSAEncryption[DER_OID_SZ_md4WithRSAEncryption] = { - DER_OID_V_md4WithRSAEncryption -}; - -/* - * ripemd160WithRSAEncryption OBJECT IDENTIFIER ::= { - * iso(1) identified-organization(3) teletrust(36) algorithm(3) signatureAlgorithm(3) rsaSignature(1) 2 - * } - */ -const unsigned char ossl_der_oid_ripemd160WithRSAEncryption[DER_OID_SZ_ripemd160WithRSAEncryption] = { - DER_OID_V_ripemd160WithRSAEncryption -}; - -/* - * mdc2WithRSASignature OBJECT IDENTIFIER ::= { - * iso(1) identified-organization(3) oiw(14) secsig(3) algorithms(2) mdc2WithRSASignature(14) - * } - */ -const unsigned char ossl_der_oid_mdc2WithRSASignature[DER_OID_SZ_mdc2WithRSASignature] = { - DER_OID_V_mdc2WithRSASignature -}; - diff --git a/deps/openssl/config/archs/aix-gcc/no-asm/providers/common/der/der_sm2_gen.c b/deps/openssl/config/archs/aix-gcc/no-asm/providers/common/der/der_sm2_gen.c deleted file mode 100644 index 6424ea166b7e15..00000000000000 --- a/deps/openssl/config/archs/aix-gcc/no-asm/providers/common/der/der_sm2_gen.c +++ /dev/null @@ -1,30 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_sm2_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_sm2.h" - -/* Well known OIDs precompiled */ - -/* - * sm2-with-SM3 OBJECT IDENTIFIER ::= { sm-scheme 501 } - */ -const unsigned char ossl_der_oid_sm2_with_SM3[DER_OID_SZ_sm2_with_SM3] = { - DER_OID_V_sm2_with_SM3 -}; - -/* - * curveSM2 OBJECT IDENTIFIER ::= { sm-scheme 301 } - */ -const unsigned char ossl_der_oid_curveSM2[DER_OID_SZ_curveSM2] = { - DER_OID_V_curveSM2 -}; - diff --git a/deps/openssl/config/archs/aix-gcc/no-asm/providers/common/der/der_wrap_gen.c b/deps/openssl/config/archs/aix-gcc/no-asm/providers/common/der/der_wrap_gen.c deleted file mode 100644 index 6cf93972f48b6d..00000000000000 --- a/deps/openssl/config/archs/aix-gcc/no-asm/providers/common/der/der_wrap_gen.c +++ /dev/null @@ -1,46 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_wrap_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_wrap.h" - -/* Well known OIDs precompiled */ - -/* - * id-alg-CMS3DESwrap OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs-9(9) smime(16) alg(3) 6 - * } - */ -const unsigned char ossl_der_oid_id_alg_CMS3DESwrap[DER_OID_SZ_id_alg_CMS3DESwrap] = { - DER_OID_V_id_alg_CMS3DESwrap -}; - -/* - * id-aes128-wrap OBJECT IDENTIFIER ::= { aes 5 } - */ -const unsigned char ossl_der_oid_id_aes128_wrap[DER_OID_SZ_id_aes128_wrap] = { - DER_OID_V_id_aes128_wrap -}; - -/* - * id-aes192-wrap OBJECT IDENTIFIER ::= { aes 25 } - */ -const unsigned char ossl_der_oid_id_aes192_wrap[DER_OID_SZ_id_aes192_wrap] = { - DER_OID_V_id_aes192_wrap -}; - -/* - * id-aes256-wrap OBJECT IDENTIFIER ::= { aes 45 } - */ -const unsigned char ossl_der_oid_id_aes256_wrap[DER_OID_SZ_id_aes256_wrap] = { - DER_OID_V_id_aes256_wrap -}; - diff --git a/deps/openssl/config/archs/aix-gcc/no-asm/providers/fips.ld b/deps/openssl/config/archs/aix-gcc/no-asm/providers/fips.ld deleted file mode 100644 index 8d6632bf3866af..00000000000000 --- a/deps/openssl/config/archs/aix-gcc/no-asm/providers/fips.ld +++ /dev/null @@ -1 +0,0 @@ -OSSL_provider_init diff --git a/deps/openssl/config/archs/aix-gcc/no-asm/providers/legacy.ld b/deps/openssl/config/archs/aix-gcc/no-asm/providers/legacy.ld deleted file mode 100644 index 8d6632bf3866af..00000000000000 --- a/deps/openssl/config/archs/aix-gcc/no-asm/providers/legacy.ld +++ /dev/null @@ -1 +0,0 @@ -OSSL_provider_init diff --git a/deps/openssl/config/archs/linux-ppc/asm/apps/progs.c b/deps/openssl/config/archs/linux-ppc/asm/apps/progs.c deleted file mode 100644 index f594c302c42ec6..00000000000000 --- a/deps/openssl/config/archs/linux-ppc/asm/apps/progs.c +++ /dev/null @@ -1,397 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by apps/progs.pl - * - * Copyright 1995-2022 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "progs.h" - -FUNCTION functions[] = { - {FT_general, "asn1parse", asn1parse_main, asn1parse_options, NULL, NULL}, - {FT_general, "ca", ca_main, ca_options, NULL, NULL}, -#ifndef OPENSSL_NO_SOCK - {FT_general, "ciphers", ciphers_main, ciphers_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_CMP - {FT_general, "cmp", cmp_main, cmp_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_CMS - {FT_general, "cms", cms_main, cms_options, NULL, NULL}, -#endif - {FT_general, "crl", crl_main, crl_options, NULL, NULL}, - {FT_general, "crl2pkcs7", crl2pkcs7_main, crl2pkcs7_options, NULL, NULL}, - {FT_general, "dgst", dgst_main, dgst_options, NULL, NULL}, -#ifndef OPENSSL_NO_DH - {FT_general, "dhparam", dhparam_main, dhparam_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_DSA - {FT_general, "dsa", dsa_main, dsa_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_DSA - {FT_general, "dsaparam", dsaparam_main, dsaparam_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_EC - {FT_general, "ec", ec_main, ec_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_EC - {FT_general, "ecparam", ecparam_main, ecparam_options, NULL, NULL}, -#endif - {FT_general, "enc", enc_main, enc_options, NULL, NULL}, -#ifndef OPENSSL_NO_ENGINE - {FT_general, "engine", engine_main, engine_options, NULL, NULL}, -#endif - {FT_general, "errstr", errstr_main, errstr_options, NULL, NULL}, - {FT_general, "fipsinstall", fipsinstall_main, fipsinstall_options, NULL, NULL}, -#ifndef OPENSSL_NO_DSA - {FT_general, "gendsa", gendsa_main, gendsa_options, NULL, NULL}, -#endif - {FT_general, "genpkey", genpkey_main, genpkey_options, NULL, NULL}, -#ifndef OPENSSL_NO_RSA - {FT_general, "genrsa", genrsa_main, genrsa_options, NULL, NULL}, -#endif - {FT_general, "help", help_main, help_options, NULL, NULL}, - {FT_general, "info", info_main, info_options, NULL, NULL}, - {FT_general, "kdf", kdf_main, kdf_options, NULL, NULL}, - {FT_general, "list", list_main, list_options, NULL, NULL}, - {FT_general, "mac", mac_main, mac_options, NULL, NULL}, - {FT_general, "nseq", nseq_main, nseq_options, NULL, NULL}, -#ifndef OPENSSL_NO_OCSP - {FT_general, "ocsp", ocsp_main, ocsp_options, NULL, NULL}, -#endif - {FT_general, "passwd", passwd_main, passwd_options, NULL, NULL}, - {FT_general, "pkcs12", pkcs12_main, pkcs12_options, NULL, NULL}, - {FT_general, "pkcs7", pkcs7_main, pkcs7_options, NULL, NULL}, - {FT_general, "pkcs8", pkcs8_main, pkcs8_options, NULL, NULL}, - {FT_general, "pkey", pkey_main, pkey_options, NULL, NULL}, - {FT_general, "pkeyparam", pkeyparam_main, pkeyparam_options, NULL, NULL}, - {FT_general, "pkeyutl", pkeyutl_main, pkeyutl_options, NULL, NULL}, - {FT_general, "prime", prime_main, prime_options, NULL, NULL}, - {FT_general, "rand", rand_main, rand_options, NULL, NULL}, - {FT_general, "rehash", rehash_main, rehash_options, NULL, NULL}, - {FT_general, "req", req_main, req_options, NULL, NULL}, - {FT_general, "rsa", rsa_main, rsa_options, NULL, NULL}, -#if !defined(OPENSSL_NO_DEPRECATED_3_0) && !defined(OPENSSL_NO_RSA) - {FT_general, "rsautl", rsautl_main, rsautl_options, "pkeyutl", "3.0"}, -#endif -#ifndef OPENSSL_NO_SOCK - {FT_general, "s_client", s_client_main, s_client_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_SOCK - {FT_general, "s_server", s_server_main, s_server_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_SOCK - {FT_general, "s_time", s_time_main, s_time_options, NULL, NULL}, -#endif - {FT_general, "sess_id", sess_id_main, sess_id_options, NULL, NULL}, - {FT_general, "smime", smime_main, smime_options, NULL, NULL}, - {FT_general, "speed", speed_main, speed_options, NULL, NULL}, - {FT_general, "spkac", spkac_main, spkac_options, NULL, NULL}, -#ifndef OPENSSL_NO_SRP - {FT_general, "srp", srp_main, srp_options, NULL, NULL}, -#endif - {FT_general, "storeutl", storeutl_main, storeutl_options, NULL, NULL}, -#ifndef OPENSSL_NO_TS - {FT_general, "ts", ts_main, ts_options, NULL, NULL}, -#endif - {FT_general, "verify", verify_main, verify_options, NULL, NULL}, - {FT_general, "version", version_main, version_options, NULL, NULL}, - {FT_general, "x509", x509_main, x509_options, NULL, NULL}, -#ifndef OPENSSL_NO_MD2 - {FT_md, "md2", dgst_main, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_MD4 - {FT_md, "md4", dgst_main, NULL, NULL}, -#endif - {FT_md, "md5", dgst_main, NULL, NULL}, - {FT_md, "sha1", dgst_main, NULL, NULL}, - {FT_md, "sha224", dgst_main, NULL, NULL}, - {FT_md, "sha256", dgst_main, NULL, NULL}, - {FT_md, "sha384", dgst_main, NULL, NULL}, - {FT_md, "sha512", dgst_main, NULL, NULL}, - {FT_md, "sha512-224", dgst_main, NULL, NULL}, - {FT_md, "sha512-256", dgst_main, NULL, NULL}, - {FT_md, "sha3-224", dgst_main, NULL, NULL}, - {FT_md, "sha3-256", dgst_main, NULL, NULL}, - {FT_md, "sha3-384", dgst_main, NULL, NULL}, - {FT_md, "sha3-512", dgst_main, NULL, NULL}, - {FT_md, "shake128", dgst_main, NULL, NULL}, - {FT_md, "shake256", dgst_main, NULL, NULL}, -#ifndef OPENSSL_NO_MDC2 - {FT_md, "mdc2", dgst_main, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_RMD160 - {FT_md, "rmd160", dgst_main, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_BLAKE2 - {FT_md, "blake2b512", dgst_main, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_BLAKE2 - {FT_md, "blake2s256", dgst_main, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_SM3 - {FT_md, "sm3", dgst_main, NULL, NULL}, -#endif - {FT_cipher, "aes-128-cbc", enc_main, enc_options, NULL}, - {FT_cipher, "aes-128-ecb", enc_main, enc_options, NULL}, - {FT_cipher, "aes-192-cbc", enc_main, enc_options, NULL}, - {FT_cipher, "aes-192-ecb", enc_main, enc_options, NULL}, - {FT_cipher, "aes-256-cbc", enc_main, enc_options, NULL}, - {FT_cipher, "aes-256-ecb", enc_main, enc_options, NULL}, -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-ctr", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-cfb1", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-cfb8", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-ctr", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-cfb1", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-cfb8", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-ctr", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-cfb1", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-cfb8", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-128-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-128-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-192-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-192-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-256-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-256-ecb", enc_main, enc_options, NULL}, -#endif - {FT_cipher, "base64", enc_main, enc_options, NULL}, -#ifdef ZLIB - {FT_cipher, "zlib", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des3", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "desx", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC4 - {FT_cipher, "rc4", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC4 - {FT_cipher, "rc4-40", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede3", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede3-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede3-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede3-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-64-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-40-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast5-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast5-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast5-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast5-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-ctr", enc_main, enc_options, NULL}, -#endif - {0, NULL, NULL, NULL, NULL} -}; diff --git a/deps/openssl/config/archs/linux-ppc/asm/providers/common/der/der_digests_gen.c b/deps/openssl/config/archs/linux-ppc/asm/providers/common/der/der_digests_gen.c deleted file mode 100644 index e4e14e82e5648a..00000000000000 --- a/deps/openssl/config/archs/linux-ppc/asm/providers/common/der/der_digests_gen.c +++ /dev/null @@ -1,160 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_digests_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_digests.h" - -/* Well known OIDs precompiled */ - -/* - * sigAlgs OBJECT IDENTIFIER ::= { nistAlgorithms 3 } - */ -const unsigned char ossl_der_oid_sigAlgs[DER_OID_SZ_sigAlgs] = { - DER_OID_V_sigAlgs -}; - -/* - * id-sha1 OBJECT IDENTIFIER ::= { iso(1) - * identified-organization(3) oiw(14) - * secsig(3) algorithms(2) 26 } - */ -const unsigned char ossl_der_oid_id_sha1[DER_OID_SZ_id_sha1] = { - DER_OID_V_id_sha1 -}; - -/* - * id-md2 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 2 } - */ -const unsigned char ossl_der_oid_id_md2[DER_OID_SZ_id_md2] = { - DER_OID_V_id_md2 -}; - -/* - * id-md5 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 5 } - */ -const unsigned char ossl_der_oid_id_md5[DER_OID_SZ_id_md5] = { - DER_OID_V_id_md5 -}; - -/* - * id-sha256 OBJECT IDENTIFIER ::= { hashAlgs 1 } - */ -const unsigned char ossl_der_oid_id_sha256[DER_OID_SZ_id_sha256] = { - DER_OID_V_id_sha256 -}; - -/* - * id-sha384 OBJECT IDENTIFIER ::= { hashAlgs 2 } - */ -const unsigned char ossl_der_oid_id_sha384[DER_OID_SZ_id_sha384] = { - DER_OID_V_id_sha384 -}; - -/* - * id-sha512 OBJECT IDENTIFIER ::= { hashAlgs 3 } - */ -const unsigned char ossl_der_oid_id_sha512[DER_OID_SZ_id_sha512] = { - DER_OID_V_id_sha512 -}; - -/* - * id-sha224 OBJECT IDENTIFIER ::= { hashAlgs 4 } - */ -const unsigned char ossl_der_oid_id_sha224[DER_OID_SZ_id_sha224] = { - DER_OID_V_id_sha224 -}; - -/* - * id-sha512-224 OBJECT IDENTIFIER ::= { hashAlgs 5 } - */ -const unsigned char ossl_der_oid_id_sha512_224[DER_OID_SZ_id_sha512_224] = { - DER_OID_V_id_sha512_224 -}; - -/* - * id-sha512-256 OBJECT IDENTIFIER ::= { hashAlgs 6 } - */ -const unsigned char ossl_der_oid_id_sha512_256[DER_OID_SZ_id_sha512_256] = { - DER_OID_V_id_sha512_256 -}; - -/* - * id-sha3-224 OBJECT IDENTIFIER ::= { hashAlgs 7 } - */ -const unsigned char ossl_der_oid_id_sha3_224[DER_OID_SZ_id_sha3_224] = { - DER_OID_V_id_sha3_224 -}; - -/* - * id-sha3-256 OBJECT IDENTIFIER ::= { hashAlgs 8 } - */ -const unsigned char ossl_der_oid_id_sha3_256[DER_OID_SZ_id_sha3_256] = { - DER_OID_V_id_sha3_256 -}; - -/* - * id-sha3-384 OBJECT IDENTIFIER ::= { hashAlgs 9 } - */ -const unsigned char ossl_der_oid_id_sha3_384[DER_OID_SZ_id_sha3_384] = { - DER_OID_V_id_sha3_384 -}; - -/* - * id-sha3-512 OBJECT IDENTIFIER ::= { hashAlgs 10 } - */ -const unsigned char ossl_der_oid_id_sha3_512[DER_OID_SZ_id_sha3_512] = { - DER_OID_V_id_sha3_512 -}; - -/* - * id-shake128 OBJECT IDENTIFIER ::= { hashAlgs 11 } - */ -const unsigned char ossl_der_oid_id_shake128[DER_OID_SZ_id_shake128] = { - DER_OID_V_id_shake128 -}; - -/* - * id-shake256 OBJECT IDENTIFIER ::= { hashAlgs 12 } - */ -const unsigned char ossl_der_oid_id_shake256[DER_OID_SZ_id_shake256] = { - DER_OID_V_id_shake256 -}; - -/* - * id-shake128-len OBJECT IDENTIFIER ::= { hashAlgs 17 } - */ -const unsigned char ossl_der_oid_id_shake128_len[DER_OID_SZ_id_shake128_len] = { - DER_OID_V_id_shake128_len -}; - -/* - * id-shake256-len OBJECT IDENTIFIER ::= { hashAlgs 18 } - */ -const unsigned char ossl_der_oid_id_shake256_len[DER_OID_SZ_id_shake256_len] = { - DER_OID_V_id_shake256_len -}; - -/* - * id-KMACWithSHAKE128 OBJECT IDENTIFIER ::={hashAlgs 19} - */ -const unsigned char ossl_der_oid_id_KMACWithSHAKE128[DER_OID_SZ_id_KMACWithSHAKE128] = { - DER_OID_V_id_KMACWithSHAKE128 -}; - -/* - * id-KMACWithSHAKE256 OBJECT IDENTIFIER ::={ hashAlgs 20} - */ -const unsigned char ossl_der_oid_id_KMACWithSHAKE256[DER_OID_SZ_id_KMACWithSHAKE256] = { - DER_OID_V_id_KMACWithSHAKE256 -}; - diff --git a/deps/openssl/config/archs/linux-ppc/asm/providers/common/der/der_dsa_gen.c b/deps/openssl/config/archs/linux-ppc/asm/providers/common/der/der_dsa_gen.c deleted file mode 100644 index e5cfe91e0f2510..00000000000000 --- a/deps/openssl/config/archs/linux-ppc/asm/providers/common/der/der_dsa_gen.c +++ /dev/null @@ -1,94 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_dsa_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -/* - * DSA low level APIs are deprecated for public use, but still ok for - * internal use. - */ -#include "internal/deprecated.h" - -#include "prov/der_dsa.h" - -/* Well known OIDs precompiled */ - -/* - * id-dsa OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) x9-57(10040) x9algorithm(4) 1 } - */ -const unsigned char ossl_der_oid_id_dsa[DER_OID_SZ_id_dsa] = { - DER_OID_V_id_dsa -}; - -/* - * id-dsa-with-sha1 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) x9-57 (10040) x9algorithm(4) 3 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha1[DER_OID_SZ_id_dsa_with_sha1] = { - DER_OID_V_id_dsa_with_sha1 -}; - -/* - * id-dsa-with-sha224 OBJECT IDENTIFIER ::= { sigAlgs 1 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha224[DER_OID_SZ_id_dsa_with_sha224] = { - DER_OID_V_id_dsa_with_sha224 -}; - -/* - * id-dsa-with-sha256 OBJECT IDENTIFIER ::= { sigAlgs 2 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha256[DER_OID_SZ_id_dsa_with_sha256] = { - DER_OID_V_id_dsa_with_sha256 -}; - -/* - * id-dsa-with-sha384 OBJECT IDENTIFIER ::= { sigAlgs 3 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha384[DER_OID_SZ_id_dsa_with_sha384] = { - DER_OID_V_id_dsa_with_sha384 -}; - -/* - * id-dsa-with-sha512 OBJECT IDENTIFIER ::= { sigAlgs 4 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha512[DER_OID_SZ_id_dsa_with_sha512] = { - DER_OID_V_id_dsa_with_sha512 -}; - -/* - * id-dsa-with-sha3-224 OBJECT IDENTIFIER ::= { sigAlgs 5 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha3_224[DER_OID_SZ_id_dsa_with_sha3_224] = { - DER_OID_V_id_dsa_with_sha3_224 -}; - -/* - * id-dsa-with-sha3-256 OBJECT IDENTIFIER ::= { sigAlgs 6 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha3_256[DER_OID_SZ_id_dsa_with_sha3_256] = { - DER_OID_V_id_dsa_with_sha3_256 -}; - -/* - * id-dsa-with-sha3-384 OBJECT IDENTIFIER ::= { sigAlgs 7 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha3_384[DER_OID_SZ_id_dsa_with_sha3_384] = { - DER_OID_V_id_dsa_with_sha3_384 -}; - -/* - * id-dsa-with-sha3-512 OBJECT IDENTIFIER ::= { sigAlgs 8 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha3_512[DER_OID_SZ_id_dsa_with_sha3_512] = { - DER_OID_V_id_dsa_with_sha3_512 -}; - diff --git a/deps/openssl/config/archs/linux-ppc/asm/providers/common/der/der_ec_gen.c b/deps/openssl/config/archs/linux-ppc/asm/providers/common/der/der_ec_gen.c deleted file mode 100644 index e1ed54ba05b6ff..00000000000000 --- a/deps/openssl/config/archs/linux-ppc/asm/providers/common/der/der_ec_gen.c +++ /dev/null @@ -1,279 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_ec_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_ec.h" - -/* Well known OIDs precompiled */ - -/* - * ecdsa-with-SHA1 OBJECT IDENTIFIER ::= { id-ecSigType 1 } - */ -const unsigned char ossl_der_oid_ecdsa_with_SHA1[DER_OID_SZ_ecdsa_with_SHA1] = { - DER_OID_V_ecdsa_with_SHA1 -}; - -/* - * id-ecPublicKey OBJECT IDENTIFIER ::= { id-publicKeyType 1 } - */ -const unsigned char ossl_der_oid_id_ecPublicKey[DER_OID_SZ_id_ecPublicKey] = { - DER_OID_V_id_ecPublicKey -}; - -/* - * c2pnb163v1 OBJECT IDENTIFIER ::= { c-TwoCurve 1 } - */ -const unsigned char ossl_der_oid_c2pnb163v1[DER_OID_SZ_c2pnb163v1] = { - DER_OID_V_c2pnb163v1 -}; - -/* - * c2pnb163v2 OBJECT IDENTIFIER ::= { c-TwoCurve 2 } - */ -const unsigned char ossl_der_oid_c2pnb163v2[DER_OID_SZ_c2pnb163v2] = { - DER_OID_V_c2pnb163v2 -}; - -/* - * c2pnb163v3 OBJECT IDENTIFIER ::= { c-TwoCurve 3 } - */ -const unsigned char ossl_der_oid_c2pnb163v3[DER_OID_SZ_c2pnb163v3] = { - DER_OID_V_c2pnb163v3 -}; - -/* - * c2pnb176w1 OBJECT IDENTIFIER ::= { c-TwoCurve 4 } - */ -const unsigned char ossl_der_oid_c2pnb176w1[DER_OID_SZ_c2pnb176w1] = { - DER_OID_V_c2pnb176w1 -}; - -/* - * c2tnb191v1 OBJECT IDENTIFIER ::= { c-TwoCurve 5 } - */ -const unsigned char ossl_der_oid_c2tnb191v1[DER_OID_SZ_c2tnb191v1] = { - DER_OID_V_c2tnb191v1 -}; - -/* - * c2tnb191v2 OBJECT IDENTIFIER ::= { c-TwoCurve 6 } - */ -const unsigned char ossl_der_oid_c2tnb191v2[DER_OID_SZ_c2tnb191v2] = { - DER_OID_V_c2tnb191v2 -}; - -/* - * c2tnb191v3 OBJECT IDENTIFIER ::= { c-TwoCurve 7 } - */ -const unsigned char ossl_der_oid_c2tnb191v3[DER_OID_SZ_c2tnb191v3] = { - DER_OID_V_c2tnb191v3 -}; - -/* - * c2onb191v4 OBJECT IDENTIFIER ::= { c-TwoCurve 8 } - */ -const unsigned char ossl_der_oid_c2onb191v4[DER_OID_SZ_c2onb191v4] = { - DER_OID_V_c2onb191v4 -}; - -/* - * c2onb191v5 OBJECT IDENTIFIER ::= { c-TwoCurve 9 } - */ -const unsigned char ossl_der_oid_c2onb191v5[DER_OID_SZ_c2onb191v5] = { - DER_OID_V_c2onb191v5 -}; - -/* - * c2pnb208w1 OBJECT IDENTIFIER ::= { c-TwoCurve 10 } - */ -const unsigned char ossl_der_oid_c2pnb208w1[DER_OID_SZ_c2pnb208w1] = { - DER_OID_V_c2pnb208w1 -}; - -/* - * c2tnb239v1 OBJECT IDENTIFIER ::= { c-TwoCurve 11 } - */ -const unsigned char ossl_der_oid_c2tnb239v1[DER_OID_SZ_c2tnb239v1] = { - DER_OID_V_c2tnb239v1 -}; - -/* - * c2tnb239v2 OBJECT IDENTIFIER ::= { c-TwoCurve 12 } - */ -const unsigned char ossl_der_oid_c2tnb239v2[DER_OID_SZ_c2tnb239v2] = { - DER_OID_V_c2tnb239v2 -}; - -/* - * c2tnb239v3 OBJECT IDENTIFIER ::= { c-TwoCurve 13 } - */ -const unsigned char ossl_der_oid_c2tnb239v3[DER_OID_SZ_c2tnb239v3] = { - DER_OID_V_c2tnb239v3 -}; - -/* - * c2onb239v4 OBJECT IDENTIFIER ::= { c-TwoCurve 14 } - */ -const unsigned char ossl_der_oid_c2onb239v4[DER_OID_SZ_c2onb239v4] = { - DER_OID_V_c2onb239v4 -}; - -/* - * c2onb239v5 OBJECT IDENTIFIER ::= { c-TwoCurve 15 } - */ -const unsigned char ossl_der_oid_c2onb239v5[DER_OID_SZ_c2onb239v5] = { - DER_OID_V_c2onb239v5 -}; - -/* - * c2pnb272w1 OBJECT IDENTIFIER ::= { c-TwoCurve 16 } - */ -const unsigned char ossl_der_oid_c2pnb272w1[DER_OID_SZ_c2pnb272w1] = { - DER_OID_V_c2pnb272w1 -}; - -/* - * c2pnb304w1 OBJECT IDENTIFIER ::= { c-TwoCurve 17 } - */ -const unsigned char ossl_der_oid_c2pnb304w1[DER_OID_SZ_c2pnb304w1] = { - DER_OID_V_c2pnb304w1 -}; - -/* - * c2tnb359v1 OBJECT IDENTIFIER ::= { c-TwoCurve 18 } - */ -const unsigned char ossl_der_oid_c2tnb359v1[DER_OID_SZ_c2tnb359v1] = { - DER_OID_V_c2tnb359v1 -}; - -/* - * c2pnb368w1 OBJECT IDENTIFIER ::= { c-TwoCurve 19 } - */ -const unsigned char ossl_der_oid_c2pnb368w1[DER_OID_SZ_c2pnb368w1] = { - DER_OID_V_c2pnb368w1 -}; - -/* - * c2tnb431r1 OBJECT IDENTIFIER ::= { c-TwoCurve 20 } - */ -const unsigned char ossl_der_oid_c2tnb431r1[DER_OID_SZ_c2tnb431r1] = { - DER_OID_V_c2tnb431r1 -}; - -/* - * prime192v1 OBJECT IDENTIFIER ::= { primeCurve 1 } - */ -const unsigned char ossl_der_oid_prime192v1[DER_OID_SZ_prime192v1] = { - DER_OID_V_prime192v1 -}; - -/* - * prime192v2 OBJECT IDENTIFIER ::= { primeCurve 2 } - */ -const unsigned char ossl_der_oid_prime192v2[DER_OID_SZ_prime192v2] = { - DER_OID_V_prime192v2 -}; - -/* - * prime192v3 OBJECT IDENTIFIER ::= { primeCurve 3 } - */ -const unsigned char ossl_der_oid_prime192v3[DER_OID_SZ_prime192v3] = { - DER_OID_V_prime192v3 -}; - -/* - * prime239v1 OBJECT IDENTIFIER ::= { primeCurve 4 } - */ -const unsigned char ossl_der_oid_prime239v1[DER_OID_SZ_prime239v1] = { - DER_OID_V_prime239v1 -}; - -/* - * prime239v2 OBJECT IDENTIFIER ::= { primeCurve 5 } - */ -const unsigned char ossl_der_oid_prime239v2[DER_OID_SZ_prime239v2] = { - DER_OID_V_prime239v2 -}; - -/* - * prime239v3 OBJECT IDENTIFIER ::= { primeCurve 6 } - */ -const unsigned char ossl_der_oid_prime239v3[DER_OID_SZ_prime239v3] = { - DER_OID_V_prime239v3 -}; - -/* - * prime256v1 OBJECT IDENTIFIER ::= { primeCurve 7 } - */ -const unsigned char ossl_der_oid_prime256v1[DER_OID_SZ_prime256v1] = { - DER_OID_V_prime256v1 -}; - -/* - * ecdsa-with-SHA224 OBJECT IDENTIFIER ::= { iso(1) member-body(2) - * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 1 } - */ -const unsigned char ossl_der_oid_ecdsa_with_SHA224[DER_OID_SZ_ecdsa_with_SHA224] = { - DER_OID_V_ecdsa_with_SHA224 -}; - -/* - * ecdsa-with-SHA256 OBJECT IDENTIFIER ::= { iso(1) member-body(2) - * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 2 } - */ -const unsigned char ossl_der_oid_ecdsa_with_SHA256[DER_OID_SZ_ecdsa_with_SHA256] = { - DER_OID_V_ecdsa_with_SHA256 -}; - -/* - * ecdsa-with-SHA384 OBJECT IDENTIFIER ::= { iso(1) member-body(2) - * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 3 } - */ -const unsigned char ossl_der_oid_ecdsa_with_SHA384[DER_OID_SZ_ecdsa_with_SHA384] = { - DER_OID_V_ecdsa_with_SHA384 -}; - -/* - * ecdsa-with-SHA512 OBJECT IDENTIFIER ::= { iso(1) member-body(2) - * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 4 } - */ -const unsigned char ossl_der_oid_ecdsa_with_SHA512[DER_OID_SZ_ecdsa_with_SHA512] = { - DER_OID_V_ecdsa_with_SHA512 -}; - -/* - * id-ecdsa-with-sha3-224 OBJECT IDENTIFIER ::= { sigAlgs 9 } - */ -const unsigned char ossl_der_oid_id_ecdsa_with_sha3_224[DER_OID_SZ_id_ecdsa_with_sha3_224] = { - DER_OID_V_id_ecdsa_with_sha3_224 -}; - -/* - * id-ecdsa-with-sha3-256 OBJECT IDENTIFIER ::= { sigAlgs 10 } - */ -const unsigned char ossl_der_oid_id_ecdsa_with_sha3_256[DER_OID_SZ_id_ecdsa_with_sha3_256] = { - DER_OID_V_id_ecdsa_with_sha3_256 -}; - -/* - * id-ecdsa-with-sha3-384 OBJECT IDENTIFIER ::= { sigAlgs 11 } - */ -const unsigned char ossl_der_oid_id_ecdsa_with_sha3_384[DER_OID_SZ_id_ecdsa_with_sha3_384] = { - DER_OID_V_id_ecdsa_with_sha3_384 -}; - -/* - * id-ecdsa-with-sha3-512 OBJECT IDENTIFIER ::= { sigAlgs 12 } - */ -const unsigned char ossl_der_oid_id_ecdsa_with_sha3_512[DER_OID_SZ_id_ecdsa_with_sha3_512] = { - DER_OID_V_id_ecdsa_with_sha3_512 -}; - diff --git a/deps/openssl/config/archs/linux-ppc/asm/providers/common/der/der_ecx_gen.c b/deps/openssl/config/archs/linux-ppc/asm/providers/common/der/der_ecx_gen.c deleted file mode 100644 index ba7bf14b5e156d..00000000000000 --- a/deps/openssl/config/archs/linux-ppc/asm/providers/common/der/der_ecx_gen.c +++ /dev/null @@ -1,44 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_ecx_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_ecx.h" - -/* Well known OIDs precompiled */ - -/* - * id-X25519 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 110 } - */ -const unsigned char ossl_der_oid_id_X25519[DER_OID_SZ_id_X25519] = { - DER_OID_V_id_X25519 -}; - -/* - * id-X448 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 111 } - */ -const unsigned char ossl_der_oid_id_X448[DER_OID_SZ_id_X448] = { - DER_OID_V_id_X448 -}; - -/* - * id-Ed25519 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 112 } - */ -const unsigned char ossl_der_oid_id_Ed25519[DER_OID_SZ_id_Ed25519] = { - DER_OID_V_id_Ed25519 -}; - -/* - * id-Ed448 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 113 } - */ -const unsigned char ossl_der_oid_id_Ed448[DER_OID_SZ_id_Ed448] = { - DER_OID_V_id_Ed448 -}; - diff --git a/deps/openssl/config/archs/linux-ppc/asm/providers/common/der/der_rsa_gen.c b/deps/openssl/config/archs/linux-ppc/asm/providers/common/der/der_rsa_gen.c deleted file mode 100644 index a3431798402f3f..00000000000000 --- a/deps/openssl/config/archs/linux-ppc/asm/providers/common/der/der_rsa_gen.c +++ /dev/null @@ -1,174 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_rsa_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_rsa.h" - -/* Well known OIDs precompiled */ - -/* - * hashAlgs OBJECT IDENTIFIER ::= { nistAlgorithms 2 } - */ -const unsigned char ossl_der_oid_hashAlgs[DER_OID_SZ_hashAlgs] = { - DER_OID_V_hashAlgs -}; - -/* - * rsaEncryption OBJECT IDENTIFIER ::= { pkcs-1 1 } - */ -const unsigned char ossl_der_oid_rsaEncryption[DER_OID_SZ_rsaEncryption] = { - DER_OID_V_rsaEncryption -}; - -/* - * id-RSAES-OAEP OBJECT IDENTIFIER ::= { pkcs-1 7 } - */ -const unsigned char ossl_der_oid_id_RSAES_OAEP[DER_OID_SZ_id_RSAES_OAEP] = { - DER_OID_V_id_RSAES_OAEP -}; - -/* - * id-pSpecified OBJECT IDENTIFIER ::= { pkcs-1 9 } - */ -const unsigned char ossl_der_oid_id_pSpecified[DER_OID_SZ_id_pSpecified] = { - DER_OID_V_id_pSpecified -}; - -/* - * id-RSASSA-PSS OBJECT IDENTIFIER ::= { pkcs-1 10 } - */ -const unsigned char ossl_der_oid_id_RSASSA_PSS[DER_OID_SZ_id_RSASSA_PSS] = { - DER_OID_V_id_RSASSA_PSS -}; - -/* - * md2WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 2 } - */ -const unsigned char ossl_der_oid_md2WithRSAEncryption[DER_OID_SZ_md2WithRSAEncryption] = { - DER_OID_V_md2WithRSAEncryption -}; - -/* - * md5WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 4 } - */ -const unsigned char ossl_der_oid_md5WithRSAEncryption[DER_OID_SZ_md5WithRSAEncryption] = { - DER_OID_V_md5WithRSAEncryption -}; - -/* - * sha1WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 5 } - */ -const unsigned char ossl_der_oid_sha1WithRSAEncryption[DER_OID_SZ_sha1WithRSAEncryption] = { - DER_OID_V_sha1WithRSAEncryption -}; - -/* - * sha224WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 14 } - */ -const unsigned char ossl_der_oid_sha224WithRSAEncryption[DER_OID_SZ_sha224WithRSAEncryption] = { - DER_OID_V_sha224WithRSAEncryption -}; - -/* - * sha256WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 11 } - */ -const unsigned char ossl_der_oid_sha256WithRSAEncryption[DER_OID_SZ_sha256WithRSAEncryption] = { - DER_OID_V_sha256WithRSAEncryption -}; - -/* - * sha384WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 12 } - */ -const unsigned char ossl_der_oid_sha384WithRSAEncryption[DER_OID_SZ_sha384WithRSAEncryption] = { - DER_OID_V_sha384WithRSAEncryption -}; - -/* - * sha512WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 13 } - */ -const unsigned char ossl_der_oid_sha512WithRSAEncryption[DER_OID_SZ_sha512WithRSAEncryption] = { - DER_OID_V_sha512WithRSAEncryption -}; - -/* - * sha512-224WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 15 } - */ -const unsigned char ossl_der_oid_sha512_224WithRSAEncryption[DER_OID_SZ_sha512_224WithRSAEncryption] = { - DER_OID_V_sha512_224WithRSAEncryption -}; - -/* - * sha512-256WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 16 } - */ -const unsigned char ossl_der_oid_sha512_256WithRSAEncryption[DER_OID_SZ_sha512_256WithRSAEncryption] = { - DER_OID_V_sha512_256WithRSAEncryption -}; - -/* - * id-mgf1 OBJECT IDENTIFIER ::= { pkcs-1 8 } - */ -const unsigned char ossl_der_oid_id_mgf1[DER_OID_SZ_id_mgf1] = { - DER_OID_V_id_mgf1 -}; - -/* - * id-rsassa-pkcs1-v1_5-with-sha3-224 OBJECT IDENTIFIER ::= { sigAlgs 13 } - */ -const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_224[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_224] = { - DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_224 -}; - -/* - * id-rsassa-pkcs1-v1_5-with-sha3-256 OBJECT IDENTIFIER ::= { sigAlgs 14 } - */ -const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_256[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_256] = { - DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_256 -}; - -/* - * id-rsassa-pkcs1-v1_5-with-sha3-384 OBJECT IDENTIFIER ::= { sigAlgs 15 } - */ -const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_384[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_384] = { - DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_384 -}; - -/* - * id-rsassa-pkcs1-v1_5-with-sha3-512 OBJECT IDENTIFIER ::= { sigAlgs 16 } - */ -const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_512[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_512] = { - DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_512 -}; - -/* - * md4WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 3 } - */ -const unsigned char ossl_der_oid_md4WithRSAEncryption[DER_OID_SZ_md4WithRSAEncryption] = { - DER_OID_V_md4WithRSAEncryption -}; - -/* - * ripemd160WithRSAEncryption OBJECT IDENTIFIER ::= { - * iso(1) identified-organization(3) teletrust(36) algorithm(3) signatureAlgorithm(3) rsaSignature(1) 2 - * } - */ -const unsigned char ossl_der_oid_ripemd160WithRSAEncryption[DER_OID_SZ_ripemd160WithRSAEncryption] = { - DER_OID_V_ripemd160WithRSAEncryption -}; - -/* - * mdc2WithRSASignature OBJECT IDENTIFIER ::= { - * iso(1) identified-organization(3) oiw(14) secsig(3) algorithms(2) mdc2WithRSASignature(14) - * } - */ -const unsigned char ossl_der_oid_mdc2WithRSASignature[DER_OID_SZ_mdc2WithRSASignature] = { - DER_OID_V_mdc2WithRSASignature -}; - diff --git a/deps/openssl/config/archs/linux-ppc/asm/providers/common/der/der_sm2_gen.c b/deps/openssl/config/archs/linux-ppc/asm/providers/common/der/der_sm2_gen.c deleted file mode 100644 index 6424ea166b7e15..00000000000000 --- a/deps/openssl/config/archs/linux-ppc/asm/providers/common/der/der_sm2_gen.c +++ /dev/null @@ -1,30 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_sm2_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_sm2.h" - -/* Well known OIDs precompiled */ - -/* - * sm2-with-SM3 OBJECT IDENTIFIER ::= { sm-scheme 501 } - */ -const unsigned char ossl_der_oid_sm2_with_SM3[DER_OID_SZ_sm2_with_SM3] = { - DER_OID_V_sm2_with_SM3 -}; - -/* - * curveSM2 OBJECT IDENTIFIER ::= { sm-scheme 301 } - */ -const unsigned char ossl_der_oid_curveSM2[DER_OID_SZ_curveSM2] = { - DER_OID_V_curveSM2 -}; - diff --git a/deps/openssl/config/archs/linux-ppc/asm/providers/common/der/der_wrap_gen.c b/deps/openssl/config/archs/linux-ppc/asm/providers/common/der/der_wrap_gen.c deleted file mode 100644 index 6cf93972f48b6d..00000000000000 --- a/deps/openssl/config/archs/linux-ppc/asm/providers/common/der/der_wrap_gen.c +++ /dev/null @@ -1,46 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_wrap_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_wrap.h" - -/* Well known OIDs precompiled */ - -/* - * id-alg-CMS3DESwrap OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs-9(9) smime(16) alg(3) 6 - * } - */ -const unsigned char ossl_der_oid_id_alg_CMS3DESwrap[DER_OID_SZ_id_alg_CMS3DESwrap] = { - DER_OID_V_id_alg_CMS3DESwrap -}; - -/* - * id-aes128-wrap OBJECT IDENTIFIER ::= { aes 5 } - */ -const unsigned char ossl_der_oid_id_aes128_wrap[DER_OID_SZ_id_aes128_wrap] = { - DER_OID_V_id_aes128_wrap -}; - -/* - * id-aes192-wrap OBJECT IDENTIFIER ::= { aes 25 } - */ -const unsigned char ossl_der_oid_id_aes192_wrap[DER_OID_SZ_id_aes192_wrap] = { - DER_OID_V_id_aes192_wrap -}; - -/* - * id-aes256-wrap OBJECT IDENTIFIER ::= { aes 45 } - */ -const unsigned char ossl_der_oid_id_aes256_wrap[DER_OID_SZ_id_aes256_wrap] = { - DER_OID_V_id_aes256_wrap -}; - diff --git a/deps/openssl/config/archs/linux-ppc/asm/providers/fips.ld b/deps/openssl/config/archs/linux-ppc/asm/providers/fips.ld deleted file mode 100644 index 1debaaa7ff652d..00000000000000 --- a/deps/openssl/config/archs/linux-ppc/asm/providers/fips.ld +++ /dev/null @@ -1,5 +0,0 @@ -{ - global: - OSSL_provider_init; - local: *; -}; diff --git a/deps/openssl/config/archs/linux-ppc/asm/providers/legacy.ld b/deps/openssl/config/archs/linux-ppc/asm/providers/legacy.ld deleted file mode 100644 index 1debaaa7ff652d..00000000000000 --- a/deps/openssl/config/archs/linux-ppc/asm/providers/legacy.ld +++ /dev/null @@ -1,5 +0,0 @@ -{ - global: - OSSL_provider_init; - local: *; -}; diff --git a/deps/openssl/config/archs/linux-ppc/asm_avx2/apps/progs.c b/deps/openssl/config/archs/linux-ppc/asm_avx2/apps/progs.c deleted file mode 100644 index f594c302c42ec6..00000000000000 --- a/deps/openssl/config/archs/linux-ppc/asm_avx2/apps/progs.c +++ /dev/null @@ -1,397 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by apps/progs.pl - * - * Copyright 1995-2022 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "progs.h" - -FUNCTION functions[] = { - {FT_general, "asn1parse", asn1parse_main, asn1parse_options, NULL, NULL}, - {FT_general, "ca", ca_main, ca_options, NULL, NULL}, -#ifndef OPENSSL_NO_SOCK - {FT_general, "ciphers", ciphers_main, ciphers_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_CMP - {FT_general, "cmp", cmp_main, cmp_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_CMS - {FT_general, "cms", cms_main, cms_options, NULL, NULL}, -#endif - {FT_general, "crl", crl_main, crl_options, NULL, NULL}, - {FT_general, "crl2pkcs7", crl2pkcs7_main, crl2pkcs7_options, NULL, NULL}, - {FT_general, "dgst", dgst_main, dgst_options, NULL, NULL}, -#ifndef OPENSSL_NO_DH - {FT_general, "dhparam", dhparam_main, dhparam_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_DSA - {FT_general, "dsa", dsa_main, dsa_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_DSA - {FT_general, "dsaparam", dsaparam_main, dsaparam_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_EC - {FT_general, "ec", ec_main, ec_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_EC - {FT_general, "ecparam", ecparam_main, ecparam_options, NULL, NULL}, -#endif - {FT_general, "enc", enc_main, enc_options, NULL, NULL}, -#ifndef OPENSSL_NO_ENGINE - {FT_general, "engine", engine_main, engine_options, NULL, NULL}, -#endif - {FT_general, "errstr", errstr_main, errstr_options, NULL, NULL}, - {FT_general, "fipsinstall", fipsinstall_main, fipsinstall_options, NULL, NULL}, -#ifndef OPENSSL_NO_DSA - {FT_general, "gendsa", gendsa_main, gendsa_options, NULL, NULL}, -#endif - {FT_general, "genpkey", genpkey_main, genpkey_options, NULL, NULL}, -#ifndef OPENSSL_NO_RSA - {FT_general, "genrsa", genrsa_main, genrsa_options, NULL, NULL}, -#endif - {FT_general, "help", help_main, help_options, NULL, NULL}, - {FT_general, "info", info_main, info_options, NULL, NULL}, - {FT_general, "kdf", kdf_main, kdf_options, NULL, NULL}, - {FT_general, "list", list_main, list_options, NULL, NULL}, - {FT_general, "mac", mac_main, mac_options, NULL, NULL}, - {FT_general, "nseq", nseq_main, nseq_options, NULL, NULL}, -#ifndef OPENSSL_NO_OCSP - {FT_general, "ocsp", ocsp_main, ocsp_options, NULL, NULL}, -#endif - {FT_general, "passwd", passwd_main, passwd_options, NULL, NULL}, - {FT_general, "pkcs12", pkcs12_main, pkcs12_options, NULL, NULL}, - {FT_general, "pkcs7", pkcs7_main, pkcs7_options, NULL, NULL}, - {FT_general, "pkcs8", pkcs8_main, pkcs8_options, NULL, NULL}, - {FT_general, "pkey", pkey_main, pkey_options, NULL, NULL}, - {FT_general, "pkeyparam", pkeyparam_main, pkeyparam_options, NULL, NULL}, - {FT_general, "pkeyutl", pkeyutl_main, pkeyutl_options, NULL, NULL}, - {FT_general, "prime", prime_main, prime_options, NULL, NULL}, - {FT_general, "rand", rand_main, rand_options, NULL, NULL}, - {FT_general, "rehash", rehash_main, rehash_options, NULL, NULL}, - {FT_general, "req", req_main, req_options, NULL, NULL}, - {FT_general, "rsa", rsa_main, rsa_options, NULL, NULL}, -#if !defined(OPENSSL_NO_DEPRECATED_3_0) && !defined(OPENSSL_NO_RSA) - {FT_general, "rsautl", rsautl_main, rsautl_options, "pkeyutl", "3.0"}, -#endif -#ifndef OPENSSL_NO_SOCK - {FT_general, "s_client", s_client_main, s_client_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_SOCK - {FT_general, "s_server", s_server_main, s_server_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_SOCK - {FT_general, "s_time", s_time_main, s_time_options, NULL, NULL}, -#endif - {FT_general, "sess_id", sess_id_main, sess_id_options, NULL, NULL}, - {FT_general, "smime", smime_main, smime_options, NULL, NULL}, - {FT_general, "speed", speed_main, speed_options, NULL, NULL}, - {FT_general, "spkac", spkac_main, spkac_options, NULL, NULL}, -#ifndef OPENSSL_NO_SRP - {FT_general, "srp", srp_main, srp_options, NULL, NULL}, -#endif - {FT_general, "storeutl", storeutl_main, storeutl_options, NULL, NULL}, -#ifndef OPENSSL_NO_TS - {FT_general, "ts", ts_main, ts_options, NULL, NULL}, -#endif - {FT_general, "verify", verify_main, verify_options, NULL, NULL}, - {FT_general, "version", version_main, version_options, NULL, NULL}, - {FT_general, "x509", x509_main, x509_options, NULL, NULL}, -#ifndef OPENSSL_NO_MD2 - {FT_md, "md2", dgst_main, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_MD4 - {FT_md, "md4", dgst_main, NULL, NULL}, -#endif - {FT_md, "md5", dgst_main, NULL, NULL}, - {FT_md, "sha1", dgst_main, NULL, NULL}, - {FT_md, "sha224", dgst_main, NULL, NULL}, - {FT_md, "sha256", dgst_main, NULL, NULL}, - {FT_md, "sha384", dgst_main, NULL, NULL}, - {FT_md, "sha512", dgst_main, NULL, NULL}, - {FT_md, "sha512-224", dgst_main, NULL, NULL}, - {FT_md, "sha512-256", dgst_main, NULL, NULL}, - {FT_md, "sha3-224", dgst_main, NULL, NULL}, - {FT_md, "sha3-256", dgst_main, NULL, NULL}, - {FT_md, "sha3-384", dgst_main, NULL, NULL}, - {FT_md, "sha3-512", dgst_main, NULL, NULL}, - {FT_md, "shake128", dgst_main, NULL, NULL}, - {FT_md, "shake256", dgst_main, NULL, NULL}, -#ifndef OPENSSL_NO_MDC2 - {FT_md, "mdc2", dgst_main, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_RMD160 - {FT_md, "rmd160", dgst_main, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_BLAKE2 - {FT_md, "blake2b512", dgst_main, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_BLAKE2 - {FT_md, "blake2s256", dgst_main, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_SM3 - {FT_md, "sm3", dgst_main, NULL, NULL}, -#endif - {FT_cipher, "aes-128-cbc", enc_main, enc_options, NULL}, - {FT_cipher, "aes-128-ecb", enc_main, enc_options, NULL}, - {FT_cipher, "aes-192-cbc", enc_main, enc_options, NULL}, - {FT_cipher, "aes-192-ecb", enc_main, enc_options, NULL}, - {FT_cipher, "aes-256-cbc", enc_main, enc_options, NULL}, - {FT_cipher, "aes-256-ecb", enc_main, enc_options, NULL}, -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-ctr", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-cfb1", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-cfb8", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-ctr", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-cfb1", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-cfb8", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-ctr", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-cfb1", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-cfb8", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-128-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-128-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-192-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-192-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-256-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-256-ecb", enc_main, enc_options, NULL}, -#endif - {FT_cipher, "base64", enc_main, enc_options, NULL}, -#ifdef ZLIB - {FT_cipher, "zlib", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des3", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "desx", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC4 - {FT_cipher, "rc4", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC4 - {FT_cipher, "rc4-40", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede3", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede3-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede3-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede3-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-64-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-40-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast5-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast5-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast5-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast5-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-ctr", enc_main, enc_options, NULL}, -#endif - {0, NULL, NULL, NULL, NULL} -}; diff --git a/deps/openssl/config/archs/linux-ppc/asm_avx2/providers/common/der/der_digests_gen.c b/deps/openssl/config/archs/linux-ppc/asm_avx2/providers/common/der/der_digests_gen.c deleted file mode 100644 index e4e14e82e5648a..00000000000000 --- a/deps/openssl/config/archs/linux-ppc/asm_avx2/providers/common/der/der_digests_gen.c +++ /dev/null @@ -1,160 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_digests_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_digests.h" - -/* Well known OIDs precompiled */ - -/* - * sigAlgs OBJECT IDENTIFIER ::= { nistAlgorithms 3 } - */ -const unsigned char ossl_der_oid_sigAlgs[DER_OID_SZ_sigAlgs] = { - DER_OID_V_sigAlgs -}; - -/* - * id-sha1 OBJECT IDENTIFIER ::= { iso(1) - * identified-organization(3) oiw(14) - * secsig(3) algorithms(2) 26 } - */ -const unsigned char ossl_der_oid_id_sha1[DER_OID_SZ_id_sha1] = { - DER_OID_V_id_sha1 -}; - -/* - * id-md2 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 2 } - */ -const unsigned char ossl_der_oid_id_md2[DER_OID_SZ_id_md2] = { - DER_OID_V_id_md2 -}; - -/* - * id-md5 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 5 } - */ -const unsigned char ossl_der_oid_id_md5[DER_OID_SZ_id_md5] = { - DER_OID_V_id_md5 -}; - -/* - * id-sha256 OBJECT IDENTIFIER ::= { hashAlgs 1 } - */ -const unsigned char ossl_der_oid_id_sha256[DER_OID_SZ_id_sha256] = { - DER_OID_V_id_sha256 -}; - -/* - * id-sha384 OBJECT IDENTIFIER ::= { hashAlgs 2 } - */ -const unsigned char ossl_der_oid_id_sha384[DER_OID_SZ_id_sha384] = { - DER_OID_V_id_sha384 -}; - -/* - * id-sha512 OBJECT IDENTIFIER ::= { hashAlgs 3 } - */ -const unsigned char ossl_der_oid_id_sha512[DER_OID_SZ_id_sha512] = { - DER_OID_V_id_sha512 -}; - -/* - * id-sha224 OBJECT IDENTIFIER ::= { hashAlgs 4 } - */ -const unsigned char ossl_der_oid_id_sha224[DER_OID_SZ_id_sha224] = { - DER_OID_V_id_sha224 -}; - -/* - * id-sha512-224 OBJECT IDENTIFIER ::= { hashAlgs 5 } - */ -const unsigned char ossl_der_oid_id_sha512_224[DER_OID_SZ_id_sha512_224] = { - DER_OID_V_id_sha512_224 -}; - -/* - * id-sha512-256 OBJECT IDENTIFIER ::= { hashAlgs 6 } - */ -const unsigned char ossl_der_oid_id_sha512_256[DER_OID_SZ_id_sha512_256] = { - DER_OID_V_id_sha512_256 -}; - -/* - * id-sha3-224 OBJECT IDENTIFIER ::= { hashAlgs 7 } - */ -const unsigned char ossl_der_oid_id_sha3_224[DER_OID_SZ_id_sha3_224] = { - DER_OID_V_id_sha3_224 -}; - -/* - * id-sha3-256 OBJECT IDENTIFIER ::= { hashAlgs 8 } - */ -const unsigned char ossl_der_oid_id_sha3_256[DER_OID_SZ_id_sha3_256] = { - DER_OID_V_id_sha3_256 -}; - -/* - * id-sha3-384 OBJECT IDENTIFIER ::= { hashAlgs 9 } - */ -const unsigned char ossl_der_oid_id_sha3_384[DER_OID_SZ_id_sha3_384] = { - DER_OID_V_id_sha3_384 -}; - -/* - * id-sha3-512 OBJECT IDENTIFIER ::= { hashAlgs 10 } - */ -const unsigned char ossl_der_oid_id_sha3_512[DER_OID_SZ_id_sha3_512] = { - DER_OID_V_id_sha3_512 -}; - -/* - * id-shake128 OBJECT IDENTIFIER ::= { hashAlgs 11 } - */ -const unsigned char ossl_der_oid_id_shake128[DER_OID_SZ_id_shake128] = { - DER_OID_V_id_shake128 -}; - -/* - * id-shake256 OBJECT IDENTIFIER ::= { hashAlgs 12 } - */ -const unsigned char ossl_der_oid_id_shake256[DER_OID_SZ_id_shake256] = { - DER_OID_V_id_shake256 -}; - -/* - * id-shake128-len OBJECT IDENTIFIER ::= { hashAlgs 17 } - */ -const unsigned char ossl_der_oid_id_shake128_len[DER_OID_SZ_id_shake128_len] = { - DER_OID_V_id_shake128_len -}; - -/* - * id-shake256-len OBJECT IDENTIFIER ::= { hashAlgs 18 } - */ -const unsigned char ossl_der_oid_id_shake256_len[DER_OID_SZ_id_shake256_len] = { - DER_OID_V_id_shake256_len -}; - -/* - * id-KMACWithSHAKE128 OBJECT IDENTIFIER ::={hashAlgs 19} - */ -const unsigned char ossl_der_oid_id_KMACWithSHAKE128[DER_OID_SZ_id_KMACWithSHAKE128] = { - DER_OID_V_id_KMACWithSHAKE128 -}; - -/* - * id-KMACWithSHAKE256 OBJECT IDENTIFIER ::={ hashAlgs 20} - */ -const unsigned char ossl_der_oid_id_KMACWithSHAKE256[DER_OID_SZ_id_KMACWithSHAKE256] = { - DER_OID_V_id_KMACWithSHAKE256 -}; - diff --git a/deps/openssl/config/archs/linux-ppc/asm_avx2/providers/common/der/der_dsa_gen.c b/deps/openssl/config/archs/linux-ppc/asm_avx2/providers/common/der/der_dsa_gen.c deleted file mode 100644 index e5cfe91e0f2510..00000000000000 --- a/deps/openssl/config/archs/linux-ppc/asm_avx2/providers/common/der/der_dsa_gen.c +++ /dev/null @@ -1,94 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_dsa_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -/* - * DSA low level APIs are deprecated for public use, but still ok for - * internal use. - */ -#include "internal/deprecated.h" - -#include "prov/der_dsa.h" - -/* Well known OIDs precompiled */ - -/* - * id-dsa OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) x9-57(10040) x9algorithm(4) 1 } - */ -const unsigned char ossl_der_oid_id_dsa[DER_OID_SZ_id_dsa] = { - DER_OID_V_id_dsa -}; - -/* - * id-dsa-with-sha1 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) x9-57 (10040) x9algorithm(4) 3 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha1[DER_OID_SZ_id_dsa_with_sha1] = { - DER_OID_V_id_dsa_with_sha1 -}; - -/* - * id-dsa-with-sha224 OBJECT IDENTIFIER ::= { sigAlgs 1 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha224[DER_OID_SZ_id_dsa_with_sha224] = { - DER_OID_V_id_dsa_with_sha224 -}; - -/* - * id-dsa-with-sha256 OBJECT IDENTIFIER ::= { sigAlgs 2 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha256[DER_OID_SZ_id_dsa_with_sha256] = { - DER_OID_V_id_dsa_with_sha256 -}; - -/* - * id-dsa-with-sha384 OBJECT IDENTIFIER ::= { sigAlgs 3 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha384[DER_OID_SZ_id_dsa_with_sha384] = { - DER_OID_V_id_dsa_with_sha384 -}; - -/* - * id-dsa-with-sha512 OBJECT IDENTIFIER ::= { sigAlgs 4 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha512[DER_OID_SZ_id_dsa_with_sha512] = { - DER_OID_V_id_dsa_with_sha512 -}; - -/* - * id-dsa-with-sha3-224 OBJECT IDENTIFIER ::= { sigAlgs 5 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha3_224[DER_OID_SZ_id_dsa_with_sha3_224] = { - DER_OID_V_id_dsa_with_sha3_224 -}; - -/* - * id-dsa-with-sha3-256 OBJECT IDENTIFIER ::= { sigAlgs 6 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha3_256[DER_OID_SZ_id_dsa_with_sha3_256] = { - DER_OID_V_id_dsa_with_sha3_256 -}; - -/* - * id-dsa-with-sha3-384 OBJECT IDENTIFIER ::= { sigAlgs 7 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha3_384[DER_OID_SZ_id_dsa_with_sha3_384] = { - DER_OID_V_id_dsa_with_sha3_384 -}; - -/* - * id-dsa-with-sha3-512 OBJECT IDENTIFIER ::= { sigAlgs 8 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha3_512[DER_OID_SZ_id_dsa_with_sha3_512] = { - DER_OID_V_id_dsa_with_sha3_512 -}; - diff --git a/deps/openssl/config/archs/linux-ppc/asm_avx2/providers/common/der/der_ec_gen.c b/deps/openssl/config/archs/linux-ppc/asm_avx2/providers/common/der/der_ec_gen.c deleted file mode 100644 index e1ed54ba05b6ff..00000000000000 --- a/deps/openssl/config/archs/linux-ppc/asm_avx2/providers/common/der/der_ec_gen.c +++ /dev/null @@ -1,279 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_ec_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_ec.h" - -/* Well known OIDs precompiled */ - -/* - * ecdsa-with-SHA1 OBJECT IDENTIFIER ::= { id-ecSigType 1 } - */ -const unsigned char ossl_der_oid_ecdsa_with_SHA1[DER_OID_SZ_ecdsa_with_SHA1] = { - DER_OID_V_ecdsa_with_SHA1 -}; - -/* - * id-ecPublicKey OBJECT IDENTIFIER ::= { id-publicKeyType 1 } - */ -const unsigned char ossl_der_oid_id_ecPublicKey[DER_OID_SZ_id_ecPublicKey] = { - DER_OID_V_id_ecPublicKey -}; - -/* - * c2pnb163v1 OBJECT IDENTIFIER ::= { c-TwoCurve 1 } - */ -const unsigned char ossl_der_oid_c2pnb163v1[DER_OID_SZ_c2pnb163v1] = { - DER_OID_V_c2pnb163v1 -}; - -/* - * c2pnb163v2 OBJECT IDENTIFIER ::= { c-TwoCurve 2 } - */ -const unsigned char ossl_der_oid_c2pnb163v2[DER_OID_SZ_c2pnb163v2] = { - DER_OID_V_c2pnb163v2 -}; - -/* - * c2pnb163v3 OBJECT IDENTIFIER ::= { c-TwoCurve 3 } - */ -const unsigned char ossl_der_oid_c2pnb163v3[DER_OID_SZ_c2pnb163v3] = { - DER_OID_V_c2pnb163v3 -}; - -/* - * c2pnb176w1 OBJECT IDENTIFIER ::= { c-TwoCurve 4 } - */ -const unsigned char ossl_der_oid_c2pnb176w1[DER_OID_SZ_c2pnb176w1] = { - DER_OID_V_c2pnb176w1 -}; - -/* - * c2tnb191v1 OBJECT IDENTIFIER ::= { c-TwoCurve 5 } - */ -const unsigned char ossl_der_oid_c2tnb191v1[DER_OID_SZ_c2tnb191v1] = { - DER_OID_V_c2tnb191v1 -}; - -/* - * c2tnb191v2 OBJECT IDENTIFIER ::= { c-TwoCurve 6 } - */ -const unsigned char ossl_der_oid_c2tnb191v2[DER_OID_SZ_c2tnb191v2] = { - DER_OID_V_c2tnb191v2 -}; - -/* - * c2tnb191v3 OBJECT IDENTIFIER ::= { c-TwoCurve 7 } - */ -const unsigned char ossl_der_oid_c2tnb191v3[DER_OID_SZ_c2tnb191v3] = { - DER_OID_V_c2tnb191v3 -}; - -/* - * c2onb191v4 OBJECT IDENTIFIER ::= { c-TwoCurve 8 } - */ -const unsigned char ossl_der_oid_c2onb191v4[DER_OID_SZ_c2onb191v4] = { - DER_OID_V_c2onb191v4 -}; - -/* - * c2onb191v5 OBJECT IDENTIFIER ::= { c-TwoCurve 9 } - */ -const unsigned char ossl_der_oid_c2onb191v5[DER_OID_SZ_c2onb191v5] = { - DER_OID_V_c2onb191v5 -}; - -/* - * c2pnb208w1 OBJECT IDENTIFIER ::= { c-TwoCurve 10 } - */ -const unsigned char ossl_der_oid_c2pnb208w1[DER_OID_SZ_c2pnb208w1] = { - DER_OID_V_c2pnb208w1 -}; - -/* - * c2tnb239v1 OBJECT IDENTIFIER ::= { c-TwoCurve 11 } - */ -const unsigned char ossl_der_oid_c2tnb239v1[DER_OID_SZ_c2tnb239v1] = { - DER_OID_V_c2tnb239v1 -}; - -/* - * c2tnb239v2 OBJECT IDENTIFIER ::= { c-TwoCurve 12 } - */ -const unsigned char ossl_der_oid_c2tnb239v2[DER_OID_SZ_c2tnb239v2] = { - DER_OID_V_c2tnb239v2 -}; - -/* - * c2tnb239v3 OBJECT IDENTIFIER ::= { c-TwoCurve 13 } - */ -const unsigned char ossl_der_oid_c2tnb239v3[DER_OID_SZ_c2tnb239v3] = { - DER_OID_V_c2tnb239v3 -}; - -/* - * c2onb239v4 OBJECT IDENTIFIER ::= { c-TwoCurve 14 } - */ -const unsigned char ossl_der_oid_c2onb239v4[DER_OID_SZ_c2onb239v4] = { - DER_OID_V_c2onb239v4 -}; - -/* - * c2onb239v5 OBJECT IDENTIFIER ::= { c-TwoCurve 15 } - */ -const unsigned char ossl_der_oid_c2onb239v5[DER_OID_SZ_c2onb239v5] = { - DER_OID_V_c2onb239v5 -}; - -/* - * c2pnb272w1 OBJECT IDENTIFIER ::= { c-TwoCurve 16 } - */ -const unsigned char ossl_der_oid_c2pnb272w1[DER_OID_SZ_c2pnb272w1] = { - DER_OID_V_c2pnb272w1 -}; - -/* - * c2pnb304w1 OBJECT IDENTIFIER ::= { c-TwoCurve 17 } - */ -const unsigned char ossl_der_oid_c2pnb304w1[DER_OID_SZ_c2pnb304w1] = { - DER_OID_V_c2pnb304w1 -}; - -/* - * c2tnb359v1 OBJECT IDENTIFIER ::= { c-TwoCurve 18 } - */ -const unsigned char ossl_der_oid_c2tnb359v1[DER_OID_SZ_c2tnb359v1] = { - DER_OID_V_c2tnb359v1 -}; - -/* - * c2pnb368w1 OBJECT IDENTIFIER ::= { c-TwoCurve 19 } - */ -const unsigned char ossl_der_oid_c2pnb368w1[DER_OID_SZ_c2pnb368w1] = { - DER_OID_V_c2pnb368w1 -}; - -/* - * c2tnb431r1 OBJECT IDENTIFIER ::= { c-TwoCurve 20 } - */ -const unsigned char ossl_der_oid_c2tnb431r1[DER_OID_SZ_c2tnb431r1] = { - DER_OID_V_c2tnb431r1 -}; - -/* - * prime192v1 OBJECT IDENTIFIER ::= { primeCurve 1 } - */ -const unsigned char ossl_der_oid_prime192v1[DER_OID_SZ_prime192v1] = { - DER_OID_V_prime192v1 -}; - -/* - * prime192v2 OBJECT IDENTIFIER ::= { primeCurve 2 } - */ -const unsigned char ossl_der_oid_prime192v2[DER_OID_SZ_prime192v2] = { - DER_OID_V_prime192v2 -}; - -/* - * prime192v3 OBJECT IDENTIFIER ::= { primeCurve 3 } - */ -const unsigned char ossl_der_oid_prime192v3[DER_OID_SZ_prime192v3] = { - DER_OID_V_prime192v3 -}; - -/* - * prime239v1 OBJECT IDENTIFIER ::= { primeCurve 4 } - */ -const unsigned char ossl_der_oid_prime239v1[DER_OID_SZ_prime239v1] = { - DER_OID_V_prime239v1 -}; - -/* - * prime239v2 OBJECT IDENTIFIER ::= { primeCurve 5 } - */ -const unsigned char ossl_der_oid_prime239v2[DER_OID_SZ_prime239v2] = { - DER_OID_V_prime239v2 -}; - -/* - * prime239v3 OBJECT IDENTIFIER ::= { primeCurve 6 } - */ -const unsigned char ossl_der_oid_prime239v3[DER_OID_SZ_prime239v3] = { - DER_OID_V_prime239v3 -}; - -/* - * prime256v1 OBJECT IDENTIFIER ::= { primeCurve 7 } - */ -const unsigned char ossl_der_oid_prime256v1[DER_OID_SZ_prime256v1] = { - DER_OID_V_prime256v1 -}; - -/* - * ecdsa-with-SHA224 OBJECT IDENTIFIER ::= { iso(1) member-body(2) - * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 1 } - */ -const unsigned char ossl_der_oid_ecdsa_with_SHA224[DER_OID_SZ_ecdsa_with_SHA224] = { - DER_OID_V_ecdsa_with_SHA224 -}; - -/* - * ecdsa-with-SHA256 OBJECT IDENTIFIER ::= { iso(1) member-body(2) - * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 2 } - */ -const unsigned char ossl_der_oid_ecdsa_with_SHA256[DER_OID_SZ_ecdsa_with_SHA256] = { - DER_OID_V_ecdsa_with_SHA256 -}; - -/* - * ecdsa-with-SHA384 OBJECT IDENTIFIER ::= { iso(1) member-body(2) - * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 3 } - */ -const unsigned char ossl_der_oid_ecdsa_with_SHA384[DER_OID_SZ_ecdsa_with_SHA384] = { - DER_OID_V_ecdsa_with_SHA384 -}; - -/* - * ecdsa-with-SHA512 OBJECT IDENTIFIER ::= { iso(1) member-body(2) - * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 4 } - */ -const unsigned char ossl_der_oid_ecdsa_with_SHA512[DER_OID_SZ_ecdsa_with_SHA512] = { - DER_OID_V_ecdsa_with_SHA512 -}; - -/* - * id-ecdsa-with-sha3-224 OBJECT IDENTIFIER ::= { sigAlgs 9 } - */ -const unsigned char ossl_der_oid_id_ecdsa_with_sha3_224[DER_OID_SZ_id_ecdsa_with_sha3_224] = { - DER_OID_V_id_ecdsa_with_sha3_224 -}; - -/* - * id-ecdsa-with-sha3-256 OBJECT IDENTIFIER ::= { sigAlgs 10 } - */ -const unsigned char ossl_der_oid_id_ecdsa_with_sha3_256[DER_OID_SZ_id_ecdsa_with_sha3_256] = { - DER_OID_V_id_ecdsa_with_sha3_256 -}; - -/* - * id-ecdsa-with-sha3-384 OBJECT IDENTIFIER ::= { sigAlgs 11 } - */ -const unsigned char ossl_der_oid_id_ecdsa_with_sha3_384[DER_OID_SZ_id_ecdsa_with_sha3_384] = { - DER_OID_V_id_ecdsa_with_sha3_384 -}; - -/* - * id-ecdsa-with-sha3-512 OBJECT IDENTIFIER ::= { sigAlgs 12 } - */ -const unsigned char ossl_der_oid_id_ecdsa_with_sha3_512[DER_OID_SZ_id_ecdsa_with_sha3_512] = { - DER_OID_V_id_ecdsa_with_sha3_512 -}; - diff --git a/deps/openssl/config/archs/linux-ppc/asm_avx2/providers/common/der/der_ecx_gen.c b/deps/openssl/config/archs/linux-ppc/asm_avx2/providers/common/der/der_ecx_gen.c deleted file mode 100644 index ba7bf14b5e156d..00000000000000 --- a/deps/openssl/config/archs/linux-ppc/asm_avx2/providers/common/der/der_ecx_gen.c +++ /dev/null @@ -1,44 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_ecx_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_ecx.h" - -/* Well known OIDs precompiled */ - -/* - * id-X25519 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 110 } - */ -const unsigned char ossl_der_oid_id_X25519[DER_OID_SZ_id_X25519] = { - DER_OID_V_id_X25519 -}; - -/* - * id-X448 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 111 } - */ -const unsigned char ossl_der_oid_id_X448[DER_OID_SZ_id_X448] = { - DER_OID_V_id_X448 -}; - -/* - * id-Ed25519 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 112 } - */ -const unsigned char ossl_der_oid_id_Ed25519[DER_OID_SZ_id_Ed25519] = { - DER_OID_V_id_Ed25519 -}; - -/* - * id-Ed448 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 113 } - */ -const unsigned char ossl_der_oid_id_Ed448[DER_OID_SZ_id_Ed448] = { - DER_OID_V_id_Ed448 -}; - diff --git a/deps/openssl/config/archs/linux-ppc/asm_avx2/providers/common/der/der_rsa_gen.c b/deps/openssl/config/archs/linux-ppc/asm_avx2/providers/common/der/der_rsa_gen.c deleted file mode 100644 index a3431798402f3f..00000000000000 --- a/deps/openssl/config/archs/linux-ppc/asm_avx2/providers/common/der/der_rsa_gen.c +++ /dev/null @@ -1,174 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_rsa_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_rsa.h" - -/* Well known OIDs precompiled */ - -/* - * hashAlgs OBJECT IDENTIFIER ::= { nistAlgorithms 2 } - */ -const unsigned char ossl_der_oid_hashAlgs[DER_OID_SZ_hashAlgs] = { - DER_OID_V_hashAlgs -}; - -/* - * rsaEncryption OBJECT IDENTIFIER ::= { pkcs-1 1 } - */ -const unsigned char ossl_der_oid_rsaEncryption[DER_OID_SZ_rsaEncryption] = { - DER_OID_V_rsaEncryption -}; - -/* - * id-RSAES-OAEP OBJECT IDENTIFIER ::= { pkcs-1 7 } - */ -const unsigned char ossl_der_oid_id_RSAES_OAEP[DER_OID_SZ_id_RSAES_OAEP] = { - DER_OID_V_id_RSAES_OAEP -}; - -/* - * id-pSpecified OBJECT IDENTIFIER ::= { pkcs-1 9 } - */ -const unsigned char ossl_der_oid_id_pSpecified[DER_OID_SZ_id_pSpecified] = { - DER_OID_V_id_pSpecified -}; - -/* - * id-RSASSA-PSS OBJECT IDENTIFIER ::= { pkcs-1 10 } - */ -const unsigned char ossl_der_oid_id_RSASSA_PSS[DER_OID_SZ_id_RSASSA_PSS] = { - DER_OID_V_id_RSASSA_PSS -}; - -/* - * md2WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 2 } - */ -const unsigned char ossl_der_oid_md2WithRSAEncryption[DER_OID_SZ_md2WithRSAEncryption] = { - DER_OID_V_md2WithRSAEncryption -}; - -/* - * md5WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 4 } - */ -const unsigned char ossl_der_oid_md5WithRSAEncryption[DER_OID_SZ_md5WithRSAEncryption] = { - DER_OID_V_md5WithRSAEncryption -}; - -/* - * sha1WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 5 } - */ -const unsigned char ossl_der_oid_sha1WithRSAEncryption[DER_OID_SZ_sha1WithRSAEncryption] = { - DER_OID_V_sha1WithRSAEncryption -}; - -/* - * sha224WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 14 } - */ -const unsigned char ossl_der_oid_sha224WithRSAEncryption[DER_OID_SZ_sha224WithRSAEncryption] = { - DER_OID_V_sha224WithRSAEncryption -}; - -/* - * sha256WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 11 } - */ -const unsigned char ossl_der_oid_sha256WithRSAEncryption[DER_OID_SZ_sha256WithRSAEncryption] = { - DER_OID_V_sha256WithRSAEncryption -}; - -/* - * sha384WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 12 } - */ -const unsigned char ossl_der_oid_sha384WithRSAEncryption[DER_OID_SZ_sha384WithRSAEncryption] = { - DER_OID_V_sha384WithRSAEncryption -}; - -/* - * sha512WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 13 } - */ -const unsigned char ossl_der_oid_sha512WithRSAEncryption[DER_OID_SZ_sha512WithRSAEncryption] = { - DER_OID_V_sha512WithRSAEncryption -}; - -/* - * sha512-224WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 15 } - */ -const unsigned char ossl_der_oid_sha512_224WithRSAEncryption[DER_OID_SZ_sha512_224WithRSAEncryption] = { - DER_OID_V_sha512_224WithRSAEncryption -}; - -/* - * sha512-256WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 16 } - */ -const unsigned char ossl_der_oid_sha512_256WithRSAEncryption[DER_OID_SZ_sha512_256WithRSAEncryption] = { - DER_OID_V_sha512_256WithRSAEncryption -}; - -/* - * id-mgf1 OBJECT IDENTIFIER ::= { pkcs-1 8 } - */ -const unsigned char ossl_der_oid_id_mgf1[DER_OID_SZ_id_mgf1] = { - DER_OID_V_id_mgf1 -}; - -/* - * id-rsassa-pkcs1-v1_5-with-sha3-224 OBJECT IDENTIFIER ::= { sigAlgs 13 } - */ -const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_224[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_224] = { - DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_224 -}; - -/* - * id-rsassa-pkcs1-v1_5-with-sha3-256 OBJECT IDENTIFIER ::= { sigAlgs 14 } - */ -const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_256[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_256] = { - DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_256 -}; - -/* - * id-rsassa-pkcs1-v1_5-with-sha3-384 OBJECT IDENTIFIER ::= { sigAlgs 15 } - */ -const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_384[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_384] = { - DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_384 -}; - -/* - * id-rsassa-pkcs1-v1_5-with-sha3-512 OBJECT IDENTIFIER ::= { sigAlgs 16 } - */ -const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_512[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_512] = { - DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_512 -}; - -/* - * md4WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 3 } - */ -const unsigned char ossl_der_oid_md4WithRSAEncryption[DER_OID_SZ_md4WithRSAEncryption] = { - DER_OID_V_md4WithRSAEncryption -}; - -/* - * ripemd160WithRSAEncryption OBJECT IDENTIFIER ::= { - * iso(1) identified-organization(3) teletrust(36) algorithm(3) signatureAlgorithm(3) rsaSignature(1) 2 - * } - */ -const unsigned char ossl_der_oid_ripemd160WithRSAEncryption[DER_OID_SZ_ripemd160WithRSAEncryption] = { - DER_OID_V_ripemd160WithRSAEncryption -}; - -/* - * mdc2WithRSASignature OBJECT IDENTIFIER ::= { - * iso(1) identified-organization(3) oiw(14) secsig(3) algorithms(2) mdc2WithRSASignature(14) - * } - */ -const unsigned char ossl_der_oid_mdc2WithRSASignature[DER_OID_SZ_mdc2WithRSASignature] = { - DER_OID_V_mdc2WithRSASignature -}; - diff --git a/deps/openssl/config/archs/linux-ppc/asm_avx2/providers/common/der/der_sm2_gen.c b/deps/openssl/config/archs/linux-ppc/asm_avx2/providers/common/der/der_sm2_gen.c deleted file mode 100644 index 6424ea166b7e15..00000000000000 --- a/deps/openssl/config/archs/linux-ppc/asm_avx2/providers/common/der/der_sm2_gen.c +++ /dev/null @@ -1,30 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_sm2_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_sm2.h" - -/* Well known OIDs precompiled */ - -/* - * sm2-with-SM3 OBJECT IDENTIFIER ::= { sm-scheme 501 } - */ -const unsigned char ossl_der_oid_sm2_with_SM3[DER_OID_SZ_sm2_with_SM3] = { - DER_OID_V_sm2_with_SM3 -}; - -/* - * curveSM2 OBJECT IDENTIFIER ::= { sm-scheme 301 } - */ -const unsigned char ossl_der_oid_curveSM2[DER_OID_SZ_curveSM2] = { - DER_OID_V_curveSM2 -}; - diff --git a/deps/openssl/config/archs/linux-ppc/asm_avx2/providers/common/der/der_wrap_gen.c b/deps/openssl/config/archs/linux-ppc/asm_avx2/providers/common/der/der_wrap_gen.c deleted file mode 100644 index 6cf93972f48b6d..00000000000000 --- a/deps/openssl/config/archs/linux-ppc/asm_avx2/providers/common/der/der_wrap_gen.c +++ /dev/null @@ -1,46 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_wrap_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_wrap.h" - -/* Well known OIDs precompiled */ - -/* - * id-alg-CMS3DESwrap OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs-9(9) smime(16) alg(3) 6 - * } - */ -const unsigned char ossl_der_oid_id_alg_CMS3DESwrap[DER_OID_SZ_id_alg_CMS3DESwrap] = { - DER_OID_V_id_alg_CMS3DESwrap -}; - -/* - * id-aes128-wrap OBJECT IDENTIFIER ::= { aes 5 } - */ -const unsigned char ossl_der_oid_id_aes128_wrap[DER_OID_SZ_id_aes128_wrap] = { - DER_OID_V_id_aes128_wrap -}; - -/* - * id-aes192-wrap OBJECT IDENTIFIER ::= { aes 25 } - */ -const unsigned char ossl_der_oid_id_aes192_wrap[DER_OID_SZ_id_aes192_wrap] = { - DER_OID_V_id_aes192_wrap -}; - -/* - * id-aes256-wrap OBJECT IDENTIFIER ::= { aes 45 } - */ -const unsigned char ossl_der_oid_id_aes256_wrap[DER_OID_SZ_id_aes256_wrap] = { - DER_OID_V_id_aes256_wrap -}; - diff --git a/deps/openssl/config/archs/linux-ppc/asm_avx2/providers/fips.ld b/deps/openssl/config/archs/linux-ppc/asm_avx2/providers/fips.ld deleted file mode 100644 index 1debaaa7ff652d..00000000000000 --- a/deps/openssl/config/archs/linux-ppc/asm_avx2/providers/fips.ld +++ /dev/null @@ -1,5 +0,0 @@ -{ - global: - OSSL_provider_init; - local: *; -}; diff --git a/deps/openssl/config/archs/linux-ppc/asm_avx2/providers/legacy.ld b/deps/openssl/config/archs/linux-ppc/asm_avx2/providers/legacy.ld deleted file mode 100644 index 1debaaa7ff652d..00000000000000 --- a/deps/openssl/config/archs/linux-ppc/asm_avx2/providers/legacy.ld +++ /dev/null @@ -1,5 +0,0 @@ -{ - global: - OSSL_provider_init; - local: *; -}; diff --git a/deps/openssl/config/archs/linux-ppc/no-asm/apps/progs.c b/deps/openssl/config/archs/linux-ppc/no-asm/apps/progs.c deleted file mode 100644 index f594c302c42ec6..00000000000000 --- a/deps/openssl/config/archs/linux-ppc/no-asm/apps/progs.c +++ /dev/null @@ -1,397 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by apps/progs.pl - * - * Copyright 1995-2022 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "progs.h" - -FUNCTION functions[] = { - {FT_general, "asn1parse", asn1parse_main, asn1parse_options, NULL, NULL}, - {FT_general, "ca", ca_main, ca_options, NULL, NULL}, -#ifndef OPENSSL_NO_SOCK - {FT_general, "ciphers", ciphers_main, ciphers_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_CMP - {FT_general, "cmp", cmp_main, cmp_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_CMS - {FT_general, "cms", cms_main, cms_options, NULL, NULL}, -#endif - {FT_general, "crl", crl_main, crl_options, NULL, NULL}, - {FT_general, "crl2pkcs7", crl2pkcs7_main, crl2pkcs7_options, NULL, NULL}, - {FT_general, "dgst", dgst_main, dgst_options, NULL, NULL}, -#ifndef OPENSSL_NO_DH - {FT_general, "dhparam", dhparam_main, dhparam_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_DSA - {FT_general, "dsa", dsa_main, dsa_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_DSA - {FT_general, "dsaparam", dsaparam_main, dsaparam_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_EC - {FT_general, "ec", ec_main, ec_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_EC - {FT_general, "ecparam", ecparam_main, ecparam_options, NULL, NULL}, -#endif - {FT_general, "enc", enc_main, enc_options, NULL, NULL}, -#ifndef OPENSSL_NO_ENGINE - {FT_general, "engine", engine_main, engine_options, NULL, NULL}, -#endif - {FT_general, "errstr", errstr_main, errstr_options, NULL, NULL}, - {FT_general, "fipsinstall", fipsinstall_main, fipsinstall_options, NULL, NULL}, -#ifndef OPENSSL_NO_DSA - {FT_general, "gendsa", gendsa_main, gendsa_options, NULL, NULL}, -#endif - {FT_general, "genpkey", genpkey_main, genpkey_options, NULL, NULL}, -#ifndef OPENSSL_NO_RSA - {FT_general, "genrsa", genrsa_main, genrsa_options, NULL, NULL}, -#endif - {FT_general, "help", help_main, help_options, NULL, NULL}, - {FT_general, "info", info_main, info_options, NULL, NULL}, - {FT_general, "kdf", kdf_main, kdf_options, NULL, NULL}, - {FT_general, "list", list_main, list_options, NULL, NULL}, - {FT_general, "mac", mac_main, mac_options, NULL, NULL}, - {FT_general, "nseq", nseq_main, nseq_options, NULL, NULL}, -#ifndef OPENSSL_NO_OCSP - {FT_general, "ocsp", ocsp_main, ocsp_options, NULL, NULL}, -#endif - {FT_general, "passwd", passwd_main, passwd_options, NULL, NULL}, - {FT_general, "pkcs12", pkcs12_main, pkcs12_options, NULL, NULL}, - {FT_general, "pkcs7", pkcs7_main, pkcs7_options, NULL, NULL}, - {FT_general, "pkcs8", pkcs8_main, pkcs8_options, NULL, NULL}, - {FT_general, "pkey", pkey_main, pkey_options, NULL, NULL}, - {FT_general, "pkeyparam", pkeyparam_main, pkeyparam_options, NULL, NULL}, - {FT_general, "pkeyutl", pkeyutl_main, pkeyutl_options, NULL, NULL}, - {FT_general, "prime", prime_main, prime_options, NULL, NULL}, - {FT_general, "rand", rand_main, rand_options, NULL, NULL}, - {FT_general, "rehash", rehash_main, rehash_options, NULL, NULL}, - {FT_general, "req", req_main, req_options, NULL, NULL}, - {FT_general, "rsa", rsa_main, rsa_options, NULL, NULL}, -#if !defined(OPENSSL_NO_DEPRECATED_3_0) && !defined(OPENSSL_NO_RSA) - {FT_general, "rsautl", rsautl_main, rsautl_options, "pkeyutl", "3.0"}, -#endif -#ifndef OPENSSL_NO_SOCK - {FT_general, "s_client", s_client_main, s_client_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_SOCK - {FT_general, "s_server", s_server_main, s_server_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_SOCK - {FT_general, "s_time", s_time_main, s_time_options, NULL, NULL}, -#endif - {FT_general, "sess_id", sess_id_main, sess_id_options, NULL, NULL}, - {FT_general, "smime", smime_main, smime_options, NULL, NULL}, - {FT_general, "speed", speed_main, speed_options, NULL, NULL}, - {FT_general, "spkac", spkac_main, spkac_options, NULL, NULL}, -#ifndef OPENSSL_NO_SRP - {FT_general, "srp", srp_main, srp_options, NULL, NULL}, -#endif - {FT_general, "storeutl", storeutl_main, storeutl_options, NULL, NULL}, -#ifndef OPENSSL_NO_TS - {FT_general, "ts", ts_main, ts_options, NULL, NULL}, -#endif - {FT_general, "verify", verify_main, verify_options, NULL, NULL}, - {FT_general, "version", version_main, version_options, NULL, NULL}, - {FT_general, "x509", x509_main, x509_options, NULL, NULL}, -#ifndef OPENSSL_NO_MD2 - {FT_md, "md2", dgst_main, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_MD4 - {FT_md, "md4", dgst_main, NULL, NULL}, -#endif - {FT_md, "md5", dgst_main, NULL, NULL}, - {FT_md, "sha1", dgst_main, NULL, NULL}, - {FT_md, "sha224", dgst_main, NULL, NULL}, - {FT_md, "sha256", dgst_main, NULL, NULL}, - {FT_md, "sha384", dgst_main, NULL, NULL}, - {FT_md, "sha512", dgst_main, NULL, NULL}, - {FT_md, "sha512-224", dgst_main, NULL, NULL}, - {FT_md, "sha512-256", dgst_main, NULL, NULL}, - {FT_md, "sha3-224", dgst_main, NULL, NULL}, - {FT_md, "sha3-256", dgst_main, NULL, NULL}, - {FT_md, "sha3-384", dgst_main, NULL, NULL}, - {FT_md, "sha3-512", dgst_main, NULL, NULL}, - {FT_md, "shake128", dgst_main, NULL, NULL}, - {FT_md, "shake256", dgst_main, NULL, NULL}, -#ifndef OPENSSL_NO_MDC2 - {FT_md, "mdc2", dgst_main, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_RMD160 - {FT_md, "rmd160", dgst_main, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_BLAKE2 - {FT_md, "blake2b512", dgst_main, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_BLAKE2 - {FT_md, "blake2s256", dgst_main, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_SM3 - {FT_md, "sm3", dgst_main, NULL, NULL}, -#endif - {FT_cipher, "aes-128-cbc", enc_main, enc_options, NULL}, - {FT_cipher, "aes-128-ecb", enc_main, enc_options, NULL}, - {FT_cipher, "aes-192-cbc", enc_main, enc_options, NULL}, - {FT_cipher, "aes-192-ecb", enc_main, enc_options, NULL}, - {FT_cipher, "aes-256-cbc", enc_main, enc_options, NULL}, - {FT_cipher, "aes-256-ecb", enc_main, enc_options, NULL}, -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-ctr", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-cfb1", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-cfb8", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-ctr", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-cfb1", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-cfb8", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-ctr", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-cfb1", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-cfb8", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-128-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-128-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-192-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-192-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-256-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-256-ecb", enc_main, enc_options, NULL}, -#endif - {FT_cipher, "base64", enc_main, enc_options, NULL}, -#ifdef ZLIB - {FT_cipher, "zlib", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des3", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "desx", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC4 - {FT_cipher, "rc4", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC4 - {FT_cipher, "rc4-40", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede3", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede3-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede3-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede3-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-64-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-40-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast5-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast5-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast5-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast5-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-ctr", enc_main, enc_options, NULL}, -#endif - {0, NULL, NULL, NULL, NULL} -}; diff --git a/deps/openssl/config/archs/linux-ppc/no-asm/providers/common/der/der_digests_gen.c b/deps/openssl/config/archs/linux-ppc/no-asm/providers/common/der/der_digests_gen.c deleted file mode 100644 index e4e14e82e5648a..00000000000000 --- a/deps/openssl/config/archs/linux-ppc/no-asm/providers/common/der/der_digests_gen.c +++ /dev/null @@ -1,160 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_digests_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_digests.h" - -/* Well known OIDs precompiled */ - -/* - * sigAlgs OBJECT IDENTIFIER ::= { nistAlgorithms 3 } - */ -const unsigned char ossl_der_oid_sigAlgs[DER_OID_SZ_sigAlgs] = { - DER_OID_V_sigAlgs -}; - -/* - * id-sha1 OBJECT IDENTIFIER ::= { iso(1) - * identified-organization(3) oiw(14) - * secsig(3) algorithms(2) 26 } - */ -const unsigned char ossl_der_oid_id_sha1[DER_OID_SZ_id_sha1] = { - DER_OID_V_id_sha1 -}; - -/* - * id-md2 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 2 } - */ -const unsigned char ossl_der_oid_id_md2[DER_OID_SZ_id_md2] = { - DER_OID_V_id_md2 -}; - -/* - * id-md5 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 5 } - */ -const unsigned char ossl_der_oid_id_md5[DER_OID_SZ_id_md5] = { - DER_OID_V_id_md5 -}; - -/* - * id-sha256 OBJECT IDENTIFIER ::= { hashAlgs 1 } - */ -const unsigned char ossl_der_oid_id_sha256[DER_OID_SZ_id_sha256] = { - DER_OID_V_id_sha256 -}; - -/* - * id-sha384 OBJECT IDENTIFIER ::= { hashAlgs 2 } - */ -const unsigned char ossl_der_oid_id_sha384[DER_OID_SZ_id_sha384] = { - DER_OID_V_id_sha384 -}; - -/* - * id-sha512 OBJECT IDENTIFIER ::= { hashAlgs 3 } - */ -const unsigned char ossl_der_oid_id_sha512[DER_OID_SZ_id_sha512] = { - DER_OID_V_id_sha512 -}; - -/* - * id-sha224 OBJECT IDENTIFIER ::= { hashAlgs 4 } - */ -const unsigned char ossl_der_oid_id_sha224[DER_OID_SZ_id_sha224] = { - DER_OID_V_id_sha224 -}; - -/* - * id-sha512-224 OBJECT IDENTIFIER ::= { hashAlgs 5 } - */ -const unsigned char ossl_der_oid_id_sha512_224[DER_OID_SZ_id_sha512_224] = { - DER_OID_V_id_sha512_224 -}; - -/* - * id-sha512-256 OBJECT IDENTIFIER ::= { hashAlgs 6 } - */ -const unsigned char ossl_der_oid_id_sha512_256[DER_OID_SZ_id_sha512_256] = { - DER_OID_V_id_sha512_256 -}; - -/* - * id-sha3-224 OBJECT IDENTIFIER ::= { hashAlgs 7 } - */ -const unsigned char ossl_der_oid_id_sha3_224[DER_OID_SZ_id_sha3_224] = { - DER_OID_V_id_sha3_224 -}; - -/* - * id-sha3-256 OBJECT IDENTIFIER ::= { hashAlgs 8 } - */ -const unsigned char ossl_der_oid_id_sha3_256[DER_OID_SZ_id_sha3_256] = { - DER_OID_V_id_sha3_256 -}; - -/* - * id-sha3-384 OBJECT IDENTIFIER ::= { hashAlgs 9 } - */ -const unsigned char ossl_der_oid_id_sha3_384[DER_OID_SZ_id_sha3_384] = { - DER_OID_V_id_sha3_384 -}; - -/* - * id-sha3-512 OBJECT IDENTIFIER ::= { hashAlgs 10 } - */ -const unsigned char ossl_der_oid_id_sha3_512[DER_OID_SZ_id_sha3_512] = { - DER_OID_V_id_sha3_512 -}; - -/* - * id-shake128 OBJECT IDENTIFIER ::= { hashAlgs 11 } - */ -const unsigned char ossl_der_oid_id_shake128[DER_OID_SZ_id_shake128] = { - DER_OID_V_id_shake128 -}; - -/* - * id-shake256 OBJECT IDENTIFIER ::= { hashAlgs 12 } - */ -const unsigned char ossl_der_oid_id_shake256[DER_OID_SZ_id_shake256] = { - DER_OID_V_id_shake256 -}; - -/* - * id-shake128-len OBJECT IDENTIFIER ::= { hashAlgs 17 } - */ -const unsigned char ossl_der_oid_id_shake128_len[DER_OID_SZ_id_shake128_len] = { - DER_OID_V_id_shake128_len -}; - -/* - * id-shake256-len OBJECT IDENTIFIER ::= { hashAlgs 18 } - */ -const unsigned char ossl_der_oid_id_shake256_len[DER_OID_SZ_id_shake256_len] = { - DER_OID_V_id_shake256_len -}; - -/* - * id-KMACWithSHAKE128 OBJECT IDENTIFIER ::={hashAlgs 19} - */ -const unsigned char ossl_der_oid_id_KMACWithSHAKE128[DER_OID_SZ_id_KMACWithSHAKE128] = { - DER_OID_V_id_KMACWithSHAKE128 -}; - -/* - * id-KMACWithSHAKE256 OBJECT IDENTIFIER ::={ hashAlgs 20} - */ -const unsigned char ossl_der_oid_id_KMACWithSHAKE256[DER_OID_SZ_id_KMACWithSHAKE256] = { - DER_OID_V_id_KMACWithSHAKE256 -}; - diff --git a/deps/openssl/config/archs/linux-ppc/no-asm/providers/common/der/der_dsa_gen.c b/deps/openssl/config/archs/linux-ppc/no-asm/providers/common/der/der_dsa_gen.c deleted file mode 100644 index e5cfe91e0f2510..00000000000000 --- a/deps/openssl/config/archs/linux-ppc/no-asm/providers/common/der/der_dsa_gen.c +++ /dev/null @@ -1,94 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_dsa_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -/* - * DSA low level APIs are deprecated for public use, but still ok for - * internal use. - */ -#include "internal/deprecated.h" - -#include "prov/der_dsa.h" - -/* Well known OIDs precompiled */ - -/* - * id-dsa OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) x9-57(10040) x9algorithm(4) 1 } - */ -const unsigned char ossl_der_oid_id_dsa[DER_OID_SZ_id_dsa] = { - DER_OID_V_id_dsa -}; - -/* - * id-dsa-with-sha1 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) x9-57 (10040) x9algorithm(4) 3 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha1[DER_OID_SZ_id_dsa_with_sha1] = { - DER_OID_V_id_dsa_with_sha1 -}; - -/* - * id-dsa-with-sha224 OBJECT IDENTIFIER ::= { sigAlgs 1 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha224[DER_OID_SZ_id_dsa_with_sha224] = { - DER_OID_V_id_dsa_with_sha224 -}; - -/* - * id-dsa-with-sha256 OBJECT IDENTIFIER ::= { sigAlgs 2 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha256[DER_OID_SZ_id_dsa_with_sha256] = { - DER_OID_V_id_dsa_with_sha256 -}; - -/* - * id-dsa-with-sha384 OBJECT IDENTIFIER ::= { sigAlgs 3 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha384[DER_OID_SZ_id_dsa_with_sha384] = { - DER_OID_V_id_dsa_with_sha384 -}; - -/* - * id-dsa-with-sha512 OBJECT IDENTIFIER ::= { sigAlgs 4 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha512[DER_OID_SZ_id_dsa_with_sha512] = { - DER_OID_V_id_dsa_with_sha512 -}; - -/* - * id-dsa-with-sha3-224 OBJECT IDENTIFIER ::= { sigAlgs 5 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha3_224[DER_OID_SZ_id_dsa_with_sha3_224] = { - DER_OID_V_id_dsa_with_sha3_224 -}; - -/* - * id-dsa-with-sha3-256 OBJECT IDENTIFIER ::= { sigAlgs 6 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha3_256[DER_OID_SZ_id_dsa_with_sha3_256] = { - DER_OID_V_id_dsa_with_sha3_256 -}; - -/* - * id-dsa-with-sha3-384 OBJECT IDENTIFIER ::= { sigAlgs 7 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha3_384[DER_OID_SZ_id_dsa_with_sha3_384] = { - DER_OID_V_id_dsa_with_sha3_384 -}; - -/* - * id-dsa-with-sha3-512 OBJECT IDENTIFIER ::= { sigAlgs 8 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha3_512[DER_OID_SZ_id_dsa_with_sha3_512] = { - DER_OID_V_id_dsa_with_sha3_512 -}; - diff --git a/deps/openssl/config/archs/linux-ppc/no-asm/providers/common/der/der_ec_gen.c b/deps/openssl/config/archs/linux-ppc/no-asm/providers/common/der/der_ec_gen.c deleted file mode 100644 index e1ed54ba05b6ff..00000000000000 --- a/deps/openssl/config/archs/linux-ppc/no-asm/providers/common/der/der_ec_gen.c +++ /dev/null @@ -1,279 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_ec_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_ec.h" - -/* Well known OIDs precompiled */ - -/* - * ecdsa-with-SHA1 OBJECT IDENTIFIER ::= { id-ecSigType 1 } - */ -const unsigned char ossl_der_oid_ecdsa_with_SHA1[DER_OID_SZ_ecdsa_with_SHA1] = { - DER_OID_V_ecdsa_with_SHA1 -}; - -/* - * id-ecPublicKey OBJECT IDENTIFIER ::= { id-publicKeyType 1 } - */ -const unsigned char ossl_der_oid_id_ecPublicKey[DER_OID_SZ_id_ecPublicKey] = { - DER_OID_V_id_ecPublicKey -}; - -/* - * c2pnb163v1 OBJECT IDENTIFIER ::= { c-TwoCurve 1 } - */ -const unsigned char ossl_der_oid_c2pnb163v1[DER_OID_SZ_c2pnb163v1] = { - DER_OID_V_c2pnb163v1 -}; - -/* - * c2pnb163v2 OBJECT IDENTIFIER ::= { c-TwoCurve 2 } - */ -const unsigned char ossl_der_oid_c2pnb163v2[DER_OID_SZ_c2pnb163v2] = { - DER_OID_V_c2pnb163v2 -}; - -/* - * c2pnb163v3 OBJECT IDENTIFIER ::= { c-TwoCurve 3 } - */ -const unsigned char ossl_der_oid_c2pnb163v3[DER_OID_SZ_c2pnb163v3] = { - DER_OID_V_c2pnb163v3 -}; - -/* - * c2pnb176w1 OBJECT IDENTIFIER ::= { c-TwoCurve 4 } - */ -const unsigned char ossl_der_oid_c2pnb176w1[DER_OID_SZ_c2pnb176w1] = { - DER_OID_V_c2pnb176w1 -}; - -/* - * c2tnb191v1 OBJECT IDENTIFIER ::= { c-TwoCurve 5 } - */ -const unsigned char ossl_der_oid_c2tnb191v1[DER_OID_SZ_c2tnb191v1] = { - DER_OID_V_c2tnb191v1 -}; - -/* - * c2tnb191v2 OBJECT IDENTIFIER ::= { c-TwoCurve 6 } - */ -const unsigned char ossl_der_oid_c2tnb191v2[DER_OID_SZ_c2tnb191v2] = { - DER_OID_V_c2tnb191v2 -}; - -/* - * c2tnb191v3 OBJECT IDENTIFIER ::= { c-TwoCurve 7 } - */ -const unsigned char ossl_der_oid_c2tnb191v3[DER_OID_SZ_c2tnb191v3] = { - DER_OID_V_c2tnb191v3 -}; - -/* - * c2onb191v4 OBJECT IDENTIFIER ::= { c-TwoCurve 8 } - */ -const unsigned char ossl_der_oid_c2onb191v4[DER_OID_SZ_c2onb191v4] = { - DER_OID_V_c2onb191v4 -}; - -/* - * c2onb191v5 OBJECT IDENTIFIER ::= { c-TwoCurve 9 } - */ -const unsigned char ossl_der_oid_c2onb191v5[DER_OID_SZ_c2onb191v5] = { - DER_OID_V_c2onb191v5 -}; - -/* - * c2pnb208w1 OBJECT IDENTIFIER ::= { c-TwoCurve 10 } - */ -const unsigned char ossl_der_oid_c2pnb208w1[DER_OID_SZ_c2pnb208w1] = { - DER_OID_V_c2pnb208w1 -}; - -/* - * c2tnb239v1 OBJECT IDENTIFIER ::= { c-TwoCurve 11 } - */ -const unsigned char ossl_der_oid_c2tnb239v1[DER_OID_SZ_c2tnb239v1] = { - DER_OID_V_c2tnb239v1 -}; - -/* - * c2tnb239v2 OBJECT IDENTIFIER ::= { c-TwoCurve 12 } - */ -const unsigned char ossl_der_oid_c2tnb239v2[DER_OID_SZ_c2tnb239v2] = { - DER_OID_V_c2tnb239v2 -}; - -/* - * c2tnb239v3 OBJECT IDENTIFIER ::= { c-TwoCurve 13 } - */ -const unsigned char ossl_der_oid_c2tnb239v3[DER_OID_SZ_c2tnb239v3] = { - DER_OID_V_c2tnb239v3 -}; - -/* - * c2onb239v4 OBJECT IDENTIFIER ::= { c-TwoCurve 14 } - */ -const unsigned char ossl_der_oid_c2onb239v4[DER_OID_SZ_c2onb239v4] = { - DER_OID_V_c2onb239v4 -}; - -/* - * c2onb239v5 OBJECT IDENTIFIER ::= { c-TwoCurve 15 } - */ -const unsigned char ossl_der_oid_c2onb239v5[DER_OID_SZ_c2onb239v5] = { - DER_OID_V_c2onb239v5 -}; - -/* - * c2pnb272w1 OBJECT IDENTIFIER ::= { c-TwoCurve 16 } - */ -const unsigned char ossl_der_oid_c2pnb272w1[DER_OID_SZ_c2pnb272w1] = { - DER_OID_V_c2pnb272w1 -}; - -/* - * c2pnb304w1 OBJECT IDENTIFIER ::= { c-TwoCurve 17 } - */ -const unsigned char ossl_der_oid_c2pnb304w1[DER_OID_SZ_c2pnb304w1] = { - DER_OID_V_c2pnb304w1 -}; - -/* - * c2tnb359v1 OBJECT IDENTIFIER ::= { c-TwoCurve 18 } - */ -const unsigned char ossl_der_oid_c2tnb359v1[DER_OID_SZ_c2tnb359v1] = { - DER_OID_V_c2tnb359v1 -}; - -/* - * c2pnb368w1 OBJECT IDENTIFIER ::= { c-TwoCurve 19 } - */ -const unsigned char ossl_der_oid_c2pnb368w1[DER_OID_SZ_c2pnb368w1] = { - DER_OID_V_c2pnb368w1 -}; - -/* - * c2tnb431r1 OBJECT IDENTIFIER ::= { c-TwoCurve 20 } - */ -const unsigned char ossl_der_oid_c2tnb431r1[DER_OID_SZ_c2tnb431r1] = { - DER_OID_V_c2tnb431r1 -}; - -/* - * prime192v1 OBJECT IDENTIFIER ::= { primeCurve 1 } - */ -const unsigned char ossl_der_oid_prime192v1[DER_OID_SZ_prime192v1] = { - DER_OID_V_prime192v1 -}; - -/* - * prime192v2 OBJECT IDENTIFIER ::= { primeCurve 2 } - */ -const unsigned char ossl_der_oid_prime192v2[DER_OID_SZ_prime192v2] = { - DER_OID_V_prime192v2 -}; - -/* - * prime192v3 OBJECT IDENTIFIER ::= { primeCurve 3 } - */ -const unsigned char ossl_der_oid_prime192v3[DER_OID_SZ_prime192v3] = { - DER_OID_V_prime192v3 -}; - -/* - * prime239v1 OBJECT IDENTIFIER ::= { primeCurve 4 } - */ -const unsigned char ossl_der_oid_prime239v1[DER_OID_SZ_prime239v1] = { - DER_OID_V_prime239v1 -}; - -/* - * prime239v2 OBJECT IDENTIFIER ::= { primeCurve 5 } - */ -const unsigned char ossl_der_oid_prime239v2[DER_OID_SZ_prime239v2] = { - DER_OID_V_prime239v2 -}; - -/* - * prime239v3 OBJECT IDENTIFIER ::= { primeCurve 6 } - */ -const unsigned char ossl_der_oid_prime239v3[DER_OID_SZ_prime239v3] = { - DER_OID_V_prime239v3 -}; - -/* - * prime256v1 OBJECT IDENTIFIER ::= { primeCurve 7 } - */ -const unsigned char ossl_der_oid_prime256v1[DER_OID_SZ_prime256v1] = { - DER_OID_V_prime256v1 -}; - -/* - * ecdsa-with-SHA224 OBJECT IDENTIFIER ::= { iso(1) member-body(2) - * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 1 } - */ -const unsigned char ossl_der_oid_ecdsa_with_SHA224[DER_OID_SZ_ecdsa_with_SHA224] = { - DER_OID_V_ecdsa_with_SHA224 -}; - -/* - * ecdsa-with-SHA256 OBJECT IDENTIFIER ::= { iso(1) member-body(2) - * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 2 } - */ -const unsigned char ossl_der_oid_ecdsa_with_SHA256[DER_OID_SZ_ecdsa_with_SHA256] = { - DER_OID_V_ecdsa_with_SHA256 -}; - -/* - * ecdsa-with-SHA384 OBJECT IDENTIFIER ::= { iso(1) member-body(2) - * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 3 } - */ -const unsigned char ossl_der_oid_ecdsa_with_SHA384[DER_OID_SZ_ecdsa_with_SHA384] = { - DER_OID_V_ecdsa_with_SHA384 -}; - -/* - * ecdsa-with-SHA512 OBJECT IDENTIFIER ::= { iso(1) member-body(2) - * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 4 } - */ -const unsigned char ossl_der_oid_ecdsa_with_SHA512[DER_OID_SZ_ecdsa_with_SHA512] = { - DER_OID_V_ecdsa_with_SHA512 -}; - -/* - * id-ecdsa-with-sha3-224 OBJECT IDENTIFIER ::= { sigAlgs 9 } - */ -const unsigned char ossl_der_oid_id_ecdsa_with_sha3_224[DER_OID_SZ_id_ecdsa_with_sha3_224] = { - DER_OID_V_id_ecdsa_with_sha3_224 -}; - -/* - * id-ecdsa-with-sha3-256 OBJECT IDENTIFIER ::= { sigAlgs 10 } - */ -const unsigned char ossl_der_oid_id_ecdsa_with_sha3_256[DER_OID_SZ_id_ecdsa_with_sha3_256] = { - DER_OID_V_id_ecdsa_with_sha3_256 -}; - -/* - * id-ecdsa-with-sha3-384 OBJECT IDENTIFIER ::= { sigAlgs 11 } - */ -const unsigned char ossl_der_oid_id_ecdsa_with_sha3_384[DER_OID_SZ_id_ecdsa_with_sha3_384] = { - DER_OID_V_id_ecdsa_with_sha3_384 -}; - -/* - * id-ecdsa-with-sha3-512 OBJECT IDENTIFIER ::= { sigAlgs 12 } - */ -const unsigned char ossl_der_oid_id_ecdsa_with_sha3_512[DER_OID_SZ_id_ecdsa_with_sha3_512] = { - DER_OID_V_id_ecdsa_with_sha3_512 -}; - diff --git a/deps/openssl/config/archs/linux-ppc/no-asm/providers/common/der/der_ecx_gen.c b/deps/openssl/config/archs/linux-ppc/no-asm/providers/common/der/der_ecx_gen.c deleted file mode 100644 index ba7bf14b5e156d..00000000000000 --- a/deps/openssl/config/archs/linux-ppc/no-asm/providers/common/der/der_ecx_gen.c +++ /dev/null @@ -1,44 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_ecx_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_ecx.h" - -/* Well known OIDs precompiled */ - -/* - * id-X25519 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 110 } - */ -const unsigned char ossl_der_oid_id_X25519[DER_OID_SZ_id_X25519] = { - DER_OID_V_id_X25519 -}; - -/* - * id-X448 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 111 } - */ -const unsigned char ossl_der_oid_id_X448[DER_OID_SZ_id_X448] = { - DER_OID_V_id_X448 -}; - -/* - * id-Ed25519 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 112 } - */ -const unsigned char ossl_der_oid_id_Ed25519[DER_OID_SZ_id_Ed25519] = { - DER_OID_V_id_Ed25519 -}; - -/* - * id-Ed448 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 113 } - */ -const unsigned char ossl_der_oid_id_Ed448[DER_OID_SZ_id_Ed448] = { - DER_OID_V_id_Ed448 -}; - diff --git a/deps/openssl/config/archs/linux-ppc/no-asm/providers/common/der/der_rsa_gen.c b/deps/openssl/config/archs/linux-ppc/no-asm/providers/common/der/der_rsa_gen.c deleted file mode 100644 index a3431798402f3f..00000000000000 --- a/deps/openssl/config/archs/linux-ppc/no-asm/providers/common/der/der_rsa_gen.c +++ /dev/null @@ -1,174 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_rsa_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_rsa.h" - -/* Well known OIDs precompiled */ - -/* - * hashAlgs OBJECT IDENTIFIER ::= { nistAlgorithms 2 } - */ -const unsigned char ossl_der_oid_hashAlgs[DER_OID_SZ_hashAlgs] = { - DER_OID_V_hashAlgs -}; - -/* - * rsaEncryption OBJECT IDENTIFIER ::= { pkcs-1 1 } - */ -const unsigned char ossl_der_oid_rsaEncryption[DER_OID_SZ_rsaEncryption] = { - DER_OID_V_rsaEncryption -}; - -/* - * id-RSAES-OAEP OBJECT IDENTIFIER ::= { pkcs-1 7 } - */ -const unsigned char ossl_der_oid_id_RSAES_OAEP[DER_OID_SZ_id_RSAES_OAEP] = { - DER_OID_V_id_RSAES_OAEP -}; - -/* - * id-pSpecified OBJECT IDENTIFIER ::= { pkcs-1 9 } - */ -const unsigned char ossl_der_oid_id_pSpecified[DER_OID_SZ_id_pSpecified] = { - DER_OID_V_id_pSpecified -}; - -/* - * id-RSASSA-PSS OBJECT IDENTIFIER ::= { pkcs-1 10 } - */ -const unsigned char ossl_der_oid_id_RSASSA_PSS[DER_OID_SZ_id_RSASSA_PSS] = { - DER_OID_V_id_RSASSA_PSS -}; - -/* - * md2WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 2 } - */ -const unsigned char ossl_der_oid_md2WithRSAEncryption[DER_OID_SZ_md2WithRSAEncryption] = { - DER_OID_V_md2WithRSAEncryption -}; - -/* - * md5WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 4 } - */ -const unsigned char ossl_der_oid_md5WithRSAEncryption[DER_OID_SZ_md5WithRSAEncryption] = { - DER_OID_V_md5WithRSAEncryption -}; - -/* - * sha1WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 5 } - */ -const unsigned char ossl_der_oid_sha1WithRSAEncryption[DER_OID_SZ_sha1WithRSAEncryption] = { - DER_OID_V_sha1WithRSAEncryption -}; - -/* - * sha224WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 14 } - */ -const unsigned char ossl_der_oid_sha224WithRSAEncryption[DER_OID_SZ_sha224WithRSAEncryption] = { - DER_OID_V_sha224WithRSAEncryption -}; - -/* - * sha256WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 11 } - */ -const unsigned char ossl_der_oid_sha256WithRSAEncryption[DER_OID_SZ_sha256WithRSAEncryption] = { - DER_OID_V_sha256WithRSAEncryption -}; - -/* - * sha384WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 12 } - */ -const unsigned char ossl_der_oid_sha384WithRSAEncryption[DER_OID_SZ_sha384WithRSAEncryption] = { - DER_OID_V_sha384WithRSAEncryption -}; - -/* - * sha512WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 13 } - */ -const unsigned char ossl_der_oid_sha512WithRSAEncryption[DER_OID_SZ_sha512WithRSAEncryption] = { - DER_OID_V_sha512WithRSAEncryption -}; - -/* - * sha512-224WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 15 } - */ -const unsigned char ossl_der_oid_sha512_224WithRSAEncryption[DER_OID_SZ_sha512_224WithRSAEncryption] = { - DER_OID_V_sha512_224WithRSAEncryption -}; - -/* - * sha512-256WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 16 } - */ -const unsigned char ossl_der_oid_sha512_256WithRSAEncryption[DER_OID_SZ_sha512_256WithRSAEncryption] = { - DER_OID_V_sha512_256WithRSAEncryption -}; - -/* - * id-mgf1 OBJECT IDENTIFIER ::= { pkcs-1 8 } - */ -const unsigned char ossl_der_oid_id_mgf1[DER_OID_SZ_id_mgf1] = { - DER_OID_V_id_mgf1 -}; - -/* - * id-rsassa-pkcs1-v1_5-with-sha3-224 OBJECT IDENTIFIER ::= { sigAlgs 13 } - */ -const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_224[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_224] = { - DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_224 -}; - -/* - * id-rsassa-pkcs1-v1_5-with-sha3-256 OBJECT IDENTIFIER ::= { sigAlgs 14 } - */ -const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_256[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_256] = { - DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_256 -}; - -/* - * id-rsassa-pkcs1-v1_5-with-sha3-384 OBJECT IDENTIFIER ::= { sigAlgs 15 } - */ -const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_384[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_384] = { - DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_384 -}; - -/* - * id-rsassa-pkcs1-v1_5-with-sha3-512 OBJECT IDENTIFIER ::= { sigAlgs 16 } - */ -const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_512[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_512] = { - DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_512 -}; - -/* - * md4WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 3 } - */ -const unsigned char ossl_der_oid_md4WithRSAEncryption[DER_OID_SZ_md4WithRSAEncryption] = { - DER_OID_V_md4WithRSAEncryption -}; - -/* - * ripemd160WithRSAEncryption OBJECT IDENTIFIER ::= { - * iso(1) identified-organization(3) teletrust(36) algorithm(3) signatureAlgorithm(3) rsaSignature(1) 2 - * } - */ -const unsigned char ossl_der_oid_ripemd160WithRSAEncryption[DER_OID_SZ_ripemd160WithRSAEncryption] = { - DER_OID_V_ripemd160WithRSAEncryption -}; - -/* - * mdc2WithRSASignature OBJECT IDENTIFIER ::= { - * iso(1) identified-organization(3) oiw(14) secsig(3) algorithms(2) mdc2WithRSASignature(14) - * } - */ -const unsigned char ossl_der_oid_mdc2WithRSASignature[DER_OID_SZ_mdc2WithRSASignature] = { - DER_OID_V_mdc2WithRSASignature -}; - diff --git a/deps/openssl/config/archs/linux-ppc/no-asm/providers/common/der/der_sm2_gen.c b/deps/openssl/config/archs/linux-ppc/no-asm/providers/common/der/der_sm2_gen.c deleted file mode 100644 index 6424ea166b7e15..00000000000000 --- a/deps/openssl/config/archs/linux-ppc/no-asm/providers/common/der/der_sm2_gen.c +++ /dev/null @@ -1,30 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_sm2_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_sm2.h" - -/* Well known OIDs precompiled */ - -/* - * sm2-with-SM3 OBJECT IDENTIFIER ::= { sm-scheme 501 } - */ -const unsigned char ossl_der_oid_sm2_with_SM3[DER_OID_SZ_sm2_with_SM3] = { - DER_OID_V_sm2_with_SM3 -}; - -/* - * curveSM2 OBJECT IDENTIFIER ::= { sm-scheme 301 } - */ -const unsigned char ossl_der_oid_curveSM2[DER_OID_SZ_curveSM2] = { - DER_OID_V_curveSM2 -}; - diff --git a/deps/openssl/config/archs/linux-ppc/no-asm/providers/common/der/der_wrap_gen.c b/deps/openssl/config/archs/linux-ppc/no-asm/providers/common/der/der_wrap_gen.c deleted file mode 100644 index 6cf93972f48b6d..00000000000000 --- a/deps/openssl/config/archs/linux-ppc/no-asm/providers/common/der/der_wrap_gen.c +++ /dev/null @@ -1,46 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_wrap_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_wrap.h" - -/* Well known OIDs precompiled */ - -/* - * id-alg-CMS3DESwrap OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs-9(9) smime(16) alg(3) 6 - * } - */ -const unsigned char ossl_der_oid_id_alg_CMS3DESwrap[DER_OID_SZ_id_alg_CMS3DESwrap] = { - DER_OID_V_id_alg_CMS3DESwrap -}; - -/* - * id-aes128-wrap OBJECT IDENTIFIER ::= { aes 5 } - */ -const unsigned char ossl_der_oid_id_aes128_wrap[DER_OID_SZ_id_aes128_wrap] = { - DER_OID_V_id_aes128_wrap -}; - -/* - * id-aes192-wrap OBJECT IDENTIFIER ::= { aes 25 } - */ -const unsigned char ossl_der_oid_id_aes192_wrap[DER_OID_SZ_id_aes192_wrap] = { - DER_OID_V_id_aes192_wrap -}; - -/* - * id-aes256-wrap OBJECT IDENTIFIER ::= { aes 45 } - */ -const unsigned char ossl_der_oid_id_aes256_wrap[DER_OID_SZ_id_aes256_wrap] = { - DER_OID_V_id_aes256_wrap -}; - diff --git a/deps/openssl/config/archs/linux-ppc/no-asm/providers/fips.ld b/deps/openssl/config/archs/linux-ppc/no-asm/providers/fips.ld deleted file mode 100644 index 1debaaa7ff652d..00000000000000 --- a/deps/openssl/config/archs/linux-ppc/no-asm/providers/fips.ld +++ /dev/null @@ -1,5 +0,0 @@ -{ - global: - OSSL_provider_init; - local: *; -}; diff --git a/deps/openssl/config/archs/linux-ppc/no-asm/providers/legacy.ld b/deps/openssl/config/archs/linux-ppc/no-asm/providers/legacy.ld deleted file mode 100644 index 1debaaa7ff652d..00000000000000 --- a/deps/openssl/config/archs/linux-ppc/no-asm/providers/legacy.ld +++ /dev/null @@ -1,5 +0,0 @@ -{ - global: - OSSL_provider_init; - local: *; -}; diff --git a/deps/openssl/config/archs/linux-ppc64/asm/apps/progs.c b/deps/openssl/config/archs/linux-ppc64/asm/apps/progs.c deleted file mode 100644 index f594c302c42ec6..00000000000000 --- a/deps/openssl/config/archs/linux-ppc64/asm/apps/progs.c +++ /dev/null @@ -1,397 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by apps/progs.pl - * - * Copyright 1995-2022 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "progs.h" - -FUNCTION functions[] = { - {FT_general, "asn1parse", asn1parse_main, asn1parse_options, NULL, NULL}, - {FT_general, "ca", ca_main, ca_options, NULL, NULL}, -#ifndef OPENSSL_NO_SOCK - {FT_general, "ciphers", ciphers_main, ciphers_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_CMP - {FT_general, "cmp", cmp_main, cmp_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_CMS - {FT_general, "cms", cms_main, cms_options, NULL, NULL}, -#endif - {FT_general, "crl", crl_main, crl_options, NULL, NULL}, - {FT_general, "crl2pkcs7", crl2pkcs7_main, crl2pkcs7_options, NULL, NULL}, - {FT_general, "dgst", dgst_main, dgst_options, NULL, NULL}, -#ifndef OPENSSL_NO_DH - {FT_general, "dhparam", dhparam_main, dhparam_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_DSA - {FT_general, "dsa", dsa_main, dsa_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_DSA - {FT_general, "dsaparam", dsaparam_main, dsaparam_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_EC - {FT_general, "ec", ec_main, ec_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_EC - {FT_general, "ecparam", ecparam_main, ecparam_options, NULL, NULL}, -#endif - {FT_general, "enc", enc_main, enc_options, NULL, NULL}, -#ifndef OPENSSL_NO_ENGINE - {FT_general, "engine", engine_main, engine_options, NULL, NULL}, -#endif - {FT_general, "errstr", errstr_main, errstr_options, NULL, NULL}, - {FT_general, "fipsinstall", fipsinstall_main, fipsinstall_options, NULL, NULL}, -#ifndef OPENSSL_NO_DSA - {FT_general, "gendsa", gendsa_main, gendsa_options, NULL, NULL}, -#endif - {FT_general, "genpkey", genpkey_main, genpkey_options, NULL, NULL}, -#ifndef OPENSSL_NO_RSA - {FT_general, "genrsa", genrsa_main, genrsa_options, NULL, NULL}, -#endif - {FT_general, "help", help_main, help_options, NULL, NULL}, - {FT_general, "info", info_main, info_options, NULL, NULL}, - {FT_general, "kdf", kdf_main, kdf_options, NULL, NULL}, - {FT_general, "list", list_main, list_options, NULL, NULL}, - {FT_general, "mac", mac_main, mac_options, NULL, NULL}, - {FT_general, "nseq", nseq_main, nseq_options, NULL, NULL}, -#ifndef OPENSSL_NO_OCSP - {FT_general, "ocsp", ocsp_main, ocsp_options, NULL, NULL}, -#endif - {FT_general, "passwd", passwd_main, passwd_options, NULL, NULL}, - {FT_general, "pkcs12", pkcs12_main, pkcs12_options, NULL, NULL}, - {FT_general, "pkcs7", pkcs7_main, pkcs7_options, NULL, NULL}, - {FT_general, "pkcs8", pkcs8_main, pkcs8_options, NULL, NULL}, - {FT_general, "pkey", pkey_main, pkey_options, NULL, NULL}, - {FT_general, "pkeyparam", pkeyparam_main, pkeyparam_options, NULL, NULL}, - {FT_general, "pkeyutl", pkeyutl_main, pkeyutl_options, NULL, NULL}, - {FT_general, "prime", prime_main, prime_options, NULL, NULL}, - {FT_general, "rand", rand_main, rand_options, NULL, NULL}, - {FT_general, "rehash", rehash_main, rehash_options, NULL, NULL}, - {FT_general, "req", req_main, req_options, NULL, NULL}, - {FT_general, "rsa", rsa_main, rsa_options, NULL, NULL}, -#if !defined(OPENSSL_NO_DEPRECATED_3_0) && !defined(OPENSSL_NO_RSA) - {FT_general, "rsautl", rsautl_main, rsautl_options, "pkeyutl", "3.0"}, -#endif -#ifndef OPENSSL_NO_SOCK - {FT_general, "s_client", s_client_main, s_client_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_SOCK - {FT_general, "s_server", s_server_main, s_server_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_SOCK - {FT_general, "s_time", s_time_main, s_time_options, NULL, NULL}, -#endif - {FT_general, "sess_id", sess_id_main, sess_id_options, NULL, NULL}, - {FT_general, "smime", smime_main, smime_options, NULL, NULL}, - {FT_general, "speed", speed_main, speed_options, NULL, NULL}, - {FT_general, "spkac", spkac_main, spkac_options, NULL, NULL}, -#ifndef OPENSSL_NO_SRP - {FT_general, "srp", srp_main, srp_options, NULL, NULL}, -#endif - {FT_general, "storeutl", storeutl_main, storeutl_options, NULL, NULL}, -#ifndef OPENSSL_NO_TS - {FT_general, "ts", ts_main, ts_options, NULL, NULL}, -#endif - {FT_general, "verify", verify_main, verify_options, NULL, NULL}, - {FT_general, "version", version_main, version_options, NULL, NULL}, - {FT_general, "x509", x509_main, x509_options, NULL, NULL}, -#ifndef OPENSSL_NO_MD2 - {FT_md, "md2", dgst_main, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_MD4 - {FT_md, "md4", dgst_main, NULL, NULL}, -#endif - {FT_md, "md5", dgst_main, NULL, NULL}, - {FT_md, "sha1", dgst_main, NULL, NULL}, - {FT_md, "sha224", dgst_main, NULL, NULL}, - {FT_md, "sha256", dgst_main, NULL, NULL}, - {FT_md, "sha384", dgst_main, NULL, NULL}, - {FT_md, "sha512", dgst_main, NULL, NULL}, - {FT_md, "sha512-224", dgst_main, NULL, NULL}, - {FT_md, "sha512-256", dgst_main, NULL, NULL}, - {FT_md, "sha3-224", dgst_main, NULL, NULL}, - {FT_md, "sha3-256", dgst_main, NULL, NULL}, - {FT_md, "sha3-384", dgst_main, NULL, NULL}, - {FT_md, "sha3-512", dgst_main, NULL, NULL}, - {FT_md, "shake128", dgst_main, NULL, NULL}, - {FT_md, "shake256", dgst_main, NULL, NULL}, -#ifndef OPENSSL_NO_MDC2 - {FT_md, "mdc2", dgst_main, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_RMD160 - {FT_md, "rmd160", dgst_main, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_BLAKE2 - {FT_md, "blake2b512", dgst_main, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_BLAKE2 - {FT_md, "blake2s256", dgst_main, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_SM3 - {FT_md, "sm3", dgst_main, NULL, NULL}, -#endif - {FT_cipher, "aes-128-cbc", enc_main, enc_options, NULL}, - {FT_cipher, "aes-128-ecb", enc_main, enc_options, NULL}, - {FT_cipher, "aes-192-cbc", enc_main, enc_options, NULL}, - {FT_cipher, "aes-192-ecb", enc_main, enc_options, NULL}, - {FT_cipher, "aes-256-cbc", enc_main, enc_options, NULL}, - {FT_cipher, "aes-256-ecb", enc_main, enc_options, NULL}, -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-ctr", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-cfb1", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-cfb8", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-ctr", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-cfb1", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-cfb8", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-ctr", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-cfb1", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-cfb8", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-128-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-128-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-192-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-192-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-256-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-256-ecb", enc_main, enc_options, NULL}, -#endif - {FT_cipher, "base64", enc_main, enc_options, NULL}, -#ifdef ZLIB - {FT_cipher, "zlib", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des3", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "desx", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC4 - {FT_cipher, "rc4", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC4 - {FT_cipher, "rc4-40", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede3", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede3-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede3-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede3-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-64-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-40-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast5-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast5-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast5-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast5-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-ctr", enc_main, enc_options, NULL}, -#endif - {0, NULL, NULL, NULL, NULL} -}; diff --git a/deps/openssl/config/archs/linux-ppc64/asm/providers/common/der/der_digests_gen.c b/deps/openssl/config/archs/linux-ppc64/asm/providers/common/der/der_digests_gen.c deleted file mode 100644 index e4e14e82e5648a..00000000000000 --- a/deps/openssl/config/archs/linux-ppc64/asm/providers/common/der/der_digests_gen.c +++ /dev/null @@ -1,160 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_digests_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_digests.h" - -/* Well known OIDs precompiled */ - -/* - * sigAlgs OBJECT IDENTIFIER ::= { nistAlgorithms 3 } - */ -const unsigned char ossl_der_oid_sigAlgs[DER_OID_SZ_sigAlgs] = { - DER_OID_V_sigAlgs -}; - -/* - * id-sha1 OBJECT IDENTIFIER ::= { iso(1) - * identified-organization(3) oiw(14) - * secsig(3) algorithms(2) 26 } - */ -const unsigned char ossl_der_oid_id_sha1[DER_OID_SZ_id_sha1] = { - DER_OID_V_id_sha1 -}; - -/* - * id-md2 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 2 } - */ -const unsigned char ossl_der_oid_id_md2[DER_OID_SZ_id_md2] = { - DER_OID_V_id_md2 -}; - -/* - * id-md5 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 5 } - */ -const unsigned char ossl_der_oid_id_md5[DER_OID_SZ_id_md5] = { - DER_OID_V_id_md5 -}; - -/* - * id-sha256 OBJECT IDENTIFIER ::= { hashAlgs 1 } - */ -const unsigned char ossl_der_oid_id_sha256[DER_OID_SZ_id_sha256] = { - DER_OID_V_id_sha256 -}; - -/* - * id-sha384 OBJECT IDENTIFIER ::= { hashAlgs 2 } - */ -const unsigned char ossl_der_oid_id_sha384[DER_OID_SZ_id_sha384] = { - DER_OID_V_id_sha384 -}; - -/* - * id-sha512 OBJECT IDENTIFIER ::= { hashAlgs 3 } - */ -const unsigned char ossl_der_oid_id_sha512[DER_OID_SZ_id_sha512] = { - DER_OID_V_id_sha512 -}; - -/* - * id-sha224 OBJECT IDENTIFIER ::= { hashAlgs 4 } - */ -const unsigned char ossl_der_oid_id_sha224[DER_OID_SZ_id_sha224] = { - DER_OID_V_id_sha224 -}; - -/* - * id-sha512-224 OBJECT IDENTIFIER ::= { hashAlgs 5 } - */ -const unsigned char ossl_der_oid_id_sha512_224[DER_OID_SZ_id_sha512_224] = { - DER_OID_V_id_sha512_224 -}; - -/* - * id-sha512-256 OBJECT IDENTIFIER ::= { hashAlgs 6 } - */ -const unsigned char ossl_der_oid_id_sha512_256[DER_OID_SZ_id_sha512_256] = { - DER_OID_V_id_sha512_256 -}; - -/* - * id-sha3-224 OBJECT IDENTIFIER ::= { hashAlgs 7 } - */ -const unsigned char ossl_der_oid_id_sha3_224[DER_OID_SZ_id_sha3_224] = { - DER_OID_V_id_sha3_224 -}; - -/* - * id-sha3-256 OBJECT IDENTIFIER ::= { hashAlgs 8 } - */ -const unsigned char ossl_der_oid_id_sha3_256[DER_OID_SZ_id_sha3_256] = { - DER_OID_V_id_sha3_256 -}; - -/* - * id-sha3-384 OBJECT IDENTIFIER ::= { hashAlgs 9 } - */ -const unsigned char ossl_der_oid_id_sha3_384[DER_OID_SZ_id_sha3_384] = { - DER_OID_V_id_sha3_384 -}; - -/* - * id-sha3-512 OBJECT IDENTIFIER ::= { hashAlgs 10 } - */ -const unsigned char ossl_der_oid_id_sha3_512[DER_OID_SZ_id_sha3_512] = { - DER_OID_V_id_sha3_512 -}; - -/* - * id-shake128 OBJECT IDENTIFIER ::= { hashAlgs 11 } - */ -const unsigned char ossl_der_oid_id_shake128[DER_OID_SZ_id_shake128] = { - DER_OID_V_id_shake128 -}; - -/* - * id-shake256 OBJECT IDENTIFIER ::= { hashAlgs 12 } - */ -const unsigned char ossl_der_oid_id_shake256[DER_OID_SZ_id_shake256] = { - DER_OID_V_id_shake256 -}; - -/* - * id-shake128-len OBJECT IDENTIFIER ::= { hashAlgs 17 } - */ -const unsigned char ossl_der_oid_id_shake128_len[DER_OID_SZ_id_shake128_len] = { - DER_OID_V_id_shake128_len -}; - -/* - * id-shake256-len OBJECT IDENTIFIER ::= { hashAlgs 18 } - */ -const unsigned char ossl_der_oid_id_shake256_len[DER_OID_SZ_id_shake256_len] = { - DER_OID_V_id_shake256_len -}; - -/* - * id-KMACWithSHAKE128 OBJECT IDENTIFIER ::={hashAlgs 19} - */ -const unsigned char ossl_der_oid_id_KMACWithSHAKE128[DER_OID_SZ_id_KMACWithSHAKE128] = { - DER_OID_V_id_KMACWithSHAKE128 -}; - -/* - * id-KMACWithSHAKE256 OBJECT IDENTIFIER ::={ hashAlgs 20} - */ -const unsigned char ossl_der_oid_id_KMACWithSHAKE256[DER_OID_SZ_id_KMACWithSHAKE256] = { - DER_OID_V_id_KMACWithSHAKE256 -}; - diff --git a/deps/openssl/config/archs/linux-ppc64/asm/providers/common/der/der_dsa_gen.c b/deps/openssl/config/archs/linux-ppc64/asm/providers/common/der/der_dsa_gen.c deleted file mode 100644 index e5cfe91e0f2510..00000000000000 --- a/deps/openssl/config/archs/linux-ppc64/asm/providers/common/der/der_dsa_gen.c +++ /dev/null @@ -1,94 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_dsa_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -/* - * DSA low level APIs are deprecated for public use, but still ok for - * internal use. - */ -#include "internal/deprecated.h" - -#include "prov/der_dsa.h" - -/* Well known OIDs precompiled */ - -/* - * id-dsa OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) x9-57(10040) x9algorithm(4) 1 } - */ -const unsigned char ossl_der_oid_id_dsa[DER_OID_SZ_id_dsa] = { - DER_OID_V_id_dsa -}; - -/* - * id-dsa-with-sha1 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) x9-57 (10040) x9algorithm(4) 3 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha1[DER_OID_SZ_id_dsa_with_sha1] = { - DER_OID_V_id_dsa_with_sha1 -}; - -/* - * id-dsa-with-sha224 OBJECT IDENTIFIER ::= { sigAlgs 1 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha224[DER_OID_SZ_id_dsa_with_sha224] = { - DER_OID_V_id_dsa_with_sha224 -}; - -/* - * id-dsa-with-sha256 OBJECT IDENTIFIER ::= { sigAlgs 2 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha256[DER_OID_SZ_id_dsa_with_sha256] = { - DER_OID_V_id_dsa_with_sha256 -}; - -/* - * id-dsa-with-sha384 OBJECT IDENTIFIER ::= { sigAlgs 3 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha384[DER_OID_SZ_id_dsa_with_sha384] = { - DER_OID_V_id_dsa_with_sha384 -}; - -/* - * id-dsa-with-sha512 OBJECT IDENTIFIER ::= { sigAlgs 4 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha512[DER_OID_SZ_id_dsa_with_sha512] = { - DER_OID_V_id_dsa_with_sha512 -}; - -/* - * id-dsa-with-sha3-224 OBJECT IDENTIFIER ::= { sigAlgs 5 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha3_224[DER_OID_SZ_id_dsa_with_sha3_224] = { - DER_OID_V_id_dsa_with_sha3_224 -}; - -/* - * id-dsa-with-sha3-256 OBJECT IDENTIFIER ::= { sigAlgs 6 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha3_256[DER_OID_SZ_id_dsa_with_sha3_256] = { - DER_OID_V_id_dsa_with_sha3_256 -}; - -/* - * id-dsa-with-sha3-384 OBJECT IDENTIFIER ::= { sigAlgs 7 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha3_384[DER_OID_SZ_id_dsa_with_sha3_384] = { - DER_OID_V_id_dsa_with_sha3_384 -}; - -/* - * id-dsa-with-sha3-512 OBJECT IDENTIFIER ::= { sigAlgs 8 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha3_512[DER_OID_SZ_id_dsa_with_sha3_512] = { - DER_OID_V_id_dsa_with_sha3_512 -}; - diff --git a/deps/openssl/config/archs/linux-ppc64/asm/providers/common/der/der_ec_gen.c b/deps/openssl/config/archs/linux-ppc64/asm/providers/common/der/der_ec_gen.c deleted file mode 100644 index e1ed54ba05b6ff..00000000000000 --- a/deps/openssl/config/archs/linux-ppc64/asm/providers/common/der/der_ec_gen.c +++ /dev/null @@ -1,279 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_ec_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_ec.h" - -/* Well known OIDs precompiled */ - -/* - * ecdsa-with-SHA1 OBJECT IDENTIFIER ::= { id-ecSigType 1 } - */ -const unsigned char ossl_der_oid_ecdsa_with_SHA1[DER_OID_SZ_ecdsa_with_SHA1] = { - DER_OID_V_ecdsa_with_SHA1 -}; - -/* - * id-ecPublicKey OBJECT IDENTIFIER ::= { id-publicKeyType 1 } - */ -const unsigned char ossl_der_oid_id_ecPublicKey[DER_OID_SZ_id_ecPublicKey] = { - DER_OID_V_id_ecPublicKey -}; - -/* - * c2pnb163v1 OBJECT IDENTIFIER ::= { c-TwoCurve 1 } - */ -const unsigned char ossl_der_oid_c2pnb163v1[DER_OID_SZ_c2pnb163v1] = { - DER_OID_V_c2pnb163v1 -}; - -/* - * c2pnb163v2 OBJECT IDENTIFIER ::= { c-TwoCurve 2 } - */ -const unsigned char ossl_der_oid_c2pnb163v2[DER_OID_SZ_c2pnb163v2] = { - DER_OID_V_c2pnb163v2 -}; - -/* - * c2pnb163v3 OBJECT IDENTIFIER ::= { c-TwoCurve 3 } - */ -const unsigned char ossl_der_oid_c2pnb163v3[DER_OID_SZ_c2pnb163v3] = { - DER_OID_V_c2pnb163v3 -}; - -/* - * c2pnb176w1 OBJECT IDENTIFIER ::= { c-TwoCurve 4 } - */ -const unsigned char ossl_der_oid_c2pnb176w1[DER_OID_SZ_c2pnb176w1] = { - DER_OID_V_c2pnb176w1 -}; - -/* - * c2tnb191v1 OBJECT IDENTIFIER ::= { c-TwoCurve 5 } - */ -const unsigned char ossl_der_oid_c2tnb191v1[DER_OID_SZ_c2tnb191v1] = { - DER_OID_V_c2tnb191v1 -}; - -/* - * c2tnb191v2 OBJECT IDENTIFIER ::= { c-TwoCurve 6 } - */ -const unsigned char ossl_der_oid_c2tnb191v2[DER_OID_SZ_c2tnb191v2] = { - DER_OID_V_c2tnb191v2 -}; - -/* - * c2tnb191v3 OBJECT IDENTIFIER ::= { c-TwoCurve 7 } - */ -const unsigned char ossl_der_oid_c2tnb191v3[DER_OID_SZ_c2tnb191v3] = { - DER_OID_V_c2tnb191v3 -}; - -/* - * c2onb191v4 OBJECT IDENTIFIER ::= { c-TwoCurve 8 } - */ -const unsigned char ossl_der_oid_c2onb191v4[DER_OID_SZ_c2onb191v4] = { - DER_OID_V_c2onb191v4 -}; - -/* - * c2onb191v5 OBJECT IDENTIFIER ::= { c-TwoCurve 9 } - */ -const unsigned char ossl_der_oid_c2onb191v5[DER_OID_SZ_c2onb191v5] = { - DER_OID_V_c2onb191v5 -}; - -/* - * c2pnb208w1 OBJECT IDENTIFIER ::= { c-TwoCurve 10 } - */ -const unsigned char ossl_der_oid_c2pnb208w1[DER_OID_SZ_c2pnb208w1] = { - DER_OID_V_c2pnb208w1 -}; - -/* - * c2tnb239v1 OBJECT IDENTIFIER ::= { c-TwoCurve 11 } - */ -const unsigned char ossl_der_oid_c2tnb239v1[DER_OID_SZ_c2tnb239v1] = { - DER_OID_V_c2tnb239v1 -}; - -/* - * c2tnb239v2 OBJECT IDENTIFIER ::= { c-TwoCurve 12 } - */ -const unsigned char ossl_der_oid_c2tnb239v2[DER_OID_SZ_c2tnb239v2] = { - DER_OID_V_c2tnb239v2 -}; - -/* - * c2tnb239v3 OBJECT IDENTIFIER ::= { c-TwoCurve 13 } - */ -const unsigned char ossl_der_oid_c2tnb239v3[DER_OID_SZ_c2tnb239v3] = { - DER_OID_V_c2tnb239v3 -}; - -/* - * c2onb239v4 OBJECT IDENTIFIER ::= { c-TwoCurve 14 } - */ -const unsigned char ossl_der_oid_c2onb239v4[DER_OID_SZ_c2onb239v4] = { - DER_OID_V_c2onb239v4 -}; - -/* - * c2onb239v5 OBJECT IDENTIFIER ::= { c-TwoCurve 15 } - */ -const unsigned char ossl_der_oid_c2onb239v5[DER_OID_SZ_c2onb239v5] = { - DER_OID_V_c2onb239v5 -}; - -/* - * c2pnb272w1 OBJECT IDENTIFIER ::= { c-TwoCurve 16 } - */ -const unsigned char ossl_der_oid_c2pnb272w1[DER_OID_SZ_c2pnb272w1] = { - DER_OID_V_c2pnb272w1 -}; - -/* - * c2pnb304w1 OBJECT IDENTIFIER ::= { c-TwoCurve 17 } - */ -const unsigned char ossl_der_oid_c2pnb304w1[DER_OID_SZ_c2pnb304w1] = { - DER_OID_V_c2pnb304w1 -}; - -/* - * c2tnb359v1 OBJECT IDENTIFIER ::= { c-TwoCurve 18 } - */ -const unsigned char ossl_der_oid_c2tnb359v1[DER_OID_SZ_c2tnb359v1] = { - DER_OID_V_c2tnb359v1 -}; - -/* - * c2pnb368w1 OBJECT IDENTIFIER ::= { c-TwoCurve 19 } - */ -const unsigned char ossl_der_oid_c2pnb368w1[DER_OID_SZ_c2pnb368w1] = { - DER_OID_V_c2pnb368w1 -}; - -/* - * c2tnb431r1 OBJECT IDENTIFIER ::= { c-TwoCurve 20 } - */ -const unsigned char ossl_der_oid_c2tnb431r1[DER_OID_SZ_c2tnb431r1] = { - DER_OID_V_c2tnb431r1 -}; - -/* - * prime192v1 OBJECT IDENTIFIER ::= { primeCurve 1 } - */ -const unsigned char ossl_der_oid_prime192v1[DER_OID_SZ_prime192v1] = { - DER_OID_V_prime192v1 -}; - -/* - * prime192v2 OBJECT IDENTIFIER ::= { primeCurve 2 } - */ -const unsigned char ossl_der_oid_prime192v2[DER_OID_SZ_prime192v2] = { - DER_OID_V_prime192v2 -}; - -/* - * prime192v3 OBJECT IDENTIFIER ::= { primeCurve 3 } - */ -const unsigned char ossl_der_oid_prime192v3[DER_OID_SZ_prime192v3] = { - DER_OID_V_prime192v3 -}; - -/* - * prime239v1 OBJECT IDENTIFIER ::= { primeCurve 4 } - */ -const unsigned char ossl_der_oid_prime239v1[DER_OID_SZ_prime239v1] = { - DER_OID_V_prime239v1 -}; - -/* - * prime239v2 OBJECT IDENTIFIER ::= { primeCurve 5 } - */ -const unsigned char ossl_der_oid_prime239v2[DER_OID_SZ_prime239v2] = { - DER_OID_V_prime239v2 -}; - -/* - * prime239v3 OBJECT IDENTIFIER ::= { primeCurve 6 } - */ -const unsigned char ossl_der_oid_prime239v3[DER_OID_SZ_prime239v3] = { - DER_OID_V_prime239v3 -}; - -/* - * prime256v1 OBJECT IDENTIFIER ::= { primeCurve 7 } - */ -const unsigned char ossl_der_oid_prime256v1[DER_OID_SZ_prime256v1] = { - DER_OID_V_prime256v1 -}; - -/* - * ecdsa-with-SHA224 OBJECT IDENTIFIER ::= { iso(1) member-body(2) - * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 1 } - */ -const unsigned char ossl_der_oid_ecdsa_with_SHA224[DER_OID_SZ_ecdsa_with_SHA224] = { - DER_OID_V_ecdsa_with_SHA224 -}; - -/* - * ecdsa-with-SHA256 OBJECT IDENTIFIER ::= { iso(1) member-body(2) - * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 2 } - */ -const unsigned char ossl_der_oid_ecdsa_with_SHA256[DER_OID_SZ_ecdsa_with_SHA256] = { - DER_OID_V_ecdsa_with_SHA256 -}; - -/* - * ecdsa-with-SHA384 OBJECT IDENTIFIER ::= { iso(1) member-body(2) - * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 3 } - */ -const unsigned char ossl_der_oid_ecdsa_with_SHA384[DER_OID_SZ_ecdsa_with_SHA384] = { - DER_OID_V_ecdsa_with_SHA384 -}; - -/* - * ecdsa-with-SHA512 OBJECT IDENTIFIER ::= { iso(1) member-body(2) - * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 4 } - */ -const unsigned char ossl_der_oid_ecdsa_with_SHA512[DER_OID_SZ_ecdsa_with_SHA512] = { - DER_OID_V_ecdsa_with_SHA512 -}; - -/* - * id-ecdsa-with-sha3-224 OBJECT IDENTIFIER ::= { sigAlgs 9 } - */ -const unsigned char ossl_der_oid_id_ecdsa_with_sha3_224[DER_OID_SZ_id_ecdsa_with_sha3_224] = { - DER_OID_V_id_ecdsa_with_sha3_224 -}; - -/* - * id-ecdsa-with-sha3-256 OBJECT IDENTIFIER ::= { sigAlgs 10 } - */ -const unsigned char ossl_der_oid_id_ecdsa_with_sha3_256[DER_OID_SZ_id_ecdsa_with_sha3_256] = { - DER_OID_V_id_ecdsa_with_sha3_256 -}; - -/* - * id-ecdsa-with-sha3-384 OBJECT IDENTIFIER ::= { sigAlgs 11 } - */ -const unsigned char ossl_der_oid_id_ecdsa_with_sha3_384[DER_OID_SZ_id_ecdsa_with_sha3_384] = { - DER_OID_V_id_ecdsa_with_sha3_384 -}; - -/* - * id-ecdsa-with-sha3-512 OBJECT IDENTIFIER ::= { sigAlgs 12 } - */ -const unsigned char ossl_der_oid_id_ecdsa_with_sha3_512[DER_OID_SZ_id_ecdsa_with_sha3_512] = { - DER_OID_V_id_ecdsa_with_sha3_512 -}; - diff --git a/deps/openssl/config/archs/linux-ppc64/asm/providers/common/der/der_ecx_gen.c b/deps/openssl/config/archs/linux-ppc64/asm/providers/common/der/der_ecx_gen.c deleted file mode 100644 index ba7bf14b5e156d..00000000000000 --- a/deps/openssl/config/archs/linux-ppc64/asm/providers/common/der/der_ecx_gen.c +++ /dev/null @@ -1,44 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_ecx_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_ecx.h" - -/* Well known OIDs precompiled */ - -/* - * id-X25519 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 110 } - */ -const unsigned char ossl_der_oid_id_X25519[DER_OID_SZ_id_X25519] = { - DER_OID_V_id_X25519 -}; - -/* - * id-X448 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 111 } - */ -const unsigned char ossl_der_oid_id_X448[DER_OID_SZ_id_X448] = { - DER_OID_V_id_X448 -}; - -/* - * id-Ed25519 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 112 } - */ -const unsigned char ossl_der_oid_id_Ed25519[DER_OID_SZ_id_Ed25519] = { - DER_OID_V_id_Ed25519 -}; - -/* - * id-Ed448 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 113 } - */ -const unsigned char ossl_der_oid_id_Ed448[DER_OID_SZ_id_Ed448] = { - DER_OID_V_id_Ed448 -}; - diff --git a/deps/openssl/config/archs/linux-ppc64/asm/providers/common/der/der_rsa_gen.c b/deps/openssl/config/archs/linux-ppc64/asm/providers/common/der/der_rsa_gen.c deleted file mode 100644 index a3431798402f3f..00000000000000 --- a/deps/openssl/config/archs/linux-ppc64/asm/providers/common/der/der_rsa_gen.c +++ /dev/null @@ -1,174 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_rsa_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_rsa.h" - -/* Well known OIDs precompiled */ - -/* - * hashAlgs OBJECT IDENTIFIER ::= { nistAlgorithms 2 } - */ -const unsigned char ossl_der_oid_hashAlgs[DER_OID_SZ_hashAlgs] = { - DER_OID_V_hashAlgs -}; - -/* - * rsaEncryption OBJECT IDENTIFIER ::= { pkcs-1 1 } - */ -const unsigned char ossl_der_oid_rsaEncryption[DER_OID_SZ_rsaEncryption] = { - DER_OID_V_rsaEncryption -}; - -/* - * id-RSAES-OAEP OBJECT IDENTIFIER ::= { pkcs-1 7 } - */ -const unsigned char ossl_der_oid_id_RSAES_OAEP[DER_OID_SZ_id_RSAES_OAEP] = { - DER_OID_V_id_RSAES_OAEP -}; - -/* - * id-pSpecified OBJECT IDENTIFIER ::= { pkcs-1 9 } - */ -const unsigned char ossl_der_oid_id_pSpecified[DER_OID_SZ_id_pSpecified] = { - DER_OID_V_id_pSpecified -}; - -/* - * id-RSASSA-PSS OBJECT IDENTIFIER ::= { pkcs-1 10 } - */ -const unsigned char ossl_der_oid_id_RSASSA_PSS[DER_OID_SZ_id_RSASSA_PSS] = { - DER_OID_V_id_RSASSA_PSS -}; - -/* - * md2WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 2 } - */ -const unsigned char ossl_der_oid_md2WithRSAEncryption[DER_OID_SZ_md2WithRSAEncryption] = { - DER_OID_V_md2WithRSAEncryption -}; - -/* - * md5WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 4 } - */ -const unsigned char ossl_der_oid_md5WithRSAEncryption[DER_OID_SZ_md5WithRSAEncryption] = { - DER_OID_V_md5WithRSAEncryption -}; - -/* - * sha1WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 5 } - */ -const unsigned char ossl_der_oid_sha1WithRSAEncryption[DER_OID_SZ_sha1WithRSAEncryption] = { - DER_OID_V_sha1WithRSAEncryption -}; - -/* - * sha224WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 14 } - */ -const unsigned char ossl_der_oid_sha224WithRSAEncryption[DER_OID_SZ_sha224WithRSAEncryption] = { - DER_OID_V_sha224WithRSAEncryption -}; - -/* - * sha256WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 11 } - */ -const unsigned char ossl_der_oid_sha256WithRSAEncryption[DER_OID_SZ_sha256WithRSAEncryption] = { - DER_OID_V_sha256WithRSAEncryption -}; - -/* - * sha384WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 12 } - */ -const unsigned char ossl_der_oid_sha384WithRSAEncryption[DER_OID_SZ_sha384WithRSAEncryption] = { - DER_OID_V_sha384WithRSAEncryption -}; - -/* - * sha512WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 13 } - */ -const unsigned char ossl_der_oid_sha512WithRSAEncryption[DER_OID_SZ_sha512WithRSAEncryption] = { - DER_OID_V_sha512WithRSAEncryption -}; - -/* - * sha512-224WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 15 } - */ -const unsigned char ossl_der_oid_sha512_224WithRSAEncryption[DER_OID_SZ_sha512_224WithRSAEncryption] = { - DER_OID_V_sha512_224WithRSAEncryption -}; - -/* - * sha512-256WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 16 } - */ -const unsigned char ossl_der_oid_sha512_256WithRSAEncryption[DER_OID_SZ_sha512_256WithRSAEncryption] = { - DER_OID_V_sha512_256WithRSAEncryption -}; - -/* - * id-mgf1 OBJECT IDENTIFIER ::= { pkcs-1 8 } - */ -const unsigned char ossl_der_oid_id_mgf1[DER_OID_SZ_id_mgf1] = { - DER_OID_V_id_mgf1 -}; - -/* - * id-rsassa-pkcs1-v1_5-with-sha3-224 OBJECT IDENTIFIER ::= { sigAlgs 13 } - */ -const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_224[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_224] = { - DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_224 -}; - -/* - * id-rsassa-pkcs1-v1_5-with-sha3-256 OBJECT IDENTIFIER ::= { sigAlgs 14 } - */ -const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_256[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_256] = { - DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_256 -}; - -/* - * id-rsassa-pkcs1-v1_5-with-sha3-384 OBJECT IDENTIFIER ::= { sigAlgs 15 } - */ -const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_384[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_384] = { - DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_384 -}; - -/* - * id-rsassa-pkcs1-v1_5-with-sha3-512 OBJECT IDENTIFIER ::= { sigAlgs 16 } - */ -const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_512[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_512] = { - DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_512 -}; - -/* - * md4WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 3 } - */ -const unsigned char ossl_der_oid_md4WithRSAEncryption[DER_OID_SZ_md4WithRSAEncryption] = { - DER_OID_V_md4WithRSAEncryption -}; - -/* - * ripemd160WithRSAEncryption OBJECT IDENTIFIER ::= { - * iso(1) identified-organization(3) teletrust(36) algorithm(3) signatureAlgorithm(3) rsaSignature(1) 2 - * } - */ -const unsigned char ossl_der_oid_ripemd160WithRSAEncryption[DER_OID_SZ_ripemd160WithRSAEncryption] = { - DER_OID_V_ripemd160WithRSAEncryption -}; - -/* - * mdc2WithRSASignature OBJECT IDENTIFIER ::= { - * iso(1) identified-organization(3) oiw(14) secsig(3) algorithms(2) mdc2WithRSASignature(14) - * } - */ -const unsigned char ossl_der_oid_mdc2WithRSASignature[DER_OID_SZ_mdc2WithRSASignature] = { - DER_OID_V_mdc2WithRSASignature -}; - diff --git a/deps/openssl/config/archs/linux-ppc64/asm/providers/common/der/der_sm2_gen.c b/deps/openssl/config/archs/linux-ppc64/asm/providers/common/der/der_sm2_gen.c deleted file mode 100644 index 6424ea166b7e15..00000000000000 --- a/deps/openssl/config/archs/linux-ppc64/asm/providers/common/der/der_sm2_gen.c +++ /dev/null @@ -1,30 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_sm2_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_sm2.h" - -/* Well known OIDs precompiled */ - -/* - * sm2-with-SM3 OBJECT IDENTIFIER ::= { sm-scheme 501 } - */ -const unsigned char ossl_der_oid_sm2_with_SM3[DER_OID_SZ_sm2_with_SM3] = { - DER_OID_V_sm2_with_SM3 -}; - -/* - * curveSM2 OBJECT IDENTIFIER ::= { sm-scheme 301 } - */ -const unsigned char ossl_der_oid_curveSM2[DER_OID_SZ_curveSM2] = { - DER_OID_V_curveSM2 -}; - diff --git a/deps/openssl/config/archs/linux-ppc64/asm/providers/common/der/der_wrap_gen.c b/deps/openssl/config/archs/linux-ppc64/asm/providers/common/der/der_wrap_gen.c deleted file mode 100644 index 6cf93972f48b6d..00000000000000 --- a/deps/openssl/config/archs/linux-ppc64/asm/providers/common/der/der_wrap_gen.c +++ /dev/null @@ -1,46 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_wrap_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_wrap.h" - -/* Well known OIDs precompiled */ - -/* - * id-alg-CMS3DESwrap OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs-9(9) smime(16) alg(3) 6 - * } - */ -const unsigned char ossl_der_oid_id_alg_CMS3DESwrap[DER_OID_SZ_id_alg_CMS3DESwrap] = { - DER_OID_V_id_alg_CMS3DESwrap -}; - -/* - * id-aes128-wrap OBJECT IDENTIFIER ::= { aes 5 } - */ -const unsigned char ossl_der_oid_id_aes128_wrap[DER_OID_SZ_id_aes128_wrap] = { - DER_OID_V_id_aes128_wrap -}; - -/* - * id-aes192-wrap OBJECT IDENTIFIER ::= { aes 25 } - */ -const unsigned char ossl_der_oid_id_aes192_wrap[DER_OID_SZ_id_aes192_wrap] = { - DER_OID_V_id_aes192_wrap -}; - -/* - * id-aes256-wrap OBJECT IDENTIFIER ::= { aes 45 } - */ -const unsigned char ossl_der_oid_id_aes256_wrap[DER_OID_SZ_id_aes256_wrap] = { - DER_OID_V_id_aes256_wrap -}; - diff --git a/deps/openssl/config/archs/linux-ppc64/asm/providers/fips.ld b/deps/openssl/config/archs/linux-ppc64/asm/providers/fips.ld deleted file mode 100644 index 1debaaa7ff652d..00000000000000 --- a/deps/openssl/config/archs/linux-ppc64/asm/providers/fips.ld +++ /dev/null @@ -1,5 +0,0 @@ -{ - global: - OSSL_provider_init; - local: *; -}; diff --git a/deps/openssl/config/archs/linux-ppc64/asm/providers/legacy.ld b/deps/openssl/config/archs/linux-ppc64/asm/providers/legacy.ld deleted file mode 100644 index 1debaaa7ff652d..00000000000000 --- a/deps/openssl/config/archs/linux-ppc64/asm/providers/legacy.ld +++ /dev/null @@ -1,5 +0,0 @@ -{ - global: - OSSL_provider_init; - local: *; -}; diff --git a/deps/openssl/config/archs/linux-ppc64/asm_avx2/apps/progs.c b/deps/openssl/config/archs/linux-ppc64/asm_avx2/apps/progs.c deleted file mode 100644 index f594c302c42ec6..00000000000000 --- a/deps/openssl/config/archs/linux-ppc64/asm_avx2/apps/progs.c +++ /dev/null @@ -1,397 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by apps/progs.pl - * - * Copyright 1995-2022 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "progs.h" - -FUNCTION functions[] = { - {FT_general, "asn1parse", asn1parse_main, asn1parse_options, NULL, NULL}, - {FT_general, "ca", ca_main, ca_options, NULL, NULL}, -#ifndef OPENSSL_NO_SOCK - {FT_general, "ciphers", ciphers_main, ciphers_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_CMP - {FT_general, "cmp", cmp_main, cmp_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_CMS - {FT_general, "cms", cms_main, cms_options, NULL, NULL}, -#endif - {FT_general, "crl", crl_main, crl_options, NULL, NULL}, - {FT_general, "crl2pkcs7", crl2pkcs7_main, crl2pkcs7_options, NULL, NULL}, - {FT_general, "dgst", dgst_main, dgst_options, NULL, NULL}, -#ifndef OPENSSL_NO_DH - {FT_general, "dhparam", dhparam_main, dhparam_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_DSA - {FT_general, "dsa", dsa_main, dsa_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_DSA - {FT_general, "dsaparam", dsaparam_main, dsaparam_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_EC - {FT_general, "ec", ec_main, ec_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_EC - {FT_general, "ecparam", ecparam_main, ecparam_options, NULL, NULL}, -#endif - {FT_general, "enc", enc_main, enc_options, NULL, NULL}, -#ifndef OPENSSL_NO_ENGINE - {FT_general, "engine", engine_main, engine_options, NULL, NULL}, -#endif - {FT_general, "errstr", errstr_main, errstr_options, NULL, NULL}, - {FT_general, "fipsinstall", fipsinstall_main, fipsinstall_options, NULL, NULL}, -#ifndef OPENSSL_NO_DSA - {FT_general, "gendsa", gendsa_main, gendsa_options, NULL, NULL}, -#endif - {FT_general, "genpkey", genpkey_main, genpkey_options, NULL, NULL}, -#ifndef OPENSSL_NO_RSA - {FT_general, "genrsa", genrsa_main, genrsa_options, NULL, NULL}, -#endif - {FT_general, "help", help_main, help_options, NULL, NULL}, - {FT_general, "info", info_main, info_options, NULL, NULL}, - {FT_general, "kdf", kdf_main, kdf_options, NULL, NULL}, - {FT_general, "list", list_main, list_options, NULL, NULL}, - {FT_general, "mac", mac_main, mac_options, NULL, NULL}, - {FT_general, "nseq", nseq_main, nseq_options, NULL, NULL}, -#ifndef OPENSSL_NO_OCSP - {FT_general, "ocsp", ocsp_main, ocsp_options, NULL, NULL}, -#endif - {FT_general, "passwd", passwd_main, passwd_options, NULL, NULL}, - {FT_general, "pkcs12", pkcs12_main, pkcs12_options, NULL, NULL}, - {FT_general, "pkcs7", pkcs7_main, pkcs7_options, NULL, NULL}, - {FT_general, "pkcs8", pkcs8_main, pkcs8_options, NULL, NULL}, - {FT_general, "pkey", pkey_main, pkey_options, NULL, NULL}, - {FT_general, "pkeyparam", pkeyparam_main, pkeyparam_options, NULL, NULL}, - {FT_general, "pkeyutl", pkeyutl_main, pkeyutl_options, NULL, NULL}, - {FT_general, "prime", prime_main, prime_options, NULL, NULL}, - {FT_general, "rand", rand_main, rand_options, NULL, NULL}, - {FT_general, "rehash", rehash_main, rehash_options, NULL, NULL}, - {FT_general, "req", req_main, req_options, NULL, NULL}, - {FT_general, "rsa", rsa_main, rsa_options, NULL, NULL}, -#if !defined(OPENSSL_NO_DEPRECATED_3_0) && !defined(OPENSSL_NO_RSA) - {FT_general, "rsautl", rsautl_main, rsautl_options, "pkeyutl", "3.0"}, -#endif -#ifndef OPENSSL_NO_SOCK - {FT_general, "s_client", s_client_main, s_client_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_SOCK - {FT_general, "s_server", s_server_main, s_server_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_SOCK - {FT_general, "s_time", s_time_main, s_time_options, NULL, NULL}, -#endif - {FT_general, "sess_id", sess_id_main, sess_id_options, NULL, NULL}, - {FT_general, "smime", smime_main, smime_options, NULL, NULL}, - {FT_general, "speed", speed_main, speed_options, NULL, NULL}, - {FT_general, "spkac", spkac_main, spkac_options, NULL, NULL}, -#ifndef OPENSSL_NO_SRP - {FT_general, "srp", srp_main, srp_options, NULL, NULL}, -#endif - {FT_general, "storeutl", storeutl_main, storeutl_options, NULL, NULL}, -#ifndef OPENSSL_NO_TS - {FT_general, "ts", ts_main, ts_options, NULL, NULL}, -#endif - {FT_general, "verify", verify_main, verify_options, NULL, NULL}, - {FT_general, "version", version_main, version_options, NULL, NULL}, - {FT_general, "x509", x509_main, x509_options, NULL, NULL}, -#ifndef OPENSSL_NO_MD2 - {FT_md, "md2", dgst_main, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_MD4 - {FT_md, "md4", dgst_main, NULL, NULL}, -#endif - {FT_md, "md5", dgst_main, NULL, NULL}, - {FT_md, "sha1", dgst_main, NULL, NULL}, - {FT_md, "sha224", dgst_main, NULL, NULL}, - {FT_md, "sha256", dgst_main, NULL, NULL}, - {FT_md, "sha384", dgst_main, NULL, NULL}, - {FT_md, "sha512", dgst_main, NULL, NULL}, - {FT_md, "sha512-224", dgst_main, NULL, NULL}, - {FT_md, "sha512-256", dgst_main, NULL, NULL}, - {FT_md, "sha3-224", dgst_main, NULL, NULL}, - {FT_md, "sha3-256", dgst_main, NULL, NULL}, - {FT_md, "sha3-384", dgst_main, NULL, NULL}, - {FT_md, "sha3-512", dgst_main, NULL, NULL}, - {FT_md, "shake128", dgst_main, NULL, NULL}, - {FT_md, "shake256", dgst_main, NULL, NULL}, -#ifndef OPENSSL_NO_MDC2 - {FT_md, "mdc2", dgst_main, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_RMD160 - {FT_md, "rmd160", dgst_main, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_BLAKE2 - {FT_md, "blake2b512", dgst_main, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_BLAKE2 - {FT_md, "blake2s256", dgst_main, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_SM3 - {FT_md, "sm3", dgst_main, NULL, NULL}, -#endif - {FT_cipher, "aes-128-cbc", enc_main, enc_options, NULL}, - {FT_cipher, "aes-128-ecb", enc_main, enc_options, NULL}, - {FT_cipher, "aes-192-cbc", enc_main, enc_options, NULL}, - {FT_cipher, "aes-192-ecb", enc_main, enc_options, NULL}, - {FT_cipher, "aes-256-cbc", enc_main, enc_options, NULL}, - {FT_cipher, "aes-256-ecb", enc_main, enc_options, NULL}, -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-ctr", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-cfb1", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-cfb8", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-ctr", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-cfb1", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-cfb8", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-ctr", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-cfb1", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-cfb8", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-128-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-128-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-192-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-192-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-256-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-256-ecb", enc_main, enc_options, NULL}, -#endif - {FT_cipher, "base64", enc_main, enc_options, NULL}, -#ifdef ZLIB - {FT_cipher, "zlib", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des3", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "desx", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC4 - {FT_cipher, "rc4", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC4 - {FT_cipher, "rc4-40", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede3", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede3-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede3-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede3-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-64-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-40-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast5-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast5-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast5-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast5-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-ctr", enc_main, enc_options, NULL}, -#endif - {0, NULL, NULL, NULL, NULL} -}; diff --git a/deps/openssl/config/archs/linux-ppc64/asm_avx2/providers/common/der/der_digests_gen.c b/deps/openssl/config/archs/linux-ppc64/asm_avx2/providers/common/der/der_digests_gen.c deleted file mode 100644 index e4e14e82e5648a..00000000000000 --- a/deps/openssl/config/archs/linux-ppc64/asm_avx2/providers/common/der/der_digests_gen.c +++ /dev/null @@ -1,160 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_digests_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_digests.h" - -/* Well known OIDs precompiled */ - -/* - * sigAlgs OBJECT IDENTIFIER ::= { nistAlgorithms 3 } - */ -const unsigned char ossl_der_oid_sigAlgs[DER_OID_SZ_sigAlgs] = { - DER_OID_V_sigAlgs -}; - -/* - * id-sha1 OBJECT IDENTIFIER ::= { iso(1) - * identified-organization(3) oiw(14) - * secsig(3) algorithms(2) 26 } - */ -const unsigned char ossl_der_oid_id_sha1[DER_OID_SZ_id_sha1] = { - DER_OID_V_id_sha1 -}; - -/* - * id-md2 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 2 } - */ -const unsigned char ossl_der_oid_id_md2[DER_OID_SZ_id_md2] = { - DER_OID_V_id_md2 -}; - -/* - * id-md5 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 5 } - */ -const unsigned char ossl_der_oid_id_md5[DER_OID_SZ_id_md5] = { - DER_OID_V_id_md5 -}; - -/* - * id-sha256 OBJECT IDENTIFIER ::= { hashAlgs 1 } - */ -const unsigned char ossl_der_oid_id_sha256[DER_OID_SZ_id_sha256] = { - DER_OID_V_id_sha256 -}; - -/* - * id-sha384 OBJECT IDENTIFIER ::= { hashAlgs 2 } - */ -const unsigned char ossl_der_oid_id_sha384[DER_OID_SZ_id_sha384] = { - DER_OID_V_id_sha384 -}; - -/* - * id-sha512 OBJECT IDENTIFIER ::= { hashAlgs 3 } - */ -const unsigned char ossl_der_oid_id_sha512[DER_OID_SZ_id_sha512] = { - DER_OID_V_id_sha512 -}; - -/* - * id-sha224 OBJECT IDENTIFIER ::= { hashAlgs 4 } - */ -const unsigned char ossl_der_oid_id_sha224[DER_OID_SZ_id_sha224] = { - DER_OID_V_id_sha224 -}; - -/* - * id-sha512-224 OBJECT IDENTIFIER ::= { hashAlgs 5 } - */ -const unsigned char ossl_der_oid_id_sha512_224[DER_OID_SZ_id_sha512_224] = { - DER_OID_V_id_sha512_224 -}; - -/* - * id-sha512-256 OBJECT IDENTIFIER ::= { hashAlgs 6 } - */ -const unsigned char ossl_der_oid_id_sha512_256[DER_OID_SZ_id_sha512_256] = { - DER_OID_V_id_sha512_256 -}; - -/* - * id-sha3-224 OBJECT IDENTIFIER ::= { hashAlgs 7 } - */ -const unsigned char ossl_der_oid_id_sha3_224[DER_OID_SZ_id_sha3_224] = { - DER_OID_V_id_sha3_224 -}; - -/* - * id-sha3-256 OBJECT IDENTIFIER ::= { hashAlgs 8 } - */ -const unsigned char ossl_der_oid_id_sha3_256[DER_OID_SZ_id_sha3_256] = { - DER_OID_V_id_sha3_256 -}; - -/* - * id-sha3-384 OBJECT IDENTIFIER ::= { hashAlgs 9 } - */ -const unsigned char ossl_der_oid_id_sha3_384[DER_OID_SZ_id_sha3_384] = { - DER_OID_V_id_sha3_384 -}; - -/* - * id-sha3-512 OBJECT IDENTIFIER ::= { hashAlgs 10 } - */ -const unsigned char ossl_der_oid_id_sha3_512[DER_OID_SZ_id_sha3_512] = { - DER_OID_V_id_sha3_512 -}; - -/* - * id-shake128 OBJECT IDENTIFIER ::= { hashAlgs 11 } - */ -const unsigned char ossl_der_oid_id_shake128[DER_OID_SZ_id_shake128] = { - DER_OID_V_id_shake128 -}; - -/* - * id-shake256 OBJECT IDENTIFIER ::= { hashAlgs 12 } - */ -const unsigned char ossl_der_oid_id_shake256[DER_OID_SZ_id_shake256] = { - DER_OID_V_id_shake256 -}; - -/* - * id-shake128-len OBJECT IDENTIFIER ::= { hashAlgs 17 } - */ -const unsigned char ossl_der_oid_id_shake128_len[DER_OID_SZ_id_shake128_len] = { - DER_OID_V_id_shake128_len -}; - -/* - * id-shake256-len OBJECT IDENTIFIER ::= { hashAlgs 18 } - */ -const unsigned char ossl_der_oid_id_shake256_len[DER_OID_SZ_id_shake256_len] = { - DER_OID_V_id_shake256_len -}; - -/* - * id-KMACWithSHAKE128 OBJECT IDENTIFIER ::={hashAlgs 19} - */ -const unsigned char ossl_der_oid_id_KMACWithSHAKE128[DER_OID_SZ_id_KMACWithSHAKE128] = { - DER_OID_V_id_KMACWithSHAKE128 -}; - -/* - * id-KMACWithSHAKE256 OBJECT IDENTIFIER ::={ hashAlgs 20} - */ -const unsigned char ossl_der_oid_id_KMACWithSHAKE256[DER_OID_SZ_id_KMACWithSHAKE256] = { - DER_OID_V_id_KMACWithSHAKE256 -}; - diff --git a/deps/openssl/config/archs/linux-ppc64/asm_avx2/providers/common/der/der_dsa_gen.c b/deps/openssl/config/archs/linux-ppc64/asm_avx2/providers/common/der/der_dsa_gen.c deleted file mode 100644 index e5cfe91e0f2510..00000000000000 --- a/deps/openssl/config/archs/linux-ppc64/asm_avx2/providers/common/der/der_dsa_gen.c +++ /dev/null @@ -1,94 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_dsa_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -/* - * DSA low level APIs are deprecated for public use, but still ok for - * internal use. - */ -#include "internal/deprecated.h" - -#include "prov/der_dsa.h" - -/* Well known OIDs precompiled */ - -/* - * id-dsa OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) x9-57(10040) x9algorithm(4) 1 } - */ -const unsigned char ossl_der_oid_id_dsa[DER_OID_SZ_id_dsa] = { - DER_OID_V_id_dsa -}; - -/* - * id-dsa-with-sha1 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) x9-57 (10040) x9algorithm(4) 3 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha1[DER_OID_SZ_id_dsa_with_sha1] = { - DER_OID_V_id_dsa_with_sha1 -}; - -/* - * id-dsa-with-sha224 OBJECT IDENTIFIER ::= { sigAlgs 1 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha224[DER_OID_SZ_id_dsa_with_sha224] = { - DER_OID_V_id_dsa_with_sha224 -}; - -/* - * id-dsa-with-sha256 OBJECT IDENTIFIER ::= { sigAlgs 2 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha256[DER_OID_SZ_id_dsa_with_sha256] = { - DER_OID_V_id_dsa_with_sha256 -}; - -/* - * id-dsa-with-sha384 OBJECT IDENTIFIER ::= { sigAlgs 3 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha384[DER_OID_SZ_id_dsa_with_sha384] = { - DER_OID_V_id_dsa_with_sha384 -}; - -/* - * id-dsa-with-sha512 OBJECT IDENTIFIER ::= { sigAlgs 4 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha512[DER_OID_SZ_id_dsa_with_sha512] = { - DER_OID_V_id_dsa_with_sha512 -}; - -/* - * id-dsa-with-sha3-224 OBJECT IDENTIFIER ::= { sigAlgs 5 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha3_224[DER_OID_SZ_id_dsa_with_sha3_224] = { - DER_OID_V_id_dsa_with_sha3_224 -}; - -/* - * id-dsa-with-sha3-256 OBJECT IDENTIFIER ::= { sigAlgs 6 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha3_256[DER_OID_SZ_id_dsa_with_sha3_256] = { - DER_OID_V_id_dsa_with_sha3_256 -}; - -/* - * id-dsa-with-sha3-384 OBJECT IDENTIFIER ::= { sigAlgs 7 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha3_384[DER_OID_SZ_id_dsa_with_sha3_384] = { - DER_OID_V_id_dsa_with_sha3_384 -}; - -/* - * id-dsa-with-sha3-512 OBJECT IDENTIFIER ::= { sigAlgs 8 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha3_512[DER_OID_SZ_id_dsa_with_sha3_512] = { - DER_OID_V_id_dsa_with_sha3_512 -}; - diff --git a/deps/openssl/config/archs/linux-ppc64/asm_avx2/providers/common/der/der_ec_gen.c b/deps/openssl/config/archs/linux-ppc64/asm_avx2/providers/common/der/der_ec_gen.c deleted file mode 100644 index e1ed54ba05b6ff..00000000000000 --- a/deps/openssl/config/archs/linux-ppc64/asm_avx2/providers/common/der/der_ec_gen.c +++ /dev/null @@ -1,279 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_ec_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_ec.h" - -/* Well known OIDs precompiled */ - -/* - * ecdsa-with-SHA1 OBJECT IDENTIFIER ::= { id-ecSigType 1 } - */ -const unsigned char ossl_der_oid_ecdsa_with_SHA1[DER_OID_SZ_ecdsa_with_SHA1] = { - DER_OID_V_ecdsa_with_SHA1 -}; - -/* - * id-ecPublicKey OBJECT IDENTIFIER ::= { id-publicKeyType 1 } - */ -const unsigned char ossl_der_oid_id_ecPublicKey[DER_OID_SZ_id_ecPublicKey] = { - DER_OID_V_id_ecPublicKey -}; - -/* - * c2pnb163v1 OBJECT IDENTIFIER ::= { c-TwoCurve 1 } - */ -const unsigned char ossl_der_oid_c2pnb163v1[DER_OID_SZ_c2pnb163v1] = { - DER_OID_V_c2pnb163v1 -}; - -/* - * c2pnb163v2 OBJECT IDENTIFIER ::= { c-TwoCurve 2 } - */ -const unsigned char ossl_der_oid_c2pnb163v2[DER_OID_SZ_c2pnb163v2] = { - DER_OID_V_c2pnb163v2 -}; - -/* - * c2pnb163v3 OBJECT IDENTIFIER ::= { c-TwoCurve 3 } - */ -const unsigned char ossl_der_oid_c2pnb163v3[DER_OID_SZ_c2pnb163v3] = { - DER_OID_V_c2pnb163v3 -}; - -/* - * c2pnb176w1 OBJECT IDENTIFIER ::= { c-TwoCurve 4 } - */ -const unsigned char ossl_der_oid_c2pnb176w1[DER_OID_SZ_c2pnb176w1] = { - DER_OID_V_c2pnb176w1 -}; - -/* - * c2tnb191v1 OBJECT IDENTIFIER ::= { c-TwoCurve 5 } - */ -const unsigned char ossl_der_oid_c2tnb191v1[DER_OID_SZ_c2tnb191v1] = { - DER_OID_V_c2tnb191v1 -}; - -/* - * c2tnb191v2 OBJECT IDENTIFIER ::= { c-TwoCurve 6 } - */ -const unsigned char ossl_der_oid_c2tnb191v2[DER_OID_SZ_c2tnb191v2] = { - DER_OID_V_c2tnb191v2 -}; - -/* - * c2tnb191v3 OBJECT IDENTIFIER ::= { c-TwoCurve 7 } - */ -const unsigned char ossl_der_oid_c2tnb191v3[DER_OID_SZ_c2tnb191v3] = { - DER_OID_V_c2tnb191v3 -}; - -/* - * c2onb191v4 OBJECT IDENTIFIER ::= { c-TwoCurve 8 } - */ -const unsigned char ossl_der_oid_c2onb191v4[DER_OID_SZ_c2onb191v4] = { - DER_OID_V_c2onb191v4 -}; - -/* - * c2onb191v5 OBJECT IDENTIFIER ::= { c-TwoCurve 9 } - */ -const unsigned char ossl_der_oid_c2onb191v5[DER_OID_SZ_c2onb191v5] = { - DER_OID_V_c2onb191v5 -}; - -/* - * c2pnb208w1 OBJECT IDENTIFIER ::= { c-TwoCurve 10 } - */ -const unsigned char ossl_der_oid_c2pnb208w1[DER_OID_SZ_c2pnb208w1] = { - DER_OID_V_c2pnb208w1 -}; - -/* - * c2tnb239v1 OBJECT IDENTIFIER ::= { c-TwoCurve 11 } - */ -const unsigned char ossl_der_oid_c2tnb239v1[DER_OID_SZ_c2tnb239v1] = { - DER_OID_V_c2tnb239v1 -}; - -/* - * c2tnb239v2 OBJECT IDENTIFIER ::= { c-TwoCurve 12 } - */ -const unsigned char ossl_der_oid_c2tnb239v2[DER_OID_SZ_c2tnb239v2] = { - DER_OID_V_c2tnb239v2 -}; - -/* - * c2tnb239v3 OBJECT IDENTIFIER ::= { c-TwoCurve 13 } - */ -const unsigned char ossl_der_oid_c2tnb239v3[DER_OID_SZ_c2tnb239v3] = { - DER_OID_V_c2tnb239v3 -}; - -/* - * c2onb239v4 OBJECT IDENTIFIER ::= { c-TwoCurve 14 } - */ -const unsigned char ossl_der_oid_c2onb239v4[DER_OID_SZ_c2onb239v4] = { - DER_OID_V_c2onb239v4 -}; - -/* - * c2onb239v5 OBJECT IDENTIFIER ::= { c-TwoCurve 15 } - */ -const unsigned char ossl_der_oid_c2onb239v5[DER_OID_SZ_c2onb239v5] = { - DER_OID_V_c2onb239v5 -}; - -/* - * c2pnb272w1 OBJECT IDENTIFIER ::= { c-TwoCurve 16 } - */ -const unsigned char ossl_der_oid_c2pnb272w1[DER_OID_SZ_c2pnb272w1] = { - DER_OID_V_c2pnb272w1 -}; - -/* - * c2pnb304w1 OBJECT IDENTIFIER ::= { c-TwoCurve 17 } - */ -const unsigned char ossl_der_oid_c2pnb304w1[DER_OID_SZ_c2pnb304w1] = { - DER_OID_V_c2pnb304w1 -}; - -/* - * c2tnb359v1 OBJECT IDENTIFIER ::= { c-TwoCurve 18 } - */ -const unsigned char ossl_der_oid_c2tnb359v1[DER_OID_SZ_c2tnb359v1] = { - DER_OID_V_c2tnb359v1 -}; - -/* - * c2pnb368w1 OBJECT IDENTIFIER ::= { c-TwoCurve 19 } - */ -const unsigned char ossl_der_oid_c2pnb368w1[DER_OID_SZ_c2pnb368w1] = { - DER_OID_V_c2pnb368w1 -}; - -/* - * c2tnb431r1 OBJECT IDENTIFIER ::= { c-TwoCurve 20 } - */ -const unsigned char ossl_der_oid_c2tnb431r1[DER_OID_SZ_c2tnb431r1] = { - DER_OID_V_c2tnb431r1 -}; - -/* - * prime192v1 OBJECT IDENTIFIER ::= { primeCurve 1 } - */ -const unsigned char ossl_der_oid_prime192v1[DER_OID_SZ_prime192v1] = { - DER_OID_V_prime192v1 -}; - -/* - * prime192v2 OBJECT IDENTIFIER ::= { primeCurve 2 } - */ -const unsigned char ossl_der_oid_prime192v2[DER_OID_SZ_prime192v2] = { - DER_OID_V_prime192v2 -}; - -/* - * prime192v3 OBJECT IDENTIFIER ::= { primeCurve 3 } - */ -const unsigned char ossl_der_oid_prime192v3[DER_OID_SZ_prime192v3] = { - DER_OID_V_prime192v3 -}; - -/* - * prime239v1 OBJECT IDENTIFIER ::= { primeCurve 4 } - */ -const unsigned char ossl_der_oid_prime239v1[DER_OID_SZ_prime239v1] = { - DER_OID_V_prime239v1 -}; - -/* - * prime239v2 OBJECT IDENTIFIER ::= { primeCurve 5 } - */ -const unsigned char ossl_der_oid_prime239v2[DER_OID_SZ_prime239v2] = { - DER_OID_V_prime239v2 -}; - -/* - * prime239v3 OBJECT IDENTIFIER ::= { primeCurve 6 } - */ -const unsigned char ossl_der_oid_prime239v3[DER_OID_SZ_prime239v3] = { - DER_OID_V_prime239v3 -}; - -/* - * prime256v1 OBJECT IDENTIFIER ::= { primeCurve 7 } - */ -const unsigned char ossl_der_oid_prime256v1[DER_OID_SZ_prime256v1] = { - DER_OID_V_prime256v1 -}; - -/* - * ecdsa-with-SHA224 OBJECT IDENTIFIER ::= { iso(1) member-body(2) - * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 1 } - */ -const unsigned char ossl_der_oid_ecdsa_with_SHA224[DER_OID_SZ_ecdsa_with_SHA224] = { - DER_OID_V_ecdsa_with_SHA224 -}; - -/* - * ecdsa-with-SHA256 OBJECT IDENTIFIER ::= { iso(1) member-body(2) - * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 2 } - */ -const unsigned char ossl_der_oid_ecdsa_with_SHA256[DER_OID_SZ_ecdsa_with_SHA256] = { - DER_OID_V_ecdsa_with_SHA256 -}; - -/* - * ecdsa-with-SHA384 OBJECT IDENTIFIER ::= { iso(1) member-body(2) - * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 3 } - */ -const unsigned char ossl_der_oid_ecdsa_with_SHA384[DER_OID_SZ_ecdsa_with_SHA384] = { - DER_OID_V_ecdsa_with_SHA384 -}; - -/* - * ecdsa-with-SHA512 OBJECT IDENTIFIER ::= { iso(1) member-body(2) - * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 4 } - */ -const unsigned char ossl_der_oid_ecdsa_with_SHA512[DER_OID_SZ_ecdsa_with_SHA512] = { - DER_OID_V_ecdsa_with_SHA512 -}; - -/* - * id-ecdsa-with-sha3-224 OBJECT IDENTIFIER ::= { sigAlgs 9 } - */ -const unsigned char ossl_der_oid_id_ecdsa_with_sha3_224[DER_OID_SZ_id_ecdsa_with_sha3_224] = { - DER_OID_V_id_ecdsa_with_sha3_224 -}; - -/* - * id-ecdsa-with-sha3-256 OBJECT IDENTIFIER ::= { sigAlgs 10 } - */ -const unsigned char ossl_der_oid_id_ecdsa_with_sha3_256[DER_OID_SZ_id_ecdsa_with_sha3_256] = { - DER_OID_V_id_ecdsa_with_sha3_256 -}; - -/* - * id-ecdsa-with-sha3-384 OBJECT IDENTIFIER ::= { sigAlgs 11 } - */ -const unsigned char ossl_der_oid_id_ecdsa_with_sha3_384[DER_OID_SZ_id_ecdsa_with_sha3_384] = { - DER_OID_V_id_ecdsa_with_sha3_384 -}; - -/* - * id-ecdsa-with-sha3-512 OBJECT IDENTIFIER ::= { sigAlgs 12 } - */ -const unsigned char ossl_der_oid_id_ecdsa_with_sha3_512[DER_OID_SZ_id_ecdsa_with_sha3_512] = { - DER_OID_V_id_ecdsa_with_sha3_512 -}; - diff --git a/deps/openssl/config/archs/linux-ppc64/asm_avx2/providers/common/der/der_ecx_gen.c b/deps/openssl/config/archs/linux-ppc64/asm_avx2/providers/common/der/der_ecx_gen.c deleted file mode 100644 index ba7bf14b5e156d..00000000000000 --- a/deps/openssl/config/archs/linux-ppc64/asm_avx2/providers/common/der/der_ecx_gen.c +++ /dev/null @@ -1,44 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_ecx_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_ecx.h" - -/* Well known OIDs precompiled */ - -/* - * id-X25519 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 110 } - */ -const unsigned char ossl_der_oid_id_X25519[DER_OID_SZ_id_X25519] = { - DER_OID_V_id_X25519 -}; - -/* - * id-X448 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 111 } - */ -const unsigned char ossl_der_oid_id_X448[DER_OID_SZ_id_X448] = { - DER_OID_V_id_X448 -}; - -/* - * id-Ed25519 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 112 } - */ -const unsigned char ossl_der_oid_id_Ed25519[DER_OID_SZ_id_Ed25519] = { - DER_OID_V_id_Ed25519 -}; - -/* - * id-Ed448 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 113 } - */ -const unsigned char ossl_der_oid_id_Ed448[DER_OID_SZ_id_Ed448] = { - DER_OID_V_id_Ed448 -}; - diff --git a/deps/openssl/config/archs/linux-ppc64/asm_avx2/providers/common/der/der_rsa_gen.c b/deps/openssl/config/archs/linux-ppc64/asm_avx2/providers/common/der/der_rsa_gen.c deleted file mode 100644 index a3431798402f3f..00000000000000 --- a/deps/openssl/config/archs/linux-ppc64/asm_avx2/providers/common/der/der_rsa_gen.c +++ /dev/null @@ -1,174 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_rsa_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_rsa.h" - -/* Well known OIDs precompiled */ - -/* - * hashAlgs OBJECT IDENTIFIER ::= { nistAlgorithms 2 } - */ -const unsigned char ossl_der_oid_hashAlgs[DER_OID_SZ_hashAlgs] = { - DER_OID_V_hashAlgs -}; - -/* - * rsaEncryption OBJECT IDENTIFIER ::= { pkcs-1 1 } - */ -const unsigned char ossl_der_oid_rsaEncryption[DER_OID_SZ_rsaEncryption] = { - DER_OID_V_rsaEncryption -}; - -/* - * id-RSAES-OAEP OBJECT IDENTIFIER ::= { pkcs-1 7 } - */ -const unsigned char ossl_der_oid_id_RSAES_OAEP[DER_OID_SZ_id_RSAES_OAEP] = { - DER_OID_V_id_RSAES_OAEP -}; - -/* - * id-pSpecified OBJECT IDENTIFIER ::= { pkcs-1 9 } - */ -const unsigned char ossl_der_oid_id_pSpecified[DER_OID_SZ_id_pSpecified] = { - DER_OID_V_id_pSpecified -}; - -/* - * id-RSASSA-PSS OBJECT IDENTIFIER ::= { pkcs-1 10 } - */ -const unsigned char ossl_der_oid_id_RSASSA_PSS[DER_OID_SZ_id_RSASSA_PSS] = { - DER_OID_V_id_RSASSA_PSS -}; - -/* - * md2WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 2 } - */ -const unsigned char ossl_der_oid_md2WithRSAEncryption[DER_OID_SZ_md2WithRSAEncryption] = { - DER_OID_V_md2WithRSAEncryption -}; - -/* - * md5WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 4 } - */ -const unsigned char ossl_der_oid_md5WithRSAEncryption[DER_OID_SZ_md5WithRSAEncryption] = { - DER_OID_V_md5WithRSAEncryption -}; - -/* - * sha1WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 5 } - */ -const unsigned char ossl_der_oid_sha1WithRSAEncryption[DER_OID_SZ_sha1WithRSAEncryption] = { - DER_OID_V_sha1WithRSAEncryption -}; - -/* - * sha224WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 14 } - */ -const unsigned char ossl_der_oid_sha224WithRSAEncryption[DER_OID_SZ_sha224WithRSAEncryption] = { - DER_OID_V_sha224WithRSAEncryption -}; - -/* - * sha256WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 11 } - */ -const unsigned char ossl_der_oid_sha256WithRSAEncryption[DER_OID_SZ_sha256WithRSAEncryption] = { - DER_OID_V_sha256WithRSAEncryption -}; - -/* - * sha384WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 12 } - */ -const unsigned char ossl_der_oid_sha384WithRSAEncryption[DER_OID_SZ_sha384WithRSAEncryption] = { - DER_OID_V_sha384WithRSAEncryption -}; - -/* - * sha512WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 13 } - */ -const unsigned char ossl_der_oid_sha512WithRSAEncryption[DER_OID_SZ_sha512WithRSAEncryption] = { - DER_OID_V_sha512WithRSAEncryption -}; - -/* - * sha512-224WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 15 } - */ -const unsigned char ossl_der_oid_sha512_224WithRSAEncryption[DER_OID_SZ_sha512_224WithRSAEncryption] = { - DER_OID_V_sha512_224WithRSAEncryption -}; - -/* - * sha512-256WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 16 } - */ -const unsigned char ossl_der_oid_sha512_256WithRSAEncryption[DER_OID_SZ_sha512_256WithRSAEncryption] = { - DER_OID_V_sha512_256WithRSAEncryption -}; - -/* - * id-mgf1 OBJECT IDENTIFIER ::= { pkcs-1 8 } - */ -const unsigned char ossl_der_oid_id_mgf1[DER_OID_SZ_id_mgf1] = { - DER_OID_V_id_mgf1 -}; - -/* - * id-rsassa-pkcs1-v1_5-with-sha3-224 OBJECT IDENTIFIER ::= { sigAlgs 13 } - */ -const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_224[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_224] = { - DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_224 -}; - -/* - * id-rsassa-pkcs1-v1_5-with-sha3-256 OBJECT IDENTIFIER ::= { sigAlgs 14 } - */ -const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_256[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_256] = { - DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_256 -}; - -/* - * id-rsassa-pkcs1-v1_5-with-sha3-384 OBJECT IDENTIFIER ::= { sigAlgs 15 } - */ -const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_384[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_384] = { - DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_384 -}; - -/* - * id-rsassa-pkcs1-v1_5-with-sha3-512 OBJECT IDENTIFIER ::= { sigAlgs 16 } - */ -const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_512[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_512] = { - DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_512 -}; - -/* - * md4WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 3 } - */ -const unsigned char ossl_der_oid_md4WithRSAEncryption[DER_OID_SZ_md4WithRSAEncryption] = { - DER_OID_V_md4WithRSAEncryption -}; - -/* - * ripemd160WithRSAEncryption OBJECT IDENTIFIER ::= { - * iso(1) identified-organization(3) teletrust(36) algorithm(3) signatureAlgorithm(3) rsaSignature(1) 2 - * } - */ -const unsigned char ossl_der_oid_ripemd160WithRSAEncryption[DER_OID_SZ_ripemd160WithRSAEncryption] = { - DER_OID_V_ripemd160WithRSAEncryption -}; - -/* - * mdc2WithRSASignature OBJECT IDENTIFIER ::= { - * iso(1) identified-organization(3) oiw(14) secsig(3) algorithms(2) mdc2WithRSASignature(14) - * } - */ -const unsigned char ossl_der_oid_mdc2WithRSASignature[DER_OID_SZ_mdc2WithRSASignature] = { - DER_OID_V_mdc2WithRSASignature -}; - diff --git a/deps/openssl/config/archs/linux-ppc64/asm_avx2/providers/common/der/der_sm2_gen.c b/deps/openssl/config/archs/linux-ppc64/asm_avx2/providers/common/der/der_sm2_gen.c deleted file mode 100644 index 6424ea166b7e15..00000000000000 --- a/deps/openssl/config/archs/linux-ppc64/asm_avx2/providers/common/der/der_sm2_gen.c +++ /dev/null @@ -1,30 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_sm2_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_sm2.h" - -/* Well known OIDs precompiled */ - -/* - * sm2-with-SM3 OBJECT IDENTIFIER ::= { sm-scheme 501 } - */ -const unsigned char ossl_der_oid_sm2_with_SM3[DER_OID_SZ_sm2_with_SM3] = { - DER_OID_V_sm2_with_SM3 -}; - -/* - * curveSM2 OBJECT IDENTIFIER ::= { sm-scheme 301 } - */ -const unsigned char ossl_der_oid_curveSM2[DER_OID_SZ_curveSM2] = { - DER_OID_V_curveSM2 -}; - diff --git a/deps/openssl/config/archs/linux-ppc64/asm_avx2/providers/common/der/der_wrap_gen.c b/deps/openssl/config/archs/linux-ppc64/asm_avx2/providers/common/der/der_wrap_gen.c deleted file mode 100644 index 6cf93972f48b6d..00000000000000 --- a/deps/openssl/config/archs/linux-ppc64/asm_avx2/providers/common/der/der_wrap_gen.c +++ /dev/null @@ -1,46 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_wrap_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_wrap.h" - -/* Well known OIDs precompiled */ - -/* - * id-alg-CMS3DESwrap OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs-9(9) smime(16) alg(3) 6 - * } - */ -const unsigned char ossl_der_oid_id_alg_CMS3DESwrap[DER_OID_SZ_id_alg_CMS3DESwrap] = { - DER_OID_V_id_alg_CMS3DESwrap -}; - -/* - * id-aes128-wrap OBJECT IDENTIFIER ::= { aes 5 } - */ -const unsigned char ossl_der_oid_id_aes128_wrap[DER_OID_SZ_id_aes128_wrap] = { - DER_OID_V_id_aes128_wrap -}; - -/* - * id-aes192-wrap OBJECT IDENTIFIER ::= { aes 25 } - */ -const unsigned char ossl_der_oid_id_aes192_wrap[DER_OID_SZ_id_aes192_wrap] = { - DER_OID_V_id_aes192_wrap -}; - -/* - * id-aes256-wrap OBJECT IDENTIFIER ::= { aes 45 } - */ -const unsigned char ossl_der_oid_id_aes256_wrap[DER_OID_SZ_id_aes256_wrap] = { - DER_OID_V_id_aes256_wrap -}; - diff --git a/deps/openssl/config/archs/linux-ppc64/asm_avx2/providers/fips.ld b/deps/openssl/config/archs/linux-ppc64/asm_avx2/providers/fips.ld deleted file mode 100644 index 1debaaa7ff652d..00000000000000 --- a/deps/openssl/config/archs/linux-ppc64/asm_avx2/providers/fips.ld +++ /dev/null @@ -1,5 +0,0 @@ -{ - global: - OSSL_provider_init; - local: *; -}; diff --git a/deps/openssl/config/archs/linux-ppc64/asm_avx2/providers/legacy.ld b/deps/openssl/config/archs/linux-ppc64/asm_avx2/providers/legacy.ld deleted file mode 100644 index 1debaaa7ff652d..00000000000000 --- a/deps/openssl/config/archs/linux-ppc64/asm_avx2/providers/legacy.ld +++ /dev/null @@ -1,5 +0,0 @@ -{ - global: - OSSL_provider_init; - local: *; -}; diff --git a/deps/openssl/config/archs/linux-ppc64/no-asm/apps/progs.c b/deps/openssl/config/archs/linux-ppc64/no-asm/apps/progs.c deleted file mode 100644 index f594c302c42ec6..00000000000000 --- a/deps/openssl/config/archs/linux-ppc64/no-asm/apps/progs.c +++ /dev/null @@ -1,397 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by apps/progs.pl - * - * Copyright 1995-2022 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "progs.h" - -FUNCTION functions[] = { - {FT_general, "asn1parse", asn1parse_main, asn1parse_options, NULL, NULL}, - {FT_general, "ca", ca_main, ca_options, NULL, NULL}, -#ifndef OPENSSL_NO_SOCK - {FT_general, "ciphers", ciphers_main, ciphers_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_CMP - {FT_general, "cmp", cmp_main, cmp_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_CMS - {FT_general, "cms", cms_main, cms_options, NULL, NULL}, -#endif - {FT_general, "crl", crl_main, crl_options, NULL, NULL}, - {FT_general, "crl2pkcs7", crl2pkcs7_main, crl2pkcs7_options, NULL, NULL}, - {FT_general, "dgst", dgst_main, dgst_options, NULL, NULL}, -#ifndef OPENSSL_NO_DH - {FT_general, "dhparam", dhparam_main, dhparam_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_DSA - {FT_general, "dsa", dsa_main, dsa_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_DSA - {FT_general, "dsaparam", dsaparam_main, dsaparam_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_EC - {FT_general, "ec", ec_main, ec_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_EC - {FT_general, "ecparam", ecparam_main, ecparam_options, NULL, NULL}, -#endif - {FT_general, "enc", enc_main, enc_options, NULL, NULL}, -#ifndef OPENSSL_NO_ENGINE - {FT_general, "engine", engine_main, engine_options, NULL, NULL}, -#endif - {FT_general, "errstr", errstr_main, errstr_options, NULL, NULL}, - {FT_general, "fipsinstall", fipsinstall_main, fipsinstall_options, NULL, NULL}, -#ifndef OPENSSL_NO_DSA - {FT_general, "gendsa", gendsa_main, gendsa_options, NULL, NULL}, -#endif - {FT_general, "genpkey", genpkey_main, genpkey_options, NULL, NULL}, -#ifndef OPENSSL_NO_RSA - {FT_general, "genrsa", genrsa_main, genrsa_options, NULL, NULL}, -#endif - {FT_general, "help", help_main, help_options, NULL, NULL}, - {FT_general, "info", info_main, info_options, NULL, NULL}, - {FT_general, "kdf", kdf_main, kdf_options, NULL, NULL}, - {FT_general, "list", list_main, list_options, NULL, NULL}, - {FT_general, "mac", mac_main, mac_options, NULL, NULL}, - {FT_general, "nseq", nseq_main, nseq_options, NULL, NULL}, -#ifndef OPENSSL_NO_OCSP - {FT_general, "ocsp", ocsp_main, ocsp_options, NULL, NULL}, -#endif - {FT_general, "passwd", passwd_main, passwd_options, NULL, NULL}, - {FT_general, "pkcs12", pkcs12_main, pkcs12_options, NULL, NULL}, - {FT_general, "pkcs7", pkcs7_main, pkcs7_options, NULL, NULL}, - {FT_general, "pkcs8", pkcs8_main, pkcs8_options, NULL, NULL}, - {FT_general, "pkey", pkey_main, pkey_options, NULL, NULL}, - {FT_general, "pkeyparam", pkeyparam_main, pkeyparam_options, NULL, NULL}, - {FT_general, "pkeyutl", pkeyutl_main, pkeyutl_options, NULL, NULL}, - {FT_general, "prime", prime_main, prime_options, NULL, NULL}, - {FT_general, "rand", rand_main, rand_options, NULL, NULL}, - {FT_general, "rehash", rehash_main, rehash_options, NULL, NULL}, - {FT_general, "req", req_main, req_options, NULL, NULL}, - {FT_general, "rsa", rsa_main, rsa_options, NULL, NULL}, -#if !defined(OPENSSL_NO_DEPRECATED_3_0) && !defined(OPENSSL_NO_RSA) - {FT_general, "rsautl", rsautl_main, rsautl_options, "pkeyutl", "3.0"}, -#endif -#ifndef OPENSSL_NO_SOCK - {FT_general, "s_client", s_client_main, s_client_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_SOCK - {FT_general, "s_server", s_server_main, s_server_options, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_SOCK - {FT_general, "s_time", s_time_main, s_time_options, NULL, NULL}, -#endif - {FT_general, "sess_id", sess_id_main, sess_id_options, NULL, NULL}, - {FT_general, "smime", smime_main, smime_options, NULL, NULL}, - {FT_general, "speed", speed_main, speed_options, NULL, NULL}, - {FT_general, "spkac", spkac_main, spkac_options, NULL, NULL}, -#ifndef OPENSSL_NO_SRP - {FT_general, "srp", srp_main, srp_options, NULL, NULL}, -#endif - {FT_general, "storeutl", storeutl_main, storeutl_options, NULL, NULL}, -#ifndef OPENSSL_NO_TS - {FT_general, "ts", ts_main, ts_options, NULL, NULL}, -#endif - {FT_general, "verify", verify_main, verify_options, NULL, NULL}, - {FT_general, "version", version_main, version_options, NULL, NULL}, - {FT_general, "x509", x509_main, x509_options, NULL, NULL}, -#ifndef OPENSSL_NO_MD2 - {FT_md, "md2", dgst_main, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_MD4 - {FT_md, "md4", dgst_main, NULL, NULL}, -#endif - {FT_md, "md5", dgst_main, NULL, NULL}, - {FT_md, "sha1", dgst_main, NULL, NULL}, - {FT_md, "sha224", dgst_main, NULL, NULL}, - {FT_md, "sha256", dgst_main, NULL, NULL}, - {FT_md, "sha384", dgst_main, NULL, NULL}, - {FT_md, "sha512", dgst_main, NULL, NULL}, - {FT_md, "sha512-224", dgst_main, NULL, NULL}, - {FT_md, "sha512-256", dgst_main, NULL, NULL}, - {FT_md, "sha3-224", dgst_main, NULL, NULL}, - {FT_md, "sha3-256", dgst_main, NULL, NULL}, - {FT_md, "sha3-384", dgst_main, NULL, NULL}, - {FT_md, "sha3-512", dgst_main, NULL, NULL}, - {FT_md, "shake128", dgst_main, NULL, NULL}, - {FT_md, "shake256", dgst_main, NULL, NULL}, -#ifndef OPENSSL_NO_MDC2 - {FT_md, "mdc2", dgst_main, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_RMD160 - {FT_md, "rmd160", dgst_main, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_BLAKE2 - {FT_md, "blake2b512", dgst_main, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_BLAKE2 - {FT_md, "blake2s256", dgst_main, NULL, NULL}, -#endif -#ifndef OPENSSL_NO_SM3 - {FT_md, "sm3", dgst_main, NULL, NULL}, -#endif - {FT_cipher, "aes-128-cbc", enc_main, enc_options, NULL}, - {FT_cipher, "aes-128-ecb", enc_main, enc_options, NULL}, - {FT_cipher, "aes-192-cbc", enc_main, enc_options, NULL}, - {FT_cipher, "aes-192-ecb", enc_main, enc_options, NULL}, - {FT_cipher, "aes-256-cbc", enc_main, enc_options, NULL}, - {FT_cipher, "aes-256-ecb", enc_main, enc_options, NULL}, -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-ctr", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-cfb1", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-cfb8", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-ctr", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-cfb1", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-cfb8", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-ctr", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-cfb1", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-cfb8", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-128-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-128-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-192-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-192-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-256-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-256-ecb", enc_main, enc_options, NULL}, -#endif - {FT_cipher, "base64", enc_main, enc_options, NULL}, -#ifdef ZLIB - {FT_cipher, "zlib", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des3", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "desx", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC4 - {FT_cipher, "rc4", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC4 - {FT_cipher, "rc4-40", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede3", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede3-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede3-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede3-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-64-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-40-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast5-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast5-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast5-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast5-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-cbc", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-ecb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-cfb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-ofb", enc_main, enc_options, NULL}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-ctr", enc_main, enc_options, NULL}, -#endif - {0, NULL, NULL, NULL, NULL} -}; diff --git a/deps/openssl/config/archs/linux-ppc64/no-asm/providers/common/der/der_digests_gen.c b/deps/openssl/config/archs/linux-ppc64/no-asm/providers/common/der/der_digests_gen.c deleted file mode 100644 index e4e14e82e5648a..00000000000000 --- a/deps/openssl/config/archs/linux-ppc64/no-asm/providers/common/der/der_digests_gen.c +++ /dev/null @@ -1,160 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_digests_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_digests.h" - -/* Well known OIDs precompiled */ - -/* - * sigAlgs OBJECT IDENTIFIER ::= { nistAlgorithms 3 } - */ -const unsigned char ossl_der_oid_sigAlgs[DER_OID_SZ_sigAlgs] = { - DER_OID_V_sigAlgs -}; - -/* - * id-sha1 OBJECT IDENTIFIER ::= { iso(1) - * identified-organization(3) oiw(14) - * secsig(3) algorithms(2) 26 } - */ -const unsigned char ossl_der_oid_id_sha1[DER_OID_SZ_id_sha1] = { - DER_OID_V_id_sha1 -}; - -/* - * id-md2 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 2 } - */ -const unsigned char ossl_der_oid_id_md2[DER_OID_SZ_id_md2] = { - DER_OID_V_id_md2 -}; - -/* - * id-md5 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 5 } - */ -const unsigned char ossl_der_oid_id_md5[DER_OID_SZ_id_md5] = { - DER_OID_V_id_md5 -}; - -/* - * id-sha256 OBJECT IDENTIFIER ::= { hashAlgs 1 } - */ -const unsigned char ossl_der_oid_id_sha256[DER_OID_SZ_id_sha256] = { - DER_OID_V_id_sha256 -}; - -/* - * id-sha384 OBJECT IDENTIFIER ::= { hashAlgs 2 } - */ -const unsigned char ossl_der_oid_id_sha384[DER_OID_SZ_id_sha384] = { - DER_OID_V_id_sha384 -}; - -/* - * id-sha512 OBJECT IDENTIFIER ::= { hashAlgs 3 } - */ -const unsigned char ossl_der_oid_id_sha512[DER_OID_SZ_id_sha512] = { - DER_OID_V_id_sha512 -}; - -/* - * id-sha224 OBJECT IDENTIFIER ::= { hashAlgs 4 } - */ -const unsigned char ossl_der_oid_id_sha224[DER_OID_SZ_id_sha224] = { - DER_OID_V_id_sha224 -}; - -/* - * id-sha512-224 OBJECT IDENTIFIER ::= { hashAlgs 5 } - */ -const unsigned char ossl_der_oid_id_sha512_224[DER_OID_SZ_id_sha512_224] = { - DER_OID_V_id_sha512_224 -}; - -/* - * id-sha512-256 OBJECT IDENTIFIER ::= { hashAlgs 6 } - */ -const unsigned char ossl_der_oid_id_sha512_256[DER_OID_SZ_id_sha512_256] = { - DER_OID_V_id_sha512_256 -}; - -/* - * id-sha3-224 OBJECT IDENTIFIER ::= { hashAlgs 7 } - */ -const unsigned char ossl_der_oid_id_sha3_224[DER_OID_SZ_id_sha3_224] = { - DER_OID_V_id_sha3_224 -}; - -/* - * id-sha3-256 OBJECT IDENTIFIER ::= { hashAlgs 8 } - */ -const unsigned char ossl_der_oid_id_sha3_256[DER_OID_SZ_id_sha3_256] = { - DER_OID_V_id_sha3_256 -}; - -/* - * id-sha3-384 OBJECT IDENTIFIER ::= { hashAlgs 9 } - */ -const unsigned char ossl_der_oid_id_sha3_384[DER_OID_SZ_id_sha3_384] = { - DER_OID_V_id_sha3_384 -}; - -/* - * id-sha3-512 OBJECT IDENTIFIER ::= { hashAlgs 10 } - */ -const unsigned char ossl_der_oid_id_sha3_512[DER_OID_SZ_id_sha3_512] = { - DER_OID_V_id_sha3_512 -}; - -/* - * id-shake128 OBJECT IDENTIFIER ::= { hashAlgs 11 } - */ -const unsigned char ossl_der_oid_id_shake128[DER_OID_SZ_id_shake128] = { - DER_OID_V_id_shake128 -}; - -/* - * id-shake256 OBJECT IDENTIFIER ::= { hashAlgs 12 } - */ -const unsigned char ossl_der_oid_id_shake256[DER_OID_SZ_id_shake256] = { - DER_OID_V_id_shake256 -}; - -/* - * id-shake128-len OBJECT IDENTIFIER ::= { hashAlgs 17 } - */ -const unsigned char ossl_der_oid_id_shake128_len[DER_OID_SZ_id_shake128_len] = { - DER_OID_V_id_shake128_len -}; - -/* - * id-shake256-len OBJECT IDENTIFIER ::= { hashAlgs 18 } - */ -const unsigned char ossl_der_oid_id_shake256_len[DER_OID_SZ_id_shake256_len] = { - DER_OID_V_id_shake256_len -}; - -/* - * id-KMACWithSHAKE128 OBJECT IDENTIFIER ::={hashAlgs 19} - */ -const unsigned char ossl_der_oid_id_KMACWithSHAKE128[DER_OID_SZ_id_KMACWithSHAKE128] = { - DER_OID_V_id_KMACWithSHAKE128 -}; - -/* - * id-KMACWithSHAKE256 OBJECT IDENTIFIER ::={ hashAlgs 20} - */ -const unsigned char ossl_der_oid_id_KMACWithSHAKE256[DER_OID_SZ_id_KMACWithSHAKE256] = { - DER_OID_V_id_KMACWithSHAKE256 -}; - diff --git a/deps/openssl/config/archs/linux-ppc64/no-asm/providers/common/der/der_dsa_gen.c b/deps/openssl/config/archs/linux-ppc64/no-asm/providers/common/der/der_dsa_gen.c deleted file mode 100644 index e5cfe91e0f2510..00000000000000 --- a/deps/openssl/config/archs/linux-ppc64/no-asm/providers/common/der/der_dsa_gen.c +++ /dev/null @@ -1,94 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_dsa_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -/* - * DSA low level APIs are deprecated for public use, but still ok for - * internal use. - */ -#include "internal/deprecated.h" - -#include "prov/der_dsa.h" - -/* Well known OIDs precompiled */ - -/* - * id-dsa OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) x9-57(10040) x9algorithm(4) 1 } - */ -const unsigned char ossl_der_oid_id_dsa[DER_OID_SZ_id_dsa] = { - DER_OID_V_id_dsa -}; - -/* - * id-dsa-with-sha1 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) x9-57 (10040) x9algorithm(4) 3 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha1[DER_OID_SZ_id_dsa_with_sha1] = { - DER_OID_V_id_dsa_with_sha1 -}; - -/* - * id-dsa-with-sha224 OBJECT IDENTIFIER ::= { sigAlgs 1 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha224[DER_OID_SZ_id_dsa_with_sha224] = { - DER_OID_V_id_dsa_with_sha224 -}; - -/* - * id-dsa-with-sha256 OBJECT IDENTIFIER ::= { sigAlgs 2 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha256[DER_OID_SZ_id_dsa_with_sha256] = { - DER_OID_V_id_dsa_with_sha256 -}; - -/* - * id-dsa-with-sha384 OBJECT IDENTIFIER ::= { sigAlgs 3 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha384[DER_OID_SZ_id_dsa_with_sha384] = { - DER_OID_V_id_dsa_with_sha384 -}; - -/* - * id-dsa-with-sha512 OBJECT IDENTIFIER ::= { sigAlgs 4 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha512[DER_OID_SZ_id_dsa_with_sha512] = { - DER_OID_V_id_dsa_with_sha512 -}; - -/* - * id-dsa-with-sha3-224 OBJECT IDENTIFIER ::= { sigAlgs 5 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha3_224[DER_OID_SZ_id_dsa_with_sha3_224] = { - DER_OID_V_id_dsa_with_sha3_224 -}; - -/* - * id-dsa-with-sha3-256 OBJECT IDENTIFIER ::= { sigAlgs 6 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha3_256[DER_OID_SZ_id_dsa_with_sha3_256] = { - DER_OID_V_id_dsa_with_sha3_256 -}; - -/* - * id-dsa-with-sha3-384 OBJECT IDENTIFIER ::= { sigAlgs 7 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha3_384[DER_OID_SZ_id_dsa_with_sha3_384] = { - DER_OID_V_id_dsa_with_sha3_384 -}; - -/* - * id-dsa-with-sha3-512 OBJECT IDENTIFIER ::= { sigAlgs 8 } - */ -const unsigned char ossl_der_oid_id_dsa_with_sha3_512[DER_OID_SZ_id_dsa_with_sha3_512] = { - DER_OID_V_id_dsa_with_sha3_512 -}; - diff --git a/deps/openssl/config/archs/linux-ppc64/no-asm/providers/common/der/der_ec_gen.c b/deps/openssl/config/archs/linux-ppc64/no-asm/providers/common/der/der_ec_gen.c deleted file mode 100644 index e1ed54ba05b6ff..00000000000000 --- a/deps/openssl/config/archs/linux-ppc64/no-asm/providers/common/der/der_ec_gen.c +++ /dev/null @@ -1,279 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_ec_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_ec.h" - -/* Well known OIDs precompiled */ - -/* - * ecdsa-with-SHA1 OBJECT IDENTIFIER ::= { id-ecSigType 1 } - */ -const unsigned char ossl_der_oid_ecdsa_with_SHA1[DER_OID_SZ_ecdsa_with_SHA1] = { - DER_OID_V_ecdsa_with_SHA1 -}; - -/* - * id-ecPublicKey OBJECT IDENTIFIER ::= { id-publicKeyType 1 } - */ -const unsigned char ossl_der_oid_id_ecPublicKey[DER_OID_SZ_id_ecPublicKey] = { - DER_OID_V_id_ecPublicKey -}; - -/* - * c2pnb163v1 OBJECT IDENTIFIER ::= { c-TwoCurve 1 } - */ -const unsigned char ossl_der_oid_c2pnb163v1[DER_OID_SZ_c2pnb163v1] = { - DER_OID_V_c2pnb163v1 -}; - -/* - * c2pnb163v2 OBJECT IDENTIFIER ::= { c-TwoCurve 2 } - */ -const unsigned char ossl_der_oid_c2pnb163v2[DER_OID_SZ_c2pnb163v2] = { - DER_OID_V_c2pnb163v2 -}; - -/* - * c2pnb163v3 OBJECT IDENTIFIER ::= { c-TwoCurve 3 } - */ -const unsigned char ossl_der_oid_c2pnb163v3[DER_OID_SZ_c2pnb163v3] = { - DER_OID_V_c2pnb163v3 -}; - -/* - * c2pnb176w1 OBJECT IDENTIFIER ::= { c-TwoCurve 4 } - */ -const unsigned char ossl_der_oid_c2pnb176w1[DER_OID_SZ_c2pnb176w1] = { - DER_OID_V_c2pnb176w1 -}; - -/* - * c2tnb191v1 OBJECT IDENTIFIER ::= { c-TwoCurve 5 } - */ -const unsigned char ossl_der_oid_c2tnb191v1[DER_OID_SZ_c2tnb191v1] = { - DER_OID_V_c2tnb191v1 -}; - -/* - * c2tnb191v2 OBJECT IDENTIFIER ::= { c-TwoCurve 6 } - */ -const unsigned char ossl_der_oid_c2tnb191v2[DER_OID_SZ_c2tnb191v2] = { - DER_OID_V_c2tnb191v2 -}; - -/* - * c2tnb191v3 OBJECT IDENTIFIER ::= { c-TwoCurve 7 } - */ -const unsigned char ossl_der_oid_c2tnb191v3[DER_OID_SZ_c2tnb191v3] = { - DER_OID_V_c2tnb191v3 -}; - -/* - * c2onb191v4 OBJECT IDENTIFIER ::= { c-TwoCurve 8 } - */ -const unsigned char ossl_der_oid_c2onb191v4[DER_OID_SZ_c2onb191v4] = { - DER_OID_V_c2onb191v4 -}; - -/* - * c2onb191v5 OBJECT IDENTIFIER ::= { c-TwoCurve 9 } - */ -const unsigned char ossl_der_oid_c2onb191v5[DER_OID_SZ_c2onb191v5] = { - DER_OID_V_c2onb191v5 -}; - -/* - * c2pnb208w1 OBJECT IDENTIFIER ::= { c-TwoCurve 10 } - */ -const unsigned char ossl_der_oid_c2pnb208w1[DER_OID_SZ_c2pnb208w1] = { - DER_OID_V_c2pnb208w1 -}; - -/* - * c2tnb239v1 OBJECT IDENTIFIER ::= { c-TwoCurve 11 } - */ -const unsigned char ossl_der_oid_c2tnb239v1[DER_OID_SZ_c2tnb239v1] = { - DER_OID_V_c2tnb239v1 -}; - -/* - * c2tnb239v2 OBJECT IDENTIFIER ::= { c-TwoCurve 12 } - */ -const unsigned char ossl_der_oid_c2tnb239v2[DER_OID_SZ_c2tnb239v2] = { - DER_OID_V_c2tnb239v2 -}; - -/* - * c2tnb239v3 OBJECT IDENTIFIER ::= { c-TwoCurve 13 } - */ -const unsigned char ossl_der_oid_c2tnb239v3[DER_OID_SZ_c2tnb239v3] = { - DER_OID_V_c2tnb239v3 -}; - -/* - * c2onb239v4 OBJECT IDENTIFIER ::= { c-TwoCurve 14 } - */ -const unsigned char ossl_der_oid_c2onb239v4[DER_OID_SZ_c2onb239v4] = { - DER_OID_V_c2onb239v4 -}; - -/* - * c2onb239v5 OBJECT IDENTIFIER ::= { c-TwoCurve 15 } - */ -const unsigned char ossl_der_oid_c2onb239v5[DER_OID_SZ_c2onb239v5] = { - DER_OID_V_c2onb239v5 -}; - -/* - * c2pnb272w1 OBJECT IDENTIFIER ::= { c-TwoCurve 16 } - */ -const unsigned char ossl_der_oid_c2pnb272w1[DER_OID_SZ_c2pnb272w1] = { - DER_OID_V_c2pnb272w1 -}; - -/* - * c2pnb304w1 OBJECT IDENTIFIER ::= { c-TwoCurve 17 } - */ -const unsigned char ossl_der_oid_c2pnb304w1[DER_OID_SZ_c2pnb304w1] = { - DER_OID_V_c2pnb304w1 -}; - -/* - * c2tnb359v1 OBJECT IDENTIFIER ::= { c-TwoCurve 18 } - */ -const unsigned char ossl_der_oid_c2tnb359v1[DER_OID_SZ_c2tnb359v1] = { - DER_OID_V_c2tnb359v1 -}; - -/* - * c2pnb368w1 OBJECT IDENTIFIER ::= { c-TwoCurve 19 } - */ -const unsigned char ossl_der_oid_c2pnb368w1[DER_OID_SZ_c2pnb368w1] = { - DER_OID_V_c2pnb368w1 -}; - -/* - * c2tnb431r1 OBJECT IDENTIFIER ::= { c-TwoCurve 20 } - */ -const unsigned char ossl_der_oid_c2tnb431r1[DER_OID_SZ_c2tnb431r1] = { - DER_OID_V_c2tnb431r1 -}; - -/* - * prime192v1 OBJECT IDENTIFIER ::= { primeCurve 1 } - */ -const unsigned char ossl_der_oid_prime192v1[DER_OID_SZ_prime192v1] = { - DER_OID_V_prime192v1 -}; - -/* - * prime192v2 OBJECT IDENTIFIER ::= { primeCurve 2 } - */ -const unsigned char ossl_der_oid_prime192v2[DER_OID_SZ_prime192v2] = { - DER_OID_V_prime192v2 -}; - -/* - * prime192v3 OBJECT IDENTIFIER ::= { primeCurve 3 } - */ -const unsigned char ossl_der_oid_prime192v3[DER_OID_SZ_prime192v3] = { - DER_OID_V_prime192v3 -}; - -/* - * prime239v1 OBJECT IDENTIFIER ::= { primeCurve 4 } - */ -const unsigned char ossl_der_oid_prime239v1[DER_OID_SZ_prime239v1] = { - DER_OID_V_prime239v1 -}; - -/* - * prime239v2 OBJECT IDENTIFIER ::= { primeCurve 5 } - */ -const unsigned char ossl_der_oid_prime239v2[DER_OID_SZ_prime239v2] = { - DER_OID_V_prime239v2 -}; - -/* - * prime239v3 OBJECT IDENTIFIER ::= { primeCurve 6 } - */ -const unsigned char ossl_der_oid_prime239v3[DER_OID_SZ_prime239v3] = { - DER_OID_V_prime239v3 -}; - -/* - * prime256v1 OBJECT IDENTIFIER ::= { primeCurve 7 } - */ -const unsigned char ossl_der_oid_prime256v1[DER_OID_SZ_prime256v1] = { - DER_OID_V_prime256v1 -}; - -/* - * ecdsa-with-SHA224 OBJECT IDENTIFIER ::= { iso(1) member-body(2) - * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 1 } - */ -const unsigned char ossl_der_oid_ecdsa_with_SHA224[DER_OID_SZ_ecdsa_with_SHA224] = { - DER_OID_V_ecdsa_with_SHA224 -}; - -/* - * ecdsa-with-SHA256 OBJECT IDENTIFIER ::= { iso(1) member-body(2) - * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 2 } - */ -const unsigned char ossl_der_oid_ecdsa_with_SHA256[DER_OID_SZ_ecdsa_with_SHA256] = { - DER_OID_V_ecdsa_with_SHA256 -}; - -/* - * ecdsa-with-SHA384 OBJECT IDENTIFIER ::= { iso(1) member-body(2) - * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 3 } - */ -const unsigned char ossl_der_oid_ecdsa_with_SHA384[DER_OID_SZ_ecdsa_with_SHA384] = { - DER_OID_V_ecdsa_with_SHA384 -}; - -/* - * ecdsa-with-SHA512 OBJECT IDENTIFIER ::= { iso(1) member-body(2) - * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 4 } - */ -const unsigned char ossl_der_oid_ecdsa_with_SHA512[DER_OID_SZ_ecdsa_with_SHA512] = { - DER_OID_V_ecdsa_with_SHA512 -}; - -/* - * id-ecdsa-with-sha3-224 OBJECT IDENTIFIER ::= { sigAlgs 9 } - */ -const unsigned char ossl_der_oid_id_ecdsa_with_sha3_224[DER_OID_SZ_id_ecdsa_with_sha3_224] = { - DER_OID_V_id_ecdsa_with_sha3_224 -}; - -/* - * id-ecdsa-with-sha3-256 OBJECT IDENTIFIER ::= { sigAlgs 10 } - */ -const unsigned char ossl_der_oid_id_ecdsa_with_sha3_256[DER_OID_SZ_id_ecdsa_with_sha3_256] = { - DER_OID_V_id_ecdsa_with_sha3_256 -}; - -/* - * id-ecdsa-with-sha3-384 OBJECT IDENTIFIER ::= { sigAlgs 11 } - */ -const unsigned char ossl_der_oid_id_ecdsa_with_sha3_384[DER_OID_SZ_id_ecdsa_with_sha3_384] = { - DER_OID_V_id_ecdsa_with_sha3_384 -}; - -/* - * id-ecdsa-with-sha3-512 OBJECT IDENTIFIER ::= { sigAlgs 12 } - */ -const unsigned char ossl_der_oid_id_ecdsa_with_sha3_512[DER_OID_SZ_id_ecdsa_with_sha3_512] = { - DER_OID_V_id_ecdsa_with_sha3_512 -}; - diff --git a/deps/openssl/config/archs/linux-ppc64/no-asm/providers/common/der/der_ecx_gen.c b/deps/openssl/config/archs/linux-ppc64/no-asm/providers/common/der/der_ecx_gen.c deleted file mode 100644 index ba7bf14b5e156d..00000000000000 --- a/deps/openssl/config/archs/linux-ppc64/no-asm/providers/common/der/der_ecx_gen.c +++ /dev/null @@ -1,44 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_ecx_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_ecx.h" - -/* Well known OIDs precompiled */ - -/* - * id-X25519 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 110 } - */ -const unsigned char ossl_der_oid_id_X25519[DER_OID_SZ_id_X25519] = { - DER_OID_V_id_X25519 -}; - -/* - * id-X448 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 111 } - */ -const unsigned char ossl_der_oid_id_X448[DER_OID_SZ_id_X448] = { - DER_OID_V_id_X448 -}; - -/* - * id-Ed25519 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 112 } - */ -const unsigned char ossl_der_oid_id_Ed25519[DER_OID_SZ_id_Ed25519] = { - DER_OID_V_id_Ed25519 -}; - -/* - * id-Ed448 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 113 } - */ -const unsigned char ossl_der_oid_id_Ed448[DER_OID_SZ_id_Ed448] = { - DER_OID_V_id_Ed448 -}; - diff --git a/deps/openssl/config/archs/linux-ppc64/no-asm/providers/common/der/der_rsa_gen.c b/deps/openssl/config/archs/linux-ppc64/no-asm/providers/common/der/der_rsa_gen.c deleted file mode 100644 index a3431798402f3f..00000000000000 --- a/deps/openssl/config/archs/linux-ppc64/no-asm/providers/common/der/der_rsa_gen.c +++ /dev/null @@ -1,174 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_rsa_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_rsa.h" - -/* Well known OIDs precompiled */ - -/* - * hashAlgs OBJECT IDENTIFIER ::= { nistAlgorithms 2 } - */ -const unsigned char ossl_der_oid_hashAlgs[DER_OID_SZ_hashAlgs] = { - DER_OID_V_hashAlgs -}; - -/* - * rsaEncryption OBJECT IDENTIFIER ::= { pkcs-1 1 } - */ -const unsigned char ossl_der_oid_rsaEncryption[DER_OID_SZ_rsaEncryption] = { - DER_OID_V_rsaEncryption -}; - -/* - * id-RSAES-OAEP OBJECT IDENTIFIER ::= { pkcs-1 7 } - */ -const unsigned char ossl_der_oid_id_RSAES_OAEP[DER_OID_SZ_id_RSAES_OAEP] = { - DER_OID_V_id_RSAES_OAEP -}; - -/* - * id-pSpecified OBJECT IDENTIFIER ::= { pkcs-1 9 } - */ -const unsigned char ossl_der_oid_id_pSpecified[DER_OID_SZ_id_pSpecified] = { - DER_OID_V_id_pSpecified -}; - -/* - * id-RSASSA-PSS OBJECT IDENTIFIER ::= { pkcs-1 10 } - */ -const unsigned char ossl_der_oid_id_RSASSA_PSS[DER_OID_SZ_id_RSASSA_PSS] = { - DER_OID_V_id_RSASSA_PSS -}; - -/* - * md2WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 2 } - */ -const unsigned char ossl_der_oid_md2WithRSAEncryption[DER_OID_SZ_md2WithRSAEncryption] = { - DER_OID_V_md2WithRSAEncryption -}; - -/* - * md5WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 4 } - */ -const unsigned char ossl_der_oid_md5WithRSAEncryption[DER_OID_SZ_md5WithRSAEncryption] = { - DER_OID_V_md5WithRSAEncryption -}; - -/* - * sha1WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 5 } - */ -const unsigned char ossl_der_oid_sha1WithRSAEncryption[DER_OID_SZ_sha1WithRSAEncryption] = { - DER_OID_V_sha1WithRSAEncryption -}; - -/* - * sha224WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 14 } - */ -const unsigned char ossl_der_oid_sha224WithRSAEncryption[DER_OID_SZ_sha224WithRSAEncryption] = { - DER_OID_V_sha224WithRSAEncryption -}; - -/* - * sha256WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 11 } - */ -const unsigned char ossl_der_oid_sha256WithRSAEncryption[DER_OID_SZ_sha256WithRSAEncryption] = { - DER_OID_V_sha256WithRSAEncryption -}; - -/* - * sha384WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 12 } - */ -const unsigned char ossl_der_oid_sha384WithRSAEncryption[DER_OID_SZ_sha384WithRSAEncryption] = { - DER_OID_V_sha384WithRSAEncryption -}; - -/* - * sha512WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 13 } - */ -const unsigned char ossl_der_oid_sha512WithRSAEncryption[DER_OID_SZ_sha512WithRSAEncryption] = { - DER_OID_V_sha512WithRSAEncryption -}; - -/* - * sha512-224WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 15 } - */ -const unsigned char ossl_der_oid_sha512_224WithRSAEncryption[DER_OID_SZ_sha512_224WithRSAEncryption] = { - DER_OID_V_sha512_224WithRSAEncryption -}; - -/* - * sha512-256WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 16 } - */ -const unsigned char ossl_der_oid_sha512_256WithRSAEncryption[DER_OID_SZ_sha512_256WithRSAEncryption] = { - DER_OID_V_sha512_256WithRSAEncryption -}; - -/* - * id-mgf1 OBJECT IDENTIFIER ::= { pkcs-1 8 } - */ -const unsigned char ossl_der_oid_id_mgf1[DER_OID_SZ_id_mgf1] = { - DER_OID_V_id_mgf1 -}; - -/* - * id-rsassa-pkcs1-v1_5-with-sha3-224 OBJECT IDENTIFIER ::= { sigAlgs 13 } - */ -const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_224[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_224] = { - DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_224 -}; - -/* - * id-rsassa-pkcs1-v1_5-with-sha3-256 OBJECT IDENTIFIER ::= { sigAlgs 14 } - */ -const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_256[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_256] = { - DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_256 -}; - -/* - * id-rsassa-pkcs1-v1_5-with-sha3-384 OBJECT IDENTIFIER ::= { sigAlgs 15 } - */ -const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_384[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_384] = { - DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_384 -}; - -/* - * id-rsassa-pkcs1-v1_5-with-sha3-512 OBJECT IDENTIFIER ::= { sigAlgs 16 } - */ -const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_512[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_512] = { - DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_512 -}; - -/* - * md4WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 3 } - */ -const unsigned char ossl_der_oid_md4WithRSAEncryption[DER_OID_SZ_md4WithRSAEncryption] = { - DER_OID_V_md4WithRSAEncryption -}; - -/* - * ripemd160WithRSAEncryption OBJECT IDENTIFIER ::= { - * iso(1) identified-organization(3) teletrust(36) algorithm(3) signatureAlgorithm(3) rsaSignature(1) 2 - * } - */ -const unsigned char ossl_der_oid_ripemd160WithRSAEncryption[DER_OID_SZ_ripemd160WithRSAEncryption] = { - DER_OID_V_ripemd160WithRSAEncryption -}; - -/* - * mdc2WithRSASignature OBJECT IDENTIFIER ::= { - * iso(1) identified-organization(3) oiw(14) secsig(3) algorithms(2) mdc2WithRSASignature(14) - * } - */ -const unsigned char ossl_der_oid_mdc2WithRSASignature[DER_OID_SZ_mdc2WithRSASignature] = { - DER_OID_V_mdc2WithRSASignature -}; - diff --git a/deps/openssl/config/archs/linux-ppc64/no-asm/providers/common/der/der_sm2_gen.c b/deps/openssl/config/archs/linux-ppc64/no-asm/providers/common/der/der_sm2_gen.c deleted file mode 100644 index 6424ea166b7e15..00000000000000 --- a/deps/openssl/config/archs/linux-ppc64/no-asm/providers/common/der/der_sm2_gen.c +++ /dev/null @@ -1,30 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_sm2_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_sm2.h" - -/* Well known OIDs precompiled */ - -/* - * sm2-with-SM3 OBJECT IDENTIFIER ::= { sm-scheme 501 } - */ -const unsigned char ossl_der_oid_sm2_with_SM3[DER_OID_SZ_sm2_with_SM3] = { - DER_OID_V_sm2_with_SM3 -}; - -/* - * curveSM2 OBJECT IDENTIFIER ::= { sm-scheme 301 } - */ -const unsigned char ossl_der_oid_curveSM2[DER_OID_SZ_curveSM2] = { - DER_OID_V_curveSM2 -}; - diff --git a/deps/openssl/config/archs/linux-ppc64/no-asm/providers/common/der/der_wrap_gen.c b/deps/openssl/config/archs/linux-ppc64/no-asm/providers/common/der/der_wrap_gen.c deleted file mode 100644 index 6cf93972f48b6d..00000000000000 --- a/deps/openssl/config/archs/linux-ppc64/no-asm/providers/common/der/der_wrap_gen.c +++ /dev/null @@ -1,46 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by Makefile from providers/common/der/der_wrap_gen.c.in - * - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "prov/der_wrap.h" - -/* Well known OIDs precompiled */ - -/* - * id-alg-CMS3DESwrap OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs-9(9) smime(16) alg(3) 6 - * } - */ -const unsigned char ossl_der_oid_id_alg_CMS3DESwrap[DER_OID_SZ_id_alg_CMS3DESwrap] = { - DER_OID_V_id_alg_CMS3DESwrap -}; - -/* - * id-aes128-wrap OBJECT IDENTIFIER ::= { aes 5 } - */ -const unsigned char ossl_der_oid_id_aes128_wrap[DER_OID_SZ_id_aes128_wrap] = { - DER_OID_V_id_aes128_wrap -}; - -/* - * id-aes192-wrap OBJECT IDENTIFIER ::= { aes 25 } - */ -const unsigned char ossl_der_oid_id_aes192_wrap[DER_OID_SZ_id_aes192_wrap] = { - DER_OID_V_id_aes192_wrap -}; - -/* - * id-aes256-wrap OBJECT IDENTIFIER ::= { aes 45 } - */ -const unsigned char ossl_der_oid_id_aes256_wrap[DER_OID_SZ_id_aes256_wrap] = { - DER_OID_V_id_aes256_wrap -}; - diff --git a/deps/openssl/config/archs/linux-ppc64/no-asm/providers/fips.ld b/deps/openssl/config/archs/linux-ppc64/no-asm/providers/fips.ld deleted file mode 100644 index 1debaaa7ff652d..00000000000000 --- a/deps/openssl/config/archs/linux-ppc64/no-asm/providers/fips.ld +++ /dev/null @@ -1,5 +0,0 @@ -{ - global: - OSSL_provider_init; - local: *; -}; diff --git a/deps/openssl/config/archs/linux-ppc64/no-asm/providers/legacy.ld b/deps/openssl/config/archs/linux-ppc64/no-asm/providers/legacy.ld deleted file mode 100644 index 1debaaa7ff652d..00000000000000 --- a/deps/openssl/config/archs/linux-ppc64/no-asm/providers/legacy.ld +++ /dev/null @@ -1,5 +0,0 @@ -{ - global: - OSSL_provider_init; - local: *; -}; diff --git a/deps/simdjson/simdjson.cpp b/deps/simdjson/simdjson.cpp index bcd6da639eca57..8f3305987681e6 100644 --- a/deps/simdjson/simdjson.cpp +++ b/deps/simdjson/simdjson.cpp @@ -1,4 +1,4 @@ -/* auto-generated on 2025-12-17 20:32:36 -0500. version 4.2.4 Do not edit! */ +/* auto-generated on 2026-03-25 17:25:37 -0400. version 4.5.0 Do not edit! */ /* including simdjson.cpp: */ /* begin file simdjson.cpp */ #define SIMDJSON_SRC_SIMDJSON_CPP @@ -146,7 +146,6 @@ #define SIMDJSON_CONSTEVAL 0 #endif // defined(__cpp_consteval) && __cpp_consteval >= 201811L && defined(__cpp_lib_constexpr_string) && __cpp_lib_constexpr_string >= 201907L #endif // !defined(SIMDJSON_CONSTEVAL) - #endif // SIMDJSON_COMPILER_CHECK_H /* end file simdjson/compiler_check.h */ /* including simdjson/portability.h: #include "simdjson/portability.h" */ @@ -198,24 +197,47 @@ using std::size_t; #define SIMDJSON_IS_ARM64 1 #elif defined(__riscv) && __riscv_xlen == 64 #define SIMDJSON_IS_RISCV64 1 + #if __riscv_v_intrinsic >= 11000 #define SIMDJSON_HAS_RVV_INTRINSICS 1 #endif - #define SIMDJSON_HAS_ZVBB_INTRINSICS \ - 0 // there is currently no way to detect this + #if SIMDJSON_HAS_RVV_INTRINSICS && __riscv_vector && __riscv_v_min_vlen >= 128 && __riscv_v_elen >= 64 + #define SIMDJSON_IS_RVV 1 // RISC-V V extension + #endif - #if SIMDJSON_HAS_RVV_INTRINSICS && __riscv_vector && \ - __riscv_v_min_vlen >= 128 && __riscv_v_elen >= 64 - // RISC-V V extension - #define SIMDJSON_IS_RVV 1 - #if SIMDJSON_HAS_ZVBB_INTRINSICS && __riscv_zvbb >= 1000000 - // RISC-V Vector Basic Bit-manipulation - #define SIMDJSON_IS_ZVBB 1 - #endif + // current toolchains don't support fixed-size SIMD types that don't match VLEN directly + #if __riscv_v_fixed_vlen >= 128 && __riscv_v_fixed_vlen <= 512 + #define SIMDJSON_IS_RVV_VLS 1 #endif + #elif defined(__loongarch_lp64) #define SIMDJSON_IS_LOONGARCH64 1 +#if defined(__loongarch_sx) && defined(__loongarch_asx) + #define SIMDJSON_IS_LSX 1 + #define SIMDJSON_IS_LASX 1 // We can always run both +#elif defined(__loongarch_sx) + #define SIMDJSON_IS_LSX 1 + +// Adjust for runtime dispatching support. +#if defined(__GNUC__) && !defined(__clang__) && !defined(__INTEL_COMPILER) && !defined(__NVCOMPILER) +#if __GNUC__ > 15 || (__GNUC__ == 15 && __GNUC_MINOR__ >= 0) + // We are ok, we will support runtime dispatch for LASX. +#else + // We disable runtime dispatch for LASX, which means that we will not be able to use LASX + // even if it is supported by the hardware. + // Loongson users should update to GCC 15 or better. + #define SIMDJSON_IMPLEMENTATION_LASX 0 +#endif +#else + // We are not using GCC, so we assume that we can support runtime dispatch for LASX. + // https://godbolt.org/z/jcMnrjYhs + #define SIMDJSON_IMPLEMENTATION_LASX 0 +#endif + + + +#endif #elif defined(__PPC64__) || defined(_M_PPC64) #define SIMDJSON_IS_PPC64 1 #if defined(__ALTIVEC__) @@ -271,7 +293,7 @@ using std::size_t; // // We are going to use runtime dispatch. -#if SIMDJSON_IS_X86_64 +#if defined(SIMDJSON_IS_X86_64) || defined(SIMDJSON_IS_LSX) #ifdef __clang__ // clang does not have GCC push pop // warning: clang attribute push can't be used within a namespace in clang up @@ -288,7 +310,7 @@ using std::size_t; #define SIMDJSON_UNTARGET_REGION _Pragma("GCC pop_options") #endif // clang then gcc -#endif // x86 +#endif // defined(SIMDJSON_IS_X86_64) || defined(SIMDJSON_IS_LSX) // Default target region macros don't do anything. #ifndef SIMDJSON_TARGET_REGION @@ -357,7 +379,8 @@ using std::size_t; #define simdjson_strncasecmp strncasecmp #endif -#if defined(NDEBUG) || defined(__OPTIMIZE__) || (defined(_MSC_VER) && !defined(_DEBUG)) +#if (defined(NDEBUG) || defined(__OPTIMIZE__) || (defined(_MSC_VER) && !defined(_DEBUG))) && !SIMDJSON_DEVELOPMENT_CHECKS +// If SIMDJSON_DEVELOPMENT_CHECKS is undefined or 0, we consider that we are in release mode. // If NDEBUG is set, or __OPTIMIZE__ is set, or we are under MSVC in release mode, // then do away with asserts and use __assume. // We still recommend that our users set NDEBUG in release mode. @@ -369,7 +392,7 @@ using std::size_t; #define SIMDJSON_ASSUME(COND) do { if (!(COND)) __builtin_unreachable(); } while (0) #endif -#else // defined(NDEBUG) || defined(__OPTIMIZE__) || (defined(_MSC_VER) && !defined(_DEBUG)) +#else // defined(NDEBUG) || defined(__OPTIMIZE__) || (defined(_MSC_VER) && !defined(_DEBUG)) && !SIMDJSON_DEVELOPMENT_CHECKS // This should only ever be enabled in debug mode. #define SIMDJSON_UNREACHABLE() assert(0); #define SIMDJSON_ASSUME(COND) assert(COND) @@ -2412,7 +2435,9 @@ namespace std { // when the compiler is optimizing. // We only set SIMDJSON_DEVELOPMENT_CHECKS if both __OPTIMIZE__ // and NDEBUG are not defined. -#if !defined(__OPTIMIZE__) && !defined(NDEBUG) +// We recognize _DEBUG as overriding __OPTIMIZE__ so that if both +// __OPTIMIZE__ and _DEBUG are defined, we still set SIMDJSON_DEVELOPMENT_CHECKS. +#if ((!defined(__OPTIMIZE__) || defined(_DEBUG)) && !defined(NDEBUG)) #define SIMDJSON_DEVELOPMENT_CHECKS 1 #endif // __OPTIMIZE__ #endif // _MSC_VER @@ -4835,7 +4860,7 @@ extern SIMDJSON_DLLIMPORTEXPORT const uint32_t digit_to_val32[886]; namespace simdjson { inline bool is_fatal(error_code error) noexcept { - return error == TAPE_ERROR || error == INCOMPLETE_ARRAY_OR_OBJECT; + return error == TAPE_ERROR || error == INCOMPLETE_ARRAY_OR_OBJECT || error == OUT_OF_ORDER_ITERATION || error == DEPTH_ERROR; } namespace internal { @@ -6715,6 +6740,8 @@ SIMDJSON_DLLIMPORTEXPORT const uint64_t simdjson::internal::power_of_five_128[]= #define SIMDJSON_IMPLEMENTATION_ID_westmere 6 #define SIMDJSON_IMPLEMENTATION_ID_lsx 7 #define SIMDJSON_IMPLEMENTATION_ID_lasx 8 +//#define SIMDJSON_IMPLEMENTATION_ID_rvv 9 +#define SIMDJSON_IMPLEMENTATION_ID_rvv_vls 10 #define SIMDJSON_IMPLEMENTATION_ID_FOR(IMPL) SIMDJSON_CAT(SIMDJSON_IMPLEMENTATION_ID_, IMPL) #define SIMDJSON_IMPLEMENTATION_ID SIMDJSON_IMPLEMENTATION_ID_FOR(SIMDJSON_IMPLEMENTATION) @@ -6816,22 +6843,27 @@ SIMDJSON_DLLIMPORTEXPORT const uint64_t simdjson::internal::power_of_five_128[]= #endif #ifndef SIMDJSON_IMPLEMENTATION_LASX -#define SIMDJSON_IMPLEMENTATION_LASX (SIMDJSON_IS_LOONGARCH64 && __loongarch_asx) +#define SIMDJSON_IMPLEMENTATION_LASX (SIMDJSON_IS_LSX) #endif -#define SIMDJSON_CAN_ALWAYS_RUN_LASX (SIMDJSON_IMPLEMENTATION_LASX) +#define SIMDJSON_CAN_ALWAYS_RUN_LASX (SIMDJSON_IS_LASX) #ifndef SIMDJSON_IMPLEMENTATION_LSX #if SIMDJSON_CAN_ALWAYS_RUN_LASX #define SIMDJSON_IMPLEMENTATION_LSX 0 #else -#define SIMDJSON_IMPLEMENTATION_LSX (SIMDJSON_IS_LOONGARCH64 && __loongarch_sx) +#define SIMDJSON_IMPLEMENTATION_LSX (SIMDJSON_IS_LSX) #endif #endif #define SIMDJSON_CAN_ALWAYS_RUN_LSX (SIMDJSON_IMPLEMENTATION_LSX) +#define SIMDJSON_CAN_ALWAYS_RUN_RVV_VLS SIMDJSON_IS_RVV_VLS +#ifndef SIMDJSON_IMPLEMENTATION_RVV_VLS +#define SIMDJSON_IMPLEMENTATION_RVV_VLS SIMDJSON_CAN_ALWAYS_RUN_RVV_VLS +#endif + // Default Fallback to on unless a builtin implementation has already been selected. #ifndef SIMDJSON_IMPLEMENTATION_FALLBACK -#if SIMDJSON_CAN_ALWAYS_RUN_ARM64 || SIMDJSON_CAN_ALWAYS_RUN_ICELAKE || SIMDJSON_CAN_ALWAYS_RUN_HASWELL || SIMDJSON_CAN_ALWAYS_RUN_WESTMERE || SIMDJSON_CAN_ALWAYS_RUN_PPC64 || SIMDJSON_CAN_ALWAYS_RUN_LSX || SIMDJSON_CAN_ALWAYS_RUN_LASX +#if SIMDJSON_CAN_ALWAYS_RUN_ARM64 || SIMDJSON_CAN_ALWAYS_RUN_ICELAKE || SIMDJSON_CAN_ALWAYS_RUN_HASWELL || SIMDJSON_CAN_ALWAYS_RUN_WESTMERE || SIMDJSON_CAN_ALWAYS_RUN_PPC64 || SIMDJSON_CAN_ALWAYS_RUN_LSX || SIMDJSON_CAN_ALWAYS_RUN_LASX || SIMDJSON_CAN_ALWAYS_RUN_RVV_VLS // if anything at all except fallback can always run, then disable fallback. #define SIMDJSON_IMPLEMENTATION_FALLBACK 0 #else @@ -6857,6 +6889,8 @@ SIMDJSON_DLLIMPORTEXPORT const uint64_t simdjson::internal::power_of_five_128[]= #define SIMDJSON_BUILTIN_IMPLEMENTATION lsx #elif SIMDJSON_CAN_ALWAYS_RUN_LASX #define SIMDJSON_BUILTIN_IMPLEMENTATION lasx +#elif SIMDJSON_CAN_ALWAYS_RUN_RVV_VLS +#define SIMDJSON_BUILTIN_IMPLEMENTATION rvv_vls #elif SIMDJSON_CAN_ALWAYS_RUN_FALLBACK #define SIMDJSON_BUILTIN_IMPLEMENTATION fallback #else @@ -7274,6 +7308,12 @@ class dom_parser_implementation { */ size_t _max_depth{0}; +public: + /** Whether to store big integers as strings instead of returning BIGINT_ERROR */ + bool _number_as_string{false}; + +protected: + // Declaring these so that subclasses can use them to implement their constructors. simdjson_inline dom_parser_implementation() noexcept; simdjson_inline dom_parser_implementation(dom_parser_implementation &&other) noexcept; @@ -7613,6 +7653,8 @@ enum instruction_set { AVX512VBMI2 = 0x10000, LSX = 0x20000, LASX = 0x40000, + //RVV = 0x80000, + RVV_VLS = 0x100000, }; } // namespace internal @@ -7847,7 +7889,8 @@ enum class tape_type { DOUBLE = 'd', TRUE_VALUE = 't', FALSE_VALUE = 'f', - NULL_VALUE = 'n' + NULL_VALUE = 'n', + BIGINT = 'Z' // Big integer stored as string in string buffer }; // enum class tape_type } // namespace internal @@ -7926,6 +7969,9 @@ POSSIBILITY OF SUCH DAMAGE. #elif defined(HAVE_GCC_GET_CPUID) && defined(USE_GCC_GET_CPUID) #include <cpuid.h> #endif +#if defined(__loongarch__) && defined(__linux__) + #include <sys/auxv.h> +#endif namespace simdjson { namespace internal { @@ -8090,16 +8136,31 @@ static inline uint32_t detect_supported_architectures() { return host_isa; } -#elif defined(__loongarch_sx) && !defined(__loongarch_asx) +#elif defined(__loongarch__) static inline uint32_t detect_supported_architectures() { - return instruction_set::LSX; + uint32_t host_isa = instruction_set::DEFAULT; + #if defined(__linux__) + uint64_t hwcap = 0; + hwcap = getauxval(AT_HWCAP); + if (hwcap & HWCAP_LOONGARCH_LSX) { + host_isa |= instruction_set::LSX; + } + if (hwcap & HWCAP_LOONGARCH_LASX) { + host_isa |= instruction_set::LASX; + } + #endif + return host_isa; } -#elif defined(__loongarch_asx) +#elif SIMDJSON_IS_RISCV64 static inline uint32_t detect_supported_architectures() { - return instruction_set::LASX; + uint32_t host_isa = instruction_set::DEFAULT; +#if SIMDJSON_IS_RVV_VLS + host_isa |= instruction_set::RVV_VLS; +#endif + return host_isa; } #else // fallback @@ -8428,6 +8489,51 @@ static const simdjson::westmere::implementation* get_westmere_singleton() { } // namespace simdjson #endif // SIMDJSON_IMPLEMENTATION_WESTMERE +#if SIMDJSON_IMPLEMENTATION_LASX +/* including simdjson/lasx/implementation.h: #include <simdjson/lasx/implementation.h> */ +/* begin file simdjson/lasx/implementation.h */ +#ifndef SIMDJSON_LASX_IMPLEMENTATION_H +#define SIMDJSON_LASX_IMPLEMENTATION_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/implementation.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/internal/instruction_set.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace lasx { + +/** + * @private + */ +class implementation final : public simdjson::implementation { +public: + simdjson_inline implementation() : simdjson::implementation("lasx", "LoongArch ASX", internal::instruction_set::LASX) {} + simdjson_warn_unused error_code create_dom_parser_implementation( + size_t capacity, + size_t max_length, + std::unique_ptr<internal::dom_parser_implementation>& dst + ) const noexcept final; + simdjson_warn_unused error_code minify(const uint8_t *buf, size_t len, uint8_t *dst, size_t &dst_len) const noexcept final; + simdjson_warn_unused bool validate_utf8(const char *buf, size_t len) const noexcept final; +}; + +} // namespace lasx +} // namespace simdjson + +#endif // SIMDJSON_LASX_IMPLEMENTATION_H +/* end file simdjson/lasx/implementation.h */ +namespace simdjson { +namespace internal { +static const simdjson::lasx::implementation* get_lasx_singleton() { + static const simdjson::lasx::implementation lasx_singleton{}; + return &lasx_singleton; +} +} // namespace internal +} // namespace simdjson +#endif // SIMDJSON_IMPLEMENTATION_LASX + #if SIMDJSON_IMPLEMENTATION_LSX /* including simdjson/lsx/implementation.h: #include <simdjson/lsx/implementation.h> */ /* begin file simdjson/lsx/implementation.h */ @@ -8473,50 +8579,53 @@ static const simdjson::lsx::implementation* get_lsx_singleton() { } // namespace simdjson #endif // SIMDJSON_IMPLEMENTATION_LSX -#if SIMDJSON_IMPLEMENTATION_LASX -/* including simdjson/lasx/implementation.h: #include <simdjson/lasx/implementation.h> */ -/* begin file simdjson/lasx/implementation.h */ -#ifndef SIMDJSON_LASX_IMPLEMENTATION_H -#define SIMDJSON_LASX_IMPLEMENTATION_H +#if SIMDJSON_IMPLEMENTATION_RVV_VLS +/* including simdjson/rvv-vls/implementation.h: #include <simdjson/rvv-vls/implementation.h> */ +/* begin file simdjson/rvv-vls/implementation.h */ +#ifndef SIMDJSON_RVV_VLS_IMPLEMENTATION_H +#define SIMDJSON_RVV_VLS_IMPLEMENTATION_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/base.h" */ /* amalgamation skipped (editor-only): #include "simdjson/implementation.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/internal/instruction_set.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace rvv_vls { /** * @private */ class implementation final : public simdjson::implementation { public: - simdjson_inline implementation() : simdjson::implementation("lasx", "LoongArch ASX", internal::instruction_set::LASX) {} + simdjson_inline implementation() : simdjson::implementation( + "rvv_vls", + "RISC-V V extension", + 0 + ) {} simdjson_warn_unused error_code create_dom_parser_implementation( size_t capacity, size_t max_length, - std::unique_ptr<internal::dom_parser_implementation>& dst + std::unique_ptr<simdjson::internal::dom_parser_implementation>& dst ) const noexcept final; simdjson_warn_unused error_code minify(const uint8_t *buf, size_t len, uint8_t *dst, size_t &dst_len) const noexcept final; simdjson_warn_unused bool validate_utf8(const char *buf, size_t len) const noexcept final; }; -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson -#endif // SIMDJSON_LASX_IMPLEMENTATION_H -/* end file simdjson/lasx/implementation.h */ +#endif // SIMDJSON_RVV_VLS_IMPLEMENTATION_H +/* end file simdjson/rvv-vls/implementation.h */ namespace simdjson { namespace internal { -static const simdjson::lasx::implementation* get_lasx_singleton() { - static const simdjson::lasx::implementation lasx_singleton{}; - return &lasx_singleton; +static const simdjson::rvv_vls::implementation* get_rvv_vls_singleton() { + static const simdjson::rvv_vls::implementation rvv_vls_singleton{}; + return &rvv_vls_singleton; } } // namespace internal } // namespace simdjson -#endif // SIMDJSON_IMPLEMENTATION_LASX +#endif // SIMDJSON_IMPLEMENTATION_RVV_VLS /* undefining SIMDJSON_CONDITIONAL_INCLUDE */ #undef SIMDJSON_CONDITIONAL_INCLUDE @@ -8531,10 +8640,10 @@ namespace internal { + SIMDJSON_IMPLEMENTATION_HASWELL + SIMDJSON_IMPLEMENTATION_WESTMERE \ + SIMDJSON_IMPLEMENTATION_ARM64 + SIMDJSON_IMPLEMENTATION_PPC64 \ + SIMDJSON_IMPLEMENTATION_LSX + SIMDJSON_IMPLEMENTATION_LASX \ - + SIMDJSON_IMPLEMENTATION_FALLBACK == 1) + + SIMDJSON_IMPLEMENTATION_RVV_VLS + SIMDJSON_IMPLEMENTATION_FALLBACK == 1) #if SIMDJSON_SINGLE_IMPLEMENTATION - static const implementation* get_single_implementation() { + simdjson_really_inline static const implementation* get_single_implementation() { return #if SIMDJSON_IMPLEMENTATION_ICELAKE get_icelake_singleton(); @@ -8557,6 +8666,9 @@ namespace internal { #if SIMDJSON_IMPLEMENTATION_LASX get_lasx_singleton(); #endif +#if SIMDJSON_IMPLEMENTATION_RVV_VLS + get_rvv_vls_singleton(); +#endif #if SIMDJSON_IMPLEMENTATION_FALLBACK get_fallback_singleton(); #endif @@ -8611,11 +8723,14 @@ static const std::initializer_list<const implementation *>& get_available_implem #if SIMDJSON_IMPLEMENTATION_PPC64 get_ppc64_singleton(), #endif +#if SIMDJSON_IMPLEMENTATION_LASX + get_lasx_singleton(), +#endif #if SIMDJSON_IMPLEMENTATION_LSX get_lsx_singleton(), #endif -#if SIMDJSON_IMPLEMENTATION_LASX - get_lasx_singleton(), +#if SIMDJSON_IMPLEMENTATION_RVV_VLS + get_rvv_vls_singleton(), #endif #if SIMDJSON_IMPLEMENTATION_FALLBACK get_fallback_singleton(), @@ -9458,6 +9573,7 @@ namespace { static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<T>); static_assert(NUM_CHUNKS == 4, "ARM kernel should use four registers per 64-byte block."); const simd8<T> chunks[NUM_CHUNKS]; + template<int idx> simd8<uint8_t> get() const { return idx < NUM_CHUNKS ? chunks[idx] : simd8<T>(); } simd8x64(const simd8x64<T>& o) = delete; // no copy allowed simd8x64<T>& operator=(const simd8<T>& other) = delete; // no assignment allowed @@ -9649,10 +9765,12 @@ simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *ds /* amalgamation skipped (editor-only): #include "simdjson/arm64/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_PPC64 */ /* amalgamation skipped (editor-only): #include "simdjson/ppc64/begin.h" */ -/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LSX */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LASX */ /* amalgamation skipped (editor-only): #include "simdjson/lasx/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LSX */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_RVV_VLS */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_FALLBACK */ /* amalgamation skipped (editor-only): #include "simdjson/fallback/begin.h" */ /* amalgamation skipped (editor-only): #else */ @@ -12334,6 +12452,7 @@ namespace { static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<T>); static_assert(NUM_CHUNKS == 4, "ARM kernel should use four registers per 64-byte block."); const simd8<T> chunks[NUM_CHUNKS]; + template<int idx> simd8<uint8_t> get() const { return idx < NUM_CHUNKS ? chunks[idx] : simd8<T>(); } simd8x64(const simd8x64<T>& o) = delete; // no copy allowed simd8x64<T>& operator=(const simd8<T>& other) = delete; // no assignment allowed @@ -13120,7 +13239,7 @@ using namespace simd; simdjson_inline simd8<uint8_t> is_incomplete(const simd8<uint8_t> input) { // If the previous input's last 3 bytes match this, they're too short (they ended at EOF): // ... 1111____ 111_____ 11______ -#if SIMDJSON_IMPLEMENTATION_ICELAKE +#if SIMDJSON_IMPLEMENTATION_ICELAKE || (SIMDJSON_IMPLEMENTATION_RVV_VLS && __riscv_v_fixed_vlen >= 512) static const uint8_t max_array[64] = { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, @@ -13181,18 +13300,18 @@ using namespace simd; || (simd8x64<uint8_t>::NUM_CHUNKS == 4), "We support one, two or four chunks per 64-byte block."); SIMDJSON_IF_CONSTEXPR (simd8x64<uint8_t>::NUM_CHUNKS == 1) { - this->check_utf8_bytes(input.chunks[0], this->prev_input_block); + this->check_utf8_bytes(input.get<0>(), this->prev_input_block); } else SIMDJSON_IF_CONSTEXPR (simd8x64<uint8_t>::NUM_CHUNKS == 2) { - this->check_utf8_bytes(input.chunks[0], this->prev_input_block); - this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + this->check_utf8_bytes(input.get<0>(), this->prev_input_block); + this->check_utf8_bytes(input.get<1>(), input.get<0>()); } else SIMDJSON_IF_CONSTEXPR (simd8x64<uint8_t>::NUM_CHUNKS == 4) { - this->check_utf8_bytes(input.chunks[0], this->prev_input_block); - this->check_utf8_bytes(input.chunks[1], input.chunks[0]); - this->check_utf8_bytes(input.chunks[2], input.chunks[1]); - this->check_utf8_bytes(input.chunks[3], input.chunks[2]); + this->check_utf8_bytes(input.get<0>(), this->prev_input_block); + this->check_utf8_bytes(input.get<1>(), input.get<0>()); + this->check_utf8_bytes(input.get<2>(), input.get<1>()); + this->check_utf8_bytes(input.get<3>(), input.get<2>()); } - this->prev_incomplete = is_incomplete(input.chunks[simd8x64<uint8_t>::NUM_CHUNKS-1]); - this->prev_input_block = input.chunks[simd8x64<uint8_t>::NUM_CHUNKS-1]; + this->prev_incomplete = is_incomplete(input.get<simd8x64<uint8_t>::NUM_CHUNKS-1>()); + this->prev_input_block = input.get<simd8x64<uint8_t>::NUM_CHUNKS-1>(); } } // do not forget to call check_eof! @@ -14066,6 +14185,9 @@ struct tape_writer { /** Write a double value to tape. */ simdjson_inline void append_double(double value) noexcept; + /** Write a big integer (as string) to tape. src points to first digit, len is byte count. */ + simdjson_inline void append_bigint(const uint8_t *src, size_t len, uint8_t *&string_buf) noexcept; + /** * Append a tape entry (an 8-bit type,and 56 bits worth of value). */ @@ -14149,6 +14271,18 @@ simdjson_inline void tape_writer::write(uint64_t &tape_loc, uint64_t val, intern tape_loc = val | ((uint64_t(char(t))) << 56); } +simdjson_inline void tape_writer::append_bigint(const uint8_t *src, size_t len, uint8_t *&string_buf) noexcept { + // Write to string buffer: [4-byte LE length][digits][null] + uint32_t str_len = uint32_t(len); + memcpy(string_buf, &str_len, sizeof(uint32_t)); + memcpy(string_buf + sizeof(uint32_t), src, len); + string_buf[sizeof(uint32_t) + len] = 0; + // Tape entry: offset into string buffer + // The caller must set the offset relative to doc.string_buf base + append(0, internal::tape_type::BIGINT); // placeholder offset, caller patches + string_buf += sizeof(uint32_t) + len + 1; +} + } // namespace stage2 } // unnamed namespace } // namespace arm64 @@ -15086,7 +15220,23 @@ simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_string( simdjson_warn_unused simdjson_inline error_code tape_builder::visit_number(json_iterator &iter, const uint8_t *value) noexcept { iter.log_value("number"); - return numberparsing::parse_number(value, tape); + error_code err = numberparsing::parse_number(value, tape); + if (simdjson_unlikely(err == BIGINT_ERROR && + iter.dom_parser._number_as_string)) { + // Write big integer to string buffer using the same format as strings. + // Scan digits the same way parse_number does (skip optional '-', then digits). + const uint8_t *p = value; + if (*p == '-') p++; + while (numberparsing::is_digit(*p)) p++; + size_t len = size_t(p - value); + tape.append(current_string_buf_loc - iter.dom_parser.doc->string_buf.get(), internal::tape_type::BIGINT); + uint8_t *dst = current_string_buf_loc + sizeof(uint32_t); + memcpy(dst, value, len); + dst += len; + on_end_string(dst); + return SUCCESS; + } + return err; } simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_number(json_iterator &iter, const uint8_t *value) noexcept { @@ -15972,6 +16122,7 @@ namespace simd { static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<T>); static_assert(NUM_CHUNKS == 2, "Haswell kernel should use two registers per 64-byte block."); const simd8<T> chunks[NUM_CHUNKS]; + template<int idx> simd8<uint8_t> get() const { return idx < NUM_CHUNKS ? chunks[idx] : simd8<T>(); } simd8x64(const simd8x64<T>& o) = delete; // no copy allowed simd8x64<T>& operator=(const simd8<T>& other) = delete; // no assignment allowed @@ -16147,10 +16298,12 @@ simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *ds /* amalgamation skipped (editor-only): #include "simdjson/arm64/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_PPC64 */ /* amalgamation skipped (editor-only): #include "simdjson/ppc64/begin.h" */ -/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LSX */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LASX */ /* amalgamation skipped (editor-only): #include "simdjson/lasx/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LSX */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_RVV_VLS */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_FALLBACK */ /* amalgamation skipped (editor-only): #include "simdjson/fallback/begin.h" */ /* amalgamation skipped (editor-only): #else */ @@ -18707,6 +18860,7 @@ namespace simd { static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<T>); static_assert(NUM_CHUNKS == 2, "Haswell kernel should use two registers per 64-byte block."); const simd8<T> chunks[NUM_CHUNKS]; + template<int idx> simd8<uint8_t> get() const { return idx < NUM_CHUNKS ? chunks[idx] : simd8<T>(); } simd8x64(const simd8x64<T>& o) = delete; // no copy allowed simd8x64<T>& operator=(const simd8<T>& other) = delete; // no assignment allowed @@ -19477,7 +19631,7 @@ using namespace simd; simdjson_inline simd8<uint8_t> is_incomplete(const simd8<uint8_t> input) { // If the previous input's last 3 bytes match this, they're too short (they ended at EOF): // ... 1111____ 111_____ 11______ -#if SIMDJSON_IMPLEMENTATION_ICELAKE +#if SIMDJSON_IMPLEMENTATION_ICELAKE || (SIMDJSON_IMPLEMENTATION_RVV_VLS && __riscv_v_fixed_vlen >= 512) static const uint8_t max_array[64] = { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, @@ -19538,18 +19692,18 @@ using namespace simd; || (simd8x64<uint8_t>::NUM_CHUNKS == 4), "We support one, two or four chunks per 64-byte block."); SIMDJSON_IF_CONSTEXPR (simd8x64<uint8_t>::NUM_CHUNKS == 1) { - this->check_utf8_bytes(input.chunks[0], this->prev_input_block); + this->check_utf8_bytes(input.get<0>(), this->prev_input_block); } else SIMDJSON_IF_CONSTEXPR (simd8x64<uint8_t>::NUM_CHUNKS == 2) { - this->check_utf8_bytes(input.chunks[0], this->prev_input_block); - this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + this->check_utf8_bytes(input.get<0>(), this->prev_input_block); + this->check_utf8_bytes(input.get<1>(), input.get<0>()); } else SIMDJSON_IF_CONSTEXPR (simd8x64<uint8_t>::NUM_CHUNKS == 4) { - this->check_utf8_bytes(input.chunks[0], this->prev_input_block); - this->check_utf8_bytes(input.chunks[1], input.chunks[0]); - this->check_utf8_bytes(input.chunks[2], input.chunks[1]); - this->check_utf8_bytes(input.chunks[3], input.chunks[2]); + this->check_utf8_bytes(input.get<0>(), this->prev_input_block); + this->check_utf8_bytes(input.get<1>(), input.get<0>()); + this->check_utf8_bytes(input.get<2>(), input.get<1>()); + this->check_utf8_bytes(input.get<3>(), input.get<2>()); } - this->prev_incomplete = is_incomplete(input.chunks[simd8x64<uint8_t>::NUM_CHUNKS-1]); - this->prev_input_block = input.chunks[simd8x64<uint8_t>::NUM_CHUNKS-1]; + this->prev_incomplete = is_incomplete(input.get<simd8x64<uint8_t>::NUM_CHUNKS-1>()); + this->prev_input_block = input.get<simd8x64<uint8_t>::NUM_CHUNKS-1>(); } } // do not forget to call check_eof! @@ -20423,6 +20577,9 @@ struct tape_writer { /** Write a double value to tape. */ simdjson_inline void append_double(double value) noexcept; + /** Write a big integer (as string) to tape. src points to first digit, len is byte count. */ + simdjson_inline void append_bigint(const uint8_t *src, size_t len, uint8_t *&string_buf) noexcept; + /** * Append a tape entry (an 8-bit type,and 56 bits worth of value). */ @@ -20506,6 +20663,18 @@ simdjson_inline void tape_writer::write(uint64_t &tape_loc, uint64_t val, intern tape_loc = val | ((uint64_t(char(t))) << 56); } +simdjson_inline void tape_writer::append_bigint(const uint8_t *src, size_t len, uint8_t *&string_buf) noexcept { + // Write to string buffer: [4-byte LE length][digits][null] + uint32_t str_len = uint32_t(len); + memcpy(string_buf, &str_len, sizeof(uint32_t)); + memcpy(string_buf + sizeof(uint32_t), src, len); + string_buf[sizeof(uint32_t) + len] = 0; + // Tape entry: offset into string buffer + // The caller must set the offset relative to doc.string_buf base + append(0, internal::tape_type::BIGINT); // placeholder offset, caller patches + string_buf += sizeof(uint32_t) + len + 1; +} + } // namespace stage2 } // unnamed namespace } // namespace haswell @@ -21443,7 +21612,23 @@ simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_string( simdjson_warn_unused simdjson_inline error_code tape_builder::visit_number(json_iterator &iter, const uint8_t *value) noexcept { iter.log_value("number"); - return numberparsing::parse_number(value, tape); + error_code err = numberparsing::parse_number(value, tape); + if (simdjson_unlikely(err == BIGINT_ERROR && + iter.dom_parser._number_as_string)) { + // Write big integer to string buffer using the same format as strings. + // Scan digits the same way parse_number does (skip optional '-', then digits). + const uint8_t *p = value; + if (*p == '-') p++; + while (numberparsing::is_digit(*p)) p++; + size_t len = size_t(p - value); + tape.append(current_string_buf_loc - iter.dom_parser.doc->string_buf.get(), internal::tape_type::BIGINT); + uint8_t *dst = current_string_buf_loc + sizeof(uint32_t); + memcpy(dst, value, len); + dst += len; + on_end_string(dst); + return SUCCESS; + } + return err; } simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_number(json_iterator &iter, const uint8_t *value) noexcept { @@ -22280,6 +22465,7 @@ namespace simd { static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<T>); static_assert(NUM_CHUNKS == 1, "Icelake kernel should use one register per 64-byte block."); const simd8<T> chunks[NUM_CHUNKS]; + template<int idx> simd8<uint8_t> get() const { return idx < NUM_CHUNKS ? chunks[idx] : simd8<T>(); } simd8x64(const simd8x64<T>& o) = delete; // no copy allowed simd8x64<T>& operator=(const simd8<T>& other) = delete; // no assignment allowed @@ -22500,10 +22686,12 @@ simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t /* amalgamation skipped (editor-only): #include "simdjson/arm64/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_PPC64 */ /* amalgamation skipped (editor-only): #include "simdjson/ppc64/begin.h" */ -/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LSX */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LASX */ /* amalgamation skipped (editor-only): #include "simdjson/lasx/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LSX */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_RVV_VLS */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_FALLBACK */ /* amalgamation skipped (editor-only): #include "simdjson/fallback/begin.h" */ /* amalgamation skipped (editor-only): #else */ @@ -25014,6 +25202,7 @@ namespace simd { static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<T>); static_assert(NUM_CHUNKS == 1, "Icelake kernel should use one register per 64-byte block."); const simd8<T> chunks[NUM_CHUNKS]; + template<int idx> simd8<uint8_t> get() const { return idx < NUM_CHUNKS ? chunks[idx] : simd8<T>(); } simd8x64(const simd8x64<T>& o) = delete; // no copy allowed simd8x64<T>& operator=(const simd8<T>& other) = delete; // no assignment allowed @@ -25829,7 +26018,7 @@ using namespace simd; simdjson_inline simd8<uint8_t> is_incomplete(const simd8<uint8_t> input) { // If the previous input's last 3 bytes match this, they're too short (they ended at EOF): // ... 1111____ 111_____ 11______ -#if SIMDJSON_IMPLEMENTATION_ICELAKE +#if SIMDJSON_IMPLEMENTATION_ICELAKE || (SIMDJSON_IMPLEMENTATION_RVV_VLS && __riscv_v_fixed_vlen >= 512) static const uint8_t max_array[64] = { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, @@ -25890,18 +26079,18 @@ using namespace simd; || (simd8x64<uint8_t>::NUM_CHUNKS == 4), "We support one, two or four chunks per 64-byte block."); SIMDJSON_IF_CONSTEXPR (simd8x64<uint8_t>::NUM_CHUNKS == 1) { - this->check_utf8_bytes(input.chunks[0], this->prev_input_block); + this->check_utf8_bytes(input.get<0>(), this->prev_input_block); } else SIMDJSON_IF_CONSTEXPR (simd8x64<uint8_t>::NUM_CHUNKS == 2) { - this->check_utf8_bytes(input.chunks[0], this->prev_input_block); - this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + this->check_utf8_bytes(input.get<0>(), this->prev_input_block); + this->check_utf8_bytes(input.get<1>(), input.get<0>()); } else SIMDJSON_IF_CONSTEXPR (simd8x64<uint8_t>::NUM_CHUNKS == 4) { - this->check_utf8_bytes(input.chunks[0], this->prev_input_block); - this->check_utf8_bytes(input.chunks[1], input.chunks[0]); - this->check_utf8_bytes(input.chunks[2], input.chunks[1]); - this->check_utf8_bytes(input.chunks[3], input.chunks[2]); + this->check_utf8_bytes(input.get<0>(), this->prev_input_block); + this->check_utf8_bytes(input.get<1>(), input.get<0>()); + this->check_utf8_bytes(input.get<2>(), input.get<1>()); + this->check_utf8_bytes(input.get<3>(), input.get<2>()); } - this->prev_incomplete = is_incomplete(input.chunks[simd8x64<uint8_t>::NUM_CHUNKS-1]); - this->prev_input_block = input.chunks[simd8x64<uint8_t>::NUM_CHUNKS-1]; + this->prev_incomplete = is_incomplete(input.get<simd8x64<uint8_t>::NUM_CHUNKS-1>()); + this->prev_input_block = input.get<simd8x64<uint8_t>::NUM_CHUNKS-1>(); } } // do not forget to call check_eof! @@ -26775,6 +26964,9 @@ struct tape_writer { /** Write a double value to tape. */ simdjson_inline void append_double(double value) noexcept; + /** Write a big integer (as string) to tape. src points to first digit, len is byte count. */ + simdjson_inline void append_bigint(const uint8_t *src, size_t len, uint8_t *&string_buf) noexcept; + /** * Append a tape entry (an 8-bit type,and 56 bits worth of value). */ @@ -26858,6 +27050,18 @@ simdjson_inline void tape_writer::write(uint64_t &tape_loc, uint64_t val, intern tape_loc = val | ((uint64_t(char(t))) << 56); } +simdjson_inline void tape_writer::append_bigint(const uint8_t *src, size_t len, uint8_t *&string_buf) noexcept { + // Write to string buffer: [4-byte LE length][digits][null] + uint32_t str_len = uint32_t(len); + memcpy(string_buf, &str_len, sizeof(uint32_t)); + memcpy(string_buf + sizeof(uint32_t), src, len); + string_buf[sizeof(uint32_t) + len] = 0; + // Tape entry: offset into string buffer + // The caller must set the offset relative to doc.string_buf base + append(0, internal::tape_type::BIGINT); // placeholder offset, caller patches + string_buf += sizeof(uint32_t) + len + 1; +} + } // namespace stage2 } // unnamed namespace } // namespace icelake @@ -27795,7 +27999,23 @@ simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_string( simdjson_warn_unused simdjson_inline error_code tape_builder::visit_number(json_iterator &iter, const uint8_t *value) noexcept { iter.log_value("number"); - return numberparsing::parse_number(value, tape); + error_code err = numberparsing::parse_number(value, tape); + if (simdjson_unlikely(err == BIGINT_ERROR && + iter.dom_parser._number_as_string)) { + // Write big integer to string buffer using the same format as strings. + // Scan digits the same way parse_number does (skip optional '-', then digits). + const uint8_t *p = value; + if (*p == '-') p++; + while (numberparsing::is_digit(*p)) p++; + size_t len = size_t(p - value); + tape.append(current_string_buf_loc - iter.dom_parser.doc->string_buf.get(), internal::tape_type::BIGINT); + uint8_t *dst = current_string_buf_loc + sizeof(uint32_t); + memcpy(dst, value, len); + dst += len; + on_end_string(dst); + return SUCCESS; + } + return err; } simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_number(json_iterator &iter, const uint8_t *value) noexcept { @@ -28812,6 +29032,7 @@ template <typename T> struct simd8x64 { static_assert(NUM_CHUNKS == 4, "PPC64 kernel should use four registers per 64-byte block."); const simd8<T> chunks[NUM_CHUNKS]; + template<int idx> simd8<uint8_t> get() const { return idx < NUM_CHUNKS ? chunks[idx] : simd8<T>(); } simd8x64(const simd8x64<T> &o) = delete; // no copy allowed simd8x64<T> & @@ -29010,10 +29231,12 @@ simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *ds /* amalgamation skipped (editor-only): #include "simdjson/arm64/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_PPC64 */ /* amalgamation skipped (editor-only): #include "simdjson/ppc64/begin.h" */ -/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LSX */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LASX */ /* amalgamation skipped (editor-only): #include "simdjson/lasx/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LSX */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_RVV_VLS */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_FALLBACK */ /* amalgamation skipped (editor-only): #include "simdjson/fallback/begin.h" */ /* amalgamation skipped (editor-only): #else */ @@ -31659,6 +31882,7 @@ template <typename T> struct simd8x64 { static_assert(NUM_CHUNKS == 4, "PPC64 kernel should use four registers per 64-byte block."); const simd8<T> chunks[NUM_CHUNKS]; + template<int idx> simd8<uint8_t> get() const { return idx < NUM_CHUNKS ? chunks[idx] : simd8<T>(); } simd8x64(const simd8x64<T> &o) = delete; // no copy allowed simd8x64<T> & @@ -32452,7 +32676,7 @@ using namespace simd; simdjson_inline simd8<uint8_t> is_incomplete(const simd8<uint8_t> input) { // If the previous input's last 3 bytes match this, they're too short (they ended at EOF): // ... 1111____ 111_____ 11______ -#if SIMDJSON_IMPLEMENTATION_ICELAKE +#if SIMDJSON_IMPLEMENTATION_ICELAKE || (SIMDJSON_IMPLEMENTATION_RVV_VLS && __riscv_v_fixed_vlen >= 512) static const uint8_t max_array[64] = { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, @@ -32513,18 +32737,18 @@ using namespace simd; || (simd8x64<uint8_t>::NUM_CHUNKS == 4), "We support one, two or four chunks per 64-byte block."); SIMDJSON_IF_CONSTEXPR (simd8x64<uint8_t>::NUM_CHUNKS == 1) { - this->check_utf8_bytes(input.chunks[0], this->prev_input_block); + this->check_utf8_bytes(input.get<0>(), this->prev_input_block); } else SIMDJSON_IF_CONSTEXPR (simd8x64<uint8_t>::NUM_CHUNKS == 2) { - this->check_utf8_bytes(input.chunks[0], this->prev_input_block); - this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + this->check_utf8_bytes(input.get<0>(), this->prev_input_block); + this->check_utf8_bytes(input.get<1>(), input.get<0>()); } else SIMDJSON_IF_CONSTEXPR (simd8x64<uint8_t>::NUM_CHUNKS == 4) { - this->check_utf8_bytes(input.chunks[0], this->prev_input_block); - this->check_utf8_bytes(input.chunks[1], input.chunks[0]); - this->check_utf8_bytes(input.chunks[2], input.chunks[1]); - this->check_utf8_bytes(input.chunks[3], input.chunks[2]); + this->check_utf8_bytes(input.get<0>(), this->prev_input_block); + this->check_utf8_bytes(input.get<1>(), input.get<0>()); + this->check_utf8_bytes(input.get<2>(), input.get<1>()); + this->check_utf8_bytes(input.get<3>(), input.get<2>()); } - this->prev_incomplete = is_incomplete(input.chunks[simd8x64<uint8_t>::NUM_CHUNKS-1]); - this->prev_input_block = input.chunks[simd8x64<uint8_t>::NUM_CHUNKS-1]; + this->prev_incomplete = is_incomplete(input.get<simd8x64<uint8_t>::NUM_CHUNKS-1>()); + this->prev_input_block = input.get<simd8x64<uint8_t>::NUM_CHUNKS-1>(); } } // do not forget to call check_eof! @@ -33398,6 +33622,9 @@ struct tape_writer { /** Write a double value to tape. */ simdjson_inline void append_double(double value) noexcept; + /** Write a big integer (as string) to tape. src points to first digit, len is byte count. */ + simdjson_inline void append_bigint(const uint8_t *src, size_t len, uint8_t *&string_buf) noexcept; + /** * Append a tape entry (an 8-bit type,and 56 bits worth of value). */ @@ -33481,6 +33708,18 @@ simdjson_inline void tape_writer::write(uint64_t &tape_loc, uint64_t val, intern tape_loc = val | ((uint64_t(char(t))) << 56); } +simdjson_inline void tape_writer::append_bigint(const uint8_t *src, size_t len, uint8_t *&string_buf) noexcept { + // Write to string buffer: [4-byte LE length][digits][null] + uint32_t str_len = uint32_t(len); + memcpy(string_buf, &str_len, sizeof(uint32_t)); + memcpy(string_buf + sizeof(uint32_t), src, len); + string_buf[sizeof(uint32_t) + len] = 0; + // Tape entry: offset into string buffer + // The caller must set the offset relative to doc.string_buf base + append(0, internal::tape_type::BIGINT); // placeholder offset, caller patches + string_buf += sizeof(uint32_t) + len + 1; +} + } // namespace stage2 } // unnamed namespace } // namespace ppc64 @@ -34418,7 +34657,23 @@ simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_string( simdjson_warn_unused simdjson_inline error_code tape_builder::visit_number(json_iterator &iter, const uint8_t *value) noexcept { iter.log_value("number"); - return numberparsing::parse_number(value, tape); + error_code err = numberparsing::parse_number(value, tape); + if (simdjson_unlikely(err == BIGINT_ERROR && + iter.dom_parser._number_as_string)) { + // Write big integer to string buffer using the same format as strings. + // Scan digits the same way parse_number does (skip optional '-', then digits). + const uint8_t *p = value; + if (*p == '-') p++; + while (numberparsing::is_digit(*p)) p++; + size_t len = size_t(p - value); + tape.append(current_string_buf_loc - iter.dom_parser.doc->string_buf.get(), internal::tape_type::BIGINT); + uint8_t *dst = current_string_buf_loc + sizeof(uint32_t); + memcpy(dst, value, len); + dst += len; + on_end_string(dst); + return SUCCESS; + } + return err; } simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_number(json_iterator &iter, const uint8_t *value) noexcept { @@ -35283,6 +35538,7 @@ namespace simd { static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<T>); static_assert(NUM_CHUNKS == 4, "Westmere kernel should use four registers per 64-byte block."); const simd8<T> chunks[NUM_CHUNKS]; + template<int idx> simd8<uint8_t> get() const { return idx < NUM_CHUNKS ? chunks[idx] : simd8<T>(); } simd8x64(const simd8x64<T>& o) = delete; // no copy allowed simd8x64<T>& operator=(const simd8<T>& other) = delete; // no assignment allowed @@ -35711,6 +35967,7 @@ namespace simd { static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<T>); static_assert(NUM_CHUNKS == 4, "Westmere kernel should use four registers per 64-byte block."); const simd8<T> chunks[NUM_CHUNKS]; + template<int idx> simd8<uint8_t> get() const { return idx < NUM_CHUNKS ? chunks[idx] : simd8<T>(); } simd8x64(const simd8x64<T>& o) = delete; // no copy allowed simd8x64<T>& operator=(const simd8<T>& other) = delete; // no assignment allowed @@ -35879,10 +36136,12 @@ simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *ds /* amalgamation skipped (editor-only): #include "simdjson/arm64/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_PPC64 */ /* amalgamation skipped (editor-only): #include "simdjson/ppc64/begin.h" */ -/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LSX */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LASX */ /* amalgamation skipped (editor-only): #include "simdjson/lasx/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LSX */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_RVV_VLS */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_FALLBACK */ /* amalgamation skipped (editor-only): #include "simdjson/fallback/begin.h" */ /* amalgamation skipped (editor-only): #else */ @@ -38444,6 +38703,7 @@ namespace simd { static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<T>); static_assert(NUM_CHUNKS == 4, "Westmere kernel should use four registers per 64-byte block."); const simd8<T> chunks[NUM_CHUNKS]; + template<int idx> simd8<uint8_t> get() const { return idx < NUM_CHUNKS ? chunks[idx] : simd8<T>(); } simd8x64(const simd8x64<T>& o) = delete; // no copy allowed simd8x64<T>& operator=(const simd8<T>& other) = delete; // no assignment allowed @@ -38872,6 +39132,7 @@ namespace simd { static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<T>); static_assert(NUM_CHUNKS == 4, "Westmere kernel should use four registers per 64-byte block."); const simd8<T> chunks[NUM_CHUNKS]; + template<int idx> simd8<uint8_t> get() const { return idx < NUM_CHUNKS ? chunks[idx] : simd8<T>(); } simd8x64(const simd8x64<T>& o) = delete; // no copy allowed simd8x64<T>& operator=(const simd8<T>& other) = delete; // no assignment allowed @@ -39635,7 +39896,7 @@ using namespace simd; simdjson_inline simd8<uint8_t> is_incomplete(const simd8<uint8_t> input) { // If the previous input's last 3 bytes match this, they're too short (they ended at EOF): // ... 1111____ 111_____ 11______ -#if SIMDJSON_IMPLEMENTATION_ICELAKE +#if SIMDJSON_IMPLEMENTATION_ICELAKE || (SIMDJSON_IMPLEMENTATION_RVV_VLS && __riscv_v_fixed_vlen >= 512) static const uint8_t max_array[64] = { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, @@ -39696,18 +39957,18 @@ using namespace simd; || (simd8x64<uint8_t>::NUM_CHUNKS == 4), "We support one, two or four chunks per 64-byte block."); SIMDJSON_IF_CONSTEXPR (simd8x64<uint8_t>::NUM_CHUNKS == 1) { - this->check_utf8_bytes(input.chunks[0], this->prev_input_block); + this->check_utf8_bytes(input.get<0>(), this->prev_input_block); } else SIMDJSON_IF_CONSTEXPR (simd8x64<uint8_t>::NUM_CHUNKS == 2) { - this->check_utf8_bytes(input.chunks[0], this->prev_input_block); - this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + this->check_utf8_bytes(input.get<0>(), this->prev_input_block); + this->check_utf8_bytes(input.get<1>(), input.get<0>()); } else SIMDJSON_IF_CONSTEXPR (simd8x64<uint8_t>::NUM_CHUNKS == 4) { - this->check_utf8_bytes(input.chunks[0], this->prev_input_block); - this->check_utf8_bytes(input.chunks[1], input.chunks[0]); - this->check_utf8_bytes(input.chunks[2], input.chunks[1]); - this->check_utf8_bytes(input.chunks[3], input.chunks[2]); + this->check_utf8_bytes(input.get<0>(), this->prev_input_block); + this->check_utf8_bytes(input.get<1>(), input.get<0>()); + this->check_utf8_bytes(input.get<2>(), input.get<1>()); + this->check_utf8_bytes(input.get<3>(), input.get<2>()); } - this->prev_incomplete = is_incomplete(input.chunks[simd8x64<uint8_t>::NUM_CHUNKS-1]); - this->prev_input_block = input.chunks[simd8x64<uint8_t>::NUM_CHUNKS-1]; + this->prev_incomplete = is_incomplete(input.get<simd8x64<uint8_t>::NUM_CHUNKS-1>()); + this->prev_input_block = input.get<simd8x64<uint8_t>::NUM_CHUNKS-1>(); } } // do not forget to call check_eof! @@ -40581,6 +40842,9 @@ struct tape_writer { /** Write a double value to tape. */ simdjson_inline void append_double(double value) noexcept; + /** Write a big integer (as string) to tape. src points to first digit, len is byte count. */ + simdjson_inline void append_bigint(const uint8_t *src, size_t len, uint8_t *&string_buf) noexcept; + /** * Append a tape entry (an 8-bit type,and 56 bits worth of value). */ @@ -40664,6 +40928,18 @@ simdjson_inline void tape_writer::write(uint64_t &tape_loc, uint64_t val, intern tape_loc = val | ((uint64_t(char(t))) << 56); } +simdjson_inline void tape_writer::append_bigint(const uint8_t *src, size_t len, uint8_t *&string_buf) noexcept { + // Write to string buffer: [4-byte LE length][digits][null] + uint32_t str_len = uint32_t(len); + memcpy(string_buf, &str_len, sizeof(uint32_t)); + memcpy(string_buf + sizeof(uint32_t), src, len); + string_buf[sizeof(uint32_t) + len] = 0; + // Tape entry: offset into string buffer + // The caller must set the offset relative to doc.string_buf base + append(0, internal::tape_type::BIGINT); // placeholder offset, caller patches + string_buf += sizeof(uint32_t) + len + 1; +} + } // namespace stage2 } // unnamed namespace } // namespace westmere @@ -41601,7 +41877,23 @@ simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_string( simdjson_warn_unused simdjson_inline error_code tape_builder::visit_number(json_iterator &iter, const uint8_t *value) noexcept { iter.log_value("number"); - return numberparsing::parse_number(value, tape); + error_code err = numberparsing::parse_number(value, tape); + if (simdjson_unlikely(err == BIGINT_ERROR && + iter.dom_parser._number_as_string)) { + // Write big integer to string buffer using the same format as strings. + // Scan digits the same way parse_number does (skip optional '-', then digits). + const uint8_t *p = value; + if (*p == '-') p++; + while (numberparsing::is_digit(*p)) p++; + size_t len = size_t(p - value); + tape.append(current_string_buf_loc - iter.dom_parser.doc->string_buf.get(), internal::tape_type::BIGINT); + uint8_t *dst = current_string_buf_loc + sizeof(uint32_t); + memcpy(dst, value, len); + dst += len; + on_end_string(dst); + return SUCCESS; + } + return err; } simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_number(json_iterator &iter, const uint8_t *value) noexcept { @@ -41900,29 +42192,36 @@ SIMDJSON_UNTARGET_REGION #endif // SIMDJSON_SRC_WESTMERE_CPP /* end file westmere.cpp */ #endif -#if SIMDJSON_IMPLEMENTATION_LSX -/* including lsx.cpp: #include <lsx.cpp> */ -/* begin file lsx.cpp */ -#ifndef SIMDJSON_SRC_LSX_CPP -#define SIMDJSON_SRC_LSX_CPP +#if SIMDJSON_IMPLEMENTATION_LASX +/* including lasx.cpp: #include <lasx.cpp> */ +/* begin file lasx.cpp */ +#ifndef SIMDJSON_SRC_LASX_CPP +#define SIMDJSON_SRC_LASX_CPP /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ /* amalgamation skipped (editor-only): #include <base.h> */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -/* including simdjson/lsx.h: #include <simdjson/lsx.h> */ -/* begin file simdjson/lsx.h */ -#ifndef SIMDJSON_LSX_H -#define SIMDJSON_LSX_H +/* including simdjson/lasx.h: #include <simdjson/lasx.h> */ +/* begin file simdjson/lasx.h */ +#ifndef SIMDJSON_LASX_H +#define SIMDJSON_LASX_H -/* including simdjson/lsx/begin.h: #include "simdjson/lsx/begin.h" */ -/* begin file simdjson/lsx/begin.h */ -/* defining SIMDJSON_IMPLEMENTATION to "lsx" */ -#define SIMDJSON_IMPLEMENTATION lsx -/* including simdjson/lsx/base.h: #include "simdjson/lsx/base.h" */ -/* begin file simdjson/lsx/base.h */ -#ifndef SIMDJSON_LSX_BASE_H -#define SIMDJSON_LSX_BASE_H +/* including simdjson/lasx/begin.h: #include "simdjson/lasx/begin.h" */ +/* begin file simdjson/lasx/begin.h */ +/* defining SIMDJSON_IMPLEMENTATION to "lasx" */ +#define SIMDJSON_IMPLEMENTATION lasx +#include <lsxintrin.h> // This is a hack. We should not need to put this include here. +#if SIMDJSON_CAN_ALWAYS_RUN_LASX +// nothing needed. +#else +SIMDJSON_TARGET_REGION("lasx,lsx") +#endif + +/* including simdjson/lasx/base.h: #include "simdjson/lasx/base.h" */ +/* begin file simdjson/lasx/base.h */ +#ifndef SIMDJSON_LASX_BASE_H +#define SIMDJSON_LASX_BASE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ /* amalgamation skipped (editor-only): #include "simdjson/base.h" */ @@ -41930,9 +42229,9 @@ SIMDJSON_UNTARGET_REGION namespace simdjson { /** - * Implementation for LSX. + * Implementation for LASX. */ -namespace lsx { +namespace lasx { class implementation; @@ -41943,41 +42242,40 @@ template <typename T> struct simd8x64; } // namespace simd } // unnamed namespace -} // namespace lsx +} // namespace lasx } // namespace simdjson -#endif // SIMDJSON_LSX_BASE_H -/* end file simdjson/lsx/base.h */ -/* including simdjson/lsx/intrinsics.h: #include "simdjson/lsx/intrinsics.h" */ -/* begin file simdjson/lsx/intrinsics.h */ -#ifndef SIMDJSON_LSX_INTRINSICS_H -#define SIMDJSON_LSX_INTRINSICS_H +#endif // SIMDJSON_LASX_BASE_H +/* end file simdjson/lasx/base.h */ +/* including simdjson/lasx/intrinsics.h: #include "simdjson/lasx/intrinsics.h" */ +/* begin file simdjson/lasx/intrinsics.h */ +#ifndef SIMDJSON_LASX_INTRINSICS_H +#define SIMDJSON_LASX_INTRINSICS_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -// This should be the correct header whether -// you use visual studio or other compilers. #include <lsxintrin.h> +#include <lasxintrin.h> -static_assert(sizeof(__m128i) <= simdjson::SIMDJSON_PADDING, "insufficient padding for LoongArch SX"); +static_assert(sizeof(__m256i) <= simdjson::SIMDJSON_PADDING, "insufficient padding for LoongArch ASX"); -#endif // SIMDJSON_LSX_INTRINSICS_H -/* end file simdjson/lsx/intrinsics.h */ -/* including simdjson/lsx/bitmanipulation.h: #include "simdjson/lsx/bitmanipulation.h" */ -/* begin file simdjson/lsx/bitmanipulation.h */ -#ifndef SIMDJSON_LSX_BITMANIPULATION_H -#define SIMDJSON_LSX_BITMANIPULATION_H +#endif // SIMDJSON_LASX_INTRINSICS_H +/* end file simdjson/lasx/intrinsics.h */ +/* including simdjson/lasx/bitmanipulation.h: #include "simdjson/lasx/bitmanipulation.h" */ +/* begin file simdjson/lasx/bitmanipulation.h */ +#ifndef SIMDJSON_LASX_BITMANIPULATION_H +#define SIMDJSON_LASX_BITMANIPULATION_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/intrinsics.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/bitmask.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/intrinsics.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/bitmask.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace { // We sometimes call trailing_zero on inputs that are zero, @@ -42004,7 +42302,7 @@ simdjson_inline int leading_zeroes(uint64_t input_num) { /* result might be undefined when input_num is zero */ simdjson_inline int count_ones(uint64_t input_num) { - return __lsx_vpickve2gr_w(__lsx_vpcnt_d(__m128i(v2u64{input_num, 0})), 0); + return __lasx_xvpickve2gr_w(__lasx_xvpcnt_d(__m256i(v4u64{input_num, 0, 0, 0})), 0); } simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2, uint64_t *result) { @@ -42013,22 +42311,22 @@ simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2, uint64_t *re } } // unnamed namespace -} // namespace lsx +} // namespace lasx } // namespace simdjson -#endif // SIMDJSON_LSX_BITMANIPULATION_H -/* end file simdjson/lsx/bitmanipulation.h */ -/* including simdjson/lsx/bitmask.h: #include "simdjson/lsx/bitmask.h" */ -/* begin file simdjson/lsx/bitmask.h */ -#ifndef SIMDJSON_LSX_BITMASK_H -#define SIMDJSON_LSX_BITMASK_H +#endif // SIMDJSON_LASX_BITMANIPULATION_H +/* end file simdjson/lasx/bitmanipulation.h */ +/* including simdjson/lasx/bitmask.h: #include "simdjson/lasx/bitmask.h" */ +/* begin file simdjson/lasx/bitmask.h */ +#ifndef SIMDJSON_LASX_BITMASK_H +#define SIMDJSON_LASX_BITMASK_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace { // @@ -42047,26 +42345,26 @@ simdjson_inline uint64_t prefix_xor(uint64_t bitmask) { } } // unnamed namespace -} // namespace lsx +} // namespace lasx } // namespace simdjson #endif -/* end file simdjson/lsx/bitmask.h */ -/* including simdjson/lsx/numberparsing_defs.h: #include "simdjson/lsx/numberparsing_defs.h" */ -/* begin file simdjson/lsx/numberparsing_defs.h */ -#ifndef SIMDJSON_LSX_NUMBERPARSING_DEFS_H -#define SIMDJSON_LSX_NUMBERPARSING_DEFS_H +/* end file simdjson/lasx/bitmask.h */ +/* including simdjson/lasx/numberparsing_defs.h: #include "simdjson/lasx/numberparsing_defs.h" */ +/* begin file simdjson/lasx/numberparsing_defs.h */ +#ifndef SIMDJSON_LASX_NUMBERPARSING_DEFS_H +#define SIMDJSON_LASX_NUMBERPARSING_DEFS_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/intrinsics.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/intrinsics.h" */ /* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ #include <cstring> namespace simdjson { -namespace lsx { +namespace lasx { namespace numberparsing { // we don't have appropriate instructions, so let us use a scalar function @@ -42089,7 +42387,7 @@ simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t } } // namespace numberparsing -} // namespace lsx +} // namespace lasx } // namespace simdjson #ifndef SIMDJSON_SWAR_NUMBER_PARSING @@ -42100,46 +42398,46 @@ simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t #endif #endif -#endif // SIMDJSON_LSX_NUMBERPARSING_DEFS_H -/* end file simdjson/lsx/numberparsing_defs.h */ -/* including simdjson/lsx/simd.h: #include "simdjson/lsx/simd.h" */ -/* begin file simdjson/lsx/simd.h */ -#ifndef SIMDJSON_LSX_SIMD_H -#define SIMDJSON_LSX_SIMD_H +#endif // SIMDJSON_LASX_NUMBERPARSING_DEFS_H +/* end file simdjson/lasx/numberparsing_defs.h */ +/* including simdjson/lasx/simd.h: #include "simdjson/lasx/simd.h" */ +/* begin file simdjson/lasx/simd.h */ +#ifndef SIMDJSON_LASX_SIMD_H +#define SIMDJSON_LASX_SIMD_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/bitmanipulation.h" */ /* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace { namespace simd { // Forward-declared so they can be used by splat and friends. template<typename Child> struct base { - __m128i value; + __m256i value; // Zero constructor - simdjson_inline base() : value{__m128i()} {} + simdjson_inline base() : value{__m256i()} {} // Conversion from SIMD register - simdjson_inline base(const __m128i _value) : value(_value) {} + simdjson_inline base(const __m256i _value) : value(_value) {} // Conversion to SIMD register - simdjson_inline operator const __m128i&() const { return this->value; } - simdjson_inline operator __m128i&() { return this->value; } - simdjson_inline operator const v16i8&() const { return (v16i8&)this->value; } - simdjson_inline operator v16i8&() { return (v16i8&)this->value; } + simdjson_inline operator const __m256i&() const { return this->value; } + simdjson_inline operator __m256i&() { return this->value; } + simdjson_inline operator const v32i8&() const { return (v32i8&)this->value; } + simdjson_inline operator v32i8&() { return (v32i8&)this->value; } // Bit operations - simdjson_inline Child operator|(const Child other) const { return __lsx_vor_v(*this, other); } - simdjson_inline Child operator&(const Child other) const { return __lsx_vand_v(*this, other); } - simdjson_inline Child operator^(const Child other) const { return __lsx_vxor_v(*this, other); } - simdjson_inline Child bit_andnot(const Child other) const { return __lsx_vandn_v(other, *this); } + simdjson_inline Child operator|(const Child other) const { return __lasx_xvor_v(*this, other); } + simdjson_inline Child operator&(const Child other) const { return __lasx_xvand_v(*this, other); } + simdjson_inline Child operator^(const Child other) const { return __lasx_xvxor_v(*this, other); } + simdjson_inline Child bit_andnot(const Child other) const { return __lasx_xvandn_v(other, *this); } simdjson_inline Child& operator|=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast | other; return *this_cast; } simdjson_inline Child& operator&=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast & other; return *this_cast; } simdjson_inline Child& operator^=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast ^ other; return *this_cast; } @@ -42152,41 +42450,51 @@ namespace simd { template<typename T, typename Mask=simd8<bool>> struct base8: base<simd8<T>> { simdjson_inline base8() : base<simd8<T>>() {} - simdjson_inline base8(const __m128i _value) : base<simd8<T>>(_value) {} + simdjson_inline base8(const __m256i _value) : base<simd8<T>>(_value) {} - friend simdjson_really_inline Mask operator==(const simd8<T> lhs, const simd8<T> rhs) { return __lsx_vseq_b(lhs, rhs); } + friend simdjson_really_inline Mask operator==(const simd8<T> lhs, const simd8<T> rhs) { return __lasx_xvseq_b(lhs, rhs); } static const int SIZE = sizeof(base<simd8<T>>::value); template<int N=1> simdjson_inline simd8<T> prev(const simd8<T> prev_chunk) const { - return __lsx_vor_v(__lsx_vbsll_v(*this, N), __lsx_vbsrl_v(prev_chunk, 16 - N)); + __m256i hi = __lasx_xvbsll_v(*this, N); + __m256i lo = __lasx_xvbsrl_v(*this, 16 - N); + __m256i tmp = __lasx_xvbsrl_v(prev_chunk, 16 - N); + lo = __lasx_xvpermi_q(lo, tmp, 0x21); + return __lasx_xvor_v(hi, lo); } }; // SIMD byte mask type (returned by things like eq and gt) template<> struct simd8<bool>: base8<bool> { - static simdjson_inline simd8<bool> splat(bool _value) { - return __lsx_vreplgr2vr_b(uint8_t(-(!!_value))); - } + static simdjson_inline simd8<bool> splat(bool _value) { return __lasx_xvreplgr2vr_b(uint8_t(-(!!_value))); } simdjson_inline simd8() : base8() {} - simdjson_inline simd8(const __m128i _value) : base8<bool>(_value) {} + simdjson_inline simd8(const __m256i _value) : base8<bool>(_value) {} // Splat constructor simdjson_inline simd8(bool _value) : base8<bool>(splat(_value)) {} - simdjson_inline int to_bitmask() const { return __lsx_vpickve2gr_w(__lsx_vmskltz_b(*this), 0); } - simdjson_inline bool any() const { return 0 == __lsx_vpickve2gr_hu(__lsx_vmsknz_b(*this), 0); } + simdjson_inline int to_bitmask() const { + __m256i mask = __lasx_xvmskltz_b(*this); + return (__lasx_xvpickve2gr_w(mask, 4) << 16) | (__lasx_xvpickve2gr_w(mask, 0)); + } + simdjson_inline bool any() const { + __m256i v = __lasx_xvmsknz_b(*this); + return (0 == __lasx_xvpickve2gr_w(v, 0)) && (0 == __lasx_xvpickve2gr_w(v, 4)); + } simdjson_inline simd8<bool> operator~() const { return *this ^ true; } }; template<typename T> struct base8_numeric: base8<T> { - static simdjson_inline simd8<T> splat(T _value) { return __lsx_vreplgr2vr_b(_value); } - static simdjson_inline simd8<T> zero() { return __lsx_vldi(0); } - static simdjson_inline simd8<T> load(const T values[16]) { - return __lsx_vld(reinterpret_cast<const __m128i *>(values), 0); + static simdjson_inline simd8<T> splat(T _value) { + return __lasx_xvreplgr2vr_b(_value); + } + static simdjson_inline simd8<T> zero() { return __lasx_xvldi(0); } + static simdjson_inline simd8<T> load(const T values[32]) { + return __lasx_xvld(reinterpret_cast<const __m256i *>(values), 0); } // Repeat 16 values as many times as necessary (usually for lookup tables) static simdjson_inline simd8<T> repeat_16( @@ -42194,22 +42502,24 @@ namespace simd { T v8, T v9, T v10, T v11, T v12, T v13, T v14, T v15 ) { return simd8<T>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,v11,v12,v13,v14,v15 ); } simdjson_inline base8_numeric() : base8<T>() {} - simdjson_inline base8_numeric(const __m128i _value) : base8<T>(_value) {} + simdjson_inline base8_numeric(const __m256i _value) : base8<T>(_value) {} // Store to array - simdjson_inline void store(T dst[16]) const { - return __lsx_vst(*this, reinterpret_cast<__m128i *>(dst), 0); + simdjson_inline void store(T dst[32]) const { + return __lasx_xvst(*this, reinterpret_cast<__m256i *>(dst), 0); } // Addition/subtraction are the same for signed and unsigned - simdjson_inline simd8<T> operator+(const simd8<T> other) const { return __lsx_vadd_b(*this, other); } - simdjson_inline simd8<T> operator-(const simd8<T> other) const { return __lsx_vsub_b(*this, other); } + simdjson_inline simd8<T> operator+(const simd8<T> other) const { return __lasx_xvadd_b(*this, other); } + simdjson_inline simd8<T> operator-(const simd8<T> other) const { return __lasx_xvsub_b(*this, other); } simdjson_inline simd8<T>& operator+=(const simd8<T> other) { *this = *this + other; return *static_cast<simd8<T>*>(this); } simdjson_inline simd8<T>& operator-=(const simd8<T> other) { *this = *this - other; return *static_cast<simd8<T>*>(this); } @@ -42219,7 +42529,7 @@ namespace simd { // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values) template<typename L> simdjson_inline simd8<L> lookup_16(simd8<L> lookup_table) const { - return __lsx_vshuf_b(lookup_table, lookup_table, *this); + return __lasx_xvshuf_b(lookup_table, lookup_table, *this); } // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted as a bitset). @@ -42227,26 +42537,38 @@ namespace simd { // Only the first 16 - count_ones(mask) bytes of the result are significant but 16 bytes // get written. template<typename L> - simdjson_inline void compress(uint16_t mask, L * output) const { + simdjson_inline void compress(uint32_t mask, L * output) const { using internal::thintable_epi8; using internal::BitsSetTable256mul2; using internal::pshufb_combine_table; // this particular implementation was inspired by haswell - // lsx do it in 2 steps, first 8 bytes and then second 8 bytes... + // lasx do it in 4 steps, first 8 bytes and then second 8 bytes... uint8_t mask1 = uint8_t(mask); // least significant 8 bits - uint8_t mask2 = uint8_t(mask >> 8); // second least significant 8 bits - // next line just loads the 64-bit values thintable_epi8[mask1] and - // thintable_epi8[mask2] into a 128-bit register. - __m128i shufmask = {int64_t(thintable_epi8[mask1]), int64_t(thintable_epi8[mask2]) + 0x0808080808080808}; + uint8_t mask2 = uint8_t(mask >> 8); // second significant 8 bits + uint8_t mask3 = uint8_t(mask >> 16); // ... + uint8_t mask4 = uint8_t(mask >> 24); // ... + // next line just loads the 64-bit values thintable_epi8[mask{1,2,3,4}] + // into a 256-bit register. + __m256i shufmask = {int64_t(thintable_epi8[mask1]), int64_t(thintable_epi8[mask2]) + 0x0808080808080808, int64_t(thintable_epi8[mask3]), int64_t(thintable_epi8[mask4]) + 0x0808080808080808}; // this is the version "nearly pruned" - __m128i pruned = __lsx_vshuf_b(*this, *this, shufmask); + __m256i pruned = __lasx_xvshuf_b(*this, *this, shufmask); // we still need to put the pieces back together. // we compute the popcount of the first words: int pop1 = BitsSetTable256mul2[mask1]; + int pop2 = BitsSetTable256mul2[mask2]; + int pop3 = BitsSetTable256mul2[mask3]; + // then load the corresponding mask - __m128i compactmask = __lsx_vldx(reinterpret_cast<void*>(reinterpret_cast<unsigned long>(pshufb_combine_table)), pop1 * 8); - __m128i answer = __lsx_vshuf_b(pruned, pruned, compactmask); - __lsx_vst(answer, reinterpret_cast<uint8_t*>(output), 0); + __m256i masklo = __lasx_xvldx(reinterpret_cast<void*>(reinterpret_cast<unsigned long>(pshufb_combine_table)), pop1 * 8); + __m256i maskhi = __lasx_xvldx(reinterpret_cast<void*>(reinterpret_cast<unsigned long>(pshufb_combine_table)), pop3 * 8); + __m256i compactmask = __lasx_xvpermi_q(maskhi, masklo, 0x20); + __m256i answer = __lasx_xvshuf_b(pruned, pruned, compactmask); + __lasx_xvst(answer, reinterpret_cast<uint8_t*>(output), 0); + uint64_t value3 = __lasx_xvpickve2gr_du(answer, 2); + uint64_t value4 = __lasx_xvpickve2gr_du(answer, 3); + uint64_t *pos = reinterpret_cast<uint64_t*>(reinterpret_cast<uint8_t*>(output) + 16 - (pop1 + pop2) / 2); + pos[0] = value3; + pos[1] = value4; } template<typename L> @@ -42268,18 +42590,22 @@ namespace simd { template<> struct simd8<int8_t> : base8_numeric<int8_t> { simdjson_inline simd8() : base8_numeric<int8_t>() {} - simdjson_inline simd8(const __m128i _value) : base8_numeric<int8_t>(_value) {} + simdjson_inline simd8(const __m256i _value) : base8_numeric<int8_t>(_value) {} // Splat constructor simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {} // Array constructor - simdjson_inline simd8(const int8_t values[16]) : simd8(load(values)) {} + simdjson_inline simd8(const int8_t values[32]) : simd8(load(values)) {} // Member-by-member initialization simdjson_inline simd8( int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, - int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 + int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15, + int8_t v16, int8_t v17, int8_t v18, int8_t v19, int8_t v20, int8_t v21, int8_t v22, int8_t v23, + int8_t v24, int8_t v25, int8_t v26, int8_t v27, int8_t v28, int8_t v29, int8_t v30, int8_t v31 ) : simd8({ v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15 + v8, v9, v10,v11,v12,v13,v14,v15, + v16,v17,v18,v19,v20,v21,v22,v23, + v24,v25,v26,v27,v28,v29,v30,v31 }) {} // Repeat 16 values as many times as necessary (usually for lookup tables) simdjson_inline static simd8<int8_t> repeat_16( @@ -42287,34 +42613,40 @@ namespace simd { int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 ) { return simd8<int8_t>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,v11,v12,v13,v14,v15 ); } // Order-sensitive comparisons - simdjson_inline simd8<int8_t> max_val(const simd8<int8_t> other) const { return __lsx_vmax_b(*this, other); } - simdjson_inline simd8<int8_t> min_val(const simd8<int8_t> other) const { return __lsx_vmin_b(*this, other); } - simdjson_inline simd8<bool> operator>(const simd8<int8_t> other) const { return __lsx_vslt_b(other, *this); } - simdjson_inline simd8<bool> operator<(const simd8<int8_t> other) const { return __lsx_vslt_b(*this, other); } + simdjson_inline simd8<int8_t> max_val(const simd8<int8_t> other) const { return __lasx_xvmax_b(*this, other); } + simdjson_inline simd8<int8_t> min_val(const simd8<int8_t> other) const { return __lasx_xvmin_b(*this, other); } + simdjson_inline simd8<bool> operator>(const simd8<int8_t> other) const { return __lasx_xvslt_b(other, *this); } + simdjson_inline simd8<bool> operator<(const simd8<int8_t> other) const { return __lasx_xvslt_b(*this, other); } }; // Unsigned bytes template<> struct simd8<uint8_t>: base8_numeric<uint8_t> { simdjson_inline simd8() : base8_numeric<uint8_t>() {} - simdjson_inline simd8(const __m128i _value) : base8_numeric<uint8_t>(_value) {} + simdjson_inline simd8(const __m256i _value) : base8_numeric<uint8_t>(_value) {} // Splat constructor simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {} // Array constructor - simdjson_inline simd8(const uint8_t values[16]) : simd8(load(values)) {} + simdjson_inline simd8(const uint8_t values[32]) : simd8(load(values)) {} // Member-by-member initialization simdjson_inline simd8( uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, - uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 - ) : simd8(__m128i(v16u8{ + uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15, + uint8_t v16, uint8_t v17, uint8_t v18, uint8_t v19, uint8_t v20, uint8_t v21, uint8_t v22, uint8_t v23, + uint8_t v24, uint8_t v25, uint8_t v26, uint8_t v27, uint8_t v28, uint8_t v29, uint8_t v30, uint8_t v31 + ) : simd8(__m256i(v32u8{ v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15 + v8, v9, v10,v11,v12,v13,v14,v15, + v16,v17,v18,v19,v20,v21,v22,v23, + v24,v25,v26,v27,v28,v29,v30,v31 })) {} // Repeat 16 values as many times as necessary (usually for lookup tables) simdjson_inline static simd8<uint8_t> repeat_16( @@ -42322,18 +42654,20 @@ namespace simd { uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 ) { return simd8<uint8_t>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,v11,v12,v13,v14,v15 ); } // Saturated math - simdjson_inline simd8<uint8_t> saturating_add(const simd8<uint8_t> other) const { return __lsx_vsadd_bu(*this, other); } - simdjson_inline simd8<uint8_t> saturating_sub(const simd8<uint8_t> other) const { return __lsx_vssub_bu(*this, other); } + simdjson_inline simd8<uint8_t> saturating_add(const simd8<uint8_t> other) const { return __lasx_xvsadd_bu(*this, other); } + simdjson_inline simd8<uint8_t> saturating_sub(const simd8<uint8_t> other) const { return __lasx_xvssub_bu(*this, other); } // Order-specific operations - simdjson_inline simd8<uint8_t> max_val(const simd8<uint8_t> other) const { return __lsx_vmax_bu(*this, other); } - simdjson_inline simd8<uint8_t> min_val(const simd8<uint8_t> other) const { return __lsx_vmin_bu(other, *this); } + simdjson_inline simd8<uint8_t> max_val(const simd8<uint8_t> other) const { return __lasx_xvmax_bu(*this, other); } + simdjson_inline simd8<uint8_t> min_val(const simd8<uint8_t> other) const { return __lasx_xvmin_bu(other, *this); } // Same as >, but only guarantees true is nonzero (< guarantees true = -1) simdjson_inline simd8<uint8_t> gt_bits(const simd8<uint8_t> other) const { return this->saturating_sub(other); } // Same as <, but only guarantees true is nonzero (< guarantees true = -1) @@ -42348,96 +42682,85 @@ namespace simd { simdjson_inline simd8<bool> bits_not_set(simd8<uint8_t> bits) const { return (*this & bits).bits_not_set(); } simdjson_inline simd8<bool> any_bits_set() const { return ~this->bits_not_set(); } simdjson_inline simd8<bool> any_bits_set(simd8<uint8_t> bits) const { return ~this->bits_not_set(bits); } - simdjson_inline bool is_ascii() const { return 0 == __lsx_vpickve2gr_w(__lsx_vmskltz_b(*this), 0); } - simdjson_inline bool bits_not_set_anywhere() const { return 0 == __lsx_vpickve2gr_hu(__lsx_vmsknz_b(*this), 0); } + simdjson_inline bool is_ascii() const { + __m256i mask = __lasx_xvmskltz_b(*this); + return (0 == __lasx_xvpickve2gr_w(mask, 0)) && (0 == __lasx_xvpickve2gr_w(mask, 4)); + } + simdjson_inline bool bits_not_set_anywhere() const { + __m256i v = __lasx_xvmsknz_b(*this); + return (0 == __lasx_xvpickve2gr_w(v, 0)) && (0 == __lasx_xvpickve2gr_w(v, 4)); + } simdjson_inline bool any_bits_set_anywhere() const { return !bits_not_set_anywhere(); } simdjson_inline bool bits_not_set_anywhere(simd8<uint8_t> bits) const { - return 0 == __lsx_vpickve2gr_hu(__lsx_vmsknz_b(__lsx_vand_v(*this, bits)), 0); + __m256i v = __lasx_xvmsknz_b(__lasx_xvand_v(*this, bits)); + return (0 == __lasx_xvpickve2gr_w(v, 0)) && (0 == __lasx_xvpickve2gr_w(v, 4)); } simdjson_inline bool any_bits_set_anywhere(simd8<uint8_t> bits) const { return !bits_not_set_anywhere(bits); } template<int N> - simdjson_inline simd8<uint8_t> shr() const { return simd8<uint8_t>(__lsx_vsrli_b(*this, N)); } + simdjson_inline simd8<uint8_t> shr() const { return simd8<uint8_t>(__lasx_xvsrli_b(*this, N)); } template<int N> - simdjson_inline simd8<uint8_t> shl() const { return simd8<uint8_t>(__lsx_vslli_b(*this, N)); } + simdjson_inline simd8<uint8_t> shl() const { return simd8<uint8_t>(__lasx_xvslli_b(*this, N)); } }; template<typename T> struct simd8x64 { static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<T>); - static_assert(NUM_CHUNKS == 4, "LSX kernel should use four registers per 64-byte block."); + static_assert(NUM_CHUNKS == 2, "LASX kernel should use two registers per 64-byte block."); const simd8<T> chunks[NUM_CHUNKS]; + template<int idx> simd8<uint8_t> get() const { return idx < NUM_CHUNKS ? chunks[idx] : simd8<T>(); } simd8x64(const simd8x64<T>& o) = delete; // no copy allowed simd8x64<T>& operator=(const simd8<T>& other) = delete; // no assignment allowed simd8x64() = delete; // no default constructor allowed - simdjson_inline simd8x64(const simd8<T> chunk0, const simd8<T> chunk1, const simd8<T> chunk2, const simd8<T> chunk3) : chunks{chunk0, chunk1, chunk2, chunk3} {} - simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8<T>::load(ptr), simd8<T>::load(ptr+16), simd8<T>::load(ptr+32), simd8<T>::load(ptr+48)} {} + simdjson_inline simd8x64(const simd8<T> chunk0, const simd8<T> chunk1) : chunks{chunk0, chunk1} {} + simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8<T>::load(ptr), simd8<T>::load(ptr+32)} {} simdjson_inline uint64_t compress(uint64_t mask, T * output) const { - uint16_t mask1 = uint16_t(mask); - uint16_t mask2 = uint16_t(mask >> 16); - uint16_t mask3 = uint16_t(mask >> 32); - uint16_t mask4 = uint16_t(mask >> 48); - __m128i zcnt = __lsx_vpcnt_h(__m128i(v2u64{~mask, 0})); - uint64_t zcnt1 = __lsx_vpickve2gr_hu(zcnt, 0); - uint64_t zcnt2 = __lsx_vpickve2gr_hu(zcnt, 1); - uint64_t zcnt3 = __lsx_vpickve2gr_hu(zcnt, 2); - uint64_t zcnt4 = __lsx_vpickve2gr_hu(zcnt, 3); - uint8_t *voutput = reinterpret_cast<uint8_t*>(output); + uint32_t mask1 = uint32_t(mask); + uint32_t mask2 = uint32_t(mask >> 32); + __m256i zcnt = __lasx_xvpcnt_w(__m256i(v4u64{~mask, 0, 0, 0})); + uint64_t zcnt1 = __lasx_xvpickve2gr_wu(zcnt, 0); + uint64_t zcnt2 = __lasx_xvpickve2gr_wu(zcnt, 1); // There should be a critical value which processes in scaler is faster. if (zcnt1) - this->chunks[0].compress(mask1, reinterpret_cast<T*>(voutput)); - voutput += zcnt1; + this->chunks[0].compress(mask1, output); if (zcnt2) - this->chunks[1].compress(mask2, reinterpret_cast<T*>(voutput)); - voutput += zcnt2; - if (zcnt3) - this->chunks[2].compress(mask3, reinterpret_cast<T*>(voutput)); - voutput += zcnt3; - if (zcnt4) - this->chunks[3].compress(mask4, reinterpret_cast<T*>(voutput)); - voutput += zcnt4; - return reinterpret_cast<uint64_t>(voutput) - reinterpret_cast<uint64_t>(output); + this->chunks[1].compress(mask2, output + zcnt1); + return zcnt1 + zcnt2; } simdjson_inline void store(T ptr[64]) const { this->chunks[0].store(ptr+sizeof(simd8<T>)*0); this->chunks[1].store(ptr+sizeof(simd8<T>)*1); - this->chunks[2].store(ptr+sizeof(simd8<T>)*2); - this->chunks[3].store(ptr+sizeof(simd8<T>)*3); } simdjson_inline uint64_t to_bitmask() const { - __m128i mask1 = __lsx_vmskltz_b(this->chunks[0]); - __m128i mask2 = __lsx_vmskltz_b(this->chunks[1]); - __m128i mask3 = __lsx_vmskltz_b(this->chunks[2]); - __m128i mask4 = __lsx_vmskltz_b(this->chunks[3]); - mask1 = __lsx_vilvl_h(mask2, mask1); - mask2 = __lsx_vilvl_h(mask4, mask3); - return __lsx_vpickve2gr_du(__lsx_vilvl_w(mask2, mask1), 0); + __m256i mask0 = __lasx_xvmskltz_b(this->chunks[0]); + __m256i mask1 = __lasx_xvmskltz_b(this->chunks[1]); + __m256i mask_tmp = __lasx_xvpickve_w(mask0, 4); + __m256i tmp = __lasx_xvpickve_w(mask1, 4); + mask0 = __lasx_xvinsve0_w(mask0, mask1, 1); + mask_tmp = __lasx_xvinsve0_w(mask_tmp, tmp, 1); + return __lasx_xvpickve2gr_du(__lasx_xvpackev_h(mask_tmp, mask0), 0); } simdjson_inline simd8<T> reduce_or() const { - return (this->chunks[0] | this->chunks[1]) | (this->chunks[2] | this->chunks[3]); + return this->chunks[0] | this->chunks[1]; } simdjson_inline uint64_t eq(const T m) const { const simd8<T> mask = simd8<T>::splat(m); return simd8x64<bool>( this->chunks[0] == mask, - this->chunks[1] == mask, - this->chunks[2] == mask, - this->chunks[3] == mask + this->chunks[1] == mask ).to_bitmask(); } simdjson_inline uint64_t eq(const simd8x64<uint8_t> &other) const { return simd8x64<bool>( this->chunks[0] == other.chunks[0], - this->chunks[1] == other.chunks[1], - this->chunks[2] == other.chunks[2], - this->chunks[3] == other.chunks[3] + this->chunks[1] == other.chunks[1] ).to_bitmask(); } @@ -42445,33 +42768,31 @@ namespace simd { const simd8<T> mask = simd8<T>::splat(m); return simd8x64<bool>( this->chunks[0] <= mask, - this->chunks[1] <= mask, - this->chunks[2] <= mask, - this->chunks[3] <= mask + this->chunks[1] <= mask ).to_bitmask(); } }; // struct simd8x64<T> } // namespace simd } // unnamed namespace -} // namespace lsx +} // namespace lasx } // namespace simdjson -#endif // SIMDJSON_LSX_SIMD_H -/* end file simdjson/lsx/simd.h */ -/* including simdjson/lsx/stringparsing_defs.h: #include "simdjson/lsx/stringparsing_defs.h" */ -/* begin file simdjson/lsx/stringparsing_defs.h */ -#ifndef SIMDJSON_LSX_STRINGPARSING_DEFS_H -#define SIMDJSON_LSX_STRINGPARSING_DEFS_H +#endif // SIMDJSON_LASX_SIMD_H +/* end file simdjson/lasx/simd.h */ +/* including simdjson/lasx/stringparsing_defs.h: #include "simdjson/lasx/stringparsing_defs.h" */ +/* begin file simdjson/lasx/stringparsing_defs.h */ +#ifndef SIMDJSON_LASX_STRINGPARSING_DEFS_H +#define SIMDJSON_LASX_STRINGPARSING_DEFS_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/simd.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/simd.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/bitmanipulation.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace { using namespace simd; @@ -42495,17 +42816,11 @@ simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uin // this can read up to 31 bytes beyond the buffer size, but we require // SIMDJSON_PADDING of padding static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "backslash and quote finder must process fewer than SIMDJSON_PADDING bytes"); - simd8<uint8_t> v0(src); - simd8<uint8_t> v1(src + sizeof(v0)); - v0.store(dst); - v1.store(dst + sizeof(v0)); - - // Getting a 64-bit bitmask is much cheaper than multiple 16-bit bitmasks on LSX; therefore, we - // smash them together into a 64-byte mask and get the bitmask from there. - uint64_t bs_and_quote = simd8x64<bool>(v0 == '\\', v1 == '\\', v0 == '"', v1 == '"').to_bitmask(); + simd8<uint8_t> v(src); + v.store(dst); return { - uint32_t(bs_and_quote), // bs_bits - uint32_t(bs_and_quote >> 32) // quote_bits + static_cast<uint32_t>((v == '\\').to_bitmask()), // bs_bits + static_cast<uint32_t>((v == '"').to_bitmask()), // quote_bits }; } @@ -42535,22 +42850,24 @@ simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *ds } } // unnamed namespace -} // namespace lsx +} // namespace lasx } // namespace simdjson -#endif // SIMDJSON_LSX_STRINGPARSING_DEFS_H -/* end file simdjson/lsx/stringparsing_defs.h */ +#endif // SIMDJSON_LASX_STRINGPARSING_DEFS_H +/* end file simdjson/lasx/stringparsing_defs.h */ #define SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT 1 -/* end file simdjson/lsx/begin.h */ -/* including simdjson/generic/amalgamated.h for lsx: #include "simdjson/generic/amalgamated.h" */ -/* begin file simdjson/generic/amalgamated.h for lsx */ + + +/* end file simdjson/lasx/begin.h */ +/* including simdjson/generic/amalgamated.h for lasx: #include "simdjson/generic/amalgamated.h" */ +/* begin file simdjson/generic/amalgamated.h for lasx */ #if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_DEPENDENCIES_H) #error simdjson/generic/dependencies.h must be included before simdjson/generic/amalgamated.h! #endif -/* including simdjson/generic/base.h for lsx: #include "simdjson/generic/base.h" */ -/* begin file simdjson/generic/base.h for lsx */ +/* including simdjson/generic/base.h for lasx: #include "simdjson/generic/base.h" */ +/* begin file simdjson/generic/base.h for lasx */ #ifndef SIMDJSON_GENERIC_BASE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -42570,10 +42887,12 @@ simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *ds /* amalgamation skipped (editor-only): #include "simdjson/arm64/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_PPC64 */ /* amalgamation skipped (editor-only): #include "simdjson/ppc64/begin.h" */ -/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LSX */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LASX */ /* amalgamation skipped (editor-only): #include "simdjson/lasx/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LSX */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_RVV_VLS */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_FALLBACK */ /* amalgamation skipped (editor-only): #include "simdjson/fallback/begin.h" */ /* amalgamation skipped (editor-only): #else */ @@ -42583,7 +42902,7 @@ simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *ds /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { struct open_container; class dom_parser_implementation; @@ -42598,13 +42917,13 @@ enum class number_type { big_integer /// a big integer that does not fit in a 64-bit word }; -} // namespace lsx +} // namespace lasx } // namespace simdjson #endif // SIMDJSON_GENERIC_BASE_H -/* end file simdjson/generic/base.h for lsx */ -/* including simdjson/generic/jsoncharutils.h for lsx: #include "simdjson/generic/jsoncharutils.h" */ -/* begin file simdjson/generic/jsoncharutils.h for lsx */ +/* end file simdjson/generic/base.h for lasx */ +/* including simdjson/generic/jsoncharutils.h for lasx: #include "simdjson/generic/jsoncharutils.h" */ +/* begin file simdjson/generic/jsoncharutils.h for lasx */ #ifndef SIMDJSON_GENERIC_JSONCHARUTILS_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -42615,7 +42934,7 @@ enum class number_type { /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace { namespace jsoncharutils { @@ -42705,13 +43024,13 @@ static simdjson_inline uint64_t _umul128(uint64_t ab, uint64_t cd, uint64_t *hi) } // namespace jsoncharutils } // unnamed namespace -} // namespace lsx +} // namespace lasx } // namespace simdjson #endif // SIMDJSON_GENERIC_JSONCHARUTILS_H -/* end file simdjson/generic/jsoncharutils.h for lsx */ -/* including simdjson/generic/atomparsing.h for lsx: #include "simdjson/generic/atomparsing.h" */ -/* begin file simdjson/generic/atomparsing.h for lsx */ +/* end file simdjson/generic/jsoncharutils.h for lasx */ +/* including simdjson/generic/atomparsing.h for lasx: #include "simdjson/generic/atomparsing.h" */ +/* begin file simdjson/generic/atomparsing.h for lasx */ #ifndef SIMDJSON_GENERIC_ATOMPARSING_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -42723,7 +43042,7 @@ static simdjson_inline uint64_t _umul128(uint64_t ab, uint64_t cd, uint64_t *hi) #include <cstring> namespace simdjson { -namespace lsx { +namespace lasx { namespace { /// @private namespace atomparsing { @@ -42785,13 +43104,13 @@ simdjson_inline bool is_valid_null_atom(const uint8_t *src, size_t len) { } // namespace atomparsing } // unnamed namespace -} // namespace lsx +} // namespace lasx } // namespace simdjson #endif // SIMDJSON_GENERIC_ATOMPARSING_H -/* end file simdjson/generic/atomparsing.h for lsx */ -/* including simdjson/generic/dom_parser_implementation.h for lsx: #include "simdjson/generic/dom_parser_implementation.h" */ -/* begin file simdjson/generic/dom_parser_implementation.h for lsx */ +/* end file simdjson/generic/atomparsing.h for lasx */ +/* including simdjson/generic/dom_parser_implementation.h for lasx: #include "simdjson/generic/dom_parser_implementation.h" */ +/* begin file simdjson/generic/dom_parser_implementation.h for lasx */ #ifndef SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -42801,7 +43120,7 @@ simdjson_inline bool is_valid_null_atom(const uint8_t *src, size_t len) { /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { // expectation: sizeof(open_container) = 64/8. struct open_container { @@ -42843,11 +43162,11 @@ class dom_parser_implementation final : public internal::dom_parser_implementati }; -} // namespace lsx +} // namespace lasx } // namespace simdjson namespace simdjson { -namespace lsx { +namespace lasx { inline dom_parser_implementation::dom_parser_implementation() noexcept = default; inline dom_parser_implementation::dom_parser_implementation(dom_parser_implementation &&other) noexcept = default; @@ -42877,13 +43196,13 @@ inline simdjson_warn_unused error_code dom_parser_implementation::set_max_depth( return SUCCESS; } -} // namespace lsx +} // namespace lasx } // namespace simdjson #endif // SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H -/* end file simdjson/generic/dom_parser_implementation.h for lsx */ -/* including simdjson/generic/implementation_simdjson_result_base.h for lsx: #include "simdjson/generic/implementation_simdjson_result_base.h" */ -/* begin file simdjson/generic/implementation_simdjson_result_base.h for lsx */ +/* end file simdjson/generic/dom_parser_implementation.h for lasx */ +/* including simdjson/generic/implementation_simdjson_result_base.h for lasx: #include "simdjson/generic/implementation_simdjson_result_base.h" */ +/* begin file simdjson/generic/implementation_simdjson_result_base.h for lasx */ #ifndef SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -42892,7 +43211,7 @@ inline simdjson_warn_unused error_code dom_parser_implementation::set_max_depth( /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { // This is a near copy of include/error.h's implementation_simdjson_result_base, except it doesn't use std::pair // so we can avoid inlining errors @@ -43033,13 +43352,13 @@ struct implementation_simdjson_result_base { error_code second{UNINITIALIZED}; /** Users should never directly access 'second'. **/ }; // struct implementation_simdjson_result_base -} // namespace lsx +} // namespace lasx } // namespace simdjson #endif // SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H -/* end file simdjson/generic/implementation_simdjson_result_base.h for lsx */ -/* including simdjson/generic/numberparsing.h for lsx: #include "simdjson/generic/numberparsing.h" */ -/* begin file simdjson/generic/numberparsing.h for lsx */ +/* end file simdjson/generic/implementation_simdjson_result_base.h for lasx */ +/* including simdjson/generic/numberparsing.h for lasx: #include "simdjson/generic/numberparsing.h" */ +/* begin file simdjson/generic/numberparsing.h for lasx */ #ifndef SIMDJSON_GENERIC_NUMBERPARSING_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -43054,7 +43373,7 @@ struct implementation_simdjson_result_base { #include <cstring> namespace simdjson { -namespace lsx { +namespace lasx { namespace numberparsing { #ifdef JSON_TEST_NUMBERS @@ -44369,14 +44688,14 @@ inline std::ostream& operator<<(std::ostream& out, number_type type) noexcept { return out; } -} // namespace lsx +} // namespace lasx } // namespace simdjson #endif // SIMDJSON_GENERIC_NUMBERPARSING_H -/* end file simdjson/generic/numberparsing.h for lsx */ +/* end file simdjson/generic/numberparsing.h for lasx */ -/* including simdjson/generic/implementation_simdjson_result_base-inl.h for lsx: #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */ -/* begin file simdjson/generic/implementation_simdjson_result_base-inl.h for lsx */ +/* including simdjson/generic/implementation_simdjson_result_base-inl.h for lasx: #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */ +/* begin file simdjson/generic/implementation_simdjson_result_base-inl.h for lasx */ #ifndef SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -44386,7 +44705,7 @@ inline std::ostream& operator<<(std::ostream& out, number_type type) noexcept { /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { // // internal::implementation_simdjson_result_base<T> inline implementation @@ -44492,29 +44811,36 @@ template<typename T> simdjson_inline implementation_simdjson_result_base<T>::implementation_simdjson_result_base(T &&value) noexcept : implementation_simdjson_result_base(std::forward<T>(value), SUCCESS) {} -} // namespace lsx +} // namespace lasx } // namespace simdjson #endif // SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H -/* end file simdjson/generic/implementation_simdjson_result_base-inl.h for lsx */ -/* end file simdjson/generic/amalgamated.h for lsx */ -/* including simdjson/lsx/end.h: #include "simdjson/lsx/end.h" */ -/* begin file simdjson/lsx/end.h */ +/* end file simdjson/generic/implementation_simdjson_result_base-inl.h for lasx */ +/* end file simdjson/generic/amalgamated.h for lasx */ +/* including simdjson/lasx/end.h: #include "simdjson/lasx/end.h" */ +/* begin file simdjson/lasx/end.h */ /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ #undef SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT -/* undefining SIMDJSON_IMPLEMENTATION from "lsx" */ +/* undefining SIMDJSON_IMPLEMENTATION from "lasx" */ #undef SIMDJSON_IMPLEMENTATION -/* end file simdjson/lsx/end.h */ -#endif // SIMDJSON_LSX_H -/* end file simdjson/lsx.h */ -/* including simdjson/lsx/implementation.h: #include <simdjson/lsx/implementation.h> */ -/* begin file simdjson/lsx/implementation.h */ -#ifndef SIMDJSON_LSX_IMPLEMENTATION_H -#define SIMDJSON_LSX_IMPLEMENTATION_H + +#if SIMDJSON_CAN_ALWAYS_RUN_LASX +// nothing needed. +#else +SIMDJSON_UNTARGET_REGION +#endif +/* end file simdjson/lasx/end.h */ + +#endif // SIMDJSON_LASX_H +/* end file simdjson/lasx.h */ +/* including simdjson/lasx/implementation.h: #include <simdjson/lasx/implementation.h> */ +/* begin file simdjson/lasx/implementation.h */ +#ifndef SIMDJSON_LASX_IMPLEMENTATION_H +#define SIMDJSON_LASX_IMPLEMENTATION_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ /* amalgamation skipped (editor-only): #include "simdjson/base.h" */ @@ -44523,14 +44849,14 @@ simdjson_inline implementation_simdjson_result_base<T>::implementation_simdjson_ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { /** * @private */ class implementation final : public simdjson::implementation { public: - simdjson_inline implementation() : simdjson::implementation("lsx", "LoongArch SX", internal::instruction_set::LSX) {} + simdjson_inline implementation() : simdjson::implementation("lasx", "LoongArch ASX", internal::instruction_set::LASX) {} simdjson_warn_unused error_code create_dom_parser_implementation( size_t capacity, size_t max_length, @@ -44540,20 +44866,27 @@ class implementation final : public simdjson::implementation { simdjson_warn_unused bool validate_utf8(const char *buf, size_t len) const noexcept final; }; -} // namespace lsx +} // namespace lasx } // namespace simdjson -#endif // SIMDJSON_LSX_IMPLEMENTATION_H -/* end file simdjson/lsx/implementation.h */ +#endif // SIMDJSON_LASX_IMPLEMENTATION_H +/* end file simdjson/lasx/implementation.h */ -/* including simdjson/lsx/begin.h: #include <simdjson/lsx/begin.h> */ -/* begin file simdjson/lsx/begin.h */ -/* defining SIMDJSON_IMPLEMENTATION to "lsx" */ -#define SIMDJSON_IMPLEMENTATION lsx -/* including simdjson/lsx/base.h: #include "simdjson/lsx/base.h" */ -/* begin file simdjson/lsx/base.h */ -#ifndef SIMDJSON_LSX_BASE_H -#define SIMDJSON_LSX_BASE_H +/* including simdjson/lasx/begin.h: #include <simdjson/lasx/begin.h> */ +/* begin file simdjson/lasx/begin.h */ +/* defining SIMDJSON_IMPLEMENTATION to "lasx" */ +#define SIMDJSON_IMPLEMENTATION lasx +#include <lsxintrin.h> // This is a hack. We should not need to put this include here. +#if SIMDJSON_CAN_ALWAYS_RUN_LASX +// nothing needed. +#else +SIMDJSON_TARGET_REGION("lasx,lsx") +#endif + +/* including simdjson/lasx/base.h: #include "simdjson/lasx/base.h" */ +/* begin file simdjson/lasx/base.h */ +#ifndef SIMDJSON_LASX_BASE_H +#define SIMDJSON_LASX_BASE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ /* amalgamation skipped (editor-only): #include "simdjson/base.h" */ @@ -44561,9 +44894,9 @@ class implementation final : public simdjson::implementation { namespace simdjson { /** - * Implementation for LSX. + * Implementation for LASX. */ -namespace lsx { +namespace lasx { class implementation; @@ -44574,41 +44907,40 @@ template <typename T> struct simd8x64; } // namespace simd } // unnamed namespace -} // namespace lsx +} // namespace lasx } // namespace simdjson -#endif // SIMDJSON_LSX_BASE_H -/* end file simdjson/lsx/base.h */ -/* including simdjson/lsx/intrinsics.h: #include "simdjson/lsx/intrinsics.h" */ -/* begin file simdjson/lsx/intrinsics.h */ -#ifndef SIMDJSON_LSX_INTRINSICS_H -#define SIMDJSON_LSX_INTRINSICS_H +#endif // SIMDJSON_LASX_BASE_H +/* end file simdjson/lasx/base.h */ +/* including simdjson/lasx/intrinsics.h: #include "simdjson/lasx/intrinsics.h" */ +/* begin file simdjson/lasx/intrinsics.h */ +#ifndef SIMDJSON_LASX_INTRINSICS_H +#define SIMDJSON_LASX_INTRINSICS_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -// This should be the correct header whether -// you use visual studio or other compilers. #include <lsxintrin.h> +#include <lasxintrin.h> -static_assert(sizeof(__m128i) <= simdjson::SIMDJSON_PADDING, "insufficient padding for LoongArch SX"); +static_assert(sizeof(__m256i) <= simdjson::SIMDJSON_PADDING, "insufficient padding for LoongArch ASX"); -#endif // SIMDJSON_LSX_INTRINSICS_H -/* end file simdjson/lsx/intrinsics.h */ -/* including simdjson/lsx/bitmanipulation.h: #include "simdjson/lsx/bitmanipulation.h" */ -/* begin file simdjson/lsx/bitmanipulation.h */ -#ifndef SIMDJSON_LSX_BITMANIPULATION_H -#define SIMDJSON_LSX_BITMANIPULATION_H +#endif // SIMDJSON_LASX_INTRINSICS_H +/* end file simdjson/lasx/intrinsics.h */ +/* including simdjson/lasx/bitmanipulation.h: #include "simdjson/lasx/bitmanipulation.h" */ +/* begin file simdjson/lasx/bitmanipulation.h */ +#ifndef SIMDJSON_LASX_BITMANIPULATION_H +#define SIMDJSON_LASX_BITMANIPULATION_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/intrinsics.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/bitmask.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/intrinsics.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/bitmask.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace { // We sometimes call trailing_zero on inputs that are zero, @@ -44635,7 +44967,7 @@ simdjson_inline int leading_zeroes(uint64_t input_num) { /* result might be undefined when input_num is zero */ simdjson_inline int count_ones(uint64_t input_num) { - return __lsx_vpickve2gr_w(__lsx_vpcnt_d(__m128i(v2u64{input_num, 0})), 0); + return __lasx_xvpickve2gr_w(__lasx_xvpcnt_d(__m256i(v4u64{input_num, 0, 0, 0})), 0); } simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2, uint64_t *result) { @@ -44644,22 +44976,22 @@ simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2, uint64_t *re } } // unnamed namespace -} // namespace lsx +} // namespace lasx } // namespace simdjson -#endif // SIMDJSON_LSX_BITMANIPULATION_H -/* end file simdjson/lsx/bitmanipulation.h */ -/* including simdjson/lsx/bitmask.h: #include "simdjson/lsx/bitmask.h" */ -/* begin file simdjson/lsx/bitmask.h */ -#ifndef SIMDJSON_LSX_BITMASK_H -#define SIMDJSON_LSX_BITMASK_H +#endif // SIMDJSON_LASX_BITMANIPULATION_H +/* end file simdjson/lasx/bitmanipulation.h */ +/* including simdjson/lasx/bitmask.h: #include "simdjson/lasx/bitmask.h" */ +/* begin file simdjson/lasx/bitmask.h */ +#ifndef SIMDJSON_LASX_BITMASK_H +#define SIMDJSON_LASX_BITMASK_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace { // @@ -44678,26 +45010,26 @@ simdjson_inline uint64_t prefix_xor(uint64_t bitmask) { } } // unnamed namespace -} // namespace lsx +} // namespace lasx } // namespace simdjson #endif -/* end file simdjson/lsx/bitmask.h */ -/* including simdjson/lsx/numberparsing_defs.h: #include "simdjson/lsx/numberparsing_defs.h" */ -/* begin file simdjson/lsx/numberparsing_defs.h */ -#ifndef SIMDJSON_LSX_NUMBERPARSING_DEFS_H -#define SIMDJSON_LSX_NUMBERPARSING_DEFS_H +/* end file simdjson/lasx/bitmask.h */ +/* including simdjson/lasx/numberparsing_defs.h: #include "simdjson/lasx/numberparsing_defs.h" */ +/* begin file simdjson/lasx/numberparsing_defs.h */ +#ifndef SIMDJSON_LASX_NUMBERPARSING_DEFS_H +#define SIMDJSON_LASX_NUMBERPARSING_DEFS_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/intrinsics.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/intrinsics.h" */ /* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ #include <cstring> namespace simdjson { -namespace lsx { +namespace lasx { namespace numberparsing { // we don't have appropriate instructions, so let us use a scalar function @@ -44720,7 +45052,7 @@ simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t } } // namespace numberparsing -} // namespace lsx +} // namespace lasx } // namespace simdjson #ifndef SIMDJSON_SWAR_NUMBER_PARSING @@ -44731,46 +45063,46 @@ simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t #endif #endif -#endif // SIMDJSON_LSX_NUMBERPARSING_DEFS_H -/* end file simdjson/lsx/numberparsing_defs.h */ -/* including simdjson/lsx/simd.h: #include "simdjson/lsx/simd.h" */ -/* begin file simdjson/lsx/simd.h */ -#ifndef SIMDJSON_LSX_SIMD_H -#define SIMDJSON_LSX_SIMD_H +#endif // SIMDJSON_LASX_NUMBERPARSING_DEFS_H +/* end file simdjson/lasx/numberparsing_defs.h */ +/* including simdjson/lasx/simd.h: #include "simdjson/lasx/simd.h" */ +/* begin file simdjson/lasx/simd.h */ +#ifndef SIMDJSON_LASX_SIMD_H +#define SIMDJSON_LASX_SIMD_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/bitmanipulation.h" */ /* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace { namespace simd { // Forward-declared so they can be used by splat and friends. template<typename Child> struct base { - __m128i value; + __m256i value; // Zero constructor - simdjson_inline base() : value{__m128i()} {} + simdjson_inline base() : value{__m256i()} {} // Conversion from SIMD register - simdjson_inline base(const __m128i _value) : value(_value) {} + simdjson_inline base(const __m256i _value) : value(_value) {} // Conversion to SIMD register - simdjson_inline operator const __m128i&() const { return this->value; } - simdjson_inline operator __m128i&() { return this->value; } - simdjson_inline operator const v16i8&() const { return (v16i8&)this->value; } - simdjson_inline operator v16i8&() { return (v16i8&)this->value; } + simdjson_inline operator const __m256i&() const { return this->value; } + simdjson_inline operator __m256i&() { return this->value; } + simdjson_inline operator const v32i8&() const { return (v32i8&)this->value; } + simdjson_inline operator v32i8&() { return (v32i8&)this->value; } // Bit operations - simdjson_inline Child operator|(const Child other) const { return __lsx_vor_v(*this, other); } - simdjson_inline Child operator&(const Child other) const { return __lsx_vand_v(*this, other); } - simdjson_inline Child operator^(const Child other) const { return __lsx_vxor_v(*this, other); } - simdjson_inline Child bit_andnot(const Child other) const { return __lsx_vandn_v(other, *this); } + simdjson_inline Child operator|(const Child other) const { return __lasx_xvor_v(*this, other); } + simdjson_inline Child operator&(const Child other) const { return __lasx_xvand_v(*this, other); } + simdjson_inline Child operator^(const Child other) const { return __lasx_xvxor_v(*this, other); } + simdjson_inline Child bit_andnot(const Child other) const { return __lasx_xvandn_v(other, *this); } simdjson_inline Child& operator|=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast | other; return *this_cast; } simdjson_inline Child& operator&=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast & other; return *this_cast; } simdjson_inline Child& operator^=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast ^ other; return *this_cast; } @@ -44783,41 +45115,51 @@ namespace simd { template<typename T, typename Mask=simd8<bool>> struct base8: base<simd8<T>> { simdjson_inline base8() : base<simd8<T>>() {} - simdjson_inline base8(const __m128i _value) : base<simd8<T>>(_value) {} + simdjson_inline base8(const __m256i _value) : base<simd8<T>>(_value) {} - friend simdjson_really_inline Mask operator==(const simd8<T> lhs, const simd8<T> rhs) { return __lsx_vseq_b(lhs, rhs); } + friend simdjson_really_inline Mask operator==(const simd8<T> lhs, const simd8<T> rhs) { return __lasx_xvseq_b(lhs, rhs); } static const int SIZE = sizeof(base<simd8<T>>::value); template<int N=1> simdjson_inline simd8<T> prev(const simd8<T> prev_chunk) const { - return __lsx_vor_v(__lsx_vbsll_v(*this, N), __lsx_vbsrl_v(prev_chunk, 16 - N)); + __m256i hi = __lasx_xvbsll_v(*this, N); + __m256i lo = __lasx_xvbsrl_v(*this, 16 - N); + __m256i tmp = __lasx_xvbsrl_v(prev_chunk, 16 - N); + lo = __lasx_xvpermi_q(lo, tmp, 0x21); + return __lasx_xvor_v(hi, lo); } }; // SIMD byte mask type (returned by things like eq and gt) template<> struct simd8<bool>: base8<bool> { - static simdjson_inline simd8<bool> splat(bool _value) { - return __lsx_vreplgr2vr_b(uint8_t(-(!!_value))); - } + static simdjson_inline simd8<bool> splat(bool _value) { return __lasx_xvreplgr2vr_b(uint8_t(-(!!_value))); } simdjson_inline simd8() : base8() {} - simdjson_inline simd8(const __m128i _value) : base8<bool>(_value) {} + simdjson_inline simd8(const __m256i _value) : base8<bool>(_value) {} // Splat constructor simdjson_inline simd8(bool _value) : base8<bool>(splat(_value)) {} - simdjson_inline int to_bitmask() const { return __lsx_vpickve2gr_w(__lsx_vmskltz_b(*this), 0); } - simdjson_inline bool any() const { return 0 == __lsx_vpickve2gr_hu(__lsx_vmsknz_b(*this), 0); } + simdjson_inline int to_bitmask() const { + __m256i mask = __lasx_xvmskltz_b(*this); + return (__lasx_xvpickve2gr_w(mask, 4) << 16) | (__lasx_xvpickve2gr_w(mask, 0)); + } + simdjson_inline bool any() const { + __m256i v = __lasx_xvmsknz_b(*this); + return (0 == __lasx_xvpickve2gr_w(v, 0)) && (0 == __lasx_xvpickve2gr_w(v, 4)); + } simdjson_inline simd8<bool> operator~() const { return *this ^ true; } }; template<typename T> struct base8_numeric: base8<T> { - static simdjson_inline simd8<T> splat(T _value) { return __lsx_vreplgr2vr_b(_value); } - static simdjson_inline simd8<T> zero() { return __lsx_vldi(0); } - static simdjson_inline simd8<T> load(const T values[16]) { - return __lsx_vld(reinterpret_cast<const __m128i *>(values), 0); + static simdjson_inline simd8<T> splat(T _value) { + return __lasx_xvreplgr2vr_b(_value); + } + static simdjson_inline simd8<T> zero() { return __lasx_xvldi(0); } + static simdjson_inline simd8<T> load(const T values[32]) { + return __lasx_xvld(reinterpret_cast<const __m256i *>(values), 0); } // Repeat 16 values as many times as necessary (usually for lookup tables) static simdjson_inline simd8<T> repeat_16( @@ -44825,22 +45167,24 @@ namespace simd { T v8, T v9, T v10, T v11, T v12, T v13, T v14, T v15 ) { return simd8<T>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,v11,v12,v13,v14,v15 ); } simdjson_inline base8_numeric() : base8<T>() {} - simdjson_inline base8_numeric(const __m128i _value) : base8<T>(_value) {} + simdjson_inline base8_numeric(const __m256i _value) : base8<T>(_value) {} // Store to array - simdjson_inline void store(T dst[16]) const { - return __lsx_vst(*this, reinterpret_cast<__m128i *>(dst), 0); + simdjson_inline void store(T dst[32]) const { + return __lasx_xvst(*this, reinterpret_cast<__m256i *>(dst), 0); } // Addition/subtraction are the same for signed and unsigned - simdjson_inline simd8<T> operator+(const simd8<T> other) const { return __lsx_vadd_b(*this, other); } - simdjson_inline simd8<T> operator-(const simd8<T> other) const { return __lsx_vsub_b(*this, other); } + simdjson_inline simd8<T> operator+(const simd8<T> other) const { return __lasx_xvadd_b(*this, other); } + simdjson_inline simd8<T> operator-(const simd8<T> other) const { return __lasx_xvsub_b(*this, other); } simdjson_inline simd8<T>& operator+=(const simd8<T> other) { *this = *this + other; return *static_cast<simd8<T>*>(this); } simdjson_inline simd8<T>& operator-=(const simd8<T> other) { *this = *this - other; return *static_cast<simd8<T>*>(this); } @@ -44850,7 +45194,7 @@ namespace simd { // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values) template<typename L> simdjson_inline simd8<L> lookup_16(simd8<L> lookup_table) const { - return __lsx_vshuf_b(lookup_table, lookup_table, *this); + return __lasx_xvshuf_b(lookup_table, lookup_table, *this); } // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted as a bitset). @@ -44858,26 +45202,38 @@ namespace simd { // Only the first 16 - count_ones(mask) bytes of the result are significant but 16 bytes // get written. template<typename L> - simdjson_inline void compress(uint16_t mask, L * output) const { + simdjson_inline void compress(uint32_t mask, L * output) const { using internal::thintable_epi8; using internal::BitsSetTable256mul2; using internal::pshufb_combine_table; // this particular implementation was inspired by haswell - // lsx do it in 2 steps, first 8 bytes and then second 8 bytes... + // lasx do it in 4 steps, first 8 bytes and then second 8 bytes... uint8_t mask1 = uint8_t(mask); // least significant 8 bits - uint8_t mask2 = uint8_t(mask >> 8); // second least significant 8 bits - // next line just loads the 64-bit values thintable_epi8[mask1] and - // thintable_epi8[mask2] into a 128-bit register. - __m128i shufmask = {int64_t(thintable_epi8[mask1]), int64_t(thintable_epi8[mask2]) + 0x0808080808080808}; + uint8_t mask2 = uint8_t(mask >> 8); // second significant 8 bits + uint8_t mask3 = uint8_t(mask >> 16); // ... + uint8_t mask4 = uint8_t(mask >> 24); // ... + // next line just loads the 64-bit values thintable_epi8[mask{1,2,3,4}] + // into a 256-bit register. + __m256i shufmask = {int64_t(thintable_epi8[mask1]), int64_t(thintable_epi8[mask2]) + 0x0808080808080808, int64_t(thintable_epi8[mask3]), int64_t(thintable_epi8[mask4]) + 0x0808080808080808}; // this is the version "nearly pruned" - __m128i pruned = __lsx_vshuf_b(*this, *this, shufmask); + __m256i pruned = __lasx_xvshuf_b(*this, *this, shufmask); // we still need to put the pieces back together. // we compute the popcount of the first words: int pop1 = BitsSetTable256mul2[mask1]; + int pop2 = BitsSetTable256mul2[mask2]; + int pop3 = BitsSetTable256mul2[mask3]; + // then load the corresponding mask - __m128i compactmask = __lsx_vldx(reinterpret_cast<void*>(reinterpret_cast<unsigned long>(pshufb_combine_table)), pop1 * 8); - __m128i answer = __lsx_vshuf_b(pruned, pruned, compactmask); - __lsx_vst(answer, reinterpret_cast<uint8_t*>(output), 0); + __m256i masklo = __lasx_xvldx(reinterpret_cast<void*>(reinterpret_cast<unsigned long>(pshufb_combine_table)), pop1 * 8); + __m256i maskhi = __lasx_xvldx(reinterpret_cast<void*>(reinterpret_cast<unsigned long>(pshufb_combine_table)), pop3 * 8); + __m256i compactmask = __lasx_xvpermi_q(maskhi, masklo, 0x20); + __m256i answer = __lasx_xvshuf_b(pruned, pruned, compactmask); + __lasx_xvst(answer, reinterpret_cast<uint8_t*>(output), 0); + uint64_t value3 = __lasx_xvpickve2gr_du(answer, 2); + uint64_t value4 = __lasx_xvpickve2gr_du(answer, 3); + uint64_t *pos = reinterpret_cast<uint64_t*>(reinterpret_cast<uint8_t*>(output) + 16 - (pop1 + pop2) / 2); + pos[0] = value3; + pos[1] = value4; } template<typename L> @@ -44899,18 +45255,22 @@ namespace simd { template<> struct simd8<int8_t> : base8_numeric<int8_t> { simdjson_inline simd8() : base8_numeric<int8_t>() {} - simdjson_inline simd8(const __m128i _value) : base8_numeric<int8_t>(_value) {} + simdjson_inline simd8(const __m256i _value) : base8_numeric<int8_t>(_value) {} // Splat constructor simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {} // Array constructor - simdjson_inline simd8(const int8_t values[16]) : simd8(load(values)) {} + simdjson_inline simd8(const int8_t values[32]) : simd8(load(values)) {} // Member-by-member initialization simdjson_inline simd8( int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, - int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 + int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15, + int8_t v16, int8_t v17, int8_t v18, int8_t v19, int8_t v20, int8_t v21, int8_t v22, int8_t v23, + int8_t v24, int8_t v25, int8_t v26, int8_t v27, int8_t v28, int8_t v29, int8_t v30, int8_t v31 ) : simd8({ v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15 + v8, v9, v10,v11,v12,v13,v14,v15, + v16,v17,v18,v19,v20,v21,v22,v23, + v24,v25,v26,v27,v28,v29,v30,v31 }) {} // Repeat 16 values as many times as necessary (usually for lookup tables) simdjson_inline static simd8<int8_t> repeat_16( @@ -44918,34 +45278,40 @@ namespace simd { int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 ) { return simd8<int8_t>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,v11,v12,v13,v14,v15 ); } // Order-sensitive comparisons - simdjson_inline simd8<int8_t> max_val(const simd8<int8_t> other) const { return __lsx_vmax_b(*this, other); } - simdjson_inline simd8<int8_t> min_val(const simd8<int8_t> other) const { return __lsx_vmin_b(*this, other); } - simdjson_inline simd8<bool> operator>(const simd8<int8_t> other) const { return __lsx_vslt_b(other, *this); } - simdjson_inline simd8<bool> operator<(const simd8<int8_t> other) const { return __lsx_vslt_b(*this, other); } + simdjson_inline simd8<int8_t> max_val(const simd8<int8_t> other) const { return __lasx_xvmax_b(*this, other); } + simdjson_inline simd8<int8_t> min_val(const simd8<int8_t> other) const { return __lasx_xvmin_b(*this, other); } + simdjson_inline simd8<bool> operator>(const simd8<int8_t> other) const { return __lasx_xvslt_b(other, *this); } + simdjson_inline simd8<bool> operator<(const simd8<int8_t> other) const { return __lasx_xvslt_b(*this, other); } }; // Unsigned bytes template<> struct simd8<uint8_t>: base8_numeric<uint8_t> { simdjson_inline simd8() : base8_numeric<uint8_t>() {} - simdjson_inline simd8(const __m128i _value) : base8_numeric<uint8_t>(_value) {} + simdjson_inline simd8(const __m256i _value) : base8_numeric<uint8_t>(_value) {} // Splat constructor simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {} // Array constructor - simdjson_inline simd8(const uint8_t values[16]) : simd8(load(values)) {} + simdjson_inline simd8(const uint8_t values[32]) : simd8(load(values)) {} // Member-by-member initialization simdjson_inline simd8( uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, - uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 - ) : simd8(__m128i(v16u8{ + uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15, + uint8_t v16, uint8_t v17, uint8_t v18, uint8_t v19, uint8_t v20, uint8_t v21, uint8_t v22, uint8_t v23, + uint8_t v24, uint8_t v25, uint8_t v26, uint8_t v27, uint8_t v28, uint8_t v29, uint8_t v30, uint8_t v31 + ) : simd8(__m256i(v32u8{ v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15 + v8, v9, v10,v11,v12,v13,v14,v15, + v16,v17,v18,v19,v20,v21,v22,v23, + v24,v25,v26,v27,v28,v29,v30,v31 })) {} // Repeat 16 values as many times as necessary (usually for lookup tables) simdjson_inline static simd8<uint8_t> repeat_16( @@ -44953,18 +45319,20 @@ namespace simd { uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 ) { return simd8<uint8_t>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,v11,v12,v13,v14,v15 ); } // Saturated math - simdjson_inline simd8<uint8_t> saturating_add(const simd8<uint8_t> other) const { return __lsx_vsadd_bu(*this, other); } - simdjson_inline simd8<uint8_t> saturating_sub(const simd8<uint8_t> other) const { return __lsx_vssub_bu(*this, other); } + simdjson_inline simd8<uint8_t> saturating_add(const simd8<uint8_t> other) const { return __lasx_xvsadd_bu(*this, other); } + simdjson_inline simd8<uint8_t> saturating_sub(const simd8<uint8_t> other) const { return __lasx_xvssub_bu(*this, other); } // Order-specific operations - simdjson_inline simd8<uint8_t> max_val(const simd8<uint8_t> other) const { return __lsx_vmax_bu(*this, other); } - simdjson_inline simd8<uint8_t> min_val(const simd8<uint8_t> other) const { return __lsx_vmin_bu(other, *this); } + simdjson_inline simd8<uint8_t> max_val(const simd8<uint8_t> other) const { return __lasx_xvmax_bu(*this, other); } + simdjson_inline simd8<uint8_t> min_val(const simd8<uint8_t> other) const { return __lasx_xvmin_bu(other, *this); } // Same as >, but only guarantees true is nonzero (< guarantees true = -1) simdjson_inline simd8<uint8_t> gt_bits(const simd8<uint8_t> other) const { return this->saturating_sub(other); } // Same as <, but only guarantees true is nonzero (< guarantees true = -1) @@ -44979,96 +45347,85 @@ namespace simd { simdjson_inline simd8<bool> bits_not_set(simd8<uint8_t> bits) const { return (*this & bits).bits_not_set(); } simdjson_inline simd8<bool> any_bits_set() const { return ~this->bits_not_set(); } simdjson_inline simd8<bool> any_bits_set(simd8<uint8_t> bits) const { return ~this->bits_not_set(bits); } - simdjson_inline bool is_ascii() const { return 0 == __lsx_vpickve2gr_w(__lsx_vmskltz_b(*this), 0); } - simdjson_inline bool bits_not_set_anywhere() const { return 0 == __lsx_vpickve2gr_hu(__lsx_vmsknz_b(*this), 0); } + simdjson_inline bool is_ascii() const { + __m256i mask = __lasx_xvmskltz_b(*this); + return (0 == __lasx_xvpickve2gr_w(mask, 0)) && (0 == __lasx_xvpickve2gr_w(mask, 4)); + } + simdjson_inline bool bits_not_set_anywhere() const { + __m256i v = __lasx_xvmsknz_b(*this); + return (0 == __lasx_xvpickve2gr_w(v, 0)) && (0 == __lasx_xvpickve2gr_w(v, 4)); + } simdjson_inline bool any_bits_set_anywhere() const { return !bits_not_set_anywhere(); } simdjson_inline bool bits_not_set_anywhere(simd8<uint8_t> bits) const { - return 0 == __lsx_vpickve2gr_hu(__lsx_vmsknz_b(__lsx_vand_v(*this, bits)), 0); + __m256i v = __lasx_xvmsknz_b(__lasx_xvand_v(*this, bits)); + return (0 == __lasx_xvpickve2gr_w(v, 0)) && (0 == __lasx_xvpickve2gr_w(v, 4)); } simdjson_inline bool any_bits_set_anywhere(simd8<uint8_t> bits) const { return !bits_not_set_anywhere(bits); } template<int N> - simdjson_inline simd8<uint8_t> shr() const { return simd8<uint8_t>(__lsx_vsrli_b(*this, N)); } + simdjson_inline simd8<uint8_t> shr() const { return simd8<uint8_t>(__lasx_xvsrli_b(*this, N)); } template<int N> - simdjson_inline simd8<uint8_t> shl() const { return simd8<uint8_t>(__lsx_vslli_b(*this, N)); } + simdjson_inline simd8<uint8_t> shl() const { return simd8<uint8_t>(__lasx_xvslli_b(*this, N)); } }; template<typename T> struct simd8x64 { static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<T>); - static_assert(NUM_CHUNKS == 4, "LSX kernel should use four registers per 64-byte block."); + static_assert(NUM_CHUNKS == 2, "LASX kernel should use two registers per 64-byte block."); const simd8<T> chunks[NUM_CHUNKS]; + template<int idx> simd8<uint8_t> get() const { return idx < NUM_CHUNKS ? chunks[idx] : simd8<T>(); } simd8x64(const simd8x64<T>& o) = delete; // no copy allowed simd8x64<T>& operator=(const simd8<T>& other) = delete; // no assignment allowed simd8x64() = delete; // no default constructor allowed - simdjson_inline simd8x64(const simd8<T> chunk0, const simd8<T> chunk1, const simd8<T> chunk2, const simd8<T> chunk3) : chunks{chunk0, chunk1, chunk2, chunk3} {} - simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8<T>::load(ptr), simd8<T>::load(ptr+16), simd8<T>::load(ptr+32), simd8<T>::load(ptr+48)} {} + simdjson_inline simd8x64(const simd8<T> chunk0, const simd8<T> chunk1) : chunks{chunk0, chunk1} {} + simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8<T>::load(ptr), simd8<T>::load(ptr+32)} {} simdjson_inline uint64_t compress(uint64_t mask, T * output) const { - uint16_t mask1 = uint16_t(mask); - uint16_t mask2 = uint16_t(mask >> 16); - uint16_t mask3 = uint16_t(mask >> 32); - uint16_t mask4 = uint16_t(mask >> 48); - __m128i zcnt = __lsx_vpcnt_h(__m128i(v2u64{~mask, 0})); - uint64_t zcnt1 = __lsx_vpickve2gr_hu(zcnt, 0); - uint64_t zcnt2 = __lsx_vpickve2gr_hu(zcnt, 1); - uint64_t zcnt3 = __lsx_vpickve2gr_hu(zcnt, 2); - uint64_t zcnt4 = __lsx_vpickve2gr_hu(zcnt, 3); - uint8_t *voutput = reinterpret_cast<uint8_t*>(output); + uint32_t mask1 = uint32_t(mask); + uint32_t mask2 = uint32_t(mask >> 32); + __m256i zcnt = __lasx_xvpcnt_w(__m256i(v4u64{~mask, 0, 0, 0})); + uint64_t zcnt1 = __lasx_xvpickve2gr_wu(zcnt, 0); + uint64_t zcnt2 = __lasx_xvpickve2gr_wu(zcnt, 1); // There should be a critical value which processes in scaler is faster. if (zcnt1) - this->chunks[0].compress(mask1, reinterpret_cast<T*>(voutput)); - voutput += zcnt1; + this->chunks[0].compress(mask1, output); if (zcnt2) - this->chunks[1].compress(mask2, reinterpret_cast<T*>(voutput)); - voutput += zcnt2; - if (zcnt3) - this->chunks[2].compress(mask3, reinterpret_cast<T*>(voutput)); - voutput += zcnt3; - if (zcnt4) - this->chunks[3].compress(mask4, reinterpret_cast<T*>(voutput)); - voutput += zcnt4; - return reinterpret_cast<uint64_t>(voutput) - reinterpret_cast<uint64_t>(output); + this->chunks[1].compress(mask2, output + zcnt1); + return zcnt1 + zcnt2; } simdjson_inline void store(T ptr[64]) const { this->chunks[0].store(ptr+sizeof(simd8<T>)*0); this->chunks[1].store(ptr+sizeof(simd8<T>)*1); - this->chunks[2].store(ptr+sizeof(simd8<T>)*2); - this->chunks[3].store(ptr+sizeof(simd8<T>)*3); } simdjson_inline uint64_t to_bitmask() const { - __m128i mask1 = __lsx_vmskltz_b(this->chunks[0]); - __m128i mask2 = __lsx_vmskltz_b(this->chunks[1]); - __m128i mask3 = __lsx_vmskltz_b(this->chunks[2]); - __m128i mask4 = __lsx_vmskltz_b(this->chunks[3]); - mask1 = __lsx_vilvl_h(mask2, mask1); - mask2 = __lsx_vilvl_h(mask4, mask3); - return __lsx_vpickve2gr_du(__lsx_vilvl_w(mask2, mask1), 0); + __m256i mask0 = __lasx_xvmskltz_b(this->chunks[0]); + __m256i mask1 = __lasx_xvmskltz_b(this->chunks[1]); + __m256i mask_tmp = __lasx_xvpickve_w(mask0, 4); + __m256i tmp = __lasx_xvpickve_w(mask1, 4); + mask0 = __lasx_xvinsve0_w(mask0, mask1, 1); + mask_tmp = __lasx_xvinsve0_w(mask_tmp, tmp, 1); + return __lasx_xvpickve2gr_du(__lasx_xvpackev_h(mask_tmp, mask0), 0); } simdjson_inline simd8<T> reduce_or() const { - return (this->chunks[0] | this->chunks[1]) | (this->chunks[2] | this->chunks[3]); + return this->chunks[0] | this->chunks[1]; } simdjson_inline uint64_t eq(const T m) const { const simd8<T> mask = simd8<T>::splat(m); return simd8x64<bool>( this->chunks[0] == mask, - this->chunks[1] == mask, - this->chunks[2] == mask, - this->chunks[3] == mask + this->chunks[1] == mask ).to_bitmask(); } simdjson_inline uint64_t eq(const simd8x64<uint8_t> &other) const { return simd8x64<bool>( this->chunks[0] == other.chunks[0], - this->chunks[1] == other.chunks[1], - this->chunks[2] == other.chunks[2], - this->chunks[3] == other.chunks[3] + this->chunks[1] == other.chunks[1] ).to_bitmask(); } @@ -45076,33 +45433,31 @@ namespace simd { const simd8<T> mask = simd8<T>::splat(m); return simd8x64<bool>( this->chunks[0] <= mask, - this->chunks[1] <= mask, - this->chunks[2] <= mask, - this->chunks[3] <= mask + this->chunks[1] <= mask ).to_bitmask(); } }; // struct simd8x64<T> } // namespace simd } // unnamed namespace -} // namespace lsx +} // namespace lasx } // namespace simdjson -#endif // SIMDJSON_LSX_SIMD_H -/* end file simdjson/lsx/simd.h */ -/* including simdjson/lsx/stringparsing_defs.h: #include "simdjson/lsx/stringparsing_defs.h" */ -/* begin file simdjson/lsx/stringparsing_defs.h */ -#ifndef SIMDJSON_LSX_STRINGPARSING_DEFS_H -#define SIMDJSON_LSX_STRINGPARSING_DEFS_H +#endif // SIMDJSON_LASX_SIMD_H +/* end file simdjson/lasx/simd.h */ +/* including simdjson/lasx/stringparsing_defs.h: #include "simdjson/lasx/stringparsing_defs.h" */ +/* begin file simdjson/lasx/stringparsing_defs.h */ +#ifndef SIMDJSON_LASX_STRINGPARSING_DEFS_H +#define SIMDJSON_LASX_STRINGPARSING_DEFS_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/simd.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/simd.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/bitmanipulation.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace { using namespace simd; @@ -45126,17 +45481,11 @@ simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uin // this can read up to 31 bytes beyond the buffer size, but we require // SIMDJSON_PADDING of padding static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "backslash and quote finder must process fewer than SIMDJSON_PADDING bytes"); - simd8<uint8_t> v0(src); - simd8<uint8_t> v1(src + sizeof(v0)); - v0.store(dst); - v1.store(dst + sizeof(v0)); - - // Getting a 64-bit bitmask is much cheaper than multiple 16-bit bitmasks on LSX; therefore, we - // smash them together into a 64-byte mask and get the bitmask from there. - uint64_t bs_and_quote = simd8x64<bool>(v0 == '\\', v1 == '\\', v0 == '"', v1 == '"').to_bitmask(); + simd8<uint8_t> v(src); + v.store(dst); return { - uint32_t(bs_and_quote), // bs_bits - uint32_t(bs_and_quote >> 32) // quote_bits + static_cast<uint32_t>((v == '\\').to_bitmask()), // bs_bits + static_cast<uint32_t>((v == '"').to_bitmask()), // quote_bits }; } @@ -45166,22 +45515,24 @@ simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *ds } } // unnamed namespace -} // namespace lsx +} // namespace lasx } // namespace simdjson -#endif // SIMDJSON_LSX_STRINGPARSING_DEFS_H -/* end file simdjson/lsx/stringparsing_defs.h */ +#endif // SIMDJSON_LASX_STRINGPARSING_DEFS_H +/* end file simdjson/lasx/stringparsing_defs.h */ #define SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT 1 -/* end file simdjson/lsx/begin.h */ -/* including generic/amalgamated.h for lsx: #include <generic/amalgamated.h> */ -/* begin file generic/amalgamated.h for lsx */ + + +/* end file simdjson/lasx/begin.h */ +/* including generic/amalgamated.h for lasx: #include <generic/amalgamated.h> */ +/* begin file generic/amalgamated.h for lasx */ #if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_SRC_GENERIC_DEPENDENCIES_H) #error generic/dependencies.h must be included before generic/amalgamated.h! #endif -/* including generic/base.h for lsx: #include <generic/base.h> */ -/* begin file generic/base.h for lsx */ +/* including generic/base.h for lasx: #include <generic/base.h> */ +/* begin file generic/base.h for lasx */ #ifndef SIMDJSON_SRC_GENERIC_BASE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -45191,19 +45542,19 @@ simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *ds /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace { struct json_character_block; } // unnamed namespace -} // namespace lsx +} // namespace lasx } // namespace simdjson #endif // SIMDJSON_SRC_GENERIC_BASE_H -/* end file generic/base.h for lsx */ -/* including generic/dom_parser_implementation.h for lsx: #include <generic/dom_parser_implementation.h> */ -/* begin file generic/dom_parser_implementation.h for lsx */ +/* end file generic/base.h for lasx */ +/* including generic/dom_parser_implementation.h for lasx: #include <generic/dom_parser_implementation.h> */ +/* begin file generic/dom_parser_implementation.h for lasx */ #ifndef SIMDJSON_SRC_GENERIC_DOM_PARSER_IMPLEMENTATION_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -45214,20 +45565,20 @@ struct json_character_block; // Interface a dom parser implementation must fulfill namespace simdjson { -namespace lsx { +namespace lasx { namespace { simdjson_inline simd8<uint8_t> must_be_2_3_continuation(const simd8<uint8_t> prev2, const simd8<uint8_t> prev3); simdjson_inline bool is_ascii(const simd8x64<uint8_t>& input); } // unnamed namespace -} // namespace lsx +} // namespace lasx } // namespace simdjson #endif // SIMDJSON_SRC_GENERIC_DOM_PARSER_IMPLEMENTATION_H -/* end file generic/dom_parser_implementation.h for lsx */ -/* including generic/json_character_block.h for lsx: #include <generic/json_character_block.h> */ -/* begin file generic/json_character_block.h for lsx */ +/* end file generic/dom_parser_implementation.h for lasx */ +/* including generic/json_character_block.h for lasx: #include <generic/json_character_block.h> */ +/* begin file generic/json_character_block.h for lasx */ #ifndef SIMDJSON_SRC_GENERIC_JSON_CHARACTER_BLOCK_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -45236,7 +45587,7 @@ simdjson_inline bool is_ascii(const simd8x64<uint8_t>& input); /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace { struct json_character_block { @@ -45251,17 +45602,17 @@ struct json_character_block { }; } // unnamed namespace -} // namespace lsx +} // namespace lasx } // namespace simdjson #endif // SIMDJSON_SRC_GENERIC_JSON_CHARACTER_BLOCK_H -/* end file generic/json_character_block.h for lsx */ -/* end file generic/amalgamated.h for lsx */ -/* including generic/stage1/amalgamated.h for lsx: #include <generic/stage1/amalgamated.h> */ -/* begin file generic/stage1/amalgamated.h for lsx */ +/* end file generic/json_character_block.h for lasx */ +/* end file generic/amalgamated.h for lasx */ +/* including generic/stage1/amalgamated.h for lasx: #include <generic/stage1/amalgamated.h> */ +/* begin file generic/stage1/amalgamated.h for lasx */ // Stuff other things depend on -/* including generic/stage1/base.h for lsx: #include <generic/stage1/base.h> */ -/* begin file generic/stage1/base.h for lsx */ +/* including generic/stage1/base.h for lasx: #include <generic/stage1/base.h> */ +/* begin file generic/stage1/base.h for lasx */ #ifndef SIMDJSON_SRC_GENERIC_STAGE1_BASE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -45270,7 +45621,7 @@ struct json_character_block { /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace { namespace stage1 { @@ -45293,13 +45644,13 @@ struct utf8_checker; using utf8_validation::utf8_checker; } // unnamed namespace -} // namespace lsx +} // namespace lasx } // namespace simdjson #endif // SIMDJSON_SRC_GENERIC_STAGE1_BASE_H -/* end file generic/stage1/base.h for lsx */ -/* including generic/stage1/buf_block_reader.h for lsx: #include <generic/stage1/buf_block_reader.h> */ -/* begin file generic/stage1/buf_block_reader.h for lsx */ +/* end file generic/stage1/base.h for lasx */ +/* including generic/stage1/buf_block_reader.h for lasx: #include <generic/stage1/buf_block_reader.h> */ +/* begin file generic/stage1/buf_block_reader.h for lasx */ #ifndef SIMDJSON_SRC_GENERIC_STAGE1_BUF_BLOCK_READER_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -45310,7 +45661,7 @@ using utf8_validation::utf8_checker; #include <cstring> namespace simdjson { -namespace lsx { +namespace lasx { namespace { namespace stage1 { @@ -45412,13 +45763,13 @@ simdjson_inline void buf_block_reader<STEP_SIZE>::advance() { } // namespace stage1 } // unnamed namespace -} // namespace lsx +} // namespace lasx } // namespace simdjson #endif // SIMDJSON_SRC_GENERIC_STAGE1_BUF_BLOCK_READER_H -/* end file generic/stage1/buf_block_reader.h for lsx */ -/* including generic/stage1/json_escape_scanner.h for lsx: #include <generic/stage1/json_escape_scanner.h> */ -/* begin file generic/stage1/json_escape_scanner.h for lsx */ +/* end file generic/stage1/buf_block_reader.h for lasx */ +/* including generic/stage1/json_escape_scanner.h for lasx: #include <generic/stage1/json_escape_scanner.h> */ +/* begin file generic/stage1/json_escape_scanner.h for lasx */ #ifndef SIMDJSON_SRC_GENERIC_STAGE1_JSON_ESCAPE_SCANNER_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -45428,7 +45779,7 @@ simdjson_inline void buf_block_reader<STEP_SIZE>::advance() { /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace { namespace stage1 { @@ -45566,13 +45917,13 @@ struct json_escape_scanner { } // namespace stage1 } // unnamed namespace -} // namespace lsx +} // namespace lasx } // namespace simdjson #endif // SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRING_SCANNER_H -/* end file generic/stage1/json_escape_scanner.h for lsx */ -/* including generic/stage1/json_string_scanner.h for lsx: #include <generic/stage1/json_string_scanner.h> */ -/* begin file generic/stage1/json_string_scanner.h for lsx */ +/* end file generic/stage1/json_escape_scanner.h for lasx */ +/* including generic/stage1/json_string_scanner.h for lasx: #include <generic/stage1/json_string_scanner.h> */ +/* begin file generic/stage1/json_string_scanner.h for lasx */ #ifndef SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRING_SCANNER_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -45582,7 +45933,7 @@ struct json_escape_scanner { /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace { namespace stage1 { @@ -45668,13 +46019,13 @@ simdjson_really_inline error_code json_string_scanner::finish() { } // namespace stage1 } // unnamed namespace -} // namespace lsx +} // namespace lasx } // namespace simdjson #endif // SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRING_SCANNER_H -/* end file generic/stage1/json_string_scanner.h for lsx */ -/* including generic/stage1/utf8_lookup4_algorithm.h for lsx: #include <generic/stage1/utf8_lookup4_algorithm.h> */ -/* begin file generic/stage1/utf8_lookup4_algorithm.h for lsx */ +/* end file generic/stage1/json_string_scanner.h for lasx */ +/* including generic/stage1/utf8_lookup4_algorithm.h for lasx: #include <generic/stage1/utf8_lookup4_algorithm.h> */ +/* begin file generic/stage1/utf8_lookup4_algorithm.h for lasx */ #ifndef SIMDJSON_SRC_GENERIC_STAGE1_UTF8_LOOKUP4_ALGORITHM_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -45684,7 +46035,7 @@ simdjson_really_inline error_code json_string_scanner::finish() { /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace { namespace utf8_validation { @@ -45796,7 +46147,7 @@ using namespace simd; simdjson_inline simd8<uint8_t> is_incomplete(const simd8<uint8_t> input) { // If the previous input's last 3 bytes match this, they're too short (they ended at EOF): // ... 1111____ 111_____ 11______ -#if SIMDJSON_IMPLEMENTATION_ICELAKE +#if SIMDJSON_IMPLEMENTATION_ICELAKE || (SIMDJSON_IMPLEMENTATION_RVV_VLS && __riscv_v_fixed_vlen >= 512) static const uint8_t max_array[64] = { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, @@ -45857,18 +46208,18 @@ using namespace simd; || (simd8x64<uint8_t>::NUM_CHUNKS == 4), "We support one, two or four chunks per 64-byte block."); SIMDJSON_IF_CONSTEXPR (simd8x64<uint8_t>::NUM_CHUNKS == 1) { - this->check_utf8_bytes(input.chunks[0], this->prev_input_block); + this->check_utf8_bytes(input.get<0>(), this->prev_input_block); } else SIMDJSON_IF_CONSTEXPR (simd8x64<uint8_t>::NUM_CHUNKS == 2) { - this->check_utf8_bytes(input.chunks[0], this->prev_input_block); - this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + this->check_utf8_bytes(input.get<0>(), this->prev_input_block); + this->check_utf8_bytes(input.get<1>(), input.get<0>()); } else SIMDJSON_IF_CONSTEXPR (simd8x64<uint8_t>::NUM_CHUNKS == 4) { - this->check_utf8_bytes(input.chunks[0], this->prev_input_block); - this->check_utf8_bytes(input.chunks[1], input.chunks[0]); - this->check_utf8_bytes(input.chunks[2], input.chunks[1]); - this->check_utf8_bytes(input.chunks[3], input.chunks[2]); + this->check_utf8_bytes(input.get<0>(), this->prev_input_block); + this->check_utf8_bytes(input.get<1>(), input.get<0>()); + this->check_utf8_bytes(input.get<2>(), input.get<1>()); + this->check_utf8_bytes(input.get<3>(), input.get<2>()); } - this->prev_incomplete = is_incomplete(input.chunks[simd8x64<uint8_t>::NUM_CHUNKS-1]); - this->prev_input_block = input.chunks[simd8x64<uint8_t>::NUM_CHUNKS-1]; + this->prev_incomplete = is_incomplete(input.get<simd8x64<uint8_t>::NUM_CHUNKS-1>()); + this->prev_input_block = input.get<simd8x64<uint8_t>::NUM_CHUNKS-1>(); } } // do not forget to call check_eof! @@ -45880,13 +46231,13 @@ using namespace simd; } // namespace utf8_validation } // unnamed namespace -} // namespace lsx +} // namespace lasx } // namespace simdjson #endif // SIMDJSON_SRC_GENERIC_STAGE1_UTF8_LOOKUP4_ALGORITHM_H -/* end file generic/stage1/utf8_lookup4_algorithm.h for lsx */ -/* including generic/stage1/json_scanner.h for lsx: #include <generic/stage1/json_scanner.h> */ -/* begin file generic/stage1/json_scanner.h for lsx */ +/* end file generic/stage1/utf8_lookup4_algorithm.h for lasx */ +/* including generic/stage1/json_scanner.h for lasx: #include <generic/stage1/json_scanner.h> */ +/* begin file generic/stage1/json_scanner.h for lasx */ #ifndef SIMDJSON_SRC_GENERIC_STAGE1_JSON_SCANNER_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -45897,7 +46248,7 @@ using namespace simd; /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace { namespace stage1 { @@ -46051,15 +46402,15 @@ simdjson_warn_unused simdjson_inline error_code json_scanner::finish() { } // namespace stage1 } // unnamed namespace -} // namespace lsx +} // namespace lasx } // namespace simdjson #endif // SIMDJSON_SRC_GENERIC_STAGE1_JSON_SCANNER_H -/* end file generic/stage1/json_scanner.h for lsx */ +/* end file generic/stage1/json_scanner.h for lasx */ // All other declarations -/* including generic/stage1/find_next_document_index.h for lsx: #include <generic/stage1/find_next_document_index.h> */ -/* begin file generic/stage1/find_next_document_index.h for lsx */ +/* including generic/stage1/find_next_document_index.h for lasx: #include <generic/stage1/find_next_document_index.h> */ +/* begin file generic/stage1/find_next_document_index.h for lasx */ #ifndef SIMDJSON_SRC_GENERIC_STAGE1_FIND_NEXT_DOCUMENT_INDEX_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -46069,7 +46420,7 @@ simdjson_warn_unused simdjson_inline error_code json_scanner::finish() { /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace { namespace stage1 { @@ -46161,13 +46512,13 @@ simdjson_inline uint32_t find_next_document_index(dom_parser_implementation &par } // namespace stage1 } // unnamed namespace -} // namespace lsx +} // namespace lasx } // namespace simdjson #endif // SIMDJSON_SRC_GENERIC_STAGE1_FIND_NEXT_DOCUMENT_INDEX_H -/* end file generic/stage1/find_next_document_index.h for lsx */ -/* including generic/stage1/json_minifier.h for lsx: #include <generic/stage1/json_minifier.h> */ -/* begin file generic/stage1/json_minifier.h for lsx */ +/* end file generic/stage1/find_next_document_index.h for lasx */ +/* including generic/stage1/json_minifier.h for lasx: #include <generic/stage1/json_minifier.h> */ +/* begin file generic/stage1/json_minifier.h for lasx */ #ifndef SIMDJSON_SRC_GENERIC_STAGE1_JSON_MINIFIER_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -46183,7 +46534,7 @@ simdjson_inline uint32_t find_next_document_index(dom_parser_implementation &par // "simdjson/stage1.h" (this simplifies amalgation) namespace simdjson { -namespace lsx { +namespace lasx { namespace { namespace stage1 { @@ -46268,13 +46619,13 @@ error_code json_minifier::minify(const uint8_t *buf, size_t len, uint8_t *dst, s } // namespace stage1 } // unnamed namespace -} // namespace lsx +} // namespace lasx } // namespace simdjson #endif // SIMDJSON_SRC_GENERIC_STAGE1_JSON_MINIFIER_H -/* end file generic/stage1/json_minifier.h for lsx */ -/* including generic/stage1/json_structural_indexer.h for lsx: #include <generic/stage1/json_structural_indexer.h> */ -/* begin file generic/stage1/json_structural_indexer.h for lsx */ +/* end file generic/stage1/json_minifier.h for lasx */ +/* including generic/stage1/json_structural_indexer.h for lasx: #include <generic/stage1/json_structural_indexer.h> */ +/* begin file generic/stage1/json_structural_indexer.h for lasx */ #ifndef SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRUCTURAL_INDEXER_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -46294,7 +46645,7 @@ error_code json_minifier::minify(const uint8_t *buf, size_t len, uint8_t *dst, s // "simdjson/stage1.h" (this simplifies amalgation) namespace simdjson { -namespace lsx { +namespace lasx { namespace { namespace stage1 { @@ -46626,16 +46977,16 @@ simdjson_inline error_code json_structural_indexer::finish(dom_parser_implementa } // namespace stage1 } // unnamed namespace -} // namespace lsx +} // namespace lasx } // namespace simdjson // Clear CUSTOM_BIT_INDEXER so other implementations can set it if they need to. #undef SIMDJSON_GENERIC_JSON_STRUCTURAL_INDEXER_CUSTOM_BIT_INDEXER #endif // SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRUCTURAL_INDEXER_H -/* end file generic/stage1/json_structural_indexer.h for lsx */ -/* including generic/stage1/utf8_validator.h for lsx: #include <generic/stage1/utf8_validator.h> */ -/* begin file generic/stage1/utf8_validator.h for lsx */ +/* end file generic/stage1/json_structural_indexer.h for lasx */ +/* including generic/stage1/utf8_validator.h for lasx: #include <generic/stage1/utf8_validator.h> */ +/* begin file generic/stage1/utf8_validator.h for lasx */ #ifndef SIMDJSON_SRC_GENERIC_STAGE1_UTF8_VALIDATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -46646,7 +46997,7 @@ simdjson_inline error_code json_structural_indexer::finish(dom_parser_implementa /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace { namespace stage1 { @@ -46677,17 +47028,17 @@ bool generic_validate_utf8(const char * input, size_t length) { } // namespace stage1 } // unnamed namespace -} // namespace lsx +} // namespace lasx } // namespace simdjson #endif // SIMDJSON_SRC_GENERIC_STAGE1_UTF8_VALIDATOR_H -/* end file generic/stage1/utf8_validator.h for lsx */ -/* end file generic/stage1/amalgamated.h for lsx */ -/* including generic/stage2/amalgamated.h for lsx: #include <generic/stage2/amalgamated.h> */ -/* begin file generic/stage2/amalgamated.h for lsx */ +/* end file generic/stage1/utf8_validator.h for lasx */ +/* end file generic/stage1/amalgamated.h for lasx */ +/* including generic/stage2/amalgamated.h for lasx: #include <generic/stage2/amalgamated.h> */ +/* begin file generic/stage2/amalgamated.h for lasx */ // Stuff other things depend on -/* including generic/stage2/base.h for lsx: #include <generic/stage2/base.h> */ -/* begin file generic/stage2/base.h for lsx */ +/* including generic/stage2/base.h for lasx: #include <generic/stage2/base.h> */ +/* begin file generic/stage2/base.h for lasx */ #ifndef SIMDJSON_SRC_GENERIC_STAGE2_BASE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -46696,7 +47047,7 @@ bool generic_validate_utf8(const char * input, size_t length) { /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace { namespace stage2 { @@ -46707,13 +47058,13 @@ struct tape_writer; } // namespace stage2 } // unnamed namespace -} // namespace lsx +} // namespace lasx } // namespace simdjson #endif // SIMDJSON_SRC_GENERIC_STAGE2_BASE_H -/* end file generic/stage2/base.h for lsx */ -/* including generic/stage2/tape_writer.h for lsx: #include <generic/stage2/tape_writer.h> */ -/* begin file generic/stage2/tape_writer.h for lsx */ +/* end file generic/stage2/base.h for lasx */ +/* including generic/stage2/tape_writer.h for lasx: #include <generic/stage2/tape_writer.h> */ +/* begin file generic/stage2/tape_writer.h for lasx */ #ifndef SIMDJSON_SRC_GENERIC_STAGE2_TAPE_WRITER_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -46725,7 +47076,7 @@ struct tape_writer; #include <cstring> namespace simdjson { -namespace lsx { +namespace lasx { namespace { namespace stage2 { @@ -46742,6 +47093,9 @@ struct tape_writer { /** Write a double value to tape. */ simdjson_inline void append_double(double value) noexcept; + /** Write a big integer (as string) to tape. src points to first digit, len is byte count. */ + simdjson_inline void append_bigint(const uint8_t *src, size_t len, uint8_t *&string_buf) noexcept; + /** * Append a tape entry (an 8-bit type,and 56 bits worth of value). */ @@ -46825,15 +47179,27 @@ simdjson_inline void tape_writer::write(uint64_t &tape_loc, uint64_t val, intern tape_loc = val | ((uint64_t(char(t))) << 56); } +simdjson_inline void tape_writer::append_bigint(const uint8_t *src, size_t len, uint8_t *&string_buf) noexcept { + // Write to string buffer: [4-byte LE length][digits][null] + uint32_t str_len = uint32_t(len); + memcpy(string_buf, &str_len, sizeof(uint32_t)); + memcpy(string_buf + sizeof(uint32_t), src, len); + string_buf[sizeof(uint32_t) + len] = 0; + // Tape entry: offset into string buffer + // The caller must set the offset relative to doc.string_buf base + append(0, internal::tape_type::BIGINT); // placeholder offset, caller patches + string_buf += sizeof(uint32_t) + len + 1; +} + } // namespace stage2 } // unnamed namespace -} // namespace lsx +} // namespace lasx } // namespace simdjson #endif // SIMDJSON_SRC_GENERIC_STAGE2_TAPE_WRITER_H -/* end file generic/stage2/tape_writer.h for lsx */ -/* including generic/stage2/logger.h for lsx: #include <generic/stage2/logger.h> */ -/* begin file generic/stage2/logger.h for lsx */ +/* end file generic/stage2/tape_writer.h for lasx */ +/* including generic/stage2/logger.h for lasx: #include <generic/stage2/logger.h> */ +/* begin file generic/stage2/logger.h for lasx */ #ifndef SIMDJSON_SRC_GENERIC_STAGE2_LOGGER_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -46847,7 +47213,7 @@ simdjson_inline void tape_writer::write(uint64_t &tape_loc, uint64_t val, intern // This is for an internal-only stage 2 specific logger. // Set LOG_ENABLED = true to log what stage 2 is doing! namespace simdjson { -namespace lsx { +namespace lasx { namespace { namespace logger { @@ -46930,15 +47296,15 @@ namespace logger { } // namespace logger } // unnamed namespace -} // namespace lsx +} // namespace lasx } // namespace simdjson #endif // SIMDJSON_SRC_GENERIC_STAGE2_LOGGER_H -/* end file generic/stage2/logger.h for lsx */ +/* end file generic/stage2/logger.h for lasx */ // All other declarations -/* including generic/stage2/json_iterator.h for lsx: #include <generic/stage2/json_iterator.h> */ -/* begin file generic/stage2/json_iterator.h for lsx */ +/* including generic/stage2/json_iterator.h for lasx: #include <generic/stage2/json_iterator.h> */ +/* begin file generic/stage2/json_iterator.h for lasx */ #ifndef SIMDJSON_SRC_GENERIC_STAGE2_JSON_ITERATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -46949,7 +47315,7 @@ namespace logger { /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace { namespace stage2 { @@ -47263,13 +47629,13 @@ simdjson_warn_unused simdjson_inline error_code json_iterator::visit_primitive(V } // namespace stage2 } // unnamed namespace -} // namespace lsx +} // namespace lasx } // namespace simdjson #endif // SIMDJSON_SRC_GENERIC_STAGE2_JSON_ITERATOR_H -/* end file generic/stage2/json_iterator.h for lsx */ -/* including generic/stage2/stringparsing.h for lsx: #include <generic/stage2/stringparsing.h> */ -/* begin file generic/stage2/stringparsing.h for lsx */ +/* end file generic/stage2/json_iterator.h for lasx */ +/* including generic/stage2/stringparsing.h for lasx: #include <generic/stage2/stringparsing.h> */ +/* begin file generic/stage2/stringparsing.h for lasx */ #include <cstdint> #ifndef SIMDJSON_SRC_GENERIC_STAGE2_STRINGPARSING_H @@ -47283,7 +47649,7 @@ simdjson_warn_unused simdjson_inline error_code json_iterator::visit_primitive(V // It is intended to be included multiple times and compiled multiple times namespace simdjson { -namespace lsx { +namespace lasx { namespace { /// @private namespace stringparsing { @@ -47514,13 +47880,13 @@ simdjson_warn_unused simdjson_inline uint8_t *parse_wobbly_string(const uint8_t } // namespace stringparsing } // unnamed namespace -} // namespace lsx +} // namespace lasx } // namespace simdjson #endif // SIMDJSON_SRC_GENERIC_STAGE2_STRINGPARSING_H -/* end file generic/stage2/stringparsing.h for lsx */ -/* including generic/stage2/structural_iterator.h for lsx: #include <generic/stage2/structural_iterator.h> */ -/* begin file generic/stage2/structural_iterator.h for lsx */ +/* end file generic/stage2/stringparsing.h for lasx */ +/* including generic/stage2/structural_iterator.h for lasx: #include <generic/stage2/structural_iterator.h> */ +/* begin file generic/stage2/structural_iterator.h for lasx */ #ifndef SIMDJSON_SRC_GENERIC_STAGE2_STRUCTURAL_ITERATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -47530,7 +47896,7 @@ simdjson_warn_unused simdjson_inline uint8_t *parse_wobbly_string(const uint8_t /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace { namespace stage2 { @@ -47581,13 +47947,13 @@ class structural_iterator { } // namespace stage2 } // unnamed namespace -} // namespace lsx +} // namespace lasx } // namespace simdjson #endif // SIMDJSON_SRC_GENERIC_STAGE2_STRUCTURAL_ITERATOR_H -/* end file generic/stage2/structural_iterator.h for lsx */ -/* including generic/stage2/tape_builder.h for lsx: #include <generic/stage2/tape_builder.h> */ -/* begin file generic/stage2/tape_builder.h for lsx */ +/* end file generic/stage2/structural_iterator.h for lasx */ +/* including generic/stage2/tape_builder.h for lasx: #include <generic/stage2/tape_builder.h> */ +/* begin file generic/stage2/tape_builder.h for lasx */ #ifndef SIMDJSON_SRC_GENERIC_STAGE2_TAPE_BUILDER_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -47604,7 +47970,7 @@ class structural_iterator { namespace simdjson { -namespace lsx { +namespace lasx { namespace { namespace stage2 { @@ -47762,7 +48128,23 @@ simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_string( simdjson_warn_unused simdjson_inline error_code tape_builder::visit_number(json_iterator &iter, const uint8_t *value) noexcept { iter.log_value("number"); - return numberparsing::parse_number(value, tape); + error_code err = numberparsing::parse_number(value, tape); + if (simdjson_unlikely(err == BIGINT_ERROR && + iter.dom_parser._number_as_string)) { + // Write big integer to string buffer using the same format as strings. + // Scan digits the same way parse_number does (skip optional '-', then digits). + const uint8_t *p = value; + if (*p == '-') p++; + while (numberparsing::is_digit(*p)) p++; + size_t len = size_t(p - value); + tape.append(current_string_buf_loc - iter.dom_parser.doc->string_buf.get(), internal::tape_type::BIGINT); + uint8_t *dst = current_string_buf_loc + sizeof(uint32_t); + memcpy(dst, value, len); + dst += len; + on_end_string(dst); + return SUCCESS; + } + return err; } simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_number(json_iterator &iter, const uint8_t *value) noexcept { @@ -47881,18 +48263,18 @@ simdjson_inline void tape_builder::on_end_string(uint8_t *dst) noexcept { } // namespace stage2 } // unnamed namespace -} // namespace lsx +} // namespace lasx } // namespace simdjson #endif // SIMDJSON_SRC_GENERIC_STAGE2_TAPE_BUILDER_H -/* end file generic/stage2/tape_builder.h for lsx */ -/* end file generic/stage2/amalgamated.h for lsx */ +/* end file generic/stage2/tape_builder.h for lasx */ +/* end file generic/stage2/amalgamated.h for lasx */ // // Stage 1 // namespace simdjson { -namespace lsx { +namespace lasx { simdjson_warn_unused error_code implementation::create_dom_parser_implementation( size_t capacity, @@ -47914,7 +48296,7 @@ using namespace simd; simdjson_inline json_character_block json_character_block::classify(const simd::simd8x64<uint8_t>& in) { // Inspired by haswell. - // LSX use low 5 bits as index. For the 6 operators (:,[]{}), the unique-5bits is [6:2]. + // LASX use low 5 bits as index. For the 6 operators (:,[]{}), the unique-5bits is [6:2]. // The ASCII white-space and operators have these values: (char, hex, unique-5bits) // (' ', 20, 00000) ('\t', 09, 01001) ('\n', 0A, 01010) ('\r', 0D, 01101) // (',', 2C, 01011) (':', 3A, 01110) ('[', 5B, 10110) ('{', 7B, 11110) (']', 5D, 10111) ('}', 7D, 11111) @@ -47930,14 +48312,10 @@ simdjson_inline json_character_block json_character_block::classify(const simd:: uint64_t ws = in.eq({ in.chunks[0].lookup_16(ws_table), in.chunks[1].lookup_16(ws_table), - in.chunks[2].lookup_16(ws_table), - in.chunks[3].lookup_16(ws_table) }); uint64_t op = in.eq({ - __lsx_vshuf_b(op_table_hi, op_table_lo, in.chunks[0].shr<2>()), - __lsx_vshuf_b(op_table_hi, op_table_lo, in.chunks[1].shr<2>()), - __lsx_vshuf_b(op_table_hi, op_table_lo, in.chunks[2].shr<2>()), - __lsx_vshuf_b(op_table_hi, op_table_lo, in.chunks[3].shr<2>()) + __lasx_xvshuf_b(op_table_hi, op_table_lo, in.chunks[0].shr<2>()), + __lasx_xvshuf_b(op_table_hi, op_table_lo, in.chunks[1].shr<2>()), }); return { ws, op }; @@ -47954,7 +48332,7 @@ simdjson_inline simd8<uint8_t> must_be_2_3_continuation(const simd8<uint8_t> pre } } // unnamed namespace -} // namespace lsx +} // namespace lasx } // namespace simdjson // @@ -47965,20 +48343,20 @@ simdjson_inline simd8<uint8_t> must_be_2_3_continuation(const simd8<uint8_t> pre // Implementation-specific overrides // namespace simdjson { -namespace lsx { +namespace lasx { simdjson_warn_unused error_code implementation::minify(const uint8_t *buf, size_t len, uint8_t *dst, size_t &dst_len) const noexcept { - return lsx::stage1::json_minifier::minify<64>(buf, len, dst, dst_len); + return lasx::stage1::json_minifier::minify<64>(buf, len, dst, dst_len); } simdjson_warn_unused error_code dom_parser_implementation::stage1(const uint8_t *_buf, size_t _len, stage1_mode streaming) noexcept { this->buf = _buf; this->len = _len; - return lsx::stage1::json_structural_indexer::index<64>(buf, len, *this, streaming); + return lasx::stage1::json_structural_indexer::index<64>(buf, len, *this, streaming); } simdjson_warn_unused bool implementation::validate_utf8(const char *buf, size_t len) const noexcept { - return lsx::stage1::generic_validate_utf8(buf,len); + return lasx::stage1::generic_validate_utf8(buf,len); } simdjson_warn_unused error_code dom_parser_implementation::stage2(dom::document &_doc) noexcept { @@ -47991,11 +48369,11 @@ simdjson_warn_unused error_code dom_parser_implementation::stage2_next(dom::docu SIMDJSON_NO_SANITIZE_MEMORY simdjson_warn_unused uint8_t *dom_parser_implementation::parse_string(const uint8_t *src, uint8_t *dst, bool allow_replacement) const noexcept { - return lsx::stringparsing::parse_string(src, dst, allow_replacement); + return lasx::stringparsing::parse_string(src, dst, allow_replacement); } simdjson_warn_unused uint8_t *dom_parser_implementation::parse_wobbly_string(const uint8_t *src, uint8_t *dst) const noexcept { - return lsx::stringparsing::parse_wobbly_string(src, dst); + return lasx::stringparsing::parse_wobbly_string(src, dst); } simdjson_warn_unused error_code dom_parser_implementation::parse(const uint8_t *_buf, size_t _len, dom::document &_doc) noexcept { @@ -48004,46 +48382,53 @@ simdjson_warn_unused error_code dom_parser_implementation::parse(const uint8_t * return stage2(_doc); } -} // namespace lsx +} // namespace lasx } // namespace simdjson -/* including simdjson/lsx/end.h: #include <simdjson/lsx/end.h> */ -/* begin file simdjson/lsx/end.h */ +/* including simdjson/lasx/end.h: #include <simdjson/lasx/end.h> */ +/* begin file simdjson/lasx/end.h */ /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ #undef SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT -/* undefining SIMDJSON_IMPLEMENTATION from "lsx" */ +/* undefining SIMDJSON_IMPLEMENTATION from "lasx" */ #undef SIMDJSON_IMPLEMENTATION -/* end file simdjson/lsx/end.h */ -#endif // SIMDJSON_SRC_LSX_CPP -/* end file lsx.cpp */ + +#if SIMDJSON_CAN_ALWAYS_RUN_LASX +// nothing needed. +#else +SIMDJSON_UNTARGET_REGION #endif -#if SIMDJSON_IMPLEMENTATION_LASX -/* including lasx.cpp: #include <lasx.cpp> */ -/* begin file lasx.cpp */ -#ifndef SIMDJSON_SRC_LASX_CPP -#define SIMDJSON_SRC_LASX_CPP +/* end file simdjson/lasx/end.h */ + +#endif // SIMDJSON_SRC_LASX_CPP +/* end file lasx.cpp */ +#endif +#if SIMDJSON_IMPLEMENTATION_LSX +/* including lsx.cpp: #include <lsx.cpp> */ +/* begin file lsx.cpp */ +#ifndef SIMDJSON_SRC_LSX_CPP +#define SIMDJSON_SRC_LSX_CPP /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ /* amalgamation skipped (editor-only): #include <base.h> */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -/* including simdjson/lasx.h: #include <simdjson/lasx.h> */ -/* begin file simdjson/lasx.h */ -#ifndef SIMDJSON_LASX_H -#define SIMDJSON_LASX_H +/* including simdjson/lsx.h: #include <simdjson/lsx.h> */ +/* begin file simdjson/lsx.h */ +#ifndef SIMDJSON_LSX_H +#define SIMDJSON_LSX_H -/* including simdjson/lasx/begin.h: #include "simdjson/lasx/begin.h" */ -/* begin file simdjson/lasx/begin.h */ -/* defining SIMDJSON_IMPLEMENTATION to "lasx" */ -#define SIMDJSON_IMPLEMENTATION lasx -/* including simdjson/lasx/base.h: #include "simdjson/lasx/base.h" */ -/* begin file simdjson/lasx/base.h */ -#ifndef SIMDJSON_LASX_BASE_H -#define SIMDJSON_LASX_BASE_H +/* including simdjson/lsx/begin.h: #include "simdjson/lsx/begin.h" */ +/* begin file simdjson/lsx/begin.h */ +/* defining SIMDJSON_IMPLEMENTATION to "lsx" */ +#define SIMDJSON_IMPLEMENTATION lsx +/* including simdjson/lsx/base.h: #include "simdjson/lsx/base.h" */ +/* begin file simdjson/lsx/base.h */ +#ifndef SIMDJSON_LSX_BASE_H +#define SIMDJSON_LSX_BASE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ /* amalgamation skipped (editor-only): #include "simdjson/base.h" */ @@ -48051,9 +48436,9 @@ simdjson_warn_unused error_code dom_parser_implementation::parse(const uint8_t * namespace simdjson { /** - * Implementation for LASX. + * Implementation for LSX. */ -namespace lasx { +namespace lsx { class implementation; @@ -48064,41 +48449,39 @@ template <typename T> struct simd8x64; } // namespace simd } // unnamed namespace -} // namespace lasx +} // namespace lsx } // namespace simdjson -#endif // SIMDJSON_LASX_BASE_H -/* end file simdjson/lasx/base.h */ -/* including simdjson/lasx/intrinsics.h: #include "simdjson/lasx/intrinsics.h" */ -/* begin file simdjson/lasx/intrinsics.h */ -#ifndef SIMDJSON_LASX_INTRINSICS_H -#define SIMDJSON_LASX_INTRINSICS_H +#endif // SIMDJSON_LSX_BASE_H +/* end file simdjson/lsx/base.h */ +/* including simdjson/lsx/intrinsics.h: #include "simdjson/lsx/intrinsics.h" */ +/* begin file simdjson/lsx/intrinsics.h */ +#ifndef SIMDJSON_LSX_INTRINSICS_H +#define SIMDJSON_LSX_INTRINSICS_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -// This should be the correct header whether -// you use visual studio or other compilers. -#include <lasxintrin.h> +#include <lsxintrin.h> -static_assert(sizeof(__m256i) <= simdjson::SIMDJSON_PADDING, "insufficient padding for LoongArch ASX"); +static_assert(sizeof(__m128i) <= simdjson::SIMDJSON_PADDING, "insufficient padding for LoongArch SX"); -#endif // SIMDJSON_LASX_INTRINSICS_H -/* end file simdjson/lasx/intrinsics.h */ -/* including simdjson/lasx/bitmanipulation.h: #include "simdjson/lasx/bitmanipulation.h" */ -/* begin file simdjson/lasx/bitmanipulation.h */ -#ifndef SIMDJSON_LASX_BITMANIPULATION_H -#define SIMDJSON_LASX_BITMANIPULATION_H +#endif // SIMDJSON_LSX_INTRINSICS_H +/* end file simdjson/lsx/intrinsics.h */ +/* including simdjson/lsx/bitmanipulation.h: #include "simdjson/lsx/bitmanipulation.h" */ +/* begin file simdjson/lsx/bitmanipulation.h */ +#ifndef SIMDJSON_LSX_BITMANIPULATION_H +#define SIMDJSON_LSX_BITMANIPULATION_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/intrinsics.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/bitmask.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/intrinsics.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/bitmask.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace lsx { namespace { // We sometimes call trailing_zero on inputs that are zero, @@ -48125,7 +48508,7 @@ simdjson_inline int leading_zeroes(uint64_t input_num) { /* result might be undefined when input_num is zero */ simdjson_inline int count_ones(uint64_t input_num) { - return __lasx_xvpickve2gr_w(__lasx_xvpcnt_d(__m256i(v4u64{input_num, 0, 0, 0})), 0); + return __lsx_vpickve2gr_w(__lsx_vpcnt_d(__m128i(v2u64{input_num, 0})), 0); } simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2, uint64_t *result) { @@ -48134,22 +48517,22 @@ simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2, uint64_t *re } } // unnamed namespace -} // namespace lasx +} // namespace lsx } // namespace simdjson -#endif // SIMDJSON_LASX_BITMANIPULATION_H -/* end file simdjson/lasx/bitmanipulation.h */ -/* including simdjson/lasx/bitmask.h: #include "simdjson/lasx/bitmask.h" */ -/* begin file simdjson/lasx/bitmask.h */ -#ifndef SIMDJSON_LASX_BITMASK_H -#define SIMDJSON_LASX_BITMASK_H +#endif // SIMDJSON_LSX_BITMANIPULATION_H +/* end file simdjson/lsx/bitmanipulation.h */ +/* including simdjson/lsx/bitmask.h: #include "simdjson/lsx/bitmask.h" */ +/* begin file simdjson/lsx/bitmask.h */ +#ifndef SIMDJSON_LSX_BITMASK_H +#define SIMDJSON_LSX_BITMASK_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace lsx { namespace { // @@ -48168,26 +48551,26 @@ simdjson_inline uint64_t prefix_xor(uint64_t bitmask) { } } // unnamed namespace -} // namespace lasx +} // namespace lsx } // namespace simdjson #endif -/* end file simdjson/lasx/bitmask.h */ -/* including simdjson/lasx/numberparsing_defs.h: #include "simdjson/lasx/numberparsing_defs.h" */ -/* begin file simdjson/lasx/numberparsing_defs.h */ -#ifndef SIMDJSON_LASX_NUMBERPARSING_DEFS_H -#define SIMDJSON_LASX_NUMBERPARSING_DEFS_H +/* end file simdjson/lsx/bitmask.h */ +/* including simdjson/lsx/numberparsing_defs.h: #include "simdjson/lsx/numberparsing_defs.h" */ +/* begin file simdjson/lsx/numberparsing_defs.h */ +#ifndef SIMDJSON_LSX_NUMBERPARSING_DEFS_H +#define SIMDJSON_LSX_NUMBERPARSING_DEFS_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/intrinsics.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/intrinsics.h" */ /* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ #include <cstring> namespace simdjson { -namespace lasx { +namespace lsx { namespace numberparsing { // we don't have appropriate instructions, so let us use a scalar function @@ -48210,7 +48593,7 @@ simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t } } // namespace numberparsing -} // namespace lasx +} // namespace lsx } // namespace simdjson #ifndef SIMDJSON_SWAR_NUMBER_PARSING @@ -48221,46 +48604,46 @@ simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t #endif #endif -#endif // SIMDJSON_LASX_NUMBERPARSING_DEFS_H -/* end file simdjson/lasx/numberparsing_defs.h */ -/* including simdjson/lasx/simd.h: #include "simdjson/lasx/simd.h" */ -/* begin file simdjson/lasx/simd.h */ -#ifndef SIMDJSON_LASX_SIMD_H -#define SIMDJSON_LASX_SIMD_H +#endif // SIMDJSON_LSX_NUMBERPARSING_DEFS_H +/* end file simdjson/lsx/numberparsing_defs.h */ +/* including simdjson/lsx/simd.h: #include "simdjson/lsx/simd.h" */ +/* begin file simdjson/lsx/simd.h */ +#ifndef SIMDJSON_LSX_SIMD_H +#define SIMDJSON_LSX_SIMD_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/bitmanipulation.h" */ /* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace lsx { namespace { namespace simd { // Forward-declared so they can be used by splat and friends. template<typename Child> struct base { - __m256i value; + __m128i value; // Zero constructor - simdjson_inline base() : value{__m256i()} {} + simdjson_inline base() : value{__m128i()} {} // Conversion from SIMD register - simdjson_inline base(const __m256i _value) : value(_value) {} + simdjson_inline base(const __m128i _value) : value(_value) {} // Conversion to SIMD register - simdjson_inline operator const __m256i&() const { return this->value; } - simdjson_inline operator __m256i&() { return this->value; } - simdjson_inline operator const v32i8&() const { return (v32i8&)this->value; } - simdjson_inline operator v32i8&() { return (v32i8&)this->value; } + simdjson_inline operator const __m128i&() const { return this->value; } + simdjson_inline operator __m128i&() { return this->value; } + simdjson_inline operator const v16i8&() const { return (v16i8&)this->value; } + simdjson_inline operator v16i8&() { return (v16i8&)this->value; } // Bit operations - simdjson_inline Child operator|(const Child other) const { return __lasx_xvor_v(*this, other); } - simdjson_inline Child operator&(const Child other) const { return __lasx_xvand_v(*this, other); } - simdjson_inline Child operator^(const Child other) const { return __lasx_xvxor_v(*this, other); } - simdjson_inline Child bit_andnot(const Child other) const { return __lasx_xvandn_v(other, *this); } + simdjson_inline Child operator|(const Child other) const { return __lsx_vor_v(*this, other); } + simdjson_inline Child operator&(const Child other) const { return __lsx_vand_v(*this, other); } + simdjson_inline Child operator^(const Child other) const { return __lsx_vxor_v(*this, other); } + simdjson_inline Child bit_andnot(const Child other) const { return __lsx_vandn_v(other, *this); } simdjson_inline Child& operator|=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast | other; return *this_cast; } simdjson_inline Child& operator&=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast & other; return *this_cast; } simdjson_inline Child& operator^=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast ^ other; return *this_cast; } @@ -48273,51 +48656,41 @@ namespace simd { template<typename T, typename Mask=simd8<bool>> struct base8: base<simd8<T>> { simdjson_inline base8() : base<simd8<T>>() {} - simdjson_inline base8(const __m256i _value) : base<simd8<T>>(_value) {} + simdjson_inline base8(const __m128i _value) : base<simd8<T>>(_value) {} - friend simdjson_really_inline Mask operator==(const simd8<T> lhs, const simd8<T> rhs) { return __lasx_xvseq_b(lhs, rhs); } + friend simdjson_really_inline Mask operator==(const simd8<T> lhs, const simd8<T> rhs) { return __lsx_vseq_b(lhs, rhs); } static const int SIZE = sizeof(base<simd8<T>>::value); template<int N=1> simdjson_inline simd8<T> prev(const simd8<T> prev_chunk) const { - __m256i hi = __lasx_xvbsll_v(*this, N); - __m256i lo = __lasx_xvbsrl_v(*this, 16 - N); - __m256i tmp = __lasx_xvbsrl_v(prev_chunk, 16 - N); - lo = __lasx_xvpermi_q(lo, tmp, 0x21); - return __lasx_xvor_v(hi, lo); + return __lsx_vor_v(__lsx_vbsll_v(*this, N), __lsx_vbsrl_v(prev_chunk, 16 - N)); } }; // SIMD byte mask type (returned by things like eq and gt) template<> struct simd8<bool>: base8<bool> { - static simdjson_inline simd8<bool> splat(bool _value) { return __lasx_xvreplgr2vr_b(uint8_t(-(!!_value))); } + static simdjson_inline simd8<bool> splat(bool _value) { + return __lsx_vreplgr2vr_b(uint8_t(-(!!_value))); + } simdjson_inline simd8() : base8() {} - simdjson_inline simd8(const __m256i _value) : base8<bool>(_value) {} + simdjson_inline simd8(const __m128i _value) : base8<bool>(_value) {} // Splat constructor simdjson_inline simd8(bool _value) : base8<bool>(splat(_value)) {} - simdjson_inline int to_bitmask() const { - __m256i mask = __lasx_xvmskltz_b(*this); - return (__lasx_xvpickve2gr_w(mask, 4) << 16) | (__lasx_xvpickve2gr_w(mask, 0)); - } - simdjson_inline bool any() const { - __m256i v = __lasx_xvmsknz_b(*this); - return (0 == __lasx_xvpickve2gr_w(v, 0)) && (0 == __lasx_xvpickve2gr_w(v, 4)); - } + simdjson_inline int to_bitmask() const { return __lsx_vpickve2gr_w(__lsx_vmskltz_b(*this), 0); } + simdjson_inline bool any() const { return 0 == __lsx_vpickve2gr_hu(__lsx_vmsknz_b(*this), 0); } simdjson_inline simd8<bool> operator~() const { return *this ^ true; } }; template<typename T> struct base8_numeric: base8<T> { - static simdjson_inline simd8<T> splat(T _value) { - return __lasx_xvreplgr2vr_b(_value); - } - static simdjson_inline simd8<T> zero() { return __lasx_xvldi(0); } - static simdjson_inline simd8<T> load(const T values[32]) { - return __lasx_xvld(reinterpret_cast<const __m256i *>(values), 0); + static simdjson_inline simd8<T> splat(T _value) { return __lsx_vreplgr2vr_b(_value); } + static simdjson_inline simd8<T> zero() { return __lsx_vldi(0); } + static simdjson_inline simd8<T> load(const T values[16]) { + return __lsx_vld(reinterpret_cast<const __m128i *>(values), 0); } // Repeat 16 values as many times as necessary (usually for lookup tables) static simdjson_inline simd8<T> repeat_16( @@ -48325,24 +48698,22 @@ namespace simd { T v8, T v9, T v10, T v11, T v12, T v13, T v14, T v15 ) { return simd8<T>( - v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,v11,v12,v13,v14,v15 ); } simdjson_inline base8_numeric() : base8<T>() {} - simdjson_inline base8_numeric(const __m256i _value) : base8<T>(_value) {} + simdjson_inline base8_numeric(const __m128i _value) : base8<T>(_value) {} // Store to array - simdjson_inline void store(T dst[32]) const { - return __lasx_xvst(*this, reinterpret_cast<__m256i *>(dst), 0); + simdjson_inline void store(T dst[16]) const { + return __lsx_vst(*this, reinterpret_cast<__m128i *>(dst), 0); } // Addition/subtraction are the same for signed and unsigned - simdjson_inline simd8<T> operator+(const simd8<T> other) const { return __lasx_xvadd_b(*this, other); } - simdjson_inline simd8<T> operator-(const simd8<T> other) const { return __lasx_xvsub_b(*this, other); } + simdjson_inline simd8<T> operator+(const simd8<T> other) const { return __lsx_vadd_b(*this, other); } + simdjson_inline simd8<T> operator-(const simd8<T> other) const { return __lsx_vsub_b(*this, other); } simdjson_inline simd8<T>& operator+=(const simd8<T> other) { *this = *this + other; return *static_cast<simd8<T>*>(this); } simdjson_inline simd8<T>& operator-=(const simd8<T> other) { *this = *this - other; return *static_cast<simd8<T>*>(this); } @@ -48352,7 +48723,7 @@ namespace simd { // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values) template<typename L> simdjson_inline simd8<L> lookup_16(simd8<L> lookup_table) const { - return __lasx_xvshuf_b(lookup_table, lookup_table, *this); + return __lsx_vshuf_b(lookup_table, lookup_table, *this); } // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted as a bitset). @@ -48360,38 +48731,26 @@ namespace simd { // Only the first 16 - count_ones(mask) bytes of the result are significant but 16 bytes // get written. template<typename L> - simdjson_inline void compress(uint32_t mask, L * output) const { + simdjson_inline void compress(uint16_t mask, L * output) const { using internal::thintable_epi8; using internal::BitsSetTable256mul2; using internal::pshufb_combine_table; // this particular implementation was inspired by haswell - // lasx do it in 4 steps, first 8 bytes and then second 8 bytes... + // lsx do it in 2 steps, first 8 bytes and then second 8 bytes... uint8_t mask1 = uint8_t(mask); // least significant 8 bits - uint8_t mask2 = uint8_t(mask >> 8); // second significant 8 bits - uint8_t mask3 = uint8_t(mask >> 16); // ... - uint8_t mask4 = uint8_t(mask >> 24); // ... - // next line just loads the 64-bit values thintable_epi8[mask{1,2,3,4}] - // into a 256-bit register. - __m256i shufmask = {int64_t(thintable_epi8[mask1]), int64_t(thintable_epi8[mask2]) + 0x0808080808080808, int64_t(thintable_epi8[mask3]), int64_t(thintable_epi8[mask4]) + 0x0808080808080808}; + uint8_t mask2 = uint8_t(mask >> 8); // second least significant 8 bits + // next line just loads the 64-bit values thintable_epi8[mask1] and + // thintable_epi8[mask2] into a 128-bit register. + __m128i shufmask = {int64_t(thintable_epi8[mask1]), int64_t(thintable_epi8[mask2]) + 0x0808080808080808}; // this is the version "nearly pruned" - __m256i pruned = __lasx_xvshuf_b(*this, *this, shufmask); + __m128i pruned = __lsx_vshuf_b(*this, *this, shufmask); // we still need to put the pieces back together. // we compute the popcount of the first words: int pop1 = BitsSetTable256mul2[mask1]; - int pop2 = BitsSetTable256mul2[mask2]; - int pop3 = BitsSetTable256mul2[mask3]; - // then load the corresponding mask - __m256i masklo = __lasx_xvldx(reinterpret_cast<void*>(reinterpret_cast<unsigned long>(pshufb_combine_table)), pop1 * 8); - __m256i maskhi = __lasx_xvldx(reinterpret_cast<void*>(reinterpret_cast<unsigned long>(pshufb_combine_table)), pop3 * 8); - __m256i compactmask = __lasx_xvpermi_q(maskhi, masklo, 0x20); - __m256i answer = __lasx_xvshuf_b(pruned, pruned, compactmask); - __lasx_xvst(answer, reinterpret_cast<uint8_t*>(output), 0); - uint64_t value3 = __lasx_xvpickve2gr_du(answer, 2); - uint64_t value4 = __lasx_xvpickve2gr_du(answer, 3); - uint64_t *pos = reinterpret_cast<uint64_t*>(reinterpret_cast<uint8_t*>(output) + 16 - (pop1 + pop2) / 2); - pos[0] = value3; - pos[1] = value4; + __m128i compactmask = __lsx_vldx(reinterpret_cast<void*>(reinterpret_cast<unsigned long>(pshufb_combine_table)), pop1 * 8); + __m128i answer = __lsx_vshuf_b(pruned, pruned, compactmask); + __lsx_vst(answer, reinterpret_cast<uint8_t*>(output), 0); } template<typename L> @@ -48413,22 +48772,18 @@ namespace simd { template<> struct simd8<int8_t> : base8_numeric<int8_t> { simdjson_inline simd8() : base8_numeric<int8_t>() {} - simdjson_inline simd8(const __m256i _value) : base8_numeric<int8_t>(_value) {} + simdjson_inline simd8(const __m128i _value) : base8_numeric<int8_t>(_value) {} // Splat constructor simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {} // Array constructor - simdjson_inline simd8(const int8_t values[32]) : simd8(load(values)) {} + simdjson_inline simd8(const int8_t values[16]) : simd8(load(values)) {} // Member-by-member initialization simdjson_inline simd8( int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, - int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15, - int8_t v16, int8_t v17, int8_t v18, int8_t v19, int8_t v20, int8_t v21, int8_t v22, int8_t v23, - int8_t v24, int8_t v25, int8_t v26, int8_t v27, int8_t v28, int8_t v29, int8_t v30, int8_t v31 + int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 ) : simd8({ v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15, - v16,v17,v18,v19,v20,v21,v22,v23, - v24,v25,v26,v27,v28,v29,v30,v31 + v8, v9, v10,v11,v12,v13,v14,v15 }) {} // Repeat 16 values as many times as necessary (usually for lookup tables) simdjson_inline static simd8<int8_t> repeat_16( @@ -48436,40 +48791,34 @@ namespace simd { int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 ) { return simd8<int8_t>( - v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,v11,v12,v13,v14,v15 ); } // Order-sensitive comparisons - simdjson_inline simd8<int8_t> max_val(const simd8<int8_t> other) const { return __lasx_xvmax_b(*this, other); } - simdjson_inline simd8<int8_t> min_val(const simd8<int8_t> other) const { return __lasx_xvmin_b(*this, other); } - simdjson_inline simd8<bool> operator>(const simd8<int8_t> other) const { return __lasx_xvslt_b(other, *this); } - simdjson_inline simd8<bool> operator<(const simd8<int8_t> other) const { return __lasx_xvslt_b(*this, other); } + simdjson_inline simd8<int8_t> max_val(const simd8<int8_t> other) const { return __lsx_vmax_b(*this, other); } + simdjson_inline simd8<int8_t> min_val(const simd8<int8_t> other) const { return __lsx_vmin_b(*this, other); } + simdjson_inline simd8<bool> operator>(const simd8<int8_t> other) const { return __lsx_vslt_b(other, *this); } + simdjson_inline simd8<bool> operator<(const simd8<int8_t> other) const { return __lsx_vslt_b(*this, other); } }; // Unsigned bytes template<> struct simd8<uint8_t>: base8_numeric<uint8_t> { simdjson_inline simd8() : base8_numeric<uint8_t>() {} - simdjson_inline simd8(const __m256i _value) : base8_numeric<uint8_t>(_value) {} + simdjson_inline simd8(const __m128i _value) : base8_numeric<uint8_t>(_value) {} // Splat constructor simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {} // Array constructor - simdjson_inline simd8(const uint8_t values[32]) : simd8(load(values)) {} + simdjson_inline simd8(const uint8_t values[16]) : simd8(load(values)) {} // Member-by-member initialization simdjson_inline simd8( uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, - uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15, - uint8_t v16, uint8_t v17, uint8_t v18, uint8_t v19, uint8_t v20, uint8_t v21, uint8_t v22, uint8_t v23, - uint8_t v24, uint8_t v25, uint8_t v26, uint8_t v27, uint8_t v28, uint8_t v29, uint8_t v30, uint8_t v31 - ) : simd8(__m256i(v32u8{ + uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 + ) : simd8(__m128i(v16u8{ v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15, - v16,v17,v18,v19,v20,v21,v22,v23, - v24,v25,v26,v27,v28,v29,v30,v31 + v8, v9, v10,v11,v12,v13,v14,v15 })) {} // Repeat 16 values as many times as necessary (usually for lookup tables) simdjson_inline static simd8<uint8_t> repeat_16( @@ -48477,20 +48826,18 @@ namespace simd { uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 ) { return simd8<uint8_t>( - v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,v11,v12,v13,v14,v15 ); } // Saturated math - simdjson_inline simd8<uint8_t> saturating_add(const simd8<uint8_t> other) const { return __lasx_xvsadd_bu(*this, other); } - simdjson_inline simd8<uint8_t> saturating_sub(const simd8<uint8_t> other) const { return __lasx_xvssub_bu(*this, other); } + simdjson_inline simd8<uint8_t> saturating_add(const simd8<uint8_t> other) const { return __lsx_vsadd_bu(*this, other); } + simdjson_inline simd8<uint8_t> saturating_sub(const simd8<uint8_t> other) const { return __lsx_vssub_bu(*this, other); } // Order-specific operations - simdjson_inline simd8<uint8_t> max_val(const simd8<uint8_t> other) const { return __lasx_xvmax_bu(*this, other); } - simdjson_inline simd8<uint8_t> min_val(const simd8<uint8_t> other) const { return __lasx_xvmin_bu(other, *this); } + simdjson_inline simd8<uint8_t> max_val(const simd8<uint8_t> other) const { return __lsx_vmax_bu(*this, other); } + simdjson_inline simd8<uint8_t> min_val(const simd8<uint8_t> other) const { return __lsx_vmin_bu(other, *this); } // Same as >, but only guarantees true is nonzero (< guarantees true = -1) simdjson_inline simd8<uint8_t> gt_bits(const simd8<uint8_t> other) const { return this->saturating_sub(other); } // Same as <, but only guarantees true is nonzero (< guarantees true = -1) @@ -48505,84 +48852,97 @@ namespace simd { simdjson_inline simd8<bool> bits_not_set(simd8<uint8_t> bits) const { return (*this & bits).bits_not_set(); } simdjson_inline simd8<bool> any_bits_set() const { return ~this->bits_not_set(); } simdjson_inline simd8<bool> any_bits_set(simd8<uint8_t> bits) const { return ~this->bits_not_set(bits); } - simdjson_inline bool is_ascii() const { - __m256i mask = __lasx_xvmskltz_b(*this); - return (0 == __lasx_xvpickve2gr_w(mask, 0)) && (0 == __lasx_xvpickve2gr_w(mask, 4)); - } - simdjson_inline bool bits_not_set_anywhere() const { - __m256i v = __lasx_xvmsknz_b(*this); - return (0 == __lasx_xvpickve2gr_w(v, 0)) && (0 == __lasx_xvpickve2gr_w(v, 4)); - } + simdjson_inline bool is_ascii() const { return 0 == __lsx_vpickve2gr_w(__lsx_vmskltz_b(*this), 0); } + simdjson_inline bool bits_not_set_anywhere() const { return 0 == __lsx_vpickve2gr_hu(__lsx_vmsknz_b(*this), 0); } simdjson_inline bool any_bits_set_anywhere() const { return !bits_not_set_anywhere(); } simdjson_inline bool bits_not_set_anywhere(simd8<uint8_t> bits) const { - __m256i v = __lasx_xvmsknz_b(__lasx_xvand_v(*this, bits)); - return (0 == __lasx_xvpickve2gr_w(v, 0)) && (0 == __lasx_xvpickve2gr_w(v, 4)); + return 0 == __lsx_vpickve2gr_hu(__lsx_vmsknz_b(__lsx_vand_v(*this, bits)), 0); } simdjson_inline bool any_bits_set_anywhere(simd8<uint8_t> bits) const { return !bits_not_set_anywhere(bits); } template<int N> - simdjson_inline simd8<uint8_t> shr() const { return simd8<uint8_t>(__lasx_xvsrli_b(*this, N)); } + simdjson_inline simd8<uint8_t> shr() const { return simd8<uint8_t>(__lsx_vsrli_b(*this, N)); } template<int N> - simdjson_inline simd8<uint8_t> shl() const { return simd8<uint8_t>(__lasx_xvslli_b(*this, N)); } + simdjson_inline simd8<uint8_t> shl() const { return simd8<uint8_t>(__lsx_vslli_b(*this, N)); } }; template<typename T> struct simd8x64 { static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<T>); - static_assert(NUM_CHUNKS == 2, "LASX kernel should use two registers per 64-byte block."); + static_assert(NUM_CHUNKS == 4, "LSX kernel should use four registers per 64-byte block."); const simd8<T> chunks[NUM_CHUNKS]; + template<int idx> simd8<uint8_t> get() const { return idx < NUM_CHUNKS ? chunks[idx] : simd8<T>(); } simd8x64(const simd8x64<T>& o) = delete; // no copy allowed simd8x64<T>& operator=(const simd8<T>& other) = delete; // no assignment allowed simd8x64() = delete; // no default constructor allowed - simdjson_inline simd8x64(const simd8<T> chunk0, const simd8<T> chunk1) : chunks{chunk0, chunk1} {} - simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8<T>::load(ptr), simd8<T>::load(ptr+32)} {} + simdjson_inline simd8x64(const simd8<T> chunk0, const simd8<T> chunk1, const simd8<T> chunk2, const simd8<T> chunk3) : chunks{chunk0, chunk1, chunk2, chunk3} {} + simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8<T>::load(ptr), simd8<T>::load(ptr+16), simd8<T>::load(ptr+32), simd8<T>::load(ptr+48)} {} simdjson_inline uint64_t compress(uint64_t mask, T * output) const { - uint32_t mask1 = uint32_t(mask); - uint32_t mask2 = uint32_t(mask >> 32); - __m256i zcnt = __lasx_xvpcnt_w(__m256i(v4u64{~mask, 0, 0, 0})); - uint64_t zcnt1 = __lasx_xvpickve2gr_wu(zcnt, 0); - uint64_t zcnt2 = __lasx_xvpickve2gr_wu(zcnt, 1); + uint16_t mask1 = uint16_t(mask); + uint16_t mask2 = uint16_t(mask >> 16); + uint16_t mask3 = uint16_t(mask >> 32); + uint16_t mask4 = uint16_t(mask >> 48); + __m128i zcnt = __lsx_vpcnt_h(__m128i(v2u64{~mask, 0})); + uint64_t zcnt1 = __lsx_vpickve2gr_hu(zcnt, 0); + uint64_t zcnt2 = __lsx_vpickve2gr_hu(zcnt, 1); + uint64_t zcnt3 = __lsx_vpickve2gr_hu(zcnt, 2); + uint64_t zcnt4 = __lsx_vpickve2gr_hu(zcnt, 3); + uint8_t *voutput = reinterpret_cast<uint8_t*>(output); // There should be a critical value which processes in scaler is faster. if (zcnt1) - this->chunks[0].compress(mask1, output); + this->chunks[0].compress(mask1, reinterpret_cast<T*>(voutput)); + voutput += zcnt1; if (zcnt2) - this->chunks[1].compress(mask2, output + zcnt1); - return zcnt1 + zcnt2; + this->chunks[1].compress(mask2, reinterpret_cast<T*>(voutput)); + voutput += zcnt2; + if (zcnt3) + this->chunks[2].compress(mask3, reinterpret_cast<T*>(voutput)); + voutput += zcnt3; + if (zcnt4) + this->chunks[3].compress(mask4, reinterpret_cast<T*>(voutput)); + voutput += zcnt4; + return reinterpret_cast<uint64_t>(voutput) - reinterpret_cast<uint64_t>(output); } simdjson_inline void store(T ptr[64]) const { this->chunks[0].store(ptr+sizeof(simd8<T>)*0); this->chunks[1].store(ptr+sizeof(simd8<T>)*1); + this->chunks[2].store(ptr+sizeof(simd8<T>)*2); + this->chunks[3].store(ptr+sizeof(simd8<T>)*3); } simdjson_inline uint64_t to_bitmask() const { - __m256i mask0 = __lasx_xvmskltz_b(this->chunks[0]); - __m256i mask1 = __lasx_xvmskltz_b(this->chunks[1]); - __m256i mask_tmp = __lasx_xvpickve_w(mask0, 4); - __m256i tmp = __lasx_xvpickve_w(mask1, 4); - mask0 = __lasx_xvinsve0_w(mask0, mask1, 1); - mask_tmp = __lasx_xvinsve0_w(mask_tmp, tmp, 1); - return __lasx_xvpickve2gr_du(__lasx_xvpackev_h(mask_tmp, mask0), 0); + __m128i mask1 = __lsx_vmskltz_b(this->chunks[0]); + __m128i mask2 = __lsx_vmskltz_b(this->chunks[1]); + __m128i mask3 = __lsx_vmskltz_b(this->chunks[2]); + __m128i mask4 = __lsx_vmskltz_b(this->chunks[3]); + mask1 = __lsx_vilvl_h(mask2, mask1); + mask2 = __lsx_vilvl_h(mask4, mask3); + return __lsx_vpickve2gr_du(__lsx_vilvl_w(mask2, mask1), 0); } simdjson_inline simd8<T> reduce_or() const { - return this->chunks[0] | this->chunks[1]; + return (this->chunks[0] | this->chunks[1]) | (this->chunks[2] | this->chunks[3]); } simdjson_inline uint64_t eq(const T m) const { const simd8<T> mask = simd8<T>::splat(m); return simd8x64<bool>( this->chunks[0] == mask, - this->chunks[1] == mask + this->chunks[1] == mask, + this->chunks[2] == mask, + this->chunks[3] == mask ).to_bitmask(); } simdjson_inline uint64_t eq(const simd8x64<uint8_t> &other) const { return simd8x64<bool>( this->chunks[0] == other.chunks[0], - this->chunks[1] == other.chunks[1] + this->chunks[1] == other.chunks[1], + this->chunks[2] == other.chunks[2], + this->chunks[3] == other.chunks[3] ).to_bitmask(); } @@ -48590,31 +48950,33 @@ namespace simd { const simd8<T> mask = simd8<T>::splat(m); return simd8x64<bool>( this->chunks[0] <= mask, - this->chunks[1] <= mask + this->chunks[1] <= mask, + this->chunks[2] <= mask, + this->chunks[3] <= mask ).to_bitmask(); } }; // struct simd8x64<T> } // namespace simd } // unnamed namespace -} // namespace lasx +} // namespace lsx } // namespace simdjson -#endif // SIMDJSON_LASX_SIMD_H -/* end file simdjson/lasx/simd.h */ -/* including simdjson/lasx/stringparsing_defs.h: #include "simdjson/lasx/stringparsing_defs.h" */ -/* begin file simdjson/lasx/stringparsing_defs.h */ -#ifndef SIMDJSON_LASX_STRINGPARSING_DEFS_H -#define SIMDJSON_LASX_STRINGPARSING_DEFS_H +#endif // SIMDJSON_LSX_SIMD_H +/* end file simdjson/lsx/simd.h */ +/* including simdjson/lsx/stringparsing_defs.h: #include "simdjson/lsx/stringparsing_defs.h" */ +/* begin file simdjson/lsx/stringparsing_defs.h */ +#ifndef SIMDJSON_LSX_STRINGPARSING_DEFS_H +#define SIMDJSON_LSX_STRINGPARSING_DEFS_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/simd.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/simd.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/bitmanipulation.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace lsx { namespace { using namespace simd; @@ -48638,11 +49000,17 @@ simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uin // this can read up to 31 bytes beyond the buffer size, but we require // SIMDJSON_PADDING of padding static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "backslash and quote finder must process fewer than SIMDJSON_PADDING bytes"); - simd8<uint8_t> v(src); - v.store(dst); + simd8<uint8_t> v0(src); + simd8<uint8_t> v1(src + sizeof(v0)); + v0.store(dst); + v1.store(dst + sizeof(v0)); + + // Getting a 64-bit bitmask is much cheaper than multiple 16-bit bitmasks on LSX; therefore, we + // smash them together into a 64-byte mask and get the bitmask from there. + uint64_t bs_and_quote = simd8x64<bool>(v0 == '\\', v1 == '\\', v0 == '"', v1 == '"').to_bitmask(); return { - static_cast<uint32_t>((v == '\\').to_bitmask()), // bs_bits - static_cast<uint32_t>((v == '"').to_bitmask()), // quote_bits + uint32_t(bs_and_quote), // bs_bits + uint32_t(bs_and_quote >> 32) // quote_bits }; } @@ -48667,27 +49035,27 @@ simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *ds simd8<bool> is_backslash = (v == '\\'); simd8<bool> is_control = (v < 32); return { - (is_backslash | is_quote | is_control).to_bitmask() + static_cast<uint64_t>((is_backslash | is_quote | is_control).to_bitmask()) }; } } // unnamed namespace -} // namespace lasx +} // namespace lsx } // namespace simdjson -#endif // SIMDJSON_LASX_STRINGPARSING_DEFS_H -/* end file simdjson/lasx/stringparsing_defs.h */ +#endif // SIMDJSON_LSX_STRINGPARSING_DEFS_H +/* end file simdjson/lsx/stringparsing_defs.h */ #define SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT 1 -/* end file simdjson/lasx/begin.h */ -/* including simdjson/generic/amalgamated.h for lasx: #include "simdjson/generic/amalgamated.h" */ -/* begin file simdjson/generic/amalgamated.h for lasx */ +/* end file simdjson/lsx/begin.h */ +/* including simdjson/generic/amalgamated.h for lsx: #include "simdjson/generic/amalgamated.h" */ +/* begin file simdjson/generic/amalgamated.h for lsx */ #if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_DEPENDENCIES_H) #error simdjson/generic/dependencies.h must be included before simdjson/generic/amalgamated.h! #endif -/* including simdjson/generic/base.h for lasx: #include "simdjson/generic/base.h" */ -/* begin file simdjson/generic/base.h for lasx */ +/* including simdjson/generic/base.h for lsx: #include "simdjson/generic/base.h" */ +/* begin file simdjson/generic/base.h for lsx */ #ifndef SIMDJSON_GENERIC_BASE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -48707,10 +49075,12 @@ simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *ds /* amalgamation skipped (editor-only): #include "simdjson/arm64/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_PPC64 */ /* amalgamation skipped (editor-only): #include "simdjson/ppc64/begin.h" */ -/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LSX */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LASX */ /* amalgamation skipped (editor-only): #include "simdjson/lasx/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LSX */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_RVV_VLS */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_FALLBACK */ /* amalgamation skipped (editor-only): #include "simdjson/fallback/begin.h" */ /* amalgamation skipped (editor-only): #else */ @@ -48720,7 +49090,7 @@ simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *ds /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace lsx { struct open_container; class dom_parser_implementation; @@ -48735,13 +49105,13 @@ enum class number_type { big_integer /// a big integer that does not fit in a 64-bit word }; -} // namespace lasx +} // namespace lsx } // namespace simdjson #endif // SIMDJSON_GENERIC_BASE_H -/* end file simdjson/generic/base.h for lasx */ -/* including simdjson/generic/jsoncharutils.h for lasx: #include "simdjson/generic/jsoncharutils.h" */ -/* begin file simdjson/generic/jsoncharutils.h for lasx */ +/* end file simdjson/generic/base.h for lsx */ +/* including simdjson/generic/jsoncharutils.h for lsx: #include "simdjson/generic/jsoncharutils.h" */ +/* begin file simdjson/generic/jsoncharutils.h for lsx */ #ifndef SIMDJSON_GENERIC_JSONCHARUTILS_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -48752,7 +49122,7 @@ enum class number_type { /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace lsx { namespace { namespace jsoncharutils { @@ -48842,13 +49212,13 @@ static simdjson_inline uint64_t _umul128(uint64_t ab, uint64_t cd, uint64_t *hi) } // namespace jsoncharutils } // unnamed namespace -} // namespace lasx +} // namespace lsx } // namespace simdjson #endif // SIMDJSON_GENERIC_JSONCHARUTILS_H -/* end file simdjson/generic/jsoncharutils.h for lasx */ -/* including simdjson/generic/atomparsing.h for lasx: #include "simdjson/generic/atomparsing.h" */ -/* begin file simdjson/generic/atomparsing.h for lasx */ +/* end file simdjson/generic/jsoncharutils.h for lsx */ +/* including simdjson/generic/atomparsing.h for lsx: #include "simdjson/generic/atomparsing.h" */ +/* begin file simdjson/generic/atomparsing.h for lsx */ #ifndef SIMDJSON_GENERIC_ATOMPARSING_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -48860,7 +49230,7 @@ static simdjson_inline uint64_t _umul128(uint64_t ab, uint64_t cd, uint64_t *hi) #include <cstring> namespace simdjson { -namespace lasx { +namespace lsx { namespace { /// @private namespace atomparsing { @@ -48922,13 +49292,13 @@ simdjson_inline bool is_valid_null_atom(const uint8_t *src, size_t len) { } // namespace atomparsing } // unnamed namespace -} // namespace lasx +} // namespace lsx } // namespace simdjson #endif // SIMDJSON_GENERIC_ATOMPARSING_H -/* end file simdjson/generic/atomparsing.h for lasx */ -/* including simdjson/generic/dom_parser_implementation.h for lasx: #include "simdjson/generic/dom_parser_implementation.h" */ -/* begin file simdjson/generic/dom_parser_implementation.h for lasx */ +/* end file simdjson/generic/atomparsing.h for lsx */ +/* including simdjson/generic/dom_parser_implementation.h for lsx: #include "simdjson/generic/dom_parser_implementation.h" */ +/* begin file simdjson/generic/dom_parser_implementation.h for lsx */ #ifndef SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -48938,7 +49308,7 @@ simdjson_inline bool is_valid_null_atom(const uint8_t *src, size_t len) { /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace lsx { // expectation: sizeof(open_container) = 64/8. struct open_container { @@ -48980,11 +49350,11 @@ class dom_parser_implementation final : public internal::dom_parser_implementati }; -} // namespace lasx +} // namespace lsx } // namespace simdjson namespace simdjson { -namespace lasx { +namespace lsx { inline dom_parser_implementation::dom_parser_implementation() noexcept = default; inline dom_parser_implementation::dom_parser_implementation(dom_parser_implementation &&other) noexcept = default; @@ -49014,13 +49384,13 @@ inline simdjson_warn_unused error_code dom_parser_implementation::set_max_depth( return SUCCESS; } -} // namespace lasx +} // namespace lsx } // namespace simdjson #endif // SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H -/* end file simdjson/generic/dom_parser_implementation.h for lasx */ -/* including simdjson/generic/implementation_simdjson_result_base.h for lasx: #include "simdjson/generic/implementation_simdjson_result_base.h" */ -/* begin file simdjson/generic/implementation_simdjson_result_base.h for lasx */ +/* end file simdjson/generic/dom_parser_implementation.h for lsx */ +/* including simdjson/generic/implementation_simdjson_result_base.h for lsx: #include "simdjson/generic/implementation_simdjson_result_base.h" */ +/* begin file simdjson/generic/implementation_simdjson_result_base.h for lsx */ #ifndef SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -49029,7 +49399,7 @@ inline simdjson_warn_unused error_code dom_parser_implementation::set_max_depth( /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace lsx { // This is a near copy of include/error.h's implementation_simdjson_result_base, except it doesn't use std::pair // so we can avoid inlining errors @@ -49170,13 +49540,13 @@ struct implementation_simdjson_result_base { error_code second{UNINITIALIZED}; /** Users should never directly access 'second'. **/ }; // struct implementation_simdjson_result_base -} // namespace lasx +} // namespace lsx } // namespace simdjson #endif // SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H -/* end file simdjson/generic/implementation_simdjson_result_base.h for lasx */ -/* including simdjson/generic/numberparsing.h for lasx: #include "simdjson/generic/numberparsing.h" */ -/* begin file simdjson/generic/numberparsing.h for lasx */ +/* end file simdjson/generic/implementation_simdjson_result_base.h for lsx */ +/* including simdjson/generic/numberparsing.h for lsx: #include "simdjson/generic/numberparsing.h" */ +/* begin file simdjson/generic/numberparsing.h for lsx */ #ifndef SIMDJSON_GENERIC_NUMBERPARSING_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -49191,7 +49561,7 @@ struct implementation_simdjson_result_base { #include <cstring> namespace simdjson { -namespace lasx { +namespace lsx { namespace numberparsing { #ifdef JSON_TEST_NUMBERS @@ -50506,14 +50876,14 @@ inline std::ostream& operator<<(std::ostream& out, number_type type) noexcept { return out; } -} // namespace lasx +} // namespace lsx } // namespace simdjson #endif // SIMDJSON_GENERIC_NUMBERPARSING_H -/* end file simdjson/generic/numberparsing.h for lasx */ +/* end file simdjson/generic/numberparsing.h for lsx */ -/* including simdjson/generic/implementation_simdjson_result_base-inl.h for lasx: #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */ -/* begin file simdjson/generic/implementation_simdjson_result_base-inl.h for lasx */ +/* including simdjson/generic/implementation_simdjson_result_base-inl.h for lsx: #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */ +/* begin file simdjson/generic/implementation_simdjson_result_base-inl.h for lsx */ #ifndef SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -50523,7 +50893,7 @@ inline std::ostream& operator<<(std::ostream& out, number_type type) noexcept { /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace lsx { // // internal::implementation_simdjson_result_base<T> inline implementation @@ -50629,29 +50999,29 @@ template<typename T> simdjson_inline implementation_simdjson_result_base<T>::implementation_simdjson_result_base(T &&value) noexcept : implementation_simdjson_result_base(std::forward<T>(value), SUCCESS) {} -} // namespace lasx +} // namespace lsx } // namespace simdjson #endif // SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H -/* end file simdjson/generic/implementation_simdjson_result_base-inl.h for lasx */ -/* end file simdjson/generic/amalgamated.h for lasx */ -/* including simdjson/lasx/end.h: #include "simdjson/lasx/end.h" */ -/* begin file simdjson/lasx/end.h */ +/* end file simdjson/generic/implementation_simdjson_result_base-inl.h for lsx */ +/* end file simdjson/generic/amalgamated.h for lsx */ +/* including simdjson/lsx/end.h: #include "simdjson/lsx/end.h" */ +/* begin file simdjson/lsx/end.h */ /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ #undef SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT -/* undefining SIMDJSON_IMPLEMENTATION from "lasx" */ +/* undefining SIMDJSON_IMPLEMENTATION from "lsx" */ #undef SIMDJSON_IMPLEMENTATION -/* end file simdjson/lasx/end.h */ +/* end file simdjson/lsx/end.h */ -#endif // SIMDJSON_LASX_H -/* end file simdjson/lasx.h */ -/* including simdjson/lasx/implementation.h: #include <simdjson/lasx/implementation.h> */ -/* begin file simdjson/lasx/implementation.h */ -#ifndef SIMDJSON_LASX_IMPLEMENTATION_H -#define SIMDJSON_LASX_IMPLEMENTATION_H +#endif // SIMDJSON_LSX_H +/* end file simdjson/lsx.h */ +/* including simdjson/lsx/implementation.h: #include <simdjson/lsx/implementation.h> */ +/* begin file simdjson/lsx/implementation.h */ +#ifndef SIMDJSON_LSX_IMPLEMENTATION_H +#define SIMDJSON_LSX_IMPLEMENTATION_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ /* amalgamation skipped (editor-only): #include "simdjson/base.h" */ @@ -50660,14 +51030,14 @@ simdjson_inline implementation_simdjson_result_base<T>::implementation_simdjson_ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace lsx { /** * @private */ class implementation final : public simdjson::implementation { public: - simdjson_inline implementation() : simdjson::implementation("lasx", "LoongArch ASX", internal::instruction_set::LASX) {} + simdjson_inline implementation() : simdjson::implementation("lsx", "LoongArch SX", internal::instruction_set::LSX) {} simdjson_warn_unused error_code create_dom_parser_implementation( size_t capacity, size_t max_length, @@ -50677,20 +51047,20 @@ class implementation final : public simdjson::implementation { simdjson_warn_unused bool validate_utf8(const char *buf, size_t len) const noexcept final; }; -} // namespace lasx +} // namespace lsx } // namespace simdjson -#endif // SIMDJSON_LASX_IMPLEMENTATION_H -/* end file simdjson/lasx/implementation.h */ +#endif // SIMDJSON_LSX_IMPLEMENTATION_H +/* end file simdjson/lsx/implementation.h */ -/* including simdjson/lasx/begin.h: #include <simdjson/lasx/begin.h> */ -/* begin file simdjson/lasx/begin.h */ -/* defining SIMDJSON_IMPLEMENTATION to "lasx" */ -#define SIMDJSON_IMPLEMENTATION lasx -/* including simdjson/lasx/base.h: #include "simdjson/lasx/base.h" */ -/* begin file simdjson/lasx/base.h */ -#ifndef SIMDJSON_LASX_BASE_H -#define SIMDJSON_LASX_BASE_H +/* including simdjson/lsx/begin.h: #include <simdjson/lsx/begin.h> */ +/* begin file simdjson/lsx/begin.h */ +/* defining SIMDJSON_IMPLEMENTATION to "lsx" */ +#define SIMDJSON_IMPLEMENTATION lsx +/* including simdjson/lsx/base.h: #include "simdjson/lsx/base.h" */ +/* begin file simdjson/lsx/base.h */ +#ifndef SIMDJSON_LSX_BASE_H +#define SIMDJSON_LSX_BASE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ /* amalgamation skipped (editor-only): #include "simdjson/base.h" */ @@ -50698,9 +51068,9 @@ class implementation final : public simdjson::implementation { namespace simdjson { /** - * Implementation for LASX. + * Implementation for LSX. */ -namespace lasx { +namespace lsx { class implementation; @@ -50711,41 +51081,39 @@ template <typename T> struct simd8x64; } // namespace simd } // unnamed namespace -} // namespace lasx +} // namespace lsx } // namespace simdjson -#endif // SIMDJSON_LASX_BASE_H -/* end file simdjson/lasx/base.h */ -/* including simdjson/lasx/intrinsics.h: #include "simdjson/lasx/intrinsics.h" */ -/* begin file simdjson/lasx/intrinsics.h */ -#ifndef SIMDJSON_LASX_INTRINSICS_H -#define SIMDJSON_LASX_INTRINSICS_H +#endif // SIMDJSON_LSX_BASE_H +/* end file simdjson/lsx/base.h */ +/* including simdjson/lsx/intrinsics.h: #include "simdjson/lsx/intrinsics.h" */ +/* begin file simdjson/lsx/intrinsics.h */ +#ifndef SIMDJSON_LSX_INTRINSICS_H +#define SIMDJSON_LSX_INTRINSICS_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -// This should be the correct header whether -// you use visual studio or other compilers. -#include <lasxintrin.h> +#include <lsxintrin.h> -static_assert(sizeof(__m256i) <= simdjson::SIMDJSON_PADDING, "insufficient padding for LoongArch ASX"); +static_assert(sizeof(__m128i) <= simdjson::SIMDJSON_PADDING, "insufficient padding for LoongArch SX"); -#endif // SIMDJSON_LASX_INTRINSICS_H -/* end file simdjson/lasx/intrinsics.h */ -/* including simdjson/lasx/bitmanipulation.h: #include "simdjson/lasx/bitmanipulation.h" */ -/* begin file simdjson/lasx/bitmanipulation.h */ -#ifndef SIMDJSON_LASX_BITMANIPULATION_H -#define SIMDJSON_LASX_BITMANIPULATION_H +#endif // SIMDJSON_LSX_INTRINSICS_H +/* end file simdjson/lsx/intrinsics.h */ +/* including simdjson/lsx/bitmanipulation.h: #include "simdjson/lsx/bitmanipulation.h" */ +/* begin file simdjson/lsx/bitmanipulation.h */ +#ifndef SIMDJSON_LSX_BITMANIPULATION_H +#define SIMDJSON_LSX_BITMANIPULATION_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/intrinsics.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/bitmask.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/intrinsics.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/bitmask.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace lsx { namespace { // We sometimes call trailing_zero on inputs that are zero, @@ -50772,7 +51140,7 @@ simdjson_inline int leading_zeroes(uint64_t input_num) { /* result might be undefined when input_num is zero */ simdjson_inline int count_ones(uint64_t input_num) { - return __lasx_xvpickve2gr_w(__lasx_xvpcnt_d(__m256i(v4u64{input_num, 0, 0, 0})), 0); + return __lsx_vpickve2gr_w(__lsx_vpcnt_d(__m128i(v2u64{input_num, 0})), 0); } simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2, uint64_t *result) { @@ -50781,22 +51149,22 @@ simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2, uint64_t *re } } // unnamed namespace -} // namespace lasx +} // namespace lsx } // namespace simdjson -#endif // SIMDJSON_LASX_BITMANIPULATION_H -/* end file simdjson/lasx/bitmanipulation.h */ -/* including simdjson/lasx/bitmask.h: #include "simdjson/lasx/bitmask.h" */ -/* begin file simdjson/lasx/bitmask.h */ -#ifndef SIMDJSON_LASX_BITMASK_H -#define SIMDJSON_LASX_BITMASK_H +#endif // SIMDJSON_LSX_BITMANIPULATION_H +/* end file simdjson/lsx/bitmanipulation.h */ +/* including simdjson/lsx/bitmask.h: #include "simdjson/lsx/bitmask.h" */ +/* begin file simdjson/lsx/bitmask.h */ +#ifndef SIMDJSON_LSX_BITMASK_H +#define SIMDJSON_LSX_BITMASK_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace lsx { namespace { // @@ -50815,26 +51183,26 @@ simdjson_inline uint64_t prefix_xor(uint64_t bitmask) { } } // unnamed namespace -} // namespace lasx +} // namespace lsx } // namespace simdjson #endif -/* end file simdjson/lasx/bitmask.h */ -/* including simdjson/lasx/numberparsing_defs.h: #include "simdjson/lasx/numberparsing_defs.h" */ -/* begin file simdjson/lasx/numberparsing_defs.h */ -#ifndef SIMDJSON_LASX_NUMBERPARSING_DEFS_H -#define SIMDJSON_LASX_NUMBERPARSING_DEFS_H +/* end file simdjson/lsx/bitmask.h */ +/* including simdjson/lsx/numberparsing_defs.h: #include "simdjson/lsx/numberparsing_defs.h" */ +/* begin file simdjson/lsx/numberparsing_defs.h */ +#ifndef SIMDJSON_LSX_NUMBERPARSING_DEFS_H +#define SIMDJSON_LSX_NUMBERPARSING_DEFS_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/intrinsics.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/intrinsics.h" */ /* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ #include <cstring> namespace simdjson { -namespace lasx { +namespace lsx { namespace numberparsing { // we don't have appropriate instructions, so let us use a scalar function @@ -50857,7 +51225,7 @@ simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t } } // namespace numberparsing -} // namespace lasx +} // namespace lsx } // namespace simdjson #ifndef SIMDJSON_SWAR_NUMBER_PARSING @@ -50868,46 +51236,46 @@ simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t #endif #endif -#endif // SIMDJSON_LASX_NUMBERPARSING_DEFS_H -/* end file simdjson/lasx/numberparsing_defs.h */ -/* including simdjson/lasx/simd.h: #include "simdjson/lasx/simd.h" */ -/* begin file simdjson/lasx/simd.h */ -#ifndef SIMDJSON_LASX_SIMD_H -#define SIMDJSON_LASX_SIMD_H +#endif // SIMDJSON_LSX_NUMBERPARSING_DEFS_H +/* end file simdjson/lsx/numberparsing_defs.h */ +/* including simdjson/lsx/simd.h: #include "simdjson/lsx/simd.h" */ +/* begin file simdjson/lsx/simd.h */ +#ifndef SIMDJSON_LSX_SIMD_H +#define SIMDJSON_LSX_SIMD_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/bitmanipulation.h" */ /* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace lsx { namespace { namespace simd { // Forward-declared so they can be used by splat and friends. template<typename Child> struct base { - __m256i value; + __m128i value; // Zero constructor - simdjson_inline base() : value{__m256i()} {} + simdjson_inline base() : value{__m128i()} {} // Conversion from SIMD register - simdjson_inline base(const __m256i _value) : value(_value) {} + simdjson_inline base(const __m128i _value) : value(_value) {} // Conversion to SIMD register - simdjson_inline operator const __m256i&() const { return this->value; } - simdjson_inline operator __m256i&() { return this->value; } - simdjson_inline operator const v32i8&() const { return (v32i8&)this->value; } - simdjson_inline operator v32i8&() { return (v32i8&)this->value; } + simdjson_inline operator const __m128i&() const { return this->value; } + simdjson_inline operator __m128i&() { return this->value; } + simdjson_inline operator const v16i8&() const { return (v16i8&)this->value; } + simdjson_inline operator v16i8&() { return (v16i8&)this->value; } // Bit operations - simdjson_inline Child operator|(const Child other) const { return __lasx_xvor_v(*this, other); } - simdjson_inline Child operator&(const Child other) const { return __lasx_xvand_v(*this, other); } - simdjson_inline Child operator^(const Child other) const { return __lasx_xvxor_v(*this, other); } - simdjson_inline Child bit_andnot(const Child other) const { return __lasx_xvandn_v(other, *this); } + simdjson_inline Child operator|(const Child other) const { return __lsx_vor_v(*this, other); } + simdjson_inline Child operator&(const Child other) const { return __lsx_vand_v(*this, other); } + simdjson_inline Child operator^(const Child other) const { return __lsx_vxor_v(*this, other); } + simdjson_inline Child bit_andnot(const Child other) const { return __lsx_vandn_v(other, *this); } simdjson_inline Child& operator|=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast | other; return *this_cast; } simdjson_inline Child& operator&=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast & other; return *this_cast; } simdjson_inline Child& operator^=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast ^ other; return *this_cast; } @@ -50920,51 +51288,41 @@ namespace simd { template<typename T, typename Mask=simd8<bool>> struct base8: base<simd8<T>> { simdjson_inline base8() : base<simd8<T>>() {} - simdjson_inline base8(const __m256i _value) : base<simd8<T>>(_value) {} + simdjson_inline base8(const __m128i _value) : base<simd8<T>>(_value) {} - friend simdjson_really_inline Mask operator==(const simd8<T> lhs, const simd8<T> rhs) { return __lasx_xvseq_b(lhs, rhs); } + friend simdjson_really_inline Mask operator==(const simd8<T> lhs, const simd8<T> rhs) { return __lsx_vseq_b(lhs, rhs); } static const int SIZE = sizeof(base<simd8<T>>::value); template<int N=1> simdjson_inline simd8<T> prev(const simd8<T> prev_chunk) const { - __m256i hi = __lasx_xvbsll_v(*this, N); - __m256i lo = __lasx_xvbsrl_v(*this, 16 - N); - __m256i tmp = __lasx_xvbsrl_v(prev_chunk, 16 - N); - lo = __lasx_xvpermi_q(lo, tmp, 0x21); - return __lasx_xvor_v(hi, lo); + return __lsx_vor_v(__lsx_vbsll_v(*this, N), __lsx_vbsrl_v(prev_chunk, 16 - N)); } }; // SIMD byte mask type (returned by things like eq and gt) template<> struct simd8<bool>: base8<bool> { - static simdjson_inline simd8<bool> splat(bool _value) { return __lasx_xvreplgr2vr_b(uint8_t(-(!!_value))); } + static simdjson_inline simd8<bool> splat(bool _value) { + return __lsx_vreplgr2vr_b(uint8_t(-(!!_value))); + } simdjson_inline simd8() : base8() {} - simdjson_inline simd8(const __m256i _value) : base8<bool>(_value) {} + simdjson_inline simd8(const __m128i _value) : base8<bool>(_value) {} // Splat constructor simdjson_inline simd8(bool _value) : base8<bool>(splat(_value)) {} - simdjson_inline int to_bitmask() const { - __m256i mask = __lasx_xvmskltz_b(*this); - return (__lasx_xvpickve2gr_w(mask, 4) << 16) | (__lasx_xvpickve2gr_w(mask, 0)); - } - simdjson_inline bool any() const { - __m256i v = __lasx_xvmsknz_b(*this); - return (0 == __lasx_xvpickve2gr_w(v, 0)) && (0 == __lasx_xvpickve2gr_w(v, 4)); - } + simdjson_inline int to_bitmask() const { return __lsx_vpickve2gr_w(__lsx_vmskltz_b(*this), 0); } + simdjson_inline bool any() const { return 0 == __lsx_vpickve2gr_hu(__lsx_vmsknz_b(*this), 0); } simdjson_inline simd8<bool> operator~() const { return *this ^ true; } }; template<typename T> struct base8_numeric: base8<T> { - static simdjson_inline simd8<T> splat(T _value) { - return __lasx_xvreplgr2vr_b(_value); - } - static simdjson_inline simd8<T> zero() { return __lasx_xvldi(0); } - static simdjson_inline simd8<T> load(const T values[32]) { - return __lasx_xvld(reinterpret_cast<const __m256i *>(values), 0); + static simdjson_inline simd8<T> splat(T _value) { return __lsx_vreplgr2vr_b(_value); } + static simdjson_inline simd8<T> zero() { return __lsx_vldi(0); } + static simdjson_inline simd8<T> load(const T values[16]) { + return __lsx_vld(reinterpret_cast<const __m128i *>(values), 0); } // Repeat 16 values as many times as necessary (usually for lookup tables) static simdjson_inline simd8<T> repeat_16( @@ -50972,24 +51330,22 @@ namespace simd { T v8, T v9, T v10, T v11, T v12, T v13, T v14, T v15 ) { return simd8<T>( - v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,v11,v12,v13,v14,v15 ); } simdjson_inline base8_numeric() : base8<T>() {} - simdjson_inline base8_numeric(const __m256i _value) : base8<T>(_value) {} + simdjson_inline base8_numeric(const __m128i _value) : base8<T>(_value) {} // Store to array - simdjson_inline void store(T dst[32]) const { - return __lasx_xvst(*this, reinterpret_cast<__m256i *>(dst), 0); + simdjson_inline void store(T dst[16]) const { + return __lsx_vst(*this, reinterpret_cast<__m128i *>(dst), 0); } // Addition/subtraction are the same for signed and unsigned - simdjson_inline simd8<T> operator+(const simd8<T> other) const { return __lasx_xvadd_b(*this, other); } - simdjson_inline simd8<T> operator-(const simd8<T> other) const { return __lasx_xvsub_b(*this, other); } + simdjson_inline simd8<T> operator+(const simd8<T> other) const { return __lsx_vadd_b(*this, other); } + simdjson_inline simd8<T> operator-(const simd8<T> other) const { return __lsx_vsub_b(*this, other); } simdjson_inline simd8<T>& operator+=(const simd8<T> other) { *this = *this + other; return *static_cast<simd8<T>*>(this); } simdjson_inline simd8<T>& operator-=(const simd8<T> other) { *this = *this - other; return *static_cast<simd8<T>*>(this); } @@ -50999,7 +51355,7 @@ namespace simd { // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values) template<typename L> simdjson_inline simd8<L> lookup_16(simd8<L> lookup_table) const { - return __lasx_xvshuf_b(lookup_table, lookup_table, *this); + return __lsx_vshuf_b(lookup_table, lookup_table, *this); } // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted as a bitset). @@ -51007,38 +51363,26 @@ namespace simd { // Only the first 16 - count_ones(mask) bytes of the result are significant but 16 bytes // get written. template<typename L> - simdjson_inline void compress(uint32_t mask, L * output) const { + simdjson_inline void compress(uint16_t mask, L * output) const { using internal::thintable_epi8; using internal::BitsSetTable256mul2; using internal::pshufb_combine_table; // this particular implementation was inspired by haswell - // lasx do it in 4 steps, first 8 bytes and then second 8 bytes... + // lsx do it in 2 steps, first 8 bytes and then second 8 bytes... uint8_t mask1 = uint8_t(mask); // least significant 8 bits - uint8_t mask2 = uint8_t(mask >> 8); // second significant 8 bits - uint8_t mask3 = uint8_t(mask >> 16); // ... - uint8_t mask4 = uint8_t(mask >> 24); // ... - // next line just loads the 64-bit values thintable_epi8[mask{1,2,3,4}] - // into a 256-bit register. - __m256i shufmask = {int64_t(thintable_epi8[mask1]), int64_t(thintable_epi8[mask2]) + 0x0808080808080808, int64_t(thintable_epi8[mask3]), int64_t(thintable_epi8[mask4]) + 0x0808080808080808}; + uint8_t mask2 = uint8_t(mask >> 8); // second least significant 8 bits + // next line just loads the 64-bit values thintable_epi8[mask1] and + // thintable_epi8[mask2] into a 128-bit register. + __m128i shufmask = {int64_t(thintable_epi8[mask1]), int64_t(thintable_epi8[mask2]) + 0x0808080808080808}; // this is the version "nearly pruned" - __m256i pruned = __lasx_xvshuf_b(*this, *this, shufmask); + __m128i pruned = __lsx_vshuf_b(*this, *this, shufmask); // we still need to put the pieces back together. // we compute the popcount of the first words: int pop1 = BitsSetTable256mul2[mask1]; - int pop2 = BitsSetTable256mul2[mask2]; - int pop3 = BitsSetTable256mul2[mask3]; - // then load the corresponding mask - __m256i masklo = __lasx_xvldx(reinterpret_cast<void*>(reinterpret_cast<unsigned long>(pshufb_combine_table)), pop1 * 8); - __m256i maskhi = __lasx_xvldx(reinterpret_cast<void*>(reinterpret_cast<unsigned long>(pshufb_combine_table)), pop3 * 8); - __m256i compactmask = __lasx_xvpermi_q(maskhi, masklo, 0x20); - __m256i answer = __lasx_xvshuf_b(pruned, pruned, compactmask); - __lasx_xvst(answer, reinterpret_cast<uint8_t*>(output), 0); - uint64_t value3 = __lasx_xvpickve2gr_du(answer, 2); - uint64_t value4 = __lasx_xvpickve2gr_du(answer, 3); - uint64_t *pos = reinterpret_cast<uint64_t*>(reinterpret_cast<uint8_t*>(output) + 16 - (pop1 + pop2) / 2); - pos[0] = value3; - pos[1] = value4; + __m128i compactmask = __lsx_vldx(reinterpret_cast<void*>(reinterpret_cast<unsigned long>(pshufb_combine_table)), pop1 * 8); + __m128i answer = __lsx_vshuf_b(pruned, pruned, compactmask); + __lsx_vst(answer, reinterpret_cast<uint8_t*>(output), 0); } template<typename L> @@ -51060,22 +51404,18 @@ namespace simd { template<> struct simd8<int8_t> : base8_numeric<int8_t> { simdjson_inline simd8() : base8_numeric<int8_t>() {} - simdjson_inline simd8(const __m256i _value) : base8_numeric<int8_t>(_value) {} + simdjson_inline simd8(const __m128i _value) : base8_numeric<int8_t>(_value) {} // Splat constructor simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {} // Array constructor - simdjson_inline simd8(const int8_t values[32]) : simd8(load(values)) {} + simdjson_inline simd8(const int8_t values[16]) : simd8(load(values)) {} // Member-by-member initialization simdjson_inline simd8( int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, - int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15, - int8_t v16, int8_t v17, int8_t v18, int8_t v19, int8_t v20, int8_t v21, int8_t v22, int8_t v23, - int8_t v24, int8_t v25, int8_t v26, int8_t v27, int8_t v28, int8_t v29, int8_t v30, int8_t v31 + int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 ) : simd8({ v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15, - v16,v17,v18,v19,v20,v21,v22,v23, - v24,v25,v26,v27,v28,v29,v30,v31 + v8, v9, v10,v11,v12,v13,v14,v15 }) {} // Repeat 16 values as many times as necessary (usually for lookup tables) simdjson_inline static simd8<int8_t> repeat_16( @@ -51083,40 +51423,34 @@ namespace simd { int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 ) { return simd8<int8_t>( - v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,v11,v12,v13,v14,v15 ); } // Order-sensitive comparisons - simdjson_inline simd8<int8_t> max_val(const simd8<int8_t> other) const { return __lasx_xvmax_b(*this, other); } - simdjson_inline simd8<int8_t> min_val(const simd8<int8_t> other) const { return __lasx_xvmin_b(*this, other); } - simdjson_inline simd8<bool> operator>(const simd8<int8_t> other) const { return __lasx_xvslt_b(other, *this); } - simdjson_inline simd8<bool> operator<(const simd8<int8_t> other) const { return __lasx_xvslt_b(*this, other); } + simdjson_inline simd8<int8_t> max_val(const simd8<int8_t> other) const { return __lsx_vmax_b(*this, other); } + simdjson_inline simd8<int8_t> min_val(const simd8<int8_t> other) const { return __lsx_vmin_b(*this, other); } + simdjson_inline simd8<bool> operator>(const simd8<int8_t> other) const { return __lsx_vslt_b(other, *this); } + simdjson_inline simd8<bool> operator<(const simd8<int8_t> other) const { return __lsx_vslt_b(*this, other); } }; // Unsigned bytes template<> struct simd8<uint8_t>: base8_numeric<uint8_t> { simdjson_inline simd8() : base8_numeric<uint8_t>() {} - simdjson_inline simd8(const __m256i _value) : base8_numeric<uint8_t>(_value) {} + simdjson_inline simd8(const __m128i _value) : base8_numeric<uint8_t>(_value) {} // Splat constructor simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {} // Array constructor - simdjson_inline simd8(const uint8_t values[32]) : simd8(load(values)) {} + simdjson_inline simd8(const uint8_t values[16]) : simd8(load(values)) {} // Member-by-member initialization simdjson_inline simd8( uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, - uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15, - uint8_t v16, uint8_t v17, uint8_t v18, uint8_t v19, uint8_t v20, uint8_t v21, uint8_t v22, uint8_t v23, - uint8_t v24, uint8_t v25, uint8_t v26, uint8_t v27, uint8_t v28, uint8_t v29, uint8_t v30, uint8_t v31 - ) : simd8(__m256i(v32u8{ + uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 + ) : simd8(__m128i(v16u8{ v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15, - v16,v17,v18,v19,v20,v21,v22,v23, - v24,v25,v26,v27,v28,v29,v30,v31 + v8, v9, v10,v11,v12,v13,v14,v15 })) {} // Repeat 16 values as many times as necessary (usually for lookup tables) simdjson_inline static simd8<uint8_t> repeat_16( @@ -51124,20 +51458,18 @@ namespace simd { uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 ) { return simd8<uint8_t>( - v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,v11,v12,v13,v14,v15 ); } // Saturated math - simdjson_inline simd8<uint8_t> saturating_add(const simd8<uint8_t> other) const { return __lasx_xvsadd_bu(*this, other); } - simdjson_inline simd8<uint8_t> saturating_sub(const simd8<uint8_t> other) const { return __lasx_xvssub_bu(*this, other); } + simdjson_inline simd8<uint8_t> saturating_add(const simd8<uint8_t> other) const { return __lsx_vsadd_bu(*this, other); } + simdjson_inline simd8<uint8_t> saturating_sub(const simd8<uint8_t> other) const { return __lsx_vssub_bu(*this, other); } // Order-specific operations - simdjson_inline simd8<uint8_t> max_val(const simd8<uint8_t> other) const { return __lasx_xvmax_bu(*this, other); } - simdjson_inline simd8<uint8_t> min_val(const simd8<uint8_t> other) const { return __lasx_xvmin_bu(other, *this); } + simdjson_inline simd8<uint8_t> max_val(const simd8<uint8_t> other) const { return __lsx_vmax_bu(*this, other); } + simdjson_inline simd8<uint8_t> min_val(const simd8<uint8_t> other) const { return __lsx_vmin_bu(other, *this); } // Same as >, but only guarantees true is nonzero (< guarantees true = -1) simdjson_inline simd8<uint8_t> gt_bits(const simd8<uint8_t> other) const { return this->saturating_sub(other); } // Same as <, but only guarantees true is nonzero (< guarantees true = -1) @@ -51152,84 +51484,97 @@ namespace simd { simdjson_inline simd8<bool> bits_not_set(simd8<uint8_t> bits) const { return (*this & bits).bits_not_set(); } simdjson_inline simd8<bool> any_bits_set() const { return ~this->bits_not_set(); } simdjson_inline simd8<bool> any_bits_set(simd8<uint8_t> bits) const { return ~this->bits_not_set(bits); } - simdjson_inline bool is_ascii() const { - __m256i mask = __lasx_xvmskltz_b(*this); - return (0 == __lasx_xvpickve2gr_w(mask, 0)) && (0 == __lasx_xvpickve2gr_w(mask, 4)); - } - simdjson_inline bool bits_not_set_anywhere() const { - __m256i v = __lasx_xvmsknz_b(*this); - return (0 == __lasx_xvpickve2gr_w(v, 0)) && (0 == __lasx_xvpickve2gr_w(v, 4)); - } + simdjson_inline bool is_ascii() const { return 0 == __lsx_vpickve2gr_w(__lsx_vmskltz_b(*this), 0); } + simdjson_inline bool bits_not_set_anywhere() const { return 0 == __lsx_vpickve2gr_hu(__lsx_vmsknz_b(*this), 0); } simdjson_inline bool any_bits_set_anywhere() const { return !bits_not_set_anywhere(); } simdjson_inline bool bits_not_set_anywhere(simd8<uint8_t> bits) const { - __m256i v = __lasx_xvmsknz_b(__lasx_xvand_v(*this, bits)); - return (0 == __lasx_xvpickve2gr_w(v, 0)) && (0 == __lasx_xvpickve2gr_w(v, 4)); + return 0 == __lsx_vpickve2gr_hu(__lsx_vmsknz_b(__lsx_vand_v(*this, bits)), 0); } simdjson_inline bool any_bits_set_anywhere(simd8<uint8_t> bits) const { return !bits_not_set_anywhere(bits); } template<int N> - simdjson_inline simd8<uint8_t> shr() const { return simd8<uint8_t>(__lasx_xvsrli_b(*this, N)); } + simdjson_inline simd8<uint8_t> shr() const { return simd8<uint8_t>(__lsx_vsrli_b(*this, N)); } template<int N> - simdjson_inline simd8<uint8_t> shl() const { return simd8<uint8_t>(__lasx_xvslli_b(*this, N)); } + simdjson_inline simd8<uint8_t> shl() const { return simd8<uint8_t>(__lsx_vslli_b(*this, N)); } }; template<typename T> struct simd8x64 { static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<T>); - static_assert(NUM_CHUNKS == 2, "LASX kernel should use two registers per 64-byte block."); + static_assert(NUM_CHUNKS == 4, "LSX kernel should use four registers per 64-byte block."); const simd8<T> chunks[NUM_CHUNKS]; + template<int idx> simd8<uint8_t> get() const { return idx < NUM_CHUNKS ? chunks[idx] : simd8<T>(); } simd8x64(const simd8x64<T>& o) = delete; // no copy allowed simd8x64<T>& operator=(const simd8<T>& other) = delete; // no assignment allowed simd8x64() = delete; // no default constructor allowed - simdjson_inline simd8x64(const simd8<T> chunk0, const simd8<T> chunk1) : chunks{chunk0, chunk1} {} - simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8<T>::load(ptr), simd8<T>::load(ptr+32)} {} + simdjson_inline simd8x64(const simd8<T> chunk0, const simd8<T> chunk1, const simd8<T> chunk2, const simd8<T> chunk3) : chunks{chunk0, chunk1, chunk2, chunk3} {} + simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8<T>::load(ptr), simd8<T>::load(ptr+16), simd8<T>::load(ptr+32), simd8<T>::load(ptr+48)} {} simdjson_inline uint64_t compress(uint64_t mask, T * output) const { - uint32_t mask1 = uint32_t(mask); - uint32_t mask2 = uint32_t(mask >> 32); - __m256i zcnt = __lasx_xvpcnt_w(__m256i(v4u64{~mask, 0, 0, 0})); - uint64_t zcnt1 = __lasx_xvpickve2gr_wu(zcnt, 0); - uint64_t zcnt2 = __lasx_xvpickve2gr_wu(zcnt, 1); + uint16_t mask1 = uint16_t(mask); + uint16_t mask2 = uint16_t(mask >> 16); + uint16_t mask3 = uint16_t(mask >> 32); + uint16_t mask4 = uint16_t(mask >> 48); + __m128i zcnt = __lsx_vpcnt_h(__m128i(v2u64{~mask, 0})); + uint64_t zcnt1 = __lsx_vpickve2gr_hu(zcnt, 0); + uint64_t zcnt2 = __lsx_vpickve2gr_hu(zcnt, 1); + uint64_t zcnt3 = __lsx_vpickve2gr_hu(zcnt, 2); + uint64_t zcnt4 = __lsx_vpickve2gr_hu(zcnt, 3); + uint8_t *voutput = reinterpret_cast<uint8_t*>(output); // There should be a critical value which processes in scaler is faster. if (zcnt1) - this->chunks[0].compress(mask1, output); + this->chunks[0].compress(mask1, reinterpret_cast<T*>(voutput)); + voutput += zcnt1; if (zcnt2) - this->chunks[1].compress(mask2, output + zcnt1); - return zcnt1 + zcnt2; + this->chunks[1].compress(mask2, reinterpret_cast<T*>(voutput)); + voutput += zcnt2; + if (zcnt3) + this->chunks[2].compress(mask3, reinterpret_cast<T*>(voutput)); + voutput += zcnt3; + if (zcnt4) + this->chunks[3].compress(mask4, reinterpret_cast<T*>(voutput)); + voutput += zcnt4; + return reinterpret_cast<uint64_t>(voutput) - reinterpret_cast<uint64_t>(output); } simdjson_inline void store(T ptr[64]) const { this->chunks[0].store(ptr+sizeof(simd8<T>)*0); this->chunks[1].store(ptr+sizeof(simd8<T>)*1); + this->chunks[2].store(ptr+sizeof(simd8<T>)*2); + this->chunks[3].store(ptr+sizeof(simd8<T>)*3); } simdjson_inline uint64_t to_bitmask() const { - __m256i mask0 = __lasx_xvmskltz_b(this->chunks[0]); - __m256i mask1 = __lasx_xvmskltz_b(this->chunks[1]); - __m256i mask_tmp = __lasx_xvpickve_w(mask0, 4); - __m256i tmp = __lasx_xvpickve_w(mask1, 4); - mask0 = __lasx_xvinsve0_w(mask0, mask1, 1); - mask_tmp = __lasx_xvinsve0_w(mask_tmp, tmp, 1); - return __lasx_xvpickve2gr_du(__lasx_xvpackev_h(mask_tmp, mask0), 0); + __m128i mask1 = __lsx_vmskltz_b(this->chunks[0]); + __m128i mask2 = __lsx_vmskltz_b(this->chunks[1]); + __m128i mask3 = __lsx_vmskltz_b(this->chunks[2]); + __m128i mask4 = __lsx_vmskltz_b(this->chunks[3]); + mask1 = __lsx_vilvl_h(mask2, mask1); + mask2 = __lsx_vilvl_h(mask4, mask3); + return __lsx_vpickve2gr_du(__lsx_vilvl_w(mask2, mask1), 0); } simdjson_inline simd8<T> reduce_or() const { - return this->chunks[0] | this->chunks[1]; + return (this->chunks[0] | this->chunks[1]) | (this->chunks[2] | this->chunks[3]); } simdjson_inline uint64_t eq(const T m) const { const simd8<T> mask = simd8<T>::splat(m); return simd8x64<bool>( this->chunks[0] == mask, - this->chunks[1] == mask + this->chunks[1] == mask, + this->chunks[2] == mask, + this->chunks[3] == mask ).to_bitmask(); } simdjson_inline uint64_t eq(const simd8x64<uint8_t> &other) const { return simd8x64<bool>( this->chunks[0] == other.chunks[0], - this->chunks[1] == other.chunks[1] + this->chunks[1] == other.chunks[1], + this->chunks[2] == other.chunks[2], + this->chunks[3] == other.chunks[3] ).to_bitmask(); } @@ -51237,31 +51582,33 @@ namespace simd { const simd8<T> mask = simd8<T>::splat(m); return simd8x64<bool>( this->chunks[0] <= mask, - this->chunks[1] <= mask + this->chunks[1] <= mask, + this->chunks[2] <= mask, + this->chunks[3] <= mask ).to_bitmask(); } }; // struct simd8x64<T> } // namespace simd } // unnamed namespace -} // namespace lasx +} // namespace lsx } // namespace simdjson -#endif // SIMDJSON_LASX_SIMD_H -/* end file simdjson/lasx/simd.h */ -/* including simdjson/lasx/stringparsing_defs.h: #include "simdjson/lasx/stringparsing_defs.h" */ -/* begin file simdjson/lasx/stringparsing_defs.h */ -#ifndef SIMDJSON_LASX_STRINGPARSING_DEFS_H -#define SIMDJSON_LASX_STRINGPARSING_DEFS_H +#endif // SIMDJSON_LSX_SIMD_H +/* end file simdjson/lsx/simd.h */ +/* including simdjson/lsx/stringparsing_defs.h: #include "simdjson/lsx/stringparsing_defs.h" */ +/* begin file simdjson/lsx/stringparsing_defs.h */ +#ifndef SIMDJSON_LSX_STRINGPARSING_DEFS_H +#define SIMDJSON_LSX_STRINGPARSING_DEFS_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/simd.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/simd.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/bitmanipulation.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace lsx { namespace { using namespace simd; @@ -51285,11 +51632,17 @@ simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uin // this can read up to 31 bytes beyond the buffer size, but we require // SIMDJSON_PADDING of padding static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "backslash and quote finder must process fewer than SIMDJSON_PADDING bytes"); - simd8<uint8_t> v(src); - v.store(dst); + simd8<uint8_t> v0(src); + simd8<uint8_t> v1(src + sizeof(v0)); + v0.store(dst); + v1.store(dst + sizeof(v0)); + + // Getting a 64-bit bitmask is much cheaper than multiple 16-bit bitmasks on LSX; therefore, we + // smash them together into a 64-byte mask and get the bitmask from there. + uint64_t bs_and_quote = simd8x64<bool>(v0 == '\\', v1 == '\\', v0 == '"', v1 == '"').to_bitmask(); return { - static_cast<uint32_t>((v == '\\').to_bitmask()), // bs_bits - static_cast<uint32_t>((v == '"').to_bitmask()), // quote_bits + uint32_t(bs_and_quote), // bs_bits + uint32_t(bs_and_quote >> 32) // quote_bits }; } @@ -51314,27 +51667,27 @@ simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *ds simd8<bool> is_backslash = (v == '\\'); simd8<bool> is_control = (v < 32); return { - (is_backslash | is_quote | is_control).to_bitmask() + static_cast<uint64_t>((is_backslash | is_quote | is_control).to_bitmask()) }; } } // unnamed namespace -} // namespace lasx +} // namespace lsx } // namespace simdjson -#endif // SIMDJSON_LASX_STRINGPARSING_DEFS_H -/* end file simdjson/lasx/stringparsing_defs.h */ +#endif // SIMDJSON_LSX_STRINGPARSING_DEFS_H +/* end file simdjson/lsx/stringparsing_defs.h */ #define SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT 1 -/* end file simdjson/lasx/begin.h */ -/* including generic/amalgamated.h for lasx: #include <generic/amalgamated.h> */ -/* begin file generic/amalgamated.h for lasx */ +/* end file simdjson/lsx/begin.h */ +/* including generic/amalgamated.h for lsx: #include <generic/amalgamated.h> */ +/* begin file generic/amalgamated.h for lsx */ #if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_SRC_GENERIC_DEPENDENCIES_H) #error generic/dependencies.h must be included before generic/amalgamated.h! #endif -/* including generic/base.h for lasx: #include <generic/base.h> */ -/* begin file generic/base.h for lasx */ +/* including generic/base.h for lsx: #include <generic/base.h> */ +/* begin file generic/base.h for lsx */ #ifndef SIMDJSON_SRC_GENERIC_BASE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -51344,19 +51697,19 @@ simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *ds /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace lsx { namespace { struct json_character_block; } // unnamed namespace -} // namespace lasx +} // namespace lsx } // namespace simdjson #endif // SIMDJSON_SRC_GENERIC_BASE_H -/* end file generic/base.h for lasx */ -/* including generic/dom_parser_implementation.h for lasx: #include <generic/dom_parser_implementation.h> */ -/* begin file generic/dom_parser_implementation.h for lasx */ +/* end file generic/base.h for lsx */ +/* including generic/dom_parser_implementation.h for lsx: #include <generic/dom_parser_implementation.h> */ +/* begin file generic/dom_parser_implementation.h for lsx */ #ifndef SIMDJSON_SRC_GENERIC_DOM_PARSER_IMPLEMENTATION_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -51367,20 +51720,20 @@ struct json_character_block; // Interface a dom parser implementation must fulfill namespace simdjson { -namespace lasx { +namespace lsx { namespace { simdjson_inline simd8<uint8_t> must_be_2_3_continuation(const simd8<uint8_t> prev2, const simd8<uint8_t> prev3); simdjson_inline bool is_ascii(const simd8x64<uint8_t>& input); } // unnamed namespace -} // namespace lasx +} // namespace lsx } // namespace simdjson #endif // SIMDJSON_SRC_GENERIC_DOM_PARSER_IMPLEMENTATION_H -/* end file generic/dom_parser_implementation.h for lasx */ -/* including generic/json_character_block.h for lasx: #include <generic/json_character_block.h> */ -/* begin file generic/json_character_block.h for lasx */ +/* end file generic/dom_parser_implementation.h for lsx */ +/* including generic/json_character_block.h for lsx: #include <generic/json_character_block.h> */ +/* begin file generic/json_character_block.h for lsx */ #ifndef SIMDJSON_SRC_GENERIC_JSON_CHARACTER_BLOCK_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -51389,7 +51742,7 @@ simdjson_inline bool is_ascii(const simd8x64<uint8_t>& input); /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace lsx { namespace { struct json_character_block { @@ -51404,17 +51757,17 @@ struct json_character_block { }; } // unnamed namespace -} // namespace lasx +} // namespace lsx } // namespace simdjson #endif // SIMDJSON_SRC_GENERIC_JSON_CHARACTER_BLOCK_H -/* end file generic/json_character_block.h for lasx */ -/* end file generic/amalgamated.h for lasx */ -/* including generic/stage1/amalgamated.h for lasx: #include <generic/stage1/amalgamated.h> */ -/* begin file generic/stage1/amalgamated.h for lasx */ +/* end file generic/json_character_block.h for lsx */ +/* end file generic/amalgamated.h for lsx */ +/* including generic/stage1/amalgamated.h for lsx: #include <generic/stage1/amalgamated.h> */ +/* begin file generic/stage1/amalgamated.h for lsx */ // Stuff other things depend on -/* including generic/stage1/base.h for lasx: #include <generic/stage1/base.h> */ -/* begin file generic/stage1/base.h for lasx */ +/* including generic/stage1/base.h for lsx: #include <generic/stage1/base.h> */ +/* begin file generic/stage1/base.h for lsx */ #ifndef SIMDJSON_SRC_GENERIC_STAGE1_BASE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -51423,7 +51776,7 @@ struct json_character_block { /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace lsx { namespace { namespace stage1 { @@ -51446,13 +51799,13 @@ struct utf8_checker; using utf8_validation::utf8_checker; } // unnamed namespace -} // namespace lasx +} // namespace lsx } // namespace simdjson #endif // SIMDJSON_SRC_GENERIC_STAGE1_BASE_H -/* end file generic/stage1/base.h for lasx */ -/* including generic/stage1/buf_block_reader.h for lasx: #include <generic/stage1/buf_block_reader.h> */ -/* begin file generic/stage1/buf_block_reader.h for lasx */ +/* end file generic/stage1/base.h for lsx */ +/* including generic/stage1/buf_block_reader.h for lsx: #include <generic/stage1/buf_block_reader.h> */ +/* begin file generic/stage1/buf_block_reader.h for lsx */ #ifndef SIMDJSON_SRC_GENERIC_STAGE1_BUF_BLOCK_READER_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -51463,7 +51816,7 @@ using utf8_validation::utf8_checker; #include <cstring> namespace simdjson { -namespace lasx { +namespace lsx { namespace { namespace stage1 { @@ -51565,13 +51918,13 @@ simdjson_inline void buf_block_reader<STEP_SIZE>::advance() { } // namespace stage1 } // unnamed namespace -} // namespace lasx +} // namespace lsx } // namespace simdjson #endif // SIMDJSON_SRC_GENERIC_STAGE1_BUF_BLOCK_READER_H -/* end file generic/stage1/buf_block_reader.h for lasx */ -/* including generic/stage1/json_escape_scanner.h for lasx: #include <generic/stage1/json_escape_scanner.h> */ -/* begin file generic/stage1/json_escape_scanner.h for lasx */ +/* end file generic/stage1/buf_block_reader.h for lsx */ +/* including generic/stage1/json_escape_scanner.h for lsx: #include <generic/stage1/json_escape_scanner.h> */ +/* begin file generic/stage1/json_escape_scanner.h for lsx */ #ifndef SIMDJSON_SRC_GENERIC_STAGE1_JSON_ESCAPE_SCANNER_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -51581,7 +51934,7 @@ simdjson_inline void buf_block_reader<STEP_SIZE>::advance() { /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace lsx { namespace { namespace stage1 { @@ -51719,13 +52072,13 @@ struct json_escape_scanner { } // namespace stage1 } // unnamed namespace -} // namespace lasx +} // namespace lsx } // namespace simdjson #endif // SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRING_SCANNER_H -/* end file generic/stage1/json_escape_scanner.h for lasx */ -/* including generic/stage1/json_string_scanner.h for lasx: #include <generic/stage1/json_string_scanner.h> */ -/* begin file generic/stage1/json_string_scanner.h for lasx */ +/* end file generic/stage1/json_escape_scanner.h for lsx */ +/* including generic/stage1/json_string_scanner.h for lsx: #include <generic/stage1/json_string_scanner.h> */ +/* begin file generic/stage1/json_string_scanner.h for lsx */ #ifndef SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRING_SCANNER_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -51735,7 +52088,7 @@ struct json_escape_scanner { /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace lsx { namespace { namespace stage1 { @@ -51821,13 +52174,13 @@ simdjson_really_inline error_code json_string_scanner::finish() { } // namespace stage1 } // unnamed namespace -} // namespace lasx +} // namespace lsx } // namespace simdjson #endif // SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRING_SCANNER_H -/* end file generic/stage1/json_string_scanner.h for lasx */ -/* including generic/stage1/utf8_lookup4_algorithm.h for lasx: #include <generic/stage1/utf8_lookup4_algorithm.h> */ -/* begin file generic/stage1/utf8_lookup4_algorithm.h for lasx */ +/* end file generic/stage1/json_string_scanner.h for lsx */ +/* including generic/stage1/utf8_lookup4_algorithm.h for lsx: #include <generic/stage1/utf8_lookup4_algorithm.h> */ +/* begin file generic/stage1/utf8_lookup4_algorithm.h for lsx */ #ifndef SIMDJSON_SRC_GENERIC_STAGE1_UTF8_LOOKUP4_ALGORITHM_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -51837,7 +52190,7 @@ simdjson_really_inline error_code json_string_scanner::finish() { /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace lsx { namespace { namespace utf8_validation { @@ -51949,7 +52302,6581 @@ using namespace simd; simdjson_inline simd8<uint8_t> is_incomplete(const simd8<uint8_t> input) { // If the previous input's last 3 bytes match this, they're too short (they ended at EOF): // ... 1111____ 111_____ 11______ -#if SIMDJSON_IMPLEMENTATION_ICELAKE +#if SIMDJSON_IMPLEMENTATION_ICELAKE || (SIMDJSON_IMPLEMENTATION_RVV_VLS && __riscv_v_fixed_vlen >= 512) + static const uint8_t max_array[64] = { + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 0xf0u-1, 0xe0u-1, 0xc0u-1 + }; +#else + static const uint8_t max_array[32] = { + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 0xf0u-1, 0xe0u-1, 0xc0u-1 + }; +#endif + const simd8<uint8_t> max_value(&max_array[sizeof(max_array)-sizeof(simd8<uint8_t>)]); + return input.gt_bits(max_value); + } + + struct utf8_checker { + // If this is nonzero, there has been a UTF-8 error. + simd8<uint8_t> error; + // The last input we received + simd8<uint8_t> prev_input_block; + // Whether the last input we received was incomplete (used for ASCII fast path) + simd8<uint8_t> prev_incomplete; + + // + // Check whether the current bytes are valid UTF-8. + // + simdjson_inline void check_utf8_bytes(const simd8<uint8_t> input, const simd8<uint8_t> prev_input) { + // Flip prev1...prev3 so we can easily determine if they are 2+, 3+ or 4+ lead bytes + // (2, 3, 4-byte leads become large positive numbers instead of small negative numbers) + simd8<uint8_t> prev1 = input.prev<1>(prev_input); + simd8<uint8_t> sc = check_special_cases(input, prev1); + this->error |= check_multibyte_lengths(input, prev_input, sc); + } + + // The only problem that can happen at EOF is that a multibyte character is too short + // or a byte value too large in the last bytes: check_special_cases only checks for bytes + // too large in the first of two bytes. + simdjson_inline void check_eof() { + // If the previous block had incomplete UTF-8 characters at the end, an ASCII block can't + // possibly finish them. + this->error |= this->prev_incomplete; + } + + simdjson_inline void check_next_input(const simd8x64<uint8_t>& input) { + if(simdjson_likely(is_ascii(input))) { + this->error |= this->prev_incomplete; + } else { + // you might think that a for-loop would work, but under Visual Studio, it is not good enough. + static_assert((simd8x64<uint8_t>::NUM_CHUNKS == 1) + ||(simd8x64<uint8_t>::NUM_CHUNKS == 2) + || (simd8x64<uint8_t>::NUM_CHUNKS == 4), + "We support one, two or four chunks per 64-byte block."); + SIMDJSON_IF_CONSTEXPR (simd8x64<uint8_t>::NUM_CHUNKS == 1) { + this->check_utf8_bytes(input.get<0>(), this->prev_input_block); + } else SIMDJSON_IF_CONSTEXPR (simd8x64<uint8_t>::NUM_CHUNKS == 2) { + this->check_utf8_bytes(input.get<0>(), this->prev_input_block); + this->check_utf8_bytes(input.get<1>(), input.get<0>()); + } else SIMDJSON_IF_CONSTEXPR (simd8x64<uint8_t>::NUM_CHUNKS == 4) { + this->check_utf8_bytes(input.get<0>(), this->prev_input_block); + this->check_utf8_bytes(input.get<1>(), input.get<0>()); + this->check_utf8_bytes(input.get<2>(), input.get<1>()); + this->check_utf8_bytes(input.get<3>(), input.get<2>()); + } + this->prev_incomplete = is_incomplete(input.get<simd8x64<uint8_t>::NUM_CHUNKS-1>()); + this->prev_input_block = input.get<simd8x64<uint8_t>::NUM_CHUNKS-1>(); + } + } + // do not forget to call check_eof! + simdjson_warn_unused simdjson_inline error_code errors() { + return this->error.any_bits_set_anywhere() ? error_code::UTF8_ERROR : error_code::SUCCESS; + } + + }; // struct utf8_checker +} // namespace utf8_validation + +} // unnamed namespace +} // namespace lsx +} // namespace simdjson + +#endif // SIMDJSON_SRC_GENERIC_STAGE1_UTF8_LOOKUP4_ALGORITHM_H +/* end file generic/stage1/utf8_lookup4_algorithm.h for lsx */ +/* including generic/stage1/json_scanner.h for lsx: #include <generic/stage1/json_scanner.h> */ +/* begin file generic/stage1/json_scanner.h for lsx */ +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_JSON_SCANNER_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_JSON_SCANNER_H */ +/* amalgamation skipped (editor-only): #include <generic/stage1/base.h> */ +/* amalgamation skipped (editor-only): #include <generic/json_character_block.h> */ +/* amalgamation skipped (editor-only): #include <generic/stage1/json_string_scanner.h> */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace lsx { +namespace { +namespace stage1 { + +/** + * A block of scanned json, with information on operators and scalars. + * + * We seek to identify pseudo-structural characters. Anything that is inside + * a string must be omitted (hence & ~_string.string_tail()). + * Otherwise, pseudo-structural characters come in two forms. + * 1. We have the structural characters ([,],{,},:, comma). The + * term 'structural character' is from the JSON RFC. + * 2. We have the 'scalar pseudo-structural characters'. + * Scalars are quotes, and any character except structural characters and white space. + * + * To identify the scalar pseudo-structural characters, we must look at what comes + * before them: it must be a space, a quote or a structural characters. + * Starting with simdjson v0.3, we identify them by + * negation: we identify everything that is followed by a non-quote scalar, + * and we negate that. Whatever remains must be a 'scalar pseudo-structural character'. + */ +struct json_block { +public: + // We spell out the constructors in the hope of resolving inlining issues with Visual Studio 2017 + simdjson_inline json_block(json_string_block&& string, json_character_block characters, uint64_t follows_potential_nonquote_scalar) : + _string(std::move(string)), _characters(characters), _follows_potential_nonquote_scalar(follows_potential_nonquote_scalar) {} + simdjson_inline json_block(json_string_block string, json_character_block characters, uint64_t follows_potential_nonquote_scalar) : + _string(string), _characters(characters), _follows_potential_nonquote_scalar(follows_potential_nonquote_scalar) {} + + /** + * The start of structurals. + * In simdjson prior to v0.3, these were called the pseudo-structural characters. + **/ + simdjson_inline uint64_t structural_start() const noexcept { return potential_structural_start() & ~_string.string_tail(); } + /** All JSON whitespace (i.e. not in a string) */ + simdjson_inline uint64_t whitespace() const noexcept { return non_quote_outside_string(_characters.whitespace()); } + + // Helpers + + /** Whether the given characters are inside a string (only works on non-quotes) */ + simdjson_inline uint64_t non_quote_inside_string(uint64_t mask) const noexcept { return _string.non_quote_inside_string(mask); } + /** Whether the given characters are outside a string (only works on non-quotes) */ + simdjson_inline uint64_t non_quote_outside_string(uint64_t mask) const noexcept { return _string.non_quote_outside_string(mask); } + + // string and escape characters + json_string_block _string; + // whitespace, structural characters ('operators'), scalars + json_character_block _characters; + // whether the previous character was a scalar + uint64_t _follows_potential_nonquote_scalar; +private: + // Potential structurals (i.e. disregarding strings) + + /** + * structural elements ([,],{,},:, comma) plus scalar starts like 123, true and "abc". + * They may reside inside a string. + **/ + simdjson_inline uint64_t potential_structural_start() const noexcept { return _characters.op() | potential_scalar_start(); } + /** + * The start of non-operator runs, like 123, true and "abc". + * It main reside inside a string. + **/ + simdjson_inline uint64_t potential_scalar_start() const noexcept { + // The term "scalar" refers to anything except structural characters and white space + // (so letters, numbers, quotes). + // Whenever it is preceded by something that is not a structural element ({,},[,],:, ") nor a white-space + // then we know that it is irrelevant structurally. + return _characters.scalar() & ~follows_potential_scalar(); + } + /** + * Whether the given character is immediately after a non-operator like 123, true. + * The characters following a quote are not included. + */ + simdjson_inline uint64_t follows_potential_scalar() const noexcept { + // _follows_potential_nonquote_scalar: is defined as marking any character that follows a character + // that is not a structural element ({,},[,],:, comma) nor a quote (") and that is not a + // white space. + // It is understood that within quoted region, anything at all could be marked (irrelevant). + return _follows_potential_nonquote_scalar; + } +}; + +/** + * Scans JSON for important bits: structural characters or 'operators', strings, and scalars. + * + * The scanner starts by calculating two distinct things: + * - string characters (taking \" into account) + * - structural characters or 'operators' ([]{},:, comma) + * and scalars (runs of non-operators like 123, true and "abc") + * + * To minimize data dependency (a key component of the scanner's speed), it finds these in parallel: + * in particular, the operator/scalar bit will find plenty of things that are actually part of + * strings. When we're done, json_block will fuse the two together by masking out tokens that are + * part of a string. + */ +class json_scanner { +public: + json_scanner() = default; + simdjson_inline json_block next(const simd::simd8x64<uint8_t>& in); + // Returns either UNCLOSED_STRING or SUCCESS + simdjson_warn_unused simdjson_inline error_code finish(); + +private: + // Whether the last character of the previous iteration is part of a scalar token + // (anything except whitespace or a structural character/'operator'). + uint64_t prev_scalar = 0ULL; + json_string_scanner string_scanner{}; +}; + + +// +// Check if the current character immediately follows a matching character. +// +// For example, this checks for quotes with backslashes in front of them: +// +// const uint64_t backslashed_quote = in.eq('"') & immediately_follows(in.eq('\'), prev_backslash); +// +simdjson_inline uint64_t follows(const uint64_t match, uint64_t &overflow) { + const uint64_t result = match << 1 | overflow; + overflow = match >> 63; + return result; +} + +simdjson_inline json_block json_scanner::next(const simd::simd8x64<uint8_t>& in) { + json_string_block strings = string_scanner.next(in); + // identifies the white-space and the structural characters + json_character_block characters = json_character_block::classify(in); + // The term "scalar" refers to anything except structural characters and white space + // (so letters, numbers, quotes). + // We want follows_scalar to mark anything that follows a non-quote scalar (so letters and numbers). + // + // A terminal quote should either be followed by a structural character (comma, brace, bracket, colon) + // or nothing. However, we still want ' "a string"true ' to mark the 't' of 'true' as a potential + // pseudo-structural character just like we would if we had ' "a string" true '; otherwise we + // may need to add an extra check when parsing strings. + // + // Performance: there are many ways to skin this cat. + const uint64_t nonquote_scalar = characters.scalar() & ~strings.quote(); + uint64_t follows_nonquote_scalar = follows(nonquote_scalar, prev_scalar); + // We are returning a function-local object so either we get a move constructor + // or we get copy elision. + return json_block( + strings,// strings is a function-local object so either it moves or the copy is elided. + characters, + follows_nonquote_scalar + ); +} + +simdjson_warn_unused simdjson_inline error_code json_scanner::finish() { + return string_scanner.finish(); +} + +} // namespace stage1 +} // unnamed namespace +} // namespace lsx +} // namespace simdjson + +#endif // SIMDJSON_SRC_GENERIC_STAGE1_JSON_SCANNER_H +/* end file generic/stage1/json_scanner.h for lsx */ + +// All other declarations +/* including generic/stage1/find_next_document_index.h for lsx: #include <generic/stage1/find_next_document_index.h> */ +/* begin file generic/stage1/find_next_document_index.h for lsx */ +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_FIND_NEXT_DOCUMENT_INDEX_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_FIND_NEXT_DOCUMENT_INDEX_H */ +/* amalgamation skipped (editor-only): #include <generic/stage1/base.h> */ +/* amalgamation skipped (editor-only): #include <simdjson/generic/dom_parser_implementation.h> */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace lsx { +namespace { +namespace stage1 { + +/** + * This algorithm is used to quickly identify the last structural position that + * makes up a complete document. + * + * It does this by going backwards and finding the last *document boundary* (a + * place where one value follows another without a comma between them). If the + * last document (the characters after the boundary) has an equal number of + * start and end brackets, it is considered complete. + * + * Simply put, we iterate over the structural characters, starting from + * the end. We consider that we found the end of a JSON document when the + * first element of the pair is NOT one of these characters: '{' '[' ':' ',' + * and when the second element is NOT one of these characters: '}' ']' ':' ','. + * + * This simple comparison works most of the time, but it does not cover cases + * where the batch's structural indexes contain a perfect amount of documents. + * In such a case, we do not have access to the structural index which follows + * the last document, therefore, we do not have access to the second element in + * the pair, and that means we cannot identify the last document. To fix this + * issue, we keep a count of the open and closed curly/square braces we found + * while searching for the pair. When we find a pair AND the count of open and + * closed curly/square braces is the same, we know that we just passed a + * complete document, therefore the last json buffer location is the end of the + * batch. + */ +simdjson_inline uint32_t find_next_document_index(dom_parser_implementation &parser) { + // Variant: do not count separately, just figure out depth + if(parser.n_structural_indexes == 0) { return 0; } + auto arr_cnt = 0; + auto obj_cnt = 0; + for (auto i = parser.n_structural_indexes - 1; i > 0; i--) { + auto idxb = parser.structural_indexes[i]; + switch (parser.buf[idxb]) { + case ':': + case ',': + continue; + case '}': + obj_cnt--; + continue; + case ']': + arr_cnt--; + continue; + case '{': + obj_cnt++; + break; + case '[': + arr_cnt++; + break; + } + auto idxa = parser.structural_indexes[i - 1]; + switch (parser.buf[idxa]) { + case '{': + case '[': + case ':': + case ',': + continue; + } + // Last document is complete, so the next document will appear after! + if (!arr_cnt && !obj_cnt) { + return parser.n_structural_indexes; + } + // Last document is incomplete; mark the document at i + 1 as the next one + return i; + } + // If we made it to the end, we want to finish counting to see if we have a full document. + switch (parser.buf[parser.structural_indexes[0]]) { + case '}': + obj_cnt--; + break; + case ']': + arr_cnt--; + break; + case '{': + obj_cnt++; + break; + case '[': + arr_cnt++; + break; + } + if (!arr_cnt && !obj_cnt) { + // We have a complete document. + return parser.n_structural_indexes; + } + return 0; +} + +} // namespace stage1 +} // unnamed namespace +} // namespace lsx +} // namespace simdjson + +#endif // SIMDJSON_SRC_GENERIC_STAGE1_FIND_NEXT_DOCUMENT_INDEX_H +/* end file generic/stage1/find_next_document_index.h for lsx */ +/* including generic/stage1/json_minifier.h for lsx: #include <generic/stage1/json_minifier.h> */ +/* begin file generic/stage1/json_minifier.h for lsx */ +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_JSON_MINIFIER_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_JSON_MINIFIER_H */ +/* amalgamation skipped (editor-only): #include <generic/stage1/base.h> */ +/* amalgamation skipped (editor-only): #include <generic/stage1/json_scanner.h> */ +/* amalgamation skipped (editor-only): #include <generic/stage1/buf_block_reader.h> */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +// This file contains the common code every implementation uses in stage1 +// It is intended to be included multiple times and compiled multiple times +// We assume the file in which it is included already includes +// "simdjson/stage1.h" (this simplifies amalgation) + +namespace simdjson { +namespace lsx { +namespace { +namespace stage1 { + +class json_minifier { +public: + template<size_t STEP_SIZE> + static error_code minify(const uint8_t *buf, size_t len, uint8_t *dst, size_t &dst_len) noexcept; + +private: + simdjson_inline json_minifier(uint8_t *_dst) + : dst{_dst} + {} + template<size_t STEP_SIZE> + simdjson_inline void step(const uint8_t *block_buf, buf_block_reader<STEP_SIZE> &reader) noexcept; + simdjson_inline void next(const simd::simd8x64<uint8_t>& in, const json_block& block); + simdjson_warn_unused simdjson_inline error_code finish(uint8_t *dst_start, size_t &dst_len); + json_scanner scanner{}; + uint8_t *dst; +}; + +simdjson_inline void json_minifier::next(const simd::simd8x64<uint8_t>& in, const json_block& block) { + uint64_t mask = block.whitespace(); + dst += in.compress(mask, dst); +} + +simdjson_warn_unused simdjson_inline error_code json_minifier::finish(uint8_t *dst_start, size_t &dst_len) { + error_code error = scanner.finish(); + if (error) { dst_len = 0; return error; } + dst_len = dst - dst_start; + return SUCCESS; +} + +template<> +simdjson_inline void json_minifier::step<128>(const uint8_t *block_buf, buf_block_reader<128> &reader) noexcept { + simd::simd8x64<uint8_t> in_1(block_buf); + simd::simd8x64<uint8_t> in_2(block_buf+64); + json_block block_1 = scanner.next(in_1); + json_block block_2 = scanner.next(in_2); + this->next(in_1, block_1); + this->next(in_2, block_2); + reader.advance(); +} + +template<> +simdjson_inline void json_minifier::step<64>(const uint8_t *block_buf, buf_block_reader<64> &reader) noexcept { + simd::simd8x64<uint8_t> in_1(block_buf); + json_block block_1 = scanner.next(in_1); + this->next(block_buf, block_1); + reader.advance(); +} + +template<size_t STEP_SIZE> +error_code json_minifier::minify(const uint8_t *buf, size_t len, uint8_t *dst, size_t &dst_len) noexcept { + buf_block_reader<STEP_SIZE> reader(buf, len); + json_minifier minifier(dst); + + // Index the first n-1 blocks + while (reader.has_full_block()) { + minifier.step<STEP_SIZE>(reader.full_block(), reader); + } + + // Index the last (remainder) block, padded with spaces + uint8_t block[STEP_SIZE]; + size_t remaining_bytes = reader.get_remainder(block); + if (remaining_bytes > 0) { + // We do not want to write directly to the output stream. Rather, we write + // to a local buffer (for safety). + uint8_t out_block[STEP_SIZE]; + uint8_t * const guarded_dst{minifier.dst}; + minifier.dst = out_block; + minifier.step<STEP_SIZE>(block, reader); + size_t to_write = minifier.dst - out_block; + // In some cases, we could be enticed to consider the padded spaces + // as part of the string. This is fine as long as we do not write more + // than we consumed. + if(to_write > remaining_bytes) { to_write = remaining_bytes; } + memcpy(guarded_dst, out_block, to_write); + minifier.dst = guarded_dst + to_write; + } + return minifier.finish(dst, dst_len); +} + +} // namespace stage1 +} // unnamed namespace +} // namespace lsx +} // namespace simdjson + +#endif // SIMDJSON_SRC_GENERIC_STAGE1_JSON_MINIFIER_H +/* end file generic/stage1/json_minifier.h for lsx */ +/* including generic/stage1/json_structural_indexer.h for lsx: #include <generic/stage1/json_structural_indexer.h> */ +/* begin file generic/stage1/json_structural_indexer.h for lsx */ +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRUCTURAL_INDEXER_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRUCTURAL_INDEXER_H */ +/* amalgamation skipped (editor-only): #include <generic/stage1/base.h> */ +/* amalgamation skipped (editor-only): #include <generic/stage1/utf8_lookup4_algorithm.h> */ +/* amalgamation skipped (editor-only): #include <generic/stage1/buf_block_reader.h> */ +/* amalgamation skipped (editor-only): #include <generic/stage1/json_string_scanner.h> */ +/* amalgamation skipped (editor-only): #include <generic/stage1/json_scanner.h> */ +/* amalgamation skipped (editor-only): #include <generic/stage1/json_minifier.h> */ +/* amalgamation skipped (editor-only): #include <generic/stage1/find_next_document_index.h> */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +// This file contains the common code every implementation uses in stage1 +// It is intended to be included multiple times and compiled multiple times +// We assume the file in which it is included already includes +// "simdjson/stage1.h" (this simplifies amalgation) + +namespace simdjson { +namespace lsx { +namespace { +namespace stage1 { + +class bit_indexer { +public: + uint32_t *tail; + + simdjson_inline bit_indexer(uint32_t *index_buf) : tail(index_buf) {} + +#if SIMDJSON_PREFER_REVERSE_BITS + /** + * ARM lacks a fast trailing zero instruction, but it has a fast + * bit reversal instruction and a fast leading zero instruction. + * Thus it may be profitable to reverse the bits (once) and then + * to rely on a sequence of instructions that call the leading + * zero instruction. + * + * Performance notes: + * The chosen routine is not optimal in terms of data dependency + * since zero_leading_bit might require two instructions. However, + * it tends to minimize the total number of instructions which is + * beneficial. + */ + simdjson_inline void write_index(uint32_t idx, uint64_t& rev_bits, int i) { + int lz = leading_zeroes(rev_bits); + this->tail[i] = static_cast<uint32_t>(idx) + lz; + rev_bits = zero_leading_bit(rev_bits, lz); + } +#else + /** + * Under recent x64 systems, we often have both a fast trailing zero + * instruction and a fast 'clear-lower-bit' instruction so the following + * algorithm can be competitive. + */ + + simdjson_inline void write_index(uint32_t idx, uint64_t& bits, int i) { + this->tail[i] = idx + trailing_zeroes(bits); + bits = clear_lowest_bit(bits); + } +#endif // SIMDJSON_PREFER_REVERSE_BITS + + template <int START, int N> + simdjson_inline int write_indexes(uint32_t idx, uint64_t& bits) { + write_index(idx, bits, START); + SIMDJSON_IF_CONSTEXPR (N > 1) { + write_indexes<(N-1>0?START+1:START), (N-1>=0?N-1:1)>(idx, bits); + } + return START+N; + } + + template <int START, int END, int STEP> + simdjson_inline int write_indexes_stepped(uint32_t idx, uint64_t& bits, int cnt) { + write_indexes<START, STEP>(idx, bits); + SIMDJSON_IF_CONSTEXPR ((START+STEP) < END) { + if (simdjson_unlikely((START+STEP) < cnt)) { + write_indexes_stepped<(START+STEP<END?START+STEP:END), END, STEP>(idx, bits, cnt); + } + } + return ((END-START) % STEP) == 0 ? END : (END-START) - ((END-START) % STEP) + STEP; + } + + // flatten out values in 'bits' assuming that they are are to have values of idx + // plus their position in the bitvector, and store these indexes at + // base_ptr[base] incrementing base as we go + // will potentially store extra values beyond end of valid bits, so base_ptr + // needs to be large enough to handle this + // + // If the kernel sets SIMDJSON_GENERIC_JSON_STRUCTURAL_INDEXER_CUSTOM_BIT_INDEXER, then it + // will provide its own version of the code. +#ifdef SIMDJSON_GENERIC_JSON_STRUCTURAL_INDEXER_CUSTOM_BIT_INDEXER + simdjson_inline void write(uint32_t idx, uint64_t bits); +#else + simdjson_inline void write(uint32_t idx, uint64_t bits) { + // In some instances, the next branch is expensive because it is mispredicted. + // Unfortunately, in other cases, + // it helps tremendously. + if (bits == 0) + return; + + int cnt = static_cast<int>(count_ones(bits)); + +#if SIMDJSON_PREFER_REVERSE_BITS + bits = reverse_bits(bits); +#endif +#ifdef SIMDJSON_STRUCTURAL_INDEXER_STEP + static constexpr const int STEP = SIMDJSON_STRUCTURAL_INDEXER_STEP; +#else + static constexpr const int STEP = 4; +#endif + static constexpr const int STEP_UNTIL = 24; + + write_indexes_stepped<0, STEP_UNTIL, STEP>(idx, bits, cnt); + SIMDJSON_IF_CONSTEXPR (STEP_UNTIL < 64) { + if (simdjson_unlikely(STEP_UNTIL < cnt)) { + for (int i=STEP_UNTIL; i<cnt; i++) { + write_index(idx, bits, i); + } + } + } + + this->tail += cnt; + } +#endif // SIMDJSON_GENERIC_JSON_STRUCTURAL_INDEXER_CUSTOM_BIT_INDEXER + +}; + +class json_structural_indexer { +public: + /** + * Find the important bits of JSON in a 128-byte chunk, and add them to structural_indexes. + * + * @param partial Setting the partial parameter to true allows the find_structural_bits to + * tolerate unclosed strings. The caller should still ensure that the input is valid UTF-8. If + * you are processing substrings, you may want to call on a function like trimmed_length_safe_utf8. + */ + template<size_t STEP_SIZE> + static error_code index(const uint8_t *buf, size_t len, dom_parser_implementation &parser, stage1_mode partial) noexcept; + +private: + simdjson_inline json_structural_indexer(uint32_t *structural_indexes); + template<size_t STEP_SIZE> + simdjson_inline void step(const uint8_t *block, buf_block_reader<STEP_SIZE> &reader) noexcept; + simdjson_inline void next(const simd::simd8x64<uint8_t>& in, const json_block& block, size_t idx); + simdjson_warn_unused simdjson_inline error_code finish(dom_parser_implementation &parser, size_t idx, size_t len, stage1_mode partial); + + json_scanner scanner{}; + utf8_checker checker{}; + bit_indexer indexer; + uint64_t prev_structurals = 0; + uint64_t unescaped_chars_error = 0; +}; + +simdjson_inline json_structural_indexer::json_structural_indexer(uint32_t *structural_indexes) : indexer{structural_indexes} {} + +// Skip the last character if it is partial +simdjson_inline size_t trim_partial_utf8(const uint8_t *buf, size_t len) { + if (simdjson_unlikely(len < 3)) { + switch (len) { + case 2: + if (buf[len-1] >= 0xc0) { return len-1; } // 2-, 3- and 4-byte characters with only 1 byte left + if (buf[len-2] >= 0xe0) { return len-2; } // 3- and 4-byte characters with only 2 bytes left + return len; + case 1: + if (buf[len-1] >= 0xc0) { return len-1; } // 2-, 3- and 4-byte characters with only 1 byte left + return len; + case 0: + return len; + } + } + if (buf[len-1] >= 0xc0) { return len-1; } // 2-, 3- and 4-byte characters with only 1 byte left + if (buf[len-2] >= 0xe0) { return len-2; } // 3- and 4-byte characters with only 1 byte left + if (buf[len-3] >= 0xf0) { return len-3; } // 4-byte characters with only 3 bytes left + return len; +} + +// +// PERF NOTES: +// We pipe 2 inputs through these stages: +// 1. Load JSON into registers. This takes a long time and is highly parallelizable, so we load +// 2 inputs' worth at once so that by the time step 2 is looking for them input, it's available. +// 2. Scan the JSON for critical data: strings, scalars and operators. This is the critical path. +// The output of step 1 depends entirely on this information. These functions don't quite use +// up enough CPU: the second half of the functions is highly serial, only using 1 execution core +// at a time. The second input's scans has some dependency on the first ones finishing it, but +// they can make a lot of progress before they need that information. +// 3. Step 1 does not use enough capacity, so we run some extra stuff while we're waiting for that +// to finish: utf-8 checks and generating the output from the last iteration. +// +// The reason we run 2 inputs at a time, is steps 2 and 3 are *still* not enough to soak up all +// available capacity with just one input. Running 2 at a time seems to give the CPU a good enough +// workout. +// +template<size_t STEP_SIZE> +error_code json_structural_indexer::index(const uint8_t *buf, size_t len, dom_parser_implementation &parser, stage1_mode partial) noexcept { + if (simdjson_unlikely(len > parser.capacity())) { return CAPACITY; } + // We guard the rest of the code so that we can assume that len > 0 throughout. + if (len == 0) { return EMPTY; } + if (is_streaming(partial)) { + len = trim_partial_utf8(buf, len); + // If you end up with an empty window after trimming + // the partial UTF-8 bytes, then chances are good that you + // have an UTF-8 formatting error. + if(len == 0) { return UTF8_ERROR; } + } + buf_block_reader<STEP_SIZE> reader(buf, len); + json_structural_indexer indexer(parser.structural_indexes.get()); + + // Read all but the last block + while (reader.has_full_block()) { + indexer.step<STEP_SIZE>(reader.full_block(), reader); + } + // Take care of the last block (will always be there unless file is empty which is + // not supposed to happen.) + uint8_t block[STEP_SIZE]; + if (simdjson_unlikely(reader.get_remainder(block) == 0)) { return UNEXPECTED_ERROR; } + indexer.step<STEP_SIZE>(block, reader); + return indexer.finish(parser, reader.block_index(), len, partial); +} + +template<> +simdjson_inline void json_structural_indexer::step<128>(const uint8_t *block, buf_block_reader<128> &reader) noexcept { + simd::simd8x64<uint8_t> in_1(block); + simd::simd8x64<uint8_t> in_2(block+64); + json_block block_1 = scanner.next(in_1); + json_block block_2 = scanner.next(in_2); + this->next(in_1, block_1, reader.block_index()); + this->next(in_2, block_2, reader.block_index()+64); + reader.advance(); +} + +template<> +simdjson_inline void json_structural_indexer::step<64>(const uint8_t *block, buf_block_reader<64> &reader) noexcept { + simd::simd8x64<uint8_t> in_1(block); + json_block block_1 = scanner.next(in_1); + this->next(in_1, block_1, reader.block_index()); + reader.advance(); +} + +simdjson_inline void json_structural_indexer::next(const simd::simd8x64<uint8_t>& in, const json_block& block, size_t idx) { + uint64_t unescaped = in.lteq(0x1F); +#if SIMDJSON_UTF8VALIDATION + checker.check_next_input(in); +#endif + indexer.write(uint32_t(idx-64), prev_structurals); // Output *last* iteration's structurals to the parser + prev_structurals = block.structural_start(); + unescaped_chars_error |= block.non_quote_inside_string(unescaped); +} + +simdjson_inline error_code json_structural_indexer::finish(dom_parser_implementation &parser, size_t idx, size_t len, stage1_mode partial) { + // Write out the final iteration's structurals + indexer.write(uint32_t(idx-64), prev_structurals); + error_code error = scanner.finish(); + // We deliberately break down the next expression so that it is + // human readable. + const bool should_we_exit = is_streaming(partial) ? + ((error != SUCCESS) && (error != UNCLOSED_STRING)) // when partial we tolerate UNCLOSED_STRING + : (error != SUCCESS); // if partial is false, we must have SUCCESS + const bool have_unclosed_string = (error == UNCLOSED_STRING); + if (simdjson_unlikely(should_we_exit)) { return error; } + + if (unescaped_chars_error) { + return UNESCAPED_CHARS; + } + parser.n_structural_indexes = uint32_t(indexer.tail - parser.structural_indexes.get()); + /*** + * The On-Demand API requires special padding. + * + * This is related to https://github.com/simdjson/simdjson/issues/906 + * Basically, we want to make sure that if the parsing continues beyond the last (valid) + * structural character, it quickly stops. + * Only three structural characters can be repeated without triggering an error in JSON: [,] and }. + * We repeat the padding character (at 'len'). We don't know what it is, but if the parsing + * continues, then it must be [,] or }. + * Suppose it is ] or }. We backtrack to the first character, what could it be that would + * not trigger an error? It could be ] or } but no, because you can't start a document that way. + * It can't be a comma, a colon or any simple value. So the only way we could continue is + * if the repeated character is [. But if so, the document must start with [. But if the document + * starts with [, it should end with ]. If we enforce that rule, then we would get + * ][[ which is invalid. + * + * This is illustrated with the test array_iterate_unclosed_error() on the following input: + * R"({ "a": [,,)" + **/ + parser.structural_indexes[parser.n_structural_indexes] = uint32_t(len); // used later in partial == stage1_mode::streaming_final + parser.structural_indexes[parser.n_structural_indexes + 1] = uint32_t(len); + parser.structural_indexes[parser.n_structural_indexes + 2] = 0; + parser.next_structural_index = 0; + // a valid JSON file cannot have zero structural indexes - we should have found something + if (simdjson_unlikely(parser.n_structural_indexes == 0u)) { + return EMPTY; + } + if (simdjson_unlikely(parser.structural_indexes[parser.n_structural_indexes - 1] > len)) { + return UNEXPECTED_ERROR; + } + if (partial == stage1_mode::streaming_partial) { + // If we have an unclosed string, then the last structural + // will be the quote and we want to make sure to omit it. + if(have_unclosed_string) { + parser.n_structural_indexes--; + // a valid JSON file cannot have zero structural indexes - we should have found something + if (simdjson_unlikely(parser.n_structural_indexes == 0u)) { return CAPACITY; } + } + // We truncate the input to the end of the last complete document (or zero). + auto new_structural_indexes = find_next_document_index(parser); + if (new_structural_indexes == 0 && parser.n_structural_indexes > 0) { + if(parser.structural_indexes[0] == 0) { + // If the buffer is partial and we started at index 0 but the document is + // incomplete, it's too big to parse. + return CAPACITY; + } else { + // It is possible that the document could be parsed, we just had a lot + // of white space. + parser.n_structural_indexes = 0; + return EMPTY; + } + } + + parser.n_structural_indexes = new_structural_indexes; + } else if (partial == stage1_mode::streaming_final) { + if(have_unclosed_string) { parser.n_structural_indexes--; } + // We truncate the input to the end of the last complete document (or zero). + // Because partial == stage1_mode::streaming_final, it means that we may + // silently ignore trailing garbage. Though it sounds bad, we do it + // deliberately because many people who have streams of JSON documents + // will truncate them for processing. E.g., imagine that you are uncompressing + // the data from a size file or receiving it in chunks from the network. You + // may not know where exactly the last document will be. Meanwhile the + // document_stream instances allow people to know the JSON documents they are + // parsing (see the iterator.source() method). + parser.n_structural_indexes = find_next_document_index(parser); + // We store the initial n_structural_indexes so that the client can see + // whether we used truncation. If initial_n_structural_indexes == parser.n_structural_indexes, + // then this will query parser.structural_indexes[parser.n_structural_indexes] which is len, + // otherwise, it will copy some prior index. + parser.structural_indexes[parser.n_structural_indexes + 1] = parser.structural_indexes[parser.n_structural_indexes]; + // This next line is critical, do not change it unless you understand what you are + // doing. + parser.structural_indexes[parser.n_structural_indexes] = uint32_t(len); + if (simdjson_unlikely(parser.n_structural_indexes == 0u)) { + // We tolerate an unclosed string at the very end of the stream. Indeed, users + // often load their data in bulk without being careful and they want us to ignore + // the trailing garbage. + return EMPTY; + } + } + checker.check_eof(); + return checker.errors(); +} + +} // namespace stage1 +} // unnamed namespace +} // namespace lsx +} // namespace simdjson + +// Clear CUSTOM_BIT_INDEXER so other implementations can set it if they need to. +#undef SIMDJSON_GENERIC_JSON_STRUCTURAL_INDEXER_CUSTOM_BIT_INDEXER + +#endif // SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRUCTURAL_INDEXER_H +/* end file generic/stage1/json_structural_indexer.h for lsx */ +/* including generic/stage1/utf8_validator.h for lsx: #include <generic/stage1/utf8_validator.h> */ +/* begin file generic/stage1/utf8_validator.h for lsx */ +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_UTF8_VALIDATOR_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_UTF8_VALIDATOR_H */ +/* amalgamation skipped (editor-only): #include <generic/stage1/base.h> */ +/* amalgamation skipped (editor-only): #include <generic/stage1/buf_block_reader.h> */ +/* amalgamation skipped (editor-only): #include <generic/stage1/utf8_lookup4_algorithm.h> */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace lsx { +namespace { +namespace stage1 { + +/** + * Validates that the string is actual UTF-8. + */ +template<class checker> +bool generic_validate_utf8(const uint8_t * input, size_t length) { + checker c{}; + buf_block_reader<64> reader(input, length); + while (reader.has_full_block()) { + simd::simd8x64<uint8_t> in(reader.full_block()); + c.check_next_input(in); + reader.advance(); + } + uint8_t block[64]{}; + reader.get_remainder(block); + simd::simd8x64<uint8_t> in(block); + c.check_next_input(in); + reader.advance(); + c.check_eof(); + return c.errors() == error_code::SUCCESS; +} + +bool generic_validate_utf8(const char * input, size_t length) { + return generic_validate_utf8<utf8_checker>(reinterpret_cast<const uint8_t *>(input),length); +} + +} // namespace stage1 +} // unnamed namespace +} // namespace lsx +} // namespace simdjson + +#endif // SIMDJSON_SRC_GENERIC_STAGE1_UTF8_VALIDATOR_H +/* end file generic/stage1/utf8_validator.h for lsx */ +/* end file generic/stage1/amalgamated.h for lsx */ +/* including generic/stage2/amalgamated.h for lsx: #include <generic/stage2/amalgamated.h> */ +/* begin file generic/stage2/amalgamated.h for lsx */ +// Stuff other things depend on +/* including generic/stage2/base.h for lsx: #include <generic/stage2/base.h> */ +/* begin file generic/stage2/base.h for lsx */ +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_BASE_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE2_BASE_H */ +/* amalgamation skipped (editor-only): #include <generic/base.h> */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace lsx { +namespace { +namespace stage2 { + +class json_iterator; +class structural_iterator; +struct tape_builder; +struct tape_writer; + +} // namespace stage2 +} // unnamed namespace +} // namespace lsx +} // namespace simdjson + +#endif // SIMDJSON_SRC_GENERIC_STAGE2_BASE_H +/* end file generic/stage2/base.h for lsx */ +/* including generic/stage2/tape_writer.h for lsx: #include <generic/stage2/tape_writer.h> */ +/* begin file generic/stage2/tape_writer.h for lsx */ +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_TAPE_WRITER_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE2_TAPE_WRITER_H */ +/* amalgamation skipped (editor-only): #include <generic/stage2/base.h> */ +/* amalgamation skipped (editor-only): #include <simdjson/internal/tape_type.h> */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#include <cstring> + +namespace simdjson { +namespace lsx { +namespace { +namespace stage2 { + +struct tape_writer { + /** The next place to write to tape */ + uint64_t *next_tape_loc; + + /** Write a signed 64-bit value to tape. */ + simdjson_inline void append_s64(int64_t value) noexcept; + + /** Write an unsigned 64-bit value to tape. */ + simdjson_inline void append_u64(uint64_t value) noexcept; + + /** Write a double value to tape. */ + simdjson_inline void append_double(double value) noexcept; + + /** Write a big integer (as string) to tape. src points to first digit, len is byte count. */ + simdjson_inline void append_bigint(const uint8_t *src, size_t len, uint8_t *&string_buf) noexcept; + + /** + * Append a tape entry (an 8-bit type,and 56 bits worth of value). + */ + simdjson_inline void append(uint64_t val, internal::tape_type t) noexcept; + + /** + * Skip the current tape entry without writing. + * + * Used to skip the start of the container, since we'll come back later to fill it in when the + * container ends. + */ + simdjson_inline void skip() noexcept; + + /** + * Skip the number of tape entries necessary to write a large u64 or i64. + */ + simdjson_inline void skip_large_integer() noexcept; + + /** + * Skip the number of tape entries necessary to write a double. + */ + simdjson_inline void skip_double() noexcept; + + /** + * Write a value to a known location on tape. + * + * Used to go back and write out the start of a container after the container ends. + */ + simdjson_inline static void write(uint64_t &tape_loc, uint64_t val, internal::tape_type t) noexcept; + +private: + /** + * Append both the tape entry, and a supplementary value following it. Used for types that need + * all 64 bits, such as double and uint64_t. + */ + template<typename T> + simdjson_inline void append2(uint64_t val, T val2, internal::tape_type t) noexcept; +}; // struct tape_writer + +simdjson_inline void tape_writer::append_s64(int64_t value) noexcept { + append2(0, value, internal::tape_type::INT64); +} + +simdjson_inline void tape_writer::append_u64(uint64_t value) noexcept { + append(0, internal::tape_type::UINT64); + *next_tape_loc = value; + next_tape_loc++; +} + +/** Write a double value to tape. */ +simdjson_inline void tape_writer::append_double(double value) noexcept { + append2(0, value, internal::tape_type::DOUBLE); +} + +simdjson_inline void tape_writer::skip() noexcept { + next_tape_loc++; +} + +simdjson_inline void tape_writer::skip_large_integer() noexcept { + next_tape_loc += 2; +} + +simdjson_inline void tape_writer::skip_double() noexcept { + next_tape_loc += 2; +} + +simdjson_inline void tape_writer::append(uint64_t val, internal::tape_type t) noexcept { + *next_tape_loc = val | ((uint64_t(char(t))) << 56); + next_tape_loc++; +} + +template<typename T> +simdjson_inline void tape_writer::append2(uint64_t val, T val2, internal::tape_type t) noexcept { + append(val, t); + static_assert(sizeof(val2) == sizeof(*next_tape_loc), "Type is not 64 bits!"); + memcpy(next_tape_loc, &val2, sizeof(val2)); + next_tape_loc++; +} + +simdjson_inline void tape_writer::write(uint64_t &tape_loc, uint64_t val, internal::tape_type t) noexcept { + tape_loc = val | ((uint64_t(char(t))) << 56); +} + +simdjson_inline void tape_writer::append_bigint(const uint8_t *src, size_t len, uint8_t *&string_buf) noexcept { + // Write to string buffer: [4-byte LE length][digits][null] + uint32_t str_len = uint32_t(len); + memcpy(string_buf, &str_len, sizeof(uint32_t)); + memcpy(string_buf + sizeof(uint32_t), src, len); + string_buf[sizeof(uint32_t) + len] = 0; + // Tape entry: offset into string buffer + // The caller must set the offset relative to doc.string_buf base + append(0, internal::tape_type::BIGINT); // placeholder offset, caller patches + string_buf += sizeof(uint32_t) + len + 1; +} + +} // namespace stage2 +} // unnamed namespace +} // namespace lsx +} // namespace simdjson + +#endif // SIMDJSON_SRC_GENERIC_STAGE2_TAPE_WRITER_H +/* end file generic/stage2/tape_writer.h for lsx */ +/* including generic/stage2/logger.h for lsx: #include <generic/stage2/logger.h> */ +/* begin file generic/stage2/logger.h for lsx */ +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_LOGGER_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE2_LOGGER_H */ +/* amalgamation skipped (editor-only): #include <generic/stage2/base.h> */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#include <cstring> + + +// This is for an internal-only stage 2 specific logger. +// Set LOG_ENABLED = true to log what stage 2 is doing! +namespace simdjson { +namespace lsx { +namespace { +namespace logger { + + static constexpr const char * DASHES = "----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------"; + +#if SIMDJSON_VERBOSE_LOGGING + static constexpr const bool LOG_ENABLED = true; +#else + static constexpr const bool LOG_ENABLED = false; +#endif + static constexpr const int LOG_EVENT_LEN = 20; + static constexpr const int LOG_BUFFER_LEN = 30; + static constexpr const int LOG_SMALL_BUFFER_LEN = 10; + static constexpr const int LOG_INDEX_LEN = 5; + + static int log_depth; // Not threadsafe. Log only. + + // Helper to turn unprintable or newline characters into spaces + static simdjson_inline char printable_char(char c) { + if (c >= 0x20) { + return c; + } else { + return ' '; + } + } + + // Print the header and set up log_start + static simdjson_inline void log_start() { + if (LOG_ENABLED) { + log_depth = 0; + printf("\n"); + printf("| %-*s | %-*s | %-*s | %-*s | Detail |\n", LOG_EVENT_LEN, "Event", LOG_BUFFER_LEN, "Buffer", LOG_SMALL_BUFFER_LEN, "Next", 5, "Next#"); + printf("|%.*s|%.*s|%.*s|%.*s|--------|\n", LOG_EVENT_LEN+2, DASHES, LOG_BUFFER_LEN+2, DASHES, LOG_SMALL_BUFFER_LEN+2, DASHES, 5+2, DASHES); + } + } + + simdjson_unused static simdjson_inline void log_string(const char *message) { + if (LOG_ENABLED) { + printf("%s\n", message); + } + } + + // Logs a single line from the stage 2 DOM parser + template<typename S> + static simdjson_inline void log_line(S &structurals, const char *title_prefix, const char *title, const char *detail) { + if (LOG_ENABLED) { + printf("| %*s%s%-*s ", log_depth*2, "", title_prefix, LOG_EVENT_LEN - log_depth*2 - int(strlen(title_prefix)), title); + auto current_index = structurals.at_beginning() ? nullptr : structurals.next_structural-1; + auto next_index = structurals.next_structural; + auto current = current_index ? &structurals.buf[*current_index] : reinterpret_cast<const uint8_t*>(" "); + auto next = &structurals.buf[*next_index]; + { + // Print the next N characters in the buffer. + printf("| "); + // Otherwise, print the characters starting from the buffer position. + // Print spaces for unprintable or newline characters. + for (int i=0;i<LOG_BUFFER_LEN;i++) { + printf("%c", printable_char(current[i])); + } + printf(" "); + // Print the next N characters in the buffer. + printf("| "); + // Otherwise, print the characters starting from the buffer position. + // Print spaces for unprintable or newline characters. + for (int i=0;i<LOG_SMALL_BUFFER_LEN;i++) { + printf("%c", printable_char(next[i])); + } + printf(" "); + } + if (current_index) { + printf("| %*u ", LOG_INDEX_LEN, *current_index); + } else { + printf("| %-*s ", LOG_INDEX_LEN, ""); + } + // printf("| %*u ", LOG_INDEX_LEN, structurals.next_tape_index()); + printf("| %-s ", detail); + printf("|\n"); + } + } + +} // namespace logger +} // unnamed namespace +} // namespace lsx +} // namespace simdjson + +#endif // SIMDJSON_SRC_GENERIC_STAGE2_LOGGER_H +/* end file generic/stage2/logger.h for lsx */ + +// All other declarations +/* including generic/stage2/json_iterator.h for lsx: #include <generic/stage2/json_iterator.h> */ +/* begin file generic/stage2/json_iterator.h for lsx */ +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_JSON_ITERATOR_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE2_JSON_ITERATOR_H */ +/* amalgamation skipped (editor-only): #include <generic/stage2/base.h> */ +/* amalgamation skipped (editor-only): #include <generic/stage2/logger.h> */ +/* amalgamation skipped (editor-only): #include <simdjson/generic/dom_parser_implementation.h> */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace lsx { +namespace { +namespace stage2 { + +class json_iterator { +public: + const uint8_t* const buf; + uint32_t *next_structural; + dom_parser_implementation &dom_parser; + uint32_t depth{0}; + + /** + * Walk the JSON document. + * + * The visitor receives callbacks when values are encountered. All callbacks pass the iterator as + * the first parameter; some callbacks have other parameters as well: + * + * - visit_document_start() - at the beginning. + * - visit_document_end() - at the end (if things were successful). + * + * - visit_array_start() - at the start `[` of a non-empty array. + * - visit_array_end() - at the end `]` of a non-empty array. + * - visit_empty_array() - when an empty array is encountered. + * + * - visit_object_end() - at the start `]` of a non-empty object. + * - visit_object_start() - at the end `]` of a non-empty object. + * - visit_empty_object() - when an empty object is encountered. + * - visit_key(const uint8_t *key) - when a key in an object field is encountered. key is + * guaranteed to point at the first quote of the string (`"key"`). + * - visit_primitive(const uint8_t *value) - when a value is a string, number, boolean or null. + * - visit_root_primitive(iter, uint8_t *value) - when the top-level value is a string, number, boolean or null. + * + * - increment_count(iter) - each time a value is found in an array or object. + */ + template<bool STREAMING, typename V> + simdjson_warn_unused simdjson_inline error_code walk_document(V &visitor) noexcept; + + /** + * Create an iterator capable of walking a JSON document. + * + * The document must have already passed through stage 1. + */ + simdjson_inline json_iterator(dom_parser_implementation &_dom_parser, size_t start_structural_index); + + /** + * Look at the next token. + * + * Tokens can be strings, numbers, booleans, null, or operators (`[{]},:`)). + * + * They may include invalid JSON as well (such as `1.2.3` or `ture`). + */ + simdjson_inline const uint8_t *peek() const noexcept; + /** + * Advance to the next token. + * + * Tokens can be strings, numbers, booleans, null, or operators (`[{]},:`)). + * + * They may include invalid JSON as well (such as `1.2.3` or `ture`). + */ + simdjson_inline const uint8_t *advance() noexcept; + /** + * Get the remaining length of the document, from the start of the current token. + */ + simdjson_inline size_t remaining_len() const noexcept; + /** + * Check if we are at the end of the document. + * + * If this is true, there are no more tokens. + */ + simdjson_inline bool at_eof() const noexcept; + /** + * Check if we are at the beginning of the document. + */ + simdjson_inline bool at_beginning() const noexcept; + simdjson_inline uint8_t last_structural() const noexcept; + + /** + * Log that a value has been found. + * + * Set LOG_ENABLED=true in logger.h to see logging. + */ + simdjson_inline void log_value(const char *type) const noexcept; + /** + * Log the start of a multipart value. + * + * Set LOG_ENABLED=true in logger.h to see logging. + */ + simdjson_inline void log_start_value(const char *type) const noexcept; + /** + * Log the end of a multipart value. + * + * Set LOG_ENABLED=true in logger.h to see logging. + */ + simdjson_inline void log_end_value(const char *type) const noexcept; + /** + * Log an error. + * + * Set LOG_ENABLED=true in logger.h to see logging. + */ + simdjson_inline void log_error(const char *error) const noexcept; + + template<typename V> + simdjson_warn_unused simdjson_inline error_code visit_root_primitive(V &visitor, const uint8_t *value) noexcept; + template<typename V> + simdjson_warn_unused simdjson_inline error_code visit_primitive(V &visitor, const uint8_t *value) noexcept; +}; + +template<bool STREAMING, typename V> +simdjson_warn_unused simdjson_inline error_code json_iterator::walk_document(V &visitor) noexcept { + logger::log_start(); + + // + // Start the document + // + if (at_eof()) { return EMPTY; } + log_start_value("document"); + SIMDJSON_TRY( visitor.visit_document_start(*this) ); + + // + // Read first value + // + { + auto value = advance(); + + // Make sure the outer object or array is closed before continuing; otherwise, there are ways we + // could get into memory corruption. See https://github.com/simdjson/simdjson/issues/906 + if (!STREAMING) { + switch (*value) { + case '{': if (last_structural() != '}') { log_value("starting brace unmatched"); return TAPE_ERROR; }; break; + case '[': if (last_structural() != ']') { log_value("starting bracket unmatched"); return TAPE_ERROR; }; break; + } + } + + switch (*value) { + case '{': if (*peek() == '}') { advance(); log_value("empty object"); SIMDJSON_TRY( visitor.visit_empty_object(*this) ); break; } goto object_begin; + case '[': if (*peek() == ']') { advance(); log_value("empty array"); SIMDJSON_TRY( visitor.visit_empty_array(*this) ); break; } goto array_begin; + default: SIMDJSON_TRY( visitor.visit_root_primitive(*this, value) ); break; + } + } + goto document_end; + +// +// Object parser states +// +object_begin: + log_start_value("object"); + depth++; + if (depth >= dom_parser.max_depth()) { log_error("Exceeded max depth!"); return DEPTH_ERROR; } + dom_parser.is_array[depth] = false; + SIMDJSON_TRY( visitor.visit_object_start(*this) ); + + { + auto key = advance(); + if (*key != '"') { log_error("Object does not start with a key"); return TAPE_ERROR; } + SIMDJSON_TRY( visitor.increment_count(*this) ); + SIMDJSON_TRY( visitor.visit_key(*this, key) ); + } + +object_field: + if (simdjson_unlikely( *advance() != ':' )) { log_error("Missing colon after key in object"); return TAPE_ERROR; } + { + auto value = advance(); + switch (*value) { + case '{': if (*peek() == '}') { advance(); log_value("empty object"); SIMDJSON_TRY( visitor.visit_empty_object(*this) ); break; } goto object_begin; + case '[': if (*peek() == ']') { advance(); log_value("empty array"); SIMDJSON_TRY( visitor.visit_empty_array(*this) ); break; } goto array_begin; + default: SIMDJSON_TRY( visitor.visit_primitive(*this, value) ); break; + } + } + +object_continue: + switch (*advance()) { + case ',': + SIMDJSON_TRY( visitor.increment_count(*this) ); + { + auto key = advance(); + if (simdjson_unlikely( *key != '"' )) { log_error("Key string missing at beginning of field in object"); return TAPE_ERROR; } + SIMDJSON_TRY( visitor.visit_key(*this, key) ); + } + goto object_field; + case '}': log_end_value("object"); SIMDJSON_TRY( visitor.visit_object_end(*this) ); goto scope_end; + default: log_error("No comma between object fields"); return TAPE_ERROR; + } + +scope_end: + depth--; + if (depth == 0) { goto document_end; } + if (dom_parser.is_array[depth]) { goto array_continue; } + goto object_continue; + +// +// Array parser states +// +array_begin: + log_start_value("array"); + depth++; + if (depth >= dom_parser.max_depth()) { log_error("Exceeded max depth!"); return DEPTH_ERROR; } + dom_parser.is_array[depth] = true; + SIMDJSON_TRY( visitor.visit_array_start(*this) ); + SIMDJSON_TRY( visitor.increment_count(*this) ); + +array_value: + { + auto value = advance(); + switch (*value) { + case '{': if (*peek() == '}') { advance(); log_value("empty object"); SIMDJSON_TRY( visitor.visit_empty_object(*this) ); break; } goto object_begin; + case '[': if (*peek() == ']') { advance(); log_value("empty array"); SIMDJSON_TRY( visitor.visit_empty_array(*this) ); break; } goto array_begin; + default: SIMDJSON_TRY( visitor.visit_primitive(*this, value) ); break; + } + } + +array_continue: + switch (*advance()) { + case ',': SIMDJSON_TRY( visitor.increment_count(*this) ); goto array_value; + case ']': log_end_value("array"); SIMDJSON_TRY( visitor.visit_array_end(*this) ); goto scope_end; + default: log_error("Missing comma between array values"); return TAPE_ERROR; + } + +document_end: + log_end_value("document"); + SIMDJSON_TRY( visitor.visit_document_end(*this) ); + + dom_parser.next_structural_index = uint32_t(next_structural - &dom_parser.structural_indexes[0]); + + // If we didn't make it to the end, it's an error + if ( !STREAMING && dom_parser.next_structural_index != dom_parser.n_structural_indexes ) { + log_error("More than one JSON value at the root of the document, or extra characters at the end of the JSON!"); + return TAPE_ERROR; + } + + return SUCCESS; + +} // walk_document() + +simdjson_inline json_iterator::json_iterator(dom_parser_implementation &_dom_parser, size_t start_structural_index) + : buf{_dom_parser.buf}, + next_structural{&_dom_parser.structural_indexes[start_structural_index]}, + dom_parser{_dom_parser} { +} + +simdjson_inline const uint8_t *json_iterator::peek() const noexcept { + return &buf[*(next_structural)]; +} +simdjson_inline const uint8_t *json_iterator::advance() noexcept { + return &buf[*(next_structural++)]; +} +simdjson_inline size_t json_iterator::remaining_len() const noexcept { + return dom_parser.len - *(next_structural-1); +} + +simdjson_inline bool json_iterator::at_eof() const noexcept { + return next_structural == &dom_parser.structural_indexes[dom_parser.n_structural_indexes]; +} +simdjson_inline bool json_iterator::at_beginning() const noexcept { + return next_structural == dom_parser.structural_indexes.get(); +} +simdjson_inline uint8_t json_iterator::last_structural() const noexcept { + return buf[dom_parser.structural_indexes[dom_parser.n_structural_indexes - 1]]; +} + +simdjson_inline void json_iterator::log_value(const char *type) const noexcept { + logger::log_line(*this, "", type, ""); +} + +simdjson_inline void json_iterator::log_start_value(const char *type) const noexcept { + logger::log_line(*this, "+", type, ""); + if (logger::LOG_ENABLED) { logger::log_depth++; } +} + +simdjson_inline void json_iterator::log_end_value(const char *type) const noexcept { + if (logger::LOG_ENABLED) { logger::log_depth--; } + logger::log_line(*this, "-", type, ""); +} + +simdjson_inline void json_iterator::log_error(const char *error) const noexcept { + logger::log_line(*this, "", "ERROR", error); +} + +template<typename V> +simdjson_warn_unused simdjson_inline error_code json_iterator::visit_root_primitive(V &visitor, const uint8_t *value) noexcept { + switch (*value) { + case '"': return visitor.visit_root_string(*this, value); + case 't': return visitor.visit_root_true_atom(*this, value); + case 'f': return visitor.visit_root_false_atom(*this, value); + case 'n': return visitor.visit_root_null_atom(*this, value); + case '-': + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + return visitor.visit_root_number(*this, value); + default: + log_error("Document starts with a non-value character"); + return TAPE_ERROR; + } +} +template<typename V> +simdjson_warn_unused simdjson_inline error_code json_iterator::visit_primitive(V &visitor, const uint8_t *value) noexcept { + // Use the fact that most scalars are going to be either strings or numbers. + if(*value == '"') { + return visitor.visit_string(*this, value); + } else if (((*value - '0') < 10) || (*value == '-')) { + return visitor.visit_number(*this, value); + } + // true, false, null are uncommon. + switch (*value) { + case 't': return visitor.visit_true_atom(*this, value); + case 'f': return visitor.visit_false_atom(*this, value); + case 'n': return visitor.visit_null_atom(*this, value); + default: + log_error("Non-value found when value was expected!"); + return TAPE_ERROR; + } +} + +} // namespace stage2 +} // unnamed namespace +} // namespace lsx +} // namespace simdjson + +#endif // SIMDJSON_SRC_GENERIC_STAGE2_JSON_ITERATOR_H +/* end file generic/stage2/json_iterator.h for lsx */ +/* including generic/stage2/stringparsing.h for lsx: #include <generic/stage2/stringparsing.h> */ +/* begin file generic/stage2/stringparsing.h for lsx */ +#include <cstdint> +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_STRINGPARSING_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE2_STRINGPARSING_H */ +/* amalgamation skipped (editor-only): #include <generic/stage2/base.h> */ +/* amalgamation skipped (editor-only): #include <simdjson/generic/jsoncharutils.h> */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +// This file contains the common code every implementation uses +// It is intended to be included multiple times and compiled multiple times + +namespace simdjson { +namespace lsx { +namespace { +/// @private +namespace stringparsing { + +// begin copypasta +// These chars yield themselves: " \ / +// b -> backspace, f -> formfeed, n -> newline, r -> cr, t -> horizontal tab +// u not handled in this table as it's complex +static const uint8_t escape_map[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x0. + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0x22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2f, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x4. + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x5c, 0, 0, 0, // 0x5. + 0, 0, 0x08, 0, 0, 0, 0x0c, 0, 0, 0, 0, 0, 0, 0, 0x0a, 0, // 0x6. + 0, 0, 0x0d, 0, 0x09, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x7. + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +}; + +// handle a unicode codepoint +// write appropriate values into dest +// src will advance 6 bytes or 12 bytes +// dest will advance a variable amount (return via pointer) +// return true if the unicode codepoint was valid +// We work in little-endian then swap at write time +simdjson_warn_unused +simdjson_inline bool handle_unicode_codepoint(const uint8_t **src_ptr, + uint8_t **dst_ptr, bool allow_replacement) { + // Use the default Unicode Character 'REPLACEMENT CHARACTER' (U+FFFD) + constexpr uint32_t substitution_code_point = 0xfffd; + // jsoncharutils::hex_to_u32_nocheck fills high 16 bits of the return value with 1s if the + // conversion is not valid; we defer the check for this to inside the + // multilingual plane check. + uint32_t code_point = jsoncharutils::hex_to_u32_nocheck(*src_ptr + 2); + *src_ptr += 6; + + // If we found a high surrogate, we must + // check for low surrogate for characters + // outside the Basic + // Multilingual Plane. + if (code_point >= 0xd800 && code_point < 0xdc00) { + const uint8_t *src_data = *src_ptr; + /* Compiler optimizations convert this to a single 16-bit load and compare on most platforms */ + if (((src_data[0] << 8) | src_data[1]) != ((static_cast<uint8_t> ('\\') << 8) | static_cast<uint8_t> ('u'))) { + if(!allow_replacement) { return false; } + code_point = substitution_code_point; + } else { + uint32_t code_point_2 = jsoncharutils::hex_to_u32_nocheck(src_data + 2); + + // We have already checked that the high surrogate is valid and + // (code_point - 0xd800) < 1024. + // + // Check that code_point_2 is in the range 0xdc00..0xdfff + // and that code_point_2 was parsed from valid hex. + uint32_t low_bit = code_point_2 - 0xdc00; + if (low_bit >> 10) { + if(!allow_replacement) { return false; } + code_point = substitution_code_point; + } else { + code_point = (((code_point - 0xd800) << 10) | low_bit) + 0x10000; + *src_ptr += 6; + } + + } + } else if (code_point >= 0xdc00 && code_point <= 0xdfff) { + // If we encounter a low surrogate (not preceded by a high surrogate) + // then we have an error. + if(!allow_replacement) { return false; } + code_point = substitution_code_point; + } + size_t offset = jsoncharutils::codepoint_to_utf8(code_point, *dst_ptr); + *dst_ptr += offset; + return offset > 0; +} + + +// handle a unicode codepoint using the wobbly convention +// https://simonsapin.github.io/wtf-8/ +// write appropriate values into dest +// src will advance 6 bytes or 12 bytes +// dest will advance a variable amount (return via pointer) +// return true if the unicode codepoint was valid +// We work in little-endian then swap at write time +simdjson_warn_unused +simdjson_inline bool handle_unicode_codepoint_wobbly(const uint8_t **src_ptr, + uint8_t **dst_ptr) { + // It is not ideal that this function is nearly identical to handle_unicode_codepoint. + // + // jsoncharutils::hex_to_u32_nocheck fills high 16 bits of the return value with 1s if the + // conversion is not valid; we defer the check for this to inside the + // multilingual plane check. + uint32_t code_point = jsoncharutils::hex_to_u32_nocheck(*src_ptr + 2); + *src_ptr += 6; + // If we found a high surrogate, we must + // check for low surrogate for characters + // outside the Basic + // Multilingual Plane. + if (code_point >= 0xd800 && code_point < 0xdc00) { + const uint8_t *src_data = *src_ptr; + /* Compiler optimizations convert this to a single 16-bit load and compare on most platforms */ + if (((src_data[0] << 8) | src_data[1]) == ((static_cast<uint8_t> ('\\') << 8) | static_cast<uint8_t> ('u'))) { + uint32_t code_point_2 = jsoncharutils::hex_to_u32_nocheck(src_data + 2); + uint32_t low_bit = code_point_2 - 0xdc00; + if ((low_bit >> 10) == 0) { + code_point = + (((code_point - 0xd800) << 10) | low_bit) + 0x10000; + *src_ptr += 6; + } + } + } + + size_t offset = jsoncharutils::codepoint_to_utf8(code_point, *dst_ptr); + *dst_ptr += offset; + return offset > 0; +} + + +/** + * Unescape a valid UTF-8 string from src to dst, stopping at a final unescaped quote. There + * must be an unescaped quote terminating the string. It returns the final output + * position as pointer. In case of error (e.g., the string has bad escaped codes), + * then null_ptr is returned. It is assumed that the output buffer is large + * enough. E.g., if src points at 'joe"', then dst needs to have four free bytes + + * SIMDJSON_PADDING bytes. + */ +simdjson_warn_unused simdjson_inline uint8_t *parse_string(const uint8_t *src, uint8_t *dst, bool allow_replacement) { + while (1) { + // Copy the next n bytes, and find the backslash and quote in them. + auto b = backslash_and_quote{}; + auto bs_quote = b.copy_and_find(src, dst); + // If the next thing is the end quote, copy and return + if (bs_quote.has_quote_first()) { + // we encountered quotes first. Move dst to point to quotes and exit + return dst + bs_quote.quote_index(); + } + if (bs_quote.has_backslash()) { + /* find out where the backspace is */ + auto bs_dist = bs_quote.backslash_index(); + uint8_t escape_char = src[bs_dist + 1]; + /* we encountered backslash first. Handle backslash */ + if (escape_char == 'u') { + /* move src/dst up to the start; they will be further adjusted + within the unicode codepoint handling code. */ + src += bs_dist; + dst += bs_dist; + if (!handle_unicode_codepoint(&src, &dst, allow_replacement)) { + return nullptr; + } + } else { + /* simple 1:1 conversion. Will eat bs_dist+2 characters in input and + * write bs_dist+1 characters to output + * note this may reach beyond the part of the buffer we've actually + * seen. I think this is ok */ + uint8_t escape_result = escape_map[escape_char]; + if (escape_result == 0u) { + return nullptr; /* bogus escape value is an error */ + } + dst[bs_dist] = escape_result; + src += bs_dist + 2; + dst += bs_dist + 1; + } + } else { + /* they are the same. Since they can't co-occur, it means we + * encountered neither. */ + src += backslash_and_quote::BYTES_PROCESSED; + dst += backslash_and_quote::BYTES_PROCESSED; + } + } +} + +simdjson_warn_unused simdjson_inline uint8_t *parse_wobbly_string(const uint8_t *src, uint8_t *dst) { + // It is not ideal that this function is nearly identical to parse_string. + while (1) { + // Copy the next n bytes, and find the backslash and quote in them. + auto b = backslash_and_quote{}; + auto bs_quote = b.copy_and_find(src, dst); + // If the next thing is the end quote, copy and return + if (bs_quote.has_quote_first()) { + // we encountered quotes first. Move dst to point to quotes and exit + return dst + bs_quote.quote_index(); + } + if (bs_quote.has_backslash()) { + /* find out where the backspace is */ + auto bs_dist = bs_quote.backslash_index(); + uint8_t escape_char = src[bs_dist + 1]; + /* we encountered backslash first. Handle backslash */ + if (escape_char == 'u') { + /* move src/dst up to the start; they will be further adjusted + within the unicode codepoint handling code. */ + src += bs_dist; + dst += bs_dist; + if (!handle_unicode_codepoint_wobbly(&src, &dst)) { + return nullptr; + } + } else { + /* simple 1:1 conversion. Will eat bs_dist+2 characters in input and + * write bs_dist+1 characters to output + * note this may reach beyond the part of the buffer we've actually + * seen. I think this is ok */ + uint8_t escape_result = escape_map[escape_char]; + if (escape_result == 0u) { + return nullptr; /* bogus escape value is an error */ + } + dst[bs_dist] = escape_result; + src += bs_dist + 2; + dst += bs_dist + 1; + } + } else { + /* they are the same. Since they can't co-occur, it means we + * encountered neither. */ + src += backslash_and_quote::BYTES_PROCESSED; + dst += backslash_and_quote::BYTES_PROCESSED; + } + } +} + +} // namespace stringparsing + +} // unnamed namespace +} // namespace lsx +} // namespace simdjson + +#endif // SIMDJSON_SRC_GENERIC_STAGE2_STRINGPARSING_H +/* end file generic/stage2/stringparsing.h for lsx */ +/* including generic/stage2/structural_iterator.h for lsx: #include <generic/stage2/structural_iterator.h> */ +/* begin file generic/stage2/structural_iterator.h for lsx */ +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_STRUCTURAL_ITERATOR_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE2_STRUCTURAL_ITERATOR_H */ +/* amalgamation skipped (editor-only): #include <generic/stage2/base.h> */ +/* amalgamation skipped (editor-only): #include <simdjson/generic/dom_parser_implementation.h> */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace lsx { +namespace { +namespace stage2 { + +class structural_iterator { +public: + const uint8_t* const buf; + uint32_t *next_structural; + dom_parser_implementation &dom_parser; + + // Start a structural + simdjson_inline structural_iterator(dom_parser_implementation &_dom_parser, size_t start_structural_index) + : buf{_dom_parser.buf}, + next_structural{&_dom_parser.structural_indexes[start_structural_index]}, + dom_parser{_dom_parser} { + } + // Get the buffer position of the current structural character + simdjson_inline const uint8_t* current() { + return &buf[*(next_structural-1)]; + } + // Get the current structural character + simdjson_inline char current_char() { + return buf[*(next_structural-1)]; + } + // Get the next structural character without advancing + simdjson_inline char peek_next_char() { + return buf[*next_structural]; + } + simdjson_inline const uint8_t* peek() { + return &buf[*next_structural]; + } + simdjson_inline const uint8_t* advance() { + return &buf[*(next_structural++)]; + } + simdjson_inline char advance_char() { + return buf[*(next_structural++)]; + } + simdjson_inline size_t remaining_len() { + return dom_parser.len - *(next_structural-1); + } + + simdjson_inline bool at_end() { + return next_structural == &dom_parser.structural_indexes[dom_parser.n_structural_indexes]; + } + simdjson_inline bool at_beginning() { + return next_structural == dom_parser.structural_indexes.get(); + } +}; + +} // namespace stage2 +} // unnamed namespace +} // namespace lsx +} // namespace simdjson + +#endif // SIMDJSON_SRC_GENERIC_STAGE2_STRUCTURAL_ITERATOR_H +/* end file generic/stage2/structural_iterator.h for lsx */ +/* including generic/stage2/tape_builder.h for lsx: #include <generic/stage2/tape_builder.h> */ +/* begin file generic/stage2/tape_builder.h for lsx */ +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_TAPE_BUILDER_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE2_TAPE_BUILDER_H */ +/* amalgamation skipped (editor-only): #include <generic/stage2/base.h> */ +/* amalgamation skipped (editor-only): #include <generic/stage2/json_iterator.h> */ +/* amalgamation skipped (editor-only): #include <generic/stage2/stringparsing.h> */ +/* amalgamation skipped (editor-only): #include <generic/stage2/tape_writer.h> */ +/* amalgamation skipped (editor-only): #include <simdjson/dom/document.h> */ +/* amalgamation skipped (editor-only): #include <simdjson/generic/atomparsing.h> */ +/* amalgamation skipped (editor-only): #include <simdjson/generic/dom_parser_implementation.h> */ +/* amalgamation skipped (editor-only): #include <simdjson/generic/numberparsing.h> */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + + +namespace simdjson { +namespace lsx { +namespace { +namespace stage2 { + +struct tape_builder { + template<bool STREAMING> + simdjson_warn_unused static simdjson_inline error_code parse_document( + dom_parser_implementation &dom_parser, + dom::document &doc) noexcept; + + /** Called when a non-empty document starts. */ + simdjson_warn_unused simdjson_inline error_code visit_document_start(json_iterator &iter) noexcept; + /** Called when a non-empty document ends without error. */ + simdjson_warn_unused simdjson_inline error_code visit_document_end(json_iterator &iter) noexcept; + + /** Called when a non-empty array starts. */ + simdjson_warn_unused simdjson_inline error_code visit_array_start(json_iterator &iter) noexcept; + /** Called when a non-empty array ends. */ + simdjson_warn_unused simdjson_inline error_code visit_array_end(json_iterator &iter) noexcept; + /** Called when an empty array is found. */ + simdjson_warn_unused simdjson_inline error_code visit_empty_array(json_iterator &iter) noexcept; + + /** Called when a non-empty object starts. */ + simdjson_warn_unused simdjson_inline error_code visit_object_start(json_iterator &iter) noexcept; + /** + * Called when a key in a field is encountered. + * + * primitive, visit_object_start, visit_empty_object, visit_array_start, or visit_empty_array + * will be called after this with the field value. + */ + simdjson_warn_unused simdjson_inline error_code visit_key(json_iterator &iter, const uint8_t *key) noexcept; + /** Called when a non-empty object ends. */ + simdjson_warn_unused simdjson_inline error_code visit_object_end(json_iterator &iter) noexcept; + /** Called when an empty object is found. */ + simdjson_warn_unused simdjson_inline error_code visit_empty_object(json_iterator &iter) noexcept; + + /** + * Called when a string, number, boolean or null is found. + */ + simdjson_warn_unused simdjson_inline error_code visit_primitive(json_iterator &iter, const uint8_t *value) noexcept; + /** + * Called when a string, number, boolean or null is found at the top level of a document (i.e. + * when there is no array or object and the entire document is a single string, number, boolean or + * null. + * + * This is separate from primitive() because simdjson's normal primitive parsing routines assume + * there is at least one more token after the value, which is only true in an array or object. + */ + simdjson_warn_unused simdjson_inline error_code visit_root_primitive(json_iterator &iter, const uint8_t *value) noexcept; + + simdjson_warn_unused simdjson_inline error_code visit_string(json_iterator &iter, const uint8_t *value, bool key = false) noexcept; + simdjson_warn_unused simdjson_inline error_code visit_number(json_iterator &iter, const uint8_t *value) noexcept; + simdjson_warn_unused simdjson_inline error_code visit_true_atom(json_iterator &iter, const uint8_t *value) noexcept; + simdjson_warn_unused simdjson_inline error_code visit_false_atom(json_iterator &iter, const uint8_t *value) noexcept; + simdjson_warn_unused simdjson_inline error_code visit_null_atom(json_iterator &iter, const uint8_t *value) noexcept; + + simdjson_warn_unused simdjson_inline error_code visit_root_string(json_iterator &iter, const uint8_t *value) noexcept; + simdjson_warn_unused simdjson_inline error_code visit_root_number(json_iterator &iter, const uint8_t *value) noexcept; + simdjson_warn_unused simdjson_inline error_code visit_root_true_atom(json_iterator &iter, const uint8_t *value) noexcept; + simdjson_warn_unused simdjson_inline error_code visit_root_false_atom(json_iterator &iter, const uint8_t *value) noexcept; + simdjson_warn_unused simdjson_inline error_code visit_root_null_atom(json_iterator &iter, const uint8_t *value) noexcept; + + /** Called each time a new field or element in an array or object is found. */ + simdjson_warn_unused simdjson_inline error_code increment_count(json_iterator &iter) noexcept; + + /** Next location to write to tape */ + tape_writer tape; +private: + /** Next write location in the string buf for stage 2 parsing */ + uint8_t *current_string_buf_loc; + + simdjson_inline tape_builder(dom::document &doc) noexcept; + + simdjson_inline uint32_t next_tape_index(json_iterator &iter) const noexcept; + simdjson_inline void start_container(json_iterator &iter) noexcept; + simdjson_warn_unused simdjson_inline error_code end_container(json_iterator &iter, internal::tape_type start, internal::tape_type end) noexcept; + simdjson_warn_unused simdjson_inline error_code empty_container(json_iterator &iter, internal::tape_type start, internal::tape_type end) noexcept; + simdjson_inline uint8_t *on_start_string(json_iterator &iter) noexcept; + simdjson_inline void on_end_string(uint8_t *dst) noexcept; +}; // struct tape_builder + +template<bool STREAMING> +simdjson_warn_unused simdjson_inline error_code tape_builder::parse_document( + dom_parser_implementation &dom_parser, + dom::document &doc) noexcept { + dom_parser.doc = &doc; + json_iterator iter(dom_parser, STREAMING ? dom_parser.next_structural_index : 0); + tape_builder builder(doc); + return iter.walk_document<STREAMING>(builder); +} + +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_primitive(json_iterator &iter, const uint8_t *value) noexcept { + return iter.visit_root_primitive(*this, value); +} +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_primitive(json_iterator &iter, const uint8_t *value) noexcept { + return iter.visit_primitive(*this, value); +} +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_empty_object(json_iterator &iter) noexcept { + return empty_container(iter, internal::tape_type::START_OBJECT, internal::tape_type::END_OBJECT); +} +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_empty_array(json_iterator &iter) noexcept { + return empty_container(iter, internal::tape_type::START_ARRAY, internal::tape_type::END_ARRAY); +} + +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_document_start(json_iterator &iter) noexcept { + start_container(iter); + return SUCCESS; +} +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_object_start(json_iterator &iter) noexcept { + start_container(iter); + return SUCCESS; +} +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_array_start(json_iterator &iter) noexcept { + start_container(iter); + return SUCCESS; +} + +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_object_end(json_iterator &iter) noexcept { + return end_container(iter, internal::tape_type::START_OBJECT, internal::tape_type::END_OBJECT); +} +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_array_end(json_iterator &iter) noexcept { + return end_container(iter, internal::tape_type::START_ARRAY, internal::tape_type::END_ARRAY); +} +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_document_end(json_iterator &iter) noexcept { + constexpr uint32_t start_tape_index = 0; + tape.append(start_tape_index, internal::tape_type::ROOT); + tape_writer::write(iter.dom_parser.doc->tape[start_tape_index], next_tape_index(iter), internal::tape_type::ROOT); + return SUCCESS; +} +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_key(json_iterator &iter, const uint8_t *key) noexcept { + return visit_string(iter, key, true); +} + +simdjson_warn_unused simdjson_inline error_code tape_builder::increment_count(json_iterator &iter) noexcept { + iter.dom_parser.open_containers[iter.depth].count++; // we have a key value pair in the object at parser.dom_parser.depth - 1 + return SUCCESS; +} + +simdjson_inline tape_builder::tape_builder(dom::document &doc) noexcept : tape{doc.tape.get()}, current_string_buf_loc{doc.string_buf.get()} {} + +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_string(json_iterator &iter, const uint8_t *value, bool key) noexcept { + iter.log_value(key ? "key" : "string"); + uint8_t *dst = on_start_string(iter); + dst = stringparsing::parse_string(value+1, dst, false); // We do not allow replacement when the escape characters are invalid. + if (dst == nullptr) { + iter.log_error("Invalid escape in string"); + return STRING_ERROR; + } + on_end_string(dst); + return SUCCESS; +} + +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_string(json_iterator &iter, const uint8_t *value) noexcept { + return visit_string(iter, value); +} + +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_number(json_iterator &iter, const uint8_t *value) noexcept { + iter.log_value("number"); + error_code err = numberparsing::parse_number(value, tape); + if (simdjson_unlikely(err == BIGINT_ERROR && + iter.dom_parser._number_as_string)) { + // Write big integer to string buffer using the same format as strings. + // Scan digits the same way parse_number does (skip optional '-', then digits). + const uint8_t *p = value; + if (*p == '-') p++; + while (numberparsing::is_digit(*p)) p++; + size_t len = size_t(p - value); + tape.append(current_string_buf_loc - iter.dom_parser.doc->string_buf.get(), internal::tape_type::BIGINT); + uint8_t *dst = current_string_buf_loc + sizeof(uint32_t); + memcpy(dst, value, len); + dst += len; + on_end_string(dst); + return SUCCESS; + } + return err; +} + +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_number(json_iterator &iter, const uint8_t *value) noexcept { + // + // We need to make a copy to make sure that the string is space terminated. + // This is not about padding the input, which should already padded up + // to len + SIMDJSON_PADDING. However, we have no control at this stage + // on how the padding was done. What if the input string was padded with nulls? + // It is quite common for an input string to have an extra null character (C string). + // We do not want to allow 9\0 (where \0 is the null character) inside a JSON + // document, but the string "9\0" by itself is fine. So we make a copy and + // pad the input with spaces when we know that there is just one input element. + // This copy is relatively expensive, but it will almost never be called in + // practice unless you are in the strange scenario where you have many JSON + // documents made of single atoms. + // + std::unique_ptr<uint8_t[]>copy(new (std::nothrow) uint8_t[iter.remaining_len() + SIMDJSON_PADDING]); + if (copy.get() == nullptr) { return MEMALLOC; } + std::memcpy(copy.get(), value, iter.remaining_len()); + std::memset(copy.get() + iter.remaining_len(), ' ', SIMDJSON_PADDING); + error_code error = visit_number(iter, copy.get()); + return error; +} + +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_true_atom(json_iterator &iter, const uint8_t *value) noexcept { + iter.log_value("true"); + if (!atomparsing::is_valid_true_atom(value)) { return T_ATOM_ERROR; } + tape.append(0, internal::tape_type::TRUE_VALUE); + return SUCCESS; +} + +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_true_atom(json_iterator &iter, const uint8_t *value) noexcept { + iter.log_value("true"); + if (!atomparsing::is_valid_true_atom(value, iter.remaining_len())) { return T_ATOM_ERROR; } + tape.append(0, internal::tape_type::TRUE_VALUE); + return SUCCESS; +} + +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_false_atom(json_iterator &iter, const uint8_t *value) noexcept { + iter.log_value("false"); + if (!atomparsing::is_valid_false_atom(value)) { return F_ATOM_ERROR; } + tape.append(0, internal::tape_type::FALSE_VALUE); + return SUCCESS; +} + +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_false_atom(json_iterator &iter, const uint8_t *value) noexcept { + iter.log_value("false"); + if (!atomparsing::is_valid_false_atom(value, iter.remaining_len())) { return F_ATOM_ERROR; } + tape.append(0, internal::tape_type::FALSE_VALUE); + return SUCCESS; +} + +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_null_atom(json_iterator &iter, const uint8_t *value) noexcept { + iter.log_value("null"); + if (!atomparsing::is_valid_null_atom(value)) { return N_ATOM_ERROR; } + tape.append(0, internal::tape_type::NULL_VALUE); + return SUCCESS; +} + +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_null_atom(json_iterator &iter, const uint8_t *value) noexcept { + iter.log_value("null"); + if (!atomparsing::is_valid_null_atom(value, iter.remaining_len())) { return N_ATOM_ERROR; } + tape.append(0, internal::tape_type::NULL_VALUE); + return SUCCESS; +} + +// private: + +simdjson_inline uint32_t tape_builder::next_tape_index(json_iterator &iter) const noexcept { + return uint32_t(tape.next_tape_loc - iter.dom_parser.doc->tape.get()); +} + +simdjson_warn_unused simdjson_inline error_code tape_builder::empty_container(json_iterator &iter, internal::tape_type start, internal::tape_type end) noexcept { + auto start_index = next_tape_index(iter); + tape.append(start_index+2, start); + tape.append(start_index, end); + return SUCCESS; +} + +simdjson_inline void tape_builder::start_container(json_iterator &iter) noexcept { + iter.dom_parser.open_containers[iter.depth].tape_index = next_tape_index(iter); + iter.dom_parser.open_containers[iter.depth].count = 0; + tape.skip(); // We don't actually *write* the start element until the end. +} + +simdjson_warn_unused simdjson_inline error_code tape_builder::end_container(json_iterator &iter, internal::tape_type start, internal::tape_type end) noexcept { + // Write the ending tape element, pointing at the start location + const uint32_t start_tape_index = iter.dom_parser.open_containers[iter.depth].tape_index; + tape.append(start_tape_index, end); + // Write the start tape element, pointing at the end location (and including count) + // count can overflow if it exceeds 24 bits... so we saturate + // the convention being that a cnt of 0xffffff or more is undetermined in value (>= 0xffffff). + const uint32_t count = iter.dom_parser.open_containers[iter.depth].count; + const uint32_t cntsat = count > 0xFFFFFF ? 0xFFFFFF : count; + tape_writer::write(iter.dom_parser.doc->tape[start_tape_index], next_tape_index(iter) | (uint64_t(cntsat) << 32), start); + return SUCCESS; +} + +simdjson_inline uint8_t *tape_builder::on_start_string(json_iterator &iter) noexcept { + // we advance the point, accounting for the fact that we have a NULL termination + tape.append(current_string_buf_loc - iter.dom_parser.doc->string_buf.get(), internal::tape_type::STRING); + return current_string_buf_loc + sizeof(uint32_t); +} + +simdjson_inline void tape_builder::on_end_string(uint8_t *dst) noexcept { + uint32_t str_length = uint32_t(dst - (current_string_buf_loc + sizeof(uint32_t))); + // TODO check for overflow in case someone has a crazy string (>=4GB?) + // But only add the overflow check when the document itself exceeds 4GB + // Currently unneeded because we refuse to parse docs larger or equal to 4GB. + memcpy(current_string_buf_loc, &str_length, sizeof(uint32_t)); + // NULL termination is still handy if you expect all your strings to + // be NULL terminated? It comes at a small cost + *dst = 0; + current_string_buf_loc = dst + 1; +} + +} // namespace stage2 +} // unnamed namespace +} // namespace lsx +} // namespace simdjson + +#endif // SIMDJSON_SRC_GENERIC_STAGE2_TAPE_BUILDER_H +/* end file generic/stage2/tape_builder.h for lsx */ +/* end file generic/stage2/amalgamated.h for lsx */ + +// +// Stage 1 +// +namespace simdjson { +namespace lsx { + +simdjson_warn_unused error_code implementation::create_dom_parser_implementation( + size_t capacity, + size_t max_depth, + std::unique_ptr<internal::dom_parser_implementation>& dst +) const noexcept { + dst.reset( new (std::nothrow) dom_parser_implementation() ); + if (!dst) { return MEMALLOC; } + if (auto err = dst->set_capacity(capacity)) + return err; + if (auto err = dst->set_max_depth(max_depth)) + return err; + return SUCCESS; +} + +namespace { + +using namespace simd; + +simdjson_inline json_character_block json_character_block::classify(const simd::simd8x64<uint8_t>& in) { + // Inspired by haswell. + // LSX use low 5 bits as index. For the 6 operators (:,[]{}), the unique-5bits is [6:2]. + // The ASCII white-space and operators have these values: (char, hex, unique-5bits) + // (' ', 20, 00000) ('\t', 09, 01001) ('\n', 0A, 01010) ('\r', 0D, 01101) + // (',', 2C, 01011) (':', 3A, 01110) ('[', 5B, 10110) ('{', 7B, 11110) (']', 5D, 10111) ('}', 7D, 11111) + const simd8<uint8_t> ws_table = simd8<uint8_t>::repeat_16( + ' ', 0, 0, 0, 0, 0, 0, 0, 0, '\t', '\n', 0, 0, '\r', 0, 0 + ); + const simd8<uint8_t> op_table_lo = simd8<uint8_t>::repeat_16( + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ',', 0, 0, ':', 0 + ); + const simd8<uint8_t> op_table_hi = simd8<uint8_t>::repeat_16( + 0, 0, 0, 0, 0, 0, '[', ']', 0, 0, 0, 0, 0, 0, '{', '}' + ); + uint64_t ws = in.eq({ + in.chunks[0].lookup_16(ws_table), + in.chunks[1].lookup_16(ws_table), + in.chunks[2].lookup_16(ws_table), + in.chunks[3].lookup_16(ws_table) + }); + uint64_t op = in.eq({ + __lsx_vshuf_b(op_table_hi, op_table_lo, in.chunks[0].shr<2>()), + __lsx_vshuf_b(op_table_hi, op_table_lo, in.chunks[1].shr<2>()), + __lsx_vshuf_b(op_table_hi, op_table_lo, in.chunks[2].shr<2>()), + __lsx_vshuf_b(op_table_hi, op_table_lo, in.chunks[3].shr<2>()) + }); + + return { ws, op }; +} + +simdjson_inline bool is_ascii(const simd8x64<uint8_t>& input) { + return input.reduce_or().is_ascii(); +} + +simdjson_inline simd8<uint8_t> must_be_2_3_continuation(const simd8<uint8_t> prev2, const simd8<uint8_t> prev3) { + simd8<uint8_t> is_third_byte = prev2.saturating_sub(0xe0u-0x80); // Only 111_____ will be >= 0x80 + simd8<uint8_t> is_fourth_byte = prev3.saturating_sub(0xf0u-0x80); // Only 1111____ will be >= 0x80 + return is_third_byte | is_fourth_byte; +} + +} // unnamed namespace +} // namespace lsx +} // namespace simdjson + +// +// Stage 2 +// + +// +// Implementation-specific overrides +// +namespace simdjson { +namespace lsx { + +simdjson_warn_unused error_code implementation::minify(const uint8_t *buf, size_t len, uint8_t *dst, size_t &dst_len) const noexcept { + return lsx::stage1::json_minifier::minify<64>(buf, len, dst, dst_len); +} + +simdjson_warn_unused error_code dom_parser_implementation::stage1(const uint8_t *_buf, size_t _len, stage1_mode streaming) noexcept { + this->buf = _buf; + this->len = _len; + return lsx::stage1::json_structural_indexer::index<64>(buf, len, *this, streaming); +} + +simdjson_warn_unused bool implementation::validate_utf8(const char *buf, size_t len) const noexcept { + return lsx::stage1::generic_validate_utf8(buf,len); +} + +simdjson_warn_unused error_code dom_parser_implementation::stage2(dom::document &_doc) noexcept { + return stage2::tape_builder::parse_document<false>(*this, _doc); +} + +simdjson_warn_unused error_code dom_parser_implementation::stage2_next(dom::document &_doc) noexcept { + return stage2::tape_builder::parse_document<true>(*this, _doc); +} + +SIMDJSON_NO_SANITIZE_MEMORY +simdjson_warn_unused uint8_t *dom_parser_implementation::parse_string(const uint8_t *src, uint8_t *dst, bool allow_replacement) const noexcept { + return lsx::stringparsing::parse_string(src, dst, allow_replacement); +} + +simdjson_warn_unused uint8_t *dom_parser_implementation::parse_wobbly_string(const uint8_t *src, uint8_t *dst) const noexcept { + return lsx::stringparsing::parse_wobbly_string(src, dst); +} + +simdjson_warn_unused error_code dom_parser_implementation::parse(const uint8_t *_buf, size_t _len, dom::document &_doc) noexcept { + auto error = stage1(_buf, _len, stage1_mode::regular); + if (error) { return error; } + return stage2(_doc); +} + +} // namespace lsx +} // namespace simdjson + +/* including simdjson/lsx/end.h: #include <simdjson/lsx/end.h> */ +/* begin file simdjson/lsx/end.h */ +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#undef SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT +/* undefining SIMDJSON_IMPLEMENTATION from "lsx" */ +#undef SIMDJSON_IMPLEMENTATION +/* end file simdjson/lsx/end.h */ + +#endif // SIMDJSON_SRC_LSX_CPP +/* end file lsx.cpp */ +#endif +#if SIMDJSON_IMPLEMENTATION_RVV_VLS +/* including rvv-vls.cpp: #include <rvv-vls.cpp> */ +/* begin file rvv-vls.cpp */ +#ifndef SIMDJSON_SRC_RVV_VLS_CPP +#define SIMDJSON_SRC_RVV_VLS_CPP + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include <base.h> */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +/* including simdjson/rvv-vls.h: #include <simdjson/rvv-vls.h> */ +/* begin file simdjson/rvv-vls.h */ +#ifndef SIMDJSON_RVV_VLS_H +#define SIMDJSON_RVV_VLS_H + + +/* including simdjson/rvv-vls/begin.h: #include "simdjson/rvv-vls/begin.h" */ +/* begin file simdjson/rvv-vls/begin.h */ +/* defining SIMDJSON_IMPLEMENTATION to "rvv_vls" */ +#define SIMDJSON_IMPLEMENTATION rvv_vls +/* including simdjson/rvv-vls/base.h: #include "simdjson/rvv-vls/base.h" */ +/* begin file simdjson/rvv-vls/base.h */ +#ifndef SIMDJSON_RVV_VLS_BASE_H +#define SIMDJSON_RVV_VLS_BASE_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +/** + * RVV-VLS implementation. + */ +namespace rvv_vls { + +class implementation; + +} // namespace rvv_vls +} // namespace simdjson + +#endif // SIMDJSON_RVV_VLS_BASE_H +/* end file simdjson/rvv-vls/base.h */ +/* including simdjson/rvv-vls/intrinsics.h: #include "simdjson/rvv-vls/intrinsics.h" */ +/* begin file simdjson/rvv-vls/intrinsics.h */ +#ifndef SIMDJSON_RVV_VLS_INTRINSICS_H +#define SIMDJSON_RVV_VLS_INTRINSICS_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#include <riscv_vector.h> + +#define simdutf_vrgather_u8m1x2(tbl, idx) \ + __riscv_vcreate_v_u8m1_u8m2( \ + __riscv_vrgather_vv_u8m1(tbl, __riscv_vget_v_u8m2_u8m1(idx, 0), \ + __riscv_vsetvlmax_e8m1()), \ + __riscv_vrgather_vv_u8m1(tbl, __riscv_vget_v_u8m2_u8m1(idx, 1), \ + __riscv_vsetvlmax_e8m1())) + +#define simdutf_vrgather_u8m1x4(tbl, idx) \ + __riscv_vcreate_v_u8m1_u8m4( \ + __riscv_vrgather_vv_u8m1(tbl, __riscv_vget_v_u8m4_u8m1(idx, 0), \ + __riscv_vsetvlmax_e8m1()), \ + __riscv_vrgather_vv_u8m1(tbl, __riscv_vget_v_u8m4_u8m1(idx, 1), \ + __riscv_vsetvlmax_e8m1()), \ + __riscv_vrgather_vv_u8m1(tbl, __riscv_vget_v_u8m4_u8m1(idx, 2), \ + __riscv_vsetvlmax_e8m1()), \ + __riscv_vrgather_vv_u8m1(tbl, __riscv_vget_v_u8m4_u8m1(idx, 3), \ + __riscv_vsetvlmax_e8m1())) + +#if __riscv_zbc +#include <riscv_bitmanip.h> +#endif + +#endif // SIMDJSON_RVV_VLS_INTRINSICS_H +/* end file simdjson/rvv-vls/intrinsics.h */ +/* including simdjson/rvv-vls/bitmanipulation.h: #include "simdjson/rvv-vls/bitmanipulation.h" */ +/* begin file simdjson/rvv-vls/bitmanipulation.h */ +#ifndef SIMDJSON_RVV_VLS_BITMANIPULATION_H +#define SIMDJSON_RVV_VLS_BITMANIPULATION_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace rvv_vls { +namespace { + +// We sometimes call trailing_zero on inputs that are zero, +// but the algorithms do not end up using the returned value. +// Sadly, sanitizers are not smart enough to figure it out. +SIMDJSON_NO_SANITIZE_UNDEFINED +// This function can be used safely even if not all bytes have been +// initialized. +// See issue https://github.com/simdjson/simdjson/issues/1965 +SIMDJSON_NO_SANITIZE_MEMORY +simdjson_inline int trailing_zeroes(uint64_t input_num) { + return __builtin_ctzll(input_num); +} + +/* result might be undefined when input_num is zero */ +simdjson_inline uint64_t clear_lowest_bit(uint64_t input_num) { + return input_num & (input_num-1); +} + +/* result might be undefined when input_num is zero */ +simdjson_inline int leading_zeroes(uint64_t input_num) { + return __builtin_clzll(input_num); +} + +simdjson_inline long long int count_ones(uint64_t input_num) { + return __builtin_popcountll(input_num); +} + +simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2, + uint64_t *result) { + return __builtin_uaddll_overflow(value1, value2, + reinterpret_cast<unsigned long long *>(result)); +} + +} // unnamed namespace +} // namespace rvv_vls +} // namespace simdjson + +#endif // SIMDJSON_RVV_VLS_BITMANIPULATION_H +/* end file simdjson/rvv-vls/bitmanipulation.h */ +/* including simdjson/rvv-vls/bitmask.h: #include "simdjson/rvv-vls/bitmask.h" */ +/* begin file simdjson/rvv-vls/bitmask.h */ +#ifndef SIMDJSON_RVV_VLS_BITMASK_H +#define SIMDJSON_RVV_VLS_BITMASK_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/intrinsics.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace rvv_vls { +namespace { + +// +// Perform a "cumulative bitwise xor," flipping bits each time a 1 is encountered. +// +// For example, prefix_xor(00100100) == 00011100 +// +simdjson_inline uint64_t prefix_xor(uint64_t bitmask) { +#if __riscv_zbc + return __riscv_clmul_64(bitmask, ~(uint64_t)0); +#elif __riscv_zvbc + return __riscv_vmv_x(__riscv_vclmul(__riscv_vmv_s_x_u64m1(bitmask, 1), ~(uint64_t)0, 1)); +#else + bitmask ^= bitmask << 1; + bitmask ^= bitmask << 2; + bitmask ^= bitmask << 4; + bitmask ^= bitmask << 8; + bitmask ^= bitmask << 16; + bitmask ^= bitmask << 32; +#endif + return bitmask; +} + +} // unnamed namespace +} // namespace rvv_vls +} // namespace simdjson + +#endif // SIMDJSON_RVV_VLS_BITMASK_H + +/* end file simdjson/rvv-vls/bitmask.h */ +/* including simdjson/rvv-vls/simd.h: #include "simdjson/rvv-vls/simd.h" */ +/* begin file simdjson/rvv-vls/simd.h */ +#ifndef SIMDJSON_RVV_VLS_SIMD_H +#define SIMDJSON_RVV_VLS_SIMD_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace rvv_vls { +namespace { +namespace simd { + +#if __riscv_v_fixed_vlen >= 512 + static constexpr size_t VL8 = 512/8; + using vint8_t = vint8m1_t __attribute__((riscv_rvv_vector_bits(512))); + using vuint8_t = vuint8m1_t __attribute__((riscv_rvv_vector_bits(512))); + using vbool_t = vbool8_t __attribute__((riscv_rvv_vector_bits(512/8))); + using vbitmask_t = uint64_t; +#else + static constexpr size_t VL8 = __riscv_v_fixed_vlen/8; + using vint8_t = vint8m1_t __attribute__((riscv_rvv_vector_bits(__riscv_v_fixed_vlen))); + using vuint8_t = vuint8m1_t __attribute__((riscv_rvv_vector_bits(__riscv_v_fixed_vlen))); + using vbool_t = vbool8_t __attribute__((riscv_rvv_vector_bits(__riscv_v_fixed_vlen/8))); + #if __riscv_v_fixed_vlen == 128 + using vbitmask_t = uint16_t; + #elif __riscv_v_fixed_vlen == 256 + using vbitmask_t = uint32_t; + #endif +#endif + +#if __riscv_v_fixed_vlen == 128 + using vuint8x64_t = vuint8m4_t __attribute__((riscv_rvv_vector_bits(512))); + using vboolx64_t = vbool2_t __attribute__((riscv_rvv_vector_bits(512/8))); +#elif __riscv_v_fixed_vlen == 256 + using vuint8x64_t = vuint8m2_t __attribute__((riscv_rvv_vector_bits(512))); + using vboolx64_t = vbool4_t __attribute__((riscv_rvv_vector_bits(512/8))); +#else + using vuint8x64_t = vuint8m1_t __attribute__((riscv_rvv_vector_bits(512))); + using vboolx64_t = vbool8_t __attribute__((riscv_rvv_vector_bits(512/8))); +#endif + + template<typename T> + struct simd8; + + // SIMD byte mask type (returned by things like eq and gt) + template<> + struct simd8<bool> { + vbool_t value; + using bitmask_t = vbitmask_t; + static constexpr int SIZE = sizeof(value); + + simdjson_inline simd8(const vbool_t _value) : value(_value) {} + simdjson_inline simd8() : simd8(__riscv_vmclr_m_b8(VL8)) {} + simdjson_inline simd8(bool _value) : simd8(splat(_value)) {} + + simdjson_inline operator const vbool_t&() const { return value; } + simdjson_inline operator vbool_t&() { return value; } + + static simdjson_inline simd8<bool> splat(bool _value) { + return __riscv_vreinterpret_b8(__riscv_vmv_v_x_u64m1(((uint64_t)!_value)-1, 1)); + } + + simdjson_inline vbitmask_t to_bitmask() const { +#if __riscv_v_fixed_vlen == 128 + return __riscv_vmv_x(__riscv_vreinterpret_u16m1(value)); +#elif __riscv_v_fixed_vlen == 256 + return __riscv_vmv_x(__riscv_vreinterpret_u32m1(value)); +#else + return __riscv_vmv_x(__riscv_vreinterpret_u64m1(value)); +#endif + } + + // Bit operations + simdjson_inline simd8<bool> operator|(const simd8<bool> other) const { return __riscv_vmor(*this, other, VL8); } + simdjson_inline simd8<bool> operator&(const simd8<bool> other) const { return __riscv_vmand(*this, other, VL8); } + simdjson_inline simd8<bool> operator^(const simd8<bool> other) const { return __riscv_vmxor(*this, other, VL8); } + simdjson_inline simd8<bool> bit_andnot(const simd8<bool> other) const { return __riscv_vmandn(other, *this, VL8); } + simdjson_inline simd8<bool> operator~() const { return __riscv_vmnot(*this, VL8); } + simdjson_inline simd8<bool>& operator|=(const simd8<bool> other) { auto this_cast = static_cast<simd8<bool>*>(this); *this_cast = *this_cast | other; return *this_cast; } + simdjson_inline simd8<bool>& operator&=(const simd8<bool> other) { auto this_cast = static_cast<simd8<bool>*>(this); *this_cast = *this_cast & other; return *this_cast; } + simdjson_inline simd8<bool>& operator^=(const simd8<bool> other) { auto this_cast = static_cast<simd8<bool>*>(this); *this_cast = *this_cast ^ other; return *this_cast; } + }; + + // Unsigned bytes + template<> + struct simd8<uint8_t> { + + vuint8_t value; + static constexpr int SIZE = sizeof(value); + + simdjson_inline simd8(const vuint8_t _value) : value(_value) {} + simdjson_inline simd8() : simd8(zero()) {} + simdjson_inline simd8(const uint8_t values[VL8]) : simd8(load(values)) {} + simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {} + simdjson_inline simd8(simd8<bool> mask) : value(__riscv_vmerge_vxm_u8m1(zero(), -1, (vbool_t)mask, VL8)) {} + + simdjson_inline operator const vuint8_t&() const { return this->value; } + simdjson_inline operator vuint8_t&() { return this->value; } + + simdjson_inline simd8( + uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, + uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 + ) : simd8(vuint8_t{ + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + }) {} + + // Repeat 16 values as many times as necessary (usually for lookup tables) + simdjson_inline static simd8<uint8_t> repeat_16( + uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, + uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 + ) { + return simd8<uint8_t>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + ); + } + + static simdjson_inline vuint8_t splat(uint8_t _value) { return __riscv_vmv_v_x_u8m1(_value, VL8); } + static simdjson_inline vuint8_t zero() { return splat(0); } + static simdjson_inline vuint8_t load(const uint8_t values[VL8]) { return __riscv_vle8_v_u8m1(values, VL8); } + + // Bit operations + simdjson_inline simd8<uint8_t> operator|(const simd8<uint8_t> other) const { return __riscv_vor_vv_u8m1( value, other, VL8); } + simdjson_inline simd8<uint8_t> operator&(const simd8<uint8_t> other) const { return __riscv_vand_vv_u8m1( value, other, VL8); } + simdjson_inline simd8<uint8_t> operator^(const simd8<uint8_t> other) const { return __riscv_vxor_vv_u8m1( value, other, VL8); } + simdjson_inline simd8<uint8_t> operator~() const { return __riscv_vnot_v_u8m1(value, VL8); } +#if __riscv_zvbb + simdjson_inline simd8<uint8_t> bit_andnot(const simd8<uint8_t> other) const { return __riscv_vandn_vv_u8m1(other, value, VL8); } +#else + simdjson_inline simd8<uint8_t> bit_andnot(const simd8<uint8_t> other) const { return other & ~*this; } +#endif + simdjson_inline simd8<uint8_t>& operator|=(const simd8<uint8_t> other) { value = *this | other; return *this; } + simdjson_inline simd8<uint8_t>& operator&=(const simd8<uint8_t> other) { value = *this & other; return *this; } + simdjson_inline simd8<uint8_t>& operator^=(const simd8<uint8_t> other) { value = *this ^ other; return *this; } + + simdjson_inline simd8<bool> operator==(const simd8<uint8_t> other) const { return __riscv_vmseq(value, other, VL8); } + simdjson_inline simd8<bool> operator==(uint8_t other) const { return __riscv_vmseq(value, other, VL8); } + + template<int N=1> + simdjson_inline simd8<uint8_t> prev(const simd8<uint8_t> prev_chunk) const { + return __riscv_vslideup(__riscv_vslidedown(prev_chunk, VL8-N, VL8), value, N, VL8); + } + + // Store to array + simdjson_inline void store(uint8_t dst[VL8]) const { return __riscv_vse8(dst, value, VL8); } + + // Saturated math + simdjson_inline simd8<uint8_t> saturating_add(const simd8<uint8_t> other) const { return __riscv_vsaddu(value, other, VL8); } + simdjson_inline simd8<uint8_t> saturating_sub(const simd8<uint8_t> other) const { return __riscv_vssubu(value, other, VL8); } + + // Addition/subtraction are the same for signed and unsigned + simdjson_inline simd8<uint8_t> operator+(const simd8<uint8_t> other) const { return __riscv_vadd(value, other, VL8); } + simdjson_inline simd8<uint8_t> operator-(const simd8<uint8_t> other) const { return __riscv_vsub(value, other, VL8); } + simdjson_inline simd8<uint8_t>& operator+=(const simd8<uint8_t> other) { value = *this + other; return *this; } + simdjson_inline simd8<uint8_t>& operator-=(const simd8<uint8_t> other) { value = *this - other; return *this; } + + // Order-specific operations + simdjson_inline simd8<bool> operator<=(const simd8<uint8_t> other) const { return __riscv_vmsleu(value, other, VL8); } + simdjson_inline simd8<bool> operator>=(const simd8<uint8_t> other) const { return __riscv_vmsgeu(value, other, VL8); } + simdjson_inline simd8<bool> operator<(const simd8<uint8_t> other) const { return __riscv_vmsltu(value, other, VL8); } + simdjson_inline simd8<bool> operator>(const simd8<uint8_t> other) const { return __riscv_vmsgtu(value, other, VL8); } + + // Same as >, but instead of guaranteeing all 1's == true, false = 0 and true = nonzero. + simdjson_inline simd8<uint8_t> gt_bits(const simd8<uint8_t> other) const { return simd8<uint8_t>(*this > other); } + // Same as <, but instead of guaranteeing all 1's == true, false = 0 and true = nonzero. + simdjson_inline simd8<uint8_t> lt_bits(const simd8<uint8_t> other) const { return simd8<uint8_t>(*this < other); } + + // Bit-specific operations + simdjson_inline bool any_bits_set_anywhere() const { + return __riscv_vfirst(__riscv_vmsne(value, 0, VL8), VL8) >= 0; + } + simdjson_inline bool any_bits_set_anywhere(simd8<uint8_t> bits) const { return (*this & bits).any_bits_set_anywhere(); } + template<int N> + simdjson_inline simd8<uint8_t> shr() const { return __riscv_vsrl(value, N, VL8); } + template<int N> + simdjson_inline simd8<uint8_t> shl() const { return __riscv_vsll(value, N, VL8); } + + + // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values) + template<typename L> + simdjson_inline simd8<L> lookup_16(simd8<L> lookup_table) const { + return __riscv_vrgather(lookup_table, value, VL8); + } + + // compress inactive elements, to match AVX-512 behavior + template<typename L> + simdjson_inline void compress(vbitmask_t mask, L * output) const { + mask = (vbitmask_t)~mask; +#if __riscv_v_fixed_vlen == 128 + vbool8_t m = __riscv_vreinterpret_b8(__riscv_vmv_s_x_u16m1(mask, 1)); +#elif __riscv_v_fixed_vlen == 256 + vbool8_t m = __riscv_vreinterpret_b8(__riscv_vmv_s_x_u32m1(mask, 1)); +#else + vbool8_t m = __riscv_vreinterpret_b8(__riscv_vmv_s_x_u64m1(mask, 1)); +#endif + __riscv_vse8_v_u8m1(output, __riscv_vcompress(value, m, VL8), count_ones(mask)); + } + + template<typename L> + simdjson_inline simd8<L> lookup_16( + L replace0, L replace1, L replace2, L replace3, + L replace4, L replace5, L replace6, L replace7, + L replace8, L replace9, L replace10, L replace11, + L replace12, L replace13, L replace14, L replace15) const { + return lookup_16(simd8<L>::repeat_16( + replace0, replace1, replace2, replace3, + replace4, replace5, replace6, replace7, + replace8, replace9, replace10, replace11, + replace12, replace13, replace14, replace15 + )); + } + }; + + // Signed bytes + template<> + struct simd8<int8_t> { + vint8_t value; + static constexpr int SIZE = sizeof(value); + + simdjson_inline simd8(const vint8_t _value) : value(_value) {} + simdjson_inline simd8() : simd8(zero()) {} + simdjson_inline simd8(const int8_t values[VL8]) : simd8(load(values)) {} + simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {} + + simdjson_inline operator const vint8_t&() const { return this->value; } + simdjson_inline operator vint8_t&() { return this->value; } + + simdjson_inline simd8( + int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, + int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 + ) : simd8(vint8_t{ + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + }) {} + + // Repeat 16 values as many times as necessary (usually for lookup tables) + simdjson_inline static simd8<int8_t> repeat_16( + int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, + int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 + ) { + return simd8<int8_t>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + ); + } + + static simdjson_inline vint8_t splat(int8_t _value) { return __riscv_vmv_v_x_i8m1(_value, VL8); } + static simdjson_inline vint8_t zero() { return splat(0); } + static simdjson_inline vint8_t load(const int8_t values[VL8]) { return __riscv_vle8_v_i8m1(values, VL8); } + + + simdjson_inline void store(int8_t dst[VL8]) const { return __riscv_vse8(dst, value, VL8); } + + // Explicit conversion to/from unsigned + simdjson_inline explicit simd8(const vuint8_t other): simd8(__riscv_vreinterpret_i8m1(other)) {} + simdjson_inline explicit operator simd8<uint8_t>() const { return __riscv_vreinterpret_u8m1(value); } + + // Math + simdjson_inline simd8<int8_t> operator+(const simd8<int8_t> other) const { return __riscv_vadd(value, other, VL8); } + simdjson_inline simd8<int8_t> operator-(const simd8<int8_t> other) const { return __riscv_vsub(value, other, VL8); } + simdjson_inline simd8<int8_t>& operator+=(const simd8<int8_t> other) { value = *this + other; return *this; } + simdjson_inline simd8<int8_t>& operator-=(const simd8<int8_t> other) { value = *this - other; return *this; } + + // Order-sensitive comparisons + simdjson_inline simd8<int8_t> max_val( const simd8<int8_t> other) const { return __riscv_vmax( value, other, VL8); } + simdjson_inline simd8<int8_t> min_val( const simd8<int8_t> other) const { return __riscv_vmin( value, other, VL8); } + simdjson_inline simd8<bool> operator>( const simd8<int8_t> other) const { return __riscv_vmsgt(value, other, VL8); } + simdjson_inline simd8<bool> operator<( const simd8<int8_t> other) const { return __riscv_vmslt(value, other, VL8); } + simdjson_inline simd8<bool> operator==(const simd8<int8_t> other) const { return __riscv_vmseq(value, other, VL8); } + + template<int N=1> + simdjson_inline simd8<int8_t> prev(const simd8<int8_t> prev_chunk) const { + return __riscv_vslideup(__riscv_vslidedown(prev_chunk, VL8-N, VL8), value, N, VL8); + } + + // Perform a lookup assuming no value is larger than 16 + template<typename L> + simdjson_inline simd8<L> lookup_16(simd8<L> lookup_table) const { + return __riscv_vrgather(lookup_table, value, VL8); + } + template<typename L> + simdjson_inline simd8<L> lookup_16( + L replace0, L replace1, L replace2, L replace3, + L replace4, L replace5, L replace6, L replace7, + L replace8, L replace9, L replace10, L replace11, + L replace12, L replace13, L replace14, L replace15) const { + return lookup_16(simd8<L>::repeat_16( + replace0, replace1, replace2, replace3, + replace4, replace5, replace6, replace7, + replace8, replace9, replace10, replace11, + replace12, replace13, replace14, replace15 + )); + } + }; + + template<typename T> + struct simd8x64; + template<> + struct simd8x64<uint8_t> { + static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<uint8_t>); + vuint8x64_t value; + +#if __riscv_v_fixed_vlen >= 512 + template<int idx> simd8<uint8_t> get() const { return value; } +#else + template<int idx> simd8<uint8_t> get() const { return __riscv_vget_u8m1(value, idx); } +#endif + + simdjson_inline operator const vuint8x64_t&() const { return this->value; } + simdjson_inline operator vuint8x64_t&() { return this->value; } + + simd8x64(const simd8x64<uint8_t>& o) = delete; // no copy allowed + simd8x64<uint8_t>& operator=(const simd8<uint8_t>& other) = delete; // no assignment allowed + simd8x64() = delete; // no default constructor allowed + +#if __riscv_v_fixed_vlen == 128 + simdjson_inline simd8x64(const uint8_t *ptr, size_t n = 64) : value(__riscv_vle8_v_u8m4(ptr, n)) {} +#elif __riscv_v_fixed_vlen == 256 + simdjson_inline simd8x64(const uint8_t *ptr, size_t n = 64) : value(__riscv_vle8_v_u8m2(ptr, n)) {} +#else + simdjson_inline simd8x64(const uint8_t *ptr, size_t n = 64) : value(__riscv_vle8_v_u8m1(ptr, n)) {} +#endif + + simdjson_inline void store(uint8_t ptr[64]) const { + __riscv_vse8(ptr, value, 64); + } + + simdjson_inline bool is_ascii() const { +#if __riscv_v_fixed_vlen == 128 + return __riscv_vfirst(__riscv_vmslt(__riscv_vreinterpret_i8m4(value), 0, 64), 64) < 0; +#elif __riscv_v_fixed_vlen == 256 + return __riscv_vfirst(__riscv_vmslt(__riscv_vreinterpret_i8m2(value), 0, 64), 64) < 0; +#else + return __riscv_vfirst(__riscv_vmslt(__riscv_vreinterpret_i8m1(value), 0, 64), 64) < 0; +#endif + } + + // compress inactive elements, to match AVX-512 behavior + simdjson_inline uint64_t compress(uint64_t mask, uint8_t * output) const { + mask = ~mask; +#if __riscv_v_fixed_vlen == 128 + vboolx64_t m = __riscv_vreinterpret_b2(__riscv_vmv_s_x_u64m1(mask, 1)); +#elif __riscv_v_fixed_vlen == 256 + vboolx64_t m = __riscv_vreinterpret_b4(__riscv_vmv_s_x_u64m1(mask, 1)); +#else + vboolx64_t m = __riscv_vreinterpret_b8(__riscv_vmv_s_x_u64m1(mask, 1)); +#endif + size_t cnt = count_ones(mask); + __riscv_vse8(output, __riscv_vcompress(value, m, 64), cnt); + return cnt; + } + + simdjson_inline uint64_t eq(const uint8_t m) const { + return __riscv_vmv_x(__riscv_vreinterpret_u64m1(__riscv_vmseq(value, m, 64))); + } + + simdjson_inline uint64_t lteq(const uint8_t m) const { + return __riscv_vmv_x(__riscv_vreinterpret_u64m1(__riscv_vmsleu(value, m, 64))); + } + }; // struct simd8x64<uint8_t> + +} // namespace simd +} // unnamed namespace +} // namespace rvv_vls +} // namespace simdjson + +#endif // SIMDJSON_RVV_VLS_SIMD_H +/* end file simdjson/rvv-vls/simd.h */ +/* including simdjson/rvv-vls/stringparsing_defs.h: #include "simdjson/rvv-vls/stringparsing_defs.h" */ +/* begin file simdjson/rvv-vls/stringparsing_defs.h */ +#ifndef SIMDJSON_RVV_VLS_STRINGPARSING_DEFS_H +#define SIMDJSON_RVV_VLS_STRINGPARSING_DEFS_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace rvv_vls { +namespace { + +using namespace simd; + +// Holds backslashes and quotes locations. +struct backslash_and_quote { +public: + static constexpr uint64_t BYTES_PROCESSED = sizeof(simd8<uint8_t>); + simdjson_inline backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst); + + simdjson_inline bool has_quote_first() { return ((bs_bits - 1) & quote_bits) != 0; } + simdjson_inline bool has_backslash() { return ((quote_bits - 1) & bs_bits) != 0; } + simdjson_inline int quote_index() { return trailing_zeroes(quote_bits); } + simdjson_inline int backslash_index() { return trailing_zeroes(bs_bits); } + + uint64_t bs_bits; + uint64_t quote_bits; +}; // struct backslash_and_quote + +simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) { + static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "backslash and quote finder must process fewer than SIMDJSON_PADDING bytes"); + simd8<uint8_t> v(src); + v.store(dst); + return { (v == '\\').to_bitmask(), (v == '"').to_bitmask() }; +} + +struct escaping { + static constexpr uint64_t BYTES_PROCESSED = sizeof(simd8<uint8_t>); + simdjson_inline static escaping copy_and_find(const uint8_t *src, uint8_t *dst); + + simdjson_inline bool has_escape() { return escape_bits != 0; } + simdjson_inline int escape_index() { return trailing_zeroes(escape_bits) / 4; } + + uint64_t escape_bits; +}; // struct escaping + +simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *dst) { + static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "escaping finder must process fewer than SIMDJSON_PADDING bytes"); + simd8<uint8_t> v(src); + v.store(dst); + return { ((v == '"') | (v == '\\') | (v == 32)).to_bitmask() }; +} + + +} // unnamed namespace +} // namespace rvv_vls +} // namespace simdjson + +#endif // SIMDJSON_RVV_VLS_STRINGPARSING_DEFS_H +/* end file simdjson/rvv-vls/stringparsing_defs.h */ +/* including simdjson/rvv-vls/numberparsing_defs.h: #include "simdjson/rvv-vls/numberparsing_defs.h" */ +/* begin file simdjson/rvv-vls/numberparsing_defs.h */ +#ifndef SIMDJSON_RVV_VLS_NUMBERPARSING_DEFS_H +#define SIMDJSON_RVV_VLS_NUMBERPARSING_DEFS_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#include <cstring> + +#ifdef JSON_TEST_NUMBERS // for unit testing +void found_invalid_number(const uint8_t *buf); +void found_integer(int64_t result, const uint8_t *buf); +void found_unsigned_integer(uint64_t result, const uint8_t *buf); +void found_float(double result, const uint8_t *buf); +#endif + +namespace simdjson { +namespace rvv_vls { +namespace numberparsing { + +// credit: https://johnnylee-sde.github.io/Fast-numeric-string-to-int/ +/** @private */ +static simdjson_inline uint32_t parse_eight_digits_unrolled(const char *chars) { + uint64_t val; +#if __riscv_misaligned_fast + memcpy(&val, chars, sizeof(uint64_t)); +#else + val = __riscv_vmv_x(__riscv_vreinterpret_u64m1(__riscv_vlmul_ext_u8m1(__riscv_vle8_v_u8mf2((uint8_t*)chars, 8)))); +#endif + val = (val & 0x0F0F0F0F0F0F0F0F) * 2561 >> 8; + val = (val & 0x00FF00FF00FF00FF) * 6553601 >> 16; + return uint32_t((val & 0x0000FFFF0000FFFF) * 42949672960001 >> 32); +} + +/** @private */ +static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) { + return parse_eight_digits_unrolled(reinterpret_cast<const char *>(chars)); +} + +/** @private */ +simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) { + internal::value128 answer; + __uint128_t r = (static_cast<__uint128_t>(value1)) * value2; + answer.low = uint64_t(r); + answer.high = uint64_t(r >> 64); + return answer; +} + +} // namespace numberparsing +} // namespace rvv_vls +} // namespace simdjson + +#define SIMDJSON_SWAR_NUMBER_PARSING 1 + +#endif // SIMDJSON_RVV_VLS_NUMBERPARSING_DEFS_H +/* end file simdjson/rvv-vls/numberparsing_defs.h */ + +#define SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT 1 +/* end file simdjson/rvv-vls/begin.h */ +/* including simdjson/generic/amalgamated.h for rvv_vls: #include "simdjson/generic/amalgamated.h" */ +/* begin file simdjson/generic/amalgamated.h for rvv_vls */ +#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_DEPENDENCIES_H) +#error simdjson/generic/dependencies.h must be included before simdjson/generic/amalgamated.h! +#endif + +/* including simdjson/generic/base.h for rvv_vls: #include "simdjson/generic/base.h" */ +/* begin file simdjson/generic/base.h for rvv_vls */ +#ifndef SIMDJSON_GENERIC_BASE_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_BASE_H */ +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */ +/* amalgamation skipped (editor-only): // If we haven't got an implementation yet, we're in the editor, editing a generic file! Just */ +/* amalgamation skipped (editor-only): // use the most advanced one we can so the most possible stuff can be tested. */ +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_IMPLEMENTATION */ +/* amalgamation skipped (editor-only): #include "simdjson/implementation_detection.h" */ +/* amalgamation skipped (editor-only): #if SIMDJSON_IMPLEMENTATION_ICELAKE */ +/* amalgamation skipped (editor-only): #include "simdjson/icelake/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_HASWELL */ +/* amalgamation skipped (editor-only): #include "simdjson/haswell/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_WESTMERE */ +/* amalgamation skipped (editor-only): #include "simdjson/westmere/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_ARM64 */ +/* amalgamation skipped (editor-only): #include "simdjson/arm64/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_PPC64 */ +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LASX */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LSX */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_RVV_VLS */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_FALLBACK */ +/* amalgamation skipped (editor-only): #include "simdjson/fallback/begin.h" */ +/* amalgamation skipped (editor-only): #else */ +/* amalgamation skipped (editor-only): #error "All possible implementations (including fallback) have been disabled! simdjson will not run." */ +/* amalgamation skipped (editor-only): #endif */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_IMPLEMENTATION */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace rvv_vls { + +struct open_container; +class dom_parser_implementation; + +/** + * The type of a JSON number + */ +enum class number_type { + floating_point_number=1, /// a binary64 number + signed_integer, /// a signed integer that fits in a 64-bit word using two's complement + unsigned_integer, /// a positive integer larger or equal to 1<<63 + big_integer /// a big integer that does not fit in a 64-bit word +}; + +} // namespace rvv_vls +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_BASE_H +/* end file simdjson/generic/base.h for rvv_vls */ +/* including simdjson/generic/jsoncharutils.h for rvv_vls: #include "simdjson/generic/jsoncharutils.h" */ +/* begin file simdjson/generic/jsoncharutils.h for rvv_vls */ +#ifndef SIMDJSON_GENERIC_JSONCHARUTILS_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_JSONCHARUTILS_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/internal/jsoncharutils_tables.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace rvv_vls { +namespace { +namespace jsoncharutils { + +// return non-zero if not a structural or whitespace char +// zero otherwise +simdjson_inline uint32_t is_not_structural_or_whitespace(uint8_t c) { + return internal::structural_or_whitespace_negated[c]; +} + +simdjson_inline uint32_t is_structural_or_whitespace(uint8_t c) { + return internal::structural_or_whitespace[c]; +} + +// returns a value with the high 16 bits set if not valid +// otherwise returns the conversion of the 4 hex digits at src into the bottom +// 16 bits of the 32-bit return register +// +// see +// https://lemire.me/blog/2019/04/17/parsing-short-hexadecimal-strings-efficiently/ +static inline uint32_t hex_to_u32_nocheck( + const uint8_t *src) { // strictly speaking, static inline is a C-ism + uint32_t v1 = internal::digit_to_val32[630 + src[0]]; + uint32_t v2 = internal::digit_to_val32[420 + src[1]]; + uint32_t v3 = internal::digit_to_val32[210 + src[2]]; + uint32_t v4 = internal::digit_to_val32[0 + src[3]]; + return v1 | v2 | v3 | v4; +} + +// given a code point cp, writes to c +// the utf-8 code, outputting the length in +// bytes, if the length is zero, the code point +// is invalid +// +// This can possibly be made faster using pdep +// and clz and table lookups, but JSON documents +// have few escaped code points, and the following +// function looks cheap. +// +// Note: we assume that surrogates are treated separately +// +simdjson_inline size_t codepoint_to_utf8(uint32_t cp, uint8_t *c) { + if (cp <= 0x7F) { + c[0] = uint8_t(cp); + return 1; // ascii + } + if (cp <= 0x7FF) { + c[0] = uint8_t((cp >> 6) + 192); + c[1] = uint8_t((cp & 63) + 128); + return 2; // universal plane + // Surrogates are treated elsewhere... + //} //else if (0xd800 <= cp && cp <= 0xdfff) { + // return 0; // surrogates // could put assert here + } else if (cp <= 0xFFFF) { + c[0] = uint8_t((cp >> 12) + 224); + c[1] = uint8_t(((cp >> 6) & 63) + 128); + c[2] = uint8_t((cp & 63) + 128); + return 3; + } else if (cp <= 0x10FFFF) { // if you know you have a valid code point, this + // is not needed + c[0] = uint8_t((cp >> 18) + 240); + c[1] = uint8_t(((cp >> 12) & 63) + 128); + c[2] = uint8_t(((cp >> 6) & 63) + 128); + c[3] = uint8_t((cp & 63) + 128); + return 4; + } + // will return 0 when the code point was too large. + return 0; // bad r +} + +#if SIMDJSON_IS_32BITS // _umul128 for x86, arm +// this is a slow emulation routine for 32-bit +// +static simdjson_inline uint64_t __emulu(uint32_t x, uint32_t y) { + return x * (uint64_t)y; +} +static simdjson_inline uint64_t _umul128(uint64_t ab, uint64_t cd, uint64_t *hi) { + uint64_t ad = __emulu((uint32_t)(ab >> 32), (uint32_t)cd); + uint64_t bd = __emulu((uint32_t)ab, (uint32_t)cd); + uint64_t adbc = ad + __emulu((uint32_t)ab, (uint32_t)(cd >> 32)); + uint64_t adbc_carry = !!(adbc < ad); + uint64_t lo = bd + (adbc << 32); + *hi = __emulu((uint32_t)(ab >> 32), (uint32_t)(cd >> 32)) + (adbc >> 32) + + (adbc_carry << 32) + !!(lo < bd); + return lo; +} +#endif + +} // namespace jsoncharutils +} // unnamed namespace +} // namespace rvv_vls +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_JSONCHARUTILS_H +/* end file simdjson/generic/jsoncharutils.h for rvv_vls */ +/* including simdjson/generic/atomparsing.h for rvv_vls: #include "simdjson/generic/atomparsing.h" */ +/* begin file simdjson/generic/atomparsing.h for rvv_vls */ +#ifndef SIMDJSON_GENERIC_ATOMPARSING_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ATOMPARSING_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/jsoncharutils.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#include <cstring> + +namespace simdjson { +namespace rvv_vls { +namespace { +/// @private +namespace atomparsing { + +// The string_to_uint32 is exclusively used to map literal strings to 32-bit values. +// We use memcpy instead of a pointer cast to avoid undefined behaviors since we cannot +// be certain that the character pointer will be properly aligned. +// You might think that using memcpy makes this function expensive, but you'd be wrong. +// All decent optimizing compilers (GCC, clang, Visual Studio) will compile string_to_uint32("false"); +// to the compile-time constant 1936482662. +simdjson_inline uint32_t string_to_uint32(const char* str) { uint32_t val; std::memcpy(&val, str, sizeof(uint32_t)); return val; } + + +// Again in str4ncmp we use a memcpy to avoid undefined behavior. The memcpy may appear expensive. +// Yet all decent optimizing compilers will compile memcpy to a single instruction, just about. +simdjson_warn_unused +simdjson_inline uint32_t str4ncmp(const uint8_t *src, const char* atom) { + uint32_t srcval; // we want to avoid unaligned 32-bit loads (undefined in C/C++) + static_assert(sizeof(uint32_t) <= SIMDJSON_PADDING, "SIMDJSON_PADDING must be larger than 4 bytes"); + std::memcpy(&srcval, src, sizeof(uint32_t)); + return srcval ^ string_to_uint32(atom); +} + +simdjson_warn_unused +simdjson_inline bool is_valid_true_atom(const uint8_t *src) { + return (str4ncmp(src, "true") | jsoncharutils::is_not_structural_or_whitespace(src[4])) == 0; +} + +simdjson_warn_unused +simdjson_inline bool is_valid_true_atom(const uint8_t *src, size_t len) { + if (len > 4) { return is_valid_true_atom(src); } + else if (len == 4) { return !str4ncmp(src, "true"); } + else { return false; } +} + +simdjson_warn_unused +simdjson_inline bool is_valid_false_atom(const uint8_t *src) { + return (str4ncmp(src+1, "alse") | jsoncharutils::is_not_structural_or_whitespace(src[5])) == 0; +} + +simdjson_warn_unused +simdjson_inline bool is_valid_false_atom(const uint8_t *src, size_t len) { + if (len > 5) { return is_valid_false_atom(src); } + else if (len == 5) { return !str4ncmp(src+1, "alse"); } + else { return false; } +} + +simdjson_warn_unused +simdjson_inline bool is_valid_null_atom(const uint8_t *src) { + return (str4ncmp(src, "null") | jsoncharutils::is_not_structural_or_whitespace(src[4])) == 0; +} + +simdjson_warn_unused +simdjson_inline bool is_valid_null_atom(const uint8_t *src, size_t len) { + if (len > 4) { return is_valid_null_atom(src); } + else if (len == 4) { return !str4ncmp(src, "null"); } + else { return false; } +} + +} // namespace atomparsing +} // unnamed namespace +} // namespace rvv_vls +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_ATOMPARSING_H +/* end file simdjson/generic/atomparsing.h for rvv_vls */ +/* including simdjson/generic/dom_parser_implementation.h for rvv_vls: #include "simdjson/generic/dom_parser_implementation.h" */ +/* begin file simdjson/generic/dom_parser_implementation.h for rvv_vls */ +#ifndef SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/internal/dom_parser_implementation.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace rvv_vls { + +// expectation: sizeof(open_container) = 64/8. +struct open_container { + uint32_t tape_index; // where, on the tape, does the scope ([,{) begins + uint32_t count; // how many elements in the scope +}; // struct open_container + +static_assert(sizeof(open_container) == 64/8, "Open container must be 64 bits"); + +class dom_parser_implementation final : public internal::dom_parser_implementation { +public: + /** Tape location of each open { or [ */ + std::unique_ptr<open_container[]> open_containers{}; + /** Whether each open container is a [ or { */ + std::unique_ptr<bool[]> is_array{}; + /** Buffer passed to stage 1 */ + const uint8_t *buf{}; + /** Length passed to stage 1 */ + size_t len{0}; + /** Document passed to stage 2 */ + dom::document *doc{}; + + inline dom_parser_implementation() noexcept; + inline dom_parser_implementation(dom_parser_implementation &&other) noexcept; + inline dom_parser_implementation &operator=(dom_parser_implementation &&other) noexcept; + dom_parser_implementation(const dom_parser_implementation &) = delete; + dom_parser_implementation &operator=(const dom_parser_implementation &) = delete; + + simdjson_warn_unused error_code parse(const uint8_t *buf, size_t len, dom::document &doc) noexcept final; + simdjson_warn_unused error_code stage1(const uint8_t *buf, size_t len, stage1_mode partial) noexcept final; + simdjson_warn_unused error_code stage2(dom::document &doc) noexcept final; + simdjson_warn_unused error_code stage2_next(dom::document &doc) noexcept final; + simdjson_warn_unused uint8_t *parse_string(const uint8_t *src, uint8_t *dst, bool allow_replacement) const noexcept final; + simdjson_warn_unused uint8_t *parse_wobbly_string(const uint8_t *src, uint8_t *dst) const noexcept final; + inline simdjson_warn_unused error_code set_capacity(size_t capacity) noexcept final; + inline simdjson_warn_unused error_code set_max_depth(size_t max_depth) noexcept final; +private: + simdjson_inline simdjson_warn_unused error_code set_capacity_stage1(size_t capacity); + +}; + +} // namespace rvv_vls +} // namespace simdjson + +namespace simdjson { +namespace rvv_vls { + +inline dom_parser_implementation::dom_parser_implementation() noexcept = default; +inline dom_parser_implementation::dom_parser_implementation(dom_parser_implementation &&other) noexcept = default; +inline dom_parser_implementation &dom_parser_implementation::operator=(dom_parser_implementation &&other) noexcept = default; + +// Leaving these here so they can be inlined if so desired +inline simdjson_warn_unused error_code dom_parser_implementation::set_capacity(size_t capacity) noexcept { + if(capacity > SIMDJSON_MAXSIZE_BYTES) { return CAPACITY; } + // Stage 1 index output + size_t max_structures = SIMDJSON_ROUNDUP_N(capacity, 64) + 2 + 7; + structural_indexes.reset( new (std::nothrow) uint32_t[max_structures] ); + if (!structural_indexes) { _capacity = 0; return MEMALLOC; } + structural_indexes[0] = 0; + n_structural_indexes = 0; + + _capacity = capacity; + return SUCCESS; +} + +inline simdjson_warn_unused error_code dom_parser_implementation::set_max_depth(size_t max_depth) noexcept { + // Stage 2 stacks + open_containers.reset(new (std::nothrow) open_container[max_depth]); + is_array.reset(new (std::nothrow) bool[max_depth]); + if (!is_array || !open_containers) { _max_depth = 0; return MEMALLOC; } + + _max_depth = max_depth; + return SUCCESS; +} + +} // namespace rvv_vls +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H +/* end file simdjson/generic/dom_parser_implementation.h for rvv_vls */ +/* including simdjson/generic/implementation_simdjson_result_base.h for rvv_vls: #include "simdjson/generic/implementation_simdjson_result_base.h" */ +/* begin file simdjson/generic/implementation_simdjson_result_base.h for rvv_vls */ +#ifndef SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace rvv_vls { + +// This is a near copy of include/error.h's implementation_simdjson_result_base, except it doesn't use std::pair +// so we can avoid inlining errors +// TODO reconcile these! +/** + * The result of a simdjson operation that could fail. + * + * Gives the option of reading error codes, or throwing an exception by casting to the desired result. + * + * This is a base class for implementations that want to add functions to the result type for + * chaining. + * + * Override like: + * + * struct simdjson_result<T> : public internal::implementation_simdjson_result_base<T> { + * simdjson_result() noexcept : internal::implementation_simdjson_result_base<T>() {} + * simdjson_result(error_code error) noexcept : internal::implementation_simdjson_result_base<T>(error) {} + * simdjson_result(T &&value) noexcept : internal::implementation_simdjson_result_base<T>(std::forward(value)) {} + * simdjson_result(T &&value, error_code error) noexcept : internal::implementation_simdjson_result_base<T>(value, error) {} + * // Your extra methods here + * } + * + * Then any method returning simdjson_result<T> will be chainable with your methods. + */ +template<typename T> +struct implementation_simdjson_result_base { + + /** + * Create a new empty result with error = UNINITIALIZED. + */ + simdjson_inline implementation_simdjson_result_base() noexcept = default; + + /** + * Create a new error result. + */ + simdjson_inline implementation_simdjson_result_base(error_code error) noexcept; + + /** + * Create a new successful result. + */ + simdjson_inline implementation_simdjson_result_base(T &&value) noexcept; + + /** + * Create a new result with both things (use if you don't want to branch when creating the result). + */ + simdjson_inline implementation_simdjson_result_base(T &&value, error_code error) noexcept; + + /** + * Move the value and the error to the provided variables. + * + * @param value The variable to assign the value to. May not be set if there is an error. + * @param error The variable to assign the error to. Set to SUCCESS if there is no error. + */ + simdjson_inline void tie(T &value, error_code &error) && noexcept; + + /** + * Move the value to the provided variable. + * + * @param value The variable to assign the value to. May not be set if there is an error. + */ + simdjson_warn_unused simdjson_inline error_code get(T &value) && noexcept; + + /** + * The error. + */ + simdjson_warn_unused simdjson_inline error_code error() const noexcept; + + /** + * Whether there is a value. + */ + simdjson_warn_unused simdjson_inline bool has_value() const noexcept; + +#if SIMDJSON_EXCEPTIONS + + /** + * Get the result value. + * + * @throw simdjson_error if there was an error. + */ + simdjson_inline T& operator*() & noexcept(false); + simdjson_inline T&& operator*() && noexcept(false); + /** + * Arrow operator to access members of the contained value. + * + * @throw simdjson_error if there was an error. + */ + simdjson_inline T* operator->() noexcept(false); + simdjson_inline const T* operator->() const noexcept(false); + + simdjson_inline T& value() & noexcept(false); + + /** + * Take the result value (move it). + * + * @throw simdjson_error if there was an error. + */ + simdjson_inline T&& value() && noexcept(false); + + /** + * Take the result value (move it). + * + * @throw simdjson_error if there was an error. + */ + simdjson_inline T&& take_value() && noexcept(false); + + /** + * Cast to the value (will throw on error). + * + * @throw simdjson_error if there was an error. + */ + simdjson_inline operator T&&() && noexcept(false); + + +#endif // SIMDJSON_EXCEPTIONS + + /** + * Get the result value. This function is safe if and only + * the error() method returns a value that evaluates to false. + */ + simdjson_inline const T& value_unsafe() const& noexcept; + /** + * Get the result value. This function is safe if and only + * the error() method returns a value that evaluates to false. + */ + simdjson_inline T& value_unsafe() & noexcept; + /** + * Take the result value (move it). This function is safe if and only + * the error() method returns a value that evaluates to false. + */ + simdjson_inline T&& value_unsafe() && noexcept; + + using value_type = T; + using error_type = error_code; + +protected: + /** users should never directly access first and second. **/ + T first{}; /** Users should never directly access 'first'. **/ + error_code second{UNINITIALIZED}; /** Users should never directly access 'second'. **/ +}; // struct implementation_simdjson_result_base + +} // namespace rvv_vls +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H +/* end file simdjson/generic/implementation_simdjson_result_base.h for rvv_vls */ +/* including simdjson/generic/numberparsing.h for rvv_vls: #include "simdjson/generic/numberparsing.h" */ +/* begin file simdjson/generic/numberparsing.h for rvv_vls */ +#ifndef SIMDJSON_GENERIC_NUMBERPARSING_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_NUMBERPARSING_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/jsoncharutils.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#include <limits> +#include <ostream> +#include <cstring> + +namespace simdjson { +namespace rvv_vls { +namespace numberparsing { + +#ifdef JSON_TEST_NUMBERS +#define INVALID_NUMBER(SRC) (found_invalid_number((SRC)), NUMBER_ERROR) +#define WRITE_INTEGER(VALUE, SRC, WRITER) (found_integer((VALUE), (SRC)), (WRITER).append_s64((VALUE))) +#define WRITE_UNSIGNED(VALUE, SRC, WRITER) (found_unsigned_integer((VALUE), (SRC)), (WRITER).append_u64((VALUE))) +#define WRITE_DOUBLE(VALUE, SRC, WRITER) (found_float((VALUE), (SRC)), (WRITER).append_double((VALUE))) +#define BIGINT_NUMBER(SRC) (found_invalid_number((SRC)), BIGINT_ERROR) +#else +#define INVALID_NUMBER(SRC) (NUMBER_ERROR) +#define WRITE_INTEGER(VALUE, SRC, WRITER) (WRITER).append_s64((VALUE)) +#define WRITE_UNSIGNED(VALUE, SRC, WRITER) (WRITER).append_u64((VALUE)) +#define WRITE_DOUBLE(VALUE, SRC, WRITER) (WRITER).append_double((VALUE)) +#define BIGINT_NUMBER(SRC) (BIGINT_ERROR) +#endif + +namespace { + +// Convert a mantissa, an exponent and a sign bit into an ieee64 double. +// The real_exponent needs to be in [0, 2046] (technically real_exponent = 2047 would be acceptable). +// The mantissa should be in [0,1<<53). The bit at index (1ULL << 52) while be zeroed. +simdjson_inline double to_double(uint64_t mantissa, uint64_t real_exponent, bool negative) { + double d; + mantissa &= ~(1ULL << 52); + mantissa |= real_exponent << 52; + mantissa |= ((static_cast<uint64_t>(negative)) << 63); + std::memcpy(&d, &mantissa, sizeof(d)); + return d; +} + +// Attempts to compute i * 10^(power) exactly; and if "negative" is +// true, negate the result. +// This function will only work in some cases, when it does not work, success is +// set to false. This should work *most of the time* (like 99% of the time). +// We assume that power is in the [smallest_power, +// largest_power] interval: the caller is responsible for this check. +simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative, double &d) { + // we start with a fast path + // It was described in + // Clinger WD. How to read floating point numbers accurately. + // ACM SIGPLAN Notices. 1990 +#ifndef FLT_EVAL_METHOD +#error "FLT_EVAL_METHOD should be defined, please include cfloat." +#endif +#if (FLT_EVAL_METHOD != 1) && (FLT_EVAL_METHOD != 0) + // We cannot be certain that x/y is rounded to nearest. + if (0 <= power && power <= 22 && i <= 9007199254740991) +#else + if (-22 <= power && power <= 22 && i <= 9007199254740991) +#endif + { + // convert the integer into a double. This is lossless since + // 0 <= i <= 2^53 - 1. + d = double(i); + // + // The general idea is as follows. + // If 0 <= s < 2^53 and if 10^0 <= p <= 10^22 then + // 1) Both s and p can be represented exactly as 64-bit floating-point + // values + // (binary64). + // 2) Because s and p can be represented exactly as floating-point values, + // then s * p + // and s / p will produce correctly rounded values. + // + if (power < 0) { + d = d / simdjson::internal::power_of_ten[-power]; + } else { + d = d * simdjson::internal::power_of_ten[power]; + } + if (negative) { + d = -d; + } + return true; + } + // When 22 < power && power < 22 + 16, we could + // hope for another, secondary fast path. It was + // described by David M. Gay in "Correctly rounded + // binary-decimal and decimal-binary conversions." (1990) + // If you need to compute i * 10^(22 + x) for x < 16, + // first compute i * 10^x, if you know that result is exact + // (e.g., when i * 10^x < 2^53), + // then you can still proceed and do (i * 10^x) * 10^22. + // Is this worth your time? + // You need 22 < power *and* power < 22 + 16 *and* (i * 10^(x-22) < 2^53) + // for this second fast path to work. + // If you you have 22 < power *and* power < 22 + 16, and then you + // optimistically compute "i * 10^(x-22)", there is still a chance that you + // have wasted your time if i * 10^(x-22) >= 2^53. It makes the use cases of + // this optimization maybe less common than we would like. Source: + // http://www.exploringbinary.com/fast-path-decimal-to-floating-point-conversion/ + // also used in RapidJSON: https://rapidjson.org/strtod_8h_source.html + + // The fast path has now failed, so we are failing back on the slower path. + + // In the slow path, we need to adjust i so that it is > 1<<63 which is always + // possible, except if i == 0, so we handle i == 0 separately. + if(i == 0) { + d = negative ? -0.0 : 0.0; + return true; + } + + + // The exponent is 1024 + 63 + power + // + floor(log(5**power)/log(2)). + // The 1024 comes from the ieee64 standard. + // The 63 comes from the fact that we use a 64-bit word. + // + // Computing floor(log(5**power)/log(2)) could be + // slow. Instead we use a fast function. + // + // For power in (-400,350), we have that + // (((152170 + 65536) * power ) >> 16); + // is equal to + // floor(log(5**power)/log(2)) + power when power >= 0 + // and it is equal to + // ceil(log(5**-power)/log(2)) + power when power < 0 + // + // The 65536 is (1<<16) and corresponds to + // (65536 * power) >> 16 ---> power + // + // ((152170 * power ) >> 16) is equal to + // floor(log(5**power)/log(2)) + // + // Note that this is not magic: 152170/(1<<16) is + // approximately equal to log(5)/log(2). + // The 1<<16 value is a power of two; we could use a + // larger power of 2 if we wanted to. + // + int64_t exponent = (((152170 + 65536) * power) >> 16) + 1024 + 63; + + + // We want the most significant bit of i to be 1. Shift if needed. + int lz = leading_zeroes(i); + i <<= lz; + + + // We are going to need to do some 64-bit arithmetic to get a precise product. + // We use a table lookup approach. + // It is safe because + // power >= smallest_power + // and power <= largest_power + // We recover the mantissa of the power, it has a leading 1. It is always + // rounded down. + // + // We want the most significant 64 bits of the product. We know + // this will be non-zero because the most significant bit of i is + // 1. + const uint32_t index = 2 * uint32_t(power - simdjson::internal::smallest_power); + // Optimization: It may be that materializing the index as a variable might confuse some compilers and prevent effective complex-addressing loads. (Done for code clarity.) + // + // The full_multiplication function computes the 128-bit product of two 64-bit words + // with a returned value of type value128 with a "low component" corresponding to the + // 64-bit least significant bits of the product and with a "high component" corresponding + // to the 64-bit most significant bits of the product. +#if SIMDJSON_STATIC_REFLECTION + simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index]); +#else + simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]); +#endif + + // Both i and power_of_five_128[index] have their most significant bit set to 1 which + // implies that the either the most or the second most significant bit of the product + // is 1. We pack values in this manner for efficiency reasons: it maximizes the use + // we make of the product. It also makes it easy to reason about the product: there + // is 0 or 1 leading zero in the product. + + // Unless the least significant 9 bits of the high (64-bit) part of the full + // product are all 1s, then we know that the most significant 55 bits are + // exact and no further work is needed. Having 55 bits is necessary because + // we need 53 bits for the mantissa but we have to have one rounding bit and + // we can waste a bit if the most significant bit of the product is zero. + if((firstproduct.high & 0x1FF) == 0x1FF) { + // We want to compute i * 5^q, but only care about the top 55 bits at most. + // Consider the scenario where q>=0. Then 5^q may not fit in 64-bits. Doing + // the full computation is wasteful. So we do what is called a "truncated + // multiplication". + // We take the most significant 64-bits, and we put them in + // power_of_five_128[index]. Usually, that's good enough to approximate i * 5^q + // to the desired approximation using one multiplication. Sometimes it does not suffice. + // Then we store the next most significant 64 bits in power_of_five_128[index + 1], and + // then we get a better approximation to i * 5^q. + // + // That's for when q>=0. The logic for q<0 is somewhat similar but it is somewhat + // more complicated. + // + // There is an extra layer of complexity in that we need more than 55 bits of + // accuracy in the round-to-even scenario. + // + // The full_multiplication function computes the 128-bit product of two 64-bit words + // with a returned value of type value128 with a "low component" corresponding to the + // 64-bit least significant bits of the product and with a "high component" corresponding + // to the 64-bit most significant bits of the product. +#if SIMDJSON_STATIC_REFLECTION + simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index + 1]); +#else + simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]); +#endif + firstproduct.low += secondproduct.high; + if(secondproduct.high > firstproduct.low) { firstproduct.high++; } + // As it has been proven by Noble Mushtak and Daniel Lemire in "Fast Number Parsing Without + // Fallback" (https://arxiv.org/abs/2212.06644), at this point we are sure that the product + // is sufficiently accurate, and more computation is not needed. + } + uint64_t lower = firstproduct.low; + uint64_t upper = firstproduct.high; + // The final mantissa should be 53 bits with a leading 1. + // We shift it so that it occupies 54 bits with a leading 1. + /////// + uint64_t upperbit = upper >> 63; + uint64_t mantissa = upper >> (upperbit + 9); + lz += int(1 ^ upperbit); + + // Here we have mantissa < (1<<54). + int64_t real_exponent = exponent - lz; + if (simdjson_unlikely(real_exponent <= 0)) { // we have a subnormal? + // Here have that real_exponent <= 0 so -real_exponent >= 0 + if(-real_exponent + 1 >= 64) { // if we have more than 64 bits below the minimum exponent, you have a zero for sure. + d = negative ? -0.0 : 0.0; + return true; + } + // next line is safe because -real_exponent + 1 < 0 + mantissa >>= -real_exponent + 1; + // Thankfully, we can't have both "round-to-even" and subnormals because + // "round-to-even" only occurs for powers close to 0. + mantissa += (mantissa & 1); // round up + mantissa >>= 1; + // There is a weird scenario where we don't have a subnormal but just. + // Suppose we start with 2.2250738585072013e-308, we end up + // with 0x3fffffffffffff x 2^-1023-53 which is technically subnormal + // whereas 0x40000000000000 x 2^-1023-53 is normal. Now, we need to round + // up 0x3fffffffffffff x 2^-1023-53 and once we do, we are no longer + // subnormal, but we can only know this after rounding. + // So we only declare a subnormal if we are smaller than the threshold. + real_exponent = (mantissa < (uint64_t(1) << 52)) ? 0 : 1; + d = to_double(mantissa, real_exponent, negative); + return true; + } + // We have to round to even. The "to even" part + // is only a problem when we are right in between two floats + // which we guard against. + // If we have lots of trailing zeros, we may fall right between two + // floating-point values. + // + // The round-to-even cases take the form of a number 2m+1 which is in (2^53,2^54] + // times a power of two. That is, it is right between a number with binary significand + // m and another number with binary significand m+1; and it must be the case + // that it cannot be represented by a float itself. + // + // We must have that w * 10 ^q == (2m+1) * 2^p for some power of two 2^p. + // Recall that 10^q = 5^q * 2^q. + // When q >= 0, we must have that (2m+1) is divible by 5^q, so 5^q <= 2^54. We have that + // 5^23 <= 2^54 and it is the last power of five to qualify, so q <= 23. + // When q<0, we have w >= (2m+1) x 5^{-q}. We must have that w<2^{64} so + // (2m+1) x 5^{-q} < 2^{64}. We have that 2m+1>2^{53}. Hence, we must have + // 2^{53} x 5^{-q} < 2^{64}. + // Hence we have 5^{-q} < 2^{11}$ or q>= -4. + // + // We require lower <= 1 and not lower == 0 because we could not prove that + // that lower == 0 is implied; but we could prove that lower <= 1 is a necessary and sufficient test. + if (simdjson_unlikely((lower <= 1) && (power >= -4) && (power <= 23) && ((mantissa & 3) == 1))) { + if((mantissa << (upperbit + 64 - 53 - 2)) == upper) { + mantissa &= ~1; // flip it so that we do not round up + } + } + + mantissa += mantissa & 1; + mantissa >>= 1; + + // Here we have mantissa < (1<<53), unless there was an overflow + if (mantissa >= (1ULL << 53)) { + ////////// + // This will happen when parsing values such as 7.2057594037927933e+16 + //////// + mantissa = (1ULL << 52); + real_exponent++; + } + mantissa &= ~(1ULL << 52); + // we have to check that real_exponent is in range, otherwise we bail out + if (simdjson_unlikely(real_exponent > 2046)) { + // We have an infinite value!!! We could actually throw an error here if we could. + return false; + } + d = to_double(mantissa, real_exponent, negative); + return true; +} + +// We call a fallback floating-point parser that might be slow. Note +// it will accept JSON numbers, but the JSON spec. is more restrictive so +// before you call parse_float_fallback, you need to have validated the input +// string with the JSON grammar. +// It will return an error (false) if the parsed number is infinite. +// The string parsing itself always succeeds. We know that there is at least +// one digit. +static bool parse_float_fallback(const uint8_t *ptr, double *outDouble) { + *outDouble = simdjson::internal::from_chars(reinterpret_cast<const char *>(ptr)); + // We do not accept infinite values. + + // Detecting finite values in a portable manner is ridiculously hard, ideally + // we would want to do: + // return !std::isfinite(*outDouble); + // but that mysteriously fails under legacy/old libc++ libraries, see + // https://github.com/simdjson/simdjson/issues/1286 + // + // Therefore, fall back to this solution (the extra parens are there + // to handle that max may be a macro on windows). + return !(*outDouble > (std::numeric_limits<double>::max)() || *outDouble < std::numeric_limits<double>::lowest()); +} + +static bool parse_float_fallback(const uint8_t *ptr, const uint8_t *end_ptr, double *outDouble) { + *outDouble = simdjson::internal::from_chars(reinterpret_cast<const char *>(ptr), reinterpret_cast<const char *>(end_ptr)); + // We do not accept infinite values. + + // Detecting finite values in a portable manner is ridiculously hard, ideally + // we would want to do: + // return !std::isfinite(*outDouble); + // but that mysteriously fails under legacy/old libc++ libraries, see + // https://github.com/simdjson/simdjson/issues/1286 + // + // Therefore, fall back to this solution (the extra parens are there + // to handle that max may be a macro on windows). + return !(*outDouble > (std::numeric_limits<double>::max)() || *outDouble < std::numeric_limits<double>::lowest()); +} + +// check quickly whether the next 8 chars are made of digits +// at a glance, it looks better than Mula's +// http://0x80.pl/articles/swar-digits-validate.html +simdjson_inline bool is_made_of_eight_digits_fast(const uint8_t *chars) { + uint64_t val; + // this can read up to 7 bytes beyond the buffer size, but we require + // SIMDJSON_PADDING of padding + static_assert(7 <= SIMDJSON_PADDING, "SIMDJSON_PADDING must be bigger than 7"); + std::memcpy(&val, chars, 8); + // a branchy method might be faster: + // return (( val & 0xF0F0F0F0F0F0F0F0 ) == 0x3030303030303030) + // && (( (val + 0x0606060606060606) & 0xF0F0F0F0F0F0F0F0 ) == + // 0x3030303030303030); + return (((val & 0xF0F0F0F0F0F0F0F0) | + (((val + 0x0606060606060606) & 0xF0F0F0F0F0F0F0F0) >> 4)) == + 0x3333333333333333); +} + +template<typename I> +SIMDJSON_NO_SANITIZE_UNDEFINED // We deliberately allow overflow here and check later +simdjson_inline bool parse_digit(const uint8_t c, I &i) { + const uint8_t digit = static_cast<uint8_t>(c - '0'); + if (digit > 9) { + return false; + } + // PERF NOTE: multiplication by 10 is cheaper than arbitrary integer multiplication + i = 10 * i + digit; // might overflow, we will handle the overflow later + return true; +} + +simdjson_inline bool is_digit(const uint8_t c) { + return static_cast<uint8_t>(c - '0') <= 9; +} + +simdjson_warn_unused simdjson_inline error_code parse_decimal_after_separator(simdjson_unused const uint8_t *const src, const uint8_t *&p, uint64_t &i, int64_t &exponent) { + // we continue with the fiction that we have an integer. If the + // floating point number is representable as x * 10^z for some integer + // z that fits in 53 bits, then we will be able to convert back the + // the integer into a float in a lossless manner. + const uint8_t *const first_after_period = p; + +#ifdef SIMDJSON_SWAR_NUMBER_PARSING +#if SIMDJSON_SWAR_NUMBER_PARSING + // this helps if we have lots of decimals! + // this turns out to be frequent enough. + if (is_made_of_eight_digits_fast(p)) { + i = i * 100000000 + parse_eight_digits_unrolled(p); + p += 8; + } +#endif // SIMDJSON_SWAR_NUMBER_PARSING +#endif // #ifdef SIMDJSON_SWAR_NUMBER_PARSING + // Unrolling the first digit makes a small difference on some implementations (e.g. westmere) + if (parse_digit(*p, i)) { ++p; } + while (parse_digit(*p, i)) { p++; } + exponent = first_after_period - p; + // Decimal without digits (123.) is illegal + if (exponent == 0) { + return INVALID_NUMBER(src); + } + return SUCCESS; +} + +simdjson_warn_unused simdjson_inline error_code parse_exponent(simdjson_unused const uint8_t *const src, const uint8_t *&p, int64_t &exponent) { + // Exp Sign: -123.456e[-]78 + bool neg_exp = ('-' == *p); + if (neg_exp || '+' == *p) { p++; } // Skip + as well + + // Exponent: -123.456e-[78] + auto start_exp = p; + int64_t exp_number = 0; + while (parse_digit(*p, exp_number)) { ++p; } + // It is possible for parse_digit to overflow. + // In particular, it could overflow to INT64_MIN, and we cannot do - INT64_MIN. + // Thus we *must* check for possible overflow before we negate exp_number. + + // Performance notes: it may seem like combining the two "simdjson_unlikely checks" below into + // a single simdjson_unlikely path would be faster. The reasoning is sound, but the compiler may + // not oblige and may, in fact, generate two distinct paths in any case. It might be + // possible to do uint64_t(p - start_exp - 1) >= 18 but it could end up trading off + // instructions for a simdjson_likely branch, an unconclusive gain. + + // If there were no digits, it's an error. + if (simdjson_unlikely(p == start_exp)) { + return INVALID_NUMBER(src); + } + // We have a valid positive exponent in exp_number at this point, except that + // it may have overflowed. + + // If there were more than 18 digits, we may have overflowed the integer. We have to do + // something!!!! + if (simdjson_unlikely(p > start_exp+18)) { + // Skip leading zeroes: 1e000000000000000000001 is technically valid and does not overflow + while (*start_exp == '0') { start_exp++; } + // 19 digits could overflow int64_t and is kind of absurd anyway. We don't + // support exponents smaller than -999,999,999,999,999,999 and bigger + // than 999,999,999,999,999,999. + // We can truncate. + // Note that 999999999999999999 is assuredly too large. The maximal ieee64 value before + // infinity is ~1.8e308. The smallest subnormal is ~5e-324. So, actually, we could + // truncate at 324. + // Note that there is no reason to fail per se at this point in time. + // E.g., 0e999999999999999999999 is a fine number. + if (p > start_exp+18) { exp_number = 999999999999999999; } + } + // At this point, we know that exp_number is a sane, positive, signed integer. + // It is <= 999,999,999,999,999,999. As long as 'exponent' is in + // [-8223372036854775808, 8223372036854775808], we won't overflow. Because 'exponent' + // is bounded in magnitude by the size of the JSON input, we are fine in this universe. + // To sum it up: the next line should never overflow. + exponent += (neg_exp ? -exp_number : exp_number); + return SUCCESS; +} + +simdjson_inline bool check_if_integer(const uint8_t *const src, size_t max_length) { + const uint8_t *const srcend = src + max_length; + bool negative = (*src == '-'); // we can always read at least one character after the '-' + const uint8_t *p = src + uint8_t(negative); + if(p == srcend) { return false; } + if(*p == '0') { + ++p; + if(p == srcend) { return true; } + if(jsoncharutils::is_not_structural_or_whitespace(*p)) { return false; } + return true; + } + while(p != srcend && is_digit(*p)) { ++p; } + if(p == srcend) { return true; } + if(jsoncharutils::is_not_structural_or_whitespace(*p)) { return false; } + return true; +} + +simdjson_inline size_t significant_digits(const uint8_t * start_digits, size_t digit_count) { + // It is possible that the integer had an overflow. + // We have to handle the case where we have 0.0000somenumber. + const uint8_t *start = start_digits; + while ((*start == '0') || (*start == '.')) { ++start; } + // we over-decrement by one when there is a '.' + return digit_count - size_t(start - start_digits); +} + +} // unnamed namespace + +/** @private */ +static error_code slow_float_parsing(simdjson_unused const uint8_t * src, double* answer) { + if (parse_float_fallback(src, answer)) { + return SUCCESS; + } + return INVALID_NUMBER(src); +} + +/** @private */ +template<typename W> +simdjson_warn_unused simdjson_inline error_code write_float(const uint8_t *const src, bool negative, uint64_t i, const uint8_t * start_digits, size_t digit_count, int64_t exponent, W &writer) { + // If we frequently had to deal with long strings of digits, + // we could extend our code by using a 128-bit integer instead + // of a 64-bit integer. However, this is uncommon in practice. + // + // 9999999999999999999 < 2**64 so we can accommodate 19 digits. + // If we have a decimal separator, then digit_count - 1 is the number of digits, but we + // may not have a decimal separator! + if (simdjson_unlikely(digit_count > 19 && significant_digits(start_digits, digit_count) > 19)) { + // Ok, chances are good that we had an overflow! + // this is almost never going to get called!!! + // we start anew, going slowly!!! + // This will happen in the following examples: + // 10000000000000000000000000000000000000000000e+308 + // 3.1415926535897932384626433832795028841971693993751 + // + // NOTE: We do not pass a reference to the to slow_float_parsing. If we passed our writer + // reference to it, it would force it to be stored in memory, preventing the compiler from + // picking it apart and putting into registers. i.e. if we pass it as reference, + // it gets slow. + double d; + error_code error = slow_float_parsing(src, &d); + writer.append_double(d); + return error; + } + // NOTE: it's weird that the simdjson_unlikely() only wraps half the if, but it seems to get slower any other + // way we've tried: https://github.com/simdjson/simdjson/pull/990#discussion_r448497331 + // To future reader: we'd love if someone found a better way, or at least could explain this result! + if (simdjson_unlikely(exponent < simdjson::internal::smallest_power) || (exponent > simdjson::internal::largest_power)) { + // + // Important: smallest_power is such that it leads to a zero value. + // Observe that 18446744073709551615e-343 == 0, i.e. (2**64 - 1) e -343 is zero + // so something x 10^-343 goes to zero, but not so with something x 10^-342. + static_assert(simdjson::internal::smallest_power <= -342, "smallest_power is not small enough"); + // + if((exponent < simdjson::internal::smallest_power) || (i == 0)) { + // E.g. Parse "-0.0e-999" into the same value as "-0.0". See https://en.wikipedia.org/wiki/Signed_zero + WRITE_DOUBLE(negative ? -0.0 : 0.0, src, writer); + return SUCCESS; + } else { // (exponent > largest_power) and (i != 0) + // We have, for sure, an infinite value and simdjson refuses to parse infinite values. + return INVALID_NUMBER(src); + } + } + double d; + if (!compute_float_64(exponent, i, negative, d)) { + // we are almost never going to get here. + if (!parse_float_fallback(src, &d)) { return INVALID_NUMBER(src); } + } + WRITE_DOUBLE(d, src, writer); + return SUCCESS; +} + +// parse the number at src +// define JSON_TEST_NUMBERS for unit testing +// +// It is assumed that the number is followed by a structural ({,},],[) character +// or a white space character. If that is not the case (e.g., when the JSON +// document is made of a single number), then it is necessary to copy the +// content and append a space before calling this function. +// +// Our objective is accurate parsing (ULP of 0) at high speed. +template<typename W> +simdjson_warn_unused simdjson_inline error_code parse_number(const uint8_t *const src, W &writer); + +// for performance analysis, it is sometimes useful to skip parsing +#ifdef SIMDJSON_SKIPNUMBERPARSING + +template<typename W> +simdjson_warn_unused simdjson_inline error_code parse_number(const uint8_t *const, W &writer) { + writer.append_s64(0); // always write zero + return SUCCESS; // always succeeds +} + +simdjson_unused simdjson_inline simdjson_result<uint64_t> parse_unsigned(const uint8_t * const src) noexcept { return 0; } +simdjson_unused simdjson_inline simdjson_result<int64_t> parse_integer(const uint8_t * const src) noexcept { return 0; } +simdjson_unused simdjson_inline simdjson_result<double> parse_double(const uint8_t * const src) noexcept { return 0; } +simdjson_unused simdjson_inline simdjson_result<uint64_t> parse_unsigned_in_string(const uint8_t * const src) noexcept { return 0; } +simdjson_unused simdjson_inline simdjson_result<int64_t> parse_integer_in_string(const uint8_t * const src) noexcept { return 0; } +simdjson_unused simdjson_inline simdjson_result<double> parse_double_in_string(const uint8_t * const src) noexcept { return 0; } +simdjson_unused simdjson_inline bool is_negative(const uint8_t * src) noexcept { return false; } +simdjson_unused simdjson_inline simdjson_result<bool> is_integer(const uint8_t * src) noexcept { return false; } +simdjson_unused simdjson_inline simdjson_result<number_type> get_number_type(const uint8_t * src) noexcept { return number_type::signed_integer; } +#else + +// parse the number at src +// define JSON_TEST_NUMBERS for unit testing +// +// It is assumed that the number is followed by a structural ({,},],[) character +// or a white space character. If that is not the case (e.g., when the JSON +// document is made of a single number), then it is necessary to copy the +// content and append a space before calling this function. +// +// Our objective is accurate parsing (ULP of 0) at high speed. +template<typename W> +simdjson_warn_unused simdjson_inline error_code parse_number(const uint8_t *const src, W &writer) { + // + // Check for minus sign + // + bool negative = (*src == '-'); + const uint8_t *p = src + uint8_t(negative); + + // + // Parse the integer part. + // + // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare + const uint8_t *const start_digits = p; + uint64_t i = 0; + while (parse_digit(*p, i)) { p++; } + + // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error. + // Optimization note: size_t is expected to be unsigned. + size_t digit_count = size_t(p - start_digits); + if (digit_count == 0 || ('0' == *start_digits && digit_count > 1)) { return INVALID_NUMBER(src); } + + // + // Handle floats if there is a . or e (or both) + // + int64_t exponent = 0; + bool is_float = false; + if ('.' == *p) { + is_float = true; + ++p; + SIMDJSON_TRY( parse_decimal_after_separator(src, p, i, exponent) ); + digit_count = int(p - start_digits); // used later to guard against overflows + } + if (('e' == *p) || ('E' == *p)) { + is_float = true; + ++p; + SIMDJSON_TRY( parse_exponent(src, p, exponent) ); + } + if (is_float) { + const bool dirty_end = jsoncharutils::is_not_structural_or_whitespace(*p); + SIMDJSON_TRY( write_float(src, negative, i, start_digits, digit_count, exponent, writer) ); + if (dirty_end) { return INVALID_NUMBER(src); } + return SUCCESS; + } + + // The longest negative 64-bit number is 19 digits. + // The longest positive 64-bit number is 20 digits. + // We do it this way so we don't trigger this branch unless we must. + size_t longest_digit_count = negative ? 19 : 20; + if (digit_count > longest_digit_count) { return BIGINT_NUMBER(src); } + if (digit_count == longest_digit_count) { + if (negative) { + // Anything negative above INT64_MAX+1 is invalid + if (i > uint64_t(INT64_MAX)+1) { return BIGINT_NUMBER(src); } + WRITE_INTEGER(~i+1, src, writer); + if (jsoncharutils::is_not_structural_or_whitespace(*p)) { return INVALID_NUMBER(src); } + return SUCCESS; + // Positive overflow check: + // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the + // biggest uint64_t. + // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX. + // If we got here, it's a 20 digit number starting with the digit "1". + // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller + // than 1,553,255,926,290,448,384. + // - That is smaller than the smallest possible 20-digit number the user could write: + // 10,000,000,000,000,000,000. + // - Therefore, if the number is positive and lower than that, it's overflow. + // - The value we are looking at is less than or equal to INT64_MAX. + // + } else if (src[0] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INVALID_NUMBER(src); } + } + + // Write unsigned if it does not fit in a signed integer. + if (i > uint64_t(INT64_MAX)) { + WRITE_UNSIGNED(i, src, writer); + } else { +#if SIMDJSON_MINUS_ZERO_AS_FLOAT + if(i == 0 && negative) { + // We have to write -0.0 instead of 0 + WRITE_DOUBLE(-0.0, src, writer); + } else { + WRITE_INTEGER(negative ? (~i+1) : i, src, writer); + } +#else + WRITE_INTEGER(negative ? (~i+1) : i, src, writer); +#endif + } + if (jsoncharutils::is_not_structural_or_whitespace(*p)) { return INVALID_NUMBER(src); } + return SUCCESS; +} + +// Inlineable functions +namespace { + +// This table can be used to characterize the final character of an integer +// string. For JSON structural character and allowable white space characters, +// we return SUCCESS. For 'e', '.' and 'E', we return INCORRECT_TYPE. Otherwise +// we return NUMBER_ERROR. +// Optimization note: we could easily reduce the size of the table by half (to 128) +// at the cost of an extra branch. +// Optimization note: we want the values to use at most 8 bits (not, e.g., 32 bits): +static_assert(error_code(uint8_t(NUMBER_ERROR))== NUMBER_ERROR, "bad NUMBER_ERROR cast"); +static_assert(error_code(uint8_t(SUCCESS))== SUCCESS, "bad NUMBER_ERROR cast"); +static_assert(error_code(uint8_t(INCORRECT_TYPE))== INCORRECT_TYPE, "bad NUMBER_ERROR cast"); + +const uint8_t integer_string_finisher[256] = { + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, SUCCESS, + SUCCESS, NUMBER_ERROR, NUMBER_ERROR, SUCCESS, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, SUCCESS, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, SUCCESS, + NUMBER_ERROR, INCORRECT_TYPE, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, SUCCESS, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, INCORRECT_TYPE, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, SUCCESS, NUMBER_ERROR, SUCCESS, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, INCORRECT_TYPE, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, SUCCESS, NUMBER_ERROR, + SUCCESS, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR}; + +// Parse any number from 0 to 18,446,744,073,709,551,615 +simdjson_unused simdjson_inline simdjson_result<uint64_t> parse_unsigned(const uint8_t * const src) noexcept { + const uint8_t *p = src; + // + // Parse the integer part. + // + // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare + const uint8_t *const start_digits = p; + uint64_t i = 0; + while (parse_digit(*p, i)) { p++; } + + // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error. + // Optimization note: size_t is expected to be unsigned. + size_t digit_count = size_t(p - start_digits); + // The longest positive 64-bit number is 20 digits. + // We do it this way so we don't trigger this branch unless we must. + // Optimization note: the compiler can probably merge + // ((digit_count == 0) || (digit_count > 20)) + // into a single branch since digit_count is unsigned. + if ((digit_count == 0) || (digit_count > 20)) { return INCORRECT_TYPE; } + // Here digit_count > 0. + if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; } + // We can do the following... + // if (!jsoncharutils::is_structural_or_whitespace(*p)) { + // return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR; + // } + // as a single table lookup: + if (integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); } + + if (digit_count == 20) { + // Positive overflow check: + // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the + // biggest uint64_t. + // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX. + // If we got here, it's a 20 digit number starting with the digit "1". + // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller + // than 1,553,255,926,290,448,384. + // - That is smaller than the smallest possible 20-digit number the user could write: + // 10,000,000,000,000,000,000. + // - Therefore, if the number is positive and lower than that, it's overflow. + // - The value we are looking at is less than or equal to INT64_MAX. + // + if (src[0] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INCORRECT_TYPE; } + } + + return i; +} + + +// Parse any number from 0 to 18,446,744,073,709,551,615 +// Never read at src_end or beyond +simdjson_unused simdjson_inline simdjson_result<uint64_t> parse_unsigned(const uint8_t * const src, const uint8_t * const src_end) noexcept { + const uint8_t *p = src; + // + // Parse the integer part. + // + // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare + const uint8_t *const start_digits = p; + uint64_t i = 0; + while ((p != src_end) && parse_digit(*p, i)) { p++; } + + // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error. + // Optimization note: size_t is expected to be unsigned. + size_t digit_count = size_t(p - start_digits); + // The longest positive 64-bit number is 20 digits. + // We do it this way so we don't trigger this branch unless we must. + // Optimization note: the compiler can probably merge + // ((digit_count == 0) || (digit_count > 20)) + // into a single branch since digit_count is unsigned. + if ((digit_count == 0) || (digit_count > 20)) { return INCORRECT_TYPE; } + // Here digit_count > 0. + if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; } + // We can do the following... + // if (!jsoncharutils::is_structural_or_whitespace(*p)) { + // return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR; + // } + // as a single table lookup: + if ((p != src_end) && integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); } + + if (digit_count == 20) { + // Positive overflow check: + // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the + // biggest uint64_t. + // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX. + // If we got here, it's a 20 digit number starting with the digit "1". + // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller + // than 1,553,255,926,290,448,384. + // - That is smaller than the smallest possible 20-digit number the user could write: + // 10,000,000,000,000,000,000. + // - Therefore, if the number is positive and lower than that, it's overflow. + // - The value we are looking at is less than or equal to INT64_MAX. + // + if (src[0] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INCORRECT_TYPE; } + } + + return i; +} + +// Parse any number from 0 to 18,446,744,073,709,551,615 +simdjson_unused simdjson_inline simdjson_result<uint64_t> parse_unsigned_in_string(const uint8_t * const src) noexcept { + const uint8_t *p = src + 1; + // + // Parse the integer part. + // + // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare + const uint8_t *const start_digits = p; + uint64_t i = 0; + while (parse_digit(*p, i)) { p++; } + + // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error. + // Optimization note: size_t is expected to be unsigned. + size_t digit_count = size_t(p - start_digits); + // The longest positive 64-bit number is 20 digits. + // We do it this way so we don't trigger this branch unless we must. + // Optimization note: the compiler can probably merge + // ((digit_count == 0) || (digit_count > 20)) + // into a single branch since digit_count is unsigned. + if ((digit_count == 0) || (digit_count > 20)) { return INCORRECT_TYPE; } + // Here digit_count > 0. + if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; } + // We can do the following... + // if (!jsoncharutils::is_structural_or_whitespace(*p)) { + // return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR; + // } + // as a single table lookup: + if (*p != '"') { return NUMBER_ERROR; } + + if (digit_count == 20) { + // Positive overflow check: + // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the + // biggest uint64_t. + // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX. + // If we got here, it's a 20 digit number starting with the digit "1". + // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller + // than 1,553,255,926,290,448,384. + // - That is smaller than the smallest possible 20-digit number the user could write: + // 10,000,000,000,000,000,000. + // - Therefore, if the number is positive and lower than that, it's overflow. + // - The value we are looking at is less than or equal to INT64_MAX. + // + // Note: we use src[1] and not src[0] because src[0] is the quote character in this + // instance. + if (src[1] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INCORRECT_TYPE; } + } + + return i; +} + +// Parse any number from -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 +simdjson_unused simdjson_inline simdjson_result<int64_t> parse_integer(const uint8_t *src) noexcept { + // + // Check for minus sign + // + bool negative = (*src == '-'); + const uint8_t *p = src + uint8_t(negative); + + // + // Parse the integer part. + // + // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare + const uint8_t *const start_digits = p; + uint64_t i = 0; + while (parse_digit(*p, i)) { p++; } + + // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error. + // Optimization note: size_t is expected to be unsigned. + size_t digit_count = size_t(p - start_digits); + // We go from + // -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 + // so we can never represent numbers that have more than 19 digits. + size_t longest_digit_count = 19; + // Optimization note: the compiler can probably merge + // ((digit_count == 0) || (digit_count > longest_digit_count)) + // into a single branch since digit_count is unsigned. + if ((digit_count == 0) || (digit_count > longest_digit_count)) { return INCORRECT_TYPE; } + // Here digit_count > 0. + if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; } + // We can do the following... + // if (!jsoncharutils::is_structural_or_whitespace(*p)) { + // return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR; + // } + // as a single table lookup: + if(integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); } + // Negative numbers have can go down to - INT64_MAX - 1 whereas positive numbers are limited to INT64_MAX. + // Performance note: This check is only needed when digit_count == longest_digit_count but it is + // so cheap that we might as well always make it. + if(i > uint64_t(INT64_MAX) + uint64_t(negative)) { return INCORRECT_TYPE; } + return negative ? (~i+1) : i; +} + +// Parse any number from -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 +// Never read at src_end or beyond +simdjson_unused simdjson_inline simdjson_result<int64_t> parse_integer(const uint8_t * const src, const uint8_t * const src_end) noexcept { + // + // Check for minus sign + // + if(src == src_end) { return NUMBER_ERROR; } + bool negative = (*src == '-'); + const uint8_t *p = src + uint8_t(negative); + + // + // Parse the integer part. + // + // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare + const uint8_t *const start_digits = p; + uint64_t i = 0; + while ((p != src_end) && parse_digit(*p, i)) { p++; } + + // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error. + // Optimization note: size_t is expected to be unsigned. + size_t digit_count = size_t(p - start_digits); + // We go from + // -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 + // so we can never represent numbers that have more than 19 digits. + size_t longest_digit_count = 19; + // Optimization note: the compiler can probably merge + // ((digit_count == 0) || (digit_count > longest_digit_count)) + // into a single branch since digit_count is unsigned. + if ((digit_count == 0) || (digit_count > longest_digit_count)) { return INCORRECT_TYPE; } + // Here digit_count > 0. + if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; } + // We can do the following... + // if (!jsoncharutils::is_structural_or_whitespace(*p)) { + // return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR; + // } + // as a single table lookup: + if((p != src_end) && integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); } + // Negative numbers have can go down to - INT64_MAX - 1 whereas positive numbers are limited to INT64_MAX. + // Performance note: This check is only needed when digit_count == longest_digit_count but it is + // so cheap that we might as well always make it. + if(i > uint64_t(INT64_MAX) + uint64_t(negative)) { return INCORRECT_TYPE; } + return negative ? (~i+1) : i; +} + +// Parse any number from -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 +simdjson_unused simdjson_inline simdjson_result<int64_t> parse_integer_in_string(const uint8_t *src) noexcept { + // + // Check for minus sign + // + bool negative = (*(src + 1) == '-'); + src += uint8_t(negative) + 1; + + // + // Parse the integer part. + // + // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare + const uint8_t *const start_digits = src; + uint64_t i = 0; + while (parse_digit(*src, i)) { src++; } + + // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error. + // Optimization note: size_t is expected to be unsigned. + size_t digit_count = size_t(src - start_digits); + // We go from + // -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 + // so we can never represent numbers that have more than 19 digits. + size_t longest_digit_count = 19; + // Optimization note: the compiler can probably merge + // ((digit_count == 0) || (digit_count > longest_digit_count)) + // into a single branch since digit_count is unsigned. + if ((digit_count == 0) || (digit_count > longest_digit_count)) { return INCORRECT_TYPE; } + // Here digit_count > 0. + if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; } + // We can do the following... + // if (!jsoncharutils::is_structural_or_whitespace(*src)) { + // return (*src == '.' || *src == 'e' || *src == 'E') ? INCORRECT_TYPE : NUMBER_ERROR; + // } + // as a single table lookup: + if(*src != '"') { return NUMBER_ERROR; } + // Negative numbers have can go down to - INT64_MAX - 1 whereas positive numbers are limited to INT64_MAX. + // Performance note: This check is only needed when digit_count == longest_digit_count but it is + // so cheap that we might as well always make it. + if(i > uint64_t(INT64_MAX) + uint64_t(negative)) { return INCORRECT_TYPE; } + return negative ? (~i+1) : i; +} + +simdjson_unused simdjson_inline simdjson_result<double> parse_double(const uint8_t * src) noexcept { + // + // Check for minus sign + // + bool negative = (*src == '-'); + src += uint8_t(negative); + + // + // Parse the integer part. + // + uint64_t i = 0; + const uint8_t *p = src; + p += parse_digit(*p, i); + bool leading_zero = (i == 0); + while (parse_digit(*p, i)) { p++; } + // no integer digits, or 0123 (zero must be solo) + if ( p == src ) { return INCORRECT_TYPE; } + if ( (leading_zero && p != src+1)) { return NUMBER_ERROR; } + + // + // Parse the decimal part. + // + int64_t exponent = 0; + bool overflow; + if (simdjson_likely(*p == '.')) { + p++; + const uint8_t *start_decimal_digits = p; + if (!parse_digit(*p, i)) { return NUMBER_ERROR; } // no decimal digits + p++; + while (parse_digit(*p, i)) { p++; } + exponent = -(p - start_decimal_digits); + + // Overflow check. More than 19 digits (minus the decimal) may be overflow. + overflow = p-src-1 > 19; + if (simdjson_unlikely(overflow && leading_zero)) { + // Skip leading 0.00000 and see if it still overflows + const uint8_t *start_digits = src + 2; + while (*start_digits == '0') { start_digits++; } + overflow = p-start_digits > 19; + } + } else { + overflow = p-src > 19; + } + + // + // Parse the exponent + // + if (*p == 'e' || *p == 'E') { + p++; + bool exp_neg = *p == '-'; + p += exp_neg || *p == '+'; + + uint64_t exp = 0; + const uint8_t *start_exp_digits = p; + while (parse_digit(*p, exp)) { p++; } + // no exp digits, or 20+ exp digits + if (p-start_exp_digits == 0 || p-start_exp_digits > 19) { return NUMBER_ERROR; } + + exponent += exp_neg ? 0-exp : exp; + } + + if (jsoncharutils::is_not_structural_or_whitespace(*p)) { return NUMBER_ERROR; } + + overflow = overflow || exponent < simdjson::internal::smallest_power || exponent > simdjson::internal::largest_power; + + // + // Assemble (or slow-parse) the float + // + double d; + if (simdjson_likely(!overflow)) { + if (compute_float_64(exponent, i, negative, d)) { return d; } + } + if (!parse_float_fallback(src - uint8_t(negative), &d)) { + return NUMBER_ERROR; + } + return d; +} + +simdjson_unused simdjson_inline bool is_negative(const uint8_t * src) noexcept { + return (*src == '-'); +} + +simdjson_unused simdjson_inline simdjson_result<bool> is_integer(const uint8_t * src) noexcept { + bool negative = (*src == '-'); + src += uint8_t(negative); + const uint8_t *p = src; + while(static_cast<uint8_t>(*p - '0') <= 9) { p++; } + if ( p == src ) { return NUMBER_ERROR; } + if (jsoncharutils::is_structural_or_whitespace(*p)) { return true; } + return false; +} + +simdjson_unused simdjson_inline simdjson_result<number_type> get_number_type(const uint8_t * src) noexcept { + bool negative = (*src == '-'); + src += uint8_t(negative); + const uint8_t *p = src; + while(static_cast<uint8_t>(*p - '0') <= 9) { p++; } + size_t digit_count = size_t(p - src); + if ( p == src ) { return NUMBER_ERROR; } + if (jsoncharutils::is_structural_or_whitespace(*p)) { + static const uint8_t * smaller_big_integer = reinterpret_cast<const uint8_t *>("9223372036854775808"); + // We have an integer. + if(simdjson_unlikely(digit_count > 20)) { + return number_type::big_integer; + } + // If the number is negative and valid, it must be a signed integer. + if(negative) { + if (simdjson_unlikely(digit_count > 19)) return number_type::big_integer; + if (simdjson_unlikely(digit_count == 19 && memcmp(src, smaller_big_integer, 19) > 0)) { + return number_type::big_integer; + } +#if SIMDJSON_MINUS_ZERO_AS_FLOAT + if(digit_count == 1 && src[0] == '0') { + // We have to write -0.0 instead of 0 + return number_type::floating_point_number; + } +#endif + return number_type::signed_integer; + } + // Let us check if we have a big integer (>=2**64). + static const uint8_t * two_to_sixtyfour = reinterpret_cast<const uint8_t *>("18446744073709551616"); + if((digit_count > 20) || (digit_count == 20 && memcmp(src, two_to_sixtyfour, 20) >= 0)) { + return number_type::big_integer; + } + // The number is positive and smaller than 18446744073709551616 (or 2**64). + // We want values larger or equal to 9223372036854775808 to be unsigned + // integers, and the other values to be signed integers. + if((digit_count == 20) || (digit_count >= 19 && memcmp(src, smaller_big_integer, 19) >= 0)) { + return number_type::unsigned_integer; + } + return number_type::signed_integer; + } + // Hopefully, we have 'e' or 'E' or '.'. + return number_type::floating_point_number; +} + +// Never read at src_end or beyond +simdjson_unused simdjson_inline simdjson_result<double> parse_double(const uint8_t * src, const uint8_t * const src_end) noexcept { + if(src == src_end) { return NUMBER_ERROR; } + // + // Check for minus sign + // + bool negative = (*src == '-'); + src += uint8_t(negative); + + // + // Parse the integer part. + // + uint64_t i = 0; + const uint8_t *p = src; + if(p == src_end) { return NUMBER_ERROR; } + p += parse_digit(*p, i); + bool leading_zero = (i == 0); + while ((p != src_end) && parse_digit(*p, i)) { p++; } + // no integer digits, or 0123 (zero must be solo) + if ( p == src ) { return INCORRECT_TYPE; } + if ( (leading_zero && p != src+1)) { return NUMBER_ERROR; } + + // + // Parse the decimal part. + // + int64_t exponent = 0; + bool overflow; + if (simdjson_likely((p != src_end) && (*p == '.'))) { + p++; + const uint8_t *start_decimal_digits = p; + if ((p == src_end) || !parse_digit(*p, i)) { return NUMBER_ERROR; } // no decimal digits + p++; + while ((p != src_end) && parse_digit(*p, i)) { p++; } + exponent = -(p - start_decimal_digits); + + // Overflow check. More than 19 digits (minus the decimal) may be overflow. + overflow = p-src-1 > 19; + if (simdjson_unlikely(overflow && leading_zero)) { + // Skip leading 0.00000 and see if it still overflows + const uint8_t *start_digits = src + 2; + while (*start_digits == '0') { start_digits++; } + overflow = start_digits-src > 19; + } + } else { + overflow = p-src > 19; + } + + // + // Parse the exponent + // + if ((p != src_end) && (*p == 'e' || *p == 'E')) { + p++; + if(p == src_end) { return NUMBER_ERROR; } + bool exp_neg = *p == '-'; + p += exp_neg || *p == '+'; + + uint64_t exp = 0; + const uint8_t *start_exp_digits = p; + while ((p != src_end) && parse_digit(*p, exp)) { p++; } + // no exp digits, or 20+ exp digits + if (p-start_exp_digits == 0 || p-start_exp_digits > 19) { return NUMBER_ERROR; } + + exponent += exp_neg ? 0-exp : exp; + } + + if ((p != src_end) && jsoncharutils::is_not_structural_or_whitespace(*p)) { return NUMBER_ERROR; } + + overflow = overflow || exponent < simdjson::internal::smallest_power || exponent > simdjson::internal::largest_power; + + // + // Assemble (or slow-parse) the float + // + double d; + if (simdjson_likely(!overflow)) { + if (compute_float_64(exponent, i, negative, d)) { return d; } + } + if (!parse_float_fallback(src - uint8_t(negative), src_end, &d)) { + return NUMBER_ERROR; + } + return d; +} + +simdjson_unused simdjson_inline simdjson_result<double> parse_double_in_string(const uint8_t * src) noexcept { + // + // Check for minus sign + // + bool negative = (*(src + 1) == '-'); + src += uint8_t(negative) + 1; + + // + // Parse the integer part. + // + uint64_t i = 0; + const uint8_t *p = src; + p += parse_digit(*p, i); + bool leading_zero = (i == 0); + while (parse_digit(*p, i)) { p++; } + // no integer digits, or 0123 (zero must be solo) + if ( p == src ) { return INCORRECT_TYPE; } + if ( (leading_zero && p != src+1)) { return NUMBER_ERROR; } + + // + // Parse the decimal part. + // + int64_t exponent = 0; + bool overflow; + if (simdjson_likely(*p == '.')) { + p++; + const uint8_t *start_decimal_digits = p; + if (!parse_digit(*p, i)) { return NUMBER_ERROR; } // no decimal digits + p++; + while (parse_digit(*p, i)) { p++; } + exponent = -(p - start_decimal_digits); + + // Overflow check. More than 19 digits (minus the decimal) may be overflow. + overflow = p-src-1 > 19; + if (simdjson_unlikely(overflow && leading_zero)) { + // Skip leading 0.00000 and see if it still overflows + const uint8_t *start_digits = src + 2; + while (*start_digits == '0') { start_digits++; } + overflow = p-start_digits > 19; + } + } else { + overflow = p-src > 19; + } + + // + // Parse the exponent + // + if (*p == 'e' || *p == 'E') { + p++; + bool exp_neg = *p == '-'; + p += exp_neg || *p == '+'; + + uint64_t exp = 0; + const uint8_t *start_exp_digits = p; + while (parse_digit(*p, exp)) { p++; } + // no exp digits, or 20+ exp digits + if (p-start_exp_digits == 0 || p-start_exp_digits > 19) { return NUMBER_ERROR; } + + exponent += exp_neg ? 0-exp : exp; + } + + if (*p != '"') { return NUMBER_ERROR; } + + overflow = overflow || exponent < simdjson::internal::smallest_power || exponent > simdjson::internal::largest_power; + + // + // Assemble (or slow-parse) the float + // + double d; + if (simdjson_likely(!overflow)) { + if (compute_float_64(exponent, i, negative, d)) { return d; } + } + if (!parse_float_fallback(src - uint8_t(negative), &d)) { + return NUMBER_ERROR; + } + return d; +} + +} // unnamed namespace +#endif // SIMDJSON_SKIPNUMBERPARSING + +} // namespace numberparsing + +inline std::ostream& operator<<(std::ostream& out, number_type type) noexcept { + switch (type) { + case number_type::signed_integer: out << "integer in [-9223372036854775808,9223372036854775808)"; break; + case number_type::unsigned_integer: out << "unsigned integer in [9223372036854775808,18446744073709551616)"; break; + case number_type::floating_point_number: out << "floating-point number (binary64)"; break; + case number_type::big_integer: out << "big integer"; break; + default: SIMDJSON_UNREACHABLE(); + } + return out; +} + +} // namespace rvv_vls +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_NUMBERPARSING_H +/* end file simdjson/generic/numberparsing.h for rvv_vls */ + +/* including simdjson/generic/implementation_simdjson_result_base-inl.h for rvv_vls: #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */ +/* begin file simdjson/generic/implementation_simdjson_result_base-inl.h for rvv_vls */ +#ifndef SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace rvv_vls { + +// +// internal::implementation_simdjson_result_base<T> inline implementation +// + +template<typename T> +simdjson_inline void implementation_simdjson_result_base<T>::tie(T &value, error_code &error) && noexcept { + error = this->second; + if (!error) { + value = std::forward<implementation_simdjson_result_base<T>>(*this).first; + } +} + +template<typename T> +simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_base<T>::get(T &value) && noexcept { + error_code error; + std::forward<implementation_simdjson_result_base<T>>(*this).tie(value, error); + return error; +} + +template<typename T> +simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_base<T>::error() const noexcept { + return this->second; +} + + +template<typename T> +simdjson_warn_unused simdjson_inline bool implementation_simdjson_result_base<T>::has_value() const noexcept { + return this->error() == SUCCESS; +} + +#if SIMDJSON_EXCEPTIONS + +template<typename T> +simdjson_inline T& implementation_simdjson_result_base<T>::operator*() & noexcept(false) { + return this->value(); +} + +template<typename T> +simdjson_inline T&& implementation_simdjson_result_base<T>::operator*() && noexcept(false) { + return std::forward<implementation_simdjson_result_base<T>>(*this).value(); +} + +template<typename T> +simdjson_inline T* implementation_simdjson_result_base<T>::operator->() noexcept(false) { + if (this->error()) { throw simdjson_error(this->error()); } + return &this->first; +} + + +template<typename T> +simdjson_inline const T* implementation_simdjson_result_base<T>::operator->() const noexcept(false) { + if (this->error()) { throw simdjson_error(this->error()); } + return &this->first; +} + +template<typename T> +simdjson_inline T& implementation_simdjson_result_base<T>::value() & noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return this->first; +} + +template<typename T> +simdjson_inline T&& implementation_simdjson_result_base<T>::value() && noexcept(false) { + return std::forward<implementation_simdjson_result_base<T>>(*this).take_value(); +} + +template<typename T> +simdjson_inline T&& implementation_simdjson_result_base<T>::take_value() && noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return std::forward<T>(this->first); +} + +template<typename T> +simdjson_inline implementation_simdjson_result_base<T>::operator T&&() && noexcept(false) { + return std::forward<implementation_simdjson_result_base<T>>(*this).take_value(); +} + +#endif // SIMDJSON_EXCEPTIONS + +template<typename T> +simdjson_inline const T& implementation_simdjson_result_base<T>::value_unsafe() const& noexcept { + return this->first; +} + +template<typename T> +simdjson_inline T& implementation_simdjson_result_base<T>::value_unsafe() & noexcept { + return this->first; +} + +template<typename T> +simdjson_inline T&& implementation_simdjson_result_base<T>::value_unsafe() && noexcept { + return std::forward<T>(this->first); +} + +template<typename T> +simdjson_inline implementation_simdjson_result_base<T>::implementation_simdjson_result_base(T &&value, error_code error) noexcept + : first{std::forward<T>(value)}, second{error} {} +template<typename T> +simdjson_inline implementation_simdjson_result_base<T>::implementation_simdjson_result_base(error_code error) noexcept + : implementation_simdjson_result_base(T{}, error) {} +template<typename T> +simdjson_inline implementation_simdjson_result_base<T>::implementation_simdjson_result_base(T &&value) noexcept + : implementation_simdjson_result_base(std::forward<T>(value), SUCCESS) {} + +} // namespace rvv_vls +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H +/* end file simdjson/generic/implementation_simdjson_result_base-inl.h for rvv_vls */ +/* end file simdjson/generic/amalgamated.h for rvv_vls */ +/* including simdjson/rvv-vls/end.h: #include "simdjson/rvv-vls/end.h" */ +/* begin file simdjson/rvv-vls/end.h */ +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +/* undefining SIMDJSON_IMPLEMENTATION from "rvv_vls" */ +#undef SIMDJSON_IMPLEMENTATION +/* end file simdjson/rvv-vls/end.h */ + +#endif // SIMDJSON_RVV_VLS_H +/* end file simdjson/rvv-vls.h */ +/* including simdjson/rvv-vls/implementation.h: #include <simdjson/rvv-vls/implementation.h> */ +/* begin file simdjson/rvv-vls/implementation.h */ +#ifndef SIMDJSON_RVV_VLS_IMPLEMENTATION_H +#define SIMDJSON_RVV_VLS_IMPLEMENTATION_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/implementation.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace rvv_vls { + +/** + * @private + */ +class implementation final : public simdjson::implementation { +public: + simdjson_inline implementation() : simdjson::implementation( + "rvv_vls", + "RISC-V V extension", + 0 + ) {} + simdjson_warn_unused error_code create_dom_parser_implementation( + size_t capacity, + size_t max_length, + std::unique_ptr<simdjson::internal::dom_parser_implementation>& dst + ) const noexcept final; + simdjson_warn_unused error_code minify(const uint8_t *buf, size_t len, uint8_t *dst, size_t &dst_len) const noexcept final; + simdjson_warn_unused bool validate_utf8(const char *buf, size_t len) const noexcept final; +}; + +} // namespace rvv_vls +} // namespace simdjson + +#endif // SIMDJSON_RVV_VLS_IMPLEMENTATION_H +/* end file simdjson/rvv-vls/implementation.h */ + +/* including simdjson/rvv-vls/begin.h: #include <simdjson/rvv-vls/begin.h> */ +/* begin file simdjson/rvv-vls/begin.h */ +/* defining SIMDJSON_IMPLEMENTATION to "rvv_vls" */ +#define SIMDJSON_IMPLEMENTATION rvv_vls +/* including simdjson/rvv-vls/base.h: #include "simdjson/rvv-vls/base.h" */ +/* begin file simdjson/rvv-vls/base.h */ +#ifndef SIMDJSON_RVV_VLS_BASE_H +#define SIMDJSON_RVV_VLS_BASE_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +/** + * RVV-VLS implementation. + */ +namespace rvv_vls { + +class implementation; + +} // namespace rvv_vls +} // namespace simdjson + +#endif // SIMDJSON_RVV_VLS_BASE_H +/* end file simdjson/rvv-vls/base.h */ +/* including simdjson/rvv-vls/intrinsics.h: #include "simdjson/rvv-vls/intrinsics.h" */ +/* begin file simdjson/rvv-vls/intrinsics.h */ +#ifndef SIMDJSON_RVV_VLS_INTRINSICS_H +#define SIMDJSON_RVV_VLS_INTRINSICS_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#include <riscv_vector.h> + +#define simdutf_vrgather_u8m1x2(tbl, idx) \ + __riscv_vcreate_v_u8m1_u8m2( \ + __riscv_vrgather_vv_u8m1(tbl, __riscv_vget_v_u8m2_u8m1(idx, 0), \ + __riscv_vsetvlmax_e8m1()), \ + __riscv_vrgather_vv_u8m1(tbl, __riscv_vget_v_u8m2_u8m1(idx, 1), \ + __riscv_vsetvlmax_e8m1())) + +#define simdutf_vrgather_u8m1x4(tbl, idx) \ + __riscv_vcreate_v_u8m1_u8m4( \ + __riscv_vrgather_vv_u8m1(tbl, __riscv_vget_v_u8m4_u8m1(idx, 0), \ + __riscv_vsetvlmax_e8m1()), \ + __riscv_vrgather_vv_u8m1(tbl, __riscv_vget_v_u8m4_u8m1(idx, 1), \ + __riscv_vsetvlmax_e8m1()), \ + __riscv_vrgather_vv_u8m1(tbl, __riscv_vget_v_u8m4_u8m1(idx, 2), \ + __riscv_vsetvlmax_e8m1()), \ + __riscv_vrgather_vv_u8m1(tbl, __riscv_vget_v_u8m4_u8m1(idx, 3), \ + __riscv_vsetvlmax_e8m1())) + +#if __riscv_zbc +#include <riscv_bitmanip.h> +#endif + +#endif // SIMDJSON_RVV_VLS_INTRINSICS_H +/* end file simdjson/rvv-vls/intrinsics.h */ +/* including simdjson/rvv-vls/bitmanipulation.h: #include "simdjson/rvv-vls/bitmanipulation.h" */ +/* begin file simdjson/rvv-vls/bitmanipulation.h */ +#ifndef SIMDJSON_RVV_VLS_BITMANIPULATION_H +#define SIMDJSON_RVV_VLS_BITMANIPULATION_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace rvv_vls { +namespace { + +// We sometimes call trailing_zero on inputs that are zero, +// but the algorithms do not end up using the returned value. +// Sadly, sanitizers are not smart enough to figure it out. +SIMDJSON_NO_SANITIZE_UNDEFINED +// This function can be used safely even if not all bytes have been +// initialized. +// See issue https://github.com/simdjson/simdjson/issues/1965 +SIMDJSON_NO_SANITIZE_MEMORY +simdjson_inline int trailing_zeroes(uint64_t input_num) { + return __builtin_ctzll(input_num); +} + +/* result might be undefined when input_num is zero */ +simdjson_inline uint64_t clear_lowest_bit(uint64_t input_num) { + return input_num & (input_num-1); +} + +/* result might be undefined when input_num is zero */ +simdjson_inline int leading_zeroes(uint64_t input_num) { + return __builtin_clzll(input_num); +} + +simdjson_inline long long int count_ones(uint64_t input_num) { + return __builtin_popcountll(input_num); +} + +simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2, + uint64_t *result) { + return __builtin_uaddll_overflow(value1, value2, + reinterpret_cast<unsigned long long *>(result)); +} + +} // unnamed namespace +} // namespace rvv_vls +} // namespace simdjson + +#endif // SIMDJSON_RVV_VLS_BITMANIPULATION_H +/* end file simdjson/rvv-vls/bitmanipulation.h */ +/* including simdjson/rvv-vls/bitmask.h: #include "simdjson/rvv-vls/bitmask.h" */ +/* begin file simdjson/rvv-vls/bitmask.h */ +#ifndef SIMDJSON_RVV_VLS_BITMASK_H +#define SIMDJSON_RVV_VLS_BITMASK_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/intrinsics.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace rvv_vls { +namespace { + +// +// Perform a "cumulative bitwise xor," flipping bits each time a 1 is encountered. +// +// For example, prefix_xor(00100100) == 00011100 +// +simdjson_inline uint64_t prefix_xor(uint64_t bitmask) { +#if __riscv_zbc + return __riscv_clmul_64(bitmask, ~(uint64_t)0); +#elif __riscv_zvbc + return __riscv_vmv_x(__riscv_vclmul(__riscv_vmv_s_x_u64m1(bitmask, 1), ~(uint64_t)0, 1)); +#else + bitmask ^= bitmask << 1; + bitmask ^= bitmask << 2; + bitmask ^= bitmask << 4; + bitmask ^= bitmask << 8; + bitmask ^= bitmask << 16; + bitmask ^= bitmask << 32; +#endif + return bitmask; +} + +} // unnamed namespace +} // namespace rvv_vls +} // namespace simdjson + +#endif // SIMDJSON_RVV_VLS_BITMASK_H + +/* end file simdjson/rvv-vls/bitmask.h */ +/* including simdjson/rvv-vls/simd.h: #include "simdjson/rvv-vls/simd.h" */ +/* begin file simdjson/rvv-vls/simd.h */ +#ifndef SIMDJSON_RVV_VLS_SIMD_H +#define SIMDJSON_RVV_VLS_SIMD_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace rvv_vls { +namespace { +namespace simd { + +#if __riscv_v_fixed_vlen >= 512 + static constexpr size_t VL8 = 512/8; + using vint8_t = vint8m1_t __attribute__((riscv_rvv_vector_bits(512))); + using vuint8_t = vuint8m1_t __attribute__((riscv_rvv_vector_bits(512))); + using vbool_t = vbool8_t __attribute__((riscv_rvv_vector_bits(512/8))); + using vbitmask_t = uint64_t; +#else + static constexpr size_t VL8 = __riscv_v_fixed_vlen/8; + using vint8_t = vint8m1_t __attribute__((riscv_rvv_vector_bits(__riscv_v_fixed_vlen))); + using vuint8_t = vuint8m1_t __attribute__((riscv_rvv_vector_bits(__riscv_v_fixed_vlen))); + using vbool_t = vbool8_t __attribute__((riscv_rvv_vector_bits(__riscv_v_fixed_vlen/8))); + #if __riscv_v_fixed_vlen == 128 + using vbitmask_t = uint16_t; + #elif __riscv_v_fixed_vlen == 256 + using vbitmask_t = uint32_t; + #endif +#endif + +#if __riscv_v_fixed_vlen == 128 + using vuint8x64_t = vuint8m4_t __attribute__((riscv_rvv_vector_bits(512))); + using vboolx64_t = vbool2_t __attribute__((riscv_rvv_vector_bits(512/8))); +#elif __riscv_v_fixed_vlen == 256 + using vuint8x64_t = vuint8m2_t __attribute__((riscv_rvv_vector_bits(512))); + using vboolx64_t = vbool4_t __attribute__((riscv_rvv_vector_bits(512/8))); +#else + using vuint8x64_t = vuint8m1_t __attribute__((riscv_rvv_vector_bits(512))); + using vboolx64_t = vbool8_t __attribute__((riscv_rvv_vector_bits(512/8))); +#endif + + template<typename T> + struct simd8; + + // SIMD byte mask type (returned by things like eq and gt) + template<> + struct simd8<bool> { + vbool_t value; + using bitmask_t = vbitmask_t; + static constexpr int SIZE = sizeof(value); + + simdjson_inline simd8(const vbool_t _value) : value(_value) {} + simdjson_inline simd8() : simd8(__riscv_vmclr_m_b8(VL8)) {} + simdjson_inline simd8(bool _value) : simd8(splat(_value)) {} + + simdjson_inline operator const vbool_t&() const { return value; } + simdjson_inline operator vbool_t&() { return value; } + + static simdjson_inline simd8<bool> splat(bool _value) { + return __riscv_vreinterpret_b8(__riscv_vmv_v_x_u64m1(((uint64_t)!_value)-1, 1)); + } + + simdjson_inline vbitmask_t to_bitmask() const { +#if __riscv_v_fixed_vlen == 128 + return __riscv_vmv_x(__riscv_vreinterpret_u16m1(value)); +#elif __riscv_v_fixed_vlen == 256 + return __riscv_vmv_x(__riscv_vreinterpret_u32m1(value)); +#else + return __riscv_vmv_x(__riscv_vreinterpret_u64m1(value)); +#endif + } + + // Bit operations + simdjson_inline simd8<bool> operator|(const simd8<bool> other) const { return __riscv_vmor(*this, other, VL8); } + simdjson_inline simd8<bool> operator&(const simd8<bool> other) const { return __riscv_vmand(*this, other, VL8); } + simdjson_inline simd8<bool> operator^(const simd8<bool> other) const { return __riscv_vmxor(*this, other, VL8); } + simdjson_inline simd8<bool> bit_andnot(const simd8<bool> other) const { return __riscv_vmandn(other, *this, VL8); } + simdjson_inline simd8<bool> operator~() const { return __riscv_vmnot(*this, VL8); } + simdjson_inline simd8<bool>& operator|=(const simd8<bool> other) { auto this_cast = static_cast<simd8<bool>*>(this); *this_cast = *this_cast | other; return *this_cast; } + simdjson_inline simd8<bool>& operator&=(const simd8<bool> other) { auto this_cast = static_cast<simd8<bool>*>(this); *this_cast = *this_cast & other; return *this_cast; } + simdjson_inline simd8<bool>& operator^=(const simd8<bool> other) { auto this_cast = static_cast<simd8<bool>*>(this); *this_cast = *this_cast ^ other; return *this_cast; } + }; + + // Unsigned bytes + template<> + struct simd8<uint8_t> { + + vuint8_t value; + static constexpr int SIZE = sizeof(value); + + simdjson_inline simd8(const vuint8_t _value) : value(_value) {} + simdjson_inline simd8() : simd8(zero()) {} + simdjson_inline simd8(const uint8_t values[VL8]) : simd8(load(values)) {} + simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {} + simdjson_inline simd8(simd8<bool> mask) : value(__riscv_vmerge_vxm_u8m1(zero(), -1, (vbool_t)mask, VL8)) {} + + simdjson_inline operator const vuint8_t&() const { return this->value; } + simdjson_inline operator vuint8_t&() { return this->value; } + + simdjson_inline simd8( + uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, + uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 + ) : simd8(vuint8_t{ + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + }) {} + + // Repeat 16 values as many times as necessary (usually for lookup tables) + simdjson_inline static simd8<uint8_t> repeat_16( + uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, + uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 + ) { + return simd8<uint8_t>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + ); + } + + static simdjson_inline vuint8_t splat(uint8_t _value) { return __riscv_vmv_v_x_u8m1(_value, VL8); } + static simdjson_inline vuint8_t zero() { return splat(0); } + static simdjson_inline vuint8_t load(const uint8_t values[VL8]) { return __riscv_vle8_v_u8m1(values, VL8); } + + // Bit operations + simdjson_inline simd8<uint8_t> operator|(const simd8<uint8_t> other) const { return __riscv_vor_vv_u8m1( value, other, VL8); } + simdjson_inline simd8<uint8_t> operator&(const simd8<uint8_t> other) const { return __riscv_vand_vv_u8m1( value, other, VL8); } + simdjson_inline simd8<uint8_t> operator^(const simd8<uint8_t> other) const { return __riscv_vxor_vv_u8m1( value, other, VL8); } + simdjson_inline simd8<uint8_t> operator~() const { return __riscv_vnot_v_u8m1(value, VL8); } +#if __riscv_zvbb + simdjson_inline simd8<uint8_t> bit_andnot(const simd8<uint8_t> other) const { return __riscv_vandn_vv_u8m1(other, value, VL8); } +#else + simdjson_inline simd8<uint8_t> bit_andnot(const simd8<uint8_t> other) const { return other & ~*this; } +#endif + simdjson_inline simd8<uint8_t>& operator|=(const simd8<uint8_t> other) { value = *this | other; return *this; } + simdjson_inline simd8<uint8_t>& operator&=(const simd8<uint8_t> other) { value = *this & other; return *this; } + simdjson_inline simd8<uint8_t>& operator^=(const simd8<uint8_t> other) { value = *this ^ other; return *this; } + + simdjson_inline simd8<bool> operator==(const simd8<uint8_t> other) const { return __riscv_vmseq(value, other, VL8); } + simdjson_inline simd8<bool> operator==(uint8_t other) const { return __riscv_vmseq(value, other, VL8); } + + template<int N=1> + simdjson_inline simd8<uint8_t> prev(const simd8<uint8_t> prev_chunk) const { + return __riscv_vslideup(__riscv_vslidedown(prev_chunk, VL8-N, VL8), value, N, VL8); + } + + // Store to array + simdjson_inline void store(uint8_t dst[VL8]) const { return __riscv_vse8(dst, value, VL8); } + + // Saturated math + simdjson_inline simd8<uint8_t> saturating_add(const simd8<uint8_t> other) const { return __riscv_vsaddu(value, other, VL8); } + simdjson_inline simd8<uint8_t> saturating_sub(const simd8<uint8_t> other) const { return __riscv_vssubu(value, other, VL8); } + + // Addition/subtraction are the same for signed and unsigned + simdjson_inline simd8<uint8_t> operator+(const simd8<uint8_t> other) const { return __riscv_vadd(value, other, VL8); } + simdjson_inline simd8<uint8_t> operator-(const simd8<uint8_t> other) const { return __riscv_vsub(value, other, VL8); } + simdjson_inline simd8<uint8_t>& operator+=(const simd8<uint8_t> other) { value = *this + other; return *this; } + simdjson_inline simd8<uint8_t>& operator-=(const simd8<uint8_t> other) { value = *this - other; return *this; } + + // Order-specific operations + simdjson_inline simd8<bool> operator<=(const simd8<uint8_t> other) const { return __riscv_vmsleu(value, other, VL8); } + simdjson_inline simd8<bool> operator>=(const simd8<uint8_t> other) const { return __riscv_vmsgeu(value, other, VL8); } + simdjson_inline simd8<bool> operator<(const simd8<uint8_t> other) const { return __riscv_vmsltu(value, other, VL8); } + simdjson_inline simd8<bool> operator>(const simd8<uint8_t> other) const { return __riscv_vmsgtu(value, other, VL8); } + + // Same as >, but instead of guaranteeing all 1's == true, false = 0 and true = nonzero. + simdjson_inline simd8<uint8_t> gt_bits(const simd8<uint8_t> other) const { return simd8<uint8_t>(*this > other); } + // Same as <, but instead of guaranteeing all 1's == true, false = 0 and true = nonzero. + simdjson_inline simd8<uint8_t> lt_bits(const simd8<uint8_t> other) const { return simd8<uint8_t>(*this < other); } + + // Bit-specific operations + simdjson_inline bool any_bits_set_anywhere() const { + return __riscv_vfirst(__riscv_vmsne(value, 0, VL8), VL8) >= 0; + } + simdjson_inline bool any_bits_set_anywhere(simd8<uint8_t> bits) const { return (*this & bits).any_bits_set_anywhere(); } + template<int N> + simdjson_inline simd8<uint8_t> shr() const { return __riscv_vsrl(value, N, VL8); } + template<int N> + simdjson_inline simd8<uint8_t> shl() const { return __riscv_vsll(value, N, VL8); } + + + // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values) + template<typename L> + simdjson_inline simd8<L> lookup_16(simd8<L> lookup_table) const { + return __riscv_vrgather(lookup_table, value, VL8); + } + + // compress inactive elements, to match AVX-512 behavior + template<typename L> + simdjson_inline void compress(vbitmask_t mask, L * output) const { + mask = (vbitmask_t)~mask; +#if __riscv_v_fixed_vlen == 128 + vbool8_t m = __riscv_vreinterpret_b8(__riscv_vmv_s_x_u16m1(mask, 1)); +#elif __riscv_v_fixed_vlen == 256 + vbool8_t m = __riscv_vreinterpret_b8(__riscv_vmv_s_x_u32m1(mask, 1)); +#else + vbool8_t m = __riscv_vreinterpret_b8(__riscv_vmv_s_x_u64m1(mask, 1)); +#endif + __riscv_vse8_v_u8m1(output, __riscv_vcompress(value, m, VL8), count_ones(mask)); + } + + template<typename L> + simdjson_inline simd8<L> lookup_16( + L replace0, L replace1, L replace2, L replace3, + L replace4, L replace5, L replace6, L replace7, + L replace8, L replace9, L replace10, L replace11, + L replace12, L replace13, L replace14, L replace15) const { + return lookup_16(simd8<L>::repeat_16( + replace0, replace1, replace2, replace3, + replace4, replace5, replace6, replace7, + replace8, replace9, replace10, replace11, + replace12, replace13, replace14, replace15 + )); + } + }; + + // Signed bytes + template<> + struct simd8<int8_t> { + vint8_t value; + static constexpr int SIZE = sizeof(value); + + simdjson_inline simd8(const vint8_t _value) : value(_value) {} + simdjson_inline simd8() : simd8(zero()) {} + simdjson_inline simd8(const int8_t values[VL8]) : simd8(load(values)) {} + simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {} + + simdjson_inline operator const vint8_t&() const { return this->value; } + simdjson_inline operator vint8_t&() { return this->value; } + + simdjson_inline simd8( + int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, + int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 + ) : simd8(vint8_t{ + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + }) {} + + // Repeat 16 values as many times as necessary (usually for lookup tables) + simdjson_inline static simd8<int8_t> repeat_16( + int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, + int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 + ) { + return simd8<int8_t>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + ); + } + + static simdjson_inline vint8_t splat(int8_t _value) { return __riscv_vmv_v_x_i8m1(_value, VL8); } + static simdjson_inline vint8_t zero() { return splat(0); } + static simdjson_inline vint8_t load(const int8_t values[VL8]) { return __riscv_vle8_v_i8m1(values, VL8); } + + + simdjson_inline void store(int8_t dst[VL8]) const { return __riscv_vse8(dst, value, VL8); } + + // Explicit conversion to/from unsigned + simdjson_inline explicit simd8(const vuint8_t other): simd8(__riscv_vreinterpret_i8m1(other)) {} + simdjson_inline explicit operator simd8<uint8_t>() const { return __riscv_vreinterpret_u8m1(value); } + + // Math + simdjson_inline simd8<int8_t> operator+(const simd8<int8_t> other) const { return __riscv_vadd(value, other, VL8); } + simdjson_inline simd8<int8_t> operator-(const simd8<int8_t> other) const { return __riscv_vsub(value, other, VL8); } + simdjson_inline simd8<int8_t>& operator+=(const simd8<int8_t> other) { value = *this + other; return *this; } + simdjson_inline simd8<int8_t>& operator-=(const simd8<int8_t> other) { value = *this - other; return *this; } + + // Order-sensitive comparisons + simdjson_inline simd8<int8_t> max_val( const simd8<int8_t> other) const { return __riscv_vmax( value, other, VL8); } + simdjson_inline simd8<int8_t> min_val( const simd8<int8_t> other) const { return __riscv_vmin( value, other, VL8); } + simdjson_inline simd8<bool> operator>( const simd8<int8_t> other) const { return __riscv_vmsgt(value, other, VL8); } + simdjson_inline simd8<bool> operator<( const simd8<int8_t> other) const { return __riscv_vmslt(value, other, VL8); } + simdjson_inline simd8<bool> operator==(const simd8<int8_t> other) const { return __riscv_vmseq(value, other, VL8); } + + template<int N=1> + simdjson_inline simd8<int8_t> prev(const simd8<int8_t> prev_chunk) const { + return __riscv_vslideup(__riscv_vslidedown(prev_chunk, VL8-N, VL8), value, N, VL8); + } + + // Perform a lookup assuming no value is larger than 16 + template<typename L> + simdjson_inline simd8<L> lookup_16(simd8<L> lookup_table) const { + return __riscv_vrgather(lookup_table, value, VL8); + } + template<typename L> + simdjson_inline simd8<L> lookup_16( + L replace0, L replace1, L replace2, L replace3, + L replace4, L replace5, L replace6, L replace7, + L replace8, L replace9, L replace10, L replace11, + L replace12, L replace13, L replace14, L replace15) const { + return lookup_16(simd8<L>::repeat_16( + replace0, replace1, replace2, replace3, + replace4, replace5, replace6, replace7, + replace8, replace9, replace10, replace11, + replace12, replace13, replace14, replace15 + )); + } + }; + + template<typename T> + struct simd8x64; + template<> + struct simd8x64<uint8_t> { + static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<uint8_t>); + vuint8x64_t value; + +#if __riscv_v_fixed_vlen >= 512 + template<int idx> simd8<uint8_t> get() const { return value; } +#else + template<int idx> simd8<uint8_t> get() const { return __riscv_vget_u8m1(value, idx); } +#endif + + simdjson_inline operator const vuint8x64_t&() const { return this->value; } + simdjson_inline operator vuint8x64_t&() { return this->value; } + + simd8x64(const simd8x64<uint8_t>& o) = delete; // no copy allowed + simd8x64<uint8_t>& operator=(const simd8<uint8_t>& other) = delete; // no assignment allowed + simd8x64() = delete; // no default constructor allowed + +#if __riscv_v_fixed_vlen == 128 + simdjson_inline simd8x64(const uint8_t *ptr, size_t n = 64) : value(__riscv_vle8_v_u8m4(ptr, n)) {} +#elif __riscv_v_fixed_vlen == 256 + simdjson_inline simd8x64(const uint8_t *ptr, size_t n = 64) : value(__riscv_vle8_v_u8m2(ptr, n)) {} +#else + simdjson_inline simd8x64(const uint8_t *ptr, size_t n = 64) : value(__riscv_vle8_v_u8m1(ptr, n)) {} +#endif + + simdjson_inline void store(uint8_t ptr[64]) const { + __riscv_vse8(ptr, value, 64); + } + + simdjson_inline bool is_ascii() const { +#if __riscv_v_fixed_vlen == 128 + return __riscv_vfirst(__riscv_vmslt(__riscv_vreinterpret_i8m4(value), 0, 64), 64) < 0; +#elif __riscv_v_fixed_vlen == 256 + return __riscv_vfirst(__riscv_vmslt(__riscv_vreinterpret_i8m2(value), 0, 64), 64) < 0; +#else + return __riscv_vfirst(__riscv_vmslt(__riscv_vreinterpret_i8m1(value), 0, 64), 64) < 0; +#endif + } + + // compress inactive elements, to match AVX-512 behavior + simdjson_inline uint64_t compress(uint64_t mask, uint8_t * output) const { + mask = ~mask; +#if __riscv_v_fixed_vlen == 128 + vboolx64_t m = __riscv_vreinterpret_b2(__riscv_vmv_s_x_u64m1(mask, 1)); +#elif __riscv_v_fixed_vlen == 256 + vboolx64_t m = __riscv_vreinterpret_b4(__riscv_vmv_s_x_u64m1(mask, 1)); +#else + vboolx64_t m = __riscv_vreinterpret_b8(__riscv_vmv_s_x_u64m1(mask, 1)); +#endif + size_t cnt = count_ones(mask); + __riscv_vse8(output, __riscv_vcompress(value, m, 64), cnt); + return cnt; + } + + simdjson_inline uint64_t eq(const uint8_t m) const { + return __riscv_vmv_x(__riscv_vreinterpret_u64m1(__riscv_vmseq(value, m, 64))); + } + + simdjson_inline uint64_t lteq(const uint8_t m) const { + return __riscv_vmv_x(__riscv_vreinterpret_u64m1(__riscv_vmsleu(value, m, 64))); + } + }; // struct simd8x64<uint8_t> + +} // namespace simd +} // unnamed namespace +} // namespace rvv_vls +} // namespace simdjson + +#endif // SIMDJSON_RVV_VLS_SIMD_H +/* end file simdjson/rvv-vls/simd.h */ +/* including simdjson/rvv-vls/stringparsing_defs.h: #include "simdjson/rvv-vls/stringparsing_defs.h" */ +/* begin file simdjson/rvv-vls/stringparsing_defs.h */ +#ifndef SIMDJSON_RVV_VLS_STRINGPARSING_DEFS_H +#define SIMDJSON_RVV_VLS_STRINGPARSING_DEFS_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace rvv_vls { +namespace { + +using namespace simd; + +// Holds backslashes and quotes locations. +struct backslash_and_quote { +public: + static constexpr uint64_t BYTES_PROCESSED = sizeof(simd8<uint8_t>); + simdjson_inline backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst); + + simdjson_inline bool has_quote_first() { return ((bs_bits - 1) & quote_bits) != 0; } + simdjson_inline bool has_backslash() { return ((quote_bits - 1) & bs_bits) != 0; } + simdjson_inline int quote_index() { return trailing_zeroes(quote_bits); } + simdjson_inline int backslash_index() { return trailing_zeroes(bs_bits); } + + uint64_t bs_bits; + uint64_t quote_bits; +}; // struct backslash_and_quote + +simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) { + static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "backslash and quote finder must process fewer than SIMDJSON_PADDING bytes"); + simd8<uint8_t> v(src); + v.store(dst); + return { (v == '\\').to_bitmask(), (v == '"').to_bitmask() }; +} + +struct escaping { + static constexpr uint64_t BYTES_PROCESSED = sizeof(simd8<uint8_t>); + simdjson_inline static escaping copy_and_find(const uint8_t *src, uint8_t *dst); + + simdjson_inline bool has_escape() { return escape_bits != 0; } + simdjson_inline int escape_index() { return trailing_zeroes(escape_bits) / 4; } + + uint64_t escape_bits; +}; // struct escaping + +simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *dst) { + static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "escaping finder must process fewer than SIMDJSON_PADDING bytes"); + simd8<uint8_t> v(src); + v.store(dst); + return { ((v == '"') | (v == '\\') | (v == 32)).to_bitmask() }; +} + + +} // unnamed namespace +} // namespace rvv_vls +} // namespace simdjson + +#endif // SIMDJSON_RVV_VLS_STRINGPARSING_DEFS_H +/* end file simdjson/rvv-vls/stringparsing_defs.h */ +/* including simdjson/rvv-vls/numberparsing_defs.h: #include "simdjson/rvv-vls/numberparsing_defs.h" */ +/* begin file simdjson/rvv-vls/numberparsing_defs.h */ +#ifndef SIMDJSON_RVV_VLS_NUMBERPARSING_DEFS_H +#define SIMDJSON_RVV_VLS_NUMBERPARSING_DEFS_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#include <cstring> + +#ifdef JSON_TEST_NUMBERS // for unit testing +void found_invalid_number(const uint8_t *buf); +void found_integer(int64_t result, const uint8_t *buf); +void found_unsigned_integer(uint64_t result, const uint8_t *buf); +void found_float(double result, const uint8_t *buf); +#endif + +namespace simdjson { +namespace rvv_vls { +namespace numberparsing { + +// credit: https://johnnylee-sde.github.io/Fast-numeric-string-to-int/ +/** @private */ +static simdjson_inline uint32_t parse_eight_digits_unrolled(const char *chars) { + uint64_t val; +#if __riscv_misaligned_fast + memcpy(&val, chars, sizeof(uint64_t)); +#else + val = __riscv_vmv_x(__riscv_vreinterpret_u64m1(__riscv_vlmul_ext_u8m1(__riscv_vle8_v_u8mf2((uint8_t*)chars, 8)))); +#endif + val = (val & 0x0F0F0F0F0F0F0F0F) * 2561 >> 8; + val = (val & 0x00FF00FF00FF00FF) * 6553601 >> 16; + return uint32_t((val & 0x0000FFFF0000FFFF) * 42949672960001 >> 32); +} + +/** @private */ +static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) { + return parse_eight_digits_unrolled(reinterpret_cast<const char *>(chars)); +} + +/** @private */ +simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) { + internal::value128 answer; + __uint128_t r = (static_cast<__uint128_t>(value1)) * value2; + answer.low = uint64_t(r); + answer.high = uint64_t(r >> 64); + return answer; +} + +} // namespace numberparsing +} // namespace rvv_vls +} // namespace simdjson + +#define SIMDJSON_SWAR_NUMBER_PARSING 1 + +#endif // SIMDJSON_RVV_VLS_NUMBERPARSING_DEFS_H +/* end file simdjson/rvv-vls/numberparsing_defs.h */ + +#define SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT 1 +/* end file simdjson/rvv-vls/begin.h */ +/* including simdjson/rvv-vls/simd.h: #include <simdjson/rvv-vls/simd.h> */ +/* begin file simdjson/rvv-vls/simd.h */ +#ifndef SIMDJSON_RVV_VLS_SIMD_H +#define SIMDJSON_RVV_VLS_SIMD_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace rvv_vls { +namespace { +namespace simd { + +#if __riscv_v_fixed_vlen >= 512 + static constexpr size_t VL8 = 512/8; + using vint8_t = vint8m1_t __attribute__((riscv_rvv_vector_bits(512))); + using vuint8_t = vuint8m1_t __attribute__((riscv_rvv_vector_bits(512))); + using vbool_t = vbool8_t __attribute__((riscv_rvv_vector_bits(512/8))); + using vbitmask_t = uint64_t; +#else + static constexpr size_t VL8 = __riscv_v_fixed_vlen/8; + using vint8_t = vint8m1_t __attribute__((riscv_rvv_vector_bits(__riscv_v_fixed_vlen))); + using vuint8_t = vuint8m1_t __attribute__((riscv_rvv_vector_bits(__riscv_v_fixed_vlen))); + using vbool_t = vbool8_t __attribute__((riscv_rvv_vector_bits(__riscv_v_fixed_vlen/8))); + #if __riscv_v_fixed_vlen == 128 + using vbitmask_t = uint16_t; + #elif __riscv_v_fixed_vlen == 256 + using vbitmask_t = uint32_t; + #endif +#endif + +#if __riscv_v_fixed_vlen == 128 + using vuint8x64_t = vuint8m4_t __attribute__((riscv_rvv_vector_bits(512))); + using vboolx64_t = vbool2_t __attribute__((riscv_rvv_vector_bits(512/8))); +#elif __riscv_v_fixed_vlen == 256 + using vuint8x64_t = vuint8m2_t __attribute__((riscv_rvv_vector_bits(512))); + using vboolx64_t = vbool4_t __attribute__((riscv_rvv_vector_bits(512/8))); +#else + using vuint8x64_t = vuint8m1_t __attribute__((riscv_rvv_vector_bits(512))); + using vboolx64_t = vbool8_t __attribute__((riscv_rvv_vector_bits(512/8))); +#endif + + template<typename T> + struct simd8; + + // SIMD byte mask type (returned by things like eq and gt) + template<> + struct simd8<bool> { + vbool_t value; + using bitmask_t = vbitmask_t; + static constexpr int SIZE = sizeof(value); + + simdjson_inline simd8(const vbool_t _value) : value(_value) {} + simdjson_inline simd8() : simd8(__riscv_vmclr_m_b8(VL8)) {} + simdjson_inline simd8(bool _value) : simd8(splat(_value)) {} + + simdjson_inline operator const vbool_t&() const { return value; } + simdjson_inline operator vbool_t&() { return value; } + + static simdjson_inline simd8<bool> splat(bool _value) { + return __riscv_vreinterpret_b8(__riscv_vmv_v_x_u64m1(((uint64_t)!_value)-1, 1)); + } + + simdjson_inline vbitmask_t to_bitmask() const { +#if __riscv_v_fixed_vlen == 128 + return __riscv_vmv_x(__riscv_vreinterpret_u16m1(value)); +#elif __riscv_v_fixed_vlen == 256 + return __riscv_vmv_x(__riscv_vreinterpret_u32m1(value)); +#else + return __riscv_vmv_x(__riscv_vreinterpret_u64m1(value)); +#endif + } + + // Bit operations + simdjson_inline simd8<bool> operator|(const simd8<bool> other) const { return __riscv_vmor(*this, other, VL8); } + simdjson_inline simd8<bool> operator&(const simd8<bool> other) const { return __riscv_vmand(*this, other, VL8); } + simdjson_inline simd8<bool> operator^(const simd8<bool> other) const { return __riscv_vmxor(*this, other, VL8); } + simdjson_inline simd8<bool> bit_andnot(const simd8<bool> other) const { return __riscv_vmandn(other, *this, VL8); } + simdjson_inline simd8<bool> operator~() const { return __riscv_vmnot(*this, VL8); } + simdjson_inline simd8<bool>& operator|=(const simd8<bool> other) { auto this_cast = static_cast<simd8<bool>*>(this); *this_cast = *this_cast | other; return *this_cast; } + simdjson_inline simd8<bool>& operator&=(const simd8<bool> other) { auto this_cast = static_cast<simd8<bool>*>(this); *this_cast = *this_cast & other; return *this_cast; } + simdjson_inline simd8<bool>& operator^=(const simd8<bool> other) { auto this_cast = static_cast<simd8<bool>*>(this); *this_cast = *this_cast ^ other; return *this_cast; } + }; + + // Unsigned bytes + template<> + struct simd8<uint8_t> { + + vuint8_t value; + static constexpr int SIZE = sizeof(value); + + simdjson_inline simd8(const vuint8_t _value) : value(_value) {} + simdjson_inline simd8() : simd8(zero()) {} + simdjson_inline simd8(const uint8_t values[VL8]) : simd8(load(values)) {} + simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {} + simdjson_inline simd8(simd8<bool> mask) : value(__riscv_vmerge_vxm_u8m1(zero(), -1, (vbool_t)mask, VL8)) {} + + simdjson_inline operator const vuint8_t&() const { return this->value; } + simdjson_inline operator vuint8_t&() { return this->value; } + + simdjson_inline simd8( + uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, + uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 + ) : simd8(vuint8_t{ + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + }) {} + + // Repeat 16 values as many times as necessary (usually for lookup tables) + simdjson_inline static simd8<uint8_t> repeat_16( + uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, + uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 + ) { + return simd8<uint8_t>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + ); + } + + static simdjson_inline vuint8_t splat(uint8_t _value) { return __riscv_vmv_v_x_u8m1(_value, VL8); } + static simdjson_inline vuint8_t zero() { return splat(0); } + static simdjson_inline vuint8_t load(const uint8_t values[VL8]) { return __riscv_vle8_v_u8m1(values, VL8); } + + // Bit operations + simdjson_inline simd8<uint8_t> operator|(const simd8<uint8_t> other) const { return __riscv_vor_vv_u8m1( value, other, VL8); } + simdjson_inline simd8<uint8_t> operator&(const simd8<uint8_t> other) const { return __riscv_vand_vv_u8m1( value, other, VL8); } + simdjson_inline simd8<uint8_t> operator^(const simd8<uint8_t> other) const { return __riscv_vxor_vv_u8m1( value, other, VL8); } + simdjson_inline simd8<uint8_t> operator~() const { return __riscv_vnot_v_u8m1(value, VL8); } +#if __riscv_zvbb + simdjson_inline simd8<uint8_t> bit_andnot(const simd8<uint8_t> other) const { return __riscv_vandn_vv_u8m1(other, value, VL8); } +#else + simdjson_inline simd8<uint8_t> bit_andnot(const simd8<uint8_t> other) const { return other & ~*this; } +#endif + simdjson_inline simd8<uint8_t>& operator|=(const simd8<uint8_t> other) { value = *this | other; return *this; } + simdjson_inline simd8<uint8_t>& operator&=(const simd8<uint8_t> other) { value = *this & other; return *this; } + simdjson_inline simd8<uint8_t>& operator^=(const simd8<uint8_t> other) { value = *this ^ other; return *this; } + + simdjson_inline simd8<bool> operator==(const simd8<uint8_t> other) const { return __riscv_vmseq(value, other, VL8); } + simdjson_inline simd8<bool> operator==(uint8_t other) const { return __riscv_vmseq(value, other, VL8); } + + template<int N=1> + simdjson_inline simd8<uint8_t> prev(const simd8<uint8_t> prev_chunk) const { + return __riscv_vslideup(__riscv_vslidedown(prev_chunk, VL8-N, VL8), value, N, VL8); + } + + // Store to array + simdjson_inline void store(uint8_t dst[VL8]) const { return __riscv_vse8(dst, value, VL8); } + + // Saturated math + simdjson_inline simd8<uint8_t> saturating_add(const simd8<uint8_t> other) const { return __riscv_vsaddu(value, other, VL8); } + simdjson_inline simd8<uint8_t> saturating_sub(const simd8<uint8_t> other) const { return __riscv_vssubu(value, other, VL8); } + + // Addition/subtraction are the same for signed and unsigned + simdjson_inline simd8<uint8_t> operator+(const simd8<uint8_t> other) const { return __riscv_vadd(value, other, VL8); } + simdjson_inline simd8<uint8_t> operator-(const simd8<uint8_t> other) const { return __riscv_vsub(value, other, VL8); } + simdjson_inline simd8<uint8_t>& operator+=(const simd8<uint8_t> other) { value = *this + other; return *this; } + simdjson_inline simd8<uint8_t>& operator-=(const simd8<uint8_t> other) { value = *this - other; return *this; } + + // Order-specific operations + simdjson_inline simd8<bool> operator<=(const simd8<uint8_t> other) const { return __riscv_vmsleu(value, other, VL8); } + simdjson_inline simd8<bool> operator>=(const simd8<uint8_t> other) const { return __riscv_vmsgeu(value, other, VL8); } + simdjson_inline simd8<bool> operator<(const simd8<uint8_t> other) const { return __riscv_vmsltu(value, other, VL8); } + simdjson_inline simd8<bool> operator>(const simd8<uint8_t> other) const { return __riscv_vmsgtu(value, other, VL8); } + + // Same as >, but instead of guaranteeing all 1's == true, false = 0 and true = nonzero. + simdjson_inline simd8<uint8_t> gt_bits(const simd8<uint8_t> other) const { return simd8<uint8_t>(*this > other); } + // Same as <, but instead of guaranteeing all 1's == true, false = 0 and true = nonzero. + simdjson_inline simd8<uint8_t> lt_bits(const simd8<uint8_t> other) const { return simd8<uint8_t>(*this < other); } + + // Bit-specific operations + simdjson_inline bool any_bits_set_anywhere() const { + return __riscv_vfirst(__riscv_vmsne(value, 0, VL8), VL8) >= 0; + } + simdjson_inline bool any_bits_set_anywhere(simd8<uint8_t> bits) const { return (*this & bits).any_bits_set_anywhere(); } + template<int N> + simdjson_inline simd8<uint8_t> shr() const { return __riscv_vsrl(value, N, VL8); } + template<int N> + simdjson_inline simd8<uint8_t> shl() const { return __riscv_vsll(value, N, VL8); } + + + // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values) + template<typename L> + simdjson_inline simd8<L> lookup_16(simd8<L> lookup_table) const { + return __riscv_vrgather(lookup_table, value, VL8); + } + + // compress inactive elements, to match AVX-512 behavior + template<typename L> + simdjson_inline void compress(vbitmask_t mask, L * output) const { + mask = (vbitmask_t)~mask; +#if __riscv_v_fixed_vlen == 128 + vbool8_t m = __riscv_vreinterpret_b8(__riscv_vmv_s_x_u16m1(mask, 1)); +#elif __riscv_v_fixed_vlen == 256 + vbool8_t m = __riscv_vreinterpret_b8(__riscv_vmv_s_x_u32m1(mask, 1)); +#else + vbool8_t m = __riscv_vreinterpret_b8(__riscv_vmv_s_x_u64m1(mask, 1)); +#endif + __riscv_vse8_v_u8m1(output, __riscv_vcompress(value, m, VL8), count_ones(mask)); + } + + template<typename L> + simdjson_inline simd8<L> lookup_16( + L replace0, L replace1, L replace2, L replace3, + L replace4, L replace5, L replace6, L replace7, + L replace8, L replace9, L replace10, L replace11, + L replace12, L replace13, L replace14, L replace15) const { + return lookup_16(simd8<L>::repeat_16( + replace0, replace1, replace2, replace3, + replace4, replace5, replace6, replace7, + replace8, replace9, replace10, replace11, + replace12, replace13, replace14, replace15 + )); + } + }; + + // Signed bytes + template<> + struct simd8<int8_t> { + vint8_t value; + static constexpr int SIZE = sizeof(value); + + simdjson_inline simd8(const vint8_t _value) : value(_value) {} + simdjson_inline simd8() : simd8(zero()) {} + simdjson_inline simd8(const int8_t values[VL8]) : simd8(load(values)) {} + simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {} + + simdjson_inline operator const vint8_t&() const { return this->value; } + simdjson_inline operator vint8_t&() { return this->value; } + + simdjson_inline simd8( + int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, + int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 + ) : simd8(vint8_t{ + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + }) {} + + // Repeat 16 values as many times as necessary (usually for lookup tables) + simdjson_inline static simd8<int8_t> repeat_16( + int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, + int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 + ) { + return simd8<int8_t>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + ); + } + + static simdjson_inline vint8_t splat(int8_t _value) { return __riscv_vmv_v_x_i8m1(_value, VL8); } + static simdjson_inline vint8_t zero() { return splat(0); } + static simdjson_inline vint8_t load(const int8_t values[VL8]) { return __riscv_vle8_v_i8m1(values, VL8); } + + + simdjson_inline void store(int8_t dst[VL8]) const { return __riscv_vse8(dst, value, VL8); } + + // Explicit conversion to/from unsigned + simdjson_inline explicit simd8(const vuint8_t other): simd8(__riscv_vreinterpret_i8m1(other)) {} + simdjson_inline explicit operator simd8<uint8_t>() const { return __riscv_vreinterpret_u8m1(value); } + + // Math + simdjson_inline simd8<int8_t> operator+(const simd8<int8_t> other) const { return __riscv_vadd(value, other, VL8); } + simdjson_inline simd8<int8_t> operator-(const simd8<int8_t> other) const { return __riscv_vsub(value, other, VL8); } + simdjson_inline simd8<int8_t>& operator+=(const simd8<int8_t> other) { value = *this + other; return *this; } + simdjson_inline simd8<int8_t>& operator-=(const simd8<int8_t> other) { value = *this - other; return *this; } + + // Order-sensitive comparisons + simdjson_inline simd8<int8_t> max_val( const simd8<int8_t> other) const { return __riscv_vmax( value, other, VL8); } + simdjson_inline simd8<int8_t> min_val( const simd8<int8_t> other) const { return __riscv_vmin( value, other, VL8); } + simdjson_inline simd8<bool> operator>( const simd8<int8_t> other) const { return __riscv_vmsgt(value, other, VL8); } + simdjson_inline simd8<bool> operator<( const simd8<int8_t> other) const { return __riscv_vmslt(value, other, VL8); } + simdjson_inline simd8<bool> operator==(const simd8<int8_t> other) const { return __riscv_vmseq(value, other, VL8); } + + template<int N=1> + simdjson_inline simd8<int8_t> prev(const simd8<int8_t> prev_chunk) const { + return __riscv_vslideup(__riscv_vslidedown(prev_chunk, VL8-N, VL8), value, N, VL8); + } + + // Perform a lookup assuming no value is larger than 16 + template<typename L> + simdjson_inline simd8<L> lookup_16(simd8<L> lookup_table) const { + return __riscv_vrgather(lookup_table, value, VL8); + } + template<typename L> + simdjson_inline simd8<L> lookup_16( + L replace0, L replace1, L replace2, L replace3, + L replace4, L replace5, L replace6, L replace7, + L replace8, L replace9, L replace10, L replace11, + L replace12, L replace13, L replace14, L replace15) const { + return lookup_16(simd8<L>::repeat_16( + replace0, replace1, replace2, replace3, + replace4, replace5, replace6, replace7, + replace8, replace9, replace10, replace11, + replace12, replace13, replace14, replace15 + )); + } + }; + + template<typename T> + struct simd8x64; + template<> + struct simd8x64<uint8_t> { + static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<uint8_t>); + vuint8x64_t value; + +#if __riscv_v_fixed_vlen >= 512 + template<int idx> simd8<uint8_t> get() const { return value; } +#else + template<int idx> simd8<uint8_t> get() const { return __riscv_vget_u8m1(value, idx); } +#endif + + simdjson_inline operator const vuint8x64_t&() const { return this->value; } + simdjson_inline operator vuint8x64_t&() { return this->value; } + + simd8x64(const simd8x64<uint8_t>& o) = delete; // no copy allowed + simd8x64<uint8_t>& operator=(const simd8<uint8_t>& other) = delete; // no assignment allowed + simd8x64() = delete; // no default constructor allowed + +#if __riscv_v_fixed_vlen == 128 + simdjson_inline simd8x64(const uint8_t *ptr, size_t n = 64) : value(__riscv_vle8_v_u8m4(ptr, n)) {} +#elif __riscv_v_fixed_vlen == 256 + simdjson_inline simd8x64(const uint8_t *ptr, size_t n = 64) : value(__riscv_vle8_v_u8m2(ptr, n)) {} +#else + simdjson_inline simd8x64(const uint8_t *ptr, size_t n = 64) : value(__riscv_vle8_v_u8m1(ptr, n)) {} +#endif + + simdjson_inline void store(uint8_t ptr[64]) const { + __riscv_vse8(ptr, value, 64); + } + + simdjson_inline bool is_ascii() const { +#if __riscv_v_fixed_vlen == 128 + return __riscv_vfirst(__riscv_vmslt(__riscv_vreinterpret_i8m4(value), 0, 64), 64) < 0; +#elif __riscv_v_fixed_vlen == 256 + return __riscv_vfirst(__riscv_vmslt(__riscv_vreinterpret_i8m2(value), 0, 64), 64) < 0; +#else + return __riscv_vfirst(__riscv_vmslt(__riscv_vreinterpret_i8m1(value), 0, 64), 64) < 0; +#endif + } + + // compress inactive elements, to match AVX-512 behavior + simdjson_inline uint64_t compress(uint64_t mask, uint8_t * output) const { + mask = ~mask; +#if __riscv_v_fixed_vlen == 128 + vboolx64_t m = __riscv_vreinterpret_b2(__riscv_vmv_s_x_u64m1(mask, 1)); +#elif __riscv_v_fixed_vlen == 256 + vboolx64_t m = __riscv_vreinterpret_b4(__riscv_vmv_s_x_u64m1(mask, 1)); +#else + vboolx64_t m = __riscv_vreinterpret_b8(__riscv_vmv_s_x_u64m1(mask, 1)); +#endif + size_t cnt = count_ones(mask); + __riscv_vse8(output, __riscv_vcompress(value, m, 64), cnt); + return cnt; + } + + simdjson_inline uint64_t eq(const uint8_t m) const { + return __riscv_vmv_x(__riscv_vreinterpret_u64m1(__riscv_vmseq(value, m, 64))); + } + + simdjson_inline uint64_t lteq(const uint8_t m) const { + return __riscv_vmv_x(__riscv_vreinterpret_u64m1(__riscv_vmsleu(value, m, 64))); + } + }; // struct simd8x64<uint8_t> + +} // namespace simd +} // unnamed namespace +} // namespace rvv_vls +} // namespace simdjson + +#endif // SIMDJSON_RVV_VLS_SIMD_H +/* end file simdjson/rvv-vls/simd.h */ +/* including generic/amalgamated.h for rvv_vls: #include <generic/amalgamated.h> */ +/* begin file generic/amalgamated.h for rvv_vls */ +#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_SRC_GENERIC_DEPENDENCIES_H) +#error generic/dependencies.h must be included before generic/amalgamated.h! +#endif + +/* including generic/base.h for rvv_vls: #include <generic/base.h> */ +/* begin file generic/base.h for rvv_vls */ +#ifndef SIMDJSON_SRC_GENERIC_BASE_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_BASE_H */ +/* amalgamation skipped (editor-only): #include <base.h> */ +/* amalgamation skipped (editor-only): #include <simdjson/generic/base.h> */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace rvv_vls { +namespace { + +struct json_character_block; + +} // unnamed namespace +} // namespace rvv_vls +} // namespace simdjson + +#endif // SIMDJSON_SRC_GENERIC_BASE_H +/* end file generic/base.h for rvv_vls */ +/* including generic/dom_parser_implementation.h for rvv_vls: #include <generic/dom_parser_implementation.h> */ +/* begin file generic/dom_parser_implementation.h for rvv_vls */ +#ifndef SIMDJSON_SRC_GENERIC_DOM_PARSER_IMPLEMENTATION_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_DOM_PARSER_IMPLEMENTATION_H */ +/* amalgamation skipped (editor-only): #include <generic/base.h> */ +/* amalgamation skipped (editor-only): #include <simdjson/generic/dom_parser_implementation.h> */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +// Interface a dom parser implementation must fulfill +namespace simdjson { +namespace rvv_vls { +namespace { + +simdjson_inline simd8<uint8_t> must_be_2_3_continuation(const simd8<uint8_t> prev2, const simd8<uint8_t> prev3); +simdjson_inline bool is_ascii(const simd8x64<uint8_t>& input); + +} // unnamed namespace +} // namespace rvv_vls +} // namespace simdjson + +#endif // SIMDJSON_SRC_GENERIC_DOM_PARSER_IMPLEMENTATION_H +/* end file generic/dom_parser_implementation.h for rvv_vls */ +/* including generic/json_character_block.h for rvv_vls: #include <generic/json_character_block.h> */ +/* begin file generic/json_character_block.h for rvv_vls */ +#ifndef SIMDJSON_SRC_GENERIC_JSON_CHARACTER_BLOCK_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_JSON_CHARACTER_BLOCK_H */ +/* amalgamation skipped (editor-only): #include <generic/base.h> */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace rvv_vls { +namespace { + +struct json_character_block { + static simdjson_inline json_character_block classify(const simd::simd8x64<uint8_t>& in); + + simdjson_inline uint64_t whitespace() const noexcept { return _whitespace; } + simdjson_inline uint64_t op() const noexcept { return _op; } + simdjson_inline uint64_t scalar() const noexcept { return ~(op() | whitespace()); } + + uint64_t _whitespace; + uint64_t _op; +}; + +} // unnamed namespace +} // namespace rvv_vls +} // namespace simdjson + +#endif // SIMDJSON_SRC_GENERIC_JSON_CHARACTER_BLOCK_H +/* end file generic/json_character_block.h for rvv_vls */ +/* end file generic/amalgamated.h for rvv_vls */ +/* including generic/stage1/amalgamated.h for rvv_vls: #include <generic/stage1/amalgamated.h> */ +/* begin file generic/stage1/amalgamated.h for rvv_vls */ +// Stuff other things depend on +/* including generic/stage1/base.h for rvv_vls: #include <generic/stage1/base.h> */ +/* begin file generic/stage1/base.h for rvv_vls */ +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_BASE_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_BASE_H */ +/* amalgamation skipped (editor-only): #include <generic/base.h> */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace rvv_vls { +namespace { +namespace stage1 { + +class bit_indexer; +template<size_t STEP_SIZE> +struct buf_block_reader; +struct json_block; +class json_minifier; +class json_scanner; +struct json_string_block; +class json_string_scanner; +class json_structural_indexer; + +} // namespace stage1 + +namespace utf8_validation { +struct utf8_checker; +} // namespace utf8_validation + +using utf8_validation::utf8_checker; + +} // unnamed namespace +} // namespace rvv_vls +} // namespace simdjson + +#endif // SIMDJSON_SRC_GENERIC_STAGE1_BASE_H +/* end file generic/stage1/base.h for rvv_vls */ +/* including generic/stage1/buf_block_reader.h for rvv_vls: #include <generic/stage1/buf_block_reader.h> */ +/* begin file generic/stage1/buf_block_reader.h for rvv_vls */ +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_BUF_BLOCK_READER_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_BUF_BLOCK_READER_H */ +/* amalgamation skipped (editor-only): #include <generic/stage1/base.h> */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#include <cstring> + +namespace simdjson { +namespace rvv_vls { +namespace { +namespace stage1 { + +// Walks through a buffer in block-sized increments, loading the last part with spaces +template<size_t STEP_SIZE> +struct buf_block_reader { +public: + simdjson_inline buf_block_reader(const uint8_t *_buf, size_t _len); + simdjson_inline size_t block_index(); + simdjson_inline bool has_full_block() const; + simdjson_inline const uint8_t *full_block() const; + /** + * Get the last block, padded with spaces. + * + * There will always be a last block, with at least 1 byte, unless len == 0 (in which case this + * function fills the buffer with spaces and returns 0. In particular, if len == STEP_SIZE there + * will be 0 full_blocks and 1 remainder block with STEP_SIZE bytes and no spaces for padding. + * + * @return the number of effective characters in the last block. + */ + simdjson_inline size_t get_remainder(uint8_t *dst) const; + simdjson_inline void advance(); +private: + const uint8_t *buf; + const size_t len; + const size_t lenminusstep; + size_t idx; +}; + +// Routines to print masks and text for debugging bitmask operations +simdjson_unused static char * format_input_text_64(const uint8_t *text) { + static char buf[sizeof(simd8x64<uint8_t>) + 1]; + for (size_t i=0; i<sizeof(simd8x64<uint8_t>); i++) { + buf[i] = int8_t(text[i]) < ' ' ? '_' : int8_t(text[i]); + } + buf[sizeof(simd8x64<uint8_t>)] = '\0'; + return buf; +} + +// Routines to print masks and text for debugging bitmask operations +simdjson_unused static char * format_input_text(const simd8x64<uint8_t>& in) { + static char buf[sizeof(simd8x64<uint8_t>) + 1]; + in.store(reinterpret_cast<uint8_t*>(buf)); + for (size_t i=0; i<sizeof(simd8x64<uint8_t>); i++) { + if (buf[i] < ' ') { buf[i] = '_'; } + } + buf[sizeof(simd8x64<uint8_t>)] = '\0'; + return buf; +} + +simdjson_unused static char * format_input_text(const simd8x64<uint8_t>& in, uint64_t mask) { + static char buf[sizeof(simd8x64<uint8_t>) + 1]; + in.store(reinterpret_cast<uint8_t*>(buf)); + for (size_t i=0; i<sizeof(simd8x64<uint8_t>); i++) { + if (buf[i] <= ' ') { buf[i] = '_'; } + if (!(mask & (size_t(1) << i))) { buf[i] = ' '; } + } + buf[sizeof(simd8x64<uint8_t>)] = '\0'; + return buf; +} + +simdjson_unused static char * format_mask(uint64_t mask) { + static char buf[sizeof(simd8x64<uint8_t>) + 1]; + for (size_t i=0; i<64; i++) { + buf[i] = (mask & (size_t(1) << i)) ? 'X' : ' '; + } + buf[64] = '\0'; + return buf; +} + +template<size_t STEP_SIZE> +simdjson_inline buf_block_reader<STEP_SIZE>::buf_block_reader(const uint8_t *_buf, size_t _len) : buf{_buf}, len{_len}, lenminusstep{len < STEP_SIZE ? 0 : len - STEP_SIZE}, idx{0} {} + +template<size_t STEP_SIZE> +simdjson_inline size_t buf_block_reader<STEP_SIZE>::block_index() { return idx; } + +template<size_t STEP_SIZE> +simdjson_inline bool buf_block_reader<STEP_SIZE>::has_full_block() const { + return idx < lenminusstep; +} + +template<size_t STEP_SIZE> +simdjson_inline const uint8_t *buf_block_reader<STEP_SIZE>::full_block() const { + return &buf[idx]; +} + +template<size_t STEP_SIZE> +simdjson_inline size_t buf_block_reader<STEP_SIZE>::get_remainder(uint8_t *dst) const { + if(len == idx) { return 0; } // memcpy(dst, null, 0) will trigger an error with some sanitizers + std::memset(dst, 0x20, STEP_SIZE); // std::memset STEP_SIZE because it's more efficient to write out 8 or 16 bytes at once. + std::memcpy(dst, buf + idx, len - idx); + return len - idx; +} + +template<size_t STEP_SIZE> +simdjson_inline void buf_block_reader<STEP_SIZE>::advance() { + idx += STEP_SIZE; +} + +} // namespace stage1 +} // unnamed namespace +} // namespace rvv_vls +} // namespace simdjson + +#endif // SIMDJSON_SRC_GENERIC_STAGE1_BUF_BLOCK_READER_H +/* end file generic/stage1/buf_block_reader.h for rvv_vls */ +/* including generic/stage1/json_escape_scanner.h for rvv_vls: #include <generic/stage1/json_escape_scanner.h> */ +/* begin file generic/stage1/json_escape_scanner.h for rvv_vls */ +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_JSON_ESCAPE_SCANNER_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_JSON_ESCAPE_SCANNER_H */ +/* amalgamation skipped (editor-only): #include <generic/stage1/base.h> */ +/* amalgamation skipped (editor-only): #include <generic/stage1/buf_block_reader.h> */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace rvv_vls { +namespace { +namespace stage1 { + +/** + * Scans for escape characters in JSON, taking care with multiple backslashes (\\n vs. \n). + */ +struct json_escape_scanner { + /** The actual escape characters (the backslashes themselves). */ + uint64_t next_is_escaped = 0ULL; + + struct escaped_and_escape { + /** + * Mask of escaped characters. + * + * ``` + * \n \\n \\\n \\\\n \ + * 0100100010100101000 + * n \ \ n \ \ + * ``` + */ + uint64_t escaped; + /** + * Mask of escape characters. + * + * ``` + * \n \\n \\\n \\\\n \ + * 1001000101001010001 + * \ \ \ \ \ \ \ + * ``` + */ + uint64_t escape; + }; + + /** + * Get a mask of both escape and escaped characters (the characters following a backslash). + * + * @param potential_escape A mask of the character that can escape others (but could be + * escaped itself). e.g. block.eq('\\') + */ + simdjson_really_inline escaped_and_escape next(uint64_t backslash) noexcept { + +#if !SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT + if (!backslash) { return {next_escaped_without_backslashes(), 0}; } +#endif + + // | | Mask (shows characters instead of 1's) | Depth | Instructions | + // |--------------------------------|----------------------------------------|-------|---------------------| + // | string | `\\n_\\\n___\\\n___\\\\___\\\\__\\\` | | | + // | | ` even odd even odd odd` | | | + // | potential_escape | ` \ \\\ \\\ \\\\ \\\\ \\\` | 1 | 1 (backslash & ~first_is_escaped) + // | escape_and_terminal_code | ` \n \ \n \ \n \ \ \ \ \ \` | 5 | 5 (next_escape_and_terminal_code()) + // | escaped | `\ \ n \ n \ \ \ \ \ ` X | 6 | 7 (escape_and_terminal_code ^ (potential_escape | first_is_escaped)) + // | escape | ` \ \ \ \ \ \ \ \ \ \` | 6 | 8 (escape_and_terminal_code & backslash) + // | first_is_escaped | `\ ` | 7 (*) | 9 (escape >> 63) () + // (*) this is not needed until the next iteration + uint64_t escape_and_terminal_code = next_escape_and_terminal_code(backslash & ~this->next_is_escaped); + uint64_t escaped = escape_and_terminal_code ^ (backslash | this->next_is_escaped); + uint64_t escape = escape_and_terminal_code & backslash; + this->next_is_escaped = escape >> 63; + return {escaped, escape}; + } + +private: + static constexpr const uint64_t ODD_BITS = 0xAAAAAAAAAAAAAAAAULL; + + simdjson_really_inline uint64_t next_escaped_without_backslashes() noexcept { + uint64_t escaped = this->next_is_escaped; + this->next_is_escaped = 0; + return escaped; + } + + /** + * Returns a mask of the next escape characters (masking out escaped backslashes), along with + * any non-backslash escape codes. + * + * \n \\n \\\n \\\\n returns: + * \n \ \ \n \ \ + * 11 100 1011 10100 + * + * You are expected to mask out the first bit yourself if the previous block had a trailing + * escape. + * + * & the result with potential_escape to get just the escape characters. + * ^ the result with (potential_escape | first_is_escaped) to get escaped characters. + */ + static simdjson_really_inline uint64_t next_escape_and_terminal_code(uint64_t potential_escape) noexcept { + // If we were to just shift and mask out any odd bits, we'd actually get a *half* right answer: + // any even-aligned backslash runs would be correct! Odd-aligned backslash runs would be + // inverted (\\\ would be 010 instead of 101). + // + // ``` + // string: | ____\\\\_\\\\_____ | + // maybe_escaped | ODD | \ \ \ \ | + // even-aligned ^^^ ^^^^ odd-aligned + // ``` + // + // Taking that into account, our basic strategy is: + // + // 1. Use subtraction to produce a mask with 1's for even-aligned runs and 0's for + // odd-aligned runs. + // 2. XOR all odd bits, which masks out the odd bits in even-aligned runs, and brings IN the + // odd bits in odd-aligned runs. + // 3. & with backslash to clean up any stray bits. + // runs are set to 0, and then XORing with "odd": + // + // | | Mask (shows characters instead of 1's) | Instructions | + // |--------------------------------|----------------------------------------|---------------------| + // | string | `\\n_\\\n___\\\n___\\\\___\\\\__\\\` | + // | | ` even odd even odd odd` | + // | maybe_escaped | ` n \\n \\n \\\_ \\\_ \\` X | 1 (potential_escape << 1) + // | maybe_escaped_and_odd | ` \n_ \\n _ \\\n_ _ \\\__ _\\\_ \\\` | 1 (maybe_escaped | odd) + // | even_series_codes_and_odd | ` n_\\\ _ n_ _\\\\ _ _ ` | 1 (maybe_escaped_and_odd - potential_escape) + // | escape_and_terminal_code | ` \n \ \n \ \n \ \ \ \ \ \` | 1 (^ odd) + // + + // Escaped characters are characters following an escape. + uint64_t maybe_escaped = potential_escape << 1; + + // To distinguish odd from even escape sequences, therefore, we turn on any *starting* + // escapes that are on an odd byte. (We actually bring in all odd bits, for speed.) + // - Odd runs of backslashes are 0000, and the code at the end ("n" in \n or \\n) is 1. + // - Odd runs of backslashes are 1111, and the code at the end ("n" in \n or \\n) is 0. + // - All other odd bytes are 1, and even bytes are 0. + uint64_t maybe_escaped_and_odd_bits = maybe_escaped | ODD_BITS; + uint64_t even_series_codes_and_odd_bits = maybe_escaped_and_odd_bits - potential_escape; + + // Now we flip all odd bytes back with xor. This: + // - Makes odd runs of backslashes go from 0000 to 1010 + // - Makes even runs of backslashes go from 1111 to 1010 + // - Sets actually-escaped codes to 1 (the n in \n and \\n: \n = 11, \\n = 100) + // - Resets all other bytes to 0 + return even_series_codes_and_odd_bits ^ ODD_BITS; + } +}; + +} // namespace stage1 +} // unnamed namespace +} // namespace rvv_vls +} // namespace simdjson + +#endif // SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRING_SCANNER_H +/* end file generic/stage1/json_escape_scanner.h for rvv_vls */ +/* including generic/stage1/json_string_scanner.h for rvv_vls: #include <generic/stage1/json_string_scanner.h> */ +/* begin file generic/stage1/json_string_scanner.h for rvv_vls */ +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRING_SCANNER_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRING_SCANNER_H */ +/* amalgamation skipped (editor-only): #include <generic/stage1/base.h> */ +/* amalgamation skipped (editor-only): #include <generic/stage1/json_escape_scanner.h> */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace rvv_vls { +namespace { +namespace stage1 { + +struct json_string_block { + // We spell out the constructors in the hope of resolving inlining issues with Visual Studio 2017 + simdjson_really_inline json_string_block(uint64_t escaped, uint64_t quote, uint64_t in_string) : + _escaped(escaped), _quote(quote), _in_string(in_string) {} + + // Escaped characters (characters following an escape() character) + simdjson_really_inline uint64_t escaped() const { return _escaped; } + // Real (non-backslashed) quotes + simdjson_really_inline uint64_t quote() const { return _quote; } + // Only characters inside the string (not including the quotes) + simdjson_really_inline uint64_t string_content() const { return _in_string & ~_quote; } + // Return a mask of whether the given characters are inside a string (only works on non-quotes) + simdjson_really_inline uint64_t non_quote_inside_string(uint64_t mask) const { return mask & _in_string; } + // Return a mask of whether the given characters are inside a string (only works on non-quotes) + simdjson_really_inline uint64_t non_quote_outside_string(uint64_t mask) const { return mask & ~_in_string; } + // Tail of string (everything except the start quote) + simdjson_really_inline uint64_t string_tail() const { return _in_string ^ _quote; } + + // escaped characters (backslashed--does not include the hex characters after \u) + uint64_t _escaped; + // real quotes (non-escaped ones) + uint64_t _quote; + // string characters (includes start quote but not end quote) + uint64_t _in_string; +}; + +// Scans blocks for string characters, storing the state necessary to do so +class json_string_scanner { +public: + simdjson_really_inline json_string_block next(const simd::simd8x64<uint8_t>& in); + // Returns either UNCLOSED_STRING or SUCCESS + simdjson_really_inline error_code finish(); + +private: + // Scans for escape characters + json_escape_scanner escape_scanner{}; + // Whether the last iteration was still inside a string (all 1's = true, all 0's = false). + uint64_t prev_in_string = 0ULL; +}; + +// +// Return a mask of all string characters plus end quotes. +// +// prev_escaped is overflow saying whether the next character is escaped. +// prev_in_string is overflow saying whether we're still in a string. +// +// Backslash sequences outside of quotes will be detected in stage 2. +// +simdjson_really_inline json_string_block json_string_scanner::next(const simd::simd8x64<uint8_t>& in) { + const uint64_t backslash = in.eq('\\'); + const uint64_t escaped = escape_scanner.next(backslash).escaped; + const uint64_t quote = in.eq('"') & ~escaped; + + // + // prefix_xor flips on bits inside the string (and flips off the end quote). + // + // Then we xor with prev_in_string: if we were in a string already, its effect is flipped + // (characters inside strings are outside, and characters outside strings are inside). + // + const uint64_t in_string = prefix_xor(quote) ^ prev_in_string; + + // + // Check if we're still in a string at the end of the box so the next block will know + // + prev_in_string = uint64_t(static_cast<int64_t>(in_string) >> 63); + + // Use ^ to turn the beginning quote off, and the end quote on. + + // We are returning a function-local object so either we get a move constructor + // or we get copy elision. + return json_string_block(escaped, quote, in_string); +} + +simdjson_really_inline error_code json_string_scanner::finish() { + if (prev_in_string) { + return UNCLOSED_STRING; + } + return SUCCESS; +} + +} // namespace stage1 +} // unnamed namespace +} // namespace rvv_vls +} // namespace simdjson + +#endif // SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRING_SCANNER_H +/* end file generic/stage1/json_string_scanner.h for rvv_vls */ +/* including generic/stage1/utf8_lookup4_algorithm.h for rvv_vls: #include <generic/stage1/utf8_lookup4_algorithm.h> */ +/* begin file generic/stage1/utf8_lookup4_algorithm.h for rvv_vls */ +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_UTF8_LOOKUP4_ALGORITHM_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_UTF8_LOOKUP4_ALGORITHM_H */ +/* amalgamation skipped (editor-only): #include <generic/stage1/base.h> */ +/* amalgamation skipped (editor-only): #include <generic/dom_parser_implementation.h> */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace rvv_vls { +namespace { +namespace utf8_validation { + +using namespace simd; + + simdjson_inline simd8<uint8_t> check_special_cases(const simd8<uint8_t> input, const simd8<uint8_t> prev1) { +// Bit 0 = Too Short (lead byte/ASCII followed by lead byte/ASCII) +// Bit 1 = Too Long (ASCII followed by continuation) +// Bit 2 = Overlong 3-byte +// Bit 4 = Surrogate +// Bit 5 = Overlong 2-byte +// Bit 7 = Two Continuations + constexpr const uint8_t TOO_SHORT = 1<<0; // 11______ 0_______ + // 11______ 11______ + constexpr const uint8_t TOO_LONG = 1<<1; // 0_______ 10______ + constexpr const uint8_t OVERLONG_3 = 1<<2; // 11100000 100_____ + constexpr const uint8_t SURROGATE = 1<<4; // 11101101 101_____ + constexpr const uint8_t OVERLONG_2 = 1<<5; // 1100000_ 10______ + constexpr const uint8_t TWO_CONTS = 1<<7; // 10______ 10______ + constexpr const uint8_t TOO_LARGE = 1<<3; // 11110100 1001____ + // 11110100 101_____ + // 11110101 1001____ + // 11110101 101_____ + // 1111011_ 1001____ + // 1111011_ 101_____ + // 11111___ 1001____ + // 11111___ 101_____ + constexpr const uint8_t TOO_LARGE_1000 = 1<<6; + // 11110101 1000____ + // 1111011_ 1000____ + // 11111___ 1000____ + constexpr const uint8_t OVERLONG_4 = 1<<6; // 11110000 1000____ + + const simd8<uint8_t> byte_1_high = prev1.shr<4>().lookup_16<uint8_t>( + // 0_______ ________ <ASCII in byte 1> + TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, + TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, + // 10______ ________ <continuation in byte 1> + TWO_CONTS, TWO_CONTS, TWO_CONTS, TWO_CONTS, + // 1100____ ________ <two byte lead in byte 1> + TOO_SHORT | OVERLONG_2, + // 1101____ ________ <two byte lead in byte 1> + TOO_SHORT, + // 1110____ ________ <three byte lead in byte 1> + TOO_SHORT | OVERLONG_3 | SURROGATE, + // 1111____ ________ <four+ byte lead in byte 1> + TOO_SHORT | TOO_LARGE | TOO_LARGE_1000 | OVERLONG_4 + ); + constexpr const uint8_t CARRY = TOO_SHORT | TOO_LONG | TWO_CONTS; // These all have ____ in byte 1 . + const simd8<uint8_t> byte_1_low = (prev1 & 0x0F).lookup_16<uint8_t>( + // ____0000 ________ + CARRY | OVERLONG_3 | OVERLONG_2 | OVERLONG_4, + // ____0001 ________ + CARRY | OVERLONG_2, + // ____001_ ________ + CARRY, + CARRY, + + // ____0100 ________ + CARRY | TOO_LARGE, + // ____0101 ________ + CARRY | TOO_LARGE | TOO_LARGE_1000, + // ____011_ ________ + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + + // ____1___ ________ + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + // ____1101 ________ + CARRY | TOO_LARGE | TOO_LARGE_1000 | SURROGATE, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000 + ); + const simd8<uint8_t> byte_2_high = input.shr<4>().lookup_16<uint8_t>( + // ________ 0_______ <ASCII in byte 2> + TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, + TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, + + // ________ 1000____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE_1000 | OVERLONG_4, + // ________ 1001____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE, + // ________ 101_____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, + TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, + + // ________ 11______ + TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT + ); + return (byte_1_high & byte_1_low & byte_2_high); + } + simdjson_inline simd8<uint8_t> check_multibyte_lengths(const simd8<uint8_t> input, + const simd8<uint8_t> prev_input, const simd8<uint8_t> sc) { + simd8<uint8_t> prev2 = input.prev<2>(prev_input); + simd8<uint8_t> prev3 = input.prev<3>(prev_input); + simd8<uint8_t> must23 = must_be_2_3_continuation(prev2, prev3); + simd8<uint8_t> must23_80 = must23 & uint8_t(0x80); + return must23_80 ^ sc; + } + + // + // Return nonzero if there are incomplete multibyte characters at the end of the block: + // e.g. if there is a 4-byte character, but it's 3 bytes from the end. + // + simdjson_inline simd8<uint8_t> is_incomplete(const simd8<uint8_t> input) { + // If the previous input's last 3 bytes match this, they're too short (they ended at EOF): + // ... 1111____ 111_____ 11______ +#if SIMDJSON_IMPLEMENTATION_ICELAKE || (SIMDJSON_IMPLEMENTATION_RVV_VLS && __riscv_v_fixed_vlen >= 512) static const uint8_t max_array[64] = { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, @@ -52010,18 +58937,18 @@ using namespace simd; || (simd8x64<uint8_t>::NUM_CHUNKS == 4), "We support one, two or four chunks per 64-byte block."); SIMDJSON_IF_CONSTEXPR (simd8x64<uint8_t>::NUM_CHUNKS == 1) { - this->check_utf8_bytes(input.chunks[0], this->prev_input_block); + this->check_utf8_bytes(input.get<0>(), this->prev_input_block); } else SIMDJSON_IF_CONSTEXPR (simd8x64<uint8_t>::NUM_CHUNKS == 2) { - this->check_utf8_bytes(input.chunks[0], this->prev_input_block); - this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + this->check_utf8_bytes(input.get<0>(), this->prev_input_block); + this->check_utf8_bytes(input.get<1>(), input.get<0>()); } else SIMDJSON_IF_CONSTEXPR (simd8x64<uint8_t>::NUM_CHUNKS == 4) { - this->check_utf8_bytes(input.chunks[0], this->prev_input_block); - this->check_utf8_bytes(input.chunks[1], input.chunks[0]); - this->check_utf8_bytes(input.chunks[2], input.chunks[1]); - this->check_utf8_bytes(input.chunks[3], input.chunks[2]); + this->check_utf8_bytes(input.get<0>(), this->prev_input_block); + this->check_utf8_bytes(input.get<1>(), input.get<0>()); + this->check_utf8_bytes(input.get<2>(), input.get<1>()); + this->check_utf8_bytes(input.get<3>(), input.get<2>()); } - this->prev_incomplete = is_incomplete(input.chunks[simd8x64<uint8_t>::NUM_CHUNKS-1]); - this->prev_input_block = input.chunks[simd8x64<uint8_t>::NUM_CHUNKS-1]; + this->prev_incomplete = is_incomplete(input.get<simd8x64<uint8_t>::NUM_CHUNKS-1>()); + this->prev_input_block = input.get<simd8x64<uint8_t>::NUM_CHUNKS-1>(); } } // do not forget to call check_eof! @@ -52033,13 +58960,13 @@ using namespace simd; } // namespace utf8_validation } // unnamed namespace -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson #endif // SIMDJSON_SRC_GENERIC_STAGE1_UTF8_LOOKUP4_ALGORITHM_H -/* end file generic/stage1/utf8_lookup4_algorithm.h for lasx */ -/* including generic/stage1/json_scanner.h for lasx: #include <generic/stage1/json_scanner.h> */ -/* begin file generic/stage1/json_scanner.h for lasx */ +/* end file generic/stage1/utf8_lookup4_algorithm.h for rvv_vls */ +/* including generic/stage1/json_scanner.h for rvv_vls: #include <generic/stage1/json_scanner.h> */ +/* begin file generic/stage1/json_scanner.h for rvv_vls */ #ifndef SIMDJSON_SRC_GENERIC_STAGE1_JSON_SCANNER_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -52050,7 +58977,7 @@ using namespace simd; /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace { namespace stage1 { @@ -52204,15 +59131,15 @@ simdjson_warn_unused simdjson_inline error_code json_scanner::finish() { } // namespace stage1 } // unnamed namespace -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson #endif // SIMDJSON_SRC_GENERIC_STAGE1_JSON_SCANNER_H -/* end file generic/stage1/json_scanner.h for lasx */ +/* end file generic/stage1/json_scanner.h for rvv_vls */ // All other declarations -/* including generic/stage1/find_next_document_index.h for lasx: #include <generic/stage1/find_next_document_index.h> */ -/* begin file generic/stage1/find_next_document_index.h for lasx */ +/* including generic/stage1/find_next_document_index.h for rvv_vls: #include <generic/stage1/find_next_document_index.h> */ +/* begin file generic/stage1/find_next_document_index.h for rvv_vls */ #ifndef SIMDJSON_SRC_GENERIC_STAGE1_FIND_NEXT_DOCUMENT_INDEX_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -52222,7 +59149,7 @@ simdjson_warn_unused simdjson_inline error_code json_scanner::finish() { /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace { namespace stage1 { @@ -52314,13 +59241,13 @@ simdjson_inline uint32_t find_next_document_index(dom_parser_implementation &par } // namespace stage1 } // unnamed namespace -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson #endif // SIMDJSON_SRC_GENERIC_STAGE1_FIND_NEXT_DOCUMENT_INDEX_H -/* end file generic/stage1/find_next_document_index.h for lasx */ -/* including generic/stage1/json_minifier.h for lasx: #include <generic/stage1/json_minifier.h> */ -/* begin file generic/stage1/json_minifier.h for lasx */ +/* end file generic/stage1/find_next_document_index.h for rvv_vls */ +/* including generic/stage1/json_minifier.h for rvv_vls: #include <generic/stage1/json_minifier.h> */ +/* begin file generic/stage1/json_minifier.h for rvv_vls */ #ifndef SIMDJSON_SRC_GENERIC_STAGE1_JSON_MINIFIER_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -52336,7 +59263,7 @@ simdjson_inline uint32_t find_next_document_index(dom_parser_implementation &par // "simdjson/stage1.h" (this simplifies amalgation) namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace { namespace stage1 { @@ -52421,13 +59348,13 @@ error_code json_minifier::minify(const uint8_t *buf, size_t len, uint8_t *dst, s } // namespace stage1 } // unnamed namespace -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson #endif // SIMDJSON_SRC_GENERIC_STAGE1_JSON_MINIFIER_H -/* end file generic/stage1/json_minifier.h for lasx */ -/* including generic/stage1/json_structural_indexer.h for lasx: #include <generic/stage1/json_structural_indexer.h> */ -/* begin file generic/stage1/json_structural_indexer.h for lasx */ +/* end file generic/stage1/json_minifier.h for rvv_vls */ +/* including generic/stage1/json_structural_indexer.h for rvv_vls: #include <generic/stage1/json_structural_indexer.h> */ +/* begin file generic/stage1/json_structural_indexer.h for rvv_vls */ #ifndef SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRUCTURAL_INDEXER_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -52447,7 +59374,7 @@ error_code json_minifier::minify(const uint8_t *buf, size_t len, uint8_t *dst, s // "simdjson/stage1.h" (this simplifies amalgation) namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace { namespace stage1 { @@ -52779,16 +59706,16 @@ simdjson_inline error_code json_structural_indexer::finish(dom_parser_implementa } // namespace stage1 } // unnamed namespace -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson // Clear CUSTOM_BIT_INDEXER so other implementations can set it if they need to. #undef SIMDJSON_GENERIC_JSON_STRUCTURAL_INDEXER_CUSTOM_BIT_INDEXER #endif // SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRUCTURAL_INDEXER_H -/* end file generic/stage1/json_structural_indexer.h for lasx */ -/* including generic/stage1/utf8_validator.h for lasx: #include <generic/stage1/utf8_validator.h> */ -/* begin file generic/stage1/utf8_validator.h for lasx */ +/* end file generic/stage1/json_structural_indexer.h for rvv_vls */ +/* including generic/stage1/utf8_validator.h for rvv_vls: #include <generic/stage1/utf8_validator.h> */ +/* begin file generic/stage1/utf8_validator.h for rvv_vls */ #ifndef SIMDJSON_SRC_GENERIC_STAGE1_UTF8_VALIDATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -52799,7 +59726,7 @@ simdjson_inline error_code json_structural_indexer::finish(dom_parser_implementa /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace { namespace stage1 { @@ -52830,17 +59757,17 @@ bool generic_validate_utf8(const char * input, size_t length) { } // namespace stage1 } // unnamed namespace -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson #endif // SIMDJSON_SRC_GENERIC_STAGE1_UTF8_VALIDATOR_H -/* end file generic/stage1/utf8_validator.h for lasx */ -/* end file generic/stage1/amalgamated.h for lasx */ -/* including generic/stage2/amalgamated.h for lasx: #include <generic/stage2/amalgamated.h> */ -/* begin file generic/stage2/amalgamated.h for lasx */ +/* end file generic/stage1/utf8_validator.h for rvv_vls */ +/* end file generic/stage1/amalgamated.h for rvv_vls */ +/* including generic/stage2/amalgamated.h for rvv_vls: #include <generic/stage2/amalgamated.h> */ +/* begin file generic/stage2/amalgamated.h for rvv_vls */ // Stuff other things depend on -/* including generic/stage2/base.h for lasx: #include <generic/stage2/base.h> */ -/* begin file generic/stage2/base.h for lasx */ +/* including generic/stage2/base.h for rvv_vls: #include <generic/stage2/base.h> */ +/* begin file generic/stage2/base.h for rvv_vls */ #ifndef SIMDJSON_SRC_GENERIC_STAGE2_BASE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -52849,7 +59776,7 @@ bool generic_validate_utf8(const char * input, size_t length) { /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace { namespace stage2 { @@ -52860,13 +59787,13 @@ struct tape_writer; } // namespace stage2 } // unnamed namespace -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson #endif // SIMDJSON_SRC_GENERIC_STAGE2_BASE_H -/* end file generic/stage2/base.h for lasx */ -/* including generic/stage2/tape_writer.h for lasx: #include <generic/stage2/tape_writer.h> */ -/* begin file generic/stage2/tape_writer.h for lasx */ +/* end file generic/stage2/base.h for rvv_vls */ +/* including generic/stage2/tape_writer.h for rvv_vls: #include <generic/stage2/tape_writer.h> */ +/* begin file generic/stage2/tape_writer.h for rvv_vls */ #ifndef SIMDJSON_SRC_GENERIC_STAGE2_TAPE_WRITER_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -52878,7 +59805,7 @@ struct tape_writer; #include <cstring> namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace { namespace stage2 { @@ -52895,6 +59822,9 @@ struct tape_writer { /** Write a double value to tape. */ simdjson_inline void append_double(double value) noexcept; + /** Write a big integer (as string) to tape. src points to first digit, len is byte count. */ + simdjson_inline void append_bigint(const uint8_t *src, size_t len, uint8_t *&string_buf) noexcept; + /** * Append a tape entry (an 8-bit type,and 56 bits worth of value). */ @@ -52978,15 +59908,27 @@ simdjson_inline void tape_writer::write(uint64_t &tape_loc, uint64_t val, intern tape_loc = val | ((uint64_t(char(t))) << 56); } +simdjson_inline void tape_writer::append_bigint(const uint8_t *src, size_t len, uint8_t *&string_buf) noexcept { + // Write to string buffer: [4-byte LE length][digits][null] + uint32_t str_len = uint32_t(len); + memcpy(string_buf, &str_len, sizeof(uint32_t)); + memcpy(string_buf + sizeof(uint32_t), src, len); + string_buf[sizeof(uint32_t) + len] = 0; + // Tape entry: offset into string buffer + // The caller must set the offset relative to doc.string_buf base + append(0, internal::tape_type::BIGINT); // placeholder offset, caller patches + string_buf += sizeof(uint32_t) + len + 1; +} + } // namespace stage2 } // unnamed namespace -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson #endif // SIMDJSON_SRC_GENERIC_STAGE2_TAPE_WRITER_H -/* end file generic/stage2/tape_writer.h for lasx */ -/* including generic/stage2/logger.h for lasx: #include <generic/stage2/logger.h> */ -/* begin file generic/stage2/logger.h for lasx */ +/* end file generic/stage2/tape_writer.h for rvv_vls */ +/* including generic/stage2/logger.h for rvv_vls: #include <generic/stage2/logger.h> */ +/* begin file generic/stage2/logger.h for rvv_vls */ #ifndef SIMDJSON_SRC_GENERIC_STAGE2_LOGGER_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -53000,7 +59942,7 @@ simdjson_inline void tape_writer::write(uint64_t &tape_loc, uint64_t val, intern // This is for an internal-only stage 2 specific logger. // Set LOG_ENABLED = true to log what stage 2 is doing! namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace { namespace logger { @@ -53083,15 +60025,15 @@ namespace logger { } // namespace logger } // unnamed namespace -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson #endif // SIMDJSON_SRC_GENERIC_STAGE2_LOGGER_H -/* end file generic/stage2/logger.h for lasx */ +/* end file generic/stage2/logger.h for rvv_vls */ // All other declarations -/* including generic/stage2/json_iterator.h for lasx: #include <generic/stage2/json_iterator.h> */ -/* begin file generic/stage2/json_iterator.h for lasx */ +/* including generic/stage2/json_iterator.h for rvv_vls: #include <generic/stage2/json_iterator.h> */ +/* begin file generic/stage2/json_iterator.h for rvv_vls */ #ifndef SIMDJSON_SRC_GENERIC_STAGE2_JSON_ITERATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -53102,7 +60044,7 @@ namespace logger { /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace { namespace stage2 { @@ -53416,13 +60358,13 @@ simdjson_warn_unused simdjson_inline error_code json_iterator::visit_primitive(V } // namespace stage2 } // unnamed namespace -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson #endif // SIMDJSON_SRC_GENERIC_STAGE2_JSON_ITERATOR_H -/* end file generic/stage2/json_iterator.h for lasx */ -/* including generic/stage2/stringparsing.h for lasx: #include <generic/stage2/stringparsing.h> */ -/* begin file generic/stage2/stringparsing.h for lasx */ +/* end file generic/stage2/json_iterator.h for rvv_vls */ +/* including generic/stage2/stringparsing.h for rvv_vls: #include <generic/stage2/stringparsing.h> */ +/* begin file generic/stage2/stringparsing.h for rvv_vls */ #include <cstdint> #ifndef SIMDJSON_SRC_GENERIC_STAGE2_STRINGPARSING_H @@ -53436,7 +60378,7 @@ simdjson_warn_unused simdjson_inline error_code json_iterator::visit_primitive(V // It is intended to be included multiple times and compiled multiple times namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace { /// @private namespace stringparsing { @@ -53667,13 +60609,13 @@ simdjson_warn_unused simdjson_inline uint8_t *parse_wobbly_string(const uint8_t } // namespace stringparsing } // unnamed namespace -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson #endif // SIMDJSON_SRC_GENERIC_STAGE2_STRINGPARSING_H -/* end file generic/stage2/stringparsing.h for lasx */ -/* including generic/stage2/structural_iterator.h for lasx: #include <generic/stage2/structural_iterator.h> */ -/* begin file generic/stage2/structural_iterator.h for lasx */ +/* end file generic/stage2/stringparsing.h for rvv_vls */ +/* including generic/stage2/structural_iterator.h for rvv_vls: #include <generic/stage2/structural_iterator.h> */ +/* begin file generic/stage2/structural_iterator.h for rvv_vls */ #ifndef SIMDJSON_SRC_GENERIC_STAGE2_STRUCTURAL_ITERATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -53683,7 +60625,7 @@ simdjson_warn_unused simdjson_inline uint8_t *parse_wobbly_string(const uint8_t /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace { namespace stage2 { @@ -53734,13 +60676,13 @@ class structural_iterator { } // namespace stage2 } // unnamed namespace -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson #endif // SIMDJSON_SRC_GENERIC_STAGE2_STRUCTURAL_ITERATOR_H -/* end file generic/stage2/structural_iterator.h for lasx */ -/* including generic/stage2/tape_builder.h for lasx: #include <generic/stage2/tape_builder.h> */ -/* begin file generic/stage2/tape_builder.h for lasx */ +/* end file generic/stage2/structural_iterator.h for rvv_vls */ +/* including generic/stage2/tape_builder.h for rvv_vls: #include <generic/stage2/tape_builder.h> */ +/* begin file generic/stage2/tape_builder.h for rvv_vls */ #ifndef SIMDJSON_SRC_GENERIC_STAGE2_TAPE_BUILDER_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -53757,7 +60699,7 @@ class structural_iterator { namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace { namespace stage2 { @@ -53915,7 +60857,23 @@ simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_string( simdjson_warn_unused simdjson_inline error_code tape_builder::visit_number(json_iterator &iter, const uint8_t *value) noexcept { iter.log_value("number"); - return numberparsing::parse_number(value, tape); + error_code err = numberparsing::parse_number(value, tape); + if (simdjson_unlikely(err == BIGINT_ERROR && + iter.dom_parser._number_as_string)) { + // Write big integer to string buffer using the same format as strings. + // Scan digits the same way parse_number does (skip optional '-', then digits). + const uint8_t *p = value; + if (*p == '-') p++; + while (numberparsing::is_digit(*p)) p++; + size_t len = size_t(p - value); + tape.append(current_string_buf_loc - iter.dom_parser.doc->string_buf.get(), internal::tape_type::BIGINT); + uint8_t *dst = current_string_buf_loc + sizeof(uint32_t); + memcpy(dst, value, len); + dst += len; + on_end_string(dst); + return SUCCESS; + } + return err; } simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_number(json_iterator &iter, const uint8_t *value) noexcept { @@ -54034,18 +60992,18 @@ simdjson_inline void tape_builder::on_end_string(uint8_t *dst) noexcept { } // namespace stage2 } // unnamed namespace -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson #endif // SIMDJSON_SRC_GENERIC_STAGE2_TAPE_BUILDER_H -/* end file generic/stage2/tape_builder.h for lasx */ -/* end file generic/stage2/amalgamated.h for lasx */ +/* end file generic/stage2/tape_builder.h for rvv_vls */ +/* end file generic/stage2/amalgamated.h for rvv_vls */ // // Stage 1 // namespace simdjson { -namespace lasx { +namespace rvv_vls { simdjson_warn_unused error_code implementation::create_dom_parser_implementation( size_t capacity, @@ -54066,34 +61024,32 @@ namespace { using namespace simd; simdjson_inline json_character_block json_character_block::classify(const simd::simd8x64<uint8_t>& in) { - // Inspired by haswell. - // LASX use low 5 bits as index. For the 6 operators (:,[]{}), the unique-5bits is [6:2]. - // The ASCII white-space and operators have these values: (char, hex, unique-5bits) - // (' ', 20, 00000) ('\t', 09, 01001) ('\n', 0A, 01010) ('\r', 0D, 01101) - // (',', 2C, 01011) (':', 3A, 01110) ('[', 5B, 10110) ('{', 7B, 11110) (']', 5D, 10111) ('}', 7D, 11111) - const simd8<uint8_t> ws_table = simd8<uint8_t>::repeat_16( - ' ', 0, 0, 0, 0, 0, 0, 0, 0, '\t', '\n', 0, 0, '\r', 0, 0 - ); - const simd8<uint8_t> op_table_lo = simd8<uint8_t>::repeat_16( - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ',', 0, 0, ':', 0 - ); - const simd8<uint8_t> op_table_hi = simd8<uint8_t>::repeat_16( - 0, 0, 0, 0, 0, 0, '[', ']', 0, 0, 0, 0, 0, 0, '{', '}' - ); - uint64_t ws = in.eq({ - in.chunks[0].lookup_16(ws_table), - in.chunks[1].lookup_16(ws_table), - }); - uint64_t op = in.eq({ - __lasx_xvshuf_b(op_table_hi, op_table_lo, in.chunks[0].shr<2>()), - __lasx_xvshuf_b(op_table_hi, op_table_lo, in.chunks[1].shr<2>()), - }); + static const uint8_t wsTable[16] = { ' ', 100, 100, 100, 17, 100, 113, 2, 100, '\t', '\n', 112, 100, '\r', 100, 100 }; + static const uint8_t opTable[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ':', '{', ',', '}', 0, 0 }; + vuint8_t vws = __riscv_vle8_v_u8m1(wsTable, 16); + vuint8_t vop = __riscv_vle8_v_u8m1(opTable, 16); + vuint8x64_t lo = __riscv_vand(in, 15, 64); + vuint8x64_t curl = __riscv_vor(in, 0x20, 64); + +#if __riscv_v_fixed_vlen == 128 + vboolx64_t mws = __riscv_vmseq(simdutf_vrgather_u8m1x4(vws, lo), in, 64); + vboolx64_t mop = __riscv_vmseq(simdutf_vrgather_u8m1x4(vop, lo), curl, 64); +#elif __riscv_v_fixed_vlen == 256 + vboolx64_t mws = __riscv_vmseq(simdutf_vrgather_u8m1x2(vws, lo), in, 64); + vboolx64_t mop = __riscv_vmseq(simdutf_vrgather_u8m1x2(vop, lo), curl, 64); +#else + vboolx64_t mws = __riscv_vmseq(__riscv_vrgather(vws, lo, 64), in, 64); + vboolx64_t mop = __riscv_vmseq(__riscv_vrgather(vop, lo, 64), curl, 64); +#endif - return { ws, op }; + return { + __riscv_vmv_x(__riscv_vreinterpret_u64m1(mws)), + __riscv_vmv_x(__riscv_vreinterpret_u64m1(mop)) + }; } simdjson_inline bool is_ascii(const simd8x64<uint8_t>& input) { - return input.reduce_or().is_ascii(); + return input.is_ascii(); } simdjson_inline simd8<uint8_t> must_be_2_3_continuation(const simd8<uint8_t> prev2, const simd8<uint8_t> prev3) { @@ -54103,7 +61059,7 @@ simdjson_inline simd8<uint8_t> must_be_2_3_continuation(const simd8<uint8_t> pre } } // unnamed namespace -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson // @@ -54114,20 +61070,20 @@ simdjson_inline simd8<uint8_t> must_be_2_3_continuation(const simd8<uint8_t> pre // Implementation-specific overrides // namespace simdjson { -namespace lasx { +namespace rvv_vls { simdjson_warn_unused error_code implementation::minify(const uint8_t *buf, size_t len, uint8_t *dst, size_t &dst_len) const noexcept { - return lasx::stage1::json_minifier::minify<64>(buf, len, dst, dst_len); + return rvv_vls::stage1::json_minifier::minify<64>(buf, len, dst, dst_len); } simdjson_warn_unused error_code dom_parser_implementation::stage1(const uint8_t *_buf, size_t _len, stage1_mode streaming) noexcept { this->buf = _buf; this->len = _len; - return lasx::stage1::json_structural_indexer::index<64>(buf, len, *this, streaming); + return rvv_vls::stage1::json_structural_indexer::index<64>(buf, len, *this, streaming); } simdjson_warn_unused bool implementation::validate_utf8(const char *buf, size_t len) const noexcept { - return lasx::stage1::generic_validate_utf8(buf,len); + return rvv_vls::stage1::generic_validate_utf8(buf,len); } simdjson_warn_unused error_code dom_parser_implementation::stage2(dom::document &_doc) noexcept { @@ -54140,11 +61096,11 @@ simdjson_warn_unused error_code dom_parser_implementation::stage2_next(dom::docu SIMDJSON_NO_SANITIZE_MEMORY simdjson_warn_unused uint8_t *dom_parser_implementation::parse_string(const uint8_t *src, uint8_t *dst, bool allow_replacement) const noexcept { - return lasx::stringparsing::parse_string(src, dst, allow_replacement); + return rvv_vls::stringparsing::parse_string(src, dst, allow_replacement); } simdjson_warn_unused uint8_t *dom_parser_implementation::parse_wobbly_string(const uint8_t *src, uint8_t *dst) const noexcept { - return lasx::stringparsing::parse_wobbly_string(src, dst); + return rvv_vls::stringparsing::parse_wobbly_string(src, dst); } simdjson_warn_unused error_code dom_parser_implementation::parse(const uint8_t *_buf, size_t _len, dom::document &_doc) noexcept { @@ -54153,22 +61109,21 @@ simdjson_warn_unused error_code dom_parser_implementation::parse(const uint8_t * return stage2(_doc); } -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson -/* including simdjson/lasx/end.h: #include <simdjson/lasx/end.h> */ -/* begin file simdjson/lasx/end.h */ +/* including simdjson/rvv-vls/end.h: #include <simdjson/rvv-vls/end.h> */ +/* begin file simdjson/rvv-vls/end.h */ /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -#undef SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT -/* undefining SIMDJSON_IMPLEMENTATION from "lasx" */ +/* undefining SIMDJSON_IMPLEMENTATION from "rvv_vls" */ #undef SIMDJSON_IMPLEMENTATION -/* end file simdjson/lasx/end.h */ +/* end file simdjson/rvv-vls/end.h */ -#endif // SIMDJSON_SRC_LASX_CPP -/* end file lasx.cpp */ +#endif // SIMDJSON_SRC_RVV_VLS_CPP +/* end file rvv-vls.cpp */ #endif #if SIMDJSON_IMPLEMENTATION_FALLBACK /* including fallback.cpp: #include <fallback.cpp> */ @@ -54256,6 +61211,19 @@ simdjson_inline int leading_zeroes(uint64_t input_num) { #endif// _MSC_VER } +simdjson_inline int trailing_zeroes(uint64_t input_num) { +#ifdef _MSC_VER + unsigned long trailing_zero = 0; + // Search the mask data from least significant bit (LSB) + // to most significant bit (MSB) for a set bit (1). + if (_BitScanForward64(&trailing_zero, input_num)) + return (int)trailing_zero; + else return 64; +#else + return __builtin_ctzll(input_num); +#endif// _MSC_VER +} + } // unnamed namespace } // namespace fallback } // namespace simdjson @@ -54436,10 +61404,12 @@ simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t /* amalgamation skipped (editor-only): #include "simdjson/arm64/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_PPC64 */ /* amalgamation skipped (editor-only): #include "simdjson/ppc64/begin.h" */ -/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LSX */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LASX */ /* amalgamation skipped (editor-only): #include "simdjson/lasx/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LSX */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_RVV_VLS */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_FALLBACK */ /* amalgamation skipped (editor-only): #include "simdjson/fallback/begin.h" */ /* amalgamation skipped (editor-only): #else */ @@ -56485,6 +63455,19 @@ simdjson_inline int leading_zeroes(uint64_t input_num) { #endif// _MSC_VER } +simdjson_inline int trailing_zeroes(uint64_t input_num) { +#ifdef _MSC_VER + unsigned long trailing_zero = 0; + // Search the mask data from least significant bit (LSB) + // to most significant bit (MSB) for a set bit (1). + if (_BitScanForward64(&trailing_zero, input_num)) + return (int)trailing_zero; + else return 64; +#else + return __builtin_ctzll(input_num); +#endif// _MSC_VER +} + } // unnamed namespace } // namespace fallback } // namespace simdjson @@ -57461,6 +64444,9 @@ struct tape_writer { /** Write a double value to tape. */ simdjson_inline void append_double(double value) noexcept; + /** Write a big integer (as string) to tape. src points to first digit, len is byte count. */ + simdjson_inline void append_bigint(const uint8_t *src, size_t len, uint8_t *&string_buf) noexcept; + /** * Append a tape entry (an 8-bit type,and 56 bits worth of value). */ @@ -57544,6 +64530,18 @@ simdjson_inline void tape_writer::write(uint64_t &tape_loc, uint64_t val, intern tape_loc = val | ((uint64_t(char(t))) << 56); } +simdjson_inline void tape_writer::append_bigint(const uint8_t *src, size_t len, uint8_t *&string_buf) noexcept { + // Write to string buffer: [4-byte LE length][digits][null] + uint32_t str_len = uint32_t(len); + memcpy(string_buf, &str_len, sizeof(uint32_t)); + memcpy(string_buf + sizeof(uint32_t), src, len); + string_buf[sizeof(uint32_t) + len] = 0; + // Tape entry: offset into string buffer + // The caller must set the offset relative to doc.string_buf base + append(0, internal::tape_type::BIGINT); // placeholder offset, caller patches + string_buf += sizeof(uint32_t) + len + 1; +} + } // namespace stage2 } // unnamed namespace } // namespace fallback @@ -57727,7 +64725,23 @@ simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_string( simdjson_warn_unused simdjson_inline error_code tape_builder::visit_number(json_iterator &iter, const uint8_t *value) noexcept { iter.log_value("number"); - return numberparsing::parse_number(value, tape); + error_code err = numberparsing::parse_number(value, tape); + if (simdjson_unlikely(err == BIGINT_ERROR && + iter.dom_parser._number_as_string)) { + // Write big integer to string buffer using the same format as strings. + // Scan digits the same way parse_number does (skip optional '-', then digits). + const uint8_t *p = value; + if (*p == '-') p++; + while (numberparsing::is_digit(*p)) p++; + size_t len = size_t(p - value); + tape.append(current_string_buf_loc - iter.dom_parser.doc->string_buf.get(), internal::tape_type::BIGINT); + uint8_t *dst = current_string_buf_loc + sizeof(uint32_t); + memcpy(dst, value, len); + dst += len; + on_end_string(dst); + return SUCCESS; + } + return err; } simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_number(json_iterator &iter, const uint8_t *value) noexcept { diff --git a/deps/simdjson/simdjson.h b/deps/simdjson/simdjson.h index 1d6560e80fab04..3a413a7d1e046e 100644 --- a/deps/simdjson/simdjson.h +++ b/deps/simdjson/simdjson.h @@ -1,4 +1,4 @@ -/* auto-generated on 2025-12-17 20:32:36 -0500. version 4.2.4 Do not edit! */ +/* auto-generated on 2026-03-25 17:25:37 -0400. version 4.5.0 Do not edit! */ /* including simdjson.h: */ /* begin file simdjson.h */ #ifndef SIMDJSON_H @@ -166,7 +166,6 @@ #define SIMDJSON_CONSTEVAL 0 #endif // defined(__cpp_consteval) && __cpp_consteval >= 201811L && defined(__cpp_lib_constexpr_string) && __cpp_lib_constexpr_string >= 201907L #endif // !defined(SIMDJSON_CONSTEVAL) - #endif // SIMDJSON_COMPILER_CHECK_H /* end file simdjson/compiler_check.h */ /* including simdjson/portability.h: #include "simdjson/portability.h" */ @@ -218,24 +217,47 @@ using std::size_t; #define SIMDJSON_IS_ARM64 1 #elif defined(__riscv) && __riscv_xlen == 64 #define SIMDJSON_IS_RISCV64 1 + #if __riscv_v_intrinsic >= 11000 #define SIMDJSON_HAS_RVV_INTRINSICS 1 #endif - #define SIMDJSON_HAS_ZVBB_INTRINSICS \ - 0 // there is currently no way to detect this + #if SIMDJSON_HAS_RVV_INTRINSICS && __riscv_vector && __riscv_v_min_vlen >= 128 && __riscv_v_elen >= 64 + #define SIMDJSON_IS_RVV 1 // RISC-V V extension + #endif - #if SIMDJSON_HAS_RVV_INTRINSICS && __riscv_vector && \ - __riscv_v_min_vlen >= 128 && __riscv_v_elen >= 64 - // RISC-V V extension - #define SIMDJSON_IS_RVV 1 - #if SIMDJSON_HAS_ZVBB_INTRINSICS && __riscv_zvbb >= 1000000 - // RISC-V Vector Basic Bit-manipulation - #define SIMDJSON_IS_ZVBB 1 - #endif + // current toolchains don't support fixed-size SIMD types that don't match VLEN directly + #if __riscv_v_fixed_vlen >= 128 && __riscv_v_fixed_vlen <= 512 + #define SIMDJSON_IS_RVV_VLS 1 #endif + #elif defined(__loongarch_lp64) #define SIMDJSON_IS_LOONGARCH64 1 +#if defined(__loongarch_sx) && defined(__loongarch_asx) + #define SIMDJSON_IS_LSX 1 + #define SIMDJSON_IS_LASX 1 // We can always run both +#elif defined(__loongarch_sx) + #define SIMDJSON_IS_LSX 1 + +// Adjust for runtime dispatching support. +#if defined(__GNUC__) && !defined(__clang__) && !defined(__INTEL_COMPILER) && !defined(__NVCOMPILER) +#if __GNUC__ > 15 || (__GNUC__ == 15 && __GNUC_MINOR__ >= 0) + // We are ok, we will support runtime dispatch for LASX. +#else + // We disable runtime dispatch for LASX, which means that we will not be able to use LASX + // even if it is supported by the hardware. + // Loongson users should update to GCC 15 or better. + #define SIMDJSON_IMPLEMENTATION_LASX 0 +#endif +#else + // We are not using GCC, so we assume that we can support runtime dispatch for LASX. + // https://godbolt.org/z/jcMnrjYhs + #define SIMDJSON_IMPLEMENTATION_LASX 0 +#endif + + + +#endif #elif defined(__PPC64__) || defined(_M_PPC64) #define SIMDJSON_IS_PPC64 1 #if defined(__ALTIVEC__) @@ -291,7 +313,7 @@ using std::size_t; // // We are going to use runtime dispatch. -#if SIMDJSON_IS_X86_64 +#if defined(SIMDJSON_IS_X86_64) || defined(SIMDJSON_IS_LSX) #ifdef __clang__ // clang does not have GCC push pop // warning: clang attribute push can't be used within a namespace in clang up @@ -308,7 +330,7 @@ using std::size_t; #define SIMDJSON_UNTARGET_REGION _Pragma("GCC pop_options") #endif // clang then gcc -#endif // x86 +#endif // defined(SIMDJSON_IS_X86_64) || defined(SIMDJSON_IS_LSX) // Default target region macros don't do anything. #ifndef SIMDJSON_TARGET_REGION @@ -377,7 +399,8 @@ using std::size_t; #define simdjson_strncasecmp strncasecmp #endif -#if defined(NDEBUG) || defined(__OPTIMIZE__) || (defined(_MSC_VER) && !defined(_DEBUG)) +#if (defined(NDEBUG) || defined(__OPTIMIZE__) || (defined(_MSC_VER) && !defined(_DEBUG))) && !SIMDJSON_DEVELOPMENT_CHECKS +// If SIMDJSON_DEVELOPMENT_CHECKS is undefined or 0, we consider that we are in release mode. // If NDEBUG is set, or __OPTIMIZE__ is set, or we are under MSVC in release mode, // then do away with asserts and use __assume. // We still recommend that our users set NDEBUG in release mode. @@ -389,7 +412,7 @@ using std::size_t; #define SIMDJSON_ASSUME(COND) do { if (!(COND)) __builtin_unreachable(); } while (0) #endif -#else // defined(NDEBUG) || defined(__OPTIMIZE__) || (defined(_MSC_VER) && !defined(_DEBUG)) +#else // defined(NDEBUG) || defined(__OPTIMIZE__) || (defined(_MSC_VER) && !defined(_DEBUG)) && !SIMDJSON_DEVELOPMENT_CHECKS // This should only ever be enabled in debug mode. #define SIMDJSON_UNREACHABLE() assert(0); #define SIMDJSON_ASSUME(COND) assert(COND) @@ -2432,7 +2455,9 @@ namespace std { // when the compiler is optimizing. // We only set SIMDJSON_DEVELOPMENT_CHECKS if both __OPTIMIZE__ // and NDEBUG are not defined. -#if !defined(__OPTIMIZE__) && !defined(NDEBUG) +// We recognize _DEBUG as overriding __OPTIMIZE__ so that if both +// __OPTIMIZE__ and _DEBUG are defined, we still set SIMDJSON_DEVELOPMENT_CHECKS. +#if ((!defined(__OPTIMIZE__) || defined(_DEBUG)) && !defined(NDEBUG)) #define SIMDJSON_DEVELOPMENT_CHECKS 1 #endif // __OPTIMIZE__ #endif // _MSC_VER @@ -2513,7 +2538,7 @@ namespace std { #define SIMDJSON_SIMDJSON_VERSION_H /** The version of simdjson being used (major.minor.revision) */ -#define SIMDJSON_VERSION "4.2.4" +#define SIMDJSON_VERSION "4.5.0" namespace simdjson { enum { @@ -2524,11 +2549,11 @@ enum { /** * The minor version (major.MINOR.revision) of simdjson being used. */ - SIMDJSON_VERSION_MINOR = 2, + SIMDJSON_VERSION_MINOR = 5, /** * The revision (major.minor.REVISION) of simdjson being used. */ - SIMDJSON_VERSION_REVISION = 4 + SIMDJSON_VERSION_REVISION = 0 }; } // namespace simdjson @@ -3300,7 +3325,7 @@ enum class tape_type; namespace simdjson { inline bool is_fatal(error_code error) noexcept { - return error == TAPE_ERROR || error == INCOMPLETE_ARRAY_OR_OBJECT; + return error == TAPE_ERROR || error == INCOMPLETE_ARRAY_OR_OBJECT || error == OUT_OF_ORDER_ITERATION || error == DEPTH_ERROR; } namespace internal { @@ -3767,6 +3792,12 @@ class dom_parser_implementation { */ size_t _max_depth{0}; +public: + /** Whether to store big integers as strings instead of returning BIGINT_ERROR */ + bool _number_as_string{false}; + +protected: + // Declaring these so that subclasses can use them to implement their constructors. simdjson_inline dom_parser_implementation() noexcept; simdjson_inline dom_parser_implementation(dom_parser_implementation &&other) noexcept; @@ -4140,6 +4171,16 @@ struct padded_string final { **/ char *data() noexcept; + /** + * Append data to the padded string. Return true on success, false on failure. + * The complexity is O(n) where n is the new size of the string. If you are + * doing multiple appends, consider using padded_string_builder for better performance. + * + * @param data the buffer to append + * @param length the number of bytes to append + */ + inline bool append(const char *data, size_t length) noexcept; + /** * Create a std::string_view with the same content. */ @@ -4173,7 +4214,7 @@ struct padded_string final { /** * This function accepts a wide string path (UTF-16) and converts it to * UTF-8 before loading the file. This allows windows users to work - * with unicode file paths without manually converting the paths everytime. + * with unicode file paths without manually converting the paths every time. * * @return IO_ERROR on error, including conversion failures. * @@ -4183,6 +4224,7 @@ struct padded_string final { #endif private: + friend class padded_string_builder; padded_string &operator=(const padded_string &o) = delete; padded_string(const padded_string &o) = delete; @@ -4191,6 +4233,101 @@ struct padded_string final { }; // padded_string +/** + * Builder for constructing padded_string incrementally. + * + * This class allows efficient appending of data and then building a padded_string. + */ +class padded_string_builder { +public: + /** + * Create a new, empty padded string builder. + */ + inline padded_string_builder() noexcept; + + /** + * Create a new padded string builder with initial capacity. + * + * @param capacity the initial capacity of the builder. + */ + inline padded_string_builder(size_t capacity) noexcept; + + /** + * Move constructor. + */ + inline padded_string_builder(padded_string_builder &&o) noexcept; + + /** + * Move assignment. + */ + inline padded_string_builder &operator=(padded_string_builder &&o) noexcept; + + /** + * Copy constructor (deleted). + */ + padded_string_builder(const padded_string_builder &) = delete; + + /** + * Copy assignment (deleted). + */ + padded_string_builder &operator=(const padded_string_builder &) = delete; + + /** + * Destructor. + */ + inline ~padded_string_builder() noexcept; + + /** + * Append data to the builder. + * + * @param newdata the buffer to append + * @param length the number of bytes to append + * @return true if the append succeeded, false if allocation failed + */ + inline bool append(const char *newdata, size_t length) noexcept; + + /** + * Append a string view to the builder. + * + * @param sv the string view to append + * @return true if the append succeeded, false if allocation failed + */ + inline bool append(std::string_view sv) noexcept; + + /** + * Get the current length of the built string. + */ + inline size_t length() const noexcept; + + /** + * Build a padded_string from the current content. The builder's content + * is not modified. If you want to avoid the copy, use convert() instead. + * + * @return a padded_string containing a copy of the built content. + */ + inline padded_string build() const noexcept; + + /** + * Convert the current content into a padded_string. The + * builder's content is emptied, the capacity is lost. + * + * @return a padded_string containing the built content. + */ + inline padded_string convert() noexcept; +private: + size_t size{0}; + size_t capacity{0}; + char *data{nullptr}; + + /** + * Ensure the builder has enough capacity. + * + * @param additional the additional capacity needed. + * @return true if the reservation succeeded, false if allocation failed + */ + inline bool reserve(size_t additional) noexcept; +}; + /** * Send padded_string instance to an output stream. * @@ -4213,6 +4350,62 @@ inline std::ostream& operator<<(std::ostream& out, const padded_string& s) { ret inline std::ostream& operator<<(std::ostream& out, simdjson_result<padded_string> &s) noexcept(false) { return out << s.value(); } #endif + +#ifndef _WIN32 +/** + * A class representing a memory-mapped file with padding. + * It is only available on non-Windows platforms, as Windows has different APIs for memory mapping. + */ +class padded_memory_map { +public: + /** + * Create a new padded memory map for the given file. + * After creating the memory map, you can call view() to get a padded_string_view of the file content. + * The memory map will be automatically released when the padded_memory_map instance is destroyed. + * Note that the file content is not copied, so this is efficient for large files. However, + * the file must remain unchanged while the memory map is in use. In case of error (e.g., file not found, + * permission denied, etc.), the memory map will be invalid and view() will return an empty view. + * You can check if the memory map is valid by calling is_valid() before using view(). + * + * @param filename the path to the file to memory-map. + */ + simdjson_inline padded_memory_map(const char *filename) noexcept; + /** + * Destroy the padded memory map and release any resources. + */ + simdjson_inline ~padded_memory_map() noexcept; + + // lifetime of the view is tied to the memory map, so we can return a view + // directly + /** + * Get a view of the memory-mapped file. It always succeeds, but the view may be empty + * if the memory map is invalid (e.g., due to file not found, permission denied, etc.). + * You can check if the memory map is valid by calling is_valid() before using the view. + * + * Lifetime of the view is tied to the memory map, so the view should not be used after the + * padded_memory_map instance is destroyed. + * + * @return a padded_string_view representing the memory-mapped file, or an empty view if the memory map is invalid. + */ + simdjson_inline simdjson::padded_string_view view() const noexcept simdjson_lifetime_bound; + /** + * Check if the memory map is valid. + * + * @return true if the memory map is valid, false otherwise. + */ + simdjson_inline bool is_valid() const noexcept; + +private: + padded_memory_map() = delete; + padded_memory_map(const padded_memory_map &) = delete; + padded_memory_map &operator=(const padded_memory_map &) = delete; + const char *data{nullptr}; + size_t size{0}; +}; +#endif // _WIN32 + + + } // namespace simdjson // This is deliberately outside of simdjson so that people get it without having to use the namespace @@ -4291,7 +4484,7 @@ namespace simdjson { */ class padded_string_view : public std::string_view { private: - size_t _capacity; + size_t _capacity{0}; public: /** Create an empty padded_string_view. */ @@ -4495,6 +4688,14 @@ inline padded_string_view pad_with_reserve(std::string& s) noexcept { #include <climits> #include <cwchar> +#ifndef _WIN32 +#include <fcntl.h> +#include <stdio.h> +#include <sys/mman.h> +#include <sys/stat.h> +#include <unistd.h> +#endif + namespace simdjson { namespace internal { @@ -4611,6 +4812,33 @@ inline const char *padded_string::data() const noexcept { return data_ptr; } inline char *padded_string::data() noexcept { return data_ptr; } +inline bool padded_string::append(const char *data, size_t length) noexcept { + if (length == 0) { + return true; // Nothing to append + } + size_t new_size = viable_size + length; + if (new_size < viable_size) { + // Overflow, cannot append + return false; + } + char *new_data_ptr = internal::allocate_padded_buffer(new_size); + if (new_data_ptr == nullptr) { + // Allocation failed, cannot append + return false; + } + // Copy existing data + if (viable_size > 0) { + std::memcpy(new_data_ptr, data_ptr, viable_size); + } + // Copy new data + std::memcpy(new_data_ptr + viable_size, data, length); + // Update + delete[] data_ptr; + data_ptr = new_data_ptr; + viable_size = new_size; + return true; +} + inline padded_string::operator std::string_view() const simdjson_lifetime_bound { return std::string_view(data(), length()); } inline padded_string::operator padded_string_view() const noexcept simdjson_lifetime_bound { @@ -4727,6 +4955,154 @@ inline simdjson_result<padded_string> padded_string::load(std::wstring_view file } #endif +// padded_string_builder implementations + +inline padded_string_builder::padded_string_builder() noexcept = default; + +inline padded_string_builder::padded_string_builder(size_t new_capacity) noexcept { + if (new_capacity > 0) { + data = internal::allocate_padded_buffer(new_capacity); + if (data != nullptr) { + this->capacity = new_capacity; + } + } +} + +inline padded_string_builder::padded_string_builder(padded_string_builder &&o) noexcept + : size(o.size), capacity(o.capacity), data(o.data) { + o.size = 0; + o.capacity = 0; + o.data = nullptr; +} + +inline padded_string_builder &padded_string_builder::operator=(padded_string_builder &&o) noexcept { + if (this != &o) { + delete[] data; + size = o.size; + capacity = o.capacity; + data = o.data; + o.size = 0; + o.capacity = 0; + o.data = nullptr; + } + return *this; +} + +inline padded_string_builder::~padded_string_builder() noexcept { + delete[] data; +} + +inline bool padded_string_builder::append(const char *newdata, size_t length) noexcept { + if (length == 0) { + return true; + } + if (!reserve(length)) { + return false; + } + std::memcpy(data + size, newdata, length); + size += length; + return true; +} + +inline bool padded_string_builder::append(std::string_view sv) noexcept { + return append(sv.data(), sv.size()); +} + +inline size_t padded_string_builder::length() const noexcept { + return size; +} + +inline padded_string padded_string_builder::build() const noexcept { + return padded_string(data, size); +} + +inline padded_string padded_string_builder::convert() noexcept { + padded_string result{}; + result.data_ptr = data; + result.viable_size = size; + data = nullptr; + size = 0; + capacity = 0; + return result; +} + +inline bool padded_string_builder::reserve(size_t additional) noexcept { + size_t needed = size + additional; + if (needed <= capacity) { + return true; + } + size_t new_capacity = needed; + // We are going to grow the capacity exponentially to avoid + // repeated allocations. + if (new_capacity < 4096) { + new_capacity *= 2; + } else { + new_capacity += new_capacity/2; // grow by 1.5x + } + char *new_data = internal::allocate_padded_buffer(new_capacity); + if (new_data == nullptr) { + return false; // Allocation failed + } + if (size > 0) { + std::memcpy(new_data, data, size); + } + delete[] data; + data = new_data; + capacity = new_capacity; + return true; +} + + +#ifndef _WIN32 +simdjson_inline padded_memory_map::padded_memory_map(const char *filename) noexcept { + + int fd = open(filename, O_RDONLY); + if (fd == -1) { + return; // file not found or cannot be opened, data will be nullptr + } + struct stat st; + if (fstat(fd, &st) == -1) { + close(fd); + return; // failed to get file size, data will be nullptr + } + size = static_cast<size_t>(st.st_size); + size_t total_size = size + simdjson::SIMDJSON_PADDING; + void *anon_map = + mmap(NULL, total_size, PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + if (anon_map == MAP_FAILED) { + close(fd); + return; // failed to create anonymous mapping, data will be nullptr + } + void *file_map = + mmap(anon_map, size, PROT_READ, MAP_SHARED | MAP_FIXED, fd, 0); + if (file_map == MAP_FAILED) { + munmap(anon_map, total_size); + close(fd); + return; // failed to mmap file, data will be nullptr + } + data = static_cast<const char *>(file_map); + close(fd); // no longer needed after mapping +} + +simdjson_inline padded_memory_map::~padded_memory_map() noexcept { + if (data != nullptr) { + munmap(const_cast<char *>(data), size + simdjson::SIMDJSON_PADDING); + } +} + + +simdjson_inline simdjson::padded_string_view padded_memory_map::view() const noexcept simdjson_lifetime_bound { + if(!is_valid()) { + return simdjson::padded_string_view(); // return an empty view if mapping failed + } + return simdjson::padded_string_view(data, size, size + simdjson::SIMDJSON_PADDING); +} + +simdjson_inline bool padded_memory_map::is_valid() const noexcept { + return data != nullptr; +} +#endif // _WIN32 + } // namespace simdjson inline simdjson::padded_string operator ""_padded(const char *str, size_t len) { @@ -4737,6 +5113,7 @@ inline simdjson::padded_string operator ""_padded(const char8_t *str, size_t len return simdjson::padded_string(reinterpret_cast<const char *>(str), len); } #endif + #endif // SIMDJSON_PADDED_STRING_INL_H /* end file simdjson/padded_string-inl.h */ /* skipped duplicate #include "simdjson/padded_string_view.h" */ @@ -5793,6 +6170,13 @@ class parser { inline bool dump_raw_tape(std::ostream &os) const noexcept; + /** + * When enabled, big integers (exceeding uint64 range) are stored as strings + * in the tape instead of returning BIGINT_ERROR. Default: false. + */ + inline void number_as_string(bool enabled) noexcept { _number_as_string = enabled; } + inline bool number_as_string() const noexcept { return _number_as_string; } + private: /** * The maximum document length this parser will automatically support. @@ -5801,6 +6185,9 @@ class parser { */ size_t _max_capacity; + /** Whether to store big integers as strings instead of returning BIGINT_ERROR */ + bool _number_as_string{false}; + /** * The loaded buffer (reused each time load() is called) */ @@ -6194,7 +6581,8 @@ enum class element_type { DOUBLE = 'd', ///< double: Any number with a "." or "e" that fits in double. STRING = '"', ///< std::string_view BOOL = 't', ///< bool - NULL_VALUE = 'n' ///< null + NULL_VALUE = 'n', ///< null + BIGINT = 'Z' ///< std::string_view: big integer stored as raw digit string }; /** @@ -6293,6 +6681,14 @@ class element { */ inline simdjson_result<bool> get_bool() const noexcept; + /** + * Read this element as a big integer (raw digit string). + * + * @returns A string_view of the raw digits, or: + * INCORRECT_TYPE if the JSON element is not a big integer. + */ + inline simdjson_result<std::string_view> get_bigint() const noexcept; + /** * Whether this element is a json array. * @@ -6348,6 +6744,11 @@ class element { */ inline bool is_null() const noexcept; + /** + * Whether this element is a big integer (number exceeding 64-bit range). + */ + inline bool is_bigint() const noexcept; + /** * Tell whether the value can be cast to provided type (T). * @@ -6706,6 +7107,7 @@ struct simdjson_result<dom::element> : public internal::simdjson_result_base<dom simdjson_inline simdjson_result<uint64_t> get_uint64() const noexcept; simdjson_inline simdjson_result<double> get_double() const noexcept; simdjson_inline simdjson_result<bool> get_bool() const noexcept; + simdjson_inline simdjson_result<std::string_view> get_bigint() const noexcept; simdjson_inline bool is_array() const noexcept; simdjson_inline bool is_object() const noexcept; @@ -6716,6 +7118,7 @@ struct simdjson_result<dom::element> : public internal::simdjson_result_base<dom simdjson_inline bool is_number() const noexcept; simdjson_inline bool is_bool() const noexcept; simdjson_inline bool is_null() const noexcept; + simdjson_inline bool is_bigint() const noexcept; simdjson_inline simdjson_result<dom::element> operator[](std::string_view key) const noexcept; simdjson_inline simdjson_result<dom::element> operator[](const char *key) const noexcept; @@ -7389,6 +7792,168 @@ template <class T> std::string prettify(simdjson_result<T> x) { #endif /* end file simdjson/dom/serialization.h */ +/* including simdjson/dom/fractured_json.h: #include "simdjson/dom/fractured_json.h" */ +/* begin file simdjson/dom/fractured_json.h */ +#ifndef SIMDJSON_DOM_FRACTURED_JSON_H +#define SIMDJSON_DOM_FRACTURED_JSON_H + +/* skipped duplicate #include "simdjson/dom/base.h" */ +/* skipped duplicate #include "simdjson/dom/element.h" */ + +namespace simdjson { + +/** + * Configuration options for FracturedJson formatting. + * + * FracturedJson intelligently chooses between different layout strategies + * (inline, compact multiline, table, expanded) based on content complexity, + * length, and structure similarity. + */ +struct fractured_json_options { + /** + * Maximum total characters per line (default: 120). + * Content exceeding this will be expanded to multiple lines. + */ + size_t max_total_line_length = 120; + + /** + * Maximum length for inlined elements (default: 80). + * Simple arrays/objects shorter than this may be rendered inline. + */ + size_t max_inline_length = 80; + + /** + * Maximum nesting depth for inline rendering (default: 2). + * Elements with complexity exceeding this will be expanded. + * Complexity 0 = scalar, 1 = flat array/object, 2 = one level of nesting. + */ + size_t max_inline_complexity = 2; + + /** + * Maximum complexity for compact array formatting (default: 1). + * Arrays with elements of this complexity or less may have multiple + * items per line. + */ + size_t max_compact_array_complexity = 1; + + /** + * Number of spaces per indentation level (default: 4). + */ + size_t indent_spaces = 4; + + /** + * Enable tabular formatting for arrays of similar objects (default: true). + * When enabled, arrays of objects with identical keys are formatted + * as aligned tables. + */ + bool enable_table_format = true; + + /** + * Minimum number of rows to trigger table mode (default: 3). + */ + size_t min_table_rows = 3; + + /** + * Similarity threshold for table detection (default: 0.8). + * Objects must share at least this fraction of keys to be formatted + * as a table. + */ + double table_similarity_threshold = 0.8; + + /** + * Enable compact multiline arrays (default: true). + * When enabled, arrays of simple elements may have multiple items + * per line. + */ + bool enable_compact_multiline = true; + + /** + * Maximum array items per line in compact mode (default: 10). + */ + size_t max_items_per_line = 10; + + /** + * Add space inside brackets for simple containers (default: true). + * When true: { "key": "value" } + * When false: {"key": "value"} + */ + bool simple_bracket_padding = true; + + /** + * Add space after colons (default: true). + * When true: "key": "value" + * When false: "key":"value" + */ + bool colon_padding = true; + + /** + * Add space after commas in inline content (default: true). + * When true: [1, 2, 3] + * When false: [1,2,3] + */ + bool comma_padding = true; +}; + +/** + * Format JSON using FracturedJson formatting with default options. + * + * FracturedJson produces human-readable yet compact output by intelligently + * choosing between inline, compact multiline, table, and expanded layouts. + * + * dom::parser parser; + * element doc = parser.parse(json_string); + * cout << fractured_json(doc) << endl; + */ +template <class T> +std::string fractured_json(T x); + +/** + * Format JSON using FracturedJson formatting with custom options. + * + * dom::parser parser; + * element doc = parser.parse(json_string); + * fractured_json_options opts; + * opts.max_total_line_length = 80; + * cout << fractured_json(doc, opts) << endl; + */ +template <class T> +std::string fractured_json(T x, const fractured_json_options& options); + +#if SIMDJSON_EXCEPTIONS +template <class T> +std::string fractured_json(simdjson_result<T> x); + +template <class T> +std::string fractured_json(simdjson_result<T> x, const fractured_json_options& options); +#endif + +/** + * Format a JSON string using FracturedJson formatting. + * + * This is useful for formatting output from the builder/static reflection API + * or any valid JSON string. + * + * // With static reflection + * MyStruct data = {...}; + * auto minified = simdjson::to_json_string(data); + * auto formatted = simdjson::fractured_json_string(minified.value()); + * + * // Or with any JSON string + * std::string json = R"({"key":"value"})"; + * auto formatted = simdjson::fractured_json_string(json); + */ +inline std::string fractured_json_string(std::string_view json_str); + +/** + * Format a JSON string using FracturedJson formatting with custom options. + */ +inline std::string fractured_json_string(std::string_view json_str, + const fractured_json_options& options); + +} // namespace simdjson + +#endif // SIMDJSON_DOM_FRACTURED_JSON_H +/* end file simdjson/dom/fractured_json.h */ // Inline functions /* including simdjson/dom/array-inl.h: #include "simdjson/dom/array-inl.h" */ @@ -7544,7 +8109,8 @@ enum class tape_type { DOUBLE = 'd', TRUE_VALUE = 't', FALSE_VALUE = 'f', - NULL_VALUE = 'n' + NULL_VALUE = 'n', + BIGINT = 'Z' // Big integer stored as string in string buffer }; // enum class tape_type } // namespace internal @@ -8418,6 +8984,10 @@ simdjson_inline simdjson_result<bool> simdjson_result<dom::element>::get_bool() if (error()) { return error(); } return first.get_bool(); } +simdjson_inline simdjson_result<std::string_view> simdjson_result<dom::element>::get_bigint() const noexcept { + if (error()) { return error(); } + return first.get_bigint(); +} simdjson_inline bool simdjson_result<dom::element>::is_array() const noexcept { return !error() && first.is_array(); @@ -8447,6 +9017,9 @@ simdjson_inline bool simdjson_result<dom::element>::is_bool() const noexcept { simdjson_inline bool simdjson_result<dom::element>::is_null() const noexcept { return !error() && first.is_null(); } +simdjson_inline bool simdjson_result<dom::element>::is_bigint() const noexcept { + return !error() && first.is_bigint(); +} simdjson_inline simdjson_result<dom::element> simdjson_result<dom::element>::operator[](std::string_view key) const noexcept { if (error()) { return error(); } @@ -8555,6 +9128,15 @@ inline simdjson_result<bool> element::get_bool() const noexcept { } return INCORRECT_TYPE; } +inline simdjson_result<std::string_view> element::get_bigint() const noexcept { + SIMDJSON_DEVELOPMENT_ASSERT(tape.usable()); + switch (tape.tape_ref_type()) { + case internal::tape_type::BIGINT: + return tape.get_string_view(); + default: + return INCORRECT_TYPE; + } +} inline simdjson_result<const char *> element::get_c_str() const noexcept { SIMDJSON_DEVELOPMENT_ASSERT(tape.usable()); // https://github.com/simdjson/simdjson/issues/1914 switch (tape.tape_ref_type()) { @@ -8697,6 +9279,10 @@ inline bool element::is_null() const noexcept { return tape.is_null_on_tape(); } +inline bool element::is_bigint() const noexcept { + return tape.tape_ref_type() == internal::tape_type::BIGINT; +} + #if SIMDJSON_EXCEPTIONS inline element::operator bool() const noexcept(false) { return get<bool>(); } @@ -8829,6 +9415,8 @@ inline std::ostream& operator<<(std::ostream& out, element_type type) { return out << "bool"; case element_type::NULL_VALUE: return out << "null"; + case element_type::BIGINT: + return out << "bigint"; default: return out << "unexpected content!!!"; // abort() usage is forbidden in the library } @@ -8996,6 +9584,7 @@ inline simdjson_result<element> parser::parse_into_document(document& provided_d buf += 3; len -= 3; } + implementation->_number_as_string = _number_as_string; _error = implementation->parse(buf, len, provided_doc); if (_error) { return _error; } @@ -9674,6 +10263,15 @@ inline bool document::dump_raw_tape(std::ostream &os) const noexcept { case 'r': // we start and end with the root node // should we be hitting the root node? return false; + case 'Z': // we have a big integer + os << "bigint "; + std::memcpy(&string_length, string_buf.get() + payload, sizeof(uint32_t)); + os << std::string_view( + reinterpret_cast<const char *>(string_buf.get() + payload + sizeof(uint32_t)), + string_length + ); + os << '\n'; + break; default: return false; } @@ -10159,6 +10757,12 @@ inline void string_builder<serializer>::append(simdjson::dom::element value) { case tape_type::STRING: format.string(iter.get_string_view()); break; + case tape_type::BIGINT: { + // Big integer stored as string — output raw digits (no quotes) + auto sv = iter.get_string_view(); + format.chars(sv.data(), sv.data() + sv.size()); + break; + } case tape_type::INT64: format.number(iter.next_tape_value<int64_t>()); iter.json_index++; // numbers take up 2 spots, so we need to increment @@ -10265,18 +10869,1432 @@ simdjson_inline std::string_view string_builder<serializer>::str() const { #endif /* end file simdjson/dom/serialization-inl.h */ +/* including simdjson/dom/fractured_json-inl.h: #include "simdjson/dom/fractured_json-inl.h" */ +/* begin file simdjson/dom/fractured_json-inl.h */ +#ifndef SIMDJSON_DOM_FRACTURED_JSON_INL_H +#define SIMDJSON_DOM_FRACTURED_JSON_INL_H + +/* skipped duplicate #include "simdjson/dom/fractured_json.h" */ +/* skipped duplicate #include "simdjson/dom/serialization.h" */ +/* skipped duplicate #include "simdjson/dom/element-inl.h" */ +/* skipped duplicate #include "simdjson/dom/array-inl.h" */ +/* skipped duplicate #include "simdjson/dom/object-inl.h" */ +/* skipped duplicate #include "simdjson/dom/parser-inl.h" */ +/* skipped duplicate #include "simdjson/padded_string.h" */ +/* including simdjson/internal/json_structure_analyzer.h: #include "simdjson/internal/json_structure_analyzer.h" */ +/* begin file simdjson/internal/json_structure_analyzer.h */ +#ifndef SIMDJSON_INTERNAL_JSON_STRUCTURE_ANALYZER_H +#define SIMDJSON_INTERNAL_JSON_STRUCTURE_ANALYZER_H + +/* skipped duplicate #include "simdjson/dom/base.h" */ +/* skipped duplicate #include "simdjson/dom/element.h" */ +/* skipped duplicate #include "simdjson/dom/array.h" */ +/* skipped duplicate #include "simdjson/dom/object.h" */ +/* skipped duplicate #include "simdjson/dom/fractured_json.h" */ +/* skipped duplicate #include "simdjson/internal/tape_type.h" */ + +#include <vector> +#include <string> +#include <string_view> +#include <set> + +namespace simdjson { +namespace internal { + +/** + * Layout mode for fractured JSON formatting. + */ +enum class layout_mode { + INLINE, // Single line: [1, 2, 3] or {"a": 1} + COMPACT_MULTILINE, // Multiple items per line with breaks + TABLE, // Tabular format for arrays of similar objects + EXPANDED // Traditional multi-line with indentation +}; + +/** + * Metrics computed for a JSON element during structure analysis. + * These metrics drive layout decisions and contain child metrics for recursive formatting. + */ +struct element_metrics { + /** Nesting depth score (0 = scalar, 1 = flat container, etc.) */ + size_t complexity = 0; + + /** Estimated character length if rendered inline (minified + spaces) */ + size_t estimated_inline_len = 0; + + /** Number of direct children (0 for scalars) */ + size_t child_count = 0; + + /** Pre-computed: can this element be rendered inline? */ + bool can_inline = false; + + /** Is this an array where all elements have similar structure? */ + bool is_uniform_array = false; + + /** For uniform arrays of objects: the common keys */ + std::vector<std::string> common_keys{}; + + /** Recommended layout mode based on analysis */ + layout_mode recommended_layout = layout_mode::EXPANDED; + + /** Child metrics for arrays and objects (in order of iteration) */ + std::vector<element_metrics> children{}; +}; + +/** + * Analyzes JSON structure to compute metrics for formatting decisions. + * + * The analyzer performs a single pass over the DOM to compute: + * - Complexity (nesting depth) + * - Estimated inline length + * - Array uniformity for table detection + * + * Metrics are stored hierarchically with child metrics embedded in parent metrics, + * enabling efficient lookup during formatting without address-based caching. + */ +class structure_analyzer { +public: + /** Default constructor */ + structure_analyzer() : current_opts_(nullptr) {} + + /** Copy constructor - deleted since class has pointer member */ + structure_analyzer(const structure_analyzer&) = delete; + + /** Copy assignment - deleted since class has pointer member */ + structure_analyzer& operator=(const structure_analyzer&) = delete; + + /** Move constructor */ + structure_analyzer(structure_analyzer&&) = default; + + /** Move assignment */ + structure_analyzer& operator=(structure_analyzer&&) = default; + + /** + * Analyze a DOM element and compute metrics. + * @param elem The element to analyze + * @param opts Formatting options that affect metric computation + * @return Metrics for the root element (with child metrics embedded) + */ + element_metrics analyze(const dom::element& elem, + const fractured_json_options& opts); + + /** + * Clear state. + */ + void clear(); + + /** + * Analyze an array element directly (for standalone array formatting). + * @param arr The array to analyze + * @param opts Formatting options + * @return Metrics for the array + */ + element_metrics analyze_array(const dom::array& arr, + const fractured_json_options& opts); + + /** + * Analyze an object element directly (for standalone object formatting). + * @param obj The object to analyze + * @param opts Formatting options + * @return Metrics for the object + */ + element_metrics analyze_object(const dom::object& obj, + const fractured_json_options& opts); + +private: + const fractured_json_options* current_opts_ = nullptr; + + /** Recursive analysis implementation */ + element_metrics analyze_element(const dom::element& elem, size_t depth); + + /** Analyze scalar values (strings, numbers, booleans, null) */ + element_metrics analyze_scalar(const dom::element& elem); + + /** Analyze an array element */ + element_metrics analyze_array(const dom::array& arr, size_t depth); + + /** Analyze an object element */ + element_metrics analyze_object(const dom::object& obj, size_t depth); + + /** Estimate inline length for a string (including quotes and escaping) */ + size_t estimate_string_length(std::string_view s) const; + + /** Estimate inline length for a number */ + size_t estimate_number_length(double d) const; + size_t estimate_number_length(int64_t i) const; + size_t estimate_number_length(uint64_t u) const; + + /** + * Check if an array contains uniform objects suitable for table formatting. + * @param arr The array to check + * @param common_keys Output: keys common to all objects + * @return true if the array is suitable for table formatting + */ + bool check_array_uniformity(const dom::array& arr, + std::vector<std::string>& common_keys) const; + + /** + * Compute similarity between two objects. + * @return Fraction of keys that are common (0.0 to 1.0) + */ + double compute_object_similarity(const dom::object& a, + const dom::object& b) const; + + /** + * Decide the recommended layout mode based on metrics and options. + */ + layout_mode decide_layout(const element_metrics& metrics, + size_t depth, + size_t available_width) const; +}; + +} // namespace internal +} // namespace simdjson + +#endif // SIMDJSON_INTERNAL_JSON_STRUCTURE_ANALYZER_H +/* end file simdjson/internal/json_structure_analyzer.h */ +/* including simdjson/internal/fractured_formatter.h: #include "simdjson/internal/fractured_formatter.h" */ +/* begin file simdjson/internal/fractured_formatter.h */ +#ifndef SIMDJSON_INTERNAL_FRACTURED_FORMATTER_H +#define SIMDJSON_INTERNAL_FRACTURED_FORMATTER_H + +/* skipped duplicate #include "simdjson/dom/serialization.h" */ +/* skipped duplicate #include "simdjson/dom/fractured_json.h" */ +/* skipped duplicate #include "simdjson/internal/json_structure_analyzer.h" */ + +namespace simdjson { +namespace internal { + +/** + * Fractured JSON formatter using CRTP pattern. + * + * This formatter intelligently chooses between different layout modes + * (inline, compact multiline, table, expanded) based on pre-computed + * structure metrics. + */ +class fractured_formatter : public base_formatter<fractured_formatter> { +public: + explicit fractured_formatter(const fractured_json_options& opts = {}); + + /** CRTP hook: print newline (context-aware) */ + simdjson_inline void print_newline(); + + /** CRTP hook: print indentation */ + simdjson_inline void print_indents(size_t depth); + + /** CRTP hook: print space (context-aware) */ + simdjson_inline void print_space(); + + /** Set the current layout mode */ + void set_layout_mode(layout_mode mode); + + /** Get the current layout mode */ + layout_mode get_layout_mode() const; + + /** Set current depth for formatting decisions */ + void set_depth(size_t depth); + + /** Get current depth */ + size_t get_depth() const; + + /** Track current line length for compact multiline decisions */ + void track_line_length(size_t chars); + + /** Reset line length (after newline) */ + void reset_line_length(); + + /** Get current line length */ + size_t get_line_length() const; + + /** Check if we should break to a new line in compact mode */ + bool should_break_line(size_t upcoming_length) const; + + /** Get the options */ + const fractured_json_options& options() const; + + // Table formatting support + /** Begin a table row */ + void begin_table_row(); + + /** End a table row */ + void end_table_row(); + + /** Set column widths for table alignment */ + void set_column_widths(const std::vector<size_t>& widths); + + /** Get current column index in table mode */ + size_t get_column_index() const; + + /** Advance to next column */ + void next_column(); + + /** Add padding to align with column width */ + void align_to_column_width(size_t actual_width); + +private: + fractured_json_options options_; + layout_mode current_layout_ = layout_mode::EXPANDED; + size_t current_depth_ = 0; + size_t current_line_length_ = 0; + + // Table state + bool in_table_mode_ = false; + std::vector<size_t> column_widths_; + size_t current_column_ = 0; +}; + +/** + * Specialized string builder for fractured JSON formatting. + * + * This builder performs two passes: + * 1. Analyze the structure to compute metrics + * 2. Format using the metrics to make layout decisions + */ +class fractured_string_builder { +public: + fractured_string_builder(const fractured_json_options& opts = {}); + + /** Append a DOM element with fractured formatting */ + void append(const dom::element& value); + + /** Append a DOM array with fractured formatting */ + void append(const dom::array& value); + + /** Append a DOM object with fractured formatting */ + void append(const dom::object& value); + + /** Clear the builder */ + simdjson_inline void clear(); + + /** Get the formatted string */ + simdjson_inline std::string_view str() const; + +private: + fractured_formatter format_; + structure_analyzer analyzer_; + fractured_json_options options_; + + /** Format an element using pre-computed metrics */ + void format_element(const dom::element& elem, const element_metrics& metrics, size_t depth); + + /** Format an array with the appropriate layout */ + void format_array(const dom::array& arr, const element_metrics& metrics, size_t depth); + + /** Format an array inline: [1, 2, 3] */ + void format_array_inline(const dom::array& arr, const element_metrics& metrics); + + /** Format an array with compact multiline: multiple items per line */ + void format_array_compact_multiline(const dom::array& arr, const element_metrics& metrics, size_t depth); + + /** Format an array as a table */ + void format_array_as_table(const dom::array& arr, const element_metrics& metrics, size_t depth); + + /** Format an array expanded: one item per line */ + void format_array_expanded(const dom::array& arr, const element_metrics& metrics, size_t depth); + + /** Format an object with the appropriate layout */ + void format_object(const dom::object& obj, const element_metrics& metrics, size_t depth); + + /** Format an object inline: {"a": 1, "b": 2} */ + void format_object_inline(const dom::object& obj, const element_metrics& metrics); + + /** Format an object expanded: one key per line */ + void format_object_expanded(const dom::object& obj, const element_metrics& metrics, size_t depth); + + /** Format a scalar value */ + void format_scalar(const dom::element& elem); + + /** Calculate column widths for table formatting */ + std::vector<size_t> calculate_column_widths(const dom::array& arr, + const std::vector<std::string>& columns) const; + + /** Measure the actual formatted length of a value (for alignment) */ + size_t measure_value_length(const dom::element& elem) const; +}; + +} // namespace internal +} // namespace simdjson + +#endif // SIMDJSON_INTERNAL_FRACTURED_FORMATTER_H +/* end file simdjson/internal/fractured_formatter.h */ + +#include <cmath> +#include <algorithm> +#include <cstring> + +namespace simdjson { +namespace internal { + +// +// Structure Analyzer Implementation +// + +inline element_metrics structure_analyzer::analyze(const dom::element& elem, + const fractured_json_options& opts) { + current_opts_ = &opts; + return analyze_element(elem, 0); +} + +inline void structure_analyzer::clear() { + current_opts_ = nullptr; +} + +inline element_metrics structure_analyzer::analyze_array(const dom::array& arr, + const fractured_json_options& opts) { + current_opts_ = &opts; + return analyze_array(arr, 0); +} + +inline element_metrics structure_analyzer::analyze_object(const dom::object& obj, + const fractured_json_options& opts) { + current_opts_ = &opts; + return analyze_object(obj, 0); +} + +inline element_metrics structure_analyzer::analyze_element(const dom::element& elem, size_t depth) { + switch (elem.type()) { + case dom::element_type::ARRAY: { + dom::array arr; + if (elem.get_array().get(arr) == SUCCESS) { + return analyze_array(arr, depth); + } + break; + } + case dom::element_type::OBJECT: { + dom::object obj; + if (elem.get_object().get(obj) == SUCCESS) { + return analyze_object(obj, depth); + } + break; + } + default: + // Handle all scalar types with a helper + return analyze_scalar(elem); + } + return element_metrics{}; +} + +inline element_metrics structure_analyzer::analyze_scalar(const dom::element& elem) { + element_metrics metrics; + metrics.complexity = 0; + metrics.child_count = 0; + metrics.can_inline = true; + metrics.recommended_layout = layout_mode::INLINE; + + switch (elem.type()) { + case dom::element_type::STRING: { + std::string_view str; + if (elem.get_string().get(str) == SUCCESS) { + metrics.estimated_inline_len = estimate_string_length(str); + } + break; + } + case dom::element_type::INT64: { + int64_t val; + if (elem.get_int64().get(val) == SUCCESS) { + metrics.estimated_inline_len = estimate_number_length(val); + } + break; + } + case dom::element_type::UINT64: { + uint64_t val; + if (elem.get_uint64().get(val) == SUCCESS) { + metrics.estimated_inline_len = estimate_number_length(val); + } + break; + } + case dom::element_type::DOUBLE: { + double val; + if (elem.get_double().get(val) == SUCCESS) { + metrics.estimated_inline_len = estimate_number_length(val); + } + break; + } + case dom::element_type::BOOL: { + bool val; + if (elem.get_bool().get(val) == SUCCESS) { + metrics.estimated_inline_len = val ? 4 : 5; // "true" or "false" + } + break; + } + case dom::element_type::NULL_VALUE: + metrics.estimated_inline_len = 4; // "null" + break; + default: + break; + } + + return metrics; +} + +inline element_metrics structure_analyzer::analyze_array(const dom::array& arr, + size_t depth) { + element_metrics metrics; + metrics.complexity = 1; // At least 1 for being an array + metrics.estimated_inline_len = 2; // "[]" + metrics.child_count = 0; + + size_t max_child_complexity = 0; + bool first = true; + + for (dom::element child : arr) { + if (!first) { + metrics.estimated_inline_len += 2; // ", " + } + first = false; + + element_metrics child_metrics = analyze_element(child, depth + 1); + metrics.estimated_inline_len += child_metrics.estimated_inline_len; + max_child_complexity = (std::max)(max_child_complexity, child_metrics.complexity); + metrics.child_count++; + metrics.children.push_back(std::move(child_metrics)); + } + + // Complexity is 1 + max child complexity + metrics.complexity = 1 + max_child_complexity; + + // Check if can inline + metrics.can_inline = (metrics.complexity <= current_opts_->max_inline_complexity) && + (metrics.estimated_inline_len <= current_opts_->max_inline_length); + + // Check for uniform array (table formatting) + if (current_opts_->enable_table_format && + metrics.child_count >= current_opts_->min_table_rows) { + metrics.is_uniform_array = check_array_uniformity(arr, metrics.common_keys); + } + + // Decide layout + if (metrics.child_count == 0) { + metrics.recommended_layout = layout_mode::INLINE; + } else if (metrics.can_inline) { + metrics.recommended_layout = layout_mode::INLINE; + } else if (metrics.is_uniform_array && !metrics.common_keys.empty()) { + metrics.recommended_layout = layout_mode::TABLE; + } else if (current_opts_->enable_compact_multiline && + max_child_complexity <= current_opts_->max_compact_array_complexity) { + metrics.recommended_layout = layout_mode::COMPACT_MULTILINE; + } else { + metrics.recommended_layout = layout_mode::EXPANDED; + } + + return metrics; +} + +inline element_metrics structure_analyzer::analyze_object(const dom::object& obj, + size_t depth) { + element_metrics metrics; + metrics.complexity = 1; + metrics.estimated_inline_len = 2; // "{}" + metrics.child_count = 0; + + size_t max_child_complexity = 0; + bool first = true; + + for (dom::key_value_pair field : obj) { + if (!first) { + metrics.estimated_inline_len += 2; // ", " + } + first = false; + + // Key length: quotes + key + colon + space + metrics.estimated_inline_len += estimate_string_length(field.key) + 2; + + element_metrics child_metrics = analyze_element(field.value, depth + 1); + metrics.estimated_inline_len += child_metrics.estimated_inline_len; + max_child_complexity = (std::max)(max_child_complexity, child_metrics.complexity); + metrics.child_count++; + metrics.children.push_back(std::move(child_metrics)); + } + + metrics.complexity = 1 + max_child_complexity; + + metrics.can_inline = (metrics.complexity <= current_opts_->max_inline_complexity) && + (metrics.estimated_inline_len <= current_opts_->max_inline_length); + + // Objects use inline or expanded (no table/compact for objects) + if (metrics.child_count == 0 || metrics.can_inline) { + metrics.recommended_layout = layout_mode::INLINE; + } else { + metrics.recommended_layout = layout_mode::EXPANDED; + } + + return metrics; +} + +inline size_t structure_analyzer::estimate_string_length(std::string_view s) const { + size_t len = 2; // quotes + for (char c : s) { + if (c == '"' || c == '\\' || static_cast<unsigned char>(c) < 32) { + len += 2; // escape sequence (at least) + } else { + len += 1; + } + } + return len; +} + +inline size_t structure_analyzer::estimate_number_length(double d) const { + if (std::isnan(d) || std::isinf(d)) { + return 4; // "null" for invalid numbers + } + // Rough estimate: up to 17 significant digits + sign + decimal point + exponent + char buf[32]; + int len = snprintf(buf, sizeof(buf), "%.17g", d); + return len > 0 ? static_cast<size_t>(len) : 20; +} + +inline size_t structure_analyzer::estimate_number_length(int64_t i) const { + if (i == 0) return 1; + // Handle INT64_MIN specially to avoid overflow when negating + if (i == INT64_MIN) return 20; // "-9223372036854775808" is 20 characters + size_t len = (i < 0) ? 1 : 0; // negative sign + int64_t abs_val = (i < 0) ? -i : i; + while (abs_val > 0) { + len++; + abs_val /= 10; + } + return len; +} + +inline size_t structure_analyzer::estimate_number_length(uint64_t u) const { + if (u == 0) return 1; + size_t len = 0; + while (u > 0) { + len++; + u /= 10; + } + return len; +} + +inline bool structure_analyzer::check_array_uniformity(const dom::array& arr, + std::vector<std::string>& common_keys) const { + common_keys.clear(); + + std::set<std::string> shared_keys; + dom::object first_obj; + bool have_first = false; + size_t object_count = 0; + + for (dom::element elem : arr) { + if (elem.type() != dom::element_type::OBJECT) { + return false; // Not all elements are objects + } + + dom::object obj; + if (elem.get_object().get(obj) != SUCCESS) { + return false; + } + + std::set<std::string> current_keys; + for (dom::key_value_pair field : obj) { + current_keys.insert(std::string(field.key)); + } + + if (!have_first) { + shared_keys = current_keys; + first_obj = obj; + have_first = true; + } else { + // Check similarity threshold against the first object + double similarity = compute_object_similarity(first_obj, obj); + if (similarity < current_opts_->table_similarity_threshold) { + return false; // Objects are too dissimilar for table format + } + + // Intersect with current keys + std::set<std::string> intersection; + std::set_intersection(shared_keys.begin(), shared_keys.end(), + current_keys.begin(), current_keys.end(), + std::inserter(intersection, intersection.begin())); + shared_keys = intersection; + } + + object_count++; + } + + if (object_count < current_opts_->min_table_rows) { + return false; + } + + // Require at least one common key for table formatting + if (shared_keys.empty()) { + return false; + } + + common_keys.assign(shared_keys.begin(), shared_keys.end()); + return true; +} + +inline double structure_analyzer::compute_object_similarity(const dom::object& a, + const dom::object& b) const { + std::set<std::string> keys_a, keys_b; + for (dom::key_value_pair field : a) { + keys_a.insert(std::string(field.key)); + } + for (dom::key_value_pair field : b) { + keys_b.insert(std::string(field.key)); + } + + std::set<std::string> intersection; + std::set_intersection(keys_a.begin(), keys_a.end(), + keys_b.begin(), keys_b.end(), + std::inserter(intersection, intersection.begin())); + + std::set<std::string> union_set; + std::set_union(keys_a.begin(), keys_a.end(), + keys_b.begin(), keys_b.end(), + std::inserter(union_set, union_set.begin())); + + if (union_set.empty()) return 1.0; + return static_cast<double>(intersection.size()) / static_cast<double>(union_set.size()); +} + +inline layout_mode structure_analyzer::decide_layout(const element_metrics& metrics, + size_t depth, + size_t available_width) const { + if (metrics.child_count == 0) { + return layout_mode::INLINE; + } + + // Check inline feasibility + size_t indent_width = depth * current_opts_->indent_spaces; + if (metrics.can_inline && + metrics.estimated_inline_len + indent_width <= available_width) { + return layout_mode::INLINE; + } + + // Check table mode + if (metrics.is_uniform_array && !metrics.common_keys.empty()) { + return layout_mode::TABLE; + } + + // Check compact multiline + if (current_opts_->enable_compact_multiline && + metrics.complexity <= current_opts_->max_compact_array_complexity + 1) { + return layout_mode::COMPACT_MULTILINE; + } + + return layout_mode::EXPANDED; +} + +// +// Fractured Formatter Implementation +// + +inline fractured_formatter::fractured_formatter(const fractured_json_options& opts) + : options_(opts), column_widths_{} {} + +simdjson_inline void fractured_formatter::print_newline() { + if (current_layout_ == layout_mode::INLINE) { + return; // No newlines in inline mode + } + one_char('\n'); + current_line_length_ = 0; +} + +simdjson_inline void fractured_formatter::print_indents(size_t depth) { + if (current_layout_ == layout_mode::INLINE) { + return; // No indentation in inline mode + } + for (size_t i = 0; i < depth * options_.indent_spaces; i++) { + one_char(' '); + current_line_length_++; + } +} + +simdjson_inline void fractured_formatter::print_space() { + one_char(' '); + current_line_length_++; +} + +inline void fractured_formatter::set_layout_mode(layout_mode mode) { + current_layout_ = mode; +} + +inline layout_mode fractured_formatter::get_layout_mode() const { + return current_layout_; +} + +inline void fractured_formatter::set_depth(size_t depth) { + current_depth_ = depth; +} + +inline size_t fractured_formatter::get_depth() const { + return current_depth_; +} + +inline void fractured_formatter::track_line_length(size_t chars) { + current_line_length_ += chars; +} + +inline void fractured_formatter::reset_line_length() { + current_line_length_ = 0; +} + +inline size_t fractured_formatter::get_line_length() const { + return current_line_length_; +} + +inline bool fractured_formatter::should_break_line(size_t upcoming_length) const { + return (current_line_length_ + upcoming_length) > options_.max_total_line_length; +} + +inline const fractured_json_options& fractured_formatter::options() const { + return options_; +} + +inline void fractured_formatter::begin_table_row() { + in_table_mode_ = true; + current_column_ = 0; +} + +inline void fractured_formatter::end_table_row() { + in_table_mode_ = false; + current_column_ = 0; +} + +inline void fractured_formatter::set_column_widths(const std::vector<size_t>& widths) { + column_widths_ = widths; +} + +inline size_t fractured_formatter::get_column_index() const { + return current_column_; +} + +inline void fractured_formatter::next_column() { + current_column_++; +} + +inline void fractured_formatter::align_to_column_width(size_t actual_width) { + if (current_column_ < column_widths_.size()) { + size_t target_width = column_widths_[current_column_]; + while (actual_width < target_width) { + one_char(' '); + actual_width++; + current_line_length_++; + } + } +} + +// +// Fractured String Builder Implementation +// + +inline fractured_string_builder::fractured_string_builder(const fractured_json_options& opts) + : format_(opts), analyzer_{}, options_(opts) {} + +inline void fractured_string_builder::append(const dom::element& value) { + // Phase 1: Analyze structure (metrics tree is built recursively) + element_metrics root_metrics = analyzer_.analyze(value, options_); + + // Phase 2: Format using metrics tree (passed through recursion) + format_element(value, root_metrics, 0); +} + +inline void fractured_string_builder::append(const dom::array& value) { + // Analyze the array to get proper metrics with children + element_metrics metrics = analyzer_.analyze_array(value, options_); + format_array(value, metrics, 0); +} + +inline void fractured_string_builder::append(const dom::object& value) { + // Analyze the object to get proper metrics with children + element_metrics metrics = analyzer_.analyze_object(value, options_); + format_object(value, metrics, 0); +} + +simdjson_inline void fractured_string_builder::clear() { + format_.clear(); + analyzer_.clear(); +} + +simdjson_inline std::string_view fractured_string_builder::str() const { + return format_.str(); +} + +inline void fractured_string_builder::format_element(const dom::element& elem, + const element_metrics& metrics, + size_t depth) { + switch (elem.type()) { + case dom::element_type::ARRAY: { + dom::array arr; + if (elem.get_array().get(arr) == SUCCESS) { + format_array(arr, metrics, depth); + } + break; + } + case dom::element_type::OBJECT: { + dom::object obj; + if (elem.get_object().get(obj) == SUCCESS) { + format_object(obj, metrics, depth); + } + break; + } + default: + format_scalar(elem); + break; + } +} + +inline void fractured_string_builder::format_array(const dom::array& arr, + const element_metrics& metrics, + size_t depth) { + switch (metrics.recommended_layout) { + case layout_mode::INLINE: + format_array_inline(arr, metrics); + break; + case layout_mode::COMPACT_MULTILINE: + format_array_compact_multiline(arr, metrics, depth); + break; + case layout_mode::TABLE: + format_array_as_table(arr, metrics, depth); + break; + case layout_mode::EXPANDED: + default: + format_array_expanded(arr, metrics, depth); + break; + } +} + +inline void fractured_string_builder::format_array_inline(const dom::array& arr, + const element_metrics& metrics) { + layout_mode prev_layout = format_.get_layout_mode(); + format_.set_layout_mode(layout_mode::INLINE); + + format_.start_array(); + + bool first = true; + bool empty = true; + size_t child_idx = 0; + for (dom::element elem : arr) { + empty = false; + if (!first) { + format_.comma(); + if (options_.comma_padding) { + format_.print_space(); + } + } else if (options_.simple_bracket_padding) { + format_.print_space(); + } + first = false; + const element_metrics& child_metrics = (child_idx < metrics.children.size()) + ? metrics.children[child_idx] : element_metrics{}; + format_element(elem, child_metrics, 0); + child_idx++; + } + + if (options_.simple_bracket_padding && !empty) { + format_.print_space(); + } + format_.end_array(); + + format_.set_layout_mode(prev_layout); +} + +inline void fractured_string_builder::format_array_compact_multiline(const dom::array& arr, + const element_metrics& metrics, + size_t depth) { + format_.start_array(); + format_.print_newline(); + format_.print_indents(depth + 1); + + size_t items_on_line = 0; + bool first = true; + size_t child_idx = 0; + + for (dom::element elem : arr) { + if (!first) { + format_.comma(); + + // Check if we should break to new line + if (items_on_line >= options_.max_items_per_line || + format_.should_break_line(20)) { // 20 is rough estimate for next item + format_.print_newline(); + format_.print_indents(depth + 1); + items_on_line = 0; + } else if (options_.comma_padding) { + format_.print_space(); + } + } + first = false; + + // Format element inline + layout_mode prev_layout = format_.get_layout_mode(); + format_.set_layout_mode(layout_mode::INLINE); + const element_metrics& child_metrics = (child_idx < metrics.children.size()) + ? metrics.children[child_idx] : element_metrics{}; + format_element(elem, child_metrics, depth + 1); + format_.set_layout_mode(prev_layout); + + items_on_line++; + child_idx++; + } + + format_.print_newline(); + format_.print_indents(depth); + format_.end_array(); +} + +inline void fractured_string_builder::format_array_as_table(const dom::array& arr, + const element_metrics& metrics, + size_t depth) { + const std::vector<std::string>& columns = metrics.common_keys; + if (columns.empty()) { + format_array_expanded(arr, metrics, depth); + return; + } + + // Calculate column widths for alignment + std::vector<size_t> col_widths = calculate_column_widths(arr, columns); + format_.set_column_widths(col_widths); + + format_.start_array(); + format_.print_newline(); + + bool first_row = true; + size_t child_idx = 0; + for (dom::element elem : arr) { + if (!first_row) { + format_.comma(); + format_.print_newline(); + } + first_row = false; + + format_.print_indents(depth + 1); + format_.begin_table_row(); + + // Format object as inline with aligned columns + dom::object obj; + if (elem.get_object().get(obj) != SUCCESS) { + child_idx++; + continue; + } + + // Get child metrics for this row (object) + const element_metrics& row_metrics = (child_idx < metrics.children.size()) + ? metrics.children[child_idx] : element_metrics{}; + + format_.start_object(); + if (options_.simple_bracket_padding) { + format_.print_space(); + } + + bool first_col = true; + const size_t num_columns = columns.size(); + + for (size_t col_idx = 0; col_idx < num_columns; col_idx++) { + const std::string& key = columns[col_idx]; + const bool is_last_col = (col_idx == num_columns - 1); + + if (!first_col) { + format_.comma(); + if (options_.comma_padding) { + format_.print_space(); + } + } + first_col = false; + + // Write key + format_.key(key); + if (options_.colon_padding) { + format_.print_space(); + } + + // Find the value for this key and its metrics + dom::element value; + bool found = false; + size_t field_idx = 0; + for (dom::key_value_pair field : obj) { + if (field.key == key) { + value = field.value; + found = true; + break; + } + field_idx++; + } + + // Write value + if (found) { + layout_mode prev_layout = format_.get_layout_mode(); + format_.set_layout_mode(layout_mode::INLINE); + const element_metrics& value_metrics = (field_idx < row_metrics.children.size()) + ? row_metrics.children[field_idx] : element_metrics{}; + format_element(value, value_metrics, depth + 1); + format_.set_layout_mode(prev_layout); + } else { + format_.null_atom(); + } + + // Only pad non-last columns to align values across rows + if (!is_last_col) { + size_t actual_len = found ? measure_value_length(value) : 4; // 4 for "null" + size_t target_width = col_widths[col_idx]; + while (actual_len < target_width) { + format_.one_char(' '); + actual_len++; + } + } + + format_.next_column(); + } + + if (options_.simple_bracket_padding) { + format_.print_space(); + } + format_.end_object(); + format_.end_table_row(); + child_idx++; + } + + format_.print_newline(); + format_.print_indents(depth); + format_.end_array(); +} + +inline void fractured_string_builder::format_array_expanded(const dom::array& arr, + const element_metrics& metrics, + size_t depth) { + format_.start_array(); + + bool empty = true; + bool first = true; + size_t child_idx = 0; + + for (dom::element elem : arr) { + empty = false; + if (!first) { + format_.comma(); + } + first = false; + + format_.print_newline(); + format_.print_indents(depth + 1); + const element_metrics& child_metrics = (child_idx < metrics.children.size()) + ? metrics.children[child_idx] : element_metrics{}; + format_element(elem, child_metrics, depth + 1); + child_idx++; + } + + if (!empty) { + format_.print_newline(); + format_.print_indents(depth); + } + format_.end_array(); +} + +inline void fractured_string_builder::format_object(const dom::object& obj, + const element_metrics& metrics, + size_t depth) { + if (metrics.recommended_layout == layout_mode::INLINE || metrics.can_inline) { + format_object_inline(obj, metrics); + } else { + format_object_expanded(obj, metrics, depth); + } +} + +inline void fractured_string_builder::format_object_inline(const dom::object& obj, + const element_metrics& metrics) { + layout_mode prev_layout = format_.get_layout_mode(); + format_.set_layout_mode(layout_mode::INLINE); + + format_.start_object(); + + bool empty = true; + bool first = true; + size_t child_idx = 0; + + for (dom::key_value_pair field : obj) { + empty = false; + if (!first) { + format_.comma(); + if (options_.comma_padding) { + format_.print_space(); + } + } else if (options_.simple_bracket_padding) { + format_.print_space(); + } + first = false; + + format_.key(field.key); + if (options_.colon_padding) { + format_.print_space(); + } + const element_metrics& child_metrics = (child_idx < metrics.children.size()) + ? metrics.children[child_idx] : element_metrics{}; + format_element(field.value, child_metrics, 0); + child_idx++; + } + + if (options_.simple_bracket_padding && !empty) { + format_.print_space(); + } + format_.end_object(); + + format_.set_layout_mode(prev_layout); +} + +inline void fractured_string_builder::format_object_expanded(const dom::object& obj, + const element_metrics& metrics, + size_t depth) { + format_.start_object(); + + bool empty = true; + bool first = true; + size_t child_idx = 0; + + for (dom::key_value_pair field : obj) { + empty = false; + if (!first) { + format_.comma(); + } + first = false; + + format_.print_newline(); + format_.print_indents(depth + 1); + format_.key(field.key); + if (options_.colon_padding) { + format_.print_space(); + } + const element_metrics& child_metrics = (child_idx < metrics.children.size()) + ? metrics.children[child_idx] : element_metrics{}; + format_element(field.value, child_metrics, depth + 1); + child_idx++; + } + + if (!empty) { + format_.print_newline(); + format_.print_indents(depth); + } + format_.end_object(); +} + +inline void fractured_string_builder::format_scalar(const dom::element& elem) { + switch (elem.type()) { + case dom::element_type::STRING: { + std::string_view str; + if (elem.get_string().get(str) == SUCCESS) { + format_.string(str); + } + break; + } + case dom::element_type::INT64: { + int64_t val; + if (elem.get_int64().get(val) == SUCCESS) { + format_.number(val); + } + break; + } + case dom::element_type::UINT64: { + uint64_t val; + if (elem.get_uint64().get(val) == SUCCESS) { + format_.number(val); + } + break; + } + case dom::element_type::DOUBLE: { + double val; + if (elem.get_double().get(val) == SUCCESS) { + format_.number(val); + } + break; + } + case dom::element_type::BOOL: { + bool val; + if (elem.get_bool().get(val) == SUCCESS) { + val ? format_.true_atom() : format_.false_atom(); + } + break; + } + case dom::element_type::NULL_VALUE: + format_.null_atom(); + break; + default: + break; + } +} + +inline size_t fractured_string_builder::measure_value_length(const dom::element& elem) const { + switch (elem.type()) { + case dom::element_type::STRING: { + std::string_view str; + if (elem.get_string().get(str) == SUCCESS) { + // Count actual escaped length + size_t len = 2; // quotes + for (char c : str) { + if (c == '"' || c == '\\' || static_cast<unsigned char>(c) < 32) { + len += 2; // escape sequence + } else { + len += 1; + } + } + return len; + } + return 2; + } + case dom::element_type::INT64: { + int64_t val; + if (elem.get_int64().get(val) == SUCCESS) { + if (val == 0) return 1; + // Handle INT64_MIN specially to avoid overflow when negating + if (val == INT64_MIN) return 20; // "-9223372036854775808" is 20 characters + size_t len = (val < 0) ? 1 : 0; + int64_t abs_val = (val < 0) ? -val : val; + while (abs_val > 0) { len++; abs_val /= 10; } + return len; + } + return 1; + } + case dom::element_type::UINT64: { + uint64_t val; + if (elem.get_uint64().get(val) == SUCCESS) { + if (val == 0) return 1; + size_t len = 0; + while (val > 0) { len++; val /= 10; } + return len; + } + return 1; + } + case dom::element_type::DOUBLE: { + double val; + if (elem.get_double().get(val) == SUCCESS) { + char buf[32]; + int len = snprintf(buf, sizeof(buf), "%.17g", val); + return len > 0 ? static_cast<size_t>(len) : 1; + } + return 1; + } + case dom::element_type::BOOL: { + bool val; + if (elem.get_bool().get(val) == SUCCESS) { + return val ? 4 : 5; // "true" or "false" + } + return 5; + } + case dom::element_type::NULL_VALUE: + return 4; // "null" + default: + return 4; + } +} + +inline std::vector<size_t> fractured_string_builder::calculate_column_widths( + const dom::array& arr, + const std::vector<std::string>& columns) const { + + std::vector<size_t> widths(columns.size(), 0); + + for (dom::element elem : arr) { + dom::object obj; + if (elem.get_object().get(obj) != SUCCESS) { + continue; + } + + for (size_t col_idx = 0; col_idx < columns.size(); col_idx++) { + const std::string& key = columns[col_idx]; + + for (dom::key_value_pair field : obj) { + if (field.key == key) { + // Measure actual value length + size_t len = measure_value_length(field.value); + widths[col_idx] = (std::max)(widths[col_idx], len); + break; + } + } + } + } + + return widths; +} + +} // namespace internal + +// +// Public API Implementation +// + +template <class T> +std::string fractured_json(T x) { + return fractured_json(x, fractured_json_options{}); +} + +template <class T> +std::string fractured_json(T x, const fractured_json_options& options) { + internal::fractured_string_builder sb(options); + sb.append(x); + std::string_view result = sb.str(); + return std::string(result.data(), result.size()); +} + +#if SIMDJSON_EXCEPTIONS +template <class T> +std::string fractured_json(simdjson_result<T> x) { + if (x.error()) { + throw simdjson_error(x.error()); + } + return fractured_json(x.value()); +} + +template <class T> +std::string fractured_json(simdjson_result<T> x, const fractured_json_options& options) { + if (x.error()) { + throw simdjson_error(x.error()); + } + return fractured_json(x.value(), options); +} +#endif + +// Explicit template instantiations for common types +template std::string fractured_json(dom::element x); +template std::string fractured_json(dom::element x, const fractured_json_options& options); +template std::string fractured_json(dom::array x); +template std::string fractured_json(dom::array x, const fractured_json_options& options); +template std::string fractured_json(dom::object x); +template std::string fractured_json(dom::object x, const fractured_json_options& options); + +#if SIMDJSON_EXCEPTIONS +template std::string fractured_json(simdjson_result<dom::element> x); +template std::string fractured_json(simdjson_result<dom::element> x, const fractured_json_options& options); +#endif + +// +// String-based API for formatting any JSON string +// + +inline std::string fractured_json_string(std::string_view json_str) { + return fractured_json_string(json_str, fractured_json_options{}); +} + +inline std::string fractured_json_string(std::string_view json_str, + const fractured_json_options& options) { + // Parse the JSON string + dom::parser parser; + dom::element doc; + // Need to pad the string for simdjson + auto padded = padded_string(json_str); + auto error = parser.parse(padded).get(doc); + if (error) { + // If parsing fails, return the original string + return std::string(json_str); + } + return fractured_json(doc, options); +} + +} // namespace simdjson + +#endif // SIMDJSON_DOM_FRACTURED_JSON_INL_H +/* end file simdjson/dom/fractured_json-inl.h */ #endif // SIMDJSON_DOM_H /* end file simdjson/dom.h */ -/* including simdjson/ondemand.h: #include "simdjson/ondemand.h" */ -/* begin file simdjson/ondemand.h */ -#ifndef SIMDJSON_ONDEMAND_H -#define SIMDJSON_ONDEMAND_H +/* including simdjson/builder.h: #include "simdjson/builder.h" */ +/* begin file simdjson/builder.h */ +#ifndef SIMDJSON_BUILDER_H +#define SIMDJSON_BUILDER_H -/* including simdjson/builtin/ondemand.h: #include "simdjson/builtin/ondemand.h" */ -/* begin file simdjson/builtin/ondemand.h */ -#ifndef SIMDJSON_BUILTIN_ONDEMAND_H -#define SIMDJSON_BUILTIN_ONDEMAND_H +/* including simdjson/builtin/builder.h: #include "simdjson/builtin/builder.h" */ +/* begin file simdjson/builtin/builder.h */ +#ifndef SIMDJSON_BUILTIN_BUILDER_H +#define SIMDJSON_BUILTIN_BUILDER_H /* including simdjson/builtin.h: #include "simdjson/builtin.h" */ /* begin file simdjson/builtin.h */ @@ -10305,6 +12323,8 @@ simdjson_inline std::string_view string_builder<serializer>::str() const { #define SIMDJSON_IMPLEMENTATION_ID_westmere 6 #define SIMDJSON_IMPLEMENTATION_ID_lsx 7 #define SIMDJSON_IMPLEMENTATION_ID_lasx 8 +//#define SIMDJSON_IMPLEMENTATION_ID_rvv 9 +#define SIMDJSON_IMPLEMENTATION_ID_rvv_vls 10 #define SIMDJSON_IMPLEMENTATION_ID_FOR(IMPL) SIMDJSON_CAT(SIMDJSON_IMPLEMENTATION_ID_, IMPL) #define SIMDJSON_IMPLEMENTATION_ID SIMDJSON_IMPLEMENTATION_ID_FOR(SIMDJSON_IMPLEMENTATION) @@ -10406,22 +12426,27 @@ simdjson_inline std::string_view string_builder<serializer>::str() const { #endif #ifndef SIMDJSON_IMPLEMENTATION_LASX -#define SIMDJSON_IMPLEMENTATION_LASX (SIMDJSON_IS_LOONGARCH64 && __loongarch_asx) +#define SIMDJSON_IMPLEMENTATION_LASX (SIMDJSON_IS_LSX) #endif -#define SIMDJSON_CAN_ALWAYS_RUN_LASX (SIMDJSON_IMPLEMENTATION_LASX) +#define SIMDJSON_CAN_ALWAYS_RUN_LASX (SIMDJSON_IS_LASX) #ifndef SIMDJSON_IMPLEMENTATION_LSX #if SIMDJSON_CAN_ALWAYS_RUN_LASX #define SIMDJSON_IMPLEMENTATION_LSX 0 #else -#define SIMDJSON_IMPLEMENTATION_LSX (SIMDJSON_IS_LOONGARCH64 && __loongarch_sx) +#define SIMDJSON_IMPLEMENTATION_LSX (SIMDJSON_IS_LSX) #endif #endif #define SIMDJSON_CAN_ALWAYS_RUN_LSX (SIMDJSON_IMPLEMENTATION_LSX) +#define SIMDJSON_CAN_ALWAYS_RUN_RVV_VLS SIMDJSON_IS_RVV_VLS +#ifndef SIMDJSON_IMPLEMENTATION_RVV_VLS +#define SIMDJSON_IMPLEMENTATION_RVV_VLS SIMDJSON_CAN_ALWAYS_RUN_RVV_VLS +#endif + // Default Fallback to on unless a builtin implementation has already been selected. #ifndef SIMDJSON_IMPLEMENTATION_FALLBACK -#if SIMDJSON_CAN_ALWAYS_RUN_ARM64 || SIMDJSON_CAN_ALWAYS_RUN_ICELAKE || SIMDJSON_CAN_ALWAYS_RUN_HASWELL || SIMDJSON_CAN_ALWAYS_RUN_WESTMERE || SIMDJSON_CAN_ALWAYS_RUN_PPC64 || SIMDJSON_CAN_ALWAYS_RUN_LSX || SIMDJSON_CAN_ALWAYS_RUN_LASX +#if SIMDJSON_CAN_ALWAYS_RUN_ARM64 || SIMDJSON_CAN_ALWAYS_RUN_ICELAKE || SIMDJSON_CAN_ALWAYS_RUN_HASWELL || SIMDJSON_CAN_ALWAYS_RUN_WESTMERE || SIMDJSON_CAN_ALWAYS_RUN_PPC64 || SIMDJSON_CAN_ALWAYS_RUN_LSX || SIMDJSON_CAN_ALWAYS_RUN_LASX || SIMDJSON_CAN_ALWAYS_RUN_RVV_VLS // if anything at all except fallback can always run, then disable fallback. #define SIMDJSON_IMPLEMENTATION_FALLBACK 0 #else @@ -10447,6 +12472,8 @@ simdjson_inline std::string_view string_builder<serializer>::str() const { #define SIMDJSON_BUILTIN_IMPLEMENTATION lsx #elif SIMDJSON_CAN_ALWAYS_RUN_LASX #define SIMDJSON_BUILTIN_IMPLEMENTATION lasx +#elif SIMDJSON_CAN_ALWAYS_RUN_RVV_VLS +#define SIMDJSON_BUILTIN_IMPLEMENTATION rvv_vls #elif SIMDJSON_CAN_ALWAYS_RUN_FALLBACK #define SIMDJSON_BUILTIN_IMPLEMENTATION fallback #else @@ -10478,6 +12505,8 @@ namespace simdjson { namespace lsx {} #elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(lasx) namespace lasx {} +#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(rvv_vls) + namespace rvv_vls {} #else #error Unknown SIMDJSON_BUILTIN_IMPLEMENTATION #endif @@ -10592,6 +12621,8 @@ enum instruction_set { AVX512VBMI2 = 0x10000, LSX = 0x20000, LASX = 0x40000, + //RVV = 0x80000, + RVV_VLS = 0x100000, }; } // namespace internal @@ -11682,6 +13713,44 @@ class implementation final : public simdjson::implementation { #endif // SIMDJSON_LASX_IMPLEMENTATION_H /* end file simdjson/lasx/implementation.h */ +#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(rvv_vls) +/* including simdjson/rvv-vls/implementation.h: #include "simdjson/rvv-vls/implementation.h" */ +/* begin file simdjson/rvv-vls/implementation.h */ +#ifndef SIMDJSON_RVV_VLS_IMPLEMENTATION_H +#define SIMDJSON_RVV_VLS_IMPLEMENTATION_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/implementation.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace rvv_vls { + +/** + * @private + */ +class implementation final : public simdjson::implementation { +public: + simdjson_inline implementation() : simdjson::implementation( + "rvv_vls", + "RISC-V V extension", + 0 + ) {} + simdjson_warn_unused error_code create_dom_parser_implementation( + size_t capacity, + size_t max_length, + std::unique_ptr<simdjson::internal::dom_parser_implementation>& dst + ) const noexcept final; + simdjson_warn_unused error_code minify(const uint8_t *buf, size_t len, uint8_t *dst, size_t &dst_len) const noexcept final; + simdjson_warn_unused bool validate_utf8(const char *buf, size_t len) const noexcept final; +}; + +} // namespace rvv_vls +} // namespace simdjson + +#endif // SIMDJSON_RVV_VLS_IMPLEMENTATION_H +/* end file simdjson/rvv-vls/implementation.h */ #else #error Unknown SIMDJSON_BUILTIN_IMPLEMENTATION #endif @@ -12422,6 +14491,7 @@ namespace { static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<T>); static_assert(NUM_CHUNKS == 4, "ARM kernel should use four registers per 64-byte block."); const simd8<T> chunks[NUM_CHUNKS]; + template<int idx> simd8<uint8_t> get() const { return idx < NUM_CHUNKS ? chunks[idx] : simd8<T>(); } simd8x64(const simd8x64<T>& o) = delete; // no copy allowed simd8x64<T>& operator=(const simd8<T>& other) = delete; // no assignment allowed @@ -12613,10 +14683,12 @@ simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *ds /* amalgamation skipped (editor-only): #include "simdjson/arm64/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_PPC64 */ /* amalgamation skipped (editor-only): #include "simdjson/ppc64/begin.h" */ -/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LSX */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LASX */ /* amalgamation skipped (editor-only): #include "simdjson/lasx/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LSX */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_RVV_VLS */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_FALLBACK */ /* amalgamation skipped (editor-only): #include "simdjson/fallback/begin.h" */ /* amalgamation skipped (editor-only): #else */ @@ -14631,6 +16703,19 @@ simdjson_inline int leading_zeroes(uint64_t input_num) { #endif// _MSC_VER } +simdjson_inline int trailing_zeroes(uint64_t input_num) { +#ifdef _MSC_VER + unsigned long trailing_zero = 0; + // Search the mask data from least significant bit (LSB) + // to most significant bit (MSB) for a set bit (1). + if (_BitScanForward64(&trailing_zero, input_num)) + return (int)trailing_zero; + else return 64; +#else + return __builtin_ctzll(input_num); +#endif// _MSC_VER +} + } // unnamed namespace } // namespace fallback } // namespace simdjson @@ -14811,10 +16896,12 @@ simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t /* amalgamation skipped (editor-only): #include "simdjson/arm64/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_PPC64 */ /* amalgamation skipped (editor-only): #include "simdjson/ppc64/begin.h" */ -/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LSX */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LASX */ /* amalgamation skipped (editor-only): #include "simdjson/lasx/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LSX */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_RVV_VLS */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_FALLBACK */ /* amalgamation skipped (editor-only): #include "simdjson/fallback/begin.h" */ /* amalgamation skipped (editor-only): #else */ @@ -17333,6 +19420,7 @@ namespace simd { static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<T>); static_assert(NUM_CHUNKS == 2, "Haswell kernel should use two registers per 64-byte block."); const simd8<T> chunks[NUM_CHUNKS]; + template<int idx> simd8<uint8_t> get() const { return idx < NUM_CHUNKS ? chunks[idx] : simd8<T>(); } simd8x64(const simd8x64<T>& o) = delete; // no copy allowed simd8x64<T>& operator=(const simd8<T>& other) = delete; // no assignment allowed @@ -17508,10 +19596,12 @@ simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *ds /* amalgamation skipped (editor-only): #include "simdjson/arm64/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_PPC64 */ /* amalgamation skipped (editor-only): #include "simdjson/ppc64/begin.h" */ -/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LSX */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LASX */ /* amalgamation skipped (editor-only): #include "simdjson/lasx/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LSX */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_RVV_VLS */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_FALLBACK */ /* amalgamation skipped (editor-only): #include "simdjson/fallback/begin.h" */ /* amalgamation skipped (editor-only): #else */ @@ -19985,6 +22075,7 @@ namespace simd { static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<T>); static_assert(NUM_CHUNKS == 1, "Icelake kernel should use one register per 64-byte block."); const simd8<T> chunks[NUM_CHUNKS]; + template<int idx> simd8<uint8_t> get() const { return idx < NUM_CHUNKS ? chunks[idx] : simd8<T>(); } simd8x64(const simd8x64<T>& o) = delete; // no copy allowed simd8x64<T>& operator=(const simd8<T>& other) = delete; // no assignment allowed @@ -20205,10 +22296,12 @@ simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t /* amalgamation skipped (editor-only): #include "simdjson/arm64/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_PPC64 */ /* amalgamation skipped (editor-only): #include "simdjson/ppc64/begin.h" */ -/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LSX */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LASX */ /* amalgamation skipped (editor-only): #include "simdjson/lasx/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LSX */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_RVV_VLS */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_FALLBACK */ /* amalgamation skipped (editor-only): #include "simdjson/fallback/begin.h" */ /* amalgamation skipped (editor-only): #else */ @@ -22819,6 +24912,7 @@ template <typename T> struct simd8x64 { static_assert(NUM_CHUNKS == 4, "PPC64 kernel should use four registers per 64-byte block."); const simd8<T> chunks[NUM_CHUNKS]; + template<int idx> simd8<uint8_t> get() const { return idx < NUM_CHUNKS ? chunks[idx] : simd8<T>(); } simd8x64(const simd8x64<T> &o) = delete; // no copy allowed simd8x64<T> & @@ -23017,10 +25111,12 @@ simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *ds /* amalgamation skipped (editor-only): #include "simdjson/arm64/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_PPC64 */ /* amalgamation skipped (editor-only): #include "simdjson/ppc64/begin.h" */ -/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LSX */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LASX */ /* amalgamation skipped (editor-only): #include "simdjson/lasx/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LSX */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_RVV_VLS */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_FALLBACK */ /* amalgamation skipped (editor-only): #include "simdjson/fallback/begin.h" */ /* amalgamation skipped (editor-only): #else */ @@ -25549,6 +27645,7 @@ namespace simd { static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<T>); static_assert(NUM_CHUNKS == 4, "Westmere kernel should use four registers per 64-byte block."); const simd8<T> chunks[NUM_CHUNKS]; + template<int idx> simd8<uint8_t> get() const { return idx < NUM_CHUNKS ? chunks[idx] : simd8<T>(); } simd8x64(const simd8x64<T>& o) = delete; // no copy allowed simd8x64<T>& operator=(const simd8<T>& other) = delete; // no assignment allowed @@ -25977,6 +28074,7 @@ namespace simd { static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<T>); static_assert(NUM_CHUNKS == 4, "Westmere kernel should use four registers per 64-byte block."); const simd8<T> chunks[NUM_CHUNKS]; + template<int idx> simd8<uint8_t> get() const { return idx < NUM_CHUNKS ? chunks[idx] : simd8<T>(); } simd8x64(const simd8x64<T>& o) = delete; // no copy allowed simd8x64<T>& operator=(const simd8<T>& other) = delete; // no assignment allowed @@ -26145,10 +28243,12 @@ simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *ds /* amalgamation skipped (editor-only): #include "simdjson/arm64/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_PPC64 */ /* amalgamation skipped (editor-only): #include "simdjson/ppc64/begin.h" */ -/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LSX */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LASX */ /* amalgamation skipped (editor-only): #include "simdjson/lasx/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LSX */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_RVV_VLS */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_FALLBACK */ /* amalgamation skipped (editor-only): #include "simdjson/fallback/begin.h" */ /* amalgamation skipped (editor-only): #else */ @@ -28089,20 +30189,27 @@ SIMDJSON_UNTARGET_REGION #endif // SIMDJSON_WESTMERE_H /* end file simdjson/westmere.h */ -#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(lsx) -/* including simdjson/lsx.h: #include "simdjson/lsx.h" */ -/* begin file simdjson/lsx.h */ -#ifndef SIMDJSON_LSX_H -#define SIMDJSON_LSX_H +#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(lasx) +/* including simdjson/lasx.h: #include "simdjson/lasx.h" */ +/* begin file simdjson/lasx.h */ +#ifndef SIMDJSON_LASX_H +#define SIMDJSON_LASX_H -/* including simdjson/lsx/begin.h: #include "simdjson/lsx/begin.h" */ -/* begin file simdjson/lsx/begin.h */ -/* defining SIMDJSON_IMPLEMENTATION to "lsx" */ -#define SIMDJSON_IMPLEMENTATION lsx -/* including simdjson/lsx/base.h: #include "simdjson/lsx/base.h" */ -/* begin file simdjson/lsx/base.h */ -#ifndef SIMDJSON_LSX_BASE_H -#define SIMDJSON_LSX_BASE_H +/* including simdjson/lasx/begin.h: #include "simdjson/lasx/begin.h" */ +/* begin file simdjson/lasx/begin.h */ +/* defining SIMDJSON_IMPLEMENTATION to "lasx" */ +#define SIMDJSON_IMPLEMENTATION lasx +#include <lsxintrin.h> // This is a hack. We should not need to put this include here. +#if SIMDJSON_CAN_ALWAYS_RUN_LASX +// nothing needed. +#else +SIMDJSON_TARGET_REGION("lasx,lsx") +#endif + +/* including simdjson/lasx/base.h: #include "simdjson/lasx/base.h" */ +/* begin file simdjson/lasx/base.h */ +#ifndef SIMDJSON_LASX_BASE_H +#define SIMDJSON_LASX_BASE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ /* amalgamation skipped (editor-only): #include "simdjson/base.h" */ @@ -28110,9 +30217,9 @@ SIMDJSON_UNTARGET_REGION namespace simdjson { /** - * Implementation for LSX. + * Implementation for LASX. */ -namespace lsx { +namespace lasx { class implementation; @@ -28123,41 +30230,40 @@ template <typename T> struct simd8x64; } // namespace simd } // unnamed namespace -} // namespace lsx +} // namespace lasx } // namespace simdjson -#endif // SIMDJSON_LSX_BASE_H -/* end file simdjson/lsx/base.h */ -/* including simdjson/lsx/intrinsics.h: #include "simdjson/lsx/intrinsics.h" */ -/* begin file simdjson/lsx/intrinsics.h */ -#ifndef SIMDJSON_LSX_INTRINSICS_H -#define SIMDJSON_LSX_INTRINSICS_H +#endif // SIMDJSON_LASX_BASE_H +/* end file simdjson/lasx/base.h */ +/* including simdjson/lasx/intrinsics.h: #include "simdjson/lasx/intrinsics.h" */ +/* begin file simdjson/lasx/intrinsics.h */ +#ifndef SIMDJSON_LASX_INTRINSICS_H +#define SIMDJSON_LASX_INTRINSICS_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -// This should be the correct header whether -// you use visual studio or other compilers. #include <lsxintrin.h> +#include <lasxintrin.h> -static_assert(sizeof(__m128i) <= simdjson::SIMDJSON_PADDING, "insufficient padding for LoongArch SX"); +static_assert(sizeof(__m256i) <= simdjson::SIMDJSON_PADDING, "insufficient padding for LoongArch ASX"); -#endif // SIMDJSON_LSX_INTRINSICS_H -/* end file simdjson/lsx/intrinsics.h */ -/* including simdjson/lsx/bitmanipulation.h: #include "simdjson/lsx/bitmanipulation.h" */ -/* begin file simdjson/lsx/bitmanipulation.h */ -#ifndef SIMDJSON_LSX_BITMANIPULATION_H -#define SIMDJSON_LSX_BITMANIPULATION_H +#endif // SIMDJSON_LASX_INTRINSICS_H +/* end file simdjson/lasx/intrinsics.h */ +/* including simdjson/lasx/bitmanipulation.h: #include "simdjson/lasx/bitmanipulation.h" */ +/* begin file simdjson/lasx/bitmanipulation.h */ +#ifndef SIMDJSON_LASX_BITMANIPULATION_H +#define SIMDJSON_LASX_BITMANIPULATION_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/intrinsics.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/bitmask.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/intrinsics.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/bitmask.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace { // We sometimes call trailing_zero on inputs that are zero, @@ -28184,7 +30290,7 @@ simdjson_inline int leading_zeroes(uint64_t input_num) { /* result might be undefined when input_num is zero */ simdjson_inline int count_ones(uint64_t input_num) { - return __lsx_vpickve2gr_w(__lsx_vpcnt_d(__m128i(v2u64{input_num, 0})), 0); + return __lasx_xvpickve2gr_w(__lasx_xvpcnt_d(__m256i(v4u64{input_num, 0, 0, 0})), 0); } simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2, uint64_t *result) { @@ -28193,22 +30299,22 @@ simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2, uint64_t *re } } // unnamed namespace -} // namespace lsx +} // namespace lasx } // namespace simdjson -#endif // SIMDJSON_LSX_BITMANIPULATION_H -/* end file simdjson/lsx/bitmanipulation.h */ -/* including simdjson/lsx/bitmask.h: #include "simdjson/lsx/bitmask.h" */ -/* begin file simdjson/lsx/bitmask.h */ -#ifndef SIMDJSON_LSX_BITMASK_H -#define SIMDJSON_LSX_BITMASK_H +#endif // SIMDJSON_LASX_BITMANIPULATION_H +/* end file simdjson/lasx/bitmanipulation.h */ +/* including simdjson/lasx/bitmask.h: #include "simdjson/lasx/bitmask.h" */ +/* begin file simdjson/lasx/bitmask.h */ +#ifndef SIMDJSON_LASX_BITMASK_H +#define SIMDJSON_LASX_BITMASK_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace { // @@ -28227,26 +30333,26 @@ simdjson_inline uint64_t prefix_xor(uint64_t bitmask) { } } // unnamed namespace -} // namespace lsx +} // namespace lasx } // namespace simdjson #endif -/* end file simdjson/lsx/bitmask.h */ -/* including simdjson/lsx/numberparsing_defs.h: #include "simdjson/lsx/numberparsing_defs.h" */ -/* begin file simdjson/lsx/numberparsing_defs.h */ -#ifndef SIMDJSON_LSX_NUMBERPARSING_DEFS_H -#define SIMDJSON_LSX_NUMBERPARSING_DEFS_H +/* end file simdjson/lasx/bitmask.h */ +/* including simdjson/lasx/numberparsing_defs.h: #include "simdjson/lasx/numberparsing_defs.h" */ +/* begin file simdjson/lasx/numberparsing_defs.h */ +#ifndef SIMDJSON_LASX_NUMBERPARSING_DEFS_H +#define SIMDJSON_LASX_NUMBERPARSING_DEFS_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/intrinsics.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/intrinsics.h" */ /* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ #include <cstring> namespace simdjson { -namespace lsx { +namespace lasx { namespace numberparsing { // we don't have appropriate instructions, so let us use a scalar function @@ -28269,7 +30375,7 @@ simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t } } // namespace numberparsing -} // namespace lsx +} // namespace lasx } // namespace simdjson #ifndef SIMDJSON_SWAR_NUMBER_PARSING @@ -28280,46 +30386,46 @@ simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t #endif #endif -#endif // SIMDJSON_LSX_NUMBERPARSING_DEFS_H -/* end file simdjson/lsx/numberparsing_defs.h */ -/* including simdjson/lsx/simd.h: #include "simdjson/lsx/simd.h" */ -/* begin file simdjson/lsx/simd.h */ -#ifndef SIMDJSON_LSX_SIMD_H -#define SIMDJSON_LSX_SIMD_H +#endif // SIMDJSON_LASX_NUMBERPARSING_DEFS_H +/* end file simdjson/lasx/numberparsing_defs.h */ +/* including simdjson/lasx/simd.h: #include "simdjson/lasx/simd.h" */ +/* begin file simdjson/lasx/simd.h */ +#ifndef SIMDJSON_LASX_SIMD_H +#define SIMDJSON_LASX_SIMD_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/bitmanipulation.h" */ /* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace { namespace simd { // Forward-declared so they can be used by splat and friends. template<typename Child> struct base { - __m128i value; + __m256i value; // Zero constructor - simdjson_inline base() : value{__m128i()} {} + simdjson_inline base() : value{__m256i()} {} // Conversion from SIMD register - simdjson_inline base(const __m128i _value) : value(_value) {} + simdjson_inline base(const __m256i _value) : value(_value) {} // Conversion to SIMD register - simdjson_inline operator const __m128i&() const { return this->value; } - simdjson_inline operator __m128i&() { return this->value; } - simdjson_inline operator const v16i8&() const { return (v16i8&)this->value; } - simdjson_inline operator v16i8&() { return (v16i8&)this->value; } + simdjson_inline operator const __m256i&() const { return this->value; } + simdjson_inline operator __m256i&() { return this->value; } + simdjson_inline operator const v32i8&() const { return (v32i8&)this->value; } + simdjson_inline operator v32i8&() { return (v32i8&)this->value; } // Bit operations - simdjson_inline Child operator|(const Child other) const { return __lsx_vor_v(*this, other); } - simdjson_inline Child operator&(const Child other) const { return __lsx_vand_v(*this, other); } - simdjson_inline Child operator^(const Child other) const { return __lsx_vxor_v(*this, other); } - simdjson_inline Child bit_andnot(const Child other) const { return __lsx_vandn_v(other, *this); } + simdjson_inline Child operator|(const Child other) const { return __lasx_xvor_v(*this, other); } + simdjson_inline Child operator&(const Child other) const { return __lasx_xvand_v(*this, other); } + simdjson_inline Child operator^(const Child other) const { return __lasx_xvxor_v(*this, other); } + simdjson_inline Child bit_andnot(const Child other) const { return __lasx_xvandn_v(other, *this); } simdjson_inline Child& operator|=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast | other; return *this_cast; } simdjson_inline Child& operator&=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast & other; return *this_cast; } simdjson_inline Child& operator^=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast ^ other; return *this_cast; } @@ -28332,41 +30438,51 @@ namespace simd { template<typename T, typename Mask=simd8<bool>> struct base8: base<simd8<T>> { simdjson_inline base8() : base<simd8<T>>() {} - simdjson_inline base8(const __m128i _value) : base<simd8<T>>(_value) {} + simdjson_inline base8(const __m256i _value) : base<simd8<T>>(_value) {} - friend simdjson_really_inline Mask operator==(const simd8<T> lhs, const simd8<T> rhs) { return __lsx_vseq_b(lhs, rhs); } + friend simdjson_really_inline Mask operator==(const simd8<T> lhs, const simd8<T> rhs) { return __lasx_xvseq_b(lhs, rhs); } static const int SIZE = sizeof(base<simd8<T>>::value); template<int N=1> simdjson_inline simd8<T> prev(const simd8<T> prev_chunk) const { - return __lsx_vor_v(__lsx_vbsll_v(*this, N), __lsx_vbsrl_v(prev_chunk, 16 - N)); + __m256i hi = __lasx_xvbsll_v(*this, N); + __m256i lo = __lasx_xvbsrl_v(*this, 16 - N); + __m256i tmp = __lasx_xvbsrl_v(prev_chunk, 16 - N); + lo = __lasx_xvpermi_q(lo, tmp, 0x21); + return __lasx_xvor_v(hi, lo); } }; // SIMD byte mask type (returned by things like eq and gt) template<> struct simd8<bool>: base8<bool> { - static simdjson_inline simd8<bool> splat(bool _value) { - return __lsx_vreplgr2vr_b(uint8_t(-(!!_value))); - } + static simdjson_inline simd8<bool> splat(bool _value) { return __lasx_xvreplgr2vr_b(uint8_t(-(!!_value))); } simdjson_inline simd8() : base8() {} - simdjson_inline simd8(const __m128i _value) : base8<bool>(_value) {} + simdjson_inline simd8(const __m256i _value) : base8<bool>(_value) {} // Splat constructor simdjson_inline simd8(bool _value) : base8<bool>(splat(_value)) {} - simdjson_inline int to_bitmask() const { return __lsx_vpickve2gr_w(__lsx_vmskltz_b(*this), 0); } - simdjson_inline bool any() const { return 0 == __lsx_vpickve2gr_hu(__lsx_vmsknz_b(*this), 0); } + simdjson_inline int to_bitmask() const { + __m256i mask = __lasx_xvmskltz_b(*this); + return (__lasx_xvpickve2gr_w(mask, 4) << 16) | (__lasx_xvpickve2gr_w(mask, 0)); + } + simdjson_inline bool any() const { + __m256i v = __lasx_xvmsknz_b(*this); + return (0 == __lasx_xvpickve2gr_w(v, 0)) && (0 == __lasx_xvpickve2gr_w(v, 4)); + } simdjson_inline simd8<bool> operator~() const { return *this ^ true; } }; template<typename T> struct base8_numeric: base8<T> { - static simdjson_inline simd8<T> splat(T _value) { return __lsx_vreplgr2vr_b(_value); } - static simdjson_inline simd8<T> zero() { return __lsx_vldi(0); } - static simdjson_inline simd8<T> load(const T values[16]) { - return __lsx_vld(reinterpret_cast<const __m128i *>(values), 0); + static simdjson_inline simd8<T> splat(T _value) { + return __lasx_xvreplgr2vr_b(_value); + } + static simdjson_inline simd8<T> zero() { return __lasx_xvldi(0); } + static simdjson_inline simd8<T> load(const T values[32]) { + return __lasx_xvld(reinterpret_cast<const __m256i *>(values), 0); } // Repeat 16 values as many times as necessary (usually for lookup tables) static simdjson_inline simd8<T> repeat_16( @@ -28374,22 +30490,24 @@ namespace simd { T v8, T v9, T v10, T v11, T v12, T v13, T v14, T v15 ) { return simd8<T>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,v11,v12,v13,v14,v15 ); } simdjson_inline base8_numeric() : base8<T>() {} - simdjson_inline base8_numeric(const __m128i _value) : base8<T>(_value) {} + simdjson_inline base8_numeric(const __m256i _value) : base8<T>(_value) {} // Store to array - simdjson_inline void store(T dst[16]) const { - return __lsx_vst(*this, reinterpret_cast<__m128i *>(dst), 0); + simdjson_inline void store(T dst[32]) const { + return __lasx_xvst(*this, reinterpret_cast<__m256i *>(dst), 0); } // Addition/subtraction are the same for signed and unsigned - simdjson_inline simd8<T> operator+(const simd8<T> other) const { return __lsx_vadd_b(*this, other); } - simdjson_inline simd8<T> operator-(const simd8<T> other) const { return __lsx_vsub_b(*this, other); } + simdjson_inline simd8<T> operator+(const simd8<T> other) const { return __lasx_xvadd_b(*this, other); } + simdjson_inline simd8<T> operator-(const simd8<T> other) const { return __lasx_xvsub_b(*this, other); } simdjson_inline simd8<T>& operator+=(const simd8<T> other) { *this = *this + other; return *static_cast<simd8<T>*>(this); } simdjson_inline simd8<T>& operator-=(const simd8<T> other) { *this = *this - other; return *static_cast<simd8<T>*>(this); } @@ -28399,7 +30517,7 @@ namespace simd { // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values) template<typename L> simdjson_inline simd8<L> lookup_16(simd8<L> lookup_table) const { - return __lsx_vshuf_b(lookup_table, lookup_table, *this); + return __lasx_xvshuf_b(lookup_table, lookup_table, *this); } // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted as a bitset). @@ -28407,26 +30525,38 @@ namespace simd { // Only the first 16 - count_ones(mask) bytes of the result are significant but 16 bytes // get written. template<typename L> - simdjson_inline void compress(uint16_t mask, L * output) const { + simdjson_inline void compress(uint32_t mask, L * output) const { using internal::thintable_epi8; using internal::BitsSetTable256mul2; using internal::pshufb_combine_table; // this particular implementation was inspired by haswell - // lsx do it in 2 steps, first 8 bytes and then second 8 bytes... + // lasx do it in 4 steps, first 8 bytes and then second 8 bytes... uint8_t mask1 = uint8_t(mask); // least significant 8 bits - uint8_t mask2 = uint8_t(mask >> 8); // second least significant 8 bits - // next line just loads the 64-bit values thintable_epi8[mask1] and - // thintable_epi8[mask2] into a 128-bit register. - __m128i shufmask = {int64_t(thintable_epi8[mask1]), int64_t(thintable_epi8[mask2]) + 0x0808080808080808}; + uint8_t mask2 = uint8_t(mask >> 8); // second significant 8 bits + uint8_t mask3 = uint8_t(mask >> 16); // ... + uint8_t mask4 = uint8_t(mask >> 24); // ... + // next line just loads the 64-bit values thintable_epi8[mask{1,2,3,4}] + // into a 256-bit register. + __m256i shufmask = {int64_t(thintable_epi8[mask1]), int64_t(thintable_epi8[mask2]) + 0x0808080808080808, int64_t(thintable_epi8[mask3]), int64_t(thintable_epi8[mask4]) + 0x0808080808080808}; // this is the version "nearly pruned" - __m128i pruned = __lsx_vshuf_b(*this, *this, shufmask); + __m256i pruned = __lasx_xvshuf_b(*this, *this, shufmask); // we still need to put the pieces back together. // we compute the popcount of the first words: int pop1 = BitsSetTable256mul2[mask1]; + int pop2 = BitsSetTable256mul2[mask2]; + int pop3 = BitsSetTable256mul2[mask3]; + // then load the corresponding mask - __m128i compactmask = __lsx_vldx(reinterpret_cast<void*>(reinterpret_cast<unsigned long>(pshufb_combine_table)), pop1 * 8); - __m128i answer = __lsx_vshuf_b(pruned, pruned, compactmask); - __lsx_vst(answer, reinterpret_cast<uint8_t*>(output), 0); + __m256i masklo = __lasx_xvldx(reinterpret_cast<void*>(reinterpret_cast<unsigned long>(pshufb_combine_table)), pop1 * 8); + __m256i maskhi = __lasx_xvldx(reinterpret_cast<void*>(reinterpret_cast<unsigned long>(pshufb_combine_table)), pop3 * 8); + __m256i compactmask = __lasx_xvpermi_q(maskhi, masklo, 0x20); + __m256i answer = __lasx_xvshuf_b(pruned, pruned, compactmask); + __lasx_xvst(answer, reinterpret_cast<uint8_t*>(output), 0); + uint64_t value3 = __lasx_xvpickve2gr_du(answer, 2); + uint64_t value4 = __lasx_xvpickve2gr_du(answer, 3); + uint64_t *pos = reinterpret_cast<uint64_t*>(reinterpret_cast<uint8_t*>(output) + 16 - (pop1 + pop2) / 2); + pos[0] = value3; + pos[1] = value4; } template<typename L> @@ -28448,18 +30578,22 @@ namespace simd { template<> struct simd8<int8_t> : base8_numeric<int8_t> { simdjson_inline simd8() : base8_numeric<int8_t>() {} - simdjson_inline simd8(const __m128i _value) : base8_numeric<int8_t>(_value) {} + simdjson_inline simd8(const __m256i _value) : base8_numeric<int8_t>(_value) {} // Splat constructor simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {} // Array constructor - simdjson_inline simd8(const int8_t values[16]) : simd8(load(values)) {} + simdjson_inline simd8(const int8_t values[32]) : simd8(load(values)) {} // Member-by-member initialization simdjson_inline simd8( int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, - int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 + int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15, + int8_t v16, int8_t v17, int8_t v18, int8_t v19, int8_t v20, int8_t v21, int8_t v22, int8_t v23, + int8_t v24, int8_t v25, int8_t v26, int8_t v27, int8_t v28, int8_t v29, int8_t v30, int8_t v31 ) : simd8({ v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15 + v8, v9, v10,v11,v12,v13,v14,v15, + v16,v17,v18,v19,v20,v21,v22,v23, + v24,v25,v26,v27,v28,v29,v30,v31 }) {} // Repeat 16 values as many times as necessary (usually for lookup tables) simdjson_inline static simd8<int8_t> repeat_16( @@ -28467,34 +30601,40 @@ namespace simd { int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 ) { return simd8<int8_t>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,v11,v12,v13,v14,v15 ); } // Order-sensitive comparisons - simdjson_inline simd8<int8_t> max_val(const simd8<int8_t> other) const { return __lsx_vmax_b(*this, other); } - simdjson_inline simd8<int8_t> min_val(const simd8<int8_t> other) const { return __lsx_vmin_b(*this, other); } - simdjson_inline simd8<bool> operator>(const simd8<int8_t> other) const { return __lsx_vslt_b(other, *this); } - simdjson_inline simd8<bool> operator<(const simd8<int8_t> other) const { return __lsx_vslt_b(*this, other); } + simdjson_inline simd8<int8_t> max_val(const simd8<int8_t> other) const { return __lasx_xvmax_b(*this, other); } + simdjson_inline simd8<int8_t> min_val(const simd8<int8_t> other) const { return __lasx_xvmin_b(*this, other); } + simdjson_inline simd8<bool> operator>(const simd8<int8_t> other) const { return __lasx_xvslt_b(other, *this); } + simdjson_inline simd8<bool> operator<(const simd8<int8_t> other) const { return __lasx_xvslt_b(*this, other); } }; // Unsigned bytes template<> struct simd8<uint8_t>: base8_numeric<uint8_t> { simdjson_inline simd8() : base8_numeric<uint8_t>() {} - simdjson_inline simd8(const __m128i _value) : base8_numeric<uint8_t>(_value) {} + simdjson_inline simd8(const __m256i _value) : base8_numeric<uint8_t>(_value) {} // Splat constructor simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {} // Array constructor - simdjson_inline simd8(const uint8_t values[16]) : simd8(load(values)) {} + simdjson_inline simd8(const uint8_t values[32]) : simd8(load(values)) {} // Member-by-member initialization simdjson_inline simd8( uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, - uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 - ) : simd8(__m128i(v16u8{ + uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15, + uint8_t v16, uint8_t v17, uint8_t v18, uint8_t v19, uint8_t v20, uint8_t v21, uint8_t v22, uint8_t v23, + uint8_t v24, uint8_t v25, uint8_t v26, uint8_t v27, uint8_t v28, uint8_t v29, uint8_t v30, uint8_t v31 + ) : simd8(__m256i(v32u8{ v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15 + v8, v9, v10,v11,v12,v13,v14,v15, + v16,v17,v18,v19,v20,v21,v22,v23, + v24,v25,v26,v27,v28,v29,v30,v31 })) {} // Repeat 16 values as many times as necessary (usually for lookup tables) simdjson_inline static simd8<uint8_t> repeat_16( @@ -28502,18 +30642,20 @@ namespace simd { uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 ) { return simd8<uint8_t>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,v11,v12,v13,v14,v15 ); } // Saturated math - simdjson_inline simd8<uint8_t> saturating_add(const simd8<uint8_t> other) const { return __lsx_vsadd_bu(*this, other); } - simdjson_inline simd8<uint8_t> saturating_sub(const simd8<uint8_t> other) const { return __lsx_vssub_bu(*this, other); } + simdjson_inline simd8<uint8_t> saturating_add(const simd8<uint8_t> other) const { return __lasx_xvsadd_bu(*this, other); } + simdjson_inline simd8<uint8_t> saturating_sub(const simd8<uint8_t> other) const { return __lasx_xvssub_bu(*this, other); } // Order-specific operations - simdjson_inline simd8<uint8_t> max_val(const simd8<uint8_t> other) const { return __lsx_vmax_bu(*this, other); } - simdjson_inline simd8<uint8_t> min_val(const simd8<uint8_t> other) const { return __lsx_vmin_bu(other, *this); } + simdjson_inline simd8<uint8_t> max_val(const simd8<uint8_t> other) const { return __lasx_xvmax_bu(*this, other); } + simdjson_inline simd8<uint8_t> min_val(const simd8<uint8_t> other) const { return __lasx_xvmin_bu(other, *this); } // Same as >, but only guarantees true is nonzero (< guarantees true = -1) simdjson_inline simd8<uint8_t> gt_bits(const simd8<uint8_t> other) const { return this->saturating_sub(other); } // Same as <, but only guarantees true is nonzero (< guarantees true = -1) @@ -28528,96 +30670,85 @@ namespace simd { simdjson_inline simd8<bool> bits_not_set(simd8<uint8_t> bits) const { return (*this & bits).bits_not_set(); } simdjson_inline simd8<bool> any_bits_set() const { return ~this->bits_not_set(); } simdjson_inline simd8<bool> any_bits_set(simd8<uint8_t> bits) const { return ~this->bits_not_set(bits); } - simdjson_inline bool is_ascii() const { return 0 == __lsx_vpickve2gr_w(__lsx_vmskltz_b(*this), 0); } - simdjson_inline bool bits_not_set_anywhere() const { return 0 == __lsx_vpickve2gr_hu(__lsx_vmsknz_b(*this), 0); } + simdjson_inline bool is_ascii() const { + __m256i mask = __lasx_xvmskltz_b(*this); + return (0 == __lasx_xvpickve2gr_w(mask, 0)) && (0 == __lasx_xvpickve2gr_w(mask, 4)); + } + simdjson_inline bool bits_not_set_anywhere() const { + __m256i v = __lasx_xvmsknz_b(*this); + return (0 == __lasx_xvpickve2gr_w(v, 0)) && (0 == __lasx_xvpickve2gr_w(v, 4)); + } simdjson_inline bool any_bits_set_anywhere() const { return !bits_not_set_anywhere(); } simdjson_inline bool bits_not_set_anywhere(simd8<uint8_t> bits) const { - return 0 == __lsx_vpickve2gr_hu(__lsx_vmsknz_b(__lsx_vand_v(*this, bits)), 0); + __m256i v = __lasx_xvmsknz_b(__lasx_xvand_v(*this, bits)); + return (0 == __lasx_xvpickve2gr_w(v, 0)) && (0 == __lasx_xvpickve2gr_w(v, 4)); } simdjson_inline bool any_bits_set_anywhere(simd8<uint8_t> bits) const { return !bits_not_set_anywhere(bits); } template<int N> - simdjson_inline simd8<uint8_t> shr() const { return simd8<uint8_t>(__lsx_vsrli_b(*this, N)); } + simdjson_inline simd8<uint8_t> shr() const { return simd8<uint8_t>(__lasx_xvsrli_b(*this, N)); } template<int N> - simdjson_inline simd8<uint8_t> shl() const { return simd8<uint8_t>(__lsx_vslli_b(*this, N)); } + simdjson_inline simd8<uint8_t> shl() const { return simd8<uint8_t>(__lasx_xvslli_b(*this, N)); } }; template<typename T> struct simd8x64 { static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<T>); - static_assert(NUM_CHUNKS == 4, "LSX kernel should use four registers per 64-byte block."); + static_assert(NUM_CHUNKS == 2, "LASX kernel should use two registers per 64-byte block."); const simd8<T> chunks[NUM_CHUNKS]; + template<int idx> simd8<uint8_t> get() const { return idx < NUM_CHUNKS ? chunks[idx] : simd8<T>(); } simd8x64(const simd8x64<T>& o) = delete; // no copy allowed simd8x64<T>& operator=(const simd8<T>& other) = delete; // no assignment allowed simd8x64() = delete; // no default constructor allowed - simdjson_inline simd8x64(const simd8<T> chunk0, const simd8<T> chunk1, const simd8<T> chunk2, const simd8<T> chunk3) : chunks{chunk0, chunk1, chunk2, chunk3} {} - simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8<T>::load(ptr), simd8<T>::load(ptr+16), simd8<T>::load(ptr+32), simd8<T>::load(ptr+48)} {} + simdjson_inline simd8x64(const simd8<T> chunk0, const simd8<T> chunk1) : chunks{chunk0, chunk1} {} + simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8<T>::load(ptr), simd8<T>::load(ptr+32)} {} simdjson_inline uint64_t compress(uint64_t mask, T * output) const { - uint16_t mask1 = uint16_t(mask); - uint16_t mask2 = uint16_t(mask >> 16); - uint16_t mask3 = uint16_t(mask >> 32); - uint16_t mask4 = uint16_t(mask >> 48); - __m128i zcnt = __lsx_vpcnt_h(__m128i(v2u64{~mask, 0})); - uint64_t zcnt1 = __lsx_vpickve2gr_hu(zcnt, 0); - uint64_t zcnt2 = __lsx_vpickve2gr_hu(zcnt, 1); - uint64_t zcnt3 = __lsx_vpickve2gr_hu(zcnt, 2); - uint64_t zcnt4 = __lsx_vpickve2gr_hu(zcnt, 3); - uint8_t *voutput = reinterpret_cast<uint8_t*>(output); + uint32_t mask1 = uint32_t(mask); + uint32_t mask2 = uint32_t(mask >> 32); + __m256i zcnt = __lasx_xvpcnt_w(__m256i(v4u64{~mask, 0, 0, 0})); + uint64_t zcnt1 = __lasx_xvpickve2gr_wu(zcnt, 0); + uint64_t zcnt2 = __lasx_xvpickve2gr_wu(zcnt, 1); // There should be a critical value which processes in scaler is faster. if (zcnt1) - this->chunks[0].compress(mask1, reinterpret_cast<T*>(voutput)); - voutput += zcnt1; + this->chunks[0].compress(mask1, output); if (zcnt2) - this->chunks[1].compress(mask2, reinterpret_cast<T*>(voutput)); - voutput += zcnt2; - if (zcnt3) - this->chunks[2].compress(mask3, reinterpret_cast<T*>(voutput)); - voutput += zcnt3; - if (zcnt4) - this->chunks[3].compress(mask4, reinterpret_cast<T*>(voutput)); - voutput += zcnt4; - return reinterpret_cast<uint64_t>(voutput) - reinterpret_cast<uint64_t>(output); + this->chunks[1].compress(mask2, output + zcnt1); + return zcnt1 + zcnt2; } simdjson_inline void store(T ptr[64]) const { this->chunks[0].store(ptr+sizeof(simd8<T>)*0); this->chunks[1].store(ptr+sizeof(simd8<T>)*1); - this->chunks[2].store(ptr+sizeof(simd8<T>)*2); - this->chunks[3].store(ptr+sizeof(simd8<T>)*3); } simdjson_inline uint64_t to_bitmask() const { - __m128i mask1 = __lsx_vmskltz_b(this->chunks[0]); - __m128i mask2 = __lsx_vmskltz_b(this->chunks[1]); - __m128i mask3 = __lsx_vmskltz_b(this->chunks[2]); - __m128i mask4 = __lsx_vmskltz_b(this->chunks[3]); - mask1 = __lsx_vilvl_h(mask2, mask1); - mask2 = __lsx_vilvl_h(mask4, mask3); - return __lsx_vpickve2gr_du(__lsx_vilvl_w(mask2, mask1), 0); + __m256i mask0 = __lasx_xvmskltz_b(this->chunks[0]); + __m256i mask1 = __lasx_xvmskltz_b(this->chunks[1]); + __m256i mask_tmp = __lasx_xvpickve_w(mask0, 4); + __m256i tmp = __lasx_xvpickve_w(mask1, 4); + mask0 = __lasx_xvinsve0_w(mask0, mask1, 1); + mask_tmp = __lasx_xvinsve0_w(mask_tmp, tmp, 1); + return __lasx_xvpickve2gr_du(__lasx_xvpackev_h(mask_tmp, mask0), 0); } simdjson_inline simd8<T> reduce_or() const { - return (this->chunks[0] | this->chunks[1]) | (this->chunks[2] | this->chunks[3]); + return this->chunks[0] | this->chunks[1]; } simdjson_inline uint64_t eq(const T m) const { const simd8<T> mask = simd8<T>::splat(m); return simd8x64<bool>( this->chunks[0] == mask, - this->chunks[1] == mask, - this->chunks[2] == mask, - this->chunks[3] == mask + this->chunks[1] == mask ).to_bitmask(); } simdjson_inline uint64_t eq(const simd8x64<uint8_t> &other) const { return simd8x64<bool>( this->chunks[0] == other.chunks[0], - this->chunks[1] == other.chunks[1], - this->chunks[2] == other.chunks[2], - this->chunks[3] == other.chunks[3] + this->chunks[1] == other.chunks[1] ).to_bitmask(); } @@ -28625,33 +30756,31 @@ namespace simd { const simd8<T> mask = simd8<T>::splat(m); return simd8x64<bool>( this->chunks[0] <= mask, - this->chunks[1] <= mask, - this->chunks[2] <= mask, - this->chunks[3] <= mask + this->chunks[1] <= mask ).to_bitmask(); } }; // struct simd8x64<T> } // namespace simd } // unnamed namespace -} // namespace lsx +} // namespace lasx } // namespace simdjson -#endif // SIMDJSON_LSX_SIMD_H -/* end file simdjson/lsx/simd.h */ -/* including simdjson/lsx/stringparsing_defs.h: #include "simdjson/lsx/stringparsing_defs.h" */ -/* begin file simdjson/lsx/stringparsing_defs.h */ -#ifndef SIMDJSON_LSX_STRINGPARSING_DEFS_H -#define SIMDJSON_LSX_STRINGPARSING_DEFS_H +#endif // SIMDJSON_LASX_SIMD_H +/* end file simdjson/lasx/simd.h */ +/* including simdjson/lasx/stringparsing_defs.h: #include "simdjson/lasx/stringparsing_defs.h" */ +/* begin file simdjson/lasx/stringparsing_defs.h */ +#ifndef SIMDJSON_LASX_STRINGPARSING_DEFS_H +#define SIMDJSON_LASX_STRINGPARSING_DEFS_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/simd.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/simd.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/bitmanipulation.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace { using namespace simd; @@ -28675,17 +30804,11 @@ simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uin // this can read up to 31 bytes beyond the buffer size, but we require // SIMDJSON_PADDING of padding static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "backslash and quote finder must process fewer than SIMDJSON_PADDING bytes"); - simd8<uint8_t> v0(src); - simd8<uint8_t> v1(src + sizeof(v0)); - v0.store(dst); - v1.store(dst + sizeof(v0)); - - // Getting a 64-bit bitmask is much cheaper than multiple 16-bit bitmasks on LSX; therefore, we - // smash them together into a 64-byte mask and get the bitmask from there. - uint64_t bs_and_quote = simd8x64<bool>(v0 == '\\', v1 == '\\', v0 == '"', v1 == '"').to_bitmask(); + simd8<uint8_t> v(src); + v.store(dst); return { - uint32_t(bs_and_quote), // bs_bits - uint32_t(bs_and_quote >> 32) // quote_bits + static_cast<uint32_t>((v == '\\').to_bitmask()), // bs_bits + static_cast<uint32_t>((v == '"').to_bitmask()), // quote_bits }; } @@ -28715,22 +30838,24 @@ simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *ds } } // unnamed namespace -} // namespace lsx +} // namespace lasx } // namespace simdjson -#endif // SIMDJSON_LSX_STRINGPARSING_DEFS_H -/* end file simdjson/lsx/stringparsing_defs.h */ +#endif // SIMDJSON_LASX_STRINGPARSING_DEFS_H +/* end file simdjson/lasx/stringparsing_defs.h */ #define SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT 1 -/* end file simdjson/lsx/begin.h */ -/* including simdjson/generic/amalgamated.h for lsx: #include "simdjson/generic/amalgamated.h" */ -/* begin file simdjson/generic/amalgamated.h for lsx */ + + +/* end file simdjson/lasx/begin.h */ +/* including simdjson/generic/amalgamated.h for lasx: #include "simdjson/generic/amalgamated.h" */ +/* begin file simdjson/generic/amalgamated.h for lasx */ #if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_DEPENDENCIES_H) #error simdjson/generic/dependencies.h must be included before simdjson/generic/amalgamated.h! #endif -/* including simdjson/generic/base.h for lsx: #include "simdjson/generic/base.h" */ -/* begin file simdjson/generic/base.h for lsx */ +/* including simdjson/generic/base.h for lasx: #include "simdjson/generic/base.h" */ +/* begin file simdjson/generic/base.h for lasx */ #ifndef SIMDJSON_GENERIC_BASE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -28750,10 +30875,12 @@ simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *ds /* amalgamation skipped (editor-only): #include "simdjson/arm64/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_PPC64 */ /* amalgamation skipped (editor-only): #include "simdjson/ppc64/begin.h" */ -/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LSX */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LASX */ /* amalgamation skipped (editor-only): #include "simdjson/lasx/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LSX */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_RVV_VLS */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_FALLBACK */ /* amalgamation skipped (editor-only): #include "simdjson/fallback/begin.h" */ /* amalgamation skipped (editor-only): #else */ @@ -28763,7 +30890,7 @@ simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *ds /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { struct open_container; class dom_parser_implementation; @@ -28778,13 +30905,13 @@ enum class number_type { big_integer /// a big integer that does not fit in a 64-bit word }; -} // namespace lsx +} // namespace lasx } // namespace simdjson #endif // SIMDJSON_GENERIC_BASE_H -/* end file simdjson/generic/base.h for lsx */ -/* including simdjson/generic/jsoncharutils.h for lsx: #include "simdjson/generic/jsoncharutils.h" */ -/* begin file simdjson/generic/jsoncharutils.h for lsx */ +/* end file simdjson/generic/base.h for lasx */ +/* including simdjson/generic/jsoncharutils.h for lasx: #include "simdjson/generic/jsoncharutils.h" */ +/* begin file simdjson/generic/jsoncharutils.h for lasx */ #ifndef SIMDJSON_GENERIC_JSONCHARUTILS_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -28795,7 +30922,7 @@ enum class number_type { /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace { namespace jsoncharutils { @@ -28885,13 +31012,13 @@ static simdjson_inline uint64_t _umul128(uint64_t ab, uint64_t cd, uint64_t *hi) } // namespace jsoncharutils } // unnamed namespace -} // namespace lsx +} // namespace lasx } // namespace simdjson #endif // SIMDJSON_GENERIC_JSONCHARUTILS_H -/* end file simdjson/generic/jsoncharutils.h for lsx */ -/* including simdjson/generic/atomparsing.h for lsx: #include "simdjson/generic/atomparsing.h" */ -/* begin file simdjson/generic/atomparsing.h for lsx */ +/* end file simdjson/generic/jsoncharutils.h for lasx */ +/* including simdjson/generic/atomparsing.h for lasx: #include "simdjson/generic/atomparsing.h" */ +/* begin file simdjson/generic/atomparsing.h for lasx */ #ifndef SIMDJSON_GENERIC_ATOMPARSING_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -28903,7 +31030,7 @@ static simdjson_inline uint64_t _umul128(uint64_t ab, uint64_t cd, uint64_t *hi) #include <cstring> namespace simdjson { -namespace lsx { +namespace lasx { namespace { /// @private namespace atomparsing { @@ -28965,13 +31092,13 @@ simdjson_inline bool is_valid_null_atom(const uint8_t *src, size_t len) { } // namespace atomparsing } // unnamed namespace -} // namespace lsx +} // namespace lasx } // namespace simdjson #endif // SIMDJSON_GENERIC_ATOMPARSING_H -/* end file simdjson/generic/atomparsing.h for lsx */ -/* including simdjson/generic/dom_parser_implementation.h for lsx: #include "simdjson/generic/dom_parser_implementation.h" */ -/* begin file simdjson/generic/dom_parser_implementation.h for lsx */ +/* end file simdjson/generic/atomparsing.h for lasx */ +/* including simdjson/generic/dom_parser_implementation.h for lasx: #include "simdjson/generic/dom_parser_implementation.h" */ +/* begin file simdjson/generic/dom_parser_implementation.h for lasx */ #ifndef SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -28981,7 +31108,7 @@ simdjson_inline bool is_valid_null_atom(const uint8_t *src, size_t len) { /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { // expectation: sizeof(open_container) = 64/8. struct open_container { @@ -29023,11 +31150,11 @@ class dom_parser_implementation final : public internal::dom_parser_implementati }; -} // namespace lsx +} // namespace lasx } // namespace simdjson namespace simdjson { -namespace lsx { +namespace lasx { inline dom_parser_implementation::dom_parser_implementation() noexcept = default; inline dom_parser_implementation::dom_parser_implementation(dom_parser_implementation &&other) noexcept = default; @@ -29057,13 +31184,13 @@ inline simdjson_warn_unused error_code dom_parser_implementation::set_max_depth( return SUCCESS; } -} // namespace lsx +} // namespace lasx } // namespace simdjson #endif // SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H -/* end file simdjson/generic/dom_parser_implementation.h for lsx */ -/* including simdjson/generic/implementation_simdjson_result_base.h for lsx: #include "simdjson/generic/implementation_simdjson_result_base.h" */ -/* begin file simdjson/generic/implementation_simdjson_result_base.h for lsx */ +/* end file simdjson/generic/dom_parser_implementation.h for lasx */ +/* including simdjson/generic/implementation_simdjson_result_base.h for lasx: #include "simdjson/generic/implementation_simdjson_result_base.h" */ +/* begin file simdjson/generic/implementation_simdjson_result_base.h for lasx */ #ifndef SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -29072,7 +31199,7 @@ inline simdjson_warn_unused error_code dom_parser_implementation::set_max_depth( /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { // This is a near copy of include/error.h's implementation_simdjson_result_base, except it doesn't use std::pair // so we can avoid inlining errors @@ -29213,13 +31340,13 @@ struct implementation_simdjson_result_base { error_code second{UNINITIALIZED}; /** Users should never directly access 'second'. **/ }; // struct implementation_simdjson_result_base -} // namespace lsx +} // namespace lasx } // namespace simdjson #endif // SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H -/* end file simdjson/generic/implementation_simdjson_result_base.h for lsx */ -/* including simdjson/generic/numberparsing.h for lsx: #include "simdjson/generic/numberparsing.h" */ -/* begin file simdjson/generic/numberparsing.h for lsx */ +/* end file simdjson/generic/implementation_simdjson_result_base.h for lasx */ +/* including simdjson/generic/numberparsing.h for lasx: #include "simdjson/generic/numberparsing.h" */ +/* begin file simdjson/generic/numberparsing.h for lasx */ #ifndef SIMDJSON_GENERIC_NUMBERPARSING_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -29234,7 +31361,7 @@ struct implementation_simdjson_result_base { #include <cstring> namespace simdjson { -namespace lsx { +namespace lasx { namespace numberparsing { #ifdef JSON_TEST_NUMBERS @@ -30549,14 +32676,14 @@ inline std::ostream& operator<<(std::ostream& out, number_type type) noexcept { return out; } -} // namespace lsx +} // namespace lasx } // namespace simdjson #endif // SIMDJSON_GENERIC_NUMBERPARSING_H -/* end file simdjson/generic/numberparsing.h for lsx */ +/* end file simdjson/generic/numberparsing.h for lasx */ -/* including simdjson/generic/implementation_simdjson_result_base-inl.h for lsx: #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */ -/* begin file simdjson/generic/implementation_simdjson_result_base-inl.h for lsx */ +/* including simdjson/generic/implementation_simdjson_result_base-inl.h for lasx: #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */ +/* begin file simdjson/generic/implementation_simdjson_result_base-inl.h for lasx */ #ifndef SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -30566,7 +32693,7 @@ inline std::ostream& operator<<(std::ostream& out, number_type type) noexcept { /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { // // internal::implementation_simdjson_result_base<T> inline implementation @@ -30672,39 +32799,46 @@ template<typename T> simdjson_inline implementation_simdjson_result_base<T>::implementation_simdjson_result_base(T &&value) noexcept : implementation_simdjson_result_base(std::forward<T>(value), SUCCESS) {} -} // namespace lsx +} // namespace lasx } // namespace simdjson #endif // SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H -/* end file simdjson/generic/implementation_simdjson_result_base-inl.h for lsx */ -/* end file simdjson/generic/amalgamated.h for lsx */ -/* including simdjson/lsx/end.h: #include "simdjson/lsx/end.h" */ -/* begin file simdjson/lsx/end.h */ +/* end file simdjson/generic/implementation_simdjson_result_base-inl.h for lasx */ +/* end file simdjson/generic/amalgamated.h for lasx */ +/* including simdjson/lasx/end.h: #include "simdjson/lasx/end.h" */ +/* begin file simdjson/lasx/end.h */ /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ #undef SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT -/* undefining SIMDJSON_IMPLEMENTATION from "lsx" */ +/* undefining SIMDJSON_IMPLEMENTATION from "lasx" */ #undef SIMDJSON_IMPLEMENTATION -/* end file simdjson/lsx/end.h */ -#endif // SIMDJSON_LSX_H -/* end file simdjson/lsx.h */ -#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(lasx) -/* including simdjson/lasx.h: #include "simdjson/lasx.h" */ -/* begin file simdjson/lasx.h */ -#ifndef SIMDJSON_LASX_H -#define SIMDJSON_LASX_H -/* including simdjson/lasx/begin.h: #include "simdjson/lasx/begin.h" */ -/* begin file simdjson/lasx/begin.h */ -/* defining SIMDJSON_IMPLEMENTATION to "lasx" */ -#define SIMDJSON_IMPLEMENTATION lasx -/* including simdjson/lasx/base.h: #include "simdjson/lasx/base.h" */ -/* begin file simdjson/lasx/base.h */ -#ifndef SIMDJSON_LASX_BASE_H -#define SIMDJSON_LASX_BASE_H +#if SIMDJSON_CAN_ALWAYS_RUN_LASX +// nothing needed. +#else +SIMDJSON_UNTARGET_REGION +#endif +/* end file simdjson/lasx/end.h */ + +#endif // SIMDJSON_LASX_H +/* end file simdjson/lasx.h */ +#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(lsx) +/* including simdjson/lsx.h: #include "simdjson/lsx.h" */ +/* begin file simdjson/lsx.h */ +#ifndef SIMDJSON_LSX_H +#define SIMDJSON_LSX_H + +/* including simdjson/lsx/begin.h: #include "simdjson/lsx/begin.h" */ +/* begin file simdjson/lsx/begin.h */ +/* defining SIMDJSON_IMPLEMENTATION to "lsx" */ +#define SIMDJSON_IMPLEMENTATION lsx +/* including simdjson/lsx/base.h: #include "simdjson/lsx/base.h" */ +/* begin file simdjson/lsx/base.h */ +#ifndef SIMDJSON_LSX_BASE_H +#define SIMDJSON_LSX_BASE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ /* amalgamation skipped (editor-only): #include "simdjson/base.h" */ @@ -30712,9 +32846,9 @@ simdjson_inline implementation_simdjson_result_base<T>::implementation_simdjson_ namespace simdjson { /** - * Implementation for LASX. + * Implementation for LSX. */ -namespace lasx { +namespace lsx { class implementation; @@ -30725,41 +32859,39 @@ template <typename T> struct simd8x64; } // namespace simd } // unnamed namespace -} // namespace lasx +} // namespace lsx } // namespace simdjson -#endif // SIMDJSON_LASX_BASE_H -/* end file simdjson/lasx/base.h */ -/* including simdjson/lasx/intrinsics.h: #include "simdjson/lasx/intrinsics.h" */ -/* begin file simdjson/lasx/intrinsics.h */ -#ifndef SIMDJSON_LASX_INTRINSICS_H -#define SIMDJSON_LASX_INTRINSICS_H +#endif // SIMDJSON_LSX_BASE_H +/* end file simdjson/lsx/base.h */ +/* including simdjson/lsx/intrinsics.h: #include "simdjson/lsx/intrinsics.h" */ +/* begin file simdjson/lsx/intrinsics.h */ +#ifndef SIMDJSON_LSX_INTRINSICS_H +#define SIMDJSON_LSX_INTRINSICS_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -// This should be the correct header whether -// you use visual studio or other compilers. -#include <lasxintrin.h> +#include <lsxintrin.h> -static_assert(sizeof(__m256i) <= simdjson::SIMDJSON_PADDING, "insufficient padding for LoongArch ASX"); +static_assert(sizeof(__m128i) <= simdjson::SIMDJSON_PADDING, "insufficient padding for LoongArch SX"); -#endif // SIMDJSON_LASX_INTRINSICS_H -/* end file simdjson/lasx/intrinsics.h */ -/* including simdjson/lasx/bitmanipulation.h: #include "simdjson/lasx/bitmanipulation.h" */ -/* begin file simdjson/lasx/bitmanipulation.h */ -#ifndef SIMDJSON_LASX_BITMANIPULATION_H -#define SIMDJSON_LASX_BITMANIPULATION_H +#endif // SIMDJSON_LSX_INTRINSICS_H +/* end file simdjson/lsx/intrinsics.h */ +/* including simdjson/lsx/bitmanipulation.h: #include "simdjson/lsx/bitmanipulation.h" */ +/* begin file simdjson/lsx/bitmanipulation.h */ +#ifndef SIMDJSON_LSX_BITMANIPULATION_H +#define SIMDJSON_LSX_BITMANIPULATION_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/intrinsics.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/bitmask.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/intrinsics.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/bitmask.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace lsx { namespace { // We sometimes call trailing_zero on inputs that are zero, @@ -30786,7 +32918,7 @@ simdjson_inline int leading_zeroes(uint64_t input_num) { /* result might be undefined when input_num is zero */ simdjson_inline int count_ones(uint64_t input_num) { - return __lasx_xvpickve2gr_w(__lasx_xvpcnt_d(__m256i(v4u64{input_num, 0, 0, 0})), 0); + return __lsx_vpickve2gr_w(__lsx_vpcnt_d(__m128i(v2u64{input_num, 0})), 0); } simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2, uint64_t *result) { @@ -30795,22 +32927,22 @@ simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2, uint64_t *re } } // unnamed namespace -} // namespace lasx +} // namespace lsx } // namespace simdjson -#endif // SIMDJSON_LASX_BITMANIPULATION_H -/* end file simdjson/lasx/bitmanipulation.h */ -/* including simdjson/lasx/bitmask.h: #include "simdjson/lasx/bitmask.h" */ -/* begin file simdjson/lasx/bitmask.h */ -#ifndef SIMDJSON_LASX_BITMASK_H -#define SIMDJSON_LASX_BITMASK_H +#endif // SIMDJSON_LSX_BITMANIPULATION_H +/* end file simdjson/lsx/bitmanipulation.h */ +/* including simdjson/lsx/bitmask.h: #include "simdjson/lsx/bitmask.h" */ +/* begin file simdjson/lsx/bitmask.h */ +#ifndef SIMDJSON_LSX_BITMASK_H +#define SIMDJSON_LSX_BITMASK_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace lsx { namespace { // @@ -30829,26 +32961,26 @@ simdjson_inline uint64_t prefix_xor(uint64_t bitmask) { } } // unnamed namespace -} // namespace lasx +} // namespace lsx } // namespace simdjson #endif -/* end file simdjson/lasx/bitmask.h */ -/* including simdjson/lasx/numberparsing_defs.h: #include "simdjson/lasx/numberparsing_defs.h" */ -/* begin file simdjson/lasx/numberparsing_defs.h */ -#ifndef SIMDJSON_LASX_NUMBERPARSING_DEFS_H -#define SIMDJSON_LASX_NUMBERPARSING_DEFS_H +/* end file simdjson/lsx/bitmask.h */ +/* including simdjson/lsx/numberparsing_defs.h: #include "simdjson/lsx/numberparsing_defs.h" */ +/* begin file simdjson/lsx/numberparsing_defs.h */ +#ifndef SIMDJSON_LSX_NUMBERPARSING_DEFS_H +#define SIMDJSON_LSX_NUMBERPARSING_DEFS_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/intrinsics.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/intrinsics.h" */ /* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ #include <cstring> namespace simdjson { -namespace lasx { +namespace lsx { namespace numberparsing { // we don't have appropriate instructions, so let us use a scalar function @@ -30871,7 +33003,7 @@ simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t } } // namespace numberparsing -} // namespace lasx +} // namespace lsx } // namespace simdjson #ifndef SIMDJSON_SWAR_NUMBER_PARSING @@ -30882,46 +33014,46 @@ simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t #endif #endif -#endif // SIMDJSON_LASX_NUMBERPARSING_DEFS_H -/* end file simdjson/lasx/numberparsing_defs.h */ -/* including simdjson/lasx/simd.h: #include "simdjson/lasx/simd.h" */ -/* begin file simdjson/lasx/simd.h */ -#ifndef SIMDJSON_LASX_SIMD_H -#define SIMDJSON_LASX_SIMD_H +#endif // SIMDJSON_LSX_NUMBERPARSING_DEFS_H +/* end file simdjson/lsx/numberparsing_defs.h */ +/* including simdjson/lsx/simd.h: #include "simdjson/lsx/simd.h" */ +/* begin file simdjson/lsx/simd.h */ +#ifndef SIMDJSON_LSX_SIMD_H +#define SIMDJSON_LSX_SIMD_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/bitmanipulation.h" */ /* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace lsx { namespace { namespace simd { // Forward-declared so they can be used by splat and friends. template<typename Child> struct base { - __m256i value; + __m128i value; // Zero constructor - simdjson_inline base() : value{__m256i()} {} + simdjson_inline base() : value{__m128i()} {} // Conversion from SIMD register - simdjson_inline base(const __m256i _value) : value(_value) {} + simdjson_inline base(const __m128i _value) : value(_value) {} // Conversion to SIMD register - simdjson_inline operator const __m256i&() const { return this->value; } - simdjson_inline operator __m256i&() { return this->value; } - simdjson_inline operator const v32i8&() const { return (v32i8&)this->value; } - simdjson_inline operator v32i8&() { return (v32i8&)this->value; } + simdjson_inline operator const __m128i&() const { return this->value; } + simdjson_inline operator __m128i&() { return this->value; } + simdjson_inline operator const v16i8&() const { return (v16i8&)this->value; } + simdjson_inline operator v16i8&() { return (v16i8&)this->value; } // Bit operations - simdjson_inline Child operator|(const Child other) const { return __lasx_xvor_v(*this, other); } - simdjson_inline Child operator&(const Child other) const { return __lasx_xvand_v(*this, other); } - simdjson_inline Child operator^(const Child other) const { return __lasx_xvxor_v(*this, other); } - simdjson_inline Child bit_andnot(const Child other) const { return __lasx_xvandn_v(other, *this); } + simdjson_inline Child operator|(const Child other) const { return __lsx_vor_v(*this, other); } + simdjson_inline Child operator&(const Child other) const { return __lsx_vand_v(*this, other); } + simdjson_inline Child operator^(const Child other) const { return __lsx_vxor_v(*this, other); } + simdjson_inline Child bit_andnot(const Child other) const { return __lsx_vandn_v(other, *this); } simdjson_inline Child& operator|=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast | other; return *this_cast; } simdjson_inline Child& operator&=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast & other; return *this_cast; } simdjson_inline Child& operator^=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast ^ other; return *this_cast; } @@ -30934,51 +33066,41 @@ namespace simd { template<typename T, typename Mask=simd8<bool>> struct base8: base<simd8<T>> { simdjson_inline base8() : base<simd8<T>>() {} - simdjson_inline base8(const __m256i _value) : base<simd8<T>>(_value) {} + simdjson_inline base8(const __m128i _value) : base<simd8<T>>(_value) {} - friend simdjson_really_inline Mask operator==(const simd8<T> lhs, const simd8<T> rhs) { return __lasx_xvseq_b(lhs, rhs); } + friend simdjson_really_inline Mask operator==(const simd8<T> lhs, const simd8<T> rhs) { return __lsx_vseq_b(lhs, rhs); } static const int SIZE = sizeof(base<simd8<T>>::value); template<int N=1> simdjson_inline simd8<T> prev(const simd8<T> prev_chunk) const { - __m256i hi = __lasx_xvbsll_v(*this, N); - __m256i lo = __lasx_xvbsrl_v(*this, 16 - N); - __m256i tmp = __lasx_xvbsrl_v(prev_chunk, 16 - N); - lo = __lasx_xvpermi_q(lo, tmp, 0x21); - return __lasx_xvor_v(hi, lo); + return __lsx_vor_v(__lsx_vbsll_v(*this, N), __lsx_vbsrl_v(prev_chunk, 16 - N)); } }; // SIMD byte mask type (returned by things like eq and gt) template<> struct simd8<bool>: base8<bool> { - static simdjson_inline simd8<bool> splat(bool _value) { return __lasx_xvreplgr2vr_b(uint8_t(-(!!_value))); } + static simdjson_inline simd8<bool> splat(bool _value) { + return __lsx_vreplgr2vr_b(uint8_t(-(!!_value))); + } simdjson_inline simd8() : base8() {} - simdjson_inline simd8(const __m256i _value) : base8<bool>(_value) {} + simdjson_inline simd8(const __m128i _value) : base8<bool>(_value) {} // Splat constructor simdjson_inline simd8(bool _value) : base8<bool>(splat(_value)) {} - simdjson_inline int to_bitmask() const { - __m256i mask = __lasx_xvmskltz_b(*this); - return (__lasx_xvpickve2gr_w(mask, 4) << 16) | (__lasx_xvpickve2gr_w(mask, 0)); - } - simdjson_inline bool any() const { - __m256i v = __lasx_xvmsknz_b(*this); - return (0 == __lasx_xvpickve2gr_w(v, 0)) && (0 == __lasx_xvpickve2gr_w(v, 4)); - } + simdjson_inline int to_bitmask() const { return __lsx_vpickve2gr_w(__lsx_vmskltz_b(*this), 0); } + simdjson_inline bool any() const { return 0 == __lsx_vpickve2gr_hu(__lsx_vmsknz_b(*this), 0); } simdjson_inline simd8<bool> operator~() const { return *this ^ true; } }; template<typename T> struct base8_numeric: base8<T> { - static simdjson_inline simd8<T> splat(T _value) { - return __lasx_xvreplgr2vr_b(_value); - } - static simdjson_inline simd8<T> zero() { return __lasx_xvldi(0); } - static simdjson_inline simd8<T> load(const T values[32]) { - return __lasx_xvld(reinterpret_cast<const __m256i *>(values), 0); + static simdjson_inline simd8<T> splat(T _value) { return __lsx_vreplgr2vr_b(_value); } + static simdjson_inline simd8<T> zero() { return __lsx_vldi(0); } + static simdjson_inline simd8<T> load(const T values[16]) { + return __lsx_vld(reinterpret_cast<const __m128i *>(values), 0); } // Repeat 16 values as many times as necessary (usually for lookup tables) static simdjson_inline simd8<T> repeat_16( @@ -30986,24 +33108,22 @@ namespace simd { T v8, T v9, T v10, T v11, T v12, T v13, T v14, T v15 ) { return simd8<T>( - v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,v11,v12,v13,v14,v15 ); } simdjson_inline base8_numeric() : base8<T>() {} - simdjson_inline base8_numeric(const __m256i _value) : base8<T>(_value) {} + simdjson_inline base8_numeric(const __m128i _value) : base8<T>(_value) {} // Store to array - simdjson_inline void store(T dst[32]) const { - return __lasx_xvst(*this, reinterpret_cast<__m256i *>(dst), 0); + simdjson_inline void store(T dst[16]) const { + return __lsx_vst(*this, reinterpret_cast<__m128i *>(dst), 0); } // Addition/subtraction are the same for signed and unsigned - simdjson_inline simd8<T> operator+(const simd8<T> other) const { return __lasx_xvadd_b(*this, other); } - simdjson_inline simd8<T> operator-(const simd8<T> other) const { return __lasx_xvsub_b(*this, other); } + simdjson_inline simd8<T> operator+(const simd8<T> other) const { return __lsx_vadd_b(*this, other); } + simdjson_inline simd8<T> operator-(const simd8<T> other) const { return __lsx_vsub_b(*this, other); } simdjson_inline simd8<T>& operator+=(const simd8<T> other) { *this = *this + other; return *static_cast<simd8<T>*>(this); } simdjson_inline simd8<T>& operator-=(const simd8<T> other) { *this = *this - other; return *static_cast<simd8<T>*>(this); } @@ -31013,7 +33133,7 @@ namespace simd { // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values) template<typename L> simdjson_inline simd8<L> lookup_16(simd8<L> lookup_table) const { - return __lasx_xvshuf_b(lookup_table, lookup_table, *this); + return __lsx_vshuf_b(lookup_table, lookup_table, *this); } // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted as a bitset). @@ -31021,38 +33141,26 @@ namespace simd { // Only the first 16 - count_ones(mask) bytes of the result are significant but 16 bytes // get written. template<typename L> - simdjson_inline void compress(uint32_t mask, L * output) const { + simdjson_inline void compress(uint16_t mask, L * output) const { using internal::thintable_epi8; using internal::BitsSetTable256mul2; using internal::pshufb_combine_table; // this particular implementation was inspired by haswell - // lasx do it in 4 steps, first 8 bytes and then second 8 bytes... + // lsx do it in 2 steps, first 8 bytes and then second 8 bytes... uint8_t mask1 = uint8_t(mask); // least significant 8 bits - uint8_t mask2 = uint8_t(mask >> 8); // second significant 8 bits - uint8_t mask3 = uint8_t(mask >> 16); // ... - uint8_t mask4 = uint8_t(mask >> 24); // ... - // next line just loads the 64-bit values thintable_epi8[mask{1,2,3,4}] - // into a 256-bit register. - __m256i shufmask = {int64_t(thintable_epi8[mask1]), int64_t(thintable_epi8[mask2]) + 0x0808080808080808, int64_t(thintable_epi8[mask3]), int64_t(thintable_epi8[mask4]) + 0x0808080808080808}; + uint8_t mask2 = uint8_t(mask >> 8); // second least significant 8 bits + // next line just loads the 64-bit values thintable_epi8[mask1] and + // thintable_epi8[mask2] into a 128-bit register. + __m128i shufmask = {int64_t(thintable_epi8[mask1]), int64_t(thintable_epi8[mask2]) + 0x0808080808080808}; // this is the version "nearly pruned" - __m256i pruned = __lasx_xvshuf_b(*this, *this, shufmask); + __m128i pruned = __lsx_vshuf_b(*this, *this, shufmask); // we still need to put the pieces back together. // we compute the popcount of the first words: int pop1 = BitsSetTable256mul2[mask1]; - int pop2 = BitsSetTable256mul2[mask2]; - int pop3 = BitsSetTable256mul2[mask3]; - // then load the corresponding mask - __m256i masklo = __lasx_xvldx(reinterpret_cast<void*>(reinterpret_cast<unsigned long>(pshufb_combine_table)), pop1 * 8); - __m256i maskhi = __lasx_xvldx(reinterpret_cast<void*>(reinterpret_cast<unsigned long>(pshufb_combine_table)), pop3 * 8); - __m256i compactmask = __lasx_xvpermi_q(maskhi, masklo, 0x20); - __m256i answer = __lasx_xvshuf_b(pruned, pruned, compactmask); - __lasx_xvst(answer, reinterpret_cast<uint8_t*>(output), 0); - uint64_t value3 = __lasx_xvpickve2gr_du(answer, 2); - uint64_t value4 = __lasx_xvpickve2gr_du(answer, 3); - uint64_t *pos = reinterpret_cast<uint64_t*>(reinterpret_cast<uint8_t*>(output) + 16 - (pop1 + pop2) / 2); - pos[0] = value3; - pos[1] = value4; + __m128i compactmask = __lsx_vldx(reinterpret_cast<void*>(reinterpret_cast<unsigned long>(pshufb_combine_table)), pop1 * 8); + __m128i answer = __lsx_vshuf_b(pruned, pruned, compactmask); + __lsx_vst(answer, reinterpret_cast<uint8_t*>(output), 0); } template<typename L> @@ -31074,22 +33182,18 @@ namespace simd { template<> struct simd8<int8_t> : base8_numeric<int8_t> { simdjson_inline simd8() : base8_numeric<int8_t>() {} - simdjson_inline simd8(const __m256i _value) : base8_numeric<int8_t>(_value) {} + simdjson_inline simd8(const __m128i _value) : base8_numeric<int8_t>(_value) {} // Splat constructor simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {} // Array constructor - simdjson_inline simd8(const int8_t values[32]) : simd8(load(values)) {} + simdjson_inline simd8(const int8_t values[16]) : simd8(load(values)) {} // Member-by-member initialization simdjson_inline simd8( int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, - int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15, - int8_t v16, int8_t v17, int8_t v18, int8_t v19, int8_t v20, int8_t v21, int8_t v22, int8_t v23, - int8_t v24, int8_t v25, int8_t v26, int8_t v27, int8_t v28, int8_t v29, int8_t v30, int8_t v31 + int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 ) : simd8({ v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15, - v16,v17,v18,v19,v20,v21,v22,v23, - v24,v25,v26,v27,v28,v29,v30,v31 + v8, v9, v10,v11,v12,v13,v14,v15 }) {} // Repeat 16 values as many times as necessary (usually for lookup tables) simdjson_inline static simd8<int8_t> repeat_16( @@ -31097,40 +33201,34 @@ namespace simd { int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 ) { return simd8<int8_t>( - v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,v11,v12,v13,v14,v15 ); } // Order-sensitive comparisons - simdjson_inline simd8<int8_t> max_val(const simd8<int8_t> other) const { return __lasx_xvmax_b(*this, other); } - simdjson_inline simd8<int8_t> min_val(const simd8<int8_t> other) const { return __lasx_xvmin_b(*this, other); } - simdjson_inline simd8<bool> operator>(const simd8<int8_t> other) const { return __lasx_xvslt_b(other, *this); } - simdjson_inline simd8<bool> operator<(const simd8<int8_t> other) const { return __lasx_xvslt_b(*this, other); } + simdjson_inline simd8<int8_t> max_val(const simd8<int8_t> other) const { return __lsx_vmax_b(*this, other); } + simdjson_inline simd8<int8_t> min_val(const simd8<int8_t> other) const { return __lsx_vmin_b(*this, other); } + simdjson_inline simd8<bool> operator>(const simd8<int8_t> other) const { return __lsx_vslt_b(other, *this); } + simdjson_inline simd8<bool> operator<(const simd8<int8_t> other) const { return __lsx_vslt_b(*this, other); } }; // Unsigned bytes template<> struct simd8<uint8_t>: base8_numeric<uint8_t> { simdjson_inline simd8() : base8_numeric<uint8_t>() {} - simdjson_inline simd8(const __m256i _value) : base8_numeric<uint8_t>(_value) {} + simdjson_inline simd8(const __m128i _value) : base8_numeric<uint8_t>(_value) {} // Splat constructor simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {} // Array constructor - simdjson_inline simd8(const uint8_t values[32]) : simd8(load(values)) {} + simdjson_inline simd8(const uint8_t values[16]) : simd8(load(values)) {} // Member-by-member initialization simdjson_inline simd8( uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, - uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15, - uint8_t v16, uint8_t v17, uint8_t v18, uint8_t v19, uint8_t v20, uint8_t v21, uint8_t v22, uint8_t v23, - uint8_t v24, uint8_t v25, uint8_t v26, uint8_t v27, uint8_t v28, uint8_t v29, uint8_t v30, uint8_t v31 - ) : simd8(__m256i(v32u8{ + uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 + ) : simd8(__m128i(v16u8{ v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15, - v16,v17,v18,v19,v20,v21,v22,v23, - v24,v25,v26,v27,v28,v29,v30,v31 + v8, v9, v10,v11,v12,v13,v14,v15 })) {} // Repeat 16 values as many times as necessary (usually for lookup tables) simdjson_inline static simd8<uint8_t> repeat_16( @@ -31138,20 +33236,18 @@ namespace simd { uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 ) { return simd8<uint8_t>( - v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,v11,v12,v13,v14,v15 ); } // Saturated math - simdjson_inline simd8<uint8_t> saturating_add(const simd8<uint8_t> other) const { return __lasx_xvsadd_bu(*this, other); } - simdjson_inline simd8<uint8_t> saturating_sub(const simd8<uint8_t> other) const { return __lasx_xvssub_bu(*this, other); } + simdjson_inline simd8<uint8_t> saturating_add(const simd8<uint8_t> other) const { return __lsx_vsadd_bu(*this, other); } + simdjson_inline simd8<uint8_t> saturating_sub(const simd8<uint8_t> other) const { return __lsx_vssub_bu(*this, other); } // Order-specific operations - simdjson_inline simd8<uint8_t> max_val(const simd8<uint8_t> other) const { return __lasx_xvmax_bu(*this, other); } - simdjson_inline simd8<uint8_t> min_val(const simd8<uint8_t> other) const { return __lasx_xvmin_bu(other, *this); } + simdjson_inline simd8<uint8_t> max_val(const simd8<uint8_t> other) const { return __lsx_vmax_bu(*this, other); } + simdjson_inline simd8<uint8_t> min_val(const simd8<uint8_t> other) const { return __lsx_vmin_bu(other, *this); } // Same as >, but only guarantees true is nonzero (< guarantees true = -1) simdjson_inline simd8<uint8_t> gt_bits(const simd8<uint8_t> other) const { return this->saturating_sub(other); } // Same as <, but only guarantees true is nonzero (< guarantees true = -1) @@ -31166,84 +33262,97 @@ namespace simd { simdjson_inline simd8<bool> bits_not_set(simd8<uint8_t> bits) const { return (*this & bits).bits_not_set(); } simdjson_inline simd8<bool> any_bits_set() const { return ~this->bits_not_set(); } simdjson_inline simd8<bool> any_bits_set(simd8<uint8_t> bits) const { return ~this->bits_not_set(bits); } - simdjson_inline bool is_ascii() const { - __m256i mask = __lasx_xvmskltz_b(*this); - return (0 == __lasx_xvpickve2gr_w(mask, 0)) && (0 == __lasx_xvpickve2gr_w(mask, 4)); - } - simdjson_inline bool bits_not_set_anywhere() const { - __m256i v = __lasx_xvmsknz_b(*this); - return (0 == __lasx_xvpickve2gr_w(v, 0)) && (0 == __lasx_xvpickve2gr_w(v, 4)); - } + simdjson_inline bool is_ascii() const { return 0 == __lsx_vpickve2gr_w(__lsx_vmskltz_b(*this), 0); } + simdjson_inline bool bits_not_set_anywhere() const { return 0 == __lsx_vpickve2gr_hu(__lsx_vmsknz_b(*this), 0); } simdjson_inline bool any_bits_set_anywhere() const { return !bits_not_set_anywhere(); } simdjson_inline bool bits_not_set_anywhere(simd8<uint8_t> bits) const { - __m256i v = __lasx_xvmsknz_b(__lasx_xvand_v(*this, bits)); - return (0 == __lasx_xvpickve2gr_w(v, 0)) && (0 == __lasx_xvpickve2gr_w(v, 4)); + return 0 == __lsx_vpickve2gr_hu(__lsx_vmsknz_b(__lsx_vand_v(*this, bits)), 0); } simdjson_inline bool any_bits_set_anywhere(simd8<uint8_t> bits) const { return !bits_not_set_anywhere(bits); } template<int N> - simdjson_inline simd8<uint8_t> shr() const { return simd8<uint8_t>(__lasx_xvsrli_b(*this, N)); } + simdjson_inline simd8<uint8_t> shr() const { return simd8<uint8_t>(__lsx_vsrli_b(*this, N)); } template<int N> - simdjson_inline simd8<uint8_t> shl() const { return simd8<uint8_t>(__lasx_xvslli_b(*this, N)); } + simdjson_inline simd8<uint8_t> shl() const { return simd8<uint8_t>(__lsx_vslli_b(*this, N)); } }; template<typename T> struct simd8x64 { static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<T>); - static_assert(NUM_CHUNKS == 2, "LASX kernel should use two registers per 64-byte block."); + static_assert(NUM_CHUNKS == 4, "LSX kernel should use four registers per 64-byte block."); const simd8<T> chunks[NUM_CHUNKS]; + template<int idx> simd8<uint8_t> get() const { return idx < NUM_CHUNKS ? chunks[idx] : simd8<T>(); } simd8x64(const simd8x64<T>& o) = delete; // no copy allowed simd8x64<T>& operator=(const simd8<T>& other) = delete; // no assignment allowed simd8x64() = delete; // no default constructor allowed - simdjson_inline simd8x64(const simd8<T> chunk0, const simd8<T> chunk1) : chunks{chunk0, chunk1} {} - simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8<T>::load(ptr), simd8<T>::load(ptr+32)} {} + simdjson_inline simd8x64(const simd8<T> chunk0, const simd8<T> chunk1, const simd8<T> chunk2, const simd8<T> chunk3) : chunks{chunk0, chunk1, chunk2, chunk3} {} + simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8<T>::load(ptr), simd8<T>::load(ptr+16), simd8<T>::load(ptr+32), simd8<T>::load(ptr+48)} {} simdjson_inline uint64_t compress(uint64_t mask, T * output) const { - uint32_t mask1 = uint32_t(mask); - uint32_t mask2 = uint32_t(mask >> 32); - __m256i zcnt = __lasx_xvpcnt_w(__m256i(v4u64{~mask, 0, 0, 0})); - uint64_t zcnt1 = __lasx_xvpickve2gr_wu(zcnt, 0); - uint64_t zcnt2 = __lasx_xvpickve2gr_wu(zcnt, 1); + uint16_t mask1 = uint16_t(mask); + uint16_t mask2 = uint16_t(mask >> 16); + uint16_t mask3 = uint16_t(mask >> 32); + uint16_t mask4 = uint16_t(mask >> 48); + __m128i zcnt = __lsx_vpcnt_h(__m128i(v2u64{~mask, 0})); + uint64_t zcnt1 = __lsx_vpickve2gr_hu(zcnt, 0); + uint64_t zcnt2 = __lsx_vpickve2gr_hu(zcnt, 1); + uint64_t zcnt3 = __lsx_vpickve2gr_hu(zcnt, 2); + uint64_t zcnt4 = __lsx_vpickve2gr_hu(zcnt, 3); + uint8_t *voutput = reinterpret_cast<uint8_t*>(output); // There should be a critical value which processes in scaler is faster. if (zcnt1) - this->chunks[0].compress(mask1, output); + this->chunks[0].compress(mask1, reinterpret_cast<T*>(voutput)); + voutput += zcnt1; if (zcnt2) - this->chunks[1].compress(mask2, output + zcnt1); - return zcnt1 + zcnt2; + this->chunks[1].compress(mask2, reinterpret_cast<T*>(voutput)); + voutput += zcnt2; + if (zcnt3) + this->chunks[2].compress(mask3, reinterpret_cast<T*>(voutput)); + voutput += zcnt3; + if (zcnt4) + this->chunks[3].compress(mask4, reinterpret_cast<T*>(voutput)); + voutput += zcnt4; + return reinterpret_cast<uint64_t>(voutput) - reinterpret_cast<uint64_t>(output); } simdjson_inline void store(T ptr[64]) const { this->chunks[0].store(ptr+sizeof(simd8<T>)*0); this->chunks[1].store(ptr+sizeof(simd8<T>)*1); + this->chunks[2].store(ptr+sizeof(simd8<T>)*2); + this->chunks[3].store(ptr+sizeof(simd8<T>)*3); } simdjson_inline uint64_t to_bitmask() const { - __m256i mask0 = __lasx_xvmskltz_b(this->chunks[0]); - __m256i mask1 = __lasx_xvmskltz_b(this->chunks[1]); - __m256i mask_tmp = __lasx_xvpickve_w(mask0, 4); - __m256i tmp = __lasx_xvpickve_w(mask1, 4); - mask0 = __lasx_xvinsve0_w(mask0, mask1, 1); - mask_tmp = __lasx_xvinsve0_w(mask_tmp, tmp, 1); - return __lasx_xvpickve2gr_du(__lasx_xvpackev_h(mask_tmp, mask0), 0); + __m128i mask1 = __lsx_vmskltz_b(this->chunks[0]); + __m128i mask2 = __lsx_vmskltz_b(this->chunks[1]); + __m128i mask3 = __lsx_vmskltz_b(this->chunks[2]); + __m128i mask4 = __lsx_vmskltz_b(this->chunks[3]); + mask1 = __lsx_vilvl_h(mask2, mask1); + mask2 = __lsx_vilvl_h(mask4, mask3); + return __lsx_vpickve2gr_du(__lsx_vilvl_w(mask2, mask1), 0); } simdjson_inline simd8<T> reduce_or() const { - return this->chunks[0] | this->chunks[1]; + return (this->chunks[0] | this->chunks[1]) | (this->chunks[2] | this->chunks[3]); } simdjson_inline uint64_t eq(const T m) const { const simd8<T> mask = simd8<T>::splat(m); return simd8x64<bool>( this->chunks[0] == mask, - this->chunks[1] == mask + this->chunks[1] == mask, + this->chunks[2] == mask, + this->chunks[3] == mask ).to_bitmask(); } simdjson_inline uint64_t eq(const simd8x64<uint8_t> &other) const { return simd8x64<bool>( this->chunks[0] == other.chunks[0], - this->chunks[1] == other.chunks[1] + this->chunks[1] == other.chunks[1], + this->chunks[2] == other.chunks[2], + this->chunks[3] == other.chunks[3] ).to_bitmask(); } @@ -31251,31 +33360,33 @@ namespace simd { const simd8<T> mask = simd8<T>::splat(m); return simd8x64<bool>( this->chunks[0] <= mask, - this->chunks[1] <= mask + this->chunks[1] <= mask, + this->chunks[2] <= mask, + this->chunks[3] <= mask ).to_bitmask(); } }; // struct simd8x64<T> } // namespace simd } // unnamed namespace -} // namespace lasx +} // namespace lsx } // namespace simdjson -#endif // SIMDJSON_LASX_SIMD_H -/* end file simdjson/lasx/simd.h */ -/* including simdjson/lasx/stringparsing_defs.h: #include "simdjson/lasx/stringparsing_defs.h" */ -/* begin file simdjson/lasx/stringparsing_defs.h */ -#ifndef SIMDJSON_LASX_STRINGPARSING_DEFS_H -#define SIMDJSON_LASX_STRINGPARSING_DEFS_H +#endif // SIMDJSON_LSX_SIMD_H +/* end file simdjson/lsx/simd.h */ +/* including simdjson/lsx/stringparsing_defs.h: #include "simdjson/lsx/stringparsing_defs.h" */ +/* begin file simdjson/lsx/stringparsing_defs.h */ +#ifndef SIMDJSON_LSX_STRINGPARSING_DEFS_H +#define SIMDJSON_LSX_STRINGPARSING_DEFS_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/simd.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/simd.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/bitmanipulation.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace lsx { namespace { using namespace simd; @@ -31299,11 +33410,17 @@ simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uin // this can read up to 31 bytes beyond the buffer size, but we require // SIMDJSON_PADDING of padding static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "backslash and quote finder must process fewer than SIMDJSON_PADDING bytes"); - simd8<uint8_t> v(src); - v.store(dst); + simd8<uint8_t> v0(src); + simd8<uint8_t> v1(src + sizeof(v0)); + v0.store(dst); + v1.store(dst + sizeof(v0)); + + // Getting a 64-bit bitmask is much cheaper than multiple 16-bit bitmasks on LSX; therefore, we + // smash them together into a 64-byte mask and get the bitmask from there. + uint64_t bs_and_quote = simd8x64<bool>(v0 == '\\', v1 == '\\', v0 == '"', v1 == '"').to_bitmask(); return { - static_cast<uint32_t>((v == '\\').to_bitmask()), // bs_bits - static_cast<uint32_t>((v == '"').to_bitmask()), // quote_bits + uint32_t(bs_and_quote), // bs_bits + uint32_t(bs_and_quote >> 32) // quote_bits }; } @@ -31328,27 +33445,27 @@ simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *ds simd8<bool> is_backslash = (v == '\\'); simd8<bool> is_control = (v < 32); return { - (is_backslash | is_quote | is_control).to_bitmask() + static_cast<uint64_t>((is_backslash | is_quote | is_control).to_bitmask()) }; } } // unnamed namespace -} // namespace lasx +} // namespace lsx } // namespace simdjson -#endif // SIMDJSON_LASX_STRINGPARSING_DEFS_H -/* end file simdjson/lasx/stringparsing_defs.h */ +#endif // SIMDJSON_LSX_STRINGPARSING_DEFS_H +/* end file simdjson/lsx/stringparsing_defs.h */ #define SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT 1 -/* end file simdjson/lasx/begin.h */ -/* including simdjson/generic/amalgamated.h for lasx: #include "simdjson/generic/amalgamated.h" */ -/* begin file simdjson/generic/amalgamated.h for lasx */ +/* end file simdjson/lsx/begin.h */ +/* including simdjson/generic/amalgamated.h for lsx: #include "simdjson/generic/amalgamated.h" */ +/* begin file simdjson/generic/amalgamated.h for lsx */ #if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_DEPENDENCIES_H) #error simdjson/generic/dependencies.h must be included before simdjson/generic/amalgamated.h! #endif -/* including simdjson/generic/base.h for lasx: #include "simdjson/generic/base.h" */ -/* begin file simdjson/generic/base.h for lasx */ +/* including simdjson/generic/base.h for lsx: #include "simdjson/generic/base.h" */ +/* begin file simdjson/generic/base.h for lsx */ #ifndef SIMDJSON_GENERIC_BASE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -31368,10 +33485,12 @@ simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *ds /* amalgamation skipped (editor-only): #include "simdjson/arm64/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_PPC64 */ /* amalgamation skipped (editor-only): #include "simdjson/ppc64/begin.h" */ -/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LSX */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LASX */ /* amalgamation skipped (editor-only): #include "simdjson/lasx/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LSX */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_RVV_VLS */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/begin.h" */ /* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_FALLBACK */ /* amalgamation skipped (editor-only): #include "simdjson/fallback/begin.h" */ /* amalgamation skipped (editor-only): #else */ @@ -31381,7 +33500,7 @@ simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *ds /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace lsx { struct open_container; class dom_parser_implementation; @@ -31396,13 +33515,13 @@ enum class number_type { big_integer /// a big integer that does not fit in a 64-bit word }; -} // namespace lasx +} // namespace lsx } // namespace simdjson #endif // SIMDJSON_GENERIC_BASE_H -/* end file simdjson/generic/base.h for lasx */ -/* including simdjson/generic/jsoncharutils.h for lasx: #include "simdjson/generic/jsoncharutils.h" */ -/* begin file simdjson/generic/jsoncharutils.h for lasx */ +/* end file simdjson/generic/base.h for lsx */ +/* including simdjson/generic/jsoncharutils.h for lsx: #include "simdjson/generic/jsoncharutils.h" */ +/* begin file simdjson/generic/jsoncharutils.h for lsx */ #ifndef SIMDJSON_GENERIC_JSONCHARUTILS_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -31413,7 +33532,7 @@ enum class number_type { /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace lsx { namespace { namespace jsoncharutils { @@ -31503,13 +33622,13 @@ static simdjson_inline uint64_t _umul128(uint64_t ab, uint64_t cd, uint64_t *hi) } // namespace jsoncharutils } // unnamed namespace -} // namespace lasx +} // namespace lsx } // namespace simdjson #endif // SIMDJSON_GENERIC_JSONCHARUTILS_H -/* end file simdjson/generic/jsoncharutils.h for lasx */ -/* including simdjson/generic/atomparsing.h for lasx: #include "simdjson/generic/atomparsing.h" */ -/* begin file simdjson/generic/atomparsing.h for lasx */ +/* end file simdjson/generic/jsoncharutils.h for lsx */ +/* including simdjson/generic/atomparsing.h for lsx: #include "simdjson/generic/atomparsing.h" */ +/* begin file simdjson/generic/atomparsing.h for lsx */ #ifndef SIMDJSON_GENERIC_ATOMPARSING_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -31521,7 +33640,7 @@ static simdjson_inline uint64_t _umul128(uint64_t ab, uint64_t cd, uint64_t *hi) #include <cstring> namespace simdjson { -namespace lasx { +namespace lsx { namespace { /// @private namespace atomparsing { @@ -31583,13 +33702,13 @@ simdjson_inline bool is_valid_null_atom(const uint8_t *src, size_t len) { } // namespace atomparsing } // unnamed namespace -} // namespace lasx +} // namespace lsx } // namespace simdjson #endif // SIMDJSON_GENERIC_ATOMPARSING_H -/* end file simdjson/generic/atomparsing.h for lasx */ -/* including simdjson/generic/dom_parser_implementation.h for lasx: #include "simdjson/generic/dom_parser_implementation.h" */ -/* begin file simdjson/generic/dom_parser_implementation.h for lasx */ +/* end file simdjson/generic/atomparsing.h for lsx */ +/* including simdjson/generic/dom_parser_implementation.h for lsx: #include "simdjson/generic/dom_parser_implementation.h" */ +/* begin file simdjson/generic/dom_parser_implementation.h for lsx */ #ifndef SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -31599,7 +33718,7 @@ simdjson_inline bool is_valid_null_atom(const uint8_t *src, size_t len) { /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace lsx { // expectation: sizeof(open_container) = 64/8. struct open_container { @@ -31641,11 +33760,11 @@ class dom_parser_implementation final : public internal::dom_parser_implementati }; -} // namespace lasx +} // namespace lsx } // namespace simdjson namespace simdjson { -namespace lasx { +namespace lsx { inline dom_parser_implementation::dom_parser_implementation() noexcept = default; inline dom_parser_implementation::dom_parser_implementation(dom_parser_implementation &&other) noexcept = default; @@ -31675,13 +33794,13 @@ inline simdjson_warn_unused error_code dom_parser_implementation::set_max_depth( return SUCCESS; } -} // namespace lasx +} // namespace lsx } // namespace simdjson #endif // SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H -/* end file simdjson/generic/dom_parser_implementation.h for lasx */ -/* including simdjson/generic/implementation_simdjson_result_base.h for lasx: #include "simdjson/generic/implementation_simdjson_result_base.h" */ -/* begin file simdjson/generic/implementation_simdjson_result_base.h for lasx */ +/* end file simdjson/generic/dom_parser_implementation.h for lsx */ +/* including simdjson/generic/implementation_simdjson_result_base.h for lsx: #include "simdjson/generic/implementation_simdjson_result_base.h" */ +/* begin file simdjson/generic/implementation_simdjson_result_base.h for lsx */ #ifndef SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -31690,7 +33809,7 @@ inline simdjson_warn_unused error_code dom_parser_implementation::set_max_depth( /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace lsx { // This is a near copy of include/error.h's implementation_simdjson_result_base, except it doesn't use std::pair // so we can avoid inlining errors @@ -31831,13 +33950,13 @@ struct implementation_simdjson_result_base { error_code second{UNINITIALIZED}; /** Users should never directly access 'second'. **/ }; // struct implementation_simdjson_result_base -} // namespace lasx +} // namespace lsx } // namespace simdjson #endif // SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H -/* end file simdjson/generic/implementation_simdjson_result_base.h for lasx */ -/* including simdjson/generic/numberparsing.h for lasx: #include "simdjson/generic/numberparsing.h" */ -/* begin file simdjson/generic/numberparsing.h for lasx */ +/* end file simdjson/generic/implementation_simdjson_result_base.h for lsx */ +/* including simdjson/generic/numberparsing.h for lsx: #include "simdjson/generic/numberparsing.h" */ +/* begin file simdjson/generic/numberparsing.h for lsx */ #ifndef SIMDJSON_GENERIC_NUMBERPARSING_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -31852,7 +33971,7 @@ struct implementation_simdjson_result_base { #include <cstring> namespace simdjson { -namespace lasx { +namespace lsx { namespace numberparsing { #ifdef JSON_TEST_NUMBERS @@ -33167,14 +35286,14 @@ inline std::ostream& operator<<(std::ostream& out, number_type type) noexcept { return out; } -} // namespace lasx +} // namespace lsx } // namespace simdjson #endif // SIMDJSON_GENERIC_NUMBERPARSING_H -/* end file simdjson/generic/numberparsing.h for lasx */ +/* end file simdjson/generic/numberparsing.h for lsx */ -/* including simdjson/generic/implementation_simdjson_result_base-inl.h for lasx: #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */ -/* begin file simdjson/generic/implementation_simdjson_result_base-inl.h for lasx */ +/* including simdjson/generic/implementation_simdjson_result_base-inl.h for lsx: #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */ +/* begin file simdjson/generic/implementation_simdjson_result_base-inl.h for lsx */ #ifndef SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -33184,7 +35303,7 @@ inline std::ostream& operator<<(std::ostream& out, number_type type) noexcept { /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace lsx { // // internal::implementation_simdjson_result_base<T> inline implementation @@ -33290,76 +35409,40 @@ template<typename T> simdjson_inline implementation_simdjson_result_base<T>::implementation_simdjson_result_base(T &&value) noexcept : implementation_simdjson_result_base(std::forward<T>(value), SUCCESS) {} -} // namespace lasx +} // namespace lsx } // namespace simdjson #endif // SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H -/* end file simdjson/generic/implementation_simdjson_result_base-inl.h for lasx */ -/* end file simdjson/generic/amalgamated.h for lasx */ -/* including simdjson/lasx/end.h: #include "simdjson/lasx/end.h" */ -/* begin file simdjson/lasx/end.h */ +/* end file simdjson/generic/implementation_simdjson_result_base-inl.h for lsx */ +/* end file simdjson/generic/amalgamated.h for lsx */ +/* including simdjson/lsx/end.h: #include "simdjson/lsx/end.h" */ +/* begin file simdjson/lsx/end.h */ /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ #undef SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT -/* undefining SIMDJSON_IMPLEMENTATION from "lasx" */ +/* undefining SIMDJSON_IMPLEMENTATION from "lsx" */ #undef SIMDJSON_IMPLEMENTATION -/* end file simdjson/lasx/end.h */ - -#endif // SIMDJSON_LASX_H -/* end file simdjson/lasx.h */ -#else -#error Unknown SIMDJSON_BUILTIN_IMPLEMENTATION -#endif - -/* undefining SIMDJSON_CONDITIONAL_INCLUDE */ -#undef SIMDJSON_CONDITIONAL_INCLUDE - -#endif // SIMDJSON_BUILTIN_H -/* end file simdjson/builtin.h */ -/* skipped duplicate #include "simdjson/builtin/base.h" */ - -/* including simdjson/generic/ondemand/dependencies.h: #include "simdjson/generic/ondemand/dependencies.h" */ -/* begin file simdjson/generic/ondemand/dependencies.h */ -#ifdef SIMDJSON_CONDITIONAL_INCLUDE -#error simdjson/generic/ondemand/dependencies.h must be included before defining SIMDJSON_CONDITIONAL_INCLUDE! -#endif - -#ifndef SIMDJSON_GENERIC_ONDEMAND_DEPENDENCIES_H -#define SIMDJSON_GENERIC_ONDEMAND_DEPENDENCIES_H - -// Internal headers needed for ondemand generics. -// All includes not under simdjson/generic/ondemand must be here! -// Otherwise, amalgamation will fail. -/* skipped duplicate #include "simdjson/concepts.h" */ -/* skipped duplicate #include "simdjson/dom/base.h" // for MINIMAL_DOCUMENT_CAPACITY */ -/* skipped duplicate #include "simdjson/implementation.h" */ -/* skipped duplicate #include "simdjson/padded_string.h" */ -/* skipped duplicate #include "simdjson/padded_string_view.h" */ -/* skipped duplicate #include "simdjson/internal/dom_parser_implementation.h" */ -/* skipped duplicate #include "simdjson/jsonpathutil.h" */ - -#endif // SIMDJSON_GENERIC_ONDEMAND_DEPENDENCIES_H -/* end file simdjson/generic/ondemand/dependencies.h */ - -/* defining SIMDJSON_CONDITIONAL_INCLUDE */ -#define SIMDJSON_CONDITIONAL_INCLUDE - -#if SIMDJSON_BUILTIN_IMPLEMENTATION_IS(arm64) -/* including simdjson/arm64/ondemand.h: #include "simdjson/arm64/ondemand.h" */ -/* begin file simdjson/arm64/ondemand.h */ -#ifndef SIMDJSON_ARM64_ONDEMAND_H -#define SIMDJSON_ARM64_ONDEMAND_H +/* end file simdjson/lsx/end.h */ -/* including simdjson/arm64/begin.h: #include "simdjson/arm64/begin.h" */ -/* begin file simdjson/arm64/begin.h */ -/* defining SIMDJSON_IMPLEMENTATION to "arm64" */ -#define SIMDJSON_IMPLEMENTATION arm64 -/* including simdjson/arm64/base.h: #include "simdjson/arm64/base.h" */ -/* begin file simdjson/arm64/base.h */ -#ifndef SIMDJSON_ARM64_BASE_H -#define SIMDJSON_ARM64_BASE_H +#endif // SIMDJSON_LSX_H +/* end file simdjson/lsx.h */ +#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(rvv_vls) +/* including simdjson/rvv-vls.h: #include "simdjson/rvv-vls.h" */ +/* begin file simdjson/rvv-vls.h */ +#ifndef SIMDJSON_RVV_VLS_H +#define SIMDJSON_RVV_VLS_H + + +/* including simdjson/rvv-vls/begin.h: #include "simdjson/rvv-vls/begin.h" */ +/* begin file simdjson/rvv-vls/begin.h */ +/* defining SIMDJSON_IMPLEMENTATION to "rvv_vls" */ +#define SIMDJSON_IMPLEMENTATION rvv_vls +/* including simdjson/rvv-vls/base.h: #include "simdjson/rvv-vls/base.h" */ +/* begin file simdjson/rvv-vls/base.h */ +#ifndef SIMDJSON_RVV_VLS_BASE_H +#define SIMDJSON_RVV_VLS_BASE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ /* amalgamation skipped (editor-only): #include "simdjson/base.h" */ @@ -33367,53 +35450,63 @@ simdjson_inline implementation_simdjson_result_base<T>::implementation_simdjson_ namespace simdjson { /** - * Implementation for NEON (ARMv8). + * RVV-VLS implementation. */ -namespace arm64 { +namespace rvv_vls { class implementation; -namespace { -namespace simd { -template <typename T> struct simd8; -template <typename T> struct simd8x64; -} // namespace simd -} // unnamed namespace - -} // namespace arm64 +} // namespace rvv_vls } // namespace simdjson -#endif // SIMDJSON_ARM64_BASE_H -/* end file simdjson/arm64/base.h */ -/* including simdjson/arm64/intrinsics.h: #include "simdjson/arm64/intrinsics.h" */ -/* begin file simdjson/arm64/intrinsics.h */ -#ifndef SIMDJSON_ARM64_INTRINSICS_H -#define SIMDJSON_ARM64_INTRINSICS_H +#endif // SIMDJSON_RVV_VLS_BASE_H +/* end file simdjson/rvv-vls/base.h */ +/* including simdjson/rvv-vls/intrinsics.h: #include "simdjson/rvv-vls/intrinsics.h" */ +/* begin file simdjson/rvv-vls/intrinsics.h */ +#ifndef SIMDJSON_RVV_VLS_INTRINSICS_H +#define SIMDJSON_RVV_VLS_INTRINSICS_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -// This should be the correct header whether -// you use visual studio or other compilers. -#include <arm_neon.h> - -static_assert(sizeof(uint8x16_t) <= simdjson::SIMDJSON_PADDING, "insufficient padding for arm64"); - -#endif // SIMDJSON_ARM64_INTRINSICS_H -/* end file simdjson/arm64/intrinsics.h */ -/* including simdjson/arm64/bitmanipulation.h: #include "simdjson/arm64/bitmanipulation.h" */ -/* begin file simdjson/arm64/bitmanipulation.h */ -#ifndef SIMDJSON_ARM64_BITMANIPULATION_H -#define SIMDJSON_ARM64_BITMANIPULATION_H +#include <riscv_vector.h> + +#define simdutf_vrgather_u8m1x2(tbl, idx) \ + __riscv_vcreate_v_u8m1_u8m2( \ + __riscv_vrgather_vv_u8m1(tbl, __riscv_vget_v_u8m2_u8m1(idx, 0), \ + __riscv_vsetvlmax_e8m1()), \ + __riscv_vrgather_vv_u8m1(tbl, __riscv_vget_v_u8m2_u8m1(idx, 1), \ + __riscv_vsetvlmax_e8m1())) + +#define simdutf_vrgather_u8m1x4(tbl, idx) \ + __riscv_vcreate_v_u8m1_u8m4( \ + __riscv_vrgather_vv_u8m1(tbl, __riscv_vget_v_u8m4_u8m1(idx, 0), \ + __riscv_vsetvlmax_e8m1()), \ + __riscv_vrgather_vv_u8m1(tbl, __riscv_vget_v_u8m4_u8m1(idx, 1), \ + __riscv_vsetvlmax_e8m1()), \ + __riscv_vrgather_vv_u8m1(tbl, __riscv_vget_v_u8m4_u8m1(idx, 2), \ + __riscv_vsetvlmax_e8m1()), \ + __riscv_vrgather_vv_u8m1(tbl, __riscv_vget_v_u8m4_u8m1(idx, 3), \ + __riscv_vsetvlmax_e8m1())) + +#if __riscv_zbc +#include <riscv_bitmanip.h> +#endif + +#endif // SIMDJSON_RVV_VLS_INTRINSICS_H +/* end file simdjson/rvv-vls/intrinsics.h */ +/* including simdjson/rvv-vls/bitmanipulation.h: #include "simdjson/rvv-vls/bitmanipulation.h" */ +/* begin file simdjson/rvv-vls/bitmanipulation.h */ +#ifndef SIMDJSON_RVV_VLS_BITMANIPULATION_H +#define SIMDJSON_RVV_VLS_BITMANIPULATION_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/arm64/intrinsics.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace arm64 { +namespace rvv_vls { namespace { // We sometimes call trailing_zero on inputs that are zero, @@ -33425,15 +35518,7 @@ SIMDJSON_NO_SANITIZE_UNDEFINED // See issue https://github.com/simdjson/simdjson/issues/1965 SIMDJSON_NO_SANITIZE_MEMORY simdjson_inline int trailing_zeroes(uint64_t input_num) { -#if SIMDJSON_REGULAR_VISUAL_STUDIO - unsigned long ret; - // Search the mask data from least significant bit (LSB) - // to the most significant bit (MSB) for a set bit (1). - _BitScanForward64(&ret, input_num); - return (int)ret; -#else // SIMDJSON_REGULAR_VISUAL_STUDIO return __builtin_ctzll(input_num); -#endif // SIMDJSON_REGULAR_VISUAL_STUDIO } /* result might be undefined when input_num is zero */ @@ -33441,93 +35526,39 @@ simdjson_inline uint64_t clear_lowest_bit(uint64_t input_num) { return input_num & (input_num-1); } -// We sometimes call leading_zeroes on inputs that are zero, -// but the algorithms do not end up using the returned value. -// Sadly, sanitizers are not smart enough to figure it out. -// Applies only when SIMDJSON_PREFER_REVERSE_BITS is defined and true. -// (See below.) -SIMDJSON_NO_SANITIZE_UNDEFINED /* result might be undefined when input_num is zero */ simdjson_inline int leading_zeroes(uint64_t input_num) { -#if SIMDJSON_REGULAR_VISUAL_STUDIO - unsigned long leading_zero = 0; - // Search the mask data from most significant bit (MSB) - // to least significant bit (LSB) for a set bit (1). - if (_BitScanReverse64(&leading_zero, input_num)) - return (int)(63 - leading_zero); - else - return 64; -#else return __builtin_clzll(input_num); -#endif// SIMDJSON_REGULAR_VISUAL_STUDIO -} - -/* result might be undefined when input_num is zero */ -simdjson_inline int count_ones(uint64_t input_num) { - return vaddv_u8(vcnt_u8(vcreate_u8(input_num))); -} - - -#if defined(__GNUC__) // catches clang and gcc -/** - * ARM has a fast 64-bit "bit reversal function" that is handy. However, - * it is not generally available as an intrinsic function under Visual - * Studio (though this might be changing). Even under clang/gcc, we - * apparently need to invoke inline assembly. - */ -/* - * We use SIMDJSON_PREFER_REVERSE_BITS as a hint that algorithms that - * work well with bit reversal may use it. - */ -#define SIMDJSON_PREFER_REVERSE_BITS 1 - -/* reverse the bits */ -simdjson_inline uint64_t reverse_bits(uint64_t input_num) { - uint64_t rev_bits; - __asm("rbit %0, %1" : "=r"(rev_bits) : "r"(input_num)); - return rev_bits; } -/** - * Flips bit at index 63 - lz. Thus if you have 'leading_zeroes' leading zeroes, - * then this will set to zero the leading bit. It is possible for leading_zeroes to be - * greating or equal to 63 in which case we trigger undefined behavior, but the output - * of such undefined behavior is never used. - **/ -SIMDJSON_NO_SANITIZE_UNDEFINED -simdjson_inline uint64_t zero_leading_bit(uint64_t rev_bits, int leading_zeroes) { - return rev_bits ^ (uint64_t(0x8000000000000000) >> leading_zeroes); +simdjson_inline long long int count_ones(uint64_t input_num) { + return __builtin_popcountll(input_num); } -#endif - -simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2, uint64_t *result) { -#if SIMDJSON_REGULAR_VISUAL_STUDIO - *result = value1 + value2; - return *result < value1; -#else +simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2, + uint64_t *result) { return __builtin_uaddll_overflow(value1, value2, reinterpret_cast<unsigned long long *>(result)); -#endif } } // unnamed namespace -} // namespace arm64 +} // namespace rvv_vls } // namespace simdjson -#endif // SIMDJSON_ARM64_BITMANIPULATION_H -/* end file simdjson/arm64/bitmanipulation.h */ -/* including simdjson/arm64/bitmask.h: #include "simdjson/arm64/bitmask.h" */ -/* begin file simdjson/arm64/bitmask.h */ -#ifndef SIMDJSON_ARM64_BITMASK_H -#define SIMDJSON_ARM64_BITMASK_H +#endif // SIMDJSON_RVV_VLS_BITMANIPULATION_H +/* end file simdjson/rvv-vls/bitmanipulation.h */ +/* including simdjson/rvv-vls/bitmask.h: #include "simdjson/rvv-vls/bitmask.h" */ +/* begin file simdjson/rvv-vls/bitmask.h */ +#ifndef SIMDJSON_RVV_VLS_BITMASK_H +#define SIMDJSON_RVV_VLS_BITMASK_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/intrinsics.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace arm64 { +namespace rvv_vls { namespace { // @@ -33536,278 +35567,138 @@ namespace { // For example, prefix_xor(00100100) == 00011100 // simdjson_inline uint64_t prefix_xor(uint64_t bitmask) { - ///////////// - // We could do this with PMULL, but it is apparently slow. - // - //#ifdef __ARM_FEATURE_CRYPTO // some ARM processors lack this extension - //return vmull_p64(-1ULL, bitmask); - //#else - // Analysis by @sebpop: - // When diffing the assembly for src/stage1_find_marks.cpp I see that the eors are all spread out - // in between other vector code, so effectively the extra cycles of the sequence do not matter - // because the GPR units are idle otherwise and the critical path is on the FP side. - // Also the PMULL requires two extra fmovs: GPR->FP (3 cycles in N1, 5 cycles in A72 ) - // and FP->GPR (2 cycles on N1 and 5 cycles on A72.) - /////////// +#if __riscv_zbc + return __riscv_clmul_64(bitmask, ~(uint64_t)0); +#elif __riscv_zvbc + return __riscv_vmv_x(__riscv_vclmul(__riscv_vmv_s_x_u64m1(bitmask, 1), ~(uint64_t)0, 1)); +#else bitmask ^= bitmask << 1; bitmask ^= bitmask << 2; bitmask ^= bitmask << 4; bitmask ^= bitmask << 8; bitmask ^= bitmask << 16; bitmask ^= bitmask << 32; +#endif return bitmask; } } // unnamed namespace -} // namespace arm64 -} // namespace simdjson - -#endif -/* end file simdjson/arm64/bitmask.h */ -/* including simdjson/arm64/numberparsing_defs.h: #include "simdjson/arm64/numberparsing_defs.h" */ -/* begin file simdjson/arm64/numberparsing_defs.h */ -#ifndef SIMDJSON_ARM64_NUMBERPARSING_DEFS_H -#define SIMDJSON_ARM64_NUMBERPARSING_DEFS_H - -/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/arm64/intrinsics.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */ -/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ - -#include <cstring> - -#if SIMDJSON_REGULAR_VISUAL_STUDIO && SIMDJSON_IS_ARM64 -// __umulh requires intrin.h -#include <intrin.h> -#endif // SIMDJSON_REGULAR_VISUAL_STUDIO && SIMDJSON_IS_ARM64 - -namespace simdjson { -namespace arm64 { -namespace numberparsing { - -// we don't have SSE, so let us use a scalar function -// credit: https://johnnylee-sde.github.io/Fast-numeric-string-to-int/ -/** @private */ -static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) { - uint64_t val; - std::memcpy(&val, chars, sizeof(uint64_t)); - val = (val & 0x0F0F0F0F0F0F0F0F) * 2561 >> 8; - val = (val & 0x00FF00FF00FF00FF) * 6553601 >> 16; - return uint32_t((val & 0x0000FFFF0000FFFF) * 42949672960001 >> 32); -} - -simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) { - internal::value128 answer; -#if SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS -#if SIMDJSON_IS_ARM64 - // ARM64 has native support for 64-bit multiplications, no need to emultate - answer.high = __umulh(value1, value2); - answer.low = value1 * value2; -#else - answer.low = _umul128(value1, value2, &answer.high); // _umul128 not available on ARM64 -#endif // SIMDJSON_IS_ARM64 -#else // SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS - __uint128_t r = (static_cast<__uint128_t>(value1)) * value2; - answer.low = uint64_t(r); - answer.high = uint64_t(r >> 64); -#endif - return answer; -} - -} // namespace numberparsing -} // namespace arm64 +} // namespace rvv_vls } // namespace simdjson -#ifndef SIMDJSON_SWAR_NUMBER_PARSING -#if SIMDJSON_IS_BIG_ENDIAN -#define SIMDJSON_SWAR_NUMBER_PARSING 0 -#else -#define SIMDJSON_SWAR_NUMBER_PARSING 1 -#endif -#endif +#endif // SIMDJSON_RVV_VLS_BITMASK_H -#endif // SIMDJSON_ARM64_NUMBERPARSING_DEFS_H -/* end file simdjson/arm64/numberparsing_defs.h */ -/* including simdjson/arm64/simd.h: #include "simdjson/arm64/simd.h" */ -/* begin file simdjson/arm64/simd.h */ -#ifndef SIMDJSON_ARM64_SIMD_H -#define SIMDJSON_ARM64_SIMD_H +/* end file simdjson/rvv-vls/bitmask.h */ +/* including simdjson/rvv-vls/simd.h: #include "simdjson/rvv-vls/simd.h" */ +/* begin file simdjson/rvv-vls/simd.h */ +#ifndef SIMDJSON_RVV_VLS_SIMD_H +#define SIMDJSON_RVV_VLS_SIMD_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/arm64/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/bitmanipulation.h" */ /* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace arm64 { +namespace rvv_vls { namespace { namespace simd { -#if SIMDJSON_REGULAR_VISUAL_STUDIO -namespace { -// Start of private section with Visual Studio workaround - - -#ifndef simdjson_make_uint8x16_t -#define simdjson_make_uint8x16_t(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, \ - x13, x14, x15, x16) \ - ([=]() { \ - uint8_t array[16] = {x1, x2, x3, x4, x5, x6, x7, x8, \ - x9, x10, x11, x12, x13, x14, x15, x16}; \ - return vld1q_u8(array); \ - }()) -#endif -#ifndef simdjson_make_int8x16_t -#define simdjson_make_int8x16_t(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, \ - x13, x14, x15, x16) \ - ([=]() { \ - int8_t array[16] = {x1, x2, x3, x4, x5, x6, x7, x8, \ - x9, x10, x11, x12, x13, x14, x15, x16}; \ - return vld1q_s8(array); \ - }()) +#if __riscv_v_fixed_vlen >= 512 + static constexpr size_t VL8 = 512/8; + using vint8_t = vint8m1_t __attribute__((riscv_rvv_vector_bits(512))); + using vuint8_t = vuint8m1_t __attribute__((riscv_rvv_vector_bits(512))); + using vbool_t = vbool8_t __attribute__((riscv_rvv_vector_bits(512/8))); + using vbitmask_t = uint64_t; +#else + static constexpr size_t VL8 = __riscv_v_fixed_vlen/8; + using vint8_t = vint8m1_t __attribute__((riscv_rvv_vector_bits(__riscv_v_fixed_vlen))); + using vuint8_t = vuint8m1_t __attribute__((riscv_rvv_vector_bits(__riscv_v_fixed_vlen))); + using vbool_t = vbool8_t __attribute__((riscv_rvv_vector_bits(__riscv_v_fixed_vlen/8))); + #if __riscv_v_fixed_vlen == 128 + using vbitmask_t = uint16_t; + #elif __riscv_v_fixed_vlen == 256 + using vbitmask_t = uint32_t; + #endif #endif -#ifndef simdjson_make_uint8x8_t -#define simdjson_make_uint8x8_t(x1, x2, x3, x4, x5, x6, x7, x8) \ - ([=]() { \ - uint8_t array[8] = {x1, x2, x3, x4, x5, x6, x7, x8}; \ - return vld1_u8(array); \ - }()) -#endif -#ifndef simdjson_make_int8x8_t -#define simdjson_make_int8x8_t(x1, x2, x3, x4, x5, x6, x7, x8) \ - ([=]() { \ - int8_t array[8] = {x1, x2, x3, x4, x5, x6, x7, x8}; \ - return vld1_s8(array); \ - }()) -#endif -#ifndef simdjson_make_uint16x8_t -#define simdjson_make_uint16x8_t(x1, x2, x3, x4, x5, x6, x7, x8) \ - ([=]() { \ - uint16_t array[8] = {x1, x2, x3, x4, x5, x6, x7, x8}; \ - return vld1q_u16(array); \ - }()) -#endif -#ifndef simdjson_make_int16x8_t -#define simdjson_make_int16x8_t(x1, x2, x3, x4, x5, x6, x7, x8) \ - ([=]() { \ - int16_t array[8] = {x1, x2, x3, x4, x5, x6, x7, x8}; \ - return vld1q_s16(array); \ - }()) +#if __riscv_v_fixed_vlen == 128 + using vuint8x64_t = vuint8m4_t __attribute__((riscv_rvv_vector_bits(512))); + using vboolx64_t = vbool2_t __attribute__((riscv_rvv_vector_bits(512/8))); +#elif __riscv_v_fixed_vlen == 256 + using vuint8x64_t = vuint8m2_t __attribute__((riscv_rvv_vector_bits(512))); + using vboolx64_t = vbool4_t __attribute__((riscv_rvv_vector_bits(512/8))); +#else + using vuint8x64_t = vuint8m1_t __attribute__((riscv_rvv_vector_bits(512))); + using vboolx64_t = vbool8_t __attribute__((riscv_rvv_vector_bits(512/8))); #endif -// End of private section with Visual Studio workaround -} // namespace -#endif // SIMDJSON_REGULAR_VISUAL_STUDIO - - template<typename T> struct simd8; - // - // Base class of simd8<uint8_t> and simd8<bool>, both of which use uint8x16_t internally. - // - template<typename T, typename Mask=simd8<bool>> - struct base_u8 { - uint8x16_t value; - static const int SIZE = sizeof(value); - - // Conversion from/to SIMD register - simdjson_inline base_u8(const uint8x16_t _value) : value(_value) {} - simdjson_inline operator const uint8x16_t&() const { return this->value; } - simdjson_inline operator uint8x16_t&() { return this->value; } - - // Bit operations - simdjson_inline simd8<T> operator|(const simd8<T> other) const { return vorrq_u8(*this, other); } - simdjson_inline simd8<T> operator&(const simd8<T> other) const { return vandq_u8(*this, other); } - simdjson_inline simd8<T> operator^(const simd8<T> other) const { return veorq_u8(*this, other); } - simdjson_inline simd8<T> bit_andnot(const simd8<T> other) const { return vbicq_u8(*this, other); } - simdjson_inline simd8<T> operator~() const { return *this ^ 0xFFu; } - simdjson_inline simd8<T>& operator|=(const simd8<T> other) { auto this_cast = static_cast<simd8<T>*>(this); *this_cast = *this_cast | other; return *this_cast; } - simdjson_inline simd8<T>& operator&=(const simd8<T> other) { auto this_cast = static_cast<simd8<T>*>(this); *this_cast = *this_cast & other; return *this_cast; } - simdjson_inline simd8<T>& operator^=(const simd8<T> other) { auto this_cast = static_cast<simd8<T>*>(this); *this_cast = *this_cast ^ other; return *this_cast; } - - friend simdjson_inline Mask operator==(const simd8<T> lhs, const simd8<T> rhs) { return vceqq_u8(lhs, rhs); } - - template<int N=1> - simdjson_inline simd8<T> prev(const simd8<T> prev_chunk) const { - return vextq_u8(prev_chunk, *this, 16 - N); - } - }; - // SIMD byte mask type (returned by things like eq and gt) template<> - struct simd8<bool>: base_u8<bool> { - typedef uint16_t bitmask_t; - typedef uint32_t bitmask2_t; - - static simdjson_inline simd8<bool> splat(bool _value) { return vmovq_n_u8(uint8_t(-(!!_value))); } + struct simd8<bool> { + vbool_t value; + using bitmask_t = vbitmask_t; + static constexpr int SIZE = sizeof(value); - simdjson_inline simd8(const uint8x16_t _value) : base_u8<bool>(_value) {} - // False constructor - simdjson_inline simd8() : simd8(vdupq_n_u8(0)) {} - // Splat constructor + simdjson_inline simd8(const vbool_t _value) : value(_value) {} + simdjson_inline simd8() : simd8(__riscv_vmclr_m_b8(VL8)) {} simdjson_inline simd8(bool _value) : simd8(splat(_value)) {} - // We return uint32_t instead of uint16_t because that seems to be more efficient for most - // purposes (cutting it down to uint16_t costs performance in some compilers). - simdjson_inline uint32_t to_bitmask() const { -#if SIMDJSON_REGULAR_VISUAL_STUDIO - const uint8x16_t bit_mask = simdjson_make_uint8x16_t(0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, - 0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80); + simdjson_inline operator const vbool_t&() const { return value; } + simdjson_inline operator vbool_t&() { return value; } + + static simdjson_inline simd8<bool> splat(bool _value) { + return __riscv_vreinterpret_b8(__riscv_vmv_v_x_u64m1(((uint64_t)!_value)-1, 1)); + } + + simdjson_inline vbitmask_t to_bitmask() const { +#if __riscv_v_fixed_vlen == 128 + return __riscv_vmv_x(__riscv_vreinterpret_u16m1(value)); +#elif __riscv_v_fixed_vlen == 256 + return __riscv_vmv_x(__riscv_vreinterpret_u32m1(value)); #else - const uint8x16_t bit_mask = {0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, - 0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80}; + return __riscv_vmv_x(__riscv_vreinterpret_u64m1(value)); #endif - auto minput = *this & bit_mask; - uint8x16_t tmp = vpaddq_u8(minput, minput); - tmp = vpaddq_u8(tmp, tmp); - tmp = vpaddq_u8(tmp, tmp); - return vgetq_lane_u16(vreinterpretq_u16_u8(tmp), 0); - } - // Returns 4-bit out of each byte, alternating between the high 4 bits and low - // bits result it is 64 bit. - simdjson_inline uint64_t to_bitmask64() const { - return vget_lane_u64( - vreinterpret_u64_u8(vshrn_n_u16(vreinterpretq_u16_u8(*this), 4)), 0); } - simdjson_inline bool any() const { return vmaxvq_u32(vreinterpretq_u32_u8(*this)) != 0; } + + // Bit operations + simdjson_inline simd8<bool> operator|(const simd8<bool> other) const { return __riscv_vmor(*this, other, VL8); } + simdjson_inline simd8<bool> operator&(const simd8<bool> other) const { return __riscv_vmand(*this, other, VL8); } + simdjson_inline simd8<bool> operator^(const simd8<bool> other) const { return __riscv_vmxor(*this, other, VL8); } + simdjson_inline simd8<bool> bit_andnot(const simd8<bool> other) const { return __riscv_vmandn(other, *this, VL8); } + simdjson_inline simd8<bool> operator~() const { return __riscv_vmnot(*this, VL8); } + simdjson_inline simd8<bool>& operator|=(const simd8<bool> other) { auto this_cast = static_cast<simd8<bool>*>(this); *this_cast = *this_cast | other; return *this_cast; } + simdjson_inline simd8<bool>& operator&=(const simd8<bool> other) { auto this_cast = static_cast<simd8<bool>*>(this); *this_cast = *this_cast & other; return *this_cast; } + simdjson_inline simd8<bool>& operator^=(const simd8<bool> other) { auto this_cast = static_cast<simd8<bool>*>(this); *this_cast = *this_cast ^ other; return *this_cast; } }; // Unsigned bytes template<> - struct simd8<uint8_t>: base_u8<uint8_t> { - static simdjson_inline uint8x16_t splat(uint8_t _value) { return vmovq_n_u8(_value); } - static simdjson_inline uint8x16_t zero() { return vdupq_n_u8(0); } - static simdjson_inline uint8x16_t load(const uint8_t* values) { return vld1q_u8(values); } + struct simd8<uint8_t> { - simdjson_inline simd8(const uint8x16_t _value) : base_u8<uint8_t>(_value) {} - // Zero constructor + vuint8_t value; + static constexpr int SIZE = sizeof(value); + + simdjson_inline simd8(const vuint8_t _value) : value(_value) {} simdjson_inline simd8() : simd8(zero()) {} - // Array constructor - simdjson_inline simd8(const uint8_t values[16]) : simd8(load(values)) {} - // Splat constructor + simdjson_inline simd8(const uint8_t values[VL8]) : simd8(load(values)) {} simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {} - // Member-by-member initialization -#if SIMDJSON_REGULAR_VISUAL_STUDIO - simdjson_inline simd8( - uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, - uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 - ) : simd8(simdjson_make_uint8x16_t( - v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15 - )) {} -#else + simdjson_inline simd8(simd8<bool> mask) : value(__riscv_vmerge_vxm_u8m1(zero(), -1, (vbool_t)mask, VL8)) {} + + simdjson_inline operator const vuint8_t&() const { return this->value; } + simdjson_inline operator vuint8_t&() { return this->value; } + simdjson_inline simd8( uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 - ) : simd8(uint8x16_t{ + ) : simd8(vuint8_t{ v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,v11,v12,v13,v14,v15 }) {} -#endif // Repeat 16 values as many times as necessary (usually for lookup tables) simdjson_inline static simd8<uint8_t> repeat_16( @@ -33820,115 +35711,85 @@ namespace { ); } + static simdjson_inline vuint8_t splat(uint8_t _value) { return __riscv_vmv_v_x_u8m1(_value, VL8); } + static simdjson_inline vuint8_t zero() { return splat(0); } + static simdjson_inline vuint8_t load(const uint8_t values[VL8]) { return __riscv_vle8_v_u8m1(values, VL8); } + + // Bit operations + simdjson_inline simd8<uint8_t> operator|(const simd8<uint8_t> other) const { return __riscv_vor_vv_u8m1( value, other, VL8); } + simdjson_inline simd8<uint8_t> operator&(const simd8<uint8_t> other) const { return __riscv_vand_vv_u8m1( value, other, VL8); } + simdjson_inline simd8<uint8_t> operator^(const simd8<uint8_t> other) const { return __riscv_vxor_vv_u8m1( value, other, VL8); } + simdjson_inline simd8<uint8_t> operator~() const { return __riscv_vnot_v_u8m1(value, VL8); } +#if __riscv_zvbb + simdjson_inline simd8<uint8_t> bit_andnot(const simd8<uint8_t> other) const { return __riscv_vandn_vv_u8m1(other, value, VL8); } +#else + simdjson_inline simd8<uint8_t> bit_andnot(const simd8<uint8_t> other) const { return other & ~*this; } +#endif + simdjson_inline simd8<uint8_t>& operator|=(const simd8<uint8_t> other) { value = *this | other; return *this; } + simdjson_inline simd8<uint8_t>& operator&=(const simd8<uint8_t> other) { value = *this & other; return *this; } + simdjson_inline simd8<uint8_t>& operator^=(const simd8<uint8_t> other) { value = *this ^ other; return *this; } + + simdjson_inline simd8<bool> operator==(const simd8<uint8_t> other) const { return __riscv_vmseq(value, other, VL8); } + simdjson_inline simd8<bool> operator==(uint8_t other) const { return __riscv_vmseq(value, other, VL8); } + + template<int N=1> + simdjson_inline simd8<uint8_t> prev(const simd8<uint8_t> prev_chunk) const { + return __riscv_vslideup(__riscv_vslidedown(prev_chunk, VL8-N, VL8), value, N, VL8); + } + // Store to array - simdjson_inline void store(uint8_t dst[16]) const { return vst1q_u8(dst, *this); } + simdjson_inline void store(uint8_t dst[VL8]) const { return __riscv_vse8(dst, value, VL8); } // Saturated math - simdjson_inline simd8<uint8_t> saturating_add(const simd8<uint8_t> other) const { return vqaddq_u8(*this, other); } - simdjson_inline simd8<uint8_t> saturating_sub(const simd8<uint8_t> other) const { return vqsubq_u8(*this, other); } + simdjson_inline simd8<uint8_t> saturating_add(const simd8<uint8_t> other) const { return __riscv_vsaddu(value, other, VL8); } + simdjson_inline simd8<uint8_t> saturating_sub(const simd8<uint8_t> other) const { return __riscv_vssubu(value, other, VL8); } // Addition/subtraction are the same for signed and unsigned - simdjson_inline simd8<uint8_t> operator+(const simd8<uint8_t> other) const { return vaddq_u8(*this, other); } - simdjson_inline simd8<uint8_t> operator-(const simd8<uint8_t> other) const { return vsubq_u8(*this, other); } - simdjson_inline simd8<uint8_t>& operator+=(const simd8<uint8_t> other) { *this = *this + other; return *this; } - simdjson_inline simd8<uint8_t>& operator-=(const simd8<uint8_t> other) { *this = *this - other; return *this; } + simdjson_inline simd8<uint8_t> operator+(const simd8<uint8_t> other) const { return __riscv_vadd(value, other, VL8); } + simdjson_inline simd8<uint8_t> operator-(const simd8<uint8_t> other) const { return __riscv_vsub(value, other, VL8); } + simdjson_inline simd8<uint8_t>& operator+=(const simd8<uint8_t> other) { value = *this + other; return *this; } + simdjson_inline simd8<uint8_t>& operator-=(const simd8<uint8_t> other) { value = *this - other; return *this; } // Order-specific operations - simdjson_inline uint8_t max_val() const { return vmaxvq_u8(*this); } - simdjson_inline uint8_t min_val() const { return vminvq_u8(*this); } - simdjson_inline simd8<uint8_t> max_val(const simd8<uint8_t> other) const { return vmaxq_u8(*this, other); } - simdjson_inline simd8<uint8_t> min_val(const simd8<uint8_t> other) const { return vminq_u8(*this, other); } - simdjson_inline simd8<bool> operator<=(const simd8<uint8_t> other) const { return vcleq_u8(*this, other); } - simdjson_inline simd8<bool> operator>=(const simd8<uint8_t> other) const { return vcgeq_u8(*this, other); } - simdjson_inline simd8<bool> operator<(const simd8<uint8_t> other) const { return vcltq_u8(*this, other); } - simdjson_inline simd8<bool> operator>(const simd8<uint8_t> other) const { return vcgtq_u8(*this, other); } - // Same as >, but instead of guaranteeing all 1's == true, false = 0 and true = nonzero. For ARM, returns all 1's. + simdjson_inline simd8<bool> operator<=(const simd8<uint8_t> other) const { return __riscv_vmsleu(value, other, VL8); } + simdjson_inline simd8<bool> operator>=(const simd8<uint8_t> other) const { return __riscv_vmsgeu(value, other, VL8); } + simdjson_inline simd8<bool> operator<(const simd8<uint8_t> other) const { return __riscv_vmsltu(value, other, VL8); } + simdjson_inline simd8<bool> operator>(const simd8<uint8_t> other) const { return __riscv_vmsgtu(value, other, VL8); } + + // Same as >, but instead of guaranteeing all 1's == true, false = 0 and true = nonzero. simdjson_inline simd8<uint8_t> gt_bits(const simd8<uint8_t> other) const { return simd8<uint8_t>(*this > other); } - // Same as <, but instead of guaranteeing all 1's == true, false = 0 and true = nonzero. For ARM, returns all 1's. + // Same as <, but instead of guaranteeing all 1's == true, false = 0 and true = nonzero. simdjson_inline simd8<uint8_t> lt_bits(const simd8<uint8_t> other) const { return simd8<uint8_t>(*this < other); } // Bit-specific operations - simdjson_inline simd8<bool> any_bits_set(simd8<uint8_t> bits) const { return vtstq_u8(*this, bits); } - simdjson_inline bool any_bits_set_anywhere() const { return vmaxvq_u32(vreinterpretq_u32_u8(*this)) != 0; } + simdjson_inline bool any_bits_set_anywhere() const { + return __riscv_vfirst(__riscv_vmsne(value, 0, VL8), VL8) >= 0; + } simdjson_inline bool any_bits_set_anywhere(simd8<uint8_t> bits) const { return (*this & bits).any_bits_set_anywhere(); } template<int N> - simdjson_inline simd8<uint8_t> shr() const { return vshrq_n_u8(*this, N); } + simdjson_inline simd8<uint8_t> shr() const { return __riscv_vsrl(value, N, VL8); } template<int N> - simdjson_inline simd8<uint8_t> shl() const { return vshlq_n_u8(*this, N); } + simdjson_inline simd8<uint8_t> shl() const { return __riscv_vsll(value, N, VL8); } + // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values) template<typename L> simdjson_inline simd8<L> lookup_16(simd8<L> lookup_table) const { - return lookup_table.apply_lookup_16_to(*this); - } - - // Returns 4-bit out of each byte, alternating between the high 4 bits and low - // bits result it is 64 bit. - simdjson_inline uint64_t to_bitmask64() const { - return vget_lane_u64( - vreinterpret_u64_u8(vshrn_n_u16(vreinterpretq_u16_u8(*this), 4)), 0); - } - // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted as a bitset). - // Passing a 0 value for mask would be equivalent to writing out every byte to output. - // Only the first 16 - count_ones(mask) bytes of the result are significant but 16 bytes - // get written. - // Design consideration: it seems like a function with the - // signature simd8<L> compress(uint16_t mask) would be - // sensible, but the AVX ISA makes this kind of approach difficult. - template<typename L> - simdjson_inline void compress(uint16_t mask, L * output) const { - using internal::thintable_epi8; - using internal::BitsSetTable256mul2; - using internal::pshufb_combine_table; - // this particular implementation was inspired by work done by @animetosho - // we do it in two steps, first 8 bytes and then second 8 bytes - uint8_t mask1 = uint8_t(mask); // least significant 8 bits - uint8_t mask2 = uint8_t(mask >> 8); // most significant 8 bits - // next line just loads the 64-bit values thintable_epi8[mask1] and - // thintable_epi8[mask2] into a 128-bit register, using only - // two instructions on most compilers. - uint64x2_t shufmask64 = {thintable_epi8[mask1], thintable_epi8[mask2]}; - uint8x16_t shufmask = vreinterpretq_u8_u64(shufmask64); - // we increment by 0x08 the second half of the mask -#if SIMDJSON_REGULAR_VISUAL_STUDIO - uint8x16_t inc = simdjson_make_uint8x16_t(0, 0, 0, 0, 0, 0, 0, 0, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08); -#else - uint8x16_t inc = {0, 0, 0, 0, 0, 0, 0, 0, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08}; -#endif - shufmask = vaddq_u8(shufmask, inc); - // this is the version "nearly pruned" - uint8x16_t pruned = vqtbl1q_u8(*this, shufmask); - // we still need to put the two halves together. - // we compute the popcount of the first half: - int pop1 = BitsSetTable256mul2[mask1]; - // then load the corresponding mask, what it does is to write - // only the first pop1 bytes from the first 8 bytes, and then - // it fills in with the bytes from the second 8 bytes + some filling - // at the end. - uint8x16_t compactmask = vld1q_u8(reinterpret_cast<const uint8_t *>(pshufb_combine_table + pop1 * 8)); - uint8x16_t answer = vqtbl1q_u8(pruned, compactmask); - vst1q_u8(reinterpret_cast<uint8_t*>(output), answer); + return __riscv_vrgather(lookup_table, value, VL8); } - // Copies all bytes corresponding to a 0 in the low half of the mask (interpreted as a - // bitset) to output1, then those corresponding to a 0 in the high half to output2. + // compress inactive elements, to match AVX-512 behavior template<typename L> - simdjson_inline void compress_halves(uint16_t mask, L *output1, L *output2) const { - using internal::thintable_epi8; - uint8_t mask1 = uint8_t(mask); // least significant 8 bits - uint8_t mask2 = uint8_t(mask >> 8); // most significant 8 bits - uint8x8_t compactmask1 = vcreate_u8(thintable_epi8[mask1]); - uint8x8_t compactmask2 = vcreate_u8(thintable_epi8[mask2]); - // we increment by 0x08 the second half of the mask -#if SIMDJSON_REGULAR_VISUAL_STUDIO - uint8x8_t inc = simdjson_make_uint8x8_t(0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08); + simdjson_inline void compress(vbitmask_t mask, L * output) const { + mask = (vbitmask_t)~mask; +#if __riscv_v_fixed_vlen == 128 + vbool8_t m = __riscv_vreinterpret_b8(__riscv_vmv_s_x_u16m1(mask, 1)); +#elif __riscv_v_fixed_vlen == 256 + vbool8_t m = __riscv_vreinterpret_b8(__riscv_vmv_s_x_u32m1(mask, 1)); #else - uint8x8_t inc = {0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08}; + vbool8_t m = __riscv_vreinterpret_b8(__riscv_vmv_s_x_u64m1(mask, 1)); #endif - compactmask2 = vadd_u8(compactmask2, inc); - // store each result (with the second store possibly overlapping the first) - vst1_u8((uint8_t*)output1, vqtbl1_u8(*this, compactmask1)); - vst1_u8((uint8_t*)output2, vqtbl1_u8(*this, compactmask2)); + __riscv_vse8_v_u8m1(output, __riscv_vcompress(value, m, VL8), count_ones(mask)); } template<typename L> @@ -33944,51 +35805,30 @@ namespace { replace12, replace13, replace14, replace15 )); } - - template<typename T> - simdjson_inline simd8<uint8_t> apply_lookup_16_to(const simd8<T> original) { - return vqtbl1q_u8(*this, simd8<uint8_t>(original)); - } }; // Signed bytes template<> struct simd8<int8_t> { - int8x16_t value; - - static simdjson_inline simd8<int8_t> splat(int8_t _value) { return vmovq_n_s8(_value); } - static simdjson_inline simd8<int8_t> zero() { return vdupq_n_s8(0); } - static simdjson_inline simd8<int8_t> load(const int8_t values[16]) { return vld1q_s8(values); } - - // Conversion from/to SIMD register - simdjson_inline simd8(const int8x16_t _value) : value{_value} {} - simdjson_inline operator const int8x16_t&() const { return this->value; } - simdjson_inline operator int8x16_t&() { return this->value; } + vint8_t value; + static constexpr int SIZE = sizeof(value); - // Zero constructor + simdjson_inline simd8(const vint8_t _value) : value(_value) {} simdjson_inline simd8() : simd8(zero()) {} - // Splat constructor + simdjson_inline simd8(const int8_t values[VL8]) : simd8(load(values)) {} simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {} - // Array constructor - simdjson_inline simd8(const int8_t* values) : simd8(load(values)) {} - // Member-by-member initialization -#if SIMDJSON_REGULAR_VISUAL_STUDIO - simdjson_inline simd8( - int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, - int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 - ) : simd8(simdjson_make_int8x16_t( - v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15 - )) {} -#else + + simdjson_inline operator const vint8_t&() const { return this->value; } + simdjson_inline operator vint8_t&() { return this->value; } + simdjson_inline simd8( - int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, + int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 - ) : simd8(int8x16_t{ + ) : simd8(vint8_t{ v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,v11,v12,v13,v14,v15 }) {} -#endif + // Repeat 16 values as many times as necessary (usually for lookup tables) simdjson_inline static simd8<int8_t> repeat_16( int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, @@ -34000,41 +35840,39 @@ namespace { ); } - // Store to array - simdjson_inline void store(int8_t dst[16]) const { return vst1q_s8(dst, *this); } + static simdjson_inline vint8_t splat(int8_t _value) { return __riscv_vmv_v_x_i8m1(_value, VL8); } + static simdjson_inline vint8_t zero() { return splat(0); } + static simdjson_inline vint8_t load(const int8_t values[VL8]) { return __riscv_vle8_v_i8m1(values, VL8); } + + + simdjson_inline void store(int8_t dst[VL8]) const { return __riscv_vse8(dst, value, VL8); } // Explicit conversion to/from unsigned - // - // Under Visual Studio/ARM64 uint8x16_t and int8x16_t are apparently the same type. - // In theory, we could check this occurrence with std::same_as and std::enabled_if but it is C++14 - // and relatively ugly and hard to read. -#ifndef SIMDJSON_REGULAR_VISUAL_STUDIO - simdjson_inline explicit simd8(const uint8x16_t other): simd8(vreinterpretq_s8_u8(other)) {} -#endif - simdjson_inline explicit operator simd8<uint8_t>() const { return vreinterpretq_u8_s8(this->value); } + simdjson_inline explicit simd8(const vuint8_t other): simd8(__riscv_vreinterpret_i8m1(other)) {} + simdjson_inline explicit operator simd8<uint8_t>() const { return __riscv_vreinterpret_u8m1(value); } // Math - simdjson_inline simd8<int8_t> operator+(const simd8<int8_t> other) const { return vaddq_s8(*this, other); } - simdjson_inline simd8<int8_t> operator-(const simd8<int8_t> other) const { return vsubq_s8(*this, other); } - simdjson_inline simd8<int8_t>& operator+=(const simd8<int8_t> other) { *this = *this + other; return *this; } - simdjson_inline simd8<int8_t>& operator-=(const simd8<int8_t> other) { *this = *this - other; return *this; } + simdjson_inline simd8<int8_t> operator+(const simd8<int8_t> other) const { return __riscv_vadd(value, other, VL8); } + simdjson_inline simd8<int8_t> operator-(const simd8<int8_t> other) const { return __riscv_vsub(value, other, VL8); } + simdjson_inline simd8<int8_t>& operator+=(const simd8<int8_t> other) { value = *this + other; return *this; } + simdjson_inline simd8<int8_t>& operator-=(const simd8<int8_t> other) { value = *this - other; return *this; } // Order-sensitive comparisons - simdjson_inline simd8<int8_t> max_val(const simd8<int8_t> other) const { return vmaxq_s8(*this, other); } - simdjson_inline simd8<int8_t> min_val(const simd8<int8_t> other) const { return vminq_s8(*this, other); } - simdjson_inline simd8<bool> operator>(const simd8<int8_t> other) const { return vcgtq_s8(*this, other); } - simdjson_inline simd8<bool> operator<(const simd8<int8_t> other) const { return vcltq_s8(*this, other); } - simdjson_inline simd8<bool> operator==(const simd8<int8_t> other) const { return vceqq_s8(*this, other); } + simdjson_inline simd8<int8_t> max_val( const simd8<int8_t> other) const { return __riscv_vmax( value, other, VL8); } + simdjson_inline simd8<int8_t> min_val( const simd8<int8_t> other) const { return __riscv_vmin( value, other, VL8); } + simdjson_inline simd8<bool> operator>( const simd8<int8_t> other) const { return __riscv_vmsgt(value, other, VL8); } + simdjson_inline simd8<bool> operator<( const simd8<int8_t> other) const { return __riscv_vmslt(value, other, VL8); } + simdjson_inline simd8<bool> operator==(const simd8<int8_t> other) const { return __riscv_vmseq(value, other, VL8); } template<int N=1> simdjson_inline simd8<int8_t> prev(const simd8<int8_t> prev_chunk) const { - return vextq_s8(prev_chunk, *this, 16 - N); + return __riscv_vslideup(__riscv_vslidedown(prev_chunk, VL8-N, VL8), value, N, VL8); } // Perform a lookup assuming no value is larger than 16 template<typename L> simdjson_inline simd8<L> lookup_16(simd8<L> lookup_table) const { - return lookup_table.apply_lookup_16_to(*this); + return __riscv_vrgather(lookup_table, value, VL8); } template<typename L> simdjson_inline simd8<L> lookup_16( @@ -34049,110 +35887,92 @@ namespace { replace12, replace13, replace14, replace15 )); } - - template<typename T> - simdjson_inline simd8<int8_t> apply_lookup_16_to(const simd8<T> original) { - return vqtbl1q_s8(*this, simd8<uint8_t>(original)); - } }; template<typename T> - struct simd8x64 { - static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<T>); - static_assert(NUM_CHUNKS == 4, "ARM kernel should use four registers per 64-byte block."); - const simd8<T> chunks[NUM_CHUNKS]; + struct simd8x64; + template<> + struct simd8x64<uint8_t> { + static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<uint8_t>); + vuint8x64_t value; - simd8x64(const simd8x64<T>& o) = delete; // no copy allowed - simd8x64<T>& operator=(const simd8<T>& other) = delete; // no assignment allowed - simd8x64() = delete; // no default constructor allowed +#if __riscv_v_fixed_vlen >= 512 + template<int idx> simd8<uint8_t> get() const { return value; } +#else + template<int idx> simd8<uint8_t> get() const { return __riscv_vget_u8m1(value, idx); } +#endif - simdjson_inline simd8x64(const simd8<T> chunk0, const simd8<T> chunk1, const simd8<T> chunk2, const simd8<T> chunk3) : chunks{chunk0, chunk1, chunk2, chunk3} {} - simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8<T>::load(ptr), simd8<T>::load(ptr+16), simd8<T>::load(ptr+32), simd8<T>::load(ptr+48)} {} + simdjson_inline operator const vuint8x64_t&() const { return this->value; } + simdjson_inline operator vuint8x64_t&() { return this->value; } - simdjson_inline void store(T ptr[64]) const { - this->chunks[0].store(ptr+sizeof(simd8<T>)*0); - this->chunks[1].store(ptr+sizeof(simd8<T>)*1); - this->chunks[2].store(ptr+sizeof(simd8<T>)*2); - this->chunks[3].store(ptr+sizeof(simd8<T>)*3); - } + simd8x64(const simd8x64<uint8_t>& o) = delete; // no copy allowed + simd8x64<uint8_t>& operator=(const simd8<uint8_t>& other) = delete; // no assignment allowed + simd8x64() = delete; // no default constructor allowed - simdjson_inline simd8<T> reduce_or() const { - return (this->chunks[0] | this->chunks[1]) | (this->chunks[2] | this->chunks[3]); - } +#if __riscv_v_fixed_vlen == 128 + simdjson_inline simd8x64(const uint8_t *ptr, size_t n = 64) : value(__riscv_vle8_v_u8m4(ptr, n)) {} +#elif __riscv_v_fixed_vlen == 256 + simdjson_inline simd8x64(const uint8_t *ptr, size_t n = 64) : value(__riscv_vle8_v_u8m2(ptr, n)) {} +#else + simdjson_inline simd8x64(const uint8_t *ptr, size_t n = 64) : value(__riscv_vle8_v_u8m1(ptr, n)) {} +#endif + simdjson_inline void store(uint8_t ptr[64]) const { + __riscv_vse8(ptr, value, 64); + } - simdjson_inline uint64_t compress(uint64_t mask, T * output) const { - uint64_t popcounts = vget_lane_u64(vreinterpret_u64_u8(vcnt_u8(vcreate_u8(~mask))), 0); - // compute the prefix sum of the popcounts of each byte - uint64_t offsets = popcounts * 0x0101010101010101; - this->chunks[0].compress_halves(uint16_t(mask), output, &output[popcounts & 0xFF]); - this->chunks[1].compress_halves(uint16_t(mask >> 16), &output[(offsets >> 8) & 0xFF], &output[(offsets >> 16) & 0xFF]); - this->chunks[2].compress_halves(uint16_t(mask >> 32), &output[(offsets >> 24) & 0xFF], &output[(offsets >> 32) & 0xFF]); - this->chunks[3].compress_halves(uint16_t(mask >> 48), &output[(offsets >> 40) & 0xFF], &output[(offsets >> 48) & 0xFF]); - return offsets >> 56; + simdjson_inline bool is_ascii() const { +#if __riscv_v_fixed_vlen == 128 + return __riscv_vfirst(__riscv_vmslt(__riscv_vreinterpret_i8m4(value), 0, 64), 64) < 0; +#elif __riscv_v_fixed_vlen == 256 + return __riscv_vfirst(__riscv_vmslt(__riscv_vreinterpret_i8m2(value), 0, 64), 64) < 0; +#else + return __riscv_vfirst(__riscv_vmslt(__riscv_vreinterpret_i8m1(value), 0, 64), 64) < 0; +#endif } - simdjson_inline uint64_t to_bitmask() const { -#if SIMDJSON_REGULAR_VISUAL_STUDIO - const uint8x16_t bit_mask = simdjson_make_uint8x16_t( - 0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, - 0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80 - ); + // compress inactive elements, to match AVX-512 behavior + simdjson_inline uint64_t compress(uint64_t mask, uint8_t * output) const { + mask = ~mask; +#if __riscv_v_fixed_vlen == 128 + vboolx64_t m = __riscv_vreinterpret_b2(__riscv_vmv_s_x_u64m1(mask, 1)); +#elif __riscv_v_fixed_vlen == 256 + vboolx64_t m = __riscv_vreinterpret_b4(__riscv_vmv_s_x_u64m1(mask, 1)); #else - const uint8x16_t bit_mask = { - 0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, - 0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80 - }; + vboolx64_t m = __riscv_vreinterpret_b8(__riscv_vmv_s_x_u64m1(mask, 1)); #endif - // Add each of the elements next to each other, successively, to stuff each 8 byte mask into one. - uint8x16_t sum0 = vpaddq_u8(this->chunks[0] & bit_mask, this->chunks[1] & bit_mask); - uint8x16_t sum1 = vpaddq_u8(this->chunks[2] & bit_mask, this->chunks[3] & bit_mask); - sum0 = vpaddq_u8(sum0, sum1); - sum0 = vpaddq_u8(sum0, sum0); - return vgetq_lane_u64(vreinterpretq_u64_u8(sum0), 0); + size_t cnt = count_ones(mask); + __riscv_vse8(output, __riscv_vcompress(value, m, 64), cnt); + return cnt; } - simdjson_inline uint64_t eq(const T m) const { - const simd8<T> mask = simd8<T>::splat(m); - return simd8x64<bool>( - this->chunks[0] == mask, - this->chunks[1] == mask, - this->chunks[2] == mask, - this->chunks[3] == mask - ).to_bitmask(); + simdjson_inline uint64_t eq(const uint8_t m) const { + return __riscv_vmv_x(__riscv_vreinterpret_u64m1(__riscv_vmseq(value, m, 64))); } - simdjson_inline uint64_t lteq(const T m) const { - const simd8<T> mask = simd8<T>::splat(m); - return simd8x64<bool>( - this->chunks[0] <= mask, - this->chunks[1] <= mask, - this->chunks[2] <= mask, - this->chunks[3] <= mask - ).to_bitmask(); + simdjson_inline uint64_t lteq(const uint8_t m) const { + return __riscv_vmv_x(__riscv_vreinterpret_u64m1(__riscv_vmsleu(value, m, 64))); } - }; // struct simd8x64<T> + }; // struct simd8x64<uint8_t> } // namespace simd } // unnamed namespace -} // namespace arm64 +} // namespace rvv_vls } // namespace simdjson -#endif // SIMDJSON_ARM64_SIMD_H -/* end file simdjson/arm64/simd.h */ -/* including simdjson/arm64/stringparsing_defs.h: #include "simdjson/arm64/stringparsing_defs.h" */ -/* begin file simdjson/arm64/stringparsing_defs.h */ -#ifndef SIMDJSON_ARM64_STRINGPARSING_DEFS_H -#define SIMDJSON_ARM64_STRINGPARSING_DEFS_H +#endif // SIMDJSON_RVV_VLS_SIMD_H +/* end file simdjson/rvv-vls/simd.h */ +/* including simdjson/rvv-vls/stringparsing_defs.h: #include "simdjson/rvv-vls/stringparsing_defs.h" */ +/* begin file simdjson/rvv-vls/stringparsing_defs.h */ +#ifndef SIMDJSON_RVV_VLS_STRINGPARSING_DEFS_H +#define SIMDJSON_RVV_VLS_STRINGPARSING_DEFS_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/arm64/simd.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/arm64/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace arm64 { +namespace rvv_vls { namespace { using namespace simd; @@ -34160,38 +35980,27 @@ using namespace simd; // Holds backslashes and quotes locations. struct backslash_and_quote { public: - static constexpr uint32_t BYTES_PROCESSED = 32; + static constexpr uint64_t BYTES_PROCESSED = sizeof(simd8<uint8_t>); simdjson_inline backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst); simdjson_inline bool has_quote_first() { return ((bs_bits - 1) & quote_bits) != 0; } - simdjson_inline bool has_backslash() { return bs_bits != 0; } + simdjson_inline bool has_backslash() { return ((quote_bits - 1) & bs_bits) != 0; } simdjson_inline int quote_index() { return trailing_zeroes(quote_bits); } simdjson_inline int backslash_index() { return trailing_zeroes(bs_bits); } - uint32_t bs_bits; - uint32_t quote_bits; + uint64_t bs_bits; + uint64_t quote_bits; }; // struct backslash_and_quote simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) { - // this can read up to 31 bytes beyond the buffer size, but we require - // SIMDJSON_PADDING of padding static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "backslash and quote finder must process fewer than SIMDJSON_PADDING bytes"); - simd8<uint8_t> v0(src); - simd8<uint8_t> v1(src + sizeof(v0)); - v0.store(dst); - v1.store(dst + sizeof(v0)); - - // Getting a 64-bit bitmask is much cheaper than multiple 16-bit bitmasks on ARM; therefore, we - // smash them together into a 64-byte mask and get the bitmask from there. - uint64_t bs_and_quote = simd8x64<bool>(v0 == '\\', v1 == '\\', v0 == '"', v1 == '"').to_bitmask(); - return { - uint32_t(bs_and_quote), // bs_bits - uint32_t(bs_and_quote >> 32) // quote_bits - }; + simd8<uint8_t> v(src); + v.store(dst); + return { (v == '\\').to_bitmask(), (v == '"').to_bitmask() }; } struct escaping { - static constexpr uint32_t BYTES_PROCESSED = 16; + static constexpr uint64_t BYTES_PROCESSED = sizeof(simd8<uint8_t>); simdjson_inline static escaping copy_and_find(const uint8_t *src, uint8_t *dst); simdjson_inline bool has_escape() { return escape_bits != 0; } @@ -34200,232 +36009,39497 @@ struct escaping { uint64_t escape_bits; }; // struct escaping - - simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *dst) { static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "escaping finder must process fewer than SIMDJSON_PADDING bytes"); simd8<uint8_t> v(src); v.store(dst); - simd8<bool> is_quote = (v == '"'); - simd8<bool> is_backslash = (v == '\\'); - simd8<bool> is_control = (v < 32); - return { - (is_backslash | is_quote | is_control).to_bitmask64() - }; + return { ((v == '"') | (v == '\\') | (v == 32)).to_bitmask() }; } - } // unnamed namespace -} // namespace arm64 +} // namespace rvv_vls } // namespace simdjson -#endif // SIMDJSON_ARM64_STRINGPARSING_DEFS_H -/* end file simdjson/arm64/stringparsing_defs.h */ - -#define SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT 1 -/* end file simdjson/arm64/begin.h */ -/* including simdjson/generic/ondemand/amalgamated.h for arm64: #include "simdjson/generic/ondemand/amalgamated.h" */ -/* begin file simdjson/generic/ondemand/amalgamated.h for arm64 */ -#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_ONDEMAND_DEPENDENCIES_H) -#error simdjson/generic/ondemand/dependencies.h must be included before simdjson/generic/ondemand/amalgamated.h! -#endif - -// Stuff other things depend on -/* including simdjson/generic/ondemand/base.h for arm64: #include "simdjson/generic/ondemand/base.h" */ -/* begin file simdjson/generic/ondemand/base.h for arm64 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_BASE_H +#endif // SIMDJSON_RVV_VLS_STRINGPARSING_DEFS_H +/* end file simdjson/rvv-vls/stringparsing_defs.h */ +/* including simdjson/rvv-vls/numberparsing_defs.h: #include "simdjson/rvv-vls/numberparsing_defs.h" */ +/* begin file simdjson/rvv-vls/numberparsing_defs.h */ +#ifndef SIMDJSON_RVV_VLS_NUMBERPARSING_DEFS_H +#define SIMDJSON_RVV_VLS_NUMBERPARSING_DEFS_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_BASE_H */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -namespace simdjson { -namespace arm64 { -/** - * A fast, simple, DOM-like interface that parses JSON as you use it. - * - * Designed for maximum speed and a lower memory profile. - */ -namespace ondemand { - -/** Represents the depth of a JSON value (number of nested arrays/objects). */ -using depth_t = int32_t; - -/** @copydoc simdjson::arm64::number_type */ -using number_type = simdjson::arm64::number_type; - -/** @private Position in the JSON buffer indexes */ -using token_position = const uint32_t *; - -class array; -class array_iterator; -class document; -class document_reference; -class document_stream; -class field; -class json_iterator; -enum class json_type; -struct number; -class object; -class object_iterator; -class parser; -class raw_json_string; -class token_iterator; -class value; -class value_iterator; - -} // namespace ondemand -} // namespace arm64 -} // namespace simdjson - -#endif // SIMDJSON_GENERIC_ONDEMAND_BASE_H -/* end file simdjson/generic/ondemand/base.h for arm64 */ -/* including simdjson/generic/ondemand/deserialize.h for arm64: #include "simdjson/generic/ondemand/deserialize.h" */ -/* begin file simdjson/generic/ondemand/deserialize.h for arm64 */ -#if SIMDJSON_SUPPORTS_CONCEPTS +#include <cstring> -#ifndef SIMDJSON_ONDEMAND_DESERIALIZE_H -/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #define SIMDJSON_ONDEMAND_DESERIALIZE_H */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */ -/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ +#ifdef JSON_TEST_NUMBERS // for unit testing +void found_invalid_number(const uint8_t *buf); +void found_integer(int64_t result, const uint8_t *buf); +void found_unsigned_integer(uint64_t result, const uint8_t *buf); +void found_float(double result, const uint8_t *buf); +#endif namespace simdjson { +namespace rvv_vls { +namespace numberparsing { -struct deserialize_tag; - -/// These types are deserializable in a built-in way -template <typename> struct is_builtin_deserializable : std::false_type {}; -template <> struct is_builtin_deserializable<int64_t> : std::true_type {}; -template <> struct is_builtin_deserializable<uint64_t> : std::true_type {}; -template <> struct is_builtin_deserializable<double> : std::true_type {}; -template <> struct is_builtin_deserializable<bool> : std::true_type {}; -template <> struct is_builtin_deserializable<arm64::ondemand::array> : std::true_type {}; -template <> struct is_builtin_deserializable<arm64::ondemand::object> : std::true_type {}; -template <> struct is_builtin_deserializable<arm64::ondemand::value> : std::true_type {}; -template <> struct is_builtin_deserializable<arm64::ondemand::raw_json_string> : std::true_type {}; -template <> struct is_builtin_deserializable<std::string_view> : std::true_type {}; - -template <typename T> -concept is_builtin_deserializable_v = is_builtin_deserializable<T>::value; - -template <typename T, typename ValT = arm64::ondemand::value> -concept custom_deserializable = tag_invocable<deserialize_tag, ValT&, T&>; +// credit: https://johnnylee-sde.github.io/Fast-numeric-string-to-int/ +/** @private */ +static simdjson_inline uint32_t parse_eight_digits_unrolled(const char *chars) { + uint64_t val; +#if __riscv_misaligned_fast + memcpy(&val, chars, sizeof(uint64_t)); +#else + val = __riscv_vmv_x(__riscv_vreinterpret_u64m1(__riscv_vlmul_ext_u8m1(__riscv_vle8_v_u8mf2((uint8_t*)chars, 8)))); +#endif + val = (val & 0x0F0F0F0F0F0F0F0F) * 2561 >> 8; + val = (val & 0x00FF00FF00FF00FF) * 6553601 >> 16; + return uint32_t((val & 0x0000FFFF0000FFFF) * 42949672960001 >> 32); +} -template <typename T, typename ValT = arm64::ondemand::value> -concept deserializable = custom_deserializable<T, ValT> || is_builtin_deserializable_v<T> || concepts::optional_type<T>; +/** @private */ +static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) { + return parse_eight_digits_unrolled(reinterpret_cast<const char *>(chars)); +} -template <typename T, typename ValT = arm64::ondemand::value> -concept nothrow_custom_deserializable = nothrow_tag_invocable<deserialize_tag, ValT&, T&>; +/** @private */ +simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) { + internal::value128 answer; + __uint128_t r = (static_cast<__uint128_t>(value1)) * value2; + answer.low = uint64_t(r); + answer.high = uint64_t(r >> 64); + return answer; +} -// built-in types are noexcept and if an error happens, the value simply gets ignored and the error is returned. -template <typename T, typename ValT = arm64::ondemand::value> -concept nothrow_deserializable = nothrow_custom_deserializable<T, ValT> || is_builtin_deserializable_v<T>; +} // namespace numberparsing +} // namespace rvv_vls +} // namespace simdjson -/// Deserialize Tag -inline constexpr struct deserialize_tag { - using array_type = arm64::ondemand::array; - using object_type = arm64::ondemand::object; - using value_type = arm64::ondemand::value; - using document_type = arm64::ondemand::document; - using document_reference_type = arm64::ondemand::document_reference; +#define SIMDJSON_SWAR_NUMBER_PARSING 1 - // Customization Point for array - template <typename T> - requires custom_deserializable<T, value_type> - simdjson_warn_unused constexpr /* error_code */ auto operator()(array_type &object, T& output) const noexcept(nothrow_custom_deserializable<T, value_type>) { - return tag_invoke(*this, object, output); - } +#endif // SIMDJSON_RVV_VLS_NUMBERPARSING_DEFS_H +/* end file simdjson/rvv-vls/numberparsing_defs.h */ - // Customization Point for object - template <typename T> - requires custom_deserializable<T, value_type> - simdjson_warn_unused constexpr /* error_code */ auto operator()(object_type &object, T& output) const noexcept(nothrow_custom_deserializable<T, value_type>) { - return tag_invoke(*this, object, output); - } +#define SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT 1 +/* end file simdjson/rvv-vls/begin.h */ +/* including simdjson/generic/amalgamated.h for rvv_vls: #include "simdjson/generic/amalgamated.h" */ +/* begin file simdjson/generic/amalgamated.h for rvv_vls */ +#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_DEPENDENCIES_H) +#error simdjson/generic/dependencies.h must be included before simdjson/generic/amalgamated.h! +#endif - // Customization Point for value - template <typename T> - requires custom_deserializable<T, value_type> - simdjson_warn_unused constexpr /* error_code */ auto operator()(value_type &object, T& output) const noexcept(nothrow_custom_deserializable<T, value_type>) { - return tag_invoke(*this, object, output); - } +/* including simdjson/generic/base.h for rvv_vls: #include "simdjson/generic/base.h" */ +/* begin file simdjson/generic/base.h for rvv_vls */ +#ifndef SIMDJSON_GENERIC_BASE_H - // Customization Point for document - template <typename T> - requires custom_deserializable<T, document_type> - simdjson_warn_unused constexpr /* error_code */ auto operator()(document_type &object, T& output) const noexcept(nothrow_custom_deserializable<T, document_type>) { - return tag_invoke(*this, object, output); - } +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_BASE_H */ +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */ +/* amalgamation skipped (editor-only): // If we haven't got an implementation yet, we're in the editor, editing a generic file! Just */ +/* amalgamation skipped (editor-only): // use the most advanced one we can so the most possible stuff can be tested. */ +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_IMPLEMENTATION */ +/* amalgamation skipped (editor-only): #include "simdjson/implementation_detection.h" */ +/* amalgamation skipped (editor-only): #if SIMDJSON_IMPLEMENTATION_ICELAKE */ +/* amalgamation skipped (editor-only): #include "simdjson/icelake/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_HASWELL */ +/* amalgamation skipped (editor-only): #include "simdjson/haswell/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_WESTMERE */ +/* amalgamation skipped (editor-only): #include "simdjson/westmere/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_ARM64 */ +/* amalgamation skipped (editor-only): #include "simdjson/arm64/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_PPC64 */ +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LASX */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_LSX */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_RVV_VLS */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/begin.h" */ +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_FALLBACK */ +/* amalgamation skipped (editor-only): #include "simdjson/fallback/begin.h" */ +/* amalgamation skipped (editor-only): #else */ +/* amalgamation skipped (editor-only): #error "All possible implementations (including fallback) have been disabled! simdjson will not run." */ +/* amalgamation skipped (editor-only): #endif */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_IMPLEMENTATION */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ - // Customization Point for document reference - template <typename T> - requires custom_deserializable<T, document_reference_type> - simdjson_warn_unused constexpr /* error_code */ auto operator()(document_reference_type &object, T& output) const noexcept(nothrow_custom_deserializable<T, document_reference_type>) { - return tag_invoke(*this, object, output); - } +namespace simdjson { +namespace rvv_vls { +struct open_container; +class dom_parser_implementation; -} deserialize{}; +/** + * The type of a JSON number + */ +enum class number_type { + floating_point_number=1, /// a binary64 number + signed_integer, /// a signed integer that fits in a 64-bit word using two's complement + unsigned_integer, /// a positive integer larger or equal to 1<<63 + big_integer /// a big integer that does not fit in a 64-bit word +}; +} // namespace rvv_vls } // namespace simdjson -#endif // SIMDJSON_ONDEMAND_DESERIALIZE_H -#endif // SIMDJSON_SUPPORTS_CONCEPTS - -/* end file simdjson/generic/ondemand/deserialize.h for arm64 */ -/* including simdjson/generic/ondemand/value_iterator.h for arm64: #include "simdjson/generic/ondemand/value_iterator.h" */ -/* begin file simdjson/generic/ondemand/value_iterator.h for arm64 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_H +#endif // SIMDJSON_GENERIC_BASE_H +/* end file simdjson/generic/base.h for rvv_vls */ +/* including simdjson/generic/jsoncharutils.h for rvv_vls: #include "simdjson/generic/jsoncharutils.h" */ +/* begin file simdjson/generic/jsoncharutils.h for rvv_vls */ +#ifndef SIMDJSON_GENERIC_JSONCHARUTILS_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_H */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_JSONCHARUTILS_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/internal/jsoncharutils_tables.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace arm64 { -namespace ondemand { - -/** - * Iterates through a single JSON value at a particular depth. - * - * Does not keep track of the type of value: provides methods for objects, arrays and scalars and expects - * the caller to call the right ones. - * - * @private This is not intended for external use. - */ -class value_iterator { -protected: - /** The underlying JSON iterator */ - json_iterator *_json_iter{}; - /** The depth of this value */ - depth_t _depth{}; - /** - * The starting token index for this value - */ - token_position _start_position{}; +namespace rvv_vls { +namespace { +namespace jsoncharutils { -public: - simdjson_inline value_iterator() noexcept = default; +// return non-zero if not a structural or whitespace char +// zero otherwise +simdjson_inline uint32_t is_not_structural_or_whitespace(uint8_t c) { + return internal::structural_or_whitespace_negated[c]; +} - /** - * Denote that we're starting a document. - */ - simdjson_inline void start_document() noexcept; +simdjson_inline uint32_t is_structural_or_whitespace(uint8_t c) { + return internal::structural_or_whitespace[c]; +} - /** - * Skips a non-iterated or partially-iterated JSON value, whether it is a scalar, array or object. - * - * Optimized for scalars. - */ - simdjson_warn_unused simdjson_inline error_code skip_child() noexcept; +// returns a value with the high 16 bits set if not valid +// otherwise returns the conversion of the 4 hex digits at src into the bottom +// 16 bits of the 32-bit return register +// +// see +// https://lemire.me/blog/2019/04/17/parsing-short-hexadecimal-strings-efficiently/ +static inline uint32_t hex_to_u32_nocheck( + const uint8_t *src) { // strictly speaking, static inline is a C-ism + uint32_t v1 = internal::digit_to_val32[630 + src[0]]; + uint32_t v2 = internal::digit_to_val32[420 + src[1]]; + uint32_t v3 = internal::digit_to_val32[210 + src[2]]; + uint32_t v4 = internal::digit_to_val32[0 + src[3]]; + return v1 | v2 | v3 | v4; +} - /** +// given a code point cp, writes to c +// the utf-8 code, outputting the length in +// bytes, if the length is zero, the code point +// is invalid +// +// This can possibly be made faster using pdep +// and clz and table lookups, but JSON documents +// have few escaped code points, and the following +// function looks cheap. +// +// Note: we assume that surrogates are treated separately +// +simdjson_inline size_t codepoint_to_utf8(uint32_t cp, uint8_t *c) { + if (cp <= 0x7F) { + c[0] = uint8_t(cp); + return 1; // ascii + } + if (cp <= 0x7FF) { + c[0] = uint8_t((cp >> 6) + 192); + c[1] = uint8_t((cp & 63) + 128); + return 2; // universal plane + // Surrogates are treated elsewhere... + //} //else if (0xd800 <= cp && cp <= 0xdfff) { + // return 0; // surrogates // could put assert here + } else if (cp <= 0xFFFF) { + c[0] = uint8_t((cp >> 12) + 224); + c[1] = uint8_t(((cp >> 6) & 63) + 128); + c[2] = uint8_t((cp & 63) + 128); + return 3; + } else if (cp <= 0x10FFFF) { // if you know you have a valid code point, this + // is not needed + c[0] = uint8_t((cp >> 18) + 240); + c[1] = uint8_t(((cp >> 12) & 63) + 128); + c[2] = uint8_t(((cp >> 6) & 63) + 128); + c[3] = uint8_t((cp & 63) + 128); + return 4; + } + // will return 0 when the code point was too large. + return 0; // bad r +} + +#if SIMDJSON_IS_32BITS // _umul128 for x86, arm +// this is a slow emulation routine for 32-bit +// +static simdjson_inline uint64_t __emulu(uint32_t x, uint32_t y) { + return x * (uint64_t)y; +} +static simdjson_inline uint64_t _umul128(uint64_t ab, uint64_t cd, uint64_t *hi) { + uint64_t ad = __emulu((uint32_t)(ab >> 32), (uint32_t)cd); + uint64_t bd = __emulu((uint32_t)ab, (uint32_t)cd); + uint64_t adbc = ad + __emulu((uint32_t)ab, (uint32_t)(cd >> 32)); + uint64_t adbc_carry = !!(adbc < ad); + uint64_t lo = bd + (adbc << 32); + *hi = __emulu((uint32_t)(ab >> 32), (uint32_t)(cd >> 32)) + (adbc >> 32) + + (adbc_carry << 32) + !!(lo < bd); + return lo; +} +#endif + +} // namespace jsoncharutils +} // unnamed namespace +} // namespace rvv_vls +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_JSONCHARUTILS_H +/* end file simdjson/generic/jsoncharutils.h for rvv_vls */ +/* including simdjson/generic/atomparsing.h for rvv_vls: #include "simdjson/generic/atomparsing.h" */ +/* begin file simdjson/generic/atomparsing.h for rvv_vls */ +#ifndef SIMDJSON_GENERIC_ATOMPARSING_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ATOMPARSING_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/jsoncharutils.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#include <cstring> + +namespace simdjson { +namespace rvv_vls { +namespace { +/// @private +namespace atomparsing { + +// The string_to_uint32 is exclusively used to map literal strings to 32-bit values. +// We use memcpy instead of a pointer cast to avoid undefined behaviors since we cannot +// be certain that the character pointer will be properly aligned. +// You might think that using memcpy makes this function expensive, but you'd be wrong. +// All decent optimizing compilers (GCC, clang, Visual Studio) will compile string_to_uint32("false"); +// to the compile-time constant 1936482662. +simdjson_inline uint32_t string_to_uint32(const char* str) { uint32_t val; std::memcpy(&val, str, sizeof(uint32_t)); return val; } + + +// Again in str4ncmp we use a memcpy to avoid undefined behavior. The memcpy may appear expensive. +// Yet all decent optimizing compilers will compile memcpy to a single instruction, just about. +simdjson_warn_unused +simdjson_inline uint32_t str4ncmp(const uint8_t *src, const char* atom) { + uint32_t srcval; // we want to avoid unaligned 32-bit loads (undefined in C/C++) + static_assert(sizeof(uint32_t) <= SIMDJSON_PADDING, "SIMDJSON_PADDING must be larger than 4 bytes"); + std::memcpy(&srcval, src, sizeof(uint32_t)); + return srcval ^ string_to_uint32(atom); +} + +simdjson_warn_unused +simdjson_inline bool is_valid_true_atom(const uint8_t *src) { + return (str4ncmp(src, "true") | jsoncharutils::is_not_structural_or_whitespace(src[4])) == 0; +} + +simdjson_warn_unused +simdjson_inline bool is_valid_true_atom(const uint8_t *src, size_t len) { + if (len > 4) { return is_valid_true_atom(src); } + else if (len == 4) { return !str4ncmp(src, "true"); } + else { return false; } +} + +simdjson_warn_unused +simdjson_inline bool is_valid_false_atom(const uint8_t *src) { + return (str4ncmp(src+1, "alse") | jsoncharutils::is_not_structural_or_whitespace(src[5])) == 0; +} + +simdjson_warn_unused +simdjson_inline bool is_valid_false_atom(const uint8_t *src, size_t len) { + if (len > 5) { return is_valid_false_atom(src); } + else if (len == 5) { return !str4ncmp(src+1, "alse"); } + else { return false; } +} + +simdjson_warn_unused +simdjson_inline bool is_valid_null_atom(const uint8_t *src) { + return (str4ncmp(src, "null") | jsoncharutils::is_not_structural_or_whitespace(src[4])) == 0; +} + +simdjson_warn_unused +simdjson_inline bool is_valid_null_atom(const uint8_t *src, size_t len) { + if (len > 4) { return is_valid_null_atom(src); } + else if (len == 4) { return !str4ncmp(src, "null"); } + else { return false; } +} + +} // namespace atomparsing +} // unnamed namespace +} // namespace rvv_vls +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_ATOMPARSING_H +/* end file simdjson/generic/atomparsing.h for rvv_vls */ +/* including simdjson/generic/dom_parser_implementation.h for rvv_vls: #include "simdjson/generic/dom_parser_implementation.h" */ +/* begin file simdjson/generic/dom_parser_implementation.h for rvv_vls */ +#ifndef SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/internal/dom_parser_implementation.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace rvv_vls { + +// expectation: sizeof(open_container) = 64/8. +struct open_container { + uint32_t tape_index; // where, on the tape, does the scope ([,{) begins + uint32_t count; // how many elements in the scope +}; // struct open_container + +static_assert(sizeof(open_container) == 64/8, "Open container must be 64 bits"); + +class dom_parser_implementation final : public internal::dom_parser_implementation { +public: + /** Tape location of each open { or [ */ + std::unique_ptr<open_container[]> open_containers{}; + /** Whether each open container is a [ or { */ + std::unique_ptr<bool[]> is_array{}; + /** Buffer passed to stage 1 */ + const uint8_t *buf{}; + /** Length passed to stage 1 */ + size_t len{0}; + /** Document passed to stage 2 */ + dom::document *doc{}; + + inline dom_parser_implementation() noexcept; + inline dom_parser_implementation(dom_parser_implementation &&other) noexcept; + inline dom_parser_implementation &operator=(dom_parser_implementation &&other) noexcept; + dom_parser_implementation(const dom_parser_implementation &) = delete; + dom_parser_implementation &operator=(const dom_parser_implementation &) = delete; + + simdjson_warn_unused error_code parse(const uint8_t *buf, size_t len, dom::document &doc) noexcept final; + simdjson_warn_unused error_code stage1(const uint8_t *buf, size_t len, stage1_mode partial) noexcept final; + simdjson_warn_unused error_code stage2(dom::document &doc) noexcept final; + simdjson_warn_unused error_code stage2_next(dom::document &doc) noexcept final; + simdjson_warn_unused uint8_t *parse_string(const uint8_t *src, uint8_t *dst, bool allow_replacement) const noexcept final; + simdjson_warn_unused uint8_t *parse_wobbly_string(const uint8_t *src, uint8_t *dst) const noexcept final; + inline simdjson_warn_unused error_code set_capacity(size_t capacity) noexcept final; + inline simdjson_warn_unused error_code set_max_depth(size_t max_depth) noexcept final; +private: + simdjson_inline simdjson_warn_unused error_code set_capacity_stage1(size_t capacity); + +}; + +} // namespace rvv_vls +} // namespace simdjson + +namespace simdjson { +namespace rvv_vls { + +inline dom_parser_implementation::dom_parser_implementation() noexcept = default; +inline dom_parser_implementation::dom_parser_implementation(dom_parser_implementation &&other) noexcept = default; +inline dom_parser_implementation &dom_parser_implementation::operator=(dom_parser_implementation &&other) noexcept = default; + +// Leaving these here so they can be inlined if so desired +inline simdjson_warn_unused error_code dom_parser_implementation::set_capacity(size_t capacity) noexcept { + if(capacity > SIMDJSON_MAXSIZE_BYTES) { return CAPACITY; } + // Stage 1 index output + size_t max_structures = SIMDJSON_ROUNDUP_N(capacity, 64) + 2 + 7; + structural_indexes.reset( new (std::nothrow) uint32_t[max_structures] ); + if (!structural_indexes) { _capacity = 0; return MEMALLOC; } + structural_indexes[0] = 0; + n_structural_indexes = 0; + + _capacity = capacity; + return SUCCESS; +} + +inline simdjson_warn_unused error_code dom_parser_implementation::set_max_depth(size_t max_depth) noexcept { + // Stage 2 stacks + open_containers.reset(new (std::nothrow) open_container[max_depth]); + is_array.reset(new (std::nothrow) bool[max_depth]); + if (!is_array || !open_containers) { _max_depth = 0; return MEMALLOC; } + + _max_depth = max_depth; + return SUCCESS; +} + +} // namespace rvv_vls +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H +/* end file simdjson/generic/dom_parser_implementation.h for rvv_vls */ +/* including simdjson/generic/implementation_simdjson_result_base.h for rvv_vls: #include "simdjson/generic/implementation_simdjson_result_base.h" */ +/* begin file simdjson/generic/implementation_simdjson_result_base.h for rvv_vls */ +#ifndef SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace rvv_vls { + +// This is a near copy of include/error.h's implementation_simdjson_result_base, except it doesn't use std::pair +// so we can avoid inlining errors +// TODO reconcile these! +/** + * The result of a simdjson operation that could fail. + * + * Gives the option of reading error codes, or throwing an exception by casting to the desired result. + * + * This is a base class for implementations that want to add functions to the result type for + * chaining. + * + * Override like: + * + * struct simdjson_result<T> : public internal::implementation_simdjson_result_base<T> { + * simdjson_result() noexcept : internal::implementation_simdjson_result_base<T>() {} + * simdjson_result(error_code error) noexcept : internal::implementation_simdjson_result_base<T>(error) {} + * simdjson_result(T &&value) noexcept : internal::implementation_simdjson_result_base<T>(std::forward(value)) {} + * simdjson_result(T &&value, error_code error) noexcept : internal::implementation_simdjson_result_base<T>(value, error) {} + * // Your extra methods here + * } + * + * Then any method returning simdjson_result<T> will be chainable with your methods. + */ +template<typename T> +struct implementation_simdjson_result_base { + + /** + * Create a new empty result with error = UNINITIALIZED. + */ + simdjson_inline implementation_simdjson_result_base() noexcept = default; + + /** + * Create a new error result. + */ + simdjson_inline implementation_simdjson_result_base(error_code error) noexcept; + + /** + * Create a new successful result. + */ + simdjson_inline implementation_simdjson_result_base(T &&value) noexcept; + + /** + * Create a new result with both things (use if you don't want to branch when creating the result). + */ + simdjson_inline implementation_simdjson_result_base(T &&value, error_code error) noexcept; + + /** + * Move the value and the error to the provided variables. + * + * @param value The variable to assign the value to. May not be set if there is an error. + * @param error The variable to assign the error to. Set to SUCCESS if there is no error. + */ + simdjson_inline void tie(T &value, error_code &error) && noexcept; + + /** + * Move the value to the provided variable. + * + * @param value The variable to assign the value to. May not be set if there is an error. + */ + simdjson_warn_unused simdjson_inline error_code get(T &value) && noexcept; + + /** + * The error. + */ + simdjson_warn_unused simdjson_inline error_code error() const noexcept; + + /** + * Whether there is a value. + */ + simdjson_warn_unused simdjson_inline bool has_value() const noexcept; + +#if SIMDJSON_EXCEPTIONS + + /** + * Get the result value. + * + * @throw simdjson_error if there was an error. + */ + simdjson_inline T& operator*() & noexcept(false); + simdjson_inline T&& operator*() && noexcept(false); + /** + * Arrow operator to access members of the contained value. + * + * @throw simdjson_error if there was an error. + */ + simdjson_inline T* operator->() noexcept(false); + simdjson_inline const T* operator->() const noexcept(false); + + simdjson_inline T& value() & noexcept(false); + + /** + * Take the result value (move it). + * + * @throw simdjson_error if there was an error. + */ + simdjson_inline T&& value() && noexcept(false); + + /** + * Take the result value (move it). + * + * @throw simdjson_error if there was an error. + */ + simdjson_inline T&& take_value() && noexcept(false); + + /** + * Cast to the value (will throw on error). + * + * @throw simdjson_error if there was an error. + */ + simdjson_inline operator T&&() && noexcept(false); + + +#endif // SIMDJSON_EXCEPTIONS + + /** + * Get the result value. This function is safe if and only + * the error() method returns a value that evaluates to false. + */ + simdjson_inline const T& value_unsafe() const& noexcept; + /** + * Get the result value. This function is safe if and only + * the error() method returns a value that evaluates to false. + */ + simdjson_inline T& value_unsafe() & noexcept; + /** + * Take the result value (move it). This function is safe if and only + * the error() method returns a value that evaluates to false. + */ + simdjson_inline T&& value_unsafe() && noexcept; + + using value_type = T; + using error_type = error_code; + +protected: + /** users should never directly access first and second. **/ + T first{}; /** Users should never directly access 'first'. **/ + error_code second{UNINITIALIZED}; /** Users should never directly access 'second'. **/ +}; // struct implementation_simdjson_result_base + +} // namespace rvv_vls +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H +/* end file simdjson/generic/implementation_simdjson_result_base.h for rvv_vls */ +/* including simdjson/generic/numberparsing.h for rvv_vls: #include "simdjson/generic/numberparsing.h" */ +/* begin file simdjson/generic/numberparsing.h for rvv_vls */ +#ifndef SIMDJSON_GENERIC_NUMBERPARSING_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_NUMBERPARSING_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/jsoncharutils.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#include <limits> +#include <ostream> +#include <cstring> + +namespace simdjson { +namespace rvv_vls { +namespace numberparsing { + +#ifdef JSON_TEST_NUMBERS +#define INVALID_NUMBER(SRC) (found_invalid_number((SRC)), NUMBER_ERROR) +#define WRITE_INTEGER(VALUE, SRC, WRITER) (found_integer((VALUE), (SRC)), (WRITER).append_s64((VALUE))) +#define WRITE_UNSIGNED(VALUE, SRC, WRITER) (found_unsigned_integer((VALUE), (SRC)), (WRITER).append_u64((VALUE))) +#define WRITE_DOUBLE(VALUE, SRC, WRITER) (found_float((VALUE), (SRC)), (WRITER).append_double((VALUE))) +#define BIGINT_NUMBER(SRC) (found_invalid_number((SRC)), BIGINT_ERROR) +#else +#define INVALID_NUMBER(SRC) (NUMBER_ERROR) +#define WRITE_INTEGER(VALUE, SRC, WRITER) (WRITER).append_s64((VALUE)) +#define WRITE_UNSIGNED(VALUE, SRC, WRITER) (WRITER).append_u64((VALUE)) +#define WRITE_DOUBLE(VALUE, SRC, WRITER) (WRITER).append_double((VALUE)) +#define BIGINT_NUMBER(SRC) (BIGINT_ERROR) +#endif + +namespace { + +// Convert a mantissa, an exponent and a sign bit into an ieee64 double. +// The real_exponent needs to be in [0, 2046] (technically real_exponent = 2047 would be acceptable). +// The mantissa should be in [0,1<<53). The bit at index (1ULL << 52) while be zeroed. +simdjson_inline double to_double(uint64_t mantissa, uint64_t real_exponent, bool negative) { + double d; + mantissa &= ~(1ULL << 52); + mantissa |= real_exponent << 52; + mantissa |= ((static_cast<uint64_t>(negative)) << 63); + std::memcpy(&d, &mantissa, sizeof(d)); + return d; +} + +// Attempts to compute i * 10^(power) exactly; and if "negative" is +// true, negate the result. +// This function will only work in some cases, when it does not work, success is +// set to false. This should work *most of the time* (like 99% of the time). +// We assume that power is in the [smallest_power, +// largest_power] interval: the caller is responsible for this check. +simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative, double &d) { + // we start with a fast path + // It was described in + // Clinger WD. How to read floating point numbers accurately. + // ACM SIGPLAN Notices. 1990 +#ifndef FLT_EVAL_METHOD +#error "FLT_EVAL_METHOD should be defined, please include cfloat." +#endif +#if (FLT_EVAL_METHOD != 1) && (FLT_EVAL_METHOD != 0) + // We cannot be certain that x/y is rounded to nearest. + if (0 <= power && power <= 22 && i <= 9007199254740991) +#else + if (-22 <= power && power <= 22 && i <= 9007199254740991) +#endif + { + // convert the integer into a double. This is lossless since + // 0 <= i <= 2^53 - 1. + d = double(i); + // + // The general idea is as follows. + // If 0 <= s < 2^53 and if 10^0 <= p <= 10^22 then + // 1) Both s and p can be represented exactly as 64-bit floating-point + // values + // (binary64). + // 2) Because s and p can be represented exactly as floating-point values, + // then s * p + // and s / p will produce correctly rounded values. + // + if (power < 0) { + d = d / simdjson::internal::power_of_ten[-power]; + } else { + d = d * simdjson::internal::power_of_ten[power]; + } + if (negative) { + d = -d; + } + return true; + } + // When 22 < power && power < 22 + 16, we could + // hope for another, secondary fast path. It was + // described by David M. Gay in "Correctly rounded + // binary-decimal and decimal-binary conversions." (1990) + // If you need to compute i * 10^(22 + x) for x < 16, + // first compute i * 10^x, if you know that result is exact + // (e.g., when i * 10^x < 2^53), + // then you can still proceed and do (i * 10^x) * 10^22. + // Is this worth your time? + // You need 22 < power *and* power < 22 + 16 *and* (i * 10^(x-22) < 2^53) + // for this second fast path to work. + // If you you have 22 < power *and* power < 22 + 16, and then you + // optimistically compute "i * 10^(x-22)", there is still a chance that you + // have wasted your time if i * 10^(x-22) >= 2^53. It makes the use cases of + // this optimization maybe less common than we would like. Source: + // http://www.exploringbinary.com/fast-path-decimal-to-floating-point-conversion/ + // also used in RapidJSON: https://rapidjson.org/strtod_8h_source.html + + // The fast path has now failed, so we are failing back on the slower path. + + // In the slow path, we need to adjust i so that it is > 1<<63 which is always + // possible, except if i == 0, so we handle i == 0 separately. + if(i == 0) { + d = negative ? -0.0 : 0.0; + return true; + } + + + // The exponent is 1024 + 63 + power + // + floor(log(5**power)/log(2)). + // The 1024 comes from the ieee64 standard. + // The 63 comes from the fact that we use a 64-bit word. + // + // Computing floor(log(5**power)/log(2)) could be + // slow. Instead we use a fast function. + // + // For power in (-400,350), we have that + // (((152170 + 65536) * power ) >> 16); + // is equal to + // floor(log(5**power)/log(2)) + power when power >= 0 + // and it is equal to + // ceil(log(5**-power)/log(2)) + power when power < 0 + // + // The 65536 is (1<<16) and corresponds to + // (65536 * power) >> 16 ---> power + // + // ((152170 * power ) >> 16) is equal to + // floor(log(5**power)/log(2)) + // + // Note that this is not magic: 152170/(1<<16) is + // approximately equal to log(5)/log(2). + // The 1<<16 value is a power of two; we could use a + // larger power of 2 if we wanted to. + // + int64_t exponent = (((152170 + 65536) * power) >> 16) + 1024 + 63; + + + // We want the most significant bit of i to be 1. Shift if needed. + int lz = leading_zeroes(i); + i <<= lz; + + + // We are going to need to do some 64-bit arithmetic to get a precise product. + // We use a table lookup approach. + // It is safe because + // power >= smallest_power + // and power <= largest_power + // We recover the mantissa of the power, it has a leading 1. It is always + // rounded down. + // + // We want the most significant 64 bits of the product. We know + // this will be non-zero because the most significant bit of i is + // 1. + const uint32_t index = 2 * uint32_t(power - simdjson::internal::smallest_power); + // Optimization: It may be that materializing the index as a variable might confuse some compilers and prevent effective complex-addressing loads. (Done for code clarity.) + // + // The full_multiplication function computes the 128-bit product of two 64-bit words + // with a returned value of type value128 with a "low component" corresponding to the + // 64-bit least significant bits of the product and with a "high component" corresponding + // to the 64-bit most significant bits of the product. +#if SIMDJSON_STATIC_REFLECTION + simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index]); +#else + simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]); +#endif + + // Both i and power_of_five_128[index] have their most significant bit set to 1 which + // implies that the either the most or the second most significant bit of the product + // is 1. We pack values in this manner for efficiency reasons: it maximizes the use + // we make of the product. It also makes it easy to reason about the product: there + // is 0 or 1 leading zero in the product. + + // Unless the least significant 9 bits of the high (64-bit) part of the full + // product are all 1s, then we know that the most significant 55 bits are + // exact and no further work is needed. Having 55 bits is necessary because + // we need 53 bits for the mantissa but we have to have one rounding bit and + // we can waste a bit if the most significant bit of the product is zero. + if((firstproduct.high & 0x1FF) == 0x1FF) { + // We want to compute i * 5^q, but only care about the top 55 bits at most. + // Consider the scenario where q>=0. Then 5^q may not fit in 64-bits. Doing + // the full computation is wasteful. So we do what is called a "truncated + // multiplication". + // We take the most significant 64-bits, and we put them in + // power_of_five_128[index]. Usually, that's good enough to approximate i * 5^q + // to the desired approximation using one multiplication. Sometimes it does not suffice. + // Then we store the next most significant 64 bits in power_of_five_128[index + 1], and + // then we get a better approximation to i * 5^q. + // + // That's for when q>=0. The logic for q<0 is somewhat similar but it is somewhat + // more complicated. + // + // There is an extra layer of complexity in that we need more than 55 bits of + // accuracy in the round-to-even scenario. + // + // The full_multiplication function computes the 128-bit product of two 64-bit words + // with a returned value of type value128 with a "low component" corresponding to the + // 64-bit least significant bits of the product and with a "high component" corresponding + // to the 64-bit most significant bits of the product. +#if SIMDJSON_STATIC_REFLECTION + simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index + 1]); +#else + simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]); +#endif + firstproduct.low += secondproduct.high; + if(secondproduct.high > firstproduct.low) { firstproduct.high++; } + // As it has been proven by Noble Mushtak and Daniel Lemire in "Fast Number Parsing Without + // Fallback" (https://arxiv.org/abs/2212.06644), at this point we are sure that the product + // is sufficiently accurate, and more computation is not needed. + } + uint64_t lower = firstproduct.low; + uint64_t upper = firstproduct.high; + // The final mantissa should be 53 bits with a leading 1. + // We shift it so that it occupies 54 bits with a leading 1. + /////// + uint64_t upperbit = upper >> 63; + uint64_t mantissa = upper >> (upperbit + 9); + lz += int(1 ^ upperbit); + + // Here we have mantissa < (1<<54). + int64_t real_exponent = exponent - lz; + if (simdjson_unlikely(real_exponent <= 0)) { // we have a subnormal? + // Here have that real_exponent <= 0 so -real_exponent >= 0 + if(-real_exponent + 1 >= 64) { // if we have more than 64 bits below the minimum exponent, you have a zero for sure. + d = negative ? -0.0 : 0.0; + return true; + } + // next line is safe because -real_exponent + 1 < 0 + mantissa >>= -real_exponent + 1; + // Thankfully, we can't have both "round-to-even" and subnormals because + // "round-to-even" only occurs for powers close to 0. + mantissa += (mantissa & 1); // round up + mantissa >>= 1; + // There is a weird scenario where we don't have a subnormal but just. + // Suppose we start with 2.2250738585072013e-308, we end up + // with 0x3fffffffffffff x 2^-1023-53 which is technically subnormal + // whereas 0x40000000000000 x 2^-1023-53 is normal. Now, we need to round + // up 0x3fffffffffffff x 2^-1023-53 and once we do, we are no longer + // subnormal, but we can only know this after rounding. + // So we only declare a subnormal if we are smaller than the threshold. + real_exponent = (mantissa < (uint64_t(1) << 52)) ? 0 : 1; + d = to_double(mantissa, real_exponent, negative); + return true; + } + // We have to round to even. The "to even" part + // is only a problem when we are right in between two floats + // which we guard against. + // If we have lots of trailing zeros, we may fall right between two + // floating-point values. + // + // The round-to-even cases take the form of a number 2m+1 which is in (2^53,2^54] + // times a power of two. That is, it is right between a number with binary significand + // m and another number with binary significand m+1; and it must be the case + // that it cannot be represented by a float itself. + // + // We must have that w * 10 ^q == (2m+1) * 2^p for some power of two 2^p. + // Recall that 10^q = 5^q * 2^q. + // When q >= 0, we must have that (2m+1) is divible by 5^q, so 5^q <= 2^54. We have that + // 5^23 <= 2^54 and it is the last power of five to qualify, so q <= 23. + // When q<0, we have w >= (2m+1) x 5^{-q}. We must have that w<2^{64} so + // (2m+1) x 5^{-q} < 2^{64}. We have that 2m+1>2^{53}. Hence, we must have + // 2^{53} x 5^{-q} < 2^{64}. + // Hence we have 5^{-q} < 2^{11}$ or q>= -4. + // + // We require lower <= 1 and not lower == 0 because we could not prove that + // that lower == 0 is implied; but we could prove that lower <= 1 is a necessary and sufficient test. + if (simdjson_unlikely((lower <= 1) && (power >= -4) && (power <= 23) && ((mantissa & 3) == 1))) { + if((mantissa << (upperbit + 64 - 53 - 2)) == upper) { + mantissa &= ~1; // flip it so that we do not round up + } + } + + mantissa += mantissa & 1; + mantissa >>= 1; + + // Here we have mantissa < (1<<53), unless there was an overflow + if (mantissa >= (1ULL << 53)) { + ////////// + // This will happen when parsing values such as 7.2057594037927933e+16 + //////// + mantissa = (1ULL << 52); + real_exponent++; + } + mantissa &= ~(1ULL << 52); + // we have to check that real_exponent is in range, otherwise we bail out + if (simdjson_unlikely(real_exponent > 2046)) { + // We have an infinite value!!! We could actually throw an error here if we could. + return false; + } + d = to_double(mantissa, real_exponent, negative); + return true; +} + +// We call a fallback floating-point parser that might be slow. Note +// it will accept JSON numbers, but the JSON spec. is more restrictive so +// before you call parse_float_fallback, you need to have validated the input +// string with the JSON grammar. +// It will return an error (false) if the parsed number is infinite. +// The string parsing itself always succeeds. We know that there is at least +// one digit. +static bool parse_float_fallback(const uint8_t *ptr, double *outDouble) { + *outDouble = simdjson::internal::from_chars(reinterpret_cast<const char *>(ptr)); + // We do not accept infinite values. + + // Detecting finite values in a portable manner is ridiculously hard, ideally + // we would want to do: + // return !std::isfinite(*outDouble); + // but that mysteriously fails under legacy/old libc++ libraries, see + // https://github.com/simdjson/simdjson/issues/1286 + // + // Therefore, fall back to this solution (the extra parens are there + // to handle that max may be a macro on windows). + return !(*outDouble > (std::numeric_limits<double>::max)() || *outDouble < std::numeric_limits<double>::lowest()); +} + +static bool parse_float_fallback(const uint8_t *ptr, const uint8_t *end_ptr, double *outDouble) { + *outDouble = simdjson::internal::from_chars(reinterpret_cast<const char *>(ptr), reinterpret_cast<const char *>(end_ptr)); + // We do not accept infinite values. + + // Detecting finite values in a portable manner is ridiculously hard, ideally + // we would want to do: + // return !std::isfinite(*outDouble); + // but that mysteriously fails under legacy/old libc++ libraries, see + // https://github.com/simdjson/simdjson/issues/1286 + // + // Therefore, fall back to this solution (the extra parens are there + // to handle that max may be a macro on windows). + return !(*outDouble > (std::numeric_limits<double>::max)() || *outDouble < std::numeric_limits<double>::lowest()); +} + +// check quickly whether the next 8 chars are made of digits +// at a glance, it looks better than Mula's +// http://0x80.pl/articles/swar-digits-validate.html +simdjson_inline bool is_made_of_eight_digits_fast(const uint8_t *chars) { + uint64_t val; + // this can read up to 7 bytes beyond the buffer size, but we require + // SIMDJSON_PADDING of padding + static_assert(7 <= SIMDJSON_PADDING, "SIMDJSON_PADDING must be bigger than 7"); + std::memcpy(&val, chars, 8); + // a branchy method might be faster: + // return (( val & 0xF0F0F0F0F0F0F0F0 ) == 0x3030303030303030) + // && (( (val + 0x0606060606060606) & 0xF0F0F0F0F0F0F0F0 ) == + // 0x3030303030303030); + return (((val & 0xF0F0F0F0F0F0F0F0) | + (((val + 0x0606060606060606) & 0xF0F0F0F0F0F0F0F0) >> 4)) == + 0x3333333333333333); +} + +template<typename I> +SIMDJSON_NO_SANITIZE_UNDEFINED // We deliberately allow overflow here and check later +simdjson_inline bool parse_digit(const uint8_t c, I &i) { + const uint8_t digit = static_cast<uint8_t>(c - '0'); + if (digit > 9) { + return false; + } + // PERF NOTE: multiplication by 10 is cheaper than arbitrary integer multiplication + i = 10 * i + digit; // might overflow, we will handle the overflow later + return true; +} + +simdjson_inline bool is_digit(const uint8_t c) { + return static_cast<uint8_t>(c - '0') <= 9; +} + +simdjson_warn_unused simdjson_inline error_code parse_decimal_after_separator(simdjson_unused const uint8_t *const src, const uint8_t *&p, uint64_t &i, int64_t &exponent) { + // we continue with the fiction that we have an integer. If the + // floating point number is representable as x * 10^z for some integer + // z that fits in 53 bits, then we will be able to convert back the + // the integer into a float in a lossless manner. + const uint8_t *const first_after_period = p; + +#ifdef SIMDJSON_SWAR_NUMBER_PARSING +#if SIMDJSON_SWAR_NUMBER_PARSING + // this helps if we have lots of decimals! + // this turns out to be frequent enough. + if (is_made_of_eight_digits_fast(p)) { + i = i * 100000000 + parse_eight_digits_unrolled(p); + p += 8; + } +#endif // SIMDJSON_SWAR_NUMBER_PARSING +#endif // #ifdef SIMDJSON_SWAR_NUMBER_PARSING + // Unrolling the first digit makes a small difference on some implementations (e.g. westmere) + if (parse_digit(*p, i)) { ++p; } + while (parse_digit(*p, i)) { p++; } + exponent = first_after_period - p; + // Decimal without digits (123.) is illegal + if (exponent == 0) { + return INVALID_NUMBER(src); + } + return SUCCESS; +} + +simdjson_warn_unused simdjson_inline error_code parse_exponent(simdjson_unused const uint8_t *const src, const uint8_t *&p, int64_t &exponent) { + // Exp Sign: -123.456e[-]78 + bool neg_exp = ('-' == *p); + if (neg_exp || '+' == *p) { p++; } // Skip + as well + + // Exponent: -123.456e-[78] + auto start_exp = p; + int64_t exp_number = 0; + while (parse_digit(*p, exp_number)) { ++p; } + // It is possible for parse_digit to overflow. + // In particular, it could overflow to INT64_MIN, and we cannot do - INT64_MIN. + // Thus we *must* check for possible overflow before we negate exp_number. + + // Performance notes: it may seem like combining the two "simdjson_unlikely checks" below into + // a single simdjson_unlikely path would be faster. The reasoning is sound, but the compiler may + // not oblige and may, in fact, generate two distinct paths in any case. It might be + // possible to do uint64_t(p - start_exp - 1) >= 18 but it could end up trading off + // instructions for a simdjson_likely branch, an unconclusive gain. + + // If there were no digits, it's an error. + if (simdjson_unlikely(p == start_exp)) { + return INVALID_NUMBER(src); + } + // We have a valid positive exponent in exp_number at this point, except that + // it may have overflowed. + + // If there were more than 18 digits, we may have overflowed the integer. We have to do + // something!!!! + if (simdjson_unlikely(p > start_exp+18)) { + // Skip leading zeroes: 1e000000000000000000001 is technically valid and does not overflow + while (*start_exp == '0') { start_exp++; } + // 19 digits could overflow int64_t and is kind of absurd anyway. We don't + // support exponents smaller than -999,999,999,999,999,999 and bigger + // than 999,999,999,999,999,999. + // We can truncate. + // Note that 999999999999999999 is assuredly too large. The maximal ieee64 value before + // infinity is ~1.8e308. The smallest subnormal is ~5e-324. So, actually, we could + // truncate at 324. + // Note that there is no reason to fail per se at this point in time. + // E.g., 0e999999999999999999999 is a fine number. + if (p > start_exp+18) { exp_number = 999999999999999999; } + } + // At this point, we know that exp_number is a sane, positive, signed integer. + // It is <= 999,999,999,999,999,999. As long as 'exponent' is in + // [-8223372036854775808, 8223372036854775808], we won't overflow. Because 'exponent' + // is bounded in magnitude by the size of the JSON input, we are fine in this universe. + // To sum it up: the next line should never overflow. + exponent += (neg_exp ? -exp_number : exp_number); + return SUCCESS; +} + +simdjson_inline bool check_if_integer(const uint8_t *const src, size_t max_length) { + const uint8_t *const srcend = src + max_length; + bool negative = (*src == '-'); // we can always read at least one character after the '-' + const uint8_t *p = src + uint8_t(negative); + if(p == srcend) { return false; } + if(*p == '0') { + ++p; + if(p == srcend) { return true; } + if(jsoncharutils::is_not_structural_or_whitespace(*p)) { return false; } + return true; + } + while(p != srcend && is_digit(*p)) { ++p; } + if(p == srcend) { return true; } + if(jsoncharutils::is_not_structural_or_whitespace(*p)) { return false; } + return true; +} + +simdjson_inline size_t significant_digits(const uint8_t * start_digits, size_t digit_count) { + // It is possible that the integer had an overflow. + // We have to handle the case where we have 0.0000somenumber. + const uint8_t *start = start_digits; + while ((*start == '0') || (*start == '.')) { ++start; } + // we over-decrement by one when there is a '.' + return digit_count - size_t(start - start_digits); +} + +} // unnamed namespace + +/** @private */ +static error_code slow_float_parsing(simdjson_unused const uint8_t * src, double* answer) { + if (parse_float_fallback(src, answer)) { + return SUCCESS; + } + return INVALID_NUMBER(src); +} + +/** @private */ +template<typename W> +simdjson_warn_unused simdjson_inline error_code write_float(const uint8_t *const src, bool negative, uint64_t i, const uint8_t * start_digits, size_t digit_count, int64_t exponent, W &writer) { + // If we frequently had to deal with long strings of digits, + // we could extend our code by using a 128-bit integer instead + // of a 64-bit integer. However, this is uncommon in practice. + // + // 9999999999999999999 < 2**64 so we can accommodate 19 digits. + // If we have a decimal separator, then digit_count - 1 is the number of digits, but we + // may not have a decimal separator! + if (simdjson_unlikely(digit_count > 19 && significant_digits(start_digits, digit_count) > 19)) { + // Ok, chances are good that we had an overflow! + // this is almost never going to get called!!! + // we start anew, going slowly!!! + // This will happen in the following examples: + // 10000000000000000000000000000000000000000000e+308 + // 3.1415926535897932384626433832795028841971693993751 + // + // NOTE: We do not pass a reference to the to slow_float_parsing. If we passed our writer + // reference to it, it would force it to be stored in memory, preventing the compiler from + // picking it apart and putting into registers. i.e. if we pass it as reference, + // it gets slow. + double d; + error_code error = slow_float_parsing(src, &d); + writer.append_double(d); + return error; + } + // NOTE: it's weird that the simdjson_unlikely() only wraps half the if, but it seems to get slower any other + // way we've tried: https://github.com/simdjson/simdjson/pull/990#discussion_r448497331 + // To future reader: we'd love if someone found a better way, or at least could explain this result! + if (simdjson_unlikely(exponent < simdjson::internal::smallest_power) || (exponent > simdjson::internal::largest_power)) { + // + // Important: smallest_power is such that it leads to a zero value. + // Observe that 18446744073709551615e-343 == 0, i.e. (2**64 - 1) e -343 is zero + // so something x 10^-343 goes to zero, but not so with something x 10^-342. + static_assert(simdjson::internal::smallest_power <= -342, "smallest_power is not small enough"); + // + if((exponent < simdjson::internal::smallest_power) || (i == 0)) { + // E.g. Parse "-0.0e-999" into the same value as "-0.0". See https://en.wikipedia.org/wiki/Signed_zero + WRITE_DOUBLE(negative ? -0.0 : 0.0, src, writer); + return SUCCESS; + } else { // (exponent > largest_power) and (i != 0) + // We have, for sure, an infinite value and simdjson refuses to parse infinite values. + return INVALID_NUMBER(src); + } + } + double d; + if (!compute_float_64(exponent, i, negative, d)) { + // we are almost never going to get here. + if (!parse_float_fallback(src, &d)) { return INVALID_NUMBER(src); } + } + WRITE_DOUBLE(d, src, writer); + return SUCCESS; +} + +// parse the number at src +// define JSON_TEST_NUMBERS for unit testing +// +// It is assumed that the number is followed by a structural ({,},],[) character +// or a white space character. If that is not the case (e.g., when the JSON +// document is made of a single number), then it is necessary to copy the +// content and append a space before calling this function. +// +// Our objective is accurate parsing (ULP of 0) at high speed. +template<typename W> +simdjson_warn_unused simdjson_inline error_code parse_number(const uint8_t *const src, W &writer); + +// for performance analysis, it is sometimes useful to skip parsing +#ifdef SIMDJSON_SKIPNUMBERPARSING + +template<typename W> +simdjson_warn_unused simdjson_inline error_code parse_number(const uint8_t *const, W &writer) { + writer.append_s64(0); // always write zero + return SUCCESS; // always succeeds +} + +simdjson_unused simdjson_inline simdjson_result<uint64_t> parse_unsigned(const uint8_t * const src) noexcept { return 0; } +simdjson_unused simdjson_inline simdjson_result<int64_t> parse_integer(const uint8_t * const src) noexcept { return 0; } +simdjson_unused simdjson_inline simdjson_result<double> parse_double(const uint8_t * const src) noexcept { return 0; } +simdjson_unused simdjson_inline simdjson_result<uint64_t> parse_unsigned_in_string(const uint8_t * const src) noexcept { return 0; } +simdjson_unused simdjson_inline simdjson_result<int64_t> parse_integer_in_string(const uint8_t * const src) noexcept { return 0; } +simdjson_unused simdjson_inline simdjson_result<double> parse_double_in_string(const uint8_t * const src) noexcept { return 0; } +simdjson_unused simdjson_inline bool is_negative(const uint8_t * src) noexcept { return false; } +simdjson_unused simdjson_inline simdjson_result<bool> is_integer(const uint8_t * src) noexcept { return false; } +simdjson_unused simdjson_inline simdjson_result<number_type> get_number_type(const uint8_t * src) noexcept { return number_type::signed_integer; } +#else + +// parse the number at src +// define JSON_TEST_NUMBERS for unit testing +// +// It is assumed that the number is followed by a structural ({,},],[) character +// or a white space character. If that is not the case (e.g., when the JSON +// document is made of a single number), then it is necessary to copy the +// content and append a space before calling this function. +// +// Our objective is accurate parsing (ULP of 0) at high speed. +template<typename W> +simdjson_warn_unused simdjson_inline error_code parse_number(const uint8_t *const src, W &writer) { + // + // Check for minus sign + // + bool negative = (*src == '-'); + const uint8_t *p = src + uint8_t(negative); + + // + // Parse the integer part. + // + // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare + const uint8_t *const start_digits = p; + uint64_t i = 0; + while (parse_digit(*p, i)) { p++; } + + // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error. + // Optimization note: size_t is expected to be unsigned. + size_t digit_count = size_t(p - start_digits); + if (digit_count == 0 || ('0' == *start_digits && digit_count > 1)) { return INVALID_NUMBER(src); } + + // + // Handle floats if there is a . or e (or both) + // + int64_t exponent = 0; + bool is_float = false; + if ('.' == *p) { + is_float = true; + ++p; + SIMDJSON_TRY( parse_decimal_after_separator(src, p, i, exponent) ); + digit_count = int(p - start_digits); // used later to guard against overflows + } + if (('e' == *p) || ('E' == *p)) { + is_float = true; + ++p; + SIMDJSON_TRY( parse_exponent(src, p, exponent) ); + } + if (is_float) { + const bool dirty_end = jsoncharutils::is_not_structural_or_whitespace(*p); + SIMDJSON_TRY( write_float(src, negative, i, start_digits, digit_count, exponent, writer) ); + if (dirty_end) { return INVALID_NUMBER(src); } + return SUCCESS; + } + + // The longest negative 64-bit number is 19 digits. + // The longest positive 64-bit number is 20 digits. + // We do it this way so we don't trigger this branch unless we must. + size_t longest_digit_count = negative ? 19 : 20; + if (digit_count > longest_digit_count) { return BIGINT_NUMBER(src); } + if (digit_count == longest_digit_count) { + if (negative) { + // Anything negative above INT64_MAX+1 is invalid + if (i > uint64_t(INT64_MAX)+1) { return BIGINT_NUMBER(src); } + WRITE_INTEGER(~i+1, src, writer); + if (jsoncharutils::is_not_structural_or_whitespace(*p)) { return INVALID_NUMBER(src); } + return SUCCESS; + // Positive overflow check: + // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the + // biggest uint64_t. + // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX. + // If we got here, it's a 20 digit number starting with the digit "1". + // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller + // than 1,553,255,926,290,448,384. + // - That is smaller than the smallest possible 20-digit number the user could write: + // 10,000,000,000,000,000,000. + // - Therefore, if the number is positive and lower than that, it's overflow. + // - The value we are looking at is less than or equal to INT64_MAX. + // + } else if (src[0] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INVALID_NUMBER(src); } + } + + // Write unsigned if it does not fit in a signed integer. + if (i > uint64_t(INT64_MAX)) { + WRITE_UNSIGNED(i, src, writer); + } else { +#if SIMDJSON_MINUS_ZERO_AS_FLOAT + if(i == 0 && negative) { + // We have to write -0.0 instead of 0 + WRITE_DOUBLE(-0.0, src, writer); + } else { + WRITE_INTEGER(negative ? (~i+1) : i, src, writer); + } +#else + WRITE_INTEGER(negative ? (~i+1) : i, src, writer); +#endif + } + if (jsoncharutils::is_not_structural_or_whitespace(*p)) { return INVALID_NUMBER(src); } + return SUCCESS; +} + +// Inlineable functions +namespace { + +// This table can be used to characterize the final character of an integer +// string. For JSON structural character and allowable white space characters, +// we return SUCCESS. For 'e', '.' and 'E', we return INCORRECT_TYPE. Otherwise +// we return NUMBER_ERROR. +// Optimization note: we could easily reduce the size of the table by half (to 128) +// at the cost of an extra branch. +// Optimization note: we want the values to use at most 8 bits (not, e.g., 32 bits): +static_assert(error_code(uint8_t(NUMBER_ERROR))== NUMBER_ERROR, "bad NUMBER_ERROR cast"); +static_assert(error_code(uint8_t(SUCCESS))== SUCCESS, "bad NUMBER_ERROR cast"); +static_assert(error_code(uint8_t(INCORRECT_TYPE))== INCORRECT_TYPE, "bad NUMBER_ERROR cast"); + +const uint8_t integer_string_finisher[256] = { + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, SUCCESS, + SUCCESS, NUMBER_ERROR, NUMBER_ERROR, SUCCESS, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, SUCCESS, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, SUCCESS, + NUMBER_ERROR, INCORRECT_TYPE, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, SUCCESS, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, INCORRECT_TYPE, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, SUCCESS, NUMBER_ERROR, SUCCESS, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, INCORRECT_TYPE, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, SUCCESS, NUMBER_ERROR, + SUCCESS, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR, + NUMBER_ERROR}; + +// Parse any number from 0 to 18,446,744,073,709,551,615 +simdjson_unused simdjson_inline simdjson_result<uint64_t> parse_unsigned(const uint8_t * const src) noexcept { + const uint8_t *p = src; + // + // Parse the integer part. + // + // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare + const uint8_t *const start_digits = p; + uint64_t i = 0; + while (parse_digit(*p, i)) { p++; } + + // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error. + // Optimization note: size_t is expected to be unsigned. + size_t digit_count = size_t(p - start_digits); + // The longest positive 64-bit number is 20 digits. + // We do it this way so we don't trigger this branch unless we must. + // Optimization note: the compiler can probably merge + // ((digit_count == 0) || (digit_count > 20)) + // into a single branch since digit_count is unsigned. + if ((digit_count == 0) || (digit_count > 20)) { return INCORRECT_TYPE; } + // Here digit_count > 0. + if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; } + // We can do the following... + // if (!jsoncharutils::is_structural_or_whitespace(*p)) { + // return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR; + // } + // as a single table lookup: + if (integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); } + + if (digit_count == 20) { + // Positive overflow check: + // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the + // biggest uint64_t. + // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX. + // If we got here, it's a 20 digit number starting with the digit "1". + // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller + // than 1,553,255,926,290,448,384. + // - That is smaller than the smallest possible 20-digit number the user could write: + // 10,000,000,000,000,000,000. + // - Therefore, if the number is positive and lower than that, it's overflow. + // - The value we are looking at is less than or equal to INT64_MAX. + // + if (src[0] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INCORRECT_TYPE; } + } + + return i; +} + + +// Parse any number from 0 to 18,446,744,073,709,551,615 +// Never read at src_end or beyond +simdjson_unused simdjson_inline simdjson_result<uint64_t> parse_unsigned(const uint8_t * const src, const uint8_t * const src_end) noexcept { + const uint8_t *p = src; + // + // Parse the integer part. + // + // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare + const uint8_t *const start_digits = p; + uint64_t i = 0; + while ((p != src_end) && parse_digit(*p, i)) { p++; } + + // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error. + // Optimization note: size_t is expected to be unsigned. + size_t digit_count = size_t(p - start_digits); + // The longest positive 64-bit number is 20 digits. + // We do it this way so we don't trigger this branch unless we must. + // Optimization note: the compiler can probably merge + // ((digit_count == 0) || (digit_count > 20)) + // into a single branch since digit_count is unsigned. + if ((digit_count == 0) || (digit_count > 20)) { return INCORRECT_TYPE; } + // Here digit_count > 0. + if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; } + // We can do the following... + // if (!jsoncharutils::is_structural_or_whitespace(*p)) { + // return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR; + // } + // as a single table lookup: + if ((p != src_end) && integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); } + + if (digit_count == 20) { + // Positive overflow check: + // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the + // biggest uint64_t. + // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX. + // If we got here, it's a 20 digit number starting with the digit "1". + // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller + // than 1,553,255,926,290,448,384. + // - That is smaller than the smallest possible 20-digit number the user could write: + // 10,000,000,000,000,000,000. + // - Therefore, if the number is positive and lower than that, it's overflow. + // - The value we are looking at is less than or equal to INT64_MAX. + // + if (src[0] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INCORRECT_TYPE; } + } + + return i; +} + +// Parse any number from 0 to 18,446,744,073,709,551,615 +simdjson_unused simdjson_inline simdjson_result<uint64_t> parse_unsigned_in_string(const uint8_t * const src) noexcept { + const uint8_t *p = src + 1; + // + // Parse the integer part. + // + // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare + const uint8_t *const start_digits = p; + uint64_t i = 0; + while (parse_digit(*p, i)) { p++; } + + // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error. + // Optimization note: size_t is expected to be unsigned. + size_t digit_count = size_t(p - start_digits); + // The longest positive 64-bit number is 20 digits. + // We do it this way so we don't trigger this branch unless we must. + // Optimization note: the compiler can probably merge + // ((digit_count == 0) || (digit_count > 20)) + // into a single branch since digit_count is unsigned. + if ((digit_count == 0) || (digit_count > 20)) { return INCORRECT_TYPE; } + // Here digit_count > 0. + if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; } + // We can do the following... + // if (!jsoncharutils::is_structural_or_whitespace(*p)) { + // return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR; + // } + // as a single table lookup: + if (*p != '"') { return NUMBER_ERROR; } + + if (digit_count == 20) { + // Positive overflow check: + // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the + // biggest uint64_t. + // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX. + // If we got here, it's a 20 digit number starting with the digit "1". + // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller + // than 1,553,255,926,290,448,384. + // - That is smaller than the smallest possible 20-digit number the user could write: + // 10,000,000,000,000,000,000. + // - Therefore, if the number is positive and lower than that, it's overflow. + // - The value we are looking at is less than or equal to INT64_MAX. + // + // Note: we use src[1] and not src[0] because src[0] is the quote character in this + // instance. + if (src[1] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INCORRECT_TYPE; } + } + + return i; +} + +// Parse any number from -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 +simdjson_unused simdjson_inline simdjson_result<int64_t> parse_integer(const uint8_t *src) noexcept { + // + // Check for minus sign + // + bool negative = (*src == '-'); + const uint8_t *p = src + uint8_t(negative); + + // + // Parse the integer part. + // + // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare + const uint8_t *const start_digits = p; + uint64_t i = 0; + while (parse_digit(*p, i)) { p++; } + + // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error. + // Optimization note: size_t is expected to be unsigned. + size_t digit_count = size_t(p - start_digits); + // We go from + // -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 + // so we can never represent numbers that have more than 19 digits. + size_t longest_digit_count = 19; + // Optimization note: the compiler can probably merge + // ((digit_count == 0) || (digit_count > longest_digit_count)) + // into a single branch since digit_count is unsigned. + if ((digit_count == 0) || (digit_count > longest_digit_count)) { return INCORRECT_TYPE; } + // Here digit_count > 0. + if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; } + // We can do the following... + // if (!jsoncharutils::is_structural_or_whitespace(*p)) { + // return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR; + // } + // as a single table lookup: + if(integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); } + // Negative numbers have can go down to - INT64_MAX - 1 whereas positive numbers are limited to INT64_MAX. + // Performance note: This check is only needed when digit_count == longest_digit_count but it is + // so cheap that we might as well always make it. + if(i > uint64_t(INT64_MAX) + uint64_t(negative)) { return INCORRECT_TYPE; } + return negative ? (~i+1) : i; +} + +// Parse any number from -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 +// Never read at src_end or beyond +simdjson_unused simdjson_inline simdjson_result<int64_t> parse_integer(const uint8_t * const src, const uint8_t * const src_end) noexcept { + // + // Check for minus sign + // + if(src == src_end) { return NUMBER_ERROR; } + bool negative = (*src == '-'); + const uint8_t *p = src + uint8_t(negative); + + // + // Parse the integer part. + // + // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare + const uint8_t *const start_digits = p; + uint64_t i = 0; + while ((p != src_end) && parse_digit(*p, i)) { p++; } + + // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error. + // Optimization note: size_t is expected to be unsigned. + size_t digit_count = size_t(p - start_digits); + // We go from + // -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 + // so we can never represent numbers that have more than 19 digits. + size_t longest_digit_count = 19; + // Optimization note: the compiler can probably merge + // ((digit_count == 0) || (digit_count > longest_digit_count)) + // into a single branch since digit_count is unsigned. + if ((digit_count == 0) || (digit_count > longest_digit_count)) { return INCORRECT_TYPE; } + // Here digit_count > 0. + if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; } + // We can do the following... + // if (!jsoncharutils::is_structural_or_whitespace(*p)) { + // return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR; + // } + // as a single table lookup: + if((p != src_end) && integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); } + // Negative numbers have can go down to - INT64_MAX - 1 whereas positive numbers are limited to INT64_MAX. + // Performance note: This check is only needed when digit_count == longest_digit_count but it is + // so cheap that we might as well always make it. + if(i > uint64_t(INT64_MAX) + uint64_t(negative)) { return INCORRECT_TYPE; } + return negative ? (~i+1) : i; +} + +// Parse any number from -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 +simdjson_unused simdjson_inline simdjson_result<int64_t> parse_integer_in_string(const uint8_t *src) noexcept { + // + // Check for minus sign + // + bool negative = (*(src + 1) == '-'); + src += uint8_t(negative) + 1; + + // + // Parse the integer part. + // + // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare + const uint8_t *const start_digits = src; + uint64_t i = 0; + while (parse_digit(*src, i)) { src++; } + + // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error. + // Optimization note: size_t is expected to be unsigned. + size_t digit_count = size_t(src - start_digits); + // We go from + // -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 + // so we can never represent numbers that have more than 19 digits. + size_t longest_digit_count = 19; + // Optimization note: the compiler can probably merge + // ((digit_count == 0) || (digit_count > longest_digit_count)) + // into a single branch since digit_count is unsigned. + if ((digit_count == 0) || (digit_count > longest_digit_count)) { return INCORRECT_TYPE; } + // Here digit_count > 0. + if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; } + // We can do the following... + // if (!jsoncharutils::is_structural_or_whitespace(*src)) { + // return (*src == '.' || *src == 'e' || *src == 'E') ? INCORRECT_TYPE : NUMBER_ERROR; + // } + // as a single table lookup: + if(*src != '"') { return NUMBER_ERROR; } + // Negative numbers have can go down to - INT64_MAX - 1 whereas positive numbers are limited to INT64_MAX. + // Performance note: This check is only needed when digit_count == longest_digit_count but it is + // so cheap that we might as well always make it. + if(i > uint64_t(INT64_MAX) + uint64_t(negative)) { return INCORRECT_TYPE; } + return negative ? (~i+1) : i; +} + +simdjson_unused simdjson_inline simdjson_result<double> parse_double(const uint8_t * src) noexcept { + // + // Check for minus sign + // + bool negative = (*src == '-'); + src += uint8_t(negative); + + // + // Parse the integer part. + // + uint64_t i = 0; + const uint8_t *p = src; + p += parse_digit(*p, i); + bool leading_zero = (i == 0); + while (parse_digit(*p, i)) { p++; } + // no integer digits, or 0123 (zero must be solo) + if ( p == src ) { return INCORRECT_TYPE; } + if ( (leading_zero && p != src+1)) { return NUMBER_ERROR; } + + // + // Parse the decimal part. + // + int64_t exponent = 0; + bool overflow; + if (simdjson_likely(*p == '.')) { + p++; + const uint8_t *start_decimal_digits = p; + if (!parse_digit(*p, i)) { return NUMBER_ERROR; } // no decimal digits + p++; + while (parse_digit(*p, i)) { p++; } + exponent = -(p - start_decimal_digits); + + // Overflow check. More than 19 digits (minus the decimal) may be overflow. + overflow = p-src-1 > 19; + if (simdjson_unlikely(overflow && leading_zero)) { + // Skip leading 0.00000 and see if it still overflows + const uint8_t *start_digits = src + 2; + while (*start_digits == '0') { start_digits++; } + overflow = p-start_digits > 19; + } + } else { + overflow = p-src > 19; + } + + // + // Parse the exponent + // + if (*p == 'e' || *p == 'E') { + p++; + bool exp_neg = *p == '-'; + p += exp_neg || *p == '+'; + + uint64_t exp = 0; + const uint8_t *start_exp_digits = p; + while (parse_digit(*p, exp)) { p++; } + // no exp digits, or 20+ exp digits + if (p-start_exp_digits == 0 || p-start_exp_digits > 19) { return NUMBER_ERROR; } + + exponent += exp_neg ? 0-exp : exp; + } + + if (jsoncharutils::is_not_structural_or_whitespace(*p)) { return NUMBER_ERROR; } + + overflow = overflow || exponent < simdjson::internal::smallest_power || exponent > simdjson::internal::largest_power; + + // + // Assemble (or slow-parse) the float + // + double d; + if (simdjson_likely(!overflow)) { + if (compute_float_64(exponent, i, negative, d)) { return d; } + } + if (!parse_float_fallback(src - uint8_t(negative), &d)) { + return NUMBER_ERROR; + } + return d; +} + +simdjson_unused simdjson_inline bool is_negative(const uint8_t * src) noexcept { + return (*src == '-'); +} + +simdjson_unused simdjson_inline simdjson_result<bool> is_integer(const uint8_t * src) noexcept { + bool negative = (*src == '-'); + src += uint8_t(negative); + const uint8_t *p = src; + while(static_cast<uint8_t>(*p - '0') <= 9) { p++; } + if ( p == src ) { return NUMBER_ERROR; } + if (jsoncharutils::is_structural_or_whitespace(*p)) { return true; } + return false; +} + +simdjson_unused simdjson_inline simdjson_result<number_type> get_number_type(const uint8_t * src) noexcept { + bool negative = (*src == '-'); + src += uint8_t(negative); + const uint8_t *p = src; + while(static_cast<uint8_t>(*p - '0') <= 9) { p++; } + size_t digit_count = size_t(p - src); + if ( p == src ) { return NUMBER_ERROR; } + if (jsoncharutils::is_structural_or_whitespace(*p)) { + static const uint8_t * smaller_big_integer = reinterpret_cast<const uint8_t *>("9223372036854775808"); + // We have an integer. + if(simdjson_unlikely(digit_count > 20)) { + return number_type::big_integer; + } + // If the number is negative and valid, it must be a signed integer. + if(negative) { + if (simdjson_unlikely(digit_count > 19)) return number_type::big_integer; + if (simdjson_unlikely(digit_count == 19 && memcmp(src, smaller_big_integer, 19) > 0)) { + return number_type::big_integer; + } +#if SIMDJSON_MINUS_ZERO_AS_FLOAT + if(digit_count == 1 && src[0] == '0') { + // We have to write -0.0 instead of 0 + return number_type::floating_point_number; + } +#endif + return number_type::signed_integer; + } + // Let us check if we have a big integer (>=2**64). + static const uint8_t * two_to_sixtyfour = reinterpret_cast<const uint8_t *>("18446744073709551616"); + if((digit_count > 20) || (digit_count == 20 && memcmp(src, two_to_sixtyfour, 20) >= 0)) { + return number_type::big_integer; + } + // The number is positive and smaller than 18446744073709551616 (or 2**64). + // We want values larger or equal to 9223372036854775808 to be unsigned + // integers, and the other values to be signed integers. + if((digit_count == 20) || (digit_count >= 19 && memcmp(src, smaller_big_integer, 19) >= 0)) { + return number_type::unsigned_integer; + } + return number_type::signed_integer; + } + // Hopefully, we have 'e' or 'E' or '.'. + return number_type::floating_point_number; +} + +// Never read at src_end or beyond +simdjson_unused simdjson_inline simdjson_result<double> parse_double(const uint8_t * src, const uint8_t * const src_end) noexcept { + if(src == src_end) { return NUMBER_ERROR; } + // + // Check for minus sign + // + bool negative = (*src == '-'); + src += uint8_t(negative); + + // + // Parse the integer part. + // + uint64_t i = 0; + const uint8_t *p = src; + if(p == src_end) { return NUMBER_ERROR; } + p += parse_digit(*p, i); + bool leading_zero = (i == 0); + while ((p != src_end) && parse_digit(*p, i)) { p++; } + // no integer digits, or 0123 (zero must be solo) + if ( p == src ) { return INCORRECT_TYPE; } + if ( (leading_zero && p != src+1)) { return NUMBER_ERROR; } + + // + // Parse the decimal part. + // + int64_t exponent = 0; + bool overflow; + if (simdjson_likely((p != src_end) && (*p == '.'))) { + p++; + const uint8_t *start_decimal_digits = p; + if ((p == src_end) || !parse_digit(*p, i)) { return NUMBER_ERROR; } // no decimal digits + p++; + while ((p != src_end) && parse_digit(*p, i)) { p++; } + exponent = -(p - start_decimal_digits); + + // Overflow check. More than 19 digits (minus the decimal) may be overflow. + overflow = p-src-1 > 19; + if (simdjson_unlikely(overflow && leading_zero)) { + // Skip leading 0.00000 and see if it still overflows + const uint8_t *start_digits = src + 2; + while (*start_digits == '0') { start_digits++; } + overflow = start_digits-src > 19; + } + } else { + overflow = p-src > 19; + } + + // + // Parse the exponent + // + if ((p != src_end) && (*p == 'e' || *p == 'E')) { + p++; + if(p == src_end) { return NUMBER_ERROR; } + bool exp_neg = *p == '-'; + p += exp_neg || *p == '+'; + + uint64_t exp = 0; + const uint8_t *start_exp_digits = p; + while ((p != src_end) && parse_digit(*p, exp)) { p++; } + // no exp digits, or 20+ exp digits + if (p-start_exp_digits == 0 || p-start_exp_digits > 19) { return NUMBER_ERROR; } + + exponent += exp_neg ? 0-exp : exp; + } + + if ((p != src_end) && jsoncharutils::is_not_structural_or_whitespace(*p)) { return NUMBER_ERROR; } + + overflow = overflow || exponent < simdjson::internal::smallest_power || exponent > simdjson::internal::largest_power; + + // + // Assemble (or slow-parse) the float + // + double d; + if (simdjson_likely(!overflow)) { + if (compute_float_64(exponent, i, negative, d)) { return d; } + } + if (!parse_float_fallback(src - uint8_t(negative), src_end, &d)) { + return NUMBER_ERROR; + } + return d; +} + +simdjson_unused simdjson_inline simdjson_result<double> parse_double_in_string(const uint8_t * src) noexcept { + // + // Check for minus sign + // + bool negative = (*(src + 1) == '-'); + src += uint8_t(negative) + 1; + + // + // Parse the integer part. + // + uint64_t i = 0; + const uint8_t *p = src; + p += parse_digit(*p, i); + bool leading_zero = (i == 0); + while (parse_digit(*p, i)) { p++; } + // no integer digits, or 0123 (zero must be solo) + if ( p == src ) { return INCORRECT_TYPE; } + if ( (leading_zero && p != src+1)) { return NUMBER_ERROR; } + + // + // Parse the decimal part. + // + int64_t exponent = 0; + bool overflow; + if (simdjson_likely(*p == '.')) { + p++; + const uint8_t *start_decimal_digits = p; + if (!parse_digit(*p, i)) { return NUMBER_ERROR; } // no decimal digits + p++; + while (parse_digit(*p, i)) { p++; } + exponent = -(p - start_decimal_digits); + + // Overflow check. More than 19 digits (minus the decimal) may be overflow. + overflow = p-src-1 > 19; + if (simdjson_unlikely(overflow && leading_zero)) { + // Skip leading 0.00000 and see if it still overflows + const uint8_t *start_digits = src + 2; + while (*start_digits == '0') { start_digits++; } + overflow = p-start_digits > 19; + } + } else { + overflow = p-src > 19; + } + + // + // Parse the exponent + // + if (*p == 'e' || *p == 'E') { + p++; + bool exp_neg = *p == '-'; + p += exp_neg || *p == '+'; + + uint64_t exp = 0; + const uint8_t *start_exp_digits = p; + while (parse_digit(*p, exp)) { p++; } + // no exp digits, or 20+ exp digits + if (p-start_exp_digits == 0 || p-start_exp_digits > 19) { return NUMBER_ERROR; } + + exponent += exp_neg ? 0-exp : exp; + } + + if (*p != '"') { return NUMBER_ERROR; } + + overflow = overflow || exponent < simdjson::internal::smallest_power || exponent > simdjson::internal::largest_power; + + // + // Assemble (or slow-parse) the float + // + double d; + if (simdjson_likely(!overflow)) { + if (compute_float_64(exponent, i, negative, d)) { return d; } + } + if (!parse_float_fallback(src - uint8_t(negative), &d)) { + return NUMBER_ERROR; + } + return d; +} + +} // unnamed namespace +#endif // SIMDJSON_SKIPNUMBERPARSING + +} // namespace numberparsing + +inline std::ostream& operator<<(std::ostream& out, number_type type) noexcept { + switch (type) { + case number_type::signed_integer: out << "integer in [-9223372036854775808,9223372036854775808)"; break; + case number_type::unsigned_integer: out << "unsigned integer in [9223372036854775808,18446744073709551616)"; break; + case number_type::floating_point_number: out << "floating-point number (binary64)"; break; + case number_type::big_integer: out << "big integer"; break; + default: SIMDJSON_UNREACHABLE(); + } + return out; +} + +} // namespace rvv_vls +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_NUMBERPARSING_H +/* end file simdjson/generic/numberparsing.h for rvv_vls */ + +/* including simdjson/generic/implementation_simdjson_result_base-inl.h for rvv_vls: #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */ +/* begin file simdjson/generic/implementation_simdjson_result_base-inl.h for rvv_vls */ +#ifndef SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace rvv_vls { + +// +// internal::implementation_simdjson_result_base<T> inline implementation +// + +template<typename T> +simdjson_inline void implementation_simdjson_result_base<T>::tie(T &value, error_code &error) && noexcept { + error = this->second; + if (!error) { + value = std::forward<implementation_simdjson_result_base<T>>(*this).first; + } +} + +template<typename T> +simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_base<T>::get(T &value) && noexcept { + error_code error; + std::forward<implementation_simdjson_result_base<T>>(*this).tie(value, error); + return error; +} + +template<typename T> +simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_base<T>::error() const noexcept { + return this->second; +} + + +template<typename T> +simdjson_warn_unused simdjson_inline bool implementation_simdjson_result_base<T>::has_value() const noexcept { + return this->error() == SUCCESS; +} + +#if SIMDJSON_EXCEPTIONS + +template<typename T> +simdjson_inline T& implementation_simdjson_result_base<T>::operator*() & noexcept(false) { + return this->value(); +} + +template<typename T> +simdjson_inline T&& implementation_simdjson_result_base<T>::operator*() && noexcept(false) { + return std::forward<implementation_simdjson_result_base<T>>(*this).value(); +} + +template<typename T> +simdjson_inline T* implementation_simdjson_result_base<T>::operator->() noexcept(false) { + if (this->error()) { throw simdjson_error(this->error()); } + return &this->first; +} + + +template<typename T> +simdjson_inline const T* implementation_simdjson_result_base<T>::operator->() const noexcept(false) { + if (this->error()) { throw simdjson_error(this->error()); } + return &this->first; +} + +template<typename T> +simdjson_inline T& implementation_simdjson_result_base<T>::value() & noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return this->first; +} + +template<typename T> +simdjson_inline T&& implementation_simdjson_result_base<T>::value() && noexcept(false) { + return std::forward<implementation_simdjson_result_base<T>>(*this).take_value(); +} + +template<typename T> +simdjson_inline T&& implementation_simdjson_result_base<T>::take_value() && noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return std::forward<T>(this->first); +} + +template<typename T> +simdjson_inline implementation_simdjson_result_base<T>::operator T&&() && noexcept(false) { + return std::forward<implementation_simdjson_result_base<T>>(*this).take_value(); +} + +#endif // SIMDJSON_EXCEPTIONS + +template<typename T> +simdjson_inline const T& implementation_simdjson_result_base<T>::value_unsafe() const& noexcept { + return this->first; +} + +template<typename T> +simdjson_inline T& implementation_simdjson_result_base<T>::value_unsafe() & noexcept { + return this->first; +} + +template<typename T> +simdjson_inline T&& implementation_simdjson_result_base<T>::value_unsafe() && noexcept { + return std::forward<T>(this->first); +} + +template<typename T> +simdjson_inline implementation_simdjson_result_base<T>::implementation_simdjson_result_base(T &&value, error_code error) noexcept + : first{std::forward<T>(value)}, second{error} {} +template<typename T> +simdjson_inline implementation_simdjson_result_base<T>::implementation_simdjson_result_base(error_code error) noexcept + : implementation_simdjson_result_base(T{}, error) {} +template<typename T> +simdjson_inline implementation_simdjson_result_base<T>::implementation_simdjson_result_base(T &&value) noexcept + : implementation_simdjson_result_base(std::forward<T>(value), SUCCESS) {} + +} // namespace rvv_vls +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H +/* end file simdjson/generic/implementation_simdjson_result_base-inl.h for rvv_vls */ +/* end file simdjson/generic/amalgamated.h for rvv_vls */ +/* including simdjson/rvv-vls/end.h: #include "simdjson/rvv-vls/end.h" */ +/* begin file simdjson/rvv-vls/end.h */ +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +/* undefining SIMDJSON_IMPLEMENTATION from "rvv_vls" */ +#undef SIMDJSON_IMPLEMENTATION +/* end file simdjson/rvv-vls/end.h */ + +#endif // SIMDJSON_RVV_VLS_H +/* end file simdjson/rvv-vls.h */ +#else +#error Unknown SIMDJSON_BUILTIN_IMPLEMENTATION +#endif + +/* undefining SIMDJSON_CONDITIONAL_INCLUDE */ +#undef SIMDJSON_CONDITIONAL_INCLUDE + +#endif // SIMDJSON_BUILTIN_H +/* end file simdjson/builtin.h */ +/* skipped duplicate #include "simdjson/builtin/base.h" */ + +/* including simdjson/generic/builder/dependencies.h: #include "simdjson/generic/builder/dependencies.h" */ +/* begin file simdjson/generic/builder/dependencies.h */ +#ifdef SIMDJSON_CONDITIONAL_INCLUDE +#error simdjson/generic/builder/dependencies.h must be included before defining SIMDJSON_CONDITIONAL_INCLUDE! +#endif + +#ifndef SIMDJSON_GENERIC_BUILDER_DEPENDENCIES_H +#define SIMDJSON_GENERIC_BUILDER_DEPENDENCIES_H + +// Internal headers needed for builder generics. +// All includes not under simdjson/generic/builder must be here! +// Otherwise, amalgamation will fail. +/* skipped duplicate #include "simdjson/concepts.h" */ +/* skipped duplicate #include "simdjson/dom/fractured_json.h" */ + +#endif // SIMDJSON_GENERIC_BUILDER_DEPENDENCIES_H +/* end file simdjson/generic/builder/dependencies.h */ + +/* defining SIMDJSON_CONDITIONAL_INCLUDE */ +#define SIMDJSON_CONDITIONAL_INCLUDE + +#if SIMDJSON_BUILTIN_IMPLEMENTATION_IS(arm64) +/* including simdjson/arm64/builder.h: #include "simdjson/arm64/builder.h" */ +/* begin file simdjson/arm64/builder.h */ +#ifndef SIMDJSON_ARM64_BUILDER_H +#define SIMDJSON_ARM64_BUILDER_H + +/* including simdjson/arm64/begin.h: #include "simdjson/arm64/begin.h" */ +/* begin file simdjson/arm64/begin.h */ +/* defining SIMDJSON_IMPLEMENTATION to "arm64" */ +#define SIMDJSON_IMPLEMENTATION arm64 +/* including simdjson/arm64/base.h: #include "simdjson/arm64/base.h" */ +/* begin file simdjson/arm64/base.h */ +#ifndef SIMDJSON_ARM64_BASE_H +#define SIMDJSON_ARM64_BASE_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +/** + * Implementation for NEON (ARMv8). + */ +namespace arm64 { + +class implementation; + +namespace { +namespace simd { +template <typename T> struct simd8; +template <typename T> struct simd8x64; +} // namespace simd +} // unnamed namespace + +} // namespace arm64 +} // namespace simdjson + +#endif // SIMDJSON_ARM64_BASE_H +/* end file simdjson/arm64/base.h */ +/* including simdjson/arm64/intrinsics.h: #include "simdjson/arm64/intrinsics.h" */ +/* begin file simdjson/arm64/intrinsics.h */ +#ifndef SIMDJSON_ARM64_INTRINSICS_H +#define SIMDJSON_ARM64_INTRINSICS_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +// This should be the correct header whether +// you use visual studio or other compilers. +#include <arm_neon.h> + +static_assert(sizeof(uint8x16_t) <= simdjson::SIMDJSON_PADDING, "insufficient padding for arm64"); + +#endif // SIMDJSON_ARM64_INTRINSICS_H +/* end file simdjson/arm64/intrinsics.h */ +/* including simdjson/arm64/bitmanipulation.h: #include "simdjson/arm64/bitmanipulation.h" */ +/* begin file simdjson/arm64/bitmanipulation.h */ +#ifndef SIMDJSON_ARM64_BITMANIPULATION_H +#define SIMDJSON_ARM64_BITMANIPULATION_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/arm64/intrinsics.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace arm64 { +namespace { + +// We sometimes call trailing_zero on inputs that are zero, +// but the algorithms do not end up using the returned value. +// Sadly, sanitizers are not smart enough to figure it out. +SIMDJSON_NO_SANITIZE_UNDEFINED +// This function can be used safely even if not all bytes have been +// initialized. +// See issue https://github.com/simdjson/simdjson/issues/1965 +SIMDJSON_NO_SANITIZE_MEMORY +simdjson_inline int trailing_zeroes(uint64_t input_num) { +#if SIMDJSON_REGULAR_VISUAL_STUDIO + unsigned long ret; + // Search the mask data from least significant bit (LSB) + // to the most significant bit (MSB) for a set bit (1). + _BitScanForward64(&ret, input_num); + return (int)ret; +#else // SIMDJSON_REGULAR_VISUAL_STUDIO + return __builtin_ctzll(input_num); +#endif // SIMDJSON_REGULAR_VISUAL_STUDIO +} + +/* result might be undefined when input_num is zero */ +simdjson_inline uint64_t clear_lowest_bit(uint64_t input_num) { + return input_num & (input_num-1); +} + +// We sometimes call leading_zeroes on inputs that are zero, +// but the algorithms do not end up using the returned value. +// Sadly, sanitizers are not smart enough to figure it out. +// Applies only when SIMDJSON_PREFER_REVERSE_BITS is defined and true. +// (See below.) +SIMDJSON_NO_SANITIZE_UNDEFINED +/* result might be undefined when input_num is zero */ +simdjson_inline int leading_zeroes(uint64_t input_num) { +#if SIMDJSON_REGULAR_VISUAL_STUDIO + unsigned long leading_zero = 0; + // Search the mask data from most significant bit (MSB) + // to least significant bit (LSB) for a set bit (1). + if (_BitScanReverse64(&leading_zero, input_num)) + return (int)(63 - leading_zero); + else + return 64; +#else + return __builtin_clzll(input_num); +#endif// SIMDJSON_REGULAR_VISUAL_STUDIO +} + +/* result might be undefined when input_num is zero */ +simdjson_inline int count_ones(uint64_t input_num) { + return vaddv_u8(vcnt_u8(vcreate_u8(input_num))); +} + + +#if defined(__GNUC__) // catches clang and gcc +/** + * ARM has a fast 64-bit "bit reversal function" that is handy. However, + * it is not generally available as an intrinsic function under Visual + * Studio (though this might be changing). Even under clang/gcc, we + * apparently need to invoke inline assembly. + */ +/* + * We use SIMDJSON_PREFER_REVERSE_BITS as a hint that algorithms that + * work well with bit reversal may use it. + */ +#define SIMDJSON_PREFER_REVERSE_BITS 1 + +/* reverse the bits */ +simdjson_inline uint64_t reverse_bits(uint64_t input_num) { + uint64_t rev_bits; + __asm("rbit %0, %1" : "=r"(rev_bits) : "r"(input_num)); + return rev_bits; +} + +/** + * Flips bit at index 63 - lz. Thus if you have 'leading_zeroes' leading zeroes, + * then this will set to zero the leading bit. It is possible for leading_zeroes to be + * greating or equal to 63 in which case we trigger undefined behavior, but the output + * of such undefined behavior is never used. + **/ +SIMDJSON_NO_SANITIZE_UNDEFINED +simdjson_inline uint64_t zero_leading_bit(uint64_t rev_bits, int leading_zeroes) { + return rev_bits ^ (uint64_t(0x8000000000000000) >> leading_zeroes); +} + +#endif + +simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2, uint64_t *result) { +#if SIMDJSON_REGULAR_VISUAL_STUDIO + *result = value1 + value2; + return *result < value1; +#else + return __builtin_uaddll_overflow(value1, value2, + reinterpret_cast<unsigned long long *>(result)); +#endif +} + +} // unnamed namespace +} // namespace arm64 +} // namespace simdjson + +#endif // SIMDJSON_ARM64_BITMANIPULATION_H +/* end file simdjson/arm64/bitmanipulation.h */ +/* including simdjson/arm64/bitmask.h: #include "simdjson/arm64/bitmask.h" */ +/* begin file simdjson/arm64/bitmask.h */ +#ifndef SIMDJSON_ARM64_BITMASK_H +#define SIMDJSON_ARM64_BITMASK_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace arm64 { +namespace { + +// +// Perform a "cumulative bitwise xor," flipping bits each time a 1 is encountered. +// +// For example, prefix_xor(00100100) == 00011100 +// +simdjson_inline uint64_t prefix_xor(uint64_t bitmask) { + ///////////// + // We could do this with PMULL, but it is apparently slow. + // + //#ifdef __ARM_FEATURE_CRYPTO // some ARM processors lack this extension + //return vmull_p64(-1ULL, bitmask); + //#else + // Analysis by @sebpop: + // When diffing the assembly for src/stage1_find_marks.cpp I see that the eors are all spread out + // in between other vector code, so effectively the extra cycles of the sequence do not matter + // because the GPR units are idle otherwise and the critical path is on the FP side. + // Also the PMULL requires two extra fmovs: GPR->FP (3 cycles in N1, 5 cycles in A72 ) + // and FP->GPR (2 cycles on N1 and 5 cycles on A72.) + /////////// + bitmask ^= bitmask << 1; + bitmask ^= bitmask << 2; + bitmask ^= bitmask << 4; + bitmask ^= bitmask << 8; + bitmask ^= bitmask << 16; + bitmask ^= bitmask << 32; + return bitmask; +} + +} // unnamed namespace +} // namespace arm64 +} // namespace simdjson + +#endif +/* end file simdjson/arm64/bitmask.h */ +/* including simdjson/arm64/numberparsing_defs.h: #include "simdjson/arm64/numberparsing_defs.h" */ +/* begin file simdjson/arm64/numberparsing_defs.h */ +#ifndef SIMDJSON_ARM64_NUMBERPARSING_DEFS_H +#define SIMDJSON_ARM64_NUMBERPARSING_DEFS_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/arm64/intrinsics.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#include <cstring> + +#if SIMDJSON_REGULAR_VISUAL_STUDIO && SIMDJSON_IS_ARM64 +// __umulh requires intrin.h +#include <intrin.h> +#endif // SIMDJSON_REGULAR_VISUAL_STUDIO && SIMDJSON_IS_ARM64 + +namespace simdjson { +namespace arm64 { +namespace numberparsing { + +// we don't have SSE, so let us use a scalar function +// credit: https://johnnylee-sde.github.io/Fast-numeric-string-to-int/ +/** @private */ +static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) { + uint64_t val; + std::memcpy(&val, chars, sizeof(uint64_t)); + val = (val & 0x0F0F0F0F0F0F0F0F) * 2561 >> 8; + val = (val & 0x00FF00FF00FF00FF) * 6553601 >> 16; + return uint32_t((val & 0x0000FFFF0000FFFF) * 42949672960001 >> 32); +} + +simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) { + internal::value128 answer; +#if SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS +#if SIMDJSON_IS_ARM64 + // ARM64 has native support for 64-bit multiplications, no need to emultate + answer.high = __umulh(value1, value2); + answer.low = value1 * value2; +#else + answer.low = _umul128(value1, value2, &answer.high); // _umul128 not available on ARM64 +#endif // SIMDJSON_IS_ARM64 +#else // SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS + __uint128_t r = (static_cast<__uint128_t>(value1)) * value2; + answer.low = uint64_t(r); + answer.high = uint64_t(r >> 64); +#endif + return answer; +} + +} // namespace numberparsing +} // namespace arm64 +} // namespace simdjson + +#ifndef SIMDJSON_SWAR_NUMBER_PARSING +#if SIMDJSON_IS_BIG_ENDIAN +#define SIMDJSON_SWAR_NUMBER_PARSING 0 +#else +#define SIMDJSON_SWAR_NUMBER_PARSING 1 +#endif +#endif + +#endif // SIMDJSON_ARM64_NUMBERPARSING_DEFS_H +/* end file simdjson/arm64/numberparsing_defs.h */ +/* including simdjson/arm64/simd.h: #include "simdjson/arm64/simd.h" */ +/* begin file simdjson/arm64/simd.h */ +#ifndef SIMDJSON_ARM64_SIMD_H +#define SIMDJSON_ARM64_SIMD_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/arm64/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace arm64 { +namespace { +namespace simd { + +#if SIMDJSON_REGULAR_VISUAL_STUDIO +namespace { +// Start of private section with Visual Studio workaround + + +#ifndef simdjson_make_uint8x16_t +#define simdjson_make_uint8x16_t(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, \ + x13, x14, x15, x16) \ + ([=]() { \ + uint8_t array[16] = {x1, x2, x3, x4, x5, x6, x7, x8, \ + x9, x10, x11, x12, x13, x14, x15, x16}; \ + return vld1q_u8(array); \ + }()) +#endif +#ifndef simdjson_make_int8x16_t +#define simdjson_make_int8x16_t(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, \ + x13, x14, x15, x16) \ + ([=]() { \ + int8_t array[16] = {x1, x2, x3, x4, x5, x6, x7, x8, \ + x9, x10, x11, x12, x13, x14, x15, x16}; \ + return vld1q_s8(array); \ + }()) +#endif + +#ifndef simdjson_make_uint8x8_t +#define simdjson_make_uint8x8_t(x1, x2, x3, x4, x5, x6, x7, x8) \ + ([=]() { \ + uint8_t array[8] = {x1, x2, x3, x4, x5, x6, x7, x8}; \ + return vld1_u8(array); \ + }()) +#endif +#ifndef simdjson_make_int8x8_t +#define simdjson_make_int8x8_t(x1, x2, x3, x4, x5, x6, x7, x8) \ + ([=]() { \ + int8_t array[8] = {x1, x2, x3, x4, x5, x6, x7, x8}; \ + return vld1_s8(array); \ + }()) +#endif +#ifndef simdjson_make_uint16x8_t +#define simdjson_make_uint16x8_t(x1, x2, x3, x4, x5, x6, x7, x8) \ + ([=]() { \ + uint16_t array[8] = {x1, x2, x3, x4, x5, x6, x7, x8}; \ + return vld1q_u16(array); \ + }()) +#endif +#ifndef simdjson_make_int16x8_t +#define simdjson_make_int16x8_t(x1, x2, x3, x4, x5, x6, x7, x8) \ + ([=]() { \ + int16_t array[8] = {x1, x2, x3, x4, x5, x6, x7, x8}; \ + return vld1q_s16(array); \ + }()) +#endif + +// End of private section with Visual Studio workaround +} // namespace +#endif // SIMDJSON_REGULAR_VISUAL_STUDIO + + + template<typename T> + struct simd8; + + // + // Base class of simd8<uint8_t> and simd8<bool>, both of which use uint8x16_t internally. + // + template<typename T, typename Mask=simd8<bool>> + struct base_u8 { + uint8x16_t value; + static const int SIZE = sizeof(value); + + // Conversion from/to SIMD register + simdjson_inline base_u8(const uint8x16_t _value) : value(_value) {} + simdjson_inline operator const uint8x16_t&() const { return this->value; } + simdjson_inline operator uint8x16_t&() { return this->value; } + + // Bit operations + simdjson_inline simd8<T> operator|(const simd8<T> other) const { return vorrq_u8(*this, other); } + simdjson_inline simd8<T> operator&(const simd8<T> other) const { return vandq_u8(*this, other); } + simdjson_inline simd8<T> operator^(const simd8<T> other) const { return veorq_u8(*this, other); } + simdjson_inline simd8<T> bit_andnot(const simd8<T> other) const { return vbicq_u8(*this, other); } + simdjson_inline simd8<T> operator~() const { return *this ^ 0xFFu; } + simdjson_inline simd8<T>& operator|=(const simd8<T> other) { auto this_cast = static_cast<simd8<T>*>(this); *this_cast = *this_cast | other; return *this_cast; } + simdjson_inline simd8<T>& operator&=(const simd8<T> other) { auto this_cast = static_cast<simd8<T>*>(this); *this_cast = *this_cast & other; return *this_cast; } + simdjson_inline simd8<T>& operator^=(const simd8<T> other) { auto this_cast = static_cast<simd8<T>*>(this); *this_cast = *this_cast ^ other; return *this_cast; } + + friend simdjson_inline Mask operator==(const simd8<T> lhs, const simd8<T> rhs) { return vceqq_u8(lhs, rhs); } + + template<int N=1> + simdjson_inline simd8<T> prev(const simd8<T> prev_chunk) const { + return vextq_u8(prev_chunk, *this, 16 - N); + } + }; + + // SIMD byte mask type (returned by things like eq and gt) + template<> + struct simd8<bool>: base_u8<bool> { + typedef uint16_t bitmask_t; + typedef uint32_t bitmask2_t; + + static simdjson_inline simd8<bool> splat(bool _value) { return vmovq_n_u8(uint8_t(-(!!_value))); } + + simdjson_inline simd8(const uint8x16_t _value) : base_u8<bool>(_value) {} + // False constructor + simdjson_inline simd8() : simd8(vdupq_n_u8(0)) {} + // Splat constructor + simdjson_inline simd8(bool _value) : simd8(splat(_value)) {} + + // We return uint32_t instead of uint16_t because that seems to be more efficient for most + // purposes (cutting it down to uint16_t costs performance in some compilers). + simdjson_inline uint32_t to_bitmask() const { +#if SIMDJSON_REGULAR_VISUAL_STUDIO + const uint8x16_t bit_mask = simdjson_make_uint8x16_t(0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, + 0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80); +#else + const uint8x16_t bit_mask = {0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, + 0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80}; +#endif + auto minput = *this & bit_mask; + uint8x16_t tmp = vpaddq_u8(minput, minput); + tmp = vpaddq_u8(tmp, tmp); + tmp = vpaddq_u8(tmp, tmp); + return vgetq_lane_u16(vreinterpretq_u16_u8(tmp), 0); + } + // Returns 4-bit out of each byte, alternating between the high 4 bits and low + // bits result it is 64 bit. + simdjson_inline uint64_t to_bitmask64() const { + return vget_lane_u64( + vreinterpret_u64_u8(vshrn_n_u16(vreinterpretq_u16_u8(*this), 4)), 0); + } + simdjson_inline bool any() const { return vmaxvq_u32(vreinterpretq_u32_u8(*this)) != 0; } + }; + + // Unsigned bytes + template<> + struct simd8<uint8_t>: base_u8<uint8_t> { + static simdjson_inline uint8x16_t splat(uint8_t _value) { return vmovq_n_u8(_value); } + static simdjson_inline uint8x16_t zero() { return vdupq_n_u8(0); } + static simdjson_inline uint8x16_t load(const uint8_t* values) { return vld1q_u8(values); } + + simdjson_inline simd8(const uint8x16_t _value) : base_u8<uint8_t>(_value) {} + // Zero constructor + simdjson_inline simd8() : simd8(zero()) {} + // Array constructor + simdjson_inline simd8(const uint8_t values[16]) : simd8(load(values)) {} + // Splat constructor + simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {} + // Member-by-member initialization +#if SIMDJSON_REGULAR_VISUAL_STUDIO + simdjson_inline simd8( + uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, + uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 + ) : simd8(simdjson_make_uint8x16_t( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + )) {} +#else + simdjson_inline simd8( + uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, + uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 + ) : simd8(uint8x16_t{ + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + }) {} +#endif + + // Repeat 16 values as many times as necessary (usually for lookup tables) + simdjson_inline static simd8<uint8_t> repeat_16( + uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, + uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 + ) { + return simd8<uint8_t>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + ); + } + + // Store to array + simdjson_inline void store(uint8_t dst[16]) const { return vst1q_u8(dst, *this); } + + // Saturated math + simdjson_inline simd8<uint8_t> saturating_add(const simd8<uint8_t> other) const { return vqaddq_u8(*this, other); } + simdjson_inline simd8<uint8_t> saturating_sub(const simd8<uint8_t> other) const { return vqsubq_u8(*this, other); } + + // Addition/subtraction are the same for signed and unsigned + simdjson_inline simd8<uint8_t> operator+(const simd8<uint8_t> other) const { return vaddq_u8(*this, other); } + simdjson_inline simd8<uint8_t> operator-(const simd8<uint8_t> other) const { return vsubq_u8(*this, other); } + simdjson_inline simd8<uint8_t>& operator+=(const simd8<uint8_t> other) { *this = *this + other; return *this; } + simdjson_inline simd8<uint8_t>& operator-=(const simd8<uint8_t> other) { *this = *this - other; return *this; } + + // Order-specific operations + simdjson_inline uint8_t max_val() const { return vmaxvq_u8(*this); } + simdjson_inline uint8_t min_val() const { return vminvq_u8(*this); } + simdjson_inline simd8<uint8_t> max_val(const simd8<uint8_t> other) const { return vmaxq_u8(*this, other); } + simdjson_inline simd8<uint8_t> min_val(const simd8<uint8_t> other) const { return vminq_u8(*this, other); } + simdjson_inline simd8<bool> operator<=(const simd8<uint8_t> other) const { return vcleq_u8(*this, other); } + simdjson_inline simd8<bool> operator>=(const simd8<uint8_t> other) const { return vcgeq_u8(*this, other); } + simdjson_inline simd8<bool> operator<(const simd8<uint8_t> other) const { return vcltq_u8(*this, other); } + simdjson_inline simd8<bool> operator>(const simd8<uint8_t> other) const { return vcgtq_u8(*this, other); } + // Same as >, but instead of guaranteeing all 1's == true, false = 0 and true = nonzero. For ARM, returns all 1's. + simdjson_inline simd8<uint8_t> gt_bits(const simd8<uint8_t> other) const { return simd8<uint8_t>(*this > other); } + // Same as <, but instead of guaranteeing all 1's == true, false = 0 and true = nonzero. For ARM, returns all 1's. + simdjson_inline simd8<uint8_t> lt_bits(const simd8<uint8_t> other) const { return simd8<uint8_t>(*this < other); } + + // Bit-specific operations + simdjson_inline simd8<bool> any_bits_set(simd8<uint8_t> bits) const { return vtstq_u8(*this, bits); } + simdjson_inline bool any_bits_set_anywhere() const { return vmaxvq_u32(vreinterpretq_u32_u8(*this)) != 0; } + simdjson_inline bool any_bits_set_anywhere(simd8<uint8_t> bits) const { return (*this & bits).any_bits_set_anywhere(); } + template<int N> + simdjson_inline simd8<uint8_t> shr() const { return vshrq_n_u8(*this, N); } + template<int N> + simdjson_inline simd8<uint8_t> shl() const { return vshlq_n_u8(*this, N); } + + // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values) + template<typename L> + simdjson_inline simd8<L> lookup_16(simd8<L> lookup_table) const { + return lookup_table.apply_lookup_16_to(*this); + } + + // Returns 4-bit out of each byte, alternating between the high 4 bits and low + // bits result it is 64 bit. + simdjson_inline uint64_t to_bitmask64() const { + return vget_lane_u64( + vreinterpret_u64_u8(vshrn_n_u16(vreinterpretq_u16_u8(*this), 4)), 0); + } + // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted as a bitset). + // Passing a 0 value for mask would be equivalent to writing out every byte to output. + // Only the first 16 - count_ones(mask) bytes of the result are significant but 16 bytes + // get written. + // Design consideration: it seems like a function with the + // signature simd8<L> compress(uint16_t mask) would be + // sensible, but the AVX ISA makes this kind of approach difficult. + template<typename L> + simdjson_inline void compress(uint16_t mask, L * output) const { + using internal::thintable_epi8; + using internal::BitsSetTable256mul2; + using internal::pshufb_combine_table; + // this particular implementation was inspired by work done by @animetosho + // we do it in two steps, first 8 bytes and then second 8 bytes + uint8_t mask1 = uint8_t(mask); // least significant 8 bits + uint8_t mask2 = uint8_t(mask >> 8); // most significant 8 bits + // next line just loads the 64-bit values thintable_epi8[mask1] and + // thintable_epi8[mask2] into a 128-bit register, using only + // two instructions on most compilers. + uint64x2_t shufmask64 = {thintable_epi8[mask1], thintable_epi8[mask2]}; + uint8x16_t shufmask = vreinterpretq_u8_u64(shufmask64); + // we increment by 0x08 the second half of the mask +#if SIMDJSON_REGULAR_VISUAL_STUDIO + uint8x16_t inc = simdjson_make_uint8x16_t(0, 0, 0, 0, 0, 0, 0, 0, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08); +#else + uint8x16_t inc = {0, 0, 0, 0, 0, 0, 0, 0, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08}; +#endif + shufmask = vaddq_u8(shufmask, inc); + // this is the version "nearly pruned" + uint8x16_t pruned = vqtbl1q_u8(*this, shufmask); + // we still need to put the two halves together. + // we compute the popcount of the first half: + int pop1 = BitsSetTable256mul2[mask1]; + // then load the corresponding mask, what it does is to write + // only the first pop1 bytes from the first 8 bytes, and then + // it fills in with the bytes from the second 8 bytes + some filling + // at the end. + uint8x16_t compactmask = vld1q_u8(reinterpret_cast<const uint8_t *>(pshufb_combine_table + pop1 * 8)); + uint8x16_t answer = vqtbl1q_u8(pruned, compactmask); + vst1q_u8(reinterpret_cast<uint8_t*>(output), answer); + } + + // Copies all bytes corresponding to a 0 in the low half of the mask (interpreted as a + // bitset) to output1, then those corresponding to a 0 in the high half to output2. + template<typename L> + simdjson_inline void compress_halves(uint16_t mask, L *output1, L *output2) const { + using internal::thintable_epi8; + uint8_t mask1 = uint8_t(mask); // least significant 8 bits + uint8_t mask2 = uint8_t(mask >> 8); // most significant 8 bits + uint8x8_t compactmask1 = vcreate_u8(thintable_epi8[mask1]); + uint8x8_t compactmask2 = vcreate_u8(thintable_epi8[mask2]); + // we increment by 0x08 the second half of the mask +#if SIMDJSON_REGULAR_VISUAL_STUDIO + uint8x8_t inc = simdjson_make_uint8x8_t(0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08); +#else + uint8x8_t inc = {0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08}; +#endif + compactmask2 = vadd_u8(compactmask2, inc); + // store each result (with the second store possibly overlapping the first) + vst1_u8((uint8_t*)output1, vqtbl1_u8(*this, compactmask1)); + vst1_u8((uint8_t*)output2, vqtbl1_u8(*this, compactmask2)); + } + + template<typename L> + simdjson_inline simd8<L> lookup_16( + L replace0, L replace1, L replace2, L replace3, + L replace4, L replace5, L replace6, L replace7, + L replace8, L replace9, L replace10, L replace11, + L replace12, L replace13, L replace14, L replace15) const { + return lookup_16(simd8<L>::repeat_16( + replace0, replace1, replace2, replace3, + replace4, replace5, replace6, replace7, + replace8, replace9, replace10, replace11, + replace12, replace13, replace14, replace15 + )); + } + + template<typename T> + simdjson_inline simd8<uint8_t> apply_lookup_16_to(const simd8<T> original) { + return vqtbl1q_u8(*this, simd8<uint8_t>(original)); + } + }; + + // Signed bytes + template<> + struct simd8<int8_t> { + int8x16_t value; + + static simdjson_inline simd8<int8_t> splat(int8_t _value) { return vmovq_n_s8(_value); } + static simdjson_inline simd8<int8_t> zero() { return vdupq_n_s8(0); } + static simdjson_inline simd8<int8_t> load(const int8_t values[16]) { return vld1q_s8(values); } + + // Conversion from/to SIMD register + simdjson_inline simd8(const int8x16_t _value) : value{_value} {} + simdjson_inline operator const int8x16_t&() const { return this->value; } + simdjson_inline operator int8x16_t&() { return this->value; } + + // Zero constructor + simdjson_inline simd8() : simd8(zero()) {} + // Splat constructor + simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {} + // Array constructor + simdjson_inline simd8(const int8_t* values) : simd8(load(values)) {} + // Member-by-member initialization +#if SIMDJSON_REGULAR_VISUAL_STUDIO + simdjson_inline simd8( + int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, + int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 + ) : simd8(simdjson_make_int8x16_t( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + )) {} +#else + simdjson_inline simd8( + int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, + int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 + ) : simd8(int8x16_t{ + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + }) {} +#endif + // Repeat 16 values as many times as necessary (usually for lookup tables) + simdjson_inline static simd8<int8_t> repeat_16( + int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, + int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 + ) { + return simd8<int8_t>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + ); + } + + // Store to array + simdjson_inline void store(int8_t dst[16]) const { return vst1q_s8(dst, *this); } + + // Explicit conversion to/from unsigned + // + // Under Visual Studio/ARM64 uint8x16_t and int8x16_t are apparently the same type. + // In theory, we could check this occurrence with std::same_as and std::enabled_if but it is C++14 + // and relatively ugly and hard to read. +#ifndef SIMDJSON_REGULAR_VISUAL_STUDIO + simdjson_inline explicit simd8(const uint8x16_t other): simd8(vreinterpretq_s8_u8(other)) {} +#endif + simdjson_inline explicit operator simd8<uint8_t>() const { return vreinterpretq_u8_s8(this->value); } + + // Math + simdjson_inline simd8<int8_t> operator+(const simd8<int8_t> other) const { return vaddq_s8(*this, other); } + simdjson_inline simd8<int8_t> operator-(const simd8<int8_t> other) const { return vsubq_s8(*this, other); } + simdjson_inline simd8<int8_t>& operator+=(const simd8<int8_t> other) { *this = *this + other; return *this; } + simdjson_inline simd8<int8_t>& operator-=(const simd8<int8_t> other) { *this = *this - other; return *this; } + + // Order-sensitive comparisons + simdjson_inline simd8<int8_t> max_val(const simd8<int8_t> other) const { return vmaxq_s8(*this, other); } + simdjson_inline simd8<int8_t> min_val(const simd8<int8_t> other) const { return vminq_s8(*this, other); } + simdjson_inline simd8<bool> operator>(const simd8<int8_t> other) const { return vcgtq_s8(*this, other); } + simdjson_inline simd8<bool> operator<(const simd8<int8_t> other) const { return vcltq_s8(*this, other); } + simdjson_inline simd8<bool> operator==(const simd8<int8_t> other) const { return vceqq_s8(*this, other); } + + template<int N=1> + simdjson_inline simd8<int8_t> prev(const simd8<int8_t> prev_chunk) const { + return vextq_s8(prev_chunk, *this, 16 - N); + } + + // Perform a lookup assuming no value is larger than 16 + template<typename L> + simdjson_inline simd8<L> lookup_16(simd8<L> lookup_table) const { + return lookup_table.apply_lookup_16_to(*this); + } + template<typename L> + simdjson_inline simd8<L> lookup_16( + L replace0, L replace1, L replace2, L replace3, + L replace4, L replace5, L replace6, L replace7, + L replace8, L replace9, L replace10, L replace11, + L replace12, L replace13, L replace14, L replace15) const { + return lookup_16(simd8<L>::repeat_16( + replace0, replace1, replace2, replace3, + replace4, replace5, replace6, replace7, + replace8, replace9, replace10, replace11, + replace12, replace13, replace14, replace15 + )); + } + + template<typename T> + simdjson_inline simd8<int8_t> apply_lookup_16_to(const simd8<T> original) { + return vqtbl1q_s8(*this, simd8<uint8_t>(original)); + } + }; + + template<typename T> + struct simd8x64 { + static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<T>); + static_assert(NUM_CHUNKS == 4, "ARM kernel should use four registers per 64-byte block."); + const simd8<T> chunks[NUM_CHUNKS]; + template<int idx> simd8<uint8_t> get() const { return idx < NUM_CHUNKS ? chunks[idx] : simd8<T>(); } + + simd8x64(const simd8x64<T>& o) = delete; // no copy allowed + simd8x64<T>& operator=(const simd8<T>& other) = delete; // no assignment allowed + simd8x64() = delete; // no default constructor allowed + + simdjson_inline simd8x64(const simd8<T> chunk0, const simd8<T> chunk1, const simd8<T> chunk2, const simd8<T> chunk3) : chunks{chunk0, chunk1, chunk2, chunk3} {} + simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8<T>::load(ptr), simd8<T>::load(ptr+16), simd8<T>::load(ptr+32), simd8<T>::load(ptr+48)} {} + + simdjson_inline void store(T ptr[64]) const { + this->chunks[0].store(ptr+sizeof(simd8<T>)*0); + this->chunks[1].store(ptr+sizeof(simd8<T>)*1); + this->chunks[2].store(ptr+sizeof(simd8<T>)*2); + this->chunks[3].store(ptr+sizeof(simd8<T>)*3); + } + + simdjson_inline simd8<T> reduce_or() const { + return (this->chunks[0] | this->chunks[1]) | (this->chunks[2] | this->chunks[3]); + } + + + simdjson_inline uint64_t compress(uint64_t mask, T * output) const { + uint64_t popcounts = vget_lane_u64(vreinterpret_u64_u8(vcnt_u8(vcreate_u8(~mask))), 0); + // compute the prefix sum of the popcounts of each byte + uint64_t offsets = popcounts * 0x0101010101010101; + this->chunks[0].compress_halves(uint16_t(mask), output, &output[popcounts & 0xFF]); + this->chunks[1].compress_halves(uint16_t(mask >> 16), &output[(offsets >> 8) & 0xFF], &output[(offsets >> 16) & 0xFF]); + this->chunks[2].compress_halves(uint16_t(mask >> 32), &output[(offsets >> 24) & 0xFF], &output[(offsets >> 32) & 0xFF]); + this->chunks[3].compress_halves(uint16_t(mask >> 48), &output[(offsets >> 40) & 0xFF], &output[(offsets >> 48) & 0xFF]); + return offsets >> 56; + } + + simdjson_inline uint64_t to_bitmask() const { +#if SIMDJSON_REGULAR_VISUAL_STUDIO + const uint8x16_t bit_mask = simdjson_make_uint8x16_t( + 0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, + 0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80 + ); +#else + const uint8x16_t bit_mask = { + 0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, + 0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80 + }; +#endif + // Add each of the elements next to each other, successively, to stuff each 8 byte mask into one. + uint8x16_t sum0 = vpaddq_u8(this->chunks[0] & bit_mask, this->chunks[1] & bit_mask); + uint8x16_t sum1 = vpaddq_u8(this->chunks[2] & bit_mask, this->chunks[3] & bit_mask); + sum0 = vpaddq_u8(sum0, sum1); + sum0 = vpaddq_u8(sum0, sum0); + return vgetq_lane_u64(vreinterpretq_u64_u8(sum0), 0); + } + + simdjson_inline uint64_t eq(const T m) const { + const simd8<T> mask = simd8<T>::splat(m); + return simd8x64<bool>( + this->chunks[0] == mask, + this->chunks[1] == mask, + this->chunks[2] == mask, + this->chunks[3] == mask + ).to_bitmask(); + } + + simdjson_inline uint64_t lteq(const T m) const { + const simd8<T> mask = simd8<T>::splat(m); + return simd8x64<bool>( + this->chunks[0] <= mask, + this->chunks[1] <= mask, + this->chunks[2] <= mask, + this->chunks[3] <= mask + ).to_bitmask(); + } + }; // struct simd8x64<T> + +} // namespace simd +} // unnamed namespace +} // namespace arm64 +} // namespace simdjson + +#endif // SIMDJSON_ARM64_SIMD_H +/* end file simdjson/arm64/simd.h */ +/* including simdjson/arm64/stringparsing_defs.h: #include "simdjson/arm64/stringparsing_defs.h" */ +/* begin file simdjson/arm64/stringparsing_defs.h */ +#ifndef SIMDJSON_ARM64_STRINGPARSING_DEFS_H +#define SIMDJSON_ARM64_STRINGPARSING_DEFS_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/arm64/simd.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/arm64/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace arm64 { +namespace { + +using namespace simd; + +// Holds backslashes and quotes locations. +struct backslash_and_quote { +public: + static constexpr uint32_t BYTES_PROCESSED = 32; + simdjson_inline backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst); + + simdjson_inline bool has_quote_first() { return ((bs_bits - 1) & quote_bits) != 0; } + simdjson_inline bool has_backslash() { return bs_bits != 0; } + simdjson_inline int quote_index() { return trailing_zeroes(quote_bits); } + simdjson_inline int backslash_index() { return trailing_zeroes(bs_bits); } + + uint32_t bs_bits; + uint32_t quote_bits; +}; // struct backslash_and_quote + +simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) { + // this can read up to 31 bytes beyond the buffer size, but we require + // SIMDJSON_PADDING of padding + static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "backslash and quote finder must process fewer than SIMDJSON_PADDING bytes"); + simd8<uint8_t> v0(src); + simd8<uint8_t> v1(src + sizeof(v0)); + v0.store(dst); + v1.store(dst + sizeof(v0)); + + // Getting a 64-bit bitmask is much cheaper than multiple 16-bit bitmasks on ARM; therefore, we + // smash them together into a 64-byte mask and get the bitmask from there. + uint64_t bs_and_quote = simd8x64<bool>(v0 == '\\', v1 == '\\', v0 == '"', v1 == '"').to_bitmask(); + return { + uint32_t(bs_and_quote), // bs_bits + uint32_t(bs_and_quote >> 32) // quote_bits + }; +} + +struct escaping { + static constexpr uint32_t BYTES_PROCESSED = 16; + simdjson_inline static escaping copy_and_find(const uint8_t *src, uint8_t *dst); + + simdjson_inline bool has_escape() { return escape_bits != 0; } + simdjson_inline int escape_index() { return trailing_zeroes(escape_bits) / 4; } + + uint64_t escape_bits; +}; // struct escaping + + + +simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *dst) { + static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "escaping finder must process fewer than SIMDJSON_PADDING bytes"); + simd8<uint8_t> v(src); + v.store(dst); + simd8<bool> is_quote = (v == '"'); + simd8<bool> is_backslash = (v == '\\'); + simd8<bool> is_control = (v < 32); + return { + (is_backslash | is_quote | is_control).to_bitmask64() + }; +} + + + +} // unnamed namespace +} // namespace arm64 +} // namespace simdjson + +#endif // SIMDJSON_ARM64_STRINGPARSING_DEFS_H +/* end file simdjson/arm64/stringparsing_defs.h */ + +#define SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT 1 +/* end file simdjson/arm64/begin.h */ +/* including simdjson/generic/builder/amalgamated.h for arm64: #include "simdjson/generic/builder/amalgamated.h" */ +/* begin file simdjson/generic/builder/amalgamated.h for arm64 */ +#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_BUILDER_DEPENDENCIES_H) +#error simdjson/generic/builder/dependencies.h must be included before simdjson/generic/builder/amalgamated.h! +#endif + +/* including simdjson/generic/builder/json_string_builder.h for arm64: #include "simdjson/generic/builder/json_string_builder.h" */ +/* begin file simdjson/generic/builder/json_string_builder.h for arm64 */ +#ifndef SIMDJSON_GENERIC_STRING_BUILDER_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { + + +#if SIMDJSON_SUPPORTS_CONCEPTS + +namespace arm64 { +namespace builder { + class string_builder; +}} + +template <typename T, typename = void> +struct has_custom_serialization : std::false_type {}; + +inline constexpr struct serialize_tag { + template <typename T> + constexpr void operator()(arm64::builder::string_builder& b, T&& obj) const{ + return tag_invoke(*this, b, std::forward<T>(obj)); + } + + +} serialize{}; +template <typename T> +struct has_custom_serialization<T, std::void_t< + decltype(tag_invoke(serialize, std::declval<arm64::builder::string_builder&>(), std::declval<T&>())) +>> : std::true_type {}; + +template <typename T> +constexpr bool require_custom_serialization = has_custom_serialization<T>::value; +#else +struct has_custom_serialization : std::false_type {}; +#endif // SIMDJSON_SUPPORTS_CONCEPTS + +namespace arm64 { +namespace builder { +/** + * A builder for JSON strings representing documents. This is a low-level + * builder that is not meant to be used directly by end-users. Though it + * supports atomic types (Booleans, strings), it does not support composed + * types (arrays and objects). + * + * Ultimately, this class can support kernel-specific optimizations. E.g., + * it may make use of SIMD instructions to escape strings faster. + */ +class string_builder { +public: + simdjson_inline string_builder(size_t initial_capacity = DEFAULT_INITIAL_CAPACITY); + + static constexpr size_t DEFAULT_INITIAL_CAPACITY = 1024; + + /** + * Append number (includes Booleans). Booleans are mapped to the strings + * false and true. Numbers are converted to strings abiding by the JSON standard. + * Floating-point numbers are converted to the shortest string that 'correctly' + * represents the number. + */ + template<typename number_type, + typename = typename std::enable_if<std::is_arithmetic<number_type>::value>::type> + simdjson_inline void append(number_type v) noexcept; + + /** + * Append character c. + */ + simdjson_inline void append(char c) noexcept; + + /** + * Append the string 'null'. + */ + simdjson_inline void append_null() noexcept; + + /** + * Clear the content. + */ + simdjson_inline void clear() noexcept; + + /** + * Append the std::string_view, after escaping it. + * There is no UTF-8 validation. + */ + simdjson_inline void escape_and_append(std::string_view input) noexcept; + + /** + * Append the std::string_view surrounded by double quotes, after escaping it. + * There is no UTF-8 validation. + */ + simdjson_inline void escape_and_append_with_quotes(std::string_view input) noexcept; +#if SIMDJSON_SUPPORTS_CONCEPTS + template<constevalutil::fixed_string key> + simdjson_inline void escape_and_append_with_quotes() noexcept; +#endif + /** + * Append the character surrounded by double quotes, after escaping it. + * There is no UTF-8 validation. + */ + simdjson_inline void escape_and_append_with_quotes(char input) noexcept; + + /** + * Append the character surrounded by double quotes, after escaping it. + * There is no UTF-8 validation. + */ + simdjson_inline void escape_and_append_with_quotes(const char* input) noexcept; + + /** + * Append the C string directly, without escaping. + * There is no UTF-8 validation. + */ + simdjson_inline void append_raw(const char *c) noexcept; + + /** + * Append "{" to the buffer. + */ + simdjson_inline void start_object() noexcept; + + /** + * Append "}" to the buffer. + */ + simdjson_inline void end_object() noexcept; + + /** + * Append "[" to the buffer. + */ + simdjson_inline void start_array() noexcept; + + /** + * Append "]" to the buffer. + */ + simdjson_inline void end_array() noexcept; + + /** + * Append "," to the buffer. + */ + simdjson_inline void append_comma() noexcept; + + /** + * Append ":" to the buffer. + */ + simdjson_inline void append_colon() noexcept; + + /** + * Append a key-value pair to the buffer. + * The key is escaped and surrounded by double quotes. + * The value is escaped if it is a string. + */ + template<typename key_type, typename value_type> + simdjson_inline void append_key_value(key_type key, value_type value) noexcept; +#if SIMDJSON_SUPPORTS_CONCEPTS + template<constevalutil::fixed_string key, typename value_type> + simdjson_inline void append_key_value(value_type value) noexcept; + + // Support for optional types (std::optional, etc.) + template <concepts::optional_type T> + requires(!require_custom_serialization<T>) + simdjson_inline void append(const T &opt); + + template <typename T> + requires(require_custom_serialization<T>) + simdjson_inline void append(T &&val); + + // Support for string-like types + template <typename T> + requires(std::is_convertible<T, std::string_view>::value || + std::is_same<T, const char*>::value ) + simdjson_inline void append(const T &value); +#endif +#if SIMDJSON_SUPPORTS_RANGES && SIMDJSON_SUPPORTS_CONCEPTS + // Support for range-based appending (std::ranges::view, etc.) + template <std::ranges::range R> +requires (!std::is_convertible<R, std::string_view>::value && !require_custom_serialization<R>) + simdjson_inline void append(const R &range) noexcept; +#endif + /** + * Append the std::string_view directly, without escaping. + * There is no UTF-8 validation. + */ + simdjson_inline void append_raw(std::string_view input) noexcept; + + /** + * Append len characters from str. + * There is no UTF-8 validation. + */ + simdjson_inline void append_raw(const char *str, size_t len) noexcept; +#if SIMDJSON_EXCEPTIONS + /** + * Creates an std::string from the written JSON buffer. + * Throws if memory allocation failed + * + * The result may not be valid UTF-8 if some of your content was not valid UTF-8. + * Use validate_unicode() to check the content if needed. + */ + simdjson_inline operator std::string() const noexcept(false); + + /** + * Creates an std::string_view from the written JSON buffer. + * Throws if memory allocation failed. + * + * The result may not be valid UTF-8 if some of your content was not valid UTF-8. + * Use validate_unicode() to check the content if needed. + */ + simdjson_inline operator std::string_view() const noexcept(false) simdjson_lifetime_bound; +#endif + + /** + * Returns a view on the written JSON buffer. Returns an error + * if memory allocation failed. + * + * The result may not be valid UTF-8 if some of your content was not valid UTF-8. + * Use validate_unicode() to check the content. + */ + simdjson_inline simdjson_result<std::string_view> view() const noexcept; + + /** + * Appends the null character to the buffer and returns + * a pointer to the beginning of the written JSON buffer. + * Returns an error if memory allocation failed. + * The result is null-terminated. + * + * The result may not be valid UTF-8 if some of your content was not valid UTF-8. + * Use validate_unicode() to check the content. + */ + simdjson_inline simdjson_result<const char *> c_str() noexcept; + + /** + * Return true if the content is valid UTF-8. + */ + simdjson_inline bool validate_unicode() const noexcept; + + /** + * Returns the current size of the written JSON buffer. + * If an error occurred, returns 0. + */ + simdjson_inline size_t size() const noexcept; + +private: + /** + * Returns true if we can write at least upcoming_bytes bytes. + * The underlying buffer is reallocated if needed. It is designed + * to be called before writing to the buffer. It should be fast. + */ + simdjson_inline bool capacity_check(size_t upcoming_bytes); + + /** + * Grow the buffer to at least desired_capacity bytes. + * If the allocation fails, is_valid is set to false. We expect + * that this function would not be repeatedly called. + */ + simdjson_inline void grow_buffer(size_t desired_capacity); + + /** + * We use this helper function to make sure that is_valid is kept consistent. + */ + simdjson_inline void set_valid(bool valid) noexcept; + + std::unique_ptr<char[]> buffer{}; + size_t position{0}; + size_t capacity{0}; + bool is_valid{true}; +}; + + + +} +} + + +#if !SIMDJSON_STATIC_REFLECTION +// fallback implementation until we have static reflection +template <class Z> +simdjson_warn_unused simdjson_result<std::string> to_json(const Z &z, size_t initial_capacity = simdjson::arm64::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + simdjson::arm64::builder::string_builder b(initial_capacity); + b.append(z); + std::string_view s; + auto e = b.view().get(s); + if(e) { return e; } + return std::string(s); +} +template <class Z> +simdjson_warn_unused error_code to_json(const Z &z, std::string &s, size_t initial_capacity = simdjson::arm64::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + simdjson::arm64::builder::string_builder b(initial_capacity); + b.append(z); + std::string_view sv; + auto e = b.view().get(sv); + if(e) { return e; } + s.assign(sv.data(), sv.size()); + return simdjson::SUCCESS; +} +#endif + +#if SIMDJSON_SUPPORTS_CONCEPTS +#endif // SIMDJSON_SUPPORTS_CONCEPTS + +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_STRING_BUILDER_H +/* end file simdjson/generic/builder/json_string_builder.h for arm64 */ +/* including simdjson/generic/builder/json_builder.h for arm64: #include "simdjson/generic/builder/json_builder.h" */ +/* begin file simdjson/generic/builder/json_builder.h for arm64 */ +#ifndef SIMDJSON_GENERIC_BUILDER_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_string_builder.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/concepts.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ +#if SIMDJSON_STATIC_REFLECTION + +#include <charconv> +#include <cstring> +#include <meta> +#include <memory> +#include <optional> +#include <string_view> +#include <type_traits> +#include <utility> +// #include <static_reflection> // for std::define_static_string - header not available yet + +namespace simdjson { +namespace arm64 { +namespace builder { + +template <class T> + requires(concepts::container_but_not_string<T> && !require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &t) { + auto it = t.begin(); + auto end = t.end(); + if (it == end) { + b.append_raw("[]"); + return; + } + b.append('['); + atom(b, *it); + ++it; + for (; it != end; ++it) { + b.append(','); + atom(b, *it); + } + b.append(']'); +} + +template <class T> + requires(std::is_same_v<T, std::string> || + std::is_same_v<T, std::string_view> || + std::is_same_v<T, const char *> || + std::is_same_v<T, char>) +constexpr void atom(string_builder &b, const T &t) { + b.escape_and_append_with_quotes(t); +} + +template <concepts::string_view_keyed_map T> + requires(!require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &m) { + if (m.empty()) { + b.append_raw("{}"); + return; + } + b.append('{'); + bool first = true; + for (const auto& [key, value] : m) { + if (!first) { + b.append(','); + } + first = false; + // Keys must be convertible to string_view per the concept + b.escape_and_append_with_quotes(key); + b.append(':'); + atom(b, value); + } + b.append('}'); +} + + +template<typename number_type, + typename = typename std::enable_if<std::is_arithmetic<number_type>::value && !std::is_same_v<number_type, char>>::type> +constexpr void atom(string_builder &b, const number_type t) { + b.append(t); +} + +template <class T> + requires(std::is_class_v<T> && !concepts::container_but_not_string<T> && + !concepts::string_view_keyed_map<T> && + !concepts::optional_type<T> && + !concepts::smart_pointer<T> && + !concepts::appendable_containers<T> && + !std::is_same_v<T, std::string> && + !std::is_same_v<T, std::string_view> && + !std::is_same_v<T, const char*> && + !std::is_same_v<T, char> && !require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &t) { + int i = 0; + b.append('{'); + template for (constexpr auto dm : std::define_static_array(std::meta::nonstatic_data_members_of(^^T, std::meta::access_context::unchecked()))) { + if (i != 0) + b.append(','); + constexpr auto key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(dm))); + b.append_raw(key); + b.append(':'); + atom(b, t.[:dm:]); + i++; + }; + b.append('}'); +} + +// Support for optional types (std::optional, etc.) +template <concepts::optional_type T> + requires(!require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &opt) { + if (opt) { + atom(b, opt.value()); + } else { + b.append_raw("null"); + } +} + +// Support for smart pointers (std::unique_ptr, std::shared_ptr, etc.) +template <concepts::smart_pointer T> + requires(!require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &ptr) { + if (ptr) { + atom(b, *ptr); + } else { + b.append_raw("null"); + } +} + +// Support for enums - serialize as string representation using expand approach from P2996R12 +template <typename T> + requires(std::is_enum_v<T> && !require_custom_serialization<T>) +void atom(string_builder &b, const T &e) { +#if SIMDJSON_STATIC_REFLECTION + constexpr auto enumerators = std::define_static_array(std::meta::enumerators_of(^^T)); + template for (constexpr auto enum_val : enumerators) { + constexpr auto enum_str = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(enum_val))); + if (e == [:enum_val:]) { + b.append_raw(enum_str); + return; + } + }; + // Fallback to integer if enum value not found + atom(b, static_cast<std::underlying_type_t<T>>(e)); +#else + // Fallback: serialize as integer if reflection not available + atom(b, static_cast<std::underlying_type_t<T>>(e)); +#endif +} + +// Support for appendable containers that don't have operator[] (sets, etc.) +template <concepts::appendable_containers T> + requires(!concepts::container_but_not_string<T> && !concepts::string_view_keyed_map<T> && + !concepts::optional_type<T> && !concepts::smart_pointer<T> && + !std::is_same_v<T, std::string> && + !std::is_same_v<T, std::string_view> && !std::is_same_v<T, const char*> && !require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &container) { + if (container.empty()) { + b.append_raw("[]"); + return; + } + b.append('['); + bool first = true; + for (const auto& item : container) { + if (!first) { + b.append(','); + } + first = false; + atom(b, item); + } + b.append(']'); +} + +// append functions that delegate to atom functions for primitive types +template <class T> + requires(std::is_arithmetic_v<T> && !std::is_same_v<T, char>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +template <class T> + requires(std::is_same_v<T, std::string> || + std::is_same_v<T, std::string_view> || + std::is_same_v<T, const char *> || + std::is_same_v<T, char>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +template <concepts::optional_type T> + requires(!require_custom_serialization<T>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +template <concepts::smart_pointer T> + requires(!require_custom_serialization<T>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +template <concepts::appendable_containers T> + requires(!concepts::container_but_not_string<T> && !concepts::string_view_keyed_map<T> && + !concepts::optional_type<T> && !concepts::smart_pointer<T> && + !std::is_same_v<T, std::string> && + !std::is_same_v<T, std::string_view> && !std::is_same_v<T, const char*> && !require_custom_serialization<T>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +template <concepts::string_view_keyed_map T> + requires(!require_custom_serialization<T>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +// works for struct +template <class Z> + requires(std::is_class_v<Z> && !concepts::container_but_not_string<Z> && + !concepts::string_view_keyed_map<Z> && + !concepts::optional_type<Z> && + !concepts::smart_pointer<Z> && + !concepts::appendable_containers<Z> && + !std::is_same_v<Z, std::string> && + !std::is_same_v<Z, std::string_view> && + !std::is_same_v<Z, const char*> && + !std::is_same_v<Z, char> && !require_custom_serialization<Z>) +void append(string_builder &b, const Z &z) { + int i = 0; + b.append('{'); + template for (constexpr auto dm : std::define_static_array(std::meta::nonstatic_data_members_of(^^Z, std::meta::access_context::unchecked()))) { + if (i != 0) + b.append(','); + constexpr auto key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(dm))); + b.append_raw(key); + b.append(':'); + atom(b, z.[:dm:]); + i++; + }; + b.append('}'); +} + +// works for container that have begin() and end() iterators +template <class Z> + requires(concepts::container_but_not_string<Z> && !require_custom_serialization<Z>) +void append(string_builder &b, const Z &z) { + auto it = z.begin(); + auto end = z.end(); + if (it == end) { + b.append_raw("[]"); + return; + } + b.append('['); + atom(b, *it); + ++it; + for (; it != end; ++it) { + b.append(','); + atom(b, *it); + } + b.append(']'); +} + +template <class Z> + requires (require_custom_serialization<Z>) +void append(string_builder &b, const Z &z) { + b.append(z); +} + + +template <class Z> +simdjson_warn_unused simdjson_result<std::string> to_json_string(const Z &z, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + string_builder b(initial_capacity); + append(b, z); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); +} + +template <class Z> +simdjson_warn_unused error_code to_json(const Z &z, std::string &s, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + string_builder b(initial_capacity); + append(b, z); + std::string_view view; + if(auto e = b.view().get(view); e) { return e; } + s.assign(view); + return SUCCESS; +} + +template <class Z> +string_builder& operator<<(string_builder& b, const Z& z) { + append(b, z); + return b; +} + +// extract_from: Serialize only specific fields from a struct to JSON +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +void extract_from(string_builder &b, const T &obj) { + // Helper to check if a field name matches any of the requested fields + auto should_extract = [](std::string_view field_name) constexpr -> bool { + return ((FieldNames.view() == field_name) || ...); + }; + + b.append('{'); + bool first = true; + + // Iterate through all members of T using reflection + template for (constexpr auto mem : std::define_static_array( + std::meta::nonstatic_data_members_of(^^T, std::meta::access_context::unchecked()))) { + + if constexpr (std::meta::is_public(mem)) { + constexpr std::string_view key = std::define_static_string(std::meta::identifier_of(mem)); + + // Only serialize this field if it's in our list of requested fields + if constexpr (should_extract(key)) { + if (!first) { + b.append(','); + } + first = false; + + // Serialize the key + constexpr auto quoted_key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(mem))); + b.append_raw(quoted_key); + b.append(':'); + + // Serialize the value + atom(b, obj.[:mem:]); + } + } + }; + + b.append('}'); +} + +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result<std::string> extract_from(const T &obj, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + string_builder b(initial_capacity); + extract_from<FieldNames...>(b, obj); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); +} + +} // namespace builder +} // namespace arm64 +// Alias the function template to 'to' in the global namespace +template <class Z> +simdjson_warn_unused simdjson_result<std::string> to_json(const Z &z, size_t initial_capacity = arm64::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + arm64::builder::string_builder b(initial_capacity); + arm64::builder::append(b, z); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); +} +template <class Z> +simdjson_warn_unused error_code to_json(const Z &z, std::string &s, size_t initial_capacity = arm64::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + arm64::builder::string_builder b(initial_capacity); + arm64::builder::append(b, z); + std::string_view view; + if(auto e = b.view().get(view); e) { return e; } + s.assign(view); + return SUCCESS; +} +// Global namespace function for extract_from +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result<std::string> extract_from(const T &obj, size_t initial_capacity = arm64::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + arm64::builder::string_builder b(initial_capacity); + arm64::builder::extract_from<FieldNames...>(b, obj); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); +} + +} // namespace simdjson + +#endif // SIMDJSON_STATIC_REFLECTION + +#endif +/* end file simdjson/generic/builder/json_builder.h for arm64 */ +/* including simdjson/generic/builder/fractured_json_builder.h for arm64: #include "simdjson/generic/builder/fractured_json_builder.h" */ +/* begin file simdjson/generic/builder/fractured_json_builder.h for arm64 */ +#ifndef SIMDJSON_GENERIC_FRACTURED_JSON_BUILDER_H +#define SIMDJSON_GENERIC_FRACTURED_JSON_BUILDER_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_builder.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/dom/fractured_json.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#if SIMDJSON_STATIC_REFLECTION + +namespace simdjson { +namespace arm64 { +namespace builder { + +/** + * Serialize an object to a FracturedJson-formatted string. + * + * FracturedJson produces human-readable yet compact JSON output by intelligently + * choosing between different layout strategies (inline, compact multiline, table, + * expanded) based on content complexity, length, and structure similarity. + * + * This function combines the builder's serialization with FracturedJson formatting: + * 1. Serializes the object to minified JSON using reflection + * 2. Parses and reformats using FracturedJson + * + * Example: + * struct User { int id; std::string name; bool active; }; + * User user{1, "Alice", true}; + * auto result = to_fractured_json_string(user); + * // result.value() == "{ \"id\": 1, \"name\": \"Alice\", \"active\": true }" + * + * @param obj The object to serialize (must be a reflectable type) + * @param opts FracturedJson formatting options + * @param initial_capacity Initial buffer capacity for serialization + * @return The formatted JSON string, or an error + */ +template <class T> +simdjson_warn_unused simdjson_result<std::string> to_fractured_json_string( + const T& obj, + const fractured_json_options& opts = {}, + size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + // Step 1: Serialize to minified JSON + std::string formatted; + auto error = to_json_string(obj, initial_capacity).get(formatted); + if (error) { + return error; + } + + // Step 2: Reformat with FracturedJson + return fractured_json_string(formatted, opts); +} + +/** + * Extract specific fields from an object and format with FracturedJson. + * + * Example: + * struct User { int id; std::string name; std::string email; bool active; }; + * User user{1, "Alice", "alice@example.com", true}; + * auto result = extract_fractured_json<"id", "name">(user); + * // result.value() == "{ \"id\": 1, \"name\": \"Alice\" }" + * + * @param obj The object to serialize + * @param opts FracturedJson formatting options + * @param initial_capacity Initial buffer capacity for serialization + * @return The formatted JSON string containing only the specified fields + */ +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result<std::string> extract_fractured_json( + const T& obj, + const fractured_json_options& opts = {}, + size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + // Step 1: Extract fields to minified JSON + std::string formatted; + auto error = extract_from<FieldNames...>(obj, initial_capacity).get(formatted); + if (error) { + return error; + } + + // Step 2: Reformat with FracturedJson + return fractured_json_string(formatted, opts); +} + +} // namespace builder +} // namespace arm64 + +// Global namespace convenience functions + +/** + * Serialize an object to a FracturedJson-formatted string. + * Global namespace version for convenience. + */ +template <class T> +simdjson_warn_unused simdjson_result<std::string> to_fractured_json_string( + const T& obj, + const fractured_json_options& opts = {}, + size_t initial_capacity = arm64::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + return arm64::builder::to_fractured_json_string(obj, opts, initial_capacity); +} +/** + * Extract specific fields from an object and format with FracturedJson. + * Global namespace version for convenience. + */ +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result<std::string> extract_fractured_json( + const T& obj, + const fractured_json_options& opts = {}, + size_t initial_capacity = arm64::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + return arm64::builder::extract_fractured_json<FieldNames...>(obj, opts, initial_capacity); +} + +} // namespace simdjson + +#endif // SIMDJSON_STATIC_REFLECTION + +#endif // SIMDJSON_GENERIC_FRACTURED_JSON_BUILDER_H +/* end file simdjson/generic/builder/fractured_json_builder.h for arm64 */ + + + +// JSON builder inline definitions +/* including simdjson/generic/builder/json_string_builder-inl.h for arm64: #include "simdjson/generic/builder/json_string_builder-inl.h" */ +/* begin file simdjson/generic/builder/json_string_builder-inl.h for arm64 */ +#include <array> +#include <cstring> +#include <type_traits> +#ifndef SIMDJSON_GENERIC_STRING_BUILDER_INL_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_INL_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_string_builder.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +/* + * Empirically, we have found that an inlined optimization is important for + * performance. The following macros are not ideal. We should find a better + * way to inline the code. + */ + +#if defined(__SSE2__) || defined(__x86_64__) || defined(__x86_64) || \ + (defined(_M_AMD64) || defined(_M_X64) || \ + (defined(_M_IX86_FP) && _M_IX86_FP == 2)) +#ifndef SIMDJSON_EXPERIMENTAL_HAS_SSE2 +#define SIMDJSON_EXPERIMENTAL_HAS_SSE2 1 +#endif +#endif + +#if defined(__aarch64__) || defined(_M_ARM64) +#ifndef SIMDJSON_EXPERIMENTAL_HAS_NEON +#define SIMDJSON_EXPERIMENTAL_HAS_NEON 1 +#endif +#endif +#if defined(__loongarch_sx) +#ifndef SIMDJSON_EXPERIMENTAL_HAS_LSX +#define SIMDJSON_EXPERIMENTAL_HAS_LSX 1 +#endif +#endif +#if defined(__riscv_v_intrinsic) && __riscv_v_intrinsic >= 11000 && \ + defined(__riscv_vector) +#ifndef SIMDJSON_EXPERIMENTAL_HAS_RVV +#define SIMDJSON_EXPERIMENTAL_HAS_RVV 1 +#endif +#endif +#if (defined(__PPC64__) || defined(_M_PPC64)) && defined(__ALTIVEC__) +#ifndef SIMDJSON_EXPERIMENTAL_HAS_PPC64 +#define SIMDJSON_EXPERIMENTAL_HAS_PPC64 1 +#endif +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_NEON +#include <arm_neon.h> +#ifdef _MSC_VER +#include <intrin.h> +#endif +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_SSE2 +#include <emmintrin.h> +#ifdef _MSC_VER +#include <intrin.h> +#endif +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_LSX +#include <lsxintrin.h> +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_RVV +#include <riscv_vector.h> +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_PPC64 +#include <altivec.h> +#ifdef bool +#undef bool +#endif +#ifdef vector +#undef vector +#endif +#endif + + +namespace simdjson { +namespace arm64 { +namespace builder { + +static SIMDJSON_CONSTEXPR_LAMBDA std::array<uint8_t, 256> + json_quotable_character = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + +/** + +A possible SWAR implementation of has_json_escapable_byte. It is not used +because it is slower than the current implementation. It is kept here for +reference (to show that we tried it). + +inline bool has_json_escapable_byte(uint64_t x) { + uint64_t is_ascii = 0x8080808080808080ULL & ~x; + uint64_t xor2 = x ^ 0x0202020202020202ULL; + uint64_t lt32_or_eq34 = xor2 - 0x2121212121212121ULL; + uint64_t sub92 = x ^ 0x5C5C5C5C5C5C5C5CULL; + uint64_t eq92 = (sub92 - 0x0101010101010101ULL); + return ((lt32_or_eq34 | eq92) & is_ascii) != 0; +} + +**/ + +SIMDJSON_CONSTEXPR_LAMBDA simdjson_inline bool +simple_needs_escaping(std::string_view v) { + for (char c : v) { + // a table lookup is faster than a series of comparisons + if (json_quotable_character[static_cast<uint8_t>(c)]) { + return true; + } + } + return false; +} + +#if SIMDJSON_EXPERIMENTAL_HAS_NEON +simdjson_inline bool fast_needs_escaping(std::string_view view) { + if (view.size() < 16) { + return simple_needs_escaping(view); + } + size_t i = 0; + uint8x16_t running = vdupq_n_u8(0); + uint8x16_t v34 = vdupq_n_u8(34); + uint8x16_t v92 = vdupq_n_u8(92); + + for (; i + 15 < view.size(); i += 16) { + uint8x16_t word = vld1q_u8((const uint8_t *)view.data() + i); + running = vorrq_u8(running, vceqq_u8(word, v34)); + running = vorrq_u8(running, vceqq_u8(word, v92)); + running = vorrq_u8(running, vcltq_u8(word, vdupq_n_u8(32))); + } + if (i < view.size()) { + uint8x16_t word = + vld1q_u8((const uint8_t *)view.data() + view.length() - 16); + running = vorrq_u8(running, vceqq_u8(word, v34)); + running = vorrq_u8(running, vceqq_u8(word, v92)); + running = vorrq_u8(running, vcltq_u8(word, vdupq_n_u8(32))); + } + return vmaxvq_u32(vreinterpretq_u32_u8(running)) != 0; +} +#elif SIMDJSON_EXPERIMENTAL_HAS_SSE2 +simdjson_inline bool fast_needs_escaping(std::string_view view) { + if (view.size() < 16) { + return simple_needs_escaping(view); + } + size_t i = 0; + __m128i running = _mm_setzero_si128(); + for (; i + 15 < view.size(); i += 16) { + + __m128i word = + _mm_loadu_si128(reinterpret_cast<const __m128i *>(view.data() + i)); + running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(34))); + running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(92))); + running = _mm_or_si128( + running, _mm_cmpeq_epi8(_mm_subs_epu8(word, _mm_set1_epi8(31)), + _mm_setzero_si128())); + } + if (i < view.size()) { + __m128i word = _mm_loadu_si128( + reinterpret_cast<const __m128i *>(view.data() + view.length() - 16)); + running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(34))); + running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(92))); + running = _mm_or_si128( + running, _mm_cmpeq_epi8(_mm_subs_epu8(word, _mm_set1_epi8(31)), + _mm_setzero_si128())); + } + return _mm_movemask_epi8(running) != 0; +} +#elif SIMDJSON_EXPERIMENTAL_HAS_PPC64 +simdjson_inline bool fast_needs_escaping(std::string_view view) { + if (view.size() < 16) { + return simple_needs_escaping(view); + } + size_t i = 0; + __vector unsigned char running = vec_splats((unsigned char)0); + __vector unsigned char v34 = vec_splats((unsigned char)34); + __vector unsigned char v92 = vec_splats((unsigned char)92); + __vector unsigned char v32 = vec_splats((unsigned char)32); + + for (; i + 15 < view.size(); i += 16) { + __vector unsigned char word = + vec_vsx_ld(0, reinterpret_cast<const unsigned char *>(view.data() + i)); + running = vec_or(running, (__vector unsigned char)vec_cmpeq(word, v34)); + running = vec_or(running, (__vector unsigned char)vec_cmpeq(word, v92)); + running = vec_or(running, + (__vector unsigned char)vec_cmplt(word, v32)); + } + if (i < view.size()) { + __vector unsigned char word = vec_vsx_ld( + 0, reinterpret_cast<const unsigned char *>(view.data() + view.length() - 16)); + running = vec_or(running, (__vector unsigned char)vec_cmpeq(word, v34)); + running = vec_or(running, (__vector unsigned char)vec_cmpeq(word, v92)); + running = vec_or(running, + (__vector unsigned char)vec_cmplt(word, v32)); + } + return !vec_all_eq(running, vec_splats((unsigned char)0)); +} +#else +simdjson_inline bool fast_needs_escaping(std::string_view view) { + return simple_needs_escaping(view); +} +#endif + +// Scalar fallback for finding next quotable character +SIMDJSON_CONSTEXPR_LAMBDA simdjson_inline size_t +find_next_json_quotable_character_scalar(const std::string_view view, + size_t location) noexcept { + for (auto pos = view.begin() + location; pos != view.end(); ++pos) { + if (json_quotable_character[static_cast<uint8_t>(*pos)]) { + return pos - view.begin(); + } + } + return size_t(view.size()); +} + +// SIMD-accelerated position finding that directly locates the first quotable +// character, combining detection and position extraction in a single pass to +// minimize redundant work. +#if SIMDJSON_EXPERIMENTAL_HAS_NEON +simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + const size_t len = view.size(); + const uint8_t *ptr = + reinterpret_cast<const uint8_t *>(view.data()) + location; + size_t remaining = len - location; + + // SIMD constants for characters requiring escape + uint8x16_t v34 = vdupq_n_u8(34); // '"' + uint8x16_t v92 = vdupq_n_u8(92); // '\\' + uint8x16_t v32 = vdupq_n_u8(32); // control char threshold + + while (remaining >= 16) { + uint8x16_t word = vld1q_u8(ptr); + + // Check for quotable characters: '"', '\\', or control chars (< 32) + uint8x16_t needs_escape = vceqq_u8(word, v34); + needs_escape = vorrq_u8(needs_escape, vceqq_u8(word, v92)); + needs_escape = vorrq_u8(needs_escape, vcltq_u8(word, v32)); + + const uint8x8_t res = vshrn_n_u16(vreinterpretq_u16_u8(needs_escape), 4); + const uint64_t mask = vget_lane_u64(vreinterpret_u64_u8(res), 0); + if(mask != 0) { + size_t offset = ptr - reinterpret_cast<const uint8_t *>(view.data()); + auto trailing_zero = trailing_zeroes(mask); + return offset + (trailing_zero >> 2); + } + ptr += 16; + remaining -= 16; + } + + // Scalar fallback for remaining bytes + size_t current = len - remaining; + return find_next_json_quotable_character_scalar(view, current); +} +#elif SIMDJSON_EXPERIMENTAL_HAS_SSE2 +simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + const size_t len = view.size(); + const uint8_t *ptr = + reinterpret_cast<const uint8_t *>(view.data()) + location; + size_t remaining = len - location; + + // SIMD constants + __m128i v34 = _mm_set1_epi8(34); // '"' + __m128i v92 = _mm_set1_epi8(92); // '\\' + __m128i v31 = _mm_set1_epi8(31); // for control char detection + + while (remaining >= 16) { + __m128i word = _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr)); + + // Check for quotable characters + __m128i needs_escape = _mm_cmpeq_epi8(word, v34); + needs_escape = _mm_or_si128(needs_escape, _mm_cmpeq_epi8(word, v92)); + needs_escape = _mm_or_si128( + needs_escape, + _mm_cmpeq_epi8(_mm_subs_epu8(word, v31), _mm_setzero_si128())); + + int mask = _mm_movemask_epi8(needs_escape); + if (mask != 0) { + // Found quotable character - use trailing zero count to find position + size_t offset = ptr - reinterpret_cast<const uint8_t *>(view.data()); + return offset + trailing_zeroes(mask); + } + ptr += 16; + remaining -= 16; + } + + // Scalar fallback for remaining bytes + size_t current = len - remaining; + return find_next_json_quotable_character_scalar(view, current); +} +#elif SIMDJSON_EXPERIMENTAL_HAS_LSX +simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + const size_t len = view.size(); + const uint8_t *ptr = + reinterpret_cast<const uint8_t *>(view.data()) + location; + size_t remaining = len - location; + + //SIMD constants for characters requiring escape + __m128i v34 = __lsx_vreplgr2vr_b(34); // '"' + __m128i v92 = __lsx_vreplgr2vr_b(92); // '\\' + __m128i v32 = __lsx_vreplgr2vr_b(32); // control char threshold + + while (remaining >= 16){ + __m128i word = __lsx_vld(ptr, 0); + + //Check for the quotable characters: '"', '\\', or control char (<32) + __m128i needs_escape = __lsx_vseq_b(word, v34); + needs_escape = __lsx_vor_v(needs_escape, __lsx_vseq_b(word, v92)); + needs_escape = __lsx_vor_v(needs_escape, __lsx_vslt_bu(word, v32)); + + if (!__lsx_bz_v(needs_escape)){ + + //Found quotable character - extract exact byte position + uint64_t lo = __lsx_vpickve2gr_du(needs_escape,0); + uint64_t hi = __lsx_vpickve2gr_du(needs_escape,1); + size_t offset = ptr - reinterpret_cast<const uint8_t *>(view.data()); + if ( lo != 0) { + return offset + trailing_zeroes(lo) / 8; + } else { + return offset + 8 + trailing_zeroes(hi) / 8; + } + } + ptr += 16; + remaining -= 16; + } + size_t current = len - remaining; + return find_next_json_quotable_character_scalar(view, current); +} +#elif SIMDJSON_EXPERIMENTAL_HAS_RVV +simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + const size_t len = view.size(); + const uint8_t *ptr = + reinterpret_cast<const uint8_t *>(view.data()) + location; + size_t remaining = len - location; + + while (remaining > 0) { + size_t vl = __riscv_vsetvl_e8m1(remaining); + vuint8m1_t word = __riscv_vle8_v_u8m1(ptr, vl); + + // Check for quotable characters: '"', '\\', or control chars (< 32) + vbool8_t needs_escape = __riscv_vmseq(word, (uint8_t)34, vl); + needs_escape = __riscv_vmor(needs_escape, + __riscv_vmseq(word, (uint8_t)92, vl), vl); + needs_escape = __riscv_vmor(needs_escape, + __riscv_vmsltu(word, (uint8_t)32, vl), vl); + + long first = __riscv_vfirst(needs_escape, vl); + if (first >= 0) { + size_t offset = ptr - reinterpret_cast<const uint8_t *>(view.data()); + return offset + first; + } + ptr += vl; + remaining -= vl; + } + + return len; +} +#elif SIMDJSON_EXPERIMENTAL_HAS_PPC64 +simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + const size_t len = view.size(); + const uint8_t *ptr = + reinterpret_cast<const uint8_t *>(view.data()) + location; + size_t remaining = len - location; + + // SIMD constants for characters requiring escape + __vector unsigned char v34 = vec_splats((unsigned char)34); // '"' + __vector unsigned char v92 = vec_splats((unsigned char)92); // '\\' + __vector unsigned char v32 = vec_splats((unsigned char)32); // control char threshold + + // Bitmask for vec_vbpermq to extract one bit per byte + const __vector unsigned char perm_mask = {0x78, 0x70, 0x68, 0x60, 0x58, 0x50, + 0x48, 0x40, 0x38, 0x30, 0x28, 0x20, + 0x18, 0x10, 0x08, 0x00}; + + while (remaining >= 16) { + __vector unsigned char word = + vec_vsx_ld(0, reinterpret_cast<const unsigned char *>(ptr)); + + // Check for quotable characters: '"', '\\', or control chars (< 32) + __vector unsigned char needs_escape = + (__vector unsigned char)vec_cmpeq(word, v34); + needs_escape = vec_or(needs_escape, + (__vector unsigned char)vec_cmpeq(word, v92)); + needs_escape = vec_or(needs_escape, + (__vector unsigned char)vec_cmplt(word, v32)); + + __vector unsigned long long result = + (__vector unsigned long long)vec_vbpermq(needs_escape, perm_mask); +#ifdef __LITTLE_ENDIAN__ + unsigned int mask = static_cast<unsigned int>(result[1]); +#else + unsigned int mask = static_cast<unsigned int>(result[0]); +#endif + if (mask != 0) { + size_t offset = ptr - reinterpret_cast<const uint8_t *>(view.data()); + return offset + __builtin_ctz(mask); + } + ptr += 16; + remaining -= 16; + } + + // Scalar fallback for remaining bytes + size_t current = len - remaining; + return find_next_json_quotable_character_scalar(view, current); +} +#else +SIMDJSON_CONSTEXPR_LAMBDA simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + return find_next_json_quotable_character_scalar(view, location); +} +#endif + +SIMDJSON_CONSTEXPR_LAMBDA static std::string_view control_chars[] = { + "\\u0000", "\\u0001", "\\u0002", "\\u0003", "\\u0004", "\\u0005", "\\u0006", + "\\u0007", "\\b", "\\t", "\\n", "\\u000b", "\\f", "\\r", + "\\u000e", "\\u000f", "\\u0010", "\\u0011", "\\u0012", "\\u0013", "\\u0014", + "\\u0015", "\\u0016", "\\u0017", "\\u0018", "\\u0019", "\\u001a", "\\u001b", + "\\u001c", "\\u001d", "\\u001e", "\\u001f"}; + +// All Unicode characters may be placed within the quotation marks, except for +// the characters that MUST be escaped: quotation mark, reverse solidus, and the +// control characters (U+0000 through U+001F). There are two-character sequence +// escape representations of some popular characters: +// \", \\, \b, \f, \n, \r, \t. +SIMDJSON_CONSTEXPR_LAMBDA simdjson_inline void escape_json_char(char c, char *&out) { + if (c == '"') { + memcpy(out, "\\\"", 2); + out += 2; + } else if (c == '\\') { + memcpy(out, "\\\\", 2); + out += 2; + } else { + std::string_view v = control_chars[uint8_t(c)]; + memcpy(out, v.data(), v.size()); + out += v.size(); + } +} + +// Writes the escaped version of input to out, returning the number of bytes +// written. Uses SIMD position finding to locate quotable characters efficiently. +inline size_t write_string_escaped(const std::string_view input, char *out) { + size_t mysize = input.size(); + + // Use SIMD position finder directly - it returns mysize if no escape needed + size_t location = find_next_json_quotable_character(input, 0); + if (location == mysize) { + // Fast path: no escaping needed + memcpy(out, input.data(), input.size()); + return input.size(); + } + + const char *const initout = out; + memcpy(out, input.data(), location); + out += location; + escape_json_char(input[location], out); + location += 1; + while (location < mysize) { + size_t newlocation = find_next_json_quotable_character(input, location); + memcpy(out, input.data() + location, newlocation - location); + out += newlocation - location; + location = newlocation; + if (location == mysize) { + break; + } + escape_json_char(input[location], out); + location += 1; + } + return out - initout; +} + +simdjson_inline string_builder::string_builder(size_t initial_capacity) + : buffer(new(std::nothrow) char[initial_capacity]), position(0), + capacity(buffer.get() != nullptr ? initial_capacity : 0), + is_valid(buffer.get() != nullptr) {} + +simdjson_inline bool string_builder::capacity_check(size_t upcoming_bytes) { + // We use the convention that when is_valid is false, then the capacity and + // the position are 0. + // Most of the time, this function will return true. + if (simdjson_likely(upcoming_bytes <= capacity - position)) { + return true; + } + // check for overflow, most of the time there is no overflow + if (simdjson_unlikely(position + upcoming_bytes < position)) { + return false; + } + // We will rarely get here. + grow_buffer((std::max)(capacity * 2, position + upcoming_bytes)); + // If the buffer allocation failed, we set is_valid to false. + return is_valid; +} + +simdjson_inline void string_builder::grow_buffer(size_t desired_capacity) { + if (!is_valid) { + return; + } + std::unique_ptr<char[]> new_buffer(new (std::nothrow) char[desired_capacity]); + if (new_buffer.get() == nullptr) { + set_valid(false); + return; + } + std::memcpy(new_buffer.get(), buffer.get(), position); + buffer.swap(new_buffer); + capacity = desired_capacity; +} + +simdjson_inline void string_builder::set_valid(bool valid) noexcept { + if (!valid) { + is_valid = false; + capacity = 0; + position = 0; + buffer.reset(); + } else { + is_valid = true; + } +} + +simdjson_inline size_t string_builder::size() const noexcept { + return position; +} + +simdjson_inline void string_builder::append(char c) noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = c; + } +} + +simdjson_inline void string_builder::append_null() noexcept { + constexpr char null_literal[] = "null"; + constexpr size_t null_len = sizeof(null_literal) - 1; + if (capacity_check(null_len)) { + std::memcpy(buffer.get() + position, null_literal, null_len); + position += null_len; + } +} + +simdjson_inline void string_builder::clear() noexcept { + position = 0; + // if it was invalid, we should try to repair it + if (!is_valid) { + capacity = 0; + buffer.reset(); + is_valid = true; + } +} + +namespace internal { + +template <typename number_type, typename = typename std::enable_if< + std::is_unsigned<number_type>::value>::type> +simdjson_really_inline int int_log2(number_type x) { + return 63 - leading_zeroes(uint64_t(x) | 1); +} + +simdjson_really_inline int fast_digit_count_32(uint32_t x) { + static uint64_t table[] = { + 4294967296, 8589934582, 8589934582, 8589934582, 12884901788, + 12884901788, 12884901788, 17179868184, 17179868184, 17179868184, + 21474826480, 21474826480, 21474826480, 21474826480, 25769703776, + 25769703776, 25769703776, 30063771072, 30063771072, 30063771072, + 34349738368, 34349738368, 34349738368, 34349738368, 38554705664, + 38554705664, 38554705664, 41949672960, 41949672960, 41949672960, + 42949672960, 42949672960}; + return uint32_t((x + table[int_log2(x)]) >> 32); +} + +simdjson_really_inline int fast_digit_count_64(uint64_t x) { + static uint64_t table[] = {9, + 99, + 999, + 9999, + 99999, + 999999, + 9999999, + 99999999, + 999999999, + 9999999999, + 99999999999, + 999999999999, + 9999999999999, + 99999999999999, + 999999999999999ULL, + 9999999999999999ULL, + 99999999999999999ULL, + 999999999999999999ULL, + 9999999999999999999ULL}; + int y = (19 * int_log2(x) >> 6); + y += x > table[y]; + return y + 1; +} + +template <typename number_type, typename = typename std::enable_if< + std::is_unsigned<number_type>::value>::type> +simdjson_really_inline size_t digit_count(number_type v) noexcept { + static_assert(sizeof(number_type) == 8 || sizeof(number_type) == 4 || + sizeof(number_type) == 2 || sizeof(number_type) == 1, + "We only support 8-bit, 16-bit, 32-bit and 64-bit numbers"); + SIMDJSON_IF_CONSTEXPR(sizeof(number_type) <= 4) { + return fast_digit_count_32(static_cast<uint32_t>(v)); + } + else { + return fast_digit_count_64(static_cast<uint64_t>(v)); + } +} +static const char decimal_table[200] = { + 0x30, 0x30, 0x30, 0x31, 0x30, 0x32, 0x30, 0x33, 0x30, 0x34, 0x30, 0x35, + 0x30, 0x36, 0x30, 0x37, 0x30, 0x38, 0x30, 0x39, 0x31, 0x30, 0x31, 0x31, + 0x31, 0x32, 0x31, 0x33, 0x31, 0x34, 0x31, 0x35, 0x31, 0x36, 0x31, 0x37, + 0x31, 0x38, 0x31, 0x39, 0x32, 0x30, 0x32, 0x31, 0x32, 0x32, 0x32, 0x33, + 0x32, 0x34, 0x32, 0x35, 0x32, 0x36, 0x32, 0x37, 0x32, 0x38, 0x32, 0x39, + 0x33, 0x30, 0x33, 0x31, 0x33, 0x32, 0x33, 0x33, 0x33, 0x34, 0x33, 0x35, + 0x33, 0x36, 0x33, 0x37, 0x33, 0x38, 0x33, 0x39, 0x34, 0x30, 0x34, 0x31, + 0x34, 0x32, 0x34, 0x33, 0x34, 0x34, 0x34, 0x35, 0x34, 0x36, 0x34, 0x37, + 0x34, 0x38, 0x34, 0x39, 0x35, 0x30, 0x35, 0x31, 0x35, 0x32, 0x35, 0x33, + 0x35, 0x34, 0x35, 0x35, 0x35, 0x36, 0x35, 0x37, 0x35, 0x38, 0x35, 0x39, + 0x36, 0x30, 0x36, 0x31, 0x36, 0x32, 0x36, 0x33, 0x36, 0x34, 0x36, 0x35, + 0x36, 0x36, 0x36, 0x37, 0x36, 0x38, 0x36, 0x39, 0x37, 0x30, 0x37, 0x31, + 0x37, 0x32, 0x37, 0x33, 0x37, 0x34, 0x37, 0x35, 0x37, 0x36, 0x37, 0x37, + 0x37, 0x38, 0x37, 0x39, 0x38, 0x30, 0x38, 0x31, 0x38, 0x32, 0x38, 0x33, + 0x38, 0x34, 0x38, 0x35, 0x38, 0x36, 0x38, 0x37, 0x38, 0x38, 0x38, 0x39, + 0x39, 0x30, 0x39, 0x31, 0x39, 0x32, 0x39, 0x33, 0x39, 0x34, 0x39, 0x35, + 0x39, 0x36, 0x39, 0x37, 0x39, 0x38, 0x39, 0x39, +}; +} // namespace internal + +template <typename number_type, typename> +simdjson_inline void string_builder::append(number_type v) noexcept { + static_assert(std::is_same<number_type, bool>::value || + std::is_integral<number_type>::value || + std::is_floating_point<number_type>::value, + "Unsupported number type"); + // If C++17 is available, we can 'if constexpr' here. + SIMDJSON_IF_CONSTEXPR(std::is_same<number_type, bool>::value) { + if (v) { + constexpr char true_literal[] = "true"; + constexpr size_t true_len = sizeof(true_literal) - 1; + if (capacity_check(true_len)) { + std::memcpy(buffer.get() + position, true_literal, true_len); + position += true_len; + } + } else { + constexpr char false_literal[] = "false"; + constexpr size_t false_len = sizeof(false_literal) - 1; + if (capacity_check(false_len)) { + std::memcpy(buffer.get() + position, false_literal, false_len); + position += false_len; + } + } + } + else SIMDJSON_IF_CONSTEXPR(std::is_unsigned<number_type>::value) { + // Process 4 digits at a time instead of 2, reducing store operations + // and divisions by approximately half for large numbers. + constexpr size_t max_number_size = 20; + if (capacity_check(max_number_size)) { + using unsigned_type = typename std::make_unsigned<number_type>::type; + unsigned_type pv = static_cast<unsigned_type>(v); + size_t dc = internal::digit_count(pv); + char *write_pointer = buffer.get() + position + dc - 1; + + // Process 4 digits per iteration for large numbers + while (pv >= 10000) { + unsigned_type q = pv / 10000; + unsigned_type r = pv % 10000; + unsigned_type r_hi = r / 100; // High 2 digits of remainder + unsigned_type r_lo = r % 100; // Low 2 digits of remainder + // Write low 2 digits first (rightmost), then high 2 digits + memcpy(write_pointer - 1, &internal::decimal_table[r_lo * 2], 2); + memcpy(write_pointer - 3, &internal::decimal_table[r_hi * 2], 2); + write_pointer -= 4; + pv = q; + } + + // Handle remaining 1-4 digits with original 2-digit loop + while (pv >= 100) { + memcpy(write_pointer - 1, &internal::decimal_table[(pv % 100) * 2], 2); + write_pointer -= 2; + pv /= 100; + } + if (pv >= 10) { + *write_pointer-- = char('0' + (pv % 10)); + pv /= 10; + } + *write_pointer = char('0' + pv); + position += dc; + } + } + else SIMDJSON_IF_CONSTEXPR(std::is_integral<number_type>::value) { + // Same 4-digit batching as unsigned path for signed integers + constexpr size_t max_number_size = 20; + if (capacity_check(max_number_size)) { + using unsigned_type = typename std::make_unsigned<number_type>::type; + bool negative = v < 0; + unsigned_type pv = static_cast<unsigned_type>(v); + if (negative) { + pv = 0 - pv; // the 0 is for Microsoft + } + size_t dc = internal::digit_count(pv); + // by always writing the minus sign, we avoid the branch. + buffer.get()[position] = '-'; + position += negative ? 1 : 0; + char *write_pointer = buffer.get() + position + dc - 1; + + // Process 4 digits per iteration for large numbers + while (pv >= 10000) { + unsigned_type q = pv / 10000; + unsigned_type r = pv % 10000; + unsigned_type r_hi = r / 100; + unsigned_type r_lo = r % 100; + memcpy(write_pointer - 1, &internal::decimal_table[r_lo * 2], 2); + memcpy(write_pointer - 3, &internal::decimal_table[r_hi * 2], 2); + write_pointer -= 4; + pv = q; + } + + // Handle remaining 1-4 digits + while (pv >= 100) { + memcpy(write_pointer - 1, &internal::decimal_table[(pv % 100) * 2], 2); + write_pointer -= 2; + pv /= 100; + } + if (pv >= 10) { + *write_pointer-- = char('0' + (pv % 10)); + pv /= 10; + } + *write_pointer = char('0' + pv); + position += dc; + } + } + else SIMDJSON_IF_CONSTEXPR(std::is_floating_point<number_type>::value) { + constexpr size_t max_number_size = 24; + if (capacity_check(max_number_size)) { + // We could specialize for float. + char *end = simdjson::internal::to_chars(buffer.get() + position, nullptr, + double(v)); + position = end - buffer.get(); + } + } +} + +simdjson_inline void +string_builder::escape_and_append(std::string_view input) noexcept { + // escaping might turn a control character into \x00xx so 6 characters. + if (capacity_check(6 * input.size())) { + position += write_string_escaped(input, buffer.get() + position); + } +} + +simdjson_inline void +string_builder::escape_and_append_with_quotes(std::string_view input) noexcept { + // escaping might turn a control character into \x00xx so 6 characters. + if (capacity_check(2 + 6 * input.size())) { + buffer.get()[position++] = '"'; + position += write_string_escaped(input, buffer.get() + position); + buffer.get()[position++] = '"'; + } +} + +simdjson_inline void +string_builder::escape_and_append_with_quotes(char input) noexcept { + // escaping might turn a control character into \x00xx so 6 characters. + if (capacity_check(2 + 6 * 1)) { + buffer.get()[position++] = '"'; + std::string_view cinput(&input, 1); + position += write_string_escaped(cinput, buffer.get() + position); + buffer.get()[position++] = '"'; + } +} + +simdjson_inline void +string_builder::escape_and_append_with_quotes(const char *input) noexcept { + std::string_view cinput(input); + escape_and_append_with_quotes(cinput); +} +#if SIMDJSON_SUPPORTS_CONCEPTS +template <constevalutil::fixed_string key> +simdjson_inline void string_builder::escape_and_append_with_quotes() noexcept { + escape_and_append_with_quotes(constevalutil::string_constant<key>::value); +} +#endif + +simdjson_inline void string_builder::append_raw(const char *c) noexcept { + size_t len = std::strlen(c); + append_raw(c, len); +} + +simdjson_inline void +string_builder::append_raw(std::string_view input) noexcept { + if (capacity_check(input.size())) { + std::memcpy(buffer.get() + position, input.data(), input.size()); + position += input.size(); + } +} + +simdjson_inline void string_builder::append_raw(const char *str, + size_t len) noexcept { + if (capacity_check(len)) { + std::memcpy(buffer.get() + position, str, len); + position += len; + } +} +#if SIMDJSON_SUPPORTS_CONCEPTS +// Support for optional types (std::optional, etc.) +template <concepts::optional_type T> + requires(!require_custom_serialization<T>) +simdjson_inline void string_builder::append(const T &opt) { + if (opt) { + append(*opt); + } else { + append_null(); + } +} + +template <typename T> + requires(require_custom_serialization<T>) +simdjson_inline void string_builder::append(T &&val) { + serialize(*this, std::forward<T>(val)); +} + +template <typename T> + requires(std::is_convertible<T, std::string_view>::value || + std::is_same<T, const char *>::value) +simdjson_inline void string_builder::append(const T &value) { + escape_and_append_with_quotes(value); +} +#endif + +#if SIMDJSON_SUPPORTS_RANGES && SIMDJSON_SUPPORTS_CONCEPTS +// Support for range-based appending (std::ranges::view, etc.) +template <std::ranges::range R> + requires(!std::is_convertible<R, std::string_view>::value && !require_custom_serialization<R>) +simdjson_inline void string_builder::append(const R &range) noexcept { + auto it = std::ranges::begin(range); + auto end = std::ranges::end(range); + if constexpr (concepts::is_pair<std::ranges::range_value_t<R>>) { + start_object(); + + if (it == end) { + end_object(); + return; // Handle empty range + } + // Append first item without leading comma + append_key_value(it->first, it->second); + ++it; + + // Append remaining items with preceding commas + for (; it != end; ++it) { + append_comma(); + append_key_value(it->first, it->second); + } + end_object(); + } else { + start_array(); + if (it == end) { + end_array(); + return; // Handle empty range + } + + // Append first item without leading comma + append(*it); + ++it; + + // Append remaining items with preceding commas + for (; it != end; ++it) { + append_comma(); + append(*it); + } + end_array(); + } +} + +#endif + +#if SIMDJSON_EXCEPTIONS +simdjson_inline string_builder::operator std::string() const noexcept(false) { + return std::string(operator std::string_view()); +} + +simdjson_inline string_builder::operator std::string_view() const + noexcept(false) simdjson_lifetime_bound { + return view(); +} +#endif + +simdjson_inline simdjson_result<std::string_view> +string_builder::view() const noexcept { + if (!is_valid) { + return simdjson::OUT_OF_CAPACITY; + } + return std::string_view(buffer.get(), position); +} + +simdjson_inline simdjson_result<const char *> string_builder::c_str() noexcept { + if (capacity_check(1)) { + buffer.get()[position] = '\0'; + return buffer.get(); + } + return simdjson::OUT_OF_CAPACITY; +} + +simdjson_inline bool string_builder::validate_unicode() const noexcept { + return simdjson::validate_utf8(buffer.get(), position); +} + +simdjson_inline void string_builder::start_object() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '{'; + } +} + +simdjson_inline void string_builder::end_object() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '}'; + } +} + +simdjson_inline void string_builder::start_array() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '['; + } +} + +simdjson_inline void string_builder::end_array() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ']'; + } +} + +simdjson_inline void string_builder::append_comma() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ','; + } +} + +simdjson_inline void string_builder::append_colon() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ':'; + } +} + +template <typename key_type, typename value_type> +simdjson_inline void +string_builder::append_key_value(key_type key, value_type value) noexcept { + static_assert(std::is_same<key_type, const char *>::value || + std::is_convertible<key_type, std::string_view>::value, + "Unsupported key type"); + escape_and_append_with_quotes(key); + append_colon(); + SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, std::nullptr_t>::value) { + append_null(); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, char>::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR( + std::is_convertible<value_type, std::string_view>::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, const char *>::value) { + escape_and_append_with_quotes(value); + } + else { + append(value); + } +} + +#if SIMDJSON_SUPPORTS_CONCEPTS +template <constevalutil::fixed_string key, typename value_type> +simdjson_inline void +string_builder::append_key_value(value_type value) noexcept { + escape_and_append_with_quotes<key>(); + append_colon(); + SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, std::nullptr_t>::value) { + append_null(); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, char>::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR( + std::is_convertible<value_type, std::string_view>::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, const char *>::value) { + escape_and_append_with_quotes(value); + } + else { + append(value); + } +} +#endif + +} // namespace builder +} // namespace arm64 +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_STRING_BUILDER_INL_H +/* end file simdjson/generic/builder/json_string_builder-inl.h for arm64 */ + +/* end file simdjson/generic/builder/amalgamated.h for arm64 */ +/* including simdjson/arm64/end.h: #include "simdjson/arm64/end.h" */ +/* begin file simdjson/arm64/end.h */ +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#undef SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT +/* undefining SIMDJSON_IMPLEMENTATION from "arm64" */ +#undef SIMDJSON_IMPLEMENTATION +/* end file simdjson/arm64/end.h */ + +#endif // SIMDJSON_ARM64_BUILDER_H +/* end file simdjson/arm64/builder.h */ +#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(fallback) +/* including simdjson/fallback/builder.h: #include "simdjson/fallback/builder.h" */ +/* begin file simdjson/fallback/builder.h */ +#ifndef SIMDJSON_FALLBACK_BUILDER_H +#define SIMDJSON_FALLBACK_BUILDER_H + +/* including simdjson/fallback/begin.h: #include "simdjson/fallback/begin.h" */ +/* begin file simdjson/fallback/begin.h */ +/* defining SIMDJSON_IMPLEMENTATION to "fallback" */ +#define SIMDJSON_IMPLEMENTATION fallback +/* including simdjson/fallback/base.h: #include "simdjson/fallback/base.h" */ +/* begin file simdjson/fallback/base.h */ +#ifndef SIMDJSON_FALLBACK_BASE_H +#define SIMDJSON_FALLBACK_BASE_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +/** + * Fallback implementation (runs on any machine). + */ +namespace fallback { + +class implementation; + +} // namespace fallback +} // namespace simdjson + +#endif // SIMDJSON_FALLBACK_BASE_H +/* end file simdjson/fallback/base.h */ +/* including simdjson/fallback/bitmanipulation.h: #include "simdjson/fallback/bitmanipulation.h" */ +/* begin file simdjson/fallback/bitmanipulation.h */ +#ifndef SIMDJSON_FALLBACK_BITMANIPULATION_H +#define SIMDJSON_FALLBACK_BITMANIPULATION_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/fallback/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace fallback { +namespace { + +#if defined(_MSC_VER) && !defined(_M_ARM64) && !defined(_M_X64) +static inline unsigned char _BitScanForward64(unsigned long* ret, uint64_t x) { + unsigned long x0 = (unsigned long)x, top, bottom; + _BitScanForward(&top, (unsigned long)(x >> 32)); + _BitScanForward(&bottom, x0); + *ret = x0 ? bottom : 32 + top; + return x != 0; +} +static unsigned char _BitScanReverse64(unsigned long* ret, uint64_t x) { + unsigned long x1 = (unsigned long)(x >> 32), top, bottom; + _BitScanReverse(&top, x1); + _BitScanReverse(&bottom, (unsigned long)x); + *ret = x1 ? top + 32 : bottom; + return x != 0; +} +#endif + +/* result might be undefined when input_num is zero */ +simdjson_inline int leading_zeroes(uint64_t input_num) { +#ifdef _MSC_VER + unsigned long leading_zero = 0; + // Search the mask data from most significant bit (MSB) + // to least significant bit (LSB) for a set bit (1). + if (_BitScanReverse64(&leading_zero, input_num)) + return (int)(63 - leading_zero); + else + return 64; +#else + return __builtin_clzll(input_num); +#endif// _MSC_VER +} + +simdjson_inline int trailing_zeroes(uint64_t input_num) { +#ifdef _MSC_VER + unsigned long trailing_zero = 0; + // Search the mask data from least significant bit (LSB) + // to most significant bit (MSB) for a set bit (1). + if (_BitScanForward64(&trailing_zero, input_num)) + return (int)trailing_zero; + else return 64; +#else + return __builtin_ctzll(input_num); +#endif// _MSC_VER +} + +} // unnamed namespace +} // namespace fallback +} // namespace simdjson + +#endif // SIMDJSON_FALLBACK_BITMANIPULATION_H +/* end file simdjson/fallback/bitmanipulation.h */ +/* including simdjson/fallback/stringparsing_defs.h: #include "simdjson/fallback/stringparsing_defs.h" */ +/* begin file simdjson/fallback/stringparsing_defs.h */ +#ifndef SIMDJSON_FALLBACK_STRINGPARSING_DEFS_H +#define SIMDJSON_FALLBACK_STRINGPARSING_DEFS_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/fallback/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace fallback { +namespace { + +// Holds backslashes and quotes locations. +struct backslash_and_quote { +public: + static constexpr uint32_t BYTES_PROCESSED = 1; + simdjson_inline backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst); + + simdjson_inline bool has_quote_first() { return c == '"'; } + simdjson_inline bool has_backslash() { return c == '\\'; } + simdjson_inline int quote_index() { return c == '"' ? 0 : 1; } + simdjson_inline int backslash_index() { return c == '\\' ? 0 : 1; } + + uint8_t c; +}; // struct backslash_and_quote + +simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) { + // store to dest unconditionally - we can overwrite the bits we don't like later + dst[0] = src[0]; + return { src[0] }; +} + + +struct escaping { + static constexpr uint32_t BYTES_PROCESSED = 1; + simdjson_inline static escaping copy_and_find(const uint8_t *src, uint8_t *dst); + + simdjson_inline bool has_escape() { return escape_bits; } + simdjson_inline int escape_index() { return 0; } + + bool escape_bits; +}; // struct escaping + + + +simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *dst) { + dst[0] = src[0]; + return { (src[0] == '\\') || (src[0] == '"') || (src[0] < 32) }; +} + +} // unnamed namespace +} // namespace fallback +} // namespace simdjson + +#endif // SIMDJSON_FALLBACK_STRINGPARSING_DEFS_H +/* end file simdjson/fallback/stringparsing_defs.h */ +/* including simdjson/fallback/numberparsing_defs.h: #include "simdjson/fallback/numberparsing_defs.h" */ +/* begin file simdjson/fallback/numberparsing_defs.h */ +#ifndef SIMDJSON_FALLBACK_NUMBERPARSING_DEFS_H +#define SIMDJSON_FALLBACK_NUMBERPARSING_DEFS_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/fallback/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#include <cstring> + +#ifdef JSON_TEST_NUMBERS // for unit testing +void found_invalid_number(const uint8_t *buf); +void found_integer(int64_t result, const uint8_t *buf); +void found_unsigned_integer(uint64_t result, const uint8_t *buf); +void found_float(double result, const uint8_t *buf); +#endif + +namespace simdjson { +namespace fallback { +namespace numberparsing { + +// credit: https://johnnylee-sde.github.io/Fast-numeric-string-to-int/ +/** @private */ +static simdjson_inline uint32_t parse_eight_digits_unrolled(const char *chars) { + uint64_t val; + memcpy(&val, chars, sizeof(uint64_t)); + val = (val & 0x0F0F0F0F0F0F0F0F) * 2561 >> 8; + val = (val & 0x00FF00FF00FF00FF) * 6553601 >> 16; + return uint32_t((val & 0x0000FFFF0000FFFF) * 42949672960001 >> 32); +} + +/** @private */ +static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) { + return parse_eight_digits_unrolled(reinterpret_cast<const char *>(chars)); +} + +#if SIMDJSON_IS_32BITS // _umul128 for x86, arm +// this is a slow emulation routine for 32-bit +// +static simdjson_inline uint64_t __emulu(uint32_t x, uint32_t y) { + return x * (uint64_t)y; +} +static simdjson_inline uint64_t _umul128(uint64_t ab, uint64_t cd, uint64_t *hi) { + uint64_t ad = __emulu((uint32_t)(ab >> 32), (uint32_t)cd); + uint64_t bd = __emulu((uint32_t)ab, (uint32_t)cd); + uint64_t adbc = ad + __emulu((uint32_t)ab, (uint32_t)(cd >> 32)); + uint64_t adbc_carry = !!(adbc < ad); + uint64_t lo = bd + (adbc << 32); + *hi = __emulu((uint32_t)(ab >> 32), (uint32_t)(cd >> 32)) + (adbc >> 32) + + (adbc_carry << 32) + !!(lo < bd); + return lo; +} +#endif + +/** @private */ +simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) { + internal::value128 answer; +#if SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS +#if SIMDJSON_IS_ARM64 + // ARM64 has native support for 64-bit multiplications, no need to emultate + answer.high = __umulh(value1, value2); + answer.low = value1 * value2; +#else + answer.low = _umul128(value1, value2, &answer.high); // _umul128 not available on ARM64 +#endif // SIMDJSON_IS_ARM64 +#else // SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS + __uint128_t r = (static_cast<__uint128_t>(value1)) * value2; + answer.low = uint64_t(r); + answer.high = uint64_t(r >> 64); +#endif + return answer; +} + +} // namespace numberparsing +} // namespace fallback +} // namespace simdjson + +#ifndef SIMDJSON_SWAR_NUMBER_PARSING +#if SIMDJSON_IS_BIG_ENDIAN +#define SIMDJSON_SWAR_NUMBER_PARSING 0 +#else +#define SIMDJSON_SWAR_NUMBER_PARSING 1 +#endif +#endif + +#endif // SIMDJSON_FALLBACK_NUMBERPARSING_DEFS_H +/* end file simdjson/fallback/numberparsing_defs.h */ +/* end file simdjson/fallback/begin.h */ +/* including simdjson/generic/builder/amalgamated.h for fallback: #include "simdjson/generic/builder/amalgamated.h" */ +/* begin file simdjson/generic/builder/amalgamated.h for fallback */ +#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_BUILDER_DEPENDENCIES_H) +#error simdjson/generic/builder/dependencies.h must be included before simdjson/generic/builder/amalgamated.h! +#endif + +/* including simdjson/generic/builder/json_string_builder.h for fallback: #include "simdjson/generic/builder/json_string_builder.h" */ +/* begin file simdjson/generic/builder/json_string_builder.h for fallback */ +#ifndef SIMDJSON_GENERIC_STRING_BUILDER_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { + + +#if SIMDJSON_SUPPORTS_CONCEPTS + +namespace fallback { +namespace builder { + class string_builder; +}} + +template <typename T, typename = void> +struct has_custom_serialization : std::false_type {}; + +inline constexpr struct serialize_tag { + template <typename T> + constexpr void operator()(fallback::builder::string_builder& b, T&& obj) const{ + return tag_invoke(*this, b, std::forward<T>(obj)); + } + + +} serialize{}; +template <typename T> +struct has_custom_serialization<T, std::void_t< + decltype(tag_invoke(serialize, std::declval<fallback::builder::string_builder&>(), std::declval<T&>())) +>> : std::true_type {}; + +template <typename T> +constexpr bool require_custom_serialization = has_custom_serialization<T>::value; +#else +struct has_custom_serialization : std::false_type {}; +#endif // SIMDJSON_SUPPORTS_CONCEPTS + +namespace fallback { +namespace builder { +/** + * A builder for JSON strings representing documents. This is a low-level + * builder that is not meant to be used directly by end-users. Though it + * supports atomic types (Booleans, strings), it does not support composed + * types (arrays and objects). + * + * Ultimately, this class can support kernel-specific optimizations. E.g., + * it may make use of SIMD instructions to escape strings faster. + */ +class string_builder { +public: + simdjson_inline string_builder(size_t initial_capacity = DEFAULT_INITIAL_CAPACITY); + + static constexpr size_t DEFAULT_INITIAL_CAPACITY = 1024; + + /** + * Append number (includes Booleans). Booleans are mapped to the strings + * false and true. Numbers are converted to strings abiding by the JSON standard. + * Floating-point numbers are converted to the shortest string that 'correctly' + * represents the number. + */ + template<typename number_type, + typename = typename std::enable_if<std::is_arithmetic<number_type>::value>::type> + simdjson_inline void append(number_type v) noexcept; + + /** + * Append character c. + */ + simdjson_inline void append(char c) noexcept; + + /** + * Append the string 'null'. + */ + simdjson_inline void append_null() noexcept; + + /** + * Clear the content. + */ + simdjson_inline void clear() noexcept; + + /** + * Append the std::string_view, after escaping it. + * There is no UTF-8 validation. + */ + simdjson_inline void escape_and_append(std::string_view input) noexcept; + + /** + * Append the std::string_view surrounded by double quotes, after escaping it. + * There is no UTF-8 validation. + */ + simdjson_inline void escape_and_append_with_quotes(std::string_view input) noexcept; +#if SIMDJSON_SUPPORTS_CONCEPTS + template<constevalutil::fixed_string key> + simdjson_inline void escape_and_append_with_quotes() noexcept; +#endif + /** + * Append the character surrounded by double quotes, after escaping it. + * There is no UTF-8 validation. + */ + simdjson_inline void escape_and_append_with_quotes(char input) noexcept; + + /** + * Append the character surrounded by double quotes, after escaping it. + * There is no UTF-8 validation. + */ + simdjson_inline void escape_and_append_with_quotes(const char* input) noexcept; + + /** + * Append the C string directly, without escaping. + * There is no UTF-8 validation. + */ + simdjson_inline void append_raw(const char *c) noexcept; + + /** + * Append "{" to the buffer. + */ + simdjson_inline void start_object() noexcept; + + /** + * Append "}" to the buffer. + */ + simdjson_inline void end_object() noexcept; + + /** + * Append "[" to the buffer. + */ + simdjson_inline void start_array() noexcept; + + /** + * Append "]" to the buffer. + */ + simdjson_inline void end_array() noexcept; + + /** + * Append "," to the buffer. + */ + simdjson_inline void append_comma() noexcept; + + /** + * Append ":" to the buffer. + */ + simdjson_inline void append_colon() noexcept; + + /** + * Append a key-value pair to the buffer. + * The key is escaped and surrounded by double quotes. + * The value is escaped if it is a string. + */ + template<typename key_type, typename value_type> + simdjson_inline void append_key_value(key_type key, value_type value) noexcept; +#if SIMDJSON_SUPPORTS_CONCEPTS + template<constevalutil::fixed_string key, typename value_type> + simdjson_inline void append_key_value(value_type value) noexcept; + + // Support for optional types (std::optional, etc.) + template <concepts::optional_type T> + requires(!require_custom_serialization<T>) + simdjson_inline void append(const T &opt); + + template <typename T> + requires(require_custom_serialization<T>) + simdjson_inline void append(T &&val); + + // Support for string-like types + template <typename T> + requires(std::is_convertible<T, std::string_view>::value || + std::is_same<T, const char*>::value ) + simdjson_inline void append(const T &value); +#endif +#if SIMDJSON_SUPPORTS_RANGES && SIMDJSON_SUPPORTS_CONCEPTS + // Support for range-based appending (std::ranges::view, etc.) + template <std::ranges::range R> +requires (!std::is_convertible<R, std::string_view>::value && !require_custom_serialization<R>) + simdjson_inline void append(const R &range) noexcept; +#endif + /** + * Append the std::string_view directly, without escaping. + * There is no UTF-8 validation. + */ + simdjson_inline void append_raw(std::string_view input) noexcept; + + /** + * Append len characters from str. + * There is no UTF-8 validation. + */ + simdjson_inline void append_raw(const char *str, size_t len) noexcept; +#if SIMDJSON_EXCEPTIONS + /** + * Creates an std::string from the written JSON buffer. + * Throws if memory allocation failed + * + * The result may not be valid UTF-8 if some of your content was not valid UTF-8. + * Use validate_unicode() to check the content if needed. + */ + simdjson_inline operator std::string() const noexcept(false); + + /** + * Creates an std::string_view from the written JSON buffer. + * Throws if memory allocation failed. + * + * The result may not be valid UTF-8 if some of your content was not valid UTF-8. + * Use validate_unicode() to check the content if needed. + */ + simdjson_inline operator std::string_view() const noexcept(false) simdjson_lifetime_bound; +#endif + + /** + * Returns a view on the written JSON buffer. Returns an error + * if memory allocation failed. + * + * The result may not be valid UTF-8 if some of your content was not valid UTF-8. + * Use validate_unicode() to check the content. + */ + simdjson_inline simdjson_result<std::string_view> view() const noexcept; + + /** + * Appends the null character to the buffer and returns + * a pointer to the beginning of the written JSON buffer. + * Returns an error if memory allocation failed. + * The result is null-terminated. + * + * The result may not be valid UTF-8 if some of your content was not valid UTF-8. + * Use validate_unicode() to check the content. + */ + simdjson_inline simdjson_result<const char *> c_str() noexcept; + + /** + * Return true if the content is valid UTF-8. + */ + simdjson_inline bool validate_unicode() const noexcept; + + /** + * Returns the current size of the written JSON buffer. + * If an error occurred, returns 0. + */ + simdjson_inline size_t size() const noexcept; + +private: + /** + * Returns true if we can write at least upcoming_bytes bytes. + * The underlying buffer is reallocated if needed. It is designed + * to be called before writing to the buffer. It should be fast. + */ + simdjson_inline bool capacity_check(size_t upcoming_bytes); + + /** + * Grow the buffer to at least desired_capacity bytes. + * If the allocation fails, is_valid is set to false. We expect + * that this function would not be repeatedly called. + */ + simdjson_inline void grow_buffer(size_t desired_capacity); + + /** + * We use this helper function to make sure that is_valid is kept consistent. + */ + simdjson_inline void set_valid(bool valid) noexcept; + + std::unique_ptr<char[]> buffer{}; + size_t position{0}; + size_t capacity{0}; + bool is_valid{true}; +}; + + + +} +} + + +#if !SIMDJSON_STATIC_REFLECTION +// fallback implementation until we have static reflection +template <class Z> +simdjson_warn_unused simdjson_result<std::string> to_json(const Z &z, size_t initial_capacity = simdjson::fallback::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + simdjson::fallback::builder::string_builder b(initial_capacity); + b.append(z); + std::string_view s; + auto e = b.view().get(s); + if(e) { return e; } + return std::string(s); +} +template <class Z> +simdjson_warn_unused error_code to_json(const Z &z, std::string &s, size_t initial_capacity = simdjson::fallback::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + simdjson::fallback::builder::string_builder b(initial_capacity); + b.append(z); + std::string_view sv; + auto e = b.view().get(sv); + if(e) { return e; } + s.assign(sv.data(), sv.size()); + return simdjson::SUCCESS; +} +#endif + +#if SIMDJSON_SUPPORTS_CONCEPTS +#endif // SIMDJSON_SUPPORTS_CONCEPTS + +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_STRING_BUILDER_H +/* end file simdjson/generic/builder/json_string_builder.h for fallback */ +/* including simdjson/generic/builder/json_builder.h for fallback: #include "simdjson/generic/builder/json_builder.h" */ +/* begin file simdjson/generic/builder/json_builder.h for fallback */ +#ifndef SIMDJSON_GENERIC_BUILDER_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_string_builder.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/concepts.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ +#if SIMDJSON_STATIC_REFLECTION + +#include <charconv> +#include <cstring> +#include <meta> +#include <memory> +#include <optional> +#include <string_view> +#include <type_traits> +#include <utility> +// #include <static_reflection> // for std::define_static_string - header not available yet + +namespace simdjson { +namespace fallback { +namespace builder { + +template <class T> + requires(concepts::container_but_not_string<T> && !require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &t) { + auto it = t.begin(); + auto end = t.end(); + if (it == end) { + b.append_raw("[]"); + return; + } + b.append('['); + atom(b, *it); + ++it; + for (; it != end; ++it) { + b.append(','); + atom(b, *it); + } + b.append(']'); +} + +template <class T> + requires(std::is_same_v<T, std::string> || + std::is_same_v<T, std::string_view> || + std::is_same_v<T, const char *> || + std::is_same_v<T, char>) +constexpr void atom(string_builder &b, const T &t) { + b.escape_and_append_with_quotes(t); +} + +template <concepts::string_view_keyed_map T> + requires(!require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &m) { + if (m.empty()) { + b.append_raw("{}"); + return; + } + b.append('{'); + bool first = true; + for (const auto& [key, value] : m) { + if (!first) { + b.append(','); + } + first = false; + // Keys must be convertible to string_view per the concept + b.escape_and_append_with_quotes(key); + b.append(':'); + atom(b, value); + } + b.append('}'); +} + + +template<typename number_type, + typename = typename std::enable_if<std::is_arithmetic<number_type>::value && !std::is_same_v<number_type, char>>::type> +constexpr void atom(string_builder &b, const number_type t) { + b.append(t); +} + +template <class T> + requires(std::is_class_v<T> && !concepts::container_but_not_string<T> && + !concepts::string_view_keyed_map<T> && + !concepts::optional_type<T> && + !concepts::smart_pointer<T> && + !concepts::appendable_containers<T> && + !std::is_same_v<T, std::string> && + !std::is_same_v<T, std::string_view> && + !std::is_same_v<T, const char*> && + !std::is_same_v<T, char> && !require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &t) { + int i = 0; + b.append('{'); + template for (constexpr auto dm : std::define_static_array(std::meta::nonstatic_data_members_of(^^T, std::meta::access_context::unchecked()))) { + if (i != 0) + b.append(','); + constexpr auto key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(dm))); + b.append_raw(key); + b.append(':'); + atom(b, t.[:dm:]); + i++; + }; + b.append('}'); +} + +// Support for optional types (std::optional, etc.) +template <concepts::optional_type T> + requires(!require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &opt) { + if (opt) { + atom(b, opt.value()); + } else { + b.append_raw("null"); + } +} + +// Support for smart pointers (std::unique_ptr, std::shared_ptr, etc.) +template <concepts::smart_pointer T> + requires(!require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &ptr) { + if (ptr) { + atom(b, *ptr); + } else { + b.append_raw("null"); + } +} + +// Support for enums - serialize as string representation using expand approach from P2996R12 +template <typename T> + requires(std::is_enum_v<T> && !require_custom_serialization<T>) +void atom(string_builder &b, const T &e) { +#if SIMDJSON_STATIC_REFLECTION + constexpr auto enumerators = std::define_static_array(std::meta::enumerators_of(^^T)); + template for (constexpr auto enum_val : enumerators) { + constexpr auto enum_str = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(enum_val))); + if (e == [:enum_val:]) { + b.append_raw(enum_str); + return; + } + }; + // Fallback to integer if enum value not found + atom(b, static_cast<std::underlying_type_t<T>>(e)); +#else + // Fallback: serialize as integer if reflection not available + atom(b, static_cast<std::underlying_type_t<T>>(e)); +#endif +} + +// Support for appendable containers that don't have operator[] (sets, etc.) +template <concepts::appendable_containers T> + requires(!concepts::container_but_not_string<T> && !concepts::string_view_keyed_map<T> && + !concepts::optional_type<T> && !concepts::smart_pointer<T> && + !std::is_same_v<T, std::string> && + !std::is_same_v<T, std::string_view> && !std::is_same_v<T, const char*> && !require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &container) { + if (container.empty()) { + b.append_raw("[]"); + return; + } + b.append('['); + bool first = true; + for (const auto& item : container) { + if (!first) { + b.append(','); + } + first = false; + atom(b, item); + } + b.append(']'); +} + +// append functions that delegate to atom functions for primitive types +template <class T> + requires(std::is_arithmetic_v<T> && !std::is_same_v<T, char>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +template <class T> + requires(std::is_same_v<T, std::string> || + std::is_same_v<T, std::string_view> || + std::is_same_v<T, const char *> || + std::is_same_v<T, char>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +template <concepts::optional_type T> + requires(!require_custom_serialization<T>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +template <concepts::smart_pointer T> + requires(!require_custom_serialization<T>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +template <concepts::appendable_containers T> + requires(!concepts::container_but_not_string<T> && !concepts::string_view_keyed_map<T> && + !concepts::optional_type<T> && !concepts::smart_pointer<T> && + !std::is_same_v<T, std::string> && + !std::is_same_v<T, std::string_view> && !std::is_same_v<T, const char*> && !require_custom_serialization<T>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +template <concepts::string_view_keyed_map T> + requires(!require_custom_serialization<T>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +// works for struct +template <class Z> + requires(std::is_class_v<Z> && !concepts::container_but_not_string<Z> && + !concepts::string_view_keyed_map<Z> && + !concepts::optional_type<Z> && + !concepts::smart_pointer<Z> && + !concepts::appendable_containers<Z> && + !std::is_same_v<Z, std::string> && + !std::is_same_v<Z, std::string_view> && + !std::is_same_v<Z, const char*> && + !std::is_same_v<Z, char> && !require_custom_serialization<Z>) +void append(string_builder &b, const Z &z) { + int i = 0; + b.append('{'); + template for (constexpr auto dm : std::define_static_array(std::meta::nonstatic_data_members_of(^^Z, std::meta::access_context::unchecked()))) { + if (i != 0) + b.append(','); + constexpr auto key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(dm))); + b.append_raw(key); + b.append(':'); + atom(b, z.[:dm:]); + i++; + }; + b.append('}'); +} + +// works for container that have begin() and end() iterators +template <class Z> + requires(concepts::container_but_not_string<Z> && !require_custom_serialization<Z>) +void append(string_builder &b, const Z &z) { + auto it = z.begin(); + auto end = z.end(); + if (it == end) { + b.append_raw("[]"); + return; + } + b.append('['); + atom(b, *it); + ++it; + for (; it != end; ++it) { + b.append(','); + atom(b, *it); + } + b.append(']'); +} + +template <class Z> + requires (require_custom_serialization<Z>) +void append(string_builder &b, const Z &z) { + b.append(z); +} + + +template <class Z> +simdjson_warn_unused simdjson_result<std::string> to_json_string(const Z &z, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + string_builder b(initial_capacity); + append(b, z); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); +} + +template <class Z> +simdjson_warn_unused error_code to_json(const Z &z, std::string &s, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + string_builder b(initial_capacity); + append(b, z); + std::string_view view; + if(auto e = b.view().get(view); e) { return e; } + s.assign(view); + return SUCCESS; +} + +template <class Z> +string_builder& operator<<(string_builder& b, const Z& z) { + append(b, z); + return b; +} + +// extract_from: Serialize only specific fields from a struct to JSON +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +void extract_from(string_builder &b, const T &obj) { + // Helper to check if a field name matches any of the requested fields + auto should_extract = [](std::string_view field_name) constexpr -> bool { + return ((FieldNames.view() == field_name) || ...); + }; + + b.append('{'); + bool first = true; + + // Iterate through all members of T using reflection + template for (constexpr auto mem : std::define_static_array( + std::meta::nonstatic_data_members_of(^^T, std::meta::access_context::unchecked()))) { + + if constexpr (std::meta::is_public(mem)) { + constexpr std::string_view key = std::define_static_string(std::meta::identifier_of(mem)); + + // Only serialize this field if it's in our list of requested fields + if constexpr (should_extract(key)) { + if (!first) { + b.append(','); + } + first = false; + + // Serialize the key + constexpr auto quoted_key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(mem))); + b.append_raw(quoted_key); + b.append(':'); + + // Serialize the value + atom(b, obj.[:mem:]); + } + } + }; + + b.append('}'); +} + +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result<std::string> extract_from(const T &obj, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + string_builder b(initial_capacity); + extract_from<FieldNames...>(b, obj); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); +} + +} // namespace builder +} // namespace fallback +// Alias the function template to 'to' in the global namespace +template <class Z> +simdjson_warn_unused simdjson_result<std::string> to_json(const Z &z, size_t initial_capacity = fallback::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + fallback::builder::string_builder b(initial_capacity); + fallback::builder::append(b, z); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); +} +template <class Z> +simdjson_warn_unused error_code to_json(const Z &z, std::string &s, size_t initial_capacity = fallback::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + fallback::builder::string_builder b(initial_capacity); + fallback::builder::append(b, z); + std::string_view view; + if(auto e = b.view().get(view); e) { return e; } + s.assign(view); + return SUCCESS; +} +// Global namespace function for extract_from +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result<std::string> extract_from(const T &obj, size_t initial_capacity = fallback::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + fallback::builder::string_builder b(initial_capacity); + fallback::builder::extract_from<FieldNames...>(b, obj); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); +} + +} // namespace simdjson + +#endif // SIMDJSON_STATIC_REFLECTION + +#endif +/* end file simdjson/generic/builder/json_builder.h for fallback */ +/* including simdjson/generic/builder/fractured_json_builder.h for fallback: #include "simdjson/generic/builder/fractured_json_builder.h" */ +/* begin file simdjson/generic/builder/fractured_json_builder.h for fallback */ +#ifndef SIMDJSON_GENERIC_FRACTURED_JSON_BUILDER_H +#define SIMDJSON_GENERIC_FRACTURED_JSON_BUILDER_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_builder.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/dom/fractured_json.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#if SIMDJSON_STATIC_REFLECTION + +namespace simdjson { +namespace fallback { +namespace builder { + +/** + * Serialize an object to a FracturedJson-formatted string. + * + * FracturedJson produces human-readable yet compact JSON output by intelligently + * choosing between different layout strategies (inline, compact multiline, table, + * expanded) based on content complexity, length, and structure similarity. + * + * This function combines the builder's serialization with FracturedJson formatting: + * 1. Serializes the object to minified JSON using reflection + * 2. Parses and reformats using FracturedJson + * + * Example: + * struct User { int id; std::string name; bool active; }; + * User user{1, "Alice", true}; + * auto result = to_fractured_json_string(user); + * // result.value() == "{ \"id\": 1, \"name\": \"Alice\", \"active\": true }" + * + * @param obj The object to serialize (must be a reflectable type) + * @param opts FracturedJson formatting options + * @param initial_capacity Initial buffer capacity for serialization + * @return The formatted JSON string, or an error + */ +template <class T> +simdjson_warn_unused simdjson_result<std::string> to_fractured_json_string( + const T& obj, + const fractured_json_options& opts = {}, + size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + // Step 1: Serialize to minified JSON + std::string formatted; + auto error = to_json_string(obj, initial_capacity).get(formatted); + if (error) { + return error; + } + + // Step 2: Reformat with FracturedJson + return fractured_json_string(formatted, opts); +} + +/** + * Extract specific fields from an object and format with FracturedJson. + * + * Example: + * struct User { int id; std::string name; std::string email; bool active; }; + * User user{1, "Alice", "alice@example.com", true}; + * auto result = extract_fractured_json<"id", "name">(user); + * // result.value() == "{ \"id\": 1, \"name\": \"Alice\" }" + * + * @param obj The object to serialize + * @param opts FracturedJson formatting options + * @param initial_capacity Initial buffer capacity for serialization + * @return The formatted JSON string containing only the specified fields + */ +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result<std::string> extract_fractured_json( + const T& obj, + const fractured_json_options& opts = {}, + size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + // Step 1: Extract fields to minified JSON + std::string formatted; + auto error = extract_from<FieldNames...>(obj, initial_capacity).get(formatted); + if (error) { + return error; + } + + // Step 2: Reformat with FracturedJson + return fractured_json_string(formatted, opts); +} + +} // namespace builder +} // namespace fallback + +// Global namespace convenience functions + +/** + * Serialize an object to a FracturedJson-formatted string. + * Global namespace version for convenience. + */ +template <class T> +simdjson_warn_unused simdjson_result<std::string> to_fractured_json_string( + const T& obj, + const fractured_json_options& opts = {}, + size_t initial_capacity = fallback::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + return fallback::builder::to_fractured_json_string(obj, opts, initial_capacity); +} +/** + * Extract specific fields from an object and format with FracturedJson. + * Global namespace version for convenience. + */ +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result<std::string> extract_fractured_json( + const T& obj, + const fractured_json_options& opts = {}, + size_t initial_capacity = fallback::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + return fallback::builder::extract_fractured_json<FieldNames...>(obj, opts, initial_capacity); +} + +} // namespace simdjson + +#endif // SIMDJSON_STATIC_REFLECTION + +#endif // SIMDJSON_GENERIC_FRACTURED_JSON_BUILDER_H +/* end file simdjson/generic/builder/fractured_json_builder.h for fallback */ + + + +// JSON builder inline definitions +/* including simdjson/generic/builder/json_string_builder-inl.h for fallback: #include "simdjson/generic/builder/json_string_builder-inl.h" */ +/* begin file simdjson/generic/builder/json_string_builder-inl.h for fallback */ +#include <array> +#include <cstring> +#include <type_traits> +#ifndef SIMDJSON_GENERIC_STRING_BUILDER_INL_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_INL_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_string_builder.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +/* + * Empirically, we have found that an inlined optimization is important for + * performance. The following macros are not ideal. We should find a better + * way to inline the code. + */ + +#if defined(__SSE2__) || defined(__x86_64__) || defined(__x86_64) || \ + (defined(_M_AMD64) || defined(_M_X64) || \ + (defined(_M_IX86_FP) && _M_IX86_FP == 2)) +#ifndef SIMDJSON_EXPERIMENTAL_HAS_SSE2 +#define SIMDJSON_EXPERIMENTAL_HAS_SSE2 1 +#endif +#endif + +#if defined(__aarch64__) || defined(_M_ARM64) +#ifndef SIMDJSON_EXPERIMENTAL_HAS_NEON +#define SIMDJSON_EXPERIMENTAL_HAS_NEON 1 +#endif +#endif +#if defined(__loongarch_sx) +#ifndef SIMDJSON_EXPERIMENTAL_HAS_LSX +#define SIMDJSON_EXPERIMENTAL_HAS_LSX 1 +#endif +#endif +#if defined(__riscv_v_intrinsic) && __riscv_v_intrinsic >= 11000 && \ + defined(__riscv_vector) +#ifndef SIMDJSON_EXPERIMENTAL_HAS_RVV +#define SIMDJSON_EXPERIMENTAL_HAS_RVV 1 +#endif +#endif +#if (defined(__PPC64__) || defined(_M_PPC64)) && defined(__ALTIVEC__) +#ifndef SIMDJSON_EXPERIMENTAL_HAS_PPC64 +#define SIMDJSON_EXPERIMENTAL_HAS_PPC64 1 +#endif +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_NEON +#include <arm_neon.h> +#ifdef _MSC_VER +#include <intrin.h> +#endif +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_SSE2 +#include <emmintrin.h> +#ifdef _MSC_VER +#include <intrin.h> +#endif +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_LSX +#include <lsxintrin.h> +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_RVV +#include <riscv_vector.h> +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_PPC64 +#include <altivec.h> +#ifdef bool +#undef bool +#endif +#ifdef vector +#undef vector +#endif +#endif + + +namespace simdjson { +namespace fallback { +namespace builder { + +static SIMDJSON_CONSTEXPR_LAMBDA std::array<uint8_t, 256> + json_quotable_character = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + +/** + +A possible SWAR implementation of has_json_escapable_byte. It is not used +because it is slower than the current implementation. It is kept here for +reference (to show that we tried it). + +inline bool has_json_escapable_byte(uint64_t x) { + uint64_t is_ascii = 0x8080808080808080ULL & ~x; + uint64_t xor2 = x ^ 0x0202020202020202ULL; + uint64_t lt32_or_eq34 = xor2 - 0x2121212121212121ULL; + uint64_t sub92 = x ^ 0x5C5C5C5C5C5C5C5CULL; + uint64_t eq92 = (sub92 - 0x0101010101010101ULL); + return ((lt32_or_eq34 | eq92) & is_ascii) != 0; +} + +**/ + +SIMDJSON_CONSTEXPR_LAMBDA simdjson_inline bool +simple_needs_escaping(std::string_view v) { + for (char c : v) { + // a table lookup is faster than a series of comparisons + if (json_quotable_character[static_cast<uint8_t>(c)]) { + return true; + } + } + return false; +} + +#if SIMDJSON_EXPERIMENTAL_HAS_NEON +simdjson_inline bool fast_needs_escaping(std::string_view view) { + if (view.size() < 16) { + return simple_needs_escaping(view); + } + size_t i = 0; + uint8x16_t running = vdupq_n_u8(0); + uint8x16_t v34 = vdupq_n_u8(34); + uint8x16_t v92 = vdupq_n_u8(92); + + for (; i + 15 < view.size(); i += 16) { + uint8x16_t word = vld1q_u8((const uint8_t *)view.data() + i); + running = vorrq_u8(running, vceqq_u8(word, v34)); + running = vorrq_u8(running, vceqq_u8(word, v92)); + running = vorrq_u8(running, vcltq_u8(word, vdupq_n_u8(32))); + } + if (i < view.size()) { + uint8x16_t word = + vld1q_u8((const uint8_t *)view.data() + view.length() - 16); + running = vorrq_u8(running, vceqq_u8(word, v34)); + running = vorrq_u8(running, vceqq_u8(word, v92)); + running = vorrq_u8(running, vcltq_u8(word, vdupq_n_u8(32))); + } + return vmaxvq_u32(vreinterpretq_u32_u8(running)) != 0; +} +#elif SIMDJSON_EXPERIMENTAL_HAS_SSE2 +simdjson_inline bool fast_needs_escaping(std::string_view view) { + if (view.size() < 16) { + return simple_needs_escaping(view); + } + size_t i = 0; + __m128i running = _mm_setzero_si128(); + for (; i + 15 < view.size(); i += 16) { + + __m128i word = + _mm_loadu_si128(reinterpret_cast<const __m128i *>(view.data() + i)); + running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(34))); + running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(92))); + running = _mm_or_si128( + running, _mm_cmpeq_epi8(_mm_subs_epu8(word, _mm_set1_epi8(31)), + _mm_setzero_si128())); + } + if (i < view.size()) { + __m128i word = _mm_loadu_si128( + reinterpret_cast<const __m128i *>(view.data() + view.length() - 16)); + running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(34))); + running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(92))); + running = _mm_or_si128( + running, _mm_cmpeq_epi8(_mm_subs_epu8(word, _mm_set1_epi8(31)), + _mm_setzero_si128())); + } + return _mm_movemask_epi8(running) != 0; +} +#elif SIMDJSON_EXPERIMENTAL_HAS_PPC64 +simdjson_inline bool fast_needs_escaping(std::string_view view) { + if (view.size() < 16) { + return simple_needs_escaping(view); + } + size_t i = 0; + __vector unsigned char running = vec_splats((unsigned char)0); + __vector unsigned char v34 = vec_splats((unsigned char)34); + __vector unsigned char v92 = vec_splats((unsigned char)92); + __vector unsigned char v32 = vec_splats((unsigned char)32); + + for (; i + 15 < view.size(); i += 16) { + __vector unsigned char word = + vec_vsx_ld(0, reinterpret_cast<const unsigned char *>(view.data() + i)); + running = vec_or(running, (__vector unsigned char)vec_cmpeq(word, v34)); + running = vec_or(running, (__vector unsigned char)vec_cmpeq(word, v92)); + running = vec_or(running, + (__vector unsigned char)vec_cmplt(word, v32)); + } + if (i < view.size()) { + __vector unsigned char word = vec_vsx_ld( + 0, reinterpret_cast<const unsigned char *>(view.data() + view.length() - 16)); + running = vec_or(running, (__vector unsigned char)vec_cmpeq(word, v34)); + running = vec_or(running, (__vector unsigned char)vec_cmpeq(word, v92)); + running = vec_or(running, + (__vector unsigned char)vec_cmplt(word, v32)); + } + return !vec_all_eq(running, vec_splats((unsigned char)0)); +} +#else +simdjson_inline bool fast_needs_escaping(std::string_view view) { + return simple_needs_escaping(view); +} +#endif + +// Scalar fallback for finding next quotable character +SIMDJSON_CONSTEXPR_LAMBDA simdjson_inline size_t +find_next_json_quotable_character_scalar(const std::string_view view, + size_t location) noexcept { + for (auto pos = view.begin() + location; pos != view.end(); ++pos) { + if (json_quotable_character[static_cast<uint8_t>(*pos)]) { + return pos - view.begin(); + } + } + return size_t(view.size()); +} + +// SIMD-accelerated position finding that directly locates the first quotable +// character, combining detection and position extraction in a single pass to +// minimize redundant work. +#if SIMDJSON_EXPERIMENTAL_HAS_NEON +simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + const size_t len = view.size(); + const uint8_t *ptr = + reinterpret_cast<const uint8_t *>(view.data()) + location; + size_t remaining = len - location; + + // SIMD constants for characters requiring escape + uint8x16_t v34 = vdupq_n_u8(34); // '"' + uint8x16_t v92 = vdupq_n_u8(92); // '\\' + uint8x16_t v32 = vdupq_n_u8(32); // control char threshold + + while (remaining >= 16) { + uint8x16_t word = vld1q_u8(ptr); + + // Check for quotable characters: '"', '\\', or control chars (< 32) + uint8x16_t needs_escape = vceqq_u8(word, v34); + needs_escape = vorrq_u8(needs_escape, vceqq_u8(word, v92)); + needs_escape = vorrq_u8(needs_escape, vcltq_u8(word, v32)); + + const uint8x8_t res = vshrn_n_u16(vreinterpretq_u16_u8(needs_escape), 4); + const uint64_t mask = vget_lane_u64(vreinterpret_u64_u8(res), 0); + if(mask != 0) { + size_t offset = ptr - reinterpret_cast<const uint8_t *>(view.data()); + auto trailing_zero = trailing_zeroes(mask); + return offset + (trailing_zero >> 2); + } + ptr += 16; + remaining -= 16; + } + + // Scalar fallback for remaining bytes + size_t current = len - remaining; + return find_next_json_quotable_character_scalar(view, current); +} +#elif SIMDJSON_EXPERIMENTAL_HAS_SSE2 +simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + const size_t len = view.size(); + const uint8_t *ptr = + reinterpret_cast<const uint8_t *>(view.data()) + location; + size_t remaining = len - location; + + // SIMD constants + __m128i v34 = _mm_set1_epi8(34); // '"' + __m128i v92 = _mm_set1_epi8(92); // '\\' + __m128i v31 = _mm_set1_epi8(31); // for control char detection + + while (remaining >= 16) { + __m128i word = _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr)); + + // Check for quotable characters + __m128i needs_escape = _mm_cmpeq_epi8(word, v34); + needs_escape = _mm_or_si128(needs_escape, _mm_cmpeq_epi8(word, v92)); + needs_escape = _mm_or_si128( + needs_escape, + _mm_cmpeq_epi8(_mm_subs_epu8(word, v31), _mm_setzero_si128())); + + int mask = _mm_movemask_epi8(needs_escape); + if (mask != 0) { + // Found quotable character - use trailing zero count to find position + size_t offset = ptr - reinterpret_cast<const uint8_t *>(view.data()); + return offset + trailing_zeroes(mask); + } + ptr += 16; + remaining -= 16; + } + + // Scalar fallback for remaining bytes + size_t current = len - remaining; + return find_next_json_quotable_character_scalar(view, current); +} +#elif SIMDJSON_EXPERIMENTAL_HAS_LSX +simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + const size_t len = view.size(); + const uint8_t *ptr = + reinterpret_cast<const uint8_t *>(view.data()) + location; + size_t remaining = len - location; + + //SIMD constants for characters requiring escape + __m128i v34 = __lsx_vreplgr2vr_b(34); // '"' + __m128i v92 = __lsx_vreplgr2vr_b(92); // '\\' + __m128i v32 = __lsx_vreplgr2vr_b(32); // control char threshold + + while (remaining >= 16){ + __m128i word = __lsx_vld(ptr, 0); + + //Check for the quotable characters: '"', '\\', or control char (<32) + __m128i needs_escape = __lsx_vseq_b(word, v34); + needs_escape = __lsx_vor_v(needs_escape, __lsx_vseq_b(word, v92)); + needs_escape = __lsx_vor_v(needs_escape, __lsx_vslt_bu(word, v32)); + + if (!__lsx_bz_v(needs_escape)){ + + //Found quotable character - extract exact byte position + uint64_t lo = __lsx_vpickve2gr_du(needs_escape,0); + uint64_t hi = __lsx_vpickve2gr_du(needs_escape,1); + size_t offset = ptr - reinterpret_cast<const uint8_t *>(view.data()); + if ( lo != 0) { + return offset + trailing_zeroes(lo) / 8; + } else { + return offset + 8 + trailing_zeroes(hi) / 8; + } + } + ptr += 16; + remaining -= 16; + } + size_t current = len - remaining; + return find_next_json_quotable_character_scalar(view, current); +} +#elif SIMDJSON_EXPERIMENTAL_HAS_RVV +simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + const size_t len = view.size(); + const uint8_t *ptr = + reinterpret_cast<const uint8_t *>(view.data()) + location; + size_t remaining = len - location; + + while (remaining > 0) { + size_t vl = __riscv_vsetvl_e8m1(remaining); + vuint8m1_t word = __riscv_vle8_v_u8m1(ptr, vl); + + // Check for quotable characters: '"', '\\', or control chars (< 32) + vbool8_t needs_escape = __riscv_vmseq(word, (uint8_t)34, vl); + needs_escape = __riscv_vmor(needs_escape, + __riscv_vmseq(word, (uint8_t)92, vl), vl); + needs_escape = __riscv_vmor(needs_escape, + __riscv_vmsltu(word, (uint8_t)32, vl), vl); + + long first = __riscv_vfirst(needs_escape, vl); + if (first >= 0) { + size_t offset = ptr - reinterpret_cast<const uint8_t *>(view.data()); + return offset + first; + } + ptr += vl; + remaining -= vl; + } + + return len; +} +#elif SIMDJSON_EXPERIMENTAL_HAS_PPC64 +simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + const size_t len = view.size(); + const uint8_t *ptr = + reinterpret_cast<const uint8_t *>(view.data()) + location; + size_t remaining = len - location; + + // SIMD constants for characters requiring escape + __vector unsigned char v34 = vec_splats((unsigned char)34); // '"' + __vector unsigned char v92 = vec_splats((unsigned char)92); // '\\' + __vector unsigned char v32 = vec_splats((unsigned char)32); // control char threshold + + // Bitmask for vec_vbpermq to extract one bit per byte + const __vector unsigned char perm_mask = {0x78, 0x70, 0x68, 0x60, 0x58, 0x50, + 0x48, 0x40, 0x38, 0x30, 0x28, 0x20, + 0x18, 0x10, 0x08, 0x00}; + + while (remaining >= 16) { + __vector unsigned char word = + vec_vsx_ld(0, reinterpret_cast<const unsigned char *>(ptr)); + + // Check for quotable characters: '"', '\\', or control chars (< 32) + __vector unsigned char needs_escape = + (__vector unsigned char)vec_cmpeq(word, v34); + needs_escape = vec_or(needs_escape, + (__vector unsigned char)vec_cmpeq(word, v92)); + needs_escape = vec_or(needs_escape, + (__vector unsigned char)vec_cmplt(word, v32)); + + __vector unsigned long long result = + (__vector unsigned long long)vec_vbpermq(needs_escape, perm_mask); +#ifdef __LITTLE_ENDIAN__ + unsigned int mask = static_cast<unsigned int>(result[1]); +#else + unsigned int mask = static_cast<unsigned int>(result[0]); +#endif + if (mask != 0) { + size_t offset = ptr - reinterpret_cast<const uint8_t *>(view.data()); + return offset + __builtin_ctz(mask); + } + ptr += 16; + remaining -= 16; + } + + // Scalar fallback for remaining bytes + size_t current = len - remaining; + return find_next_json_quotable_character_scalar(view, current); +} +#else +SIMDJSON_CONSTEXPR_LAMBDA simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + return find_next_json_quotable_character_scalar(view, location); +} +#endif + +SIMDJSON_CONSTEXPR_LAMBDA static std::string_view control_chars[] = { + "\\u0000", "\\u0001", "\\u0002", "\\u0003", "\\u0004", "\\u0005", "\\u0006", + "\\u0007", "\\b", "\\t", "\\n", "\\u000b", "\\f", "\\r", + "\\u000e", "\\u000f", "\\u0010", "\\u0011", "\\u0012", "\\u0013", "\\u0014", + "\\u0015", "\\u0016", "\\u0017", "\\u0018", "\\u0019", "\\u001a", "\\u001b", + "\\u001c", "\\u001d", "\\u001e", "\\u001f"}; + +// All Unicode characters may be placed within the quotation marks, except for +// the characters that MUST be escaped: quotation mark, reverse solidus, and the +// control characters (U+0000 through U+001F). There are two-character sequence +// escape representations of some popular characters: +// \", \\, \b, \f, \n, \r, \t. +SIMDJSON_CONSTEXPR_LAMBDA simdjson_inline void escape_json_char(char c, char *&out) { + if (c == '"') { + memcpy(out, "\\\"", 2); + out += 2; + } else if (c == '\\') { + memcpy(out, "\\\\", 2); + out += 2; + } else { + std::string_view v = control_chars[uint8_t(c)]; + memcpy(out, v.data(), v.size()); + out += v.size(); + } +} + +// Writes the escaped version of input to out, returning the number of bytes +// written. Uses SIMD position finding to locate quotable characters efficiently. +inline size_t write_string_escaped(const std::string_view input, char *out) { + size_t mysize = input.size(); + + // Use SIMD position finder directly - it returns mysize if no escape needed + size_t location = find_next_json_quotable_character(input, 0); + if (location == mysize) { + // Fast path: no escaping needed + memcpy(out, input.data(), input.size()); + return input.size(); + } + + const char *const initout = out; + memcpy(out, input.data(), location); + out += location; + escape_json_char(input[location], out); + location += 1; + while (location < mysize) { + size_t newlocation = find_next_json_quotable_character(input, location); + memcpy(out, input.data() + location, newlocation - location); + out += newlocation - location; + location = newlocation; + if (location == mysize) { + break; + } + escape_json_char(input[location], out); + location += 1; + } + return out - initout; +} + +simdjson_inline string_builder::string_builder(size_t initial_capacity) + : buffer(new(std::nothrow) char[initial_capacity]), position(0), + capacity(buffer.get() != nullptr ? initial_capacity : 0), + is_valid(buffer.get() != nullptr) {} + +simdjson_inline bool string_builder::capacity_check(size_t upcoming_bytes) { + // We use the convention that when is_valid is false, then the capacity and + // the position are 0. + // Most of the time, this function will return true. + if (simdjson_likely(upcoming_bytes <= capacity - position)) { + return true; + } + // check for overflow, most of the time there is no overflow + if (simdjson_unlikely(position + upcoming_bytes < position)) { + return false; + } + // We will rarely get here. + grow_buffer((std::max)(capacity * 2, position + upcoming_bytes)); + // If the buffer allocation failed, we set is_valid to false. + return is_valid; +} + +simdjson_inline void string_builder::grow_buffer(size_t desired_capacity) { + if (!is_valid) { + return; + } + std::unique_ptr<char[]> new_buffer(new (std::nothrow) char[desired_capacity]); + if (new_buffer.get() == nullptr) { + set_valid(false); + return; + } + std::memcpy(new_buffer.get(), buffer.get(), position); + buffer.swap(new_buffer); + capacity = desired_capacity; +} + +simdjson_inline void string_builder::set_valid(bool valid) noexcept { + if (!valid) { + is_valid = false; + capacity = 0; + position = 0; + buffer.reset(); + } else { + is_valid = true; + } +} + +simdjson_inline size_t string_builder::size() const noexcept { + return position; +} + +simdjson_inline void string_builder::append(char c) noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = c; + } +} + +simdjson_inline void string_builder::append_null() noexcept { + constexpr char null_literal[] = "null"; + constexpr size_t null_len = sizeof(null_literal) - 1; + if (capacity_check(null_len)) { + std::memcpy(buffer.get() + position, null_literal, null_len); + position += null_len; + } +} + +simdjson_inline void string_builder::clear() noexcept { + position = 0; + // if it was invalid, we should try to repair it + if (!is_valid) { + capacity = 0; + buffer.reset(); + is_valid = true; + } +} + +namespace internal { + +template <typename number_type, typename = typename std::enable_if< + std::is_unsigned<number_type>::value>::type> +simdjson_really_inline int int_log2(number_type x) { + return 63 - leading_zeroes(uint64_t(x) | 1); +} + +simdjson_really_inline int fast_digit_count_32(uint32_t x) { + static uint64_t table[] = { + 4294967296, 8589934582, 8589934582, 8589934582, 12884901788, + 12884901788, 12884901788, 17179868184, 17179868184, 17179868184, + 21474826480, 21474826480, 21474826480, 21474826480, 25769703776, + 25769703776, 25769703776, 30063771072, 30063771072, 30063771072, + 34349738368, 34349738368, 34349738368, 34349738368, 38554705664, + 38554705664, 38554705664, 41949672960, 41949672960, 41949672960, + 42949672960, 42949672960}; + return uint32_t((x + table[int_log2(x)]) >> 32); +} + +simdjson_really_inline int fast_digit_count_64(uint64_t x) { + static uint64_t table[] = {9, + 99, + 999, + 9999, + 99999, + 999999, + 9999999, + 99999999, + 999999999, + 9999999999, + 99999999999, + 999999999999, + 9999999999999, + 99999999999999, + 999999999999999ULL, + 9999999999999999ULL, + 99999999999999999ULL, + 999999999999999999ULL, + 9999999999999999999ULL}; + int y = (19 * int_log2(x) >> 6); + y += x > table[y]; + return y + 1; +} + +template <typename number_type, typename = typename std::enable_if< + std::is_unsigned<number_type>::value>::type> +simdjson_really_inline size_t digit_count(number_type v) noexcept { + static_assert(sizeof(number_type) == 8 || sizeof(number_type) == 4 || + sizeof(number_type) == 2 || sizeof(number_type) == 1, + "We only support 8-bit, 16-bit, 32-bit and 64-bit numbers"); + SIMDJSON_IF_CONSTEXPR(sizeof(number_type) <= 4) { + return fast_digit_count_32(static_cast<uint32_t>(v)); + } + else { + return fast_digit_count_64(static_cast<uint64_t>(v)); + } +} +static const char decimal_table[200] = { + 0x30, 0x30, 0x30, 0x31, 0x30, 0x32, 0x30, 0x33, 0x30, 0x34, 0x30, 0x35, + 0x30, 0x36, 0x30, 0x37, 0x30, 0x38, 0x30, 0x39, 0x31, 0x30, 0x31, 0x31, + 0x31, 0x32, 0x31, 0x33, 0x31, 0x34, 0x31, 0x35, 0x31, 0x36, 0x31, 0x37, + 0x31, 0x38, 0x31, 0x39, 0x32, 0x30, 0x32, 0x31, 0x32, 0x32, 0x32, 0x33, + 0x32, 0x34, 0x32, 0x35, 0x32, 0x36, 0x32, 0x37, 0x32, 0x38, 0x32, 0x39, + 0x33, 0x30, 0x33, 0x31, 0x33, 0x32, 0x33, 0x33, 0x33, 0x34, 0x33, 0x35, + 0x33, 0x36, 0x33, 0x37, 0x33, 0x38, 0x33, 0x39, 0x34, 0x30, 0x34, 0x31, + 0x34, 0x32, 0x34, 0x33, 0x34, 0x34, 0x34, 0x35, 0x34, 0x36, 0x34, 0x37, + 0x34, 0x38, 0x34, 0x39, 0x35, 0x30, 0x35, 0x31, 0x35, 0x32, 0x35, 0x33, + 0x35, 0x34, 0x35, 0x35, 0x35, 0x36, 0x35, 0x37, 0x35, 0x38, 0x35, 0x39, + 0x36, 0x30, 0x36, 0x31, 0x36, 0x32, 0x36, 0x33, 0x36, 0x34, 0x36, 0x35, + 0x36, 0x36, 0x36, 0x37, 0x36, 0x38, 0x36, 0x39, 0x37, 0x30, 0x37, 0x31, + 0x37, 0x32, 0x37, 0x33, 0x37, 0x34, 0x37, 0x35, 0x37, 0x36, 0x37, 0x37, + 0x37, 0x38, 0x37, 0x39, 0x38, 0x30, 0x38, 0x31, 0x38, 0x32, 0x38, 0x33, + 0x38, 0x34, 0x38, 0x35, 0x38, 0x36, 0x38, 0x37, 0x38, 0x38, 0x38, 0x39, + 0x39, 0x30, 0x39, 0x31, 0x39, 0x32, 0x39, 0x33, 0x39, 0x34, 0x39, 0x35, + 0x39, 0x36, 0x39, 0x37, 0x39, 0x38, 0x39, 0x39, +}; +} // namespace internal + +template <typename number_type, typename> +simdjson_inline void string_builder::append(number_type v) noexcept { + static_assert(std::is_same<number_type, bool>::value || + std::is_integral<number_type>::value || + std::is_floating_point<number_type>::value, + "Unsupported number type"); + // If C++17 is available, we can 'if constexpr' here. + SIMDJSON_IF_CONSTEXPR(std::is_same<number_type, bool>::value) { + if (v) { + constexpr char true_literal[] = "true"; + constexpr size_t true_len = sizeof(true_literal) - 1; + if (capacity_check(true_len)) { + std::memcpy(buffer.get() + position, true_literal, true_len); + position += true_len; + } + } else { + constexpr char false_literal[] = "false"; + constexpr size_t false_len = sizeof(false_literal) - 1; + if (capacity_check(false_len)) { + std::memcpy(buffer.get() + position, false_literal, false_len); + position += false_len; + } + } + } + else SIMDJSON_IF_CONSTEXPR(std::is_unsigned<number_type>::value) { + // Process 4 digits at a time instead of 2, reducing store operations + // and divisions by approximately half for large numbers. + constexpr size_t max_number_size = 20; + if (capacity_check(max_number_size)) { + using unsigned_type = typename std::make_unsigned<number_type>::type; + unsigned_type pv = static_cast<unsigned_type>(v); + size_t dc = internal::digit_count(pv); + char *write_pointer = buffer.get() + position + dc - 1; + + // Process 4 digits per iteration for large numbers + while (pv >= 10000) { + unsigned_type q = pv / 10000; + unsigned_type r = pv % 10000; + unsigned_type r_hi = r / 100; // High 2 digits of remainder + unsigned_type r_lo = r % 100; // Low 2 digits of remainder + // Write low 2 digits first (rightmost), then high 2 digits + memcpy(write_pointer - 1, &internal::decimal_table[r_lo * 2], 2); + memcpy(write_pointer - 3, &internal::decimal_table[r_hi * 2], 2); + write_pointer -= 4; + pv = q; + } + + // Handle remaining 1-4 digits with original 2-digit loop + while (pv >= 100) { + memcpy(write_pointer - 1, &internal::decimal_table[(pv % 100) * 2], 2); + write_pointer -= 2; + pv /= 100; + } + if (pv >= 10) { + *write_pointer-- = char('0' + (pv % 10)); + pv /= 10; + } + *write_pointer = char('0' + pv); + position += dc; + } + } + else SIMDJSON_IF_CONSTEXPR(std::is_integral<number_type>::value) { + // Same 4-digit batching as unsigned path for signed integers + constexpr size_t max_number_size = 20; + if (capacity_check(max_number_size)) { + using unsigned_type = typename std::make_unsigned<number_type>::type; + bool negative = v < 0; + unsigned_type pv = static_cast<unsigned_type>(v); + if (negative) { + pv = 0 - pv; // the 0 is for Microsoft + } + size_t dc = internal::digit_count(pv); + // by always writing the minus sign, we avoid the branch. + buffer.get()[position] = '-'; + position += negative ? 1 : 0; + char *write_pointer = buffer.get() + position + dc - 1; + + // Process 4 digits per iteration for large numbers + while (pv >= 10000) { + unsigned_type q = pv / 10000; + unsigned_type r = pv % 10000; + unsigned_type r_hi = r / 100; + unsigned_type r_lo = r % 100; + memcpy(write_pointer - 1, &internal::decimal_table[r_lo * 2], 2); + memcpy(write_pointer - 3, &internal::decimal_table[r_hi * 2], 2); + write_pointer -= 4; + pv = q; + } + + // Handle remaining 1-4 digits + while (pv >= 100) { + memcpy(write_pointer - 1, &internal::decimal_table[(pv % 100) * 2], 2); + write_pointer -= 2; + pv /= 100; + } + if (pv >= 10) { + *write_pointer-- = char('0' + (pv % 10)); + pv /= 10; + } + *write_pointer = char('0' + pv); + position += dc; + } + } + else SIMDJSON_IF_CONSTEXPR(std::is_floating_point<number_type>::value) { + constexpr size_t max_number_size = 24; + if (capacity_check(max_number_size)) { + // We could specialize for float. + char *end = simdjson::internal::to_chars(buffer.get() + position, nullptr, + double(v)); + position = end - buffer.get(); + } + } +} + +simdjson_inline void +string_builder::escape_and_append(std::string_view input) noexcept { + // escaping might turn a control character into \x00xx so 6 characters. + if (capacity_check(6 * input.size())) { + position += write_string_escaped(input, buffer.get() + position); + } +} + +simdjson_inline void +string_builder::escape_and_append_with_quotes(std::string_view input) noexcept { + // escaping might turn a control character into \x00xx so 6 characters. + if (capacity_check(2 + 6 * input.size())) { + buffer.get()[position++] = '"'; + position += write_string_escaped(input, buffer.get() + position); + buffer.get()[position++] = '"'; + } +} + +simdjson_inline void +string_builder::escape_and_append_with_quotes(char input) noexcept { + // escaping might turn a control character into \x00xx so 6 characters. + if (capacity_check(2 + 6 * 1)) { + buffer.get()[position++] = '"'; + std::string_view cinput(&input, 1); + position += write_string_escaped(cinput, buffer.get() + position); + buffer.get()[position++] = '"'; + } +} + +simdjson_inline void +string_builder::escape_and_append_with_quotes(const char *input) noexcept { + std::string_view cinput(input); + escape_and_append_with_quotes(cinput); +} +#if SIMDJSON_SUPPORTS_CONCEPTS +template <constevalutil::fixed_string key> +simdjson_inline void string_builder::escape_and_append_with_quotes() noexcept { + escape_and_append_with_quotes(constevalutil::string_constant<key>::value); +} +#endif + +simdjson_inline void string_builder::append_raw(const char *c) noexcept { + size_t len = std::strlen(c); + append_raw(c, len); +} + +simdjson_inline void +string_builder::append_raw(std::string_view input) noexcept { + if (capacity_check(input.size())) { + std::memcpy(buffer.get() + position, input.data(), input.size()); + position += input.size(); + } +} + +simdjson_inline void string_builder::append_raw(const char *str, + size_t len) noexcept { + if (capacity_check(len)) { + std::memcpy(buffer.get() + position, str, len); + position += len; + } +} +#if SIMDJSON_SUPPORTS_CONCEPTS +// Support for optional types (std::optional, etc.) +template <concepts::optional_type T> + requires(!require_custom_serialization<T>) +simdjson_inline void string_builder::append(const T &opt) { + if (opt) { + append(*opt); + } else { + append_null(); + } +} + +template <typename T> + requires(require_custom_serialization<T>) +simdjson_inline void string_builder::append(T &&val) { + serialize(*this, std::forward<T>(val)); +} + +template <typename T> + requires(std::is_convertible<T, std::string_view>::value || + std::is_same<T, const char *>::value) +simdjson_inline void string_builder::append(const T &value) { + escape_and_append_with_quotes(value); +} +#endif + +#if SIMDJSON_SUPPORTS_RANGES && SIMDJSON_SUPPORTS_CONCEPTS +// Support for range-based appending (std::ranges::view, etc.) +template <std::ranges::range R> + requires(!std::is_convertible<R, std::string_view>::value && !require_custom_serialization<R>) +simdjson_inline void string_builder::append(const R &range) noexcept { + auto it = std::ranges::begin(range); + auto end = std::ranges::end(range); + if constexpr (concepts::is_pair<std::ranges::range_value_t<R>>) { + start_object(); + + if (it == end) { + end_object(); + return; // Handle empty range + } + // Append first item without leading comma + append_key_value(it->first, it->second); + ++it; + + // Append remaining items with preceding commas + for (; it != end; ++it) { + append_comma(); + append_key_value(it->first, it->second); + } + end_object(); + } else { + start_array(); + if (it == end) { + end_array(); + return; // Handle empty range + } + + // Append first item without leading comma + append(*it); + ++it; + + // Append remaining items with preceding commas + for (; it != end; ++it) { + append_comma(); + append(*it); + } + end_array(); + } +} + +#endif + +#if SIMDJSON_EXCEPTIONS +simdjson_inline string_builder::operator std::string() const noexcept(false) { + return std::string(operator std::string_view()); +} + +simdjson_inline string_builder::operator std::string_view() const + noexcept(false) simdjson_lifetime_bound { + return view(); +} +#endif + +simdjson_inline simdjson_result<std::string_view> +string_builder::view() const noexcept { + if (!is_valid) { + return simdjson::OUT_OF_CAPACITY; + } + return std::string_view(buffer.get(), position); +} + +simdjson_inline simdjson_result<const char *> string_builder::c_str() noexcept { + if (capacity_check(1)) { + buffer.get()[position] = '\0'; + return buffer.get(); + } + return simdjson::OUT_OF_CAPACITY; +} + +simdjson_inline bool string_builder::validate_unicode() const noexcept { + return simdjson::validate_utf8(buffer.get(), position); +} + +simdjson_inline void string_builder::start_object() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '{'; + } +} + +simdjson_inline void string_builder::end_object() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '}'; + } +} + +simdjson_inline void string_builder::start_array() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '['; + } +} + +simdjson_inline void string_builder::end_array() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ']'; + } +} + +simdjson_inline void string_builder::append_comma() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ','; + } +} + +simdjson_inline void string_builder::append_colon() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ':'; + } +} + +template <typename key_type, typename value_type> +simdjson_inline void +string_builder::append_key_value(key_type key, value_type value) noexcept { + static_assert(std::is_same<key_type, const char *>::value || + std::is_convertible<key_type, std::string_view>::value, + "Unsupported key type"); + escape_and_append_with_quotes(key); + append_colon(); + SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, std::nullptr_t>::value) { + append_null(); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, char>::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR( + std::is_convertible<value_type, std::string_view>::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, const char *>::value) { + escape_and_append_with_quotes(value); + } + else { + append(value); + } +} + +#if SIMDJSON_SUPPORTS_CONCEPTS +template <constevalutil::fixed_string key, typename value_type> +simdjson_inline void +string_builder::append_key_value(value_type value) noexcept { + escape_and_append_with_quotes<key>(); + append_colon(); + SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, std::nullptr_t>::value) { + append_null(); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, char>::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR( + std::is_convertible<value_type, std::string_view>::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, const char *>::value) { + escape_and_append_with_quotes(value); + } + else { + append(value); + } +} +#endif + +} // namespace builder +} // namespace fallback +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_STRING_BUILDER_INL_H +/* end file simdjson/generic/builder/json_string_builder-inl.h for fallback */ + +/* end file simdjson/generic/builder/amalgamated.h for fallback */ +/* including simdjson/fallback/end.h: #include "simdjson/fallback/end.h" */ +/* begin file simdjson/fallback/end.h */ +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/fallback/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +/* undefining SIMDJSON_IMPLEMENTATION from "fallback" */ +#undef SIMDJSON_IMPLEMENTATION +/* end file simdjson/fallback/end.h */ + +#endif // SIMDJSON_FALLBACK_BUILDER_H +/* end file simdjson/fallback/builder.h */ +#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(haswell) +/* including simdjson/haswell/builder.h: #include "simdjson/haswell/builder.h" */ +/* begin file simdjson/haswell/builder.h */ +#ifndef SIMDJSON_HASWELL_BUILDER_H +#define SIMDJSON_HASWELL_BUILDER_H + +/* including simdjson/haswell/begin.h: #include "simdjson/haswell/begin.h" */ +/* begin file simdjson/haswell/begin.h */ +/* defining SIMDJSON_IMPLEMENTATION to "haswell" */ +#define SIMDJSON_IMPLEMENTATION haswell + +/* including simdjson/haswell/base.h: #include "simdjson/haswell/base.h" */ +/* begin file simdjson/haswell/base.h */ +#ifndef SIMDJSON_HASWELL_BASE_H +#define SIMDJSON_HASWELL_BASE_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +// The constructor may be executed on any host, so we take care not to use SIMDJSON_TARGET_HASWELL +namespace simdjson { +/** + * Implementation for Haswell (Intel AVX2). + */ +namespace haswell { + +class implementation; + +namespace { +namespace simd { +template <typename T> struct simd8; +template <typename T> struct simd8x64; +} // namespace simd +} // unnamed namespace + +} // namespace haswell +} // namespace simdjson + +#endif // SIMDJSON_HASWELL_BASE_H +/* end file simdjson/haswell/base.h */ +/* including simdjson/haswell/intrinsics.h: #include "simdjson/haswell/intrinsics.h" */ +/* begin file simdjson/haswell/intrinsics.h */ +#ifndef SIMDJSON_HASWELL_INTRINSICS_H +#define SIMDJSON_HASWELL_INTRINSICS_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#if SIMDJSON_VISUAL_STUDIO +// under clang within visual studio, this will include <x86intrin.h> +#include <intrin.h> // visual studio or clang +#else +#include <x86intrin.h> // elsewhere +#endif // SIMDJSON_VISUAL_STUDIO + +#if SIMDJSON_CLANG_VISUAL_STUDIO +/** + * You are not supposed, normally, to include these + * headers directly. Instead you should either include intrin.h + * or x86intrin.h. However, when compiling with clang + * under Windows (i.e., when _MSC_VER is set), these headers + * only get included *if* the corresponding features are detected + * from macros: + * e.g., if __AVX2__ is set... in turn, we normally set these + * macros by compiling against the corresponding architecture + * (e.g., arch:AVX2, -mavx2, etc.) which compiles the whole + * software with these advanced instructions. In simdjson, we + * want to compile the whole program for a generic target, + * and only target our specific kernels. As a workaround, + * we directly include the needed headers. These headers would + * normally guard against such usage, but we carefully included + * <x86intrin.h> (or <intrin.h>) before, so the headers + * are fooled. + */ +#include <bmiintrin.h> // for _blsr_u64 +#include <lzcntintrin.h> // for __lzcnt64 +#include <immintrin.h> // for most things (AVX2, AVX512, _popcnt64) +#include <smmintrin.h> +#include <tmmintrin.h> +#include <avxintrin.h> +#include <avx2intrin.h> +#include <wmmintrin.h> // for _mm_clmulepi64_si128 +// unfortunately, we may not get _blsr_u64, but, thankfully, clang +// has it as a macro. +#ifndef _blsr_u64 +// we roll our own +#define _blsr_u64(n) ((n - 1) & n) +#endif // _blsr_u64 +#endif // SIMDJSON_CLANG_VISUAL_STUDIO + +static_assert(sizeof(__m256i) <= simdjson::SIMDJSON_PADDING, "insufficient padding for haswell kernel."); + +#endif // SIMDJSON_HASWELL_INTRINSICS_H +/* end file simdjson/haswell/intrinsics.h */ + +#if !SIMDJSON_CAN_ALWAYS_RUN_HASWELL +// We enable bmi2 only if LLVM/clang is used, because GCC may not +// make good use of it. See https://github.com/simdjson/simdjson/pull/2243 +#if defined(__clang__) +SIMDJSON_TARGET_REGION("avx2,bmi,bmi2,pclmul,lzcnt,popcnt") +#else +SIMDJSON_TARGET_REGION("avx2,bmi,pclmul,lzcnt,popcnt") +#endif +#endif + +/* including simdjson/haswell/bitmanipulation.h: #include "simdjson/haswell/bitmanipulation.h" */ +/* begin file simdjson/haswell/bitmanipulation.h */ +#ifndef SIMDJSON_HASWELL_BITMANIPULATION_H +#define SIMDJSON_HASWELL_BITMANIPULATION_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/haswell/intrinsics.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/haswell/bitmask.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace haswell { +namespace { + +// We sometimes call trailing_zero on inputs that are zero, +// but the algorithms do not end up using the returned value. +// Sadly, sanitizers are not smart enough to figure it out. +SIMDJSON_NO_SANITIZE_UNDEFINED +// This function can be used safely even if not all bytes have been +// initialized. +// See issue https://github.com/simdjson/simdjson/issues/1965 +SIMDJSON_NO_SANITIZE_MEMORY +simdjson_inline int trailing_zeroes(uint64_t input_num) { +#if SIMDJSON_REGULAR_VISUAL_STUDIO + return (int)_tzcnt_u64(input_num); +#else // SIMDJSON_REGULAR_VISUAL_STUDIO + //////// + // You might expect the next line to be equivalent to + // return (int)_tzcnt_u64(input_num); + // but the generated code differs and might be less efficient? + //////// + return __builtin_ctzll(input_num); +#endif // SIMDJSON_REGULAR_VISUAL_STUDIO +} + +/* result might be undefined when input_num is zero */ +simdjson_inline uint64_t clear_lowest_bit(uint64_t input_num) { + return _blsr_u64(input_num); +} + +/* result might be undefined when input_num is zero */ +simdjson_inline int leading_zeroes(uint64_t input_num) { + return int(_lzcnt_u64(input_num)); +} + +#if SIMDJSON_REGULAR_VISUAL_STUDIO +simdjson_inline unsigned __int64 count_ones(uint64_t input_num) { + // note: we do not support legacy 32-bit Windows in this kernel + return __popcnt64(input_num);// Visual Studio wants two underscores +} +#else +simdjson_inline long long int count_ones(uint64_t input_num) { + return _popcnt64(input_num); +} +#endif + +simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2, + uint64_t *result) { +#if SIMDJSON_REGULAR_VISUAL_STUDIO + return _addcarry_u64(0, value1, value2, + reinterpret_cast<unsigned __int64 *>(result)); +#else + return __builtin_uaddll_overflow(value1, value2, + reinterpret_cast<unsigned long long *>(result)); +#endif +} + +} // unnamed namespace +} // namespace haswell +} // namespace simdjson + +#endif // SIMDJSON_HASWELL_BITMANIPULATION_H +/* end file simdjson/haswell/bitmanipulation.h */ +/* including simdjson/haswell/bitmask.h: #include "simdjson/haswell/bitmask.h" */ +/* begin file simdjson/haswell/bitmask.h */ +#ifndef SIMDJSON_HASWELL_BITMASK_H +#define SIMDJSON_HASWELL_BITMASK_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/haswell/intrinsics.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace haswell { +namespace { + +// +// Perform a "cumulative bitwise xor," flipping bits each time a 1 is encountered. +// +// For example, prefix_xor(00100100) == 00011100 +// +simdjson_inline uint64_t prefix_xor(const uint64_t bitmask) { + // There should be no such thing with a processor supporting avx2 + // but not clmul. + __m128i all_ones = _mm_set1_epi8('\xFF'); + __m128i result = _mm_clmulepi64_si128(_mm_set_epi64x(0ULL, bitmask), all_ones, 0); + return _mm_cvtsi128_si64(result); +} + +} // unnamed namespace +} // namespace haswell +} // namespace simdjson + +#endif // SIMDJSON_HASWELL_BITMASK_H +/* end file simdjson/haswell/bitmask.h */ +/* including simdjson/haswell/numberparsing_defs.h: #include "simdjson/haswell/numberparsing_defs.h" */ +/* begin file simdjson/haswell/numberparsing_defs.h */ +#ifndef SIMDJSON_HASWELL_NUMBERPARSING_DEFS_H +#define SIMDJSON_HASWELL_NUMBERPARSING_DEFS_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/haswell/intrinsics.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace haswell { +namespace numberparsing { + +/** @private */ +static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) { + // this actually computes *16* values so we are being wasteful. + const __m128i ascii0 = _mm_set1_epi8('0'); + const __m128i mul_1_10 = + _mm_setr_epi8(10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1); + const __m128i mul_1_100 = _mm_setr_epi16(100, 1, 100, 1, 100, 1, 100, 1); + const __m128i mul_1_10000 = + _mm_setr_epi16(10000, 1, 10000, 1, 10000, 1, 10000, 1); + const __m128i input = _mm_sub_epi8( + _mm_loadu_si128(reinterpret_cast<const __m128i *>(chars)), ascii0); + const __m128i t1 = _mm_maddubs_epi16(input, mul_1_10); + const __m128i t2 = _mm_madd_epi16(t1, mul_1_100); + const __m128i t3 = _mm_packus_epi32(t2, t2); + const __m128i t4 = _mm_madd_epi16(t3, mul_1_10000); + return _mm_cvtsi128_si32( + t4); // only captures the sum of the first 8 digits, drop the rest +} + +/** @private */ +simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) { + internal::value128 answer; +#if SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS +#if SIMDJSON_IS_ARM64 + // ARM64 has native support for 64-bit multiplications, no need to emultate + answer.high = __umulh(value1, value2); + answer.low = value1 * value2; +#else + answer.low = _umul128(value1, value2, &answer.high); // _umul128 not available on ARM64 +#endif // SIMDJSON_IS_ARM64 +#else // SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS + __uint128_t r = (static_cast<__uint128_t>(value1)) * value2; + answer.low = uint64_t(r); + answer.high = uint64_t(r >> 64); +#endif + return answer; +} + +} // namespace numberparsing +} // namespace haswell +} // namespace simdjson + +#define SIMDJSON_SWAR_NUMBER_PARSING 1 + +#endif // SIMDJSON_HASWELL_NUMBERPARSING_DEFS_H +/* end file simdjson/haswell/numberparsing_defs.h */ +/* including simdjson/haswell/simd.h: #include "simdjson/haswell/simd.h" */ +/* begin file simdjson/haswell/simd.h */ +#ifndef SIMDJSON_HASWELL_SIMD_H +#define SIMDJSON_HASWELL_SIMD_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/haswell/intrinsics.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/haswell/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace haswell { +namespace { +namespace simd { + + // Forward-declared so they can be used by splat and friends. + template<typename Child> + struct base { + __m256i value; + + // Zero constructor + simdjson_inline base() : value{__m256i()} {} + + // Conversion from SIMD register + simdjson_inline base(const __m256i _value) : value(_value) {} + + // Conversion to SIMD register + simdjson_inline operator const __m256i&() const { return this->value; } + simdjson_inline operator __m256i&() { return this->value; } + + // Bit operations + simdjson_inline Child operator|(const Child other) const { return _mm256_or_si256(*this, other); } + simdjson_inline Child operator&(const Child other) const { return _mm256_and_si256(*this, other); } + simdjson_inline Child operator^(const Child other) const { return _mm256_xor_si256(*this, other); } + simdjson_inline Child bit_andnot(const Child other) const { return _mm256_andnot_si256(other, *this); } + simdjson_inline Child& operator|=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast | other; return *this_cast; } + simdjson_inline Child& operator&=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast & other; return *this_cast; } + simdjson_inline Child& operator^=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast ^ other; return *this_cast; } + }; + + // Forward-declared so they can be used by splat and friends. + template<typename T> + struct simd8; + + template<typename T, typename Mask=simd8<bool>> + struct base8: base<simd8<T>> { + typedef uint32_t bitmask_t; + typedef uint64_t bitmask2_t; + + simdjson_inline base8() : base<simd8<T>>() {} + simdjson_inline base8(const __m256i _value) : base<simd8<T>>(_value) {} + + friend simdjson_really_inline Mask operator==(const simd8<T> lhs, const simd8<T> rhs) { return _mm256_cmpeq_epi8(lhs, rhs); } + + static const int SIZE = sizeof(base<T>::value); + + template<int N=1> + simdjson_inline simd8<T> prev(const simd8<T> prev_chunk) const { + return _mm256_alignr_epi8(*this, _mm256_permute2x128_si256(prev_chunk, *this, 0x21), 16 - N); + } + }; + + // SIMD byte mask type (returned by things like eq and gt) + template<> + struct simd8<bool>: base8<bool> { + static simdjson_inline simd8<bool> splat(bool _value) { return _mm256_set1_epi8(uint8_t(-(!!_value))); } + + simdjson_inline simd8() : base8() {} + simdjson_inline simd8(const __m256i _value) : base8<bool>(_value) {} + // Splat constructor + simdjson_inline simd8(bool _value) : base8<bool>(splat(_value)) {} + + simdjson_inline int to_bitmask() const { return _mm256_movemask_epi8(*this); } + simdjson_inline bool any() const { return !_mm256_testz_si256(*this, *this); } + simdjson_inline simd8<bool> operator~() const { return *this ^ true; } + }; + + template<typename T> + struct base8_numeric: base8<T> { + static simdjson_inline simd8<T> splat(T _value) { return _mm256_set1_epi8(_value); } + static simdjson_inline simd8<T> zero() { return _mm256_setzero_si256(); } + static simdjson_inline simd8<T> load(const T values[32]) { + return _mm256_loadu_si256(reinterpret_cast<const __m256i *>(values)); + } + // Repeat 16 values as many times as necessary (usually for lookup tables) + static simdjson_inline simd8<T> repeat_16( + T v0, T v1, T v2, T v3, T v4, T v5, T v6, T v7, + T v8, T v9, T v10, T v11, T v12, T v13, T v14, T v15 + ) { + return simd8<T>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15, + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + ); + } + + simdjson_inline base8_numeric() : base8<T>() {} + simdjson_inline base8_numeric(const __m256i _value) : base8<T>(_value) {} + + // Store to array + simdjson_inline void store(T dst[32]) const { return _mm256_storeu_si256(reinterpret_cast<__m256i *>(dst), *this); } + + // Addition/subtraction are the same for signed and unsigned + simdjson_inline simd8<T> operator+(const simd8<T> other) const { return _mm256_add_epi8(*this, other); } + simdjson_inline simd8<T> operator-(const simd8<T> other) const { return _mm256_sub_epi8(*this, other); } + simdjson_inline simd8<T>& operator+=(const simd8<T> other) { *this = *this + other; return *static_cast<simd8<T>*>(this); } + simdjson_inline simd8<T>& operator-=(const simd8<T> other) { *this = *this - other; return *static_cast<simd8<T>*>(this); } + + // Override to distinguish from bool version + simdjson_inline simd8<T> operator~() const { return *this ^ 0xFFu; } + + // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values) + template<typename L> + simdjson_inline simd8<L> lookup_16(simd8<L> lookup_table) const { + return _mm256_shuffle_epi8(lookup_table, *this); + } + + // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted as a bitset). + // Passing a 0 value for mask would be equivalent to writing out every byte to output. + // Only the first 32 - count_ones(mask) bytes of the result are significant but 32 bytes + // get written. + // Design consideration: it seems like a function with the + // signature simd8<L> compress(uint32_t mask) would be + // sensible, but the AVX ISA makes this kind of approach difficult. + template<typename L> + simdjson_inline void compress(uint32_t mask, L * output) const { + using internal::thintable_epi8; + using internal::BitsSetTable256mul2; + using internal::pshufb_combine_table; + // this particular implementation was inspired by work done by @animetosho + // we do it in four steps, first 8 bytes and then second 8 bytes... + uint8_t mask1 = uint8_t(mask); // least significant 8 bits + uint8_t mask2 = uint8_t(mask >> 8); // second least significant 8 bits + uint8_t mask3 = uint8_t(mask >> 16); // ... + uint8_t mask4 = uint8_t(mask >> 24); // ... + // next line just loads the 64-bit values thintable_epi8[mask1] and + // thintable_epi8[mask2] into a 128-bit register, using only + // two instructions on most compilers. + __m256i shufmask = _mm256_set_epi64x(thintable_epi8[mask4], thintable_epi8[mask3], + thintable_epi8[mask2], thintable_epi8[mask1]); + // we increment by 0x08 the second half of the mask and so forth + shufmask = + _mm256_add_epi8(shufmask, _mm256_set_epi32(0x18181818, 0x18181818, + 0x10101010, 0x10101010, 0x08080808, 0x08080808, 0, 0)); + // this is the version "nearly pruned" + __m256i pruned = _mm256_shuffle_epi8(*this, shufmask); + // we still need to put the pieces back together. + // we compute the popcount of the first words: + int pop1 = BitsSetTable256mul2[mask1]; + int pop3 = BitsSetTable256mul2[mask3]; + + // then load the corresponding mask + // could be done with _mm256_loadu2_m128i but many standard libraries omit this intrinsic. + __m256i v256 = _mm256_castsi128_si256( + _mm_loadu_si128(reinterpret_cast<const __m128i *>(pshufb_combine_table + pop1 * 8))); + __m256i compactmask = _mm256_insertf128_si256(v256, + _mm_loadu_si128(reinterpret_cast<const __m128i *>(pshufb_combine_table + pop3 * 8)), 1); + __m256i almostthere = _mm256_shuffle_epi8(pruned, compactmask); + // We just need to write out the result. + // This is the tricky bit that is hard to do + // if we want to return a SIMD register, since there + // is no single-instruction approach to recombine + // the two 128-bit lanes with an offset. + __m128i v128; + v128 = _mm256_castsi256_si128(almostthere); + _mm_storeu_si128( reinterpret_cast<__m128i *>(output), v128); + v128 = _mm256_extractf128_si256(almostthere, 1); + _mm_storeu_si128( reinterpret_cast<__m128i *>(output + 16 - count_ones(mask & 0xFFFF)), v128); + } + + template<typename L> + simdjson_inline simd8<L> lookup_16( + L replace0, L replace1, L replace2, L replace3, + L replace4, L replace5, L replace6, L replace7, + L replace8, L replace9, L replace10, L replace11, + L replace12, L replace13, L replace14, L replace15) const { + return lookup_16(simd8<L>::repeat_16( + replace0, replace1, replace2, replace3, + replace4, replace5, replace6, replace7, + replace8, replace9, replace10, replace11, + replace12, replace13, replace14, replace15 + )); + } + }; + + // Signed bytes + template<> + struct simd8<int8_t> : base8_numeric<int8_t> { + simdjson_inline simd8() : base8_numeric<int8_t>() {} + simdjson_inline simd8(const __m256i _value) : base8_numeric<int8_t>(_value) {} + // Splat constructor + simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {} + // Array constructor + simdjson_inline simd8(const int8_t values[32]) : simd8(load(values)) {} + // Member-by-member initialization + simdjson_inline simd8( + int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, + int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15, + int8_t v16, int8_t v17, int8_t v18, int8_t v19, int8_t v20, int8_t v21, int8_t v22, int8_t v23, + int8_t v24, int8_t v25, int8_t v26, int8_t v27, int8_t v28, int8_t v29, int8_t v30, int8_t v31 + ) : simd8(_mm256_setr_epi8( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15, + v16,v17,v18,v19,v20,v21,v22,v23, + v24,v25,v26,v27,v28,v29,v30,v31 + )) {} + // Repeat 16 values as many times as necessary (usually for lookup tables) + simdjson_inline static simd8<int8_t> repeat_16( + int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, + int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 + ) { + return simd8<int8_t>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15, + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + ); + } + + // Order-sensitive comparisons + simdjson_inline simd8<int8_t> max_val(const simd8<int8_t> other) const { return _mm256_max_epi8(*this, other); } + simdjson_inline simd8<int8_t> min_val(const simd8<int8_t> other) const { return _mm256_min_epi8(*this, other); } + simdjson_inline simd8<bool> operator>(const simd8<int8_t> other) const { return _mm256_cmpgt_epi8(*this, other); } + simdjson_inline simd8<bool> operator<(const simd8<int8_t> other) const { return _mm256_cmpgt_epi8(other, *this); } + }; + + // Unsigned bytes + template<> + struct simd8<uint8_t>: base8_numeric<uint8_t> { + simdjson_inline simd8() : base8_numeric<uint8_t>() {} + simdjson_inline simd8(const __m256i _value) : base8_numeric<uint8_t>(_value) {} + // Splat constructor + simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {} + // Array constructor + simdjson_inline simd8(const uint8_t values[32]) : simd8(load(values)) {} + // Member-by-member initialization + simdjson_inline simd8( + uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, + uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15, + uint8_t v16, uint8_t v17, uint8_t v18, uint8_t v19, uint8_t v20, uint8_t v21, uint8_t v22, uint8_t v23, + uint8_t v24, uint8_t v25, uint8_t v26, uint8_t v27, uint8_t v28, uint8_t v29, uint8_t v30, uint8_t v31 + ) : simd8(_mm256_setr_epi8( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15, + v16,v17,v18,v19,v20,v21,v22,v23, + v24,v25,v26,v27,v28,v29,v30,v31 + )) {} + // Repeat 16 values as many times as necessary (usually for lookup tables) + simdjson_inline static simd8<uint8_t> repeat_16( + uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, + uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 + ) { + return simd8<uint8_t>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15, + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + ); + } + + // Saturated math + simdjson_inline simd8<uint8_t> saturating_add(const simd8<uint8_t> other) const { return _mm256_adds_epu8(*this, other); } + simdjson_inline simd8<uint8_t> saturating_sub(const simd8<uint8_t> other) const { return _mm256_subs_epu8(*this, other); } + + // Order-specific operations + simdjson_inline simd8<uint8_t> max_val(const simd8<uint8_t> other) const { return _mm256_max_epu8(*this, other); } + simdjson_inline simd8<uint8_t> min_val(const simd8<uint8_t> other) const { return _mm256_min_epu8(other, *this); } + // Same as >, but only guarantees true is nonzero (< guarantees true = -1) + simdjson_inline simd8<uint8_t> gt_bits(const simd8<uint8_t> other) const { return this->saturating_sub(other); } + // Same as <, but only guarantees true is nonzero (< guarantees true = -1) + simdjson_inline simd8<uint8_t> lt_bits(const simd8<uint8_t> other) const { return other.saturating_sub(*this); } + simdjson_inline simd8<bool> operator<=(const simd8<uint8_t> other) const { return other.max_val(*this) == other; } + simdjson_inline simd8<bool> operator>=(const simd8<uint8_t> other) const { return other.min_val(*this) == other; } + simdjson_inline simd8<bool> operator>(const simd8<uint8_t> other) const { return this->gt_bits(other).any_bits_set(); } + simdjson_inline simd8<bool> operator<(const simd8<uint8_t> other) const { return this->lt_bits(other).any_bits_set(); } + + // Bit-specific operations + simdjson_inline simd8<bool> bits_not_set() const { return *this == uint8_t(0); } + simdjson_inline simd8<bool> bits_not_set(simd8<uint8_t> bits) const { return (*this & bits).bits_not_set(); } + simdjson_inline simd8<bool> any_bits_set() const { return ~this->bits_not_set(); } + simdjson_inline simd8<bool> any_bits_set(simd8<uint8_t> bits) const { return ~this->bits_not_set(bits); } + simdjson_inline bool is_ascii() const { return _mm256_movemask_epi8(*this) == 0; } + simdjson_inline bool bits_not_set_anywhere() const { return _mm256_testz_si256(*this, *this); } + simdjson_inline bool any_bits_set_anywhere() const { return !bits_not_set_anywhere(); } + simdjson_inline bool bits_not_set_anywhere(simd8<uint8_t> bits) const { return _mm256_testz_si256(*this, bits); } + simdjson_inline bool any_bits_set_anywhere(simd8<uint8_t> bits) const { return !bits_not_set_anywhere(bits); } + template<int N> + simdjson_inline simd8<uint8_t> shr() const { return simd8<uint8_t>(_mm256_srli_epi16(*this, N)) & uint8_t(0xFFu >> N); } + template<int N> + simdjson_inline simd8<uint8_t> shl() const { return simd8<uint8_t>(_mm256_slli_epi16(*this, N)) & uint8_t(0xFFu << N); } + // Get one of the bits and make a bitmask out of it. + // e.g. value.get_bit<7>() gets the high bit + template<int N> + simdjson_inline int get_bit() const { return _mm256_movemask_epi8(_mm256_slli_epi16(*this, 7-N)); } + }; + + template<typename T> + struct simd8x64 { + static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<T>); + static_assert(NUM_CHUNKS == 2, "Haswell kernel should use two registers per 64-byte block."); + const simd8<T> chunks[NUM_CHUNKS]; + template<int idx> simd8<uint8_t> get() const { return idx < NUM_CHUNKS ? chunks[idx] : simd8<T>(); } + + simd8x64(const simd8x64<T>& o) = delete; // no copy allowed + simd8x64<T>& operator=(const simd8<T>& other) = delete; // no assignment allowed + simd8x64() = delete; // no default constructor allowed + + simdjson_inline simd8x64(const simd8<T> chunk0, const simd8<T> chunk1) : chunks{chunk0, chunk1} {} + simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8<T>::load(ptr), simd8<T>::load(ptr+32)} {} + + simdjson_inline uint64_t compress(uint64_t mask, T * output) const { + uint32_t mask1 = uint32_t(mask); + uint32_t mask2 = uint32_t(mask >> 32); + this->chunks[0].compress(mask1, output); + this->chunks[1].compress(mask2, output + 32 - count_ones(mask1)); + return 64 - count_ones(mask); + } + + simdjson_inline void store(T ptr[64]) const { + this->chunks[0].store(ptr+sizeof(simd8<T>)*0); + this->chunks[1].store(ptr+sizeof(simd8<T>)*1); + } + + simdjson_inline uint64_t to_bitmask() const { + uint64_t r_lo = uint32_t(this->chunks[0].to_bitmask()); + uint64_t r_hi = this->chunks[1].to_bitmask(); + return r_lo | (r_hi << 32); + } + + simdjson_inline simd8<T> reduce_or() const { + return this->chunks[0] | this->chunks[1]; + } + + simdjson_inline simd8x64<T> bit_or(const T m) const { + const simd8<T> mask = simd8<T>::splat(m); + return simd8x64<T>( + this->chunks[0] | mask, + this->chunks[1] | mask + ); + } + + simdjson_inline uint64_t eq(const T m) const { + const simd8<T> mask = simd8<T>::splat(m); + return simd8x64<bool>( + this->chunks[0] == mask, + this->chunks[1] == mask + ).to_bitmask(); + } + + simdjson_inline uint64_t eq(const simd8x64<uint8_t> &other) const { + return simd8x64<bool>( + this->chunks[0] == other.chunks[0], + this->chunks[1] == other.chunks[1] + ).to_bitmask(); + } + + simdjson_inline uint64_t lteq(const T m) const { + const simd8<T> mask = simd8<T>::splat(m); + return simd8x64<bool>( + this->chunks[0] <= mask, + this->chunks[1] <= mask + ).to_bitmask(); + } + }; // struct simd8x64<T> + +} // namespace simd + +} // unnamed namespace +} // namespace haswell +} // namespace simdjson + +#endif // SIMDJSON_HASWELL_SIMD_H +/* end file simdjson/haswell/simd.h */ +/* including simdjson/haswell/stringparsing_defs.h: #include "simdjson/haswell/stringparsing_defs.h" */ +/* begin file simdjson/haswell/stringparsing_defs.h */ +#ifndef SIMDJSON_HASWELL_STRINGPARSING_DEFS_H +#define SIMDJSON_HASWELL_STRINGPARSING_DEFS_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/haswell/simd.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/haswell/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace haswell { +namespace { + +using namespace simd; + +// Holds backslashes and quotes locations. +struct backslash_and_quote { +public: + static constexpr uint32_t BYTES_PROCESSED = 32; + simdjson_inline backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst); + + simdjson_inline bool has_quote_first() { return ((bs_bits - 1) & quote_bits) != 0; } + simdjson_inline bool has_backslash() { return ((quote_bits - 1) & bs_bits) != 0; } + simdjson_inline int quote_index() { return trailing_zeroes(quote_bits); } + simdjson_inline int backslash_index() { return trailing_zeroes(bs_bits); } + + uint32_t bs_bits; + uint32_t quote_bits; +}; // struct backslash_and_quote + +simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) { + // this can read up to 15 bytes beyond the buffer size, but we require + // SIMDJSON_PADDING of padding + static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "backslash and quote finder must process fewer than SIMDJSON_PADDING bytes"); + simd8<uint8_t> v(src); + // store to dest unconditionally - we can overwrite the bits we don't like later + v.store(dst); + return { + static_cast<uint32_t>((v == '\\').to_bitmask()), // bs_bits + static_cast<uint32_t>((v == '"').to_bitmask()), // quote_bits + }; +} + + +struct escaping { + static constexpr uint32_t BYTES_PROCESSED = 32; + simdjson_inline static escaping copy_and_find(const uint8_t *src, uint8_t *dst); + + simdjson_inline bool has_escape() { return escape_bits != 0; } + simdjson_inline int escape_index() { return trailing_zeroes(escape_bits); } + + uint64_t escape_bits; +}; // struct escaping + + + +simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *dst) { + static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "escaping finder must process fewer than SIMDJSON_PADDING bytes"); + simd8<uint8_t> v(src); + v.store(dst); + simd8<bool> is_quote = (v == '"'); + simd8<bool> is_backslash = (v == '\\'); + simd8<bool> is_control = (v < 32); + return { + uint64_t((is_backslash | is_quote | is_control).to_bitmask()) + }; +} + +} // unnamed namespace +} // namespace haswell +} // namespace simdjson + +#endif // SIMDJSON_HASWELL_STRINGPARSING_DEFS_H +/* end file simdjson/haswell/stringparsing_defs.h */ +/* end file simdjson/haswell/begin.h */ +/* including simdjson/generic/builder/amalgamated.h for haswell: #include "simdjson/generic/builder/amalgamated.h" */ +/* begin file simdjson/generic/builder/amalgamated.h for haswell */ +#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_BUILDER_DEPENDENCIES_H) +#error simdjson/generic/builder/dependencies.h must be included before simdjson/generic/builder/amalgamated.h! +#endif + +/* including simdjson/generic/builder/json_string_builder.h for haswell: #include "simdjson/generic/builder/json_string_builder.h" */ +/* begin file simdjson/generic/builder/json_string_builder.h for haswell */ +#ifndef SIMDJSON_GENERIC_STRING_BUILDER_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { + + +#if SIMDJSON_SUPPORTS_CONCEPTS + +namespace haswell { +namespace builder { + class string_builder; +}} + +template <typename T, typename = void> +struct has_custom_serialization : std::false_type {}; + +inline constexpr struct serialize_tag { + template <typename T> + constexpr void operator()(haswell::builder::string_builder& b, T&& obj) const{ + return tag_invoke(*this, b, std::forward<T>(obj)); + } + + +} serialize{}; +template <typename T> +struct has_custom_serialization<T, std::void_t< + decltype(tag_invoke(serialize, std::declval<haswell::builder::string_builder&>(), std::declval<T&>())) +>> : std::true_type {}; + +template <typename T> +constexpr bool require_custom_serialization = has_custom_serialization<T>::value; +#else +struct has_custom_serialization : std::false_type {}; +#endif // SIMDJSON_SUPPORTS_CONCEPTS + +namespace haswell { +namespace builder { +/** + * A builder for JSON strings representing documents. This is a low-level + * builder that is not meant to be used directly by end-users. Though it + * supports atomic types (Booleans, strings), it does not support composed + * types (arrays and objects). + * + * Ultimately, this class can support kernel-specific optimizations. E.g., + * it may make use of SIMD instructions to escape strings faster. + */ +class string_builder { +public: + simdjson_inline string_builder(size_t initial_capacity = DEFAULT_INITIAL_CAPACITY); + + static constexpr size_t DEFAULT_INITIAL_CAPACITY = 1024; + + /** + * Append number (includes Booleans). Booleans are mapped to the strings + * false and true. Numbers are converted to strings abiding by the JSON standard. + * Floating-point numbers are converted to the shortest string that 'correctly' + * represents the number. + */ + template<typename number_type, + typename = typename std::enable_if<std::is_arithmetic<number_type>::value>::type> + simdjson_inline void append(number_type v) noexcept; + + /** + * Append character c. + */ + simdjson_inline void append(char c) noexcept; + + /** + * Append the string 'null'. + */ + simdjson_inline void append_null() noexcept; + + /** + * Clear the content. + */ + simdjson_inline void clear() noexcept; + + /** + * Append the std::string_view, after escaping it. + * There is no UTF-8 validation. + */ + simdjson_inline void escape_and_append(std::string_view input) noexcept; + + /** + * Append the std::string_view surrounded by double quotes, after escaping it. + * There is no UTF-8 validation. + */ + simdjson_inline void escape_and_append_with_quotes(std::string_view input) noexcept; +#if SIMDJSON_SUPPORTS_CONCEPTS + template<constevalutil::fixed_string key> + simdjson_inline void escape_and_append_with_quotes() noexcept; +#endif + /** + * Append the character surrounded by double quotes, after escaping it. + * There is no UTF-8 validation. + */ + simdjson_inline void escape_and_append_with_quotes(char input) noexcept; + + /** + * Append the character surrounded by double quotes, after escaping it. + * There is no UTF-8 validation. + */ + simdjson_inline void escape_and_append_with_quotes(const char* input) noexcept; + + /** + * Append the C string directly, without escaping. + * There is no UTF-8 validation. + */ + simdjson_inline void append_raw(const char *c) noexcept; + + /** + * Append "{" to the buffer. + */ + simdjson_inline void start_object() noexcept; + + /** + * Append "}" to the buffer. + */ + simdjson_inline void end_object() noexcept; + + /** + * Append "[" to the buffer. + */ + simdjson_inline void start_array() noexcept; + + /** + * Append "]" to the buffer. + */ + simdjson_inline void end_array() noexcept; + + /** + * Append "," to the buffer. + */ + simdjson_inline void append_comma() noexcept; + + /** + * Append ":" to the buffer. + */ + simdjson_inline void append_colon() noexcept; + + /** + * Append a key-value pair to the buffer. + * The key is escaped and surrounded by double quotes. + * The value is escaped if it is a string. + */ + template<typename key_type, typename value_type> + simdjson_inline void append_key_value(key_type key, value_type value) noexcept; +#if SIMDJSON_SUPPORTS_CONCEPTS + template<constevalutil::fixed_string key, typename value_type> + simdjson_inline void append_key_value(value_type value) noexcept; + + // Support for optional types (std::optional, etc.) + template <concepts::optional_type T> + requires(!require_custom_serialization<T>) + simdjson_inline void append(const T &opt); + + template <typename T> + requires(require_custom_serialization<T>) + simdjson_inline void append(T &&val); + + // Support for string-like types + template <typename T> + requires(std::is_convertible<T, std::string_view>::value || + std::is_same<T, const char*>::value ) + simdjson_inline void append(const T &value); +#endif +#if SIMDJSON_SUPPORTS_RANGES && SIMDJSON_SUPPORTS_CONCEPTS + // Support for range-based appending (std::ranges::view, etc.) + template <std::ranges::range R> +requires (!std::is_convertible<R, std::string_view>::value && !require_custom_serialization<R>) + simdjson_inline void append(const R &range) noexcept; +#endif + /** + * Append the std::string_view directly, without escaping. + * There is no UTF-8 validation. + */ + simdjson_inline void append_raw(std::string_view input) noexcept; + + /** + * Append len characters from str. + * There is no UTF-8 validation. + */ + simdjson_inline void append_raw(const char *str, size_t len) noexcept; +#if SIMDJSON_EXCEPTIONS + /** + * Creates an std::string from the written JSON buffer. + * Throws if memory allocation failed + * + * The result may not be valid UTF-8 if some of your content was not valid UTF-8. + * Use validate_unicode() to check the content if needed. + */ + simdjson_inline operator std::string() const noexcept(false); + + /** + * Creates an std::string_view from the written JSON buffer. + * Throws if memory allocation failed. + * + * The result may not be valid UTF-8 if some of your content was not valid UTF-8. + * Use validate_unicode() to check the content if needed. + */ + simdjson_inline operator std::string_view() const noexcept(false) simdjson_lifetime_bound; +#endif + + /** + * Returns a view on the written JSON buffer. Returns an error + * if memory allocation failed. + * + * The result may not be valid UTF-8 if some of your content was not valid UTF-8. + * Use validate_unicode() to check the content. + */ + simdjson_inline simdjson_result<std::string_view> view() const noexcept; + + /** + * Appends the null character to the buffer and returns + * a pointer to the beginning of the written JSON buffer. + * Returns an error if memory allocation failed. + * The result is null-terminated. + * + * The result may not be valid UTF-8 if some of your content was not valid UTF-8. + * Use validate_unicode() to check the content. + */ + simdjson_inline simdjson_result<const char *> c_str() noexcept; + + /** + * Return true if the content is valid UTF-8. + */ + simdjson_inline bool validate_unicode() const noexcept; + + /** + * Returns the current size of the written JSON buffer. + * If an error occurred, returns 0. + */ + simdjson_inline size_t size() const noexcept; + +private: + /** + * Returns true if we can write at least upcoming_bytes bytes. + * The underlying buffer is reallocated if needed. It is designed + * to be called before writing to the buffer. It should be fast. + */ + simdjson_inline bool capacity_check(size_t upcoming_bytes); + + /** + * Grow the buffer to at least desired_capacity bytes. + * If the allocation fails, is_valid is set to false. We expect + * that this function would not be repeatedly called. + */ + simdjson_inline void grow_buffer(size_t desired_capacity); + + /** + * We use this helper function to make sure that is_valid is kept consistent. + */ + simdjson_inline void set_valid(bool valid) noexcept; + + std::unique_ptr<char[]> buffer{}; + size_t position{0}; + size_t capacity{0}; + bool is_valid{true}; +}; + + + +} +} + + +#if !SIMDJSON_STATIC_REFLECTION +// fallback implementation until we have static reflection +template <class Z> +simdjson_warn_unused simdjson_result<std::string> to_json(const Z &z, size_t initial_capacity = simdjson::haswell::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + simdjson::haswell::builder::string_builder b(initial_capacity); + b.append(z); + std::string_view s; + auto e = b.view().get(s); + if(e) { return e; } + return std::string(s); +} +template <class Z> +simdjson_warn_unused error_code to_json(const Z &z, std::string &s, size_t initial_capacity = simdjson::haswell::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + simdjson::haswell::builder::string_builder b(initial_capacity); + b.append(z); + std::string_view sv; + auto e = b.view().get(sv); + if(e) { return e; } + s.assign(sv.data(), sv.size()); + return simdjson::SUCCESS; +} +#endif + +#if SIMDJSON_SUPPORTS_CONCEPTS +#endif // SIMDJSON_SUPPORTS_CONCEPTS + +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_STRING_BUILDER_H +/* end file simdjson/generic/builder/json_string_builder.h for haswell */ +/* including simdjson/generic/builder/json_builder.h for haswell: #include "simdjson/generic/builder/json_builder.h" */ +/* begin file simdjson/generic/builder/json_builder.h for haswell */ +#ifndef SIMDJSON_GENERIC_BUILDER_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_string_builder.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/concepts.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ +#if SIMDJSON_STATIC_REFLECTION + +#include <charconv> +#include <cstring> +#include <meta> +#include <memory> +#include <optional> +#include <string_view> +#include <type_traits> +#include <utility> +// #include <static_reflection> // for std::define_static_string - header not available yet + +namespace simdjson { +namespace haswell { +namespace builder { + +template <class T> + requires(concepts::container_but_not_string<T> && !require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &t) { + auto it = t.begin(); + auto end = t.end(); + if (it == end) { + b.append_raw("[]"); + return; + } + b.append('['); + atom(b, *it); + ++it; + for (; it != end; ++it) { + b.append(','); + atom(b, *it); + } + b.append(']'); +} + +template <class T> + requires(std::is_same_v<T, std::string> || + std::is_same_v<T, std::string_view> || + std::is_same_v<T, const char *> || + std::is_same_v<T, char>) +constexpr void atom(string_builder &b, const T &t) { + b.escape_and_append_with_quotes(t); +} + +template <concepts::string_view_keyed_map T> + requires(!require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &m) { + if (m.empty()) { + b.append_raw("{}"); + return; + } + b.append('{'); + bool first = true; + for (const auto& [key, value] : m) { + if (!first) { + b.append(','); + } + first = false; + // Keys must be convertible to string_view per the concept + b.escape_and_append_with_quotes(key); + b.append(':'); + atom(b, value); + } + b.append('}'); +} + + +template<typename number_type, + typename = typename std::enable_if<std::is_arithmetic<number_type>::value && !std::is_same_v<number_type, char>>::type> +constexpr void atom(string_builder &b, const number_type t) { + b.append(t); +} + +template <class T> + requires(std::is_class_v<T> && !concepts::container_but_not_string<T> && + !concepts::string_view_keyed_map<T> && + !concepts::optional_type<T> && + !concepts::smart_pointer<T> && + !concepts::appendable_containers<T> && + !std::is_same_v<T, std::string> && + !std::is_same_v<T, std::string_view> && + !std::is_same_v<T, const char*> && + !std::is_same_v<T, char> && !require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &t) { + int i = 0; + b.append('{'); + template for (constexpr auto dm : std::define_static_array(std::meta::nonstatic_data_members_of(^^T, std::meta::access_context::unchecked()))) { + if (i != 0) + b.append(','); + constexpr auto key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(dm))); + b.append_raw(key); + b.append(':'); + atom(b, t.[:dm:]); + i++; + }; + b.append('}'); +} + +// Support for optional types (std::optional, etc.) +template <concepts::optional_type T> + requires(!require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &opt) { + if (opt) { + atom(b, opt.value()); + } else { + b.append_raw("null"); + } +} + +// Support for smart pointers (std::unique_ptr, std::shared_ptr, etc.) +template <concepts::smart_pointer T> + requires(!require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &ptr) { + if (ptr) { + atom(b, *ptr); + } else { + b.append_raw("null"); + } +} + +// Support for enums - serialize as string representation using expand approach from P2996R12 +template <typename T> + requires(std::is_enum_v<T> && !require_custom_serialization<T>) +void atom(string_builder &b, const T &e) { +#if SIMDJSON_STATIC_REFLECTION + constexpr auto enumerators = std::define_static_array(std::meta::enumerators_of(^^T)); + template for (constexpr auto enum_val : enumerators) { + constexpr auto enum_str = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(enum_val))); + if (e == [:enum_val:]) { + b.append_raw(enum_str); + return; + } + }; + // Fallback to integer if enum value not found + atom(b, static_cast<std::underlying_type_t<T>>(e)); +#else + // Fallback: serialize as integer if reflection not available + atom(b, static_cast<std::underlying_type_t<T>>(e)); +#endif +} + +// Support for appendable containers that don't have operator[] (sets, etc.) +template <concepts::appendable_containers T> + requires(!concepts::container_but_not_string<T> && !concepts::string_view_keyed_map<T> && + !concepts::optional_type<T> && !concepts::smart_pointer<T> && + !std::is_same_v<T, std::string> && + !std::is_same_v<T, std::string_view> && !std::is_same_v<T, const char*> && !require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &container) { + if (container.empty()) { + b.append_raw("[]"); + return; + } + b.append('['); + bool first = true; + for (const auto& item : container) { + if (!first) { + b.append(','); + } + first = false; + atom(b, item); + } + b.append(']'); +} + +// append functions that delegate to atom functions for primitive types +template <class T> + requires(std::is_arithmetic_v<T> && !std::is_same_v<T, char>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +template <class T> + requires(std::is_same_v<T, std::string> || + std::is_same_v<T, std::string_view> || + std::is_same_v<T, const char *> || + std::is_same_v<T, char>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +template <concepts::optional_type T> + requires(!require_custom_serialization<T>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +template <concepts::smart_pointer T> + requires(!require_custom_serialization<T>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +template <concepts::appendable_containers T> + requires(!concepts::container_but_not_string<T> && !concepts::string_view_keyed_map<T> && + !concepts::optional_type<T> && !concepts::smart_pointer<T> && + !std::is_same_v<T, std::string> && + !std::is_same_v<T, std::string_view> && !std::is_same_v<T, const char*> && !require_custom_serialization<T>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +template <concepts::string_view_keyed_map T> + requires(!require_custom_serialization<T>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +// works for struct +template <class Z> + requires(std::is_class_v<Z> && !concepts::container_but_not_string<Z> && + !concepts::string_view_keyed_map<Z> && + !concepts::optional_type<Z> && + !concepts::smart_pointer<Z> && + !concepts::appendable_containers<Z> && + !std::is_same_v<Z, std::string> && + !std::is_same_v<Z, std::string_view> && + !std::is_same_v<Z, const char*> && + !std::is_same_v<Z, char> && !require_custom_serialization<Z>) +void append(string_builder &b, const Z &z) { + int i = 0; + b.append('{'); + template for (constexpr auto dm : std::define_static_array(std::meta::nonstatic_data_members_of(^^Z, std::meta::access_context::unchecked()))) { + if (i != 0) + b.append(','); + constexpr auto key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(dm))); + b.append_raw(key); + b.append(':'); + atom(b, z.[:dm:]); + i++; + }; + b.append('}'); +} + +// works for container that have begin() and end() iterators +template <class Z> + requires(concepts::container_but_not_string<Z> && !require_custom_serialization<Z>) +void append(string_builder &b, const Z &z) { + auto it = z.begin(); + auto end = z.end(); + if (it == end) { + b.append_raw("[]"); + return; + } + b.append('['); + atom(b, *it); + ++it; + for (; it != end; ++it) { + b.append(','); + atom(b, *it); + } + b.append(']'); +} + +template <class Z> + requires (require_custom_serialization<Z>) +void append(string_builder &b, const Z &z) { + b.append(z); +} + + +template <class Z> +simdjson_warn_unused simdjson_result<std::string> to_json_string(const Z &z, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + string_builder b(initial_capacity); + append(b, z); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); +} + +template <class Z> +simdjson_warn_unused error_code to_json(const Z &z, std::string &s, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + string_builder b(initial_capacity); + append(b, z); + std::string_view view; + if(auto e = b.view().get(view); e) { return e; } + s.assign(view); + return SUCCESS; +} + +template <class Z> +string_builder& operator<<(string_builder& b, const Z& z) { + append(b, z); + return b; +} + +// extract_from: Serialize only specific fields from a struct to JSON +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +void extract_from(string_builder &b, const T &obj) { + // Helper to check if a field name matches any of the requested fields + auto should_extract = [](std::string_view field_name) constexpr -> bool { + return ((FieldNames.view() == field_name) || ...); + }; + + b.append('{'); + bool first = true; + + // Iterate through all members of T using reflection + template for (constexpr auto mem : std::define_static_array( + std::meta::nonstatic_data_members_of(^^T, std::meta::access_context::unchecked()))) { + + if constexpr (std::meta::is_public(mem)) { + constexpr std::string_view key = std::define_static_string(std::meta::identifier_of(mem)); + + // Only serialize this field if it's in our list of requested fields + if constexpr (should_extract(key)) { + if (!first) { + b.append(','); + } + first = false; + + // Serialize the key + constexpr auto quoted_key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(mem))); + b.append_raw(quoted_key); + b.append(':'); + + // Serialize the value + atom(b, obj.[:mem:]); + } + } + }; + + b.append('}'); +} + +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result<std::string> extract_from(const T &obj, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + string_builder b(initial_capacity); + extract_from<FieldNames...>(b, obj); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); +} + +} // namespace builder +} // namespace haswell +// Alias the function template to 'to' in the global namespace +template <class Z> +simdjson_warn_unused simdjson_result<std::string> to_json(const Z &z, size_t initial_capacity = haswell::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + haswell::builder::string_builder b(initial_capacity); + haswell::builder::append(b, z); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); +} +template <class Z> +simdjson_warn_unused error_code to_json(const Z &z, std::string &s, size_t initial_capacity = haswell::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + haswell::builder::string_builder b(initial_capacity); + haswell::builder::append(b, z); + std::string_view view; + if(auto e = b.view().get(view); e) { return e; } + s.assign(view); + return SUCCESS; +} +// Global namespace function for extract_from +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result<std::string> extract_from(const T &obj, size_t initial_capacity = haswell::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + haswell::builder::string_builder b(initial_capacity); + haswell::builder::extract_from<FieldNames...>(b, obj); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); +} + +} // namespace simdjson + +#endif // SIMDJSON_STATIC_REFLECTION + +#endif +/* end file simdjson/generic/builder/json_builder.h for haswell */ +/* including simdjson/generic/builder/fractured_json_builder.h for haswell: #include "simdjson/generic/builder/fractured_json_builder.h" */ +/* begin file simdjson/generic/builder/fractured_json_builder.h for haswell */ +#ifndef SIMDJSON_GENERIC_FRACTURED_JSON_BUILDER_H +#define SIMDJSON_GENERIC_FRACTURED_JSON_BUILDER_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_builder.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/dom/fractured_json.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#if SIMDJSON_STATIC_REFLECTION + +namespace simdjson { +namespace haswell { +namespace builder { + +/** + * Serialize an object to a FracturedJson-formatted string. + * + * FracturedJson produces human-readable yet compact JSON output by intelligently + * choosing between different layout strategies (inline, compact multiline, table, + * expanded) based on content complexity, length, and structure similarity. + * + * This function combines the builder's serialization with FracturedJson formatting: + * 1. Serializes the object to minified JSON using reflection + * 2. Parses and reformats using FracturedJson + * + * Example: + * struct User { int id; std::string name; bool active; }; + * User user{1, "Alice", true}; + * auto result = to_fractured_json_string(user); + * // result.value() == "{ \"id\": 1, \"name\": \"Alice\", \"active\": true }" + * + * @param obj The object to serialize (must be a reflectable type) + * @param opts FracturedJson formatting options + * @param initial_capacity Initial buffer capacity for serialization + * @return The formatted JSON string, or an error + */ +template <class T> +simdjson_warn_unused simdjson_result<std::string> to_fractured_json_string( + const T& obj, + const fractured_json_options& opts = {}, + size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + // Step 1: Serialize to minified JSON + std::string formatted; + auto error = to_json_string(obj, initial_capacity).get(formatted); + if (error) { + return error; + } + + // Step 2: Reformat with FracturedJson + return fractured_json_string(formatted, opts); +} + +/** + * Extract specific fields from an object and format with FracturedJson. + * + * Example: + * struct User { int id; std::string name; std::string email; bool active; }; + * User user{1, "Alice", "alice@example.com", true}; + * auto result = extract_fractured_json<"id", "name">(user); + * // result.value() == "{ \"id\": 1, \"name\": \"Alice\" }" + * + * @param obj The object to serialize + * @param opts FracturedJson formatting options + * @param initial_capacity Initial buffer capacity for serialization + * @return The formatted JSON string containing only the specified fields + */ +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result<std::string> extract_fractured_json( + const T& obj, + const fractured_json_options& opts = {}, + size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + // Step 1: Extract fields to minified JSON + std::string formatted; + auto error = extract_from<FieldNames...>(obj, initial_capacity).get(formatted); + if (error) { + return error; + } + + // Step 2: Reformat with FracturedJson + return fractured_json_string(formatted, opts); +} + +} // namespace builder +} // namespace haswell + +// Global namespace convenience functions + +/** + * Serialize an object to a FracturedJson-formatted string. + * Global namespace version for convenience. + */ +template <class T> +simdjson_warn_unused simdjson_result<std::string> to_fractured_json_string( + const T& obj, + const fractured_json_options& opts = {}, + size_t initial_capacity = haswell::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + return haswell::builder::to_fractured_json_string(obj, opts, initial_capacity); +} +/** + * Extract specific fields from an object and format with FracturedJson. + * Global namespace version for convenience. + */ +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result<std::string> extract_fractured_json( + const T& obj, + const fractured_json_options& opts = {}, + size_t initial_capacity = haswell::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + return haswell::builder::extract_fractured_json<FieldNames...>(obj, opts, initial_capacity); +} + +} // namespace simdjson + +#endif // SIMDJSON_STATIC_REFLECTION + +#endif // SIMDJSON_GENERIC_FRACTURED_JSON_BUILDER_H +/* end file simdjson/generic/builder/fractured_json_builder.h for haswell */ + + + +// JSON builder inline definitions +/* including simdjson/generic/builder/json_string_builder-inl.h for haswell: #include "simdjson/generic/builder/json_string_builder-inl.h" */ +/* begin file simdjson/generic/builder/json_string_builder-inl.h for haswell */ +#include <array> +#include <cstring> +#include <type_traits> +#ifndef SIMDJSON_GENERIC_STRING_BUILDER_INL_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_INL_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_string_builder.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +/* + * Empirically, we have found that an inlined optimization is important for + * performance. The following macros are not ideal. We should find a better + * way to inline the code. + */ + +#if defined(__SSE2__) || defined(__x86_64__) || defined(__x86_64) || \ + (defined(_M_AMD64) || defined(_M_X64) || \ + (defined(_M_IX86_FP) && _M_IX86_FP == 2)) +#ifndef SIMDJSON_EXPERIMENTAL_HAS_SSE2 +#define SIMDJSON_EXPERIMENTAL_HAS_SSE2 1 +#endif +#endif + +#if defined(__aarch64__) || defined(_M_ARM64) +#ifndef SIMDJSON_EXPERIMENTAL_HAS_NEON +#define SIMDJSON_EXPERIMENTAL_HAS_NEON 1 +#endif +#endif +#if defined(__loongarch_sx) +#ifndef SIMDJSON_EXPERIMENTAL_HAS_LSX +#define SIMDJSON_EXPERIMENTAL_HAS_LSX 1 +#endif +#endif +#if defined(__riscv_v_intrinsic) && __riscv_v_intrinsic >= 11000 && \ + defined(__riscv_vector) +#ifndef SIMDJSON_EXPERIMENTAL_HAS_RVV +#define SIMDJSON_EXPERIMENTAL_HAS_RVV 1 +#endif +#endif +#if (defined(__PPC64__) || defined(_M_PPC64)) && defined(__ALTIVEC__) +#ifndef SIMDJSON_EXPERIMENTAL_HAS_PPC64 +#define SIMDJSON_EXPERIMENTAL_HAS_PPC64 1 +#endif +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_NEON +#include <arm_neon.h> +#ifdef _MSC_VER +#include <intrin.h> +#endif +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_SSE2 +#include <emmintrin.h> +#ifdef _MSC_VER +#include <intrin.h> +#endif +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_LSX +#include <lsxintrin.h> +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_RVV +#include <riscv_vector.h> +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_PPC64 +#include <altivec.h> +#ifdef bool +#undef bool +#endif +#ifdef vector +#undef vector +#endif +#endif + + +namespace simdjson { +namespace haswell { +namespace builder { + +static SIMDJSON_CONSTEXPR_LAMBDA std::array<uint8_t, 256> + json_quotable_character = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + +/** + +A possible SWAR implementation of has_json_escapable_byte. It is not used +because it is slower than the current implementation. It is kept here for +reference (to show that we tried it). + +inline bool has_json_escapable_byte(uint64_t x) { + uint64_t is_ascii = 0x8080808080808080ULL & ~x; + uint64_t xor2 = x ^ 0x0202020202020202ULL; + uint64_t lt32_or_eq34 = xor2 - 0x2121212121212121ULL; + uint64_t sub92 = x ^ 0x5C5C5C5C5C5C5C5CULL; + uint64_t eq92 = (sub92 - 0x0101010101010101ULL); + return ((lt32_or_eq34 | eq92) & is_ascii) != 0; +} + +**/ + +SIMDJSON_CONSTEXPR_LAMBDA simdjson_inline bool +simple_needs_escaping(std::string_view v) { + for (char c : v) { + // a table lookup is faster than a series of comparisons + if (json_quotable_character[static_cast<uint8_t>(c)]) { + return true; + } + } + return false; +} + +#if SIMDJSON_EXPERIMENTAL_HAS_NEON +simdjson_inline bool fast_needs_escaping(std::string_view view) { + if (view.size() < 16) { + return simple_needs_escaping(view); + } + size_t i = 0; + uint8x16_t running = vdupq_n_u8(0); + uint8x16_t v34 = vdupq_n_u8(34); + uint8x16_t v92 = vdupq_n_u8(92); + + for (; i + 15 < view.size(); i += 16) { + uint8x16_t word = vld1q_u8((const uint8_t *)view.data() + i); + running = vorrq_u8(running, vceqq_u8(word, v34)); + running = vorrq_u8(running, vceqq_u8(word, v92)); + running = vorrq_u8(running, vcltq_u8(word, vdupq_n_u8(32))); + } + if (i < view.size()) { + uint8x16_t word = + vld1q_u8((const uint8_t *)view.data() + view.length() - 16); + running = vorrq_u8(running, vceqq_u8(word, v34)); + running = vorrq_u8(running, vceqq_u8(word, v92)); + running = vorrq_u8(running, vcltq_u8(word, vdupq_n_u8(32))); + } + return vmaxvq_u32(vreinterpretq_u32_u8(running)) != 0; +} +#elif SIMDJSON_EXPERIMENTAL_HAS_SSE2 +simdjson_inline bool fast_needs_escaping(std::string_view view) { + if (view.size() < 16) { + return simple_needs_escaping(view); + } + size_t i = 0; + __m128i running = _mm_setzero_si128(); + for (; i + 15 < view.size(); i += 16) { + + __m128i word = + _mm_loadu_si128(reinterpret_cast<const __m128i *>(view.data() + i)); + running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(34))); + running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(92))); + running = _mm_or_si128( + running, _mm_cmpeq_epi8(_mm_subs_epu8(word, _mm_set1_epi8(31)), + _mm_setzero_si128())); + } + if (i < view.size()) { + __m128i word = _mm_loadu_si128( + reinterpret_cast<const __m128i *>(view.data() + view.length() - 16)); + running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(34))); + running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(92))); + running = _mm_or_si128( + running, _mm_cmpeq_epi8(_mm_subs_epu8(word, _mm_set1_epi8(31)), + _mm_setzero_si128())); + } + return _mm_movemask_epi8(running) != 0; +} +#elif SIMDJSON_EXPERIMENTAL_HAS_PPC64 +simdjson_inline bool fast_needs_escaping(std::string_view view) { + if (view.size() < 16) { + return simple_needs_escaping(view); + } + size_t i = 0; + __vector unsigned char running = vec_splats((unsigned char)0); + __vector unsigned char v34 = vec_splats((unsigned char)34); + __vector unsigned char v92 = vec_splats((unsigned char)92); + __vector unsigned char v32 = vec_splats((unsigned char)32); + + for (; i + 15 < view.size(); i += 16) { + __vector unsigned char word = + vec_vsx_ld(0, reinterpret_cast<const unsigned char *>(view.data() + i)); + running = vec_or(running, (__vector unsigned char)vec_cmpeq(word, v34)); + running = vec_or(running, (__vector unsigned char)vec_cmpeq(word, v92)); + running = vec_or(running, + (__vector unsigned char)vec_cmplt(word, v32)); + } + if (i < view.size()) { + __vector unsigned char word = vec_vsx_ld( + 0, reinterpret_cast<const unsigned char *>(view.data() + view.length() - 16)); + running = vec_or(running, (__vector unsigned char)vec_cmpeq(word, v34)); + running = vec_or(running, (__vector unsigned char)vec_cmpeq(word, v92)); + running = vec_or(running, + (__vector unsigned char)vec_cmplt(word, v32)); + } + return !vec_all_eq(running, vec_splats((unsigned char)0)); +} +#else +simdjson_inline bool fast_needs_escaping(std::string_view view) { + return simple_needs_escaping(view); +} +#endif + +// Scalar fallback for finding next quotable character +SIMDJSON_CONSTEXPR_LAMBDA simdjson_inline size_t +find_next_json_quotable_character_scalar(const std::string_view view, + size_t location) noexcept { + for (auto pos = view.begin() + location; pos != view.end(); ++pos) { + if (json_quotable_character[static_cast<uint8_t>(*pos)]) { + return pos - view.begin(); + } + } + return size_t(view.size()); +} + +// SIMD-accelerated position finding that directly locates the first quotable +// character, combining detection and position extraction in a single pass to +// minimize redundant work. +#if SIMDJSON_EXPERIMENTAL_HAS_NEON +simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + const size_t len = view.size(); + const uint8_t *ptr = + reinterpret_cast<const uint8_t *>(view.data()) + location; + size_t remaining = len - location; + + // SIMD constants for characters requiring escape + uint8x16_t v34 = vdupq_n_u8(34); // '"' + uint8x16_t v92 = vdupq_n_u8(92); // '\\' + uint8x16_t v32 = vdupq_n_u8(32); // control char threshold + + while (remaining >= 16) { + uint8x16_t word = vld1q_u8(ptr); + + // Check for quotable characters: '"', '\\', or control chars (< 32) + uint8x16_t needs_escape = vceqq_u8(word, v34); + needs_escape = vorrq_u8(needs_escape, vceqq_u8(word, v92)); + needs_escape = vorrq_u8(needs_escape, vcltq_u8(word, v32)); + + const uint8x8_t res = vshrn_n_u16(vreinterpretq_u16_u8(needs_escape), 4); + const uint64_t mask = vget_lane_u64(vreinterpret_u64_u8(res), 0); + if(mask != 0) { + size_t offset = ptr - reinterpret_cast<const uint8_t *>(view.data()); + auto trailing_zero = trailing_zeroes(mask); + return offset + (trailing_zero >> 2); + } + ptr += 16; + remaining -= 16; + } + + // Scalar fallback for remaining bytes + size_t current = len - remaining; + return find_next_json_quotable_character_scalar(view, current); +} +#elif SIMDJSON_EXPERIMENTAL_HAS_SSE2 +simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + const size_t len = view.size(); + const uint8_t *ptr = + reinterpret_cast<const uint8_t *>(view.data()) + location; + size_t remaining = len - location; + + // SIMD constants + __m128i v34 = _mm_set1_epi8(34); // '"' + __m128i v92 = _mm_set1_epi8(92); // '\\' + __m128i v31 = _mm_set1_epi8(31); // for control char detection + + while (remaining >= 16) { + __m128i word = _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr)); + + // Check for quotable characters + __m128i needs_escape = _mm_cmpeq_epi8(word, v34); + needs_escape = _mm_or_si128(needs_escape, _mm_cmpeq_epi8(word, v92)); + needs_escape = _mm_or_si128( + needs_escape, + _mm_cmpeq_epi8(_mm_subs_epu8(word, v31), _mm_setzero_si128())); + + int mask = _mm_movemask_epi8(needs_escape); + if (mask != 0) { + // Found quotable character - use trailing zero count to find position + size_t offset = ptr - reinterpret_cast<const uint8_t *>(view.data()); + return offset + trailing_zeroes(mask); + } + ptr += 16; + remaining -= 16; + } + + // Scalar fallback for remaining bytes + size_t current = len - remaining; + return find_next_json_quotable_character_scalar(view, current); +} +#elif SIMDJSON_EXPERIMENTAL_HAS_LSX +simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + const size_t len = view.size(); + const uint8_t *ptr = + reinterpret_cast<const uint8_t *>(view.data()) + location; + size_t remaining = len - location; + + //SIMD constants for characters requiring escape + __m128i v34 = __lsx_vreplgr2vr_b(34); // '"' + __m128i v92 = __lsx_vreplgr2vr_b(92); // '\\' + __m128i v32 = __lsx_vreplgr2vr_b(32); // control char threshold + + while (remaining >= 16){ + __m128i word = __lsx_vld(ptr, 0); + + //Check for the quotable characters: '"', '\\', or control char (<32) + __m128i needs_escape = __lsx_vseq_b(word, v34); + needs_escape = __lsx_vor_v(needs_escape, __lsx_vseq_b(word, v92)); + needs_escape = __lsx_vor_v(needs_escape, __lsx_vslt_bu(word, v32)); + + if (!__lsx_bz_v(needs_escape)){ + + //Found quotable character - extract exact byte position + uint64_t lo = __lsx_vpickve2gr_du(needs_escape,0); + uint64_t hi = __lsx_vpickve2gr_du(needs_escape,1); + size_t offset = ptr - reinterpret_cast<const uint8_t *>(view.data()); + if ( lo != 0) { + return offset + trailing_zeroes(lo) / 8; + } else { + return offset + 8 + trailing_zeroes(hi) / 8; + } + } + ptr += 16; + remaining -= 16; + } + size_t current = len - remaining; + return find_next_json_quotable_character_scalar(view, current); +} +#elif SIMDJSON_EXPERIMENTAL_HAS_RVV +simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + const size_t len = view.size(); + const uint8_t *ptr = + reinterpret_cast<const uint8_t *>(view.data()) + location; + size_t remaining = len - location; + + while (remaining > 0) { + size_t vl = __riscv_vsetvl_e8m1(remaining); + vuint8m1_t word = __riscv_vle8_v_u8m1(ptr, vl); + + // Check for quotable characters: '"', '\\', or control chars (< 32) + vbool8_t needs_escape = __riscv_vmseq(word, (uint8_t)34, vl); + needs_escape = __riscv_vmor(needs_escape, + __riscv_vmseq(word, (uint8_t)92, vl), vl); + needs_escape = __riscv_vmor(needs_escape, + __riscv_vmsltu(word, (uint8_t)32, vl), vl); + + long first = __riscv_vfirst(needs_escape, vl); + if (first >= 0) { + size_t offset = ptr - reinterpret_cast<const uint8_t *>(view.data()); + return offset + first; + } + ptr += vl; + remaining -= vl; + } + + return len; +} +#elif SIMDJSON_EXPERIMENTAL_HAS_PPC64 +simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + const size_t len = view.size(); + const uint8_t *ptr = + reinterpret_cast<const uint8_t *>(view.data()) + location; + size_t remaining = len - location; + + // SIMD constants for characters requiring escape + __vector unsigned char v34 = vec_splats((unsigned char)34); // '"' + __vector unsigned char v92 = vec_splats((unsigned char)92); // '\\' + __vector unsigned char v32 = vec_splats((unsigned char)32); // control char threshold + + // Bitmask for vec_vbpermq to extract one bit per byte + const __vector unsigned char perm_mask = {0x78, 0x70, 0x68, 0x60, 0x58, 0x50, + 0x48, 0x40, 0x38, 0x30, 0x28, 0x20, + 0x18, 0x10, 0x08, 0x00}; + + while (remaining >= 16) { + __vector unsigned char word = + vec_vsx_ld(0, reinterpret_cast<const unsigned char *>(ptr)); + + // Check for quotable characters: '"', '\\', or control chars (< 32) + __vector unsigned char needs_escape = + (__vector unsigned char)vec_cmpeq(word, v34); + needs_escape = vec_or(needs_escape, + (__vector unsigned char)vec_cmpeq(word, v92)); + needs_escape = vec_or(needs_escape, + (__vector unsigned char)vec_cmplt(word, v32)); + + __vector unsigned long long result = + (__vector unsigned long long)vec_vbpermq(needs_escape, perm_mask); +#ifdef __LITTLE_ENDIAN__ + unsigned int mask = static_cast<unsigned int>(result[1]); +#else + unsigned int mask = static_cast<unsigned int>(result[0]); +#endif + if (mask != 0) { + size_t offset = ptr - reinterpret_cast<const uint8_t *>(view.data()); + return offset + __builtin_ctz(mask); + } + ptr += 16; + remaining -= 16; + } + + // Scalar fallback for remaining bytes + size_t current = len - remaining; + return find_next_json_quotable_character_scalar(view, current); +} +#else +SIMDJSON_CONSTEXPR_LAMBDA simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + return find_next_json_quotable_character_scalar(view, location); +} +#endif + +SIMDJSON_CONSTEXPR_LAMBDA static std::string_view control_chars[] = { + "\\u0000", "\\u0001", "\\u0002", "\\u0003", "\\u0004", "\\u0005", "\\u0006", + "\\u0007", "\\b", "\\t", "\\n", "\\u000b", "\\f", "\\r", + "\\u000e", "\\u000f", "\\u0010", "\\u0011", "\\u0012", "\\u0013", "\\u0014", + "\\u0015", "\\u0016", "\\u0017", "\\u0018", "\\u0019", "\\u001a", "\\u001b", + "\\u001c", "\\u001d", "\\u001e", "\\u001f"}; + +// All Unicode characters may be placed within the quotation marks, except for +// the characters that MUST be escaped: quotation mark, reverse solidus, and the +// control characters (U+0000 through U+001F). There are two-character sequence +// escape representations of some popular characters: +// \", \\, \b, \f, \n, \r, \t. +SIMDJSON_CONSTEXPR_LAMBDA simdjson_inline void escape_json_char(char c, char *&out) { + if (c == '"') { + memcpy(out, "\\\"", 2); + out += 2; + } else if (c == '\\') { + memcpy(out, "\\\\", 2); + out += 2; + } else { + std::string_view v = control_chars[uint8_t(c)]; + memcpy(out, v.data(), v.size()); + out += v.size(); + } +} + +// Writes the escaped version of input to out, returning the number of bytes +// written. Uses SIMD position finding to locate quotable characters efficiently. +inline size_t write_string_escaped(const std::string_view input, char *out) { + size_t mysize = input.size(); + + // Use SIMD position finder directly - it returns mysize if no escape needed + size_t location = find_next_json_quotable_character(input, 0); + if (location == mysize) { + // Fast path: no escaping needed + memcpy(out, input.data(), input.size()); + return input.size(); + } + + const char *const initout = out; + memcpy(out, input.data(), location); + out += location; + escape_json_char(input[location], out); + location += 1; + while (location < mysize) { + size_t newlocation = find_next_json_quotable_character(input, location); + memcpy(out, input.data() + location, newlocation - location); + out += newlocation - location; + location = newlocation; + if (location == mysize) { + break; + } + escape_json_char(input[location], out); + location += 1; + } + return out - initout; +} + +simdjson_inline string_builder::string_builder(size_t initial_capacity) + : buffer(new(std::nothrow) char[initial_capacity]), position(0), + capacity(buffer.get() != nullptr ? initial_capacity : 0), + is_valid(buffer.get() != nullptr) {} + +simdjson_inline bool string_builder::capacity_check(size_t upcoming_bytes) { + // We use the convention that when is_valid is false, then the capacity and + // the position are 0. + // Most of the time, this function will return true. + if (simdjson_likely(upcoming_bytes <= capacity - position)) { + return true; + } + // check for overflow, most of the time there is no overflow + if (simdjson_unlikely(position + upcoming_bytes < position)) { + return false; + } + // We will rarely get here. + grow_buffer((std::max)(capacity * 2, position + upcoming_bytes)); + // If the buffer allocation failed, we set is_valid to false. + return is_valid; +} + +simdjson_inline void string_builder::grow_buffer(size_t desired_capacity) { + if (!is_valid) { + return; + } + std::unique_ptr<char[]> new_buffer(new (std::nothrow) char[desired_capacity]); + if (new_buffer.get() == nullptr) { + set_valid(false); + return; + } + std::memcpy(new_buffer.get(), buffer.get(), position); + buffer.swap(new_buffer); + capacity = desired_capacity; +} + +simdjson_inline void string_builder::set_valid(bool valid) noexcept { + if (!valid) { + is_valid = false; + capacity = 0; + position = 0; + buffer.reset(); + } else { + is_valid = true; + } +} + +simdjson_inline size_t string_builder::size() const noexcept { + return position; +} + +simdjson_inline void string_builder::append(char c) noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = c; + } +} + +simdjson_inline void string_builder::append_null() noexcept { + constexpr char null_literal[] = "null"; + constexpr size_t null_len = sizeof(null_literal) - 1; + if (capacity_check(null_len)) { + std::memcpy(buffer.get() + position, null_literal, null_len); + position += null_len; + } +} + +simdjson_inline void string_builder::clear() noexcept { + position = 0; + // if it was invalid, we should try to repair it + if (!is_valid) { + capacity = 0; + buffer.reset(); + is_valid = true; + } +} + +namespace internal { + +template <typename number_type, typename = typename std::enable_if< + std::is_unsigned<number_type>::value>::type> +simdjson_really_inline int int_log2(number_type x) { + return 63 - leading_zeroes(uint64_t(x) | 1); +} + +simdjson_really_inline int fast_digit_count_32(uint32_t x) { + static uint64_t table[] = { + 4294967296, 8589934582, 8589934582, 8589934582, 12884901788, + 12884901788, 12884901788, 17179868184, 17179868184, 17179868184, + 21474826480, 21474826480, 21474826480, 21474826480, 25769703776, + 25769703776, 25769703776, 30063771072, 30063771072, 30063771072, + 34349738368, 34349738368, 34349738368, 34349738368, 38554705664, + 38554705664, 38554705664, 41949672960, 41949672960, 41949672960, + 42949672960, 42949672960}; + return uint32_t((x + table[int_log2(x)]) >> 32); +} + +simdjson_really_inline int fast_digit_count_64(uint64_t x) { + static uint64_t table[] = {9, + 99, + 999, + 9999, + 99999, + 999999, + 9999999, + 99999999, + 999999999, + 9999999999, + 99999999999, + 999999999999, + 9999999999999, + 99999999999999, + 999999999999999ULL, + 9999999999999999ULL, + 99999999999999999ULL, + 999999999999999999ULL, + 9999999999999999999ULL}; + int y = (19 * int_log2(x) >> 6); + y += x > table[y]; + return y + 1; +} + +template <typename number_type, typename = typename std::enable_if< + std::is_unsigned<number_type>::value>::type> +simdjson_really_inline size_t digit_count(number_type v) noexcept { + static_assert(sizeof(number_type) == 8 || sizeof(number_type) == 4 || + sizeof(number_type) == 2 || sizeof(number_type) == 1, + "We only support 8-bit, 16-bit, 32-bit and 64-bit numbers"); + SIMDJSON_IF_CONSTEXPR(sizeof(number_type) <= 4) { + return fast_digit_count_32(static_cast<uint32_t>(v)); + } + else { + return fast_digit_count_64(static_cast<uint64_t>(v)); + } +} +static const char decimal_table[200] = { + 0x30, 0x30, 0x30, 0x31, 0x30, 0x32, 0x30, 0x33, 0x30, 0x34, 0x30, 0x35, + 0x30, 0x36, 0x30, 0x37, 0x30, 0x38, 0x30, 0x39, 0x31, 0x30, 0x31, 0x31, + 0x31, 0x32, 0x31, 0x33, 0x31, 0x34, 0x31, 0x35, 0x31, 0x36, 0x31, 0x37, + 0x31, 0x38, 0x31, 0x39, 0x32, 0x30, 0x32, 0x31, 0x32, 0x32, 0x32, 0x33, + 0x32, 0x34, 0x32, 0x35, 0x32, 0x36, 0x32, 0x37, 0x32, 0x38, 0x32, 0x39, + 0x33, 0x30, 0x33, 0x31, 0x33, 0x32, 0x33, 0x33, 0x33, 0x34, 0x33, 0x35, + 0x33, 0x36, 0x33, 0x37, 0x33, 0x38, 0x33, 0x39, 0x34, 0x30, 0x34, 0x31, + 0x34, 0x32, 0x34, 0x33, 0x34, 0x34, 0x34, 0x35, 0x34, 0x36, 0x34, 0x37, + 0x34, 0x38, 0x34, 0x39, 0x35, 0x30, 0x35, 0x31, 0x35, 0x32, 0x35, 0x33, + 0x35, 0x34, 0x35, 0x35, 0x35, 0x36, 0x35, 0x37, 0x35, 0x38, 0x35, 0x39, + 0x36, 0x30, 0x36, 0x31, 0x36, 0x32, 0x36, 0x33, 0x36, 0x34, 0x36, 0x35, + 0x36, 0x36, 0x36, 0x37, 0x36, 0x38, 0x36, 0x39, 0x37, 0x30, 0x37, 0x31, + 0x37, 0x32, 0x37, 0x33, 0x37, 0x34, 0x37, 0x35, 0x37, 0x36, 0x37, 0x37, + 0x37, 0x38, 0x37, 0x39, 0x38, 0x30, 0x38, 0x31, 0x38, 0x32, 0x38, 0x33, + 0x38, 0x34, 0x38, 0x35, 0x38, 0x36, 0x38, 0x37, 0x38, 0x38, 0x38, 0x39, + 0x39, 0x30, 0x39, 0x31, 0x39, 0x32, 0x39, 0x33, 0x39, 0x34, 0x39, 0x35, + 0x39, 0x36, 0x39, 0x37, 0x39, 0x38, 0x39, 0x39, +}; +} // namespace internal + +template <typename number_type, typename> +simdjson_inline void string_builder::append(number_type v) noexcept { + static_assert(std::is_same<number_type, bool>::value || + std::is_integral<number_type>::value || + std::is_floating_point<number_type>::value, + "Unsupported number type"); + // If C++17 is available, we can 'if constexpr' here. + SIMDJSON_IF_CONSTEXPR(std::is_same<number_type, bool>::value) { + if (v) { + constexpr char true_literal[] = "true"; + constexpr size_t true_len = sizeof(true_literal) - 1; + if (capacity_check(true_len)) { + std::memcpy(buffer.get() + position, true_literal, true_len); + position += true_len; + } + } else { + constexpr char false_literal[] = "false"; + constexpr size_t false_len = sizeof(false_literal) - 1; + if (capacity_check(false_len)) { + std::memcpy(buffer.get() + position, false_literal, false_len); + position += false_len; + } + } + } + else SIMDJSON_IF_CONSTEXPR(std::is_unsigned<number_type>::value) { + // Process 4 digits at a time instead of 2, reducing store operations + // and divisions by approximately half for large numbers. + constexpr size_t max_number_size = 20; + if (capacity_check(max_number_size)) { + using unsigned_type = typename std::make_unsigned<number_type>::type; + unsigned_type pv = static_cast<unsigned_type>(v); + size_t dc = internal::digit_count(pv); + char *write_pointer = buffer.get() + position + dc - 1; + + // Process 4 digits per iteration for large numbers + while (pv >= 10000) { + unsigned_type q = pv / 10000; + unsigned_type r = pv % 10000; + unsigned_type r_hi = r / 100; // High 2 digits of remainder + unsigned_type r_lo = r % 100; // Low 2 digits of remainder + // Write low 2 digits first (rightmost), then high 2 digits + memcpy(write_pointer - 1, &internal::decimal_table[r_lo * 2], 2); + memcpy(write_pointer - 3, &internal::decimal_table[r_hi * 2], 2); + write_pointer -= 4; + pv = q; + } + + // Handle remaining 1-4 digits with original 2-digit loop + while (pv >= 100) { + memcpy(write_pointer - 1, &internal::decimal_table[(pv % 100) * 2], 2); + write_pointer -= 2; + pv /= 100; + } + if (pv >= 10) { + *write_pointer-- = char('0' + (pv % 10)); + pv /= 10; + } + *write_pointer = char('0' + pv); + position += dc; + } + } + else SIMDJSON_IF_CONSTEXPR(std::is_integral<number_type>::value) { + // Same 4-digit batching as unsigned path for signed integers + constexpr size_t max_number_size = 20; + if (capacity_check(max_number_size)) { + using unsigned_type = typename std::make_unsigned<number_type>::type; + bool negative = v < 0; + unsigned_type pv = static_cast<unsigned_type>(v); + if (negative) { + pv = 0 - pv; // the 0 is for Microsoft + } + size_t dc = internal::digit_count(pv); + // by always writing the minus sign, we avoid the branch. + buffer.get()[position] = '-'; + position += negative ? 1 : 0; + char *write_pointer = buffer.get() + position + dc - 1; + + // Process 4 digits per iteration for large numbers + while (pv >= 10000) { + unsigned_type q = pv / 10000; + unsigned_type r = pv % 10000; + unsigned_type r_hi = r / 100; + unsigned_type r_lo = r % 100; + memcpy(write_pointer - 1, &internal::decimal_table[r_lo * 2], 2); + memcpy(write_pointer - 3, &internal::decimal_table[r_hi * 2], 2); + write_pointer -= 4; + pv = q; + } + + // Handle remaining 1-4 digits + while (pv >= 100) { + memcpy(write_pointer - 1, &internal::decimal_table[(pv % 100) * 2], 2); + write_pointer -= 2; + pv /= 100; + } + if (pv >= 10) { + *write_pointer-- = char('0' + (pv % 10)); + pv /= 10; + } + *write_pointer = char('0' + pv); + position += dc; + } + } + else SIMDJSON_IF_CONSTEXPR(std::is_floating_point<number_type>::value) { + constexpr size_t max_number_size = 24; + if (capacity_check(max_number_size)) { + // We could specialize for float. + char *end = simdjson::internal::to_chars(buffer.get() + position, nullptr, + double(v)); + position = end - buffer.get(); + } + } +} + +simdjson_inline void +string_builder::escape_and_append(std::string_view input) noexcept { + // escaping might turn a control character into \x00xx so 6 characters. + if (capacity_check(6 * input.size())) { + position += write_string_escaped(input, buffer.get() + position); + } +} + +simdjson_inline void +string_builder::escape_and_append_with_quotes(std::string_view input) noexcept { + // escaping might turn a control character into \x00xx so 6 characters. + if (capacity_check(2 + 6 * input.size())) { + buffer.get()[position++] = '"'; + position += write_string_escaped(input, buffer.get() + position); + buffer.get()[position++] = '"'; + } +} + +simdjson_inline void +string_builder::escape_and_append_with_quotes(char input) noexcept { + // escaping might turn a control character into \x00xx so 6 characters. + if (capacity_check(2 + 6 * 1)) { + buffer.get()[position++] = '"'; + std::string_view cinput(&input, 1); + position += write_string_escaped(cinput, buffer.get() + position); + buffer.get()[position++] = '"'; + } +} + +simdjson_inline void +string_builder::escape_and_append_with_quotes(const char *input) noexcept { + std::string_view cinput(input); + escape_and_append_with_quotes(cinput); +} +#if SIMDJSON_SUPPORTS_CONCEPTS +template <constevalutil::fixed_string key> +simdjson_inline void string_builder::escape_and_append_with_quotes() noexcept { + escape_and_append_with_quotes(constevalutil::string_constant<key>::value); +} +#endif + +simdjson_inline void string_builder::append_raw(const char *c) noexcept { + size_t len = std::strlen(c); + append_raw(c, len); +} + +simdjson_inline void +string_builder::append_raw(std::string_view input) noexcept { + if (capacity_check(input.size())) { + std::memcpy(buffer.get() + position, input.data(), input.size()); + position += input.size(); + } +} + +simdjson_inline void string_builder::append_raw(const char *str, + size_t len) noexcept { + if (capacity_check(len)) { + std::memcpy(buffer.get() + position, str, len); + position += len; + } +} +#if SIMDJSON_SUPPORTS_CONCEPTS +// Support for optional types (std::optional, etc.) +template <concepts::optional_type T> + requires(!require_custom_serialization<T>) +simdjson_inline void string_builder::append(const T &opt) { + if (opt) { + append(*opt); + } else { + append_null(); + } +} + +template <typename T> + requires(require_custom_serialization<T>) +simdjson_inline void string_builder::append(T &&val) { + serialize(*this, std::forward<T>(val)); +} + +template <typename T> + requires(std::is_convertible<T, std::string_view>::value || + std::is_same<T, const char *>::value) +simdjson_inline void string_builder::append(const T &value) { + escape_and_append_with_quotes(value); +} +#endif + +#if SIMDJSON_SUPPORTS_RANGES && SIMDJSON_SUPPORTS_CONCEPTS +// Support for range-based appending (std::ranges::view, etc.) +template <std::ranges::range R> + requires(!std::is_convertible<R, std::string_view>::value && !require_custom_serialization<R>) +simdjson_inline void string_builder::append(const R &range) noexcept { + auto it = std::ranges::begin(range); + auto end = std::ranges::end(range); + if constexpr (concepts::is_pair<std::ranges::range_value_t<R>>) { + start_object(); + + if (it == end) { + end_object(); + return; // Handle empty range + } + // Append first item without leading comma + append_key_value(it->first, it->second); + ++it; + + // Append remaining items with preceding commas + for (; it != end; ++it) { + append_comma(); + append_key_value(it->first, it->second); + } + end_object(); + } else { + start_array(); + if (it == end) { + end_array(); + return; // Handle empty range + } + + // Append first item without leading comma + append(*it); + ++it; + + // Append remaining items with preceding commas + for (; it != end; ++it) { + append_comma(); + append(*it); + } + end_array(); + } +} + +#endif + +#if SIMDJSON_EXCEPTIONS +simdjson_inline string_builder::operator std::string() const noexcept(false) { + return std::string(operator std::string_view()); +} + +simdjson_inline string_builder::operator std::string_view() const + noexcept(false) simdjson_lifetime_bound { + return view(); +} +#endif + +simdjson_inline simdjson_result<std::string_view> +string_builder::view() const noexcept { + if (!is_valid) { + return simdjson::OUT_OF_CAPACITY; + } + return std::string_view(buffer.get(), position); +} + +simdjson_inline simdjson_result<const char *> string_builder::c_str() noexcept { + if (capacity_check(1)) { + buffer.get()[position] = '\0'; + return buffer.get(); + } + return simdjson::OUT_OF_CAPACITY; +} + +simdjson_inline bool string_builder::validate_unicode() const noexcept { + return simdjson::validate_utf8(buffer.get(), position); +} + +simdjson_inline void string_builder::start_object() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '{'; + } +} + +simdjson_inline void string_builder::end_object() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '}'; + } +} + +simdjson_inline void string_builder::start_array() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '['; + } +} + +simdjson_inline void string_builder::end_array() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ']'; + } +} + +simdjson_inline void string_builder::append_comma() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ','; + } +} + +simdjson_inline void string_builder::append_colon() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ':'; + } +} + +template <typename key_type, typename value_type> +simdjson_inline void +string_builder::append_key_value(key_type key, value_type value) noexcept { + static_assert(std::is_same<key_type, const char *>::value || + std::is_convertible<key_type, std::string_view>::value, + "Unsupported key type"); + escape_and_append_with_quotes(key); + append_colon(); + SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, std::nullptr_t>::value) { + append_null(); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, char>::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR( + std::is_convertible<value_type, std::string_view>::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, const char *>::value) { + escape_and_append_with_quotes(value); + } + else { + append(value); + } +} + +#if SIMDJSON_SUPPORTS_CONCEPTS +template <constevalutil::fixed_string key, typename value_type> +simdjson_inline void +string_builder::append_key_value(value_type value) noexcept { + escape_and_append_with_quotes<key>(); + append_colon(); + SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, std::nullptr_t>::value) { + append_null(); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, char>::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR( + std::is_convertible<value_type, std::string_view>::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, const char *>::value) { + escape_and_append_with_quotes(value); + } + else { + append(value); + } +} +#endif + +} // namespace builder +} // namespace haswell +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_STRING_BUILDER_INL_H +/* end file simdjson/generic/builder/json_string_builder-inl.h for haswell */ + +/* end file simdjson/generic/builder/amalgamated.h for haswell */ +/* including simdjson/haswell/end.h: #include "simdjson/haswell/end.h" */ +/* begin file simdjson/haswell/end.h */ +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#if !SIMDJSON_CAN_ALWAYS_RUN_HASWELL +SIMDJSON_UNTARGET_REGION +#endif + +/* undefining SIMDJSON_IMPLEMENTATION from "haswell" */ +#undef SIMDJSON_IMPLEMENTATION +/* end file simdjson/haswell/end.h */ + +#endif // SIMDJSON_HASWELL_BUILDER_H +/* end file simdjson/haswell/builder.h */ +#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(icelake) +/* including simdjson/icelake/builder.h: #include "simdjson/icelake/builder.h" */ +/* begin file simdjson/icelake/builder.h */ +#ifndef SIMDJSON_ICELAKE_BUILDER_H +#define SIMDJSON_ICELAKE_BUILDER_H + +/* including simdjson/icelake/begin.h: #include "simdjson/icelake/begin.h" */ +/* begin file simdjson/icelake/begin.h */ +/* defining SIMDJSON_IMPLEMENTATION to "icelake" */ +#define SIMDJSON_IMPLEMENTATION icelake +/* including simdjson/icelake/base.h: #include "simdjson/icelake/base.h" */ +/* begin file simdjson/icelake/base.h */ +#ifndef SIMDJSON_ICELAKE_BASE_H +#define SIMDJSON_ICELAKE_BASE_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +// The constructor may be executed on any host, so we take care not to use SIMDJSON_TARGET_ICELAKE +namespace simdjson { +/** + * Implementation for Icelake (Intel AVX512). + */ +namespace icelake { + +class implementation; + +} // namespace icelake +} // namespace simdjson + +#endif // SIMDJSON_ICELAKE_BASE_H +/* end file simdjson/icelake/base.h */ +/* including simdjson/icelake/intrinsics.h: #include "simdjson/icelake/intrinsics.h" */ +/* begin file simdjson/icelake/intrinsics.h */ +#ifndef SIMDJSON_ICELAKE_INTRINSICS_H +#define SIMDJSON_ICELAKE_INTRINSICS_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#if SIMDJSON_VISUAL_STUDIO +// under clang within visual studio, this will include <x86intrin.h> +#include <intrin.h> // visual studio or clang +#else +#include <x86intrin.h> // elsewhere +#endif // SIMDJSON_VISUAL_STUDIO + +#if SIMDJSON_CLANG_VISUAL_STUDIO +/** + * You are not supposed, normally, to include these + * headers directly. Instead you should either include intrin.h + * or x86intrin.h. However, when compiling with clang + * under Windows (i.e., when _MSC_VER is set), these headers + * only get included *if* the corresponding features are detected + * from macros: + * e.g., if __AVX2__ is set... in turn, we normally set these + * macros by compiling against the corresponding architecture + * (e.g., arch:AVX2, -mavx2, etc.) which compiles the whole + * software with these advanced instructions. In simdjson, we + * want to compile the whole program for a generic target, + * and only target our specific kernels. As a workaround, + * we directly include the needed headers. These headers would + * normally guard against such usage, but we carefully included + * <x86intrin.h> (or <intrin.h>) before, so the headers + * are fooled. + */ +#include <bmiintrin.h> // for _blsr_u64 +#include <lzcntintrin.h> // for __lzcnt64 +#include <immintrin.h> // for most things (AVX2, AVX512, _popcnt64) +#include <smmintrin.h> +#include <tmmintrin.h> +#include <avxintrin.h> +#include <avx2intrin.h> +#include <wmmintrin.h> // for _mm_clmulepi64_si128 +// Important: we need the AVX-512 headers: +#include <avx512fintrin.h> +#include <avx512dqintrin.h> +#include <avx512cdintrin.h> +#include <avx512bwintrin.h> +#include <avx512vlintrin.h> +#include <avx512vbmiintrin.h> +#include <avx512vbmi2intrin.h> +// unfortunately, we may not get _blsr_u64, but, thankfully, clang +// has it as a macro. +#ifndef _blsr_u64 +// we roll our own +#define _blsr_u64(n) ((n - 1) & n) +#endif // _blsr_u64 +#endif // SIMDJSON_CLANG_VISUAL_STUDIO + +static_assert(sizeof(__m512i) <= simdjson::SIMDJSON_PADDING, "insufficient padding for icelake"); + +#endif // SIMDJSON_ICELAKE_INTRINSICS_H +/* end file simdjson/icelake/intrinsics.h */ + +#if !SIMDJSON_CAN_ALWAYS_RUN_ICELAKE +SIMDJSON_TARGET_REGION("avx512f,avx512dq,avx512cd,avx512bw,avx512vbmi,avx512vbmi2,avx512vl,avx2,bmi,pclmul,lzcnt,popcnt") +#endif + +/* including simdjson/icelake/bitmanipulation.h: #include "simdjson/icelake/bitmanipulation.h" */ +/* begin file simdjson/icelake/bitmanipulation.h */ +#ifndef SIMDJSON_ICELAKE_BITMANIPULATION_H +#define SIMDJSON_ICELAKE_BITMANIPULATION_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/icelake/intrinsics.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace icelake { +namespace { + +// We sometimes call trailing_zero on inputs that are zero, +// but the algorithms do not end up using the returned value. +// Sadly, sanitizers are not smart enough to figure it out. +SIMDJSON_NO_SANITIZE_UNDEFINED +// This function can be used safely even if not all bytes have been +// initialized. +// See issue https://github.com/simdjson/simdjson/issues/1965 +SIMDJSON_NO_SANITIZE_MEMORY +simdjson_inline int trailing_zeroes(uint64_t input_num) { +#if SIMDJSON_REGULAR_VISUAL_STUDIO + return (int)_tzcnt_u64(input_num); +#else // SIMDJSON_REGULAR_VISUAL_STUDIO + //////// + // You might expect the next line to be equivalent to + // return (int)_tzcnt_u64(input_num); + // but the generated code differs and might be less efficient? + //////// + return __builtin_ctzll(input_num); +#endif // SIMDJSON_REGULAR_VISUAL_STUDIO +} + +/* result might be undefined when input_num is zero */ +simdjson_inline uint64_t clear_lowest_bit(uint64_t input_num) { + return _blsr_u64(input_num); +} + +/* result might be undefined when input_num is zero */ +simdjson_inline int leading_zeroes(uint64_t input_num) { + return int(_lzcnt_u64(input_num)); +} + +#if SIMDJSON_REGULAR_VISUAL_STUDIO +simdjson_inline unsigned __int64 count_ones(uint64_t input_num) { + // note: we do not support legacy 32-bit Windows + return __popcnt64(input_num);// Visual Studio wants two underscores +} +#else +simdjson_inline long long int count_ones(uint64_t input_num) { + return _popcnt64(input_num); +} +#endif + +simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2, + uint64_t *result) { +#if SIMDJSON_REGULAR_VISUAL_STUDIO + return _addcarry_u64(0, value1, value2, + reinterpret_cast<unsigned __int64 *>(result)); +#else + return __builtin_uaddll_overflow(value1, value2, + reinterpret_cast<unsigned long long *>(result)); +#endif +} + +} // unnamed namespace +} // namespace icelake +} // namespace simdjson + +#endif // SIMDJSON_ICELAKE_BITMANIPULATION_H +/* end file simdjson/icelake/bitmanipulation.h */ +/* including simdjson/icelake/bitmask.h: #include "simdjson/icelake/bitmask.h" */ +/* begin file simdjson/icelake/bitmask.h */ +#ifndef SIMDJSON_ICELAKE_BITMASK_H +#define SIMDJSON_ICELAKE_BITMASK_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/icelake/intrinsics.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace icelake { +namespace { + +// +// Perform a "cumulative bitwise xor," flipping bits each time a 1 is encountered. +// +// For example, prefix_xor(00100100) == 00011100 +// +simdjson_inline uint64_t prefix_xor(const uint64_t bitmask) { + // There should be no such thing with a processor supporting avx2 + // but not clmul. + __m128i all_ones = _mm_set1_epi8('\xFF'); + __m128i result = _mm_clmulepi64_si128(_mm_set_epi64x(0ULL, bitmask), all_ones, 0); + return _mm_cvtsi128_si64(result); +} + +} // unnamed namespace +} // namespace icelake +} // namespace simdjson + +#endif // SIMDJSON_ICELAKE_BITMASK_H +/* end file simdjson/icelake/bitmask.h */ +/* including simdjson/icelake/simd.h: #include "simdjson/icelake/simd.h" */ +/* begin file simdjson/icelake/simd.h */ +#ifndef SIMDJSON_ICELAKE_SIMD_H +#define SIMDJSON_ICELAKE_SIMD_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/icelake/intrinsics.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/icelake/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#if defined(__GNUC__) && !defined(__clang__) +#if __GNUC__ == 8 +#define SIMDJSON_GCC8 1 +#endif // __GNUC__ == 8 +#endif // defined(__GNUC__) && !defined(__clang__) + +#if SIMDJSON_GCC8 +/** + * GCC 8 fails to provide _mm512_set_epi8. We roll our own. + */ +inline __m512i _mm512_set_epi8(uint8_t a0, uint8_t a1, uint8_t a2, uint8_t a3, uint8_t a4, uint8_t a5, uint8_t a6, uint8_t a7, uint8_t a8, uint8_t a9, uint8_t a10, uint8_t a11, uint8_t a12, uint8_t a13, uint8_t a14, uint8_t a15, uint8_t a16, uint8_t a17, uint8_t a18, uint8_t a19, uint8_t a20, uint8_t a21, uint8_t a22, uint8_t a23, uint8_t a24, uint8_t a25, uint8_t a26, uint8_t a27, uint8_t a28, uint8_t a29, uint8_t a30, uint8_t a31, uint8_t a32, uint8_t a33, uint8_t a34, uint8_t a35, uint8_t a36, uint8_t a37, uint8_t a38, uint8_t a39, uint8_t a40, uint8_t a41, uint8_t a42, uint8_t a43, uint8_t a44, uint8_t a45, uint8_t a46, uint8_t a47, uint8_t a48, uint8_t a49, uint8_t a50, uint8_t a51, uint8_t a52, uint8_t a53, uint8_t a54, uint8_t a55, uint8_t a56, uint8_t a57, uint8_t a58, uint8_t a59, uint8_t a60, uint8_t a61, uint8_t a62, uint8_t a63) { + return _mm512_set_epi64(uint64_t(a7) + (uint64_t(a6) << 8) + (uint64_t(a5) << 16) + (uint64_t(a4) << 24) + (uint64_t(a3) << 32) + (uint64_t(a2) << 40) + (uint64_t(a1) << 48) + (uint64_t(a0) << 56), + uint64_t(a15) + (uint64_t(a14) << 8) + (uint64_t(a13) << 16) + (uint64_t(a12) << 24) + (uint64_t(a11) << 32) + (uint64_t(a10) << 40) + (uint64_t(a9) << 48) + (uint64_t(a8) << 56), + uint64_t(a23) + (uint64_t(a22) << 8) + (uint64_t(a21) << 16) + (uint64_t(a20) << 24) + (uint64_t(a19) << 32) + (uint64_t(a18) << 40) + (uint64_t(a17) << 48) + (uint64_t(a16) << 56), + uint64_t(a31) + (uint64_t(a30) << 8) + (uint64_t(a29) << 16) + (uint64_t(a28) << 24) + (uint64_t(a27) << 32) + (uint64_t(a26) << 40) + (uint64_t(a25) << 48) + (uint64_t(a24) << 56), + uint64_t(a39) + (uint64_t(a38) << 8) + (uint64_t(a37) << 16) + (uint64_t(a36) << 24) + (uint64_t(a35) << 32) + (uint64_t(a34) << 40) + (uint64_t(a33) << 48) + (uint64_t(a32) << 56), + uint64_t(a47) + (uint64_t(a46) << 8) + (uint64_t(a45) << 16) + (uint64_t(a44) << 24) + (uint64_t(a43) << 32) + (uint64_t(a42) << 40) + (uint64_t(a41) << 48) + (uint64_t(a40) << 56), + uint64_t(a55) + (uint64_t(a54) << 8) + (uint64_t(a53) << 16) + (uint64_t(a52) << 24) + (uint64_t(a51) << 32) + (uint64_t(a50) << 40) + (uint64_t(a49) << 48) + (uint64_t(a48) << 56), + uint64_t(a63) + (uint64_t(a62) << 8) + (uint64_t(a61) << 16) + (uint64_t(a60) << 24) + (uint64_t(a59) << 32) + (uint64_t(a58) << 40) + (uint64_t(a57) << 48) + (uint64_t(a56) << 56)); +} +#endif // SIMDJSON_GCC8 + + + +namespace simdjson { +namespace icelake { +namespace { +namespace simd { + + // Forward-declared so they can be used by splat and friends. + template<typename Child> + struct base { + __m512i value; + + // Zero constructor + simdjson_inline base() : value{__m512i()} {} + + // Conversion from SIMD register + simdjson_inline base(const __m512i _value) : value(_value) {} + + // Conversion to SIMD register + simdjson_inline operator const __m512i&() const { return this->value; } + simdjson_inline operator __m512i&() { return this->value; } + + // Bit operations + simdjson_inline Child operator|(const Child other) const { return _mm512_or_si512(*this, other); } + simdjson_inline Child operator&(const Child other) const { return _mm512_and_si512(*this, other); } + simdjson_inline Child operator^(const Child other) const { return _mm512_xor_si512(*this, other); } + simdjson_inline Child bit_andnot(const Child other) const { return _mm512_andnot_si512(other, *this); } + simdjson_inline Child& operator|=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast | other; return *this_cast; } + simdjson_inline Child& operator&=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast & other; return *this_cast; } + simdjson_inline Child& operator^=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast ^ other; return *this_cast; } + }; + + // Forward-declared so they can be used by splat and friends. + template<typename T> + struct simd8; + + template<typename T, typename Mask=simd8<bool>> + struct base8: base<simd8<T>> { + typedef uint32_t bitmask_t; + typedef uint64_t bitmask2_t; + + simdjson_inline base8() : base<simd8<T>>() {} + simdjson_inline base8(const __m512i _value) : base<simd8<T>>(_value) {} + + friend simdjson_really_inline uint64_t operator==(const simd8<T> lhs, const simd8<T> rhs) { + return _mm512_cmpeq_epi8_mask(lhs, rhs); + } + static const int SIZE = sizeof(base<T>::value); + + template<int N=1> + simdjson_inline simd8<T> prev(const simd8<T> prev_chunk) const { + // workaround for compilers unable to figure out that 16 - N is a constant (GCC 8) + constexpr int shift = 16 - N; + return _mm512_alignr_epi8(*this, _mm512_permutex2var_epi64(prev_chunk, _mm512_set_epi64(13, 12, 11, 10, 9, 8, 7, 6), *this), shift); + } + }; + + // SIMD byte mask type (returned by things like eq and gt) + template<> + struct simd8<bool>: base8<bool> { + static simdjson_inline simd8<bool> splat(bool _value) { return _mm512_set1_epi8(uint8_t(-(!!_value))); } + + simdjson_inline simd8() : base8() {} + simdjson_inline simd8(const __m512i _value) : base8<bool>(_value) {} + // Splat constructor + simdjson_inline simd8(bool _value) : base8<bool>(splat(_value)) {} + simdjson_inline bool any() const { return !!_mm512_test_epi8_mask (*this, *this); } + simdjson_inline simd8<bool> operator~() const { return *this ^ true; } + }; + + template<typename T> + struct base8_numeric: base8<T> { + static simdjson_inline simd8<T> splat(T _value) { return _mm512_set1_epi8(_value); } + static simdjson_inline simd8<T> zero() { return _mm512_setzero_si512(); } + static simdjson_inline simd8<T> load(const T values[64]) { + return _mm512_loadu_si512(reinterpret_cast<const __m512i *>(values)); + } + // Repeat 16 values as many times as necessary (usually for lookup tables) + static simdjson_inline simd8<T> repeat_16( + T v0, T v1, T v2, T v3, T v4, T v5, T v6, T v7, + T v8, T v9, T v10, T v11, T v12, T v13, T v14, T v15 + ) { + return simd8<T>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15, + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15, + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15, + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + ); + } + + simdjson_inline base8_numeric() : base8<T>() {} + simdjson_inline base8_numeric(const __m512i _value) : base8<T>(_value) {} + + // Store to array + simdjson_inline void store(T dst[64]) const { return _mm512_storeu_si512(reinterpret_cast<__m512i *>(dst), *this); } + + // Addition/subtraction are the same for signed and unsigned + simdjson_inline simd8<T> operator+(const simd8<T> other) const { return _mm512_add_epi8(*this, other); } + simdjson_inline simd8<T> operator-(const simd8<T> other) const { return _mm512_sub_epi8(*this, other); } + simdjson_inline simd8<T>& operator+=(const simd8<T> other) { *this = *this + other; return *static_cast<simd8<T>*>(this); } + simdjson_inline simd8<T>& operator-=(const simd8<T> other) { *this = *this - other; return *static_cast<simd8<T>*>(this); } + + // Override to distinguish from bool version + simdjson_inline simd8<T> operator~() const { return *this ^ 0xFFu; } + + // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values) + template<typename L> + simdjson_inline simd8<L> lookup_16(simd8<L> lookup_table) const { + return _mm512_shuffle_epi8(lookup_table, *this); + } + + // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted as a bitset). + // Passing a 0 value for mask would be equivalent to writing out every byte to output. + // Only the first 64 - count_ones(mask) bytes of the result are significant but 64 bytes + // get written. + // Design consideration: it seems like a function with the + // signature simd8<L> compress(uint32_t mask) would be + // sensible, but the AVX ISA makes this kind of approach difficult. + template<typename L> + simdjson_inline void compress(uint64_t mask, L * output) const { + // we deliberately avoid _mm512_mask_compressstoreu_epi8 for portability + // (AMD Zen4 has terrible performance with it, it is effectively broken) + // _mm512_mask_compressstoreu_epi8 (output,~mask,*this); + __m512i compressed = _mm512_maskz_compress_epi8(~mask, *this); + _mm512_storeu_si512(output, compressed); // could use a mask + } + + template<typename L> + simdjson_inline simd8<L> lookup_16( + L replace0, L replace1, L replace2, L replace3, + L replace4, L replace5, L replace6, L replace7, + L replace8, L replace9, L replace10, L replace11, + L replace12, L replace13, L replace14, L replace15) const { + return lookup_16(simd8<L>::repeat_16( + replace0, replace1, replace2, replace3, + replace4, replace5, replace6, replace7, + replace8, replace9, replace10, replace11, + replace12, replace13, replace14, replace15 + )); + } + }; + + // Signed bytes + template<> + struct simd8<int8_t> : base8_numeric<int8_t> { + simdjson_inline simd8() : base8_numeric<int8_t>() {} + simdjson_inline simd8(const __m512i _value) : base8_numeric<int8_t>(_value) {} + // Splat constructor + simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {} + // Array constructor + simdjson_inline simd8(const int8_t values[64]) : simd8(load(values)) {} + // Member-by-member initialization + simdjson_inline simd8( + int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, + int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15, + int8_t v16, int8_t v17, int8_t v18, int8_t v19, int8_t v20, int8_t v21, int8_t v22, int8_t v23, + int8_t v24, int8_t v25, int8_t v26, int8_t v27, int8_t v28, int8_t v29, int8_t v30, int8_t v31, + int8_t v32, int8_t v33, int8_t v34, int8_t v35, int8_t v36, int8_t v37, int8_t v38, int8_t v39, + int8_t v40, int8_t v41, int8_t v42, int8_t v43, int8_t v44, int8_t v45, int8_t v46, int8_t v47, + int8_t v48, int8_t v49, int8_t v50, int8_t v51, int8_t v52, int8_t v53, int8_t v54, int8_t v55, + int8_t v56, int8_t v57, int8_t v58, int8_t v59, int8_t v60, int8_t v61, int8_t v62, int8_t v63 + ) : simd8(_mm512_set_epi8( + v63, v62, v61, v60, v59, v58, v57, v56, + v55, v54, v53, v52, v51, v50, v49, v48, + v47, v46, v45, v44, v43, v42, v41, v40, + v39, v38, v37, v36, v35, v34, v33, v32, + v31, v30, v29, v28, v27, v26, v25, v24, + v23, v22, v21, v20, v19, v18, v17, v16, + v15, v14, v13, v12, v11, v10, v9, v8, + v7, v6, v5, v4, v3, v2, v1, v0 + )) {} + + // Repeat 16 values as many times as necessary (usually for lookup tables) + simdjson_inline static simd8<int8_t> repeat_16( + int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, + int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 + ) { + return simd8<int8_t>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15, + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15, + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15, + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + ); + } + + // Order-sensitive comparisons + simdjson_inline simd8<int8_t> max_val(const simd8<int8_t> other) const { return _mm512_max_epi8(*this, other); } + simdjson_inline simd8<int8_t> min_val(const simd8<int8_t> other) const { return _mm512_min_epi8(*this, other); } + + simdjson_inline simd8<bool> operator>(const simd8<int8_t> other) const { return _mm512_maskz_abs_epi8(_mm512_cmpgt_epi8_mask(*this, other),_mm512_set1_epi8(uint8_t(0x80))); } + simdjson_inline simd8<bool> operator<(const simd8<int8_t> other) const { return _mm512_maskz_abs_epi8(_mm512_cmpgt_epi8_mask(other, *this),_mm512_set1_epi8(uint8_t(0x80))); } + }; + + // Unsigned bytes + template<> + struct simd8<uint8_t>: base8_numeric<uint8_t> { + simdjson_inline simd8() : base8_numeric<uint8_t>() {} + simdjson_inline simd8(const __m512i _value) : base8_numeric<uint8_t>(_value) {} + // Splat constructor + simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {} + // Array constructor + simdjson_inline simd8(const uint8_t values[64]) : simd8(load(values)) {} + // Member-by-member initialization + simdjson_inline simd8( + uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, + uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15, + uint8_t v16, uint8_t v17, uint8_t v18, uint8_t v19, uint8_t v20, uint8_t v21, uint8_t v22, uint8_t v23, + uint8_t v24, uint8_t v25, uint8_t v26, uint8_t v27, uint8_t v28, uint8_t v29, uint8_t v30, uint8_t v31, + uint8_t v32, uint8_t v33, uint8_t v34, uint8_t v35, uint8_t v36, uint8_t v37, uint8_t v38, uint8_t v39, + uint8_t v40, uint8_t v41, uint8_t v42, uint8_t v43, uint8_t v44, uint8_t v45, uint8_t v46, uint8_t v47, + uint8_t v48, uint8_t v49, uint8_t v50, uint8_t v51, uint8_t v52, uint8_t v53, uint8_t v54, uint8_t v55, + uint8_t v56, uint8_t v57, uint8_t v58, uint8_t v59, uint8_t v60, uint8_t v61, uint8_t v62, uint8_t v63 + ) : simd8(_mm512_set_epi8( + v63, v62, v61, v60, v59, v58, v57, v56, + v55, v54, v53, v52, v51, v50, v49, v48, + v47, v46, v45, v44, v43, v42, v41, v40, + v39, v38, v37, v36, v35, v34, v33, v32, + v31, v30, v29, v28, v27, v26, v25, v24, + v23, v22, v21, v20, v19, v18, v17, v16, + v15, v14, v13, v12, v11, v10, v9, v8, + v7, v6, v5, v4, v3, v2, v1, v0 + )) {} + + // Repeat 16 values as many times as necessary (usually for lookup tables) + simdjson_inline static simd8<uint8_t> repeat_16( + uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, + uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 + ) { + return simd8<uint8_t>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15, + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15, + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15, + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + ); + } + + // Saturated math + simdjson_inline simd8<uint8_t> saturating_add(const simd8<uint8_t> other) const { return _mm512_adds_epu8(*this, other); } + simdjson_inline simd8<uint8_t> saturating_sub(const simd8<uint8_t> other) const { return _mm512_subs_epu8(*this, other); } + + // Order-specific operations + simdjson_inline simd8<uint8_t> max_val(const simd8<uint8_t> other) const { return _mm512_max_epu8(*this, other); } + simdjson_inline simd8<uint8_t> min_val(const simd8<uint8_t> other) const { return _mm512_min_epu8(other, *this); } + // Same as >, but only guarantees true is nonzero (< guarantees true = -1) + simdjson_inline simd8<uint8_t> gt_bits(const simd8<uint8_t> other) const { return this->saturating_sub(other); } + // Same as <, but only guarantees true is nonzero (< guarantees true = -1) + simdjson_inline simd8<uint8_t> lt_bits(const simd8<uint8_t> other) const { return other.saturating_sub(*this); } + simdjson_inline uint64_t operator<=(const simd8<uint8_t> other) const { return other.max_val(*this) == other; } + simdjson_inline uint64_t operator>=(const simd8<uint8_t> other) const { return other.min_val(*this) == other; } + simdjson_inline simd8<bool> operator>(const simd8<uint8_t> other) const { return this->gt_bits(other).any_bits_set(); } + simdjson_inline simd8<bool> operator<(const simd8<uint8_t> other) const { return this->lt_bits(other).any_bits_set(); } + + // Bit-specific operations + simdjson_inline simd8<bool> bits_not_set() const { return _mm512_mask_blend_epi8(*this == uint8_t(0), _mm512_set1_epi8(0), _mm512_set1_epi8(-1)); } + simdjson_inline simd8<bool> bits_not_set(simd8<uint8_t> bits) const { return (*this & bits).bits_not_set(); } + simdjson_inline simd8<bool> any_bits_set() const { return ~this->bits_not_set(); } + simdjson_inline simd8<bool> any_bits_set(simd8<uint8_t> bits) const { return ~this->bits_not_set(bits); } + + simdjson_inline bool is_ascii() const { return _mm512_movepi8_mask(*this) == 0; } + simdjson_inline bool bits_not_set_anywhere() const { + return !_mm512_test_epi8_mask(*this, *this); + } + simdjson_inline bool any_bits_set_anywhere() const { return !bits_not_set_anywhere(); } + simdjson_inline bool bits_not_set_anywhere(simd8<uint8_t> bits) const { return !_mm512_test_epi8_mask(*this, bits); } + simdjson_inline bool any_bits_set_anywhere(simd8<uint8_t> bits) const { return !bits_not_set_anywhere(bits); } + template<int N> + simdjson_inline simd8<uint8_t> shr() const { return simd8<uint8_t>(_mm512_srli_epi16(*this, N)) & uint8_t(0xFFu >> N); } + template<int N> + simdjson_inline simd8<uint8_t> shl() const { return simd8<uint8_t>(_mm512_slli_epi16(*this, N)) & uint8_t(0xFFu << N); } + // Get one of the bits and make a bitmask out of it. + // e.g. value.get_bit<7>() gets the high bit + template<int N> + simdjson_inline uint64_t get_bit() const { return _mm512_movepi8_mask(_mm512_slli_epi16(*this, 7-N)); } + }; + + template<typename T> + struct simd8x64 { + static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<T>); + static_assert(NUM_CHUNKS == 1, "Icelake kernel should use one register per 64-byte block."); + const simd8<T> chunks[NUM_CHUNKS]; + template<int idx> simd8<uint8_t> get() const { return idx < NUM_CHUNKS ? chunks[idx] : simd8<T>(); } + + simd8x64(const simd8x64<T>& o) = delete; // no copy allowed + simd8x64<T>& operator=(const simd8<T>& other) = delete; // no assignment allowed + simd8x64() = delete; // no default constructor allowed + + simdjson_inline simd8x64(const simd8<T> chunk0, const simd8<T> chunk1) : chunks{chunk0, chunk1} {} + simdjson_inline simd8x64(const simd8<T> chunk0) : chunks{chunk0} {} + simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8<T>::load(ptr)} {} + + simdjson_inline uint64_t compress(uint64_t mask, T * output) const { + this->chunks[0].compress(mask, output); + return 64 - count_ones(mask); + } + + simdjson_inline void store(T ptr[64]) const { + this->chunks[0].store(ptr+sizeof(simd8<T>)*0); + } + + simdjson_inline simd8<T> reduce_or() const { + return this->chunks[0]; + } + + simdjson_inline simd8x64<T> bit_or(const T m) const { + const simd8<T> mask = simd8<T>::splat(m); + return simd8x64<T>( + this->chunks[0] | mask + ); + } + + simdjson_inline uint64_t eq(const T m) const { + const simd8<T> mask = simd8<T>::splat(m); + return this->chunks[0] == mask; + } + + simdjson_inline uint64_t eq(const simd8x64<uint8_t> &other) const { + return this->chunks[0] == other.chunks[0]; + } + + simdjson_inline uint64_t lteq(const T m) const { + const simd8<T> mask = simd8<T>::splat(m); + return this->chunks[0] <= mask; + } + }; // struct simd8x64<T> + +} // namespace simd + +} // unnamed namespace +} // namespace icelake +} // namespace simdjson + +#endif // SIMDJSON_ICELAKE_SIMD_H +/* end file simdjson/icelake/simd.h */ +/* including simdjson/icelake/stringparsing_defs.h: #include "simdjson/icelake/stringparsing_defs.h" */ +/* begin file simdjson/icelake/stringparsing_defs.h */ +#ifndef SIMDJSON_ICELAKE_STRINGPARSING_DEFS_H +#define SIMDJSON_ICELAKE_STRINGPARSING_DEFS_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/icelake/simd.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/icelake/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace icelake { +namespace { + +using namespace simd; + +// Holds backslashes and quotes locations. +struct backslash_and_quote { +public: + static constexpr uint32_t BYTES_PROCESSED = 64; + simdjson_inline backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst); + + simdjson_inline bool has_quote_first() { return ((bs_bits - 1) & quote_bits) != 0; } + simdjson_inline bool has_backslash() { return ((quote_bits - 1) & bs_bits) != 0; } + simdjson_inline int quote_index() { return trailing_zeroes(quote_bits); } + simdjson_inline int backslash_index() { return trailing_zeroes(bs_bits); } + + uint64_t bs_bits; + uint64_t quote_bits; +}; // struct backslash_and_quote + +simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) { + // this can read up to 15 bytes beyond the buffer size, but we require + // SIMDJSON_PADDING of padding + static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "backslash and quote finder must process fewer than SIMDJSON_PADDING bytes"); + simd8<uint8_t> v(src); + // store to dest unconditionally - we can overwrite the bits we don't like later + v.store(dst); + return { + static_cast<uint64_t>(v == '\\'), // bs_bits + static_cast<uint64_t>(v == '"'), // quote_bits + }; +} + + + +struct escaping { + static constexpr uint32_t BYTES_PROCESSED = 64; + simdjson_inline static escaping copy_and_find(const uint8_t *src, uint8_t *dst); + + simdjson_inline bool has_escape() { return escape_bits != 0; } + simdjson_inline int escape_index() { return trailing_zeroes(uint64_t(escape_bits)); } + + __mmask64 escape_bits; +}; // struct escaping + + + +simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *dst) { + static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "escaping finder must process fewer than SIMDJSON_PADDING bytes"); + simd8<uint8_t> v(src); + v.store(dst); + __mmask64 is_quote = _mm512_cmpeq_epi8_mask(v, _mm512_set1_epi8('"')); + __mmask64 is_backslash = _mm512_cmpeq_epi8_mask(v, _mm512_set1_epi8('\\')); + __mmask64 is_control = _mm512_cmplt_epi8_mask(v, _mm512_set1_epi8(32)); + return { + (is_backslash | is_quote | is_control) + }; +} + + + + +} // unnamed namespace +} // namespace icelake +} // namespace simdjson + +#endif // SIMDJSON_ICELAKE_STRINGPARSING_DEFS_H +/* end file simdjson/icelake/stringparsing_defs.h */ +/* including simdjson/icelake/numberparsing_defs.h: #include "simdjson/icelake/numberparsing_defs.h" */ +/* begin file simdjson/icelake/numberparsing_defs.h */ +#ifndef SIMDJSON_ICELAKE_NUMBERPARSING_DEFS_H +#define SIMDJSON_ICELAKE_NUMBERPARSING_DEFS_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/icelake/intrinsics.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace icelake { +namespace numberparsing { + +static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) { + // this actually computes *16* values so we are being wasteful. + const __m128i ascii0 = _mm_set1_epi8('0'); + const __m128i mul_1_10 = + _mm_setr_epi8(10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1); + const __m128i mul_1_100 = _mm_setr_epi16(100, 1, 100, 1, 100, 1, 100, 1); + const __m128i mul_1_10000 = + _mm_setr_epi16(10000, 1, 10000, 1, 10000, 1, 10000, 1); + const __m128i input = _mm_sub_epi8( + _mm_loadu_si128(reinterpret_cast<const __m128i *>(chars)), ascii0); + const __m128i t1 = _mm_maddubs_epi16(input, mul_1_10); + const __m128i t2 = _mm_madd_epi16(t1, mul_1_100); + const __m128i t3 = _mm_packus_epi32(t2, t2); + const __m128i t4 = _mm_madd_epi16(t3, mul_1_10000); + return _mm_cvtsi128_si32( + t4); // only captures the sum of the first 8 digits, drop the rest +} + +/** @private */ +simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) { + internal::value128 answer; +#if SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS +#if SIMDJSON_IS_ARM64 + // ARM64 has native support for 64-bit multiplications, no need to emultate + answer.high = __umulh(value1, value2); + answer.low = value1 * value2; +#else + answer.low = _umul128(value1, value2, &answer.high); // _umul128 not available on ARM64 +#endif // SIMDJSON_IS_ARM64 +#else // SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS + __uint128_t r = (static_cast<__uint128_t>(value1)) * value2; + answer.low = uint64_t(r); + answer.high = uint64_t(r >> 64); +#endif + return answer; +} + +} // namespace numberparsing +} // namespace icelake +} // namespace simdjson + +#define SIMDJSON_SWAR_NUMBER_PARSING 1 + +#endif // SIMDJSON_ICELAKE_NUMBERPARSING_DEFS_H +/* end file simdjson/icelake/numberparsing_defs.h */ +/* end file simdjson/icelake/begin.h */ +/* including simdjson/generic/builder/amalgamated.h for icelake: #include "simdjson/generic/builder/amalgamated.h" */ +/* begin file simdjson/generic/builder/amalgamated.h for icelake */ +#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_BUILDER_DEPENDENCIES_H) +#error simdjson/generic/builder/dependencies.h must be included before simdjson/generic/builder/amalgamated.h! +#endif + +/* including simdjson/generic/builder/json_string_builder.h for icelake: #include "simdjson/generic/builder/json_string_builder.h" */ +/* begin file simdjson/generic/builder/json_string_builder.h for icelake */ +#ifndef SIMDJSON_GENERIC_STRING_BUILDER_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { + + +#if SIMDJSON_SUPPORTS_CONCEPTS + +namespace icelake { +namespace builder { + class string_builder; +}} + +template <typename T, typename = void> +struct has_custom_serialization : std::false_type {}; + +inline constexpr struct serialize_tag { + template <typename T> + constexpr void operator()(icelake::builder::string_builder& b, T&& obj) const{ + return tag_invoke(*this, b, std::forward<T>(obj)); + } + + +} serialize{}; +template <typename T> +struct has_custom_serialization<T, std::void_t< + decltype(tag_invoke(serialize, std::declval<icelake::builder::string_builder&>(), std::declval<T&>())) +>> : std::true_type {}; + +template <typename T> +constexpr bool require_custom_serialization = has_custom_serialization<T>::value; +#else +struct has_custom_serialization : std::false_type {}; +#endif // SIMDJSON_SUPPORTS_CONCEPTS + +namespace icelake { +namespace builder { +/** + * A builder for JSON strings representing documents. This is a low-level + * builder that is not meant to be used directly by end-users. Though it + * supports atomic types (Booleans, strings), it does not support composed + * types (arrays and objects). + * + * Ultimately, this class can support kernel-specific optimizations. E.g., + * it may make use of SIMD instructions to escape strings faster. + */ +class string_builder { +public: + simdjson_inline string_builder(size_t initial_capacity = DEFAULT_INITIAL_CAPACITY); + + static constexpr size_t DEFAULT_INITIAL_CAPACITY = 1024; + + /** + * Append number (includes Booleans). Booleans are mapped to the strings + * false and true. Numbers are converted to strings abiding by the JSON standard. + * Floating-point numbers are converted to the shortest string that 'correctly' + * represents the number. + */ + template<typename number_type, + typename = typename std::enable_if<std::is_arithmetic<number_type>::value>::type> + simdjson_inline void append(number_type v) noexcept; + + /** + * Append character c. + */ + simdjson_inline void append(char c) noexcept; + + /** + * Append the string 'null'. + */ + simdjson_inline void append_null() noexcept; + + /** + * Clear the content. + */ + simdjson_inline void clear() noexcept; + + /** + * Append the std::string_view, after escaping it. + * There is no UTF-8 validation. + */ + simdjson_inline void escape_and_append(std::string_view input) noexcept; + + /** + * Append the std::string_view surrounded by double quotes, after escaping it. + * There is no UTF-8 validation. + */ + simdjson_inline void escape_and_append_with_quotes(std::string_view input) noexcept; +#if SIMDJSON_SUPPORTS_CONCEPTS + template<constevalutil::fixed_string key> + simdjson_inline void escape_and_append_with_quotes() noexcept; +#endif + /** + * Append the character surrounded by double quotes, after escaping it. + * There is no UTF-8 validation. + */ + simdjson_inline void escape_and_append_with_quotes(char input) noexcept; + + /** + * Append the character surrounded by double quotes, after escaping it. + * There is no UTF-8 validation. + */ + simdjson_inline void escape_and_append_with_quotes(const char* input) noexcept; + + /** + * Append the C string directly, without escaping. + * There is no UTF-8 validation. + */ + simdjson_inline void append_raw(const char *c) noexcept; + + /** + * Append "{" to the buffer. + */ + simdjson_inline void start_object() noexcept; + + /** + * Append "}" to the buffer. + */ + simdjson_inline void end_object() noexcept; + + /** + * Append "[" to the buffer. + */ + simdjson_inline void start_array() noexcept; + + /** + * Append "]" to the buffer. + */ + simdjson_inline void end_array() noexcept; + + /** + * Append "," to the buffer. + */ + simdjson_inline void append_comma() noexcept; + + /** + * Append ":" to the buffer. + */ + simdjson_inline void append_colon() noexcept; + + /** + * Append a key-value pair to the buffer. + * The key is escaped and surrounded by double quotes. + * The value is escaped if it is a string. + */ + template<typename key_type, typename value_type> + simdjson_inline void append_key_value(key_type key, value_type value) noexcept; +#if SIMDJSON_SUPPORTS_CONCEPTS + template<constevalutil::fixed_string key, typename value_type> + simdjson_inline void append_key_value(value_type value) noexcept; + + // Support for optional types (std::optional, etc.) + template <concepts::optional_type T> + requires(!require_custom_serialization<T>) + simdjson_inline void append(const T &opt); + + template <typename T> + requires(require_custom_serialization<T>) + simdjson_inline void append(T &&val); + + // Support for string-like types + template <typename T> + requires(std::is_convertible<T, std::string_view>::value || + std::is_same<T, const char*>::value ) + simdjson_inline void append(const T &value); +#endif +#if SIMDJSON_SUPPORTS_RANGES && SIMDJSON_SUPPORTS_CONCEPTS + // Support for range-based appending (std::ranges::view, etc.) + template <std::ranges::range R> +requires (!std::is_convertible<R, std::string_view>::value && !require_custom_serialization<R>) + simdjson_inline void append(const R &range) noexcept; +#endif + /** + * Append the std::string_view directly, without escaping. + * There is no UTF-8 validation. + */ + simdjson_inline void append_raw(std::string_view input) noexcept; + + /** + * Append len characters from str. + * There is no UTF-8 validation. + */ + simdjson_inline void append_raw(const char *str, size_t len) noexcept; +#if SIMDJSON_EXCEPTIONS + /** + * Creates an std::string from the written JSON buffer. + * Throws if memory allocation failed + * + * The result may not be valid UTF-8 if some of your content was not valid UTF-8. + * Use validate_unicode() to check the content if needed. + */ + simdjson_inline operator std::string() const noexcept(false); + + /** + * Creates an std::string_view from the written JSON buffer. + * Throws if memory allocation failed. + * + * The result may not be valid UTF-8 if some of your content was not valid UTF-8. + * Use validate_unicode() to check the content if needed. + */ + simdjson_inline operator std::string_view() const noexcept(false) simdjson_lifetime_bound; +#endif + + /** + * Returns a view on the written JSON buffer. Returns an error + * if memory allocation failed. + * + * The result may not be valid UTF-8 if some of your content was not valid UTF-8. + * Use validate_unicode() to check the content. + */ + simdjson_inline simdjson_result<std::string_view> view() const noexcept; + + /** + * Appends the null character to the buffer and returns + * a pointer to the beginning of the written JSON buffer. + * Returns an error if memory allocation failed. + * The result is null-terminated. + * + * The result may not be valid UTF-8 if some of your content was not valid UTF-8. + * Use validate_unicode() to check the content. + */ + simdjson_inline simdjson_result<const char *> c_str() noexcept; + + /** + * Return true if the content is valid UTF-8. + */ + simdjson_inline bool validate_unicode() const noexcept; + + /** + * Returns the current size of the written JSON buffer. + * If an error occurred, returns 0. + */ + simdjson_inline size_t size() const noexcept; + +private: + /** + * Returns true if we can write at least upcoming_bytes bytes. + * The underlying buffer is reallocated if needed. It is designed + * to be called before writing to the buffer. It should be fast. + */ + simdjson_inline bool capacity_check(size_t upcoming_bytes); + + /** + * Grow the buffer to at least desired_capacity bytes. + * If the allocation fails, is_valid is set to false. We expect + * that this function would not be repeatedly called. + */ + simdjson_inline void grow_buffer(size_t desired_capacity); + + /** + * We use this helper function to make sure that is_valid is kept consistent. + */ + simdjson_inline void set_valid(bool valid) noexcept; + + std::unique_ptr<char[]> buffer{}; + size_t position{0}; + size_t capacity{0}; + bool is_valid{true}; +}; + + + +} +} + + +#if !SIMDJSON_STATIC_REFLECTION +// fallback implementation until we have static reflection +template <class Z> +simdjson_warn_unused simdjson_result<std::string> to_json(const Z &z, size_t initial_capacity = simdjson::icelake::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + simdjson::icelake::builder::string_builder b(initial_capacity); + b.append(z); + std::string_view s; + auto e = b.view().get(s); + if(e) { return e; } + return std::string(s); +} +template <class Z> +simdjson_warn_unused error_code to_json(const Z &z, std::string &s, size_t initial_capacity = simdjson::icelake::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + simdjson::icelake::builder::string_builder b(initial_capacity); + b.append(z); + std::string_view sv; + auto e = b.view().get(sv); + if(e) { return e; } + s.assign(sv.data(), sv.size()); + return simdjson::SUCCESS; +} +#endif + +#if SIMDJSON_SUPPORTS_CONCEPTS +#endif // SIMDJSON_SUPPORTS_CONCEPTS + +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_STRING_BUILDER_H +/* end file simdjson/generic/builder/json_string_builder.h for icelake */ +/* including simdjson/generic/builder/json_builder.h for icelake: #include "simdjson/generic/builder/json_builder.h" */ +/* begin file simdjson/generic/builder/json_builder.h for icelake */ +#ifndef SIMDJSON_GENERIC_BUILDER_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_string_builder.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/concepts.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ +#if SIMDJSON_STATIC_REFLECTION + +#include <charconv> +#include <cstring> +#include <meta> +#include <memory> +#include <optional> +#include <string_view> +#include <type_traits> +#include <utility> +// #include <static_reflection> // for std::define_static_string - header not available yet + +namespace simdjson { +namespace icelake { +namespace builder { + +template <class T> + requires(concepts::container_but_not_string<T> && !require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &t) { + auto it = t.begin(); + auto end = t.end(); + if (it == end) { + b.append_raw("[]"); + return; + } + b.append('['); + atom(b, *it); + ++it; + for (; it != end; ++it) { + b.append(','); + atom(b, *it); + } + b.append(']'); +} + +template <class T> + requires(std::is_same_v<T, std::string> || + std::is_same_v<T, std::string_view> || + std::is_same_v<T, const char *> || + std::is_same_v<T, char>) +constexpr void atom(string_builder &b, const T &t) { + b.escape_and_append_with_quotes(t); +} + +template <concepts::string_view_keyed_map T> + requires(!require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &m) { + if (m.empty()) { + b.append_raw("{}"); + return; + } + b.append('{'); + bool first = true; + for (const auto& [key, value] : m) { + if (!first) { + b.append(','); + } + first = false; + // Keys must be convertible to string_view per the concept + b.escape_and_append_with_quotes(key); + b.append(':'); + atom(b, value); + } + b.append('}'); +} + + +template<typename number_type, + typename = typename std::enable_if<std::is_arithmetic<number_type>::value && !std::is_same_v<number_type, char>>::type> +constexpr void atom(string_builder &b, const number_type t) { + b.append(t); +} + +template <class T> + requires(std::is_class_v<T> && !concepts::container_but_not_string<T> && + !concepts::string_view_keyed_map<T> && + !concepts::optional_type<T> && + !concepts::smart_pointer<T> && + !concepts::appendable_containers<T> && + !std::is_same_v<T, std::string> && + !std::is_same_v<T, std::string_view> && + !std::is_same_v<T, const char*> && + !std::is_same_v<T, char> && !require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &t) { + int i = 0; + b.append('{'); + template for (constexpr auto dm : std::define_static_array(std::meta::nonstatic_data_members_of(^^T, std::meta::access_context::unchecked()))) { + if (i != 0) + b.append(','); + constexpr auto key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(dm))); + b.append_raw(key); + b.append(':'); + atom(b, t.[:dm:]); + i++; + }; + b.append('}'); +} + +// Support for optional types (std::optional, etc.) +template <concepts::optional_type T> + requires(!require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &opt) { + if (opt) { + atom(b, opt.value()); + } else { + b.append_raw("null"); + } +} + +// Support for smart pointers (std::unique_ptr, std::shared_ptr, etc.) +template <concepts::smart_pointer T> + requires(!require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &ptr) { + if (ptr) { + atom(b, *ptr); + } else { + b.append_raw("null"); + } +} + +// Support for enums - serialize as string representation using expand approach from P2996R12 +template <typename T> + requires(std::is_enum_v<T> && !require_custom_serialization<T>) +void atom(string_builder &b, const T &e) { +#if SIMDJSON_STATIC_REFLECTION + constexpr auto enumerators = std::define_static_array(std::meta::enumerators_of(^^T)); + template for (constexpr auto enum_val : enumerators) { + constexpr auto enum_str = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(enum_val))); + if (e == [:enum_val:]) { + b.append_raw(enum_str); + return; + } + }; + // Fallback to integer if enum value not found + atom(b, static_cast<std::underlying_type_t<T>>(e)); +#else + // Fallback: serialize as integer if reflection not available + atom(b, static_cast<std::underlying_type_t<T>>(e)); +#endif +} + +// Support for appendable containers that don't have operator[] (sets, etc.) +template <concepts::appendable_containers T> + requires(!concepts::container_but_not_string<T> && !concepts::string_view_keyed_map<T> && + !concepts::optional_type<T> && !concepts::smart_pointer<T> && + !std::is_same_v<T, std::string> && + !std::is_same_v<T, std::string_view> && !std::is_same_v<T, const char*> && !require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &container) { + if (container.empty()) { + b.append_raw("[]"); + return; + } + b.append('['); + bool first = true; + for (const auto& item : container) { + if (!first) { + b.append(','); + } + first = false; + atom(b, item); + } + b.append(']'); +} + +// append functions that delegate to atom functions for primitive types +template <class T> + requires(std::is_arithmetic_v<T> && !std::is_same_v<T, char>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +template <class T> + requires(std::is_same_v<T, std::string> || + std::is_same_v<T, std::string_view> || + std::is_same_v<T, const char *> || + std::is_same_v<T, char>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +template <concepts::optional_type T> + requires(!require_custom_serialization<T>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +template <concepts::smart_pointer T> + requires(!require_custom_serialization<T>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +template <concepts::appendable_containers T> + requires(!concepts::container_but_not_string<T> && !concepts::string_view_keyed_map<T> && + !concepts::optional_type<T> && !concepts::smart_pointer<T> && + !std::is_same_v<T, std::string> && + !std::is_same_v<T, std::string_view> && !std::is_same_v<T, const char*> && !require_custom_serialization<T>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +template <concepts::string_view_keyed_map T> + requires(!require_custom_serialization<T>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +// works for struct +template <class Z> + requires(std::is_class_v<Z> && !concepts::container_but_not_string<Z> && + !concepts::string_view_keyed_map<Z> && + !concepts::optional_type<Z> && + !concepts::smart_pointer<Z> && + !concepts::appendable_containers<Z> && + !std::is_same_v<Z, std::string> && + !std::is_same_v<Z, std::string_view> && + !std::is_same_v<Z, const char*> && + !std::is_same_v<Z, char> && !require_custom_serialization<Z>) +void append(string_builder &b, const Z &z) { + int i = 0; + b.append('{'); + template for (constexpr auto dm : std::define_static_array(std::meta::nonstatic_data_members_of(^^Z, std::meta::access_context::unchecked()))) { + if (i != 0) + b.append(','); + constexpr auto key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(dm))); + b.append_raw(key); + b.append(':'); + atom(b, z.[:dm:]); + i++; + }; + b.append('}'); +} + +// works for container that have begin() and end() iterators +template <class Z> + requires(concepts::container_but_not_string<Z> && !require_custom_serialization<Z>) +void append(string_builder &b, const Z &z) { + auto it = z.begin(); + auto end = z.end(); + if (it == end) { + b.append_raw("[]"); + return; + } + b.append('['); + atom(b, *it); + ++it; + for (; it != end; ++it) { + b.append(','); + atom(b, *it); + } + b.append(']'); +} + +template <class Z> + requires (require_custom_serialization<Z>) +void append(string_builder &b, const Z &z) { + b.append(z); +} + + +template <class Z> +simdjson_warn_unused simdjson_result<std::string> to_json_string(const Z &z, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + string_builder b(initial_capacity); + append(b, z); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); +} + +template <class Z> +simdjson_warn_unused error_code to_json(const Z &z, std::string &s, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + string_builder b(initial_capacity); + append(b, z); + std::string_view view; + if(auto e = b.view().get(view); e) { return e; } + s.assign(view); + return SUCCESS; +} + +template <class Z> +string_builder& operator<<(string_builder& b, const Z& z) { + append(b, z); + return b; +} + +// extract_from: Serialize only specific fields from a struct to JSON +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +void extract_from(string_builder &b, const T &obj) { + // Helper to check if a field name matches any of the requested fields + auto should_extract = [](std::string_view field_name) constexpr -> bool { + return ((FieldNames.view() == field_name) || ...); + }; + + b.append('{'); + bool first = true; + + // Iterate through all members of T using reflection + template for (constexpr auto mem : std::define_static_array( + std::meta::nonstatic_data_members_of(^^T, std::meta::access_context::unchecked()))) { + + if constexpr (std::meta::is_public(mem)) { + constexpr std::string_view key = std::define_static_string(std::meta::identifier_of(mem)); + + // Only serialize this field if it's in our list of requested fields + if constexpr (should_extract(key)) { + if (!first) { + b.append(','); + } + first = false; + + // Serialize the key + constexpr auto quoted_key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(mem))); + b.append_raw(quoted_key); + b.append(':'); + + // Serialize the value + atom(b, obj.[:mem:]); + } + } + }; + + b.append('}'); +} + +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result<std::string> extract_from(const T &obj, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + string_builder b(initial_capacity); + extract_from<FieldNames...>(b, obj); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); +} + +} // namespace builder +} // namespace icelake +// Alias the function template to 'to' in the global namespace +template <class Z> +simdjson_warn_unused simdjson_result<std::string> to_json(const Z &z, size_t initial_capacity = icelake::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + icelake::builder::string_builder b(initial_capacity); + icelake::builder::append(b, z); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); +} +template <class Z> +simdjson_warn_unused error_code to_json(const Z &z, std::string &s, size_t initial_capacity = icelake::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + icelake::builder::string_builder b(initial_capacity); + icelake::builder::append(b, z); + std::string_view view; + if(auto e = b.view().get(view); e) { return e; } + s.assign(view); + return SUCCESS; +} +// Global namespace function for extract_from +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result<std::string> extract_from(const T &obj, size_t initial_capacity = icelake::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + icelake::builder::string_builder b(initial_capacity); + icelake::builder::extract_from<FieldNames...>(b, obj); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); +} + +} // namespace simdjson + +#endif // SIMDJSON_STATIC_REFLECTION + +#endif +/* end file simdjson/generic/builder/json_builder.h for icelake */ +/* including simdjson/generic/builder/fractured_json_builder.h for icelake: #include "simdjson/generic/builder/fractured_json_builder.h" */ +/* begin file simdjson/generic/builder/fractured_json_builder.h for icelake */ +#ifndef SIMDJSON_GENERIC_FRACTURED_JSON_BUILDER_H +#define SIMDJSON_GENERIC_FRACTURED_JSON_BUILDER_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_builder.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/dom/fractured_json.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#if SIMDJSON_STATIC_REFLECTION + +namespace simdjson { +namespace icelake { +namespace builder { + +/** + * Serialize an object to a FracturedJson-formatted string. + * + * FracturedJson produces human-readable yet compact JSON output by intelligently + * choosing between different layout strategies (inline, compact multiline, table, + * expanded) based on content complexity, length, and structure similarity. + * + * This function combines the builder's serialization with FracturedJson formatting: + * 1. Serializes the object to minified JSON using reflection + * 2. Parses and reformats using FracturedJson + * + * Example: + * struct User { int id; std::string name; bool active; }; + * User user{1, "Alice", true}; + * auto result = to_fractured_json_string(user); + * // result.value() == "{ \"id\": 1, \"name\": \"Alice\", \"active\": true }" + * + * @param obj The object to serialize (must be a reflectable type) + * @param opts FracturedJson formatting options + * @param initial_capacity Initial buffer capacity for serialization + * @return The formatted JSON string, or an error + */ +template <class T> +simdjson_warn_unused simdjson_result<std::string> to_fractured_json_string( + const T& obj, + const fractured_json_options& opts = {}, + size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + // Step 1: Serialize to minified JSON + std::string formatted; + auto error = to_json_string(obj, initial_capacity).get(formatted); + if (error) { + return error; + } + + // Step 2: Reformat with FracturedJson + return fractured_json_string(formatted, opts); +} + +/** + * Extract specific fields from an object and format with FracturedJson. + * + * Example: + * struct User { int id; std::string name; std::string email; bool active; }; + * User user{1, "Alice", "alice@example.com", true}; + * auto result = extract_fractured_json<"id", "name">(user); + * // result.value() == "{ \"id\": 1, \"name\": \"Alice\" }" + * + * @param obj The object to serialize + * @param opts FracturedJson formatting options + * @param initial_capacity Initial buffer capacity for serialization + * @return The formatted JSON string containing only the specified fields + */ +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result<std::string> extract_fractured_json( + const T& obj, + const fractured_json_options& opts = {}, + size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + // Step 1: Extract fields to minified JSON + std::string formatted; + auto error = extract_from<FieldNames...>(obj, initial_capacity).get(formatted); + if (error) { + return error; + } + + // Step 2: Reformat with FracturedJson + return fractured_json_string(formatted, opts); +} + +} // namespace builder +} // namespace icelake + +// Global namespace convenience functions + +/** + * Serialize an object to a FracturedJson-formatted string. + * Global namespace version for convenience. + */ +template <class T> +simdjson_warn_unused simdjson_result<std::string> to_fractured_json_string( + const T& obj, + const fractured_json_options& opts = {}, + size_t initial_capacity = icelake::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + return icelake::builder::to_fractured_json_string(obj, opts, initial_capacity); +} +/** + * Extract specific fields from an object and format with FracturedJson. + * Global namespace version for convenience. + */ +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result<std::string> extract_fractured_json( + const T& obj, + const fractured_json_options& opts = {}, + size_t initial_capacity = icelake::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + return icelake::builder::extract_fractured_json<FieldNames...>(obj, opts, initial_capacity); +} + +} // namespace simdjson + +#endif // SIMDJSON_STATIC_REFLECTION + +#endif // SIMDJSON_GENERIC_FRACTURED_JSON_BUILDER_H +/* end file simdjson/generic/builder/fractured_json_builder.h for icelake */ + + + +// JSON builder inline definitions +/* including simdjson/generic/builder/json_string_builder-inl.h for icelake: #include "simdjson/generic/builder/json_string_builder-inl.h" */ +/* begin file simdjson/generic/builder/json_string_builder-inl.h for icelake */ +#include <array> +#include <cstring> +#include <type_traits> +#ifndef SIMDJSON_GENERIC_STRING_BUILDER_INL_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_INL_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_string_builder.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +/* + * Empirically, we have found that an inlined optimization is important for + * performance. The following macros are not ideal. We should find a better + * way to inline the code. + */ + +#if defined(__SSE2__) || defined(__x86_64__) || defined(__x86_64) || \ + (defined(_M_AMD64) || defined(_M_X64) || \ + (defined(_M_IX86_FP) && _M_IX86_FP == 2)) +#ifndef SIMDJSON_EXPERIMENTAL_HAS_SSE2 +#define SIMDJSON_EXPERIMENTAL_HAS_SSE2 1 +#endif +#endif + +#if defined(__aarch64__) || defined(_M_ARM64) +#ifndef SIMDJSON_EXPERIMENTAL_HAS_NEON +#define SIMDJSON_EXPERIMENTAL_HAS_NEON 1 +#endif +#endif +#if defined(__loongarch_sx) +#ifndef SIMDJSON_EXPERIMENTAL_HAS_LSX +#define SIMDJSON_EXPERIMENTAL_HAS_LSX 1 +#endif +#endif +#if defined(__riscv_v_intrinsic) && __riscv_v_intrinsic >= 11000 && \ + defined(__riscv_vector) +#ifndef SIMDJSON_EXPERIMENTAL_HAS_RVV +#define SIMDJSON_EXPERIMENTAL_HAS_RVV 1 +#endif +#endif +#if (defined(__PPC64__) || defined(_M_PPC64)) && defined(__ALTIVEC__) +#ifndef SIMDJSON_EXPERIMENTAL_HAS_PPC64 +#define SIMDJSON_EXPERIMENTAL_HAS_PPC64 1 +#endif +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_NEON +#include <arm_neon.h> +#ifdef _MSC_VER +#include <intrin.h> +#endif +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_SSE2 +#include <emmintrin.h> +#ifdef _MSC_VER +#include <intrin.h> +#endif +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_LSX +#include <lsxintrin.h> +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_RVV +#include <riscv_vector.h> +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_PPC64 +#include <altivec.h> +#ifdef bool +#undef bool +#endif +#ifdef vector +#undef vector +#endif +#endif + + +namespace simdjson { +namespace icelake { +namespace builder { + +static SIMDJSON_CONSTEXPR_LAMBDA std::array<uint8_t, 256> + json_quotable_character = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + +/** + +A possible SWAR implementation of has_json_escapable_byte. It is not used +because it is slower than the current implementation. It is kept here for +reference (to show that we tried it). + +inline bool has_json_escapable_byte(uint64_t x) { + uint64_t is_ascii = 0x8080808080808080ULL & ~x; + uint64_t xor2 = x ^ 0x0202020202020202ULL; + uint64_t lt32_or_eq34 = xor2 - 0x2121212121212121ULL; + uint64_t sub92 = x ^ 0x5C5C5C5C5C5C5C5CULL; + uint64_t eq92 = (sub92 - 0x0101010101010101ULL); + return ((lt32_or_eq34 | eq92) & is_ascii) != 0; +} + +**/ + +SIMDJSON_CONSTEXPR_LAMBDA simdjson_inline bool +simple_needs_escaping(std::string_view v) { + for (char c : v) { + // a table lookup is faster than a series of comparisons + if (json_quotable_character[static_cast<uint8_t>(c)]) { + return true; + } + } + return false; +} + +#if SIMDJSON_EXPERIMENTAL_HAS_NEON +simdjson_inline bool fast_needs_escaping(std::string_view view) { + if (view.size() < 16) { + return simple_needs_escaping(view); + } + size_t i = 0; + uint8x16_t running = vdupq_n_u8(0); + uint8x16_t v34 = vdupq_n_u8(34); + uint8x16_t v92 = vdupq_n_u8(92); + + for (; i + 15 < view.size(); i += 16) { + uint8x16_t word = vld1q_u8((const uint8_t *)view.data() + i); + running = vorrq_u8(running, vceqq_u8(word, v34)); + running = vorrq_u8(running, vceqq_u8(word, v92)); + running = vorrq_u8(running, vcltq_u8(word, vdupq_n_u8(32))); + } + if (i < view.size()) { + uint8x16_t word = + vld1q_u8((const uint8_t *)view.data() + view.length() - 16); + running = vorrq_u8(running, vceqq_u8(word, v34)); + running = vorrq_u8(running, vceqq_u8(word, v92)); + running = vorrq_u8(running, vcltq_u8(word, vdupq_n_u8(32))); + } + return vmaxvq_u32(vreinterpretq_u32_u8(running)) != 0; +} +#elif SIMDJSON_EXPERIMENTAL_HAS_SSE2 +simdjson_inline bool fast_needs_escaping(std::string_view view) { + if (view.size() < 16) { + return simple_needs_escaping(view); + } + size_t i = 0; + __m128i running = _mm_setzero_si128(); + for (; i + 15 < view.size(); i += 16) { + + __m128i word = + _mm_loadu_si128(reinterpret_cast<const __m128i *>(view.data() + i)); + running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(34))); + running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(92))); + running = _mm_or_si128( + running, _mm_cmpeq_epi8(_mm_subs_epu8(word, _mm_set1_epi8(31)), + _mm_setzero_si128())); + } + if (i < view.size()) { + __m128i word = _mm_loadu_si128( + reinterpret_cast<const __m128i *>(view.data() + view.length() - 16)); + running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(34))); + running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(92))); + running = _mm_or_si128( + running, _mm_cmpeq_epi8(_mm_subs_epu8(word, _mm_set1_epi8(31)), + _mm_setzero_si128())); + } + return _mm_movemask_epi8(running) != 0; +} +#elif SIMDJSON_EXPERIMENTAL_HAS_PPC64 +simdjson_inline bool fast_needs_escaping(std::string_view view) { + if (view.size() < 16) { + return simple_needs_escaping(view); + } + size_t i = 0; + __vector unsigned char running = vec_splats((unsigned char)0); + __vector unsigned char v34 = vec_splats((unsigned char)34); + __vector unsigned char v92 = vec_splats((unsigned char)92); + __vector unsigned char v32 = vec_splats((unsigned char)32); + + for (; i + 15 < view.size(); i += 16) { + __vector unsigned char word = + vec_vsx_ld(0, reinterpret_cast<const unsigned char *>(view.data() + i)); + running = vec_or(running, (__vector unsigned char)vec_cmpeq(word, v34)); + running = vec_or(running, (__vector unsigned char)vec_cmpeq(word, v92)); + running = vec_or(running, + (__vector unsigned char)vec_cmplt(word, v32)); + } + if (i < view.size()) { + __vector unsigned char word = vec_vsx_ld( + 0, reinterpret_cast<const unsigned char *>(view.data() + view.length() - 16)); + running = vec_or(running, (__vector unsigned char)vec_cmpeq(word, v34)); + running = vec_or(running, (__vector unsigned char)vec_cmpeq(word, v92)); + running = vec_or(running, + (__vector unsigned char)vec_cmplt(word, v32)); + } + return !vec_all_eq(running, vec_splats((unsigned char)0)); +} +#else +simdjson_inline bool fast_needs_escaping(std::string_view view) { + return simple_needs_escaping(view); +} +#endif + +// Scalar fallback for finding next quotable character +SIMDJSON_CONSTEXPR_LAMBDA simdjson_inline size_t +find_next_json_quotable_character_scalar(const std::string_view view, + size_t location) noexcept { + for (auto pos = view.begin() + location; pos != view.end(); ++pos) { + if (json_quotable_character[static_cast<uint8_t>(*pos)]) { + return pos - view.begin(); + } + } + return size_t(view.size()); +} + +// SIMD-accelerated position finding that directly locates the first quotable +// character, combining detection and position extraction in a single pass to +// minimize redundant work. +#if SIMDJSON_EXPERIMENTAL_HAS_NEON +simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + const size_t len = view.size(); + const uint8_t *ptr = + reinterpret_cast<const uint8_t *>(view.data()) + location; + size_t remaining = len - location; + + // SIMD constants for characters requiring escape + uint8x16_t v34 = vdupq_n_u8(34); // '"' + uint8x16_t v92 = vdupq_n_u8(92); // '\\' + uint8x16_t v32 = vdupq_n_u8(32); // control char threshold + + while (remaining >= 16) { + uint8x16_t word = vld1q_u8(ptr); + + // Check for quotable characters: '"', '\\', or control chars (< 32) + uint8x16_t needs_escape = vceqq_u8(word, v34); + needs_escape = vorrq_u8(needs_escape, vceqq_u8(word, v92)); + needs_escape = vorrq_u8(needs_escape, vcltq_u8(word, v32)); + + const uint8x8_t res = vshrn_n_u16(vreinterpretq_u16_u8(needs_escape), 4); + const uint64_t mask = vget_lane_u64(vreinterpret_u64_u8(res), 0); + if(mask != 0) { + size_t offset = ptr - reinterpret_cast<const uint8_t *>(view.data()); + auto trailing_zero = trailing_zeroes(mask); + return offset + (trailing_zero >> 2); + } + ptr += 16; + remaining -= 16; + } + + // Scalar fallback for remaining bytes + size_t current = len - remaining; + return find_next_json_quotable_character_scalar(view, current); +} +#elif SIMDJSON_EXPERIMENTAL_HAS_SSE2 +simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + const size_t len = view.size(); + const uint8_t *ptr = + reinterpret_cast<const uint8_t *>(view.data()) + location; + size_t remaining = len - location; + + // SIMD constants + __m128i v34 = _mm_set1_epi8(34); // '"' + __m128i v92 = _mm_set1_epi8(92); // '\\' + __m128i v31 = _mm_set1_epi8(31); // for control char detection + + while (remaining >= 16) { + __m128i word = _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr)); + + // Check for quotable characters + __m128i needs_escape = _mm_cmpeq_epi8(word, v34); + needs_escape = _mm_or_si128(needs_escape, _mm_cmpeq_epi8(word, v92)); + needs_escape = _mm_or_si128( + needs_escape, + _mm_cmpeq_epi8(_mm_subs_epu8(word, v31), _mm_setzero_si128())); + + int mask = _mm_movemask_epi8(needs_escape); + if (mask != 0) { + // Found quotable character - use trailing zero count to find position + size_t offset = ptr - reinterpret_cast<const uint8_t *>(view.data()); + return offset + trailing_zeroes(mask); + } + ptr += 16; + remaining -= 16; + } + + // Scalar fallback for remaining bytes + size_t current = len - remaining; + return find_next_json_quotable_character_scalar(view, current); +} +#elif SIMDJSON_EXPERIMENTAL_HAS_LSX +simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + const size_t len = view.size(); + const uint8_t *ptr = + reinterpret_cast<const uint8_t *>(view.data()) + location; + size_t remaining = len - location; + + //SIMD constants for characters requiring escape + __m128i v34 = __lsx_vreplgr2vr_b(34); // '"' + __m128i v92 = __lsx_vreplgr2vr_b(92); // '\\' + __m128i v32 = __lsx_vreplgr2vr_b(32); // control char threshold + + while (remaining >= 16){ + __m128i word = __lsx_vld(ptr, 0); + + //Check for the quotable characters: '"', '\\', or control char (<32) + __m128i needs_escape = __lsx_vseq_b(word, v34); + needs_escape = __lsx_vor_v(needs_escape, __lsx_vseq_b(word, v92)); + needs_escape = __lsx_vor_v(needs_escape, __lsx_vslt_bu(word, v32)); + + if (!__lsx_bz_v(needs_escape)){ + + //Found quotable character - extract exact byte position + uint64_t lo = __lsx_vpickve2gr_du(needs_escape,0); + uint64_t hi = __lsx_vpickve2gr_du(needs_escape,1); + size_t offset = ptr - reinterpret_cast<const uint8_t *>(view.data()); + if ( lo != 0) { + return offset + trailing_zeroes(lo) / 8; + } else { + return offset + 8 + trailing_zeroes(hi) / 8; + } + } + ptr += 16; + remaining -= 16; + } + size_t current = len - remaining; + return find_next_json_quotable_character_scalar(view, current); +} +#elif SIMDJSON_EXPERIMENTAL_HAS_RVV +simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + const size_t len = view.size(); + const uint8_t *ptr = + reinterpret_cast<const uint8_t *>(view.data()) + location; + size_t remaining = len - location; + + while (remaining > 0) { + size_t vl = __riscv_vsetvl_e8m1(remaining); + vuint8m1_t word = __riscv_vle8_v_u8m1(ptr, vl); + + // Check for quotable characters: '"', '\\', or control chars (< 32) + vbool8_t needs_escape = __riscv_vmseq(word, (uint8_t)34, vl); + needs_escape = __riscv_vmor(needs_escape, + __riscv_vmseq(word, (uint8_t)92, vl), vl); + needs_escape = __riscv_vmor(needs_escape, + __riscv_vmsltu(word, (uint8_t)32, vl), vl); + + long first = __riscv_vfirst(needs_escape, vl); + if (first >= 0) { + size_t offset = ptr - reinterpret_cast<const uint8_t *>(view.data()); + return offset + first; + } + ptr += vl; + remaining -= vl; + } + + return len; +} +#elif SIMDJSON_EXPERIMENTAL_HAS_PPC64 +simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + const size_t len = view.size(); + const uint8_t *ptr = + reinterpret_cast<const uint8_t *>(view.data()) + location; + size_t remaining = len - location; + + // SIMD constants for characters requiring escape + __vector unsigned char v34 = vec_splats((unsigned char)34); // '"' + __vector unsigned char v92 = vec_splats((unsigned char)92); // '\\' + __vector unsigned char v32 = vec_splats((unsigned char)32); // control char threshold + + // Bitmask for vec_vbpermq to extract one bit per byte + const __vector unsigned char perm_mask = {0x78, 0x70, 0x68, 0x60, 0x58, 0x50, + 0x48, 0x40, 0x38, 0x30, 0x28, 0x20, + 0x18, 0x10, 0x08, 0x00}; + + while (remaining >= 16) { + __vector unsigned char word = + vec_vsx_ld(0, reinterpret_cast<const unsigned char *>(ptr)); + + // Check for quotable characters: '"', '\\', or control chars (< 32) + __vector unsigned char needs_escape = + (__vector unsigned char)vec_cmpeq(word, v34); + needs_escape = vec_or(needs_escape, + (__vector unsigned char)vec_cmpeq(word, v92)); + needs_escape = vec_or(needs_escape, + (__vector unsigned char)vec_cmplt(word, v32)); + + __vector unsigned long long result = + (__vector unsigned long long)vec_vbpermq(needs_escape, perm_mask); +#ifdef __LITTLE_ENDIAN__ + unsigned int mask = static_cast<unsigned int>(result[1]); +#else + unsigned int mask = static_cast<unsigned int>(result[0]); +#endif + if (mask != 0) { + size_t offset = ptr - reinterpret_cast<const uint8_t *>(view.data()); + return offset + __builtin_ctz(mask); + } + ptr += 16; + remaining -= 16; + } + + // Scalar fallback for remaining bytes + size_t current = len - remaining; + return find_next_json_quotable_character_scalar(view, current); +} +#else +SIMDJSON_CONSTEXPR_LAMBDA simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + return find_next_json_quotable_character_scalar(view, location); +} +#endif + +SIMDJSON_CONSTEXPR_LAMBDA static std::string_view control_chars[] = { + "\\u0000", "\\u0001", "\\u0002", "\\u0003", "\\u0004", "\\u0005", "\\u0006", + "\\u0007", "\\b", "\\t", "\\n", "\\u000b", "\\f", "\\r", + "\\u000e", "\\u000f", "\\u0010", "\\u0011", "\\u0012", "\\u0013", "\\u0014", + "\\u0015", "\\u0016", "\\u0017", "\\u0018", "\\u0019", "\\u001a", "\\u001b", + "\\u001c", "\\u001d", "\\u001e", "\\u001f"}; + +// All Unicode characters may be placed within the quotation marks, except for +// the characters that MUST be escaped: quotation mark, reverse solidus, and the +// control characters (U+0000 through U+001F). There are two-character sequence +// escape representations of some popular characters: +// \", \\, \b, \f, \n, \r, \t. +SIMDJSON_CONSTEXPR_LAMBDA simdjson_inline void escape_json_char(char c, char *&out) { + if (c == '"') { + memcpy(out, "\\\"", 2); + out += 2; + } else if (c == '\\') { + memcpy(out, "\\\\", 2); + out += 2; + } else { + std::string_view v = control_chars[uint8_t(c)]; + memcpy(out, v.data(), v.size()); + out += v.size(); + } +} + +// Writes the escaped version of input to out, returning the number of bytes +// written. Uses SIMD position finding to locate quotable characters efficiently. +inline size_t write_string_escaped(const std::string_view input, char *out) { + size_t mysize = input.size(); + + // Use SIMD position finder directly - it returns mysize if no escape needed + size_t location = find_next_json_quotable_character(input, 0); + if (location == mysize) { + // Fast path: no escaping needed + memcpy(out, input.data(), input.size()); + return input.size(); + } + + const char *const initout = out; + memcpy(out, input.data(), location); + out += location; + escape_json_char(input[location], out); + location += 1; + while (location < mysize) { + size_t newlocation = find_next_json_quotable_character(input, location); + memcpy(out, input.data() + location, newlocation - location); + out += newlocation - location; + location = newlocation; + if (location == mysize) { + break; + } + escape_json_char(input[location], out); + location += 1; + } + return out - initout; +} + +simdjson_inline string_builder::string_builder(size_t initial_capacity) + : buffer(new(std::nothrow) char[initial_capacity]), position(0), + capacity(buffer.get() != nullptr ? initial_capacity : 0), + is_valid(buffer.get() != nullptr) {} + +simdjson_inline bool string_builder::capacity_check(size_t upcoming_bytes) { + // We use the convention that when is_valid is false, then the capacity and + // the position are 0. + // Most of the time, this function will return true. + if (simdjson_likely(upcoming_bytes <= capacity - position)) { + return true; + } + // check for overflow, most of the time there is no overflow + if (simdjson_unlikely(position + upcoming_bytes < position)) { + return false; + } + // We will rarely get here. + grow_buffer((std::max)(capacity * 2, position + upcoming_bytes)); + // If the buffer allocation failed, we set is_valid to false. + return is_valid; +} + +simdjson_inline void string_builder::grow_buffer(size_t desired_capacity) { + if (!is_valid) { + return; + } + std::unique_ptr<char[]> new_buffer(new (std::nothrow) char[desired_capacity]); + if (new_buffer.get() == nullptr) { + set_valid(false); + return; + } + std::memcpy(new_buffer.get(), buffer.get(), position); + buffer.swap(new_buffer); + capacity = desired_capacity; +} + +simdjson_inline void string_builder::set_valid(bool valid) noexcept { + if (!valid) { + is_valid = false; + capacity = 0; + position = 0; + buffer.reset(); + } else { + is_valid = true; + } +} + +simdjson_inline size_t string_builder::size() const noexcept { + return position; +} + +simdjson_inline void string_builder::append(char c) noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = c; + } +} + +simdjson_inline void string_builder::append_null() noexcept { + constexpr char null_literal[] = "null"; + constexpr size_t null_len = sizeof(null_literal) - 1; + if (capacity_check(null_len)) { + std::memcpy(buffer.get() + position, null_literal, null_len); + position += null_len; + } +} + +simdjson_inline void string_builder::clear() noexcept { + position = 0; + // if it was invalid, we should try to repair it + if (!is_valid) { + capacity = 0; + buffer.reset(); + is_valid = true; + } +} + +namespace internal { + +template <typename number_type, typename = typename std::enable_if< + std::is_unsigned<number_type>::value>::type> +simdjson_really_inline int int_log2(number_type x) { + return 63 - leading_zeroes(uint64_t(x) | 1); +} + +simdjson_really_inline int fast_digit_count_32(uint32_t x) { + static uint64_t table[] = { + 4294967296, 8589934582, 8589934582, 8589934582, 12884901788, + 12884901788, 12884901788, 17179868184, 17179868184, 17179868184, + 21474826480, 21474826480, 21474826480, 21474826480, 25769703776, + 25769703776, 25769703776, 30063771072, 30063771072, 30063771072, + 34349738368, 34349738368, 34349738368, 34349738368, 38554705664, + 38554705664, 38554705664, 41949672960, 41949672960, 41949672960, + 42949672960, 42949672960}; + return uint32_t((x + table[int_log2(x)]) >> 32); +} + +simdjson_really_inline int fast_digit_count_64(uint64_t x) { + static uint64_t table[] = {9, + 99, + 999, + 9999, + 99999, + 999999, + 9999999, + 99999999, + 999999999, + 9999999999, + 99999999999, + 999999999999, + 9999999999999, + 99999999999999, + 999999999999999ULL, + 9999999999999999ULL, + 99999999999999999ULL, + 999999999999999999ULL, + 9999999999999999999ULL}; + int y = (19 * int_log2(x) >> 6); + y += x > table[y]; + return y + 1; +} + +template <typename number_type, typename = typename std::enable_if< + std::is_unsigned<number_type>::value>::type> +simdjson_really_inline size_t digit_count(number_type v) noexcept { + static_assert(sizeof(number_type) == 8 || sizeof(number_type) == 4 || + sizeof(number_type) == 2 || sizeof(number_type) == 1, + "We only support 8-bit, 16-bit, 32-bit and 64-bit numbers"); + SIMDJSON_IF_CONSTEXPR(sizeof(number_type) <= 4) { + return fast_digit_count_32(static_cast<uint32_t>(v)); + } + else { + return fast_digit_count_64(static_cast<uint64_t>(v)); + } +} +static const char decimal_table[200] = { + 0x30, 0x30, 0x30, 0x31, 0x30, 0x32, 0x30, 0x33, 0x30, 0x34, 0x30, 0x35, + 0x30, 0x36, 0x30, 0x37, 0x30, 0x38, 0x30, 0x39, 0x31, 0x30, 0x31, 0x31, + 0x31, 0x32, 0x31, 0x33, 0x31, 0x34, 0x31, 0x35, 0x31, 0x36, 0x31, 0x37, + 0x31, 0x38, 0x31, 0x39, 0x32, 0x30, 0x32, 0x31, 0x32, 0x32, 0x32, 0x33, + 0x32, 0x34, 0x32, 0x35, 0x32, 0x36, 0x32, 0x37, 0x32, 0x38, 0x32, 0x39, + 0x33, 0x30, 0x33, 0x31, 0x33, 0x32, 0x33, 0x33, 0x33, 0x34, 0x33, 0x35, + 0x33, 0x36, 0x33, 0x37, 0x33, 0x38, 0x33, 0x39, 0x34, 0x30, 0x34, 0x31, + 0x34, 0x32, 0x34, 0x33, 0x34, 0x34, 0x34, 0x35, 0x34, 0x36, 0x34, 0x37, + 0x34, 0x38, 0x34, 0x39, 0x35, 0x30, 0x35, 0x31, 0x35, 0x32, 0x35, 0x33, + 0x35, 0x34, 0x35, 0x35, 0x35, 0x36, 0x35, 0x37, 0x35, 0x38, 0x35, 0x39, + 0x36, 0x30, 0x36, 0x31, 0x36, 0x32, 0x36, 0x33, 0x36, 0x34, 0x36, 0x35, + 0x36, 0x36, 0x36, 0x37, 0x36, 0x38, 0x36, 0x39, 0x37, 0x30, 0x37, 0x31, + 0x37, 0x32, 0x37, 0x33, 0x37, 0x34, 0x37, 0x35, 0x37, 0x36, 0x37, 0x37, + 0x37, 0x38, 0x37, 0x39, 0x38, 0x30, 0x38, 0x31, 0x38, 0x32, 0x38, 0x33, + 0x38, 0x34, 0x38, 0x35, 0x38, 0x36, 0x38, 0x37, 0x38, 0x38, 0x38, 0x39, + 0x39, 0x30, 0x39, 0x31, 0x39, 0x32, 0x39, 0x33, 0x39, 0x34, 0x39, 0x35, + 0x39, 0x36, 0x39, 0x37, 0x39, 0x38, 0x39, 0x39, +}; +} // namespace internal + +template <typename number_type, typename> +simdjson_inline void string_builder::append(number_type v) noexcept { + static_assert(std::is_same<number_type, bool>::value || + std::is_integral<number_type>::value || + std::is_floating_point<number_type>::value, + "Unsupported number type"); + // If C++17 is available, we can 'if constexpr' here. + SIMDJSON_IF_CONSTEXPR(std::is_same<number_type, bool>::value) { + if (v) { + constexpr char true_literal[] = "true"; + constexpr size_t true_len = sizeof(true_literal) - 1; + if (capacity_check(true_len)) { + std::memcpy(buffer.get() + position, true_literal, true_len); + position += true_len; + } + } else { + constexpr char false_literal[] = "false"; + constexpr size_t false_len = sizeof(false_literal) - 1; + if (capacity_check(false_len)) { + std::memcpy(buffer.get() + position, false_literal, false_len); + position += false_len; + } + } + } + else SIMDJSON_IF_CONSTEXPR(std::is_unsigned<number_type>::value) { + // Process 4 digits at a time instead of 2, reducing store operations + // and divisions by approximately half for large numbers. + constexpr size_t max_number_size = 20; + if (capacity_check(max_number_size)) { + using unsigned_type = typename std::make_unsigned<number_type>::type; + unsigned_type pv = static_cast<unsigned_type>(v); + size_t dc = internal::digit_count(pv); + char *write_pointer = buffer.get() + position + dc - 1; + + // Process 4 digits per iteration for large numbers + while (pv >= 10000) { + unsigned_type q = pv / 10000; + unsigned_type r = pv % 10000; + unsigned_type r_hi = r / 100; // High 2 digits of remainder + unsigned_type r_lo = r % 100; // Low 2 digits of remainder + // Write low 2 digits first (rightmost), then high 2 digits + memcpy(write_pointer - 1, &internal::decimal_table[r_lo * 2], 2); + memcpy(write_pointer - 3, &internal::decimal_table[r_hi * 2], 2); + write_pointer -= 4; + pv = q; + } + + // Handle remaining 1-4 digits with original 2-digit loop + while (pv >= 100) { + memcpy(write_pointer - 1, &internal::decimal_table[(pv % 100) * 2], 2); + write_pointer -= 2; + pv /= 100; + } + if (pv >= 10) { + *write_pointer-- = char('0' + (pv % 10)); + pv /= 10; + } + *write_pointer = char('0' + pv); + position += dc; + } + } + else SIMDJSON_IF_CONSTEXPR(std::is_integral<number_type>::value) { + // Same 4-digit batching as unsigned path for signed integers + constexpr size_t max_number_size = 20; + if (capacity_check(max_number_size)) { + using unsigned_type = typename std::make_unsigned<number_type>::type; + bool negative = v < 0; + unsigned_type pv = static_cast<unsigned_type>(v); + if (negative) { + pv = 0 - pv; // the 0 is for Microsoft + } + size_t dc = internal::digit_count(pv); + // by always writing the minus sign, we avoid the branch. + buffer.get()[position] = '-'; + position += negative ? 1 : 0; + char *write_pointer = buffer.get() + position + dc - 1; + + // Process 4 digits per iteration for large numbers + while (pv >= 10000) { + unsigned_type q = pv / 10000; + unsigned_type r = pv % 10000; + unsigned_type r_hi = r / 100; + unsigned_type r_lo = r % 100; + memcpy(write_pointer - 1, &internal::decimal_table[r_lo * 2], 2); + memcpy(write_pointer - 3, &internal::decimal_table[r_hi * 2], 2); + write_pointer -= 4; + pv = q; + } + + // Handle remaining 1-4 digits + while (pv >= 100) { + memcpy(write_pointer - 1, &internal::decimal_table[(pv % 100) * 2], 2); + write_pointer -= 2; + pv /= 100; + } + if (pv >= 10) { + *write_pointer-- = char('0' + (pv % 10)); + pv /= 10; + } + *write_pointer = char('0' + pv); + position += dc; + } + } + else SIMDJSON_IF_CONSTEXPR(std::is_floating_point<number_type>::value) { + constexpr size_t max_number_size = 24; + if (capacity_check(max_number_size)) { + // We could specialize for float. + char *end = simdjson::internal::to_chars(buffer.get() + position, nullptr, + double(v)); + position = end - buffer.get(); + } + } +} + +simdjson_inline void +string_builder::escape_and_append(std::string_view input) noexcept { + // escaping might turn a control character into \x00xx so 6 characters. + if (capacity_check(6 * input.size())) { + position += write_string_escaped(input, buffer.get() + position); + } +} + +simdjson_inline void +string_builder::escape_and_append_with_quotes(std::string_view input) noexcept { + // escaping might turn a control character into \x00xx so 6 characters. + if (capacity_check(2 + 6 * input.size())) { + buffer.get()[position++] = '"'; + position += write_string_escaped(input, buffer.get() + position); + buffer.get()[position++] = '"'; + } +} + +simdjson_inline void +string_builder::escape_and_append_with_quotes(char input) noexcept { + // escaping might turn a control character into \x00xx so 6 characters. + if (capacity_check(2 + 6 * 1)) { + buffer.get()[position++] = '"'; + std::string_view cinput(&input, 1); + position += write_string_escaped(cinput, buffer.get() + position); + buffer.get()[position++] = '"'; + } +} + +simdjson_inline void +string_builder::escape_and_append_with_quotes(const char *input) noexcept { + std::string_view cinput(input); + escape_and_append_with_quotes(cinput); +} +#if SIMDJSON_SUPPORTS_CONCEPTS +template <constevalutil::fixed_string key> +simdjson_inline void string_builder::escape_and_append_with_quotes() noexcept { + escape_and_append_with_quotes(constevalutil::string_constant<key>::value); +} +#endif + +simdjson_inline void string_builder::append_raw(const char *c) noexcept { + size_t len = std::strlen(c); + append_raw(c, len); +} + +simdjson_inline void +string_builder::append_raw(std::string_view input) noexcept { + if (capacity_check(input.size())) { + std::memcpy(buffer.get() + position, input.data(), input.size()); + position += input.size(); + } +} + +simdjson_inline void string_builder::append_raw(const char *str, + size_t len) noexcept { + if (capacity_check(len)) { + std::memcpy(buffer.get() + position, str, len); + position += len; + } +} +#if SIMDJSON_SUPPORTS_CONCEPTS +// Support for optional types (std::optional, etc.) +template <concepts::optional_type T> + requires(!require_custom_serialization<T>) +simdjson_inline void string_builder::append(const T &opt) { + if (opt) { + append(*opt); + } else { + append_null(); + } +} + +template <typename T> + requires(require_custom_serialization<T>) +simdjson_inline void string_builder::append(T &&val) { + serialize(*this, std::forward<T>(val)); +} + +template <typename T> + requires(std::is_convertible<T, std::string_view>::value || + std::is_same<T, const char *>::value) +simdjson_inline void string_builder::append(const T &value) { + escape_and_append_with_quotes(value); +} +#endif + +#if SIMDJSON_SUPPORTS_RANGES && SIMDJSON_SUPPORTS_CONCEPTS +// Support for range-based appending (std::ranges::view, etc.) +template <std::ranges::range R> + requires(!std::is_convertible<R, std::string_view>::value && !require_custom_serialization<R>) +simdjson_inline void string_builder::append(const R &range) noexcept { + auto it = std::ranges::begin(range); + auto end = std::ranges::end(range); + if constexpr (concepts::is_pair<std::ranges::range_value_t<R>>) { + start_object(); + + if (it == end) { + end_object(); + return; // Handle empty range + } + // Append first item without leading comma + append_key_value(it->first, it->second); + ++it; + + // Append remaining items with preceding commas + for (; it != end; ++it) { + append_comma(); + append_key_value(it->first, it->second); + } + end_object(); + } else { + start_array(); + if (it == end) { + end_array(); + return; // Handle empty range + } + + // Append first item without leading comma + append(*it); + ++it; + + // Append remaining items with preceding commas + for (; it != end; ++it) { + append_comma(); + append(*it); + } + end_array(); + } +} + +#endif + +#if SIMDJSON_EXCEPTIONS +simdjson_inline string_builder::operator std::string() const noexcept(false) { + return std::string(operator std::string_view()); +} + +simdjson_inline string_builder::operator std::string_view() const + noexcept(false) simdjson_lifetime_bound { + return view(); +} +#endif + +simdjson_inline simdjson_result<std::string_view> +string_builder::view() const noexcept { + if (!is_valid) { + return simdjson::OUT_OF_CAPACITY; + } + return std::string_view(buffer.get(), position); +} + +simdjson_inline simdjson_result<const char *> string_builder::c_str() noexcept { + if (capacity_check(1)) { + buffer.get()[position] = '\0'; + return buffer.get(); + } + return simdjson::OUT_OF_CAPACITY; +} + +simdjson_inline bool string_builder::validate_unicode() const noexcept { + return simdjson::validate_utf8(buffer.get(), position); +} + +simdjson_inline void string_builder::start_object() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '{'; + } +} + +simdjson_inline void string_builder::end_object() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '}'; + } +} + +simdjson_inline void string_builder::start_array() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '['; + } +} + +simdjson_inline void string_builder::end_array() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ']'; + } +} + +simdjson_inline void string_builder::append_comma() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ','; + } +} + +simdjson_inline void string_builder::append_colon() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ':'; + } +} + +template <typename key_type, typename value_type> +simdjson_inline void +string_builder::append_key_value(key_type key, value_type value) noexcept { + static_assert(std::is_same<key_type, const char *>::value || + std::is_convertible<key_type, std::string_view>::value, + "Unsupported key type"); + escape_and_append_with_quotes(key); + append_colon(); + SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, std::nullptr_t>::value) { + append_null(); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, char>::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR( + std::is_convertible<value_type, std::string_view>::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, const char *>::value) { + escape_and_append_with_quotes(value); + } + else { + append(value); + } +} + +#if SIMDJSON_SUPPORTS_CONCEPTS +template <constevalutil::fixed_string key, typename value_type> +simdjson_inline void +string_builder::append_key_value(value_type value) noexcept { + escape_and_append_with_quotes<key>(); + append_colon(); + SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, std::nullptr_t>::value) { + append_null(); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, char>::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR( + std::is_convertible<value_type, std::string_view>::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, const char *>::value) { + escape_and_append_with_quotes(value); + } + else { + append(value); + } +} +#endif + +} // namespace builder +} // namespace icelake +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_STRING_BUILDER_INL_H +/* end file simdjson/generic/builder/json_string_builder-inl.h for icelake */ + +/* end file simdjson/generic/builder/amalgamated.h for icelake */ +/* including simdjson/icelake/end.h: #include "simdjson/icelake/end.h" */ +/* begin file simdjson/icelake/end.h */ +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#if !SIMDJSON_CAN_ALWAYS_RUN_ICELAKE +SIMDJSON_UNTARGET_REGION +#endif + +/* undefining SIMDJSON_IMPLEMENTATION from "icelake" */ +#undef SIMDJSON_IMPLEMENTATION +/* end file simdjson/icelake/end.h */ + +#endif // SIMDJSON_ICELAKE_BUILDER_H +/* end file simdjson/icelake/builder.h */ +#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(ppc64) +/* including simdjson/ppc64/builder.h: #include "simdjson/ppc64/builder.h" */ +/* begin file simdjson/ppc64/builder.h */ +#ifndef SIMDJSON_PPC64_BUILDER_H +#define SIMDJSON_PPC64_BUILDER_H + +/* including simdjson/ppc64/begin.h: #include "simdjson/ppc64/begin.h" */ +/* begin file simdjson/ppc64/begin.h */ +/* defining SIMDJSON_IMPLEMENTATION to "ppc64" */ +#define SIMDJSON_IMPLEMENTATION ppc64 +/* including simdjson/ppc64/base.h: #include "simdjson/ppc64/base.h" */ +/* begin file simdjson/ppc64/base.h */ +#ifndef SIMDJSON_PPC64_BASE_H +#define SIMDJSON_PPC64_BASE_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +/** + * Implementation for ALTIVEC (PPC64). + */ +namespace ppc64 { + +class implementation; + +namespace { +namespace simd { +template <typename T> struct simd8; +template <typename T> struct simd8x64; +} // namespace simd +} // unnamed namespace + +} // namespace ppc64 +} // namespace simdjson + +#endif // SIMDJSON_PPC64_BASE_H +/* end file simdjson/ppc64/base.h */ +/* including simdjson/ppc64/intrinsics.h: #include "simdjson/ppc64/intrinsics.h" */ +/* begin file simdjson/ppc64/intrinsics.h */ +#ifndef SIMDJSON_PPC64_INTRINSICS_H +#define SIMDJSON_PPC64_INTRINSICS_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +// This should be the correct header whether +// you use visual studio or other compilers. +#include <altivec.h> + +// These are defined by altivec.h in GCC toolchain, it is safe to undef them. +#ifdef bool +#undef bool +#endif + +#ifdef vector +#undef vector +#endif + +static_assert(sizeof(__vector unsigned char) <= simdjson::SIMDJSON_PADDING, "insufficient padding for ppc64"); + +#endif // SIMDJSON_PPC64_INTRINSICS_H +/* end file simdjson/ppc64/intrinsics.h */ +/* including simdjson/ppc64/bitmanipulation.h: #include "simdjson/ppc64/bitmanipulation.h" */ +/* begin file simdjson/ppc64/bitmanipulation.h */ +#ifndef SIMDJSON_PPC64_BITMANIPULATION_H +#define SIMDJSON_PPC64_BITMANIPULATION_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace ppc64 { +namespace { + +// We sometimes call trailing_zero on inputs that are zero, +// but the algorithms do not end up using the returned value. +// Sadly, sanitizers are not smart enough to figure it out. +SIMDJSON_NO_SANITIZE_UNDEFINED +// This function can be used safely even if not all bytes have been +// initialized. +// See issue https://github.com/simdjson/simdjson/issues/1965 +SIMDJSON_NO_SANITIZE_MEMORY +simdjson_inline int trailing_zeroes(uint64_t input_num) { +#if SIMDJSON_REGULAR_VISUAL_STUDIO + unsigned long ret; + // Search the mask data from least significant bit (LSB) + // to the most significant bit (MSB) for a set bit (1). + _BitScanForward64(&ret, input_num); + return (int)ret; +#else // SIMDJSON_REGULAR_VISUAL_STUDIO + return __builtin_ctzll(input_num); +#endif // SIMDJSON_REGULAR_VISUAL_STUDIO +} + +/* result might be undefined when input_num is zero */ +simdjson_inline uint64_t clear_lowest_bit(uint64_t input_num) { + return input_num & (input_num - 1); +} + +/* result might be undefined when input_num is zero */ +simdjson_inline int leading_zeroes(uint64_t input_num) { +#if SIMDJSON_REGULAR_VISUAL_STUDIO + unsigned long leading_zero = 0; + // Search the mask data from most significant bit (MSB) + // to least significant bit (LSB) for a set bit (1). + if (_BitScanReverse64(&leading_zero, input_num)) + return (int)(63 - leading_zero); + else + return 64; +#else + return __builtin_clzll(input_num); +#endif // SIMDJSON_REGULAR_VISUAL_STUDIO +} + +#if SIMDJSON_REGULAR_VISUAL_STUDIO +simdjson_inline int count_ones(uint64_t input_num) { + // note: we do not support legacy 32-bit Windows in this kernel + return __popcnt64(input_num); // Visual Studio wants two underscores +} +#else +simdjson_inline int count_ones(uint64_t input_num) { + return __builtin_popcountll(input_num); +} +#endif + +simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2, + uint64_t *result) { +#if SIMDJSON_REGULAR_VISUAL_STUDIO + *result = value1 + value2; + return *result < value1; +#else + return __builtin_uaddll_overflow(value1, value2, + reinterpret_cast<unsigned long long *>(result)); +#endif +} + +} // unnamed namespace +} // namespace ppc64 +} // namespace simdjson + +#endif // SIMDJSON_PPC64_BITMANIPULATION_H +/* end file simdjson/ppc64/bitmanipulation.h */ +/* including simdjson/ppc64/bitmask.h: #include "simdjson/ppc64/bitmask.h" */ +/* begin file simdjson/ppc64/bitmask.h */ +#ifndef SIMDJSON_PPC64_BITMASK_H +#define SIMDJSON_PPC64_BITMASK_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace ppc64 { +namespace { + +// +// Perform a "cumulative bitwise xor," flipping bits each time a 1 is +// encountered. +// +// For example, prefix_xor(00100100) == 00011100 +// +simdjson_inline uint64_t prefix_xor(uint64_t bitmask) { + // You can use the version below, however gcc sometimes miscompiles + // vec_pmsum_be, it happens somewhere around between 8 and 9th version. + // The performance boost was not noticeable, falling back to a usual + // implementation. + // __vector unsigned long long all_ones = {~0ull, ~0ull}; + // __vector unsigned long long mask = {bitmask, 0}; + // // Clang and GCC return different values for pmsum for ull so cast it to one. + // // Generally it is not specified by ALTIVEC ISA what is returned by + // // vec_pmsum_be. + // #if defined(__LITTLE_ENDIAN__) + // return (uint64_t)(((__vector unsigned long long)vec_pmsum_be(all_ones, mask))[0]); + // #else + // return (uint64_t)(((__vector unsigned long long)vec_pmsum_be(all_ones, mask))[1]); + // #endif + bitmask ^= bitmask << 1; + bitmask ^= bitmask << 2; + bitmask ^= bitmask << 4; + bitmask ^= bitmask << 8; + bitmask ^= bitmask << 16; + bitmask ^= bitmask << 32; + return bitmask; +} + +} // unnamed namespace +} // namespace ppc64 +} // namespace simdjson + +#endif +/* end file simdjson/ppc64/bitmask.h */ +/* including simdjson/ppc64/numberparsing_defs.h: #include "simdjson/ppc64/numberparsing_defs.h" */ +/* begin file simdjson/ppc64/numberparsing_defs.h */ +#ifndef SIMDJSON_PPC64_NUMBERPARSING_DEFS_H +#define SIMDJSON_PPC64_NUMBERPARSING_DEFS_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/intrinsics.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#include <cstring> + +#if defined(__linux__) +#include <byteswap.h> +#elif defined(__FreeBSD__) +#include <sys/endian.h> +#endif + +namespace simdjson { +namespace ppc64 { +namespace numberparsing { + +// we don't have appropriate instructions, so let us use a scalar function +// credit: https://johnnylee-sde.github.io/Fast-numeric-string-to-int/ +/** @private */ +static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) { + uint64_t val; + std::memcpy(&val, chars, sizeof(uint64_t)); +#ifdef __BIG_ENDIAN__ +#if defined(__linux__) + val = bswap_64(val); +#elif defined(__FreeBSD__) + val = bswap64(val); +#endif +#endif + val = (val & 0x0F0F0F0F0F0F0F0F) * 2561 >> 8; + val = (val & 0x00FF00FF00FF00FF) * 6553601 >> 16; + return uint32_t((val & 0x0000FFFF0000FFFF) * 42949672960001 >> 32); +} + +/** @private */ +simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) { + internal::value128 answer; +#if SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS +#if SIMDJSON_IS_ARM64 + // ARM64 has native support for 64-bit multiplications, no need to emultate + answer.high = __umulh(value1, value2); + answer.low = value1 * value2; +#else + answer.low = _umul128(value1, value2, &answer.high); // _umul128 not available on ARM64 +#endif // SIMDJSON_IS_ARM64 +#else // SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS + __uint128_t r = (static_cast<__uint128_t>(value1)) * value2; + answer.low = uint64_t(r); + answer.high = uint64_t(r >> 64); +#endif + return answer; +} + +} // namespace numberparsing +} // namespace ppc64 +} // namespace simdjson + +#ifndef SIMDJSON_SWAR_NUMBER_PARSING +#if SIMDJSON_IS_BIG_ENDIAN +#define SIMDJSON_SWAR_NUMBER_PARSING 0 +#else +#define SIMDJSON_SWAR_NUMBER_PARSING 1 +#endif +#endif + +#endif // SIMDJSON_PPC64_NUMBERPARSING_DEFS_H +/* end file simdjson/ppc64/numberparsing_defs.h */ +/* including simdjson/ppc64/simd.h: #include "simdjson/ppc64/simd.h" */ +/* begin file simdjson/ppc64/simd.h */ +#ifndef SIMDJSON_PPC64_SIMD_H +#define SIMDJSON_PPC64_SIMD_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#include <type_traits> + +namespace simdjson { +namespace ppc64 { +namespace { +namespace simd { + +using __m128i = __vector unsigned char; + +template <typename Child> struct base { + __m128i value; + + // Zero constructor + simdjson_inline base() : value{__m128i()} {} + + // Conversion from SIMD register + simdjson_inline base(const __m128i _value) : value(_value) {} + + // Conversion to SIMD register + simdjson_inline operator const __m128i &() const { + return this->value; + } + simdjson_inline operator __m128i &() { return this->value; } + + // Bit operations + simdjson_inline Child operator|(const Child other) const { + return vec_or(this->value, (__m128i)other); + } + simdjson_inline Child operator&(const Child other) const { + return vec_and(this->value, (__m128i)other); + } + simdjson_inline Child operator^(const Child other) const { + return vec_xor(this->value, (__m128i)other); + } + simdjson_inline Child bit_andnot(const Child other) const { + return vec_andc(this->value, (__m128i)other); + } + simdjson_inline Child &operator|=(const Child other) { + auto this_cast = static_cast<Child*>(this); + *this_cast = *this_cast | other; + return *this_cast; + } + simdjson_inline Child &operator&=(const Child other) { + auto this_cast = static_cast<Child*>(this); + *this_cast = *this_cast & other; + return *this_cast; + } + simdjson_inline Child &operator^=(const Child other) { + auto this_cast = static_cast<Child*>(this); + *this_cast = *this_cast ^ other; + return *this_cast; + } +}; + +template <typename T, typename Mask = simd8<bool>> +struct base8 : base<simd8<T>> { + typedef uint16_t bitmask_t; + typedef uint32_t bitmask2_t; + + simdjson_inline base8() : base<simd8<T>>() {} + simdjson_inline base8(const __m128i _value) : base<simd8<T>>(_value) {} + + friend simdjson_inline Mask operator==(const simd8<T> lhs, const simd8<T> rhs) { + return (__m128i)vec_cmpeq(lhs.value, (__m128i)rhs); + } + + static const int SIZE = sizeof(base<simd8<T>>::value); + + template <int N = 1> + simdjson_inline simd8<T> prev(simd8<T> prev_chunk) const { + __m128i chunk = this->value; +#ifdef __LITTLE_ENDIAN__ + chunk = (__m128i)vec_reve(this->value); + prev_chunk = (__m128i)vec_reve((__m128i)prev_chunk); +#endif + chunk = (__m128i)vec_sld((__m128i)prev_chunk, (__m128i)chunk, 16 - N); +#ifdef __LITTLE_ENDIAN__ + chunk = (__m128i)vec_reve((__m128i)chunk); +#endif + return chunk; + } +}; + +// SIMD byte mask type (returned by things like eq and gt) +template <> struct simd8<bool> : base8<bool> { + static simdjson_inline simd8<bool> splat(bool _value) { + return (__m128i)vec_splats((unsigned char)(-(!!_value))); + } + + simdjson_inline simd8() : base8<bool>() {} + simdjson_inline simd8(const __m128i _value) + : base8<bool>(_value) {} + // Splat constructor + simdjson_inline simd8(bool _value) + : base8<bool>(splat(_value)) {} + + simdjson_inline int to_bitmask() const { + __vector unsigned long long result; + const __m128i perm_mask = {0x78, 0x70, 0x68, 0x60, 0x58, 0x50, 0x48, 0x40, + 0x38, 0x30, 0x28, 0x20, 0x18, 0x10, 0x08, 0x00}; + + result = ((__vector unsigned long long)vec_vbpermq((__m128i)this->value, + (__m128i)perm_mask)); +#ifdef __LITTLE_ENDIAN__ + return static_cast<int>(result[1]); +#else + return static_cast<int>(result[0]); +#endif + } + simdjson_inline bool any() const { + return !vec_all_eq(this->value, (__m128i)vec_splats(0)); + } + simdjson_inline simd8<bool> operator~() const { + return this->value ^ (__m128i)splat(true); + } +}; + +template <typename T> struct base8_numeric : base8<T> { + static simdjson_inline simd8<T> splat(T value) { + (void)value; + return (__m128i)vec_splats(value); + } + static simdjson_inline simd8<T> zero() { return splat(0); } + static simdjson_inline simd8<T> load(const T values[16]) { + return (__m128i)(vec_vsx_ld(0, reinterpret_cast<const uint8_t *>(values))); + } + // Repeat 16 values as many times as necessary (usually for lookup tables) + static simdjson_inline simd8<T> repeat_16(T v0, T v1, T v2, T v3, T v4, + T v5, T v6, T v7, T v8, T v9, + T v10, T v11, T v12, T v13, + T v14, T v15) { + return simd8<T>(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, + v14, v15); + } + + simdjson_inline base8_numeric() : base8<T>() {} + simdjson_inline base8_numeric(const __m128i _value) + : base8<T>(_value) {} + + // Store to array + simdjson_inline void store(T dst[16]) const { + vec_vsx_st(this->value, 0, reinterpret_cast<__m128i *>(dst)); + } + + // Override to distinguish from bool version + simdjson_inline simd8<T> operator~() const { return *this ^ 0xFFu; } + + // Addition/subtraction are the same for signed and unsigned + simdjson_inline simd8<T> operator+(const simd8<T> other) const { + return (__m128i)((__m128i)this->value + (__m128i)other); + } + simdjson_inline simd8<T> operator-(const simd8<T> other) const { + return (__m128i)((__m128i)this->value - (__m128i)other); + } + simdjson_inline simd8<T> &operator+=(const simd8<T> other) { + *this = *this + other; + return *static_cast<simd8<T> *>(this); + } + simdjson_inline simd8<T> &operator-=(const simd8<T> other) { + *this = *this - other; + return *static_cast<simd8<T> *>(this); + } + + // Perform a lookup assuming the value is between 0 and 16 (undefined behavior + // for out of range values) + template <typename L> + simdjson_inline simd8<L> lookup_16(simd8<L> lookup_table) const { + return (__m128i)vec_perm((__m128i)lookup_table, (__m128i)lookup_table, this->value); + } + + // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted + // as a bitset). Passing a 0 value for mask would be equivalent to writing out + // every byte to output. Only the first 16 - count_ones(mask) bytes of the + // result are significant but 16 bytes get written. Design consideration: it + // seems like a function with the signature simd8<L> compress(uint32_t mask) + // would be sensible, but the AVX ISA makes this kind of approach difficult. + template <typename L> + simdjson_inline void compress(uint16_t mask, L *output) const { + using internal::BitsSetTable256mul2; + using internal::pshufb_combine_table; + using internal::thintable_epi8; + // this particular implementation was inspired by work done by @animetosho + // we do it in two steps, first 8 bytes and then second 8 bytes + uint8_t mask1 = uint8_t(mask); // least significant 8 bits + uint8_t mask2 = uint8_t(mask >> 8); // most significant 8 bits + // next line just loads the 64-bit values thintable_epi8[mask1] and + // thintable_epi8[mask2] into a 128-bit register, using only + // two instructions on most compilers. +#ifdef __LITTLE_ENDIAN__ + __m128i shufmask = (__m128i)(__vector unsigned long long){ + thintable_epi8[mask1], thintable_epi8[mask2]}; +#else + __m128i shufmask = (__m128i)(__vector unsigned long long){ + thintable_epi8[mask2], thintable_epi8[mask1]}; + shufmask = (__m128i)vec_reve((__m128i)shufmask); +#endif + // we increment by 0x08 the second half of the mask + shufmask = ((__m128i)shufmask) + + ((__m128i)(__vector int){0, 0, 0x08080808, 0x08080808}); + + // this is the version "nearly pruned" + __m128i pruned = vec_perm(this->value, this->value, shufmask); + // we still need to put the two halves together. + // we compute the popcount of the first half: + int pop1 = BitsSetTable256mul2[mask1]; + // then load the corresponding mask, what it does is to write + // only the first pop1 bytes from the first 8 bytes, and then + // it fills in with the bytes from the second 8 bytes + some filling + // at the end. + __m128i compactmask = + vec_vsx_ld(0, reinterpret_cast<const uint8_t *>(pshufb_combine_table + pop1 * 8)); + __m128i answer = vec_perm(pruned, (__m128i)vec_splats(0), compactmask); + vec_vsx_st(answer, 0, reinterpret_cast<__m128i *>(output)); + } + + template <typename L> + simdjson_inline simd8<L> + lookup_16(L replace0, L replace1, L replace2, L replace3, L replace4, + L replace5, L replace6, L replace7, L replace8, L replace9, + L replace10, L replace11, L replace12, L replace13, L replace14, + L replace15) const { + return lookup_16(simd8<L>::repeat_16( + replace0, replace1, replace2, replace3, replace4, replace5, replace6, + replace7, replace8, replace9, replace10, replace11, replace12, + replace13, replace14, replace15)); + } +}; + +// Signed bytes +template <> struct simd8<int8_t> : base8_numeric<int8_t> { + simdjson_inline simd8() : base8_numeric<int8_t>() {} + simdjson_inline simd8(const __m128i _value) + : base8_numeric<int8_t>(_value) {} + // Splat constructor + simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {} + // Array constructor + simdjson_inline simd8(const int8_t *values) : simd8(load(values)) {} + // Member-by-member initialization + simdjson_inline simd8(int8_t v0, int8_t v1, int8_t v2, int8_t v3, + int8_t v4, int8_t v5, int8_t v6, int8_t v7, + int8_t v8, int8_t v9, int8_t v10, int8_t v11, + int8_t v12, int8_t v13, int8_t v14, int8_t v15) + : simd8((__m128i)(__vector signed char){v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10, v11, v12, v13, v14, + v15}) {} + // Repeat 16 values as many times as necessary (usually for lookup tables) + simdjson_inline static simd8<int8_t> + repeat_16(int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, + int8_t v6, int8_t v7, int8_t v8, int8_t v9, int8_t v10, int8_t v11, + int8_t v12, int8_t v13, int8_t v14, int8_t v15) { + return simd8<int8_t>(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, + v13, v14, v15); + } + + // Order-sensitive comparisons + simdjson_inline simd8<int8_t> + max_val(const simd8<int8_t> other) const { + return (__m128i)vec_max((__vector signed char)this->value, + (__vector signed char)(__m128i)other); + } + simdjson_inline simd8<int8_t> + min_val(const simd8<int8_t> other) const { + return (__m128i)vec_min((__vector signed char)this->value, + (__vector signed char)(__m128i)other); + } + simdjson_inline simd8<bool> + operator>(const simd8<int8_t> other) const { + return (__m128i)vec_cmpgt((__vector signed char)this->value, + (__vector signed char)(__m128i)other); + } + simdjson_inline simd8<bool> + operator<(const simd8<int8_t> other) const { + return (__m128i)vec_cmplt((__vector signed char)this->value, + (__vector signed char)(__m128i)other); + } +}; + +// Unsigned bytes +template <> struct simd8<uint8_t> : base8_numeric<uint8_t> { + simdjson_inline simd8() : base8_numeric<uint8_t>() {} + simdjson_inline simd8(const __m128i _value) + : base8_numeric<uint8_t>(_value) {} + // Splat constructor + simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {} + // Array constructor + simdjson_inline simd8(const uint8_t *values) : simd8(load(values)) {} + // Member-by-member initialization + simdjson_inline + simd8(uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, + uint8_t v6, uint8_t v7, uint8_t v8, uint8_t v9, uint8_t v10, + uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15) + : simd8((__m128i){v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, + v13, v14, v15}) {} + // Repeat 16 values as many times as necessary (usually for lookup tables) + simdjson_inline static simd8<uint8_t> + repeat_16(uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, + uint8_t v5, uint8_t v6, uint8_t v7, uint8_t v8, uint8_t v9, + uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, + uint8_t v15) { + return simd8<uint8_t>(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, + v13, v14, v15); + } + + // Saturated math + simdjson_inline simd8<uint8_t> + saturating_add(const simd8<uint8_t> other) const { + return (__m128i)vec_adds(this->value, (__m128i)other); + } + simdjson_inline simd8<uint8_t> + saturating_sub(const simd8<uint8_t> other) const { + return (__m128i)vec_subs(this->value, (__m128i)other); + } + + // Order-specific operations + simdjson_inline simd8<uint8_t> + max_val(const simd8<uint8_t> other) const { + return (__m128i)vec_max(this->value, (__m128i)other); + } + simdjson_inline simd8<uint8_t> + min_val(const simd8<uint8_t> other) const { + return (__m128i)vec_min(this->value, (__m128i)other); + } + // Same as >, but only guarantees true is nonzero (< guarantees true = -1) + simdjson_inline simd8<uint8_t> + gt_bits(const simd8<uint8_t> other) const { + return this->saturating_sub(other); + } + // Same as <, but only guarantees true is nonzero (< guarantees true = -1) + simdjson_inline simd8<uint8_t> + lt_bits(const simd8<uint8_t> other) const { + return other.saturating_sub(*this); + } + simdjson_inline simd8<bool> + operator<=(const simd8<uint8_t> other) const { + return other.max_val(*this) == other; + } + simdjson_inline simd8<bool> + operator>=(const simd8<uint8_t> other) const { + return other.min_val(*this) == other; + } + simdjson_inline simd8<bool> + operator>(const simd8<uint8_t> other) const { + return this->gt_bits(other).any_bits_set(); + } + simdjson_inline simd8<bool> + operator<(const simd8<uint8_t> other) const { + return this->gt_bits(other).any_bits_set(); + } + + // Bit-specific operations + simdjson_inline simd8<bool> bits_not_set() const { + return (__m128i)vec_cmpeq(this->value, (__m128i)vec_splats(uint8_t(0))); + } + simdjson_inline simd8<bool> bits_not_set(simd8<uint8_t> bits) const { + return (*this & bits).bits_not_set(); + } + simdjson_inline simd8<bool> any_bits_set() const { + return ~this->bits_not_set(); + } + simdjson_inline simd8<bool> any_bits_set(simd8<uint8_t> bits) const { + return ~this->bits_not_set(bits); + } + simdjson_inline bool bits_not_set_anywhere() const { + return vec_all_eq(this->value, (__m128i)vec_splats(0)); + } + simdjson_inline bool any_bits_set_anywhere() const { + return !bits_not_set_anywhere(); + } + simdjson_inline bool bits_not_set_anywhere(simd8<uint8_t> bits) const { + return vec_all_eq(vec_and(this->value, (__m128i)bits), + (__m128i)vec_splats(0)); + } + simdjson_inline bool any_bits_set_anywhere(simd8<uint8_t> bits) const { + return !bits_not_set_anywhere(bits); + } + template <int N> simdjson_inline simd8<uint8_t> shr() const { + return simd8<uint8_t>( + (__m128i)vec_sr(this->value, (__m128i)vec_splat_u8(N))); + } + template <int N> simdjson_inline simd8<uint8_t> shl() const { + return simd8<uint8_t>( + (__m128i)vec_sl(this->value, (__m128i)vec_splat_u8(N))); + } +}; + +template <typename T> struct simd8x64 { + static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<T>); + static_assert(NUM_CHUNKS == 4, + "PPC64 kernel should use four registers per 64-byte block."); + const simd8<T> chunks[NUM_CHUNKS]; + template<int idx> simd8<uint8_t> get() const { return idx < NUM_CHUNKS ? chunks[idx] : simd8<T>(); } + + simd8x64(const simd8x64<T> &o) = delete; // no copy allowed + simd8x64<T> & + operator=(const simd8<T>& other) = delete; // no assignment allowed + simd8x64() = delete; // no default constructor allowed + + simdjson_inline simd8x64(const simd8<T> chunk0, const simd8<T> chunk1, + const simd8<T> chunk2, const simd8<T> chunk3) + : chunks{chunk0, chunk1, chunk2, chunk3} {} + simdjson_inline simd8x64(const T ptr[64]) + : chunks{simd8<T>::load(ptr), simd8<T>::load(ptr + 16), + simd8<T>::load(ptr + 32), simd8<T>::load(ptr + 48)} {} + + simdjson_inline void store(T ptr[64]) const { + this->chunks[0].store(ptr + sizeof(simd8<T>) * 0); + this->chunks[1].store(ptr + sizeof(simd8<T>) * 1); + this->chunks[2].store(ptr + sizeof(simd8<T>) * 2); + this->chunks[3].store(ptr + sizeof(simd8<T>) * 3); + } + + simdjson_inline simd8<T> reduce_or() const { + return (this->chunks[0] | this->chunks[1]) | + (this->chunks[2] | this->chunks[3]); + } + + simdjson_inline uint64_t compress(uint64_t mask, T *output) const { + this->chunks[0].compress(uint16_t(mask), output); + this->chunks[1].compress(uint16_t(mask >> 16), + output + 16 - count_ones(mask & 0xFFFF)); + this->chunks[2].compress(uint16_t(mask >> 32), + output + 32 - count_ones(mask & 0xFFFFFFFF)); + this->chunks[3].compress(uint16_t(mask >> 48), + output + 48 - count_ones(mask & 0xFFFFFFFFFFFF)); + return 64 - count_ones(mask); + } + + simdjson_inline uint64_t to_bitmask() const { + uint64_t r0 = uint32_t(this->chunks[0].to_bitmask()); + uint64_t r1 = this->chunks[1].to_bitmask(); + uint64_t r2 = this->chunks[2].to_bitmask(); + uint64_t r3 = this->chunks[3].to_bitmask(); + return r0 | (r1 << 16) | (r2 << 32) | (r3 << 48); + } + + simdjson_inline uint64_t eq(const T m) const { + const simd8<T> mask = simd8<T>::splat(m); + return simd8x64<bool>(this->chunks[0] == mask, this->chunks[1] == mask, + this->chunks[2] == mask, this->chunks[3] == mask) + .to_bitmask(); + } + + simdjson_inline uint64_t eq(const simd8x64<uint8_t> &other) const { + return simd8x64<bool>(this->chunks[0] == other.chunks[0], + this->chunks[1] == other.chunks[1], + this->chunks[2] == other.chunks[2], + this->chunks[3] == other.chunks[3]) + .to_bitmask(); + } + + simdjson_inline uint64_t lteq(const T m) const { + const simd8<T> mask = simd8<T>::splat(m); + return simd8x64<bool>(this->chunks[0] <= mask, this->chunks[1] <= mask, + this->chunks[2] <= mask, this->chunks[3] <= mask) + .to_bitmask(); + } +}; // struct simd8x64<T> + +} // namespace simd +} // unnamed namespace +} // namespace ppc64 +} // namespace simdjson + +#endif // SIMDJSON_PPC64_SIMD_INPUT_H +/* end file simdjson/ppc64/simd.h */ +/* including simdjson/ppc64/stringparsing_defs.h: #include "simdjson/ppc64/stringparsing_defs.h" */ +/* begin file simdjson/ppc64/stringparsing_defs.h */ +#ifndef SIMDJSON_PPC64_STRINGPARSING_DEFS_H +#define SIMDJSON_PPC64_STRINGPARSING_DEFS_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/simd.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace ppc64 { +namespace { + +using namespace simd; + +// Holds backslashes and quotes locations. +struct backslash_and_quote { +public: + static constexpr uint32_t BYTES_PROCESSED = 32; + simdjson_inline backslash_and_quote + copy_and_find(const uint8_t *src, uint8_t *dst); + + simdjson_inline bool has_quote_first() { + return ((bs_bits - 1) & quote_bits) != 0; + } + simdjson_inline bool has_backslash() { return bs_bits != 0; } + simdjson_inline int quote_index() { + return trailing_zeroes(quote_bits); + } + simdjson_inline int backslash_index() { + return trailing_zeroes(bs_bits); + } + + uint32_t bs_bits; + uint32_t quote_bits; +}; // struct backslash_and_quote + +simdjson_inline backslash_and_quote +backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) { + // this can read up to 31 bytes beyond the buffer size, but we require + // SIMDJSON_PADDING of padding + static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), + "backslash and quote finder must process fewer than " + "SIMDJSON_PADDING bytes"); + simd8<uint8_t> v0(src); + simd8<uint8_t> v1(src + sizeof(v0)); + v0.store(dst); + v1.store(dst + sizeof(v0)); + + // Getting a 64-bit bitmask is much cheaper than multiple 16-bit bitmasks on + // PPC; therefore, we smash them together into a 64-byte mask and get the + // bitmask from there. + uint64_t bs_and_quote = + simd8x64<bool>(v0 == '\\', v1 == '\\', v0 == '"', v1 == '"').to_bitmask(); + return { + uint32_t(bs_and_quote), // bs_bits + uint32_t(bs_and_quote >> 32) // quote_bits + }; +} + + +struct escaping { + static constexpr uint32_t BYTES_PROCESSED = 16; + simdjson_inline static escaping copy_and_find(const uint8_t *src, uint8_t *dst); + + simdjson_inline bool has_escape() { return escape_bits != 0; } + simdjson_inline int escape_index() { return trailing_zeroes(escape_bits); } + + uint64_t escape_bits; +}; // struct escaping + + + +simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *dst) { + static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "escaping finder must process fewer than SIMDJSON_PADDING bytes"); + simd8<uint8_t> v(src); + v.store(dst); + simd8<bool> is_quote = (v == '"'); + simd8<bool> is_backslash = (v == '\\'); + simd8<bool> is_control = (v < 32); + return { + // We store it as a 64-bit bitmask even though we only need 16 bits. + uint64_t((is_backslash | is_quote | is_control).to_bitmask()) + }; +} + +} // unnamed namespace +} // namespace ppc64 +} // namespace simdjson + +#endif // SIMDJSON_PPC64_STRINGPARSING_DEFS_H +/* end file simdjson/ppc64/stringparsing_defs.h */ + +#define SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT 1 +/* end file simdjson/ppc64/begin.h */ +/* including simdjson/generic/builder/amalgamated.h for ppc64: #include "simdjson/generic/builder/amalgamated.h" */ +/* begin file simdjson/generic/builder/amalgamated.h for ppc64 */ +#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_BUILDER_DEPENDENCIES_H) +#error simdjson/generic/builder/dependencies.h must be included before simdjson/generic/builder/amalgamated.h! +#endif + +/* including simdjson/generic/builder/json_string_builder.h for ppc64: #include "simdjson/generic/builder/json_string_builder.h" */ +/* begin file simdjson/generic/builder/json_string_builder.h for ppc64 */ +#ifndef SIMDJSON_GENERIC_STRING_BUILDER_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { + + +#if SIMDJSON_SUPPORTS_CONCEPTS + +namespace ppc64 { +namespace builder { + class string_builder; +}} + +template <typename T, typename = void> +struct has_custom_serialization : std::false_type {}; + +inline constexpr struct serialize_tag { + template <typename T> + constexpr void operator()(ppc64::builder::string_builder& b, T&& obj) const{ + return tag_invoke(*this, b, std::forward<T>(obj)); + } + + +} serialize{}; +template <typename T> +struct has_custom_serialization<T, std::void_t< + decltype(tag_invoke(serialize, std::declval<ppc64::builder::string_builder&>(), std::declval<T&>())) +>> : std::true_type {}; + +template <typename T> +constexpr bool require_custom_serialization = has_custom_serialization<T>::value; +#else +struct has_custom_serialization : std::false_type {}; +#endif // SIMDJSON_SUPPORTS_CONCEPTS + +namespace ppc64 { +namespace builder { +/** + * A builder for JSON strings representing documents. This is a low-level + * builder that is not meant to be used directly by end-users. Though it + * supports atomic types (Booleans, strings), it does not support composed + * types (arrays and objects). + * + * Ultimately, this class can support kernel-specific optimizations. E.g., + * it may make use of SIMD instructions to escape strings faster. + */ +class string_builder { +public: + simdjson_inline string_builder(size_t initial_capacity = DEFAULT_INITIAL_CAPACITY); + + static constexpr size_t DEFAULT_INITIAL_CAPACITY = 1024; + + /** + * Append number (includes Booleans). Booleans are mapped to the strings + * false and true. Numbers are converted to strings abiding by the JSON standard. + * Floating-point numbers are converted to the shortest string that 'correctly' + * represents the number. + */ + template<typename number_type, + typename = typename std::enable_if<std::is_arithmetic<number_type>::value>::type> + simdjson_inline void append(number_type v) noexcept; + + /** + * Append character c. + */ + simdjson_inline void append(char c) noexcept; + + /** + * Append the string 'null'. + */ + simdjson_inline void append_null() noexcept; + + /** + * Clear the content. + */ + simdjson_inline void clear() noexcept; + + /** + * Append the std::string_view, after escaping it. + * There is no UTF-8 validation. + */ + simdjson_inline void escape_and_append(std::string_view input) noexcept; + + /** + * Append the std::string_view surrounded by double quotes, after escaping it. + * There is no UTF-8 validation. + */ + simdjson_inline void escape_and_append_with_quotes(std::string_view input) noexcept; +#if SIMDJSON_SUPPORTS_CONCEPTS + template<constevalutil::fixed_string key> + simdjson_inline void escape_and_append_with_quotes() noexcept; +#endif + /** + * Append the character surrounded by double quotes, after escaping it. + * There is no UTF-8 validation. + */ + simdjson_inline void escape_and_append_with_quotes(char input) noexcept; + + /** + * Append the character surrounded by double quotes, after escaping it. + * There is no UTF-8 validation. + */ + simdjson_inline void escape_and_append_with_quotes(const char* input) noexcept; + + /** + * Append the C string directly, without escaping. + * There is no UTF-8 validation. + */ + simdjson_inline void append_raw(const char *c) noexcept; + + /** + * Append "{" to the buffer. + */ + simdjson_inline void start_object() noexcept; + + /** + * Append "}" to the buffer. + */ + simdjson_inline void end_object() noexcept; + + /** + * Append "[" to the buffer. + */ + simdjson_inline void start_array() noexcept; + + /** + * Append "]" to the buffer. + */ + simdjson_inline void end_array() noexcept; + + /** + * Append "," to the buffer. + */ + simdjson_inline void append_comma() noexcept; + + /** + * Append ":" to the buffer. + */ + simdjson_inline void append_colon() noexcept; + + /** + * Append a key-value pair to the buffer. + * The key is escaped and surrounded by double quotes. + * The value is escaped if it is a string. + */ + template<typename key_type, typename value_type> + simdjson_inline void append_key_value(key_type key, value_type value) noexcept; +#if SIMDJSON_SUPPORTS_CONCEPTS + template<constevalutil::fixed_string key, typename value_type> + simdjson_inline void append_key_value(value_type value) noexcept; + + // Support for optional types (std::optional, etc.) + template <concepts::optional_type T> + requires(!require_custom_serialization<T>) + simdjson_inline void append(const T &opt); + + template <typename T> + requires(require_custom_serialization<T>) + simdjson_inline void append(T &&val); + + // Support for string-like types + template <typename T> + requires(std::is_convertible<T, std::string_view>::value || + std::is_same<T, const char*>::value ) + simdjson_inline void append(const T &value); +#endif +#if SIMDJSON_SUPPORTS_RANGES && SIMDJSON_SUPPORTS_CONCEPTS + // Support for range-based appending (std::ranges::view, etc.) + template <std::ranges::range R> +requires (!std::is_convertible<R, std::string_view>::value && !require_custom_serialization<R>) + simdjson_inline void append(const R &range) noexcept; +#endif + /** + * Append the std::string_view directly, without escaping. + * There is no UTF-8 validation. + */ + simdjson_inline void append_raw(std::string_view input) noexcept; + + /** + * Append len characters from str. + * There is no UTF-8 validation. + */ + simdjson_inline void append_raw(const char *str, size_t len) noexcept; +#if SIMDJSON_EXCEPTIONS + /** + * Creates an std::string from the written JSON buffer. + * Throws if memory allocation failed + * + * The result may not be valid UTF-8 if some of your content was not valid UTF-8. + * Use validate_unicode() to check the content if needed. + */ + simdjson_inline operator std::string() const noexcept(false); + + /** + * Creates an std::string_view from the written JSON buffer. + * Throws if memory allocation failed. + * + * The result may not be valid UTF-8 if some of your content was not valid UTF-8. + * Use validate_unicode() to check the content if needed. + */ + simdjson_inline operator std::string_view() const noexcept(false) simdjson_lifetime_bound; +#endif + + /** + * Returns a view on the written JSON buffer. Returns an error + * if memory allocation failed. + * + * The result may not be valid UTF-8 if some of your content was not valid UTF-8. + * Use validate_unicode() to check the content. + */ + simdjson_inline simdjson_result<std::string_view> view() const noexcept; + + /** + * Appends the null character to the buffer and returns + * a pointer to the beginning of the written JSON buffer. + * Returns an error if memory allocation failed. + * The result is null-terminated. + * + * The result may not be valid UTF-8 if some of your content was not valid UTF-8. + * Use validate_unicode() to check the content. + */ + simdjson_inline simdjson_result<const char *> c_str() noexcept; + + /** + * Return true if the content is valid UTF-8. + */ + simdjson_inline bool validate_unicode() const noexcept; + + /** + * Returns the current size of the written JSON buffer. + * If an error occurred, returns 0. + */ + simdjson_inline size_t size() const noexcept; + +private: + /** + * Returns true if we can write at least upcoming_bytes bytes. + * The underlying buffer is reallocated if needed. It is designed + * to be called before writing to the buffer. It should be fast. + */ + simdjson_inline bool capacity_check(size_t upcoming_bytes); + + /** + * Grow the buffer to at least desired_capacity bytes. + * If the allocation fails, is_valid is set to false. We expect + * that this function would not be repeatedly called. + */ + simdjson_inline void grow_buffer(size_t desired_capacity); + + /** + * We use this helper function to make sure that is_valid is kept consistent. + */ + simdjson_inline void set_valid(bool valid) noexcept; + + std::unique_ptr<char[]> buffer{}; + size_t position{0}; + size_t capacity{0}; + bool is_valid{true}; +}; + + + +} +} + + +#if !SIMDJSON_STATIC_REFLECTION +// fallback implementation until we have static reflection +template <class Z> +simdjson_warn_unused simdjson_result<std::string> to_json(const Z &z, size_t initial_capacity = simdjson::ppc64::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + simdjson::ppc64::builder::string_builder b(initial_capacity); + b.append(z); + std::string_view s; + auto e = b.view().get(s); + if(e) { return e; } + return std::string(s); +} +template <class Z> +simdjson_warn_unused error_code to_json(const Z &z, std::string &s, size_t initial_capacity = simdjson::ppc64::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + simdjson::ppc64::builder::string_builder b(initial_capacity); + b.append(z); + std::string_view sv; + auto e = b.view().get(sv); + if(e) { return e; } + s.assign(sv.data(), sv.size()); + return simdjson::SUCCESS; +} +#endif + +#if SIMDJSON_SUPPORTS_CONCEPTS +#endif // SIMDJSON_SUPPORTS_CONCEPTS + +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_STRING_BUILDER_H +/* end file simdjson/generic/builder/json_string_builder.h for ppc64 */ +/* including simdjson/generic/builder/json_builder.h for ppc64: #include "simdjson/generic/builder/json_builder.h" */ +/* begin file simdjson/generic/builder/json_builder.h for ppc64 */ +#ifndef SIMDJSON_GENERIC_BUILDER_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_string_builder.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/concepts.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ +#if SIMDJSON_STATIC_REFLECTION + +#include <charconv> +#include <cstring> +#include <meta> +#include <memory> +#include <optional> +#include <string_view> +#include <type_traits> +#include <utility> +// #include <static_reflection> // for std::define_static_string - header not available yet + +namespace simdjson { +namespace ppc64 { +namespace builder { + +template <class T> + requires(concepts::container_but_not_string<T> && !require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &t) { + auto it = t.begin(); + auto end = t.end(); + if (it == end) { + b.append_raw("[]"); + return; + } + b.append('['); + atom(b, *it); + ++it; + for (; it != end; ++it) { + b.append(','); + atom(b, *it); + } + b.append(']'); +} + +template <class T> + requires(std::is_same_v<T, std::string> || + std::is_same_v<T, std::string_view> || + std::is_same_v<T, const char *> || + std::is_same_v<T, char>) +constexpr void atom(string_builder &b, const T &t) { + b.escape_and_append_with_quotes(t); +} + +template <concepts::string_view_keyed_map T> + requires(!require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &m) { + if (m.empty()) { + b.append_raw("{}"); + return; + } + b.append('{'); + bool first = true; + for (const auto& [key, value] : m) { + if (!first) { + b.append(','); + } + first = false; + // Keys must be convertible to string_view per the concept + b.escape_and_append_with_quotes(key); + b.append(':'); + atom(b, value); + } + b.append('}'); +} + + +template<typename number_type, + typename = typename std::enable_if<std::is_arithmetic<number_type>::value && !std::is_same_v<number_type, char>>::type> +constexpr void atom(string_builder &b, const number_type t) { + b.append(t); +} + +template <class T> + requires(std::is_class_v<T> && !concepts::container_but_not_string<T> && + !concepts::string_view_keyed_map<T> && + !concepts::optional_type<T> && + !concepts::smart_pointer<T> && + !concepts::appendable_containers<T> && + !std::is_same_v<T, std::string> && + !std::is_same_v<T, std::string_view> && + !std::is_same_v<T, const char*> && + !std::is_same_v<T, char> && !require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &t) { + int i = 0; + b.append('{'); + template for (constexpr auto dm : std::define_static_array(std::meta::nonstatic_data_members_of(^^T, std::meta::access_context::unchecked()))) { + if (i != 0) + b.append(','); + constexpr auto key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(dm))); + b.append_raw(key); + b.append(':'); + atom(b, t.[:dm:]); + i++; + }; + b.append('}'); +} + +// Support for optional types (std::optional, etc.) +template <concepts::optional_type T> + requires(!require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &opt) { + if (opt) { + atom(b, opt.value()); + } else { + b.append_raw("null"); + } +} + +// Support for smart pointers (std::unique_ptr, std::shared_ptr, etc.) +template <concepts::smart_pointer T> + requires(!require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &ptr) { + if (ptr) { + atom(b, *ptr); + } else { + b.append_raw("null"); + } +} + +// Support for enums - serialize as string representation using expand approach from P2996R12 +template <typename T> + requires(std::is_enum_v<T> && !require_custom_serialization<T>) +void atom(string_builder &b, const T &e) { +#if SIMDJSON_STATIC_REFLECTION + constexpr auto enumerators = std::define_static_array(std::meta::enumerators_of(^^T)); + template for (constexpr auto enum_val : enumerators) { + constexpr auto enum_str = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(enum_val))); + if (e == [:enum_val:]) { + b.append_raw(enum_str); + return; + } + }; + // Fallback to integer if enum value not found + atom(b, static_cast<std::underlying_type_t<T>>(e)); +#else + // Fallback: serialize as integer if reflection not available + atom(b, static_cast<std::underlying_type_t<T>>(e)); +#endif +} + +// Support for appendable containers that don't have operator[] (sets, etc.) +template <concepts::appendable_containers T> + requires(!concepts::container_but_not_string<T> && !concepts::string_view_keyed_map<T> && + !concepts::optional_type<T> && !concepts::smart_pointer<T> && + !std::is_same_v<T, std::string> && + !std::is_same_v<T, std::string_view> && !std::is_same_v<T, const char*> && !require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &container) { + if (container.empty()) { + b.append_raw("[]"); + return; + } + b.append('['); + bool first = true; + for (const auto& item : container) { + if (!first) { + b.append(','); + } + first = false; + atom(b, item); + } + b.append(']'); +} + +// append functions that delegate to atom functions for primitive types +template <class T> + requires(std::is_arithmetic_v<T> && !std::is_same_v<T, char>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +template <class T> + requires(std::is_same_v<T, std::string> || + std::is_same_v<T, std::string_view> || + std::is_same_v<T, const char *> || + std::is_same_v<T, char>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +template <concepts::optional_type T> + requires(!require_custom_serialization<T>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +template <concepts::smart_pointer T> + requires(!require_custom_serialization<T>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +template <concepts::appendable_containers T> + requires(!concepts::container_but_not_string<T> && !concepts::string_view_keyed_map<T> && + !concepts::optional_type<T> && !concepts::smart_pointer<T> && + !std::is_same_v<T, std::string> && + !std::is_same_v<T, std::string_view> && !std::is_same_v<T, const char*> && !require_custom_serialization<T>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +template <concepts::string_view_keyed_map T> + requires(!require_custom_serialization<T>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +// works for struct +template <class Z> + requires(std::is_class_v<Z> && !concepts::container_but_not_string<Z> && + !concepts::string_view_keyed_map<Z> && + !concepts::optional_type<Z> && + !concepts::smart_pointer<Z> && + !concepts::appendable_containers<Z> && + !std::is_same_v<Z, std::string> && + !std::is_same_v<Z, std::string_view> && + !std::is_same_v<Z, const char*> && + !std::is_same_v<Z, char> && !require_custom_serialization<Z>) +void append(string_builder &b, const Z &z) { + int i = 0; + b.append('{'); + template for (constexpr auto dm : std::define_static_array(std::meta::nonstatic_data_members_of(^^Z, std::meta::access_context::unchecked()))) { + if (i != 0) + b.append(','); + constexpr auto key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(dm))); + b.append_raw(key); + b.append(':'); + atom(b, z.[:dm:]); + i++; + }; + b.append('}'); +} + +// works for container that have begin() and end() iterators +template <class Z> + requires(concepts::container_but_not_string<Z> && !require_custom_serialization<Z>) +void append(string_builder &b, const Z &z) { + auto it = z.begin(); + auto end = z.end(); + if (it == end) { + b.append_raw("[]"); + return; + } + b.append('['); + atom(b, *it); + ++it; + for (; it != end; ++it) { + b.append(','); + atom(b, *it); + } + b.append(']'); +} + +template <class Z> + requires (require_custom_serialization<Z>) +void append(string_builder &b, const Z &z) { + b.append(z); +} + + +template <class Z> +simdjson_warn_unused simdjson_result<std::string> to_json_string(const Z &z, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + string_builder b(initial_capacity); + append(b, z); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); +} + +template <class Z> +simdjson_warn_unused error_code to_json(const Z &z, std::string &s, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + string_builder b(initial_capacity); + append(b, z); + std::string_view view; + if(auto e = b.view().get(view); e) { return e; } + s.assign(view); + return SUCCESS; +} + +template <class Z> +string_builder& operator<<(string_builder& b, const Z& z) { + append(b, z); + return b; +} + +// extract_from: Serialize only specific fields from a struct to JSON +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +void extract_from(string_builder &b, const T &obj) { + // Helper to check if a field name matches any of the requested fields + auto should_extract = [](std::string_view field_name) constexpr -> bool { + return ((FieldNames.view() == field_name) || ...); + }; + + b.append('{'); + bool first = true; + + // Iterate through all members of T using reflection + template for (constexpr auto mem : std::define_static_array( + std::meta::nonstatic_data_members_of(^^T, std::meta::access_context::unchecked()))) { + + if constexpr (std::meta::is_public(mem)) { + constexpr std::string_view key = std::define_static_string(std::meta::identifier_of(mem)); + + // Only serialize this field if it's in our list of requested fields + if constexpr (should_extract(key)) { + if (!first) { + b.append(','); + } + first = false; + + // Serialize the key + constexpr auto quoted_key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(mem))); + b.append_raw(quoted_key); + b.append(':'); + + // Serialize the value + atom(b, obj.[:mem:]); + } + } + }; + + b.append('}'); +} + +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result<std::string> extract_from(const T &obj, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + string_builder b(initial_capacity); + extract_from<FieldNames...>(b, obj); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); +} + +} // namespace builder +} // namespace ppc64 +// Alias the function template to 'to' in the global namespace +template <class Z> +simdjson_warn_unused simdjson_result<std::string> to_json(const Z &z, size_t initial_capacity = ppc64::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + ppc64::builder::string_builder b(initial_capacity); + ppc64::builder::append(b, z); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); +} +template <class Z> +simdjson_warn_unused error_code to_json(const Z &z, std::string &s, size_t initial_capacity = ppc64::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + ppc64::builder::string_builder b(initial_capacity); + ppc64::builder::append(b, z); + std::string_view view; + if(auto e = b.view().get(view); e) { return e; } + s.assign(view); + return SUCCESS; +} +// Global namespace function for extract_from +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result<std::string> extract_from(const T &obj, size_t initial_capacity = ppc64::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + ppc64::builder::string_builder b(initial_capacity); + ppc64::builder::extract_from<FieldNames...>(b, obj); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); +} + +} // namespace simdjson + +#endif // SIMDJSON_STATIC_REFLECTION + +#endif +/* end file simdjson/generic/builder/json_builder.h for ppc64 */ +/* including simdjson/generic/builder/fractured_json_builder.h for ppc64: #include "simdjson/generic/builder/fractured_json_builder.h" */ +/* begin file simdjson/generic/builder/fractured_json_builder.h for ppc64 */ +#ifndef SIMDJSON_GENERIC_FRACTURED_JSON_BUILDER_H +#define SIMDJSON_GENERIC_FRACTURED_JSON_BUILDER_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_builder.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/dom/fractured_json.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#if SIMDJSON_STATIC_REFLECTION + +namespace simdjson { +namespace ppc64 { +namespace builder { + +/** + * Serialize an object to a FracturedJson-formatted string. + * + * FracturedJson produces human-readable yet compact JSON output by intelligently + * choosing between different layout strategies (inline, compact multiline, table, + * expanded) based on content complexity, length, and structure similarity. + * + * This function combines the builder's serialization with FracturedJson formatting: + * 1. Serializes the object to minified JSON using reflection + * 2. Parses and reformats using FracturedJson + * + * Example: + * struct User { int id; std::string name; bool active; }; + * User user{1, "Alice", true}; + * auto result = to_fractured_json_string(user); + * // result.value() == "{ \"id\": 1, \"name\": \"Alice\", \"active\": true }" + * + * @param obj The object to serialize (must be a reflectable type) + * @param opts FracturedJson formatting options + * @param initial_capacity Initial buffer capacity for serialization + * @return The formatted JSON string, or an error + */ +template <class T> +simdjson_warn_unused simdjson_result<std::string> to_fractured_json_string( + const T& obj, + const fractured_json_options& opts = {}, + size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + // Step 1: Serialize to minified JSON + std::string formatted; + auto error = to_json_string(obj, initial_capacity).get(formatted); + if (error) { + return error; + } + + // Step 2: Reformat with FracturedJson + return fractured_json_string(formatted, opts); +} + +/** + * Extract specific fields from an object and format with FracturedJson. + * + * Example: + * struct User { int id; std::string name; std::string email; bool active; }; + * User user{1, "Alice", "alice@example.com", true}; + * auto result = extract_fractured_json<"id", "name">(user); + * // result.value() == "{ \"id\": 1, \"name\": \"Alice\" }" + * + * @param obj The object to serialize + * @param opts FracturedJson formatting options + * @param initial_capacity Initial buffer capacity for serialization + * @return The formatted JSON string containing only the specified fields + */ +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result<std::string> extract_fractured_json( + const T& obj, + const fractured_json_options& opts = {}, + size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + // Step 1: Extract fields to minified JSON + std::string formatted; + auto error = extract_from<FieldNames...>(obj, initial_capacity).get(formatted); + if (error) { + return error; + } + + // Step 2: Reformat with FracturedJson + return fractured_json_string(formatted, opts); +} + +} // namespace builder +} // namespace ppc64 + +// Global namespace convenience functions + +/** + * Serialize an object to a FracturedJson-formatted string. + * Global namespace version for convenience. + */ +template <class T> +simdjson_warn_unused simdjson_result<std::string> to_fractured_json_string( + const T& obj, + const fractured_json_options& opts = {}, + size_t initial_capacity = ppc64::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + return ppc64::builder::to_fractured_json_string(obj, opts, initial_capacity); +} +/** + * Extract specific fields from an object and format with FracturedJson. + * Global namespace version for convenience. + */ +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result<std::string> extract_fractured_json( + const T& obj, + const fractured_json_options& opts = {}, + size_t initial_capacity = ppc64::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + return ppc64::builder::extract_fractured_json<FieldNames...>(obj, opts, initial_capacity); +} + +} // namespace simdjson + +#endif // SIMDJSON_STATIC_REFLECTION + +#endif // SIMDJSON_GENERIC_FRACTURED_JSON_BUILDER_H +/* end file simdjson/generic/builder/fractured_json_builder.h for ppc64 */ + + + +// JSON builder inline definitions +/* including simdjson/generic/builder/json_string_builder-inl.h for ppc64: #include "simdjson/generic/builder/json_string_builder-inl.h" */ +/* begin file simdjson/generic/builder/json_string_builder-inl.h for ppc64 */ +#include <array> +#include <cstring> +#include <type_traits> +#ifndef SIMDJSON_GENERIC_STRING_BUILDER_INL_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_INL_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_string_builder.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +/* + * Empirically, we have found that an inlined optimization is important for + * performance. The following macros are not ideal. We should find a better + * way to inline the code. + */ + +#if defined(__SSE2__) || defined(__x86_64__) || defined(__x86_64) || \ + (defined(_M_AMD64) || defined(_M_X64) || \ + (defined(_M_IX86_FP) && _M_IX86_FP == 2)) +#ifndef SIMDJSON_EXPERIMENTAL_HAS_SSE2 +#define SIMDJSON_EXPERIMENTAL_HAS_SSE2 1 +#endif +#endif + +#if defined(__aarch64__) || defined(_M_ARM64) +#ifndef SIMDJSON_EXPERIMENTAL_HAS_NEON +#define SIMDJSON_EXPERIMENTAL_HAS_NEON 1 +#endif +#endif +#if defined(__loongarch_sx) +#ifndef SIMDJSON_EXPERIMENTAL_HAS_LSX +#define SIMDJSON_EXPERIMENTAL_HAS_LSX 1 +#endif +#endif +#if defined(__riscv_v_intrinsic) && __riscv_v_intrinsic >= 11000 && \ + defined(__riscv_vector) +#ifndef SIMDJSON_EXPERIMENTAL_HAS_RVV +#define SIMDJSON_EXPERIMENTAL_HAS_RVV 1 +#endif +#endif +#if (defined(__PPC64__) || defined(_M_PPC64)) && defined(__ALTIVEC__) +#ifndef SIMDJSON_EXPERIMENTAL_HAS_PPC64 +#define SIMDJSON_EXPERIMENTAL_HAS_PPC64 1 +#endif +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_NEON +#include <arm_neon.h> +#ifdef _MSC_VER +#include <intrin.h> +#endif +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_SSE2 +#include <emmintrin.h> +#ifdef _MSC_VER +#include <intrin.h> +#endif +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_LSX +#include <lsxintrin.h> +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_RVV +#include <riscv_vector.h> +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_PPC64 +#include <altivec.h> +#ifdef bool +#undef bool +#endif +#ifdef vector +#undef vector +#endif +#endif + + +namespace simdjson { +namespace ppc64 { +namespace builder { + +static SIMDJSON_CONSTEXPR_LAMBDA std::array<uint8_t, 256> + json_quotable_character = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + +/** + +A possible SWAR implementation of has_json_escapable_byte. It is not used +because it is slower than the current implementation. It is kept here for +reference (to show that we tried it). + +inline bool has_json_escapable_byte(uint64_t x) { + uint64_t is_ascii = 0x8080808080808080ULL & ~x; + uint64_t xor2 = x ^ 0x0202020202020202ULL; + uint64_t lt32_or_eq34 = xor2 - 0x2121212121212121ULL; + uint64_t sub92 = x ^ 0x5C5C5C5C5C5C5C5CULL; + uint64_t eq92 = (sub92 - 0x0101010101010101ULL); + return ((lt32_or_eq34 | eq92) & is_ascii) != 0; +} + +**/ + +SIMDJSON_CONSTEXPR_LAMBDA simdjson_inline bool +simple_needs_escaping(std::string_view v) { + for (char c : v) { + // a table lookup is faster than a series of comparisons + if (json_quotable_character[static_cast<uint8_t>(c)]) { + return true; + } + } + return false; +} + +#if SIMDJSON_EXPERIMENTAL_HAS_NEON +simdjson_inline bool fast_needs_escaping(std::string_view view) { + if (view.size() < 16) { + return simple_needs_escaping(view); + } + size_t i = 0; + uint8x16_t running = vdupq_n_u8(0); + uint8x16_t v34 = vdupq_n_u8(34); + uint8x16_t v92 = vdupq_n_u8(92); + + for (; i + 15 < view.size(); i += 16) { + uint8x16_t word = vld1q_u8((const uint8_t *)view.data() + i); + running = vorrq_u8(running, vceqq_u8(word, v34)); + running = vorrq_u8(running, vceqq_u8(word, v92)); + running = vorrq_u8(running, vcltq_u8(word, vdupq_n_u8(32))); + } + if (i < view.size()) { + uint8x16_t word = + vld1q_u8((const uint8_t *)view.data() + view.length() - 16); + running = vorrq_u8(running, vceqq_u8(word, v34)); + running = vorrq_u8(running, vceqq_u8(word, v92)); + running = vorrq_u8(running, vcltq_u8(word, vdupq_n_u8(32))); + } + return vmaxvq_u32(vreinterpretq_u32_u8(running)) != 0; +} +#elif SIMDJSON_EXPERIMENTAL_HAS_SSE2 +simdjson_inline bool fast_needs_escaping(std::string_view view) { + if (view.size() < 16) { + return simple_needs_escaping(view); + } + size_t i = 0; + __m128i running = _mm_setzero_si128(); + for (; i + 15 < view.size(); i += 16) { + + __m128i word = + _mm_loadu_si128(reinterpret_cast<const __m128i *>(view.data() + i)); + running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(34))); + running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(92))); + running = _mm_or_si128( + running, _mm_cmpeq_epi8(_mm_subs_epu8(word, _mm_set1_epi8(31)), + _mm_setzero_si128())); + } + if (i < view.size()) { + __m128i word = _mm_loadu_si128( + reinterpret_cast<const __m128i *>(view.data() + view.length() - 16)); + running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(34))); + running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(92))); + running = _mm_or_si128( + running, _mm_cmpeq_epi8(_mm_subs_epu8(word, _mm_set1_epi8(31)), + _mm_setzero_si128())); + } + return _mm_movemask_epi8(running) != 0; +} +#elif SIMDJSON_EXPERIMENTAL_HAS_PPC64 +simdjson_inline bool fast_needs_escaping(std::string_view view) { + if (view.size() < 16) { + return simple_needs_escaping(view); + } + size_t i = 0; + __vector unsigned char running = vec_splats((unsigned char)0); + __vector unsigned char v34 = vec_splats((unsigned char)34); + __vector unsigned char v92 = vec_splats((unsigned char)92); + __vector unsigned char v32 = vec_splats((unsigned char)32); + + for (; i + 15 < view.size(); i += 16) { + __vector unsigned char word = + vec_vsx_ld(0, reinterpret_cast<const unsigned char *>(view.data() + i)); + running = vec_or(running, (__vector unsigned char)vec_cmpeq(word, v34)); + running = vec_or(running, (__vector unsigned char)vec_cmpeq(word, v92)); + running = vec_or(running, + (__vector unsigned char)vec_cmplt(word, v32)); + } + if (i < view.size()) { + __vector unsigned char word = vec_vsx_ld( + 0, reinterpret_cast<const unsigned char *>(view.data() + view.length() - 16)); + running = vec_or(running, (__vector unsigned char)vec_cmpeq(word, v34)); + running = vec_or(running, (__vector unsigned char)vec_cmpeq(word, v92)); + running = vec_or(running, + (__vector unsigned char)vec_cmplt(word, v32)); + } + return !vec_all_eq(running, vec_splats((unsigned char)0)); +} +#else +simdjson_inline bool fast_needs_escaping(std::string_view view) { + return simple_needs_escaping(view); +} +#endif + +// Scalar fallback for finding next quotable character +SIMDJSON_CONSTEXPR_LAMBDA simdjson_inline size_t +find_next_json_quotable_character_scalar(const std::string_view view, + size_t location) noexcept { + for (auto pos = view.begin() + location; pos != view.end(); ++pos) { + if (json_quotable_character[static_cast<uint8_t>(*pos)]) { + return pos - view.begin(); + } + } + return size_t(view.size()); +} + +// SIMD-accelerated position finding that directly locates the first quotable +// character, combining detection and position extraction in a single pass to +// minimize redundant work. +#if SIMDJSON_EXPERIMENTAL_HAS_NEON +simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + const size_t len = view.size(); + const uint8_t *ptr = + reinterpret_cast<const uint8_t *>(view.data()) + location; + size_t remaining = len - location; + + // SIMD constants for characters requiring escape + uint8x16_t v34 = vdupq_n_u8(34); // '"' + uint8x16_t v92 = vdupq_n_u8(92); // '\\' + uint8x16_t v32 = vdupq_n_u8(32); // control char threshold + + while (remaining >= 16) { + uint8x16_t word = vld1q_u8(ptr); + + // Check for quotable characters: '"', '\\', or control chars (< 32) + uint8x16_t needs_escape = vceqq_u8(word, v34); + needs_escape = vorrq_u8(needs_escape, vceqq_u8(word, v92)); + needs_escape = vorrq_u8(needs_escape, vcltq_u8(word, v32)); + + const uint8x8_t res = vshrn_n_u16(vreinterpretq_u16_u8(needs_escape), 4); + const uint64_t mask = vget_lane_u64(vreinterpret_u64_u8(res), 0); + if(mask != 0) { + size_t offset = ptr - reinterpret_cast<const uint8_t *>(view.data()); + auto trailing_zero = trailing_zeroes(mask); + return offset + (trailing_zero >> 2); + } + ptr += 16; + remaining -= 16; + } + + // Scalar fallback for remaining bytes + size_t current = len - remaining; + return find_next_json_quotable_character_scalar(view, current); +} +#elif SIMDJSON_EXPERIMENTAL_HAS_SSE2 +simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + const size_t len = view.size(); + const uint8_t *ptr = + reinterpret_cast<const uint8_t *>(view.data()) + location; + size_t remaining = len - location; + + // SIMD constants + __m128i v34 = _mm_set1_epi8(34); // '"' + __m128i v92 = _mm_set1_epi8(92); // '\\' + __m128i v31 = _mm_set1_epi8(31); // for control char detection + + while (remaining >= 16) { + __m128i word = _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr)); + + // Check for quotable characters + __m128i needs_escape = _mm_cmpeq_epi8(word, v34); + needs_escape = _mm_or_si128(needs_escape, _mm_cmpeq_epi8(word, v92)); + needs_escape = _mm_or_si128( + needs_escape, + _mm_cmpeq_epi8(_mm_subs_epu8(word, v31), _mm_setzero_si128())); + + int mask = _mm_movemask_epi8(needs_escape); + if (mask != 0) { + // Found quotable character - use trailing zero count to find position + size_t offset = ptr - reinterpret_cast<const uint8_t *>(view.data()); + return offset + trailing_zeroes(mask); + } + ptr += 16; + remaining -= 16; + } + + // Scalar fallback for remaining bytes + size_t current = len - remaining; + return find_next_json_quotable_character_scalar(view, current); +} +#elif SIMDJSON_EXPERIMENTAL_HAS_LSX +simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + const size_t len = view.size(); + const uint8_t *ptr = + reinterpret_cast<const uint8_t *>(view.data()) + location; + size_t remaining = len - location; + + //SIMD constants for characters requiring escape + __m128i v34 = __lsx_vreplgr2vr_b(34); // '"' + __m128i v92 = __lsx_vreplgr2vr_b(92); // '\\' + __m128i v32 = __lsx_vreplgr2vr_b(32); // control char threshold + + while (remaining >= 16){ + __m128i word = __lsx_vld(ptr, 0); + + //Check for the quotable characters: '"', '\\', or control char (<32) + __m128i needs_escape = __lsx_vseq_b(word, v34); + needs_escape = __lsx_vor_v(needs_escape, __lsx_vseq_b(word, v92)); + needs_escape = __lsx_vor_v(needs_escape, __lsx_vslt_bu(word, v32)); + + if (!__lsx_bz_v(needs_escape)){ + + //Found quotable character - extract exact byte position + uint64_t lo = __lsx_vpickve2gr_du(needs_escape,0); + uint64_t hi = __lsx_vpickve2gr_du(needs_escape,1); + size_t offset = ptr - reinterpret_cast<const uint8_t *>(view.data()); + if ( lo != 0) { + return offset + trailing_zeroes(lo) / 8; + } else { + return offset + 8 + trailing_zeroes(hi) / 8; + } + } + ptr += 16; + remaining -= 16; + } + size_t current = len - remaining; + return find_next_json_quotable_character_scalar(view, current); +} +#elif SIMDJSON_EXPERIMENTAL_HAS_RVV +simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + const size_t len = view.size(); + const uint8_t *ptr = + reinterpret_cast<const uint8_t *>(view.data()) + location; + size_t remaining = len - location; + + while (remaining > 0) { + size_t vl = __riscv_vsetvl_e8m1(remaining); + vuint8m1_t word = __riscv_vle8_v_u8m1(ptr, vl); + + // Check for quotable characters: '"', '\\', or control chars (< 32) + vbool8_t needs_escape = __riscv_vmseq(word, (uint8_t)34, vl); + needs_escape = __riscv_vmor(needs_escape, + __riscv_vmseq(word, (uint8_t)92, vl), vl); + needs_escape = __riscv_vmor(needs_escape, + __riscv_vmsltu(word, (uint8_t)32, vl), vl); + + long first = __riscv_vfirst(needs_escape, vl); + if (first >= 0) { + size_t offset = ptr - reinterpret_cast<const uint8_t *>(view.data()); + return offset + first; + } + ptr += vl; + remaining -= vl; + } + + return len; +} +#elif SIMDJSON_EXPERIMENTAL_HAS_PPC64 +simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + const size_t len = view.size(); + const uint8_t *ptr = + reinterpret_cast<const uint8_t *>(view.data()) + location; + size_t remaining = len - location; + + // SIMD constants for characters requiring escape + __vector unsigned char v34 = vec_splats((unsigned char)34); // '"' + __vector unsigned char v92 = vec_splats((unsigned char)92); // '\\' + __vector unsigned char v32 = vec_splats((unsigned char)32); // control char threshold + + // Bitmask for vec_vbpermq to extract one bit per byte + const __vector unsigned char perm_mask = {0x78, 0x70, 0x68, 0x60, 0x58, 0x50, + 0x48, 0x40, 0x38, 0x30, 0x28, 0x20, + 0x18, 0x10, 0x08, 0x00}; + + while (remaining >= 16) { + __vector unsigned char word = + vec_vsx_ld(0, reinterpret_cast<const unsigned char *>(ptr)); + + // Check for quotable characters: '"', '\\', or control chars (< 32) + __vector unsigned char needs_escape = + (__vector unsigned char)vec_cmpeq(word, v34); + needs_escape = vec_or(needs_escape, + (__vector unsigned char)vec_cmpeq(word, v92)); + needs_escape = vec_or(needs_escape, + (__vector unsigned char)vec_cmplt(word, v32)); + + __vector unsigned long long result = + (__vector unsigned long long)vec_vbpermq(needs_escape, perm_mask); +#ifdef __LITTLE_ENDIAN__ + unsigned int mask = static_cast<unsigned int>(result[1]); +#else + unsigned int mask = static_cast<unsigned int>(result[0]); +#endif + if (mask != 0) { + size_t offset = ptr - reinterpret_cast<const uint8_t *>(view.data()); + return offset + __builtin_ctz(mask); + } + ptr += 16; + remaining -= 16; + } + + // Scalar fallback for remaining bytes + size_t current = len - remaining; + return find_next_json_quotable_character_scalar(view, current); +} +#else +SIMDJSON_CONSTEXPR_LAMBDA simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + return find_next_json_quotable_character_scalar(view, location); +} +#endif + +SIMDJSON_CONSTEXPR_LAMBDA static std::string_view control_chars[] = { + "\\u0000", "\\u0001", "\\u0002", "\\u0003", "\\u0004", "\\u0005", "\\u0006", + "\\u0007", "\\b", "\\t", "\\n", "\\u000b", "\\f", "\\r", + "\\u000e", "\\u000f", "\\u0010", "\\u0011", "\\u0012", "\\u0013", "\\u0014", + "\\u0015", "\\u0016", "\\u0017", "\\u0018", "\\u0019", "\\u001a", "\\u001b", + "\\u001c", "\\u001d", "\\u001e", "\\u001f"}; + +// All Unicode characters may be placed within the quotation marks, except for +// the characters that MUST be escaped: quotation mark, reverse solidus, and the +// control characters (U+0000 through U+001F). There are two-character sequence +// escape representations of some popular characters: +// \", \\, \b, \f, \n, \r, \t. +SIMDJSON_CONSTEXPR_LAMBDA simdjson_inline void escape_json_char(char c, char *&out) { + if (c == '"') { + memcpy(out, "\\\"", 2); + out += 2; + } else if (c == '\\') { + memcpy(out, "\\\\", 2); + out += 2; + } else { + std::string_view v = control_chars[uint8_t(c)]; + memcpy(out, v.data(), v.size()); + out += v.size(); + } +} + +// Writes the escaped version of input to out, returning the number of bytes +// written. Uses SIMD position finding to locate quotable characters efficiently. +inline size_t write_string_escaped(const std::string_view input, char *out) { + size_t mysize = input.size(); + + // Use SIMD position finder directly - it returns mysize if no escape needed + size_t location = find_next_json_quotable_character(input, 0); + if (location == mysize) { + // Fast path: no escaping needed + memcpy(out, input.data(), input.size()); + return input.size(); + } + + const char *const initout = out; + memcpy(out, input.data(), location); + out += location; + escape_json_char(input[location], out); + location += 1; + while (location < mysize) { + size_t newlocation = find_next_json_quotable_character(input, location); + memcpy(out, input.data() + location, newlocation - location); + out += newlocation - location; + location = newlocation; + if (location == mysize) { + break; + } + escape_json_char(input[location], out); + location += 1; + } + return out - initout; +} + +simdjson_inline string_builder::string_builder(size_t initial_capacity) + : buffer(new(std::nothrow) char[initial_capacity]), position(0), + capacity(buffer.get() != nullptr ? initial_capacity : 0), + is_valid(buffer.get() != nullptr) {} + +simdjson_inline bool string_builder::capacity_check(size_t upcoming_bytes) { + // We use the convention that when is_valid is false, then the capacity and + // the position are 0. + // Most of the time, this function will return true. + if (simdjson_likely(upcoming_bytes <= capacity - position)) { + return true; + } + // check for overflow, most of the time there is no overflow + if (simdjson_unlikely(position + upcoming_bytes < position)) { + return false; + } + // We will rarely get here. + grow_buffer((std::max)(capacity * 2, position + upcoming_bytes)); + // If the buffer allocation failed, we set is_valid to false. + return is_valid; +} + +simdjson_inline void string_builder::grow_buffer(size_t desired_capacity) { + if (!is_valid) { + return; + } + std::unique_ptr<char[]> new_buffer(new (std::nothrow) char[desired_capacity]); + if (new_buffer.get() == nullptr) { + set_valid(false); + return; + } + std::memcpy(new_buffer.get(), buffer.get(), position); + buffer.swap(new_buffer); + capacity = desired_capacity; +} + +simdjson_inline void string_builder::set_valid(bool valid) noexcept { + if (!valid) { + is_valid = false; + capacity = 0; + position = 0; + buffer.reset(); + } else { + is_valid = true; + } +} + +simdjson_inline size_t string_builder::size() const noexcept { + return position; +} + +simdjson_inline void string_builder::append(char c) noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = c; + } +} + +simdjson_inline void string_builder::append_null() noexcept { + constexpr char null_literal[] = "null"; + constexpr size_t null_len = sizeof(null_literal) - 1; + if (capacity_check(null_len)) { + std::memcpy(buffer.get() + position, null_literal, null_len); + position += null_len; + } +} + +simdjson_inline void string_builder::clear() noexcept { + position = 0; + // if it was invalid, we should try to repair it + if (!is_valid) { + capacity = 0; + buffer.reset(); + is_valid = true; + } +} + +namespace internal { + +template <typename number_type, typename = typename std::enable_if< + std::is_unsigned<number_type>::value>::type> +simdjson_really_inline int int_log2(number_type x) { + return 63 - leading_zeroes(uint64_t(x) | 1); +} + +simdjson_really_inline int fast_digit_count_32(uint32_t x) { + static uint64_t table[] = { + 4294967296, 8589934582, 8589934582, 8589934582, 12884901788, + 12884901788, 12884901788, 17179868184, 17179868184, 17179868184, + 21474826480, 21474826480, 21474826480, 21474826480, 25769703776, + 25769703776, 25769703776, 30063771072, 30063771072, 30063771072, + 34349738368, 34349738368, 34349738368, 34349738368, 38554705664, + 38554705664, 38554705664, 41949672960, 41949672960, 41949672960, + 42949672960, 42949672960}; + return uint32_t((x + table[int_log2(x)]) >> 32); +} + +simdjson_really_inline int fast_digit_count_64(uint64_t x) { + static uint64_t table[] = {9, + 99, + 999, + 9999, + 99999, + 999999, + 9999999, + 99999999, + 999999999, + 9999999999, + 99999999999, + 999999999999, + 9999999999999, + 99999999999999, + 999999999999999ULL, + 9999999999999999ULL, + 99999999999999999ULL, + 999999999999999999ULL, + 9999999999999999999ULL}; + int y = (19 * int_log2(x) >> 6); + y += x > table[y]; + return y + 1; +} + +template <typename number_type, typename = typename std::enable_if< + std::is_unsigned<number_type>::value>::type> +simdjson_really_inline size_t digit_count(number_type v) noexcept { + static_assert(sizeof(number_type) == 8 || sizeof(number_type) == 4 || + sizeof(number_type) == 2 || sizeof(number_type) == 1, + "We only support 8-bit, 16-bit, 32-bit and 64-bit numbers"); + SIMDJSON_IF_CONSTEXPR(sizeof(number_type) <= 4) { + return fast_digit_count_32(static_cast<uint32_t>(v)); + } + else { + return fast_digit_count_64(static_cast<uint64_t>(v)); + } +} +static const char decimal_table[200] = { + 0x30, 0x30, 0x30, 0x31, 0x30, 0x32, 0x30, 0x33, 0x30, 0x34, 0x30, 0x35, + 0x30, 0x36, 0x30, 0x37, 0x30, 0x38, 0x30, 0x39, 0x31, 0x30, 0x31, 0x31, + 0x31, 0x32, 0x31, 0x33, 0x31, 0x34, 0x31, 0x35, 0x31, 0x36, 0x31, 0x37, + 0x31, 0x38, 0x31, 0x39, 0x32, 0x30, 0x32, 0x31, 0x32, 0x32, 0x32, 0x33, + 0x32, 0x34, 0x32, 0x35, 0x32, 0x36, 0x32, 0x37, 0x32, 0x38, 0x32, 0x39, + 0x33, 0x30, 0x33, 0x31, 0x33, 0x32, 0x33, 0x33, 0x33, 0x34, 0x33, 0x35, + 0x33, 0x36, 0x33, 0x37, 0x33, 0x38, 0x33, 0x39, 0x34, 0x30, 0x34, 0x31, + 0x34, 0x32, 0x34, 0x33, 0x34, 0x34, 0x34, 0x35, 0x34, 0x36, 0x34, 0x37, + 0x34, 0x38, 0x34, 0x39, 0x35, 0x30, 0x35, 0x31, 0x35, 0x32, 0x35, 0x33, + 0x35, 0x34, 0x35, 0x35, 0x35, 0x36, 0x35, 0x37, 0x35, 0x38, 0x35, 0x39, + 0x36, 0x30, 0x36, 0x31, 0x36, 0x32, 0x36, 0x33, 0x36, 0x34, 0x36, 0x35, + 0x36, 0x36, 0x36, 0x37, 0x36, 0x38, 0x36, 0x39, 0x37, 0x30, 0x37, 0x31, + 0x37, 0x32, 0x37, 0x33, 0x37, 0x34, 0x37, 0x35, 0x37, 0x36, 0x37, 0x37, + 0x37, 0x38, 0x37, 0x39, 0x38, 0x30, 0x38, 0x31, 0x38, 0x32, 0x38, 0x33, + 0x38, 0x34, 0x38, 0x35, 0x38, 0x36, 0x38, 0x37, 0x38, 0x38, 0x38, 0x39, + 0x39, 0x30, 0x39, 0x31, 0x39, 0x32, 0x39, 0x33, 0x39, 0x34, 0x39, 0x35, + 0x39, 0x36, 0x39, 0x37, 0x39, 0x38, 0x39, 0x39, +}; +} // namespace internal + +template <typename number_type, typename> +simdjson_inline void string_builder::append(number_type v) noexcept { + static_assert(std::is_same<number_type, bool>::value || + std::is_integral<number_type>::value || + std::is_floating_point<number_type>::value, + "Unsupported number type"); + // If C++17 is available, we can 'if constexpr' here. + SIMDJSON_IF_CONSTEXPR(std::is_same<number_type, bool>::value) { + if (v) { + constexpr char true_literal[] = "true"; + constexpr size_t true_len = sizeof(true_literal) - 1; + if (capacity_check(true_len)) { + std::memcpy(buffer.get() + position, true_literal, true_len); + position += true_len; + } + } else { + constexpr char false_literal[] = "false"; + constexpr size_t false_len = sizeof(false_literal) - 1; + if (capacity_check(false_len)) { + std::memcpy(buffer.get() + position, false_literal, false_len); + position += false_len; + } + } + } + else SIMDJSON_IF_CONSTEXPR(std::is_unsigned<number_type>::value) { + // Process 4 digits at a time instead of 2, reducing store operations + // and divisions by approximately half for large numbers. + constexpr size_t max_number_size = 20; + if (capacity_check(max_number_size)) { + using unsigned_type = typename std::make_unsigned<number_type>::type; + unsigned_type pv = static_cast<unsigned_type>(v); + size_t dc = internal::digit_count(pv); + char *write_pointer = buffer.get() + position + dc - 1; + + // Process 4 digits per iteration for large numbers + while (pv >= 10000) { + unsigned_type q = pv / 10000; + unsigned_type r = pv % 10000; + unsigned_type r_hi = r / 100; // High 2 digits of remainder + unsigned_type r_lo = r % 100; // Low 2 digits of remainder + // Write low 2 digits first (rightmost), then high 2 digits + memcpy(write_pointer - 1, &internal::decimal_table[r_lo * 2], 2); + memcpy(write_pointer - 3, &internal::decimal_table[r_hi * 2], 2); + write_pointer -= 4; + pv = q; + } + + // Handle remaining 1-4 digits with original 2-digit loop + while (pv >= 100) { + memcpy(write_pointer - 1, &internal::decimal_table[(pv % 100) * 2], 2); + write_pointer -= 2; + pv /= 100; + } + if (pv >= 10) { + *write_pointer-- = char('0' + (pv % 10)); + pv /= 10; + } + *write_pointer = char('0' + pv); + position += dc; + } + } + else SIMDJSON_IF_CONSTEXPR(std::is_integral<number_type>::value) { + // Same 4-digit batching as unsigned path for signed integers + constexpr size_t max_number_size = 20; + if (capacity_check(max_number_size)) { + using unsigned_type = typename std::make_unsigned<number_type>::type; + bool negative = v < 0; + unsigned_type pv = static_cast<unsigned_type>(v); + if (negative) { + pv = 0 - pv; // the 0 is for Microsoft + } + size_t dc = internal::digit_count(pv); + // by always writing the minus sign, we avoid the branch. + buffer.get()[position] = '-'; + position += negative ? 1 : 0; + char *write_pointer = buffer.get() + position + dc - 1; + + // Process 4 digits per iteration for large numbers + while (pv >= 10000) { + unsigned_type q = pv / 10000; + unsigned_type r = pv % 10000; + unsigned_type r_hi = r / 100; + unsigned_type r_lo = r % 100; + memcpy(write_pointer - 1, &internal::decimal_table[r_lo * 2], 2); + memcpy(write_pointer - 3, &internal::decimal_table[r_hi * 2], 2); + write_pointer -= 4; + pv = q; + } + + // Handle remaining 1-4 digits + while (pv >= 100) { + memcpy(write_pointer - 1, &internal::decimal_table[(pv % 100) * 2], 2); + write_pointer -= 2; + pv /= 100; + } + if (pv >= 10) { + *write_pointer-- = char('0' + (pv % 10)); + pv /= 10; + } + *write_pointer = char('0' + pv); + position += dc; + } + } + else SIMDJSON_IF_CONSTEXPR(std::is_floating_point<number_type>::value) { + constexpr size_t max_number_size = 24; + if (capacity_check(max_number_size)) { + // We could specialize for float. + char *end = simdjson::internal::to_chars(buffer.get() + position, nullptr, + double(v)); + position = end - buffer.get(); + } + } +} + +simdjson_inline void +string_builder::escape_and_append(std::string_view input) noexcept { + // escaping might turn a control character into \x00xx so 6 characters. + if (capacity_check(6 * input.size())) { + position += write_string_escaped(input, buffer.get() + position); + } +} + +simdjson_inline void +string_builder::escape_and_append_with_quotes(std::string_view input) noexcept { + // escaping might turn a control character into \x00xx so 6 characters. + if (capacity_check(2 + 6 * input.size())) { + buffer.get()[position++] = '"'; + position += write_string_escaped(input, buffer.get() + position); + buffer.get()[position++] = '"'; + } +} + +simdjson_inline void +string_builder::escape_and_append_with_quotes(char input) noexcept { + // escaping might turn a control character into \x00xx so 6 characters. + if (capacity_check(2 + 6 * 1)) { + buffer.get()[position++] = '"'; + std::string_view cinput(&input, 1); + position += write_string_escaped(cinput, buffer.get() + position); + buffer.get()[position++] = '"'; + } +} + +simdjson_inline void +string_builder::escape_and_append_with_quotes(const char *input) noexcept { + std::string_view cinput(input); + escape_and_append_with_quotes(cinput); +} +#if SIMDJSON_SUPPORTS_CONCEPTS +template <constevalutil::fixed_string key> +simdjson_inline void string_builder::escape_and_append_with_quotes() noexcept { + escape_and_append_with_quotes(constevalutil::string_constant<key>::value); +} +#endif + +simdjson_inline void string_builder::append_raw(const char *c) noexcept { + size_t len = std::strlen(c); + append_raw(c, len); +} + +simdjson_inline void +string_builder::append_raw(std::string_view input) noexcept { + if (capacity_check(input.size())) { + std::memcpy(buffer.get() + position, input.data(), input.size()); + position += input.size(); + } +} + +simdjson_inline void string_builder::append_raw(const char *str, + size_t len) noexcept { + if (capacity_check(len)) { + std::memcpy(buffer.get() + position, str, len); + position += len; + } +} +#if SIMDJSON_SUPPORTS_CONCEPTS +// Support for optional types (std::optional, etc.) +template <concepts::optional_type T> + requires(!require_custom_serialization<T>) +simdjson_inline void string_builder::append(const T &opt) { + if (opt) { + append(*opt); + } else { + append_null(); + } +} + +template <typename T> + requires(require_custom_serialization<T>) +simdjson_inline void string_builder::append(T &&val) { + serialize(*this, std::forward<T>(val)); +} + +template <typename T> + requires(std::is_convertible<T, std::string_view>::value || + std::is_same<T, const char *>::value) +simdjson_inline void string_builder::append(const T &value) { + escape_and_append_with_quotes(value); +} +#endif + +#if SIMDJSON_SUPPORTS_RANGES && SIMDJSON_SUPPORTS_CONCEPTS +// Support for range-based appending (std::ranges::view, etc.) +template <std::ranges::range R> + requires(!std::is_convertible<R, std::string_view>::value && !require_custom_serialization<R>) +simdjson_inline void string_builder::append(const R &range) noexcept { + auto it = std::ranges::begin(range); + auto end = std::ranges::end(range); + if constexpr (concepts::is_pair<std::ranges::range_value_t<R>>) { + start_object(); + + if (it == end) { + end_object(); + return; // Handle empty range + } + // Append first item without leading comma + append_key_value(it->first, it->second); + ++it; + + // Append remaining items with preceding commas + for (; it != end; ++it) { + append_comma(); + append_key_value(it->first, it->second); + } + end_object(); + } else { + start_array(); + if (it == end) { + end_array(); + return; // Handle empty range + } + + // Append first item without leading comma + append(*it); + ++it; + + // Append remaining items with preceding commas + for (; it != end; ++it) { + append_comma(); + append(*it); + } + end_array(); + } +} + +#endif + +#if SIMDJSON_EXCEPTIONS +simdjson_inline string_builder::operator std::string() const noexcept(false) { + return std::string(operator std::string_view()); +} + +simdjson_inline string_builder::operator std::string_view() const + noexcept(false) simdjson_lifetime_bound { + return view(); +} +#endif + +simdjson_inline simdjson_result<std::string_view> +string_builder::view() const noexcept { + if (!is_valid) { + return simdjson::OUT_OF_CAPACITY; + } + return std::string_view(buffer.get(), position); +} + +simdjson_inline simdjson_result<const char *> string_builder::c_str() noexcept { + if (capacity_check(1)) { + buffer.get()[position] = '\0'; + return buffer.get(); + } + return simdjson::OUT_OF_CAPACITY; +} + +simdjson_inline bool string_builder::validate_unicode() const noexcept { + return simdjson::validate_utf8(buffer.get(), position); +} + +simdjson_inline void string_builder::start_object() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '{'; + } +} + +simdjson_inline void string_builder::end_object() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '}'; + } +} + +simdjson_inline void string_builder::start_array() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '['; + } +} + +simdjson_inline void string_builder::end_array() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ']'; + } +} + +simdjson_inline void string_builder::append_comma() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ','; + } +} + +simdjson_inline void string_builder::append_colon() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ':'; + } +} + +template <typename key_type, typename value_type> +simdjson_inline void +string_builder::append_key_value(key_type key, value_type value) noexcept { + static_assert(std::is_same<key_type, const char *>::value || + std::is_convertible<key_type, std::string_view>::value, + "Unsupported key type"); + escape_and_append_with_quotes(key); + append_colon(); + SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, std::nullptr_t>::value) { + append_null(); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, char>::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR( + std::is_convertible<value_type, std::string_view>::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, const char *>::value) { + escape_and_append_with_quotes(value); + } + else { + append(value); + } +} + +#if SIMDJSON_SUPPORTS_CONCEPTS +template <constevalutil::fixed_string key, typename value_type> +simdjson_inline void +string_builder::append_key_value(value_type value) noexcept { + escape_and_append_with_quotes<key>(); + append_colon(); + SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, std::nullptr_t>::value) { + append_null(); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, char>::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR( + std::is_convertible<value_type, std::string_view>::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, const char *>::value) { + escape_and_append_with_quotes(value); + } + else { + append(value); + } +} +#endif + +} // namespace builder +} // namespace ppc64 +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_STRING_BUILDER_INL_H +/* end file simdjson/generic/builder/json_string_builder-inl.h for ppc64 */ + +/* end file simdjson/generic/builder/amalgamated.h for ppc64 */ +/* including simdjson/ppc64/end.h: #include "simdjson/ppc64/end.h" */ +/* begin file simdjson/ppc64/end.h */ +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#undef SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT +/* undefining SIMDJSON_IMPLEMENTATION from "ppc64" */ +#undef SIMDJSON_IMPLEMENTATION +/* end file simdjson/ppc64/end.h */ + +#endif // SIMDJSON_PPC64_BUILDER_H +/* end file simdjson/ppc64/builder.h */ +#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(westmere) +/* including simdjson/westmere/builder.h: #include "simdjson/westmere/builder.h" */ +/* begin file simdjson/westmere/builder.h */ +#ifndef SIMDJSON_WESTMERE_BUILDER_H +#define SIMDJSON_WESTMERE_BUILDER_H + +/* including simdjson/westmere/begin.h: #include "simdjson/westmere/begin.h" */ +/* begin file simdjson/westmere/begin.h */ +/* defining SIMDJSON_IMPLEMENTATION to "westmere" */ +#define SIMDJSON_IMPLEMENTATION westmere +/* including simdjson/westmere/base.h: #include "simdjson/westmere/base.h" */ +/* begin file simdjson/westmere/base.h */ +#ifndef SIMDJSON_WESTMERE_BASE_H +#define SIMDJSON_WESTMERE_BASE_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +// The constructor may be executed on any host, so we take care not to use SIMDJSON_TARGET_WESTMERE +namespace simdjson { +/** + * Implementation for Westmere (Intel SSE4.2). + */ +namespace westmere { + +class implementation; + +namespace { +namespace simd { + +template <typename T> struct simd8; +template <typename T> struct simd8x64; + +} // namespace simd +} // unnamed namespace + +} // namespace westmere +} // namespace simdjson + +#endif // SIMDJSON_WESTMERE_BASE_H +/* end file simdjson/westmere/base.h */ +/* including simdjson/westmere/intrinsics.h: #include "simdjson/westmere/intrinsics.h" */ +/* begin file simdjson/westmere/intrinsics.h */ +#ifndef SIMDJSON_WESTMERE_INTRINSICS_H +#define SIMDJSON_WESTMERE_INTRINSICS_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#if SIMDJSON_VISUAL_STUDIO +// under clang within visual studio, this will include <x86intrin.h> +#include <intrin.h> // visual studio or clang +#else +#include <x86intrin.h> // elsewhere +#endif // SIMDJSON_VISUAL_STUDIO + + +#if SIMDJSON_CLANG_VISUAL_STUDIO +/** + * You are not supposed, normally, to include these + * headers directly. Instead you should either include intrin.h + * or x86intrin.h. However, when compiling with clang + * under Windows (i.e., when _MSC_VER is set), these headers + * only get included *if* the corresponding features are detected + * from macros: + */ +#include <smmintrin.h> // for _mm_alignr_epi8 +#include <wmmintrin.h> // for _mm_clmulepi64_si128 +#endif + +static_assert(sizeof(__m128i) <= simdjson::SIMDJSON_PADDING, "insufficient padding for westmere"); + +#endif // SIMDJSON_WESTMERE_INTRINSICS_H +/* end file simdjson/westmere/intrinsics.h */ + +#if !SIMDJSON_CAN_ALWAYS_RUN_WESTMERE +SIMDJSON_TARGET_REGION("sse4.2,pclmul,popcnt") +#endif + +/* including simdjson/westmere/bitmanipulation.h: #include "simdjson/westmere/bitmanipulation.h" */ +/* begin file simdjson/westmere/bitmanipulation.h */ +#ifndef SIMDJSON_WESTMERE_BITMANIPULATION_H +#define SIMDJSON_WESTMERE_BITMANIPULATION_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/westmere/intrinsics.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace westmere { +namespace { + +// We sometimes call trailing_zero on inputs that are zero, +// but the algorithms do not end up using the returned value. +// Sadly, sanitizers are not smart enough to figure it out. +SIMDJSON_NO_SANITIZE_UNDEFINED +// This function can be used safely even if not all bytes have been +// initialized. +// See issue https://github.com/simdjson/simdjson/issues/1965 +SIMDJSON_NO_SANITIZE_MEMORY +simdjson_inline int trailing_zeroes(uint64_t input_num) { +#if SIMDJSON_REGULAR_VISUAL_STUDIO + unsigned long ret; + // Search the mask data from least significant bit (LSB) + // to the most significant bit (MSB) for a set bit (1). + _BitScanForward64(&ret, input_num); + return (int)ret; +#else // SIMDJSON_REGULAR_VISUAL_STUDIO + return __builtin_ctzll(input_num); +#endif // SIMDJSON_REGULAR_VISUAL_STUDIO +} + +/* result might be undefined when input_num is zero */ +simdjson_inline uint64_t clear_lowest_bit(uint64_t input_num) { + return input_num & (input_num-1); +} + +/* result might be undefined when input_num is zero */ +simdjson_inline int leading_zeroes(uint64_t input_num) { +#if SIMDJSON_REGULAR_VISUAL_STUDIO + unsigned long leading_zero = 0; + // Search the mask data from most significant bit (MSB) + // to least significant bit (LSB) for a set bit (1). + if (_BitScanReverse64(&leading_zero, input_num)) + return (int)(63 - leading_zero); + else + return 64; +#else + return __builtin_clzll(input_num); +#endif// SIMDJSON_REGULAR_VISUAL_STUDIO +} + +#if SIMDJSON_REGULAR_VISUAL_STUDIO +simdjson_inline unsigned __int64 count_ones(uint64_t input_num) { + // note: we do not support legacy 32-bit Windows in this kernel + return __popcnt64(input_num);// Visual Studio wants two underscores +} +#else +simdjson_inline long long int count_ones(uint64_t input_num) { + return _popcnt64(input_num); +} +#endif + +simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2, + uint64_t *result) { +#if SIMDJSON_REGULAR_VISUAL_STUDIO + return _addcarry_u64(0, value1, value2, + reinterpret_cast<unsigned __int64 *>(result)); +#else + return __builtin_uaddll_overflow(value1, value2, + reinterpret_cast<unsigned long long *>(result)); +#endif +} + +} // unnamed namespace +} // namespace westmere +} // namespace simdjson + +#endif // SIMDJSON_WESTMERE_BITMANIPULATION_H +/* end file simdjson/westmere/bitmanipulation.h */ +/* including simdjson/westmere/bitmask.h: #include "simdjson/westmere/bitmask.h" */ +/* begin file simdjson/westmere/bitmask.h */ +#ifndef SIMDJSON_WESTMERE_BITMASK_H +#define SIMDJSON_WESTMERE_BITMASK_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/westmere/intrinsics.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace westmere { +namespace { + +// +// Perform a "cumulative bitwise xor," flipping bits each time a 1 is encountered. +// +// For example, prefix_xor(00100100) == 00011100 +// +simdjson_inline uint64_t prefix_xor(const uint64_t bitmask) { + // There should be no such thing with a processing supporting avx2 + // but not clmul. + __m128i all_ones = _mm_set1_epi8('\xFF'); + __m128i result = _mm_clmulepi64_si128(_mm_set_epi64x(0ULL, bitmask), all_ones, 0); + return _mm_cvtsi128_si64(result); +} + +} // unnamed namespace +} // namespace westmere +} // namespace simdjson + +#endif // SIMDJSON_WESTMERE_BITMASK_H +/* end file simdjson/westmere/bitmask.h */ +/* including simdjson/westmere/numberparsing_defs.h: #include "simdjson/westmere/numberparsing_defs.h" */ +/* begin file simdjson/westmere/numberparsing_defs.h */ +#ifndef SIMDJSON_WESTMERE_NUMBERPARSING_DEFS_H +#define SIMDJSON_WESTMERE_NUMBERPARSING_DEFS_H + +/* including simdjson/westmere/base.h: #include "simdjson/westmere/base.h" */ +/* begin file simdjson/westmere/base.h */ +#ifndef SIMDJSON_WESTMERE_BASE_H +#define SIMDJSON_WESTMERE_BASE_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +// The constructor may be executed on any host, so we take care not to use SIMDJSON_TARGET_WESTMERE +namespace simdjson { +/** + * Implementation for Westmere (Intel SSE4.2). + */ +namespace westmere { + +class implementation; + +namespace { +namespace simd { + +template <typename T> struct simd8; +template <typename T> struct simd8x64; + +} // namespace simd +} // unnamed namespace + +} // namespace westmere +} // namespace simdjson + +#endif // SIMDJSON_WESTMERE_BASE_H +/* end file simdjson/westmere/base.h */ +/* including simdjson/westmere/intrinsics.h: #include "simdjson/westmere/intrinsics.h" */ +/* begin file simdjson/westmere/intrinsics.h */ +#ifndef SIMDJSON_WESTMERE_INTRINSICS_H +#define SIMDJSON_WESTMERE_INTRINSICS_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#if SIMDJSON_VISUAL_STUDIO +// under clang within visual studio, this will include <x86intrin.h> +#include <intrin.h> // visual studio or clang +#else +#include <x86intrin.h> // elsewhere +#endif // SIMDJSON_VISUAL_STUDIO + + +#if SIMDJSON_CLANG_VISUAL_STUDIO +/** + * You are not supposed, normally, to include these + * headers directly. Instead you should either include intrin.h + * or x86intrin.h. However, when compiling with clang + * under Windows (i.e., when _MSC_VER is set), these headers + * only get included *if* the corresponding features are detected + * from macros: + */ +#include <smmintrin.h> // for _mm_alignr_epi8 +#include <wmmintrin.h> // for _mm_clmulepi64_si128 +#endif + +static_assert(sizeof(__m128i) <= simdjson::SIMDJSON_PADDING, "insufficient padding for westmere"); + +#endif // SIMDJSON_WESTMERE_INTRINSICS_H +/* end file simdjson/westmere/intrinsics.h */ + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace westmere { +namespace numberparsing { + +/** @private */ +static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) { + // this actually computes *16* values so we are being wasteful. + const __m128i ascii0 = _mm_set1_epi8('0'); + const __m128i mul_1_10 = + _mm_setr_epi8(10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1); + const __m128i mul_1_100 = _mm_setr_epi16(100, 1, 100, 1, 100, 1, 100, 1); + const __m128i mul_1_10000 = + _mm_setr_epi16(10000, 1, 10000, 1, 10000, 1, 10000, 1); + const __m128i input = _mm_sub_epi8( + _mm_loadu_si128(reinterpret_cast<const __m128i *>(chars)), ascii0); + const __m128i t1 = _mm_maddubs_epi16(input, mul_1_10); + const __m128i t2 = _mm_madd_epi16(t1, mul_1_100); + const __m128i t3 = _mm_packus_epi32(t2, t2); + const __m128i t4 = _mm_madd_epi16(t3, mul_1_10000); + return _mm_cvtsi128_si32( + t4); // only captures the sum of the first 8 digits, drop the rest +} + +/** @private */ +simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) { + internal::value128 answer; +#if SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS +#if SIMDJSON_IS_ARM64 + // ARM64 has native support for 64-bit multiplications, no need to emultate + answer.high = __umulh(value1, value2); + answer.low = value1 * value2; +#else + answer.low = _umul128(value1, value2, &answer.high); // _umul128 not available on ARM64 +#endif // SIMDJSON_IS_ARM64 +#else // SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS + __uint128_t r = (static_cast<__uint128_t>(value1)) * value2; + answer.low = uint64_t(r); + answer.high = uint64_t(r >> 64); +#endif + return answer; +} + +} // namespace numberparsing +} // namespace westmere +} // namespace simdjson + +#define SIMDJSON_SWAR_NUMBER_PARSING 1 + +#endif // SIMDJSON_WESTMERE_NUMBERPARSING_DEFS_H +/* end file simdjson/westmere/numberparsing_defs.h */ +/* including simdjson/westmere/simd.h: #include "simdjson/westmere/simd.h" */ +/* begin file simdjson/westmere/simd.h */ +#ifndef SIMDJSON_WESTMERE_SIMD_H +#define SIMDJSON_WESTMERE_SIMD_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/westmere/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace westmere { +namespace { +namespace simd { + + template<typename Child> + struct base { + __m128i value; + + // Zero constructor + simdjson_inline base() : value{__m128i()} {} + + // Conversion from SIMD register + simdjson_inline base(const __m128i _value) : value(_value) {} + + // Conversion to SIMD register + simdjson_inline operator const __m128i&() const { return this->value; } + simdjson_inline operator __m128i&() { return this->value; } + + // Bit operations + simdjson_inline Child operator|(const Child other) const { return _mm_or_si128(*this, other); } + simdjson_inline Child operator&(const Child other) const { return _mm_and_si128(*this, other); } + simdjson_inline Child operator^(const Child other) const { return _mm_xor_si128(*this, other); } + simdjson_inline Child bit_andnot(const Child other) const { return _mm_andnot_si128(other, *this); } + simdjson_inline Child& operator|=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast | other; return *this_cast; } + simdjson_inline Child& operator&=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast & other; return *this_cast; } + simdjson_inline Child& operator^=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast ^ other; return *this_cast; } + }; + + template<typename T, typename Mask=simd8<bool>> + struct base8: base<simd8<T>> { + typedef uint16_t bitmask_t; + typedef uint32_t bitmask2_t; + + simdjson_inline base8() : base<simd8<T>>() {} + simdjson_inline base8(const __m128i _value) : base<simd8<T>>(_value) {} + + friend simdjson_inline Mask operator==(const simd8<T> lhs, const simd8<T> rhs) { return _mm_cmpeq_epi8(lhs, rhs); } + + static const int SIZE = sizeof(base<simd8<T>>::value); + + template<int N=1> + simdjson_inline simd8<T> prev(const simd8<T> prev_chunk) const { + return _mm_alignr_epi8(*this, prev_chunk, 16 - N); + } + }; + + // SIMD byte mask type (returned by things like eq and gt) + template<> + struct simd8<bool>: base8<bool> { + static simdjson_inline simd8<bool> splat(bool _value) { return _mm_set1_epi8(uint8_t(-(!!_value))); } + + simdjson_inline simd8() : base8() {} + simdjson_inline simd8(const __m128i _value) : base8<bool>(_value) {} + // Splat constructor + simdjson_inline simd8(bool _value) : base8<bool>(splat(_value)) {} + + simdjson_inline int to_bitmask() const { return _mm_movemask_epi8(*this); } + simdjson_inline bool any() const { return !_mm_testz_si128(*this, *this); } + simdjson_inline simd8<bool> operator~() const { return *this ^ true; } + }; + + template<typename T> + struct base8_numeric: base8<T> { + static simdjson_inline simd8<T> splat(T _value) { return _mm_set1_epi8(_value); } + static simdjson_inline simd8<T> zero() { return _mm_setzero_si128(); } + static simdjson_inline simd8<T> load(const T values[16]) { + return _mm_loadu_si128(reinterpret_cast<const __m128i *>(values)); + } + // Repeat 16 values as many times as necessary (usually for lookup tables) + static simdjson_inline simd8<T> repeat_16( + T v0, T v1, T v2, T v3, T v4, T v5, T v6, T v7, + T v8, T v9, T v10, T v11, T v12, T v13, T v14, T v15 + ) { + return simd8<T>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + ); + } + + simdjson_inline base8_numeric() : base8<T>() {} + simdjson_inline base8_numeric(const __m128i _value) : base8<T>(_value) {} + + // Store to array + simdjson_inline void store(T dst[16]) const { return _mm_storeu_si128(reinterpret_cast<__m128i *>(dst), *this); } + + // Override to distinguish from bool version + simdjson_inline simd8<T> operator~() const { return *this ^ 0xFFu; } + + // Addition/subtraction are the same for signed and unsigned + simdjson_inline simd8<T> operator+(const simd8<T> other) const { return _mm_add_epi8(*this, other); } + simdjson_inline simd8<T> operator-(const simd8<T> other) const { return _mm_sub_epi8(*this, other); } + simdjson_inline simd8<T>& operator+=(const simd8<T> other) { *this = *this + other; return *static_cast<simd8<T>*>(this); } + simdjson_inline simd8<T>& operator-=(const simd8<T> other) { *this = *this - other; return *static_cast<simd8<T>*>(this); } + + // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values) + template<typename L> + simdjson_inline simd8<L> lookup_16(simd8<L> lookup_table) const { + return _mm_shuffle_epi8(lookup_table, *this); + } + + // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted as a bitset). + // Passing a 0 value for mask would be equivalent to writing out every byte to output. + // Only the first 16 - count_ones(mask) bytes of the result are significant but 16 bytes + // get written. + // Design consideration: it seems like a function with the + // signature simd8<L> compress(uint32_t mask) would be + // sensible, but the AVX ISA makes this kind of approach difficult. + template<typename L> + simdjson_inline void compress(uint16_t mask, L * output) const { + using internal::thintable_epi8; + using internal::BitsSetTable256mul2; + using internal::pshufb_combine_table; + // this particular implementation was inspired by work done by @animetosho + // we do it in two steps, first 8 bytes and then second 8 bytes + uint8_t mask1 = uint8_t(mask); // least significant 8 bits + uint8_t mask2 = uint8_t(mask >> 8); // most significant 8 bits + // next line just loads the 64-bit values thintable_epi8[mask1] and + // thintable_epi8[mask2] into a 128-bit register, using only + // two instructions on most compilers. + __m128i shufmask = _mm_set_epi64x(thintable_epi8[mask2], thintable_epi8[mask1]); + // we increment by 0x08 the second half of the mask + shufmask = + _mm_add_epi8(shufmask, _mm_set_epi32(0x08080808, 0x08080808, 0, 0)); + // this is the version "nearly pruned" + __m128i pruned = _mm_shuffle_epi8(*this, shufmask); + // we still need to put the two halves together. + // we compute the popcount of the first half: + int pop1 = BitsSetTable256mul2[mask1]; + // then load the corresponding mask, what it does is to write + // only the first pop1 bytes from the first 8 bytes, and then + // it fills in with the bytes from the second 8 bytes + some filling + // at the end. + __m128i compactmask = + _mm_loadu_si128(reinterpret_cast<const __m128i *>(pshufb_combine_table + pop1 * 8)); + __m128i answer = _mm_shuffle_epi8(pruned, compactmask); + _mm_storeu_si128(reinterpret_cast<__m128i *>(output), answer); + } + + template<typename L> + simdjson_inline simd8<L> lookup_16( + L replace0, L replace1, L replace2, L replace3, + L replace4, L replace5, L replace6, L replace7, + L replace8, L replace9, L replace10, L replace11, + L replace12, L replace13, L replace14, L replace15) const { + return lookup_16(simd8<L>::repeat_16( + replace0, replace1, replace2, replace3, + replace4, replace5, replace6, replace7, + replace8, replace9, replace10, replace11, + replace12, replace13, replace14, replace15 + )); + } + }; + + // Signed bytes + template<> + struct simd8<int8_t> : base8_numeric<int8_t> { + simdjson_inline simd8() : base8_numeric<int8_t>() {} + simdjson_inline simd8(const __m128i _value) : base8_numeric<int8_t>(_value) {} + // Splat constructor + simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {} + // Array constructor + simdjson_inline simd8(const int8_t* values) : simd8(load(values)) {} + // Member-by-member initialization + simdjson_inline simd8( + int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, + int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 + ) : simd8(_mm_setr_epi8( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + )) {} + // Repeat 16 values as many times as necessary (usually for lookup tables) + simdjson_inline static simd8<int8_t> repeat_16( + int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, + int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 + ) { + return simd8<int8_t>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + ); + } + + // Order-sensitive comparisons + simdjson_inline simd8<int8_t> max_val(const simd8<int8_t> other) const { return _mm_max_epi8(*this, other); } + simdjson_inline simd8<int8_t> min_val(const simd8<int8_t> other) const { return _mm_min_epi8(*this, other); } + simdjson_inline simd8<bool> operator>(const simd8<int8_t> other) const { return _mm_cmpgt_epi8(*this, other); } + simdjson_inline simd8<bool> operator<(const simd8<int8_t> other) const { return _mm_cmpgt_epi8(other, *this); } + }; + + // Unsigned bytes + template<> + struct simd8<uint8_t>: base8_numeric<uint8_t> { + simdjson_inline simd8() : base8_numeric<uint8_t>() {} + simdjson_inline simd8(const __m128i _value) : base8_numeric<uint8_t>(_value) {} + // Splat constructor + simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {} + // Array constructor + simdjson_inline simd8(const uint8_t* values) : simd8(load(values)) {} + // Member-by-member initialization + simdjson_inline simd8( + uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, + uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 + ) : simd8(_mm_setr_epi8( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + )) {} + // Repeat 16 values as many times as necessary (usually for lookup tables) + simdjson_inline static simd8<uint8_t> repeat_16( + uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, + uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 + ) { + return simd8<uint8_t>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + ); + } + + // Saturated math + simdjson_inline simd8<uint8_t> saturating_add(const simd8<uint8_t> other) const { return _mm_adds_epu8(*this, other); } + simdjson_inline simd8<uint8_t> saturating_sub(const simd8<uint8_t> other) const { return _mm_subs_epu8(*this, other); } + + // Order-specific operations + simdjson_inline simd8<uint8_t> max_val(const simd8<uint8_t> other) const { return _mm_max_epu8(*this, other); } + simdjson_inline simd8<uint8_t> min_val(const simd8<uint8_t> other) const { return _mm_min_epu8(*this, other); } + // Same as >, but only guarantees true is nonzero (< guarantees true = -1) + simdjson_inline simd8<uint8_t> gt_bits(const simd8<uint8_t> other) const { return this->saturating_sub(other); } + // Same as <, but only guarantees true is nonzero (< guarantees true = -1) + simdjson_inline simd8<uint8_t> lt_bits(const simd8<uint8_t> other) const { return other.saturating_sub(*this); } + simdjson_inline simd8<bool> operator<=(const simd8<uint8_t> other) const { return other.max_val(*this) == other; } + simdjson_inline simd8<bool> operator>=(const simd8<uint8_t> other) const { return other.min_val(*this) == other; } + simdjson_inline simd8<bool> operator>(const simd8<uint8_t> other) const { return this->gt_bits(other).any_bits_set(); } + simdjson_inline simd8<bool> operator<(const simd8<uint8_t> other) const { return this->gt_bits(other).any_bits_set(); } + + // Bit-specific operations + simdjson_inline simd8<bool> bits_not_set() const { return *this == uint8_t(0); } + simdjson_inline simd8<bool> bits_not_set(simd8<uint8_t> bits) const { return (*this & bits).bits_not_set(); } + simdjson_inline simd8<bool> any_bits_set() const { return ~this->bits_not_set(); } + simdjson_inline simd8<bool> any_bits_set(simd8<uint8_t> bits) const { return ~this->bits_not_set(bits); } + simdjson_inline bool is_ascii() const { return _mm_movemask_epi8(*this) == 0; } + simdjson_inline bool bits_not_set_anywhere() const { return _mm_testz_si128(*this, *this); } + simdjson_inline bool any_bits_set_anywhere() const { return !bits_not_set_anywhere(); } + simdjson_inline bool bits_not_set_anywhere(simd8<uint8_t> bits) const { return _mm_testz_si128(*this, bits); } + simdjson_inline bool any_bits_set_anywhere(simd8<uint8_t> bits) const { return !bits_not_set_anywhere(bits); } + template<int N> + simdjson_inline simd8<uint8_t> shr() const { return simd8<uint8_t>(_mm_srli_epi16(*this, N)) & uint8_t(0xFFu >> N); } + template<int N> + simdjson_inline simd8<uint8_t> shl() const { return simd8<uint8_t>(_mm_slli_epi16(*this, N)) & uint8_t(0xFFu << N); } + // Get one of the bits and make a bitmask out of it. + // e.g. value.get_bit<7>() gets the high bit + template<int N> + simdjson_inline int get_bit() const { return _mm_movemask_epi8(_mm_slli_epi16(*this, 7-N)); } + }; + + template<typename T> + struct simd8x64 { + static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<T>); + static_assert(NUM_CHUNKS == 4, "Westmere kernel should use four registers per 64-byte block."); + const simd8<T> chunks[NUM_CHUNKS]; + template<int idx> simd8<uint8_t> get() const { return idx < NUM_CHUNKS ? chunks[idx] : simd8<T>(); } + + simd8x64(const simd8x64<T>& o) = delete; // no copy allowed + simd8x64<T>& operator=(const simd8<T>& other) = delete; // no assignment allowed + simd8x64() = delete; // no default constructor allowed + + simdjson_inline simd8x64(const simd8<T> chunk0, const simd8<T> chunk1, const simd8<T> chunk2, const simd8<T> chunk3) : chunks{chunk0, chunk1, chunk2, chunk3} {} + simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8<T>::load(ptr), simd8<T>::load(ptr+16), simd8<T>::load(ptr+32), simd8<T>::load(ptr+48)} {} + + simdjson_inline void store(T ptr[64]) const { + this->chunks[0].store(ptr+sizeof(simd8<T>)*0); + this->chunks[1].store(ptr+sizeof(simd8<T>)*1); + this->chunks[2].store(ptr+sizeof(simd8<T>)*2); + this->chunks[3].store(ptr+sizeof(simd8<T>)*3); + } + + simdjson_inline simd8<T> reduce_or() const { + return (this->chunks[0] | this->chunks[1]) | (this->chunks[2] | this->chunks[3]); + } + + simdjson_inline uint64_t compress(uint64_t mask, T * output) const { + this->chunks[0].compress(uint16_t(mask), output); + this->chunks[1].compress(uint16_t(mask >> 16), output + 16 - count_ones(mask & 0xFFFF)); + this->chunks[2].compress(uint16_t(mask >> 32), output + 32 - count_ones(mask & 0xFFFFFFFF)); + this->chunks[3].compress(uint16_t(mask >> 48), output + 48 - count_ones(mask & 0xFFFFFFFFFFFF)); + return 64 - count_ones(mask); + } + + simdjson_inline uint64_t to_bitmask() const { + uint64_t r0 = uint32_t(this->chunks[0].to_bitmask() ); + uint64_t r1 = this->chunks[1].to_bitmask() ; + uint64_t r2 = this->chunks[2].to_bitmask() ; + uint64_t r3 = this->chunks[3].to_bitmask() ; + return r0 | (r1 << 16) | (r2 << 32) | (r3 << 48); + } + + simdjson_inline uint64_t eq(const T m) const { + const simd8<T> mask = simd8<T>::splat(m); + return simd8x64<bool>( + this->chunks[0] == mask, + this->chunks[1] == mask, + this->chunks[2] == mask, + this->chunks[3] == mask + ).to_bitmask(); + } + + simdjson_inline uint64_t eq(const simd8x64<uint8_t> &other) const { + return simd8x64<bool>( + this->chunks[0] == other.chunks[0], + this->chunks[1] == other.chunks[1], + this->chunks[2] == other.chunks[2], + this->chunks[3] == other.chunks[3] + ).to_bitmask(); + } + + simdjson_inline uint64_t lteq(const T m) const { + const simd8<T> mask = simd8<T>::splat(m); + return simd8x64<bool>( + this->chunks[0] <= mask, + this->chunks[1] <= mask, + this->chunks[2] <= mask, + this->chunks[3] <= mask + ).to_bitmask(); + } + }; // struct simd8x64<T> + +} // namespace simd +} // unnamed namespace +} // namespace westmere +} // namespace simdjson + +#endif // SIMDJSON_WESTMERE_SIMD_INPUT_H +/* end file simdjson/westmere/simd.h */ +/* including simdjson/westmere/stringparsing_defs.h: #include "simdjson/westmere/stringparsing_defs.h" */ +/* begin file simdjson/westmere/stringparsing_defs.h */ +#ifndef SIMDJSON_WESTMERE_STRINGPARSING_DEFS_H +#define SIMDJSON_WESTMERE_STRINGPARSING_DEFS_H + +/* including simdjson/westmere/bitmanipulation.h: #include "simdjson/westmere/bitmanipulation.h" */ +/* begin file simdjson/westmere/bitmanipulation.h */ +#ifndef SIMDJSON_WESTMERE_BITMANIPULATION_H +#define SIMDJSON_WESTMERE_BITMANIPULATION_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/westmere/intrinsics.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace westmere { +namespace { + +// We sometimes call trailing_zero on inputs that are zero, +// but the algorithms do not end up using the returned value. +// Sadly, sanitizers are not smart enough to figure it out. +SIMDJSON_NO_SANITIZE_UNDEFINED +// This function can be used safely even if not all bytes have been +// initialized. +// See issue https://github.com/simdjson/simdjson/issues/1965 +SIMDJSON_NO_SANITIZE_MEMORY +simdjson_inline int trailing_zeroes(uint64_t input_num) { +#if SIMDJSON_REGULAR_VISUAL_STUDIO + unsigned long ret; + // Search the mask data from least significant bit (LSB) + // to the most significant bit (MSB) for a set bit (1). + _BitScanForward64(&ret, input_num); + return (int)ret; +#else // SIMDJSON_REGULAR_VISUAL_STUDIO + return __builtin_ctzll(input_num); +#endif // SIMDJSON_REGULAR_VISUAL_STUDIO +} + +/* result might be undefined when input_num is zero */ +simdjson_inline uint64_t clear_lowest_bit(uint64_t input_num) { + return input_num & (input_num-1); +} + +/* result might be undefined when input_num is zero */ +simdjson_inline int leading_zeroes(uint64_t input_num) { +#if SIMDJSON_REGULAR_VISUAL_STUDIO + unsigned long leading_zero = 0; + // Search the mask data from most significant bit (MSB) + // to least significant bit (LSB) for a set bit (1). + if (_BitScanReverse64(&leading_zero, input_num)) + return (int)(63 - leading_zero); + else + return 64; +#else + return __builtin_clzll(input_num); +#endif// SIMDJSON_REGULAR_VISUAL_STUDIO +} + +#if SIMDJSON_REGULAR_VISUAL_STUDIO +simdjson_inline unsigned __int64 count_ones(uint64_t input_num) { + // note: we do not support legacy 32-bit Windows in this kernel + return __popcnt64(input_num);// Visual Studio wants two underscores +} +#else +simdjson_inline long long int count_ones(uint64_t input_num) { + return _popcnt64(input_num); +} +#endif + +simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2, + uint64_t *result) { +#if SIMDJSON_REGULAR_VISUAL_STUDIO + return _addcarry_u64(0, value1, value2, + reinterpret_cast<unsigned __int64 *>(result)); +#else + return __builtin_uaddll_overflow(value1, value2, + reinterpret_cast<unsigned long long *>(result)); +#endif +} + +} // unnamed namespace +} // namespace westmere +} // namespace simdjson + +#endif // SIMDJSON_WESTMERE_BITMANIPULATION_H +/* end file simdjson/westmere/bitmanipulation.h */ +/* including simdjson/westmere/simd.h: #include "simdjson/westmere/simd.h" */ +/* begin file simdjson/westmere/simd.h */ +#ifndef SIMDJSON_WESTMERE_SIMD_H +#define SIMDJSON_WESTMERE_SIMD_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/westmere/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace westmere { +namespace { +namespace simd { + + template<typename Child> + struct base { + __m128i value; + + // Zero constructor + simdjson_inline base() : value{__m128i()} {} + + // Conversion from SIMD register + simdjson_inline base(const __m128i _value) : value(_value) {} + + // Conversion to SIMD register + simdjson_inline operator const __m128i&() const { return this->value; } + simdjson_inline operator __m128i&() { return this->value; } + + // Bit operations + simdjson_inline Child operator|(const Child other) const { return _mm_or_si128(*this, other); } + simdjson_inline Child operator&(const Child other) const { return _mm_and_si128(*this, other); } + simdjson_inline Child operator^(const Child other) const { return _mm_xor_si128(*this, other); } + simdjson_inline Child bit_andnot(const Child other) const { return _mm_andnot_si128(other, *this); } + simdjson_inline Child& operator|=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast | other; return *this_cast; } + simdjson_inline Child& operator&=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast & other; return *this_cast; } + simdjson_inline Child& operator^=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast ^ other; return *this_cast; } + }; + + template<typename T, typename Mask=simd8<bool>> + struct base8: base<simd8<T>> { + typedef uint16_t bitmask_t; + typedef uint32_t bitmask2_t; + + simdjson_inline base8() : base<simd8<T>>() {} + simdjson_inline base8(const __m128i _value) : base<simd8<T>>(_value) {} + + friend simdjson_inline Mask operator==(const simd8<T> lhs, const simd8<T> rhs) { return _mm_cmpeq_epi8(lhs, rhs); } + + static const int SIZE = sizeof(base<simd8<T>>::value); + + template<int N=1> + simdjson_inline simd8<T> prev(const simd8<T> prev_chunk) const { + return _mm_alignr_epi8(*this, prev_chunk, 16 - N); + } + }; + + // SIMD byte mask type (returned by things like eq and gt) + template<> + struct simd8<bool>: base8<bool> { + static simdjson_inline simd8<bool> splat(bool _value) { return _mm_set1_epi8(uint8_t(-(!!_value))); } + + simdjson_inline simd8() : base8() {} + simdjson_inline simd8(const __m128i _value) : base8<bool>(_value) {} + // Splat constructor + simdjson_inline simd8(bool _value) : base8<bool>(splat(_value)) {} + + simdjson_inline int to_bitmask() const { return _mm_movemask_epi8(*this); } + simdjson_inline bool any() const { return !_mm_testz_si128(*this, *this); } + simdjson_inline simd8<bool> operator~() const { return *this ^ true; } + }; + + template<typename T> + struct base8_numeric: base8<T> { + static simdjson_inline simd8<T> splat(T _value) { return _mm_set1_epi8(_value); } + static simdjson_inline simd8<T> zero() { return _mm_setzero_si128(); } + static simdjson_inline simd8<T> load(const T values[16]) { + return _mm_loadu_si128(reinterpret_cast<const __m128i *>(values)); + } + // Repeat 16 values as many times as necessary (usually for lookup tables) + static simdjson_inline simd8<T> repeat_16( + T v0, T v1, T v2, T v3, T v4, T v5, T v6, T v7, + T v8, T v9, T v10, T v11, T v12, T v13, T v14, T v15 + ) { + return simd8<T>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + ); + } + + simdjson_inline base8_numeric() : base8<T>() {} + simdjson_inline base8_numeric(const __m128i _value) : base8<T>(_value) {} + + // Store to array + simdjson_inline void store(T dst[16]) const { return _mm_storeu_si128(reinterpret_cast<__m128i *>(dst), *this); } + + // Override to distinguish from bool version + simdjson_inline simd8<T> operator~() const { return *this ^ 0xFFu; } + + // Addition/subtraction are the same for signed and unsigned + simdjson_inline simd8<T> operator+(const simd8<T> other) const { return _mm_add_epi8(*this, other); } + simdjson_inline simd8<T> operator-(const simd8<T> other) const { return _mm_sub_epi8(*this, other); } + simdjson_inline simd8<T>& operator+=(const simd8<T> other) { *this = *this + other; return *static_cast<simd8<T>*>(this); } + simdjson_inline simd8<T>& operator-=(const simd8<T> other) { *this = *this - other; return *static_cast<simd8<T>*>(this); } + + // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values) + template<typename L> + simdjson_inline simd8<L> lookup_16(simd8<L> lookup_table) const { + return _mm_shuffle_epi8(lookup_table, *this); + } + + // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted as a bitset). + // Passing a 0 value for mask would be equivalent to writing out every byte to output. + // Only the first 16 - count_ones(mask) bytes of the result are significant but 16 bytes + // get written. + // Design consideration: it seems like a function with the + // signature simd8<L> compress(uint32_t mask) would be + // sensible, but the AVX ISA makes this kind of approach difficult. + template<typename L> + simdjson_inline void compress(uint16_t mask, L * output) const { + using internal::thintable_epi8; + using internal::BitsSetTable256mul2; + using internal::pshufb_combine_table; + // this particular implementation was inspired by work done by @animetosho + // we do it in two steps, first 8 bytes and then second 8 bytes + uint8_t mask1 = uint8_t(mask); // least significant 8 bits + uint8_t mask2 = uint8_t(mask >> 8); // most significant 8 bits + // next line just loads the 64-bit values thintable_epi8[mask1] and + // thintable_epi8[mask2] into a 128-bit register, using only + // two instructions on most compilers. + __m128i shufmask = _mm_set_epi64x(thintable_epi8[mask2], thintable_epi8[mask1]); + // we increment by 0x08 the second half of the mask + shufmask = + _mm_add_epi8(shufmask, _mm_set_epi32(0x08080808, 0x08080808, 0, 0)); + // this is the version "nearly pruned" + __m128i pruned = _mm_shuffle_epi8(*this, shufmask); + // we still need to put the two halves together. + // we compute the popcount of the first half: + int pop1 = BitsSetTable256mul2[mask1]; + // then load the corresponding mask, what it does is to write + // only the first pop1 bytes from the first 8 bytes, and then + // it fills in with the bytes from the second 8 bytes + some filling + // at the end. + __m128i compactmask = + _mm_loadu_si128(reinterpret_cast<const __m128i *>(pshufb_combine_table + pop1 * 8)); + __m128i answer = _mm_shuffle_epi8(pruned, compactmask); + _mm_storeu_si128(reinterpret_cast<__m128i *>(output), answer); + } + + template<typename L> + simdjson_inline simd8<L> lookup_16( + L replace0, L replace1, L replace2, L replace3, + L replace4, L replace5, L replace6, L replace7, + L replace8, L replace9, L replace10, L replace11, + L replace12, L replace13, L replace14, L replace15) const { + return lookup_16(simd8<L>::repeat_16( + replace0, replace1, replace2, replace3, + replace4, replace5, replace6, replace7, + replace8, replace9, replace10, replace11, + replace12, replace13, replace14, replace15 + )); + } + }; + + // Signed bytes + template<> + struct simd8<int8_t> : base8_numeric<int8_t> { + simdjson_inline simd8() : base8_numeric<int8_t>() {} + simdjson_inline simd8(const __m128i _value) : base8_numeric<int8_t>(_value) {} + // Splat constructor + simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {} + // Array constructor + simdjson_inline simd8(const int8_t* values) : simd8(load(values)) {} + // Member-by-member initialization + simdjson_inline simd8( + int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, + int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 + ) : simd8(_mm_setr_epi8( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + )) {} + // Repeat 16 values as many times as necessary (usually for lookup tables) + simdjson_inline static simd8<int8_t> repeat_16( + int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, + int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 + ) { + return simd8<int8_t>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + ); + } + + // Order-sensitive comparisons + simdjson_inline simd8<int8_t> max_val(const simd8<int8_t> other) const { return _mm_max_epi8(*this, other); } + simdjson_inline simd8<int8_t> min_val(const simd8<int8_t> other) const { return _mm_min_epi8(*this, other); } + simdjson_inline simd8<bool> operator>(const simd8<int8_t> other) const { return _mm_cmpgt_epi8(*this, other); } + simdjson_inline simd8<bool> operator<(const simd8<int8_t> other) const { return _mm_cmpgt_epi8(other, *this); } + }; + + // Unsigned bytes + template<> + struct simd8<uint8_t>: base8_numeric<uint8_t> { + simdjson_inline simd8() : base8_numeric<uint8_t>() {} + simdjson_inline simd8(const __m128i _value) : base8_numeric<uint8_t>(_value) {} + // Splat constructor + simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {} + // Array constructor + simdjson_inline simd8(const uint8_t* values) : simd8(load(values)) {} + // Member-by-member initialization + simdjson_inline simd8( + uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, + uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 + ) : simd8(_mm_setr_epi8( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + )) {} + // Repeat 16 values as many times as necessary (usually for lookup tables) + simdjson_inline static simd8<uint8_t> repeat_16( + uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, + uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 + ) { + return simd8<uint8_t>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + ); + } + + // Saturated math + simdjson_inline simd8<uint8_t> saturating_add(const simd8<uint8_t> other) const { return _mm_adds_epu8(*this, other); } + simdjson_inline simd8<uint8_t> saturating_sub(const simd8<uint8_t> other) const { return _mm_subs_epu8(*this, other); } + + // Order-specific operations + simdjson_inline simd8<uint8_t> max_val(const simd8<uint8_t> other) const { return _mm_max_epu8(*this, other); } + simdjson_inline simd8<uint8_t> min_val(const simd8<uint8_t> other) const { return _mm_min_epu8(*this, other); } + // Same as >, but only guarantees true is nonzero (< guarantees true = -1) + simdjson_inline simd8<uint8_t> gt_bits(const simd8<uint8_t> other) const { return this->saturating_sub(other); } + // Same as <, but only guarantees true is nonzero (< guarantees true = -1) + simdjson_inline simd8<uint8_t> lt_bits(const simd8<uint8_t> other) const { return other.saturating_sub(*this); } + simdjson_inline simd8<bool> operator<=(const simd8<uint8_t> other) const { return other.max_val(*this) == other; } + simdjson_inline simd8<bool> operator>=(const simd8<uint8_t> other) const { return other.min_val(*this) == other; } + simdjson_inline simd8<bool> operator>(const simd8<uint8_t> other) const { return this->gt_bits(other).any_bits_set(); } + simdjson_inline simd8<bool> operator<(const simd8<uint8_t> other) const { return this->gt_bits(other).any_bits_set(); } + + // Bit-specific operations + simdjson_inline simd8<bool> bits_not_set() const { return *this == uint8_t(0); } + simdjson_inline simd8<bool> bits_not_set(simd8<uint8_t> bits) const { return (*this & bits).bits_not_set(); } + simdjson_inline simd8<bool> any_bits_set() const { return ~this->bits_not_set(); } + simdjson_inline simd8<bool> any_bits_set(simd8<uint8_t> bits) const { return ~this->bits_not_set(bits); } + simdjson_inline bool is_ascii() const { return _mm_movemask_epi8(*this) == 0; } + simdjson_inline bool bits_not_set_anywhere() const { return _mm_testz_si128(*this, *this); } + simdjson_inline bool any_bits_set_anywhere() const { return !bits_not_set_anywhere(); } + simdjson_inline bool bits_not_set_anywhere(simd8<uint8_t> bits) const { return _mm_testz_si128(*this, bits); } + simdjson_inline bool any_bits_set_anywhere(simd8<uint8_t> bits) const { return !bits_not_set_anywhere(bits); } + template<int N> + simdjson_inline simd8<uint8_t> shr() const { return simd8<uint8_t>(_mm_srli_epi16(*this, N)) & uint8_t(0xFFu >> N); } + template<int N> + simdjson_inline simd8<uint8_t> shl() const { return simd8<uint8_t>(_mm_slli_epi16(*this, N)) & uint8_t(0xFFu << N); } + // Get one of the bits and make a bitmask out of it. + // e.g. value.get_bit<7>() gets the high bit + template<int N> + simdjson_inline int get_bit() const { return _mm_movemask_epi8(_mm_slli_epi16(*this, 7-N)); } + }; + + template<typename T> + struct simd8x64 { + static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<T>); + static_assert(NUM_CHUNKS == 4, "Westmere kernel should use four registers per 64-byte block."); + const simd8<T> chunks[NUM_CHUNKS]; + template<int idx> simd8<uint8_t> get() const { return idx < NUM_CHUNKS ? chunks[idx] : simd8<T>(); } + + simd8x64(const simd8x64<T>& o) = delete; // no copy allowed + simd8x64<T>& operator=(const simd8<T>& other) = delete; // no assignment allowed + simd8x64() = delete; // no default constructor allowed + + simdjson_inline simd8x64(const simd8<T> chunk0, const simd8<T> chunk1, const simd8<T> chunk2, const simd8<T> chunk3) : chunks{chunk0, chunk1, chunk2, chunk3} {} + simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8<T>::load(ptr), simd8<T>::load(ptr+16), simd8<T>::load(ptr+32), simd8<T>::load(ptr+48)} {} + + simdjson_inline void store(T ptr[64]) const { + this->chunks[0].store(ptr+sizeof(simd8<T>)*0); + this->chunks[1].store(ptr+sizeof(simd8<T>)*1); + this->chunks[2].store(ptr+sizeof(simd8<T>)*2); + this->chunks[3].store(ptr+sizeof(simd8<T>)*3); + } + + simdjson_inline simd8<T> reduce_or() const { + return (this->chunks[0] | this->chunks[1]) | (this->chunks[2] | this->chunks[3]); + } + + simdjson_inline uint64_t compress(uint64_t mask, T * output) const { + this->chunks[0].compress(uint16_t(mask), output); + this->chunks[1].compress(uint16_t(mask >> 16), output + 16 - count_ones(mask & 0xFFFF)); + this->chunks[2].compress(uint16_t(mask >> 32), output + 32 - count_ones(mask & 0xFFFFFFFF)); + this->chunks[3].compress(uint16_t(mask >> 48), output + 48 - count_ones(mask & 0xFFFFFFFFFFFF)); + return 64 - count_ones(mask); + } + + simdjson_inline uint64_t to_bitmask() const { + uint64_t r0 = uint32_t(this->chunks[0].to_bitmask() ); + uint64_t r1 = this->chunks[1].to_bitmask() ; + uint64_t r2 = this->chunks[2].to_bitmask() ; + uint64_t r3 = this->chunks[3].to_bitmask() ; + return r0 | (r1 << 16) | (r2 << 32) | (r3 << 48); + } + + simdjson_inline uint64_t eq(const T m) const { + const simd8<T> mask = simd8<T>::splat(m); + return simd8x64<bool>( + this->chunks[0] == mask, + this->chunks[1] == mask, + this->chunks[2] == mask, + this->chunks[3] == mask + ).to_bitmask(); + } + + simdjson_inline uint64_t eq(const simd8x64<uint8_t> &other) const { + return simd8x64<bool>( + this->chunks[0] == other.chunks[0], + this->chunks[1] == other.chunks[1], + this->chunks[2] == other.chunks[2], + this->chunks[3] == other.chunks[3] + ).to_bitmask(); + } + + simdjson_inline uint64_t lteq(const T m) const { + const simd8<T> mask = simd8<T>::splat(m); + return simd8x64<bool>( + this->chunks[0] <= mask, + this->chunks[1] <= mask, + this->chunks[2] <= mask, + this->chunks[3] <= mask + ).to_bitmask(); + } + }; // struct simd8x64<T> + +} // namespace simd +} // unnamed namespace +} // namespace westmere +} // namespace simdjson + +#endif // SIMDJSON_WESTMERE_SIMD_INPUT_H +/* end file simdjson/westmere/simd.h */ + +namespace simdjson { +namespace westmere { +namespace { + +using namespace simd; + +// Holds backslashes and quotes locations. +struct backslash_and_quote { +public: + static constexpr uint32_t BYTES_PROCESSED = 32; + simdjson_inline backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst); + + simdjson_inline bool has_quote_first() { return ((bs_bits - 1) & quote_bits) != 0; } + simdjson_inline bool has_backslash() { return bs_bits != 0; } + simdjson_inline int quote_index() { return trailing_zeroes(quote_bits); } + simdjson_inline int backslash_index() { return trailing_zeroes(bs_bits); } + + uint32_t bs_bits; + uint32_t quote_bits; +}; // struct backslash_and_quote + +simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) { + // this can read up to 31 bytes beyond the buffer size, but we require + // SIMDJSON_PADDING of padding + static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "backslash and quote finder must process fewer than SIMDJSON_PADDING bytes"); + simd8<uint8_t> v0(src); + simd8<uint8_t> v1(src + 16); + v0.store(dst); + v1.store(dst + 16); + uint64_t bs_and_quote = simd8x64<bool>(v0 == '\\', v1 == '\\', v0 == '"', v1 == '"').to_bitmask(); + return { + uint32_t(bs_and_quote), // bs_bits + uint32_t(bs_and_quote >> 32) // quote_bits + }; +} + + +struct escaping { + static constexpr uint32_t BYTES_PROCESSED = 16; + simdjson_inline static escaping copy_and_find(const uint8_t *src, uint8_t *dst); + + simdjson_inline bool has_escape() { return escape_bits != 0; } + simdjson_inline int escape_index() { return trailing_zeroes(escape_bits); } + + uint64_t escape_bits; +}; // struct escaping + + + +simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *dst) { + static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "escaping finder must process fewer than SIMDJSON_PADDING bytes"); + simd8<uint8_t> v(src); + v.store(dst); + simd8<bool> is_quote = (v == '"'); + simd8<bool> is_backslash = (v == '\\'); + simd8<bool> is_control = (v < 32); + return { + uint64_t((is_backslash | is_quote | is_control).to_bitmask()) + }; +} + +} // unnamed namespace +} // namespace westmere +} // namespace simdjson + +#endif // SIMDJSON_WESTMERE_STRINGPARSING_DEFS_H +/* end file simdjson/westmere/stringparsing_defs.h */ +/* end file simdjson/westmere/begin.h */ +/* including simdjson/generic/builder/amalgamated.h for westmere: #include "simdjson/generic/builder/amalgamated.h" */ +/* begin file simdjson/generic/builder/amalgamated.h for westmere */ +#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_BUILDER_DEPENDENCIES_H) +#error simdjson/generic/builder/dependencies.h must be included before simdjson/generic/builder/amalgamated.h! +#endif + +/* including simdjson/generic/builder/json_string_builder.h for westmere: #include "simdjson/generic/builder/json_string_builder.h" */ +/* begin file simdjson/generic/builder/json_string_builder.h for westmere */ +#ifndef SIMDJSON_GENERIC_STRING_BUILDER_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { + + +#if SIMDJSON_SUPPORTS_CONCEPTS + +namespace westmere { +namespace builder { + class string_builder; +}} + +template <typename T, typename = void> +struct has_custom_serialization : std::false_type {}; + +inline constexpr struct serialize_tag { + template <typename T> + constexpr void operator()(westmere::builder::string_builder& b, T&& obj) const{ + return tag_invoke(*this, b, std::forward<T>(obj)); + } + + +} serialize{}; +template <typename T> +struct has_custom_serialization<T, std::void_t< + decltype(tag_invoke(serialize, std::declval<westmere::builder::string_builder&>(), std::declval<T&>())) +>> : std::true_type {}; + +template <typename T> +constexpr bool require_custom_serialization = has_custom_serialization<T>::value; +#else +struct has_custom_serialization : std::false_type {}; +#endif // SIMDJSON_SUPPORTS_CONCEPTS + +namespace westmere { +namespace builder { +/** + * A builder for JSON strings representing documents. This is a low-level + * builder that is not meant to be used directly by end-users. Though it + * supports atomic types (Booleans, strings), it does not support composed + * types (arrays and objects). + * + * Ultimately, this class can support kernel-specific optimizations. E.g., + * it may make use of SIMD instructions to escape strings faster. + */ +class string_builder { +public: + simdjson_inline string_builder(size_t initial_capacity = DEFAULT_INITIAL_CAPACITY); + + static constexpr size_t DEFAULT_INITIAL_CAPACITY = 1024; + + /** + * Append number (includes Booleans). Booleans are mapped to the strings + * false and true. Numbers are converted to strings abiding by the JSON standard. + * Floating-point numbers are converted to the shortest string that 'correctly' + * represents the number. + */ + template<typename number_type, + typename = typename std::enable_if<std::is_arithmetic<number_type>::value>::type> + simdjson_inline void append(number_type v) noexcept; + + /** + * Append character c. + */ + simdjson_inline void append(char c) noexcept; + + /** + * Append the string 'null'. + */ + simdjson_inline void append_null() noexcept; + + /** + * Clear the content. + */ + simdjson_inline void clear() noexcept; + + /** + * Append the std::string_view, after escaping it. + * There is no UTF-8 validation. + */ + simdjson_inline void escape_and_append(std::string_view input) noexcept; + + /** + * Append the std::string_view surrounded by double quotes, after escaping it. + * There is no UTF-8 validation. + */ + simdjson_inline void escape_and_append_with_quotes(std::string_view input) noexcept; +#if SIMDJSON_SUPPORTS_CONCEPTS + template<constevalutil::fixed_string key> + simdjson_inline void escape_and_append_with_quotes() noexcept; +#endif + /** + * Append the character surrounded by double quotes, after escaping it. + * There is no UTF-8 validation. + */ + simdjson_inline void escape_and_append_with_quotes(char input) noexcept; + + /** + * Append the character surrounded by double quotes, after escaping it. + * There is no UTF-8 validation. + */ + simdjson_inline void escape_and_append_with_quotes(const char* input) noexcept; + + /** + * Append the C string directly, without escaping. + * There is no UTF-8 validation. + */ + simdjson_inline void append_raw(const char *c) noexcept; + + /** + * Append "{" to the buffer. + */ + simdjson_inline void start_object() noexcept; + + /** + * Append "}" to the buffer. + */ + simdjson_inline void end_object() noexcept; + + /** + * Append "[" to the buffer. + */ + simdjson_inline void start_array() noexcept; + + /** + * Append "]" to the buffer. + */ + simdjson_inline void end_array() noexcept; + + /** + * Append "," to the buffer. + */ + simdjson_inline void append_comma() noexcept; + + /** + * Append ":" to the buffer. + */ + simdjson_inline void append_colon() noexcept; + + /** + * Append a key-value pair to the buffer. + * The key is escaped and surrounded by double quotes. + * The value is escaped if it is a string. + */ + template<typename key_type, typename value_type> + simdjson_inline void append_key_value(key_type key, value_type value) noexcept; +#if SIMDJSON_SUPPORTS_CONCEPTS + template<constevalutil::fixed_string key, typename value_type> + simdjson_inline void append_key_value(value_type value) noexcept; + + // Support for optional types (std::optional, etc.) + template <concepts::optional_type T> + requires(!require_custom_serialization<T>) + simdjson_inline void append(const T &opt); + + template <typename T> + requires(require_custom_serialization<T>) + simdjson_inline void append(T &&val); + + // Support for string-like types + template <typename T> + requires(std::is_convertible<T, std::string_view>::value || + std::is_same<T, const char*>::value ) + simdjson_inline void append(const T &value); +#endif +#if SIMDJSON_SUPPORTS_RANGES && SIMDJSON_SUPPORTS_CONCEPTS + // Support for range-based appending (std::ranges::view, etc.) + template <std::ranges::range R> +requires (!std::is_convertible<R, std::string_view>::value && !require_custom_serialization<R>) + simdjson_inline void append(const R &range) noexcept; +#endif + /** + * Append the std::string_view directly, without escaping. + * There is no UTF-8 validation. + */ + simdjson_inline void append_raw(std::string_view input) noexcept; + + /** + * Append len characters from str. + * There is no UTF-8 validation. + */ + simdjson_inline void append_raw(const char *str, size_t len) noexcept; +#if SIMDJSON_EXCEPTIONS + /** + * Creates an std::string from the written JSON buffer. + * Throws if memory allocation failed + * + * The result may not be valid UTF-8 if some of your content was not valid UTF-8. + * Use validate_unicode() to check the content if needed. + */ + simdjson_inline operator std::string() const noexcept(false); + + /** + * Creates an std::string_view from the written JSON buffer. + * Throws if memory allocation failed. + * + * The result may not be valid UTF-8 if some of your content was not valid UTF-8. + * Use validate_unicode() to check the content if needed. + */ + simdjson_inline operator std::string_view() const noexcept(false) simdjson_lifetime_bound; +#endif + + /** + * Returns a view on the written JSON buffer. Returns an error + * if memory allocation failed. + * + * The result may not be valid UTF-8 if some of your content was not valid UTF-8. + * Use validate_unicode() to check the content. + */ + simdjson_inline simdjson_result<std::string_view> view() const noexcept; + + /** + * Appends the null character to the buffer and returns + * a pointer to the beginning of the written JSON buffer. + * Returns an error if memory allocation failed. + * The result is null-terminated. + * + * The result may not be valid UTF-8 if some of your content was not valid UTF-8. + * Use validate_unicode() to check the content. + */ + simdjson_inline simdjson_result<const char *> c_str() noexcept; + + /** + * Return true if the content is valid UTF-8. + */ + simdjson_inline bool validate_unicode() const noexcept; + + /** + * Returns the current size of the written JSON buffer. + * If an error occurred, returns 0. + */ + simdjson_inline size_t size() const noexcept; + +private: + /** + * Returns true if we can write at least upcoming_bytes bytes. + * The underlying buffer is reallocated if needed. It is designed + * to be called before writing to the buffer. It should be fast. + */ + simdjson_inline bool capacity_check(size_t upcoming_bytes); + + /** + * Grow the buffer to at least desired_capacity bytes. + * If the allocation fails, is_valid is set to false. We expect + * that this function would not be repeatedly called. + */ + simdjson_inline void grow_buffer(size_t desired_capacity); + + /** + * We use this helper function to make sure that is_valid is kept consistent. + */ + simdjson_inline void set_valid(bool valid) noexcept; + + std::unique_ptr<char[]> buffer{}; + size_t position{0}; + size_t capacity{0}; + bool is_valid{true}; +}; + + + +} +} + + +#if !SIMDJSON_STATIC_REFLECTION +// fallback implementation until we have static reflection +template <class Z> +simdjson_warn_unused simdjson_result<std::string> to_json(const Z &z, size_t initial_capacity = simdjson::westmere::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + simdjson::westmere::builder::string_builder b(initial_capacity); + b.append(z); + std::string_view s; + auto e = b.view().get(s); + if(e) { return e; } + return std::string(s); +} +template <class Z> +simdjson_warn_unused error_code to_json(const Z &z, std::string &s, size_t initial_capacity = simdjson::westmere::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + simdjson::westmere::builder::string_builder b(initial_capacity); + b.append(z); + std::string_view sv; + auto e = b.view().get(sv); + if(e) { return e; } + s.assign(sv.data(), sv.size()); + return simdjson::SUCCESS; +} +#endif + +#if SIMDJSON_SUPPORTS_CONCEPTS +#endif // SIMDJSON_SUPPORTS_CONCEPTS + +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_STRING_BUILDER_H +/* end file simdjson/generic/builder/json_string_builder.h for westmere */ +/* including simdjson/generic/builder/json_builder.h for westmere: #include "simdjson/generic/builder/json_builder.h" */ +/* begin file simdjson/generic/builder/json_builder.h for westmere */ +#ifndef SIMDJSON_GENERIC_BUILDER_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_string_builder.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/concepts.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ +#if SIMDJSON_STATIC_REFLECTION + +#include <charconv> +#include <cstring> +#include <meta> +#include <memory> +#include <optional> +#include <string_view> +#include <type_traits> +#include <utility> +// #include <static_reflection> // for std::define_static_string - header not available yet + +namespace simdjson { +namespace westmere { +namespace builder { + +template <class T> + requires(concepts::container_but_not_string<T> && !require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &t) { + auto it = t.begin(); + auto end = t.end(); + if (it == end) { + b.append_raw("[]"); + return; + } + b.append('['); + atom(b, *it); + ++it; + for (; it != end; ++it) { + b.append(','); + atom(b, *it); + } + b.append(']'); +} + +template <class T> + requires(std::is_same_v<T, std::string> || + std::is_same_v<T, std::string_view> || + std::is_same_v<T, const char *> || + std::is_same_v<T, char>) +constexpr void atom(string_builder &b, const T &t) { + b.escape_and_append_with_quotes(t); +} + +template <concepts::string_view_keyed_map T> + requires(!require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &m) { + if (m.empty()) { + b.append_raw("{}"); + return; + } + b.append('{'); + bool first = true; + for (const auto& [key, value] : m) { + if (!first) { + b.append(','); + } + first = false; + // Keys must be convertible to string_view per the concept + b.escape_and_append_with_quotes(key); + b.append(':'); + atom(b, value); + } + b.append('}'); +} + + +template<typename number_type, + typename = typename std::enable_if<std::is_arithmetic<number_type>::value && !std::is_same_v<number_type, char>>::type> +constexpr void atom(string_builder &b, const number_type t) { + b.append(t); +} + +template <class T> + requires(std::is_class_v<T> && !concepts::container_but_not_string<T> && + !concepts::string_view_keyed_map<T> && + !concepts::optional_type<T> && + !concepts::smart_pointer<T> && + !concepts::appendable_containers<T> && + !std::is_same_v<T, std::string> && + !std::is_same_v<T, std::string_view> && + !std::is_same_v<T, const char*> && + !std::is_same_v<T, char> && !require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &t) { + int i = 0; + b.append('{'); + template for (constexpr auto dm : std::define_static_array(std::meta::nonstatic_data_members_of(^^T, std::meta::access_context::unchecked()))) { + if (i != 0) + b.append(','); + constexpr auto key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(dm))); + b.append_raw(key); + b.append(':'); + atom(b, t.[:dm:]); + i++; + }; + b.append('}'); +} + +// Support for optional types (std::optional, etc.) +template <concepts::optional_type T> + requires(!require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &opt) { + if (opt) { + atom(b, opt.value()); + } else { + b.append_raw("null"); + } +} + +// Support for smart pointers (std::unique_ptr, std::shared_ptr, etc.) +template <concepts::smart_pointer T> + requires(!require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &ptr) { + if (ptr) { + atom(b, *ptr); + } else { + b.append_raw("null"); + } +} + +// Support for enums - serialize as string representation using expand approach from P2996R12 +template <typename T> + requires(std::is_enum_v<T> && !require_custom_serialization<T>) +void atom(string_builder &b, const T &e) { +#if SIMDJSON_STATIC_REFLECTION + constexpr auto enumerators = std::define_static_array(std::meta::enumerators_of(^^T)); + template for (constexpr auto enum_val : enumerators) { + constexpr auto enum_str = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(enum_val))); + if (e == [:enum_val:]) { + b.append_raw(enum_str); + return; + } + }; + // Fallback to integer if enum value not found + atom(b, static_cast<std::underlying_type_t<T>>(e)); +#else + // Fallback: serialize as integer if reflection not available + atom(b, static_cast<std::underlying_type_t<T>>(e)); +#endif +} + +// Support for appendable containers that don't have operator[] (sets, etc.) +template <concepts::appendable_containers T> + requires(!concepts::container_but_not_string<T> && !concepts::string_view_keyed_map<T> && + !concepts::optional_type<T> && !concepts::smart_pointer<T> && + !std::is_same_v<T, std::string> && + !std::is_same_v<T, std::string_view> && !std::is_same_v<T, const char*> && !require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &container) { + if (container.empty()) { + b.append_raw("[]"); + return; + } + b.append('['); + bool first = true; + for (const auto& item : container) { + if (!first) { + b.append(','); + } + first = false; + atom(b, item); + } + b.append(']'); +} + +// append functions that delegate to atom functions for primitive types +template <class T> + requires(std::is_arithmetic_v<T> && !std::is_same_v<T, char>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +template <class T> + requires(std::is_same_v<T, std::string> || + std::is_same_v<T, std::string_view> || + std::is_same_v<T, const char *> || + std::is_same_v<T, char>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +template <concepts::optional_type T> + requires(!require_custom_serialization<T>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +template <concepts::smart_pointer T> + requires(!require_custom_serialization<T>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +template <concepts::appendable_containers T> + requires(!concepts::container_but_not_string<T> && !concepts::string_view_keyed_map<T> && + !concepts::optional_type<T> && !concepts::smart_pointer<T> && + !std::is_same_v<T, std::string> && + !std::is_same_v<T, std::string_view> && !std::is_same_v<T, const char*> && !require_custom_serialization<T>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +template <concepts::string_view_keyed_map T> + requires(!require_custom_serialization<T>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +// works for struct +template <class Z> + requires(std::is_class_v<Z> && !concepts::container_but_not_string<Z> && + !concepts::string_view_keyed_map<Z> && + !concepts::optional_type<Z> && + !concepts::smart_pointer<Z> && + !concepts::appendable_containers<Z> && + !std::is_same_v<Z, std::string> && + !std::is_same_v<Z, std::string_view> && + !std::is_same_v<Z, const char*> && + !std::is_same_v<Z, char> && !require_custom_serialization<Z>) +void append(string_builder &b, const Z &z) { + int i = 0; + b.append('{'); + template for (constexpr auto dm : std::define_static_array(std::meta::nonstatic_data_members_of(^^Z, std::meta::access_context::unchecked()))) { + if (i != 0) + b.append(','); + constexpr auto key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(dm))); + b.append_raw(key); + b.append(':'); + atom(b, z.[:dm:]); + i++; + }; + b.append('}'); +} + +// works for container that have begin() and end() iterators +template <class Z> + requires(concepts::container_but_not_string<Z> && !require_custom_serialization<Z>) +void append(string_builder &b, const Z &z) { + auto it = z.begin(); + auto end = z.end(); + if (it == end) { + b.append_raw("[]"); + return; + } + b.append('['); + atom(b, *it); + ++it; + for (; it != end; ++it) { + b.append(','); + atom(b, *it); + } + b.append(']'); +} + +template <class Z> + requires (require_custom_serialization<Z>) +void append(string_builder &b, const Z &z) { + b.append(z); +} + + +template <class Z> +simdjson_warn_unused simdjson_result<std::string> to_json_string(const Z &z, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + string_builder b(initial_capacity); + append(b, z); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); +} + +template <class Z> +simdjson_warn_unused error_code to_json(const Z &z, std::string &s, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + string_builder b(initial_capacity); + append(b, z); + std::string_view view; + if(auto e = b.view().get(view); e) { return e; } + s.assign(view); + return SUCCESS; +} + +template <class Z> +string_builder& operator<<(string_builder& b, const Z& z) { + append(b, z); + return b; +} + +// extract_from: Serialize only specific fields from a struct to JSON +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +void extract_from(string_builder &b, const T &obj) { + // Helper to check if a field name matches any of the requested fields + auto should_extract = [](std::string_view field_name) constexpr -> bool { + return ((FieldNames.view() == field_name) || ...); + }; + + b.append('{'); + bool first = true; + + // Iterate through all members of T using reflection + template for (constexpr auto mem : std::define_static_array( + std::meta::nonstatic_data_members_of(^^T, std::meta::access_context::unchecked()))) { + + if constexpr (std::meta::is_public(mem)) { + constexpr std::string_view key = std::define_static_string(std::meta::identifier_of(mem)); + + // Only serialize this field if it's in our list of requested fields + if constexpr (should_extract(key)) { + if (!first) { + b.append(','); + } + first = false; + + // Serialize the key + constexpr auto quoted_key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(mem))); + b.append_raw(quoted_key); + b.append(':'); + + // Serialize the value + atom(b, obj.[:mem:]); + } + } + }; + + b.append('}'); +} + +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result<std::string> extract_from(const T &obj, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + string_builder b(initial_capacity); + extract_from<FieldNames...>(b, obj); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); +} + +} // namespace builder +} // namespace westmere +// Alias the function template to 'to' in the global namespace +template <class Z> +simdjson_warn_unused simdjson_result<std::string> to_json(const Z &z, size_t initial_capacity = westmere::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + westmere::builder::string_builder b(initial_capacity); + westmere::builder::append(b, z); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); +} +template <class Z> +simdjson_warn_unused error_code to_json(const Z &z, std::string &s, size_t initial_capacity = westmere::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + westmere::builder::string_builder b(initial_capacity); + westmere::builder::append(b, z); + std::string_view view; + if(auto e = b.view().get(view); e) { return e; } + s.assign(view); + return SUCCESS; +} +// Global namespace function for extract_from +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result<std::string> extract_from(const T &obj, size_t initial_capacity = westmere::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + westmere::builder::string_builder b(initial_capacity); + westmere::builder::extract_from<FieldNames...>(b, obj); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); +} + +} // namespace simdjson + +#endif // SIMDJSON_STATIC_REFLECTION + +#endif +/* end file simdjson/generic/builder/json_builder.h for westmere */ +/* including simdjson/generic/builder/fractured_json_builder.h for westmere: #include "simdjson/generic/builder/fractured_json_builder.h" */ +/* begin file simdjson/generic/builder/fractured_json_builder.h for westmere */ +#ifndef SIMDJSON_GENERIC_FRACTURED_JSON_BUILDER_H +#define SIMDJSON_GENERIC_FRACTURED_JSON_BUILDER_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_builder.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/dom/fractured_json.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#if SIMDJSON_STATIC_REFLECTION + +namespace simdjson { +namespace westmere { +namespace builder { + +/** + * Serialize an object to a FracturedJson-formatted string. + * + * FracturedJson produces human-readable yet compact JSON output by intelligently + * choosing between different layout strategies (inline, compact multiline, table, + * expanded) based on content complexity, length, and structure similarity. + * + * This function combines the builder's serialization with FracturedJson formatting: + * 1. Serializes the object to minified JSON using reflection + * 2. Parses and reformats using FracturedJson + * + * Example: + * struct User { int id; std::string name; bool active; }; + * User user{1, "Alice", true}; + * auto result = to_fractured_json_string(user); + * // result.value() == "{ \"id\": 1, \"name\": \"Alice\", \"active\": true }" + * + * @param obj The object to serialize (must be a reflectable type) + * @param opts FracturedJson formatting options + * @param initial_capacity Initial buffer capacity for serialization + * @return The formatted JSON string, or an error + */ +template <class T> +simdjson_warn_unused simdjson_result<std::string> to_fractured_json_string( + const T& obj, + const fractured_json_options& opts = {}, + size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + // Step 1: Serialize to minified JSON + std::string formatted; + auto error = to_json_string(obj, initial_capacity).get(formatted); + if (error) { + return error; + } + + // Step 2: Reformat with FracturedJson + return fractured_json_string(formatted, opts); +} + +/** + * Extract specific fields from an object and format with FracturedJson. + * + * Example: + * struct User { int id; std::string name; std::string email; bool active; }; + * User user{1, "Alice", "alice@example.com", true}; + * auto result = extract_fractured_json<"id", "name">(user); + * // result.value() == "{ \"id\": 1, \"name\": \"Alice\" }" + * + * @param obj The object to serialize + * @param opts FracturedJson formatting options + * @param initial_capacity Initial buffer capacity for serialization + * @return The formatted JSON string containing only the specified fields + */ +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result<std::string> extract_fractured_json( + const T& obj, + const fractured_json_options& opts = {}, + size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + // Step 1: Extract fields to minified JSON + std::string formatted; + auto error = extract_from<FieldNames...>(obj, initial_capacity).get(formatted); + if (error) { + return error; + } + + // Step 2: Reformat with FracturedJson + return fractured_json_string(formatted, opts); +} + +} // namespace builder +} // namespace westmere + +// Global namespace convenience functions + +/** + * Serialize an object to a FracturedJson-formatted string. + * Global namespace version for convenience. + */ +template <class T> +simdjson_warn_unused simdjson_result<std::string> to_fractured_json_string( + const T& obj, + const fractured_json_options& opts = {}, + size_t initial_capacity = westmere::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + return westmere::builder::to_fractured_json_string(obj, opts, initial_capacity); +} +/** + * Extract specific fields from an object and format with FracturedJson. + * Global namespace version for convenience. + */ +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result<std::string> extract_fractured_json( + const T& obj, + const fractured_json_options& opts = {}, + size_t initial_capacity = westmere::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + return westmere::builder::extract_fractured_json<FieldNames...>(obj, opts, initial_capacity); +} + +} // namespace simdjson + +#endif // SIMDJSON_STATIC_REFLECTION + +#endif // SIMDJSON_GENERIC_FRACTURED_JSON_BUILDER_H +/* end file simdjson/generic/builder/fractured_json_builder.h for westmere */ + + + +// JSON builder inline definitions +/* including simdjson/generic/builder/json_string_builder-inl.h for westmere: #include "simdjson/generic/builder/json_string_builder-inl.h" */ +/* begin file simdjson/generic/builder/json_string_builder-inl.h for westmere */ +#include <array> +#include <cstring> +#include <type_traits> +#ifndef SIMDJSON_GENERIC_STRING_BUILDER_INL_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_INL_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_string_builder.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +/* + * Empirically, we have found that an inlined optimization is important for + * performance. The following macros are not ideal. We should find a better + * way to inline the code. + */ + +#if defined(__SSE2__) || defined(__x86_64__) || defined(__x86_64) || \ + (defined(_M_AMD64) || defined(_M_X64) || \ + (defined(_M_IX86_FP) && _M_IX86_FP == 2)) +#ifndef SIMDJSON_EXPERIMENTAL_HAS_SSE2 +#define SIMDJSON_EXPERIMENTAL_HAS_SSE2 1 +#endif +#endif + +#if defined(__aarch64__) || defined(_M_ARM64) +#ifndef SIMDJSON_EXPERIMENTAL_HAS_NEON +#define SIMDJSON_EXPERIMENTAL_HAS_NEON 1 +#endif +#endif +#if defined(__loongarch_sx) +#ifndef SIMDJSON_EXPERIMENTAL_HAS_LSX +#define SIMDJSON_EXPERIMENTAL_HAS_LSX 1 +#endif +#endif +#if defined(__riscv_v_intrinsic) && __riscv_v_intrinsic >= 11000 && \ + defined(__riscv_vector) +#ifndef SIMDJSON_EXPERIMENTAL_HAS_RVV +#define SIMDJSON_EXPERIMENTAL_HAS_RVV 1 +#endif +#endif +#if (defined(__PPC64__) || defined(_M_PPC64)) && defined(__ALTIVEC__) +#ifndef SIMDJSON_EXPERIMENTAL_HAS_PPC64 +#define SIMDJSON_EXPERIMENTAL_HAS_PPC64 1 +#endif +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_NEON +#include <arm_neon.h> +#ifdef _MSC_VER +#include <intrin.h> +#endif +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_SSE2 +#include <emmintrin.h> +#ifdef _MSC_VER +#include <intrin.h> +#endif +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_LSX +#include <lsxintrin.h> +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_RVV +#include <riscv_vector.h> +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_PPC64 +#include <altivec.h> +#ifdef bool +#undef bool +#endif +#ifdef vector +#undef vector +#endif +#endif + + +namespace simdjson { +namespace westmere { +namespace builder { + +static SIMDJSON_CONSTEXPR_LAMBDA std::array<uint8_t, 256> + json_quotable_character = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + +/** + +A possible SWAR implementation of has_json_escapable_byte. It is not used +because it is slower than the current implementation. It is kept here for +reference (to show that we tried it). + +inline bool has_json_escapable_byte(uint64_t x) { + uint64_t is_ascii = 0x8080808080808080ULL & ~x; + uint64_t xor2 = x ^ 0x0202020202020202ULL; + uint64_t lt32_or_eq34 = xor2 - 0x2121212121212121ULL; + uint64_t sub92 = x ^ 0x5C5C5C5C5C5C5C5CULL; + uint64_t eq92 = (sub92 - 0x0101010101010101ULL); + return ((lt32_or_eq34 | eq92) & is_ascii) != 0; +} + +**/ + +SIMDJSON_CONSTEXPR_LAMBDA simdjson_inline bool +simple_needs_escaping(std::string_view v) { + for (char c : v) { + // a table lookup is faster than a series of comparisons + if (json_quotable_character[static_cast<uint8_t>(c)]) { + return true; + } + } + return false; +} + +#if SIMDJSON_EXPERIMENTAL_HAS_NEON +simdjson_inline bool fast_needs_escaping(std::string_view view) { + if (view.size() < 16) { + return simple_needs_escaping(view); + } + size_t i = 0; + uint8x16_t running = vdupq_n_u8(0); + uint8x16_t v34 = vdupq_n_u8(34); + uint8x16_t v92 = vdupq_n_u8(92); + + for (; i + 15 < view.size(); i += 16) { + uint8x16_t word = vld1q_u8((const uint8_t *)view.data() + i); + running = vorrq_u8(running, vceqq_u8(word, v34)); + running = vorrq_u8(running, vceqq_u8(word, v92)); + running = vorrq_u8(running, vcltq_u8(word, vdupq_n_u8(32))); + } + if (i < view.size()) { + uint8x16_t word = + vld1q_u8((const uint8_t *)view.data() + view.length() - 16); + running = vorrq_u8(running, vceqq_u8(word, v34)); + running = vorrq_u8(running, vceqq_u8(word, v92)); + running = vorrq_u8(running, vcltq_u8(word, vdupq_n_u8(32))); + } + return vmaxvq_u32(vreinterpretq_u32_u8(running)) != 0; +} +#elif SIMDJSON_EXPERIMENTAL_HAS_SSE2 +simdjson_inline bool fast_needs_escaping(std::string_view view) { + if (view.size() < 16) { + return simple_needs_escaping(view); + } + size_t i = 0; + __m128i running = _mm_setzero_si128(); + for (; i + 15 < view.size(); i += 16) { + + __m128i word = + _mm_loadu_si128(reinterpret_cast<const __m128i *>(view.data() + i)); + running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(34))); + running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(92))); + running = _mm_or_si128( + running, _mm_cmpeq_epi8(_mm_subs_epu8(word, _mm_set1_epi8(31)), + _mm_setzero_si128())); + } + if (i < view.size()) { + __m128i word = _mm_loadu_si128( + reinterpret_cast<const __m128i *>(view.data() + view.length() - 16)); + running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(34))); + running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(92))); + running = _mm_or_si128( + running, _mm_cmpeq_epi8(_mm_subs_epu8(word, _mm_set1_epi8(31)), + _mm_setzero_si128())); + } + return _mm_movemask_epi8(running) != 0; +} +#elif SIMDJSON_EXPERIMENTAL_HAS_PPC64 +simdjson_inline bool fast_needs_escaping(std::string_view view) { + if (view.size() < 16) { + return simple_needs_escaping(view); + } + size_t i = 0; + __vector unsigned char running = vec_splats((unsigned char)0); + __vector unsigned char v34 = vec_splats((unsigned char)34); + __vector unsigned char v92 = vec_splats((unsigned char)92); + __vector unsigned char v32 = vec_splats((unsigned char)32); + + for (; i + 15 < view.size(); i += 16) { + __vector unsigned char word = + vec_vsx_ld(0, reinterpret_cast<const unsigned char *>(view.data() + i)); + running = vec_or(running, (__vector unsigned char)vec_cmpeq(word, v34)); + running = vec_or(running, (__vector unsigned char)vec_cmpeq(word, v92)); + running = vec_or(running, + (__vector unsigned char)vec_cmplt(word, v32)); + } + if (i < view.size()) { + __vector unsigned char word = vec_vsx_ld( + 0, reinterpret_cast<const unsigned char *>(view.data() + view.length() - 16)); + running = vec_or(running, (__vector unsigned char)vec_cmpeq(word, v34)); + running = vec_or(running, (__vector unsigned char)vec_cmpeq(word, v92)); + running = vec_or(running, + (__vector unsigned char)vec_cmplt(word, v32)); + } + return !vec_all_eq(running, vec_splats((unsigned char)0)); +} +#else +simdjson_inline bool fast_needs_escaping(std::string_view view) { + return simple_needs_escaping(view); +} +#endif + +// Scalar fallback for finding next quotable character +SIMDJSON_CONSTEXPR_LAMBDA simdjson_inline size_t +find_next_json_quotable_character_scalar(const std::string_view view, + size_t location) noexcept { + for (auto pos = view.begin() + location; pos != view.end(); ++pos) { + if (json_quotable_character[static_cast<uint8_t>(*pos)]) { + return pos - view.begin(); + } + } + return size_t(view.size()); +} + +// SIMD-accelerated position finding that directly locates the first quotable +// character, combining detection and position extraction in a single pass to +// minimize redundant work. +#if SIMDJSON_EXPERIMENTAL_HAS_NEON +simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + const size_t len = view.size(); + const uint8_t *ptr = + reinterpret_cast<const uint8_t *>(view.data()) + location; + size_t remaining = len - location; + + // SIMD constants for characters requiring escape + uint8x16_t v34 = vdupq_n_u8(34); // '"' + uint8x16_t v92 = vdupq_n_u8(92); // '\\' + uint8x16_t v32 = vdupq_n_u8(32); // control char threshold + + while (remaining >= 16) { + uint8x16_t word = vld1q_u8(ptr); + + // Check for quotable characters: '"', '\\', or control chars (< 32) + uint8x16_t needs_escape = vceqq_u8(word, v34); + needs_escape = vorrq_u8(needs_escape, vceqq_u8(word, v92)); + needs_escape = vorrq_u8(needs_escape, vcltq_u8(word, v32)); + + const uint8x8_t res = vshrn_n_u16(vreinterpretq_u16_u8(needs_escape), 4); + const uint64_t mask = vget_lane_u64(vreinterpret_u64_u8(res), 0); + if(mask != 0) { + size_t offset = ptr - reinterpret_cast<const uint8_t *>(view.data()); + auto trailing_zero = trailing_zeroes(mask); + return offset + (trailing_zero >> 2); + } + ptr += 16; + remaining -= 16; + } + + // Scalar fallback for remaining bytes + size_t current = len - remaining; + return find_next_json_quotable_character_scalar(view, current); +} +#elif SIMDJSON_EXPERIMENTAL_HAS_SSE2 +simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + const size_t len = view.size(); + const uint8_t *ptr = + reinterpret_cast<const uint8_t *>(view.data()) + location; + size_t remaining = len - location; + + // SIMD constants + __m128i v34 = _mm_set1_epi8(34); // '"' + __m128i v92 = _mm_set1_epi8(92); // '\\' + __m128i v31 = _mm_set1_epi8(31); // for control char detection + + while (remaining >= 16) { + __m128i word = _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr)); + + // Check for quotable characters + __m128i needs_escape = _mm_cmpeq_epi8(word, v34); + needs_escape = _mm_or_si128(needs_escape, _mm_cmpeq_epi8(word, v92)); + needs_escape = _mm_or_si128( + needs_escape, + _mm_cmpeq_epi8(_mm_subs_epu8(word, v31), _mm_setzero_si128())); + + int mask = _mm_movemask_epi8(needs_escape); + if (mask != 0) { + // Found quotable character - use trailing zero count to find position + size_t offset = ptr - reinterpret_cast<const uint8_t *>(view.data()); + return offset + trailing_zeroes(mask); + } + ptr += 16; + remaining -= 16; + } + + // Scalar fallback for remaining bytes + size_t current = len - remaining; + return find_next_json_quotable_character_scalar(view, current); +} +#elif SIMDJSON_EXPERIMENTAL_HAS_LSX +simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + const size_t len = view.size(); + const uint8_t *ptr = + reinterpret_cast<const uint8_t *>(view.data()) + location; + size_t remaining = len - location; + + //SIMD constants for characters requiring escape + __m128i v34 = __lsx_vreplgr2vr_b(34); // '"' + __m128i v92 = __lsx_vreplgr2vr_b(92); // '\\' + __m128i v32 = __lsx_vreplgr2vr_b(32); // control char threshold + + while (remaining >= 16){ + __m128i word = __lsx_vld(ptr, 0); + + //Check for the quotable characters: '"', '\\', or control char (<32) + __m128i needs_escape = __lsx_vseq_b(word, v34); + needs_escape = __lsx_vor_v(needs_escape, __lsx_vseq_b(word, v92)); + needs_escape = __lsx_vor_v(needs_escape, __lsx_vslt_bu(word, v32)); + + if (!__lsx_bz_v(needs_escape)){ + + //Found quotable character - extract exact byte position + uint64_t lo = __lsx_vpickve2gr_du(needs_escape,0); + uint64_t hi = __lsx_vpickve2gr_du(needs_escape,1); + size_t offset = ptr - reinterpret_cast<const uint8_t *>(view.data()); + if ( lo != 0) { + return offset + trailing_zeroes(lo) / 8; + } else { + return offset + 8 + trailing_zeroes(hi) / 8; + } + } + ptr += 16; + remaining -= 16; + } + size_t current = len - remaining; + return find_next_json_quotable_character_scalar(view, current); +} +#elif SIMDJSON_EXPERIMENTAL_HAS_RVV +simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + const size_t len = view.size(); + const uint8_t *ptr = + reinterpret_cast<const uint8_t *>(view.data()) + location; + size_t remaining = len - location; + + while (remaining > 0) { + size_t vl = __riscv_vsetvl_e8m1(remaining); + vuint8m1_t word = __riscv_vle8_v_u8m1(ptr, vl); + + // Check for quotable characters: '"', '\\', or control chars (< 32) + vbool8_t needs_escape = __riscv_vmseq(word, (uint8_t)34, vl); + needs_escape = __riscv_vmor(needs_escape, + __riscv_vmseq(word, (uint8_t)92, vl), vl); + needs_escape = __riscv_vmor(needs_escape, + __riscv_vmsltu(word, (uint8_t)32, vl), vl); + + long first = __riscv_vfirst(needs_escape, vl); + if (first >= 0) { + size_t offset = ptr - reinterpret_cast<const uint8_t *>(view.data()); + return offset + first; + } + ptr += vl; + remaining -= vl; + } + + return len; +} +#elif SIMDJSON_EXPERIMENTAL_HAS_PPC64 +simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + const size_t len = view.size(); + const uint8_t *ptr = + reinterpret_cast<const uint8_t *>(view.data()) + location; + size_t remaining = len - location; + + // SIMD constants for characters requiring escape + __vector unsigned char v34 = vec_splats((unsigned char)34); // '"' + __vector unsigned char v92 = vec_splats((unsigned char)92); // '\\' + __vector unsigned char v32 = vec_splats((unsigned char)32); // control char threshold + + // Bitmask for vec_vbpermq to extract one bit per byte + const __vector unsigned char perm_mask = {0x78, 0x70, 0x68, 0x60, 0x58, 0x50, + 0x48, 0x40, 0x38, 0x30, 0x28, 0x20, + 0x18, 0x10, 0x08, 0x00}; + + while (remaining >= 16) { + __vector unsigned char word = + vec_vsx_ld(0, reinterpret_cast<const unsigned char *>(ptr)); + + // Check for quotable characters: '"', '\\', or control chars (< 32) + __vector unsigned char needs_escape = + (__vector unsigned char)vec_cmpeq(word, v34); + needs_escape = vec_or(needs_escape, + (__vector unsigned char)vec_cmpeq(word, v92)); + needs_escape = vec_or(needs_escape, + (__vector unsigned char)vec_cmplt(word, v32)); + + __vector unsigned long long result = + (__vector unsigned long long)vec_vbpermq(needs_escape, perm_mask); +#ifdef __LITTLE_ENDIAN__ + unsigned int mask = static_cast<unsigned int>(result[1]); +#else + unsigned int mask = static_cast<unsigned int>(result[0]); +#endif + if (mask != 0) { + size_t offset = ptr - reinterpret_cast<const uint8_t *>(view.data()); + return offset + __builtin_ctz(mask); + } + ptr += 16; + remaining -= 16; + } + + // Scalar fallback for remaining bytes + size_t current = len - remaining; + return find_next_json_quotable_character_scalar(view, current); +} +#else +SIMDJSON_CONSTEXPR_LAMBDA simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + return find_next_json_quotable_character_scalar(view, location); +} +#endif + +SIMDJSON_CONSTEXPR_LAMBDA static std::string_view control_chars[] = { + "\\u0000", "\\u0001", "\\u0002", "\\u0003", "\\u0004", "\\u0005", "\\u0006", + "\\u0007", "\\b", "\\t", "\\n", "\\u000b", "\\f", "\\r", + "\\u000e", "\\u000f", "\\u0010", "\\u0011", "\\u0012", "\\u0013", "\\u0014", + "\\u0015", "\\u0016", "\\u0017", "\\u0018", "\\u0019", "\\u001a", "\\u001b", + "\\u001c", "\\u001d", "\\u001e", "\\u001f"}; + +// All Unicode characters may be placed within the quotation marks, except for +// the characters that MUST be escaped: quotation mark, reverse solidus, and the +// control characters (U+0000 through U+001F). There are two-character sequence +// escape representations of some popular characters: +// \", \\, \b, \f, \n, \r, \t. +SIMDJSON_CONSTEXPR_LAMBDA simdjson_inline void escape_json_char(char c, char *&out) { + if (c == '"') { + memcpy(out, "\\\"", 2); + out += 2; + } else if (c == '\\') { + memcpy(out, "\\\\", 2); + out += 2; + } else { + std::string_view v = control_chars[uint8_t(c)]; + memcpy(out, v.data(), v.size()); + out += v.size(); + } +} + +// Writes the escaped version of input to out, returning the number of bytes +// written. Uses SIMD position finding to locate quotable characters efficiently. +inline size_t write_string_escaped(const std::string_view input, char *out) { + size_t mysize = input.size(); + + // Use SIMD position finder directly - it returns mysize if no escape needed + size_t location = find_next_json_quotable_character(input, 0); + if (location == mysize) { + // Fast path: no escaping needed + memcpy(out, input.data(), input.size()); + return input.size(); + } + + const char *const initout = out; + memcpy(out, input.data(), location); + out += location; + escape_json_char(input[location], out); + location += 1; + while (location < mysize) { + size_t newlocation = find_next_json_quotable_character(input, location); + memcpy(out, input.data() + location, newlocation - location); + out += newlocation - location; + location = newlocation; + if (location == mysize) { + break; + } + escape_json_char(input[location], out); + location += 1; + } + return out - initout; +} + +simdjson_inline string_builder::string_builder(size_t initial_capacity) + : buffer(new(std::nothrow) char[initial_capacity]), position(0), + capacity(buffer.get() != nullptr ? initial_capacity : 0), + is_valid(buffer.get() != nullptr) {} + +simdjson_inline bool string_builder::capacity_check(size_t upcoming_bytes) { + // We use the convention that when is_valid is false, then the capacity and + // the position are 0. + // Most of the time, this function will return true. + if (simdjson_likely(upcoming_bytes <= capacity - position)) { + return true; + } + // check for overflow, most of the time there is no overflow + if (simdjson_unlikely(position + upcoming_bytes < position)) { + return false; + } + // We will rarely get here. + grow_buffer((std::max)(capacity * 2, position + upcoming_bytes)); + // If the buffer allocation failed, we set is_valid to false. + return is_valid; +} + +simdjson_inline void string_builder::grow_buffer(size_t desired_capacity) { + if (!is_valid) { + return; + } + std::unique_ptr<char[]> new_buffer(new (std::nothrow) char[desired_capacity]); + if (new_buffer.get() == nullptr) { + set_valid(false); + return; + } + std::memcpy(new_buffer.get(), buffer.get(), position); + buffer.swap(new_buffer); + capacity = desired_capacity; +} + +simdjson_inline void string_builder::set_valid(bool valid) noexcept { + if (!valid) { + is_valid = false; + capacity = 0; + position = 0; + buffer.reset(); + } else { + is_valid = true; + } +} + +simdjson_inline size_t string_builder::size() const noexcept { + return position; +} + +simdjson_inline void string_builder::append(char c) noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = c; + } +} + +simdjson_inline void string_builder::append_null() noexcept { + constexpr char null_literal[] = "null"; + constexpr size_t null_len = sizeof(null_literal) - 1; + if (capacity_check(null_len)) { + std::memcpy(buffer.get() + position, null_literal, null_len); + position += null_len; + } +} + +simdjson_inline void string_builder::clear() noexcept { + position = 0; + // if it was invalid, we should try to repair it + if (!is_valid) { + capacity = 0; + buffer.reset(); + is_valid = true; + } +} + +namespace internal { + +template <typename number_type, typename = typename std::enable_if< + std::is_unsigned<number_type>::value>::type> +simdjson_really_inline int int_log2(number_type x) { + return 63 - leading_zeroes(uint64_t(x) | 1); +} + +simdjson_really_inline int fast_digit_count_32(uint32_t x) { + static uint64_t table[] = { + 4294967296, 8589934582, 8589934582, 8589934582, 12884901788, + 12884901788, 12884901788, 17179868184, 17179868184, 17179868184, + 21474826480, 21474826480, 21474826480, 21474826480, 25769703776, + 25769703776, 25769703776, 30063771072, 30063771072, 30063771072, + 34349738368, 34349738368, 34349738368, 34349738368, 38554705664, + 38554705664, 38554705664, 41949672960, 41949672960, 41949672960, + 42949672960, 42949672960}; + return uint32_t((x + table[int_log2(x)]) >> 32); +} + +simdjson_really_inline int fast_digit_count_64(uint64_t x) { + static uint64_t table[] = {9, + 99, + 999, + 9999, + 99999, + 999999, + 9999999, + 99999999, + 999999999, + 9999999999, + 99999999999, + 999999999999, + 9999999999999, + 99999999999999, + 999999999999999ULL, + 9999999999999999ULL, + 99999999999999999ULL, + 999999999999999999ULL, + 9999999999999999999ULL}; + int y = (19 * int_log2(x) >> 6); + y += x > table[y]; + return y + 1; +} + +template <typename number_type, typename = typename std::enable_if< + std::is_unsigned<number_type>::value>::type> +simdjson_really_inline size_t digit_count(number_type v) noexcept { + static_assert(sizeof(number_type) == 8 || sizeof(number_type) == 4 || + sizeof(number_type) == 2 || sizeof(number_type) == 1, + "We only support 8-bit, 16-bit, 32-bit and 64-bit numbers"); + SIMDJSON_IF_CONSTEXPR(sizeof(number_type) <= 4) { + return fast_digit_count_32(static_cast<uint32_t>(v)); + } + else { + return fast_digit_count_64(static_cast<uint64_t>(v)); + } +} +static const char decimal_table[200] = { + 0x30, 0x30, 0x30, 0x31, 0x30, 0x32, 0x30, 0x33, 0x30, 0x34, 0x30, 0x35, + 0x30, 0x36, 0x30, 0x37, 0x30, 0x38, 0x30, 0x39, 0x31, 0x30, 0x31, 0x31, + 0x31, 0x32, 0x31, 0x33, 0x31, 0x34, 0x31, 0x35, 0x31, 0x36, 0x31, 0x37, + 0x31, 0x38, 0x31, 0x39, 0x32, 0x30, 0x32, 0x31, 0x32, 0x32, 0x32, 0x33, + 0x32, 0x34, 0x32, 0x35, 0x32, 0x36, 0x32, 0x37, 0x32, 0x38, 0x32, 0x39, + 0x33, 0x30, 0x33, 0x31, 0x33, 0x32, 0x33, 0x33, 0x33, 0x34, 0x33, 0x35, + 0x33, 0x36, 0x33, 0x37, 0x33, 0x38, 0x33, 0x39, 0x34, 0x30, 0x34, 0x31, + 0x34, 0x32, 0x34, 0x33, 0x34, 0x34, 0x34, 0x35, 0x34, 0x36, 0x34, 0x37, + 0x34, 0x38, 0x34, 0x39, 0x35, 0x30, 0x35, 0x31, 0x35, 0x32, 0x35, 0x33, + 0x35, 0x34, 0x35, 0x35, 0x35, 0x36, 0x35, 0x37, 0x35, 0x38, 0x35, 0x39, + 0x36, 0x30, 0x36, 0x31, 0x36, 0x32, 0x36, 0x33, 0x36, 0x34, 0x36, 0x35, + 0x36, 0x36, 0x36, 0x37, 0x36, 0x38, 0x36, 0x39, 0x37, 0x30, 0x37, 0x31, + 0x37, 0x32, 0x37, 0x33, 0x37, 0x34, 0x37, 0x35, 0x37, 0x36, 0x37, 0x37, + 0x37, 0x38, 0x37, 0x39, 0x38, 0x30, 0x38, 0x31, 0x38, 0x32, 0x38, 0x33, + 0x38, 0x34, 0x38, 0x35, 0x38, 0x36, 0x38, 0x37, 0x38, 0x38, 0x38, 0x39, + 0x39, 0x30, 0x39, 0x31, 0x39, 0x32, 0x39, 0x33, 0x39, 0x34, 0x39, 0x35, + 0x39, 0x36, 0x39, 0x37, 0x39, 0x38, 0x39, 0x39, +}; +} // namespace internal + +template <typename number_type, typename> +simdjson_inline void string_builder::append(number_type v) noexcept { + static_assert(std::is_same<number_type, bool>::value || + std::is_integral<number_type>::value || + std::is_floating_point<number_type>::value, + "Unsupported number type"); + // If C++17 is available, we can 'if constexpr' here. + SIMDJSON_IF_CONSTEXPR(std::is_same<number_type, bool>::value) { + if (v) { + constexpr char true_literal[] = "true"; + constexpr size_t true_len = sizeof(true_literal) - 1; + if (capacity_check(true_len)) { + std::memcpy(buffer.get() + position, true_literal, true_len); + position += true_len; + } + } else { + constexpr char false_literal[] = "false"; + constexpr size_t false_len = sizeof(false_literal) - 1; + if (capacity_check(false_len)) { + std::memcpy(buffer.get() + position, false_literal, false_len); + position += false_len; + } + } + } + else SIMDJSON_IF_CONSTEXPR(std::is_unsigned<number_type>::value) { + // Process 4 digits at a time instead of 2, reducing store operations + // and divisions by approximately half for large numbers. + constexpr size_t max_number_size = 20; + if (capacity_check(max_number_size)) { + using unsigned_type = typename std::make_unsigned<number_type>::type; + unsigned_type pv = static_cast<unsigned_type>(v); + size_t dc = internal::digit_count(pv); + char *write_pointer = buffer.get() + position + dc - 1; + + // Process 4 digits per iteration for large numbers + while (pv >= 10000) { + unsigned_type q = pv / 10000; + unsigned_type r = pv % 10000; + unsigned_type r_hi = r / 100; // High 2 digits of remainder + unsigned_type r_lo = r % 100; // Low 2 digits of remainder + // Write low 2 digits first (rightmost), then high 2 digits + memcpy(write_pointer - 1, &internal::decimal_table[r_lo * 2], 2); + memcpy(write_pointer - 3, &internal::decimal_table[r_hi * 2], 2); + write_pointer -= 4; + pv = q; + } + + // Handle remaining 1-4 digits with original 2-digit loop + while (pv >= 100) { + memcpy(write_pointer - 1, &internal::decimal_table[(pv % 100) * 2], 2); + write_pointer -= 2; + pv /= 100; + } + if (pv >= 10) { + *write_pointer-- = char('0' + (pv % 10)); + pv /= 10; + } + *write_pointer = char('0' + pv); + position += dc; + } + } + else SIMDJSON_IF_CONSTEXPR(std::is_integral<number_type>::value) { + // Same 4-digit batching as unsigned path for signed integers + constexpr size_t max_number_size = 20; + if (capacity_check(max_number_size)) { + using unsigned_type = typename std::make_unsigned<number_type>::type; + bool negative = v < 0; + unsigned_type pv = static_cast<unsigned_type>(v); + if (negative) { + pv = 0 - pv; // the 0 is for Microsoft + } + size_t dc = internal::digit_count(pv); + // by always writing the minus sign, we avoid the branch. + buffer.get()[position] = '-'; + position += negative ? 1 : 0; + char *write_pointer = buffer.get() + position + dc - 1; + + // Process 4 digits per iteration for large numbers + while (pv >= 10000) { + unsigned_type q = pv / 10000; + unsigned_type r = pv % 10000; + unsigned_type r_hi = r / 100; + unsigned_type r_lo = r % 100; + memcpy(write_pointer - 1, &internal::decimal_table[r_lo * 2], 2); + memcpy(write_pointer - 3, &internal::decimal_table[r_hi * 2], 2); + write_pointer -= 4; + pv = q; + } + + // Handle remaining 1-4 digits + while (pv >= 100) { + memcpy(write_pointer - 1, &internal::decimal_table[(pv % 100) * 2], 2); + write_pointer -= 2; + pv /= 100; + } + if (pv >= 10) { + *write_pointer-- = char('0' + (pv % 10)); + pv /= 10; + } + *write_pointer = char('0' + pv); + position += dc; + } + } + else SIMDJSON_IF_CONSTEXPR(std::is_floating_point<number_type>::value) { + constexpr size_t max_number_size = 24; + if (capacity_check(max_number_size)) { + // We could specialize for float. + char *end = simdjson::internal::to_chars(buffer.get() + position, nullptr, + double(v)); + position = end - buffer.get(); + } + } +} + +simdjson_inline void +string_builder::escape_and_append(std::string_view input) noexcept { + // escaping might turn a control character into \x00xx so 6 characters. + if (capacity_check(6 * input.size())) { + position += write_string_escaped(input, buffer.get() + position); + } +} + +simdjson_inline void +string_builder::escape_and_append_with_quotes(std::string_view input) noexcept { + // escaping might turn a control character into \x00xx so 6 characters. + if (capacity_check(2 + 6 * input.size())) { + buffer.get()[position++] = '"'; + position += write_string_escaped(input, buffer.get() + position); + buffer.get()[position++] = '"'; + } +} + +simdjson_inline void +string_builder::escape_and_append_with_quotes(char input) noexcept { + // escaping might turn a control character into \x00xx so 6 characters. + if (capacity_check(2 + 6 * 1)) { + buffer.get()[position++] = '"'; + std::string_view cinput(&input, 1); + position += write_string_escaped(cinput, buffer.get() + position); + buffer.get()[position++] = '"'; + } +} + +simdjson_inline void +string_builder::escape_and_append_with_quotes(const char *input) noexcept { + std::string_view cinput(input); + escape_and_append_with_quotes(cinput); +} +#if SIMDJSON_SUPPORTS_CONCEPTS +template <constevalutil::fixed_string key> +simdjson_inline void string_builder::escape_and_append_with_quotes() noexcept { + escape_and_append_with_quotes(constevalutil::string_constant<key>::value); +} +#endif + +simdjson_inline void string_builder::append_raw(const char *c) noexcept { + size_t len = std::strlen(c); + append_raw(c, len); +} + +simdjson_inline void +string_builder::append_raw(std::string_view input) noexcept { + if (capacity_check(input.size())) { + std::memcpy(buffer.get() + position, input.data(), input.size()); + position += input.size(); + } +} + +simdjson_inline void string_builder::append_raw(const char *str, + size_t len) noexcept { + if (capacity_check(len)) { + std::memcpy(buffer.get() + position, str, len); + position += len; + } +} +#if SIMDJSON_SUPPORTS_CONCEPTS +// Support for optional types (std::optional, etc.) +template <concepts::optional_type T> + requires(!require_custom_serialization<T>) +simdjson_inline void string_builder::append(const T &opt) { + if (opt) { + append(*opt); + } else { + append_null(); + } +} + +template <typename T> + requires(require_custom_serialization<T>) +simdjson_inline void string_builder::append(T &&val) { + serialize(*this, std::forward<T>(val)); +} + +template <typename T> + requires(std::is_convertible<T, std::string_view>::value || + std::is_same<T, const char *>::value) +simdjson_inline void string_builder::append(const T &value) { + escape_and_append_with_quotes(value); +} +#endif + +#if SIMDJSON_SUPPORTS_RANGES && SIMDJSON_SUPPORTS_CONCEPTS +// Support for range-based appending (std::ranges::view, etc.) +template <std::ranges::range R> + requires(!std::is_convertible<R, std::string_view>::value && !require_custom_serialization<R>) +simdjson_inline void string_builder::append(const R &range) noexcept { + auto it = std::ranges::begin(range); + auto end = std::ranges::end(range); + if constexpr (concepts::is_pair<std::ranges::range_value_t<R>>) { + start_object(); + + if (it == end) { + end_object(); + return; // Handle empty range + } + // Append first item without leading comma + append_key_value(it->first, it->second); + ++it; + + // Append remaining items with preceding commas + for (; it != end; ++it) { + append_comma(); + append_key_value(it->first, it->second); + } + end_object(); + } else { + start_array(); + if (it == end) { + end_array(); + return; // Handle empty range + } + + // Append first item without leading comma + append(*it); + ++it; + + // Append remaining items with preceding commas + for (; it != end; ++it) { + append_comma(); + append(*it); + } + end_array(); + } +} + +#endif + +#if SIMDJSON_EXCEPTIONS +simdjson_inline string_builder::operator std::string() const noexcept(false) { + return std::string(operator std::string_view()); +} + +simdjson_inline string_builder::operator std::string_view() const + noexcept(false) simdjson_lifetime_bound { + return view(); +} +#endif + +simdjson_inline simdjson_result<std::string_view> +string_builder::view() const noexcept { + if (!is_valid) { + return simdjson::OUT_OF_CAPACITY; + } + return std::string_view(buffer.get(), position); +} + +simdjson_inline simdjson_result<const char *> string_builder::c_str() noexcept { + if (capacity_check(1)) { + buffer.get()[position] = '\0'; + return buffer.get(); + } + return simdjson::OUT_OF_CAPACITY; +} + +simdjson_inline bool string_builder::validate_unicode() const noexcept { + return simdjson::validate_utf8(buffer.get(), position); +} + +simdjson_inline void string_builder::start_object() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '{'; + } +} + +simdjson_inline void string_builder::end_object() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '}'; + } +} + +simdjson_inline void string_builder::start_array() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '['; + } +} + +simdjson_inline void string_builder::end_array() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ']'; + } +} + +simdjson_inline void string_builder::append_comma() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ','; + } +} + +simdjson_inline void string_builder::append_colon() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ':'; + } +} + +template <typename key_type, typename value_type> +simdjson_inline void +string_builder::append_key_value(key_type key, value_type value) noexcept { + static_assert(std::is_same<key_type, const char *>::value || + std::is_convertible<key_type, std::string_view>::value, + "Unsupported key type"); + escape_and_append_with_quotes(key); + append_colon(); + SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, std::nullptr_t>::value) { + append_null(); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, char>::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR( + std::is_convertible<value_type, std::string_view>::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, const char *>::value) { + escape_and_append_with_quotes(value); + } + else { + append(value); + } +} + +#if SIMDJSON_SUPPORTS_CONCEPTS +template <constevalutil::fixed_string key, typename value_type> +simdjson_inline void +string_builder::append_key_value(value_type value) noexcept { + escape_and_append_with_quotes<key>(); + append_colon(); + SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, std::nullptr_t>::value) { + append_null(); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, char>::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR( + std::is_convertible<value_type, std::string_view>::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, const char *>::value) { + escape_and_append_with_quotes(value); + } + else { + append(value); + } +} +#endif + +} // namespace builder +} // namespace westmere +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_STRING_BUILDER_INL_H +/* end file simdjson/generic/builder/json_string_builder-inl.h for westmere */ + +/* end file simdjson/generic/builder/amalgamated.h for westmere */ +/* including simdjson/westmere/end.h: #include "simdjson/westmere/end.h" */ +/* begin file simdjson/westmere/end.h */ +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#if !SIMDJSON_CAN_ALWAYS_RUN_WESTMERE +SIMDJSON_UNTARGET_REGION +#endif + +/* undefining SIMDJSON_IMPLEMENTATION from "westmere" */ +#undef SIMDJSON_IMPLEMENTATION +/* end file simdjson/westmere/end.h */ + +#endif // SIMDJSON_WESTMERE_BUILDER_H +/* end file simdjson/westmere/builder.h */ +#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(lsx) +/* including simdjson/lsx/builder.h: #include "simdjson/lsx/builder.h" */ +/* begin file simdjson/lsx/builder.h */ +#ifndef SIMDJSON_LSX_BUILDER_H +#define SIMDJSON_LSX_BUILDER_H + +/* including simdjson/lsx/begin.h: #include "simdjson/lsx/begin.h" */ +/* begin file simdjson/lsx/begin.h */ +/* defining SIMDJSON_IMPLEMENTATION to "lsx" */ +#define SIMDJSON_IMPLEMENTATION lsx +/* including simdjson/lsx/base.h: #include "simdjson/lsx/base.h" */ +/* begin file simdjson/lsx/base.h */ +#ifndef SIMDJSON_LSX_BASE_H +#define SIMDJSON_LSX_BASE_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +/** + * Implementation for LSX. + */ +namespace lsx { + +class implementation; + +namespace { +namespace simd { +template <typename T> struct simd8; +template <typename T> struct simd8x64; +} // namespace simd +} // unnamed namespace + +} // namespace lsx +} // namespace simdjson + +#endif // SIMDJSON_LSX_BASE_H +/* end file simdjson/lsx/base.h */ +/* including simdjson/lsx/intrinsics.h: #include "simdjson/lsx/intrinsics.h" */ +/* begin file simdjson/lsx/intrinsics.h */ +#ifndef SIMDJSON_LSX_INTRINSICS_H +#define SIMDJSON_LSX_INTRINSICS_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#include <lsxintrin.h> + +static_assert(sizeof(__m128i) <= simdjson::SIMDJSON_PADDING, "insufficient padding for LoongArch SX"); + +#endif // SIMDJSON_LSX_INTRINSICS_H +/* end file simdjson/lsx/intrinsics.h */ +/* including simdjson/lsx/bitmanipulation.h: #include "simdjson/lsx/bitmanipulation.h" */ +/* begin file simdjson/lsx/bitmanipulation.h */ +#ifndef SIMDJSON_LSX_BITMANIPULATION_H +#define SIMDJSON_LSX_BITMANIPULATION_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/intrinsics.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/bitmask.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace lsx { +namespace { + +// We sometimes call trailing_zero on inputs that are zero, +// but the algorithms do not end up using the returned value. +// Sadly, sanitizers are not smart enough to figure it out. +SIMDJSON_NO_SANITIZE_UNDEFINED +// This function can be used safely even if not all bytes have been +// initialized. +// See issue https://github.com/simdjson/simdjson/issues/1965 +SIMDJSON_NO_SANITIZE_MEMORY +simdjson_inline int trailing_zeroes(uint64_t input_num) { + return __builtin_ctzll(input_num); +} + +/* result might be undefined when input_num is zero */ +simdjson_inline uint64_t clear_lowest_bit(uint64_t input_num) { + return input_num & (input_num-1); +} + +/* result might be undefined when input_num is zero */ +simdjson_inline int leading_zeroes(uint64_t input_num) { + return __builtin_clzll(input_num); +} + +/* result might be undefined when input_num is zero */ +simdjson_inline int count_ones(uint64_t input_num) { + return __lsx_vpickve2gr_w(__lsx_vpcnt_d(__m128i(v2u64{input_num, 0})), 0); +} + +simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2, uint64_t *result) { + return __builtin_uaddll_overflow(value1, value2, + reinterpret_cast<unsigned long long *>(result)); +} + +} // unnamed namespace +} // namespace lsx +} // namespace simdjson + +#endif // SIMDJSON_LSX_BITMANIPULATION_H +/* end file simdjson/lsx/bitmanipulation.h */ +/* including simdjson/lsx/bitmask.h: #include "simdjson/lsx/bitmask.h" */ +/* begin file simdjson/lsx/bitmask.h */ +#ifndef SIMDJSON_LSX_BITMASK_H +#define SIMDJSON_LSX_BITMASK_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace lsx { +namespace { + +// +// Perform a "cumulative bitwise xor," flipping bits each time a 1 is encountered. +// +// For example, prefix_xor(00100100) == 00011100 +// +simdjson_inline uint64_t prefix_xor(uint64_t bitmask) { + bitmask ^= bitmask << 1; + bitmask ^= bitmask << 2; + bitmask ^= bitmask << 4; + bitmask ^= bitmask << 8; + bitmask ^= bitmask << 16; + bitmask ^= bitmask << 32; + return bitmask; +} + +} // unnamed namespace +} // namespace lsx +} // namespace simdjson + +#endif +/* end file simdjson/lsx/bitmask.h */ +/* including simdjson/lsx/numberparsing_defs.h: #include "simdjson/lsx/numberparsing_defs.h" */ +/* begin file simdjson/lsx/numberparsing_defs.h */ +#ifndef SIMDJSON_LSX_NUMBERPARSING_DEFS_H +#define SIMDJSON_LSX_NUMBERPARSING_DEFS_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/intrinsics.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#include <cstring> + +namespace simdjson { +namespace lsx { +namespace numberparsing { + +// we don't have appropriate instructions, so let us use a scalar function +// credit: https://johnnylee-sde.github.io/Fast-numeric-string-to-int/ +/** @private */ +static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) { + uint64_t val; + std::memcpy(&val, chars, sizeof(uint64_t)); + val = (val & 0x0F0F0F0F0F0F0F0F) * 2561 >> 8; + val = (val & 0x00FF00FF00FF00FF) * 6553601 >> 16; + return uint32_t((val & 0x0000FFFF0000FFFF) * 42949672960001 >> 32); +} + +simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) { + internal::value128 answer; + __uint128_t r = (static_cast<__uint128_t>(value1)) * value2; + answer.low = uint64_t(r); + answer.high = uint64_t(r >> 64); + return answer; +} + +} // namespace numberparsing +} // namespace lsx +} // namespace simdjson + +#ifndef SIMDJSON_SWAR_NUMBER_PARSING +#if SIMDJSON_IS_BIG_ENDIAN +#define SIMDJSON_SWAR_NUMBER_PARSING 0 +#else +#define SIMDJSON_SWAR_NUMBER_PARSING 1 +#endif +#endif + +#endif // SIMDJSON_LSX_NUMBERPARSING_DEFS_H +/* end file simdjson/lsx/numberparsing_defs.h */ +/* including simdjson/lsx/simd.h: #include "simdjson/lsx/simd.h" */ +/* begin file simdjson/lsx/simd.h */ +#ifndef SIMDJSON_LSX_SIMD_H +#define SIMDJSON_LSX_SIMD_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace lsx { +namespace { +namespace simd { + + // Forward-declared so they can be used by splat and friends. + template<typename Child> + struct base { + __m128i value; + + // Zero constructor + simdjson_inline base() : value{__m128i()} {} + + // Conversion from SIMD register + simdjson_inline base(const __m128i _value) : value(_value) {} + + // Conversion to SIMD register + simdjson_inline operator const __m128i&() const { return this->value; } + simdjson_inline operator __m128i&() { return this->value; } + simdjson_inline operator const v16i8&() const { return (v16i8&)this->value; } + simdjson_inline operator v16i8&() { return (v16i8&)this->value; } + + // Bit operations + simdjson_inline Child operator|(const Child other) const { return __lsx_vor_v(*this, other); } + simdjson_inline Child operator&(const Child other) const { return __lsx_vand_v(*this, other); } + simdjson_inline Child operator^(const Child other) const { return __lsx_vxor_v(*this, other); } + simdjson_inline Child bit_andnot(const Child other) const { return __lsx_vandn_v(other, *this); } + simdjson_inline Child& operator|=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast | other; return *this_cast; } + simdjson_inline Child& operator&=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast & other; return *this_cast; } + simdjson_inline Child& operator^=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast ^ other; return *this_cast; } + }; + + // Forward-declared so they can be used by splat and friends. + template<typename T> + struct simd8; + + template<typename T, typename Mask=simd8<bool>> + struct base8: base<simd8<T>> { + simdjson_inline base8() : base<simd8<T>>() {} + simdjson_inline base8(const __m128i _value) : base<simd8<T>>(_value) {} + + friend simdjson_really_inline Mask operator==(const simd8<T> lhs, const simd8<T> rhs) { return __lsx_vseq_b(lhs, rhs); } + + static const int SIZE = sizeof(base<simd8<T>>::value); + + template<int N=1> + simdjson_inline simd8<T> prev(const simd8<T> prev_chunk) const { + return __lsx_vor_v(__lsx_vbsll_v(*this, N), __lsx_vbsrl_v(prev_chunk, 16 - N)); + } + }; + + // SIMD byte mask type (returned by things like eq and gt) + template<> + struct simd8<bool>: base8<bool> { + static simdjson_inline simd8<bool> splat(bool _value) { + return __lsx_vreplgr2vr_b(uint8_t(-(!!_value))); + } + + simdjson_inline simd8() : base8() {} + simdjson_inline simd8(const __m128i _value) : base8<bool>(_value) {} + // Splat constructor + simdjson_inline simd8(bool _value) : base8<bool>(splat(_value)) {} + + simdjson_inline int to_bitmask() const { return __lsx_vpickve2gr_w(__lsx_vmskltz_b(*this), 0); } + simdjson_inline bool any() const { return 0 == __lsx_vpickve2gr_hu(__lsx_vmsknz_b(*this), 0); } + simdjson_inline simd8<bool> operator~() const { return *this ^ true; } + }; + + template<typename T> + struct base8_numeric: base8<T> { + static simdjson_inline simd8<T> splat(T _value) { return __lsx_vreplgr2vr_b(_value); } + static simdjson_inline simd8<T> zero() { return __lsx_vldi(0); } + static simdjson_inline simd8<T> load(const T values[16]) { + return __lsx_vld(reinterpret_cast<const __m128i *>(values), 0); + } + // Repeat 16 values as many times as necessary (usually for lookup tables) + static simdjson_inline simd8<T> repeat_16( + T v0, T v1, T v2, T v3, T v4, T v5, T v6, T v7, + T v8, T v9, T v10, T v11, T v12, T v13, T v14, T v15 + ) { + return simd8<T>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + ); + } + + simdjson_inline base8_numeric() : base8<T>() {} + simdjson_inline base8_numeric(const __m128i _value) : base8<T>(_value) {} + + // Store to array + simdjson_inline void store(T dst[16]) const { + return __lsx_vst(*this, reinterpret_cast<__m128i *>(dst), 0); + } + + // Addition/subtraction are the same for signed and unsigned + simdjson_inline simd8<T> operator+(const simd8<T> other) const { return __lsx_vadd_b(*this, other); } + simdjson_inline simd8<T> operator-(const simd8<T> other) const { return __lsx_vsub_b(*this, other); } + simdjson_inline simd8<T>& operator+=(const simd8<T> other) { *this = *this + other; return *static_cast<simd8<T>*>(this); } + simdjson_inline simd8<T>& operator-=(const simd8<T> other) { *this = *this - other; return *static_cast<simd8<T>*>(this); } + + // Override to distinguish from bool version + simdjson_inline simd8<T> operator~() const { return *this ^ 0xFFu; } + + // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values) + template<typename L> + simdjson_inline simd8<L> lookup_16(simd8<L> lookup_table) const { + return __lsx_vshuf_b(lookup_table, lookup_table, *this); + } + + // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted as a bitset). + // Passing a 0 value for mask would be equivalent to writing out every byte to output. + // Only the first 16 - count_ones(mask) bytes of the result are significant but 16 bytes + // get written. + template<typename L> + simdjson_inline void compress(uint16_t mask, L * output) const { + using internal::thintable_epi8; + using internal::BitsSetTable256mul2; + using internal::pshufb_combine_table; + // this particular implementation was inspired by haswell + // lsx do it in 2 steps, first 8 bytes and then second 8 bytes... + uint8_t mask1 = uint8_t(mask); // least significant 8 bits + uint8_t mask2 = uint8_t(mask >> 8); // second least significant 8 bits + // next line just loads the 64-bit values thintable_epi8[mask1] and + // thintable_epi8[mask2] into a 128-bit register. + __m128i shufmask = {int64_t(thintable_epi8[mask1]), int64_t(thintable_epi8[mask2]) + 0x0808080808080808}; + // this is the version "nearly pruned" + __m128i pruned = __lsx_vshuf_b(*this, *this, shufmask); + // we still need to put the pieces back together. + // we compute the popcount of the first words: + int pop1 = BitsSetTable256mul2[mask1]; + // then load the corresponding mask + __m128i compactmask = __lsx_vldx(reinterpret_cast<void*>(reinterpret_cast<unsigned long>(pshufb_combine_table)), pop1 * 8); + __m128i answer = __lsx_vshuf_b(pruned, pruned, compactmask); + __lsx_vst(answer, reinterpret_cast<uint8_t*>(output), 0); + } + + template<typename L> + simdjson_inline simd8<L> lookup_16( + L replace0, L replace1, L replace2, L replace3, + L replace4, L replace5, L replace6, L replace7, + L replace8, L replace9, L replace10, L replace11, + L replace12, L replace13, L replace14, L replace15) const { + return lookup_16(simd8<L>::repeat_16( + replace0, replace1, replace2, replace3, + replace4, replace5, replace6, replace7, + replace8, replace9, replace10, replace11, + replace12, replace13, replace14, replace15 + )); + } + }; + + // Signed bytes + template<> + struct simd8<int8_t> : base8_numeric<int8_t> { + simdjson_inline simd8() : base8_numeric<int8_t>() {} + simdjson_inline simd8(const __m128i _value) : base8_numeric<int8_t>(_value) {} + // Splat constructor + simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {} + // Array constructor + simdjson_inline simd8(const int8_t values[16]) : simd8(load(values)) {} + // Member-by-member initialization + simdjson_inline simd8( + int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, + int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 + ) : simd8({ + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + }) {} + // Repeat 16 values as many times as necessary (usually for lookup tables) + simdjson_inline static simd8<int8_t> repeat_16( + int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, + int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 + ) { + return simd8<int8_t>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + ); + } + + // Order-sensitive comparisons + simdjson_inline simd8<int8_t> max_val(const simd8<int8_t> other) const { return __lsx_vmax_b(*this, other); } + simdjson_inline simd8<int8_t> min_val(const simd8<int8_t> other) const { return __lsx_vmin_b(*this, other); } + simdjson_inline simd8<bool> operator>(const simd8<int8_t> other) const { return __lsx_vslt_b(other, *this); } + simdjson_inline simd8<bool> operator<(const simd8<int8_t> other) const { return __lsx_vslt_b(*this, other); } + }; + + // Unsigned bytes + template<> + struct simd8<uint8_t>: base8_numeric<uint8_t> { + simdjson_inline simd8() : base8_numeric<uint8_t>() {} + simdjson_inline simd8(const __m128i _value) : base8_numeric<uint8_t>(_value) {} + // Splat constructor + simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {} + // Array constructor + simdjson_inline simd8(const uint8_t values[16]) : simd8(load(values)) {} + // Member-by-member initialization + simdjson_inline simd8( + uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, + uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 + ) : simd8(__m128i(v16u8{ + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + })) {} + // Repeat 16 values as many times as necessary (usually for lookup tables) + simdjson_inline static simd8<uint8_t> repeat_16( + uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, + uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 + ) { + return simd8<uint8_t>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + ); + } + + // Saturated math + simdjson_inline simd8<uint8_t> saturating_add(const simd8<uint8_t> other) const { return __lsx_vsadd_bu(*this, other); } + simdjson_inline simd8<uint8_t> saturating_sub(const simd8<uint8_t> other) const { return __lsx_vssub_bu(*this, other); } + + // Order-specific operations + simdjson_inline simd8<uint8_t> max_val(const simd8<uint8_t> other) const { return __lsx_vmax_bu(*this, other); } + simdjson_inline simd8<uint8_t> min_val(const simd8<uint8_t> other) const { return __lsx_vmin_bu(other, *this); } + // Same as >, but only guarantees true is nonzero (< guarantees true = -1) + simdjson_inline simd8<uint8_t> gt_bits(const simd8<uint8_t> other) const { return this->saturating_sub(other); } + // Same as <, but only guarantees true is nonzero (< guarantees true = -1) + simdjson_inline simd8<uint8_t> lt_bits(const simd8<uint8_t> other) const { return other.saturating_sub(*this); } + simdjson_inline simd8<bool> operator<=(const simd8<uint8_t> other) const { return other.max_val(*this) == other; } + simdjson_inline simd8<bool> operator>=(const simd8<uint8_t> other) const { return other.min_val(*this) == other; } + simdjson_inline simd8<bool> operator>(const simd8<uint8_t> other) const { return this->gt_bits(other).any_bits_set(); } + simdjson_inline simd8<bool> operator<(const simd8<uint8_t> other) const { return this->lt_bits(other).any_bits_set(); } + + // Bit-specific operations + simdjson_inline simd8<bool> bits_not_set() const { return *this == uint8_t(0); } + simdjson_inline simd8<bool> bits_not_set(simd8<uint8_t> bits) const { return (*this & bits).bits_not_set(); } + simdjson_inline simd8<bool> any_bits_set() const { return ~this->bits_not_set(); } + simdjson_inline simd8<bool> any_bits_set(simd8<uint8_t> bits) const { return ~this->bits_not_set(bits); } + simdjson_inline bool is_ascii() const { return 0 == __lsx_vpickve2gr_w(__lsx_vmskltz_b(*this), 0); } + simdjson_inline bool bits_not_set_anywhere() const { return 0 == __lsx_vpickve2gr_hu(__lsx_vmsknz_b(*this), 0); } + simdjson_inline bool any_bits_set_anywhere() const { return !bits_not_set_anywhere(); } + simdjson_inline bool bits_not_set_anywhere(simd8<uint8_t> bits) const { + return 0 == __lsx_vpickve2gr_hu(__lsx_vmsknz_b(__lsx_vand_v(*this, bits)), 0); + } + simdjson_inline bool any_bits_set_anywhere(simd8<uint8_t> bits) const { return !bits_not_set_anywhere(bits); } + template<int N> + simdjson_inline simd8<uint8_t> shr() const { return simd8<uint8_t>(__lsx_vsrli_b(*this, N)); } + template<int N> + simdjson_inline simd8<uint8_t> shl() const { return simd8<uint8_t>(__lsx_vslli_b(*this, N)); } + }; + + template<typename T> + struct simd8x64 { + static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<T>); + static_assert(NUM_CHUNKS == 4, "LSX kernel should use four registers per 64-byte block."); + const simd8<T> chunks[NUM_CHUNKS]; + template<int idx> simd8<uint8_t> get() const { return idx < NUM_CHUNKS ? chunks[idx] : simd8<T>(); } + + simd8x64(const simd8x64<T>& o) = delete; // no copy allowed + simd8x64<T>& operator=(const simd8<T>& other) = delete; // no assignment allowed + simd8x64() = delete; // no default constructor allowed + + simdjson_inline simd8x64(const simd8<T> chunk0, const simd8<T> chunk1, const simd8<T> chunk2, const simd8<T> chunk3) : chunks{chunk0, chunk1, chunk2, chunk3} {} + simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8<T>::load(ptr), simd8<T>::load(ptr+16), simd8<T>::load(ptr+32), simd8<T>::load(ptr+48)} {} + + simdjson_inline uint64_t compress(uint64_t mask, T * output) const { + uint16_t mask1 = uint16_t(mask); + uint16_t mask2 = uint16_t(mask >> 16); + uint16_t mask3 = uint16_t(mask >> 32); + uint16_t mask4 = uint16_t(mask >> 48); + __m128i zcnt = __lsx_vpcnt_h(__m128i(v2u64{~mask, 0})); + uint64_t zcnt1 = __lsx_vpickve2gr_hu(zcnt, 0); + uint64_t zcnt2 = __lsx_vpickve2gr_hu(zcnt, 1); + uint64_t zcnt3 = __lsx_vpickve2gr_hu(zcnt, 2); + uint64_t zcnt4 = __lsx_vpickve2gr_hu(zcnt, 3); + uint8_t *voutput = reinterpret_cast<uint8_t*>(output); + // There should be a critical value which processes in scaler is faster. + if (zcnt1) + this->chunks[0].compress(mask1, reinterpret_cast<T*>(voutput)); + voutput += zcnt1; + if (zcnt2) + this->chunks[1].compress(mask2, reinterpret_cast<T*>(voutput)); + voutput += zcnt2; + if (zcnt3) + this->chunks[2].compress(mask3, reinterpret_cast<T*>(voutput)); + voutput += zcnt3; + if (zcnt4) + this->chunks[3].compress(mask4, reinterpret_cast<T*>(voutput)); + voutput += zcnt4; + return reinterpret_cast<uint64_t>(voutput) - reinterpret_cast<uint64_t>(output); + } + + simdjson_inline void store(T ptr[64]) const { + this->chunks[0].store(ptr+sizeof(simd8<T>)*0); + this->chunks[1].store(ptr+sizeof(simd8<T>)*1); + this->chunks[2].store(ptr+sizeof(simd8<T>)*2); + this->chunks[3].store(ptr+sizeof(simd8<T>)*3); + } + + simdjson_inline uint64_t to_bitmask() const { + __m128i mask1 = __lsx_vmskltz_b(this->chunks[0]); + __m128i mask2 = __lsx_vmskltz_b(this->chunks[1]); + __m128i mask3 = __lsx_vmskltz_b(this->chunks[2]); + __m128i mask4 = __lsx_vmskltz_b(this->chunks[3]); + mask1 = __lsx_vilvl_h(mask2, mask1); + mask2 = __lsx_vilvl_h(mask4, mask3); + return __lsx_vpickve2gr_du(__lsx_vilvl_w(mask2, mask1), 0); + } + + simdjson_inline simd8<T> reduce_or() const { + return (this->chunks[0] | this->chunks[1]) | (this->chunks[2] | this->chunks[3]); + } + + simdjson_inline uint64_t eq(const T m) const { + const simd8<T> mask = simd8<T>::splat(m); + return simd8x64<bool>( + this->chunks[0] == mask, + this->chunks[1] == mask, + this->chunks[2] == mask, + this->chunks[3] == mask + ).to_bitmask(); + } + + simdjson_inline uint64_t eq(const simd8x64<uint8_t> &other) const { + return simd8x64<bool>( + this->chunks[0] == other.chunks[0], + this->chunks[1] == other.chunks[1], + this->chunks[2] == other.chunks[2], + this->chunks[3] == other.chunks[3] + ).to_bitmask(); + } + + simdjson_inline uint64_t lteq(const T m) const { + const simd8<T> mask = simd8<T>::splat(m); + return simd8x64<bool>( + this->chunks[0] <= mask, + this->chunks[1] <= mask, + this->chunks[2] <= mask, + this->chunks[3] <= mask + ).to_bitmask(); + } + }; // struct simd8x64<T> + +} // namespace simd +} // unnamed namespace +} // namespace lsx +} // namespace simdjson + +#endif // SIMDJSON_LSX_SIMD_H +/* end file simdjson/lsx/simd.h */ +/* including simdjson/lsx/stringparsing_defs.h: #include "simdjson/lsx/stringparsing_defs.h" */ +/* begin file simdjson/lsx/stringparsing_defs.h */ +#ifndef SIMDJSON_LSX_STRINGPARSING_DEFS_H +#define SIMDJSON_LSX_STRINGPARSING_DEFS_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/simd.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace lsx { +namespace { + +using namespace simd; + +// Holds backslashes and quotes locations. +struct backslash_and_quote { +public: + static constexpr uint32_t BYTES_PROCESSED = 32; + simdjson_inline backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst); + + simdjson_inline bool has_quote_first() { return ((bs_bits - 1) & quote_bits) != 0; } + simdjson_inline bool has_backslash() { return bs_bits != 0; } + simdjson_inline int quote_index() { return trailing_zeroes(quote_bits); } + simdjson_inline int backslash_index() { return trailing_zeroes(bs_bits); } + + uint32_t bs_bits; + uint32_t quote_bits; +}; // struct backslash_and_quote + +simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) { + // this can read up to 31 bytes beyond the buffer size, but we require + // SIMDJSON_PADDING of padding + static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "backslash and quote finder must process fewer than SIMDJSON_PADDING bytes"); + simd8<uint8_t> v0(src); + simd8<uint8_t> v1(src + sizeof(v0)); + v0.store(dst); + v1.store(dst + sizeof(v0)); + + // Getting a 64-bit bitmask is much cheaper than multiple 16-bit bitmasks on LSX; therefore, we + // smash them together into a 64-byte mask and get the bitmask from there. + uint64_t bs_and_quote = simd8x64<bool>(v0 == '\\', v1 == '\\', v0 == '"', v1 == '"').to_bitmask(); + return { + uint32_t(bs_and_quote), // bs_bits + uint32_t(bs_and_quote >> 32) // quote_bits + }; +} + + +struct escaping { + static constexpr uint32_t BYTES_PROCESSED = 16; + simdjson_inline static escaping copy_and_find(const uint8_t *src, uint8_t *dst); + + simdjson_inline bool has_escape() { return escape_bits != 0; } + simdjson_inline int escape_index() { return trailing_zeroes(escape_bits); } + + uint64_t escape_bits; +}; // struct escaping + + + +simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *dst) { + static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "escaping finder must process fewer than SIMDJSON_PADDING bytes"); + simd8<uint8_t> v(src); + v.store(dst); + simd8<bool> is_quote = (v == '"'); + simd8<bool> is_backslash = (v == '\\'); + simd8<bool> is_control = (v < 32); + return { + static_cast<uint64_t>((is_backslash | is_quote | is_control).to_bitmask()) + }; +} + +} // unnamed namespace +} // namespace lsx +} // namespace simdjson + +#endif // SIMDJSON_LSX_STRINGPARSING_DEFS_H +/* end file simdjson/lsx/stringparsing_defs.h */ + +#define SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT 1 +/* end file simdjson/lsx/begin.h */ +/* including simdjson/generic/builder/amalgamated.h for lsx: #include "simdjson/generic/builder/amalgamated.h" */ +/* begin file simdjson/generic/builder/amalgamated.h for lsx */ +#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_BUILDER_DEPENDENCIES_H) +#error simdjson/generic/builder/dependencies.h must be included before simdjson/generic/builder/amalgamated.h! +#endif + +/* including simdjson/generic/builder/json_string_builder.h for lsx: #include "simdjson/generic/builder/json_string_builder.h" */ +/* begin file simdjson/generic/builder/json_string_builder.h for lsx */ +#ifndef SIMDJSON_GENERIC_STRING_BUILDER_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { + + +#if SIMDJSON_SUPPORTS_CONCEPTS + +namespace lsx { +namespace builder { + class string_builder; +}} + +template <typename T, typename = void> +struct has_custom_serialization : std::false_type {}; + +inline constexpr struct serialize_tag { + template <typename T> + constexpr void operator()(lsx::builder::string_builder& b, T&& obj) const{ + return tag_invoke(*this, b, std::forward<T>(obj)); + } + + +} serialize{}; +template <typename T> +struct has_custom_serialization<T, std::void_t< + decltype(tag_invoke(serialize, std::declval<lsx::builder::string_builder&>(), std::declval<T&>())) +>> : std::true_type {}; + +template <typename T> +constexpr bool require_custom_serialization = has_custom_serialization<T>::value; +#else +struct has_custom_serialization : std::false_type {}; +#endif // SIMDJSON_SUPPORTS_CONCEPTS + +namespace lsx { +namespace builder { +/** + * A builder for JSON strings representing documents. This is a low-level + * builder that is not meant to be used directly by end-users. Though it + * supports atomic types (Booleans, strings), it does not support composed + * types (arrays and objects). + * + * Ultimately, this class can support kernel-specific optimizations. E.g., + * it may make use of SIMD instructions to escape strings faster. + */ +class string_builder { +public: + simdjson_inline string_builder(size_t initial_capacity = DEFAULT_INITIAL_CAPACITY); + + static constexpr size_t DEFAULT_INITIAL_CAPACITY = 1024; + + /** + * Append number (includes Booleans). Booleans are mapped to the strings + * false and true. Numbers are converted to strings abiding by the JSON standard. + * Floating-point numbers are converted to the shortest string that 'correctly' + * represents the number. + */ + template<typename number_type, + typename = typename std::enable_if<std::is_arithmetic<number_type>::value>::type> + simdjson_inline void append(number_type v) noexcept; + + /** + * Append character c. + */ + simdjson_inline void append(char c) noexcept; + + /** + * Append the string 'null'. + */ + simdjson_inline void append_null() noexcept; + + /** + * Clear the content. + */ + simdjson_inline void clear() noexcept; + + /** + * Append the std::string_view, after escaping it. + * There is no UTF-8 validation. + */ + simdjson_inline void escape_and_append(std::string_view input) noexcept; + + /** + * Append the std::string_view surrounded by double quotes, after escaping it. + * There is no UTF-8 validation. + */ + simdjson_inline void escape_and_append_with_quotes(std::string_view input) noexcept; +#if SIMDJSON_SUPPORTS_CONCEPTS + template<constevalutil::fixed_string key> + simdjson_inline void escape_and_append_with_quotes() noexcept; +#endif + /** + * Append the character surrounded by double quotes, after escaping it. + * There is no UTF-8 validation. + */ + simdjson_inline void escape_and_append_with_quotes(char input) noexcept; + + /** + * Append the character surrounded by double quotes, after escaping it. + * There is no UTF-8 validation. + */ + simdjson_inline void escape_and_append_with_quotes(const char* input) noexcept; + + /** + * Append the C string directly, without escaping. + * There is no UTF-8 validation. + */ + simdjson_inline void append_raw(const char *c) noexcept; + + /** + * Append "{" to the buffer. + */ + simdjson_inline void start_object() noexcept; + + /** + * Append "}" to the buffer. + */ + simdjson_inline void end_object() noexcept; + + /** + * Append "[" to the buffer. + */ + simdjson_inline void start_array() noexcept; + + /** + * Append "]" to the buffer. + */ + simdjson_inline void end_array() noexcept; + + /** + * Append "," to the buffer. + */ + simdjson_inline void append_comma() noexcept; + + /** + * Append ":" to the buffer. + */ + simdjson_inline void append_colon() noexcept; + + /** + * Append a key-value pair to the buffer. + * The key is escaped and surrounded by double quotes. + * The value is escaped if it is a string. + */ + template<typename key_type, typename value_type> + simdjson_inline void append_key_value(key_type key, value_type value) noexcept; +#if SIMDJSON_SUPPORTS_CONCEPTS + template<constevalutil::fixed_string key, typename value_type> + simdjson_inline void append_key_value(value_type value) noexcept; + + // Support for optional types (std::optional, etc.) + template <concepts::optional_type T> + requires(!require_custom_serialization<T>) + simdjson_inline void append(const T &opt); + + template <typename T> + requires(require_custom_serialization<T>) + simdjson_inline void append(T &&val); + + // Support for string-like types + template <typename T> + requires(std::is_convertible<T, std::string_view>::value || + std::is_same<T, const char*>::value ) + simdjson_inline void append(const T &value); +#endif +#if SIMDJSON_SUPPORTS_RANGES && SIMDJSON_SUPPORTS_CONCEPTS + // Support for range-based appending (std::ranges::view, etc.) + template <std::ranges::range R> +requires (!std::is_convertible<R, std::string_view>::value && !require_custom_serialization<R>) + simdjson_inline void append(const R &range) noexcept; +#endif + /** + * Append the std::string_view directly, without escaping. + * There is no UTF-8 validation. + */ + simdjson_inline void append_raw(std::string_view input) noexcept; + + /** + * Append len characters from str. + * There is no UTF-8 validation. + */ + simdjson_inline void append_raw(const char *str, size_t len) noexcept; +#if SIMDJSON_EXCEPTIONS + /** + * Creates an std::string from the written JSON buffer. + * Throws if memory allocation failed + * + * The result may not be valid UTF-8 if some of your content was not valid UTF-8. + * Use validate_unicode() to check the content if needed. + */ + simdjson_inline operator std::string() const noexcept(false); + + /** + * Creates an std::string_view from the written JSON buffer. + * Throws if memory allocation failed. + * + * The result may not be valid UTF-8 if some of your content was not valid UTF-8. + * Use validate_unicode() to check the content if needed. + */ + simdjson_inline operator std::string_view() const noexcept(false) simdjson_lifetime_bound; +#endif + + /** + * Returns a view on the written JSON buffer. Returns an error + * if memory allocation failed. + * + * The result may not be valid UTF-8 if some of your content was not valid UTF-8. + * Use validate_unicode() to check the content. + */ + simdjson_inline simdjson_result<std::string_view> view() const noexcept; + + /** + * Appends the null character to the buffer and returns + * a pointer to the beginning of the written JSON buffer. + * Returns an error if memory allocation failed. + * The result is null-terminated. + * + * The result may not be valid UTF-8 if some of your content was not valid UTF-8. + * Use validate_unicode() to check the content. + */ + simdjson_inline simdjson_result<const char *> c_str() noexcept; + + /** + * Return true if the content is valid UTF-8. + */ + simdjson_inline bool validate_unicode() const noexcept; + + /** + * Returns the current size of the written JSON buffer. + * If an error occurred, returns 0. + */ + simdjson_inline size_t size() const noexcept; + +private: + /** + * Returns true if we can write at least upcoming_bytes bytes. + * The underlying buffer is reallocated if needed. It is designed + * to be called before writing to the buffer. It should be fast. + */ + simdjson_inline bool capacity_check(size_t upcoming_bytes); + + /** + * Grow the buffer to at least desired_capacity bytes. + * If the allocation fails, is_valid is set to false. We expect + * that this function would not be repeatedly called. + */ + simdjson_inline void grow_buffer(size_t desired_capacity); + + /** + * We use this helper function to make sure that is_valid is kept consistent. + */ + simdjson_inline void set_valid(bool valid) noexcept; + + std::unique_ptr<char[]> buffer{}; + size_t position{0}; + size_t capacity{0}; + bool is_valid{true}; +}; + + + +} +} + + +#if !SIMDJSON_STATIC_REFLECTION +// fallback implementation until we have static reflection +template <class Z> +simdjson_warn_unused simdjson_result<std::string> to_json(const Z &z, size_t initial_capacity = simdjson::lsx::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + simdjson::lsx::builder::string_builder b(initial_capacity); + b.append(z); + std::string_view s; + auto e = b.view().get(s); + if(e) { return e; } + return std::string(s); +} +template <class Z> +simdjson_warn_unused error_code to_json(const Z &z, std::string &s, size_t initial_capacity = simdjson::lsx::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + simdjson::lsx::builder::string_builder b(initial_capacity); + b.append(z); + std::string_view sv; + auto e = b.view().get(sv); + if(e) { return e; } + s.assign(sv.data(), sv.size()); + return simdjson::SUCCESS; +} +#endif + +#if SIMDJSON_SUPPORTS_CONCEPTS +#endif // SIMDJSON_SUPPORTS_CONCEPTS + +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_STRING_BUILDER_H +/* end file simdjson/generic/builder/json_string_builder.h for lsx */ +/* including simdjson/generic/builder/json_builder.h for lsx: #include "simdjson/generic/builder/json_builder.h" */ +/* begin file simdjson/generic/builder/json_builder.h for lsx */ +#ifndef SIMDJSON_GENERIC_BUILDER_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_string_builder.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/concepts.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ +#if SIMDJSON_STATIC_REFLECTION + +#include <charconv> +#include <cstring> +#include <meta> +#include <memory> +#include <optional> +#include <string_view> +#include <type_traits> +#include <utility> +// #include <static_reflection> // for std::define_static_string - header not available yet + +namespace simdjson { +namespace lsx { +namespace builder { + +template <class T> + requires(concepts::container_but_not_string<T> && !require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &t) { + auto it = t.begin(); + auto end = t.end(); + if (it == end) { + b.append_raw("[]"); + return; + } + b.append('['); + atom(b, *it); + ++it; + for (; it != end; ++it) { + b.append(','); + atom(b, *it); + } + b.append(']'); +} + +template <class T> + requires(std::is_same_v<T, std::string> || + std::is_same_v<T, std::string_view> || + std::is_same_v<T, const char *> || + std::is_same_v<T, char>) +constexpr void atom(string_builder &b, const T &t) { + b.escape_and_append_with_quotes(t); +} + +template <concepts::string_view_keyed_map T> + requires(!require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &m) { + if (m.empty()) { + b.append_raw("{}"); + return; + } + b.append('{'); + bool first = true; + for (const auto& [key, value] : m) { + if (!first) { + b.append(','); + } + first = false; + // Keys must be convertible to string_view per the concept + b.escape_and_append_with_quotes(key); + b.append(':'); + atom(b, value); + } + b.append('}'); +} + + +template<typename number_type, + typename = typename std::enable_if<std::is_arithmetic<number_type>::value && !std::is_same_v<number_type, char>>::type> +constexpr void atom(string_builder &b, const number_type t) { + b.append(t); +} + +template <class T> + requires(std::is_class_v<T> && !concepts::container_but_not_string<T> && + !concepts::string_view_keyed_map<T> && + !concepts::optional_type<T> && + !concepts::smart_pointer<T> && + !concepts::appendable_containers<T> && + !std::is_same_v<T, std::string> && + !std::is_same_v<T, std::string_view> && + !std::is_same_v<T, const char*> && + !std::is_same_v<T, char> && !require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &t) { + int i = 0; + b.append('{'); + template for (constexpr auto dm : std::define_static_array(std::meta::nonstatic_data_members_of(^^T, std::meta::access_context::unchecked()))) { + if (i != 0) + b.append(','); + constexpr auto key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(dm))); + b.append_raw(key); + b.append(':'); + atom(b, t.[:dm:]); + i++; + }; + b.append('}'); +} + +// Support for optional types (std::optional, etc.) +template <concepts::optional_type T> + requires(!require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &opt) { + if (opt) { + atom(b, opt.value()); + } else { + b.append_raw("null"); + } +} + +// Support for smart pointers (std::unique_ptr, std::shared_ptr, etc.) +template <concepts::smart_pointer T> + requires(!require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &ptr) { + if (ptr) { + atom(b, *ptr); + } else { + b.append_raw("null"); + } +} + +// Support for enums - serialize as string representation using expand approach from P2996R12 +template <typename T> + requires(std::is_enum_v<T> && !require_custom_serialization<T>) +void atom(string_builder &b, const T &e) { +#if SIMDJSON_STATIC_REFLECTION + constexpr auto enumerators = std::define_static_array(std::meta::enumerators_of(^^T)); + template for (constexpr auto enum_val : enumerators) { + constexpr auto enum_str = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(enum_val))); + if (e == [:enum_val:]) { + b.append_raw(enum_str); + return; + } + }; + // Fallback to integer if enum value not found + atom(b, static_cast<std::underlying_type_t<T>>(e)); +#else + // Fallback: serialize as integer if reflection not available + atom(b, static_cast<std::underlying_type_t<T>>(e)); +#endif +} + +// Support for appendable containers that don't have operator[] (sets, etc.) +template <concepts::appendable_containers T> + requires(!concepts::container_but_not_string<T> && !concepts::string_view_keyed_map<T> && + !concepts::optional_type<T> && !concepts::smart_pointer<T> && + !std::is_same_v<T, std::string> && + !std::is_same_v<T, std::string_view> && !std::is_same_v<T, const char*> && !require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &container) { + if (container.empty()) { + b.append_raw("[]"); + return; + } + b.append('['); + bool first = true; + for (const auto& item : container) { + if (!first) { + b.append(','); + } + first = false; + atom(b, item); + } + b.append(']'); +} + +// append functions that delegate to atom functions for primitive types +template <class T> + requires(std::is_arithmetic_v<T> && !std::is_same_v<T, char>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +template <class T> + requires(std::is_same_v<T, std::string> || + std::is_same_v<T, std::string_view> || + std::is_same_v<T, const char *> || + std::is_same_v<T, char>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +template <concepts::optional_type T> + requires(!require_custom_serialization<T>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +template <concepts::smart_pointer T> + requires(!require_custom_serialization<T>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +template <concepts::appendable_containers T> + requires(!concepts::container_but_not_string<T> && !concepts::string_view_keyed_map<T> && + !concepts::optional_type<T> && !concepts::smart_pointer<T> && + !std::is_same_v<T, std::string> && + !std::is_same_v<T, std::string_view> && !std::is_same_v<T, const char*> && !require_custom_serialization<T>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +template <concepts::string_view_keyed_map T> + requires(!require_custom_serialization<T>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +// works for struct +template <class Z> + requires(std::is_class_v<Z> && !concepts::container_but_not_string<Z> && + !concepts::string_view_keyed_map<Z> && + !concepts::optional_type<Z> && + !concepts::smart_pointer<Z> && + !concepts::appendable_containers<Z> && + !std::is_same_v<Z, std::string> && + !std::is_same_v<Z, std::string_view> && + !std::is_same_v<Z, const char*> && + !std::is_same_v<Z, char> && !require_custom_serialization<Z>) +void append(string_builder &b, const Z &z) { + int i = 0; + b.append('{'); + template for (constexpr auto dm : std::define_static_array(std::meta::nonstatic_data_members_of(^^Z, std::meta::access_context::unchecked()))) { + if (i != 0) + b.append(','); + constexpr auto key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(dm))); + b.append_raw(key); + b.append(':'); + atom(b, z.[:dm:]); + i++; + }; + b.append('}'); +} + +// works for container that have begin() and end() iterators +template <class Z> + requires(concepts::container_but_not_string<Z> && !require_custom_serialization<Z>) +void append(string_builder &b, const Z &z) { + auto it = z.begin(); + auto end = z.end(); + if (it == end) { + b.append_raw("[]"); + return; + } + b.append('['); + atom(b, *it); + ++it; + for (; it != end; ++it) { + b.append(','); + atom(b, *it); + } + b.append(']'); +} + +template <class Z> + requires (require_custom_serialization<Z>) +void append(string_builder &b, const Z &z) { + b.append(z); +} + + +template <class Z> +simdjson_warn_unused simdjson_result<std::string> to_json_string(const Z &z, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + string_builder b(initial_capacity); + append(b, z); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); +} + +template <class Z> +simdjson_warn_unused error_code to_json(const Z &z, std::string &s, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + string_builder b(initial_capacity); + append(b, z); + std::string_view view; + if(auto e = b.view().get(view); e) { return e; } + s.assign(view); + return SUCCESS; +} + +template <class Z> +string_builder& operator<<(string_builder& b, const Z& z) { + append(b, z); + return b; +} + +// extract_from: Serialize only specific fields from a struct to JSON +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +void extract_from(string_builder &b, const T &obj) { + // Helper to check if a field name matches any of the requested fields + auto should_extract = [](std::string_view field_name) constexpr -> bool { + return ((FieldNames.view() == field_name) || ...); + }; + + b.append('{'); + bool first = true; + + // Iterate through all members of T using reflection + template for (constexpr auto mem : std::define_static_array( + std::meta::nonstatic_data_members_of(^^T, std::meta::access_context::unchecked()))) { + + if constexpr (std::meta::is_public(mem)) { + constexpr std::string_view key = std::define_static_string(std::meta::identifier_of(mem)); + + // Only serialize this field if it's in our list of requested fields + if constexpr (should_extract(key)) { + if (!first) { + b.append(','); + } + first = false; + + // Serialize the key + constexpr auto quoted_key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(mem))); + b.append_raw(quoted_key); + b.append(':'); + + // Serialize the value + atom(b, obj.[:mem:]); + } + } + }; + + b.append('}'); +} + +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result<std::string> extract_from(const T &obj, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + string_builder b(initial_capacity); + extract_from<FieldNames...>(b, obj); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); +} + +} // namespace builder +} // namespace lsx +// Alias the function template to 'to' in the global namespace +template <class Z> +simdjson_warn_unused simdjson_result<std::string> to_json(const Z &z, size_t initial_capacity = lsx::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + lsx::builder::string_builder b(initial_capacity); + lsx::builder::append(b, z); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); +} +template <class Z> +simdjson_warn_unused error_code to_json(const Z &z, std::string &s, size_t initial_capacity = lsx::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + lsx::builder::string_builder b(initial_capacity); + lsx::builder::append(b, z); + std::string_view view; + if(auto e = b.view().get(view); e) { return e; } + s.assign(view); + return SUCCESS; +} +// Global namespace function for extract_from +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result<std::string> extract_from(const T &obj, size_t initial_capacity = lsx::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + lsx::builder::string_builder b(initial_capacity); + lsx::builder::extract_from<FieldNames...>(b, obj); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); +} + +} // namespace simdjson + +#endif // SIMDJSON_STATIC_REFLECTION + +#endif +/* end file simdjson/generic/builder/json_builder.h for lsx */ +/* including simdjson/generic/builder/fractured_json_builder.h for lsx: #include "simdjson/generic/builder/fractured_json_builder.h" */ +/* begin file simdjson/generic/builder/fractured_json_builder.h for lsx */ +#ifndef SIMDJSON_GENERIC_FRACTURED_JSON_BUILDER_H +#define SIMDJSON_GENERIC_FRACTURED_JSON_BUILDER_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_builder.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/dom/fractured_json.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#if SIMDJSON_STATIC_REFLECTION + +namespace simdjson { +namespace lsx { +namespace builder { + +/** + * Serialize an object to a FracturedJson-formatted string. + * + * FracturedJson produces human-readable yet compact JSON output by intelligently + * choosing between different layout strategies (inline, compact multiline, table, + * expanded) based on content complexity, length, and structure similarity. + * + * This function combines the builder's serialization with FracturedJson formatting: + * 1. Serializes the object to minified JSON using reflection + * 2. Parses and reformats using FracturedJson + * + * Example: + * struct User { int id; std::string name; bool active; }; + * User user{1, "Alice", true}; + * auto result = to_fractured_json_string(user); + * // result.value() == "{ \"id\": 1, \"name\": \"Alice\", \"active\": true }" + * + * @param obj The object to serialize (must be a reflectable type) + * @param opts FracturedJson formatting options + * @param initial_capacity Initial buffer capacity for serialization + * @return The formatted JSON string, or an error + */ +template <class T> +simdjson_warn_unused simdjson_result<std::string> to_fractured_json_string( + const T& obj, + const fractured_json_options& opts = {}, + size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + // Step 1: Serialize to minified JSON + std::string formatted; + auto error = to_json_string(obj, initial_capacity).get(formatted); + if (error) { + return error; + } + + // Step 2: Reformat with FracturedJson + return fractured_json_string(formatted, opts); +} + +/** + * Extract specific fields from an object and format with FracturedJson. + * + * Example: + * struct User { int id; std::string name; std::string email; bool active; }; + * User user{1, "Alice", "alice@example.com", true}; + * auto result = extract_fractured_json<"id", "name">(user); + * // result.value() == "{ \"id\": 1, \"name\": \"Alice\" }" + * + * @param obj The object to serialize + * @param opts FracturedJson formatting options + * @param initial_capacity Initial buffer capacity for serialization + * @return The formatted JSON string containing only the specified fields + */ +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result<std::string> extract_fractured_json( + const T& obj, + const fractured_json_options& opts = {}, + size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + // Step 1: Extract fields to minified JSON + std::string formatted; + auto error = extract_from<FieldNames...>(obj, initial_capacity).get(formatted); + if (error) { + return error; + } + + // Step 2: Reformat with FracturedJson + return fractured_json_string(formatted, opts); +} + +} // namespace builder +} // namespace lsx + +// Global namespace convenience functions + +/** + * Serialize an object to a FracturedJson-formatted string. + * Global namespace version for convenience. + */ +template <class T> +simdjson_warn_unused simdjson_result<std::string> to_fractured_json_string( + const T& obj, + const fractured_json_options& opts = {}, + size_t initial_capacity = lsx::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + return lsx::builder::to_fractured_json_string(obj, opts, initial_capacity); +} +/** + * Extract specific fields from an object and format with FracturedJson. + * Global namespace version for convenience. + */ +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result<std::string> extract_fractured_json( + const T& obj, + const fractured_json_options& opts = {}, + size_t initial_capacity = lsx::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + return lsx::builder::extract_fractured_json<FieldNames...>(obj, opts, initial_capacity); +} + +} // namespace simdjson + +#endif // SIMDJSON_STATIC_REFLECTION + +#endif // SIMDJSON_GENERIC_FRACTURED_JSON_BUILDER_H +/* end file simdjson/generic/builder/fractured_json_builder.h for lsx */ + + + +// JSON builder inline definitions +/* including simdjson/generic/builder/json_string_builder-inl.h for lsx: #include "simdjson/generic/builder/json_string_builder-inl.h" */ +/* begin file simdjson/generic/builder/json_string_builder-inl.h for lsx */ +#include <array> +#include <cstring> +#include <type_traits> +#ifndef SIMDJSON_GENERIC_STRING_BUILDER_INL_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_INL_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_string_builder.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +/* + * Empirically, we have found that an inlined optimization is important for + * performance. The following macros are not ideal. We should find a better + * way to inline the code. + */ + +#if defined(__SSE2__) || defined(__x86_64__) || defined(__x86_64) || \ + (defined(_M_AMD64) || defined(_M_X64) || \ + (defined(_M_IX86_FP) && _M_IX86_FP == 2)) +#ifndef SIMDJSON_EXPERIMENTAL_HAS_SSE2 +#define SIMDJSON_EXPERIMENTAL_HAS_SSE2 1 +#endif +#endif + +#if defined(__aarch64__) || defined(_M_ARM64) +#ifndef SIMDJSON_EXPERIMENTAL_HAS_NEON +#define SIMDJSON_EXPERIMENTAL_HAS_NEON 1 +#endif +#endif +#if defined(__loongarch_sx) +#ifndef SIMDJSON_EXPERIMENTAL_HAS_LSX +#define SIMDJSON_EXPERIMENTAL_HAS_LSX 1 +#endif +#endif +#if defined(__riscv_v_intrinsic) && __riscv_v_intrinsic >= 11000 && \ + defined(__riscv_vector) +#ifndef SIMDJSON_EXPERIMENTAL_HAS_RVV +#define SIMDJSON_EXPERIMENTAL_HAS_RVV 1 +#endif +#endif +#if (defined(__PPC64__) || defined(_M_PPC64)) && defined(__ALTIVEC__) +#ifndef SIMDJSON_EXPERIMENTAL_HAS_PPC64 +#define SIMDJSON_EXPERIMENTAL_HAS_PPC64 1 +#endif +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_NEON +#include <arm_neon.h> +#ifdef _MSC_VER +#include <intrin.h> +#endif +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_SSE2 +#include <emmintrin.h> +#ifdef _MSC_VER +#include <intrin.h> +#endif +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_LSX +#include <lsxintrin.h> +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_RVV +#include <riscv_vector.h> +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_PPC64 +#include <altivec.h> +#ifdef bool +#undef bool +#endif +#ifdef vector +#undef vector +#endif +#endif + + +namespace simdjson { +namespace lsx { +namespace builder { + +static SIMDJSON_CONSTEXPR_LAMBDA std::array<uint8_t, 256> + json_quotable_character = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + +/** + +A possible SWAR implementation of has_json_escapable_byte. It is not used +because it is slower than the current implementation. It is kept here for +reference (to show that we tried it). + +inline bool has_json_escapable_byte(uint64_t x) { + uint64_t is_ascii = 0x8080808080808080ULL & ~x; + uint64_t xor2 = x ^ 0x0202020202020202ULL; + uint64_t lt32_or_eq34 = xor2 - 0x2121212121212121ULL; + uint64_t sub92 = x ^ 0x5C5C5C5C5C5C5C5CULL; + uint64_t eq92 = (sub92 - 0x0101010101010101ULL); + return ((lt32_or_eq34 | eq92) & is_ascii) != 0; +} + +**/ + +SIMDJSON_CONSTEXPR_LAMBDA simdjson_inline bool +simple_needs_escaping(std::string_view v) { + for (char c : v) { + // a table lookup is faster than a series of comparisons + if (json_quotable_character[static_cast<uint8_t>(c)]) { + return true; + } + } + return false; +} + +#if SIMDJSON_EXPERIMENTAL_HAS_NEON +simdjson_inline bool fast_needs_escaping(std::string_view view) { + if (view.size() < 16) { + return simple_needs_escaping(view); + } + size_t i = 0; + uint8x16_t running = vdupq_n_u8(0); + uint8x16_t v34 = vdupq_n_u8(34); + uint8x16_t v92 = vdupq_n_u8(92); + + for (; i + 15 < view.size(); i += 16) { + uint8x16_t word = vld1q_u8((const uint8_t *)view.data() + i); + running = vorrq_u8(running, vceqq_u8(word, v34)); + running = vorrq_u8(running, vceqq_u8(word, v92)); + running = vorrq_u8(running, vcltq_u8(word, vdupq_n_u8(32))); + } + if (i < view.size()) { + uint8x16_t word = + vld1q_u8((const uint8_t *)view.data() + view.length() - 16); + running = vorrq_u8(running, vceqq_u8(word, v34)); + running = vorrq_u8(running, vceqq_u8(word, v92)); + running = vorrq_u8(running, vcltq_u8(word, vdupq_n_u8(32))); + } + return vmaxvq_u32(vreinterpretq_u32_u8(running)) != 0; +} +#elif SIMDJSON_EXPERIMENTAL_HAS_SSE2 +simdjson_inline bool fast_needs_escaping(std::string_view view) { + if (view.size() < 16) { + return simple_needs_escaping(view); + } + size_t i = 0; + __m128i running = _mm_setzero_si128(); + for (; i + 15 < view.size(); i += 16) { + + __m128i word = + _mm_loadu_si128(reinterpret_cast<const __m128i *>(view.data() + i)); + running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(34))); + running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(92))); + running = _mm_or_si128( + running, _mm_cmpeq_epi8(_mm_subs_epu8(word, _mm_set1_epi8(31)), + _mm_setzero_si128())); + } + if (i < view.size()) { + __m128i word = _mm_loadu_si128( + reinterpret_cast<const __m128i *>(view.data() + view.length() - 16)); + running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(34))); + running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(92))); + running = _mm_or_si128( + running, _mm_cmpeq_epi8(_mm_subs_epu8(word, _mm_set1_epi8(31)), + _mm_setzero_si128())); + } + return _mm_movemask_epi8(running) != 0; +} +#elif SIMDJSON_EXPERIMENTAL_HAS_PPC64 +simdjson_inline bool fast_needs_escaping(std::string_view view) { + if (view.size() < 16) { + return simple_needs_escaping(view); + } + size_t i = 0; + __vector unsigned char running = vec_splats((unsigned char)0); + __vector unsigned char v34 = vec_splats((unsigned char)34); + __vector unsigned char v92 = vec_splats((unsigned char)92); + __vector unsigned char v32 = vec_splats((unsigned char)32); + + for (; i + 15 < view.size(); i += 16) { + __vector unsigned char word = + vec_vsx_ld(0, reinterpret_cast<const unsigned char *>(view.data() + i)); + running = vec_or(running, (__vector unsigned char)vec_cmpeq(word, v34)); + running = vec_or(running, (__vector unsigned char)vec_cmpeq(word, v92)); + running = vec_or(running, + (__vector unsigned char)vec_cmplt(word, v32)); + } + if (i < view.size()) { + __vector unsigned char word = vec_vsx_ld( + 0, reinterpret_cast<const unsigned char *>(view.data() + view.length() - 16)); + running = vec_or(running, (__vector unsigned char)vec_cmpeq(word, v34)); + running = vec_or(running, (__vector unsigned char)vec_cmpeq(word, v92)); + running = vec_or(running, + (__vector unsigned char)vec_cmplt(word, v32)); + } + return !vec_all_eq(running, vec_splats((unsigned char)0)); +} +#else +simdjson_inline bool fast_needs_escaping(std::string_view view) { + return simple_needs_escaping(view); +} +#endif + +// Scalar fallback for finding next quotable character +SIMDJSON_CONSTEXPR_LAMBDA simdjson_inline size_t +find_next_json_quotable_character_scalar(const std::string_view view, + size_t location) noexcept { + for (auto pos = view.begin() + location; pos != view.end(); ++pos) { + if (json_quotable_character[static_cast<uint8_t>(*pos)]) { + return pos - view.begin(); + } + } + return size_t(view.size()); +} + +// SIMD-accelerated position finding that directly locates the first quotable +// character, combining detection and position extraction in a single pass to +// minimize redundant work. +#if SIMDJSON_EXPERIMENTAL_HAS_NEON +simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + const size_t len = view.size(); + const uint8_t *ptr = + reinterpret_cast<const uint8_t *>(view.data()) + location; + size_t remaining = len - location; + + // SIMD constants for characters requiring escape + uint8x16_t v34 = vdupq_n_u8(34); // '"' + uint8x16_t v92 = vdupq_n_u8(92); // '\\' + uint8x16_t v32 = vdupq_n_u8(32); // control char threshold + + while (remaining >= 16) { + uint8x16_t word = vld1q_u8(ptr); + + // Check for quotable characters: '"', '\\', or control chars (< 32) + uint8x16_t needs_escape = vceqq_u8(word, v34); + needs_escape = vorrq_u8(needs_escape, vceqq_u8(word, v92)); + needs_escape = vorrq_u8(needs_escape, vcltq_u8(word, v32)); + + const uint8x8_t res = vshrn_n_u16(vreinterpretq_u16_u8(needs_escape), 4); + const uint64_t mask = vget_lane_u64(vreinterpret_u64_u8(res), 0); + if(mask != 0) { + size_t offset = ptr - reinterpret_cast<const uint8_t *>(view.data()); + auto trailing_zero = trailing_zeroes(mask); + return offset + (trailing_zero >> 2); + } + ptr += 16; + remaining -= 16; + } + + // Scalar fallback for remaining bytes + size_t current = len - remaining; + return find_next_json_quotable_character_scalar(view, current); +} +#elif SIMDJSON_EXPERIMENTAL_HAS_SSE2 +simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + const size_t len = view.size(); + const uint8_t *ptr = + reinterpret_cast<const uint8_t *>(view.data()) + location; + size_t remaining = len - location; + + // SIMD constants + __m128i v34 = _mm_set1_epi8(34); // '"' + __m128i v92 = _mm_set1_epi8(92); // '\\' + __m128i v31 = _mm_set1_epi8(31); // for control char detection + + while (remaining >= 16) { + __m128i word = _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr)); + + // Check for quotable characters + __m128i needs_escape = _mm_cmpeq_epi8(word, v34); + needs_escape = _mm_or_si128(needs_escape, _mm_cmpeq_epi8(word, v92)); + needs_escape = _mm_or_si128( + needs_escape, + _mm_cmpeq_epi8(_mm_subs_epu8(word, v31), _mm_setzero_si128())); + + int mask = _mm_movemask_epi8(needs_escape); + if (mask != 0) { + // Found quotable character - use trailing zero count to find position + size_t offset = ptr - reinterpret_cast<const uint8_t *>(view.data()); + return offset + trailing_zeroes(mask); + } + ptr += 16; + remaining -= 16; + } + + // Scalar fallback for remaining bytes + size_t current = len - remaining; + return find_next_json_quotable_character_scalar(view, current); +} +#elif SIMDJSON_EXPERIMENTAL_HAS_LSX +simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + const size_t len = view.size(); + const uint8_t *ptr = + reinterpret_cast<const uint8_t *>(view.data()) + location; + size_t remaining = len - location; + + //SIMD constants for characters requiring escape + __m128i v34 = __lsx_vreplgr2vr_b(34); // '"' + __m128i v92 = __lsx_vreplgr2vr_b(92); // '\\' + __m128i v32 = __lsx_vreplgr2vr_b(32); // control char threshold + + while (remaining >= 16){ + __m128i word = __lsx_vld(ptr, 0); + + //Check for the quotable characters: '"', '\\', or control char (<32) + __m128i needs_escape = __lsx_vseq_b(word, v34); + needs_escape = __lsx_vor_v(needs_escape, __lsx_vseq_b(word, v92)); + needs_escape = __lsx_vor_v(needs_escape, __lsx_vslt_bu(word, v32)); + + if (!__lsx_bz_v(needs_escape)){ + + //Found quotable character - extract exact byte position + uint64_t lo = __lsx_vpickve2gr_du(needs_escape,0); + uint64_t hi = __lsx_vpickve2gr_du(needs_escape,1); + size_t offset = ptr - reinterpret_cast<const uint8_t *>(view.data()); + if ( lo != 0) { + return offset + trailing_zeroes(lo) / 8; + } else { + return offset + 8 + trailing_zeroes(hi) / 8; + } + } + ptr += 16; + remaining -= 16; + } + size_t current = len - remaining; + return find_next_json_quotable_character_scalar(view, current); +} +#elif SIMDJSON_EXPERIMENTAL_HAS_RVV +simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + const size_t len = view.size(); + const uint8_t *ptr = + reinterpret_cast<const uint8_t *>(view.data()) + location; + size_t remaining = len - location; + + while (remaining > 0) { + size_t vl = __riscv_vsetvl_e8m1(remaining); + vuint8m1_t word = __riscv_vle8_v_u8m1(ptr, vl); + + // Check for quotable characters: '"', '\\', or control chars (< 32) + vbool8_t needs_escape = __riscv_vmseq(word, (uint8_t)34, vl); + needs_escape = __riscv_vmor(needs_escape, + __riscv_vmseq(word, (uint8_t)92, vl), vl); + needs_escape = __riscv_vmor(needs_escape, + __riscv_vmsltu(word, (uint8_t)32, vl), vl); + + long first = __riscv_vfirst(needs_escape, vl); + if (first >= 0) { + size_t offset = ptr - reinterpret_cast<const uint8_t *>(view.data()); + return offset + first; + } + ptr += vl; + remaining -= vl; + } + + return len; +} +#elif SIMDJSON_EXPERIMENTAL_HAS_PPC64 +simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + const size_t len = view.size(); + const uint8_t *ptr = + reinterpret_cast<const uint8_t *>(view.data()) + location; + size_t remaining = len - location; + + // SIMD constants for characters requiring escape + __vector unsigned char v34 = vec_splats((unsigned char)34); // '"' + __vector unsigned char v92 = vec_splats((unsigned char)92); // '\\' + __vector unsigned char v32 = vec_splats((unsigned char)32); // control char threshold + + // Bitmask for vec_vbpermq to extract one bit per byte + const __vector unsigned char perm_mask = {0x78, 0x70, 0x68, 0x60, 0x58, 0x50, + 0x48, 0x40, 0x38, 0x30, 0x28, 0x20, + 0x18, 0x10, 0x08, 0x00}; + + while (remaining >= 16) { + __vector unsigned char word = + vec_vsx_ld(0, reinterpret_cast<const unsigned char *>(ptr)); + + // Check for quotable characters: '"', '\\', or control chars (< 32) + __vector unsigned char needs_escape = + (__vector unsigned char)vec_cmpeq(word, v34); + needs_escape = vec_or(needs_escape, + (__vector unsigned char)vec_cmpeq(word, v92)); + needs_escape = vec_or(needs_escape, + (__vector unsigned char)vec_cmplt(word, v32)); + + __vector unsigned long long result = + (__vector unsigned long long)vec_vbpermq(needs_escape, perm_mask); +#ifdef __LITTLE_ENDIAN__ + unsigned int mask = static_cast<unsigned int>(result[1]); +#else + unsigned int mask = static_cast<unsigned int>(result[0]); +#endif + if (mask != 0) { + size_t offset = ptr - reinterpret_cast<const uint8_t *>(view.data()); + return offset + __builtin_ctz(mask); + } + ptr += 16; + remaining -= 16; + } + + // Scalar fallback for remaining bytes + size_t current = len - remaining; + return find_next_json_quotable_character_scalar(view, current); +} +#else +SIMDJSON_CONSTEXPR_LAMBDA simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + return find_next_json_quotable_character_scalar(view, location); +} +#endif + +SIMDJSON_CONSTEXPR_LAMBDA static std::string_view control_chars[] = { + "\\u0000", "\\u0001", "\\u0002", "\\u0003", "\\u0004", "\\u0005", "\\u0006", + "\\u0007", "\\b", "\\t", "\\n", "\\u000b", "\\f", "\\r", + "\\u000e", "\\u000f", "\\u0010", "\\u0011", "\\u0012", "\\u0013", "\\u0014", + "\\u0015", "\\u0016", "\\u0017", "\\u0018", "\\u0019", "\\u001a", "\\u001b", + "\\u001c", "\\u001d", "\\u001e", "\\u001f"}; + +// All Unicode characters may be placed within the quotation marks, except for +// the characters that MUST be escaped: quotation mark, reverse solidus, and the +// control characters (U+0000 through U+001F). There are two-character sequence +// escape representations of some popular characters: +// \", \\, \b, \f, \n, \r, \t. +SIMDJSON_CONSTEXPR_LAMBDA simdjson_inline void escape_json_char(char c, char *&out) { + if (c == '"') { + memcpy(out, "\\\"", 2); + out += 2; + } else if (c == '\\') { + memcpy(out, "\\\\", 2); + out += 2; + } else { + std::string_view v = control_chars[uint8_t(c)]; + memcpy(out, v.data(), v.size()); + out += v.size(); + } +} + +// Writes the escaped version of input to out, returning the number of bytes +// written. Uses SIMD position finding to locate quotable characters efficiently. +inline size_t write_string_escaped(const std::string_view input, char *out) { + size_t mysize = input.size(); + + // Use SIMD position finder directly - it returns mysize if no escape needed + size_t location = find_next_json_quotable_character(input, 0); + if (location == mysize) { + // Fast path: no escaping needed + memcpy(out, input.data(), input.size()); + return input.size(); + } + + const char *const initout = out; + memcpy(out, input.data(), location); + out += location; + escape_json_char(input[location], out); + location += 1; + while (location < mysize) { + size_t newlocation = find_next_json_quotable_character(input, location); + memcpy(out, input.data() + location, newlocation - location); + out += newlocation - location; + location = newlocation; + if (location == mysize) { + break; + } + escape_json_char(input[location], out); + location += 1; + } + return out - initout; +} + +simdjson_inline string_builder::string_builder(size_t initial_capacity) + : buffer(new(std::nothrow) char[initial_capacity]), position(0), + capacity(buffer.get() != nullptr ? initial_capacity : 0), + is_valid(buffer.get() != nullptr) {} + +simdjson_inline bool string_builder::capacity_check(size_t upcoming_bytes) { + // We use the convention that when is_valid is false, then the capacity and + // the position are 0. + // Most of the time, this function will return true. + if (simdjson_likely(upcoming_bytes <= capacity - position)) { + return true; + } + // check for overflow, most of the time there is no overflow + if (simdjson_unlikely(position + upcoming_bytes < position)) { + return false; + } + // We will rarely get here. + grow_buffer((std::max)(capacity * 2, position + upcoming_bytes)); + // If the buffer allocation failed, we set is_valid to false. + return is_valid; +} + +simdjson_inline void string_builder::grow_buffer(size_t desired_capacity) { + if (!is_valid) { + return; + } + std::unique_ptr<char[]> new_buffer(new (std::nothrow) char[desired_capacity]); + if (new_buffer.get() == nullptr) { + set_valid(false); + return; + } + std::memcpy(new_buffer.get(), buffer.get(), position); + buffer.swap(new_buffer); + capacity = desired_capacity; +} + +simdjson_inline void string_builder::set_valid(bool valid) noexcept { + if (!valid) { + is_valid = false; + capacity = 0; + position = 0; + buffer.reset(); + } else { + is_valid = true; + } +} + +simdjson_inline size_t string_builder::size() const noexcept { + return position; +} + +simdjson_inline void string_builder::append(char c) noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = c; + } +} + +simdjson_inline void string_builder::append_null() noexcept { + constexpr char null_literal[] = "null"; + constexpr size_t null_len = sizeof(null_literal) - 1; + if (capacity_check(null_len)) { + std::memcpy(buffer.get() + position, null_literal, null_len); + position += null_len; + } +} + +simdjson_inline void string_builder::clear() noexcept { + position = 0; + // if it was invalid, we should try to repair it + if (!is_valid) { + capacity = 0; + buffer.reset(); + is_valid = true; + } +} + +namespace internal { + +template <typename number_type, typename = typename std::enable_if< + std::is_unsigned<number_type>::value>::type> +simdjson_really_inline int int_log2(number_type x) { + return 63 - leading_zeroes(uint64_t(x) | 1); +} + +simdjson_really_inline int fast_digit_count_32(uint32_t x) { + static uint64_t table[] = { + 4294967296, 8589934582, 8589934582, 8589934582, 12884901788, + 12884901788, 12884901788, 17179868184, 17179868184, 17179868184, + 21474826480, 21474826480, 21474826480, 21474826480, 25769703776, + 25769703776, 25769703776, 30063771072, 30063771072, 30063771072, + 34349738368, 34349738368, 34349738368, 34349738368, 38554705664, + 38554705664, 38554705664, 41949672960, 41949672960, 41949672960, + 42949672960, 42949672960}; + return uint32_t((x + table[int_log2(x)]) >> 32); +} + +simdjson_really_inline int fast_digit_count_64(uint64_t x) { + static uint64_t table[] = {9, + 99, + 999, + 9999, + 99999, + 999999, + 9999999, + 99999999, + 999999999, + 9999999999, + 99999999999, + 999999999999, + 9999999999999, + 99999999999999, + 999999999999999ULL, + 9999999999999999ULL, + 99999999999999999ULL, + 999999999999999999ULL, + 9999999999999999999ULL}; + int y = (19 * int_log2(x) >> 6); + y += x > table[y]; + return y + 1; +} + +template <typename number_type, typename = typename std::enable_if< + std::is_unsigned<number_type>::value>::type> +simdjson_really_inline size_t digit_count(number_type v) noexcept { + static_assert(sizeof(number_type) == 8 || sizeof(number_type) == 4 || + sizeof(number_type) == 2 || sizeof(number_type) == 1, + "We only support 8-bit, 16-bit, 32-bit and 64-bit numbers"); + SIMDJSON_IF_CONSTEXPR(sizeof(number_type) <= 4) { + return fast_digit_count_32(static_cast<uint32_t>(v)); + } + else { + return fast_digit_count_64(static_cast<uint64_t>(v)); + } +} +static const char decimal_table[200] = { + 0x30, 0x30, 0x30, 0x31, 0x30, 0x32, 0x30, 0x33, 0x30, 0x34, 0x30, 0x35, + 0x30, 0x36, 0x30, 0x37, 0x30, 0x38, 0x30, 0x39, 0x31, 0x30, 0x31, 0x31, + 0x31, 0x32, 0x31, 0x33, 0x31, 0x34, 0x31, 0x35, 0x31, 0x36, 0x31, 0x37, + 0x31, 0x38, 0x31, 0x39, 0x32, 0x30, 0x32, 0x31, 0x32, 0x32, 0x32, 0x33, + 0x32, 0x34, 0x32, 0x35, 0x32, 0x36, 0x32, 0x37, 0x32, 0x38, 0x32, 0x39, + 0x33, 0x30, 0x33, 0x31, 0x33, 0x32, 0x33, 0x33, 0x33, 0x34, 0x33, 0x35, + 0x33, 0x36, 0x33, 0x37, 0x33, 0x38, 0x33, 0x39, 0x34, 0x30, 0x34, 0x31, + 0x34, 0x32, 0x34, 0x33, 0x34, 0x34, 0x34, 0x35, 0x34, 0x36, 0x34, 0x37, + 0x34, 0x38, 0x34, 0x39, 0x35, 0x30, 0x35, 0x31, 0x35, 0x32, 0x35, 0x33, + 0x35, 0x34, 0x35, 0x35, 0x35, 0x36, 0x35, 0x37, 0x35, 0x38, 0x35, 0x39, + 0x36, 0x30, 0x36, 0x31, 0x36, 0x32, 0x36, 0x33, 0x36, 0x34, 0x36, 0x35, + 0x36, 0x36, 0x36, 0x37, 0x36, 0x38, 0x36, 0x39, 0x37, 0x30, 0x37, 0x31, + 0x37, 0x32, 0x37, 0x33, 0x37, 0x34, 0x37, 0x35, 0x37, 0x36, 0x37, 0x37, + 0x37, 0x38, 0x37, 0x39, 0x38, 0x30, 0x38, 0x31, 0x38, 0x32, 0x38, 0x33, + 0x38, 0x34, 0x38, 0x35, 0x38, 0x36, 0x38, 0x37, 0x38, 0x38, 0x38, 0x39, + 0x39, 0x30, 0x39, 0x31, 0x39, 0x32, 0x39, 0x33, 0x39, 0x34, 0x39, 0x35, + 0x39, 0x36, 0x39, 0x37, 0x39, 0x38, 0x39, 0x39, +}; +} // namespace internal + +template <typename number_type, typename> +simdjson_inline void string_builder::append(number_type v) noexcept { + static_assert(std::is_same<number_type, bool>::value || + std::is_integral<number_type>::value || + std::is_floating_point<number_type>::value, + "Unsupported number type"); + // If C++17 is available, we can 'if constexpr' here. + SIMDJSON_IF_CONSTEXPR(std::is_same<number_type, bool>::value) { + if (v) { + constexpr char true_literal[] = "true"; + constexpr size_t true_len = sizeof(true_literal) - 1; + if (capacity_check(true_len)) { + std::memcpy(buffer.get() + position, true_literal, true_len); + position += true_len; + } + } else { + constexpr char false_literal[] = "false"; + constexpr size_t false_len = sizeof(false_literal) - 1; + if (capacity_check(false_len)) { + std::memcpy(buffer.get() + position, false_literal, false_len); + position += false_len; + } + } + } + else SIMDJSON_IF_CONSTEXPR(std::is_unsigned<number_type>::value) { + // Process 4 digits at a time instead of 2, reducing store operations + // and divisions by approximately half for large numbers. + constexpr size_t max_number_size = 20; + if (capacity_check(max_number_size)) { + using unsigned_type = typename std::make_unsigned<number_type>::type; + unsigned_type pv = static_cast<unsigned_type>(v); + size_t dc = internal::digit_count(pv); + char *write_pointer = buffer.get() + position + dc - 1; + + // Process 4 digits per iteration for large numbers + while (pv >= 10000) { + unsigned_type q = pv / 10000; + unsigned_type r = pv % 10000; + unsigned_type r_hi = r / 100; // High 2 digits of remainder + unsigned_type r_lo = r % 100; // Low 2 digits of remainder + // Write low 2 digits first (rightmost), then high 2 digits + memcpy(write_pointer - 1, &internal::decimal_table[r_lo * 2], 2); + memcpy(write_pointer - 3, &internal::decimal_table[r_hi * 2], 2); + write_pointer -= 4; + pv = q; + } + + // Handle remaining 1-4 digits with original 2-digit loop + while (pv >= 100) { + memcpy(write_pointer - 1, &internal::decimal_table[(pv % 100) * 2], 2); + write_pointer -= 2; + pv /= 100; + } + if (pv >= 10) { + *write_pointer-- = char('0' + (pv % 10)); + pv /= 10; + } + *write_pointer = char('0' + pv); + position += dc; + } + } + else SIMDJSON_IF_CONSTEXPR(std::is_integral<number_type>::value) { + // Same 4-digit batching as unsigned path for signed integers + constexpr size_t max_number_size = 20; + if (capacity_check(max_number_size)) { + using unsigned_type = typename std::make_unsigned<number_type>::type; + bool negative = v < 0; + unsigned_type pv = static_cast<unsigned_type>(v); + if (negative) { + pv = 0 - pv; // the 0 is for Microsoft + } + size_t dc = internal::digit_count(pv); + // by always writing the minus sign, we avoid the branch. + buffer.get()[position] = '-'; + position += negative ? 1 : 0; + char *write_pointer = buffer.get() + position + dc - 1; + + // Process 4 digits per iteration for large numbers + while (pv >= 10000) { + unsigned_type q = pv / 10000; + unsigned_type r = pv % 10000; + unsigned_type r_hi = r / 100; + unsigned_type r_lo = r % 100; + memcpy(write_pointer - 1, &internal::decimal_table[r_lo * 2], 2); + memcpy(write_pointer - 3, &internal::decimal_table[r_hi * 2], 2); + write_pointer -= 4; + pv = q; + } + + // Handle remaining 1-4 digits + while (pv >= 100) { + memcpy(write_pointer - 1, &internal::decimal_table[(pv % 100) * 2], 2); + write_pointer -= 2; + pv /= 100; + } + if (pv >= 10) { + *write_pointer-- = char('0' + (pv % 10)); + pv /= 10; + } + *write_pointer = char('0' + pv); + position += dc; + } + } + else SIMDJSON_IF_CONSTEXPR(std::is_floating_point<number_type>::value) { + constexpr size_t max_number_size = 24; + if (capacity_check(max_number_size)) { + // We could specialize for float. + char *end = simdjson::internal::to_chars(buffer.get() + position, nullptr, + double(v)); + position = end - buffer.get(); + } + } +} + +simdjson_inline void +string_builder::escape_and_append(std::string_view input) noexcept { + // escaping might turn a control character into \x00xx so 6 characters. + if (capacity_check(6 * input.size())) { + position += write_string_escaped(input, buffer.get() + position); + } +} + +simdjson_inline void +string_builder::escape_and_append_with_quotes(std::string_view input) noexcept { + // escaping might turn a control character into \x00xx so 6 characters. + if (capacity_check(2 + 6 * input.size())) { + buffer.get()[position++] = '"'; + position += write_string_escaped(input, buffer.get() + position); + buffer.get()[position++] = '"'; + } +} + +simdjson_inline void +string_builder::escape_and_append_with_quotes(char input) noexcept { + // escaping might turn a control character into \x00xx so 6 characters. + if (capacity_check(2 + 6 * 1)) { + buffer.get()[position++] = '"'; + std::string_view cinput(&input, 1); + position += write_string_escaped(cinput, buffer.get() + position); + buffer.get()[position++] = '"'; + } +} + +simdjson_inline void +string_builder::escape_and_append_with_quotes(const char *input) noexcept { + std::string_view cinput(input); + escape_and_append_with_quotes(cinput); +} +#if SIMDJSON_SUPPORTS_CONCEPTS +template <constevalutil::fixed_string key> +simdjson_inline void string_builder::escape_and_append_with_quotes() noexcept { + escape_and_append_with_quotes(constevalutil::string_constant<key>::value); +} +#endif + +simdjson_inline void string_builder::append_raw(const char *c) noexcept { + size_t len = std::strlen(c); + append_raw(c, len); +} + +simdjson_inline void +string_builder::append_raw(std::string_view input) noexcept { + if (capacity_check(input.size())) { + std::memcpy(buffer.get() + position, input.data(), input.size()); + position += input.size(); + } +} + +simdjson_inline void string_builder::append_raw(const char *str, + size_t len) noexcept { + if (capacity_check(len)) { + std::memcpy(buffer.get() + position, str, len); + position += len; + } +} +#if SIMDJSON_SUPPORTS_CONCEPTS +// Support for optional types (std::optional, etc.) +template <concepts::optional_type T> + requires(!require_custom_serialization<T>) +simdjson_inline void string_builder::append(const T &opt) { + if (opt) { + append(*opt); + } else { + append_null(); + } +} + +template <typename T> + requires(require_custom_serialization<T>) +simdjson_inline void string_builder::append(T &&val) { + serialize(*this, std::forward<T>(val)); +} + +template <typename T> + requires(std::is_convertible<T, std::string_view>::value || + std::is_same<T, const char *>::value) +simdjson_inline void string_builder::append(const T &value) { + escape_and_append_with_quotes(value); +} +#endif + +#if SIMDJSON_SUPPORTS_RANGES && SIMDJSON_SUPPORTS_CONCEPTS +// Support for range-based appending (std::ranges::view, etc.) +template <std::ranges::range R> + requires(!std::is_convertible<R, std::string_view>::value && !require_custom_serialization<R>) +simdjson_inline void string_builder::append(const R &range) noexcept { + auto it = std::ranges::begin(range); + auto end = std::ranges::end(range); + if constexpr (concepts::is_pair<std::ranges::range_value_t<R>>) { + start_object(); + + if (it == end) { + end_object(); + return; // Handle empty range + } + // Append first item without leading comma + append_key_value(it->first, it->second); + ++it; + + // Append remaining items with preceding commas + for (; it != end; ++it) { + append_comma(); + append_key_value(it->first, it->second); + } + end_object(); + } else { + start_array(); + if (it == end) { + end_array(); + return; // Handle empty range + } + + // Append first item without leading comma + append(*it); + ++it; + + // Append remaining items with preceding commas + for (; it != end; ++it) { + append_comma(); + append(*it); + } + end_array(); + } +} + +#endif + +#if SIMDJSON_EXCEPTIONS +simdjson_inline string_builder::operator std::string() const noexcept(false) { + return std::string(operator std::string_view()); +} + +simdjson_inline string_builder::operator std::string_view() const + noexcept(false) simdjson_lifetime_bound { + return view(); +} +#endif + +simdjson_inline simdjson_result<std::string_view> +string_builder::view() const noexcept { + if (!is_valid) { + return simdjson::OUT_OF_CAPACITY; + } + return std::string_view(buffer.get(), position); +} + +simdjson_inline simdjson_result<const char *> string_builder::c_str() noexcept { + if (capacity_check(1)) { + buffer.get()[position] = '\0'; + return buffer.get(); + } + return simdjson::OUT_OF_CAPACITY; +} + +simdjson_inline bool string_builder::validate_unicode() const noexcept { + return simdjson::validate_utf8(buffer.get(), position); +} + +simdjson_inline void string_builder::start_object() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '{'; + } +} + +simdjson_inline void string_builder::end_object() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '}'; + } +} + +simdjson_inline void string_builder::start_array() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '['; + } +} + +simdjson_inline void string_builder::end_array() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ']'; + } +} + +simdjson_inline void string_builder::append_comma() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ','; + } +} + +simdjson_inline void string_builder::append_colon() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ':'; + } +} + +template <typename key_type, typename value_type> +simdjson_inline void +string_builder::append_key_value(key_type key, value_type value) noexcept { + static_assert(std::is_same<key_type, const char *>::value || + std::is_convertible<key_type, std::string_view>::value, + "Unsupported key type"); + escape_and_append_with_quotes(key); + append_colon(); + SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, std::nullptr_t>::value) { + append_null(); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, char>::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR( + std::is_convertible<value_type, std::string_view>::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, const char *>::value) { + escape_and_append_with_quotes(value); + } + else { + append(value); + } +} + +#if SIMDJSON_SUPPORTS_CONCEPTS +template <constevalutil::fixed_string key, typename value_type> +simdjson_inline void +string_builder::append_key_value(value_type value) noexcept { + escape_and_append_with_quotes<key>(); + append_colon(); + SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, std::nullptr_t>::value) { + append_null(); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, char>::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR( + std::is_convertible<value_type, std::string_view>::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, const char *>::value) { + escape_and_append_with_quotes(value); + } + else { + append(value); + } +} +#endif + +} // namespace builder +} // namespace lsx +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_STRING_BUILDER_INL_H +/* end file simdjson/generic/builder/json_string_builder-inl.h for lsx */ + +/* end file simdjson/generic/builder/amalgamated.h for lsx */ +/* including simdjson/lsx/end.h: #include "simdjson/lsx/end.h" */ +/* begin file simdjson/lsx/end.h */ +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#undef SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT +/* undefining SIMDJSON_IMPLEMENTATION from "lsx" */ +#undef SIMDJSON_IMPLEMENTATION +/* end file simdjson/lsx/end.h */ + +#endif // SIMDJSON_LSX_BUILDER_H +/* end file simdjson/lsx/builder.h */ +#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(lasx) +/* including simdjson/lasx/builder.h: #include "simdjson/lasx/builder.h" */ +/* begin file simdjson/lasx/builder.h */ +#ifndef SIMDJSON_LASX_BUILDER_H +#define SIMDJSON_LASX_BUILDER_H + +/* including simdjson/lasx/begin.h: #include "simdjson/lasx/begin.h" */ +/* begin file simdjson/lasx/begin.h */ +/* defining SIMDJSON_IMPLEMENTATION to "lasx" */ +#define SIMDJSON_IMPLEMENTATION lasx +#include <lsxintrin.h> // This is a hack. We should not need to put this include here. +#if SIMDJSON_CAN_ALWAYS_RUN_LASX +// nothing needed. +#else +SIMDJSON_TARGET_REGION("lasx,lsx") +#endif + +/* including simdjson/lasx/base.h: #include "simdjson/lasx/base.h" */ +/* begin file simdjson/lasx/base.h */ +#ifndef SIMDJSON_LASX_BASE_H +#define SIMDJSON_LASX_BASE_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +/** + * Implementation for LASX. + */ +namespace lasx { + +class implementation; + +namespace { +namespace simd { +template <typename T> struct simd8; +template <typename T> struct simd8x64; +} // namespace simd +} // unnamed namespace + +} // namespace lasx +} // namespace simdjson + +#endif // SIMDJSON_LASX_BASE_H +/* end file simdjson/lasx/base.h */ +/* including simdjson/lasx/intrinsics.h: #include "simdjson/lasx/intrinsics.h" */ +/* begin file simdjson/lasx/intrinsics.h */ +#ifndef SIMDJSON_LASX_INTRINSICS_H +#define SIMDJSON_LASX_INTRINSICS_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#include <lsxintrin.h> +#include <lasxintrin.h> + +static_assert(sizeof(__m256i) <= simdjson::SIMDJSON_PADDING, "insufficient padding for LoongArch ASX"); + +#endif // SIMDJSON_LASX_INTRINSICS_H +/* end file simdjson/lasx/intrinsics.h */ +/* including simdjson/lasx/bitmanipulation.h: #include "simdjson/lasx/bitmanipulation.h" */ +/* begin file simdjson/lasx/bitmanipulation.h */ +#ifndef SIMDJSON_LASX_BITMANIPULATION_H +#define SIMDJSON_LASX_BITMANIPULATION_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/intrinsics.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/bitmask.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace lasx { +namespace { + +// We sometimes call trailing_zero on inputs that are zero, +// but the algorithms do not end up using the returned value. +// Sadly, sanitizers are not smart enough to figure it out. +SIMDJSON_NO_SANITIZE_UNDEFINED +// This function can be used safely even if not all bytes have been +// initialized. +// See issue https://github.com/simdjson/simdjson/issues/1965 +SIMDJSON_NO_SANITIZE_MEMORY +simdjson_inline int trailing_zeroes(uint64_t input_num) { + return __builtin_ctzll(input_num); +} + +/* result might be undefined when input_num is zero */ +simdjson_inline uint64_t clear_lowest_bit(uint64_t input_num) { + return input_num & (input_num-1); +} + +/* result might be undefined when input_num is zero */ +simdjson_inline int leading_zeroes(uint64_t input_num) { + return __builtin_clzll(input_num); +} + +/* result might be undefined when input_num is zero */ +simdjson_inline int count_ones(uint64_t input_num) { + return __lasx_xvpickve2gr_w(__lasx_xvpcnt_d(__m256i(v4u64{input_num, 0, 0, 0})), 0); +} + +simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2, uint64_t *result) { + return __builtin_uaddll_overflow(value1, value2, + reinterpret_cast<unsigned long long *>(result)); +} + +} // unnamed namespace +} // namespace lasx +} // namespace simdjson + +#endif // SIMDJSON_LASX_BITMANIPULATION_H +/* end file simdjson/lasx/bitmanipulation.h */ +/* including simdjson/lasx/bitmask.h: #include "simdjson/lasx/bitmask.h" */ +/* begin file simdjson/lasx/bitmask.h */ +#ifndef SIMDJSON_LASX_BITMASK_H +#define SIMDJSON_LASX_BITMASK_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace lasx { +namespace { + +// +// Perform a "cumulative bitwise xor," flipping bits each time a 1 is encountered. +// +// For example, prefix_xor(00100100) == 00011100 +// +simdjson_inline uint64_t prefix_xor(uint64_t bitmask) { + bitmask ^= bitmask << 1; + bitmask ^= bitmask << 2; + bitmask ^= bitmask << 4; + bitmask ^= bitmask << 8; + bitmask ^= bitmask << 16; + bitmask ^= bitmask << 32; + return bitmask; +} + +} // unnamed namespace +} // namespace lasx +} // namespace simdjson + +#endif +/* end file simdjson/lasx/bitmask.h */ +/* including simdjson/lasx/numberparsing_defs.h: #include "simdjson/lasx/numberparsing_defs.h" */ +/* begin file simdjson/lasx/numberparsing_defs.h */ +#ifndef SIMDJSON_LASX_NUMBERPARSING_DEFS_H +#define SIMDJSON_LASX_NUMBERPARSING_DEFS_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/intrinsics.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#include <cstring> + +namespace simdjson { +namespace lasx { +namespace numberparsing { + +// we don't have appropriate instructions, so let us use a scalar function +// credit: https://johnnylee-sde.github.io/Fast-numeric-string-to-int/ +/** @private */ +static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) { + uint64_t val; + std::memcpy(&val, chars, sizeof(uint64_t)); + val = (val & 0x0F0F0F0F0F0F0F0F) * 2561 >> 8; + val = (val & 0x00FF00FF00FF00FF) * 6553601 >> 16; + return uint32_t((val & 0x0000FFFF0000FFFF) * 42949672960001 >> 32); +} + +simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) { + internal::value128 answer; + __uint128_t r = (static_cast<__uint128_t>(value1)) * value2; + answer.low = uint64_t(r); + answer.high = uint64_t(r >> 64); + return answer; +} + +} // namespace numberparsing +} // namespace lasx +} // namespace simdjson + +#ifndef SIMDJSON_SWAR_NUMBER_PARSING +#if SIMDJSON_IS_BIG_ENDIAN +#define SIMDJSON_SWAR_NUMBER_PARSING 0 +#else +#define SIMDJSON_SWAR_NUMBER_PARSING 1 +#endif +#endif + +#endif // SIMDJSON_LASX_NUMBERPARSING_DEFS_H +/* end file simdjson/lasx/numberparsing_defs.h */ +/* including simdjson/lasx/simd.h: #include "simdjson/lasx/simd.h" */ +/* begin file simdjson/lasx/simd.h */ +#ifndef SIMDJSON_LASX_SIMD_H +#define SIMDJSON_LASX_SIMD_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace lasx { +namespace { +namespace simd { + + // Forward-declared so they can be used by splat and friends. + template<typename Child> + struct base { + __m256i value; + + // Zero constructor + simdjson_inline base() : value{__m256i()} {} + + // Conversion from SIMD register + simdjson_inline base(const __m256i _value) : value(_value) {} + + // Conversion to SIMD register + simdjson_inline operator const __m256i&() const { return this->value; } + simdjson_inline operator __m256i&() { return this->value; } + simdjson_inline operator const v32i8&() const { return (v32i8&)this->value; } + simdjson_inline operator v32i8&() { return (v32i8&)this->value; } + + // Bit operations + simdjson_inline Child operator|(const Child other) const { return __lasx_xvor_v(*this, other); } + simdjson_inline Child operator&(const Child other) const { return __lasx_xvand_v(*this, other); } + simdjson_inline Child operator^(const Child other) const { return __lasx_xvxor_v(*this, other); } + simdjson_inline Child bit_andnot(const Child other) const { return __lasx_xvandn_v(other, *this); } + simdjson_inline Child& operator|=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast | other; return *this_cast; } + simdjson_inline Child& operator&=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast & other; return *this_cast; } + simdjson_inline Child& operator^=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast ^ other; return *this_cast; } + }; + + // Forward-declared so they can be used by splat and friends. + template<typename T> + struct simd8; + + template<typename T, typename Mask=simd8<bool>> + struct base8: base<simd8<T>> { + simdjson_inline base8() : base<simd8<T>>() {} + simdjson_inline base8(const __m256i _value) : base<simd8<T>>(_value) {} + + friend simdjson_really_inline Mask operator==(const simd8<T> lhs, const simd8<T> rhs) { return __lasx_xvseq_b(lhs, rhs); } + + static const int SIZE = sizeof(base<simd8<T>>::value); + + template<int N=1> + simdjson_inline simd8<T> prev(const simd8<T> prev_chunk) const { + __m256i hi = __lasx_xvbsll_v(*this, N); + __m256i lo = __lasx_xvbsrl_v(*this, 16 - N); + __m256i tmp = __lasx_xvbsrl_v(prev_chunk, 16 - N); + lo = __lasx_xvpermi_q(lo, tmp, 0x21); + return __lasx_xvor_v(hi, lo); + } + }; + + // SIMD byte mask type (returned by things like eq and gt) + template<> + struct simd8<bool>: base8<bool> { + static simdjson_inline simd8<bool> splat(bool _value) { return __lasx_xvreplgr2vr_b(uint8_t(-(!!_value))); } + + simdjson_inline simd8() : base8() {} + simdjson_inline simd8(const __m256i _value) : base8<bool>(_value) {} + // Splat constructor + simdjson_inline simd8(bool _value) : base8<bool>(splat(_value)) {} + + simdjson_inline int to_bitmask() const { + __m256i mask = __lasx_xvmskltz_b(*this); + return (__lasx_xvpickve2gr_w(mask, 4) << 16) | (__lasx_xvpickve2gr_w(mask, 0)); + } + simdjson_inline bool any() const { + __m256i v = __lasx_xvmsknz_b(*this); + return (0 == __lasx_xvpickve2gr_w(v, 0)) && (0 == __lasx_xvpickve2gr_w(v, 4)); + } + simdjson_inline simd8<bool> operator~() const { return *this ^ true; } + }; + + template<typename T> + struct base8_numeric: base8<T> { + static simdjson_inline simd8<T> splat(T _value) { + return __lasx_xvreplgr2vr_b(_value); + } + static simdjson_inline simd8<T> zero() { return __lasx_xvldi(0); } + static simdjson_inline simd8<T> load(const T values[32]) { + return __lasx_xvld(reinterpret_cast<const __m256i *>(values), 0); + } + // Repeat 16 values as many times as necessary (usually for lookup tables) + static simdjson_inline simd8<T> repeat_16( + T v0, T v1, T v2, T v3, T v4, T v5, T v6, T v7, + T v8, T v9, T v10, T v11, T v12, T v13, T v14, T v15 + ) { + return simd8<T>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15, + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + ); + } + + simdjson_inline base8_numeric() : base8<T>() {} + simdjson_inline base8_numeric(const __m256i _value) : base8<T>(_value) {} + + // Store to array + simdjson_inline void store(T dst[32]) const { + return __lasx_xvst(*this, reinterpret_cast<__m256i *>(dst), 0); + } + + // Addition/subtraction are the same for signed and unsigned + simdjson_inline simd8<T> operator+(const simd8<T> other) const { return __lasx_xvadd_b(*this, other); } + simdjson_inline simd8<T> operator-(const simd8<T> other) const { return __lasx_xvsub_b(*this, other); } + simdjson_inline simd8<T>& operator+=(const simd8<T> other) { *this = *this + other; return *static_cast<simd8<T>*>(this); } + simdjson_inline simd8<T>& operator-=(const simd8<T> other) { *this = *this - other; return *static_cast<simd8<T>*>(this); } + + // Override to distinguish from bool version + simdjson_inline simd8<T> operator~() const { return *this ^ 0xFFu; } + + // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values) + template<typename L> + simdjson_inline simd8<L> lookup_16(simd8<L> lookup_table) const { + return __lasx_xvshuf_b(lookup_table, lookup_table, *this); + } + + // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted as a bitset). + // Passing a 0 value for mask would be equivalent to writing out every byte to output. + // Only the first 16 - count_ones(mask) bytes of the result are significant but 16 bytes + // get written. + template<typename L> + simdjson_inline void compress(uint32_t mask, L * output) const { + using internal::thintable_epi8; + using internal::BitsSetTable256mul2; + using internal::pshufb_combine_table; + // this particular implementation was inspired by haswell + // lasx do it in 4 steps, first 8 bytes and then second 8 bytes... + uint8_t mask1 = uint8_t(mask); // least significant 8 bits + uint8_t mask2 = uint8_t(mask >> 8); // second significant 8 bits + uint8_t mask3 = uint8_t(mask >> 16); // ... + uint8_t mask4 = uint8_t(mask >> 24); // ... + // next line just loads the 64-bit values thintable_epi8[mask{1,2,3,4}] + // into a 256-bit register. + __m256i shufmask = {int64_t(thintable_epi8[mask1]), int64_t(thintable_epi8[mask2]) + 0x0808080808080808, int64_t(thintable_epi8[mask3]), int64_t(thintable_epi8[mask4]) + 0x0808080808080808}; + // this is the version "nearly pruned" + __m256i pruned = __lasx_xvshuf_b(*this, *this, shufmask); + // we still need to put the pieces back together. + // we compute the popcount of the first words: + int pop1 = BitsSetTable256mul2[mask1]; + int pop2 = BitsSetTable256mul2[mask2]; + int pop3 = BitsSetTable256mul2[mask3]; + + // then load the corresponding mask + __m256i masklo = __lasx_xvldx(reinterpret_cast<void*>(reinterpret_cast<unsigned long>(pshufb_combine_table)), pop1 * 8); + __m256i maskhi = __lasx_xvldx(reinterpret_cast<void*>(reinterpret_cast<unsigned long>(pshufb_combine_table)), pop3 * 8); + __m256i compactmask = __lasx_xvpermi_q(maskhi, masklo, 0x20); + __m256i answer = __lasx_xvshuf_b(pruned, pruned, compactmask); + __lasx_xvst(answer, reinterpret_cast<uint8_t*>(output), 0); + uint64_t value3 = __lasx_xvpickve2gr_du(answer, 2); + uint64_t value4 = __lasx_xvpickve2gr_du(answer, 3); + uint64_t *pos = reinterpret_cast<uint64_t*>(reinterpret_cast<uint8_t*>(output) + 16 - (pop1 + pop2) / 2); + pos[0] = value3; + pos[1] = value4; + } + + template<typename L> + simdjson_inline simd8<L> lookup_16( + L replace0, L replace1, L replace2, L replace3, + L replace4, L replace5, L replace6, L replace7, + L replace8, L replace9, L replace10, L replace11, + L replace12, L replace13, L replace14, L replace15) const { + return lookup_16(simd8<L>::repeat_16( + replace0, replace1, replace2, replace3, + replace4, replace5, replace6, replace7, + replace8, replace9, replace10, replace11, + replace12, replace13, replace14, replace15 + )); + } + }; + + // Signed bytes + template<> + struct simd8<int8_t> : base8_numeric<int8_t> { + simdjson_inline simd8() : base8_numeric<int8_t>() {} + simdjson_inline simd8(const __m256i _value) : base8_numeric<int8_t>(_value) {} + // Splat constructor + simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {} + // Array constructor + simdjson_inline simd8(const int8_t values[32]) : simd8(load(values)) {} + // Member-by-member initialization + simdjson_inline simd8( + int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, + int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15, + int8_t v16, int8_t v17, int8_t v18, int8_t v19, int8_t v20, int8_t v21, int8_t v22, int8_t v23, + int8_t v24, int8_t v25, int8_t v26, int8_t v27, int8_t v28, int8_t v29, int8_t v30, int8_t v31 + ) : simd8({ + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15, + v16,v17,v18,v19,v20,v21,v22,v23, + v24,v25,v26,v27,v28,v29,v30,v31 + }) {} + // Repeat 16 values as many times as necessary (usually for lookup tables) + simdjson_inline static simd8<int8_t> repeat_16( + int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, + int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 + ) { + return simd8<int8_t>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15, + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + ); + } + + // Order-sensitive comparisons + simdjson_inline simd8<int8_t> max_val(const simd8<int8_t> other) const { return __lasx_xvmax_b(*this, other); } + simdjson_inline simd8<int8_t> min_val(const simd8<int8_t> other) const { return __lasx_xvmin_b(*this, other); } + simdjson_inline simd8<bool> operator>(const simd8<int8_t> other) const { return __lasx_xvslt_b(other, *this); } + simdjson_inline simd8<bool> operator<(const simd8<int8_t> other) const { return __lasx_xvslt_b(*this, other); } + }; + + // Unsigned bytes + template<> + struct simd8<uint8_t>: base8_numeric<uint8_t> { + simdjson_inline simd8() : base8_numeric<uint8_t>() {} + simdjson_inline simd8(const __m256i _value) : base8_numeric<uint8_t>(_value) {} + // Splat constructor + simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {} + // Array constructor + simdjson_inline simd8(const uint8_t values[32]) : simd8(load(values)) {} + // Member-by-member initialization + simdjson_inline simd8( + uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, + uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15, + uint8_t v16, uint8_t v17, uint8_t v18, uint8_t v19, uint8_t v20, uint8_t v21, uint8_t v22, uint8_t v23, + uint8_t v24, uint8_t v25, uint8_t v26, uint8_t v27, uint8_t v28, uint8_t v29, uint8_t v30, uint8_t v31 + ) : simd8(__m256i(v32u8{ + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15, + v16,v17,v18,v19,v20,v21,v22,v23, + v24,v25,v26,v27,v28,v29,v30,v31 + })) {} + // Repeat 16 values as many times as necessary (usually for lookup tables) + simdjson_inline static simd8<uint8_t> repeat_16( + uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, + uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 + ) { + return simd8<uint8_t>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15, + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + ); + } + + // Saturated math + simdjson_inline simd8<uint8_t> saturating_add(const simd8<uint8_t> other) const { return __lasx_xvsadd_bu(*this, other); } + simdjson_inline simd8<uint8_t> saturating_sub(const simd8<uint8_t> other) const { return __lasx_xvssub_bu(*this, other); } + + // Order-specific operations + simdjson_inline simd8<uint8_t> max_val(const simd8<uint8_t> other) const { return __lasx_xvmax_bu(*this, other); } + simdjson_inline simd8<uint8_t> min_val(const simd8<uint8_t> other) const { return __lasx_xvmin_bu(other, *this); } + // Same as >, but only guarantees true is nonzero (< guarantees true = -1) + simdjson_inline simd8<uint8_t> gt_bits(const simd8<uint8_t> other) const { return this->saturating_sub(other); } + // Same as <, but only guarantees true is nonzero (< guarantees true = -1) + simdjson_inline simd8<uint8_t> lt_bits(const simd8<uint8_t> other) const { return other.saturating_sub(*this); } + simdjson_inline simd8<bool> operator<=(const simd8<uint8_t> other) const { return other.max_val(*this) == other; } + simdjson_inline simd8<bool> operator>=(const simd8<uint8_t> other) const { return other.min_val(*this) == other; } + simdjson_inline simd8<bool> operator>(const simd8<uint8_t> other) const { return this->gt_bits(other).any_bits_set(); } + simdjson_inline simd8<bool> operator<(const simd8<uint8_t> other) const { return this->lt_bits(other).any_bits_set(); } + + // Bit-specific operations + simdjson_inline simd8<bool> bits_not_set() const { return *this == uint8_t(0); } + simdjson_inline simd8<bool> bits_not_set(simd8<uint8_t> bits) const { return (*this & bits).bits_not_set(); } + simdjson_inline simd8<bool> any_bits_set() const { return ~this->bits_not_set(); } + simdjson_inline simd8<bool> any_bits_set(simd8<uint8_t> bits) const { return ~this->bits_not_set(bits); } + simdjson_inline bool is_ascii() const { + __m256i mask = __lasx_xvmskltz_b(*this); + return (0 == __lasx_xvpickve2gr_w(mask, 0)) && (0 == __lasx_xvpickve2gr_w(mask, 4)); + } + simdjson_inline bool bits_not_set_anywhere() const { + __m256i v = __lasx_xvmsknz_b(*this); + return (0 == __lasx_xvpickve2gr_w(v, 0)) && (0 == __lasx_xvpickve2gr_w(v, 4)); + } + simdjson_inline bool any_bits_set_anywhere() const { return !bits_not_set_anywhere(); } + simdjson_inline bool bits_not_set_anywhere(simd8<uint8_t> bits) const { + __m256i v = __lasx_xvmsknz_b(__lasx_xvand_v(*this, bits)); + return (0 == __lasx_xvpickve2gr_w(v, 0)) && (0 == __lasx_xvpickve2gr_w(v, 4)); + } + simdjson_inline bool any_bits_set_anywhere(simd8<uint8_t> bits) const { return !bits_not_set_anywhere(bits); } + template<int N> + simdjson_inline simd8<uint8_t> shr() const { return simd8<uint8_t>(__lasx_xvsrli_b(*this, N)); } + template<int N> + simdjson_inline simd8<uint8_t> shl() const { return simd8<uint8_t>(__lasx_xvslli_b(*this, N)); } + }; + + template<typename T> + struct simd8x64 { + static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<T>); + static_assert(NUM_CHUNKS == 2, "LASX kernel should use two registers per 64-byte block."); + const simd8<T> chunks[NUM_CHUNKS]; + template<int idx> simd8<uint8_t> get() const { return idx < NUM_CHUNKS ? chunks[idx] : simd8<T>(); } + + simd8x64(const simd8x64<T>& o) = delete; // no copy allowed + simd8x64<T>& operator=(const simd8<T>& other) = delete; // no assignment allowed + simd8x64() = delete; // no default constructor allowed + + simdjson_inline simd8x64(const simd8<T> chunk0, const simd8<T> chunk1) : chunks{chunk0, chunk1} {} + simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8<T>::load(ptr), simd8<T>::load(ptr+32)} {} + + simdjson_inline uint64_t compress(uint64_t mask, T * output) const { + uint32_t mask1 = uint32_t(mask); + uint32_t mask2 = uint32_t(mask >> 32); + __m256i zcnt = __lasx_xvpcnt_w(__m256i(v4u64{~mask, 0, 0, 0})); + uint64_t zcnt1 = __lasx_xvpickve2gr_wu(zcnt, 0); + uint64_t zcnt2 = __lasx_xvpickve2gr_wu(zcnt, 1); + // There should be a critical value which processes in scaler is faster. + if (zcnt1) + this->chunks[0].compress(mask1, output); + if (zcnt2) + this->chunks[1].compress(mask2, output + zcnt1); + return zcnt1 + zcnt2; + } + + simdjson_inline void store(T ptr[64]) const { + this->chunks[0].store(ptr+sizeof(simd8<T>)*0); + this->chunks[1].store(ptr+sizeof(simd8<T>)*1); + } + + simdjson_inline uint64_t to_bitmask() const { + __m256i mask0 = __lasx_xvmskltz_b(this->chunks[0]); + __m256i mask1 = __lasx_xvmskltz_b(this->chunks[1]); + __m256i mask_tmp = __lasx_xvpickve_w(mask0, 4); + __m256i tmp = __lasx_xvpickve_w(mask1, 4); + mask0 = __lasx_xvinsve0_w(mask0, mask1, 1); + mask_tmp = __lasx_xvinsve0_w(mask_tmp, tmp, 1); + return __lasx_xvpickve2gr_du(__lasx_xvpackev_h(mask_tmp, mask0), 0); + } + + simdjson_inline simd8<T> reduce_or() const { + return this->chunks[0] | this->chunks[1]; + } + + simdjson_inline uint64_t eq(const T m) const { + const simd8<T> mask = simd8<T>::splat(m); + return simd8x64<bool>( + this->chunks[0] == mask, + this->chunks[1] == mask + ).to_bitmask(); + } + + simdjson_inline uint64_t eq(const simd8x64<uint8_t> &other) const { + return simd8x64<bool>( + this->chunks[0] == other.chunks[0], + this->chunks[1] == other.chunks[1] + ).to_bitmask(); + } + + simdjson_inline uint64_t lteq(const T m) const { + const simd8<T> mask = simd8<T>::splat(m); + return simd8x64<bool>( + this->chunks[0] <= mask, + this->chunks[1] <= mask + ).to_bitmask(); + } + }; // struct simd8x64<T> + +} // namespace simd +} // unnamed namespace +} // namespace lasx +} // namespace simdjson + +#endif // SIMDJSON_LASX_SIMD_H +/* end file simdjson/lasx/simd.h */ +/* including simdjson/lasx/stringparsing_defs.h: #include "simdjson/lasx/stringparsing_defs.h" */ +/* begin file simdjson/lasx/stringparsing_defs.h */ +#ifndef SIMDJSON_LASX_STRINGPARSING_DEFS_H +#define SIMDJSON_LASX_STRINGPARSING_DEFS_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/simd.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace lasx { +namespace { + +using namespace simd; + +// Holds backslashes and quotes locations. +struct backslash_and_quote { +public: + static constexpr uint32_t BYTES_PROCESSED = 32; + simdjson_inline backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst); + + simdjson_inline bool has_quote_first() { return ((bs_bits - 1) & quote_bits) != 0; } + simdjson_inline bool has_backslash() { return bs_bits != 0; } + simdjson_inline int quote_index() { return trailing_zeroes(quote_bits); } + simdjson_inline int backslash_index() { return trailing_zeroes(bs_bits); } + + uint32_t bs_bits; + uint32_t quote_bits; +}; // struct backslash_and_quote + +simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) { + // this can read up to 31 bytes beyond the buffer size, but we require + // SIMDJSON_PADDING of padding + static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "backslash and quote finder must process fewer than SIMDJSON_PADDING bytes"); + simd8<uint8_t> v(src); + v.store(dst); + return { + static_cast<uint32_t>((v == '\\').to_bitmask()), // bs_bits + static_cast<uint32_t>((v == '"').to_bitmask()), // quote_bits + }; +} + + +struct escaping { + static constexpr uint32_t BYTES_PROCESSED = 16; + simdjson_inline static escaping copy_and_find(const uint8_t *src, uint8_t *dst); + + simdjson_inline bool has_escape() { return escape_bits != 0; } + simdjson_inline int escape_index() { return trailing_zeroes(escape_bits); } + + uint64_t escape_bits; +}; // struct escaping + + + +simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *dst) { + static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "escaping finder must process fewer than SIMDJSON_PADDING bytes"); + simd8<uint8_t> v(src); + v.store(dst); + simd8<bool> is_quote = (v == '"'); + simd8<bool> is_backslash = (v == '\\'); + simd8<bool> is_control = (v < 32); + return { + static_cast<uint64_t>((is_backslash | is_quote | is_control).to_bitmask()) + }; +} + +} // unnamed namespace +} // namespace lasx +} // namespace simdjson + +#endif // SIMDJSON_LASX_STRINGPARSING_DEFS_H +/* end file simdjson/lasx/stringparsing_defs.h */ + +#define SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT 1 + + +/* end file simdjson/lasx/begin.h */ +/* including simdjson/generic/builder/amalgamated.h for lasx: #include "simdjson/generic/builder/amalgamated.h" */ +/* begin file simdjson/generic/builder/amalgamated.h for lasx */ +#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_BUILDER_DEPENDENCIES_H) +#error simdjson/generic/builder/dependencies.h must be included before simdjson/generic/builder/amalgamated.h! +#endif + +/* including simdjson/generic/builder/json_string_builder.h for lasx: #include "simdjson/generic/builder/json_string_builder.h" */ +/* begin file simdjson/generic/builder/json_string_builder.h for lasx */ +#ifndef SIMDJSON_GENERIC_STRING_BUILDER_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { + + +#if SIMDJSON_SUPPORTS_CONCEPTS + +namespace lasx { +namespace builder { + class string_builder; +}} + +template <typename T, typename = void> +struct has_custom_serialization : std::false_type {}; + +inline constexpr struct serialize_tag { + template <typename T> + constexpr void operator()(lasx::builder::string_builder& b, T&& obj) const{ + return tag_invoke(*this, b, std::forward<T>(obj)); + } + + +} serialize{}; +template <typename T> +struct has_custom_serialization<T, std::void_t< + decltype(tag_invoke(serialize, std::declval<lasx::builder::string_builder&>(), std::declval<T&>())) +>> : std::true_type {}; + +template <typename T> +constexpr bool require_custom_serialization = has_custom_serialization<T>::value; +#else +struct has_custom_serialization : std::false_type {}; +#endif // SIMDJSON_SUPPORTS_CONCEPTS + +namespace lasx { +namespace builder { +/** + * A builder for JSON strings representing documents. This is a low-level + * builder that is not meant to be used directly by end-users. Though it + * supports atomic types (Booleans, strings), it does not support composed + * types (arrays and objects). + * + * Ultimately, this class can support kernel-specific optimizations. E.g., + * it may make use of SIMD instructions to escape strings faster. + */ +class string_builder { +public: + simdjson_inline string_builder(size_t initial_capacity = DEFAULT_INITIAL_CAPACITY); + + static constexpr size_t DEFAULT_INITIAL_CAPACITY = 1024; + + /** + * Append number (includes Booleans). Booleans are mapped to the strings + * false and true. Numbers are converted to strings abiding by the JSON standard. + * Floating-point numbers are converted to the shortest string that 'correctly' + * represents the number. + */ + template<typename number_type, + typename = typename std::enable_if<std::is_arithmetic<number_type>::value>::type> + simdjson_inline void append(number_type v) noexcept; + + /** + * Append character c. + */ + simdjson_inline void append(char c) noexcept; + + /** + * Append the string 'null'. + */ + simdjson_inline void append_null() noexcept; + + /** + * Clear the content. + */ + simdjson_inline void clear() noexcept; + + /** + * Append the std::string_view, after escaping it. + * There is no UTF-8 validation. + */ + simdjson_inline void escape_and_append(std::string_view input) noexcept; + + /** + * Append the std::string_view surrounded by double quotes, after escaping it. + * There is no UTF-8 validation. + */ + simdjson_inline void escape_and_append_with_quotes(std::string_view input) noexcept; +#if SIMDJSON_SUPPORTS_CONCEPTS + template<constevalutil::fixed_string key> + simdjson_inline void escape_and_append_with_quotes() noexcept; +#endif + /** + * Append the character surrounded by double quotes, after escaping it. + * There is no UTF-8 validation. + */ + simdjson_inline void escape_and_append_with_quotes(char input) noexcept; + + /** + * Append the character surrounded by double quotes, after escaping it. + * There is no UTF-8 validation. + */ + simdjson_inline void escape_and_append_with_quotes(const char* input) noexcept; + + /** + * Append the C string directly, without escaping. + * There is no UTF-8 validation. + */ + simdjson_inline void append_raw(const char *c) noexcept; + + /** + * Append "{" to the buffer. + */ + simdjson_inline void start_object() noexcept; + + /** + * Append "}" to the buffer. + */ + simdjson_inline void end_object() noexcept; + + /** + * Append "[" to the buffer. + */ + simdjson_inline void start_array() noexcept; + + /** + * Append "]" to the buffer. + */ + simdjson_inline void end_array() noexcept; + + /** + * Append "," to the buffer. + */ + simdjson_inline void append_comma() noexcept; + + /** + * Append ":" to the buffer. + */ + simdjson_inline void append_colon() noexcept; + + /** + * Append a key-value pair to the buffer. + * The key is escaped and surrounded by double quotes. + * The value is escaped if it is a string. + */ + template<typename key_type, typename value_type> + simdjson_inline void append_key_value(key_type key, value_type value) noexcept; +#if SIMDJSON_SUPPORTS_CONCEPTS + template<constevalutil::fixed_string key, typename value_type> + simdjson_inline void append_key_value(value_type value) noexcept; + + // Support for optional types (std::optional, etc.) + template <concepts::optional_type T> + requires(!require_custom_serialization<T>) + simdjson_inline void append(const T &opt); + + template <typename T> + requires(require_custom_serialization<T>) + simdjson_inline void append(T &&val); + + // Support for string-like types + template <typename T> + requires(std::is_convertible<T, std::string_view>::value || + std::is_same<T, const char*>::value ) + simdjson_inline void append(const T &value); +#endif +#if SIMDJSON_SUPPORTS_RANGES && SIMDJSON_SUPPORTS_CONCEPTS + // Support for range-based appending (std::ranges::view, etc.) + template <std::ranges::range R> +requires (!std::is_convertible<R, std::string_view>::value && !require_custom_serialization<R>) + simdjson_inline void append(const R &range) noexcept; +#endif + /** + * Append the std::string_view directly, without escaping. + * There is no UTF-8 validation. + */ + simdjson_inline void append_raw(std::string_view input) noexcept; + + /** + * Append len characters from str. + * There is no UTF-8 validation. + */ + simdjson_inline void append_raw(const char *str, size_t len) noexcept; +#if SIMDJSON_EXCEPTIONS + /** + * Creates an std::string from the written JSON buffer. + * Throws if memory allocation failed + * + * The result may not be valid UTF-8 if some of your content was not valid UTF-8. + * Use validate_unicode() to check the content if needed. + */ + simdjson_inline operator std::string() const noexcept(false); + + /** + * Creates an std::string_view from the written JSON buffer. + * Throws if memory allocation failed. + * + * The result may not be valid UTF-8 if some of your content was not valid UTF-8. + * Use validate_unicode() to check the content if needed. + */ + simdjson_inline operator std::string_view() const noexcept(false) simdjson_lifetime_bound; +#endif + + /** + * Returns a view on the written JSON buffer. Returns an error + * if memory allocation failed. + * + * The result may not be valid UTF-8 if some of your content was not valid UTF-8. + * Use validate_unicode() to check the content. + */ + simdjson_inline simdjson_result<std::string_view> view() const noexcept; + + /** + * Appends the null character to the buffer and returns + * a pointer to the beginning of the written JSON buffer. + * Returns an error if memory allocation failed. + * The result is null-terminated. + * + * The result may not be valid UTF-8 if some of your content was not valid UTF-8. + * Use validate_unicode() to check the content. + */ + simdjson_inline simdjson_result<const char *> c_str() noexcept; + + /** + * Return true if the content is valid UTF-8. + */ + simdjson_inline bool validate_unicode() const noexcept; + + /** + * Returns the current size of the written JSON buffer. + * If an error occurred, returns 0. + */ + simdjson_inline size_t size() const noexcept; + +private: + /** + * Returns true if we can write at least upcoming_bytes bytes. + * The underlying buffer is reallocated if needed. It is designed + * to be called before writing to the buffer. It should be fast. + */ + simdjson_inline bool capacity_check(size_t upcoming_bytes); + + /** + * Grow the buffer to at least desired_capacity bytes. + * If the allocation fails, is_valid is set to false. We expect + * that this function would not be repeatedly called. + */ + simdjson_inline void grow_buffer(size_t desired_capacity); + + /** + * We use this helper function to make sure that is_valid is kept consistent. + */ + simdjson_inline void set_valid(bool valid) noexcept; + + std::unique_ptr<char[]> buffer{}; + size_t position{0}; + size_t capacity{0}; + bool is_valid{true}; +}; + + + +} +} + + +#if !SIMDJSON_STATIC_REFLECTION +// fallback implementation until we have static reflection +template <class Z> +simdjson_warn_unused simdjson_result<std::string> to_json(const Z &z, size_t initial_capacity = simdjson::lasx::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + simdjson::lasx::builder::string_builder b(initial_capacity); + b.append(z); + std::string_view s; + auto e = b.view().get(s); + if(e) { return e; } + return std::string(s); +} +template <class Z> +simdjson_warn_unused error_code to_json(const Z &z, std::string &s, size_t initial_capacity = simdjson::lasx::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + simdjson::lasx::builder::string_builder b(initial_capacity); + b.append(z); + std::string_view sv; + auto e = b.view().get(sv); + if(e) { return e; } + s.assign(sv.data(), sv.size()); + return simdjson::SUCCESS; +} +#endif + +#if SIMDJSON_SUPPORTS_CONCEPTS +#endif // SIMDJSON_SUPPORTS_CONCEPTS + +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_STRING_BUILDER_H +/* end file simdjson/generic/builder/json_string_builder.h for lasx */ +/* including simdjson/generic/builder/json_builder.h for lasx: #include "simdjson/generic/builder/json_builder.h" */ +/* begin file simdjson/generic/builder/json_builder.h for lasx */ +#ifndef SIMDJSON_GENERIC_BUILDER_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_string_builder.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/concepts.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ +#if SIMDJSON_STATIC_REFLECTION + +#include <charconv> +#include <cstring> +#include <meta> +#include <memory> +#include <optional> +#include <string_view> +#include <type_traits> +#include <utility> +// #include <static_reflection> // for std::define_static_string - header not available yet + +namespace simdjson { +namespace lasx { +namespace builder { + +template <class T> + requires(concepts::container_but_not_string<T> && !require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &t) { + auto it = t.begin(); + auto end = t.end(); + if (it == end) { + b.append_raw("[]"); + return; + } + b.append('['); + atom(b, *it); + ++it; + for (; it != end; ++it) { + b.append(','); + atom(b, *it); + } + b.append(']'); +} + +template <class T> + requires(std::is_same_v<T, std::string> || + std::is_same_v<T, std::string_view> || + std::is_same_v<T, const char *> || + std::is_same_v<T, char>) +constexpr void atom(string_builder &b, const T &t) { + b.escape_and_append_with_quotes(t); +} + +template <concepts::string_view_keyed_map T> + requires(!require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &m) { + if (m.empty()) { + b.append_raw("{}"); + return; + } + b.append('{'); + bool first = true; + for (const auto& [key, value] : m) { + if (!first) { + b.append(','); + } + first = false; + // Keys must be convertible to string_view per the concept + b.escape_and_append_with_quotes(key); + b.append(':'); + atom(b, value); + } + b.append('}'); +} + + +template<typename number_type, + typename = typename std::enable_if<std::is_arithmetic<number_type>::value && !std::is_same_v<number_type, char>>::type> +constexpr void atom(string_builder &b, const number_type t) { + b.append(t); +} + +template <class T> + requires(std::is_class_v<T> && !concepts::container_but_not_string<T> && + !concepts::string_view_keyed_map<T> && + !concepts::optional_type<T> && + !concepts::smart_pointer<T> && + !concepts::appendable_containers<T> && + !std::is_same_v<T, std::string> && + !std::is_same_v<T, std::string_view> && + !std::is_same_v<T, const char*> && + !std::is_same_v<T, char> && !require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &t) { + int i = 0; + b.append('{'); + template for (constexpr auto dm : std::define_static_array(std::meta::nonstatic_data_members_of(^^T, std::meta::access_context::unchecked()))) { + if (i != 0) + b.append(','); + constexpr auto key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(dm))); + b.append_raw(key); + b.append(':'); + atom(b, t.[:dm:]); + i++; + }; + b.append('}'); +} + +// Support for optional types (std::optional, etc.) +template <concepts::optional_type T> + requires(!require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &opt) { + if (opt) { + atom(b, opt.value()); + } else { + b.append_raw("null"); + } +} + +// Support for smart pointers (std::unique_ptr, std::shared_ptr, etc.) +template <concepts::smart_pointer T> + requires(!require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &ptr) { + if (ptr) { + atom(b, *ptr); + } else { + b.append_raw("null"); + } +} + +// Support for enums - serialize as string representation using expand approach from P2996R12 +template <typename T> + requires(std::is_enum_v<T> && !require_custom_serialization<T>) +void atom(string_builder &b, const T &e) { +#if SIMDJSON_STATIC_REFLECTION + constexpr auto enumerators = std::define_static_array(std::meta::enumerators_of(^^T)); + template for (constexpr auto enum_val : enumerators) { + constexpr auto enum_str = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(enum_val))); + if (e == [:enum_val:]) { + b.append_raw(enum_str); + return; + } + }; + // Fallback to integer if enum value not found + atom(b, static_cast<std::underlying_type_t<T>>(e)); +#else + // Fallback: serialize as integer if reflection not available + atom(b, static_cast<std::underlying_type_t<T>>(e)); +#endif +} + +// Support for appendable containers that don't have operator[] (sets, etc.) +template <concepts::appendable_containers T> + requires(!concepts::container_but_not_string<T> && !concepts::string_view_keyed_map<T> && + !concepts::optional_type<T> && !concepts::smart_pointer<T> && + !std::is_same_v<T, std::string> && + !std::is_same_v<T, std::string_view> && !std::is_same_v<T, const char*> && !require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &container) { + if (container.empty()) { + b.append_raw("[]"); + return; + } + b.append('['); + bool first = true; + for (const auto& item : container) { + if (!first) { + b.append(','); + } + first = false; + atom(b, item); + } + b.append(']'); +} + +// append functions that delegate to atom functions for primitive types +template <class T> + requires(std::is_arithmetic_v<T> && !std::is_same_v<T, char>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +template <class T> + requires(std::is_same_v<T, std::string> || + std::is_same_v<T, std::string_view> || + std::is_same_v<T, const char *> || + std::is_same_v<T, char>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +template <concepts::optional_type T> + requires(!require_custom_serialization<T>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +template <concepts::smart_pointer T> + requires(!require_custom_serialization<T>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +template <concepts::appendable_containers T> + requires(!concepts::container_but_not_string<T> && !concepts::string_view_keyed_map<T> && + !concepts::optional_type<T> && !concepts::smart_pointer<T> && + !std::is_same_v<T, std::string> && + !std::is_same_v<T, std::string_view> && !std::is_same_v<T, const char*> && !require_custom_serialization<T>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +template <concepts::string_view_keyed_map T> + requires(!require_custom_serialization<T>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +// works for struct +template <class Z> + requires(std::is_class_v<Z> && !concepts::container_but_not_string<Z> && + !concepts::string_view_keyed_map<Z> && + !concepts::optional_type<Z> && + !concepts::smart_pointer<Z> && + !concepts::appendable_containers<Z> && + !std::is_same_v<Z, std::string> && + !std::is_same_v<Z, std::string_view> && + !std::is_same_v<Z, const char*> && + !std::is_same_v<Z, char> && !require_custom_serialization<Z>) +void append(string_builder &b, const Z &z) { + int i = 0; + b.append('{'); + template for (constexpr auto dm : std::define_static_array(std::meta::nonstatic_data_members_of(^^Z, std::meta::access_context::unchecked()))) { + if (i != 0) + b.append(','); + constexpr auto key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(dm))); + b.append_raw(key); + b.append(':'); + atom(b, z.[:dm:]); + i++; + }; + b.append('}'); +} + +// works for container that have begin() and end() iterators +template <class Z> + requires(concepts::container_but_not_string<Z> && !require_custom_serialization<Z>) +void append(string_builder &b, const Z &z) { + auto it = z.begin(); + auto end = z.end(); + if (it == end) { + b.append_raw("[]"); + return; + } + b.append('['); + atom(b, *it); + ++it; + for (; it != end; ++it) { + b.append(','); + atom(b, *it); + } + b.append(']'); +} + +template <class Z> + requires (require_custom_serialization<Z>) +void append(string_builder &b, const Z &z) { + b.append(z); +} + + +template <class Z> +simdjson_warn_unused simdjson_result<std::string> to_json_string(const Z &z, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + string_builder b(initial_capacity); + append(b, z); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); +} + +template <class Z> +simdjson_warn_unused error_code to_json(const Z &z, std::string &s, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + string_builder b(initial_capacity); + append(b, z); + std::string_view view; + if(auto e = b.view().get(view); e) { return e; } + s.assign(view); + return SUCCESS; +} + +template <class Z> +string_builder& operator<<(string_builder& b, const Z& z) { + append(b, z); + return b; +} + +// extract_from: Serialize only specific fields from a struct to JSON +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +void extract_from(string_builder &b, const T &obj) { + // Helper to check if a field name matches any of the requested fields + auto should_extract = [](std::string_view field_name) constexpr -> bool { + return ((FieldNames.view() == field_name) || ...); + }; + + b.append('{'); + bool first = true; + + // Iterate through all members of T using reflection + template for (constexpr auto mem : std::define_static_array( + std::meta::nonstatic_data_members_of(^^T, std::meta::access_context::unchecked()))) { + + if constexpr (std::meta::is_public(mem)) { + constexpr std::string_view key = std::define_static_string(std::meta::identifier_of(mem)); + + // Only serialize this field if it's in our list of requested fields + if constexpr (should_extract(key)) { + if (!first) { + b.append(','); + } + first = false; + + // Serialize the key + constexpr auto quoted_key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(mem))); + b.append_raw(quoted_key); + b.append(':'); + + // Serialize the value + atom(b, obj.[:mem:]); + } + } + }; + + b.append('}'); +} + +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result<std::string> extract_from(const T &obj, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + string_builder b(initial_capacity); + extract_from<FieldNames...>(b, obj); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); +} + +} // namespace builder +} // namespace lasx +// Alias the function template to 'to' in the global namespace +template <class Z> +simdjson_warn_unused simdjson_result<std::string> to_json(const Z &z, size_t initial_capacity = lasx::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + lasx::builder::string_builder b(initial_capacity); + lasx::builder::append(b, z); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); +} +template <class Z> +simdjson_warn_unused error_code to_json(const Z &z, std::string &s, size_t initial_capacity = lasx::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + lasx::builder::string_builder b(initial_capacity); + lasx::builder::append(b, z); + std::string_view view; + if(auto e = b.view().get(view); e) { return e; } + s.assign(view); + return SUCCESS; +} +// Global namespace function for extract_from +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result<std::string> extract_from(const T &obj, size_t initial_capacity = lasx::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + lasx::builder::string_builder b(initial_capacity); + lasx::builder::extract_from<FieldNames...>(b, obj); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); +} + +} // namespace simdjson + +#endif // SIMDJSON_STATIC_REFLECTION + +#endif +/* end file simdjson/generic/builder/json_builder.h for lasx */ +/* including simdjson/generic/builder/fractured_json_builder.h for lasx: #include "simdjson/generic/builder/fractured_json_builder.h" */ +/* begin file simdjson/generic/builder/fractured_json_builder.h for lasx */ +#ifndef SIMDJSON_GENERIC_FRACTURED_JSON_BUILDER_H +#define SIMDJSON_GENERIC_FRACTURED_JSON_BUILDER_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_builder.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/dom/fractured_json.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#if SIMDJSON_STATIC_REFLECTION + +namespace simdjson { +namespace lasx { +namespace builder { + +/** + * Serialize an object to a FracturedJson-formatted string. + * + * FracturedJson produces human-readable yet compact JSON output by intelligently + * choosing between different layout strategies (inline, compact multiline, table, + * expanded) based on content complexity, length, and structure similarity. + * + * This function combines the builder's serialization with FracturedJson formatting: + * 1. Serializes the object to minified JSON using reflection + * 2. Parses and reformats using FracturedJson + * + * Example: + * struct User { int id; std::string name; bool active; }; + * User user{1, "Alice", true}; + * auto result = to_fractured_json_string(user); + * // result.value() == "{ \"id\": 1, \"name\": \"Alice\", \"active\": true }" + * + * @param obj The object to serialize (must be a reflectable type) + * @param opts FracturedJson formatting options + * @param initial_capacity Initial buffer capacity for serialization + * @return The formatted JSON string, or an error + */ +template <class T> +simdjson_warn_unused simdjson_result<std::string> to_fractured_json_string( + const T& obj, + const fractured_json_options& opts = {}, + size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + // Step 1: Serialize to minified JSON + std::string formatted; + auto error = to_json_string(obj, initial_capacity).get(formatted); + if (error) { + return error; + } + + // Step 2: Reformat with FracturedJson + return fractured_json_string(formatted, opts); +} + +/** + * Extract specific fields from an object and format with FracturedJson. + * + * Example: + * struct User { int id; std::string name; std::string email; bool active; }; + * User user{1, "Alice", "alice@example.com", true}; + * auto result = extract_fractured_json<"id", "name">(user); + * // result.value() == "{ \"id\": 1, \"name\": \"Alice\" }" + * + * @param obj The object to serialize + * @param opts FracturedJson formatting options + * @param initial_capacity Initial buffer capacity for serialization + * @return The formatted JSON string containing only the specified fields + */ +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result<std::string> extract_fractured_json( + const T& obj, + const fractured_json_options& opts = {}, + size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + // Step 1: Extract fields to minified JSON + std::string formatted; + auto error = extract_from<FieldNames...>(obj, initial_capacity).get(formatted); + if (error) { + return error; + } + + // Step 2: Reformat with FracturedJson + return fractured_json_string(formatted, opts); +} + +} // namespace builder +} // namespace lasx + +// Global namespace convenience functions + +/** + * Serialize an object to a FracturedJson-formatted string. + * Global namespace version for convenience. + */ +template <class T> +simdjson_warn_unused simdjson_result<std::string> to_fractured_json_string( + const T& obj, + const fractured_json_options& opts = {}, + size_t initial_capacity = lasx::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + return lasx::builder::to_fractured_json_string(obj, opts, initial_capacity); +} +/** + * Extract specific fields from an object and format with FracturedJson. + * Global namespace version for convenience. + */ +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result<std::string> extract_fractured_json( + const T& obj, + const fractured_json_options& opts = {}, + size_t initial_capacity = lasx::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + return lasx::builder::extract_fractured_json<FieldNames...>(obj, opts, initial_capacity); +} + +} // namespace simdjson + +#endif // SIMDJSON_STATIC_REFLECTION + +#endif // SIMDJSON_GENERIC_FRACTURED_JSON_BUILDER_H +/* end file simdjson/generic/builder/fractured_json_builder.h for lasx */ + + + +// JSON builder inline definitions +/* including simdjson/generic/builder/json_string_builder-inl.h for lasx: #include "simdjson/generic/builder/json_string_builder-inl.h" */ +/* begin file simdjson/generic/builder/json_string_builder-inl.h for lasx */ +#include <array> +#include <cstring> +#include <type_traits> +#ifndef SIMDJSON_GENERIC_STRING_BUILDER_INL_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_INL_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_string_builder.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +/* + * Empirically, we have found that an inlined optimization is important for + * performance. The following macros are not ideal. We should find a better + * way to inline the code. + */ + +#if defined(__SSE2__) || defined(__x86_64__) || defined(__x86_64) || \ + (defined(_M_AMD64) || defined(_M_X64) || \ + (defined(_M_IX86_FP) && _M_IX86_FP == 2)) +#ifndef SIMDJSON_EXPERIMENTAL_HAS_SSE2 +#define SIMDJSON_EXPERIMENTAL_HAS_SSE2 1 +#endif +#endif + +#if defined(__aarch64__) || defined(_M_ARM64) +#ifndef SIMDJSON_EXPERIMENTAL_HAS_NEON +#define SIMDJSON_EXPERIMENTAL_HAS_NEON 1 +#endif +#endif +#if defined(__loongarch_sx) +#ifndef SIMDJSON_EXPERIMENTAL_HAS_LSX +#define SIMDJSON_EXPERIMENTAL_HAS_LSX 1 +#endif +#endif +#if defined(__riscv_v_intrinsic) && __riscv_v_intrinsic >= 11000 && \ + defined(__riscv_vector) +#ifndef SIMDJSON_EXPERIMENTAL_HAS_RVV +#define SIMDJSON_EXPERIMENTAL_HAS_RVV 1 +#endif +#endif +#if (defined(__PPC64__) || defined(_M_PPC64)) && defined(__ALTIVEC__) +#ifndef SIMDJSON_EXPERIMENTAL_HAS_PPC64 +#define SIMDJSON_EXPERIMENTAL_HAS_PPC64 1 +#endif +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_NEON +#include <arm_neon.h> +#ifdef _MSC_VER +#include <intrin.h> +#endif +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_SSE2 +#include <emmintrin.h> +#ifdef _MSC_VER +#include <intrin.h> +#endif +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_LSX +#include <lsxintrin.h> +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_RVV +#include <riscv_vector.h> +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_PPC64 +#include <altivec.h> +#ifdef bool +#undef bool +#endif +#ifdef vector +#undef vector +#endif +#endif + + +namespace simdjson { +namespace lasx { +namespace builder { + +static SIMDJSON_CONSTEXPR_LAMBDA std::array<uint8_t, 256> + json_quotable_character = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + +/** + +A possible SWAR implementation of has_json_escapable_byte. It is not used +because it is slower than the current implementation. It is kept here for +reference (to show that we tried it). + +inline bool has_json_escapable_byte(uint64_t x) { + uint64_t is_ascii = 0x8080808080808080ULL & ~x; + uint64_t xor2 = x ^ 0x0202020202020202ULL; + uint64_t lt32_or_eq34 = xor2 - 0x2121212121212121ULL; + uint64_t sub92 = x ^ 0x5C5C5C5C5C5C5C5CULL; + uint64_t eq92 = (sub92 - 0x0101010101010101ULL); + return ((lt32_or_eq34 | eq92) & is_ascii) != 0; +} + +**/ + +SIMDJSON_CONSTEXPR_LAMBDA simdjson_inline bool +simple_needs_escaping(std::string_view v) { + for (char c : v) { + // a table lookup is faster than a series of comparisons + if (json_quotable_character[static_cast<uint8_t>(c)]) { + return true; + } + } + return false; +} + +#if SIMDJSON_EXPERIMENTAL_HAS_NEON +simdjson_inline bool fast_needs_escaping(std::string_view view) { + if (view.size() < 16) { + return simple_needs_escaping(view); + } + size_t i = 0; + uint8x16_t running = vdupq_n_u8(0); + uint8x16_t v34 = vdupq_n_u8(34); + uint8x16_t v92 = vdupq_n_u8(92); + + for (; i + 15 < view.size(); i += 16) { + uint8x16_t word = vld1q_u8((const uint8_t *)view.data() + i); + running = vorrq_u8(running, vceqq_u8(word, v34)); + running = vorrq_u8(running, vceqq_u8(word, v92)); + running = vorrq_u8(running, vcltq_u8(word, vdupq_n_u8(32))); + } + if (i < view.size()) { + uint8x16_t word = + vld1q_u8((const uint8_t *)view.data() + view.length() - 16); + running = vorrq_u8(running, vceqq_u8(word, v34)); + running = vorrq_u8(running, vceqq_u8(word, v92)); + running = vorrq_u8(running, vcltq_u8(word, vdupq_n_u8(32))); + } + return vmaxvq_u32(vreinterpretq_u32_u8(running)) != 0; +} +#elif SIMDJSON_EXPERIMENTAL_HAS_SSE2 +simdjson_inline bool fast_needs_escaping(std::string_view view) { + if (view.size() < 16) { + return simple_needs_escaping(view); + } + size_t i = 0; + __m128i running = _mm_setzero_si128(); + for (; i + 15 < view.size(); i += 16) { + + __m128i word = + _mm_loadu_si128(reinterpret_cast<const __m128i *>(view.data() + i)); + running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(34))); + running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(92))); + running = _mm_or_si128( + running, _mm_cmpeq_epi8(_mm_subs_epu8(word, _mm_set1_epi8(31)), + _mm_setzero_si128())); + } + if (i < view.size()) { + __m128i word = _mm_loadu_si128( + reinterpret_cast<const __m128i *>(view.data() + view.length() - 16)); + running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(34))); + running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(92))); + running = _mm_or_si128( + running, _mm_cmpeq_epi8(_mm_subs_epu8(word, _mm_set1_epi8(31)), + _mm_setzero_si128())); + } + return _mm_movemask_epi8(running) != 0; +} +#elif SIMDJSON_EXPERIMENTAL_HAS_PPC64 +simdjson_inline bool fast_needs_escaping(std::string_view view) { + if (view.size() < 16) { + return simple_needs_escaping(view); + } + size_t i = 0; + __vector unsigned char running = vec_splats((unsigned char)0); + __vector unsigned char v34 = vec_splats((unsigned char)34); + __vector unsigned char v92 = vec_splats((unsigned char)92); + __vector unsigned char v32 = vec_splats((unsigned char)32); + + for (; i + 15 < view.size(); i += 16) { + __vector unsigned char word = + vec_vsx_ld(0, reinterpret_cast<const unsigned char *>(view.data() + i)); + running = vec_or(running, (__vector unsigned char)vec_cmpeq(word, v34)); + running = vec_or(running, (__vector unsigned char)vec_cmpeq(word, v92)); + running = vec_or(running, + (__vector unsigned char)vec_cmplt(word, v32)); + } + if (i < view.size()) { + __vector unsigned char word = vec_vsx_ld( + 0, reinterpret_cast<const unsigned char *>(view.data() + view.length() - 16)); + running = vec_or(running, (__vector unsigned char)vec_cmpeq(word, v34)); + running = vec_or(running, (__vector unsigned char)vec_cmpeq(word, v92)); + running = vec_or(running, + (__vector unsigned char)vec_cmplt(word, v32)); + } + return !vec_all_eq(running, vec_splats((unsigned char)0)); +} +#else +simdjson_inline bool fast_needs_escaping(std::string_view view) { + return simple_needs_escaping(view); +} +#endif + +// Scalar fallback for finding next quotable character +SIMDJSON_CONSTEXPR_LAMBDA simdjson_inline size_t +find_next_json_quotable_character_scalar(const std::string_view view, + size_t location) noexcept { + for (auto pos = view.begin() + location; pos != view.end(); ++pos) { + if (json_quotable_character[static_cast<uint8_t>(*pos)]) { + return pos - view.begin(); + } + } + return size_t(view.size()); +} + +// SIMD-accelerated position finding that directly locates the first quotable +// character, combining detection and position extraction in a single pass to +// minimize redundant work. +#if SIMDJSON_EXPERIMENTAL_HAS_NEON +simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + const size_t len = view.size(); + const uint8_t *ptr = + reinterpret_cast<const uint8_t *>(view.data()) + location; + size_t remaining = len - location; + + // SIMD constants for characters requiring escape + uint8x16_t v34 = vdupq_n_u8(34); // '"' + uint8x16_t v92 = vdupq_n_u8(92); // '\\' + uint8x16_t v32 = vdupq_n_u8(32); // control char threshold + + while (remaining >= 16) { + uint8x16_t word = vld1q_u8(ptr); + + // Check for quotable characters: '"', '\\', or control chars (< 32) + uint8x16_t needs_escape = vceqq_u8(word, v34); + needs_escape = vorrq_u8(needs_escape, vceqq_u8(word, v92)); + needs_escape = vorrq_u8(needs_escape, vcltq_u8(word, v32)); + + const uint8x8_t res = vshrn_n_u16(vreinterpretq_u16_u8(needs_escape), 4); + const uint64_t mask = vget_lane_u64(vreinterpret_u64_u8(res), 0); + if(mask != 0) { + size_t offset = ptr - reinterpret_cast<const uint8_t *>(view.data()); + auto trailing_zero = trailing_zeroes(mask); + return offset + (trailing_zero >> 2); + } + ptr += 16; + remaining -= 16; + } + + // Scalar fallback for remaining bytes + size_t current = len - remaining; + return find_next_json_quotable_character_scalar(view, current); +} +#elif SIMDJSON_EXPERIMENTAL_HAS_SSE2 +simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + const size_t len = view.size(); + const uint8_t *ptr = + reinterpret_cast<const uint8_t *>(view.data()) + location; + size_t remaining = len - location; + + // SIMD constants + __m128i v34 = _mm_set1_epi8(34); // '"' + __m128i v92 = _mm_set1_epi8(92); // '\\' + __m128i v31 = _mm_set1_epi8(31); // for control char detection + + while (remaining >= 16) { + __m128i word = _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr)); + + // Check for quotable characters + __m128i needs_escape = _mm_cmpeq_epi8(word, v34); + needs_escape = _mm_or_si128(needs_escape, _mm_cmpeq_epi8(word, v92)); + needs_escape = _mm_or_si128( + needs_escape, + _mm_cmpeq_epi8(_mm_subs_epu8(word, v31), _mm_setzero_si128())); + + int mask = _mm_movemask_epi8(needs_escape); + if (mask != 0) { + // Found quotable character - use trailing zero count to find position + size_t offset = ptr - reinterpret_cast<const uint8_t *>(view.data()); + return offset + trailing_zeroes(mask); + } + ptr += 16; + remaining -= 16; + } + + // Scalar fallback for remaining bytes + size_t current = len - remaining; + return find_next_json_quotable_character_scalar(view, current); +} +#elif SIMDJSON_EXPERIMENTAL_HAS_LSX +simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + const size_t len = view.size(); + const uint8_t *ptr = + reinterpret_cast<const uint8_t *>(view.data()) + location; + size_t remaining = len - location; + + //SIMD constants for characters requiring escape + __m128i v34 = __lsx_vreplgr2vr_b(34); // '"' + __m128i v92 = __lsx_vreplgr2vr_b(92); // '\\' + __m128i v32 = __lsx_vreplgr2vr_b(32); // control char threshold + + while (remaining >= 16){ + __m128i word = __lsx_vld(ptr, 0); + + //Check for the quotable characters: '"', '\\', or control char (<32) + __m128i needs_escape = __lsx_vseq_b(word, v34); + needs_escape = __lsx_vor_v(needs_escape, __lsx_vseq_b(word, v92)); + needs_escape = __lsx_vor_v(needs_escape, __lsx_vslt_bu(word, v32)); + + if (!__lsx_bz_v(needs_escape)){ + + //Found quotable character - extract exact byte position + uint64_t lo = __lsx_vpickve2gr_du(needs_escape,0); + uint64_t hi = __lsx_vpickve2gr_du(needs_escape,1); + size_t offset = ptr - reinterpret_cast<const uint8_t *>(view.data()); + if ( lo != 0) { + return offset + trailing_zeroes(lo) / 8; + } else { + return offset + 8 + trailing_zeroes(hi) / 8; + } + } + ptr += 16; + remaining -= 16; + } + size_t current = len - remaining; + return find_next_json_quotable_character_scalar(view, current); +} +#elif SIMDJSON_EXPERIMENTAL_HAS_RVV +simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + const size_t len = view.size(); + const uint8_t *ptr = + reinterpret_cast<const uint8_t *>(view.data()) + location; + size_t remaining = len - location; + + while (remaining > 0) { + size_t vl = __riscv_vsetvl_e8m1(remaining); + vuint8m1_t word = __riscv_vle8_v_u8m1(ptr, vl); + + // Check for quotable characters: '"', '\\', or control chars (< 32) + vbool8_t needs_escape = __riscv_vmseq(word, (uint8_t)34, vl); + needs_escape = __riscv_vmor(needs_escape, + __riscv_vmseq(word, (uint8_t)92, vl), vl); + needs_escape = __riscv_vmor(needs_escape, + __riscv_vmsltu(word, (uint8_t)32, vl), vl); + + long first = __riscv_vfirst(needs_escape, vl); + if (first >= 0) { + size_t offset = ptr - reinterpret_cast<const uint8_t *>(view.data()); + return offset + first; + } + ptr += vl; + remaining -= vl; + } + + return len; +} +#elif SIMDJSON_EXPERIMENTAL_HAS_PPC64 +simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + const size_t len = view.size(); + const uint8_t *ptr = + reinterpret_cast<const uint8_t *>(view.data()) + location; + size_t remaining = len - location; + + // SIMD constants for characters requiring escape + __vector unsigned char v34 = vec_splats((unsigned char)34); // '"' + __vector unsigned char v92 = vec_splats((unsigned char)92); // '\\' + __vector unsigned char v32 = vec_splats((unsigned char)32); // control char threshold + + // Bitmask for vec_vbpermq to extract one bit per byte + const __vector unsigned char perm_mask = {0x78, 0x70, 0x68, 0x60, 0x58, 0x50, + 0x48, 0x40, 0x38, 0x30, 0x28, 0x20, + 0x18, 0x10, 0x08, 0x00}; + + while (remaining >= 16) { + __vector unsigned char word = + vec_vsx_ld(0, reinterpret_cast<const unsigned char *>(ptr)); + + // Check for quotable characters: '"', '\\', or control chars (< 32) + __vector unsigned char needs_escape = + (__vector unsigned char)vec_cmpeq(word, v34); + needs_escape = vec_or(needs_escape, + (__vector unsigned char)vec_cmpeq(word, v92)); + needs_escape = vec_or(needs_escape, + (__vector unsigned char)vec_cmplt(word, v32)); + + __vector unsigned long long result = + (__vector unsigned long long)vec_vbpermq(needs_escape, perm_mask); +#ifdef __LITTLE_ENDIAN__ + unsigned int mask = static_cast<unsigned int>(result[1]); +#else + unsigned int mask = static_cast<unsigned int>(result[0]); +#endif + if (mask != 0) { + size_t offset = ptr - reinterpret_cast<const uint8_t *>(view.data()); + return offset + __builtin_ctz(mask); + } + ptr += 16; + remaining -= 16; + } + + // Scalar fallback for remaining bytes + size_t current = len - remaining; + return find_next_json_quotable_character_scalar(view, current); +} +#else +SIMDJSON_CONSTEXPR_LAMBDA simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + return find_next_json_quotable_character_scalar(view, location); +} +#endif + +SIMDJSON_CONSTEXPR_LAMBDA static std::string_view control_chars[] = { + "\\u0000", "\\u0001", "\\u0002", "\\u0003", "\\u0004", "\\u0005", "\\u0006", + "\\u0007", "\\b", "\\t", "\\n", "\\u000b", "\\f", "\\r", + "\\u000e", "\\u000f", "\\u0010", "\\u0011", "\\u0012", "\\u0013", "\\u0014", + "\\u0015", "\\u0016", "\\u0017", "\\u0018", "\\u0019", "\\u001a", "\\u001b", + "\\u001c", "\\u001d", "\\u001e", "\\u001f"}; + +// All Unicode characters may be placed within the quotation marks, except for +// the characters that MUST be escaped: quotation mark, reverse solidus, and the +// control characters (U+0000 through U+001F). There are two-character sequence +// escape representations of some popular characters: +// \", \\, \b, \f, \n, \r, \t. +SIMDJSON_CONSTEXPR_LAMBDA simdjson_inline void escape_json_char(char c, char *&out) { + if (c == '"') { + memcpy(out, "\\\"", 2); + out += 2; + } else if (c == '\\') { + memcpy(out, "\\\\", 2); + out += 2; + } else { + std::string_view v = control_chars[uint8_t(c)]; + memcpy(out, v.data(), v.size()); + out += v.size(); + } +} + +// Writes the escaped version of input to out, returning the number of bytes +// written. Uses SIMD position finding to locate quotable characters efficiently. +inline size_t write_string_escaped(const std::string_view input, char *out) { + size_t mysize = input.size(); + + // Use SIMD position finder directly - it returns mysize if no escape needed + size_t location = find_next_json_quotable_character(input, 0); + if (location == mysize) { + // Fast path: no escaping needed + memcpy(out, input.data(), input.size()); + return input.size(); + } + + const char *const initout = out; + memcpy(out, input.data(), location); + out += location; + escape_json_char(input[location], out); + location += 1; + while (location < mysize) { + size_t newlocation = find_next_json_quotable_character(input, location); + memcpy(out, input.data() + location, newlocation - location); + out += newlocation - location; + location = newlocation; + if (location == mysize) { + break; + } + escape_json_char(input[location], out); + location += 1; + } + return out - initout; +} + +simdjson_inline string_builder::string_builder(size_t initial_capacity) + : buffer(new(std::nothrow) char[initial_capacity]), position(0), + capacity(buffer.get() != nullptr ? initial_capacity : 0), + is_valid(buffer.get() != nullptr) {} + +simdjson_inline bool string_builder::capacity_check(size_t upcoming_bytes) { + // We use the convention that when is_valid is false, then the capacity and + // the position are 0. + // Most of the time, this function will return true. + if (simdjson_likely(upcoming_bytes <= capacity - position)) { + return true; + } + // check for overflow, most of the time there is no overflow + if (simdjson_unlikely(position + upcoming_bytes < position)) { + return false; + } + // We will rarely get here. + grow_buffer((std::max)(capacity * 2, position + upcoming_bytes)); + // If the buffer allocation failed, we set is_valid to false. + return is_valid; +} + +simdjson_inline void string_builder::grow_buffer(size_t desired_capacity) { + if (!is_valid) { + return; + } + std::unique_ptr<char[]> new_buffer(new (std::nothrow) char[desired_capacity]); + if (new_buffer.get() == nullptr) { + set_valid(false); + return; + } + std::memcpy(new_buffer.get(), buffer.get(), position); + buffer.swap(new_buffer); + capacity = desired_capacity; +} + +simdjson_inline void string_builder::set_valid(bool valid) noexcept { + if (!valid) { + is_valid = false; + capacity = 0; + position = 0; + buffer.reset(); + } else { + is_valid = true; + } +} + +simdjson_inline size_t string_builder::size() const noexcept { + return position; +} + +simdjson_inline void string_builder::append(char c) noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = c; + } +} + +simdjson_inline void string_builder::append_null() noexcept { + constexpr char null_literal[] = "null"; + constexpr size_t null_len = sizeof(null_literal) - 1; + if (capacity_check(null_len)) { + std::memcpy(buffer.get() + position, null_literal, null_len); + position += null_len; + } +} + +simdjson_inline void string_builder::clear() noexcept { + position = 0; + // if it was invalid, we should try to repair it + if (!is_valid) { + capacity = 0; + buffer.reset(); + is_valid = true; + } +} + +namespace internal { + +template <typename number_type, typename = typename std::enable_if< + std::is_unsigned<number_type>::value>::type> +simdjson_really_inline int int_log2(number_type x) { + return 63 - leading_zeroes(uint64_t(x) | 1); +} + +simdjson_really_inline int fast_digit_count_32(uint32_t x) { + static uint64_t table[] = { + 4294967296, 8589934582, 8589934582, 8589934582, 12884901788, + 12884901788, 12884901788, 17179868184, 17179868184, 17179868184, + 21474826480, 21474826480, 21474826480, 21474826480, 25769703776, + 25769703776, 25769703776, 30063771072, 30063771072, 30063771072, + 34349738368, 34349738368, 34349738368, 34349738368, 38554705664, + 38554705664, 38554705664, 41949672960, 41949672960, 41949672960, + 42949672960, 42949672960}; + return uint32_t((x + table[int_log2(x)]) >> 32); +} + +simdjson_really_inline int fast_digit_count_64(uint64_t x) { + static uint64_t table[] = {9, + 99, + 999, + 9999, + 99999, + 999999, + 9999999, + 99999999, + 999999999, + 9999999999, + 99999999999, + 999999999999, + 9999999999999, + 99999999999999, + 999999999999999ULL, + 9999999999999999ULL, + 99999999999999999ULL, + 999999999999999999ULL, + 9999999999999999999ULL}; + int y = (19 * int_log2(x) >> 6); + y += x > table[y]; + return y + 1; +} + +template <typename number_type, typename = typename std::enable_if< + std::is_unsigned<number_type>::value>::type> +simdjson_really_inline size_t digit_count(number_type v) noexcept { + static_assert(sizeof(number_type) == 8 || sizeof(number_type) == 4 || + sizeof(number_type) == 2 || sizeof(number_type) == 1, + "We only support 8-bit, 16-bit, 32-bit and 64-bit numbers"); + SIMDJSON_IF_CONSTEXPR(sizeof(number_type) <= 4) { + return fast_digit_count_32(static_cast<uint32_t>(v)); + } + else { + return fast_digit_count_64(static_cast<uint64_t>(v)); + } +} +static const char decimal_table[200] = { + 0x30, 0x30, 0x30, 0x31, 0x30, 0x32, 0x30, 0x33, 0x30, 0x34, 0x30, 0x35, + 0x30, 0x36, 0x30, 0x37, 0x30, 0x38, 0x30, 0x39, 0x31, 0x30, 0x31, 0x31, + 0x31, 0x32, 0x31, 0x33, 0x31, 0x34, 0x31, 0x35, 0x31, 0x36, 0x31, 0x37, + 0x31, 0x38, 0x31, 0x39, 0x32, 0x30, 0x32, 0x31, 0x32, 0x32, 0x32, 0x33, + 0x32, 0x34, 0x32, 0x35, 0x32, 0x36, 0x32, 0x37, 0x32, 0x38, 0x32, 0x39, + 0x33, 0x30, 0x33, 0x31, 0x33, 0x32, 0x33, 0x33, 0x33, 0x34, 0x33, 0x35, + 0x33, 0x36, 0x33, 0x37, 0x33, 0x38, 0x33, 0x39, 0x34, 0x30, 0x34, 0x31, + 0x34, 0x32, 0x34, 0x33, 0x34, 0x34, 0x34, 0x35, 0x34, 0x36, 0x34, 0x37, + 0x34, 0x38, 0x34, 0x39, 0x35, 0x30, 0x35, 0x31, 0x35, 0x32, 0x35, 0x33, + 0x35, 0x34, 0x35, 0x35, 0x35, 0x36, 0x35, 0x37, 0x35, 0x38, 0x35, 0x39, + 0x36, 0x30, 0x36, 0x31, 0x36, 0x32, 0x36, 0x33, 0x36, 0x34, 0x36, 0x35, + 0x36, 0x36, 0x36, 0x37, 0x36, 0x38, 0x36, 0x39, 0x37, 0x30, 0x37, 0x31, + 0x37, 0x32, 0x37, 0x33, 0x37, 0x34, 0x37, 0x35, 0x37, 0x36, 0x37, 0x37, + 0x37, 0x38, 0x37, 0x39, 0x38, 0x30, 0x38, 0x31, 0x38, 0x32, 0x38, 0x33, + 0x38, 0x34, 0x38, 0x35, 0x38, 0x36, 0x38, 0x37, 0x38, 0x38, 0x38, 0x39, + 0x39, 0x30, 0x39, 0x31, 0x39, 0x32, 0x39, 0x33, 0x39, 0x34, 0x39, 0x35, + 0x39, 0x36, 0x39, 0x37, 0x39, 0x38, 0x39, 0x39, +}; +} // namespace internal + +template <typename number_type, typename> +simdjson_inline void string_builder::append(number_type v) noexcept { + static_assert(std::is_same<number_type, bool>::value || + std::is_integral<number_type>::value || + std::is_floating_point<number_type>::value, + "Unsupported number type"); + // If C++17 is available, we can 'if constexpr' here. + SIMDJSON_IF_CONSTEXPR(std::is_same<number_type, bool>::value) { + if (v) { + constexpr char true_literal[] = "true"; + constexpr size_t true_len = sizeof(true_literal) - 1; + if (capacity_check(true_len)) { + std::memcpy(buffer.get() + position, true_literal, true_len); + position += true_len; + } + } else { + constexpr char false_literal[] = "false"; + constexpr size_t false_len = sizeof(false_literal) - 1; + if (capacity_check(false_len)) { + std::memcpy(buffer.get() + position, false_literal, false_len); + position += false_len; + } + } + } + else SIMDJSON_IF_CONSTEXPR(std::is_unsigned<number_type>::value) { + // Process 4 digits at a time instead of 2, reducing store operations + // and divisions by approximately half for large numbers. + constexpr size_t max_number_size = 20; + if (capacity_check(max_number_size)) { + using unsigned_type = typename std::make_unsigned<number_type>::type; + unsigned_type pv = static_cast<unsigned_type>(v); + size_t dc = internal::digit_count(pv); + char *write_pointer = buffer.get() + position + dc - 1; + + // Process 4 digits per iteration for large numbers + while (pv >= 10000) { + unsigned_type q = pv / 10000; + unsigned_type r = pv % 10000; + unsigned_type r_hi = r / 100; // High 2 digits of remainder + unsigned_type r_lo = r % 100; // Low 2 digits of remainder + // Write low 2 digits first (rightmost), then high 2 digits + memcpy(write_pointer - 1, &internal::decimal_table[r_lo * 2], 2); + memcpy(write_pointer - 3, &internal::decimal_table[r_hi * 2], 2); + write_pointer -= 4; + pv = q; + } + + // Handle remaining 1-4 digits with original 2-digit loop + while (pv >= 100) { + memcpy(write_pointer - 1, &internal::decimal_table[(pv % 100) * 2], 2); + write_pointer -= 2; + pv /= 100; + } + if (pv >= 10) { + *write_pointer-- = char('0' + (pv % 10)); + pv /= 10; + } + *write_pointer = char('0' + pv); + position += dc; + } + } + else SIMDJSON_IF_CONSTEXPR(std::is_integral<number_type>::value) { + // Same 4-digit batching as unsigned path for signed integers + constexpr size_t max_number_size = 20; + if (capacity_check(max_number_size)) { + using unsigned_type = typename std::make_unsigned<number_type>::type; + bool negative = v < 0; + unsigned_type pv = static_cast<unsigned_type>(v); + if (negative) { + pv = 0 - pv; // the 0 is for Microsoft + } + size_t dc = internal::digit_count(pv); + // by always writing the minus sign, we avoid the branch. + buffer.get()[position] = '-'; + position += negative ? 1 : 0; + char *write_pointer = buffer.get() + position + dc - 1; + + // Process 4 digits per iteration for large numbers + while (pv >= 10000) { + unsigned_type q = pv / 10000; + unsigned_type r = pv % 10000; + unsigned_type r_hi = r / 100; + unsigned_type r_lo = r % 100; + memcpy(write_pointer - 1, &internal::decimal_table[r_lo * 2], 2); + memcpy(write_pointer - 3, &internal::decimal_table[r_hi * 2], 2); + write_pointer -= 4; + pv = q; + } + + // Handle remaining 1-4 digits + while (pv >= 100) { + memcpy(write_pointer - 1, &internal::decimal_table[(pv % 100) * 2], 2); + write_pointer -= 2; + pv /= 100; + } + if (pv >= 10) { + *write_pointer-- = char('0' + (pv % 10)); + pv /= 10; + } + *write_pointer = char('0' + pv); + position += dc; + } + } + else SIMDJSON_IF_CONSTEXPR(std::is_floating_point<number_type>::value) { + constexpr size_t max_number_size = 24; + if (capacity_check(max_number_size)) { + // We could specialize for float. + char *end = simdjson::internal::to_chars(buffer.get() + position, nullptr, + double(v)); + position = end - buffer.get(); + } + } +} + +simdjson_inline void +string_builder::escape_and_append(std::string_view input) noexcept { + // escaping might turn a control character into \x00xx so 6 characters. + if (capacity_check(6 * input.size())) { + position += write_string_escaped(input, buffer.get() + position); + } +} + +simdjson_inline void +string_builder::escape_and_append_with_quotes(std::string_view input) noexcept { + // escaping might turn a control character into \x00xx so 6 characters. + if (capacity_check(2 + 6 * input.size())) { + buffer.get()[position++] = '"'; + position += write_string_escaped(input, buffer.get() + position); + buffer.get()[position++] = '"'; + } +} + +simdjson_inline void +string_builder::escape_and_append_with_quotes(char input) noexcept { + // escaping might turn a control character into \x00xx so 6 characters. + if (capacity_check(2 + 6 * 1)) { + buffer.get()[position++] = '"'; + std::string_view cinput(&input, 1); + position += write_string_escaped(cinput, buffer.get() + position); + buffer.get()[position++] = '"'; + } +} + +simdjson_inline void +string_builder::escape_and_append_with_quotes(const char *input) noexcept { + std::string_view cinput(input); + escape_and_append_with_quotes(cinput); +} +#if SIMDJSON_SUPPORTS_CONCEPTS +template <constevalutil::fixed_string key> +simdjson_inline void string_builder::escape_and_append_with_quotes() noexcept { + escape_and_append_with_quotes(constevalutil::string_constant<key>::value); +} +#endif + +simdjson_inline void string_builder::append_raw(const char *c) noexcept { + size_t len = std::strlen(c); + append_raw(c, len); +} + +simdjson_inline void +string_builder::append_raw(std::string_view input) noexcept { + if (capacity_check(input.size())) { + std::memcpy(buffer.get() + position, input.data(), input.size()); + position += input.size(); + } +} + +simdjson_inline void string_builder::append_raw(const char *str, + size_t len) noexcept { + if (capacity_check(len)) { + std::memcpy(buffer.get() + position, str, len); + position += len; + } +} +#if SIMDJSON_SUPPORTS_CONCEPTS +// Support for optional types (std::optional, etc.) +template <concepts::optional_type T> + requires(!require_custom_serialization<T>) +simdjson_inline void string_builder::append(const T &opt) { + if (opt) { + append(*opt); + } else { + append_null(); + } +} + +template <typename T> + requires(require_custom_serialization<T>) +simdjson_inline void string_builder::append(T &&val) { + serialize(*this, std::forward<T>(val)); +} + +template <typename T> + requires(std::is_convertible<T, std::string_view>::value || + std::is_same<T, const char *>::value) +simdjson_inline void string_builder::append(const T &value) { + escape_and_append_with_quotes(value); +} +#endif + +#if SIMDJSON_SUPPORTS_RANGES && SIMDJSON_SUPPORTS_CONCEPTS +// Support for range-based appending (std::ranges::view, etc.) +template <std::ranges::range R> + requires(!std::is_convertible<R, std::string_view>::value && !require_custom_serialization<R>) +simdjson_inline void string_builder::append(const R &range) noexcept { + auto it = std::ranges::begin(range); + auto end = std::ranges::end(range); + if constexpr (concepts::is_pair<std::ranges::range_value_t<R>>) { + start_object(); + + if (it == end) { + end_object(); + return; // Handle empty range + } + // Append first item without leading comma + append_key_value(it->first, it->second); + ++it; + + // Append remaining items with preceding commas + for (; it != end; ++it) { + append_comma(); + append_key_value(it->first, it->second); + } + end_object(); + } else { + start_array(); + if (it == end) { + end_array(); + return; // Handle empty range + } + + // Append first item without leading comma + append(*it); + ++it; + + // Append remaining items with preceding commas + for (; it != end; ++it) { + append_comma(); + append(*it); + } + end_array(); + } +} + +#endif + +#if SIMDJSON_EXCEPTIONS +simdjson_inline string_builder::operator std::string() const noexcept(false) { + return std::string(operator std::string_view()); +} + +simdjson_inline string_builder::operator std::string_view() const + noexcept(false) simdjson_lifetime_bound { + return view(); +} +#endif + +simdjson_inline simdjson_result<std::string_view> +string_builder::view() const noexcept { + if (!is_valid) { + return simdjson::OUT_OF_CAPACITY; + } + return std::string_view(buffer.get(), position); +} + +simdjson_inline simdjson_result<const char *> string_builder::c_str() noexcept { + if (capacity_check(1)) { + buffer.get()[position] = '\0'; + return buffer.get(); + } + return simdjson::OUT_OF_CAPACITY; +} + +simdjson_inline bool string_builder::validate_unicode() const noexcept { + return simdjson::validate_utf8(buffer.get(), position); +} + +simdjson_inline void string_builder::start_object() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '{'; + } +} + +simdjson_inline void string_builder::end_object() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '}'; + } +} + +simdjson_inline void string_builder::start_array() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '['; + } +} + +simdjson_inline void string_builder::end_array() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ']'; + } +} + +simdjson_inline void string_builder::append_comma() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ','; + } +} + +simdjson_inline void string_builder::append_colon() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ':'; + } +} + +template <typename key_type, typename value_type> +simdjson_inline void +string_builder::append_key_value(key_type key, value_type value) noexcept { + static_assert(std::is_same<key_type, const char *>::value || + std::is_convertible<key_type, std::string_view>::value, + "Unsupported key type"); + escape_and_append_with_quotes(key); + append_colon(); + SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, std::nullptr_t>::value) { + append_null(); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, char>::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR( + std::is_convertible<value_type, std::string_view>::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, const char *>::value) { + escape_and_append_with_quotes(value); + } + else { + append(value); + } +} + +#if SIMDJSON_SUPPORTS_CONCEPTS +template <constevalutil::fixed_string key, typename value_type> +simdjson_inline void +string_builder::append_key_value(value_type value) noexcept { + escape_and_append_with_quotes<key>(); + append_colon(); + SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, std::nullptr_t>::value) { + append_null(); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, char>::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR( + std::is_convertible<value_type, std::string_view>::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, const char *>::value) { + escape_and_append_with_quotes(value); + } + else { + append(value); + } +} +#endif + +} // namespace builder +} // namespace lasx +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_STRING_BUILDER_INL_H +/* end file simdjson/generic/builder/json_string_builder-inl.h for lasx */ + +/* end file simdjson/generic/builder/amalgamated.h for lasx */ +/* including simdjson/lasx/end.h: #include "simdjson/lasx/end.h" */ +/* begin file simdjson/lasx/end.h */ +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#undef SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT +/* undefining SIMDJSON_IMPLEMENTATION from "lasx" */ +#undef SIMDJSON_IMPLEMENTATION + + +#if SIMDJSON_CAN_ALWAYS_RUN_LASX +// nothing needed. +#else +SIMDJSON_UNTARGET_REGION +#endif +/* end file simdjson/lasx/end.h */ + +#endif // SIMDJSON_LASX_BUILDER_H +/* end file simdjson/lasx/builder.h */ +#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(rvv_vls) +/* including simdjson/rvv-vls/builder.h: #include "simdjson/rvv-vls/builder.h" */ +/* begin file simdjson/rvv-vls/builder.h */ +#ifndef SIMDJSON_RVV_VLS_BUILDER_H +#define SIMDJSON_RVV_VLS_BUILDER_H + +/* including simdjson/rvv-vls/begin.h: #include "simdjson/rvv-vls/begin.h" */ +/* begin file simdjson/rvv-vls/begin.h */ +/* defining SIMDJSON_IMPLEMENTATION to "rvv_vls" */ +#define SIMDJSON_IMPLEMENTATION rvv_vls +/* including simdjson/rvv-vls/base.h: #include "simdjson/rvv-vls/base.h" */ +/* begin file simdjson/rvv-vls/base.h */ +#ifndef SIMDJSON_RVV_VLS_BASE_H +#define SIMDJSON_RVV_VLS_BASE_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +/** + * RVV-VLS implementation. + */ +namespace rvv_vls { + +class implementation; + +} // namespace rvv_vls +} // namespace simdjson + +#endif // SIMDJSON_RVV_VLS_BASE_H +/* end file simdjson/rvv-vls/base.h */ +/* including simdjson/rvv-vls/intrinsics.h: #include "simdjson/rvv-vls/intrinsics.h" */ +/* begin file simdjson/rvv-vls/intrinsics.h */ +#ifndef SIMDJSON_RVV_VLS_INTRINSICS_H +#define SIMDJSON_RVV_VLS_INTRINSICS_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#include <riscv_vector.h> + +#define simdutf_vrgather_u8m1x2(tbl, idx) \ + __riscv_vcreate_v_u8m1_u8m2( \ + __riscv_vrgather_vv_u8m1(tbl, __riscv_vget_v_u8m2_u8m1(idx, 0), \ + __riscv_vsetvlmax_e8m1()), \ + __riscv_vrgather_vv_u8m1(tbl, __riscv_vget_v_u8m2_u8m1(idx, 1), \ + __riscv_vsetvlmax_e8m1())) + +#define simdutf_vrgather_u8m1x4(tbl, idx) \ + __riscv_vcreate_v_u8m1_u8m4( \ + __riscv_vrgather_vv_u8m1(tbl, __riscv_vget_v_u8m4_u8m1(idx, 0), \ + __riscv_vsetvlmax_e8m1()), \ + __riscv_vrgather_vv_u8m1(tbl, __riscv_vget_v_u8m4_u8m1(idx, 1), \ + __riscv_vsetvlmax_e8m1()), \ + __riscv_vrgather_vv_u8m1(tbl, __riscv_vget_v_u8m4_u8m1(idx, 2), \ + __riscv_vsetvlmax_e8m1()), \ + __riscv_vrgather_vv_u8m1(tbl, __riscv_vget_v_u8m4_u8m1(idx, 3), \ + __riscv_vsetvlmax_e8m1())) + +#if __riscv_zbc +#include <riscv_bitmanip.h> +#endif + +#endif // SIMDJSON_RVV_VLS_INTRINSICS_H +/* end file simdjson/rvv-vls/intrinsics.h */ +/* including simdjson/rvv-vls/bitmanipulation.h: #include "simdjson/rvv-vls/bitmanipulation.h" */ +/* begin file simdjson/rvv-vls/bitmanipulation.h */ +#ifndef SIMDJSON_RVV_VLS_BITMANIPULATION_H +#define SIMDJSON_RVV_VLS_BITMANIPULATION_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace rvv_vls { +namespace { + +// We sometimes call trailing_zero on inputs that are zero, +// but the algorithms do not end up using the returned value. +// Sadly, sanitizers are not smart enough to figure it out. +SIMDJSON_NO_SANITIZE_UNDEFINED +// This function can be used safely even if not all bytes have been +// initialized. +// See issue https://github.com/simdjson/simdjson/issues/1965 +SIMDJSON_NO_SANITIZE_MEMORY +simdjson_inline int trailing_zeroes(uint64_t input_num) { + return __builtin_ctzll(input_num); +} + +/* result might be undefined when input_num is zero */ +simdjson_inline uint64_t clear_lowest_bit(uint64_t input_num) { + return input_num & (input_num-1); +} + +/* result might be undefined when input_num is zero */ +simdjson_inline int leading_zeroes(uint64_t input_num) { + return __builtin_clzll(input_num); +} + +simdjson_inline long long int count_ones(uint64_t input_num) { + return __builtin_popcountll(input_num); +} + +simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2, + uint64_t *result) { + return __builtin_uaddll_overflow(value1, value2, + reinterpret_cast<unsigned long long *>(result)); +} + +} // unnamed namespace +} // namespace rvv_vls +} // namespace simdjson + +#endif // SIMDJSON_RVV_VLS_BITMANIPULATION_H +/* end file simdjson/rvv-vls/bitmanipulation.h */ +/* including simdjson/rvv-vls/bitmask.h: #include "simdjson/rvv-vls/bitmask.h" */ +/* begin file simdjson/rvv-vls/bitmask.h */ +#ifndef SIMDJSON_RVV_VLS_BITMASK_H +#define SIMDJSON_RVV_VLS_BITMASK_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/intrinsics.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace rvv_vls { +namespace { + +// +// Perform a "cumulative bitwise xor," flipping bits each time a 1 is encountered. +// +// For example, prefix_xor(00100100) == 00011100 +// +simdjson_inline uint64_t prefix_xor(uint64_t bitmask) { +#if __riscv_zbc + return __riscv_clmul_64(bitmask, ~(uint64_t)0); +#elif __riscv_zvbc + return __riscv_vmv_x(__riscv_vclmul(__riscv_vmv_s_x_u64m1(bitmask, 1), ~(uint64_t)0, 1)); +#else + bitmask ^= bitmask << 1; + bitmask ^= bitmask << 2; + bitmask ^= bitmask << 4; + bitmask ^= bitmask << 8; + bitmask ^= bitmask << 16; + bitmask ^= bitmask << 32; +#endif + return bitmask; +} + +} // unnamed namespace +} // namespace rvv_vls +} // namespace simdjson + +#endif // SIMDJSON_RVV_VLS_BITMASK_H + +/* end file simdjson/rvv-vls/bitmask.h */ +/* including simdjson/rvv-vls/simd.h: #include "simdjson/rvv-vls/simd.h" */ +/* begin file simdjson/rvv-vls/simd.h */ +#ifndef SIMDJSON_RVV_VLS_SIMD_H +#define SIMDJSON_RVV_VLS_SIMD_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace rvv_vls { +namespace { +namespace simd { + +#if __riscv_v_fixed_vlen >= 512 + static constexpr size_t VL8 = 512/8; + using vint8_t = vint8m1_t __attribute__((riscv_rvv_vector_bits(512))); + using vuint8_t = vuint8m1_t __attribute__((riscv_rvv_vector_bits(512))); + using vbool_t = vbool8_t __attribute__((riscv_rvv_vector_bits(512/8))); + using vbitmask_t = uint64_t; +#else + static constexpr size_t VL8 = __riscv_v_fixed_vlen/8; + using vint8_t = vint8m1_t __attribute__((riscv_rvv_vector_bits(__riscv_v_fixed_vlen))); + using vuint8_t = vuint8m1_t __attribute__((riscv_rvv_vector_bits(__riscv_v_fixed_vlen))); + using vbool_t = vbool8_t __attribute__((riscv_rvv_vector_bits(__riscv_v_fixed_vlen/8))); + #if __riscv_v_fixed_vlen == 128 + using vbitmask_t = uint16_t; + #elif __riscv_v_fixed_vlen == 256 + using vbitmask_t = uint32_t; + #endif +#endif + +#if __riscv_v_fixed_vlen == 128 + using vuint8x64_t = vuint8m4_t __attribute__((riscv_rvv_vector_bits(512))); + using vboolx64_t = vbool2_t __attribute__((riscv_rvv_vector_bits(512/8))); +#elif __riscv_v_fixed_vlen == 256 + using vuint8x64_t = vuint8m2_t __attribute__((riscv_rvv_vector_bits(512))); + using vboolx64_t = vbool4_t __attribute__((riscv_rvv_vector_bits(512/8))); +#else + using vuint8x64_t = vuint8m1_t __attribute__((riscv_rvv_vector_bits(512))); + using vboolx64_t = vbool8_t __attribute__((riscv_rvv_vector_bits(512/8))); +#endif + + template<typename T> + struct simd8; + + // SIMD byte mask type (returned by things like eq and gt) + template<> + struct simd8<bool> { + vbool_t value; + using bitmask_t = vbitmask_t; + static constexpr int SIZE = sizeof(value); + + simdjson_inline simd8(const vbool_t _value) : value(_value) {} + simdjson_inline simd8() : simd8(__riscv_vmclr_m_b8(VL8)) {} + simdjson_inline simd8(bool _value) : simd8(splat(_value)) {} + + simdjson_inline operator const vbool_t&() const { return value; } + simdjson_inline operator vbool_t&() { return value; } + + static simdjson_inline simd8<bool> splat(bool _value) { + return __riscv_vreinterpret_b8(__riscv_vmv_v_x_u64m1(((uint64_t)!_value)-1, 1)); + } + + simdjson_inline vbitmask_t to_bitmask() const { +#if __riscv_v_fixed_vlen == 128 + return __riscv_vmv_x(__riscv_vreinterpret_u16m1(value)); +#elif __riscv_v_fixed_vlen == 256 + return __riscv_vmv_x(__riscv_vreinterpret_u32m1(value)); +#else + return __riscv_vmv_x(__riscv_vreinterpret_u64m1(value)); +#endif + } + + // Bit operations + simdjson_inline simd8<bool> operator|(const simd8<bool> other) const { return __riscv_vmor(*this, other, VL8); } + simdjson_inline simd8<bool> operator&(const simd8<bool> other) const { return __riscv_vmand(*this, other, VL8); } + simdjson_inline simd8<bool> operator^(const simd8<bool> other) const { return __riscv_vmxor(*this, other, VL8); } + simdjson_inline simd8<bool> bit_andnot(const simd8<bool> other) const { return __riscv_vmandn(other, *this, VL8); } + simdjson_inline simd8<bool> operator~() const { return __riscv_vmnot(*this, VL8); } + simdjson_inline simd8<bool>& operator|=(const simd8<bool> other) { auto this_cast = static_cast<simd8<bool>*>(this); *this_cast = *this_cast | other; return *this_cast; } + simdjson_inline simd8<bool>& operator&=(const simd8<bool> other) { auto this_cast = static_cast<simd8<bool>*>(this); *this_cast = *this_cast & other; return *this_cast; } + simdjson_inline simd8<bool>& operator^=(const simd8<bool> other) { auto this_cast = static_cast<simd8<bool>*>(this); *this_cast = *this_cast ^ other; return *this_cast; } + }; + + // Unsigned bytes + template<> + struct simd8<uint8_t> { + + vuint8_t value; + static constexpr int SIZE = sizeof(value); + + simdjson_inline simd8(const vuint8_t _value) : value(_value) {} + simdjson_inline simd8() : simd8(zero()) {} + simdjson_inline simd8(const uint8_t values[VL8]) : simd8(load(values)) {} + simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {} + simdjson_inline simd8(simd8<bool> mask) : value(__riscv_vmerge_vxm_u8m1(zero(), -1, (vbool_t)mask, VL8)) {} + + simdjson_inline operator const vuint8_t&() const { return this->value; } + simdjson_inline operator vuint8_t&() { return this->value; } + + simdjson_inline simd8( + uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, + uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 + ) : simd8(vuint8_t{ + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + }) {} + + // Repeat 16 values as many times as necessary (usually for lookup tables) + simdjson_inline static simd8<uint8_t> repeat_16( + uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, + uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 + ) { + return simd8<uint8_t>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + ); + } + + static simdjson_inline vuint8_t splat(uint8_t _value) { return __riscv_vmv_v_x_u8m1(_value, VL8); } + static simdjson_inline vuint8_t zero() { return splat(0); } + static simdjson_inline vuint8_t load(const uint8_t values[VL8]) { return __riscv_vle8_v_u8m1(values, VL8); } + + // Bit operations + simdjson_inline simd8<uint8_t> operator|(const simd8<uint8_t> other) const { return __riscv_vor_vv_u8m1( value, other, VL8); } + simdjson_inline simd8<uint8_t> operator&(const simd8<uint8_t> other) const { return __riscv_vand_vv_u8m1( value, other, VL8); } + simdjson_inline simd8<uint8_t> operator^(const simd8<uint8_t> other) const { return __riscv_vxor_vv_u8m1( value, other, VL8); } + simdjson_inline simd8<uint8_t> operator~() const { return __riscv_vnot_v_u8m1(value, VL8); } +#if __riscv_zvbb + simdjson_inline simd8<uint8_t> bit_andnot(const simd8<uint8_t> other) const { return __riscv_vandn_vv_u8m1(other, value, VL8); } +#else + simdjson_inline simd8<uint8_t> bit_andnot(const simd8<uint8_t> other) const { return other & ~*this; } +#endif + simdjson_inline simd8<uint8_t>& operator|=(const simd8<uint8_t> other) { value = *this | other; return *this; } + simdjson_inline simd8<uint8_t>& operator&=(const simd8<uint8_t> other) { value = *this & other; return *this; } + simdjson_inline simd8<uint8_t>& operator^=(const simd8<uint8_t> other) { value = *this ^ other; return *this; } + + simdjson_inline simd8<bool> operator==(const simd8<uint8_t> other) const { return __riscv_vmseq(value, other, VL8); } + simdjson_inline simd8<bool> operator==(uint8_t other) const { return __riscv_vmseq(value, other, VL8); } + + template<int N=1> + simdjson_inline simd8<uint8_t> prev(const simd8<uint8_t> prev_chunk) const { + return __riscv_vslideup(__riscv_vslidedown(prev_chunk, VL8-N, VL8), value, N, VL8); + } + + // Store to array + simdjson_inline void store(uint8_t dst[VL8]) const { return __riscv_vse8(dst, value, VL8); } + + // Saturated math + simdjson_inline simd8<uint8_t> saturating_add(const simd8<uint8_t> other) const { return __riscv_vsaddu(value, other, VL8); } + simdjson_inline simd8<uint8_t> saturating_sub(const simd8<uint8_t> other) const { return __riscv_vssubu(value, other, VL8); } + + // Addition/subtraction are the same for signed and unsigned + simdjson_inline simd8<uint8_t> operator+(const simd8<uint8_t> other) const { return __riscv_vadd(value, other, VL8); } + simdjson_inline simd8<uint8_t> operator-(const simd8<uint8_t> other) const { return __riscv_vsub(value, other, VL8); } + simdjson_inline simd8<uint8_t>& operator+=(const simd8<uint8_t> other) { value = *this + other; return *this; } + simdjson_inline simd8<uint8_t>& operator-=(const simd8<uint8_t> other) { value = *this - other; return *this; } + + // Order-specific operations + simdjson_inline simd8<bool> operator<=(const simd8<uint8_t> other) const { return __riscv_vmsleu(value, other, VL8); } + simdjson_inline simd8<bool> operator>=(const simd8<uint8_t> other) const { return __riscv_vmsgeu(value, other, VL8); } + simdjson_inline simd8<bool> operator<(const simd8<uint8_t> other) const { return __riscv_vmsltu(value, other, VL8); } + simdjson_inline simd8<bool> operator>(const simd8<uint8_t> other) const { return __riscv_vmsgtu(value, other, VL8); } + + // Same as >, but instead of guaranteeing all 1's == true, false = 0 and true = nonzero. + simdjson_inline simd8<uint8_t> gt_bits(const simd8<uint8_t> other) const { return simd8<uint8_t>(*this > other); } + // Same as <, but instead of guaranteeing all 1's == true, false = 0 and true = nonzero. + simdjson_inline simd8<uint8_t> lt_bits(const simd8<uint8_t> other) const { return simd8<uint8_t>(*this < other); } + + // Bit-specific operations + simdjson_inline bool any_bits_set_anywhere() const { + return __riscv_vfirst(__riscv_vmsne(value, 0, VL8), VL8) >= 0; + } + simdjson_inline bool any_bits_set_anywhere(simd8<uint8_t> bits) const { return (*this & bits).any_bits_set_anywhere(); } + template<int N> + simdjson_inline simd8<uint8_t> shr() const { return __riscv_vsrl(value, N, VL8); } + template<int N> + simdjson_inline simd8<uint8_t> shl() const { return __riscv_vsll(value, N, VL8); } + + + // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values) + template<typename L> + simdjson_inline simd8<L> lookup_16(simd8<L> lookup_table) const { + return __riscv_vrgather(lookup_table, value, VL8); + } + + // compress inactive elements, to match AVX-512 behavior + template<typename L> + simdjson_inline void compress(vbitmask_t mask, L * output) const { + mask = (vbitmask_t)~mask; +#if __riscv_v_fixed_vlen == 128 + vbool8_t m = __riscv_vreinterpret_b8(__riscv_vmv_s_x_u16m1(mask, 1)); +#elif __riscv_v_fixed_vlen == 256 + vbool8_t m = __riscv_vreinterpret_b8(__riscv_vmv_s_x_u32m1(mask, 1)); +#else + vbool8_t m = __riscv_vreinterpret_b8(__riscv_vmv_s_x_u64m1(mask, 1)); +#endif + __riscv_vse8_v_u8m1(output, __riscv_vcompress(value, m, VL8), count_ones(mask)); + } + + template<typename L> + simdjson_inline simd8<L> lookup_16( + L replace0, L replace1, L replace2, L replace3, + L replace4, L replace5, L replace6, L replace7, + L replace8, L replace9, L replace10, L replace11, + L replace12, L replace13, L replace14, L replace15) const { + return lookup_16(simd8<L>::repeat_16( + replace0, replace1, replace2, replace3, + replace4, replace5, replace6, replace7, + replace8, replace9, replace10, replace11, + replace12, replace13, replace14, replace15 + )); + } + }; + + // Signed bytes + template<> + struct simd8<int8_t> { + vint8_t value; + static constexpr int SIZE = sizeof(value); + + simdjson_inline simd8(const vint8_t _value) : value(_value) {} + simdjson_inline simd8() : simd8(zero()) {} + simdjson_inline simd8(const int8_t values[VL8]) : simd8(load(values)) {} + simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {} + + simdjson_inline operator const vint8_t&() const { return this->value; } + simdjson_inline operator vint8_t&() { return this->value; } + + simdjson_inline simd8( + int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, + int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 + ) : simd8(vint8_t{ + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + }) {} + + // Repeat 16 values as many times as necessary (usually for lookup tables) + simdjson_inline static simd8<int8_t> repeat_16( + int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, + int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 + ) { + return simd8<int8_t>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + ); + } + + static simdjson_inline vint8_t splat(int8_t _value) { return __riscv_vmv_v_x_i8m1(_value, VL8); } + static simdjson_inline vint8_t zero() { return splat(0); } + static simdjson_inline vint8_t load(const int8_t values[VL8]) { return __riscv_vle8_v_i8m1(values, VL8); } + + + simdjson_inline void store(int8_t dst[VL8]) const { return __riscv_vse8(dst, value, VL8); } + + // Explicit conversion to/from unsigned + simdjson_inline explicit simd8(const vuint8_t other): simd8(__riscv_vreinterpret_i8m1(other)) {} + simdjson_inline explicit operator simd8<uint8_t>() const { return __riscv_vreinterpret_u8m1(value); } + + // Math + simdjson_inline simd8<int8_t> operator+(const simd8<int8_t> other) const { return __riscv_vadd(value, other, VL8); } + simdjson_inline simd8<int8_t> operator-(const simd8<int8_t> other) const { return __riscv_vsub(value, other, VL8); } + simdjson_inline simd8<int8_t>& operator+=(const simd8<int8_t> other) { value = *this + other; return *this; } + simdjson_inline simd8<int8_t>& operator-=(const simd8<int8_t> other) { value = *this - other; return *this; } + + // Order-sensitive comparisons + simdjson_inline simd8<int8_t> max_val( const simd8<int8_t> other) const { return __riscv_vmax( value, other, VL8); } + simdjson_inline simd8<int8_t> min_val( const simd8<int8_t> other) const { return __riscv_vmin( value, other, VL8); } + simdjson_inline simd8<bool> operator>( const simd8<int8_t> other) const { return __riscv_vmsgt(value, other, VL8); } + simdjson_inline simd8<bool> operator<( const simd8<int8_t> other) const { return __riscv_vmslt(value, other, VL8); } + simdjson_inline simd8<bool> operator==(const simd8<int8_t> other) const { return __riscv_vmseq(value, other, VL8); } + + template<int N=1> + simdjson_inline simd8<int8_t> prev(const simd8<int8_t> prev_chunk) const { + return __riscv_vslideup(__riscv_vslidedown(prev_chunk, VL8-N, VL8), value, N, VL8); + } + + // Perform a lookup assuming no value is larger than 16 + template<typename L> + simdjson_inline simd8<L> lookup_16(simd8<L> lookup_table) const { + return __riscv_vrgather(lookup_table, value, VL8); + } + template<typename L> + simdjson_inline simd8<L> lookup_16( + L replace0, L replace1, L replace2, L replace3, + L replace4, L replace5, L replace6, L replace7, + L replace8, L replace9, L replace10, L replace11, + L replace12, L replace13, L replace14, L replace15) const { + return lookup_16(simd8<L>::repeat_16( + replace0, replace1, replace2, replace3, + replace4, replace5, replace6, replace7, + replace8, replace9, replace10, replace11, + replace12, replace13, replace14, replace15 + )); + } + }; + + template<typename T> + struct simd8x64; + template<> + struct simd8x64<uint8_t> { + static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<uint8_t>); + vuint8x64_t value; + +#if __riscv_v_fixed_vlen >= 512 + template<int idx> simd8<uint8_t> get() const { return value; } +#else + template<int idx> simd8<uint8_t> get() const { return __riscv_vget_u8m1(value, idx); } +#endif + + simdjson_inline operator const vuint8x64_t&() const { return this->value; } + simdjson_inline operator vuint8x64_t&() { return this->value; } + + simd8x64(const simd8x64<uint8_t>& o) = delete; // no copy allowed + simd8x64<uint8_t>& operator=(const simd8<uint8_t>& other) = delete; // no assignment allowed + simd8x64() = delete; // no default constructor allowed + +#if __riscv_v_fixed_vlen == 128 + simdjson_inline simd8x64(const uint8_t *ptr, size_t n = 64) : value(__riscv_vle8_v_u8m4(ptr, n)) {} +#elif __riscv_v_fixed_vlen == 256 + simdjson_inline simd8x64(const uint8_t *ptr, size_t n = 64) : value(__riscv_vle8_v_u8m2(ptr, n)) {} +#else + simdjson_inline simd8x64(const uint8_t *ptr, size_t n = 64) : value(__riscv_vle8_v_u8m1(ptr, n)) {} +#endif + + simdjson_inline void store(uint8_t ptr[64]) const { + __riscv_vse8(ptr, value, 64); + } + + simdjson_inline bool is_ascii() const { +#if __riscv_v_fixed_vlen == 128 + return __riscv_vfirst(__riscv_vmslt(__riscv_vreinterpret_i8m4(value), 0, 64), 64) < 0; +#elif __riscv_v_fixed_vlen == 256 + return __riscv_vfirst(__riscv_vmslt(__riscv_vreinterpret_i8m2(value), 0, 64), 64) < 0; +#else + return __riscv_vfirst(__riscv_vmslt(__riscv_vreinterpret_i8m1(value), 0, 64), 64) < 0; +#endif + } + + // compress inactive elements, to match AVX-512 behavior + simdjson_inline uint64_t compress(uint64_t mask, uint8_t * output) const { + mask = ~mask; +#if __riscv_v_fixed_vlen == 128 + vboolx64_t m = __riscv_vreinterpret_b2(__riscv_vmv_s_x_u64m1(mask, 1)); +#elif __riscv_v_fixed_vlen == 256 + vboolx64_t m = __riscv_vreinterpret_b4(__riscv_vmv_s_x_u64m1(mask, 1)); +#else + vboolx64_t m = __riscv_vreinterpret_b8(__riscv_vmv_s_x_u64m1(mask, 1)); +#endif + size_t cnt = count_ones(mask); + __riscv_vse8(output, __riscv_vcompress(value, m, 64), cnt); + return cnt; + } + + simdjson_inline uint64_t eq(const uint8_t m) const { + return __riscv_vmv_x(__riscv_vreinterpret_u64m1(__riscv_vmseq(value, m, 64))); + } + + simdjson_inline uint64_t lteq(const uint8_t m) const { + return __riscv_vmv_x(__riscv_vreinterpret_u64m1(__riscv_vmsleu(value, m, 64))); + } + }; // struct simd8x64<uint8_t> + +} // namespace simd +} // unnamed namespace +} // namespace rvv_vls +} // namespace simdjson + +#endif // SIMDJSON_RVV_VLS_SIMD_H +/* end file simdjson/rvv-vls/simd.h */ +/* including simdjson/rvv-vls/stringparsing_defs.h: #include "simdjson/rvv-vls/stringparsing_defs.h" */ +/* begin file simdjson/rvv-vls/stringparsing_defs.h */ +#ifndef SIMDJSON_RVV_VLS_STRINGPARSING_DEFS_H +#define SIMDJSON_RVV_VLS_STRINGPARSING_DEFS_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace rvv_vls { +namespace { + +using namespace simd; + +// Holds backslashes and quotes locations. +struct backslash_and_quote { +public: + static constexpr uint64_t BYTES_PROCESSED = sizeof(simd8<uint8_t>); + simdjson_inline backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst); + + simdjson_inline bool has_quote_first() { return ((bs_bits - 1) & quote_bits) != 0; } + simdjson_inline bool has_backslash() { return ((quote_bits - 1) & bs_bits) != 0; } + simdjson_inline int quote_index() { return trailing_zeroes(quote_bits); } + simdjson_inline int backslash_index() { return trailing_zeroes(bs_bits); } + + uint64_t bs_bits; + uint64_t quote_bits; +}; // struct backslash_and_quote + +simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) { + static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "backslash and quote finder must process fewer than SIMDJSON_PADDING bytes"); + simd8<uint8_t> v(src); + v.store(dst); + return { (v == '\\').to_bitmask(), (v == '"').to_bitmask() }; +} + +struct escaping { + static constexpr uint64_t BYTES_PROCESSED = sizeof(simd8<uint8_t>); + simdjson_inline static escaping copy_and_find(const uint8_t *src, uint8_t *dst); + + simdjson_inline bool has_escape() { return escape_bits != 0; } + simdjson_inline int escape_index() { return trailing_zeroes(escape_bits) / 4; } + + uint64_t escape_bits; +}; // struct escaping + +simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *dst) { + static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "escaping finder must process fewer than SIMDJSON_PADDING bytes"); + simd8<uint8_t> v(src); + v.store(dst); + return { ((v == '"') | (v == '\\') | (v == 32)).to_bitmask() }; +} + + +} // unnamed namespace +} // namespace rvv_vls +} // namespace simdjson + +#endif // SIMDJSON_RVV_VLS_STRINGPARSING_DEFS_H +/* end file simdjson/rvv-vls/stringparsing_defs.h */ +/* including simdjson/rvv-vls/numberparsing_defs.h: #include "simdjson/rvv-vls/numberparsing_defs.h" */ +/* begin file simdjson/rvv-vls/numberparsing_defs.h */ +#ifndef SIMDJSON_RVV_VLS_NUMBERPARSING_DEFS_H +#define SIMDJSON_RVV_VLS_NUMBERPARSING_DEFS_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#include <cstring> + +#ifdef JSON_TEST_NUMBERS // for unit testing +void found_invalid_number(const uint8_t *buf); +void found_integer(int64_t result, const uint8_t *buf); +void found_unsigned_integer(uint64_t result, const uint8_t *buf); +void found_float(double result, const uint8_t *buf); +#endif + +namespace simdjson { +namespace rvv_vls { +namespace numberparsing { + +// credit: https://johnnylee-sde.github.io/Fast-numeric-string-to-int/ +/** @private */ +static simdjson_inline uint32_t parse_eight_digits_unrolled(const char *chars) { + uint64_t val; +#if __riscv_misaligned_fast + memcpy(&val, chars, sizeof(uint64_t)); +#else + val = __riscv_vmv_x(__riscv_vreinterpret_u64m1(__riscv_vlmul_ext_u8m1(__riscv_vle8_v_u8mf2((uint8_t*)chars, 8)))); +#endif + val = (val & 0x0F0F0F0F0F0F0F0F) * 2561 >> 8; + val = (val & 0x00FF00FF00FF00FF) * 6553601 >> 16; + return uint32_t((val & 0x0000FFFF0000FFFF) * 42949672960001 >> 32); +} + +/** @private */ +static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) { + return parse_eight_digits_unrolled(reinterpret_cast<const char *>(chars)); +} + +/** @private */ +simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) { + internal::value128 answer; + __uint128_t r = (static_cast<__uint128_t>(value1)) * value2; + answer.low = uint64_t(r); + answer.high = uint64_t(r >> 64); + return answer; +} + +} // namespace numberparsing +} // namespace rvv_vls +} // namespace simdjson + +#define SIMDJSON_SWAR_NUMBER_PARSING 1 + +#endif // SIMDJSON_RVV_VLS_NUMBERPARSING_DEFS_H +/* end file simdjson/rvv-vls/numberparsing_defs.h */ + +#define SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT 1 +/* end file simdjson/rvv-vls/begin.h */ +/* including simdjson/generic/builder/amalgamated.h for rvv_vls: #include "simdjson/generic/builder/amalgamated.h" */ +/* begin file simdjson/generic/builder/amalgamated.h for rvv_vls */ +#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_BUILDER_DEPENDENCIES_H) +#error simdjson/generic/builder/dependencies.h must be included before simdjson/generic/builder/amalgamated.h! +#endif + +/* including simdjson/generic/builder/json_string_builder.h for rvv_vls: #include "simdjson/generic/builder/json_string_builder.h" */ +/* begin file simdjson/generic/builder/json_string_builder.h for rvv_vls */ +#ifndef SIMDJSON_GENERIC_STRING_BUILDER_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { + + +#if SIMDJSON_SUPPORTS_CONCEPTS + +namespace rvv_vls { +namespace builder { + class string_builder; +}} + +template <typename T, typename = void> +struct has_custom_serialization : std::false_type {}; + +inline constexpr struct serialize_tag { + template <typename T> + constexpr void operator()(rvv_vls::builder::string_builder& b, T&& obj) const{ + return tag_invoke(*this, b, std::forward<T>(obj)); + } + + +} serialize{}; +template <typename T> +struct has_custom_serialization<T, std::void_t< + decltype(tag_invoke(serialize, std::declval<rvv_vls::builder::string_builder&>(), std::declval<T&>())) +>> : std::true_type {}; + +template <typename T> +constexpr bool require_custom_serialization = has_custom_serialization<T>::value; +#else +struct has_custom_serialization : std::false_type {}; +#endif // SIMDJSON_SUPPORTS_CONCEPTS + +namespace rvv_vls { +namespace builder { +/** + * A builder for JSON strings representing documents. This is a low-level + * builder that is not meant to be used directly by end-users. Though it + * supports atomic types (Booleans, strings), it does not support composed + * types (arrays and objects). + * + * Ultimately, this class can support kernel-specific optimizations. E.g., + * it may make use of SIMD instructions to escape strings faster. + */ +class string_builder { +public: + simdjson_inline string_builder(size_t initial_capacity = DEFAULT_INITIAL_CAPACITY); + + static constexpr size_t DEFAULT_INITIAL_CAPACITY = 1024; + + /** + * Append number (includes Booleans). Booleans are mapped to the strings + * false and true. Numbers are converted to strings abiding by the JSON standard. + * Floating-point numbers are converted to the shortest string that 'correctly' + * represents the number. + */ + template<typename number_type, + typename = typename std::enable_if<std::is_arithmetic<number_type>::value>::type> + simdjson_inline void append(number_type v) noexcept; + + /** + * Append character c. + */ + simdjson_inline void append(char c) noexcept; + + /** + * Append the string 'null'. + */ + simdjson_inline void append_null() noexcept; + + /** + * Clear the content. + */ + simdjson_inline void clear() noexcept; + + /** + * Append the std::string_view, after escaping it. + * There is no UTF-8 validation. + */ + simdjson_inline void escape_and_append(std::string_view input) noexcept; + + /** + * Append the std::string_view surrounded by double quotes, after escaping it. + * There is no UTF-8 validation. + */ + simdjson_inline void escape_and_append_with_quotes(std::string_view input) noexcept; +#if SIMDJSON_SUPPORTS_CONCEPTS + template<constevalutil::fixed_string key> + simdjson_inline void escape_and_append_with_quotes() noexcept; +#endif + /** + * Append the character surrounded by double quotes, after escaping it. + * There is no UTF-8 validation. + */ + simdjson_inline void escape_and_append_with_quotes(char input) noexcept; + + /** + * Append the character surrounded by double quotes, after escaping it. + * There is no UTF-8 validation. + */ + simdjson_inline void escape_and_append_with_quotes(const char* input) noexcept; + + /** + * Append the C string directly, without escaping. + * There is no UTF-8 validation. + */ + simdjson_inline void append_raw(const char *c) noexcept; + + /** + * Append "{" to the buffer. + */ + simdjson_inline void start_object() noexcept; + + /** + * Append "}" to the buffer. + */ + simdjson_inline void end_object() noexcept; + + /** + * Append "[" to the buffer. + */ + simdjson_inline void start_array() noexcept; + + /** + * Append "]" to the buffer. + */ + simdjson_inline void end_array() noexcept; + + /** + * Append "," to the buffer. + */ + simdjson_inline void append_comma() noexcept; + + /** + * Append ":" to the buffer. + */ + simdjson_inline void append_colon() noexcept; + + /** + * Append a key-value pair to the buffer. + * The key is escaped and surrounded by double quotes. + * The value is escaped if it is a string. + */ + template<typename key_type, typename value_type> + simdjson_inline void append_key_value(key_type key, value_type value) noexcept; +#if SIMDJSON_SUPPORTS_CONCEPTS + template<constevalutil::fixed_string key, typename value_type> + simdjson_inline void append_key_value(value_type value) noexcept; + + // Support for optional types (std::optional, etc.) + template <concepts::optional_type T> + requires(!require_custom_serialization<T>) + simdjson_inline void append(const T &opt); + + template <typename T> + requires(require_custom_serialization<T>) + simdjson_inline void append(T &&val); + + // Support for string-like types + template <typename T> + requires(std::is_convertible<T, std::string_view>::value || + std::is_same<T, const char*>::value ) + simdjson_inline void append(const T &value); +#endif +#if SIMDJSON_SUPPORTS_RANGES && SIMDJSON_SUPPORTS_CONCEPTS + // Support for range-based appending (std::ranges::view, etc.) + template <std::ranges::range R> +requires (!std::is_convertible<R, std::string_view>::value && !require_custom_serialization<R>) + simdjson_inline void append(const R &range) noexcept; +#endif + /** + * Append the std::string_view directly, without escaping. + * There is no UTF-8 validation. + */ + simdjson_inline void append_raw(std::string_view input) noexcept; + + /** + * Append len characters from str. + * There is no UTF-8 validation. + */ + simdjson_inline void append_raw(const char *str, size_t len) noexcept; +#if SIMDJSON_EXCEPTIONS + /** + * Creates an std::string from the written JSON buffer. + * Throws if memory allocation failed + * + * The result may not be valid UTF-8 if some of your content was not valid UTF-8. + * Use validate_unicode() to check the content if needed. + */ + simdjson_inline operator std::string() const noexcept(false); + + /** + * Creates an std::string_view from the written JSON buffer. + * Throws if memory allocation failed. + * + * The result may not be valid UTF-8 if some of your content was not valid UTF-8. + * Use validate_unicode() to check the content if needed. + */ + simdjson_inline operator std::string_view() const noexcept(false) simdjson_lifetime_bound; +#endif + + /** + * Returns a view on the written JSON buffer. Returns an error + * if memory allocation failed. + * + * The result may not be valid UTF-8 if some of your content was not valid UTF-8. + * Use validate_unicode() to check the content. + */ + simdjson_inline simdjson_result<std::string_view> view() const noexcept; + + /** + * Appends the null character to the buffer and returns + * a pointer to the beginning of the written JSON buffer. + * Returns an error if memory allocation failed. + * The result is null-terminated. + * + * The result may not be valid UTF-8 if some of your content was not valid UTF-8. + * Use validate_unicode() to check the content. + */ + simdjson_inline simdjson_result<const char *> c_str() noexcept; + + /** + * Return true if the content is valid UTF-8. + */ + simdjson_inline bool validate_unicode() const noexcept; + + /** + * Returns the current size of the written JSON buffer. + * If an error occurred, returns 0. + */ + simdjson_inline size_t size() const noexcept; + +private: + /** + * Returns true if we can write at least upcoming_bytes bytes. + * The underlying buffer is reallocated if needed. It is designed + * to be called before writing to the buffer. It should be fast. + */ + simdjson_inline bool capacity_check(size_t upcoming_bytes); + + /** + * Grow the buffer to at least desired_capacity bytes. + * If the allocation fails, is_valid is set to false. We expect + * that this function would not be repeatedly called. + */ + simdjson_inline void grow_buffer(size_t desired_capacity); + + /** + * We use this helper function to make sure that is_valid is kept consistent. + */ + simdjson_inline void set_valid(bool valid) noexcept; + + std::unique_ptr<char[]> buffer{}; + size_t position{0}; + size_t capacity{0}; + bool is_valid{true}; +}; + + + +} +} + + +#if !SIMDJSON_STATIC_REFLECTION +// fallback implementation until we have static reflection +template <class Z> +simdjson_warn_unused simdjson_result<std::string> to_json(const Z &z, size_t initial_capacity = simdjson::rvv_vls::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + simdjson::rvv_vls::builder::string_builder b(initial_capacity); + b.append(z); + std::string_view s; + auto e = b.view().get(s); + if(e) { return e; } + return std::string(s); +} +template <class Z> +simdjson_warn_unused error_code to_json(const Z &z, std::string &s, size_t initial_capacity = simdjson::rvv_vls::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + simdjson::rvv_vls::builder::string_builder b(initial_capacity); + b.append(z); + std::string_view sv; + auto e = b.view().get(sv); + if(e) { return e; } + s.assign(sv.data(), sv.size()); + return simdjson::SUCCESS; +} +#endif + +#if SIMDJSON_SUPPORTS_CONCEPTS +#endif // SIMDJSON_SUPPORTS_CONCEPTS + +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_STRING_BUILDER_H +/* end file simdjson/generic/builder/json_string_builder.h for rvv_vls */ +/* including simdjson/generic/builder/json_builder.h for rvv_vls: #include "simdjson/generic/builder/json_builder.h" */ +/* begin file simdjson/generic/builder/json_builder.h for rvv_vls */ +#ifndef SIMDJSON_GENERIC_BUILDER_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_string_builder.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/concepts.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ +#if SIMDJSON_STATIC_REFLECTION + +#include <charconv> +#include <cstring> +#include <meta> +#include <memory> +#include <optional> +#include <string_view> +#include <type_traits> +#include <utility> +// #include <static_reflection> // for std::define_static_string - header not available yet + +namespace simdjson { +namespace rvv_vls { +namespace builder { + +template <class T> + requires(concepts::container_but_not_string<T> && !require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &t) { + auto it = t.begin(); + auto end = t.end(); + if (it == end) { + b.append_raw("[]"); + return; + } + b.append('['); + atom(b, *it); + ++it; + for (; it != end; ++it) { + b.append(','); + atom(b, *it); + } + b.append(']'); +} + +template <class T> + requires(std::is_same_v<T, std::string> || + std::is_same_v<T, std::string_view> || + std::is_same_v<T, const char *> || + std::is_same_v<T, char>) +constexpr void atom(string_builder &b, const T &t) { + b.escape_and_append_with_quotes(t); +} + +template <concepts::string_view_keyed_map T> + requires(!require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &m) { + if (m.empty()) { + b.append_raw("{}"); + return; + } + b.append('{'); + bool first = true; + for (const auto& [key, value] : m) { + if (!first) { + b.append(','); + } + first = false; + // Keys must be convertible to string_view per the concept + b.escape_and_append_with_quotes(key); + b.append(':'); + atom(b, value); + } + b.append('}'); +} + + +template<typename number_type, + typename = typename std::enable_if<std::is_arithmetic<number_type>::value && !std::is_same_v<number_type, char>>::type> +constexpr void atom(string_builder &b, const number_type t) { + b.append(t); +} + +template <class T> + requires(std::is_class_v<T> && !concepts::container_but_not_string<T> && + !concepts::string_view_keyed_map<T> && + !concepts::optional_type<T> && + !concepts::smart_pointer<T> && + !concepts::appendable_containers<T> && + !std::is_same_v<T, std::string> && + !std::is_same_v<T, std::string_view> && + !std::is_same_v<T, const char*> && + !std::is_same_v<T, char> && !require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &t) { + int i = 0; + b.append('{'); + template for (constexpr auto dm : std::define_static_array(std::meta::nonstatic_data_members_of(^^T, std::meta::access_context::unchecked()))) { + if (i != 0) + b.append(','); + constexpr auto key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(dm))); + b.append_raw(key); + b.append(':'); + atom(b, t.[:dm:]); + i++; + }; + b.append('}'); +} + +// Support for optional types (std::optional, etc.) +template <concepts::optional_type T> + requires(!require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &opt) { + if (opt) { + atom(b, opt.value()); + } else { + b.append_raw("null"); + } +} + +// Support for smart pointers (std::unique_ptr, std::shared_ptr, etc.) +template <concepts::smart_pointer T> + requires(!require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &ptr) { + if (ptr) { + atom(b, *ptr); + } else { + b.append_raw("null"); + } +} + +// Support for enums - serialize as string representation using expand approach from P2996R12 +template <typename T> + requires(std::is_enum_v<T> && !require_custom_serialization<T>) +void atom(string_builder &b, const T &e) { +#if SIMDJSON_STATIC_REFLECTION + constexpr auto enumerators = std::define_static_array(std::meta::enumerators_of(^^T)); + template for (constexpr auto enum_val : enumerators) { + constexpr auto enum_str = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(enum_val))); + if (e == [:enum_val:]) { + b.append_raw(enum_str); + return; + } + }; + // Fallback to integer if enum value not found + atom(b, static_cast<std::underlying_type_t<T>>(e)); +#else + // Fallback: serialize as integer if reflection not available + atom(b, static_cast<std::underlying_type_t<T>>(e)); +#endif +} + +// Support for appendable containers that don't have operator[] (sets, etc.) +template <concepts::appendable_containers T> + requires(!concepts::container_but_not_string<T> && !concepts::string_view_keyed_map<T> && + !concepts::optional_type<T> && !concepts::smart_pointer<T> && + !std::is_same_v<T, std::string> && + !std::is_same_v<T, std::string_view> && !std::is_same_v<T, const char*> && !require_custom_serialization<T>) +constexpr void atom(string_builder &b, const T &container) { + if (container.empty()) { + b.append_raw("[]"); + return; + } + b.append('['); + bool first = true; + for (const auto& item : container) { + if (!first) { + b.append(','); + } + first = false; + atom(b, item); + } + b.append(']'); +} + +// append functions that delegate to atom functions for primitive types +template <class T> + requires(std::is_arithmetic_v<T> && !std::is_same_v<T, char>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +template <class T> + requires(std::is_same_v<T, std::string> || + std::is_same_v<T, std::string_view> || + std::is_same_v<T, const char *> || + std::is_same_v<T, char>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +template <concepts::optional_type T> + requires(!require_custom_serialization<T>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +template <concepts::smart_pointer T> + requires(!require_custom_serialization<T>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +template <concepts::appendable_containers T> + requires(!concepts::container_but_not_string<T> && !concepts::string_view_keyed_map<T> && + !concepts::optional_type<T> && !concepts::smart_pointer<T> && + !std::is_same_v<T, std::string> && + !std::is_same_v<T, std::string_view> && !std::is_same_v<T, const char*> && !require_custom_serialization<T>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +template <concepts::string_view_keyed_map T> + requires(!require_custom_serialization<T>) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +// works for struct +template <class Z> + requires(std::is_class_v<Z> && !concepts::container_but_not_string<Z> && + !concepts::string_view_keyed_map<Z> && + !concepts::optional_type<Z> && + !concepts::smart_pointer<Z> && + !concepts::appendable_containers<Z> && + !std::is_same_v<Z, std::string> && + !std::is_same_v<Z, std::string_view> && + !std::is_same_v<Z, const char*> && + !std::is_same_v<Z, char> && !require_custom_serialization<Z>) +void append(string_builder &b, const Z &z) { + int i = 0; + b.append('{'); + template for (constexpr auto dm : std::define_static_array(std::meta::nonstatic_data_members_of(^^Z, std::meta::access_context::unchecked()))) { + if (i != 0) + b.append(','); + constexpr auto key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(dm))); + b.append_raw(key); + b.append(':'); + atom(b, z.[:dm:]); + i++; + }; + b.append('}'); +} + +// works for container that have begin() and end() iterators +template <class Z> + requires(concepts::container_but_not_string<Z> && !require_custom_serialization<Z>) +void append(string_builder &b, const Z &z) { + auto it = z.begin(); + auto end = z.end(); + if (it == end) { + b.append_raw("[]"); + return; + } + b.append('['); + atom(b, *it); + ++it; + for (; it != end; ++it) { + b.append(','); + atom(b, *it); + } + b.append(']'); +} + +template <class Z> + requires (require_custom_serialization<Z>) +void append(string_builder &b, const Z &z) { + b.append(z); +} + + +template <class Z> +simdjson_warn_unused simdjson_result<std::string> to_json_string(const Z &z, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + string_builder b(initial_capacity); + append(b, z); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); +} + +template <class Z> +simdjson_warn_unused error_code to_json(const Z &z, std::string &s, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + string_builder b(initial_capacity); + append(b, z); + std::string_view view; + if(auto e = b.view().get(view); e) { return e; } + s.assign(view); + return SUCCESS; +} + +template <class Z> +string_builder& operator<<(string_builder& b, const Z& z) { + append(b, z); + return b; +} + +// extract_from: Serialize only specific fields from a struct to JSON +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +void extract_from(string_builder &b, const T &obj) { + // Helper to check if a field name matches any of the requested fields + auto should_extract = [](std::string_view field_name) constexpr -> bool { + return ((FieldNames.view() == field_name) || ...); + }; + + b.append('{'); + bool first = true; + + // Iterate through all members of T using reflection + template for (constexpr auto mem : std::define_static_array( + std::meta::nonstatic_data_members_of(^^T, std::meta::access_context::unchecked()))) { + + if constexpr (std::meta::is_public(mem)) { + constexpr std::string_view key = std::define_static_string(std::meta::identifier_of(mem)); + + // Only serialize this field if it's in our list of requested fields + if constexpr (should_extract(key)) { + if (!first) { + b.append(','); + } + first = false; + + // Serialize the key + constexpr auto quoted_key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(mem))); + b.append_raw(quoted_key); + b.append(':'); + + // Serialize the value + atom(b, obj.[:mem:]); + } + } + }; + + b.append('}'); +} + +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result<std::string> extract_from(const T &obj, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + string_builder b(initial_capacity); + extract_from<FieldNames...>(b, obj); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); +} + +} // namespace builder +} // namespace rvv_vls +// Alias the function template to 'to' in the global namespace +template <class Z> +simdjson_warn_unused simdjson_result<std::string> to_json(const Z &z, size_t initial_capacity = rvv_vls::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + rvv_vls::builder::string_builder b(initial_capacity); + rvv_vls::builder::append(b, z); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); +} +template <class Z> +simdjson_warn_unused error_code to_json(const Z &z, std::string &s, size_t initial_capacity = rvv_vls::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + rvv_vls::builder::string_builder b(initial_capacity); + rvv_vls::builder::append(b, z); + std::string_view view; + if(auto e = b.view().get(view); e) { return e; } + s.assign(view); + return SUCCESS; +} +// Global namespace function for extract_from +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result<std::string> extract_from(const T &obj, size_t initial_capacity = rvv_vls::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + rvv_vls::builder::string_builder b(initial_capacity); + rvv_vls::builder::extract_from<FieldNames...>(b, obj); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); +} + +} // namespace simdjson + +#endif // SIMDJSON_STATIC_REFLECTION + +#endif +/* end file simdjson/generic/builder/json_builder.h for rvv_vls */ +/* including simdjson/generic/builder/fractured_json_builder.h for rvv_vls: #include "simdjson/generic/builder/fractured_json_builder.h" */ +/* begin file simdjson/generic/builder/fractured_json_builder.h for rvv_vls */ +#ifndef SIMDJSON_GENERIC_FRACTURED_JSON_BUILDER_H +#define SIMDJSON_GENERIC_FRACTURED_JSON_BUILDER_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_builder.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/dom/fractured_json.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#if SIMDJSON_STATIC_REFLECTION + +namespace simdjson { +namespace rvv_vls { +namespace builder { + +/** + * Serialize an object to a FracturedJson-formatted string. + * + * FracturedJson produces human-readable yet compact JSON output by intelligently + * choosing between different layout strategies (inline, compact multiline, table, + * expanded) based on content complexity, length, and structure similarity. + * + * This function combines the builder's serialization with FracturedJson formatting: + * 1. Serializes the object to minified JSON using reflection + * 2. Parses and reformats using FracturedJson + * + * Example: + * struct User { int id; std::string name; bool active; }; + * User user{1, "Alice", true}; + * auto result = to_fractured_json_string(user); + * // result.value() == "{ \"id\": 1, \"name\": \"Alice\", \"active\": true }" + * + * @param obj The object to serialize (must be a reflectable type) + * @param opts FracturedJson formatting options + * @param initial_capacity Initial buffer capacity for serialization + * @return The formatted JSON string, or an error + */ +template <class T> +simdjson_warn_unused simdjson_result<std::string> to_fractured_json_string( + const T& obj, + const fractured_json_options& opts = {}, + size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + // Step 1: Serialize to minified JSON + std::string formatted; + auto error = to_json_string(obj, initial_capacity).get(formatted); + if (error) { + return error; + } + + // Step 2: Reformat with FracturedJson + return fractured_json_string(formatted, opts); +} + +/** + * Extract specific fields from an object and format with FracturedJson. + * + * Example: + * struct User { int id; std::string name; std::string email; bool active; }; + * User user{1, "Alice", "alice@example.com", true}; + * auto result = extract_fractured_json<"id", "name">(user); + * // result.value() == "{ \"id\": 1, \"name\": \"Alice\" }" + * + * @param obj The object to serialize + * @param opts FracturedJson formatting options + * @param initial_capacity Initial buffer capacity for serialization + * @return The formatted JSON string containing only the specified fields + */ +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result<std::string> extract_fractured_json( + const T& obj, + const fractured_json_options& opts = {}, + size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + // Step 1: Extract fields to minified JSON + std::string formatted; + auto error = extract_from<FieldNames...>(obj, initial_capacity).get(formatted); + if (error) { + return error; + } + + // Step 2: Reformat with FracturedJson + return fractured_json_string(formatted, opts); +} + +} // namespace builder +} // namespace rvv_vls + +// Global namespace convenience functions + +/** + * Serialize an object to a FracturedJson-formatted string. + * Global namespace version for convenience. + */ +template <class T> +simdjson_warn_unused simdjson_result<std::string> to_fractured_json_string( + const T& obj, + const fractured_json_options& opts = {}, + size_t initial_capacity = rvv_vls::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + return rvv_vls::builder::to_fractured_json_string(obj, opts, initial_capacity); +} +/** + * Extract specific fields from an object and format with FracturedJson. + * Global namespace version for convenience. + */ +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result<std::string> extract_fractured_json( + const T& obj, + const fractured_json_options& opts = {}, + size_t initial_capacity = rvv_vls::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { + return rvv_vls::builder::extract_fractured_json<FieldNames...>(obj, opts, initial_capacity); +} + +} // namespace simdjson + +#endif // SIMDJSON_STATIC_REFLECTION + +#endif // SIMDJSON_GENERIC_FRACTURED_JSON_BUILDER_H +/* end file simdjson/generic/builder/fractured_json_builder.h for rvv_vls */ + + + +// JSON builder inline definitions +/* including simdjson/generic/builder/json_string_builder-inl.h for rvv_vls: #include "simdjson/generic/builder/json_string_builder-inl.h" */ +/* begin file simdjson/generic/builder/json_string_builder-inl.h for rvv_vls */ +#include <array> +#include <cstring> +#include <type_traits> +#ifndef SIMDJSON_GENERIC_STRING_BUILDER_INL_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_INL_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_string_builder.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +/* + * Empirically, we have found that an inlined optimization is important for + * performance. The following macros are not ideal. We should find a better + * way to inline the code. + */ + +#if defined(__SSE2__) || defined(__x86_64__) || defined(__x86_64) || \ + (defined(_M_AMD64) || defined(_M_X64) || \ + (defined(_M_IX86_FP) && _M_IX86_FP == 2)) +#ifndef SIMDJSON_EXPERIMENTAL_HAS_SSE2 +#define SIMDJSON_EXPERIMENTAL_HAS_SSE2 1 +#endif +#endif + +#if defined(__aarch64__) || defined(_M_ARM64) +#ifndef SIMDJSON_EXPERIMENTAL_HAS_NEON +#define SIMDJSON_EXPERIMENTAL_HAS_NEON 1 +#endif +#endif +#if defined(__loongarch_sx) +#ifndef SIMDJSON_EXPERIMENTAL_HAS_LSX +#define SIMDJSON_EXPERIMENTAL_HAS_LSX 1 +#endif +#endif +#if defined(__riscv_v_intrinsic) && __riscv_v_intrinsic >= 11000 && \ + defined(__riscv_vector) +#ifndef SIMDJSON_EXPERIMENTAL_HAS_RVV +#define SIMDJSON_EXPERIMENTAL_HAS_RVV 1 +#endif +#endif +#if (defined(__PPC64__) || defined(_M_PPC64)) && defined(__ALTIVEC__) +#ifndef SIMDJSON_EXPERIMENTAL_HAS_PPC64 +#define SIMDJSON_EXPERIMENTAL_HAS_PPC64 1 +#endif +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_NEON +#include <arm_neon.h> +#ifdef _MSC_VER +#include <intrin.h> +#endif +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_SSE2 +#include <emmintrin.h> +#ifdef _MSC_VER +#include <intrin.h> +#endif +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_LSX +#include <lsxintrin.h> +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_RVV +#include <riscv_vector.h> +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_PPC64 +#include <altivec.h> +#ifdef bool +#undef bool +#endif +#ifdef vector +#undef vector +#endif +#endif + + +namespace simdjson { +namespace rvv_vls { +namespace builder { + +static SIMDJSON_CONSTEXPR_LAMBDA std::array<uint8_t, 256> + json_quotable_character = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + +/** + +A possible SWAR implementation of has_json_escapable_byte. It is not used +because it is slower than the current implementation. It is kept here for +reference (to show that we tried it). + +inline bool has_json_escapable_byte(uint64_t x) { + uint64_t is_ascii = 0x8080808080808080ULL & ~x; + uint64_t xor2 = x ^ 0x0202020202020202ULL; + uint64_t lt32_or_eq34 = xor2 - 0x2121212121212121ULL; + uint64_t sub92 = x ^ 0x5C5C5C5C5C5C5C5CULL; + uint64_t eq92 = (sub92 - 0x0101010101010101ULL); + return ((lt32_or_eq34 | eq92) & is_ascii) != 0; +} + +**/ + +SIMDJSON_CONSTEXPR_LAMBDA simdjson_inline bool +simple_needs_escaping(std::string_view v) { + for (char c : v) { + // a table lookup is faster than a series of comparisons + if (json_quotable_character[static_cast<uint8_t>(c)]) { + return true; + } + } + return false; +} + +#if SIMDJSON_EXPERIMENTAL_HAS_NEON +simdjson_inline bool fast_needs_escaping(std::string_view view) { + if (view.size() < 16) { + return simple_needs_escaping(view); + } + size_t i = 0; + uint8x16_t running = vdupq_n_u8(0); + uint8x16_t v34 = vdupq_n_u8(34); + uint8x16_t v92 = vdupq_n_u8(92); + + for (; i + 15 < view.size(); i += 16) { + uint8x16_t word = vld1q_u8((const uint8_t *)view.data() + i); + running = vorrq_u8(running, vceqq_u8(word, v34)); + running = vorrq_u8(running, vceqq_u8(word, v92)); + running = vorrq_u8(running, vcltq_u8(word, vdupq_n_u8(32))); + } + if (i < view.size()) { + uint8x16_t word = + vld1q_u8((const uint8_t *)view.data() + view.length() - 16); + running = vorrq_u8(running, vceqq_u8(word, v34)); + running = vorrq_u8(running, vceqq_u8(word, v92)); + running = vorrq_u8(running, vcltq_u8(word, vdupq_n_u8(32))); + } + return vmaxvq_u32(vreinterpretq_u32_u8(running)) != 0; +} +#elif SIMDJSON_EXPERIMENTAL_HAS_SSE2 +simdjson_inline bool fast_needs_escaping(std::string_view view) { + if (view.size() < 16) { + return simple_needs_escaping(view); + } + size_t i = 0; + __m128i running = _mm_setzero_si128(); + for (; i + 15 < view.size(); i += 16) { + + __m128i word = + _mm_loadu_si128(reinterpret_cast<const __m128i *>(view.data() + i)); + running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(34))); + running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(92))); + running = _mm_or_si128( + running, _mm_cmpeq_epi8(_mm_subs_epu8(word, _mm_set1_epi8(31)), + _mm_setzero_si128())); + } + if (i < view.size()) { + __m128i word = _mm_loadu_si128( + reinterpret_cast<const __m128i *>(view.data() + view.length() - 16)); + running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(34))); + running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(92))); + running = _mm_or_si128( + running, _mm_cmpeq_epi8(_mm_subs_epu8(word, _mm_set1_epi8(31)), + _mm_setzero_si128())); + } + return _mm_movemask_epi8(running) != 0; +} +#elif SIMDJSON_EXPERIMENTAL_HAS_PPC64 +simdjson_inline bool fast_needs_escaping(std::string_view view) { + if (view.size() < 16) { + return simple_needs_escaping(view); + } + size_t i = 0; + __vector unsigned char running = vec_splats((unsigned char)0); + __vector unsigned char v34 = vec_splats((unsigned char)34); + __vector unsigned char v92 = vec_splats((unsigned char)92); + __vector unsigned char v32 = vec_splats((unsigned char)32); + + for (; i + 15 < view.size(); i += 16) { + __vector unsigned char word = + vec_vsx_ld(0, reinterpret_cast<const unsigned char *>(view.data() + i)); + running = vec_or(running, (__vector unsigned char)vec_cmpeq(word, v34)); + running = vec_or(running, (__vector unsigned char)vec_cmpeq(word, v92)); + running = vec_or(running, + (__vector unsigned char)vec_cmplt(word, v32)); + } + if (i < view.size()) { + __vector unsigned char word = vec_vsx_ld( + 0, reinterpret_cast<const unsigned char *>(view.data() + view.length() - 16)); + running = vec_or(running, (__vector unsigned char)vec_cmpeq(word, v34)); + running = vec_or(running, (__vector unsigned char)vec_cmpeq(word, v92)); + running = vec_or(running, + (__vector unsigned char)vec_cmplt(word, v32)); + } + return !vec_all_eq(running, vec_splats((unsigned char)0)); +} +#else +simdjson_inline bool fast_needs_escaping(std::string_view view) { + return simple_needs_escaping(view); +} +#endif + +// Scalar fallback for finding next quotable character +SIMDJSON_CONSTEXPR_LAMBDA simdjson_inline size_t +find_next_json_quotable_character_scalar(const std::string_view view, + size_t location) noexcept { + for (auto pos = view.begin() + location; pos != view.end(); ++pos) { + if (json_quotable_character[static_cast<uint8_t>(*pos)]) { + return pos - view.begin(); + } + } + return size_t(view.size()); +} + +// SIMD-accelerated position finding that directly locates the first quotable +// character, combining detection and position extraction in a single pass to +// minimize redundant work. +#if SIMDJSON_EXPERIMENTAL_HAS_NEON +simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + const size_t len = view.size(); + const uint8_t *ptr = + reinterpret_cast<const uint8_t *>(view.data()) + location; + size_t remaining = len - location; + + // SIMD constants for characters requiring escape + uint8x16_t v34 = vdupq_n_u8(34); // '"' + uint8x16_t v92 = vdupq_n_u8(92); // '\\' + uint8x16_t v32 = vdupq_n_u8(32); // control char threshold + + while (remaining >= 16) { + uint8x16_t word = vld1q_u8(ptr); + + // Check for quotable characters: '"', '\\', or control chars (< 32) + uint8x16_t needs_escape = vceqq_u8(word, v34); + needs_escape = vorrq_u8(needs_escape, vceqq_u8(word, v92)); + needs_escape = vorrq_u8(needs_escape, vcltq_u8(word, v32)); + + const uint8x8_t res = vshrn_n_u16(vreinterpretq_u16_u8(needs_escape), 4); + const uint64_t mask = vget_lane_u64(vreinterpret_u64_u8(res), 0); + if(mask != 0) { + size_t offset = ptr - reinterpret_cast<const uint8_t *>(view.data()); + auto trailing_zero = trailing_zeroes(mask); + return offset + (trailing_zero >> 2); + } + ptr += 16; + remaining -= 16; + } + + // Scalar fallback for remaining bytes + size_t current = len - remaining; + return find_next_json_quotable_character_scalar(view, current); +} +#elif SIMDJSON_EXPERIMENTAL_HAS_SSE2 +simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + const size_t len = view.size(); + const uint8_t *ptr = + reinterpret_cast<const uint8_t *>(view.data()) + location; + size_t remaining = len - location; + + // SIMD constants + __m128i v34 = _mm_set1_epi8(34); // '"' + __m128i v92 = _mm_set1_epi8(92); // '\\' + __m128i v31 = _mm_set1_epi8(31); // for control char detection + + while (remaining >= 16) { + __m128i word = _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr)); + + // Check for quotable characters + __m128i needs_escape = _mm_cmpeq_epi8(word, v34); + needs_escape = _mm_or_si128(needs_escape, _mm_cmpeq_epi8(word, v92)); + needs_escape = _mm_or_si128( + needs_escape, + _mm_cmpeq_epi8(_mm_subs_epu8(word, v31), _mm_setzero_si128())); + + int mask = _mm_movemask_epi8(needs_escape); + if (mask != 0) { + // Found quotable character - use trailing zero count to find position + size_t offset = ptr - reinterpret_cast<const uint8_t *>(view.data()); + return offset + trailing_zeroes(mask); + } + ptr += 16; + remaining -= 16; + } + + // Scalar fallback for remaining bytes + size_t current = len - remaining; + return find_next_json_quotable_character_scalar(view, current); +} +#elif SIMDJSON_EXPERIMENTAL_HAS_LSX +simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + const size_t len = view.size(); + const uint8_t *ptr = + reinterpret_cast<const uint8_t *>(view.data()) + location; + size_t remaining = len - location; + + //SIMD constants for characters requiring escape + __m128i v34 = __lsx_vreplgr2vr_b(34); // '"' + __m128i v92 = __lsx_vreplgr2vr_b(92); // '\\' + __m128i v32 = __lsx_vreplgr2vr_b(32); // control char threshold + + while (remaining >= 16){ + __m128i word = __lsx_vld(ptr, 0); + + //Check for the quotable characters: '"', '\\', or control char (<32) + __m128i needs_escape = __lsx_vseq_b(word, v34); + needs_escape = __lsx_vor_v(needs_escape, __lsx_vseq_b(word, v92)); + needs_escape = __lsx_vor_v(needs_escape, __lsx_vslt_bu(word, v32)); + + if (!__lsx_bz_v(needs_escape)){ + + //Found quotable character - extract exact byte position + uint64_t lo = __lsx_vpickve2gr_du(needs_escape,0); + uint64_t hi = __lsx_vpickve2gr_du(needs_escape,1); + size_t offset = ptr - reinterpret_cast<const uint8_t *>(view.data()); + if ( lo != 0) { + return offset + trailing_zeroes(lo) / 8; + } else { + return offset + 8 + trailing_zeroes(hi) / 8; + } + } + ptr += 16; + remaining -= 16; + } + size_t current = len - remaining; + return find_next_json_quotable_character_scalar(view, current); +} +#elif SIMDJSON_EXPERIMENTAL_HAS_RVV +simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + const size_t len = view.size(); + const uint8_t *ptr = + reinterpret_cast<const uint8_t *>(view.data()) + location; + size_t remaining = len - location; + + while (remaining > 0) { + size_t vl = __riscv_vsetvl_e8m1(remaining); + vuint8m1_t word = __riscv_vle8_v_u8m1(ptr, vl); + + // Check for quotable characters: '"', '\\', or control chars (< 32) + vbool8_t needs_escape = __riscv_vmseq(word, (uint8_t)34, vl); + needs_escape = __riscv_vmor(needs_escape, + __riscv_vmseq(word, (uint8_t)92, vl), vl); + needs_escape = __riscv_vmor(needs_escape, + __riscv_vmsltu(word, (uint8_t)32, vl), vl); + + long first = __riscv_vfirst(needs_escape, vl); + if (first >= 0) { + size_t offset = ptr - reinterpret_cast<const uint8_t *>(view.data()); + return offset + first; + } + ptr += vl; + remaining -= vl; + } + + return len; +} +#elif SIMDJSON_EXPERIMENTAL_HAS_PPC64 +simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + const size_t len = view.size(); + const uint8_t *ptr = + reinterpret_cast<const uint8_t *>(view.data()) + location; + size_t remaining = len - location; + + // SIMD constants for characters requiring escape + __vector unsigned char v34 = vec_splats((unsigned char)34); // '"' + __vector unsigned char v92 = vec_splats((unsigned char)92); // '\\' + __vector unsigned char v32 = vec_splats((unsigned char)32); // control char threshold + + // Bitmask for vec_vbpermq to extract one bit per byte + const __vector unsigned char perm_mask = {0x78, 0x70, 0x68, 0x60, 0x58, 0x50, + 0x48, 0x40, 0x38, 0x30, 0x28, 0x20, + 0x18, 0x10, 0x08, 0x00}; + + while (remaining >= 16) { + __vector unsigned char word = + vec_vsx_ld(0, reinterpret_cast<const unsigned char *>(ptr)); + + // Check for quotable characters: '"', '\\', or control chars (< 32) + __vector unsigned char needs_escape = + (__vector unsigned char)vec_cmpeq(word, v34); + needs_escape = vec_or(needs_escape, + (__vector unsigned char)vec_cmpeq(word, v92)); + needs_escape = vec_or(needs_escape, + (__vector unsigned char)vec_cmplt(word, v32)); + + __vector unsigned long long result = + (__vector unsigned long long)vec_vbpermq(needs_escape, perm_mask); +#ifdef __LITTLE_ENDIAN__ + unsigned int mask = static_cast<unsigned int>(result[1]); +#else + unsigned int mask = static_cast<unsigned int>(result[0]); +#endif + if (mask != 0) { + size_t offset = ptr - reinterpret_cast<const uint8_t *>(view.data()); + return offset + __builtin_ctz(mask); + } + ptr += 16; + remaining -= 16; + } + + // Scalar fallback for remaining bytes + size_t current = len - remaining; + return find_next_json_quotable_character_scalar(view, current); +} +#else +SIMDJSON_CONSTEXPR_LAMBDA simdjson_inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { + return find_next_json_quotable_character_scalar(view, location); +} +#endif + +SIMDJSON_CONSTEXPR_LAMBDA static std::string_view control_chars[] = { + "\\u0000", "\\u0001", "\\u0002", "\\u0003", "\\u0004", "\\u0005", "\\u0006", + "\\u0007", "\\b", "\\t", "\\n", "\\u000b", "\\f", "\\r", + "\\u000e", "\\u000f", "\\u0010", "\\u0011", "\\u0012", "\\u0013", "\\u0014", + "\\u0015", "\\u0016", "\\u0017", "\\u0018", "\\u0019", "\\u001a", "\\u001b", + "\\u001c", "\\u001d", "\\u001e", "\\u001f"}; + +// All Unicode characters may be placed within the quotation marks, except for +// the characters that MUST be escaped: quotation mark, reverse solidus, and the +// control characters (U+0000 through U+001F). There are two-character sequence +// escape representations of some popular characters: +// \", \\, \b, \f, \n, \r, \t. +SIMDJSON_CONSTEXPR_LAMBDA simdjson_inline void escape_json_char(char c, char *&out) { + if (c == '"') { + memcpy(out, "\\\"", 2); + out += 2; + } else if (c == '\\') { + memcpy(out, "\\\\", 2); + out += 2; + } else { + std::string_view v = control_chars[uint8_t(c)]; + memcpy(out, v.data(), v.size()); + out += v.size(); + } +} + +// Writes the escaped version of input to out, returning the number of bytes +// written. Uses SIMD position finding to locate quotable characters efficiently. +inline size_t write_string_escaped(const std::string_view input, char *out) { + size_t mysize = input.size(); + + // Use SIMD position finder directly - it returns mysize if no escape needed + size_t location = find_next_json_quotable_character(input, 0); + if (location == mysize) { + // Fast path: no escaping needed + memcpy(out, input.data(), input.size()); + return input.size(); + } + + const char *const initout = out; + memcpy(out, input.data(), location); + out += location; + escape_json_char(input[location], out); + location += 1; + while (location < mysize) { + size_t newlocation = find_next_json_quotable_character(input, location); + memcpy(out, input.data() + location, newlocation - location); + out += newlocation - location; + location = newlocation; + if (location == mysize) { + break; + } + escape_json_char(input[location], out); + location += 1; + } + return out - initout; +} + +simdjson_inline string_builder::string_builder(size_t initial_capacity) + : buffer(new(std::nothrow) char[initial_capacity]), position(0), + capacity(buffer.get() != nullptr ? initial_capacity : 0), + is_valid(buffer.get() != nullptr) {} + +simdjson_inline bool string_builder::capacity_check(size_t upcoming_bytes) { + // We use the convention that when is_valid is false, then the capacity and + // the position are 0. + // Most of the time, this function will return true. + if (simdjson_likely(upcoming_bytes <= capacity - position)) { + return true; + } + // check for overflow, most of the time there is no overflow + if (simdjson_unlikely(position + upcoming_bytes < position)) { + return false; + } + // We will rarely get here. + grow_buffer((std::max)(capacity * 2, position + upcoming_bytes)); + // If the buffer allocation failed, we set is_valid to false. + return is_valid; +} + +simdjson_inline void string_builder::grow_buffer(size_t desired_capacity) { + if (!is_valid) { + return; + } + std::unique_ptr<char[]> new_buffer(new (std::nothrow) char[desired_capacity]); + if (new_buffer.get() == nullptr) { + set_valid(false); + return; + } + std::memcpy(new_buffer.get(), buffer.get(), position); + buffer.swap(new_buffer); + capacity = desired_capacity; +} + +simdjson_inline void string_builder::set_valid(bool valid) noexcept { + if (!valid) { + is_valid = false; + capacity = 0; + position = 0; + buffer.reset(); + } else { + is_valid = true; + } +} + +simdjson_inline size_t string_builder::size() const noexcept { + return position; +} + +simdjson_inline void string_builder::append(char c) noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = c; + } +} + +simdjson_inline void string_builder::append_null() noexcept { + constexpr char null_literal[] = "null"; + constexpr size_t null_len = sizeof(null_literal) - 1; + if (capacity_check(null_len)) { + std::memcpy(buffer.get() + position, null_literal, null_len); + position += null_len; + } +} + +simdjson_inline void string_builder::clear() noexcept { + position = 0; + // if it was invalid, we should try to repair it + if (!is_valid) { + capacity = 0; + buffer.reset(); + is_valid = true; + } +} + +namespace internal { + +template <typename number_type, typename = typename std::enable_if< + std::is_unsigned<number_type>::value>::type> +simdjson_really_inline int int_log2(number_type x) { + return 63 - leading_zeroes(uint64_t(x) | 1); +} + +simdjson_really_inline int fast_digit_count_32(uint32_t x) { + static uint64_t table[] = { + 4294967296, 8589934582, 8589934582, 8589934582, 12884901788, + 12884901788, 12884901788, 17179868184, 17179868184, 17179868184, + 21474826480, 21474826480, 21474826480, 21474826480, 25769703776, + 25769703776, 25769703776, 30063771072, 30063771072, 30063771072, + 34349738368, 34349738368, 34349738368, 34349738368, 38554705664, + 38554705664, 38554705664, 41949672960, 41949672960, 41949672960, + 42949672960, 42949672960}; + return uint32_t((x + table[int_log2(x)]) >> 32); +} + +simdjson_really_inline int fast_digit_count_64(uint64_t x) { + static uint64_t table[] = {9, + 99, + 999, + 9999, + 99999, + 999999, + 9999999, + 99999999, + 999999999, + 9999999999, + 99999999999, + 999999999999, + 9999999999999, + 99999999999999, + 999999999999999ULL, + 9999999999999999ULL, + 99999999999999999ULL, + 999999999999999999ULL, + 9999999999999999999ULL}; + int y = (19 * int_log2(x) >> 6); + y += x > table[y]; + return y + 1; +} + +template <typename number_type, typename = typename std::enable_if< + std::is_unsigned<number_type>::value>::type> +simdjson_really_inline size_t digit_count(number_type v) noexcept { + static_assert(sizeof(number_type) == 8 || sizeof(number_type) == 4 || + sizeof(number_type) == 2 || sizeof(number_type) == 1, + "We only support 8-bit, 16-bit, 32-bit and 64-bit numbers"); + SIMDJSON_IF_CONSTEXPR(sizeof(number_type) <= 4) { + return fast_digit_count_32(static_cast<uint32_t>(v)); + } + else { + return fast_digit_count_64(static_cast<uint64_t>(v)); + } +} +static const char decimal_table[200] = { + 0x30, 0x30, 0x30, 0x31, 0x30, 0x32, 0x30, 0x33, 0x30, 0x34, 0x30, 0x35, + 0x30, 0x36, 0x30, 0x37, 0x30, 0x38, 0x30, 0x39, 0x31, 0x30, 0x31, 0x31, + 0x31, 0x32, 0x31, 0x33, 0x31, 0x34, 0x31, 0x35, 0x31, 0x36, 0x31, 0x37, + 0x31, 0x38, 0x31, 0x39, 0x32, 0x30, 0x32, 0x31, 0x32, 0x32, 0x32, 0x33, + 0x32, 0x34, 0x32, 0x35, 0x32, 0x36, 0x32, 0x37, 0x32, 0x38, 0x32, 0x39, + 0x33, 0x30, 0x33, 0x31, 0x33, 0x32, 0x33, 0x33, 0x33, 0x34, 0x33, 0x35, + 0x33, 0x36, 0x33, 0x37, 0x33, 0x38, 0x33, 0x39, 0x34, 0x30, 0x34, 0x31, + 0x34, 0x32, 0x34, 0x33, 0x34, 0x34, 0x34, 0x35, 0x34, 0x36, 0x34, 0x37, + 0x34, 0x38, 0x34, 0x39, 0x35, 0x30, 0x35, 0x31, 0x35, 0x32, 0x35, 0x33, + 0x35, 0x34, 0x35, 0x35, 0x35, 0x36, 0x35, 0x37, 0x35, 0x38, 0x35, 0x39, + 0x36, 0x30, 0x36, 0x31, 0x36, 0x32, 0x36, 0x33, 0x36, 0x34, 0x36, 0x35, + 0x36, 0x36, 0x36, 0x37, 0x36, 0x38, 0x36, 0x39, 0x37, 0x30, 0x37, 0x31, + 0x37, 0x32, 0x37, 0x33, 0x37, 0x34, 0x37, 0x35, 0x37, 0x36, 0x37, 0x37, + 0x37, 0x38, 0x37, 0x39, 0x38, 0x30, 0x38, 0x31, 0x38, 0x32, 0x38, 0x33, + 0x38, 0x34, 0x38, 0x35, 0x38, 0x36, 0x38, 0x37, 0x38, 0x38, 0x38, 0x39, + 0x39, 0x30, 0x39, 0x31, 0x39, 0x32, 0x39, 0x33, 0x39, 0x34, 0x39, 0x35, + 0x39, 0x36, 0x39, 0x37, 0x39, 0x38, 0x39, 0x39, +}; +} // namespace internal + +template <typename number_type, typename> +simdjson_inline void string_builder::append(number_type v) noexcept { + static_assert(std::is_same<number_type, bool>::value || + std::is_integral<number_type>::value || + std::is_floating_point<number_type>::value, + "Unsupported number type"); + // If C++17 is available, we can 'if constexpr' here. + SIMDJSON_IF_CONSTEXPR(std::is_same<number_type, bool>::value) { + if (v) { + constexpr char true_literal[] = "true"; + constexpr size_t true_len = sizeof(true_literal) - 1; + if (capacity_check(true_len)) { + std::memcpy(buffer.get() + position, true_literal, true_len); + position += true_len; + } + } else { + constexpr char false_literal[] = "false"; + constexpr size_t false_len = sizeof(false_literal) - 1; + if (capacity_check(false_len)) { + std::memcpy(buffer.get() + position, false_literal, false_len); + position += false_len; + } + } + } + else SIMDJSON_IF_CONSTEXPR(std::is_unsigned<number_type>::value) { + // Process 4 digits at a time instead of 2, reducing store operations + // and divisions by approximately half for large numbers. + constexpr size_t max_number_size = 20; + if (capacity_check(max_number_size)) { + using unsigned_type = typename std::make_unsigned<number_type>::type; + unsigned_type pv = static_cast<unsigned_type>(v); + size_t dc = internal::digit_count(pv); + char *write_pointer = buffer.get() + position + dc - 1; + + // Process 4 digits per iteration for large numbers + while (pv >= 10000) { + unsigned_type q = pv / 10000; + unsigned_type r = pv % 10000; + unsigned_type r_hi = r / 100; // High 2 digits of remainder + unsigned_type r_lo = r % 100; // Low 2 digits of remainder + // Write low 2 digits first (rightmost), then high 2 digits + memcpy(write_pointer - 1, &internal::decimal_table[r_lo * 2], 2); + memcpy(write_pointer - 3, &internal::decimal_table[r_hi * 2], 2); + write_pointer -= 4; + pv = q; + } + + // Handle remaining 1-4 digits with original 2-digit loop + while (pv >= 100) { + memcpy(write_pointer - 1, &internal::decimal_table[(pv % 100) * 2], 2); + write_pointer -= 2; + pv /= 100; + } + if (pv >= 10) { + *write_pointer-- = char('0' + (pv % 10)); + pv /= 10; + } + *write_pointer = char('0' + pv); + position += dc; + } + } + else SIMDJSON_IF_CONSTEXPR(std::is_integral<number_type>::value) { + // Same 4-digit batching as unsigned path for signed integers + constexpr size_t max_number_size = 20; + if (capacity_check(max_number_size)) { + using unsigned_type = typename std::make_unsigned<number_type>::type; + bool negative = v < 0; + unsigned_type pv = static_cast<unsigned_type>(v); + if (negative) { + pv = 0 - pv; // the 0 is for Microsoft + } + size_t dc = internal::digit_count(pv); + // by always writing the minus sign, we avoid the branch. + buffer.get()[position] = '-'; + position += negative ? 1 : 0; + char *write_pointer = buffer.get() + position + dc - 1; + + // Process 4 digits per iteration for large numbers + while (pv >= 10000) { + unsigned_type q = pv / 10000; + unsigned_type r = pv % 10000; + unsigned_type r_hi = r / 100; + unsigned_type r_lo = r % 100; + memcpy(write_pointer - 1, &internal::decimal_table[r_lo * 2], 2); + memcpy(write_pointer - 3, &internal::decimal_table[r_hi * 2], 2); + write_pointer -= 4; + pv = q; + } + + // Handle remaining 1-4 digits + while (pv >= 100) { + memcpy(write_pointer - 1, &internal::decimal_table[(pv % 100) * 2], 2); + write_pointer -= 2; + pv /= 100; + } + if (pv >= 10) { + *write_pointer-- = char('0' + (pv % 10)); + pv /= 10; + } + *write_pointer = char('0' + pv); + position += dc; + } + } + else SIMDJSON_IF_CONSTEXPR(std::is_floating_point<number_type>::value) { + constexpr size_t max_number_size = 24; + if (capacity_check(max_number_size)) { + // We could specialize for float. + char *end = simdjson::internal::to_chars(buffer.get() + position, nullptr, + double(v)); + position = end - buffer.get(); + } + } +} + +simdjson_inline void +string_builder::escape_and_append(std::string_view input) noexcept { + // escaping might turn a control character into \x00xx so 6 characters. + if (capacity_check(6 * input.size())) { + position += write_string_escaped(input, buffer.get() + position); + } +} + +simdjson_inline void +string_builder::escape_and_append_with_quotes(std::string_view input) noexcept { + // escaping might turn a control character into \x00xx so 6 characters. + if (capacity_check(2 + 6 * input.size())) { + buffer.get()[position++] = '"'; + position += write_string_escaped(input, buffer.get() + position); + buffer.get()[position++] = '"'; + } +} + +simdjson_inline void +string_builder::escape_and_append_with_quotes(char input) noexcept { + // escaping might turn a control character into \x00xx so 6 characters. + if (capacity_check(2 + 6 * 1)) { + buffer.get()[position++] = '"'; + std::string_view cinput(&input, 1); + position += write_string_escaped(cinput, buffer.get() + position); + buffer.get()[position++] = '"'; + } +} + +simdjson_inline void +string_builder::escape_and_append_with_quotes(const char *input) noexcept { + std::string_view cinput(input); + escape_and_append_with_quotes(cinput); +} +#if SIMDJSON_SUPPORTS_CONCEPTS +template <constevalutil::fixed_string key> +simdjson_inline void string_builder::escape_and_append_with_quotes() noexcept { + escape_and_append_with_quotes(constevalutil::string_constant<key>::value); +} +#endif + +simdjson_inline void string_builder::append_raw(const char *c) noexcept { + size_t len = std::strlen(c); + append_raw(c, len); +} + +simdjson_inline void +string_builder::append_raw(std::string_view input) noexcept { + if (capacity_check(input.size())) { + std::memcpy(buffer.get() + position, input.data(), input.size()); + position += input.size(); + } +} + +simdjson_inline void string_builder::append_raw(const char *str, + size_t len) noexcept { + if (capacity_check(len)) { + std::memcpy(buffer.get() + position, str, len); + position += len; + } +} +#if SIMDJSON_SUPPORTS_CONCEPTS +// Support for optional types (std::optional, etc.) +template <concepts::optional_type T> + requires(!require_custom_serialization<T>) +simdjson_inline void string_builder::append(const T &opt) { + if (opt) { + append(*opt); + } else { + append_null(); + } +} + +template <typename T> + requires(require_custom_serialization<T>) +simdjson_inline void string_builder::append(T &&val) { + serialize(*this, std::forward<T>(val)); +} + +template <typename T> + requires(std::is_convertible<T, std::string_view>::value || + std::is_same<T, const char *>::value) +simdjson_inline void string_builder::append(const T &value) { + escape_and_append_with_quotes(value); +} +#endif + +#if SIMDJSON_SUPPORTS_RANGES && SIMDJSON_SUPPORTS_CONCEPTS +// Support for range-based appending (std::ranges::view, etc.) +template <std::ranges::range R> + requires(!std::is_convertible<R, std::string_view>::value && !require_custom_serialization<R>) +simdjson_inline void string_builder::append(const R &range) noexcept { + auto it = std::ranges::begin(range); + auto end = std::ranges::end(range); + if constexpr (concepts::is_pair<std::ranges::range_value_t<R>>) { + start_object(); + + if (it == end) { + end_object(); + return; // Handle empty range + } + // Append first item without leading comma + append_key_value(it->first, it->second); + ++it; + + // Append remaining items with preceding commas + for (; it != end; ++it) { + append_comma(); + append_key_value(it->first, it->second); + } + end_object(); + } else { + start_array(); + if (it == end) { + end_array(); + return; // Handle empty range + } + + // Append first item without leading comma + append(*it); + ++it; + + // Append remaining items with preceding commas + for (; it != end; ++it) { + append_comma(); + append(*it); + } + end_array(); + } +} + +#endif + +#if SIMDJSON_EXCEPTIONS +simdjson_inline string_builder::operator std::string() const noexcept(false) { + return std::string(operator std::string_view()); +} + +simdjson_inline string_builder::operator std::string_view() const + noexcept(false) simdjson_lifetime_bound { + return view(); +} +#endif + +simdjson_inline simdjson_result<std::string_view> +string_builder::view() const noexcept { + if (!is_valid) { + return simdjson::OUT_OF_CAPACITY; + } + return std::string_view(buffer.get(), position); +} + +simdjson_inline simdjson_result<const char *> string_builder::c_str() noexcept { + if (capacity_check(1)) { + buffer.get()[position] = '\0'; + return buffer.get(); + } + return simdjson::OUT_OF_CAPACITY; +} + +simdjson_inline bool string_builder::validate_unicode() const noexcept { + return simdjson::validate_utf8(buffer.get(), position); +} + +simdjson_inline void string_builder::start_object() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '{'; + } +} + +simdjson_inline void string_builder::end_object() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '}'; + } +} + +simdjson_inline void string_builder::start_array() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '['; + } +} + +simdjson_inline void string_builder::end_array() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ']'; + } +} + +simdjson_inline void string_builder::append_comma() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ','; + } +} + +simdjson_inline void string_builder::append_colon() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ':'; + } +} + +template <typename key_type, typename value_type> +simdjson_inline void +string_builder::append_key_value(key_type key, value_type value) noexcept { + static_assert(std::is_same<key_type, const char *>::value || + std::is_convertible<key_type, std::string_view>::value, + "Unsupported key type"); + escape_and_append_with_quotes(key); + append_colon(); + SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, std::nullptr_t>::value) { + append_null(); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, char>::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR( + std::is_convertible<value_type, std::string_view>::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, const char *>::value) { + escape_and_append_with_quotes(value); + } + else { + append(value); + } +} + +#if SIMDJSON_SUPPORTS_CONCEPTS +template <constevalutil::fixed_string key, typename value_type> +simdjson_inline void +string_builder::append_key_value(value_type value) noexcept { + escape_and_append_with_quotes<key>(); + append_colon(); + SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, std::nullptr_t>::value) { + append_null(); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, char>::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR( + std::is_convertible<value_type, std::string_view>::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, const char *>::value) { + escape_and_append_with_quotes(value); + } + else { + append(value); + } +} +#endif + +} // namespace builder +} // namespace rvv_vls +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_STRING_BUILDER_INL_H +/* end file simdjson/generic/builder/json_string_builder-inl.h for rvv_vls */ + +/* end file simdjson/generic/builder/amalgamated.h for rvv_vls */ +/* including simdjson/rvv-vls/end.h: #include "simdjson/rvv-vls/end.h" */ +/* begin file simdjson/rvv-vls/end.h */ +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +/* undefining SIMDJSON_IMPLEMENTATION from "rvv_vls" */ +#undef SIMDJSON_IMPLEMENTATION +/* end file simdjson/rvv-vls/end.h */ + +#endif // SIMDJSON_RVV_VLS_BUILDER_H +/* end file simdjson/rvv-vls/builder.h */ +#else +#error Unknown SIMDJSON_BUILTIN_IMPLEMENTATION +#endif + +/* undefining SIMDJSON_CONDITIONAL_INCLUDE */ +#undef SIMDJSON_CONDITIONAL_INCLUDE + +namespace simdjson { + /** + * @copydoc simdjson::SIMDJSON_BUILTIN_IMPLEMENTATION::builder + */ + namespace builder = SIMDJSON_BUILTIN_IMPLEMENTATION::builder; +} // namespace simdjson + +#endif // SIMDJSON_BUILTIN_BUILDER_H +/* end file simdjson/builtin/builder.h */ + +namespace simdjson { + /** + * @copydoc simdjson::builtin::builder + */ + namespace builder = builtin::builder; + +} // namespace simdjson + +#endif // SIMDJSON_BUILDER_H +/* end file simdjson/builder.h */ +/* including simdjson/ondemand.h: #include "simdjson/ondemand.h" */ +/* begin file simdjson/ondemand.h */ +#ifndef SIMDJSON_ONDEMAND_H +#define SIMDJSON_ONDEMAND_H + +/* including simdjson/builtin/ondemand.h: #include "simdjson/builtin/ondemand.h" */ +/* begin file simdjson/builtin/ondemand.h */ +#ifndef SIMDJSON_BUILTIN_ONDEMAND_H +#define SIMDJSON_BUILTIN_ONDEMAND_H + +/* skipped duplicate #include "simdjson/builtin.h" */ +/* skipped duplicate #include "simdjson/builtin/base.h" */ + +/* including simdjson/generic/ondemand/dependencies.h: #include "simdjson/generic/ondemand/dependencies.h" */ +/* begin file simdjson/generic/ondemand/dependencies.h */ +#ifdef SIMDJSON_CONDITIONAL_INCLUDE +#error simdjson/generic/ondemand/dependencies.h must be included before defining SIMDJSON_CONDITIONAL_INCLUDE! +#endif + +#ifndef SIMDJSON_GENERIC_ONDEMAND_DEPENDENCIES_H +#define SIMDJSON_GENERIC_ONDEMAND_DEPENDENCIES_H + +// Internal headers needed for ondemand generics. +// All includes not under simdjson/generic/ondemand must be here! +// Otherwise, amalgamation will fail. +/* skipped duplicate #include "simdjson/dom/base.h" // for MINIMAL_DOCUMENT_CAPACITY */ +/* skipped duplicate #include "simdjson/implementation.h" */ +/* skipped duplicate #include "simdjson/padded_string.h" */ +/* skipped duplicate #include "simdjson/padded_string_view.h" */ +/* skipped duplicate #include "simdjson/internal/dom_parser_implementation.h" */ +/* skipped duplicate #include "simdjson/jsonpathutil.h" */ + +#endif // SIMDJSON_GENERIC_ONDEMAND_DEPENDENCIES_H +/* end file simdjson/generic/ondemand/dependencies.h */ + +/* defining SIMDJSON_CONDITIONAL_INCLUDE */ +#define SIMDJSON_CONDITIONAL_INCLUDE + +#if SIMDJSON_BUILTIN_IMPLEMENTATION_IS(arm64) +/* including simdjson/arm64/ondemand.h: #include "simdjson/arm64/ondemand.h" */ +/* begin file simdjson/arm64/ondemand.h */ +#ifndef SIMDJSON_ARM64_ONDEMAND_H +#define SIMDJSON_ARM64_ONDEMAND_H + +/* including simdjson/arm64/begin.h: #include "simdjson/arm64/begin.h" */ +/* begin file simdjson/arm64/begin.h */ +/* defining SIMDJSON_IMPLEMENTATION to "arm64" */ +#define SIMDJSON_IMPLEMENTATION arm64 +/* including simdjson/arm64/base.h: #include "simdjson/arm64/base.h" */ +/* begin file simdjson/arm64/base.h */ +#ifndef SIMDJSON_ARM64_BASE_H +#define SIMDJSON_ARM64_BASE_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +/** + * Implementation for NEON (ARMv8). + */ +namespace arm64 { + +class implementation; + +namespace { +namespace simd { +template <typename T> struct simd8; +template <typename T> struct simd8x64; +} // namespace simd +} // unnamed namespace + +} // namespace arm64 +} // namespace simdjson + +#endif // SIMDJSON_ARM64_BASE_H +/* end file simdjson/arm64/base.h */ +/* including simdjson/arm64/intrinsics.h: #include "simdjson/arm64/intrinsics.h" */ +/* begin file simdjson/arm64/intrinsics.h */ +#ifndef SIMDJSON_ARM64_INTRINSICS_H +#define SIMDJSON_ARM64_INTRINSICS_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +// This should be the correct header whether +// you use visual studio or other compilers. +#include <arm_neon.h> + +static_assert(sizeof(uint8x16_t) <= simdjson::SIMDJSON_PADDING, "insufficient padding for arm64"); + +#endif // SIMDJSON_ARM64_INTRINSICS_H +/* end file simdjson/arm64/intrinsics.h */ +/* including simdjson/arm64/bitmanipulation.h: #include "simdjson/arm64/bitmanipulation.h" */ +/* begin file simdjson/arm64/bitmanipulation.h */ +#ifndef SIMDJSON_ARM64_BITMANIPULATION_H +#define SIMDJSON_ARM64_BITMANIPULATION_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/arm64/intrinsics.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace arm64 { +namespace { + +// We sometimes call trailing_zero on inputs that are zero, +// but the algorithms do not end up using the returned value. +// Sadly, sanitizers are not smart enough to figure it out. +SIMDJSON_NO_SANITIZE_UNDEFINED +// This function can be used safely even if not all bytes have been +// initialized. +// See issue https://github.com/simdjson/simdjson/issues/1965 +SIMDJSON_NO_SANITIZE_MEMORY +simdjson_inline int trailing_zeroes(uint64_t input_num) { +#if SIMDJSON_REGULAR_VISUAL_STUDIO + unsigned long ret; + // Search the mask data from least significant bit (LSB) + // to the most significant bit (MSB) for a set bit (1). + _BitScanForward64(&ret, input_num); + return (int)ret; +#else // SIMDJSON_REGULAR_VISUAL_STUDIO + return __builtin_ctzll(input_num); +#endif // SIMDJSON_REGULAR_VISUAL_STUDIO +} + +/* result might be undefined when input_num is zero */ +simdjson_inline uint64_t clear_lowest_bit(uint64_t input_num) { + return input_num & (input_num-1); +} + +// We sometimes call leading_zeroes on inputs that are zero, +// but the algorithms do not end up using the returned value. +// Sadly, sanitizers are not smart enough to figure it out. +// Applies only when SIMDJSON_PREFER_REVERSE_BITS is defined and true. +// (See below.) +SIMDJSON_NO_SANITIZE_UNDEFINED +/* result might be undefined when input_num is zero */ +simdjson_inline int leading_zeroes(uint64_t input_num) { +#if SIMDJSON_REGULAR_VISUAL_STUDIO + unsigned long leading_zero = 0; + // Search the mask data from most significant bit (MSB) + // to least significant bit (LSB) for a set bit (1). + if (_BitScanReverse64(&leading_zero, input_num)) + return (int)(63 - leading_zero); + else + return 64; +#else + return __builtin_clzll(input_num); +#endif// SIMDJSON_REGULAR_VISUAL_STUDIO +} + +/* result might be undefined when input_num is zero */ +simdjson_inline int count_ones(uint64_t input_num) { + return vaddv_u8(vcnt_u8(vcreate_u8(input_num))); +} + + +#if defined(__GNUC__) // catches clang and gcc +/** + * ARM has a fast 64-bit "bit reversal function" that is handy. However, + * it is not generally available as an intrinsic function under Visual + * Studio (though this might be changing). Even under clang/gcc, we + * apparently need to invoke inline assembly. + */ +/* + * We use SIMDJSON_PREFER_REVERSE_BITS as a hint that algorithms that + * work well with bit reversal may use it. + */ +#define SIMDJSON_PREFER_REVERSE_BITS 1 + +/* reverse the bits */ +simdjson_inline uint64_t reverse_bits(uint64_t input_num) { + uint64_t rev_bits; + __asm("rbit %0, %1" : "=r"(rev_bits) : "r"(input_num)); + return rev_bits; +} + +/** + * Flips bit at index 63 - lz. Thus if you have 'leading_zeroes' leading zeroes, + * then this will set to zero the leading bit. It is possible for leading_zeroes to be + * greating or equal to 63 in which case we trigger undefined behavior, but the output + * of such undefined behavior is never used. + **/ +SIMDJSON_NO_SANITIZE_UNDEFINED +simdjson_inline uint64_t zero_leading_bit(uint64_t rev_bits, int leading_zeroes) { + return rev_bits ^ (uint64_t(0x8000000000000000) >> leading_zeroes); +} + +#endif + +simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2, uint64_t *result) { +#if SIMDJSON_REGULAR_VISUAL_STUDIO + *result = value1 + value2; + return *result < value1; +#else + return __builtin_uaddll_overflow(value1, value2, + reinterpret_cast<unsigned long long *>(result)); +#endif +} + +} // unnamed namespace +} // namespace arm64 +} // namespace simdjson + +#endif // SIMDJSON_ARM64_BITMANIPULATION_H +/* end file simdjson/arm64/bitmanipulation.h */ +/* including simdjson/arm64/bitmask.h: #include "simdjson/arm64/bitmask.h" */ +/* begin file simdjson/arm64/bitmask.h */ +#ifndef SIMDJSON_ARM64_BITMASK_H +#define SIMDJSON_ARM64_BITMASK_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace arm64 { +namespace { + +// +// Perform a "cumulative bitwise xor," flipping bits each time a 1 is encountered. +// +// For example, prefix_xor(00100100) == 00011100 +// +simdjson_inline uint64_t prefix_xor(uint64_t bitmask) { + ///////////// + // We could do this with PMULL, but it is apparently slow. + // + //#ifdef __ARM_FEATURE_CRYPTO // some ARM processors lack this extension + //return vmull_p64(-1ULL, bitmask); + //#else + // Analysis by @sebpop: + // When diffing the assembly for src/stage1_find_marks.cpp I see that the eors are all spread out + // in between other vector code, so effectively the extra cycles of the sequence do not matter + // because the GPR units are idle otherwise and the critical path is on the FP side. + // Also the PMULL requires two extra fmovs: GPR->FP (3 cycles in N1, 5 cycles in A72 ) + // and FP->GPR (2 cycles on N1 and 5 cycles on A72.) + /////////// + bitmask ^= bitmask << 1; + bitmask ^= bitmask << 2; + bitmask ^= bitmask << 4; + bitmask ^= bitmask << 8; + bitmask ^= bitmask << 16; + bitmask ^= bitmask << 32; + return bitmask; +} + +} // unnamed namespace +} // namespace arm64 +} // namespace simdjson + +#endif +/* end file simdjson/arm64/bitmask.h */ +/* including simdjson/arm64/numberparsing_defs.h: #include "simdjson/arm64/numberparsing_defs.h" */ +/* begin file simdjson/arm64/numberparsing_defs.h */ +#ifndef SIMDJSON_ARM64_NUMBERPARSING_DEFS_H +#define SIMDJSON_ARM64_NUMBERPARSING_DEFS_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/arm64/intrinsics.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#include <cstring> + +#if SIMDJSON_REGULAR_VISUAL_STUDIO && SIMDJSON_IS_ARM64 +// __umulh requires intrin.h +#include <intrin.h> +#endif // SIMDJSON_REGULAR_VISUAL_STUDIO && SIMDJSON_IS_ARM64 + +namespace simdjson { +namespace arm64 { +namespace numberparsing { + +// we don't have SSE, so let us use a scalar function +// credit: https://johnnylee-sde.github.io/Fast-numeric-string-to-int/ +/** @private */ +static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) { + uint64_t val; + std::memcpy(&val, chars, sizeof(uint64_t)); + val = (val & 0x0F0F0F0F0F0F0F0F) * 2561 >> 8; + val = (val & 0x00FF00FF00FF00FF) * 6553601 >> 16; + return uint32_t((val & 0x0000FFFF0000FFFF) * 42949672960001 >> 32); +} + +simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) { + internal::value128 answer; +#if SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS +#if SIMDJSON_IS_ARM64 + // ARM64 has native support for 64-bit multiplications, no need to emultate + answer.high = __umulh(value1, value2); + answer.low = value1 * value2; +#else + answer.low = _umul128(value1, value2, &answer.high); // _umul128 not available on ARM64 +#endif // SIMDJSON_IS_ARM64 +#else // SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS + __uint128_t r = (static_cast<__uint128_t>(value1)) * value2; + answer.low = uint64_t(r); + answer.high = uint64_t(r >> 64); +#endif + return answer; +} + +} // namespace numberparsing +} // namespace arm64 +} // namespace simdjson + +#ifndef SIMDJSON_SWAR_NUMBER_PARSING +#if SIMDJSON_IS_BIG_ENDIAN +#define SIMDJSON_SWAR_NUMBER_PARSING 0 +#else +#define SIMDJSON_SWAR_NUMBER_PARSING 1 +#endif +#endif + +#endif // SIMDJSON_ARM64_NUMBERPARSING_DEFS_H +/* end file simdjson/arm64/numberparsing_defs.h */ +/* including simdjson/arm64/simd.h: #include "simdjson/arm64/simd.h" */ +/* begin file simdjson/arm64/simd.h */ +#ifndef SIMDJSON_ARM64_SIMD_H +#define SIMDJSON_ARM64_SIMD_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/arm64/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace arm64 { +namespace { +namespace simd { + +#if SIMDJSON_REGULAR_VISUAL_STUDIO +namespace { +// Start of private section with Visual Studio workaround + + +#ifndef simdjson_make_uint8x16_t +#define simdjson_make_uint8x16_t(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, \ + x13, x14, x15, x16) \ + ([=]() { \ + uint8_t array[16] = {x1, x2, x3, x4, x5, x6, x7, x8, \ + x9, x10, x11, x12, x13, x14, x15, x16}; \ + return vld1q_u8(array); \ + }()) +#endif +#ifndef simdjson_make_int8x16_t +#define simdjson_make_int8x16_t(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, \ + x13, x14, x15, x16) \ + ([=]() { \ + int8_t array[16] = {x1, x2, x3, x4, x5, x6, x7, x8, \ + x9, x10, x11, x12, x13, x14, x15, x16}; \ + return vld1q_s8(array); \ + }()) +#endif + +#ifndef simdjson_make_uint8x8_t +#define simdjson_make_uint8x8_t(x1, x2, x3, x4, x5, x6, x7, x8) \ + ([=]() { \ + uint8_t array[8] = {x1, x2, x3, x4, x5, x6, x7, x8}; \ + return vld1_u8(array); \ + }()) +#endif +#ifndef simdjson_make_int8x8_t +#define simdjson_make_int8x8_t(x1, x2, x3, x4, x5, x6, x7, x8) \ + ([=]() { \ + int8_t array[8] = {x1, x2, x3, x4, x5, x6, x7, x8}; \ + return vld1_s8(array); \ + }()) +#endif +#ifndef simdjson_make_uint16x8_t +#define simdjson_make_uint16x8_t(x1, x2, x3, x4, x5, x6, x7, x8) \ + ([=]() { \ + uint16_t array[8] = {x1, x2, x3, x4, x5, x6, x7, x8}; \ + return vld1q_u16(array); \ + }()) +#endif +#ifndef simdjson_make_int16x8_t +#define simdjson_make_int16x8_t(x1, x2, x3, x4, x5, x6, x7, x8) \ + ([=]() { \ + int16_t array[8] = {x1, x2, x3, x4, x5, x6, x7, x8}; \ + return vld1q_s16(array); \ + }()) +#endif + +// End of private section with Visual Studio workaround +} // namespace +#endif // SIMDJSON_REGULAR_VISUAL_STUDIO + + + template<typename T> + struct simd8; + + // + // Base class of simd8<uint8_t> and simd8<bool>, both of which use uint8x16_t internally. + // + template<typename T, typename Mask=simd8<bool>> + struct base_u8 { + uint8x16_t value; + static const int SIZE = sizeof(value); + + // Conversion from/to SIMD register + simdjson_inline base_u8(const uint8x16_t _value) : value(_value) {} + simdjson_inline operator const uint8x16_t&() const { return this->value; } + simdjson_inline operator uint8x16_t&() { return this->value; } + + // Bit operations + simdjson_inline simd8<T> operator|(const simd8<T> other) const { return vorrq_u8(*this, other); } + simdjson_inline simd8<T> operator&(const simd8<T> other) const { return vandq_u8(*this, other); } + simdjson_inline simd8<T> operator^(const simd8<T> other) const { return veorq_u8(*this, other); } + simdjson_inline simd8<T> bit_andnot(const simd8<T> other) const { return vbicq_u8(*this, other); } + simdjson_inline simd8<T> operator~() const { return *this ^ 0xFFu; } + simdjson_inline simd8<T>& operator|=(const simd8<T> other) { auto this_cast = static_cast<simd8<T>*>(this); *this_cast = *this_cast | other; return *this_cast; } + simdjson_inline simd8<T>& operator&=(const simd8<T> other) { auto this_cast = static_cast<simd8<T>*>(this); *this_cast = *this_cast & other; return *this_cast; } + simdjson_inline simd8<T>& operator^=(const simd8<T> other) { auto this_cast = static_cast<simd8<T>*>(this); *this_cast = *this_cast ^ other; return *this_cast; } + + friend simdjson_inline Mask operator==(const simd8<T> lhs, const simd8<T> rhs) { return vceqq_u8(lhs, rhs); } + + template<int N=1> + simdjson_inline simd8<T> prev(const simd8<T> prev_chunk) const { + return vextq_u8(prev_chunk, *this, 16 - N); + } + }; + + // SIMD byte mask type (returned by things like eq and gt) + template<> + struct simd8<bool>: base_u8<bool> { + typedef uint16_t bitmask_t; + typedef uint32_t bitmask2_t; + + static simdjson_inline simd8<bool> splat(bool _value) { return vmovq_n_u8(uint8_t(-(!!_value))); } + + simdjson_inline simd8(const uint8x16_t _value) : base_u8<bool>(_value) {} + // False constructor + simdjson_inline simd8() : simd8(vdupq_n_u8(0)) {} + // Splat constructor + simdjson_inline simd8(bool _value) : simd8(splat(_value)) {} + + // We return uint32_t instead of uint16_t because that seems to be more efficient for most + // purposes (cutting it down to uint16_t costs performance in some compilers). + simdjson_inline uint32_t to_bitmask() const { +#if SIMDJSON_REGULAR_VISUAL_STUDIO + const uint8x16_t bit_mask = simdjson_make_uint8x16_t(0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, + 0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80); +#else + const uint8x16_t bit_mask = {0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, + 0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80}; +#endif + auto minput = *this & bit_mask; + uint8x16_t tmp = vpaddq_u8(minput, minput); + tmp = vpaddq_u8(tmp, tmp); + tmp = vpaddq_u8(tmp, tmp); + return vgetq_lane_u16(vreinterpretq_u16_u8(tmp), 0); + } + // Returns 4-bit out of each byte, alternating between the high 4 bits and low + // bits result it is 64 bit. + simdjson_inline uint64_t to_bitmask64() const { + return vget_lane_u64( + vreinterpret_u64_u8(vshrn_n_u16(vreinterpretq_u16_u8(*this), 4)), 0); + } + simdjson_inline bool any() const { return vmaxvq_u32(vreinterpretq_u32_u8(*this)) != 0; } + }; + + // Unsigned bytes + template<> + struct simd8<uint8_t>: base_u8<uint8_t> { + static simdjson_inline uint8x16_t splat(uint8_t _value) { return vmovq_n_u8(_value); } + static simdjson_inline uint8x16_t zero() { return vdupq_n_u8(0); } + static simdjson_inline uint8x16_t load(const uint8_t* values) { return vld1q_u8(values); } + + simdjson_inline simd8(const uint8x16_t _value) : base_u8<uint8_t>(_value) {} + // Zero constructor + simdjson_inline simd8() : simd8(zero()) {} + // Array constructor + simdjson_inline simd8(const uint8_t values[16]) : simd8(load(values)) {} + // Splat constructor + simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {} + // Member-by-member initialization +#if SIMDJSON_REGULAR_VISUAL_STUDIO + simdjson_inline simd8( + uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, + uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 + ) : simd8(simdjson_make_uint8x16_t( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + )) {} +#else + simdjson_inline simd8( + uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, + uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 + ) : simd8(uint8x16_t{ + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + }) {} +#endif + + // Repeat 16 values as many times as necessary (usually for lookup tables) + simdjson_inline static simd8<uint8_t> repeat_16( + uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, + uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 + ) { + return simd8<uint8_t>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + ); + } + + // Store to array + simdjson_inline void store(uint8_t dst[16]) const { return vst1q_u8(dst, *this); } + + // Saturated math + simdjson_inline simd8<uint8_t> saturating_add(const simd8<uint8_t> other) const { return vqaddq_u8(*this, other); } + simdjson_inline simd8<uint8_t> saturating_sub(const simd8<uint8_t> other) const { return vqsubq_u8(*this, other); } + + // Addition/subtraction are the same for signed and unsigned + simdjson_inline simd8<uint8_t> operator+(const simd8<uint8_t> other) const { return vaddq_u8(*this, other); } + simdjson_inline simd8<uint8_t> operator-(const simd8<uint8_t> other) const { return vsubq_u8(*this, other); } + simdjson_inline simd8<uint8_t>& operator+=(const simd8<uint8_t> other) { *this = *this + other; return *this; } + simdjson_inline simd8<uint8_t>& operator-=(const simd8<uint8_t> other) { *this = *this - other; return *this; } + + // Order-specific operations + simdjson_inline uint8_t max_val() const { return vmaxvq_u8(*this); } + simdjson_inline uint8_t min_val() const { return vminvq_u8(*this); } + simdjson_inline simd8<uint8_t> max_val(const simd8<uint8_t> other) const { return vmaxq_u8(*this, other); } + simdjson_inline simd8<uint8_t> min_val(const simd8<uint8_t> other) const { return vminq_u8(*this, other); } + simdjson_inline simd8<bool> operator<=(const simd8<uint8_t> other) const { return vcleq_u8(*this, other); } + simdjson_inline simd8<bool> operator>=(const simd8<uint8_t> other) const { return vcgeq_u8(*this, other); } + simdjson_inline simd8<bool> operator<(const simd8<uint8_t> other) const { return vcltq_u8(*this, other); } + simdjson_inline simd8<bool> operator>(const simd8<uint8_t> other) const { return vcgtq_u8(*this, other); } + // Same as >, but instead of guaranteeing all 1's == true, false = 0 and true = nonzero. For ARM, returns all 1's. + simdjson_inline simd8<uint8_t> gt_bits(const simd8<uint8_t> other) const { return simd8<uint8_t>(*this > other); } + // Same as <, but instead of guaranteeing all 1's == true, false = 0 and true = nonzero. For ARM, returns all 1's. + simdjson_inline simd8<uint8_t> lt_bits(const simd8<uint8_t> other) const { return simd8<uint8_t>(*this < other); } + + // Bit-specific operations + simdjson_inline simd8<bool> any_bits_set(simd8<uint8_t> bits) const { return vtstq_u8(*this, bits); } + simdjson_inline bool any_bits_set_anywhere() const { return vmaxvq_u32(vreinterpretq_u32_u8(*this)) != 0; } + simdjson_inline bool any_bits_set_anywhere(simd8<uint8_t> bits) const { return (*this & bits).any_bits_set_anywhere(); } + template<int N> + simdjson_inline simd8<uint8_t> shr() const { return vshrq_n_u8(*this, N); } + template<int N> + simdjson_inline simd8<uint8_t> shl() const { return vshlq_n_u8(*this, N); } + + // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values) + template<typename L> + simdjson_inline simd8<L> lookup_16(simd8<L> lookup_table) const { + return lookup_table.apply_lookup_16_to(*this); + } + + // Returns 4-bit out of each byte, alternating between the high 4 bits and low + // bits result it is 64 bit. + simdjson_inline uint64_t to_bitmask64() const { + return vget_lane_u64( + vreinterpret_u64_u8(vshrn_n_u16(vreinterpretq_u16_u8(*this), 4)), 0); + } + // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted as a bitset). + // Passing a 0 value for mask would be equivalent to writing out every byte to output. + // Only the first 16 - count_ones(mask) bytes of the result are significant but 16 bytes + // get written. + // Design consideration: it seems like a function with the + // signature simd8<L> compress(uint16_t mask) would be + // sensible, but the AVX ISA makes this kind of approach difficult. + template<typename L> + simdjson_inline void compress(uint16_t mask, L * output) const { + using internal::thintable_epi8; + using internal::BitsSetTable256mul2; + using internal::pshufb_combine_table; + // this particular implementation was inspired by work done by @animetosho + // we do it in two steps, first 8 bytes and then second 8 bytes + uint8_t mask1 = uint8_t(mask); // least significant 8 bits + uint8_t mask2 = uint8_t(mask >> 8); // most significant 8 bits + // next line just loads the 64-bit values thintable_epi8[mask1] and + // thintable_epi8[mask2] into a 128-bit register, using only + // two instructions on most compilers. + uint64x2_t shufmask64 = {thintable_epi8[mask1], thintable_epi8[mask2]}; + uint8x16_t shufmask = vreinterpretq_u8_u64(shufmask64); + // we increment by 0x08 the second half of the mask +#if SIMDJSON_REGULAR_VISUAL_STUDIO + uint8x16_t inc = simdjson_make_uint8x16_t(0, 0, 0, 0, 0, 0, 0, 0, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08); +#else + uint8x16_t inc = {0, 0, 0, 0, 0, 0, 0, 0, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08}; +#endif + shufmask = vaddq_u8(shufmask, inc); + // this is the version "nearly pruned" + uint8x16_t pruned = vqtbl1q_u8(*this, shufmask); + // we still need to put the two halves together. + // we compute the popcount of the first half: + int pop1 = BitsSetTable256mul2[mask1]; + // then load the corresponding mask, what it does is to write + // only the first pop1 bytes from the first 8 bytes, and then + // it fills in with the bytes from the second 8 bytes + some filling + // at the end. + uint8x16_t compactmask = vld1q_u8(reinterpret_cast<const uint8_t *>(pshufb_combine_table + pop1 * 8)); + uint8x16_t answer = vqtbl1q_u8(pruned, compactmask); + vst1q_u8(reinterpret_cast<uint8_t*>(output), answer); + } + + // Copies all bytes corresponding to a 0 in the low half of the mask (interpreted as a + // bitset) to output1, then those corresponding to a 0 in the high half to output2. + template<typename L> + simdjson_inline void compress_halves(uint16_t mask, L *output1, L *output2) const { + using internal::thintable_epi8; + uint8_t mask1 = uint8_t(mask); // least significant 8 bits + uint8_t mask2 = uint8_t(mask >> 8); // most significant 8 bits + uint8x8_t compactmask1 = vcreate_u8(thintable_epi8[mask1]); + uint8x8_t compactmask2 = vcreate_u8(thintable_epi8[mask2]); + // we increment by 0x08 the second half of the mask +#if SIMDJSON_REGULAR_VISUAL_STUDIO + uint8x8_t inc = simdjson_make_uint8x8_t(0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08); +#else + uint8x8_t inc = {0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08}; +#endif + compactmask2 = vadd_u8(compactmask2, inc); + // store each result (with the second store possibly overlapping the first) + vst1_u8((uint8_t*)output1, vqtbl1_u8(*this, compactmask1)); + vst1_u8((uint8_t*)output2, vqtbl1_u8(*this, compactmask2)); + } + + template<typename L> + simdjson_inline simd8<L> lookup_16( + L replace0, L replace1, L replace2, L replace3, + L replace4, L replace5, L replace6, L replace7, + L replace8, L replace9, L replace10, L replace11, + L replace12, L replace13, L replace14, L replace15) const { + return lookup_16(simd8<L>::repeat_16( + replace0, replace1, replace2, replace3, + replace4, replace5, replace6, replace7, + replace8, replace9, replace10, replace11, + replace12, replace13, replace14, replace15 + )); + } + + template<typename T> + simdjson_inline simd8<uint8_t> apply_lookup_16_to(const simd8<T> original) { + return vqtbl1q_u8(*this, simd8<uint8_t>(original)); + } + }; + + // Signed bytes + template<> + struct simd8<int8_t> { + int8x16_t value; + + static simdjson_inline simd8<int8_t> splat(int8_t _value) { return vmovq_n_s8(_value); } + static simdjson_inline simd8<int8_t> zero() { return vdupq_n_s8(0); } + static simdjson_inline simd8<int8_t> load(const int8_t values[16]) { return vld1q_s8(values); } + + // Conversion from/to SIMD register + simdjson_inline simd8(const int8x16_t _value) : value{_value} {} + simdjson_inline operator const int8x16_t&() const { return this->value; } + simdjson_inline operator int8x16_t&() { return this->value; } + + // Zero constructor + simdjson_inline simd8() : simd8(zero()) {} + // Splat constructor + simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {} + // Array constructor + simdjson_inline simd8(const int8_t* values) : simd8(load(values)) {} + // Member-by-member initialization +#if SIMDJSON_REGULAR_VISUAL_STUDIO + simdjson_inline simd8( + int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, + int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 + ) : simd8(simdjson_make_int8x16_t( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + )) {} +#else + simdjson_inline simd8( + int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, + int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 + ) : simd8(int8x16_t{ + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + }) {} +#endif + // Repeat 16 values as many times as necessary (usually for lookup tables) + simdjson_inline static simd8<int8_t> repeat_16( + int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, + int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 + ) { + return simd8<int8_t>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + ); + } + + // Store to array + simdjson_inline void store(int8_t dst[16]) const { return vst1q_s8(dst, *this); } + + // Explicit conversion to/from unsigned + // + // Under Visual Studio/ARM64 uint8x16_t and int8x16_t are apparently the same type. + // In theory, we could check this occurrence with std::same_as and std::enabled_if but it is C++14 + // and relatively ugly and hard to read. +#ifndef SIMDJSON_REGULAR_VISUAL_STUDIO + simdjson_inline explicit simd8(const uint8x16_t other): simd8(vreinterpretq_s8_u8(other)) {} +#endif + simdjson_inline explicit operator simd8<uint8_t>() const { return vreinterpretq_u8_s8(this->value); } + + // Math + simdjson_inline simd8<int8_t> operator+(const simd8<int8_t> other) const { return vaddq_s8(*this, other); } + simdjson_inline simd8<int8_t> operator-(const simd8<int8_t> other) const { return vsubq_s8(*this, other); } + simdjson_inline simd8<int8_t>& operator+=(const simd8<int8_t> other) { *this = *this + other; return *this; } + simdjson_inline simd8<int8_t>& operator-=(const simd8<int8_t> other) { *this = *this - other; return *this; } + + // Order-sensitive comparisons + simdjson_inline simd8<int8_t> max_val(const simd8<int8_t> other) const { return vmaxq_s8(*this, other); } + simdjson_inline simd8<int8_t> min_val(const simd8<int8_t> other) const { return vminq_s8(*this, other); } + simdjson_inline simd8<bool> operator>(const simd8<int8_t> other) const { return vcgtq_s8(*this, other); } + simdjson_inline simd8<bool> operator<(const simd8<int8_t> other) const { return vcltq_s8(*this, other); } + simdjson_inline simd8<bool> operator==(const simd8<int8_t> other) const { return vceqq_s8(*this, other); } + + template<int N=1> + simdjson_inline simd8<int8_t> prev(const simd8<int8_t> prev_chunk) const { + return vextq_s8(prev_chunk, *this, 16 - N); + } + + // Perform a lookup assuming no value is larger than 16 + template<typename L> + simdjson_inline simd8<L> lookup_16(simd8<L> lookup_table) const { + return lookup_table.apply_lookup_16_to(*this); + } + template<typename L> + simdjson_inline simd8<L> lookup_16( + L replace0, L replace1, L replace2, L replace3, + L replace4, L replace5, L replace6, L replace7, + L replace8, L replace9, L replace10, L replace11, + L replace12, L replace13, L replace14, L replace15) const { + return lookup_16(simd8<L>::repeat_16( + replace0, replace1, replace2, replace3, + replace4, replace5, replace6, replace7, + replace8, replace9, replace10, replace11, + replace12, replace13, replace14, replace15 + )); + } + + template<typename T> + simdjson_inline simd8<int8_t> apply_lookup_16_to(const simd8<T> original) { + return vqtbl1q_s8(*this, simd8<uint8_t>(original)); + } + }; + + template<typename T> + struct simd8x64 { + static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<T>); + static_assert(NUM_CHUNKS == 4, "ARM kernel should use four registers per 64-byte block."); + const simd8<T> chunks[NUM_CHUNKS]; + template<int idx> simd8<uint8_t> get() const { return idx < NUM_CHUNKS ? chunks[idx] : simd8<T>(); } + + simd8x64(const simd8x64<T>& o) = delete; // no copy allowed + simd8x64<T>& operator=(const simd8<T>& other) = delete; // no assignment allowed + simd8x64() = delete; // no default constructor allowed + + simdjson_inline simd8x64(const simd8<T> chunk0, const simd8<T> chunk1, const simd8<T> chunk2, const simd8<T> chunk3) : chunks{chunk0, chunk1, chunk2, chunk3} {} + simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8<T>::load(ptr), simd8<T>::load(ptr+16), simd8<T>::load(ptr+32), simd8<T>::load(ptr+48)} {} + + simdjson_inline void store(T ptr[64]) const { + this->chunks[0].store(ptr+sizeof(simd8<T>)*0); + this->chunks[1].store(ptr+sizeof(simd8<T>)*1); + this->chunks[2].store(ptr+sizeof(simd8<T>)*2); + this->chunks[3].store(ptr+sizeof(simd8<T>)*3); + } + + simdjson_inline simd8<T> reduce_or() const { + return (this->chunks[0] | this->chunks[1]) | (this->chunks[2] | this->chunks[3]); + } + + + simdjson_inline uint64_t compress(uint64_t mask, T * output) const { + uint64_t popcounts = vget_lane_u64(vreinterpret_u64_u8(vcnt_u8(vcreate_u8(~mask))), 0); + // compute the prefix sum of the popcounts of each byte + uint64_t offsets = popcounts * 0x0101010101010101; + this->chunks[0].compress_halves(uint16_t(mask), output, &output[popcounts & 0xFF]); + this->chunks[1].compress_halves(uint16_t(mask >> 16), &output[(offsets >> 8) & 0xFF], &output[(offsets >> 16) & 0xFF]); + this->chunks[2].compress_halves(uint16_t(mask >> 32), &output[(offsets >> 24) & 0xFF], &output[(offsets >> 32) & 0xFF]); + this->chunks[3].compress_halves(uint16_t(mask >> 48), &output[(offsets >> 40) & 0xFF], &output[(offsets >> 48) & 0xFF]); + return offsets >> 56; + } + + simdjson_inline uint64_t to_bitmask() const { +#if SIMDJSON_REGULAR_VISUAL_STUDIO + const uint8x16_t bit_mask = simdjson_make_uint8x16_t( + 0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, + 0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80 + ); +#else + const uint8x16_t bit_mask = { + 0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, + 0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80 + }; +#endif + // Add each of the elements next to each other, successively, to stuff each 8 byte mask into one. + uint8x16_t sum0 = vpaddq_u8(this->chunks[0] & bit_mask, this->chunks[1] & bit_mask); + uint8x16_t sum1 = vpaddq_u8(this->chunks[2] & bit_mask, this->chunks[3] & bit_mask); + sum0 = vpaddq_u8(sum0, sum1); + sum0 = vpaddq_u8(sum0, sum0); + return vgetq_lane_u64(vreinterpretq_u64_u8(sum0), 0); + } + + simdjson_inline uint64_t eq(const T m) const { + const simd8<T> mask = simd8<T>::splat(m); + return simd8x64<bool>( + this->chunks[0] == mask, + this->chunks[1] == mask, + this->chunks[2] == mask, + this->chunks[3] == mask + ).to_bitmask(); + } + + simdjson_inline uint64_t lteq(const T m) const { + const simd8<T> mask = simd8<T>::splat(m); + return simd8x64<bool>( + this->chunks[0] <= mask, + this->chunks[1] <= mask, + this->chunks[2] <= mask, + this->chunks[3] <= mask + ).to_bitmask(); + } + }; // struct simd8x64<T> + +} // namespace simd +} // unnamed namespace +} // namespace arm64 +} // namespace simdjson + +#endif // SIMDJSON_ARM64_SIMD_H +/* end file simdjson/arm64/simd.h */ +/* including simdjson/arm64/stringparsing_defs.h: #include "simdjson/arm64/stringparsing_defs.h" */ +/* begin file simdjson/arm64/stringparsing_defs.h */ +#ifndef SIMDJSON_ARM64_STRINGPARSING_DEFS_H +#define SIMDJSON_ARM64_STRINGPARSING_DEFS_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/arm64/simd.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/arm64/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace arm64 { +namespace { + +using namespace simd; + +// Holds backslashes and quotes locations. +struct backslash_and_quote { +public: + static constexpr uint32_t BYTES_PROCESSED = 32; + simdjson_inline backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst); + + simdjson_inline bool has_quote_first() { return ((bs_bits - 1) & quote_bits) != 0; } + simdjson_inline bool has_backslash() { return bs_bits != 0; } + simdjson_inline int quote_index() { return trailing_zeroes(quote_bits); } + simdjson_inline int backslash_index() { return trailing_zeroes(bs_bits); } + + uint32_t bs_bits; + uint32_t quote_bits; +}; // struct backslash_and_quote + +simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) { + // this can read up to 31 bytes beyond the buffer size, but we require + // SIMDJSON_PADDING of padding + static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "backslash and quote finder must process fewer than SIMDJSON_PADDING bytes"); + simd8<uint8_t> v0(src); + simd8<uint8_t> v1(src + sizeof(v0)); + v0.store(dst); + v1.store(dst + sizeof(v0)); + + // Getting a 64-bit bitmask is much cheaper than multiple 16-bit bitmasks on ARM; therefore, we + // smash them together into a 64-byte mask and get the bitmask from there. + uint64_t bs_and_quote = simd8x64<bool>(v0 == '\\', v1 == '\\', v0 == '"', v1 == '"').to_bitmask(); + return { + uint32_t(bs_and_quote), // bs_bits + uint32_t(bs_and_quote >> 32) // quote_bits + }; +} + +struct escaping { + static constexpr uint32_t BYTES_PROCESSED = 16; + simdjson_inline static escaping copy_and_find(const uint8_t *src, uint8_t *dst); + + simdjson_inline bool has_escape() { return escape_bits != 0; } + simdjson_inline int escape_index() { return trailing_zeroes(escape_bits) / 4; } + + uint64_t escape_bits; +}; // struct escaping + + + +simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *dst) { + static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "escaping finder must process fewer than SIMDJSON_PADDING bytes"); + simd8<uint8_t> v(src); + v.store(dst); + simd8<bool> is_quote = (v == '"'); + simd8<bool> is_backslash = (v == '\\'); + simd8<bool> is_control = (v < 32); + return { + (is_backslash | is_quote | is_control).to_bitmask64() + }; +} + + + +} // unnamed namespace +} // namespace arm64 +} // namespace simdjson + +#endif // SIMDJSON_ARM64_STRINGPARSING_DEFS_H +/* end file simdjson/arm64/stringparsing_defs.h */ + +#define SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT 1 +/* end file simdjson/arm64/begin.h */ +/* including simdjson/generic/ondemand/amalgamated.h for arm64: #include "simdjson/generic/ondemand/amalgamated.h" */ +/* begin file simdjson/generic/ondemand/amalgamated.h for arm64 */ +#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_BUILDER_DEPENDENCIES_H) +#error simdjson/generic/ondemand/dependencies.h must be included before simdjson/generic/ondemand/amalgamated.h! +#endif + +// Stuff other things depend on +/* including simdjson/generic/ondemand/base.h for arm64: #include "simdjson/generic/ondemand/base.h" */ +/* begin file simdjson/generic/ondemand/base.h for arm64 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_BASE_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_BASE_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace arm64 { +/** + * A fast, simple, DOM-like interface that parses JSON as you use it. + * + * Designed for maximum speed and a lower memory profile. + */ +namespace ondemand { + +/** Represents the depth of a JSON value (number of nested arrays/objects). */ +using depth_t = int32_t; + +/** @copydoc simdjson::arm64::number_type */ +using number_type = simdjson::arm64::number_type; + +/** @private Position in the JSON buffer indexes */ +using token_position = const uint32_t *; + +class array; +class array_iterator; +class document; +class document_reference; +class document_stream; +class field; +class json_iterator; +enum class json_type; +struct number; +class object; +class object_iterator; +class parser; +class raw_json_string; +class token_iterator; +class value; +class value_iterator; + +} // namespace ondemand +} // namespace arm64 +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_ONDEMAND_BASE_H +/* end file simdjson/generic/ondemand/base.h for arm64 */ +/* including simdjson/generic/ondemand/deserialize.h for arm64: #include "simdjson/generic/ondemand/deserialize.h" */ +/* begin file simdjson/generic/ondemand/deserialize.h for arm64 */ +#if SIMDJSON_SUPPORTS_CONCEPTS + +#ifndef SIMDJSON_ONDEMAND_DESERIALIZE_H +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_ONDEMAND_DESERIALIZE_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { + +struct deserialize_tag; + +/// These types are deserializable in a built-in way +template <typename> struct is_builtin_deserializable : std::false_type {}; +template <> struct is_builtin_deserializable<int64_t> : std::true_type {}; +template <> struct is_builtin_deserializable<uint64_t> : std::true_type {}; +template <> struct is_builtin_deserializable<double> : std::true_type {}; +template <> struct is_builtin_deserializable<bool> : std::true_type {}; +template <> struct is_builtin_deserializable<arm64::ondemand::array> : std::true_type {}; +template <> struct is_builtin_deserializable<arm64::ondemand::object> : std::true_type {}; +template <> struct is_builtin_deserializable<arm64::ondemand::value> : std::true_type {}; +template <> struct is_builtin_deserializable<arm64::ondemand::raw_json_string> : std::true_type {}; +template <> struct is_builtin_deserializable<std::string_view> : std::true_type {}; + +template <typename T> +concept is_builtin_deserializable_v = is_builtin_deserializable<T>::value; + +template <typename T, typename ValT = arm64::ondemand::value> +concept custom_deserializable = tag_invocable<deserialize_tag, ValT&, T&>; + +template <typename T, typename ValT = arm64::ondemand::value> +concept deserializable = custom_deserializable<T, ValT> || is_builtin_deserializable_v<T> || concepts::optional_type<T>; + +template <typename T, typename ValT = arm64::ondemand::value> +concept nothrow_custom_deserializable = nothrow_tag_invocable<deserialize_tag, ValT&, T&>; + +// built-in types are noexcept and if an error happens, the value simply gets ignored and the error is returned. +template <typename T, typename ValT = arm64::ondemand::value> +concept nothrow_deserializable = nothrow_custom_deserializable<T, ValT> || is_builtin_deserializable_v<T>; + +/// Deserialize Tag +inline constexpr struct deserialize_tag { + using array_type = arm64::ondemand::array; + using object_type = arm64::ondemand::object; + using value_type = arm64::ondemand::value; + using document_type = arm64::ondemand::document; + using document_reference_type = arm64::ondemand::document_reference; + + // Customization Point for array + template <typename T> + requires custom_deserializable<T, value_type> + simdjson_warn_unused constexpr /* error_code */ auto operator()(array_type &object, T& output) const noexcept(nothrow_custom_deserializable<T, value_type>) { + return tag_invoke(*this, object, output); + } + + // Customization Point for object + template <typename T> + requires custom_deserializable<T, value_type> + simdjson_warn_unused constexpr /* error_code */ auto operator()(object_type &object, T& output) const noexcept(nothrow_custom_deserializable<T, value_type>) { + return tag_invoke(*this, object, output); + } + + // Customization Point for value + template <typename T> + requires custom_deserializable<T, value_type> + simdjson_warn_unused constexpr /* error_code */ auto operator()(value_type &object, T& output) const noexcept(nothrow_custom_deserializable<T, value_type>) { + return tag_invoke(*this, object, output); + } + + // Customization Point for document + template <typename T> + requires custom_deserializable<T, document_type> + simdjson_warn_unused constexpr /* error_code */ auto operator()(document_type &object, T& output) const noexcept(nothrow_custom_deserializable<T, document_type>) { + return tag_invoke(*this, object, output); + } + + // Customization Point for document reference + template <typename T> + requires custom_deserializable<T, document_reference_type> + simdjson_warn_unused constexpr /* error_code */ auto operator()(document_reference_type &object, T& output) const noexcept(nothrow_custom_deserializable<T, document_reference_type>) { + return tag_invoke(*this, object, output); + } + + +} deserialize{}; + +} // namespace simdjson + +#endif // SIMDJSON_ONDEMAND_DESERIALIZE_H +#endif // SIMDJSON_SUPPORTS_CONCEPTS + +/* end file simdjson/generic/ondemand/deserialize.h for arm64 */ +/* including simdjson/generic/ondemand/value_iterator.h for arm64: #include "simdjson/generic/ondemand/value_iterator.h" */ +/* begin file simdjson/generic/ondemand/value_iterator.h for arm64 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace arm64 { +namespace ondemand { + +/** + * Iterates through a single JSON value at a particular depth. + * + * Does not keep track of the type of value: provides methods for objects, arrays and scalars and expects + * the caller to call the right ones. + * + * @private This is not intended for external use. + */ +class value_iterator { +protected: + /** The underlying JSON iterator */ + json_iterator *_json_iter{}; + /** The depth of this value */ + depth_t _depth{}; + /** + * The starting token index for this value + */ + token_position _start_position{}; + +public: + simdjson_inline value_iterator() noexcept = default; + + /** + * Denote that we're starting a document. + */ + simdjson_inline void start_document() noexcept; + + /** + * Skips a non-iterated or partially-iterated JSON value, whether it is a scalar, array or object. + * + * Optimized for scalars. + */ + simdjson_warn_unused simdjson_inline error_code skip_child() noexcept; + + /** + * Tell whether the iterator is at the EOF mark + */ + simdjson_inline bool at_end() const noexcept; + + /** + * Tell whether the iterator is at the start of the value + */ + simdjson_inline bool at_start() const noexcept; + + /** + * Tell whether the value is open--if the value has not been used, or the array/object is still open. + */ + simdjson_inline bool is_open() const noexcept; + + /** + * Tell whether the value is at an object's first field (just after the {). + */ + simdjson_inline bool at_first_field() const noexcept; + + /** + * Abandon all iteration. + */ + simdjson_inline void abandon() noexcept; + + /** + * Get the child value as a value_iterator. + */ + simdjson_inline value_iterator child_value() const noexcept; + + /** + * Get the depth of this value. + */ + simdjson_inline int32_t depth() const noexcept; + + /** + * Get the JSON type of this value. + * + * @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse". + */ + simdjson_inline simdjson_result<json_type> type() const noexcept; + + /** + * @addtogroup object Object iteration + * + * Methods to iterate and find object fields. These methods generally *assume* the value is + * actually an object; the caller is responsible for keeping track of that fact. + * + * @{ + */ + + /** + * Start an object iteration. + * + * @returns Whether the object had any fields (returns false for empty). + * @error INCORRECT_TYPE if there is no opening { + */ + simdjson_warn_unused simdjson_inline simdjson_result<bool> start_object() noexcept; + /** + * Start an object iteration from the root. + * + * @returns Whether the object had any fields (returns false for empty). + * @error INCORRECT_TYPE if there is no opening { + * @error TAPE_ERROR if there is no matching } at end of document + */ + simdjson_warn_unused simdjson_inline simdjson_result<bool> start_root_object() noexcept; + /** + * Checks whether an object could be started from the root. May be called by start_root_object. + * + * @returns SUCCESS if it is possible to safely start an object from the root (document level). + * @error INCORRECT_TYPE if there is no opening { + * @error TAPE_ERROR if there is no matching } at end of document + */ + simdjson_warn_unused simdjson_inline error_code check_root_object() noexcept; + /** + * Start an object iteration after the user has already checked and moved past the {. + * + * Does not move the iterator unless the object is empty ({}). + * + * @returns Whether the object had any fields (returns false for empty). + * @error INCOMPLETE_ARRAY_OR_OBJECT If there are no more tokens (implying the *parent* + * array or object is incomplete). An INCOMPLETE_ARRAY_OR_OBJECT is an unrecoverable error that + * invalidates the document. + */ + simdjson_warn_unused simdjson_inline simdjson_result<bool> started_object() noexcept; + /** + * Start an object iteration from the root, after the user has already checked and moved past the {. + * + * Does not move the iterator unless the object is empty ({}). + * + * @returns Whether the object had any fields (returns false for empty). + * @error INCOMPLETE_ARRAY_OR_OBJECT If there are no more tokens (implying the *parent* + * array or object is incomplete). An INCOMPLETE_ARRAY_OR_OBJECT is an unrecoverable error that + * invalidates the document. + */ + simdjson_warn_unused simdjson_inline simdjson_result<bool> started_root_object() noexcept; + + /** + * Moves to the next field in an object. + * + * Looks for , and }. If } is found, the object is finished and the iterator advances past it. + * Otherwise, it advances to the next value. + * + * @return whether there is another field in the object. + * @error TAPE_ERROR If there is a comma missing between fields. + * @error TAPE_ERROR If there is a comma, but not enough tokens remaining to have a key, :, and value. + */ + simdjson_warn_unused simdjson_inline simdjson_result<bool> has_next_field() noexcept; + + /** + * Get the current field's key. + */ + simdjson_warn_unused simdjson_inline simdjson_result<raw_json_string> field_key() noexcept; + + /** + * Pass the : in the field and move to its value. + */ + simdjson_warn_unused simdjson_inline error_code field_value() noexcept; + + /** + * Find the next field with the given key. + * + * Assumes you have called next_field() or otherwise matched the previous value. + * + * This means the iterator must be sitting at the next key: + * + * ``` + * { "a": 1, "b": 2 } + * ^ + * ``` + * + * Key is *raw JSON,* meaning it will be matched against the verbatim JSON without attempting to + * unescape it. This works well for typical ASCII and UTF-8 keys (almost all of them), but may + * fail to match some keys with escapes (\u, \n, etc.). + */ + simdjson_warn_unused simdjson_inline error_code find_field(const std::string_view key) noexcept; + + /** + * Find the next field with the given key, *without* unescaping. This assumes object order: it + * will not find the field if it was already passed when looking for some *other* field. + * + * Assumes you have called next_field() or otherwise matched the previous value. + * + * This means the iterator must be sitting at the next key: + * + * ``` + * { "a": 1, "b": 2 } + * ^ + * ``` + * + * Key is *raw JSON,* meaning it will be matched against the verbatim JSON without attempting to + * unescape it. This works well for typical ASCII and UTF-8 keys (almost all of them), but may + * fail to match some keys with escapes (\u, \n, etc.). + */ + simdjson_warn_unused simdjson_inline simdjson_result<bool> find_field_raw(const std::string_view key) noexcept; + + /** + * Find the field with the given key without regard to order, and *without* unescaping. + * + * This is an unordered object lookup: if the field is not found initially, it will cycle around and scan from the beginning. + * + * Assumes you have called next_field() or otherwise matched the previous value. + * + * This means the iterator must be sitting at the next key: + * + * ``` + * { "a": 1, "b": 2 } + * ^ + * ``` + * + * Key is *raw JSON,* meaning it will be matched against the verbatim JSON without attempting to + * unescape it. This works well for typical ASCII and UTF-8 keys (almost all of them), but may + * fail to match some keys with escapes (\u, \n, etc.). + */ + simdjson_warn_unused simdjson_inline simdjson_result<bool> find_field_unordered_raw(const std::string_view key) noexcept; + + /** @} */ + + /** + * @addtogroup array Array iteration + * Methods to iterate over array elements. These methods generally *assume* the value is actually + * an object; the caller is responsible for keeping track of that fact. + * @{ + */ + + /** + * Check for an opening [ and start an array iteration. + * + * @returns Whether the array had any elements (returns false for empty). + * @error INCORRECT_TYPE If there is no [. + */ + simdjson_warn_unused simdjson_inline simdjson_result<bool> start_array() noexcept; + /** + * Check for an opening [ and start an array iteration while at the root. + * + * @returns Whether the array had any elements (returns false for empty). + * @error INCORRECT_TYPE If there is no [. + * @error TAPE_ERROR if there is no matching ] at end of document + */ + simdjson_warn_unused simdjson_inline simdjson_result<bool> start_root_array() noexcept; + /** + * Checks whether an array could be started from the root. May be called by start_root_array. + * + * @returns SUCCESS if it is possible to safely start an array from the root (document level). + * @error INCORRECT_TYPE If there is no [. + * @error TAPE_ERROR if there is no matching ] at end of document + */ + simdjson_warn_unused simdjson_inline error_code check_root_array() noexcept; + /** + * Start an array iteration, after the user has already checked and moved past the [. + * + * Does not move the iterator unless the array is empty ([]). + * + * @returns Whether the array had any elements (returns false for empty). + * @error INCOMPLETE_ARRAY_OR_OBJECT If there are no more tokens (implying the *parent* + * array or object is incomplete). An INCOMPLETE_ARRAY_OR_OBJECT is an unrecoverable error that + * invalidates the document. + */ + simdjson_warn_unused simdjson_inline simdjson_result<bool> started_array() noexcept; + /** + * Start an array iteration from the root, after the user has already checked and moved past the [. + * + * Does not move the iterator unless the array is empty ([]). + * + * @returns Whether the array had any elements (returns false for empty). + * @error INCOMPLETE_ARRAY_OR_OBJECT If there are no more tokens (implying the *parent* + * array or object is incomplete). An INCOMPLETE_ARRAY_OR_OBJECT is an unrecoverable error that + * invalidates the document. + */ + simdjson_warn_unused simdjson_inline simdjson_result<bool> started_root_array() noexcept; + + /** + * Moves to the next element in an array. + * + * Looks for , and ]. If ] is found, the array is finished and the iterator advances past it. + * Otherwise, it advances to the next value. + * + * @return Whether there is another element in the array. + * @error TAPE_ERROR If there is a comma missing between elements. + */ + simdjson_warn_unused simdjson_inline simdjson_result<bool> has_next_element() noexcept; + + /** + * Get a child value iterator. + */ + simdjson_warn_unused simdjson_inline value_iterator child() const noexcept; + + /** @} */ + + /** + * @defgroup scalar Scalar values + * @addtogroup scalar + * @{ + */ + + simdjson_warn_unused simdjson_inline simdjson_result<std::string_view> get_string(bool allow_replacement) noexcept; + template <typename string_type> + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement) noexcept; + simdjson_warn_unused simdjson_inline simdjson_result<std::string_view> get_wobbly_string() noexcept; + simdjson_warn_unused simdjson_inline simdjson_result<raw_json_string> get_raw_json_string() noexcept; + simdjson_warn_unused simdjson_inline simdjson_result<uint64_t> get_uint64() noexcept; + simdjson_warn_unused simdjson_inline simdjson_result<uint64_t> get_uint64_in_string() noexcept; + simdjson_warn_unused simdjson_inline simdjson_result<int64_t> get_int64() noexcept; + simdjson_warn_unused simdjson_inline simdjson_result<int64_t> get_int64_in_string() noexcept; + simdjson_warn_unused simdjson_inline simdjson_result<double> get_double() noexcept; + simdjson_warn_unused simdjson_inline simdjson_result<double> get_double_in_string() noexcept; + simdjson_warn_unused simdjson_inline simdjson_result<bool> get_bool() noexcept; + simdjson_warn_unused simdjson_inline simdjson_result<bool> is_null() noexcept; + simdjson_warn_unused simdjson_inline bool is_negative() noexcept; + simdjson_warn_unused simdjson_inline simdjson_result<bool> is_integer() noexcept; + simdjson_warn_unused simdjson_inline simdjson_result<number_type> get_number_type() noexcept; + simdjson_warn_unused simdjson_inline simdjson_result<number> get_number() noexcept; + + simdjson_warn_unused simdjson_inline simdjson_result<std::string_view> get_root_string(bool check_trailing, bool allow_replacement) noexcept; + template <typename string_type> + simdjson_warn_unused simdjson_inline error_code get_root_string(string_type& receiver, bool check_trailing, bool allow_replacement) noexcept; + simdjson_warn_unused simdjson_inline simdjson_result<std::string_view> get_root_wobbly_string(bool check_trailing) noexcept; + simdjson_warn_unused simdjson_inline simdjson_result<raw_json_string> get_root_raw_json_string(bool check_trailing) noexcept; + simdjson_warn_unused simdjson_inline simdjson_result<uint64_t> get_root_uint64(bool check_trailing) noexcept; + simdjson_warn_unused simdjson_inline simdjson_result<uint64_t> get_root_uint64_in_string(bool check_trailing) noexcept; + simdjson_warn_unused simdjson_inline simdjson_result<int64_t> get_root_int64(bool check_trailing) noexcept; + simdjson_warn_unused simdjson_inline simdjson_result<int64_t> get_root_int64_in_string(bool check_trailing) noexcept; + simdjson_warn_unused simdjson_inline simdjson_result<double> get_root_double(bool check_trailing) noexcept; + simdjson_warn_unused simdjson_inline simdjson_result<double> get_root_double_in_string(bool check_trailing) noexcept; + simdjson_warn_unused simdjson_inline simdjson_result<bool> get_root_bool(bool check_trailing) noexcept; + simdjson_warn_unused simdjson_inline bool is_root_negative() noexcept; + simdjson_warn_unused simdjson_inline simdjson_result<bool> is_root_integer(bool check_trailing) noexcept; + simdjson_warn_unused simdjson_inline simdjson_result<number_type> get_root_number_type(bool check_trailing) noexcept; + simdjson_warn_unused simdjson_inline simdjson_result<number> get_root_number(bool check_trailing) noexcept; + simdjson_warn_unused simdjson_inline simdjson_result<bool> is_root_null(bool check_trailing) noexcept; + + simdjson_warn_unused simdjson_inline error_code error() const noexcept; + simdjson_inline uint8_t *&string_buf_loc() noexcept; + simdjson_inline const json_iterator &json_iter() const noexcept; + simdjson_inline json_iterator &json_iter() noexcept; + + simdjson_inline void assert_is_valid() const noexcept; + simdjson_inline bool is_valid() const noexcept; + + /** @} */ +protected: + /** + * Restarts an array iteration. + * @returns Whether the array has any elements (returns false for empty). + */ + simdjson_inline simdjson_result<bool> reset_array() noexcept; + /** + * Restarts an object iteration. + * @returns Whether the object has any fields (returns false for empty). + */ + simdjson_inline simdjson_result<bool> reset_object() noexcept; + /** + * move_at_start(): moves us so that we are pointing at the beginning of + * the container. It updates the index so that at_start() is true and it + * syncs the depth. The user can then create a new container instance. + * + * Usage: used with value::count_elements(). + **/ + simdjson_inline void move_at_start() noexcept; + + /** + * move_at_container_start(): moves us so that we are pointing at the beginning of + * the container so that assert_at_container_start() passes. + * + * Usage: used with reset_array() and reset_object(). + **/ + simdjson_inline void move_at_container_start() noexcept; + /* Useful for debugging and logging purposes. */ + inline std::string to_string() const noexcept; + simdjson_inline value_iterator(json_iterator *json_iter, depth_t depth, token_position start_index) noexcept; + + simdjson_inline simdjson_result<bool> parse_null(const uint8_t *json) const noexcept; + simdjson_inline simdjson_result<bool> parse_bool(const uint8_t *json) const noexcept; + simdjson_inline const uint8_t *peek_start() const noexcept; + simdjson_inline uint32_t peek_start_length() const noexcept; + simdjson_inline uint32_t peek_root_length() const noexcept; + + /** + * The general idea of the advance_... methods and the peek_* methods + * is that you first peek and check that you have desired type. If you do, + * and only if you do, then you advance. + * + * We used to unconditionally advance. But this made reasoning about our + * current state difficult. + * Suppose you always advance. Look at the 'value' matching the key + * "shadowable" in the following example... + * + * ({"globals":{"a":{"shadowable":[}}}}) + * + * If the user thinks it is a Boolean and asks for it, then we check the '[', + * decide it is not a Boolean, but still move into the next character ('}'). Now + * we are left pointing at '}' right after a '['. And we have not yet reported + * an error, only that we do not have a Boolean. + * + * If, instead, you just stand your ground until it is content that you know, then + * you will only even move beyond the '[' if the user tells you that you have an + * array. So you will be at the '}' character inside the array and, hopefully, you + * will then catch the error because an array cannot start with '}', but the code + * processing Boolean values does not know this. + * + * So the contract is: first call 'peek_...' and then call 'advance_...' only + * if you have determined that it is a type you can handle. + * + * Unfortunately, it makes the code more verbose, longer and maybe more error prone. + */ + + simdjson_inline void advance_scalar(const char *type) noexcept; + simdjson_inline void advance_root_scalar(const char *type) noexcept; + simdjson_inline void advance_non_root_scalar(const char *type) noexcept; + + simdjson_inline const uint8_t *peek_scalar(const char *type) noexcept; + simdjson_inline const uint8_t *peek_root_scalar(const char *type) noexcept; + simdjson_inline const uint8_t *peek_non_root_scalar(const char *type) noexcept; + + + simdjson_warn_unused simdjson_inline error_code start_container(uint8_t start_char, const char *incorrect_type_message, const char *type) noexcept; + simdjson_warn_unused simdjson_inline error_code end_container() noexcept; + + /** + * Advance to a place expecting a value (increasing depth). + * + * @return The current token (the one left behind). + * @error TAPE_ERROR If the document ended early. + */ + simdjson_inline simdjson_result<const uint8_t *> advance_to_value() noexcept; + + simdjson_warn_unused simdjson_inline error_code incorrect_type_error(const char *message) const noexcept; + simdjson_warn_unused simdjson_inline error_code error_unless_more_tokens(uint32_t tokens=1) const noexcept; + + simdjson_inline bool is_at_start() const noexcept; + /** + * is_at_iterator_start() returns true on an array or object after it has just been + * created, whether the instance is empty or not. + * + * Usage: used by array::begin() in debug mode (SIMDJSON_DEVELOPMENT_CHECKS) + */ + simdjson_inline bool is_at_iterator_start() const noexcept; + + /** + * Assuming that we are within an object, this returns true if we + * are pointing at a key. + * + * Usage: the skip_child() method should never be used while we are pointing + * at a key inside an object. + */ + simdjson_inline bool is_at_key() const noexcept; + + inline void assert_at_start() const noexcept; + inline void assert_at_container_start() const noexcept; + inline void assert_at_root() const noexcept; + inline void assert_at_child() const noexcept; + inline void assert_at_next() const noexcept; + inline void assert_at_non_root_start() const noexcept; + + /** Get the starting position of this value */ + simdjson_inline token_position start_position() const noexcept; + + /** @copydoc error_code json_iterator::position() const noexcept; */ + simdjson_inline token_position position() const noexcept; + /** @copydoc error_code json_iterator::end_position() const noexcept; */ + simdjson_inline token_position last_position() const noexcept; + /** @copydoc error_code json_iterator::end_position() const noexcept; */ + simdjson_inline token_position end_position() const noexcept; + /** @copydoc error_code json_iterator::report_error(error_code error, const char *message) noexcept; */ + simdjson_warn_unused simdjson_inline error_code report_error(error_code error, const char *message) noexcept; + + friend class document; + friend class object; + friend class object_iterator; + friend class array; + friend class value; + friend class field; +}; // value_iterator + +} // namespace ondemand +} // namespace arm64 +} // namespace simdjson + +namespace simdjson { + +template<> +struct simdjson_result<arm64::ondemand::value_iterator> : public arm64::implementation_simdjson_result_base<arm64::ondemand::value_iterator> { +public: + simdjson_inline simdjson_result(arm64::ondemand::value_iterator &&value) noexcept; ///< @private + simdjson_inline simdjson_result(error_code error) noexcept; ///< @private + simdjson_inline simdjson_result() noexcept = default; +}; + +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_H +/* end file simdjson/generic/ondemand/value_iterator.h for arm64 */ +/* including simdjson/generic/ondemand/value.h for arm64: #include "simdjson/generic/ondemand/value.h" */ +/* begin file simdjson/generic/ondemand/value.h for arm64 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_VALUE_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/deserialize.h" */ +/* amalgamation skipped (editor-only): #include <vector> */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#include <type_traits> + +namespace simdjson { + +namespace arm64 { +namespace ondemand { +/** + * An ephemeral JSON value returned during iteration. It is only valid for as long as you do + * not access more data in the JSON document. + */ +class value { +public: + /** + * Create a new invalid value. + * + * Exists so you can declare a variable and later assign to it before use. + */ + simdjson_inline value() noexcept = default; + + /** + * Get this value as the given type. + * + * Supported types: object, array, raw_json_string, string_view, uint64_t, int64_t, double, bool + * + * You may use get_double(), get_bool(), get_uint64(), get_int64(), + * get_object(), get_array(), get_raw_json_string(), or get_string() instead. + * When SIMDJSON_SUPPORTS_CONCEPTS is set, custom types are also supported. + * + * @returns A value of the given type, parsed from the JSON. + * @returns INCORRECT_TYPE If the JSON value is not the given type. + */ + template <typename T> + simdjson_inline simdjson_result<T> get() +#if SIMDJSON_SUPPORTS_CONCEPTS + noexcept(custom_deserializable<T, value> ? nothrow_custom_deserializable<T, value> : true) +#else + noexcept +#endif + { + static_assert(std::is_default_constructible<T>::value, "The specified type is not default constructible."); + T out{}; + SIMDJSON_TRY(get<T>(out)); + return out; + } + + + /** + * Get this value as the given type. + * + * Supported types: object, array, raw_json_string, string_view, uint64_t, int64_t, double, bool + * If the macro SIMDJSON_SUPPORTS_CONCEPTS is set, then custom types are also supported. + * + * @param out This is set to a value of the given type, parsed from the JSON. If there is an error, this may not be initialized. + * @returns INCORRECT_TYPE If the JSON value is not an object. + * @returns SUCCESS If the parse succeeded and the out parameter was set to the value. + */ + template <typename T> + simdjson_warn_unused simdjson_inline error_code get(T &out) +#if SIMDJSON_SUPPORTS_CONCEPTS + noexcept(custom_deserializable<T, value> ? nothrow_custom_deserializable<T, value> : true) +#else + noexcept +#endif + { + #if SIMDJSON_SUPPORTS_CONCEPTS + if constexpr (custom_deserializable<T, value>) { + return deserialize(*this, out); + } else if constexpr (concepts::optional_type<T>) { + using value_type = typename std::remove_cvref_t<T>::value_type; + + // Check if the value is null + bool is_null_value; + SIMDJSON_TRY( is_null().get(is_null_value) ); + if (is_null_value) { + out.reset(); // Set to nullopt + return SUCCESS; + } + + if (!out) { + out.emplace(); + } + return get<value_type>(out.value()); + } else { + static_assert(!sizeof(T), "The get<T> method with type T is not implemented by the simdjson library. " + "And you do not seem to have added support for it. Indeed, we have that " + "simdjson::custom_deserializable<T> is false and the type T is not a default type " + "such as ondemand::object, ondemand::array, raw_json_string, std::string_view, uint64_t, " + "int64_t, double, or bool."); + static_cast<void>(out); // to get rid of unused errors + return UNINITIALIZED; + } +#else // SIMDJSON_SUPPORTS_CONCEPTS + // Unless the simdjson library or the user provides an inline implementation, calling this method should + // immediately fail. + static_assert(!sizeof(T), "The get method with given type is not implemented by the simdjson library. " + "The supported types are ondemand::object, ondemand::array, raw_json_string, std::string_view, uint64_t, " + "int64_t, double, and bool. We recommend you use get_double(), get_bool(), get_uint64(), get_int64(), " + " get_object(), get_array(), get_raw_json_string(), or get_string() instead of the get template." + " You may also add support for custom types, see our documentation."); + static_cast<void>(out); // to get rid of unused errors + return UNINITIALIZED; +#endif + } + + /** + * Cast this JSON value to an array. + * + * @returns An object that can be used to iterate the array. + * @returns INCORRECT_TYPE If the JSON value is not an array. + */ + simdjson_inline simdjson_result<array> get_array() noexcept; + + /** + * Cast this JSON value to an object. + * + * @returns An object that can be used to look up or iterate fields. + * @returns INCORRECT_TYPE If the JSON value is not an object. + */ + simdjson_inline simdjson_result<object> get_object() noexcept; + + /** + * Cast this JSON value to an unsigned integer. + * + * @returns A unsigned 64-bit integer. + * @returns INCORRECT_TYPE If the JSON value is not a 64-bit unsigned integer. + */ + simdjson_inline simdjson_result<uint64_t> get_uint64() noexcept; + + /** + * Cast this JSON value (inside string) to a unsigned integer. + * + * @returns A unsigned 64-bit integer. + * @returns INCORRECT_TYPE If the JSON value is not a 64-bit unsigned integer. + */ + simdjson_inline simdjson_result<uint64_t> get_uint64_in_string() noexcept; + + /** + * Cast this JSON value to a signed integer. + * + * @returns A signed 64-bit integer. + * @returns INCORRECT_TYPE If the JSON value is not a 64-bit integer. + */ + simdjson_inline simdjson_result<int64_t> get_int64() noexcept; + + /** + * Cast this JSON value (inside string) to a signed integer. + * + * @returns A signed 64-bit integer. + * @returns INCORRECT_TYPE If the JSON value is not a 64-bit integer. + */ + simdjson_inline simdjson_result<int64_t> get_int64_in_string() noexcept; + + /** + * Cast this JSON value to a double. + * + * @returns A double. + * @returns INCORRECT_TYPE If the JSON value is not a valid floating-point number. + */ + simdjson_inline simdjson_result<double> get_double() noexcept; + + /** + * Cast this JSON value (inside string) to a double + * + * @returns A double. + * @returns INCORRECT_TYPE If the JSON value is not a valid floating-point number. + */ + simdjson_inline simdjson_result<double> get_double_in_string() noexcept; + + /** + * Cast this JSON value to a string. + * + * The string is guaranteed to be valid UTF-8. + * + * Equivalent to get<std::string_view>(). + * + * Important: a value should be consumed once. Calling get_string() twice on the same value + * is an error. + * + * In some instances, you may want to allow replacement of invalid Unicode sequences. + * You may do so by passing the allow_replacement parameter as true. In the following + * example, the string "431924697b\udff0L\u0001Y" is not valid Unicode. By passing true + * to get_string, we allow the replacement of the invalid Unicode sequences with the Unicode + * replacement character (U+FFFD). + * + * simdjson::ondemand::parser parser; + * auto json = R"({"deviceId":"431924697b\udff0L\u0001Y"})"_padded; + * simdjson::ondemand::document doc = parser.iterate(json); + * auto view = doc["deviceId"].get_string(true); + * + * @returns An UTF-8 string. The string is stored in the parser and will be invalidated the next + * time it parses a document or when it is destroyed. + * @returns INCORRECT_TYPE if the JSON value is not a string. + */ + simdjson_inline simdjson_result<std::string_view> get_string(bool allow_replacement = false) noexcept; + + /** + * Attempts to fill the provided std::string reference with the parsed value of the current string. + * + * The string is guaranteed to be valid UTF-8. + * + * Important: a value should be consumed once. Calling get_string() twice on the same value + * is an error. + * + * Performance: This method may be slower than get_string() or get_string(bool) because it may need to allocate memory. + * We recommend you avoid allocating an std::string unless you need to. + * + * @returns INCORRECT_TYPE if the JSON value is not a string. Otherwise, we return SUCCESS. + */ + template <typename string_type> + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + + /** + * Cast this JSON value to a "wobbly" string. + * + * The string is may not be a valid UTF-8 string. + * See https://simonsapin.github.io/wtf-8/ + * + * Important: a value should be consumed once. Calling get_wobbly_string() twice on the same value + * is an error. + * + * @returns An UTF-8 string. The string is stored in the parser and will be invalidated the next + * time it parses a document or when it is destroyed. + * @returns INCORRECT_TYPE if the JSON value is not a string. + */ + simdjson_inline simdjson_result<std::string_view> get_wobbly_string() noexcept; + /** + * Cast this JSON value to a raw_json_string. + * + * The string is guaranteed to be valid UTF-8, and may have escapes in it (e.g. \\ or \n). + * + * @returns A pointer to the raw JSON for the given string. + * @returns INCORRECT_TYPE if the JSON value is not a string. + */ + simdjson_inline simdjson_result<raw_json_string> get_raw_json_string() noexcept; + + /** + * Cast this JSON value to a bool. + * + * @returns A bool value. + * @returns INCORRECT_TYPE if the JSON value is not true or false. + */ + simdjson_inline simdjson_result<bool> get_bool() noexcept; + + /** + * Checks if this JSON value is null. If and only if the value is + * null, then it is consumed (we advance). If we find a token that + * begins with 'n' but is not 'null', then an error is returned. + * + * @returns Whether the value is null. + * @returns INCORRECT_TYPE If the JSON value begins with 'n' and is not 'null'. + */ + simdjson_inline simdjson_result<bool> is_null() noexcept; + +#if SIMDJSON_EXCEPTIONS + /** + * Cast this JSON value to an instance of type T. The programmer is responsible for + * providing an implementation of get<T> for the type T, if T is not one of the types + * supported by the library (object, array, raw_json_string, string_view, uint64_t, etc.). + * + * See https://github.com/simdjson/simdjson/blob/master/doc/basics.md#adding-support-for-custom-types + * + * @returns An instance of type T + */ + template <class T> + explicit simdjson_inline operator T() noexcept(false); + /** + * Cast this JSON value to an array. + * + * @returns An object that can be used to iterate the array. + * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not an array. + */ + simdjson_inline operator array() noexcept(false); + /** + * Cast this JSON value to an object. + * + * @returns An object that can be used to look up or iterate fields. + * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not an object. + */ + simdjson_inline operator object() noexcept(false); + /** + * Cast this JSON value to an unsigned integer. + * + * @returns A signed 64-bit integer. + * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a 64-bit unsigned integer. + */ + simdjson_inline operator uint64_t() noexcept(false); + /** + * Cast this JSON value to a signed integer. + * + * @returns A signed 64-bit integer. + * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a 64-bit integer. + */ + simdjson_inline operator int64_t() noexcept(false); + /** + * Cast this JSON value to a double. + * + * @returns A double. + * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a valid floating-point number. + */ + simdjson_inline operator double() noexcept(false); + /** + * Cast this JSON value to a string. + * + * The string is guaranteed to be valid UTF-8. + * + * Equivalent to get<std::string_view>(). + * + * @returns An UTF-8 string. The string is stored in the parser and will be invalidated the next + * time it parses a document or when it is destroyed. + * @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not a string. + */ + simdjson_inline operator std::string_view() noexcept(false); + /** + * Cast this JSON value to a raw_json_string. + * + * The string is guaranteed to be valid UTF-8, and may have escapes in it (e.g. \\ or \n). + * + * @returns A pointer to the raw JSON for the given string. + * @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not a string. + */ + simdjson_inline operator raw_json_string() noexcept(false); + /** + * Cast this JSON value to a bool. + * + * @returns A bool value. + * @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not true or false. + */ + simdjson_inline operator bool() noexcept(false); +#endif + + /** + * Begin array iteration. + * + * Part of the std::iterable interface. + * + * @returns INCORRECT_TYPE If the JSON value is not an array. + */ + simdjson_inline simdjson_result<array_iterator> begin() & noexcept; + /** + * Sentinel representing the end of the array. + * + * Part of the std::iterable interface. + */ + simdjson_inline simdjson_result<array_iterator> end() & noexcept; + /** + * This method scans the array and counts the number of elements. + * The count_elements method should always be called before you have begun + * iterating through the array: it is expected that you are pointing at + * the beginning of the array. + * The runtime complexity is linear in the size of the array. After + * calling this function, if successful, the array is 'rewinded' at its + * beginning as if it had never been accessed. If the JSON is malformed (e.g., + * there is a missing comma), then an error is returned and it is no longer + * safe to continue. + * + * Performance hint: You should only call count_elements() as a last + * resort as it may require scanning the document twice or more. + */ + simdjson_inline simdjson_result<size_t> count_elements() & noexcept; + /** + * This method scans the object and counts the number of key-value pairs. + * The count_fields method should always be called before you have begun + * iterating through the object: it is expected that you are pointing at + * the beginning of the object. + * The runtime complexity is linear in the size of the object. After + * calling this function, if successful, the object is 'rewinded' at its + * beginning as if it had never been accessed. If the JSON is malformed (e.g., + * there is a missing comma), then an error is returned and it is no longer + * safe to continue. + * + * To check that an object is empty, it is more performant to use + * the is_empty() method on the object instance. + * + * Performance hint: You should only call count_fields() as a last + * resort as it may require scanning the document twice or more. + */ + simdjson_inline simdjson_result<size_t> count_fields() & noexcept; + /** + * Get the value at the given index in the array. This function has linear-time complexity. + * This function should only be called once on an array instance since the array iterator is not reset between each call. + * + * @return The value at the given index, or: + * - INDEX_OUT_OF_BOUNDS if the array index is larger than an array length + */ + simdjson_inline simdjson_result<value> at(size_t index) noexcept; + /** + * Look up a field by name on an object (order-sensitive). By order-sensitive, we mean that + * fields must be accessed in the order they appear in the JSON text (although you can + * skip fields). See find_field_unordered() and operator[] for an order-insensitive version. + * + * The following code reads z, then y, then x, and thus will not retrieve x or y if fed the + * JSON `{ "x": 1, "y": 2, "z": 3 }`: + * + * ```cpp + * simdjson::ondemand::parser parser; + * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded); + * double z = obj.find_field("z"); + * double y = obj.find_field("y"); + * double x = obj.find_field("x"); + * ``` + * If you have multiple fields with a matching key ({"x": 1, "x": 1}) be mindful + * that only one field is returned. + + * **Raw Keys:** The lookup will be done against the *raw* key, and will not unescape keys. + * e.g. `object["a"]` will match `{ "a": 1 }`, but will *not* match `{ "\u0061": 1 }`. + * + * @param key The key to look up. + * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object. + */ + simdjson_inline simdjson_result<value> find_field(std::string_view key) noexcept; + /** @overload simdjson_inline simdjson_result<value> find_field(std::string_view key) noexcept; */ + simdjson_inline simdjson_result<value> find_field(const char *key) noexcept; + + /** + * Look up a field by name on an object, without regard to key order. + * + * **Performance Notes:** This is a bit less performant than find_field(), though its effect varies + * and often appears negligible. It starts out normally, starting out at the last field; but if + * the field is not found, it scans from the beginning of the object to see if it missed it. That + * missing case has a non-cache-friendly bump and lots of extra scanning, especially if the object + * in question is large. The fact that the extra code is there also bumps the executable size. + * + * We default operator[] on find_field_unordered() for convenience. + * It is the default because it would be highly surprising (and hard to debug) if the + * default behavior failed to look up a field just because it was in the wrong order--and many + * APIs assume this. Therefore, you must be explicit if you want to treat objects as out of order. + * + * If you have multiple fields with a matching key ({"x": 1, "x": 1}) be mindful + * that only one field is returned. + * + * Use find_field() if you are sure fields will be in order (or are willing to treat it as if the + * field as not there when they are not in order). + * + * @param key The key to look up. + * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object. + */ + simdjson_inline simdjson_result<value> find_field_unordered(std::string_view key) noexcept; + /** @overload simdjson_inline simdjson_result<value> find_field_unordered(std::string_view key) noexcept; */ + simdjson_inline simdjson_result<value> find_field_unordered(const char *key) noexcept; + /** @overload simdjson_inline simdjson_result<value> find_field_unordered(std::string_view key) noexcept; */ + simdjson_inline simdjson_result<value> operator[](std::string_view key) noexcept; + /** @overload simdjson_inline simdjson_result<value> find_field_unordered(std::string_view key) noexcept; */ + simdjson_inline simdjson_result<value> operator[](const char *key) noexcept; + simdjson_result<value> operator[](int) noexcept = delete; + + /** + * Get the type of this JSON value. It does not validate or consume the value. + * E.g., you must still call "is_null()" to check that a value is null even if + * "type()" returns json_type::null. + * + * NOTE: If you're only expecting a value to be one type (a typical case), it's generally + * better to just call .get_double, .get_string, etc. and check for INCORRECT_TYPE (or just + * let it throw an exception). + * + * @return The type of JSON value (json_type::array, json_type::object, json_type::string, + * json_type::number, json_type::boolean, or json_type::null). + * @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse". + */ + simdjson_inline simdjson_result<json_type> type() noexcept; + + /** + * Checks whether the value is a scalar (string, number, null, Boolean). + * Returns false when there it is an array or object. + * + * @returns true if the type is string, number, null, Boolean + * @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse". + */ + simdjson_inline simdjson_result<bool> is_scalar() noexcept; + /** + * Checks whether the value is a string. + * + * @returns true if the type is string + * @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse". + */ + simdjson_inline simdjson_result<bool> is_string() noexcept; + + /** + * Checks whether the value is a negative number. + * + * @returns true if the number if negative. + */ + simdjson_inline bool is_negative() noexcept; + /** + * Checks whether the value is an integer number. Note that + * this requires to partially parse the number string. If + * the value is determined to be an integer, it may still + * not parse properly as an integer in subsequent steps + * (e.g., it might overflow). + * + * Performance note: if you call this function systematically + * before parsing a number, you may have fallen for a performance + * anti-pattern. + * + * @returns true if the number if negative. + */ + simdjson_inline simdjson_result<bool> is_integer() noexcept; + /** + * Determine the number type (integer or floating-point number) as quickly + * as possible. This function does not fully validate the input. It is + * useful when you only need to classify the numbers, without parsing them. + * + * If you are planning to retrieve the value or you need full validation, + * consider using the get_number() method instead: it will fully parse + * and validate the input, and give you access to the type: + * get_number().get_number_type(). + * + * get_number_type() is number_type::unsigned_integer if we have + * an integer greater or equal to 9223372036854775808. + * get_number_type() is number_type::signed_integer if we have an + * integer that is less than 9223372036854775808. + * get_number_type() is number_type::big_integer for integers that do not fit in 64 bits, + * in which case the digit_count is set to the length of the big integer string. + * Otherwise, get_number_type() has value number_type::floating_point_number. + * + * This function requires processing the number string, but it is expected + * to be faster than get_number().get_number_type() because it is does not + * parse the number value. + * + * @returns the type of the number + */ + simdjson_inline simdjson_result<number_type> get_number_type() noexcept; + + /** + * Attempt to parse an ondemand::number. An ondemand::number may + * contain an integer value or a floating-point value, the simdjson + * library will autodetect the type. Thus it is a dynamically typed + * number. Before accessing the value, you must determine the detected + * type. + * + * number.get_number_type() is number_type::signed_integer if we have + * an integer in [-9223372036854775808,9223372036854775808) + * You can recover the value by calling number.get_int64() and you + * have that number.is_int64() is true. + * + * number.get_number_type() is number_type::unsigned_integer if we have + * an integer in [9223372036854775808,18446744073709551616) + * You can recover the value by calling number.get_uint64() and you + * have that number.is_uint64() is true. + * + * For integers that do not fit in 64 bits, the function returns BIGINT_ERROR error code. + * + * Otherwise, number.get_number_type() has value number_type::floating_point_number + * and we have a binary64 number. + * You can recover the value by calling number.get_double() and you + * have that number.is_double() is true. + * + * You must check the type before accessing the value: it is an error + * to call "get_int64()" when number.get_number_type() is not + * number_type::signed_integer and when number.is_int64() is false. + * + * Performance note: this is designed with performance in mind. When + * calling 'get_number()', you scan the number string only once, determining + * efficiently the type and storing it in an efficient manner. + */ + simdjson_warn_unused simdjson_inline simdjson_result<number> get_number() noexcept; + + /** + * Get the raw JSON for this token. + * + * The string_view will always point into the input buffer. + * + * The string_view will start at the beginning of the token, and include the entire token + * *as well as all spaces until the next token (or EOF).* This means, for example, that a + * string token always begins with a " and is always terminated by the final ", possibly + * followed by a number of spaces. + * + * The string_view is *not* null-terminated. However, if this is a scalar (string, number, + * boolean, or null), the character after the end of the string_view is guaranteed to be + * a non-space token. + * + * Tokens include: + * - { + * - [ + * - "a string (possibly with UTF-8 or backslashed characters like \\\")". + * - -1.2e-100 + * - true + * - false + * - null + * + * See also value::raw_json(). + */ + simdjson_inline std::string_view raw_json_token() noexcept; + + /** + * Get a string_view pointing at this value in the JSON document. + * If this element is an array or an object, it consumes the array or the object + * and returns a string_view instance corresponding to the + * array as represented in JSON. It points inside the original document. + * If this element is a scalar (string, number, Boolean, null), it returns what + * raw_json_token() would return. + */ + simdjson_inline simdjson_result<std::string_view> raw_json() noexcept; + + /** + * Returns the current location in the document if in bounds. + */ + simdjson_inline simdjson_result<const char *> current_location() noexcept; + + /** + * Returns the current depth in the document if in bounds. + * + * E.g., + * 0 = finished with document + * 1 = document root value (could be [ or {, not yet known) + * 2 = , or } inside root array/object + * 3 = key or value inside root array/object. + */ + simdjson_inline int32_t current_depth() const noexcept; + + /** + * Get the value associated with the given JSON pointer. We use the RFC 6901 + * https://tools.ietf.org/html/rfc6901 standard. + * + * ondemand::parser parser; + * auto json = R"({ "foo": { "a": [ 10, 20, 30 ] }})"_padded; + * auto doc = parser.iterate(json); + * doc.at_pointer("/foo/a/1") == 20 + * + * It is allowed for a key to be the empty string: + * + * ondemand::parser parser; + * auto json = R"({ "": { "a": [ 10, 20, 30 ] }})"_padded; + * auto doc = parser.iterate(json); + * doc.at_pointer("//a/1") == 20 + * + * Note that at_pointer() called on the document automatically calls the document's rewind + * method between each call. It invalidates all previously accessed arrays, objects and values + * that have not been consumed. + * + * Calling at_pointer() on non-document instances (e.g., arrays and objects) is not + * standardized (by RFC 6901). We provide some experimental support for JSON pointers + * on non-document instances. Yet it is not the case when calling at_pointer on an array + * or an object instance: there is no rewind and no invalidation. + * + * You may only call at_pointer on an array after it has been created, but before it has + * been first accessed. When calling at_pointer on an array, the pointer is advanced to + * the location indicated by the JSON pointer (in case of success). It is no longer possible + * to call at_pointer on the same array. + * + * You may call at_pointer more than once on an object, but each time the pointer is advanced + * to be within the value matched by the key indicated by the JSON pointer query. Thus any preceding + * key (as well as the current key) can no longer be used with following JSON pointer calls. + * + * Also note that at_pointer() relies on find_field() which implies that we do not unescape keys when matching + * + * @return The value associated with the given JSON pointer, or: + * - NO_SUCH_FIELD if a field does not exist in an object + * - INDEX_OUT_OF_BOUNDS if an array index is larger than an array length + * - INCORRECT_TYPE if a non-integer is used to access an array + * - INVALID_JSON_POINTER if the JSON pointer is invalid and cannot be parsed + */ + simdjson_inline simdjson_result<value> at_pointer(std::string_view json_pointer) noexcept; + + /** + * Get the value associated with the given JSONPath expression. We only support + * JSONPath queries that trivially convertible to JSON Pointer queries: key + * names and array indices. + * + * @return The value associated with the given JSONPath expression, or: + * - INVALID_JSON_POINTER if the JSONPath to JSON Pointer conversion fails + * - NO_SUCH_FIELD if a field does not exist in an object + * - INDEX_OUT_OF_BOUNDS if an array index is larger than an array length + * - INCORRECT_TYPE if a non-integer is used to access an array + */ + simdjson_inline simdjson_result<value> at_path(std::string_view at_path) noexcept; + + /** + * Get all values matching the given JSONPath expression with wildcard support. + * Supports wildcard character (*) for arrays or ".*" for objects. + * + * @param json_path JSONPath expression with wildcards + * @return Vector of values matching the wildcard pattern + */ + simdjson_inline simdjson_result<std::vector<value>> at_path_with_wildcard(std::string_view json_path) noexcept; + +protected: + /** + * Create a value. + */ + simdjson_inline value(const value_iterator &iter) noexcept; + + /** + * Skip this value, allowing iteration to continue. + */ + simdjson_inline void skip() noexcept; + + /** + * Start a value at the current position. + * + * (It should already be started; this is just a self-documentation method.) + */ + static simdjson_inline value start(const value_iterator &iter) noexcept; + + /** + * Resume a value. + */ + static simdjson_inline value resume(const value_iterator &iter) noexcept; + + /** + * Get the object, starting or resuming it as necessary + */ + simdjson_inline simdjson_result<object> start_or_resume_object() noexcept; + + // simdjson_inline void log_value(const char *type) const noexcept; + // simdjson_inline void log_error(const char *message) const noexcept; + + value_iterator iter{}; + + friend class document; + friend class array_iterator; + friend class field; + friend class object; + friend struct simdjson_result<value>; + friend struct simdjson_result<field>; + friend class field; +}; + +} // namespace ondemand +} // namespace arm64 +} // namespace simdjson + +namespace simdjson { + +template<> +struct simdjson_result<arm64::ondemand::value> : public arm64::implementation_simdjson_result_base<arm64::ondemand::value> { +public: + simdjson_inline simdjson_result(arm64::ondemand::value &&value) noexcept; ///< @private + simdjson_inline simdjson_result(error_code error) noexcept; ///< @private + simdjson_inline simdjson_result() noexcept = default; + + simdjson_inline simdjson_result<arm64::ondemand::array> get_array() noexcept; + simdjson_inline simdjson_result<arm64::ondemand::object> get_object() noexcept; + + simdjson_inline simdjson_result<uint64_t> get_uint64() noexcept; + simdjson_inline simdjson_result<uint64_t> get_uint64_in_string() noexcept; + simdjson_inline simdjson_result<int64_t> get_int64() noexcept; + simdjson_inline simdjson_result<int64_t> get_int64_in_string() noexcept; + simdjson_inline simdjson_result<double> get_double() noexcept; + simdjson_inline simdjson_result<double> get_double_in_string() noexcept; + simdjson_inline simdjson_result<std::string_view> get_string(bool allow_replacement = false) noexcept; + template <typename string_type> + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + simdjson_inline simdjson_result<std::string_view> get_wobbly_string() noexcept; + simdjson_inline simdjson_result<arm64::ondemand::raw_json_string> get_raw_json_string() noexcept; + simdjson_inline simdjson_result<bool> get_bool() noexcept; + simdjson_inline simdjson_result<bool> is_null() noexcept; + + template<typename T> simdjson_inline simdjson_result<T> get() noexcept; + + template<typename T> simdjson_inline error_code get(T &out) noexcept; + +#if SIMDJSON_EXCEPTIONS + template <class T> + explicit simdjson_inline operator T() noexcept(false); + simdjson_inline operator arm64::ondemand::array() noexcept(false); + simdjson_inline operator arm64::ondemand::object() noexcept(false); + simdjson_inline operator uint64_t() noexcept(false); + simdjson_inline operator int64_t() noexcept(false); + simdjson_inline operator double() noexcept(false); + simdjson_inline operator std::string_view() noexcept(false); + simdjson_inline operator arm64::ondemand::raw_json_string() noexcept(false); + simdjson_inline operator bool() noexcept(false); +#endif + simdjson_inline simdjson_result<size_t> count_elements() & noexcept; + simdjson_inline simdjson_result<size_t> count_fields() & noexcept; + simdjson_inline simdjson_result<arm64::ondemand::value> at(size_t index) noexcept; + simdjson_inline simdjson_result<arm64::ondemand::array_iterator> begin() & noexcept; + simdjson_inline simdjson_result<arm64::ondemand::array_iterator> end() & noexcept; + + /** + * Look up a field by name on an object (order-sensitive). By order-sensitive, we mean that + * fields must be accessed in the order they appear in the JSON text (although you can + * skip fields). See find_field_unordered() and operator[] for an order-insensitive version. + * + * The following code reads z, then y, then x, and thus will not retrieve x or y if fed the + * JSON `{ "x": 1, "y": 2, "z": 3 }`: + * + * ```cpp + * simdjson::ondemand::parser parser; + * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded); + * double z = obj.find_field("z"); + * double y = obj.find_field("y"); + * double x = obj.find_field("x"); + * ``` + * + * **Raw Keys:** The lookup will be done against the *raw* key, and will not unescape keys. + * e.g. `object["a"]` will match `{ "a": 1 }`, but will *not* match `{ "\u0061": 1 }`. + * + * @param key The key to look up. + * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object. + */ + simdjson_inline simdjson_result<arm64::ondemand::value> find_field(std::string_view key) noexcept; + /** @overload simdjson_inline simdjson_result<arm64::ondemand::value> find_field(std::string_view key) noexcept; */ + simdjson_inline simdjson_result<arm64::ondemand::value> find_field(const char *key) noexcept; + + /** + * Look up a field by name on an object, without regard to key order. + * + * **Performance Notes:** This is a bit less performant than find_field(), though its effect varies + * and often appears negligible. It starts out normally, starting out at the last field; but if + * the field is not found, it scans from the beginning of the object to see if it missed it. That + * missing case has a non-cache-friendly bump and lots of extra scanning, especially if the object + * in question is large. The fact that the extra code is there also bumps the executable size. + * + * We default operator[] on find_field_unordered() for convenience. + * It is the default because it would be highly surprising (and hard to debug) if the + * default behavior failed to look up a field just because it was in the wrong order--and many + * APIs assume this. Therefore, you must be explicit if you want to treat objects as out of order. + * + * Use find_field() if you are sure fields will be in order (or are willing to treat it as if the + * field as not there when they are not in order). + * + * @param key The key to look up. + * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object. + */ + simdjson_inline simdjson_result<arm64::ondemand::value> find_field_unordered(std::string_view key) noexcept; + /** @overload simdjson_inline simdjson_result<arm64::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ + simdjson_inline simdjson_result<arm64::ondemand::value> find_field_unordered(const char *key) noexcept; + /** @overload simdjson_inline simdjson_result<arm64::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ + simdjson_inline simdjson_result<arm64::ondemand::value> operator[](std::string_view key) noexcept; + /** @overload simdjson_inline simdjson_result<arm64::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ + simdjson_inline simdjson_result<arm64::ondemand::value> operator[](const char *key) noexcept; + simdjson_result<arm64::ondemand::value> operator[](int) noexcept = delete; + + /** + * Get the type of this JSON value. It does not validate or consume the value. + * E.g., you must still call "is_null()" to check that a value is null even if + * "type()" returns json_type::null. + * + * Given a valid JSON document, the answer can be one of + * simdjson::ondemand::json_type::object, + * simdjson::ondemand::json_type::array, + * simdjson::ondemand::json_type::string, + * simdjson::ondemand::json_type::number, + * simdjson::ondemand::json_type::boolean, + * simdjson::ondemand::json_type::null. + * + * Starting with simdjson 4.0, this function will return simdjson::ondemand::json_type::unknown + * given a bad token. + * This allows you to identify a case such as {"key": NaN} and identify the NaN value. + * The simdjson::ondemand::json_type::unknown value should only happen with non-valid JSON. + * + * NOTE: If you're only expecting a value to be one type (a typical case), it's generally + * better to just call .get_double, .get_string, etc. and check for INCORRECT_TYPE (or just + * let it throw an exception). + */ + simdjson_inline simdjson_result<arm64::ondemand::json_type> type() noexcept; + simdjson_inline simdjson_result<bool> is_scalar() noexcept; + simdjson_inline simdjson_result<bool> is_string() noexcept; + simdjson_inline simdjson_result<bool> is_negative() noexcept; + simdjson_inline simdjson_result<bool> is_integer() noexcept; + simdjson_inline simdjson_result<arm64::number_type> get_number_type() noexcept; + simdjson_inline simdjson_result<arm64::ondemand::number> get_number() noexcept; + + /** @copydoc simdjson_inline std::string_view value::raw_json_token() const noexcept */ + simdjson_inline simdjson_result<std::string_view> raw_json_token() noexcept; + simdjson_inline simdjson_result<std::string_view> raw_json() noexcept; + + /** @copydoc simdjson_inline simdjson_result<const char *> current_location() noexcept */ + simdjson_inline simdjson_result<const char *> current_location() noexcept; + /** @copydoc simdjson_inline int32_t current_depth() const noexcept */ + simdjson_inline simdjson_result<int32_t> current_depth() const noexcept; + simdjson_inline simdjson_result<arm64::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result<arm64::ondemand::value> at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<std::vector<arm64::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; +}; + +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_H +/* end file simdjson/generic/ondemand/value.h for arm64 */ +/* including simdjson/generic/ondemand/logger.h for arm64: #include "simdjson/generic/ondemand/logger.h" */ +/* begin file simdjson/generic/ondemand/logger.h for arm64 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_LOGGER_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_LOGGER_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace arm64 { +namespace ondemand { + +// Logging should be free unless SIMDJSON_VERBOSE_LOGGING is set. Importantly, it is critical +// that the call to the log functions be side-effect free. Thus, for example, you should not +// create temporary std::string instances. +namespace logger { + +enum class log_level : int32_t { + info = 0, + error = 1 +}; + +#if SIMDJSON_VERBOSE_LOGGING + static constexpr const bool LOG_ENABLED = true; +#else + static constexpr const bool LOG_ENABLED = false; +#endif + +// We do not want these functions to be 'really inlined' since real inlining is +// for performance purposes and if you are using the loggers, you do not care about +// performance (or should not). +static inline void log_headers() noexcept; +// If args are provided, title will be treated as format string +template <typename... Args> +static inline void log_line(const json_iterator &iter, token_position index, depth_t depth, const char *title_prefix, const char *title, std::string_view detail, logger::log_level level, Args&&... args) noexcept; +template <typename... Args> +static inline void log_line(const json_iterator &iter, const char *title_prefix, const char *title, std::string_view detail, int delta, int depth_delta, logger::log_level level, Args&&... args) noexcept; +static inline void log_event(const json_iterator &iter, const char *type, std::string_view detail="", int delta=0, int depth_delta=0) noexcept; +static inline void log_value(const json_iterator &iter, token_position index, depth_t depth, const char *type, std::string_view detail="") noexcept; +static inline void log_value(const json_iterator &iter, const char *type, std::string_view detail="", int delta=-1, int depth_delta=0) noexcept; +static inline void log_start_value(const json_iterator &iter, token_position index, depth_t depth, const char *type, std::string_view detail="") noexcept; +static inline void log_start_value(const json_iterator &iter, const char *type, int delta=-1, int depth_delta=0) noexcept; +static inline void log_end_value(const json_iterator &iter, const char *type, int delta=-1, int depth_delta=0) noexcept; + +static inline void log_error(const json_iterator &iter, token_position index, depth_t depth, const char *error, const char *detail="") noexcept; +static inline void log_error(const json_iterator &iter, const char *error, const char *detail="", int delta=-1, int depth_delta=0) noexcept; + +static inline void log_event(const value_iterator &iter, const char *type, std::string_view detail="", int delta=0, int depth_delta=0) noexcept; +static inline void log_value(const value_iterator &iter, const char *type, std::string_view detail="", int delta=-1, int depth_delta=0) noexcept; +static inline void log_start_value(const value_iterator &iter, const char *type, int delta=-1, int depth_delta=0) noexcept; +static inline void log_end_value(const value_iterator &iter, const char *type, int delta=-1, int depth_delta=0) noexcept; +static inline void log_error(const value_iterator &iter, const char *error, const char *detail="", int delta=-1, int depth_delta=0) noexcept; + +} // namespace logger +} // namespace ondemand +} // namespace arm64 +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_ONDEMAND_LOGGER_H +/* end file simdjson/generic/ondemand/logger.h for arm64 */ +/* including simdjson/generic/ondemand/token_iterator.h for arm64: #include "simdjson/generic/ondemand/token_iterator.h" */ +/* begin file simdjson/generic/ondemand/token_iterator.h for arm64 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/logger.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace arm64 { +namespace ondemand { + +/** + * Iterates through JSON tokens (`{` `}` `[` `]` `,` `:` `"<string>"` `123` `true` `false` `null`) + * detected by stage 1. + * + * @private This is not intended for external use. + */ +class token_iterator { +public: + /** + * Create a new invalid token_iterator. + * + * Exists so you can declare a variable and later assign to it before use. + */ + simdjson_inline token_iterator() noexcept = default; + simdjson_inline token_iterator(token_iterator &&other) noexcept = default; + simdjson_inline token_iterator &operator=(token_iterator &&other) noexcept = default; + simdjson_inline token_iterator(const token_iterator &other) noexcept = default; + simdjson_inline token_iterator &operator=(const token_iterator &other) noexcept = default; + + /** + * Advance to the next token (returning the current one). + */ + simdjson_inline const uint8_t *return_current_and_advance() noexcept; + /** + * Reports the current offset in bytes from the start of the underlying buffer. + */ + simdjson_inline uint32_t current_offset() const noexcept; + /** + * Get the JSON text for a given token (relative). + * + * This is not null-terminated; it is a view into the JSON. + * + * @param delta The relative position of the token to retrieve. e.g. 0 = current token, + * 1 = next token, -1 = prev token. + * + * TODO consider a string_view, assuming the length will get stripped out by the optimizer when + * it is not used... + */ + simdjson_inline const uint8_t *peek(int32_t delta=0) const noexcept; + /** + * Get the maximum length of the JSON text for a given token. + * + * The length will include any whitespace at the end of the token. + * + * @param delta The relative position of the token to retrieve. e.g. 0 = current token, + * 1 = next token, -1 = prev token. + */ + simdjson_inline uint32_t peek_length(int32_t delta=0) const noexcept; + + /** + * Get the JSON text for a given token. + * + * This is not null-terminated; it is a view into the JSON. + * + * @param position The position of the token. + * + */ + simdjson_inline const uint8_t *peek(token_position position) const noexcept; + /** + * Get the maximum length of the JSON text for a given token. + * + * The length will include any whitespace at the end of the token. + * + * @param position The position of the token. + */ + simdjson_inline uint32_t peek_length(token_position position) const noexcept; + /** + * Get the maximum length of the JSON text for a root token. + * + * The length will include any whitespace at the end of the token. + * + * @param position The position of the token (start of the document). + */ + simdjson_inline uint32_t peek_root_length(token_position position) const noexcept; + /** + * Return the current index. + */ + simdjson_inline token_position position() const noexcept; + /** + * Reset to a previously saved index. + */ + simdjson_inline void set_position(token_position target_position) noexcept; + + // NOTE: we don't support a full C++ iterator interface, because we expect people to make + // different calls to advance the iterator based on *their own* state. + + simdjson_inline bool operator==(const token_iterator &other) const noexcept; + simdjson_inline bool operator!=(const token_iterator &other) const noexcept; + simdjson_inline bool operator>(const token_iterator &other) const noexcept; + simdjson_inline bool operator>=(const token_iterator &other) const noexcept; + simdjson_inline bool operator<(const token_iterator &other) const noexcept; + simdjson_inline bool operator<=(const token_iterator &other) const noexcept; + +protected: + simdjson_inline token_iterator(const uint8_t *buf, token_position position) noexcept; + + /** + * Get the index of the JSON text for a given token (relative). + * + * This is not null-terminated; it is a view into the JSON. + * + * @param delta The relative position of the token to retrieve. e.g. 0 = current token, + * 1 = next token, -1 = prev token. + */ + simdjson_inline uint32_t peek_index(int32_t delta=0) const noexcept; + /** + * Get the index of the JSON text for a given token. + * + * This is not null-terminated; it is a view into the JSON. + * + * @param position The position of the token. + * + */ + simdjson_inline uint32_t peek_index(token_position position) const noexcept; + + const uint8_t *buf{}; + token_position _position{}; + + friend class json_iterator; + friend class value_iterator; + friend class object; + template <typename... Args> + friend simdjson_inline void logger::log_line(const json_iterator &iter, const char *title_prefix, const char *title, std::string_view detail, int delta, int depth_delta, logger::log_level level, Args&&... args) noexcept; + template <typename... Args> + friend simdjson_inline void logger::log_line(const json_iterator &iter, token_position index, depth_t depth, const char *title_prefix, const char *title, std::string_view detail, logger::log_level level, Args&&... args) noexcept; +}; + +} // namespace ondemand +} // namespace arm64 +} // namespace simdjson + +namespace simdjson { + +template<> +struct simdjson_result<arm64::ondemand::token_iterator> : public arm64::implementation_simdjson_result_base<arm64::ondemand::token_iterator> { +public: + simdjson_inline simdjson_result(arm64::ondemand::token_iterator &&value) noexcept; ///< @private + simdjson_inline simdjson_result(error_code error) noexcept; ///< @private + simdjson_inline simdjson_result() noexcept = default; + simdjson_inline ~simdjson_result() noexcept = default; ///< @private +}; + +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_H +/* end file simdjson/generic/ondemand/token_iterator.h for arm64 */ +/* including simdjson/generic/ondemand/json_iterator.h for arm64: #include "simdjson/generic/ondemand/json_iterator.h" */ +/* begin file simdjson/generic/ondemand/json_iterator.h for arm64 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/token_iterator.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace arm64 { +namespace ondemand { + +/** + * Iterates through JSON tokens, keeping track of depth and string buffer. + * + * @private This is not intended for external use. + */ +class json_iterator { +protected: + token_iterator token{}; + ondemand::parser *parser{}; + /** + * Next free location in the string buffer. + * + * Used by raw_json_string::unescape() to have a place to unescape strings to. + */ + uint8_t *_string_buf_loc{}; + /** + * JSON error, if there is one. + * + * INCORRECT_TYPE and NO_SUCH_FIELD are *not* stored here, ever. + * + * PERF NOTE: we *hope* this will be elided into control flow, as it is only used (a) in the first + * iteration of the loop, or (b) for the final iteration after a missing comma is found in ++. If + * this is not elided, we should make sure it's at least not using up a register. Failing that, + * we should store it in document so there's only one of them. + */ + error_code error{SUCCESS}; + /** + * Depth of the current token in the JSON. + * + * - 0 = finished with document + * - 1 = document root value (could be [ or {, not yet known) + * - 2 = , or } inside root array/object + * - 3 = key or value inside root array/object. + */ + depth_t _depth{}; + /** + * Beginning of the document indexes. + * Normally we have root == parser->implementation->structural_indexes.get() + * but this may differ, especially in streaming mode (where we have several + * documents); + */ + token_position _root{}; + /** + * Normally, a json_iterator operates over a single document, but in + * some cases, we may have a stream of documents. This attribute is meant + * as meta-data: the json_iterator works the same irrespective of the + * value of this attribute. + */ + bool _streaming{false}; + +public: + simdjson_inline json_iterator() noexcept = default; + simdjson_inline json_iterator(json_iterator &&other) noexcept; + simdjson_inline json_iterator &operator=(json_iterator &&other) noexcept; + simdjson_inline explicit json_iterator(const json_iterator &other) noexcept = default; + simdjson_inline json_iterator &operator=(const json_iterator &other) noexcept = default; + /** + * Skips a JSON value, whether it is a scalar, array or object. + */ + simdjson_warn_unused simdjson_inline error_code skip_child(depth_t parent_depth) noexcept; + + /** + * Tell whether the iterator is still at the start + */ + simdjson_inline bool at_root() const noexcept; + + /** + * Tell whether we should be expected to run in streaming + * mode (iterating over many documents). It is pure metadata + * that does not affect how the iterator works. It is used by + * start_root_array() and start_root_object(). + */ + simdjson_inline bool streaming() const noexcept; + + /** + * Get the root value iterator + */ + simdjson_inline token_position root_position() const noexcept; + /** + * Assert that we are at the document depth (== 1) + */ + simdjson_inline void assert_at_document_depth() const noexcept; + /** + * Assert that we are at the root of the document + */ + simdjson_inline void assert_at_root() const noexcept; + + /** + * Tell whether the iterator is at the EOF mark + */ + simdjson_inline bool at_end() const noexcept; + + /** + * Tell whether the iterator is live (has not been moved). + */ + simdjson_inline bool is_alive() const noexcept; + + /** + * Abandon this iterator, setting depth to 0 (as if the document is finished). + */ + simdjson_inline void abandon() noexcept; + + /** + * Advance the current token without modifying depth. + */ + simdjson_inline const uint8_t *return_current_and_advance() noexcept; + + /** + * Returns true if there is a single token in the index (i.e., it is + * a JSON with a scalar value such as a single number). + * + * @return whether there is a single token + */ + simdjson_inline bool is_single_token() const noexcept; + + /** + * Assert that there are at least the given number of tokens left. + * + * Has no effect in release builds. + */ + simdjson_inline void assert_more_tokens(uint32_t required_tokens=1) const noexcept; + /** + * Assert that the given position addresses an actual token (is within bounds). + * + * Has no effect in release builds. + */ + simdjson_inline void assert_valid_position(token_position position) const noexcept; + /** + * Get the JSON text for a given token (relative). + * + * This is not null-terminated; it is a view into the JSON. + * + * @param delta The relative position of the token to retrieve. e.g. 0 = next token, -1 = prev token. + * + * TODO consider a string_view, assuming the length will get stripped out by the optimizer when + * it is not used ... + */ + simdjson_inline const uint8_t *peek(int32_t delta=0) const noexcept; + /** + * Get the maximum length of the JSON text for the current token (or relative). + * + * The length will include any whitespace at the end of the token. + * + * @param delta The relative position of the token to retrieve. e.g. 0 = next token, -1 = prev token. + */ + simdjson_inline uint32_t peek_length(int32_t delta=0) const noexcept; + /** + * Get a pointer to the current location in the input buffer. + * + * This is not null-terminated; it is a view into the JSON. + * + * You may be pointing outside of the input buffer: it is not generally + * safe to dereference this pointer. + */ + simdjson_inline const uint8_t *unsafe_pointer() const noexcept; + /** + * Get the JSON text for a given token. + * + * This is not null-terminated; it is a view into the JSON. + * + * @param position The position of the token to retrieve. + * + * TODO consider a string_view, assuming the length will get stripped out by the optimizer when + * it is not used ... + */ + simdjson_inline const uint8_t *peek(token_position position) const noexcept; + /** + * Get the maximum length of the JSON text for the current token (or relative). + * + * The length will include any whitespace at the end of the token. + * + * @param position The position of the token to retrieve. + */ + simdjson_inline uint32_t peek_length(token_position position) const noexcept; + /** + * Get the maximum length of the JSON text for the current root token. + * + * The length will include any whitespace at the end of the token. + * + * @param position The position of the token to retrieve. + */ + simdjson_inline uint32_t peek_root_length(token_position position) const noexcept; + /** + * Get the JSON text for the last token in the document. + * + * This is not null-terminated; it is a view into the JSON. + * + * TODO consider a string_view, assuming the length will get stripped out by the optimizer when + * it is not used ... + */ + simdjson_inline const uint8_t *peek_last() const noexcept; + + /** + * Ascend one level. + * + * Validates that the depth - 1 == parent_depth. + * + * @param parent_depth the expected parent depth. + */ + simdjson_inline void ascend_to(depth_t parent_depth) noexcept; + + /** + * Descend one level. + * + * Validates that the new depth == child_depth. + * + * @param child_depth the expected child depth. + */ + simdjson_inline void descend_to(depth_t child_depth) noexcept; + simdjson_inline void descend_to(depth_t child_depth, int32_t delta) noexcept; + + /** + * Get current depth. + */ + simdjson_inline depth_t depth() const noexcept; + + /** + * Get current (writeable) location in the string buffer. + */ + simdjson_inline uint8_t *&string_buf_loc() noexcept; + + /** + * Report an unrecoverable error, preventing further iteration. + * + * @param error The error to report. Must not be SUCCESS, UNINITIALIZED, INCORRECT_TYPE, or NO_SUCH_FIELD. + * @param message An error message to report with the error. + */ + simdjson_warn_unused simdjson_inline error_code report_error(error_code error, const char *message) noexcept; + + /** + * Log error, but don't stop iteration. + * @param error The error to report. Must be INCORRECT_TYPE, or NO_SUCH_FIELD. + * @param message An error message to report with the error. + */ + simdjson_warn_unused simdjson_inline error_code optional_error(error_code error, const char *message) noexcept; + + /** + * Take an input in json containing max_len characters and attempt to copy it over to tmpbuf, a buffer with + * N bytes of capacity. It will return false if N is too small (smaller than max_len) of if it is zero. + * The buffer (tmpbuf) is padded with space characters. + */ + simdjson_warn_unused simdjson_inline bool copy_to_buffer(const uint8_t *json, uint32_t max_len, uint8_t *tmpbuf, size_t N) noexcept; + + simdjson_inline token_position position() const noexcept; + /** + * Write the raw_json_string to the string buffer and return a string_view. + * Each raw_json_string should be unescaped once, or else the string buffer might + * overflow. + */ + simdjson_inline simdjson_result<std::string_view> unescape(raw_json_string in, bool allow_replacement) noexcept; + simdjson_inline simdjson_result<std::string_view> unescape_wobbly(raw_json_string in) noexcept; + + simdjson_inline void reenter_child(token_position position, depth_t child_depth) noexcept; + + simdjson_warn_unused simdjson_inline error_code consume_character(char c) noexcept; +#if SIMDJSON_DEVELOPMENT_CHECKS + simdjson_inline token_position start_position(depth_t depth) const noexcept; + simdjson_inline void set_start_position(depth_t depth, token_position position) noexcept; +#endif + + /* Useful for debugging and logging purposes. */ + inline std::string to_string() const noexcept; + + /** + * Returns the current location in the document if in bounds. + */ + inline simdjson_result<const char *> current_location() const noexcept; + + /** + * Updates this json iterator so that it is back at the beginning of the document, + * as if it had just been created. + */ + inline void rewind() noexcept; + /** + * This checks whether the {,},[,] are balanced so that the document + * ends with proper zero depth. This requires scanning the whole document + * and it may be expensive. It is expected that it will be rarely called. + * It does not attempt to match { with } and [ with ]. + */ + inline bool balanced() const noexcept; +protected: + simdjson_inline json_iterator(const uint8_t *buf, ondemand::parser *parser) noexcept; +#ifdef SIMDJSON_EXPERIMENTAL_ALLOW_INCOMPLETE_JSON + simdjson_inline json_iterator(const uint8_t *buf, ondemand::parser *parser, bool streaming) noexcept; +#endif // SIMDJSON_EXPERIMENTAL_ALLOW_INCOMPLETE_JSON + /// The last token before the end + simdjson_inline token_position last_position() const noexcept; + /// The token *at* the end. This points at gibberish and should only be used for comparison. + simdjson_inline token_position end_position() const noexcept; + /// The end of the buffer. + simdjson_inline token_position end() const noexcept; + + friend class document; + friend class document_stream; + friend class object; + friend class array; + friend class value; + friend class raw_json_string; + friend class parser; + friend class value_iterator; + friend class field; + template <typename... Args> + friend simdjson_inline void logger::log_line(const json_iterator &iter, const char *title_prefix, const char *title, std::string_view detail, int delta, int depth_delta, logger::log_level level, Args&&... args) noexcept; + template <typename... Args> + friend simdjson_inline void logger::log_line(const json_iterator &iter, token_position index, depth_t depth, const char *title_prefix, const char *title, std::string_view detail, logger::log_level level, Args&&... args) noexcept; +}; // json_iterator + +} // namespace ondemand +} // namespace arm64 +} // namespace simdjson + +namespace simdjson { + +template<> +struct simdjson_result<arm64::ondemand::json_iterator> : public arm64::implementation_simdjson_result_base<arm64::ondemand::json_iterator> { +public: + simdjson_inline simdjson_result(arm64::ondemand::json_iterator &&value) noexcept; ///< @private + simdjson_inline simdjson_result(error_code error) noexcept; ///< @private + + simdjson_inline simdjson_result() noexcept = default; +}; + +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_H +/* end file simdjson/generic/ondemand/json_iterator.h for arm64 */ +/* including simdjson/generic/ondemand/json_type.h for arm64: #include "simdjson/generic/ondemand/json_type.h" */ +/* begin file simdjson/generic/ondemand/json_type.h for arm64 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/numberparsing.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace arm64 { +namespace ondemand { + +/** + * The type of a JSON value. + */ +enum class json_type { + unknown=0, + // Start at 1 to catch uninitialized / default values more easily + array=1, ///< A JSON array ( [ 1, 2, 3 ... ] ) + object, ///< A JSON object ( { "a": 1, "b" 2, ... } ) + number, ///< A JSON number ( 1 or -2.3 or 4.5e6 ...) + string, ///< A JSON string ( "a" or "hello world\n" ...) + boolean, ///< A JSON boolean (true or false) + null ///< A JSON null (null) +}; + +/** + * A type representing a JSON number. + * The design of the struct is deliberately straight-forward. All + * functions return standard values with no error check. + */ +struct number { + + /** + * return the automatically determined type of + * the number: number_type::floating_point_number, + * number_type::signed_integer or number_type::unsigned_integer. + * + * enum class number_type { + * floating_point_number=1, /// a binary64 number + * signed_integer, /// a signed integer that fits in a 64-bit word using two's complement + * unsigned_integer /// a positive integer larger or equal to 1<<63 + * }; + */ + simdjson_inline ondemand::number_type get_number_type() const noexcept; + /** + * return true if the automatically determined type of + * the number is number_type::unsigned_integer. + */ + simdjson_inline bool is_uint64() const noexcept; + /** + * return the value as a uint64_t, only valid if is_uint64() is true. + */ + simdjson_inline uint64_t get_uint64() const noexcept; + simdjson_inline operator uint64_t() const noexcept; + + /** + * return true if the automatically determined type of + * the number is number_type::signed_integer. + */ + simdjson_inline bool is_int64() const noexcept; + /** + * return the value as a int64_t, only valid if is_int64() is true. + */ + simdjson_inline int64_t get_int64() const noexcept; + simdjson_inline operator int64_t() const noexcept; + + + /** + * return true if the automatically determined type of + * the number is number_type::floating_point_number. + */ + simdjson_inline bool is_double() const noexcept; + /** + * return the value as a double, only valid if is_double() is true. + */ + simdjson_inline double get_double() const noexcept; + simdjson_inline operator double() const noexcept; + + /** + * Convert the number to a double. Though it always succeed, the conversion + * may be lossy if the number cannot be represented exactly. + */ + simdjson_inline double as_double() const noexcept; + + +protected: + /** + * The next block of declaration is designed so that we can call the number parsing + * functions on a number type. They are protected and should never be used outside + * of the core simdjson library. + */ + friend class value_iterator; + template<typename W> + friend error_code numberparsing::write_float(const uint8_t *const src, bool negative, uint64_t i, const uint8_t * start_digits, size_t digit_count, int64_t exponent, W &writer); + template<typename W> + friend error_code numberparsing::parse_number(const uint8_t *const src, W &writer); + /** Store a signed 64-bit value to the number. */ + simdjson_inline void append_s64(int64_t value) noexcept; + /** Store an unsigned 64-bit value to the number. */ + simdjson_inline void append_u64(uint64_t value) noexcept; + /** Store a double value to the number. */ + simdjson_inline void append_double(double value) noexcept; + /** Specifies that the value is a double, but leave it undefined. */ + simdjson_inline void skip_double() noexcept; + /** + * End of friend declarations. + */ + + /** + * Our attributes are a union type (size = 64 bits) + * followed by a type indicator. + */ + union { + double floating_point_number; + int64_t signed_integer; + uint64_t unsigned_integer; + } payload{0}; + number_type type{number_type::signed_integer}; +}; + +/** + * Write the JSON type to the output stream + * + * @param out The output stream. + * @param type The json_type. + */ +inline std::ostream& operator<<(std::ostream& out, json_type type) noexcept; + +#if SIMDJSON_EXCEPTIONS +/** + * Send JSON type to an output stream. + * + * @param out The output stream. + * @param type The json_type. + * @throw simdjson_error if the result being printed has an error. If there is an error with the + * underlying output stream, that error will be propagated (simdjson_error will not be + * thrown). + */ +inline std::ostream& operator<<(std::ostream& out, simdjson_result<json_type> &type) noexcept(false); +#endif + +} // namespace ondemand +} // namespace arm64 +} // namespace simdjson + +namespace simdjson { + +template<> +struct simdjson_result<arm64::ondemand::json_type> : public arm64::implementation_simdjson_result_base<arm64::ondemand::json_type> { +public: + simdjson_inline simdjson_result(arm64::ondemand::json_type &&value) noexcept; ///< @private + simdjson_inline simdjson_result(error_code error) noexcept; ///< @private + simdjson_inline simdjson_result() noexcept = default; + simdjson_inline ~simdjson_result() noexcept = default; ///< @private +}; + +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_H +/* end file simdjson/generic/ondemand/json_type.h for arm64 */ +/* including simdjson/generic/ondemand/raw_json_string.h for arm64: #include "simdjson/generic/ondemand/raw_json_string.h" */ +/* begin file simdjson/generic/ondemand/raw_json_string.h for arm64 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace arm64 { +namespace ondemand { + +/** + * A string escaped per JSON rules, terminated with quote ("). They are used to represent + * unescaped keys inside JSON documents. + * + * (In other words, a pointer to the beginning of a string, just after the start quote, inside a + * JSON file.) + * + * This class is deliberately simplistic and has little functionality. You can + * compare a raw_json_string instance with an unescaped C string, but + * that is nearly all you can do. + * + * The raw_json_string is unescaped. If you wish to write an unescaped version of it to your own + * buffer, you may do so using the parser.unescape(string, buff) method, using an ondemand::parser + * instance. Doing so requires you to have a sufficiently large buffer. + * + * The raw_json_string instances originate typically from field instance which in turn represent + * key-value pairs from object instances. From a field instance, you get the raw_json_string + * instance by calling key(). You can, if you want a more usable string_view instance, call + * the unescaped_key() method on the field instance. You may also create a raw_json_string from + * any other string value, with the value.get_raw_json_string() method. Again, you can get + * a more usable string_view instance by calling get_string(). + * + */ +class raw_json_string { +public: + /** + * Create a new invalid raw_json_string. + * + * Exists so you can declare a variable and later assign to it before use. + */ + simdjson_inline raw_json_string() noexcept = default; + + /** + * Create a new invalid raw_json_string pointed at the given location in the JSON. + * + * The given location must be just *after* the beginning quote (") in the JSON file. + * + * It *must* be terminated by a ", and be a valid JSON string. + */ + simdjson_inline raw_json_string(const uint8_t * _buf) noexcept; + /** + * Get the raw pointer to the beginning of the string in the JSON (just after the "). + * + * It is possible for this function to return a null pointer if the instance + * has outlived its existence. + */ + simdjson_inline const char * raw() const noexcept; + + /** + * Get the character at index i. This is unchecked. + * [0] when the string is of length 0 returns the final quote ("). + */ + simdjson_inline char operator[](size_t i) const noexcept; + + /** + * This compares the current instance to the std::string_view target: returns true if + * they are byte-by-byte equal (no escaping is done) on target.size() characters, + * and if the raw_json_string instance has a quote character at byte index target.size(). + * We never read more than length + 1 bytes in the raw_json_string instance. + * If length is smaller than target.size(), this will return false. + * + * The std::string_view instance may contain any characters. However, the caller + * is responsible for setting length so that length bytes may be read in the + * raw_json_string. + * + * Performance: the comparison may be done using memcmp which may be efficient + * for long strings. + */ + simdjson_inline bool unsafe_is_equal(size_t length, std::string_view target) const noexcept; + + /** + * This compares the current instance to the std::string_view target: returns true if + * they are byte-by-byte equal (no escaping is done). + * The std::string_view instance should not contain unescaped quote characters: + * the caller is responsible for this check. See is_free_from_unescaped_quote. + * + * Performance: the comparison is done byte-by-byte which might be inefficient for + * long strings. + * + * If target is a compile-time constant, and your compiler likes you, + * you should be able to do the following without performance penalty... + * + * static_assert(raw_json_string::is_free_from_unescaped_quote(target), ""); + * s.unsafe_is_equal(target); + */ + simdjson_inline bool unsafe_is_equal(std::string_view target) const noexcept; + + /** + * This compares the current instance to the C string target: returns true if + * they are byte-by-byte equal (no escaping is done). + * The provided C string should not contain an unescaped quote character: + * the caller is responsible for this check. See is_free_from_unescaped_quote. + * + * If target is a compile-time constant, and your compiler likes you, + * you should be able to do the following without performance penalty... + * + * static_assert(raw_json_string::is_free_from_unescaped_quote(target), ""); + * s.unsafe_is_equal(target); + */ + simdjson_inline bool unsafe_is_equal(const char* target) const noexcept; + + /** + * This compares the current instance to the std::string_view target: returns true if + * they are byte-by-byte equal (no escaping is done). + */ + simdjson_inline bool is_equal(std::string_view target) const noexcept; + + /** + * This compares the current instance to the C string target: returns true if + * they are byte-by-byte equal (no escaping is done). + */ + simdjson_inline bool is_equal(const char* target) const noexcept; + + /** + * Returns true if target is free from unescaped quote. If target is known at + * compile-time, we might expect the computation to happen at compile time with + * many compilers (not all!). + */ + static simdjson_inline bool is_free_from_unescaped_quote(std::string_view target) noexcept; + static simdjson_inline bool is_free_from_unescaped_quote(const char* target) noexcept; + +private: + + + /** + * This will set the inner pointer to zero, effectively making + * this instance unusable. + */ + simdjson_inline void consume() noexcept { buf = nullptr; } + + /** + * Checks whether the inner pointer is non-null and thus usable. + */ + simdjson_inline simdjson_warn_unused bool alive() const noexcept { return buf != nullptr; } + + /** + * Unescape this JSON string, replacing \\ with \, \n with newline, etc. + * The result will be a valid UTF-8. + * + * ## IMPORTANT: string_view lifetime + * + * The string_view is only valid until the next parse() call on the parser. + * + * @param iter A json_iterator, which contains a buffer where the string will be written. + * @param allow_replacement Whether we allow replacement of invalid surrogate pairs. + */ + simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> unescape(json_iterator &iter, bool allow_replacement) const noexcept; + + /** + * Unescape this JSON string, replacing \\ with \, \n with newline, etc. + * The result may not be a valid UTF-8. https://simonsapin.github.io/wtf-8/ + * + * ## IMPORTANT: string_view lifetime + * + * The string_view is only valid until the next parse() call on the parser. + * + * @param iter A json_iterator, which contains a buffer where the string will be written. + */ + simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> unescape_wobbly(json_iterator &iter) const noexcept; + const uint8_t * buf{}; + friend class object; + friend class field; + friend class parser; + friend struct simdjson_result<raw_json_string>; +}; + +simdjson_unused simdjson_inline std::ostream &operator<<(std::ostream &, const raw_json_string &) noexcept; + +/** + * Comparisons between raw_json_string and std::string_view instances are potentially unsafe: the user is responsible + * for providing a string with no unescaped quote. Note that unescaped quotes cannot be present in valid JSON strings. + */ +simdjson_unused simdjson_inline bool operator==(const raw_json_string &a, std::string_view c) noexcept; +simdjson_unused simdjson_inline bool operator==(std::string_view c, const raw_json_string &a) noexcept; +simdjson_unused simdjson_inline bool operator!=(const raw_json_string &a, std::string_view c) noexcept; +simdjson_unused simdjson_inline bool operator!=(std::string_view c, const raw_json_string &a) noexcept; + + +} // namespace ondemand +} // namespace arm64 +} // namespace simdjson + +namespace simdjson { + +template<> +struct simdjson_result<arm64::ondemand::raw_json_string> : public arm64::implementation_simdjson_result_base<arm64::ondemand::raw_json_string> { +public: + simdjson_inline simdjson_result(arm64::ondemand::raw_json_string &&value) noexcept; ///< @private + simdjson_inline simdjson_result(error_code error) noexcept; ///< @private + simdjson_inline simdjson_result() noexcept = default; + simdjson_inline ~simdjson_result() noexcept = default; ///< @private + + simdjson_inline simdjson_result<const char *> raw() const noexcept; + simdjson_inline char operator[](size_t) const noexcept; + simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> unescape(arm64::ondemand::json_iterator &iter, bool allow_replacement) const noexcept; + simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> unescape_wobbly(arm64::ondemand::json_iterator &iter) const noexcept; +}; +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_H +/* end file simdjson/generic/ondemand/raw_json_string.h for arm64 */ +/* including simdjson/generic/ondemand/parser.h for arm64: #include "simdjson/generic/ondemand/parser.h" */ +/* begin file simdjson/generic/ondemand/parser.h for arm64 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_PARSER_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_PARSER_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#include <memory> +#include <thread> + +namespace simdjson { +namespace arm64 { +namespace ondemand { + +/** + * The default batch size for document_stream instances for this On-Demand kernel. + * Note that different On-Demand kernel may use a different DEFAULT_BATCH_SIZE value + * in the future. + */ +static constexpr size_t DEFAULT_BATCH_SIZE = 1000000; +/** + * Some adversary might try to set the batch size to 0 or 1, which might cause problems. + * We set a minimum of 32B since anything else is highly likely to be an error. In practice, + * most users will want a much larger batch size. + * + * All non-negative MINIMAL_BATCH_SIZE values should be 'safe' except that, obviously, no JSON + * document can ever span 0 or 1 byte and that very large values would create memory allocation issues. + */ +static constexpr size_t MINIMAL_BATCH_SIZE = 32; + +/** + * A JSON fragment iterator. + * + * This holds the actual iterator as well as the buffer for writing strings. + */ +class parser { +public: + /** + * Create a JSON parser. + * + * The new parser will have zero capacity. + */ + inline explicit parser(size_t max_capacity = SIMDJSON_MAXSIZE_BYTES) noexcept; + + inline parser(parser &&other) noexcept = default; + simdjson_inline parser(const parser &other) = delete; + simdjson_inline parser &operator=(const parser &other) = delete; + simdjson_inline parser &operator=(parser &&other) noexcept = default; + + /** Deallocate the JSON parser. */ + inline ~parser() noexcept = default; + + /** + * Start iterating an on-demand JSON document. + * + * ondemand::parser parser; + * document doc = parser.iterate(json); + * + * It is expected that the content is a valid UTF-8 file, containing a valid JSON document. + * Otherwise the iterate method may return an error. In particular, the whole input should be + * valid: we do not attempt to tolerate incorrect content either before or after a JSON + * document. If there is a UTF-8 BOM, the parser skips it. + * + * ### IMPORTANT: Validate what you use + * + * Calling iterate on an invalid JSON document may not immediately trigger an error. The call to + * iterate does not parse and validate the whole document. + * + * ### IMPORTANT: Buffer Lifetime + * + * Because parsing is done while you iterate, you *must* keep the JSON buffer around at least as + * long as the document iteration. + * + * ### IMPORTANT: Document Lifetime + * + * Only one iteration at a time can happen per parser, and the parser *must* be kept alive during + * iteration to ensure intermediate buffers can be accessed. Any document must be destroyed before + * you call parse() again or destroy the parser. + * + * ### REQUIRED: Buffer Padding + * + * The buffer must have at least SIMDJSON_PADDING extra allocated bytes. It does not matter what + * those bytes are initialized to, as long as they are allocated. These bytes will be read: if you + * using a sanitizer that verifies that no uninitialized byte is read, then you should initialize the + * SIMDJSON_PADDING bytes to avoid runtime warnings. + * + * ### std::string references + * + * If you pass a mutable std::string reference (std::string&), the parser will seek to extend + * its capacity to SIMDJSON_PADDING bytes beyond the end of the string. + * + * Whenever you pass an std::string reference, the parser will access the bytes beyond the end of + * the string but before the end of the allocated memory (std::string::capacity()). + * If you are using a sanitizer that checks for reading uninitialized bytes or std::string's + * container-overflow checks, you may encounter sanitizer warnings. + * You can safely ignore these warnings. Or you can call simdjson::pad(std::string&) to pad the + * string with SIMDJSON_PADDING spaces: this function returns a simdjson::padding_string_view + * which can be be passed to the parser's iterate function: + * + * std::string json = R"({ "foo": 1 } { "foo": 2 } { "foo": 3 } )"; + * document doc = parser.iterate(simdjson::pad(json)); + * + * @param json The JSON to parse. + * @param len The length of the JSON. + * @param capacity The number of bytes allocated in the JSON (must be at least len+SIMDJSON_PADDING). + * + * @return The document, or an error: + * - INSUFFICIENT_PADDING if the input has less than SIMDJSON_PADDING extra bytes. + * - MEMALLOC if realloc_if_needed the parser does not have enough capacity, and memory + * allocation fails. + * - EMPTY if the document is all whitespace. + * - UTF8_ERROR if the document is not valid UTF-8. + * - UNESCAPED_CHARS if a string contains control characters that must be escaped + * - UNCLOSED_STRING if there is an unclosed string in the document. + */ + simdjson_warn_unused simdjson_result<document> iterate(padded_string_view json) & noexcept; +#ifdef SIMDJSON_EXPERIMENTAL_ALLOW_INCOMPLETE_JSON + simdjson_warn_unused simdjson_result<document> iterate_allow_incomplete_json(padded_string_view json) & noexcept; +#endif // SIMDJSON_EXPERIMENTAL_ALLOW_INCOMPLETE_JSON + /** @overload simdjson_result<document> iterate(padded_string_view json) & noexcept */ + simdjson_warn_unused simdjson_result<document> iterate(const char *json, size_t len, size_t capacity) & noexcept; + /** @overload simdjson_result<document> iterate(padded_string_view json) & noexcept */ + simdjson_warn_unused simdjson_result<document> iterate(const uint8_t *json, size_t len, size_t capacity) & noexcept; + /** @overload simdjson_result<document> iterate(padded_string_view json) & noexcept */ + simdjson_warn_unused simdjson_result<document> iterate(std::string_view json, size_t capacity) & noexcept; + /** @overload simdjson_result<document> iterate(padded_string_view json) & noexcept */ + simdjson_warn_unused simdjson_result<document> iterate(const std::string &json) & noexcept; + /** @overload simdjson_result<document> iterate(padded_string_view json) & noexcept + The string instance might be have its capacity extended. Note that this can still + result in AddressSanitizer: container-overflow in some cases. */ + simdjson_warn_unused simdjson_result<document> iterate(std::string &json) & noexcept; + /** @overload simdjson_result<document> iterate(padded_string_view json) & noexcept */ + simdjson_warn_unused simdjson_result<document> iterate(const simdjson_result<padded_string> &json) & noexcept; + /** @overload simdjson_result<document> iterate(padded_string_view json) & noexcept */ + simdjson_warn_unused simdjson_result<document> iterate(const simdjson_result<padded_string_view> &json) & noexcept; + /** @overload simdjson_result<document> iterate(padded_string_view json) & noexcept */ + simdjson_warn_unused simdjson_result<document> iterate(padded_string &&json) & noexcept = delete; + + /** + * @private + * + * Start iterating an on-demand JSON document. + * + * ondemand::parser parser; + * json_iterator doc = parser.iterate(json); + * + * ### IMPORTANT: Buffer Lifetime + * + * Because parsing is done while you iterate, you *must* keep the JSON buffer around at least as + * long as the document iteration. + * + * ### IMPORTANT: Document Lifetime + * + * Only one iteration at a time can happen per parser, and the parser *must* be kept alive during + * iteration to ensure intermediate buffers can be accessed. Any document must be destroyed before + * you call parse() again or destroy the parser. + * + * The ondemand::document instance holds the iterator. The document must remain in scope + * while you are accessing instances of ondemand::value, ondemand::object, ondemand::array. + * + * ### REQUIRED: Buffer Padding + * + * The buffer must have at least SIMDJSON_PADDING extra allocated bytes. It does not matter what + * those bytes are initialized to, as long as they are allocated. These bytes will be read: if you + * using a sanitizer that verifies that no uninitialized byte is read, then you should initialize the + * SIMDJSON_PADDING bytes to avoid runtime warnings. + * + * @param json The JSON to parse. + * + * @return The iterator, or an error: + * - INSUFFICIENT_PADDING if the input has less than SIMDJSON_PADDING extra bytes. + * - MEMALLOC if realloc_if_needed the parser does not have enough capacity, and memory + * allocation fails. + * - EMPTY if the document is all whitespace. + * - UTF8_ERROR if the document is not valid UTF-8. + * - UNESCAPED_CHARS if a string contains control characters that must be escaped + * - UNCLOSED_STRING if there is an unclosed string in the document. + */ + simdjson_warn_unused simdjson_result<json_iterator> iterate_raw(padded_string_view json) & noexcept; + + + /** + * Parse a buffer containing many JSON documents. + * + * auto json = R"({ "foo": 1 } { "foo": 2 } { "foo": 3 } )"_padded; + * ondemand::parser parser; + * ondemand::document_stream docs = parser.iterate_many(json); + * for (auto & doc : docs) { + * std::cout << doc["foo"] << std::endl; + * } + * // Prints 1 2 3 + * + * No copy of the input buffer is made. + * + * The function is lazy: it may be that no more than one JSON document at a time is parsed. + * + * The caller is responsabile to ensure that the input string data remains unchanged and is + * not deleted during the loop. + * + * ### Format + * + * The buffer must contain a series of one or more JSON documents, concatenated into a single + * buffer, separated by ASCII whitespace. It effectively parses until it has a fully valid document, + * then starts parsing the next document at that point. (It does this with more parallelism and + * lookahead than you might think, though.) + * + * documents that consist of an object or array may omit the whitespace between them, concatenating + * with no separator. Documents that consist of a single primitive (i.e. documents that are not + * arrays or objects) MUST be separated with ASCII whitespace. + * + * The characters inside a JSON document, and between JSON documents, must be valid Unicode (UTF-8). + * If there is a UTF-8 BOM, the parser skips it. + * + * The documents must not exceed batch_size bytes (by default 1MB) or they will fail to parse. + * Setting batch_size to excessively large or excessively small values may impact negatively the + * performance. + * + * ### Threads + * + * When compiled with SIMDJSON_THREADS_ENABLED, this method will use a single thread under the + * hood to do some lookahead. + * + * ### REQUIRED: Buffer Padding + * + * The buffer must have at least SIMDJSON_PADDING extra allocated bytes. It does not matter what + * those bytes are initialized to, as long as they are allocated. These bytes will be read: if you + * using a sanitizer that verifies that no uninitialized byte is read, then you should initialize the + * SIMDJSON_PADDING bytes to avoid runtime warnings. + * + * This is checked automatically with all iterate_many function calls, except for the two + * that take pointers (const char* or const uint8_t*). + * + * ### Threads + * + * ### Parser Capacity + * + * If the parser's current capacity is less than batch_size, it will allocate enough capacity + * to handle it (up to max_capacity). + * + * @param buf The concatenated JSON to parse. + * @param len The length of the concatenated JSON. + * @param batch_size The batch size to use. MUST be larger than the largest document. The sweet + * spot is cache-related: small enough to fit in cache, yet big enough to + * parse as many documents as possible in one tight loop. + * Defaults to 10MB, which has been a reasonable sweet spot in our tests. + * @param allow_comma_separated (defaults on false) This allows a mode where the documents are + * separated by commas instead of whitespace. It comes with a performance + * penalty because the entire document is indexed at once (and the document must be + * less than 4 GB), and there is no multithreading. In this mode, the batch_size parameter + * is effectively ignored, as it is set to at least the document size. + * @return The stream, or an error. An empty input will yield 0 documents rather than an EMPTY error. Errors: + * - MEMALLOC if the parser does not have enough capacity and memory allocation fails + * - CAPACITY if the parser does not have enough capacity and batch_size > max_capacity. + * - other json errors if parsing fails. You should not rely on these errors to always the same for the + * same document: they may vary under runtime dispatch (so they may vary depending on your system and hardware). + */ + inline simdjson_result<document_stream> iterate_many(const uint8_t *buf, size_t len, size_t batch_size = DEFAULT_BATCH_SIZE, bool allow_comma_separated = false) noexcept; + /** @overload parse_many(const uint8_t *buf, size_t len, size_t batch_size) */ + inline simdjson_result<document_stream> iterate_many(padded_string_view json, size_t batch_size = DEFAULT_BATCH_SIZE, bool allow_comma_separated = false) noexcept; + /** @overload parse_many(const uint8_t *buf, size_t len, size_t batch_size) */ + inline simdjson_result<document_stream> iterate_many(const char *buf, size_t len, size_t batch_size = DEFAULT_BATCH_SIZE, bool allow_comma_separated = false) noexcept; + /** @overload parse_many(const uint8_t *buf, size_t len, size_t batch_size) */ + inline simdjson_result<document_stream> iterate_many(const std::string &s, size_t batch_size = DEFAULT_BATCH_SIZE, bool allow_comma_separated = false) noexcept; + /** @overload parse_many(const uint8_t *buf, size_t len, size_t batch_size) + the string might be automatically padded with up to SIMDJSON_PADDING whitespace characters */ + inline simdjson_result<document_stream> iterate_many(std::string &s, size_t batch_size = DEFAULT_BATCH_SIZE, bool allow_comma_separated = false) noexcept; + /** @overload parse_many(const uint8_t *buf, size_t len, size_t batch_size) */ + inline simdjson_result<document_stream> iterate_many(const padded_string &s, size_t batch_size = DEFAULT_BATCH_SIZE, bool allow_comma_separated = false) noexcept; + /** @private We do not want to allow implicit conversion from C string to std::string. */ + simdjson_result<document_stream> iterate_many(const char *buf, size_t batch_size = DEFAULT_BATCH_SIZE) noexcept = delete; + + /** The capacity of this parser (the largest document it can process). */ + simdjson_pure simdjson_inline size_t capacity() const noexcept; + /** The maximum capacity of this parser (the largest document it is allowed to process). */ + simdjson_pure simdjson_inline size_t max_capacity() const noexcept; + simdjson_inline void set_max_capacity(size_t max_capacity) noexcept; + /** + * The maximum depth of this parser (the most deeply nested objects and arrays it can process). + * This parameter is only relevant when the macro SIMDJSON_DEVELOPMENT_CHECKS is set to true. + * The document's instance current_depth() method should be used to monitor the parsing + * depth and limit it if desired. + */ + simdjson_pure simdjson_inline size_t max_depth() const noexcept; + + /** + * Ensure this parser has enough memory to process JSON documents up to `capacity` bytes in length + * and `max_depth` depth. + * + * The max_depth parameter is only relevant when the macro SIMDJSON_DEVELOPMENT_CHECKS is set to true. + * The document's instance current_depth() method should be used to monitor the parsing + * depth and limit it if desired. + * + * @param capacity The new capacity. + * @param max_depth The new max_depth. Defaults to DEFAULT_MAX_DEPTH. + * @return The error, if there is one. + */ + simdjson_warn_unused error_code allocate(size_t capacity, size_t max_depth=DEFAULT_MAX_DEPTH) noexcept; + + #ifdef SIMDJSON_THREADS_ENABLED + /** + * The parser instance can use threads when they are available to speed up some + * operations. It is enabled by default. Changing this attribute will change the + * behavior of the parser for future operations. + */ + bool threaded{true}; + #else + /** + * When SIMDJSON_THREADS_ENABLED is not defined, the parser instance cannot use threads. + */ + bool threaded{false}; + #endif + /** + * Unescape this JSON string, replacing \\ with \, \n with newline, etc. to a user-provided buffer. + * The result must be valid UTF-8. + * The provided pointer is advanced to the end of the string by reference, and a string_view instance + * is returned. You can ensure that your buffer is large enough by allocating a block of memory at least + * as large as the input JSON plus SIMDJSON_PADDING and then unescape all strings to this one buffer. + * + * This unescape function is a low-level function. If you want a more user-friendly approach, you should + * avoid raw_json_string instances (e.g., by calling unescaped_key() instead of key() or get_string() + * instead of get_raw_json_string()). + * + * ## IMPORTANT: string_view lifetime + * + * The string_view is only valid as long as the bytes in dst. + * + * @param raw_json_string input + * @param dst A pointer to a buffer at least large enough to write this string as well as + * an additional SIMDJSON_PADDING bytes. + * @param allow_replacement Whether we allow a replacement if the input string contains unmatched surrogate pairs. + * @return A string_view pointing at the unescaped string in dst + * @error STRING_ERROR if escapes are incorrect. + */ + simdjson_inline simdjson_result<std::string_view> unescape(raw_json_string in, uint8_t *&dst, bool allow_replacement = false) const noexcept; + + /** + * Unescape this JSON string, replacing \\ with \, \n with newline, etc. to a user-provided buffer. + * The result may not be valid UTF-8. See https://simonsapin.github.io/wtf-8/ + * The provided pointer is advanced to the end of the string by reference, and a string_view instance + * is returned. You can ensure that your buffer is large enough by allocating a block of memory at least + * as large as the input JSON plus SIMDJSON_PADDING and then unescape all strings to this one buffer. + * + * This unescape function is a low-level function. If you want a more user-friendly approach, you should + * avoid raw_json_string instances (e.g., by calling unescaped_key() instead of key() or get_string() + * instead of get_raw_json_string()). + * + * ## IMPORTANT: string_view lifetime + * + * The string_view is only valid as long as the bytes in dst. + * + * @param raw_json_string input + * @param dst A pointer to a buffer at least large enough to write this string as well as + * an additional SIMDJSON_PADDING bytes. + * @return A string_view pointing at the unescaped string in dst + * @error STRING_ERROR if escapes are incorrect. + */ + simdjson_inline simdjson_result<std::string_view> unescape_wobbly(raw_json_string in, uint8_t *&dst) const noexcept; + +#if SIMDJSON_DEVELOPMENT_CHECKS + /** + * Returns true if string_buf_loc is outside of the allocated range for the + * the string buffer. When true, it indicates that the string buffer has overflowed. + * This is a development-time check that is not needed in production. It can be + * used to detect buffer overflows in the string buffer and usafe usage of the + * string buffer. + */ + bool string_buffer_overflow(const uint8_t *string_buf_loc) const noexcept; +#endif + + /** + * Get a unique parser instance corresponding to the current thread. + * This instance can be safely used within the current thread, but it should + * not be passed to other threads. + * + * A parser should only be used for one document at a time. + * + * Our simdjson::from functions use this parser instance. + * + * You can free the related parser by calling release_parser(). + */ + static simdjson_inline simdjson_warn_unused ondemand::parser& get_parser(); + /** + * Release the parser instance initialized by get_parser() and all the + * associated resources (memory). Returns true if a parser instance + * was released. + */ + static simdjson_inline bool release_parser(); + +private: + friend bool release_parser(); + friend ondemand::parser& get_parser(); + /** Get the thread-local parser instance, allocates it if needed */ + static simdjson_inline simdjson_warn_unused std::unique_ptr<ondemand::parser>& get_parser_instance(); + /** Get the thread-local parser instance, it might be null */ + static simdjson_inline simdjson_warn_unused std::unique_ptr<ondemand::parser>& get_threadlocal_parser_if_exists(); + /** @private [for benchmarking access] The implementation to use */ + std::unique_ptr<simdjson::internal::dom_parser_implementation> implementation{}; + size_t _capacity{0}; + size_t _max_capacity; + size_t _max_depth{DEFAULT_MAX_DEPTH}; + std::unique_ptr<uint8_t[]> string_buf{}; + +#if SIMDJSON_DEVELOPMENT_CHECKS + std::unique_ptr<token_position[]> start_positions{}; +#endif + + friend class json_iterator; + friend class document_stream; +}; + +} // namespace ondemand +} // namespace arm64 +} // namespace simdjson + +namespace simdjson { + +template<> +struct simdjson_result<arm64::ondemand::parser> : public arm64::implementation_simdjson_result_base<arm64::ondemand::parser> { +public: + simdjson_inline simdjson_result(arm64::ondemand::parser &&value) noexcept; ///< @private + simdjson_inline simdjson_result(error_code error) noexcept; ///< @private + simdjson_inline simdjson_result() noexcept = default; +}; + +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_ONDEMAND_PARSER_H +/* end file simdjson/generic/ondemand/parser.h for arm64 */ + +// All other declarations +/* including simdjson/generic/ondemand/array.h for arm64: #include "simdjson/generic/ondemand/array.h" */ +/* begin file simdjson/generic/ondemand/array.h for arm64 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_ARRAY_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */ +/* amalgamation skipped (editor-only): #include <vector> */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace arm64 { +namespace ondemand { + +/** + * A forward-only JSON array. + */ +class array { +public: + /** + * Create a new invalid array. + * + * Exists so you can declare a variable and later assign to it before use. + */ + simdjson_inline array() noexcept = default; + + /** + * Begin array iteration. + * + * Part of the std::iterable interface. + */ + simdjson_inline simdjson_result<array_iterator> begin() noexcept; + /** + * Sentinel representing the end of the array. + * + * Part of the std::iterable interface. + */ + simdjson_inline simdjson_result<array_iterator> end() noexcept; + /** + * This method scans the array and counts the number of elements. + * The count_elements method should always be called before you have begun + * iterating through the array: it is expected that you are pointing at + * the beginning of the array. + * The runtime complexity is linear in the size of the array. After + * calling this function, if successful, the array is 'rewinded' at its + * beginning as if it had never been accessed. If the JSON is malformed (e.g., + * there is a missing comma), then an error is returned and it is no longer + * safe to continue. Note that count_elements() does not validate the JSON values, + * only the structure of the array. + * + * To check that an array is empty, it is more performant to use + * the is_empty() method. + */ + simdjson_inline simdjson_result<size_t> count_elements() & noexcept; + /** + * This method scans the beginning of the array and checks whether the + * array is empty. + * The runtime complexity is constant time. After + * calling this function, if successful, the array is 'rewinded' at its + * beginning as if it had never been accessed. If the JSON is malformed (e.g., + * there is a missing comma), then an error is returned and it is no longer + * safe to continue. + */ + simdjson_inline simdjson_result<bool> is_empty() & noexcept; + /** + * Reset the iterator so that we are pointing back at the + * beginning of the array. You should still consume values only once even if you + * can iterate through the array more than once. If you unescape a string + * within the array more than once, you have unsafe code. Note that rewinding + * an array means that you may need to reparse it anew: it is not a free + * operation. + * + * @returns true if the array contains some elements (not empty) + */ + inline simdjson_result<bool> reset() & noexcept; + /** + * Get the value associated with the given JSON pointer. We use the RFC 6901 + * https://tools.ietf.org/html/rfc6901 standard, interpreting the current node + * as the root of its own JSON document. + * + * ondemand::parser parser; + * auto json = R"([ { "foo": { "a": [ 10, 20, 30 ] }} ])"_padded; + * auto doc = parser.iterate(json); + * doc.at_pointer("/0/foo/a/1") == 20 + * + * Note that at_pointer() called on the document automatically calls the document's rewind + * method between each call. It invalidates all previously accessed arrays, objects and values + * that have not been consumed. Yet it is not the case when calling at_pointer on an array + * instance: there is no rewind and no invalidation. + * + * You may only call at_pointer on an array after it has been created, but before it has + * been first accessed. When calling at_pointer on an array, the pointer is advanced to + * the location indicated by the JSON pointer (in case of success). It is no longer possible + * to call at_pointer on the same array. + * + * Also note that at_pointer() relies on find_field() which implies that we do not unescape keys when matching. + * + * @return The value associated with the given JSON pointer, or: + * - NO_SUCH_FIELD if a field does not exist in an object + * - INDEX_OUT_OF_BOUNDS if an array index is larger than an array length + * - INCORRECT_TYPE if a non-integer is used to access an array + * - INVALID_JSON_POINTER if the JSON pointer is invalid and cannot be parsed + */ + inline simdjson_result<value> at_pointer(std::string_view json_pointer) noexcept; + + /** + * Get the value associated with the given JSONPath expression. We only support + * JSONPath queries that trivially convertible to JSON Pointer queries: key + * names and array indices. + * + * https://www.rfc-editor.org/rfc/rfc9535 (RFC 9535) + * + * @return The value associated with the given JSONPath expression, or: + * - INVALID_JSON_POINTER if the JSONPath to JSON Pointer conversion fails + * - NO_SUCH_FIELD if a field does not exist in an object + * - INDEX_OUT_OF_BOUNDS if an array index is larger than an array length + * - INCORRECT_TYPE if a non-integer is used to access an array + */ + inline simdjson_result<value> at_path(std::string_view json_path) noexcept; + + /** + * Get all values matching the given JSONPath expression with wildcard support. + * Supports wildcard patterns like "[*]" to match all array elements. + * + * @param json_path JSONPath expression with wildcards + * @return Vector of values matching the wildcard pattern + */ + inline simdjson_result<std::vector<value>> at_path_with_wildcard(std::string_view json_path) noexcept; + + /** + * Consumes the array and returns a string_view instance corresponding to the + * array as represented in JSON. It points inside the original document. + */ + simdjson_inline simdjson_result<std::string_view> raw_json() noexcept; + + /** + * Get the value at the given index. This function has linear-time complexity. + * This function should only be called once on an array instance since the array iterator is not reset between each call. + * + * @return The value at the given index, or: + * - INDEX_OUT_OF_BOUNDS if the array index is larger than an array length + */ + simdjson_inline simdjson_result<value> at(size_t index) noexcept; + +#if SIMDJSON_SUPPORTS_CONCEPTS + /** + * Get this array as the given type. + * + * @param out This is set to a value of the given type, parsed from the JSON. If there is an error, this may not be initialized. + * @returns INCORRECT_TYPE If the JSON array is not of the given type. + * @returns SUCCESS If the parse succeeded and the out parameter was set to the value. + */ + template <typename T> + simdjson_warn_unused simdjson_inline error_code get(T &out) + noexcept(custom_deserializable<T, array> ? nothrow_custom_deserializable<T, array> : true) { + static_assert(custom_deserializable<T, array>); + return deserialize(*this, out); + } + /** + * Get this array as the given type. + * + * @returns A value of the given type, parsed from the JSON. + * @returns INCORRECT_TYPE If the JSON value is not the given type. + */ + template <typename T> + simdjson_inline simdjson_result<T> get() + noexcept(custom_deserializable<T, value> ? nothrow_custom_deserializable<T, value> : true) + { + static_assert(std::is_default_constructible<T>::value, "The specified type is not default constructible."); + T out{}; + SIMDJSON_TRY(get<T>(out)); + return out; + } +#endif // SIMDJSON_SUPPORTS_CONCEPTS +protected: + /** + * Go to the end of the array, no matter where you are right now. + */ + simdjson_warn_unused simdjson_inline error_code consume() noexcept; + + /** + * Begin array iteration. + * + * @param iter The iterator. Must be where the initial [ is expected. Will be *moved* into the + * resulting array. + * @error INCORRECT_TYPE if the iterator is not at [. + */ + static simdjson_inline simdjson_result<array> start(value_iterator &iter) noexcept; + /** + * Begin array iteration from the root. + * + * @param iter The iterator. Must be where the initial [ is expected. Will be *moved* into the + * resulting array. + * @error INCORRECT_TYPE if the iterator is not at [. + * @error TAPE_ERROR if there is no closing ] at the end of the document. + */ + static simdjson_inline simdjson_result<array> start_root(value_iterator &iter) noexcept; + /** + * Begin array iteration. + * + * This version of the method should be called after the initial [ has been verified, and is + * intended for use by switch statements that check the type of a value. + * + * @param iter The iterator. Must be after the initial [. Will be *moved* into the resulting array. + */ + static simdjson_inline simdjson_result<array> started(value_iterator &iter) noexcept; + + /** + * Create an array at the given Internal array creation. Call array::start() or array::started() instead of this. + * + * @param iter The iterator. Must either be at the start of the first element with iter.is_alive() + * == true, or past the [] with is_alive() == false if the array is empty. Will be *moved* + * into the resulting array. + */ + simdjson_inline array(const value_iterator &iter) noexcept; + + /** + * Iterator marking current position. + * + * iter.is_alive() == false indicates iteration is complete. + */ + value_iterator iter{}; + + friend class value; + friend class document; + friend struct simdjson_result<value>; + friend struct simdjson_result<array>; + friend class array_iterator; +}; + +} // namespace ondemand +} // namespace arm64 +} // namespace simdjson + +namespace simdjson { + +template<> +struct simdjson_result<arm64::ondemand::array> : public arm64::implementation_simdjson_result_base<arm64::ondemand::array> { +public: + simdjson_inline simdjson_result(arm64::ondemand::array &&value) noexcept; ///< @private + simdjson_inline simdjson_result(error_code error) noexcept; ///< @private + simdjson_inline simdjson_result() noexcept = default; + + simdjson_inline simdjson_result<arm64::ondemand::array_iterator> begin() noexcept; + simdjson_inline simdjson_result<arm64::ondemand::array_iterator> end() noexcept; + inline simdjson_result<size_t> count_elements() & noexcept; + inline simdjson_result<bool> is_empty() & noexcept; + inline simdjson_result<bool> reset() & noexcept; + simdjson_inline simdjson_result<arm64::ondemand::value> at(size_t index) noexcept; + simdjson_inline simdjson_result<arm64::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result<arm64::ondemand::value> at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<std::vector<arm64::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<std::string_view> raw_json() noexcept; +#if SIMDJSON_SUPPORTS_CONCEPTS + // TODO: move this code into object-inl.h + + template<typename T> + simdjson_inline simdjson_result<T> get() noexcept { + if (error()) { return error(); } + if constexpr (std::is_same_v<T, arm64::ondemand::array>) { + return first; + } + return first.get<T>(); + } + template<typename T> + simdjson_warn_unused simdjson_inline error_code get(T& out) noexcept { + if (error()) { return error(); } + if constexpr (std::is_same_v<T, arm64::ondemand::array>) { + out = first; + } else { + SIMDJSON_TRY( first.get<T>(out) ); + } + return SUCCESS; + } +#endif // SIMDJSON_SUPPORTS_CONCEPTS +}; + +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_H +/* end file simdjson/generic/ondemand/array.h for arm64 */ +/* including simdjson/generic/ondemand/array_iterator.h for arm64: #include "simdjson/generic/ondemand/array_iterator.h" */ +/* begin file simdjson/generic/ondemand/array_iterator.h for arm64 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H */ +/* amalgamation skipped (editor-only): #include <iterator> */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + + +namespace simdjson { +namespace arm64 { +namespace ondemand { + +/** + * A forward-only JSON array. + * + * This is an input_iterator, meaning: + * - It is forward-only + * - * must be called at most once per element. + * - ++ must be called exactly once in between each * (*, ++, *, ++, * ...) + */ +class array_iterator { +public: + using iterator_category = std::input_iterator_tag; + using value_type = simdjson_result<value>; + using difference_type = std::ptrdiff_t; + using pointer = void; + using reference = value_type; + + /** Create a new, invalid array iterator. */ + simdjson_inline array_iterator() noexcept = default; + + // + // Iterator interface + // + + /** + * Get the current element. + * + * Part of the std::iterator interface. + */ + simdjson_inline simdjson_result<value> + operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. + /** + * Check if we are at the end of the JSON. + * + * Part of the std::iterator interface. + * + * @return true if there are no more elements in the JSON array. + */ + simdjson_inline bool operator==(const array_iterator &) const noexcept; + /** + * Check if there are more elements in the JSON array. + * + * Part of the std::iterator interface. + * + * @return true if there are more elements in the JSON array. + */ + simdjson_inline bool operator!=(const array_iterator &) const noexcept; + /** + * Move to the next element. + * + * Part of the std::iterator interface. + */ + simdjson_inline array_iterator &operator++() noexcept; + + /** + * Check if the array is at the end. + */ + simdjson_warn_unused simdjson_inline bool at_end() const noexcept; + +private: +#if SIMDJSON_DEVELOPMENT_CHECKS + bool has_been_referenced{false}; +#endif + value_iterator iter{}; + + simdjson_inline array_iterator(const value_iterator &iter) noexcept; + + friend class array; + friend class value; + friend struct simdjson_result<array_iterator>; +}; + +} // namespace ondemand +} // namespace arm64 +} // namespace simdjson + +namespace simdjson { + +template<> +struct simdjson_result<arm64::ondemand::array_iterator> : public arm64::implementation_simdjson_result_base<arm64::ondemand::array_iterator> { + using iterator_category = std::input_iterator_tag; + using value_type = simdjson_result<arm64::ondemand::value>; + using difference_type = std::ptrdiff_t; + using pointer = void; + using reference = value_type; + + simdjson_inline simdjson_result(arm64::ondemand::array_iterator &&value) noexcept; ///< @private + simdjson_inline simdjson_result(error_code error) noexcept; ///< @private + simdjson_inline simdjson_result() noexcept = default; + + // + // Iterator interface + // + + simdjson_inline simdjson_result<arm64::ondemand::value> operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. + simdjson_inline bool operator==(const simdjson_result<arm64::ondemand::array_iterator> &) const noexcept; + simdjson_inline bool operator!=(const simdjson_result<arm64::ondemand::array_iterator> &) const noexcept; + simdjson_inline simdjson_result<arm64::ondemand::array_iterator> &operator++() noexcept; + + simdjson_warn_unused simdjson_inline bool at_end() const noexcept; +}; + +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H +/* end file simdjson/generic/ondemand/array_iterator.h for arm64 */ +/* including simdjson/generic/ondemand/document.h for arm64: #include "simdjson/generic/ondemand/document.h" */ +/* begin file simdjson/generic/ondemand/document.h for arm64 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/deserialize.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */ +/* amalgamation skipped (editor-only): #include <vector> */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + + +namespace simdjson { +namespace arm64 { +namespace ondemand { + +/** + * A JSON document. It holds a json_iterator instance. + * + * Used by tokens to get text, and string buffer location. + * + * You must keep the document around during iteration. + */ +class document { +public: + /** + * Create a new invalid document. + * + * Exists so you can declare a variable and later assign to it before use. + */ + simdjson_inline document() noexcept = default; + simdjson_inline document(const document &other) noexcept = delete; // pass your documents by reference, not by copy + simdjson_inline document(document &&other) noexcept = default; + simdjson_inline document &operator=(const document &other) noexcept = delete; + simdjson_inline document &operator=(document &&other) noexcept = default; + + /** + * Cast this JSON value to an array. + * + * @returns An object that can be used to iterate the array. + * @returns INCORRECT_TYPE If the JSON value is not an array. + */ + simdjson_inline simdjson_result<array> get_array() & noexcept; + /** + * Cast this JSON value to an object. + * + * @returns An object that can be used to look up or iterate fields. + * @returns INCORRECT_TYPE If the JSON value is not an object. + */ + simdjson_inline simdjson_result<object> get_object() & noexcept; + /** + * Cast this JSON value to an unsigned integer. + * + * @returns A signed 64-bit integer. + * @returns INCORRECT_TYPE If the JSON value is not a 64-bit unsigned integer. + */ + simdjson_inline simdjson_result<uint64_t> get_uint64() noexcept; + /** + * Cast this JSON value (inside string) to an unsigned integer. + * + * @returns A signed 64-bit integer. + * @returns INCORRECT_TYPE If the JSON value is not a 64-bit unsigned integer. + */ + simdjson_inline simdjson_result<uint64_t> get_uint64_in_string() noexcept; + /** + * Cast this JSON value to a signed integer. + * + * @returns A signed 64-bit integer. + * @returns INCORRECT_TYPE If the JSON value is not a 64-bit integer. + */ + simdjson_inline simdjson_result<int64_t> get_int64() noexcept; + /** + * Cast this JSON value (inside string) to a signed integer. + * + * @returns A signed 64-bit integer. + * @returns INCORRECT_TYPE If the JSON value is not a 64-bit integer. + */ + simdjson_inline simdjson_result<int64_t> get_int64_in_string() noexcept; + /** + * Cast this JSON value to a double. + * + * @returns A double. + * @returns INCORRECT_TYPE If the JSON value is not a valid floating-point number. + */ + simdjson_inline simdjson_result<double> get_double() noexcept; + + /** + * Cast this JSON value (inside string) to a double. + * + * @returns A double. + * @returns INCORRECT_TYPE If the JSON value is not a valid floating-point number. + */ + simdjson_inline simdjson_result<double> get_double_in_string() noexcept; + /** + * Cast this JSON value to a string. + * + * The string is guaranteed to be valid UTF-8. + * + * Important: Calling get_string() twice on the same document is an error. + * + * @param Whether to allow a replacement character for unmatched surrogate pairs. + * @returns An UTF-8 string. The string is stored in the parser and will be invalidated the next + * time it parses a document or when it is destroyed. + * @returns INCORRECT_TYPE if the JSON value is not a string. + */ + simdjson_inline simdjson_result<std::string_view> get_string(bool allow_replacement = false) noexcept; + /** + * Attempts to fill the provided std::string reference with the parsed value of the current string. + * + * The string is guaranteed to be valid UTF-8. + * + * Important: a value should be consumed once. Calling get_string() twice on the same value + * is an error. + * + * Performance: This method may be slower than get_string() or get_string(bool) because it may need to allocate memory. + * We recommend you avoid allocating an std::string unless you need to. + * + * @returns INCORRECT_TYPE if the JSON value is not a string. Otherwise, we return SUCCESS. + */ + template <typename string_type> + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + /** + * Cast this JSON value to a string. + * + * The string is not guaranteed to be valid UTF-8. See https://simonsapin.github.io/wtf-8/ + * + * Important: Calling get_wobbly_string() twice on the same document is an error. + * + * @returns An UTF-8 string. The string is stored in the parser and will be invalidated the next + * time it parses a document or when it is destroyed. + * @returns INCORRECT_TYPE if the JSON value is not a string. + */ + simdjson_inline simdjson_result<std::string_view> get_wobbly_string() noexcept; + /** + * Cast this JSON value to a raw_json_string. + * + * The string is guaranteed to be valid UTF-8, and may have escapes in it (e.g. \\ or \n). + * + * @returns A pointer to the raw JSON for the given string. + * @returns INCORRECT_TYPE if the JSON value is not a string. + */ + simdjson_inline simdjson_result<raw_json_string> get_raw_json_string() noexcept; + /** + * Cast this JSON value to a bool. + * + * @returns A bool value. + * @returns INCORRECT_TYPE if the JSON value is not true or false. + */ + simdjson_inline simdjson_result<bool> get_bool() noexcept; + /** + * Cast this JSON value to a value when the document is an object or an array. + * + * You must not have begun iterating through the object or array. When + * SIMDJSON_DEVELOPMENT_CHECKS is set to 1 (which is the case when building in Debug mode + * by default), and you have already begun iterating, + * you will get an OUT_OF_ORDER_ITERATION error. If you have begun iterating, you can use + * rewind() to reset the document to its initial state before calling this method. + * + * @returns A value if a JSON array or object cannot be found. + * @returns SCALAR_DOCUMENT_AS_VALUE error is the document is a scalar (see is_scalar() function). + */ + simdjson_inline simdjson_result<value> get_value() noexcept; + + /** + * Checks if this JSON value is null. If and only if the value is + * null, then it is consumed (we advance). If we find a token that + * begins with 'n' but is not 'null', then an error is returned. + * + * @returns Whether the value is null. + * @returns INCORRECT_TYPE If the JSON value begins with 'n' and is not 'null'. + */ + simdjson_inline simdjson_result<bool> is_null() noexcept; + + /** + * Get this value as the given type. + * + * Supported types: object, array, raw_json_string, string_view, uint64_t, int64_t, double, bool + * + * You may use get_double(), get_bool(), get_uint64(), get_int64(), + * get_object(), get_array(), get_raw_json_string(), or get_string() instead. + * + * @returns A value of the given type, parsed from the JSON. + * @returns INCORRECT_TYPE If the JSON value is not the given type. + */ + template <typename T> + simdjson_inline simdjson_result<T> get() & +#if SIMDJSON_SUPPORTS_CONCEPTS + noexcept(custom_deserializable<T, document> ? nothrow_custom_deserializable<T, document> : true) +#else + noexcept +#endif + { + static_assert(std::is_default_constructible<T>::value, "Cannot initialize the specified type."); + T out{}; + SIMDJSON_TRY(get<T>(out)); + return out; + } + /** + * @overload template<typename T> simdjson_result<T> get() & noexcept + * + * We disallow the use tag_invoke CPO on a moved document; it may create UB + * if user uses `ondemand::array` or `ondemand::object` in their custom type. + * + * The member function is still remains specialize-able for compatibility + * reasons, but we completely disallow its use when a tag_invoke customization + * is provided. + */ + template<typename T> + simdjson_inline simdjson_result<T> get() && +#if SIMDJSON_SUPPORTS_CONCEPTS + noexcept(custom_deserializable<T, document> ? nothrow_custom_deserializable<T, document> : true) +#else + noexcept +#endif + { + static_assert(!std::is_same<T, array>::value && !std::is_same<T, object>::value, "You should never hold either an ondemand::array or ondemand::object without a corresponding ondemand::document being alive; that would be Undefined Behaviour."); + return static_cast<document&>(*this).get<T>(); + } + + /** + * Get this value as the given type. + * + * Supported types: object, array, raw_json_string, string_view, uint64_t, int64_t, double, bool, value + * + * Be mindful that the document instance must remain in scope while you are accessing object, array and value instances. + * + * @param out This is set to a value of the given type, parsed from the JSON. If there is an error, this may not be initialized. + * @returns INCORRECT_TYPE If the JSON value is of the given type. + * @returns SUCCESS If the parse succeeded and the out parameter was set to the value. + */ + template<typename T> + simdjson_warn_unused simdjson_inline error_code get(T &out) & +#if SIMDJSON_SUPPORTS_CONCEPTS + noexcept(custom_deserializable<T, document> ? nothrow_custom_deserializable<T, document> : true) +#else + noexcept +#endif + { +#if SIMDJSON_SUPPORTS_CONCEPTS + if constexpr (custom_deserializable<T, document>) { + return deserialize(*this, out); + } else { + static_assert(!sizeof(T), "The get<T> method with type T is not implemented by the simdjson library. " + "And you do not seem to have added support for it. Indeed, we have that " + "simdjson::custom_deserializable<T> is false and the type T is not a default type " + "such as ondemand::object, ondemand::array, raw_json_string, std::string_view, uint64_t, " + "int64_t, double, or bool."); + static_cast<void>(out); // to get rid of unused errors + return UNINITIALIZED; + } +#else // SIMDJSON_SUPPORTS_CONCEPTS + // Unless the simdjson library or the user provides an inline implementation, calling this method should + // immediately fail. + static_assert(!sizeof(T), "The get method with given type is not implemented by the simdjson library. " + "The supported types are ondemand::object, ondemand::array, raw_json_string, std::string_view, uint64_t, " + "int64_t, double, and bool. We recommend you use get_double(), get_bool(), get_uint64(), get_int64(), " + " get_object(), get_array(), get_raw_json_string(), or get_string() instead of the get template." + " You may also add support for custom types, see our documentation."); + static_cast<void>(out); // to get rid of unused errors + return UNINITIALIZED; +#endif // SIMDJSON_SUPPORTS_CONCEPTS + } + + /** @overload template<typename T> error_code get(T &out) & noexcept */ + template<typename T> simdjson_deprecated simdjson_inline error_code get(T &out) && noexcept; + +#if SIMDJSON_EXCEPTIONS + /** + * Cast this JSON value to an instance of type T. The programmer is responsible for + * providing an implementation of get<T> for the type T, if T is not one of the types + * supported by the library (object, array, raw_json_string, string_view, uint64_t, etc.) + * + * See https://github.com/simdjson/simdjson/blob/master/doc/basics.md#adding-support-for-custom-types + * + * @returns An instance of type T + */ + template <class T> + explicit simdjson_inline operator T() & noexcept(false); + template <class T> + explicit simdjson_deprecated simdjson_inline operator T() && noexcept(false); + + /** + * Cast this JSON value to an array. + * + * @returns An object that can be used to iterate the array. + * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not an array. + */ + simdjson_inline operator array() & noexcept(false); + /** + * Cast this JSON value to an object. + * + * @returns An object that can be used to look up or iterate fields. + * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not an object. + */ + simdjson_inline operator object() & noexcept(false); + /** + * Cast this JSON value to an unsigned integer. + * + * @returns A signed 64-bit integer. + * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a 64-bit unsigned integer. + */ + simdjson_inline operator uint64_t() noexcept(false); + /** + * Cast this JSON value to a signed integer. + * + * @returns A signed 64-bit integer. + * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a 64-bit integer. + */ + simdjson_inline operator int64_t() noexcept(false); + /** + * Cast this JSON value to a double. + * + * @returns A double. + * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a valid floating-point number. + */ + simdjson_inline operator double() noexcept(false); + /** + * Cast this JSON value to a string. + * + * The string is guaranteed to be valid UTF-8. + * + * @returns An UTF-8 string. The string is stored in the parser and will be invalidated the next + * time it parses a document or when it is destroyed. + * @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not a string. + */ + simdjson_inline operator std::string_view() noexcept(false) simdjson_lifetime_bound; + /** + * Cast this JSON value to a raw_json_string. + * + * The string is guaranteed to be valid UTF-8, and may have escapes in it (e.g. \\ or \n). + * + * @returns A pointer to the raw JSON for the given string. + * @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not a string. + */ + simdjson_inline operator raw_json_string() noexcept(false) simdjson_lifetime_bound; + /** + * Cast this JSON value to a bool. + * + * @returns A bool value. + * @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not true or false. + */ + simdjson_inline operator bool() noexcept(false); + /** + * Cast this JSON value to a value when the document is an object or an array. + * + * You must not have begun iterating through the object or array. When + * SIMDJSON_DEVELOPMENT_CHECKS is defined, and you have already begun iterating, + * you will get an OUT_OF_ORDER_ITERATION error. If you have begun iterating, you can use + * rewind() to reset the document to its initial state before calling this method. + * + * @returns A value value if a JSON array or object cannot be found. + * @exception SCALAR_DOCUMENT_AS_VALUE error is the document is a scalar (see is_scalar() function). + */ + simdjson_inline operator value() noexcept(false); +#endif + /** + * This method scans the array and counts the number of elements. + * The count_elements method should always be called before you have begun + * iterating through the array: it is expected that you are pointing at + * the beginning of the array. + * The runtime complexity is linear in the size of the array. After + * calling this function, if successful, the array is 'rewinded' at its + * beginning as if it had never been accessed. If the JSON is malformed (e.g., + * there is a missing comma), then an error is returned and it is no longer + * safe to continue. Note that count_elements() does not validate the JSON values, + * only the structure of the array. + */ + simdjson_inline simdjson_result<size_t> count_elements() & noexcept; + /** + * This method scans the object and counts the number of key-value pairs. + * The count_fields method should always be called before you have begun + * iterating through the object: it is expected that you are pointing at + * the beginning of the object. + * The runtime complexity is linear in the size of the object. After + * calling this function, if successful, the object is 'rewinded' at its + * beginning as if it had never been accessed. If the JSON is malformed (e.g., + * there is a missing comma), then an error is returned and it is no longer + * safe to continue. + * + * To check that an object is empty, it is more performant to use + * the is_empty() method. + */ + simdjson_inline simdjson_result<size_t> count_fields() & noexcept; + /** + * Get the value at the given index in the array. This function has linear-time complexity. + * This function should only be called once on an array instance since the array iterator is not reset between each call. + * + * @return The value at the given index, or: + * - INDEX_OUT_OF_BOUNDS if the array index is larger than an array length + */ + simdjson_inline simdjson_result<value> at(size_t index) & noexcept; + /** + * Begin array iteration. + * + * Part of the std::iterable interface. + */ + simdjson_inline simdjson_result<array_iterator> begin() & noexcept; + /** + * Sentinel representing the end of the array. + * + * Part of the std::iterable interface. + */ + simdjson_inline simdjson_result<array_iterator> end() & noexcept; + + /** + * Look up a field by name on an object (order-sensitive). By order-sensitive, we mean that + * fields must be accessed in the order they appear in the JSON text (although you can + * skip fields). See find_field_unordered() and operator[] for an order-insensitive version. + * + * The following code reads z, then y, then x, and thus will not retrieve x or y if fed the + * JSON `{ "x": 1, "y": 2, "z": 3 }`: + * + * ```cpp + * simdjson::ondemand::parser parser; + * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded); + * double z = obj.find_field("z"); + * double y = obj.find_field("y"); + * double x = obj.find_field("x"); + * ``` + * + * **Raw Keys:** The lookup will be done against the *raw* key, and will not unescape keys. + * e.g. `object["a"]` will match `{ "a": 1 }`, but will *not* match `{ "\u0061": 1 }`. + * + * + * You must consume the fields on an object one at a time. A request for a new key + * invalidates previous field values: it makes them unsafe. E.g., the array + * given by content["bids"].get_array() should not be accessed after you have called + * content["asks"].get_array(). You can detect such mistakes by first compiling and running + * the code in Debug mode (or with the macro `SIMDJSON_DEVELOPMENT_CHECKS` set to 1): an + * OUT_OF_ORDER_ITERATION error is generated. + * + * You are expected to access keys only once. You should access the value corresponding to + * a key a single time. Doing object["mykey"].to_string()and then again object["mykey"].to_string() + * is an error. + * + * @param key The key to look up. + * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object. + */ + simdjson_inline simdjson_result<value> find_field(std::string_view key) & noexcept; + /** @overload simdjson_inline simdjson_result<value> find_field(std::string_view key) & noexcept; */ + simdjson_inline simdjson_result<value> find_field(const char *key) & noexcept; + + /** + * Look up a field by name on an object, without regard to key order. + * + * **Performance Notes:** This is a bit less performant than find_field(), though its effect varies + * and often appears negligible. It starts out normally, starting out at the last field; but if + * the field is not found, it scans from the beginning of the object to see if it missed it. That + * missing case has a non-cache-friendly bump and lots of extra scanning, especially if the object + * in question is large. The fact that the extra code is there also bumps the executable size. + * + * We default operator[] on find_field_unordered() for convenience. + * It is the default because it would be highly surprising (and hard to debug) if the + * default behavior failed to look up a field just because it was in the wrong order--and many + * APIs assume this. Therefore, you must be explicit if you want to treat objects as out of order. + * + * Use find_field() if you are sure fields will be in order (or are willing to treat it as if the + * field was not there when they are not in order). + * + * You must consume the fields on an object one at a time. A request for a new key + * invalidates previous field values: it makes them unsafe. E.g., the array + * given by content["bids"].get_array() should not be accessed after you have called + * content["asks"].get_array(). You can detect such mistakes by first compiling and running + * the code in Debug mode (or with the macro `SIMDJSON_DEVELOPMENT_CHECKS` set to 1): an + * OUT_OF_ORDER_ITERATION error is generated. + * + * You are expected to access keys only once. You should access the value corresponding to a key + * a single time. Doing object["mykey"].to_string() and then again object["mykey"].to_string() + * is an error. + * + * @param key The key to look up. + * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object. + */ + simdjson_inline simdjson_result<value> find_field_unordered(std::string_view key) & noexcept; + /** @overload simdjson_inline simdjson_result<value> find_field_unordered(std::string_view key) & noexcept; */ + simdjson_inline simdjson_result<value> find_field_unordered(const char *key) & noexcept; + /** @overload simdjson_inline simdjson_result<value> find_field_unordered(std::string_view key) & noexcept; */ + simdjson_inline simdjson_result<value> operator[](std::string_view key) & noexcept; + /** @overload simdjson_inline simdjson_result<value> find_field_unordered(std::string_view key) & noexcept; */ + simdjson_inline simdjson_result<value> operator[](const char *key) & noexcept; + simdjson_result<value> operator[](int) & noexcept = delete; + + /** + * Get the type of this JSON value. It does not validate or consume the value. + * E.g., you must still call "is_null()" to check that a value is null even if + * "type()" returns json_type::null. + * + * The answer can be one of + * simdjson::ondemand::json_type::object, + * simdjson::ondemand::json_type::array, + * simdjson::ondemand::json_type::string, + * simdjson::ondemand::json_type::number, + * simdjson::ondemand::json_type::boolean, + * simdjson::ondemand::json_type::null. + * + * Starting with simdjson 4.0, this function will return simdjson::ondemand::json_type::unknown + * given a bad token. + * This allows you to identify a case such as {"key": NaN} and identify the NaN value. + * The simdjson::ondemand::json_type::unknown value should only happen with non-valid JSON. + * + * NOTE: If you're only expecting a value to be one type (a typical case), it's generally + * better to just call .get_double, .get_string, etc. and check for INCORRECT_TYPE (or just + * let it throw an exception). + * + * Prior to simdjson 4.0, this function would return an error given a bad token. + * Starting with simdjson 4.0, it will return simdjson::ondemand::json_type::unknown. + * This allows you to identify a case such as {"key": NaN} and identify the NaN value. + * The simdjson::ondemand::json_type::unknown value should only happen with non-valid JSON. + */ + simdjson_inline simdjson_result<json_type> type() noexcept; + + /** + * Checks whether the document is a scalar (string, number, null, Boolean). + * Returns false when there it is an array or object. + * + * @returns true if the type is string, number, null, Boolean + * @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse". + */ + simdjson_inline simdjson_result<bool> is_scalar() noexcept; + + /** + * Checks whether the document is a string. + * + * @returns true if the type is string + * @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse". + */ + simdjson_inline simdjson_result<bool> is_string() noexcept; + + /** + * Checks whether the document is a negative number. + * + * @returns true if the number if negative. + */ + simdjson_inline bool is_negative() noexcept; + /** + * Checks whether the document is an integer number. Note that + * this requires to partially parse the number string. If + * the value is determined to be an integer, it may still + * not parse properly as an integer in subsequent steps + * (e.g., it might overflow). + * + * @returns true if the number if negative. + */ + simdjson_inline simdjson_result<bool> is_integer() noexcept; + /** + * Determine the number type (integer or floating-point number) as quickly + * as possible. This function does not fully validate the input. It is + * useful when you only need to classify the numbers, without parsing them. + * + * If you are planning to retrieve the value or you need full validation, + * consider using the get_number() method instead: it will fully parse + * and validate the input, and give you access to the type: + * get_number().get_number_type(). + * + * get_number_type() is number_type::unsigned_integer if we have + * an integer greater or equal to 9223372036854775808 and no larger than 18446744073709551615. + * get_number_type() is number_type::signed_integer if we have an + * integer that is less than 9223372036854775808 and greater or equal to -9223372036854775808. + * get_number_type() is number_type::big_integer if we have an integer outside + * of those ranges (either larger than 18446744073709551615 or smaller than -9223372036854775808). + * Otherwise, get_number_type() has value number_type::floating_point_number + * + * This function requires processing the number string, but it is expected + * to be faster than get_number().get_number_type() because it is does not + * parse the number value. + * + * @returns the type of the number + */ + simdjson_inline simdjson_result<number_type> get_number_type() noexcept; + + /** + * Attempt to parse an ondemand::number. An ondemand::number may + * contain an integer value or a floating-point value, the simdjson + * library will autodetect the type. Thus it is a dynamically typed + * number. Before accessing the value, you must determine the detected + * type. + * + * number.get_number_type() is number_type::signed_integer if we have + * an integer in [-9223372036854775808,9223372036854775808) + * You can recover the value by calling number.get_int64() and you + * have that number.is_int64() is true. + * + * number.get_number_type() is number_type::unsigned_integer if we have + * an integer in [9223372036854775808,18446744073709551616) + * You can recover the value by calling number.get_uint64() and you + * have that number.is_uint64() is true. + * + * Otherwise, number.get_number_type() has value number_type::floating_point_number + * and we have a binary64 number. + * You can recover the value by calling number.get_double() and you + * have that number.is_double() is true. + * + * You must check the type before accessing the value: it is an error + * to call "get_int64()" when number.get_number_type() is not + * number_type::signed_integer and when number.is_int64() is false. + */ + simdjson_warn_unused simdjson_inline simdjson_result<number> get_number() noexcept; + + /** + * Get the raw JSON for this token. + * + * The string_view will always point into the input buffer. + * + * The string_view will start at the beginning of the token, and include the entire token + * *as well as all spaces until the next token (or EOF).* This means, for example, that a + * string token always begins with a " and is always terminated by the final ", possibly + * followed by a number of spaces. + * + * The string_view is *not* null-terminated. If this is a scalar (string, number, + * boolean, or null), the character after the end of the string_view may be the padded buffer. + * + * Tokens include: + * - { + * - [ + * - "a string (possibly with UTF-8 or backslashed characters like \\\")". + * - -1.2e-100 + * - true + * - false + * - null + */ + simdjson_inline simdjson_result<std::string_view> raw_json_token() noexcept; + + /** + * Reset the iterator inside the document instance so we are pointing back at the + * beginning of the document, as if it had just been created. It invalidates all + * values, objects and arrays that you have created so far (including unescaped strings). + */ + inline void rewind() noexcept; + /** + * Returns debugging information. + */ + inline std::string to_debug_string() noexcept; + /** + * Some unrecoverable error conditions may render the document instance unusable. + * The is_alive() method returns true when the document is still suitable. + */ + inline bool is_alive() noexcept; + + /** + * Returns the current location in the document if in bounds. + */ + inline simdjson_result<const char *> current_location() const noexcept; + + /** + * Returns true if this document has been fully parsed. + * If you have consumed the whole document and at_end() returns + * false, then there may be trailing content. + */ + inline bool at_end() const noexcept; + + /** + * Returns the current depth in the document if in bounds. + * + * E.g., + * 0 = finished with document + * 1 = document root value (could be [ or {, not yet known) + * 2 = , or } inside root array/object + * 3 = key or value inside root array/object. + */ + simdjson_inline int32_t current_depth() const noexcept; + + /** + * Get the value associated with the given JSON pointer. We use the RFC 6901 + * https://tools.ietf.org/html/rfc6901 standard. + * + * ondemand::parser parser; + * auto json = R"({ "foo": { "a": [ 10, 20, 30 ] }})"_padded; + * auto doc = parser.iterate(json); + * doc.at_pointer("/foo/a/1") == 20 + * + * It is allowed for a key to be the empty string: + * + * ondemand::parser parser; + * auto json = R"({ "": { "a": [ 10, 20, 30 ] }})"_padded; + * auto doc = parser.iterate(json); + * doc.at_pointer("//a/1") == 20 + * + * Key values are matched exactly, without unescaping or Unicode normalization. + * We do a byte-by-byte comparison. E.g. + * + * const padded_string json = "{\"\\u00E9\":123}"_padded; + * auto doc = parser.iterate(json); + * doc.at_pointer("/\\u00E9") == 123 + * doc.at_pointer((const char*)u8"/\u00E9") returns an error (NO_SUCH_FIELD) + * + * Note that at_pointer() automatically calls rewind between each call. Thus + * all values, objects and arrays that you have created so far (including unescaped strings) + * are invalidated. After calling at_pointer, you need to consume the result: string values + * should be stored in your own variables, arrays should be decoded and stored in your own array-like + * structures and so forth. + * + * Also note that at_pointer() relies on find_field() which implies that we do not unescape keys when matching + * + * @return The value associated with the given JSON pointer, or: + * - NO_SUCH_FIELD if a field does not exist in an object + * - INDEX_OUT_OF_BOUNDS if an array index is larger than an array length + * - INCORRECT_TYPE if a non-integer is used to access an array + * - INVALID_JSON_POINTER if the JSON pointer is invalid and cannot be parsed + * - SCALAR_DOCUMENT_AS_VALUE if the json_pointer is empty and the document is not a scalar (see is_scalar() function). + */ + simdjson_inline simdjson_result<value> at_pointer(std::string_view json_pointer) noexcept; + + /** + * Get the value associated with the given JSONPath expression. We only support + * JSONPath queries that trivially convertible to JSON Pointer queries: key + * names and array indices. + * + * https://www.rfc-editor.org/rfc/rfc9535 (RFC 9535) + * + * Key values are matched exactly, without unescaping or Unicode normalization. + * We do a byte-by-byte comparison. E.g. + * + * const padded_string json = "{\"\\u00E9\":123}"_padded; + * auto doc = parser.iterate(json); + * doc.at_path(".\\u00E9") == 123 + * doc.at_path((const char*)u8".\u00E9") returns an error (NO_SUCH_FIELD) + * + * @return The value associated with the given JSONPath expression, or: + * - INVALID_JSON_POINTER if the JSONPath to JSON Pointer conversion fails + * - NO_SUCH_FIELD if a field does not exist in an object + * - INDEX_OUT_OF_BOUNDS if an array index is larger than an array length + * - INCORRECT_TYPE if a non-integer is used to access an array + */ + simdjson_inline simdjson_result<value> at_path(std::string_view json_path) noexcept; + + /** + * Get all values matching the given JSONPath expression with wildcard support. + * + * Supports wildcard patterns like "$.array[*]" or "$.object.*" to match multiple elements. + * + * This method materializes all matching values into a vector. + * The document will be consumed after this call. + * + * @param json_path JSONPath expression with wildcards + * @return Vector of values matching the wildcard pattern, or: + * - INVALID_JSON_POINTER if the JSONPath cannot be parsed + * - NO_SUCH_FIELD if a field does not exist + * - INDEX_OUT_OF_BOUNDS if an array index is out of bounds + * - INCORRECT_TYPE if path traversal encounters wrong type + */ + simdjson_inline simdjson_result<std::vector<value>> at_path_with_wildcard(std::string_view json_path) noexcept; + + /** + * Consumes the document and returns a string_view instance corresponding to the + * document as represented in JSON. It points inside the original byte array containing + * the JSON document. + */ + simdjson_inline simdjson_result<std::string_view> raw_json() noexcept; + +#if SIMDJSON_STATIC_REFLECTION + /** + * Extract only specific fields from the JSON object into a struct. + * + * This allows selective deserialization of only the fields you need, + * potentially improving performance by skipping unwanted fields. + * + * Example: + * ```cpp + * struct Car { + * std::string make; + * std::string model; + * int year; + * double price; + * }; + * + * Car car; + * doc.extract_into<"make", "model">(car); + * // Only 'make' and 'model' fields are extracted from JSON + * ``` + * + * @tparam FieldNames Compile-time string literals specifying which fields to extract + * @param out The output struct to populate with selected fields + * @returns SUCCESS on success, or an error code if a required field is missing or has wrong type + */ + template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) + simdjson_warn_unused simdjson_inline error_code extract_into(T& out) & noexcept; +#endif // SIMDJSON_STATIC_REFLECTION +protected: + /** + * Consumes the document. + */ + simdjson_warn_unused simdjson_inline error_code consume() noexcept; + + simdjson_inline document(ondemand::json_iterator &&iter) noexcept; + simdjson_inline const uint8_t *text(uint32_t idx) const noexcept; + + simdjson_inline value_iterator resume_value_iterator() noexcept; + simdjson_inline value_iterator get_root_value_iterator() noexcept; + simdjson_inline simdjson_result<object> start_or_resume_object() noexcept; + static simdjson_inline document start(ondemand::json_iterator &&iter) noexcept; + + // + // Fields + // + json_iterator iter{}; ///< Current position in the document + static constexpr depth_t DOCUMENT_DEPTH = 0; ///< document depth is always 0 + + friend class array_iterator; + friend class value; + friend class ondemand::parser; + friend class object; + friend class array; + friend class field; + friend class token; + friend class document_stream; + friend class document_reference; +}; + + +/** + * A document_reference is a thin wrapper around a document reference instance. + * The document_reference instances are used primarily/solely for streams of JSON + * documents. They differ from document instances when parsing a scalar value + * (a document that is not an array or an object). In the case of a document, + * we expect the document to be fully consumed. In the case of a document_reference, + * we allow trailing content. + */ +class document_reference { +public: + simdjson_inline document_reference() noexcept; + simdjson_inline document_reference(document &d) noexcept; + simdjson_inline document_reference(const document_reference &other) noexcept = default; + simdjson_inline document_reference& operator=(const document_reference &other) noexcept = default; + simdjson_inline void rewind() noexcept; + simdjson_inline simdjson_result<array> get_array() & noexcept; + simdjson_inline simdjson_result<object> get_object() & noexcept; + simdjson_inline simdjson_result<uint64_t> get_uint64() noexcept; + simdjson_inline simdjson_result<uint64_t> get_uint64_in_string() noexcept; + simdjson_inline simdjson_result<int64_t> get_int64() noexcept; + simdjson_inline simdjson_result<int64_t> get_int64_in_string() noexcept; + simdjson_inline simdjson_result<double> get_double() noexcept; + simdjson_inline simdjson_result<double> get_double_in_string() noexcept; + simdjson_inline simdjson_result<std::string_view> get_string(bool allow_replacement = false) noexcept; + template <typename string_type> + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + simdjson_inline simdjson_result<std::string_view> get_wobbly_string() noexcept; + simdjson_inline simdjson_result<raw_json_string> get_raw_json_string() noexcept; + simdjson_inline simdjson_result<bool> get_bool() noexcept; + simdjson_inline simdjson_result<value> get_value() noexcept; + + simdjson_inline simdjson_result<bool> is_null() noexcept; + template <typename T> + simdjson_inline simdjson_result<T> get() & +#if SIMDJSON_SUPPORTS_CONCEPTS + noexcept(custom_deserializable<T, document> ? nothrow_custom_deserializable<T, document> : true) +#else + noexcept +#endif + { + static_assert(std::is_default_constructible<T>::value, "Cannot initialize the specified type."); + T out{}; + SIMDJSON_TRY(get<T>(out)); + return out; + } + template<typename T> + simdjson_inline simdjson_result<T> get() && +#if SIMDJSON_SUPPORTS_CONCEPTS + noexcept(custom_deserializable<T, document> ? nothrow_custom_deserializable<T, document> : true) +#else + noexcept +#endif + { + static_assert(!std::is_same<T, array>::value && !std::is_same<T, object>::value, "You should never hold either an ondemand::array or ondemand::object without a corresponding ondemand::document_reference being alive; that would be Undefined Behaviour."); + return static_cast<document&>(*this).get<T>(); + } + + /** + * Get this value as the given type. + * + * Supported types: object, array, raw_json_string, string_view, uint64_t, int64_t, double, bool, value + * + * Be mindful that the document instance must remain in scope while you are accessing object, array and value instances. + * + * @param out This is set to a value of the given type, parsed from the JSON. If there is an error, this may not be initialized. + * @returns INCORRECT_TYPE If the JSON value is not an object. + * @returns SUCCESS If the parse succeeded and the out parameter was set to the value. + */ + template<typename T> + simdjson_warn_unused simdjson_inline error_code get(T &out) & +#if SIMDJSON_SUPPORTS_CONCEPTS + noexcept(custom_deserializable<T, document> ? nothrow_custom_deserializable<T, document_reference> : true) +#else + noexcept +#endif + { +#if SIMDJSON_SUPPORTS_CONCEPTS + if constexpr (custom_deserializable<T, document_reference>) { + return deserialize(*this, out); + } else { + static_assert(!sizeof(T), "The get<T> method with type T is not implemented by the simdjson library. " + "And you do not seem to have added support for it. Indeed, we have that " + "simdjson::custom_deserializable<T> is false and the type T is not a default type " + "such as ondemand::object, ondemand::array, raw_json_string, std::string_view, uint64_t, " + "int64_t, double, or bool."); + static_cast<void>(out); // to get rid of unused errors + return UNINITIALIZED; + } +#else // SIMDJSON_SUPPORTS_CONCEPTS + // Unless the simdjson library or the user provides an inline implementation, calling this method should + // immediately fail. + static_assert(!sizeof(T), "The get method with given type is not implemented by the simdjson library. " + "The supported types are ondemand::object, ondemand::array, raw_json_string, std::string_view, uint64_t, " + "int64_t, double, and bool. We recommend you use get_double(), get_bool(), get_uint64(), get_int64(), " + " get_object(), get_array(), get_raw_json_string(), or get_string() instead of the get template." + " You may also add support for custom types, see our documentation."); + static_cast<void>(out); // to get rid of unused errors + return UNINITIALIZED; +#endif // SIMDJSON_SUPPORTS_CONCEPTS + } + + /** @overload template<typename T> error_code get(T &out) & noexcept */ + template<typename T> simdjson_inline error_code get(T &out) && noexcept; + simdjson_inline simdjson_result<std::string_view> raw_json() noexcept; +#if SIMDJSON_STATIC_REFLECTION + template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) + simdjson_warn_unused simdjson_inline error_code extract_into(T& out) & noexcept; +#endif // SIMDJSON_STATIC_REFLECTION + simdjson_inline operator document&() const noexcept; +#if SIMDJSON_EXCEPTIONS + template <class T> + explicit simdjson_inline operator T() noexcept(false); + simdjson_inline operator array() & noexcept(false); + simdjson_inline operator object() & noexcept(false); + simdjson_inline operator uint64_t() noexcept(false); + simdjson_inline operator int64_t() noexcept(false); + simdjson_inline operator double() noexcept(false); + simdjson_inline operator std::string_view() noexcept(false); + simdjson_inline operator raw_json_string() noexcept(false); + simdjson_inline operator bool() noexcept(false); + simdjson_inline operator value() noexcept(false); +#endif + simdjson_inline simdjson_result<size_t> count_elements() & noexcept; + simdjson_inline simdjson_result<size_t> count_fields() & noexcept; + simdjson_inline simdjson_result<value> at(size_t index) & noexcept; + simdjson_inline simdjson_result<array_iterator> begin() & noexcept; + simdjson_inline simdjson_result<array_iterator> end() & noexcept; + simdjson_inline simdjson_result<value> find_field(std::string_view key) & noexcept; + simdjson_inline simdjson_result<value> find_field(const char *key) & noexcept; + simdjson_inline simdjson_result<value> operator[](std::string_view key) & noexcept; + simdjson_inline simdjson_result<value> operator[](const char *key) & noexcept; + simdjson_result<value> operator[](int) & noexcept = delete; + simdjson_inline simdjson_result<value> find_field_unordered(std::string_view key) & noexcept; + simdjson_inline simdjson_result<value> find_field_unordered(const char *key) & noexcept; + + simdjson_inline simdjson_result<json_type> type() noexcept; + simdjson_inline simdjson_result<bool> is_scalar() noexcept; + simdjson_inline simdjson_result<bool> is_string() noexcept; + + simdjson_inline simdjson_result<const char *> current_location() noexcept; + simdjson_inline int32_t current_depth() const noexcept; + simdjson_inline bool is_negative() noexcept; + simdjson_inline simdjson_result<bool> is_integer() noexcept; + simdjson_inline simdjson_result<number_type> get_number_type() noexcept; + simdjson_inline simdjson_result<number> get_number() noexcept; + simdjson_inline simdjson_result<std::string_view> raw_json_token() noexcept; + simdjson_inline simdjson_result<value> at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result<value> at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<std::vector<value>> at_path_with_wildcard(std::string_view json_path) noexcept; + +private: + document *doc{nullptr}; +}; +} // namespace ondemand +} // namespace arm64 +} // namespace simdjson + +namespace simdjson { + +template<> +struct simdjson_result<arm64::ondemand::document> : public arm64::implementation_simdjson_result_base<arm64::ondemand::document> { +public: + simdjson_inline simdjson_result(arm64::ondemand::document &&value) noexcept; ///< @private + simdjson_inline simdjson_result(error_code error) noexcept; ///< @private + simdjson_inline simdjson_result() noexcept = default; + simdjson_inline error_code rewind() noexcept; + + simdjson_inline simdjson_result<arm64::ondemand::array> get_array() & noexcept; + simdjson_inline simdjson_result<arm64::ondemand::object> get_object() & noexcept; + simdjson_inline simdjson_result<uint64_t> get_uint64() noexcept; + simdjson_inline simdjson_result<uint64_t> get_uint64_in_string() noexcept; + simdjson_inline simdjson_result<int64_t> get_int64() noexcept; + simdjson_inline simdjson_result<int64_t> get_int64_in_string() noexcept; + simdjson_inline simdjson_result<double> get_double() noexcept; + simdjson_inline simdjson_result<double> get_double_in_string() noexcept; + simdjson_inline simdjson_result<std::string_view> get_string(bool allow_replacement = false) noexcept; + template <typename string_type> + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + simdjson_inline simdjson_result<std::string_view> get_wobbly_string() noexcept; + simdjson_inline simdjson_result<arm64::ondemand::raw_json_string> get_raw_json_string() noexcept; + simdjson_inline simdjson_result<bool> get_bool() noexcept; + simdjson_inline simdjson_result<arm64::ondemand::value> get_value() noexcept; + simdjson_inline simdjson_result<bool> is_null() noexcept; + + template<typename T> simdjson_inline simdjson_result<T> get() & noexcept; + template<typename T> simdjson_deprecated simdjson_inline simdjson_result<T> get() && noexcept; + + template<typename T> simdjson_inline error_code get(T &out) & noexcept; + template<typename T> simdjson_inline error_code get(T &out) && noexcept; +#if SIMDJSON_EXCEPTIONS + + using arm64::implementation_simdjson_result_base<arm64::ondemand::document>::operator*; + using arm64::implementation_simdjson_result_base<arm64::ondemand::document>::operator->; + template <class T, typename std::enable_if<std::is_same<T, arm64::ondemand::document>::value == false>::type> + explicit simdjson_inline operator T() noexcept(false); + simdjson_inline operator arm64::ondemand::array() & noexcept(false); + simdjson_inline operator arm64::ondemand::object() & noexcept(false); + simdjson_inline operator uint64_t() noexcept(false); + simdjson_inline operator int64_t() noexcept(false); + simdjson_inline operator double() noexcept(false); + simdjson_inline operator std::string_view() noexcept(false); + simdjson_inline operator arm64::ondemand::raw_json_string() noexcept(false); + simdjson_inline operator bool() noexcept(false); + simdjson_inline operator arm64::ondemand::value() noexcept(false); +#endif + simdjson_inline simdjson_result<size_t> count_elements() & noexcept; + simdjson_inline simdjson_result<size_t> count_fields() & noexcept; + simdjson_inline simdjson_result<arm64::ondemand::value> at(size_t index) & noexcept; + simdjson_inline simdjson_result<arm64::ondemand::array_iterator> begin() & noexcept; + simdjson_inline simdjson_result<arm64::ondemand::array_iterator> end() & noexcept; + simdjson_inline simdjson_result<arm64::ondemand::value> find_field(std::string_view key) & noexcept; + simdjson_inline simdjson_result<arm64::ondemand::value> find_field(const char *key) & noexcept; + simdjson_inline simdjson_result<arm64::ondemand::value> operator[](std::string_view key) & noexcept; + simdjson_inline simdjson_result<arm64::ondemand::value> operator[](const char *key) & noexcept; + simdjson_result<arm64::ondemand::value> operator[](int) & noexcept = delete; + simdjson_inline simdjson_result<arm64::ondemand::value> find_field_unordered(std::string_view key) & noexcept; + simdjson_inline simdjson_result<arm64::ondemand::value> find_field_unordered(const char *key) & noexcept; + simdjson_inline simdjson_result<arm64::ondemand::json_type> type() noexcept; + simdjson_inline simdjson_result<bool> is_scalar() noexcept; + simdjson_inline simdjson_result<bool> is_string() noexcept; + simdjson_inline simdjson_result<const char *> current_location() noexcept; + simdjson_inline int32_t current_depth() const noexcept; + simdjson_inline bool at_end() const noexcept; + simdjson_inline bool is_negative() noexcept; + simdjson_inline simdjson_result<bool> is_integer() noexcept; + simdjson_inline simdjson_result<arm64::number_type> get_number_type() noexcept; + simdjson_inline simdjson_result<arm64::ondemand::number> get_number() noexcept; + /** @copydoc simdjson_inline std::string_view document::raw_json_token() const noexcept */ + simdjson_inline simdjson_result<std::string_view> raw_json_token() noexcept; + + simdjson_inline simdjson_result<arm64::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result<arm64::ondemand::value> at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<std::vector<arm64::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; +#if SIMDJSON_STATIC_REFLECTION + template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) + simdjson_warn_unused simdjson_inline error_code extract_into(T& out) & noexcept; +#endif // SIMDJSON_STATIC_REFLECTION +}; + + +} // namespace simdjson + + + +namespace simdjson { + +template<> +struct simdjson_result<arm64::ondemand::document_reference> : public arm64::implementation_simdjson_result_base<arm64::ondemand::document_reference> { +public: + simdjson_inline simdjson_result(arm64::ondemand::document_reference value, error_code error) noexcept; + simdjson_inline simdjson_result() noexcept = default; + simdjson_inline error_code rewind() noexcept; + + simdjson_inline simdjson_result<arm64::ondemand::array> get_array() & noexcept; + simdjson_inline simdjson_result<arm64::ondemand::object> get_object() & noexcept; + simdjson_inline simdjson_result<uint64_t> get_uint64() noexcept; + simdjson_inline simdjson_result<uint64_t> get_uint64_in_string() noexcept; + simdjson_inline simdjson_result<int64_t> get_int64() noexcept; + simdjson_inline simdjson_result<int64_t> get_int64_in_string() noexcept; + simdjson_inline simdjson_result<double> get_double() noexcept; + simdjson_inline simdjson_result<double> get_double_in_string() noexcept; + simdjson_inline simdjson_result<std::string_view> get_string(bool allow_replacement = false) noexcept; + template <typename string_type> + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + simdjson_inline simdjson_result<std::string_view> get_wobbly_string() noexcept; + simdjson_inline simdjson_result<arm64::ondemand::raw_json_string> get_raw_json_string() noexcept; + simdjson_inline simdjson_result<bool> get_bool() noexcept; + simdjson_inline simdjson_result<arm64::ondemand::value> get_value() noexcept; + simdjson_inline simdjson_result<bool> is_null() noexcept; + + template<typename T> simdjson_inline simdjson_result<T> get() & noexcept; + template<typename T> simdjson_inline simdjson_result<T> get() && noexcept; + + template<typename T> simdjson_inline error_code get(T &out) & noexcept; + template<typename T> simdjson_inline error_code get(T &out) && noexcept; +#if SIMDJSON_EXCEPTIONS + template <class T> + explicit simdjson_inline operator T() noexcept(false); + simdjson_inline operator arm64::ondemand::array() & noexcept(false); + simdjson_inline operator arm64::ondemand::object() & noexcept(false); + simdjson_inline operator uint64_t() noexcept(false); + simdjson_inline operator int64_t() noexcept(false); + simdjson_inline operator double() noexcept(false); + simdjson_inline operator std::string_view() noexcept(false); + simdjson_inline operator arm64::ondemand::raw_json_string() noexcept(false); + simdjson_inline operator bool() noexcept(false); + simdjson_inline operator arm64::ondemand::value() noexcept(false); +#endif + simdjson_inline simdjson_result<size_t> count_elements() & noexcept; + simdjson_inline simdjson_result<size_t> count_fields() & noexcept; + simdjson_inline simdjson_result<arm64::ondemand::value> at(size_t index) & noexcept; + simdjson_inline simdjson_result<arm64::ondemand::array_iterator> begin() & noexcept; + simdjson_inline simdjson_result<arm64::ondemand::array_iterator> end() & noexcept; + simdjson_inline simdjson_result<arm64::ondemand::value> find_field(std::string_view key) & noexcept; + simdjson_inline simdjson_result<arm64::ondemand::value> find_field(const char *key) & noexcept; + simdjson_inline simdjson_result<arm64::ondemand::value> operator[](std::string_view key) & noexcept; + simdjson_inline simdjson_result<arm64::ondemand::value> operator[](const char *key) & noexcept; + simdjson_result<arm64::ondemand::value> operator[](int) & noexcept = delete; + simdjson_inline simdjson_result<arm64::ondemand::value> find_field_unordered(std::string_view key) & noexcept; + simdjson_inline simdjson_result<arm64::ondemand::value> find_field_unordered(const char *key) & noexcept; + simdjson_inline simdjson_result<arm64::ondemand::json_type> type() noexcept; + simdjson_inline simdjson_result<bool> is_scalar() noexcept; + simdjson_inline simdjson_result<bool> is_string() noexcept; + simdjson_inline simdjson_result<const char *> current_location() noexcept; + simdjson_inline simdjson_result<int32_t> current_depth() const noexcept; + simdjson_inline simdjson_result<bool> is_negative() noexcept; + simdjson_inline simdjson_result<bool> is_integer() noexcept; + simdjson_inline simdjson_result<arm64::number_type> get_number_type() noexcept; + simdjson_inline simdjson_result<arm64::ondemand::number> get_number() noexcept; + /** @copydoc simdjson_inline std::string_view document_reference::raw_json_token() const noexcept */ + simdjson_inline simdjson_result<std::string_view> raw_json_token() noexcept; + + simdjson_inline simdjson_result<arm64::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result<arm64::ondemand::value> at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<std::vector<arm64::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; +#if SIMDJSON_STATIC_REFLECTION + template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) + simdjson_warn_unused simdjson_inline error_code extract_into(T& out) & noexcept; +#endif // SIMDJSON_STATIC_REFLECTION +}; + + +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_H +/* end file simdjson/generic/ondemand/document.h for arm64 */ +/* including simdjson/generic/ondemand/document_stream.h for arm64: #include "simdjson/generic/ondemand/document_stream.h" */ +/* begin file simdjson/generic/ondemand/document_stream.h for arm64 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/parser.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#ifdef SIMDJSON_THREADS_ENABLED +#include <thread> +#include <mutex> +#include <condition_variable> +#endif + +namespace simdjson { +namespace arm64 { +namespace ondemand { + +#ifdef SIMDJSON_THREADS_ENABLED +/** @private Custom worker class **/ +struct stage1_worker { + stage1_worker() noexcept = default; + stage1_worker(const stage1_worker&) = delete; + stage1_worker(stage1_worker&&) = delete; + stage1_worker operator=(const stage1_worker&) = delete; + ~stage1_worker(); + /** + * We only start the thread when it is needed, not at object construction, this may throw. + * You should only call this once. + **/ + void start_thread(); + /** + * Start a stage 1 job. You should first call 'run', then 'finish'. + * You must call start_thread once before. + */ + void run(document_stream * ds, parser * stage1, size_t next_batch_start); + /** Wait for the run to finish (blocking). You should first call 'run', then 'finish'. **/ + void finish(); + +private: + + /** + * Normally, we would never stop the thread. But we do in the destructor. + * This function is only safe assuming that you are not waiting for results. You + * should have called run, then finish, and be done. + **/ + void stop_thread(); + + std::thread thread{}; + /** These three variables define the work done by the thread. **/ + ondemand::parser * stage1_thread_parser{}; + size_t _next_batch_start{}; + document_stream * owner{}; + /** + * We have two state variables. This could be streamlined to one variable in the future but + * we use two for clarity. + */ + bool has_work{false}; + bool can_work{true}; + + /** + * We lock using a mutex. + */ + std::mutex locking_mutex{}; + std::condition_variable cond_var{}; + + friend class document_stream; +}; +#endif // SIMDJSON_THREADS_ENABLED + +/** + * A forward-only stream of documents. + * + * Produced by parser::iterate_many. + * + */ +class document_stream { +public: + /** + * Construct an uninitialized document_stream. + * + * ```cpp + * document_stream docs; + * auto error = parser.iterate_many(json).get(docs); + * ``` + */ + simdjson_inline document_stream() noexcept; + /** Move one document_stream to another. */ + simdjson_inline document_stream(document_stream &&other) noexcept = default; + /** Move one document_stream to another. */ + simdjson_inline document_stream &operator=(document_stream &&other) noexcept = default; + + simdjson_inline ~document_stream() noexcept; + + /** + * Returns the input size in bytes. + */ + inline size_t size_in_bytes() const noexcept; + + /** + * After iterating through the stream, this method + * returns the number of bytes that were not parsed at the end + * of the stream. If truncated_bytes() differs from zero, + * then the input was truncated maybe because incomplete JSON + * documents were found at the end of the stream. You + * may need to process the bytes in the interval [size_in_bytes()-truncated_bytes(), size_in_bytes()). + * + * You should only call truncated_bytes() after streaming through all + * documents, like so: + * + * document_stream stream = parser.iterate_many(json,window); + * for(auto & doc : stream) { + * // do something with doc + * } + * size_t truncated = stream.truncated_bytes(); + * + */ + inline size_t truncated_bytes() const noexcept; + + class iterator { + public: + using value_type = simdjson_result<document>; + using reference = simdjson_result<ondemand::document_reference>; + using pointer = void; + using difference_type = std::ptrdiff_t; + using iterator_category = std::input_iterator_tag; + + /** + * Default constructor. + */ + simdjson_inline iterator() noexcept; + simdjson_inline iterator(const iterator &other) noexcept = default; + /** + * Get the current document (or error). + */ + simdjson_inline reference operator*() noexcept; + /** + * Advance to the next document (prefix). + */ + inline iterator& operator++() noexcept; + /** + * Check if we're at the end yet. + * @param other the end iterator to compare to. + */ + simdjson_inline bool operator!=(const iterator &other) const noexcept; + simdjson_inline bool operator==(const iterator &other) const noexcept; + /** + * @private + * + * Gives the current index in the input document in bytes. + * + * document_stream stream = parser.parse_many(json,window); + * for(auto i = stream.begin(); i != stream.end(); ++i) { + * auto doc = *i; + * size_t index = i.current_index(); + * } + * + * This function (current_index()) is experimental and the usage + * may change in future versions of simdjson: we find the API somewhat + * awkward and we would like to offer something friendlier. + */ + simdjson_inline size_t current_index() const noexcept; + + /** + * @private + * + * Gives a view of the current document at the current position. + * + * document_stream stream = parser.iterate_many(json,window); + * for(auto i = stream.begin(); i != stream.end(); ++i) { + * std::string_view v = i.source(); + * } + * + * The returned string_view instance is simply a map to the (unparsed) + * source string: it may thus include white-space characters and all manner + * of padding. + * + * This function (source()) is experimental and the usage + * may change in future versions of simdjson: we find the API somewhat + * awkward and we would like to offer something friendlier. + * + */ + simdjson_inline std::string_view source() const noexcept; + + /** + * Returns error of the stream (if any). + */ + inline error_code error() const noexcept; + + /** + * Returns whether the iterator is at the end. + */ + inline bool at_end() const noexcept; + + private: + simdjson_inline iterator(document_stream *s, bool finished) noexcept; + /** The document_stream we're iterating through. */ + document_stream* stream; + /** Whether we're finished or not. */ + bool finished; + + friend class document; + friend class document_stream; + friend class json_iterator; + }; + using iterator = document_stream::iterator; + + /** + * Start iterating the documents in the stream. + */ + simdjson_inline iterator begin() noexcept; + /** + * The end of the stream, for iterator comparison purposes. + */ + simdjson_inline iterator end() noexcept; + +private: + + document_stream &operator=(const document_stream &) = delete; // Disallow copying + document_stream(const document_stream &other) = delete; // Disallow copying + + /** + * Construct a document_stream. Does not allocate or parse anything until the iterator is + * used. + * + * @param parser is a reference to the parser instance used to generate this document_stream + * @param buf is the raw byte buffer we need to process + * @param len is the length of the raw byte buffer in bytes + * @param batch_size is the size of the windows (must be strictly greater or equal to the largest JSON document) + */ + simdjson_inline document_stream( + ondemand::parser &parser, + const uint8_t *buf, + size_t len, + size_t batch_size, + bool allow_comma_separated + ) noexcept; + + /** + * Parse the first document in the buffer. Used by begin(), to handle allocation and + * initialization. + */ + inline void start() noexcept; + + /** + * Parse the next document found in the buffer previously given to document_stream. + * + * The content should be a valid JSON document encoded as UTF-8. If there is a + * UTF-8 BOM, the parser skips it. + * + * You do NOT need to pre-allocate a parser. This function takes care of + * pre-allocating a capacity defined by the batch_size defined when creating the + * document_stream object. + * + * The function returns simdjson::EMPTY if there is no more data to be parsed. + * + * The function returns simdjson::SUCCESS (as integer = 0) in case of success + * and indicates that the buffer has successfully been parsed to the end. + * Every document it contained has been parsed without error. + * + * The function returns an error code from simdjson/simdjson.h in case of failure + * such as simdjson::CAPACITY, simdjson::MEMALLOC, simdjson::DEPTH_ERROR and so forth; + * the simdjson::error_message function converts these error codes into a string). + * + * You can also check validity by calling parser.is_valid(). The same parser can + * and should be reused for the other documents in the buffer. + */ + inline void next() noexcept; + + /** Move the json_iterator of the document to the location of the next document in the stream. */ + inline void next_document() noexcept; + + /** Get the next document index. */ + inline size_t next_batch_start() const noexcept; + + /** Pass the next batch through stage 1 with the given parser. */ + inline error_code run_stage1(ondemand::parser &p, size_t batch_start) noexcept; + + // Fields + ondemand::parser *parser; + const uint8_t *buf; + size_t len; + size_t batch_size; + bool allow_comma_separated; + /** + * We are going to use just one document instance. The document owns + * the json_iterator. It implies that we only ever pass a reference + * to the document to the users. + */ + document doc{}; + /** The error (or lack thereof) from the current document. */ + error_code error; + size_t batch_start{0}; + size_t doc_index{}; + + #ifdef SIMDJSON_THREADS_ENABLED + /** Indicates whether we use threads. Note that this needs to be a constant during the execution of the parsing. */ + bool use_thread; + + inline void load_from_stage1_thread() noexcept; + + /** Start a thread to run stage 1 on the next batch. */ + inline void start_stage1_thread() noexcept; + + /** Wait for the stage 1 thread to finish and capture the results. */ + inline void finish_stage1_thread() noexcept; + + /** The error returned from the stage 1 thread. */ + error_code stage1_thread_error{UNINITIALIZED}; + /** The thread used to run stage 1 against the next batch in the background. */ + std::unique_ptr<stage1_worker> worker{new(std::nothrow) stage1_worker()}; + /** + * The parser used to run stage 1 in the background. Will be swapped + * with the regular parser when finished. + */ + ondemand::parser stage1_thread_parser{}; + + friend struct stage1_worker; + #endif // SIMDJSON_THREADS_ENABLED + + friend class parser; + friend class document; + friend class json_iterator; + friend struct simdjson_result<ondemand::document_stream>; + friend struct simdjson::internal::simdjson_result_base<ondemand::document_stream>; +}; // document_stream + +} // namespace ondemand +} // namespace arm64 +} // namespace simdjson + +namespace simdjson { +template<> +struct simdjson_result<arm64::ondemand::document_stream> : public arm64::implementation_simdjson_result_base<arm64::ondemand::document_stream> { +public: + simdjson_inline simdjson_result(arm64::ondemand::document_stream &&value) noexcept; ///< @private + simdjson_inline simdjson_result(error_code error) noexcept; ///< @private + simdjson_inline simdjson_result() noexcept = default; +}; + +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_H +/* end file simdjson/generic/ondemand/document_stream.h for arm64 */ +/* including simdjson/generic/ondemand/field.h for arm64: #include "simdjson/generic/ondemand/field.h" */ +/* begin file simdjson/generic/ondemand/field.h for arm64 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_FIELD_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_FIELD_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace arm64 { +namespace ondemand { + +/** + * A JSON field (key/value pair) in an object. + * + * Returned from object iteration. + * + * Extends from std::pair<raw_json_string, value> so you can use C++ algorithms that rely on pairs. + */ +class field : public std::pair<raw_json_string, value> { +public: + /** + * Create a new invalid field. + * + * Exists so you can declare a variable and later assign to it before use. + */ + simdjson_inline field() noexcept; + + /** + * Get the key as a string_view (for higher speed, consider raw_key). + * We deliberately use a more cumbersome name (unescaped_key) to force users + * to think twice about using it. + * + * This consumes the key: once you have called unescaped_key(), you cannot + * call it again nor can you call key(). + */ + simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> unescaped_key(bool allow_replacement = false) noexcept; + /** + * Get the key as a string_view (for higher speed, consider raw_key). + * We deliberately use a more cumbersome name (unescaped_key) to force users + * to think twice about using it. The content is stored in the receiver. + * + * This consumes the key: once you have called unescaped_key(), you cannot + * call it again nor can you call key(). + */ + template <typename string_type> + simdjson_inline simdjson_warn_unused error_code unescaped_key(string_type& receiver, bool allow_replacement = false) noexcept; + /** + * Get the key as a raw_json_string. Can be used for direct comparison with + * an unescaped C string: e.g., key() == "test". This does not count as + * consumption of the content: you can safely call it repeatedly. + * See escaped_key() for a similar function which returns + * a more convenient std::string_view result. + */ + simdjson_inline raw_json_string key() const noexcept; + /** + * Get the unprocessed key as a string_view. This includes the quotes and may include + * some spaces after the last quote. This does not count as + * consumption of the content: you can safely call it repeatedly. + * See escaped_key(). + */ + simdjson_inline std::string_view key_raw_json_token() const noexcept; + /** + * Get the key as a string_view. This does not include the quotes and + * the string is unprocessed key so it may contain escape characters + * (e.g., \uXXXX or \n). It does not count as a consumption of the content: + * you can safely call it repeatedly. Use unescaped_key() to get the unescaped key. + */ + simdjson_inline std::string_view escaped_key() const noexcept; + /** + * Get the field value. + */ + simdjson_inline ondemand::value &value() & noexcept; + /** + * @overload ondemand::value &ondemand::value() & noexcept + */ + simdjson_inline ondemand::value value() && noexcept; + +protected: + simdjson_inline field(raw_json_string key, ondemand::value &&value) noexcept; + static simdjson_inline simdjson_result<field> start(value_iterator &parent_iter) noexcept; + static simdjson_inline simdjson_result<field> start(const value_iterator &parent_iter, raw_json_string key) noexcept; + friend struct simdjson_result<field>; + friend class object_iterator; +}; + +} // namespace ondemand +} // namespace arm64 +} // namespace simdjson + +namespace simdjson { + +template<> +struct simdjson_result<arm64::ondemand::field> : public arm64::implementation_simdjson_result_base<arm64::ondemand::field> { +public: + simdjson_inline simdjson_result(arm64::ondemand::field &&value) noexcept; ///< @private + simdjson_inline simdjson_result(error_code error) noexcept; ///< @private + simdjson_inline simdjson_result() noexcept = default; + + simdjson_inline simdjson_result<std::string_view> unescaped_key(bool allow_replacement = false) noexcept; + template<typename string_type> + simdjson_inline error_code unescaped_key(string_type &receiver, bool allow_replacement = false) noexcept; + simdjson_inline simdjson_result<arm64::ondemand::raw_json_string> key() noexcept; + simdjson_inline simdjson_result<std::string_view> key_raw_json_token() noexcept; + simdjson_inline simdjson_result<std::string_view> escaped_key() noexcept; + simdjson_inline simdjson_result<arm64::ondemand::value> value() noexcept; +}; + +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_ONDEMAND_FIELD_H +/* end file simdjson/generic/ondemand/field.h for arm64 */ +/* including simdjson/generic/ondemand/object.h for arm64: #include "simdjson/generic/ondemand/object.h" */ +/* begin file simdjson/generic/ondemand/object.h for arm64 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_OBJECT_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */ +/* amalgamation skipped (editor-only): #include <vector> */ +/* amalgamation skipped (editor-only): #if SIMDJSON_STATIC_REFLECTION && SIMDJSON_SUPPORTS_CONCEPTS */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_string_builder.h" // for constevalutil::fixed_string */ +/* amalgamation skipped (editor-only): #endif */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace arm64 { +namespace ondemand { + +/** + * A forward-only JSON object field iterator. + */ +class object { +public: + /** + * Create a new invalid object. + * + * Exists so you can declare a variable and later assign to it before use. + */ + simdjson_inline object() noexcept = default; + + /** + * Get an iterator to the start of the object. We recommend using a range-based for loop. + * + * Using the iterator directly is also possible but error-prone and discouraged. In particular, + * you must dereference the iterator exactly once per iteration (before calling '++'). + * Doing otherwise is unsafe and may lead to errors. You are responsible for ensuring + */ + simdjson_inline simdjson_result<object_iterator> begin() noexcept; + simdjson_inline simdjson_result<object_iterator> end() noexcept; + /** + * Look up a field by name on an object (order-sensitive). By order-sensitive, we mean that + * fields must be accessed in the order they appear in the JSON text (although you can + * skip fields). See find_field_unordered() and operator[] for an order-insensitive version. + * + * The following code reads z, then y, then x, and thus will not retrieve x or y if fed the + * JSON `{ "x": 1, "y": 2, "z": 3 }`: + * + * ```cpp + * simdjson::ondemand::parser parser; + * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded); + * double z = obj.find_field("z"); + * double y = obj.find_field("y"); + * double x = obj.find_field("x"); + * ``` + * If you have multiple fields with a matching key ({"x": 1, "x": 1}) be mindful + * that only one field is returned. + * + * **Raw Keys:** The lookup will be done against the *raw* key, and will not unescape keys. + * e.g. `object["a"]` will match `{ "a": 1 }`, but will *not* match `{ "\u0061": 1 }`. + * + * You must consume the fields on an object one at a time. A request for a new key + * invalidates previous field values: it makes them unsafe. The value instance you get + * from `content["bids"]` becomes invalid when you call `content["asks"]`. The array + * given by content["bids"].get_array() should not be accessed after you have called + * content["asks"].get_array(). You can detect such mistakes by first compiling and running + * the code in Debug mode (or with the macro `SIMDJSON_DEVELOPMENT_CHECKS` set to 1): an + * OUT_OF_ORDER_ITERATION error is generated. + * + * You are expected to access keys only once. You should access the value corresponding to a + * key a single time. Doing object["mykey"].to_string() and then again object["mykey"].to_string() + * is an error. + * + * If you expect to have keys with escape characters, please review our documentation. + * + * @param key The key to look up. + * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object. + */ + simdjson_inline simdjson_result<value> find_field(std::string_view key) & noexcept; + /** @overload simdjson_inline simdjson_result<value> find_field(std::string_view key) & noexcept; */ + simdjson_inline simdjson_result<value> find_field(std::string_view key) && noexcept; + + /** + * Look up a field by name on an object, without regard to key order. + * + * **Performance Notes:** This is a bit less performant than find_field(), though its effect varies + * and often appears negligible. It starts out normally, starting out at the last field; but if + * the field is not found, it scans from the beginning of the object to see if it missed it. That + * missing case has a non-cache-friendly bump and lots of extra scanning, especially if the object + * in question is large. The fact that the extra code is there also bumps the executable size. + * + * We default operator[] on find_field_unordered() for convenience. + * It is the default because it would be highly surprising (and hard to debug) if the + * default behavior failed to look up a field just because it was in the wrong order--and many + * APIs assume this. Therefore, you must be explicit if you want to treat objects as out of order. + * + * Use find_field() if you are sure fields will be in order (or are willing to treat it as if the + * field was not there when they are not in order). + * + * If you have multiple fields with a matching key ({"x": 1, "x": 1}) be mindful + * that only one field is returned. + * + * You must consume the fields on an object one at a time. A request for a new key + * invalidates previous field values: it makes them unsafe. The value instance you get + * from `content["bids"]` becomes invalid when you call `content["asks"]`. The array + * given by content["bids"].get_array() should not be accessed after you have called + * content["asks"].get_array(). You can detect such mistakes by first compiling and running + * the code in Debug mode (or with the macro `SIMDJSON_DEVELOPMENT_CHECKS` set to 1): an + * OUT_OF_ORDER_ITERATION error is generated. + * + * You are expected to access keys only once. You should access the value corresponding to a key + * a single time. Doing object["mykey"].to_string() and then again object["mykey"].to_string() is an error. + * + * If you expect to have keys with escape characters, please review our documentation. + * + * @param key The key to look up. + * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object. + */ + simdjson_inline simdjson_result<value> find_field_unordered(std::string_view key) & noexcept; + /** @overload simdjson_inline simdjson_result<value> find_field_unordered(std::string_view key) & noexcept; */ + simdjson_inline simdjson_result<value> find_field_unordered(std::string_view key) && noexcept; + /** @overload simdjson_inline simdjson_result<value> find_field_unordered(std::string_view key) & noexcept; */ + simdjson_inline simdjson_result<value> operator[](std::string_view key) & noexcept; + /** @overload simdjson_inline simdjson_result<value> find_field_unordered(std::string_view key) & noexcept; */ + simdjson_inline simdjson_result<value> operator[](std::string_view key) && noexcept; + + /** + * Get the value associated with the given JSON pointer. We use the RFC 6901 + * https://tools.ietf.org/html/rfc6901 standard, interpreting the current node + * as the root of its own JSON document. + * + * ondemand::parser parser; + * auto json = R"({ "foo": { "a": [ 10, 20, 30 ] }})"_padded; + * auto doc = parser.iterate(json); + * doc.at_pointer("/foo/a/1") == 20 + * + * It is allowed for a key to be the empty string: + * + * ondemand::parser parser; + * auto json = R"({ "": { "a": [ 10, 20, 30 ] }})"_padded; + * auto doc = parser.iterate(json); + * doc.at_pointer("//a/1") == 20 + * + * Note that at_pointer() called on the document automatically calls the document's rewind + * method between each call. It invalidates all previously accessed arrays, objects and values + * that have not been consumed. Yet it is not the case when calling at_pointer on an object + * instance: there is no rewind and no invalidation. + * + * You may call at_pointer more than once on an object, but each time the pointer is advanced + * to be within the value matched by the key indicated by the JSON pointer query. Thus any preceding + * key (as well as the current key) can no longer be used with following JSON pointer calls. + * + * Also note that at_pointer() relies on find_field() which implies that we do not unescape keys when matching. + * + * @return The value associated with the given JSON pointer, or: + * - NO_SUCH_FIELD if a field does not exist in an object + * - INDEX_OUT_OF_BOUNDS if an array index is larger than an array length + * - INCORRECT_TYPE if a non-integer is used to access an array + * - INVALID_JSON_POINTER if the JSON pointer is invalid and cannot be parsed + */ + inline simdjson_result<value> at_pointer(std::string_view json_pointer) noexcept; + + /** + * Get the value associated with the given JSONPath expression. We only support + * JSONPath queries that trivially convertible to JSON Pointer queries: key + * names and array indices. + * + * @return The value associated with the given JSONPath expression, or: + * - INVALID_JSON_POINTER if the JSONPath to JSON Pointer conversion fails + * - NO_SUCH_FIELD if a field does not exist in an object + * - INDEX_OUT_OF_BOUNDS if an array index is larger than an array length + * - INCORRECT_TYPE if a non-integer is used to access an array + */ + inline simdjson_result<value> at_path(std::string_view json_path) noexcept; + + /** + * Get all values matching the given JSONPath expression with wildcard support. + * Supports wildcard patterns like ".*" to match all object fields. + * + * @param json_path JSONPath expression with wildcards + * @return Vector of values matching the wildcard pattern + */ + inline simdjson_result<std::vector<value>> at_path_with_wildcard(std::string_view json_path) noexcept; + + /** + * Reset the iterator so that we are pointing back at the + * beginning of the object. You should still consume values only once even if you + * can iterate through the object more than once. If you unescape a string or a key + * within the object more than once, you have unsafe code. Note that rewinding an object + * means that you may need to reparse it anew: it is not a free operation. + * + * @returns true if the object contains some elements (not empty) + */ + inline simdjson_result<bool> reset() & noexcept; + /** + * This method scans the beginning of the object and checks whether the + * object is empty. + * The runtime complexity is constant time. After + * calling this function, if successful, the object is 'rewinded' at its + * beginning as if it had never been accessed. If the JSON is malformed (e.g., + * there is a missing comma), then an error is returned and it is no longer + * safe to continue. + */ + inline simdjson_result<bool> is_empty() & noexcept; + /** + * This method scans the object and counts the number of key-value pairs. + * The count_fields method should always be called before you have begun + * iterating through the object: it is expected that you are pointing at + * the beginning of the object. + * The runtime complexity is linear in the size of the object. After + * calling this function, if successful, the object is 'rewinded' at its + * beginning as if it had never been accessed. If the JSON is malformed (e.g., + * there is a missing comma), then an error is returned and it is no longer + * safe to continue. + * + * To check that an object is empty, it is more performant to use + * the is_empty() method. + * + * Performance hint: You should only call count_fields() as a last + * resort as it may require scanning the document twice or more. + */ + simdjson_inline simdjson_result<size_t> count_fields() & noexcept; + /** + * Consumes the object and returns a string_view instance corresponding to the + * object as represented in JSON. It points inside the original byte array containing + * the JSON document. + */ + simdjson_inline simdjson_result<std::string_view> raw_json() noexcept; + +#if SIMDJSON_SUPPORTS_CONCEPTS + /** + * Get this object as the given type. + * + * @param out This is set to a value of the given type, parsed from the JSON. If there is an error, this may not be initialized. + * @returns INCORRECT_TYPE If the JSON object is not of the given type. + * @returns SUCCESS If the parse succeeded and the out parameter was set to the value. + */ + template <typename T> + simdjson_warn_unused simdjson_inline error_code get(T &out) + noexcept(custom_deserializable<T, object> ? nothrow_custom_deserializable<T, object> : true) { + static_assert(custom_deserializable<T, object>); + return deserialize(*this, out); + } + /** + * Get this array as the given type. + * + * @returns A value of the given type, parsed from the JSON. + * @returns INCORRECT_TYPE If the JSON value is not the given type. + */ + template <typename T> + simdjson_inline simdjson_result<T> get() + noexcept(custom_deserializable<T, value> ? nothrow_custom_deserializable<T, value> : true) + { + static_assert(std::is_default_constructible<T>::value, "The specified type is not default constructible."); + T out{}; + SIMDJSON_TRY(get<T>(out)); + return out; + } + +#if SIMDJSON_STATIC_REFLECTION + /** + * Extract only specific fields from the JSON object into a struct. + * + * This allows selective deserialization of only the fields you need, + * potentially improving performance by skipping unwanted fields. + * + * Example: + * ```cpp + * struct Car { + * std::string make; + * std::string model; + * int year; + * double price; + * }; + * + * Car car; + * object.extract_into<"make", "model">(car); + * // Only 'make' and 'model' fields are extracted from JSON + * ``` + * + * @tparam FieldNames Compile-time string literals specifying which fields to extract + * @param out The output struct to populate with selected fields + * @returns SUCCESS on success, or an error code if a required field is missing or has wrong type + */ + template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) + simdjson_warn_unused simdjson_inline error_code extract_into(T& out) & noexcept; +#endif // SIMDJSON_STATIC_REFLECTION +#endif // SIMDJSON_SUPPORTS_CONCEPTS +protected: + /** + * Go to the end of the object, no matter where you are right now. + */ + simdjson_warn_unused simdjson_inline error_code consume() noexcept; + static simdjson_inline simdjson_result<object> start(value_iterator &iter) noexcept; + static simdjson_inline simdjson_result<object> start_root(value_iterator &iter) noexcept; + static simdjson_inline simdjson_result<object> started(value_iterator &iter) noexcept; + static simdjson_inline object resume(const value_iterator &iter) noexcept; + simdjson_inline object(const value_iterator &iter) noexcept; + + simdjson_warn_unused simdjson_inline error_code find_field_raw(const std::string_view key) noexcept; + + value_iterator iter{}; + + friend class value; + friend class document; + friend struct simdjson_result<object>; +}; + +} // namespace ondemand +} // namespace arm64 +} // namespace simdjson + +namespace simdjson { + +template<> +struct simdjson_result<arm64::ondemand::object> : public arm64::implementation_simdjson_result_base<arm64::ondemand::object> { +public: + simdjson_inline simdjson_result(arm64::ondemand::object &&value) noexcept; ///< @private + simdjson_inline simdjson_result(error_code error) noexcept; ///< @private + simdjson_inline simdjson_result() noexcept = default; + + simdjson_inline simdjson_result<arm64::ondemand::object_iterator> begin() noexcept; + simdjson_inline simdjson_result<arm64::ondemand::object_iterator> end() noexcept; + simdjson_inline simdjson_result<arm64::ondemand::value> find_field(std::string_view key) & noexcept; + simdjson_inline simdjson_result<arm64::ondemand::value> find_field(std::string_view key) && noexcept; + simdjson_inline simdjson_result<arm64::ondemand::value> find_field_unordered(std::string_view key) & noexcept; + simdjson_inline simdjson_result<arm64::ondemand::value> find_field_unordered(std::string_view key) && noexcept; + simdjson_inline simdjson_result<arm64::ondemand::value> operator[](std::string_view key) & noexcept; + simdjson_inline simdjson_result<arm64::ondemand::value> operator[](std::string_view key) && noexcept; + simdjson_inline simdjson_result<arm64::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result<arm64::ondemand::value> at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<std::vector<arm64::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; + inline simdjson_result<bool> reset() noexcept; + inline simdjson_result<bool> is_empty() noexcept; + inline simdjson_result<size_t> count_fields() & noexcept; + inline simdjson_result<std::string_view> raw_json() noexcept; + #if SIMDJSON_SUPPORTS_CONCEPTS + // TODO: move this code into object-inl.h + + template<typename T> + simdjson_inline simdjson_result<T> get() noexcept { + if (error()) { return error(); } + if constexpr (std::is_same_v<T, arm64::ondemand::object>) { + return first; + } + return first.get<T>(); + } + template<typename T> + simdjson_warn_unused simdjson_inline error_code get(T& out) noexcept { + if (error()) { return error(); } + if constexpr (std::is_same_v<T, arm64::ondemand::object>) { + out = first; + } else { + SIMDJSON_TRY( first.get<T>(out) ); + } + return SUCCESS; + } + +#if SIMDJSON_STATIC_REFLECTION + // TODO: move this code into object-inl.h + template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) + simdjson_warn_unused simdjson_inline error_code extract_into(T& out) noexcept { + if (error()) { return error(); } + return first.extract_into<FieldNames...>(out); + } +#endif // SIMDJSON_STATIC_REFLECTION +#endif // SIMDJSON_SUPPORTS_CONCEPTS +}; + +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_H +/* end file simdjson/generic/ondemand/object.h for arm64 */ +/* including simdjson/generic/ondemand/object_iterator.h for arm64: #include "simdjson/generic/ondemand/object_iterator.h" */ +/* begin file simdjson/generic/ondemand/object_iterator.h for arm64 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace arm64 { +namespace ondemand { + +class object_iterator { +public: + /** + * Create a new invalid object_iterator. + * + * Exists so you can declare a variable and later assign to it before use. + */ + simdjson_inline object_iterator() noexcept = default; + + // + // Iterator interface + // + + // Reads key and value, yielding them to the user. + // MUST ONLY BE CALLED ONCE PER ITERATION. + simdjson_inline simdjson_result<field> operator*() noexcept; + // Assumes it's being compared with the end. true if depth < iter->depth. + simdjson_inline bool operator==(const object_iterator &) const noexcept; + // Assumes it's being compared with the end. true if depth >= iter->depth. + simdjson_inline bool operator!=(const object_iterator &) const noexcept; + // Checks for ']' and ',' + // YOU MUST NOT CALL THIS IF operator* YIELDED AN ERROR. + // YOU MUST NOT CALL THIS WITHOUT A CORRESPONDING operator* CALL. + simdjson_inline object_iterator &operator++() noexcept; + +private: +#if SIMDJSON_DEVELOPMENT_CHECKS + bool has_been_referenced{false}; +#endif + /** + * The underlying JSON iterator. + * + * PERF NOTE: expected to be elided in favor of the parent document: this is set when the object + * is first used, and never changes afterwards. + */ + value_iterator iter{}; + + simdjson_inline object_iterator(const value_iterator &iter) noexcept; + friend struct simdjson_result<object_iterator>; + friend class object; +}; + +} // namespace ondemand +} // namespace arm64 +} // namespace simdjson + +namespace simdjson { + +template<> +struct simdjson_result<arm64::ondemand::object_iterator> : public arm64::implementation_simdjson_result_base<arm64::ondemand::object_iterator> { +public: + simdjson_inline simdjson_result(arm64::ondemand::object_iterator &&value) noexcept; ///< @private + simdjson_inline simdjson_result(error_code error) noexcept; ///< @private + simdjson_inline simdjson_result() noexcept = default; + + // + // Iterator interface + // + + // Reads key and value, yielding them to the user. + simdjson_inline simdjson_result<arm64::ondemand::field> operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. + // Assumes it's being compared with the end. true if depth < iter->depth. + simdjson_inline bool operator==(const simdjson_result<arm64::ondemand::object_iterator> &) const noexcept; + // Assumes it's being compared with the end. true if depth >= iter->depth. + simdjson_inline bool operator!=(const simdjson_result<arm64::ondemand::object_iterator> &) const noexcept; + // Checks for ']' and ',' + simdjson_inline simdjson_result<arm64::ondemand::object_iterator> &operator++() noexcept; +}; + +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_H +/* end file simdjson/generic/ondemand/object_iterator.h for arm64 */ +/* including simdjson/generic/ondemand/serialization.h for arm64: #include "simdjson/generic/ondemand/serialization.h" */ +/* begin file simdjson/generic/ondemand/serialization.h for arm64 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +/** + * Create a string-view instance out of a document instance. The string-view instance + * contains JSON text that is suitable to be parsed as JSON again. It does not + * validate the content. + */ +inline simdjson_result<std::string_view> to_json_string(arm64::ondemand::document& x) noexcept; +/** + * Create a string-view instance out of a value instance. The string-view instance + * contains JSON text that is suitable to be parsed as JSON again. The value must + * not have been accessed previously. It does not + * validate the content. + */ +inline simdjson_result<std::string_view> to_json_string(arm64::ondemand::value& x) noexcept; +/** + * Create a string-view instance out of an object instance. The string-view instance + * contains JSON text that is suitable to be parsed as JSON again. It does not + * validate the content. + */ +inline simdjson_result<std::string_view> to_json_string(arm64::ondemand::object& x) noexcept; +/** + * Create a string-view instance out of an array instance. The string-view instance + * contains JSON text that is suitable to be parsed as JSON again. It does not + * validate the content. + */ +inline simdjson_result<std::string_view> to_json_string(arm64::ondemand::array& x) noexcept; +inline simdjson_result<std::string_view> to_json_string(simdjson_result<arm64::ondemand::document> x); +inline simdjson_result<std::string_view> to_json_string(simdjson_result<arm64::ondemand::value> x); +inline simdjson_result<std::string_view> to_json_string(simdjson_result<arm64::ondemand::object> x); +inline simdjson_result<std::string_view> to_json_string(simdjson_result<arm64::ondemand::array> x); + +#if SIMDJSON_STATIC_REFLECTION +/** + * Create a JSON string from any user-defined type using static reflection. + * Only available when SIMDJSON_STATIC_REFLECTION is enabled. + */ +template<typename T> + requires(!std::same_as<T, arm64::ondemand::document> && + !std::same_as<T, arm64::ondemand::value> && + !std::same_as<T, arm64::ondemand::object> && + !std::same_as<T, arm64::ondemand::array>) +inline std::string to_json_string(const T& obj); +#endif + +} // namespace simdjson + +/** + * We want to support argument-dependent lookup (ADL). + * Hence we should define operator<< in the namespace + * where the argument (here value, object, etc.) resides. + * Credit: @madhur4127 + * See https://github.com/simdjson/simdjson/issues/1768 + */ +namespace simdjson { namespace arm64 { namespace ondemand { + +/** + * Print JSON to an output stream. It does not + * validate the content. + * + * @param out The output stream. + * @param value The element. + * @throw if there is an error with the underlying output stream. simdjson itself will not throw. + */ +inline std::ostream& operator<<(std::ostream& out, simdjson::arm64::ondemand::value x); +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::arm64::ondemand::value> x); +#endif +/** + * Print JSON to an output stream. It does not + * validate the content. + * + * @param out The output stream. + * @param value The array. + * @throw if there is an error with the underlying output stream. simdjson itself will not throw. + */ +inline std::ostream& operator<<(std::ostream& out, simdjson::arm64::ondemand::array value); +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::arm64::ondemand::array> x); +#endif +/** + * Print JSON to an output stream. It does not + * validate the content. + * + * @param out The output stream. + * @param value The array. + * @throw if there is an error with the underlying output stream. simdjson itself will not throw. + */ +inline std::ostream& operator<<(std::ostream& out, simdjson::arm64::ondemand::document& value); +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::arm64::ondemand::document>&& x); +#endif +inline std::ostream& operator<<(std::ostream& out, simdjson::arm64::ondemand::document_reference& value); +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::arm64::ondemand::document_reference>&& x); +#endif +/** + * Print JSON to an output stream. It does not + * validate the content. + * + * @param out The output stream. + * @param value The object. + * @throw if there is an error with the underlying output stream. simdjson itself will not throw. + */ +inline std::ostream& operator<<(std::ostream& out, simdjson::arm64::ondemand::object value); +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::arm64::ondemand::object> x); +#endif +}}} // namespace simdjson::arm64::ondemand + +#endif // SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_H +/* end file simdjson/generic/ondemand/serialization.h for arm64 */ + +// Deserialization for standard types +/* including simdjson/generic/ondemand/std_deserialize.h for arm64: #include "simdjson/generic/ondemand/std_deserialize.h" */ +/* begin file simdjson/generic/ondemand/std_deserialize.h for arm64 */ +#if SIMDJSON_SUPPORTS_CONCEPTS + +#ifndef SIMDJSON_ONDEMAND_DESERIALIZE_H +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_ONDEMAND_DESERIALIZE_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#include <concepts> +#include <limits> +#if SIMDJSON_STATIC_REFLECTION +#include <meta> +// #include <static_reflection> // for std::define_static_string - header not available yet +#endif + +namespace simdjson { + +////////////////////////////// +// Number deserialization +////////////////////////////// + +template <std::unsigned_integral T> +error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { + using limits = std::numeric_limits<T>; + + uint64_t x; + SIMDJSON_TRY(val.get_uint64().get(x)); + if (x > (limits::max)()) { + return NUMBER_OUT_OF_RANGE; + } + out = static_cast<T>(x); + return SUCCESS; +} + +template <std::floating_point T> +error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { + double x; + SIMDJSON_TRY(val.get_double().get(x)); + out = static_cast<T>(x); + return SUCCESS; +} + +template <std::signed_integral T> +error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { + using limits = std::numeric_limits<T>; + + int64_t x; + SIMDJSON_TRY(val.get_int64().get(x)); + if (x > (limits::max)() || x < (limits::min)()) { + return NUMBER_OUT_OF_RANGE; + } + out = static_cast<T>(x); + return SUCCESS; +} + +////////////////////////////// +// String deserialization +////////////////////////////// + +// just a character! +error_code tag_invoke(deserialize_tag, auto &val, char &out) noexcept { + std::string_view x; + SIMDJSON_TRY(val.get_string().get(x)); + if(x.size() != 1) { + return INCORRECT_TYPE; + } + out = x[0]; + return SUCCESS; +} + +// any string-like type (can be constructed from std::string_view) +template <concepts::constructible_from_string_view T, typename ValT> +error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(std::is_nothrow_constructible_v<T, std::string_view>) { + std::string_view str; + SIMDJSON_TRY(val.get_string().get(str)); + out = T{str}; + return SUCCESS; +} + + +/** + * STL containers have several constructors including one that takes a single + * size argument. Thus, some compilers (Visual Studio) will not be able to + * disambiguate between the size and container constructor. Users should + * explicitly specify the type of the container as needed: e.g., + * doc.get<std::vector<int>>(). + */ +template <concepts::appendable_containers T, typename ValT> +error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { + using value_type = typename std::remove_cvref_t<T>::value_type; + static_assert( + deserializable<value_type, ValT>, + "The specified type inside the container must itself be deserializable"); + static_assert( + std::is_default_constructible_v<value_type>, + "The specified type inside the container must default constructible."); + arm64::ondemand::array arr; + if constexpr (std::is_same_v<std::remove_cvref_t<ValT>, arm64::ondemand::array>) { + arr = val; + } else { + SIMDJSON_TRY(val.get_array().get(arr)); + } + + for (auto v : arr) { + if constexpr (concepts::returns_reference<T>) { + if (auto const err = v.get<value_type>().get(concepts::emplace_one(out)); + err) { + // If an error occurs, the empty element that we just inserted gets + // removed. We're not using a temp variable because if T is a heavy + // type, we want the valid path to be the fast path and the slow path be + // the path that has errors in it. + if constexpr (requires { out.pop_back(); }) { + static_cast<void>(out.pop_back()); + } + return err; + } + } else { + value_type temp; + if (auto const err = v.get<value_type>().get(temp); err) { + return err; + } + concepts::emplace_one(out, std::move(temp)); + } + } + return SUCCESS; +} + + +/** + * We want to support std::map and std::unordered_map but only for + * string-keyed types. + */ + template <concepts::string_view_keyed_map T, typename ValT> +error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { + using value_type = typename std::remove_cvref_t<T>::mapped_type; + static_assert( + deserializable<value_type, ValT>, + "The specified value type inside the container must itself be deserializable"); + static_assert( + std::is_default_constructible_v<value_type>, + "The specified value type inside the container must default constructible."); + arm64::ondemand::object obj; + SIMDJSON_TRY(val.get_object().get(obj)); + for (auto field : obj) { + std::string_view key; + SIMDJSON_TRY(field.unescaped_key().get(key)); + value_type this_value; + SIMDJSON_TRY(field.value().get<value_type>().get(this_value)); + [[maybe_unused]] std::pair<typename T::iterator, bool> result = out.emplace(key, this_value); + // unclear what to do if the key already exists + // if (result.second == false) { + // // key already exists + // } + } + (void)out; + return SUCCESS; +} + +template <concepts::string_view_keyed_map T> +error_code tag_invoke(deserialize_tag, arm64::ondemand::object &obj, T &out) noexcept { + using value_type = typename std::remove_cvref_t<T>::mapped_type; + + out.clear(); + for (auto field : obj) { + std::string_view key; + SIMDJSON_TRY(field.unescaped_key().get(key)); + + arm64::ondemand::value value_obj; + SIMDJSON_TRY(field.value().get(value_obj)); + + value_type this_value; + SIMDJSON_TRY(value_obj.get(this_value)); + out.emplace(typename T::key_type(key), std::move(this_value)); + } + return SUCCESS; +} + +template <concepts::string_view_keyed_map T> +error_code tag_invoke(deserialize_tag, arm64::ondemand::value &val, T &out) noexcept { + arm64::ondemand::object obj; + SIMDJSON_TRY(val.get_object().get(obj)); + return simdjson::deserialize(obj, out); +} + +template <concepts::string_view_keyed_map T> +error_code tag_invoke(deserialize_tag, arm64::ondemand::document &doc, T &out) noexcept { + arm64::ondemand::object obj; + SIMDJSON_TRY(doc.get_object().get(obj)); + return simdjson::deserialize(obj, out); +} + +template <concepts::string_view_keyed_map T> +error_code tag_invoke(deserialize_tag, arm64::ondemand::document_reference &doc, T &out) noexcept { + arm64::ondemand::object obj; + SIMDJSON_TRY(doc.get_object().get(obj)); + return simdjson::deserialize(obj, out); +} + + +/** + * This CPO (Customization Point Object) will help deserialize into + * smart pointers. + * + * If constructing T is nothrow, this conversion should be nothrow as well since + * we return MEMALLOC if we're not able to allocate memory instead of throwing + * the error message. + * + * @tparam T The type inside the smart pointer + * @tparam ValT document/value type + * @param val document/value + * @param out a reference to the smart pointer + * @return status of the conversion + */ +template <concepts::smart_pointer T, typename ValT> +error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(nothrow_deserializable<typename std::remove_cvref_t<T>::element_type, ValT>) { + using element_type = typename std::remove_cvref_t<T>::element_type; + + // For better error messages, don't use these as constraints on + // the tag_invoke CPO. + static_assert( + deserializable<element_type, ValT>, + "The specified type inside the unique_ptr must itself be deserializable"); + static_assert( + std::is_default_constructible_v<element_type>, + "The specified type inside the unique_ptr must default constructible."); + + auto ptr = new (std::nothrow) element_type(); + if (ptr == nullptr) { + return MEMALLOC; + } + SIMDJSON_TRY(val.template get<element_type>(*ptr)); + out.reset(ptr); + return SUCCESS; +} + +/** + * This CPO (Customization Point Object) will help deserialize into optional types. + */ +template <concepts::optional_type T> +error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept(nothrow_deserializable<typename std::remove_cvref_t<T>::value_type, decltype(val)>) { + using value_type = typename std::remove_cvref_t<T>::value_type; + + // Check if the value is null + bool is_null_value; + SIMDJSON_TRY( val.is_null().get(is_null_value) ); + if (is_null_value) { + out.reset(); // Set to nullopt + return SUCCESS; + } + + if (!out) { + out.emplace(); + } + SIMDJSON_TRY(val.template get<value_type>(out.value())); + return SUCCESS; +} + + +#if SIMDJSON_STATIC_REFLECTION + + +template <typename T> +constexpr bool user_defined_type = (std::is_class_v<T> +&& !std::is_same_v<T, std::string> && !std::is_same_v<T, std::string_view> && !concepts::optional_type<T> && +!concepts::appendable_containers<T>); + + +template <typename T, typename ValT> + requires(user_defined_type<T> && std::is_class_v<T>) +error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept { + arm64::ondemand::object obj; + if constexpr (std::is_same_v<std::remove_cvref_t<ValT>, arm64::ondemand::object>) { + obj = val; + } else { + SIMDJSON_TRY(val.get_object().get(obj)); + } + template for (constexpr auto mem : std::define_static_array(std::meta::nonstatic_data_members_of(^^T, std::meta::access_context::unchecked()))) { + if constexpr (!std::meta::is_const(mem) && std::meta::is_public(mem)) { + constexpr std::string_view key = std::define_static_string(std::meta::identifier_of(mem)); + if constexpr (concepts::optional_type<decltype(out.[:mem:])>) { + // for optional members, it's ok if the key is missing + auto error = obj[key].get(out.[:mem:]); + if (error && error != NO_SUCH_FIELD) { + if(error == NO_SUCH_FIELD) { + out.[:mem:].reset(); + continue; + } + return error; + } + } else { + // for non-optional members, the key must be present + SIMDJSON_TRY(obj[key].get(out.[:mem:])); + } + } + }; + return simdjson::SUCCESS; +} + +// Support for enum deserialization - deserialize from string representation using expand approach from P2996R12 +template <typename T, typename ValT> + requires(std::is_enum_v<T>) +error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept { +#if SIMDJSON_STATIC_REFLECTION + std::string_view str; + SIMDJSON_TRY(val.get_string().get(str)); + constexpr auto enumerators = std::define_static_array(std::meta::enumerators_of(^^T)); + template for (constexpr auto enum_val : enumerators) { + if (str == std::meta::identifier_of(enum_val)) { + out = [:enum_val:]; + return SUCCESS; + } + }; + + return INCORRECT_TYPE; +#else + // Fallback: deserialize as integer if reflection not available + std::underlying_type_t<T> int_val; + SIMDJSON_TRY(val.get(int_val)); + out = static_cast<T>(int_val); + return SUCCESS; +#endif +} + +template <typename simdjson_value, typename T> + requires(user_defined_type<std::remove_cvref_t<T>>) +error_code tag_invoke(deserialize_tag, simdjson_value &val, std::unique_ptr<T> &out) noexcept { + if (!out) { + out = std::make_unique<T>(); + if (!out) { + return MEMALLOC; + } + } + if (auto err = val.get(*out)) { + out.reset(); + return err; + } + return SUCCESS; +} + +template <typename simdjson_value, typename T> + requires(user_defined_type<std::remove_cvref_t<T>>) +error_code tag_invoke(deserialize_tag, simdjson_value &val, std::shared_ptr<T> &out) noexcept { + if (!out) { + out = std::make_shared<T>(); + if (!out) { + return MEMALLOC; + } + } + if (auto err = val.get(*out)) { + out.reset(); + return err; + } + return SUCCESS; +} + +#endif // SIMDJSON_STATIC_REFLECTION + +//////////////////////////////////////// +// Unique pointers +//////////////////////////////////////// +error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr<bool> &out) noexcept { + bool is_null_value; + SIMDJSON_TRY( val.is_null().get(is_null_value) ); + if (is_null_value) { + out.reset(); + return SUCCESS; + } + if (!out) { + out = std::make_unique<bool>(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_bool().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr<int64_t> &out) noexcept { + bool is_null_value; + SIMDJSON_TRY( val.is_null().get(is_null_value) ); + if (is_null_value) { + out.reset(); + return SUCCESS; + } + if (!out) { + out = std::make_unique<int64_t>(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_int64().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr<uint64_t> &out) noexcept { + bool is_null_value; + SIMDJSON_TRY( val.is_null().get(is_null_value) ); + if (is_null_value) { + out.reset(); + return SUCCESS; + } + if (!out) { + out = std::make_unique<uint64_t>(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_uint64().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr<double> &out) noexcept { + bool is_null_value; + SIMDJSON_TRY( val.is_null().get(is_null_value) ); + if (is_null_value) { + out.reset(); + return SUCCESS; + } + if (!out) { + out = std::make_unique<double>(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_double().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr<std::string_view> &out) noexcept { + bool is_null_value; + SIMDJSON_TRY( val.is_null().get(is_null_value) ); + if (is_null_value) { + out.reset(); + return SUCCESS; + } + if (!out) { + out = std::make_unique<std::string_view>(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_string().get(*out)); + return SUCCESS; +} + + +//////////////////////////////////////// +// Shared pointers +//////////////////////////////////////// +error_code tag_invoke(deserialize_tag, auto &val, std::shared_ptr<bool> &out) noexcept { + bool is_null_value; + SIMDJSON_TRY( val.is_null().get(is_null_value) ); + if (is_null_value) { + out.reset(); + return SUCCESS; + } + if (!out) { + out = std::make_shared<bool>(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_bool().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::shared_ptr<int64_t> &out) noexcept { + bool is_null_value; + SIMDJSON_TRY( val.is_null().get(is_null_value) ); + if (is_null_value) { + out.reset(); + return SUCCESS; + } + if (!out) { + out = std::make_shared<int64_t>(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_int64().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::shared_ptr<uint64_t> &out) noexcept { + bool is_null_value; + SIMDJSON_TRY( val.is_null().get(is_null_value) ); + if (is_null_value) { + out.reset(); + return SUCCESS; + } + if (!out) { + out = std::make_shared<uint64_t>(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_uint64().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::shared_ptr<double> &out) noexcept { + bool is_null_value; + SIMDJSON_TRY( val.is_null().get(is_null_value) ); + if (is_null_value) { + out.reset(); + return SUCCESS; + } + if (!out) { + out = std::make_shared<double>(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_double().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::shared_ptr<std::string_view> &out) noexcept { + bool is_null_value; + SIMDJSON_TRY( val.is_null().get(is_null_value) ); + if (is_null_value) { + out.reset(); + return SUCCESS; + } + if (!out) { + out = std::make_shared<std::string_view>(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_string().get(*out)); + return SUCCESS; +} + + +//////////////////////////////////////// +// Explicit optional specializations +//////////////////////////////////////// + +//////////////////////////////////////// +// Explicit smart pointer specializations for string and int types +//////////////////////////////////////// +error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr<std::string> &out) noexcept { + // Check if the value is null + bool is_null_value; + SIMDJSON_TRY( val.is_null().get(is_null_value) ); + if (is_null_value) { + out.reset(); // Set to nullptr + return SUCCESS; + } + + if (!out) { + out = std::make_unique<std::string>(); + } + std::string_view str; + SIMDJSON_TRY(val.get_string().get(str)); + *out = std::string{str}; + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::shared_ptr<std::string> &out) noexcept { + // Check if the value is null + bool is_null_value; + SIMDJSON_TRY( val.is_null().get(is_null_value) ); + if (is_null_value) { + out.reset(); // Set to nullptr + return SUCCESS; + } + + if (!out) { + out = std::make_shared<std::string>(); + } + std::string_view str; + SIMDJSON_TRY(val.get_string().get(str)); + *out = std::string{str}; + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr<int> &out) noexcept { + // Check if the value is null + bool is_null_value; + SIMDJSON_TRY( val.is_null().get(is_null_value) ); + if (is_null_value) { + out.reset(); // Set to nullptr + return SUCCESS; + } + + if (!out) { + out = std::make_unique<int>(); + } + int64_t temp; + SIMDJSON_TRY(val.get_int64().get(temp)); + *out = static_cast<int>(temp); + return SUCCESS; +} + +} // namespace simdjson + +#endif // SIMDJSON_ONDEMAND_DESERIALIZE_H +#endif // SIMDJSON_SUPPORTS_CONCEPTS +/* end file simdjson/generic/ondemand/std_deserialize.h for arm64 */ + +// Inline definitions +/* including simdjson/generic/ondemand/array-inl.h for arm64: #include "simdjson/generic/ondemand/array-inl.h" */ +/* begin file simdjson/generic/ondemand/array-inl.h for arm64 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_INL_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_ARRAY_INL_H */ +/* amalgamation skipped (editor-only): #include "simdjson/jsonpathutil.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array_iterator-inl.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator-inl.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace arm64 { +namespace ondemand { + +// +// ### Live States +// +// While iterating or looking up values, depth >= iter->depth. at_start may vary. Error is +// always SUCCESS: +// +// - Start: This is the state when the array is first found and the iterator is just past the `{`. +// In this state, at_start == true. +// - Next: After we hand a scalar value to the user, or an array/object which they then fully +// iterate over, the iterator is at the `,` before the next value (or `]`). In this state, +// depth == iter->depth, at_start == false, and error == SUCCESS. +// - Unfinished Business: When we hand an array/object to the user which they do not fully +// iterate over, we need to finish that iteration by skipping child values until we reach the +// Next state. In this state, depth > iter->depth, at_start == false, and error == SUCCESS. +// +// ## Error States +// +// In error states, we will yield exactly one more value before stopping. iter->depth == depth +// and at_start is always false. We decrement after yielding the error, moving to the Finished +// state. +// +// - Chained Error: When the array iterator is part of an error chain--for example, in +// `for (auto tweet : doc["tweets"])`, where the tweet element may be missing or not be an +// array--we yield that error in the loop, exactly once. In this state, error != SUCCESS and +// iter->depth == depth, and at_start == false. We decrement depth when we yield the error. +// - Missing Comma Error: When the iterator ++ method discovers there is no comma between elements, +// we flag that as an error and treat it exactly the same as a Chained Error. In this state, +// error == TAPE_ERROR, iter->depth == depth, and at_start == false. +// +// ## Terminal State +// +// The terminal state has iter->depth < depth. at_start is always false. +// +// - Finished: When we have reached a `]` or have reported an error, we are finished. We signal this +// by decrementing depth. In this state, iter->depth < depth, at_start == false, and +// error == SUCCESS. +// + +simdjson_inline array::array(const value_iterator &_iter) noexcept + : iter{_iter} +{ +} + +simdjson_inline simdjson_result<array> array::start(value_iterator &iter) noexcept { + // We don't need to know if the array is empty to start iteration, but we do want to know if there + // is an error--thus `simdjson_unused`. + simdjson_unused bool has_value; + SIMDJSON_TRY( iter.start_array().get(has_value) ); + return array(iter); +} +simdjson_inline simdjson_result<array> array::start_root(value_iterator &iter) noexcept { + simdjson_unused bool has_value; + SIMDJSON_TRY( iter.start_root_array().get(has_value) ); + return array(iter); +} +simdjson_inline simdjson_result<array> array::started(value_iterator &iter) noexcept { + bool has_value; + SIMDJSON_TRY(iter.started_array().get(has_value)); + return array(iter); +} + +simdjson_inline simdjson_result<array_iterator> array::begin() noexcept { +#if SIMDJSON_DEVELOPMENT_CHECKS + if (!iter.is_at_iterator_start()) { return OUT_OF_ORDER_ITERATION; } +#endif + return array_iterator(iter); +} +simdjson_inline simdjson_result<array_iterator> array::end() noexcept { + return array_iterator(iter); +} +simdjson_warn_unused simdjson_warn_unused simdjson_inline error_code array::consume() noexcept { + auto error = iter.json_iter().skip_child(iter.depth()-1); + if(error) { iter.abandon(); } + return error; +} + +simdjson_inline simdjson_result<std::string_view> array::raw_json() noexcept { + const uint8_t * starting_point{iter.peek_start()}; + auto error = consume(); + if(error) { return error; } + // After 'consume()', we could be left pointing just beyond the document, but that + // is ok because we are not going to dereference the final pointer position, we just + // use it to compute the length in bytes. + const uint8_t * final_point{iter._json_iter->unsafe_pointer()}; + return std::string_view(reinterpret_cast<const char*>(starting_point), size_t(final_point - starting_point)); +} + +SIMDJSON_PUSH_DISABLE_WARNINGS +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING +simdjson_inline simdjson_result<size_t> array::count_elements() & noexcept { + size_t count{0}; + // Important: we do not consume any of the values. + for(simdjson_unused auto v : *this) { count++; } + // The above loop will always succeed, but we want to report errors. + if(iter.error()) { return iter.error(); } + // We need to move back at the start because we expect users to iterate through + // the array after counting the number of elements. + iter.reset_array(); + return count; +} +SIMDJSON_POP_DISABLE_WARNINGS + +simdjson_inline simdjson_result<bool> array::is_empty() & noexcept { + bool is_not_empty; + auto error = iter.reset_array().get(is_not_empty); + if(error) { return error; } + return !is_not_empty; +} + +inline simdjson_result<bool> array::reset() & noexcept { + return iter.reset_array(); +} + +inline simdjson_result<value> array::at_pointer(std::string_view json_pointer) noexcept { + if (json_pointer[0] != '/') { return INVALID_JSON_POINTER; } + json_pointer = json_pointer.substr(1); + // - means "the append position" or "the element after the end of the array" + // We don't support this, because we're returning a real element, not a position. + if (json_pointer == "-") { return INDEX_OUT_OF_BOUNDS; } + + // Read the array index + size_t array_index = 0; + size_t i; + for (i = 0; i < json_pointer.length() && json_pointer[i] != '/'; i++) { + uint8_t digit = uint8_t(json_pointer[i] - '0'); + // Check for non-digit in array index. If it's there, we're trying to get a field in an object + if (digit > 9) { return INCORRECT_TYPE; } + array_index = array_index*10 + digit; + } + + // 0 followed by other digits is invalid + if (i > 1 && json_pointer[0] == '0') { return INVALID_JSON_POINTER; } // "JSON pointer array index has other characters after 0" + + // Empty string is invalid; so is a "/" with no digits before it + if (i == 0) { return INVALID_JSON_POINTER; } // "Empty string in JSON pointer array index" + // Get the child + auto child = at(array_index); + // If there is an error, it ends here + if(child.error()) { + return child; + } + + // If there is a /, we're not done yet, call recursively. + if (i < json_pointer.length()) { + child = child.at_pointer(json_pointer.substr(i)); + } + return child; +} + +inline simdjson_result<value> array::at_path(std::string_view json_path) noexcept { + auto json_pointer = json_path_to_pointer_conversion(json_path); + if (json_pointer == "-1") { return INVALID_JSON_POINTER; } + return at_pointer(json_pointer); +} + +inline simdjson_result<std::vector<value>> array::at_path_with_wildcard(std::string_view json_path) noexcept { + std::vector<value> result; + + auto result_pair = get_next_key_and_json_path(json_path); + std::string_view key = result_pair.first; + std::string_view remaining_path = result_pair.second; + // Wildcard case + if(key=="*"){ + for(auto element: *this){ + + if(element.error()){ + return element.error(); + } + + if(remaining_path.empty()){ + // Use value_unsafe() because we've already checked for errors above. + // The 'element' is a simdjson_result<value> wrapper, and we need to extract + // the underlying value. value_unsafe() is safe here because error() returned false. + result.push_back(std::move(element).value_unsafe()); + + }else{ + auto nested_result = element.at_path_with_wildcard(remaining_path); + + if(nested_result.error()){ + return nested_result.error(); + } + // Same logic as above. + std::vector<value> nested_matches = std::move(nested_result).value_unsafe(); + + result.insert(result.end(), + std::make_move_iterator(nested_matches.begin()), + std::make_move_iterator(nested_matches.end())); + } + } + return result; + }else{ + // Specific index case in which we access the element at the given index + size_t idx=0; + + for(char c:key){ + if(c < '0' || c > '9'){ + return INVALID_JSON_POINTER; + } + idx = idx*10 + (c - '0'); + } + + auto element = at(idx); + + if(element.error()){ + return element.error(); + } + + if(remaining_path.empty()){ + result.push_back(std::move(element).value_unsafe()); + return result; + }else{ + return element.at_path_with_wildcard(remaining_path); + } + } +} + +simdjson_inline simdjson_result<value> array::at(size_t index) noexcept { + size_t i = 0; + for (auto value : *this) { + if (i == index) { return value; } + i++; + } + return INDEX_OUT_OF_BOUNDS; +} + +} // namespace ondemand +} // namespace arm64 +} // namespace simdjson + +namespace simdjson { + +simdjson_inline simdjson_result<arm64::ondemand::array>::simdjson_result( + arm64::ondemand::array &&value +) noexcept + : implementation_simdjson_result_base<arm64::ondemand::array>( + std::forward<arm64::ondemand::array>(value) + ) +{ +} +simdjson_inline simdjson_result<arm64::ondemand::array>::simdjson_result( + error_code error +) noexcept + : implementation_simdjson_result_base<arm64::ondemand::array>(error) +{ +} + +simdjson_inline simdjson_result<arm64::ondemand::array_iterator> simdjson_result<arm64::ondemand::array>::begin() noexcept { + if (error()) { return error(); } + return first.begin(); +} +simdjson_inline simdjson_result<arm64::ondemand::array_iterator> simdjson_result<arm64::ondemand::array>::end() noexcept { + if (error()) { return error(); } + return first.end(); +} +simdjson_inline simdjson_result<size_t> simdjson_result<arm64::ondemand::array>::count_elements() & noexcept { + if (error()) { return error(); } + return first.count_elements(); +} +simdjson_inline simdjson_result<bool> simdjson_result<arm64::ondemand::array>::is_empty() & noexcept { + if (error()) { return error(); } + return first.is_empty(); +} +simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::array>::at(size_t index) noexcept { + if (error()) { return error(); } + return first.at(index); +} +simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::array>::at_pointer(std::string_view json_pointer) noexcept { + if (error()) { return error(); } + return first.at_pointer(json_pointer); +} +simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::array>::at_path(std::string_view json_path) noexcept { + if (error()) { return error(); } + return first.at_path(json_path); +} +simdjson_inline simdjson_result<std::vector<arm64::ondemand::value>> simdjson_result<arm64::ondemand::array>::at_path_with_wildcard(std::string_view json_path) noexcept { + if (error()) { return error(); } + return first.at_path_with_wildcard(json_path); +} +simdjson_inline simdjson_result<std::string_view> simdjson_result<arm64::ondemand::array>::raw_json() noexcept { + if (error()) { return error(); } + return first.raw_json(); +} +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_INL_H +/* end file simdjson/generic/ondemand/array-inl.h for arm64 */ +/* including simdjson/generic/ondemand/array_iterator-inl.h for arm64: #include "simdjson/generic/ondemand/array_iterator-inl.h" */ +/* begin file simdjson/generic/ondemand/array_iterator-inl.h for arm64 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_INL_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_INL_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array_iterator.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value-inl.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator-inl.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace arm64 { +namespace ondemand { + +simdjson_inline array_iterator::array_iterator(const value_iterator &_iter) noexcept + : iter{_iter} +{} + +simdjson_inline simdjson_result<value> array_iterator::operator*() noexcept { +#if SIMDJSON_DEVELOPMENT_CHECKS + SIMDJSON_ASSUME(!has_been_referenced); + has_been_referenced = true; +#endif + if (iter.error()) { iter.abandon(); return iter.error(); } + return value(iter.child()); +} +simdjson_inline bool array_iterator::operator==(const array_iterator &other) const noexcept { + return !(*this != other); +} +simdjson_inline bool array_iterator::operator!=(const array_iterator &) const noexcept { + return iter.is_open(); +} +simdjson_inline array_iterator &array_iterator::operator++() noexcept { +#if SIMDJSON_DEVELOPMENT_CHECKS + has_been_referenced = false; +#endif + error_code error; + // PERF NOTE this is a safety rail ... users should exit loops as soon as they receive an error, so we'll never get here. + // However, it does not seem to make a perf difference, so we add it out of an abundance of caution. + if (( error = iter.error() )) { return *this; } + if (( error = iter.skip_child() )) { return *this; } + if (( error = iter.has_next_element().error() )) { return *this; } + return *this; +} + +simdjson_inline bool array_iterator::at_end() const noexcept { + return iter.at_end(); +} +} // namespace ondemand +} // namespace arm64 +} // namespace simdjson + +namespace simdjson { + +simdjson_inline simdjson_result<arm64::ondemand::array_iterator>::simdjson_result( + arm64::ondemand::array_iterator &&value +) noexcept + : arm64::implementation_simdjson_result_base<arm64::ondemand::array_iterator>(std::forward<arm64::ondemand::array_iterator>(value)) +{ + first.iter.assert_is_valid(); +} +simdjson_inline simdjson_result<arm64::ondemand::array_iterator>::simdjson_result(error_code error) noexcept + : arm64::implementation_simdjson_result_base<arm64::ondemand::array_iterator>({}, error) +{ +} + +simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::array_iterator>::operator*() noexcept { + if (error()) { return error(); } + return *first; +} +simdjson_inline bool simdjson_result<arm64::ondemand::array_iterator>::operator==(const simdjson_result<arm64::ondemand::array_iterator> &other) const noexcept { + if (!first.iter.is_valid()) { return !error(); } + return first == other.first; +} +simdjson_inline bool simdjson_result<arm64::ondemand::array_iterator>::operator!=(const simdjson_result<arm64::ondemand::array_iterator> &other) const noexcept { + if (!first.iter.is_valid()) { return error(); } + return first != other.first; +} +simdjson_inline simdjson_result<arm64::ondemand::array_iterator> &simdjson_result<arm64::ondemand::array_iterator>::operator++() noexcept { + // Clear the error if there is one, so we don't yield it twice + if (error()) { second = SUCCESS; return *this; } + ++(first); + return *this; +} +simdjson_inline bool simdjson_result<arm64::ondemand::array_iterator>::at_end() const noexcept { + return !first.iter.is_valid() || first.at_end(); +} +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_INL_H +/* end file simdjson/generic/ondemand/array_iterator-inl.h for arm64 */ +/* including simdjson/generic/ondemand/value-inl.h for arm64: #include "simdjson/generic/ondemand/value-inl.h" */ +/* begin file simdjson/generic/ondemand/value-inl.h for arm64 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_INL_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_VALUE_INL_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array_iterator.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace arm64 { +namespace ondemand { + +simdjson_inline value::value(const value_iterator &_iter) noexcept + : iter{_iter} +{ +} +simdjson_inline value value::start(const value_iterator &iter) noexcept { + return iter; +} +simdjson_inline value value::resume(const value_iterator &iter) noexcept { + return iter; +} + +simdjson_inline simdjson_result<array> value::get_array() noexcept { + return array::start(iter); +} +simdjson_inline simdjson_result<object> value::get_object() noexcept { + return object::start(iter); +} +simdjson_inline simdjson_result<object> value::start_or_resume_object() noexcept { + if (iter.at_start()) { + return get_object(); + } else { + return object::resume(iter); + } +} + +simdjson_inline simdjson_result<raw_json_string> value::get_raw_json_string() noexcept { + return iter.get_raw_json_string(); +} +simdjson_inline simdjson_result<std::string_view> value::get_string(bool allow_replacement) noexcept { + return iter.get_string(allow_replacement); +} +template <typename string_type> +simdjson_warn_unused simdjson_inline error_code value::get_string(string_type& receiver, bool allow_replacement) noexcept { + return iter.get_string(receiver, allow_replacement); +} +simdjson_inline simdjson_result<std::string_view> value::get_wobbly_string() noexcept { + return iter.get_wobbly_string(); +} +simdjson_inline simdjson_result<double> value::get_double() noexcept { + return iter.get_double(); +} +simdjson_inline simdjson_result<double> value::get_double_in_string() noexcept { + return iter.get_double_in_string(); +} +simdjson_inline simdjson_result<uint64_t> value::get_uint64() noexcept { + return iter.get_uint64(); +} +simdjson_inline simdjson_result<uint64_t> value::get_uint64_in_string() noexcept { + return iter.get_uint64_in_string(); +} +simdjson_inline simdjson_result<int64_t> value::get_int64() noexcept { + return iter.get_int64(); +} +simdjson_inline simdjson_result<int64_t> value::get_int64_in_string() noexcept { + return iter.get_int64_in_string(); +} +simdjson_inline simdjson_result<bool> value::get_bool() noexcept { + return iter.get_bool(); +} +simdjson_inline simdjson_result<bool> value::is_null() noexcept { + return iter.is_null(); +} + +template<> simdjson_inline simdjson_result<array> value::get() noexcept { return get_array(); } +template<> simdjson_inline simdjson_result<object> value::get() noexcept { return get_object(); } +template<> simdjson_inline simdjson_result<raw_json_string> value::get() noexcept { return get_raw_json_string(); } +template<> simdjson_inline simdjson_result<std::string_view> value::get() noexcept { return get_string(false); } +template<> simdjson_inline simdjson_result<number> value::get() noexcept { return get_number(); } +template<> simdjson_inline simdjson_result<double> value::get() noexcept { return get_double(); } +template<> simdjson_inline simdjson_result<uint64_t> value::get() noexcept { return get_uint64(); } +template<> simdjson_inline simdjson_result<int64_t> value::get() noexcept { return get_int64(); } +template<> simdjson_inline simdjson_result<bool> value::get() noexcept { return get_bool(); } + + +template<> simdjson_warn_unused simdjson_inline error_code value::get(array& out) noexcept { return get_array().get(out); } +template<> simdjson_warn_unused simdjson_inline error_code value::get(object& out) noexcept { return get_object().get(out); } +template<> simdjson_warn_unused simdjson_inline error_code value::get(raw_json_string& out) noexcept { return get_raw_json_string().get(out); } +template<> simdjson_warn_unused simdjson_inline error_code value::get(std::string_view& out) noexcept { return get_string(false).get(out); } +template<> simdjson_warn_unused simdjson_inline error_code value::get(number& out) noexcept { return get_number().get(out); } +template<> simdjson_warn_unused simdjson_inline error_code value::get(double& out) noexcept { return get_double().get(out); } +template<> simdjson_warn_unused simdjson_inline error_code value::get(uint64_t& out) noexcept { return get_uint64().get(out); } +template<> simdjson_warn_unused simdjson_inline error_code value::get(int64_t& out) noexcept { return get_int64().get(out); } +template<> simdjson_warn_unused simdjson_inline error_code value::get(bool& out) noexcept { return get_bool().get(out); } + +#if SIMDJSON_EXCEPTIONS +template <class T> +simdjson_inline value::operator T() noexcept(false) { + return get<T>(); +} +simdjson_inline value::operator array() noexcept(false) { + return get_array(); +} +simdjson_inline value::operator object() noexcept(false) { + return get_object(); +} +simdjson_inline value::operator uint64_t() noexcept(false) { + return get_uint64(); +} +simdjson_inline value::operator int64_t() noexcept(false) { + return get_int64(); +} +simdjson_inline value::operator double() noexcept(false) { + return get_double(); +} +simdjson_inline value::operator std::string_view() noexcept(false) { + return get_string(false); +} +simdjson_inline value::operator raw_json_string() noexcept(false) { + return get_raw_json_string(); +} +simdjson_inline value::operator bool() noexcept(false) { + return get_bool(); +} +#endif + +simdjson_inline simdjson_result<array_iterator> value::begin() & noexcept { + return get_array().begin(); +} +simdjson_inline simdjson_result<array_iterator> value::end() & noexcept { + return {}; +} +simdjson_inline simdjson_result<size_t> value::count_elements() & noexcept { + simdjson_result<size_t> answer; + auto a = get_array(); + answer = a.count_elements(); + // count_elements leaves you pointing inside the array, at the first element. + // We need to move back so that the user can create a new array (which requires that + // we point at '['). + iter.move_at_start(); + return answer; +} +simdjson_inline simdjson_result<size_t> value::count_fields() & noexcept { + simdjson_result<size_t> answer; + auto a = get_object(); + answer = a.count_fields(); + iter.move_at_start(); + return answer; +} +simdjson_inline simdjson_result<value> value::at(size_t index) noexcept { + auto a = get_array(); + return a.at(index); +} + +simdjson_inline simdjson_result<value> value::find_field(std::string_view key) noexcept { + return start_or_resume_object().find_field(key); +} +simdjson_inline simdjson_result<value> value::find_field(const char *key) noexcept { + return start_or_resume_object().find_field(key); +} + +simdjson_inline simdjson_result<value> value::find_field_unordered(std::string_view key) noexcept { + return start_or_resume_object().find_field_unordered(key); +} +simdjson_inline simdjson_result<value> value::find_field_unordered(const char *key) noexcept { + return start_or_resume_object().find_field_unordered(key); +} + +simdjson_inline simdjson_result<value> value::operator[](std::string_view key) noexcept { + return start_or_resume_object()[key]; +} +simdjson_inline simdjson_result<value> value::operator[](const char *key) noexcept { + return start_or_resume_object()[key]; +} + +simdjson_inline simdjson_result<json_type> value::type() noexcept { + return iter.type(); +} + +simdjson_inline simdjson_result<bool> value::is_scalar() noexcept { + json_type this_type; + auto error = type().get(this_type); + if(error) { return error; } + return ! ((this_type == json_type::array) || (this_type == json_type::object)); +} + +simdjson_inline simdjson_result<bool> value::is_string() noexcept { + json_type this_type; + auto error = type().get(this_type); + if(error) { return error; } + return (this_type == json_type::string); +} + + +simdjson_inline bool value::is_negative() noexcept { + return iter.is_negative(); +} + +simdjson_inline simdjson_result<bool> value::is_integer() noexcept { + return iter.is_integer(); +} +simdjson_warn_unused simdjson_inline simdjson_result<number_type> value::get_number_type() noexcept { + return iter.get_number_type(); +} +simdjson_warn_unused simdjson_inline simdjson_result<number> value::get_number() noexcept { + return iter.get_number(); +} + +simdjson_inline std::string_view value::raw_json_token() noexcept { + return std::string_view(reinterpret_cast<const char*>(iter.peek_start()), iter.peek_start_length()); +} + +simdjson_inline simdjson_result<std::string_view> value::raw_json() noexcept { + json_type t; + SIMDJSON_TRY(type().get(t)); + switch (t) + { + case json_type::array: { + ondemand::array array; + SIMDJSON_TRY(get_array().get(array)); + return array.raw_json(); + } + case json_type::object: { + ondemand::object object; + SIMDJSON_TRY(get_object().get(object)); + return object.raw_json(); + } + default: + return raw_json_token(); + } +} + +simdjson_inline simdjson_result<const char *> value::current_location() noexcept { + return iter.json_iter().current_location(); +} + +simdjson_inline int32_t value::current_depth() const noexcept{ + return iter.json_iter().depth(); +} + +inline bool is_pointer_well_formed(std::string_view json_pointer) noexcept { + if (simdjson_unlikely(json_pointer.empty())) { // can't be + return false; + } + if (simdjson_unlikely(json_pointer[0] != '/')) { + return false; + } + size_t escape = json_pointer.find('~'); + if (escape == std::string_view::npos) { + return true; + } + if (escape == json_pointer.size() - 1) { + return false; + } + if (json_pointer[escape + 1] != '0' && json_pointer[escape + 1] != '1') { + return false; + } + return true; +} + +simdjson_inline simdjson_result<value> value::at_pointer(std::string_view json_pointer) noexcept { + json_type t; + SIMDJSON_TRY(type().get(t)); + switch (t) + { + case json_type::array: + return (*this).get_array().at_pointer(json_pointer); + case json_type::object: + return (*this).get_object().at_pointer(json_pointer); + default: + // a non-empty string can be invalid, or accessing a primitive (issue 2154) + if (is_pointer_well_formed(json_pointer)) { + return NO_SUCH_FIELD; + } + return INVALID_JSON_POINTER; + } +} + +simdjson_inline simdjson_result<value> value::at_path(std::string_view json_path) noexcept { + json_type t; + SIMDJSON_TRY(type().get(t)); + switch (t) { + case json_type::array: + return (*this).get_array().at_path(json_path); + case json_type::object: + return (*this).get_object().at_path(json_path); + default: + return INVALID_JSON_POINTER; + } +} + +inline simdjson_result<std::vector<value>> value::at_path_with_wildcard(std::string_view json_path) noexcept { + json_type t; + SIMDJSON_TRY(type().get(t)); + switch (t) { + case json_type::array: + return (*this).get_array().at_path_with_wildcard(json_path); + case json_type::object: + return (*this).get_object().at_path_with_wildcard(json_path); + default: + return INVALID_JSON_POINTER; + } +} + +} // namespace ondemand +} // namespace arm64 +} // namespace simdjson + +namespace simdjson { + +simdjson_inline simdjson_result<arm64::ondemand::value>::simdjson_result( + arm64::ondemand::value &&value +) noexcept : + implementation_simdjson_result_base<arm64::ondemand::value>( + std::forward<arm64::ondemand::value>(value) + ) +{ +} +simdjson_inline simdjson_result<arm64::ondemand::value>::simdjson_result( + error_code error +) noexcept : + implementation_simdjson_result_base<arm64::ondemand::value>(error) +{ +} +simdjson_inline simdjson_result<size_t> simdjson_result<arm64::ondemand::value>::count_elements() & noexcept { + if (error()) { return error(); } + return first.count_elements(); +} +simdjson_inline simdjson_result<size_t> simdjson_result<arm64::ondemand::value>::count_fields() & noexcept { + if (error()) { return error(); } + return first.count_fields(); +} +simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::value>::at(size_t index) noexcept { + if (error()) { return error(); } + return first.at(index); +} +simdjson_inline simdjson_result<arm64::ondemand::array_iterator> simdjson_result<arm64::ondemand::value>::begin() & noexcept { + if (error()) { return error(); } + return first.begin(); +} +simdjson_inline simdjson_result<arm64::ondemand::array_iterator> simdjson_result<arm64::ondemand::value>::end() & noexcept { + if (error()) { return error(); } + return {}; +} + +simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::value>::find_field(std::string_view key) noexcept { + if (error()) { return error(); } + return first.find_field(key); +} +simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::value>::find_field(const char *key) noexcept { + if (error()) { return error(); } + return first.find_field(key); +} + +simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::value>::find_field_unordered(std::string_view key) noexcept { + if (error()) { return error(); } + return first.find_field_unordered(key); +} +simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::value>::find_field_unordered(const char *key) noexcept { + if (error()) { return error(); } + return first.find_field_unordered(key); +} + +simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::value>::operator[](std::string_view key) noexcept { + if (error()) { return error(); } + return first[key]; +} +simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::value>::operator[](const char *key) noexcept { + if (error()) { return error(); } + return first[key]; +} + +simdjson_inline simdjson_result<arm64::ondemand::array> simdjson_result<arm64::ondemand::value>::get_array() noexcept { + if (error()) { return error(); } + return first.get_array(); +} +simdjson_inline simdjson_result<arm64::ondemand::object> simdjson_result<arm64::ondemand::value>::get_object() noexcept { + if (error()) { return error(); } + return first.get_object(); +} +simdjson_inline simdjson_result<uint64_t> simdjson_result<arm64::ondemand::value>::get_uint64() noexcept { + if (error()) { return error(); } + return first.get_uint64(); +} +simdjson_inline simdjson_result<uint64_t> simdjson_result<arm64::ondemand::value>::get_uint64_in_string() noexcept { + if (error()) { return error(); } + return first.get_uint64_in_string(); +} +simdjson_inline simdjson_result<int64_t> simdjson_result<arm64::ondemand::value>::get_int64() noexcept { + if (error()) { return error(); } + return first.get_int64(); +} +simdjson_inline simdjson_result<int64_t> simdjson_result<arm64::ondemand::value>::get_int64_in_string() noexcept { + if (error()) { return error(); } + return first.get_int64_in_string(); +} +simdjson_inline simdjson_result<double> simdjson_result<arm64::ondemand::value>::get_double() noexcept { + if (error()) { return error(); } + return first.get_double(); +} +simdjson_inline simdjson_result<double> simdjson_result<arm64::ondemand::value>::get_double_in_string() noexcept { + if (error()) { return error(); } + return first.get_double_in_string(); +} +simdjson_inline simdjson_result<std::string_view> simdjson_result<arm64::ondemand::value>::get_string(bool allow_replacement) noexcept { + if (error()) { return error(); } + return first.get_string(allow_replacement); +} +template <typename string_type> +simdjson_inline error_code simdjson_result<arm64::ondemand::value>::get_string(string_type& receiver, bool allow_replacement) noexcept { + if (error()) { return error(); } + return first.get_string(receiver, allow_replacement); +} +simdjson_inline simdjson_result<std::string_view> simdjson_result<arm64::ondemand::value>::get_wobbly_string() noexcept { + if (error()) { return error(); } + return first.get_wobbly_string(); +} +simdjson_inline simdjson_result<arm64::ondemand::raw_json_string> simdjson_result<arm64::ondemand::value>::get_raw_json_string() noexcept { + if (error()) { return error(); } + return first.get_raw_json_string(); +} +simdjson_inline simdjson_result<bool> simdjson_result<arm64::ondemand::value>::get_bool() noexcept { + if (error()) { return error(); } + return first.get_bool(); +} +simdjson_inline simdjson_result<bool> simdjson_result<arm64::ondemand::value>::is_null() noexcept { + if (error()) { return error(); } + return first.is_null(); +} + +template<> simdjson_inline error_code simdjson_result<arm64::ondemand::value>::get<arm64::ondemand::value>(arm64::ondemand::value &out) noexcept { + if (error()) { return error(); } + out = first; + return SUCCESS; +} + +template<typename T> simdjson_inline simdjson_result<T> simdjson_result<arm64::ondemand::value>::get() noexcept { + if (error()) { return error(); } + return first.get<T>(); +} +template<typename T> simdjson_inline error_code simdjson_result<arm64::ondemand::value>::get(T &out) noexcept { + if (error()) { return error(); } + return first.get<T>(out); +} + +template<> simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::value>::get<arm64::ondemand::value>() noexcept { + if (error()) { return error(); } + return std::move(first); +} + +simdjson_inline simdjson_result<arm64::ondemand::json_type> simdjson_result<arm64::ondemand::value>::type() noexcept { + if (error()) { return error(); } + return first.type(); +} +simdjson_inline simdjson_result<bool> simdjson_result<arm64::ondemand::value>::is_scalar() noexcept { + if (error()) { return error(); } + return first.is_scalar(); +} +simdjson_inline simdjson_result<bool> simdjson_result<arm64::ondemand::value>::is_string() noexcept { + if (error()) { return error(); } + return first.is_string(); +} +simdjson_inline simdjson_result<bool> simdjson_result<arm64::ondemand::value>::is_negative() noexcept { + if (error()) { return error(); } + return first.is_negative(); +} +simdjson_inline simdjson_result<bool> simdjson_result<arm64::ondemand::value>::is_integer() noexcept { + if (error()) { return error(); } + return first.is_integer(); +} +simdjson_inline simdjson_result<arm64::number_type> simdjson_result<arm64::ondemand::value>::get_number_type() noexcept { + if (error()) { return error(); } + return first.get_number_type(); +} +simdjson_inline simdjson_result<arm64::ondemand::number> simdjson_result<arm64::ondemand::value>::get_number() noexcept { + if (error()) { return error(); } + return first.get_number(); +} +#if SIMDJSON_EXCEPTIONS +template <class T> +simdjson_inline simdjson_result<arm64::ondemand::value>::operator T() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first.get<T>(); +} +simdjson_inline simdjson_result<arm64::ondemand::value>::operator arm64::ondemand::array() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result<arm64::ondemand::value>::operator arm64::ondemand::object() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result<arm64::ondemand::value>::operator uint64_t() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result<arm64::ondemand::value>::operator int64_t() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result<arm64::ondemand::value>::operator double() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result<arm64::ondemand::value>::operator std::string_view() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result<arm64::ondemand::value>::operator arm64::ondemand::raw_json_string() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result<arm64::ondemand::value>::operator bool() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +#endif + +simdjson_inline simdjson_result<std::string_view> simdjson_result<arm64::ondemand::value>::raw_json_token() noexcept { + if (error()) { return error(); } + return first.raw_json_token(); +} + +simdjson_inline simdjson_result<std::string_view> simdjson_result<arm64::ondemand::value>::raw_json() noexcept { + if (error()) { return error(); } + return first.raw_json(); +} + +simdjson_inline simdjson_result<const char *> simdjson_result<arm64::ondemand::value>::current_location() noexcept { + if (error()) { return error(); } + return first.current_location(); +} + +simdjson_inline simdjson_result<int32_t> simdjson_result<arm64::ondemand::value>::current_depth() const noexcept { + if (error()) { return error(); } + return first.current_depth(); +} + +simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::value>::at_pointer( + std::string_view json_pointer) noexcept { + if (error()) { + return error(); + } + return first.at_pointer(json_pointer); +} + +simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::value>::at_path( + std::string_view json_path) noexcept { + if (error()) { + return error(); + } + return first.at_path(json_path); +} + +inline simdjson_result<std::vector<arm64::ondemand::value>> simdjson_result<arm64::ondemand::value>::at_path_with_wildcard( + std::string_view json_path) noexcept { + if (error()) { + return error(); + } + return first.at_path_with_wildcard(json_path); +} + +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_INL_H +/* end file simdjson/generic/ondemand/value-inl.h for arm64 */ +/* including simdjson/generic/ondemand/document-inl.h for arm64: #include "simdjson/generic/ondemand/document-inl.h" */ +/* begin file simdjson/generic/ondemand/document-inl.h for arm64 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array_iterator.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value-inl.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array-inl.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator-inl.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object-inl.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator-inl.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/deserialize.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace arm64 { +namespace ondemand { + +simdjson_inline document::document(ondemand::json_iterator &&_iter) noexcept + : iter{std::forward<json_iterator>(_iter)} +{ + logger::log_start_value(iter, "document"); +} + +simdjson_inline document document::start(json_iterator &&iter) noexcept { + return document(std::forward<json_iterator>(iter)); +} + +inline void document::rewind() noexcept { + iter.rewind(); +} + +inline std::string document::to_debug_string() noexcept { + return iter.to_string(); +} + +inline simdjson_result<const char *> document::current_location() const noexcept { + return iter.current_location(); +} + +inline int32_t document::current_depth() const noexcept { + return iter.depth(); +} + +inline bool document::at_end() const noexcept { + return iter.at_end(); +} + + +inline bool document::is_alive() noexcept { + return iter.is_alive(); +} +simdjson_inline value_iterator document::resume_value_iterator() noexcept { + return value_iterator(&iter, 1, iter.root_position()); +} +simdjson_inline value_iterator document::get_root_value_iterator() noexcept { + return resume_value_iterator(); +} +simdjson_inline simdjson_result<object> document::start_or_resume_object() noexcept { + if (iter.at_root()) { + return get_object(); + } else { + return object::resume(resume_value_iterator()); + } +} +simdjson_inline simdjson_result<value> document::get_value() noexcept { + // Make sure we start any arrays or objects before returning, so that start_root_<object/array>() + // gets called. + + // It is the convention throughout the code that the macro `SIMDJSON_DEVELOPMENT_CHECKS` determines whether + // we check for OUT_OF_ORDER_ITERATION. Proper on::demand code should never trigger this error. +#if SIMDJSON_DEVELOPMENT_CHECKS + if (!iter.at_root()) { return OUT_OF_ORDER_ITERATION; } +#endif + // assert_at_root() serves two purposes: in Debug mode, whether or not + // SIMDJSON_DEVELOPMENT_CHECKS is set or not, it checks that we are at the root of + // the document (this will typically be redundant). In release mode, it generates + // SIMDJSON_ASSUME statements to allow the compiler to make assumptions. + iter.assert_at_root(); + switch (*iter.peek()) { + case '[': { + // The following lines check that the document ends with ]. + auto value_iterator = get_root_value_iterator(); + auto error = value_iterator.check_root_array(); + if(error) { return error; } + return value(get_root_value_iterator()); + } + case '{': { + // The following lines would check that the document ends with }. + auto value_iterator = get_root_value_iterator(); + auto error = value_iterator.check_root_object(); + if(error) { return error; } + return value(get_root_value_iterator()); + } + default: + // Unfortunately, scalar documents are a special case in simdjson and they cannot + // be safely converted to value instances. + return SCALAR_DOCUMENT_AS_VALUE; + } +} +simdjson_inline simdjson_result<array> document::get_array() & noexcept { + auto value = get_root_value_iterator(); + return array::start_root(value); +} +simdjson_inline simdjson_result<object> document::get_object() & noexcept { + auto value = get_root_value_iterator(); + return object::start_root(value); +} + +/** + * We decided that calling 'get_double()' on the JSON document '1.233 blabla' should + * give an error, so we check for trailing content. We want to disallow trailing + * content. + * Thus, in several implementations below, we pass a 'true' parameter value to + * a get_root_value_iterator() method: this indicates that we disallow trailing content. + */ + +simdjson_inline simdjson_result<uint64_t> document::get_uint64() noexcept { + return get_root_value_iterator().get_root_uint64(true); +} +simdjson_inline simdjson_result<uint64_t> document::get_uint64_in_string() noexcept { + return get_root_value_iterator().get_root_uint64_in_string(true); +} +simdjson_inline simdjson_result<int64_t> document::get_int64() noexcept { + return get_root_value_iterator().get_root_int64(true); +} +simdjson_inline simdjson_result<int64_t> document::get_int64_in_string() noexcept { + return get_root_value_iterator().get_root_int64_in_string(true); +} +simdjson_inline simdjson_result<double> document::get_double() noexcept { + return get_root_value_iterator().get_root_double(true); +} +simdjson_inline simdjson_result<double> document::get_double_in_string() noexcept { + return get_root_value_iterator().get_root_double_in_string(true); +} +simdjson_inline simdjson_result<std::string_view> document::get_string(bool allow_replacement) noexcept { + return get_root_value_iterator().get_root_string(true, allow_replacement); +} +template <typename string_type> +simdjson_warn_unused simdjson_inline error_code document::get_string(string_type& receiver, bool allow_replacement) noexcept { + return get_root_value_iterator().get_root_string(receiver, true, allow_replacement); +} +simdjson_inline simdjson_result<std::string_view> document::get_wobbly_string() noexcept { + return get_root_value_iterator().get_root_wobbly_string(true); +} +simdjson_inline simdjson_result<raw_json_string> document::get_raw_json_string() noexcept { + return get_root_value_iterator().get_root_raw_json_string(true); +} +simdjson_inline simdjson_result<bool> document::get_bool() noexcept { + return get_root_value_iterator().get_root_bool(true); +} +simdjson_inline simdjson_result<bool> document::is_null() noexcept { + return get_root_value_iterator().is_root_null(true); +} + +template<> simdjson_inline simdjson_result<array> document::get() & noexcept { return get_array(); } +template<> simdjson_inline simdjson_result<object> document::get() & noexcept { return get_object(); } +template<> simdjson_inline simdjson_result<raw_json_string> document::get() & noexcept { return get_raw_json_string(); } +template<> simdjson_inline simdjson_result<std::string_view> document::get() & noexcept { return get_string(false); } +template<> simdjson_inline simdjson_result<double> document::get() & noexcept { return get_double(); } +template<> simdjson_inline simdjson_result<uint64_t> document::get() & noexcept { return get_uint64(); } +template<> simdjson_inline simdjson_result<int64_t> document::get() & noexcept { return get_int64(); } +template<> simdjson_inline simdjson_result<bool> document::get() & noexcept { return get_bool(); } +template<> simdjson_inline simdjson_result<value> document::get() & noexcept { return get_value(); } + +template<> simdjson_warn_unused simdjson_inline error_code document::get(array& out) & noexcept { return get_array().get(out); } +template<> simdjson_warn_unused simdjson_inline error_code document::get(object& out) & noexcept { return get_object().get(out); } +template<> simdjson_warn_unused simdjson_inline error_code document::get(raw_json_string& out) & noexcept { return get_raw_json_string().get(out); } +template<> simdjson_warn_unused simdjson_inline error_code document::get(std::string_view& out) & noexcept { return get_string(false).get(out); } +template<> simdjson_warn_unused simdjson_inline error_code document::get(double& out) & noexcept { return get_double().get(out); } +template<> simdjson_warn_unused simdjson_inline error_code document::get(uint64_t& out) & noexcept { return get_uint64().get(out); } +template<> simdjson_warn_unused simdjson_inline error_code document::get(int64_t& out) & noexcept { return get_int64().get(out); } +template<> simdjson_warn_unused simdjson_inline error_code document::get(bool& out) & noexcept { return get_bool().get(out); } +template<> simdjson_warn_unused simdjson_inline error_code document::get(value& out) & noexcept { return get_value().get(out); } + +template<> simdjson_deprecated simdjson_inline simdjson_result<raw_json_string> document::get() && noexcept { return get_raw_json_string(); } +template<> simdjson_deprecated simdjson_inline simdjson_result<std::string_view> document::get() && noexcept { return get_string(false); } +template<> simdjson_deprecated simdjson_inline simdjson_result<double> document::get() && noexcept { return std::forward<document>(*this).get_double(); } +template<> simdjson_deprecated simdjson_inline simdjson_result<uint64_t> document::get() && noexcept { return std::forward<document>(*this).get_uint64(); } +template<> simdjson_deprecated simdjson_inline simdjson_result<int64_t> document::get() && noexcept { return std::forward<document>(*this).get_int64(); } +template<> simdjson_deprecated simdjson_inline simdjson_result<bool> document::get() && noexcept { return std::forward<document>(*this).get_bool(); } +template<> simdjson_deprecated simdjson_inline simdjson_result<value> document::get() && noexcept { return get_value(); } + +#if SIMDJSON_EXCEPTIONS +template <class T> +simdjson_deprecated simdjson_inline document::operator T() && noexcept(false) { return get<T>(); } +template <class T> +simdjson_inline document::operator T() & noexcept(false) { return get<T>(); } +simdjson_inline document::operator array() & noexcept(false) { return get_array(); } +simdjson_inline document::operator object() & noexcept(false) { return get_object(); } +simdjson_inline document::operator uint64_t() noexcept(false) { return get_uint64(); } +simdjson_inline document::operator int64_t() noexcept(false) { return get_int64(); } +simdjson_inline document::operator double() noexcept(false) { return get_double(); } +simdjson_inline document::operator std::string_view() noexcept(false) simdjson_lifetime_bound { return get_string(false); } +simdjson_inline document::operator raw_json_string() noexcept(false) simdjson_lifetime_bound { return get_raw_json_string(); } +simdjson_inline document::operator bool() noexcept(false) { return get_bool(); } +simdjson_inline document::operator value() noexcept(false) { return get_value(); } + +#endif +simdjson_inline simdjson_result<size_t> document::count_elements() & noexcept { + auto a = get_array(); + simdjson_result<size_t> answer = a.count_elements(); + /* If there was an array, we are now left pointing at its first element. */ + if(answer.error() == SUCCESS) { rewind(); } + return answer; +} +simdjson_inline simdjson_result<size_t> document::count_fields() & noexcept { + auto a = get_object(); + simdjson_result<size_t> answer = a.count_fields(); + /* If there was an object, we are now left pointing at its first element. */ + if(answer.error() == SUCCESS) { rewind(); } + return answer; +} +simdjson_inline simdjson_result<value> document::at(size_t index) & noexcept { + auto a = get_array(); + return a.at(index); +} +simdjson_inline simdjson_result<array_iterator> document::begin() & noexcept { + return get_array().begin(); +} +simdjson_inline simdjson_result<array_iterator> document::end() & noexcept { + return {}; +} + +simdjson_inline simdjson_result<value> document::find_field(std::string_view key) & noexcept { + return start_or_resume_object().find_field(key); +} +simdjson_inline simdjson_result<value> document::find_field(const char *key) & noexcept { + return start_or_resume_object().find_field(key); +} +simdjson_inline simdjson_result<value> document::find_field_unordered(std::string_view key) & noexcept { + return start_or_resume_object().find_field_unordered(key); +} +simdjson_inline simdjson_result<value> document::find_field_unordered(const char *key) & noexcept { + return start_or_resume_object().find_field_unordered(key); +} +simdjson_inline simdjson_result<value> document::operator[](std::string_view key) & noexcept { + return start_or_resume_object()[key]; +} +simdjson_inline simdjson_result<value> document::operator[](const char *key) & noexcept { + return start_or_resume_object()[key]; +} + +simdjson_warn_unused simdjson_inline error_code document::consume() noexcept { + bool scalar = false; + auto error = is_scalar().get(scalar); + if(error) { return error; } + if(scalar) { + iter.return_current_and_advance(); + return SUCCESS; + } + error = iter.skip_child(0); + if(error) { iter.abandon(); } + return error; +} + +simdjson_inline simdjson_result<std::string_view> document::raw_json() noexcept { + auto _iter = get_root_value_iterator(); + const uint8_t * starting_point{_iter.peek_start()}; + auto error = consume(); + if(error) { return error; } + // After 'consume()', we could be left pointing just beyond the document, but that + // is ok because we are not going to dereference the final pointer position, we just + // use it to compute the length in bytes. + const uint8_t * final_point{iter.unsafe_pointer()}; + return std::string_view(reinterpret_cast<const char*>(starting_point), size_t(final_point - starting_point)); +} + +simdjson_inline simdjson_result<json_type> document::type() noexcept { + return get_root_value_iterator().type(); +} + +simdjson_inline simdjson_result<bool> document::is_scalar() noexcept { + // For more speed, we could do: + // return iter.is_single_token(); + json_type this_type; + auto error = type().get(this_type); + if(error) { return error; } + return ! ((this_type == json_type::array) || (this_type == json_type::object)); +} + +simdjson_inline simdjson_result<bool> document::is_string() noexcept { + json_type this_type; + auto error = type().get(this_type); + if(error) { return error; } + return (this_type == json_type::string); +} + +simdjson_inline bool document::is_negative() noexcept { + return get_root_value_iterator().is_root_negative(); +} + +simdjson_inline simdjson_result<bool> document::is_integer() noexcept { + return get_root_value_iterator().is_root_integer(true); +} + +simdjson_inline simdjson_result<number_type> document::get_number_type() noexcept { + return get_root_value_iterator().get_root_number_type(true); +} + +simdjson_inline simdjson_result<number> document::get_number() noexcept { + return get_root_value_iterator().get_root_number(true); +} + + +simdjson_inline simdjson_result<std::string_view> document::raw_json_token() noexcept { + auto _iter = get_root_value_iterator(); + return std::string_view(reinterpret_cast<const char*>(_iter.peek_start()), _iter.peek_root_length()); +} + +simdjson_inline simdjson_result<value> document::at_pointer(std::string_view json_pointer) noexcept { + rewind(); // Rewind the document each time at_pointer is called + if (json_pointer.empty()) { + return this->get_value(); + } + json_type t; + SIMDJSON_TRY(type().get(t)); + switch (t) + { + case json_type::array: + return (*this).get_array().at_pointer(json_pointer); + case json_type::object: + return (*this).get_object().at_pointer(json_pointer); + default: + return INVALID_JSON_POINTER; + } +} + +simdjson_inline simdjson_result<value> document::at_path(std::string_view json_path) noexcept { + rewind(); // Rewind the document each time at_pointer is called + if (json_path.empty()) { + return this->get_value(); + } + json_type t; + SIMDJSON_TRY(type().get(t)); + switch (t) { + case json_type::array: + return (*this).get_array().at_path(json_path); + case json_type::object: + return (*this).get_object().at_path(json_path); + default: + return INVALID_JSON_POINTER; + } +} + +simdjson_inline simdjson_result<std::vector<value>> document::at_path_with_wildcard(std::string_view json_path) noexcept { + rewind(); // Rewind the document each time at_path_with_wildcard is called + if (json_path.empty()) { + return INVALID_JSON_POINTER; + } + json_type t; + SIMDJSON_TRY(type().get(t)); + switch (t) { + case json_type::array: + return (*this).get_array().at_path_with_wildcard(json_path); + case json_type::object: + return (*this).get_object().at_path_with_wildcard(json_path); + default: + return INVALID_JSON_POINTER; + } +} + +#if SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION + +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_inline error_code document::extract_into(T& out) & noexcept { + // Helper to check if a field name matches any of the requested fields + auto should_extract = [](std::string_view field_name) constexpr -> bool { + return ((FieldNames.view() == field_name) || ...); + }; + + // Iterate through all members of T using reflection + template for (constexpr auto mem : std::define_static_array( + std::meta::nonstatic_data_members_of(^^T, std::meta::access_context::unchecked()))) { + + if constexpr (!std::meta::is_const(mem) && std::meta::is_public(mem)) { + constexpr std::string_view key = std::define_static_string(std::meta::identifier_of(mem)); + + // Only extract this field if it's in our list of requested fields + if constexpr (should_extract(key)) { + // Try to find and extract the field + if constexpr (concepts::optional_type<decltype(out.[:mem:])>) { + // For optional fields, it's ok if they're missing + auto field_result = find_field_unordered(key); + if (!field_result.error()) { + auto error = field_result.get(out.[:mem:]); + if (error && error != NO_SUCH_FIELD) { + return error; + } + } else if (field_result.error() != NO_SUCH_FIELD) { + return field_result.error(); + } else { + out.[:mem:].reset(); + } + } else { + // For required fields (in the requested list), fail if missing + SIMDJSON_TRY((*this)[key].get(out.[:mem:])); + } + } + } + }; + + return SUCCESS; +} + +#endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION + +} // namespace ondemand +} // namespace arm64 +} // namespace simdjson + +namespace simdjson { + +simdjson_inline simdjson_result<arm64::ondemand::document>::simdjson_result( + arm64::ondemand::document &&value +) noexcept : + implementation_simdjson_result_base<arm64::ondemand::document>( + std::forward<arm64::ondemand::document>(value) + ) +{ +} +simdjson_inline simdjson_result<arm64::ondemand::document>::simdjson_result( + error_code error +) noexcept : + implementation_simdjson_result_base<arm64::ondemand::document>( + error + ) +{ +} +simdjson_inline simdjson_result<size_t> simdjson_result<arm64::ondemand::document>::count_elements() & noexcept { + if (error()) { return error(); } + return first.count_elements(); +} +simdjson_inline simdjson_result<size_t> simdjson_result<arm64::ondemand::document>::count_fields() & noexcept { + if (error()) { return error(); } + return first.count_fields(); +} +simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::document>::at(size_t index) & noexcept { + if (error()) { return error(); } + return first.at(index); +} +simdjson_inline error_code simdjson_result<arm64::ondemand::document>::rewind() noexcept { + if (error()) { return error(); } + first.rewind(); + return SUCCESS; +} +simdjson_inline simdjson_result<arm64::ondemand::array_iterator> simdjson_result<arm64::ondemand::document>::begin() & noexcept { + if (error()) { return error(); } + return first.begin(); +} +simdjson_inline simdjson_result<arm64::ondemand::array_iterator> simdjson_result<arm64::ondemand::document>::end() & noexcept { + return {}; +} +simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::document>::find_field_unordered(std::string_view key) & noexcept { + if (error()) { return error(); } + return first.find_field_unordered(key); +} +simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::document>::find_field_unordered(const char *key) & noexcept { + if (error()) { return error(); } + return first.find_field_unordered(key); +} +simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::document>::operator[](std::string_view key) & noexcept { + if (error()) { return error(); } + return first[key]; +} +simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::document>::operator[](const char *key) & noexcept { + if (error()) { return error(); } + return first[key]; +} +simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::document>::find_field(std::string_view key) & noexcept { + if (error()) { return error(); } + return first.find_field(key); +} +simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::document>::find_field(const char *key) & noexcept { + if (error()) { return error(); } + return first.find_field(key); +} +simdjson_inline simdjson_result<arm64::ondemand::array> simdjson_result<arm64::ondemand::document>::get_array() & noexcept { + if (error()) { return error(); } + return first.get_array(); +} +simdjson_inline simdjson_result<arm64::ondemand::object> simdjson_result<arm64::ondemand::document>::get_object() & noexcept { + if (error()) { return error(); } + return first.get_object(); +} +simdjson_inline simdjson_result<uint64_t> simdjson_result<arm64::ondemand::document>::get_uint64() noexcept { + if (error()) { return error(); } + return first.get_uint64(); +} +simdjson_inline simdjson_result<uint64_t> simdjson_result<arm64::ondemand::document>::get_uint64_in_string() noexcept { + if (error()) { return error(); } + return first.get_uint64_in_string(); +} +simdjson_inline simdjson_result<int64_t> simdjson_result<arm64::ondemand::document>::get_int64() noexcept { + if (error()) { return error(); } + return first.get_int64(); +} +simdjson_inline simdjson_result<int64_t> simdjson_result<arm64::ondemand::document>::get_int64_in_string() noexcept { + if (error()) { return error(); } + return first.get_int64_in_string(); +} +simdjson_inline simdjson_result<double> simdjson_result<arm64::ondemand::document>::get_double() noexcept { + if (error()) { return error(); } + return first.get_double(); +} +simdjson_inline simdjson_result<double> simdjson_result<arm64::ondemand::document>::get_double_in_string() noexcept { + if (error()) { return error(); } + return first.get_double_in_string(); +} +simdjson_inline simdjson_result<std::string_view> simdjson_result<arm64::ondemand::document>::get_string(bool allow_replacement) noexcept { + if (error()) { return error(); } + return first.get_string(allow_replacement); +} +template <typename string_type> +simdjson_warn_unused simdjson_inline error_code simdjson_result<arm64::ondemand::document>::get_string(string_type& receiver, bool allow_replacement) noexcept { + if (error()) { return error(); } + return first.get_string(receiver, allow_replacement); +} +simdjson_inline simdjson_result<std::string_view> simdjson_result<arm64::ondemand::document>::get_wobbly_string() noexcept { + if (error()) { return error(); } + return first.get_wobbly_string(); +} +simdjson_inline simdjson_result<arm64::ondemand::raw_json_string> simdjson_result<arm64::ondemand::document>::get_raw_json_string() noexcept { + if (error()) { return error(); } + return first.get_raw_json_string(); +} +simdjson_inline simdjson_result<bool> simdjson_result<arm64::ondemand::document>::get_bool() noexcept { + if (error()) { return error(); } + return first.get_bool(); +} +simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::document>::get_value() noexcept { + if (error()) { return error(); } + return first.get_value(); +} +simdjson_inline simdjson_result<bool> simdjson_result<arm64::ondemand::document>::is_null() noexcept { + if (error()) { return error(); } + return first.is_null(); +} + +template<typename T> +simdjson_inline simdjson_result<T> simdjson_result<arm64::ondemand::document>::get() & noexcept { + if (error()) { return error(); } + return first.get<T>(); +} +template<typename T> +simdjson_deprecated simdjson_inline simdjson_result<T> simdjson_result<arm64::ondemand::document>::get() && noexcept { + if (error()) { return error(); } + return std::forward<arm64::ondemand::document>(first).get<T>(); +} +template<typename T> +simdjson_warn_unused simdjson_inline error_code simdjson_result<arm64::ondemand::document>::get(T &out) & noexcept { + if (error()) { return error(); } + return first.get<T>(out); +} +template<typename T> +simdjson_warn_unused simdjson_inline error_code simdjson_result<arm64::ondemand::document>::get(T &out) && noexcept { + if (error()) { return error(); } + return std::forward<arm64::ondemand::document>(first).get<T>(out); +} + +template<> simdjson_inline simdjson_result<arm64::ondemand::document> simdjson_result<arm64::ondemand::document>::get<arm64::ondemand::document>() & noexcept = delete; +template<> simdjson_deprecated simdjson_inline simdjson_result<arm64::ondemand::document> simdjson_result<arm64::ondemand::document>::get<arm64::ondemand::document>() && noexcept { + if (error()) { return error(); } + return std::forward<arm64::ondemand::document>(first); +} +template<> simdjson_warn_unused simdjson_inline error_code simdjson_result<arm64::ondemand::document>::get<arm64::ondemand::document>(arm64::ondemand::document &out) & noexcept = delete; +template<> simdjson_warn_unused simdjson_inline error_code simdjson_result<arm64::ondemand::document>::get<arm64::ondemand::document>(arm64::ondemand::document &out) && noexcept { + if (error()) { return error(); } + out = std::forward<arm64::ondemand::document>(first); + return SUCCESS; +} + +simdjson_inline simdjson_result<arm64::ondemand::json_type> simdjson_result<arm64::ondemand::document>::type() noexcept { + if (error()) { return error(); } + return first.type(); +} + +simdjson_inline simdjson_result<bool> simdjson_result<arm64::ondemand::document>::is_scalar() noexcept { + if (error()) { return error(); } + return first.is_scalar(); +} + +simdjson_inline simdjson_result<bool> simdjson_result<arm64::ondemand::document>::is_string() noexcept { + if (error()) { return error(); } + return first.is_string(); +} + +simdjson_inline bool simdjson_result<arm64::ondemand::document>::is_negative() noexcept { + if (error()) { return error(); } + return first.is_negative(); +} + +simdjson_inline simdjson_result<bool> simdjson_result<arm64::ondemand::document>::is_integer() noexcept { + if (error()) { return error(); } + return first.is_integer(); +} + +simdjson_inline simdjson_result<arm64::number_type> simdjson_result<arm64::ondemand::document>::get_number_type() noexcept { + if (error()) { return error(); } + return first.get_number_type(); +} + +simdjson_inline simdjson_result<arm64::ondemand::number> simdjson_result<arm64::ondemand::document>::get_number() noexcept { + if (error()) { return error(); } + return first.get_number(); +} + + +#if SIMDJSON_EXCEPTIONS +template <class T, typename std::enable_if<std::is_same<T, arm64::ondemand::document>::value == false>::type> +simdjson_inline simdjson_result<arm64::ondemand::document>::operator T() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result<arm64::ondemand::document>::operator arm64::ondemand::array() & noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result<arm64::ondemand::document>::operator arm64::ondemand::object() & noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result<arm64::ondemand::document>::operator uint64_t() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result<arm64::ondemand::document>::operator int64_t() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result<arm64::ondemand::document>::operator double() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result<arm64::ondemand::document>::operator std::string_view() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result<arm64::ondemand::document>::operator arm64::ondemand::raw_json_string() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result<arm64::ondemand::document>::operator bool() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result<arm64::ondemand::document>::operator arm64::ondemand::value() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +#endif + + +simdjson_inline simdjson_result<const char *> simdjson_result<arm64::ondemand::document>::current_location() noexcept { + if (error()) { return error(); } + return first.current_location(); +} + +simdjson_inline bool simdjson_result<arm64::ondemand::document>::at_end() const noexcept { + if (error()) { return error(); } + return first.at_end(); +} + + +simdjson_inline int32_t simdjson_result<arm64::ondemand::document>::current_depth() const noexcept { + if (error()) { return error(); } + return first.current_depth(); +} + +simdjson_inline simdjson_result<std::string_view> simdjson_result<arm64::ondemand::document>::raw_json_token() noexcept { + if (error()) { return error(); } + return first.raw_json_token(); +} + +simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::document>::at_pointer(std::string_view json_pointer) noexcept { + if (error()) { return error(); } + return first.at_pointer(json_pointer); +} + +simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::document>::at_path(std::string_view json_path) noexcept { + if (error()) { return error(); } + return first.at_path(json_path); +} + +simdjson_inline simdjson_result<std::vector<arm64::ondemand::value>> simdjson_result<arm64::ondemand::document>::at_path_with_wildcard(std::string_view json_path) noexcept { + if (error()) { return error(); } + return first.at_path_with_wildcard(json_path); +} + +#if SIMDJSON_STATIC_REFLECTION +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_inline error_code simdjson_result<arm64::ondemand::document>::extract_into(T& out) & noexcept { + if (error()) { return error(); } + return first.extract_into<FieldNames...>(out); +} +#endif // SIMDJSON_STATIC_REFLECTION + +} // namespace simdjson + + +namespace simdjson { +namespace arm64 { +namespace ondemand { + +simdjson_inline document_reference::document_reference() noexcept : doc{nullptr} {} +simdjson_inline document_reference::document_reference(document &d) noexcept : doc(&d) {} +simdjson_inline void document_reference::rewind() noexcept { doc->rewind(); } +simdjson_inline simdjson_result<array> document_reference::get_array() & noexcept { return doc->get_array(); } +simdjson_inline simdjson_result<object> document_reference::get_object() & noexcept { return doc->get_object(); } +/** + * The document_reference instances are used primarily/solely for streams of JSON + * documents. + * We decided that calling 'get_double()' on the JSON document '1.233 blabla' should + * give an error, so we check for trailing content. + * + * However, for streams of JSON documents, we want to be able to start from + * "321" "321" "321" + * and parse it successfully as a stream of JSON documents, calling get_uint64_in_string() + * successfully each time. + * + * To achieve this result, we pass a 'false' to a get_root_value_iterator() method: + * this indicates that we allow trailing content. + */ +simdjson_inline simdjson_result<uint64_t> document_reference::get_uint64() noexcept { return doc->get_root_value_iterator().get_root_uint64(false); } +simdjson_inline simdjson_result<uint64_t> document_reference::get_uint64_in_string() noexcept { return doc->get_root_value_iterator().get_root_uint64_in_string(false); } +simdjson_inline simdjson_result<int64_t> document_reference::get_int64() noexcept { return doc->get_root_value_iterator().get_root_int64(false); } +simdjson_inline simdjson_result<int64_t> document_reference::get_int64_in_string() noexcept { return doc->get_root_value_iterator().get_root_int64_in_string(false); } +simdjson_inline simdjson_result<double> document_reference::get_double() noexcept { return doc->get_root_value_iterator().get_root_double(false); } +simdjson_inline simdjson_result<double> document_reference::get_double_in_string() noexcept { return doc->get_root_value_iterator().get_root_double(false); } +simdjson_inline simdjson_result<std::string_view> document_reference::get_string(bool allow_replacement) noexcept { return doc->get_root_value_iterator().get_root_string(false, allow_replacement); } +template <typename string_type> +simdjson_warn_unused simdjson_inline error_code document_reference::get_string(string_type& receiver, bool allow_replacement) noexcept { return doc->get_root_value_iterator().get_root_string(receiver, false, allow_replacement); } +simdjson_inline simdjson_result<std::string_view> document_reference::get_wobbly_string() noexcept { return doc->get_root_value_iterator().get_root_wobbly_string(false); } +simdjson_inline simdjson_result<raw_json_string> document_reference::get_raw_json_string() noexcept { return doc->get_root_value_iterator().get_root_raw_json_string(false); } +simdjson_inline simdjson_result<bool> document_reference::get_bool() noexcept { return doc->get_root_value_iterator().get_root_bool(false); } +simdjson_inline simdjson_result<value> document_reference::get_value() noexcept { return doc->get_value(); } +simdjson_inline simdjson_result<bool> document_reference::is_null() noexcept { return doc->get_root_value_iterator().is_root_null(false); } +template<> simdjson_inline simdjson_result<array> document_reference::get() & noexcept { return get_array(); } +template<> simdjson_inline simdjson_result<object> document_reference::get() & noexcept { return get_object(); } +template<> simdjson_inline simdjson_result<raw_json_string> document_reference::get() & noexcept { return get_raw_json_string(); } +template<> simdjson_inline simdjson_result<std::string_view> document_reference::get() & noexcept { return get_string(false); } +template<> simdjson_inline simdjson_result<double> document_reference::get() & noexcept { return get_double(); } +template<> simdjson_inline simdjson_result<uint64_t> document_reference::get() & noexcept { return get_uint64(); } +template<> simdjson_inline simdjson_result<int64_t> document_reference::get() & noexcept { return get_int64(); } +template<> simdjson_inline simdjson_result<bool> document_reference::get() & noexcept { return get_bool(); } +template<> simdjson_inline simdjson_result<value> document_reference::get() & noexcept { return get_value(); } +#if SIMDJSON_EXCEPTIONS +template <class T> +simdjson_inline document_reference::operator T() noexcept(false) { return get<T>(); } +simdjson_inline document_reference::operator array() & noexcept(false) { return array(*doc); } +simdjson_inline document_reference::operator object() & noexcept(false) { return object(*doc); } +simdjson_inline document_reference::operator uint64_t() noexcept(false) { return get_uint64(); } +simdjson_inline document_reference::operator int64_t() noexcept(false) { return get_int64(); } +simdjson_inline document_reference::operator double() noexcept(false) { return get_double(); } +simdjson_inline document_reference::operator std::string_view() noexcept(false) { return std::string_view(*doc); } +simdjson_inline document_reference::operator raw_json_string() noexcept(false) { return get_raw_json_string(); } +simdjson_inline document_reference::operator bool() noexcept(false) { return get_bool(); } +simdjson_inline document_reference::operator value() noexcept(false) { return value(*doc); } +#endif +simdjson_inline simdjson_result<size_t> document_reference::count_elements() & noexcept { return doc->count_elements(); } +simdjson_inline simdjson_result<size_t> document_reference::count_fields() & noexcept { return doc->count_fields(); } +simdjson_inline simdjson_result<value> document_reference::at(size_t index) & noexcept { return doc->at(index); } +simdjson_inline simdjson_result<array_iterator> document_reference::begin() & noexcept { return doc->begin(); } +simdjson_inline simdjson_result<array_iterator> document_reference::end() & noexcept { return doc->end(); } +simdjson_inline simdjson_result<value> document_reference::find_field(std::string_view key) & noexcept { return doc->find_field(key); } +simdjson_inline simdjson_result<value> document_reference::find_field(const char *key) & noexcept { return doc->find_field(key); } +simdjson_inline simdjson_result<value> document_reference::operator[](std::string_view key) & noexcept { return (*doc)[key]; } +simdjson_inline simdjson_result<value> document_reference::operator[](const char *key) & noexcept { return (*doc)[key]; } +simdjson_inline simdjson_result<value> document_reference::find_field_unordered(std::string_view key) & noexcept { return doc->find_field_unordered(key); } +simdjson_inline simdjson_result<value> document_reference::find_field_unordered(const char *key) & noexcept { return doc->find_field_unordered(key); } +simdjson_inline simdjson_result<json_type> document_reference::type() noexcept { return doc->type(); } +simdjson_inline simdjson_result<bool> document_reference::is_scalar() noexcept { return doc->is_scalar(); } +simdjson_inline simdjson_result<bool> document_reference::is_string() noexcept { return doc->is_string(); } +simdjson_inline simdjson_result<const char *> document_reference::current_location() noexcept { return doc->current_location(); } +simdjson_inline int32_t document_reference::current_depth() const noexcept { return doc->current_depth(); } +simdjson_inline bool document_reference::is_negative() noexcept { return doc->is_negative(); } +simdjson_inline simdjson_result<bool> document_reference::is_integer() noexcept { return doc->get_root_value_iterator().is_root_integer(false); } +simdjson_inline simdjson_result<number_type> document_reference::get_number_type() noexcept { return doc->get_root_value_iterator().get_root_number_type(false); } +simdjson_inline simdjson_result<number> document_reference::get_number() noexcept { return doc->get_root_value_iterator().get_root_number(false); } +simdjson_inline simdjson_result<std::string_view> document_reference::raw_json_token() noexcept { return doc->raw_json_token(); } +simdjson_inline simdjson_result<value> document_reference::at_pointer(std::string_view json_pointer) noexcept { return doc->at_pointer(json_pointer); } +simdjson_inline simdjson_result<value> document_reference::at_path(std::string_view json_path) noexcept { return doc->at_path(json_path); } +simdjson_inline simdjson_result<std::vector<value>> document_reference::at_path_with_wildcard(std::string_view json_path) noexcept { return doc->at_path_with_wildcard(json_path); } +simdjson_inline simdjson_result<std::string_view> document_reference::raw_json() noexcept { return doc->raw_json();} +simdjson_inline document_reference::operator document&() const noexcept { return *doc; } +#if SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_inline error_code document_reference::extract_into(T& out) & noexcept { + return doc->extract_into<FieldNames...>(out); +} +#endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION +} // namespace ondemand +} // namespace arm64 +} // namespace simdjson + + + +namespace simdjson { +simdjson_inline simdjson_result<arm64::ondemand::document_reference>::simdjson_result(arm64::ondemand::document_reference value, error_code error) + noexcept : implementation_simdjson_result_base<arm64::ondemand::document_reference>(std::forward<arm64::ondemand::document_reference>(value), error) {} + + +simdjson_inline simdjson_result<size_t> simdjson_result<arm64::ondemand::document_reference>::count_elements() & noexcept { + if (error()) { return error(); } + return first.count_elements(); +} +simdjson_inline simdjson_result<size_t> simdjson_result<arm64::ondemand::document_reference>::count_fields() & noexcept { + if (error()) { return error(); } + return first.count_fields(); +} +simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::document_reference>::at(size_t index) & noexcept { + if (error()) { return error(); } + return first.at(index); +} +simdjson_inline error_code simdjson_result<arm64::ondemand::document_reference>::rewind() noexcept { + if (error()) { return error(); } + first.rewind(); + return SUCCESS; +} +simdjson_inline simdjson_result<arm64::ondemand::array_iterator> simdjson_result<arm64::ondemand::document_reference>::begin() & noexcept { + if (error()) { return error(); } + return first.begin(); +} +simdjson_inline simdjson_result<arm64::ondemand::array_iterator> simdjson_result<arm64::ondemand::document_reference>::end() & noexcept { + return {}; +} +simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::document_reference>::find_field_unordered(std::string_view key) & noexcept { + if (error()) { return error(); } + return first.find_field_unordered(key); +} +simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::document_reference>::find_field_unordered(const char *key) & noexcept { + if (error()) { return error(); } + return first.find_field_unordered(key); +} +simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::document_reference>::operator[](std::string_view key) & noexcept { + if (error()) { return error(); } + return first[key]; +} +simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::document_reference>::operator[](const char *key) & noexcept { + if (error()) { return error(); } + return first[key]; +} +simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::document_reference>::find_field(std::string_view key) & noexcept { + if (error()) { return error(); } + return first.find_field(key); +} +simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::document_reference>::find_field(const char *key) & noexcept { + if (error()) { return error(); } + return first.find_field(key); +} +simdjson_inline simdjson_result<arm64::ondemand::array> simdjson_result<arm64::ondemand::document_reference>::get_array() & noexcept { + if (error()) { return error(); } + return first.get_array(); +} +simdjson_inline simdjson_result<arm64::ondemand::object> simdjson_result<arm64::ondemand::document_reference>::get_object() & noexcept { + if (error()) { return error(); } + return first.get_object(); +} +simdjson_inline simdjson_result<uint64_t> simdjson_result<arm64::ondemand::document_reference>::get_uint64() noexcept { + if (error()) { return error(); } + return first.get_uint64(); +} +simdjson_inline simdjson_result<uint64_t> simdjson_result<arm64::ondemand::document_reference>::get_uint64_in_string() noexcept { + if (error()) { return error(); } + return first.get_uint64_in_string(); +} +simdjson_inline simdjson_result<int64_t> simdjson_result<arm64::ondemand::document_reference>::get_int64() noexcept { + if (error()) { return error(); } + return first.get_int64(); +} +simdjson_inline simdjson_result<int64_t> simdjson_result<arm64::ondemand::document_reference>::get_int64_in_string() noexcept { + if (error()) { return error(); } + return first.get_int64_in_string(); +} +simdjson_inline simdjson_result<double> simdjson_result<arm64::ondemand::document_reference>::get_double() noexcept { + if (error()) { return error(); } + return first.get_double(); +} +simdjson_inline simdjson_result<double> simdjson_result<arm64::ondemand::document_reference>::get_double_in_string() noexcept { + if (error()) { return error(); } + return first.get_double_in_string(); +} +simdjson_inline simdjson_result<std::string_view> simdjson_result<arm64::ondemand::document_reference>::get_string(bool allow_replacement) noexcept { + if (error()) { return error(); } + return first.get_string(allow_replacement); +} +template <typename string_type> +simdjson_warn_unused simdjson_inline error_code simdjson_result<arm64::ondemand::document_reference>::get_string(string_type& receiver, bool allow_replacement) noexcept { + if (error()) { return error(); } + return first.get_string(receiver, allow_replacement); +} +simdjson_inline simdjson_result<std::string_view> simdjson_result<arm64::ondemand::document_reference>::get_wobbly_string() noexcept { + if (error()) { return error(); } + return first.get_wobbly_string(); +} +simdjson_inline simdjson_result<arm64::ondemand::raw_json_string> simdjson_result<arm64::ondemand::document_reference>::get_raw_json_string() noexcept { + if (error()) { return error(); } + return first.get_raw_json_string(); +} +simdjson_inline simdjson_result<bool> simdjson_result<arm64::ondemand::document_reference>::get_bool() noexcept { + if (error()) { return error(); } + return first.get_bool(); +} +simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::document_reference>::get_value() noexcept { + if (error()) { return error(); } + return first.get_value(); +} +simdjson_inline simdjson_result<bool> simdjson_result<arm64::ondemand::document_reference>::is_null() noexcept { + if (error()) { return error(); } + return first.is_null(); +} +template<typename T> +simdjson_inline simdjson_result<T> simdjson_result<arm64::ondemand::document_reference>::get() & noexcept { + if (error()) { return error(); } + return first.get<T>(); +} +template<typename T> +simdjson_inline simdjson_result<T> simdjson_result<arm64::ondemand::document_reference>::get() && noexcept { + if (error()) { return error(); } + return std::forward<arm64::ondemand::document_reference>(first).get<T>(); +} +template <class T> +simdjson_warn_unused simdjson_inline error_code simdjson_result<arm64::ondemand::document_reference>::get(T &out) & noexcept { + if (error()) { return error(); } + return first.get<T>(out); +} +template <class T> +simdjson_warn_unused simdjson_inline error_code simdjson_result<arm64::ondemand::document_reference>::get(T &out) && noexcept { + if (error()) { return error(); } + return std::forward<arm64::ondemand::document_reference>(first).get<T>(out); +} +simdjson_inline simdjson_result<arm64::ondemand::json_type> simdjson_result<arm64::ondemand::document_reference>::type() noexcept { + if (error()) { return error(); } + return first.type(); +} +simdjson_inline simdjson_result<bool> simdjson_result<arm64::ondemand::document_reference>::is_scalar() noexcept { + if (error()) { return error(); } + return first.is_scalar(); +} +simdjson_inline simdjson_result<bool> simdjson_result<arm64::ondemand::document_reference>::is_string() noexcept { + if (error()) { return error(); } + return first.is_string(); +} +template <> +simdjson_warn_unused simdjson_inline error_code simdjson_result<arm64::ondemand::document_reference>::get(arm64::ondemand::document_reference &out) & noexcept { + if (error()) { return error(); } + out = first; + return SUCCESS; +} +template <> +simdjson_warn_unused simdjson_inline error_code simdjson_result<arm64::ondemand::document_reference>::get(arm64::ondemand::document_reference &out) && noexcept { + if (error()) { return error(); } + out = first; + return SUCCESS; +} +simdjson_inline simdjson_result<bool> simdjson_result<arm64::ondemand::document_reference>::is_negative() noexcept { + if (error()) { return error(); } + return first.is_negative(); +} +simdjson_inline simdjson_result<bool> simdjson_result<arm64::ondemand::document_reference>::is_integer() noexcept { + if (error()) { return error(); } + return first.is_integer(); +} +simdjson_inline simdjson_result<arm64::number_type> simdjson_result<arm64::ondemand::document_reference>::get_number_type() noexcept { + if (error()) { return error(); } + return first.get_number_type(); +} +simdjson_inline simdjson_result<arm64::ondemand::number> simdjson_result<arm64::ondemand::document_reference>::get_number() noexcept { + if (error()) { return error(); } + return first.get_number(); +} +#if SIMDJSON_EXCEPTIONS +template <class T> +simdjson_inline simdjson_result<arm64::ondemand::document_reference>::operator T() noexcept(false) { + static_assert(std::is_same<T, arm64::ondemand::document_reference>::value == false, "You should not call get<T> when T is a document"); + static_assert(std::is_same<T, arm64::ondemand::document>::value == false, "You should not call get<T> when T is a document"); + if (error()) { throw simdjson_error(error()); } + return first.get<T>(); +} +simdjson_inline simdjson_result<arm64::ondemand::document_reference>::operator arm64::ondemand::array() & noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result<arm64::ondemand::document_reference>::operator arm64::ondemand::object() & noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result<arm64::ondemand::document_reference>::operator uint64_t() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result<arm64::ondemand::document_reference>::operator int64_t() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result<arm64::ondemand::document_reference>::operator double() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result<arm64::ondemand::document_reference>::operator std::string_view() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result<arm64::ondemand::document_reference>::operator arm64::ondemand::raw_json_string() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result<arm64::ondemand::document_reference>::operator bool() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result<arm64::ondemand::document_reference>::operator arm64::ondemand::value() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +#endif + +simdjson_inline simdjson_result<const char *> simdjson_result<arm64::ondemand::document_reference>::current_location() noexcept { + if (error()) { return error(); } + return first.current_location(); +} + +simdjson_inline simdjson_result<std::string_view> simdjson_result<arm64::ondemand::document_reference>::raw_json_token() noexcept { + if (error()) { return error(); } + return first.raw_json_token(); +} + +simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::document_reference>::at_pointer(std::string_view json_pointer) noexcept { + if (error()) { return error(); } + return first.at_pointer(json_pointer); +} + +simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::document_reference>::at_path(std::string_view json_path) noexcept { + if (error()) { + return error(); + } + return first.at_path(json_path); +} +simdjson_inline simdjson_result<std::vector<arm64::ondemand::value>> simdjson_result<arm64::ondemand::document_reference>::at_path_with_wildcard(std::string_view json_path) noexcept { + if (error()) { + return error(); + } + return first.at_path_with_wildcard(json_path); +} +#if SIMDJSON_STATIC_REFLECTION +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_inline error_code simdjson_result<arm64::ondemand::document_reference>::extract_into(T& out) & noexcept { + if (error()) { return error(); } + return first.extract_into<FieldNames...>(out); +} +#endif // SIMDJSON_STATIC_REFLECTION +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H +/* end file simdjson/generic/ondemand/document-inl.h for arm64 */ +/* including simdjson/generic/ondemand/document_stream-inl.h for arm64: #include "simdjson/generic/ondemand/document_stream-inl.h" */ +/* begin file simdjson/generic/ondemand/document_stream-inl.h for arm64 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_INL_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_INL_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document_stream.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document-inl.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#include <algorithm> +#include <stdexcept> + +namespace simdjson { +namespace arm64 { +namespace ondemand { + +#ifdef SIMDJSON_THREADS_ENABLED + +inline void stage1_worker::finish() { + // After calling "run" someone would call finish() to wait + // for the end of the processing. + // This function will wait until either the thread has done + // the processing or, else, the destructor has been called. + std::unique_lock<std::mutex> lock(locking_mutex); + cond_var.wait(lock, [this]{return has_work == false;}); +} + +inline stage1_worker::~stage1_worker() { + // The thread may never outlive the stage1_worker instance + // and will always be stopped/joined before the stage1_worker + // instance is gone. + stop_thread(); +} + +inline void stage1_worker::start_thread() { + std::unique_lock<std::mutex> lock(locking_mutex); + if(thread.joinable()) { + return; // This should never happen but we never want to create more than one thread. + } + thread = std::thread([this]{ + while(true) { + std::unique_lock<std::mutex> thread_lock(locking_mutex); + // We wait for either "run" or "stop_thread" to be called. + cond_var.wait(thread_lock, [this]{return has_work || !can_work;}); + // If, for some reason, the stop_thread() method was called (i.e., the + // destructor of stage1_worker is called, then we want to immediately destroy + // the thread (and not do any more processing). + if(!can_work) { + break; + } + this->owner->stage1_thread_error = this->owner->run_stage1(*this->stage1_thread_parser, + this->_next_batch_start); + this->has_work = false; + // The condition variable call should be moved after thread_lock.unlock() for performance + // reasons but thread sanitizers may report it as a data race if we do. + // See https://stackoverflow.com/questions/35775501/c-should-condition-variable-be-notified-under-lock + cond_var.notify_one(); // will notify "finish" + thread_lock.unlock(); + } + } + ); +} + + +inline void stage1_worker::stop_thread() { + std::unique_lock<std::mutex> lock(locking_mutex); + // We have to make sure that all locks can be released. + can_work = false; + has_work = false; + cond_var.notify_all(); + lock.unlock(); + if(thread.joinable()) { + thread.join(); + } +} + +inline void stage1_worker::run(document_stream * ds, parser * stage1, size_t next_batch_start) { + std::unique_lock<std::mutex> lock(locking_mutex); + owner = ds; + _next_batch_start = next_batch_start; + stage1_thread_parser = stage1; + has_work = true; + // The condition variable call should be moved after thread_lock.unlock() for performance + // reasons but thread sanitizers may report it as a data race if we do. + // See https://stackoverflow.com/questions/35775501/c-should-condition-variable-be-notified-under-lock + cond_var.notify_one(); // will notify the thread lock that we have work + lock.unlock(); +} + +#endif // SIMDJSON_THREADS_ENABLED + +simdjson_inline document_stream::document_stream( + ondemand::parser &_parser, + const uint8_t *_buf, + size_t _len, + size_t _batch_size, + bool _allow_comma_separated +) noexcept + : parser{&_parser}, + buf{_buf}, + len{_len}, + batch_size{_batch_size <= MINIMAL_BATCH_SIZE ? MINIMAL_BATCH_SIZE : _batch_size}, + allow_comma_separated{_allow_comma_separated}, + error{SUCCESS} + #ifdef SIMDJSON_THREADS_ENABLED + , use_thread(_parser.threaded) // we need to make a copy because _parser.threaded can change + #endif +{ +#ifdef SIMDJSON_THREADS_ENABLED + if(worker.get() == nullptr) { + error = MEMALLOC; + } +#endif +} + +simdjson_inline document_stream::document_stream() noexcept + : parser{nullptr}, + buf{nullptr}, + len{0}, + batch_size{0}, + allow_comma_separated{false}, + error{UNINITIALIZED} + #ifdef SIMDJSON_THREADS_ENABLED + , use_thread(false) + #endif +{ +} + +simdjson_inline document_stream::~document_stream() noexcept +{ + #ifdef SIMDJSON_THREADS_ENABLED + worker.reset(); + #endif +} + +inline size_t document_stream::size_in_bytes() const noexcept { + return len; +} + +inline size_t document_stream::truncated_bytes() const noexcept { + if(error == CAPACITY) { return len - batch_start; } + return parser->implementation->structural_indexes[parser->implementation->n_structural_indexes] - parser->implementation->structural_indexes[parser->implementation->n_structural_indexes + 1]; +} + +simdjson_inline document_stream::iterator::iterator() noexcept + : stream{nullptr}, finished{true} { +} + +simdjson_inline document_stream::iterator::iterator(document_stream* _stream, bool is_end) noexcept + : stream{_stream}, finished{is_end} { +} + +simdjson_inline simdjson_result<ondemand::document_reference> document_stream::iterator::operator*() noexcept { + return simdjson_result<ondemand::document_reference>(stream->doc, stream->error); +} + +simdjson_inline document_stream::iterator& document_stream::iterator::operator++() noexcept { + // If there is an error, then we want the iterator + // to be finished, no matter what. (E.g., we do not + // keep generating documents with errors, or go beyond + // a document with errors.) + // + // Users do not have to call "operator*()" when they use operator++, + // so we need to end the stream in the operator++ function. + // + // Note that setting finished = true is essential otherwise + // we would enter an infinite loop. + if (stream->error) { finished = true; } + // Note that stream->error() is guarded against error conditions + // (it will immediately return if stream->error casts to false). + // In effect, this next function does nothing when (stream->error) + // is true (hence the risk of an infinite loop). + stream->next(); + // If that was the last document, we're finished. + // It is the only type of error we do not want to appear + // in operator*. + if (stream->error == EMPTY) { finished = true; } + // If we had any other kind of error (not EMPTY) then we want + // to pass it along to the operator* and we cannot mark the result + // as "finished" just yet. + return *this; +} + +simdjson_inline bool document_stream::iterator::at_end() const noexcept { + return finished; +} + + +simdjson_inline bool document_stream::iterator::operator!=(const document_stream::iterator &other) const noexcept { + return finished != other.finished; +} + +simdjson_inline bool document_stream::iterator::operator==(const document_stream::iterator &other) const noexcept { + return finished == other.finished; +} + +simdjson_inline document_stream::iterator document_stream::begin() noexcept { + start(); + // If there are no documents, we're finished. + return iterator(this, error == EMPTY); +} + +simdjson_inline document_stream::iterator document_stream::end() noexcept { + return iterator(this, true); +} + +inline void document_stream::start() noexcept { + if (error) { return; } + error = parser->allocate(batch_size); + if (error) { return; } + // Always run the first stage 1 parse immediately + batch_start = 0; + error = run_stage1(*parser, batch_start); + while(error == EMPTY) { + // In exceptional cases, we may start with an empty block + batch_start = next_batch_start(); + if (batch_start >= len) { return; } + error = run_stage1(*parser, batch_start); + } + if (error) { return; } + doc_index = batch_start; + doc = document(json_iterator(&buf[batch_start], parser)); + doc.iter._streaming = true; + + #ifdef SIMDJSON_THREADS_ENABLED + if (use_thread && next_batch_start() < len) { + // Kick off the first thread on next batch if needed + error = stage1_thread_parser.allocate(batch_size); + if (error) { return; } + worker->start_thread(); + start_stage1_thread(); + if (error) { return; } + } + #endif // SIMDJSON_THREADS_ENABLED +} + +inline void document_stream::next() noexcept { + // We always enter at once once in an error condition. + if (error) { return; } + next_document(); + if (error) { return; } + auto cur_struct_index = doc.iter._root - parser->implementation->structural_indexes.get(); + doc_index = batch_start + parser->implementation->structural_indexes[cur_struct_index]; + + // Check if at end of structural indexes (i.e. at end of batch) + if(cur_struct_index >= static_cast<int64_t>(parser->implementation->n_structural_indexes)) { + error = EMPTY; + // Load another batch (if available) + while (error == EMPTY) { + batch_start = next_batch_start(); + if (batch_start >= len) { break; } + #ifdef SIMDJSON_THREADS_ENABLED + if(use_thread) { + load_from_stage1_thread(); + } else { + error = run_stage1(*parser, batch_start); + } + #else + error = run_stage1(*parser, batch_start); + #endif + /** + * Whenever we move to another window, we need to update all pointers to make + * it appear as if the input buffer started at the beginning of the window. + * + * Take this input: + * + * {"z":5} {"1":1,"2":2,"4":4} [7, 10, 9] [15, 11, 12, 13] [154, 110, 112, 1311] + * + * Say you process the following window... + * + * '{"z":5} {"1":1,"2":2,"4":4} [7, 10, 9]' + * + * When you do so, the json_iterator has a pointer at the beginning of the memory region + * (pointing at the beginning of '{"z"...'. + * + * When you move to the window that starts at... + * + * '[7, 10, 9] [15, 11, 12, 13] ... + * + * then it is not sufficient to just run stage 1. You also need to re-anchor the + * json_iterator so that it believes we are starting at '[7, 10, 9]...'. + * + * Under the DOM front-end, this gets done automatically because the parser owns + * the pointer the data, and when you call stage1 and then stage2 on the same + * parser, then stage2 will run on the pointer acquired by stage1. + * + * That is, stage1 calls "this->buf = _buf" so the parser remembers the buffer that + * we used. But json_iterator has no callback when stage1 is called on the parser. + * In fact, I think that the parser is unaware of json_iterator. + * + * + * So we need to re-anchor the json_iterator after each call to stage 1 so that + * all of the pointers are in sync. + */ + doc.iter = json_iterator(&buf[batch_start], parser); + doc.iter._streaming = true; + /** + * End of resync. + */ + + if (error) { continue; } // If the error was EMPTY, we may want to load another batch. + doc_index = batch_start; + } + } +} + +inline void document_stream::next_document() noexcept { + // Go to next place where depth=0 (document depth) + error = doc.iter.skip_child(0); + if (error) { return; } + // Always set depth=1 at the start of document + doc.iter._depth = 1; + // consume comma if comma separated is allowed + if (allow_comma_separated) { + error_code ignored = doc.iter.consume_character(','); + static_cast<void>(ignored); // ignored on purpose + } + // Resets the string buffer at the beginning, thus invalidating the strings. + doc.iter._string_buf_loc = parser->string_buf.get(); + doc.iter._root = doc.iter.position(); +} + +inline size_t document_stream::next_batch_start() const noexcept { + return batch_start + parser->implementation->structural_indexes[parser->implementation->n_structural_indexes]; +} + +inline error_code document_stream::run_stage1(ondemand::parser &p, size_t _batch_start) noexcept { + // This code only updates the structural index in the parser, it does not update any json_iterator + // instance. + size_t remaining = len - _batch_start; + if (remaining <= batch_size) { + return p.implementation->stage1(&buf[_batch_start], remaining, stage1_mode::streaming_final); + } else { + return p.implementation->stage1(&buf[_batch_start], batch_size, stage1_mode::streaming_partial); + } +} + +simdjson_inline size_t document_stream::iterator::current_index() const noexcept { + return stream->doc_index; +} + +simdjson_inline std::string_view document_stream::iterator::source() const noexcept { + auto depth = stream->doc.iter.depth(); + auto cur_struct_index = stream->doc.iter._root - stream->parser->implementation->structural_indexes.get(); + + // If at root, process the first token to determine if scalar value + if (stream->doc.iter.at_root()) { + switch (stream->buf[stream->batch_start + stream->parser->implementation->structural_indexes[cur_struct_index]]) { + case '{': case '[': // Depth=1 already at start of document + break; + case '}': case ']': + depth--; + break; + default: // Scalar value document + // TODO: We could remove trailing whitespaces + // This returns a string spanning from start of value to the beginning of the next document (excluded) + { + auto next_index = stream->parser->implementation->structural_indexes[++cur_struct_index]; + // normally the length would be next_index - current_index() - 1, except for the last document + size_t svlen = next_index - current_index(); + const char *start = reinterpret_cast<const char*>(stream->buf) + current_index(); + while(svlen > 1 && (std::isspace(start[svlen-1]) || start[svlen-1] == '\0')) { + svlen--; + } + return std::string_view(start, svlen); + } + } + cur_struct_index++; + } + + while (cur_struct_index <= static_cast<int64_t>(stream->parser->implementation->n_structural_indexes)) { + switch (stream->buf[stream->batch_start + stream->parser->implementation->structural_indexes[cur_struct_index]]) { + case '{': case '[': + depth++; + break; + case '}': case ']': + depth--; + break; + } + if (depth == 0) { break; } + cur_struct_index++; + } + + return std::string_view(reinterpret_cast<const char*>(stream->buf) + current_index(), stream->parser->implementation->structural_indexes[cur_struct_index] - current_index() + stream->batch_start + 1);; +} + +inline error_code document_stream::iterator::error() const noexcept { + return stream->error; +} + +#ifdef SIMDJSON_THREADS_ENABLED + +inline void document_stream::load_from_stage1_thread() noexcept { + worker->finish(); + // Swap to the parser that was loaded up in the thread. Make sure the parser has + // enough memory to swap to, as well. + std::swap(stage1_thread_parser,*parser); + error = stage1_thread_error; + if (error) { return; } + + // If there's anything left, start the stage 1 thread! + if (next_batch_start() < len) { + start_stage1_thread(); + } +} + +inline void document_stream::start_stage1_thread() noexcept { + // we call the thread on a lambda that will update + // this->stage1_thread_error + // there is only one thread that may write to this value + // TODO this is NOT exception-safe. + this->stage1_thread_error = UNINITIALIZED; // In case something goes wrong, make sure it's an error + size_t _next_batch_start = this->next_batch_start(); + + worker->run(this, & this->stage1_thread_parser, _next_batch_start); +} + +#endif // SIMDJSON_THREADS_ENABLED + +} // namespace ondemand +} // namespace arm64 +} // namespace simdjson + +namespace simdjson { + +simdjson_inline simdjson_result<arm64::ondemand::document_stream>::simdjson_result( + error_code error +) noexcept : + implementation_simdjson_result_base<arm64::ondemand::document_stream>(error) +{ +} +simdjson_inline simdjson_result<arm64::ondemand::document_stream>::simdjson_result( + arm64::ondemand::document_stream &&value +) noexcept : + implementation_simdjson_result_base<arm64::ondemand::document_stream>( + std::forward<arm64::ondemand::document_stream>(value) + ) +{ +} + +} + +#endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_INL_H +/* end file simdjson/generic/ondemand/document_stream-inl.h for arm64 */ +/* including simdjson/generic/ondemand/field-inl.h for arm64: #include "simdjson/generic/ondemand/field-inl.h" */ +/* begin file simdjson/generic/ondemand/field-inl.h for arm64 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/field.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value-inl.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator-inl.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace arm64 { +namespace ondemand { + +// clang 6 does not think the default constructor can be noexcept, so we make it explicit +simdjson_inline field::field() noexcept : std::pair<raw_json_string, ondemand::value>() {} + +simdjson_inline field::field(raw_json_string key, ondemand::value &&value) noexcept + : std::pair<raw_json_string, ondemand::value>(key, std::forward<ondemand::value>(value)) +{ +} + +simdjson_inline simdjson_result<field> field::start(value_iterator &parent_iter) noexcept { + raw_json_string key; + SIMDJSON_TRY( parent_iter.field_key().get(key) ); + SIMDJSON_TRY( parent_iter.field_value() ); + return field::start(parent_iter, key); +} + +simdjson_inline simdjson_result<field> field::start(const value_iterator &parent_iter, raw_json_string key) noexcept { + return field(key, parent_iter.child()); +} + +simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> field::unescaped_key(bool allow_replacement) noexcept { + SIMDJSON_ASSUME(first.buf != nullptr); // We would like to call .alive() but Visual Studio won't let us. + simdjson_result<std::string_view> answer = first.unescape(second.iter.json_iter(), allow_replacement); + first.consume(); + return answer; +} + +template <typename string_type> +simdjson_inline simdjson_warn_unused error_code field::unescaped_key(string_type& receiver, bool allow_replacement) noexcept { + std::string_view key; + SIMDJSON_TRY( unescaped_key(allow_replacement).get(key) ); + receiver = key; + return SUCCESS; +} + +simdjson_inline raw_json_string field::key() const noexcept { + SIMDJSON_ASSUME(first.buf != nullptr); // We would like to call .alive() by Visual Studio won't let us. + return first; +} + + +simdjson_inline std::string_view field::key_raw_json_token() const noexcept { + SIMDJSON_ASSUME(first.buf != nullptr); // We would like to call .alive() by Visual Studio won't let us. + return std::string_view(reinterpret_cast<const char*>(first.buf-1), second.iter._json_iter->token.peek(-1) - first.buf + 1); +} + +simdjson_inline std::string_view field::escaped_key() const noexcept { + SIMDJSON_ASSUME(first.buf != nullptr); // We would like to call .alive() by Visual Studio won't let us. + auto end_quote = second.iter._json_iter->token.peek(-1); + while(*end_quote != '"') end_quote--; + return std::string_view(reinterpret_cast<const char*>(first.buf), end_quote - first.buf); +} + +simdjson_inline value &field::value() & noexcept { + return second; +} + +simdjson_inline value field::value() && noexcept { + return std::forward<field>(*this).second; +} + +} // namespace ondemand +} // namespace arm64 +} // namespace simdjson + +namespace simdjson { + +simdjson_inline simdjson_result<arm64::ondemand::field>::simdjson_result( + arm64::ondemand::field &&value +) noexcept : + implementation_simdjson_result_base<arm64::ondemand::field>( + std::forward<arm64::ondemand::field>(value) + ) +{ +} +simdjson_inline simdjson_result<arm64::ondemand::field>::simdjson_result( + error_code error +) noexcept : + implementation_simdjson_result_base<arm64::ondemand::field>(error) +{ +} + +simdjson_inline simdjson_result<arm64::ondemand::raw_json_string> simdjson_result<arm64::ondemand::field>::key() noexcept { + if (error()) { return error(); } + return first.key(); +} + +simdjson_inline simdjson_result<std::string_view> simdjson_result<arm64::ondemand::field>::key_raw_json_token() noexcept { + if (error()) { return error(); } + return first.key_raw_json_token(); +} + +simdjson_inline simdjson_result<std::string_view> simdjson_result<arm64::ondemand::field>::escaped_key() noexcept { + if (error()) { return error(); } + return first.escaped_key(); +} + +simdjson_inline simdjson_result<std::string_view> simdjson_result<arm64::ondemand::field>::unescaped_key(bool allow_replacement) noexcept { + if (error()) { return error(); } + return first.unescaped_key(allow_replacement); +} + +template<typename string_type> +simdjson_warn_unused simdjson_inline error_code simdjson_result<arm64::ondemand::field>::unescaped_key(string_type &receiver, bool allow_replacement) noexcept { + if (error()) { return error(); } + return first.unescaped_key(receiver, allow_replacement); +} + +simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::field>::value() noexcept { + if (error()) { return error(); } + return std::move(first.value()); +} + +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H +/* end file simdjson/generic/ondemand/field-inl.h for arm64 */ +/* including simdjson/generic/ondemand/json_iterator-inl.h for arm64: #include "simdjson/generic/ondemand/json_iterator-inl.h" */ +/* begin file simdjson/generic/ondemand/json_iterator-inl.h for arm64 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_INL_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_INL_H */ +/* amalgamation skipped (editor-only): #include "simdjson/internal/dom_parser_implementation.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/parser.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/logger-inl.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/parser-inl.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/token_iterator-inl.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace arm64 { +namespace ondemand { + +simdjson_inline json_iterator::json_iterator(json_iterator &&other) noexcept + : token(std::forward<token_iterator>(other.token)), + parser{other.parser}, + _string_buf_loc{other._string_buf_loc}, + error{other.error}, + _depth{other._depth}, + _root{other._root}, + _streaming{other._streaming} +{ + other.parser = nullptr; +} +simdjson_inline json_iterator &json_iterator::operator=(json_iterator &&other) noexcept { + token = other.token; + parser = other.parser; + _string_buf_loc = other._string_buf_loc; + error = other.error; + _depth = other._depth; + _root = other._root; + _streaming = other._streaming; + other.parser = nullptr; + return *this; +} + +simdjson_inline json_iterator::json_iterator(const uint8_t *buf, ondemand::parser *_parser) noexcept + : token(buf, &_parser->implementation->structural_indexes[0]), + parser{_parser}, + _string_buf_loc{parser->string_buf.get()}, + _depth{1}, + _root{parser->implementation->structural_indexes.get()}, + _streaming{false} + +{ + logger::log_headers(); +#if SIMDJSON_CHECK_EOF + assert_more_tokens(); +#endif +} + +#ifdef SIMDJSON_EXPERIMENTAL_ALLOW_INCOMPLETE_JSON +simdjson_inline json_iterator::json_iterator(const uint8_t *buf, ondemand::parser *_parser, bool streaming) noexcept + : token(buf, &_parser->implementation->structural_indexes[0]), + parser{_parser}, + _string_buf_loc{parser->string_buf.get()}, + _depth{1}, + _root{parser->implementation->structural_indexes.get()}, + _streaming{streaming} + +{ + logger::log_headers(); +#if SIMDJSON_CHECK_EOF + assert_more_tokens(); +#endif +} +#endif // SIMDJSON_EXPERIMENTAL_ALLOW_INCOMPLETE_JSON + +inline void json_iterator::rewind() noexcept { + token.set_position( root_position() ); + logger::log_headers(); // We start again + _string_buf_loc = parser->string_buf.get(); + _depth = 1; +} + +inline bool json_iterator::balanced() const noexcept { + token_iterator ti(token); + int32_t count{0}; + ti.set_position( root_position() ); + while(ti.peek() <= peek_last()) { + switch (*ti.return_current_and_advance()) + { + case '[': case '{': + count++; + break; + case ']': case '}': + count--; + break; + default: + break; + } + } + return count == 0; +} + + +// GCC 7 warns when the first line of this function is inlined away into oblivion due to the caller +// relating depth and parent_depth, which is a desired effect. The warning does not show up if the +// skip_child() function is not marked inline). +SIMDJSON_PUSH_DISABLE_WARNINGS +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING +simdjson_warn_unused simdjson_inline error_code json_iterator::skip_child(depth_t parent_depth) noexcept { + if (depth() <= parent_depth) { return SUCCESS; } + switch (*return_current_and_advance()) { + // TODO consider whether matching braces is a requirement: if non-matching braces indicates + // *missing* braces, then future lookups are not in the object/arrays they think they are, + // violating the rule "validate enough structure that the user can be confident they are + // looking at the right values." + // PERF TODO we can eliminate the switch here with a lookup of how much to add to depth + + // For the first open array/object in a value, we've already incremented depth, so keep it the same + // We never stop at colon, but if we did, it wouldn't affect depth + case '[': case '{': case ':': + logger::log_start_value(*this, "skip"); + break; + // If there is a comma, we have just finished a value in an array/object, and need to get back in + case ',': + logger::log_value(*this, "skip"); + break; + // ] or } means we just finished a value and need to jump out of the array/object + case ']': case '}': + logger::log_end_value(*this, "skip"); + _depth--; + if (depth() <= parent_depth) { return SUCCESS; } +#if SIMDJSON_CHECK_EOF + // If there are no more tokens, the parent is incomplete. + if (at_end()) { return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "Missing [ or { at start"); } +#endif // SIMDJSON_CHECK_EOF + break; + case '"': + if(*peek() == ':') { + // We are at a key!!! + // This might happen if you just started an object and you skip it immediately. + // Performance note: it would be nice to get rid of this check as it is somewhat + // expensive. + // https://github.com/simdjson/simdjson/issues/1742 + logger::log_value(*this, "key"); + return_current_and_advance(); // eat up the ':' + break; // important!!! + } + simdjson_fallthrough; + // Anything else must be a scalar value + default: + // For the first scalar, we will have incremented depth already, so we decrement it here. + logger::log_value(*this, "skip"); + _depth--; + if (depth() <= parent_depth) { return SUCCESS; } + break; + } + + // Now that we've considered the first value, we only increment/decrement for arrays/objects + while (position() < end_position()) { + switch (*return_current_and_advance()) { + case '[': case '{': + logger::log_start_value(*this, "skip"); + _depth++; + break; + // TODO consider whether matching braces is a requirement: if non-matching braces indicates + // *missing* braces, then future lookups are not in the object/arrays they think they are, + // violating the rule "validate enough structure that the user can be confident they are + // looking at the right values." + // PERF TODO we can eliminate the switch here with a lookup of how much to add to depth + case ']': case '}': + logger::log_end_value(*this, "skip"); + _depth--; + if (depth() <= parent_depth) { return SUCCESS; } + break; + default: + logger::log_value(*this, "skip", ""); + break; + } + } + + return report_error(TAPE_ERROR, "not enough close braces"); +} + +SIMDJSON_POP_DISABLE_WARNINGS + +simdjson_inline bool json_iterator::at_root() const noexcept { + return position() == root_position(); +} + +simdjson_inline bool json_iterator::is_single_token() const noexcept { + return parser->implementation->n_structural_indexes == 1; +} + +simdjson_inline bool json_iterator::streaming() const noexcept { + return _streaming; +} + +simdjson_inline token_position json_iterator::root_position() const noexcept { + return _root; +} + +simdjson_inline void json_iterator::assert_at_document_depth() const noexcept { + SIMDJSON_ASSUME( _depth == 1 ); +} + +simdjson_inline void json_iterator::assert_at_root() const noexcept { + SIMDJSON_ASSUME( _depth == 1 ); +#ifndef SIMDJSON_CLANG_VISUAL_STUDIO + // Under Visual Studio, the next SIMDJSON_ASSUME fails with: the argument + // has side effects that will be discarded. + SIMDJSON_ASSUME( token.position() == _root ); +#endif +} + +simdjson_inline void json_iterator::assert_more_tokens(uint32_t required_tokens) const noexcept { + assert_valid_position(token._position + required_tokens - 1); +} + +simdjson_inline void json_iterator::assert_valid_position(token_position position) const noexcept { + (void)position; // Suppress unused parameter warning +#ifndef SIMDJSON_CLANG_VISUAL_STUDIO + SIMDJSON_ASSUME( position >= &parser->implementation->structural_indexes[0] ); + SIMDJSON_ASSUME( position < &parser->implementation->structural_indexes[parser->implementation->n_structural_indexes] ); +#endif +} + +simdjson_inline bool json_iterator::at_end() const noexcept { + return position() == end_position(); +} +simdjson_inline token_position json_iterator::end_position() const noexcept { + uint32_t n_structural_indexes{parser->implementation->n_structural_indexes}; + return &parser->implementation->structural_indexes[n_structural_indexes]; +} + +inline std::string json_iterator::to_string() const noexcept { + if( !is_alive() ) { return "dead json_iterator instance"; } + const char * current_structural = reinterpret_cast<const char *>(token.peek()); + return std::string("json_iterator [ depth : ") + std::to_string(_depth) + + std::string(", structural : '") + std::string(current_structural,1) + + std::string("', offset : ") + std::to_string(token.current_offset()) + + std::string("', error : ") + error_message(error) + + std::string(" ]"); +} + +inline simdjson_result<const char *> json_iterator::current_location() const noexcept { + if (!is_alive()) { // Unrecoverable error + if (!at_root()) { + return reinterpret_cast<const char *>(token.peek(-1)); + } else { + return reinterpret_cast<const char *>(token.peek()); + } + } + if (at_end()) { + return OUT_OF_BOUNDS; + } + return reinterpret_cast<const char *>(token.peek()); +} + +simdjson_inline bool json_iterator::is_alive() const noexcept { + return parser; +} + +simdjson_inline void json_iterator::abandon() noexcept { + parser = nullptr; + _depth = 0; +} + +simdjson_inline const uint8_t *json_iterator::return_current_and_advance() noexcept { +#if SIMDJSON_CHECK_EOF + assert_more_tokens(); +#endif // SIMDJSON_CHECK_EOF + return token.return_current_and_advance(); +} + +simdjson_inline const uint8_t *json_iterator::unsafe_pointer() const noexcept { + // deliberately done without safety guard: + return token.peek(); +} + +simdjson_inline const uint8_t *json_iterator::peek(int32_t delta) const noexcept { +#if SIMDJSON_CHECK_EOF + assert_more_tokens(delta+1); +#endif // SIMDJSON_CHECK_EOF + return token.peek(delta); +} + +simdjson_inline uint32_t json_iterator::peek_length(int32_t delta) const noexcept { +#if SIMDJSON_CHECK_EOF + assert_more_tokens(delta+1); +#endif // #if SIMDJSON_CHECK_EOF + return token.peek_length(delta); +} + +simdjson_inline const uint8_t *json_iterator::peek(token_position position) const noexcept { + // todo: currently we require end-of-string buffering, but the following + // assert_valid_position should be turned on if/when we lift that condition. + // assert_valid_position(position); + // This is almost surely related to SIMDJSON_CHECK_EOF but given that SIMDJSON_CHECK_EOF + // is ON by default, we have no choice but to disable it for real with a comment. + return token.peek(position); +} + +simdjson_inline uint32_t json_iterator::peek_length(token_position position) const noexcept { +#if SIMDJSON_CHECK_EOF + assert_valid_position(position); +#endif // SIMDJSON_CHECK_EOF + return token.peek_length(position); +} +simdjson_inline uint32_t json_iterator::peek_root_length(token_position position) const noexcept { +#if SIMDJSON_CHECK_EOF + assert_valid_position(position); +#endif // SIMDJSON_CHECK_EOF + return token.peek_root_length(position); +} + +simdjson_inline token_position json_iterator::last_position() const noexcept { + // The following line fails under some compilers... + // SIMDJSON_ASSUME(parser->implementation->n_structural_indexes > 0); + // since it has side-effects. + uint32_t n_structural_indexes{parser->implementation->n_structural_indexes}; + SIMDJSON_ASSUME(n_structural_indexes > 0); + return &parser->implementation->structural_indexes[n_structural_indexes - 1]; +} +simdjson_inline const uint8_t *json_iterator::peek_last() const noexcept { + return token.peek(last_position()); +} + +simdjson_inline void json_iterator::ascend_to(depth_t parent_depth) noexcept { + SIMDJSON_ASSUME(parent_depth >= 0 && parent_depth < INT32_MAX - 1); + SIMDJSON_ASSUME(_depth == parent_depth + 1); + _depth = parent_depth; +} + +simdjson_inline void json_iterator::descend_to(depth_t child_depth) noexcept { + SIMDJSON_ASSUME(child_depth >= 1 && child_depth < INT32_MAX); + SIMDJSON_ASSUME(_depth == child_depth - 1); + _depth = child_depth; +} + +simdjson_inline depth_t json_iterator::depth() const noexcept { + return _depth; +} + +simdjson_inline uint8_t *&json_iterator::string_buf_loc() noexcept { + return _string_buf_loc; +} + +simdjson_warn_unused simdjson_inline error_code json_iterator::report_error(error_code _error, const char *message) noexcept { + SIMDJSON_ASSUME(_error != SUCCESS && _error != UNINITIALIZED && _error != INCORRECT_TYPE && _error != NO_SUCH_FIELD); + logger::log_error(*this, message); + error = _error; + return error; +} + +simdjson_inline token_position json_iterator::position() const noexcept { + return token.position(); +} + +simdjson_inline simdjson_result<std::string_view> json_iterator::unescape(raw_json_string in, bool allow_replacement) noexcept { +#if SIMDJSON_DEVELOPMENT_CHECKS + auto result = parser->unescape(in, _string_buf_loc, allow_replacement); +#if !defined(SIMDJSON_VISUAL_STUDIO) && !defined(SIMDJSON_CLANG_VISUAL_STUDIO) + // Under Visual Studio, the next SIMDJSON_ASSUME fails with: the argument + // has side effects that will be discarded. + SIMDJSON_ASSUME(!parser->string_buffer_overflow(_string_buf_loc)); +#endif // !defined(SIMDJSON_VISUAL_STUDIO) && !defined(SIMDJSON_CLANG_VISUAL_STUDIO) + return result; +#else + return parser->unescape(in, _string_buf_loc, allow_replacement); +#endif +} + +simdjson_inline simdjson_result<std::string_view> json_iterator::unescape_wobbly(raw_json_string in) noexcept { +#if SIMDJSON_DEVELOPMENT_CHECKS + auto result = parser->unescape_wobbly(in, _string_buf_loc); +#if !defined(SIMDJSON_VISUAL_STUDIO) && !defined(SIMDJSON_CLANG_VISUAL_STUDIO) + // Under Visual Studio, the next SIMDJSON_ASSUME fails with: the argument + // has side effects that will be discarded. + SIMDJSON_ASSUME(!parser->string_buffer_overflow(_string_buf_loc)); +#endif // !defined(SIMDJSON_VISUAL_STUDIO) && !defined(SIMDJSON_CLANG_VISUAL_STUDIO) + return result; +#else + return parser->unescape_wobbly(in, _string_buf_loc); +#endif +} + +simdjson_inline void json_iterator::reenter_child(token_position position, depth_t child_depth) noexcept { + SIMDJSON_ASSUME(child_depth >= 1 && child_depth < INT32_MAX); + SIMDJSON_ASSUME(_depth == child_depth - 1); +#if SIMDJSON_DEVELOPMENT_CHECKS +#ifndef SIMDJSON_CLANG_VISUAL_STUDIO + SIMDJSON_ASSUME(size_t(child_depth) < parser->max_depth()); + SIMDJSON_ASSUME(position >= parser->start_positions[child_depth]); +#endif +#endif + token.set_position(position); + _depth = child_depth; +} + +simdjson_warn_unused simdjson_inline error_code json_iterator::consume_character(char c) noexcept { + if (*peek() == c) { + return_current_and_advance(); + return SUCCESS; + } + return TAPE_ERROR; +} + +#if SIMDJSON_DEVELOPMENT_CHECKS + +simdjson_inline token_position json_iterator::start_position(depth_t depth) const noexcept { + SIMDJSON_ASSUME(size_t(depth) < parser->max_depth()); + return size_t(depth) < parser->max_depth() ? parser->start_positions[depth] : 0; +} + +simdjson_inline void json_iterator::set_start_position(depth_t depth, token_position position) noexcept { + SIMDJSON_ASSUME(size_t(depth) < parser->max_depth()); + if(size_t(depth) < parser->max_depth()) { parser->start_positions[depth] = position; } +} + +#endif + + +simdjson_warn_unused simdjson_inline error_code json_iterator::optional_error(error_code _error, const char *message) noexcept { + SIMDJSON_ASSUME(_error == INCORRECT_TYPE || _error == NO_SUCH_FIELD); + logger::log_error(*this, message); + return _error; +} + + +simdjson_warn_unused simdjson_inline bool json_iterator::copy_to_buffer(const uint8_t *json, uint32_t max_len, uint8_t *tmpbuf, size_t N) noexcept { + // This function is not expected to be called in performance-sensitive settings. + // Let us guard against silly cases: + if((N < max_len) || (N == 0)) { return false; } + // Copy to the buffer. + std::memcpy(tmpbuf, json, max_len); + if(N > max_len) { // We pad whatever remains with ' '. + std::memset(tmpbuf + max_len, ' ', N - max_len); + } + return true; +} + +} // namespace ondemand +} // namespace arm64 +} // namespace simdjson + +namespace simdjson { + +simdjson_inline simdjson_result<arm64::ondemand::json_iterator>::simdjson_result(arm64::ondemand::json_iterator &&value) noexcept + : implementation_simdjson_result_base<arm64::ondemand::json_iterator>(std::forward<arm64::ondemand::json_iterator>(value)) {} +simdjson_inline simdjson_result<arm64::ondemand::json_iterator>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<arm64::ondemand::json_iterator>(error) {} + +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_INL_H +/* end file simdjson/generic/ondemand/json_iterator-inl.h for arm64 */ +/* including simdjson/generic/ondemand/json_type-inl.h for arm64: #include "simdjson/generic/ondemand/json_type-inl.h" */ +/* begin file simdjson/generic/ondemand/json_type-inl.h for arm64 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_INL_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_INL_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace arm64 { +namespace ondemand { + +inline std::ostream& operator<<(std::ostream& out, json_type type) noexcept { + switch (type) { + case json_type::array: out << "array"; break; + case json_type::object: out << "object"; break; + case json_type::number: out << "number"; break; + case json_type::string: out << "string"; break; + case json_type::boolean: out << "boolean"; break; + case json_type::null: out << "null"; break; + default: SIMDJSON_UNREACHABLE(); + } + return out; +} + +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson_result<json_type> &type) noexcept(false) { + return out << type.value(); +} +#endif + + + +simdjson_inline number_type number::get_number_type() const noexcept { + return type; +} + +simdjson_inline bool number::is_uint64() const noexcept { + return get_number_type() == number_type::unsigned_integer; +} + +simdjson_inline uint64_t number::get_uint64() const noexcept { + return payload.unsigned_integer; +} + +simdjson_inline number::operator uint64_t() const noexcept { + return get_uint64(); +} + +simdjson_inline bool number::is_int64() const noexcept { + return get_number_type() == number_type::signed_integer; +} + +simdjson_inline int64_t number::get_int64() const noexcept { + return payload.signed_integer; +} + +simdjson_inline number::operator int64_t() const noexcept { + return get_int64(); +} + +simdjson_inline bool number::is_double() const noexcept { + return get_number_type() == number_type::floating_point_number; +} + +simdjson_inline double number::get_double() const noexcept { + return payload.floating_point_number; +} + +simdjson_inline number::operator double() const noexcept { + return get_double(); +} + +simdjson_inline double number::as_double() const noexcept { + if(is_double()) { + return payload.floating_point_number; + } + if(is_int64()) { + return double(payload.signed_integer); + } + return double(payload.unsigned_integer); +} + +simdjson_inline void number::append_s64(int64_t value) noexcept { + payload.signed_integer = value; + type = number_type::signed_integer; +} + +simdjson_inline void number::append_u64(uint64_t value) noexcept { + payload.unsigned_integer = value; + type = number_type::unsigned_integer; +} + +simdjson_inline void number::append_double(double value) noexcept { + payload.floating_point_number = value; + type = number_type::floating_point_number; +} + +simdjson_inline void number::skip_double() noexcept { + type = number_type::floating_point_number; +} + +} // namespace ondemand +} // namespace arm64 +} // namespace simdjson + +namespace simdjson { + +simdjson_inline simdjson_result<arm64::ondemand::json_type>::simdjson_result(arm64::ondemand::json_type &&value) noexcept + : implementation_simdjson_result_base<arm64::ondemand::json_type>(std::forward<arm64::ondemand::json_type>(value)) {} +simdjson_inline simdjson_result<arm64::ondemand::json_type>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<arm64::ondemand::json_type>(error) {} + +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_INL_H +/* end file simdjson/generic/ondemand/json_type-inl.h for arm64 */ +/* including simdjson/generic/ondemand/logger-inl.h for arm64: #include "simdjson/generic/ondemand/logger-inl.h" */ +/* begin file simdjson/generic/ondemand/logger-inl.h for arm64 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_LOGGER_INL_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_LOGGER_INL_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/logger.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#include <memory> +#include <cstring> + +namespace simdjson { +namespace arm64 { +namespace ondemand { +namespace logger { + +static constexpr const char * DASHES = "----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------"; +static constexpr const int LOG_EVENT_LEN = 20; +static constexpr const int LOG_BUFFER_LEN = 30; +static constexpr const int LOG_SMALL_BUFFER_LEN = 10; +static int log_depth = 0; // Not threadsafe. Log only. + +// Helper to turn unprintable or newline characters into spaces +static inline char printable_char(char c) { + if (c >= 0x20) { + return c; + } else { + return ' '; + } +} + +template<typename... Args> +static inline std::string string_format(const std::string& format, const Args&... args) +{ + SIMDJSON_PUSH_DISABLE_ALL_WARNINGS + int size_s = std::snprintf(nullptr, 0, format.c_str(), args...) + 1; + auto size = static_cast<size_t>(size_s); + if (size <= 0) return std::string(); + std::unique_ptr<char[]> buf(new char[size]); + std::snprintf(buf.get(), size, format.c_str(), args...); + SIMDJSON_POP_DISABLE_WARNINGS + return std::string(buf.get(), buf.get() + size - 1); +} + +static inline log_level get_log_level_from_env() +{ + SIMDJSON_PUSH_DISABLE_WARNINGS + SIMDJSON_DISABLE_DEPRECATED_WARNING // Disable CRT_SECURE warning on MSVC: manually verified this is safe + char *lvl = getenv("SIMDJSON_LOG_LEVEL"); + SIMDJSON_POP_DISABLE_WARNINGS + if (lvl && simdjson_strcasecmp(lvl, "ERROR") == 0) { return log_level::error; } + return log_level::info; +} + +static inline log_level log_threshold() +{ + static log_level threshold = get_log_level_from_env(); + return threshold; +} + +static inline bool should_log(log_level level) +{ + return level >= log_threshold(); +} + +inline void log_event(const json_iterator &iter, const char *type, std::string_view detail, int delta, int depth_delta) noexcept { + log_line(iter, "", type, detail, delta, depth_delta, log_level::info); +} + +inline void log_value(const json_iterator &iter, token_position index, depth_t depth, const char *type, std::string_view detail) noexcept { + log_line(iter, index, depth, "", type, detail, log_level::info); +} +inline void log_value(const json_iterator &iter, const char *type, std::string_view detail, int delta, int depth_delta) noexcept { + log_line(iter, "", type, detail, delta, depth_delta, log_level::info); +} + +inline void log_start_value(const json_iterator &iter, token_position index, depth_t depth, const char *type, std::string_view detail) noexcept { + log_line(iter, index, depth, "+", type, detail, log_level::info); + if (LOG_ENABLED) { log_depth++; } +} +inline void log_start_value(const json_iterator &iter, const char *type, int delta, int depth_delta) noexcept { + log_line(iter, "+", type, "", delta, depth_delta, log_level::info); + if (LOG_ENABLED) { log_depth++; } +} + +inline void log_end_value(const json_iterator &iter, const char *type, int delta, int depth_delta) noexcept { + if (LOG_ENABLED) { log_depth--; } + log_line(iter, "-", type, "", delta, depth_delta, log_level::info); +} + +inline void log_error(const json_iterator &iter, const char *error, const char *detail, int delta, int depth_delta) noexcept { + log_line(iter, "ERROR: ", error, detail, delta, depth_delta, log_level::error); +} +inline void log_error(const json_iterator &iter, token_position index, depth_t depth, const char *error, const char *detail) noexcept { + log_line(iter, index, depth, "ERROR: ", error, detail, log_level::error); +} + +inline void log_event(const value_iterator &iter, const char *type, std::string_view detail, int delta, int depth_delta) noexcept { + log_event(iter.json_iter(), type, detail, delta, depth_delta); +} + +inline void log_value(const value_iterator &iter, const char *type, std::string_view detail, int delta, int depth_delta) noexcept { + log_value(iter.json_iter(), type, detail, delta, depth_delta); +} + +inline void log_start_value(const value_iterator &iter, const char *type, int delta, int depth_delta) noexcept { + log_start_value(iter.json_iter(), type, delta, depth_delta); +} + +inline void log_end_value(const value_iterator &iter, const char *type, int delta, int depth_delta) noexcept { + log_end_value(iter.json_iter(), type, delta, depth_delta); +} + +inline void log_error(const value_iterator &iter, const char *error, const char *detail, int delta, int depth_delta) noexcept { + log_error(iter.json_iter(), error, detail, delta, depth_delta); +} + +inline void log_headers() noexcept { + if (LOG_ENABLED) { + if (simdjson_unlikely(should_log(log_level::info))) { + // Technically a static variable is not thread-safe, but if you are using threads and logging... well... + static bool displayed_hint{false}; + log_depth = 0; + printf("\n"); + if (!displayed_hint) { + // We only print this helpful header once. + printf("# Logging provides the depth and position of the iterator user-visible steps:\n"); + printf("# +array says 'this is where we were when we discovered the start array'\n"); + printf( + "# -array says 'this is where we were when we ended the array'\n"); + printf("# skip says 'this is a structural or value I am skipping'\n"); + printf("# +/-skip says 'this is a start/end array or object I am skipping'\n"); + printf("#\n"); + printf("# The indentation of the terms (array, string,...) indicates the depth,\n"); + printf("# in addition to the depth being displayed.\n"); + printf("#\n"); + printf("# Every token in the document has a single depth determined by the tokens before it,\n"); + printf("# and is not affected by what the token actually is.\n"); + printf("#\n"); + printf("# Not all structural elements are presented as tokens in the logs.\n"); + printf("#\n"); + printf("# We never give control to the user within an empty array or an empty object.\n"); + printf("#\n"); + printf("# Inside an array, having a depth greater than the array's depth means that\n"); + printf("# we are pointing inside a value.\n"); + printf("# Having a depth equal to the array means that we are pointing right before a value.\n"); + printf("# Having a depth smaller than the array means that we have moved beyond the array.\n"); + displayed_hint = true; + } + printf("\n"); + printf("| %-*s ", LOG_EVENT_LEN, "Event"); + printf("| %-*s ", LOG_BUFFER_LEN, "Buffer"); + printf("| %-*s ", LOG_SMALL_BUFFER_LEN, "Next"); + // printf("| %-*s ", 5, "Next#"); + printf("| %-*s ", 5, "Depth"); + printf("| Detail "); + printf("|\n"); + + printf("|%.*s", LOG_EVENT_LEN + 2, DASHES); + printf("|%.*s", LOG_BUFFER_LEN + 2, DASHES); + printf("|%.*s", LOG_SMALL_BUFFER_LEN + 2, DASHES); + // printf("|%.*s", 5+2, DASHES); + printf("|%.*s", 5 + 2, DASHES); + printf("|--------"); + printf("|\n"); + fflush(stdout); + } + } +} + +template <typename... Args> +inline void log_line(const json_iterator &iter, const char *title_prefix, const char *title, std::string_view detail, int delta, int depth_delta, log_level level, Args&&... args) noexcept { + log_line(iter, iter.position()+delta, depth_t(iter.depth()+depth_delta), title_prefix, title, detail, level, std::forward<Args>(args)...); +} + +template <typename... Args> +inline void log_line(const json_iterator &iter, token_position index, depth_t depth, const char *title_prefix, const char *title, std::string_view detail, log_level level, Args&&... args) noexcept { + if (LOG_ENABLED) { + if (simdjson_unlikely(should_log(level))) { + const int indent = depth * 2; + const auto buf = iter.token.buf; + auto msg = string_format(title, std::forward<Args>(args)...); + printf("| %*s%s%-*s ", indent, "", title_prefix, + LOG_EVENT_LEN - indent - int(strlen(title_prefix)), msg.c_str()); + { + // Print the current structural. + printf("| "); + // Before we begin, the index might point right before the document. + // This could be unsafe, see https://github.com/simdjson/simdjson/discussions/1938 + if (index < iter._root) { + printf("%*s", LOG_BUFFER_LEN, ""); + } else { + auto current_structural = &buf[*index]; + for (int i = 0; i < LOG_BUFFER_LEN; i++) { + printf("%c", printable_char(current_structural[i])); + } + } + printf(" "); + } + { + // Print the next structural. + printf("| "); + auto next_structural = &buf[*(index + 1)]; + for (int i = 0; i < LOG_SMALL_BUFFER_LEN; i++) { + printf("%c", printable_char(next_structural[i])); + } + printf(" "); + } + // printf("| %5u ", *(index+1)); + printf("| %5i ", depth); + printf("| %6.*s ", int(detail.size()), detail.data()); + printf("|\n"); + fflush(stdout); + } + } +} + +} // namespace logger +} // namespace ondemand +} // namespace arm64 +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_ONDEMAND_LOGGER_INL_H +/* end file simdjson/generic/ondemand/logger-inl.h for arm64 */ +/* including simdjson/generic/ondemand/object-inl.h for arm64: #include "simdjson/generic/ondemand/object-inl.h" */ +/* begin file simdjson/generic/ondemand/object-inl.h for arm64 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_INL_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_OBJECT_INL_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/field.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object_iterator.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value-inl.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/jsonpathutil.h" */ +/* amalgamation skipped (editor-only): #if SIMDJSON_STATIC_REFLECTION */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_string_builder.h" // for constevalutil::fixed_string */ +/* amalgamation skipped (editor-only): #include <meta> */ +/* amalgamation skipped (editor-only): #endif */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace arm64 { +namespace ondemand { + +simdjson_inline simdjson_result<value> object::find_field_unordered(const std::string_view key) & noexcept { + bool has_value; + SIMDJSON_TRY( iter.find_field_unordered_raw(key).get(has_value) ); + if (!has_value) { + logger::log_line(iter.json_iter(), "ERROR: ", "Cannot find key %.*s", "", -1, 0, logger::log_level::error, static_cast<int>(key.size()), key.data()); + return NO_SUCH_FIELD; + } + return value(iter.child()); +} +simdjson_inline simdjson_result<value> object::find_field_unordered(const std::string_view key) && noexcept { + bool has_value; + SIMDJSON_TRY( iter.find_field_unordered_raw(key).get(has_value) ); + if (!has_value) { + logger::log_line(iter.json_iter(), "ERROR: ", "Cannot find key %.*s", "", -1, 0, logger::log_level::error, static_cast<int>(key.size()), key.data()); + return NO_SUCH_FIELD; + } + return value(iter.child()); +} +simdjson_inline simdjson_result<value> object::operator[](const std::string_view key) & noexcept { + return find_field_unordered(key); +} +simdjson_inline simdjson_result<value> object::operator[](const std::string_view key) && noexcept { + return std::forward<object>(*this).find_field_unordered(key); +} +simdjson_inline simdjson_result<value> object::find_field(const std::string_view key) & noexcept { + bool has_value; + SIMDJSON_TRY( iter.find_field_raw(key).get(has_value) ); + if (!has_value) { + logger::log_line(iter.json_iter(), "ERROR: ", "Cannot find key %.*s", "", -1, 0, logger::log_level::error, static_cast<int>(key.size()), key.data()); + return NO_SUCH_FIELD; + } + return value(iter.child()); +} +simdjson_inline simdjson_result<value> object::find_field(const std::string_view key) && noexcept { + bool has_value; + SIMDJSON_TRY( iter.find_field_raw(key).get(has_value) ); + if (!has_value) { + logger::log_line(iter.json_iter(), "ERROR: ", "Cannot find key %.*s", "", -1, 0, logger::log_level::error, static_cast<int>(key.size()), key.data()); + return NO_SUCH_FIELD; + } + return value(iter.child()); +} + +simdjson_inline simdjson_result<object> object::start(value_iterator &iter) noexcept { + SIMDJSON_TRY( iter.start_object().error() ); + return object(iter); +} +simdjson_inline simdjson_result<object> object::start_root(value_iterator &iter) noexcept { + SIMDJSON_TRY( iter.start_root_object().error() ); + return object(iter); +} +simdjson_warn_unused simdjson_inline error_code object::consume() noexcept { + if(iter.is_at_key()) { + /** + * whenever you are pointing at a key, calling skip_child() is + * unsafe because you will hit a string and you will assume that + * it is string value, and this mistake will lead you to make bad + * depth computation. + */ + /** + * We want to 'consume' the key. We could really + * just do _json_iter->return_current_and_advance(); at this + * point, but, for clarity, we will use the high-level API to + * eat the key. We assume that the compiler optimizes away + * most of the work. + */ + simdjson_unused raw_json_string actual_key; + auto error = iter.field_key().get(actual_key); + if (error) { iter.abandon(); return error; }; + // Let us move to the value while we are at it. + if ((error = iter.field_value())) { iter.abandon(); return error; } + } + auto error_skip = iter.json_iter().skip_child(iter.depth()-1); + if(error_skip) { iter.abandon(); } + return error_skip; +} + +simdjson_inline simdjson_result<std::string_view> object::raw_json() noexcept { + const uint8_t * starting_point{iter.peek_start()}; + auto error = consume(); + if(error) { return error; } + const uint8_t * final_point{iter._json_iter->peek()}; + return std::string_view(reinterpret_cast<const char*>(starting_point), size_t(final_point - starting_point)); +} + +simdjson_inline simdjson_result<object> object::started(value_iterator &iter) noexcept { + SIMDJSON_TRY( iter.started_object().error() ); + return object(iter); +} + +simdjson_inline object object::resume(const value_iterator &iter) noexcept { + return iter; +} + +simdjson_inline object::object(const value_iterator &_iter) noexcept + : iter{_iter} +{ +} + +simdjson_inline simdjson_result<object_iterator> object::begin() noexcept { +#if SIMDJSON_DEVELOPMENT_CHECKS + if (!iter.is_at_iterator_start()) { return OUT_OF_ORDER_ITERATION; } +#endif + return object_iterator(iter); +} +simdjson_inline simdjson_result<object_iterator> object::end() noexcept { + return object_iterator(iter); +} + +inline simdjson_result<value> object::at_pointer(std::string_view json_pointer) noexcept { + if (json_pointer[0] != '/') { return INVALID_JSON_POINTER; } + json_pointer = json_pointer.substr(1); + size_t slash = json_pointer.find('/'); + std::string_view key = json_pointer.substr(0, slash); + // Grab the child with the given key + simdjson_result<value> child; + + // If there is an escape character in the key, unescape it and then get the child. + size_t escape = key.find('~'); + if (escape != std::string_view::npos) { + // Unescape the key + std::string unescaped(key); + do { + switch (unescaped[escape+1]) { + case '0': + unescaped.replace(escape, 2, "~"); + break; + case '1': + unescaped.replace(escape, 2, "/"); + break; + default: + return INVALID_JSON_POINTER; // "Unexpected ~ escape character in JSON pointer"); + } + escape = unescaped.find('~', escape+1); + } while (escape != std::string::npos); + child = find_field(unescaped); // Take note find_field does not unescape keys when matching + } else { + child = find_field(key); + } + if(child.error()) { + return child; // we do not continue if there was an error + } + // If there is a /, we have to recurse and look up more of the path + if (slash != std::string_view::npos) { + child = child.at_pointer(json_pointer.substr(slash)); + } + return child; +} + +inline simdjson_result<value> object::at_path(std::string_view json_path) noexcept { + auto json_pointer = json_path_to_pointer_conversion(json_path); + if (json_pointer == "-1") { + return INVALID_JSON_POINTER; + } + return at_pointer(json_pointer); +} + +inline simdjson_result<std::vector<value>> object::at_path_with_wildcard(std::string_view json_path) noexcept { + std::vector<value> result; + + auto result_pair = get_next_key_and_json_path(json_path); + std::string_view key = result_pair.first; + std::string_view remaining_path = result_pair.second; + // Handle when its the case for wildcard + if (key == "*") { + // Loop through each field in the object + for (auto field : *this) { + value val; + SIMDJSON_TRY(field.value().get(val)); + + if (remaining_path.empty()) { + result.push_back(std::move(val)); + } else { + auto nested_result = val.at_path_with_wildcard(remaining_path); + + if (nested_result.error()) { + return nested_result.error(); + } + // Extract and append all nested matches to our result + std::vector<value> nested_vec; + SIMDJSON_TRY(std::move(nested_result).get(nested_vec)); + + result.insert(result.end(), + std::make_move_iterator(nested_vec.begin()), + std::make_move_iterator(nested_vec.end())); + } + } + return result; + } else { + value val; + SIMDJSON_TRY(find_field(key).get(val)); + + if (remaining_path.empty()) { + result.push_back(std::move(val)); + return result; + } else { + return val.at_path_with_wildcard(remaining_path); + } + } +} + +simdjson_inline simdjson_result<size_t> object::count_fields() & noexcept { + size_t count{0}; + // Important: we do not consume any of the values. + for(simdjson_unused auto v : *this) { count++; } + // The above loop will always succeed, but we want to report errors. + if(iter.error()) { return iter.error(); } + // We need to move back at the start because we expect users to iterate through + // the object after counting the number of elements. + iter.reset_object(); + return count; +} + +simdjson_inline simdjson_result<bool> object::is_empty() & noexcept { + bool is_not_empty; + auto error = iter.reset_object().get(is_not_empty); + if(error) { return error; } + return !is_not_empty; +} + +simdjson_inline simdjson_result<bool> object::reset() & noexcept { + return iter.reset_object(); +} + +#if SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION + +template<constevalutil::fixed_string... FieldNames, typename T> + requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_inline error_code object::extract_into(T& out) & noexcept { + // Helper to check if a field name matches any of the requested fields + auto should_extract = [](std::string_view field_name) constexpr -> bool { + return ((FieldNames.view() == field_name) || ...); + }; + + // Iterate through all members of T using reflection + template for (constexpr auto mem : std::define_static_array( + std::meta::nonstatic_data_members_of(^^T, std::meta::access_context::unchecked()))) { + + if constexpr (!std::meta::is_const(mem) && std::meta::is_public(mem)) { + constexpr std::string_view key = std::define_static_string(std::meta::identifier_of(mem)); + + // Only extract this field if it's in our list of requested fields + if constexpr (should_extract(key)) { + // Try to find and extract the field + if constexpr (concepts::optional_type<decltype(out.[:mem:])>) { + // For optional fields, it's ok if they're missing + auto field_result = find_field_unordered(key); + if (!field_result.error()) { + auto error = field_result.get(out.[:mem:]); + if (error && error != NO_SUCH_FIELD) { + return error; + } + } else if (field_result.error() != NO_SUCH_FIELD) { + return field_result.error(); + } else { + out.[:mem:].reset(); + } + } else { + // For required fields (in the requested list), fail if missing + SIMDJSON_TRY((*this)[key].get(out.[:mem:])); + } + } + } + }; + + return SUCCESS; +} + +#endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION + +} // namespace ondemand +} // namespace arm64 +} // namespace simdjson + +namespace simdjson { + +simdjson_inline simdjson_result<arm64::ondemand::object>::simdjson_result(arm64::ondemand::object &&value) noexcept + : implementation_simdjson_result_base<arm64::ondemand::object>(std::forward<arm64::ondemand::object>(value)) {} +simdjson_inline simdjson_result<arm64::ondemand::object>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<arm64::ondemand::object>(error) {} + +simdjson_inline simdjson_result<arm64::ondemand::object_iterator> simdjson_result<arm64::ondemand::object>::begin() noexcept { + if (error()) { return error(); } + return first.begin(); +} +simdjson_inline simdjson_result<arm64::ondemand::object_iterator> simdjson_result<arm64::ondemand::object>::end() noexcept { + if (error()) { return error(); } + return first.end(); +} +simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::object>::find_field_unordered(std::string_view key) & noexcept { + if (error()) { return error(); } + return first.find_field_unordered(key); +} +simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::object>::find_field_unordered(std::string_view key) && noexcept { + if (error()) { return error(); } + return std::forward<arm64::ondemand::object>(first).find_field_unordered(key); +} +simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::object>::operator[](std::string_view key) & noexcept { + if (error()) { return error(); } + return first[key]; +} +simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::object>::operator[](std::string_view key) && noexcept { + if (error()) { return error(); } + return std::forward<arm64::ondemand::object>(first)[key]; +} +simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::object>::find_field(std::string_view key) & noexcept { + if (error()) { return error(); } + return first.find_field(key); +} +simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::object>::find_field(std::string_view key) && noexcept { + if (error()) { return error(); } + return std::forward<arm64::ondemand::object>(first).find_field(key); +} + +simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::object>::at_pointer(std::string_view json_pointer) noexcept { + if (error()) { return error(); } + return first.at_pointer(json_pointer); +} + +simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::object>::at_path( + std::string_view json_path) noexcept { + if (error()) { + return error(); + } + return first.at_path(json_path); +} + +simdjson_inline simdjson_result<std::vector<arm64::ondemand::value>> simdjson_result<arm64::ondemand::object>::at_path_with_wildcard(std::string_view json_path) noexcept { + if (error()) { return error(); } + return first.at_path_with_wildcard(json_path); +} + +inline simdjson_result<bool> simdjson_result<arm64::ondemand::object>::reset() noexcept { + if (error()) { return error(); } + return first.reset(); +} + +inline simdjson_result<bool> simdjson_result<arm64::ondemand::object>::is_empty() noexcept { + if (error()) { return error(); } + return first.is_empty(); +} + +simdjson_inline simdjson_result<size_t> simdjson_result<arm64::ondemand::object>::count_fields() & noexcept { + if (error()) { return error(); } + return first.count_fields(); +} + +simdjson_inline simdjson_result<std::string_view> simdjson_result<arm64::ondemand::object>::raw_json() noexcept { + if (error()) { return error(); } + return first.raw_json(); +} + +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_INL_H +/* end file simdjson/generic/ondemand/object-inl.h for arm64 */ +/* including simdjson/generic/ondemand/object_iterator-inl.h for arm64: #include "simdjson/generic/ondemand/object_iterator-inl.h" */ +/* begin file simdjson/generic/ondemand/object_iterator-inl.h for arm64 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_INL_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_INL_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object_iterator.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/field-inl.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator-inl.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace arm64 { +namespace ondemand { + +// +// object_iterator +// + +simdjson_inline object_iterator::object_iterator(const value_iterator &_iter) noexcept + : iter{_iter} +{} + +simdjson_inline simdjson_result<field> object_iterator::operator*() noexcept { +#if SIMDJSON_DEVELOPMENT_CHECKS + // We must call * once per iteration. + SIMDJSON_ASSUME(!has_been_referenced); + has_been_referenced = true; +#endif + error_code error = iter.error(); + if (error) { iter.abandon(); return error; } + auto result = field::start(iter); + // TODO this is a safety rail ... users should exit loops as soon as they receive an error. + // Nonetheless, let's see if performance is OK with this if statement--the compiler may give it to us for free. + if (result.error()) { iter.abandon(); } + return result; +} +simdjson_inline bool object_iterator::operator==(const object_iterator &other) const noexcept { + return !(*this != other); +} +simdjson_inline bool object_iterator::operator!=(const object_iterator &) const noexcept { + return iter.is_open(); +} + +SIMDJSON_PUSH_DISABLE_WARNINGS +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING +simdjson_inline object_iterator &object_iterator::operator++() noexcept { +#if SIMDJSON_DEVELOPMENT_CHECKS + // Before calling ++, we must have called *. + SIMDJSON_ASSUME(has_been_referenced); + has_been_referenced = false; +#endif + // TODO this is a safety rail ... users should exit loops as soon as they receive an error. + // Nonetheless, let's see if performance is OK with this if statement--the compiler may give it to us for free. + if (!iter.is_open()) { return *this; } // Iterator will be released if there is an error + + simdjson_unused error_code error; + if ((error = iter.skip_child() )) { return *this; } + + simdjson_unused bool has_value; + if ((error = iter.has_next_field().get(has_value) )) { return *this; }; + return *this; +} +SIMDJSON_POP_DISABLE_WARNINGS + +// +// ### Live States +// +// While iterating or looking up values, depth >= iter.depth. at_start may vary. Error is +// always SUCCESS: +// +// - Start: This is the state when the object is first found and the iterator is just past the {. +// In this state, at_start == true. +// - Next: After we hand a scalar value to the user, or an array/object which they then fully +// iterate over, the iterator is at the , or } before the next value. In this state, +// depth == iter.depth, at_start == false, and error == SUCCESS. +// - Unfinished Business: When we hand an array/object to the user which they do not fully +// iterate over, we need to finish that iteration by skipping child values until we reach the +// Next state. In this state, depth > iter.depth, at_start == false, and error == SUCCESS. +// +// ## Error States +// +// In error states, we will yield exactly one more value before stopping. iter.depth == depth +// and at_start is always false. We decrement after yielding the error, moving to the Finished +// state. +// +// - Chained Error: When the object iterator is part of an error chain--for example, in +// `for (auto tweet : doc["tweets"])`, where the tweet field may be missing or not be an +// object--we yield that error in the loop, exactly once. In this state, error != SUCCESS and +// iter.depth == depth, and at_start == false. We decrement depth when we yield the error. +// - Missing Comma Error: When the iterator ++ method discovers there is no comma between fields, +// we flag that as an error and treat it exactly the same as a Chained Error. In this state, +// error == TAPE_ERROR, iter.depth == depth, and at_start == false. +// +// Errors that occur while reading a field to give to the user (such as when the key is not a +// string or the field is missing a colon) are yielded immediately. Depth is then decremented, +// moving to the Finished state without transitioning through an Error state at all. +// +// ## Terminal State +// +// The terminal state has iter.depth < depth. at_start is always false. +// +// - Finished: When we have reached a }, we are finished. We signal this by decrementing depth. +// In this state, iter.depth < depth, at_start == false, and error == SUCCESS. +// + +} // namespace ondemand +} // namespace arm64 +} // namespace simdjson + +namespace simdjson { + +simdjson_inline simdjson_result<arm64::ondemand::object_iterator>::simdjson_result( + arm64::ondemand::object_iterator &&value +) noexcept + : implementation_simdjson_result_base<arm64::ondemand::object_iterator>(std::forward<arm64::ondemand::object_iterator>(value)) +{ + first.iter.assert_is_valid(); +} +simdjson_inline simdjson_result<arm64::ondemand::object_iterator>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<arm64::ondemand::object_iterator>({}, error) +{ +} + +simdjson_inline simdjson_result<arm64::ondemand::field> simdjson_result<arm64::ondemand::object_iterator>::operator*() noexcept { + if (error()) { return error(); } + return *first; +} +// If we're iterating and there is an error, return the error once. +simdjson_inline bool simdjson_result<arm64::ondemand::object_iterator>::operator==(const simdjson_result<arm64::ondemand::object_iterator> &other) const noexcept { + if (!first.iter.is_valid()) { return !error(); } + return first == other.first; +} +// If we're iterating and there is an error, return the error once. +simdjson_inline bool simdjson_result<arm64::ondemand::object_iterator>::operator!=(const simdjson_result<arm64::ondemand::object_iterator> &other) const noexcept { + if (!first.iter.is_valid()) { return error(); } + return first != other.first; +} +// Checks for ']' and ',' +simdjson_inline simdjson_result<arm64::ondemand::object_iterator> &simdjson_result<arm64::ondemand::object_iterator>::operator++() noexcept { + // Clear the error if there is one, so we don't yield it twice + if (error()) { second = SUCCESS; return *this; } + ++first; + return *this; +} + +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_INL_H +/* end file simdjson/generic/ondemand/object_iterator-inl.h for arm64 */ +/* including simdjson/generic/ondemand/parser-inl.h for arm64: #include "simdjson/generic/ondemand/parser-inl.h" */ +/* begin file simdjson/generic/ondemand/parser-inl.h for arm64 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_PARSER_INL_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_PARSER_INL_H */ +/* amalgamation skipped (editor-only): #include "simdjson/padded_string.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/padded_string_view.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/implementation.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/internal/dom_parser_implementation.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/dom/base.h" // for MINIMAL_DOCUMENT_CAPACITY */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document_stream.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/parser.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace arm64 { +namespace ondemand { + +simdjson_inline parser::parser(size_t max_capacity) noexcept + : _max_capacity{max_capacity} { +} + +simdjson_warn_unused simdjson_inline error_code parser::allocate(size_t new_capacity, size_t new_max_depth) noexcept { + if (new_capacity > max_capacity()) { return CAPACITY; } + if (string_buf && new_capacity == capacity() && new_max_depth == max_depth()) { return SUCCESS; } + + // string_capacity copied from document::allocate + _capacity = 0; + size_t string_capacity = SIMDJSON_ROUNDUP_N(5 * new_capacity / 3 + SIMDJSON_PADDING, 64); + string_buf.reset(new (std::nothrow) uint8_t[string_capacity]); +#if SIMDJSON_DEVELOPMENT_CHECKS + start_positions.reset(new (std::nothrow) token_position[new_max_depth]); +#endif + if (implementation) { + SIMDJSON_TRY( implementation->set_capacity(new_capacity) ); + SIMDJSON_TRY( implementation->set_max_depth(new_max_depth) ); + } else { + SIMDJSON_TRY( simdjson::get_active_implementation()->create_dom_parser_implementation(new_capacity, new_max_depth, implementation) ); + } + _capacity = new_capacity; + _max_depth = new_max_depth; + return SUCCESS; +} +#if SIMDJSON_DEVELOPMENT_CHECKS +simdjson_inline simdjson_warn_unused bool parser::string_buffer_overflow(const uint8_t *string_buf_loc) const noexcept { + return (string_buf_loc < string_buf.get()) || (size_t(string_buf_loc - string_buf.get()) >= capacity()); +} +#endif + +simdjson_warn_unused simdjson_inline simdjson_result<document> parser::iterate(padded_string_view json) & noexcept { + if (!json.has_sufficient_padding()) { return INSUFFICIENT_PADDING; } + + json.remove_utf8_bom(); + + // Allocate if needed + if (capacity() < json.length() || !string_buf) { + SIMDJSON_TRY( allocate(json.length(), max_depth()) ); + } + + // Run stage 1. + SIMDJSON_TRY( implementation->stage1(reinterpret_cast<const uint8_t *>(json.data()), json.length(), stage1_mode::regular) ); + return document::start({ reinterpret_cast<const uint8_t *>(json.data()), this }); +} + +#ifdef SIMDJSON_EXPERIMENTAL_ALLOW_INCOMPLETE_JSON +simdjson_warn_unused simdjson_inline simdjson_result<document> parser::iterate_allow_incomplete_json(padded_string_view json) & noexcept { + if (!json.has_sufficient_padding()) { return INSUFFICIENT_PADDING; } + + json.remove_utf8_bom(); + + // Allocate if needed + if (capacity() < json.length() || !string_buf) { + SIMDJSON_TRY( allocate(json.length(), max_depth()) ); + } + + // Run stage 1. + const simdjson::error_code err = implementation->stage1(reinterpret_cast<const uint8_t *>(json.data()), json.length(), stage1_mode::regular); + if (err) { + if (err != UNCLOSED_STRING) + return err; + } + return document::start({ reinterpret_cast<const uint8_t *>(json.data()), this, true }); +} +#endif // SIMDJSON_EXPERIMENTAL_ALLOW_INCOMPLETE_JSON + +simdjson_warn_unused simdjson_inline simdjson_result<document> parser::iterate(const char *json, size_t len, size_t allocated) & noexcept { + return iterate(padded_string_view(json, len, allocated)); +} + +simdjson_warn_unused simdjson_inline simdjson_result<document> parser::iterate(const uint8_t *json, size_t len, size_t allocated) & noexcept { + return iterate(padded_string_view(json, len, allocated)); +} + +simdjson_warn_unused simdjson_inline simdjson_result<document> parser::iterate(std::string_view json, size_t allocated) & noexcept { + return iterate(padded_string_view(json, allocated)); +} + +simdjson_warn_unused simdjson_inline simdjson_result<document> parser::iterate(std::string &json) & noexcept { + return iterate(pad_with_reserve(json)); +} + +simdjson_warn_unused simdjson_inline simdjson_result<document> parser::iterate(const std::string &json) & noexcept { + return iterate(padded_string_view(json)); +} + +simdjson_warn_unused simdjson_inline simdjson_result<document> parser::iterate(const simdjson_result<padded_string_view> &result) & noexcept { + // We don't presently have a way to temporarily get a const T& from a simdjson_result<T> without throwing an exception + SIMDJSON_TRY( result.error() ); + padded_string_view json = result.value_unsafe(); + return iterate(json); +} + +simdjson_warn_unused simdjson_inline simdjson_result<document> parser::iterate(const simdjson_result<padded_string> &result) & noexcept { + // We don't presently have a way to temporarily get a const T& from a simdjson_result<T> without throwing an exception + SIMDJSON_TRY( result.error() ); + const padded_string &json = result.value_unsafe(); + return iterate(json); +} + +simdjson_warn_unused simdjson_inline simdjson_result<json_iterator> parser::iterate_raw(padded_string_view json) & noexcept { + if (!json.has_sufficient_padding()) { return INSUFFICIENT_PADDING; } + + json.remove_utf8_bom(); + + // Allocate if needed + if (capacity() < json.length()) { + SIMDJSON_TRY( allocate(json.length(), max_depth()) ); + } + + // Run stage 1. + SIMDJSON_TRY( implementation->stage1(reinterpret_cast<const uint8_t *>(json.data()), json.length(), stage1_mode::regular) ); + return json_iterator(reinterpret_cast<const uint8_t *>(json.data()), this); +} + +inline simdjson_result<document_stream> parser::iterate_many(const uint8_t *buf, size_t len, size_t batch_size, bool allow_comma_separated) noexcept { + // Warning: no check is done on the buffer padding. We trust the user. + if(batch_size < MINIMAL_BATCH_SIZE) { batch_size = MINIMAL_BATCH_SIZE; } + if((len >= 3) && (std::memcmp(buf, "\xEF\xBB\xBF", 3) == 0)) { + buf += 3; + len -= 3; + } + if(allow_comma_separated && batch_size < len) { batch_size = len; } + return document_stream(*this, buf, len, batch_size, allow_comma_separated); +} + +inline simdjson_result<document_stream> parser::iterate_many(const char *buf, size_t len, size_t batch_size, bool allow_comma_separated) noexcept { + // Warning: no check is done on the buffer padding. We trust the user. + return iterate_many(reinterpret_cast<const uint8_t *>(buf), len, batch_size, allow_comma_separated); +} +inline simdjson_result<document_stream> parser::iterate_many(padded_string_view s, size_t batch_size, bool allow_comma_separated) noexcept { + if (!s.has_sufficient_padding()) { return INSUFFICIENT_PADDING; } + return iterate_many(s.data(), s.length(), batch_size, allow_comma_separated); +} +inline simdjson_result<document_stream> parser::iterate_many(const padded_string &s, size_t batch_size, bool allow_comma_separated) noexcept { + return iterate_many(padded_string_view(s), batch_size, allow_comma_separated); +} +inline simdjson_result<document_stream> parser::iterate_many(const std::string &s, size_t batch_size, bool allow_comma_separated) noexcept { + return iterate_many(padded_string_view(s), batch_size, allow_comma_separated); +} +inline simdjson_result<document_stream> parser::iterate_many(std::string &s, size_t batch_size, bool allow_comma_separated) noexcept { + return iterate_many(pad(s), batch_size, allow_comma_separated); +} +simdjson_pure simdjson_inline size_t parser::capacity() const noexcept { + return _capacity; +} +simdjson_pure simdjson_inline size_t parser::max_capacity() const noexcept { + return _max_capacity; +} +simdjson_pure simdjson_inline size_t parser::max_depth() const noexcept { + return _max_depth; +} + +simdjson_inline void parser::set_max_capacity(size_t max_capacity) noexcept { + if(max_capacity < dom::MINIMAL_DOCUMENT_CAPACITY) { + _max_capacity = max_capacity; + } else { + _max_capacity = dom::MINIMAL_DOCUMENT_CAPACITY; + } +} + +simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> parser::unescape(raw_json_string in, uint8_t *&dst, bool allow_replacement) const noexcept { + uint8_t *end = implementation->parse_string(in.buf, dst, allow_replacement); + if (!end) { return STRING_ERROR; } + std::string_view result(reinterpret_cast<const char *>(dst), end-dst); + dst = end; + return result; +} + +simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> parser::unescape_wobbly(raw_json_string in, uint8_t *&dst) const noexcept { + uint8_t *end = implementation->parse_wobbly_string(in.buf, dst); + if (!end) { return STRING_ERROR; } + std::string_view result(reinterpret_cast<const char *>(dst), end-dst); + dst = end; + return result; +} + +simdjson_inline simdjson_warn_unused ondemand::parser& parser::get_parser() { + return *parser::get_parser_instance(); +} + +simdjson_inline bool release_parser() { + auto &parser_instance = parser::get_threadlocal_parser_if_exists(); + if (parser_instance) { + parser_instance.reset(); + return true; + } + return false; +} + +simdjson_inline simdjson_warn_unused std::unique_ptr<ondemand::parser>& parser::get_parser_instance() { + std::unique_ptr<ondemand::parser>& parser_instance = get_threadlocal_parser_if_exists(); + if (!parser_instance) { + parser_instance.reset(new ondemand::parser()); + } + return parser_instance; +} + +simdjson_inline simdjson_warn_unused std::unique_ptr<ondemand::parser>& parser::get_threadlocal_parser_if_exists() { + // @the-moisrex points out that this could be implemented with std::optional (C++17). + thread_local std::unique_ptr<ondemand::parser> parser_instance = nullptr; + return parser_instance; +} + + +} // namespace ondemand +} // namespace arm64 +} // namespace simdjson + +namespace simdjson { + +simdjson_inline simdjson_result<arm64::ondemand::parser>::simdjson_result(arm64::ondemand::parser &&value) noexcept + : implementation_simdjson_result_base<arm64::ondemand::parser>(std::forward<arm64::ondemand::parser>(value)) {} +simdjson_inline simdjson_result<arm64::ondemand::parser>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<arm64::ondemand::parser>(error) {} + +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_ONDEMAND_PARSER_INL_H +/* end file simdjson/generic/ondemand/parser-inl.h for arm64 */ +/* including simdjson/generic/ondemand/raw_json_string-inl.h for arm64: #include "simdjson/generic/ondemand/raw_json_string-inl.h" */ +/* begin file simdjson/generic/ondemand/raw_json_string-inl.h for arm64 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_INL_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_INL_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator-inl.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { + +namespace arm64 { +namespace ondemand { + +simdjson_inline raw_json_string::raw_json_string(const uint8_t * _buf) noexcept : buf{_buf} {} + +simdjson_inline const char * raw_json_string::raw() const noexcept { + return reinterpret_cast<const char *>(buf); +} + +simdjson_inline char raw_json_string::operator[](size_t i) const noexcept { + return reinterpret_cast<const char *>(buf)[i]; +} + +simdjson_inline bool raw_json_string::is_free_from_unescaped_quote(std::string_view target) noexcept { + size_t pos{0}; + while(pos < target.size()) { + pos = target.find('"', pos); + if(pos == std::string_view::npos) { return true; } + if(pos != 0 && target[pos-1] != '\\') { return false; } + if(pos > 1 && target[pos-2] == '\\') { + size_t backslash_count{2}; + for(size_t i = 3; i <= pos; i++) { + if(target[pos-i] == '\\') { backslash_count++; } + else { break; } + } + if(backslash_count % 2 == 0) { return false; } + } + pos++; + } + return true; +} + +simdjson_inline bool raw_json_string::is_free_from_unescaped_quote(const char* target) noexcept { + size_t pos{0}; + while(target[pos]) { + const char * result = strchr(target+pos, '"'); + if(result == nullptr) { return true; } + pos = result - target; + if(pos != 0 && target[pos-1] != '\\') { return false; } + if(pos > 1 && target[pos-2] == '\\') { + size_t backslash_count{2}; + for(size_t i = 3; i <= pos; i++) { + if(target[pos-i] == '\\') { backslash_count++; } + else { break; } + } + if(backslash_count % 2 == 0) { return false; } + } + pos++; + } + return true; +} + + +simdjson_inline bool raw_json_string::unsafe_is_equal(size_t length, std::string_view target) const noexcept { + // If we are going to call memcmp, then we must know something about the length of the raw_json_string. + return (length >= target.size()) && (raw()[target.size()] == '"') && !memcmp(raw(), target.data(), target.size()); +} + +simdjson_inline bool raw_json_string::unsafe_is_equal(std::string_view target) const noexcept { + // Assumptions: does not contain unescaped quote characters("), and + // the raw content is quote terminated within a valid JSON string. + if(target.size() <= SIMDJSON_PADDING) { + return (raw()[target.size()] == '"') && !memcmp(raw(), target.data(), target.size()); + } + const char * r{raw()}; + size_t pos{0}; + for(;pos < target.size();pos++) { + if(r[pos] != target[pos]) { return false; } + } + if(r[pos] != '"') { return false; } + return true; +} + +simdjson_inline bool raw_json_string::is_equal(std::string_view target) const noexcept { + const char * r{raw()}; + size_t pos{0}; + bool escaping{false}; + for(;pos < target.size();pos++) { + if(r[pos] != target[pos]) { return false; } + // if target is a compile-time constant and it is free from + // quotes, then the next part could get optimized away through + // inlining. + if((target[pos] == '"') && !escaping) { + // We have reached the end of the raw_json_string but + // the target is not done. + return false; + } else if(target[pos] == '\\') { + escaping = !escaping; + } else { + escaping = false; + } + } + if(r[pos] != '"') { return false; } + return true; +} + + +simdjson_inline bool raw_json_string::unsafe_is_equal(const char * target) const noexcept { + // Assumptions: 'target' does not contain unescaped quote characters, is null terminated and + // the raw content is quote terminated within a valid JSON string. + const char * r{raw()}; + size_t pos{0}; + for(;target[pos];pos++) { + if(r[pos] != target[pos]) { return false; } + } + if(r[pos] != '"') { return false; } + return true; +} + +simdjson_inline bool raw_json_string::is_equal(const char* target) const noexcept { + // Assumptions: does not contain unescaped quote characters, and + // the raw content is quote terminated within a valid JSON string. + const char * r{raw()}; + size_t pos{0}; + bool escaping{false}; + for(;target[pos];pos++) { + if(r[pos] != target[pos]) { return false; } + // if target is a compile-time constant and it is free from + // quotes, then the next part could get optimized away through + // inlining. + if((target[pos] == '"') && !escaping) { + // We have reached the end of the raw_json_string but + // the target is not done. + return false; + } else if(target[pos] == '\\') { + escaping = !escaping; + } else { + escaping = false; + } + } + if(r[pos] != '"') { return false; } + return true; +} + +simdjson_unused simdjson_inline bool operator==(const raw_json_string &a, std::string_view c) noexcept { + return a.unsafe_is_equal(c); +} + +simdjson_unused simdjson_inline bool operator==(std::string_view c, const raw_json_string &a) noexcept { + return a == c; +} + +simdjson_unused simdjson_inline bool operator!=(const raw_json_string &a, std::string_view c) noexcept { + return !(a == c); +} + +simdjson_unused simdjson_inline bool operator!=(std::string_view c, const raw_json_string &a) noexcept { + return !(a == c); +} + + +simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> raw_json_string::unescape(json_iterator &iter, bool allow_replacement) const noexcept { + return iter.unescape(*this, allow_replacement); +} + +simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> raw_json_string::unescape_wobbly(json_iterator &iter) const noexcept { + return iter.unescape_wobbly(*this); +} + +simdjson_unused simdjson_inline std::ostream &operator<<(std::ostream &out, const raw_json_string &str) noexcept { + bool in_escape = false; + const char *s = str.raw(); + while (true) { + switch (*s) { + case '\\': in_escape = !in_escape; break; + case '"': if (in_escape) { in_escape = false; } else { return out; } break; + default: if (in_escape) { in_escape = false; } + } + out << *s; + s++; + } +} + +} // namespace ondemand +} // namespace arm64 +} // namespace simdjson + +namespace simdjson { + +simdjson_inline simdjson_result<arm64::ondemand::raw_json_string>::simdjson_result(arm64::ondemand::raw_json_string &&value) noexcept + : implementation_simdjson_result_base<arm64::ondemand::raw_json_string>(std::forward<arm64::ondemand::raw_json_string>(value)) {} +simdjson_inline simdjson_result<arm64::ondemand::raw_json_string>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<arm64::ondemand::raw_json_string>(error) {} + +simdjson_inline simdjson_result<const char *> simdjson_result<arm64::ondemand::raw_json_string>::raw() const noexcept { + if (error()) { return error(); } + return first.raw(); +} +simdjson_inline char simdjson_result<arm64::ondemand::raw_json_string>::operator[](size_t i) const noexcept { + if (error()) { return error(); } + return first[i]; +} +simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> simdjson_result<arm64::ondemand::raw_json_string>::unescape(arm64::ondemand::json_iterator &iter, bool allow_replacement) const noexcept { + if (error()) { return error(); } + return first.unescape(iter, allow_replacement); +} +simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> simdjson_result<arm64::ondemand::raw_json_string>::unescape_wobbly(arm64::ondemand::json_iterator &iter) const noexcept { + if (error()) { return error(); } + return first.unescape_wobbly(iter); +} +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_INL_H +/* end file simdjson/generic/ondemand/raw_json_string-inl.h for arm64 */ +/* including simdjson/generic/ondemand/token_iterator-inl.h for arm64: #include "simdjson/generic/ondemand/token_iterator-inl.h" */ +/* begin file simdjson/generic/ondemand/token_iterator-inl.h for arm64 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_INL_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_INL_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/token_iterator.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace arm64 { +namespace ondemand { + +simdjson_inline token_iterator::token_iterator( + const uint8_t *_buf, + token_position position +) noexcept : buf{_buf}, _position{position} +{ +} + +simdjson_inline uint32_t token_iterator::current_offset() const noexcept { + return *(_position); +} + + +simdjson_inline const uint8_t *token_iterator::return_current_and_advance() noexcept { + return &buf[*(_position++)]; +} + +simdjson_inline const uint8_t *token_iterator::peek(token_position position) const noexcept { + return &buf[*position]; +} +simdjson_inline uint32_t token_iterator::peek_index(token_position position) const noexcept { + return *position; +} +simdjson_inline uint32_t token_iterator::peek_length(token_position position) const noexcept { + return *(position+1) - *position; +} + +simdjson_inline uint32_t token_iterator::peek_root_length(token_position position) const noexcept { + return *(position+2) - *(position) > *(position+1) - *(position) ? + *(position+1) - *(position) + : *(position+2) - *(position); +} +simdjson_inline const uint8_t *token_iterator::peek(int32_t delta) const noexcept { + return &buf[*(_position+delta)]; +} +simdjson_inline uint32_t token_iterator::peek_index(int32_t delta) const noexcept { + return *(_position+delta); +} +simdjson_inline uint32_t token_iterator::peek_length(int32_t delta) const noexcept { + return *(_position+delta+1) - *(_position+delta); +} + +simdjson_inline token_position token_iterator::position() const noexcept { + return _position; +} +simdjson_inline void token_iterator::set_position(token_position target_position) noexcept { + _position = target_position; +} + +simdjson_inline bool token_iterator::operator==(const token_iterator &other) const noexcept { + return _position == other._position; +} +simdjson_inline bool token_iterator::operator!=(const token_iterator &other) const noexcept { + return _position != other._position; +} +simdjson_inline bool token_iterator::operator>(const token_iterator &other) const noexcept { + return _position > other._position; +} +simdjson_inline bool token_iterator::operator>=(const token_iterator &other) const noexcept { + return _position >= other._position; +} +simdjson_inline bool token_iterator::operator<(const token_iterator &other) const noexcept { + return _position < other._position; +} +simdjson_inline bool token_iterator::operator<=(const token_iterator &other) const noexcept { + return _position <= other._position; +} + +} // namespace ondemand +} // namespace arm64 +} // namespace simdjson + +namespace simdjson { + +simdjson_inline simdjson_result<arm64::ondemand::token_iterator>::simdjson_result(arm64::ondemand::token_iterator &&value) noexcept + : implementation_simdjson_result_base<arm64::ondemand::token_iterator>(std::forward<arm64::ondemand::token_iterator>(value)) {} +simdjson_inline simdjson_result<arm64::ondemand::token_iterator>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<arm64::ondemand::token_iterator>(error) {} + +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_INL_H +/* end file simdjson/generic/ondemand/token_iterator-inl.h for arm64 */ +/* including simdjson/generic/ondemand/value_iterator-inl.h for arm64: #include "simdjson/generic/ondemand/value_iterator-inl.h" */ +/* begin file simdjson/generic/ondemand/value_iterator-inl.h for arm64 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/atomparsing.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/numberparsing.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type-inl.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string-inl.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace arm64 { +namespace ondemand { + +simdjson_inline value_iterator::value_iterator( + json_iterator *json_iter, + depth_t depth, + token_position start_position +) noexcept : _json_iter{json_iter}, _depth{depth}, _start_position{start_position} +{ +} + +simdjson_warn_unused simdjson_inline simdjson_result<bool> value_iterator::start_object() noexcept { + SIMDJSON_TRY( start_container('{', "Not an object", "object") ); + return started_object(); +} + +simdjson_warn_unused simdjson_inline simdjson_result<bool> value_iterator::start_root_object() noexcept { + SIMDJSON_TRY( start_container('{', "Not an object", "object") ); + return started_root_object(); +} + +simdjson_warn_unused simdjson_inline simdjson_result<bool> value_iterator::started_object() noexcept { + assert_at_container_start(); +#if SIMDJSON_DEVELOPMENT_CHECKS + _json_iter->set_start_position(_depth, start_position()); +#endif + if (*_json_iter->peek() == '}') { + logger::log_value(*_json_iter, "empty object"); + _json_iter->return_current_and_advance(); + SIMDJSON_TRY(end_container()); + return false; + } + return true; +} + +simdjson_warn_unused simdjson_inline error_code value_iterator::check_root_object() noexcept { + // When in streaming mode, we cannot expect peek_last() to be the last structural element of the + // current document. It only works in the normal mode where we have indexed a single document. + // Note that adding a check for 'streaming' is not expensive since we only have at most + // one root element. + if ( ! _json_iter->streaming() ) { + // The following lines do not fully protect against garbage content within the + // object: e.g., `{"a":2} foo }`. Users concerned with garbage content should + // call `at_end()` on the document instance at the end of the processing to + // ensure that the processing has finished at the end. + // + if (*_json_iter->peek_last() != '}') { + _json_iter->abandon(); + return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "missing } at end"); + } + // If the last character is } *and* the first gibberish character is also '}' + // then on-demand could accidentally go over. So we need additional checks. + // https://github.com/simdjson/simdjson/issues/1834 + // Checking that the document is balanced requires a full scan which is potentially + // expensive, but it only happens in edge cases where the first padding character is + // a closing bracket. + if ((*_json_iter->peek(_json_iter->end_position()) == '}') && (!_json_iter->balanced())) { + _json_iter->abandon(); + // The exact error would require more work. It will typically be an unclosed object. + return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "the document is unbalanced"); + } + } + return SUCCESS; +} + +simdjson_warn_unused simdjson_inline simdjson_result<bool> value_iterator::started_root_object() noexcept { + auto error = check_root_object(); + if(error) { return error; } + return started_object(); +} + +simdjson_warn_unused simdjson_inline error_code value_iterator::end_container() noexcept { +#if SIMDJSON_CHECK_EOF + if (depth() > 1 && at_end()) { return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "missing parent ] or }"); } + // if (depth() <= 1 && !at_end()) { return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "missing [ or { at start"); } +#endif // SIMDJSON_CHECK_EOF + _json_iter->ascend_to(depth()-1); + return SUCCESS; +} + +simdjson_warn_unused simdjson_inline simdjson_result<bool> value_iterator::has_next_field() noexcept { + assert_at_next(); + // It's illegal to call this unless there are more tokens: anything that ends in } or ] is + // obligated to verify there are more tokens if they are not the top level. + switch (*_json_iter->return_current_and_advance()) { + case '}': + logger::log_end_value(*_json_iter, "object"); + SIMDJSON_TRY( end_container() ); + return false; + case ',': + return true; + default: + return report_error(TAPE_ERROR, "Missing comma between object fields"); + } +} + +simdjson_warn_unused simdjson_inline simdjson_result<bool> value_iterator::find_field_raw(const std::string_view key) noexcept { + error_code error; + bool has_value; + // + // Initially, the object can be in one of a few different places: + // + // 1. The start of the object, at the first field: + // + // ``` + // { "a": [ 1, 2 ], "b": [ 3, 4 ] } + // ^ (depth 2, index 1) + // ``` + if (at_first_field()) { + has_value = true; + + // + // 2. When a previous search did not yield a value or the object is empty: + // + // ``` + // { "a": [ 1, 2 ], "b": [ 3, 4 ] } + // ^ (depth 0) + // { } + // ^ (depth 0, index 2) + // ``` + // + } else if (!is_open()) { +#if SIMDJSON_DEVELOPMENT_CHECKS + // If we're past the end of the object, we're being iterated out of order. + // Note: this is not perfect detection. It's possible the user is inside some other object; if so, + // this object iterator will blithely scan that object for fields. + if (_json_iter->depth() < depth() - 1) { return OUT_OF_ORDER_ITERATION; } +#endif + return false; + + // 3. When a previous search found a field or an iterator yielded a value: + // + // ``` + // // When a field was not fully consumed (or not even touched at all) + // { "a": [ 1, 2 ], "b": [ 3, 4 ] } + // ^ (depth 2) + // // When a field was fully consumed + // { "a": [ 1, 2 ], "b": [ 3, 4 ] } + // ^ (depth 1) + // // When the last field was fully consumed + // { "a": [ 1, 2 ], "b": [ 3, 4 ] } + // ^ (depth 1) + // ``` + // + } else { + if ((error = skip_child() )) { abandon(); return error; } + if ((error = has_next_field().get(has_value) )) { abandon(); return error; } +#if SIMDJSON_DEVELOPMENT_CHECKS + if (_json_iter->start_position(_depth) != start_position()) { return OUT_OF_ORDER_ITERATION; } +#endif + } + while (has_value) { + // Get the key and colon, stopping at the value. + raw_json_string actual_key; + // size_t max_key_length = _json_iter->peek_length() - 2; // -2 for the two quotes + // Note: _json_iter->peek_length() - 2 might overflow if _json_iter->peek_length() < 2. + // field_key() advances the pointer and checks that '"' is found (corresponding to a key). + // The depth is left unchanged by field_key(). + if ((error = field_key().get(actual_key) )) { abandon(); return error; }; + // field_value() will advance and check that we find a ':' separating the + // key and the value. It will also increment the depth by one. + if ((error = field_value() )) { abandon(); return error; } + // If it matches, stop and return + // We could do it this way if we wanted to allow arbitrary + // key content (including escaped quotes). + //if (actual_key.unsafe_is_equal(max_key_length, key)) { + // Instead we do the following which may trigger buffer overruns if the + // user provides an adversarial key (containing a well placed unescaped quote + // character and being longer than the number of bytes remaining in the JSON + // input). + if (actual_key.unsafe_is_equal(key)) { + logger::log_event(*this, "match", key, -2); + // If we return here, then we return while pointing at the ':' that we just checked. + return true; + } + + // No match: skip the value and see if , or } is next + logger::log_event(*this, "no match", key, -2); + // The call to skip_child is meant to skip over the value corresponding to the key. + // After skip_child(), we are right before the next comma (',') or the final brace ('}'). + SIMDJSON_TRY( skip_child() ); // Skip the value entirely + // The has_next_field() advances the pointer and check that either ',' or '}' is found. + // It returns true if ',' is found, false otherwise. If anything other than ',' or '}' is found, + // then we are in error and we abort. + if ((error = has_next_field().get(has_value) )) { abandon(); return error; } + } + + // If the loop ended, we're out of fields to look at. + return false; +} + +SIMDJSON_PUSH_DISABLE_WARNINGS +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING +simdjson_warn_unused simdjson_inline simdjson_result<bool> value_iterator::find_field_unordered_raw(const std::string_view key) noexcept { + /** + * When find_field_unordered_raw is called, we can either be pointing at the + * first key, pointing outside (at the closing brace) or if a key was matched + * we can be either pointing right afterthe ':' right before the value (that we need skip), + * or we may have consumed the value and we might be at a comma or at the + * final brace (ready for a call to has_next_field()). + */ + error_code error; + bool has_value; + + // First, we scan from that point to the end. + // If we don't find a match, we may loop back around, and scan from the beginning to that point. + token_position search_start = _json_iter->position(); + + // We want to know whether we need to go back to the beginning. + bool at_first = at_first_field(); + /////////////// + // Initially, the object can be in one of a few different places: + // + // 1. At the first key: + // + // ``` + // { "a": [ 1, 2 ], "b": [ 3, 4 ] } + // ^ (depth 2, index 1) + // ``` + // + if (at_first) { + has_value = true; + + // 2. When a previous search did not yield a value or the object is empty: + // + // ``` + // { "a": [ 1, 2 ], "b": [ 3, 4 ] } + // ^ (depth 0) + // { } + // ^ (depth 0, index 2) + // ``` + // + } else if (!is_open()) { + +#if SIMDJSON_DEVELOPMENT_CHECKS + // If we're past the end of the object, we're being iterated out of order. + // Note: this is not perfect detection. It's possible the user is inside some other object; if so, + // this object iterator will blithely scan that object for fields. + if (_json_iter->depth() < depth() - 1) { return OUT_OF_ORDER_ITERATION; } +#endif + SIMDJSON_TRY(reset_object().get(has_value)); + at_first = true; + // 3. When a previous search found a field or an iterator yielded a value: + // + // ``` + // // When a field was not fully consumed (or not even touched at all) + // { "a": [ 1, 2 ], "b": [ 3, 4 ] } + // ^ (depth 2) + // // When a field was fully consumed + // { "a": [ 1, 2 ], "b": [ 3, 4 ] } + // ^ (depth 1) + // // When the last field was fully consumed + // { "a": [ 1, 2 ], "b": [ 3, 4 ] } + // ^ (depth 1) + // ``` + // + } else { + // If someone queried a key but they not did access the value, then we are left pointing + // at the ':' and we need to move forward through the value... If the value was + // processed then skip_child() does not move the iterator (but may adjust the depth). + if ((error = skip_child() )) { abandon(); return error; } + search_start = _json_iter->position(); + if ((error = has_next_field().get(has_value) )) { abandon(); return error; } +#if SIMDJSON_DEVELOPMENT_CHECKS + if (_json_iter->start_position(_depth) != start_position()) { return OUT_OF_ORDER_ITERATION; } +#endif + } + + // After initial processing, we will be in one of two states: + // + // ``` + // // At the beginning of a field + // { "a": [ 1, 2 ], "b": [ 3, 4 ] } + // ^ (depth 1) + // { "a": [ 1, 2 ], "b": [ 3, 4 ] } + // ^ (depth 1) + // // At the end of the object + // { "a": [ 1, 2 ], "b": [ 3, 4 ] } + // ^ (depth 0) + // ``` + // + // Next, we find a match starting from the current position. + while (has_value) { + SIMDJSON_ASSUME( _json_iter->_depth == _depth ); // We must be at the start of a field + + // Get the key and colon, stopping at the value. + raw_json_string actual_key; + // size_t max_key_length = _json_iter->peek_length() - 2; // -2 for the two quotes + // Note: _json_iter->peek_length() - 2 might overflow if _json_iter->peek_length() < 2. + // field_key() advances the pointer and checks that '"' is found (corresponding to a key). + // The depth is left unchanged by field_key(). + if ((error = field_key().get(actual_key) )) { abandon(); return error; }; + // field_value() will advance and check that we find a ':' separating the + // key and the value. It will also increment the depth by one. + if ((error = field_value() )) { abandon(); return error; } + + // If it matches, stop and return + // We could do it this way if we wanted to allow arbitrary + // key content (including escaped quotes). + // if (actual_key.unsafe_is_equal(max_key_length, key)) { + // Instead we do the following which may trigger buffer overruns if the + // user provides an adversarial key (containing a well placed unescaped quote + // character and being longer than the number of bytes remaining in the JSON + // input). + if (actual_key.unsafe_is_equal(key)) { + logger::log_event(*this, "match", key, -2); + // If we return here, then we return while pointing at the ':' that we just checked. + return true; + } + + // No match: skip the value and see if , or } is next + logger::log_event(*this, "no match", key, -2); + // The call to skip_child is meant to skip over the value corresponding to the key. + // After skip_child(), we are right before the next comma (',') or the final brace ('}'). + SIMDJSON_TRY( skip_child() ); + // The has_next_field() advances the pointer and check that either ',' or '}' is found. + // It returns true if ',' is found, false otherwise. If anything other than ',' or '}' is found, + // then we are in error and we abort. + if ((error = has_next_field().get(has_value) )) { abandon(); return error; } + } + // Performance note: it maybe wasteful to rewind to the beginning when there might be + // no other query following. Indeed, it would require reskipping the whole object. + // Instead, you can just stay where you are. If there is a new query, there is always time + // to rewind. + if(at_first) { return false; } + + // If we reach the end without finding a match, search the rest of the fields starting at the + // beginning of the object. + // (We have already run through the object before, so we've already validated its structure. We + // don't check errors in this bit.) + SIMDJSON_TRY(reset_object().get(has_value)); + while (true) { + SIMDJSON_ASSUME(has_value); // we should reach search_start before ever reaching the end of the object + SIMDJSON_ASSUME( _json_iter->_depth == _depth ); // We must be at the start of a field + + // Get the key and colon, stopping at the value. + raw_json_string actual_key; + // size_t max_key_length = _json_iter->peek_length() - 2; // -2 for the two quotes + // Note: _json_iter->peek_length() - 2 might overflow if _json_iter->peek_length() < 2. + // field_key() advances the pointer and checks that '"' is found (corresponding to a key). + // The depth is left unchanged by field_key(). + error = field_key().get(actual_key); SIMDJSON_ASSUME(!error); + // field_value() will advance and check that we find a ':' separating the + // key and the value. It will also increment the depth by one. + error = field_value(); SIMDJSON_ASSUME(!error); + + // If it matches, stop and return + // We could do it this way if we wanted to allow arbitrary + // key content (including escaped quotes). + // if (actual_key.unsafe_is_equal(max_key_length, key)) { + // Instead we do the following which may trigger buffer overruns if the + // user provides an adversarial key (containing a well placed unescaped quote + // character and being longer than the number of bytes remaining in the JSON + // input). + if (actual_key.unsafe_is_equal(key)) { + logger::log_event(*this, "match", key, -2); + // If we return here, then we return while pointing at the ':' that we just checked. + return true; + } + + // No match: skip the value and see if , or } is next + logger::log_event(*this, "no match", key, -2); + // The call to skip_child is meant to skip over the value corresponding to the key. + // After skip_child(), we are right before the next comma (',') or the final brace ('}'). + SIMDJSON_TRY( skip_child() ); + // If we reached the end of the key-value pair we started from, then we know + // that the key is not there so we return false. We are either right before + // the next comma or the final brace. + if(_json_iter->position() == search_start) { return false; } + // The has_next_field() advances the pointer and check that either ',' or '}' is found. + // It returns true if ',' is found, false otherwise. If anything other than ',' or '}' is found, + // then we are in error and we abort. + error = has_next_field().get(has_value); SIMDJSON_ASSUME(!error); + // If we make the mistake of exiting here, then we could be left pointing at a key + // in the middle of an object. That's not an allowable state. + } + // If the loop ended, we're out of fields to look at. The program should + // never reach this point. + return false; +} +SIMDJSON_POP_DISABLE_WARNINGS + +simdjson_warn_unused simdjson_inline simdjson_result<raw_json_string> value_iterator::field_key() noexcept { + assert_at_next(); + + const uint8_t *key = _json_iter->return_current_and_advance(); + if (*(key++) != '"') { return report_error(TAPE_ERROR, "Object key is not a string"); } + return raw_json_string(key); +} + +simdjson_warn_unused simdjson_inline error_code value_iterator::field_value() noexcept { + assert_at_next(); + + if (*_json_iter->return_current_and_advance() != ':') { return report_error(TAPE_ERROR, "Missing colon in object field"); } + _json_iter->descend_to(depth()+1); + return SUCCESS; +} + +simdjson_warn_unused simdjson_inline simdjson_result<bool> value_iterator::start_array() noexcept { + SIMDJSON_TRY( start_container('[', "Not an array", "array") ); + return started_array(); +} + +simdjson_warn_unused simdjson_inline simdjson_result<bool> value_iterator::start_root_array() noexcept { + SIMDJSON_TRY( start_container('[', "Not an array", "array") ); + return started_root_array(); +} + +inline std::string value_iterator::to_string() const noexcept { + auto answer = std::string("value_iterator [ depth : ") + std::to_string(_depth) + std::string(", "); + if(_json_iter != nullptr) { answer += _json_iter->to_string(); } + answer += std::string(" ]"); + return answer; +} + +simdjson_warn_unused simdjson_inline simdjson_result<bool> value_iterator::started_array() noexcept { + assert_at_container_start(); + if (*_json_iter->peek() == ']') { + logger::log_value(*_json_iter, "empty array"); + _json_iter->return_current_and_advance(); + SIMDJSON_TRY( end_container() ); + return false; + } + _json_iter->descend_to(depth()+1); +#if SIMDJSON_DEVELOPMENT_CHECKS + _json_iter->set_start_position(_depth, start_position()); +#endif + return true; +} + +simdjson_warn_unused simdjson_inline error_code value_iterator::check_root_array() noexcept { + // When in streaming mode, we cannot expect peek_last() to be the last structural element of the + // current document. It only works in the normal mode where we have indexed a single document. + // Note that adding a check for 'streaming' is not expensive since we only have at most + // one root element. + if ( ! _json_iter->streaming() ) { + // The following lines do not fully protect against garbage content within the + // array: e.g., `[1, 2] foo]`. Users concerned with garbage content should + // also call `at_end()` on the document instance at the end of the processing to + // ensure that the processing has finished at the end. + // + if (*_json_iter->peek_last() != ']') { + _json_iter->abandon(); + return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "missing ] at end"); + } + // If the last character is ] *and* the first gibberish character is also ']' + // then on-demand could accidentally go over. So we need additional checks. + // https://github.com/simdjson/simdjson/issues/1834 + // Checking that the document is balanced requires a full scan which is potentially + // expensive, but it only happens in edge cases where the first padding character is + // a closing bracket. + if ((*_json_iter->peek(_json_iter->end_position()) == ']') && (!_json_iter->balanced())) { + _json_iter->abandon(); + // The exact error would require more work. It will typically be an unclosed array. + return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "the document is unbalanced"); + } + } + return SUCCESS; +} + +simdjson_warn_unused simdjson_inline simdjson_result<bool> value_iterator::started_root_array() noexcept { + auto error = check_root_array(); + if (error) { return error; } + return started_array(); +} + +simdjson_warn_unused simdjson_inline simdjson_result<bool> value_iterator::has_next_element() noexcept { + assert_at_next(); + + logger::log_event(*this, "has_next_element"); + switch (*_json_iter->return_current_and_advance()) { + case ']': + logger::log_end_value(*_json_iter, "array"); + SIMDJSON_TRY( end_container() ); + return false; + case ',': + _json_iter->descend_to(depth()+1); + return true; + default: + return report_error(TAPE_ERROR, "Missing comma between array elements"); + } +} + +simdjson_warn_unused simdjson_inline simdjson_result<bool> value_iterator::parse_bool(const uint8_t *json) const noexcept { + auto not_true = atomparsing::str4ncmp(json, "true"); + auto not_false = atomparsing::str4ncmp(json, "fals") | (json[4] ^ 'e'); + bool error = (not_true && not_false) || jsoncharutils::is_not_structural_or_whitespace(json[not_true ? 5 : 4]); + if (error) { return incorrect_type_error("Not a boolean"); } + return simdjson_result<bool>(!not_true); +} +simdjson_warn_unused simdjson_inline simdjson_result<bool> value_iterator::parse_null(const uint8_t *json) const noexcept { + bool is_null_string = !atomparsing::str4ncmp(json, "null") && jsoncharutils::is_structural_or_whitespace(json[4]); + // if we start with 'n', we must be a null + if(!is_null_string && json[0]=='n') { return incorrect_type_error("Not a null but starts with n"); } + return is_null_string; +} + +simdjson_warn_unused simdjson_inline simdjson_result<std::string_view> value_iterator::get_string(bool allow_replacement) noexcept { + return get_raw_json_string().unescape(json_iter(), allow_replacement); +} +template <typename string_type> +simdjson_warn_unused simdjson_inline error_code value_iterator::get_string(string_type& receiver, bool allow_replacement) noexcept { + std::string_view content; + // Save the string buffer location so that we can restore it after get_string + auto saved_string_buf_loc = _json_iter->string_buf_loc(); + auto err = get_string(allow_replacement).get(content); + if (err) { return err; } + receiver = content; + // Restore the string buffer location, effectively discarding any temporary string storage + _json_iter->string_buf_loc() = saved_string_buf_loc; + return SUCCESS; +} +simdjson_warn_unused simdjson_inline simdjson_result<std::string_view> value_iterator::get_wobbly_string() noexcept { + return get_raw_json_string().unescape_wobbly(json_iter()); +} +simdjson_warn_unused simdjson_inline simdjson_result<raw_json_string> value_iterator::get_raw_json_string() noexcept { + auto json = peek_scalar("string"); + if (*json != '"') { return incorrect_type_error("Not a string"); } + advance_scalar("string"); + return raw_json_string(json+1); +} +simdjson_warn_unused simdjson_inline simdjson_result<uint64_t> value_iterator::get_uint64() noexcept { + auto result = numberparsing::parse_unsigned(peek_non_root_scalar("uint64")); + if(result.error() == SUCCESS) { advance_non_root_scalar("uint64"); } + return result; +} +simdjson_warn_unused simdjson_inline simdjson_result<uint64_t> value_iterator::get_uint64_in_string() noexcept { + auto result = numberparsing::parse_unsigned_in_string(peek_non_root_scalar("uint64")); + if(result.error() == SUCCESS) { advance_non_root_scalar("uint64"); } + return result; +} +simdjson_warn_unused simdjson_inline simdjson_result<int64_t> value_iterator::get_int64() noexcept { + auto result = numberparsing::parse_integer(peek_non_root_scalar("int64")); + if(result.error() == SUCCESS) { advance_non_root_scalar("int64"); } + return result; +} +simdjson_warn_unused simdjson_inline simdjson_result<int64_t> value_iterator::get_int64_in_string() noexcept { + auto result = numberparsing::parse_integer_in_string(peek_non_root_scalar("int64")); + if(result.error() == SUCCESS) { advance_non_root_scalar("int64"); } + return result; +} +simdjson_warn_unused simdjson_inline simdjson_result<double> value_iterator::get_double() noexcept { + auto result = numberparsing::parse_double(peek_non_root_scalar("double")); + if(result.error() == SUCCESS) { advance_non_root_scalar("double"); } + return result; +} +simdjson_warn_unused simdjson_inline simdjson_result<double> value_iterator::get_double_in_string() noexcept { + auto result = numberparsing::parse_double_in_string(peek_non_root_scalar("double")); + if(result.error() == SUCCESS) { advance_non_root_scalar("double"); } + return result; +} +simdjson_warn_unused simdjson_inline simdjson_result<bool> value_iterator::get_bool() noexcept { + auto result = parse_bool(peek_non_root_scalar("bool")); + if(result.error() == SUCCESS) { advance_non_root_scalar("bool"); } + return result; +} +simdjson_inline simdjson_result<bool> value_iterator::is_null() noexcept { + bool is_null_value; + SIMDJSON_TRY(parse_null(peek_non_root_scalar("null")).get(is_null_value)); + if(is_null_value) { advance_non_root_scalar("null"); } + return is_null_value; +} +simdjson_inline bool value_iterator::is_negative() noexcept { + return numberparsing::is_negative(peek_non_root_scalar("numbersign")); +} +simdjson_inline bool value_iterator::is_root_negative() noexcept { + return numberparsing::is_negative(peek_root_scalar("numbersign")); +} +simdjson_inline simdjson_result<bool> value_iterator::is_integer() noexcept { + return numberparsing::is_integer(peek_non_root_scalar("integer")); +} +simdjson_inline simdjson_result<number_type> value_iterator::get_number_type() noexcept { + return numberparsing::get_number_type(peek_non_root_scalar("integer")); +} +simdjson_inline simdjson_result<number> value_iterator::get_number() noexcept { + number num; + error_code error = numberparsing::parse_number(peek_non_root_scalar("number"), num); + if(error) { return error; } + return num; +} + +simdjson_inline simdjson_result<bool> value_iterator::is_root_integer(bool check_trailing) noexcept { + auto max_len = peek_root_length(); + auto json = peek_root_scalar("is_root_integer"); + uint8_t tmpbuf[20+1+1]{}; // <20 digits> is the longest possible unsigned integer + tmpbuf[20+1] = '\0'; // make sure that buffer is always null terminated. + if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 20+1)) { + return false; // if there are more than 20 characters, it cannot be represented as an integer. + } + auto answer = numberparsing::is_integer(tmpbuf); + // If the parsing was a success, we must still check that it is + // a single scalar. Note that we parse first because of cases like '[]' where + // getting TRAILING_CONTENT is wrong. + if(check_trailing && (answer.error() == SUCCESS) && (!_json_iter->is_single_token())) { return TRAILING_CONTENT; } + return answer; +} + +simdjson_inline simdjson_result<arm64::number_type> value_iterator::get_root_number_type(bool check_trailing) noexcept { + auto max_len = peek_root_length(); + auto json = peek_root_scalar("number"); + // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/, + // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest + // number: -0.<fraction>e-308. + uint8_t tmpbuf[1074+8+1+1]; + tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated. + if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) { + if(numberparsing::check_if_integer(json, max_len)) { + if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } + logger::log_error(*_json_iter, start_position(), depth(), "Found big integer"); + return number_type::big_integer; + } + logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters and not a big integer"); + return NUMBER_ERROR; + } + auto answer = numberparsing::get_number_type(tmpbuf); + if (check_trailing && (answer.error() == SUCCESS) && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } + return answer; +} +simdjson_inline simdjson_result<number> value_iterator::get_root_number(bool check_trailing) noexcept { + auto max_len = peek_root_length(); + auto json = peek_root_scalar("number"); + // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/, + // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest + // number: -0.<fraction>e-308. + // NOTE: the current approach doesn't work for very big integer numbers containing more than 1074 digits. + uint8_t tmpbuf[1074+8+1+1]; + tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated. + if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) { + if(numberparsing::check_if_integer(json, max_len)) { + if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } + logger::log_error(*_json_iter, start_position(), depth(), "Found big integer"); + return BIGINT_ERROR; + } + logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters and not a big integer"); + return NUMBER_ERROR; + } + number num; + error_code error = numberparsing::parse_number(tmpbuf, num); + if(error) { return error; } + if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } + advance_root_scalar("number"); + return num; +} +simdjson_warn_unused simdjson_inline simdjson_result<std::string_view> value_iterator::get_root_string(bool check_trailing, bool allow_replacement) noexcept { + return get_root_raw_json_string(check_trailing).unescape(json_iter(), allow_replacement); +} +template <typename string_type> +simdjson_warn_unused simdjson_inline error_code value_iterator::get_root_string(string_type& receiver, bool check_trailing, bool allow_replacement) noexcept { + std::string_view content; + // Save the string buffer location so that we can restore it after get_string + auto saved_string_buf_loc = _json_iter->string_buf_loc(); + auto err = get_root_string(check_trailing, allow_replacement).get(content); + if (err) { return err; } + receiver = content; + // Restore the string buffer location, effectively discarding any temporary string storage + _json_iter->string_buf_loc() = saved_string_buf_loc; + return SUCCESS; +} +simdjson_warn_unused simdjson_inline simdjson_result<std::string_view> value_iterator::get_root_wobbly_string(bool check_trailing) noexcept { + return get_root_raw_json_string(check_trailing).unescape_wobbly(json_iter()); +} +simdjson_warn_unused simdjson_inline simdjson_result<raw_json_string> value_iterator::get_root_raw_json_string(bool check_trailing) noexcept { + auto json = peek_scalar("string"); + if (*json != '"') { return incorrect_type_error("Not a string"); } + if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } + advance_scalar("string"); + return raw_json_string(json+1); +} +simdjson_warn_unused simdjson_inline simdjson_result<uint64_t> value_iterator::get_root_uint64(bool check_trailing) noexcept { + auto max_len = peek_root_length(); + auto json = peek_root_scalar("uint64"); + uint8_t tmpbuf[20+1+1]{}; // <20 digits> is the longest possible unsigned integer + tmpbuf[20+1] = '\0'; // make sure that buffer is always null terminated. + if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 20+1)) { + logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 20 characters"); + return NUMBER_ERROR; + } + auto result = numberparsing::parse_unsigned(tmpbuf); + if(result.error() == SUCCESS) { + if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } + advance_root_scalar("uint64"); + } + return result; +} +simdjson_warn_unused simdjson_inline simdjson_result<uint64_t> value_iterator::get_root_uint64_in_string(bool check_trailing) noexcept { + auto max_len = peek_root_length(); + auto json = peek_root_scalar("uint64"); + uint8_t tmpbuf[20+1+1]{}; // <20 digits> is the longest possible unsigned integer + tmpbuf[20+1] = '\0'; // make sure that buffer is always null terminated. + if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 20+1)) { + logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 20 characters"); + return NUMBER_ERROR; + } + auto result = numberparsing::parse_unsigned_in_string(tmpbuf); + if(result.error() == SUCCESS) { + if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } + advance_root_scalar("uint64"); + } + return result; +} +simdjson_warn_unused simdjson_inline simdjson_result<int64_t> value_iterator::get_root_int64(bool check_trailing) noexcept { + auto max_len = peek_root_length(); + auto json = peek_root_scalar("int64"); + uint8_t tmpbuf[20+1+1]; // -<19 digits> is the longest possible integer + tmpbuf[20+1] = '\0'; // make sure that buffer is always null terminated. + if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 20+1)) { + logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 20 characters"); + return NUMBER_ERROR; + } + + auto result = numberparsing::parse_integer(tmpbuf); + if(result.error() == SUCCESS) { + if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } + advance_root_scalar("int64"); + } + return result; +} +simdjson_warn_unused simdjson_inline simdjson_result<int64_t> value_iterator::get_root_int64_in_string(bool check_trailing) noexcept { + auto max_len = peek_root_length(); + auto json = peek_root_scalar("int64"); + uint8_t tmpbuf[20+1+1]; // -<19 digits> is the longest possible integer + tmpbuf[20+1] = '\0'; // make sure that buffer is always null terminated. + if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 20+1)) { + logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 20 characters"); + return NUMBER_ERROR; + } + + auto result = numberparsing::parse_integer_in_string(tmpbuf); + if(result.error() == SUCCESS) { + if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } + advance_root_scalar("int64"); + } + return result; +} +simdjson_warn_unused simdjson_inline simdjson_result<double> value_iterator::get_root_double(bool check_trailing) noexcept { + auto max_len = peek_root_length(); + auto json = peek_root_scalar("double"); + // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/, + // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest + // number: -0.<fraction>e-308. + uint8_t tmpbuf[1074+8+1+1]; // +1 for null termination. + tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated. + if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) { + logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters"); + return NUMBER_ERROR; + } + auto result = numberparsing::parse_double(tmpbuf); + if(result.error() == SUCCESS) { + if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } + advance_root_scalar("double"); + } + return result; +} + +simdjson_warn_unused simdjson_inline simdjson_result<double> value_iterator::get_root_double_in_string(bool check_trailing) noexcept { + auto max_len = peek_root_length(); + auto json = peek_root_scalar("double"); + // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/, + // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest + // number: -0.<fraction>e-308. + uint8_t tmpbuf[1074+8+1+1]; // +1 for null termination. + tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated. + if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) { + logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters"); + return NUMBER_ERROR; + } + auto result = numberparsing::parse_double_in_string(tmpbuf); + if(result.error() == SUCCESS) { + if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } + advance_root_scalar("double"); + } + return result; +} + +simdjson_warn_unused simdjson_inline simdjson_result<bool> value_iterator::get_root_bool(bool check_trailing) noexcept { + auto max_len = peek_root_length(); + auto json = peek_root_scalar("bool"); + // We have a boolean if we have either "true" or "false" and the next character is either + // a structural character or whitespace. We also check that the length is correct: + // "true" and "false" are 4 and 5 characters long, respectively. + bool value_true = (max_len >= 4 && !atomparsing::str4ncmp(json, "true") && + (max_len == 4 || jsoncharutils::is_structural_or_whitespace(json[4]))); + bool value_false = (max_len >= 5 && !atomparsing::str4ncmp(json, "false") && + (max_len == 5 || jsoncharutils::is_structural_or_whitespace(json[5]))); + if(value_true == false && value_false == false) { return incorrect_type_error("Not a boolean"); } + if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } + advance_root_scalar("bool"); + return value_true; +} + +simdjson_inline simdjson_result<bool> value_iterator::is_root_null(bool check_trailing) noexcept { + auto max_len = peek_root_length(); + auto json = peek_root_scalar("null"); + bool result = (max_len >= 4 && !atomparsing::str4ncmp(json, "null") && + (max_len == 4 || jsoncharutils::is_structural_or_whitespace(json[4]))); + if(result) { // we have something that looks like a null. + if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } + advance_root_scalar("null"); + } else if (json[0] == 'n') { + return incorrect_type_error("Not a null but starts with n"); + } + return result; +} + +simdjson_warn_unused simdjson_inline error_code value_iterator::skip_child() noexcept { + SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); + SIMDJSON_ASSUME( _json_iter->_depth >= _depth ); + + return _json_iter->skip_child(depth()); +} + +simdjson_inline value_iterator value_iterator::child() const noexcept { + assert_at_child(); + return { _json_iter, depth()+1, _json_iter->token.position() }; +} + +// GCC 7 warns when the first line of this function is inlined away into oblivion due to the caller +// relating depth and iterator depth, which is a desired effect. It does not happen if is_open is +// marked non-inline. +SIMDJSON_PUSH_DISABLE_WARNINGS +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING +simdjson_inline bool value_iterator::is_open() const noexcept { + return _json_iter->depth() >= depth(); +} +SIMDJSON_POP_DISABLE_WARNINGS + +simdjson_inline bool value_iterator::at_end() const noexcept { + return _json_iter->at_end(); +} + +simdjson_inline bool value_iterator::at_start() const noexcept { + return _json_iter->token.position() == start_position(); +} + +simdjson_inline bool value_iterator::at_first_field() const noexcept { + SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); + return _json_iter->token.position() == start_position() + 1; +} + +simdjson_inline void value_iterator::abandon() noexcept { + _json_iter->abandon(); +} + +simdjson_warn_unused simdjson_inline depth_t value_iterator::depth() const noexcept { + return _depth; +} +simdjson_warn_unused simdjson_inline error_code value_iterator::error() const noexcept { + return _json_iter->error; +} +simdjson_warn_unused simdjson_inline uint8_t *&value_iterator::string_buf_loc() noexcept { + return _json_iter->string_buf_loc(); +} +simdjson_warn_unused simdjson_inline const json_iterator &value_iterator::json_iter() const noexcept { + return *_json_iter; +} +simdjson_warn_unused simdjson_inline json_iterator &value_iterator::json_iter() noexcept { + return *_json_iter; +} + +simdjson_inline const uint8_t *value_iterator::peek_start() const noexcept { + return _json_iter->peek(start_position()); +} +simdjson_inline uint32_t value_iterator::peek_start_length() const noexcept { + return _json_iter->peek_length(start_position()); +} +simdjson_inline uint32_t value_iterator::peek_root_length() const noexcept { + return _json_iter->peek_root_length(start_position()); +} + +simdjson_inline const uint8_t *value_iterator::peek_scalar(const char *type) noexcept { + logger::log_value(*_json_iter, start_position(), depth(), type); + // If we're not at the position anymore, we don't want to advance the cursor. + if (!is_at_start()) { return peek_start(); } + + // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value. + assert_at_start(); + return _json_iter->peek(); +} + +simdjson_inline void value_iterator::advance_scalar(const char *type) noexcept { + logger::log_value(*_json_iter, start_position(), depth(), type); + // If we're not at the position anymore, we don't want to advance the cursor. + if (!is_at_start()) { return; } + + // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value. + assert_at_start(); + _json_iter->return_current_and_advance(); + _json_iter->ascend_to(depth()-1); +} + +simdjson_warn_unused simdjson_inline error_code value_iterator::start_container(uint8_t start_char, const char *incorrect_type_message, const char *type) noexcept { + logger::log_start_value(*_json_iter, start_position(), depth(), type); + // If we're not at the position anymore, we don't want to advance the cursor. + const uint8_t *json; + if (!is_at_start()) { +#if SIMDJSON_DEVELOPMENT_CHECKS + if (!is_at_iterator_start()) { return OUT_OF_ORDER_ITERATION; } +#endif + json = peek_start(); + if (*json != start_char) { return incorrect_type_error(incorrect_type_message); } + } else { + assert_at_start(); + /** + * We should be prudent. Let us peek. If it is not the right type, we + * return an error. Only once we have determined that we have the right + * type are we allowed to advance! + */ + json = _json_iter->peek(); + if (*json != start_char) { return incorrect_type_error(incorrect_type_message); } + _json_iter->return_current_and_advance(); + } + + + return SUCCESS; +} + + +simdjson_inline const uint8_t *value_iterator::peek_root_scalar(const char *type) noexcept { + logger::log_value(*_json_iter, start_position(), depth(), type); + if (!is_at_start()) { return peek_start(); } + + assert_at_root(); + return _json_iter->peek(); +} +simdjson_inline const uint8_t *value_iterator::peek_non_root_scalar(const char *type) noexcept { + logger::log_value(*_json_iter, start_position(), depth(), type); + if (!is_at_start()) { return peek_start(); } + + assert_at_non_root_start(); + return _json_iter->peek(); +} + +simdjson_inline void value_iterator::advance_root_scalar(const char *type) noexcept { + logger::log_value(*_json_iter, start_position(), depth(), type); + if (!is_at_start()) { return; } + + assert_at_root(); + _json_iter->return_current_and_advance(); + _json_iter->ascend_to(depth()-1); +} +simdjson_inline void value_iterator::advance_non_root_scalar(const char *type) noexcept { + logger::log_value(*_json_iter, start_position(), depth(), type); + if (!is_at_start()) { return; } + + assert_at_non_root_start(); + _json_iter->return_current_and_advance(); + _json_iter->ascend_to(depth()-1); +} + +simdjson_inline error_code value_iterator::incorrect_type_error(const char *message) const noexcept { + logger::log_error(*_json_iter, start_position(), depth(), message); + return INCORRECT_TYPE; +} + +simdjson_inline bool value_iterator::is_at_start() const noexcept { + return position() == start_position(); +} + +simdjson_inline bool value_iterator::is_at_key() const noexcept { + // Keys are at the same depth as the object. + // Note here that we could be safer and check that we are within an object, + // but we do not. + // + // As long as we are at the object's depth, in a valid document, + // we will only ever be at { , : or the actual string key: ". + return _depth == _json_iter->_depth && *_json_iter->peek() == '"'; +} + +simdjson_inline bool value_iterator::is_at_iterator_start() const noexcept { + // We can legitimately be either at the first value ([1]), or after the array if it's empty ([]). + auto delta = position() - start_position(); + return delta == 1 || delta == 2; +} + +inline void value_iterator::assert_at_start() const noexcept { + SIMDJSON_ASSUME( _json_iter->token._position == _start_position ); + SIMDJSON_ASSUME( _json_iter->_depth == _depth ); + SIMDJSON_ASSUME( _depth > 0 ); +} + +inline void value_iterator::assert_at_container_start() const noexcept { + SIMDJSON_ASSUME( _json_iter->token._position == _start_position + 1 ); + SIMDJSON_ASSUME( _json_iter->_depth == _depth ); + SIMDJSON_ASSUME( _depth > 0 ); +} + +inline void value_iterator::assert_at_next() const noexcept { + SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); + SIMDJSON_ASSUME( _json_iter->_depth == _depth ); + SIMDJSON_ASSUME( _depth > 0 ); +} + +simdjson_inline void value_iterator::move_at_start() noexcept { + _json_iter->_depth = _depth; + _json_iter->token.set_position(_start_position); +} + +simdjson_inline void value_iterator::move_at_container_start() noexcept { + _json_iter->_depth = _depth; + _json_iter->token.set_position(_start_position + 1); +} + +simdjson_inline simdjson_result<bool> value_iterator::reset_array() noexcept { + if(error()) { return error(); } + move_at_container_start(); + return started_array(); +} + +simdjson_inline simdjson_result<bool> value_iterator::reset_object() noexcept { + if(error()) { return error(); } + move_at_container_start(); + return started_object(); +} + +inline void value_iterator::assert_at_child() const noexcept { + SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); + SIMDJSON_ASSUME( _json_iter->_depth == _depth + 1 ); + SIMDJSON_ASSUME( _depth > 0 ); +} + +inline void value_iterator::assert_at_root() const noexcept { + assert_at_start(); + SIMDJSON_ASSUME( _depth == 1 ); +} + +inline void value_iterator::assert_at_non_root_start() const noexcept { + assert_at_start(); + SIMDJSON_ASSUME( _depth > 1 ); +} + +inline void value_iterator::assert_is_valid() const noexcept { + SIMDJSON_ASSUME( _json_iter != nullptr ); +} + +simdjson_inline bool value_iterator::is_valid() const noexcept { + return _json_iter != nullptr; +} + +simdjson_inline simdjson_result<json_type> value_iterator::type() const noexcept { + switch (*peek_start()) { + case '{': + return json_type::object; + case '[': + return json_type::array; + case '"': + return json_type::string; + case 'n': + return json_type::null; + case 't': case 'f': + return json_type::boolean; + case '-': + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + return json_type::number; + default: + return json_type::unknown; + } +} + +simdjson_inline token_position value_iterator::start_position() const noexcept { + return _start_position; +} + +simdjson_inline token_position value_iterator::position() const noexcept { + return _json_iter->position(); +} + +simdjson_inline token_position value_iterator::end_position() const noexcept { + return _json_iter->end_position(); +} + +simdjson_inline token_position value_iterator::last_position() const noexcept { + return _json_iter->last_position(); +} + +simdjson_inline error_code value_iterator::report_error(error_code error, const char *message) noexcept { + return _json_iter->report_error(error, message); +} + +} // namespace ondemand +} // namespace arm64 +} // namespace simdjson + +namespace simdjson { + +simdjson_inline simdjson_result<arm64::ondemand::value_iterator>::simdjson_result(arm64::ondemand::value_iterator &&value) noexcept + : implementation_simdjson_result_base<arm64::ondemand::value_iterator>(std::forward<arm64::ondemand::value_iterator>(value)) {} +simdjson_inline simdjson_result<arm64::ondemand::value_iterator>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<arm64::ondemand::value_iterator>(error) {} + +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H +/* end file simdjson/generic/ondemand/value_iterator-inl.h for arm64 */ +/* including simdjson/generic/ondemand/serialization-inl.h for arm64: #include "simdjson/generic/ondemand/serialization-inl.h" */ +/* begin file simdjson/generic/ondemand/serialization-inl.h for arm64 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document-inl.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/serialization.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */ +/* amalgamation skipped (editor-only): #if SIMDJSON_STATIC_REFLECTION */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_builder.h" */ +/* amalgamation skipped (editor-only): #endif */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { + +inline std::string_view trim(const std::string_view str) noexcept { + // We can almost surely do better by rolling our own find_first_not_of function. + size_t first = str.find_first_not_of(" \t\n\r"); + // If we have the empty string (just white space), then no trimming is possible, and + // we return the empty string_view. + if (std::string_view::npos == first) { return std::string_view(); } + size_t last = str.find_last_not_of(" \t\n\r"); + return str.substr(first, (last - first + 1)); +} + + +inline simdjson_result<std::string_view> to_json_string(arm64::ondemand::document& x) noexcept { + std::string_view v; + auto error = x.raw_json().get(v); + if(error) {return error; } + return trim(v); +} + +inline simdjson_result<std::string_view> to_json_string(arm64::ondemand::document_reference& x) noexcept { + std::string_view v; + auto error = x.raw_json().get(v); + if(error) {return error; } + return trim(v); +} + +inline simdjson_result<std::string_view> to_json_string(arm64::ondemand::value& x) noexcept { + /** + * If we somehow receive a value that has already been consumed, + * then the following code could be in trouble. E.g., we create + * an array as needed, but if an array was already created, then + * it could be bad. + */ + using namespace arm64::ondemand; + arm64::ondemand::json_type t; + auto error = x.type().get(t); + if(error != SUCCESS) { return error; } + switch (t) + { + case json_type::array: + { + arm64::ondemand::array array; + error = x.get_array().get(array); + if(error) { return error; } + return to_json_string(array); + } + case json_type::object: + { + arm64::ondemand::object object; + error = x.get_object().get(object); + if(error) { return error; } + return to_json_string(object); + } + default: + return trim(x.raw_json_token()); + } +} + +inline simdjson_result<std::string_view> to_json_string(arm64::ondemand::object& x) noexcept { + std::string_view v; + auto error = x.raw_json().get(v); + if(error) {return error; } + return trim(v); +} + +inline simdjson_result<std::string_view> to_json_string(arm64::ondemand::array& x) noexcept { + std::string_view v; + auto error = x.raw_json().get(v); + if(error) {return error; } + return trim(v); +} + +inline simdjson_result<std::string_view> to_json_string(simdjson_result<arm64::ondemand::document> x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); +} + +inline simdjson_result<std::string_view> to_json_string(simdjson_result<arm64::ondemand::document_reference> x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); +} + +inline simdjson_result<std::string_view> to_json_string(simdjson_result<arm64::ondemand::value> x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); +} + +inline simdjson_result<std::string_view> to_json_string(simdjson_result<arm64::ondemand::object> x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); +} + +inline simdjson_result<std::string_view> to_json_string(simdjson_result<arm64::ondemand::array> x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); +} +} // namespace simdjson + +namespace simdjson { namespace arm64 { namespace ondemand { + +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::arm64::ondemand::value x) { + std::string_view v; + auto error = simdjson::to_json_string(x).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + throw simdjson::simdjson_error(error); + } +} +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::arm64::ondemand::value> x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); +} +#else +inline std::ostream& operator<<(std::ostream& out, simdjson::arm64::ondemand::value x) { + std::string_view v; + auto error = simdjson::to_json_string(x).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + return (out << error); + } +} +#endif + +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::arm64::ondemand::array value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + throw simdjson::simdjson_error(error); + } +} +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::arm64::ondemand::array> x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); +} +#else +inline std::ostream& operator<<(std::ostream& out, simdjson::arm64::ondemand::array value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + return (out << error); + } +} +#endif + +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::arm64::ondemand::document& value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + throw simdjson::simdjson_error(error); + } +} +inline std::ostream& operator<<(std::ostream& out, simdjson::arm64::ondemand::document_reference& value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + throw simdjson::simdjson_error(error); + } +} +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::arm64::ondemand::document>&& x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); +} +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::arm64::ondemand::document_reference>&& x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); +} +#else +inline std::ostream& operator<<(std::ostream& out, simdjson::arm64::ondemand::document& value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + return (out << error); + } +} +#endif + +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::arm64::ondemand::object value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + throw simdjson::simdjson_error(error); + } +} +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::arm64::ondemand::object> x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); +} +#else +inline std::ostream& operator<<(std::ostream& out, simdjson::arm64::ondemand::object value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + return (out << error); + } +} +#endif +}}} // namespace simdjson::arm64::ondemand + +#endif // SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H +/* end file simdjson/generic/ondemand/serialization-inl.h for arm64 */ + +// JSON path accessor (compile-time) - must be after inline definitions +/* including simdjson/generic/ondemand/compile_time_accessors.h for arm64: #include "simdjson/generic/ondemand/compile_time_accessors.h" */ +/* begin file simdjson/generic/ondemand/compile_time_accessors.h for arm64 */ +/** + * Compile-time JSON Path and JSON Pointer accessors using C++26 reflection (P2996) + * + * This file validates JSON paths/pointers against struct definitions at compile time + * and generates optimized accessor code with zero runtime overhead. + * + * ## How It Works + * + * **Compile Time**: Path is parsed, validated against struct, types are checked + * **Runtime**: Direct navigation with no parsing or validation overhead + * + * Example: + * ```cpp + * struct User { std::string name; std::vector<std::string> emails; }; + * + * std::string email; + * path_accessor<User, ".emails[0]">::extract_field(doc, email); + * + * // Compile time validates: + * // 1. User has "emails" field + * // 2. "emails" is array-like + * // 3. Element type is std::string + * // 4. static_assert(^^std::string == ^^std::string) + * + * // Runtime just navigates: + * // doc.get_object().find_field("emails").get_array().at(0).get(email) + * ``` + * + * ## Key Reflection APIs + * + * - `^^Type`: Reflect operator, converts type to std::meta::info + * - `std::meta::nonstatic_data_members_of(type)`: Get all fields of a struct + * - `std::meta::identifier_of(member)`: Get field name as string_view + * - `std::meta::type_of(member)`: Get reflected type of a field + * - `std::meta::is_array_type(type)`: Check if C-style array + * - `std::meta::remove_extent(array)`: Extract element type from array + * - `std::meta::members_of(type)`: Get all members including typedefs + * - `std::meta::is_type(member)`: Check if member is a type (vs field) + * + * All operations execute at compile time in consteval contexts. + */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_COMPILE_TIME_ACCESSORS_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_COMPILE_TIME_ACCESSORS_H */ +/* amalgamation skipped (editor-only): */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +// Arguably, we should just check SIMDJSON_STATIC_REFLECTION since it +// is unlikely that we will have reflection support without concepts support. +#if SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION + +#include <string_view> +#include <cstddef> +#include <array> + +namespace simdjson { +namespace arm64 { +namespace ondemand { +/*** + * JSONPath implementation for compile-time access + * RFC 9535 JSONPath: Query Expressions for JSON, https://www.rfc-editor.org/rfc/rfc9535 + */ +namespace json_path { + +// Note: value type must be fully defined before this header is included +// This is ensured by including this in amalgamated.h after value-inl.h + +using ::simdjson::arm64::ondemand::value; + +// Path step types +enum class step_type { + field, // .field_name or ["field_name"] + array_index // [index] +}; + +// Represents a single step in a JSON path +template<std::size_t N> +struct path_step { + step_type type; + char key[N]; // Field name (empty for array indices) + std::size_t index; // Array index (0 for field access) + + constexpr path_step(step_type t, const char (&k)[N], std::size_t idx = 0) + : type(t), index(idx) { + for (std::size_t i = 0; i < N; ++i) { + key[i] = k[i]; + } + } + + constexpr std::string_view key_view() const { + return {key, N - 1}; + } +}; + +// Helper to create field step +template<std::size_t N> +consteval auto make_field_step(const char (&name)[N]) { + return path_step<N>(step_type::field, name, 0); +} + +// Helper to create array index step +consteval auto make_index_step(std::size_t idx) { + return path_step<1>(step_type::array_index, "", idx); +} + +// Parse state for compile-time JSON path parsing +struct parse_result { + bool success; + std::size_t pos; + std::string_view error_msg; +}; + +// Compile-time JSON path parser +// Supports subset: .field, ["field"], [index], nested combinations +template<constevalutil::fixed_string Path> +struct json_path_parser { + static constexpr std::string_view path_str = Path.view(); + + // Skip leading $ if present + static consteval std::size_t skip_root() { + if (!path_str.empty() && path_str[0] == '$') { + return 1; + } + return 0; + } + + // Count the number of steps in the path at compile time + static consteval std::size_t count_steps() { + std::size_t count = 0; + std::size_t i = skip_root(); + + while (i < path_str.size()) { + if (path_str[i] == '.') { + // Field access: .field + ++i; + if (i >= path_str.size()) break; + + // Skip field name + while (i < path_str.size() && path_str[i] != '.' && path_str[i] != '[') { + ++i; + } + ++count; + } else if (path_str[i] == '[') { + // Array or bracket notation + ++i; + if (i >= path_str.size()) break; + + if (path_str[i] == '"' || path_str[i] == '\'') { + // Field access: ["field"] or ['field'] + char quote = path_str[i]; + ++i; + while (i < path_str.size() && path_str[i] != quote) { + ++i; + } + if (i < path_str.size()) ++i; // skip closing quote + if (i < path_str.size() && path_str[i] == ']') ++i; + } else { + // Array index: [0], [123] + while (i < path_str.size() && path_str[i] != ']') { + ++i; + } + if (i < path_str.size()) ++i; // skip ] + } + ++count; + } else { + ++i; + } + } + + return count; + } + + // Parse a field name at compile time + static consteval std::size_t parse_field_name(std::size_t start, char* out, std::size_t max_len) { + std::size_t len = 0; + std::size_t i = start; + + while (i < path_str.size() && path_str[i] != '.' && path_str[i] != '[' && len < max_len - 1) { + out[len++] = path_str[i++]; + } + out[len] = '\0'; + return i; + } + + // Parse an array index at compile time + static consteval std::pair<std::size_t, std::size_t> parse_array_index(std::size_t start) { + std::size_t index = 0; + std::size_t i = start; + + while (i < path_str.size() && path_str[i] >= '0' && path_str[i] <= '9') { + index = index * 10 + (path_str[i] - '0'); + ++i; + } + + return {i, index}; + } +}; + +// Compile-time path accessor generator +template<typename T, constevalutil::fixed_string Path> +struct path_accessor { + using value = ::simdjson::arm64::ondemand::value; + + static constexpr auto parser = json_path_parser<Path>(); + static constexpr std::size_t num_steps = parser.count_steps(); + static constexpr std::string_view path_view = Path.view(); + + // Compile-time accessor generation + // If T is a struct, validates the path at compile time + // If T is void, skips validation + template<typename DocOrValue> + static inline simdjson_result<value> access(DocOrValue& doc_or_val) noexcept { + // Validate path at compile time if T is a struct + if constexpr (std::is_class_v<T>) { + constexpr bool path_valid = validate_path(); + static_assert(path_valid, "JSON path does not match struct definition"); + } + + // Parse the path at compile time to build access steps + return access_impl<parser.skip_root()>(doc_or_val.get_value()); + } + + // Extract value at path directly into target with compile-time type validation + // Example: std::string name; path_accessor<User, ".name">::extract_field(doc, name); + template<typename DocOrValue, typename FieldType> + static inline error_code extract_field(DocOrValue& doc_or_val, FieldType& target) noexcept { + static_assert(std::is_class_v<T>, "extract_field requires T to be a struct type for validation"); + + // Validate path exists in struct definition + constexpr bool path_valid = validate_path(); + static_assert(path_valid, "JSON path does not match struct definition"); + + // Get the type at the end of the path + constexpr auto final_type = get_final_type(); + + // Verify target type matches the field type + static_assert(final_type == ^^FieldType, "Target type does not match the field type at the path"); + + // All validation done at compile time - just navigate and extract + auto json_value = access_impl<parser.skip_root()>(doc_or_val.get_value()); + if (json_value.error()) return json_value.error(); + + return json_value.get(target); + } + +private: + // Get the final type by walking the path through the struct type + template<typename U = T> + static consteval std::enable_if_t<std::is_class_v<U>, std::meta::info> get_final_type() { + auto current_type = ^^T; + std::size_t i = parser.skip_root(); + + while (i < path_view.size()) { + if (path_view[i] == '.') { + // .field syntax + ++i; + std::size_t field_start = i; + while (i < path_view.size() && path_view[i] != '.' && path_view[i] != '[') { + ++i; + } + + std::string_view field_name = path_view.substr(field_start, i - field_start); + + auto members = std::meta::nonstatic_data_members_of( + current_type, std::meta::access_context::unchecked() + ); + + for (auto mem : members) { + if (std::meta::identifier_of(mem) == field_name) { + current_type = std::meta::type_of(mem); + break; + } + } + + } else if (path_view[i] == '[') { + ++i; + if (i >= path_view.size()) break; + + if (path_view[i] == '"' || path_view[i] == '\'') { + // ["field"] syntax + char quote = path_view[i]; + ++i; + std::size_t field_start = i; + while (i < path_view.size() && path_view[i] != quote) { + ++i; + } + + std::string_view field_name = path_view.substr(field_start, i - field_start); + if (i < path_view.size()) ++i; // skip quote + if (i < path_view.size() && path_view[i] == ']') ++i; + + auto members = std::meta::nonstatic_data_members_of( + current_type, std::meta::access_context::unchecked() + ); + + for (auto mem : members) { + if (std::meta::identifier_of(mem) == field_name) { + current_type = std::meta::type_of(mem); + break; + } + } + + } else { + // [index] syntax - extract element type + while (i < path_view.size() && path_view[i] >= '0' && path_view[i] <= '9') { + ++i; + } + if (i < path_view.size() && path_view[i] == ']') ++i; + + current_type = get_element_type_reflected(current_type); + } + } else { + ++i; + } + } + + return current_type; + } + +private: + // Walk path and extract directly into final field using compile-time reflection + template<std::meta::info CurrentType, std::size_t PathPos, typename TargetType> + static inline error_code extract_with_reflection(simdjson_result<value> current, TargetType& target_ref) noexcept { + if (current.error()) return current.error(); + + // Base case: end of path - extract into target + if constexpr (PathPos >= path_view.size()) { + return current.get(target_ref); + } + // Field access: .field_name + else if constexpr (path_view[PathPos] == '.') { + constexpr auto field_info = parse_next_field(PathPos); + constexpr std::string_view field_name = std::get<0>(field_info); + constexpr std::size_t next_pos = std::get<1>(field_info); + + constexpr auto member_info = find_member_by_name(CurrentType, field_name); + static_assert(member_info != ^^void, "Field not found in struct"); + + constexpr auto member_type = std::meta::type_of(member_info); + + auto obj_result = current.get_object(); + if (obj_result.error()) return obj_result.error(); + auto obj = obj_result.value_unsafe(); + auto field_value = obj.find_field_unordered(field_name); + + if constexpr (next_pos >= path_view.size()) { + return field_value.get(target_ref); + } else { + return extract_with_reflection<member_type, next_pos>(field_value, target_ref); + } + } + // Bracket notation: [index] or ["field"] + else if constexpr (path_view[PathPos] == '[') { + constexpr auto bracket_info = parse_bracket(PathPos); + constexpr bool is_field = std::get<0>(bracket_info); + constexpr std::size_t next_pos = std::get<2>(bracket_info); + + if constexpr (is_field) { + constexpr std::string_view field_name = std::get<1>(bracket_info); + constexpr auto member_info = find_member_by_name(CurrentType, field_name); + static_assert(member_info != ^^void, "Field not found in struct"); + constexpr auto member_type = std::meta::type_of(member_info); + + auto obj_result = current.get_object(); + if (obj_result.error()) return obj_result.error(); + auto obj = obj_result.value_unsafe(); + auto field_value = obj.find_field_unordered(field_name); + + if constexpr (next_pos >= path_view.size()) { + return field_value.get(target_ref); + } else { + return extract_with_reflection<member_type, next_pos>(field_value, target_ref); + } + } else { + constexpr std::size_t index = std::get<3>(bracket_info); + constexpr auto elem_type = get_element_type_reflected(CurrentType); + static_assert(elem_type != ^^void, "Could not determine array element type"); + + auto arr_result = current.get_array(); + if (arr_result.error()) return arr_result.error(); + auto arr = arr_result.value_unsafe(); + auto elem_value = arr.at(index); + + if constexpr (next_pos >= path_view.size()) { + return elem_value.get(target_ref); + } else { + return extract_with_reflection<elem_type, next_pos>(elem_value, target_ref); + } + } + } + // Skip unexpected characters and continue + else { + return extract_with_reflection<CurrentType, PathPos + 1>(current, target_ref); + } + } + + // Find member by name in reflected type + static consteval std::meta::info find_member_by_name(std::meta::info type_refl, std::string_view name) { + auto members = std::meta::nonstatic_data_members_of(type_refl, std::meta::access_context::unchecked()); + for (auto mem : members) { + if (std::meta::identifier_of(mem) == name) { + return mem; + } + } + } + + // Generate compile-time accessor code by walking the path + template<std::size_t PathPos> + static inline simdjson_result<value> access_impl(simdjson_result<value> current) noexcept { + if (current.error()) return current; + + if constexpr (PathPos >= path_view.size()) { + return current; + } else if constexpr (path_view[PathPos] == '.') { + constexpr auto field_info = parse_next_field(PathPos); + constexpr std::string_view field_name = std::get<0>(field_info); + constexpr std::size_t next_pos = std::get<1>(field_info); + + auto obj_result = current.get_object(); + if (obj_result.error()) return obj_result.error(); + + auto obj = obj_result.value_unsafe(); + auto next_value = obj.find_field_unordered(field_name); + + return access_impl<next_pos>(next_value); + + } else if constexpr (path_view[PathPos] == '[') { + constexpr auto bracket_info = parse_bracket(PathPos); + constexpr bool is_field = std::get<0>(bracket_info); + constexpr std::size_t next_pos = std::get<2>(bracket_info); + + if constexpr (is_field) { + constexpr std::string_view field_name = std::get<1>(bracket_info); + + auto obj_result = current.get_object(); + if (obj_result.error()) return obj_result.error(); + + auto obj = obj_result.value_unsafe(); + auto next_value = obj.find_field_unordered(field_name); + + return access_impl<next_pos>(next_value); + + } else { + constexpr std::size_t index = std::get<3>(bracket_info); + + auto arr_result = current.get_array(); + if (arr_result.error()) return arr_result.error(); + + auto arr = arr_result.value_unsafe(); + auto next_value = arr.at(index); + + return access_impl<next_pos>(next_value); + } + } else { + return access_impl<PathPos + 1>(current); + } + } + + // Parse next field name + static consteval auto parse_next_field(std::size_t start) { + std::size_t i = start + 1; + std::size_t field_start = i; + while (i < path_view.size() && path_view[i] != '.' && path_view[i] != '[') { + ++i; + } + std::string_view field_name = path_view.substr(field_start, i - field_start); + return std::make_tuple(field_name, i); + } + + // Parse bracket notation: returns (is_field, field_name, next_pos, index) + static consteval auto parse_bracket(std::size_t start) { + std::size_t i = start + 1; // skip '[' + + if (i < path_view.size() && (path_view[i] == '"' || path_view[i] == '\'')) { + // Field access + char quote = path_view[i]; + ++i; + std::size_t field_start = i; + while (i < path_view.size() && path_view[i] != quote) { + ++i; + } + std::string_view field_name = path_view.substr(field_start, i - field_start); + if (i < path_view.size()) ++i; // skip closing quote + if (i < path_view.size() && path_view[i] == ']') ++i; + + return std::make_tuple(true, field_name, i, std::size_t(0)); + } else { + // Array index + std::size_t index = 0; + while (i < path_view.size() && path_view[i] >= '0' && path_view[i] <= '9') { + index = index * 10 + (path_view[i] - '0'); + ++i; + } + if (i < path_view.size() && path_view[i] == ']') ++i; + + return std::make_tuple(false, std::string_view{}, i, index); + } + } + +public: + // Check if reflected type is array-like (C-style array or indexable container) + // Uses reflection to test: 1) std::meta::is_array_type() for C arrays + // 2) std::meta::substitute() to test concepts::indexable_container concept + static consteval bool is_array_like_reflected(std::meta::info type_reflection) { + if (std::meta::is_array_type(type_reflection)) { + return true; + } + + if (std::meta::can_substitute(^^concepts::indexable_container_v, {type_reflection})) { + return std::meta::extract<bool>(std::meta::substitute(^^concepts::indexable_container_v, {type_reflection})); + } + return false; + } + + // Extract element type from reflected array or container + // For C arrays: uses std::meta::remove_extent() + // For containers: finds value_type member using std::meta::members_of() + static consteval std::meta::info get_element_type_reflected(std::meta::info type_reflection) { + if (std::meta::is_array_type(type_reflection)) { + return std::meta::remove_extent(type_reflection); + } + + auto members = std::meta::members_of(type_reflection, std::meta::access_context::unchecked()); + for (auto mem : members) { + if (std::meta::is_type(mem)) { + auto name = std::meta::identifier_of(mem); + if (name == "value_type") { + return mem; + } + } + } + return ^^void; + } + +private: + // Check if type has member with given name + template<typename Type> + static consteval bool has_member(std::string_view member_name) { + constexpr auto members = std::meta::nonstatic_data_members_of(^^Type, std::meta::access_context::unchecked()); + for (auto mem : members) { + if (std::meta::identifier_of(mem) == member_name) { + return true; + } + } + return false; + } + + // Get type of member by name + template<typename Type> + static consteval auto get_member_type(std::string_view member_name) { + constexpr auto members = std::meta::nonstatic_data_members_of(^^Type, std::meta::access_context::unchecked()); + for (auto mem : members) { + if (std::meta::identifier_of(mem) == member_name) { + return std::meta::type_of(mem); + } + } + return ^^void; + } + + // Check if non-reflected type is array-like + template<typename Type> + static consteval bool is_container_type() { + using BaseType = std::remove_cvref_t<Type>; + if constexpr (requires { typename BaseType::value_type; }) { + return true; + } + if constexpr (std::is_array_v<BaseType>) { + return true; + } + return false; + } + + // Extract element type from non-reflected container + template<typename Type> + using extract_element_type = std::conditional_t< + requires { typename std::remove_cvref_t<Type>::value_type; }, + typename std::remove_cvref_t<Type>::value_type, + std::conditional_t< + std::is_array_v<std::remove_cvref_t<Type>>, + std::remove_extent_t<std::remove_cvref_t<Type>>, + void + > + >; + + // Validate path matches struct definition + static consteval bool validate_path() { + if constexpr (!std::is_class_v<T>) { + return true; + } + + auto current_type = ^^T; + std::size_t i = parser.skip_root(); + + while (i < path_view.size()) { + if (path_view[i] == '.') { + ++i; + std::size_t field_start = i; + while (i < path_view.size() && path_view[i] != '.' && path_view[i] != '[') { + ++i; + } + + std::string_view field_name = path_view.substr(field_start, i - field_start); + + bool found = false; + auto members = std::meta::nonstatic_data_members_of(current_type, std::meta::access_context::unchecked()); + + for (auto mem : members) { + if (std::meta::identifier_of(mem) == field_name) { + current_type = std::meta::type_of(mem); + found = true; + break; + } + } + + if (!found) { + return false; + } + + } else if (path_view[i] == '[') { + ++i; + if (i >= path_view.size()) return false; + + if (path_view[i] == '"' || path_view[i] == '\'') { + char quote = path_view[i]; + ++i; + std::size_t field_start = i; + while (i < path_view.size() && path_view[i] != quote) { + ++i; + } + + std::string_view field_name = path_view.substr(field_start, i - field_start); + if (i < path_view.size()) ++i; + if (i < path_view.size() && path_view[i] == ']') ++i; + + bool found = false; + auto members = std::meta::nonstatic_data_members_of(current_type, std::meta::access_context::unchecked()); + + for (auto mem : members) { + if (std::meta::identifier_of(mem) == field_name) { + current_type = std::meta::type_of(mem); + found = true; + break; + } + } + + if (!found) { + return false; + } + + } else { + while (i < path_view.size() && path_view[i] >= '0' && path_view[i] <= '9') { + ++i; + } + + if (i < path_view.size() && path_view[i] == ']') ++i; + + if (!is_array_like_reflected(current_type)) { + return false; + } + + auto new_type = get_element_type_reflected(current_type); + + if (new_type == ^^void) { + return false; + } + + current_type = new_type; + } + } else { + ++i; + } + } + + return true; + } +}; + +// Compile-time path accessor with validation +template<typename T, constevalutil::fixed_string Path, typename DocOrValue> +inline simdjson_result<::simdjson::arm64::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { + using accessor = path_accessor<T, Path>; + return accessor::access(doc_or_val); +} + +// Overload without type parameter (no validation) +template<constevalutil::fixed_string Path, typename DocOrValue> +inline simdjson_result<::simdjson::arm64::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { + using accessor = path_accessor<void, Path>; + return accessor::access(doc_or_val); +} + +// ============================================================================ +// JSON Pointer Compile-Time Support (RFC 6901) +// ============================================================================ + +// JSON Pointer parser: /field/0/nested (slash-separated) +template<constevalutil::fixed_string Pointer> +struct json_pointer_parser { + static constexpr std::string_view pointer_str = Pointer.view(); + + // Unescape token: ~0 -> ~, ~1 -> / + static consteval void unescape_token(std::string_view src, char* dest, std::size_t& out_len) { + out_len = 0; + for (std::size_t i = 0; i < src.size(); ++i) { + if (src[i] == '~' && i + 1 < src.size()) { + if (src[i + 1] == '0') { + dest[out_len++] = '~'; + ++i; + } else if (src[i + 1] == '1') { + dest[out_len++] = '/'; + ++i; + } else { + dest[out_len++] = src[i]; + } + } else { + dest[out_len++] = src[i]; + } + } + } + + // Check if token is numeric + static consteval bool is_numeric(std::string_view token) { + if (token.empty()) return false; + if (token[0] == '0' && token.size() > 1) return false; + for (char c : token) { + if (c < '0' || c > '9') return false; + } + return true; + } + + // Parse numeric token to index + static consteval std::size_t parse_index(std::string_view token) { + std::size_t result = 0; + for (char c : token) { + result = result * 10 + (c - '0'); + } + return result; + } + + // Count tokens in pointer + static consteval std::size_t count_tokens() { + if (pointer_str.empty() || pointer_str == "/") return 0; + + std::size_t count = 0; + std::size_t pos = pointer_str[0] == '/' ? 1 : 0; + + while (pos < pointer_str.size()) { + ++count; + std::size_t next_slash = pointer_str.find('/', pos); + if (next_slash == std::string_view::npos) break; + pos = next_slash + 1; + } + + return count; + } + + // Get Nth token + static consteval std::string_view get_token(std::size_t token_index) { + std::size_t pos = pointer_str[0] == '/' ? 1 : 0; + std::size_t current_token = 0; + + while (current_token < token_index) { + std::size_t next_slash = pointer_str.find('/', pos); + pos = next_slash + 1; + ++current_token; + } + + std::size_t token_end = pointer_str.find('/', pos); + if (token_end == std::string_view::npos) token_end = pointer_str.size(); + + return pointer_str.substr(pos, token_end - pos); + } +}; + +// JSON Pointer accessor +template<typename T, constevalutil::fixed_string Pointer> +struct pointer_accessor { + using parser = json_pointer_parser<Pointer>; + static constexpr std::string_view pointer_view = Pointer.view(); + static constexpr std::size_t token_count = parser::count_tokens(); + + // Validate pointer against struct definition + static consteval bool validate_pointer() { + if constexpr (!std::is_class_v<T>) { + return true; + } + + auto current_type = ^^T; + std::size_t pos = pointer_view[0] == '/' ? 1 : 0; + + while (pos < pointer_view.size()) { + // Extract token up to next / + std::size_t token_end = pointer_view.find('/', pos); + if (token_end == std::string_view::npos) token_end = pointer_view.size(); + + std::string_view token = pointer_view.substr(pos, token_end - pos); + + if (parser::is_numeric(token)) { + if (!path_accessor<T, Pointer>::is_array_like_reflected(current_type)) { + return false; + } + current_type = path_accessor<T, Pointer>::get_element_type_reflected(current_type); + } else { + bool found = false; + auto members = std::meta::nonstatic_data_members_of(current_type, std::meta::access_context::unchecked()); + + for (auto mem : members) { + if (std::meta::identifier_of(mem) == token) { + current_type = std::meta::type_of(mem); + found = true; + break; + } + } + + if (!found) return false; + } + + pos = token_end + 1; + } + + return true; + } + + // Recursive accessor + template<std::size_t TokenIndex> + static inline simdjson_result<value> access_impl(simdjson_result<value> current) noexcept { + if constexpr (TokenIndex >= token_count) { + return current; + } else { + constexpr std::string_view token = parser::get_token(TokenIndex); + + if constexpr (parser::is_numeric(token)) { + constexpr std::size_t index = parser::parse_index(token); + auto arr = current.get_array().value_unsafe(); + auto next_value = arr.at(index); + return access_impl<TokenIndex + 1>(next_value); + } else { + auto obj = current.get_object().value_unsafe(); + auto next_value = obj.find_field_unordered(token); + return access_impl<TokenIndex + 1>(next_value); + } + } + } + + // Access JSON value at pointer + template<typename DocOrValue> + static inline simdjson_result<value> access(DocOrValue& doc_or_val) noexcept { + if constexpr (std::is_class_v<T>) { + constexpr bool pointer_valid = validate_pointer(); + static_assert(pointer_valid, "JSON Pointer does not match struct definition"); + } + + if (pointer_view.empty() || pointer_view == "/") { + if constexpr (requires { doc_or_val.get_value(); }) { + return doc_or_val.get_value(); + } else { + return doc_or_val; + } + } + + simdjson_result<value> current = doc_or_val.get_value(); + return access_impl<0>(current); + } + + // Extract value at pointer directly into target with type validation + template<typename DocOrValue, typename FieldType> + static inline error_code extract_field(DocOrValue& doc_or_val, FieldType& target) noexcept { + static_assert(std::is_class_v<T>, "extract_field requires T to be a struct type for validation"); + + constexpr bool pointer_valid = validate_pointer(); + static_assert(pointer_valid, "JSON Pointer does not match struct definition"); + + constexpr auto final_type = get_final_type(); + static_assert(final_type == ^^FieldType, "Target type does not match the field type at the pointer"); + + simdjson_result<value> current_value = doc_or_val.get_value(); + auto json_value = access_impl<0>(current_value); + if (json_value.error()) return json_value.error(); + + return json_value.get(target); + } + +private: + // Get final type by walking pointer through struct + template<typename U = T> + static consteval std::enable_if_t<std::is_class_v<U>, std::meta::info> get_final_type() { + auto current_type = ^^T; + std::size_t pos = pointer_view[0] == '/' ? 1 : 0; + + while (pos < pointer_view.size()) { + std::size_t token_end = pointer_view.find('/', pos); + if (token_end == std::string_view::npos) token_end = pointer_view.size(); + + std::string_view token = pointer_view.substr(pos, token_end - pos); + + if (parser::is_numeric(token)) { + current_type = path_accessor<T, "">::get_element_type_reflected(current_type); + } else { + auto members = std::meta::nonstatic_data_members_of(current_type, std::meta::access_context::unchecked()); + + for (auto mem : members) { + if (std::meta::identifier_of(mem) == token) { + current_type = std::meta::type_of(mem); + break; + } + } + } + + pos = token_end + 1; + } + + return current_type; + } +}; + +// Compile-time JSON Pointer accessor with validation +template<typename T, constevalutil::fixed_string Pointer, typename DocOrValue> +inline simdjson_result<::simdjson::arm64::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { + using accessor = pointer_accessor<T, Pointer>; + return accessor::access(doc_or_val); +} + +// Overload without type parameter (no validation) +template<constevalutil::fixed_string Pointer, typename DocOrValue> +inline simdjson_result<::simdjson::arm64::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { + using accessor = pointer_accessor<void, Pointer>; + return accessor::access(doc_or_val); +} + +} // namespace json_path +} // namespace ondemand +} // namespace arm64 +} // namespace simdjson + +#endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION +#endif // SIMDJSON_GENERIC_ONDEMAND_COMPILE_TIME_ACCESSORS_H + +/* end file simdjson/generic/ondemand/compile_time_accessors.h for arm64 */ + +/* end file simdjson/generic/ondemand/amalgamated.h for arm64 */ +/* including simdjson/arm64/end.h: #include "simdjson/arm64/end.h" */ +/* begin file simdjson/arm64/end.h */ +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#undef SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT +/* undefining SIMDJSON_IMPLEMENTATION from "arm64" */ +#undef SIMDJSON_IMPLEMENTATION +/* end file simdjson/arm64/end.h */ + +#endif // SIMDJSON_ARM64_ONDEMAND_H +/* end file simdjson/arm64/ondemand.h */ +#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(fallback) +/* including simdjson/fallback/ondemand.h: #include "simdjson/fallback/ondemand.h" */ +/* begin file simdjson/fallback/ondemand.h */ +#ifndef SIMDJSON_FALLBACK_ONDEMAND_H +#define SIMDJSON_FALLBACK_ONDEMAND_H + +/* including simdjson/fallback/begin.h: #include "simdjson/fallback/begin.h" */ +/* begin file simdjson/fallback/begin.h */ +/* defining SIMDJSON_IMPLEMENTATION to "fallback" */ +#define SIMDJSON_IMPLEMENTATION fallback +/* including simdjson/fallback/base.h: #include "simdjson/fallback/base.h" */ +/* begin file simdjson/fallback/base.h */ +#ifndef SIMDJSON_FALLBACK_BASE_H +#define SIMDJSON_FALLBACK_BASE_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +/** + * Fallback implementation (runs on any machine). + */ +namespace fallback { + +class implementation; + +} // namespace fallback +} // namespace simdjson + +#endif // SIMDJSON_FALLBACK_BASE_H +/* end file simdjson/fallback/base.h */ +/* including simdjson/fallback/bitmanipulation.h: #include "simdjson/fallback/bitmanipulation.h" */ +/* begin file simdjson/fallback/bitmanipulation.h */ +#ifndef SIMDJSON_FALLBACK_BITMANIPULATION_H +#define SIMDJSON_FALLBACK_BITMANIPULATION_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/fallback/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace fallback { +namespace { + +#if defined(_MSC_VER) && !defined(_M_ARM64) && !defined(_M_X64) +static inline unsigned char _BitScanForward64(unsigned long* ret, uint64_t x) { + unsigned long x0 = (unsigned long)x, top, bottom; + _BitScanForward(&top, (unsigned long)(x >> 32)); + _BitScanForward(&bottom, x0); + *ret = x0 ? bottom : 32 + top; + return x != 0; +} +static unsigned char _BitScanReverse64(unsigned long* ret, uint64_t x) { + unsigned long x1 = (unsigned long)(x >> 32), top, bottom; + _BitScanReverse(&top, x1); + _BitScanReverse(&bottom, (unsigned long)x); + *ret = x1 ? top + 32 : bottom; + return x != 0; +} +#endif + +/* result might be undefined when input_num is zero */ +simdjson_inline int leading_zeroes(uint64_t input_num) { +#ifdef _MSC_VER + unsigned long leading_zero = 0; + // Search the mask data from most significant bit (MSB) + // to least significant bit (LSB) for a set bit (1). + if (_BitScanReverse64(&leading_zero, input_num)) + return (int)(63 - leading_zero); + else + return 64; +#else + return __builtin_clzll(input_num); +#endif// _MSC_VER +} + +simdjson_inline int trailing_zeroes(uint64_t input_num) { +#ifdef _MSC_VER + unsigned long trailing_zero = 0; + // Search the mask data from least significant bit (LSB) + // to most significant bit (MSB) for a set bit (1). + if (_BitScanForward64(&trailing_zero, input_num)) + return (int)trailing_zero; + else return 64; +#else + return __builtin_ctzll(input_num); +#endif// _MSC_VER +} + +} // unnamed namespace +} // namespace fallback +} // namespace simdjson + +#endif // SIMDJSON_FALLBACK_BITMANIPULATION_H +/* end file simdjson/fallback/bitmanipulation.h */ +/* including simdjson/fallback/stringparsing_defs.h: #include "simdjson/fallback/stringparsing_defs.h" */ +/* begin file simdjson/fallback/stringparsing_defs.h */ +#ifndef SIMDJSON_FALLBACK_STRINGPARSING_DEFS_H +#define SIMDJSON_FALLBACK_STRINGPARSING_DEFS_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/fallback/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace fallback { +namespace { + +// Holds backslashes and quotes locations. +struct backslash_and_quote { +public: + static constexpr uint32_t BYTES_PROCESSED = 1; + simdjson_inline backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst); + + simdjson_inline bool has_quote_first() { return c == '"'; } + simdjson_inline bool has_backslash() { return c == '\\'; } + simdjson_inline int quote_index() { return c == '"' ? 0 : 1; } + simdjson_inline int backslash_index() { return c == '\\' ? 0 : 1; } + + uint8_t c; +}; // struct backslash_and_quote + +simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) { + // store to dest unconditionally - we can overwrite the bits we don't like later + dst[0] = src[0]; + return { src[0] }; +} + + +struct escaping { + static constexpr uint32_t BYTES_PROCESSED = 1; + simdjson_inline static escaping copy_and_find(const uint8_t *src, uint8_t *dst); + + simdjson_inline bool has_escape() { return escape_bits; } + simdjson_inline int escape_index() { return 0; } + + bool escape_bits; +}; // struct escaping + + + +simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *dst) { + dst[0] = src[0]; + return { (src[0] == '\\') || (src[0] == '"') || (src[0] < 32) }; +} + +} // unnamed namespace +} // namespace fallback +} // namespace simdjson + +#endif // SIMDJSON_FALLBACK_STRINGPARSING_DEFS_H +/* end file simdjson/fallback/stringparsing_defs.h */ +/* including simdjson/fallback/numberparsing_defs.h: #include "simdjson/fallback/numberparsing_defs.h" */ +/* begin file simdjson/fallback/numberparsing_defs.h */ +#ifndef SIMDJSON_FALLBACK_NUMBERPARSING_DEFS_H +#define SIMDJSON_FALLBACK_NUMBERPARSING_DEFS_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/fallback/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#include <cstring> + +#ifdef JSON_TEST_NUMBERS // for unit testing +void found_invalid_number(const uint8_t *buf); +void found_integer(int64_t result, const uint8_t *buf); +void found_unsigned_integer(uint64_t result, const uint8_t *buf); +void found_float(double result, const uint8_t *buf); +#endif + +namespace simdjson { +namespace fallback { +namespace numberparsing { + +// credit: https://johnnylee-sde.github.io/Fast-numeric-string-to-int/ +/** @private */ +static simdjson_inline uint32_t parse_eight_digits_unrolled(const char *chars) { + uint64_t val; + memcpy(&val, chars, sizeof(uint64_t)); + val = (val & 0x0F0F0F0F0F0F0F0F) * 2561 >> 8; + val = (val & 0x00FF00FF00FF00FF) * 6553601 >> 16; + return uint32_t((val & 0x0000FFFF0000FFFF) * 42949672960001 >> 32); +} + +/** @private */ +static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) { + return parse_eight_digits_unrolled(reinterpret_cast<const char *>(chars)); +} + +#if SIMDJSON_IS_32BITS // _umul128 for x86, arm +// this is a slow emulation routine for 32-bit +// +static simdjson_inline uint64_t __emulu(uint32_t x, uint32_t y) { + return x * (uint64_t)y; +} +static simdjson_inline uint64_t _umul128(uint64_t ab, uint64_t cd, uint64_t *hi) { + uint64_t ad = __emulu((uint32_t)(ab >> 32), (uint32_t)cd); + uint64_t bd = __emulu((uint32_t)ab, (uint32_t)cd); + uint64_t adbc = ad + __emulu((uint32_t)ab, (uint32_t)(cd >> 32)); + uint64_t adbc_carry = !!(adbc < ad); + uint64_t lo = bd + (adbc << 32); + *hi = __emulu((uint32_t)(ab >> 32), (uint32_t)(cd >> 32)) + (adbc >> 32) + + (adbc_carry << 32) + !!(lo < bd); + return lo; +} +#endif + +/** @private */ +simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) { + internal::value128 answer; +#if SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS +#if SIMDJSON_IS_ARM64 + // ARM64 has native support for 64-bit multiplications, no need to emultate + answer.high = __umulh(value1, value2); + answer.low = value1 * value2; +#else + answer.low = _umul128(value1, value2, &answer.high); // _umul128 not available on ARM64 +#endif // SIMDJSON_IS_ARM64 +#else // SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS + __uint128_t r = (static_cast<__uint128_t>(value1)) * value2; + answer.low = uint64_t(r); + answer.high = uint64_t(r >> 64); +#endif + return answer; +} + +} // namespace numberparsing +} // namespace fallback +} // namespace simdjson + +#ifndef SIMDJSON_SWAR_NUMBER_PARSING +#if SIMDJSON_IS_BIG_ENDIAN +#define SIMDJSON_SWAR_NUMBER_PARSING 0 +#else +#define SIMDJSON_SWAR_NUMBER_PARSING 1 +#endif +#endif + +#endif // SIMDJSON_FALLBACK_NUMBERPARSING_DEFS_H +/* end file simdjson/fallback/numberparsing_defs.h */ +/* end file simdjson/fallback/begin.h */ +/* including simdjson/generic/ondemand/amalgamated.h for fallback: #include "simdjson/generic/ondemand/amalgamated.h" */ +/* begin file simdjson/generic/ondemand/amalgamated.h for fallback */ +#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_BUILDER_DEPENDENCIES_H) +#error simdjson/generic/ondemand/dependencies.h must be included before simdjson/generic/ondemand/amalgamated.h! +#endif + +// Stuff other things depend on +/* including simdjson/generic/ondemand/base.h for fallback: #include "simdjson/generic/ondemand/base.h" */ +/* begin file simdjson/generic/ondemand/base.h for fallback */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_BASE_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_BASE_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace fallback { +/** + * A fast, simple, DOM-like interface that parses JSON as you use it. + * + * Designed for maximum speed and a lower memory profile. + */ +namespace ondemand { + +/** Represents the depth of a JSON value (number of nested arrays/objects). */ +using depth_t = int32_t; + +/** @copydoc simdjson::fallback::number_type */ +using number_type = simdjson::fallback::number_type; + +/** @private Position in the JSON buffer indexes */ +using token_position = const uint32_t *; + +class array; +class array_iterator; +class document; +class document_reference; +class document_stream; +class field; +class json_iterator; +enum class json_type; +struct number; +class object; +class object_iterator; +class parser; +class raw_json_string; +class token_iterator; +class value; +class value_iterator; + +} // namespace ondemand +} // namespace fallback +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_ONDEMAND_BASE_H +/* end file simdjson/generic/ondemand/base.h for fallback */ +/* including simdjson/generic/ondemand/deserialize.h for fallback: #include "simdjson/generic/ondemand/deserialize.h" */ +/* begin file simdjson/generic/ondemand/deserialize.h for fallback */ +#if SIMDJSON_SUPPORTS_CONCEPTS + +#ifndef SIMDJSON_ONDEMAND_DESERIALIZE_H +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_ONDEMAND_DESERIALIZE_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { + +struct deserialize_tag; + +/// These types are deserializable in a built-in way +template <typename> struct is_builtin_deserializable : std::false_type {}; +template <> struct is_builtin_deserializable<int64_t> : std::true_type {}; +template <> struct is_builtin_deserializable<uint64_t> : std::true_type {}; +template <> struct is_builtin_deserializable<double> : std::true_type {}; +template <> struct is_builtin_deserializable<bool> : std::true_type {}; +template <> struct is_builtin_deserializable<fallback::ondemand::array> : std::true_type {}; +template <> struct is_builtin_deserializable<fallback::ondemand::object> : std::true_type {}; +template <> struct is_builtin_deserializable<fallback::ondemand::value> : std::true_type {}; +template <> struct is_builtin_deserializable<fallback::ondemand::raw_json_string> : std::true_type {}; +template <> struct is_builtin_deserializable<std::string_view> : std::true_type {}; + +template <typename T> +concept is_builtin_deserializable_v = is_builtin_deserializable<T>::value; + +template <typename T, typename ValT = fallback::ondemand::value> +concept custom_deserializable = tag_invocable<deserialize_tag, ValT&, T&>; + +template <typename T, typename ValT = fallback::ondemand::value> +concept deserializable = custom_deserializable<T, ValT> || is_builtin_deserializable_v<T> || concepts::optional_type<T>; + +template <typename T, typename ValT = fallback::ondemand::value> +concept nothrow_custom_deserializable = nothrow_tag_invocable<deserialize_tag, ValT&, T&>; + +// built-in types are noexcept and if an error happens, the value simply gets ignored and the error is returned. +template <typename T, typename ValT = fallback::ondemand::value> +concept nothrow_deserializable = nothrow_custom_deserializable<T, ValT> || is_builtin_deserializable_v<T>; + +/// Deserialize Tag +inline constexpr struct deserialize_tag { + using array_type = fallback::ondemand::array; + using object_type = fallback::ondemand::object; + using value_type = fallback::ondemand::value; + using document_type = fallback::ondemand::document; + using document_reference_type = fallback::ondemand::document_reference; + + // Customization Point for array + template <typename T> + requires custom_deserializable<T, value_type> + simdjson_warn_unused constexpr /* error_code */ auto operator()(array_type &object, T& output) const noexcept(nothrow_custom_deserializable<T, value_type>) { + return tag_invoke(*this, object, output); + } + + // Customization Point for object + template <typename T> + requires custom_deserializable<T, value_type> + simdjson_warn_unused constexpr /* error_code */ auto operator()(object_type &object, T& output) const noexcept(nothrow_custom_deserializable<T, value_type>) { + return tag_invoke(*this, object, output); + } + + // Customization Point for value + template <typename T> + requires custom_deserializable<T, value_type> + simdjson_warn_unused constexpr /* error_code */ auto operator()(value_type &object, T& output) const noexcept(nothrow_custom_deserializable<T, value_type>) { + return tag_invoke(*this, object, output); + } + + // Customization Point for document + template <typename T> + requires custom_deserializable<T, document_type> + simdjson_warn_unused constexpr /* error_code */ auto operator()(document_type &object, T& output) const noexcept(nothrow_custom_deserializable<T, document_type>) { + return tag_invoke(*this, object, output); + } + + // Customization Point for document reference + template <typename T> + requires custom_deserializable<T, document_reference_type> + simdjson_warn_unused constexpr /* error_code */ auto operator()(document_reference_type &object, T& output) const noexcept(nothrow_custom_deserializable<T, document_reference_type>) { + return tag_invoke(*this, object, output); + } + + +} deserialize{}; + +} // namespace simdjson + +#endif // SIMDJSON_ONDEMAND_DESERIALIZE_H +#endif // SIMDJSON_SUPPORTS_CONCEPTS + +/* end file simdjson/generic/ondemand/deserialize.h for fallback */ +/* including simdjson/generic/ondemand/value_iterator.h for fallback: #include "simdjson/generic/ondemand/value_iterator.h" */ +/* begin file simdjson/generic/ondemand/value_iterator.h for fallback */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace fallback { +namespace ondemand { + +/** + * Iterates through a single JSON value at a particular depth. + * + * Does not keep track of the type of value: provides methods for objects, arrays and scalars and expects + * the caller to call the right ones. + * + * @private This is not intended for external use. + */ +class value_iterator { +protected: + /** The underlying JSON iterator */ + json_iterator *_json_iter{}; + /** The depth of this value */ + depth_t _depth{}; + /** + * The starting token index for this value + */ + token_position _start_position{}; + +public: + simdjson_inline value_iterator() noexcept = default; + + /** + * Denote that we're starting a document. + */ + simdjson_inline void start_document() noexcept; + + /** + * Skips a non-iterated or partially-iterated JSON value, whether it is a scalar, array or object. + * + * Optimized for scalars. + */ + simdjson_warn_unused simdjson_inline error_code skip_child() noexcept; + + /** * Tell whether the iterator is at the EOF mark */ simdjson_inline bool at_end() const noexcept; @@ -34853,21 +75927,22 @@ class value_iterator { friend class document; friend class object; + friend class object_iterator; friend class array; friend class value; friend class field; }; // value_iterator } // namespace ondemand -} // namespace arm64 +} // namespace fallback } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<arm64::ondemand::value_iterator> : public arm64::implementation_simdjson_result_base<arm64::ondemand::value_iterator> { +struct simdjson_result<fallback::ondemand::value_iterator> : public fallback::implementation_simdjson_result_base<fallback::ondemand::value_iterator> { public: - simdjson_inline simdjson_result(arm64::ondemand::value_iterator &&value) noexcept; ///< @private + simdjson_inline simdjson_result(fallback::ondemand::value_iterator &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; }; @@ -34875,9 +75950,9 @@ struct simdjson_result<arm64::ondemand::value_iterator> : public arm64::implemen } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_H -/* end file simdjson/generic/ondemand/value_iterator.h for arm64 */ -/* including simdjson/generic/ondemand/value.h for arm64: #include "simdjson/generic/ondemand/value.h" */ -/* begin file simdjson/generic/ondemand/value.h for arm64 */ +/* end file simdjson/generic/ondemand/value_iterator.h for fallback */ +/* including simdjson/generic/ondemand/value.h for fallback: #include "simdjson/generic/ondemand/value.h" */ +/* begin file simdjson/generic/ondemand/value.h for fallback */ #ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -34893,7 +75968,7 @@ struct simdjson_result<arm64::ondemand::value_iterator> : public arm64::implemen namespace simdjson { -namespace arm64 { +namespace fallback { namespace ondemand { /** * An ephemeral JSON value returned during iteration. It is only valid for as long as you do @@ -35607,20 +76682,20 @@ class value { }; } // namespace ondemand -} // namespace arm64 +} // namespace fallback } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<arm64::ondemand::value> : public arm64::implementation_simdjson_result_base<arm64::ondemand::value> { +struct simdjson_result<fallback::ondemand::value> : public fallback::implementation_simdjson_result_base<fallback::ondemand::value> { public: - simdjson_inline simdjson_result(arm64::ondemand::value &&value) noexcept; ///< @private + simdjson_inline simdjson_result(fallback::ondemand::value &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; - simdjson_inline simdjson_result<arm64::ondemand::array> get_array() noexcept; - simdjson_inline simdjson_result<arm64::ondemand::object> get_object() noexcept; + simdjson_inline simdjson_result<fallback::ondemand::array> get_array() noexcept; + simdjson_inline simdjson_result<fallback::ondemand::object> get_object() noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64() noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64_in_string() noexcept; @@ -35632,7 +76707,7 @@ struct simdjson_result<arm64::ondemand::value> : public arm64::implementation_si template <typename string_type> simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result<std::string_view> get_wobbly_string() noexcept; - simdjson_inline simdjson_result<arm64::ondemand::raw_json_string> get_raw_json_string() noexcept; + simdjson_inline simdjson_result<fallback::ondemand::raw_json_string> get_raw_json_string() noexcept; simdjson_inline simdjson_result<bool> get_bool() noexcept; simdjson_inline simdjson_result<bool> is_null() noexcept; @@ -35643,20 +76718,20 @@ struct simdjson_result<arm64::ondemand::value> : public arm64::implementation_si #if SIMDJSON_EXCEPTIONS template <class T> explicit simdjson_inline operator T() noexcept(false); - simdjson_inline operator arm64::ondemand::array() noexcept(false); - simdjson_inline operator arm64::ondemand::object() noexcept(false); + simdjson_inline operator fallback::ondemand::array() noexcept(false); + simdjson_inline operator fallback::ondemand::object() noexcept(false); simdjson_inline operator uint64_t() noexcept(false); simdjson_inline operator int64_t() noexcept(false); simdjson_inline operator double() noexcept(false); simdjson_inline operator std::string_view() noexcept(false); - simdjson_inline operator arm64::ondemand::raw_json_string() noexcept(false); + simdjson_inline operator fallback::ondemand::raw_json_string() noexcept(false); simdjson_inline operator bool() noexcept(false); #endif simdjson_inline simdjson_result<size_t> count_elements() & noexcept; simdjson_inline simdjson_result<size_t> count_fields() & noexcept; - simdjson_inline simdjson_result<arm64::ondemand::value> at(size_t index) noexcept; - simdjson_inline simdjson_result<arm64::ondemand::array_iterator> begin() & noexcept; - simdjson_inline simdjson_result<arm64::ondemand::array_iterator> end() & noexcept; + simdjson_inline simdjson_result<fallback::ondemand::value> at(size_t index) noexcept; + simdjson_inline simdjson_result<fallback::ondemand::array_iterator> begin() & noexcept; + simdjson_inline simdjson_result<fallback::ondemand::array_iterator> end() & noexcept; /** * Look up a field by name on an object (order-sensitive). By order-sensitive, we mean that @@ -35680,9 +76755,9 @@ struct simdjson_result<arm64::ondemand::value> : public arm64::implementation_si * @param key The key to look up. * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object. */ - simdjson_inline simdjson_result<arm64::ondemand::value> find_field(std::string_view key) noexcept; - /** @overload simdjson_inline simdjson_result<arm64::ondemand::value> find_field(std::string_view key) noexcept; */ - simdjson_inline simdjson_result<arm64::ondemand::value> find_field(const char *key) noexcept; + simdjson_inline simdjson_result<fallback::ondemand::value> find_field(std::string_view key) noexcept; + /** @overload simdjson_inline simdjson_result<fallback::ondemand::value> find_field(std::string_view key) noexcept; */ + simdjson_inline simdjson_result<fallback::ondemand::value> find_field(const char *key) noexcept; /** * Look up a field by name on an object, without regard to key order. @@ -35694,7 +76769,7 @@ struct simdjson_result<arm64::ondemand::value> : public arm64::implementation_si * in question is large. The fact that the extra code is there also bumps the executable size. * * We default operator[] on find_field_unordered() for convenience. - * It is the defaul because it would be highly surprising (and hard to debug) if the + * It is the default because it would be highly surprising (and hard to debug) if the * default behavior failed to look up a field just because it was in the wrong order--and many * APIs assume this. Therefore, you must be explicit if you want to treat objects as out of order. * @@ -35704,14 +76779,14 @@ struct simdjson_result<arm64::ondemand::value> : public arm64::implementation_si * @param key The key to look up. * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object. */ - simdjson_inline simdjson_result<arm64::ondemand::value> find_field_unordered(std::string_view key) noexcept; - /** @overload simdjson_inline simdjson_result<arm64::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ - simdjson_inline simdjson_result<arm64::ondemand::value> find_field_unordered(const char *key) noexcept; - /** @overload simdjson_inline simdjson_result<arm64::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ - simdjson_inline simdjson_result<arm64::ondemand::value> operator[](std::string_view key) noexcept; - /** @overload simdjson_inline simdjson_result<arm64::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ - simdjson_inline simdjson_result<arm64::ondemand::value> operator[](const char *key) noexcept; - simdjson_result<arm64::ondemand::value> operator[](int) noexcept = delete; + simdjson_inline simdjson_result<fallback::ondemand::value> find_field_unordered(std::string_view key) noexcept; + /** @overload simdjson_inline simdjson_result<fallback::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ + simdjson_inline simdjson_result<fallback::ondemand::value> find_field_unordered(const char *key) noexcept; + /** @overload simdjson_inline simdjson_result<fallback::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ + simdjson_inline simdjson_result<fallback::ondemand::value> operator[](std::string_view key) noexcept; + /** @overload simdjson_inline simdjson_result<fallback::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ + simdjson_inline simdjson_result<fallback::ondemand::value> operator[](const char *key) noexcept; + simdjson_result<fallback::ondemand::value> operator[](int) noexcept = delete; /** * Get the type of this JSON value. It does not validate or consume the value. @@ -35735,13 +76810,13 @@ struct simdjson_result<arm64::ondemand::value> : public arm64::implementation_si * better to just call .get_double, .get_string, etc. and check for INCORRECT_TYPE (or just * let it throw an exception). */ - simdjson_inline simdjson_result<arm64::ondemand::json_type> type() noexcept; + simdjson_inline simdjson_result<fallback::ondemand::json_type> type() noexcept; simdjson_inline simdjson_result<bool> is_scalar() noexcept; simdjson_inline simdjson_result<bool> is_string() noexcept; simdjson_inline simdjson_result<bool> is_negative() noexcept; simdjson_inline simdjson_result<bool> is_integer() noexcept; - simdjson_inline simdjson_result<arm64::number_type> get_number_type() noexcept; - simdjson_inline simdjson_result<arm64::ondemand::number> get_number() noexcept; + simdjson_inline simdjson_result<fallback::number_type> get_number_type() noexcept; + simdjson_inline simdjson_result<fallback::ondemand::number> get_number() noexcept; /** @copydoc simdjson_inline std::string_view value::raw_json_token() const noexcept */ simdjson_inline simdjson_result<std::string_view> raw_json_token() noexcept; @@ -35751,17 +76826,17 @@ struct simdjson_result<arm64::ondemand::value> : public arm64::implementation_si simdjson_inline simdjson_result<const char *> current_location() noexcept; /** @copydoc simdjson_inline int32_t current_depth() const noexcept */ simdjson_inline simdjson_result<int32_t> current_depth() const noexcept; - simdjson_inline simdjson_result<arm64::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result<arm64::ondemand::value> at_path(std::string_view json_path) noexcept; - simdjson_inline simdjson_result<std::vector<arm64::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<fallback::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result<fallback::ondemand::value> at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<std::vector<fallback::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; }; } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_H -/* end file simdjson/generic/ondemand/value.h for arm64 */ -/* including simdjson/generic/ondemand/logger.h for arm64: #include "simdjson/generic/ondemand/logger.h" */ -/* begin file simdjson/generic/ondemand/logger.h for arm64 */ +/* end file simdjson/generic/ondemand/value.h for fallback */ +/* including simdjson/generic/ondemand/logger.h for fallback: #include "simdjson/generic/ondemand/logger.h" */ +/* begin file simdjson/generic/ondemand/logger.h for fallback */ #ifndef SIMDJSON_GENERIC_ONDEMAND_LOGGER_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -35770,7 +76845,7 @@ struct simdjson_result<arm64::ondemand::value> : public arm64::implementation_si /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace arm64 { +namespace fallback { namespace ondemand { // Logging should be free unless SIMDJSON_VERBOSE_LOGGING is set. Importantly, it is critical @@ -35816,13 +76891,13 @@ static inline void log_error(const value_iterator &iter, const char *error, cons } // namespace logger } // namespace ondemand -} // namespace arm64 +} // namespace fallback } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_LOGGER_H -/* end file simdjson/generic/ondemand/logger.h for arm64 */ -/* including simdjson/generic/ondemand/token_iterator.h for arm64: #include "simdjson/generic/ondemand/token_iterator.h" */ -/* begin file simdjson/generic/ondemand/token_iterator.h for arm64 */ +/* end file simdjson/generic/ondemand/logger.h for fallback */ +/* including simdjson/generic/ondemand/token_iterator.h for fallback: #include "simdjson/generic/ondemand/token_iterator.h" */ +/* begin file simdjson/generic/ondemand/token_iterator.h for fallback */ #ifndef SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -35833,7 +76908,7 @@ static inline void log_error(const value_iterator &iter, const char *error, cons /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace arm64 { +namespace fallback { namespace ondemand { /** @@ -35964,15 +77039,15 @@ class token_iterator { }; } // namespace ondemand -} // namespace arm64 +} // namespace fallback } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<arm64::ondemand::token_iterator> : public arm64::implementation_simdjson_result_base<arm64::ondemand::token_iterator> { +struct simdjson_result<fallback::ondemand::token_iterator> : public fallback::implementation_simdjson_result_base<fallback::ondemand::token_iterator> { public: - simdjson_inline simdjson_result(arm64::ondemand::token_iterator &&value) noexcept; ///< @private + simdjson_inline simdjson_result(fallback::ondemand::token_iterator &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; simdjson_inline ~simdjson_result() noexcept = default; ///< @private @@ -35981,9 +77056,9 @@ struct simdjson_result<arm64::ondemand::token_iterator> : public arm64::implemen } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_H -/* end file simdjson/generic/ondemand/token_iterator.h for arm64 */ -/* including simdjson/generic/ondemand/json_iterator.h for arm64: #include "simdjson/generic/ondemand/json_iterator.h" */ -/* begin file simdjson/generic/ondemand/json_iterator.h for arm64 */ +/* end file simdjson/generic/ondemand/token_iterator.h for fallback */ +/* including simdjson/generic/ondemand/json_iterator.h for fallback: #include "simdjson/generic/ondemand/json_iterator.h" */ +/* begin file simdjson/generic/ondemand/json_iterator.h for fallback */ #ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -35994,7 +77069,7 @@ struct simdjson_result<arm64::ondemand::token_iterator> : public arm64::implemen /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace arm64 { +namespace fallback { namespace ondemand { /** @@ -36305,15 +77380,15 @@ class json_iterator { }; // json_iterator } // namespace ondemand -} // namespace arm64 +} // namespace fallback } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<arm64::ondemand::json_iterator> : public arm64::implementation_simdjson_result_base<arm64::ondemand::json_iterator> { +struct simdjson_result<fallback::ondemand::json_iterator> : public fallback::implementation_simdjson_result_base<fallback::ondemand::json_iterator> { public: - simdjson_inline simdjson_result(arm64::ondemand::json_iterator &&value) noexcept; ///< @private + simdjson_inline simdjson_result(fallback::ondemand::json_iterator &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; @@ -36322,9 +77397,9 @@ struct simdjson_result<arm64::ondemand::json_iterator> : public arm64::implement } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_H -/* end file simdjson/generic/ondemand/json_iterator.h for arm64 */ -/* including simdjson/generic/ondemand/json_type.h for arm64: #include "simdjson/generic/ondemand/json_type.h" */ -/* begin file simdjson/generic/ondemand/json_type.h for arm64 */ +/* end file simdjson/generic/ondemand/json_iterator.h for fallback */ +/* including simdjson/generic/ondemand/json_type.h for fallback: #include "simdjson/generic/ondemand/json_type.h" */ +/* begin file simdjson/generic/ondemand/json_type.h for fallback */ #ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -36335,7 +77410,7 @@ struct simdjson_result<arm64::ondemand::json_iterator> : public arm64::implement /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace arm64 { +namespace fallback { namespace ondemand { /** @@ -36469,15 +77544,15 @@ inline std::ostream& operator<<(std::ostream& out, simdjson_result<json_type> &t #endif } // namespace ondemand -} // namespace arm64 +} // namespace fallback } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<arm64::ondemand::json_type> : public arm64::implementation_simdjson_result_base<arm64::ondemand::json_type> { +struct simdjson_result<fallback::ondemand::json_type> : public fallback::implementation_simdjson_result_base<fallback::ondemand::json_type> { public: - simdjson_inline simdjson_result(arm64::ondemand::json_type &&value) noexcept; ///< @private + simdjson_inline simdjson_result(fallback::ondemand::json_type &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; simdjson_inline ~simdjson_result() noexcept = default; ///< @private @@ -36486,9 +77561,9 @@ struct simdjson_result<arm64::ondemand::json_type> : public arm64::implementatio } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_H -/* end file simdjson/generic/ondemand/json_type.h for arm64 */ -/* including simdjson/generic/ondemand/raw_json_string.h for arm64: #include "simdjson/generic/ondemand/raw_json_string.h" */ -/* begin file simdjson/generic/ondemand/raw_json_string.h for arm64 */ +/* end file simdjson/generic/ondemand/json_type.h for fallback */ +/* including simdjson/generic/ondemand/raw_json_string.h for fallback: #include "simdjson/generic/ondemand/raw_json_string.h" */ +/* begin file simdjson/generic/ondemand/raw_json_string.h for fallback */ #ifndef SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -36498,7 +77573,7 @@ struct simdjson_result<arm64::ondemand::json_type> : public arm64::implementatio /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace arm64 { +namespace fallback { namespace ondemand { /** @@ -36680,30 +77755,30 @@ simdjson_unused simdjson_inline bool operator!=(std::string_view c, const raw_js } // namespace ondemand -} // namespace arm64 +} // namespace fallback } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<arm64::ondemand::raw_json_string> : public arm64::implementation_simdjson_result_base<arm64::ondemand::raw_json_string> { +struct simdjson_result<fallback::ondemand::raw_json_string> : public fallback::implementation_simdjson_result_base<fallback::ondemand::raw_json_string> { public: - simdjson_inline simdjson_result(arm64::ondemand::raw_json_string &&value) noexcept; ///< @private + simdjson_inline simdjson_result(fallback::ondemand::raw_json_string &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; simdjson_inline ~simdjson_result() noexcept = default; ///< @private simdjson_inline simdjson_result<const char *> raw() const noexcept; simdjson_inline char operator[](size_t) const noexcept; - simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> unescape(arm64::ondemand::json_iterator &iter, bool allow_replacement) const noexcept; - simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> unescape_wobbly(arm64::ondemand::json_iterator &iter) const noexcept; + simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> unescape(fallback::ondemand::json_iterator &iter, bool allow_replacement) const noexcept; + simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> unescape_wobbly(fallback::ondemand::json_iterator &iter) const noexcept; }; } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_H -/* end file simdjson/generic/ondemand/raw_json_string.h for arm64 */ -/* including simdjson/generic/ondemand/parser.h for arm64: #include "simdjson/generic/ondemand/parser.h" */ -/* begin file simdjson/generic/ondemand/parser.h for arm64 */ +/* end file simdjson/generic/ondemand/raw_json_string.h for fallback */ +/* including simdjson/generic/ondemand/parser.h for fallback: #include "simdjson/generic/ondemand/parser.h" */ +/* begin file simdjson/generic/ondemand/parser.h for fallback */ #ifndef SIMDJSON_GENERIC_ONDEMAND_PARSER_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -36716,7 +77791,7 @@ struct simdjson_result<arm64::ondemand::raw_json_string> : public arm64::impleme #include <thread> namespace simdjson { -namespace arm64 { +namespace fallback { namespace ondemand { /** @@ -37116,15 +78191,15 @@ class parser { }; } // namespace ondemand -} // namespace arm64 +} // namespace fallback } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<arm64::ondemand::parser> : public arm64::implementation_simdjson_result_base<arm64::ondemand::parser> { +struct simdjson_result<fallback::ondemand::parser> : public fallback::implementation_simdjson_result_base<fallback::ondemand::parser> { public: - simdjson_inline simdjson_result(arm64::ondemand::parser &&value) noexcept; ///< @private + simdjson_inline simdjson_result(fallback::ondemand::parser &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; }; @@ -37132,319 +78207,11 @@ struct simdjson_result<arm64::ondemand::parser> : public arm64::implementation_s } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_PARSER_H -/* end file simdjson/generic/ondemand/parser.h for arm64 */ - -// JSON builder - needed for extract_into functionality -/* including simdjson/generic/ondemand/json_string_builder.h for arm64: #include "simdjson/generic/ondemand/json_string_builder.h" */ -/* begin file simdjson/generic/ondemand/json_string_builder.h for arm64 */ -/** - * This file is part of the builder API. It is temporarily in the ondemand directory - * but we will move it to a builder directory later. - */ -#ifndef SIMDJSON_GENERIC_STRING_BUILDER_H - -/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_H */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */ -/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ - -namespace simdjson { - - -#if SIMDJSON_SUPPORTS_CONCEPTS - -namespace arm64 { -namespace builder { - class string_builder; -}} - -template <typename T, typename = void> -struct has_custom_serialization : std::false_type {}; - -inline constexpr struct serialize_tag { - template <typename T> - constexpr void operator()(arm64::builder::string_builder& b, T&& obj) const{ - return tag_invoke(*this, b, std::forward<T>(obj)); - } - - -} serialize{}; -template <typename T> -struct has_custom_serialization<T, std::void_t< - decltype(tag_invoke(serialize, std::declval<arm64::builder::string_builder&>(), std::declval<T&>())) ->> : std::true_type {}; - -template <typename T> -constexpr bool require_custom_serialization = has_custom_serialization<T>::value; -#else -struct has_custom_serialization : std::false_type {}; -#endif // SIMDJSON_SUPPORTS_CONCEPTS - -namespace arm64 { -namespace builder { -/** - * A builder for JSON strings representing documents. This is a low-level - * builder that is not meant to be used directly by end-users. Though it - * supports atomic types (Booleans, strings), it does not support composed - * types (arrays and objects). - * - * Ultimately, this class can support kernel-specific optimizations. E.g., - * it may make use of SIMD instructions to escape strings faster. - */ -class string_builder { -public: - simdjson_inline string_builder(size_t initial_capacity = DEFAULT_INITIAL_CAPACITY); - - static constexpr size_t DEFAULT_INITIAL_CAPACITY = 1024; - - /** - * Append number (includes Booleans). Booleans are mapped to the strings - * false and true. Numbers are converted to strings abiding by the JSON standard. - * Floating-point numbers are converted to the shortest string that 'correctly' - * represents the number. - */ - template<typename number_type, - typename = typename std::enable_if<std::is_arithmetic<number_type>::value>::type> - simdjson_inline void append(number_type v) noexcept; - - /** - * Append character c. - */ - simdjson_inline void append(char c) noexcept; - - /** - * Append the string 'null'. - */ - simdjson_inline void append_null() noexcept; - - /** - * Clear the content. - */ - simdjson_inline void clear() noexcept; - - /** - * Append the std::string_view, after escaping it. - * There is no UTF-8 validation. - */ - simdjson_inline void escape_and_append(std::string_view input) noexcept; - - /** - * Append the std::string_view surrounded by double quotes, after escaping it. - * There is no UTF-8 validation. - */ - simdjson_inline void escape_and_append_with_quotes(std::string_view input) noexcept; -#if SIMDJSON_SUPPORTS_CONCEPTS - template<constevalutil::fixed_string key> - simdjson_inline void escape_and_append_with_quotes() noexcept; -#endif - /** - * Append the character surrounded by double quotes, after escaping it. - * There is no UTF-8 validation. - */ - simdjson_inline void escape_and_append_with_quotes(char input) noexcept; - - /** - * Append the character surrounded by double quotes, after escaping it. - * There is no UTF-8 validation. - */ - simdjson_inline void escape_and_append_with_quotes(const char* input) noexcept; - - /** - * Append the C string directly, without escaping. - * There is no UTF-8 validation. - */ - simdjson_inline void append_raw(const char *c) noexcept; - - /** - * Append "{" to the buffer. - */ - simdjson_inline void start_object() noexcept; - - /** - * Append "}" to the buffer. - */ - simdjson_inline void end_object() noexcept; - - /** - * Append "[" to the buffer. - */ - simdjson_inline void start_array() noexcept; - - /** - * Append "]" to the buffer. - */ - simdjson_inline void end_array() noexcept; - - /** - * Append "," to the buffer. - */ - simdjson_inline void append_comma() noexcept; - - /** - * Append ":" to the buffer. - */ - simdjson_inline void append_colon() noexcept; - - /** - * Append a key-value pair to the buffer. - * The key is escaped and surrounded by double quotes. - * The value is escaped if it is a string. - */ - template<typename key_type, typename value_type> - simdjson_inline void append_key_value(key_type key, value_type value) noexcept; -#if SIMDJSON_SUPPORTS_CONCEPTS - template<constevalutil::fixed_string key, typename value_type> - simdjson_inline void append_key_value(value_type value) noexcept; - - // Support for optional types (std::optional, etc.) - template <concepts::optional_type T> - requires(!require_custom_serialization<T>) - simdjson_inline void append(const T &opt); - - template <typename T> - requires(require_custom_serialization<T>) - simdjson_inline void append(T &&val); - - // Support for string-like types - template <typename T> - requires(std::is_convertible<T, std::string_view>::value || - std::is_same<T, const char*>::value ) - simdjson_inline void append(const T &value); -#endif -#if SIMDJSON_SUPPORTS_RANGES && SIMDJSON_SUPPORTS_CONCEPTS - // Support for range-based appending (std::ranges::view, etc.) - template <std::ranges::range R> -requires (!std::is_convertible<R, std::string_view>::value && !require_custom_serialization<R>) - simdjson_inline void append(const R &range) noexcept; -#endif - /** - * Append the std::string_view directly, without escaping. - * There is no UTF-8 validation. - */ - simdjson_inline void append_raw(std::string_view input) noexcept; - - /** - * Append len characters from str. - * There is no UTF-8 validation. - */ - simdjson_inline void append_raw(const char *str, size_t len) noexcept; -#if SIMDJSON_EXCEPTIONS - /** - * Creates an std::string from the written JSON buffer. - * Throws if memory allocation failed - * - * The result may not be valid UTF-8 if some of your content was not valid UTF-8. - * Use validate_unicode() to check the content if needed. - */ - simdjson_inline operator std::string() const noexcept(false); - - /** - * Creates an std::string_view from the written JSON buffer. - * Throws if memory allocation failed. - * - * The result may not be valid UTF-8 if some of your content was not valid UTF-8. - * Use validate_unicode() to check the content if needed. - */ - simdjson_inline operator std::string_view() const noexcept(false) simdjson_lifetime_bound; -#endif - - /** - * Returns a view on the written JSON buffer. Returns an error - * if memory allocation failed. - * - * The result may not be valid UTF-8 if some of your content was not valid UTF-8. - * Use validate_unicode() to check the content. - */ - simdjson_inline simdjson_result<std::string_view> view() const noexcept; - - /** - * Appends the null character to the buffer and returns - * a pointer to the beginning of the written JSON buffer. - * Returns an error if memory allocation failed. - * The result is null-terminated. - * - * The result may not be valid UTF-8 if some of your content was not valid UTF-8. - * Use validate_unicode() to check the content. - */ - simdjson_inline simdjson_result<const char *> c_str() noexcept; - - /** - * Return true if the content is valid UTF-8. - */ - simdjson_inline bool validate_unicode() const noexcept; - - /** - * Returns the current size of the written JSON buffer. - * If an error occurred, returns 0. - */ - simdjson_inline size_t size() const noexcept; - -private: - /** - * Returns true if we can write at least upcoming_bytes bytes. - * The underlying buffer is reallocated if needed. It is designed - * to be called before writing to the buffer. It should be fast. - */ - simdjson_inline bool capacity_check(size_t upcoming_bytes); - - /** - * Grow the buffer to at least desired_capacity bytes. - * If the allocation fails, is_valid is set to false. We expect - * that this function would not be repeatedly called. - */ - simdjson_inline void grow_buffer(size_t desired_capacity); - - /** - * We use this helper function to make sure that is_valid is kept consistent. - */ - simdjson_inline void set_valid(bool valid) noexcept; - - std::unique_ptr<char[]> buffer{}; - size_t position{0}; - size_t capacity{0}; - bool is_valid{true}; -}; - - - -} -} - - -#if !SIMDJSON_STATIC_REFLECTION -// fallback implementation until we have static reflection -template <class Z> -simdjson_warn_unused simdjson_result<std::string> to_json(const Z &z, size_t initial_capacity = simdjson::arm64::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { - simdjson::arm64::builder::string_builder b(initial_capacity); - b.append(z); - std::string_view s; - auto e = b.view().get(s); - if(e) { return e; } - return std::string(s); -} -template <class Z> -simdjson_warn_unused simdjson_error to_json(const Z &z, std::string &s, size_t initial_capacity = simdjson::arm64::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { - simdjson::arm64::builder::string_builder b(initial_capacity); - b.append(z); - std::string_view sv; - auto e = b.view().get(sv); - if(e) { return e; } - s.assign(sv.data(), sv.size()); - return simdjson::SUCCESS; -} -#endif - -#if SIMDJSON_SUPPORTS_CONCEPTS -#endif // SIMDJSON_SUPPORTS_CONCEPTS - -} // namespace simdjson - -#endif // SIMDJSON_GENERIC_STRING_BUILDER_H -/* end file simdjson/generic/ondemand/json_string_builder.h for arm64 */ +/* end file simdjson/generic/ondemand/parser.h for fallback */ // All other declarations -/* including simdjson/generic/ondemand/array.h for arm64: #include "simdjson/generic/ondemand/array.h" */ -/* begin file simdjson/generic/ondemand/array.h for arm64 */ +/* including simdjson/generic/ondemand/array.h for fallback: #include "simdjson/generic/ondemand/array.h" */ +/* begin file simdjson/generic/ondemand/array.h for fallback */ #ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -37456,7 +78223,7 @@ simdjson_warn_unused simdjson_error to_json(const Z &z, std::string &s, size_t i /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace arm64 { +namespace fallback { namespace ondemand { /** @@ -37676,27 +78443,27 @@ class array { }; } // namespace ondemand -} // namespace arm64 +} // namespace fallback } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<arm64::ondemand::array> : public arm64::implementation_simdjson_result_base<arm64::ondemand::array> { +struct simdjson_result<fallback::ondemand::array> : public fallback::implementation_simdjson_result_base<fallback::ondemand::array> { public: - simdjson_inline simdjson_result(arm64::ondemand::array &&value) noexcept; ///< @private + simdjson_inline simdjson_result(fallback::ondemand::array &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; - simdjson_inline simdjson_result<arm64::ondemand::array_iterator> begin() noexcept; - simdjson_inline simdjson_result<arm64::ondemand::array_iterator> end() noexcept; + simdjson_inline simdjson_result<fallback::ondemand::array_iterator> begin() noexcept; + simdjson_inline simdjson_result<fallback::ondemand::array_iterator> end() noexcept; inline simdjson_result<size_t> count_elements() & noexcept; inline simdjson_result<bool> is_empty() & noexcept; inline simdjson_result<bool> reset() & noexcept; - simdjson_inline simdjson_result<arm64::ondemand::value> at(size_t index) noexcept; - simdjson_inline simdjson_result<arm64::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result<arm64::ondemand::value> at_path(std::string_view json_path) noexcept; - simdjson_inline simdjson_result<std::vector<arm64::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<fallback::ondemand::value> at(size_t index) noexcept; + simdjson_inline simdjson_result<fallback::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result<fallback::ondemand::value> at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<std::vector<fallback::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; simdjson_inline simdjson_result<std::string_view> raw_json() noexcept; #if SIMDJSON_SUPPORTS_CONCEPTS // TODO: move this code into object-inl.h @@ -37704,7 +78471,7 @@ struct simdjson_result<arm64::ondemand::array> : public arm64::implementation_si template<typename T> simdjson_inline simdjson_result<T> get() noexcept { if (error()) { return error(); } - if constexpr (std::is_same_v<T, arm64::ondemand::array>) { + if constexpr (std::is_same_v<T, fallback::ondemand::array>) { return first; } return first.get<T>(); @@ -37712,7 +78479,7 @@ struct simdjson_result<arm64::ondemand::array> : public arm64::implementation_si template<typename T> simdjson_warn_unused simdjson_inline error_code get(T& out) noexcept { if (error()) { return error(); } - if constexpr (std::is_same_v<T, arm64::ondemand::array>) { + if constexpr (std::is_same_v<T, fallback::ondemand::array>) { out = first; } else { SIMDJSON_TRY( first.get<T>(out) ); @@ -37725,13 +78492,14 @@ struct simdjson_result<arm64::ondemand::array> : public arm64::implementation_si } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_H -/* end file simdjson/generic/ondemand/array.h for arm64 */ -/* including simdjson/generic/ondemand/array_iterator.h for arm64: #include "simdjson/generic/ondemand/array_iterator.h" */ -/* begin file simdjson/generic/ondemand/array_iterator.h for arm64 */ +/* end file simdjson/generic/ondemand/array.h for fallback */ +/* including simdjson/generic/ondemand/array_iterator.h for fallback: #include "simdjson/generic/ondemand/array_iterator.h" */ +/* begin file simdjson/generic/ondemand/array_iterator.h for fallback */ #ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ /* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H */ +/* amalgamation skipped (editor-only): #include <iterator> */ /* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */ @@ -37739,7 +78507,7 @@ struct simdjson_result<arm64::ondemand::array> : public arm64::implementation_si namespace simdjson { -namespace arm64 { +namespace fallback { namespace ondemand { /** @@ -37747,11 +78515,17 @@ namespace ondemand { * * This is an input_iterator, meaning: * - It is forward-only - * - * must be called exactly once per element. + * - * must be called at most once per element. * - ++ must be called exactly once in between each * (*, ++, *, ++, * ...) */ class array_iterator { public: + using iterator_category = std::input_iterator_tag; + using value_type = simdjson_result<value>; + using difference_type = std::ptrdiff_t; + using pointer = void; + using reference = value_type; + /** Create a new, invalid array iterator. */ simdjson_inline array_iterator() noexcept = default; @@ -37795,6 +78569,9 @@ class array_iterator { simdjson_warn_unused simdjson_inline bool at_end() const noexcept; private: +#if SIMDJSON_DEVELOPMENT_CHECKS + bool has_been_referenced{false}; +#endif value_iterator iter{}; simdjson_inline array_iterator(const value_iterator &iter) noexcept; @@ -37805,14 +78582,20 @@ class array_iterator { }; } // namespace ondemand -} // namespace arm64 +} // namespace fallback } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<arm64::ondemand::array_iterator> : public arm64::implementation_simdjson_result_base<arm64::ondemand::array_iterator> { - simdjson_inline simdjson_result(arm64::ondemand::array_iterator &&value) noexcept; ///< @private +struct simdjson_result<fallback::ondemand::array_iterator> : public fallback::implementation_simdjson_result_base<fallback::ondemand::array_iterator> { + using iterator_category = std::input_iterator_tag; + using value_type = simdjson_result<fallback::ondemand::value>; + using difference_type = std::ptrdiff_t; + using pointer = void; + using reference = value_type; + + simdjson_inline simdjson_result(fallback::ondemand::array_iterator &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; @@ -37820,10 +78603,10 @@ struct simdjson_result<arm64::ondemand::array_iterator> : public arm64::implemen // Iterator interface // - simdjson_inline simdjson_result<arm64::ondemand::value> operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. - simdjson_inline bool operator==(const simdjson_result<arm64::ondemand::array_iterator> &) const noexcept; - simdjson_inline bool operator!=(const simdjson_result<arm64::ondemand::array_iterator> &) const noexcept; - simdjson_inline simdjson_result<arm64::ondemand::array_iterator> &operator++() noexcept; + simdjson_inline simdjson_result<fallback::ondemand::value> operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. + simdjson_inline bool operator==(const simdjson_result<fallback::ondemand::array_iterator> &) const noexcept; + simdjson_inline bool operator!=(const simdjson_result<fallback::ondemand::array_iterator> &) const noexcept; + simdjson_inline simdjson_result<fallback::ondemand::array_iterator> &operator++() noexcept; simdjson_warn_unused simdjson_inline bool at_end() const noexcept; }; @@ -37831,9 +78614,9 @@ struct simdjson_result<arm64::ondemand::array_iterator> : public arm64::implemen } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H -/* end file simdjson/generic/ondemand/array_iterator.h for arm64 */ -/* including simdjson/generic/ondemand/document.h for arm64: #include "simdjson/generic/ondemand/document.h" */ -/* begin file simdjson/generic/ondemand/document.h for arm64 */ +/* end file simdjson/generic/ondemand/array_iterator.h for fallback */ +/* including simdjson/generic/ondemand/document.h for fallback: #include "simdjson/generic/ondemand/document.h" */ +/* begin file simdjson/generic/ondemand/document.h for fallback */ #ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -37847,7 +78630,7 @@ struct simdjson_result<arm64::ondemand::array_iterator> : public arm64::implemen namespace simdjson { -namespace arm64 { +namespace fallback { namespace ondemand { /** @@ -38799,21 +79582,21 @@ class document_reference { document *doc{nullptr}; }; } // namespace ondemand -} // namespace arm64 +} // namespace fallback } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<arm64::ondemand::document> : public arm64::implementation_simdjson_result_base<arm64::ondemand::document> { +struct simdjson_result<fallback::ondemand::document> : public fallback::implementation_simdjson_result_base<fallback::ondemand::document> { public: - simdjson_inline simdjson_result(arm64::ondemand::document &&value) noexcept; ///< @private + simdjson_inline simdjson_result(fallback::ondemand::document &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; simdjson_inline error_code rewind() noexcept; - simdjson_inline simdjson_result<arm64::ondemand::array> get_array() & noexcept; - simdjson_inline simdjson_result<arm64::ondemand::object> get_object() & noexcept; + simdjson_inline simdjson_result<fallback::ondemand::array> get_array() & noexcept; + simdjson_inline simdjson_result<fallback::ondemand::object> get_object() & noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64() noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64_in_string() noexcept; simdjson_inline simdjson_result<int64_t> get_int64() noexcept; @@ -38824,9 +79607,9 @@ struct simdjson_result<arm64::ondemand::document> : public arm64::implementation template <typename string_type> simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result<std::string_view> get_wobbly_string() noexcept; - simdjson_inline simdjson_result<arm64::ondemand::raw_json_string> get_raw_json_string() noexcept; + simdjson_inline simdjson_result<fallback::ondemand::raw_json_string> get_raw_json_string() noexcept; simdjson_inline simdjson_result<bool> get_bool() noexcept; - simdjson_inline simdjson_result<arm64::ondemand::value> get_value() noexcept; + simdjson_inline simdjson_result<fallback::ondemand::value> get_value() noexcept; simdjson_inline simdjson_result<bool> is_null() noexcept; template<typename T> simdjson_inline simdjson_result<T> get() & noexcept; @@ -38836,33 +79619,33 @@ struct simdjson_result<arm64::ondemand::document> : public arm64::implementation template<typename T> simdjson_inline error_code get(T &out) && noexcept; #if SIMDJSON_EXCEPTIONS - using arm64::implementation_simdjson_result_base<arm64::ondemand::document>::operator*; - using arm64::implementation_simdjson_result_base<arm64::ondemand::document>::operator->; - template <class T, typename std::enable_if<std::is_same<T, arm64::ondemand::document>::value == false>::type> + using fallback::implementation_simdjson_result_base<fallback::ondemand::document>::operator*; + using fallback::implementation_simdjson_result_base<fallback::ondemand::document>::operator->; + template <class T, typename std::enable_if<std::is_same<T, fallback::ondemand::document>::value == false>::type> explicit simdjson_inline operator T() noexcept(false); - simdjson_inline operator arm64::ondemand::array() & noexcept(false); - simdjson_inline operator arm64::ondemand::object() & noexcept(false); + simdjson_inline operator fallback::ondemand::array() & noexcept(false); + simdjson_inline operator fallback::ondemand::object() & noexcept(false); simdjson_inline operator uint64_t() noexcept(false); simdjson_inline operator int64_t() noexcept(false); simdjson_inline operator double() noexcept(false); simdjson_inline operator std::string_view() noexcept(false); - simdjson_inline operator arm64::ondemand::raw_json_string() noexcept(false); + simdjson_inline operator fallback::ondemand::raw_json_string() noexcept(false); simdjson_inline operator bool() noexcept(false); - simdjson_inline operator arm64::ondemand::value() noexcept(false); + simdjson_inline operator fallback::ondemand::value() noexcept(false); #endif simdjson_inline simdjson_result<size_t> count_elements() & noexcept; simdjson_inline simdjson_result<size_t> count_fields() & noexcept; - simdjson_inline simdjson_result<arm64::ondemand::value> at(size_t index) & noexcept; - simdjson_inline simdjson_result<arm64::ondemand::array_iterator> begin() & noexcept; - simdjson_inline simdjson_result<arm64::ondemand::array_iterator> end() & noexcept; - simdjson_inline simdjson_result<arm64::ondemand::value> find_field(std::string_view key) & noexcept; - simdjson_inline simdjson_result<arm64::ondemand::value> find_field(const char *key) & noexcept; - simdjson_inline simdjson_result<arm64::ondemand::value> operator[](std::string_view key) & noexcept; - simdjson_inline simdjson_result<arm64::ondemand::value> operator[](const char *key) & noexcept; - simdjson_result<arm64::ondemand::value> operator[](int) & noexcept = delete; - simdjson_inline simdjson_result<arm64::ondemand::value> find_field_unordered(std::string_view key) & noexcept; - simdjson_inline simdjson_result<arm64::ondemand::value> find_field_unordered(const char *key) & noexcept; - simdjson_inline simdjson_result<arm64::ondemand::json_type> type() noexcept; + simdjson_inline simdjson_result<fallback::ondemand::value> at(size_t index) & noexcept; + simdjson_inline simdjson_result<fallback::ondemand::array_iterator> begin() & noexcept; + simdjson_inline simdjson_result<fallback::ondemand::array_iterator> end() & noexcept; + simdjson_inline simdjson_result<fallback::ondemand::value> find_field(std::string_view key) & noexcept; + simdjson_inline simdjson_result<fallback::ondemand::value> find_field(const char *key) & noexcept; + simdjson_inline simdjson_result<fallback::ondemand::value> operator[](std::string_view key) & noexcept; + simdjson_inline simdjson_result<fallback::ondemand::value> operator[](const char *key) & noexcept; + simdjson_result<fallback::ondemand::value> operator[](int) & noexcept = delete; + simdjson_inline simdjson_result<fallback::ondemand::value> find_field_unordered(std::string_view key) & noexcept; + simdjson_inline simdjson_result<fallback::ondemand::value> find_field_unordered(const char *key) & noexcept; + simdjson_inline simdjson_result<fallback::ondemand::json_type> type() noexcept; simdjson_inline simdjson_result<bool> is_scalar() noexcept; simdjson_inline simdjson_result<bool> is_string() noexcept; simdjson_inline simdjson_result<const char *> current_location() noexcept; @@ -38870,14 +79653,14 @@ struct simdjson_result<arm64::ondemand::document> : public arm64::implementation simdjson_inline bool at_end() const noexcept; simdjson_inline bool is_negative() noexcept; simdjson_inline simdjson_result<bool> is_integer() noexcept; - simdjson_inline simdjson_result<arm64::number_type> get_number_type() noexcept; - simdjson_inline simdjson_result<arm64::ondemand::number> get_number() noexcept; + simdjson_inline simdjson_result<fallback::number_type> get_number_type() noexcept; + simdjson_inline simdjson_result<fallback::ondemand::number> get_number() noexcept; /** @copydoc simdjson_inline std::string_view document::raw_json_token() const noexcept */ simdjson_inline simdjson_result<std::string_view> raw_json_token() noexcept; - simdjson_inline simdjson_result<arm64::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result<arm64::ondemand::value> at_path(std::string_view json_path) noexcept; - simdjson_inline simdjson_result<std::vector<arm64::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<fallback::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result<fallback::ondemand::value> at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<std::vector<fallback::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; #if SIMDJSON_STATIC_REFLECTION template<constevalutil::fixed_string... FieldNames, typename T> requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) @@ -38893,14 +79676,14 @@ struct simdjson_result<arm64::ondemand::document> : public arm64::implementation namespace simdjson { template<> -struct simdjson_result<arm64::ondemand::document_reference> : public arm64::implementation_simdjson_result_base<arm64::ondemand::document_reference> { +struct simdjson_result<fallback::ondemand::document_reference> : public fallback::implementation_simdjson_result_base<fallback::ondemand::document_reference> { public: - simdjson_inline simdjson_result(arm64::ondemand::document_reference value, error_code error) noexcept; + simdjson_inline simdjson_result(fallback::ondemand::document_reference value, error_code error) noexcept; simdjson_inline simdjson_result() noexcept = default; simdjson_inline error_code rewind() noexcept; - simdjson_inline simdjson_result<arm64::ondemand::array> get_array() & noexcept; - simdjson_inline simdjson_result<arm64::ondemand::object> get_object() & noexcept; + simdjson_inline simdjson_result<fallback::ondemand::array> get_array() & noexcept; + simdjson_inline simdjson_result<fallback::ondemand::object> get_object() & noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64() noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64_in_string() noexcept; simdjson_inline simdjson_result<int64_t> get_int64() noexcept; @@ -38911,9 +79694,9 @@ struct simdjson_result<arm64::ondemand::document_reference> : public arm64::impl template <typename string_type> simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result<std::string_view> get_wobbly_string() noexcept; - simdjson_inline simdjson_result<arm64::ondemand::raw_json_string> get_raw_json_string() noexcept; + simdjson_inline simdjson_result<fallback::ondemand::raw_json_string> get_raw_json_string() noexcept; simdjson_inline simdjson_result<bool> get_bool() noexcept; - simdjson_inline simdjson_result<arm64::ondemand::value> get_value() noexcept; + simdjson_inline simdjson_result<fallback::ondemand::value> get_value() noexcept; simdjson_inline simdjson_result<bool> is_null() noexcept; template<typename T> simdjson_inline simdjson_result<T> get() & noexcept; @@ -38924,43 +79707,43 @@ struct simdjson_result<arm64::ondemand::document_reference> : public arm64::impl #if SIMDJSON_EXCEPTIONS template <class T> explicit simdjson_inline operator T() noexcept(false); - simdjson_inline operator arm64::ondemand::array() & noexcept(false); - simdjson_inline operator arm64::ondemand::object() & noexcept(false); + simdjson_inline operator fallback::ondemand::array() & noexcept(false); + simdjson_inline operator fallback::ondemand::object() & noexcept(false); simdjson_inline operator uint64_t() noexcept(false); simdjson_inline operator int64_t() noexcept(false); simdjson_inline operator double() noexcept(false); simdjson_inline operator std::string_view() noexcept(false); - simdjson_inline operator arm64::ondemand::raw_json_string() noexcept(false); + simdjson_inline operator fallback::ondemand::raw_json_string() noexcept(false); simdjson_inline operator bool() noexcept(false); - simdjson_inline operator arm64::ondemand::value() noexcept(false); + simdjson_inline operator fallback::ondemand::value() noexcept(false); #endif simdjson_inline simdjson_result<size_t> count_elements() & noexcept; simdjson_inline simdjson_result<size_t> count_fields() & noexcept; - simdjson_inline simdjson_result<arm64::ondemand::value> at(size_t index) & noexcept; - simdjson_inline simdjson_result<arm64::ondemand::array_iterator> begin() & noexcept; - simdjson_inline simdjson_result<arm64::ondemand::array_iterator> end() & noexcept; - simdjson_inline simdjson_result<arm64::ondemand::value> find_field(std::string_view key) & noexcept; - simdjson_inline simdjson_result<arm64::ondemand::value> find_field(const char *key) & noexcept; - simdjson_inline simdjson_result<arm64::ondemand::value> operator[](std::string_view key) & noexcept; - simdjson_inline simdjson_result<arm64::ondemand::value> operator[](const char *key) & noexcept; - simdjson_result<arm64::ondemand::value> operator[](int) & noexcept = delete; - simdjson_inline simdjson_result<arm64::ondemand::value> find_field_unordered(std::string_view key) & noexcept; - simdjson_inline simdjson_result<arm64::ondemand::value> find_field_unordered(const char *key) & noexcept; - simdjson_inline simdjson_result<arm64::ondemand::json_type> type() noexcept; + simdjson_inline simdjson_result<fallback::ondemand::value> at(size_t index) & noexcept; + simdjson_inline simdjson_result<fallback::ondemand::array_iterator> begin() & noexcept; + simdjson_inline simdjson_result<fallback::ondemand::array_iterator> end() & noexcept; + simdjson_inline simdjson_result<fallback::ondemand::value> find_field(std::string_view key) & noexcept; + simdjson_inline simdjson_result<fallback::ondemand::value> find_field(const char *key) & noexcept; + simdjson_inline simdjson_result<fallback::ondemand::value> operator[](std::string_view key) & noexcept; + simdjson_inline simdjson_result<fallback::ondemand::value> operator[](const char *key) & noexcept; + simdjson_result<fallback::ondemand::value> operator[](int) & noexcept = delete; + simdjson_inline simdjson_result<fallback::ondemand::value> find_field_unordered(std::string_view key) & noexcept; + simdjson_inline simdjson_result<fallback::ondemand::value> find_field_unordered(const char *key) & noexcept; + simdjson_inline simdjson_result<fallback::ondemand::json_type> type() noexcept; simdjson_inline simdjson_result<bool> is_scalar() noexcept; simdjson_inline simdjson_result<bool> is_string() noexcept; simdjson_inline simdjson_result<const char *> current_location() noexcept; simdjson_inline simdjson_result<int32_t> current_depth() const noexcept; simdjson_inline simdjson_result<bool> is_negative() noexcept; simdjson_inline simdjson_result<bool> is_integer() noexcept; - simdjson_inline simdjson_result<arm64::number_type> get_number_type() noexcept; - simdjson_inline simdjson_result<arm64::ondemand::number> get_number() noexcept; + simdjson_inline simdjson_result<fallback::number_type> get_number_type() noexcept; + simdjson_inline simdjson_result<fallback::ondemand::number> get_number() noexcept; /** @copydoc simdjson_inline std::string_view document_reference::raw_json_token() const noexcept */ simdjson_inline simdjson_result<std::string_view> raw_json_token() noexcept; - simdjson_inline simdjson_result<arm64::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result<arm64::ondemand::value> at_path(std::string_view json_path) noexcept; - simdjson_inline simdjson_result<std::vector<arm64::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<fallback::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result<fallback::ondemand::value> at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<std::vector<fallback::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; #if SIMDJSON_STATIC_REFLECTION template<constevalutil::fixed_string... FieldNames, typename T> requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) @@ -38972,9 +79755,9 @@ struct simdjson_result<arm64::ondemand::document_reference> : public arm64::impl } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_H -/* end file simdjson/generic/ondemand/document.h for arm64 */ -/* including simdjson/generic/ondemand/document_stream.h for arm64: #include "simdjson/generic/ondemand/document_stream.h" */ -/* begin file simdjson/generic/ondemand/document_stream.h for arm64 */ +/* end file simdjson/generic/ondemand/document.h for fallback */ +/* including simdjson/generic/ondemand/document_stream.h for fallback: #include "simdjson/generic/ondemand/document_stream.h" */ +/* begin file simdjson/generic/ondemand/document_stream.h for fallback */ #ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -38992,7 +79775,7 @@ struct simdjson_result<arm64::ondemand::document_reference> : public arm64::impl #endif namespace simdjson { -namespace arm64 { +namespace fallback { namespace ondemand { #ifdef SIMDJSON_THREADS_ENABLED @@ -39305,14 +80088,14 @@ class document_stream { }; // document_stream } // namespace ondemand -} // namespace arm64 +} // namespace fallback } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<arm64::ondemand::document_stream> : public arm64::implementation_simdjson_result_base<arm64::ondemand::document_stream> { +struct simdjson_result<fallback::ondemand::document_stream> : public fallback::implementation_simdjson_result_base<fallback::ondemand::document_stream> { public: - simdjson_inline simdjson_result(arm64::ondemand::document_stream &&value) noexcept; ///< @private + simdjson_inline simdjson_result(fallback::ondemand::document_stream &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; }; @@ -39320,9 +80103,9 @@ struct simdjson_result<arm64::ondemand::document_stream> : public arm64::impleme } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_H -/* end file simdjson/generic/ondemand/document_stream.h for arm64 */ -/* including simdjson/generic/ondemand/field.h for arm64: #include "simdjson/generic/ondemand/field.h" */ -/* begin file simdjson/generic/ondemand/field.h for arm64 */ +/* end file simdjson/generic/ondemand/document_stream.h for fallback */ +/* including simdjson/generic/ondemand/field.h for fallback: #include "simdjson/generic/ondemand/field.h" */ +/* begin file simdjson/generic/ondemand/field.h for fallback */ #ifndef SIMDJSON_GENERIC_ONDEMAND_FIELD_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -39334,7 +80117,7 @@ struct simdjson_result<arm64::ondemand::document_stream> : public arm64::impleme /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace arm64 { +namespace fallback { namespace ondemand { /** @@ -39412,33 +80195,33 @@ class field : public std::pair<raw_json_string, value> { }; } // namespace ondemand -} // namespace arm64 +} // namespace fallback } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<arm64::ondemand::field> : public arm64::implementation_simdjson_result_base<arm64::ondemand::field> { +struct simdjson_result<fallback::ondemand::field> : public fallback::implementation_simdjson_result_base<fallback::ondemand::field> { public: - simdjson_inline simdjson_result(arm64::ondemand::field &&value) noexcept; ///< @private + simdjson_inline simdjson_result(fallback::ondemand::field &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; simdjson_inline simdjson_result<std::string_view> unescaped_key(bool allow_replacement = false) noexcept; template<typename string_type> simdjson_inline error_code unescaped_key(string_type &receiver, bool allow_replacement = false) noexcept; - simdjson_inline simdjson_result<arm64::ondemand::raw_json_string> key() noexcept; + simdjson_inline simdjson_result<fallback::ondemand::raw_json_string> key() noexcept; simdjson_inline simdjson_result<std::string_view> key_raw_json_token() noexcept; simdjson_inline simdjson_result<std::string_view> escaped_key() noexcept; - simdjson_inline simdjson_result<arm64::ondemand::value> value() noexcept; + simdjson_inline simdjson_result<fallback::ondemand::value> value() noexcept; }; } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_FIELD_H -/* end file simdjson/generic/ondemand/field.h for arm64 */ -/* including simdjson/generic/ondemand/object.h for arm64: #include "simdjson/generic/ondemand/object.h" */ -/* begin file simdjson/generic/ondemand/object.h for arm64 */ +/* end file simdjson/generic/ondemand/field.h for fallback */ +/* including simdjson/generic/ondemand/object.h for fallback: #include "simdjson/generic/ondemand/object.h" */ +/* begin file simdjson/generic/ondemand/object.h for fallback */ #ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -39453,7 +80236,7 @@ struct simdjson_result<arm64::ondemand::field> : public arm64::implementation_si /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace arm64 { +namespace fallback { namespace ondemand { /** @@ -39468,6 +80251,13 @@ class object { */ simdjson_inline object() noexcept = default; + /** + * Get an iterator to the start of the object. We recommend using a range-based for loop. + * + * Using the iterator directly is also possible but error-prone and discouraged. In particular, + * you must dereference the iterator exactly once per iteration (before calling '++'). + * Doing otherwise is unsafe and may lead to errors. You are responsible for ensuring + */ simdjson_inline simdjson_result<object_iterator> begin() noexcept; simdjson_inline simdjson_result<object_iterator> end() noexcept; /** @@ -39740,29 +80530,29 @@ class object { }; } // namespace ondemand -} // namespace arm64 +} // namespace fallback } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<arm64::ondemand::object> : public arm64::implementation_simdjson_result_base<arm64::ondemand::object> { +struct simdjson_result<fallback::ondemand::object> : public fallback::implementation_simdjson_result_base<fallback::ondemand::object> { public: - simdjson_inline simdjson_result(arm64::ondemand::object &&value) noexcept; ///< @private + simdjson_inline simdjson_result(fallback::ondemand::object &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; - simdjson_inline simdjson_result<arm64::ondemand::object_iterator> begin() noexcept; - simdjson_inline simdjson_result<arm64::ondemand::object_iterator> end() noexcept; - simdjson_inline simdjson_result<arm64::ondemand::value> find_field(std::string_view key) & noexcept; - simdjson_inline simdjson_result<arm64::ondemand::value> find_field(std::string_view key) && noexcept; - simdjson_inline simdjson_result<arm64::ondemand::value> find_field_unordered(std::string_view key) & noexcept; - simdjson_inline simdjson_result<arm64::ondemand::value> find_field_unordered(std::string_view key) && noexcept; - simdjson_inline simdjson_result<arm64::ondemand::value> operator[](std::string_view key) & noexcept; - simdjson_inline simdjson_result<arm64::ondemand::value> operator[](std::string_view key) && noexcept; - simdjson_inline simdjson_result<arm64::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result<arm64::ondemand::value> at_path(std::string_view json_path) noexcept; - simdjson_inline simdjson_result<std::vector<arm64::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<fallback::ondemand::object_iterator> begin() noexcept; + simdjson_inline simdjson_result<fallback::ondemand::object_iterator> end() noexcept; + simdjson_inline simdjson_result<fallback::ondemand::value> find_field(std::string_view key) & noexcept; + simdjson_inline simdjson_result<fallback::ondemand::value> find_field(std::string_view key) && noexcept; + simdjson_inline simdjson_result<fallback::ondemand::value> find_field_unordered(std::string_view key) & noexcept; + simdjson_inline simdjson_result<fallback::ondemand::value> find_field_unordered(std::string_view key) && noexcept; + simdjson_inline simdjson_result<fallback::ondemand::value> operator[](std::string_view key) & noexcept; + simdjson_inline simdjson_result<fallback::ondemand::value> operator[](std::string_view key) && noexcept; + simdjson_inline simdjson_result<fallback::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result<fallback::ondemand::value> at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<std::vector<fallback::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; inline simdjson_result<bool> reset() noexcept; inline simdjson_result<bool> is_empty() noexcept; inline simdjson_result<size_t> count_fields() & noexcept; @@ -39773,7 +80563,7 @@ struct simdjson_result<arm64::ondemand::object> : public arm64::implementation_s template<typename T> simdjson_inline simdjson_result<T> get() noexcept { if (error()) { return error(); } - if constexpr (std::is_same_v<T, arm64::ondemand::object>) { + if constexpr (std::is_same_v<T, fallback::ondemand::object>) { return first; } return first.get<T>(); @@ -39781,7 +80571,7 @@ struct simdjson_result<arm64::ondemand::object> : public arm64::implementation_s template<typename T> simdjson_warn_unused simdjson_inline error_code get(T& out) noexcept { if (error()) { return error(); } - if constexpr (std::is_same_v<T, arm64::ondemand::object>) { + if constexpr (std::is_same_v<T, fallback::ondemand::object>) { out = first; } else { SIMDJSON_TRY( first.get<T>(out) ); @@ -39804,9 +80594,9 @@ struct simdjson_result<arm64::ondemand::object> : public arm64::implementation_s } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_H -/* end file simdjson/generic/ondemand/object.h for arm64 */ -/* including simdjson/generic/ondemand/object_iterator.h for arm64: #include "simdjson/generic/ondemand/object_iterator.h" */ -/* begin file simdjson/generic/ondemand/object_iterator.h for arm64 */ +/* end file simdjson/generic/ondemand/object.h for fallback */ +/* including simdjson/generic/ondemand/object_iterator.h for fallback: #include "simdjson/generic/ondemand/object_iterator.h" */ +/* begin file simdjson/generic/ondemand/object_iterator.h for fallback */ #ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -39817,7 +80607,7 @@ struct simdjson_result<arm64::ondemand::object> : public arm64::implementation_s /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace arm64 { +namespace fallback { namespace ondemand { class object_iterator { @@ -39841,9 +80631,14 @@ class object_iterator { // Assumes it's being compared with the end. true if depth >= iter->depth. simdjson_inline bool operator!=(const object_iterator &) const noexcept; // Checks for ']' and ',' + // YOU MUST NOT CALL THIS IF operator* YIELDED AN ERROR. + // YOU MUST NOT CALL THIS WITHOUT A CORRESPONDING operator* CALL. simdjson_inline object_iterator &operator++() noexcept; private: +#if SIMDJSON_DEVELOPMENT_CHECKS + bool has_been_referenced{false}; +#endif /** * The underlying JSON iterator. * @@ -39858,15 +80653,15 @@ class object_iterator { }; } // namespace ondemand -} // namespace arm64 +} // namespace fallback } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<arm64::ondemand::object_iterator> : public arm64::implementation_simdjson_result_base<arm64::ondemand::object_iterator> { +struct simdjson_result<fallback::ondemand::object_iterator> : public fallback::implementation_simdjson_result_base<fallback::ondemand::object_iterator> { public: - simdjson_inline simdjson_result(arm64::ondemand::object_iterator &&value) noexcept; ///< @private + simdjson_inline simdjson_result(fallback::ondemand::object_iterator &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; @@ -39875,21 +80670,21 @@ struct simdjson_result<arm64::ondemand::object_iterator> : public arm64::impleme // // Reads key and value, yielding them to the user. - simdjson_inline simdjson_result<arm64::ondemand::field> operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. + simdjson_inline simdjson_result<fallback::ondemand::field> operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. // Assumes it's being compared with the end. true if depth < iter->depth. - simdjson_inline bool operator==(const simdjson_result<arm64::ondemand::object_iterator> &) const noexcept; + simdjson_inline bool operator==(const simdjson_result<fallback::ondemand::object_iterator> &) const noexcept; // Assumes it's being compared with the end. true if depth >= iter->depth. - simdjson_inline bool operator!=(const simdjson_result<arm64::ondemand::object_iterator> &) const noexcept; + simdjson_inline bool operator!=(const simdjson_result<fallback::ondemand::object_iterator> &) const noexcept; // Checks for ']' and ',' - simdjson_inline simdjson_result<arm64::ondemand::object_iterator> &operator++() noexcept; + simdjson_inline simdjson_result<fallback::ondemand::object_iterator> &operator++() noexcept; }; } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_H -/* end file simdjson/generic/ondemand/object_iterator.h for arm64 */ -/* including simdjson/generic/ondemand/serialization.h for arm64: #include "simdjson/generic/ondemand/serialization.h" */ -/* begin file simdjson/generic/ondemand/serialization.h for arm64 */ +/* end file simdjson/generic/ondemand/object_iterator.h for fallback */ +/* including simdjson/generic/ondemand/serialization.h for fallback: #include "simdjson/generic/ondemand/serialization.h" */ +/* begin file simdjson/generic/ondemand/serialization.h for fallback */ #ifndef SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -39903,30 +80698,30 @@ namespace simdjson { * contains JSON text that is suitable to be parsed as JSON again. It does not * validate the content. */ -inline simdjson_result<std::string_view> to_json_string(arm64::ondemand::document& x) noexcept; +inline simdjson_result<std::string_view> to_json_string(fallback::ondemand::document& x) noexcept; /** * Create a string-view instance out of a value instance. The string-view instance * contains JSON text that is suitable to be parsed as JSON again. The value must * not have been accessed previously. It does not * validate the content. */ -inline simdjson_result<std::string_view> to_json_string(arm64::ondemand::value& x) noexcept; +inline simdjson_result<std::string_view> to_json_string(fallback::ondemand::value& x) noexcept; /** * Create a string-view instance out of an object instance. The string-view instance * contains JSON text that is suitable to be parsed as JSON again. It does not * validate the content. */ -inline simdjson_result<std::string_view> to_json_string(arm64::ondemand::object& x) noexcept; +inline simdjson_result<std::string_view> to_json_string(fallback::ondemand::object& x) noexcept; /** * Create a string-view instance out of an array instance. The string-view instance * contains JSON text that is suitable to be parsed as JSON again. It does not * validate the content. */ -inline simdjson_result<std::string_view> to_json_string(arm64::ondemand::array& x) noexcept; -inline simdjson_result<std::string_view> to_json_string(simdjson_result<arm64::ondemand::document> x); -inline simdjson_result<std::string_view> to_json_string(simdjson_result<arm64::ondemand::value> x); -inline simdjson_result<std::string_view> to_json_string(simdjson_result<arm64::ondemand::object> x); -inline simdjson_result<std::string_view> to_json_string(simdjson_result<arm64::ondemand::array> x); +inline simdjson_result<std::string_view> to_json_string(fallback::ondemand::array& x) noexcept; +inline simdjson_result<std::string_view> to_json_string(simdjson_result<fallback::ondemand::document> x); +inline simdjson_result<std::string_view> to_json_string(simdjson_result<fallback::ondemand::value> x); +inline simdjson_result<std::string_view> to_json_string(simdjson_result<fallback::ondemand::object> x); +inline simdjson_result<std::string_view> to_json_string(simdjson_result<fallback::ondemand::array> x); #if SIMDJSON_STATIC_REFLECTION /** @@ -39934,10 +80729,10 @@ inline simdjson_result<std::string_view> to_json_string(simdjson_result<arm64::o * Only available when SIMDJSON_STATIC_REFLECTION is enabled. */ template<typename T> - requires(!std::same_as<T, arm64::ondemand::document> && - !std::same_as<T, arm64::ondemand::value> && - !std::same_as<T, arm64::ondemand::object> && - !std::same_as<T, arm64::ondemand::array>) + requires(!std::same_as<T, fallback::ondemand::document> && + !std::same_as<T, fallback::ondemand::value> && + !std::same_as<T, fallback::ondemand::object> && + !std::same_as<T, fallback::ondemand::array>) inline std::string to_json_string(const T& obj); #endif @@ -39950,7 +80745,7 @@ inline std::string to_json_string(const T& obj); * Credit: @madhur4127 * See https://github.com/simdjson/simdjson/issues/1768 */ -namespace simdjson { namespace arm64 { namespace ondemand { +namespace simdjson { namespace fallback { namespace ondemand { /** * Print JSON to an output stream. It does not @@ -39960,9 +80755,9 @@ namespace simdjson { namespace arm64 { namespace ondemand { * @param value The element. * @throw if there is an error with the underlying output stream. simdjson itself will not throw. */ -inline std::ostream& operator<<(std::ostream& out, simdjson::arm64::ondemand::value x); +inline std::ostream& operator<<(std::ostream& out, simdjson::fallback::ondemand::value x); #if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::arm64::ondemand::value> x); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::fallback::ondemand::value> x); #endif /** * Print JSON to an output stream. It does not @@ -39972,9 +80767,9 @@ inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<sim * @param value The array. * @throw if there is an error with the underlying output stream. simdjson itself will not throw. */ -inline std::ostream& operator<<(std::ostream& out, simdjson::arm64::ondemand::array value); +inline std::ostream& operator<<(std::ostream& out, simdjson::fallback::ondemand::array value); #if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::arm64::ondemand::array> x); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::fallback::ondemand::array> x); #endif /** * Print JSON to an output stream. It does not @@ -39984,13 +80779,13 @@ inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<sim * @param value The array. * @throw if there is an error with the underlying output stream. simdjson itself will not throw. */ -inline std::ostream& operator<<(std::ostream& out, simdjson::arm64::ondemand::document& value); +inline std::ostream& operator<<(std::ostream& out, simdjson::fallback::ondemand::document& value); #if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::arm64::ondemand::document>&& x); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::fallback::ondemand::document>&& x); #endif -inline std::ostream& operator<<(std::ostream& out, simdjson::arm64::ondemand::document_reference& value); +inline std::ostream& operator<<(std::ostream& out, simdjson::fallback::ondemand::document_reference& value); #if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::arm64::ondemand::document_reference>&& x); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::fallback::ondemand::document_reference>&& x); #endif /** * Print JSON to an output stream. It does not @@ -40000,18 +80795,18 @@ inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<sim * @param value The object. * @throw if there is an error with the underlying output stream. simdjson itself will not throw. */ -inline std::ostream& operator<<(std::ostream& out, simdjson::arm64::ondemand::object value); +inline std::ostream& operator<<(std::ostream& out, simdjson::fallback::ondemand::object value); #if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::arm64::ondemand::object> x); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::fallback::ondemand::object> x); #endif -}}} // namespace simdjson::arm64::ondemand +}}} // namespace simdjson::fallback::ondemand #endif // SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_H -/* end file simdjson/generic/ondemand/serialization.h for arm64 */ +/* end file simdjson/generic/ondemand/serialization.h for fallback */ // Deserialization for standard types -/* including simdjson/generic/ondemand/std_deserialize.h for arm64: #include "simdjson/generic/ondemand/std_deserialize.h" */ -/* begin file simdjson/generic/ondemand/std_deserialize.h for arm64 */ +/* including simdjson/generic/ondemand/std_deserialize.h for fallback: #include "simdjson/generic/ondemand/std_deserialize.h" */ +/* begin file simdjson/generic/ondemand/std_deserialize.h for fallback */ #if SIMDJSON_SUPPORTS_CONCEPTS #ifndef SIMDJSON_ONDEMAND_DESERIALIZE_H @@ -40110,8 +80905,8 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { static_assert( std::is_default_constructible_v<value_type>, "The specified type inside the container must default constructible."); - arm64::ondemand::array arr; - if constexpr (std::is_same_v<std::remove_cvref_t<ValT>, arm64::ondemand::array>) { + fallback::ondemand::array arr; + if constexpr (std::is_same_v<std::remove_cvref_t<ValT>, fallback::ondemand::array>) { arr = val; } else { SIMDJSON_TRY(val.get_array().get(arr)); @@ -40155,7 +80950,7 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { static_assert( std::is_default_constructible_v<value_type>, "The specified value type inside the container must default constructible."); - arm64::ondemand::object obj; + fallback::ondemand::object obj; SIMDJSON_TRY(val.get_object().get(obj)); for (auto field : obj) { std::string_view key; @@ -40173,7 +80968,7 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { } template <concepts::string_view_keyed_map T> -error_code tag_invoke(deserialize_tag, arm64::ondemand::object &obj, T &out) noexcept { +error_code tag_invoke(deserialize_tag, fallback::ondemand::object &obj, T &out) noexcept { using value_type = typename std::remove_cvref_t<T>::mapped_type; out.clear(); @@ -40181,7 +80976,7 @@ error_code tag_invoke(deserialize_tag, arm64::ondemand::object &obj, T &out) noe std::string_view key; SIMDJSON_TRY(field.unescaped_key().get(key)); - arm64::ondemand::value value_obj; + fallback::ondemand::value value_obj; SIMDJSON_TRY(field.value().get(value_obj)); value_type this_value; @@ -40192,22 +80987,22 @@ error_code tag_invoke(deserialize_tag, arm64::ondemand::object &obj, T &out) noe } template <concepts::string_view_keyed_map T> -error_code tag_invoke(deserialize_tag, arm64::ondemand::value &val, T &out) noexcept { - arm64::ondemand::object obj; +error_code tag_invoke(deserialize_tag, fallback::ondemand::value &val, T &out) noexcept { + fallback::ondemand::object obj; SIMDJSON_TRY(val.get_object().get(obj)); return simdjson::deserialize(obj, out); } template <concepts::string_view_keyed_map T> -error_code tag_invoke(deserialize_tag, arm64::ondemand::document &doc, T &out) noexcept { - arm64::ondemand::object obj; +error_code tag_invoke(deserialize_tag, fallback::ondemand::document &doc, T &out) noexcept { + fallback::ondemand::object obj; SIMDJSON_TRY(doc.get_object().get(obj)); return simdjson::deserialize(obj, out); } template <concepts::string_view_keyed_map T> -error_code tag_invoke(deserialize_tag, arm64::ondemand::document_reference &doc, T &out) noexcept { - arm64::ondemand::object obj; +error_code tag_invoke(deserialize_tag, fallback::ondemand::document_reference &doc, T &out) noexcept { + fallback::ondemand::object obj; SIMDJSON_TRY(doc.get_object().get(obj)); return simdjson::deserialize(obj, out); } @@ -40284,8 +81079,8 @@ constexpr bool user_defined_type = (std::is_class_v<T> template <typename T, typename ValT> requires(user_defined_type<T> && std::is_class_v<T>) error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept { - arm64::ondemand::object obj; - if constexpr (std::is_same_v<std::remove_cvref_t<ValT>, arm64::ondemand::object>) { + fallback::ondemand::object obj; + if constexpr (std::is_same_v<std::remove_cvref_t<ValT>, fallback::ondemand::object>) { obj = val; } else { SIMDJSON_TRY(val.get_object().get(obj)); @@ -40594,11 +81389,11 @@ error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr<int> &out) noe #endif // SIMDJSON_ONDEMAND_DESERIALIZE_H #endif // SIMDJSON_SUPPORTS_CONCEPTS -/* end file simdjson/generic/ondemand/std_deserialize.h for arm64 */ +/* end file simdjson/generic/ondemand/std_deserialize.h for fallback */ // Inline definitions -/* including simdjson/generic/ondemand/array-inl.h for arm64: #include "simdjson/generic/ondemand/array-inl.h" */ -/* begin file simdjson/generic/ondemand/array-inl.h for arm64 */ +/* including simdjson/generic/ondemand/array-inl.h for fallback: #include "simdjson/generic/ondemand/array-inl.h" */ +/* begin file simdjson/generic/ondemand/array-inl.h for fallback */ #ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -40613,7 +81408,7 @@ error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr<int> &out) noe /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace arm64 { +namespace fallback { namespace ondemand { // @@ -40842,68 +81637,68 @@ simdjson_inline simdjson_result<value> array::at(size_t index) noexcept { } } // namespace ondemand -} // namespace arm64 +} // namespace fallback } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<arm64::ondemand::array>::simdjson_result( - arm64::ondemand::array &&value +simdjson_inline simdjson_result<fallback::ondemand::array>::simdjson_result( + fallback::ondemand::array &&value ) noexcept - : implementation_simdjson_result_base<arm64::ondemand::array>( - std::forward<arm64::ondemand::array>(value) + : implementation_simdjson_result_base<fallback::ondemand::array>( + std::forward<fallback::ondemand::array>(value) ) { } -simdjson_inline simdjson_result<arm64::ondemand::array>::simdjson_result( +simdjson_inline simdjson_result<fallback::ondemand::array>::simdjson_result( error_code error ) noexcept - : implementation_simdjson_result_base<arm64::ondemand::array>(error) + : implementation_simdjson_result_base<fallback::ondemand::array>(error) { } -simdjson_inline simdjson_result<arm64::ondemand::array_iterator> simdjson_result<arm64::ondemand::array>::begin() noexcept { +simdjson_inline simdjson_result<fallback::ondemand::array_iterator> simdjson_result<fallback::ondemand::array>::begin() noexcept { if (error()) { return error(); } return first.begin(); } -simdjson_inline simdjson_result<arm64::ondemand::array_iterator> simdjson_result<arm64::ondemand::array>::end() noexcept { +simdjson_inline simdjson_result<fallback::ondemand::array_iterator> simdjson_result<fallback::ondemand::array>::end() noexcept { if (error()) { return error(); } return first.end(); } -simdjson_inline simdjson_result<size_t> simdjson_result<arm64::ondemand::array>::count_elements() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<fallback::ondemand::array>::count_elements() & noexcept { if (error()) { return error(); } return first.count_elements(); } -simdjson_inline simdjson_result<bool> simdjson_result<arm64::ondemand::array>::is_empty() & noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<fallback::ondemand::array>::is_empty() & noexcept { if (error()) { return error(); } return first.is_empty(); } -simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::array>::at(size_t index) noexcept { +simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::array>::at(size_t index) noexcept { if (error()) { return error(); } return first.at(index); } -simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::array>::at_pointer(std::string_view json_pointer) noexcept { +simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::array>::at_pointer(std::string_view json_pointer) noexcept { if (error()) { return error(); } return first.at_pointer(json_pointer); } -simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::array>::at_path(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::array>::at_path(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path(json_path); } -simdjson_inline simdjson_result<std::vector<arm64::ondemand::value>> simdjson_result<arm64::ondemand::array>::at_path_with_wildcard(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<std::vector<fallback::ondemand::value>> simdjson_result<fallback::ondemand::array>::at_path_with_wildcard(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path_with_wildcard(json_path); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<arm64::ondemand::array>::raw_json() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<fallback::ondemand::array>::raw_json() noexcept { if (error()) { return error(); } return first.raw_json(); } } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_INL_H -/* end file simdjson/generic/ondemand/array-inl.h for arm64 */ -/* including simdjson/generic/ondemand/array_iterator-inl.h for arm64: #include "simdjson/generic/ondemand/array_iterator-inl.h" */ -/* begin file simdjson/generic/ondemand/array_iterator-inl.h for arm64 */ +/* end file simdjson/generic/ondemand/array-inl.h for fallback */ +/* including simdjson/generic/ondemand/array_iterator-inl.h for fallback: #include "simdjson/generic/ondemand/array_iterator-inl.h" */ +/* begin file simdjson/generic/ondemand/array_iterator-inl.h for fallback */ #ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -40915,7 +81710,7 @@ simdjson_inline simdjson_result<std::string_view> simdjson_result<arm64::ondema /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace arm64 { +namespace fallback { namespace ondemand { simdjson_inline array_iterator::array_iterator(const value_iterator &_iter) noexcept @@ -40923,6 +81718,10 @@ simdjson_inline array_iterator::array_iterator(const value_iterator &_iter) noex {} simdjson_inline simdjson_result<value> array_iterator::operator*() noexcept { +#if SIMDJSON_DEVELOPMENT_CHECKS + SIMDJSON_ASSUME(!has_been_referenced); + has_been_referenced = true; +#endif if (iter.error()) { iter.abandon(); return iter.error(); } return value(iter.child()); } @@ -40933,6 +81732,9 @@ simdjson_inline bool array_iterator::operator!=(const array_iterator &) const no return iter.is_open(); } simdjson_inline array_iterator &array_iterator::operator++() noexcept { +#if SIMDJSON_DEVELOPMENT_CHECKS + has_been_referenced = false; +#endif error_code error; // PERF NOTE this is a safety rail ... users should exit loops as soon as they receive an error, so we'll never get here. // However, it does not seem to make a perf difference, so we add it out of an abundance of caution. @@ -40946,50 +81748,50 @@ simdjson_inline bool array_iterator::at_end() const noexcept { return iter.at_end(); } } // namespace ondemand -} // namespace arm64 +} // namespace fallback } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<arm64::ondemand::array_iterator>::simdjson_result( - arm64::ondemand::array_iterator &&value +simdjson_inline simdjson_result<fallback::ondemand::array_iterator>::simdjson_result( + fallback::ondemand::array_iterator &&value ) noexcept - : arm64::implementation_simdjson_result_base<arm64::ondemand::array_iterator>(std::forward<arm64::ondemand::array_iterator>(value)) + : fallback::implementation_simdjson_result_base<fallback::ondemand::array_iterator>(std::forward<fallback::ondemand::array_iterator>(value)) { first.iter.assert_is_valid(); } -simdjson_inline simdjson_result<arm64::ondemand::array_iterator>::simdjson_result(error_code error) noexcept - : arm64::implementation_simdjson_result_base<arm64::ondemand::array_iterator>({}, error) +simdjson_inline simdjson_result<fallback::ondemand::array_iterator>::simdjson_result(error_code error) noexcept + : fallback::implementation_simdjson_result_base<fallback::ondemand::array_iterator>({}, error) { } -simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::array_iterator>::operator*() noexcept { +simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::array_iterator>::operator*() noexcept { if (error()) { return error(); } return *first; } -simdjson_inline bool simdjson_result<arm64::ondemand::array_iterator>::operator==(const simdjson_result<arm64::ondemand::array_iterator> &other) const noexcept { +simdjson_inline bool simdjson_result<fallback::ondemand::array_iterator>::operator==(const simdjson_result<fallback::ondemand::array_iterator> &other) const noexcept { if (!first.iter.is_valid()) { return !error(); } return first == other.first; } -simdjson_inline bool simdjson_result<arm64::ondemand::array_iterator>::operator!=(const simdjson_result<arm64::ondemand::array_iterator> &other) const noexcept { +simdjson_inline bool simdjson_result<fallback::ondemand::array_iterator>::operator!=(const simdjson_result<fallback::ondemand::array_iterator> &other) const noexcept { if (!first.iter.is_valid()) { return error(); } return first != other.first; } -simdjson_inline simdjson_result<arm64::ondemand::array_iterator> &simdjson_result<arm64::ondemand::array_iterator>::operator++() noexcept { +simdjson_inline simdjson_result<fallback::ondemand::array_iterator> &simdjson_result<fallback::ondemand::array_iterator>::operator++() noexcept { // Clear the error if there is one, so we don't yield it twice if (error()) { second = SUCCESS; return *this; } ++(first); return *this; } -simdjson_inline bool simdjson_result<arm64::ondemand::array_iterator>::at_end() const noexcept { +simdjson_inline bool simdjson_result<fallback::ondemand::array_iterator>::at_end() const noexcept { return !first.iter.is_valid() || first.at_end(); } } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_INL_H -/* end file simdjson/generic/ondemand/array_iterator-inl.h for arm64 */ -/* including simdjson/generic/ondemand/value-inl.h for arm64: #include "simdjson/generic/ondemand/value-inl.h" */ -/* begin file simdjson/generic/ondemand/value-inl.h for arm64 */ +/* end file simdjson/generic/ondemand/array_iterator-inl.h for fallback */ +/* including simdjson/generic/ondemand/value-inl.h for fallback: #include "simdjson/generic/ondemand/value-inl.h" */ +/* begin file simdjson/generic/ondemand/value-inl.h for fallback */ #ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -41005,7 +81807,7 @@ simdjson_inline bool simdjson_result<arm64::ondemand::array_iterator>::at_end() /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace arm64 { +namespace fallback { namespace ondemand { simdjson_inline value::value(const value_iterator &_iter) noexcept @@ -41302,240 +82104,240 @@ inline simdjson_result<std::vector<value>> value::at_path_with_wildcard(std::str } } // namespace ondemand -} // namespace arm64 +} // namespace fallback } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<arm64::ondemand::value>::simdjson_result( - arm64::ondemand::value &&value +simdjson_inline simdjson_result<fallback::ondemand::value>::simdjson_result( + fallback::ondemand::value &&value ) noexcept : - implementation_simdjson_result_base<arm64::ondemand::value>( - std::forward<arm64::ondemand::value>(value) + implementation_simdjson_result_base<fallback::ondemand::value>( + std::forward<fallback::ondemand::value>(value) ) { } -simdjson_inline simdjson_result<arm64::ondemand::value>::simdjson_result( +simdjson_inline simdjson_result<fallback::ondemand::value>::simdjson_result( error_code error ) noexcept : - implementation_simdjson_result_base<arm64::ondemand::value>(error) + implementation_simdjson_result_base<fallback::ondemand::value>(error) { } -simdjson_inline simdjson_result<size_t> simdjson_result<arm64::ondemand::value>::count_elements() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<fallback::ondemand::value>::count_elements() & noexcept { if (error()) { return error(); } return first.count_elements(); } -simdjson_inline simdjson_result<size_t> simdjson_result<arm64::ondemand::value>::count_fields() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<fallback::ondemand::value>::count_fields() & noexcept { if (error()) { return error(); } return first.count_fields(); } -simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::value>::at(size_t index) noexcept { +simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::value>::at(size_t index) noexcept { if (error()) { return error(); } return first.at(index); } -simdjson_inline simdjson_result<arm64::ondemand::array_iterator> simdjson_result<arm64::ondemand::value>::begin() & noexcept { +simdjson_inline simdjson_result<fallback::ondemand::array_iterator> simdjson_result<fallback::ondemand::value>::begin() & noexcept { if (error()) { return error(); } return first.begin(); } -simdjson_inline simdjson_result<arm64::ondemand::array_iterator> simdjson_result<arm64::ondemand::value>::end() & noexcept { +simdjson_inline simdjson_result<fallback::ondemand::array_iterator> simdjson_result<fallback::ondemand::value>::end() & noexcept { if (error()) { return error(); } return {}; } -simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::value>::find_field(std::string_view key) noexcept { +simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::value>::find_field(std::string_view key) noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::value>::find_field(const char *key) noexcept { +simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::value>::find_field(const char *key) noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::value>::find_field_unordered(std::string_view key) noexcept { +simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::value>::find_field_unordered(std::string_view key) noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::value>::find_field_unordered(const char *key) noexcept { +simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::value>::find_field_unordered(const char *key) noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::value>::operator[](std::string_view key) noexcept { +simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::value>::operator[](std::string_view key) noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::value>::operator[](const char *key) noexcept { +simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::value>::operator[](const char *key) noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<arm64::ondemand::array> simdjson_result<arm64::ondemand::value>::get_array() noexcept { +simdjson_inline simdjson_result<fallback::ondemand::array> simdjson_result<fallback::ondemand::value>::get_array() noexcept { if (error()) { return error(); } return first.get_array(); } -simdjson_inline simdjson_result<arm64::ondemand::object> simdjson_result<arm64::ondemand::value>::get_object() noexcept { +simdjson_inline simdjson_result<fallback::ondemand::object> simdjson_result<fallback::ondemand::value>::get_object() noexcept { if (error()) { return error(); } return first.get_object(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<arm64::ondemand::value>::get_uint64() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<fallback::ondemand::value>::get_uint64() noexcept { if (error()) { return error(); } return first.get_uint64(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<arm64::ondemand::value>::get_uint64_in_string() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<fallback::ondemand::value>::get_uint64_in_string() noexcept { if (error()) { return error(); } return first.get_uint64_in_string(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<arm64::ondemand::value>::get_int64() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<fallback::ondemand::value>::get_int64() noexcept { if (error()) { return error(); } return first.get_int64(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<arm64::ondemand::value>::get_int64_in_string() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<fallback::ondemand::value>::get_int64_in_string() noexcept { if (error()) { return error(); } return first.get_int64_in_string(); } -simdjson_inline simdjson_result<double> simdjson_result<arm64::ondemand::value>::get_double() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<fallback::ondemand::value>::get_double() noexcept { if (error()) { return error(); } return first.get_double(); } -simdjson_inline simdjson_result<double> simdjson_result<arm64::ondemand::value>::get_double_in_string() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<fallback::ondemand::value>::get_double_in_string() noexcept { if (error()) { return error(); } return first.get_double_in_string(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<arm64::ondemand::value>::get_string(bool allow_replacement) noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<fallback::ondemand::value>::get_string(bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(allow_replacement); } template <typename string_type> -simdjson_inline error_code simdjson_result<arm64::ondemand::value>::get_string(string_type& receiver, bool allow_replacement) noexcept { +simdjson_inline error_code simdjson_result<fallback::ondemand::value>::get_string(string_type& receiver, bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(receiver, allow_replacement); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<arm64::ondemand::value>::get_wobbly_string() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<fallback::ondemand::value>::get_wobbly_string() noexcept { if (error()) { return error(); } return first.get_wobbly_string(); } -simdjson_inline simdjson_result<arm64::ondemand::raw_json_string> simdjson_result<arm64::ondemand::value>::get_raw_json_string() noexcept { +simdjson_inline simdjson_result<fallback::ondemand::raw_json_string> simdjson_result<fallback::ondemand::value>::get_raw_json_string() noexcept { if (error()) { return error(); } return first.get_raw_json_string(); } -simdjson_inline simdjson_result<bool> simdjson_result<arm64::ondemand::value>::get_bool() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<fallback::ondemand::value>::get_bool() noexcept { if (error()) { return error(); } return first.get_bool(); } -simdjson_inline simdjson_result<bool> simdjson_result<arm64::ondemand::value>::is_null() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<fallback::ondemand::value>::is_null() noexcept { if (error()) { return error(); } return first.is_null(); } -template<> simdjson_inline error_code simdjson_result<arm64::ondemand::value>::get<arm64::ondemand::value>(arm64::ondemand::value &out) noexcept { +template<> simdjson_inline error_code simdjson_result<fallback::ondemand::value>::get<fallback::ondemand::value>(fallback::ondemand::value &out) noexcept { if (error()) { return error(); } out = first; return SUCCESS; } -template<typename T> simdjson_inline simdjson_result<T> simdjson_result<arm64::ondemand::value>::get() noexcept { +template<typename T> simdjson_inline simdjson_result<T> simdjson_result<fallback::ondemand::value>::get() noexcept { if (error()) { return error(); } return first.get<T>(); } -template<typename T> simdjson_inline error_code simdjson_result<arm64::ondemand::value>::get(T &out) noexcept { +template<typename T> simdjson_inline error_code simdjson_result<fallback::ondemand::value>::get(T &out) noexcept { if (error()) { return error(); } return first.get<T>(out); } -template<> simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::value>::get<arm64::ondemand::value>() noexcept { +template<> simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::value>::get<fallback::ondemand::value>() noexcept { if (error()) { return error(); } return std::move(first); } -simdjson_inline simdjson_result<arm64::ondemand::json_type> simdjson_result<arm64::ondemand::value>::type() noexcept { +simdjson_inline simdjson_result<fallback::ondemand::json_type> simdjson_result<fallback::ondemand::value>::type() noexcept { if (error()) { return error(); } return first.type(); } -simdjson_inline simdjson_result<bool> simdjson_result<arm64::ondemand::value>::is_scalar() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<fallback::ondemand::value>::is_scalar() noexcept { if (error()) { return error(); } return first.is_scalar(); } -simdjson_inline simdjson_result<bool> simdjson_result<arm64::ondemand::value>::is_string() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<fallback::ondemand::value>::is_string() noexcept { if (error()) { return error(); } return first.is_string(); } -simdjson_inline simdjson_result<bool> simdjson_result<arm64::ondemand::value>::is_negative() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<fallback::ondemand::value>::is_negative() noexcept { if (error()) { return error(); } return first.is_negative(); } -simdjson_inline simdjson_result<bool> simdjson_result<arm64::ondemand::value>::is_integer() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<fallback::ondemand::value>::is_integer() noexcept { if (error()) { return error(); } return first.is_integer(); } -simdjson_inline simdjson_result<arm64::number_type> simdjson_result<arm64::ondemand::value>::get_number_type() noexcept { +simdjson_inline simdjson_result<fallback::number_type> simdjson_result<fallback::ondemand::value>::get_number_type() noexcept { if (error()) { return error(); } return first.get_number_type(); } -simdjson_inline simdjson_result<arm64::ondemand::number> simdjson_result<arm64::ondemand::value>::get_number() noexcept { +simdjson_inline simdjson_result<fallback::ondemand::number> simdjson_result<fallback::ondemand::value>::get_number() noexcept { if (error()) { return error(); } return first.get_number(); } #if SIMDJSON_EXCEPTIONS template <class T> -simdjson_inline simdjson_result<arm64::ondemand::value>::operator T() noexcept(false) { +simdjson_inline simdjson_result<fallback::ondemand::value>::operator T() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first.get<T>(); } -simdjson_inline simdjson_result<arm64::ondemand::value>::operator arm64::ondemand::array() noexcept(false) { +simdjson_inline simdjson_result<fallback::ondemand::value>::operator fallback::ondemand::array() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<arm64::ondemand::value>::operator arm64::ondemand::object() noexcept(false) { +simdjson_inline simdjson_result<fallback::ondemand::value>::operator fallback::ondemand::object() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<arm64::ondemand::value>::operator uint64_t() noexcept(false) { +simdjson_inline simdjson_result<fallback::ondemand::value>::operator uint64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<arm64::ondemand::value>::operator int64_t() noexcept(false) { +simdjson_inline simdjson_result<fallback::ondemand::value>::operator int64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<arm64::ondemand::value>::operator double() noexcept(false) { +simdjson_inline simdjson_result<fallback::ondemand::value>::operator double() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<arm64::ondemand::value>::operator std::string_view() noexcept(false) { +simdjson_inline simdjson_result<fallback::ondemand::value>::operator std::string_view() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<arm64::ondemand::value>::operator arm64::ondemand::raw_json_string() noexcept(false) { +simdjson_inline simdjson_result<fallback::ondemand::value>::operator fallback::ondemand::raw_json_string() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<arm64::ondemand::value>::operator bool() noexcept(false) { +simdjson_inline simdjson_result<fallback::ondemand::value>::operator bool() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } #endif -simdjson_inline simdjson_result<std::string_view> simdjson_result<arm64::ondemand::value>::raw_json_token() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<fallback::ondemand::value>::raw_json_token() noexcept { if (error()) { return error(); } return first.raw_json_token(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<arm64::ondemand::value>::raw_json() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<fallback::ondemand::value>::raw_json() noexcept { if (error()) { return error(); } return first.raw_json(); } -simdjson_inline simdjson_result<const char *> simdjson_result<arm64::ondemand::value>::current_location() noexcept { +simdjson_inline simdjson_result<const char *> simdjson_result<fallback::ondemand::value>::current_location() noexcept { if (error()) { return error(); } return first.current_location(); } -simdjson_inline simdjson_result<int32_t> simdjson_result<arm64::ondemand::value>::current_depth() const noexcept { +simdjson_inline simdjson_result<int32_t> simdjson_result<fallback::ondemand::value>::current_depth() const noexcept { if (error()) { return error(); } return first.current_depth(); } -simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::value>::at_pointer( +simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::value>::at_pointer( std::string_view json_pointer) noexcept { if (error()) { return error(); @@ -41543,7 +82345,7 @@ simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::o return first.at_pointer(json_pointer); } -simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::value>::at_path( +simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::value>::at_path( std::string_view json_path) noexcept { if (error()) { return error(); @@ -41551,7 +82353,7 @@ simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::o return first.at_path(json_path); } -inline simdjson_result<std::vector<arm64::ondemand::value>> simdjson_result<arm64::ondemand::value>::at_path_with_wildcard( +inline simdjson_result<std::vector<fallback::ondemand::value>> simdjson_result<fallback::ondemand::value>::at_path_with_wildcard( std::string_view json_path) noexcept { if (error()) { return error(); @@ -41562,9 +82364,9 @@ inline simdjson_result<std::vector<arm64::ondemand::value>> simdjson_result<arm6 } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_INL_H -/* end file simdjson/generic/ondemand/value-inl.h for arm64 */ -/* including simdjson/generic/ondemand/document-inl.h for arm64: #include "simdjson/generic/ondemand/document-inl.h" */ -/* begin file simdjson/generic/ondemand/document-inl.h for arm64 */ +/* end file simdjson/generic/ondemand/value-inl.h for fallback */ +/* including simdjson/generic/ondemand/document-inl.h for fallback: #include "simdjson/generic/ondemand/document-inl.h" */ +/* begin file simdjson/generic/ondemand/document-inl.h for fallback */ #ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -41584,7 +82386,7 @@ inline simdjson_result<std::vector<arm64::ondemand::value>> simdjson_result<arm6 /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace arm64 { +namespace fallback { namespace ondemand { simdjson_inline document::document(ondemand::json_iterator &&_iter) noexcept @@ -41978,283 +82780,283 @@ simdjson_warn_unused simdjson_inline error_code document::extract_into(T& out) & #endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION } // namespace ondemand -} // namespace arm64 +} // namespace fallback } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<arm64::ondemand::document>::simdjson_result( - arm64::ondemand::document &&value +simdjson_inline simdjson_result<fallback::ondemand::document>::simdjson_result( + fallback::ondemand::document &&value ) noexcept : - implementation_simdjson_result_base<arm64::ondemand::document>( - std::forward<arm64::ondemand::document>(value) + implementation_simdjson_result_base<fallback::ondemand::document>( + std::forward<fallback::ondemand::document>(value) ) { } -simdjson_inline simdjson_result<arm64::ondemand::document>::simdjson_result( +simdjson_inline simdjson_result<fallback::ondemand::document>::simdjson_result( error_code error ) noexcept : - implementation_simdjson_result_base<arm64::ondemand::document>( + implementation_simdjson_result_base<fallback::ondemand::document>( error ) { } -simdjson_inline simdjson_result<size_t> simdjson_result<arm64::ondemand::document>::count_elements() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<fallback::ondemand::document>::count_elements() & noexcept { if (error()) { return error(); } return first.count_elements(); } -simdjson_inline simdjson_result<size_t> simdjson_result<arm64::ondemand::document>::count_fields() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<fallback::ondemand::document>::count_fields() & noexcept { if (error()) { return error(); } return first.count_fields(); } -simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::document>::at(size_t index) & noexcept { +simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::document>::at(size_t index) & noexcept { if (error()) { return error(); } return first.at(index); } -simdjson_inline error_code simdjson_result<arm64::ondemand::document>::rewind() noexcept { +simdjson_inline error_code simdjson_result<fallback::ondemand::document>::rewind() noexcept { if (error()) { return error(); } first.rewind(); return SUCCESS; } -simdjson_inline simdjson_result<arm64::ondemand::array_iterator> simdjson_result<arm64::ondemand::document>::begin() & noexcept { +simdjson_inline simdjson_result<fallback::ondemand::array_iterator> simdjson_result<fallback::ondemand::document>::begin() & noexcept { if (error()) { return error(); } return first.begin(); } -simdjson_inline simdjson_result<arm64::ondemand::array_iterator> simdjson_result<arm64::ondemand::document>::end() & noexcept { +simdjson_inline simdjson_result<fallback::ondemand::array_iterator> simdjson_result<fallback::ondemand::document>::end() & noexcept { return {}; } -simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::document>::find_field_unordered(std::string_view key) & noexcept { +simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::document>::find_field_unordered(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::document>::find_field_unordered(const char *key) & noexcept { +simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::document>::find_field_unordered(const char *key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::document>::operator[](std::string_view key) & noexcept { +simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::document>::operator[](std::string_view key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::document>::operator[](const char *key) & noexcept { +simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::document>::operator[](const char *key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::document>::find_field(std::string_view key) & noexcept { +simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::document>::find_field(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::document>::find_field(const char *key) & noexcept { +simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::document>::find_field(const char *key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<arm64::ondemand::array> simdjson_result<arm64::ondemand::document>::get_array() & noexcept { +simdjson_inline simdjson_result<fallback::ondemand::array> simdjson_result<fallback::ondemand::document>::get_array() & noexcept { if (error()) { return error(); } return first.get_array(); } -simdjson_inline simdjson_result<arm64::ondemand::object> simdjson_result<arm64::ondemand::document>::get_object() & noexcept { +simdjson_inline simdjson_result<fallback::ondemand::object> simdjson_result<fallback::ondemand::document>::get_object() & noexcept { if (error()) { return error(); } return first.get_object(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<arm64::ondemand::document>::get_uint64() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<fallback::ondemand::document>::get_uint64() noexcept { if (error()) { return error(); } return first.get_uint64(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<arm64::ondemand::document>::get_uint64_in_string() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<fallback::ondemand::document>::get_uint64_in_string() noexcept { if (error()) { return error(); } return first.get_uint64_in_string(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<arm64::ondemand::document>::get_int64() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<fallback::ondemand::document>::get_int64() noexcept { if (error()) { return error(); } return first.get_int64(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<arm64::ondemand::document>::get_int64_in_string() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<fallback::ondemand::document>::get_int64_in_string() noexcept { if (error()) { return error(); } return first.get_int64_in_string(); } -simdjson_inline simdjson_result<double> simdjson_result<arm64::ondemand::document>::get_double() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<fallback::ondemand::document>::get_double() noexcept { if (error()) { return error(); } return first.get_double(); } -simdjson_inline simdjson_result<double> simdjson_result<arm64::ondemand::document>::get_double_in_string() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<fallback::ondemand::document>::get_double_in_string() noexcept { if (error()) { return error(); } return first.get_double_in_string(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<arm64::ondemand::document>::get_string(bool allow_replacement) noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<fallback::ondemand::document>::get_string(bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(allow_replacement); } template <typename string_type> -simdjson_warn_unused simdjson_inline error_code simdjson_result<arm64::ondemand::document>::get_string(string_type& receiver, bool allow_replacement) noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<fallback::ondemand::document>::get_string(string_type& receiver, bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(receiver, allow_replacement); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<arm64::ondemand::document>::get_wobbly_string() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<fallback::ondemand::document>::get_wobbly_string() noexcept { if (error()) { return error(); } return first.get_wobbly_string(); } -simdjson_inline simdjson_result<arm64::ondemand::raw_json_string> simdjson_result<arm64::ondemand::document>::get_raw_json_string() noexcept { +simdjson_inline simdjson_result<fallback::ondemand::raw_json_string> simdjson_result<fallback::ondemand::document>::get_raw_json_string() noexcept { if (error()) { return error(); } return first.get_raw_json_string(); } -simdjson_inline simdjson_result<bool> simdjson_result<arm64::ondemand::document>::get_bool() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<fallback::ondemand::document>::get_bool() noexcept { if (error()) { return error(); } return first.get_bool(); } -simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::document>::get_value() noexcept { +simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::document>::get_value() noexcept { if (error()) { return error(); } return first.get_value(); } -simdjson_inline simdjson_result<bool> simdjson_result<arm64::ondemand::document>::is_null() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<fallback::ondemand::document>::is_null() noexcept { if (error()) { return error(); } return first.is_null(); } template<typename T> -simdjson_inline simdjson_result<T> simdjson_result<arm64::ondemand::document>::get() & noexcept { +simdjson_inline simdjson_result<T> simdjson_result<fallback::ondemand::document>::get() & noexcept { if (error()) { return error(); } return first.get<T>(); } template<typename T> -simdjson_deprecated simdjson_inline simdjson_result<T> simdjson_result<arm64::ondemand::document>::get() && noexcept { +simdjson_deprecated simdjson_inline simdjson_result<T> simdjson_result<fallback::ondemand::document>::get() && noexcept { if (error()) { return error(); } - return std::forward<arm64::ondemand::document>(first).get<T>(); + return std::forward<fallback::ondemand::document>(first).get<T>(); } template<typename T> -simdjson_warn_unused simdjson_inline error_code simdjson_result<arm64::ondemand::document>::get(T &out) & noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<fallback::ondemand::document>::get(T &out) & noexcept { if (error()) { return error(); } return first.get<T>(out); } template<typename T> -simdjson_warn_unused simdjson_inline error_code simdjson_result<arm64::ondemand::document>::get(T &out) && noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<fallback::ondemand::document>::get(T &out) && noexcept { if (error()) { return error(); } - return std::forward<arm64::ondemand::document>(first).get<T>(out); + return std::forward<fallback::ondemand::document>(first).get<T>(out); } -template<> simdjson_inline simdjson_result<arm64::ondemand::document> simdjson_result<arm64::ondemand::document>::get<arm64::ondemand::document>() & noexcept = delete; -template<> simdjson_deprecated simdjson_inline simdjson_result<arm64::ondemand::document> simdjson_result<arm64::ondemand::document>::get<arm64::ondemand::document>() && noexcept { +template<> simdjson_inline simdjson_result<fallback::ondemand::document> simdjson_result<fallback::ondemand::document>::get<fallback::ondemand::document>() & noexcept = delete; +template<> simdjson_deprecated simdjson_inline simdjson_result<fallback::ondemand::document> simdjson_result<fallback::ondemand::document>::get<fallback::ondemand::document>() && noexcept { if (error()) { return error(); } - return std::forward<arm64::ondemand::document>(first); + return std::forward<fallback::ondemand::document>(first); } -template<> simdjson_warn_unused simdjson_inline error_code simdjson_result<arm64::ondemand::document>::get<arm64::ondemand::document>(arm64::ondemand::document &out) & noexcept = delete; -template<> simdjson_warn_unused simdjson_inline error_code simdjson_result<arm64::ondemand::document>::get<arm64::ondemand::document>(arm64::ondemand::document &out) && noexcept { +template<> simdjson_warn_unused simdjson_inline error_code simdjson_result<fallback::ondemand::document>::get<fallback::ondemand::document>(fallback::ondemand::document &out) & noexcept = delete; +template<> simdjson_warn_unused simdjson_inline error_code simdjson_result<fallback::ondemand::document>::get<fallback::ondemand::document>(fallback::ondemand::document &out) && noexcept { if (error()) { return error(); } - out = std::forward<arm64::ondemand::document>(first); + out = std::forward<fallback::ondemand::document>(first); return SUCCESS; } -simdjson_inline simdjson_result<arm64::ondemand::json_type> simdjson_result<arm64::ondemand::document>::type() noexcept { +simdjson_inline simdjson_result<fallback::ondemand::json_type> simdjson_result<fallback::ondemand::document>::type() noexcept { if (error()) { return error(); } return first.type(); } -simdjson_inline simdjson_result<bool> simdjson_result<arm64::ondemand::document>::is_scalar() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<fallback::ondemand::document>::is_scalar() noexcept { if (error()) { return error(); } return first.is_scalar(); } -simdjson_inline simdjson_result<bool> simdjson_result<arm64::ondemand::document>::is_string() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<fallback::ondemand::document>::is_string() noexcept { if (error()) { return error(); } return first.is_string(); } -simdjson_inline bool simdjson_result<arm64::ondemand::document>::is_negative() noexcept { +simdjson_inline bool simdjson_result<fallback::ondemand::document>::is_negative() noexcept { if (error()) { return error(); } return first.is_negative(); } -simdjson_inline simdjson_result<bool> simdjson_result<arm64::ondemand::document>::is_integer() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<fallback::ondemand::document>::is_integer() noexcept { if (error()) { return error(); } return first.is_integer(); } -simdjson_inline simdjson_result<arm64::number_type> simdjson_result<arm64::ondemand::document>::get_number_type() noexcept { +simdjson_inline simdjson_result<fallback::number_type> simdjson_result<fallback::ondemand::document>::get_number_type() noexcept { if (error()) { return error(); } return first.get_number_type(); } -simdjson_inline simdjson_result<arm64::ondemand::number> simdjson_result<arm64::ondemand::document>::get_number() noexcept { +simdjson_inline simdjson_result<fallback::ondemand::number> simdjson_result<fallback::ondemand::document>::get_number() noexcept { if (error()) { return error(); } return first.get_number(); } #if SIMDJSON_EXCEPTIONS -template <class T, typename std::enable_if<std::is_same<T, arm64::ondemand::document>::value == false>::type> -simdjson_inline simdjson_result<arm64::ondemand::document>::operator T() noexcept(false) { +template <class T, typename std::enable_if<std::is_same<T, fallback::ondemand::document>::value == false>::type> +simdjson_inline simdjson_result<fallback::ondemand::document>::operator T() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<arm64::ondemand::document>::operator arm64::ondemand::array() & noexcept(false) { +simdjson_inline simdjson_result<fallback::ondemand::document>::operator fallback::ondemand::array() & noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<arm64::ondemand::document>::operator arm64::ondemand::object() & noexcept(false) { +simdjson_inline simdjson_result<fallback::ondemand::document>::operator fallback::ondemand::object() & noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<arm64::ondemand::document>::operator uint64_t() noexcept(false) { +simdjson_inline simdjson_result<fallback::ondemand::document>::operator uint64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<arm64::ondemand::document>::operator int64_t() noexcept(false) { +simdjson_inline simdjson_result<fallback::ondemand::document>::operator int64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<arm64::ondemand::document>::operator double() noexcept(false) { +simdjson_inline simdjson_result<fallback::ondemand::document>::operator double() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<arm64::ondemand::document>::operator std::string_view() noexcept(false) { +simdjson_inline simdjson_result<fallback::ondemand::document>::operator std::string_view() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<arm64::ondemand::document>::operator arm64::ondemand::raw_json_string() noexcept(false) { +simdjson_inline simdjson_result<fallback::ondemand::document>::operator fallback::ondemand::raw_json_string() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<arm64::ondemand::document>::operator bool() noexcept(false) { +simdjson_inline simdjson_result<fallback::ondemand::document>::operator bool() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<arm64::ondemand::document>::operator arm64::ondemand::value() noexcept(false) { +simdjson_inline simdjson_result<fallback::ondemand::document>::operator fallback::ondemand::value() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } #endif -simdjson_inline simdjson_result<const char *> simdjson_result<arm64::ondemand::document>::current_location() noexcept { +simdjson_inline simdjson_result<const char *> simdjson_result<fallback::ondemand::document>::current_location() noexcept { if (error()) { return error(); } return first.current_location(); } -simdjson_inline bool simdjson_result<arm64::ondemand::document>::at_end() const noexcept { +simdjson_inline bool simdjson_result<fallback::ondemand::document>::at_end() const noexcept { if (error()) { return error(); } return first.at_end(); } -simdjson_inline int32_t simdjson_result<arm64::ondemand::document>::current_depth() const noexcept { +simdjson_inline int32_t simdjson_result<fallback::ondemand::document>::current_depth() const noexcept { if (error()) { return error(); } return first.current_depth(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<arm64::ondemand::document>::raw_json_token() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<fallback::ondemand::document>::raw_json_token() noexcept { if (error()) { return error(); } return first.raw_json_token(); } -simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::document>::at_pointer(std::string_view json_pointer) noexcept { +simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::document>::at_pointer(std::string_view json_pointer) noexcept { if (error()) { return error(); } return first.at_pointer(json_pointer); } -simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::document>::at_path(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::document>::at_path(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path(json_path); } -simdjson_inline simdjson_result<std::vector<arm64::ondemand::value>> simdjson_result<arm64::ondemand::document>::at_path_with_wildcard(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<std::vector<fallback::ondemand::value>> simdjson_result<fallback::ondemand::document>::at_path_with_wildcard(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path_with_wildcard(json_path); } @@ -42262,7 +83064,7 @@ simdjson_inline simdjson_result<std::vector<arm64::ondemand::value>> simdjson_re #if SIMDJSON_STATIC_REFLECTION template<constevalutil::fixed_string... FieldNames, typename T> requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) -simdjson_warn_unused simdjson_inline error_code simdjson_result<arm64::ondemand::document>::extract_into(T& out) & noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<fallback::ondemand::document>::extract_into(T& out) & noexcept { if (error()) { return error(); } return first.extract_into<FieldNames...>(out); } @@ -42272,7 +83074,7 @@ simdjson_warn_unused simdjson_inline error_code simdjson_result<arm64::ondemand: namespace simdjson { -namespace arm64 { +namespace fallback { namespace ondemand { simdjson_inline document_reference::document_reference() noexcept : doc{nullptr} {} @@ -42364,253 +83166,253 @@ simdjson_warn_unused simdjson_inline error_code document_reference::extract_into } #endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION } // namespace ondemand -} // namespace arm64 +} // namespace fallback } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<arm64::ondemand::document_reference>::simdjson_result(arm64::ondemand::document_reference value, error_code error) - noexcept : implementation_simdjson_result_base<arm64::ondemand::document_reference>(std::forward<arm64::ondemand::document_reference>(value), error) {} +simdjson_inline simdjson_result<fallback::ondemand::document_reference>::simdjson_result(fallback::ondemand::document_reference value, error_code error) + noexcept : implementation_simdjson_result_base<fallback::ondemand::document_reference>(std::forward<fallback::ondemand::document_reference>(value), error) {} -simdjson_inline simdjson_result<size_t> simdjson_result<arm64::ondemand::document_reference>::count_elements() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<fallback::ondemand::document_reference>::count_elements() & noexcept { if (error()) { return error(); } return first.count_elements(); } -simdjson_inline simdjson_result<size_t> simdjson_result<arm64::ondemand::document_reference>::count_fields() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<fallback::ondemand::document_reference>::count_fields() & noexcept { if (error()) { return error(); } return first.count_fields(); } -simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::document_reference>::at(size_t index) & noexcept { +simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::document_reference>::at(size_t index) & noexcept { if (error()) { return error(); } return first.at(index); } -simdjson_inline error_code simdjson_result<arm64::ondemand::document_reference>::rewind() noexcept { +simdjson_inline error_code simdjson_result<fallback::ondemand::document_reference>::rewind() noexcept { if (error()) { return error(); } first.rewind(); return SUCCESS; } -simdjson_inline simdjson_result<arm64::ondemand::array_iterator> simdjson_result<arm64::ondemand::document_reference>::begin() & noexcept { +simdjson_inline simdjson_result<fallback::ondemand::array_iterator> simdjson_result<fallback::ondemand::document_reference>::begin() & noexcept { if (error()) { return error(); } return first.begin(); } -simdjson_inline simdjson_result<arm64::ondemand::array_iterator> simdjson_result<arm64::ondemand::document_reference>::end() & noexcept { +simdjson_inline simdjson_result<fallback::ondemand::array_iterator> simdjson_result<fallback::ondemand::document_reference>::end() & noexcept { return {}; } -simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::document_reference>::find_field_unordered(std::string_view key) & noexcept { +simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::document_reference>::find_field_unordered(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::document_reference>::find_field_unordered(const char *key) & noexcept { +simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::document_reference>::find_field_unordered(const char *key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::document_reference>::operator[](std::string_view key) & noexcept { +simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::document_reference>::operator[](std::string_view key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::document_reference>::operator[](const char *key) & noexcept { +simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::document_reference>::operator[](const char *key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::document_reference>::find_field(std::string_view key) & noexcept { +simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::document_reference>::find_field(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::document_reference>::find_field(const char *key) & noexcept { +simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::document_reference>::find_field(const char *key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<arm64::ondemand::array> simdjson_result<arm64::ondemand::document_reference>::get_array() & noexcept { +simdjson_inline simdjson_result<fallback::ondemand::array> simdjson_result<fallback::ondemand::document_reference>::get_array() & noexcept { if (error()) { return error(); } return first.get_array(); } -simdjson_inline simdjson_result<arm64::ondemand::object> simdjson_result<arm64::ondemand::document_reference>::get_object() & noexcept { +simdjson_inline simdjson_result<fallback::ondemand::object> simdjson_result<fallback::ondemand::document_reference>::get_object() & noexcept { if (error()) { return error(); } return first.get_object(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<arm64::ondemand::document_reference>::get_uint64() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<fallback::ondemand::document_reference>::get_uint64() noexcept { if (error()) { return error(); } return first.get_uint64(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<arm64::ondemand::document_reference>::get_uint64_in_string() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<fallback::ondemand::document_reference>::get_uint64_in_string() noexcept { if (error()) { return error(); } return first.get_uint64_in_string(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<arm64::ondemand::document_reference>::get_int64() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<fallback::ondemand::document_reference>::get_int64() noexcept { if (error()) { return error(); } return first.get_int64(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<arm64::ondemand::document_reference>::get_int64_in_string() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<fallback::ondemand::document_reference>::get_int64_in_string() noexcept { if (error()) { return error(); } return first.get_int64_in_string(); } -simdjson_inline simdjson_result<double> simdjson_result<arm64::ondemand::document_reference>::get_double() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<fallback::ondemand::document_reference>::get_double() noexcept { if (error()) { return error(); } return first.get_double(); } -simdjson_inline simdjson_result<double> simdjson_result<arm64::ondemand::document_reference>::get_double_in_string() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<fallback::ondemand::document_reference>::get_double_in_string() noexcept { if (error()) { return error(); } return first.get_double_in_string(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<arm64::ondemand::document_reference>::get_string(bool allow_replacement) noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<fallback::ondemand::document_reference>::get_string(bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(allow_replacement); } template <typename string_type> -simdjson_warn_unused simdjson_inline error_code simdjson_result<arm64::ondemand::document_reference>::get_string(string_type& receiver, bool allow_replacement) noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<fallback::ondemand::document_reference>::get_string(string_type& receiver, bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(receiver, allow_replacement); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<arm64::ondemand::document_reference>::get_wobbly_string() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<fallback::ondemand::document_reference>::get_wobbly_string() noexcept { if (error()) { return error(); } return first.get_wobbly_string(); } -simdjson_inline simdjson_result<arm64::ondemand::raw_json_string> simdjson_result<arm64::ondemand::document_reference>::get_raw_json_string() noexcept { +simdjson_inline simdjson_result<fallback::ondemand::raw_json_string> simdjson_result<fallback::ondemand::document_reference>::get_raw_json_string() noexcept { if (error()) { return error(); } return first.get_raw_json_string(); } -simdjson_inline simdjson_result<bool> simdjson_result<arm64::ondemand::document_reference>::get_bool() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<fallback::ondemand::document_reference>::get_bool() noexcept { if (error()) { return error(); } return first.get_bool(); } -simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::document_reference>::get_value() noexcept { +simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::document_reference>::get_value() noexcept { if (error()) { return error(); } return first.get_value(); } -simdjson_inline simdjson_result<bool> simdjson_result<arm64::ondemand::document_reference>::is_null() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<fallback::ondemand::document_reference>::is_null() noexcept { if (error()) { return error(); } return first.is_null(); } template<typename T> -simdjson_inline simdjson_result<T> simdjson_result<arm64::ondemand::document_reference>::get() & noexcept { +simdjson_inline simdjson_result<T> simdjson_result<fallback::ondemand::document_reference>::get() & noexcept { if (error()) { return error(); } return first.get<T>(); } template<typename T> -simdjson_inline simdjson_result<T> simdjson_result<arm64::ondemand::document_reference>::get() && noexcept { +simdjson_inline simdjson_result<T> simdjson_result<fallback::ondemand::document_reference>::get() && noexcept { if (error()) { return error(); } - return std::forward<arm64::ondemand::document_reference>(first).get<T>(); + return std::forward<fallback::ondemand::document_reference>(first).get<T>(); } template <class T> -simdjson_warn_unused simdjson_inline error_code simdjson_result<arm64::ondemand::document_reference>::get(T &out) & noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<fallback::ondemand::document_reference>::get(T &out) & noexcept { if (error()) { return error(); } return first.get<T>(out); } template <class T> -simdjson_warn_unused simdjson_inline error_code simdjson_result<arm64::ondemand::document_reference>::get(T &out) && noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<fallback::ondemand::document_reference>::get(T &out) && noexcept { if (error()) { return error(); } - return std::forward<arm64::ondemand::document_reference>(first).get<T>(out); + return std::forward<fallback::ondemand::document_reference>(first).get<T>(out); } -simdjson_inline simdjson_result<arm64::ondemand::json_type> simdjson_result<arm64::ondemand::document_reference>::type() noexcept { +simdjson_inline simdjson_result<fallback::ondemand::json_type> simdjson_result<fallback::ondemand::document_reference>::type() noexcept { if (error()) { return error(); } return first.type(); } -simdjson_inline simdjson_result<bool> simdjson_result<arm64::ondemand::document_reference>::is_scalar() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<fallback::ondemand::document_reference>::is_scalar() noexcept { if (error()) { return error(); } return first.is_scalar(); } -simdjson_inline simdjson_result<bool> simdjson_result<arm64::ondemand::document_reference>::is_string() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<fallback::ondemand::document_reference>::is_string() noexcept { if (error()) { return error(); } return first.is_string(); } template <> -simdjson_warn_unused simdjson_inline error_code simdjson_result<arm64::ondemand::document_reference>::get(arm64::ondemand::document_reference &out) & noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<fallback::ondemand::document_reference>::get(fallback::ondemand::document_reference &out) & noexcept { if (error()) { return error(); } out = first; return SUCCESS; } template <> -simdjson_warn_unused simdjson_inline error_code simdjson_result<arm64::ondemand::document_reference>::get(arm64::ondemand::document_reference &out) && noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<fallback::ondemand::document_reference>::get(fallback::ondemand::document_reference &out) && noexcept { if (error()) { return error(); } out = first; return SUCCESS; } -simdjson_inline simdjson_result<bool> simdjson_result<arm64::ondemand::document_reference>::is_negative() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<fallback::ondemand::document_reference>::is_negative() noexcept { if (error()) { return error(); } return first.is_negative(); } -simdjson_inline simdjson_result<bool> simdjson_result<arm64::ondemand::document_reference>::is_integer() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<fallback::ondemand::document_reference>::is_integer() noexcept { if (error()) { return error(); } return first.is_integer(); } -simdjson_inline simdjson_result<arm64::number_type> simdjson_result<arm64::ondemand::document_reference>::get_number_type() noexcept { +simdjson_inline simdjson_result<fallback::number_type> simdjson_result<fallback::ondemand::document_reference>::get_number_type() noexcept { if (error()) { return error(); } return first.get_number_type(); } -simdjson_inline simdjson_result<arm64::ondemand::number> simdjson_result<arm64::ondemand::document_reference>::get_number() noexcept { +simdjson_inline simdjson_result<fallback::ondemand::number> simdjson_result<fallback::ondemand::document_reference>::get_number() noexcept { if (error()) { return error(); } return first.get_number(); } #if SIMDJSON_EXCEPTIONS template <class T> -simdjson_inline simdjson_result<arm64::ondemand::document_reference>::operator T() noexcept(false) { - static_assert(std::is_same<T, arm64::ondemand::document_reference>::value == false, "You should not call get<T> when T is a document"); - static_assert(std::is_same<T, arm64::ondemand::document>::value == false, "You should not call get<T> when T is a document"); +simdjson_inline simdjson_result<fallback::ondemand::document_reference>::operator T() noexcept(false) { + static_assert(std::is_same<T, fallback::ondemand::document_reference>::value == false, "You should not call get<T> when T is a document"); + static_assert(std::is_same<T, fallback::ondemand::document>::value == false, "You should not call get<T> when T is a document"); if (error()) { throw simdjson_error(error()); } return first.get<T>(); } -simdjson_inline simdjson_result<arm64::ondemand::document_reference>::operator arm64::ondemand::array() & noexcept(false) { +simdjson_inline simdjson_result<fallback::ondemand::document_reference>::operator fallback::ondemand::array() & noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<arm64::ondemand::document_reference>::operator arm64::ondemand::object() & noexcept(false) { +simdjson_inline simdjson_result<fallback::ondemand::document_reference>::operator fallback::ondemand::object() & noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<arm64::ondemand::document_reference>::operator uint64_t() noexcept(false) { +simdjson_inline simdjson_result<fallback::ondemand::document_reference>::operator uint64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<arm64::ondemand::document_reference>::operator int64_t() noexcept(false) { +simdjson_inline simdjson_result<fallback::ondemand::document_reference>::operator int64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<arm64::ondemand::document_reference>::operator double() noexcept(false) { +simdjson_inline simdjson_result<fallback::ondemand::document_reference>::operator double() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<arm64::ondemand::document_reference>::operator std::string_view() noexcept(false) { +simdjson_inline simdjson_result<fallback::ondemand::document_reference>::operator std::string_view() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<arm64::ondemand::document_reference>::operator arm64::ondemand::raw_json_string() noexcept(false) { +simdjson_inline simdjson_result<fallback::ondemand::document_reference>::operator fallback::ondemand::raw_json_string() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<arm64::ondemand::document_reference>::operator bool() noexcept(false) { +simdjson_inline simdjson_result<fallback::ondemand::document_reference>::operator bool() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<arm64::ondemand::document_reference>::operator arm64::ondemand::value() noexcept(false) { +simdjson_inline simdjson_result<fallback::ondemand::document_reference>::operator fallback::ondemand::value() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } #endif -simdjson_inline simdjson_result<const char *> simdjson_result<arm64::ondemand::document_reference>::current_location() noexcept { +simdjson_inline simdjson_result<const char *> simdjson_result<fallback::ondemand::document_reference>::current_location() noexcept { if (error()) { return error(); } return first.current_location(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<arm64::ondemand::document_reference>::raw_json_token() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<fallback::ondemand::document_reference>::raw_json_token() noexcept { if (error()) { return error(); } return first.raw_json_token(); } -simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::document_reference>::at_pointer(std::string_view json_pointer) noexcept { +simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::document_reference>::at_pointer(std::string_view json_pointer) noexcept { if (error()) { return error(); } return first.at_pointer(json_pointer); } -simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::document_reference>::at_path(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::document_reference>::at_path(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path(json_path); } -simdjson_inline simdjson_result<std::vector<arm64::ondemand::value>> simdjson_result<arm64::ondemand::document_reference>::at_path_with_wildcard(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<std::vector<fallback::ondemand::value>> simdjson_result<fallback::ondemand::document_reference>::at_path_with_wildcard(std::string_view json_path) noexcept { if (error()) { return error(); } @@ -42619,7 +83421,7 @@ simdjson_inline simdjson_result<std::vector<arm64::ondemand::value>> simdjson_re #if SIMDJSON_STATIC_REFLECTION template<constevalutil::fixed_string... FieldNames, typename T> requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) -simdjson_warn_unused simdjson_inline error_code simdjson_result<arm64::ondemand::document_reference>::extract_into(T& out) & noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<fallback::ondemand::document_reference>::extract_into(T& out) & noexcept { if (error()) { return error(); } return first.extract_into<FieldNames...>(out); } @@ -42627,9 +83429,9 @@ simdjson_warn_unused simdjson_inline error_code simdjson_result<arm64::ondemand: } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H -/* end file simdjson/generic/ondemand/document-inl.h for arm64 */ -/* including simdjson/generic/ondemand/document_stream-inl.h for arm64: #include "simdjson/generic/ondemand/document_stream-inl.h" */ -/* begin file simdjson/generic/ondemand/document_stream-inl.h for arm64 */ +/* end file simdjson/generic/ondemand/document-inl.h for fallback */ +/* including simdjson/generic/ondemand/document_stream-inl.h for fallback: #include "simdjson/generic/ondemand/document_stream-inl.h" */ +/* begin file simdjson/generic/ondemand/document_stream-inl.h for fallback */ #ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -42644,7 +83446,7 @@ simdjson_warn_unused simdjson_inline error_code simdjson_result<arm64::ondemand: #include <stdexcept> namespace simdjson { -namespace arm64 { +namespace fallback { namespace ondemand { #ifdef SIMDJSON_THREADS_ENABLED @@ -43051,22 +83853,22 @@ inline void document_stream::start_stage1_thread() noexcept { #endif // SIMDJSON_THREADS_ENABLED } // namespace ondemand -} // namespace arm64 +} // namespace fallback } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<arm64::ondemand::document_stream>::simdjson_result( +simdjson_inline simdjson_result<fallback::ondemand::document_stream>::simdjson_result( error_code error ) noexcept : - implementation_simdjson_result_base<arm64::ondemand::document_stream>(error) + implementation_simdjson_result_base<fallback::ondemand::document_stream>(error) { } -simdjson_inline simdjson_result<arm64::ondemand::document_stream>::simdjson_result( - arm64::ondemand::document_stream &&value +simdjson_inline simdjson_result<fallback::ondemand::document_stream>::simdjson_result( + fallback::ondemand::document_stream &&value ) noexcept : - implementation_simdjson_result_base<arm64::ondemand::document_stream>( - std::forward<arm64::ondemand::document_stream>(value) + implementation_simdjson_result_base<fallback::ondemand::document_stream>( + std::forward<fallback::ondemand::document_stream>(value) ) { } @@ -43074,9 +83876,9 @@ simdjson_inline simdjson_result<arm64::ondemand::document_stream>::simdjson_resu } #endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_INL_H -/* end file simdjson/generic/ondemand/document_stream-inl.h for arm64 */ -/* including simdjson/generic/ondemand/field-inl.h for arm64: #include "simdjson/generic/ondemand/field-inl.h" */ -/* begin file simdjson/generic/ondemand/field-inl.h for arm64 */ +/* end file simdjson/generic/ondemand/document_stream-inl.h for fallback */ +/* including simdjson/generic/ondemand/field-inl.h for fallback: #include "simdjson/generic/ondemand/field-inl.h" */ +/* begin file simdjson/generic/ondemand/field-inl.h for fallback */ #ifndef SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -43088,7 +83890,7 @@ simdjson_inline simdjson_result<arm64::ondemand::document_stream>::simdjson_resu /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace arm64 { +namespace fallback { namespace ondemand { // clang 6 does not think the default constructor can be noexcept, so we make it explicit @@ -43152,53 +83954,53 @@ simdjson_inline value field::value() && noexcept { } } // namespace ondemand -} // namespace arm64 +} // namespace fallback } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<arm64::ondemand::field>::simdjson_result( - arm64::ondemand::field &&value +simdjson_inline simdjson_result<fallback::ondemand::field>::simdjson_result( + fallback::ondemand::field &&value ) noexcept : - implementation_simdjson_result_base<arm64::ondemand::field>( - std::forward<arm64::ondemand::field>(value) + implementation_simdjson_result_base<fallback::ondemand::field>( + std::forward<fallback::ondemand::field>(value) ) { } -simdjson_inline simdjson_result<arm64::ondemand::field>::simdjson_result( +simdjson_inline simdjson_result<fallback::ondemand::field>::simdjson_result( error_code error ) noexcept : - implementation_simdjson_result_base<arm64::ondemand::field>(error) + implementation_simdjson_result_base<fallback::ondemand::field>(error) { } -simdjson_inline simdjson_result<arm64::ondemand::raw_json_string> simdjson_result<arm64::ondemand::field>::key() noexcept { +simdjson_inline simdjson_result<fallback::ondemand::raw_json_string> simdjson_result<fallback::ondemand::field>::key() noexcept { if (error()) { return error(); } return first.key(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<arm64::ondemand::field>::key_raw_json_token() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<fallback::ondemand::field>::key_raw_json_token() noexcept { if (error()) { return error(); } return first.key_raw_json_token(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<arm64::ondemand::field>::escaped_key() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<fallback::ondemand::field>::escaped_key() noexcept { if (error()) { return error(); } return first.escaped_key(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<arm64::ondemand::field>::unescaped_key(bool allow_replacement) noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<fallback::ondemand::field>::unescaped_key(bool allow_replacement) noexcept { if (error()) { return error(); } return first.unescaped_key(allow_replacement); } template<typename string_type> -simdjson_warn_unused simdjson_inline error_code simdjson_result<arm64::ondemand::field>::unescaped_key(string_type &receiver, bool allow_replacement) noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<fallback::ondemand::field>::unescaped_key(string_type &receiver, bool allow_replacement) noexcept { if (error()) { return error(); } return first.unescaped_key(receiver, allow_replacement); } -simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::field>::value() noexcept { +simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::field>::value() noexcept { if (error()) { return error(); } return std::move(first.value()); } @@ -43206,9 +84008,9 @@ simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::o } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H -/* end file simdjson/generic/ondemand/field-inl.h for arm64 */ -/* including simdjson/generic/ondemand/json_iterator-inl.h for arm64: #include "simdjson/generic/ondemand/json_iterator-inl.h" */ -/* begin file simdjson/generic/ondemand/json_iterator-inl.h for arm64 */ +/* end file simdjson/generic/ondemand/field-inl.h for fallback */ +/* including simdjson/generic/ondemand/json_iterator-inl.h for fallback: #include "simdjson/generic/ondemand/json_iterator-inl.h" */ +/* begin file simdjson/generic/ondemand/json_iterator-inl.h for fallback */ #ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -43224,7 +84026,7 @@ simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::o /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace arm64 { +namespace fallback { namespace ondemand { simdjson_inline json_iterator::json_iterator(json_iterator &&other) noexcept @@ -43426,11 +84228,10 @@ simdjson_inline void json_iterator::assert_more_tokens(uint32_t required_tokens) } simdjson_inline void json_iterator::assert_valid_position(token_position position) const noexcept { + (void)position; // Suppress unused parameter warning #ifndef SIMDJSON_CLANG_VISUAL_STUDIO SIMDJSON_ASSUME( position >= &parser->implementation->structural_indexes[0] ); SIMDJSON_ASSUME( position < &parser->implementation->structural_indexes[parser->implementation->n_structural_indexes] ); -#else - (void)position; // Suppress unused parameter warning #endif } @@ -43569,7 +84370,11 @@ simdjson_inline token_position json_iterator::position() const noexcept { simdjson_inline simdjson_result<std::string_view> json_iterator::unescape(raw_json_string in, bool allow_replacement) noexcept { #if SIMDJSON_DEVELOPMENT_CHECKS auto result = parser->unescape(in, _string_buf_loc, allow_replacement); +#if !defined(SIMDJSON_VISUAL_STUDIO) && !defined(SIMDJSON_CLANG_VISUAL_STUDIO) + // Under Visual Studio, the next SIMDJSON_ASSUME fails with: the argument + // has side effects that will be discarded. SIMDJSON_ASSUME(!parser->string_buffer_overflow(_string_buf_loc)); +#endif // !defined(SIMDJSON_VISUAL_STUDIO) && !defined(SIMDJSON_CLANG_VISUAL_STUDIO) return result; #else return parser->unescape(in, _string_buf_loc, allow_replacement); @@ -43579,7 +84384,11 @@ simdjson_inline simdjson_result<std::string_view> json_iterator::unescape(raw_js simdjson_inline simdjson_result<std::string_view> json_iterator::unescape_wobbly(raw_json_string in) noexcept { #if SIMDJSON_DEVELOPMENT_CHECKS auto result = parser->unescape_wobbly(in, _string_buf_loc); +#if !defined(SIMDJSON_VISUAL_STUDIO) && !defined(SIMDJSON_CLANG_VISUAL_STUDIO) + // Under Visual Studio, the next SIMDJSON_ASSUME fails with: the argument + // has side effects that will be discarded. SIMDJSON_ASSUME(!parser->string_buffer_overflow(_string_buf_loc)); +#endif // !defined(SIMDJSON_VISUAL_STUDIO) && !defined(SIMDJSON_CLANG_VISUAL_STUDIO) return result; #else return parser->unescape_wobbly(in, _string_buf_loc); @@ -43642,22 +84451,22 @@ simdjson_warn_unused simdjson_inline bool json_iterator::copy_to_buffer(const ui } } // namespace ondemand -} // namespace arm64 +} // namespace fallback } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<arm64::ondemand::json_iterator>::simdjson_result(arm64::ondemand::json_iterator &&value) noexcept - : implementation_simdjson_result_base<arm64::ondemand::json_iterator>(std::forward<arm64::ondemand::json_iterator>(value)) {} -simdjson_inline simdjson_result<arm64::ondemand::json_iterator>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<arm64::ondemand::json_iterator>(error) {} +simdjson_inline simdjson_result<fallback::ondemand::json_iterator>::simdjson_result(fallback::ondemand::json_iterator &&value) noexcept + : implementation_simdjson_result_base<fallback::ondemand::json_iterator>(std::forward<fallback::ondemand::json_iterator>(value)) {} +simdjson_inline simdjson_result<fallback::ondemand::json_iterator>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<fallback::ondemand::json_iterator>(error) {} } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_INL_H -/* end file simdjson/generic/ondemand/json_iterator-inl.h for arm64 */ -/* including simdjson/generic/ondemand/json_type-inl.h for arm64: #include "simdjson/generic/ondemand/json_type-inl.h" */ -/* begin file simdjson/generic/ondemand/json_type-inl.h for arm64 */ +/* end file simdjson/generic/ondemand/json_iterator-inl.h for fallback */ +/* including simdjson/generic/ondemand/json_type-inl.h for fallback: #include "simdjson/generic/ondemand/json_type-inl.h" */ +/* begin file simdjson/generic/ondemand/json_type-inl.h for fallback */ #ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -43668,7 +84477,7 @@ simdjson_inline simdjson_result<arm64::ondemand::json_iterator>::simdjson_result /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace arm64 { +namespace fallback { namespace ondemand { inline std::ostream& operator<<(std::ostream& out, json_type type) noexcept { @@ -43762,22 +84571,22 @@ simdjson_inline void number::skip_double() noexcept { } } // namespace ondemand -} // namespace arm64 +} // namespace fallback } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<arm64::ondemand::json_type>::simdjson_result(arm64::ondemand::json_type &&value) noexcept - : implementation_simdjson_result_base<arm64::ondemand::json_type>(std::forward<arm64::ondemand::json_type>(value)) {} -simdjson_inline simdjson_result<arm64::ondemand::json_type>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<arm64::ondemand::json_type>(error) {} +simdjson_inline simdjson_result<fallback::ondemand::json_type>::simdjson_result(fallback::ondemand::json_type &&value) noexcept + : implementation_simdjson_result_base<fallback::ondemand::json_type>(std::forward<fallback::ondemand::json_type>(value)) {} +simdjson_inline simdjson_result<fallback::ondemand::json_type>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<fallback::ondemand::json_type>(error) {} } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_INL_H -/* end file simdjson/generic/ondemand/json_type-inl.h for arm64 */ -/* including simdjson/generic/ondemand/logger-inl.h for arm64: #include "simdjson/generic/ondemand/logger-inl.h" */ -/* begin file simdjson/generic/ondemand/logger-inl.h for arm64 */ +/* end file simdjson/generic/ondemand/json_type-inl.h for fallback */ +/* including simdjson/generic/ondemand/logger-inl.h for fallback: #include "simdjson/generic/ondemand/logger-inl.h" */ +/* begin file simdjson/generic/ondemand/logger-inl.h for fallback */ #ifndef SIMDJSON_GENERIC_ONDEMAND_LOGGER_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -43792,7 +84601,7 @@ simdjson_inline simdjson_result<arm64::ondemand::json_type>::simdjson_result(err #include <cstring> namespace simdjson { -namespace arm64 { +namespace fallback { namespace ondemand { namespace logger { @@ -43999,13 +84808,13 @@ inline void log_line(const json_iterator &iter, token_position index, depth_t de } // namespace logger } // namespace ondemand -} // namespace arm64 +} // namespace fallback } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_LOGGER_INL_H -/* end file simdjson/generic/ondemand/logger-inl.h for arm64 */ -/* including simdjson/generic/ondemand/object-inl.h for arm64: #include "simdjson/generic/ondemand/object-inl.h" */ -/* begin file simdjson/generic/ondemand/object-inl.h for arm64 */ +/* end file simdjson/generic/ondemand/logger-inl.h for fallback */ +/* including simdjson/generic/ondemand/object-inl.h for fallback: #include "simdjson/generic/ondemand/object-inl.h" */ +/* begin file simdjson/generic/ondemand/object-inl.h for fallback */ #ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -44025,7 +84834,7 @@ inline void log_line(const json_iterator &iter, token_position index, depth_t de /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace arm64 { +namespace fallback { namespace ondemand { simdjson_inline simdjson_result<value> object::find_field_unordered(const std::string_view key) & noexcept { @@ -44299,55 +85108,55 @@ simdjson_warn_unused simdjson_inline error_code object::extract_into(T& out) & n #endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION } // namespace ondemand -} // namespace arm64 +} // namespace fallback } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<arm64::ondemand::object>::simdjson_result(arm64::ondemand::object &&value) noexcept - : implementation_simdjson_result_base<arm64::ondemand::object>(std::forward<arm64::ondemand::object>(value)) {} -simdjson_inline simdjson_result<arm64::ondemand::object>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<arm64::ondemand::object>(error) {} +simdjson_inline simdjson_result<fallback::ondemand::object>::simdjson_result(fallback::ondemand::object &&value) noexcept + : implementation_simdjson_result_base<fallback::ondemand::object>(std::forward<fallback::ondemand::object>(value)) {} +simdjson_inline simdjson_result<fallback::ondemand::object>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<fallback::ondemand::object>(error) {} -simdjson_inline simdjson_result<arm64::ondemand::object_iterator> simdjson_result<arm64::ondemand::object>::begin() noexcept { +simdjson_inline simdjson_result<fallback::ondemand::object_iterator> simdjson_result<fallback::ondemand::object>::begin() noexcept { if (error()) { return error(); } return first.begin(); } -simdjson_inline simdjson_result<arm64::ondemand::object_iterator> simdjson_result<arm64::ondemand::object>::end() noexcept { +simdjson_inline simdjson_result<fallback::ondemand::object_iterator> simdjson_result<fallback::ondemand::object>::end() noexcept { if (error()) { return error(); } return first.end(); } -simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::object>::find_field_unordered(std::string_view key) & noexcept { +simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::object>::find_field_unordered(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::object>::find_field_unordered(std::string_view key) && noexcept { +simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::object>::find_field_unordered(std::string_view key) && noexcept { if (error()) { return error(); } - return std::forward<arm64::ondemand::object>(first).find_field_unordered(key); + return std::forward<fallback::ondemand::object>(first).find_field_unordered(key); } -simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::object>::operator[](std::string_view key) & noexcept { +simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::object>::operator[](std::string_view key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::object>::operator[](std::string_view key) && noexcept { +simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::object>::operator[](std::string_view key) && noexcept { if (error()) { return error(); } - return std::forward<arm64::ondemand::object>(first)[key]; + return std::forward<fallback::ondemand::object>(first)[key]; } -simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::object>::find_field(std::string_view key) & noexcept { +simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::object>::find_field(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::object>::find_field(std::string_view key) && noexcept { +simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::object>::find_field(std::string_view key) && noexcept { if (error()) { return error(); } - return std::forward<arm64::ondemand::object>(first).find_field(key); + return std::forward<fallback::ondemand::object>(first).find_field(key); } -simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::object>::at_pointer(std::string_view json_pointer) noexcept { +simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::object>::at_pointer(std::string_view json_pointer) noexcept { if (error()) { return error(); } return first.at_pointer(json_pointer); } -simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::ondemand::object>::at_path( +simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::object>::at_path( std::string_view json_path) noexcept { if (error()) { return error(); @@ -44355,27 +85164,27 @@ simdjson_inline simdjson_result<arm64::ondemand::value> simdjson_result<arm64::o return first.at_path(json_path); } -simdjson_inline simdjson_result<std::vector<arm64::ondemand::value>> simdjson_result<arm64::ondemand::object>::at_path_with_wildcard(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<std::vector<fallback::ondemand::value>> simdjson_result<fallback::ondemand::object>::at_path_with_wildcard(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path_with_wildcard(json_path); } -inline simdjson_result<bool> simdjson_result<arm64::ondemand::object>::reset() noexcept { +inline simdjson_result<bool> simdjson_result<fallback::ondemand::object>::reset() noexcept { if (error()) { return error(); } return first.reset(); } -inline simdjson_result<bool> simdjson_result<arm64::ondemand::object>::is_empty() noexcept { +inline simdjson_result<bool> simdjson_result<fallback::ondemand::object>::is_empty() noexcept { if (error()) { return error(); } return first.is_empty(); } -simdjson_inline simdjson_result<size_t> simdjson_result<arm64::ondemand::object>::count_fields() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<fallback::ondemand::object>::count_fields() & noexcept { if (error()) { return error(); } return first.count_fields(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<arm64::ondemand::object>::raw_json() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<fallback::ondemand::object>::raw_json() noexcept { if (error()) { return error(); } return first.raw_json(); } @@ -44383,9 +85192,9 @@ simdjson_inline simdjson_result<std::string_view> simdjson_result<arm64::ondema } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_INL_H -/* end file simdjson/generic/ondemand/object-inl.h for arm64 */ -/* including simdjson/generic/ondemand/object_iterator-inl.h for arm64: #include "simdjson/generic/ondemand/object_iterator-inl.h" */ -/* begin file simdjson/generic/ondemand/object_iterator-inl.h for arm64 */ +/* end file simdjson/generic/ondemand/object-inl.h for fallback */ +/* including simdjson/generic/ondemand/object_iterator-inl.h for fallback: #include "simdjson/generic/ondemand/object_iterator-inl.h" */ +/* begin file simdjson/generic/ondemand/object_iterator-inl.h for fallback */ #ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -44397,7 +85206,7 @@ simdjson_inline simdjson_result<std::string_view> simdjson_result<arm64::ondema /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace arm64 { +namespace fallback { namespace ondemand { // @@ -44409,6 +85218,11 @@ simdjson_inline object_iterator::object_iterator(const value_iterator &_iter) no {} simdjson_inline simdjson_result<field> object_iterator::operator*() noexcept { +#if SIMDJSON_DEVELOPMENT_CHECKS + // We must call * once per iteration. + SIMDJSON_ASSUME(!has_been_referenced); + has_been_referenced = true; +#endif error_code error = iter.error(); if (error) { iter.abandon(); return error; } auto result = field::start(iter); @@ -44427,6 +85241,11 @@ simdjson_inline bool object_iterator::operator!=(const object_iterator &) const SIMDJSON_PUSH_DISABLE_WARNINGS SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING simdjson_inline object_iterator &object_iterator::operator++() noexcept { +#if SIMDJSON_DEVELOPMENT_CHECKS + // Before calling ++, we must have called *. + SIMDJSON_ASSUME(has_been_referenced); + has_been_referenced = false; +#endif // TODO this is a safety rail ... users should exit loops as soon as they receive an error. // Nonetheless, let's see if performance is OK with this if statement--the compiler may give it to us for free. if (!iter.is_open()) { return *this; } // Iterator will be released if there is an error @@ -44482,39 +85301,39 @@ SIMDJSON_POP_DISABLE_WARNINGS // } // namespace ondemand -} // namespace arm64 +} // namespace fallback } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<arm64::ondemand::object_iterator>::simdjson_result( - arm64::ondemand::object_iterator &&value +simdjson_inline simdjson_result<fallback::ondemand::object_iterator>::simdjson_result( + fallback::ondemand::object_iterator &&value ) noexcept - : implementation_simdjson_result_base<arm64::ondemand::object_iterator>(std::forward<arm64::ondemand::object_iterator>(value)) + : implementation_simdjson_result_base<fallback::ondemand::object_iterator>(std::forward<fallback::ondemand::object_iterator>(value)) { first.iter.assert_is_valid(); } -simdjson_inline simdjson_result<arm64::ondemand::object_iterator>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<arm64::ondemand::object_iterator>({}, error) +simdjson_inline simdjson_result<fallback::ondemand::object_iterator>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<fallback::ondemand::object_iterator>({}, error) { } -simdjson_inline simdjson_result<arm64::ondemand::field> simdjson_result<arm64::ondemand::object_iterator>::operator*() noexcept { +simdjson_inline simdjson_result<fallback::ondemand::field> simdjson_result<fallback::ondemand::object_iterator>::operator*() noexcept { if (error()) { return error(); } return *first; } // If we're iterating and there is an error, return the error once. -simdjson_inline bool simdjson_result<arm64::ondemand::object_iterator>::operator==(const simdjson_result<arm64::ondemand::object_iterator> &other) const noexcept { +simdjson_inline bool simdjson_result<fallback::ondemand::object_iterator>::operator==(const simdjson_result<fallback::ondemand::object_iterator> &other) const noexcept { if (!first.iter.is_valid()) { return !error(); } return first == other.first; } // If we're iterating and there is an error, return the error once. -simdjson_inline bool simdjson_result<arm64::ondemand::object_iterator>::operator!=(const simdjson_result<arm64::ondemand::object_iterator> &other) const noexcept { +simdjson_inline bool simdjson_result<fallback::ondemand::object_iterator>::operator!=(const simdjson_result<fallback::ondemand::object_iterator> &other) const noexcept { if (!first.iter.is_valid()) { return error(); } return first != other.first; } // Checks for ']' and ',' -simdjson_inline simdjson_result<arm64::ondemand::object_iterator> &simdjson_result<arm64::ondemand::object_iterator>::operator++() noexcept { +simdjson_inline simdjson_result<fallback::ondemand::object_iterator> &simdjson_result<fallback::ondemand::object_iterator>::operator++() noexcept { // Clear the error if there is one, so we don't yield it twice if (error()) { second = SUCCESS; return *this; } ++first; @@ -44524,9 +85343,9 @@ simdjson_inline simdjson_result<arm64::ondemand::object_iterator> &simdjson_resu } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_INL_H -/* end file simdjson/generic/ondemand/object_iterator-inl.h for arm64 */ -/* including simdjson/generic/ondemand/parser-inl.h for arm64: #include "simdjson/generic/ondemand/parser-inl.h" */ -/* begin file simdjson/generic/ondemand/parser-inl.h for arm64 */ +/* end file simdjson/generic/ondemand/object_iterator-inl.h for fallback */ +/* including simdjson/generic/ondemand/parser-inl.h for fallback: #include "simdjson/generic/ondemand/parser-inl.h" */ +/* begin file simdjson/generic/ondemand/parser-inl.h for fallback */ #ifndef SIMDJSON_GENERIC_ONDEMAND_PARSER_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -44543,7 +85362,7 @@ simdjson_inline simdjson_result<arm64::ondemand::object_iterator> &simdjson_resu /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace arm64 { +namespace fallback { namespace ondemand { simdjson_inline parser::parser(size_t max_capacity) noexcept @@ -44753,22 +85572,22 @@ simdjson_inline simdjson_warn_unused std::unique_ptr<ondemand::parser>& parser:: } // namespace ondemand -} // namespace arm64 +} // namespace fallback } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<arm64::ondemand::parser>::simdjson_result(arm64::ondemand::parser &&value) noexcept - : implementation_simdjson_result_base<arm64::ondemand::parser>(std::forward<arm64::ondemand::parser>(value)) {} -simdjson_inline simdjson_result<arm64::ondemand::parser>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<arm64::ondemand::parser>(error) {} +simdjson_inline simdjson_result<fallback::ondemand::parser>::simdjson_result(fallback::ondemand::parser &&value) noexcept + : implementation_simdjson_result_base<fallback::ondemand::parser>(std::forward<fallback::ondemand::parser>(value)) {} +simdjson_inline simdjson_result<fallback::ondemand::parser>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<fallback::ondemand::parser>(error) {} } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_PARSER_INL_H -/* end file simdjson/generic/ondemand/parser-inl.h for arm64 */ -/* including simdjson/generic/ondemand/raw_json_string-inl.h for arm64: #include "simdjson/generic/ondemand/raw_json_string-inl.h" */ -/* begin file simdjson/generic/ondemand/raw_json_string-inl.h for arm64 */ +/* end file simdjson/generic/ondemand/parser-inl.h for fallback */ +/* including simdjson/generic/ondemand/raw_json_string-inl.h for fallback: #include "simdjson/generic/ondemand/raw_json_string-inl.h" */ +/* begin file simdjson/generic/ondemand/raw_json_string-inl.h for fallback */ #ifndef SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -44781,7 +85600,7 @@ simdjson_inline simdjson_result<arm64::ondemand::parser>::simdjson_result(error_ namespace simdjson { -namespace arm64 { +namespace fallback { namespace ondemand { simdjson_inline raw_json_string::raw_json_string(const uint8_t * _buf) noexcept : buf{_buf} {} @@ -44899,333 +85718,94 @@ simdjson_inline bool raw_json_string::is_equal(const char* target) const noexcep for(;target[pos];pos++) { if(r[pos] != target[pos]) { return false; } // if target is a compile-time constant and it is free from - // quotes, then the next part could get optimized away through - // inlining. - if((target[pos] == '"') && !escaping) { - // We have reached the end of the raw_json_string but - // the target is not done. - return false; - } else if(target[pos] == '\\') { - escaping = !escaping; - } else { - escaping = false; - } - } - if(r[pos] != '"') { return false; } - return true; -} - -simdjson_unused simdjson_inline bool operator==(const raw_json_string &a, std::string_view c) noexcept { - return a.unsafe_is_equal(c); -} - -simdjson_unused simdjson_inline bool operator==(std::string_view c, const raw_json_string &a) noexcept { - return a == c; -} - -simdjson_unused simdjson_inline bool operator!=(const raw_json_string &a, std::string_view c) noexcept { - return !(a == c); -} - -simdjson_unused simdjson_inline bool operator!=(std::string_view c, const raw_json_string &a) noexcept { - return !(a == c); -} - - -simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> raw_json_string::unescape(json_iterator &iter, bool allow_replacement) const noexcept { - return iter.unescape(*this, allow_replacement); -} - -simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> raw_json_string::unescape_wobbly(json_iterator &iter) const noexcept { - return iter.unescape_wobbly(*this); -} - -simdjson_unused simdjson_inline std::ostream &operator<<(std::ostream &out, const raw_json_string &str) noexcept { - bool in_escape = false; - const char *s = str.raw(); - while (true) { - switch (*s) { - case '\\': in_escape = !in_escape; break; - case '"': if (in_escape) { in_escape = false; } else { return out; } break; - default: if (in_escape) { in_escape = false; } - } - out << *s; - s++; - } -} - -} // namespace ondemand -} // namespace arm64 -} // namespace simdjson - -namespace simdjson { - -simdjson_inline simdjson_result<arm64::ondemand::raw_json_string>::simdjson_result(arm64::ondemand::raw_json_string &&value) noexcept - : implementation_simdjson_result_base<arm64::ondemand::raw_json_string>(std::forward<arm64::ondemand::raw_json_string>(value)) {} -simdjson_inline simdjson_result<arm64::ondemand::raw_json_string>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<arm64::ondemand::raw_json_string>(error) {} - -simdjson_inline simdjson_result<const char *> simdjson_result<arm64::ondemand::raw_json_string>::raw() const noexcept { - if (error()) { return error(); } - return first.raw(); -} -simdjson_inline char simdjson_result<arm64::ondemand::raw_json_string>::operator[](size_t i) const noexcept { - if (error()) { return error(); } - return first[i]; -} -simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> simdjson_result<arm64::ondemand::raw_json_string>::unescape(arm64::ondemand::json_iterator &iter, bool allow_replacement) const noexcept { - if (error()) { return error(); } - return first.unescape(iter, allow_replacement); -} -simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> simdjson_result<arm64::ondemand::raw_json_string>::unescape_wobbly(arm64::ondemand::json_iterator &iter) const noexcept { - if (error()) { return error(); } - return first.unescape_wobbly(iter); -} -} // namespace simdjson - -#endif // SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_INL_H -/* end file simdjson/generic/ondemand/raw_json_string-inl.h for arm64 */ -/* including simdjson/generic/ondemand/serialization-inl.h for arm64: #include "simdjson/generic/ondemand/serialization-inl.h" */ -/* begin file simdjson/generic/ondemand/serialization-inl.h for arm64 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H - -/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document-inl.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/serialization.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */ -/* amalgamation skipped (editor-only): #if SIMDJSON_STATIC_REFLECTION */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_builder.h" */ -/* amalgamation skipped (editor-only): #endif */ -/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ - -namespace simdjson { - -inline std::string_view trim(const std::string_view str) noexcept { - // We can almost surely do better by rolling our own find_first_not_of function. - size_t first = str.find_first_not_of(" \t\n\r"); - // If we have the empty string (just white space), then no trimming is possible, and - // we return the empty string_view. - if (std::string_view::npos == first) { return std::string_view(); } - size_t last = str.find_last_not_of(" \t\n\r"); - return str.substr(first, (last - first + 1)); -} - - -inline simdjson_result<std::string_view> to_json_string(arm64::ondemand::document& x) noexcept { - std::string_view v; - auto error = x.raw_json().get(v); - if(error) {return error; } - return trim(v); -} - -inline simdjson_result<std::string_view> to_json_string(arm64::ondemand::document_reference& x) noexcept { - std::string_view v; - auto error = x.raw_json().get(v); - if(error) {return error; } - return trim(v); -} - -inline simdjson_result<std::string_view> to_json_string(arm64::ondemand::value& x) noexcept { - /** - * If we somehow receive a value that has already been consumed, - * then the following code could be in trouble. E.g., we create - * an array as needed, but if an array was already created, then - * it could be bad. - */ - using namespace arm64::ondemand; - arm64::ondemand::json_type t; - auto error = x.type().get(t); - if(error != SUCCESS) { return error; } - switch (t) - { - case json_type::array: - { - arm64::ondemand::array array; - error = x.get_array().get(array); - if(error) { return error; } - return to_json_string(array); - } - case json_type::object: - { - arm64::ondemand::object object; - error = x.get_object().get(object); - if(error) { return error; } - return to_json_string(object); + // quotes, then the next part could get optimized away through + // inlining. + if((target[pos] == '"') && !escaping) { + // We have reached the end of the raw_json_string but + // the target is not done. + return false; + } else if(target[pos] == '\\') { + escaping = !escaping; + } else { + escaping = false; } - default: - return trim(x.raw_json_token()); } + if(r[pos] != '"') { return false; } + return true; } -inline simdjson_result<std::string_view> to_json_string(arm64::ondemand::object& x) noexcept { - std::string_view v; - auto error = x.raw_json().get(v); - if(error) {return error; } - return trim(v); +simdjson_unused simdjson_inline bool operator==(const raw_json_string &a, std::string_view c) noexcept { + return a.unsafe_is_equal(c); } -inline simdjson_result<std::string_view> to_json_string(arm64::ondemand::array& x) noexcept { - std::string_view v; - auto error = x.raw_json().get(v); - if(error) {return error; } - return trim(v); +simdjson_unused simdjson_inline bool operator==(std::string_view c, const raw_json_string &a) noexcept { + return a == c; } -inline simdjson_result<std::string_view> to_json_string(simdjson_result<arm64::ondemand::document> x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); +simdjson_unused simdjson_inline bool operator!=(const raw_json_string &a, std::string_view c) noexcept { + return !(a == c); } -inline simdjson_result<std::string_view> to_json_string(simdjson_result<arm64::ondemand::document_reference> x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); +simdjson_unused simdjson_inline bool operator!=(std::string_view c, const raw_json_string &a) noexcept { + return !(a == c); } -inline simdjson_result<std::string_view> to_json_string(simdjson_result<arm64::ondemand::value> x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); -} -inline simdjson_result<std::string_view> to_json_string(simdjson_result<arm64::ondemand::object> x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); +simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> raw_json_string::unescape(json_iterator &iter, bool allow_replacement) const noexcept { + return iter.unescape(*this, allow_replacement); } -inline simdjson_result<std::string_view> to_json_string(simdjson_result<arm64::ondemand::array> x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); +simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> raw_json_string::unescape_wobbly(json_iterator &iter) const noexcept { + return iter.unescape_wobbly(*this); } -} // namespace simdjson - -namespace simdjson { namespace arm64 { namespace ondemand { -#if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::arm64::ondemand::value x) { - std::string_view v; - auto error = simdjson::to_json_string(x).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - throw simdjson::simdjson_error(error); - } -} -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::arm64::ondemand::value> x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); -} -#else -inline std::ostream& operator<<(std::ostream& out, simdjson::arm64::ondemand::value x) { - std::string_view v; - auto error = simdjson::to_json_string(x).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - return (out << error); +simdjson_unused simdjson_inline std::ostream &operator<<(std::ostream &out, const raw_json_string &str) noexcept { + bool in_escape = false; + const char *s = str.raw(); + while (true) { + switch (*s) { + case '\\': in_escape = !in_escape; break; + case '"': if (in_escape) { in_escape = false; } else { return out; } break; + default: if (in_escape) { in_escape = false; } + } + out << *s; + s++; } } -#endif -#if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::arm64::ondemand::array value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - throw simdjson::simdjson_error(error); - } -} -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::arm64::ondemand::array> x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); -} -#else -inline std::ostream& operator<<(std::ostream& out, simdjson::arm64::ondemand::array value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - return (out << error); - } -} -#endif +} // namespace ondemand +} // namespace fallback +} // namespace simdjson -#if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::arm64::ondemand::document& value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - throw simdjson::simdjson_error(error); - } -} -inline std::ostream& operator<<(std::ostream& out, simdjson::arm64::ondemand::document_reference& value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - throw simdjson::simdjson_error(error); - } -} -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::arm64::ondemand::document>&& x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); -} -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::arm64::ondemand::document_reference>&& x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); -} -#else -inline std::ostream& operator<<(std::ostream& out, simdjson::arm64::ondemand::document& value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - return (out << error); - } -} -#endif +namespace simdjson { -#if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::arm64::ondemand::object value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - throw simdjson::simdjson_error(error); - } +simdjson_inline simdjson_result<fallback::ondemand::raw_json_string>::simdjson_result(fallback::ondemand::raw_json_string &&value) noexcept + : implementation_simdjson_result_base<fallback::ondemand::raw_json_string>(std::forward<fallback::ondemand::raw_json_string>(value)) {} +simdjson_inline simdjson_result<fallback::ondemand::raw_json_string>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<fallback::ondemand::raw_json_string>(error) {} + +simdjson_inline simdjson_result<const char *> simdjson_result<fallback::ondemand::raw_json_string>::raw() const noexcept { + if (error()) { return error(); } + return first.raw(); } -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::arm64::ondemand::object> x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); +simdjson_inline char simdjson_result<fallback::ondemand::raw_json_string>::operator[](size_t i) const noexcept { + if (error()) { return error(); } + return first[i]; } -#else -inline std::ostream& operator<<(std::ostream& out, simdjson::arm64::ondemand::object value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - return (out << error); - } +simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> simdjson_result<fallback::ondemand::raw_json_string>::unescape(fallback::ondemand::json_iterator &iter, bool allow_replacement) const noexcept { + if (error()) { return error(); } + return first.unescape(iter, allow_replacement); } -#endif -}}} // namespace simdjson::arm64::ondemand +simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> simdjson_result<fallback::ondemand::raw_json_string>::unescape_wobbly(fallback::ondemand::json_iterator &iter) const noexcept { + if (error()) { return error(); } + return first.unescape_wobbly(iter); +} +} // namespace simdjson -#endif // SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H -/* end file simdjson/generic/ondemand/serialization-inl.h for arm64 */ -/* including simdjson/generic/ondemand/token_iterator-inl.h for arm64: #include "simdjson/generic/ondemand/token_iterator-inl.h" */ -/* begin file simdjson/generic/ondemand/token_iterator-inl.h for arm64 */ +#endif // SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_INL_H +/* end file simdjson/generic/ondemand/raw_json_string-inl.h for fallback */ +/* including simdjson/generic/ondemand/token_iterator-inl.h for fallback: #include "simdjson/generic/ondemand/token_iterator-inl.h" */ +/* begin file simdjson/generic/ondemand/token_iterator-inl.h for fallback */ #ifndef SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -45236,7 +85816,7 @@ inline std::ostream& operator<<(std::ostream& out, simdjson::arm64::ondemand::ob /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace arm64 { +namespace fallback { namespace ondemand { simdjson_inline token_iterator::token_iterator( @@ -45307,22 +85887,22 @@ simdjson_inline bool token_iterator::operator<=(const token_iterator &other) con } } // namespace ondemand -} // namespace arm64 +} // namespace fallback } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<arm64::ondemand::token_iterator>::simdjson_result(arm64::ondemand::token_iterator &&value) noexcept - : implementation_simdjson_result_base<arm64::ondemand::token_iterator>(std::forward<arm64::ondemand::token_iterator>(value)) {} -simdjson_inline simdjson_result<arm64::ondemand::token_iterator>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<arm64::ondemand::token_iterator>(error) {} +simdjson_inline simdjson_result<fallback::ondemand::token_iterator>::simdjson_result(fallback::ondemand::token_iterator &&value) noexcept + : implementation_simdjson_result_base<fallback::ondemand::token_iterator>(std::forward<fallback::ondemand::token_iterator>(value)) {} +simdjson_inline simdjson_result<fallback::ondemand::token_iterator>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<fallback::ondemand::token_iterator>(error) {} } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_INL_H -/* end file simdjson/generic/ondemand/token_iterator-inl.h for arm64 */ -/* including simdjson/generic/ondemand/value_iterator-inl.h for arm64: #include "simdjson/generic/ondemand/value_iterator-inl.h" */ -/* begin file simdjson/generic/ondemand/value_iterator-inl.h for arm64 */ +/* end file simdjson/generic/ondemand/token_iterator-inl.h for fallback */ +/* including simdjson/generic/ondemand/value_iterator-inl.h for fallback: #include "simdjson/generic/ondemand/value_iterator-inl.h" */ +/* begin file simdjson/generic/ondemand/value_iterator-inl.h for fallback */ #ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -45337,7 +85917,7 @@ simdjson_inline simdjson_result<arm64::ondemand::token_iterator>::simdjson_resul /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace arm64 { +namespace fallback { namespace ondemand { simdjson_inline value_iterator::value_iterator( @@ -45419,7 +85999,6 @@ simdjson_warn_unused simdjson_inline error_code value_iterator::end_container() simdjson_warn_unused simdjson_inline simdjson_result<bool> value_iterator::has_next_field() noexcept { assert_at_next(); - // It's illegal to call this unless there are more tokens: anything that ends in } or ] is // obligated to verify there are more tokens if they are not the top level. switch (*_json_iter->return_current_and_advance()) { @@ -45841,9 +86420,13 @@ simdjson_warn_unused simdjson_inline simdjson_result<std::string_view> value_ite template <typename string_type> simdjson_warn_unused simdjson_inline error_code value_iterator::get_string(string_type& receiver, bool allow_replacement) noexcept { std::string_view content; + // Save the string buffer location so that we can restore it after get_string + auto saved_string_buf_loc = _json_iter->string_buf_loc(); auto err = get_string(allow_replacement).get(content); if (err) { return err; } receiver = content; + // Restore the string buffer location, effectively discarding any temporary string storage + _json_iter->string_buf_loc() = saved_string_buf_loc; return SUCCESS; } simdjson_warn_unused simdjson_inline simdjson_result<std::string_view> value_iterator::get_wobbly_string() noexcept { @@ -45931,7 +86514,7 @@ simdjson_inline simdjson_result<bool> value_iterator::is_root_integer(bool check return answer; } -simdjson_inline simdjson_result<arm64::number_type> value_iterator::get_root_number_type(bool check_trailing) noexcept { +simdjson_inline simdjson_result<fallback::number_type> value_iterator::get_root_number_type(bool check_trailing) noexcept { auto max_len = peek_root_length(); auto json = peek_root_scalar("number"); // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/, @@ -45983,9 +86566,13 @@ simdjson_warn_unused simdjson_inline simdjson_result<std::string_view> value_ite template <typename string_type> simdjson_warn_unused simdjson_inline error_code value_iterator::get_root_string(string_type& receiver, bool check_trailing, bool allow_replacement) noexcept { std::string_view content; + // Save the string buffer location so that we can restore it after get_string + auto saved_string_buf_loc = _json_iter->string_buf_loc(); auto err = get_root_string(check_trailing, allow_replacement).get(content); if (err) { return err; } receiver = content; + // Restore the string buffer location, effectively discarding any temporary string storage + _json_iter->string_buf_loc() = saved_string_buf_loc; return SUCCESS; } simdjson_warn_unused simdjson_inline simdjson_result<std::string_view> value_iterator::get_root_wobbly_string(bool check_trailing) noexcept { @@ -46056,1467 +86643,617 @@ simdjson_warn_unused simdjson_inline simdjson_result<int64_t> value_iterator::ge logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 20 characters"); return NUMBER_ERROR; } - - auto result = numberparsing::parse_integer_in_string(tmpbuf); - if(result.error() == SUCCESS) { - if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } - advance_root_scalar("int64"); - } - return result; -} -simdjson_warn_unused simdjson_inline simdjson_result<double> value_iterator::get_root_double(bool check_trailing) noexcept { - auto max_len = peek_root_length(); - auto json = peek_root_scalar("double"); - // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/, - // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest - // number: -0.<fraction>e-308. - uint8_t tmpbuf[1074+8+1+1]; // +1 for null termination. - tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated. - if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) { - logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters"); - return NUMBER_ERROR; - } - auto result = numberparsing::parse_double(tmpbuf); - if(result.error() == SUCCESS) { - if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } - advance_root_scalar("double"); - } - return result; -} - -simdjson_warn_unused simdjson_inline simdjson_result<double> value_iterator::get_root_double_in_string(bool check_trailing) noexcept { - auto max_len = peek_root_length(); - auto json = peek_root_scalar("double"); - // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/, - // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest - // number: -0.<fraction>e-308. - uint8_t tmpbuf[1074+8+1+1]; // +1 for null termination. - tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated. - if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) { - logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters"); - return NUMBER_ERROR; - } - auto result = numberparsing::parse_double_in_string(tmpbuf); - if(result.error() == SUCCESS) { - if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } - advance_root_scalar("double"); - } - return result; -} - -simdjson_warn_unused simdjson_inline simdjson_result<bool> value_iterator::get_root_bool(bool check_trailing) noexcept { - auto max_len = peek_root_length(); - auto json = peek_root_scalar("bool"); - // We have a boolean if we have either "true" or "false" and the next character is either - // a structural character or whitespace. We also check that the length is correct: - // "true" and "false" are 4 and 5 characters long, respectively. - bool value_true = (max_len >= 4 && !atomparsing::str4ncmp(json, "true") && - (max_len == 4 || jsoncharutils::is_structural_or_whitespace(json[4]))); - bool value_false = (max_len >= 5 && !atomparsing::str4ncmp(json, "false") && - (max_len == 5 || jsoncharutils::is_structural_or_whitespace(json[5]))); - if(value_true == false && value_false == false) { return incorrect_type_error("Not a boolean"); } - if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } - advance_root_scalar("bool"); - return value_true; -} - -simdjson_inline simdjson_result<bool> value_iterator::is_root_null(bool check_trailing) noexcept { - auto max_len = peek_root_length(); - auto json = peek_root_scalar("null"); - bool result = (max_len >= 4 && !atomparsing::str4ncmp(json, "null") && - (max_len == 4 || jsoncharutils::is_structural_or_whitespace(json[4]))); - if(result) { // we have something that looks like a null. - if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } - advance_root_scalar("null"); - } else if (json[0] == 'n') { - return incorrect_type_error("Not a null but starts with n"); - } - return result; -} - -simdjson_warn_unused simdjson_inline error_code value_iterator::skip_child() noexcept { - SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); - SIMDJSON_ASSUME( _json_iter->_depth >= _depth ); - - return _json_iter->skip_child(depth()); -} - -simdjson_inline value_iterator value_iterator::child() const noexcept { - assert_at_child(); - return { _json_iter, depth()+1, _json_iter->token.position() }; -} - -// GCC 7 warns when the first line of this function is inlined away into oblivion due to the caller -// relating depth and iterator depth, which is a desired effect. It does not happen if is_open is -// marked non-inline. -SIMDJSON_PUSH_DISABLE_WARNINGS -SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING -simdjson_inline bool value_iterator::is_open() const noexcept { - return _json_iter->depth() >= depth(); -} -SIMDJSON_POP_DISABLE_WARNINGS - -simdjson_inline bool value_iterator::at_end() const noexcept { - return _json_iter->at_end(); -} - -simdjson_inline bool value_iterator::at_start() const noexcept { - return _json_iter->token.position() == start_position(); -} - -simdjson_inline bool value_iterator::at_first_field() const noexcept { - SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); - return _json_iter->token.position() == start_position() + 1; -} - -simdjson_inline void value_iterator::abandon() noexcept { - _json_iter->abandon(); -} - -simdjson_warn_unused simdjson_inline depth_t value_iterator::depth() const noexcept { - return _depth; -} -simdjson_warn_unused simdjson_inline error_code value_iterator::error() const noexcept { - return _json_iter->error; -} -simdjson_warn_unused simdjson_inline uint8_t *&value_iterator::string_buf_loc() noexcept { - return _json_iter->string_buf_loc(); -} -simdjson_warn_unused simdjson_inline const json_iterator &value_iterator::json_iter() const noexcept { - return *_json_iter; -} -simdjson_warn_unused simdjson_inline json_iterator &value_iterator::json_iter() noexcept { - return *_json_iter; -} - -simdjson_inline const uint8_t *value_iterator::peek_start() const noexcept { - return _json_iter->peek(start_position()); -} -simdjson_inline uint32_t value_iterator::peek_start_length() const noexcept { - return _json_iter->peek_length(start_position()); -} -simdjson_inline uint32_t value_iterator::peek_root_length() const noexcept { - return _json_iter->peek_root_length(start_position()); -} - -simdjson_inline const uint8_t *value_iterator::peek_scalar(const char *type) noexcept { - logger::log_value(*_json_iter, start_position(), depth(), type); - // If we're not at the position anymore, we don't want to advance the cursor. - if (!is_at_start()) { return peek_start(); } - - // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value. - assert_at_start(); - return _json_iter->peek(); -} - -simdjson_inline void value_iterator::advance_scalar(const char *type) noexcept { - logger::log_value(*_json_iter, start_position(), depth(), type); - // If we're not at the position anymore, we don't want to advance the cursor. - if (!is_at_start()) { return; } - - // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value. - assert_at_start(); - _json_iter->return_current_and_advance(); - _json_iter->ascend_to(depth()-1); -} - -simdjson_warn_unused simdjson_inline error_code value_iterator::start_container(uint8_t start_char, const char *incorrect_type_message, const char *type) noexcept { - logger::log_start_value(*_json_iter, start_position(), depth(), type); - // If we're not at the position anymore, we don't want to advance the cursor. - const uint8_t *json; - if (!is_at_start()) { -#if SIMDJSON_DEVELOPMENT_CHECKS - if (!is_at_iterator_start()) { return OUT_OF_ORDER_ITERATION; } -#endif - json = peek_start(); - if (*json != start_char) { return incorrect_type_error(incorrect_type_message); } - } else { - assert_at_start(); - /** - * We should be prudent. Let us peek. If it is not the right type, we - * return an error. Only once we have determined that we have the right - * type are we allowed to advance! - */ - json = _json_iter->peek(); - if (*json != start_char) { return incorrect_type_error(incorrect_type_message); } - _json_iter->return_current_and_advance(); - } - - - return SUCCESS; -} - - -simdjson_inline const uint8_t *value_iterator::peek_root_scalar(const char *type) noexcept { - logger::log_value(*_json_iter, start_position(), depth(), type); - if (!is_at_start()) { return peek_start(); } - - assert_at_root(); - return _json_iter->peek(); -} -simdjson_inline const uint8_t *value_iterator::peek_non_root_scalar(const char *type) noexcept { - logger::log_value(*_json_iter, start_position(), depth(), type); - if (!is_at_start()) { return peek_start(); } - - assert_at_non_root_start(); - return _json_iter->peek(); -} - -simdjson_inline void value_iterator::advance_root_scalar(const char *type) noexcept { - logger::log_value(*_json_iter, start_position(), depth(), type); - if (!is_at_start()) { return; } - - assert_at_root(); - _json_iter->return_current_and_advance(); - _json_iter->ascend_to(depth()-1); -} -simdjson_inline void value_iterator::advance_non_root_scalar(const char *type) noexcept { - logger::log_value(*_json_iter, start_position(), depth(), type); - if (!is_at_start()) { return; } - - assert_at_non_root_start(); - _json_iter->return_current_and_advance(); - _json_iter->ascend_to(depth()-1); -} - -simdjson_inline error_code value_iterator::incorrect_type_error(const char *message) const noexcept { - logger::log_error(*_json_iter, start_position(), depth(), message); - return INCORRECT_TYPE; -} - -simdjson_inline bool value_iterator::is_at_start() const noexcept { - return position() == start_position(); -} - -simdjson_inline bool value_iterator::is_at_key() const noexcept { - // Keys are at the same depth as the object. - // Note here that we could be safer and check that we are within an object, - // but we do not. - return _depth == _json_iter->_depth && *_json_iter->peek() == '"'; -} - -simdjson_inline bool value_iterator::is_at_iterator_start() const noexcept { - // We can legitimately be either at the first value ([1]), or after the array if it's empty ([]). - auto delta = position() - start_position(); - return delta == 1 || delta == 2; -} - -inline void value_iterator::assert_at_start() const noexcept { - SIMDJSON_ASSUME( _json_iter->token._position == _start_position ); - SIMDJSON_ASSUME( _json_iter->_depth == _depth ); - SIMDJSON_ASSUME( _depth > 0 ); -} - -inline void value_iterator::assert_at_container_start() const noexcept { - SIMDJSON_ASSUME( _json_iter->token._position == _start_position + 1 ); - SIMDJSON_ASSUME( _json_iter->_depth == _depth ); - SIMDJSON_ASSUME( _depth > 0 ); -} - -inline void value_iterator::assert_at_next() const noexcept { - SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); - SIMDJSON_ASSUME( _json_iter->_depth == _depth ); - SIMDJSON_ASSUME( _depth > 0 ); -} - -simdjson_inline void value_iterator::move_at_start() noexcept { - _json_iter->_depth = _depth; - _json_iter->token.set_position(_start_position); -} - -simdjson_inline void value_iterator::move_at_container_start() noexcept { - _json_iter->_depth = _depth; - _json_iter->token.set_position(_start_position + 1); -} - -simdjson_inline simdjson_result<bool> value_iterator::reset_array() noexcept { - if(error()) { return error(); } - move_at_container_start(); - return started_array(); -} - -simdjson_inline simdjson_result<bool> value_iterator::reset_object() noexcept { - if(error()) { return error(); } - move_at_container_start(); - return started_object(); -} - -inline void value_iterator::assert_at_child() const noexcept { - SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); - SIMDJSON_ASSUME( _json_iter->_depth == _depth + 1 ); - SIMDJSON_ASSUME( _depth > 0 ); -} - -inline void value_iterator::assert_at_root() const noexcept { - assert_at_start(); - SIMDJSON_ASSUME( _depth == 1 ); -} - -inline void value_iterator::assert_at_non_root_start() const noexcept { - assert_at_start(); - SIMDJSON_ASSUME( _depth > 1 ); -} - -inline void value_iterator::assert_is_valid() const noexcept { - SIMDJSON_ASSUME( _json_iter != nullptr ); -} - -simdjson_inline bool value_iterator::is_valid() const noexcept { - return _json_iter != nullptr; -} - -simdjson_inline simdjson_result<json_type> value_iterator::type() const noexcept { - switch (*peek_start()) { - case '{': - return json_type::object; - case '[': - return json_type::array; - case '"': - return json_type::string; - case 'n': - return json_type::null; - case 't': case 'f': - return json_type::boolean; - case '-': - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - return json_type::number; - default: - return json_type::unknown; - } -} - -simdjson_inline token_position value_iterator::start_position() const noexcept { - return _start_position; -} - -simdjson_inline token_position value_iterator::position() const noexcept { - return _json_iter->position(); -} - -simdjson_inline token_position value_iterator::end_position() const noexcept { - return _json_iter->end_position(); -} - -simdjson_inline token_position value_iterator::last_position() const noexcept { - return _json_iter->last_position(); -} - -simdjson_inline error_code value_iterator::report_error(error_code error, const char *message) noexcept { - return _json_iter->report_error(error, message); -} - -} // namespace ondemand -} // namespace arm64 -} // namespace simdjson - -namespace simdjson { - -simdjson_inline simdjson_result<arm64::ondemand::value_iterator>::simdjson_result(arm64::ondemand::value_iterator &&value) noexcept - : implementation_simdjson_result_base<arm64::ondemand::value_iterator>(std::forward<arm64::ondemand::value_iterator>(value)) {} -simdjson_inline simdjson_result<arm64::ondemand::value_iterator>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<arm64::ondemand::value_iterator>(error) {} - -} // namespace simdjson - -#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H -/* end file simdjson/generic/ondemand/value_iterator-inl.h for arm64 */ - -// JSON builder inline definitions -/* including simdjson/generic/ondemand/json_string_builder-inl.h for arm64: #include "simdjson/generic/ondemand/json_string_builder-inl.h" */ -/* begin file simdjson/generic/ondemand/json_string_builder-inl.h for arm64 */ -/** - * This file is part of the builder API. It is temporarily in the ondemand - * directory but we will move it to a builder directory later. - */ -#include <array> -#include <cstring> -#include <type_traits> -#ifndef SIMDJSON_GENERIC_STRING_BUILDER_INL_H - -/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_INL_H */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_string_builder.h" */ -/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ - -/* - * Empirically, we have found that an inlined optimization is important for - * performance. The following macros are not ideal. We should find a better - * way to inline the code. - */ - -#if defined(__SSE2__) || defined(__x86_64__) || defined(__x86_64) || \ - (defined(_M_AMD64) || defined(_M_X64) || \ - (defined(_M_IX86_FP) && _M_IX86_FP == 2)) -#ifndef SIMDJSON_EXPERIMENTAL_HAS_SSE2 -#define SIMDJSON_EXPERIMENTAL_HAS_SSE2 1 -#endif -#endif - -#if defined(__aarch64__) || defined(_M_ARM64) -#ifndef SIMDJSON_EXPERIMENTAL_HAS_NEON -#define SIMDJSON_EXPERIMENTAL_HAS_NEON 1 -#endif -#endif -#if SIMDJSON_EXPERIMENTAL_HAS_NEON -#include <arm_neon.h> -#endif -#if SIMDJSON_EXPERIMENTAL_HAS_SSE2 -#include <emmintrin.h> -#endif - -namespace simdjson { -namespace arm64 { -namespace builder { - -static SIMDJSON_CONSTEXPR_LAMBDA std::array<uint8_t, 256> - json_quotable_character = { - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - -/** - -A possible SWAR implementation of has_json_escapable_byte. It is not used -because it is slower than the current implementation. It is kept here for -reference (to show that we tried it). - -inline bool has_json_escapable_byte(uint64_t x) { - uint64_t is_ascii = 0x8080808080808080ULL & ~x; - uint64_t xor2 = x ^ 0x0202020202020202ULL; - uint64_t lt32_or_eq34 = xor2 - 0x2121212121212121ULL; - uint64_t sub92 = x ^ 0x5C5C5C5C5C5C5C5CULL; - uint64_t eq92 = (sub92 - 0x0101010101010101ULL); - return ((lt32_or_eq34 | eq92) & is_ascii) != 0; -} - -**/ - -SIMDJSON_CONSTEXPR_LAMBDA simdjson_inline bool -simple_needs_escaping(std::string_view v) { - for (char c : v) { - // a table lookup is faster than a series of comparisons - if (json_quotable_character[static_cast<uint8_t>(c)]) { - return true; - } - } - return false; -} - -#if SIMDJSON_EXPERIMENTAL_HAS_NEON -simdjson_inline bool fast_needs_escaping(std::string_view view) { - if (view.size() < 16) { - return simple_needs_escaping(view); - } - size_t i = 0; - uint8x16_t running = vdupq_n_u8(0); - uint8x16_t v34 = vdupq_n_u8(34); - uint8x16_t v92 = vdupq_n_u8(92); - - for (; i + 15 < view.size(); i += 16) { - uint8x16_t word = vld1q_u8((const uint8_t *)view.data() + i); - running = vorrq_u8(running, vceqq_u8(word, v34)); - running = vorrq_u8(running, vceqq_u8(word, v92)); - running = vorrq_u8(running, vcltq_u8(word, vdupq_n_u8(32))); - } - if (i < view.size()) { - uint8x16_t word = - vld1q_u8((const uint8_t *)view.data() + view.length() - 16); - running = vorrq_u8(running, vceqq_u8(word, v34)); - running = vorrq_u8(running, vceqq_u8(word, v92)); - running = vorrq_u8(running, vcltq_u8(word, vdupq_n_u8(32))); - } - return vmaxvq_u32(vreinterpretq_u32_u8(running)) != 0; -} -#elif SIMDJSON_EXPERIMENTAL_HAS_SSE2 -simdjson_inline bool fast_needs_escaping(std::string_view view) { - if (view.size() < 16) { - return simple_needs_escaping(view); - } - size_t i = 0; - __m128i running = _mm_setzero_si128(); - for (; i + 15 < view.size(); i += 16) { - - __m128i word = - _mm_loadu_si128(reinterpret_cast<const __m128i *>(view.data() + i)); - running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(34))); - running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(92))); - running = _mm_or_si128( - running, _mm_cmpeq_epi8(_mm_subs_epu8(word, _mm_set1_epi8(31)), - _mm_setzero_si128())); - } - if (i < view.size()) { - __m128i word = _mm_loadu_si128( - reinterpret_cast<const __m128i *>(view.data() + view.length() - 16)); - running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(34))); - running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(92))); - running = _mm_or_si128( - running, _mm_cmpeq_epi8(_mm_subs_epu8(word, _mm_set1_epi8(31)), - _mm_setzero_si128())); - } - return _mm_movemask_epi8(running) != 0; -} -#else -simdjson_inline bool fast_needs_escaping(std::string_view view) { - return simple_needs_escaping(view); -} -#endif - -SIMDJSON_CONSTEXPR_LAMBDA inline size_t -find_next_json_quotable_character(const std::string_view view, - size_t location) noexcept { - - for (auto pos = view.begin() + location; pos != view.end(); ++pos) { - if (json_quotable_character[static_cast<uint8_t>(*pos)]) { - return pos - view.begin(); - } - } - return size_t(view.size()); -} - -SIMDJSON_CONSTEXPR_LAMBDA static std::string_view control_chars[] = { - "\\u0000", "\\u0001", "\\u0002", "\\u0003", "\\u0004", "\\u0005", "\\u0006", - "\\u0007", "\\b", "\\t", "\\n", "\\u000b", "\\f", "\\r", - "\\u000e", "\\u000f", "\\u0010", "\\u0011", "\\u0012", "\\u0013", "\\u0014", - "\\u0015", "\\u0016", "\\u0017", "\\u0018", "\\u0019", "\\u001a", "\\u001b", - "\\u001c", "\\u001d", "\\u001e", "\\u001f"}; - -// All Unicode characters may be placed within the quotation marks, except for -// the characters that MUST be escaped: quotation mark, reverse solidus, and the -// control characters (U+0000 through U+001F). There are two-character sequence -// escape representations of some popular characters: -// \", \\, \b, \f, \n, \r, \t. -SIMDJSON_CONSTEXPR_LAMBDA void escape_json_char(char c, char *&out) { - if (c == '"') { - memcpy(out, "\\\"", 2); - out += 2; - } else if (c == '\\') { - memcpy(out, "\\\\", 2); - out += 2; - } else { - std::string_view v = control_chars[uint8_t(c)]; - memcpy(out, v.data(), v.size()); - out += v.size(); - } -} - -inline size_t write_string_escaped(const std::string_view input, char *out) { - size_t mysize = input.size(); - if (!fast_needs_escaping(input)) { // fast path! - memcpy(out, input.data(), input.size()); - return input.size(); - } - const char *const initout = out; - size_t location = find_next_json_quotable_character(input, 0); - memcpy(out, input.data(), location); - out += location; - escape_json_char(input[location], out); - location += 1; - while (location < mysize) { - size_t newlocation = find_next_json_quotable_character(input, location); - memcpy(out, input.data() + location, newlocation - location); - out += newlocation - location; - location = newlocation; - if (location == mysize) { - break; - } - escape_json_char(input[location], out); - location += 1; - } - return out - initout; -} - -simdjson_inline string_builder::string_builder(size_t initial_capacity) - : buffer(new(std::nothrow) char[initial_capacity]), position(0), - capacity(buffer.get() != nullptr ? initial_capacity : 0), - is_valid(buffer.get() != nullptr) {} - -simdjson_inline bool string_builder::capacity_check(size_t upcoming_bytes) { - // We use the convention that when is_valid is false, then the capacity and - // the position are 0. - // Most of the time, this function will return true. - if (simdjson_likely(upcoming_bytes <= capacity - position)) { - return true; - } - // check for overflow, most of the time there is no overflow - if (simdjson_likely(position + upcoming_bytes < position)) { - return false; - } - // We will rarely get here. - grow_buffer((std::max)(capacity * 2, position + upcoming_bytes)); - // If the buffer allocation failed, we set is_valid to false. - return is_valid; -} - -simdjson_inline void string_builder::grow_buffer(size_t desired_capacity) { - if (!is_valid) { - return; - } - std::unique_ptr<char[]> new_buffer(new (std::nothrow) char[desired_capacity]); - if (new_buffer.get() == nullptr) { - set_valid(false); - return; - } - std::memcpy(new_buffer.get(), buffer.get(), position); - buffer.swap(new_buffer); - capacity = desired_capacity; -} - -simdjson_inline void string_builder::set_valid(bool valid) noexcept { - if (!valid) { - is_valid = false; - capacity = 0; - position = 0; - buffer.reset(); - } else { - is_valid = true; - } -} - -simdjson_inline size_t string_builder::size() const noexcept { - return position; -} - -simdjson_inline void string_builder::append(char c) noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = c; - } -} - -simdjson_inline void string_builder::append_null() noexcept { - constexpr char null_literal[] = "null"; - constexpr size_t null_len = sizeof(null_literal) - 1; - if (capacity_check(null_len)) { - std::memcpy(buffer.get() + position, null_literal, null_len); - position += null_len; - } -} - -simdjson_inline void string_builder::clear() noexcept { - position = 0; - // if it was invalid, we should try to repair it - if (!is_valid) { - capacity = 0; - buffer.reset(); - is_valid = true; - } -} - -namespace internal { - -template <typename number_type, typename = typename std::enable_if< - std::is_unsigned<number_type>::value>::type> -simdjson_really_inline int int_log2(number_type x) { - return 63 - leading_zeroes(uint64_t(x) | 1); -} - -simdjson_really_inline int fast_digit_count_32(uint32_t x) { - static uint64_t table[] = { - 4294967296, 8589934582, 8589934582, 8589934582, 12884901788, - 12884901788, 12884901788, 17179868184, 17179868184, 17179868184, - 21474826480, 21474826480, 21474826480, 21474826480, 25769703776, - 25769703776, 25769703776, 30063771072, 30063771072, 30063771072, - 34349738368, 34349738368, 34349738368, 34349738368, 38554705664, - 38554705664, 38554705664, 41949672960, 41949672960, 41949672960, - 42949672960, 42949672960}; - return uint32_t((x + table[int_log2(x)]) >> 32); -} - -simdjson_really_inline int fast_digit_count_64(uint64_t x) { - static uint64_t table[] = {9, - 99, - 999, - 9999, - 99999, - 999999, - 9999999, - 99999999, - 999999999, - 9999999999, - 99999999999, - 999999999999, - 9999999999999, - 99999999999999, - 999999999999999ULL, - 9999999999999999ULL, - 99999999999999999ULL, - 999999999999999999ULL, - 9999999999999999999ULL}; - int y = (19 * int_log2(x) >> 6); - y += x > table[y]; - return y + 1; -} - -template <typename number_type, typename = typename std::enable_if< - std::is_unsigned<number_type>::value>::type> -simdjson_really_inline size_t digit_count(number_type v) noexcept { - static_assert(sizeof(number_type) == 8 || sizeof(number_type) == 4 || - sizeof(number_type) == 2 || sizeof(number_type) == 1, - "We only support 8-bit, 16-bit, 32-bit and 64-bit numbers"); - SIMDJSON_IF_CONSTEXPR(sizeof(number_type) <= 4) { - return fast_digit_count_32(static_cast<uint32_t>(v)); - } - else { - return fast_digit_count_64(static_cast<uint64_t>(v)); - } -} -static const char decimal_table[200] = { - 0x30, 0x30, 0x30, 0x31, 0x30, 0x32, 0x30, 0x33, 0x30, 0x34, 0x30, 0x35, - 0x30, 0x36, 0x30, 0x37, 0x30, 0x38, 0x30, 0x39, 0x31, 0x30, 0x31, 0x31, - 0x31, 0x32, 0x31, 0x33, 0x31, 0x34, 0x31, 0x35, 0x31, 0x36, 0x31, 0x37, - 0x31, 0x38, 0x31, 0x39, 0x32, 0x30, 0x32, 0x31, 0x32, 0x32, 0x32, 0x33, - 0x32, 0x34, 0x32, 0x35, 0x32, 0x36, 0x32, 0x37, 0x32, 0x38, 0x32, 0x39, - 0x33, 0x30, 0x33, 0x31, 0x33, 0x32, 0x33, 0x33, 0x33, 0x34, 0x33, 0x35, - 0x33, 0x36, 0x33, 0x37, 0x33, 0x38, 0x33, 0x39, 0x34, 0x30, 0x34, 0x31, - 0x34, 0x32, 0x34, 0x33, 0x34, 0x34, 0x34, 0x35, 0x34, 0x36, 0x34, 0x37, - 0x34, 0x38, 0x34, 0x39, 0x35, 0x30, 0x35, 0x31, 0x35, 0x32, 0x35, 0x33, - 0x35, 0x34, 0x35, 0x35, 0x35, 0x36, 0x35, 0x37, 0x35, 0x38, 0x35, 0x39, - 0x36, 0x30, 0x36, 0x31, 0x36, 0x32, 0x36, 0x33, 0x36, 0x34, 0x36, 0x35, - 0x36, 0x36, 0x36, 0x37, 0x36, 0x38, 0x36, 0x39, 0x37, 0x30, 0x37, 0x31, - 0x37, 0x32, 0x37, 0x33, 0x37, 0x34, 0x37, 0x35, 0x37, 0x36, 0x37, 0x37, - 0x37, 0x38, 0x37, 0x39, 0x38, 0x30, 0x38, 0x31, 0x38, 0x32, 0x38, 0x33, - 0x38, 0x34, 0x38, 0x35, 0x38, 0x36, 0x38, 0x37, 0x38, 0x38, 0x38, 0x39, - 0x39, 0x30, 0x39, 0x31, 0x39, 0x32, 0x39, 0x33, 0x39, 0x34, 0x39, 0x35, - 0x39, 0x36, 0x39, 0x37, 0x39, 0x38, 0x39, 0x39, -}; -} // namespace internal - -template <typename number_type, typename> -simdjson_inline void string_builder::append(number_type v) noexcept { - static_assert(std::is_same<number_type, bool>::value || - std::is_integral<number_type>::value || - std::is_floating_point<number_type>::value, - "Unsupported number type"); - // If C++17 is available, we can 'if constexpr' here. - SIMDJSON_IF_CONSTEXPR(std::is_same<number_type, bool>::value) { - if (v) { - constexpr char true_literal[] = "true"; - constexpr size_t true_len = sizeof(true_literal) - 1; - if (capacity_check(true_len)) { - std::memcpy(buffer.get() + position, true_literal, true_len); - position += true_len; - } - } else { - constexpr char false_literal[] = "false"; - constexpr size_t false_len = sizeof(false_literal) - 1; - if (capacity_check(false_len)) { - std::memcpy(buffer.get() + position, false_literal, false_len); - position += false_len; - } - } - } - else SIMDJSON_IF_CONSTEXPR(std::is_unsigned<number_type>::value) { - constexpr size_t max_number_size = 20; - if (capacity_check(max_number_size)) { - using unsigned_type = typename std::make_unsigned<number_type>::type; - unsigned_type pv = static_cast<unsigned_type>(v); - size_t dc = internal::digit_count(pv); - char *write_pointer = buffer.get() + position + dc - 1; - while (pv >= 100) { - memcpy(write_pointer - 1, &internal::decimal_table[(pv % 100) * 2], 2); - write_pointer -= 2; - pv /= 100; - } - if (pv >= 10) { - *write_pointer-- = char('0' + (pv % 10)); - pv /= 10; - } - *write_pointer = char('0' + pv); - position += dc; - } - } - else SIMDJSON_IF_CONSTEXPR(std::is_integral<number_type>::value) { - constexpr size_t max_number_size = 20; - if (capacity_check(max_number_size)) { - using unsigned_type = typename std::make_unsigned<number_type>::type; - bool negative = v < 0; - unsigned_type pv = static_cast<unsigned_type>(v); - if (negative) { - pv = 0 - pv; // the 0 is for Microsoft - } - size_t dc = internal::digit_count(pv); - // by always writing the minus sign, we avoid the branch. - buffer.get()[position] = '-'; - position += negative ? 1 : 0; - char *write_pointer = buffer.get() + position + dc - 1; - while (pv >= 100) { - memcpy(write_pointer - 1, &internal::decimal_table[(pv % 100) * 2], 2); - write_pointer -= 2; - pv /= 100; - } - if (pv >= 10) { - *write_pointer-- = char('0' + (pv % 10)); - pv /= 10; - } - *write_pointer = char('0' + pv); - position += dc; - } + + auto result = numberparsing::parse_integer_in_string(tmpbuf); + if(result.error() == SUCCESS) { + if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } + advance_root_scalar("int64"); } - else SIMDJSON_IF_CONSTEXPR(std::is_floating_point<number_type>::value) { - constexpr size_t max_number_size = 24; - if (capacity_check(max_number_size)) { - // We could specialize for float. - char *end = simdjson::internal::to_chars(buffer.get() + position, nullptr, - double(v)); - position = end - buffer.get(); - } + return result; +} +simdjson_warn_unused simdjson_inline simdjson_result<double> value_iterator::get_root_double(bool check_trailing) noexcept { + auto max_len = peek_root_length(); + auto json = peek_root_scalar("double"); + // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/, + // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest + // number: -0.<fraction>e-308. + uint8_t tmpbuf[1074+8+1+1]; // +1 for null termination. + tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated. + if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) { + logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters"); + return NUMBER_ERROR; + } + auto result = numberparsing::parse_double(tmpbuf); + if(result.error() == SUCCESS) { + if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } + advance_root_scalar("double"); } + return result; } -simdjson_inline void -string_builder::escape_and_append(std::string_view input) noexcept { - // escaping might turn a control character into \x00xx so 6 characters. - if (capacity_check(6 * input.size())) { - position += write_string_escaped(input, buffer.get() + position); +simdjson_warn_unused simdjson_inline simdjson_result<double> value_iterator::get_root_double_in_string(bool check_trailing) noexcept { + auto max_len = peek_root_length(); + auto json = peek_root_scalar("double"); + // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/, + // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest + // number: -0.<fraction>e-308. + uint8_t tmpbuf[1074+8+1+1]; // +1 for null termination. + tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated. + if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) { + logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters"); + return NUMBER_ERROR; } + auto result = numberparsing::parse_double_in_string(tmpbuf); + if(result.error() == SUCCESS) { + if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } + advance_root_scalar("double"); + } + return result; } -simdjson_inline void -string_builder::escape_and_append_with_quotes(std::string_view input) noexcept { - // escaping might turn a control character into \x00xx so 6 characters. - if (capacity_check(2 + 6 * input.size())) { - buffer.get()[position++] = '"'; - position += write_string_escaped(input, buffer.get() + position); - buffer.get()[position++] = '"'; - } +simdjson_warn_unused simdjson_inline simdjson_result<bool> value_iterator::get_root_bool(bool check_trailing) noexcept { + auto max_len = peek_root_length(); + auto json = peek_root_scalar("bool"); + // We have a boolean if we have either "true" or "false" and the next character is either + // a structural character or whitespace. We also check that the length is correct: + // "true" and "false" are 4 and 5 characters long, respectively. + bool value_true = (max_len >= 4 && !atomparsing::str4ncmp(json, "true") && + (max_len == 4 || jsoncharutils::is_structural_or_whitespace(json[4]))); + bool value_false = (max_len >= 5 && !atomparsing::str4ncmp(json, "false") && + (max_len == 5 || jsoncharutils::is_structural_or_whitespace(json[5]))); + if(value_true == false && value_false == false) { return incorrect_type_error("Not a boolean"); } + if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } + advance_root_scalar("bool"); + return value_true; } -simdjson_inline void -string_builder::escape_and_append_with_quotes(char input) noexcept { - // escaping might turn a control character into \x00xx so 6 characters. - if (capacity_check(2 + 6 * 1)) { - buffer.get()[position++] = '"'; - std::string_view cinput(&input, 1); - position += write_string_escaped(cinput, buffer.get() + position); - buffer.get()[position++] = '"'; +simdjson_inline simdjson_result<bool> value_iterator::is_root_null(bool check_trailing) noexcept { + auto max_len = peek_root_length(); + auto json = peek_root_scalar("null"); + bool result = (max_len >= 4 && !atomparsing::str4ncmp(json, "null") && + (max_len == 4 || jsoncharutils::is_structural_or_whitespace(json[4]))); + if(result) { // we have something that looks like a null. + if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } + advance_root_scalar("null"); + } else if (json[0] == 'n') { + return incorrect_type_error("Not a null but starts with n"); } + return result; } -simdjson_inline void -string_builder::escape_and_append_with_quotes(const char *input) noexcept { - std::string_view cinput(input); - escape_and_append_with_quotes(cinput); +simdjson_warn_unused simdjson_inline error_code value_iterator::skip_child() noexcept { + SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); + SIMDJSON_ASSUME( _json_iter->_depth >= _depth ); + + return _json_iter->skip_child(depth()); } -#if SIMDJSON_SUPPORTS_CONCEPTS -template <constevalutil::fixed_string key> -simdjson_inline void string_builder::escape_and_append_with_quotes() noexcept { - escape_and_append_with_quotes(constevalutil::string_constant<key>::value); + +simdjson_inline value_iterator value_iterator::child() const noexcept { + assert_at_child(); + return { _json_iter, depth()+1, _json_iter->token.position() }; } -#endif -simdjson_inline void string_builder::append_raw(const char *c) noexcept { - size_t len = std::strlen(c); - append_raw(c, len); +// GCC 7 warns when the first line of this function is inlined away into oblivion due to the caller +// relating depth and iterator depth, which is a desired effect. It does not happen if is_open is +// marked non-inline. +SIMDJSON_PUSH_DISABLE_WARNINGS +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING +simdjson_inline bool value_iterator::is_open() const noexcept { + return _json_iter->depth() >= depth(); } +SIMDJSON_POP_DISABLE_WARNINGS -simdjson_inline void -string_builder::append_raw(std::string_view input) noexcept { - if (capacity_check(input.size())) { - std::memcpy(buffer.get() + position, input.data(), input.size()); - position += input.size(); - } +simdjson_inline bool value_iterator::at_end() const noexcept { + return _json_iter->at_end(); } -simdjson_inline void string_builder::append_raw(const char *str, - size_t len) noexcept { - if (capacity_check(len)) { - std::memcpy(buffer.get() + position, str, len); - position += len; - } +simdjson_inline bool value_iterator::at_start() const noexcept { + return _json_iter->token.position() == start_position(); } -#if SIMDJSON_SUPPORTS_CONCEPTS -// Support for optional types (std::optional, etc.) -template <concepts::optional_type T> - requires(!require_custom_serialization<T>) -simdjson_inline void string_builder::append(const T &opt) { - if (opt) { - append(*opt); - } else { - append_null(); - } + +simdjson_inline bool value_iterator::at_first_field() const noexcept { + SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); + return _json_iter->token.position() == start_position() + 1; } -template <typename T> - requires(require_custom_serialization<T>) -simdjson_inline void string_builder::append(T &&val) { - serialize(*this, std::forward<T>(val)); +simdjson_inline void value_iterator::abandon() noexcept { + _json_iter->abandon(); } -template <typename T> - requires(std::is_convertible<T, std::string_view>::value || - std::is_same<T, const char *>::value) -simdjson_inline void string_builder::append(const T &value) { - escape_and_append_with_quotes(value); +simdjson_warn_unused simdjson_inline depth_t value_iterator::depth() const noexcept { + return _depth; +} +simdjson_warn_unused simdjson_inline error_code value_iterator::error() const noexcept { + return _json_iter->error; +} +simdjson_warn_unused simdjson_inline uint8_t *&value_iterator::string_buf_loc() noexcept { + return _json_iter->string_buf_loc(); +} +simdjson_warn_unused simdjson_inline const json_iterator &value_iterator::json_iter() const noexcept { + return *_json_iter; +} +simdjson_warn_unused simdjson_inline json_iterator &value_iterator::json_iter() noexcept { + return *_json_iter; } -#endif -#if SIMDJSON_SUPPORTS_RANGES && SIMDJSON_SUPPORTS_CONCEPTS -// Support for range-based appending (std::ranges::view, etc.) -template <std::ranges::range R> - requires(!std::is_convertible<R, std::string_view>::value && !require_custom_serialization<R>) -simdjson_inline void string_builder::append(const R &range) noexcept { - auto it = std::ranges::begin(range); - auto end = std::ranges::end(range); - if constexpr (concepts::is_pair<std::ranges::range_value_t<R>>) { - start_object(); +simdjson_inline const uint8_t *value_iterator::peek_start() const noexcept { + return _json_iter->peek(start_position()); +} +simdjson_inline uint32_t value_iterator::peek_start_length() const noexcept { + return _json_iter->peek_length(start_position()); +} +simdjson_inline uint32_t value_iterator::peek_root_length() const noexcept { + return _json_iter->peek_root_length(start_position()); +} - if (it == end) { - end_object(); - return; // Handle empty range - } - // Append first item without leading comma - append_key_value(it->first, it->second); - ++it; +simdjson_inline const uint8_t *value_iterator::peek_scalar(const char *type) noexcept { + logger::log_value(*_json_iter, start_position(), depth(), type); + // If we're not at the position anymore, we don't want to advance the cursor. + if (!is_at_start()) { return peek_start(); } - // Append remaining items with preceding commas - for (; it != end; ++it) { - append_comma(); - append_key_value(it->first, it->second); - } - end_object(); - } else { - start_array(); - if (it == end) { - end_array(); - return; // Handle empty range - } + // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value. + assert_at_start(); + return _json_iter->peek(); +} - // Append first item without leading comma - append(*it); - ++it; +simdjson_inline void value_iterator::advance_scalar(const char *type) noexcept { + logger::log_value(*_json_iter, start_position(), depth(), type); + // If we're not at the position anymore, we don't want to advance the cursor. + if (!is_at_start()) { return; } - // Append remaining items with preceding commas - for (; it != end; ++it) { - append_comma(); - append(*it); - } - end_array(); - } + // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value. + assert_at_start(); + _json_iter->return_current_and_advance(); + _json_iter->ascend_to(depth()-1); } +simdjson_warn_unused simdjson_inline error_code value_iterator::start_container(uint8_t start_char, const char *incorrect_type_message, const char *type) noexcept { + logger::log_start_value(*_json_iter, start_position(), depth(), type); + // If we're not at the position anymore, we don't want to advance the cursor. + const uint8_t *json; + if (!is_at_start()) { +#if SIMDJSON_DEVELOPMENT_CHECKS + if (!is_at_iterator_start()) { return OUT_OF_ORDER_ITERATION; } #endif + json = peek_start(); + if (*json != start_char) { return incorrect_type_error(incorrect_type_message); } + } else { + assert_at_start(); + /** + * We should be prudent. Let us peek. If it is not the right type, we + * return an error. Only once we have determined that we have the right + * type are we allowed to advance! + */ + json = _json_iter->peek(); + if (*json != start_char) { return incorrect_type_error(incorrect_type_message); } + _json_iter->return_current_and_advance(); + } -#if SIMDJSON_EXCEPTIONS -simdjson_inline string_builder::operator std::string() const noexcept(false) { - return std::string(operator std::string_view()); -} -simdjson_inline string_builder::operator std::string_view() const - noexcept(false) simdjson_lifetime_bound { - return view(); + return SUCCESS; } -#endif -simdjson_inline simdjson_result<std::string_view> -string_builder::view() const noexcept { - if (!is_valid) { - return simdjson::OUT_OF_CAPACITY; - } - return std::string_view(buffer.get(), position); -} -simdjson_inline simdjson_result<const char *> string_builder::c_str() noexcept { - if (capacity_check(1)) { - buffer.get()[position] = '\0'; - return buffer.get(); - } - return simdjson::OUT_OF_CAPACITY; -} +simdjson_inline const uint8_t *value_iterator::peek_root_scalar(const char *type) noexcept { + logger::log_value(*_json_iter, start_position(), depth(), type); + if (!is_at_start()) { return peek_start(); } -simdjson_inline bool string_builder::validate_unicode() const noexcept { - return simdjson::validate_utf8(buffer.get(), position); + assert_at_root(); + return _json_iter->peek(); } +simdjson_inline const uint8_t *value_iterator::peek_non_root_scalar(const char *type) noexcept { + logger::log_value(*_json_iter, start_position(), depth(), type); + if (!is_at_start()) { return peek_start(); } -simdjson_inline void string_builder::start_object() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = '{'; - } + assert_at_non_root_start(); + return _json_iter->peek(); } -simdjson_inline void string_builder::end_object() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = '}'; - } -} +simdjson_inline void value_iterator::advance_root_scalar(const char *type) noexcept { + logger::log_value(*_json_iter, start_position(), depth(), type); + if (!is_at_start()) { return; } -simdjson_inline void string_builder::start_array() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = '['; - } + assert_at_root(); + _json_iter->return_current_and_advance(); + _json_iter->ascend_to(depth()-1); } +simdjson_inline void value_iterator::advance_non_root_scalar(const char *type) noexcept { + logger::log_value(*_json_iter, start_position(), depth(), type); + if (!is_at_start()) { return; } -simdjson_inline void string_builder::end_array() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = ']'; - } + assert_at_non_root_start(); + _json_iter->return_current_and_advance(); + _json_iter->ascend_to(depth()-1); } -simdjson_inline void string_builder::append_comma() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = ','; - } +simdjson_inline error_code value_iterator::incorrect_type_error(const char *message) const noexcept { + logger::log_error(*_json_iter, start_position(), depth(), message); + return INCORRECT_TYPE; } -simdjson_inline void string_builder::append_colon() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = ':'; - } +simdjson_inline bool value_iterator::is_at_start() const noexcept { + return position() == start_position(); } -template <typename key_type, typename value_type> -simdjson_inline void -string_builder::append_key_value(key_type key, value_type value) noexcept { - static_assert(std::is_same<key_type, const char *>::value || - std::is_convertible<key_type, std::string_view>::value, - "Unsupported key type"); - escape_and_append_with_quotes(key); - append_colon(); - SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, std::nullptr_t>::value) { - append_null(); - } - else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, char>::value) { - escape_and_append_with_quotes(value); - } - else SIMDJSON_IF_CONSTEXPR( - std::is_convertible<value_type, std::string_view>::value) { - escape_and_append_with_quotes(value); - } - else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, const char *>::value) { - escape_and_append_with_quotes(value); - } - else { - append(value); - } +simdjson_inline bool value_iterator::is_at_key() const noexcept { + // Keys are at the same depth as the object. + // Note here that we could be safer and check that we are within an object, + // but we do not. + // + // As long as we are at the object's depth, in a valid document, + // we will only ever be at { , : or the actual string key: ". + return _depth == _json_iter->_depth && *_json_iter->peek() == '"'; } -#if SIMDJSON_SUPPORTS_CONCEPTS -template <constevalutil::fixed_string key, typename value_type> -simdjson_inline void -string_builder::append_key_value(value_type value) noexcept { - escape_and_append_with_quotes<key>(); - append_colon(); - SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, std::nullptr_t>::value) { - append_null(); - } - else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, char>::value) { - escape_and_append_with_quotes(value); - } - else SIMDJSON_IF_CONSTEXPR( - std::is_convertible<value_type, std::string_view>::value) { - escape_and_append_with_quotes(value); - } - else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, const char *>::value) { - escape_and_append_with_quotes(value); - } - else { - append(value); - } +simdjson_inline bool value_iterator::is_at_iterator_start() const noexcept { + // We can legitimately be either at the first value ([1]), or after the array if it's empty ([]). + auto delta = position() - start_position(); + return delta == 1 || delta == 2; } -#endif -} // namespace builder -} // namespace arm64 -} // namespace simdjson +inline void value_iterator::assert_at_start() const noexcept { + SIMDJSON_ASSUME( _json_iter->token._position == _start_position ); + SIMDJSON_ASSUME( _json_iter->_depth == _depth ); + SIMDJSON_ASSUME( _depth > 0 ); +} -#endif // SIMDJSON_GENERIC_STRING_BUILDER_INL_H -/* end file simdjson/generic/ondemand/json_string_builder-inl.h for arm64 */ -/* including simdjson/generic/ondemand/json_builder.h for arm64: #include "simdjson/generic/ondemand/json_builder.h" */ -/* begin file simdjson/generic/ondemand/json_builder.h for arm64 */ -/** - * This file is part of the builder API. It is temporarily in the ondemand directory - * but we will move it to a builder directory later. - */ -#ifndef SIMDJSON_GENERIC_BUILDER_H +inline void value_iterator::assert_at_container_start() const noexcept { + SIMDJSON_ASSUME( _json_iter->token._position == _start_position + 1 ); + SIMDJSON_ASSUME( _json_iter->_depth == _depth ); + SIMDJSON_ASSUME( _depth > 0 ); +} -/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_H */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_string_builder.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/concepts.h" */ -/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -#if SIMDJSON_STATIC_REFLECTION +inline void value_iterator::assert_at_next() const noexcept { + SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); + SIMDJSON_ASSUME( _json_iter->_depth == _depth ); + SIMDJSON_ASSUME( _depth > 0 ); +} -#include <charconv> -#include <cstring> -#include <meta> -#include <memory> -#include <optional> -#include <string_view> -#include <type_traits> -#include <utility> -// #include <static_reflection> // for std::define_static_string - header not available yet +simdjson_inline void value_iterator::move_at_start() noexcept { + _json_iter->_depth = _depth; + _json_iter->token.set_position(_start_position); +} -namespace simdjson { -namespace arm64 { -namespace builder { +simdjson_inline void value_iterator::move_at_container_start() noexcept { + _json_iter->_depth = _depth; + _json_iter->token.set_position(_start_position + 1); +} -template <class T> - requires(concepts::container_but_not_string<T> && !require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &t) { - auto it = t.begin(); - auto end = t.end(); - if (it == end) { - b.append_raw("[]"); - return; - } - b.append('['); - atom(b, *it); - ++it; - for (; it != end; ++it) { - b.append(','); - atom(b, *it); - } - b.append(']'); +simdjson_inline simdjson_result<bool> value_iterator::reset_array() noexcept { + if(error()) { return error(); } + move_at_container_start(); + return started_array(); } -template <class T> - requires(std::is_same_v<T, std::string> || - std::is_same_v<T, std::string_view> || - std::is_same_v<T, const char *> || - std::is_same_v<T, char>) -constexpr void atom(string_builder &b, const T &t) { - b.escape_and_append_with_quotes(t); +simdjson_inline simdjson_result<bool> value_iterator::reset_object() noexcept { + if(error()) { return error(); } + move_at_container_start(); + return started_object(); } -template <concepts::string_view_keyed_map T> - requires(!require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &m) { - if (m.empty()) { - b.append_raw("{}"); - return; - } - b.append('{'); - bool first = true; - for (const auto& [key, value] : m) { - if (!first) { - b.append(','); - } - first = false; - // Keys must be convertible to string_view per the concept - b.escape_and_append_with_quotes(key); - b.append(':'); - atom(b, value); - } - b.append('}'); +inline void value_iterator::assert_at_child() const noexcept { + SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); + SIMDJSON_ASSUME( _json_iter->_depth == _depth + 1 ); + SIMDJSON_ASSUME( _depth > 0 ); } +inline void value_iterator::assert_at_root() const noexcept { + assert_at_start(); + SIMDJSON_ASSUME( _depth == 1 ); +} -template<typename number_type, - typename = typename std::enable_if<std::is_arithmetic<number_type>::value && !std::is_same_v<number_type, char>>::type> -constexpr void atom(string_builder &b, const number_type t) { - b.append(t); +inline void value_iterator::assert_at_non_root_start() const noexcept { + assert_at_start(); + SIMDJSON_ASSUME( _depth > 1 ); } -template <class T> - requires(std::is_class_v<T> && !concepts::container_but_not_string<T> && - !concepts::string_view_keyed_map<T> && - !concepts::optional_type<T> && - !concepts::smart_pointer<T> && - !concepts::appendable_containers<T> && - !std::is_same_v<T, std::string> && - !std::is_same_v<T, std::string_view> && - !std::is_same_v<T, const char*> && - !std::is_same_v<T, char> && !require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &t) { - int i = 0; - b.append('{'); - template for (constexpr auto dm : std::define_static_array(std::meta::nonstatic_data_members_of(^^T, std::meta::access_context::unchecked()))) { - if (i != 0) - b.append(','); - constexpr auto key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(dm))); - b.append_raw(key); - b.append(':'); - atom(b, t.[:dm:]); - i++; - }; - b.append('}'); +inline void value_iterator::assert_is_valid() const noexcept { + SIMDJSON_ASSUME( _json_iter != nullptr ); } -// Support for optional types (std::optional, etc.) -template <concepts::optional_type T> - requires(!require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &opt) { - if (opt) { - atom(b, opt.value()); - } else { - b.append_raw("null"); - } +simdjson_inline bool value_iterator::is_valid() const noexcept { + return _json_iter != nullptr; } -// Support for smart pointers (std::unique_ptr, std::shared_ptr, etc.) -template <concepts::smart_pointer T> - requires(!require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &ptr) { - if (ptr) { - atom(b, *ptr); - } else { - b.append_raw("null"); +simdjson_inline simdjson_result<json_type> value_iterator::type() const noexcept { + switch (*peek_start()) { + case '{': + return json_type::object; + case '[': + return json_type::array; + case '"': + return json_type::string; + case 'n': + return json_type::null; + case 't': case 'f': + return json_type::boolean; + case '-': + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + return json_type::number; + default: + return json_type::unknown; } } -// Support for enums - serialize as string representation using expand approach from P2996R12 -template <typename T> - requires(std::is_enum_v<T> && !require_custom_serialization<T>) -void atom(string_builder &b, const T &e) { -#if SIMDJSON_STATIC_REFLECTION - constexpr auto enumerators = std::define_static_array(std::meta::enumerators_of(^^T)); - template for (constexpr auto enum_val : enumerators) { - constexpr auto enum_str = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(enum_val))); - if (e == [:enum_val:]) { - b.append_raw(enum_str); - return; - } - }; - // Fallback to integer if enum value not found - atom(b, static_cast<std::underlying_type_t<T>>(e)); -#else - // Fallback: serialize as integer if reflection not available - atom(b, static_cast<std::underlying_type_t<T>>(e)); -#endif +simdjson_inline token_position value_iterator::start_position() const noexcept { + return _start_position; } -// Support for appendable containers that don't have operator[] (sets, etc.) -template <concepts::appendable_containers T> - requires(!concepts::container_but_not_string<T> && !concepts::string_view_keyed_map<T> && - !concepts::optional_type<T> && !concepts::smart_pointer<T> && - !std::is_same_v<T, std::string> && - !std::is_same_v<T, std::string_view> && !std::is_same_v<T, const char*> && !require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &container) { - if (container.empty()) { - b.append_raw("[]"); - return; - } - b.append('['); - bool first = true; - for (const auto& item : container) { - if (!first) { - b.append(','); - } - first = false; - atom(b, item); - } - b.append(']'); +simdjson_inline token_position value_iterator::position() const noexcept { + return _json_iter->position(); } -// append functions that delegate to atom functions for primitive types -template <class T> - requires(std::is_arithmetic_v<T> && !std::is_same_v<T, char>) -void append(string_builder &b, const T &t) { - atom(b, t); +simdjson_inline token_position value_iterator::end_position() const noexcept { + return _json_iter->end_position(); } -template <class T> - requires(std::is_same_v<T, std::string> || - std::is_same_v<T, std::string_view> || - std::is_same_v<T, const char *> || - std::is_same_v<T, char>) -void append(string_builder &b, const T &t) { - atom(b, t); +simdjson_inline token_position value_iterator::last_position() const noexcept { + return _json_iter->last_position(); } -template <concepts::optional_type T> - requires(!require_custom_serialization<T>) -void append(string_builder &b, const T &t) { - atom(b, t); +simdjson_inline error_code value_iterator::report_error(error_code error, const char *message) noexcept { + return _json_iter->report_error(error, message); } -template <concepts::smart_pointer T> - requires(!require_custom_serialization<T>) -void append(string_builder &b, const T &t) { - atom(b, t); -} +} // namespace ondemand +} // namespace fallback +} // namespace simdjson -template <concepts::appendable_containers T> - requires(!concepts::container_but_not_string<T> && !concepts::string_view_keyed_map<T> && - !concepts::optional_type<T> && !concepts::smart_pointer<T> && - !std::is_same_v<T, std::string> && - !std::is_same_v<T, std::string_view> && !std::is_same_v<T, const char*> && !require_custom_serialization<T>) -void append(string_builder &b, const T &t) { - atom(b, t); +namespace simdjson { + +simdjson_inline simdjson_result<fallback::ondemand::value_iterator>::simdjson_result(fallback::ondemand::value_iterator &&value) noexcept + : implementation_simdjson_result_base<fallback::ondemand::value_iterator>(std::forward<fallback::ondemand::value_iterator>(value)) {} +simdjson_inline simdjson_result<fallback::ondemand::value_iterator>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<fallback::ondemand::value_iterator>(error) {} + +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H +/* end file simdjson/generic/ondemand/value_iterator-inl.h for fallback */ +/* including simdjson/generic/ondemand/serialization-inl.h for fallback: #include "simdjson/generic/ondemand/serialization-inl.h" */ +/* begin file simdjson/generic/ondemand/serialization-inl.h for fallback */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document-inl.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/serialization.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */ +/* amalgamation skipped (editor-only): #if SIMDJSON_STATIC_REFLECTION */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_builder.h" */ +/* amalgamation skipped (editor-only): #endif */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { + +inline std::string_view trim(const std::string_view str) noexcept { + // We can almost surely do better by rolling our own find_first_not_of function. + size_t first = str.find_first_not_of(" \t\n\r"); + // If we have the empty string (just white space), then no trimming is possible, and + // we return the empty string_view. + if (std::string_view::npos == first) { return std::string_view(); } + size_t last = str.find_last_not_of(" \t\n\r"); + return str.substr(first, (last - first + 1)); } -template <concepts::string_view_keyed_map T> - requires(!require_custom_serialization<T>) -void append(string_builder &b, const T &t) { - atom(b, t); + +inline simdjson_result<std::string_view> to_json_string(fallback::ondemand::document& x) noexcept { + std::string_view v; + auto error = x.raw_json().get(v); + if(error) {return error; } + return trim(v); } -// works for struct -template <class Z> - requires(std::is_class_v<Z> && !concepts::container_but_not_string<Z> && - !concepts::string_view_keyed_map<Z> && - !concepts::optional_type<Z> && - !concepts::smart_pointer<Z> && - !concepts::appendable_containers<Z> && - !std::is_same_v<Z, std::string> && - !std::is_same_v<Z, std::string_view> && - !std::is_same_v<Z, const char*> && - !std::is_same_v<Z, char> && !require_custom_serialization<Z>) -void append(string_builder &b, const Z &z) { - int i = 0; - b.append('{'); - template for (constexpr auto dm : std::define_static_array(std::meta::nonstatic_data_members_of(^^Z, std::meta::access_context::unchecked()))) { - if (i != 0) - b.append(','); - constexpr auto key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(dm))); - b.append_raw(key); - b.append(':'); - atom(b, z.[:dm:]); - i++; - }; - b.append('}'); +inline simdjson_result<std::string_view> to_json_string(fallback::ondemand::document_reference& x) noexcept { + std::string_view v; + auto error = x.raw_json().get(v); + if(error) {return error; } + return trim(v); } -// works for container that have begin() and end() iterators -template <class Z> - requires(concepts::container_but_not_string<Z> && !require_custom_serialization<Z>) -void append(string_builder &b, const Z &z) { - auto it = z.begin(); - auto end = z.end(); - if (it == end) { - b.append_raw("[]"); - return; - } - b.append('['); - atom(b, *it); - ++it; - for (; it != end; ++it) { - b.append(','); - atom(b, *it); +inline simdjson_result<std::string_view> to_json_string(fallback::ondemand::value& x) noexcept { + /** + * If we somehow receive a value that has already been consumed, + * then the following code could be in trouble. E.g., we create + * an array as needed, but if an array was already created, then + * it could be bad. + */ + using namespace fallback::ondemand; + fallback::ondemand::json_type t; + auto error = x.type().get(t); + if(error != SUCCESS) { return error; } + switch (t) + { + case json_type::array: + { + fallback::ondemand::array array; + error = x.get_array().get(array); + if(error) { return error; } + return to_json_string(array); + } + case json_type::object: + { + fallback::ondemand::object object; + error = x.get_object().get(object); + if(error) { return error; } + return to_json_string(object); + } + default: + return trim(x.raw_json_token()); } - b.append(']'); } -template <class Z> - requires (require_custom_serialization<Z>) -void append(string_builder &b, const Z &z) { - b.append(z); +inline simdjson_result<std::string_view> to_json_string(fallback::ondemand::object& x) noexcept { + std::string_view v; + auto error = x.raw_json().get(v); + if(error) {return error; } + return trim(v); } - -template <class Z> -simdjson_warn_unused simdjson_result<std::string> to_json_string(const Z &z, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { - string_builder b(initial_capacity); - append(b, z); - std::string_view s; - if(auto e = b.view().get(s); e) { return e; } - return std::string(s); +inline simdjson_result<std::string_view> to_json_string(fallback::ondemand::array& x) noexcept { + std::string_view v; + auto error = x.raw_json().get(v); + if(error) {return error; } + return trim(v); } -template <class Z> -simdjson_warn_unused simdjson_error to_json(const Z &z, std::string &s, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { - string_builder b(initial_capacity); - append(b, z); - std::string_view view; - if(auto e = b.view().get(view); e) { return e; } - s.assign(view); - return SUCCESS; +inline simdjson_result<std::string_view> to_json_string(simdjson_result<fallback::ondemand::document> x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } -template <class Z> -string_builder& operator<<(string_builder& b, const Z& z) { - append(b, z); - return b; +inline simdjson_result<std::string_view> to_json_string(simdjson_result<fallback::ondemand::document_reference> x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } -// extract_from: Serialize only specific fields from a struct to JSON -template<constevalutil::fixed_string... FieldNames, typename T> - requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) -void extract_from(string_builder &b, const T &obj) { - // Helper to check if a field name matches any of the requested fields - auto should_extract = [](std::string_view field_name) constexpr -> bool { - return ((FieldNames.view() == field_name) || ...); - }; - - b.append('{'); - bool first = true; - - // Iterate through all members of T using reflection - template for (constexpr auto mem : std::define_static_array( - std::meta::nonstatic_data_members_of(^^T, std::meta::access_context::unchecked()))) { - - if constexpr (std::meta::is_public(mem)) { - constexpr std::string_view key = std::define_static_string(std::meta::identifier_of(mem)); +inline simdjson_result<std::string_view> to_json_string(simdjson_result<fallback::ondemand::value> x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); +} - // Only serialize this field if it's in our list of requested fields - if constexpr (should_extract(key)) { - if (!first) { - b.append(','); - } - first = false; +inline simdjson_result<std::string_view> to_json_string(simdjson_result<fallback::ondemand::object> x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); +} - // Serialize the key - constexpr auto quoted_key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(mem))); - b.append_raw(quoted_key); - b.append(':'); +inline simdjson_result<std::string_view> to_json_string(simdjson_result<fallback::ondemand::array> x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); +} +} // namespace simdjson - // Serialize the value - atom(b, obj.[:mem:]); - } - } - }; +namespace simdjson { namespace fallback { namespace ondemand { - b.append('}'); +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::fallback::ondemand::value x) { + std::string_view v; + auto error = simdjson::to_json_string(x).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + throw simdjson::simdjson_error(error); + } } - -template<constevalutil::fixed_string... FieldNames, typename T> - requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) -simdjson_warn_unused simdjson_result<std::string> extract_from(const T &obj, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { - string_builder b(initial_capacity); - extract_from<FieldNames...>(b, obj); - std::string_view s; - if(auto e = b.view().get(s); e) { return e; } - return std::string(s); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::fallback::ondemand::value> x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); +} +#else +inline std::ostream& operator<<(std::ostream& out, simdjson::fallback::ondemand::value x) { + std::string_view v; + auto error = simdjson::to_json_string(x).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + return (out << error); + } } +#endif -} // namespace builder -} // namespace arm64 -// Alias the function template to 'to' in the global namespace -template <class Z> -simdjson_warn_unused simdjson_result<std::string> to_json(const Z &z, size_t initial_capacity = arm64::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { - arm64::builder::string_builder b(initial_capacity); - arm64::builder::append(b, z); - std::string_view s; - if(auto e = b.view().get(s); e) { return e; } - return std::string(s); +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::fallback::ondemand::array value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + throw simdjson::simdjson_error(error); + } } -template <class Z> -simdjson_warn_unused simdjson_error to_json(const Z &z, std::string &s, size_t initial_capacity = arm64::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { - arm64::builder::string_builder b(initial_capacity); - arm64::builder::append(b, z); - std::string_view view; - if(auto e = b.view().get(view); e) { return e; } - s.assign(view); - return SUCCESS; +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::fallback::ondemand::array> x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); } -// Global namespace function for extract_from -template<constevalutil::fixed_string... FieldNames, typename T> - requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) -simdjson_warn_unused simdjson_result<std::string> extract_from(const T &obj, size_t initial_capacity = arm64::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { - arm64::builder::string_builder b(initial_capacity); - arm64::builder::extract_from<FieldNames...>(b, obj); - std::string_view s; - if(auto e = b.view().get(s); e) { return e; } - return std::string(s); +#else +inline std::ostream& operator<<(std::ostream& out, simdjson::fallback::ondemand::array value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + return (out << error); + } } +#endif -} // namespace simdjson - -#endif // SIMDJSON_STATIC_REFLECTION +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::fallback::ondemand::document& value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + throw simdjson::simdjson_error(error); + } +} +inline std::ostream& operator<<(std::ostream& out, simdjson::fallback::ondemand::document_reference& value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + throw simdjson::simdjson_error(error); + } +} +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::fallback::ondemand::document>&& x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); +} +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::fallback::ondemand::document_reference>&& x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); +} +#else +inline std::ostream& operator<<(std::ostream& out, simdjson::fallback::ondemand::document& value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + return (out << error); + } +} +#endif +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::fallback::ondemand::object value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + throw simdjson::simdjson_error(error); + } +} +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::fallback::ondemand::object> x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); +} +#else +inline std::ostream& operator<<(std::ostream& out, simdjson::fallback::ondemand::object value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + return (out << error); + } +} #endif -/* end file simdjson/generic/ondemand/json_builder.h for arm64 */ +}}} // namespace simdjson::fallback::ondemand + +#endif // SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H +/* end file simdjson/generic/ondemand/serialization-inl.h for fallback */ // JSON path accessor (compile-time) - must be after inline definitions -/* including simdjson/generic/ondemand/compile_time_accessors.h for arm64: #include "simdjson/generic/ondemand/compile_time_accessors.h" */ -/* begin file simdjson/generic/ondemand/compile_time_accessors.h for arm64 */ +/* including simdjson/generic/ondemand/compile_time_accessors.h for fallback: #include "simdjson/generic/ondemand/compile_time_accessors.h" */ +/* begin file simdjson/generic/ondemand/compile_time_accessors.h for fallback */ /** * Compile-time JSON Path and JSON Pointer accessors using C++26 reflection (P2996) * @@ -47574,7 +87311,7 @@ simdjson_warn_unused simdjson_result<std::string> extract_from(const T &obj, siz #include <array> namespace simdjson { -namespace arm64 { +namespace fallback { namespace ondemand { /*** * JSONPath implementation for compile-time access @@ -47585,7 +87322,7 @@ namespace json_path { // Note: value type must be fully defined before this header is included // This is ensured by including this in amalgamated.h after value-inl.h -using ::simdjson::arm64::ondemand::value; +using ::simdjson::fallback::ondemand::value; // Path step types enum class step_type { @@ -47719,7 +87456,7 @@ struct json_path_parser { // Compile-time path accessor generator template<typename T, constevalutil::fixed_string Path> struct path_accessor { - using value = ::simdjson::arm64::ondemand::value; + using value = ::simdjson::fallback::ondemand::value; static constexpr auto parser = json_path_parser<Path>(); static constexpr std::size_t num_steps = parser.count_steps(); @@ -48197,14 +87934,14 @@ struct path_accessor { // Compile-time path accessor with validation template<typename T, constevalutil::fixed_string Path, typename DocOrValue> -inline simdjson_result<::simdjson::arm64::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { +inline simdjson_result<::simdjson::fallback::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { using accessor = path_accessor<T, Path>; return accessor::access(doc_or_val); } // Overload without type parameter (no validation) template<constevalutil::fixed_string Path, typename DocOrValue> -inline simdjson_result<::simdjson::arm64::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { +inline simdjson_result<::simdjson::fallback::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { using accessor = path_accessor<void, Path>; return accessor::access(doc_or_val); } @@ -48435,237 +88172,291 @@ struct pointer_accessor { // Compile-time JSON Pointer accessor with validation template<typename T, constevalutil::fixed_string Pointer, typename DocOrValue> -inline simdjson_result<::simdjson::arm64::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { +inline simdjson_result<::simdjson::fallback::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { using accessor = pointer_accessor<T, Pointer>; return accessor::access(doc_or_val); } // Overload without type parameter (no validation) template<constevalutil::fixed_string Pointer, typename DocOrValue> -inline simdjson_result<::simdjson::arm64::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { +inline simdjson_result<::simdjson::fallback::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { using accessor = pointer_accessor<void, Pointer>; return accessor::access(doc_or_val); } } // namespace json_path } // namespace ondemand -} // namespace arm64 +} // namespace fallback } // namespace simdjson #endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION #endif // SIMDJSON_GENERIC_ONDEMAND_COMPILE_TIME_ACCESSORS_H -/* end file simdjson/generic/ondemand/compile_time_accessors.h for arm64 */ +/* end file simdjson/generic/ondemand/compile_time_accessors.h for fallback */ -/* end file simdjson/generic/ondemand/amalgamated.h for arm64 */ -/* including simdjson/arm64/end.h: #include "simdjson/arm64/end.h" */ -/* begin file simdjson/arm64/end.h */ +/* end file simdjson/generic/ondemand/amalgamated.h for fallback */ +/* including simdjson/fallback/end.h: #include "simdjson/fallback/end.h" */ +/* begin file simdjson/fallback/end.h */ /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/fallback/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -#undef SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT -/* undefining SIMDJSON_IMPLEMENTATION from "arm64" */ +/* undefining SIMDJSON_IMPLEMENTATION from "fallback" */ #undef SIMDJSON_IMPLEMENTATION -/* end file simdjson/arm64/end.h */ +/* end file simdjson/fallback/end.h */ -#endif // SIMDJSON_ARM64_ONDEMAND_H -/* end file simdjson/arm64/ondemand.h */ -#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(fallback) -/* including simdjson/fallback/ondemand.h: #include "simdjson/fallback/ondemand.h" */ -/* begin file simdjson/fallback/ondemand.h */ -#ifndef SIMDJSON_FALLBACK_ONDEMAND_H -#define SIMDJSON_FALLBACK_ONDEMAND_H +#endif // SIMDJSON_FALLBACK_ONDEMAND_H +/* end file simdjson/fallback/ondemand.h */ +#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(haswell) +/* including simdjson/haswell/ondemand.h: #include "simdjson/haswell/ondemand.h" */ +/* begin file simdjson/haswell/ondemand.h */ +#ifndef SIMDJSON_HASWELL_ONDEMAND_H +#define SIMDJSON_HASWELL_ONDEMAND_H -/* including simdjson/fallback/begin.h: #include "simdjson/fallback/begin.h" */ -/* begin file simdjson/fallback/begin.h */ -/* defining SIMDJSON_IMPLEMENTATION to "fallback" */ -#define SIMDJSON_IMPLEMENTATION fallback -/* including simdjson/fallback/base.h: #include "simdjson/fallback/base.h" */ -/* begin file simdjson/fallback/base.h */ -#ifndef SIMDJSON_FALLBACK_BASE_H -#define SIMDJSON_FALLBACK_BASE_H +/* including simdjson/haswell/begin.h: #include "simdjson/haswell/begin.h" */ +/* begin file simdjson/haswell/begin.h */ +/* defining SIMDJSON_IMPLEMENTATION to "haswell" */ +#define SIMDJSON_IMPLEMENTATION haswell + +/* including simdjson/haswell/base.h: #include "simdjson/haswell/base.h" */ +/* begin file simdjson/haswell/base.h */ +#ifndef SIMDJSON_HASWELL_BASE_H +#define SIMDJSON_HASWELL_BASE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ /* amalgamation skipped (editor-only): #include "simdjson/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ +// The constructor may be executed on any host, so we take care not to use SIMDJSON_TARGET_HASWELL namespace simdjson { /** - * Fallback implementation (runs on any machine). + * Implementation for Haswell (Intel AVX2). */ -namespace fallback { +namespace haswell { class implementation; -} // namespace fallback +namespace { +namespace simd { +template <typename T> struct simd8; +template <typename T> struct simd8x64; +} // namespace simd +} // unnamed namespace + +} // namespace haswell } // namespace simdjson -#endif // SIMDJSON_FALLBACK_BASE_H -/* end file simdjson/fallback/base.h */ -/* including simdjson/fallback/bitmanipulation.h: #include "simdjson/fallback/bitmanipulation.h" */ -/* begin file simdjson/fallback/bitmanipulation.h */ -#ifndef SIMDJSON_FALLBACK_BITMANIPULATION_H -#define SIMDJSON_FALLBACK_BITMANIPULATION_H +#endif // SIMDJSON_HASWELL_BASE_H +/* end file simdjson/haswell/base.h */ +/* including simdjson/haswell/intrinsics.h: #include "simdjson/haswell/intrinsics.h" */ +/* begin file simdjson/haswell/intrinsics.h */ +#ifndef SIMDJSON_HASWELL_INTRINSICS_H +#define SIMDJSON_HASWELL_INTRINSICS_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/fallback/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -namespace simdjson { -namespace fallback { -namespace { +#if SIMDJSON_VISUAL_STUDIO +// under clang within visual studio, this will include <x86intrin.h> +#include <intrin.h> // visual studio or clang +#else +#include <x86intrin.h> // elsewhere +#endif // SIMDJSON_VISUAL_STUDIO -#if defined(_MSC_VER) && !defined(_M_ARM64) && !defined(_M_X64) -static inline unsigned char _BitScanForward64(unsigned long* ret, uint64_t x) { - unsigned long x0 = (unsigned long)x, top, bottom; - _BitScanForward(&top, (unsigned long)(x >> 32)); - _BitScanForward(&bottom, x0); - *ret = x0 ? bottom : 32 + top; - return x != 0; -} -static unsigned char _BitScanReverse64(unsigned long* ret, uint64_t x) { - unsigned long x1 = (unsigned long)(x >> 32), top, bottom; - _BitScanReverse(&top, x1); - _BitScanReverse(&bottom, (unsigned long)x); - *ret = x1 ? top + 32 : bottom; - return x != 0; -} -#endif +#if SIMDJSON_CLANG_VISUAL_STUDIO +/** + * You are not supposed, normally, to include these + * headers directly. Instead you should either include intrin.h + * or x86intrin.h. However, when compiling with clang + * under Windows (i.e., when _MSC_VER is set), these headers + * only get included *if* the corresponding features are detected + * from macros: + * e.g., if __AVX2__ is set... in turn, we normally set these + * macros by compiling against the corresponding architecture + * (e.g., arch:AVX2, -mavx2, etc.) which compiles the whole + * software with these advanced instructions. In simdjson, we + * want to compile the whole program for a generic target, + * and only target our specific kernels. As a workaround, + * we directly include the needed headers. These headers would + * normally guard against such usage, but we carefully included + * <x86intrin.h> (or <intrin.h>) before, so the headers + * are fooled. + */ +#include <bmiintrin.h> // for _blsr_u64 +#include <lzcntintrin.h> // for __lzcnt64 +#include <immintrin.h> // for most things (AVX2, AVX512, _popcnt64) +#include <smmintrin.h> +#include <tmmintrin.h> +#include <avxintrin.h> +#include <avx2intrin.h> +#include <wmmintrin.h> // for _mm_clmulepi64_si128 +// unfortunately, we may not get _blsr_u64, but, thankfully, clang +// has it as a macro. +#ifndef _blsr_u64 +// we roll our own +#define _blsr_u64(n) ((n - 1) & n) +#endif // _blsr_u64 +#endif // SIMDJSON_CLANG_VISUAL_STUDIO -/* result might be undefined when input_num is zero */ -simdjson_inline int leading_zeroes(uint64_t input_num) { -#ifdef _MSC_VER - unsigned long leading_zero = 0; - // Search the mask data from most significant bit (MSB) - // to least significant bit (LSB) for a set bit (1). - if (_BitScanReverse64(&leading_zero, input_num)) - return (int)(63 - leading_zero); - else - return 64; -#else - return __builtin_clzll(input_num); -#endif// _MSC_VER -} +static_assert(sizeof(__m256i) <= simdjson::SIMDJSON_PADDING, "insufficient padding for haswell kernel."); -} // unnamed namespace -} // namespace fallback -} // namespace simdjson +#endif // SIMDJSON_HASWELL_INTRINSICS_H +/* end file simdjson/haswell/intrinsics.h */ -#endif // SIMDJSON_FALLBACK_BITMANIPULATION_H -/* end file simdjson/fallback/bitmanipulation.h */ -/* including simdjson/fallback/stringparsing_defs.h: #include "simdjson/fallback/stringparsing_defs.h" */ -/* begin file simdjson/fallback/stringparsing_defs.h */ -#ifndef SIMDJSON_FALLBACK_STRINGPARSING_DEFS_H -#define SIMDJSON_FALLBACK_STRINGPARSING_DEFS_H +#if !SIMDJSON_CAN_ALWAYS_RUN_HASWELL +// We enable bmi2 only if LLVM/clang is used, because GCC may not +// make good use of it. See https://github.com/simdjson/simdjson/pull/2243 +#if defined(__clang__) +SIMDJSON_TARGET_REGION("avx2,bmi,bmi2,pclmul,lzcnt,popcnt") +#else +SIMDJSON_TARGET_REGION("avx2,bmi,pclmul,lzcnt,popcnt") +#endif +#endif + +/* including simdjson/haswell/bitmanipulation.h: #include "simdjson/haswell/bitmanipulation.h" */ +/* begin file simdjson/haswell/bitmanipulation.h */ +#ifndef SIMDJSON_HASWELL_BITMANIPULATION_H +#define SIMDJSON_HASWELL_BITMANIPULATION_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/fallback/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/haswell/intrinsics.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/haswell/bitmask.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace fallback { +namespace haswell { namespace { -// Holds backslashes and quotes locations. -struct backslash_and_quote { -public: - static constexpr uint32_t BYTES_PROCESSED = 1; - simdjson_inline backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst); - - simdjson_inline bool has_quote_first() { return c == '"'; } - simdjson_inline bool has_backslash() { return c == '\\'; } - simdjson_inline int quote_index() { return c == '"' ? 0 : 1; } - simdjson_inline int backslash_index() { return c == '\\' ? 0 : 1; } +// We sometimes call trailing_zero on inputs that are zero, +// but the algorithms do not end up using the returned value. +// Sadly, sanitizers are not smart enough to figure it out. +SIMDJSON_NO_SANITIZE_UNDEFINED +// This function can be used safely even if not all bytes have been +// initialized. +// See issue https://github.com/simdjson/simdjson/issues/1965 +SIMDJSON_NO_SANITIZE_MEMORY +simdjson_inline int trailing_zeroes(uint64_t input_num) { +#if SIMDJSON_REGULAR_VISUAL_STUDIO + return (int)_tzcnt_u64(input_num); +#else // SIMDJSON_REGULAR_VISUAL_STUDIO + //////// + // You might expect the next line to be equivalent to + // return (int)_tzcnt_u64(input_num); + // but the generated code differs and might be less efficient? + //////// + return __builtin_ctzll(input_num); +#endif // SIMDJSON_REGULAR_VISUAL_STUDIO +} - uint8_t c; -}; // struct backslash_and_quote +/* result might be undefined when input_num is zero */ +simdjson_inline uint64_t clear_lowest_bit(uint64_t input_num) { + return _blsr_u64(input_num); +} -simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) { - // store to dest unconditionally - we can overwrite the bits we don't like later - dst[0] = src[0]; - return { src[0] }; +/* result might be undefined when input_num is zero */ +simdjson_inline int leading_zeroes(uint64_t input_num) { + return int(_lzcnt_u64(input_num)); } +#if SIMDJSON_REGULAR_VISUAL_STUDIO +simdjson_inline unsigned __int64 count_ones(uint64_t input_num) { + // note: we do not support legacy 32-bit Windows in this kernel + return __popcnt64(input_num);// Visual Studio wants two underscores +} +#else +simdjson_inline long long int count_ones(uint64_t input_num) { + return _popcnt64(input_num); +} +#endif -struct escaping { - static constexpr uint32_t BYTES_PROCESSED = 1; - simdjson_inline static escaping copy_and_find(const uint8_t *src, uint8_t *dst); +simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2, + uint64_t *result) { +#if SIMDJSON_REGULAR_VISUAL_STUDIO + return _addcarry_u64(0, value1, value2, + reinterpret_cast<unsigned __int64 *>(result)); +#else + return __builtin_uaddll_overflow(value1, value2, + reinterpret_cast<unsigned long long *>(result)); +#endif +} - simdjson_inline bool has_escape() { return escape_bits; } - simdjson_inline int escape_index() { return 0; } +} // unnamed namespace +} // namespace haswell +} // namespace simdjson - bool escape_bits; -}; // struct escaping +#endif // SIMDJSON_HASWELL_BITMANIPULATION_H +/* end file simdjson/haswell/bitmanipulation.h */ +/* including simdjson/haswell/bitmask.h: #include "simdjson/haswell/bitmask.h" */ +/* begin file simdjson/haswell/bitmask.h */ +#ifndef SIMDJSON_HASWELL_BITMASK_H +#define SIMDJSON_HASWELL_BITMASK_H +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/haswell/intrinsics.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ +namespace simdjson { +namespace haswell { +namespace { -simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *dst) { - dst[0] = src[0]; - return { (src[0] == '\\') || (src[0] == '"') || (src[0] < 32) }; +// +// Perform a "cumulative bitwise xor," flipping bits each time a 1 is encountered. +// +// For example, prefix_xor(00100100) == 00011100 +// +simdjson_inline uint64_t prefix_xor(const uint64_t bitmask) { + // There should be no such thing with a processor supporting avx2 + // but not clmul. + __m128i all_ones = _mm_set1_epi8('\xFF'); + __m128i result = _mm_clmulepi64_si128(_mm_set_epi64x(0ULL, bitmask), all_ones, 0); + return _mm_cvtsi128_si64(result); } } // unnamed namespace -} // namespace fallback +} // namespace haswell } // namespace simdjson -#endif // SIMDJSON_FALLBACK_STRINGPARSING_DEFS_H -/* end file simdjson/fallback/stringparsing_defs.h */ -/* including simdjson/fallback/numberparsing_defs.h: #include "simdjson/fallback/numberparsing_defs.h" */ -/* begin file simdjson/fallback/numberparsing_defs.h */ -#ifndef SIMDJSON_FALLBACK_NUMBERPARSING_DEFS_H -#define SIMDJSON_FALLBACK_NUMBERPARSING_DEFS_H +#endif // SIMDJSON_HASWELL_BITMASK_H +/* end file simdjson/haswell/bitmask.h */ +/* including simdjson/haswell/numberparsing_defs.h: #include "simdjson/haswell/numberparsing_defs.h" */ +/* begin file simdjson/haswell/numberparsing_defs.h */ +#ifndef SIMDJSON_HASWELL_NUMBERPARSING_DEFS_H +#define SIMDJSON_HASWELL_NUMBERPARSING_DEFS_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/fallback/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/haswell/intrinsics.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -#include <cstring> - -#ifdef JSON_TEST_NUMBERS // for unit testing -void found_invalid_number(const uint8_t *buf); -void found_integer(int64_t result, const uint8_t *buf); -void found_unsigned_integer(uint64_t result, const uint8_t *buf); -void found_float(double result, const uint8_t *buf); -#endif +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace fallback { +namespace haswell { namespace numberparsing { -// credit: https://johnnylee-sde.github.io/Fast-numeric-string-to-int/ -/** @private */ -static simdjson_inline uint32_t parse_eight_digits_unrolled(const char *chars) { - uint64_t val; - memcpy(&val, chars, sizeof(uint64_t)); - val = (val & 0x0F0F0F0F0F0F0F0F) * 2561 >> 8; - val = (val & 0x00FF00FF00FF00FF) * 6553601 >> 16; - return uint32_t((val & 0x0000FFFF0000FFFF) * 42949672960001 >> 32); -} - /** @private */ static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) { - return parse_eight_digits_unrolled(reinterpret_cast<const char *>(chars)); -} - -#if SIMDJSON_IS_32BITS // _umul128 for x86, arm -// this is a slow emulation routine for 32-bit -// -static simdjson_inline uint64_t __emulu(uint32_t x, uint32_t y) { - return x * (uint64_t)y; -} -static simdjson_inline uint64_t _umul128(uint64_t ab, uint64_t cd, uint64_t *hi) { - uint64_t ad = __emulu((uint32_t)(ab >> 32), (uint32_t)cd); - uint64_t bd = __emulu((uint32_t)ab, (uint32_t)cd); - uint64_t adbc = ad + __emulu((uint32_t)ab, (uint32_t)(cd >> 32)); - uint64_t adbc_carry = !!(adbc < ad); - uint64_t lo = bd + (adbc << 32); - *hi = __emulu((uint32_t)(ab >> 32), (uint32_t)(cd >> 32)) + (adbc >> 32) + - (adbc_carry << 32) + !!(lo < bd); - return lo; + // this actually computes *16* values so we are being wasteful. + const __m128i ascii0 = _mm_set1_epi8('0'); + const __m128i mul_1_10 = + _mm_setr_epi8(10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1); + const __m128i mul_1_100 = _mm_setr_epi16(100, 1, 100, 1, 100, 1, 100, 1); + const __m128i mul_1_10000 = + _mm_setr_epi16(10000, 1, 10000, 1, 10000, 1, 10000, 1); + const __m128i input = _mm_sub_epi8( + _mm_loadu_si128(reinterpret_cast<const __m128i *>(chars)), ascii0); + const __m128i t1 = _mm_maddubs_epi16(input, mul_1_10); + const __m128i t2 = _mm_madd_epi16(t1, mul_1_100); + const __m128i t3 = _mm_packus_epi32(t2, t2); + const __m128i t4 = _mm_madd_epi16(t3, mul_1_10000); + return _mm_cvtsi128_si32( + t4); // only captures the sum of the first 8 digits, drop the rest } -#endif /** @private */ simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) { @@ -48687,29 +88478,475 @@ simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t } } // namespace numberparsing -} // namespace fallback +} // namespace haswell } // namespace simdjson -#ifndef SIMDJSON_SWAR_NUMBER_PARSING -#if SIMDJSON_IS_BIG_ENDIAN -#define SIMDJSON_SWAR_NUMBER_PARSING 0 -#else #define SIMDJSON_SWAR_NUMBER_PARSING 1 -#endif -#endif -#endif // SIMDJSON_FALLBACK_NUMBERPARSING_DEFS_H -/* end file simdjson/fallback/numberparsing_defs.h */ -/* end file simdjson/fallback/begin.h */ -/* including simdjson/generic/ondemand/amalgamated.h for fallback: #include "simdjson/generic/ondemand/amalgamated.h" */ -/* begin file simdjson/generic/ondemand/amalgamated.h for fallback */ -#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_ONDEMAND_DEPENDENCIES_H) +#endif // SIMDJSON_HASWELL_NUMBERPARSING_DEFS_H +/* end file simdjson/haswell/numberparsing_defs.h */ +/* including simdjson/haswell/simd.h: #include "simdjson/haswell/simd.h" */ +/* begin file simdjson/haswell/simd.h */ +#ifndef SIMDJSON_HASWELL_SIMD_H +#define SIMDJSON_HASWELL_SIMD_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/haswell/intrinsics.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/haswell/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace haswell { +namespace { +namespace simd { + + // Forward-declared so they can be used by splat and friends. + template<typename Child> + struct base { + __m256i value; + + // Zero constructor + simdjson_inline base() : value{__m256i()} {} + + // Conversion from SIMD register + simdjson_inline base(const __m256i _value) : value(_value) {} + + // Conversion to SIMD register + simdjson_inline operator const __m256i&() const { return this->value; } + simdjson_inline operator __m256i&() { return this->value; } + + // Bit operations + simdjson_inline Child operator|(const Child other) const { return _mm256_or_si256(*this, other); } + simdjson_inline Child operator&(const Child other) const { return _mm256_and_si256(*this, other); } + simdjson_inline Child operator^(const Child other) const { return _mm256_xor_si256(*this, other); } + simdjson_inline Child bit_andnot(const Child other) const { return _mm256_andnot_si256(other, *this); } + simdjson_inline Child& operator|=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast | other; return *this_cast; } + simdjson_inline Child& operator&=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast & other; return *this_cast; } + simdjson_inline Child& operator^=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast ^ other; return *this_cast; } + }; + + // Forward-declared so they can be used by splat and friends. + template<typename T> + struct simd8; + + template<typename T, typename Mask=simd8<bool>> + struct base8: base<simd8<T>> { + typedef uint32_t bitmask_t; + typedef uint64_t bitmask2_t; + + simdjson_inline base8() : base<simd8<T>>() {} + simdjson_inline base8(const __m256i _value) : base<simd8<T>>(_value) {} + + friend simdjson_really_inline Mask operator==(const simd8<T> lhs, const simd8<T> rhs) { return _mm256_cmpeq_epi8(lhs, rhs); } + + static const int SIZE = sizeof(base<T>::value); + + template<int N=1> + simdjson_inline simd8<T> prev(const simd8<T> prev_chunk) const { + return _mm256_alignr_epi8(*this, _mm256_permute2x128_si256(prev_chunk, *this, 0x21), 16 - N); + } + }; + + // SIMD byte mask type (returned by things like eq and gt) + template<> + struct simd8<bool>: base8<bool> { + static simdjson_inline simd8<bool> splat(bool _value) { return _mm256_set1_epi8(uint8_t(-(!!_value))); } + + simdjson_inline simd8() : base8() {} + simdjson_inline simd8(const __m256i _value) : base8<bool>(_value) {} + // Splat constructor + simdjson_inline simd8(bool _value) : base8<bool>(splat(_value)) {} + + simdjson_inline int to_bitmask() const { return _mm256_movemask_epi8(*this); } + simdjson_inline bool any() const { return !_mm256_testz_si256(*this, *this); } + simdjson_inline simd8<bool> operator~() const { return *this ^ true; } + }; + + template<typename T> + struct base8_numeric: base8<T> { + static simdjson_inline simd8<T> splat(T _value) { return _mm256_set1_epi8(_value); } + static simdjson_inline simd8<T> zero() { return _mm256_setzero_si256(); } + static simdjson_inline simd8<T> load(const T values[32]) { + return _mm256_loadu_si256(reinterpret_cast<const __m256i *>(values)); + } + // Repeat 16 values as many times as necessary (usually for lookup tables) + static simdjson_inline simd8<T> repeat_16( + T v0, T v1, T v2, T v3, T v4, T v5, T v6, T v7, + T v8, T v9, T v10, T v11, T v12, T v13, T v14, T v15 + ) { + return simd8<T>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15, + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + ); + } + + simdjson_inline base8_numeric() : base8<T>() {} + simdjson_inline base8_numeric(const __m256i _value) : base8<T>(_value) {} + + // Store to array + simdjson_inline void store(T dst[32]) const { return _mm256_storeu_si256(reinterpret_cast<__m256i *>(dst), *this); } + + // Addition/subtraction are the same for signed and unsigned + simdjson_inline simd8<T> operator+(const simd8<T> other) const { return _mm256_add_epi8(*this, other); } + simdjson_inline simd8<T> operator-(const simd8<T> other) const { return _mm256_sub_epi8(*this, other); } + simdjson_inline simd8<T>& operator+=(const simd8<T> other) { *this = *this + other; return *static_cast<simd8<T>*>(this); } + simdjson_inline simd8<T>& operator-=(const simd8<T> other) { *this = *this - other; return *static_cast<simd8<T>*>(this); } + + // Override to distinguish from bool version + simdjson_inline simd8<T> operator~() const { return *this ^ 0xFFu; } + + // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values) + template<typename L> + simdjson_inline simd8<L> lookup_16(simd8<L> lookup_table) const { + return _mm256_shuffle_epi8(lookup_table, *this); + } + + // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted as a bitset). + // Passing a 0 value for mask would be equivalent to writing out every byte to output. + // Only the first 32 - count_ones(mask) bytes of the result are significant but 32 bytes + // get written. + // Design consideration: it seems like a function with the + // signature simd8<L> compress(uint32_t mask) would be + // sensible, but the AVX ISA makes this kind of approach difficult. + template<typename L> + simdjson_inline void compress(uint32_t mask, L * output) const { + using internal::thintable_epi8; + using internal::BitsSetTable256mul2; + using internal::pshufb_combine_table; + // this particular implementation was inspired by work done by @animetosho + // we do it in four steps, first 8 bytes and then second 8 bytes... + uint8_t mask1 = uint8_t(mask); // least significant 8 bits + uint8_t mask2 = uint8_t(mask >> 8); // second least significant 8 bits + uint8_t mask3 = uint8_t(mask >> 16); // ... + uint8_t mask4 = uint8_t(mask >> 24); // ... + // next line just loads the 64-bit values thintable_epi8[mask1] and + // thintable_epi8[mask2] into a 128-bit register, using only + // two instructions on most compilers. + __m256i shufmask = _mm256_set_epi64x(thintable_epi8[mask4], thintable_epi8[mask3], + thintable_epi8[mask2], thintable_epi8[mask1]); + // we increment by 0x08 the second half of the mask and so forth + shufmask = + _mm256_add_epi8(shufmask, _mm256_set_epi32(0x18181818, 0x18181818, + 0x10101010, 0x10101010, 0x08080808, 0x08080808, 0, 0)); + // this is the version "nearly pruned" + __m256i pruned = _mm256_shuffle_epi8(*this, shufmask); + // we still need to put the pieces back together. + // we compute the popcount of the first words: + int pop1 = BitsSetTable256mul2[mask1]; + int pop3 = BitsSetTable256mul2[mask3]; + + // then load the corresponding mask + // could be done with _mm256_loadu2_m128i but many standard libraries omit this intrinsic. + __m256i v256 = _mm256_castsi128_si256( + _mm_loadu_si128(reinterpret_cast<const __m128i *>(pshufb_combine_table + pop1 * 8))); + __m256i compactmask = _mm256_insertf128_si256(v256, + _mm_loadu_si128(reinterpret_cast<const __m128i *>(pshufb_combine_table + pop3 * 8)), 1); + __m256i almostthere = _mm256_shuffle_epi8(pruned, compactmask); + // We just need to write out the result. + // This is the tricky bit that is hard to do + // if we want to return a SIMD register, since there + // is no single-instruction approach to recombine + // the two 128-bit lanes with an offset. + __m128i v128; + v128 = _mm256_castsi256_si128(almostthere); + _mm_storeu_si128( reinterpret_cast<__m128i *>(output), v128); + v128 = _mm256_extractf128_si256(almostthere, 1); + _mm_storeu_si128( reinterpret_cast<__m128i *>(output + 16 - count_ones(mask & 0xFFFF)), v128); + } + + template<typename L> + simdjson_inline simd8<L> lookup_16( + L replace0, L replace1, L replace2, L replace3, + L replace4, L replace5, L replace6, L replace7, + L replace8, L replace9, L replace10, L replace11, + L replace12, L replace13, L replace14, L replace15) const { + return lookup_16(simd8<L>::repeat_16( + replace0, replace1, replace2, replace3, + replace4, replace5, replace6, replace7, + replace8, replace9, replace10, replace11, + replace12, replace13, replace14, replace15 + )); + } + }; + + // Signed bytes + template<> + struct simd8<int8_t> : base8_numeric<int8_t> { + simdjson_inline simd8() : base8_numeric<int8_t>() {} + simdjson_inline simd8(const __m256i _value) : base8_numeric<int8_t>(_value) {} + // Splat constructor + simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {} + // Array constructor + simdjson_inline simd8(const int8_t values[32]) : simd8(load(values)) {} + // Member-by-member initialization + simdjson_inline simd8( + int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, + int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15, + int8_t v16, int8_t v17, int8_t v18, int8_t v19, int8_t v20, int8_t v21, int8_t v22, int8_t v23, + int8_t v24, int8_t v25, int8_t v26, int8_t v27, int8_t v28, int8_t v29, int8_t v30, int8_t v31 + ) : simd8(_mm256_setr_epi8( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15, + v16,v17,v18,v19,v20,v21,v22,v23, + v24,v25,v26,v27,v28,v29,v30,v31 + )) {} + // Repeat 16 values as many times as necessary (usually for lookup tables) + simdjson_inline static simd8<int8_t> repeat_16( + int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, + int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 + ) { + return simd8<int8_t>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15, + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + ); + } + + // Order-sensitive comparisons + simdjson_inline simd8<int8_t> max_val(const simd8<int8_t> other) const { return _mm256_max_epi8(*this, other); } + simdjson_inline simd8<int8_t> min_val(const simd8<int8_t> other) const { return _mm256_min_epi8(*this, other); } + simdjson_inline simd8<bool> operator>(const simd8<int8_t> other) const { return _mm256_cmpgt_epi8(*this, other); } + simdjson_inline simd8<bool> operator<(const simd8<int8_t> other) const { return _mm256_cmpgt_epi8(other, *this); } + }; + + // Unsigned bytes + template<> + struct simd8<uint8_t>: base8_numeric<uint8_t> { + simdjson_inline simd8() : base8_numeric<uint8_t>() {} + simdjson_inline simd8(const __m256i _value) : base8_numeric<uint8_t>(_value) {} + // Splat constructor + simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {} + // Array constructor + simdjson_inline simd8(const uint8_t values[32]) : simd8(load(values)) {} + // Member-by-member initialization + simdjson_inline simd8( + uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, + uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15, + uint8_t v16, uint8_t v17, uint8_t v18, uint8_t v19, uint8_t v20, uint8_t v21, uint8_t v22, uint8_t v23, + uint8_t v24, uint8_t v25, uint8_t v26, uint8_t v27, uint8_t v28, uint8_t v29, uint8_t v30, uint8_t v31 + ) : simd8(_mm256_setr_epi8( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15, + v16,v17,v18,v19,v20,v21,v22,v23, + v24,v25,v26,v27,v28,v29,v30,v31 + )) {} + // Repeat 16 values as many times as necessary (usually for lookup tables) + simdjson_inline static simd8<uint8_t> repeat_16( + uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, + uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 + ) { + return simd8<uint8_t>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15, + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + ); + } + + // Saturated math + simdjson_inline simd8<uint8_t> saturating_add(const simd8<uint8_t> other) const { return _mm256_adds_epu8(*this, other); } + simdjson_inline simd8<uint8_t> saturating_sub(const simd8<uint8_t> other) const { return _mm256_subs_epu8(*this, other); } + + // Order-specific operations + simdjson_inline simd8<uint8_t> max_val(const simd8<uint8_t> other) const { return _mm256_max_epu8(*this, other); } + simdjson_inline simd8<uint8_t> min_val(const simd8<uint8_t> other) const { return _mm256_min_epu8(other, *this); } + // Same as >, but only guarantees true is nonzero (< guarantees true = -1) + simdjson_inline simd8<uint8_t> gt_bits(const simd8<uint8_t> other) const { return this->saturating_sub(other); } + // Same as <, but only guarantees true is nonzero (< guarantees true = -1) + simdjson_inline simd8<uint8_t> lt_bits(const simd8<uint8_t> other) const { return other.saturating_sub(*this); } + simdjson_inline simd8<bool> operator<=(const simd8<uint8_t> other) const { return other.max_val(*this) == other; } + simdjson_inline simd8<bool> operator>=(const simd8<uint8_t> other) const { return other.min_val(*this) == other; } + simdjson_inline simd8<bool> operator>(const simd8<uint8_t> other) const { return this->gt_bits(other).any_bits_set(); } + simdjson_inline simd8<bool> operator<(const simd8<uint8_t> other) const { return this->lt_bits(other).any_bits_set(); } + + // Bit-specific operations + simdjson_inline simd8<bool> bits_not_set() const { return *this == uint8_t(0); } + simdjson_inline simd8<bool> bits_not_set(simd8<uint8_t> bits) const { return (*this & bits).bits_not_set(); } + simdjson_inline simd8<bool> any_bits_set() const { return ~this->bits_not_set(); } + simdjson_inline simd8<bool> any_bits_set(simd8<uint8_t> bits) const { return ~this->bits_not_set(bits); } + simdjson_inline bool is_ascii() const { return _mm256_movemask_epi8(*this) == 0; } + simdjson_inline bool bits_not_set_anywhere() const { return _mm256_testz_si256(*this, *this); } + simdjson_inline bool any_bits_set_anywhere() const { return !bits_not_set_anywhere(); } + simdjson_inline bool bits_not_set_anywhere(simd8<uint8_t> bits) const { return _mm256_testz_si256(*this, bits); } + simdjson_inline bool any_bits_set_anywhere(simd8<uint8_t> bits) const { return !bits_not_set_anywhere(bits); } + template<int N> + simdjson_inline simd8<uint8_t> shr() const { return simd8<uint8_t>(_mm256_srli_epi16(*this, N)) & uint8_t(0xFFu >> N); } + template<int N> + simdjson_inline simd8<uint8_t> shl() const { return simd8<uint8_t>(_mm256_slli_epi16(*this, N)) & uint8_t(0xFFu << N); } + // Get one of the bits and make a bitmask out of it. + // e.g. value.get_bit<7>() gets the high bit + template<int N> + simdjson_inline int get_bit() const { return _mm256_movemask_epi8(_mm256_slli_epi16(*this, 7-N)); } + }; + + template<typename T> + struct simd8x64 { + static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<T>); + static_assert(NUM_CHUNKS == 2, "Haswell kernel should use two registers per 64-byte block."); + const simd8<T> chunks[NUM_CHUNKS]; + template<int idx> simd8<uint8_t> get() const { return idx < NUM_CHUNKS ? chunks[idx] : simd8<T>(); } + + simd8x64(const simd8x64<T>& o) = delete; // no copy allowed + simd8x64<T>& operator=(const simd8<T>& other) = delete; // no assignment allowed + simd8x64() = delete; // no default constructor allowed + + simdjson_inline simd8x64(const simd8<T> chunk0, const simd8<T> chunk1) : chunks{chunk0, chunk1} {} + simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8<T>::load(ptr), simd8<T>::load(ptr+32)} {} + + simdjson_inline uint64_t compress(uint64_t mask, T * output) const { + uint32_t mask1 = uint32_t(mask); + uint32_t mask2 = uint32_t(mask >> 32); + this->chunks[0].compress(mask1, output); + this->chunks[1].compress(mask2, output + 32 - count_ones(mask1)); + return 64 - count_ones(mask); + } + + simdjson_inline void store(T ptr[64]) const { + this->chunks[0].store(ptr+sizeof(simd8<T>)*0); + this->chunks[1].store(ptr+sizeof(simd8<T>)*1); + } + + simdjson_inline uint64_t to_bitmask() const { + uint64_t r_lo = uint32_t(this->chunks[0].to_bitmask()); + uint64_t r_hi = this->chunks[1].to_bitmask(); + return r_lo | (r_hi << 32); + } + + simdjson_inline simd8<T> reduce_or() const { + return this->chunks[0] | this->chunks[1]; + } + + simdjson_inline simd8x64<T> bit_or(const T m) const { + const simd8<T> mask = simd8<T>::splat(m); + return simd8x64<T>( + this->chunks[0] | mask, + this->chunks[1] | mask + ); + } + + simdjson_inline uint64_t eq(const T m) const { + const simd8<T> mask = simd8<T>::splat(m); + return simd8x64<bool>( + this->chunks[0] == mask, + this->chunks[1] == mask + ).to_bitmask(); + } + + simdjson_inline uint64_t eq(const simd8x64<uint8_t> &other) const { + return simd8x64<bool>( + this->chunks[0] == other.chunks[0], + this->chunks[1] == other.chunks[1] + ).to_bitmask(); + } + + simdjson_inline uint64_t lteq(const T m) const { + const simd8<T> mask = simd8<T>::splat(m); + return simd8x64<bool>( + this->chunks[0] <= mask, + this->chunks[1] <= mask + ).to_bitmask(); + } + }; // struct simd8x64<T> + +} // namespace simd + +} // unnamed namespace +} // namespace haswell +} // namespace simdjson + +#endif // SIMDJSON_HASWELL_SIMD_H +/* end file simdjson/haswell/simd.h */ +/* including simdjson/haswell/stringparsing_defs.h: #include "simdjson/haswell/stringparsing_defs.h" */ +/* begin file simdjson/haswell/stringparsing_defs.h */ +#ifndef SIMDJSON_HASWELL_STRINGPARSING_DEFS_H +#define SIMDJSON_HASWELL_STRINGPARSING_DEFS_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/haswell/simd.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/haswell/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace haswell { +namespace { + +using namespace simd; + +// Holds backslashes and quotes locations. +struct backslash_and_quote { +public: + static constexpr uint32_t BYTES_PROCESSED = 32; + simdjson_inline backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst); + + simdjson_inline bool has_quote_first() { return ((bs_bits - 1) & quote_bits) != 0; } + simdjson_inline bool has_backslash() { return ((quote_bits - 1) & bs_bits) != 0; } + simdjson_inline int quote_index() { return trailing_zeroes(quote_bits); } + simdjson_inline int backslash_index() { return trailing_zeroes(bs_bits); } + + uint32_t bs_bits; + uint32_t quote_bits; +}; // struct backslash_and_quote + +simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) { + // this can read up to 15 bytes beyond the buffer size, but we require + // SIMDJSON_PADDING of padding + static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "backslash and quote finder must process fewer than SIMDJSON_PADDING bytes"); + simd8<uint8_t> v(src); + // store to dest unconditionally - we can overwrite the bits we don't like later + v.store(dst); + return { + static_cast<uint32_t>((v == '\\').to_bitmask()), // bs_bits + static_cast<uint32_t>((v == '"').to_bitmask()), // quote_bits + }; +} + + +struct escaping { + static constexpr uint32_t BYTES_PROCESSED = 32; + simdjson_inline static escaping copy_and_find(const uint8_t *src, uint8_t *dst); + + simdjson_inline bool has_escape() { return escape_bits != 0; } + simdjson_inline int escape_index() { return trailing_zeroes(escape_bits); } + + uint64_t escape_bits; +}; // struct escaping + + + +simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *dst) { + static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "escaping finder must process fewer than SIMDJSON_PADDING bytes"); + simd8<uint8_t> v(src); + v.store(dst); + simd8<bool> is_quote = (v == '"'); + simd8<bool> is_backslash = (v == '\\'); + simd8<bool> is_control = (v < 32); + return { + uint64_t((is_backslash | is_quote | is_control).to_bitmask()) + }; +} + +} // unnamed namespace +} // namespace haswell +} // namespace simdjson + +#endif // SIMDJSON_HASWELL_STRINGPARSING_DEFS_H +/* end file simdjson/haswell/stringparsing_defs.h */ +/* end file simdjson/haswell/begin.h */ +/* including simdjson/generic/ondemand/amalgamated.h for haswell: #include "simdjson/generic/ondemand/amalgamated.h" */ +/* begin file simdjson/generic/ondemand/amalgamated.h for haswell */ +#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_BUILDER_DEPENDENCIES_H) #error simdjson/generic/ondemand/dependencies.h must be included before simdjson/generic/ondemand/amalgamated.h! #endif // Stuff other things depend on -/* including simdjson/generic/ondemand/base.h for fallback: #include "simdjson/generic/ondemand/base.h" */ -/* begin file simdjson/generic/ondemand/base.h for fallback */ +/* including simdjson/generic/ondemand/base.h for haswell: #include "simdjson/generic/ondemand/base.h" */ +/* begin file simdjson/generic/ondemand/base.h for haswell */ #ifndef SIMDJSON_GENERIC_ONDEMAND_BASE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -48718,7 +88955,7 @@ simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace fallback { +namespace haswell { /** * A fast, simple, DOM-like interface that parses JSON as you use it. * @@ -48729,8 +88966,8 @@ namespace ondemand { /** Represents the depth of a JSON value (number of nested arrays/objects). */ using depth_t = int32_t; -/** @copydoc simdjson::fallback::number_type */ -using number_type = simdjson::fallback::number_type; +/** @copydoc simdjson::haswell::number_type */ +using number_type = simdjson::haswell::number_type; /** @private Position in the JSON buffer indexes */ using token_position = const uint32_t *; @@ -48753,13 +88990,13 @@ class value; class value_iterator; } // namespace ondemand -} // namespace fallback +} // namespace haswell } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_BASE_H -/* end file simdjson/generic/ondemand/base.h for fallback */ -/* including simdjson/generic/ondemand/deserialize.h for fallback: #include "simdjson/generic/ondemand/deserialize.h" */ -/* begin file simdjson/generic/ondemand/deserialize.h for fallback */ +/* end file simdjson/generic/ondemand/base.h for haswell */ +/* including simdjson/generic/ondemand/deserialize.h for haswell: #include "simdjson/generic/ondemand/deserialize.h" */ +/* begin file simdjson/generic/ondemand/deserialize.h for haswell */ #if SIMDJSON_SUPPORTS_CONCEPTS #ifndef SIMDJSON_ONDEMAND_DESERIALIZE_H @@ -48779,35 +89016,35 @@ template <> struct is_builtin_deserializable<int64_t> : std::true_type {}; template <> struct is_builtin_deserializable<uint64_t> : std::true_type {}; template <> struct is_builtin_deserializable<double> : std::true_type {}; template <> struct is_builtin_deserializable<bool> : std::true_type {}; -template <> struct is_builtin_deserializable<fallback::ondemand::array> : std::true_type {}; -template <> struct is_builtin_deserializable<fallback::ondemand::object> : std::true_type {}; -template <> struct is_builtin_deserializable<fallback::ondemand::value> : std::true_type {}; -template <> struct is_builtin_deserializable<fallback::ondemand::raw_json_string> : std::true_type {}; +template <> struct is_builtin_deserializable<haswell::ondemand::array> : std::true_type {}; +template <> struct is_builtin_deserializable<haswell::ondemand::object> : std::true_type {}; +template <> struct is_builtin_deserializable<haswell::ondemand::value> : std::true_type {}; +template <> struct is_builtin_deserializable<haswell::ondemand::raw_json_string> : std::true_type {}; template <> struct is_builtin_deserializable<std::string_view> : std::true_type {}; template <typename T> concept is_builtin_deserializable_v = is_builtin_deserializable<T>::value; -template <typename T, typename ValT = fallback::ondemand::value> +template <typename T, typename ValT = haswell::ondemand::value> concept custom_deserializable = tag_invocable<deserialize_tag, ValT&, T&>; -template <typename T, typename ValT = fallback::ondemand::value> +template <typename T, typename ValT = haswell::ondemand::value> concept deserializable = custom_deserializable<T, ValT> || is_builtin_deserializable_v<T> || concepts::optional_type<T>; -template <typename T, typename ValT = fallback::ondemand::value> +template <typename T, typename ValT = haswell::ondemand::value> concept nothrow_custom_deserializable = nothrow_tag_invocable<deserialize_tag, ValT&, T&>; // built-in types are noexcept and if an error happens, the value simply gets ignored and the error is returned. -template <typename T, typename ValT = fallback::ondemand::value> +template <typename T, typename ValT = haswell::ondemand::value> concept nothrow_deserializable = nothrow_custom_deserializable<T, ValT> || is_builtin_deserializable_v<T>; /// Deserialize Tag inline constexpr struct deserialize_tag { - using array_type = fallback::ondemand::array; - using object_type = fallback::ondemand::object; - using value_type = fallback::ondemand::value; - using document_type = fallback::ondemand::document; - using document_reference_type = fallback::ondemand::document_reference; + using array_type = haswell::ondemand::array; + using object_type = haswell::ondemand::object; + using value_type = haswell::ondemand::value; + using document_type = haswell::ondemand::document; + using document_reference_type = haswell::ondemand::document_reference; // Customization Point for array template <typename T> @@ -48852,9 +89089,9 @@ inline constexpr struct deserialize_tag { #endif // SIMDJSON_ONDEMAND_DESERIALIZE_H #endif // SIMDJSON_SUPPORTS_CONCEPTS -/* end file simdjson/generic/ondemand/deserialize.h for fallback */ -/* including simdjson/generic/ondemand/value_iterator.h for fallback: #include "simdjson/generic/ondemand/value_iterator.h" */ -/* begin file simdjson/generic/ondemand/value_iterator.h for fallback */ +/* end file simdjson/generic/ondemand/deserialize.h for haswell */ +/* including simdjson/generic/ondemand/value_iterator.h for haswell: #include "simdjson/generic/ondemand/value_iterator.h" */ +/* begin file simdjson/generic/ondemand/value_iterator.h for haswell */ #ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -48864,7 +89101,7 @@ inline constexpr struct deserialize_tag { /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace fallback { +namespace haswell { namespace ondemand { /** @@ -49329,21 +89566,22 @@ class value_iterator { friend class document; friend class object; + friend class object_iterator; friend class array; friend class value; friend class field; }; // value_iterator } // namespace ondemand -} // namespace fallback +} // namespace haswell } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<fallback::ondemand::value_iterator> : public fallback::implementation_simdjson_result_base<fallback::ondemand::value_iterator> { +struct simdjson_result<haswell::ondemand::value_iterator> : public haswell::implementation_simdjson_result_base<haswell::ondemand::value_iterator> { public: - simdjson_inline simdjson_result(fallback::ondemand::value_iterator &&value) noexcept; ///< @private + simdjson_inline simdjson_result(haswell::ondemand::value_iterator &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; }; @@ -49351,9 +89589,9 @@ struct simdjson_result<fallback::ondemand::value_iterator> : public fallback::im } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_H -/* end file simdjson/generic/ondemand/value_iterator.h for fallback */ -/* including simdjson/generic/ondemand/value.h for fallback: #include "simdjson/generic/ondemand/value.h" */ -/* begin file simdjson/generic/ondemand/value.h for fallback */ +/* end file simdjson/generic/ondemand/value_iterator.h for haswell */ +/* including simdjson/generic/ondemand/value.h for haswell: #include "simdjson/generic/ondemand/value.h" */ +/* begin file simdjson/generic/ondemand/value.h for haswell */ #ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -49369,7 +89607,7 @@ struct simdjson_result<fallback::ondemand::value_iterator> : public fallback::im namespace simdjson { -namespace fallback { +namespace haswell { namespace ondemand { /** * An ephemeral JSON value returned during iteration. It is only valid for as long as you do @@ -50083,20 +90321,20 @@ class value { }; } // namespace ondemand -} // namespace fallback +} // namespace haswell } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<fallback::ondemand::value> : public fallback::implementation_simdjson_result_base<fallback::ondemand::value> { +struct simdjson_result<haswell::ondemand::value> : public haswell::implementation_simdjson_result_base<haswell::ondemand::value> { public: - simdjson_inline simdjson_result(fallback::ondemand::value &&value) noexcept; ///< @private + simdjson_inline simdjson_result(haswell::ondemand::value &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; - simdjson_inline simdjson_result<fallback::ondemand::array> get_array() noexcept; - simdjson_inline simdjson_result<fallback::ondemand::object> get_object() noexcept; + simdjson_inline simdjson_result<haswell::ondemand::array> get_array() noexcept; + simdjson_inline simdjson_result<haswell::ondemand::object> get_object() noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64() noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64_in_string() noexcept; @@ -50108,7 +90346,7 @@ struct simdjson_result<fallback::ondemand::value> : public fallback::implementat template <typename string_type> simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result<std::string_view> get_wobbly_string() noexcept; - simdjson_inline simdjson_result<fallback::ondemand::raw_json_string> get_raw_json_string() noexcept; + simdjson_inline simdjson_result<haswell::ondemand::raw_json_string> get_raw_json_string() noexcept; simdjson_inline simdjson_result<bool> get_bool() noexcept; simdjson_inline simdjson_result<bool> is_null() noexcept; @@ -50119,20 +90357,20 @@ struct simdjson_result<fallback::ondemand::value> : public fallback::implementat #if SIMDJSON_EXCEPTIONS template <class T> explicit simdjson_inline operator T() noexcept(false); - simdjson_inline operator fallback::ondemand::array() noexcept(false); - simdjson_inline operator fallback::ondemand::object() noexcept(false); + simdjson_inline operator haswell::ondemand::array() noexcept(false); + simdjson_inline operator haswell::ondemand::object() noexcept(false); simdjson_inline operator uint64_t() noexcept(false); simdjson_inline operator int64_t() noexcept(false); simdjson_inline operator double() noexcept(false); simdjson_inline operator std::string_view() noexcept(false); - simdjson_inline operator fallback::ondemand::raw_json_string() noexcept(false); + simdjson_inline operator haswell::ondemand::raw_json_string() noexcept(false); simdjson_inline operator bool() noexcept(false); #endif simdjson_inline simdjson_result<size_t> count_elements() & noexcept; simdjson_inline simdjson_result<size_t> count_fields() & noexcept; - simdjson_inline simdjson_result<fallback::ondemand::value> at(size_t index) noexcept; - simdjson_inline simdjson_result<fallback::ondemand::array_iterator> begin() & noexcept; - simdjson_inline simdjson_result<fallback::ondemand::array_iterator> end() & noexcept; + simdjson_inline simdjson_result<haswell::ondemand::value> at(size_t index) noexcept; + simdjson_inline simdjson_result<haswell::ondemand::array_iterator> begin() & noexcept; + simdjson_inline simdjson_result<haswell::ondemand::array_iterator> end() & noexcept; /** * Look up a field by name on an object (order-sensitive). By order-sensitive, we mean that @@ -50156,9 +90394,9 @@ struct simdjson_result<fallback::ondemand::value> : public fallback::implementat * @param key The key to look up. * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object. */ - simdjson_inline simdjson_result<fallback::ondemand::value> find_field(std::string_view key) noexcept; - /** @overload simdjson_inline simdjson_result<fallback::ondemand::value> find_field(std::string_view key) noexcept; */ - simdjson_inline simdjson_result<fallback::ondemand::value> find_field(const char *key) noexcept; + simdjson_inline simdjson_result<haswell::ondemand::value> find_field(std::string_view key) noexcept; + /** @overload simdjson_inline simdjson_result<haswell::ondemand::value> find_field(std::string_view key) noexcept; */ + simdjson_inline simdjson_result<haswell::ondemand::value> find_field(const char *key) noexcept; /** * Look up a field by name on an object, without regard to key order. @@ -50170,7 +90408,7 @@ struct simdjson_result<fallback::ondemand::value> : public fallback::implementat * in question is large. The fact that the extra code is there also bumps the executable size. * * We default operator[] on find_field_unordered() for convenience. - * It is the defaul because it would be highly surprising (and hard to debug) if the + * It is the default because it would be highly surprising (and hard to debug) if the * default behavior failed to look up a field just because it was in the wrong order--and many * APIs assume this. Therefore, you must be explicit if you want to treat objects as out of order. * @@ -50180,14 +90418,14 @@ struct simdjson_result<fallback::ondemand::value> : public fallback::implementat * @param key The key to look up. * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object. */ - simdjson_inline simdjson_result<fallback::ondemand::value> find_field_unordered(std::string_view key) noexcept; - /** @overload simdjson_inline simdjson_result<fallback::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ - simdjson_inline simdjson_result<fallback::ondemand::value> find_field_unordered(const char *key) noexcept; - /** @overload simdjson_inline simdjson_result<fallback::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ - simdjson_inline simdjson_result<fallback::ondemand::value> operator[](std::string_view key) noexcept; - /** @overload simdjson_inline simdjson_result<fallback::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ - simdjson_inline simdjson_result<fallback::ondemand::value> operator[](const char *key) noexcept; - simdjson_result<fallback::ondemand::value> operator[](int) noexcept = delete; + simdjson_inline simdjson_result<haswell::ondemand::value> find_field_unordered(std::string_view key) noexcept; + /** @overload simdjson_inline simdjson_result<haswell::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ + simdjson_inline simdjson_result<haswell::ondemand::value> find_field_unordered(const char *key) noexcept; + /** @overload simdjson_inline simdjson_result<haswell::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ + simdjson_inline simdjson_result<haswell::ondemand::value> operator[](std::string_view key) noexcept; + /** @overload simdjson_inline simdjson_result<haswell::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ + simdjson_inline simdjson_result<haswell::ondemand::value> operator[](const char *key) noexcept; + simdjson_result<haswell::ondemand::value> operator[](int) noexcept = delete; /** * Get the type of this JSON value. It does not validate or consume the value. @@ -50211,13 +90449,13 @@ struct simdjson_result<fallback::ondemand::value> : public fallback::implementat * better to just call .get_double, .get_string, etc. and check for INCORRECT_TYPE (or just * let it throw an exception). */ - simdjson_inline simdjson_result<fallback::ondemand::json_type> type() noexcept; + simdjson_inline simdjson_result<haswell::ondemand::json_type> type() noexcept; simdjson_inline simdjson_result<bool> is_scalar() noexcept; simdjson_inline simdjson_result<bool> is_string() noexcept; simdjson_inline simdjson_result<bool> is_negative() noexcept; simdjson_inline simdjson_result<bool> is_integer() noexcept; - simdjson_inline simdjson_result<fallback::number_type> get_number_type() noexcept; - simdjson_inline simdjson_result<fallback::ondemand::number> get_number() noexcept; + simdjson_inline simdjson_result<haswell::number_type> get_number_type() noexcept; + simdjson_inline simdjson_result<haswell::ondemand::number> get_number() noexcept; /** @copydoc simdjson_inline std::string_view value::raw_json_token() const noexcept */ simdjson_inline simdjson_result<std::string_view> raw_json_token() noexcept; @@ -50227,17 +90465,17 @@ struct simdjson_result<fallback::ondemand::value> : public fallback::implementat simdjson_inline simdjson_result<const char *> current_location() noexcept; /** @copydoc simdjson_inline int32_t current_depth() const noexcept */ simdjson_inline simdjson_result<int32_t> current_depth() const noexcept; - simdjson_inline simdjson_result<fallback::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result<fallback::ondemand::value> at_path(std::string_view json_path) noexcept; - simdjson_inline simdjson_result<std::vector<fallback::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<haswell::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result<haswell::ondemand::value> at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<std::vector<haswell::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; }; } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_H -/* end file simdjson/generic/ondemand/value.h for fallback */ -/* including simdjson/generic/ondemand/logger.h for fallback: #include "simdjson/generic/ondemand/logger.h" */ -/* begin file simdjson/generic/ondemand/logger.h for fallback */ +/* end file simdjson/generic/ondemand/value.h for haswell */ +/* including simdjson/generic/ondemand/logger.h for haswell: #include "simdjson/generic/ondemand/logger.h" */ +/* begin file simdjson/generic/ondemand/logger.h for haswell */ #ifndef SIMDJSON_GENERIC_ONDEMAND_LOGGER_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -50246,7 +90484,7 @@ struct simdjson_result<fallback::ondemand::value> : public fallback::implementat /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace fallback { +namespace haswell { namespace ondemand { // Logging should be free unless SIMDJSON_VERBOSE_LOGGING is set. Importantly, it is critical @@ -50292,13 +90530,13 @@ static inline void log_error(const value_iterator &iter, const char *error, cons } // namespace logger } // namespace ondemand -} // namespace fallback +} // namespace haswell } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_LOGGER_H -/* end file simdjson/generic/ondemand/logger.h for fallback */ -/* including simdjson/generic/ondemand/token_iterator.h for fallback: #include "simdjson/generic/ondemand/token_iterator.h" */ -/* begin file simdjson/generic/ondemand/token_iterator.h for fallback */ +/* end file simdjson/generic/ondemand/logger.h for haswell */ +/* including simdjson/generic/ondemand/token_iterator.h for haswell: #include "simdjson/generic/ondemand/token_iterator.h" */ +/* begin file simdjson/generic/ondemand/token_iterator.h for haswell */ #ifndef SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -50309,7 +90547,7 @@ static inline void log_error(const value_iterator &iter, const char *error, cons /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace fallback { +namespace haswell { namespace ondemand { /** @@ -50440,15 +90678,15 @@ class token_iterator { }; } // namespace ondemand -} // namespace fallback +} // namespace haswell } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<fallback::ondemand::token_iterator> : public fallback::implementation_simdjson_result_base<fallback::ondemand::token_iterator> { +struct simdjson_result<haswell::ondemand::token_iterator> : public haswell::implementation_simdjson_result_base<haswell::ondemand::token_iterator> { public: - simdjson_inline simdjson_result(fallback::ondemand::token_iterator &&value) noexcept; ///< @private + simdjson_inline simdjson_result(haswell::ondemand::token_iterator &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; simdjson_inline ~simdjson_result() noexcept = default; ///< @private @@ -50457,9 +90695,9 @@ struct simdjson_result<fallback::ondemand::token_iterator> : public fallback::im } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_H -/* end file simdjson/generic/ondemand/token_iterator.h for fallback */ -/* including simdjson/generic/ondemand/json_iterator.h for fallback: #include "simdjson/generic/ondemand/json_iterator.h" */ -/* begin file simdjson/generic/ondemand/json_iterator.h for fallback */ +/* end file simdjson/generic/ondemand/token_iterator.h for haswell */ +/* including simdjson/generic/ondemand/json_iterator.h for haswell: #include "simdjson/generic/ondemand/json_iterator.h" */ +/* begin file simdjson/generic/ondemand/json_iterator.h for haswell */ #ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -50470,7 +90708,7 @@ struct simdjson_result<fallback::ondemand::token_iterator> : public fallback::im /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace fallback { +namespace haswell { namespace ondemand { /** @@ -50781,15 +91019,15 @@ class json_iterator { }; // json_iterator } // namespace ondemand -} // namespace fallback +} // namespace haswell } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<fallback::ondemand::json_iterator> : public fallback::implementation_simdjson_result_base<fallback::ondemand::json_iterator> { +struct simdjson_result<haswell::ondemand::json_iterator> : public haswell::implementation_simdjson_result_base<haswell::ondemand::json_iterator> { public: - simdjson_inline simdjson_result(fallback::ondemand::json_iterator &&value) noexcept; ///< @private + simdjson_inline simdjson_result(haswell::ondemand::json_iterator &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; @@ -50798,9 +91036,9 @@ struct simdjson_result<fallback::ondemand::json_iterator> : public fallback::imp } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_H -/* end file simdjson/generic/ondemand/json_iterator.h for fallback */ -/* including simdjson/generic/ondemand/json_type.h for fallback: #include "simdjson/generic/ondemand/json_type.h" */ -/* begin file simdjson/generic/ondemand/json_type.h for fallback */ +/* end file simdjson/generic/ondemand/json_iterator.h for haswell */ +/* including simdjson/generic/ondemand/json_type.h for haswell: #include "simdjson/generic/ondemand/json_type.h" */ +/* begin file simdjson/generic/ondemand/json_type.h for haswell */ #ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -50811,7 +91049,7 @@ struct simdjson_result<fallback::ondemand::json_iterator> : public fallback::imp /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace fallback { +namespace haswell { namespace ondemand { /** @@ -50945,15 +91183,15 @@ inline std::ostream& operator<<(std::ostream& out, simdjson_result<json_type> &t #endif } // namespace ondemand -} // namespace fallback +} // namespace haswell } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<fallback::ondemand::json_type> : public fallback::implementation_simdjson_result_base<fallback::ondemand::json_type> { +struct simdjson_result<haswell::ondemand::json_type> : public haswell::implementation_simdjson_result_base<haswell::ondemand::json_type> { public: - simdjson_inline simdjson_result(fallback::ondemand::json_type &&value) noexcept; ///< @private + simdjson_inline simdjson_result(haswell::ondemand::json_type &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; simdjson_inline ~simdjson_result() noexcept = default; ///< @private @@ -50962,9 +91200,9 @@ struct simdjson_result<fallback::ondemand::json_type> : public fallback::impleme } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_H -/* end file simdjson/generic/ondemand/json_type.h for fallback */ -/* including simdjson/generic/ondemand/raw_json_string.h for fallback: #include "simdjson/generic/ondemand/raw_json_string.h" */ -/* begin file simdjson/generic/ondemand/raw_json_string.h for fallback */ +/* end file simdjson/generic/ondemand/json_type.h for haswell */ +/* including simdjson/generic/ondemand/raw_json_string.h for haswell: #include "simdjson/generic/ondemand/raw_json_string.h" */ +/* begin file simdjson/generic/ondemand/raw_json_string.h for haswell */ #ifndef SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -50974,7 +91212,7 @@ struct simdjson_result<fallback::ondemand::json_type> : public fallback::impleme /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace fallback { +namespace haswell { namespace ondemand { /** @@ -51156,30 +91394,30 @@ simdjson_unused simdjson_inline bool operator!=(std::string_view c, const raw_js } // namespace ondemand -} // namespace fallback +} // namespace haswell } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<fallback::ondemand::raw_json_string> : public fallback::implementation_simdjson_result_base<fallback::ondemand::raw_json_string> { +struct simdjson_result<haswell::ondemand::raw_json_string> : public haswell::implementation_simdjson_result_base<haswell::ondemand::raw_json_string> { public: - simdjson_inline simdjson_result(fallback::ondemand::raw_json_string &&value) noexcept; ///< @private + simdjson_inline simdjson_result(haswell::ondemand::raw_json_string &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; simdjson_inline ~simdjson_result() noexcept = default; ///< @private simdjson_inline simdjson_result<const char *> raw() const noexcept; simdjson_inline char operator[](size_t) const noexcept; - simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> unescape(fallback::ondemand::json_iterator &iter, bool allow_replacement) const noexcept; - simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> unescape_wobbly(fallback::ondemand::json_iterator &iter) const noexcept; + simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> unescape(haswell::ondemand::json_iterator &iter, bool allow_replacement) const noexcept; + simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> unescape_wobbly(haswell::ondemand::json_iterator &iter) const noexcept; }; } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_H -/* end file simdjson/generic/ondemand/raw_json_string.h for fallback */ -/* including simdjson/generic/ondemand/parser.h for fallback: #include "simdjson/generic/ondemand/parser.h" */ -/* begin file simdjson/generic/ondemand/parser.h for fallback */ +/* end file simdjson/generic/ondemand/raw_json_string.h for haswell */ +/* including simdjson/generic/ondemand/parser.h for haswell: #include "simdjson/generic/ondemand/parser.h" */ +/* begin file simdjson/generic/ondemand/parser.h for haswell */ #ifndef SIMDJSON_GENERIC_ONDEMAND_PARSER_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -51192,7 +91430,7 @@ struct simdjson_result<fallback::ondemand::raw_json_string> : public fallback::i #include <thread> namespace simdjson { -namespace fallback { +namespace haswell { namespace ondemand { /** @@ -51592,15 +91830,15 @@ class parser { }; } // namespace ondemand -} // namespace fallback +} // namespace haswell } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<fallback::ondemand::parser> : public fallback::implementation_simdjson_result_base<fallback::ondemand::parser> { +struct simdjson_result<haswell::ondemand::parser> : public haswell::implementation_simdjson_result_base<haswell::ondemand::parser> { public: - simdjson_inline simdjson_result(fallback::ondemand::parser &&value) noexcept; ///< @private + simdjson_inline simdjson_result(haswell::ondemand::parser &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; }; @@ -51608,319 +91846,11 @@ struct simdjson_result<fallback::ondemand::parser> : public fallback::implementa } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_PARSER_H -/* end file simdjson/generic/ondemand/parser.h for fallback */ - -// JSON builder - needed for extract_into functionality -/* including simdjson/generic/ondemand/json_string_builder.h for fallback: #include "simdjson/generic/ondemand/json_string_builder.h" */ -/* begin file simdjson/generic/ondemand/json_string_builder.h for fallback */ -/** - * This file is part of the builder API. It is temporarily in the ondemand directory - * but we will move it to a builder directory later. - */ -#ifndef SIMDJSON_GENERIC_STRING_BUILDER_H - -/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_H */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */ -/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ - -namespace simdjson { - - -#if SIMDJSON_SUPPORTS_CONCEPTS - -namespace fallback { -namespace builder { - class string_builder; -}} - -template <typename T, typename = void> -struct has_custom_serialization : std::false_type {}; - -inline constexpr struct serialize_tag { - template <typename T> - constexpr void operator()(fallback::builder::string_builder& b, T&& obj) const{ - return tag_invoke(*this, b, std::forward<T>(obj)); - } - - -} serialize{}; -template <typename T> -struct has_custom_serialization<T, std::void_t< - decltype(tag_invoke(serialize, std::declval<fallback::builder::string_builder&>(), std::declval<T&>())) ->> : std::true_type {}; - -template <typename T> -constexpr bool require_custom_serialization = has_custom_serialization<T>::value; -#else -struct has_custom_serialization : std::false_type {}; -#endif // SIMDJSON_SUPPORTS_CONCEPTS - -namespace fallback { -namespace builder { -/** - * A builder for JSON strings representing documents. This is a low-level - * builder that is not meant to be used directly by end-users. Though it - * supports atomic types (Booleans, strings), it does not support composed - * types (arrays and objects). - * - * Ultimately, this class can support kernel-specific optimizations. E.g., - * it may make use of SIMD instructions to escape strings faster. - */ -class string_builder { -public: - simdjson_inline string_builder(size_t initial_capacity = DEFAULT_INITIAL_CAPACITY); - - static constexpr size_t DEFAULT_INITIAL_CAPACITY = 1024; - - /** - * Append number (includes Booleans). Booleans are mapped to the strings - * false and true. Numbers are converted to strings abiding by the JSON standard. - * Floating-point numbers are converted to the shortest string that 'correctly' - * represents the number. - */ - template<typename number_type, - typename = typename std::enable_if<std::is_arithmetic<number_type>::value>::type> - simdjson_inline void append(number_type v) noexcept; - - /** - * Append character c. - */ - simdjson_inline void append(char c) noexcept; - - /** - * Append the string 'null'. - */ - simdjson_inline void append_null() noexcept; - - /** - * Clear the content. - */ - simdjson_inline void clear() noexcept; - - /** - * Append the std::string_view, after escaping it. - * There is no UTF-8 validation. - */ - simdjson_inline void escape_and_append(std::string_view input) noexcept; - - /** - * Append the std::string_view surrounded by double quotes, after escaping it. - * There is no UTF-8 validation. - */ - simdjson_inline void escape_and_append_with_quotes(std::string_view input) noexcept; -#if SIMDJSON_SUPPORTS_CONCEPTS - template<constevalutil::fixed_string key> - simdjson_inline void escape_and_append_with_quotes() noexcept; -#endif - /** - * Append the character surrounded by double quotes, after escaping it. - * There is no UTF-8 validation. - */ - simdjson_inline void escape_and_append_with_quotes(char input) noexcept; - - /** - * Append the character surrounded by double quotes, after escaping it. - * There is no UTF-8 validation. - */ - simdjson_inline void escape_and_append_with_quotes(const char* input) noexcept; - - /** - * Append the C string directly, without escaping. - * There is no UTF-8 validation. - */ - simdjson_inline void append_raw(const char *c) noexcept; - - /** - * Append "{" to the buffer. - */ - simdjson_inline void start_object() noexcept; - - /** - * Append "}" to the buffer. - */ - simdjson_inline void end_object() noexcept; - - /** - * Append "[" to the buffer. - */ - simdjson_inline void start_array() noexcept; - - /** - * Append "]" to the buffer. - */ - simdjson_inline void end_array() noexcept; - - /** - * Append "," to the buffer. - */ - simdjson_inline void append_comma() noexcept; - - /** - * Append ":" to the buffer. - */ - simdjson_inline void append_colon() noexcept; - - /** - * Append a key-value pair to the buffer. - * The key is escaped and surrounded by double quotes. - * The value is escaped if it is a string. - */ - template<typename key_type, typename value_type> - simdjson_inline void append_key_value(key_type key, value_type value) noexcept; -#if SIMDJSON_SUPPORTS_CONCEPTS - template<constevalutil::fixed_string key, typename value_type> - simdjson_inline void append_key_value(value_type value) noexcept; - - // Support for optional types (std::optional, etc.) - template <concepts::optional_type T> - requires(!require_custom_serialization<T>) - simdjson_inline void append(const T &opt); - - template <typename T> - requires(require_custom_serialization<T>) - simdjson_inline void append(T &&val); - - // Support for string-like types - template <typename T> - requires(std::is_convertible<T, std::string_view>::value || - std::is_same<T, const char*>::value ) - simdjson_inline void append(const T &value); -#endif -#if SIMDJSON_SUPPORTS_RANGES && SIMDJSON_SUPPORTS_CONCEPTS - // Support for range-based appending (std::ranges::view, etc.) - template <std::ranges::range R> -requires (!std::is_convertible<R, std::string_view>::value && !require_custom_serialization<R>) - simdjson_inline void append(const R &range) noexcept; -#endif - /** - * Append the std::string_view directly, without escaping. - * There is no UTF-8 validation. - */ - simdjson_inline void append_raw(std::string_view input) noexcept; - - /** - * Append len characters from str. - * There is no UTF-8 validation. - */ - simdjson_inline void append_raw(const char *str, size_t len) noexcept; -#if SIMDJSON_EXCEPTIONS - /** - * Creates an std::string from the written JSON buffer. - * Throws if memory allocation failed - * - * The result may not be valid UTF-8 if some of your content was not valid UTF-8. - * Use validate_unicode() to check the content if needed. - */ - simdjson_inline operator std::string() const noexcept(false); - - /** - * Creates an std::string_view from the written JSON buffer. - * Throws if memory allocation failed. - * - * The result may not be valid UTF-8 if some of your content was not valid UTF-8. - * Use validate_unicode() to check the content if needed. - */ - simdjson_inline operator std::string_view() const noexcept(false) simdjson_lifetime_bound; -#endif - - /** - * Returns a view on the written JSON buffer. Returns an error - * if memory allocation failed. - * - * The result may not be valid UTF-8 if some of your content was not valid UTF-8. - * Use validate_unicode() to check the content. - */ - simdjson_inline simdjson_result<std::string_view> view() const noexcept; - - /** - * Appends the null character to the buffer and returns - * a pointer to the beginning of the written JSON buffer. - * Returns an error if memory allocation failed. - * The result is null-terminated. - * - * The result may not be valid UTF-8 if some of your content was not valid UTF-8. - * Use validate_unicode() to check the content. - */ - simdjson_inline simdjson_result<const char *> c_str() noexcept; - - /** - * Return true if the content is valid UTF-8. - */ - simdjson_inline bool validate_unicode() const noexcept; - - /** - * Returns the current size of the written JSON buffer. - * If an error occurred, returns 0. - */ - simdjson_inline size_t size() const noexcept; - -private: - /** - * Returns true if we can write at least upcoming_bytes bytes. - * The underlying buffer is reallocated if needed. It is designed - * to be called before writing to the buffer. It should be fast. - */ - simdjson_inline bool capacity_check(size_t upcoming_bytes); - - /** - * Grow the buffer to at least desired_capacity bytes. - * If the allocation fails, is_valid is set to false. We expect - * that this function would not be repeatedly called. - */ - simdjson_inline void grow_buffer(size_t desired_capacity); - - /** - * We use this helper function to make sure that is_valid is kept consistent. - */ - simdjson_inline void set_valid(bool valid) noexcept; - - std::unique_ptr<char[]> buffer{}; - size_t position{0}; - size_t capacity{0}; - bool is_valid{true}; -}; - - - -} -} - - -#if !SIMDJSON_STATIC_REFLECTION -// fallback implementation until we have static reflection -template <class Z> -simdjson_warn_unused simdjson_result<std::string> to_json(const Z &z, size_t initial_capacity = simdjson::fallback::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { - simdjson::fallback::builder::string_builder b(initial_capacity); - b.append(z); - std::string_view s; - auto e = b.view().get(s); - if(e) { return e; } - return std::string(s); -} -template <class Z> -simdjson_warn_unused simdjson_error to_json(const Z &z, std::string &s, size_t initial_capacity = simdjson::fallback::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { - simdjson::fallback::builder::string_builder b(initial_capacity); - b.append(z); - std::string_view sv; - auto e = b.view().get(sv); - if(e) { return e; } - s.assign(sv.data(), sv.size()); - return simdjson::SUCCESS; -} -#endif - -#if SIMDJSON_SUPPORTS_CONCEPTS -#endif // SIMDJSON_SUPPORTS_CONCEPTS - -} // namespace simdjson - -#endif // SIMDJSON_GENERIC_STRING_BUILDER_H -/* end file simdjson/generic/ondemand/json_string_builder.h for fallback */ +/* end file simdjson/generic/ondemand/parser.h for haswell */ // All other declarations -/* including simdjson/generic/ondemand/array.h for fallback: #include "simdjson/generic/ondemand/array.h" */ -/* begin file simdjson/generic/ondemand/array.h for fallback */ +/* including simdjson/generic/ondemand/array.h for haswell: #include "simdjson/generic/ondemand/array.h" */ +/* begin file simdjson/generic/ondemand/array.h for haswell */ #ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -51932,7 +91862,7 @@ simdjson_warn_unused simdjson_error to_json(const Z &z, std::string &s, size_t i /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace fallback { +namespace haswell { namespace ondemand { /** @@ -52152,27 +92082,27 @@ class array { }; } // namespace ondemand -} // namespace fallback +} // namespace haswell } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<fallback::ondemand::array> : public fallback::implementation_simdjson_result_base<fallback::ondemand::array> { +struct simdjson_result<haswell::ondemand::array> : public haswell::implementation_simdjson_result_base<haswell::ondemand::array> { public: - simdjson_inline simdjson_result(fallback::ondemand::array &&value) noexcept; ///< @private + simdjson_inline simdjson_result(haswell::ondemand::array &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; - simdjson_inline simdjson_result<fallback::ondemand::array_iterator> begin() noexcept; - simdjson_inline simdjson_result<fallback::ondemand::array_iterator> end() noexcept; + simdjson_inline simdjson_result<haswell::ondemand::array_iterator> begin() noexcept; + simdjson_inline simdjson_result<haswell::ondemand::array_iterator> end() noexcept; inline simdjson_result<size_t> count_elements() & noexcept; inline simdjson_result<bool> is_empty() & noexcept; inline simdjson_result<bool> reset() & noexcept; - simdjson_inline simdjson_result<fallback::ondemand::value> at(size_t index) noexcept; - simdjson_inline simdjson_result<fallback::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result<fallback::ondemand::value> at_path(std::string_view json_path) noexcept; - simdjson_inline simdjson_result<std::vector<fallback::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<haswell::ondemand::value> at(size_t index) noexcept; + simdjson_inline simdjson_result<haswell::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result<haswell::ondemand::value> at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<std::vector<haswell::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; simdjson_inline simdjson_result<std::string_view> raw_json() noexcept; #if SIMDJSON_SUPPORTS_CONCEPTS // TODO: move this code into object-inl.h @@ -52180,7 +92110,7 @@ struct simdjson_result<fallback::ondemand::array> : public fallback::implementat template<typename T> simdjson_inline simdjson_result<T> get() noexcept { if (error()) { return error(); } - if constexpr (std::is_same_v<T, fallback::ondemand::array>) { + if constexpr (std::is_same_v<T, haswell::ondemand::array>) { return first; } return first.get<T>(); @@ -52188,7 +92118,7 @@ struct simdjson_result<fallback::ondemand::array> : public fallback::implementat template<typename T> simdjson_warn_unused simdjson_inline error_code get(T& out) noexcept { if (error()) { return error(); } - if constexpr (std::is_same_v<T, fallback::ondemand::array>) { + if constexpr (std::is_same_v<T, haswell::ondemand::array>) { out = first; } else { SIMDJSON_TRY( first.get<T>(out) ); @@ -52201,13 +92131,14 @@ struct simdjson_result<fallback::ondemand::array> : public fallback::implementat } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_H -/* end file simdjson/generic/ondemand/array.h for fallback */ -/* including simdjson/generic/ondemand/array_iterator.h for fallback: #include "simdjson/generic/ondemand/array_iterator.h" */ -/* begin file simdjson/generic/ondemand/array_iterator.h for fallback */ +/* end file simdjson/generic/ondemand/array.h for haswell */ +/* including simdjson/generic/ondemand/array_iterator.h for haswell: #include "simdjson/generic/ondemand/array_iterator.h" */ +/* begin file simdjson/generic/ondemand/array_iterator.h for haswell */ #ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ /* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H */ +/* amalgamation skipped (editor-only): #include <iterator> */ /* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */ @@ -52215,7 +92146,7 @@ struct simdjson_result<fallback::ondemand::array> : public fallback::implementat namespace simdjson { -namespace fallback { +namespace haswell { namespace ondemand { /** @@ -52223,11 +92154,17 @@ namespace ondemand { * * This is an input_iterator, meaning: * - It is forward-only - * - * must be called exactly once per element. + * - * must be called at most once per element. * - ++ must be called exactly once in between each * (*, ++, *, ++, * ...) */ class array_iterator { public: + using iterator_category = std::input_iterator_tag; + using value_type = simdjson_result<value>; + using difference_type = std::ptrdiff_t; + using pointer = void; + using reference = value_type; + /** Create a new, invalid array iterator. */ simdjson_inline array_iterator() noexcept = default; @@ -52271,6 +92208,9 @@ class array_iterator { simdjson_warn_unused simdjson_inline bool at_end() const noexcept; private: +#if SIMDJSON_DEVELOPMENT_CHECKS + bool has_been_referenced{false}; +#endif value_iterator iter{}; simdjson_inline array_iterator(const value_iterator &iter) noexcept; @@ -52281,14 +92221,20 @@ class array_iterator { }; } // namespace ondemand -} // namespace fallback +} // namespace haswell } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<fallback::ondemand::array_iterator> : public fallback::implementation_simdjson_result_base<fallback::ondemand::array_iterator> { - simdjson_inline simdjson_result(fallback::ondemand::array_iterator &&value) noexcept; ///< @private +struct simdjson_result<haswell::ondemand::array_iterator> : public haswell::implementation_simdjson_result_base<haswell::ondemand::array_iterator> { + using iterator_category = std::input_iterator_tag; + using value_type = simdjson_result<haswell::ondemand::value>; + using difference_type = std::ptrdiff_t; + using pointer = void; + using reference = value_type; + + simdjson_inline simdjson_result(haswell::ondemand::array_iterator &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; @@ -52296,10 +92242,10 @@ struct simdjson_result<fallback::ondemand::array_iterator> : public fallback::im // Iterator interface // - simdjson_inline simdjson_result<fallback::ondemand::value> operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. - simdjson_inline bool operator==(const simdjson_result<fallback::ondemand::array_iterator> &) const noexcept; - simdjson_inline bool operator!=(const simdjson_result<fallback::ondemand::array_iterator> &) const noexcept; - simdjson_inline simdjson_result<fallback::ondemand::array_iterator> &operator++() noexcept; + simdjson_inline simdjson_result<haswell::ondemand::value> operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. + simdjson_inline bool operator==(const simdjson_result<haswell::ondemand::array_iterator> &) const noexcept; + simdjson_inline bool operator!=(const simdjson_result<haswell::ondemand::array_iterator> &) const noexcept; + simdjson_inline simdjson_result<haswell::ondemand::array_iterator> &operator++() noexcept; simdjson_warn_unused simdjson_inline bool at_end() const noexcept; }; @@ -52307,9 +92253,9 @@ struct simdjson_result<fallback::ondemand::array_iterator> : public fallback::im } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H -/* end file simdjson/generic/ondemand/array_iterator.h for fallback */ -/* including simdjson/generic/ondemand/document.h for fallback: #include "simdjson/generic/ondemand/document.h" */ -/* begin file simdjson/generic/ondemand/document.h for fallback */ +/* end file simdjson/generic/ondemand/array_iterator.h for haswell */ +/* including simdjson/generic/ondemand/document.h for haswell: #include "simdjson/generic/ondemand/document.h" */ +/* begin file simdjson/generic/ondemand/document.h for haswell */ #ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -52323,7 +92269,7 @@ struct simdjson_result<fallback::ondemand::array_iterator> : public fallback::im namespace simdjson { -namespace fallback { +namespace haswell { namespace ondemand { /** @@ -53275,21 +93221,21 @@ class document_reference { document *doc{nullptr}; }; } // namespace ondemand -} // namespace fallback +} // namespace haswell } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<fallback::ondemand::document> : public fallback::implementation_simdjson_result_base<fallback::ondemand::document> { +struct simdjson_result<haswell::ondemand::document> : public haswell::implementation_simdjson_result_base<haswell::ondemand::document> { public: - simdjson_inline simdjson_result(fallback::ondemand::document &&value) noexcept; ///< @private + simdjson_inline simdjson_result(haswell::ondemand::document &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; simdjson_inline error_code rewind() noexcept; - simdjson_inline simdjson_result<fallback::ondemand::array> get_array() & noexcept; - simdjson_inline simdjson_result<fallback::ondemand::object> get_object() & noexcept; + simdjson_inline simdjson_result<haswell::ondemand::array> get_array() & noexcept; + simdjson_inline simdjson_result<haswell::ondemand::object> get_object() & noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64() noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64_in_string() noexcept; simdjson_inline simdjson_result<int64_t> get_int64() noexcept; @@ -53300,9 +93246,9 @@ struct simdjson_result<fallback::ondemand::document> : public fallback::implemen template <typename string_type> simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result<std::string_view> get_wobbly_string() noexcept; - simdjson_inline simdjson_result<fallback::ondemand::raw_json_string> get_raw_json_string() noexcept; + simdjson_inline simdjson_result<haswell::ondemand::raw_json_string> get_raw_json_string() noexcept; simdjson_inline simdjson_result<bool> get_bool() noexcept; - simdjson_inline simdjson_result<fallback::ondemand::value> get_value() noexcept; + simdjson_inline simdjson_result<haswell::ondemand::value> get_value() noexcept; simdjson_inline simdjson_result<bool> is_null() noexcept; template<typename T> simdjson_inline simdjson_result<T> get() & noexcept; @@ -53312,33 +93258,33 @@ struct simdjson_result<fallback::ondemand::document> : public fallback::implemen template<typename T> simdjson_inline error_code get(T &out) && noexcept; #if SIMDJSON_EXCEPTIONS - using fallback::implementation_simdjson_result_base<fallback::ondemand::document>::operator*; - using fallback::implementation_simdjson_result_base<fallback::ondemand::document>::operator->; - template <class T, typename std::enable_if<std::is_same<T, fallback::ondemand::document>::value == false>::type> + using haswell::implementation_simdjson_result_base<haswell::ondemand::document>::operator*; + using haswell::implementation_simdjson_result_base<haswell::ondemand::document>::operator->; + template <class T, typename std::enable_if<std::is_same<T, haswell::ondemand::document>::value == false>::type> explicit simdjson_inline operator T() noexcept(false); - simdjson_inline operator fallback::ondemand::array() & noexcept(false); - simdjson_inline operator fallback::ondemand::object() & noexcept(false); + simdjson_inline operator haswell::ondemand::array() & noexcept(false); + simdjson_inline operator haswell::ondemand::object() & noexcept(false); simdjson_inline operator uint64_t() noexcept(false); simdjson_inline operator int64_t() noexcept(false); simdjson_inline operator double() noexcept(false); simdjson_inline operator std::string_view() noexcept(false); - simdjson_inline operator fallback::ondemand::raw_json_string() noexcept(false); + simdjson_inline operator haswell::ondemand::raw_json_string() noexcept(false); simdjson_inline operator bool() noexcept(false); - simdjson_inline operator fallback::ondemand::value() noexcept(false); + simdjson_inline operator haswell::ondemand::value() noexcept(false); #endif simdjson_inline simdjson_result<size_t> count_elements() & noexcept; simdjson_inline simdjson_result<size_t> count_fields() & noexcept; - simdjson_inline simdjson_result<fallback::ondemand::value> at(size_t index) & noexcept; - simdjson_inline simdjson_result<fallback::ondemand::array_iterator> begin() & noexcept; - simdjson_inline simdjson_result<fallback::ondemand::array_iterator> end() & noexcept; - simdjson_inline simdjson_result<fallback::ondemand::value> find_field(std::string_view key) & noexcept; - simdjson_inline simdjson_result<fallback::ondemand::value> find_field(const char *key) & noexcept; - simdjson_inline simdjson_result<fallback::ondemand::value> operator[](std::string_view key) & noexcept; - simdjson_inline simdjson_result<fallback::ondemand::value> operator[](const char *key) & noexcept; - simdjson_result<fallback::ondemand::value> operator[](int) & noexcept = delete; - simdjson_inline simdjson_result<fallback::ondemand::value> find_field_unordered(std::string_view key) & noexcept; - simdjson_inline simdjson_result<fallback::ondemand::value> find_field_unordered(const char *key) & noexcept; - simdjson_inline simdjson_result<fallback::ondemand::json_type> type() noexcept; + simdjson_inline simdjson_result<haswell::ondemand::value> at(size_t index) & noexcept; + simdjson_inline simdjson_result<haswell::ondemand::array_iterator> begin() & noexcept; + simdjson_inline simdjson_result<haswell::ondemand::array_iterator> end() & noexcept; + simdjson_inline simdjson_result<haswell::ondemand::value> find_field(std::string_view key) & noexcept; + simdjson_inline simdjson_result<haswell::ondemand::value> find_field(const char *key) & noexcept; + simdjson_inline simdjson_result<haswell::ondemand::value> operator[](std::string_view key) & noexcept; + simdjson_inline simdjson_result<haswell::ondemand::value> operator[](const char *key) & noexcept; + simdjson_result<haswell::ondemand::value> operator[](int) & noexcept = delete; + simdjson_inline simdjson_result<haswell::ondemand::value> find_field_unordered(std::string_view key) & noexcept; + simdjson_inline simdjson_result<haswell::ondemand::value> find_field_unordered(const char *key) & noexcept; + simdjson_inline simdjson_result<haswell::ondemand::json_type> type() noexcept; simdjson_inline simdjson_result<bool> is_scalar() noexcept; simdjson_inline simdjson_result<bool> is_string() noexcept; simdjson_inline simdjson_result<const char *> current_location() noexcept; @@ -53346,14 +93292,14 @@ struct simdjson_result<fallback::ondemand::document> : public fallback::implemen simdjson_inline bool at_end() const noexcept; simdjson_inline bool is_negative() noexcept; simdjson_inline simdjson_result<bool> is_integer() noexcept; - simdjson_inline simdjson_result<fallback::number_type> get_number_type() noexcept; - simdjson_inline simdjson_result<fallback::ondemand::number> get_number() noexcept; + simdjson_inline simdjson_result<haswell::number_type> get_number_type() noexcept; + simdjson_inline simdjson_result<haswell::ondemand::number> get_number() noexcept; /** @copydoc simdjson_inline std::string_view document::raw_json_token() const noexcept */ simdjson_inline simdjson_result<std::string_view> raw_json_token() noexcept; - simdjson_inline simdjson_result<fallback::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result<fallback::ondemand::value> at_path(std::string_view json_path) noexcept; - simdjson_inline simdjson_result<std::vector<fallback::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<haswell::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result<haswell::ondemand::value> at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<std::vector<haswell::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; #if SIMDJSON_STATIC_REFLECTION template<constevalutil::fixed_string... FieldNames, typename T> requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) @@ -53369,14 +93315,14 @@ struct simdjson_result<fallback::ondemand::document> : public fallback::implemen namespace simdjson { template<> -struct simdjson_result<fallback::ondemand::document_reference> : public fallback::implementation_simdjson_result_base<fallback::ondemand::document_reference> { +struct simdjson_result<haswell::ondemand::document_reference> : public haswell::implementation_simdjson_result_base<haswell::ondemand::document_reference> { public: - simdjson_inline simdjson_result(fallback::ondemand::document_reference value, error_code error) noexcept; + simdjson_inline simdjson_result(haswell::ondemand::document_reference value, error_code error) noexcept; simdjson_inline simdjson_result() noexcept = default; simdjson_inline error_code rewind() noexcept; - simdjson_inline simdjson_result<fallback::ondemand::array> get_array() & noexcept; - simdjson_inline simdjson_result<fallback::ondemand::object> get_object() & noexcept; + simdjson_inline simdjson_result<haswell::ondemand::array> get_array() & noexcept; + simdjson_inline simdjson_result<haswell::ondemand::object> get_object() & noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64() noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64_in_string() noexcept; simdjson_inline simdjson_result<int64_t> get_int64() noexcept; @@ -53387,9 +93333,9 @@ struct simdjson_result<fallback::ondemand::document_reference> : public fallback template <typename string_type> simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result<std::string_view> get_wobbly_string() noexcept; - simdjson_inline simdjson_result<fallback::ondemand::raw_json_string> get_raw_json_string() noexcept; + simdjson_inline simdjson_result<haswell::ondemand::raw_json_string> get_raw_json_string() noexcept; simdjson_inline simdjson_result<bool> get_bool() noexcept; - simdjson_inline simdjson_result<fallback::ondemand::value> get_value() noexcept; + simdjson_inline simdjson_result<haswell::ondemand::value> get_value() noexcept; simdjson_inline simdjson_result<bool> is_null() noexcept; template<typename T> simdjson_inline simdjson_result<T> get() & noexcept; @@ -53400,43 +93346,43 @@ struct simdjson_result<fallback::ondemand::document_reference> : public fallback #if SIMDJSON_EXCEPTIONS template <class T> explicit simdjson_inline operator T() noexcept(false); - simdjson_inline operator fallback::ondemand::array() & noexcept(false); - simdjson_inline operator fallback::ondemand::object() & noexcept(false); + simdjson_inline operator haswell::ondemand::array() & noexcept(false); + simdjson_inline operator haswell::ondemand::object() & noexcept(false); simdjson_inline operator uint64_t() noexcept(false); simdjson_inline operator int64_t() noexcept(false); simdjson_inline operator double() noexcept(false); simdjson_inline operator std::string_view() noexcept(false); - simdjson_inline operator fallback::ondemand::raw_json_string() noexcept(false); + simdjson_inline operator haswell::ondemand::raw_json_string() noexcept(false); simdjson_inline operator bool() noexcept(false); - simdjson_inline operator fallback::ondemand::value() noexcept(false); + simdjson_inline operator haswell::ondemand::value() noexcept(false); #endif simdjson_inline simdjson_result<size_t> count_elements() & noexcept; simdjson_inline simdjson_result<size_t> count_fields() & noexcept; - simdjson_inline simdjson_result<fallback::ondemand::value> at(size_t index) & noexcept; - simdjson_inline simdjson_result<fallback::ondemand::array_iterator> begin() & noexcept; - simdjson_inline simdjson_result<fallback::ondemand::array_iterator> end() & noexcept; - simdjson_inline simdjson_result<fallback::ondemand::value> find_field(std::string_view key) & noexcept; - simdjson_inline simdjson_result<fallback::ondemand::value> find_field(const char *key) & noexcept; - simdjson_inline simdjson_result<fallback::ondemand::value> operator[](std::string_view key) & noexcept; - simdjson_inline simdjson_result<fallback::ondemand::value> operator[](const char *key) & noexcept; - simdjson_result<fallback::ondemand::value> operator[](int) & noexcept = delete; - simdjson_inline simdjson_result<fallback::ondemand::value> find_field_unordered(std::string_view key) & noexcept; - simdjson_inline simdjson_result<fallback::ondemand::value> find_field_unordered(const char *key) & noexcept; - simdjson_inline simdjson_result<fallback::ondemand::json_type> type() noexcept; + simdjson_inline simdjson_result<haswell::ondemand::value> at(size_t index) & noexcept; + simdjson_inline simdjson_result<haswell::ondemand::array_iterator> begin() & noexcept; + simdjson_inline simdjson_result<haswell::ondemand::array_iterator> end() & noexcept; + simdjson_inline simdjson_result<haswell::ondemand::value> find_field(std::string_view key) & noexcept; + simdjson_inline simdjson_result<haswell::ondemand::value> find_field(const char *key) & noexcept; + simdjson_inline simdjson_result<haswell::ondemand::value> operator[](std::string_view key) & noexcept; + simdjson_inline simdjson_result<haswell::ondemand::value> operator[](const char *key) & noexcept; + simdjson_result<haswell::ondemand::value> operator[](int) & noexcept = delete; + simdjson_inline simdjson_result<haswell::ondemand::value> find_field_unordered(std::string_view key) & noexcept; + simdjson_inline simdjson_result<haswell::ondemand::value> find_field_unordered(const char *key) & noexcept; + simdjson_inline simdjson_result<haswell::ondemand::json_type> type() noexcept; simdjson_inline simdjson_result<bool> is_scalar() noexcept; simdjson_inline simdjson_result<bool> is_string() noexcept; simdjson_inline simdjson_result<const char *> current_location() noexcept; simdjson_inline simdjson_result<int32_t> current_depth() const noexcept; simdjson_inline simdjson_result<bool> is_negative() noexcept; simdjson_inline simdjson_result<bool> is_integer() noexcept; - simdjson_inline simdjson_result<fallback::number_type> get_number_type() noexcept; - simdjson_inline simdjson_result<fallback::ondemand::number> get_number() noexcept; + simdjson_inline simdjson_result<haswell::number_type> get_number_type() noexcept; + simdjson_inline simdjson_result<haswell::ondemand::number> get_number() noexcept; /** @copydoc simdjson_inline std::string_view document_reference::raw_json_token() const noexcept */ simdjson_inline simdjson_result<std::string_view> raw_json_token() noexcept; - simdjson_inline simdjson_result<fallback::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result<fallback::ondemand::value> at_path(std::string_view json_path) noexcept; - simdjson_inline simdjson_result<std::vector<fallback::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<haswell::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result<haswell::ondemand::value> at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<std::vector<haswell::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; #if SIMDJSON_STATIC_REFLECTION template<constevalutil::fixed_string... FieldNames, typename T> requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) @@ -53448,9 +93394,9 @@ struct simdjson_result<fallback::ondemand::document_reference> : public fallback } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_H -/* end file simdjson/generic/ondemand/document.h for fallback */ -/* including simdjson/generic/ondemand/document_stream.h for fallback: #include "simdjson/generic/ondemand/document_stream.h" */ -/* begin file simdjson/generic/ondemand/document_stream.h for fallback */ +/* end file simdjson/generic/ondemand/document.h for haswell */ +/* including simdjson/generic/ondemand/document_stream.h for haswell: #include "simdjson/generic/ondemand/document_stream.h" */ +/* begin file simdjson/generic/ondemand/document_stream.h for haswell */ #ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -53468,7 +93414,7 @@ struct simdjson_result<fallback::ondemand::document_reference> : public fallback #endif namespace simdjson { -namespace fallback { +namespace haswell { namespace ondemand { #ifdef SIMDJSON_THREADS_ENABLED @@ -53781,14 +93727,14 @@ class document_stream { }; // document_stream } // namespace ondemand -} // namespace fallback +} // namespace haswell } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<fallback::ondemand::document_stream> : public fallback::implementation_simdjson_result_base<fallback::ondemand::document_stream> { +struct simdjson_result<haswell::ondemand::document_stream> : public haswell::implementation_simdjson_result_base<haswell::ondemand::document_stream> { public: - simdjson_inline simdjson_result(fallback::ondemand::document_stream &&value) noexcept; ///< @private + simdjson_inline simdjson_result(haswell::ondemand::document_stream &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; }; @@ -53796,9 +93742,9 @@ struct simdjson_result<fallback::ondemand::document_stream> : public fallback::i } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_H -/* end file simdjson/generic/ondemand/document_stream.h for fallback */ -/* including simdjson/generic/ondemand/field.h for fallback: #include "simdjson/generic/ondemand/field.h" */ -/* begin file simdjson/generic/ondemand/field.h for fallback */ +/* end file simdjson/generic/ondemand/document_stream.h for haswell */ +/* including simdjson/generic/ondemand/field.h for haswell: #include "simdjson/generic/ondemand/field.h" */ +/* begin file simdjson/generic/ondemand/field.h for haswell */ #ifndef SIMDJSON_GENERIC_ONDEMAND_FIELD_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -53810,7 +93756,7 @@ struct simdjson_result<fallback::ondemand::document_stream> : public fallback::i /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace fallback { +namespace haswell { namespace ondemand { /** @@ -53888,33 +93834,33 @@ class field : public std::pair<raw_json_string, value> { }; } // namespace ondemand -} // namespace fallback +} // namespace haswell } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<fallback::ondemand::field> : public fallback::implementation_simdjson_result_base<fallback::ondemand::field> { +struct simdjson_result<haswell::ondemand::field> : public haswell::implementation_simdjson_result_base<haswell::ondemand::field> { public: - simdjson_inline simdjson_result(fallback::ondemand::field &&value) noexcept; ///< @private + simdjson_inline simdjson_result(haswell::ondemand::field &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; simdjson_inline simdjson_result<std::string_view> unescaped_key(bool allow_replacement = false) noexcept; template<typename string_type> simdjson_inline error_code unescaped_key(string_type &receiver, bool allow_replacement = false) noexcept; - simdjson_inline simdjson_result<fallback::ondemand::raw_json_string> key() noexcept; + simdjson_inline simdjson_result<haswell::ondemand::raw_json_string> key() noexcept; simdjson_inline simdjson_result<std::string_view> key_raw_json_token() noexcept; simdjson_inline simdjson_result<std::string_view> escaped_key() noexcept; - simdjson_inline simdjson_result<fallback::ondemand::value> value() noexcept; + simdjson_inline simdjson_result<haswell::ondemand::value> value() noexcept; }; } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_FIELD_H -/* end file simdjson/generic/ondemand/field.h for fallback */ -/* including simdjson/generic/ondemand/object.h for fallback: #include "simdjson/generic/ondemand/object.h" */ -/* begin file simdjson/generic/ondemand/object.h for fallback */ +/* end file simdjson/generic/ondemand/field.h for haswell */ +/* including simdjson/generic/ondemand/object.h for haswell: #include "simdjson/generic/ondemand/object.h" */ +/* begin file simdjson/generic/ondemand/object.h for haswell */ #ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -53929,7 +93875,7 @@ struct simdjson_result<fallback::ondemand::field> : public fallback::implementat /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace fallback { +namespace haswell { namespace ondemand { /** @@ -53944,6 +93890,13 @@ class object { */ simdjson_inline object() noexcept = default; + /** + * Get an iterator to the start of the object. We recommend using a range-based for loop. + * + * Using the iterator directly is also possible but error-prone and discouraged. In particular, + * you must dereference the iterator exactly once per iteration (before calling '++'). + * Doing otherwise is unsafe and may lead to errors. You are responsible for ensuring + */ simdjson_inline simdjson_result<object_iterator> begin() noexcept; simdjson_inline simdjson_result<object_iterator> end() noexcept; /** @@ -54216,29 +94169,29 @@ class object { }; } // namespace ondemand -} // namespace fallback +} // namespace haswell } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<fallback::ondemand::object> : public fallback::implementation_simdjson_result_base<fallback::ondemand::object> { +struct simdjson_result<haswell::ondemand::object> : public haswell::implementation_simdjson_result_base<haswell::ondemand::object> { public: - simdjson_inline simdjson_result(fallback::ondemand::object &&value) noexcept; ///< @private + simdjson_inline simdjson_result(haswell::ondemand::object &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; - simdjson_inline simdjson_result<fallback::ondemand::object_iterator> begin() noexcept; - simdjson_inline simdjson_result<fallback::ondemand::object_iterator> end() noexcept; - simdjson_inline simdjson_result<fallback::ondemand::value> find_field(std::string_view key) & noexcept; - simdjson_inline simdjson_result<fallback::ondemand::value> find_field(std::string_view key) && noexcept; - simdjson_inline simdjson_result<fallback::ondemand::value> find_field_unordered(std::string_view key) & noexcept; - simdjson_inline simdjson_result<fallback::ondemand::value> find_field_unordered(std::string_view key) && noexcept; - simdjson_inline simdjson_result<fallback::ondemand::value> operator[](std::string_view key) & noexcept; - simdjson_inline simdjson_result<fallback::ondemand::value> operator[](std::string_view key) && noexcept; - simdjson_inline simdjson_result<fallback::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result<fallback::ondemand::value> at_path(std::string_view json_path) noexcept; - simdjson_inline simdjson_result<std::vector<fallback::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<haswell::ondemand::object_iterator> begin() noexcept; + simdjson_inline simdjson_result<haswell::ondemand::object_iterator> end() noexcept; + simdjson_inline simdjson_result<haswell::ondemand::value> find_field(std::string_view key) & noexcept; + simdjson_inline simdjson_result<haswell::ondemand::value> find_field(std::string_view key) && noexcept; + simdjson_inline simdjson_result<haswell::ondemand::value> find_field_unordered(std::string_view key) & noexcept; + simdjson_inline simdjson_result<haswell::ondemand::value> find_field_unordered(std::string_view key) && noexcept; + simdjson_inline simdjson_result<haswell::ondemand::value> operator[](std::string_view key) & noexcept; + simdjson_inline simdjson_result<haswell::ondemand::value> operator[](std::string_view key) && noexcept; + simdjson_inline simdjson_result<haswell::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result<haswell::ondemand::value> at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<std::vector<haswell::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; inline simdjson_result<bool> reset() noexcept; inline simdjson_result<bool> is_empty() noexcept; inline simdjson_result<size_t> count_fields() & noexcept; @@ -54249,7 +94202,7 @@ struct simdjson_result<fallback::ondemand::object> : public fallback::implementa template<typename T> simdjson_inline simdjson_result<T> get() noexcept { if (error()) { return error(); } - if constexpr (std::is_same_v<T, fallback::ondemand::object>) { + if constexpr (std::is_same_v<T, haswell::ondemand::object>) { return first; } return first.get<T>(); @@ -54257,7 +94210,7 @@ struct simdjson_result<fallback::ondemand::object> : public fallback::implementa template<typename T> simdjson_warn_unused simdjson_inline error_code get(T& out) noexcept { if (error()) { return error(); } - if constexpr (std::is_same_v<T, fallback::ondemand::object>) { + if constexpr (std::is_same_v<T, haswell::ondemand::object>) { out = first; } else { SIMDJSON_TRY( first.get<T>(out) ); @@ -54280,9 +94233,9 @@ struct simdjson_result<fallback::ondemand::object> : public fallback::implementa } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_H -/* end file simdjson/generic/ondemand/object.h for fallback */ -/* including simdjson/generic/ondemand/object_iterator.h for fallback: #include "simdjson/generic/ondemand/object_iterator.h" */ -/* begin file simdjson/generic/ondemand/object_iterator.h for fallback */ +/* end file simdjson/generic/ondemand/object.h for haswell */ +/* including simdjson/generic/ondemand/object_iterator.h for haswell: #include "simdjson/generic/ondemand/object_iterator.h" */ +/* begin file simdjson/generic/ondemand/object_iterator.h for haswell */ #ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -54293,7 +94246,7 @@ struct simdjson_result<fallback::ondemand::object> : public fallback::implementa /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace fallback { +namespace haswell { namespace ondemand { class object_iterator { @@ -54317,9 +94270,14 @@ class object_iterator { // Assumes it's being compared with the end. true if depth >= iter->depth. simdjson_inline bool operator!=(const object_iterator &) const noexcept; // Checks for ']' and ',' + // YOU MUST NOT CALL THIS IF operator* YIELDED AN ERROR. + // YOU MUST NOT CALL THIS WITHOUT A CORRESPONDING operator* CALL. simdjson_inline object_iterator &operator++() noexcept; private: +#if SIMDJSON_DEVELOPMENT_CHECKS + bool has_been_referenced{false}; +#endif /** * The underlying JSON iterator. * @@ -54334,15 +94292,15 @@ class object_iterator { }; } // namespace ondemand -} // namespace fallback +} // namespace haswell } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<fallback::ondemand::object_iterator> : public fallback::implementation_simdjson_result_base<fallback::ondemand::object_iterator> { +struct simdjson_result<haswell::ondemand::object_iterator> : public haswell::implementation_simdjson_result_base<haswell::ondemand::object_iterator> { public: - simdjson_inline simdjson_result(fallback::ondemand::object_iterator &&value) noexcept; ///< @private + simdjson_inline simdjson_result(haswell::ondemand::object_iterator &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; @@ -54351,21 +94309,21 @@ struct simdjson_result<fallback::ondemand::object_iterator> : public fallback::i // // Reads key and value, yielding them to the user. - simdjson_inline simdjson_result<fallback::ondemand::field> operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. + simdjson_inline simdjson_result<haswell::ondemand::field> operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. // Assumes it's being compared with the end. true if depth < iter->depth. - simdjson_inline bool operator==(const simdjson_result<fallback::ondemand::object_iterator> &) const noexcept; + simdjson_inline bool operator==(const simdjson_result<haswell::ondemand::object_iterator> &) const noexcept; // Assumes it's being compared with the end. true if depth >= iter->depth. - simdjson_inline bool operator!=(const simdjson_result<fallback::ondemand::object_iterator> &) const noexcept; + simdjson_inline bool operator!=(const simdjson_result<haswell::ondemand::object_iterator> &) const noexcept; // Checks for ']' and ',' - simdjson_inline simdjson_result<fallback::ondemand::object_iterator> &operator++() noexcept; + simdjson_inline simdjson_result<haswell::ondemand::object_iterator> &operator++() noexcept; }; } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_H -/* end file simdjson/generic/ondemand/object_iterator.h for fallback */ -/* including simdjson/generic/ondemand/serialization.h for fallback: #include "simdjson/generic/ondemand/serialization.h" */ -/* begin file simdjson/generic/ondemand/serialization.h for fallback */ +/* end file simdjson/generic/ondemand/object_iterator.h for haswell */ +/* including simdjson/generic/ondemand/serialization.h for haswell: #include "simdjson/generic/ondemand/serialization.h" */ +/* begin file simdjson/generic/ondemand/serialization.h for haswell */ #ifndef SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -54379,30 +94337,30 @@ namespace simdjson { * contains JSON text that is suitable to be parsed as JSON again. It does not * validate the content. */ -inline simdjson_result<std::string_view> to_json_string(fallback::ondemand::document& x) noexcept; +inline simdjson_result<std::string_view> to_json_string(haswell::ondemand::document& x) noexcept; /** * Create a string-view instance out of a value instance. The string-view instance * contains JSON text that is suitable to be parsed as JSON again. The value must * not have been accessed previously. It does not * validate the content. */ -inline simdjson_result<std::string_view> to_json_string(fallback::ondemand::value& x) noexcept; +inline simdjson_result<std::string_view> to_json_string(haswell::ondemand::value& x) noexcept; /** * Create a string-view instance out of an object instance. The string-view instance * contains JSON text that is suitable to be parsed as JSON again. It does not * validate the content. */ -inline simdjson_result<std::string_view> to_json_string(fallback::ondemand::object& x) noexcept; +inline simdjson_result<std::string_view> to_json_string(haswell::ondemand::object& x) noexcept; /** * Create a string-view instance out of an array instance. The string-view instance * contains JSON text that is suitable to be parsed as JSON again. It does not * validate the content. */ -inline simdjson_result<std::string_view> to_json_string(fallback::ondemand::array& x) noexcept; -inline simdjson_result<std::string_view> to_json_string(simdjson_result<fallback::ondemand::document> x); -inline simdjson_result<std::string_view> to_json_string(simdjson_result<fallback::ondemand::value> x); -inline simdjson_result<std::string_view> to_json_string(simdjson_result<fallback::ondemand::object> x); -inline simdjson_result<std::string_view> to_json_string(simdjson_result<fallback::ondemand::array> x); +inline simdjson_result<std::string_view> to_json_string(haswell::ondemand::array& x) noexcept; +inline simdjson_result<std::string_view> to_json_string(simdjson_result<haswell::ondemand::document> x); +inline simdjson_result<std::string_view> to_json_string(simdjson_result<haswell::ondemand::value> x); +inline simdjson_result<std::string_view> to_json_string(simdjson_result<haswell::ondemand::object> x); +inline simdjson_result<std::string_view> to_json_string(simdjson_result<haswell::ondemand::array> x); #if SIMDJSON_STATIC_REFLECTION /** @@ -54410,10 +94368,10 @@ inline simdjson_result<std::string_view> to_json_string(simdjson_result<fallback * Only available when SIMDJSON_STATIC_REFLECTION is enabled. */ template<typename T> - requires(!std::same_as<T, fallback::ondemand::document> && - !std::same_as<T, fallback::ondemand::value> && - !std::same_as<T, fallback::ondemand::object> && - !std::same_as<T, fallback::ondemand::array>) + requires(!std::same_as<T, haswell::ondemand::document> && + !std::same_as<T, haswell::ondemand::value> && + !std::same_as<T, haswell::ondemand::object> && + !std::same_as<T, haswell::ondemand::array>) inline std::string to_json_string(const T& obj); #endif @@ -54426,7 +94384,7 @@ inline std::string to_json_string(const T& obj); * Credit: @madhur4127 * See https://github.com/simdjson/simdjson/issues/1768 */ -namespace simdjson { namespace fallback { namespace ondemand { +namespace simdjson { namespace haswell { namespace ondemand { /** * Print JSON to an output stream. It does not @@ -54436,9 +94394,9 @@ namespace simdjson { namespace fallback { namespace ondemand { * @param value The element. * @throw if there is an error with the underlying output stream. simdjson itself will not throw. */ -inline std::ostream& operator<<(std::ostream& out, simdjson::fallback::ondemand::value x); +inline std::ostream& operator<<(std::ostream& out, simdjson::haswell::ondemand::value x); #if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::fallback::ondemand::value> x); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::haswell::ondemand::value> x); #endif /** * Print JSON to an output stream. It does not @@ -54448,9 +94406,9 @@ inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<sim * @param value The array. * @throw if there is an error with the underlying output stream. simdjson itself will not throw. */ -inline std::ostream& operator<<(std::ostream& out, simdjson::fallback::ondemand::array value); +inline std::ostream& operator<<(std::ostream& out, simdjson::haswell::ondemand::array value); #if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::fallback::ondemand::array> x); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::haswell::ondemand::array> x); #endif /** * Print JSON to an output stream. It does not @@ -54460,13 +94418,13 @@ inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<sim * @param value The array. * @throw if there is an error with the underlying output stream. simdjson itself will not throw. */ -inline std::ostream& operator<<(std::ostream& out, simdjson::fallback::ondemand::document& value); +inline std::ostream& operator<<(std::ostream& out, simdjson::haswell::ondemand::document& value); #if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::fallback::ondemand::document>&& x); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::haswell::ondemand::document>&& x); #endif -inline std::ostream& operator<<(std::ostream& out, simdjson::fallback::ondemand::document_reference& value); +inline std::ostream& operator<<(std::ostream& out, simdjson::haswell::ondemand::document_reference& value); #if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::fallback::ondemand::document_reference>&& x); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::haswell::ondemand::document_reference>&& x); #endif /** * Print JSON to an output stream. It does not @@ -54476,18 +94434,18 @@ inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<sim * @param value The object. * @throw if there is an error with the underlying output stream. simdjson itself will not throw. */ -inline std::ostream& operator<<(std::ostream& out, simdjson::fallback::ondemand::object value); +inline std::ostream& operator<<(std::ostream& out, simdjson::haswell::ondemand::object value); #if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::fallback::ondemand::object> x); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::haswell::ondemand::object> x); #endif -}}} // namespace simdjson::fallback::ondemand +}}} // namespace simdjson::haswell::ondemand #endif // SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_H -/* end file simdjson/generic/ondemand/serialization.h for fallback */ +/* end file simdjson/generic/ondemand/serialization.h for haswell */ // Deserialization for standard types -/* including simdjson/generic/ondemand/std_deserialize.h for fallback: #include "simdjson/generic/ondemand/std_deserialize.h" */ -/* begin file simdjson/generic/ondemand/std_deserialize.h for fallback */ +/* including simdjson/generic/ondemand/std_deserialize.h for haswell: #include "simdjson/generic/ondemand/std_deserialize.h" */ +/* begin file simdjson/generic/ondemand/std_deserialize.h for haswell */ #if SIMDJSON_SUPPORTS_CONCEPTS #ifndef SIMDJSON_ONDEMAND_DESERIALIZE_H @@ -54586,8 +94544,8 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { static_assert( std::is_default_constructible_v<value_type>, "The specified type inside the container must default constructible."); - fallback::ondemand::array arr; - if constexpr (std::is_same_v<std::remove_cvref_t<ValT>, fallback::ondemand::array>) { + haswell::ondemand::array arr; + if constexpr (std::is_same_v<std::remove_cvref_t<ValT>, haswell::ondemand::array>) { arr = val; } else { SIMDJSON_TRY(val.get_array().get(arr)); @@ -54631,7 +94589,7 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { static_assert( std::is_default_constructible_v<value_type>, "The specified value type inside the container must default constructible."); - fallback::ondemand::object obj; + haswell::ondemand::object obj; SIMDJSON_TRY(val.get_object().get(obj)); for (auto field : obj) { std::string_view key; @@ -54649,7 +94607,7 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { } template <concepts::string_view_keyed_map T> -error_code tag_invoke(deserialize_tag, fallback::ondemand::object &obj, T &out) noexcept { +error_code tag_invoke(deserialize_tag, haswell::ondemand::object &obj, T &out) noexcept { using value_type = typename std::remove_cvref_t<T>::mapped_type; out.clear(); @@ -54657,7 +94615,7 @@ error_code tag_invoke(deserialize_tag, fallback::ondemand::object &obj, T &out) std::string_view key; SIMDJSON_TRY(field.unescaped_key().get(key)); - fallback::ondemand::value value_obj; + haswell::ondemand::value value_obj; SIMDJSON_TRY(field.value().get(value_obj)); value_type this_value; @@ -54668,22 +94626,22 @@ error_code tag_invoke(deserialize_tag, fallback::ondemand::object &obj, T &out) } template <concepts::string_view_keyed_map T> -error_code tag_invoke(deserialize_tag, fallback::ondemand::value &val, T &out) noexcept { - fallback::ondemand::object obj; +error_code tag_invoke(deserialize_tag, haswell::ondemand::value &val, T &out) noexcept { + haswell::ondemand::object obj; SIMDJSON_TRY(val.get_object().get(obj)); return simdjson::deserialize(obj, out); } template <concepts::string_view_keyed_map T> -error_code tag_invoke(deserialize_tag, fallback::ondemand::document &doc, T &out) noexcept { - fallback::ondemand::object obj; +error_code tag_invoke(deserialize_tag, haswell::ondemand::document &doc, T &out) noexcept { + haswell::ondemand::object obj; SIMDJSON_TRY(doc.get_object().get(obj)); return simdjson::deserialize(obj, out); } template <concepts::string_view_keyed_map T> -error_code tag_invoke(deserialize_tag, fallback::ondemand::document_reference &doc, T &out) noexcept { - fallback::ondemand::object obj; +error_code tag_invoke(deserialize_tag, haswell::ondemand::document_reference &doc, T &out) noexcept { + haswell::ondemand::object obj; SIMDJSON_TRY(doc.get_object().get(obj)); return simdjson::deserialize(obj, out); } @@ -54760,8 +94718,8 @@ constexpr bool user_defined_type = (std::is_class_v<T> template <typename T, typename ValT> requires(user_defined_type<T> && std::is_class_v<T>) error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept { - fallback::ondemand::object obj; - if constexpr (std::is_same_v<std::remove_cvref_t<ValT>, fallback::ondemand::object>) { + haswell::ondemand::object obj; + if constexpr (std::is_same_v<std::remove_cvref_t<ValT>, haswell::ondemand::object>) { obj = val; } else { SIMDJSON_TRY(val.get_object().get(obj)); @@ -55070,11 +95028,11 @@ error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr<int> &out) noe #endif // SIMDJSON_ONDEMAND_DESERIALIZE_H #endif // SIMDJSON_SUPPORTS_CONCEPTS -/* end file simdjson/generic/ondemand/std_deserialize.h for fallback */ +/* end file simdjson/generic/ondemand/std_deserialize.h for haswell */ // Inline definitions -/* including simdjson/generic/ondemand/array-inl.h for fallback: #include "simdjson/generic/ondemand/array-inl.h" */ -/* begin file simdjson/generic/ondemand/array-inl.h for fallback */ +/* including simdjson/generic/ondemand/array-inl.h for haswell: #include "simdjson/generic/ondemand/array-inl.h" */ +/* begin file simdjson/generic/ondemand/array-inl.h for haswell */ #ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -55089,7 +95047,7 @@ error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr<int> &out) noe /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace fallback { +namespace haswell { namespace ondemand { // @@ -55318,68 +95276,68 @@ simdjson_inline simdjson_result<value> array::at(size_t index) noexcept { } } // namespace ondemand -} // namespace fallback +} // namespace haswell } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<fallback::ondemand::array>::simdjson_result( - fallback::ondemand::array &&value +simdjson_inline simdjson_result<haswell::ondemand::array>::simdjson_result( + haswell::ondemand::array &&value ) noexcept - : implementation_simdjson_result_base<fallback::ondemand::array>( - std::forward<fallback::ondemand::array>(value) + : implementation_simdjson_result_base<haswell::ondemand::array>( + std::forward<haswell::ondemand::array>(value) ) { } -simdjson_inline simdjson_result<fallback::ondemand::array>::simdjson_result( +simdjson_inline simdjson_result<haswell::ondemand::array>::simdjson_result( error_code error ) noexcept - : implementation_simdjson_result_base<fallback::ondemand::array>(error) + : implementation_simdjson_result_base<haswell::ondemand::array>(error) { } -simdjson_inline simdjson_result<fallback::ondemand::array_iterator> simdjson_result<fallback::ondemand::array>::begin() noexcept { +simdjson_inline simdjson_result<haswell::ondemand::array_iterator> simdjson_result<haswell::ondemand::array>::begin() noexcept { if (error()) { return error(); } return first.begin(); } -simdjson_inline simdjson_result<fallback::ondemand::array_iterator> simdjson_result<fallback::ondemand::array>::end() noexcept { +simdjson_inline simdjson_result<haswell::ondemand::array_iterator> simdjson_result<haswell::ondemand::array>::end() noexcept { if (error()) { return error(); } return first.end(); } -simdjson_inline simdjson_result<size_t> simdjson_result<fallback::ondemand::array>::count_elements() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<haswell::ondemand::array>::count_elements() & noexcept { if (error()) { return error(); } return first.count_elements(); } -simdjson_inline simdjson_result<bool> simdjson_result<fallback::ondemand::array>::is_empty() & noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<haswell::ondemand::array>::is_empty() & noexcept { if (error()) { return error(); } return first.is_empty(); } -simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::array>::at(size_t index) noexcept { +simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::array>::at(size_t index) noexcept { if (error()) { return error(); } return first.at(index); } -simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::array>::at_pointer(std::string_view json_pointer) noexcept { +simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::array>::at_pointer(std::string_view json_pointer) noexcept { if (error()) { return error(); } return first.at_pointer(json_pointer); } -simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::array>::at_path(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::array>::at_path(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path(json_path); } -simdjson_inline simdjson_result<std::vector<fallback::ondemand::value>> simdjson_result<fallback::ondemand::array>::at_path_with_wildcard(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<std::vector<haswell::ondemand::value>> simdjson_result<haswell::ondemand::array>::at_path_with_wildcard(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path_with_wildcard(json_path); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<fallback::ondemand::array>::raw_json() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<haswell::ondemand::array>::raw_json() noexcept { if (error()) { return error(); } return first.raw_json(); } } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_INL_H -/* end file simdjson/generic/ondemand/array-inl.h for fallback */ -/* including simdjson/generic/ondemand/array_iterator-inl.h for fallback: #include "simdjson/generic/ondemand/array_iterator-inl.h" */ -/* begin file simdjson/generic/ondemand/array_iterator-inl.h for fallback */ +/* end file simdjson/generic/ondemand/array-inl.h for haswell */ +/* including simdjson/generic/ondemand/array_iterator-inl.h for haswell: #include "simdjson/generic/ondemand/array_iterator-inl.h" */ +/* begin file simdjson/generic/ondemand/array_iterator-inl.h for haswell */ #ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -55391,7 +95349,7 @@ simdjson_inline simdjson_result<std::string_view> simdjson_result<fallback::ond /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace fallback { +namespace haswell { namespace ondemand { simdjson_inline array_iterator::array_iterator(const value_iterator &_iter) noexcept @@ -55399,6 +95357,10 @@ simdjson_inline array_iterator::array_iterator(const value_iterator &_iter) noex {} simdjson_inline simdjson_result<value> array_iterator::operator*() noexcept { +#if SIMDJSON_DEVELOPMENT_CHECKS + SIMDJSON_ASSUME(!has_been_referenced); + has_been_referenced = true; +#endif if (iter.error()) { iter.abandon(); return iter.error(); } return value(iter.child()); } @@ -55409,6 +95371,9 @@ simdjson_inline bool array_iterator::operator!=(const array_iterator &) const no return iter.is_open(); } simdjson_inline array_iterator &array_iterator::operator++() noexcept { +#if SIMDJSON_DEVELOPMENT_CHECKS + has_been_referenced = false; +#endif error_code error; // PERF NOTE this is a safety rail ... users should exit loops as soon as they receive an error, so we'll never get here. // However, it does not seem to make a perf difference, so we add it out of an abundance of caution. @@ -55422,50 +95387,50 @@ simdjson_inline bool array_iterator::at_end() const noexcept { return iter.at_end(); } } // namespace ondemand -} // namespace fallback +} // namespace haswell } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<fallback::ondemand::array_iterator>::simdjson_result( - fallback::ondemand::array_iterator &&value +simdjson_inline simdjson_result<haswell::ondemand::array_iterator>::simdjson_result( + haswell::ondemand::array_iterator &&value ) noexcept - : fallback::implementation_simdjson_result_base<fallback::ondemand::array_iterator>(std::forward<fallback::ondemand::array_iterator>(value)) + : haswell::implementation_simdjson_result_base<haswell::ondemand::array_iterator>(std::forward<haswell::ondemand::array_iterator>(value)) { first.iter.assert_is_valid(); } -simdjson_inline simdjson_result<fallback::ondemand::array_iterator>::simdjson_result(error_code error) noexcept - : fallback::implementation_simdjson_result_base<fallback::ondemand::array_iterator>({}, error) +simdjson_inline simdjson_result<haswell::ondemand::array_iterator>::simdjson_result(error_code error) noexcept + : haswell::implementation_simdjson_result_base<haswell::ondemand::array_iterator>({}, error) { } -simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::array_iterator>::operator*() noexcept { +simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::array_iterator>::operator*() noexcept { if (error()) { return error(); } return *first; } -simdjson_inline bool simdjson_result<fallback::ondemand::array_iterator>::operator==(const simdjson_result<fallback::ondemand::array_iterator> &other) const noexcept { +simdjson_inline bool simdjson_result<haswell::ondemand::array_iterator>::operator==(const simdjson_result<haswell::ondemand::array_iterator> &other) const noexcept { if (!first.iter.is_valid()) { return !error(); } return first == other.first; } -simdjson_inline bool simdjson_result<fallback::ondemand::array_iterator>::operator!=(const simdjson_result<fallback::ondemand::array_iterator> &other) const noexcept { +simdjson_inline bool simdjson_result<haswell::ondemand::array_iterator>::operator!=(const simdjson_result<haswell::ondemand::array_iterator> &other) const noexcept { if (!first.iter.is_valid()) { return error(); } return first != other.first; } -simdjson_inline simdjson_result<fallback::ondemand::array_iterator> &simdjson_result<fallback::ondemand::array_iterator>::operator++() noexcept { +simdjson_inline simdjson_result<haswell::ondemand::array_iterator> &simdjson_result<haswell::ondemand::array_iterator>::operator++() noexcept { // Clear the error if there is one, so we don't yield it twice if (error()) { second = SUCCESS; return *this; } ++(first); return *this; } -simdjson_inline bool simdjson_result<fallback::ondemand::array_iterator>::at_end() const noexcept { +simdjson_inline bool simdjson_result<haswell::ondemand::array_iterator>::at_end() const noexcept { return !first.iter.is_valid() || first.at_end(); } } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_INL_H -/* end file simdjson/generic/ondemand/array_iterator-inl.h for fallback */ -/* including simdjson/generic/ondemand/value-inl.h for fallback: #include "simdjson/generic/ondemand/value-inl.h" */ -/* begin file simdjson/generic/ondemand/value-inl.h for fallback */ +/* end file simdjson/generic/ondemand/array_iterator-inl.h for haswell */ +/* including simdjson/generic/ondemand/value-inl.h for haswell: #include "simdjson/generic/ondemand/value-inl.h" */ +/* begin file simdjson/generic/ondemand/value-inl.h for haswell */ #ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -55481,7 +95446,7 @@ simdjson_inline bool simdjson_result<fallback::ondemand::array_iterator>::at_end /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace fallback { +namespace haswell { namespace ondemand { simdjson_inline value::value(const value_iterator &_iter) noexcept @@ -55778,240 +95743,240 @@ inline simdjson_result<std::vector<value>> value::at_path_with_wildcard(std::str } } // namespace ondemand -} // namespace fallback +} // namespace haswell } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<fallback::ondemand::value>::simdjson_result( - fallback::ondemand::value &&value +simdjson_inline simdjson_result<haswell::ondemand::value>::simdjson_result( + haswell::ondemand::value &&value ) noexcept : - implementation_simdjson_result_base<fallback::ondemand::value>( - std::forward<fallback::ondemand::value>(value) + implementation_simdjson_result_base<haswell::ondemand::value>( + std::forward<haswell::ondemand::value>(value) ) { } -simdjson_inline simdjson_result<fallback::ondemand::value>::simdjson_result( +simdjson_inline simdjson_result<haswell::ondemand::value>::simdjson_result( error_code error ) noexcept : - implementation_simdjson_result_base<fallback::ondemand::value>(error) + implementation_simdjson_result_base<haswell::ondemand::value>(error) { } -simdjson_inline simdjson_result<size_t> simdjson_result<fallback::ondemand::value>::count_elements() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<haswell::ondemand::value>::count_elements() & noexcept { if (error()) { return error(); } return first.count_elements(); } -simdjson_inline simdjson_result<size_t> simdjson_result<fallback::ondemand::value>::count_fields() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<haswell::ondemand::value>::count_fields() & noexcept { if (error()) { return error(); } return first.count_fields(); } -simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::value>::at(size_t index) noexcept { +simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::value>::at(size_t index) noexcept { if (error()) { return error(); } return first.at(index); } -simdjson_inline simdjson_result<fallback::ondemand::array_iterator> simdjson_result<fallback::ondemand::value>::begin() & noexcept { +simdjson_inline simdjson_result<haswell::ondemand::array_iterator> simdjson_result<haswell::ondemand::value>::begin() & noexcept { if (error()) { return error(); } return first.begin(); } -simdjson_inline simdjson_result<fallback::ondemand::array_iterator> simdjson_result<fallback::ondemand::value>::end() & noexcept { +simdjson_inline simdjson_result<haswell::ondemand::array_iterator> simdjson_result<haswell::ondemand::value>::end() & noexcept { if (error()) { return error(); } return {}; } -simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::value>::find_field(std::string_view key) noexcept { +simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::value>::find_field(std::string_view key) noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::value>::find_field(const char *key) noexcept { +simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::value>::find_field(const char *key) noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::value>::find_field_unordered(std::string_view key) noexcept { +simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::value>::find_field_unordered(std::string_view key) noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::value>::find_field_unordered(const char *key) noexcept { +simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::value>::find_field_unordered(const char *key) noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::value>::operator[](std::string_view key) noexcept { +simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::value>::operator[](std::string_view key) noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::value>::operator[](const char *key) noexcept { +simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::value>::operator[](const char *key) noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<fallback::ondemand::array> simdjson_result<fallback::ondemand::value>::get_array() noexcept { +simdjson_inline simdjson_result<haswell::ondemand::array> simdjson_result<haswell::ondemand::value>::get_array() noexcept { if (error()) { return error(); } return first.get_array(); } -simdjson_inline simdjson_result<fallback::ondemand::object> simdjson_result<fallback::ondemand::value>::get_object() noexcept { +simdjson_inline simdjson_result<haswell::ondemand::object> simdjson_result<haswell::ondemand::value>::get_object() noexcept { if (error()) { return error(); } return first.get_object(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<fallback::ondemand::value>::get_uint64() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<haswell::ondemand::value>::get_uint64() noexcept { if (error()) { return error(); } return first.get_uint64(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<fallback::ondemand::value>::get_uint64_in_string() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<haswell::ondemand::value>::get_uint64_in_string() noexcept { if (error()) { return error(); } return first.get_uint64_in_string(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<fallback::ondemand::value>::get_int64() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<haswell::ondemand::value>::get_int64() noexcept { if (error()) { return error(); } return first.get_int64(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<fallback::ondemand::value>::get_int64_in_string() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<haswell::ondemand::value>::get_int64_in_string() noexcept { if (error()) { return error(); } return first.get_int64_in_string(); } -simdjson_inline simdjson_result<double> simdjson_result<fallback::ondemand::value>::get_double() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<haswell::ondemand::value>::get_double() noexcept { if (error()) { return error(); } return first.get_double(); } -simdjson_inline simdjson_result<double> simdjson_result<fallback::ondemand::value>::get_double_in_string() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<haswell::ondemand::value>::get_double_in_string() noexcept { if (error()) { return error(); } return first.get_double_in_string(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<fallback::ondemand::value>::get_string(bool allow_replacement) noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<haswell::ondemand::value>::get_string(bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(allow_replacement); } template <typename string_type> -simdjson_inline error_code simdjson_result<fallback::ondemand::value>::get_string(string_type& receiver, bool allow_replacement) noexcept { +simdjson_inline error_code simdjson_result<haswell::ondemand::value>::get_string(string_type& receiver, bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(receiver, allow_replacement); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<fallback::ondemand::value>::get_wobbly_string() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<haswell::ondemand::value>::get_wobbly_string() noexcept { if (error()) { return error(); } return first.get_wobbly_string(); } -simdjson_inline simdjson_result<fallback::ondemand::raw_json_string> simdjson_result<fallback::ondemand::value>::get_raw_json_string() noexcept { +simdjson_inline simdjson_result<haswell::ondemand::raw_json_string> simdjson_result<haswell::ondemand::value>::get_raw_json_string() noexcept { if (error()) { return error(); } return first.get_raw_json_string(); } -simdjson_inline simdjson_result<bool> simdjson_result<fallback::ondemand::value>::get_bool() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<haswell::ondemand::value>::get_bool() noexcept { if (error()) { return error(); } return first.get_bool(); } -simdjson_inline simdjson_result<bool> simdjson_result<fallback::ondemand::value>::is_null() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<haswell::ondemand::value>::is_null() noexcept { if (error()) { return error(); } return first.is_null(); } -template<> simdjson_inline error_code simdjson_result<fallback::ondemand::value>::get<fallback::ondemand::value>(fallback::ondemand::value &out) noexcept { +template<> simdjson_inline error_code simdjson_result<haswell::ondemand::value>::get<haswell::ondemand::value>(haswell::ondemand::value &out) noexcept { if (error()) { return error(); } out = first; return SUCCESS; } -template<typename T> simdjson_inline simdjson_result<T> simdjson_result<fallback::ondemand::value>::get() noexcept { +template<typename T> simdjson_inline simdjson_result<T> simdjson_result<haswell::ondemand::value>::get() noexcept { if (error()) { return error(); } return first.get<T>(); } -template<typename T> simdjson_inline error_code simdjson_result<fallback::ondemand::value>::get(T &out) noexcept { +template<typename T> simdjson_inline error_code simdjson_result<haswell::ondemand::value>::get(T &out) noexcept { if (error()) { return error(); } return first.get<T>(out); } -template<> simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::value>::get<fallback::ondemand::value>() noexcept { +template<> simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::value>::get<haswell::ondemand::value>() noexcept { if (error()) { return error(); } return std::move(first); } -simdjson_inline simdjson_result<fallback::ondemand::json_type> simdjson_result<fallback::ondemand::value>::type() noexcept { +simdjson_inline simdjson_result<haswell::ondemand::json_type> simdjson_result<haswell::ondemand::value>::type() noexcept { if (error()) { return error(); } return first.type(); } -simdjson_inline simdjson_result<bool> simdjson_result<fallback::ondemand::value>::is_scalar() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<haswell::ondemand::value>::is_scalar() noexcept { if (error()) { return error(); } return first.is_scalar(); } -simdjson_inline simdjson_result<bool> simdjson_result<fallback::ondemand::value>::is_string() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<haswell::ondemand::value>::is_string() noexcept { if (error()) { return error(); } return first.is_string(); } -simdjson_inline simdjson_result<bool> simdjson_result<fallback::ondemand::value>::is_negative() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<haswell::ondemand::value>::is_negative() noexcept { if (error()) { return error(); } return first.is_negative(); } -simdjson_inline simdjson_result<bool> simdjson_result<fallback::ondemand::value>::is_integer() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<haswell::ondemand::value>::is_integer() noexcept { if (error()) { return error(); } return first.is_integer(); } -simdjson_inline simdjson_result<fallback::number_type> simdjson_result<fallback::ondemand::value>::get_number_type() noexcept { +simdjson_inline simdjson_result<haswell::number_type> simdjson_result<haswell::ondemand::value>::get_number_type() noexcept { if (error()) { return error(); } return first.get_number_type(); } -simdjson_inline simdjson_result<fallback::ondemand::number> simdjson_result<fallback::ondemand::value>::get_number() noexcept { +simdjson_inline simdjson_result<haswell::ondemand::number> simdjson_result<haswell::ondemand::value>::get_number() noexcept { if (error()) { return error(); } return first.get_number(); } #if SIMDJSON_EXCEPTIONS template <class T> -simdjson_inline simdjson_result<fallback::ondemand::value>::operator T() noexcept(false) { +simdjson_inline simdjson_result<haswell::ondemand::value>::operator T() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first.get<T>(); } -simdjson_inline simdjson_result<fallback::ondemand::value>::operator fallback::ondemand::array() noexcept(false) { +simdjson_inline simdjson_result<haswell::ondemand::value>::operator haswell::ondemand::array() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<fallback::ondemand::value>::operator fallback::ondemand::object() noexcept(false) { +simdjson_inline simdjson_result<haswell::ondemand::value>::operator haswell::ondemand::object() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<fallback::ondemand::value>::operator uint64_t() noexcept(false) { +simdjson_inline simdjson_result<haswell::ondemand::value>::operator uint64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<fallback::ondemand::value>::operator int64_t() noexcept(false) { +simdjson_inline simdjson_result<haswell::ondemand::value>::operator int64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<fallback::ondemand::value>::operator double() noexcept(false) { +simdjson_inline simdjson_result<haswell::ondemand::value>::operator double() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<fallback::ondemand::value>::operator std::string_view() noexcept(false) { +simdjson_inline simdjson_result<haswell::ondemand::value>::operator std::string_view() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<fallback::ondemand::value>::operator fallback::ondemand::raw_json_string() noexcept(false) { +simdjson_inline simdjson_result<haswell::ondemand::value>::operator haswell::ondemand::raw_json_string() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<fallback::ondemand::value>::operator bool() noexcept(false) { +simdjson_inline simdjson_result<haswell::ondemand::value>::operator bool() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } #endif -simdjson_inline simdjson_result<std::string_view> simdjson_result<fallback::ondemand::value>::raw_json_token() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<haswell::ondemand::value>::raw_json_token() noexcept { if (error()) { return error(); } return first.raw_json_token(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<fallback::ondemand::value>::raw_json() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<haswell::ondemand::value>::raw_json() noexcept { if (error()) { return error(); } return first.raw_json(); } -simdjson_inline simdjson_result<const char *> simdjson_result<fallback::ondemand::value>::current_location() noexcept { +simdjson_inline simdjson_result<const char *> simdjson_result<haswell::ondemand::value>::current_location() noexcept { if (error()) { return error(); } return first.current_location(); } -simdjson_inline simdjson_result<int32_t> simdjson_result<fallback::ondemand::value>::current_depth() const noexcept { +simdjson_inline simdjson_result<int32_t> simdjson_result<haswell::ondemand::value>::current_depth() const noexcept { if (error()) { return error(); } return first.current_depth(); } -simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::value>::at_pointer( +simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::value>::at_pointer( std::string_view json_pointer) noexcept { if (error()) { return error(); @@ -56019,7 +95984,7 @@ simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallb return first.at_pointer(json_pointer); } -simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::value>::at_path( +simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::value>::at_path( std::string_view json_path) noexcept { if (error()) { return error(); @@ -56027,7 +95992,7 @@ simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallb return first.at_path(json_path); } -inline simdjson_result<std::vector<fallback::ondemand::value>> simdjson_result<fallback::ondemand::value>::at_path_with_wildcard( +inline simdjson_result<std::vector<haswell::ondemand::value>> simdjson_result<haswell::ondemand::value>::at_path_with_wildcard( std::string_view json_path) noexcept { if (error()) { return error(); @@ -56038,9 +96003,9 @@ inline simdjson_result<std::vector<fallback::ondemand::value>> simdjson_result<f } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_INL_H -/* end file simdjson/generic/ondemand/value-inl.h for fallback */ -/* including simdjson/generic/ondemand/document-inl.h for fallback: #include "simdjson/generic/ondemand/document-inl.h" */ -/* begin file simdjson/generic/ondemand/document-inl.h for fallback */ +/* end file simdjson/generic/ondemand/value-inl.h for haswell */ +/* including simdjson/generic/ondemand/document-inl.h for haswell: #include "simdjson/generic/ondemand/document-inl.h" */ +/* begin file simdjson/generic/ondemand/document-inl.h for haswell */ #ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -56060,7 +96025,7 @@ inline simdjson_result<std::vector<fallback::ondemand::value>> simdjson_result<f /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace fallback { +namespace haswell { namespace ondemand { simdjson_inline document::document(ondemand::json_iterator &&_iter) noexcept @@ -56454,283 +96419,283 @@ simdjson_warn_unused simdjson_inline error_code document::extract_into(T& out) & #endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION } // namespace ondemand -} // namespace fallback +} // namespace haswell } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<fallback::ondemand::document>::simdjson_result( - fallback::ondemand::document &&value +simdjson_inline simdjson_result<haswell::ondemand::document>::simdjson_result( + haswell::ondemand::document &&value ) noexcept : - implementation_simdjson_result_base<fallback::ondemand::document>( - std::forward<fallback::ondemand::document>(value) + implementation_simdjson_result_base<haswell::ondemand::document>( + std::forward<haswell::ondemand::document>(value) ) { } -simdjson_inline simdjson_result<fallback::ondemand::document>::simdjson_result( +simdjson_inline simdjson_result<haswell::ondemand::document>::simdjson_result( error_code error ) noexcept : - implementation_simdjson_result_base<fallback::ondemand::document>( + implementation_simdjson_result_base<haswell::ondemand::document>( error ) { } -simdjson_inline simdjson_result<size_t> simdjson_result<fallback::ondemand::document>::count_elements() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<haswell::ondemand::document>::count_elements() & noexcept { if (error()) { return error(); } return first.count_elements(); } -simdjson_inline simdjson_result<size_t> simdjson_result<fallback::ondemand::document>::count_fields() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<haswell::ondemand::document>::count_fields() & noexcept { if (error()) { return error(); } return first.count_fields(); } -simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::document>::at(size_t index) & noexcept { +simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::document>::at(size_t index) & noexcept { if (error()) { return error(); } return first.at(index); } -simdjson_inline error_code simdjson_result<fallback::ondemand::document>::rewind() noexcept { +simdjson_inline error_code simdjson_result<haswell::ondemand::document>::rewind() noexcept { if (error()) { return error(); } first.rewind(); return SUCCESS; } -simdjson_inline simdjson_result<fallback::ondemand::array_iterator> simdjson_result<fallback::ondemand::document>::begin() & noexcept { +simdjson_inline simdjson_result<haswell::ondemand::array_iterator> simdjson_result<haswell::ondemand::document>::begin() & noexcept { if (error()) { return error(); } return first.begin(); } -simdjson_inline simdjson_result<fallback::ondemand::array_iterator> simdjson_result<fallback::ondemand::document>::end() & noexcept { +simdjson_inline simdjson_result<haswell::ondemand::array_iterator> simdjson_result<haswell::ondemand::document>::end() & noexcept { return {}; } -simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::document>::find_field_unordered(std::string_view key) & noexcept { +simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::document>::find_field_unordered(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::document>::find_field_unordered(const char *key) & noexcept { +simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::document>::find_field_unordered(const char *key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::document>::operator[](std::string_view key) & noexcept { +simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::document>::operator[](std::string_view key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::document>::operator[](const char *key) & noexcept { +simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::document>::operator[](const char *key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::document>::find_field(std::string_view key) & noexcept { +simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::document>::find_field(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::document>::find_field(const char *key) & noexcept { +simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::document>::find_field(const char *key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<fallback::ondemand::array> simdjson_result<fallback::ondemand::document>::get_array() & noexcept { +simdjson_inline simdjson_result<haswell::ondemand::array> simdjson_result<haswell::ondemand::document>::get_array() & noexcept { if (error()) { return error(); } return first.get_array(); } -simdjson_inline simdjson_result<fallback::ondemand::object> simdjson_result<fallback::ondemand::document>::get_object() & noexcept { +simdjson_inline simdjson_result<haswell::ondemand::object> simdjson_result<haswell::ondemand::document>::get_object() & noexcept { if (error()) { return error(); } return first.get_object(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<fallback::ondemand::document>::get_uint64() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<haswell::ondemand::document>::get_uint64() noexcept { if (error()) { return error(); } return first.get_uint64(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<fallback::ondemand::document>::get_uint64_in_string() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<haswell::ondemand::document>::get_uint64_in_string() noexcept { if (error()) { return error(); } return first.get_uint64_in_string(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<fallback::ondemand::document>::get_int64() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<haswell::ondemand::document>::get_int64() noexcept { if (error()) { return error(); } return first.get_int64(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<fallback::ondemand::document>::get_int64_in_string() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<haswell::ondemand::document>::get_int64_in_string() noexcept { if (error()) { return error(); } return first.get_int64_in_string(); } -simdjson_inline simdjson_result<double> simdjson_result<fallback::ondemand::document>::get_double() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<haswell::ondemand::document>::get_double() noexcept { if (error()) { return error(); } return first.get_double(); } -simdjson_inline simdjson_result<double> simdjson_result<fallback::ondemand::document>::get_double_in_string() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<haswell::ondemand::document>::get_double_in_string() noexcept { if (error()) { return error(); } return first.get_double_in_string(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<fallback::ondemand::document>::get_string(bool allow_replacement) noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<haswell::ondemand::document>::get_string(bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(allow_replacement); } template <typename string_type> -simdjson_warn_unused simdjson_inline error_code simdjson_result<fallback::ondemand::document>::get_string(string_type& receiver, bool allow_replacement) noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<haswell::ondemand::document>::get_string(string_type& receiver, bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(receiver, allow_replacement); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<fallback::ondemand::document>::get_wobbly_string() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<haswell::ondemand::document>::get_wobbly_string() noexcept { if (error()) { return error(); } return first.get_wobbly_string(); } -simdjson_inline simdjson_result<fallback::ondemand::raw_json_string> simdjson_result<fallback::ondemand::document>::get_raw_json_string() noexcept { +simdjson_inline simdjson_result<haswell::ondemand::raw_json_string> simdjson_result<haswell::ondemand::document>::get_raw_json_string() noexcept { if (error()) { return error(); } return first.get_raw_json_string(); } -simdjson_inline simdjson_result<bool> simdjson_result<fallback::ondemand::document>::get_bool() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<haswell::ondemand::document>::get_bool() noexcept { if (error()) { return error(); } return first.get_bool(); } -simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::document>::get_value() noexcept { +simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::document>::get_value() noexcept { if (error()) { return error(); } return first.get_value(); } -simdjson_inline simdjson_result<bool> simdjson_result<fallback::ondemand::document>::is_null() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<haswell::ondemand::document>::is_null() noexcept { if (error()) { return error(); } return first.is_null(); } template<typename T> -simdjson_inline simdjson_result<T> simdjson_result<fallback::ondemand::document>::get() & noexcept { +simdjson_inline simdjson_result<T> simdjson_result<haswell::ondemand::document>::get() & noexcept { if (error()) { return error(); } return first.get<T>(); } template<typename T> -simdjson_deprecated simdjson_inline simdjson_result<T> simdjson_result<fallback::ondemand::document>::get() && noexcept { +simdjson_deprecated simdjson_inline simdjson_result<T> simdjson_result<haswell::ondemand::document>::get() && noexcept { if (error()) { return error(); } - return std::forward<fallback::ondemand::document>(first).get<T>(); + return std::forward<haswell::ondemand::document>(first).get<T>(); } template<typename T> -simdjson_warn_unused simdjson_inline error_code simdjson_result<fallback::ondemand::document>::get(T &out) & noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<haswell::ondemand::document>::get(T &out) & noexcept { if (error()) { return error(); } return first.get<T>(out); } template<typename T> -simdjson_warn_unused simdjson_inline error_code simdjson_result<fallback::ondemand::document>::get(T &out) && noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<haswell::ondemand::document>::get(T &out) && noexcept { if (error()) { return error(); } - return std::forward<fallback::ondemand::document>(first).get<T>(out); + return std::forward<haswell::ondemand::document>(first).get<T>(out); } -template<> simdjson_inline simdjson_result<fallback::ondemand::document> simdjson_result<fallback::ondemand::document>::get<fallback::ondemand::document>() & noexcept = delete; -template<> simdjson_deprecated simdjson_inline simdjson_result<fallback::ondemand::document> simdjson_result<fallback::ondemand::document>::get<fallback::ondemand::document>() && noexcept { +template<> simdjson_inline simdjson_result<haswell::ondemand::document> simdjson_result<haswell::ondemand::document>::get<haswell::ondemand::document>() & noexcept = delete; +template<> simdjson_deprecated simdjson_inline simdjson_result<haswell::ondemand::document> simdjson_result<haswell::ondemand::document>::get<haswell::ondemand::document>() && noexcept { if (error()) { return error(); } - return std::forward<fallback::ondemand::document>(first); + return std::forward<haswell::ondemand::document>(first); } -template<> simdjson_warn_unused simdjson_inline error_code simdjson_result<fallback::ondemand::document>::get<fallback::ondemand::document>(fallback::ondemand::document &out) & noexcept = delete; -template<> simdjson_warn_unused simdjson_inline error_code simdjson_result<fallback::ondemand::document>::get<fallback::ondemand::document>(fallback::ondemand::document &out) && noexcept { +template<> simdjson_warn_unused simdjson_inline error_code simdjson_result<haswell::ondemand::document>::get<haswell::ondemand::document>(haswell::ondemand::document &out) & noexcept = delete; +template<> simdjson_warn_unused simdjson_inline error_code simdjson_result<haswell::ondemand::document>::get<haswell::ondemand::document>(haswell::ondemand::document &out) && noexcept { if (error()) { return error(); } - out = std::forward<fallback::ondemand::document>(first); + out = std::forward<haswell::ondemand::document>(first); return SUCCESS; } -simdjson_inline simdjson_result<fallback::ondemand::json_type> simdjson_result<fallback::ondemand::document>::type() noexcept { +simdjson_inline simdjson_result<haswell::ondemand::json_type> simdjson_result<haswell::ondemand::document>::type() noexcept { if (error()) { return error(); } return first.type(); } -simdjson_inline simdjson_result<bool> simdjson_result<fallback::ondemand::document>::is_scalar() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<haswell::ondemand::document>::is_scalar() noexcept { if (error()) { return error(); } return first.is_scalar(); } -simdjson_inline simdjson_result<bool> simdjson_result<fallback::ondemand::document>::is_string() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<haswell::ondemand::document>::is_string() noexcept { if (error()) { return error(); } return first.is_string(); } -simdjson_inline bool simdjson_result<fallback::ondemand::document>::is_negative() noexcept { +simdjson_inline bool simdjson_result<haswell::ondemand::document>::is_negative() noexcept { if (error()) { return error(); } return first.is_negative(); } -simdjson_inline simdjson_result<bool> simdjson_result<fallback::ondemand::document>::is_integer() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<haswell::ondemand::document>::is_integer() noexcept { if (error()) { return error(); } return first.is_integer(); } -simdjson_inline simdjson_result<fallback::number_type> simdjson_result<fallback::ondemand::document>::get_number_type() noexcept { +simdjson_inline simdjson_result<haswell::number_type> simdjson_result<haswell::ondemand::document>::get_number_type() noexcept { if (error()) { return error(); } return first.get_number_type(); } -simdjson_inline simdjson_result<fallback::ondemand::number> simdjson_result<fallback::ondemand::document>::get_number() noexcept { +simdjson_inline simdjson_result<haswell::ondemand::number> simdjson_result<haswell::ondemand::document>::get_number() noexcept { if (error()) { return error(); } return first.get_number(); } #if SIMDJSON_EXCEPTIONS -template <class T, typename std::enable_if<std::is_same<T, fallback::ondemand::document>::value == false>::type> -simdjson_inline simdjson_result<fallback::ondemand::document>::operator T() noexcept(false) { +template <class T, typename std::enable_if<std::is_same<T, haswell::ondemand::document>::value == false>::type> +simdjson_inline simdjson_result<haswell::ondemand::document>::operator T() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<fallback::ondemand::document>::operator fallback::ondemand::array() & noexcept(false) { +simdjson_inline simdjson_result<haswell::ondemand::document>::operator haswell::ondemand::array() & noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<fallback::ondemand::document>::operator fallback::ondemand::object() & noexcept(false) { +simdjson_inline simdjson_result<haswell::ondemand::document>::operator haswell::ondemand::object() & noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<fallback::ondemand::document>::operator uint64_t() noexcept(false) { +simdjson_inline simdjson_result<haswell::ondemand::document>::operator uint64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<fallback::ondemand::document>::operator int64_t() noexcept(false) { +simdjson_inline simdjson_result<haswell::ondemand::document>::operator int64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<fallback::ondemand::document>::operator double() noexcept(false) { +simdjson_inline simdjson_result<haswell::ondemand::document>::operator double() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<fallback::ondemand::document>::operator std::string_view() noexcept(false) { +simdjson_inline simdjson_result<haswell::ondemand::document>::operator std::string_view() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<fallback::ondemand::document>::operator fallback::ondemand::raw_json_string() noexcept(false) { +simdjson_inline simdjson_result<haswell::ondemand::document>::operator haswell::ondemand::raw_json_string() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<fallback::ondemand::document>::operator bool() noexcept(false) { +simdjson_inline simdjson_result<haswell::ondemand::document>::operator bool() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<fallback::ondemand::document>::operator fallback::ondemand::value() noexcept(false) { +simdjson_inline simdjson_result<haswell::ondemand::document>::operator haswell::ondemand::value() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } #endif -simdjson_inline simdjson_result<const char *> simdjson_result<fallback::ondemand::document>::current_location() noexcept { +simdjson_inline simdjson_result<const char *> simdjson_result<haswell::ondemand::document>::current_location() noexcept { if (error()) { return error(); } return first.current_location(); } -simdjson_inline bool simdjson_result<fallback::ondemand::document>::at_end() const noexcept { +simdjson_inline bool simdjson_result<haswell::ondemand::document>::at_end() const noexcept { if (error()) { return error(); } return first.at_end(); } -simdjson_inline int32_t simdjson_result<fallback::ondemand::document>::current_depth() const noexcept { +simdjson_inline int32_t simdjson_result<haswell::ondemand::document>::current_depth() const noexcept { if (error()) { return error(); } return first.current_depth(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<fallback::ondemand::document>::raw_json_token() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<haswell::ondemand::document>::raw_json_token() noexcept { if (error()) { return error(); } return first.raw_json_token(); } -simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::document>::at_pointer(std::string_view json_pointer) noexcept { +simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::document>::at_pointer(std::string_view json_pointer) noexcept { if (error()) { return error(); } return first.at_pointer(json_pointer); } -simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::document>::at_path(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::document>::at_path(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path(json_path); } -simdjson_inline simdjson_result<std::vector<fallback::ondemand::value>> simdjson_result<fallback::ondemand::document>::at_path_with_wildcard(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<std::vector<haswell::ondemand::value>> simdjson_result<haswell::ondemand::document>::at_path_with_wildcard(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path_with_wildcard(json_path); } @@ -56738,7 +96703,7 @@ simdjson_inline simdjson_result<std::vector<fallback::ondemand::value>> simdjson #if SIMDJSON_STATIC_REFLECTION template<constevalutil::fixed_string... FieldNames, typename T> requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) -simdjson_warn_unused simdjson_inline error_code simdjson_result<fallback::ondemand::document>::extract_into(T& out) & noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<haswell::ondemand::document>::extract_into(T& out) & noexcept { if (error()) { return error(); } return first.extract_into<FieldNames...>(out); } @@ -56748,7 +96713,7 @@ simdjson_warn_unused simdjson_inline error_code simdjson_result<fallback::ondema namespace simdjson { -namespace fallback { +namespace haswell { namespace ondemand { simdjson_inline document_reference::document_reference() noexcept : doc{nullptr} {} @@ -56840,253 +96805,253 @@ simdjson_warn_unused simdjson_inline error_code document_reference::extract_into } #endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION } // namespace ondemand -} // namespace fallback +} // namespace haswell } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<fallback::ondemand::document_reference>::simdjson_result(fallback::ondemand::document_reference value, error_code error) - noexcept : implementation_simdjson_result_base<fallback::ondemand::document_reference>(std::forward<fallback::ondemand::document_reference>(value), error) {} +simdjson_inline simdjson_result<haswell::ondemand::document_reference>::simdjson_result(haswell::ondemand::document_reference value, error_code error) + noexcept : implementation_simdjson_result_base<haswell::ondemand::document_reference>(std::forward<haswell::ondemand::document_reference>(value), error) {} -simdjson_inline simdjson_result<size_t> simdjson_result<fallback::ondemand::document_reference>::count_elements() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<haswell::ondemand::document_reference>::count_elements() & noexcept { if (error()) { return error(); } return first.count_elements(); } -simdjson_inline simdjson_result<size_t> simdjson_result<fallback::ondemand::document_reference>::count_fields() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<haswell::ondemand::document_reference>::count_fields() & noexcept { if (error()) { return error(); } return first.count_fields(); } -simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::document_reference>::at(size_t index) & noexcept { +simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::document_reference>::at(size_t index) & noexcept { if (error()) { return error(); } return first.at(index); } -simdjson_inline error_code simdjson_result<fallback::ondemand::document_reference>::rewind() noexcept { +simdjson_inline error_code simdjson_result<haswell::ondemand::document_reference>::rewind() noexcept { if (error()) { return error(); } first.rewind(); return SUCCESS; } -simdjson_inline simdjson_result<fallback::ondemand::array_iterator> simdjson_result<fallback::ondemand::document_reference>::begin() & noexcept { +simdjson_inline simdjson_result<haswell::ondemand::array_iterator> simdjson_result<haswell::ondemand::document_reference>::begin() & noexcept { if (error()) { return error(); } return first.begin(); } -simdjson_inline simdjson_result<fallback::ondemand::array_iterator> simdjson_result<fallback::ondemand::document_reference>::end() & noexcept { +simdjson_inline simdjson_result<haswell::ondemand::array_iterator> simdjson_result<haswell::ondemand::document_reference>::end() & noexcept { return {}; } -simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::document_reference>::find_field_unordered(std::string_view key) & noexcept { +simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::document_reference>::find_field_unordered(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::document_reference>::find_field_unordered(const char *key) & noexcept { +simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::document_reference>::find_field_unordered(const char *key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::document_reference>::operator[](std::string_view key) & noexcept { +simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::document_reference>::operator[](std::string_view key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::document_reference>::operator[](const char *key) & noexcept { +simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::document_reference>::operator[](const char *key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::document_reference>::find_field(std::string_view key) & noexcept { +simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::document_reference>::find_field(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::document_reference>::find_field(const char *key) & noexcept { +simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::document_reference>::find_field(const char *key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<fallback::ondemand::array> simdjson_result<fallback::ondemand::document_reference>::get_array() & noexcept { +simdjson_inline simdjson_result<haswell::ondemand::array> simdjson_result<haswell::ondemand::document_reference>::get_array() & noexcept { if (error()) { return error(); } return first.get_array(); } -simdjson_inline simdjson_result<fallback::ondemand::object> simdjson_result<fallback::ondemand::document_reference>::get_object() & noexcept { +simdjson_inline simdjson_result<haswell::ondemand::object> simdjson_result<haswell::ondemand::document_reference>::get_object() & noexcept { if (error()) { return error(); } return first.get_object(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<fallback::ondemand::document_reference>::get_uint64() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<haswell::ondemand::document_reference>::get_uint64() noexcept { if (error()) { return error(); } return first.get_uint64(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<fallback::ondemand::document_reference>::get_uint64_in_string() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<haswell::ondemand::document_reference>::get_uint64_in_string() noexcept { if (error()) { return error(); } return first.get_uint64_in_string(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<fallback::ondemand::document_reference>::get_int64() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<haswell::ondemand::document_reference>::get_int64() noexcept { if (error()) { return error(); } return first.get_int64(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<fallback::ondemand::document_reference>::get_int64_in_string() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<haswell::ondemand::document_reference>::get_int64_in_string() noexcept { if (error()) { return error(); } return first.get_int64_in_string(); } -simdjson_inline simdjson_result<double> simdjson_result<fallback::ondemand::document_reference>::get_double() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<haswell::ondemand::document_reference>::get_double() noexcept { if (error()) { return error(); } return first.get_double(); } -simdjson_inline simdjson_result<double> simdjson_result<fallback::ondemand::document_reference>::get_double_in_string() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<haswell::ondemand::document_reference>::get_double_in_string() noexcept { if (error()) { return error(); } return first.get_double_in_string(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<fallback::ondemand::document_reference>::get_string(bool allow_replacement) noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<haswell::ondemand::document_reference>::get_string(bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(allow_replacement); } template <typename string_type> -simdjson_warn_unused simdjson_inline error_code simdjson_result<fallback::ondemand::document_reference>::get_string(string_type& receiver, bool allow_replacement) noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<haswell::ondemand::document_reference>::get_string(string_type& receiver, bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(receiver, allow_replacement); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<fallback::ondemand::document_reference>::get_wobbly_string() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<haswell::ondemand::document_reference>::get_wobbly_string() noexcept { if (error()) { return error(); } return first.get_wobbly_string(); } -simdjson_inline simdjson_result<fallback::ondemand::raw_json_string> simdjson_result<fallback::ondemand::document_reference>::get_raw_json_string() noexcept { +simdjson_inline simdjson_result<haswell::ondemand::raw_json_string> simdjson_result<haswell::ondemand::document_reference>::get_raw_json_string() noexcept { if (error()) { return error(); } return first.get_raw_json_string(); } -simdjson_inline simdjson_result<bool> simdjson_result<fallback::ondemand::document_reference>::get_bool() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<haswell::ondemand::document_reference>::get_bool() noexcept { if (error()) { return error(); } return first.get_bool(); } -simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::document_reference>::get_value() noexcept { +simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::document_reference>::get_value() noexcept { if (error()) { return error(); } return first.get_value(); } -simdjson_inline simdjson_result<bool> simdjson_result<fallback::ondemand::document_reference>::is_null() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<haswell::ondemand::document_reference>::is_null() noexcept { if (error()) { return error(); } return first.is_null(); } template<typename T> -simdjson_inline simdjson_result<T> simdjson_result<fallback::ondemand::document_reference>::get() & noexcept { +simdjson_inline simdjson_result<T> simdjson_result<haswell::ondemand::document_reference>::get() & noexcept { if (error()) { return error(); } return first.get<T>(); } template<typename T> -simdjson_inline simdjson_result<T> simdjson_result<fallback::ondemand::document_reference>::get() && noexcept { +simdjson_inline simdjson_result<T> simdjson_result<haswell::ondemand::document_reference>::get() && noexcept { if (error()) { return error(); } - return std::forward<fallback::ondemand::document_reference>(first).get<T>(); + return std::forward<haswell::ondemand::document_reference>(first).get<T>(); } template <class T> -simdjson_warn_unused simdjson_inline error_code simdjson_result<fallback::ondemand::document_reference>::get(T &out) & noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<haswell::ondemand::document_reference>::get(T &out) & noexcept { if (error()) { return error(); } return first.get<T>(out); } template <class T> -simdjson_warn_unused simdjson_inline error_code simdjson_result<fallback::ondemand::document_reference>::get(T &out) && noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<haswell::ondemand::document_reference>::get(T &out) && noexcept { if (error()) { return error(); } - return std::forward<fallback::ondemand::document_reference>(first).get<T>(out); + return std::forward<haswell::ondemand::document_reference>(first).get<T>(out); } -simdjson_inline simdjson_result<fallback::ondemand::json_type> simdjson_result<fallback::ondemand::document_reference>::type() noexcept { +simdjson_inline simdjson_result<haswell::ondemand::json_type> simdjson_result<haswell::ondemand::document_reference>::type() noexcept { if (error()) { return error(); } return first.type(); } -simdjson_inline simdjson_result<bool> simdjson_result<fallback::ondemand::document_reference>::is_scalar() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<haswell::ondemand::document_reference>::is_scalar() noexcept { if (error()) { return error(); } return first.is_scalar(); } -simdjson_inline simdjson_result<bool> simdjson_result<fallback::ondemand::document_reference>::is_string() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<haswell::ondemand::document_reference>::is_string() noexcept { if (error()) { return error(); } return first.is_string(); } template <> -simdjson_warn_unused simdjson_inline error_code simdjson_result<fallback::ondemand::document_reference>::get(fallback::ondemand::document_reference &out) & noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<haswell::ondemand::document_reference>::get(haswell::ondemand::document_reference &out) & noexcept { if (error()) { return error(); } out = first; return SUCCESS; } template <> -simdjson_warn_unused simdjson_inline error_code simdjson_result<fallback::ondemand::document_reference>::get(fallback::ondemand::document_reference &out) && noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<haswell::ondemand::document_reference>::get(haswell::ondemand::document_reference &out) && noexcept { if (error()) { return error(); } out = first; return SUCCESS; } -simdjson_inline simdjson_result<bool> simdjson_result<fallback::ondemand::document_reference>::is_negative() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<haswell::ondemand::document_reference>::is_negative() noexcept { if (error()) { return error(); } return first.is_negative(); } -simdjson_inline simdjson_result<bool> simdjson_result<fallback::ondemand::document_reference>::is_integer() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<haswell::ondemand::document_reference>::is_integer() noexcept { if (error()) { return error(); } return first.is_integer(); } -simdjson_inline simdjson_result<fallback::number_type> simdjson_result<fallback::ondemand::document_reference>::get_number_type() noexcept { +simdjson_inline simdjson_result<haswell::number_type> simdjson_result<haswell::ondemand::document_reference>::get_number_type() noexcept { if (error()) { return error(); } return first.get_number_type(); } -simdjson_inline simdjson_result<fallback::ondemand::number> simdjson_result<fallback::ondemand::document_reference>::get_number() noexcept { +simdjson_inline simdjson_result<haswell::ondemand::number> simdjson_result<haswell::ondemand::document_reference>::get_number() noexcept { if (error()) { return error(); } return first.get_number(); } #if SIMDJSON_EXCEPTIONS template <class T> -simdjson_inline simdjson_result<fallback::ondemand::document_reference>::operator T() noexcept(false) { - static_assert(std::is_same<T, fallback::ondemand::document_reference>::value == false, "You should not call get<T> when T is a document"); - static_assert(std::is_same<T, fallback::ondemand::document>::value == false, "You should not call get<T> when T is a document"); +simdjson_inline simdjson_result<haswell::ondemand::document_reference>::operator T() noexcept(false) { + static_assert(std::is_same<T, haswell::ondemand::document_reference>::value == false, "You should not call get<T> when T is a document"); + static_assert(std::is_same<T, haswell::ondemand::document>::value == false, "You should not call get<T> when T is a document"); if (error()) { throw simdjson_error(error()); } return first.get<T>(); } -simdjson_inline simdjson_result<fallback::ondemand::document_reference>::operator fallback::ondemand::array() & noexcept(false) { +simdjson_inline simdjson_result<haswell::ondemand::document_reference>::operator haswell::ondemand::array() & noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<fallback::ondemand::document_reference>::operator fallback::ondemand::object() & noexcept(false) { +simdjson_inline simdjson_result<haswell::ondemand::document_reference>::operator haswell::ondemand::object() & noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<fallback::ondemand::document_reference>::operator uint64_t() noexcept(false) { +simdjson_inline simdjson_result<haswell::ondemand::document_reference>::operator uint64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<fallback::ondemand::document_reference>::operator int64_t() noexcept(false) { +simdjson_inline simdjson_result<haswell::ondemand::document_reference>::operator int64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<fallback::ondemand::document_reference>::operator double() noexcept(false) { +simdjson_inline simdjson_result<haswell::ondemand::document_reference>::operator double() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<fallback::ondemand::document_reference>::operator std::string_view() noexcept(false) { +simdjson_inline simdjson_result<haswell::ondemand::document_reference>::operator std::string_view() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<fallback::ondemand::document_reference>::operator fallback::ondemand::raw_json_string() noexcept(false) { +simdjson_inline simdjson_result<haswell::ondemand::document_reference>::operator haswell::ondemand::raw_json_string() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<fallback::ondemand::document_reference>::operator bool() noexcept(false) { +simdjson_inline simdjson_result<haswell::ondemand::document_reference>::operator bool() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<fallback::ondemand::document_reference>::operator fallback::ondemand::value() noexcept(false) { +simdjson_inline simdjson_result<haswell::ondemand::document_reference>::operator haswell::ondemand::value() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } #endif -simdjson_inline simdjson_result<const char *> simdjson_result<fallback::ondemand::document_reference>::current_location() noexcept { +simdjson_inline simdjson_result<const char *> simdjson_result<haswell::ondemand::document_reference>::current_location() noexcept { if (error()) { return error(); } return first.current_location(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<fallback::ondemand::document_reference>::raw_json_token() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<haswell::ondemand::document_reference>::raw_json_token() noexcept { if (error()) { return error(); } return first.raw_json_token(); } -simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::document_reference>::at_pointer(std::string_view json_pointer) noexcept { +simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::document_reference>::at_pointer(std::string_view json_pointer) noexcept { if (error()) { return error(); } return first.at_pointer(json_pointer); } -simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::document_reference>::at_path(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::document_reference>::at_path(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path(json_path); } -simdjson_inline simdjson_result<std::vector<fallback::ondemand::value>> simdjson_result<fallback::ondemand::document_reference>::at_path_with_wildcard(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<std::vector<haswell::ondemand::value>> simdjson_result<haswell::ondemand::document_reference>::at_path_with_wildcard(std::string_view json_path) noexcept { if (error()) { return error(); } @@ -57095,7 +97060,7 @@ simdjson_inline simdjson_result<std::vector<fallback::ondemand::value>> simdjson #if SIMDJSON_STATIC_REFLECTION template<constevalutil::fixed_string... FieldNames, typename T> requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) -simdjson_warn_unused simdjson_inline error_code simdjson_result<fallback::ondemand::document_reference>::extract_into(T& out) & noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<haswell::ondemand::document_reference>::extract_into(T& out) & noexcept { if (error()) { return error(); } return first.extract_into<FieldNames...>(out); } @@ -57103,9 +97068,9 @@ simdjson_warn_unused simdjson_inline error_code simdjson_result<fallback::ondema } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H -/* end file simdjson/generic/ondemand/document-inl.h for fallback */ -/* including simdjson/generic/ondemand/document_stream-inl.h for fallback: #include "simdjson/generic/ondemand/document_stream-inl.h" */ -/* begin file simdjson/generic/ondemand/document_stream-inl.h for fallback */ +/* end file simdjson/generic/ondemand/document-inl.h for haswell */ +/* including simdjson/generic/ondemand/document_stream-inl.h for haswell: #include "simdjson/generic/ondemand/document_stream-inl.h" */ +/* begin file simdjson/generic/ondemand/document_stream-inl.h for haswell */ #ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -57120,7 +97085,7 @@ simdjson_warn_unused simdjson_inline error_code simdjson_result<fallback::ondema #include <stdexcept> namespace simdjson { -namespace fallback { +namespace haswell { namespace ondemand { #ifdef SIMDJSON_THREADS_ENABLED @@ -57527,22 +97492,22 @@ inline void document_stream::start_stage1_thread() noexcept { #endif // SIMDJSON_THREADS_ENABLED } // namespace ondemand -} // namespace fallback +} // namespace haswell } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<fallback::ondemand::document_stream>::simdjson_result( +simdjson_inline simdjson_result<haswell::ondemand::document_stream>::simdjson_result( error_code error ) noexcept : - implementation_simdjson_result_base<fallback::ondemand::document_stream>(error) + implementation_simdjson_result_base<haswell::ondemand::document_stream>(error) { } -simdjson_inline simdjson_result<fallback::ondemand::document_stream>::simdjson_result( - fallback::ondemand::document_stream &&value +simdjson_inline simdjson_result<haswell::ondemand::document_stream>::simdjson_result( + haswell::ondemand::document_stream &&value ) noexcept : - implementation_simdjson_result_base<fallback::ondemand::document_stream>( - std::forward<fallback::ondemand::document_stream>(value) + implementation_simdjson_result_base<haswell::ondemand::document_stream>( + std::forward<haswell::ondemand::document_stream>(value) ) { } @@ -57550,9 +97515,9 @@ simdjson_inline simdjson_result<fallback::ondemand::document_stream>::simdjson_r } #endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_INL_H -/* end file simdjson/generic/ondemand/document_stream-inl.h for fallback */ -/* including simdjson/generic/ondemand/field-inl.h for fallback: #include "simdjson/generic/ondemand/field-inl.h" */ -/* begin file simdjson/generic/ondemand/field-inl.h for fallback */ +/* end file simdjson/generic/ondemand/document_stream-inl.h for haswell */ +/* including simdjson/generic/ondemand/field-inl.h for haswell: #include "simdjson/generic/ondemand/field-inl.h" */ +/* begin file simdjson/generic/ondemand/field-inl.h for haswell */ #ifndef SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -57564,7 +97529,7 @@ simdjson_inline simdjson_result<fallback::ondemand::document_stream>::simdjson_r /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace fallback { +namespace haswell { namespace ondemand { // clang 6 does not think the default constructor can be noexcept, so we make it explicit @@ -57628,53 +97593,53 @@ simdjson_inline value field::value() && noexcept { } } // namespace ondemand -} // namespace fallback +} // namespace haswell } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<fallback::ondemand::field>::simdjson_result( - fallback::ondemand::field &&value +simdjson_inline simdjson_result<haswell::ondemand::field>::simdjson_result( + haswell::ondemand::field &&value ) noexcept : - implementation_simdjson_result_base<fallback::ondemand::field>( - std::forward<fallback::ondemand::field>(value) + implementation_simdjson_result_base<haswell::ondemand::field>( + std::forward<haswell::ondemand::field>(value) ) { } -simdjson_inline simdjson_result<fallback::ondemand::field>::simdjson_result( +simdjson_inline simdjson_result<haswell::ondemand::field>::simdjson_result( error_code error ) noexcept : - implementation_simdjson_result_base<fallback::ondemand::field>(error) + implementation_simdjson_result_base<haswell::ondemand::field>(error) { } -simdjson_inline simdjson_result<fallback::ondemand::raw_json_string> simdjson_result<fallback::ondemand::field>::key() noexcept { +simdjson_inline simdjson_result<haswell::ondemand::raw_json_string> simdjson_result<haswell::ondemand::field>::key() noexcept { if (error()) { return error(); } return first.key(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<fallback::ondemand::field>::key_raw_json_token() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<haswell::ondemand::field>::key_raw_json_token() noexcept { if (error()) { return error(); } return first.key_raw_json_token(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<fallback::ondemand::field>::escaped_key() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<haswell::ondemand::field>::escaped_key() noexcept { if (error()) { return error(); } return first.escaped_key(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<fallback::ondemand::field>::unescaped_key(bool allow_replacement) noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<haswell::ondemand::field>::unescaped_key(bool allow_replacement) noexcept { if (error()) { return error(); } return first.unescaped_key(allow_replacement); } template<typename string_type> -simdjson_warn_unused simdjson_inline error_code simdjson_result<fallback::ondemand::field>::unescaped_key(string_type &receiver, bool allow_replacement) noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<haswell::ondemand::field>::unescaped_key(string_type &receiver, bool allow_replacement) noexcept { if (error()) { return error(); } return first.unescaped_key(receiver, allow_replacement); } -simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::field>::value() noexcept { +simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::field>::value() noexcept { if (error()) { return error(); } return std::move(first.value()); } @@ -57682,9 +97647,9 @@ simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallb } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H -/* end file simdjson/generic/ondemand/field-inl.h for fallback */ -/* including simdjson/generic/ondemand/json_iterator-inl.h for fallback: #include "simdjson/generic/ondemand/json_iterator-inl.h" */ -/* begin file simdjson/generic/ondemand/json_iterator-inl.h for fallback */ +/* end file simdjson/generic/ondemand/field-inl.h for haswell */ +/* including simdjson/generic/ondemand/json_iterator-inl.h for haswell: #include "simdjson/generic/ondemand/json_iterator-inl.h" */ +/* begin file simdjson/generic/ondemand/json_iterator-inl.h for haswell */ #ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -57700,7 +97665,7 @@ simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallb /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace fallback { +namespace haswell { namespace ondemand { simdjson_inline json_iterator::json_iterator(json_iterator &&other) noexcept @@ -57902,11 +97867,10 @@ simdjson_inline void json_iterator::assert_more_tokens(uint32_t required_tokens) } simdjson_inline void json_iterator::assert_valid_position(token_position position) const noexcept { + (void)position; // Suppress unused parameter warning #ifndef SIMDJSON_CLANG_VISUAL_STUDIO SIMDJSON_ASSUME( position >= &parser->implementation->structural_indexes[0] ); SIMDJSON_ASSUME( position < &parser->implementation->structural_indexes[parser->implementation->n_structural_indexes] ); -#else - (void)position; // Suppress unused parameter warning #endif } @@ -58045,7 +98009,11 @@ simdjson_inline token_position json_iterator::position() const noexcept { simdjson_inline simdjson_result<std::string_view> json_iterator::unescape(raw_json_string in, bool allow_replacement) noexcept { #if SIMDJSON_DEVELOPMENT_CHECKS auto result = parser->unescape(in, _string_buf_loc, allow_replacement); +#if !defined(SIMDJSON_VISUAL_STUDIO) && !defined(SIMDJSON_CLANG_VISUAL_STUDIO) + // Under Visual Studio, the next SIMDJSON_ASSUME fails with: the argument + // has side effects that will be discarded. SIMDJSON_ASSUME(!parser->string_buffer_overflow(_string_buf_loc)); +#endif // !defined(SIMDJSON_VISUAL_STUDIO) && !defined(SIMDJSON_CLANG_VISUAL_STUDIO) return result; #else return parser->unescape(in, _string_buf_loc, allow_replacement); @@ -58055,7 +98023,11 @@ simdjson_inline simdjson_result<std::string_view> json_iterator::unescape(raw_js simdjson_inline simdjson_result<std::string_view> json_iterator::unescape_wobbly(raw_json_string in) noexcept { #if SIMDJSON_DEVELOPMENT_CHECKS auto result = parser->unescape_wobbly(in, _string_buf_loc); +#if !defined(SIMDJSON_VISUAL_STUDIO) && !defined(SIMDJSON_CLANG_VISUAL_STUDIO) + // Under Visual Studio, the next SIMDJSON_ASSUME fails with: the argument + // has side effects that will be discarded. SIMDJSON_ASSUME(!parser->string_buffer_overflow(_string_buf_loc)); +#endif // !defined(SIMDJSON_VISUAL_STUDIO) && !defined(SIMDJSON_CLANG_VISUAL_STUDIO) return result; #else return parser->unescape_wobbly(in, _string_buf_loc); @@ -58118,22 +98090,22 @@ simdjson_warn_unused simdjson_inline bool json_iterator::copy_to_buffer(const ui } } // namespace ondemand -} // namespace fallback +} // namespace haswell } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<fallback::ondemand::json_iterator>::simdjson_result(fallback::ondemand::json_iterator &&value) noexcept - : implementation_simdjson_result_base<fallback::ondemand::json_iterator>(std::forward<fallback::ondemand::json_iterator>(value)) {} -simdjson_inline simdjson_result<fallback::ondemand::json_iterator>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<fallback::ondemand::json_iterator>(error) {} +simdjson_inline simdjson_result<haswell::ondemand::json_iterator>::simdjson_result(haswell::ondemand::json_iterator &&value) noexcept + : implementation_simdjson_result_base<haswell::ondemand::json_iterator>(std::forward<haswell::ondemand::json_iterator>(value)) {} +simdjson_inline simdjson_result<haswell::ondemand::json_iterator>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<haswell::ondemand::json_iterator>(error) {} } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_INL_H -/* end file simdjson/generic/ondemand/json_iterator-inl.h for fallback */ -/* including simdjson/generic/ondemand/json_type-inl.h for fallback: #include "simdjson/generic/ondemand/json_type-inl.h" */ -/* begin file simdjson/generic/ondemand/json_type-inl.h for fallback */ +/* end file simdjson/generic/ondemand/json_iterator-inl.h for haswell */ +/* including simdjson/generic/ondemand/json_type-inl.h for haswell: #include "simdjson/generic/ondemand/json_type-inl.h" */ +/* begin file simdjson/generic/ondemand/json_type-inl.h for haswell */ #ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -58144,7 +98116,7 @@ simdjson_inline simdjson_result<fallback::ondemand::json_iterator>::simdjson_res /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace fallback { +namespace haswell { namespace ondemand { inline std::ostream& operator<<(std::ostream& out, json_type type) noexcept { @@ -58238,22 +98210,22 @@ simdjson_inline void number::skip_double() noexcept { } } // namespace ondemand -} // namespace fallback +} // namespace haswell } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<fallback::ondemand::json_type>::simdjson_result(fallback::ondemand::json_type &&value) noexcept - : implementation_simdjson_result_base<fallback::ondemand::json_type>(std::forward<fallback::ondemand::json_type>(value)) {} -simdjson_inline simdjson_result<fallback::ondemand::json_type>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<fallback::ondemand::json_type>(error) {} +simdjson_inline simdjson_result<haswell::ondemand::json_type>::simdjson_result(haswell::ondemand::json_type &&value) noexcept + : implementation_simdjson_result_base<haswell::ondemand::json_type>(std::forward<haswell::ondemand::json_type>(value)) {} +simdjson_inline simdjson_result<haswell::ondemand::json_type>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<haswell::ondemand::json_type>(error) {} } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_INL_H -/* end file simdjson/generic/ondemand/json_type-inl.h for fallback */ -/* including simdjson/generic/ondemand/logger-inl.h for fallback: #include "simdjson/generic/ondemand/logger-inl.h" */ -/* begin file simdjson/generic/ondemand/logger-inl.h for fallback */ +/* end file simdjson/generic/ondemand/json_type-inl.h for haswell */ +/* including simdjson/generic/ondemand/logger-inl.h for haswell: #include "simdjson/generic/ondemand/logger-inl.h" */ +/* begin file simdjson/generic/ondemand/logger-inl.h for haswell */ #ifndef SIMDJSON_GENERIC_ONDEMAND_LOGGER_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -58268,7 +98240,7 @@ simdjson_inline simdjson_result<fallback::ondemand::json_type>::simdjson_result( #include <cstring> namespace simdjson { -namespace fallback { +namespace haswell { namespace ondemand { namespace logger { @@ -58475,13 +98447,13 @@ inline void log_line(const json_iterator &iter, token_position index, depth_t de } // namespace logger } // namespace ondemand -} // namespace fallback +} // namespace haswell } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_LOGGER_INL_H -/* end file simdjson/generic/ondemand/logger-inl.h for fallback */ -/* including simdjson/generic/ondemand/object-inl.h for fallback: #include "simdjson/generic/ondemand/object-inl.h" */ -/* begin file simdjson/generic/ondemand/object-inl.h for fallback */ +/* end file simdjson/generic/ondemand/logger-inl.h for haswell */ +/* including simdjson/generic/ondemand/object-inl.h for haswell: #include "simdjson/generic/ondemand/object-inl.h" */ +/* begin file simdjson/generic/ondemand/object-inl.h for haswell */ #ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -58501,7 +98473,7 @@ inline void log_line(const json_iterator &iter, token_position index, depth_t de /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace fallback { +namespace haswell { namespace ondemand { simdjson_inline simdjson_result<value> object::find_field_unordered(const std::string_view key) & noexcept { @@ -58775,55 +98747,55 @@ simdjson_warn_unused simdjson_inline error_code object::extract_into(T& out) & n #endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION } // namespace ondemand -} // namespace fallback +} // namespace haswell } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<fallback::ondemand::object>::simdjson_result(fallback::ondemand::object &&value) noexcept - : implementation_simdjson_result_base<fallback::ondemand::object>(std::forward<fallback::ondemand::object>(value)) {} -simdjson_inline simdjson_result<fallback::ondemand::object>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<fallback::ondemand::object>(error) {} +simdjson_inline simdjson_result<haswell::ondemand::object>::simdjson_result(haswell::ondemand::object &&value) noexcept + : implementation_simdjson_result_base<haswell::ondemand::object>(std::forward<haswell::ondemand::object>(value)) {} +simdjson_inline simdjson_result<haswell::ondemand::object>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<haswell::ondemand::object>(error) {} -simdjson_inline simdjson_result<fallback::ondemand::object_iterator> simdjson_result<fallback::ondemand::object>::begin() noexcept { +simdjson_inline simdjson_result<haswell::ondemand::object_iterator> simdjson_result<haswell::ondemand::object>::begin() noexcept { if (error()) { return error(); } return first.begin(); } -simdjson_inline simdjson_result<fallback::ondemand::object_iterator> simdjson_result<fallback::ondemand::object>::end() noexcept { +simdjson_inline simdjson_result<haswell::ondemand::object_iterator> simdjson_result<haswell::ondemand::object>::end() noexcept { if (error()) { return error(); } return first.end(); } -simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::object>::find_field_unordered(std::string_view key) & noexcept { +simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::object>::find_field_unordered(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::object>::find_field_unordered(std::string_view key) && noexcept { +simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::object>::find_field_unordered(std::string_view key) && noexcept { if (error()) { return error(); } - return std::forward<fallback::ondemand::object>(first).find_field_unordered(key); + return std::forward<haswell::ondemand::object>(first).find_field_unordered(key); } -simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::object>::operator[](std::string_view key) & noexcept { +simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::object>::operator[](std::string_view key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::object>::operator[](std::string_view key) && noexcept { +simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::object>::operator[](std::string_view key) && noexcept { if (error()) { return error(); } - return std::forward<fallback::ondemand::object>(first)[key]; + return std::forward<haswell::ondemand::object>(first)[key]; } -simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::object>::find_field(std::string_view key) & noexcept { +simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::object>::find_field(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::object>::find_field(std::string_view key) && noexcept { +simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::object>::find_field(std::string_view key) && noexcept { if (error()) { return error(); } - return std::forward<fallback::ondemand::object>(first).find_field(key); + return std::forward<haswell::ondemand::object>(first).find_field(key); } -simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::object>::at_pointer(std::string_view json_pointer) noexcept { +simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::object>::at_pointer(std::string_view json_pointer) noexcept { if (error()) { return error(); } return first.at_pointer(json_pointer); } -simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallback::ondemand::object>::at_path( +simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::object>::at_path( std::string_view json_path) noexcept { if (error()) { return error(); @@ -58831,27 +98803,27 @@ simdjson_inline simdjson_result<fallback::ondemand::value> simdjson_result<fallb return first.at_path(json_path); } -simdjson_inline simdjson_result<std::vector<fallback::ondemand::value>> simdjson_result<fallback::ondemand::object>::at_path_with_wildcard(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<std::vector<haswell::ondemand::value>> simdjson_result<haswell::ondemand::object>::at_path_with_wildcard(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path_with_wildcard(json_path); } -inline simdjson_result<bool> simdjson_result<fallback::ondemand::object>::reset() noexcept { +inline simdjson_result<bool> simdjson_result<haswell::ondemand::object>::reset() noexcept { if (error()) { return error(); } return first.reset(); } -inline simdjson_result<bool> simdjson_result<fallback::ondemand::object>::is_empty() noexcept { +inline simdjson_result<bool> simdjson_result<haswell::ondemand::object>::is_empty() noexcept { if (error()) { return error(); } return first.is_empty(); } -simdjson_inline simdjson_result<size_t> simdjson_result<fallback::ondemand::object>::count_fields() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<haswell::ondemand::object>::count_fields() & noexcept { if (error()) { return error(); } return first.count_fields(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<fallback::ondemand::object>::raw_json() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<haswell::ondemand::object>::raw_json() noexcept { if (error()) { return error(); } return first.raw_json(); } @@ -58859,9 +98831,9 @@ simdjson_inline simdjson_result<std::string_view> simdjson_result<fallback::ond } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_INL_H -/* end file simdjson/generic/ondemand/object-inl.h for fallback */ -/* including simdjson/generic/ondemand/object_iterator-inl.h for fallback: #include "simdjson/generic/ondemand/object_iterator-inl.h" */ -/* begin file simdjson/generic/ondemand/object_iterator-inl.h for fallback */ +/* end file simdjson/generic/ondemand/object-inl.h for haswell */ +/* including simdjson/generic/ondemand/object_iterator-inl.h for haswell: #include "simdjson/generic/ondemand/object_iterator-inl.h" */ +/* begin file simdjson/generic/ondemand/object_iterator-inl.h for haswell */ #ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -58873,7 +98845,7 @@ simdjson_inline simdjson_result<std::string_view> simdjson_result<fallback::ond /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace fallback { +namespace haswell { namespace ondemand { // @@ -58885,6 +98857,11 @@ simdjson_inline object_iterator::object_iterator(const value_iterator &_iter) no {} simdjson_inline simdjson_result<field> object_iterator::operator*() noexcept { +#if SIMDJSON_DEVELOPMENT_CHECKS + // We must call * once per iteration. + SIMDJSON_ASSUME(!has_been_referenced); + has_been_referenced = true; +#endif error_code error = iter.error(); if (error) { iter.abandon(); return error; } auto result = field::start(iter); @@ -58903,6 +98880,11 @@ simdjson_inline bool object_iterator::operator!=(const object_iterator &) const SIMDJSON_PUSH_DISABLE_WARNINGS SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING simdjson_inline object_iterator &object_iterator::operator++() noexcept { +#if SIMDJSON_DEVELOPMENT_CHECKS + // Before calling ++, we must have called *. + SIMDJSON_ASSUME(has_been_referenced); + has_been_referenced = false; +#endif // TODO this is a safety rail ... users should exit loops as soon as they receive an error. // Nonetheless, let's see if performance is OK with this if statement--the compiler may give it to us for free. if (!iter.is_open()) { return *this; } // Iterator will be released if there is an error @@ -58958,39 +98940,39 @@ SIMDJSON_POP_DISABLE_WARNINGS // } // namespace ondemand -} // namespace fallback +} // namespace haswell } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<fallback::ondemand::object_iterator>::simdjson_result( - fallback::ondemand::object_iterator &&value +simdjson_inline simdjson_result<haswell::ondemand::object_iterator>::simdjson_result( + haswell::ondemand::object_iterator &&value ) noexcept - : implementation_simdjson_result_base<fallback::ondemand::object_iterator>(std::forward<fallback::ondemand::object_iterator>(value)) + : implementation_simdjson_result_base<haswell::ondemand::object_iterator>(std::forward<haswell::ondemand::object_iterator>(value)) { first.iter.assert_is_valid(); } -simdjson_inline simdjson_result<fallback::ondemand::object_iterator>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<fallback::ondemand::object_iterator>({}, error) +simdjson_inline simdjson_result<haswell::ondemand::object_iterator>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<haswell::ondemand::object_iterator>({}, error) { } -simdjson_inline simdjson_result<fallback::ondemand::field> simdjson_result<fallback::ondemand::object_iterator>::operator*() noexcept { +simdjson_inline simdjson_result<haswell::ondemand::field> simdjson_result<haswell::ondemand::object_iterator>::operator*() noexcept { if (error()) { return error(); } return *first; } // If we're iterating and there is an error, return the error once. -simdjson_inline bool simdjson_result<fallback::ondemand::object_iterator>::operator==(const simdjson_result<fallback::ondemand::object_iterator> &other) const noexcept { +simdjson_inline bool simdjson_result<haswell::ondemand::object_iterator>::operator==(const simdjson_result<haswell::ondemand::object_iterator> &other) const noexcept { if (!first.iter.is_valid()) { return !error(); } return first == other.first; } // If we're iterating and there is an error, return the error once. -simdjson_inline bool simdjson_result<fallback::ondemand::object_iterator>::operator!=(const simdjson_result<fallback::ondemand::object_iterator> &other) const noexcept { +simdjson_inline bool simdjson_result<haswell::ondemand::object_iterator>::operator!=(const simdjson_result<haswell::ondemand::object_iterator> &other) const noexcept { if (!first.iter.is_valid()) { return error(); } return first != other.first; } // Checks for ']' and ',' -simdjson_inline simdjson_result<fallback::ondemand::object_iterator> &simdjson_result<fallback::ondemand::object_iterator>::operator++() noexcept { +simdjson_inline simdjson_result<haswell::ondemand::object_iterator> &simdjson_result<haswell::ondemand::object_iterator>::operator++() noexcept { // Clear the error if there is one, so we don't yield it twice if (error()) { second = SUCCESS; return *this; } ++first; @@ -59000,9 +98982,9 @@ simdjson_inline simdjson_result<fallback::ondemand::object_iterator> &simdjson_r } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_INL_H -/* end file simdjson/generic/ondemand/object_iterator-inl.h for fallback */ -/* including simdjson/generic/ondemand/parser-inl.h for fallback: #include "simdjson/generic/ondemand/parser-inl.h" */ -/* begin file simdjson/generic/ondemand/parser-inl.h for fallback */ +/* end file simdjson/generic/ondemand/object_iterator-inl.h for haswell */ +/* including simdjson/generic/ondemand/parser-inl.h for haswell: #include "simdjson/generic/ondemand/parser-inl.h" */ +/* begin file simdjson/generic/ondemand/parser-inl.h for haswell */ #ifndef SIMDJSON_GENERIC_ONDEMAND_PARSER_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -59019,7 +99001,7 @@ simdjson_inline simdjson_result<fallback::ondemand::object_iterator> &simdjson_r /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace fallback { +namespace haswell { namespace ondemand { simdjson_inline parser::parser(size_t max_capacity) noexcept @@ -59229,22 +99211,22 @@ simdjson_inline simdjson_warn_unused std::unique_ptr<ondemand::parser>& parser:: } // namespace ondemand -} // namespace fallback +} // namespace haswell } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<fallback::ondemand::parser>::simdjson_result(fallback::ondemand::parser &&value) noexcept - : implementation_simdjson_result_base<fallback::ondemand::parser>(std::forward<fallback::ondemand::parser>(value)) {} -simdjson_inline simdjson_result<fallback::ondemand::parser>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<fallback::ondemand::parser>(error) {} +simdjson_inline simdjson_result<haswell::ondemand::parser>::simdjson_result(haswell::ondemand::parser &&value) noexcept + : implementation_simdjson_result_base<haswell::ondemand::parser>(std::forward<haswell::ondemand::parser>(value)) {} +simdjson_inline simdjson_result<haswell::ondemand::parser>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<haswell::ondemand::parser>(error) {} } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_PARSER_INL_H -/* end file simdjson/generic/ondemand/parser-inl.h for fallback */ -/* including simdjson/generic/ondemand/raw_json_string-inl.h for fallback: #include "simdjson/generic/ondemand/raw_json_string-inl.h" */ -/* begin file simdjson/generic/ondemand/raw_json_string-inl.h for fallback */ +/* end file simdjson/generic/ondemand/parser-inl.h for haswell */ +/* including simdjson/generic/ondemand/raw_json_string-inl.h for haswell: #include "simdjson/generic/ondemand/raw_json_string-inl.h" */ +/* begin file simdjson/generic/ondemand/raw_json_string-inl.h for haswell */ #ifndef SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -59257,7 +99239,7 @@ simdjson_inline simdjson_result<fallback::ondemand::parser>::simdjson_result(err namespace simdjson { -namespace fallback { +namespace haswell { namespace ondemand { simdjson_inline raw_json_string::raw_json_string(const uint8_t * _buf) noexcept : buf{_buf} {} @@ -59375,333 +99357,94 @@ simdjson_inline bool raw_json_string::is_equal(const char* target) const noexcep for(;target[pos];pos++) { if(r[pos] != target[pos]) { return false; } // if target is a compile-time constant and it is free from - // quotes, then the next part could get optimized away through - // inlining. - if((target[pos] == '"') && !escaping) { - // We have reached the end of the raw_json_string but - // the target is not done. - return false; - } else if(target[pos] == '\\') { - escaping = !escaping; - } else { - escaping = false; - } - } - if(r[pos] != '"') { return false; } - return true; -} - -simdjson_unused simdjson_inline bool operator==(const raw_json_string &a, std::string_view c) noexcept { - return a.unsafe_is_equal(c); -} - -simdjson_unused simdjson_inline bool operator==(std::string_view c, const raw_json_string &a) noexcept { - return a == c; -} - -simdjson_unused simdjson_inline bool operator!=(const raw_json_string &a, std::string_view c) noexcept { - return !(a == c); -} - -simdjson_unused simdjson_inline bool operator!=(std::string_view c, const raw_json_string &a) noexcept { - return !(a == c); -} - - -simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> raw_json_string::unescape(json_iterator &iter, bool allow_replacement) const noexcept { - return iter.unescape(*this, allow_replacement); -} - -simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> raw_json_string::unescape_wobbly(json_iterator &iter) const noexcept { - return iter.unescape_wobbly(*this); -} - -simdjson_unused simdjson_inline std::ostream &operator<<(std::ostream &out, const raw_json_string &str) noexcept { - bool in_escape = false; - const char *s = str.raw(); - while (true) { - switch (*s) { - case '\\': in_escape = !in_escape; break; - case '"': if (in_escape) { in_escape = false; } else { return out; } break; - default: if (in_escape) { in_escape = false; } - } - out << *s; - s++; - } -} - -} // namespace ondemand -} // namespace fallback -} // namespace simdjson - -namespace simdjson { - -simdjson_inline simdjson_result<fallback::ondemand::raw_json_string>::simdjson_result(fallback::ondemand::raw_json_string &&value) noexcept - : implementation_simdjson_result_base<fallback::ondemand::raw_json_string>(std::forward<fallback::ondemand::raw_json_string>(value)) {} -simdjson_inline simdjson_result<fallback::ondemand::raw_json_string>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<fallback::ondemand::raw_json_string>(error) {} - -simdjson_inline simdjson_result<const char *> simdjson_result<fallback::ondemand::raw_json_string>::raw() const noexcept { - if (error()) { return error(); } - return first.raw(); -} -simdjson_inline char simdjson_result<fallback::ondemand::raw_json_string>::operator[](size_t i) const noexcept { - if (error()) { return error(); } - return first[i]; -} -simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> simdjson_result<fallback::ondemand::raw_json_string>::unescape(fallback::ondemand::json_iterator &iter, bool allow_replacement) const noexcept { - if (error()) { return error(); } - return first.unescape(iter, allow_replacement); -} -simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> simdjson_result<fallback::ondemand::raw_json_string>::unescape_wobbly(fallback::ondemand::json_iterator &iter) const noexcept { - if (error()) { return error(); } - return first.unescape_wobbly(iter); -} -} // namespace simdjson - -#endif // SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_INL_H -/* end file simdjson/generic/ondemand/raw_json_string-inl.h for fallback */ -/* including simdjson/generic/ondemand/serialization-inl.h for fallback: #include "simdjson/generic/ondemand/serialization-inl.h" */ -/* begin file simdjson/generic/ondemand/serialization-inl.h for fallback */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H - -/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document-inl.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/serialization.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */ -/* amalgamation skipped (editor-only): #if SIMDJSON_STATIC_REFLECTION */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_builder.h" */ -/* amalgamation skipped (editor-only): #endif */ -/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ - -namespace simdjson { - -inline std::string_view trim(const std::string_view str) noexcept { - // We can almost surely do better by rolling our own find_first_not_of function. - size_t first = str.find_first_not_of(" \t\n\r"); - // If we have the empty string (just white space), then no trimming is possible, and - // we return the empty string_view. - if (std::string_view::npos == first) { return std::string_view(); } - size_t last = str.find_last_not_of(" \t\n\r"); - return str.substr(first, (last - first + 1)); -} - - -inline simdjson_result<std::string_view> to_json_string(fallback::ondemand::document& x) noexcept { - std::string_view v; - auto error = x.raw_json().get(v); - if(error) {return error; } - return trim(v); -} - -inline simdjson_result<std::string_view> to_json_string(fallback::ondemand::document_reference& x) noexcept { - std::string_view v; - auto error = x.raw_json().get(v); - if(error) {return error; } - return trim(v); -} - -inline simdjson_result<std::string_view> to_json_string(fallback::ondemand::value& x) noexcept { - /** - * If we somehow receive a value that has already been consumed, - * then the following code could be in trouble. E.g., we create - * an array as needed, but if an array was already created, then - * it could be bad. - */ - using namespace fallback::ondemand; - fallback::ondemand::json_type t; - auto error = x.type().get(t); - if(error != SUCCESS) { return error; } - switch (t) - { - case json_type::array: - { - fallback::ondemand::array array; - error = x.get_array().get(array); - if(error) { return error; } - return to_json_string(array); - } - case json_type::object: - { - fallback::ondemand::object object; - error = x.get_object().get(object); - if(error) { return error; } - return to_json_string(object); + // quotes, then the next part could get optimized away through + // inlining. + if((target[pos] == '"') && !escaping) { + // We have reached the end of the raw_json_string but + // the target is not done. + return false; + } else if(target[pos] == '\\') { + escaping = !escaping; + } else { + escaping = false; } - default: - return trim(x.raw_json_token()); } + if(r[pos] != '"') { return false; } + return true; } -inline simdjson_result<std::string_view> to_json_string(fallback::ondemand::object& x) noexcept { - std::string_view v; - auto error = x.raw_json().get(v); - if(error) {return error; } - return trim(v); +simdjson_unused simdjson_inline bool operator==(const raw_json_string &a, std::string_view c) noexcept { + return a.unsafe_is_equal(c); } -inline simdjson_result<std::string_view> to_json_string(fallback::ondemand::array& x) noexcept { - std::string_view v; - auto error = x.raw_json().get(v); - if(error) {return error; } - return trim(v); +simdjson_unused simdjson_inline bool operator==(std::string_view c, const raw_json_string &a) noexcept { + return a == c; } -inline simdjson_result<std::string_view> to_json_string(simdjson_result<fallback::ondemand::document> x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); +simdjson_unused simdjson_inline bool operator!=(const raw_json_string &a, std::string_view c) noexcept { + return !(a == c); } -inline simdjson_result<std::string_view> to_json_string(simdjson_result<fallback::ondemand::document_reference> x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); +simdjson_unused simdjson_inline bool operator!=(std::string_view c, const raw_json_string &a) noexcept { + return !(a == c); } -inline simdjson_result<std::string_view> to_json_string(simdjson_result<fallback::ondemand::value> x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); -} -inline simdjson_result<std::string_view> to_json_string(simdjson_result<fallback::ondemand::object> x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); +simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> raw_json_string::unescape(json_iterator &iter, bool allow_replacement) const noexcept { + return iter.unescape(*this, allow_replacement); } -inline simdjson_result<std::string_view> to_json_string(simdjson_result<fallback::ondemand::array> x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); +simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> raw_json_string::unescape_wobbly(json_iterator &iter) const noexcept { + return iter.unescape_wobbly(*this); } -} // namespace simdjson - -namespace simdjson { namespace fallback { namespace ondemand { -#if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::fallback::ondemand::value x) { - std::string_view v; - auto error = simdjson::to_json_string(x).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - throw simdjson::simdjson_error(error); - } -} -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::fallback::ondemand::value> x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); -} -#else -inline std::ostream& operator<<(std::ostream& out, simdjson::fallback::ondemand::value x) { - std::string_view v; - auto error = simdjson::to_json_string(x).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - return (out << error); +simdjson_unused simdjson_inline std::ostream &operator<<(std::ostream &out, const raw_json_string &str) noexcept { + bool in_escape = false; + const char *s = str.raw(); + while (true) { + switch (*s) { + case '\\': in_escape = !in_escape; break; + case '"': if (in_escape) { in_escape = false; } else { return out; } break; + default: if (in_escape) { in_escape = false; } + } + out << *s; + s++; } } -#endif -#if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::fallback::ondemand::array value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - throw simdjson::simdjson_error(error); - } -} -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::fallback::ondemand::array> x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); -} -#else -inline std::ostream& operator<<(std::ostream& out, simdjson::fallback::ondemand::array value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - return (out << error); - } -} -#endif +} // namespace ondemand +} // namespace haswell +} // namespace simdjson -#if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::fallback::ondemand::document& value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - throw simdjson::simdjson_error(error); - } -} -inline std::ostream& operator<<(std::ostream& out, simdjson::fallback::ondemand::document_reference& value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - throw simdjson::simdjson_error(error); - } -} -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::fallback::ondemand::document>&& x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); -} -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::fallback::ondemand::document_reference>&& x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); -} -#else -inline std::ostream& operator<<(std::ostream& out, simdjson::fallback::ondemand::document& value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - return (out << error); - } -} -#endif +namespace simdjson { -#if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::fallback::ondemand::object value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - throw simdjson::simdjson_error(error); - } +simdjson_inline simdjson_result<haswell::ondemand::raw_json_string>::simdjson_result(haswell::ondemand::raw_json_string &&value) noexcept + : implementation_simdjson_result_base<haswell::ondemand::raw_json_string>(std::forward<haswell::ondemand::raw_json_string>(value)) {} +simdjson_inline simdjson_result<haswell::ondemand::raw_json_string>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<haswell::ondemand::raw_json_string>(error) {} + +simdjson_inline simdjson_result<const char *> simdjson_result<haswell::ondemand::raw_json_string>::raw() const noexcept { + if (error()) { return error(); } + return first.raw(); } -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::fallback::ondemand::object> x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); +simdjson_inline char simdjson_result<haswell::ondemand::raw_json_string>::operator[](size_t i) const noexcept { + if (error()) { return error(); } + return first[i]; } -#else -inline std::ostream& operator<<(std::ostream& out, simdjson::fallback::ondemand::object value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - return (out << error); - } +simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> simdjson_result<haswell::ondemand::raw_json_string>::unescape(haswell::ondemand::json_iterator &iter, bool allow_replacement) const noexcept { + if (error()) { return error(); } + return first.unescape(iter, allow_replacement); } -#endif -}}} // namespace simdjson::fallback::ondemand +simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> simdjson_result<haswell::ondemand::raw_json_string>::unescape_wobbly(haswell::ondemand::json_iterator &iter) const noexcept { + if (error()) { return error(); } + return first.unescape_wobbly(iter); +} +} // namespace simdjson -#endif // SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H -/* end file simdjson/generic/ondemand/serialization-inl.h for fallback */ -/* including simdjson/generic/ondemand/token_iterator-inl.h for fallback: #include "simdjson/generic/ondemand/token_iterator-inl.h" */ -/* begin file simdjson/generic/ondemand/token_iterator-inl.h for fallback */ +#endif // SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_INL_H +/* end file simdjson/generic/ondemand/raw_json_string-inl.h for haswell */ +/* including simdjson/generic/ondemand/token_iterator-inl.h for haswell: #include "simdjson/generic/ondemand/token_iterator-inl.h" */ +/* begin file simdjson/generic/ondemand/token_iterator-inl.h for haswell */ #ifndef SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -59712,7 +99455,7 @@ inline std::ostream& operator<<(std::ostream& out, simdjson::fallback::ondemand: /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace fallback { +namespace haswell { namespace ondemand { simdjson_inline token_iterator::token_iterator( @@ -59783,22 +99526,22 @@ simdjson_inline bool token_iterator::operator<=(const token_iterator &other) con } } // namespace ondemand -} // namespace fallback +} // namespace haswell } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<fallback::ondemand::token_iterator>::simdjson_result(fallback::ondemand::token_iterator &&value) noexcept - : implementation_simdjson_result_base<fallback::ondemand::token_iterator>(std::forward<fallback::ondemand::token_iterator>(value)) {} -simdjson_inline simdjson_result<fallback::ondemand::token_iterator>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<fallback::ondemand::token_iterator>(error) {} +simdjson_inline simdjson_result<haswell::ondemand::token_iterator>::simdjson_result(haswell::ondemand::token_iterator &&value) noexcept + : implementation_simdjson_result_base<haswell::ondemand::token_iterator>(std::forward<haswell::ondemand::token_iterator>(value)) {} +simdjson_inline simdjson_result<haswell::ondemand::token_iterator>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<haswell::ondemand::token_iterator>(error) {} } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_INL_H -/* end file simdjson/generic/ondemand/token_iterator-inl.h for fallback */ -/* including simdjson/generic/ondemand/value_iterator-inl.h for fallback: #include "simdjson/generic/ondemand/value_iterator-inl.h" */ -/* begin file simdjson/generic/ondemand/value_iterator-inl.h for fallback */ +/* end file simdjson/generic/ondemand/token_iterator-inl.h for haswell */ +/* including simdjson/generic/ondemand/value_iterator-inl.h for haswell: #include "simdjson/generic/ondemand/value_iterator-inl.h" */ +/* begin file simdjson/generic/ondemand/value_iterator-inl.h for haswell */ #ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -59813,7 +99556,7 @@ simdjson_inline simdjson_result<fallback::ondemand::token_iterator>::simdjson_re /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace fallback { +namespace haswell { namespace ondemand { simdjson_inline value_iterator::value_iterator( @@ -59895,7 +99638,6 @@ simdjson_warn_unused simdjson_inline error_code value_iterator::end_container() simdjson_warn_unused simdjson_inline simdjson_result<bool> value_iterator::has_next_field() noexcept { assert_at_next(); - // It's illegal to call this unless there are more tokens: anything that ends in } or ] is // obligated to verify there are more tokens if they are not the top level. switch (*_json_iter->return_current_and_advance()) { @@ -60317,9 +100059,13 @@ simdjson_warn_unused simdjson_inline simdjson_result<std::string_view> value_ite template <typename string_type> simdjson_warn_unused simdjson_inline error_code value_iterator::get_string(string_type& receiver, bool allow_replacement) noexcept { std::string_view content; + // Save the string buffer location so that we can restore it after get_string + auto saved_string_buf_loc = _json_iter->string_buf_loc(); auto err = get_string(allow_replacement).get(content); if (err) { return err; } receiver = content; + // Restore the string buffer location, effectively discarding any temporary string storage + _json_iter->string_buf_loc() = saved_string_buf_loc; return SUCCESS; } simdjson_warn_unused simdjson_inline simdjson_result<std::string_view> value_iterator::get_wobbly_string() noexcept { @@ -60407,7 +100153,7 @@ simdjson_inline simdjson_result<bool> value_iterator::is_root_integer(bool check return answer; } -simdjson_inline simdjson_result<fallback::number_type> value_iterator::get_root_number_type(bool check_trailing) noexcept { +simdjson_inline simdjson_result<haswell::number_type> value_iterator::get_root_number_type(bool check_trailing) noexcept { auto max_len = peek_root_length(); auto json = peek_root_scalar("number"); // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/, @@ -60459,9 +100205,13 @@ simdjson_warn_unused simdjson_inline simdjson_result<std::string_view> value_ite template <typename string_type> simdjson_warn_unused simdjson_inline error_code value_iterator::get_root_string(string_type& receiver, bool check_trailing, bool allow_replacement) noexcept { std::string_view content; + // Save the string buffer location so that we can restore it after get_string + auto saved_string_buf_loc = _json_iter->string_buf_loc(); auto err = get_root_string(check_trailing, allow_replacement).get(content); if (err) { return err; } receiver = content; + // Restore the string buffer location, effectively discarding any temporary string storage + _json_iter->string_buf_loc() = saved_string_buf_loc; return SUCCESS; } simdjson_warn_unused simdjson_inline simdjson_result<std::string_view> value_iterator::get_root_wobbly_string(bool check_trailing) noexcept { @@ -60532,1467 +100282,617 @@ simdjson_warn_unused simdjson_inline simdjson_result<int64_t> value_iterator::ge logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 20 characters"); return NUMBER_ERROR; } - - auto result = numberparsing::parse_integer_in_string(tmpbuf); - if(result.error() == SUCCESS) { - if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } - advance_root_scalar("int64"); - } - return result; -} -simdjson_warn_unused simdjson_inline simdjson_result<double> value_iterator::get_root_double(bool check_trailing) noexcept { - auto max_len = peek_root_length(); - auto json = peek_root_scalar("double"); - // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/, - // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest - // number: -0.<fraction>e-308. - uint8_t tmpbuf[1074+8+1+1]; // +1 for null termination. - tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated. - if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) { - logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters"); - return NUMBER_ERROR; - } - auto result = numberparsing::parse_double(tmpbuf); - if(result.error() == SUCCESS) { - if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } - advance_root_scalar("double"); - } - return result; -} - -simdjson_warn_unused simdjson_inline simdjson_result<double> value_iterator::get_root_double_in_string(bool check_trailing) noexcept { - auto max_len = peek_root_length(); - auto json = peek_root_scalar("double"); - // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/, - // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest - // number: -0.<fraction>e-308. - uint8_t tmpbuf[1074+8+1+1]; // +1 for null termination. - tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated. - if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) { - logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters"); - return NUMBER_ERROR; - } - auto result = numberparsing::parse_double_in_string(tmpbuf); - if(result.error() == SUCCESS) { - if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } - advance_root_scalar("double"); - } - return result; -} - -simdjson_warn_unused simdjson_inline simdjson_result<bool> value_iterator::get_root_bool(bool check_trailing) noexcept { - auto max_len = peek_root_length(); - auto json = peek_root_scalar("bool"); - // We have a boolean if we have either "true" or "false" and the next character is either - // a structural character or whitespace. We also check that the length is correct: - // "true" and "false" are 4 and 5 characters long, respectively. - bool value_true = (max_len >= 4 && !atomparsing::str4ncmp(json, "true") && - (max_len == 4 || jsoncharutils::is_structural_or_whitespace(json[4]))); - bool value_false = (max_len >= 5 && !atomparsing::str4ncmp(json, "false") && - (max_len == 5 || jsoncharutils::is_structural_or_whitespace(json[5]))); - if(value_true == false && value_false == false) { return incorrect_type_error("Not a boolean"); } - if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } - advance_root_scalar("bool"); - return value_true; -} - -simdjson_inline simdjson_result<bool> value_iterator::is_root_null(bool check_trailing) noexcept { - auto max_len = peek_root_length(); - auto json = peek_root_scalar("null"); - bool result = (max_len >= 4 && !atomparsing::str4ncmp(json, "null") && - (max_len == 4 || jsoncharutils::is_structural_or_whitespace(json[4]))); - if(result) { // we have something that looks like a null. - if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } - advance_root_scalar("null"); - } else if (json[0] == 'n') { - return incorrect_type_error("Not a null but starts with n"); - } - return result; -} - -simdjson_warn_unused simdjson_inline error_code value_iterator::skip_child() noexcept { - SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); - SIMDJSON_ASSUME( _json_iter->_depth >= _depth ); - - return _json_iter->skip_child(depth()); -} - -simdjson_inline value_iterator value_iterator::child() const noexcept { - assert_at_child(); - return { _json_iter, depth()+1, _json_iter->token.position() }; -} - -// GCC 7 warns when the first line of this function is inlined away into oblivion due to the caller -// relating depth and iterator depth, which is a desired effect. It does not happen if is_open is -// marked non-inline. -SIMDJSON_PUSH_DISABLE_WARNINGS -SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING -simdjson_inline bool value_iterator::is_open() const noexcept { - return _json_iter->depth() >= depth(); -} -SIMDJSON_POP_DISABLE_WARNINGS - -simdjson_inline bool value_iterator::at_end() const noexcept { - return _json_iter->at_end(); -} - -simdjson_inline bool value_iterator::at_start() const noexcept { - return _json_iter->token.position() == start_position(); -} - -simdjson_inline bool value_iterator::at_first_field() const noexcept { - SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); - return _json_iter->token.position() == start_position() + 1; -} - -simdjson_inline void value_iterator::abandon() noexcept { - _json_iter->abandon(); -} - -simdjson_warn_unused simdjson_inline depth_t value_iterator::depth() const noexcept { - return _depth; -} -simdjson_warn_unused simdjson_inline error_code value_iterator::error() const noexcept { - return _json_iter->error; -} -simdjson_warn_unused simdjson_inline uint8_t *&value_iterator::string_buf_loc() noexcept { - return _json_iter->string_buf_loc(); -} -simdjson_warn_unused simdjson_inline const json_iterator &value_iterator::json_iter() const noexcept { - return *_json_iter; -} -simdjson_warn_unused simdjson_inline json_iterator &value_iterator::json_iter() noexcept { - return *_json_iter; -} - -simdjson_inline const uint8_t *value_iterator::peek_start() const noexcept { - return _json_iter->peek(start_position()); -} -simdjson_inline uint32_t value_iterator::peek_start_length() const noexcept { - return _json_iter->peek_length(start_position()); -} -simdjson_inline uint32_t value_iterator::peek_root_length() const noexcept { - return _json_iter->peek_root_length(start_position()); -} - -simdjson_inline const uint8_t *value_iterator::peek_scalar(const char *type) noexcept { - logger::log_value(*_json_iter, start_position(), depth(), type); - // If we're not at the position anymore, we don't want to advance the cursor. - if (!is_at_start()) { return peek_start(); } - - // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value. - assert_at_start(); - return _json_iter->peek(); -} - -simdjson_inline void value_iterator::advance_scalar(const char *type) noexcept { - logger::log_value(*_json_iter, start_position(), depth(), type); - // If we're not at the position anymore, we don't want to advance the cursor. - if (!is_at_start()) { return; } - - // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value. - assert_at_start(); - _json_iter->return_current_and_advance(); - _json_iter->ascend_to(depth()-1); -} - -simdjson_warn_unused simdjson_inline error_code value_iterator::start_container(uint8_t start_char, const char *incorrect_type_message, const char *type) noexcept { - logger::log_start_value(*_json_iter, start_position(), depth(), type); - // If we're not at the position anymore, we don't want to advance the cursor. - const uint8_t *json; - if (!is_at_start()) { -#if SIMDJSON_DEVELOPMENT_CHECKS - if (!is_at_iterator_start()) { return OUT_OF_ORDER_ITERATION; } -#endif - json = peek_start(); - if (*json != start_char) { return incorrect_type_error(incorrect_type_message); } - } else { - assert_at_start(); - /** - * We should be prudent. Let us peek. If it is not the right type, we - * return an error. Only once we have determined that we have the right - * type are we allowed to advance! - */ - json = _json_iter->peek(); - if (*json != start_char) { return incorrect_type_error(incorrect_type_message); } - _json_iter->return_current_and_advance(); - } - - - return SUCCESS; -} - - -simdjson_inline const uint8_t *value_iterator::peek_root_scalar(const char *type) noexcept { - logger::log_value(*_json_iter, start_position(), depth(), type); - if (!is_at_start()) { return peek_start(); } - - assert_at_root(); - return _json_iter->peek(); -} -simdjson_inline const uint8_t *value_iterator::peek_non_root_scalar(const char *type) noexcept { - logger::log_value(*_json_iter, start_position(), depth(), type); - if (!is_at_start()) { return peek_start(); } - - assert_at_non_root_start(); - return _json_iter->peek(); -} - -simdjson_inline void value_iterator::advance_root_scalar(const char *type) noexcept { - logger::log_value(*_json_iter, start_position(), depth(), type); - if (!is_at_start()) { return; } - - assert_at_root(); - _json_iter->return_current_and_advance(); - _json_iter->ascend_to(depth()-1); -} -simdjson_inline void value_iterator::advance_non_root_scalar(const char *type) noexcept { - logger::log_value(*_json_iter, start_position(), depth(), type); - if (!is_at_start()) { return; } - - assert_at_non_root_start(); - _json_iter->return_current_and_advance(); - _json_iter->ascend_to(depth()-1); -} - -simdjson_inline error_code value_iterator::incorrect_type_error(const char *message) const noexcept { - logger::log_error(*_json_iter, start_position(), depth(), message); - return INCORRECT_TYPE; -} - -simdjson_inline bool value_iterator::is_at_start() const noexcept { - return position() == start_position(); -} - -simdjson_inline bool value_iterator::is_at_key() const noexcept { - // Keys are at the same depth as the object. - // Note here that we could be safer and check that we are within an object, - // but we do not. - return _depth == _json_iter->_depth && *_json_iter->peek() == '"'; -} - -simdjson_inline bool value_iterator::is_at_iterator_start() const noexcept { - // We can legitimately be either at the first value ([1]), or after the array if it's empty ([]). - auto delta = position() - start_position(); - return delta == 1 || delta == 2; -} - -inline void value_iterator::assert_at_start() const noexcept { - SIMDJSON_ASSUME( _json_iter->token._position == _start_position ); - SIMDJSON_ASSUME( _json_iter->_depth == _depth ); - SIMDJSON_ASSUME( _depth > 0 ); -} - -inline void value_iterator::assert_at_container_start() const noexcept { - SIMDJSON_ASSUME( _json_iter->token._position == _start_position + 1 ); - SIMDJSON_ASSUME( _json_iter->_depth == _depth ); - SIMDJSON_ASSUME( _depth > 0 ); -} - -inline void value_iterator::assert_at_next() const noexcept { - SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); - SIMDJSON_ASSUME( _json_iter->_depth == _depth ); - SIMDJSON_ASSUME( _depth > 0 ); -} - -simdjson_inline void value_iterator::move_at_start() noexcept { - _json_iter->_depth = _depth; - _json_iter->token.set_position(_start_position); -} - -simdjson_inline void value_iterator::move_at_container_start() noexcept { - _json_iter->_depth = _depth; - _json_iter->token.set_position(_start_position + 1); -} - -simdjson_inline simdjson_result<bool> value_iterator::reset_array() noexcept { - if(error()) { return error(); } - move_at_container_start(); - return started_array(); -} - -simdjson_inline simdjson_result<bool> value_iterator::reset_object() noexcept { - if(error()) { return error(); } - move_at_container_start(); - return started_object(); -} - -inline void value_iterator::assert_at_child() const noexcept { - SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); - SIMDJSON_ASSUME( _json_iter->_depth == _depth + 1 ); - SIMDJSON_ASSUME( _depth > 0 ); -} - -inline void value_iterator::assert_at_root() const noexcept { - assert_at_start(); - SIMDJSON_ASSUME( _depth == 1 ); -} - -inline void value_iterator::assert_at_non_root_start() const noexcept { - assert_at_start(); - SIMDJSON_ASSUME( _depth > 1 ); -} - -inline void value_iterator::assert_is_valid() const noexcept { - SIMDJSON_ASSUME( _json_iter != nullptr ); -} - -simdjson_inline bool value_iterator::is_valid() const noexcept { - return _json_iter != nullptr; -} - -simdjson_inline simdjson_result<json_type> value_iterator::type() const noexcept { - switch (*peek_start()) { - case '{': - return json_type::object; - case '[': - return json_type::array; - case '"': - return json_type::string; - case 'n': - return json_type::null; - case 't': case 'f': - return json_type::boolean; - case '-': - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - return json_type::number; - default: - return json_type::unknown; - } -} - -simdjson_inline token_position value_iterator::start_position() const noexcept { - return _start_position; -} - -simdjson_inline token_position value_iterator::position() const noexcept { - return _json_iter->position(); -} - -simdjson_inline token_position value_iterator::end_position() const noexcept { - return _json_iter->end_position(); -} - -simdjson_inline token_position value_iterator::last_position() const noexcept { - return _json_iter->last_position(); -} - -simdjson_inline error_code value_iterator::report_error(error_code error, const char *message) noexcept { - return _json_iter->report_error(error, message); -} - -} // namespace ondemand -} // namespace fallback -} // namespace simdjson - -namespace simdjson { - -simdjson_inline simdjson_result<fallback::ondemand::value_iterator>::simdjson_result(fallback::ondemand::value_iterator &&value) noexcept - : implementation_simdjson_result_base<fallback::ondemand::value_iterator>(std::forward<fallback::ondemand::value_iterator>(value)) {} -simdjson_inline simdjson_result<fallback::ondemand::value_iterator>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<fallback::ondemand::value_iterator>(error) {} - -} // namespace simdjson - -#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H -/* end file simdjson/generic/ondemand/value_iterator-inl.h for fallback */ - -// JSON builder inline definitions -/* including simdjson/generic/ondemand/json_string_builder-inl.h for fallback: #include "simdjson/generic/ondemand/json_string_builder-inl.h" */ -/* begin file simdjson/generic/ondemand/json_string_builder-inl.h for fallback */ -/** - * This file is part of the builder API. It is temporarily in the ondemand - * directory but we will move it to a builder directory later. - */ -#include <array> -#include <cstring> -#include <type_traits> -#ifndef SIMDJSON_GENERIC_STRING_BUILDER_INL_H - -/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_INL_H */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_string_builder.h" */ -/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ - -/* - * Empirically, we have found that an inlined optimization is important for - * performance. The following macros are not ideal. We should find a better - * way to inline the code. - */ - -#if defined(__SSE2__) || defined(__x86_64__) || defined(__x86_64) || \ - (defined(_M_AMD64) || defined(_M_X64) || \ - (defined(_M_IX86_FP) && _M_IX86_FP == 2)) -#ifndef SIMDJSON_EXPERIMENTAL_HAS_SSE2 -#define SIMDJSON_EXPERIMENTAL_HAS_SSE2 1 -#endif -#endif - -#if defined(__aarch64__) || defined(_M_ARM64) -#ifndef SIMDJSON_EXPERIMENTAL_HAS_NEON -#define SIMDJSON_EXPERIMENTAL_HAS_NEON 1 -#endif -#endif -#if SIMDJSON_EXPERIMENTAL_HAS_NEON -#include <arm_neon.h> -#endif -#if SIMDJSON_EXPERIMENTAL_HAS_SSE2 -#include <emmintrin.h> -#endif - -namespace simdjson { -namespace fallback { -namespace builder { - -static SIMDJSON_CONSTEXPR_LAMBDA std::array<uint8_t, 256> - json_quotable_character = { - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - -/** - -A possible SWAR implementation of has_json_escapable_byte. It is not used -because it is slower than the current implementation. It is kept here for -reference (to show that we tried it). - -inline bool has_json_escapable_byte(uint64_t x) { - uint64_t is_ascii = 0x8080808080808080ULL & ~x; - uint64_t xor2 = x ^ 0x0202020202020202ULL; - uint64_t lt32_or_eq34 = xor2 - 0x2121212121212121ULL; - uint64_t sub92 = x ^ 0x5C5C5C5C5C5C5C5CULL; - uint64_t eq92 = (sub92 - 0x0101010101010101ULL); - return ((lt32_or_eq34 | eq92) & is_ascii) != 0; -} - -**/ - -SIMDJSON_CONSTEXPR_LAMBDA simdjson_inline bool -simple_needs_escaping(std::string_view v) { - for (char c : v) { - // a table lookup is faster than a series of comparisons - if (json_quotable_character[static_cast<uint8_t>(c)]) { - return true; - } - } - return false; -} - -#if SIMDJSON_EXPERIMENTAL_HAS_NEON -simdjson_inline bool fast_needs_escaping(std::string_view view) { - if (view.size() < 16) { - return simple_needs_escaping(view); - } - size_t i = 0; - uint8x16_t running = vdupq_n_u8(0); - uint8x16_t v34 = vdupq_n_u8(34); - uint8x16_t v92 = vdupq_n_u8(92); - - for (; i + 15 < view.size(); i += 16) { - uint8x16_t word = vld1q_u8((const uint8_t *)view.data() + i); - running = vorrq_u8(running, vceqq_u8(word, v34)); - running = vorrq_u8(running, vceqq_u8(word, v92)); - running = vorrq_u8(running, vcltq_u8(word, vdupq_n_u8(32))); - } - if (i < view.size()) { - uint8x16_t word = - vld1q_u8((const uint8_t *)view.data() + view.length() - 16); - running = vorrq_u8(running, vceqq_u8(word, v34)); - running = vorrq_u8(running, vceqq_u8(word, v92)); - running = vorrq_u8(running, vcltq_u8(word, vdupq_n_u8(32))); - } - return vmaxvq_u32(vreinterpretq_u32_u8(running)) != 0; -} -#elif SIMDJSON_EXPERIMENTAL_HAS_SSE2 -simdjson_inline bool fast_needs_escaping(std::string_view view) { - if (view.size() < 16) { - return simple_needs_escaping(view); - } - size_t i = 0; - __m128i running = _mm_setzero_si128(); - for (; i + 15 < view.size(); i += 16) { - - __m128i word = - _mm_loadu_si128(reinterpret_cast<const __m128i *>(view.data() + i)); - running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(34))); - running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(92))); - running = _mm_or_si128( - running, _mm_cmpeq_epi8(_mm_subs_epu8(word, _mm_set1_epi8(31)), - _mm_setzero_si128())); - } - if (i < view.size()) { - __m128i word = _mm_loadu_si128( - reinterpret_cast<const __m128i *>(view.data() + view.length() - 16)); - running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(34))); - running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(92))); - running = _mm_or_si128( - running, _mm_cmpeq_epi8(_mm_subs_epu8(word, _mm_set1_epi8(31)), - _mm_setzero_si128())); - } - return _mm_movemask_epi8(running) != 0; -} -#else -simdjson_inline bool fast_needs_escaping(std::string_view view) { - return simple_needs_escaping(view); -} -#endif - -SIMDJSON_CONSTEXPR_LAMBDA inline size_t -find_next_json_quotable_character(const std::string_view view, - size_t location) noexcept { - - for (auto pos = view.begin() + location; pos != view.end(); ++pos) { - if (json_quotable_character[static_cast<uint8_t>(*pos)]) { - return pos - view.begin(); - } - } - return size_t(view.size()); -} - -SIMDJSON_CONSTEXPR_LAMBDA static std::string_view control_chars[] = { - "\\u0000", "\\u0001", "\\u0002", "\\u0003", "\\u0004", "\\u0005", "\\u0006", - "\\u0007", "\\b", "\\t", "\\n", "\\u000b", "\\f", "\\r", - "\\u000e", "\\u000f", "\\u0010", "\\u0011", "\\u0012", "\\u0013", "\\u0014", - "\\u0015", "\\u0016", "\\u0017", "\\u0018", "\\u0019", "\\u001a", "\\u001b", - "\\u001c", "\\u001d", "\\u001e", "\\u001f"}; - -// All Unicode characters may be placed within the quotation marks, except for -// the characters that MUST be escaped: quotation mark, reverse solidus, and the -// control characters (U+0000 through U+001F). There are two-character sequence -// escape representations of some popular characters: -// \", \\, \b, \f, \n, \r, \t. -SIMDJSON_CONSTEXPR_LAMBDA void escape_json_char(char c, char *&out) { - if (c == '"') { - memcpy(out, "\\\"", 2); - out += 2; - } else if (c == '\\') { - memcpy(out, "\\\\", 2); - out += 2; - } else { - std::string_view v = control_chars[uint8_t(c)]; - memcpy(out, v.data(), v.size()); - out += v.size(); - } -} - -inline size_t write_string_escaped(const std::string_view input, char *out) { - size_t mysize = input.size(); - if (!fast_needs_escaping(input)) { // fast path! - memcpy(out, input.data(), input.size()); - return input.size(); - } - const char *const initout = out; - size_t location = find_next_json_quotable_character(input, 0); - memcpy(out, input.data(), location); - out += location; - escape_json_char(input[location], out); - location += 1; - while (location < mysize) { - size_t newlocation = find_next_json_quotable_character(input, location); - memcpy(out, input.data() + location, newlocation - location); - out += newlocation - location; - location = newlocation; - if (location == mysize) { - break; - } - escape_json_char(input[location], out); - location += 1; - } - return out - initout; -} - -simdjson_inline string_builder::string_builder(size_t initial_capacity) - : buffer(new(std::nothrow) char[initial_capacity]), position(0), - capacity(buffer.get() != nullptr ? initial_capacity : 0), - is_valid(buffer.get() != nullptr) {} - -simdjson_inline bool string_builder::capacity_check(size_t upcoming_bytes) { - // We use the convention that when is_valid is false, then the capacity and - // the position are 0. - // Most of the time, this function will return true. - if (simdjson_likely(upcoming_bytes <= capacity - position)) { - return true; - } - // check for overflow, most of the time there is no overflow - if (simdjson_likely(position + upcoming_bytes < position)) { - return false; - } - // We will rarely get here. - grow_buffer((std::max)(capacity * 2, position + upcoming_bytes)); - // If the buffer allocation failed, we set is_valid to false. - return is_valid; -} - -simdjson_inline void string_builder::grow_buffer(size_t desired_capacity) { - if (!is_valid) { - return; - } - std::unique_ptr<char[]> new_buffer(new (std::nothrow) char[desired_capacity]); - if (new_buffer.get() == nullptr) { - set_valid(false); - return; - } - std::memcpy(new_buffer.get(), buffer.get(), position); - buffer.swap(new_buffer); - capacity = desired_capacity; -} - -simdjson_inline void string_builder::set_valid(bool valid) noexcept { - if (!valid) { - is_valid = false; - capacity = 0; - position = 0; - buffer.reset(); - } else { - is_valid = true; - } -} - -simdjson_inline size_t string_builder::size() const noexcept { - return position; -} - -simdjson_inline void string_builder::append(char c) noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = c; - } -} - -simdjson_inline void string_builder::append_null() noexcept { - constexpr char null_literal[] = "null"; - constexpr size_t null_len = sizeof(null_literal) - 1; - if (capacity_check(null_len)) { - std::memcpy(buffer.get() + position, null_literal, null_len); - position += null_len; - } -} - -simdjson_inline void string_builder::clear() noexcept { - position = 0; - // if it was invalid, we should try to repair it - if (!is_valid) { - capacity = 0; - buffer.reset(); - is_valid = true; - } -} - -namespace internal { - -template <typename number_type, typename = typename std::enable_if< - std::is_unsigned<number_type>::value>::type> -simdjson_really_inline int int_log2(number_type x) { - return 63 - leading_zeroes(uint64_t(x) | 1); -} - -simdjson_really_inline int fast_digit_count_32(uint32_t x) { - static uint64_t table[] = { - 4294967296, 8589934582, 8589934582, 8589934582, 12884901788, - 12884901788, 12884901788, 17179868184, 17179868184, 17179868184, - 21474826480, 21474826480, 21474826480, 21474826480, 25769703776, - 25769703776, 25769703776, 30063771072, 30063771072, 30063771072, - 34349738368, 34349738368, 34349738368, 34349738368, 38554705664, - 38554705664, 38554705664, 41949672960, 41949672960, 41949672960, - 42949672960, 42949672960}; - return uint32_t((x + table[int_log2(x)]) >> 32); -} - -simdjson_really_inline int fast_digit_count_64(uint64_t x) { - static uint64_t table[] = {9, - 99, - 999, - 9999, - 99999, - 999999, - 9999999, - 99999999, - 999999999, - 9999999999, - 99999999999, - 999999999999, - 9999999999999, - 99999999999999, - 999999999999999ULL, - 9999999999999999ULL, - 99999999999999999ULL, - 999999999999999999ULL, - 9999999999999999999ULL}; - int y = (19 * int_log2(x) >> 6); - y += x > table[y]; - return y + 1; -} - -template <typename number_type, typename = typename std::enable_if< - std::is_unsigned<number_type>::value>::type> -simdjson_really_inline size_t digit_count(number_type v) noexcept { - static_assert(sizeof(number_type) == 8 || sizeof(number_type) == 4 || - sizeof(number_type) == 2 || sizeof(number_type) == 1, - "We only support 8-bit, 16-bit, 32-bit and 64-bit numbers"); - SIMDJSON_IF_CONSTEXPR(sizeof(number_type) <= 4) { - return fast_digit_count_32(static_cast<uint32_t>(v)); - } - else { - return fast_digit_count_64(static_cast<uint64_t>(v)); - } -} -static const char decimal_table[200] = { - 0x30, 0x30, 0x30, 0x31, 0x30, 0x32, 0x30, 0x33, 0x30, 0x34, 0x30, 0x35, - 0x30, 0x36, 0x30, 0x37, 0x30, 0x38, 0x30, 0x39, 0x31, 0x30, 0x31, 0x31, - 0x31, 0x32, 0x31, 0x33, 0x31, 0x34, 0x31, 0x35, 0x31, 0x36, 0x31, 0x37, - 0x31, 0x38, 0x31, 0x39, 0x32, 0x30, 0x32, 0x31, 0x32, 0x32, 0x32, 0x33, - 0x32, 0x34, 0x32, 0x35, 0x32, 0x36, 0x32, 0x37, 0x32, 0x38, 0x32, 0x39, - 0x33, 0x30, 0x33, 0x31, 0x33, 0x32, 0x33, 0x33, 0x33, 0x34, 0x33, 0x35, - 0x33, 0x36, 0x33, 0x37, 0x33, 0x38, 0x33, 0x39, 0x34, 0x30, 0x34, 0x31, - 0x34, 0x32, 0x34, 0x33, 0x34, 0x34, 0x34, 0x35, 0x34, 0x36, 0x34, 0x37, - 0x34, 0x38, 0x34, 0x39, 0x35, 0x30, 0x35, 0x31, 0x35, 0x32, 0x35, 0x33, - 0x35, 0x34, 0x35, 0x35, 0x35, 0x36, 0x35, 0x37, 0x35, 0x38, 0x35, 0x39, - 0x36, 0x30, 0x36, 0x31, 0x36, 0x32, 0x36, 0x33, 0x36, 0x34, 0x36, 0x35, - 0x36, 0x36, 0x36, 0x37, 0x36, 0x38, 0x36, 0x39, 0x37, 0x30, 0x37, 0x31, - 0x37, 0x32, 0x37, 0x33, 0x37, 0x34, 0x37, 0x35, 0x37, 0x36, 0x37, 0x37, - 0x37, 0x38, 0x37, 0x39, 0x38, 0x30, 0x38, 0x31, 0x38, 0x32, 0x38, 0x33, - 0x38, 0x34, 0x38, 0x35, 0x38, 0x36, 0x38, 0x37, 0x38, 0x38, 0x38, 0x39, - 0x39, 0x30, 0x39, 0x31, 0x39, 0x32, 0x39, 0x33, 0x39, 0x34, 0x39, 0x35, - 0x39, 0x36, 0x39, 0x37, 0x39, 0x38, 0x39, 0x39, -}; -} // namespace internal - -template <typename number_type, typename> -simdjson_inline void string_builder::append(number_type v) noexcept { - static_assert(std::is_same<number_type, bool>::value || - std::is_integral<number_type>::value || - std::is_floating_point<number_type>::value, - "Unsupported number type"); - // If C++17 is available, we can 'if constexpr' here. - SIMDJSON_IF_CONSTEXPR(std::is_same<number_type, bool>::value) { - if (v) { - constexpr char true_literal[] = "true"; - constexpr size_t true_len = sizeof(true_literal) - 1; - if (capacity_check(true_len)) { - std::memcpy(buffer.get() + position, true_literal, true_len); - position += true_len; - } - } else { - constexpr char false_literal[] = "false"; - constexpr size_t false_len = sizeof(false_literal) - 1; - if (capacity_check(false_len)) { - std::memcpy(buffer.get() + position, false_literal, false_len); - position += false_len; - } - } - } - else SIMDJSON_IF_CONSTEXPR(std::is_unsigned<number_type>::value) { - constexpr size_t max_number_size = 20; - if (capacity_check(max_number_size)) { - using unsigned_type = typename std::make_unsigned<number_type>::type; - unsigned_type pv = static_cast<unsigned_type>(v); - size_t dc = internal::digit_count(pv); - char *write_pointer = buffer.get() + position + dc - 1; - while (pv >= 100) { - memcpy(write_pointer - 1, &internal::decimal_table[(pv % 100) * 2], 2); - write_pointer -= 2; - pv /= 100; - } - if (pv >= 10) { - *write_pointer-- = char('0' + (pv % 10)); - pv /= 10; - } - *write_pointer = char('0' + pv); - position += dc; - } - } - else SIMDJSON_IF_CONSTEXPR(std::is_integral<number_type>::value) { - constexpr size_t max_number_size = 20; - if (capacity_check(max_number_size)) { - using unsigned_type = typename std::make_unsigned<number_type>::type; - bool negative = v < 0; - unsigned_type pv = static_cast<unsigned_type>(v); - if (negative) { - pv = 0 - pv; // the 0 is for Microsoft - } - size_t dc = internal::digit_count(pv); - // by always writing the minus sign, we avoid the branch. - buffer.get()[position] = '-'; - position += negative ? 1 : 0; - char *write_pointer = buffer.get() + position + dc - 1; - while (pv >= 100) { - memcpy(write_pointer - 1, &internal::decimal_table[(pv % 100) * 2], 2); - write_pointer -= 2; - pv /= 100; - } - if (pv >= 10) { - *write_pointer-- = char('0' + (pv % 10)); - pv /= 10; - } - *write_pointer = char('0' + pv); - position += dc; - } + + auto result = numberparsing::parse_integer_in_string(tmpbuf); + if(result.error() == SUCCESS) { + if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } + advance_root_scalar("int64"); } - else SIMDJSON_IF_CONSTEXPR(std::is_floating_point<number_type>::value) { - constexpr size_t max_number_size = 24; - if (capacity_check(max_number_size)) { - // We could specialize for float. - char *end = simdjson::internal::to_chars(buffer.get() + position, nullptr, - double(v)); - position = end - buffer.get(); - } + return result; +} +simdjson_warn_unused simdjson_inline simdjson_result<double> value_iterator::get_root_double(bool check_trailing) noexcept { + auto max_len = peek_root_length(); + auto json = peek_root_scalar("double"); + // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/, + // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest + // number: -0.<fraction>e-308. + uint8_t tmpbuf[1074+8+1+1]; // +1 for null termination. + tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated. + if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) { + logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters"); + return NUMBER_ERROR; + } + auto result = numberparsing::parse_double(tmpbuf); + if(result.error() == SUCCESS) { + if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } + advance_root_scalar("double"); } + return result; } -simdjson_inline void -string_builder::escape_and_append(std::string_view input) noexcept { - // escaping might turn a control character into \x00xx so 6 characters. - if (capacity_check(6 * input.size())) { - position += write_string_escaped(input, buffer.get() + position); +simdjson_warn_unused simdjson_inline simdjson_result<double> value_iterator::get_root_double_in_string(bool check_trailing) noexcept { + auto max_len = peek_root_length(); + auto json = peek_root_scalar("double"); + // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/, + // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest + // number: -0.<fraction>e-308. + uint8_t tmpbuf[1074+8+1+1]; // +1 for null termination. + tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated. + if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) { + logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters"); + return NUMBER_ERROR; } + auto result = numberparsing::parse_double_in_string(tmpbuf); + if(result.error() == SUCCESS) { + if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } + advance_root_scalar("double"); + } + return result; } -simdjson_inline void -string_builder::escape_and_append_with_quotes(std::string_view input) noexcept { - // escaping might turn a control character into \x00xx so 6 characters. - if (capacity_check(2 + 6 * input.size())) { - buffer.get()[position++] = '"'; - position += write_string_escaped(input, buffer.get() + position); - buffer.get()[position++] = '"'; - } +simdjson_warn_unused simdjson_inline simdjson_result<bool> value_iterator::get_root_bool(bool check_trailing) noexcept { + auto max_len = peek_root_length(); + auto json = peek_root_scalar("bool"); + // We have a boolean if we have either "true" or "false" and the next character is either + // a structural character or whitespace. We also check that the length is correct: + // "true" and "false" are 4 and 5 characters long, respectively. + bool value_true = (max_len >= 4 && !atomparsing::str4ncmp(json, "true") && + (max_len == 4 || jsoncharutils::is_structural_or_whitespace(json[4]))); + bool value_false = (max_len >= 5 && !atomparsing::str4ncmp(json, "false") && + (max_len == 5 || jsoncharutils::is_structural_or_whitespace(json[5]))); + if(value_true == false && value_false == false) { return incorrect_type_error("Not a boolean"); } + if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } + advance_root_scalar("bool"); + return value_true; } -simdjson_inline void -string_builder::escape_and_append_with_quotes(char input) noexcept { - // escaping might turn a control character into \x00xx so 6 characters. - if (capacity_check(2 + 6 * 1)) { - buffer.get()[position++] = '"'; - std::string_view cinput(&input, 1); - position += write_string_escaped(cinput, buffer.get() + position); - buffer.get()[position++] = '"'; +simdjson_inline simdjson_result<bool> value_iterator::is_root_null(bool check_trailing) noexcept { + auto max_len = peek_root_length(); + auto json = peek_root_scalar("null"); + bool result = (max_len >= 4 && !atomparsing::str4ncmp(json, "null") && + (max_len == 4 || jsoncharutils::is_structural_or_whitespace(json[4]))); + if(result) { // we have something that looks like a null. + if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } + advance_root_scalar("null"); + } else if (json[0] == 'n') { + return incorrect_type_error("Not a null but starts with n"); } + return result; } -simdjson_inline void -string_builder::escape_and_append_with_quotes(const char *input) noexcept { - std::string_view cinput(input); - escape_and_append_with_quotes(cinput); +simdjson_warn_unused simdjson_inline error_code value_iterator::skip_child() noexcept { + SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); + SIMDJSON_ASSUME( _json_iter->_depth >= _depth ); + + return _json_iter->skip_child(depth()); } -#if SIMDJSON_SUPPORTS_CONCEPTS -template <constevalutil::fixed_string key> -simdjson_inline void string_builder::escape_and_append_with_quotes() noexcept { - escape_and_append_with_quotes(constevalutil::string_constant<key>::value); + +simdjson_inline value_iterator value_iterator::child() const noexcept { + assert_at_child(); + return { _json_iter, depth()+1, _json_iter->token.position() }; } -#endif -simdjson_inline void string_builder::append_raw(const char *c) noexcept { - size_t len = std::strlen(c); - append_raw(c, len); +// GCC 7 warns when the first line of this function is inlined away into oblivion due to the caller +// relating depth and iterator depth, which is a desired effect. It does not happen if is_open is +// marked non-inline. +SIMDJSON_PUSH_DISABLE_WARNINGS +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING +simdjson_inline bool value_iterator::is_open() const noexcept { + return _json_iter->depth() >= depth(); } +SIMDJSON_POP_DISABLE_WARNINGS -simdjson_inline void -string_builder::append_raw(std::string_view input) noexcept { - if (capacity_check(input.size())) { - std::memcpy(buffer.get() + position, input.data(), input.size()); - position += input.size(); - } +simdjson_inline bool value_iterator::at_end() const noexcept { + return _json_iter->at_end(); } -simdjson_inline void string_builder::append_raw(const char *str, - size_t len) noexcept { - if (capacity_check(len)) { - std::memcpy(buffer.get() + position, str, len); - position += len; - } +simdjson_inline bool value_iterator::at_start() const noexcept { + return _json_iter->token.position() == start_position(); } -#if SIMDJSON_SUPPORTS_CONCEPTS -// Support for optional types (std::optional, etc.) -template <concepts::optional_type T> - requires(!require_custom_serialization<T>) -simdjson_inline void string_builder::append(const T &opt) { - if (opt) { - append(*opt); - } else { - append_null(); - } + +simdjson_inline bool value_iterator::at_first_field() const noexcept { + SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); + return _json_iter->token.position() == start_position() + 1; } -template <typename T> - requires(require_custom_serialization<T>) -simdjson_inline void string_builder::append(T &&val) { - serialize(*this, std::forward<T>(val)); +simdjson_inline void value_iterator::abandon() noexcept { + _json_iter->abandon(); } -template <typename T> - requires(std::is_convertible<T, std::string_view>::value || - std::is_same<T, const char *>::value) -simdjson_inline void string_builder::append(const T &value) { - escape_and_append_with_quotes(value); +simdjson_warn_unused simdjson_inline depth_t value_iterator::depth() const noexcept { + return _depth; +} +simdjson_warn_unused simdjson_inline error_code value_iterator::error() const noexcept { + return _json_iter->error; +} +simdjson_warn_unused simdjson_inline uint8_t *&value_iterator::string_buf_loc() noexcept { + return _json_iter->string_buf_loc(); +} +simdjson_warn_unused simdjson_inline const json_iterator &value_iterator::json_iter() const noexcept { + return *_json_iter; +} +simdjson_warn_unused simdjson_inline json_iterator &value_iterator::json_iter() noexcept { + return *_json_iter; } -#endif -#if SIMDJSON_SUPPORTS_RANGES && SIMDJSON_SUPPORTS_CONCEPTS -// Support for range-based appending (std::ranges::view, etc.) -template <std::ranges::range R> - requires(!std::is_convertible<R, std::string_view>::value && !require_custom_serialization<R>) -simdjson_inline void string_builder::append(const R &range) noexcept { - auto it = std::ranges::begin(range); - auto end = std::ranges::end(range); - if constexpr (concepts::is_pair<std::ranges::range_value_t<R>>) { - start_object(); +simdjson_inline const uint8_t *value_iterator::peek_start() const noexcept { + return _json_iter->peek(start_position()); +} +simdjson_inline uint32_t value_iterator::peek_start_length() const noexcept { + return _json_iter->peek_length(start_position()); +} +simdjson_inline uint32_t value_iterator::peek_root_length() const noexcept { + return _json_iter->peek_root_length(start_position()); +} - if (it == end) { - end_object(); - return; // Handle empty range - } - // Append first item without leading comma - append_key_value(it->first, it->second); - ++it; +simdjson_inline const uint8_t *value_iterator::peek_scalar(const char *type) noexcept { + logger::log_value(*_json_iter, start_position(), depth(), type); + // If we're not at the position anymore, we don't want to advance the cursor. + if (!is_at_start()) { return peek_start(); } - // Append remaining items with preceding commas - for (; it != end; ++it) { - append_comma(); - append_key_value(it->first, it->second); - } - end_object(); - } else { - start_array(); - if (it == end) { - end_array(); - return; // Handle empty range - } + // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value. + assert_at_start(); + return _json_iter->peek(); +} - // Append first item without leading comma - append(*it); - ++it; +simdjson_inline void value_iterator::advance_scalar(const char *type) noexcept { + logger::log_value(*_json_iter, start_position(), depth(), type); + // If we're not at the position anymore, we don't want to advance the cursor. + if (!is_at_start()) { return; } - // Append remaining items with preceding commas - for (; it != end; ++it) { - append_comma(); - append(*it); - } - end_array(); - } + // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value. + assert_at_start(); + _json_iter->return_current_and_advance(); + _json_iter->ascend_to(depth()-1); } +simdjson_warn_unused simdjson_inline error_code value_iterator::start_container(uint8_t start_char, const char *incorrect_type_message, const char *type) noexcept { + logger::log_start_value(*_json_iter, start_position(), depth(), type); + // If we're not at the position anymore, we don't want to advance the cursor. + const uint8_t *json; + if (!is_at_start()) { +#if SIMDJSON_DEVELOPMENT_CHECKS + if (!is_at_iterator_start()) { return OUT_OF_ORDER_ITERATION; } #endif + json = peek_start(); + if (*json != start_char) { return incorrect_type_error(incorrect_type_message); } + } else { + assert_at_start(); + /** + * We should be prudent. Let us peek. If it is not the right type, we + * return an error. Only once we have determined that we have the right + * type are we allowed to advance! + */ + json = _json_iter->peek(); + if (*json != start_char) { return incorrect_type_error(incorrect_type_message); } + _json_iter->return_current_and_advance(); + } -#if SIMDJSON_EXCEPTIONS -simdjson_inline string_builder::operator std::string() const noexcept(false) { - return std::string(operator std::string_view()); -} -simdjson_inline string_builder::operator std::string_view() const - noexcept(false) simdjson_lifetime_bound { - return view(); + return SUCCESS; } -#endif -simdjson_inline simdjson_result<std::string_view> -string_builder::view() const noexcept { - if (!is_valid) { - return simdjson::OUT_OF_CAPACITY; - } - return std::string_view(buffer.get(), position); -} -simdjson_inline simdjson_result<const char *> string_builder::c_str() noexcept { - if (capacity_check(1)) { - buffer.get()[position] = '\0'; - return buffer.get(); - } - return simdjson::OUT_OF_CAPACITY; -} +simdjson_inline const uint8_t *value_iterator::peek_root_scalar(const char *type) noexcept { + logger::log_value(*_json_iter, start_position(), depth(), type); + if (!is_at_start()) { return peek_start(); } -simdjson_inline bool string_builder::validate_unicode() const noexcept { - return simdjson::validate_utf8(buffer.get(), position); + assert_at_root(); + return _json_iter->peek(); } +simdjson_inline const uint8_t *value_iterator::peek_non_root_scalar(const char *type) noexcept { + logger::log_value(*_json_iter, start_position(), depth(), type); + if (!is_at_start()) { return peek_start(); } -simdjson_inline void string_builder::start_object() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = '{'; - } + assert_at_non_root_start(); + return _json_iter->peek(); } -simdjson_inline void string_builder::end_object() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = '}'; - } -} +simdjson_inline void value_iterator::advance_root_scalar(const char *type) noexcept { + logger::log_value(*_json_iter, start_position(), depth(), type); + if (!is_at_start()) { return; } -simdjson_inline void string_builder::start_array() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = '['; - } + assert_at_root(); + _json_iter->return_current_and_advance(); + _json_iter->ascend_to(depth()-1); } +simdjson_inline void value_iterator::advance_non_root_scalar(const char *type) noexcept { + logger::log_value(*_json_iter, start_position(), depth(), type); + if (!is_at_start()) { return; } -simdjson_inline void string_builder::end_array() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = ']'; - } + assert_at_non_root_start(); + _json_iter->return_current_and_advance(); + _json_iter->ascend_to(depth()-1); } -simdjson_inline void string_builder::append_comma() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = ','; - } +simdjson_inline error_code value_iterator::incorrect_type_error(const char *message) const noexcept { + logger::log_error(*_json_iter, start_position(), depth(), message); + return INCORRECT_TYPE; } -simdjson_inline void string_builder::append_colon() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = ':'; - } +simdjson_inline bool value_iterator::is_at_start() const noexcept { + return position() == start_position(); } -template <typename key_type, typename value_type> -simdjson_inline void -string_builder::append_key_value(key_type key, value_type value) noexcept { - static_assert(std::is_same<key_type, const char *>::value || - std::is_convertible<key_type, std::string_view>::value, - "Unsupported key type"); - escape_and_append_with_quotes(key); - append_colon(); - SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, std::nullptr_t>::value) { - append_null(); - } - else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, char>::value) { - escape_and_append_with_quotes(value); - } - else SIMDJSON_IF_CONSTEXPR( - std::is_convertible<value_type, std::string_view>::value) { - escape_and_append_with_quotes(value); - } - else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, const char *>::value) { - escape_and_append_with_quotes(value); - } - else { - append(value); - } +simdjson_inline bool value_iterator::is_at_key() const noexcept { + // Keys are at the same depth as the object. + // Note here that we could be safer and check that we are within an object, + // but we do not. + // + // As long as we are at the object's depth, in a valid document, + // we will only ever be at { , : or the actual string key: ". + return _depth == _json_iter->_depth && *_json_iter->peek() == '"'; } -#if SIMDJSON_SUPPORTS_CONCEPTS -template <constevalutil::fixed_string key, typename value_type> -simdjson_inline void -string_builder::append_key_value(value_type value) noexcept { - escape_and_append_with_quotes<key>(); - append_colon(); - SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, std::nullptr_t>::value) { - append_null(); - } - else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, char>::value) { - escape_and_append_with_quotes(value); - } - else SIMDJSON_IF_CONSTEXPR( - std::is_convertible<value_type, std::string_view>::value) { - escape_and_append_with_quotes(value); - } - else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, const char *>::value) { - escape_and_append_with_quotes(value); - } - else { - append(value); - } +simdjson_inline bool value_iterator::is_at_iterator_start() const noexcept { + // We can legitimately be either at the first value ([1]), or after the array if it's empty ([]). + auto delta = position() - start_position(); + return delta == 1 || delta == 2; } -#endif -} // namespace builder -} // namespace fallback -} // namespace simdjson +inline void value_iterator::assert_at_start() const noexcept { + SIMDJSON_ASSUME( _json_iter->token._position == _start_position ); + SIMDJSON_ASSUME( _json_iter->_depth == _depth ); + SIMDJSON_ASSUME( _depth > 0 ); +} -#endif // SIMDJSON_GENERIC_STRING_BUILDER_INL_H -/* end file simdjson/generic/ondemand/json_string_builder-inl.h for fallback */ -/* including simdjson/generic/ondemand/json_builder.h for fallback: #include "simdjson/generic/ondemand/json_builder.h" */ -/* begin file simdjson/generic/ondemand/json_builder.h for fallback */ -/** - * This file is part of the builder API. It is temporarily in the ondemand directory - * but we will move it to a builder directory later. - */ -#ifndef SIMDJSON_GENERIC_BUILDER_H +inline void value_iterator::assert_at_container_start() const noexcept { + SIMDJSON_ASSUME( _json_iter->token._position == _start_position + 1 ); + SIMDJSON_ASSUME( _json_iter->_depth == _depth ); + SIMDJSON_ASSUME( _depth > 0 ); +} -/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_H */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_string_builder.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/concepts.h" */ -/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -#if SIMDJSON_STATIC_REFLECTION +inline void value_iterator::assert_at_next() const noexcept { + SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); + SIMDJSON_ASSUME( _json_iter->_depth == _depth ); + SIMDJSON_ASSUME( _depth > 0 ); +} -#include <charconv> -#include <cstring> -#include <meta> -#include <memory> -#include <optional> -#include <string_view> -#include <type_traits> -#include <utility> -// #include <static_reflection> // for std::define_static_string - header not available yet +simdjson_inline void value_iterator::move_at_start() noexcept { + _json_iter->_depth = _depth; + _json_iter->token.set_position(_start_position); +} -namespace simdjson { -namespace fallback { -namespace builder { +simdjson_inline void value_iterator::move_at_container_start() noexcept { + _json_iter->_depth = _depth; + _json_iter->token.set_position(_start_position + 1); +} -template <class T> - requires(concepts::container_but_not_string<T> && !require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &t) { - auto it = t.begin(); - auto end = t.end(); - if (it == end) { - b.append_raw("[]"); - return; - } - b.append('['); - atom(b, *it); - ++it; - for (; it != end; ++it) { - b.append(','); - atom(b, *it); - } - b.append(']'); +simdjson_inline simdjson_result<bool> value_iterator::reset_array() noexcept { + if(error()) { return error(); } + move_at_container_start(); + return started_array(); } -template <class T> - requires(std::is_same_v<T, std::string> || - std::is_same_v<T, std::string_view> || - std::is_same_v<T, const char *> || - std::is_same_v<T, char>) -constexpr void atom(string_builder &b, const T &t) { - b.escape_and_append_with_quotes(t); +simdjson_inline simdjson_result<bool> value_iterator::reset_object() noexcept { + if(error()) { return error(); } + move_at_container_start(); + return started_object(); } -template <concepts::string_view_keyed_map T> - requires(!require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &m) { - if (m.empty()) { - b.append_raw("{}"); - return; - } - b.append('{'); - bool first = true; - for (const auto& [key, value] : m) { - if (!first) { - b.append(','); - } - first = false; - // Keys must be convertible to string_view per the concept - b.escape_and_append_with_quotes(key); - b.append(':'); - atom(b, value); - } - b.append('}'); +inline void value_iterator::assert_at_child() const noexcept { + SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); + SIMDJSON_ASSUME( _json_iter->_depth == _depth + 1 ); + SIMDJSON_ASSUME( _depth > 0 ); } +inline void value_iterator::assert_at_root() const noexcept { + assert_at_start(); + SIMDJSON_ASSUME( _depth == 1 ); +} -template<typename number_type, - typename = typename std::enable_if<std::is_arithmetic<number_type>::value && !std::is_same_v<number_type, char>>::type> -constexpr void atom(string_builder &b, const number_type t) { - b.append(t); +inline void value_iterator::assert_at_non_root_start() const noexcept { + assert_at_start(); + SIMDJSON_ASSUME( _depth > 1 ); } -template <class T> - requires(std::is_class_v<T> && !concepts::container_but_not_string<T> && - !concepts::string_view_keyed_map<T> && - !concepts::optional_type<T> && - !concepts::smart_pointer<T> && - !concepts::appendable_containers<T> && - !std::is_same_v<T, std::string> && - !std::is_same_v<T, std::string_view> && - !std::is_same_v<T, const char*> && - !std::is_same_v<T, char> && !require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &t) { - int i = 0; - b.append('{'); - template for (constexpr auto dm : std::define_static_array(std::meta::nonstatic_data_members_of(^^T, std::meta::access_context::unchecked()))) { - if (i != 0) - b.append(','); - constexpr auto key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(dm))); - b.append_raw(key); - b.append(':'); - atom(b, t.[:dm:]); - i++; - }; - b.append('}'); +inline void value_iterator::assert_is_valid() const noexcept { + SIMDJSON_ASSUME( _json_iter != nullptr ); } -// Support for optional types (std::optional, etc.) -template <concepts::optional_type T> - requires(!require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &opt) { - if (opt) { - atom(b, opt.value()); - } else { - b.append_raw("null"); - } +simdjson_inline bool value_iterator::is_valid() const noexcept { + return _json_iter != nullptr; } -// Support for smart pointers (std::unique_ptr, std::shared_ptr, etc.) -template <concepts::smart_pointer T> - requires(!require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &ptr) { - if (ptr) { - atom(b, *ptr); - } else { - b.append_raw("null"); +simdjson_inline simdjson_result<json_type> value_iterator::type() const noexcept { + switch (*peek_start()) { + case '{': + return json_type::object; + case '[': + return json_type::array; + case '"': + return json_type::string; + case 'n': + return json_type::null; + case 't': case 'f': + return json_type::boolean; + case '-': + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + return json_type::number; + default: + return json_type::unknown; } } -// Support for enums - serialize as string representation using expand approach from P2996R12 -template <typename T> - requires(std::is_enum_v<T> && !require_custom_serialization<T>) -void atom(string_builder &b, const T &e) { -#if SIMDJSON_STATIC_REFLECTION - constexpr auto enumerators = std::define_static_array(std::meta::enumerators_of(^^T)); - template for (constexpr auto enum_val : enumerators) { - constexpr auto enum_str = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(enum_val))); - if (e == [:enum_val:]) { - b.append_raw(enum_str); - return; - } - }; - // Fallback to integer if enum value not found - atom(b, static_cast<std::underlying_type_t<T>>(e)); -#else - // Fallback: serialize as integer if reflection not available - atom(b, static_cast<std::underlying_type_t<T>>(e)); -#endif +simdjson_inline token_position value_iterator::start_position() const noexcept { + return _start_position; } -// Support for appendable containers that don't have operator[] (sets, etc.) -template <concepts::appendable_containers T> - requires(!concepts::container_but_not_string<T> && !concepts::string_view_keyed_map<T> && - !concepts::optional_type<T> && !concepts::smart_pointer<T> && - !std::is_same_v<T, std::string> && - !std::is_same_v<T, std::string_view> && !std::is_same_v<T, const char*> && !require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &container) { - if (container.empty()) { - b.append_raw("[]"); - return; - } - b.append('['); - bool first = true; - for (const auto& item : container) { - if (!first) { - b.append(','); - } - first = false; - atom(b, item); - } - b.append(']'); +simdjson_inline token_position value_iterator::position() const noexcept { + return _json_iter->position(); } -// append functions that delegate to atom functions for primitive types -template <class T> - requires(std::is_arithmetic_v<T> && !std::is_same_v<T, char>) -void append(string_builder &b, const T &t) { - atom(b, t); +simdjson_inline token_position value_iterator::end_position() const noexcept { + return _json_iter->end_position(); } -template <class T> - requires(std::is_same_v<T, std::string> || - std::is_same_v<T, std::string_view> || - std::is_same_v<T, const char *> || - std::is_same_v<T, char>) -void append(string_builder &b, const T &t) { - atom(b, t); +simdjson_inline token_position value_iterator::last_position() const noexcept { + return _json_iter->last_position(); } -template <concepts::optional_type T> - requires(!require_custom_serialization<T>) -void append(string_builder &b, const T &t) { - atom(b, t); +simdjson_inline error_code value_iterator::report_error(error_code error, const char *message) noexcept { + return _json_iter->report_error(error, message); } -template <concepts::smart_pointer T> - requires(!require_custom_serialization<T>) -void append(string_builder &b, const T &t) { - atom(b, t); -} +} // namespace ondemand +} // namespace haswell +} // namespace simdjson -template <concepts::appendable_containers T> - requires(!concepts::container_but_not_string<T> && !concepts::string_view_keyed_map<T> && - !concepts::optional_type<T> && !concepts::smart_pointer<T> && - !std::is_same_v<T, std::string> && - !std::is_same_v<T, std::string_view> && !std::is_same_v<T, const char*> && !require_custom_serialization<T>) -void append(string_builder &b, const T &t) { - atom(b, t); +namespace simdjson { + +simdjson_inline simdjson_result<haswell::ondemand::value_iterator>::simdjson_result(haswell::ondemand::value_iterator &&value) noexcept + : implementation_simdjson_result_base<haswell::ondemand::value_iterator>(std::forward<haswell::ondemand::value_iterator>(value)) {} +simdjson_inline simdjson_result<haswell::ondemand::value_iterator>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<haswell::ondemand::value_iterator>(error) {} + +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H +/* end file simdjson/generic/ondemand/value_iterator-inl.h for haswell */ +/* including simdjson/generic/ondemand/serialization-inl.h for haswell: #include "simdjson/generic/ondemand/serialization-inl.h" */ +/* begin file simdjson/generic/ondemand/serialization-inl.h for haswell */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document-inl.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/serialization.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */ +/* amalgamation skipped (editor-only): #if SIMDJSON_STATIC_REFLECTION */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_builder.h" */ +/* amalgamation skipped (editor-only): #endif */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { + +inline std::string_view trim(const std::string_view str) noexcept { + // We can almost surely do better by rolling our own find_first_not_of function. + size_t first = str.find_first_not_of(" \t\n\r"); + // If we have the empty string (just white space), then no trimming is possible, and + // we return the empty string_view. + if (std::string_view::npos == first) { return std::string_view(); } + size_t last = str.find_last_not_of(" \t\n\r"); + return str.substr(first, (last - first + 1)); } -template <concepts::string_view_keyed_map T> - requires(!require_custom_serialization<T>) -void append(string_builder &b, const T &t) { - atom(b, t); + +inline simdjson_result<std::string_view> to_json_string(haswell::ondemand::document& x) noexcept { + std::string_view v; + auto error = x.raw_json().get(v); + if(error) {return error; } + return trim(v); } -// works for struct -template <class Z> - requires(std::is_class_v<Z> && !concepts::container_but_not_string<Z> && - !concepts::string_view_keyed_map<Z> && - !concepts::optional_type<Z> && - !concepts::smart_pointer<Z> && - !concepts::appendable_containers<Z> && - !std::is_same_v<Z, std::string> && - !std::is_same_v<Z, std::string_view> && - !std::is_same_v<Z, const char*> && - !std::is_same_v<Z, char> && !require_custom_serialization<Z>) -void append(string_builder &b, const Z &z) { - int i = 0; - b.append('{'); - template for (constexpr auto dm : std::define_static_array(std::meta::nonstatic_data_members_of(^^Z, std::meta::access_context::unchecked()))) { - if (i != 0) - b.append(','); - constexpr auto key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(dm))); - b.append_raw(key); - b.append(':'); - atom(b, z.[:dm:]); - i++; - }; - b.append('}'); +inline simdjson_result<std::string_view> to_json_string(haswell::ondemand::document_reference& x) noexcept { + std::string_view v; + auto error = x.raw_json().get(v); + if(error) {return error; } + return trim(v); } -// works for container that have begin() and end() iterators -template <class Z> - requires(concepts::container_but_not_string<Z> && !require_custom_serialization<Z>) -void append(string_builder &b, const Z &z) { - auto it = z.begin(); - auto end = z.end(); - if (it == end) { - b.append_raw("[]"); - return; - } - b.append('['); - atom(b, *it); - ++it; - for (; it != end; ++it) { - b.append(','); - atom(b, *it); +inline simdjson_result<std::string_view> to_json_string(haswell::ondemand::value& x) noexcept { + /** + * If we somehow receive a value that has already been consumed, + * then the following code could be in trouble. E.g., we create + * an array as needed, but if an array was already created, then + * it could be bad. + */ + using namespace haswell::ondemand; + haswell::ondemand::json_type t; + auto error = x.type().get(t); + if(error != SUCCESS) { return error; } + switch (t) + { + case json_type::array: + { + haswell::ondemand::array array; + error = x.get_array().get(array); + if(error) { return error; } + return to_json_string(array); + } + case json_type::object: + { + haswell::ondemand::object object; + error = x.get_object().get(object); + if(error) { return error; } + return to_json_string(object); + } + default: + return trim(x.raw_json_token()); } - b.append(']'); } -template <class Z> - requires (require_custom_serialization<Z>) -void append(string_builder &b, const Z &z) { - b.append(z); +inline simdjson_result<std::string_view> to_json_string(haswell::ondemand::object& x) noexcept { + std::string_view v; + auto error = x.raw_json().get(v); + if(error) {return error; } + return trim(v); } - -template <class Z> -simdjson_warn_unused simdjson_result<std::string> to_json_string(const Z &z, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { - string_builder b(initial_capacity); - append(b, z); - std::string_view s; - if(auto e = b.view().get(s); e) { return e; } - return std::string(s); +inline simdjson_result<std::string_view> to_json_string(haswell::ondemand::array& x) noexcept { + std::string_view v; + auto error = x.raw_json().get(v); + if(error) {return error; } + return trim(v); } -template <class Z> -simdjson_warn_unused simdjson_error to_json(const Z &z, std::string &s, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { - string_builder b(initial_capacity); - append(b, z); - std::string_view view; - if(auto e = b.view().get(view); e) { return e; } - s.assign(view); - return SUCCESS; +inline simdjson_result<std::string_view> to_json_string(simdjson_result<haswell::ondemand::document> x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } -template <class Z> -string_builder& operator<<(string_builder& b, const Z& z) { - append(b, z); - return b; +inline simdjson_result<std::string_view> to_json_string(simdjson_result<haswell::ondemand::document_reference> x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } -// extract_from: Serialize only specific fields from a struct to JSON -template<constevalutil::fixed_string... FieldNames, typename T> - requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) -void extract_from(string_builder &b, const T &obj) { - // Helper to check if a field name matches any of the requested fields - auto should_extract = [](std::string_view field_name) constexpr -> bool { - return ((FieldNames.view() == field_name) || ...); - }; - - b.append('{'); - bool first = true; - - // Iterate through all members of T using reflection - template for (constexpr auto mem : std::define_static_array( - std::meta::nonstatic_data_members_of(^^T, std::meta::access_context::unchecked()))) { - - if constexpr (std::meta::is_public(mem)) { - constexpr std::string_view key = std::define_static_string(std::meta::identifier_of(mem)); +inline simdjson_result<std::string_view> to_json_string(simdjson_result<haswell::ondemand::value> x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); +} - // Only serialize this field if it's in our list of requested fields - if constexpr (should_extract(key)) { - if (!first) { - b.append(','); - } - first = false; +inline simdjson_result<std::string_view> to_json_string(simdjson_result<haswell::ondemand::object> x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); +} - // Serialize the key - constexpr auto quoted_key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(mem))); - b.append_raw(quoted_key); - b.append(':'); +inline simdjson_result<std::string_view> to_json_string(simdjson_result<haswell::ondemand::array> x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); +} +} // namespace simdjson - // Serialize the value - atom(b, obj.[:mem:]); - } - } - }; +namespace simdjson { namespace haswell { namespace ondemand { - b.append('}'); +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::haswell::ondemand::value x) { + std::string_view v; + auto error = simdjson::to_json_string(x).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + throw simdjson::simdjson_error(error); + } } - -template<constevalutil::fixed_string... FieldNames, typename T> - requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) -simdjson_warn_unused simdjson_result<std::string> extract_from(const T &obj, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { - string_builder b(initial_capacity); - extract_from<FieldNames...>(b, obj); - std::string_view s; - if(auto e = b.view().get(s); e) { return e; } - return std::string(s); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::haswell::ondemand::value> x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); +} +#else +inline std::ostream& operator<<(std::ostream& out, simdjson::haswell::ondemand::value x) { + std::string_view v; + auto error = simdjson::to_json_string(x).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + return (out << error); + } } +#endif -} // namespace builder -} // namespace fallback -// Alias the function template to 'to' in the global namespace -template <class Z> -simdjson_warn_unused simdjson_result<std::string> to_json(const Z &z, size_t initial_capacity = fallback::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { - fallback::builder::string_builder b(initial_capacity); - fallback::builder::append(b, z); - std::string_view s; - if(auto e = b.view().get(s); e) { return e; } - return std::string(s); +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::haswell::ondemand::array value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + throw simdjson::simdjson_error(error); + } } -template <class Z> -simdjson_warn_unused simdjson_error to_json(const Z &z, std::string &s, size_t initial_capacity = fallback::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { - fallback::builder::string_builder b(initial_capacity); - fallback::builder::append(b, z); - std::string_view view; - if(auto e = b.view().get(view); e) { return e; } - s.assign(view); - return SUCCESS; +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::haswell::ondemand::array> x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); } -// Global namespace function for extract_from -template<constevalutil::fixed_string... FieldNames, typename T> - requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) -simdjson_warn_unused simdjson_result<std::string> extract_from(const T &obj, size_t initial_capacity = fallback::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { - fallback::builder::string_builder b(initial_capacity); - fallback::builder::extract_from<FieldNames...>(b, obj); - std::string_view s; - if(auto e = b.view().get(s); e) { return e; } - return std::string(s); +#else +inline std::ostream& operator<<(std::ostream& out, simdjson::haswell::ondemand::array value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + return (out << error); + } } +#endif -} // namespace simdjson - -#endif // SIMDJSON_STATIC_REFLECTION +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::haswell::ondemand::document& value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + throw simdjson::simdjson_error(error); + } +} +inline std::ostream& operator<<(std::ostream& out, simdjson::haswell::ondemand::document_reference& value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + throw simdjson::simdjson_error(error); + } +} +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::haswell::ondemand::document>&& x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); +} +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::haswell::ondemand::document_reference>&& x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); +} +#else +inline std::ostream& operator<<(std::ostream& out, simdjson::haswell::ondemand::document& value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + return (out << error); + } +} +#endif +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::haswell::ondemand::object value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + throw simdjson::simdjson_error(error); + } +} +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::haswell::ondemand::object> x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); +} +#else +inline std::ostream& operator<<(std::ostream& out, simdjson::haswell::ondemand::object value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + return (out << error); + } +} #endif -/* end file simdjson/generic/ondemand/json_builder.h for fallback */ +}}} // namespace simdjson::haswell::ondemand + +#endif // SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H +/* end file simdjson/generic/ondemand/serialization-inl.h for haswell */ // JSON path accessor (compile-time) - must be after inline definitions -/* including simdjson/generic/ondemand/compile_time_accessors.h for fallback: #include "simdjson/generic/ondemand/compile_time_accessors.h" */ -/* begin file simdjson/generic/ondemand/compile_time_accessors.h for fallback */ +/* including simdjson/generic/ondemand/compile_time_accessors.h for haswell: #include "simdjson/generic/ondemand/compile_time_accessors.h" */ +/* begin file simdjson/generic/ondemand/compile_time_accessors.h for haswell */ /** * Compile-time JSON Path and JSON Pointer accessors using C++26 reflection (P2996) * @@ -62050,7 +100950,7 @@ simdjson_warn_unused simdjson_result<std::string> extract_from(const T &obj, siz #include <array> namespace simdjson { -namespace fallback { +namespace haswell { namespace ondemand { /*** * JSONPath implementation for compile-time access @@ -62061,7 +100961,7 @@ namespace json_path { // Note: value type must be fully defined before this header is included // This is ensured by including this in amalgamated.h after value-inl.h -using ::simdjson::fallback::ondemand::value; +using ::simdjson::haswell::ondemand::value; // Path step types enum class step_type { @@ -62195,7 +101095,7 @@ struct json_path_parser { // Compile-time path accessor generator template<typename T, constevalutil::fixed_string Path> struct path_accessor { - using value = ::simdjson::fallback::ondemand::value; + using value = ::simdjson::haswell::ondemand::value; static constexpr auto parser = json_path_parser<Path>(); static constexpr std::size_t num_steps = parser.count_steps(); @@ -62673,14 +101573,14 @@ struct path_accessor { // Compile-time path accessor with validation template<typename T, constevalutil::fixed_string Path, typename DocOrValue> -inline simdjson_result<::simdjson::fallback::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { +inline simdjson_result<::simdjson::haswell::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { using accessor = path_accessor<T, Path>; return accessor::access(doc_or_val); } // Overload without type parameter (no validation) template<constevalutil::fixed_string Path, typename DocOrValue> -inline simdjson_result<::simdjson::fallback::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { +inline simdjson_result<::simdjson::haswell::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { using accessor = path_accessor<void, Path>; return accessor::access(doc_or_val); } @@ -62911,89 +101811,85 @@ struct pointer_accessor { // Compile-time JSON Pointer accessor with validation template<typename T, constevalutil::fixed_string Pointer, typename DocOrValue> -inline simdjson_result<::simdjson::fallback::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { +inline simdjson_result<::simdjson::haswell::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { using accessor = pointer_accessor<T, Pointer>; return accessor::access(doc_or_val); } // Overload without type parameter (no validation) template<constevalutil::fixed_string Pointer, typename DocOrValue> -inline simdjson_result<::simdjson::fallback::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { +inline simdjson_result<::simdjson::haswell::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { using accessor = pointer_accessor<void, Pointer>; return accessor::access(doc_or_val); } } // namespace json_path } // namespace ondemand -} // namespace fallback +} // namespace haswell } // namespace simdjson #endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION #endif // SIMDJSON_GENERIC_ONDEMAND_COMPILE_TIME_ACCESSORS_H -/* end file simdjson/generic/ondemand/compile_time_accessors.h for fallback */ +/* end file simdjson/generic/ondemand/compile_time_accessors.h for haswell */ -/* end file simdjson/generic/ondemand/amalgamated.h for fallback */ -/* including simdjson/fallback/end.h: #include "simdjson/fallback/end.h" */ -/* begin file simdjson/fallback/end.h */ +/* end file simdjson/generic/ondemand/amalgamated.h for haswell */ +/* including simdjson/haswell/end.h: #include "simdjson/haswell/end.h" */ +/* begin file simdjson/haswell/end.h */ /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/fallback/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -/* undefining SIMDJSON_IMPLEMENTATION from "fallback" */ -#undef SIMDJSON_IMPLEMENTATION -/* end file simdjson/fallback/end.h */ +#if !SIMDJSON_CAN_ALWAYS_RUN_HASWELL +SIMDJSON_UNTARGET_REGION +#endif -#endif // SIMDJSON_FALLBACK_ONDEMAND_H -/* end file simdjson/fallback/ondemand.h */ -#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(haswell) -/* including simdjson/haswell/ondemand.h: #include "simdjson/haswell/ondemand.h" */ -/* begin file simdjson/haswell/ondemand.h */ -#ifndef SIMDJSON_HASWELL_ONDEMAND_H -#define SIMDJSON_HASWELL_ONDEMAND_H +/* undefining SIMDJSON_IMPLEMENTATION from "haswell" */ +#undef SIMDJSON_IMPLEMENTATION +/* end file simdjson/haswell/end.h */ -/* including simdjson/haswell/begin.h: #include "simdjson/haswell/begin.h" */ -/* begin file simdjson/haswell/begin.h */ -/* defining SIMDJSON_IMPLEMENTATION to "haswell" */ -#define SIMDJSON_IMPLEMENTATION haswell +#endif // SIMDJSON_HASWELL_ONDEMAND_H +/* end file simdjson/haswell/ondemand.h */ +#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(icelake) +/* including simdjson/icelake/ondemand.h: #include "simdjson/icelake/ondemand.h" */ +/* begin file simdjson/icelake/ondemand.h */ +#ifndef SIMDJSON_ICELAKE_ONDEMAND_H +#define SIMDJSON_ICELAKE_ONDEMAND_H -/* including simdjson/haswell/base.h: #include "simdjson/haswell/base.h" */ -/* begin file simdjson/haswell/base.h */ -#ifndef SIMDJSON_HASWELL_BASE_H -#define SIMDJSON_HASWELL_BASE_H +/* including simdjson/icelake/begin.h: #include "simdjson/icelake/begin.h" */ +/* begin file simdjson/icelake/begin.h */ +/* defining SIMDJSON_IMPLEMENTATION to "icelake" */ +#define SIMDJSON_IMPLEMENTATION icelake +/* including simdjson/icelake/base.h: #include "simdjson/icelake/base.h" */ +/* begin file simdjson/icelake/base.h */ +#ifndef SIMDJSON_ICELAKE_BASE_H +#define SIMDJSON_ICELAKE_BASE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ /* amalgamation skipped (editor-only): #include "simdjson/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -// The constructor may be executed on any host, so we take care not to use SIMDJSON_TARGET_HASWELL +// The constructor may be executed on any host, so we take care not to use SIMDJSON_TARGET_ICELAKE namespace simdjson { /** - * Implementation for Haswell (Intel AVX2). + * Implementation for Icelake (Intel AVX512). */ -namespace haswell { +namespace icelake { class implementation; -namespace { -namespace simd { -template <typename T> struct simd8; -template <typename T> struct simd8x64; -} // namespace simd -} // unnamed namespace - -} // namespace haswell +} // namespace icelake } // namespace simdjson -#endif // SIMDJSON_HASWELL_BASE_H -/* end file simdjson/haswell/base.h */ -/* including simdjson/haswell/intrinsics.h: #include "simdjson/haswell/intrinsics.h" */ -/* begin file simdjson/haswell/intrinsics.h */ -#ifndef SIMDJSON_HASWELL_INTRINSICS_H -#define SIMDJSON_HASWELL_INTRINSICS_H +#endif // SIMDJSON_ICELAKE_BASE_H +/* end file simdjson/icelake/base.h */ +/* including simdjson/icelake/intrinsics.h: #include "simdjson/icelake/intrinsics.h" */ +/* begin file simdjson/icelake/intrinsics.h */ +#ifndef SIMDJSON_ICELAKE_INTRINSICS_H +#define SIMDJSON_ICELAKE_INTRINSICS_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ #if SIMDJSON_VISUAL_STUDIO @@ -63030,6 +101926,14 @@ template <typename T> struct simd8x64; #include <avxintrin.h> #include <avx2intrin.h> #include <wmmintrin.h> // for _mm_clmulepi64_si128 +// Important: we need the AVX-512 headers: +#include <avx512fintrin.h> +#include <avx512dqintrin.h> +#include <avx512cdintrin.h> +#include <avx512bwintrin.h> +#include <avx512vlintrin.h> +#include <avx512vbmiintrin.h> +#include <avx512vbmi2intrin.h> // unfortunately, we may not get _blsr_u64, but, thankfully, clang // has it as a macro. #ifndef _blsr_u64 @@ -63038,34 +101942,27 @@ template <typename T> struct simd8x64; #endif // _blsr_u64 #endif // SIMDJSON_CLANG_VISUAL_STUDIO -static_assert(sizeof(__m256i) <= simdjson::SIMDJSON_PADDING, "insufficient padding for haswell kernel."); +static_assert(sizeof(__m512i) <= simdjson::SIMDJSON_PADDING, "insufficient padding for icelake"); -#endif // SIMDJSON_HASWELL_INTRINSICS_H -/* end file simdjson/haswell/intrinsics.h */ +#endif // SIMDJSON_ICELAKE_INTRINSICS_H +/* end file simdjson/icelake/intrinsics.h */ -#if !SIMDJSON_CAN_ALWAYS_RUN_HASWELL -// We enable bmi2 only if LLVM/clang is used, because GCC may not -// make good use of it. See https://github.com/simdjson/simdjson/pull/2243 -#if defined(__clang__) -SIMDJSON_TARGET_REGION("avx2,bmi,bmi2,pclmul,lzcnt,popcnt") -#else -SIMDJSON_TARGET_REGION("avx2,bmi,pclmul,lzcnt,popcnt") -#endif +#if !SIMDJSON_CAN_ALWAYS_RUN_ICELAKE +SIMDJSON_TARGET_REGION("avx512f,avx512dq,avx512cd,avx512bw,avx512vbmi,avx512vbmi2,avx512vl,avx2,bmi,pclmul,lzcnt,popcnt") #endif -/* including simdjson/haswell/bitmanipulation.h: #include "simdjson/haswell/bitmanipulation.h" */ -/* begin file simdjson/haswell/bitmanipulation.h */ -#ifndef SIMDJSON_HASWELL_BITMANIPULATION_H -#define SIMDJSON_HASWELL_BITMANIPULATION_H +/* including simdjson/icelake/bitmanipulation.h: #include "simdjson/icelake/bitmanipulation.h" */ +/* begin file simdjson/icelake/bitmanipulation.h */ +#ifndef SIMDJSON_ICELAKE_BITMANIPULATION_H +#define SIMDJSON_ICELAKE_BITMANIPULATION_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/haswell/intrinsics.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/haswell/bitmask.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/icelake/intrinsics.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace haswell { +namespace icelake { namespace { // We sometimes call trailing_zero on inputs that are zero, @@ -63101,7 +101998,7 @@ simdjson_inline int leading_zeroes(uint64_t input_num) { #if SIMDJSON_REGULAR_VISUAL_STUDIO simdjson_inline unsigned __int64 count_ones(uint64_t input_num) { - // note: we do not support legacy 32-bit Windows in this kernel + // note: we do not support legacy 32-bit Windows return __popcnt64(input_num);// Visual Studio wants two underscores } #else @@ -63122,23 +102019,23 @@ simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2, } } // unnamed namespace -} // namespace haswell +} // namespace icelake } // namespace simdjson -#endif // SIMDJSON_HASWELL_BITMANIPULATION_H -/* end file simdjson/haswell/bitmanipulation.h */ -/* including simdjson/haswell/bitmask.h: #include "simdjson/haswell/bitmask.h" */ -/* begin file simdjson/haswell/bitmask.h */ -#ifndef SIMDJSON_HASWELL_BITMASK_H -#define SIMDJSON_HASWELL_BITMASK_H +#endif // SIMDJSON_ICELAKE_BITMANIPULATION_H +/* end file simdjson/icelake/bitmanipulation.h */ +/* including simdjson/icelake/bitmask.h: #include "simdjson/icelake/bitmask.h" */ +/* begin file simdjson/icelake/bitmask.h */ +#ifndef SIMDJSON_ICELAKE_BITMASK_H +#define SIMDJSON_ICELAKE_BITMASK_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/haswell/intrinsics.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/icelake/intrinsics.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace haswell { +namespace icelake { namespace { // @@ -63155,112 +102052,72 @@ simdjson_inline uint64_t prefix_xor(const uint64_t bitmask) { } } // unnamed namespace -} // namespace haswell +} // namespace icelake } // namespace simdjson -#endif // SIMDJSON_HASWELL_BITMASK_H -/* end file simdjson/haswell/bitmask.h */ -/* including simdjson/haswell/numberparsing_defs.h: #include "simdjson/haswell/numberparsing_defs.h" */ -/* begin file simdjson/haswell/numberparsing_defs.h */ -#ifndef SIMDJSON_HASWELL_NUMBERPARSING_DEFS_H -#define SIMDJSON_HASWELL_NUMBERPARSING_DEFS_H - -/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/haswell/intrinsics.h" */ -/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ +#endif // SIMDJSON_ICELAKE_BITMASK_H +/* end file simdjson/icelake/bitmask.h */ +/* including simdjson/icelake/simd.h: #include "simdjson/icelake/simd.h" */ +/* begin file simdjson/icelake/simd.h */ +#ifndef SIMDJSON_ICELAKE_SIMD_H +#define SIMDJSON_ICELAKE_SIMD_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/icelake/intrinsics.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/icelake/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -namespace simdjson { -namespace haswell { -namespace numberparsing { - -/** @private */ -static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) { - // this actually computes *16* values so we are being wasteful. - const __m128i ascii0 = _mm_set1_epi8('0'); - const __m128i mul_1_10 = - _mm_setr_epi8(10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1); - const __m128i mul_1_100 = _mm_setr_epi16(100, 1, 100, 1, 100, 1, 100, 1); - const __m128i mul_1_10000 = - _mm_setr_epi16(10000, 1, 10000, 1, 10000, 1, 10000, 1); - const __m128i input = _mm_sub_epi8( - _mm_loadu_si128(reinterpret_cast<const __m128i *>(chars)), ascii0); - const __m128i t1 = _mm_maddubs_epi16(input, mul_1_10); - const __m128i t2 = _mm_madd_epi16(t1, mul_1_100); - const __m128i t3 = _mm_packus_epi32(t2, t2); - const __m128i t4 = _mm_madd_epi16(t3, mul_1_10000); - return _mm_cvtsi128_si32( - t4); // only captures the sum of the first 8 digits, drop the rest -} +#if defined(__GNUC__) && !defined(__clang__) +#if __GNUC__ == 8 +#define SIMDJSON_GCC8 1 +#endif // __GNUC__ == 8 +#endif // defined(__GNUC__) && !defined(__clang__) -/** @private */ -simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) { - internal::value128 answer; -#if SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS -#if SIMDJSON_IS_ARM64 - // ARM64 has native support for 64-bit multiplications, no need to emultate - answer.high = __umulh(value1, value2); - answer.low = value1 * value2; -#else - answer.low = _umul128(value1, value2, &answer.high); // _umul128 not available on ARM64 -#endif // SIMDJSON_IS_ARM64 -#else // SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS - __uint128_t r = (static_cast<__uint128_t>(value1)) * value2; - answer.low = uint64_t(r); - answer.high = uint64_t(r >> 64); -#endif - return answer; +#if SIMDJSON_GCC8 +/** + * GCC 8 fails to provide _mm512_set_epi8. We roll our own. + */ +inline __m512i _mm512_set_epi8(uint8_t a0, uint8_t a1, uint8_t a2, uint8_t a3, uint8_t a4, uint8_t a5, uint8_t a6, uint8_t a7, uint8_t a8, uint8_t a9, uint8_t a10, uint8_t a11, uint8_t a12, uint8_t a13, uint8_t a14, uint8_t a15, uint8_t a16, uint8_t a17, uint8_t a18, uint8_t a19, uint8_t a20, uint8_t a21, uint8_t a22, uint8_t a23, uint8_t a24, uint8_t a25, uint8_t a26, uint8_t a27, uint8_t a28, uint8_t a29, uint8_t a30, uint8_t a31, uint8_t a32, uint8_t a33, uint8_t a34, uint8_t a35, uint8_t a36, uint8_t a37, uint8_t a38, uint8_t a39, uint8_t a40, uint8_t a41, uint8_t a42, uint8_t a43, uint8_t a44, uint8_t a45, uint8_t a46, uint8_t a47, uint8_t a48, uint8_t a49, uint8_t a50, uint8_t a51, uint8_t a52, uint8_t a53, uint8_t a54, uint8_t a55, uint8_t a56, uint8_t a57, uint8_t a58, uint8_t a59, uint8_t a60, uint8_t a61, uint8_t a62, uint8_t a63) { + return _mm512_set_epi64(uint64_t(a7) + (uint64_t(a6) << 8) + (uint64_t(a5) << 16) + (uint64_t(a4) << 24) + (uint64_t(a3) << 32) + (uint64_t(a2) << 40) + (uint64_t(a1) << 48) + (uint64_t(a0) << 56), + uint64_t(a15) + (uint64_t(a14) << 8) + (uint64_t(a13) << 16) + (uint64_t(a12) << 24) + (uint64_t(a11) << 32) + (uint64_t(a10) << 40) + (uint64_t(a9) << 48) + (uint64_t(a8) << 56), + uint64_t(a23) + (uint64_t(a22) << 8) + (uint64_t(a21) << 16) + (uint64_t(a20) << 24) + (uint64_t(a19) << 32) + (uint64_t(a18) << 40) + (uint64_t(a17) << 48) + (uint64_t(a16) << 56), + uint64_t(a31) + (uint64_t(a30) << 8) + (uint64_t(a29) << 16) + (uint64_t(a28) << 24) + (uint64_t(a27) << 32) + (uint64_t(a26) << 40) + (uint64_t(a25) << 48) + (uint64_t(a24) << 56), + uint64_t(a39) + (uint64_t(a38) << 8) + (uint64_t(a37) << 16) + (uint64_t(a36) << 24) + (uint64_t(a35) << 32) + (uint64_t(a34) << 40) + (uint64_t(a33) << 48) + (uint64_t(a32) << 56), + uint64_t(a47) + (uint64_t(a46) << 8) + (uint64_t(a45) << 16) + (uint64_t(a44) << 24) + (uint64_t(a43) << 32) + (uint64_t(a42) << 40) + (uint64_t(a41) << 48) + (uint64_t(a40) << 56), + uint64_t(a55) + (uint64_t(a54) << 8) + (uint64_t(a53) << 16) + (uint64_t(a52) << 24) + (uint64_t(a51) << 32) + (uint64_t(a50) << 40) + (uint64_t(a49) << 48) + (uint64_t(a48) << 56), + uint64_t(a63) + (uint64_t(a62) << 8) + (uint64_t(a61) << 16) + (uint64_t(a60) << 24) + (uint64_t(a59) << 32) + (uint64_t(a58) << 40) + (uint64_t(a57) << 48) + (uint64_t(a56) << 56)); } +#endif // SIMDJSON_GCC8 -} // namespace numberparsing -} // namespace haswell -} // namespace simdjson - -#define SIMDJSON_SWAR_NUMBER_PARSING 1 -#endif // SIMDJSON_HASWELL_NUMBERPARSING_DEFS_H -/* end file simdjson/haswell/numberparsing_defs.h */ -/* including simdjson/haswell/simd.h: #include "simdjson/haswell/simd.h" */ -/* begin file simdjson/haswell/simd.h */ -#ifndef SIMDJSON_HASWELL_SIMD_H -#define SIMDJSON_HASWELL_SIMD_H - -/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/haswell/intrinsics.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/haswell/bitmanipulation.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */ -/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace haswell { +namespace icelake { namespace { namespace simd { // Forward-declared so they can be used by splat and friends. template<typename Child> struct base { - __m256i value; + __m512i value; // Zero constructor - simdjson_inline base() : value{__m256i()} {} + simdjson_inline base() : value{__m512i()} {} // Conversion from SIMD register - simdjson_inline base(const __m256i _value) : value(_value) {} + simdjson_inline base(const __m512i _value) : value(_value) {} // Conversion to SIMD register - simdjson_inline operator const __m256i&() const { return this->value; } - simdjson_inline operator __m256i&() { return this->value; } + simdjson_inline operator const __m512i&() const { return this->value; } + simdjson_inline operator __m512i&() { return this->value; } // Bit operations - simdjson_inline Child operator|(const Child other) const { return _mm256_or_si256(*this, other); } - simdjson_inline Child operator&(const Child other) const { return _mm256_and_si256(*this, other); } - simdjson_inline Child operator^(const Child other) const { return _mm256_xor_si256(*this, other); } - simdjson_inline Child bit_andnot(const Child other) const { return _mm256_andnot_si256(other, *this); } + simdjson_inline Child operator|(const Child other) const { return _mm512_or_si512(*this, other); } + simdjson_inline Child operator&(const Child other) const { return _mm512_and_si512(*this, other); } + simdjson_inline Child operator^(const Child other) const { return _mm512_xor_si512(*this, other); } + simdjson_inline Child bit_andnot(const Child other) const { return _mm512_andnot_si512(other, *this); } simdjson_inline Child& operator|=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast | other; return *this_cast; } simdjson_inline Child& operator&=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast & other; return *this_cast; } simdjson_inline Child& operator^=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast ^ other; return *this_cast; } @@ -63276,39 +102133,40 @@ namespace simd { typedef uint64_t bitmask2_t; simdjson_inline base8() : base<simd8<T>>() {} - simdjson_inline base8(const __m256i _value) : base<simd8<T>>(_value) {} - - friend simdjson_really_inline Mask operator==(const simd8<T> lhs, const simd8<T> rhs) { return _mm256_cmpeq_epi8(lhs, rhs); } + simdjson_inline base8(const __m512i _value) : base<simd8<T>>(_value) {} + friend simdjson_really_inline uint64_t operator==(const simd8<T> lhs, const simd8<T> rhs) { + return _mm512_cmpeq_epi8_mask(lhs, rhs); + } static const int SIZE = sizeof(base<T>::value); template<int N=1> simdjson_inline simd8<T> prev(const simd8<T> prev_chunk) const { - return _mm256_alignr_epi8(*this, _mm256_permute2x128_si256(prev_chunk, *this, 0x21), 16 - N); + // workaround for compilers unable to figure out that 16 - N is a constant (GCC 8) + constexpr int shift = 16 - N; + return _mm512_alignr_epi8(*this, _mm512_permutex2var_epi64(prev_chunk, _mm512_set_epi64(13, 12, 11, 10, 9, 8, 7, 6), *this), shift); } }; // SIMD byte mask type (returned by things like eq and gt) template<> struct simd8<bool>: base8<bool> { - static simdjson_inline simd8<bool> splat(bool _value) { return _mm256_set1_epi8(uint8_t(-(!!_value))); } + static simdjson_inline simd8<bool> splat(bool _value) { return _mm512_set1_epi8(uint8_t(-(!!_value))); } simdjson_inline simd8() : base8() {} - simdjson_inline simd8(const __m256i _value) : base8<bool>(_value) {} + simdjson_inline simd8(const __m512i _value) : base8<bool>(_value) {} // Splat constructor simdjson_inline simd8(bool _value) : base8<bool>(splat(_value)) {} - - simdjson_inline int to_bitmask() const { return _mm256_movemask_epi8(*this); } - simdjson_inline bool any() const { return !_mm256_testz_si256(*this, *this); } + simdjson_inline bool any() const { return !!_mm512_test_epi8_mask (*this, *this); } simdjson_inline simd8<bool> operator~() const { return *this ^ true; } }; template<typename T> struct base8_numeric: base8<T> { - static simdjson_inline simd8<T> splat(T _value) { return _mm256_set1_epi8(_value); } - static simdjson_inline simd8<T> zero() { return _mm256_setzero_si256(); } - static simdjson_inline simd8<T> load(const T values[32]) { - return _mm256_loadu_si256(reinterpret_cast<const __m256i *>(values)); + static simdjson_inline simd8<T> splat(T _value) { return _mm512_set1_epi8(_value); } + static simdjson_inline simd8<T> zero() { return _mm512_setzero_si512(); } + static simdjson_inline simd8<T> load(const T values[64]) { + return _mm512_loadu_si512(reinterpret_cast<const __m512i *>(values)); } // Repeat 16 values as many times as necessary (usually for lookup tables) static simdjson_inline simd8<T> repeat_16( @@ -63316,6 +102174,10 @@ namespace simd { T v8, T v9, T v10, T v11, T v12, T v13, T v14, T v15 ) { return simd8<T>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15, + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,v11,v12,v13,v14,v15, v0, v1, v2, v3, v4, v5, v6, v7, @@ -63324,14 +102186,14 @@ namespace simd { } simdjson_inline base8_numeric() : base8<T>() {} - simdjson_inline base8_numeric(const __m256i _value) : base8<T>(_value) {} + simdjson_inline base8_numeric(const __m512i _value) : base8<T>(_value) {} // Store to array - simdjson_inline void store(T dst[32]) const { return _mm256_storeu_si256(reinterpret_cast<__m256i *>(dst), *this); } + simdjson_inline void store(T dst[64]) const { return _mm512_storeu_si512(reinterpret_cast<__m512i *>(dst), *this); } // Addition/subtraction are the same for signed and unsigned - simdjson_inline simd8<T> operator+(const simd8<T> other) const { return _mm256_add_epi8(*this, other); } - simdjson_inline simd8<T> operator-(const simd8<T> other) const { return _mm256_sub_epi8(*this, other); } + simdjson_inline simd8<T> operator+(const simd8<T> other) const { return _mm512_add_epi8(*this, other); } + simdjson_inline simd8<T> operator-(const simd8<T> other) const { return _mm512_sub_epi8(*this, other); } simdjson_inline simd8<T>& operator+=(const simd8<T> other) { *this = *this + other; return *static_cast<simd8<T>*>(this); } simdjson_inline simd8<T>& operator-=(const simd8<T> other) { *this = *this - other; return *static_cast<simd8<T>*>(this); } @@ -63341,60 +102203,23 @@ namespace simd { // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values) template<typename L> simdjson_inline simd8<L> lookup_16(simd8<L> lookup_table) const { - return _mm256_shuffle_epi8(lookup_table, *this); + return _mm512_shuffle_epi8(lookup_table, *this); } // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted as a bitset). // Passing a 0 value for mask would be equivalent to writing out every byte to output. - // Only the first 32 - count_ones(mask) bytes of the result are significant but 32 bytes + // Only the first 64 - count_ones(mask) bytes of the result are significant but 64 bytes // get written. // Design consideration: it seems like a function with the // signature simd8<L> compress(uint32_t mask) would be // sensible, but the AVX ISA makes this kind of approach difficult. template<typename L> - simdjson_inline void compress(uint32_t mask, L * output) const { - using internal::thintable_epi8; - using internal::BitsSetTable256mul2; - using internal::pshufb_combine_table; - // this particular implementation was inspired by work done by @animetosho - // we do it in four steps, first 8 bytes and then second 8 bytes... - uint8_t mask1 = uint8_t(mask); // least significant 8 bits - uint8_t mask2 = uint8_t(mask >> 8); // second least significant 8 bits - uint8_t mask3 = uint8_t(mask >> 16); // ... - uint8_t mask4 = uint8_t(mask >> 24); // ... - // next line just loads the 64-bit values thintable_epi8[mask1] and - // thintable_epi8[mask2] into a 128-bit register, using only - // two instructions on most compilers. - __m256i shufmask = _mm256_set_epi64x(thintable_epi8[mask4], thintable_epi8[mask3], - thintable_epi8[mask2], thintable_epi8[mask1]); - // we increment by 0x08 the second half of the mask and so forth - shufmask = - _mm256_add_epi8(shufmask, _mm256_set_epi32(0x18181818, 0x18181818, - 0x10101010, 0x10101010, 0x08080808, 0x08080808, 0, 0)); - // this is the version "nearly pruned" - __m256i pruned = _mm256_shuffle_epi8(*this, shufmask); - // we still need to put the pieces back together. - // we compute the popcount of the first words: - int pop1 = BitsSetTable256mul2[mask1]; - int pop3 = BitsSetTable256mul2[mask3]; - - // then load the corresponding mask - // could be done with _mm256_loadu2_m128i but many standard libraries omit this intrinsic. - __m256i v256 = _mm256_castsi128_si256( - _mm_loadu_si128(reinterpret_cast<const __m128i *>(pshufb_combine_table + pop1 * 8))); - __m256i compactmask = _mm256_insertf128_si256(v256, - _mm_loadu_si128(reinterpret_cast<const __m128i *>(pshufb_combine_table + pop3 * 8)), 1); - __m256i almostthere = _mm256_shuffle_epi8(pruned, compactmask); - // We just need to write out the result. - // This is the tricky bit that is hard to do - // if we want to return a SIMD register, since there - // is no single-instruction approach to recombine - // the two 128-bit lanes with an offset. - __m128i v128; - v128 = _mm256_castsi256_si128(almostthere); - _mm_storeu_si128( reinterpret_cast<__m128i *>(output), v128); - v128 = _mm256_extractf128_si256(almostthere, 1); - _mm_storeu_si128( reinterpret_cast<__m128i *>(output + 16 - count_ones(mask & 0xFFFF)), v128); + simdjson_inline void compress(uint64_t mask, L * output) const { + // we deliberately avoid _mm512_mask_compressstoreu_epi8 for portability + // (AMD Zen4 has terrible performance with it, it is effectively broken) + // _mm512_mask_compressstoreu_epi8 (output,~mask,*this); + __m512i compressed = _mm512_maskz_compress_epi8(~mask, *this); + _mm512_storeu_si512(output, compressed); // could use a mask } template<typename L> @@ -63416,29 +102241,42 @@ namespace simd { template<> struct simd8<int8_t> : base8_numeric<int8_t> { simdjson_inline simd8() : base8_numeric<int8_t>() {} - simdjson_inline simd8(const __m256i _value) : base8_numeric<int8_t>(_value) {} + simdjson_inline simd8(const __m512i _value) : base8_numeric<int8_t>(_value) {} // Splat constructor simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {} // Array constructor - simdjson_inline simd8(const int8_t values[32]) : simd8(load(values)) {} + simdjson_inline simd8(const int8_t values[64]) : simd8(load(values)) {} // Member-by-member initialization simdjson_inline simd8( int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15, int8_t v16, int8_t v17, int8_t v18, int8_t v19, int8_t v20, int8_t v21, int8_t v22, int8_t v23, - int8_t v24, int8_t v25, int8_t v26, int8_t v27, int8_t v28, int8_t v29, int8_t v30, int8_t v31 - ) : simd8(_mm256_setr_epi8( - v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15, - v16,v17,v18,v19,v20,v21,v22,v23, - v24,v25,v26,v27,v28,v29,v30,v31 + int8_t v24, int8_t v25, int8_t v26, int8_t v27, int8_t v28, int8_t v29, int8_t v30, int8_t v31, + int8_t v32, int8_t v33, int8_t v34, int8_t v35, int8_t v36, int8_t v37, int8_t v38, int8_t v39, + int8_t v40, int8_t v41, int8_t v42, int8_t v43, int8_t v44, int8_t v45, int8_t v46, int8_t v47, + int8_t v48, int8_t v49, int8_t v50, int8_t v51, int8_t v52, int8_t v53, int8_t v54, int8_t v55, + int8_t v56, int8_t v57, int8_t v58, int8_t v59, int8_t v60, int8_t v61, int8_t v62, int8_t v63 + ) : simd8(_mm512_set_epi8( + v63, v62, v61, v60, v59, v58, v57, v56, + v55, v54, v53, v52, v51, v50, v49, v48, + v47, v46, v45, v44, v43, v42, v41, v40, + v39, v38, v37, v36, v35, v34, v33, v32, + v31, v30, v29, v28, v27, v26, v25, v24, + v23, v22, v21, v20, v19, v18, v17, v16, + v15, v14, v13, v12, v11, v10, v9, v8, + v7, v6, v5, v4, v3, v2, v1, v0 )) {} + // Repeat 16 values as many times as necessary (usually for lookup tables) simdjson_inline static simd8<int8_t> repeat_16( int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 ) { return simd8<int8_t>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15, + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,v11,v12,v13,v14,v15, v0, v1, v2, v3, v4, v5, v6, v7, @@ -63447,39 +102285,53 @@ namespace simd { } // Order-sensitive comparisons - simdjson_inline simd8<int8_t> max_val(const simd8<int8_t> other) const { return _mm256_max_epi8(*this, other); } - simdjson_inline simd8<int8_t> min_val(const simd8<int8_t> other) const { return _mm256_min_epi8(*this, other); } - simdjson_inline simd8<bool> operator>(const simd8<int8_t> other) const { return _mm256_cmpgt_epi8(*this, other); } - simdjson_inline simd8<bool> operator<(const simd8<int8_t> other) const { return _mm256_cmpgt_epi8(other, *this); } + simdjson_inline simd8<int8_t> max_val(const simd8<int8_t> other) const { return _mm512_max_epi8(*this, other); } + simdjson_inline simd8<int8_t> min_val(const simd8<int8_t> other) const { return _mm512_min_epi8(*this, other); } + + simdjson_inline simd8<bool> operator>(const simd8<int8_t> other) const { return _mm512_maskz_abs_epi8(_mm512_cmpgt_epi8_mask(*this, other),_mm512_set1_epi8(uint8_t(0x80))); } + simdjson_inline simd8<bool> operator<(const simd8<int8_t> other) const { return _mm512_maskz_abs_epi8(_mm512_cmpgt_epi8_mask(other, *this),_mm512_set1_epi8(uint8_t(0x80))); } }; // Unsigned bytes template<> struct simd8<uint8_t>: base8_numeric<uint8_t> { simdjson_inline simd8() : base8_numeric<uint8_t>() {} - simdjson_inline simd8(const __m256i _value) : base8_numeric<uint8_t>(_value) {} + simdjson_inline simd8(const __m512i _value) : base8_numeric<uint8_t>(_value) {} // Splat constructor simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {} // Array constructor - simdjson_inline simd8(const uint8_t values[32]) : simd8(load(values)) {} + simdjson_inline simd8(const uint8_t values[64]) : simd8(load(values)) {} // Member-by-member initialization simdjson_inline simd8( uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15, uint8_t v16, uint8_t v17, uint8_t v18, uint8_t v19, uint8_t v20, uint8_t v21, uint8_t v22, uint8_t v23, - uint8_t v24, uint8_t v25, uint8_t v26, uint8_t v27, uint8_t v28, uint8_t v29, uint8_t v30, uint8_t v31 - ) : simd8(_mm256_setr_epi8( - v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15, - v16,v17,v18,v19,v20,v21,v22,v23, - v24,v25,v26,v27,v28,v29,v30,v31 + uint8_t v24, uint8_t v25, uint8_t v26, uint8_t v27, uint8_t v28, uint8_t v29, uint8_t v30, uint8_t v31, + uint8_t v32, uint8_t v33, uint8_t v34, uint8_t v35, uint8_t v36, uint8_t v37, uint8_t v38, uint8_t v39, + uint8_t v40, uint8_t v41, uint8_t v42, uint8_t v43, uint8_t v44, uint8_t v45, uint8_t v46, uint8_t v47, + uint8_t v48, uint8_t v49, uint8_t v50, uint8_t v51, uint8_t v52, uint8_t v53, uint8_t v54, uint8_t v55, + uint8_t v56, uint8_t v57, uint8_t v58, uint8_t v59, uint8_t v60, uint8_t v61, uint8_t v62, uint8_t v63 + ) : simd8(_mm512_set_epi8( + v63, v62, v61, v60, v59, v58, v57, v56, + v55, v54, v53, v52, v51, v50, v49, v48, + v47, v46, v45, v44, v43, v42, v41, v40, + v39, v38, v37, v36, v35, v34, v33, v32, + v31, v30, v29, v28, v27, v26, v25, v24, + v23, v22, v21, v20, v19, v18, v17, v16, + v15, v14, v13, v12, v11, v10, v9, v8, + v7, v6, v5, v4, v3, v2, v1, v0 )) {} + // Repeat 16 values as many times as necessary (usually for lookup tables) simdjson_inline static simd8<uint8_t> repeat_16( uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 ) { return simd8<uint8_t>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15, + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,v11,v12,v13,v14,v15, v0, v1, v2, v3, v4, v5, v6, v7, @@ -63488,130 +102340,115 @@ namespace simd { } // Saturated math - simdjson_inline simd8<uint8_t> saturating_add(const simd8<uint8_t> other) const { return _mm256_adds_epu8(*this, other); } - simdjson_inline simd8<uint8_t> saturating_sub(const simd8<uint8_t> other) const { return _mm256_subs_epu8(*this, other); } + simdjson_inline simd8<uint8_t> saturating_add(const simd8<uint8_t> other) const { return _mm512_adds_epu8(*this, other); } + simdjson_inline simd8<uint8_t> saturating_sub(const simd8<uint8_t> other) const { return _mm512_subs_epu8(*this, other); } // Order-specific operations - simdjson_inline simd8<uint8_t> max_val(const simd8<uint8_t> other) const { return _mm256_max_epu8(*this, other); } - simdjson_inline simd8<uint8_t> min_val(const simd8<uint8_t> other) const { return _mm256_min_epu8(other, *this); } + simdjson_inline simd8<uint8_t> max_val(const simd8<uint8_t> other) const { return _mm512_max_epu8(*this, other); } + simdjson_inline simd8<uint8_t> min_val(const simd8<uint8_t> other) const { return _mm512_min_epu8(other, *this); } // Same as >, but only guarantees true is nonzero (< guarantees true = -1) simdjson_inline simd8<uint8_t> gt_bits(const simd8<uint8_t> other) const { return this->saturating_sub(other); } // Same as <, but only guarantees true is nonzero (< guarantees true = -1) simdjson_inline simd8<uint8_t> lt_bits(const simd8<uint8_t> other) const { return other.saturating_sub(*this); } - simdjson_inline simd8<bool> operator<=(const simd8<uint8_t> other) const { return other.max_val(*this) == other; } - simdjson_inline simd8<bool> operator>=(const simd8<uint8_t> other) const { return other.min_val(*this) == other; } + simdjson_inline uint64_t operator<=(const simd8<uint8_t> other) const { return other.max_val(*this) == other; } + simdjson_inline uint64_t operator>=(const simd8<uint8_t> other) const { return other.min_val(*this) == other; } simdjson_inline simd8<bool> operator>(const simd8<uint8_t> other) const { return this->gt_bits(other).any_bits_set(); } simdjson_inline simd8<bool> operator<(const simd8<uint8_t> other) const { return this->lt_bits(other).any_bits_set(); } // Bit-specific operations - simdjson_inline simd8<bool> bits_not_set() const { return *this == uint8_t(0); } + simdjson_inline simd8<bool> bits_not_set() const { return _mm512_mask_blend_epi8(*this == uint8_t(0), _mm512_set1_epi8(0), _mm512_set1_epi8(-1)); } simdjson_inline simd8<bool> bits_not_set(simd8<uint8_t> bits) const { return (*this & bits).bits_not_set(); } simdjson_inline simd8<bool> any_bits_set() const { return ~this->bits_not_set(); } simdjson_inline simd8<bool> any_bits_set(simd8<uint8_t> bits) const { return ~this->bits_not_set(bits); } - simdjson_inline bool is_ascii() const { return _mm256_movemask_epi8(*this) == 0; } - simdjson_inline bool bits_not_set_anywhere() const { return _mm256_testz_si256(*this, *this); } + + simdjson_inline bool is_ascii() const { return _mm512_movepi8_mask(*this) == 0; } + simdjson_inline bool bits_not_set_anywhere() const { + return !_mm512_test_epi8_mask(*this, *this); + } simdjson_inline bool any_bits_set_anywhere() const { return !bits_not_set_anywhere(); } - simdjson_inline bool bits_not_set_anywhere(simd8<uint8_t> bits) const { return _mm256_testz_si256(*this, bits); } + simdjson_inline bool bits_not_set_anywhere(simd8<uint8_t> bits) const { return !_mm512_test_epi8_mask(*this, bits); } simdjson_inline bool any_bits_set_anywhere(simd8<uint8_t> bits) const { return !bits_not_set_anywhere(bits); } template<int N> - simdjson_inline simd8<uint8_t> shr() const { return simd8<uint8_t>(_mm256_srli_epi16(*this, N)) & uint8_t(0xFFu >> N); } + simdjson_inline simd8<uint8_t> shr() const { return simd8<uint8_t>(_mm512_srli_epi16(*this, N)) & uint8_t(0xFFu >> N); } template<int N> - simdjson_inline simd8<uint8_t> shl() const { return simd8<uint8_t>(_mm256_slli_epi16(*this, N)) & uint8_t(0xFFu << N); } + simdjson_inline simd8<uint8_t> shl() const { return simd8<uint8_t>(_mm512_slli_epi16(*this, N)) & uint8_t(0xFFu << N); } // Get one of the bits and make a bitmask out of it. // e.g. value.get_bit<7>() gets the high bit template<int N> - simdjson_inline int get_bit() const { return _mm256_movemask_epi8(_mm256_slli_epi16(*this, 7-N)); } + simdjson_inline uint64_t get_bit() const { return _mm512_movepi8_mask(_mm512_slli_epi16(*this, 7-N)); } }; template<typename T> struct simd8x64 { static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<T>); - static_assert(NUM_CHUNKS == 2, "Haswell kernel should use two registers per 64-byte block."); + static_assert(NUM_CHUNKS == 1, "Icelake kernel should use one register per 64-byte block."); const simd8<T> chunks[NUM_CHUNKS]; + template<int idx> simd8<uint8_t> get() const { return idx < NUM_CHUNKS ? chunks[idx] : simd8<T>(); } simd8x64(const simd8x64<T>& o) = delete; // no copy allowed simd8x64<T>& operator=(const simd8<T>& other) = delete; // no assignment allowed simd8x64() = delete; // no default constructor allowed simdjson_inline simd8x64(const simd8<T> chunk0, const simd8<T> chunk1) : chunks{chunk0, chunk1} {} - simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8<T>::load(ptr), simd8<T>::load(ptr+32)} {} + simdjson_inline simd8x64(const simd8<T> chunk0) : chunks{chunk0} {} + simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8<T>::load(ptr)} {} simdjson_inline uint64_t compress(uint64_t mask, T * output) const { - uint32_t mask1 = uint32_t(mask); - uint32_t mask2 = uint32_t(mask >> 32); - this->chunks[0].compress(mask1, output); - this->chunks[1].compress(mask2, output + 32 - count_ones(mask1)); + this->chunks[0].compress(mask, output); return 64 - count_ones(mask); } simdjson_inline void store(T ptr[64]) const { this->chunks[0].store(ptr+sizeof(simd8<T>)*0); - this->chunks[1].store(ptr+sizeof(simd8<T>)*1); - } - - simdjson_inline uint64_t to_bitmask() const { - uint64_t r_lo = uint32_t(this->chunks[0].to_bitmask()); - uint64_t r_hi = this->chunks[1].to_bitmask(); - return r_lo | (r_hi << 32); } simdjson_inline simd8<T> reduce_or() const { - return this->chunks[0] | this->chunks[1]; + return this->chunks[0]; } simdjson_inline simd8x64<T> bit_or(const T m) const { const simd8<T> mask = simd8<T>::splat(m); return simd8x64<T>( - this->chunks[0] | mask, - this->chunks[1] | mask + this->chunks[0] | mask ); } simdjson_inline uint64_t eq(const T m) const { const simd8<T> mask = simd8<T>::splat(m); - return simd8x64<bool>( - this->chunks[0] == mask, - this->chunks[1] == mask - ).to_bitmask(); + return this->chunks[0] == mask; } simdjson_inline uint64_t eq(const simd8x64<uint8_t> &other) const { - return simd8x64<bool>( - this->chunks[0] == other.chunks[0], - this->chunks[1] == other.chunks[1] - ).to_bitmask(); + return this->chunks[0] == other.chunks[0]; } simdjson_inline uint64_t lteq(const T m) const { const simd8<T> mask = simd8<T>::splat(m); - return simd8x64<bool>( - this->chunks[0] <= mask, - this->chunks[1] <= mask - ).to_bitmask(); + return this->chunks[0] <= mask; } }; // struct simd8x64<T> } // namespace simd } // unnamed namespace -} // namespace haswell +} // namespace icelake } // namespace simdjson -#endif // SIMDJSON_HASWELL_SIMD_H -/* end file simdjson/haswell/simd.h */ -/* including simdjson/haswell/stringparsing_defs.h: #include "simdjson/haswell/stringparsing_defs.h" */ -/* begin file simdjson/haswell/stringparsing_defs.h */ -#ifndef SIMDJSON_HASWELL_STRINGPARSING_DEFS_H -#define SIMDJSON_HASWELL_STRINGPARSING_DEFS_H +#endif // SIMDJSON_ICELAKE_SIMD_H +/* end file simdjson/icelake/simd.h */ +/* including simdjson/icelake/stringparsing_defs.h: #include "simdjson/icelake/stringparsing_defs.h" */ +/* begin file simdjson/icelake/stringparsing_defs.h */ +#ifndef SIMDJSON_ICELAKE_STRINGPARSING_DEFS_H +#define SIMDJSON_ICELAKE_STRINGPARSING_DEFS_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/haswell/simd.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/haswell/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/icelake/simd.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/icelake/bitmanipulation.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace haswell { +namespace icelake { namespace { using namespace simd; @@ -63619,7 +102456,7 @@ using namespace simd; // Holds backslashes and quotes locations. struct backslash_and_quote { public: - static constexpr uint32_t BYTES_PROCESSED = 32; + static constexpr uint32_t BYTES_PROCESSED = 64; simdjson_inline backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst); simdjson_inline bool has_quote_first() { return ((bs_bits - 1) & quote_bits) != 0; } @@ -63627,8 +102464,8 @@ struct backslash_and_quote { simdjson_inline int quote_index() { return trailing_zeroes(quote_bits); } simdjson_inline int backslash_index() { return trailing_zeroes(bs_bits); } - uint32_t bs_bits; - uint32_t quote_bits; + uint64_t bs_bits; + uint64_t quote_bits; }; // struct backslash_and_quote simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) { @@ -63639,20 +102476,21 @@ simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uin // store to dest unconditionally - we can overwrite the bits we don't like later v.store(dst); return { - static_cast<uint32_t>((v == '\\').to_bitmask()), // bs_bits - static_cast<uint32_t>((v == '"').to_bitmask()), // quote_bits + static_cast<uint64_t>(v == '\\'), // bs_bits + static_cast<uint64_t>(v == '"'), // quote_bits }; } + struct escaping { - static constexpr uint32_t BYTES_PROCESSED = 32; + static constexpr uint32_t BYTES_PROCESSED = 64; simdjson_inline static escaping copy_and_find(const uint8_t *src, uint8_t *dst); simdjson_inline bool has_escape() { return escape_bits != 0; } - simdjson_inline int escape_index() { return trailing_zeroes(escape_bits); } + simdjson_inline int escape_index() { return trailing_zeroes(uint64_t(escape_bits)); } - uint64_t escape_bits; + __mmask64 escape_bits; }; // struct escaping @@ -63661,30 +102499,93 @@ simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *ds static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "escaping finder must process fewer than SIMDJSON_PADDING bytes"); simd8<uint8_t> v(src); v.store(dst); - simd8<bool> is_quote = (v == '"'); - simd8<bool> is_backslash = (v == '\\'); - simd8<bool> is_control = (v < 32); + __mmask64 is_quote = _mm512_cmpeq_epi8_mask(v, _mm512_set1_epi8('"')); + __mmask64 is_backslash = _mm512_cmpeq_epi8_mask(v, _mm512_set1_epi8('\\')); + __mmask64 is_control = _mm512_cmplt_epi8_mask(v, _mm512_set1_epi8(32)); return { - uint64_t((is_backslash | is_quote | is_control).to_bitmask()) + (is_backslash | is_quote | is_control) }; } + + + } // unnamed namespace -} // namespace haswell +} // namespace icelake } // namespace simdjson -#endif // SIMDJSON_HASWELL_STRINGPARSING_DEFS_H -/* end file simdjson/haswell/stringparsing_defs.h */ -/* end file simdjson/haswell/begin.h */ -/* including simdjson/generic/ondemand/amalgamated.h for haswell: #include "simdjson/generic/ondemand/amalgamated.h" */ -/* begin file simdjson/generic/ondemand/amalgamated.h for haswell */ -#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_ONDEMAND_DEPENDENCIES_H) +#endif // SIMDJSON_ICELAKE_STRINGPARSING_DEFS_H +/* end file simdjson/icelake/stringparsing_defs.h */ +/* including simdjson/icelake/numberparsing_defs.h: #include "simdjson/icelake/numberparsing_defs.h" */ +/* begin file simdjson/icelake/numberparsing_defs.h */ +#ifndef SIMDJSON_ICELAKE_NUMBERPARSING_DEFS_H +#define SIMDJSON_ICELAKE_NUMBERPARSING_DEFS_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/icelake/intrinsics.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace icelake { +namespace numberparsing { + +static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) { + // this actually computes *16* values so we are being wasteful. + const __m128i ascii0 = _mm_set1_epi8('0'); + const __m128i mul_1_10 = + _mm_setr_epi8(10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1); + const __m128i mul_1_100 = _mm_setr_epi16(100, 1, 100, 1, 100, 1, 100, 1); + const __m128i mul_1_10000 = + _mm_setr_epi16(10000, 1, 10000, 1, 10000, 1, 10000, 1); + const __m128i input = _mm_sub_epi8( + _mm_loadu_si128(reinterpret_cast<const __m128i *>(chars)), ascii0); + const __m128i t1 = _mm_maddubs_epi16(input, mul_1_10); + const __m128i t2 = _mm_madd_epi16(t1, mul_1_100); + const __m128i t3 = _mm_packus_epi32(t2, t2); + const __m128i t4 = _mm_madd_epi16(t3, mul_1_10000); + return _mm_cvtsi128_si32( + t4); // only captures the sum of the first 8 digits, drop the rest +} + +/** @private */ +simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) { + internal::value128 answer; +#if SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS +#if SIMDJSON_IS_ARM64 + // ARM64 has native support for 64-bit multiplications, no need to emultate + answer.high = __umulh(value1, value2); + answer.low = value1 * value2; +#else + answer.low = _umul128(value1, value2, &answer.high); // _umul128 not available on ARM64 +#endif // SIMDJSON_IS_ARM64 +#else // SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS + __uint128_t r = (static_cast<__uint128_t>(value1)) * value2; + answer.low = uint64_t(r); + answer.high = uint64_t(r >> 64); +#endif + return answer; +} + +} // namespace numberparsing +} // namespace icelake +} // namespace simdjson + +#define SIMDJSON_SWAR_NUMBER_PARSING 1 + +#endif // SIMDJSON_ICELAKE_NUMBERPARSING_DEFS_H +/* end file simdjson/icelake/numberparsing_defs.h */ +/* end file simdjson/icelake/begin.h */ +/* including simdjson/generic/ondemand/amalgamated.h for icelake: #include "simdjson/generic/ondemand/amalgamated.h" */ +/* begin file simdjson/generic/ondemand/amalgamated.h for icelake */ +#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_BUILDER_DEPENDENCIES_H) #error simdjson/generic/ondemand/dependencies.h must be included before simdjson/generic/ondemand/amalgamated.h! #endif // Stuff other things depend on -/* including simdjson/generic/ondemand/base.h for haswell: #include "simdjson/generic/ondemand/base.h" */ -/* begin file simdjson/generic/ondemand/base.h for haswell */ +/* including simdjson/generic/ondemand/base.h for icelake: #include "simdjson/generic/ondemand/base.h" */ +/* begin file simdjson/generic/ondemand/base.h for icelake */ #ifndef SIMDJSON_GENERIC_ONDEMAND_BASE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -63693,7 +102594,7 @@ simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *ds /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace haswell { +namespace icelake { /** * A fast, simple, DOM-like interface that parses JSON as you use it. * @@ -63704,8 +102605,8 @@ namespace ondemand { /** Represents the depth of a JSON value (number of nested arrays/objects). */ using depth_t = int32_t; -/** @copydoc simdjson::haswell::number_type */ -using number_type = simdjson::haswell::number_type; +/** @copydoc simdjson::icelake::number_type */ +using number_type = simdjson::icelake::number_type; /** @private Position in the JSON buffer indexes */ using token_position = const uint32_t *; @@ -63728,13 +102629,13 @@ class value; class value_iterator; } // namespace ondemand -} // namespace haswell +} // namespace icelake } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_BASE_H -/* end file simdjson/generic/ondemand/base.h for haswell */ -/* including simdjson/generic/ondemand/deserialize.h for haswell: #include "simdjson/generic/ondemand/deserialize.h" */ -/* begin file simdjson/generic/ondemand/deserialize.h for haswell */ +/* end file simdjson/generic/ondemand/base.h for icelake */ +/* including simdjson/generic/ondemand/deserialize.h for icelake: #include "simdjson/generic/ondemand/deserialize.h" */ +/* begin file simdjson/generic/ondemand/deserialize.h for icelake */ #if SIMDJSON_SUPPORTS_CONCEPTS #ifndef SIMDJSON_ONDEMAND_DESERIALIZE_H @@ -63754,35 +102655,35 @@ template <> struct is_builtin_deserializable<int64_t> : std::true_type {}; template <> struct is_builtin_deserializable<uint64_t> : std::true_type {}; template <> struct is_builtin_deserializable<double> : std::true_type {}; template <> struct is_builtin_deserializable<bool> : std::true_type {}; -template <> struct is_builtin_deserializable<haswell::ondemand::array> : std::true_type {}; -template <> struct is_builtin_deserializable<haswell::ondemand::object> : std::true_type {}; -template <> struct is_builtin_deserializable<haswell::ondemand::value> : std::true_type {}; -template <> struct is_builtin_deserializable<haswell::ondemand::raw_json_string> : std::true_type {}; +template <> struct is_builtin_deserializable<icelake::ondemand::array> : std::true_type {}; +template <> struct is_builtin_deserializable<icelake::ondemand::object> : std::true_type {}; +template <> struct is_builtin_deserializable<icelake::ondemand::value> : std::true_type {}; +template <> struct is_builtin_deserializable<icelake::ondemand::raw_json_string> : std::true_type {}; template <> struct is_builtin_deserializable<std::string_view> : std::true_type {}; template <typename T> concept is_builtin_deserializable_v = is_builtin_deserializable<T>::value; -template <typename T, typename ValT = haswell::ondemand::value> +template <typename T, typename ValT = icelake::ondemand::value> concept custom_deserializable = tag_invocable<deserialize_tag, ValT&, T&>; -template <typename T, typename ValT = haswell::ondemand::value> +template <typename T, typename ValT = icelake::ondemand::value> concept deserializable = custom_deserializable<T, ValT> || is_builtin_deserializable_v<T> || concepts::optional_type<T>; -template <typename T, typename ValT = haswell::ondemand::value> +template <typename T, typename ValT = icelake::ondemand::value> concept nothrow_custom_deserializable = nothrow_tag_invocable<deserialize_tag, ValT&, T&>; // built-in types are noexcept and if an error happens, the value simply gets ignored and the error is returned. -template <typename T, typename ValT = haswell::ondemand::value> +template <typename T, typename ValT = icelake::ondemand::value> concept nothrow_deserializable = nothrow_custom_deserializable<T, ValT> || is_builtin_deserializable_v<T>; /// Deserialize Tag inline constexpr struct deserialize_tag { - using array_type = haswell::ondemand::array; - using object_type = haswell::ondemand::object; - using value_type = haswell::ondemand::value; - using document_type = haswell::ondemand::document; - using document_reference_type = haswell::ondemand::document_reference; + using array_type = icelake::ondemand::array; + using object_type = icelake::ondemand::object; + using value_type = icelake::ondemand::value; + using document_type = icelake::ondemand::document; + using document_reference_type = icelake::ondemand::document_reference; // Customization Point for array template <typename T> @@ -63827,9 +102728,9 @@ inline constexpr struct deserialize_tag { #endif // SIMDJSON_ONDEMAND_DESERIALIZE_H #endif // SIMDJSON_SUPPORTS_CONCEPTS -/* end file simdjson/generic/ondemand/deserialize.h for haswell */ -/* including simdjson/generic/ondemand/value_iterator.h for haswell: #include "simdjson/generic/ondemand/value_iterator.h" */ -/* begin file simdjson/generic/ondemand/value_iterator.h for haswell */ +/* end file simdjson/generic/ondemand/deserialize.h for icelake */ +/* including simdjson/generic/ondemand/value_iterator.h for icelake: #include "simdjson/generic/ondemand/value_iterator.h" */ +/* begin file simdjson/generic/ondemand/value_iterator.h for icelake */ #ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -63839,7 +102740,7 @@ inline constexpr struct deserialize_tag { /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace haswell { +namespace icelake { namespace ondemand { /** @@ -64304,21 +103205,22 @@ class value_iterator { friend class document; friend class object; + friend class object_iterator; friend class array; friend class value; friend class field; }; // value_iterator } // namespace ondemand -} // namespace haswell +} // namespace icelake } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<haswell::ondemand::value_iterator> : public haswell::implementation_simdjson_result_base<haswell::ondemand::value_iterator> { +struct simdjson_result<icelake::ondemand::value_iterator> : public icelake::implementation_simdjson_result_base<icelake::ondemand::value_iterator> { public: - simdjson_inline simdjson_result(haswell::ondemand::value_iterator &&value) noexcept; ///< @private + simdjson_inline simdjson_result(icelake::ondemand::value_iterator &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; }; @@ -64326,9 +103228,9 @@ struct simdjson_result<haswell::ondemand::value_iterator> : public haswell::impl } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_H -/* end file simdjson/generic/ondemand/value_iterator.h for haswell */ -/* including simdjson/generic/ondemand/value.h for haswell: #include "simdjson/generic/ondemand/value.h" */ -/* begin file simdjson/generic/ondemand/value.h for haswell */ +/* end file simdjson/generic/ondemand/value_iterator.h for icelake */ +/* including simdjson/generic/ondemand/value.h for icelake: #include "simdjson/generic/ondemand/value.h" */ +/* begin file simdjson/generic/ondemand/value.h for icelake */ #ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -64344,7 +103246,7 @@ struct simdjson_result<haswell::ondemand::value_iterator> : public haswell::impl namespace simdjson { -namespace haswell { +namespace icelake { namespace ondemand { /** * An ephemeral JSON value returned during iteration. It is only valid for as long as you do @@ -65058,20 +103960,20 @@ class value { }; } // namespace ondemand -} // namespace haswell +} // namespace icelake } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<haswell::ondemand::value> : public haswell::implementation_simdjson_result_base<haswell::ondemand::value> { +struct simdjson_result<icelake::ondemand::value> : public icelake::implementation_simdjson_result_base<icelake::ondemand::value> { public: - simdjson_inline simdjson_result(haswell::ondemand::value &&value) noexcept; ///< @private + simdjson_inline simdjson_result(icelake::ondemand::value &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; - simdjson_inline simdjson_result<haswell::ondemand::array> get_array() noexcept; - simdjson_inline simdjson_result<haswell::ondemand::object> get_object() noexcept; + simdjson_inline simdjson_result<icelake::ondemand::array> get_array() noexcept; + simdjson_inline simdjson_result<icelake::ondemand::object> get_object() noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64() noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64_in_string() noexcept; @@ -65083,7 +103985,7 @@ struct simdjson_result<haswell::ondemand::value> : public haswell::implementatio template <typename string_type> simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result<std::string_view> get_wobbly_string() noexcept; - simdjson_inline simdjson_result<haswell::ondemand::raw_json_string> get_raw_json_string() noexcept; + simdjson_inline simdjson_result<icelake::ondemand::raw_json_string> get_raw_json_string() noexcept; simdjson_inline simdjson_result<bool> get_bool() noexcept; simdjson_inline simdjson_result<bool> is_null() noexcept; @@ -65094,20 +103996,20 @@ struct simdjson_result<haswell::ondemand::value> : public haswell::implementatio #if SIMDJSON_EXCEPTIONS template <class T> explicit simdjson_inline operator T() noexcept(false); - simdjson_inline operator haswell::ondemand::array() noexcept(false); - simdjson_inline operator haswell::ondemand::object() noexcept(false); + simdjson_inline operator icelake::ondemand::array() noexcept(false); + simdjson_inline operator icelake::ondemand::object() noexcept(false); simdjson_inline operator uint64_t() noexcept(false); simdjson_inline operator int64_t() noexcept(false); simdjson_inline operator double() noexcept(false); simdjson_inline operator std::string_view() noexcept(false); - simdjson_inline operator haswell::ondemand::raw_json_string() noexcept(false); + simdjson_inline operator icelake::ondemand::raw_json_string() noexcept(false); simdjson_inline operator bool() noexcept(false); #endif simdjson_inline simdjson_result<size_t> count_elements() & noexcept; simdjson_inline simdjson_result<size_t> count_fields() & noexcept; - simdjson_inline simdjson_result<haswell::ondemand::value> at(size_t index) noexcept; - simdjson_inline simdjson_result<haswell::ondemand::array_iterator> begin() & noexcept; - simdjson_inline simdjson_result<haswell::ondemand::array_iterator> end() & noexcept; + simdjson_inline simdjson_result<icelake::ondemand::value> at(size_t index) noexcept; + simdjson_inline simdjson_result<icelake::ondemand::array_iterator> begin() & noexcept; + simdjson_inline simdjson_result<icelake::ondemand::array_iterator> end() & noexcept; /** * Look up a field by name on an object (order-sensitive). By order-sensitive, we mean that @@ -65131,9 +104033,9 @@ struct simdjson_result<haswell::ondemand::value> : public haswell::implementatio * @param key The key to look up. * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object. */ - simdjson_inline simdjson_result<haswell::ondemand::value> find_field(std::string_view key) noexcept; - /** @overload simdjson_inline simdjson_result<haswell::ondemand::value> find_field(std::string_view key) noexcept; */ - simdjson_inline simdjson_result<haswell::ondemand::value> find_field(const char *key) noexcept; + simdjson_inline simdjson_result<icelake::ondemand::value> find_field(std::string_view key) noexcept; + /** @overload simdjson_inline simdjson_result<icelake::ondemand::value> find_field(std::string_view key) noexcept; */ + simdjson_inline simdjson_result<icelake::ondemand::value> find_field(const char *key) noexcept; /** * Look up a field by name on an object, without regard to key order. @@ -65145,7 +104047,7 @@ struct simdjson_result<haswell::ondemand::value> : public haswell::implementatio * in question is large. The fact that the extra code is there also bumps the executable size. * * We default operator[] on find_field_unordered() for convenience. - * It is the defaul because it would be highly surprising (and hard to debug) if the + * It is the default because it would be highly surprising (and hard to debug) if the * default behavior failed to look up a field just because it was in the wrong order--and many * APIs assume this. Therefore, you must be explicit if you want to treat objects as out of order. * @@ -65155,14 +104057,14 @@ struct simdjson_result<haswell::ondemand::value> : public haswell::implementatio * @param key The key to look up. * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object. */ - simdjson_inline simdjson_result<haswell::ondemand::value> find_field_unordered(std::string_view key) noexcept; - /** @overload simdjson_inline simdjson_result<haswell::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ - simdjson_inline simdjson_result<haswell::ondemand::value> find_field_unordered(const char *key) noexcept; - /** @overload simdjson_inline simdjson_result<haswell::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ - simdjson_inline simdjson_result<haswell::ondemand::value> operator[](std::string_view key) noexcept; - /** @overload simdjson_inline simdjson_result<haswell::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ - simdjson_inline simdjson_result<haswell::ondemand::value> operator[](const char *key) noexcept; - simdjson_result<haswell::ondemand::value> operator[](int) noexcept = delete; + simdjson_inline simdjson_result<icelake::ondemand::value> find_field_unordered(std::string_view key) noexcept; + /** @overload simdjson_inline simdjson_result<icelake::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ + simdjson_inline simdjson_result<icelake::ondemand::value> find_field_unordered(const char *key) noexcept; + /** @overload simdjson_inline simdjson_result<icelake::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ + simdjson_inline simdjson_result<icelake::ondemand::value> operator[](std::string_view key) noexcept; + /** @overload simdjson_inline simdjson_result<icelake::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ + simdjson_inline simdjson_result<icelake::ondemand::value> operator[](const char *key) noexcept; + simdjson_result<icelake::ondemand::value> operator[](int) noexcept = delete; /** * Get the type of this JSON value. It does not validate or consume the value. @@ -65186,13 +104088,13 @@ struct simdjson_result<haswell::ondemand::value> : public haswell::implementatio * better to just call .get_double, .get_string, etc. and check for INCORRECT_TYPE (or just * let it throw an exception). */ - simdjson_inline simdjson_result<haswell::ondemand::json_type> type() noexcept; + simdjson_inline simdjson_result<icelake::ondemand::json_type> type() noexcept; simdjson_inline simdjson_result<bool> is_scalar() noexcept; simdjson_inline simdjson_result<bool> is_string() noexcept; simdjson_inline simdjson_result<bool> is_negative() noexcept; simdjson_inline simdjson_result<bool> is_integer() noexcept; - simdjson_inline simdjson_result<haswell::number_type> get_number_type() noexcept; - simdjson_inline simdjson_result<haswell::ondemand::number> get_number() noexcept; + simdjson_inline simdjson_result<icelake::number_type> get_number_type() noexcept; + simdjson_inline simdjson_result<icelake::ondemand::number> get_number() noexcept; /** @copydoc simdjson_inline std::string_view value::raw_json_token() const noexcept */ simdjson_inline simdjson_result<std::string_view> raw_json_token() noexcept; @@ -65202,17 +104104,17 @@ struct simdjson_result<haswell::ondemand::value> : public haswell::implementatio simdjson_inline simdjson_result<const char *> current_location() noexcept; /** @copydoc simdjson_inline int32_t current_depth() const noexcept */ simdjson_inline simdjson_result<int32_t> current_depth() const noexcept; - simdjson_inline simdjson_result<haswell::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result<haswell::ondemand::value> at_path(std::string_view json_path) noexcept; - simdjson_inline simdjson_result<std::vector<haswell::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<icelake::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result<icelake::ondemand::value> at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<std::vector<icelake::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; }; } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_H -/* end file simdjson/generic/ondemand/value.h for haswell */ -/* including simdjson/generic/ondemand/logger.h for haswell: #include "simdjson/generic/ondemand/logger.h" */ -/* begin file simdjson/generic/ondemand/logger.h for haswell */ +/* end file simdjson/generic/ondemand/value.h for icelake */ +/* including simdjson/generic/ondemand/logger.h for icelake: #include "simdjson/generic/ondemand/logger.h" */ +/* begin file simdjson/generic/ondemand/logger.h for icelake */ #ifndef SIMDJSON_GENERIC_ONDEMAND_LOGGER_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -65221,7 +104123,7 @@ struct simdjson_result<haswell::ondemand::value> : public haswell::implementatio /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace haswell { +namespace icelake { namespace ondemand { // Logging should be free unless SIMDJSON_VERBOSE_LOGGING is set. Importantly, it is critical @@ -65267,13 +104169,13 @@ static inline void log_error(const value_iterator &iter, const char *error, cons } // namespace logger } // namespace ondemand -} // namespace haswell +} // namespace icelake } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_LOGGER_H -/* end file simdjson/generic/ondemand/logger.h for haswell */ -/* including simdjson/generic/ondemand/token_iterator.h for haswell: #include "simdjson/generic/ondemand/token_iterator.h" */ -/* begin file simdjson/generic/ondemand/token_iterator.h for haswell */ +/* end file simdjson/generic/ondemand/logger.h for icelake */ +/* including simdjson/generic/ondemand/token_iterator.h for icelake: #include "simdjson/generic/ondemand/token_iterator.h" */ +/* begin file simdjson/generic/ondemand/token_iterator.h for icelake */ #ifndef SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -65284,7 +104186,7 @@ static inline void log_error(const value_iterator &iter, const char *error, cons /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace haswell { +namespace icelake { namespace ondemand { /** @@ -65415,15 +104317,15 @@ class token_iterator { }; } // namespace ondemand -} // namespace haswell +} // namespace icelake } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<haswell::ondemand::token_iterator> : public haswell::implementation_simdjson_result_base<haswell::ondemand::token_iterator> { +struct simdjson_result<icelake::ondemand::token_iterator> : public icelake::implementation_simdjson_result_base<icelake::ondemand::token_iterator> { public: - simdjson_inline simdjson_result(haswell::ondemand::token_iterator &&value) noexcept; ///< @private + simdjson_inline simdjson_result(icelake::ondemand::token_iterator &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; simdjson_inline ~simdjson_result() noexcept = default; ///< @private @@ -65432,9 +104334,9 @@ struct simdjson_result<haswell::ondemand::token_iterator> : public haswell::impl } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_H -/* end file simdjson/generic/ondemand/token_iterator.h for haswell */ -/* including simdjson/generic/ondemand/json_iterator.h for haswell: #include "simdjson/generic/ondemand/json_iterator.h" */ -/* begin file simdjson/generic/ondemand/json_iterator.h for haswell */ +/* end file simdjson/generic/ondemand/token_iterator.h for icelake */ +/* including simdjson/generic/ondemand/json_iterator.h for icelake: #include "simdjson/generic/ondemand/json_iterator.h" */ +/* begin file simdjson/generic/ondemand/json_iterator.h for icelake */ #ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -65445,7 +104347,7 @@ struct simdjson_result<haswell::ondemand::token_iterator> : public haswell::impl /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace haswell { +namespace icelake { namespace ondemand { /** @@ -65756,15 +104658,15 @@ class json_iterator { }; // json_iterator } // namespace ondemand -} // namespace haswell +} // namespace icelake } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<haswell::ondemand::json_iterator> : public haswell::implementation_simdjson_result_base<haswell::ondemand::json_iterator> { +struct simdjson_result<icelake::ondemand::json_iterator> : public icelake::implementation_simdjson_result_base<icelake::ondemand::json_iterator> { public: - simdjson_inline simdjson_result(haswell::ondemand::json_iterator &&value) noexcept; ///< @private + simdjson_inline simdjson_result(icelake::ondemand::json_iterator &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; @@ -65773,9 +104675,9 @@ struct simdjson_result<haswell::ondemand::json_iterator> : public haswell::imple } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_H -/* end file simdjson/generic/ondemand/json_iterator.h for haswell */ -/* including simdjson/generic/ondemand/json_type.h for haswell: #include "simdjson/generic/ondemand/json_type.h" */ -/* begin file simdjson/generic/ondemand/json_type.h for haswell */ +/* end file simdjson/generic/ondemand/json_iterator.h for icelake */ +/* including simdjson/generic/ondemand/json_type.h for icelake: #include "simdjson/generic/ondemand/json_type.h" */ +/* begin file simdjson/generic/ondemand/json_type.h for icelake */ #ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -65786,7 +104688,7 @@ struct simdjson_result<haswell::ondemand::json_iterator> : public haswell::imple /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace haswell { +namespace icelake { namespace ondemand { /** @@ -65920,15 +104822,15 @@ inline std::ostream& operator<<(std::ostream& out, simdjson_result<json_type> &t #endif } // namespace ondemand -} // namespace haswell +} // namespace icelake } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<haswell::ondemand::json_type> : public haswell::implementation_simdjson_result_base<haswell::ondemand::json_type> { +struct simdjson_result<icelake::ondemand::json_type> : public icelake::implementation_simdjson_result_base<icelake::ondemand::json_type> { public: - simdjson_inline simdjson_result(haswell::ondemand::json_type &&value) noexcept; ///< @private + simdjson_inline simdjson_result(icelake::ondemand::json_type &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; simdjson_inline ~simdjson_result() noexcept = default; ///< @private @@ -65937,9 +104839,9 @@ struct simdjson_result<haswell::ondemand::json_type> : public haswell::implement } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_H -/* end file simdjson/generic/ondemand/json_type.h for haswell */ -/* including simdjson/generic/ondemand/raw_json_string.h for haswell: #include "simdjson/generic/ondemand/raw_json_string.h" */ -/* begin file simdjson/generic/ondemand/raw_json_string.h for haswell */ +/* end file simdjson/generic/ondemand/json_type.h for icelake */ +/* including simdjson/generic/ondemand/raw_json_string.h for icelake: #include "simdjson/generic/ondemand/raw_json_string.h" */ +/* begin file simdjson/generic/ondemand/raw_json_string.h for icelake */ #ifndef SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -65949,7 +104851,7 @@ struct simdjson_result<haswell::ondemand::json_type> : public haswell::implement /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace haswell { +namespace icelake { namespace ondemand { /** @@ -66131,30 +105033,30 @@ simdjson_unused simdjson_inline bool operator!=(std::string_view c, const raw_js } // namespace ondemand -} // namespace haswell +} // namespace icelake } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<haswell::ondemand::raw_json_string> : public haswell::implementation_simdjson_result_base<haswell::ondemand::raw_json_string> { +struct simdjson_result<icelake::ondemand::raw_json_string> : public icelake::implementation_simdjson_result_base<icelake::ondemand::raw_json_string> { public: - simdjson_inline simdjson_result(haswell::ondemand::raw_json_string &&value) noexcept; ///< @private + simdjson_inline simdjson_result(icelake::ondemand::raw_json_string &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; simdjson_inline ~simdjson_result() noexcept = default; ///< @private simdjson_inline simdjson_result<const char *> raw() const noexcept; simdjson_inline char operator[](size_t) const noexcept; - simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> unescape(haswell::ondemand::json_iterator &iter, bool allow_replacement) const noexcept; - simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> unescape_wobbly(haswell::ondemand::json_iterator &iter) const noexcept; + simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> unescape(icelake::ondemand::json_iterator &iter, bool allow_replacement) const noexcept; + simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> unescape_wobbly(icelake::ondemand::json_iterator &iter) const noexcept; }; } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_H -/* end file simdjson/generic/ondemand/raw_json_string.h for haswell */ -/* including simdjson/generic/ondemand/parser.h for haswell: #include "simdjson/generic/ondemand/parser.h" */ -/* begin file simdjson/generic/ondemand/parser.h for haswell */ +/* end file simdjson/generic/ondemand/raw_json_string.h for icelake */ +/* including simdjson/generic/ondemand/parser.h for icelake: #include "simdjson/generic/ondemand/parser.h" */ +/* begin file simdjson/generic/ondemand/parser.h for icelake */ #ifndef SIMDJSON_GENERIC_ONDEMAND_PARSER_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -66167,7 +105069,7 @@ struct simdjson_result<haswell::ondemand::raw_json_string> : public haswell::imp #include <thread> namespace simdjson { -namespace haswell { +namespace icelake { namespace ondemand { /** @@ -66567,15 +105469,15 @@ class parser { }; } // namespace ondemand -} // namespace haswell +} // namespace icelake } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<haswell::ondemand::parser> : public haswell::implementation_simdjson_result_base<haswell::ondemand::parser> { +struct simdjson_result<icelake::ondemand::parser> : public icelake::implementation_simdjson_result_base<icelake::ondemand::parser> { public: - simdjson_inline simdjson_result(haswell::ondemand::parser &&value) noexcept; ///< @private + simdjson_inline simdjson_result(icelake::ondemand::parser &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; }; @@ -66583,319 +105485,11 @@ struct simdjson_result<haswell::ondemand::parser> : public haswell::implementati } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_PARSER_H -/* end file simdjson/generic/ondemand/parser.h for haswell */ - -// JSON builder - needed for extract_into functionality -/* including simdjson/generic/ondemand/json_string_builder.h for haswell: #include "simdjson/generic/ondemand/json_string_builder.h" */ -/* begin file simdjson/generic/ondemand/json_string_builder.h for haswell */ -/** - * This file is part of the builder API. It is temporarily in the ondemand directory - * but we will move it to a builder directory later. - */ -#ifndef SIMDJSON_GENERIC_STRING_BUILDER_H - -/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_H */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */ -/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ - -namespace simdjson { - - -#if SIMDJSON_SUPPORTS_CONCEPTS - -namespace haswell { -namespace builder { - class string_builder; -}} - -template <typename T, typename = void> -struct has_custom_serialization : std::false_type {}; - -inline constexpr struct serialize_tag { - template <typename T> - constexpr void operator()(haswell::builder::string_builder& b, T&& obj) const{ - return tag_invoke(*this, b, std::forward<T>(obj)); - } - - -} serialize{}; -template <typename T> -struct has_custom_serialization<T, std::void_t< - decltype(tag_invoke(serialize, std::declval<haswell::builder::string_builder&>(), std::declval<T&>())) ->> : std::true_type {}; - -template <typename T> -constexpr bool require_custom_serialization = has_custom_serialization<T>::value; -#else -struct has_custom_serialization : std::false_type {}; -#endif // SIMDJSON_SUPPORTS_CONCEPTS - -namespace haswell { -namespace builder { -/** - * A builder for JSON strings representing documents. This is a low-level - * builder that is not meant to be used directly by end-users. Though it - * supports atomic types (Booleans, strings), it does not support composed - * types (arrays and objects). - * - * Ultimately, this class can support kernel-specific optimizations. E.g., - * it may make use of SIMD instructions to escape strings faster. - */ -class string_builder { -public: - simdjson_inline string_builder(size_t initial_capacity = DEFAULT_INITIAL_CAPACITY); - - static constexpr size_t DEFAULT_INITIAL_CAPACITY = 1024; - - /** - * Append number (includes Booleans). Booleans are mapped to the strings - * false and true. Numbers are converted to strings abiding by the JSON standard. - * Floating-point numbers are converted to the shortest string that 'correctly' - * represents the number. - */ - template<typename number_type, - typename = typename std::enable_if<std::is_arithmetic<number_type>::value>::type> - simdjson_inline void append(number_type v) noexcept; - - /** - * Append character c. - */ - simdjson_inline void append(char c) noexcept; - - /** - * Append the string 'null'. - */ - simdjson_inline void append_null() noexcept; - - /** - * Clear the content. - */ - simdjson_inline void clear() noexcept; - - /** - * Append the std::string_view, after escaping it. - * There is no UTF-8 validation. - */ - simdjson_inline void escape_and_append(std::string_view input) noexcept; - - /** - * Append the std::string_view surrounded by double quotes, after escaping it. - * There is no UTF-8 validation. - */ - simdjson_inline void escape_and_append_with_quotes(std::string_view input) noexcept; -#if SIMDJSON_SUPPORTS_CONCEPTS - template<constevalutil::fixed_string key> - simdjson_inline void escape_and_append_with_quotes() noexcept; -#endif - /** - * Append the character surrounded by double quotes, after escaping it. - * There is no UTF-8 validation. - */ - simdjson_inline void escape_and_append_with_quotes(char input) noexcept; - - /** - * Append the character surrounded by double quotes, after escaping it. - * There is no UTF-8 validation. - */ - simdjson_inline void escape_and_append_with_quotes(const char* input) noexcept; - - /** - * Append the C string directly, without escaping. - * There is no UTF-8 validation. - */ - simdjson_inline void append_raw(const char *c) noexcept; - - /** - * Append "{" to the buffer. - */ - simdjson_inline void start_object() noexcept; - - /** - * Append "}" to the buffer. - */ - simdjson_inline void end_object() noexcept; - - /** - * Append "[" to the buffer. - */ - simdjson_inline void start_array() noexcept; - - /** - * Append "]" to the buffer. - */ - simdjson_inline void end_array() noexcept; - - /** - * Append "," to the buffer. - */ - simdjson_inline void append_comma() noexcept; - - /** - * Append ":" to the buffer. - */ - simdjson_inline void append_colon() noexcept; - - /** - * Append a key-value pair to the buffer. - * The key is escaped and surrounded by double quotes. - * The value is escaped if it is a string. - */ - template<typename key_type, typename value_type> - simdjson_inline void append_key_value(key_type key, value_type value) noexcept; -#if SIMDJSON_SUPPORTS_CONCEPTS - template<constevalutil::fixed_string key, typename value_type> - simdjson_inline void append_key_value(value_type value) noexcept; - - // Support for optional types (std::optional, etc.) - template <concepts::optional_type T> - requires(!require_custom_serialization<T>) - simdjson_inline void append(const T &opt); - - template <typename T> - requires(require_custom_serialization<T>) - simdjson_inline void append(T &&val); - - // Support for string-like types - template <typename T> - requires(std::is_convertible<T, std::string_view>::value || - std::is_same<T, const char*>::value ) - simdjson_inline void append(const T &value); -#endif -#if SIMDJSON_SUPPORTS_RANGES && SIMDJSON_SUPPORTS_CONCEPTS - // Support for range-based appending (std::ranges::view, etc.) - template <std::ranges::range R> -requires (!std::is_convertible<R, std::string_view>::value && !require_custom_serialization<R>) - simdjson_inline void append(const R &range) noexcept; -#endif - /** - * Append the std::string_view directly, without escaping. - * There is no UTF-8 validation. - */ - simdjson_inline void append_raw(std::string_view input) noexcept; - - /** - * Append len characters from str. - * There is no UTF-8 validation. - */ - simdjson_inline void append_raw(const char *str, size_t len) noexcept; -#if SIMDJSON_EXCEPTIONS - /** - * Creates an std::string from the written JSON buffer. - * Throws if memory allocation failed - * - * The result may not be valid UTF-8 if some of your content was not valid UTF-8. - * Use validate_unicode() to check the content if needed. - */ - simdjson_inline operator std::string() const noexcept(false); - - /** - * Creates an std::string_view from the written JSON buffer. - * Throws if memory allocation failed. - * - * The result may not be valid UTF-8 if some of your content was not valid UTF-8. - * Use validate_unicode() to check the content if needed. - */ - simdjson_inline operator std::string_view() const noexcept(false) simdjson_lifetime_bound; -#endif - - /** - * Returns a view on the written JSON buffer. Returns an error - * if memory allocation failed. - * - * The result may not be valid UTF-8 if some of your content was not valid UTF-8. - * Use validate_unicode() to check the content. - */ - simdjson_inline simdjson_result<std::string_view> view() const noexcept; - - /** - * Appends the null character to the buffer and returns - * a pointer to the beginning of the written JSON buffer. - * Returns an error if memory allocation failed. - * The result is null-terminated. - * - * The result may not be valid UTF-8 if some of your content was not valid UTF-8. - * Use validate_unicode() to check the content. - */ - simdjson_inline simdjson_result<const char *> c_str() noexcept; - - /** - * Return true if the content is valid UTF-8. - */ - simdjson_inline bool validate_unicode() const noexcept; - - /** - * Returns the current size of the written JSON buffer. - * If an error occurred, returns 0. - */ - simdjson_inline size_t size() const noexcept; - -private: - /** - * Returns true if we can write at least upcoming_bytes bytes. - * The underlying buffer is reallocated if needed. It is designed - * to be called before writing to the buffer. It should be fast. - */ - simdjson_inline bool capacity_check(size_t upcoming_bytes); - - /** - * Grow the buffer to at least desired_capacity bytes. - * If the allocation fails, is_valid is set to false. We expect - * that this function would not be repeatedly called. - */ - simdjson_inline void grow_buffer(size_t desired_capacity); - - /** - * We use this helper function to make sure that is_valid is kept consistent. - */ - simdjson_inline void set_valid(bool valid) noexcept; - - std::unique_ptr<char[]> buffer{}; - size_t position{0}; - size_t capacity{0}; - bool is_valid{true}; -}; - - - -} -} - - -#if !SIMDJSON_STATIC_REFLECTION -// fallback implementation until we have static reflection -template <class Z> -simdjson_warn_unused simdjson_result<std::string> to_json(const Z &z, size_t initial_capacity = simdjson::haswell::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { - simdjson::haswell::builder::string_builder b(initial_capacity); - b.append(z); - std::string_view s; - auto e = b.view().get(s); - if(e) { return e; } - return std::string(s); -} -template <class Z> -simdjson_warn_unused simdjson_error to_json(const Z &z, std::string &s, size_t initial_capacity = simdjson::haswell::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { - simdjson::haswell::builder::string_builder b(initial_capacity); - b.append(z); - std::string_view sv; - auto e = b.view().get(sv); - if(e) { return e; } - s.assign(sv.data(), sv.size()); - return simdjson::SUCCESS; -} -#endif - -#if SIMDJSON_SUPPORTS_CONCEPTS -#endif // SIMDJSON_SUPPORTS_CONCEPTS - -} // namespace simdjson - -#endif // SIMDJSON_GENERIC_STRING_BUILDER_H -/* end file simdjson/generic/ondemand/json_string_builder.h for haswell */ +/* end file simdjson/generic/ondemand/parser.h for icelake */ // All other declarations -/* including simdjson/generic/ondemand/array.h for haswell: #include "simdjson/generic/ondemand/array.h" */ -/* begin file simdjson/generic/ondemand/array.h for haswell */ +/* including simdjson/generic/ondemand/array.h for icelake: #include "simdjson/generic/ondemand/array.h" */ +/* begin file simdjson/generic/ondemand/array.h for icelake */ #ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -66907,7 +105501,7 @@ simdjson_warn_unused simdjson_error to_json(const Z &z, std::string &s, size_t i /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace haswell { +namespace icelake { namespace ondemand { /** @@ -67127,27 +105721,27 @@ class array { }; } // namespace ondemand -} // namespace haswell +} // namespace icelake } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<haswell::ondemand::array> : public haswell::implementation_simdjson_result_base<haswell::ondemand::array> { +struct simdjson_result<icelake::ondemand::array> : public icelake::implementation_simdjson_result_base<icelake::ondemand::array> { public: - simdjson_inline simdjson_result(haswell::ondemand::array &&value) noexcept; ///< @private + simdjson_inline simdjson_result(icelake::ondemand::array &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; - simdjson_inline simdjson_result<haswell::ondemand::array_iterator> begin() noexcept; - simdjson_inline simdjson_result<haswell::ondemand::array_iterator> end() noexcept; + simdjson_inline simdjson_result<icelake::ondemand::array_iterator> begin() noexcept; + simdjson_inline simdjson_result<icelake::ondemand::array_iterator> end() noexcept; inline simdjson_result<size_t> count_elements() & noexcept; inline simdjson_result<bool> is_empty() & noexcept; inline simdjson_result<bool> reset() & noexcept; - simdjson_inline simdjson_result<haswell::ondemand::value> at(size_t index) noexcept; - simdjson_inline simdjson_result<haswell::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result<haswell::ondemand::value> at_path(std::string_view json_path) noexcept; - simdjson_inline simdjson_result<std::vector<haswell::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<icelake::ondemand::value> at(size_t index) noexcept; + simdjson_inline simdjson_result<icelake::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result<icelake::ondemand::value> at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<std::vector<icelake::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; simdjson_inline simdjson_result<std::string_view> raw_json() noexcept; #if SIMDJSON_SUPPORTS_CONCEPTS // TODO: move this code into object-inl.h @@ -67155,7 +105749,7 @@ struct simdjson_result<haswell::ondemand::array> : public haswell::implementatio template<typename T> simdjson_inline simdjson_result<T> get() noexcept { if (error()) { return error(); } - if constexpr (std::is_same_v<T, haswell::ondemand::array>) { + if constexpr (std::is_same_v<T, icelake::ondemand::array>) { return first; } return first.get<T>(); @@ -67163,7 +105757,7 @@ struct simdjson_result<haswell::ondemand::array> : public haswell::implementatio template<typename T> simdjson_warn_unused simdjson_inline error_code get(T& out) noexcept { if (error()) { return error(); } - if constexpr (std::is_same_v<T, haswell::ondemand::array>) { + if constexpr (std::is_same_v<T, icelake::ondemand::array>) { out = first; } else { SIMDJSON_TRY( first.get<T>(out) ); @@ -67176,13 +105770,14 @@ struct simdjson_result<haswell::ondemand::array> : public haswell::implementatio } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_H -/* end file simdjson/generic/ondemand/array.h for haswell */ -/* including simdjson/generic/ondemand/array_iterator.h for haswell: #include "simdjson/generic/ondemand/array_iterator.h" */ -/* begin file simdjson/generic/ondemand/array_iterator.h for haswell */ +/* end file simdjson/generic/ondemand/array.h for icelake */ +/* including simdjson/generic/ondemand/array_iterator.h for icelake: #include "simdjson/generic/ondemand/array_iterator.h" */ +/* begin file simdjson/generic/ondemand/array_iterator.h for icelake */ #ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ /* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H */ +/* amalgamation skipped (editor-only): #include <iterator> */ /* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */ @@ -67190,7 +105785,7 @@ struct simdjson_result<haswell::ondemand::array> : public haswell::implementatio namespace simdjson { -namespace haswell { +namespace icelake { namespace ondemand { /** @@ -67198,11 +105793,17 @@ namespace ondemand { * * This is an input_iterator, meaning: * - It is forward-only - * - * must be called exactly once per element. + * - * must be called at most once per element. * - ++ must be called exactly once in between each * (*, ++, *, ++, * ...) */ class array_iterator { public: + using iterator_category = std::input_iterator_tag; + using value_type = simdjson_result<value>; + using difference_type = std::ptrdiff_t; + using pointer = void; + using reference = value_type; + /** Create a new, invalid array iterator. */ simdjson_inline array_iterator() noexcept = default; @@ -67246,6 +105847,9 @@ class array_iterator { simdjson_warn_unused simdjson_inline bool at_end() const noexcept; private: +#if SIMDJSON_DEVELOPMENT_CHECKS + bool has_been_referenced{false}; +#endif value_iterator iter{}; simdjson_inline array_iterator(const value_iterator &iter) noexcept; @@ -67256,14 +105860,20 @@ class array_iterator { }; } // namespace ondemand -} // namespace haswell +} // namespace icelake } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<haswell::ondemand::array_iterator> : public haswell::implementation_simdjson_result_base<haswell::ondemand::array_iterator> { - simdjson_inline simdjson_result(haswell::ondemand::array_iterator &&value) noexcept; ///< @private +struct simdjson_result<icelake::ondemand::array_iterator> : public icelake::implementation_simdjson_result_base<icelake::ondemand::array_iterator> { + using iterator_category = std::input_iterator_tag; + using value_type = simdjson_result<icelake::ondemand::value>; + using difference_type = std::ptrdiff_t; + using pointer = void; + using reference = value_type; + + simdjson_inline simdjson_result(icelake::ondemand::array_iterator &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; @@ -67271,10 +105881,10 @@ struct simdjson_result<haswell::ondemand::array_iterator> : public haswell::impl // Iterator interface // - simdjson_inline simdjson_result<haswell::ondemand::value> operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. - simdjson_inline bool operator==(const simdjson_result<haswell::ondemand::array_iterator> &) const noexcept; - simdjson_inline bool operator!=(const simdjson_result<haswell::ondemand::array_iterator> &) const noexcept; - simdjson_inline simdjson_result<haswell::ondemand::array_iterator> &operator++() noexcept; + simdjson_inline simdjson_result<icelake::ondemand::value> operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. + simdjson_inline bool operator==(const simdjson_result<icelake::ondemand::array_iterator> &) const noexcept; + simdjson_inline bool operator!=(const simdjson_result<icelake::ondemand::array_iterator> &) const noexcept; + simdjson_inline simdjson_result<icelake::ondemand::array_iterator> &operator++() noexcept; simdjson_warn_unused simdjson_inline bool at_end() const noexcept; }; @@ -67282,9 +105892,9 @@ struct simdjson_result<haswell::ondemand::array_iterator> : public haswell::impl } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H -/* end file simdjson/generic/ondemand/array_iterator.h for haswell */ -/* including simdjson/generic/ondemand/document.h for haswell: #include "simdjson/generic/ondemand/document.h" */ -/* begin file simdjson/generic/ondemand/document.h for haswell */ +/* end file simdjson/generic/ondemand/array_iterator.h for icelake */ +/* including simdjson/generic/ondemand/document.h for icelake: #include "simdjson/generic/ondemand/document.h" */ +/* begin file simdjson/generic/ondemand/document.h for icelake */ #ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -67298,7 +105908,7 @@ struct simdjson_result<haswell::ondemand::array_iterator> : public haswell::impl namespace simdjson { -namespace haswell { +namespace icelake { namespace ondemand { /** @@ -68250,21 +106860,21 @@ class document_reference { document *doc{nullptr}; }; } // namespace ondemand -} // namespace haswell +} // namespace icelake } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<haswell::ondemand::document> : public haswell::implementation_simdjson_result_base<haswell::ondemand::document> { +struct simdjson_result<icelake::ondemand::document> : public icelake::implementation_simdjson_result_base<icelake::ondemand::document> { public: - simdjson_inline simdjson_result(haswell::ondemand::document &&value) noexcept; ///< @private + simdjson_inline simdjson_result(icelake::ondemand::document &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; simdjson_inline error_code rewind() noexcept; - simdjson_inline simdjson_result<haswell::ondemand::array> get_array() & noexcept; - simdjson_inline simdjson_result<haswell::ondemand::object> get_object() & noexcept; + simdjson_inline simdjson_result<icelake::ondemand::array> get_array() & noexcept; + simdjson_inline simdjson_result<icelake::ondemand::object> get_object() & noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64() noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64_in_string() noexcept; simdjson_inline simdjson_result<int64_t> get_int64() noexcept; @@ -68275,9 +106885,9 @@ struct simdjson_result<haswell::ondemand::document> : public haswell::implementa template <typename string_type> simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result<std::string_view> get_wobbly_string() noexcept; - simdjson_inline simdjson_result<haswell::ondemand::raw_json_string> get_raw_json_string() noexcept; + simdjson_inline simdjson_result<icelake::ondemand::raw_json_string> get_raw_json_string() noexcept; simdjson_inline simdjson_result<bool> get_bool() noexcept; - simdjson_inline simdjson_result<haswell::ondemand::value> get_value() noexcept; + simdjson_inline simdjson_result<icelake::ondemand::value> get_value() noexcept; simdjson_inline simdjson_result<bool> is_null() noexcept; template<typename T> simdjson_inline simdjson_result<T> get() & noexcept; @@ -68287,33 +106897,33 @@ struct simdjson_result<haswell::ondemand::document> : public haswell::implementa template<typename T> simdjson_inline error_code get(T &out) && noexcept; #if SIMDJSON_EXCEPTIONS - using haswell::implementation_simdjson_result_base<haswell::ondemand::document>::operator*; - using haswell::implementation_simdjson_result_base<haswell::ondemand::document>::operator->; - template <class T, typename std::enable_if<std::is_same<T, haswell::ondemand::document>::value == false>::type> + using icelake::implementation_simdjson_result_base<icelake::ondemand::document>::operator*; + using icelake::implementation_simdjson_result_base<icelake::ondemand::document>::operator->; + template <class T, typename std::enable_if<std::is_same<T, icelake::ondemand::document>::value == false>::type> explicit simdjson_inline operator T() noexcept(false); - simdjson_inline operator haswell::ondemand::array() & noexcept(false); - simdjson_inline operator haswell::ondemand::object() & noexcept(false); + simdjson_inline operator icelake::ondemand::array() & noexcept(false); + simdjson_inline operator icelake::ondemand::object() & noexcept(false); simdjson_inline operator uint64_t() noexcept(false); simdjson_inline operator int64_t() noexcept(false); simdjson_inline operator double() noexcept(false); simdjson_inline operator std::string_view() noexcept(false); - simdjson_inline operator haswell::ondemand::raw_json_string() noexcept(false); + simdjson_inline operator icelake::ondemand::raw_json_string() noexcept(false); simdjson_inline operator bool() noexcept(false); - simdjson_inline operator haswell::ondemand::value() noexcept(false); + simdjson_inline operator icelake::ondemand::value() noexcept(false); #endif simdjson_inline simdjson_result<size_t> count_elements() & noexcept; simdjson_inline simdjson_result<size_t> count_fields() & noexcept; - simdjson_inline simdjson_result<haswell::ondemand::value> at(size_t index) & noexcept; - simdjson_inline simdjson_result<haswell::ondemand::array_iterator> begin() & noexcept; - simdjson_inline simdjson_result<haswell::ondemand::array_iterator> end() & noexcept; - simdjson_inline simdjson_result<haswell::ondemand::value> find_field(std::string_view key) & noexcept; - simdjson_inline simdjson_result<haswell::ondemand::value> find_field(const char *key) & noexcept; - simdjson_inline simdjson_result<haswell::ondemand::value> operator[](std::string_view key) & noexcept; - simdjson_inline simdjson_result<haswell::ondemand::value> operator[](const char *key) & noexcept; - simdjson_result<haswell::ondemand::value> operator[](int) & noexcept = delete; - simdjson_inline simdjson_result<haswell::ondemand::value> find_field_unordered(std::string_view key) & noexcept; - simdjson_inline simdjson_result<haswell::ondemand::value> find_field_unordered(const char *key) & noexcept; - simdjson_inline simdjson_result<haswell::ondemand::json_type> type() noexcept; + simdjson_inline simdjson_result<icelake::ondemand::value> at(size_t index) & noexcept; + simdjson_inline simdjson_result<icelake::ondemand::array_iterator> begin() & noexcept; + simdjson_inline simdjson_result<icelake::ondemand::array_iterator> end() & noexcept; + simdjson_inline simdjson_result<icelake::ondemand::value> find_field(std::string_view key) & noexcept; + simdjson_inline simdjson_result<icelake::ondemand::value> find_field(const char *key) & noexcept; + simdjson_inline simdjson_result<icelake::ondemand::value> operator[](std::string_view key) & noexcept; + simdjson_inline simdjson_result<icelake::ondemand::value> operator[](const char *key) & noexcept; + simdjson_result<icelake::ondemand::value> operator[](int) & noexcept = delete; + simdjson_inline simdjson_result<icelake::ondemand::value> find_field_unordered(std::string_view key) & noexcept; + simdjson_inline simdjson_result<icelake::ondemand::value> find_field_unordered(const char *key) & noexcept; + simdjson_inline simdjson_result<icelake::ondemand::json_type> type() noexcept; simdjson_inline simdjson_result<bool> is_scalar() noexcept; simdjson_inline simdjson_result<bool> is_string() noexcept; simdjson_inline simdjson_result<const char *> current_location() noexcept; @@ -68321,14 +106931,14 @@ struct simdjson_result<haswell::ondemand::document> : public haswell::implementa simdjson_inline bool at_end() const noexcept; simdjson_inline bool is_negative() noexcept; simdjson_inline simdjson_result<bool> is_integer() noexcept; - simdjson_inline simdjson_result<haswell::number_type> get_number_type() noexcept; - simdjson_inline simdjson_result<haswell::ondemand::number> get_number() noexcept; + simdjson_inline simdjson_result<icelake::number_type> get_number_type() noexcept; + simdjson_inline simdjson_result<icelake::ondemand::number> get_number() noexcept; /** @copydoc simdjson_inline std::string_view document::raw_json_token() const noexcept */ simdjson_inline simdjson_result<std::string_view> raw_json_token() noexcept; - simdjson_inline simdjson_result<haswell::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result<haswell::ondemand::value> at_path(std::string_view json_path) noexcept; - simdjson_inline simdjson_result<std::vector<haswell::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<icelake::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result<icelake::ondemand::value> at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<std::vector<icelake::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; #if SIMDJSON_STATIC_REFLECTION template<constevalutil::fixed_string... FieldNames, typename T> requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) @@ -68344,14 +106954,14 @@ struct simdjson_result<haswell::ondemand::document> : public haswell::implementa namespace simdjson { template<> -struct simdjson_result<haswell::ondemand::document_reference> : public haswell::implementation_simdjson_result_base<haswell::ondemand::document_reference> { +struct simdjson_result<icelake::ondemand::document_reference> : public icelake::implementation_simdjson_result_base<icelake::ondemand::document_reference> { public: - simdjson_inline simdjson_result(haswell::ondemand::document_reference value, error_code error) noexcept; + simdjson_inline simdjson_result(icelake::ondemand::document_reference value, error_code error) noexcept; simdjson_inline simdjson_result() noexcept = default; simdjson_inline error_code rewind() noexcept; - simdjson_inline simdjson_result<haswell::ondemand::array> get_array() & noexcept; - simdjson_inline simdjson_result<haswell::ondemand::object> get_object() & noexcept; + simdjson_inline simdjson_result<icelake::ondemand::array> get_array() & noexcept; + simdjson_inline simdjson_result<icelake::ondemand::object> get_object() & noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64() noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64_in_string() noexcept; simdjson_inline simdjson_result<int64_t> get_int64() noexcept; @@ -68362,9 +106972,9 @@ struct simdjson_result<haswell::ondemand::document_reference> : public haswell:: template <typename string_type> simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result<std::string_view> get_wobbly_string() noexcept; - simdjson_inline simdjson_result<haswell::ondemand::raw_json_string> get_raw_json_string() noexcept; + simdjson_inline simdjson_result<icelake::ondemand::raw_json_string> get_raw_json_string() noexcept; simdjson_inline simdjson_result<bool> get_bool() noexcept; - simdjson_inline simdjson_result<haswell::ondemand::value> get_value() noexcept; + simdjson_inline simdjson_result<icelake::ondemand::value> get_value() noexcept; simdjson_inline simdjson_result<bool> is_null() noexcept; template<typename T> simdjson_inline simdjson_result<T> get() & noexcept; @@ -68375,43 +106985,43 @@ struct simdjson_result<haswell::ondemand::document_reference> : public haswell:: #if SIMDJSON_EXCEPTIONS template <class T> explicit simdjson_inline operator T() noexcept(false); - simdjson_inline operator haswell::ondemand::array() & noexcept(false); - simdjson_inline operator haswell::ondemand::object() & noexcept(false); + simdjson_inline operator icelake::ondemand::array() & noexcept(false); + simdjson_inline operator icelake::ondemand::object() & noexcept(false); simdjson_inline operator uint64_t() noexcept(false); simdjson_inline operator int64_t() noexcept(false); simdjson_inline operator double() noexcept(false); simdjson_inline operator std::string_view() noexcept(false); - simdjson_inline operator haswell::ondemand::raw_json_string() noexcept(false); + simdjson_inline operator icelake::ondemand::raw_json_string() noexcept(false); simdjson_inline operator bool() noexcept(false); - simdjson_inline operator haswell::ondemand::value() noexcept(false); + simdjson_inline operator icelake::ondemand::value() noexcept(false); #endif simdjson_inline simdjson_result<size_t> count_elements() & noexcept; simdjson_inline simdjson_result<size_t> count_fields() & noexcept; - simdjson_inline simdjson_result<haswell::ondemand::value> at(size_t index) & noexcept; - simdjson_inline simdjson_result<haswell::ondemand::array_iterator> begin() & noexcept; - simdjson_inline simdjson_result<haswell::ondemand::array_iterator> end() & noexcept; - simdjson_inline simdjson_result<haswell::ondemand::value> find_field(std::string_view key) & noexcept; - simdjson_inline simdjson_result<haswell::ondemand::value> find_field(const char *key) & noexcept; - simdjson_inline simdjson_result<haswell::ondemand::value> operator[](std::string_view key) & noexcept; - simdjson_inline simdjson_result<haswell::ondemand::value> operator[](const char *key) & noexcept; - simdjson_result<haswell::ondemand::value> operator[](int) & noexcept = delete; - simdjson_inline simdjson_result<haswell::ondemand::value> find_field_unordered(std::string_view key) & noexcept; - simdjson_inline simdjson_result<haswell::ondemand::value> find_field_unordered(const char *key) & noexcept; - simdjson_inline simdjson_result<haswell::ondemand::json_type> type() noexcept; + simdjson_inline simdjson_result<icelake::ondemand::value> at(size_t index) & noexcept; + simdjson_inline simdjson_result<icelake::ondemand::array_iterator> begin() & noexcept; + simdjson_inline simdjson_result<icelake::ondemand::array_iterator> end() & noexcept; + simdjson_inline simdjson_result<icelake::ondemand::value> find_field(std::string_view key) & noexcept; + simdjson_inline simdjson_result<icelake::ondemand::value> find_field(const char *key) & noexcept; + simdjson_inline simdjson_result<icelake::ondemand::value> operator[](std::string_view key) & noexcept; + simdjson_inline simdjson_result<icelake::ondemand::value> operator[](const char *key) & noexcept; + simdjson_result<icelake::ondemand::value> operator[](int) & noexcept = delete; + simdjson_inline simdjson_result<icelake::ondemand::value> find_field_unordered(std::string_view key) & noexcept; + simdjson_inline simdjson_result<icelake::ondemand::value> find_field_unordered(const char *key) & noexcept; + simdjson_inline simdjson_result<icelake::ondemand::json_type> type() noexcept; simdjson_inline simdjson_result<bool> is_scalar() noexcept; simdjson_inline simdjson_result<bool> is_string() noexcept; simdjson_inline simdjson_result<const char *> current_location() noexcept; simdjson_inline simdjson_result<int32_t> current_depth() const noexcept; simdjson_inline simdjson_result<bool> is_negative() noexcept; simdjson_inline simdjson_result<bool> is_integer() noexcept; - simdjson_inline simdjson_result<haswell::number_type> get_number_type() noexcept; - simdjson_inline simdjson_result<haswell::ondemand::number> get_number() noexcept; + simdjson_inline simdjson_result<icelake::number_type> get_number_type() noexcept; + simdjson_inline simdjson_result<icelake::ondemand::number> get_number() noexcept; /** @copydoc simdjson_inline std::string_view document_reference::raw_json_token() const noexcept */ simdjson_inline simdjson_result<std::string_view> raw_json_token() noexcept; - simdjson_inline simdjson_result<haswell::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result<haswell::ondemand::value> at_path(std::string_view json_path) noexcept; - simdjson_inline simdjson_result<std::vector<haswell::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<icelake::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result<icelake::ondemand::value> at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<std::vector<icelake::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; #if SIMDJSON_STATIC_REFLECTION template<constevalutil::fixed_string... FieldNames, typename T> requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) @@ -68423,9 +107033,9 @@ struct simdjson_result<haswell::ondemand::document_reference> : public haswell:: } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_H -/* end file simdjson/generic/ondemand/document.h for haswell */ -/* including simdjson/generic/ondemand/document_stream.h for haswell: #include "simdjson/generic/ondemand/document_stream.h" */ -/* begin file simdjson/generic/ondemand/document_stream.h for haswell */ +/* end file simdjson/generic/ondemand/document.h for icelake */ +/* including simdjson/generic/ondemand/document_stream.h for icelake: #include "simdjson/generic/ondemand/document_stream.h" */ +/* begin file simdjson/generic/ondemand/document_stream.h for icelake */ #ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -68443,7 +107053,7 @@ struct simdjson_result<haswell::ondemand::document_reference> : public haswell:: #endif namespace simdjson { -namespace haswell { +namespace icelake { namespace ondemand { #ifdef SIMDJSON_THREADS_ENABLED @@ -68756,14 +107366,14 @@ class document_stream { }; // document_stream } // namespace ondemand -} // namespace haswell +} // namespace icelake } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<haswell::ondemand::document_stream> : public haswell::implementation_simdjson_result_base<haswell::ondemand::document_stream> { +struct simdjson_result<icelake::ondemand::document_stream> : public icelake::implementation_simdjson_result_base<icelake::ondemand::document_stream> { public: - simdjson_inline simdjson_result(haswell::ondemand::document_stream &&value) noexcept; ///< @private + simdjson_inline simdjson_result(icelake::ondemand::document_stream &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; }; @@ -68771,9 +107381,9 @@ struct simdjson_result<haswell::ondemand::document_stream> : public haswell::imp } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_H -/* end file simdjson/generic/ondemand/document_stream.h for haswell */ -/* including simdjson/generic/ondemand/field.h for haswell: #include "simdjson/generic/ondemand/field.h" */ -/* begin file simdjson/generic/ondemand/field.h for haswell */ +/* end file simdjson/generic/ondemand/document_stream.h for icelake */ +/* including simdjson/generic/ondemand/field.h for icelake: #include "simdjson/generic/ondemand/field.h" */ +/* begin file simdjson/generic/ondemand/field.h for icelake */ #ifndef SIMDJSON_GENERIC_ONDEMAND_FIELD_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -68785,7 +107395,7 @@ struct simdjson_result<haswell::ondemand::document_stream> : public haswell::imp /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace haswell { +namespace icelake { namespace ondemand { /** @@ -68863,33 +107473,33 @@ class field : public std::pair<raw_json_string, value> { }; } // namespace ondemand -} // namespace haswell +} // namespace icelake } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<haswell::ondemand::field> : public haswell::implementation_simdjson_result_base<haswell::ondemand::field> { +struct simdjson_result<icelake::ondemand::field> : public icelake::implementation_simdjson_result_base<icelake::ondemand::field> { public: - simdjson_inline simdjson_result(haswell::ondemand::field &&value) noexcept; ///< @private + simdjson_inline simdjson_result(icelake::ondemand::field &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; simdjson_inline simdjson_result<std::string_view> unescaped_key(bool allow_replacement = false) noexcept; template<typename string_type> simdjson_inline error_code unescaped_key(string_type &receiver, bool allow_replacement = false) noexcept; - simdjson_inline simdjson_result<haswell::ondemand::raw_json_string> key() noexcept; + simdjson_inline simdjson_result<icelake::ondemand::raw_json_string> key() noexcept; simdjson_inline simdjson_result<std::string_view> key_raw_json_token() noexcept; simdjson_inline simdjson_result<std::string_view> escaped_key() noexcept; - simdjson_inline simdjson_result<haswell::ondemand::value> value() noexcept; + simdjson_inline simdjson_result<icelake::ondemand::value> value() noexcept; }; } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_FIELD_H -/* end file simdjson/generic/ondemand/field.h for haswell */ -/* including simdjson/generic/ondemand/object.h for haswell: #include "simdjson/generic/ondemand/object.h" */ -/* begin file simdjson/generic/ondemand/object.h for haswell */ +/* end file simdjson/generic/ondemand/field.h for icelake */ +/* including simdjson/generic/ondemand/object.h for icelake: #include "simdjson/generic/ondemand/object.h" */ +/* begin file simdjson/generic/ondemand/object.h for icelake */ #ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -68904,7 +107514,7 @@ struct simdjson_result<haswell::ondemand::field> : public haswell::implementatio /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace haswell { +namespace icelake { namespace ondemand { /** @@ -68919,6 +107529,13 @@ class object { */ simdjson_inline object() noexcept = default; + /** + * Get an iterator to the start of the object. We recommend using a range-based for loop. + * + * Using the iterator directly is also possible but error-prone and discouraged. In particular, + * you must dereference the iterator exactly once per iteration (before calling '++'). + * Doing otherwise is unsafe and may lead to errors. You are responsible for ensuring + */ simdjson_inline simdjson_result<object_iterator> begin() noexcept; simdjson_inline simdjson_result<object_iterator> end() noexcept; /** @@ -69191,29 +107808,29 @@ class object { }; } // namespace ondemand -} // namespace haswell +} // namespace icelake } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<haswell::ondemand::object> : public haswell::implementation_simdjson_result_base<haswell::ondemand::object> { +struct simdjson_result<icelake::ondemand::object> : public icelake::implementation_simdjson_result_base<icelake::ondemand::object> { public: - simdjson_inline simdjson_result(haswell::ondemand::object &&value) noexcept; ///< @private + simdjson_inline simdjson_result(icelake::ondemand::object &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; - simdjson_inline simdjson_result<haswell::ondemand::object_iterator> begin() noexcept; - simdjson_inline simdjson_result<haswell::ondemand::object_iterator> end() noexcept; - simdjson_inline simdjson_result<haswell::ondemand::value> find_field(std::string_view key) & noexcept; - simdjson_inline simdjson_result<haswell::ondemand::value> find_field(std::string_view key) && noexcept; - simdjson_inline simdjson_result<haswell::ondemand::value> find_field_unordered(std::string_view key) & noexcept; - simdjson_inline simdjson_result<haswell::ondemand::value> find_field_unordered(std::string_view key) && noexcept; - simdjson_inline simdjson_result<haswell::ondemand::value> operator[](std::string_view key) & noexcept; - simdjson_inline simdjson_result<haswell::ondemand::value> operator[](std::string_view key) && noexcept; - simdjson_inline simdjson_result<haswell::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result<haswell::ondemand::value> at_path(std::string_view json_path) noexcept; - simdjson_inline simdjson_result<std::vector<haswell::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<icelake::ondemand::object_iterator> begin() noexcept; + simdjson_inline simdjson_result<icelake::ondemand::object_iterator> end() noexcept; + simdjson_inline simdjson_result<icelake::ondemand::value> find_field(std::string_view key) & noexcept; + simdjson_inline simdjson_result<icelake::ondemand::value> find_field(std::string_view key) && noexcept; + simdjson_inline simdjson_result<icelake::ondemand::value> find_field_unordered(std::string_view key) & noexcept; + simdjson_inline simdjson_result<icelake::ondemand::value> find_field_unordered(std::string_view key) && noexcept; + simdjson_inline simdjson_result<icelake::ondemand::value> operator[](std::string_view key) & noexcept; + simdjson_inline simdjson_result<icelake::ondemand::value> operator[](std::string_view key) && noexcept; + simdjson_inline simdjson_result<icelake::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result<icelake::ondemand::value> at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<std::vector<icelake::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; inline simdjson_result<bool> reset() noexcept; inline simdjson_result<bool> is_empty() noexcept; inline simdjson_result<size_t> count_fields() & noexcept; @@ -69224,7 +107841,7 @@ struct simdjson_result<haswell::ondemand::object> : public haswell::implementati template<typename T> simdjson_inline simdjson_result<T> get() noexcept { if (error()) { return error(); } - if constexpr (std::is_same_v<T, haswell::ondemand::object>) { + if constexpr (std::is_same_v<T, icelake::ondemand::object>) { return first; } return first.get<T>(); @@ -69232,7 +107849,7 @@ struct simdjson_result<haswell::ondemand::object> : public haswell::implementati template<typename T> simdjson_warn_unused simdjson_inline error_code get(T& out) noexcept { if (error()) { return error(); } - if constexpr (std::is_same_v<T, haswell::ondemand::object>) { + if constexpr (std::is_same_v<T, icelake::ondemand::object>) { out = first; } else { SIMDJSON_TRY( first.get<T>(out) ); @@ -69255,9 +107872,9 @@ struct simdjson_result<haswell::ondemand::object> : public haswell::implementati } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_H -/* end file simdjson/generic/ondemand/object.h for haswell */ -/* including simdjson/generic/ondemand/object_iterator.h for haswell: #include "simdjson/generic/ondemand/object_iterator.h" */ -/* begin file simdjson/generic/ondemand/object_iterator.h for haswell */ +/* end file simdjson/generic/ondemand/object.h for icelake */ +/* including simdjson/generic/ondemand/object_iterator.h for icelake: #include "simdjson/generic/ondemand/object_iterator.h" */ +/* begin file simdjson/generic/ondemand/object_iterator.h for icelake */ #ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -69268,7 +107885,7 @@ struct simdjson_result<haswell::ondemand::object> : public haswell::implementati /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace haswell { +namespace icelake { namespace ondemand { class object_iterator { @@ -69292,9 +107909,14 @@ class object_iterator { // Assumes it's being compared with the end. true if depth >= iter->depth. simdjson_inline bool operator!=(const object_iterator &) const noexcept; // Checks for ']' and ',' + // YOU MUST NOT CALL THIS IF operator* YIELDED AN ERROR. + // YOU MUST NOT CALL THIS WITHOUT A CORRESPONDING operator* CALL. simdjson_inline object_iterator &operator++() noexcept; private: +#if SIMDJSON_DEVELOPMENT_CHECKS + bool has_been_referenced{false}; +#endif /** * The underlying JSON iterator. * @@ -69309,15 +107931,15 @@ class object_iterator { }; } // namespace ondemand -} // namespace haswell +} // namespace icelake } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<haswell::ondemand::object_iterator> : public haswell::implementation_simdjson_result_base<haswell::ondemand::object_iterator> { +struct simdjson_result<icelake::ondemand::object_iterator> : public icelake::implementation_simdjson_result_base<icelake::ondemand::object_iterator> { public: - simdjson_inline simdjson_result(haswell::ondemand::object_iterator &&value) noexcept; ///< @private + simdjson_inline simdjson_result(icelake::ondemand::object_iterator &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; @@ -69326,21 +107948,21 @@ struct simdjson_result<haswell::ondemand::object_iterator> : public haswell::imp // // Reads key and value, yielding them to the user. - simdjson_inline simdjson_result<haswell::ondemand::field> operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. + simdjson_inline simdjson_result<icelake::ondemand::field> operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. // Assumes it's being compared with the end. true if depth < iter->depth. - simdjson_inline bool operator==(const simdjson_result<haswell::ondemand::object_iterator> &) const noexcept; + simdjson_inline bool operator==(const simdjson_result<icelake::ondemand::object_iterator> &) const noexcept; // Assumes it's being compared with the end. true if depth >= iter->depth. - simdjson_inline bool operator!=(const simdjson_result<haswell::ondemand::object_iterator> &) const noexcept; + simdjson_inline bool operator!=(const simdjson_result<icelake::ondemand::object_iterator> &) const noexcept; // Checks for ']' and ',' - simdjson_inline simdjson_result<haswell::ondemand::object_iterator> &operator++() noexcept; + simdjson_inline simdjson_result<icelake::ondemand::object_iterator> &operator++() noexcept; }; } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_H -/* end file simdjson/generic/ondemand/object_iterator.h for haswell */ -/* including simdjson/generic/ondemand/serialization.h for haswell: #include "simdjson/generic/ondemand/serialization.h" */ -/* begin file simdjson/generic/ondemand/serialization.h for haswell */ +/* end file simdjson/generic/ondemand/object_iterator.h for icelake */ +/* including simdjson/generic/ondemand/serialization.h for icelake: #include "simdjson/generic/ondemand/serialization.h" */ +/* begin file simdjson/generic/ondemand/serialization.h for icelake */ #ifndef SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -69354,30 +107976,30 @@ namespace simdjson { * contains JSON text that is suitable to be parsed as JSON again. It does not * validate the content. */ -inline simdjson_result<std::string_view> to_json_string(haswell::ondemand::document& x) noexcept; +inline simdjson_result<std::string_view> to_json_string(icelake::ondemand::document& x) noexcept; /** * Create a string-view instance out of a value instance. The string-view instance * contains JSON text that is suitable to be parsed as JSON again. The value must * not have been accessed previously. It does not * validate the content. */ -inline simdjson_result<std::string_view> to_json_string(haswell::ondemand::value& x) noexcept; +inline simdjson_result<std::string_view> to_json_string(icelake::ondemand::value& x) noexcept; /** * Create a string-view instance out of an object instance. The string-view instance * contains JSON text that is suitable to be parsed as JSON again. It does not * validate the content. */ -inline simdjson_result<std::string_view> to_json_string(haswell::ondemand::object& x) noexcept; +inline simdjson_result<std::string_view> to_json_string(icelake::ondemand::object& x) noexcept; /** * Create a string-view instance out of an array instance. The string-view instance * contains JSON text that is suitable to be parsed as JSON again. It does not * validate the content. */ -inline simdjson_result<std::string_view> to_json_string(haswell::ondemand::array& x) noexcept; -inline simdjson_result<std::string_view> to_json_string(simdjson_result<haswell::ondemand::document> x); -inline simdjson_result<std::string_view> to_json_string(simdjson_result<haswell::ondemand::value> x); -inline simdjson_result<std::string_view> to_json_string(simdjson_result<haswell::ondemand::object> x); -inline simdjson_result<std::string_view> to_json_string(simdjson_result<haswell::ondemand::array> x); +inline simdjson_result<std::string_view> to_json_string(icelake::ondemand::array& x) noexcept; +inline simdjson_result<std::string_view> to_json_string(simdjson_result<icelake::ondemand::document> x); +inline simdjson_result<std::string_view> to_json_string(simdjson_result<icelake::ondemand::value> x); +inline simdjson_result<std::string_view> to_json_string(simdjson_result<icelake::ondemand::object> x); +inline simdjson_result<std::string_view> to_json_string(simdjson_result<icelake::ondemand::array> x); #if SIMDJSON_STATIC_REFLECTION /** @@ -69385,10 +108007,10 @@ inline simdjson_result<std::string_view> to_json_string(simdjson_result<haswell: * Only available when SIMDJSON_STATIC_REFLECTION is enabled. */ template<typename T> - requires(!std::same_as<T, haswell::ondemand::document> && - !std::same_as<T, haswell::ondemand::value> && - !std::same_as<T, haswell::ondemand::object> && - !std::same_as<T, haswell::ondemand::array>) + requires(!std::same_as<T, icelake::ondemand::document> && + !std::same_as<T, icelake::ondemand::value> && + !std::same_as<T, icelake::ondemand::object> && + !std::same_as<T, icelake::ondemand::array>) inline std::string to_json_string(const T& obj); #endif @@ -69401,7 +108023,7 @@ inline std::string to_json_string(const T& obj); * Credit: @madhur4127 * See https://github.com/simdjson/simdjson/issues/1768 */ -namespace simdjson { namespace haswell { namespace ondemand { +namespace simdjson { namespace icelake { namespace ondemand { /** * Print JSON to an output stream. It does not @@ -69411,9 +108033,9 @@ namespace simdjson { namespace haswell { namespace ondemand { * @param value The element. * @throw if there is an error with the underlying output stream. simdjson itself will not throw. */ -inline std::ostream& operator<<(std::ostream& out, simdjson::haswell::ondemand::value x); +inline std::ostream& operator<<(std::ostream& out, simdjson::icelake::ondemand::value x); #if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::haswell::ondemand::value> x); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::icelake::ondemand::value> x); #endif /** * Print JSON to an output stream. It does not @@ -69423,9 +108045,9 @@ inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<sim * @param value The array. * @throw if there is an error with the underlying output stream. simdjson itself will not throw. */ -inline std::ostream& operator<<(std::ostream& out, simdjson::haswell::ondemand::array value); +inline std::ostream& operator<<(std::ostream& out, simdjson::icelake::ondemand::array value); #if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::haswell::ondemand::array> x); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::icelake::ondemand::array> x); #endif /** * Print JSON to an output stream. It does not @@ -69435,13 +108057,13 @@ inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<sim * @param value The array. * @throw if there is an error with the underlying output stream. simdjson itself will not throw. */ -inline std::ostream& operator<<(std::ostream& out, simdjson::haswell::ondemand::document& value); +inline std::ostream& operator<<(std::ostream& out, simdjson::icelake::ondemand::document& value); #if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::haswell::ondemand::document>&& x); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::icelake::ondemand::document>&& x); #endif -inline std::ostream& operator<<(std::ostream& out, simdjson::haswell::ondemand::document_reference& value); +inline std::ostream& operator<<(std::ostream& out, simdjson::icelake::ondemand::document_reference& value); #if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::haswell::ondemand::document_reference>&& x); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::icelake::ondemand::document_reference>&& x); #endif /** * Print JSON to an output stream. It does not @@ -69451,18 +108073,18 @@ inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<sim * @param value The object. * @throw if there is an error with the underlying output stream. simdjson itself will not throw. */ -inline std::ostream& operator<<(std::ostream& out, simdjson::haswell::ondemand::object value); +inline std::ostream& operator<<(std::ostream& out, simdjson::icelake::ondemand::object value); #if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::haswell::ondemand::object> x); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::icelake::ondemand::object> x); #endif -}}} // namespace simdjson::haswell::ondemand +}}} // namespace simdjson::icelake::ondemand #endif // SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_H -/* end file simdjson/generic/ondemand/serialization.h for haswell */ +/* end file simdjson/generic/ondemand/serialization.h for icelake */ // Deserialization for standard types -/* including simdjson/generic/ondemand/std_deserialize.h for haswell: #include "simdjson/generic/ondemand/std_deserialize.h" */ -/* begin file simdjson/generic/ondemand/std_deserialize.h for haswell */ +/* including simdjson/generic/ondemand/std_deserialize.h for icelake: #include "simdjson/generic/ondemand/std_deserialize.h" */ +/* begin file simdjson/generic/ondemand/std_deserialize.h for icelake */ #if SIMDJSON_SUPPORTS_CONCEPTS #ifndef SIMDJSON_ONDEMAND_DESERIALIZE_H @@ -69561,8 +108183,8 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { static_assert( std::is_default_constructible_v<value_type>, "The specified type inside the container must default constructible."); - haswell::ondemand::array arr; - if constexpr (std::is_same_v<std::remove_cvref_t<ValT>, haswell::ondemand::array>) { + icelake::ondemand::array arr; + if constexpr (std::is_same_v<std::remove_cvref_t<ValT>, icelake::ondemand::array>) { arr = val; } else { SIMDJSON_TRY(val.get_array().get(arr)); @@ -69606,7 +108228,7 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { static_assert( std::is_default_constructible_v<value_type>, "The specified value type inside the container must default constructible."); - haswell::ondemand::object obj; + icelake::ondemand::object obj; SIMDJSON_TRY(val.get_object().get(obj)); for (auto field : obj) { std::string_view key; @@ -69624,7 +108246,7 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { } template <concepts::string_view_keyed_map T> -error_code tag_invoke(deserialize_tag, haswell::ondemand::object &obj, T &out) noexcept { +error_code tag_invoke(deserialize_tag, icelake::ondemand::object &obj, T &out) noexcept { using value_type = typename std::remove_cvref_t<T>::mapped_type; out.clear(); @@ -69632,7 +108254,7 @@ error_code tag_invoke(deserialize_tag, haswell::ondemand::object &obj, T &out) n std::string_view key; SIMDJSON_TRY(field.unescaped_key().get(key)); - haswell::ondemand::value value_obj; + icelake::ondemand::value value_obj; SIMDJSON_TRY(field.value().get(value_obj)); value_type this_value; @@ -69643,22 +108265,22 @@ error_code tag_invoke(deserialize_tag, haswell::ondemand::object &obj, T &out) n } template <concepts::string_view_keyed_map T> -error_code tag_invoke(deserialize_tag, haswell::ondemand::value &val, T &out) noexcept { - haswell::ondemand::object obj; +error_code tag_invoke(deserialize_tag, icelake::ondemand::value &val, T &out) noexcept { + icelake::ondemand::object obj; SIMDJSON_TRY(val.get_object().get(obj)); return simdjson::deserialize(obj, out); } template <concepts::string_view_keyed_map T> -error_code tag_invoke(deserialize_tag, haswell::ondemand::document &doc, T &out) noexcept { - haswell::ondemand::object obj; +error_code tag_invoke(deserialize_tag, icelake::ondemand::document &doc, T &out) noexcept { + icelake::ondemand::object obj; SIMDJSON_TRY(doc.get_object().get(obj)); return simdjson::deserialize(obj, out); } template <concepts::string_view_keyed_map T> -error_code tag_invoke(deserialize_tag, haswell::ondemand::document_reference &doc, T &out) noexcept { - haswell::ondemand::object obj; +error_code tag_invoke(deserialize_tag, icelake::ondemand::document_reference &doc, T &out) noexcept { + icelake::ondemand::object obj; SIMDJSON_TRY(doc.get_object().get(obj)); return simdjson::deserialize(obj, out); } @@ -69735,8 +108357,8 @@ constexpr bool user_defined_type = (std::is_class_v<T> template <typename T, typename ValT> requires(user_defined_type<T> && std::is_class_v<T>) error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept { - haswell::ondemand::object obj; - if constexpr (std::is_same_v<std::remove_cvref_t<ValT>, haswell::ondemand::object>) { + icelake::ondemand::object obj; + if constexpr (std::is_same_v<std::remove_cvref_t<ValT>, icelake::ondemand::object>) { obj = val; } else { SIMDJSON_TRY(val.get_object().get(obj)); @@ -70045,11 +108667,11 @@ error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr<int> &out) noe #endif // SIMDJSON_ONDEMAND_DESERIALIZE_H #endif // SIMDJSON_SUPPORTS_CONCEPTS -/* end file simdjson/generic/ondemand/std_deserialize.h for haswell */ +/* end file simdjson/generic/ondemand/std_deserialize.h for icelake */ // Inline definitions -/* including simdjson/generic/ondemand/array-inl.h for haswell: #include "simdjson/generic/ondemand/array-inl.h" */ -/* begin file simdjson/generic/ondemand/array-inl.h for haswell */ +/* including simdjson/generic/ondemand/array-inl.h for icelake: #include "simdjson/generic/ondemand/array-inl.h" */ +/* begin file simdjson/generic/ondemand/array-inl.h for icelake */ #ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -70064,7 +108686,7 @@ error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr<int> &out) noe /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace haswell { +namespace icelake { namespace ondemand { // @@ -70293,68 +108915,68 @@ simdjson_inline simdjson_result<value> array::at(size_t index) noexcept { } } // namespace ondemand -} // namespace haswell +} // namespace icelake } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<haswell::ondemand::array>::simdjson_result( - haswell::ondemand::array &&value +simdjson_inline simdjson_result<icelake::ondemand::array>::simdjson_result( + icelake::ondemand::array &&value ) noexcept - : implementation_simdjson_result_base<haswell::ondemand::array>( - std::forward<haswell::ondemand::array>(value) + : implementation_simdjson_result_base<icelake::ondemand::array>( + std::forward<icelake::ondemand::array>(value) ) { } -simdjson_inline simdjson_result<haswell::ondemand::array>::simdjson_result( +simdjson_inline simdjson_result<icelake::ondemand::array>::simdjson_result( error_code error ) noexcept - : implementation_simdjson_result_base<haswell::ondemand::array>(error) + : implementation_simdjson_result_base<icelake::ondemand::array>(error) { } -simdjson_inline simdjson_result<haswell::ondemand::array_iterator> simdjson_result<haswell::ondemand::array>::begin() noexcept { +simdjson_inline simdjson_result<icelake::ondemand::array_iterator> simdjson_result<icelake::ondemand::array>::begin() noexcept { if (error()) { return error(); } return first.begin(); } -simdjson_inline simdjson_result<haswell::ondemand::array_iterator> simdjson_result<haswell::ondemand::array>::end() noexcept { +simdjson_inline simdjson_result<icelake::ondemand::array_iterator> simdjson_result<icelake::ondemand::array>::end() noexcept { if (error()) { return error(); } return first.end(); } -simdjson_inline simdjson_result<size_t> simdjson_result<haswell::ondemand::array>::count_elements() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<icelake::ondemand::array>::count_elements() & noexcept { if (error()) { return error(); } return first.count_elements(); } -simdjson_inline simdjson_result<bool> simdjson_result<haswell::ondemand::array>::is_empty() & noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<icelake::ondemand::array>::is_empty() & noexcept { if (error()) { return error(); } return first.is_empty(); } -simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::array>::at(size_t index) noexcept { +simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::array>::at(size_t index) noexcept { if (error()) { return error(); } return first.at(index); } -simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::array>::at_pointer(std::string_view json_pointer) noexcept { +simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::array>::at_pointer(std::string_view json_pointer) noexcept { if (error()) { return error(); } return first.at_pointer(json_pointer); } -simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::array>::at_path(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::array>::at_path(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path(json_path); } -simdjson_inline simdjson_result<std::vector<haswell::ondemand::value>> simdjson_result<haswell::ondemand::array>::at_path_with_wildcard(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<std::vector<icelake::ondemand::value>> simdjson_result<icelake::ondemand::array>::at_path_with_wildcard(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path_with_wildcard(json_path); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<haswell::ondemand::array>::raw_json() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<icelake::ondemand::array>::raw_json() noexcept { if (error()) { return error(); } return first.raw_json(); } } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_INL_H -/* end file simdjson/generic/ondemand/array-inl.h for haswell */ -/* including simdjson/generic/ondemand/array_iterator-inl.h for haswell: #include "simdjson/generic/ondemand/array_iterator-inl.h" */ -/* begin file simdjson/generic/ondemand/array_iterator-inl.h for haswell */ +/* end file simdjson/generic/ondemand/array-inl.h for icelake */ +/* including simdjson/generic/ondemand/array_iterator-inl.h for icelake: #include "simdjson/generic/ondemand/array_iterator-inl.h" */ +/* begin file simdjson/generic/ondemand/array_iterator-inl.h for icelake */ #ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -70366,7 +108988,7 @@ simdjson_inline simdjson_result<std::string_view> simdjson_result<haswell::onde /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace haswell { +namespace icelake { namespace ondemand { simdjson_inline array_iterator::array_iterator(const value_iterator &_iter) noexcept @@ -70374,6 +108996,10 @@ simdjson_inline array_iterator::array_iterator(const value_iterator &_iter) noex {} simdjson_inline simdjson_result<value> array_iterator::operator*() noexcept { +#if SIMDJSON_DEVELOPMENT_CHECKS + SIMDJSON_ASSUME(!has_been_referenced); + has_been_referenced = true; +#endif if (iter.error()) { iter.abandon(); return iter.error(); } return value(iter.child()); } @@ -70384,6 +109010,9 @@ simdjson_inline bool array_iterator::operator!=(const array_iterator &) const no return iter.is_open(); } simdjson_inline array_iterator &array_iterator::operator++() noexcept { +#if SIMDJSON_DEVELOPMENT_CHECKS + has_been_referenced = false; +#endif error_code error; // PERF NOTE this is a safety rail ... users should exit loops as soon as they receive an error, so we'll never get here. // However, it does not seem to make a perf difference, so we add it out of an abundance of caution. @@ -70397,50 +109026,50 @@ simdjson_inline bool array_iterator::at_end() const noexcept { return iter.at_end(); } } // namespace ondemand -} // namespace haswell +} // namespace icelake } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<haswell::ondemand::array_iterator>::simdjson_result( - haswell::ondemand::array_iterator &&value +simdjson_inline simdjson_result<icelake::ondemand::array_iterator>::simdjson_result( + icelake::ondemand::array_iterator &&value ) noexcept - : haswell::implementation_simdjson_result_base<haswell::ondemand::array_iterator>(std::forward<haswell::ondemand::array_iterator>(value)) + : icelake::implementation_simdjson_result_base<icelake::ondemand::array_iterator>(std::forward<icelake::ondemand::array_iterator>(value)) { first.iter.assert_is_valid(); } -simdjson_inline simdjson_result<haswell::ondemand::array_iterator>::simdjson_result(error_code error) noexcept - : haswell::implementation_simdjson_result_base<haswell::ondemand::array_iterator>({}, error) +simdjson_inline simdjson_result<icelake::ondemand::array_iterator>::simdjson_result(error_code error) noexcept + : icelake::implementation_simdjson_result_base<icelake::ondemand::array_iterator>({}, error) { } -simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::array_iterator>::operator*() noexcept { +simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::array_iterator>::operator*() noexcept { if (error()) { return error(); } return *first; } -simdjson_inline bool simdjson_result<haswell::ondemand::array_iterator>::operator==(const simdjson_result<haswell::ondemand::array_iterator> &other) const noexcept { +simdjson_inline bool simdjson_result<icelake::ondemand::array_iterator>::operator==(const simdjson_result<icelake::ondemand::array_iterator> &other) const noexcept { if (!first.iter.is_valid()) { return !error(); } return first == other.first; } -simdjson_inline bool simdjson_result<haswell::ondemand::array_iterator>::operator!=(const simdjson_result<haswell::ondemand::array_iterator> &other) const noexcept { +simdjson_inline bool simdjson_result<icelake::ondemand::array_iterator>::operator!=(const simdjson_result<icelake::ondemand::array_iterator> &other) const noexcept { if (!first.iter.is_valid()) { return error(); } return first != other.first; } -simdjson_inline simdjson_result<haswell::ondemand::array_iterator> &simdjson_result<haswell::ondemand::array_iterator>::operator++() noexcept { +simdjson_inline simdjson_result<icelake::ondemand::array_iterator> &simdjson_result<icelake::ondemand::array_iterator>::operator++() noexcept { // Clear the error if there is one, so we don't yield it twice if (error()) { second = SUCCESS; return *this; } ++(first); return *this; } -simdjson_inline bool simdjson_result<haswell::ondemand::array_iterator>::at_end() const noexcept { +simdjson_inline bool simdjson_result<icelake::ondemand::array_iterator>::at_end() const noexcept { return !first.iter.is_valid() || first.at_end(); } } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_INL_H -/* end file simdjson/generic/ondemand/array_iterator-inl.h for haswell */ -/* including simdjson/generic/ondemand/value-inl.h for haswell: #include "simdjson/generic/ondemand/value-inl.h" */ -/* begin file simdjson/generic/ondemand/value-inl.h for haswell */ +/* end file simdjson/generic/ondemand/array_iterator-inl.h for icelake */ +/* including simdjson/generic/ondemand/value-inl.h for icelake: #include "simdjson/generic/ondemand/value-inl.h" */ +/* begin file simdjson/generic/ondemand/value-inl.h for icelake */ #ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -70456,7 +109085,7 @@ simdjson_inline bool simdjson_result<haswell::ondemand::array_iterator>::at_end( /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace haswell { +namespace icelake { namespace ondemand { simdjson_inline value::value(const value_iterator &_iter) noexcept @@ -70753,240 +109382,240 @@ inline simdjson_result<std::vector<value>> value::at_path_with_wildcard(std::str } } // namespace ondemand -} // namespace haswell +} // namespace icelake } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<haswell::ondemand::value>::simdjson_result( - haswell::ondemand::value &&value +simdjson_inline simdjson_result<icelake::ondemand::value>::simdjson_result( + icelake::ondemand::value &&value ) noexcept : - implementation_simdjson_result_base<haswell::ondemand::value>( - std::forward<haswell::ondemand::value>(value) + implementation_simdjson_result_base<icelake::ondemand::value>( + std::forward<icelake::ondemand::value>(value) ) { } -simdjson_inline simdjson_result<haswell::ondemand::value>::simdjson_result( +simdjson_inline simdjson_result<icelake::ondemand::value>::simdjson_result( error_code error ) noexcept : - implementation_simdjson_result_base<haswell::ondemand::value>(error) + implementation_simdjson_result_base<icelake::ondemand::value>(error) { } -simdjson_inline simdjson_result<size_t> simdjson_result<haswell::ondemand::value>::count_elements() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<icelake::ondemand::value>::count_elements() & noexcept { if (error()) { return error(); } return first.count_elements(); } -simdjson_inline simdjson_result<size_t> simdjson_result<haswell::ondemand::value>::count_fields() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<icelake::ondemand::value>::count_fields() & noexcept { if (error()) { return error(); } return first.count_fields(); } -simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::value>::at(size_t index) noexcept { +simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::value>::at(size_t index) noexcept { if (error()) { return error(); } return first.at(index); } -simdjson_inline simdjson_result<haswell::ondemand::array_iterator> simdjson_result<haswell::ondemand::value>::begin() & noexcept { +simdjson_inline simdjson_result<icelake::ondemand::array_iterator> simdjson_result<icelake::ondemand::value>::begin() & noexcept { if (error()) { return error(); } return first.begin(); } -simdjson_inline simdjson_result<haswell::ondemand::array_iterator> simdjson_result<haswell::ondemand::value>::end() & noexcept { +simdjson_inline simdjson_result<icelake::ondemand::array_iterator> simdjson_result<icelake::ondemand::value>::end() & noexcept { if (error()) { return error(); } return {}; } -simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::value>::find_field(std::string_view key) noexcept { +simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::value>::find_field(std::string_view key) noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::value>::find_field(const char *key) noexcept { +simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::value>::find_field(const char *key) noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::value>::find_field_unordered(std::string_view key) noexcept { +simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::value>::find_field_unordered(std::string_view key) noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::value>::find_field_unordered(const char *key) noexcept { +simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::value>::find_field_unordered(const char *key) noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::value>::operator[](std::string_view key) noexcept { +simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::value>::operator[](std::string_view key) noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::value>::operator[](const char *key) noexcept { +simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::value>::operator[](const char *key) noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<haswell::ondemand::array> simdjson_result<haswell::ondemand::value>::get_array() noexcept { +simdjson_inline simdjson_result<icelake::ondemand::array> simdjson_result<icelake::ondemand::value>::get_array() noexcept { if (error()) { return error(); } return first.get_array(); } -simdjson_inline simdjson_result<haswell::ondemand::object> simdjson_result<haswell::ondemand::value>::get_object() noexcept { +simdjson_inline simdjson_result<icelake::ondemand::object> simdjson_result<icelake::ondemand::value>::get_object() noexcept { if (error()) { return error(); } return first.get_object(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<haswell::ondemand::value>::get_uint64() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<icelake::ondemand::value>::get_uint64() noexcept { if (error()) { return error(); } return first.get_uint64(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<haswell::ondemand::value>::get_uint64_in_string() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<icelake::ondemand::value>::get_uint64_in_string() noexcept { if (error()) { return error(); } return first.get_uint64_in_string(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<haswell::ondemand::value>::get_int64() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<icelake::ondemand::value>::get_int64() noexcept { if (error()) { return error(); } return first.get_int64(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<haswell::ondemand::value>::get_int64_in_string() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<icelake::ondemand::value>::get_int64_in_string() noexcept { if (error()) { return error(); } return first.get_int64_in_string(); } -simdjson_inline simdjson_result<double> simdjson_result<haswell::ondemand::value>::get_double() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<icelake::ondemand::value>::get_double() noexcept { if (error()) { return error(); } return first.get_double(); } -simdjson_inline simdjson_result<double> simdjson_result<haswell::ondemand::value>::get_double_in_string() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<icelake::ondemand::value>::get_double_in_string() noexcept { if (error()) { return error(); } return first.get_double_in_string(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<haswell::ondemand::value>::get_string(bool allow_replacement) noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<icelake::ondemand::value>::get_string(bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(allow_replacement); } template <typename string_type> -simdjson_inline error_code simdjson_result<haswell::ondemand::value>::get_string(string_type& receiver, bool allow_replacement) noexcept { +simdjson_inline error_code simdjson_result<icelake::ondemand::value>::get_string(string_type& receiver, bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(receiver, allow_replacement); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<haswell::ondemand::value>::get_wobbly_string() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<icelake::ondemand::value>::get_wobbly_string() noexcept { if (error()) { return error(); } return first.get_wobbly_string(); } -simdjson_inline simdjson_result<haswell::ondemand::raw_json_string> simdjson_result<haswell::ondemand::value>::get_raw_json_string() noexcept { +simdjson_inline simdjson_result<icelake::ondemand::raw_json_string> simdjson_result<icelake::ondemand::value>::get_raw_json_string() noexcept { if (error()) { return error(); } return first.get_raw_json_string(); } -simdjson_inline simdjson_result<bool> simdjson_result<haswell::ondemand::value>::get_bool() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<icelake::ondemand::value>::get_bool() noexcept { if (error()) { return error(); } return first.get_bool(); } -simdjson_inline simdjson_result<bool> simdjson_result<haswell::ondemand::value>::is_null() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<icelake::ondemand::value>::is_null() noexcept { if (error()) { return error(); } return first.is_null(); } -template<> simdjson_inline error_code simdjson_result<haswell::ondemand::value>::get<haswell::ondemand::value>(haswell::ondemand::value &out) noexcept { +template<> simdjson_inline error_code simdjson_result<icelake::ondemand::value>::get<icelake::ondemand::value>(icelake::ondemand::value &out) noexcept { if (error()) { return error(); } out = first; return SUCCESS; } -template<typename T> simdjson_inline simdjson_result<T> simdjson_result<haswell::ondemand::value>::get() noexcept { +template<typename T> simdjson_inline simdjson_result<T> simdjson_result<icelake::ondemand::value>::get() noexcept { if (error()) { return error(); } return first.get<T>(); } -template<typename T> simdjson_inline error_code simdjson_result<haswell::ondemand::value>::get(T &out) noexcept { +template<typename T> simdjson_inline error_code simdjson_result<icelake::ondemand::value>::get(T &out) noexcept { if (error()) { return error(); } return first.get<T>(out); } -template<> simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::value>::get<haswell::ondemand::value>() noexcept { +template<> simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::value>::get<icelake::ondemand::value>() noexcept { if (error()) { return error(); } return std::move(first); } -simdjson_inline simdjson_result<haswell::ondemand::json_type> simdjson_result<haswell::ondemand::value>::type() noexcept { +simdjson_inline simdjson_result<icelake::ondemand::json_type> simdjson_result<icelake::ondemand::value>::type() noexcept { if (error()) { return error(); } return first.type(); } -simdjson_inline simdjson_result<bool> simdjson_result<haswell::ondemand::value>::is_scalar() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<icelake::ondemand::value>::is_scalar() noexcept { if (error()) { return error(); } return first.is_scalar(); } -simdjson_inline simdjson_result<bool> simdjson_result<haswell::ondemand::value>::is_string() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<icelake::ondemand::value>::is_string() noexcept { if (error()) { return error(); } return first.is_string(); } -simdjson_inline simdjson_result<bool> simdjson_result<haswell::ondemand::value>::is_negative() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<icelake::ondemand::value>::is_negative() noexcept { if (error()) { return error(); } return first.is_negative(); } -simdjson_inline simdjson_result<bool> simdjson_result<haswell::ondemand::value>::is_integer() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<icelake::ondemand::value>::is_integer() noexcept { if (error()) { return error(); } return first.is_integer(); } -simdjson_inline simdjson_result<haswell::number_type> simdjson_result<haswell::ondemand::value>::get_number_type() noexcept { +simdjson_inline simdjson_result<icelake::number_type> simdjson_result<icelake::ondemand::value>::get_number_type() noexcept { if (error()) { return error(); } return first.get_number_type(); } -simdjson_inline simdjson_result<haswell::ondemand::number> simdjson_result<haswell::ondemand::value>::get_number() noexcept { +simdjson_inline simdjson_result<icelake::ondemand::number> simdjson_result<icelake::ondemand::value>::get_number() noexcept { if (error()) { return error(); } return first.get_number(); } #if SIMDJSON_EXCEPTIONS template <class T> -simdjson_inline simdjson_result<haswell::ondemand::value>::operator T() noexcept(false) { +simdjson_inline simdjson_result<icelake::ondemand::value>::operator T() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first.get<T>(); } -simdjson_inline simdjson_result<haswell::ondemand::value>::operator haswell::ondemand::array() noexcept(false) { +simdjson_inline simdjson_result<icelake::ondemand::value>::operator icelake::ondemand::array() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<haswell::ondemand::value>::operator haswell::ondemand::object() noexcept(false) { +simdjson_inline simdjson_result<icelake::ondemand::value>::operator icelake::ondemand::object() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<haswell::ondemand::value>::operator uint64_t() noexcept(false) { +simdjson_inline simdjson_result<icelake::ondemand::value>::operator uint64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<haswell::ondemand::value>::operator int64_t() noexcept(false) { +simdjson_inline simdjson_result<icelake::ondemand::value>::operator int64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<haswell::ondemand::value>::operator double() noexcept(false) { +simdjson_inline simdjson_result<icelake::ondemand::value>::operator double() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<haswell::ondemand::value>::operator std::string_view() noexcept(false) { +simdjson_inline simdjson_result<icelake::ondemand::value>::operator std::string_view() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<haswell::ondemand::value>::operator haswell::ondemand::raw_json_string() noexcept(false) { +simdjson_inline simdjson_result<icelake::ondemand::value>::operator icelake::ondemand::raw_json_string() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<haswell::ondemand::value>::operator bool() noexcept(false) { +simdjson_inline simdjson_result<icelake::ondemand::value>::operator bool() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } #endif -simdjson_inline simdjson_result<std::string_view> simdjson_result<haswell::ondemand::value>::raw_json_token() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<icelake::ondemand::value>::raw_json_token() noexcept { if (error()) { return error(); } return first.raw_json_token(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<haswell::ondemand::value>::raw_json() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<icelake::ondemand::value>::raw_json() noexcept { if (error()) { return error(); } return first.raw_json(); } -simdjson_inline simdjson_result<const char *> simdjson_result<haswell::ondemand::value>::current_location() noexcept { +simdjson_inline simdjson_result<const char *> simdjson_result<icelake::ondemand::value>::current_location() noexcept { if (error()) { return error(); } return first.current_location(); } -simdjson_inline simdjson_result<int32_t> simdjson_result<haswell::ondemand::value>::current_depth() const noexcept { +simdjson_inline simdjson_result<int32_t> simdjson_result<icelake::ondemand::value>::current_depth() const noexcept { if (error()) { return error(); } return first.current_depth(); } -simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::value>::at_pointer( +simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::value>::at_pointer( std::string_view json_pointer) noexcept { if (error()) { return error(); @@ -70994,7 +109623,7 @@ simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswel return first.at_pointer(json_pointer); } -simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::value>::at_path( +simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::value>::at_path( std::string_view json_path) noexcept { if (error()) { return error(); @@ -71002,7 +109631,7 @@ simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswel return first.at_path(json_path); } -inline simdjson_result<std::vector<haswell::ondemand::value>> simdjson_result<haswell::ondemand::value>::at_path_with_wildcard( +inline simdjson_result<std::vector<icelake::ondemand::value>> simdjson_result<icelake::ondemand::value>::at_path_with_wildcard( std::string_view json_path) noexcept { if (error()) { return error(); @@ -71013,9 +109642,9 @@ inline simdjson_result<std::vector<haswell::ondemand::value>> simdjson_result<ha } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_INL_H -/* end file simdjson/generic/ondemand/value-inl.h for haswell */ -/* including simdjson/generic/ondemand/document-inl.h for haswell: #include "simdjson/generic/ondemand/document-inl.h" */ -/* begin file simdjson/generic/ondemand/document-inl.h for haswell */ +/* end file simdjson/generic/ondemand/value-inl.h for icelake */ +/* including simdjson/generic/ondemand/document-inl.h for icelake: #include "simdjson/generic/ondemand/document-inl.h" */ +/* begin file simdjson/generic/ondemand/document-inl.h for icelake */ #ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -71035,7 +109664,7 @@ inline simdjson_result<std::vector<haswell::ondemand::value>> simdjson_result<ha /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace haswell { +namespace icelake { namespace ondemand { simdjson_inline document::document(ondemand::json_iterator &&_iter) noexcept @@ -71429,283 +110058,283 @@ simdjson_warn_unused simdjson_inline error_code document::extract_into(T& out) & #endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION } // namespace ondemand -} // namespace haswell +} // namespace icelake } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<haswell::ondemand::document>::simdjson_result( - haswell::ondemand::document &&value +simdjson_inline simdjson_result<icelake::ondemand::document>::simdjson_result( + icelake::ondemand::document &&value ) noexcept : - implementation_simdjson_result_base<haswell::ondemand::document>( - std::forward<haswell::ondemand::document>(value) + implementation_simdjson_result_base<icelake::ondemand::document>( + std::forward<icelake::ondemand::document>(value) ) { } -simdjson_inline simdjson_result<haswell::ondemand::document>::simdjson_result( +simdjson_inline simdjson_result<icelake::ondemand::document>::simdjson_result( error_code error ) noexcept : - implementation_simdjson_result_base<haswell::ondemand::document>( + implementation_simdjson_result_base<icelake::ondemand::document>( error ) { } -simdjson_inline simdjson_result<size_t> simdjson_result<haswell::ondemand::document>::count_elements() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<icelake::ondemand::document>::count_elements() & noexcept { if (error()) { return error(); } return first.count_elements(); } -simdjson_inline simdjson_result<size_t> simdjson_result<haswell::ondemand::document>::count_fields() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<icelake::ondemand::document>::count_fields() & noexcept { if (error()) { return error(); } return first.count_fields(); } -simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::document>::at(size_t index) & noexcept { +simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::document>::at(size_t index) & noexcept { if (error()) { return error(); } return first.at(index); } -simdjson_inline error_code simdjson_result<haswell::ondemand::document>::rewind() noexcept { +simdjson_inline error_code simdjson_result<icelake::ondemand::document>::rewind() noexcept { if (error()) { return error(); } first.rewind(); return SUCCESS; } -simdjson_inline simdjson_result<haswell::ondemand::array_iterator> simdjson_result<haswell::ondemand::document>::begin() & noexcept { +simdjson_inline simdjson_result<icelake::ondemand::array_iterator> simdjson_result<icelake::ondemand::document>::begin() & noexcept { if (error()) { return error(); } return first.begin(); } -simdjson_inline simdjson_result<haswell::ondemand::array_iterator> simdjson_result<haswell::ondemand::document>::end() & noexcept { +simdjson_inline simdjson_result<icelake::ondemand::array_iterator> simdjson_result<icelake::ondemand::document>::end() & noexcept { return {}; } -simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::document>::find_field_unordered(std::string_view key) & noexcept { +simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::document>::find_field_unordered(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::document>::find_field_unordered(const char *key) & noexcept { +simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::document>::find_field_unordered(const char *key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::document>::operator[](std::string_view key) & noexcept { +simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::document>::operator[](std::string_view key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::document>::operator[](const char *key) & noexcept { +simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::document>::operator[](const char *key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::document>::find_field(std::string_view key) & noexcept { +simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::document>::find_field(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::document>::find_field(const char *key) & noexcept { +simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::document>::find_field(const char *key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<haswell::ondemand::array> simdjson_result<haswell::ondemand::document>::get_array() & noexcept { +simdjson_inline simdjson_result<icelake::ondemand::array> simdjson_result<icelake::ondemand::document>::get_array() & noexcept { if (error()) { return error(); } return first.get_array(); } -simdjson_inline simdjson_result<haswell::ondemand::object> simdjson_result<haswell::ondemand::document>::get_object() & noexcept { +simdjson_inline simdjson_result<icelake::ondemand::object> simdjson_result<icelake::ondemand::document>::get_object() & noexcept { if (error()) { return error(); } return first.get_object(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<haswell::ondemand::document>::get_uint64() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<icelake::ondemand::document>::get_uint64() noexcept { if (error()) { return error(); } return first.get_uint64(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<haswell::ondemand::document>::get_uint64_in_string() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<icelake::ondemand::document>::get_uint64_in_string() noexcept { if (error()) { return error(); } return first.get_uint64_in_string(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<haswell::ondemand::document>::get_int64() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<icelake::ondemand::document>::get_int64() noexcept { if (error()) { return error(); } return first.get_int64(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<haswell::ondemand::document>::get_int64_in_string() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<icelake::ondemand::document>::get_int64_in_string() noexcept { if (error()) { return error(); } return first.get_int64_in_string(); } -simdjson_inline simdjson_result<double> simdjson_result<haswell::ondemand::document>::get_double() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<icelake::ondemand::document>::get_double() noexcept { if (error()) { return error(); } return first.get_double(); } -simdjson_inline simdjson_result<double> simdjson_result<haswell::ondemand::document>::get_double_in_string() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<icelake::ondemand::document>::get_double_in_string() noexcept { if (error()) { return error(); } return first.get_double_in_string(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<haswell::ondemand::document>::get_string(bool allow_replacement) noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<icelake::ondemand::document>::get_string(bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(allow_replacement); } template <typename string_type> -simdjson_warn_unused simdjson_inline error_code simdjson_result<haswell::ondemand::document>::get_string(string_type& receiver, bool allow_replacement) noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<icelake::ondemand::document>::get_string(string_type& receiver, bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(receiver, allow_replacement); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<haswell::ondemand::document>::get_wobbly_string() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<icelake::ondemand::document>::get_wobbly_string() noexcept { if (error()) { return error(); } return first.get_wobbly_string(); } -simdjson_inline simdjson_result<haswell::ondemand::raw_json_string> simdjson_result<haswell::ondemand::document>::get_raw_json_string() noexcept { +simdjson_inline simdjson_result<icelake::ondemand::raw_json_string> simdjson_result<icelake::ondemand::document>::get_raw_json_string() noexcept { if (error()) { return error(); } return first.get_raw_json_string(); } -simdjson_inline simdjson_result<bool> simdjson_result<haswell::ondemand::document>::get_bool() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<icelake::ondemand::document>::get_bool() noexcept { if (error()) { return error(); } return first.get_bool(); } -simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::document>::get_value() noexcept { +simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::document>::get_value() noexcept { if (error()) { return error(); } return first.get_value(); } -simdjson_inline simdjson_result<bool> simdjson_result<haswell::ondemand::document>::is_null() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<icelake::ondemand::document>::is_null() noexcept { if (error()) { return error(); } return first.is_null(); } template<typename T> -simdjson_inline simdjson_result<T> simdjson_result<haswell::ondemand::document>::get() & noexcept { +simdjson_inline simdjson_result<T> simdjson_result<icelake::ondemand::document>::get() & noexcept { if (error()) { return error(); } return first.get<T>(); } template<typename T> -simdjson_deprecated simdjson_inline simdjson_result<T> simdjson_result<haswell::ondemand::document>::get() && noexcept { +simdjson_deprecated simdjson_inline simdjson_result<T> simdjson_result<icelake::ondemand::document>::get() && noexcept { if (error()) { return error(); } - return std::forward<haswell::ondemand::document>(first).get<T>(); + return std::forward<icelake::ondemand::document>(first).get<T>(); } template<typename T> -simdjson_warn_unused simdjson_inline error_code simdjson_result<haswell::ondemand::document>::get(T &out) & noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<icelake::ondemand::document>::get(T &out) & noexcept { if (error()) { return error(); } return first.get<T>(out); } template<typename T> -simdjson_warn_unused simdjson_inline error_code simdjson_result<haswell::ondemand::document>::get(T &out) && noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<icelake::ondemand::document>::get(T &out) && noexcept { if (error()) { return error(); } - return std::forward<haswell::ondemand::document>(first).get<T>(out); + return std::forward<icelake::ondemand::document>(first).get<T>(out); } -template<> simdjson_inline simdjson_result<haswell::ondemand::document> simdjson_result<haswell::ondemand::document>::get<haswell::ondemand::document>() & noexcept = delete; -template<> simdjson_deprecated simdjson_inline simdjson_result<haswell::ondemand::document> simdjson_result<haswell::ondemand::document>::get<haswell::ondemand::document>() && noexcept { +template<> simdjson_inline simdjson_result<icelake::ondemand::document> simdjson_result<icelake::ondemand::document>::get<icelake::ondemand::document>() & noexcept = delete; +template<> simdjson_deprecated simdjson_inline simdjson_result<icelake::ondemand::document> simdjson_result<icelake::ondemand::document>::get<icelake::ondemand::document>() && noexcept { if (error()) { return error(); } - return std::forward<haswell::ondemand::document>(first); + return std::forward<icelake::ondemand::document>(first); } -template<> simdjson_warn_unused simdjson_inline error_code simdjson_result<haswell::ondemand::document>::get<haswell::ondemand::document>(haswell::ondemand::document &out) & noexcept = delete; -template<> simdjson_warn_unused simdjson_inline error_code simdjson_result<haswell::ondemand::document>::get<haswell::ondemand::document>(haswell::ondemand::document &out) && noexcept { +template<> simdjson_warn_unused simdjson_inline error_code simdjson_result<icelake::ondemand::document>::get<icelake::ondemand::document>(icelake::ondemand::document &out) & noexcept = delete; +template<> simdjson_warn_unused simdjson_inline error_code simdjson_result<icelake::ondemand::document>::get<icelake::ondemand::document>(icelake::ondemand::document &out) && noexcept { if (error()) { return error(); } - out = std::forward<haswell::ondemand::document>(first); + out = std::forward<icelake::ondemand::document>(first); return SUCCESS; } -simdjson_inline simdjson_result<haswell::ondemand::json_type> simdjson_result<haswell::ondemand::document>::type() noexcept { +simdjson_inline simdjson_result<icelake::ondemand::json_type> simdjson_result<icelake::ondemand::document>::type() noexcept { if (error()) { return error(); } return first.type(); } -simdjson_inline simdjson_result<bool> simdjson_result<haswell::ondemand::document>::is_scalar() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<icelake::ondemand::document>::is_scalar() noexcept { if (error()) { return error(); } return first.is_scalar(); } -simdjson_inline simdjson_result<bool> simdjson_result<haswell::ondemand::document>::is_string() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<icelake::ondemand::document>::is_string() noexcept { if (error()) { return error(); } return first.is_string(); } -simdjson_inline bool simdjson_result<haswell::ondemand::document>::is_negative() noexcept { +simdjson_inline bool simdjson_result<icelake::ondemand::document>::is_negative() noexcept { if (error()) { return error(); } return first.is_negative(); } -simdjson_inline simdjson_result<bool> simdjson_result<haswell::ondemand::document>::is_integer() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<icelake::ondemand::document>::is_integer() noexcept { if (error()) { return error(); } return first.is_integer(); } -simdjson_inline simdjson_result<haswell::number_type> simdjson_result<haswell::ondemand::document>::get_number_type() noexcept { +simdjson_inline simdjson_result<icelake::number_type> simdjson_result<icelake::ondemand::document>::get_number_type() noexcept { if (error()) { return error(); } return first.get_number_type(); } -simdjson_inline simdjson_result<haswell::ondemand::number> simdjson_result<haswell::ondemand::document>::get_number() noexcept { +simdjson_inline simdjson_result<icelake::ondemand::number> simdjson_result<icelake::ondemand::document>::get_number() noexcept { if (error()) { return error(); } return first.get_number(); } #if SIMDJSON_EXCEPTIONS -template <class T, typename std::enable_if<std::is_same<T, haswell::ondemand::document>::value == false>::type> -simdjson_inline simdjson_result<haswell::ondemand::document>::operator T() noexcept(false) { +template <class T, typename std::enable_if<std::is_same<T, icelake::ondemand::document>::value == false>::type> +simdjson_inline simdjson_result<icelake::ondemand::document>::operator T() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<haswell::ondemand::document>::operator haswell::ondemand::array() & noexcept(false) { +simdjson_inline simdjson_result<icelake::ondemand::document>::operator icelake::ondemand::array() & noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<haswell::ondemand::document>::operator haswell::ondemand::object() & noexcept(false) { +simdjson_inline simdjson_result<icelake::ondemand::document>::operator icelake::ondemand::object() & noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<haswell::ondemand::document>::operator uint64_t() noexcept(false) { +simdjson_inline simdjson_result<icelake::ondemand::document>::operator uint64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<haswell::ondemand::document>::operator int64_t() noexcept(false) { +simdjson_inline simdjson_result<icelake::ondemand::document>::operator int64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<haswell::ondemand::document>::operator double() noexcept(false) { +simdjson_inline simdjson_result<icelake::ondemand::document>::operator double() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<haswell::ondemand::document>::operator std::string_view() noexcept(false) { +simdjson_inline simdjson_result<icelake::ondemand::document>::operator std::string_view() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<haswell::ondemand::document>::operator haswell::ondemand::raw_json_string() noexcept(false) { +simdjson_inline simdjson_result<icelake::ondemand::document>::operator icelake::ondemand::raw_json_string() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<haswell::ondemand::document>::operator bool() noexcept(false) { +simdjson_inline simdjson_result<icelake::ondemand::document>::operator bool() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<haswell::ondemand::document>::operator haswell::ondemand::value() noexcept(false) { +simdjson_inline simdjson_result<icelake::ondemand::document>::operator icelake::ondemand::value() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } #endif -simdjson_inline simdjson_result<const char *> simdjson_result<haswell::ondemand::document>::current_location() noexcept { +simdjson_inline simdjson_result<const char *> simdjson_result<icelake::ondemand::document>::current_location() noexcept { if (error()) { return error(); } return first.current_location(); } -simdjson_inline bool simdjson_result<haswell::ondemand::document>::at_end() const noexcept { +simdjson_inline bool simdjson_result<icelake::ondemand::document>::at_end() const noexcept { if (error()) { return error(); } return first.at_end(); } -simdjson_inline int32_t simdjson_result<haswell::ondemand::document>::current_depth() const noexcept { +simdjson_inline int32_t simdjson_result<icelake::ondemand::document>::current_depth() const noexcept { if (error()) { return error(); } return first.current_depth(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<haswell::ondemand::document>::raw_json_token() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<icelake::ondemand::document>::raw_json_token() noexcept { if (error()) { return error(); } return first.raw_json_token(); } -simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::document>::at_pointer(std::string_view json_pointer) noexcept { +simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::document>::at_pointer(std::string_view json_pointer) noexcept { if (error()) { return error(); } return first.at_pointer(json_pointer); } -simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::document>::at_path(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::document>::at_path(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path(json_path); } -simdjson_inline simdjson_result<std::vector<haswell::ondemand::value>> simdjson_result<haswell::ondemand::document>::at_path_with_wildcard(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<std::vector<icelake::ondemand::value>> simdjson_result<icelake::ondemand::document>::at_path_with_wildcard(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path_with_wildcard(json_path); } @@ -71713,7 +110342,7 @@ simdjson_inline simdjson_result<std::vector<haswell::ondemand::value>> simdjson_ #if SIMDJSON_STATIC_REFLECTION template<constevalutil::fixed_string... FieldNames, typename T> requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) -simdjson_warn_unused simdjson_inline error_code simdjson_result<haswell::ondemand::document>::extract_into(T& out) & noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<icelake::ondemand::document>::extract_into(T& out) & noexcept { if (error()) { return error(); } return first.extract_into<FieldNames...>(out); } @@ -71723,7 +110352,7 @@ simdjson_warn_unused simdjson_inline error_code simdjson_result<haswell::ondeman namespace simdjson { -namespace haswell { +namespace icelake { namespace ondemand { simdjson_inline document_reference::document_reference() noexcept : doc{nullptr} {} @@ -71815,253 +110444,253 @@ simdjson_warn_unused simdjson_inline error_code document_reference::extract_into } #endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION } // namespace ondemand -} // namespace haswell +} // namespace icelake } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<haswell::ondemand::document_reference>::simdjson_result(haswell::ondemand::document_reference value, error_code error) - noexcept : implementation_simdjson_result_base<haswell::ondemand::document_reference>(std::forward<haswell::ondemand::document_reference>(value), error) {} +simdjson_inline simdjson_result<icelake::ondemand::document_reference>::simdjson_result(icelake::ondemand::document_reference value, error_code error) + noexcept : implementation_simdjson_result_base<icelake::ondemand::document_reference>(std::forward<icelake::ondemand::document_reference>(value), error) {} -simdjson_inline simdjson_result<size_t> simdjson_result<haswell::ondemand::document_reference>::count_elements() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<icelake::ondemand::document_reference>::count_elements() & noexcept { if (error()) { return error(); } return first.count_elements(); } -simdjson_inline simdjson_result<size_t> simdjson_result<haswell::ondemand::document_reference>::count_fields() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<icelake::ondemand::document_reference>::count_fields() & noexcept { if (error()) { return error(); } return first.count_fields(); } -simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::document_reference>::at(size_t index) & noexcept { +simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::document_reference>::at(size_t index) & noexcept { if (error()) { return error(); } return first.at(index); } -simdjson_inline error_code simdjson_result<haswell::ondemand::document_reference>::rewind() noexcept { +simdjson_inline error_code simdjson_result<icelake::ondemand::document_reference>::rewind() noexcept { if (error()) { return error(); } first.rewind(); return SUCCESS; } -simdjson_inline simdjson_result<haswell::ondemand::array_iterator> simdjson_result<haswell::ondemand::document_reference>::begin() & noexcept { +simdjson_inline simdjson_result<icelake::ondemand::array_iterator> simdjson_result<icelake::ondemand::document_reference>::begin() & noexcept { if (error()) { return error(); } return first.begin(); } -simdjson_inline simdjson_result<haswell::ondemand::array_iterator> simdjson_result<haswell::ondemand::document_reference>::end() & noexcept { +simdjson_inline simdjson_result<icelake::ondemand::array_iterator> simdjson_result<icelake::ondemand::document_reference>::end() & noexcept { return {}; } -simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::document_reference>::find_field_unordered(std::string_view key) & noexcept { +simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::document_reference>::find_field_unordered(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::document_reference>::find_field_unordered(const char *key) & noexcept { +simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::document_reference>::find_field_unordered(const char *key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::document_reference>::operator[](std::string_view key) & noexcept { +simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::document_reference>::operator[](std::string_view key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::document_reference>::operator[](const char *key) & noexcept { +simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::document_reference>::operator[](const char *key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::document_reference>::find_field(std::string_view key) & noexcept { +simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::document_reference>::find_field(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::document_reference>::find_field(const char *key) & noexcept { +simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::document_reference>::find_field(const char *key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<haswell::ondemand::array> simdjson_result<haswell::ondemand::document_reference>::get_array() & noexcept { +simdjson_inline simdjson_result<icelake::ondemand::array> simdjson_result<icelake::ondemand::document_reference>::get_array() & noexcept { if (error()) { return error(); } return first.get_array(); } -simdjson_inline simdjson_result<haswell::ondemand::object> simdjson_result<haswell::ondemand::document_reference>::get_object() & noexcept { +simdjson_inline simdjson_result<icelake::ondemand::object> simdjson_result<icelake::ondemand::document_reference>::get_object() & noexcept { if (error()) { return error(); } return first.get_object(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<haswell::ondemand::document_reference>::get_uint64() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<icelake::ondemand::document_reference>::get_uint64() noexcept { if (error()) { return error(); } return first.get_uint64(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<haswell::ondemand::document_reference>::get_uint64_in_string() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<icelake::ondemand::document_reference>::get_uint64_in_string() noexcept { if (error()) { return error(); } return first.get_uint64_in_string(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<haswell::ondemand::document_reference>::get_int64() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<icelake::ondemand::document_reference>::get_int64() noexcept { if (error()) { return error(); } return first.get_int64(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<haswell::ondemand::document_reference>::get_int64_in_string() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<icelake::ondemand::document_reference>::get_int64_in_string() noexcept { if (error()) { return error(); } return first.get_int64_in_string(); } -simdjson_inline simdjson_result<double> simdjson_result<haswell::ondemand::document_reference>::get_double() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<icelake::ondemand::document_reference>::get_double() noexcept { if (error()) { return error(); } return first.get_double(); } -simdjson_inline simdjson_result<double> simdjson_result<haswell::ondemand::document_reference>::get_double_in_string() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<icelake::ondemand::document_reference>::get_double_in_string() noexcept { if (error()) { return error(); } return first.get_double_in_string(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<haswell::ondemand::document_reference>::get_string(bool allow_replacement) noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<icelake::ondemand::document_reference>::get_string(bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(allow_replacement); } template <typename string_type> -simdjson_warn_unused simdjson_inline error_code simdjson_result<haswell::ondemand::document_reference>::get_string(string_type& receiver, bool allow_replacement) noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<icelake::ondemand::document_reference>::get_string(string_type& receiver, bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(receiver, allow_replacement); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<haswell::ondemand::document_reference>::get_wobbly_string() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<icelake::ondemand::document_reference>::get_wobbly_string() noexcept { if (error()) { return error(); } return first.get_wobbly_string(); } -simdjson_inline simdjson_result<haswell::ondemand::raw_json_string> simdjson_result<haswell::ondemand::document_reference>::get_raw_json_string() noexcept { +simdjson_inline simdjson_result<icelake::ondemand::raw_json_string> simdjson_result<icelake::ondemand::document_reference>::get_raw_json_string() noexcept { if (error()) { return error(); } return first.get_raw_json_string(); } -simdjson_inline simdjson_result<bool> simdjson_result<haswell::ondemand::document_reference>::get_bool() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<icelake::ondemand::document_reference>::get_bool() noexcept { if (error()) { return error(); } return first.get_bool(); } -simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::document_reference>::get_value() noexcept { +simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::document_reference>::get_value() noexcept { if (error()) { return error(); } return first.get_value(); } -simdjson_inline simdjson_result<bool> simdjson_result<haswell::ondemand::document_reference>::is_null() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<icelake::ondemand::document_reference>::is_null() noexcept { if (error()) { return error(); } return first.is_null(); } template<typename T> -simdjson_inline simdjson_result<T> simdjson_result<haswell::ondemand::document_reference>::get() & noexcept { +simdjson_inline simdjson_result<T> simdjson_result<icelake::ondemand::document_reference>::get() & noexcept { if (error()) { return error(); } return first.get<T>(); } template<typename T> -simdjson_inline simdjson_result<T> simdjson_result<haswell::ondemand::document_reference>::get() && noexcept { +simdjson_inline simdjson_result<T> simdjson_result<icelake::ondemand::document_reference>::get() && noexcept { if (error()) { return error(); } - return std::forward<haswell::ondemand::document_reference>(first).get<T>(); + return std::forward<icelake::ondemand::document_reference>(first).get<T>(); } template <class T> -simdjson_warn_unused simdjson_inline error_code simdjson_result<haswell::ondemand::document_reference>::get(T &out) & noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<icelake::ondemand::document_reference>::get(T &out) & noexcept { if (error()) { return error(); } return first.get<T>(out); } template <class T> -simdjson_warn_unused simdjson_inline error_code simdjson_result<haswell::ondemand::document_reference>::get(T &out) && noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<icelake::ondemand::document_reference>::get(T &out) && noexcept { if (error()) { return error(); } - return std::forward<haswell::ondemand::document_reference>(first).get<T>(out); + return std::forward<icelake::ondemand::document_reference>(first).get<T>(out); } -simdjson_inline simdjson_result<haswell::ondemand::json_type> simdjson_result<haswell::ondemand::document_reference>::type() noexcept { +simdjson_inline simdjson_result<icelake::ondemand::json_type> simdjson_result<icelake::ondemand::document_reference>::type() noexcept { if (error()) { return error(); } return first.type(); } -simdjson_inline simdjson_result<bool> simdjson_result<haswell::ondemand::document_reference>::is_scalar() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<icelake::ondemand::document_reference>::is_scalar() noexcept { if (error()) { return error(); } return first.is_scalar(); } -simdjson_inline simdjson_result<bool> simdjson_result<haswell::ondemand::document_reference>::is_string() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<icelake::ondemand::document_reference>::is_string() noexcept { if (error()) { return error(); } return first.is_string(); } template <> -simdjson_warn_unused simdjson_inline error_code simdjson_result<haswell::ondemand::document_reference>::get(haswell::ondemand::document_reference &out) & noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<icelake::ondemand::document_reference>::get(icelake::ondemand::document_reference &out) & noexcept { if (error()) { return error(); } out = first; return SUCCESS; } template <> -simdjson_warn_unused simdjson_inline error_code simdjson_result<haswell::ondemand::document_reference>::get(haswell::ondemand::document_reference &out) && noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<icelake::ondemand::document_reference>::get(icelake::ondemand::document_reference &out) && noexcept { if (error()) { return error(); } out = first; return SUCCESS; } -simdjson_inline simdjson_result<bool> simdjson_result<haswell::ondemand::document_reference>::is_negative() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<icelake::ondemand::document_reference>::is_negative() noexcept { if (error()) { return error(); } return first.is_negative(); } -simdjson_inline simdjson_result<bool> simdjson_result<haswell::ondemand::document_reference>::is_integer() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<icelake::ondemand::document_reference>::is_integer() noexcept { if (error()) { return error(); } return first.is_integer(); } -simdjson_inline simdjson_result<haswell::number_type> simdjson_result<haswell::ondemand::document_reference>::get_number_type() noexcept { +simdjson_inline simdjson_result<icelake::number_type> simdjson_result<icelake::ondemand::document_reference>::get_number_type() noexcept { if (error()) { return error(); } return first.get_number_type(); } -simdjson_inline simdjson_result<haswell::ondemand::number> simdjson_result<haswell::ondemand::document_reference>::get_number() noexcept { +simdjson_inline simdjson_result<icelake::ondemand::number> simdjson_result<icelake::ondemand::document_reference>::get_number() noexcept { if (error()) { return error(); } return first.get_number(); } #if SIMDJSON_EXCEPTIONS template <class T> -simdjson_inline simdjson_result<haswell::ondemand::document_reference>::operator T() noexcept(false) { - static_assert(std::is_same<T, haswell::ondemand::document_reference>::value == false, "You should not call get<T> when T is a document"); - static_assert(std::is_same<T, haswell::ondemand::document>::value == false, "You should not call get<T> when T is a document"); +simdjson_inline simdjson_result<icelake::ondemand::document_reference>::operator T() noexcept(false) { + static_assert(std::is_same<T, icelake::ondemand::document_reference>::value == false, "You should not call get<T> when T is a document"); + static_assert(std::is_same<T, icelake::ondemand::document>::value == false, "You should not call get<T> when T is a document"); if (error()) { throw simdjson_error(error()); } return first.get<T>(); } -simdjson_inline simdjson_result<haswell::ondemand::document_reference>::operator haswell::ondemand::array() & noexcept(false) { +simdjson_inline simdjson_result<icelake::ondemand::document_reference>::operator icelake::ondemand::array() & noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<haswell::ondemand::document_reference>::operator haswell::ondemand::object() & noexcept(false) { +simdjson_inline simdjson_result<icelake::ondemand::document_reference>::operator icelake::ondemand::object() & noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<haswell::ondemand::document_reference>::operator uint64_t() noexcept(false) { +simdjson_inline simdjson_result<icelake::ondemand::document_reference>::operator uint64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<haswell::ondemand::document_reference>::operator int64_t() noexcept(false) { +simdjson_inline simdjson_result<icelake::ondemand::document_reference>::operator int64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<haswell::ondemand::document_reference>::operator double() noexcept(false) { +simdjson_inline simdjson_result<icelake::ondemand::document_reference>::operator double() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<haswell::ondemand::document_reference>::operator std::string_view() noexcept(false) { +simdjson_inline simdjson_result<icelake::ondemand::document_reference>::operator std::string_view() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<haswell::ondemand::document_reference>::operator haswell::ondemand::raw_json_string() noexcept(false) { +simdjson_inline simdjson_result<icelake::ondemand::document_reference>::operator icelake::ondemand::raw_json_string() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<haswell::ondemand::document_reference>::operator bool() noexcept(false) { +simdjson_inline simdjson_result<icelake::ondemand::document_reference>::operator bool() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<haswell::ondemand::document_reference>::operator haswell::ondemand::value() noexcept(false) { +simdjson_inline simdjson_result<icelake::ondemand::document_reference>::operator icelake::ondemand::value() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } #endif -simdjson_inline simdjson_result<const char *> simdjson_result<haswell::ondemand::document_reference>::current_location() noexcept { +simdjson_inline simdjson_result<const char *> simdjson_result<icelake::ondemand::document_reference>::current_location() noexcept { if (error()) { return error(); } return first.current_location(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<haswell::ondemand::document_reference>::raw_json_token() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<icelake::ondemand::document_reference>::raw_json_token() noexcept { if (error()) { return error(); } return first.raw_json_token(); } -simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::document_reference>::at_pointer(std::string_view json_pointer) noexcept { +simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::document_reference>::at_pointer(std::string_view json_pointer) noexcept { if (error()) { return error(); } return first.at_pointer(json_pointer); } -simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::document_reference>::at_path(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::document_reference>::at_path(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path(json_path); } -simdjson_inline simdjson_result<std::vector<haswell::ondemand::value>> simdjson_result<haswell::ondemand::document_reference>::at_path_with_wildcard(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<std::vector<icelake::ondemand::value>> simdjson_result<icelake::ondemand::document_reference>::at_path_with_wildcard(std::string_view json_path) noexcept { if (error()) { return error(); } @@ -72070,7 +110699,7 @@ simdjson_inline simdjson_result<std::vector<haswell::ondemand::value>> simdjson_ #if SIMDJSON_STATIC_REFLECTION template<constevalutil::fixed_string... FieldNames, typename T> requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) -simdjson_warn_unused simdjson_inline error_code simdjson_result<haswell::ondemand::document_reference>::extract_into(T& out) & noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<icelake::ondemand::document_reference>::extract_into(T& out) & noexcept { if (error()) { return error(); } return first.extract_into<FieldNames...>(out); } @@ -72078,9 +110707,9 @@ simdjson_warn_unused simdjson_inline error_code simdjson_result<haswell::ondeman } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H -/* end file simdjson/generic/ondemand/document-inl.h for haswell */ -/* including simdjson/generic/ondemand/document_stream-inl.h for haswell: #include "simdjson/generic/ondemand/document_stream-inl.h" */ -/* begin file simdjson/generic/ondemand/document_stream-inl.h for haswell */ +/* end file simdjson/generic/ondemand/document-inl.h for icelake */ +/* including simdjson/generic/ondemand/document_stream-inl.h for icelake: #include "simdjson/generic/ondemand/document_stream-inl.h" */ +/* begin file simdjson/generic/ondemand/document_stream-inl.h for icelake */ #ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -72095,7 +110724,7 @@ simdjson_warn_unused simdjson_inline error_code simdjson_result<haswell::ondeman #include <stdexcept> namespace simdjson { -namespace haswell { +namespace icelake { namespace ondemand { #ifdef SIMDJSON_THREADS_ENABLED @@ -72502,22 +111131,22 @@ inline void document_stream::start_stage1_thread() noexcept { #endif // SIMDJSON_THREADS_ENABLED } // namespace ondemand -} // namespace haswell +} // namespace icelake } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<haswell::ondemand::document_stream>::simdjson_result( +simdjson_inline simdjson_result<icelake::ondemand::document_stream>::simdjson_result( error_code error ) noexcept : - implementation_simdjson_result_base<haswell::ondemand::document_stream>(error) + implementation_simdjson_result_base<icelake::ondemand::document_stream>(error) { } -simdjson_inline simdjson_result<haswell::ondemand::document_stream>::simdjson_result( - haswell::ondemand::document_stream &&value +simdjson_inline simdjson_result<icelake::ondemand::document_stream>::simdjson_result( + icelake::ondemand::document_stream &&value ) noexcept : - implementation_simdjson_result_base<haswell::ondemand::document_stream>( - std::forward<haswell::ondemand::document_stream>(value) + implementation_simdjson_result_base<icelake::ondemand::document_stream>( + std::forward<icelake::ondemand::document_stream>(value) ) { } @@ -72525,9 +111154,9 @@ simdjson_inline simdjson_result<haswell::ondemand::document_stream>::simdjson_re } #endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_INL_H -/* end file simdjson/generic/ondemand/document_stream-inl.h for haswell */ -/* including simdjson/generic/ondemand/field-inl.h for haswell: #include "simdjson/generic/ondemand/field-inl.h" */ -/* begin file simdjson/generic/ondemand/field-inl.h for haswell */ +/* end file simdjson/generic/ondemand/document_stream-inl.h for icelake */ +/* including simdjson/generic/ondemand/field-inl.h for icelake: #include "simdjson/generic/ondemand/field-inl.h" */ +/* begin file simdjson/generic/ondemand/field-inl.h for icelake */ #ifndef SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -72539,7 +111168,7 @@ simdjson_inline simdjson_result<haswell::ondemand::document_stream>::simdjson_re /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace haswell { +namespace icelake { namespace ondemand { // clang 6 does not think the default constructor can be noexcept, so we make it explicit @@ -72603,53 +111232,53 @@ simdjson_inline value field::value() && noexcept { } } // namespace ondemand -} // namespace haswell +} // namespace icelake } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<haswell::ondemand::field>::simdjson_result( - haswell::ondemand::field &&value +simdjson_inline simdjson_result<icelake::ondemand::field>::simdjson_result( + icelake::ondemand::field &&value ) noexcept : - implementation_simdjson_result_base<haswell::ondemand::field>( - std::forward<haswell::ondemand::field>(value) + implementation_simdjson_result_base<icelake::ondemand::field>( + std::forward<icelake::ondemand::field>(value) ) { } -simdjson_inline simdjson_result<haswell::ondemand::field>::simdjson_result( +simdjson_inline simdjson_result<icelake::ondemand::field>::simdjson_result( error_code error ) noexcept : - implementation_simdjson_result_base<haswell::ondemand::field>(error) + implementation_simdjson_result_base<icelake::ondemand::field>(error) { } -simdjson_inline simdjson_result<haswell::ondemand::raw_json_string> simdjson_result<haswell::ondemand::field>::key() noexcept { +simdjson_inline simdjson_result<icelake::ondemand::raw_json_string> simdjson_result<icelake::ondemand::field>::key() noexcept { if (error()) { return error(); } return first.key(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<haswell::ondemand::field>::key_raw_json_token() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<icelake::ondemand::field>::key_raw_json_token() noexcept { if (error()) { return error(); } return first.key_raw_json_token(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<haswell::ondemand::field>::escaped_key() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<icelake::ondemand::field>::escaped_key() noexcept { if (error()) { return error(); } return first.escaped_key(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<haswell::ondemand::field>::unescaped_key(bool allow_replacement) noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<icelake::ondemand::field>::unescaped_key(bool allow_replacement) noexcept { if (error()) { return error(); } return first.unescaped_key(allow_replacement); } template<typename string_type> -simdjson_warn_unused simdjson_inline error_code simdjson_result<haswell::ondemand::field>::unescaped_key(string_type &receiver, bool allow_replacement) noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<icelake::ondemand::field>::unescaped_key(string_type &receiver, bool allow_replacement) noexcept { if (error()) { return error(); } return first.unescaped_key(receiver, allow_replacement); } -simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::field>::value() noexcept { +simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::field>::value() noexcept { if (error()) { return error(); } return std::move(first.value()); } @@ -72657,9 +111286,9 @@ simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswel } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H -/* end file simdjson/generic/ondemand/field-inl.h for haswell */ -/* including simdjson/generic/ondemand/json_iterator-inl.h for haswell: #include "simdjson/generic/ondemand/json_iterator-inl.h" */ -/* begin file simdjson/generic/ondemand/json_iterator-inl.h for haswell */ +/* end file simdjson/generic/ondemand/field-inl.h for icelake */ +/* including simdjson/generic/ondemand/json_iterator-inl.h for icelake: #include "simdjson/generic/ondemand/json_iterator-inl.h" */ +/* begin file simdjson/generic/ondemand/json_iterator-inl.h for icelake */ #ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -72675,7 +111304,7 @@ simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswel /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace haswell { +namespace icelake { namespace ondemand { simdjson_inline json_iterator::json_iterator(json_iterator &&other) noexcept @@ -72877,11 +111506,10 @@ simdjson_inline void json_iterator::assert_more_tokens(uint32_t required_tokens) } simdjson_inline void json_iterator::assert_valid_position(token_position position) const noexcept { + (void)position; // Suppress unused parameter warning #ifndef SIMDJSON_CLANG_VISUAL_STUDIO SIMDJSON_ASSUME( position >= &parser->implementation->structural_indexes[0] ); SIMDJSON_ASSUME( position < &parser->implementation->structural_indexes[parser->implementation->n_structural_indexes] ); -#else - (void)position; // Suppress unused parameter warning #endif } @@ -73020,7 +111648,11 @@ simdjson_inline token_position json_iterator::position() const noexcept { simdjson_inline simdjson_result<std::string_view> json_iterator::unescape(raw_json_string in, bool allow_replacement) noexcept { #if SIMDJSON_DEVELOPMENT_CHECKS auto result = parser->unescape(in, _string_buf_loc, allow_replacement); +#if !defined(SIMDJSON_VISUAL_STUDIO) && !defined(SIMDJSON_CLANG_VISUAL_STUDIO) + // Under Visual Studio, the next SIMDJSON_ASSUME fails with: the argument + // has side effects that will be discarded. SIMDJSON_ASSUME(!parser->string_buffer_overflow(_string_buf_loc)); +#endif // !defined(SIMDJSON_VISUAL_STUDIO) && !defined(SIMDJSON_CLANG_VISUAL_STUDIO) return result; #else return parser->unescape(in, _string_buf_loc, allow_replacement); @@ -73030,7 +111662,11 @@ simdjson_inline simdjson_result<std::string_view> json_iterator::unescape(raw_js simdjson_inline simdjson_result<std::string_view> json_iterator::unescape_wobbly(raw_json_string in) noexcept { #if SIMDJSON_DEVELOPMENT_CHECKS auto result = parser->unescape_wobbly(in, _string_buf_loc); +#if !defined(SIMDJSON_VISUAL_STUDIO) && !defined(SIMDJSON_CLANG_VISUAL_STUDIO) + // Under Visual Studio, the next SIMDJSON_ASSUME fails with: the argument + // has side effects that will be discarded. SIMDJSON_ASSUME(!parser->string_buffer_overflow(_string_buf_loc)); +#endif // !defined(SIMDJSON_VISUAL_STUDIO) && !defined(SIMDJSON_CLANG_VISUAL_STUDIO) return result; #else return parser->unescape_wobbly(in, _string_buf_loc); @@ -73093,22 +111729,22 @@ simdjson_warn_unused simdjson_inline bool json_iterator::copy_to_buffer(const ui } } // namespace ondemand -} // namespace haswell +} // namespace icelake } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<haswell::ondemand::json_iterator>::simdjson_result(haswell::ondemand::json_iterator &&value) noexcept - : implementation_simdjson_result_base<haswell::ondemand::json_iterator>(std::forward<haswell::ondemand::json_iterator>(value)) {} -simdjson_inline simdjson_result<haswell::ondemand::json_iterator>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<haswell::ondemand::json_iterator>(error) {} +simdjson_inline simdjson_result<icelake::ondemand::json_iterator>::simdjson_result(icelake::ondemand::json_iterator &&value) noexcept + : implementation_simdjson_result_base<icelake::ondemand::json_iterator>(std::forward<icelake::ondemand::json_iterator>(value)) {} +simdjson_inline simdjson_result<icelake::ondemand::json_iterator>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<icelake::ondemand::json_iterator>(error) {} } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_INL_H -/* end file simdjson/generic/ondemand/json_iterator-inl.h for haswell */ -/* including simdjson/generic/ondemand/json_type-inl.h for haswell: #include "simdjson/generic/ondemand/json_type-inl.h" */ -/* begin file simdjson/generic/ondemand/json_type-inl.h for haswell */ +/* end file simdjson/generic/ondemand/json_iterator-inl.h for icelake */ +/* including simdjson/generic/ondemand/json_type-inl.h for icelake: #include "simdjson/generic/ondemand/json_type-inl.h" */ +/* begin file simdjson/generic/ondemand/json_type-inl.h for icelake */ #ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -73119,7 +111755,7 @@ simdjson_inline simdjson_result<haswell::ondemand::json_iterator>::simdjson_resu /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace haswell { +namespace icelake { namespace ondemand { inline std::ostream& operator<<(std::ostream& out, json_type type) noexcept { @@ -73213,22 +111849,22 @@ simdjson_inline void number::skip_double() noexcept { } } // namespace ondemand -} // namespace haswell +} // namespace icelake } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<haswell::ondemand::json_type>::simdjson_result(haswell::ondemand::json_type &&value) noexcept - : implementation_simdjson_result_base<haswell::ondemand::json_type>(std::forward<haswell::ondemand::json_type>(value)) {} -simdjson_inline simdjson_result<haswell::ondemand::json_type>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<haswell::ondemand::json_type>(error) {} +simdjson_inline simdjson_result<icelake::ondemand::json_type>::simdjson_result(icelake::ondemand::json_type &&value) noexcept + : implementation_simdjson_result_base<icelake::ondemand::json_type>(std::forward<icelake::ondemand::json_type>(value)) {} +simdjson_inline simdjson_result<icelake::ondemand::json_type>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<icelake::ondemand::json_type>(error) {} } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_INL_H -/* end file simdjson/generic/ondemand/json_type-inl.h for haswell */ -/* including simdjson/generic/ondemand/logger-inl.h for haswell: #include "simdjson/generic/ondemand/logger-inl.h" */ -/* begin file simdjson/generic/ondemand/logger-inl.h for haswell */ +/* end file simdjson/generic/ondemand/json_type-inl.h for icelake */ +/* including simdjson/generic/ondemand/logger-inl.h for icelake: #include "simdjson/generic/ondemand/logger-inl.h" */ +/* begin file simdjson/generic/ondemand/logger-inl.h for icelake */ #ifndef SIMDJSON_GENERIC_ONDEMAND_LOGGER_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -73243,7 +111879,7 @@ simdjson_inline simdjson_result<haswell::ondemand::json_type>::simdjson_result(e #include <cstring> namespace simdjson { -namespace haswell { +namespace icelake { namespace ondemand { namespace logger { @@ -73450,13 +112086,13 @@ inline void log_line(const json_iterator &iter, token_position index, depth_t de } // namespace logger } // namespace ondemand -} // namespace haswell +} // namespace icelake } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_LOGGER_INL_H -/* end file simdjson/generic/ondemand/logger-inl.h for haswell */ -/* including simdjson/generic/ondemand/object-inl.h for haswell: #include "simdjson/generic/ondemand/object-inl.h" */ -/* begin file simdjson/generic/ondemand/object-inl.h for haswell */ +/* end file simdjson/generic/ondemand/logger-inl.h for icelake */ +/* including simdjson/generic/ondemand/object-inl.h for icelake: #include "simdjson/generic/ondemand/object-inl.h" */ +/* begin file simdjson/generic/ondemand/object-inl.h for icelake */ #ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -73476,7 +112112,7 @@ inline void log_line(const json_iterator &iter, token_position index, depth_t de /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace haswell { +namespace icelake { namespace ondemand { simdjson_inline simdjson_result<value> object::find_field_unordered(const std::string_view key) & noexcept { @@ -73750,55 +112386,55 @@ simdjson_warn_unused simdjson_inline error_code object::extract_into(T& out) & n #endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION } // namespace ondemand -} // namespace haswell +} // namespace icelake } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<haswell::ondemand::object>::simdjson_result(haswell::ondemand::object &&value) noexcept - : implementation_simdjson_result_base<haswell::ondemand::object>(std::forward<haswell::ondemand::object>(value)) {} -simdjson_inline simdjson_result<haswell::ondemand::object>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<haswell::ondemand::object>(error) {} +simdjson_inline simdjson_result<icelake::ondemand::object>::simdjson_result(icelake::ondemand::object &&value) noexcept + : implementation_simdjson_result_base<icelake::ondemand::object>(std::forward<icelake::ondemand::object>(value)) {} +simdjson_inline simdjson_result<icelake::ondemand::object>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<icelake::ondemand::object>(error) {} -simdjson_inline simdjson_result<haswell::ondemand::object_iterator> simdjson_result<haswell::ondemand::object>::begin() noexcept { +simdjson_inline simdjson_result<icelake::ondemand::object_iterator> simdjson_result<icelake::ondemand::object>::begin() noexcept { if (error()) { return error(); } return first.begin(); } -simdjson_inline simdjson_result<haswell::ondemand::object_iterator> simdjson_result<haswell::ondemand::object>::end() noexcept { +simdjson_inline simdjson_result<icelake::ondemand::object_iterator> simdjson_result<icelake::ondemand::object>::end() noexcept { if (error()) { return error(); } return first.end(); } -simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::object>::find_field_unordered(std::string_view key) & noexcept { +simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::object>::find_field_unordered(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::object>::find_field_unordered(std::string_view key) && noexcept { +simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::object>::find_field_unordered(std::string_view key) && noexcept { if (error()) { return error(); } - return std::forward<haswell::ondemand::object>(first).find_field_unordered(key); + return std::forward<icelake::ondemand::object>(first).find_field_unordered(key); } -simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::object>::operator[](std::string_view key) & noexcept { +simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::object>::operator[](std::string_view key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::object>::operator[](std::string_view key) && noexcept { +simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::object>::operator[](std::string_view key) && noexcept { if (error()) { return error(); } - return std::forward<haswell::ondemand::object>(first)[key]; + return std::forward<icelake::ondemand::object>(first)[key]; } -simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::object>::find_field(std::string_view key) & noexcept { +simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::object>::find_field(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::object>::find_field(std::string_view key) && noexcept { +simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::object>::find_field(std::string_view key) && noexcept { if (error()) { return error(); } - return std::forward<haswell::ondemand::object>(first).find_field(key); + return std::forward<icelake::ondemand::object>(first).find_field(key); } -simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::object>::at_pointer(std::string_view json_pointer) noexcept { +simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::object>::at_pointer(std::string_view json_pointer) noexcept { if (error()) { return error(); } return first.at_pointer(json_pointer); } -simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswell::ondemand::object>::at_path( +simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::object>::at_path( std::string_view json_path) noexcept { if (error()) { return error(); @@ -73806,27 +112442,27 @@ simdjson_inline simdjson_result<haswell::ondemand::value> simdjson_result<haswel return first.at_path(json_path); } -simdjson_inline simdjson_result<std::vector<haswell::ondemand::value>> simdjson_result<haswell::ondemand::object>::at_path_with_wildcard(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<std::vector<icelake::ondemand::value>> simdjson_result<icelake::ondemand::object>::at_path_with_wildcard(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path_with_wildcard(json_path); } -inline simdjson_result<bool> simdjson_result<haswell::ondemand::object>::reset() noexcept { +inline simdjson_result<bool> simdjson_result<icelake::ondemand::object>::reset() noexcept { if (error()) { return error(); } return first.reset(); } -inline simdjson_result<bool> simdjson_result<haswell::ondemand::object>::is_empty() noexcept { +inline simdjson_result<bool> simdjson_result<icelake::ondemand::object>::is_empty() noexcept { if (error()) { return error(); } return first.is_empty(); } -simdjson_inline simdjson_result<size_t> simdjson_result<haswell::ondemand::object>::count_fields() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<icelake::ondemand::object>::count_fields() & noexcept { if (error()) { return error(); } return first.count_fields(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<haswell::ondemand::object>::raw_json() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<icelake::ondemand::object>::raw_json() noexcept { if (error()) { return error(); } return first.raw_json(); } @@ -73834,9 +112470,9 @@ simdjson_inline simdjson_result<std::string_view> simdjson_result<haswell::onde } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_INL_H -/* end file simdjson/generic/ondemand/object-inl.h for haswell */ -/* including simdjson/generic/ondemand/object_iterator-inl.h for haswell: #include "simdjson/generic/ondemand/object_iterator-inl.h" */ -/* begin file simdjson/generic/ondemand/object_iterator-inl.h for haswell */ +/* end file simdjson/generic/ondemand/object-inl.h for icelake */ +/* including simdjson/generic/ondemand/object_iterator-inl.h for icelake: #include "simdjson/generic/ondemand/object_iterator-inl.h" */ +/* begin file simdjson/generic/ondemand/object_iterator-inl.h for icelake */ #ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -73848,7 +112484,7 @@ simdjson_inline simdjson_result<std::string_view> simdjson_result<haswell::onde /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace haswell { +namespace icelake { namespace ondemand { // @@ -73860,6 +112496,11 @@ simdjson_inline object_iterator::object_iterator(const value_iterator &_iter) no {} simdjson_inline simdjson_result<field> object_iterator::operator*() noexcept { +#if SIMDJSON_DEVELOPMENT_CHECKS + // We must call * once per iteration. + SIMDJSON_ASSUME(!has_been_referenced); + has_been_referenced = true; +#endif error_code error = iter.error(); if (error) { iter.abandon(); return error; } auto result = field::start(iter); @@ -73878,6 +112519,11 @@ simdjson_inline bool object_iterator::operator!=(const object_iterator &) const SIMDJSON_PUSH_DISABLE_WARNINGS SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING simdjson_inline object_iterator &object_iterator::operator++() noexcept { +#if SIMDJSON_DEVELOPMENT_CHECKS + // Before calling ++, we must have called *. + SIMDJSON_ASSUME(has_been_referenced); + has_been_referenced = false; +#endif // TODO this is a safety rail ... users should exit loops as soon as they receive an error. // Nonetheless, let's see if performance is OK with this if statement--the compiler may give it to us for free. if (!iter.is_open()) { return *this; } // Iterator will be released if there is an error @@ -73933,39 +112579,39 @@ SIMDJSON_POP_DISABLE_WARNINGS // } // namespace ondemand -} // namespace haswell +} // namespace icelake } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<haswell::ondemand::object_iterator>::simdjson_result( - haswell::ondemand::object_iterator &&value +simdjson_inline simdjson_result<icelake::ondemand::object_iterator>::simdjson_result( + icelake::ondemand::object_iterator &&value ) noexcept - : implementation_simdjson_result_base<haswell::ondemand::object_iterator>(std::forward<haswell::ondemand::object_iterator>(value)) + : implementation_simdjson_result_base<icelake::ondemand::object_iterator>(std::forward<icelake::ondemand::object_iterator>(value)) { first.iter.assert_is_valid(); } -simdjson_inline simdjson_result<haswell::ondemand::object_iterator>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<haswell::ondemand::object_iterator>({}, error) +simdjson_inline simdjson_result<icelake::ondemand::object_iterator>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<icelake::ondemand::object_iterator>({}, error) { } -simdjson_inline simdjson_result<haswell::ondemand::field> simdjson_result<haswell::ondemand::object_iterator>::operator*() noexcept { +simdjson_inline simdjson_result<icelake::ondemand::field> simdjson_result<icelake::ondemand::object_iterator>::operator*() noexcept { if (error()) { return error(); } return *first; } // If we're iterating and there is an error, return the error once. -simdjson_inline bool simdjson_result<haswell::ondemand::object_iterator>::operator==(const simdjson_result<haswell::ondemand::object_iterator> &other) const noexcept { +simdjson_inline bool simdjson_result<icelake::ondemand::object_iterator>::operator==(const simdjson_result<icelake::ondemand::object_iterator> &other) const noexcept { if (!first.iter.is_valid()) { return !error(); } return first == other.first; } // If we're iterating and there is an error, return the error once. -simdjson_inline bool simdjson_result<haswell::ondemand::object_iterator>::operator!=(const simdjson_result<haswell::ondemand::object_iterator> &other) const noexcept { +simdjson_inline bool simdjson_result<icelake::ondemand::object_iterator>::operator!=(const simdjson_result<icelake::ondemand::object_iterator> &other) const noexcept { if (!first.iter.is_valid()) { return error(); } return first != other.first; } // Checks for ']' and ',' -simdjson_inline simdjson_result<haswell::ondemand::object_iterator> &simdjson_result<haswell::ondemand::object_iterator>::operator++() noexcept { +simdjson_inline simdjson_result<icelake::ondemand::object_iterator> &simdjson_result<icelake::ondemand::object_iterator>::operator++() noexcept { // Clear the error if there is one, so we don't yield it twice if (error()) { second = SUCCESS; return *this; } ++first; @@ -73975,9 +112621,9 @@ simdjson_inline simdjson_result<haswell::ondemand::object_iterator> &simdjson_re } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_INL_H -/* end file simdjson/generic/ondemand/object_iterator-inl.h for haswell */ -/* including simdjson/generic/ondemand/parser-inl.h for haswell: #include "simdjson/generic/ondemand/parser-inl.h" */ -/* begin file simdjson/generic/ondemand/parser-inl.h for haswell */ +/* end file simdjson/generic/ondemand/object_iterator-inl.h for icelake */ +/* including simdjson/generic/ondemand/parser-inl.h for icelake: #include "simdjson/generic/ondemand/parser-inl.h" */ +/* begin file simdjson/generic/ondemand/parser-inl.h for icelake */ #ifndef SIMDJSON_GENERIC_ONDEMAND_PARSER_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -73994,7 +112640,7 @@ simdjson_inline simdjson_result<haswell::ondemand::object_iterator> &simdjson_re /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace haswell { +namespace icelake { namespace ondemand { simdjson_inline parser::parser(size_t max_capacity) noexcept @@ -74204,22 +112850,22 @@ simdjson_inline simdjson_warn_unused std::unique_ptr<ondemand::parser>& parser:: } // namespace ondemand -} // namespace haswell +} // namespace icelake } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<haswell::ondemand::parser>::simdjson_result(haswell::ondemand::parser &&value) noexcept - : implementation_simdjson_result_base<haswell::ondemand::parser>(std::forward<haswell::ondemand::parser>(value)) {} -simdjson_inline simdjson_result<haswell::ondemand::parser>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<haswell::ondemand::parser>(error) {} +simdjson_inline simdjson_result<icelake::ondemand::parser>::simdjson_result(icelake::ondemand::parser &&value) noexcept + : implementation_simdjson_result_base<icelake::ondemand::parser>(std::forward<icelake::ondemand::parser>(value)) {} +simdjson_inline simdjson_result<icelake::ondemand::parser>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<icelake::ondemand::parser>(error) {} } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_PARSER_INL_H -/* end file simdjson/generic/ondemand/parser-inl.h for haswell */ -/* including simdjson/generic/ondemand/raw_json_string-inl.h for haswell: #include "simdjson/generic/ondemand/raw_json_string-inl.h" */ -/* begin file simdjson/generic/ondemand/raw_json_string-inl.h for haswell */ +/* end file simdjson/generic/ondemand/parser-inl.h for icelake */ +/* including simdjson/generic/ondemand/raw_json_string-inl.h for icelake: #include "simdjson/generic/ondemand/raw_json_string-inl.h" */ +/* begin file simdjson/generic/ondemand/raw_json_string-inl.h for icelake */ #ifndef SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -74232,7 +112878,7 @@ simdjson_inline simdjson_result<haswell::ondemand::parser>::simdjson_result(erro namespace simdjson { -namespace haswell { +namespace icelake { namespace ondemand { simdjson_inline raw_json_string::raw_json_string(const uint8_t * _buf) noexcept : buf{_buf} {} @@ -74406,277 +113052,38 @@ simdjson_unused simdjson_inline std::ostream &operator<<(std::ostream &out, cons } } // namespace ondemand -} // namespace haswell +} // namespace icelake } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<haswell::ondemand::raw_json_string>::simdjson_result(haswell::ondemand::raw_json_string &&value) noexcept - : implementation_simdjson_result_base<haswell::ondemand::raw_json_string>(std::forward<haswell::ondemand::raw_json_string>(value)) {} -simdjson_inline simdjson_result<haswell::ondemand::raw_json_string>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<haswell::ondemand::raw_json_string>(error) {} +simdjson_inline simdjson_result<icelake::ondemand::raw_json_string>::simdjson_result(icelake::ondemand::raw_json_string &&value) noexcept + : implementation_simdjson_result_base<icelake::ondemand::raw_json_string>(std::forward<icelake::ondemand::raw_json_string>(value)) {} +simdjson_inline simdjson_result<icelake::ondemand::raw_json_string>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<icelake::ondemand::raw_json_string>(error) {} -simdjson_inline simdjson_result<const char *> simdjson_result<haswell::ondemand::raw_json_string>::raw() const noexcept { +simdjson_inline simdjson_result<const char *> simdjson_result<icelake::ondemand::raw_json_string>::raw() const noexcept { if (error()) { return error(); } return first.raw(); } -simdjson_inline char simdjson_result<haswell::ondemand::raw_json_string>::operator[](size_t i) const noexcept { +simdjson_inline char simdjson_result<icelake::ondemand::raw_json_string>::operator[](size_t i) const noexcept { if (error()) { return error(); } return first[i]; } -simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> simdjson_result<haswell::ondemand::raw_json_string>::unescape(haswell::ondemand::json_iterator &iter, bool allow_replacement) const noexcept { +simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> simdjson_result<icelake::ondemand::raw_json_string>::unescape(icelake::ondemand::json_iterator &iter, bool allow_replacement) const noexcept { if (error()) { return error(); } return first.unescape(iter, allow_replacement); } -simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> simdjson_result<haswell::ondemand::raw_json_string>::unescape_wobbly(haswell::ondemand::json_iterator &iter) const noexcept { +simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> simdjson_result<icelake::ondemand::raw_json_string>::unescape_wobbly(icelake::ondemand::json_iterator &iter) const noexcept { if (error()) { return error(); } return first.unescape_wobbly(iter); } } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_INL_H -/* end file simdjson/generic/ondemand/raw_json_string-inl.h for haswell */ -/* including simdjson/generic/ondemand/serialization-inl.h for haswell: #include "simdjson/generic/ondemand/serialization-inl.h" */ -/* begin file simdjson/generic/ondemand/serialization-inl.h for haswell */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H - -/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document-inl.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/serialization.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */ -/* amalgamation skipped (editor-only): #if SIMDJSON_STATIC_REFLECTION */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_builder.h" */ -/* amalgamation skipped (editor-only): #endif */ -/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ - -namespace simdjson { - -inline std::string_view trim(const std::string_view str) noexcept { - // We can almost surely do better by rolling our own find_first_not_of function. - size_t first = str.find_first_not_of(" \t\n\r"); - // If we have the empty string (just white space), then no trimming is possible, and - // we return the empty string_view. - if (std::string_view::npos == first) { return std::string_view(); } - size_t last = str.find_last_not_of(" \t\n\r"); - return str.substr(first, (last - first + 1)); -} - - -inline simdjson_result<std::string_view> to_json_string(haswell::ondemand::document& x) noexcept { - std::string_view v; - auto error = x.raw_json().get(v); - if(error) {return error; } - return trim(v); -} - -inline simdjson_result<std::string_view> to_json_string(haswell::ondemand::document_reference& x) noexcept { - std::string_view v; - auto error = x.raw_json().get(v); - if(error) {return error; } - return trim(v); -} - -inline simdjson_result<std::string_view> to_json_string(haswell::ondemand::value& x) noexcept { - /** - * If we somehow receive a value that has already been consumed, - * then the following code could be in trouble. E.g., we create - * an array as needed, but if an array was already created, then - * it could be bad. - */ - using namespace haswell::ondemand; - haswell::ondemand::json_type t; - auto error = x.type().get(t); - if(error != SUCCESS) { return error; } - switch (t) - { - case json_type::array: - { - haswell::ondemand::array array; - error = x.get_array().get(array); - if(error) { return error; } - return to_json_string(array); - } - case json_type::object: - { - haswell::ondemand::object object; - error = x.get_object().get(object); - if(error) { return error; } - return to_json_string(object); - } - default: - return trim(x.raw_json_token()); - } -} - -inline simdjson_result<std::string_view> to_json_string(haswell::ondemand::object& x) noexcept { - std::string_view v; - auto error = x.raw_json().get(v); - if(error) {return error; } - return trim(v); -} - -inline simdjson_result<std::string_view> to_json_string(haswell::ondemand::array& x) noexcept { - std::string_view v; - auto error = x.raw_json().get(v); - if(error) {return error; } - return trim(v); -} - -inline simdjson_result<std::string_view> to_json_string(simdjson_result<haswell::ondemand::document> x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); -} - -inline simdjson_result<std::string_view> to_json_string(simdjson_result<haswell::ondemand::document_reference> x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); -} - -inline simdjson_result<std::string_view> to_json_string(simdjson_result<haswell::ondemand::value> x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); -} - -inline simdjson_result<std::string_view> to_json_string(simdjson_result<haswell::ondemand::object> x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); -} - -inline simdjson_result<std::string_view> to_json_string(simdjson_result<haswell::ondemand::array> x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); -} -} // namespace simdjson - -namespace simdjson { namespace haswell { namespace ondemand { - -#if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::haswell::ondemand::value x) { - std::string_view v; - auto error = simdjson::to_json_string(x).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - throw simdjson::simdjson_error(error); - } -} -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::haswell::ondemand::value> x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); -} -#else -inline std::ostream& operator<<(std::ostream& out, simdjson::haswell::ondemand::value x) { - std::string_view v; - auto error = simdjson::to_json_string(x).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - return (out << error); - } -} -#endif - -#if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::haswell::ondemand::array value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - throw simdjson::simdjson_error(error); - } -} -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::haswell::ondemand::array> x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); -} -#else -inline std::ostream& operator<<(std::ostream& out, simdjson::haswell::ondemand::array value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - return (out << error); - } -} -#endif - -#if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::haswell::ondemand::document& value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - throw simdjson::simdjson_error(error); - } -} -inline std::ostream& operator<<(std::ostream& out, simdjson::haswell::ondemand::document_reference& value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - throw simdjson::simdjson_error(error); - } -} -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::haswell::ondemand::document>&& x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); -} -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::haswell::ondemand::document_reference>&& x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); -} -#else -inline std::ostream& operator<<(std::ostream& out, simdjson::haswell::ondemand::document& value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - return (out << error); - } -} -#endif - -#if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::haswell::ondemand::object value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - throw simdjson::simdjson_error(error); - } -} -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::haswell::ondemand::object> x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); -} -#else -inline std::ostream& operator<<(std::ostream& out, simdjson::haswell::ondemand::object value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - return (out << error); - } -} -#endif -}}} // namespace simdjson::haswell::ondemand - -#endif // SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H -/* end file simdjson/generic/ondemand/serialization-inl.h for haswell */ -/* including simdjson/generic/ondemand/token_iterator-inl.h for haswell: #include "simdjson/generic/ondemand/token_iterator-inl.h" */ -/* begin file simdjson/generic/ondemand/token_iterator-inl.h for haswell */ +/* end file simdjson/generic/ondemand/raw_json_string-inl.h for icelake */ +/* including simdjson/generic/ondemand/token_iterator-inl.h for icelake: #include "simdjson/generic/ondemand/token_iterator-inl.h" */ +/* begin file simdjson/generic/ondemand/token_iterator-inl.h for icelake */ #ifndef SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -74687,7 +113094,7 @@ inline std::ostream& operator<<(std::ostream& out, simdjson::haswell::ondemand:: /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace haswell { +namespace icelake { namespace ondemand { simdjson_inline token_iterator::token_iterator( @@ -74758,22 +113165,22 @@ simdjson_inline bool token_iterator::operator<=(const token_iterator &other) con } } // namespace ondemand -} // namespace haswell +} // namespace icelake } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<haswell::ondemand::token_iterator>::simdjson_result(haswell::ondemand::token_iterator &&value) noexcept - : implementation_simdjson_result_base<haswell::ondemand::token_iterator>(std::forward<haswell::ondemand::token_iterator>(value)) {} -simdjson_inline simdjson_result<haswell::ondemand::token_iterator>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<haswell::ondemand::token_iterator>(error) {} +simdjson_inline simdjson_result<icelake::ondemand::token_iterator>::simdjson_result(icelake::ondemand::token_iterator &&value) noexcept + : implementation_simdjson_result_base<icelake::ondemand::token_iterator>(std::forward<icelake::ondemand::token_iterator>(value)) {} +simdjson_inline simdjson_result<icelake::ondemand::token_iterator>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<icelake::ondemand::token_iterator>(error) {} } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_INL_H -/* end file simdjson/generic/ondemand/token_iterator-inl.h for haswell */ -/* including simdjson/generic/ondemand/value_iterator-inl.h for haswell: #include "simdjson/generic/ondemand/value_iterator-inl.h" */ -/* begin file simdjson/generic/ondemand/value_iterator-inl.h for haswell */ +/* end file simdjson/generic/ondemand/token_iterator-inl.h for icelake */ +/* including simdjson/generic/ondemand/value_iterator-inl.h for icelake: #include "simdjson/generic/ondemand/value_iterator-inl.h" */ +/* begin file simdjson/generic/ondemand/value_iterator-inl.h for icelake */ #ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -74788,7 +113195,7 @@ simdjson_inline simdjson_result<haswell::ondemand::token_iterator>::simdjson_res /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace haswell { +namespace icelake { namespace ondemand { simdjson_inline value_iterator::value_iterator( @@ -74870,7 +113277,6 @@ simdjson_warn_unused simdjson_inline error_code value_iterator::end_container() simdjson_warn_unused simdjson_inline simdjson_result<bool> value_iterator::has_next_field() noexcept { assert_at_next(); - // It's illegal to call this unless there are more tokens: anything that ends in } or ] is // obligated to verify there are more tokens if they are not the top level. switch (*_json_iter->return_current_and_advance()) { @@ -75292,9 +113698,13 @@ simdjson_warn_unused simdjson_inline simdjson_result<std::string_view> value_ite template <typename string_type> simdjson_warn_unused simdjson_inline error_code value_iterator::get_string(string_type& receiver, bool allow_replacement) noexcept { std::string_view content; + // Save the string buffer location so that we can restore it after get_string + auto saved_string_buf_loc = _json_iter->string_buf_loc(); auto err = get_string(allow_replacement).get(content); if (err) { return err; } receiver = content; + // Restore the string buffer location, effectively discarding any temporary string storage + _json_iter->string_buf_loc() = saved_string_buf_loc; return SUCCESS; } simdjson_warn_unused simdjson_inline simdjson_result<std::string_view> value_iterator::get_wobbly_string() noexcept { @@ -75382,7 +113792,7 @@ simdjson_inline simdjson_result<bool> value_iterator::is_root_integer(bool check return answer; } -simdjson_inline simdjson_result<haswell::number_type> value_iterator::get_root_number_type(bool check_trailing) noexcept { +simdjson_inline simdjson_result<icelake::number_type> value_iterator::get_root_number_type(bool check_trailing) noexcept { auto max_len = peek_root_length(); auto json = peek_root_scalar("number"); // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/, @@ -75434,9 +113844,13 @@ simdjson_warn_unused simdjson_inline simdjson_result<std::string_view> value_ite template <typename string_type> simdjson_warn_unused simdjson_inline error_code value_iterator::get_root_string(string_type& receiver, bool check_trailing, bool allow_replacement) noexcept { std::string_view content; + // Save the string buffer location so that we can restore it after get_string + auto saved_string_buf_loc = _json_iter->string_buf_loc(); auto err = get_root_string(check_trailing, allow_replacement).get(content); if (err) { return err; } receiver = content; + // Restore the string buffer location, effectively discarding any temporary string storage + _json_iter->string_buf_loc() = saved_string_buf_loc; return SUCCESS; } simdjson_warn_unused simdjson_inline simdjson_result<std::string_view> value_iterator::get_root_wobbly_string(bool check_trailing) noexcept { @@ -75743,6 +114157,9 @@ simdjson_inline bool value_iterator::is_at_key() const noexcept { // Keys are at the same depth as the object. // Note here that we could be safer and check that we are within an object, // but we do not. + // + // As long as we are at the object's depth, in a valid document, + // we will only ever be at { , : or the actual string key: ". return _depth == _json_iter->_depth && *_json_iter->peek() == '"'; } @@ -75858,1116 +114275,263 @@ simdjson_inline error_code value_iterator::report_error(error_code error, const } } // namespace ondemand -} // namespace haswell +} // namespace icelake } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<haswell::ondemand::value_iterator>::simdjson_result(haswell::ondemand::value_iterator &&value) noexcept - : implementation_simdjson_result_base<haswell::ondemand::value_iterator>(std::forward<haswell::ondemand::value_iterator>(value)) {} -simdjson_inline simdjson_result<haswell::ondemand::value_iterator>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<haswell::ondemand::value_iterator>(error) {} +simdjson_inline simdjson_result<icelake::ondemand::value_iterator>::simdjson_result(icelake::ondemand::value_iterator &&value) noexcept + : implementation_simdjson_result_base<icelake::ondemand::value_iterator>(std::forward<icelake::ondemand::value_iterator>(value)) {} +simdjson_inline simdjson_result<icelake::ondemand::value_iterator>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<icelake::ondemand::value_iterator>(error) {} } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H -/* end file simdjson/generic/ondemand/value_iterator-inl.h for haswell */ - -// JSON builder inline definitions -/* including simdjson/generic/ondemand/json_string_builder-inl.h for haswell: #include "simdjson/generic/ondemand/json_string_builder-inl.h" */ -/* begin file simdjson/generic/ondemand/json_string_builder-inl.h for haswell */ -/** - * This file is part of the builder API. It is temporarily in the ondemand - * directory but we will move it to a builder directory later. - */ -#include <array> -#include <cstring> -#include <type_traits> -#ifndef SIMDJSON_GENERIC_STRING_BUILDER_INL_H - -/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_INL_H */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_string_builder.h" */ -/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ - -/* - * Empirically, we have found that an inlined optimization is important for - * performance. The following macros are not ideal. We should find a better - * way to inline the code. - */ - -#if defined(__SSE2__) || defined(__x86_64__) || defined(__x86_64) || \ - (defined(_M_AMD64) || defined(_M_X64) || \ - (defined(_M_IX86_FP) && _M_IX86_FP == 2)) -#ifndef SIMDJSON_EXPERIMENTAL_HAS_SSE2 -#define SIMDJSON_EXPERIMENTAL_HAS_SSE2 1 -#endif -#endif - -#if defined(__aarch64__) || defined(_M_ARM64) -#ifndef SIMDJSON_EXPERIMENTAL_HAS_NEON -#define SIMDJSON_EXPERIMENTAL_HAS_NEON 1 -#endif -#endif -#if SIMDJSON_EXPERIMENTAL_HAS_NEON -#include <arm_neon.h> -#endif -#if SIMDJSON_EXPERIMENTAL_HAS_SSE2 -#include <emmintrin.h> -#endif - -namespace simdjson { -namespace haswell { -namespace builder { - -static SIMDJSON_CONSTEXPR_LAMBDA std::array<uint8_t, 256> - json_quotable_character = { - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - -/** - -A possible SWAR implementation of has_json_escapable_byte. It is not used -because it is slower than the current implementation. It is kept here for -reference (to show that we tried it). - -inline bool has_json_escapable_byte(uint64_t x) { - uint64_t is_ascii = 0x8080808080808080ULL & ~x; - uint64_t xor2 = x ^ 0x0202020202020202ULL; - uint64_t lt32_or_eq34 = xor2 - 0x2121212121212121ULL; - uint64_t sub92 = x ^ 0x5C5C5C5C5C5C5C5CULL; - uint64_t eq92 = (sub92 - 0x0101010101010101ULL); - return ((lt32_or_eq34 | eq92) & is_ascii) != 0; -} - -**/ - -SIMDJSON_CONSTEXPR_LAMBDA simdjson_inline bool -simple_needs_escaping(std::string_view v) { - for (char c : v) { - // a table lookup is faster than a series of comparisons - if (json_quotable_character[static_cast<uint8_t>(c)]) { - return true; - } - } - return false; -} - -#if SIMDJSON_EXPERIMENTAL_HAS_NEON -simdjson_inline bool fast_needs_escaping(std::string_view view) { - if (view.size() < 16) { - return simple_needs_escaping(view); - } - size_t i = 0; - uint8x16_t running = vdupq_n_u8(0); - uint8x16_t v34 = vdupq_n_u8(34); - uint8x16_t v92 = vdupq_n_u8(92); - - for (; i + 15 < view.size(); i += 16) { - uint8x16_t word = vld1q_u8((const uint8_t *)view.data() + i); - running = vorrq_u8(running, vceqq_u8(word, v34)); - running = vorrq_u8(running, vceqq_u8(word, v92)); - running = vorrq_u8(running, vcltq_u8(word, vdupq_n_u8(32))); - } - if (i < view.size()) { - uint8x16_t word = - vld1q_u8((const uint8_t *)view.data() + view.length() - 16); - running = vorrq_u8(running, vceqq_u8(word, v34)); - running = vorrq_u8(running, vceqq_u8(word, v92)); - running = vorrq_u8(running, vcltq_u8(word, vdupq_n_u8(32))); - } - return vmaxvq_u32(vreinterpretq_u32_u8(running)) != 0; -} -#elif SIMDJSON_EXPERIMENTAL_HAS_SSE2 -simdjson_inline bool fast_needs_escaping(std::string_view view) { - if (view.size() < 16) { - return simple_needs_escaping(view); - } - size_t i = 0; - __m128i running = _mm_setzero_si128(); - for (; i + 15 < view.size(); i += 16) { - - __m128i word = - _mm_loadu_si128(reinterpret_cast<const __m128i *>(view.data() + i)); - running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(34))); - running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(92))); - running = _mm_or_si128( - running, _mm_cmpeq_epi8(_mm_subs_epu8(word, _mm_set1_epi8(31)), - _mm_setzero_si128())); - } - if (i < view.size()) { - __m128i word = _mm_loadu_si128( - reinterpret_cast<const __m128i *>(view.data() + view.length() - 16)); - running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(34))); - running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(92))); - running = _mm_or_si128( - running, _mm_cmpeq_epi8(_mm_subs_epu8(word, _mm_set1_epi8(31)), - _mm_setzero_si128())); - } - return _mm_movemask_epi8(running) != 0; -} -#else -simdjson_inline bool fast_needs_escaping(std::string_view view) { - return simple_needs_escaping(view); -} -#endif - -SIMDJSON_CONSTEXPR_LAMBDA inline size_t -find_next_json_quotable_character(const std::string_view view, - size_t location) noexcept { - - for (auto pos = view.begin() + location; pos != view.end(); ++pos) { - if (json_quotable_character[static_cast<uint8_t>(*pos)]) { - return pos - view.begin(); - } - } - return size_t(view.size()); -} - -SIMDJSON_CONSTEXPR_LAMBDA static std::string_view control_chars[] = { - "\\u0000", "\\u0001", "\\u0002", "\\u0003", "\\u0004", "\\u0005", "\\u0006", - "\\u0007", "\\b", "\\t", "\\n", "\\u000b", "\\f", "\\r", - "\\u000e", "\\u000f", "\\u0010", "\\u0011", "\\u0012", "\\u0013", "\\u0014", - "\\u0015", "\\u0016", "\\u0017", "\\u0018", "\\u0019", "\\u001a", "\\u001b", - "\\u001c", "\\u001d", "\\u001e", "\\u001f"}; - -// All Unicode characters may be placed within the quotation marks, except for -// the characters that MUST be escaped: quotation mark, reverse solidus, and the -// control characters (U+0000 through U+001F). There are two-character sequence -// escape representations of some popular characters: -// \", \\, \b, \f, \n, \r, \t. -SIMDJSON_CONSTEXPR_LAMBDA void escape_json_char(char c, char *&out) { - if (c == '"') { - memcpy(out, "\\\"", 2); - out += 2; - } else if (c == '\\') { - memcpy(out, "\\\\", 2); - out += 2; - } else { - std::string_view v = control_chars[uint8_t(c)]; - memcpy(out, v.data(), v.size()); - out += v.size(); - } -} - -inline size_t write_string_escaped(const std::string_view input, char *out) { - size_t mysize = input.size(); - if (!fast_needs_escaping(input)) { // fast path! - memcpy(out, input.data(), input.size()); - return input.size(); - } - const char *const initout = out; - size_t location = find_next_json_quotable_character(input, 0); - memcpy(out, input.data(), location); - out += location; - escape_json_char(input[location], out); - location += 1; - while (location < mysize) { - size_t newlocation = find_next_json_quotable_character(input, location); - memcpy(out, input.data() + location, newlocation - location); - out += newlocation - location; - location = newlocation; - if (location == mysize) { - break; - } - escape_json_char(input[location], out); - location += 1; - } - return out - initout; -} - -simdjson_inline string_builder::string_builder(size_t initial_capacity) - : buffer(new(std::nothrow) char[initial_capacity]), position(0), - capacity(buffer.get() != nullptr ? initial_capacity : 0), - is_valid(buffer.get() != nullptr) {} - -simdjson_inline bool string_builder::capacity_check(size_t upcoming_bytes) { - // We use the convention that when is_valid is false, then the capacity and - // the position are 0. - // Most of the time, this function will return true. - if (simdjson_likely(upcoming_bytes <= capacity - position)) { - return true; - } - // check for overflow, most of the time there is no overflow - if (simdjson_likely(position + upcoming_bytes < position)) { - return false; - } - // We will rarely get here. - grow_buffer((std::max)(capacity * 2, position + upcoming_bytes)); - // If the buffer allocation failed, we set is_valid to false. - return is_valid; -} - -simdjson_inline void string_builder::grow_buffer(size_t desired_capacity) { - if (!is_valid) { - return; - } - std::unique_ptr<char[]> new_buffer(new (std::nothrow) char[desired_capacity]); - if (new_buffer.get() == nullptr) { - set_valid(false); - return; - } - std::memcpy(new_buffer.get(), buffer.get(), position); - buffer.swap(new_buffer); - capacity = desired_capacity; -} - -simdjson_inline void string_builder::set_valid(bool valid) noexcept { - if (!valid) { - is_valid = false; - capacity = 0; - position = 0; - buffer.reset(); - } else { - is_valid = true; - } -} - -simdjson_inline size_t string_builder::size() const noexcept { - return position; -} - -simdjson_inline void string_builder::append(char c) noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = c; - } -} - -simdjson_inline void string_builder::append_null() noexcept { - constexpr char null_literal[] = "null"; - constexpr size_t null_len = sizeof(null_literal) - 1; - if (capacity_check(null_len)) { - std::memcpy(buffer.get() + position, null_literal, null_len); - position += null_len; - } -} - -simdjson_inline void string_builder::clear() noexcept { - position = 0; - // if it was invalid, we should try to repair it - if (!is_valid) { - capacity = 0; - buffer.reset(); - is_valid = true; - } -} - -namespace internal { - -template <typename number_type, typename = typename std::enable_if< - std::is_unsigned<number_type>::value>::type> -simdjson_really_inline int int_log2(number_type x) { - return 63 - leading_zeroes(uint64_t(x) | 1); -} - -simdjson_really_inline int fast_digit_count_32(uint32_t x) { - static uint64_t table[] = { - 4294967296, 8589934582, 8589934582, 8589934582, 12884901788, - 12884901788, 12884901788, 17179868184, 17179868184, 17179868184, - 21474826480, 21474826480, 21474826480, 21474826480, 25769703776, - 25769703776, 25769703776, 30063771072, 30063771072, 30063771072, - 34349738368, 34349738368, 34349738368, 34349738368, 38554705664, - 38554705664, 38554705664, 41949672960, 41949672960, 41949672960, - 42949672960, 42949672960}; - return uint32_t((x + table[int_log2(x)]) >> 32); -} - -simdjson_really_inline int fast_digit_count_64(uint64_t x) { - static uint64_t table[] = {9, - 99, - 999, - 9999, - 99999, - 999999, - 9999999, - 99999999, - 999999999, - 9999999999, - 99999999999, - 999999999999, - 9999999999999, - 99999999999999, - 999999999999999ULL, - 9999999999999999ULL, - 99999999999999999ULL, - 999999999999999999ULL, - 9999999999999999999ULL}; - int y = (19 * int_log2(x) >> 6); - y += x > table[y]; - return y + 1; -} - -template <typename number_type, typename = typename std::enable_if< - std::is_unsigned<number_type>::value>::type> -simdjson_really_inline size_t digit_count(number_type v) noexcept { - static_assert(sizeof(number_type) == 8 || sizeof(number_type) == 4 || - sizeof(number_type) == 2 || sizeof(number_type) == 1, - "We only support 8-bit, 16-bit, 32-bit and 64-bit numbers"); - SIMDJSON_IF_CONSTEXPR(sizeof(number_type) <= 4) { - return fast_digit_count_32(static_cast<uint32_t>(v)); - } - else { - return fast_digit_count_64(static_cast<uint64_t>(v)); - } -} -static const char decimal_table[200] = { - 0x30, 0x30, 0x30, 0x31, 0x30, 0x32, 0x30, 0x33, 0x30, 0x34, 0x30, 0x35, - 0x30, 0x36, 0x30, 0x37, 0x30, 0x38, 0x30, 0x39, 0x31, 0x30, 0x31, 0x31, - 0x31, 0x32, 0x31, 0x33, 0x31, 0x34, 0x31, 0x35, 0x31, 0x36, 0x31, 0x37, - 0x31, 0x38, 0x31, 0x39, 0x32, 0x30, 0x32, 0x31, 0x32, 0x32, 0x32, 0x33, - 0x32, 0x34, 0x32, 0x35, 0x32, 0x36, 0x32, 0x37, 0x32, 0x38, 0x32, 0x39, - 0x33, 0x30, 0x33, 0x31, 0x33, 0x32, 0x33, 0x33, 0x33, 0x34, 0x33, 0x35, - 0x33, 0x36, 0x33, 0x37, 0x33, 0x38, 0x33, 0x39, 0x34, 0x30, 0x34, 0x31, - 0x34, 0x32, 0x34, 0x33, 0x34, 0x34, 0x34, 0x35, 0x34, 0x36, 0x34, 0x37, - 0x34, 0x38, 0x34, 0x39, 0x35, 0x30, 0x35, 0x31, 0x35, 0x32, 0x35, 0x33, - 0x35, 0x34, 0x35, 0x35, 0x35, 0x36, 0x35, 0x37, 0x35, 0x38, 0x35, 0x39, - 0x36, 0x30, 0x36, 0x31, 0x36, 0x32, 0x36, 0x33, 0x36, 0x34, 0x36, 0x35, - 0x36, 0x36, 0x36, 0x37, 0x36, 0x38, 0x36, 0x39, 0x37, 0x30, 0x37, 0x31, - 0x37, 0x32, 0x37, 0x33, 0x37, 0x34, 0x37, 0x35, 0x37, 0x36, 0x37, 0x37, - 0x37, 0x38, 0x37, 0x39, 0x38, 0x30, 0x38, 0x31, 0x38, 0x32, 0x38, 0x33, - 0x38, 0x34, 0x38, 0x35, 0x38, 0x36, 0x38, 0x37, 0x38, 0x38, 0x38, 0x39, - 0x39, 0x30, 0x39, 0x31, 0x39, 0x32, 0x39, 0x33, 0x39, 0x34, 0x39, 0x35, - 0x39, 0x36, 0x39, 0x37, 0x39, 0x38, 0x39, 0x39, -}; -} // namespace internal - -template <typename number_type, typename> -simdjson_inline void string_builder::append(number_type v) noexcept { - static_assert(std::is_same<number_type, bool>::value || - std::is_integral<number_type>::value || - std::is_floating_point<number_type>::value, - "Unsupported number type"); - // If C++17 is available, we can 'if constexpr' here. - SIMDJSON_IF_CONSTEXPR(std::is_same<number_type, bool>::value) { - if (v) { - constexpr char true_literal[] = "true"; - constexpr size_t true_len = sizeof(true_literal) - 1; - if (capacity_check(true_len)) { - std::memcpy(buffer.get() + position, true_literal, true_len); - position += true_len; - } - } else { - constexpr char false_literal[] = "false"; - constexpr size_t false_len = sizeof(false_literal) - 1; - if (capacity_check(false_len)) { - std::memcpy(buffer.get() + position, false_literal, false_len); - position += false_len; - } - } - } - else SIMDJSON_IF_CONSTEXPR(std::is_unsigned<number_type>::value) { - constexpr size_t max_number_size = 20; - if (capacity_check(max_number_size)) { - using unsigned_type = typename std::make_unsigned<number_type>::type; - unsigned_type pv = static_cast<unsigned_type>(v); - size_t dc = internal::digit_count(pv); - char *write_pointer = buffer.get() + position + dc - 1; - while (pv >= 100) { - memcpy(write_pointer - 1, &internal::decimal_table[(pv % 100) * 2], 2); - write_pointer -= 2; - pv /= 100; - } - if (pv >= 10) { - *write_pointer-- = char('0' + (pv % 10)); - pv /= 10; - } - *write_pointer = char('0' + pv); - position += dc; - } - } - else SIMDJSON_IF_CONSTEXPR(std::is_integral<number_type>::value) { - constexpr size_t max_number_size = 20; - if (capacity_check(max_number_size)) { - using unsigned_type = typename std::make_unsigned<number_type>::type; - bool negative = v < 0; - unsigned_type pv = static_cast<unsigned_type>(v); - if (negative) { - pv = 0 - pv; // the 0 is for Microsoft - } - size_t dc = internal::digit_count(pv); - // by always writing the minus sign, we avoid the branch. - buffer.get()[position] = '-'; - position += negative ? 1 : 0; - char *write_pointer = buffer.get() + position + dc - 1; - while (pv >= 100) { - memcpy(write_pointer - 1, &internal::decimal_table[(pv % 100) * 2], 2); - write_pointer -= 2; - pv /= 100; - } - if (pv >= 10) { - *write_pointer-- = char('0' + (pv % 10)); - pv /= 10; - } - *write_pointer = char('0' + pv); - position += dc; - } - } - else SIMDJSON_IF_CONSTEXPR(std::is_floating_point<number_type>::value) { - constexpr size_t max_number_size = 24; - if (capacity_check(max_number_size)) { - // We could specialize for float. - char *end = simdjson::internal::to_chars(buffer.get() + position, nullptr, - double(v)); - position = end - buffer.get(); - } - } -} - -simdjson_inline void -string_builder::escape_and_append(std::string_view input) noexcept { - // escaping might turn a control character into \x00xx so 6 characters. - if (capacity_check(6 * input.size())) { - position += write_string_escaped(input, buffer.get() + position); - } -} - -simdjson_inline void -string_builder::escape_and_append_with_quotes(std::string_view input) noexcept { - // escaping might turn a control character into \x00xx so 6 characters. - if (capacity_check(2 + 6 * input.size())) { - buffer.get()[position++] = '"'; - position += write_string_escaped(input, buffer.get() + position); - buffer.get()[position++] = '"'; - } -} - -simdjson_inline void -string_builder::escape_and_append_with_quotes(char input) noexcept { - // escaping might turn a control character into \x00xx so 6 characters. - if (capacity_check(2 + 6 * 1)) { - buffer.get()[position++] = '"'; - std::string_view cinput(&input, 1); - position += write_string_escaped(cinput, buffer.get() + position); - buffer.get()[position++] = '"'; - } -} - -simdjson_inline void -string_builder::escape_and_append_with_quotes(const char *input) noexcept { - std::string_view cinput(input); - escape_and_append_with_quotes(cinput); -} -#if SIMDJSON_SUPPORTS_CONCEPTS -template <constevalutil::fixed_string key> -simdjson_inline void string_builder::escape_and_append_with_quotes() noexcept { - escape_and_append_with_quotes(constevalutil::string_constant<key>::value); -} -#endif - -simdjson_inline void string_builder::append_raw(const char *c) noexcept { - size_t len = std::strlen(c); - append_raw(c, len); -} - -simdjson_inline void -string_builder::append_raw(std::string_view input) noexcept { - if (capacity_check(input.size())) { - std::memcpy(buffer.get() + position, input.data(), input.size()); - position += input.size(); - } -} - -simdjson_inline void string_builder::append_raw(const char *str, - size_t len) noexcept { - if (capacity_check(len)) { - std::memcpy(buffer.get() + position, str, len); - position += len; - } -} -#if SIMDJSON_SUPPORTS_CONCEPTS -// Support for optional types (std::optional, etc.) -template <concepts::optional_type T> - requires(!require_custom_serialization<T>) -simdjson_inline void string_builder::append(const T &opt) { - if (opt) { - append(*opt); - } else { - append_null(); - } -} - -template <typename T> - requires(require_custom_serialization<T>) -simdjson_inline void string_builder::append(T &&val) { - serialize(*this, std::forward<T>(val)); -} - -template <typename T> - requires(std::is_convertible<T, std::string_view>::value || - std::is_same<T, const char *>::value) -simdjson_inline void string_builder::append(const T &value) { - escape_and_append_with_quotes(value); -} -#endif - -#if SIMDJSON_SUPPORTS_RANGES && SIMDJSON_SUPPORTS_CONCEPTS -// Support for range-based appending (std::ranges::view, etc.) -template <std::ranges::range R> - requires(!std::is_convertible<R, std::string_view>::value && !require_custom_serialization<R>) -simdjson_inline void string_builder::append(const R &range) noexcept { - auto it = std::ranges::begin(range); - auto end = std::ranges::end(range); - if constexpr (concepts::is_pair<std::ranges::range_value_t<R>>) { - start_object(); - - if (it == end) { - end_object(); - return; // Handle empty range - } - // Append first item without leading comma - append_key_value(it->first, it->second); - ++it; - - // Append remaining items with preceding commas - for (; it != end; ++it) { - append_comma(); - append_key_value(it->first, it->second); - } - end_object(); - } else { - start_array(); - if (it == end) { - end_array(); - return; // Handle empty range - } - - // Append first item without leading comma - append(*it); - ++it; - - // Append remaining items with preceding commas - for (; it != end; ++it) { - append_comma(); - append(*it); - } - end_array(); - } -} - -#endif - -#if SIMDJSON_EXCEPTIONS -simdjson_inline string_builder::operator std::string() const noexcept(false) { - return std::string(operator std::string_view()); -} - -simdjson_inline string_builder::operator std::string_view() const - noexcept(false) simdjson_lifetime_bound { - return view(); -} -#endif - -simdjson_inline simdjson_result<std::string_view> -string_builder::view() const noexcept { - if (!is_valid) { - return simdjson::OUT_OF_CAPACITY; - } - return std::string_view(buffer.get(), position); -} - -simdjson_inline simdjson_result<const char *> string_builder::c_str() noexcept { - if (capacity_check(1)) { - buffer.get()[position] = '\0'; - return buffer.get(); - } - return simdjson::OUT_OF_CAPACITY; -} - -simdjson_inline bool string_builder::validate_unicode() const noexcept { - return simdjson::validate_utf8(buffer.get(), position); -} - -simdjson_inline void string_builder::start_object() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = '{'; - } -} - -simdjson_inline void string_builder::end_object() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = '}'; - } -} - -simdjson_inline void string_builder::start_array() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = '['; - } -} - -simdjson_inline void string_builder::end_array() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = ']'; - } -} - -simdjson_inline void string_builder::append_comma() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = ','; - } -} - -simdjson_inline void string_builder::append_colon() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = ':'; - } -} - -template <typename key_type, typename value_type> -simdjson_inline void -string_builder::append_key_value(key_type key, value_type value) noexcept { - static_assert(std::is_same<key_type, const char *>::value || - std::is_convertible<key_type, std::string_view>::value, - "Unsupported key type"); - escape_and_append_with_quotes(key); - append_colon(); - SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, std::nullptr_t>::value) { - append_null(); - } - else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, char>::value) { - escape_and_append_with_quotes(value); - } - else SIMDJSON_IF_CONSTEXPR( - std::is_convertible<value_type, std::string_view>::value) { - escape_and_append_with_quotes(value); - } - else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, const char *>::value) { - escape_and_append_with_quotes(value); - } - else { - append(value); - } -} - -#if SIMDJSON_SUPPORTS_CONCEPTS -template <constevalutil::fixed_string key, typename value_type> -simdjson_inline void -string_builder::append_key_value(value_type value) noexcept { - escape_and_append_with_quotes<key>(); - append_colon(); - SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, std::nullptr_t>::value) { - append_null(); - } - else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, char>::value) { - escape_and_append_with_quotes(value); - } - else SIMDJSON_IF_CONSTEXPR( - std::is_convertible<value_type, std::string_view>::value) { - escape_and_append_with_quotes(value); - } - else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, const char *>::value) { - escape_and_append_with_quotes(value); - } - else { - append(value); - } -} -#endif - -} // namespace builder -} // namespace haswell -} // namespace simdjson - -#endif // SIMDJSON_GENERIC_STRING_BUILDER_INL_H -/* end file simdjson/generic/ondemand/json_string_builder-inl.h for haswell */ -/* including simdjson/generic/ondemand/json_builder.h for haswell: #include "simdjson/generic/ondemand/json_builder.h" */ -/* begin file simdjson/generic/ondemand/json_builder.h for haswell */ -/** - * This file is part of the builder API. It is temporarily in the ondemand directory - * but we will move it to a builder directory later. - */ -#ifndef SIMDJSON_GENERIC_BUILDER_H +/* end file simdjson/generic/ondemand/value_iterator-inl.h for icelake */ +/* including simdjson/generic/ondemand/serialization-inl.h for icelake: #include "simdjson/generic/ondemand/serialization-inl.h" */ +/* begin file simdjson/generic/ondemand/serialization-inl.h for icelake */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_H */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_string_builder.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/concepts.h" */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document-inl.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/serialization.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */ +/* amalgamation skipped (editor-only): #if SIMDJSON_STATIC_REFLECTION */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_builder.h" */ +/* amalgamation skipped (editor-only): #endif */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -#if SIMDJSON_STATIC_REFLECTION - -#include <charconv> -#include <cstring> -#include <meta> -#include <memory> -#include <optional> -#include <string_view> -#include <type_traits> -#include <utility> -// #include <static_reflection> // for std::define_static_string - header not available yet namespace simdjson { -namespace haswell { -namespace builder { - -template <class T> - requires(concepts::container_but_not_string<T> && !require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &t) { - auto it = t.begin(); - auto end = t.end(); - if (it == end) { - b.append_raw("[]"); - return; - } - b.append('['); - atom(b, *it); - ++it; - for (; it != end; ++it) { - b.append(','); - atom(b, *it); - } - b.append(']'); -} - -template <class T> - requires(std::is_same_v<T, std::string> || - std::is_same_v<T, std::string_view> || - std::is_same_v<T, const char *> || - std::is_same_v<T, char>) -constexpr void atom(string_builder &b, const T &t) { - b.escape_and_append_with_quotes(t); -} - -template <concepts::string_view_keyed_map T> - requires(!require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &m) { - if (m.empty()) { - b.append_raw("{}"); - return; - } - b.append('{'); - bool first = true; - for (const auto& [key, value] : m) { - if (!first) { - b.append(','); - } - first = false; - // Keys must be convertible to string_view per the concept - b.escape_and_append_with_quotes(key); - b.append(':'); - atom(b, value); - } - b.append('}'); -} - -template<typename number_type, - typename = typename std::enable_if<std::is_arithmetic<number_type>::value && !std::is_same_v<number_type, char>>::type> -constexpr void atom(string_builder &b, const number_type t) { - b.append(t); -} - -template <class T> - requires(std::is_class_v<T> && !concepts::container_but_not_string<T> && - !concepts::string_view_keyed_map<T> && - !concepts::optional_type<T> && - !concepts::smart_pointer<T> && - !concepts::appendable_containers<T> && - !std::is_same_v<T, std::string> && - !std::is_same_v<T, std::string_view> && - !std::is_same_v<T, const char*> && - !std::is_same_v<T, char> && !require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &t) { - int i = 0; - b.append('{'); - template for (constexpr auto dm : std::define_static_array(std::meta::nonstatic_data_members_of(^^T, std::meta::access_context::unchecked()))) { - if (i != 0) - b.append(','); - constexpr auto key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(dm))); - b.append_raw(key); - b.append(':'); - atom(b, t.[:dm:]); - i++; - }; - b.append('}'); +inline std::string_view trim(const std::string_view str) noexcept { + // We can almost surely do better by rolling our own find_first_not_of function. + size_t first = str.find_first_not_of(" \t\n\r"); + // If we have the empty string (just white space), then no trimming is possible, and + // we return the empty string_view. + if (std::string_view::npos == first) { return std::string_view(); } + size_t last = str.find_last_not_of(" \t\n\r"); + return str.substr(first, (last - first + 1)); } -// Support for optional types (std::optional, etc.) -template <concepts::optional_type T> - requires(!require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &opt) { - if (opt) { - atom(b, opt.value()); - } else { - b.append_raw("null"); - } -} -// Support for smart pointers (std::unique_ptr, std::shared_ptr, etc.) -template <concepts::smart_pointer T> - requires(!require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &ptr) { - if (ptr) { - atom(b, *ptr); - } else { - b.append_raw("null"); - } +inline simdjson_result<std::string_view> to_json_string(icelake::ondemand::document& x) noexcept { + std::string_view v; + auto error = x.raw_json().get(v); + if(error) {return error; } + return trim(v); } -// Support for enums - serialize as string representation using expand approach from P2996R12 -template <typename T> - requires(std::is_enum_v<T> && !require_custom_serialization<T>) -void atom(string_builder &b, const T &e) { -#if SIMDJSON_STATIC_REFLECTION - constexpr auto enumerators = std::define_static_array(std::meta::enumerators_of(^^T)); - template for (constexpr auto enum_val : enumerators) { - constexpr auto enum_str = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(enum_val))); - if (e == [:enum_val:]) { - b.append_raw(enum_str); - return; - } - }; - // Fallback to integer if enum value not found - atom(b, static_cast<std::underlying_type_t<T>>(e)); -#else - // Fallback: serialize as integer if reflection not available - atom(b, static_cast<std::underlying_type_t<T>>(e)); -#endif +inline simdjson_result<std::string_view> to_json_string(icelake::ondemand::document_reference& x) noexcept { + std::string_view v; + auto error = x.raw_json().get(v); + if(error) {return error; } + return trim(v); } -// Support for appendable containers that don't have operator[] (sets, etc.) -template <concepts::appendable_containers T> - requires(!concepts::container_but_not_string<T> && !concepts::string_view_keyed_map<T> && - !concepts::optional_type<T> && !concepts::smart_pointer<T> && - !std::is_same_v<T, std::string> && - !std::is_same_v<T, std::string_view> && !std::is_same_v<T, const char*> && !require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &container) { - if (container.empty()) { - b.append_raw("[]"); - return; - } - b.append('['); - bool first = true; - for (const auto& item : container) { - if (!first) { - b.append(','); +inline simdjson_result<std::string_view> to_json_string(icelake::ondemand::value& x) noexcept { + /** + * If we somehow receive a value that has already been consumed, + * then the following code could be in trouble. E.g., we create + * an array as needed, but if an array was already created, then + * it could be bad. + */ + using namespace icelake::ondemand; + icelake::ondemand::json_type t; + auto error = x.type().get(t); + if(error != SUCCESS) { return error; } + switch (t) + { + case json_type::array: + { + icelake::ondemand::array array; + error = x.get_array().get(array); + if(error) { return error; } + return to_json_string(array); } - first = false; - atom(b, item); - } - b.append(']'); -} - -// append functions that delegate to atom functions for primitive types -template <class T> - requires(std::is_arithmetic_v<T> && !std::is_same_v<T, char>) -void append(string_builder &b, const T &t) { - atom(b, t); -} - -template <class T> - requires(std::is_same_v<T, std::string> || - std::is_same_v<T, std::string_view> || - std::is_same_v<T, const char *> || - std::is_same_v<T, char>) -void append(string_builder &b, const T &t) { - atom(b, t); -} - -template <concepts::optional_type T> - requires(!require_custom_serialization<T>) -void append(string_builder &b, const T &t) { - atom(b, t); -} - -template <concepts::smart_pointer T> - requires(!require_custom_serialization<T>) -void append(string_builder &b, const T &t) { - atom(b, t); -} - -template <concepts::appendable_containers T> - requires(!concepts::container_but_not_string<T> && !concepts::string_view_keyed_map<T> && - !concepts::optional_type<T> && !concepts::smart_pointer<T> && - !std::is_same_v<T, std::string> && - !std::is_same_v<T, std::string_view> && !std::is_same_v<T, const char*> && !require_custom_serialization<T>) -void append(string_builder &b, const T &t) { - atom(b, t); -} - -template <concepts::string_view_keyed_map T> - requires(!require_custom_serialization<T>) -void append(string_builder &b, const T &t) { - atom(b, t); -} - -// works for struct -template <class Z> - requires(std::is_class_v<Z> && !concepts::container_but_not_string<Z> && - !concepts::string_view_keyed_map<Z> && - !concepts::optional_type<Z> && - !concepts::smart_pointer<Z> && - !concepts::appendable_containers<Z> && - !std::is_same_v<Z, std::string> && - !std::is_same_v<Z, std::string_view> && - !std::is_same_v<Z, const char*> && - !std::is_same_v<Z, char> && !require_custom_serialization<Z>) -void append(string_builder &b, const Z &z) { - int i = 0; - b.append('{'); - template for (constexpr auto dm : std::define_static_array(std::meta::nonstatic_data_members_of(^^Z, std::meta::access_context::unchecked()))) { - if (i != 0) - b.append(','); - constexpr auto key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(dm))); - b.append_raw(key); - b.append(':'); - atom(b, z.[:dm:]); - i++; - }; - b.append('}'); -} - -// works for container that have begin() and end() iterators -template <class Z> - requires(concepts::container_but_not_string<Z> && !require_custom_serialization<Z>) -void append(string_builder &b, const Z &z) { - auto it = z.begin(); - auto end = z.end(); - if (it == end) { - b.append_raw("[]"); - return; - } - b.append('['); - atom(b, *it); - ++it; - for (; it != end; ++it) { - b.append(','); - atom(b, *it); + case json_type::object: + { + icelake::ondemand::object object; + error = x.get_object().get(object); + if(error) { return error; } + return to_json_string(object); + } + default: + return trim(x.raw_json_token()); } - b.append(']'); } -template <class Z> - requires (require_custom_serialization<Z>) -void append(string_builder &b, const Z &z) { - b.append(z); +inline simdjson_result<std::string_view> to_json_string(icelake::ondemand::object& x) noexcept { + std::string_view v; + auto error = x.raw_json().get(v); + if(error) {return error; } + return trim(v); } - -template <class Z> -simdjson_warn_unused simdjson_result<std::string> to_json_string(const Z &z, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { - string_builder b(initial_capacity); - append(b, z); - std::string_view s; - if(auto e = b.view().get(s); e) { return e; } - return std::string(s); +inline simdjson_result<std::string_view> to_json_string(icelake::ondemand::array& x) noexcept { + std::string_view v; + auto error = x.raw_json().get(v); + if(error) {return error; } + return trim(v); } -template <class Z> -simdjson_warn_unused simdjson_error to_json(const Z &z, std::string &s, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { - string_builder b(initial_capacity); - append(b, z); - std::string_view view; - if(auto e = b.view().get(view); e) { return e; } - s.assign(view); - return SUCCESS; +inline simdjson_result<std::string_view> to_json_string(simdjson_result<icelake::ondemand::document> x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } -template <class Z> -string_builder& operator<<(string_builder& b, const Z& z) { - append(b, z); - return b; +inline simdjson_result<std::string_view> to_json_string(simdjson_result<icelake::ondemand::document_reference> x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } -// extract_from: Serialize only specific fields from a struct to JSON -template<constevalutil::fixed_string... FieldNames, typename T> - requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) -void extract_from(string_builder &b, const T &obj) { - // Helper to check if a field name matches any of the requested fields - auto should_extract = [](std::string_view field_name) constexpr -> bool { - return ((FieldNames.view() == field_name) || ...); - }; - - b.append('{'); - bool first = true; - - // Iterate through all members of T using reflection - template for (constexpr auto mem : std::define_static_array( - std::meta::nonstatic_data_members_of(^^T, std::meta::access_context::unchecked()))) { - - if constexpr (std::meta::is_public(mem)) { - constexpr std::string_view key = std::define_static_string(std::meta::identifier_of(mem)); +inline simdjson_result<std::string_view> to_json_string(simdjson_result<icelake::ondemand::value> x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); +} - // Only serialize this field if it's in our list of requested fields - if constexpr (should_extract(key)) { - if (!first) { - b.append(','); - } - first = false; +inline simdjson_result<std::string_view> to_json_string(simdjson_result<icelake::ondemand::object> x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); +} - // Serialize the key - constexpr auto quoted_key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(mem))); - b.append_raw(quoted_key); - b.append(':'); +inline simdjson_result<std::string_view> to_json_string(simdjson_result<icelake::ondemand::array> x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); +} +} // namespace simdjson - // Serialize the value - atom(b, obj.[:mem:]); - } - } - }; +namespace simdjson { namespace icelake { namespace ondemand { - b.append('}'); +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::icelake::ondemand::value x) { + std::string_view v; + auto error = simdjson::to_json_string(x).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + throw simdjson::simdjson_error(error); + } } - -template<constevalutil::fixed_string... FieldNames, typename T> - requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) -simdjson_warn_unused simdjson_result<std::string> extract_from(const T &obj, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { - string_builder b(initial_capacity); - extract_from<FieldNames...>(b, obj); - std::string_view s; - if(auto e = b.view().get(s); e) { return e; } - return std::string(s); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::icelake::ondemand::value> x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); +} +#else +inline std::ostream& operator<<(std::ostream& out, simdjson::icelake::ondemand::value x) { + std::string_view v; + auto error = simdjson::to_json_string(x).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + return (out << error); + } } +#endif -} // namespace builder -} // namespace haswell -// Alias the function template to 'to' in the global namespace -template <class Z> -simdjson_warn_unused simdjson_result<std::string> to_json(const Z &z, size_t initial_capacity = haswell::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { - haswell::builder::string_builder b(initial_capacity); - haswell::builder::append(b, z); - std::string_view s; - if(auto e = b.view().get(s); e) { return e; } - return std::string(s); +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::icelake::ondemand::array value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + throw simdjson::simdjson_error(error); + } } -template <class Z> -simdjson_warn_unused simdjson_error to_json(const Z &z, std::string &s, size_t initial_capacity = haswell::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { - haswell::builder::string_builder b(initial_capacity); - haswell::builder::append(b, z); - std::string_view view; - if(auto e = b.view().get(view); e) { return e; } - s.assign(view); - return SUCCESS; +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::icelake::ondemand::array> x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); } -// Global namespace function for extract_from -template<constevalutil::fixed_string... FieldNames, typename T> - requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) -simdjson_warn_unused simdjson_result<std::string> extract_from(const T &obj, size_t initial_capacity = haswell::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { - haswell::builder::string_builder b(initial_capacity); - haswell::builder::extract_from<FieldNames...>(b, obj); - std::string_view s; - if(auto e = b.view().get(s); e) { return e; } - return std::string(s); +#else +inline std::ostream& operator<<(std::ostream& out, simdjson::icelake::ondemand::array value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + return (out << error); + } } +#endif -} // namespace simdjson - -#endif // SIMDJSON_STATIC_REFLECTION +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::icelake::ondemand::document& value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + throw simdjson::simdjson_error(error); + } +} +inline std::ostream& operator<<(std::ostream& out, simdjson::icelake::ondemand::document_reference& value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + throw simdjson::simdjson_error(error); + } +} +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::icelake::ondemand::document>&& x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); +} +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::icelake::ondemand::document_reference>&& x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); +} +#else +inline std::ostream& operator<<(std::ostream& out, simdjson::icelake::ondemand::document& value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + return (out << error); + } +} +#endif +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::icelake::ondemand::object value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + throw simdjson::simdjson_error(error); + } +} +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::icelake::ondemand::object> x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); +} +#else +inline std::ostream& operator<<(std::ostream& out, simdjson::icelake::ondemand::object value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + return (out << error); + } +} #endif -/* end file simdjson/generic/ondemand/json_builder.h for haswell */ +}}} // namespace simdjson::icelake::ondemand + +#endif // SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H +/* end file simdjson/generic/ondemand/serialization-inl.h for icelake */ // JSON path accessor (compile-time) - must be after inline definitions -/* including simdjson/generic/ondemand/compile_time_accessors.h for haswell: #include "simdjson/generic/ondemand/compile_time_accessors.h" */ -/* begin file simdjson/generic/ondemand/compile_time_accessors.h for haswell */ +/* including simdjson/generic/ondemand/compile_time_accessors.h for icelake: #include "simdjson/generic/ondemand/compile_time_accessors.h" */ +/* begin file simdjson/generic/ondemand/compile_time_accessors.h for icelake */ /** * Compile-time JSON Path and JSON Pointer accessors using C++26 reflection (P2996) * @@ -77025,7 +114589,7 @@ simdjson_warn_unused simdjson_result<std::string> extract_from(const T &obj, siz #include <array> namespace simdjson { -namespace haswell { +namespace icelake { namespace ondemand { /*** * JSONPath implementation for compile-time access @@ -77036,7 +114600,7 @@ namespace json_path { // Note: value type must be fully defined before this header is included // This is ensured by including this in amalgamated.h after value-inl.h -using ::simdjson::haswell::ondemand::value; +using ::simdjson::icelake::ondemand::value; // Path step types enum class step_type { @@ -77170,7 +114734,7 @@ struct json_path_parser { // Compile-time path accessor generator template<typename T, constevalutil::fixed_string Path> struct path_accessor { - using value = ::simdjson::haswell::ondemand::value; + using value = ::simdjson::icelake::ondemand::value; static constexpr auto parser = json_path_parser<Path>(); static constexpr std::size_t num_steps = parser.count_steps(); @@ -77648,14 +115212,14 @@ struct path_accessor { // Compile-time path accessor with validation template<typename T, constevalutil::fixed_string Path, typename DocOrValue> -inline simdjson_result<::simdjson::haswell::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { +inline simdjson_result<::simdjson::icelake::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { using accessor = path_accessor<T, Path>; return accessor::access(doc_or_val); } // Overload without type parameter (no validation) template<constevalutil::fixed_string Path, typename DocOrValue> -inline simdjson_result<::simdjson::haswell::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { +inline simdjson_result<::simdjson::icelake::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { using accessor = path_accessor<void, Path>; return accessor::access(doc_or_val); } @@ -77886,158 +115450,121 @@ struct pointer_accessor { // Compile-time JSON Pointer accessor with validation template<typename T, constevalutil::fixed_string Pointer, typename DocOrValue> -inline simdjson_result<::simdjson::haswell::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { +inline simdjson_result<::simdjson::icelake::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { using accessor = pointer_accessor<T, Pointer>; return accessor::access(doc_or_val); } // Overload without type parameter (no validation) template<constevalutil::fixed_string Pointer, typename DocOrValue> -inline simdjson_result<::simdjson::haswell::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { +inline simdjson_result<::simdjson::icelake::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { using accessor = pointer_accessor<void, Pointer>; return accessor::access(doc_or_val); } } // namespace json_path } // namespace ondemand -} // namespace haswell +} // namespace icelake } // namespace simdjson #endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION #endif // SIMDJSON_GENERIC_ONDEMAND_COMPILE_TIME_ACCESSORS_H -/* end file simdjson/generic/ondemand/compile_time_accessors.h for haswell */ +/* end file simdjson/generic/ondemand/compile_time_accessors.h for icelake */ -/* end file simdjson/generic/ondemand/amalgamated.h for haswell */ -/* including simdjson/haswell/end.h: #include "simdjson/haswell/end.h" */ -/* begin file simdjson/haswell/end.h */ +/* end file simdjson/generic/ondemand/amalgamated.h for icelake */ +/* including simdjson/icelake/end.h: #include "simdjson/icelake/end.h" */ +/* begin file simdjson/icelake/end.h */ /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -#if !SIMDJSON_CAN_ALWAYS_RUN_HASWELL +#if !SIMDJSON_CAN_ALWAYS_RUN_ICELAKE SIMDJSON_UNTARGET_REGION #endif -/* undefining SIMDJSON_IMPLEMENTATION from "haswell" */ +/* undefining SIMDJSON_IMPLEMENTATION from "icelake" */ #undef SIMDJSON_IMPLEMENTATION -/* end file simdjson/haswell/end.h */ +/* end file simdjson/icelake/end.h */ -#endif // SIMDJSON_HASWELL_ONDEMAND_H -/* end file simdjson/haswell/ondemand.h */ -#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(icelake) -/* including simdjson/icelake/ondemand.h: #include "simdjson/icelake/ondemand.h" */ -/* begin file simdjson/icelake/ondemand.h */ -#ifndef SIMDJSON_ICELAKE_ONDEMAND_H -#define SIMDJSON_ICELAKE_ONDEMAND_H +#endif // SIMDJSON_ICELAKE_ONDEMAND_H +/* end file simdjson/icelake/ondemand.h */ +#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(ppc64) +/* including simdjson/ppc64/ondemand.h: #include "simdjson/ppc64/ondemand.h" */ +/* begin file simdjson/ppc64/ondemand.h */ +#ifndef SIMDJSON_PPC64_ONDEMAND_H +#define SIMDJSON_PPC64_ONDEMAND_H -/* including simdjson/icelake/begin.h: #include "simdjson/icelake/begin.h" */ -/* begin file simdjson/icelake/begin.h */ -/* defining SIMDJSON_IMPLEMENTATION to "icelake" */ -#define SIMDJSON_IMPLEMENTATION icelake -/* including simdjson/icelake/base.h: #include "simdjson/icelake/base.h" */ -/* begin file simdjson/icelake/base.h */ -#ifndef SIMDJSON_ICELAKE_BASE_H -#define SIMDJSON_ICELAKE_BASE_H +/* including simdjson/ppc64/begin.h: #include "simdjson/ppc64/begin.h" */ +/* begin file simdjson/ppc64/begin.h */ +/* defining SIMDJSON_IMPLEMENTATION to "ppc64" */ +#define SIMDJSON_IMPLEMENTATION ppc64 +/* including simdjson/ppc64/base.h: #include "simdjson/ppc64/base.h" */ +/* begin file simdjson/ppc64/base.h */ +#ifndef SIMDJSON_PPC64_BASE_H +#define SIMDJSON_PPC64_BASE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ /* amalgamation skipped (editor-only): #include "simdjson/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -// The constructor may be executed on any host, so we take care not to use SIMDJSON_TARGET_ICELAKE namespace simdjson { /** - * Implementation for Icelake (Intel AVX512). + * Implementation for ALTIVEC (PPC64). */ -namespace icelake { +namespace ppc64 { class implementation; -} // namespace icelake +namespace { +namespace simd { +template <typename T> struct simd8; +template <typename T> struct simd8x64; +} // namespace simd +} // unnamed namespace + +} // namespace ppc64 } // namespace simdjson -#endif // SIMDJSON_ICELAKE_BASE_H -/* end file simdjson/icelake/base.h */ -/* including simdjson/icelake/intrinsics.h: #include "simdjson/icelake/intrinsics.h" */ -/* begin file simdjson/icelake/intrinsics.h */ -#ifndef SIMDJSON_ICELAKE_INTRINSICS_H -#define SIMDJSON_ICELAKE_INTRINSICS_H +#endif // SIMDJSON_PPC64_BASE_H +/* end file simdjson/ppc64/base.h */ +/* including simdjson/ppc64/intrinsics.h: #include "simdjson/ppc64/intrinsics.h" */ +/* begin file simdjson/ppc64/intrinsics.h */ +#ifndef SIMDJSON_PPC64_INTRINSICS_H +#define SIMDJSON_PPC64_INTRINSICS_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -#if SIMDJSON_VISUAL_STUDIO -// under clang within visual studio, this will include <x86intrin.h> -#include <intrin.h> // visual studio or clang -#else -#include <x86intrin.h> // elsewhere -#endif // SIMDJSON_VISUAL_STUDIO - -#if SIMDJSON_CLANG_VISUAL_STUDIO -/** - * You are not supposed, normally, to include these - * headers directly. Instead you should either include intrin.h - * or x86intrin.h. However, when compiling with clang - * under Windows (i.e., when _MSC_VER is set), these headers - * only get included *if* the corresponding features are detected - * from macros: - * e.g., if __AVX2__ is set... in turn, we normally set these - * macros by compiling against the corresponding architecture - * (e.g., arch:AVX2, -mavx2, etc.) which compiles the whole - * software with these advanced instructions. In simdjson, we - * want to compile the whole program for a generic target, - * and only target our specific kernels. As a workaround, - * we directly include the needed headers. These headers would - * normally guard against such usage, but we carefully included - * <x86intrin.h> (or <intrin.h>) before, so the headers - * are fooled. - */ -#include <bmiintrin.h> // for _blsr_u64 -#include <lzcntintrin.h> // for __lzcnt64 -#include <immintrin.h> // for most things (AVX2, AVX512, _popcnt64) -#include <smmintrin.h> -#include <tmmintrin.h> -#include <avxintrin.h> -#include <avx2intrin.h> -#include <wmmintrin.h> // for _mm_clmulepi64_si128 -// Important: we need the AVX-512 headers: -#include <avx512fintrin.h> -#include <avx512dqintrin.h> -#include <avx512cdintrin.h> -#include <avx512bwintrin.h> -#include <avx512vlintrin.h> -#include <avx512vbmiintrin.h> -#include <avx512vbmi2intrin.h> -// unfortunately, we may not get _blsr_u64, but, thankfully, clang -// has it as a macro. -#ifndef _blsr_u64 -// we roll our own -#define _blsr_u64(n) ((n - 1) & n) -#endif // _blsr_u64 -#endif // SIMDJSON_CLANG_VISUAL_STUDIO - -static_assert(sizeof(__m512i) <= simdjson::SIMDJSON_PADDING, "insufficient padding for icelake"); +// This should be the correct header whether +// you use visual studio or other compilers. +#include <altivec.h> -#endif // SIMDJSON_ICELAKE_INTRINSICS_H -/* end file simdjson/icelake/intrinsics.h */ +// These are defined by altivec.h in GCC toolchain, it is safe to undef them. +#ifdef bool +#undef bool +#endif -#if !SIMDJSON_CAN_ALWAYS_RUN_ICELAKE -SIMDJSON_TARGET_REGION("avx512f,avx512dq,avx512cd,avx512bw,avx512vbmi,avx512vbmi2,avx512vl,avx2,bmi,pclmul,lzcnt,popcnt") +#ifdef vector +#undef vector #endif -/* including simdjson/icelake/bitmanipulation.h: #include "simdjson/icelake/bitmanipulation.h" */ -/* begin file simdjson/icelake/bitmanipulation.h */ -#ifndef SIMDJSON_ICELAKE_BITMANIPULATION_H -#define SIMDJSON_ICELAKE_BITMANIPULATION_H +static_assert(sizeof(__vector unsigned char) <= simdjson::SIMDJSON_PADDING, "insufficient padding for ppc64"); + +#endif // SIMDJSON_PPC64_INTRINSICS_H +/* end file simdjson/ppc64/intrinsics.h */ +/* including simdjson/ppc64/bitmanipulation.h: #include "simdjson/ppc64/bitmanipulation.h" */ +/* begin file simdjson/ppc64/bitmanipulation.h */ +#ifndef SIMDJSON_PPC64_BITMANIPULATION_H +#define SIMDJSON_PPC64_BITMANIPULATION_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/icelake/intrinsics.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace icelake { +namespace ppc64 { namespace { // We sometimes call trailing_zero on inputs that are zero, @@ -78050,43 +115577,52 @@ SIMDJSON_NO_SANITIZE_UNDEFINED SIMDJSON_NO_SANITIZE_MEMORY simdjson_inline int trailing_zeroes(uint64_t input_num) { #if SIMDJSON_REGULAR_VISUAL_STUDIO - return (int)_tzcnt_u64(input_num); -#else // SIMDJSON_REGULAR_VISUAL_STUDIO - //////// - // You might expect the next line to be equivalent to - // return (int)_tzcnt_u64(input_num); - // but the generated code differs and might be less efficient? - //////// + unsigned long ret; + // Search the mask data from least significant bit (LSB) + // to the most significant bit (MSB) for a set bit (1). + _BitScanForward64(&ret, input_num); + return (int)ret; +#else // SIMDJSON_REGULAR_VISUAL_STUDIO return __builtin_ctzll(input_num); #endif // SIMDJSON_REGULAR_VISUAL_STUDIO } /* result might be undefined when input_num is zero */ simdjson_inline uint64_t clear_lowest_bit(uint64_t input_num) { - return _blsr_u64(input_num); + return input_num & (input_num - 1); } /* result might be undefined when input_num is zero */ simdjson_inline int leading_zeroes(uint64_t input_num) { - return int(_lzcnt_u64(input_num)); +#if SIMDJSON_REGULAR_VISUAL_STUDIO + unsigned long leading_zero = 0; + // Search the mask data from most significant bit (MSB) + // to least significant bit (LSB) for a set bit (1). + if (_BitScanReverse64(&leading_zero, input_num)) + return (int)(63 - leading_zero); + else + return 64; +#else + return __builtin_clzll(input_num); +#endif // SIMDJSON_REGULAR_VISUAL_STUDIO } #if SIMDJSON_REGULAR_VISUAL_STUDIO -simdjson_inline unsigned __int64 count_ones(uint64_t input_num) { - // note: we do not support legacy 32-bit Windows - return __popcnt64(input_num);// Visual Studio wants two underscores +simdjson_inline int count_ones(uint64_t input_num) { + // note: we do not support legacy 32-bit Windows in this kernel + return __popcnt64(input_num); // Visual Studio wants two underscores } #else -simdjson_inline long long int count_ones(uint64_t input_num) { - return _popcnt64(input_num); +simdjson_inline int count_ones(uint64_t input_num) { + return __builtin_popcountll(input_num); } #endif simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2, - uint64_t *result) { + uint64_t *result) { #if SIMDJSON_REGULAR_VISUAL_STUDIO - return _addcarry_u64(0, value1, value2, - reinterpret_cast<unsigned __int64 *>(result)); + *result = value1 + value2; + return *result < value1; #else return __builtin_uaddll_overflow(value1, value2, reinterpret_cast<unsigned long long *>(result)); @@ -78094,533 +115630,99 @@ simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2, } } // unnamed namespace -} // namespace icelake +} // namespace ppc64 } // namespace simdjson -#endif // SIMDJSON_ICELAKE_BITMANIPULATION_H -/* end file simdjson/icelake/bitmanipulation.h */ -/* including simdjson/icelake/bitmask.h: #include "simdjson/icelake/bitmask.h" */ -/* begin file simdjson/icelake/bitmask.h */ -#ifndef SIMDJSON_ICELAKE_BITMASK_H -#define SIMDJSON_ICELAKE_BITMASK_H +#endif // SIMDJSON_PPC64_BITMANIPULATION_H +/* end file simdjson/ppc64/bitmanipulation.h */ +/* including simdjson/ppc64/bitmask.h: #include "simdjson/ppc64/bitmask.h" */ +/* begin file simdjson/ppc64/bitmask.h */ +#ifndef SIMDJSON_PPC64_BITMASK_H +#define SIMDJSON_PPC64_BITMASK_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/icelake/intrinsics.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace icelake { +namespace ppc64 { namespace { // -// Perform a "cumulative bitwise xor," flipping bits each time a 1 is encountered. +// Perform a "cumulative bitwise xor," flipping bits each time a 1 is +// encountered. // // For example, prefix_xor(00100100) == 00011100 // -simdjson_inline uint64_t prefix_xor(const uint64_t bitmask) { - // There should be no such thing with a processor supporting avx2 - // but not clmul. - __m128i all_ones = _mm_set1_epi8('\xFF'); - __m128i result = _mm_clmulepi64_si128(_mm_set_epi64x(0ULL, bitmask), all_ones, 0); - return _mm_cvtsi128_si64(result); -} - -} // unnamed namespace -} // namespace icelake -} // namespace simdjson - -#endif // SIMDJSON_ICELAKE_BITMASK_H -/* end file simdjson/icelake/bitmask.h */ -/* including simdjson/icelake/simd.h: #include "simdjson/icelake/simd.h" */ -/* begin file simdjson/icelake/simd.h */ -#ifndef SIMDJSON_ICELAKE_SIMD_H -#define SIMDJSON_ICELAKE_SIMD_H - -/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/icelake/intrinsics.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/icelake/bitmanipulation.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */ -/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ - -#if defined(__GNUC__) && !defined(__clang__) -#if __GNUC__ == 8 -#define SIMDJSON_GCC8 1 -#endif // __GNUC__ == 8 -#endif // defined(__GNUC__) && !defined(__clang__) - -#if SIMDJSON_GCC8 -/** - * GCC 8 fails to provide _mm512_set_epi8. We roll our own. - */ -inline __m512i _mm512_set_epi8(uint8_t a0, uint8_t a1, uint8_t a2, uint8_t a3, uint8_t a4, uint8_t a5, uint8_t a6, uint8_t a7, uint8_t a8, uint8_t a9, uint8_t a10, uint8_t a11, uint8_t a12, uint8_t a13, uint8_t a14, uint8_t a15, uint8_t a16, uint8_t a17, uint8_t a18, uint8_t a19, uint8_t a20, uint8_t a21, uint8_t a22, uint8_t a23, uint8_t a24, uint8_t a25, uint8_t a26, uint8_t a27, uint8_t a28, uint8_t a29, uint8_t a30, uint8_t a31, uint8_t a32, uint8_t a33, uint8_t a34, uint8_t a35, uint8_t a36, uint8_t a37, uint8_t a38, uint8_t a39, uint8_t a40, uint8_t a41, uint8_t a42, uint8_t a43, uint8_t a44, uint8_t a45, uint8_t a46, uint8_t a47, uint8_t a48, uint8_t a49, uint8_t a50, uint8_t a51, uint8_t a52, uint8_t a53, uint8_t a54, uint8_t a55, uint8_t a56, uint8_t a57, uint8_t a58, uint8_t a59, uint8_t a60, uint8_t a61, uint8_t a62, uint8_t a63) { - return _mm512_set_epi64(uint64_t(a7) + (uint64_t(a6) << 8) + (uint64_t(a5) << 16) + (uint64_t(a4) << 24) + (uint64_t(a3) << 32) + (uint64_t(a2) << 40) + (uint64_t(a1) << 48) + (uint64_t(a0) << 56), - uint64_t(a15) + (uint64_t(a14) << 8) + (uint64_t(a13) << 16) + (uint64_t(a12) << 24) + (uint64_t(a11) << 32) + (uint64_t(a10) << 40) + (uint64_t(a9) << 48) + (uint64_t(a8) << 56), - uint64_t(a23) + (uint64_t(a22) << 8) + (uint64_t(a21) << 16) + (uint64_t(a20) << 24) + (uint64_t(a19) << 32) + (uint64_t(a18) << 40) + (uint64_t(a17) << 48) + (uint64_t(a16) << 56), - uint64_t(a31) + (uint64_t(a30) << 8) + (uint64_t(a29) << 16) + (uint64_t(a28) << 24) + (uint64_t(a27) << 32) + (uint64_t(a26) << 40) + (uint64_t(a25) << 48) + (uint64_t(a24) << 56), - uint64_t(a39) + (uint64_t(a38) << 8) + (uint64_t(a37) << 16) + (uint64_t(a36) << 24) + (uint64_t(a35) << 32) + (uint64_t(a34) << 40) + (uint64_t(a33) << 48) + (uint64_t(a32) << 56), - uint64_t(a47) + (uint64_t(a46) << 8) + (uint64_t(a45) << 16) + (uint64_t(a44) << 24) + (uint64_t(a43) << 32) + (uint64_t(a42) << 40) + (uint64_t(a41) << 48) + (uint64_t(a40) << 56), - uint64_t(a55) + (uint64_t(a54) << 8) + (uint64_t(a53) << 16) + (uint64_t(a52) << 24) + (uint64_t(a51) << 32) + (uint64_t(a50) << 40) + (uint64_t(a49) << 48) + (uint64_t(a48) << 56), - uint64_t(a63) + (uint64_t(a62) << 8) + (uint64_t(a61) << 16) + (uint64_t(a60) << 24) + (uint64_t(a59) << 32) + (uint64_t(a58) << 40) + (uint64_t(a57) << 48) + (uint64_t(a56) << 56)); +simdjson_inline uint64_t prefix_xor(uint64_t bitmask) { + // You can use the version below, however gcc sometimes miscompiles + // vec_pmsum_be, it happens somewhere around between 8 and 9th version. + // The performance boost was not noticeable, falling back to a usual + // implementation. + // __vector unsigned long long all_ones = {~0ull, ~0ull}; + // __vector unsigned long long mask = {bitmask, 0}; + // // Clang and GCC return different values for pmsum for ull so cast it to one. + // // Generally it is not specified by ALTIVEC ISA what is returned by + // // vec_pmsum_be. + // #if defined(__LITTLE_ENDIAN__) + // return (uint64_t)(((__vector unsigned long long)vec_pmsum_be(all_ones, mask))[0]); + // #else + // return (uint64_t)(((__vector unsigned long long)vec_pmsum_be(all_ones, mask))[1]); + // #endif + bitmask ^= bitmask << 1; + bitmask ^= bitmask << 2; + bitmask ^= bitmask << 4; + bitmask ^= bitmask << 8; + bitmask ^= bitmask << 16; + bitmask ^= bitmask << 32; + return bitmask; } -#endif // SIMDJSON_GCC8 - - - -namespace simdjson { -namespace icelake { -namespace { -namespace simd { - - // Forward-declared so they can be used by splat and friends. - template<typename Child> - struct base { - __m512i value; - - // Zero constructor - simdjson_inline base() : value{__m512i()} {} - - // Conversion from SIMD register - simdjson_inline base(const __m512i _value) : value(_value) {} - - // Conversion to SIMD register - simdjson_inline operator const __m512i&() const { return this->value; } - simdjson_inline operator __m512i&() { return this->value; } - - // Bit operations - simdjson_inline Child operator|(const Child other) const { return _mm512_or_si512(*this, other); } - simdjson_inline Child operator&(const Child other) const { return _mm512_and_si512(*this, other); } - simdjson_inline Child operator^(const Child other) const { return _mm512_xor_si512(*this, other); } - simdjson_inline Child bit_andnot(const Child other) const { return _mm512_andnot_si512(other, *this); } - simdjson_inline Child& operator|=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast | other; return *this_cast; } - simdjson_inline Child& operator&=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast & other; return *this_cast; } - simdjson_inline Child& operator^=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast ^ other; return *this_cast; } - }; - - // Forward-declared so they can be used by splat and friends. - template<typename T> - struct simd8; - - template<typename T, typename Mask=simd8<bool>> - struct base8: base<simd8<T>> { - typedef uint32_t bitmask_t; - typedef uint64_t bitmask2_t; - - simdjson_inline base8() : base<simd8<T>>() {} - simdjson_inline base8(const __m512i _value) : base<simd8<T>>(_value) {} - - friend simdjson_really_inline uint64_t operator==(const simd8<T> lhs, const simd8<T> rhs) { - return _mm512_cmpeq_epi8_mask(lhs, rhs); - } - static const int SIZE = sizeof(base<T>::value); - - template<int N=1> - simdjson_inline simd8<T> prev(const simd8<T> prev_chunk) const { - // workaround for compilers unable to figure out that 16 - N is a constant (GCC 8) - constexpr int shift = 16 - N; - return _mm512_alignr_epi8(*this, _mm512_permutex2var_epi64(prev_chunk, _mm512_set_epi64(13, 12, 11, 10, 9, 8, 7, 6), *this), shift); - } - }; - - // SIMD byte mask type (returned by things like eq and gt) - template<> - struct simd8<bool>: base8<bool> { - static simdjson_inline simd8<bool> splat(bool _value) { return _mm512_set1_epi8(uint8_t(-(!!_value))); } - - simdjson_inline simd8() : base8() {} - simdjson_inline simd8(const __m512i _value) : base8<bool>(_value) {} - // Splat constructor - simdjson_inline simd8(bool _value) : base8<bool>(splat(_value)) {} - simdjson_inline bool any() const { return !!_mm512_test_epi8_mask (*this, *this); } - simdjson_inline simd8<bool> operator~() const { return *this ^ true; } - }; - - template<typename T> - struct base8_numeric: base8<T> { - static simdjson_inline simd8<T> splat(T _value) { return _mm512_set1_epi8(_value); } - static simdjson_inline simd8<T> zero() { return _mm512_setzero_si512(); } - static simdjson_inline simd8<T> load(const T values[64]) { - return _mm512_loadu_si512(reinterpret_cast<const __m512i *>(values)); - } - // Repeat 16 values as many times as necessary (usually for lookup tables) - static simdjson_inline simd8<T> repeat_16( - T v0, T v1, T v2, T v3, T v4, T v5, T v6, T v7, - T v8, T v9, T v10, T v11, T v12, T v13, T v14, T v15 - ) { - return simd8<T>( - v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15, - v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15, - v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15, - v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15 - ); - } - - simdjson_inline base8_numeric() : base8<T>() {} - simdjson_inline base8_numeric(const __m512i _value) : base8<T>(_value) {} - - // Store to array - simdjson_inline void store(T dst[64]) const { return _mm512_storeu_si512(reinterpret_cast<__m512i *>(dst), *this); } - - // Addition/subtraction are the same for signed and unsigned - simdjson_inline simd8<T> operator+(const simd8<T> other) const { return _mm512_add_epi8(*this, other); } - simdjson_inline simd8<T> operator-(const simd8<T> other) const { return _mm512_sub_epi8(*this, other); } - simdjson_inline simd8<T>& operator+=(const simd8<T> other) { *this = *this + other; return *static_cast<simd8<T>*>(this); } - simdjson_inline simd8<T>& operator-=(const simd8<T> other) { *this = *this - other; return *static_cast<simd8<T>*>(this); } - - // Override to distinguish from bool version - simdjson_inline simd8<T> operator~() const { return *this ^ 0xFFu; } - - // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values) - template<typename L> - simdjson_inline simd8<L> lookup_16(simd8<L> lookup_table) const { - return _mm512_shuffle_epi8(lookup_table, *this); - } - - // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted as a bitset). - // Passing a 0 value for mask would be equivalent to writing out every byte to output. - // Only the first 64 - count_ones(mask) bytes of the result are significant but 64 bytes - // get written. - // Design consideration: it seems like a function with the - // signature simd8<L> compress(uint32_t mask) would be - // sensible, but the AVX ISA makes this kind of approach difficult. - template<typename L> - simdjson_inline void compress(uint64_t mask, L * output) const { - // we deliberately avoid _mm512_mask_compressstoreu_epi8 for portability - // (AMD Zen4 has terrible performance with it, it is effectively broken) - // _mm512_mask_compressstoreu_epi8 (output,~mask,*this); - __m512i compressed = _mm512_maskz_compress_epi8(~mask, *this); - _mm512_storeu_si512(output, compressed); // could use a mask - } - - template<typename L> - simdjson_inline simd8<L> lookup_16( - L replace0, L replace1, L replace2, L replace3, - L replace4, L replace5, L replace6, L replace7, - L replace8, L replace9, L replace10, L replace11, - L replace12, L replace13, L replace14, L replace15) const { - return lookup_16(simd8<L>::repeat_16( - replace0, replace1, replace2, replace3, - replace4, replace5, replace6, replace7, - replace8, replace9, replace10, replace11, - replace12, replace13, replace14, replace15 - )); - } - }; - - // Signed bytes - template<> - struct simd8<int8_t> : base8_numeric<int8_t> { - simdjson_inline simd8() : base8_numeric<int8_t>() {} - simdjson_inline simd8(const __m512i _value) : base8_numeric<int8_t>(_value) {} - // Splat constructor - simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {} - // Array constructor - simdjson_inline simd8(const int8_t values[64]) : simd8(load(values)) {} - // Member-by-member initialization - simdjson_inline simd8( - int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, - int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15, - int8_t v16, int8_t v17, int8_t v18, int8_t v19, int8_t v20, int8_t v21, int8_t v22, int8_t v23, - int8_t v24, int8_t v25, int8_t v26, int8_t v27, int8_t v28, int8_t v29, int8_t v30, int8_t v31, - int8_t v32, int8_t v33, int8_t v34, int8_t v35, int8_t v36, int8_t v37, int8_t v38, int8_t v39, - int8_t v40, int8_t v41, int8_t v42, int8_t v43, int8_t v44, int8_t v45, int8_t v46, int8_t v47, - int8_t v48, int8_t v49, int8_t v50, int8_t v51, int8_t v52, int8_t v53, int8_t v54, int8_t v55, - int8_t v56, int8_t v57, int8_t v58, int8_t v59, int8_t v60, int8_t v61, int8_t v62, int8_t v63 - ) : simd8(_mm512_set_epi8( - v63, v62, v61, v60, v59, v58, v57, v56, - v55, v54, v53, v52, v51, v50, v49, v48, - v47, v46, v45, v44, v43, v42, v41, v40, - v39, v38, v37, v36, v35, v34, v33, v32, - v31, v30, v29, v28, v27, v26, v25, v24, - v23, v22, v21, v20, v19, v18, v17, v16, - v15, v14, v13, v12, v11, v10, v9, v8, - v7, v6, v5, v4, v3, v2, v1, v0 - )) {} - - // Repeat 16 values as many times as necessary (usually for lookup tables) - simdjson_inline static simd8<int8_t> repeat_16( - int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, - int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 - ) { - return simd8<int8_t>( - v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15, - v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15, - v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15, - v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15 - ); - } - - // Order-sensitive comparisons - simdjson_inline simd8<int8_t> max_val(const simd8<int8_t> other) const { return _mm512_max_epi8(*this, other); } - simdjson_inline simd8<int8_t> min_val(const simd8<int8_t> other) const { return _mm512_min_epi8(*this, other); } - - simdjson_inline simd8<bool> operator>(const simd8<int8_t> other) const { return _mm512_maskz_abs_epi8(_mm512_cmpgt_epi8_mask(*this, other),_mm512_set1_epi8(uint8_t(0x80))); } - simdjson_inline simd8<bool> operator<(const simd8<int8_t> other) const { return _mm512_maskz_abs_epi8(_mm512_cmpgt_epi8_mask(other, *this),_mm512_set1_epi8(uint8_t(0x80))); } - }; - - // Unsigned bytes - template<> - struct simd8<uint8_t>: base8_numeric<uint8_t> { - simdjson_inline simd8() : base8_numeric<uint8_t>() {} - simdjson_inline simd8(const __m512i _value) : base8_numeric<uint8_t>(_value) {} - // Splat constructor - simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {} - // Array constructor - simdjson_inline simd8(const uint8_t values[64]) : simd8(load(values)) {} - // Member-by-member initialization - simdjson_inline simd8( - uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, - uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15, - uint8_t v16, uint8_t v17, uint8_t v18, uint8_t v19, uint8_t v20, uint8_t v21, uint8_t v22, uint8_t v23, - uint8_t v24, uint8_t v25, uint8_t v26, uint8_t v27, uint8_t v28, uint8_t v29, uint8_t v30, uint8_t v31, - uint8_t v32, uint8_t v33, uint8_t v34, uint8_t v35, uint8_t v36, uint8_t v37, uint8_t v38, uint8_t v39, - uint8_t v40, uint8_t v41, uint8_t v42, uint8_t v43, uint8_t v44, uint8_t v45, uint8_t v46, uint8_t v47, - uint8_t v48, uint8_t v49, uint8_t v50, uint8_t v51, uint8_t v52, uint8_t v53, uint8_t v54, uint8_t v55, - uint8_t v56, uint8_t v57, uint8_t v58, uint8_t v59, uint8_t v60, uint8_t v61, uint8_t v62, uint8_t v63 - ) : simd8(_mm512_set_epi8( - v63, v62, v61, v60, v59, v58, v57, v56, - v55, v54, v53, v52, v51, v50, v49, v48, - v47, v46, v45, v44, v43, v42, v41, v40, - v39, v38, v37, v36, v35, v34, v33, v32, - v31, v30, v29, v28, v27, v26, v25, v24, - v23, v22, v21, v20, v19, v18, v17, v16, - v15, v14, v13, v12, v11, v10, v9, v8, - v7, v6, v5, v4, v3, v2, v1, v0 - )) {} - - // Repeat 16 values as many times as necessary (usually for lookup tables) - simdjson_inline static simd8<uint8_t> repeat_16( - uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, - uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 - ) { - return simd8<uint8_t>( - v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15, - v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15, - v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15, - v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15 - ); - } - - // Saturated math - simdjson_inline simd8<uint8_t> saturating_add(const simd8<uint8_t> other) const { return _mm512_adds_epu8(*this, other); } - simdjson_inline simd8<uint8_t> saturating_sub(const simd8<uint8_t> other) const { return _mm512_subs_epu8(*this, other); } - - // Order-specific operations - simdjson_inline simd8<uint8_t> max_val(const simd8<uint8_t> other) const { return _mm512_max_epu8(*this, other); } - simdjson_inline simd8<uint8_t> min_val(const simd8<uint8_t> other) const { return _mm512_min_epu8(other, *this); } - // Same as >, but only guarantees true is nonzero (< guarantees true = -1) - simdjson_inline simd8<uint8_t> gt_bits(const simd8<uint8_t> other) const { return this->saturating_sub(other); } - // Same as <, but only guarantees true is nonzero (< guarantees true = -1) - simdjson_inline simd8<uint8_t> lt_bits(const simd8<uint8_t> other) const { return other.saturating_sub(*this); } - simdjson_inline uint64_t operator<=(const simd8<uint8_t> other) const { return other.max_val(*this) == other; } - simdjson_inline uint64_t operator>=(const simd8<uint8_t> other) const { return other.min_val(*this) == other; } - simdjson_inline simd8<bool> operator>(const simd8<uint8_t> other) const { return this->gt_bits(other).any_bits_set(); } - simdjson_inline simd8<bool> operator<(const simd8<uint8_t> other) const { return this->lt_bits(other).any_bits_set(); } - - // Bit-specific operations - simdjson_inline simd8<bool> bits_not_set() const { return _mm512_mask_blend_epi8(*this == uint8_t(0), _mm512_set1_epi8(0), _mm512_set1_epi8(-1)); } - simdjson_inline simd8<bool> bits_not_set(simd8<uint8_t> bits) const { return (*this & bits).bits_not_set(); } - simdjson_inline simd8<bool> any_bits_set() const { return ~this->bits_not_set(); } - simdjson_inline simd8<bool> any_bits_set(simd8<uint8_t> bits) const { return ~this->bits_not_set(bits); } - - simdjson_inline bool is_ascii() const { return _mm512_movepi8_mask(*this) == 0; } - simdjson_inline bool bits_not_set_anywhere() const { - return !_mm512_test_epi8_mask(*this, *this); - } - simdjson_inline bool any_bits_set_anywhere() const { return !bits_not_set_anywhere(); } - simdjson_inline bool bits_not_set_anywhere(simd8<uint8_t> bits) const { return !_mm512_test_epi8_mask(*this, bits); } - simdjson_inline bool any_bits_set_anywhere(simd8<uint8_t> bits) const { return !bits_not_set_anywhere(bits); } - template<int N> - simdjson_inline simd8<uint8_t> shr() const { return simd8<uint8_t>(_mm512_srli_epi16(*this, N)) & uint8_t(0xFFu >> N); } - template<int N> - simdjson_inline simd8<uint8_t> shl() const { return simd8<uint8_t>(_mm512_slli_epi16(*this, N)) & uint8_t(0xFFu << N); } - // Get one of the bits and make a bitmask out of it. - // e.g. value.get_bit<7>() gets the high bit - template<int N> - simdjson_inline uint64_t get_bit() const { return _mm512_movepi8_mask(_mm512_slli_epi16(*this, 7-N)); } - }; - - template<typename T> - struct simd8x64 { - static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<T>); - static_assert(NUM_CHUNKS == 1, "Icelake kernel should use one register per 64-byte block."); - const simd8<T> chunks[NUM_CHUNKS]; - - simd8x64(const simd8x64<T>& o) = delete; // no copy allowed - simd8x64<T>& operator=(const simd8<T>& other) = delete; // no assignment allowed - simd8x64() = delete; // no default constructor allowed - - simdjson_inline simd8x64(const simd8<T> chunk0, const simd8<T> chunk1) : chunks{chunk0, chunk1} {} - simdjson_inline simd8x64(const simd8<T> chunk0) : chunks{chunk0} {} - simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8<T>::load(ptr)} {} - - simdjson_inline uint64_t compress(uint64_t mask, T * output) const { - this->chunks[0].compress(mask, output); - return 64 - count_ones(mask); - } - - simdjson_inline void store(T ptr[64]) const { - this->chunks[0].store(ptr+sizeof(simd8<T>)*0); - } - - simdjson_inline simd8<T> reduce_or() const { - return this->chunks[0]; - } - - simdjson_inline simd8x64<T> bit_or(const T m) const { - const simd8<T> mask = simd8<T>::splat(m); - return simd8x64<T>( - this->chunks[0] | mask - ); - } - - simdjson_inline uint64_t eq(const T m) const { - const simd8<T> mask = simd8<T>::splat(m); - return this->chunks[0] == mask; - } - - simdjson_inline uint64_t eq(const simd8x64<uint8_t> &other) const { - return this->chunks[0] == other.chunks[0]; - } - - simdjson_inline uint64_t lteq(const T m) const { - const simd8<T> mask = simd8<T>::splat(m); - return this->chunks[0] <= mask; - } - }; // struct simd8x64<T> - -} // namespace simd } // unnamed namespace -} // namespace icelake +} // namespace ppc64 } // namespace simdjson -#endif // SIMDJSON_ICELAKE_SIMD_H -/* end file simdjson/icelake/simd.h */ -/* including simdjson/icelake/stringparsing_defs.h: #include "simdjson/icelake/stringparsing_defs.h" */ -/* begin file simdjson/icelake/stringparsing_defs.h */ -#ifndef SIMDJSON_ICELAKE_STRINGPARSING_DEFS_H -#define SIMDJSON_ICELAKE_STRINGPARSING_DEFS_H +#endif +/* end file simdjson/ppc64/bitmask.h */ +/* including simdjson/ppc64/numberparsing_defs.h: #include "simdjson/ppc64/numberparsing_defs.h" */ +/* begin file simdjson/ppc64/numberparsing_defs.h */ +#ifndef SIMDJSON_PPC64_NUMBERPARSING_DEFS_H +#define SIMDJSON_PPC64_NUMBERPARSING_DEFS_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/icelake/simd.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/icelake/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/intrinsics.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -namespace simdjson { -namespace icelake { -namespace { - -using namespace simd; - -// Holds backslashes and quotes locations. -struct backslash_and_quote { -public: - static constexpr uint32_t BYTES_PROCESSED = 64; - simdjson_inline backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst); - - simdjson_inline bool has_quote_first() { return ((bs_bits - 1) & quote_bits) != 0; } - simdjson_inline bool has_backslash() { return ((quote_bits - 1) & bs_bits) != 0; } - simdjson_inline int quote_index() { return trailing_zeroes(quote_bits); } - simdjson_inline int backslash_index() { return trailing_zeroes(bs_bits); } - - uint64_t bs_bits; - uint64_t quote_bits; -}; // struct backslash_and_quote - -simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) { - // this can read up to 15 bytes beyond the buffer size, but we require - // SIMDJSON_PADDING of padding - static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "backslash and quote finder must process fewer than SIMDJSON_PADDING bytes"); - simd8<uint8_t> v(src); - // store to dest unconditionally - we can overwrite the bits we don't like later - v.store(dst); - return { - static_cast<uint64_t>(v == '\\'), // bs_bits - static_cast<uint64_t>(v == '"'), // quote_bits - }; -} - - - -struct escaping { - static constexpr uint32_t BYTES_PROCESSED = 64; - simdjson_inline static escaping copy_and_find(const uint8_t *src, uint8_t *dst); - - simdjson_inline bool has_escape() { return escape_bits != 0; } - simdjson_inline int escape_index() { return trailing_zeroes(uint64_t(escape_bits)); } - - __mmask64 escape_bits; -}; // struct escaping - - - -simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *dst) { - static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "escaping finder must process fewer than SIMDJSON_PADDING bytes"); - simd8<uint8_t> v(src); - v.store(dst); - __mmask64 is_quote = _mm512_cmpeq_epi8_mask(v, _mm512_set1_epi8('"')); - __mmask64 is_backslash = _mm512_cmpeq_epi8_mask(v, _mm512_set1_epi8('\\')); - __mmask64 is_control = _mm512_cmplt_epi8_mask(v, _mm512_set1_epi8(32)); - return { - (is_backslash | is_quote | is_control) - }; -} - - - - -} // unnamed namespace -} // namespace icelake -} // namespace simdjson - -#endif // SIMDJSON_ICELAKE_STRINGPARSING_DEFS_H -/* end file simdjson/icelake/stringparsing_defs.h */ -/* including simdjson/icelake/numberparsing_defs.h: #include "simdjson/icelake/numberparsing_defs.h" */ -/* begin file simdjson/icelake/numberparsing_defs.h */ -#ifndef SIMDJSON_ICELAKE_NUMBERPARSING_DEFS_H -#define SIMDJSON_ICELAKE_NUMBERPARSING_DEFS_H +#include <cstring> -/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/icelake/intrinsics.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */ -/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ +#if defined(__linux__) +#include <byteswap.h> +#elif defined(__FreeBSD__) +#include <sys/endian.h> +#endif namespace simdjson { -namespace icelake { +namespace ppc64 { namespace numberparsing { +// we don't have appropriate instructions, so let us use a scalar function +// credit: https://johnnylee-sde.github.io/Fast-numeric-string-to-int/ +/** @private */ static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) { - // this actually computes *16* values so we are being wasteful. - const __m128i ascii0 = _mm_set1_epi8('0'); - const __m128i mul_1_10 = - _mm_setr_epi8(10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1); - const __m128i mul_1_100 = _mm_setr_epi16(100, 1, 100, 1, 100, 1, 100, 1); - const __m128i mul_1_10000 = - _mm_setr_epi16(10000, 1, 10000, 1, 10000, 1, 10000, 1); - const __m128i input = _mm_sub_epi8( - _mm_loadu_si128(reinterpret_cast<const __m128i *>(chars)), ascii0); - const __m128i t1 = _mm_maddubs_epi16(input, mul_1_10); - const __m128i t2 = _mm_madd_epi16(t1, mul_1_100); - const __m128i t3 = _mm_packus_epi32(t2, t2); - const __m128i t4 = _mm_madd_epi16(t3, mul_1_10000); - return _mm_cvtsi128_si32( - t4); // only captures the sum of the first 8 digits, drop the rest + uint64_t val; + std::memcpy(&val, chars, sizeof(uint64_t)); +#ifdef __BIG_ENDIAN__ +#if defined(__linux__) + val = bswap_64(val); +#elif defined(__FreeBSD__) + val = bswap64(val); +#endif +#endif + val = (val & 0x0F0F0F0F0F0F0F0F) * 2561 >> 8; + val = (val & 0x00FF00FF00FF00FF) * 6553601 >> 16; + return uint32_t((val & 0x0000FFFF0000FFFF) * 42949672960001 >> 32); } /** @private */ @@ -78643,23 +115745,601 @@ simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t } } // namespace numberparsing -} // namespace icelake +} // namespace ppc64 } // namespace simdjson +#ifndef SIMDJSON_SWAR_NUMBER_PARSING +#if SIMDJSON_IS_BIG_ENDIAN +#define SIMDJSON_SWAR_NUMBER_PARSING 0 +#else #define SIMDJSON_SWAR_NUMBER_PARSING 1 +#endif +#endif -#endif // SIMDJSON_ICELAKE_NUMBERPARSING_DEFS_H -/* end file simdjson/icelake/numberparsing_defs.h */ -/* end file simdjson/icelake/begin.h */ -/* including simdjson/generic/ondemand/amalgamated.h for icelake: #include "simdjson/generic/ondemand/amalgamated.h" */ -/* begin file simdjson/generic/ondemand/amalgamated.h for icelake */ -#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_ONDEMAND_DEPENDENCIES_H) +#endif // SIMDJSON_PPC64_NUMBERPARSING_DEFS_H +/* end file simdjson/ppc64/numberparsing_defs.h */ +/* including simdjson/ppc64/simd.h: #include "simdjson/ppc64/simd.h" */ +/* begin file simdjson/ppc64/simd.h */ +#ifndef SIMDJSON_PPC64_SIMD_H +#define SIMDJSON_PPC64_SIMD_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#include <type_traits> + +namespace simdjson { +namespace ppc64 { +namespace { +namespace simd { + +using __m128i = __vector unsigned char; + +template <typename Child> struct base { + __m128i value; + + // Zero constructor + simdjson_inline base() : value{__m128i()} {} + + // Conversion from SIMD register + simdjson_inline base(const __m128i _value) : value(_value) {} + + // Conversion to SIMD register + simdjson_inline operator const __m128i &() const { + return this->value; + } + simdjson_inline operator __m128i &() { return this->value; } + + // Bit operations + simdjson_inline Child operator|(const Child other) const { + return vec_or(this->value, (__m128i)other); + } + simdjson_inline Child operator&(const Child other) const { + return vec_and(this->value, (__m128i)other); + } + simdjson_inline Child operator^(const Child other) const { + return vec_xor(this->value, (__m128i)other); + } + simdjson_inline Child bit_andnot(const Child other) const { + return vec_andc(this->value, (__m128i)other); + } + simdjson_inline Child &operator|=(const Child other) { + auto this_cast = static_cast<Child*>(this); + *this_cast = *this_cast | other; + return *this_cast; + } + simdjson_inline Child &operator&=(const Child other) { + auto this_cast = static_cast<Child*>(this); + *this_cast = *this_cast & other; + return *this_cast; + } + simdjson_inline Child &operator^=(const Child other) { + auto this_cast = static_cast<Child*>(this); + *this_cast = *this_cast ^ other; + return *this_cast; + } +}; + +template <typename T, typename Mask = simd8<bool>> +struct base8 : base<simd8<T>> { + typedef uint16_t bitmask_t; + typedef uint32_t bitmask2_t; + + simdjson_inline base8() : base<simd8<T>>() {} + simdjson_inline base8(const __m128i _value) : base<simd8<T>>(_value) {} + + friend simdjson_inline Mask operator==(const simd8<T> lhs, const simd8<T> rhs) { + return (__m128i)vec_cmpeq(lhs.value, (__m128i)rhs); + } + + static const int SIZE = sizeof(base<simd8<T>>::value); + + template <int N = 1> + simdjson_inline simd8<T> prev(simd8<T> prev_chunk) const { + __m128i chunk = this->value; +#ifdef __LITTLE_ENDIAN__ + chunk = (__m128i)vec_reve(this->value); + prev_chunk = (__m128i)vec_reve((__m128i)prev_chunk); +#endif + chunk = (__m128i)vec_sld((__m128i)prev_chunk, (__m128i)chunk, 16 - N); +#ifdef __LITTLE_ENDIAN__ + chunk = (__m128i)vec_reve((__m128i)chunk); +#endif + return chunk; + } +}; + +// SIMD byte mask type (returned by things like eq and gt) +template <> struct simd8<bool> : base8<bool> { + static simdjson_inline simd8<bool> splat(bool _value) { + return (__m128i)vec_splats((unsigned char)(-(!!_value))); + } + + simdjson_inline simd8() : base8<bool>() {} + simdjson_inline simd8(const __m128i _value) + : base8<bool>(_value) {} + // Splat constructor + simdjson_inline simd8(bool _value) + : base8<bool>(splat(_value)) {} + + simdjson_inline int to_bitmask() const { + __vector unsigned long long result; + const __m128i perm_mask = {0x78, 0x70, 0x68, 0x60, 0x58, 0x50, 0x48, 0x40, + 0x38, 0x30, 0x28, 0x20, 0x18, 0x10, 0x08, 0x00}; + + result = ((__vector unsigned long long)vec_vbpermq((__m128i)this->value, + (__m128i)perm_mask)); +#ifdef __LITTLE_ENDIAN__ + return static_cast<int>(result[1]); +#else + return static_cast<int>(result[0]); +#endif + } + simdjson_inline bool any() const { + return !vec_all_eq(this->value, (__m128i)vec_splats(0)); + } + simdjson_inline simd8<bool> operator~() const { + return this->value ^ (__m128i)splat(true); + } +}; + +template <typename T> struct base8_numeric : base8<T> { + static simdjson_inline simd8<T> splat(T value) { + (void)value; + return (__m128i)vec_splats(value); + } + static simdjson_inline simd8<T> zero() { return splat(0); } + static simdjson_inline simd8<T> load(const T values[16]) { + return (__m128i)(vec_vsx_ld(0, reinterpret_cast<const uint8_t *>(values))); + } + // Repeat 16 values as many times as necessary (usually for lookup tables) + static simdjson_inline simd8<T> repeat_16(T v0, T v1, T v2, T v3, T v4, + T v5, T v6, T v7, T v8, T v9, + T v10, T v11, T v12, T v13, + T v14, T v15) { + return simd8<T>(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, + v14, v15); + } + + simdjson_inline base8_numeric() : base8<T>() {} + simdjson_inline base8_numeric(const __m128i _value) + : base8<T>(_value) {} + + // Store to array + simdjson_inline void store(T dst[16]) const { + vec_vsx_st(this->value, 0, reinterpret_cast<__m128i *>(dst)); + } + + // Override to distinguish from bool version + simdjson_inline simd8<T> operator~() const { return *this ^ 0xFFu; } + + // Addition/subtraction are the same for signed and unsigned + simdjson_inline simd8<T> operator+(const simd8<T> other) const { + return (__m128i)((__m128i)this->value + (__m128i)other); + } + simdjson_inline simd8<T> operator-(const simd8<T> other) const { + return (__m128i)((__m128i)this->value - (__m128i)other); + } + simdjson_inline simd8<T> &operator+=(const simd8<T> other) { + *this = *this + other; + return *static_cast<simd8<T> *>(this); + } + simdjson_inline simd8<T> &operator-=(const simd8<T> other) { + *this = *this - other; + return *static_cast<simd8<T> *>(this); + } + + // Perform a lookup assuming the value is between 0 and 16 (undefined behavior + // for out of range values) + template <typename L> + simdjson_inline simd8<L> lookup_16(simd8<L> lookup_table) const { + return (__m128i)vec_perm((__m128i)lookup_table, (__m128i)lookup_table, this->value); + } + + // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted + // as a bitset). Passing a 0 value for mask would be equivalent to writing out + // every byte to output. Only the first 16 - count_ones(mask) bytes of the + // result are significant but 16 bytes get written. Design consideration: it + // seems like a function with the signature simd8<L> compress(uint32_t mask) + // would be sensible, but the AVX ISA makes this kind of approach difficult. + template <typename L> + simdjson_inline void compress(uint16_t mask, L *output) const { + using internal::BitsSetTable256mul2; + using internal::pshufb_combine_table; + using internal::thintable_epi8; + // this particular implementation was inspired by work done by @animetosho + // we do it in two steps, first 8 bytes and then second 8 bytes + uint8_t mask1 = uint8_t(mask); // least significant 8 bits + uint8_t mask2 = uint8_t(mask >> 8); // most significant 8 bits + // next line just loads the 64-bit values thintable_epi8[mask1] and + // thintable_epi8[mask2] into a 128-bit register, using only + // two instructions on most compilers. +#ifdef __LITTLE_ENDIAN__ + __m128i shufmask = (__m128i)(__vector unsigned long long){ + thintable_epi8[mask1], thintable_epi8[mask2]}; +#else + __m128i shufmask = (__m128i)(__vector unsigned long long){ + thintable_epi8[mask2], thintable_epi8[mask1]}; + shufmask = (__m128i)vec_reve((__m128i)shufmask); +#endif + // we increment by 0x08 the second half of the mask + shufmask = ((__m128i)shufmask) + + ((__m128i)(__vector int){0, 0, 0x08080808, 0x08080808}); + + // this is the version "nearly pruned" + __m128i pruned = vec_perm(this->value, this->value, shufmask); + // we still need to put the two halves together. + // we compute the popcount of the first half: + int pop1 = BitsSetTable256mul2[mask1]; + // then load the corresponding mask, what it does is to write + // only the first pop1 bytes from the first 8 bytes, and then + // it fills in with the bytes from the second 8 bytes + some filling + // at the end. + __m128i compactmask = + vec_vsx_ld(0, reinterpret_cast<const uint8_t *>(pshufb_combine_table + pop1 * 8)); + __m128i answer = vec_perm(pruned, (__m128i)vec_splats(0), compactmask); + vec_vsx_st(answer, 0, reinterpret_cast<__m128i *>(output)); + } + + template <typename L> + simdjson_inline simd8<L> + lookup_16(L replace0, L replace1, L replace2, L replace3, L replace4, + L replace5, L replace6, L replace7, L replace8, L replace9, + L replace10, L replace11, L replace12, L replace13, L replace14, + L replace15) const { + return lookup_16(simd8<L>::repeat_16( + replace0, replace1, replace2, replace3, replace4, replace5, replace6, + replace7, replace8, replace9, replace10, replace11, replace12, + replace13, replace14, replace15)); + } +}; + +// Signed bytes +template <> struct simd8<int8_t> : base8_numeric<int8_t> { + simdjson_inline simd8() : base8_numeric<int8_t>() {} + simdjson_inline simd8(const __m128i _value) + : base8_numeric<int8_t>(_value) {} + // Splat constructor + simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {} + // Array constructor + simdjson_inline simd8(const int8_t *values) : simd8(load(values)) {} + // Member-by-member initialization + simdjson_inline simd8(int8_t v0, int8_t v1, int8_t v2, int8_t v3, + int8_t v4, int8_t v5, int8_t v6, int8_t v7, + int8_t v8, int8_t v9, int8_t v10, int8_t v11, + int8_t v12, int8_t v13, int8_t v14, int8_t v15) + : simd8((__m128i)(__vector signed char){v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10, v11, v12, v13, v14, + v15}) {} + // Repeat 16 values as many times as necessary (usually for lookup tables) + simdjson_inline static simd8<int8_t> + repeat_16(int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, + int8_t v6, int8_t v7, int8_t v8, int8_t v9, int8_t v10, int8_t v11, + int8_t v12, int8_t v13, int8_t v14, int8_t v15) { + return simd8<int8_t>(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, + v13, v14, v15); + } + + // Order-sensitive comparisons + simdjson_inline simd8<int8_t> + max_val(const simd8<int8_t> other) const { + return (__m128i)vec_max((__vector signed char)this->value, + (__vector signed char)(__m128i)other); + } + simdjson_inline simd8<int8_t> + min_val(const simd8<int8_t> other) const { + return (__m128i)vec_min((__vector signed char)this->value, + (__vector signed char)(__m128i)other); + } + simdjson_inline simd8<bool> + operator>(const simd8<int8_t> other) const { + return (__m128i)vec_cmpgt((__vector signed char)this->value, + (__vector signed char)(__m128i)other); + } + simdjson_inline simd8<bool> + operator<(const simd8<int8_t> other) const { + return (__m128i)vec_cmplt((__vector signed char)this->value, + (__vector signed char)(__m128i)other); + } +}; + +// Unsigned bytes +template <> struct simd8<uint8_t> : base8_numeric<uint8_t> { + simdjson_inline simd8() : base8_numeric<uint8_t>() {} + simdjson_inline simd8(const __m128i _value) + : base8_numeric<uint8_t>(_value) {} + // Splat constructor + simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {} + // Array constructor + simdjson_inline simd8(const uint8_t *values) : simd8(load(values)) {} + // Member-by-member initialization + simdjson_inline + simd8(uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, + uint8_t v6, uint8_t v7, uint8_t v8, uint8_t v9, uint8_t v10, + uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15) + : simd8((__m128i){v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, + v13, v14, v15}) {} + // Repeat 16 values as many times as necessary (usually for lookup tables) + simdjson_inline static simd8<uint8_t> + repeat_16(uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, + uint8_t v5, uint8_t v6, uint8_t v7, uint8_t v8, uint8_t v9, + uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, + uint8_t v15) { + return simd8<uint8_t>(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, + v13, v14, v15); + } + + // Saturated math + simdjson_inline simd8<uint8_t> + saturating_add(const simd8<uint8_t> other) const { + return (__m128i)vec_adds(this->value, (__m128i)other); + } + simdjson_inline simd8<uint8_t> + saturating_sub(const simd8<uint8_t> other) const { + return (__m128i)vec_subs(this->value, (__m128i)other); + } + + // Order-specific operations + simdjson_inline simd8<uint8_t> + max_val(const simd8<uint8_t> other) const { + return (__m128i)vec_max(this->value, (__m128i)other); + } + simdjson_inline simd8<uint8_t> + min_val(const simd8<uint8_t> other) const { + return (__m128i)vec_min(this->value, (__m128i)other); + } + // Same as >, but only guarantees true is nonzero (< guarantees true = -1) + simdjson_inline simd8<uint8_t> + gt_bits(const simd8<uint8_t> other) const { + return this->saturating_sub(other); + } + // Same as <, but only guarantees true is nonzero (< guarantees true = -1) + simdjson_inline simd8<uint8_t> + lt_bits(const simd8<uint8_t> other) const { + return other.saturating_sub(*this); + } + simdjson_inline simd8<bool> + operator<=(const simd8<uint8_t> other) const { + return other.max_val(*this) == other; + } + simdjson_inline simd8<bool> + operator>=(const simd8<uint8_t> other) const { + return other.min_val(*this) == other; + } + simdjson_inline simd8<bool> + operator>(const simd8<uint8_t> other) const { + return this->gt_bits(other).any_bits_set(); + } + simdjson_inline simd8<bool> + operator<(const simd8<uint8_t> other) const { + return this->gt_bits(other).any_bits_set(); + } + + // Bit-specific operations + simdjson_inline simd8<bool> bits_not_set() const { + return (__m128i)vec_cmpeq(this->value, (__m128i)vec_splats(uint8_t(0))); + } + simdjson_inline simd8<bool> bits_not_set(simd8<uint8_t> bits) const { + return (*this & bits).bits_not_set(); + } + simdjson_inline simd8<bool> any_bits_set() const { + return ~this->bits_not_set(); + } + simdjson_inline simd8<bool> any_bits_set(simd8<uint8_t> bits) const { + return ~this->bits_not_set(bits); + } + simdjson_inline bool bits_not_set_anywhere() const { + return vec_all_eq(this->value, (__m128i)vec_splats(0)); + } + simdjson_inline bool any_bits_set_anywhere() const { + return !bits_not_set_anywhere(); + } + simdjson_inline bool bits_not_set_anywhere(simd8<uint8_t> bits) const { + return vec_all_eq(vec_and(this->value, (__m128i)bits), + (__m128i)vec_splats(0)); + } + simdjson_inline bool any_bits_set_anywhere(simd8<uint8_t> bits) const { + return !bits_not_set_anywhere(bits); + } + template <int N> simdjson_inline simd8<uint8_t> shr() const { + return simd8<uint8_t>( + (__m128i)vec_sr(this->value, (__m128i)vec_splat_u8(N))); + } + template <int N> simdjson_inline simd8<uint8_t> shl() const { + return simd8<uint8_t>( + (__m128i)vec_sl(this->value, (__m128i)vec_splat_u8(N))); + } +}; + +template <typename T> struct simd8x64 { + static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<T>); + static_assert(NUM_CHUNKS == 4, + "PPC64 kernel should use four registers per 64-byte block."); + const simd8<T> chunks[NUM_CHUNKS]; + template<int idx> simd8<uint8_t> get() const { return idx < NUM_CHUNKS ? chunks[idx] : simd8<T>(); } + + simd8x64(const simd8x64<T> &o) = delete; // no copy allowed + simd8x64<T> & + operator=(const simd8<T>& other) = delete; // no assignment allowed + simd8x64() = delete; // no default constructor allowed + + simdjson_inline simd8x64(const simd8<T> chunk0, const simd8<T> chunk1, + const simd8<T> chunk2, const simd8<T> chunk3) + : chunks{chunk0, chunk1, chunk2, chunk3} {} + simdjson_inline simd8x64(const T ptr[64]) + : chunks{simd8<T>::load(ptr), simd8<T>::load(ptr + 16), + simd8<T>::load(ptr + 32), simd8<T>::load(ptr + 48)} {} + + simdjson_inline void store(T ptr[64]) const { + this->chunks[0].store(ptr + sizeof(simd8<T>) * 0); + this->chunks[1].store(ptr + sizeof(simd8<T>) * 1); + this->chunks[2].store(ptr + sizeof(simd8<T>) * 2); + this->chunks[3].store(ptr + sizeof(simd8<T>) * 3); + } + + simdjson_inline simd8<T> reduce_or() const { + return (this->chunks[0] | this->chunks[1]) | + (this->chunks[2] | this->chunks[3]); + } + + simdjson_inline uint64_t compress(uint64_t mask, T *output) const { + this->chunks[0].compress(uint16_t(mask), output); + this->chunks[1].compress(uint16_t(mask >> 16), + output + 16 - count_ones(mask & 0xFFFF)); + this->chunks[2].compress(uint16_t(mask >> 32), + output + 32 - count_ones(mask & 0xFFFFFFFF)); + this->chunks[3].compress(uint16_t(mask >> 48), + output + 48 - count_ones(mask & 0xFFFFFFFFFFFF)); + return 64 - count_ones(mask); + } + + simdjson_inline uint64_t to_bitmask() const { + uint64_t r0 = uint32_t(this->chunks[0].to_bitmask()); + uint64_t r1 = this->chunks[1].to_bitmask(); + uint64_t r2 = this->chunks[2].to_bitmask(); + uint64_t r3 = this->chunks[3].to_bitmask(); + return r0 | (r1 << 16) | (r2 << 32) | (r3 << 48); + } + + simdjson_inline uint64_t eq(const T m) const { + const simd8<T> mask = simd8<T>::splat(m); + return simd8x64<bool>(this->chunks[0] == mask, this->chunks[1] == mask, + this->chunks[2] == mask, this->chunks[3] == mask) + .to_bitmask(); + } + + simdjson_inline uint64_t eq(const simd8x64<uint8_t> &other) const { + return simd8x64<bool>(this->chunks[0] == other.chunks[0], + this->chunks[1] == other.chunks[1], + this->chunks[2] == other.chunks[2], + this->chunks[3] == other.chunks[3]) + .to_bitmask(); + } + + simdjson_inline uint64_t lteq(const T m) const { + const simd8<T> mask = simd8<T>::splat(m); + return simd8x64<bool>(this->chunks[0] <= mask, this->chunks[1] <= mask, + this->chunks[2] <= mask, this->chunks[3] <= mask) + .to_bitmask(); + } +}; // struct simd8x64<T> + +} // namespace simd +} // unnamed namespace +} // namespace ppc64 +} // namespace simdjson + +#endif // SIMDJSON_PPC64_SIMD_INPUT_H +/* end file simdjson/ppc64/simd.h */ +/* including simdjson/ppc64/stringparsing_defs.h: #include "simdjson/ppc64/stringparsing_defs.h" */ +/* begin file simdjson/ppc64/stringparsing_defs.h */ +#ifndef SIMDJSON_PPC64_STRINGPARSING_DEFS_H +#define SIMDJSON_PPC64_STRINGPARSING_DEFS_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/simd.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace ppc64 { +namespace { + +using namespace simd; + +// Holds backslashes and quotes locations. +struct backslash_and_quote { +public: + static constexpr uint32_t BYTES_PROCESSED = 32; + simdjson_inline backslash_and_quote + copy_and_find(const uint8_t *src, uint8_t *dst); + + simdjson_inline bool has_quote_first() { + return ((bs_bits - 1) & quote_bits) != 0; + } + simdjson_inline bool has_backslash() { return bs_bits != 0; } + simdjson_inline int quote_index() { + return trailing_zeroes(quote_bits); + } + simdjson_inline int backslash_index() { + return trailing_zeroes(bs_bits); + } + + uint32_t bs_bits; + uint32_t quote_bits; +}; // struct backslash_and_quote + +simdjson_inline backslash_and_quote +backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) { + // this can read up to 31 bytes beyond the buffer size, but we require + // SIMDJSON_PADDING of padding + static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), + "backslash and quote finder must process fewer than " + "SIMDJSON_PADDING bytes"); + simd8<uint8_t> v0(src); + simd8<uint8_t> v1(src + sizeof(v0)); + v0.store(dst); + v1.store(dst + sizeof(v0)); + + // Getting a 64-bit bitmask is much cheaper than multiple 16-bit bitmasks on + // PPC; therefore, we smash them together into a 64-byte mask and get the + // bitmask from there. + uint64_t bs_and_quote = + simd8x64<bool>(v0 == '\\', v1 == '\\', v0 == '"', v1 == '"').to_bitmask(); + return { + uint32_t(bs_and_quote), // bs_bits + uint32_t(bs_and_quote >> 32) // quote_bits + }; +} + + +struct escaping { + static constexpr uint32_t BYTES_PROCESSED = 16; + simdjson_inline static escaping copy_and_find(const uint8_t *src, uint8_t *dst); + + simdjson_inline bool has_escape() { return escape_bits != 0; } + simdjson_inline int escape_index() { return trailing_zeroes(escape_bits); } + + uint64_t escape_bits; +}; // struct escaping + + + +simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *dst) { + static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "escaping finder must process fewer than SIMDJSON_PADDING bytes"); + simd8<uint8_t> v(src); + v.store(dst); + simd8<bool> is_quote = (v == '"'); + simd8<bool> is_backslash = (v == '\\'); + simd8<bool> is_control = (v < 32); + return { + // We store it as a 64-bit bitmask even though we only need 16 bits. + uint64_t((is_backslash | is_quote | is_control).to_bitmask()) + }; +} + +} // unnamed namespace +} // namespace ppc64 +} // namespace simdjson + +#endif // SIMDJSON_PPC64_STRINGPARSING_DEFS_H +/* end file simdjson/ppc64/stringparsing_defs.h */ + +#define SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT 1 +/* end file simdjson/ppc64/begin.h */ +/* including simdjson/generic/ondemand/amalgamated.h for ppc64: #include "simdjson/generic/ondemand/amalgamated.h" */ +/* begin file simdjson/generic/ondemand/amalgamated.h for ppc64 */ +#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_BUILDER_DEPENDENCIES_H) #error simdjson/generic/ondemand/dependencies.h must be included before simdjson/generic/ondemand/amalgamated.h! #endif // Stuff other things depend on -/* including simdjson/generic/ondemand/base.h for icelake: #include "simdjson/generic/ondemand/base.h" */ -/* begin file simdjson/generic/ondemand/base.h for icelake */ +/* including simdjson/generic/ondemand/base.h for ppc64: #include "simdjson/generic/ondemand/base.h" */ +/* begin file simdjson/generic/ondemand/base.h for ppc64 */ #ifndef SIMDJSON_GENERIC_ONDEMAND_BASE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -78668,7 +116348,7 @@ simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace icelake { +namespace ppc64 { /** * A fast, simple, DOM-like interface that parses JSON as you use it. * @@ -78679,8 +116359,8 @@ namespace ondemand { /** Represents the depth of a JSON value (number of nested arrays/objects). */ using depth_t = int32_t; -/** @copydoc simdjson::icelake::number_type */ -using number_type = simdjson::icelake::number_type; +/** @copydoc simdjson::ppc64::number_type */ +using number_type = simdjson::ppc64::number_type; /** @private Position in the JSON buffer indexes */ using token_position = const uint32_t *; @@ -78703,13 +116383,13 @@ class value; class value_iterator; } // namespace ondemand -} // namespace icelake +} // namespace ppc64 } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_BASE_H -/* end file simdjson/generic/ondemand/base.h for icelake */ -/* including simdjson/generic/ondemand/deserialize.h for icelake: #include "simdjson/generic/ondemand/deserialize.h" */ -/* begin file simdjson/generic/ondemand/deserialize.h for icelake */ +/* end file simdjson/generic/ondemand/base.h for ppc64 */ +/* including simdjson/generic/ondemand/deserialize.h for ppc64: #include "simdjson/generic/ondemand/deserialize.h" */ +/* begin file simdjson/generic/ondemand/deserialize.h for ppc64 */ #if SIMDJSON_SUPPORTS_CONCEPTS #ifndef SIMDJSON_ONDEMAND_DESERIALIZE_H @@ -78729,35 +116409,35 @@ template <> struct is_builtin_deserializable<int64_t> : std::true_type {}; template <> struct is_builtin_deserializable<uint64_t> : std::true_type {}; template <> struct is_builtin_deserializable<double> : std::true_type {}; template <> struct is_builtin_deserializable<bool> : std::true_type {}; -template <> struct is_builtin_deserializable<icelake::ondemand::array> : std::true_type {}; -template <> struct is_builtin_deserializable<icelake::ondemand::object> : std::true_type {}; -template <> struct is_builtin_deserializable<icelake::ondemand::value> : std::true_type {}; -template <> struct is_builtin_deserializable<icelake::ondemand::raw_json_string> : std::true_type {}; +template <> struct is_builtin_deserializable<ppc64::ondemand::array> : std::true_type {}; +template <> struct is_builtin_deserializable<ppc64::ondemand::object> : std::true_type {}; +template <> struct is_builtin_deserializable<ppc64::ondemand::value> : std::true_type {}; +template <> struct is_builtin_deserializable<ppc64::ondemand::raw_json_string> : std::true_type {}; template <> struct is_builtin_deserializable<std::string_view> : std::true_type {}; template <typename T> concept is_builtin_deserializable_v = is_builtin_deserializable<T>::value; -template <typename T, typename ValT = icelake::ondemand::value> +template <typename T, typename ValT = ppc64::ondemand::value> concept custom_deserializable = tag_invocable<deserialize_tag, ValT&, T&>; -template <typename T, typename ValT = icelake::ondemand::value> +template <typename T, typename ValT = ppc64::ondemand::value> concept deserializable = custom_deserializable<T, ValT> || is_builtin_deserializable_v<T> || concepts::optional_type<T>; -template <typename T, typename ValT = icelake::ondemand::value> +template <typename T, typename ValT = ppc64::ondemand::value> concept nothrow_custom_deserializable = nothrow_tag_invocable<deserialize_tag, ValT&, T&>; // built-in types are noexcept and if an error happens, the value simply gets ignored and the error is returned. -template <typename T, typename ValT = icelake::ondemand::value> +template <typename T, typename ValT = ppc64::ondemand::value> concept nothrow_deserializable = nothrow_custom_deserializable<T, ValT> || is_builtin_deserializable_v<T>; /// Deserialize Tag inline constexpr struct deserialize_tag { - using array_type = icelake::ondemand::array; - using object_type = icelake::ondemand::object; - using value_type = icelake::ondemand::value; - using document_type = icelake::ondemand::document; - using document_reference_type = icelake::ondemand::document_reference; + using array_type = ppc64::ondemand::array; + using object_type = ppc64::ondemand::object; + using value_type = ppc64::ondemand::value; + using document_type = ppc64::ondemand::document; + using document_reference_type = ppc64::ondemand::document_reference; // Customization Point for array template <typename T> @@ -78802,9 +116482,9 @@ inline constexpr struct deserialize_tag { #endif // SIMDJSON_ONDEMAND_DESERIALIZE_H #endif // SIMDJSON_SUPPORTS_CONCEPTS -/* end file simdjson/generic/ondemand/deserialize.h for icelake */ -/* including simdjson/generic/ondemand/value_iterator.h for icelake: #include "simdjson/generic/ondemand/value_iterator.h" */ -/* begin file simdjson/generic/ondemand/value_iterator.h for icelake */ +/* end file simdjson/generic/ondemand/deserialize.h for ppc64 */ +/* including simdjson/generic/ondemand/value_iterator.h for ppc64: #include "simdjson/generic/ondemand/value_iterator.h" */ +/* begin file simdjson/generic/ondemand/value_iterator.h for ppc64 */ #ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -78814,7 +116494,7 @@ inline constexpr struct deserialize_tag { /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace icelake { +namespace ppc64 { namespace ondemand { /** @@ -79279,21 +116959,22 @@ class value_iterator { friend class document; friend class object; + friend class object_iterator; friend class array; friend class value; friend class field; }; // value_iterator } // namespace ondemand -} // namespace icelake +} // namespace ppc64 } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<icelake::ondemand::value_iterator> : public icelake::implementation_simdjson_result_base<icelake::ondemand::value_iterator> { +struct simdjson_result<ppc64::ondemand::value_iterator> : public ppc64::implementation_simdjson_result_base<ppc64::ondemand::value_iterator> { public: - simdjson_inline simdjson_result(icelake::ondemand::value_iterator &&value) noexcept; ///< @private + simdjson_inline simdjson_result(ppc64::ondemand::value_iterator &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; }; @@ -79301,9 +116982,9 @@ struct simdjson_result<icelake::ondemand::value_iterator> : public icelake::impl } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_H -/* end file simdjson/generic/ondemand/value_iterator.h for icelake */ -/* including simdjson/generic/ondemand/value.h for icelake: #include "simdjson/generic/ondemand/value.h" */ -/* begin file simdjson/generic/ondemand/value.h for icelake */ +/* end file simdjson/generic/ondemand/value_iterator.h for ppc64 */ +/* including simdjson/generic/ondemand/value.h for ppc64: #include "simdjson/generic/ondemand/value.h" */ +/* begin file simdjson/generic/ondemand/value.h for ppc64 */ #ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -79319,7 +117000,7 @@ struct simdjson_result<icelake::ondemand::value_iterator> : public icelake::impl namespace simdjson { -namespace icelake { +namespace ppc64 { namespace ondemand { /** * An ephemeral JSON value returned during iteration. It is only valid for as long as you do @@ -80033,20 +117714,20 @@ class value { }; } // namespace ondemand -} // namespace icelake +} // namespace ppc64 } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<icelake::ondemand::value> : public icelake::implementation_simdjson_result_base<icelake::ondemand::value> { +struct simdjson_result<ppc64::ondemand::value> : public ppc64::implementation_simdjson_result_base<ppc64::ondemand::value> { public: - simdjson_inline simdjson_result(icelake::ondemand::value &&value) noexcept; ///< @private + simdjson_inline simdjson_result(ppc64::ondemand::value &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; - simdjson_inline simdjson_result<icelake::ondemand::array> get_array() noexcept; - simdjson_inline simdjson_result<icelake::ondemand::object> get_object() noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::array> get_array() noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::object> get_object() noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64() noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64_in_string() noexcept; @@ -80058,7 +117739,7 @@ struct simdjson_result<icelake::ondemand::value> : public icelake::implementatio template <typename string_type> simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result<std::string_view> get_wobbly_string() noexcept; - simdjson_inline simdjson_result<icelake::ondemand::raw_json_string> get_raw_json_string() noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::raw_json_string> get_raw_json_string() noexcept; simdjson_inline simdjson_result<bool> get_bool() noexcept; simdjson_inline simdjson_result<bool> is_null() noexcept; @@ -80069,20 +117750,20 @@ struct simdjson_result<icelake::ondemand::value> : public icelake::implementatio #if SIMDJSON_EXCEPTIONS template <class T> explicit simdjson_inline operator T() noexcept(false); - simdjson_inline operator icelake::ondemand::array() noexcept(false); - simdjson_inline operator icelake::ondemand::object() noexcept(false); + simdjson_inline operator ppc64::ondemand::array() noexcept(false); + simdjson_inline operator ppc64::ondemand::object() noexcept(false); simdjson_inline operator uint64_t() noexcept(false); simdjson_inline operator int64_t() noexcept(false); simdjson_inline operator double() noexcept(false); simdjson_inline operator std::string_view() noexcept(false); - simdjson_inline operator icelake::ondemand::raw_json_string() noexcept(false); + simdjson_inline operator ppc64::ondemand::raw_json_string() noexcept(false); simdjson_inline operator bool() noexcept(false); #endif simdjson_inline simdjson_result<size_t> count_elements() & noexcept; simdjson_inline simdjson_result<size_t> count_fields() & noexcept; - simdjson_inline simdjson_result<icelake::ondemand::value> at(size_t index) noexcept; - simdjson_inline simdjson_result<icelake::ondemand::array_iterator> begin() & noexcept; - simdjson_inline simdjson_result<icelake::ondemand::array_iterator> end() & noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::value> at(size_t index) noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::array_iterator> begin() & noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::array_iterator> end() & noexcept; /** * Look up a field by name on an object (order-sensitive). By order-sensitive, we mean that @@ -80106,9 +117787,9 @@ struct simdjson_result<icelake::ondemand::value> : public icelake::implementatio * @param key The key to look up. * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object. */ - simdjson_inline simdjson_result<icelake::ondemand::value> find_field(std::string_view key) noexcept; - /** @overload simdjson_inline simdjson_result<icelake::ondemand::value> find_field(std::string_view key) noexcept; */ - simdjson_inline simdjson_result<icelake::ondemand::value> find_field(const char *key) noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::value> find_field(std::string_view key) noexcept; + /** @overload simdjson_inline simdjson_result<ppc64::ondemand::value> find_field(std::string_view key) noexcept; */ + simdjson_inline simdjson_result<ppc64::ondemand::value> find_field(const char *key) noexcept; /** * Look up a field by name on an object, without regard to key order. @@ -80120,7 +117801,7 @@ struct simdjson_result<icelake::ondemand::value> : public icelake::implementatio * in question is large. The fact that the extra code is there also bumps the executable size. * * We default operator[] on find_field_unordered() for convenience. - * It is the defaul because it would be highly surprising (and hard to debug) if the + * It is the default because it would be highly surprising (and hard to debug) if the * default behavior failed to look up a field just because it was in the wrong order--and many * APIs assume this. Therefore, you must be explicit if you want to treat objects as out of order. * @@ -80130,14 +117811,14 @@ struct simdjson_result<icelake::ondemand::value> : public icelake::implementatio * @param key The key to look up. * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object. */ - simdjson_inline simdjson_result<icelake::ondemand::value> find_field_unordered(std::string_view key) noexcept; - /** @overload simdjson_inline simdjson_result<icelake::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ - simdjson_inline simdjson_result<icelake::ondemand::value> find_field_unordered(const char *key) noexcept; - /** @overload simdjson_inline simdjson_result<icelake::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ - simdjson_inline simdjson_result<icelake::ondemand::value> operator[](std::string_view key) noexcept; - /** @overload simdjson_inline simdjson_result<icelake::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ - simdjson_inline simdjson_result<icelake::ondemand::value> operator[](const char *key) noexcept; - simdjson_result<icelake::ondemand::value> operator[](int) noexcept = delete; + simdjson_inline simdjson_result<ppc64::ondemand::value> find_field_unordered(std::string_view key) noexcept; + /** @overload simdjson_inline simdjson_result<ppc64::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ + simdjson_inline simdjson_result<ppc64::ondemand::value> find_field_unordered(const char *key) noexcept; + /** @overload simdjson_inline simdjson_result<ppc64::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ + simdjson_inline simdjson_result<ppc64::ondemand::value> operator[](std::string_view key) noexcept; + /** @overload simdjson_inline simdjson_result<ppc64::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ + simdjson_inline simdjson_result<ppc64::ondemand::value> operator[](const char *key) noexcept; + simdjson_result<ppc64::ondemand::value> operator[](int) noexcept = delete; /** * Get the type of this JSON value. It does not validate or consume the value. @@ -80161,13 +117842,13 @@ struct simdjson_result<icelake::ondemand::value> : public icelake::implementatio * better to just call .get_double, .get_string, etc. and check for INCORRECT_TYPE (or just * let it throw an exception). */ - simdjson_inline simdjson_result<icelake::ondemand::json_type> type() noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::json_type> type() noexcept; simdjson_inline simdjson_result<bool> is_scalar() noexcept; simdjson_inline simdjson_result<bool> is_string() noexcept; simdjson_inline simdjson_result<bool> is_negative() noexcept; simdjson_inline simdjson_result<bool> is_integer() noexcept; - simdjson_inline simdjson_result<icelake::number_type> get_number_type() noexcept; - simdjson_inline simdjson_result<icelake::ondemand::number> get_number() noexcept; + simdjson_inline simdjson_result<ppc64::number_type> get_number_type() noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::number> get_number() noexcept; /** @copydoc simdjson_inline std::string_view value::raw_json_token() const noexcept */ simdjson_inline simdjson_result<std::string_view> raw_json_token() noexcept; @@ -80177,17 +117858,17 @@ struct simdjson_result<icelake::ondemand::value> : public icelake::implementatio simdjson_inline simdjson_result<const char *> current_location() noexcept; /** @copydoc simdjson_inline int32_t current_depth() const noexcept */ simdjson_inline simdjson_result<int32_t> current_depth() const noexcept; - simdjson_inline simdjson_result<icelake::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result<icelake::ondemand::value> at_path(std::string_view json_path) noexcept; - simdjson_inline simdjson_result<std::vector<icelake::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::value> at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<std::vector<ppc64::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; }; } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_H -/* end file simdjson/generic/ondemand/value.h for icelake */ -/* including simdjson/generic/ondemand/logger.h for icelake: #include "simdjson/generic/ondemand/logger.h" */ -/* begin file simdjson/generic/ondemand/logger.h for icelake */ +/* end file simdjson/generic/ondemand/value.h for ppc64 */ +/* including simdjson/generic/ondemand/logger.h for ppc64: #include "simdjson/generic/ondemand/logger.h" */ +/* begin file simdjson/generic/ondemand/logger.h for ppc64 */ #ifndef SIMDJSON_GENERIC_ONDEMAND_LOGGER_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -80196,7 +117877,7 @@ struct simdjson_result<icelake::ondemand::value> : public icelake::implementatio /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace icelake { +namespace ppc64 { namespace ondemand { // Logging should be free unless SIMDJSON_VERBOSE_LOGGING is set. Importantly, it is critical @@ -80242,13 +117923,13 @@ static inline void log_error(const value_iterator &iter, const char *error, cons } // namespace logger } // namespace ondemand -} // namespace icelake +} // namespace ppc64 } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_LOGGER_H -/* end file simdjson/generic/ondemand/logger.h for icelake */ -/* including simdjson/generic/ondemand/token_iterator.h for icelake: #include "simdjson/generic/ondemand/token_iterator.h" */ -/* begin file simdjson/generic/ondemand/token_iterator.h for icelake */ +/* end file simdjson/generic/ondemand/logger.h for ppc64 */ +/* including simdjson/generic/ondemand/token_iterator.h for ppc64: #include "simdjson/generic/ondemand/token_iterator.h" */ +/* begin file simdjson/generic/ondemand/token_iterator.h for ppc64 */ #ifndef SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -80259,7 +117940,7 @@ static inline void log_error(const value_iterator &iter, const char *error, cons /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace icelake { +namespace ppc64 { namespace ondemand { /** @@ -80390,15 +118071,15 @@ class token_iterator { }; } // namespace ondemand -} // namespace icelake +} // namespace ppc64 } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<icelake::ondemand::token_iterator> : public icelake::implementation_simdjson_result_base<icelake::ondemand::token_iterator> { +struct simdjson_result<ppc64::ondemand::token_iterator> : public ppc64::implementation_simdjson_result_base<ppc64::ondemand::token_iterator> { public: - simdjson_inline simdjson_result(icelake::ondemand::token_iterator &&value) noexcept; ///< @private + simdjson_inline simdjson_result(ppc64::ondemand::token_iterator &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; simdjson_inline ~simdjson_result() noexcept = default; ///< @private @@ -80407,9 +118088,9 @@ struct simdjson_result<icelake::ondemand::token_iterator> : public icelake::impl } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_H -/* end file simdjson/generic/ondemand/token_iterator.h for icelake */ -/* including simdjson/generic/ondemand/json_iterator.h for icelake: #include "simdjson/generic/ondemand/json_iterator.h" */ -/* begin file simdjson/generic/ondemand/json_iterator.h for icelake */ +/* end file simdjson/generic/ondemand/token_iterator.h for ppc64 */ +/* including simdjson/generic/ondemand/json_iterator.h for ppc64: #include "simdjson/generic/ondemand/json_iterator.h" */ +/* begin file simdjson/generic/ondemand/json_iterator.h for ppc64 */ #ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -80420,7 +118101,7 @@ struct simdjson_result<icelake::ondemand::token_iterator> : public icelake::impl /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace icelake { +namespace ppc64 { namespace ondemand { /** @@ -80731,15 +118412,15 @@ class json_iterator { }; // json_iterator } // namespace ondemand -} // namespace icelake +} // namespace ppc64 } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<icelake::ondemand::json_iterator> : public icelake::implementation_simdjson_result_base<icelake::ondemand::json_iterator> { +struct simdjson_result<ppc64::ondemand::json_iterator> : public ppc64::implementation_simdjson_result_base<ppc64::ondemand::json_iterator> { public: - simdjson_inline simdjson_result(icelake::ondemand::json_iterator &&value) noexcept; ///< @private + simdjson_inline simdjson_result(ppc64::ondemand::json_iterator &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; @@ -80748,9 +118429,9 @@ struct simdjson_result<icelake::ondemand::json_iterator> : public icelake::imple } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_H -/* end file simdjson/generic/ondemand/json_iterator.h for icelake */ -/* including simdjson/generic/ondemand/json_type.h for icelake: #include "simdjson/generic/ondemand/json_type.h" */ -/* begin file simdjson/generic/ondemand/json_type.h for icelake */ +/* end file simdjson/generic/ondemand/json_iterator.h for ppc64 */ +/* including simdjson/generic/ondemand/json_type.h for ppc64: #include "simdjson/generic/ondemand/json_type.h" */ +/* begin file simdjson/generic/ondemand/json_type.h for ppc64 */ #ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -80761,7 +118442,7 @@ struct simdjson_result<icelake::ondemand::json_iterator> : public icelake::imple /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace icelake { +namespace ppc64 { namespace ondemand { /** @@ -80895,15 +118576,15 @@ inline std::ostream& operator<<(std::ostream& out, simdjson_result<json_type> &t #endif } // namespace ondemand -} // namespace icelake +} // namespace ppc64 } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<icelake::ondemand::json_type> : public icelake::implementation_simdjson_result_base<icelake::ondemand::json_type> { +struct simdjson_result<ppc64::ondemand::json_type> : public ppc64::implementation_simdjson_result_base<ppc64::ondemand::json_type> { public: - simdjson_inline simdjson_result(icelake::ondemand::json_type &&value) noexcept; ///< @private + simdjson_inline simdjson_result(ppc64::ondemand::json_type &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; simdjson_inline ~simdjson_result() noexcept = default; ///< @private @@ -80912,9 +118593,9 @@ struct simdjson_result<icelake::ondemand::json_type> : public icelake::implement } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_H -/* end file simdjson/generic/ondemand/json_type.h for icelake */ -/* including simdjson/generic/ondemand/raw_json_string.h for icelake: #include "simdjson/generic/ondemand/raw_json_string.h" */ -/* begin file simdjson/generic/ondemand/raw_json_string.h for icelake */ +/* end file simdjson/generic/ondemand/json_type.h for ppc64 */ +/* including simdjson/generic/ondemand/raw_json_string.h for ppc64: #include "simdjson/generic/ondemand/raw_json_string.h" */ +/* begin file simdjson/generic/ondemand/raw_json_string.h for ppc64 */ #ifndef SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -80924,7 +118605,7 @@ struct simdjson_result<icelake::ondemand::json_type> : public icelake::implement /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace icelake { +namespace ppc64 { namespace ondemand { /** @@ -81106,30 +118787,30 @@ simdjson_unused simdjson_inline bool operator!=(std::string_view c, const raw_js } // namespace ondemand -} // namespace icelake +} // namespace ppc64 } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<icelake::ondemand::raw_json_string> : public icelake::implementation_simdjson_result_base<icelake::ondemand::raw_json_string> { +struct simdjson_result<ppc64::ondemand::raw_json_string> : public ppc64::implementation_simdjson_result_base<ppc64::ondemand::raw_json_string> { public: - simdjson_inline simdjson_result(icelake::ondemand::raw_json_string &&value) noexcept; ///< @private + simdjson_inline simdjson_result(ppc64::ondemand::raw_json_string &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; simdjson_inline ~simdjson_result() noexcept = default; ///< @private simdjson_inline simdjson_result<const char *> raw() const noexcept; simdjson_inline char operator[](size_t) const noexcept; - simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> unescape(icelake::ondemand::json_iterator &iter, bool allow_replacement) const noexcept; - simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> unescape_wobbly(icelake::ondemand::json_iterator &iter) const noexcept; + simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> unescape(ppc64::ondemand::json_iterator &iter, bool allow_replacement) const noexcept; + simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> unescape_wobbly(ppc64::ondemand::json_iterator &iter) const noexcept; }; } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_H -/* end file simdjson/generic/ondemand/raw_json_string.h for icelake */ -/* including simdjson/generic/ondemand/parser.h for icelake: #include "simdjson/generic/ondemand/parser.h" */ -/* begin file simdjson/generic/ondemand/parser.h for icelake */ +/* end file simdjson/generic/ondemand/raw_json_string.h for ppc64 */ +/* including simdjson/generic/ondemand/parser.h for ppc64: #include "simdjson/generic/ondemand/parser.h" */ +/* begin file simdjson/generic/ondemand/parser.h for ppc64 */ #ifndef SIMDJSON_GENERIC_ONDEMAND_PARSER_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -81142,7 +118823,7 @@ struct simdjson_result<icelake::ondemand::raw_json_string> : public icelake::imp #include <thread> namespace simdjson { -namespace icelake { +namespace ppc64 { namespace ondemand { /** @@ -81542,15 +119223,15 @@ class parser { }; } // namespace ondemand -} // namespace icelake +} // namespace ppc64 } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<icelake::ondemand::parser> : public icelake::implementation_simdjson_result_base<icelake::ondemand::parser> { +struct simdjson_result<ppc64::ondemand::parser> : public ppc64::implementation_simdjson_result_base<ppc64::ondemand::parser> { public: - simdjson_inline simdjson_result(icelake::ondemand::parser &&value) noexcept; ///< @private + simdjson_inline simdjson_result(ppc64::ondemand::parser &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; }; @@ -81558,319 +119239,11 @@ struct simdjson_result<icelake::ondemand::parser> : public icelake::implementati } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_PARSER_H -/* end file simdjson/generic/ondemand/parser.h for icelake */ - -// JSON builder - needed for extract_into functionality -/* including simdjson/generic/ondemand/json_string_builder.h for icelake: #include "simdjson/generic/ondemand/json_string_builder.h" */ -/* begin file simdjson/generic/ondemand/json_string_builder.h for icelake */ -/** - * This file is part of the builder API. It is temporarily in the ondemand directory - * but we will move it to a builder directory later. - */ -#ifndef SIMDJSON_GENERIC_STRING_BUILDER_H - -/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_H */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */ -/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ - -namespace simdjson { - - -#if SIMDJSON_SUPPORTS_CONCEPTS - -namespace icelake { -namespace builder { - class string_builder; -}} - -template <typename T, typename = void> -struct has_custom_serialization : std::false_type {}; - -inline constexpr struct serialize_tag { - template <typename T> - constexpr void operator()(icelake::builder::string_builder& b, T&& obj) const{ - return tag_invoke(*this, b, std::forward<T>(obj)); - } - - -} serialize{}; -template <typename T> -struct has_custom_serialization<T, std::void_t< - decltype(tag_invoke(serialize, std::declval<icelake::builder::string_builder&>(), std::declval<T&>())) ->> : std::true_type {}; - -template <typename T> -constexpr bool require_custom_serialization = has_custom_serialization<T>::value; -#else -struct has_custom_serialization : std::false_type {}; -#endif // SIMDJSON_SUPPORTS_CONCEPTS - -namespace icelake { -namespace builder { -/** - * A builder for JSON strings representing documents. This is a low-level - * builder that is not meant to be used directly by end-users. Though it - * supports atomic types (Booleans, strings), it does not support composed - * types (arrays and objects). - * - * Ultimately, this class can support kernel-specific optimizations. E.g., - * it may make use of SIMD instructions to escape strings faster. - */ -class string_builder { -public: - simdjson_inline string_builder(size_t initial_capacity = DEFAULT_INITIAL_CAPACITY); - - static constexpr size_t DEFAULT_INITIAL_CAPACITY = 1024; - - /** - * Append number (includes Booleans). Booleans are mapped to the strings - * false and true. Numbers are converted to strings abiding by the JSON standard. - * Floating-point numbers are converted to the shortest string that 'correctly' - * represents the number. - */ - template<typename number_type, - typename = typename std::enable_if<std::is_arithmetic<number_type>::value>::type> - simdjson_inline void append(number_type v) noexcept; - - /** - * Append character c. - */ - simdjson_inline void append(char c) noexcept; - - /** - * Append the string 'null'. - */ - simdjson_inline void append_null() noexcept; - - /** - * Clear the content. - */ - simdjson_inline void clear() noexcept; - - /** - * Append the std::string_view, after escaping it. - * There is no UTF-8 validation. - */ - simdjson_inline void escape_and_append(std::string_view input) noexcept; - - /** - * Append the std::string_view surrounded by double quotes, after escaping it. - * There is no UTF-8 validation. - */ - simdjson_inline void escape_and_append_with_quotes(std::string_view input) noexcept; -#if SIMDJSON_SUPPORTS_CONCEPTS - template<constevalutil::fixed_string key> - simdjson_inline void escape_and_append_with_quotes() noexcept; -#endif - /** - * Append the character surrounded by double quotes, after escaping it. - * There is no UTF-8 validation. - */ - simdjson_inline void escape_and_append_with_quotes(char input) noexcept; - - /** - * Append the character surrounded by double quotes, after escaping it. - * There is no UTF-8 validation. - */ - simdjson_inline void escape_and_append_with_quotes(const char* input) noexcept; - - /** - * Append the C string directly, without escaping. - * There is no UTF-8 validation. - */ - simdjson_inline void append_raw(const char *c) noexcept; - - /** - * Append "{" to the buffer. - */ - simdjson_inline void start_object() noexcept; - - /** - * Append "}" to the buffer. - */ - simdjson_inline void end_object() noexcept; - - /** - * Append "[" to the buffer. - */ - simdjson_inline void start_array() noexcept; - - /** - * Append "]" to the buffer. - */ - simdjson_inline void end_array() noexcept; - - /** - * Append "," to the buffer. - */ - simdjson_inline void append_comma() noexcept; - - /** - * Append ":" to the buffer. - */ - simdjson_inline void append_colon() noexcept; - - /** - * Append a key-value pair to the buffer. - * The key is escaped and surrounded by double quotes. - * The value is escaped if it is a string. - */ - template<typename key_type, typename value_type> - simdjson_inline void append_key_value(key_type key, value_type value) noexcept; -#if SIMDJSON_SUPPORTS_CONCEPTS - template<constevalutil::fixed_string key, typename value_type> - simdjson_inline void append_key_value(value_type value) noexcept; - - // Support for optional types (std::optional, etc.) - template <concepts::optional_type T> - requires(!require_custom_serialization<T>) - simdjson_inline void append(const T &opt); - - template <typename T> - requires(require_custom_serialization<T>) - simdjson_inline void append(T &&val); - - // Support for string-like types - template <typename T> - requires(std::is_convertible<T, std::string_view>::value || - std::is_same<T, const char*>::value ) - simdjson_inline void append(const T &value); -#endif -#if SIMDJSON_SUPPORTS_RANGES && SIMDJSON_SUPPORTS_CONCEPTS - // Support for range-based appending (std::ranges::view, etc.) - template <std::ranges::range R> -requires (!std::is_convertible<R, std::string_view>::value && !require_custom_serialization<R>) - simdjson_inline void append(const R &range) noexcept; -#endif - /** - * Append the std::string_view directly, without escaping. - * There is no UTF-8 validation. - */ - simdjson_inline void append_raw(std::string_view input) noexcept; - - /** - * Append len characters from str. - * There is no UTF-8 validation. - */ - simdjson_inline void append_raw(const char *str, size_t len) noexcept; -#if SIMDJSON_EXCEPTIONS - /** - * Creates an std::string from the written JSON buffer. - * Throws if memory allocation failed - * - * The result may not be valid UTF-8 if some of your content was not valid UTF-8. - * Use validate_unicode() to check the content if needed. - */ - simdjson_inline operator std::string() const noexcept(false); - - /** - * Creates an std::string_view from the written JSON buffer. - * Throws if memory allocation failed. - * - * The result may not be valid UTF-8 if some of your content was not valid UTF-8. - * Use validate_unicode() to check the content if needed. - */ - simdjson_inline operator std::string_view() const noexcept(false) simdjson_lifetime_bound; -#endif - - /** - * Returns a view on the written JSON buffer. Returns an error - * if memory allocation failed. - * - * The result may not be valid UTF-8 if some of your content was not valid UTF-8. - * Use validate_unicode() to check the content. - */ - simdjson_inline simdjson_result<std::string_view> view() const noexcept; - - /** - * Appends the null character to the buffer and returns - * a pointer to the beginning of the written JSON buffer. - * Returns an error if memory allocation failed. - * The result is null-terminated. - * - * The result may not be valid UTF-8 if some of your content was not valid UTF-8. - * Use validate_unicode() to check the content. - */ - simdjson_inline simdjson_result<const char *> c_str() noexcept; - - /** - * Return true if the content is valid UTF-8. - */ - simdjson_inline bool validate_unicode() const noexcept; - - /** - * Returns the current size of the written JSON buffer. - * If an error occurred, returns 0. - */ - simdjson_inline size_t size() const noexcept; - -private: - /** - * Returns true if we can write at least upcoming_bytes bytes. - * The underlying buffer is reallocated if needed. It is designed - * to be called before writing to the buffer. It should be fast. - */ - simdjson_inline bool capacity_check(size_t upcoming_bytes); - - /** - * Grow the buffer to at least desired_capacity bytes. - * If the allocation fails, is_valid is set to false. We expect - * that this function would not be repeatedly called. - */ - simdjson_inline void grow_buffer(size_t desired_capacity); - - /** - * We use this helper function to make sure that is_valid is kept consistent. - */ - simdjson_inline void set_valid(bool valid) noexcept; - - std::unique_ptr<char[]> buffer{}; - size_t position{0}; - size_t capacity{0}; - bool is_valid{true}; -}; - - - -} -} - - -#if !SIMDJSON_STATIC_REFLECTION -// fallback implementation until we have static reflection -template <class Z> -simdjson_warn_unused simdjson_result<std::string> to_json(const Z &z, size_t initial_capacity = simdjson::icelake::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { - simdjson::icelake::builder::string_builder b(initial_capacity); - b.append(z); - std::string_view s; - auto e = b.view().get(s); - if(e) { return e; } - return std::string(s); -} -template <class Z> -simdjson_warn_unused simdjson_error to_json(const Z &z, std::string &s, size_t initial_capacity = simdjson::icelake::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { - simdjson::icelake::builder::string_builder b(initial_capacity); - b.append(z); - std::string_view sv; - auto e = b.view().get(sv); - if(e) { return e; } - s.assign(sv.data(), sv.size()); - return simdjson::SUCCESS; -} -#endif - -#if SIMDJSON_SUPPORTS_CONCEPTS -#endif // SIMDJSON_SUPPORTS_CONCEPTS - -} // namespace simdjson - -#endif // SIMDJSON_GENERIC_STRING_BUILDER_H -/* end file simdjson/generic/ondemand/json_string_builder.h for icelake */ +/* end file simdjson/generic/ondemand/parser.h for ppc64 */ // All other declarations -/* including simdjson/generic/ondemand/array.h for icelake: #include "simdjson/generic/ondemand/array.h" */ -/* begin file simdjson/generic/ondemand/array.h for icelake */ +/* including simdjson/generic/ondemand/array.h for ppc64: #include "simdjson/generic/ondemand/array.h" */ +/* begin file simdjson/generic/ondemand/array.h for ppc64 */ #ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -81882,7 +119255,7 @@ simdjson_warn_unused simdjson_error to_json(const Z &z, std::string &s, size_t i /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace icelake { +namespace ppc64 { namespace ondemand { /** @@ -82102,27 +119475,27 @@ class array { }; } // namespace ondemand -} // namespace icelake +} // namespace ppc64 } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<icelake::ondemand::array> : public icelake::implementation_simdjson_result_base<icelake::ondemand::array> { +struct simdjson_result<ppc64::ondemand::array> : public ppc64::implementation_simdjson_result_base<ppc64::ondemand::array> { public: - simdjson_inline simdjson_result(icelake::ondemand::array &&value) noexcept; ///< @private + simdjson_inline simdjson_result(ppc64::ondemand::array &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; - simdjson_inline simdjson_result<icelake::ondemand::array_iterator> begin() noexcept; - simdjson_inline simdjson_result<icelake::ondemand::array_iterator> end() noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::array_iterator> begin() noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::array_iterator> end() noexcept; inline simdjson_result<size_t> count_elements() & noexcept; inline simdjson_result<bool> is_empty() & noexcept; inline simdjson_result<bool> reset() & noexcept; - simdjson_inline simdjson_result<icelake::ondemand::value> at(size_t index) noexcept; - simdjson_inline simdjson_result<icelake::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result<icelake::ondemand::value> at_path(std::string_view json_path) noexcept; - simdjson_inline simdjson_result<std::vector<icelake::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::value> at(size_t index) noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::value> at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<std::vector<ppc64::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; simdjson_inline simdjson_result<std::string_view> raw_json() noexcept; #if SIMDJSON_SUPPORTS_CONCEPTS // TODO: move this code into object-inl.h @@ -82130,7 +119503,7 @@ struct simdjson_result<icelake::ondemand::array> : public icelake::implementatio template<typename T> simdjson_inline simdjson_result<T> get() noexcept { if (error()) { return error(); } - if constexpr (std::is_same_v<T, icelake::ondemand::array>) { + if constexpr (std::is_same_v<T, ppc64::ondemand::array>) { return first; } return first.get<T>(); @@ -82138,7 +119511,7 @@ struct simdjson_result<icelake::ondemand::array> : public icelake::implementatio template<typename T> simdjson_warn_unused simdjson_inline error_code get(T& out) noexcept { if (error()) { return error(); } - if constexpr (std::is_same_v<T, icelake::ondemand::array>) { + if constexpr (std::is_same_v<T, ppc64::ondemand::array>) { out = first; } else { SIMDJSON_TRY( first.get<T>(out) ); @@ -82151,13 +119524,14 @@ struct simdjson_result<icelake::ondemand::array> : public icelake::implementatio } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_H -/* end file simdjson/generic/ondemand/array.h for icelake */ -/* including simdjson/generic/ondemand/array_iterator.h for icelake: #include "simdjson/generic/ondemand/array_iterator.h" */ -/* begin file simdjson/generic/ondemand/array_iterator.h for icelake */ +/* end file simdjson/generic/ondemand/array.h for ppc64 */ +/* including simdjson/generic/ondemand/array_iterator.h for ppc64: #include "simdjson/generic/ondemand/array_iterator.h" */ +/* begin file simdjson/generic/ondemand/array_iterator.h for ppc64 */ #ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ /* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H */ +/* amalgamation skipped (editor-only): #include <iterator> */ /* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */ @@ -82165,7 +119539,7 @@ struct simdjson_result<icelake::ondemand::array> : public icelake::implementatio namespace simdjson { -namespace icelake { +namespace ppc64 { namespace ondemand { /** @@ -82173,11 +119547,17 @@ namespace ondemand { * * This is an input_iterator, meaning: * - It is forward-only - * - * must be called exactly once per element. + * - * must be called at most once per element. * - ++ must be called exactly once in between each * (*, ++, *, ++, * ...) */ class array_iterator { public: + using iterator_category = std::input_iterator_tag; + using value_type = simdjson_result<value>; + using difference_type = std::ptrdiff_t; + using pointer = void; + using reference = value_type; + /** Create a new, invalid array iterator. */ simdjson_inline array_iterator() noexcept = default; @@ -82221,6 +119601,9 @@ class array_iterator { simdjson_warn_unused simdjson_inline bool at_end() const noexcept; private: +#if SIMDJSON_DEVELOPMENT_CHECKS + bool has_been_referenced{false}; +#endif value_iterator iter{}; simdjson_inline array_iterator(const value_iterator &iter) noexcept; @@ -82231,14 +119614,20 @@ class array_iterator { }; } // namespace ondemand -} // namespace icelake +} // namespace ppc64 } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<icelake::ondemand::array_iterator> : public icelake::implementation_simdjson_result_base<icelake::ondemand::array_iterator> { - simdjson_inline simdjson_result(icelake::ondemand::array_iterator &&value) noexcept; ///< @private +struct simdjson_result<ppc64::ondemand::array_iterator> : public ppc64::implementation_simdjson_result_base<ppc64::ondemand::array_iterator> { + using iterator_category = std::input_iterator_tag; + using value_type = simdjson_result<ppc64::ondemand::value>; + using difference_type = std::ptrdiff_t; + using pointer = void; + using reference = value_type; + + simdjson_inline simdjson_result(ppc64::ondemand::array_iterator &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; @@ -82246,10 +119635,10 @@ struct simdjson_result<icelake::ondemand::array_iterator> : public icelake::impl // Iterator interface // - simdjson_inline simdjson_result<icelake::ondemand::value> operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. - simdjson_inline bool operator==(const simdjson_result<icelake::ondemand::array_iterator> &) const noexcept; - simdjson_inline bool operator!=(const simdjson_result<icelake::ondemand::array_iterator> &) const noexcept; - simdjson_inline simdjson_result<icelake::ondemand::array_iterator> &operator++() noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::value> operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. + simdjson_inline bool operator==(const simdjson_result<ppc64::ondemand::array_iterator> &) const noexcept; + simdjson_inline bool operator!=(const simdjson_result<ppc64::ondemand::array_iterator> &) const noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::array_iterator> &operator++() noexcept; simdjson_warn_unused simdjson_inline bool at_end() const noexcept; }; @@ -82257,9 +119646,9 @@ struct simdjson_result<icelake::ondemand::array_iterator> : public icelake::impl } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H -/* end file simdjson/generic/ondemand/array_iterator.h for icelake */ -/* including simdjson/generic/ondemand/document.h for icelake: #include "simdjson/generic/ondemand/document.h" */ -/* begin file simdjson/generic/ondemand/document.h for icelake */ +/* end file simdjson/generic/ondemand/array_iterator.h for ppc64 */ +/* including simdjson/generic/ondemand/document.h for ppc64: #include "simdjson/generic/ondemand/document.h" */ +/* begin file simdjson/generic/ondemand/document.h for ppc64 */ #ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -82273,7 +119662,7 @@ struct simdjson_result<icelake::ondemand::array_iterator> : public icelake::impl namespace simdjson { -namespace icelake { +namespace ppc64 { namespace ondemand { /** @@ -83225,21 +120614,21 @@ class document_reference { document *doc{nullptr}; }; } // namespace ondemand -} // namespace icelake +} // namespace ppc64 } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<icelake::ondemand::document> : public icelake::implementation_simdjson_result_base<icelake::ondemand::document> { +struct simdjson_result<ppc64::ondemand::document> : public ppc64::implementation_simdjson_result_base<ppc64::ondemand::document> { public: - simdjson_inline simdjson_result(icelake::ondemand::document &&value) noexcept; ///< @private + simdjson_inline simdjson_result(ppc64::ondemand::document &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; simdjson_inline error_code rewind() noexcept; - simdjson_inline simdjson_result<icelake::ondemand::array> get_array() & noexcept; - simdjson_inline simdjson_result<icelake::ondemand::object> get_object() & noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::array> get_array() & noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::object> get_object() & noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64() noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64_in_string() noexcept; simdjson_inline simdjson_result<int64_t> get_int64() noexcept; @@ -83250,9 +120639,9 @@ struct simdjson_result<icelake::ondemand::document> : public icelake::implementa template <typename string_type> simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result<std::string_view> get_wobbly_string() noexcept; - simdjson_inline simdjson_result<icelake::ondemand::raw_json_string> get_raw_json_string() noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::raw_json_string> get_raw_json_string() noexcept; simdjson_inline simdjson_result<bool> get_bool() noexcept; - simdjson_inline simdjson_result<icelake::ondemand::value> get_value() noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::value> get_value() noexcept; simdjson_inline simdjson_result<bool> is_null() noexcept; template<typename T> simdjson_inline simdjson_result<T> get() & noexcept; @@ -83262,33 +120651,33 @@ struct simdjson_result<icelake::ondemand::document> : public icelake::implementa template<typename T> simdjson_inline error_code get(T &out) && noexcept; #if SIMDJSON_EXCEPTIONS - using icelake::implementation_simdjson_result_base<icelake::ondemand::document>::operator*; - using icelake::implementation_simdjson_result_base<icelake::ondemand::document>::operator->; - template <class T, typename std::enable_if<std::is_same<T, icelake::ondemand::document>::value == false>::type> + using ppc64::implementation_simdjson_result_base<ppc64::ondemand::document>::operator*; + using ppc64::implementation_simdjson_result_base<ppc64::ondemand::document>::operator->; + template <class T, typename std::enable_if<std::is_same<T, ppc64::ondemand::document>::value == false>::type> explicit simdjson_inline operator T() noexcept(false); - simdjson_inline operator icelake::ondemand::array() & noexcept(false); - simdjson_inline operator icelake::ondemand::object() & noexcept(false); + simdjson_inline operator ppc64::ondemand::array() & noexcept(false); + simdjson_inline operator ppc64::ondemand::object() & noexcept(false); simdjson_inline operator uint64_t() noexcept(false); simdjson_inline operator int64_t() noexcept(false); simdjson_inline operator double() noexcept(false); simdjson_inline operator std::string_view() noexcept(false); - simdjson_inline operator icelake::ondemand::raw_json_string() noexcept(false); + simdjson_inline operator ppc64::ondemand::raw_json_string() noexcept(false); simdjson_inline operator bool() noexcept(false); - simdjson_inline operator icelake::ondemand::value() noexcept(false); + simdjson_inline operator ppc64::ondemand::value() noexcept(false); #endif simdjson_inline simdjson_result<size_t> count_elements() & noexcept; simdjson_inline simdjson_result<size_t> count_fields() & noexcept; - simdjson_inline simdjson_result<icelake::ondemand::value> at(size_t index) & noexcept; - simdjson_inline simdjson_result<icelake::ondemand::array_iterator> begin() & noexcept; - simdjson_inline simdjson_result<icelake::ondemand::array_iterator> end() & noexcept; - simdjson_inline simdjson_result<icelake::ondemand::value> find_field(std::string_view key) & noexcept; - simdjson_inline simdjson_result<icelake::ondemand::value> find_field(const char *key) & noexcept; - simdjson_inline simdjson_result<icelake::ondemand::value> operator[](std::string_view key) & noexcept; - simdjson_inline simdjson_result<icelake::ondemand::value> operator[](const char *key) & noexcept; - simdjson_result<icelake::ondemand::value> operator[](int) & noexcept = delete; - simdjson_inline simdjson_result<icelake::ondemand::value> find_field_unordered(std::string_view key) & noexcept; - simdjson_inline simdjson_result<icelake::ondemand::value> find_field_unordered(const char *key) & noexcept; - simdjson_inline simdjson_result<icelake::ondemand::json_type> type() noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::value> at(size_t index) & noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::array_iterator> begin() & noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::array_iterator> end() & noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::value> find_field(std::string_view key) & noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::value> find_field(const char *key) & noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::value> operator[](std::string_view key) & noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::value> operator[](const char *key) & noexcept; + simdjson_result<ppc64::ondemand::value> operator[](int) & noexcept = delete; + simdjson_inline simdjson_result<ppc64::ondemand::value> find_field_unordered(std::string_view key) & noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::value> find_field_unordered(const char *key) & noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::json_type> type() noexcept; simdjson_inline simdjson_result<bool> is_scalar() noexcept; simdjson_inline simdjson_result<bool> is_string() noexcept; simdjson_inline simdjson_result<const char *> current_location() noexcept; @@ -83296,14 +120685,14 @@ struct simdjson_result<icelake::ondemand::document> : public icelake::implementa simdjson_inline bool at_end() const noexcept; simdjson_inline bool is_negative() noexcept; simdjson_inline simdjson_result<bool> is_integer() noexcept; - simdjson_inline simdjson_result<icelake::number_type> get_number_type() noexcept; - simdjson_inline simdjson_result<icelake::ondemand::number> get_number() noexcept; + simdjson_inline simdjson_result<ppc64::number_type> get_number_type() noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::number> get_number() noexcept; /** @copydoc simdjson_inline std::string_view document::raw_json_token() const noexcept */ simdjson_inline simdjson_result<std::string_view> raw_json_token() noexcept; - simdjson_inline simdjson_result<icelake::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result<icelake::ondemand::value> at_path(std::string_view json_path) noexcept; - simdjson_inline simdjson_result<std::vector<icelake::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::value> at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<std::vector<ppc64::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; #if SIMDJSON_STATIC_REFLECTION template<constevalutil::fixed_string... FieldNames, typename T> requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) @@ -83319,14 +120708,14 @@ struct simdjson_result<icelake::ondemand::document> : public icelake::implementa namespace simdjson { template<> -struct simdjson_result<icelake::ondemand::document_reference> : public icelake::implementation_simdjson_result_base<icelake::ondemand::document_reference> { +struct simdjson_result<ppc64::ondemand::document_reference> : public ppc64::implementation_simdjson_result_base<ppc64::ondemand::document_reference> { public: - simdjson_inline simdjson_result(icelake::ondemand::document_reference value, error_code error) noexcept; + simdjson_inline simdjson_result(ppc64::ondemand::document_reference value, error_code error) noexcept; simdjson_inline simdjson_result() noexcept = default; simdjson_inline error_code rewind() noexcept; - simdjson_inline simdjson_result<icelake::ondemand::array> get_array() & noexcept; - simdjson_inline simdjson_result<icelake::ondemand::object> get_object() & noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::array> get_array() & noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::object> get_object() & noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64() noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64_in_string() noexcept; simdjson_inline simdjson_result<int64_t> get_int64() noexcept; @@ -83337,9 +120726,9 @@ struct simdjson_result<icelake::ondemand::document_reference> : public icelake:: template <typename string_type> simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result<std::string_view> get_wobbly_string() noexcept; - simdjson_inline simdjson_result<icelake::ondemand::raw_json_string> get_raw_json_string() noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::raw_json_string> get_raw_json_string() noexcept; simdjson_inline simdjson_result<bool> get_bool() noexcept; - simdjson_inline simdjson_result<icelake::ondemand::value> get_value() noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::value> get_value() noexcept; simdjson_inline simdjson_result<bool> is_null() noexcept; template<typename T> simdjson_inline simdjson_result<T> get() & noexcept; @@ -83350,43 +120739,43 @@ struct simdjson_result<icelake::ondemand::document_reference> : public icelake:: #if SIMDJSON_EXCEPTIONS template <class T> explicit simdjson_inline operator T() noexcept(false); - simdjson_inline operator icelake::ondemand::array() & noexcept(false); - simdjson_inline operator icelake::ondemand::object() & noexcept(false); + simdjson_inline operator ppc64::ondemand::array() & noexcept(false); + simdjson_inline operator ppc64::ondemand::object() & noexcept(false); simdjson_inline operator uint64_t() noexcept(false); simdjson_inline operator int64_t() noexcept(false); simdjson_inline operator double() noexcept(false); simdjson_inline operator std::string_view() noexcept(false); - simdjson_inline operator icelake::ondemand::raw_json_string() noexcept(false); + simdjson_inline operator ppc64::ondemand::raw_json_string() noexcept(false); simdjson_inline operator bool() noexcept(false); - simdjson_inline operator icelake::ondemand::value() noexcept(false); + simdjson_inline operator ppc64::ondemand::value() noexcept(false); #endif simdjson_inline simdjson_result<size_t> count_elements() & noexcept; simdjson_inline simdjson_result<size_t> count_fields() & noexcept; - simdjson_inline simdjson_result<icelake::ondemand::value> at(size_t index) & noexcept; - simdjson_inline simdjson_result<icelake::ondemand::array_iterator> begin() & noexcept; - simdjson_inline simdjson_result<icelake::ondemand::array_iterator> end() & noexcept; - simdjson_inline simdjson_result<icelake::ondemand::value> find_field(std::string_view key) & noexcept; - simdjson_inline simdjson_result<icelake::ondemand::value> find_field(const char *key) & noexcept; - simdjson_inline simdjson_result<icelake::ondemand::value> operator[](std::string_view key) & noexcept; - simdjson_inline simdjson_result<icelake::ondemand::value> operator[](const char *key) & noexcept; - simdjson_result<icelake::ondemand::value> operator[](int) & noexcept = delete; - simdjson_inline simdjson_result<icelake::ondemand::value> find_field_unordered(std::string_view key) & noexcept; - simdjson_inline simdjson_result<icelake::ondemand::value> find_field_unordered(const char *key) & noexcept; - simdjson_inline simdjson_result<icelake::ondemand::json_type> type() noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::value> at(size_t index) & noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::array_iterator> begin() & noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::array_iterator> end() & noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::value> find_field(std::string_view key) & noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::value> find_field(const char *key) & noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::value> operator[](std::string_view key) & noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::value> operator[](const char *key) & noexcept; + simdjson_result<ppc64::ondemand::value> operator[](int) & noexcept = delete; + simdjson_inline simdjson_result<ppc64::ondemand::value> find_field_unordered(std::string_view key) & noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::value> find_field_unordered(const char *key) & noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::json_type> type() noexcept; simdjson_inline simdjson_result<bool> is_scalar() noexcept; simdjson_inline simdjson_result<bool> is_string() noexcept; simdjson_inline simdjson_result<const char *> current_location() noexcept; simdjson_inline simdjson_result<int32_t> current_depth() const noexcept; simdjson_inline simdjson_result<bool> is_negative() noexcept; simdjson_inline simdjson_result<bool> is_integer() noexcept; - simdjson_inline simdjson_result<icelake::number_type> get_number_type() noexcept; - simdjson_inline simdjson_result<icelake::ondemand::number> get_number() noexcept; + simdjson_inline simdjson_result<ppc64::number_type> get_number_type() noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::number> get_number() noexcept; /** @copydoc simdjson_inline std::string_view document_reference::raw_json_token() const noexcept */ simdjson_inline simdjson_result<std::string_view> raw_json_token() noexcept; - simdjson_inline simdjson_result<icelake::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result<icelake::ondemand::value> at_path(std::string_view json_path) noexcept; - simdjson_inline simdjson_result<std::vector<icelake::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::value> at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<std::vector<ppc64::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; #if SIMDJSON_STATIC_REFLECTION template<constevalutil::fixed_string... FieldNames, typename T> requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) @@ -83398,9 +120787,9 @@ struct simdjson_result<icelake::ondemand::document_reference> : public icelake:: } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_H -/* end file simdjson/generic/ondemand/document.h for icelake */ -/* including simdjson/generic/ondemand/document_stream.h for icelake: #include "simdjson/generic/ondemand/document_stream.h" */ -/* begin file simdjson/generic/ondemand/document_stream.h for icelake */ +/* end file simdjson/generic/ondemand/document.h for ppc64 */ +/* including simdjson/generic/ondemand/document_stream.h for ppc64: #include "simdjson/generic/ondemand/document_stream.h" */ +/* begin file simdjson/generic/ondemand/document_stream.h for ppc64 */ #ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -83418,7 +120807,7 @@ struct simdjson_result<icelake::ondemand::document_reference> : public icelake:: #endif namespace simdjson { -namespace icelake { +namespace ppc64 { namespace ondemand { #ifdef SIMDJSON_THREADS_ENABLED @@ -83731,14 +121120,14 @@ class document_stream { }; // document_stream } // namespace ondemand -} // namespace icelake +} // namespace ppc64 } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<icelake::ondemand::document_stream> : public icelake::implementation_simdjson_result_base<icelake::ondemand::document_stream> { +struct simdjson_result<ppc64::ondemand::document_stream> : public ppc64::implementation_simdjson_result_base<ppc64::ondemand::document_stream> { public: - simdjson_inline simdjson_result(icelake::ondemand::document_stream &&value) noexcept; ///< @private + simdjson_inline simdjson_result(ppc64::ondemand::document_stream &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; }; @@ -83746,9 +121135,9 @@ struct simdjson_result<icelake::ondemand::document_stream> : public icelake::imp } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_H -/* end file simdjson/generic/ondemand/document_stream.h for icelake */ -/* including simdjson/generic/ondemand/field.h for icelake: #include "simdjson/generic/ondemand/field.h" */ -/* begin file simdjson/generic/ondemand/field.h for icelake */ +/* end file simdjson/generic/ondemand/document_stream.h for ppc64 */ +/* including simdjson/generic/ondemand/field.h for ppc64: #include "simdjson/generic/ondemand/field.h" */ +/* begin file simdjson/generic/ondemand/field.h for ppc64 */ #ifndef SIMDJSON_GENERIC_ONDEMAND_FIELD_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -83760,7 +121149,7 @@ struct simdjson_result<icelake::ondemand::document_stream> : public icelake::imp /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace icelake { +namespace ppc64 { namespace ondemand { /** @@ -83838,33 +121227,33 @@ class field : public std::pair<raw_json_string, value> { }; } // namespace ondemand -} // namespace icelake +} // namespace ppc64 } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<icelake::ondemand::field> : public icelake::implementation_simdjson_result_base<icelake::ondemand::field> { +struct simdjson_result<ppc64::ondemand::field> : public ppc64::implementation_simdjson_result_base<ppc64::ondemand::field> { public: - simdjson_inline simdjson_result(icelake::ondemand::field &&value) noexcept; ///< @private + simdjson_inline simdjson_result(ppc64::ondemand::field &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; simdjson_inline simdjson_result<std::string_view> unescaped_key(bool allow_replacement = false) noexcept; template<typename string_type> simdjson_inline error_code unescaped_key(string_type &receiver, bool allow_replacement = false) noexcept; - simdjson_inline simdjson_result<icelake::ondemand::raw_json_string> key() noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::raw_json_string> key() noexcept; simdjson_inline simdjson_result<std::string_view> key_raw_json_token() noexcept; simdjson_inline simdjson_result<std::string_view> escaped_key() noexcept; - simdjson_inline simdjson_result<icelake::ondemand::value> value() noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::value> value() noexcept; }; } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_FIELD_H -/* end file simdjson/generic/ondemand/field.h for icelake */ -/* including simdjson/generic/ondemand/object.h for icelake: #include "simdjson/generic/ondemand/object.h" */ -/* begin file simdjson/generic/ondemand/object.h for icelake */ +/* end file simdjson/generic/ondemand/field.h for ppc64 */ +/* including simdjson/generic/ondemand/object.h for ppc64: #include "simdjson/generic/ondemand/object.h" */ +/* begin file simdjson/generic/ondemand/object.h for ppc64 */ #ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -83879,7 +121268,7 @@ struct simdjson_result<icelake::ondemand::field> : public icelake::implementatio /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace icelake { +namespace ppc64 { namespace ondemand { /** @@ -83894,6 +121283,13 @@ class object { */ simdjson_inline object() noexcept = default; + /** + * Get an iterator to the start of the object. We recommend using a range-based for loop. + * + * Using the iterator directly is also possible but error-prone and discouraged. In particular, + * you must dereference the iterator exactly once per iteration (before calling '++'). + * Doing otherwise is unsafe and may lead to errors. You are responsible for ensuring + */ simdjson_inline simdjson_result<object_iterator> begin() noexcept; simdjson_inline simdjson_result<object_iterator> end() noexcept; /** @@ -84166,29 +121562,29 @@ class object { }; } // namespace ondemand -} // namespace icelake +} // namespace ppc64 } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<icelake::ondemand::object> : public icelake::implementation_simdjson_result_base<icelake::ondemand::object> { +struct simdjson_result<ppc64::ondemand::object> : public ppc64::implementation_simdjson_result_base<ppc64::ondemand::object> { public: - simdjson_inline simdjson_result(icelake::ondemand::object &&value) noexcept; ///< @private + simdjson_inline simdjson_result(ppc64::ondemand::object &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; - simdjson_inline simdjson_result<icelake::ondemand::object_iterator> begin() noexcept; - simdjson_inline simdjson_result<icelake::ondemand::object_iterator> end() noexcept; - simdjson_inline simdjson_result<icelake::ondemand::value> find_field(std::string_view key) & noexcept; - simdjson_inline simdjson_result<icelake::ondemand::value> find_field(std::string_view key) && noexcept; - simdjson_inline simdjson_result<icelake::ondemand::value> find_field_unordered(std::string_view key) & noexcept; - simdjson_inline simdjson_result<icelake::ondemand::value> find_field_unordered(std::string_view key) && noexcept; - simdjson_inline simdjson_result<icelake::ondemand::value> operator[](std::string_view key) & noexcept; - simdjson_inline simdjson_result<icelake::ondemand::value> operator[](std::string_view key) && noexcept; - simdjson_inline simdjson_result<icelake::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result<icelake::ondemand::value> at_path(std::string_view json_path) noexcept; - simdjson_inline simdjson_result<std::vector<icelake::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::object_iterator> begin() noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::object_iterator> end() noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::value> find_field(std::string_view key) & noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::value> find_field(std::string_view key) && noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::value> find_field_unordered(std::string_view key) & noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::value> find_field_unordered(std::string_view key) && noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::value> operator[](std::string_view key) & noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::value> operator[](std::string_view key) && noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::value> at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<std::vector<ppc64::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; inline simdjson_result<bool> reset() noexcept; inline simdjson_result<bool> is_empty() noexcept; inline simdjson_result<size_t> count_fields() & noexcept; @@ -84199,7 +121595,7 @@ struct simdjson_result<icelake::ondemand::object> : public icelake::implementati template<typename T> simdjson_inline simdjson_result<T> get() noexcept { if (error()) { return error(); } - if constexpr (std::is_same_v<T, icelake::ondemand::object>) { + if constexpr (std::is_same_v<T, ppc64::ondemand::object>) { return first; } return first.get<T>(); @@ -84207,7 +121603,7 @@ struct simdjson_result<icelake::ondemand::object> : public icelake::implementati template<typename T> simdjson_warn_unused simdjson_inline error_code get(T& out) noexcept { if (error()) { return error(); } - if constexpr (std::is_same_v<T, icelake::ondemand::object>) { + if constexpr (std::is_same_v<T, ppc64::ondemand::object>) { out = first; } else { SIMDJSON_TRY( first.get<T>(out) ); @@ -84230,9 +121626,9 @@ struct simdjson_result<icelake::ondemand::object> : public icelake::implementati } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_H -/* end file simdjson/generic/ondemand/object.h for icelake */ -/* including simdjson/generic/ondemand/object_iterator.h for icelake: #include "simdjson/generic/ondemand/object_iterator.h" */ -/* begin file simdjson/generic/ondemand/object_iterator.h for icelake */ +/* end file simdjson/generic/ondemand/object.h for ppc64 */ +/* including simdjson/generic/ondemand/object_iterator.h for ppc64: #include "simdjson/generic/ondemand/object_iterator.h" */ +/* begin file simdjson/generic/ondemand/object_iterator.h for ppc64 */ #ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -84243,7 +121639,7 @@ struct simdjson_result<icelake::ondemand::object> : public icelake::implementati /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace icelake { +namespace ppc64 { namespace ondemand { class object_iterator { @@ -84267,9 +121663,14 @@ class object_iterator { // Assumes it's being compared with the end. true if depth >= iter->depth. simdjson_inline bool operator!=(const object_iterator &) const noexcept; // Checks for ']' and ',' + // YOU MUST NOT CALL THIS IF operator* YIELDED AN ERROR. + // YOU MUST NOT CALL THIS WITHOUT A CORRESPONDING operator* CALL. simdjson_inline object_iterator &operator++() noexcept; private: +#if SIMDJSON_DEVELOPMENT_CHECKS + bool has_been_referenced{false}; +#endif /** * The underlying JSON iterator. * @@ -84284,15 +121685,15 @@ class object_iterator { }; } // namespace ondemand -} // namespace icelake +} // namespace ppc64 } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<icelake::ondemand::object_iterator> : public icelake::implementation_simdjson_result_base<icelake::ondemand::object_iterator> { +struct simdjson_result<ppc64::ondemand::object_iterator> : public ppc64::implementation_simdjson_result_base<ppc64::ondemand::object_iterator> { public: - simdjson_inline simdjson_result(icelake::ondemand::object_iterator &&value) noexcept; ///< @private + simdjson_inline simdjson_result(ppc64::ondemand::object_iterator &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; @@ -84301,21 +121702,21 @@ struct simdjson_result<icelake::ondemand::object_iterator> : public icelake::imp // // Reads key and value, yielding them to the user. - simdjson_inline simdjson_result<icelake::ondemand::field> operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. + simdjson_inline simdjson_result<ppc64::ondemand::field> operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. // Assumes it's being compared with the end. true if depth < iter->depth. - simdjson_inline bool operator==(const simdjson_result<icelake::ondemand::object_iterator> &) const noexcept; + simdjson_inline bool operator==(const simdjson_result<ppc64::ondemand::object_iterator> &) const noexcept; // Assumes it's being compared with the end. true if depth >= iter->depth. - simdjson_inline bool operator!=(const simdjson_result<icelake::ondemand::object_iterator> &) const noexcept; + simdjson_inline bool operator!=(const simdjson_result<ppc64::ondemand::object_iterator> &) const noexcept; // Checks for ']' and ',' - simdjson_inline simdjson_result<icelake::ondemand::object_iterator> &operator++() noexcept; + simdjson_inline simdjson_result<ppc64::ondemand::object_iterator> &operator++() noexcept; }; } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_H -/* end file simdjson/generic/ondemand/object_iterator.h for icelake */ -/* including simdjson/generic/ondemand/serialization.h for icelake: #include "simdjson/generic/ondemand/serialization.h" */ -/* begin file simdjson/generic/ondemand/serialization.h for icelake */ +/* end file simdjson/generic/ondemand/object_iterator.h for ppc64 */ +/* including simdjson/generic/ondemand/serialization.h for ppc64: #include "simdjson/generic/ondemand/serialization.h" */ +/* begin file simdjson/generic/ondemand/serialization.h for ppc64 */ #ifndef SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -84329,30 +121730,30 @@ namespace simdjson { * contains JSON text that is suitable to be parsed as JSON again. It does not * validate the content. */ -inline simdjson_result<std::string_view> to_json_string(icelake::ondemand::document& x) noexcept; +inline simdjson_result<std::string_view> to_json_string(ppc64::ondemand::document& x) noexcept; /** * Create a string-view instance out of a value instance. The string-view instance * contains JSON text that is suitable to be parsed as JSON again. The value must * not have been accessed previously. It does not * validate the content. */ -inline simdjson_result<std::string_view> to_json_string(icelake::ondemand::value& x) noexcept; +inline simdjson_result<std::string_view> to_json_string(ppc64::ondemand::value& x) noexcept; /** * Create a string-view instance out of an object instance. The string-view instance * contains JSON text that is suitable to be parsed as JSON again. It does not * validate the content. */ -inline simdjson_result<std::string_view> to_json_string(icelake::ondemand::object& x) noexcept; +inline simdjson_result<std::string_view> to_json_string(ppc64::ondemand::object& x) noexcept; /** * Create a string-view instance out of an array instance. The string-view instance * contains JSON text that is suitable to be parsed as JSON again. It does not * validate the content. */ -inline simdjson_result<std::string_view> to_json_string(icelake::ondemand::array& x) noexcept; -inline simdjson_result<std::string_view> to_json_string(simdjson_result<icelake::ondemand::document> x); -inline simdjson_result<std::string_view> to_json_string(simdjson_result<icelake::ondemand::value> x); -inline simdjson_result<std::string_view> to_json_string(simdjson_result<icelake::ondemand::object> x); -inline simdjson_result<std::string_view> to_json_string(simdjson_result<icelake::ondemand::array> x); +inline simdjson_result<std::string_view> to_json_string(ppc64::ondemand::array& x) noexcept; +inline simdjson_result<std::string_view> to_json_string(simdjson_result<ppc64::ondemand::document> x); +inline simdjson_result<std::string_view> to_json_string(simdjson_result<ppc64::ondemand::value> x); +inline simdjson_result<std::string_view> to_json_string(simdjson_result<ppc64::ondemand::object> x); +inline simdjson_result<std::string_view> to_json_string(simdjson_result<ppc64::ondemand::array> x); #if SIMDJSON_STATIC_REFLECTION /** @@ -84360,10 +121761,10 @@ inline simdjson_result<std::string_view> to_json_string(simdjson_result<icelake: * Only available when SIMDJSON_STATIC_REFLECTION is enabled. */ template<typename T> - requires(!std::same_as<T, icelake::ondemand::document> && - !std::same_as<T, icelake::ondemand::value> && - !std::same_as<T, icelake::ondemand::object> && - !std::same_as<T, icelake::ondemand::array>) + requires(!std::same_as<T, ppc64::ondemand::document> && + !std::same_as<T, ppc64::ondemand::value> && + !std::same_as<T, ppc64::ondemand::object> && + !std::same_as<T, ppc64::ondemand::array>) inline std::string to_json_string(const T& obj); #endif @@ -84376,7 +121777,7 @@ inline std::string to_json_string(const T& obj); * Credit: @madhur4127 * See https://github.com/simdjson/simdjson/issues/1768 */ -namespace simdjson { namespace icelake { namespace ondemand { +namespace simdjson { namespace ppc64 { namespace ondemand { /** * Print JSON to an output stream. It does not @@ -84386,9 +121787,9 @@ namespace simdjson { namespace icelake { namespace ondemand { * @param value The element. * @throw if there is an error with the underlying output stream. simdjson itself will not throw. */ -inline std::ostream& operator<<(std::ostream& out, simdjson::icelake::ondemand::value x); +inline std::ostream& operator<<(std::ostream& out, simdjson::ppc64::ondemand::value x); #if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::icelake::ondemand::value> x); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::ppc64::ondemand::value> x); #endif /** * Print JSON to an output stream. It does not @@ -84398,9 +121799,9 @@ inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<sim * @param value The array. * @throw if there is an error with the underlying output stream. simdjson itself will not throw. */ -inline std::ostream& operator<<(std::ostream& out, simdjson::icelake::ondemand::array value); +inline std::ostream& operator<<(std::ostream& out, simdjson::ppc64::ondemand::array value); #if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::icelake::ondemand::array> x); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::ppc64::ondemand::array> x); #endif /** * Print JSON to an output stream. It does not @@ -84410,13 +121811,13 @@ inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<sim * @param value The array. * @throw if there is an error with the underlying output stream. simdjson itself will not throw. */ -inline std::ostream& operator<<(std::ostream& out, simdjson::icelake::ondemand::document& value); +inline std::ostream& operator<<(std::ostream& out, simdjson::ppc64::ondemand::document& value); #if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::icelake::ondemand::document>&& x); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::ppc64::ondemand::document>&& x); #endif -inline std::ostream& operator<<(std::ostream& out, simdjson::icelake::ondemand::document_reference& value); +inline std::ostream& operator<<(std::ostream& out, simdjson::ppc64::ondemand::document_reference& value); #if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::icelake::ondemand::document_reference>&& x); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::ppc64::ondemand::document_reference>&& x); #endif /** * Print JSON to an output stream. It does not @@ -84426,18 +121827,18 @@ inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<sim * @param value The object. * @throw if there is an error with the underlying output stream. simdjson itself will not throw. */ -inline std::ostream& operator<<(std::ostream& out, simdjson::icelake::ondemand::object value); +inline std::ostream& operator<<(std::ostream& out, simdjson::ppc64::ondemand::object value); #if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::icelake::ondemand::object> x); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::ppc64::ondemand::object> x); #endif -}}} // namespace simdjson::icelake::ondemand +}}} // namespace simdjson::ppc64::ondemand #endif // SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_H -/* end file simdjson/generic/ondemand/serialization.h for icelake */ +/* end file simdjson/generic/ondemand/serialization.h for ppc64 */ // Deserialization for standard types -/* including simdjson/generic/ondemand/std_deserialize.h for icelake: #include "simdjson/generic/ondemand/std_deserialize.h" */ -/* begin file simdjson/generic/ondemand/std_deserialize.h for icelake */ +/* including simdjson/generic/ondemand/std_deserialize.h for ppc64: #include "simdjson/generic/ondemand/std_deserialize.h" */ +/* begin file simdjson/generic/ondemand/std_deserialize.h for ppc64 */ #if SIMDJSON_SUPPORTS_CONCEPTS #ifndef SIMDJSON_ONDEMAND_DESERIALIZE_H @@ -84536,8 +121937,8 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { static_assert( std::is_default_constructible_v<value_type>, "The specified type inside the container must default constructible."); - icelake::ondemand::array arr; - if constexpr (std::is_same_v<std::remove_cvref_t<ValT>, icelake::ondemand::array>) { + ppc64::ondemand::array arr; + if constexpr (std::is_same_v<std::remove_cvref_t<ValT>, ppc64::ondemand::array>) { arr = val; } else { SIMDJSON_TRY(val.get_array().get(arr)); @@ -84581,7 +121982,7 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { static_assert( std::is_default_constructible_v<value_type>, "The specified value type inside the container must default constructible."); - icelake::ondemand::object obj; + ppc64::ondemand::object obj; SIMDJSON_TRY(val.get_object().get(obj)); for (auto field : obj) { std::string_view key; @@ -84599,7 +122000,7 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { } template <concepts::string_view_keyed_map T> -error_code tag_invoke(deserialize_tag, icelake::ondemand::object &obj, T &out) noexcept { +error_code tag_invoke(deserialize_tag, ppc64::ondemand::object &obj, T &out) noexcept { using value_type = typename std::remove_cvref_t<T>::mapped_type; out.clear(); @@ -84607,7 +122008,7 @@ error_code tag_invoke(deserialize_tag, icelake::ondemand::object &obj, T &out) n std::string_view key; SIMDJSON_TRY(field.unescaped_key().get(key)); - icelake::ondemand::value value_obj; + ppc64::ondemand::value value_obj; SIMDJSON_TRY(field.value().get(value_obj)); value_type this_value; @@ -84618,22 +122019,22 @@ error_code tag_invoke(deserialize_tag, icelake::ondemand::object &obj, T &out) n } template <concepts::string_view_keyed_map T> -error_code tag_invoke(deserialize_tag, icelake::ondemand::value &val, T &out) noexcept { - icelake::ondemand::object obj; +error_code tag_invoke(deserialize_tag, ppc64::ondemand::value &val, T &out) noexcept { + ppc64::ondemand::object obj; SIMDJSON_TRY(val.get_object().get(obj)); return simdjson::deserialize(obj, out); } template <concepts::string_view_keyed_map T> -error_code tag_invoke(deserialize_tag, icelake::ondemand::document &doc, T &out) noexcept { - icelake::ondemand::object obj; +error_code tag_invoke(deserialize_tag, ppc64::ondemand::document &doc, T &out) noexcept { + ppc64::ondemand::object obj; SIMDJSON_TRY(doc.get_object().get(obj)); return simdjson::deserialize(obj, out); } template <concepts::string_view_keyed_map T> -error_code tag_invoke(deserialize_tag, icelake::ondemand::document_reference &doc, T &out) noexcept { - icelake::ondemand::object obj; +error_code tag_invoke(deserialize_tag, ppc64::ondemand::document_reference &doc, T &out) noexcept { + ppc64::ondemand::object obj; SIMDJSON_TRY(doc.get_object().get(obj)); return simdjson::deserialize(obj, out); } @@ -84710,8 +122111,8 @@ constexpr bool user_defined_type = (std::is_class_v<T> template <typename T, typename ValT> requires(user_defined_type<T> && std::is_class_v<T>) error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept { - icelake::ondemand::object obj; - if constexpr (std::is_same_v<std::remove_cvref_t<ValT>, icelake::ondemand::object>) { + ppc64::ondemand::object obj; + if constexpr (std::is_same_v<std::remove_cvref_t<ValT>, ppc64::ondemand::object>) { obj = val; } else { SIMDJSON_TRY(val.get_object().get(obj)); @@ -85020,11 +122421,11 @@ error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr<int> &out) noe #endif // SIMDJSON_ONDEMAND_DESERIALIZE_H #endif // SIMDJSON_SUPPORTS_CONCEPTS -/* end file simdjson/generic/ondemand/std_deserialize.h for icelake */ +/* end file simdjson/generic/ondemand/std_deserialize.h for ppc64 */ // Inline definitions -/* including simdjson/generic/ondemand/array-inl.h for icelake: #include "simdjson/generic/ondemand/array-inl.h" */ -/* begin file simdjson/generic/ondemand/array-inl.h for icelake */ +/* including simdjson/generic/ondemand/array-inl.h for ppc64: #include "simdjson/generic/ondemand/array-inl.h" */ +/* begin file simdjson/generic/ondemand/array-inl.h for ppc64 */ #ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -85039,7 +122440,7 @@ error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr<int> &out) noe /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace icelake { +namespace ppc64 { namespace ondemand { // @@ -85268,68 +122669,68 @@ simdjson_inline simdjson_result<value> array::at(size_t index) noexcept { } } // namespace ondemand -} // namespace icelake +} // namespace ppc64 } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<icelake::ondemand::array>::simdjson_result( - icelake::ondemand::array &&value +simdjson_inline simdjson_result<ppc64::ondemand::array>::simdjson_result( + ppc64::ondemand::array &&value ) noexcept - : implementation_simdjson_result_base<icelake::ondemand::array>( - std::forward<icelake::ondemand::array>(value) + : implementation_simdjson_result_base<ppc64::ondemand::array>( + std::forward<ppc64::ondemand::array>(value) ) { } -simdjson_inline simdjson_result<icelake::ondemand::array>::simdjson_result( +simdjson_inline simdjson_result<ppc64::ondemand::array>::simdjson_result( error_code error ) noexcept - : implementation_simdjson_result_base<icelake::ondemand::array>(error) + : implementation_simdjson_result_base<ppc64::ondemand::array>(error) { } -simdjson_inline simdjson_result<icelake::ondemand::array_iterator> simdjson_result<icelake::ondemand::array>::begin() noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::array_iterator> simdjson_result<ppc64::ondemand::array>::begin() noexcept { if (error()) { return error(); } return first.begin(); } -simdjson_inline simdjson_result<icelake::ondemand::array_iterator> simdjson_result<icelake::ondemand::array>::end() noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::array_iterator> simdjson_result<ppc64::ondemand::array>::end() noexcept { if (error()) { return error(); } return first.end(); } -simdjson_inline simdjson_result<size_t> simdjson_result<icelake::ondemand::array>::count_elements() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<ppc64::ondemand::array>::count_elements() & noexcept { if (error()) { return error(); } return first.count_elements(); } -simdjson_inline simdjson_result<bool> simdjson_result<icelake::ondemand::array>::is_empty() & noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<ppc64::ondemand::array>::is_empty() & noexcept { if (error()) { return error(); } return first.is_empty(); } -simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::array>::at(size_t index) noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::array>::at(size_t index) noexcept { if (error()) { return error(); } return first.at(index); } -simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::array>::at_pointer(std::string_view json_pointer) noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::array>::at_pointer(std::string_view json_pointer) noexcept { if (error()) { return error(); } return first.at_pointer(json_pointer); } -simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::array>::at_path(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::array>::at_path(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path(json_path); } -simdjson_inline simdjson_result<std::vector<icelake::ondemand::value>> simdjson_result<icelake::ondemand::array>::at_path_with_wildcard(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<std::vector<ppc64::ondemand::value>> simdjson_result<ppc64::ondemand::array>::at_path_with_wildcard(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path_with_wildcard(json_path); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<icelake::ondemand::array>::raw_json() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<ppc64::ondemand::array>::raw_json() noexcept { if (error()) { return error(); } return first.raw_json(); } } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_INL_H -/* end file simdjson/generic/ondemand/array-inl.h for icelake */ -/* including simdjson/generic/ondemand/array_iterator-inl.h for icelake: #include "simdjson/generic/ondemand/array_iterator-inl.h" */ -/* begin file simdjson/generic/ondemand/array_iterator-inl.h for icelake */ +/* end file simdjson/generic/ondemand/array-inl.h for ppc64 */ +/* including simdjson/generic/ondemand/array_iterator-inl.h for ppc64: #include "simdjson/generic/ondemand/array_iterator-inl.h" */ +/* begin file simdjson/generic/ondemand/array_iterator-inl.h for ppc64 */ #ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -85341,7 +122742,7 @@ simdjson_inline simdjson_result<std::string_view> simdjson_result<icelake::onde /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace icelake { +namespace ppc64 { namespace ondemand { simdjson_inline array_iterator::array_iterator(const value_iterator &_iter) noexcept @@ -85349,6 +122750,10 @@ simdjson_inline array_iterator::array_iterator(const value_iterator &_iter) noex {} simdjson_inline simdjson_result<value> array_iterator::operator*() noexcept { +#if SIMDJSON_DEVELOPMENT_CHECKS + SIMDJSON_ASSUME(!has_been_referenced); + has_been_referenced = true; +#endif if (iter.error()) { iter.abandon(); return iter.error(); } return value(iter.child()); } @@ -85359,6 +122764,9 @@ simdjson_inline bool array_iterator::operator!=(const array_iterator &) const no return iter.is_open(); } simdjson_inline array_iterator &array_iterator::operator++() noexcept { +#if SIMDJSON_DEVELOPMENT_CHECKS + has_been_referenced = false; +#endif error_code error; // PERF NOTE this is a safety rail ... users should exit loops as soon as they receive an error, so we'll never get here. // However, it does not seem to make a perf difference, so we add it out of an abundance of caution. @@ -85372,50 +122780,50 @@ simdjson_inline bool array_iterator::at_end() const noexcept { return iter.at_end(); } } // namespace ondemand -} // namespace icelake +} // namespace ppc64 } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<icelake::ondemand::array_iterator>::simdjson_result( - icelake::ondemand::array_iterator &&value +simdjson_inline simdjson_result<ppc64::ondemand::array_iterator>::simdjson_result( + ppc64::ondemand::array_iterator &&value ) noexcept - : icelake::implementation_simdjson_result_base<icelake::ondemand::array_iterator>(std::forward<icelake::ondemand::array_iterator>(value)) + : ppc64::implementation_simdjson_result_base<ppc64::ondemand::array_iterator>(std::forward<ppc64::ondemand::array_iterator>(value)) { first.iter.assert_is_valid(); } -simdjson_inline simdjson_result<icelake::ondemand::array_iterator>::simdjson_result(error_code error) noexcept - : icelake::implementation_simdjson_result_base<icelake::ondemand::array_iterator>({}, error) +simdjson_inline simdjson_result<ppc64::ondemand::array_iterator>::simdjson_result(error_code error) noexcept + : ppc64::implementation_simdjson_result_base<ppc64::ondemand::array_iterator>({}, error) { } -simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::array_iterator>::operator*() noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::array_iterator>::operator*() noexcept { if (error()) { return error(); } return *first; } -simdjson_inline bool simdjson_result<icelake::ondemand::array_iterator>::operator==(const simdjson_result<icelake::ondemand::array_iterator> &other) const noexcept { +simdjson_inline bool simdjson_result<ppc64::ondemand::array_iterator>::operator==(const simdjson_result<ppc64::ondemand::array_iterator> &other) const noexcept { if (!first.iter.is_valid()) { return !error(); } return first == other.first; } -simdjson_inline bool simdjson_result<icelake::ondemand::array_iterator>::operator!=(const simdjson_result<icelake::ondemand::array_iterator> &other) const noexcept { +simdjson_inline bool simdjson_result<ppc64::ondemand::array_iterator>::operator!=(const simdjson_result<ppc64::ondemand::array_iterator> &other) const noexcept { if (!first.iter.is_valid()) { return error(); } return first != other.first; } -simdjson_inline simdjson_result<icelake::ondemand::array_iterator> &simdjson_result<icelake::ondemand::array_iterator>::operator++() noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::array_iterator> &simdjson_result<ppc64::ondemand::array_iterator>::operator++() noexcept { // Clear the error if there is one, so we don't yield it twice if (error()) { second = SUCCESS; return *this; } ++(first); return *this; } -simdjson_inline bool simdjson_result<icelake::ondemand::array_iterator>::at_end() const noexcept { +simdjson_inline bool simdjson_result<ppc64::ondemand::array_iterator>::at_end() const noexcept { return !first.iter.is_valid() || first.at_end(); } } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_INL_H -/* end file simdjson/generic/ondemand/array_iterator-inl.h for icelake */ -/* including simdjson/generic/ondemand/value-inl.h for icelake: #include "simdjson/generic/ondemand/value-inl.h" */ -/* begin file simdjson/generic/ondemand/value-inl.h for icelake */ +/* end file simdjson/generic/ondemand/array_iterator-inl.h for ppc64 */ +/* including simdjson/generic/ondemand/value-inl.h for ppc64: #include "simdjson/generic/ondemand/value-inl.h" */ +/* begin file simdjson/generic/ondemand/value-inl.h for ppc64 */ #ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -85431,7 +122839,7 @@ simdjson_inline bool simdjson_result<icelake::ondemand::array_iterator>::at_end( /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace icelake { +namespace ppc64 { namespace ondemand { simdjson_inline value::value(const value_iterator &_iter) noexcept @@ -85728,240 +123136,240 @@ inline simdjson_result<std::vector<value>> value::at_path_with_wildcard(std::str } } // namespace ondemand -} // namespace icelake +} // namespace ppc64 } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<icelake::ondemand::value>::simdjson_result( - icelake::ondemand::value &&value +simdjson_inline simdjson_result<ppc64::ondemand::value>::simdjson_result( + ppc64::ondemand::value &&value ) noexcept : - implementation_simdjson_result_base<icelake::ondemand::value>( - std::forward<icelake::ondemand::value>(value) + implementation_simdjson_result_base<ppc64::ondemand::value>( + std::forward<ppc64::ondemand::value>(value) ) { } -simdjson_inline simdjson_result<icelake::ondemand::value>::simdjson_result( +simdjson_inline simdjson_result<ppc64::ondemand::value>::simdjson_result( error_code error ) noexcept : - implementation_simdjson_result_base<icelake::ondemand::value>(error) + implementation_simdjson_result_base<ppc64::ondemand::value>(error) { } -simdjson_inline simdjson_result<size_t> simdjson_result<icelake::ondemand::value>::count_elements() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<ppc64::ondemand::value>::count_elements() & noexcept { if (error()) { return error(); } return first.count_elements(); } -simdjson_inline simdjson_result<size_t> simdjson_result<icelake::ondemand::value>::count_fields() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<ppc64::ondemand::value>::count_fields() & noexcept { if (error()) { return error(); } return first.count_fields(); } -simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::value>::at(size_t index) noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::value>::at(size_t index) noexcept { if (error()) { return error(); } return first.at(index); } -simdjson_inline simdjson_result<icelake::ondemand::array_iterator> simdjson_result<icelake::ondemand::value>::begin() & noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::array_iterator> simdjson_result<ppc64::ondemand::value>::begin() & noexcept { if (error()) { return error(); } return first.begin(); } -simdjson_inline simdjson_result<icelake::ondemand::array_iterator> simdjson_result<icelake::ondemand::value>::end() & noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::array_iterator> simdjson_result<ppc64::ondemand::value>::end() & noexcept { if (error()) { return error(); } return {}; } -simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::value>::find_field(std::string_view key) noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::value>::find_field(std::string_view key) noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::value>::find_field(const char *key) noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::value>::find_field(const char *key) noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::value>::find_field_unordered(std::string_view key) noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::value>::find_field_unordered(std::string_view key) noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::value>::find_field_unordered(const char *key) noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::value>::find_field_unordered(const char *key) noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::value>::operator[](std::string_view key) noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::value>::operator[](std::string_view key) noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::value>::operator[](const char *key) noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::value>::operator[](const char *key) noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<icelake::ondemand::array> simdjson_result<icelake::ondemand::value>::get_array() noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::array> simdjson_result<ppc64::ondemand::value>::get_array() noexcept { if (error()) { return error(); } return first.get_array(); } -simdjson_inline simdjson_result<icelake::ondemand::object> simdjson_result<icelake::ondemand::value>::get_object() noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::object> simdjson_result<ppc64::ondemand::value>::get_object() noexcept { if (error()) { return error(); } return first.get_object(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<icelake::ondemand::value>::get_uint64() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<ppc64::ondemand::value>::get_uint64() noexcept { if (error()) { return error(); } return first.get_uint64(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<icelake::ondemand::value>::get_uint64_in_string() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<ppc64::ondemand::value>::get_uint64_in_string() noexcept { if (error()) { return error(); } return first.get_uint64_in_string(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<icelake::ondemand::value>::get_int64() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<ppc64::ondemand::value>::get_int64() noexcept { if (error()) { return error(); } return first.get_int64(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<icelake::ondemand::value>::get_int64_in_string() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<ppc64::ondemand::value>::get_int64_in_string() noexcept { if (error()) { return error(); } return first.get_int64_in_string(); } -simdjson_inline simdjson_result<double> simdjson_result<icelake::ondemand::value>::get_double() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<ppc64::ondemand::value>::get_double() noexcept { if (error()) { return error(); } return first.get_double(); } -simdjson_inline simdjson_result<double> simdjson_result<icelake::ondemand::value>::get_double_in_string() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<ppc64::ondemand::value>::get_double_in_string() noexcept { if (error()) { return error(); } return first.get_double_in_string(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<icelake::ondemand::value>::get_string(bool allow_replacement) noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<ppc64::ondemand::value>::get_string(bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(allow_replacement); } template <typename string_type> -simdjson_inline error_code simdjson_result<icelake::ondemand::value>::get_string(string_type& receiver, bool allow_replacement) noexcept { +simdjson_inline error_code simdjson_result<ppc64::ondemand::value>::get_string(string_type& receiver, bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(receiver, allow_replacement); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<icelake::ondemand::value>::get_wobbly_string() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<ppc64::ondemand::value>::get_wobbly_string() noexcept { if (error()) { return error(); } return first.get_wobbly_string(); } -simdjson_inline simdjson_result<icelake::ondemand::raw_json_string> simdjson_result<icelake::ondemand::value>::get_raw_json_string() noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::raw_json_string> simdjson_result<ppc64::ondemand::value>::get_raw_json_string() noexcept { if (error()) { return error(); } return first.get_raw_json_string(); } -simdjson_inline simdjson_result<bool> simdjson_result<icelake::ondemand::value>::get_bool() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<ppc64::ondemand::value>::get_bool() noexcept { if (error()) { return error(); } return first.get_bool(); } -simdjson_inline simdjson_result<bool> simdjson_result<icelake::ondemand::value>::is_null() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<ppc64::ondemand::value>::is_null() noexcept { if (error()) { return error(); } return first.is_null(); } -template<> simdjson_inline error_code simdjson_result<icelake::ondemand::value>::get<icelake::ondemand::value>(icelake::ondemand::value &out) noexcept { +template<> simdjson_inline error_code simdjson_result<ppc64::ondemand::value>::get<ppc64::ondemand::value>(ppc64::ondemand::value &out) noexcept { if (error()) { return error(); } out = first; return SUCCESS; } -template<typename T> simdjson_inline simdjson_result<T> simdjson_result<icelake::ondemand::value>::get() noexcept { +template<typename T> simdjson_inline simdjson_result<T> simdjson_result<ppc64::ondemand::value>::get() noexcept { if (error()) { return error(); } return first.get<T>(); } -template<typename T> simdjson_inline error_code simdjson_result<icelake::ondemand::value>::get(T &out) noexcept { +template<typename T> simdjson_inline error_code simdjson_result<ppc64::ondemand::value>::get(T &out) noexcept { if (error()) { return error(); } return first.get<T>(out); } -template<> simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::value>::get<icelake::ondemand::value>() noexcept { +template<> simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::value>::get<ppc64::ondemand::value>() noexcept { if (error()) { return error(); } return std::move(first); } -simdjson_inline simdjson_result<icelake::ondemand::json_type> simdjson_result<icelake::ondemand::value>::type() noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::json_type> simdjson_result<ppc64::ondemand::value>::type() noexcept { if (error()) { return error(); } return first.type(); } -simdjson_inline simdjson_result<bool> simdjson_result<icelake::ondemand::value>::is_scalar() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<ppc64::ondemand::value>::is_scalar() noexcept { if (error()) { return error(); } return first.is_scalar(); } -simdjson_inline simdjson_result<bool> simdjson_result<icelake::ondemand::value>::is_string() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<ppc64::ondemand::value>::is_string() noexcept { if (error()) { return error(); } return first.is_string(); } -simdjson_inline simdjson_result<bool> simdjson_result<icelake::ondemand::value>::is_negative() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<ppc64::ondemand::value>::is_negative() noexcept { if (error()) { return error(); } return first.is_negative(); } -simdjson_inline simdjson_result<bool> simdjson_result<icelake::ondemand::value>::is_integer() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<ppc64::ondemand::value>::is_integer() noexcept { if (error()) { return error(); } return first.is_integer(); } -simdjson_inline simdjson_result<icelake::number_type> simdjson_result<icelake::ondemand::value>::get_number_type() noexcept { +simdjson_inline simdjson_result<ppc64::number_type> simdjson_result<ppc64::ondemand::value>::get_number_type() noexcept { if (error()) { return error(); } return first.get_number_type(); } -simdjson_inline simdjson_result<icelake::ondemand::number> simdjson_result<icelake::ondemand::value>::get_number() noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::number> simdjson_result<ppc64::ondemand::value>::get_number() noexcept { if (error()) { return error(); } return first.get_number(); } #if SIMDJSON_EXCEPTIONS template <class T> -simdjson_inline simdjson_result<icelake::ondemand::value>::operator T() noexcept(false) { +simdjson_inline simdjson_result<ppc64::ondemand::value>::operator T() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first.get<T>(); } -simdjson_inline simdjson_result<icelake::ondemand::value>::operator icelake::ondemand::array() noexcept(false) { +simdjson_inline simdjson_result<ppc64::ondemand::value>::operator ppc64::ondemand::array() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<icelake::ondemand::value>::operator icelake::ondemand::object() noexcept(false) { +simdjson_inline simdjson_result<ppc64::ondemand::value>::operator ppc64::ondemand::object() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<icelake::ondemand::value>::operator uint64_t() noexcept(false) { +simdjson_inline simdjson_result<ppc64::ondemand::value>::operator uint64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<icelake::ondemand::value>::operator int64_t() noexcept(false) { +simdjson_inline simdjson_result<ppc64::ondemand::value>::operator int64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<icelake::ondemand::value>::operator double() noexcept(false) { +simdjson_inline simdjson_result<ppc64::ondemand::value>::operator double() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<icelake::ondemand::value>::operator std::string_view() noexcept(false) { +simdjson_inline simdjson_result<ppc64::ondemand::value>::operator std::string_view() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<icelake::ondemand::value>::operator icelake::ondemand::raw_json_string() noexcept(false) { +simdjson_inline simdjson_result<ppc64::ondemand::value>::operator ppc64::ondemand::raw_json_string() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<icelake::ondemand::value>::operator bool() noexcept(false) { +simdjson_inline simdjson_result<ppc64::ondemand::value>::operator bool() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } #endif -simdjson_inline simdjson_result<std::string_view> simdjson_result<icelake::ondemand::value>::raw_json_token() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<ppc64::ondemand::value>::raw_json_token() noexcept { if (error()) { return error(); } return first.raw_json_token(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<icelake::ondemand::value>::raw_json() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<ppc64::ondemand::value>::raw_json() noexcept { if (error()) { return error(); } return first.raw_json(); } -simdjson_inline simdjson_result<const char *> simdjson_result<icelake::ondemand::value>::current_location() noexcept { +simdjson_inline simdjson_result<const char *> simdjson_result<ppc64::ondemand::value>::current_location() noexcept { if (error()) { return error(); } return first.current_location(); } -simdjson_inline simdjson_result<int32_t> simdjson_result<icelake::ondemand::value>::current_depth() const noexcept { +simdjson_inline simdjson_result<int32_t> simdjson_result<ppc64::ondemand::value>::current_depth() const noexcept { if (error()) { return error(); } return first.current_depth(); } -simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::value>::at_pointer( +simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::value>::at_pointer( std::string_view json_pointer) noexcept { if (error()) { return error(); @@ -85969,7 +123377,7 @@ simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelak return first.at_pointer(json_pointer); } -simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::value>::at_path( +simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::value>::at_path( std::string_view json_path) noexcept { if (error()) { return error(); @@ -85977,7 +123385,7 @@ simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelak return first.at_path(json_path); } -inline simdjson_result<std::vector<icelake::ondemand::value>> simdjson_result<icelake::ondemand::value>::at_path_with_wildcard( +inline simdjson_result<std::vector<ppc64::ondemand::value>> simdjson_result<ppc64::ondemand::value>::at_path_with_wildcard( std::string_view json_path) noexcept { if (error()) { return error(); @@ -85988,9 +123396,9 @@ inline simdjson_result<std::vector<icelake::ondemand::value>> simdjson_result<ic } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_INL_H -/* end file simdjson/generic/ondemand/value-inl.h for icelake */ -/* including simdjson/generic/ondemand/document-inl.h for icelake: #include "simdjson/generic/ondemand/document-inl.h" */ -/* begin file simdjson/generic/ondemand/document-inl.h for icelake */ +/* end file simdjson/generic/ondemand/value-inl.h for ppc64 */ +/* including simdjson/generic/ondemand/document-inl.h for ppc64: #include "simdjson/generic/ondemand/document-inl.h" */ +/* begin file simdjson/generic/ondemand/document-inl.h for ppc64 */ #ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -86010,7 +123418,7 @@ inline simdjson_result<std::vector<icelake::ondemand::value>> simdjson_result<ic /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace icelake { +namespace ppc64 { namespace ondemand { simdjson_inline document::document(ondemand::json_iterator &&_iter) noexcept @@ -86404,283 +123812,283 @@ simdjson_warn_unused simdjson_inline error_code document::extract_into(T& out) & #endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION } // namespace ondemand -} // namespace icelake +} // namespace ppc64 } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<icelake::ondemand::document>::simdjson_result( - icelake::ondemand::document &&value +simdjson_inline simdjson_result<ppc64::ondemand::document>::simdjson_result( + ppc64::ondemand::document &&value ) noexcept : - implementation_simdjson_result_base<icelake::ondemand::document>( - std::forward<icelake::ondemand::document>(value) + implementation_simdjson_result_base<ppc64::ondemand::document>( + std::forward<ppc64::ondemand::document>(value) ) { } -simdjson_inline simdjson_result<icelake::ondemand::document>::simdjson_result( +simdjson_inline simdjson_result<ppc64::ondemand::document>::simdjson_result( error_code error ) noexcept : - implementation_simdjson_result_base<icelake::ondemand::document>( + implementation_simdjson_result_base<ppc64::ondemand::document>( error ) { } -simdjson_inline simdjson_result<size_t> simdjson_result<icelake::ondemand::document>::count_elements() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<ppc64::ondemand::document>::count_elements() & noexcept { if (error()) { return error(); } return first.count_elements(); } -simdjson_inline simdjson_result<size_t> simdjson_result<icelake::ondemand::document>::count_fields() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<ppc64::ondemand::document>::count_fields() & noexcept { if (error()) { return error(); } return first.count_fields(); } -simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::document>::at(size_t index) & noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::document>::at(size_t index) & noexcept { if (error()) { return error(); } return first.at(index); } -simdjson_inline error_code simdjson_result<icelake::ondemand::document>::rewind() noexcept { +simdjson_inline error_code simdjson_result<ppc64::ondemand::document>::rewind() noexcept { if (error()) { return error(); } first.rewind(); return SUCCESS; } -simdjson_inline simdjson_result<icelake::ondemand::array_iterator> simdjson_result<icelake::ondemand::document>::begin() & noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::array_iterator> simdjson_result<ppc64::ondemand::document>::begin() & noexcept { if (error()) { return error(); } return first.begin(); } -simdjson_inline simdjson_result<icelake::ondemand::array_iterator> simdjson_result<icelake::ondemand::document>::end() & noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::array_iterator> simdjson_result<ppc64::ondemand::document>::end() & noexcept { return {}; } -simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::document>::find_field_unordered(std::string_view key) & noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::document>::find_field_unordered(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::document>::find_field_unordered(const char *key) & noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::document>::find_field_unordered(const char *key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::document>::operator[](std::string_view key) & noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::document>::operator[](std::string_view key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::document>::operator[](const char *key) & noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::document>::operator[](const char *key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::document>::find_field(std::string_view key) & noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::document>::find_field(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::document>::find_field(const char *key) & noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::document>::find_field(const char *key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<icelake::ondemand::array> simdjson_result<icelake::ondemand::document>::get_array() & noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::array> simdjson_result<ppc64::ondemand::document>::get_array() & noexcept { if (error()) { return error(); } return first.get_array(); } -simdjson_inline simdjson_result<icelake::ondemand::object> simdjson_result<icelake::ondemand::document>::get_object() & noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::object> simdjson_result<ppc64::ondemand::document>::get_object() & noexcept { if (error()) { return error(); } return first.get_object(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<icelake::ondemand::document>::get_uint64() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<ppc64::ondemand::document>::get_uint64() noexcept { if (error()) { return error(); } return first.get_uint64(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<icelake::ondemand::document>::get_uint64_in_string() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<ppc64::ondemand::document>::get_uint64_in_string() noexcept { if (error()) { return error(); } return first.get_uint64_in_string(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<icelake::ondemand::document>::get_int64() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<ppc64::ondemand::document>::get_int64() noexcept { if (error()) { return error(); } return first.get_int64(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<icelake::ondemand::document>::get_int64_in_string() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<ppc64::ondemand::document>::get_int64_in_string() noexcept { if (error()) { return error(); } return first.get_int64_in_string(); } -simdjson_inline simdjson_result<double> simdjson_result<icelake::ondemand::document>::get_double() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<ppc64::ondemand::document>::get_double() noexcept { if (error()) { return error(); } return first.get_double(); } -simdjson_inline simdjson_result<double> simdjson_result<icelake::ondemand::document>::get_double_in_string() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<ppc64::ondemand::document>::get_double_in_string() noexcept { if (error()) { return error(); } return first.get_double_in_string(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<icelake::ondemand::document>::get_string(bool allow_replacement) noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<ppc64::ondemand::document>::get_string(bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(allow_replacement); } template <typename string_type> -simdjson_warn_unused simdjson_inline error_code simdjson_result<icelake::ondemand::document>::get_string(string_type& receiver, bool allow_replacement) noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<ppc64::ondemand::document>::get_string(string_type& receiver, bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(receiver, allow_replacement); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<icelake::ondemand::document>::get_wobbly_string() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<ppc64::ondemand::document>::get_wobbly_string() noexcept { if (error()) { return error(); } return first.get_wobbly_string(); } -simdjson_inline simdjson_result<icelake::ondemand::raw_json_string> simdjson_result<icelake::ondemand::document>::get_raw_json_string() noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::raw_json_string> simdjson_result<ppc64::ondemand::document>::get_raw_json_string() noexcept { if (error()) { return error(); } return first.get_raw_json_string(); } -simdjson_inline simdjson_result<bool> simdjson_result<icelake::ondemand::document>::get_bool() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<ppc64::ondemand::document>::get_bool() noexcept { if (error()) { return error(); } return first.get_bool(); } -simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::document>::get_value() noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::document>::get_value() noexcept { if (error()) { return error(); } return first.get_value(); } -simdjson_inline simdjson_result<bool> simdjson_result<icelake::ondemand::document>::is_null() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<ppc64::ondemand::document>::is_null() noexcept { if (error()) { return error(); } return first.is_null(); } template<typename T> -simdjson_inline simdjson_result<T> simdjson_result<icelake::ondemand::document>::get() & noexcept { +simdjson_inline simdjson_result<T> simdjson_result<ppc64::ondemand::document>::get() & noexcept { if (error()) { return error(); } return first.get<T>(); } template<typename T> -simdjson_deprecated simdjson_inline simdjson_result<T> simdjson_result<icelake::ondemand::document>::get() && noexcept { +simdjson_deprecated simdjson_inline simdjson_result<T> simdjson_result<ppc64::ondemand::document>::get() && noexcept { if (error()) { return error(); } - return std::forward<icelake::ondemand::document>(first).get<T>(); + return std::forward<ppc64::ondemand::document>(first).get<T>(); } template<typename T> -simdjson_warn_unused simdjson_inline error_code simdjson_result<icelake::ondemand::document>::get(T &out) & noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<ppc64::ondemand::document>::get(T &out) & noexcept { if (error()) { return error(); } return first.get<T>(out); } template<typename T> -simdjson_warn_unused simdjson_inline error_code simdjson_result<icelake::ondemand::document>::get(T &out) && noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<ppc64::ondemand::document>::get(T &out) && noexcept { if (error()) { return error(); } - return std::forward<icelake::ondemand::document>(first).get<T>(out); + return std::forward<ppc64::ondemand::document>(first).get<T>(out); } -template<> simdjson_inline simdjson_result<icelake::ondemand::document> simdjson_result<icelake::ondemand::document>::get<icelake::ondemand::document>() & noexcept = delete; -template<> simdjson_deprecated simdjson_inline simdjson_result<icelake::ondemand::document> simdjson_result<icelake::ondemand::document>::get<icelake::ondemand::document>() && noexcept { +template<> simdjson_inline simdjson_result<ppc64::ondemand::document> simdjson_result<ppc64::ondemand::document>::get<ppc64::ondemand::document>() & noexcept = delete; +template<> simdjson_deprecated simdjson_inline simdjson_result<ppc64::ondemand::document> simdjson_result<ppc64::ondemand::document>::get<ppc64::ondemand::document>() && noexcept { if (error()) { return error(); } - return std::forward<icelake::ondemand::document>(first); + return std::forward<ppc64::ondemand::document>(first); } -template<> simdjson_warn_unused simdjson_inline error_code simdjson_result<icelake::ondemand::document>::get<icelake::ondemand::document>(icelake::ondemand::document &out) & noexcept = delete; -template<> simdjson_warn_unused simdjson_inline error_code simdjson_result<icelake::ondemand::document>::get<icelake::ondemand::document>(icelake::ondemand::document &out) && noexcept { +template<> simdjson_warn_unused simdjson_inline error_code simdjson_result<ppc64::ondemand::document>::get<ppc64::ondemand::document>(ppc64::ondemand::document &out) & noexcept = delete; +template<> simdjson_warn_unused simdjson_inline error_code simdjson_result<ppc64::ondemand::document>::get<ppc64::ondemand::document>(ppc64::ondemand::document &out) && noexcept { if (error()) { return error(); } - out = std::forward<icelake::ondemand::document>(first); + out = std::forward<ppc64::ondemand::document>(first); return SUCCESS; } -simdjson_inline simdjson_result<icelake::ondemand::json_type> simdjson_result<icelake::ondemand::document>::type() noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::json_type> simdjson_result<ppc64::ondemand::document>::type() noexcept { if (error()) { return error(); } return first.type(); } -simdjson_inline simdjson_result<bool> simdjson_result<icelake::ondemand::document>::is_scalar() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<ppc64::ondemand::document>::is_scalar() noexcept { if (error()) { return error(); } return first.is_scalar(); } -simdjson_inline simdjson_result<bool> simdjson_result<icelake::ondemand::document>::is_string() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<ppc64::ondemand::document>::is_string() noexcept { if (error()) { return error(); } return first.is_string(); } -simdjson_inline bool simdjson_result<icelake::ondemand::document>::is_negative() noexcept { +simdjson_inline bool simdjson_result<ppc64::ondemand::document>::is_negative() noexcept { if (error()) { return error(); } return first.is_negative(); } -simdjson_inline simdjson_result<bool> simdjson_result<icelake::ondemand::document>::is_integer() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<ppc64::ondemand::document>::is_integer() noexcept { if (error()) { return error(); } return first.is_integer(); } -simdjson_inline simdjson_result<icelake::number_type> simdjson_result<icelake::ondemand::document>::get_number_type() noexcept { +simdjson_inline simdjson_result<ppc64::number_type> simdjson_result<ppc64::ondemand::document>::get_number_type() noexcept { if (error()) { return error(); } return first.get_number_type(); } -simdjson_inline simdjson_result<icelake::ondemand::number> simdjson_result<icelake::ondemand::document>::get_number() noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::number> simdjson_result<ppc64::ondemand::document>::get_number() noexcept { if (error()) { return error(); } return first.get_number(); } #if SIMDJSON_EXCEPTIONS -template <class T, typename std::enable_if<std::is_same<T, icelake::ondemand::document>::value == false>::type> -simdjson_inline simdjson_result<icelake::ondemand::document>::operator T() noexcept(false) { +template <class T, typename std::enable_if<std::is_same<T, ppc64::ondemand::document>::value == false>::type> +simdjson_inline simdjson_result<ppc64::ondemand::document>::operator T() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<icelake::ondemand::document>::operator icelake::ondemand::array() & noexcept(false) { +simdjson_inline simdjson_result<ppc64::ondemand::document>::operator ppc64::ondemand::array() & noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<icelake::ondemand::document>::operator icelake::ondemand::object() & noexcept(false) { +simdjson_inline simdjson_result<ppc64::ondemand::document>::operator ppc64::ondemand::object() & noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<icelake::ondemand::document>::operator uint64_t() noexcept(false) { +simdjson_inline simdjson_result<ppc64::ondemand::document>::operator uint64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<icelake::ondemand::document>::operator int64_t() noexcept(false) { +simdjson_inline simdjson_result<ppc64::ondemand::document>::operator int64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<icelake::ondemand::document>::operator double() noexcept(false) { +simdjson_inline simdjson_result<ppc64::ondemand::document>::operator double() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<icelake::ondemand::document>::operator std::string_view() noexcept(false) { +simdjson_inline simdjson_result<ppc64::ondemand::document>::operator std::string_view() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<icelake::ondemand::document>::operator icelake::ondemand::raw_json_string() noexcept(false) { +simdjson_inline simdjson_result<ppc64::ondemand::document>::operator ppc64::ondemand::raw_json_string() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<icelake::ondemand::document>::operator bool() noexcept(false) { +simdjson_inline simdjson_result<ppc64::ondemand::document>::operator bool() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<icelake::ondemand::document>::operator icelake::ondemand::value() noexcept(false) { +simdjson_inline simdjson_result<ppc64::ondemand::document>::operator ppc64::ondemand::value() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } #endif -simdjson_inline simdjson_result<const char *> simdjson_result<icelake::ondemand::document>::current_location() noexcept { +simdjson_inline simdjson_result<const char *> simdjson_result<ppc64::ondemand::document>::current_location() noexcept { if (error()) { return error(); } return first.current_location(); } -simdjson_inline bool simdjson_result<icelake::ondemand::document>::at_end() const noexcept { +simdjson_inline bool simdjson_result<ppc64::ondemand::document>::at_end() const noexcept { if (error()) { return error(); } return first.at_end(); } -simdjson_inline int32_t simdjson_result<icelake::ondemand::document>::current_depth() const noexcept { +simdjson_inline int32_t simdjson_result<ppc64::ondemand::document>::current_depth() const noexcept { if (error()) { return error(); } return first.current_depth(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<icelake::ondemand::document>::raw_json_token() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<ppc64::ondemand::document>::raw_json_token() noexcept { if (error()) { return error(); } return first.raw_json_token(); } -simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::document>::at_pointer(std::string_view json_pointer) noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::document>::at_pointer(std::string_view json_pointer) noexcept { if (error()) { return error(); } return first.at_pointer(json_pointer); } -simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::document>::at_path(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::document>::at_path(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path(json_path); } -simdjson_inline simdjson_result<std::vector<icelake::ondemand::value>> simdjson_result<icelake::ondemand::document>::at_path_with_wildcard(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<std::vector<ppc64::ondemand::value>> simdjson_result<ppc64::ondemand::document>::at_path_with_wildcard(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path_with_wildcard(json_path); } @@ -86688,7 +124096,7 @@ simdjson_inline simdjson_result<std::vector<icelake::ondemand::value>> simdjson_ #if SIMDJSON_STATIC_REFLECTION template<constevalutil::fixed_string... FieldNames, typename T> requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) -simdjson_warn_unused simdjson_inline error_code simdjson_result<icelake::ondemand::document>::extract_into(T& out) & noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<ppc64::ondemand::document>::extract_into(T& out) & noexcept { if (error()) { return error(); } return first.extract_into<FieldNames...>(out); } @@ -86698,7 +124106,7 @@ simdjson_warn_unused simdjson_inline error_code simdjson_result<icelake::ondeman namespace simdjson { -namespace icelake { +namespace ppc64 { namespace ondemand { simdjson_inline document_reference::document_reference() noexcept : doc{nullptr} {} @@ -86790,253 +124198,253 @@ simdjson_warn_unused simdjson_inline error_code document_reference::extract_into } #endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION } // namespace ondemand -} // namespace icelake +} // namespace ppc64 } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<icelake::ondemand::document_reference>::simdjson_result(icelake::ondemand::document_reference value, error_code error) - noexcept : implementation_simdjson_result_base<icelake::ondemand::document_reference>(std::forward<icelake::ondemand::document_reference>(value), error) {} +simdjson_inline simdjson_result<ppc64::ondemand::document_reference>::simdjson_result(ppc64::ondemand::document_reference value, error_code error) + noexcept : implementation_simdjson_result_base<ppc64::ondemand::document_reference>(std::forward<ppc64::ondemand::document_reference>(value), error) {} -simdjson_inline simdjson_result<size_t> simdjson_result<icelake::ondemand::document_reference>::count_elements() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<ppc64::ondemand::document_reference>::count_elements() & noexcept { if (error()) { return error(); } return first.count_elements(); } -simdjson_inline simdjson_result<size_t> simdjson_result<icelake::ondemand::document_reference>::count_fields() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<ppc64::ondemand::document_reference>::count_fields() & noexcept { if (error()) { return error(); } return first.count_fields(); } -simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::document_reference>::at(size_t index) & noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::document_reference>::at(size_t index) & noexcept { if (error()) { return error(); } return first.at(index); } -simdjson_inline error_code simdjson_result<icelake::ondemand::document_reference>::rewind() noexcept { +simdjson_inline error_code simdjson_result<ppc64::ondemand::document_reference>::rewind() noexcept { if (error()) { return error(); } first.rewind(); return SUCCESS; } -simdjson_inline simdjson_result<icelake::ondemand::array_iterator> simdjson_result<icelake::ondemand::document_reference>::begin() & noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::array_iterator> simdjson_result<ppc64::ondemand::document_reference>::begin() & noexcept { if (error()) { return error(); } return first.begin(); } -simdjson_inline simdjson_result<icelake::ondemand::array_iterator> simdjson_result<icelake::ondemand::document_reference>::end() & noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::array_iterator> simdjson_result<ppc64::ondemand::document_reference>::end() & noexcept { return {}; } -simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::document_reference>::find_field_unordered(std::string_view key) & noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::document_reference>::find_field_unordered(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::document_reference>::find_field_unordered(const char *key) & noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::document_reference>::find_field_unordered(const char *key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::document_reference>::operator[](std::string_view key) & noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::document_reference>::operator[](std::string_view key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::document_reference>::operator[](const char *key) & noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::document_reference>::operator[](const char *key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::document_reference>::find_field(std::string_view key) & noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::document_reference>::find_field(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::document_reference>::find_field(const char *key) & noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::document_reference>::find_field(const char *key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<icelake::ondemand::array> simdjson_result<icelake::ondemand::document_reference>::get_array() & noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::array> simdjson_result<ppc64::ondemand::document_reference>::get_array() & noexcept { if (error()) { return error(); } return first.get_array(); } -simdjson_inline simdjson_result<icelake::ondemand::object> simdjson_result<icelake::ondemand::document_reference>::get_object() & noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::object> simdjson_result<ppc64::ondemand::document_reference>::get_object() & noexcept { if (error()) { return error(); } return first.get_object(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<icelake::ondemand::document_reference>::get_uint64() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<ppc64::ondemand::document_reference>::get_uint64() noexcept { if (error()) { return error(); } return first.get_uint64(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<icelake::ondemand::document_reference>::get_uint64_in_string() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<ppc64::ondemand::document_reference>::get_uint64_in_string() noexcept { if (error()) { return error(); } return first.get_uint64_in_string(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<icelake::ondemand::document_reference>::get_int64() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<ppc64::ondemand::document_reference>::get_int64() noexcept { if (error()) { return error(); } return first.get_int64(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<icelake::ondemand::document_reference>::get_int64_in_string() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<ppc64::ondemand::document_reference>::get_int64_in_string() noexcept { if (error()) { return error(); } return first.get_int64_in_string(); } -simdjson_inline simdjson_result<double> simdjson_result<icelake::ondemand::document_reference>::get_double() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<ppc64::ondemand::document_reference>::get_double() noexcept { if (error()) { return error(); } return first.get_double(); } -simdjson_inline simdjson_result<double> simdjson_result<icelake::ondemand::document_reference>::get_double_in_string() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<ppc64::ondemand::document_reference>::get_double_in_string() noexcept { if (error()) { return error(); } return first.get_double_in_string(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<icelake::ondemand::document_reference>::get_string(bool allow_replacement) noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<ppc64::ondemand::document_reference>::get_string(bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(allow_replacement); } template <typename string_type> -simdjson_warn_unused simdjson_inline error_code simdjson_result<icelake::ondemand::document_reference>::get_string(string_type& receiver, bool allow_replacement) noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<ppc64::ondemand::document_reference>::get_string(string_type& receiver, bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(receiver, allow_replacement); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<icelake::ondemand::document_reference>::get_wobbly_string() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<ppc64::ondemand::document_reference>::get_wobbly_string() noexcept { if (error()) { return error(); } return first.get_wobbly_string(); } -simdjson_inline simdjson_result<icelake::ondemand::raw_json_string> simdjson_result<icelake::ondemand::document_reference>::get_raw_json_string() noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::raw_json_string> simdjson_result<ppc64::ondemand::document_reference>::get_raw_json_string() noexcept { if (error()) { return error(); } return first.get_raw_json_string(); } -simdjson_inline simdjson_result<bool> simdjson_result<icelake::ondemand::document_reference>::get_bool() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<ppc64::ondemand::document_reference>::get_bool() noexcept { if (error()) { return error(); } return first.get_bool(); } -simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::document_reference>::get_value() noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::document_reference>::get_value() noexcept { if (error()) { return error(); } return first.get_value(); } -simdjson_inline simdjson_result<bool> simdjson_result<icelake::ondemand::document_reference>::is_null() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<ppc64::ondemand::document_reference>::is_null() noexcept { if (error()) { return error(); } return first.is_null(); } template<typename T> -simdjson_inline simdjson_result<T> simdjson_result<icelake::ondemand::document_reference>::get() & noexcept { +simdjson_inline simdjson_result<T> simdjson_result<ppc64::ondemand::document_reference>::get() & noexcept { if (error()) { return error(); } return first.get<T>(); } template<typename T> -simdjson_inline simdjson_result<T> simdjson_result<icelake::ondemand::document_reference>::get() && noexcept { +simdjson_inline simdjson_result<T> simdjson_result<ppc64::ondemand::document_reference>::get() && noexcept { if (error()) { return error(); } - return std::forward<icelake::ondemand::document_reference>(first).get<T>(); + return std::forward<ppc64::ondemand::document_reference>(first).get<T>(); } template <class T> -simdjson_warn_unused simdjson_inline error_code simdjson_result<icelake::ondemand::document_reference>::get(T &out) & noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<ppc64::ondemand::document_reference>::get(T &out) & noexcept { if (error()) { return error(); } return first.get<T>(out); } template <class T> -simdjson_warn_unused simdjson_inline error_code simdjson_result<icelake::ondemand::document_reference>::get(T &out) && noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<ppc64::ondemand::document_reference>::get(T &out) && noexcept { if (error()) { return error(); } - return std::forward<icelake::ondemand::document_reference>(first).get<T>(out); + return std::forward<ppc64::ondemand::document_reference>(first).get<T>(out); } -simdjson_inline simdjson_result<icelake::ondemand::json_type> simdjson_result<icelake::ondemand::document_reference>::type() noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::json_type> simdjson_result<ppc64::ondemand::document_reference>::type() noexcept { if (error()) { return error(); } return first.type(); } -simdjson_inline simdjson_result<bool> simdjson_result<icelake::ondemand::document_reference>::is_scalar() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<ppc64::ondemand::document_reference>::is_scalar() noexcept { if (error()) { return error(); } return first.is_scalar(); } -simdjson_inline simdjson_result<bool> simdjson_result<icelake::ondemand::document_reference>::is_string() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<ppc64::ondemand::document_reference>::is_string() noexcept { if (error()) { return error(); } return first.is_string(); } template <> -simdjson_warn_unused simdjson_inline error_code simdjson_result<icelake::ondemand::document_reference>::get(icelake::ondemand::document_reference &out) & noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<ppc64::ondemand::document_reference>::get(ppc64::ondemand::document_reference &out) & noexcept { if (error()) { return error(); } out = first; return SUCCESS; } template <> -simdjson_warn_unused simdjson_inline error_code simdjson_result<icelake::ondemand::document_reference>::get(icelake::ondemand::document_reference &out) && noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<ppc64::ondemand::document_reference>::get(ppc64::ondemand::document_reference &out) && noexcept { if (error()) { return error(); } out = first; return SUCCESS; } -simdjson_inline simdjson_result<bool> simdjson_result<icelake::ondemand::document_reference>::is_negative() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<ppc64::ondemand::document_reference>::is_negative() noexcept { if (error()) { return error(); } return first.is_negative(); } -simdjson_inline simdjson_result<bool> simdjson_result<icelake::ondemand::document_reference>::is_integer() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<ppc64::ondemand::document_reference>::is_integer() noexcept { if (error()) { return error(); } return first.is_integer(); } -simdjson_inline simdjson_result<icelake::number_type> simdjson_result<icelake::ondemand::document_reference>::get_number_type() noexcept { +simdjson_inline simdjson_result<ppc64::number_type> simdjson_result<ppc64::ondemand::document_reference>::get_number_type() noexcept { if (error()) { return error(); } return first.get_number_type(); } -simdjson_inline simdjson_result<icelake::ondemand::number> simdjson_result<icelake::ondemand::document_reference>::get_number() noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::number> simdjson_result<ppc64::ondemand::document_reference>::get_number() noexcept { if (error()) { return error(); } return first.get_number(); } #if SIMDJSON_EXCEPTIONS template <class T> -simdjson_inline simdjson_result<icelake::ondemand::document_reference>::operator T() noexcept(false) { - static_assert(std::is_same<T, icelake::ondemand::document_reference>::value == false, "You should not call get<T> when T is a document"); - static_assert(std::is_same<T, icelake::ondemand::document>::value == false, "You should not call get<T> when T is a document"); +simdjson_inline simdjson_result<ppc64::ondemand::document_reference>::operator T() noexcept(false) { + static_assert(std::is_same<T, ppc64::ondemand::document_reference>::value == false, "You should not call get<T> when T is a document"); + static_assert(std::is_same<T, ppc64::ondemand::document>::value == false, "You should not call get<T> when T is a document"); if (error()) { throw simdjson_error(error()); } return first.get<T>(); } -simdjson_inline simdjson_result<icelake::ondemand::document_reference>::operator icelake::ondemand::array() & noexcept(false) { +simdjson_inline simdjson_result<ppc64::ondemand::document_reference>::operator ppc64::ondemand::array() & noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<icelake::ondemand::document_reference>::operator icelake::ondemand::object() & noexcept(false) { +simdjson_inline simdjson_result<ppc64::ondemand::document_reference>::operator ppc64::ondemand::object() & noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<icelake::ondemand::document_reference>::operator uint64_t() noexcept(false) { +simdjson_inline simdjson_result<ppc64::ondemand::document_reference>::operator uint64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<icelake::ondemand::document_reference>::operator int64_t() noexcept(false) { +simdjson_inline simdjson_result<ppc64::ondemand::document_reference>::operator int64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<icelake::ondemand::document_reference>::operator double() noexcept(false) { +simdjson_inline simdjson_result<ppc64::ondemand::document_reference>::operator double() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<icelake::ondemand::document_reference>::operator std::string_view() noexcept(false) { +simdjson_inline simdjson_result<ppc64::ondemand::document_reference>::operator std::string_view() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<icelake::ondemand::document_reference>::operator icelake::ondemand::raw_json_string() noexcept(false) { +simdjson_inline simdjson_result<ppc64::ondemand::document_reference>::operator ppc64::ondemand::raw_json_string() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<icelake::ondemand::document_reference>::operator bool() noexcept(false) { +simdjson_inline simdjson_result<ppc64::ondemand::document_reference>::operator bool() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<icelake::ondemand::document_reference>::operator icelake::ondemand::value() noexcept(false) { +simdjson_inline simdjson_result<ppc64::ondemand::document_reference>::operator ppc64::ondemand::value() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } #endif -simdjson_inline simdjson_result<const char *> simdjson_result<icelake::ondemand::document_reference>::current_location() noexcept { +simdjson_inline simdjson_result<const char *> simdjson_result<ppc64::ondemand::document_reference>::current_location() noexcept { if (error()) { return error(); } return first.current_location(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<icelake::ondemand::document_reference>::raw_json_token() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<ppc64::ondemand::document_reference>::raw_json_token() noexcept { if (error()) { return error(); } return first.raw_json_token(); } -simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::document_reference>::at_pointer(std::string_view json_pointer) noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::document_reference>::at_pointer(std::string_view json_pointer) noexcept { if (error()) { return error(); } return first.at_pointer(json_pointer); } -simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::document_reference>::at_path(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::document_reference>::at_path(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path(json_path); } -simdjson_inline simdjson_result<std::vector<icelake::ondemand::value>> simdjson_result<icelake::ondemand::document_reference>::at_path_with_wildcard(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<std::vector<ppc64::ondemand::value>> simdjson_result<ppc64::ondemand::document_reference>::at_path_with_wildcard(std::string_view json_path) noexcept { if (error()) { return error(); } @@ -87045,7 +124453,7 @@ simdjson_inline simdjson_result<std::vector<icelake::ondemand::value>> simdjson_ #if SIMDJSON_STATIC_REFLECTION template<constevalutil::fixed_string... FieldNames, typename T> requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) -simdjson_warn_unused simdjson_inline error_code simdjson_result<icelake::ondemand::document_reference>::extract_into(T& out) & noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<ppc64::ondemand::document_reference>::extract_into(T& out) & noexcept { if (error()) { return error(); } return first.extract_into<FieldNames...>(out); } @@ -87053,9 +124461,9 @@ simdjson_warn_unused simdjson_inline error_code simdjson_result<icelake::ondeman } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H -/* end file simdjson/generic/ondemand/document-inl.h for icelake */ -/* including simdjson/generic/ondemand/document_stream-inl.h for icelake: #include "simdjson/generic/ondemand/document_stream-inl.h" */ -/* begin file simdjson/generic/ondemand/document_stream-inl.h for icelake */ +/* end file simdjson/generic/ondemand/document-inl.h for ppc64 */ +/* including simdjson/generic/ondemand/document_stream-inl.h for ppc64: #include "simdjson/generic/ondemand/document_stream-inl.h" */ +/* begin file simdjson/generic/ondemand/document_stream-inl.h for ppc64 */ #ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -87070,7 +124478,7 @@ simdjson_warn_unused simdjson_inline error_code simdjson_result<icelake::ondeman #include <stdexcept> namespace simdjson { -namespace icelake { +namespace ppc64 { namespace ondemand { #ifdef SIMDJSON_THREADS_ENABLED @@ -87477,22 +124885,22 @@ inline void document_stream::start_stage1_thread() noexcept { #endif // SIMDJSON_THREADS_ENABLED } // namespace ondemand -} // namespace icelake +} // namespace ppc64 } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<icelake::ondemand::document_stream>::simdjson_result( +simdjson_inline simdjson_result<ppc64::ondemand::document_stream>::simdjson_result( error_code error ) noexcept : - implementation_simdjson_result_base<icelake::ondemand::document_stream>(error) + implementation_simdjson_result_base<ppc64::ondemand::document_stream>(error) { } -simdjson_inline simdjson_result<icelake::ondemand::document_stream>::simdjson_result( - icelake::ondemand::document_stream &&value +simdjson_inline simdjson_result<ppc64::ondemand::document_stream>::simdjson_result( + ppc64::ondemand::document_stream &&value ) noexcept : - implementation_simdjson_result_base<icelake::ondemand::document_stream>( - std::forward<icelake::ondemand::document_stream>(value) + implementation_simdjson_result_base<ppc64::ondemand::document_stream>( + std::forward<ppc64::ondemand::document_stream>(value) ) { } @@ -87500,9 +124908,9 @@ simdjson_inline simdjson_result<icelake::ondemand::document_stream>::simdjson_re } #endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_INL_H -/* end file simdjson/generic/ondemand/document_stream-inl.h for icelake */ -/* including simdjson/generic/ondemand/field-inl.h for icelake: #include "simdjson/generic/ondemand/field-inl.h" */ -/* begin file simdjson/generic/ondemand/field-inl.h for icelake */ +/* end file simdjson/generic/ondemand/document_stream-inl.h for ppc64 */ +/* including simdjson/generic/ondemand/field-inl.h for ppc64: #include "simdjson/generic/ondemand/field-inl.h" */ +/* begin file simdjson/generic/ondemand/field-inl.h for ppc64 */ #ifndef SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -87514,7 +124922,7 @@ simdjson_inline simdjson_result<icelake::ondemand::document_stream>::simdjson_re /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace icelake { +namespace ppc64 { namespace ondemand { // clang 6 does not think the default constructor can be noexcept, so we make it explicit @@ -87578,53 +124986,53 @@ simdjson_inline value field::value() && noexcept { } } // namespace ondemand -} // namespace icelake +} // namespace ppc64 } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<icelake::ondemand::field>::simdjson_result( - icelake::ondemand::field &&value +simdjson_inline simdjson_result<ppc64::ondemand::field>::simdjson_result( + ppc64::ondemand::field &&value ) noexcept : - implementation_simdjson_result_base<icelake::ondemand::field>( - std::forward<icelake::ondemand::field>(value) + implementation_simdjson_result_base<ppc64::ondemand::field>( + std::forward<ppc64::ondemand::field>(value) ) { } -simdjson_inline simdjson_result<icelake::ondemand::field>::simdjson_result( +simdjson_inline simdjson_result<ppc64::ondemand::field>::simdjson_result( error_code error ) noexcept : - implementation_simdjson_result_base<icelake::ondemand::field>(error) + implementation_simdjson_result_base<ppc64::ondemand::field>(error) { } -simdjson_inline simdjson_result<icelake::ondemand::raw_json_string> simdjson_result<icelake::ondemand::field>::key() noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::raw_json_string> simdjson_result<ppc64::ondemand::field>::key() noexcept { if (error()) { return error(); } return first.key(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<icelake::ondemand::field>::key_raw_json_token() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<ppc64::ondemand::field>::key_raw_json_token() noexcept { if (error()) { return error(); } return first.key_raw_json_token(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<icelake::ondemand::field>::escaped_key() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<ppc64::ondemand::field>::escaped_key() noexcept { if (error()) { return error(); } return first.escaped_key(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<icelake::ondemand::field>::unescaped_key(bool allow_replacement) noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<ppc64::ondemand::field>::unescaped_key(bool allow_replacement) noexcept { if (error()) { return error(); } return first.unescaped_key(allow_replacement); } template<typename string_type> -simdjson_warn_unused simdjson_inline error_code simdjson_result<icelake::ondemand::field>::unescaped_key(string_type &receiver, bool allow_replacement) noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<ppc64::ondemand::field>::unescaped_key(string_type &receiver, bool allow_replacement) noexcept { if (error()) { return error(); } return first.unescaped_key(receiver, allow_replacement); } -simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::field>::value() noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::field>::value() noexcept { if (error()) { return error(); } return std::move(first.value()); } @@ -87632,9 +125040,9 @@ simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelak } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H -/* end file simdjson/generic/ondemand/field-inl.h for icelake */ -/* including simdjson/generic/ondemand/json_iterator-inl.h for icelake: #include "simdjson/generic/ondemand/json_iterator-inl.h" */ -/* begin file simdjson/generic/ondemand/json_iterator-inl.h for icelake */ +/* end file simdjson/generic/ondemand/field-inl.h for ppc64 */ +/* including simdjson/generic/ondemand/json_iterator-inl.h for ppc64: #include "simdjson/generic/ondemand/json_iterator-inl.h" */ +/* begin file simdjson/generic/ondemand/json_iterator-inl.h for ppc64 */ #ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -87650,7 +125058,7 @@ simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelak /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace icelake { +namespace ppc64 { namespace ondemand { simdjson_inline json_iterator::json_iterator(json_iterator &&other) noexcept @@ -87852,11 +125260,10 @@ simdjson_inline void json_iterator::assert_more_tokens(uint32_t required_tokens) } simdjson_inline void json_iterator::assert_valid_position(token_position position) const noexcept { + (void)position; // Suppress unused parameter warning #ifndef SIMDJSON_CLANG_VISUAL_STUDIO SIMDJSON_ASSUME( position >= &parser->implementation->structural_indexes[0] ); SIMDJSON_ASSUME( position < &parser->implementation->structural_indexes[parser->implementation->n_structural_indexes] ); -#else - (void)position; // Suppress unused parameter warning #endif } @@ -87995,7 +125402,11 @@ simdjson_inline token_position json_iterator::position() const noexcept { simdjson_inline simdjson_result<std::string_view> json_iterator::unescape(raw_json_string in, bool allow_replacement) noexcept { #if SIMDJSON_DEVELOPMENT_CHECKS auto result = parser->unescape(in, _string_buf_loc, allow_replacement); +#if !defined(SIMDJSON_VISUAL_STUDIO) && !defined(SIMDJSON_CLANG_VISUAL_STUDIO) + // Under Visual Studio, the next SIMDJSON_ASSUME fails with: the argument + // has side effects that will be discarded. SIMDJSON_ASSUME(!parser->string_buffer_overflow(_string_buf_loc)); +#endif // !defined(SIMDJSON_VISUAL_STUDIO) && !defined(SIMDJSON_CLANG_VISUAL_STUDIO) return result; #else return parser->unescape(in, _string_buf_loc, allow_replacement); @@ -88005,7 +125416,11 @@ simdjson_inline simdjson_result<std::string_view> json_iterator::unescape(raw_js simdjson_inline simdjson_result<std::string_view> json_iterator::unescape_wobbly(raw_json_string in) noexcept { #if SIMDJSON_DEVELOPMENT_CHECKS auto result = parser->unescape_wobbly(in, _string_buf_loc); +#if !defined(SIMDJSON_VISUAL_STUDIO) && !defined(SIMDJSON_CLANG_VISUAL_STUDIO) + // Under Visual Studio, the next SIMDJSON_ASSUME fails with: the argument + // has side effects that will be discarded. SIMDJSON_ASSUME(!parser->string_buffer_overflow(_string_buf_loc)); +#endif // !defined(SIMDJSON_VISUAL_STUDIO) && !defined(SIMDJSON_CLANG_VISUAL_STUDIO) return result; #else return parser->unescape_wobbly(in, _string_buf_loc); @@ -88068,22 +125483,22 @@ simdjson_warn_unused simdjson_inline bool json_iterator::copy_to_buffer(const ui } } // namespace ondemand -} // namespace icelake +} // namespace ppc64 } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<icelake::ondemand::json_iterator>::simdjson_result(icelake::ondemand::json_iterator &&value) noexcept - : implementation_simdjson_result_base<icelake::ondemand::json_iterator>(std::forward<icelake::ondemand::json_iterator>(value)) {} -simdjson_inline simdjson_result<icelake::ondemand::json_iterator>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<icelake::ondemand::json_iterator>(error) {} +simdjson_inline simdjson_result<ppc64::ondemand::json_iterator>::simdjson_result(ppc64::ondemand::json_iterator &&value) noexcept + : implementation_simdjson_result_base<ppc64::ondemand::json_iterator>(std::forward<ppc64::ondemand::json_iterator>(value)) {} +simdjson_inline simdjson_result<ppc64::ondemand::json_iterator>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<ppc64::ondemand::json_iterator>(error) {} } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_INL_H -/* end file simdjson/generic/ondemand/json_iterator-inl.h for icelake */ -/* including simdjson/generic/ondemand/json_type-inl.h for icelake: #include "simdjson/generic/ondemand/json_type-inl.h" */ -/* begin file simdjson/generic/ondemand/json_type-inl.h for icelake */ +/* end file simdjson/generic/ondemand/json_iterator-inl.h for ppc64 */ +/* including simdjson/generic/ondemand/json_type-inl.h for ppc64: #include "simdjson/generic/ondemand/json_type-inl.h" */ +/* begin file simdjson/generic/ondemand/json_type-inl.h for ppc64 */ #ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -88094,7 +125509,7 @@ simdjson_inline simdjson_result<icelake::ondemand::json_iterator>::simdjson_resu /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace icelake { +namespace ppc64 { namespace ondemand { inline std::ostream& operator<<(std::ostream& out, json_type type) noexcept { @@ -88188,22 +125603,22 @@ simdjson_inline void number::skip_double() noexcept { } } // namespace ondemand -} // namespace icelake +} // namespace ppc64 } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<icelake::ondemand::json_type>::simdjson_result(icelake::ondemand::json_type &&value) noexcept - : implementation_simdjson_result_base<icelake::ondemand::json_type>(std::forward<icelake::ondemand::json_type>(value)) {} -simdjson_inline simdjson_result<icelake::ondemand::json_type>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<icelake::ondemand::json_type>(error) {} +simdjson_inline simdjson_result<ppc64::ondemand::json_type>::simdjson_result(ppc64::ondemand::json_type &&value) noexcept + : implementation_simdjson_result_base<ppc64::ondemand::json_type>(std::forward<ppc64::ondemand::json_type>(value)) {} +simdjson_inline simdjson_result<ppc64::ondemand::json_type>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<ppc64::ondemand::json_type>(error) {} } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_INL_H -/* end file simdjson/generic/ondemand/json_type-inl.h for icelake */ -/* including simdjson/generic/ondemand/logger-inl.h for icelake: #include "simdjson/generic/ondemand/logger-inl.h" */ -/* begin file simdjson/generic/ondemand/logger-inl.h for icelake */ +/* end file simdjson/generic/ondemand/json_type-inl.h for ppc64 */ +/* including simdjson/generic/ondemand/logger-inl.h for ppc64: #include "simdjson/generic/ondemand/logger-inl.h" */ +/* begin file simdjson/generic/ondemand/logger-inl.h for ppc64 */ #ifndef SIMDJSON_GENERIC_ONDEMAND_LOGGER_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -88218,7 +125633,7 @@ simdjson_inline simdjson_result<icelake::ondemand::json_type>::simdjson_result(e #include <cstring> namespace simdjson { -namespace icelake { +namespace ppc64 { namespace ondemand { namespace logger { @@ -88425,13 +125840,13 @@ inline void log_line(const json_iterator &iter, token_position index, depth_t de } // namespace logger } // namespace ondemand -} // namespace icelake +} // namespace ppc64 } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_LOGGER_INL_H -/* end file simdjson/generic/ondemand/logger-inl.h for icelake */ -/* including simdjson/generic/ondemand/object-inl.h for icelake: #include "simdjson/generic/ondemand/object-inl.h" */ -/* begin file simdjson/generic/ondemand/object-inl.h for icelake */ +/* end file simdjson/generic/ondemand/logger-inl.h for ppc64 */ +/* including simdjson/generic/ondemand/object-inl.h for ppc64: #include "simdjson/generic/ondemand/object-inl.h" */ +/* begin file simdjson/generic/ondemand/object-inl.h for ppc64 */ #ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -88451,7 +125866,7 @@ inline void log_line(const json_iterator &iter, token_position index, depth_t de /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace icelake { +namespace ppc64 { namespace ondemand { simdjson_inline simdjson_result<value> object::find_field_unordered(const std::string_view key) & noexcept { @@ -88725,55 +126140,55 @@ simdjson_warn_unused simdjson_inline error_code object::extract_into(T& out) & n #endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION } // namespace ondemand -} // namespace icelake +} // namespace ppc64 } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<icelake::ondemand::object>::simdjson_result(icelake::ondemand::object &&value) noexcept - : implementation_simdjson_result_base<icelake::ondemand::object>(std::forward<icelake::ondemand::object>(value)) {} -simdjson_inline simdjson_result<icelake::ondemand::object>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<icelake::ondemand::object>(error) {} +simdjson_inline simdjson_result<ppc64::ondemand::object>::simdjson_result(ppc64::ondemand::object &&value) noexcept + : implementation_simdjson_result_base<ppc64::ondemand::object>(std::forward<ppc64::ondemand::object>(value)) {} +simdjson_inline simdjson_result<ppc64::ondemand::object>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<ppc64::ondemand::object>(error) {} -simdjson_inline simdjson_result<icelake::ondemand::object_iterator> simdjson_result<icelake::ondemand::object>::begin() noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::object_iterator> simdjson_result<ppc64::ondemand::object>::begin() noexcept { if (error()) { return error(); } return first.begin(); } -simdjson_inline simdjson_result<icelake::ondemand::object_iterator> simdjson_result<icelake::ondemand::object>::end() noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::object_iterator> simdjson_result<ppc64::ondemand::object>::end() noexcept { if (error()) { return error(); } return first.end(); } -simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::object>::find_field_unordered(std::string_view key) & noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::object>::find_field_unordered(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::object>::find_field_unordered(std::string_view key) && noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::object>::find_field_unordered(std::string_view key) && noexcept { if (error()) { return error(); } - return std::forward<icelake::ondemand::object>(first).find_field_unordered(key); + return std::forward<ppc64::ondemand::object>(first).find_field_unordered(key); } -simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::object>::operator[](std::string_view key) & noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::object>::operator[](std::string_view key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::object>::operator[](std::string_view key) && noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::object>::operator[](std::string_view key) && noexcept { if (error()) { return error(); } - return std::forward<icelake::ondemand::object>(first)[key]; + return std::forward<ppc64::ondemand::object>(first)[key]; } -simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::object>::find_field(std::string_view key) & noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::object>::find_field(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::object>::find_field(std::string_view key) && noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::object>::find_field(std::string_view key) && noexcept { if (error()) { return error(); } - return std::forward<icelake::ondemand::object>(first).find_field(key); + return std::forward<ppc64::ondemand::object>(first).find_field(key); } -simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::object>::at_pointer(std::string_view json_pointer) noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::object>::at_pointer(std::string_view json_pointer) noexcept { if (error()) { return error(); } return first.at_pointer(json_pointer); } -simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelake::ondemand::object>::at_path( +simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::object>::at_path( std::string_view json_path) noexcept { if (error()) { return error(); @@ -88781,27 +126196,27 @@ simdjson_inline simdjson_result<icelake::ondemand::value> simdjson_result<icelak return first.at_path(json_path); } -simdjson_inline simdjson_result<std::vector<icelake::ondemand::value>> simdjson_result<icelake::ondemand::object>::at_path_with_wildcard(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<std::vector<ppc64::ondemand::value>> simdjson_result<ppc64::ondemand::object>::at_path_with_wildcard(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path_with_wildcard(json_path); } -inline simdjson_result<bool> simdjson_result<icelake::ondemand::object>::reset() noexcept { +inline simdjson_result<bool> simdjson_result<ppc64::ondemand::object>::reset() noexcept { if (error()) { return error(); } return first.reset(); } -inline simdjson_result<bool> simdjson_result<icelake::ondemand::object>::is_empty() noexcept { +inline simdjson_result<bool> simdjson_result<ppc64::ondemand::object>::is_empty() noexcept { if (error()) { return error(); } return first.is_empty(); } -simdjson_inline simdjson_result<size_t> simdjson_result<icelake::ondemand::object>::count_fields() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<ppc64::ondemand::object>::count_fields() & noexcept { if (error()) { return error(); } return first.count_fields(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<icelake::ondemand::object>::raw_json() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<ppc64::ondemand::object>::raw_json() noexcept { if (error()) { return error(); } return first.raw_json(); } @@ -88809,9 +126224,9 @@ simdjson_inline simdjson_result<std::string_view> simdjson_result<icelake::onde } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_INL_H -/* end file simdjson/generic/ondemand/object-inl.h for icelake */ -/* including simdjson/generic/ondemand/object_iterator-inl.h for icelake: #include "simdjson/generic/ondemand/object_iterator-inl.h" */ -/* begin file simdjson/generic/ondemand/object_iterator-inl.h for icelake */ +/* end file simdjson/generic/ondemand/object-inl.h for ppc64 */ +/* including simdjson/generic/ondemand/object_iterator-inl.h for ppc64: #include "simdjson/generic/ondemand/object_iterator-inl.h" */ +/* begin file simdjson/generic/ondemand/object_iterator-inl.h for ppc64 */ #ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -88823,7 +126238,7 @@ simdjson_inline simdjson_result<std::string_view> simdjson_result<icelake::onde /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace icelake { +namespace ppc64 { namespace ondemand { // @@ -88835,6 +126250,11 @@ simdjson_inline object_iterator::object_iterator(const value_iterator &_iter) no {} simdjson_inline simdjson_result<field> object_iterator::operator*() noexcept { +#if SIMDJSON_DEVELOPMENT_CHECKS + // We must call * once per iteration. + SIMDJSON_ASSUME(!has_been_referenced); + has_been_referenced = true; +#endif error_code error = iter.error(); if (error) { iter.abandon(); return error; } auto result = field::start(iter); @@ -88853,6 +126273,11 @@ simdjson_inline bool object_iterator::operator!=(const object_iterator &) const SIMDJSON_PUSH_DISABLE_WARNINGS SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING simdjson_inline object_iterator &object_iterator::operator++() noexcept { +#if SIMDJSON_DEVELOPMENT_CHECKS + // Before calling ++, we must have called *. + SIMDJSON_ASSUME(has_been_referenced); + has_been_referenced = false; +#endif // TODO this is a safety rail ... users should exit loops as soon as they receive an error. // Nonetheless, let's see if performance is OK with this if statement--the compiler may give it to us for free. if (!iter.is_open()) { return *this; } // Iterator will be released if there is an error @@ -88908,39 +126333,39 @@ SIMDJSON_POP_DISABLE_WARNINGS // } // namespace ondemand -} // namespace icelake +} // namespace ppc64 } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<icelake::ondemand::object_iterator>::simdjson_result( - icelake::ondemand::object_iterator &&value +simdjson_inline simdjson_result<ppc64::ondemand::object_iterator>::simdjson_result( + ppc64::ondemand::object_iterator &&value ) noexcept - : implementation_simdjson_result_base<icelake::ondemand::object_iterator>(std::forward<icelake::ondemand::object_iterator>(value)) + : implementation_simdjson_result_base<ppc64::ondemand::object_iterator>(std::forward<ppc64::ondemand::object_iterator>(value)) { first.iter.assert_is_valid(); } -simdjson_inline simdjson_result<icelake::ondemand::object_iterator>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<icelake::ondemand::object_iterator>({}, error) +simdjson_inline simdjson_result<ppc64::ondemand::object_iterator>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<ppc64::ondemand::object_iterator>({}, error) { } -simdjson_inline simdjson_result<icelake::ondemand::field> simdjson_result<icelake::ondemand::object_iterator>::operator*() noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::field> simdjson_result<ppc64::ondemand::object_iterator>::operator*() noexcept { if (error()) { return error(); } return *first; } // If we're iterating and there is an error, return the error once. -simdjson_inline bool simdjson_result<icelake::ondemand::object_iterator>::operator==(const simdjson_result<icelake::ondemand::object_iterator> &other) const noexcept { +simdjson_inline bool simdjson_result<ppc64::ondemand::object_iterator>::operator==(const simdjson_result<ppc64::ondemand::object_iterator> &other) const noexcept { if (!first.iter.is_valid()) { return !error(); } return first == other.first; } // If we're iterating and there is an error, return the error once. -simdjson_inline bool simdjson_result<icelake::ondemand::object_iterator>::operator!=(const simdjson_result<icelake::ondemand::object_iterator> &other) const noexcept { +simdjson_inline bool simdjson_result<ppc64::ondemand::object_iterator>::operator!=(const simdjson_result<ppc64::ondemand::object_iterator> &other) const noexcept { if (!first.iter.is_valid()) { return error(); } return first != other.first; } // Checks for ']' and ',' -simdjson_inline simdjson_result<icelake::ondemand::object_iterator> &simdjson_result<icelake::ondemand::object_iterator>::operator++() noexcept { +simdjson_inline simdjson_result<ppc64::ondemand::object_iterator> &simdjson_result<ppc64::ondemand::object_iterator>::operator++() noexcept { // Clear the error if there is one, so we don't yield it twice if (error()) { second = SUCCESS; return *this; } ++first; @@ -88950,9 +126375,9 @@ simdjson_inline simdjson_result<icelake::ondemand::object_iterator> &simdjson_re } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_INL_H -/* end file simdjson/generic/ondemand/object_iterator-inl.h for icelake */ -/* including simdjson/generic/ondemand/parser-inl.h for icelake: #include "simdjson/generic/ondemand/parser-inl.h" */ -/* begin file simdjson/generic/ondemand/parser-inl.h for icelake */ +/* end file simdjson/generic/ondemand/object_iterator-inl.h for ppc64 */ +/* including simdjson/generic/ondemand/parser-inl.h for ppc64: #include "simdjson/generic/ondemand/parser-inl.h" */ +/* begin file simdjson/generic/ondemand/parser-inl.h for ppc64 */ #ifndef SIMDJSON_GENERIC_ONDEMAND_PARSER_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -88969,7 +126394,7 @@ simdjson_inline simdjson_result<icelake::ondemand::object_iterator> &simdjson_re /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace icelake { +namespace ppc64 { namespace ondemand { simdjson_inline parser::parser(size_t max_capacity) noexcept @@ -89179,22 +126604,22 @@ simdjson_inline simdjson_warn_unused std::unique_ptr<ondemand::parser>& parser:: } // namespace ondemand -} // namespace icelake +} // namespace ppc64 } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<icelake::ondemand::parser>::simdjson_result(icelake::ondemand::parser &&value) noexcept - : implementation_simdjson_result_base<icelake::ondemand::parser>(std::forward<icelake::ondemand::parser>(value)) {} -simdjson_inline simdjson_result<icelake::ondemand::parser>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<icelake::ondemand::parser>(error) {} +simdjson_inline simdjson_result<ppc64::ondemand::parser>::simdjson_result(ppc64::ondemand::parser &&value) noexcept + : implementation_simdjson_result_base<ppc64::ondemand::parser>(std::forward<ppc64::ondemand::parser>(value)) {} +simdjson_inline simdjson_result<ppc64::ondemand::parser>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<ppc64::ondemand::parser>(error) {} } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_PARSER_INL_H -/* end file simdjson/generic/ondemand/parser-inl.h for icelake */ -/* including simdjson/generic/ondemand/raw_json_string-inl.h for icelake: #include "simdjson/generic/ondemand/raw_json_string-inl.h" */ -/* begin file simdjson/generic/ondemand/raw_json_string-inl.h for icelake */ +/* end file simdjson/generic/ondemand/parser-inl.h for ppc64 */ +/* including simdjson/generic/ondemand/raw_json_string-inl.h for ppc64: #include "simdjson/generic/ondemand/raw_json_string-inl.h" */ +/* begin file simdjson/generic/ondemand/raw_json_string-inl.h for ppc64 */ #ifndef SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -89207,7 +126632,7 @@ simdjson_inline simdjson_result<icelake::ondemand::parser>::simdjson_result(erro namespace simdjson { -namespace icelake { +namespace ppc64 { namespace ondemand { simdjson_inline raw_json_string::raw_json_string(const uint8_t * _buf) noexcept : buf{_buf} {} @@ -89381,277 +126806,38 @@ simdjson_unused simdjson_inline std::ostream &operator<<(std::ostream &out, cons } } // namespace ondemand -} // namespace icelake +} // namespace ppc64 } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<icelake::ondemand::raw_json_string>::simdjson_result(icelake::ondemand::raw_json_string &&value) noexcept - : implementation_simdjson_result_base<icelake::ondemand::raw_json_string>(std::forward<icelake::ondemand::raw_json_string>(value)) {} -simdjson_inline simdjson_result<icelake::ondemand::raw_json_string>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<icelake::ondemand::raw_json_string>(error) {} +simdjson_inline simdjson_result<ppc64::ondemand::raw_json_string>::simdjson_result(ppc64::ondemand::raw_json_string &&value) noexcept + : implementation_simdjson_result_base<ppc64::ondemand::raw_json_string>(std::forward<ppc64::ondemand::raw_json_string>(value)) {} +simdjson_inline simdjson_result<ppc64::ondemand::raw_json_string>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<ppc64::ondemand::raw_json_string>(error) {} -simdjson_inline simdjson_result<const char *> simdjson_result<icelake::ondemand::raw_json_string>::raw() const noexcept { +simdjson_inline simdjson_result<const char *> simdjson_result<ppc64::ondemand::raw_json_string>::raw() const noexcept { if (error()) { return error(); } return first.raw(); } -simdjson_inline char simdjson_result<icelake::ondemand::raw_json_string>::operator[](size_t i) const noexcept { +simdjson_inline char simdjson_result<ppc64::ondemand::raw_json_string>::operator[](size_t i) const noexcept { if (error()) { return error(); } return first[i]; } -simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> simdjson_result<icelake::ondemand::raw_json_string>::unescape(icelake::ondemand::json_iterator &iter, bool allow_replacement) const noexcept { +simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> simdjson_result<ppc64::ondemand::raw_json_string>::unescape(ppc64::ondemand::json_iterator &iter, bool allow_replacement) const noexcept { if (error()) { return error(); } return first.unescape(iter, allow_replacement); } -simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> simdjson_result<icelake::ondemand::raw_json_string>::unescape_wobbly(icelake::ondemand::json_iterator &iter) const noexcept { +simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> simdjson_result<ppc64::ondemand::raw_json_string>::unescape_wobbly(ppc64::ondemand::json_iterator &iter) const noexcept { if (error()) { return error(); } return first.unescape_wobbly(iter); } } // namespace simdjson -#endif // SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_INL_H -/* end file simdjson/generic/ondemand/raw_json_string-inl.h for icelake */ -/* including simdjson/generic/ondemand/serialization-inl.h for icelake: #include "simdjson/generic/ondemand/serialization-inl.h" */ -/* begin file simdjson/generic/ondemand/serialization-inl.h for icelake */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H - -/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document-inl.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/serialization.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */ -/* amalgamation skipped (editor-only): #if SIMDJSON_STATIC_REFLECTION */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_builder.h" */ -/* amalgamation skipped (editor-only): #endif */ -/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ - -namespace simdjson { - -inline std::string_view trim(const std::string_view str) noexcept { - // We can almost surely do better by rolling our own find_first_not_of function. - size_t first = str.find_first_not_of(" \t\n\r"); - // If we have the empty string (just white space), then no trimming is possible, and - // we return the empty string_view. - if (std::string_view::npos == first) { return std::string_view(); } - size_t last = str.find_last_not_of(" \t\n\r"); - return str.substr(first, (last - first + 1)); -} - - -inline simdjson_result<std::string_view> to_json_string(icelake::ondemand::document& x) noexcept { - std::string_view v; - auto error = x.raw_json().get(v); - if(error) {return error; } - return trim(v); -} - -inline simdjson_result<std::string_view> to_json_string(icelake::ondemand::document_reference& x) noexcept { - std::string_view v; - auto error = x.raw_json().get(v); - if(error) {return error; } - return trim(v); -} - -inline simdjson_result<std::string_view> to_json_string(icelake::ondemand::value& x) noexcept { - /** - * If we somehow receive a value that has already been consumed, - * then the following code could be in trouble. E.g., we create - * an array as needed, but if an array was already created, then - * it could be bad. - */ - using namespace icelake::ondemand; - icelake::ondemand::json_type t; - auto error = x.type().get(t); - if(error != SUCCESS) { return error; } - switch (t) - { - case json_type::array: - { - icelake::ondemand::array array; - error = x.get_array().get(array); - if(error) { return error; } - return to_json_string(array); - } - case json_type::object: - { - icelake::ondemand::object object; - error = x.get_object().get(object); - if(error) { return error; } - return to_json_string(object); - } - default: - return trim(x.raw_json_token()); - } -} - -inline simdjson_result<std::string_view> to_json_string(icelake::ondemand::object& x) noexcept { - std::string_view v; - auto error = x.raw_json().get(v); - if(error) {return error; } - return trim(v); -} - -inline simdjson_result<std::string_view> to_json_string(icelake::ondemand::array& x) noexcept { - std::string_view v; - auto error = x.raw_json().get(v); - if(error) {return error; } - return trim(v); -} - -inline simdjson_result<std::string_view> to_json_string(simdjson_result<icelake::ondemand::document> x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); -} - -inline simdjson_result<std::string_view> to_json_string(simdjson_result<icelake::ondemand::document_reference> x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); -} - -inline simdjson_result<std::string_view> to_json_string(simdjson_result<icelake::ondemand::value> x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); -} - -inline simdjson_result<std::string_view> to_json_string(simdjson_result<icelake::ondemand::object> x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); -} - -inline simdjson_result<std::string_view> to_json_string(simdjson_result<icelake::ondemand::array> x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); -} -} // namespace simdjson - -namespace simdjson { namespace icelake { namespace ondemand { - -#if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::icelake::ondemand::value x) { - std::string_view v; - auto error = simdjson::to_json_string(x).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - throw simdjson::simdjson_error(error); - } -} -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::icelake::ondemand::value> x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); -} -#else -inline std::ostream& operator<<(std::ostream& out, simdjson::icelake::ondemand::value x) { - std::string_view v; - auto error = simdjson::to_json_string(x).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - return (out << error); - } -} -#endif - -#if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::icelake::ondemand::array value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - throw simdjson::simdjson_error(error); - } -} -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::icelake::ondemand::array> x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); -} -#else -inline std::ostream& operator<<(std::ostream& out, simdjson::icelake::ondemand::array value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - return (out << error); - } -} -#endif - -#if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::icelake::ondemand::document& value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - throw simdjson::simdjson_error(error); - } -} -inline std::ostream& operator<<(std::ostream& out, simdjson::icelake::ondemand::document_reference& value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - throw simdjson::simdjson_error(error); - } -} -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::icelake::ondemand::document>&& x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); -} -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::icelake::ondemand::document_reference>&& x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); -} -#else -inline std::ostream& operator<<(std::ostream& out, simdjson::icelake::ondemand::document& value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - return (out << error); - } -} -#endif - -#if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::icelake::ondemand::object value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - throw simdjson::simdjson_error(error); - } -} -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::icelake::ondemand::object> x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); -} -#else -inline std::ostream& operator<<(std::ostream& out, simdjson::icelake::ondemand::object value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - return (out << error); - } -} -#endif -}}} // namespace simdjson::icelake::ondemand - -#endif // SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H -/* end file simdjson/generic/ondemand/serialization-inl.h for icelake */ -/* including simdjson/generic/ondemand/token_iterator-inl.h for icelake: #include "simdjson/generic/ondemand/token_iterator-inl.h" */ -/* begin file simdjson/generic/ondemand/token_iterator-inl.h for icelake */ +#endif // SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_INL_H +/* end file simdjson/generic/ondemand/raw_json_string-inl.h for ppc64 */ +/* including simdjson/generic/ondemand/token_iterator-inl.h for ppc64: #include "simdjson/generic/ondemand/token_iterator-inl.h" */ +/* begin file simdjson/generic/ondemand/token_iterator-inl.h for ppc64 */ #ifndef SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -89662,7 +126848,7 @@ inline std::ostream& operator<<(std::ostream& out, simdjson::icelake::ondemand:: /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace icelake { +namespace ppc64 { namespace ondemand { simdjson_inline token_iterator::token_iterator( @@ -89733,22 +126919,22 @@ simdjson_inline bool token_iterator::operator<=(const token_iterator &other) con } } // namespace ondemand -} // namespace icelake +} // namespace ppc64 } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<icelake::ondemand::token_iterator>::simdjson_result(icelake::ondemand::token_iterator &&value) noexcept - : implementation_simdjson_result_base<icelake::ondemand::token_iterator>(std::forward<icelake::ondemand::token_iterator>(value)) {} -simdjson_inline simdjson_result<icelake::ondemand::token_iterator>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<icelake::ondemand::token_iterator>(error) {} +simdjson_inline simdjson_result<ppc64::ondemand::token_iterator>::simdjson_result(ppc64::ondemand::token_iterator &&value) noexcept + : implementation_simdjson_result_base<ppc64::ondemand::token_iterator>(std::forward<ppc64::ondemand::token_iterator>(value)) {} +simdjson_inline simdjson_result<ppc64::ondemand::token_iterator>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<ppc64::ondemand::token_iterator>(error) {} } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_INL_H -/* end file simdjson/generic/ondemand/token_iterator-inl.h for icelake */ -/* including simdjson/generic/ondemand/value_iterator-inl.h for icelake: #include "simdjson/generic/ondemand/value_iterator-inl.h" */ -/* begin file simdjson/generic/ondemand/value_iterator-inl.h for icelake */ +/* end file simdjson/generic/ondemand/token_iterator-inl.h for ppc64 */ +/* including simdjson/generic/ondemand/value_iterator-inl.h for ppc64: #include "simdjson/generic/ondemand/value_iterator-inl.h" */ +/* begin file simdjson/generic/ondemand/value_iterator-inl.h for ppc64 */ #ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -89763,7 +126949,7 @@ simdjson_inline simdjson_result<icelake::ondemand::token_iterator>::simdjson_res /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace icelake { +namespace ppc64 { namespace ondemand { simdjson_inline value_iterator::value_iterator( @@ -89845,7 +127031,6 @@ simdjson_warn_unused simdjson_inline error_code value_iterator::end_container() simdjson_warn_unused simdjson_inline simdjson_result<bool> value_iterator::has_next_field() noexcept { assert_at_next(); - // It's illegal to call this unless there are more tokens: anything that ends in } or ] is // obligated to verify there are more tokens if they are not the top level. switch (*_json_iter->return_current_and_advance()) { @@ -90267,9 +127452,13 @@ simdjson_warn_unused simdjson_inline simdjson_result<std::string_view> value_ite template <typename string_type> simdjson_warn_unused simdjson_inline error_code value_iterator::get_string(string_type& receiver, bool allow_replacement) noexcept { std::string_view content; + // Save the string buffer location so that we can restore it after get_string + auto saved_string_buf_loc = _json_iter->string_buf_loc(); auto err = get_string(allow_replacement).get(content); if (err) { return err; } receiver = content; + // Restore the string buffer location, effectively discarding any temporary string storage + _json_iter->string_buf_loc() = saved_string_buf_loc; return SUCCESS; } simdjson_warn_unused simdjson_inline simdjson_result<std::string_view> value_iterator::get_wobbly_string() noexcept { @@ -90357,7 +127546,7 @@ simdjson_inline simdjson_result<bool> value_iterator::is_root_integer(bool check return answer; } -simdjson_inline simdjson_result<icelake::number_type> value_iterator::get_root_number_type(bool check_trailing) noexcept { +simdjson_inline simdjson_result<ppc64::number_type> value_iterator::get_root_number_type(bool check_trailing) noexcept { auto max_len = peek_root_length(); auto json = peek_root_scalar("number"); // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/, @@ -90409,9 +127598,13 @@ simdjson_warn_unused simdjson_inline simdjson_result<std::string_view> value_ite template <typename string_type> simdjson_warn_unused simdjson_inline error_code value_iterator::get_root_string(string_type& receiver, bool check_trailing, bool allow_replacement) noexcept { std::string_view content; + // Save the string buffer location so that we can restore it after get_string + auto saved_string_buf_loc = _json_iter->string_buf_loc(); auto err = get_root_string(check_trailing, allow_replacement).get(content); if (err) { return err; } receiver = content; + // Restore the string buffer location, effectively discarding any temporary string storage + _json_iter->string_buf_loc() = saved_string_buf_loc; return SUCCESS; } simdjson_warn_unused simdjson_inline simdjson_result<std::string_view> value_iterator::get_root_wobbly_string(bool check_trailing) noexcept { @@ -90718,6 +127911,9 @@ simdjson_inline bool value_iterator::is_at_key() const noexcept { // Keys are at the same depth as the object. // Note here that we could be safer and check that we are within an object, // but we do not. + // + // As long as we are at the object's depth, in a valid document, + // we will only ever be at { , : or the actual string key: ". return _depth == _json_iter->_depth && *_json_iter->peek() == '"'; } @@ -90833,1116 +128029,263 @@ simdjson_inline error_code value_iterator::report_error(error_code error, const } } // namespace ondemand -} // namespace icelake +} // namespace ppc64 } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<icelake::ondemand::value_iterator>::simdjson_result(icelake::ondemand::value_iterator &&value) noexcept - : implementation_simdjson_result_base<icelake::ondemand::value_iterator>(std::forward<icelake::ondemand::value_iterator>(value)) {} -simdjson_inline simdjson_result<icelake::ondemand::value_iterator>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<icelake::ondemand::value_iterator>(error) {} +simdjson_inline simdjson_result<ppc64::ondemand::value_iterator>::simdjson_result(ppc64::ondemand::value_iterator &&value) noexcept + : implementation_simdjson_result_base<ppc64::ondemand::value_iterator>(std::forward<ppc64::ondemand::value_iterator>(value)) {} +simdjson_inline simdjson_result<ppc64::ondemand::value_iterator>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<ppc64::ondemand::value_iterator>(error) {} } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H -/* end file simdjson/generic/ondemand/value_iterator-inl.h for icelake */ - -// JSON builder inline definitions -/* including simdjson/generic/ondemand/json_string_builder-inl.h for icelake: #include "simdjson/generic/ondemand/json_string_builder-inl.h" */ -/* begin file simdjson/generic/ondemand/json_string_builder-inl.h for icelake */ -/** - * This file is part of the builder API. It is temporarily in the ondemand - * directory but we will move it to a builder directory later. - */ -#include <array> -#include <cstring> -#include <type_traits> -#ifndef SIMDJSON_GENERIC_STRING_BUILDER_INL_H - -/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_INL_H */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_string_builder.h" */ -/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ - -/* - * Empirically, we have found that an inlined optimization is important for - * performance. The following macros are not ideal. We should find a better - * way to inline the code. - */ - -#if defined(__SSE2__) || defined(__x86_64__) || defined(__x86_64) || \ - (defined(_M_AMD64) || defined(_M_X64) || \ - (defined(_M_IX86_FP) && _M_IX86_FP == 2)) -#ifndef SIMDJSON_EXPERIMENTAL_HAS_SSE2 -#define SIMDJSON_EXPERIMENTAL_HAS_SSE2 1 -#endif -#endif - -#if defined(__aarch64__) || defined(_M_ARM64) -#ifndef SIMDJSON_EXPERIMENTAL_HAS_NEON -#define SIMDJSON_EXPERIMENTAL_HAS_NEON 1 -#endif -#endif -#if SIMDJSON_EXPERIMENTAL_HAS_NEON -#include <arm_neon.h> -#endif -#if SIMDJSON_EXPERIMENTAL_HAS_SSE2 -#include <emmintrin.h> -#endif - -namespace simdjson { -namespace icelake { -namespace builder { - -static SIMDJSON_CONSTEXPR_LAMBDA std::array<uint8_t, 256> - json_quotable_character = { - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - -/** - -A possible SWAR implementation of has_json_escapable_byte. It is not used -because it is slower than the current implementation. It is kept here for -reference (to show that we tried it). - -inline bool has_json_escapable_byte(uint64_t x) { - uint64_t is_ascii = 0x8080808080808080ULL & ~x; - uint64_t xor2 = x ^ 0x0202020202020202ULL; - uint64_t lt32_or_eq34 = xor2 - 0x2121212121212121ULL; - uint64_t sub92 = x ^ 0x5C5C5C5C5C5C5C5CULL; - uint64_t eq92 = (sub92 - 0x0101010101010101ULL); - return ((lt32_or_eq34 | eq92) & is_ascii) != 0; -} - -**/ - -SIMDJSON_CONSTEXPR_LAMBDA simdjson_inline bool -simple_needs_escaping(std::string_view v) { - for (char c : v) { - // a table lookup is faster than a series of comparisons - if (json_quotable_character[static_cast<uint8_t>(c)]) { - return true; - } - } - return false; -} - -#if SIMDJSON_EXPERIMENTAL_HAS_NEON -simdjson_inline bool fast_needs_escaping(std::string_view view) { - if (view.size() < 16) { - return simple_needs_escaping(view); - } - size_t i = 0; - uint8x16_t running = vdupq_n_u8(0); - uint8x16_t v34 = vdupq_n_u8(34); - uint8x16_t v92 = vdupq_n_u8(92); - - for (; i + 15 < view.size(); i += 16) { - uint8x16_t word = vld1q_u8((const uint8_t *)view.data() + i); - running = vorrq_u8(running, vceqq_u8(word, v34)); - running = vorrq_u8(running, vceqq_u8(word, v92)); - running = vorrq_u8(running, vcltq_u8(word, vdupq_n_u8(32))); - } - if (i < view.size()) { - uint8x16_t word = - vld1q_u8((const uint8_t *)view.data() + view.length() - 16); - running = vorrq_u8(running, vceqq_u8(word, v34)); - running = vorrq_u8(running, vceqq_u8(word, v92)); - running = vorrq_u8(running, vcltq_u8(word, vdupq_n_u8(32))); - } - return vmaxvq_u32(vreinterpretq_u32_u8(running)) != 0; -} -#elif SIMDJSON_EXPERIMENTAL_HAS_SSE2 -simdjson_inline bool fast_needs_escaping(std::string_view view) { - if (view.size() < 16) { - return simple_needs_escaping(view); - } - size_t i = 0; - __m128i running = _mm_setzero_si128(); - for (; i + 15 < view.size(); i += 16) { - - __m128i word = - _mm_loadu_si128(reinterpret_cast<const __m128i *>(view.data() + i)); - running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(34))); - running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(92))); - running = _mm_or_si128( - running, _mm_cmpeq_epi8(_mm_subs_epu8(word, _mm_set1_epi8(31)), - _mm_setzero_si128())); - } - if (i < view.size()) { - __m128i word = _mm_loadu_si128( - reinterpret_cast<const __m128i *>(view.data() + view.length() - 16)); - running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(34))); - running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(92))); - running = _mm_or_si128( - running, _mm_cmpeq_epi8(_mm_subs_epu8(word, _mm_set1_epi8(31)), - _mm_setzero_si128())); - } - return _mm_movemask_epi8(running) != 0; -} -#else -simdjson_inline bool fast_needs_escaping(std::string_view view) { - return simple_needs_escaping(view); -} -#endif - -SIMDJSON_CONSTEXPR_LAMBDA inline size_t -find_next_json_quotable_character(const std::string_view view, - size_t location) noexcept { - - for (auto pos = view.begin() + location; pos != view.end(); ++pos) { - if (json_quotable_character[static_cast<uint8_t>(*pos)]) { - return pos - view.begin(); - } - } - return size_t(view.size()); -} - -SIMDJSON_CONSTEXPR_LAMBDA static std::string_view control_chars[] = { - "\\u0000", "\\u0001", "\\u0002", "\\u0003", "\\u0004", "\\u0005", "\\u0006", - "\\u0007", "\\b", "\\t", "\\n", "\\u000b", "\\f", "\\r", - "\\u000e", "\\u000f", "\\u0010", "\\u0011", "\\u0012", "\\u0013", "\\u0014", - "\\u0015", "\\u0016", "\\u0017", "\\u0018", "\\u0019", "\\u001a", "\\u001b", - "\\u001c", "\\u001d", "\\u001e", "\\u001f"}; - -// All Unicode characters may be placed within the quotation marks, except for -// the characters that MUST be escaped: quotation mark, reverse solidus, and the -// control characters (U+0000 through U+001F). There are two-character sequence -// escape representations of some popular characters: -// \", \\, \b, \f, \n, \r, \t. -SIMDJSON_CONSTEXPR_LAMBDA void escape_json_char(char c, char *&out) { - if (c == '"') { - memcpy(out, "\\\"", 2); - out += 2; - } else if (c == '\\') { - memcpy(out, "\\\\", 2); - out += 2; - } else { - std::string_view v = control_chars[uint8_t(c)]; - memcpy(out, v.data(), v.size()); - out += v.size(); - } -} - -inline size_t write_string_escaped(const std::string_view input, char *out) { - size_t mysize = input.size(); - if (!fast_needs_escaping(input)) { // fast path! - memcpy(out, input.data(), input.size()); - return input.size(); - } - const char *const initout = out; - size_t location = find_next_json_quotable_character(input, 0); - memcpy(out, input.data(), location); - out += location; - escape_json_char(input[location], out); - location += 1; - while (location < mysize) { - size_t newlocation = find_next_json_quotable_character(input, location); - memcpy(out, input.data() + location, newlocation - location); - out += newlocation - location; - location = newlocation; - if (location == mysize) { - break; - } - escape_json_char(input[location], out); - location += 1; - } - return out - initout; -} - -simdjson_inline string_builder::string_builder(size_t initial_capacity) - : buffer(new(std::nothrow) char[initial_capacity]), position(0), - capacity(buffer.get() != nullptr ? initial_capacity : 0), - is_valid(buffer.get() != nullptr) {} - -simdjson_inline bool string_builder::capacity_check(size_t upcoming_bytes) { - // We use the convention that when is_valid is false, then the capacity and - // the position are 0. - // Most of the time, this function will return true. - if (simdjson_likely(upcoming_bytes <= capacity - position)) { - return true; - } - // check for overflow, most of the time there is no overflow - if (simdjson_likely(position + upcoming_bytes < position)) { - return false; - } - // We will rarely get here. - grow_buffer((std::max)(capacity * 2, position + upcoming_bytes)); - // If the buffer allocation failed, we set is_valid to false. - return is_valid; -} - -simdjson_inline void string_builder::grow_buffer(size_t desired_capacity) { - if (!is_valid) { - return; - } - std::unique_ptr<char[]> new_buffer(new (std::nothrow) char[desired_capacity]); - if (new_buffer.get() == nullptr) { - set_valid(false); - return; - } - std::memcpy(new_buffer.get(), buffer.get(), position); - buffer.swap(new_buffer); - capacity = desired_capacity; -} - -simdjson_inline void string_builder::set_valid(bool valid) noexcept { - if (!valid) { - is_valid = false; - capacity = 0; - position = 0; - buffer.reset(); - } else { - is_valid = true; - } -} - -simdjson_inline size_t string_builder::size() const noexcept { - return position; -} - -simdjson_inline void string_builder::append(char c) noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = c; - } -} - -simdjson_inline void string_builder::append_null() noexcept { - constexpr char null_literal[] = "null"; - constexpr size_t null_len = sizeof(null_literal) - 1; - if (capacity_check(null_len)) { - std::memcpy(buffer.get() + position, null_literal, null_len); - position += null_len; - } -} - -simdjson_inline void string_builder::clear() noexcept { - position = 0; - // if it was invalid, we should try to repair it - if (!is_valid) { - capacity = 0; - buffer.reset(); - is_valid = true; - } -} - -namespace internal { - -template <typename number_type, typename = typename std::enable_if< - std::is_unsigned<number_type>::value>::type> -simdjson_really_inline int int_log2(number_type x) { - return 63 - leading_zeroes(uint64_t(x) | 1); -} - -simdjson_really_inline int fast_digit_count_32(uint32_t x) { - static uint64_t table[] = { - 4294967296, 8589934582, 8589934582, 8589934582, 12884901788, - 12884901788, 12884901788, 17179868184, 17179868184, 17179868184, - 21474826480, 21474826480, 21474826480, 21474826480, 25769703776, - 25769703776, 25769703776, 30063771072, 30063771072, 30063771072, - 34349738368, 34349738368, 34349738368, 34349738368, 38554705664, - 38554705664, 38554705664, 41949672960, 41949672960, 41949672960, - 42949672960, 42949672960}; - return uint32_t((x + table[int_log2(x)]) >> 32); -} - -simdjson_really_inline int fast_digit_count_64(uint64_t x) { - static uint64_t table[] = {9, - 99, - 999, - 9999, - 99999, - 999999, - 9999999, - 99999999, - 999999999, - 9999999999, - 99999999999, - 999999999999, - 9999999999999, - 99999999999999, - 999999999999999ULL, - 9999999999999999ULL, - 99999999999999999ULL, - 999999999999999999ULL, - 9999999999999999999ULL}; - int y = (19 * int_log2(x) >> 6); - y += x > table[y]; - return y + 1; -} - -template <typename number_type, typename = typename std::enable_if< - std::is_unsigned<number_type>::value>::type> -simdjson_really_inline size_t digit_count(number_type v) noexcept { - static_assert(sizeof(number_type) == 8 || sizeof(number_type) == 4 || - sizeof(number_type) == 2 || sizeof(number_type) == 1, - "We only support 8-bit, 16-bit, 32-bit and 64-bit numbers"); - SIMDJSON_IF_CONSTEXPR(sizeof(number_type) <= 4) { - return fast_digit_count_32(static_cast<uint32_t>(v)); - } - else { - return fast_digit_count_64(static_cast<uint64_t>(v)); - } -} -static const char decimal_table[200] = { - 0x30, 0x30, 0x30, 0x31, 0x30, 0x32, 0x30, 0x33, 0x30, 0x34, 0x30, 0x35, - 0x30, 0x36, 0x30, 0x37, 0x30, 0x38, 0x30, 0x39, 0x31, 0x30, 0x31, 0x31, - 0x31, 0x32, 0x31, 0x33, 0x31, 0x34, 0x31, 0x35, 0x31, 0x36, 0x31, 0x37, - 0x31, 0x38, 0x31, 0x39, 0x32, 0x30, 0x32, 0x31, 0x32, 0x32, 0x32, 0x33, - 0x32, 0x34, 0x32, 0x35, 0x32, 0x36, 0x32, 0x37, 0x32, 0x38, 0x32, 0x39, - 0x33, 0x30, 0x33, 0x31, 0x33, 0x32, 0x33, 0x33, 0x33, 0x34, 0x33, 0x35, - 0x33, 0x36, 0x33, 0x37, 0x33, 0x38, 0x33, 0x39, 0x34, 0x30, 0x34, 0x31, - 0x34, 0x32, 0x34, 0x33, 0x34, 0x34, 0x34, 0x35, 0x34, 0x36, 0x34, 0x37, - 0x34, 0x38, 0x34, 0x39, 0x35, 0x30, 0x35, 0x31, 0x35, 0x32, 0x35, 0x33, - 0x35, 0x34, 0x35, 0x35, 0x35, 0x36, 0x35, 0x37, 0x35, 0x38, 0x35, 0x39, - 0x36, 0x30, 0x36, 0x31, 0x36, 0x32, 0x36, 0x33, 0x36, 0x34, 0x36, 0x35, - 0x36, 0x36, 0x36, 0x37, 0x36, 0x38, 0x36, 0x39, 0x37, 0x30, 0x37, 0x31, - 0x37, 0x32, 0x37, 0x33, 0x37, 0x34, 0x37, 0x35, 0x37, 0x36, 0x37, 0x37, - 0x37, 0x38, 0x37, 0x39, 0x38, 0x30, 0x38, 0x31, 0x38, 0x32, 0x38, 0x33, - 0x38, 0x34, 0x38, 0x35, 0x38, 0x36, 0x38, 0x37, 0x38, 0x38, 0x38, 0x39, - 0x39, 0x30, 0x39, 0x31, 0x39, 0x32, 0x39, 0x33, 0x39, 0x34, 0x39, 0x35, - 0x39, 0x36, 0x39, 0x37, 0x39, 0x38, 0x39, 0x39, -}; -} // namespace internal - -template <typename number_type, typename> -simdjson_inline void string_builder::append(number_type v) noexcept { - static_assert(std::is_same<number_type, bool>::value || - std::is_integral<number_type>::value || - std::is_floating_point<number_type>::value, - "Unsupported number type"); - // If C++17 is available, we can 'if constexpr' here. - SIMDJSON_IF_CONSTEXPR(std::is_same<number_type, bool>::value) { - if (v) { - constexpr char true_literal[] = "true"; - constexpr size_t true_len = sizeof(true_literal) - 1; - if (capacity_check(true_len)) { - std::memcpy(buffer.get() + position, true_literal, true_len); - position += true_len; - } - } else { - constexpr char false_literal[] = "false"; - constexpr size_t false_len = sizeof(false_literal) - 1; - if (capacity_check(false_len)) { - std::memcpy(buffer.get() + position, false_literal, false_len); - position += false_len; - } - } - } - else SIMDJSON_IF_CONSTEXPR(std::is_unsigned<number_type>::value) { - constexpr size_t max_number_size = 20; - if (capacity_check(max_number_size)) { - using unsigned_type = typename std::make_unsigned<number_type>::type; - unsigned_type pv = static_cast<unsigned_type>(v); - size_t dc = internal::digit_count(pv); - char *write_pointer = buffer.get() + position + dc - 1; - while (pv >= 100) { - memcpy(write_pointer - 1, &internal::decimal_table[(pv % 100) * 2], 2); - write_pointer -= 2; - pv /= 100; - } - if (pv >= 10) { - *write_pointer-- = char('0' + (pv % 10)); - pv /= 10; - } - *write_pointer = char('0' + pv); - position += dc; - } - } - else SIMDJSON_IF_CONSTEXPR(std::is_integral<number_type>::value) { - constexpr size_t max_number_size = 20; - if (capacity_check(max_number_size)) { - using unsigned_type = typename std::make_unsigned<number_type>::type; - bool negative = v < 0; - unsigned_type pv = static_cast<unsigned_type>(v); - if (negative) { - pv = 0 - pv; // the 0 is for Microsoft - } - size_t dc = internal::digit_count(pv); - // by always writing the minus sign, we avoid the branch. - buffer.get()[position] = '-'; - position += negative ? 1 : 0; - char *write_pointer = buffer.get() + position + dc - 1; - while (pv >= 100) { - memcpy(write_pointer - 1, &internal::decimal_table[(pv % 100) * 2], 2); - write_pointer -= 2; - pv /= 100; - } - if (pv >= 10) { - *write_pointer-- = char('0' + (pv % 10)); - pv /= 10; - } - *write_pointer = char('0' + pv); - position += dc; - } - } - else SIMDJSON_IF_CONSTEXPR(std::is_floating_point<number_type>::value) { - constexpr size_t max_number_size = 24; - if (capacity_check(max_number_size)) { - // We could specialize for float. - char *end = simdjson::internal::to_chars(buffer.get() + position, nullptr, - double(v)); - position = end - buffer.get(); - } - } -} - -simdjson_inline void -string_builder::escape_and_append(std::string_view input) noexcept { - // escaping might turn a control character into \x00xx so 6 characters. - if (capacity_check(6 * input.size())) { - position += write_string_escaped(input, buffer.get() + position); - } -} - -simdjson_inline void -string_builder::escape_and_append_with_quotes(std::string_view input) noexcept { - // escaping might turn a control character into \x00xx so 6 characters. - if (capacity_check(2 + 6 * input.size())) { - buffer.get()[position++] = '"'; - position += write_string_escaped(input, buffer.get() + position); - buffer.get()[position++] = '"'; - } -} - -simdjson_inline void -string_builder::escape_and_append_with_quotes(char input) noexcept { - // escaping might turn a control character into \x00xx so 6 characters. - if (capacity_check(2 + 6 * 1)) { - buffer.get()[position++] = '"'; - std::string_view cinput(&input, 1); - position += write_string_escaped(cinput, buffer.get() + position); - buffer.get()[position++] = '"'; - } -} - -simdjson_inline void -string_builder::escape_and_append_with_quotes(const char *input) noexcept { - std::string_view cinput(input); - escape_and_append_with_quotes(cinput); -} -#if SIMDJSON_SUPPORTS_CONCEPTS -template <constevalutil::fixed_string key> -simdjson_inline void string_builder::escape_and_append_with_quotes() noexcept { - escape_and_append_with_quotes(constevalutil::string_constant<key>::value); -} -#endif - -simdjson_inline void string_builder::append_raw(const char *c) noexcept { - size_t len = std::strlen(c); - append_raw(c, len); -} - -simdjson_inline void -string_builder::append_raw(std::string_view input) noexcept { - if (capacity_check(input.size())) { - std::memcpy(buffer.get() + position, input.data(), input.size()); - position += input.size(); - } -} - -simdjson_inline void string_builder::append_raw(const char *str, - size_t len) noexcept { - if (capacity_check(len)) { - std::memcpy(buffer.get() + position, str, len); - position += len; - } -} -#if SIMDJSON_SUPPORTS_CONCEPTS -// Support for optional types (std::optional, etc.) -template <concepts::optional_type T> - requires(!require_custom_serialization<T>) -simdjson_inline void string_builder::append(const T &opt) { - if (opt) { - append(*opt); - } else { - append_null(); - } -} - -template <typename T> - requires(require_custom_serialization<T>) -simdjson_inline void string_builder::append(T &&val) { - serialize(*this, std::forward<T>(val)); -} - -template <typename T> - requires(std::is_convertible<T, std::string_view>::value || - std::is_same<T, const char *>::value) -simdjson_inline void string_builder::append(const T &value) { - escape_and_append_with_quotes(value); -} -#endif - -#if SIMDJSON_SUPPORTS_RANGES && SIMDJSON_SUPPORTS_CONCEPTS -// Support for range-based appending (std::ranges::view, etc.) -template <std::ranges::range R> - requires(!std::is_convertible<R, std::string_view>::value && !require_custom_serialization<R>) -simdjson_inline void string_builder::append(const R &range) noexcept { - auto it = std::ranges::begin(range); - auto end = std::ranges::end(range); - if constexpr (concepts::is_pair<std::ranges::range_value_t<R>>) { - start_object(); - - if (it == end) { - end_object(); - return; // Handle empty range - } - // Append first item without leading comma - append_key_value(it->first, it->second); - ++it; - - // Append remaining items with preceding commas - for (; it != end; ++it) { - append_comma(); - append_key_value(it->first, it->second); - } - end_object(); - } else { - start_array(); - if (it == end) { - end_array(); - return; // Handle empty range - } - - // Append first item without leading comma - append(*it); - ++it; - - // Append remaining items with preceding commas - for (; it != end; ++it) { - append_comma(); - append(*it); - } - end_array(); - } -} - -#endif - -#if SIMDJSON_EXCEPTIONS -simdjson_inline string_builder::operator std::string() const noexcept(false) { - return std::string(operator std::string_view()); -} - -simdjson_inline string_builder::operator std::string_view() const - noexcept(false) simdjson_lifetime_bound { - return view(); -} -#endif - -simdjson_inline simdjson_result<std::string_view> -string_builder::view() const noexcept { - if (!is_valid) { - return simdjson::OUT_OF_CAPACITY; - } - return std::string_view(buffer.get(), position); -} - -simdjson_inline simdjson_result<const char *> string_builder::c_str() noexcept { - if (capacity_check(1)) { - buffer.get()[position] = '\0'; - return buffer.get(); - } - return simdjson::OUT_OF_CAPACITY; -} - -simdjson_inline bool string_builder::validate_unicode() const noexcept { - return simdjson::validate_utf8(buffer.get(), position); -} - -simdjson_inline void string_builder::start_object() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = '{'; - } -} - -simdjson_inline void string_builder::end_object() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = '}'; - } -} - -simdjson_inline void string_builder::start_array() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = '['; - } -} - -simdjson_inline void string_builder::end_array() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = ']'; - } -} - -simdjson_inline void string_builder::append_comma() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = ','; - } -} - -simdjson_inline void string_builder::append_colon() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = ':'; - } -} - -template <typename key_type, typename value_type> -simdjson_inline void -string_builder::append_key_value(key_type key, value_type value) noexcept { - static_assert(std::is_same<key_type, const char *>::value || - std::is_convertible<key_type, std::string_view>::value, - "Unsupported key type"); - escape_and_append_with_quotes(key); - append_colon(); - SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, std::nullptr_t>::value) { - append_null(); - } - else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, char>::value) { - escape_and_append_with_quotes(value); - } - else SIMDJSON_IF_CONSTEXPR( - std::is_convertible<value_type, std::string_view>::value) { - escape_and_append_with_quotes(value); - } - else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, const char *>::value) { - escape_and_append_with_quotes(value); - } - else { - append(value); - } -} - -#if SIMDJSON_SUPPORTS_CONCEPTS -template <constevalutil::fixed_string key, typename value_type> -simdjson_inline void -string_builder::append_key_value(value_type value) noexcept { - escape_and_append_with_quotes<key>(); - append_colon(); - SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, std::nullptr_t>::value) { - append_null(); - } - else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, char>::value) { - escape_and_append_with_quotes(value); - } - else SIMDJSON_IF_CONSTEXPR( - std::is_convertible<value_type, std::string_view>::value) { - escape_and_append_with_quotes(value); - } - else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, const char *>::value) { - escape_and_append_with_quotes(value); - } - else { - append(value); - } -} -#endif - -} // namespace builder -} // namespace icelake -} // namespace simdjson - -#endif // SIMDJSON_GENERIC_STRING_BUILDER_INL_H -/* end file simdjson/generic/ondemand/json_string_builder-inl.h for icelake */ -/* including simdjson/generic/ondemand/json_builder.h for icelake: #include "simdjson/generic/ondemand/json_builder.h" */ -/* begin file simdjson/generic/ondemand/json_builder.h for icelake */ -/** - * This file is part of the builder API. It is temporarily in the ondemand directory - * but we will move it to a builder directory later. - */ -#ifndef SIMDJSON_GENERIC_BUILDER_H +/* end file simdjson/generic/ondemand/value_iterator-inl.h for ppc64 */ +/* including simdjson/generic/ondemand/serialization-inl.h for ppc64: #include "simdjson/generic/ondemand/serialization-inl.h" */ +/* begin file simdjson/generic/ondemand/serialization-inl.h for ppc64 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_H */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_string_builder.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/concepts.h" */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document-inl.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/serialization.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */ +/* amalgamation skipped (editor-only): #if SIMDJSON_STATIC_REFLECTION */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_builder.h" */ +/* amalgamation skipped (editor-only): #endif */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -#if SIMDJSON_STATIC_REFLECTION - -#include <charconv> -#include <cstring> -#include <meta> -#include <memory> -#include <optional> -#include <string_view> -#include <type_traits> -#include <utility> -// #include <static_reflection> // for std::define_static_string - header not available yet namespace simdjson { -namespace icelake { -namespace builder { - -template <class T> - requires(concepts::container_but_not_string<T> && !require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &t) { - auto it = t.begin(); - auto end = t.end(); - if (it == end) { - b.append_raw("[]"); - return; - } - b.append('['); - atom(b, *it); - ++it; - for (; it != end; ++it) { - b.append(','); - atom(b, *it); - } - b.append(']'); -} - -template <class T> - requires(std::is_same_v<T, std::string> || - std::is_same_v<T, std::string_view> || - std::is_same_v<T, const char *> || - std::is_same_v<T, char>) -constexpr void atom(string_builder &b, const T &t) { - b.escape_and_append_with_quotes(t); -} - -template <concepts::string_view_keyed_map T> - requires(!require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &m) { - if (m.empty()) { - b.append_raw("{}"); - return; - } - b.append('{'); - bool first = true; - for (const auto& [key, value] : m) { - if (!first) { - b.append(','); - } - first = false; - // Keys must be convertible to string_view per the concept - b.escape_and_append_with_quotes(key); - b.append(':'); - atom(b, value); - } - b.append('}'); -} - - -template<typename number_type, - typename = typename std::enable_if<std::is_arithmetic<number_type>::value && !std::is_same_v<number_type, char>>::type> -constexpr void atom(string_builder &b, const number_type t) { - b.append(t); -} - -template <class T> - requires(std::is_class_v<T> && !concepts::container_but_not_string<T> && - !concepts::string_view_keyed_map<T> && - !concepts::optional_type<T> && - !concepts::smart_pointer<T> && - !concepts::appendable_containers<T> && - !std::is_same_v<T, std::string> && - !std::is_same_v<T, std::string_view> && - !std::is_same_v<T, const char*> && - !std::is_same_v<T, char> && !require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &t) { - int i = 0; - b.append('{'); - template for (constexpr auto dm : std::define_static_array(std::meta::nonstatic_data_members_of(^^T, std::meta::access_context::unchecked()))) { - if (i != 0) - b.append(','); - constexpr auto key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(dm))); - b.append_raw(key); - b.append(':'); - atom(b, t.[:dm:]); - i++; - }; - b.append('}'); -} - -// Support for optional types (std::optional, etc.) -template <concepts::optional_type T> - requires(!require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &opt) { - if (opt) { - atom(b, opt.value()); - } else { - b.append_raw("null"); - } -} - -// Support for smart pointers (std::unique_ptr, std::shared_ptr, etc.) -template <concepts::smart_pointer T> - requires(!require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &ptr) { - if (ptr) { - atom(b, *ptr); - } else { - b.append_raw("null"); - } -} - -// Support for enums - serialize as string representation using expand approach from P2996R12 -template <typename T> - requires(std::is_enum_v<T> && !require_custom_serialization<T>) -void atom(string_builder &b, const T &e) { -#if SIMDJSON_STATIC_REFLECTION - constexpr auto enumerators = std::define_static_array(std::meta::enumerators_of(^^T)); - template for (constexpr auto enum_val : enumerators) { - constexpr auto enum_str = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(enum_val))); - if (e == [:enum_val:]) { - b.append_raw(enum_str); - return; - } - }; - // Fallback to integer if enum value not found - atom(b, static_cast<std::underlying_type_t<T>>(e)); -#else - // Fallback: serialize as integer if reflection not available - atom(b, static_cast<std::underlying_type_t<T>>(e)); -#endif -} - -// Support for appendable containers that don't have operator[] (sets, etc.) -template <concepts::appendable_containers T> - requires(!concepts::container_but_not_string<T> && !concepts::string_view_keyed_map<T> && - !concepts::optional_type<T> && !concepts::smart_pointer<T> && - !std::is_same_v<T, std::string> && - !std::is_same_v<T, std::string_view> && !std::is_same_v<T, const char*> && !require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &container) { - if (container.empty()) { - b.append_raw("[]"); - return; - } - b.append('['); - bool first = true; - for (const auto& item : container) { - if (!first) { - b.append(','); - } - first = false; - atom(b, item); - } - b.append(']'); -} - -// append functions that delegate to atom functions for primitive types -template <class T> - requires(std::is_arithmetic_v<T> && !std::is_same_v<T, char>) -void append(string_builder &b, const T &t) { - atom(b, t); -} - -template <class T> - requires(std::is_same_v<T, std::string> || - std::is_same_v<T, std::string_view> || - std::is_same_v<T, const char *> || - std::is_same_v<T, char>) -void append(string_builder &b, const T &t) { - atom(b, t); -} - -template <concepts::optional_type T> - requires(!require_custom_serialization<T>) -void append(string_builder &b, const T &t) { - atom(b, t); -} -template <concepts::smart_pointer T> - requires(!require_custom_serialization<T>) -void append(string_builder &b, const T &t) { - atom(b, t); +inline std::string_view trim(const std::string_view str) noexcept { + // We can almost surely do better by rolling our own find_first_not_of function. + size_t first = str.find_first_not_of(" \t\n\r"); + // If we have the empty string (just white space), then no trimming is possible, and + // we return the empty string_view. + if (std::string_view::npos == first) { return std::string_view(); } + size_t last = str.find_last_not_of(" \t\n\r"); + return str.substr(first, (last - first + 1)); } -template <concepts::appendable_containers T> - requires(!concepts::container_but_not_string<T> && !concepts::string_view_keyed_map<T> && - !concepts::optional_type<T> && !concepts::smart_pointer<T> && - !std::is_same_v<T, std::string> && - !std::is_same_v<T, std::string_view> && !std::is_same_v<T, const char*> && !require_custom_serialization<T>) -void append(string_builder &b, const T &t) { - atom(b, t); -} -template <concepts::string_view_keyed_map T> - requires(!require_custom_serialization<T>) -void append(string_builder &b, const T &t) { - atom(b, t); +inline simdjson_result<std::string_view> to_json_string(ppc64::ondemand::document& x) noexcept { + std::string_view v; + auto error = x.raw_json().get(v); + if(error) {return error; } + return trim(v); } -// works for struct -template <class Z> - requires(std::is_class_v<Z> && !concepts::container_but_not_string<Z> && - !concepts::string_view_keyed_map<Z> && - !concepts::optional_type<Z> && - !concepts::smart_pointer<Z> && - !concepts::appendable_containers<Z> && - !std::is_same_v<Z, std::string> && - !std::is_same_v<Z, std::string_view> && - !std::is_same_v<Z, const char*> && - !std::is_same_v<Z, char> && !require_custom_serialization<Z>) -void append(string_builder &b, const Z &z) { - int i = 0; - b.append('{'); - template for (constexpr auto dm : std::define_static_array(std::meta::nonstatic_data_members_of(^^Z, std::meta::access_context::unchecked()))) { - if (i != 0) - b.append(','); - constexpr auto key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(dm))); - b.append_raw(key); - b.append(':'); - atom(b, z.[:dm:]); - i++; - }; - b.append('}'); +inline simdjson_result<std::string_view> to_json_string(ppc64::ondemand::document_reference& x) noexcept { + std::string_view v; + auto error = x.raw_json().get(v); + if(error) {return error; } + return trim(v); } -// works for container that have begin() and end() iterators -template <class Z> - requires(concepts::container_but_not_string<Z> && !require_custom_serialization<Z>) -void append(string_builder &b, const Z &z) { - auto it = z.begin(); - auto end = z.end(); - if (it == end) { - b.append_raw("[]"); - return; - } - b.append('['); - atom(b, *it); - ++it; - for (; it != end; ++it) { - b.append(','); - atom(b, *it); +inline simdjson_result<std::string_view> to_json_string(ppc64::ondemand::value& x) noexcept { + /** + * If we somehow receive a value that has already been consumed, + * then the following code could be in trouble. E.g., we create + * an array as needed, but if an array was already created, then + * it could be bad. + */ + using namespace ppc64::ondemand; + ppc64::ondemand::json_type t; + auto error = x.type().get(t); + if(error != SUCCESS) { return error; } + switch (t) + { + case json_type::array: + { + ppc64::ondemand::array array; + error = x.get_array().get(array); + if(error) { return error; } + return to_json_string(array); + } + case json_type::object: + { + ppc64::ondemand::object object; + error = x.get_object().get(object); + if(error) { return error; } + return to_json_string(object); + } + default: + return trim(x.raw_json_token()); } - b.append(']'); } -template <class Z> - requires (require_custom_serialization<Z>) -void append(string_builder &b, const Z &z) { - b.append(z); +inline simdjson_result<std::string_view> to_json_string(ppc64::ondemand::object& x) noexcept { + std::string_view v; + auto error = x.raw_json().get(v); + if(error) {return error; } + return trim(v); } - -template <class Z> -simdjson_warn_unused simdjson_result<std::string> to_json_string(const Z &z, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { - string_builder b(initial_capacity); - append(b, z); - std::string_view s; - if(auto e = b.view().get(s); e) { return e; } - return std::string(s); +inline simdjson_result<std::string_view> to_json_string(ppc64::ondemand::array& x) noexcept { + std::string_view v; + auto error = x.raw_json().get(v); + if(error) {return error; } + return trim(v); } -template <class Z> -simdjson_warn_unused simdjson_error to_json(const Z &z, std::string &s, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { - string_builder b(initial_capacity); - append(b, z); - std::string_view view; - if(auto e = b.view().get(view); e) { return e; } - s.assign(view); - return SUCCESS; +inline simdjson_result<std::string_view> to_json_string(simdjson_result<ppc64::ondemand::document> x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } -template <class Z> -string_builder& operator<<(string_builder& b, const Z& z) { - append(b, z); - return b; +inline simdjson_result<std::string_view> to_json_string(simdjson_result<ppc64::ondemand::document_reference> x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } -// extract_from: Serialize only specific fields from a struct to JSON -template<constevalutil::fixed_string... FieldNames, typename T> - requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) -void extract_from(string_builder &b, const T &obj) { - // Helper to check if a field name matches any of the requested fields - auto should_extract = [](std::string_view field_name) constexpr -> bool { - return ((FieldNames.view() == field_name) || ...); - }; - - b.append('{'); - bool first = true; - - // Iterate through all members of T using reflection - template for (constexpr auto mem : std::define_static_array( - std::meta::nonstatic_data_members_of(^^T, std::meta::access_context::unchecked()))) { - - if constexpr (std::meta::is_public(mem)) { - constexpr std::string_view key = std::define_static_string(std::meta::identifier_of(mem)); +inline simdjson_result<std::string_view> to_json_string(simdjson_result<ppc64::ondemand::value> x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); +} - // Only serialize this field if it's in our list of requested fields - if constexpr (should_extract(key)) { - if (!first) { - b.append(','); - } - first = false; +inline simdjson_result<std::string_view> to_json_string(simdjson_result<ppc64::ondemand::object> x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); +} - // Serialize the key - constexpr auto quoted_key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(mem))); - b.append_raw(quoted_key); - b.append(':'); +inline simdjson_result<std::string_view> to_json_string(simdjson_result<ppc64::ondemand::array> x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); +} +} // namespace simdjson - // Serialize the value - atom(b, obj.[:mem:]); - } - } - }; +namespace simdjson { namespace ppc64 { namespace ondemand { - b.append('}'); +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::ppc64::ondemand::value x) { + std::string_view v; + auto error = simdjson::to_json_string(x).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + throw simdjson::simdjson_error(error); + } } - -template<constevalutil::fixed_string... FieldNames, typename T> - requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) -simdjson_warn_unused simdjson_result<std::string> extract_from(const T &obj, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { - string_builder b(initial_capacity); - extract_from<FieldNames...>(b, obj); - std::string_view s; - if(auto e = b.view().get(s); e) { return e; } - return std::string(s); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::ppc64::ondemand::value> x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); +} +#else +inline std::ostream& operator<<(std::ostream& out, simdjson::ppc64::ondemand::value x) { + std::string_view v; + auto error = simdjson::to_json_string(x).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + return (out << error); + } } +#endif -} // namespace builder -} // namespace icelake -// Alias the function template to 'to' in the global namespace -template <class Z> -simdjson_warn_unused simdjson_result<std::string> to_json(const Z &z, size_t initial_capacity = icelake::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { - icelake::builder::string_builder b(initial_capacity); - icelake::builder::append(b, z); - std::string_view s; - if(auto e = b.view().get(s); e) { return e; } - return std::string(s); +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::ppc64::ondemand::array value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + throw simdjson::simdjson_error(error); + } } -template <class Z> -simdjson_warn_unused simdjson_error to_json(const Z &z, std::string &s, size_t initial_capacity = icelake::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { - icelake::builder::string_builder b(initial_capacity); - icelake::builder::append(b, z); - std::string_view view; - if(auto e = b.view().get(view); e) { return e; } - s.assign(view); - return SUCCESS; +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::ppc64::ondemand::array> x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); } -// Global namespace function for extract_from -template<constevalutil::fixed_string... FieldNames, typename T> - requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) -simdjson_warn_unused simdjson_result<std::string> extract_from(const T &obj, size_t initial_capacity = icelake::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { - icelake::builder::string_builder b(initial_capacity); - icelake::builder::extract_from<FieldNames...>(b, obj); - std::string_view s; - if(auto e = b.view().get(s); e) { return e; } - return std::string(s); +#else +inline std::ostream& operator<<(std::ostream& out, simdjson::ppc64::ondemand::array value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + return (out << error); + } } +#endif -} // namespace simdjson - -#endif // SIMDJSON_STATIC_REFLECTION +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::ppc64::ondemand::document& value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + throw simdjson::simdjson_error(error); + } +} +inline std::ostream& operator<<(std::ostream& out, simdjson::ppc64::ondemand::document_reference& value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + throw simdjson::simdjson_error(error); + } +} +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::ppc64::ondemand::document>&& x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); +} +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::ppc64::ondemand::document_reference>&& x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); +} +#else +inline std::ostream& operator<<(std::ostream& out, simdjson::ppc64::ondemand::document& value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + return (out << error); + } +} +#endif +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::ppc64::ondemand::object value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + throw simdjson::simdjson_error(error); + } +} +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::ppc64::ondemand::object> x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); +} +#else +inline std::ostream& operator<<(std::ostream& out, simdjson::ppc64::ondemand::object value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + return (out << error); + } +} #endif -/* end file simdjson/generic/ondemand/json_builder.h for icelake */ +}}} // namespace simdjson::ppc64::ondemand + +#endif // SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H +/* end file simdjson/generic/ondemand/serialization-inl.h for ppc64 */ // JSON path accessor (compile-time) - must be after inline definitions -/* including simdjson/generic/ondemand/compile_time_accessors.h for icelake: #include "simdjson/generic/ondemand/compile_time_accessors.h" */ -/* begin file simdjson/generic/ondemand/compile_time_accessors.h for icelake */ +/* including simdjson/generic/ondemand/compile_time_accessors.h for ppc64: #include "simdjson/generic/ondemand/compile_time_accessors.h" */ +/* begin file simdjson/generic/ondemand/compile_time_accessors.h for ppc64 */ /** * Compile-time JSON Path and JSON Pointer accessors using C++26 reflection (P2996) * @@ -92000,7 +128343,7 @@ simdjson_warn_unused simdjson_result<std::string> extract_from(const T &obj, siz #include <array> namespace simdjson { -namespace icelake { +namespace ppc64 { namespace ondemand { /*** * JSONPath implementation for compile-time access @@ -92011,7 +128354,7 @@ namespace json_path { // Note: value type must be fully defined before this header is included // This is ensured by including this in amalgamated.h after value-inl.h -using ::simdjson::icelake::ondemand::value; +using ::simdjson::ppc64::ondemand::value; // Path step types enum class step_type { @@ -92145,7 +128488,7 @@ struct json_path_parser { // Compile-time path accessor generator template<typename T, constevalutil::fixed_string Path> struct path_accessor { - using value = ::simdjson::icelake::ondemand::value; + using value = ::simdjson::ppc64::ondemand::value; static constexpr auto parser = json_path_parser<Path>(); static constexpr std::size_t num_steps = parser.count_steps(); @@ -92623,14 +128966,14 @@ struct path_accessor { // Compile-time path accessor with validation template<typename T, constevalutil::fixed_string Path, typename DocOrValue> -inline simdjson_result<::simdjson::icelake::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { +inline simdjson_result<::simdjson::ppc64::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { using accessor = path_accessor<T, Path>; return accessor::access(doc_or_val); } // Overload without type parameter (no validation) template<constevalutil::fixed_string Path, typename DocOrValue> -inline simdjson_result<::simdjson::icelake::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { +inline simdjson_result<::simdjson::ppc64::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { using accessor = path_accessor<void, Path>; return accessor::access(doc_or_val); } @@ -92861,121 +129204,135 @@ struct pointer_accessor { // Compile-time JSON Pointer accessor with validation template<typename T, constevalutil::fixed_string Pointer, typename DocOrValue> -inline simdjson_result<::simdjson::icelake::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { +inline simdjson_result<::simdjson::ppc64::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { using accessor = pointer_accessor<T, Pointer>; return accessor::access(doc_or_val); } // Overload without type parameter (no validation) template<constevalutil::fixed_string Pointer, typename DocOrValue> -inline simdjson_result<::simdjson::icelake::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { +inline simdjson_result<::simdjson::ppc64::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { using accessor = pointer_accessor<void, Pointer>; return accessor::access(doc_or_val); } } // namespace json_path } // namespace ondemand -} // namespace icelake +} // namespace ppc64 } // namespace simdjson #endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION #endif // SIMDJSON_GENERIC_ONDEMAND_COMPILE_TIME_ACCESSORS_H -/* end file simdjson/generic/ondemand/compile_time_accessors.h for icelake */ +/* end file simdjson/generic/ondemand/compile_time_accessors.h for ppc64 */ -/* end file simdjson/generic/ondemand/amalgamated.h for icelake */ -/* including simdjson/icelake/end.h: #include "simdjson/icelake/end.h" */ -/* begin file simdjson/icelake/end.h */ +/* end file simdjson/generic/ondemand/amalgamated.h for ppc64 */ +/* including simdjson/ppc64/end.h: #include "simdjson/ppc64/end.h" */ +/* begin file simdjson/ppc64/end.h */ /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -#if !SIMDJSON_CAN_ALWAYS_RUN_ICELAKE -SIMDJSON_UNTARGET_REGION -#endif - -/* undefining SIMDJSON_IMPLEMENTATION from "icelake" */ +#undef SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT +/* undefining SIMDJSON_IMPLEMENTATION from "ppc64" */ #undef SIMDJSON_IMPLEMENTATION -/* end file simdjson/icelake/end.h */ +/* end file simdjson/ppc64/end.h */ -#endif // SIMDJSON_ICELAKE_ONDEMAND_H -/* end file simdjson/icelake/ondemand.h */ -#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(ppc64) -/* including simdjson/ppc64/ondemand.h: #include "simdjson/ppc64/ondemand.h" */ -/* begin file simdjson/ppc64/ondemand.h */ -#ifndef SIMDJSON_PPC64_ONDEMAND_H -#define SIMDJSON_PPC64_ONDEMAND_H +#endif // SIMDJSON_PPC64_ONDEMAND_H +/* end file simdjson/ppc64/ondemand.h */ +#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(westmere) +/* including simdjson/westmere/ondemand.h: #include "simdjson/westmere/ondemand.h" */ +/* begin file simdjson/westmere/ondemand.h */ +#ifndef SIMDJSON_WESTMERE_ONDEMAND_H +#define SIMDJSON_WESTMERE_ONDEMAND_H -/* including simdjson/ppc64/begin.h: #include "simdjson/ppc64/begin.h" */ -/* begin file simdjson/ppc64/begin.h */ -/* defining SIMDJSON_IMPLEMENTATION to "ppc64" */ -#define SIMDJSON_IMPLEMENTATION ppc64 -/* including simdjson/ppc64/base.h: #include "simdjson/ppc64/base.h" */ -/* begin file simdjson/ppc64/base.h */ -#ifndef SIMDJSON_PPC64_BASE_H -#define SIMDJSON_PPC64_BASE_H +/* including simdjson/westmere/begin.h: #include "simdjson/westmere/begin.h" */ +/* begin file simdjson/westmere/begin.h */ +/* defining SIMDJSON_IMPLEMENTATION to "westmere" */ +#define SIMDJSON_IMPLEMENTATION westmere +/* including simdjson/westmere/base.h: #include "simdjson/westmere/base.h" */ +/* begin file simdjson/westmere/base.h */ +#ifndef SIMDJSON_WESTMERE_BASE_H +#define SIMDJSON_WESTMERE_BASE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ /* amalgamation skipped (editor-only): #include "simdjson/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ +// The constructor may be executed on any host, so we take care not to use SIMDJSON_TARGET_WESTMERE namespace simdjson { /** - * Implementation for ALTIVEC (PPC64). + * Implementation for Westmere (Intel SSE4.2). */ -namespace ppc64 { +namespace westmere { class implementation; namespace { namespace simd { + template <typename T> struct simd8; template <typename T> struct simd8x64; + } // namespace simd } // unnamed namespace -} // namespace ppc64 +} // namespace westmere } // namespace simdjson -#endif // SIMDJSON_PPC64_BASE_H -/* end file simdjson/ppc64/base.h */ -/* including simdjson/ppc64/intrinsics.h: #include "simdjson/ppc64/intrinsics.h" */ -/* begin file simdjson/ppc64/intrinsics.h */ -#ifndef SIMDJSON_PPC64_INTRINSICS_H -#define SIMDJSON_PPC64_INTRINSICS_H +#endif // SIMDJSON_WESTMERE_BASE_H +/* end file simdjson/westmere/base.h */ +/* including simdjson/westmere/intrinsics.h: #include "simdjson/westmere/intrinsics.h" */ +/* begin file simdjson/westmere/intrinsics.h */ +#ifndef SIMDJSON_WESTMERE_INTRINSICS_H +#define SIMDJSON_WESTMERE_INTRINSICS_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -// This should be the correct header whether -// you use visual studio or other compilers. -#include <altivec.h> +#if SIMDJSON_VISUAL_STUDIO +// under clang within visual studio, this will include <x86intrin.h> +#include <intrin.h> // visual studio or clang +#else +#include <x86intrin.h> // elsewhere +#endif // SIMDJSON_VISUAL_STUDIO -// These are defined by altivec.h in GCC toolchain, it is safe to undef them. -#ifdef bool -#undef bool -#endif -#ifdef vector -#undef vector +#if SIMDJSON_CLANG_VISUAL_STUDIO +/** + * You are not supposed, normally, to include these + * headers directly. Instead you should either include intrin.h + * or x86intrin.h. However, when compiling with clang + * under Windows (i.e., when _MSC_VER is set), these headers + * only get included *if* the corresponding features are detected + * from macros: + */ +#include <smmintrin.h> // for _mm_alignr_epi8 +#include <wmmintrin.h> // for _mm_clmulepi64_si128 #endif -static_assert(sizeof(__vector unsigned char) <= simdjson::SIMDJSON_PADDING, "insufficient padding for ppc64"); +static_assert(sizeof(__m128i) <= simdjson::SIMDJSON_PADDING, "insufficient padding for westmere"); -#endif // SIMDJSON_PPC64_INTRINSICS_H -/* end file simdjson/ppc64/intrinsics.h */ -/* including simdjson/ppc64/bitmanipulation.h: #include "simdjson/ppc64/bitmanipulation.h" */ -/* begin file simdjson/ppc64/bitmanipulation.h */ -#ifndef SIMDJSON_PPC64_BITMANIPULATION_H -#define SIMDJSON_PPC64_BITMANIPULATION_H +#endif // SIMDJSON_WESTMERE_INTRINSICS_H +/* end file simdjson/westmere/intrinsics.h */ + +#if !SIMDJSON_CAN_ALWAYS_RUN_WESTMERE +SIMDJSON_TARGET_REGION("sse4.2,pclmul,popcnt") +#endif + +/* including simdjson/westmere/bitmanipulation.h: #include "simdjson/westmere/bitmanipulation.h" */ +/* begin file simdjson/westmere/bitmanipulation.h */ +#ifndef SIMDJSON_WESTMERE_BITMANIPULATION_H +#define SIMDJSON_WESTMERE_BITMANIPULATION_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/westmere/intrinsics.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace ppc64 { +namespace westmere { namespace { // We sometimes call trailing_zero on inputs that are zero, @@ -92993,14 +129350,14 @@ simdjson_inline int trailing_zeroes(uint64_t input_num) { // to the most significant bit (MSB) for a set bit (1). _BitScanForward64(&ret, input_num); return (int)ret; -#else // SIMDJSON_REGULAR_VISUAL_STUDIO +#else // SIMDJSON_REGULAR_VISUAL_STUDIO return __builtin_ctzll(input_num); #endif // SIMDJSON_REGULAR_VISUAL_STUDIO } /* result might be undefined when input_num is zero */ simdjson_inline uint64_t clear_lowest_bit(uint64_t input_num) { - return input_num & (input_num - 1); + return input_num & (input_num-1); } /* result might be undefined when input_num is zero */ @@ -93015,25 +129372,25 @@ simdjson_inline int leading_zeroes(uint64_t input_num) { return 64; #else return __builtin_clzll(input_num); -#endif // SIMDJSON_REGULAR_VISUAL_STUDIO +#endif// SIMDJSON_REGULAR_VISUAL_STUDIO } #if SIMDJSON_REGULAR_VISUAL_STUDIO -simdjson_inline int count_ones(uint64_t input_num) { +simdjson_inline unsigned __int64 count_ones(uint64_t input_num) { // note: we do not support legacy 32-bit Windows in this kernel - return __popcnt64(input_num); // Visual Studio wants two underscores + return __popcnt64(input_num);// Visual Studio wants two underscores } #else -simdjson_inline int count_ones(uint64_t input_num) { - return __builtin_popcountll(input_num); +simdjson_inline long long int count_ones(uint64_t input_num) { + return _popcnt64(input_num); } #endif simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2, - uint64_t *result) { + uint64_t *result) { #if SIMDJSON_REGULAR_VISUAL_STUDIO - *result = value1 + value2; - return *result < value1; + return _addcarry_u64(0, value1, value2, + reinterpret_cast<unsigned __int64 *>(result)); #else return __builtin_uaddll_overflow(value1, value2, reinterpret_cast<unsigned long long *>(result)); @@ -93041,622 +129398,944 @@ simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2, } } // unnamed namespace -} // namespace ppc64 +} // namespace westmere } // namespace simdjson -#endif // SIMDJSON_PPC64_BITMANIPULATION_H -/* end file simdjson/ppc64/bitmanipulation.h */ -/* including simdjson/ppc64/bitmask.h: #include "simdjson/ppc64/bitmask.h" */ -/* begin file simdjson/ppc64/bitmask.h */ -#ifndef SIMDJSON_PPC64_BITMASK_H -#define SIMDJSON_PPC64_BITMASK_H +#endif // SIMDJSON_WESTMERE_BITMANIPULATION_H +/* end file simdjson/westmere/bitmanipulation.h */ +/* including simdjson/westmere/bitmask.h: #include "simdjson/westmere/bitmask.h" */ +/* begin file simdjson/westmere/bitmask.h */ +#ifndef SIMDJSON_WESTMERE_BITMASK_H +#define SIMDJSON_WESTMERE_BITMASK_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/westmere/intrinsics.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace ppc64 { +namespace westmere { namespace { // -// Perform a "cumulative bitwise xor," flipping bits each time a 1 is -// encountered. +// Perform a "cumulative bitwise xor," flipping bits each time a 1 is encountered. // // For example, prefix_xor(00100100) == 00011100 // -simdjson_inline uint64_t prefix_xor(uint64_t bitmask) { - // You can use the version below, however gcc sometimes miscompiles - // vec_pmsum_be, it happens somewhere around between 8 and 9th version. - // The performance boost was not noticeable, falling back to a usual - // implementation. - // __vector unsigned long long all_ones = {~0ull, ~0ull}; - // __vector unsigned long long mask = {bitmask, 0}; - // // Clang and GCC return different values for pmsum for ull so cast it to one. - // // Generally it is not specified by ALTIVEC ISA what is returned by - // // vec_pmsum_be. - // #if defined(__LITTLE_ENDIAN__) - // return (uint64_t)(((__vector unsigned long long)vec_pmsum_be(all_ones, mask))[0]); - // #else - // return (uint64_t)(((__vector unsigned long long)vec_pmsum_be(all_ones, mask))[1]); - // #endif - bitmask ^= bitmask << 1; - bitmask ^= bitmask << 2; - bitmask ^= bitmask << 4; - bitmask ^= bitmask << 8; - bitmask ^= bitmask << 16; - bitmask ^= bitmask << 32; - return bitmask; +simdjson_inline uint64_t prefix_xor(const uint64_t bitmask) { + // There should be no such thing with a processing supporting avx2 + // but not clmul. + __m128i all_ones = _mm_set1_epi8('\xFF'); + __m128i result = _mm_clmulepi64_si128(_mm_set_epi64x(0ULL, bitmask), all_ones, 0); + return _mm_cvtsi128_si64(result); } } // unnamed namespace -} // namespace ppc64 +} // namespace westmere } // namespace simdjson -#endif -/* end file simdjson/ppc64/bitmask.h */ -/* including simdjson/ppc64/numberparsing_defs.h: #include "simdjson/ppc64/numberparsing_defs.h" */ -/* begin file simdjson/ppc64/numberparsing_defs.h */ -#ifndef SIMDJSON_PPC64_NUMBERPARSING_DEFS_H -#define SIMDJSON_PPC64_NUMBERPARSING_DEFS_H +#endif // SIMDJSON_WESTMERE_BITMASK_H +/* end file simdjson/westmere/bitmask.h */ +/* including simdjson/westmere/numberparsing_defs.h: #include "simdjson/westmere/numberparsing_defs.h" */ +/* begin file simdjson/westmere/numberparsing_defs.h */ +#ifndef SIMDJSON_WESTMERE_NUMBERPARSING_DEFS_H +#define SIMDJSON_WESTMERE_NUMBERPARSING_DEFS_H + +/* including simdjson/westmere/base.h: #include "simdjson/westmere/base.h" */ +/* begin file simdjson/westmere/base.h */ +#ifndef SIMDJSON_WESTMERE_BASE_H +#define SIMDJSON_WESTMERE_BASE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/ppc64/intrinsics.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -#include <cstring> +// The constructor may be executed on any host, so we take care not to use SIMDJSON_TARGET_WESTMERE +namespace simdjson { +/** + * Implementation for Westmere (Intel SSE4.2). + */ +namespace westmere { -#if defined(__linux__) -#include <byteswap.h> -#elif defined(__FreeBSD__) -#include <sys/endian.h> +class implementation; + +namespace { +namespace simd { + +template <typename T> struct simd8; +template <typename T> struct simd8x64; + +} // namespace simd +} // unnamed namespace + +} // namespace westmere +} // namespace simdjson + +#endif // SIMDJSON_WESTMERE_BASE_H +/* end file simdjson/westmere/base.h */ +/* including simdjson/westmere/intrinsics.h: #include "simdjson/westmere/intrinsics.h" */ +/* begin file simdjson/westmere/intrinsics.h */ +#ifndef SIMDJSON_WESTMERE_INTRINSICS_H +#define SIMDJSON_WESTMERE_INTRINSICS_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#if SIMDJSON_VISUAL_STUDIO +// under clang within visual studio, this will include <x86intrin.h> +#include <intrin.h> // visual studio or clang +#else +#include <x86intrin.h> // elsewhere +#endif // SIMDJSON_VISUAL_STUDIO + + +#if SIMDJSON_CLANG_VISUAL_STUDIO +/** + * You are not supposed, normally, to include these + * headers directly. Instead you should either include intrin.h + * or x86intrin.h. However, when compiling with clang + * under Windows (i.e., when _MSC_VER is set), these headers + * only get included *if* the corresponding features are detected + * from macros: + */ +#include <smmintrin.h> // for _mm_alignr_epi8 +#include <wmmintrin.h> // for _mm_clmulepi64_si128 #endif +static_assert(sizeof(__m128i) <= simdjson::SIMDJSON_PADDING, "insufficient padding for westmere"); + +#endif // SIMDJSON_WESTMERE_INTRINSICS_H +/* end file simdjson/westmere/intrinsics.h */ + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + namespace simdjson { -namespace ppc64 { +namespace westmere { namespace numberparsing { -// we don't have appropriate instructions, so let us use a scalar function -// credit: https://johnnylee-sde.github.io/Fast-numeric-string-to-int/ /** @private */ static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) { - uint64_t val; - std::memcpy(&val, chars, sizeof(uint64_t)); -#ifdef __BIG_ENDIAN__ -#if defined(__linux__) - val = bswap_64(val); -#elif defined(__FreeBSD__) - val = bswap64(val); -#endif + // this actually computes *16* values so we are being wasteful. + const __m128i ascii0 = _mm_set1_epi8('0'); + const __m128i mul_1_10 = + _mm_setr_epi8(10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1); + const __m128i mul_1_100 = _mm_setr_epi16(100, 1, 100, 1, 100, 1, 100, 1); + const __m128i mul_1_10000 = + _mm_setr_epi16(10000, 1, 10000, 1, 10000, 1, 10000, 1); + const __m128i input = _mm_sub_epi8( + _mm_loadu_si128(reinterpret_cast<const __m128i *>(chars)), ascii0); + const __m128i t1 = _mm_maddubs_epi16(input, mul_1_10); + const __m128i t2 = _mm_madd_epi16(t1, mul_1_100); + const __m128i t3 = _mm_packus_epi32(t2, t2); + const __m128i t4 = _mm_madd_epi16(t3, mul_1_10000); + return _mm_cvtsi128_si32( + t4); // only captures the sum of the first 8 digits, drop the rest +} + +/** @private */ +simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) { + internal::value128 answer; +#if SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS +#if SIMDJSON_IS_ARM64 + // ARM64 has native support for 64-bit multiplications, no need to emultate + answer.high = __umulh(value1, value2); + answer.low = value1 * value2; +#else + answer.low = _umul128(value1, value2, &answer.high); // _umul128 not available on ARM64 +#endif // SIMDJSON_IS_ARM64 +#else // SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS + __uint128_t r = (static_cast<__uint128_t>(value1)) * value2; + answer.low = uint64_t(r); + answer.high = uint64_t(r >> 64); #endif - val = (val & 0x0F0F0F0F0F0F0F0F) * 2561 >> 8; - val = (val & 0x00FF00FF00FF00FF) * 6553601 >> 16; - return uint32_t((val & 0x0000FFFF0000FFFF) * 42949672960001 >> 32); + return answer; +} + +} // namespace numberparsing +} // namespace westmere +} // namespace simdjson + +#define SIMDJSON_SWAR_NUMBER_PARSING 1 + +#endif // SIMDJSON_WESTMERE_NUMBERPARSING_DEFS_H +/* end file simdjson/westmere/numberparsing_defs.h */ +/* including simdjson/westmere/simd.h: #include "simdjson/westmere/simd.h" */ +/* begin file simdjson/westmere/simd.h */ +#ifndef SIMDJSON_WESTMERE_SIMD_H +#define SIMDJSON_WESTMERE_SIMD_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/westmere/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace westmere { +namespace { +namespace simd { + + template<typename Child> + struct base { + __m128i value; + + // Zero constructor + simdjson_inline base() : value{__m128i()} {} + + // Conversion from SIMD register + simdjson_inline base(const __m128i _value) : value(_value) {} + + // Conversion to SIMD register + simdjson_inline operator const __m128i&() const { return this->value; } + simdjson_inline operator __m128i&() { return this->value; } + + // Bit operations + simdjson_inline Child operator|(const Child other) const { return _mm_or_si128(*this, other); } + simdjson_inline Child operator&(const Child other) const { return _mm_and_si128(*this, other); } + simdjson_inline Child operator^(const Child other) const { return _mm_xor_si128(*this, other); } + simdjson_inline Child bit_andnot(const Child other) const { return _mm_andnot_si128(other, *this); } + simdjson_inline Child& operator|=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast | other; return *this_cast; } + simdjson_inline Child& operator&=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast & other; return *this_cast; } + simdjson_inline Child& operator^=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast ^ other; return *this_cast; } + }; + + template<typename T, typename Mask=simd8<bool>> + struct base8: base<simd8<T>> { + typedef uint16_t bitmask_t; + typedef uint32_t bitmask2_t; + + simdjson_inline base8() : base<simd8<T>>() {} + simdjson_inline base8(const __m128i _value) : base<simd8<T>>(_value) {} + + friend simdjson_inline Mask operator==(const simd8<T> lhs, const simd8<T> rhs) { return _mm_cmpeq_epi8(lhs, rhs); } + + static const int SIZE = sizeof(base<simd8<T>>::value); + + template<int N=1> + simdjson_inline simd8<T> prev(const simd8<T> prev_chunk) const { + return _mm_alignr_epi8(*this, prev_chunk, 16 - N); + } + }; + + // SIMD byte mask type (returned by things like eq and gt) + template<> + struct simd8<bool>: base8<bool> { + static simdjson_inline simd8<bool> splat(bool _value) { return _mm_set1_epi8(uint8_t(-(!!_value))); } + + simdjson_inline simd8() : base8() {} + simdjson_inline simd8(const __m128i _value) : base8<bool>(_value) {} + // Splat constructor + simdjson_inline simd8(bool _value) : base8<bool>(splat(_value)) {} + + simdjson_inline int to_bitmask() const { return _mm_movemask_epi8(*this); } + simdjson_inline bool any() const { return !_mm_testz_si128(*this, *this); } + simdjson_inline simd8<bool> operator~() const { return *this ^ true; } + }; + + template<typename T> + struct base8_numeric: base8<T> { + static simdjson_inline simd8<T> splat(T _value) { return _mm_set1_epi8(_value); } + static simdjson_inline simd8<T> zero() { return _mm_setzero_si128(); } + static simdjson_inline simd8<T> load(const T values[16]) { + return _mm_loadu_si128(reinterpret_cast<const __m128i *>(values)); + } + // Repeat 16 values as many times as necessary (usually for lookup tables) + static simdjson_inline simd8<T> repeat_16( + T v0, T v1, T v2, T v3, T v4, T v5, T v6, T v7, + T v8, T v9, T v10, T v11, T v12, T v13, T v14, T v15 + ) { + return simd8<T>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + ); + } + + simdjson_inline base8_numeric() : base8<T>() {} + simdjson_inline base8_numeric(const __m128i _value) : base8<T>(_value) {} + + // Store to array + simdjson_inline void store(T dst[16]) const { return _mm_storeu_si128(reinterpret_cast<__m128i *>(dst), *this); } + + // Override to distinguish from bool version + simdjson_inline simd8<T> operator~() const { return *this ^ 0xFFu; } + + // Addition/subtraction are the same for signed and unsigned + simdjson_inline simd8<T> operator+(const simd8<T> other) const { return _mm_add_epi8(*this, other); } + simdjson_inline simd8<T> operator-(const simd8<T> other) const { return _mm_sub_epi8(*this, other); } + simdjson_inline simd8<T>& operator+=(const simd8<T> other) { *this = *this + other; return *static_cast<simd8<T>*>(this); } + simdjson_inline simd8<T>& operator-=(const simd8<T> other) { *this = *this - other; return *static_cast<simd8<T>*>(this); } + + // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values) + template<typename L> + simdjson_inline simd8<L> lookup_16(simd8<L> lookup_table) const { + return _mm_shuffle_epi8(lookup_table, *this); + } + + // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted as a bitset). + // Passing a 0 value for mask would be equivalent to writing out every byte to output. + // Only the first 16 - count_ones(mask) bytes of the result are significant but 16 bytes + // get written. + // Design consideration: it seems like a function with the + // signature simd8<L> compress(uint32_t mask) would be + // sensible, but the AVX ISA makes this kind of approach difficult. + template<typename L> + simdjson_inline void compress(uint16_t mask, L * output) const { + using internal::thintable_epi8; + using internal::BitsSetTable256mul2; + using internal::pshufb_combine_table; + // this particular implementation was inspired by work done by @animetosho + // we do it in two steps, first 8 bytes and then second 8 bytes + uint8_t mask1 = uint8_t(mask); // least significant 8 bits + uint8_t mask2 = uint8_t(mask >> 8); // most significant 8 bits + // next line just loads the 64-bit values thintable_epi8[mask1] and + // thintable_epi8[mask2] into a 128-bit register, using only + // two instructions on most compilers. + __m128i shufmask = _mm_set_epi64x(thintable_epi8[mask2], thintable_epi8[mask1]); + // we increment by 0x08 the second half of the mask + shufmask = + _mm_add_epi8(shufmask, _mm_set_epi32(0x08080808, 0x08080808, 0, 0)); + // this is the version "nearly pruned" + __m128i pruned = _mm_shuffle_epi8(*this, shufmask); + // we still need to put the two halves together. + // we compute the popcount of the first half: + int pop1 = BitsSetTable256mul2[mask1]; + // then load the corresponding mask, what it does is to write + // only the first pop1 bytes from the first 8 bytes, and then + // it fills in with the bytes from the second 8 bytes + some filling + // at the end. + __m128i compactmask = + _mm_loadu_si128(reinterpret_cast<const __m128i *>(pshufb_combine_table + pop1 * 8)); + __m128i answer = _mm_shuffle_epi8(pruned, compactmask); + _mm_storeu_si128(reinterpret_cast<__m128i *>(output), answer); + } + + template<typename L> + simdjson_inline simd8<L> lookup_16( + L replace0, L replace1, L replace2, L replace3, + L replace4, L replace5, L replace6, L replace7, + L replace8, L replace9, L replace10, L replace11, + L replace12, L replace13, L replace14, L replace15) const { + return lookup_16(simd8<L>::repeat_16( + replace0, replace1, replace2, replace3, + replace4, replace5, replace6, replace7, + replace8, replace9, replace10, replace11, + replace12, replace13, replace14, replace15 + )); + } + }; + + // Signed bytes + template<> + struct simd8<int8_t> : base8_numeric<int8_t> { + simdjson_inline simd8() : base8_numeric<int8_t>() {} + simdjson_inline simd8(const __m128i _value) : base8_numeric<int8_t>(_value) {} + // Splat constructor + simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {} + // Array constructor + simdjson_inline simd8(const int8_t* values) : simd8(load(values)) {} + // Member-by-member initialization + simdjson_inline simd8( + int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, + int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 + ) : simd8(_mm_setr_epi8( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + )) {} + // Repeat 16 values as many times as necessary (usually for lookup tables) + simdjson_inline static simd8<int8_t> repeat_16( + int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, + int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 + ) { + return simd8<int8_t>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + ); + } + + // Order-sensitive comparisons + simdjson_inline simd8<int8_t> max_val(const simd8<int8_t> other) const { return _mm_max_epi8(*this, other); } + simdjson_inline simd8<int8_t> min_val(const simd8<int8_t> other) const { return _mm_min_epi8(*this, other); } + simdjson_inline simd8<bool> operator>(const simd8<int8_t> other) const { return _mm_cmpgt_epi8(*this, other); } + simdjson_inline simd8<bool> operator<(const simd8<int8_t> other) const { return _mm_cmpgt_epi8(other, *this); } + }; + + // Unsigned bytes + template<> + struct simd8<uint8_t>: base8_numeric<uint8_t> { + simdjson_inline simd8() : base8_numeric<uint8_t>() {} + simdjson_inline simd8(const __m128i _value) : base8_numeric<uint8_t>(_value) {} + // Splat constructor + simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {} + // Array constructor + simdjson_inline simd8(const uint8_t* values) : simd8(load(values)) {} + // Member-by-member initialization + simdjson_inline simd8( + uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, + uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 + ) : simd8(_mm_setr_epi8( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + )) {} + // Repeat 16 values as many times as necessary (usually for lookup tables) + simdjson_inline static simd8<uint8_t> repeat_16( + uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, + uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 + ) { + return simd8<uint8_t>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + ); + } + + // Saturated math + simdjson_inline simd8<uint8_t> saturating_add(const simd8<uint8_t> other) const { return _mm_adds_epu8(*this, other); } + simdjson_inline simd8<uint8_t> saturating_sub(const simd8<uint8_t> other) const { return _mm_subs_epu8(*this, other); } + + // Order-specific operations + simdjson_inline simd8<uint8_t> max_val(const simd8<uint8_t> other) const { return _mm_max_epu8(*this, other); } + simdjson_inline simd8<uint8_t> min_val(const simd8<uint8_t> other) const { return _mm_min_epu8(*this, other); } + // Same as >, but only guarantees true is nonzero (< guarantees true = -1) + simdjson_inline simd8<uint8_t> gt_bits(const simd8<uint8_t> other) const { return this->saturating_sub(other); } + // Same as <, but only guarantees true is nonzero (< guarantees true = -1) + simdjson_inline simd8<uint8_t> lt_bits(const simd8<uint8_t> other) const { return other.saturating_sub(*this); } + simdjson_inline simd8<bool> operator<=(const simd8<uint8_t> other) const { return other.max_val(*this) == other; } + simdjson_inline simd8<bool> operator>=(const simd8<uint8_t> other) const { return other.min_val(*this) == other; } + simdjson_inline simd8<bool> operator>(const simd8<uint8_t> other) const { return this->gt_bits(other).any_bits_set(); } + simdjson_inline simd8<bool> operator<(const simd8<uint8_t> other) const { return this->gt_bits(other).any_bits_set(); } + + // Bit-specific operations + simdjson_inline simd8<bool> bits_not_set() const { return *this == uint8_t(0); } + simdjson_inline simd8<bool> bits_not_set(simd8<uint8_t> bits) const { return (*this & bits).bits_not_set(); } + simdjson_inline simd8<bool> any_bits_set() const { return ~this->bits_not_set(); } + simdjson_inline simd8<bool> any_bits_set(simd8<uint8_t> bits) const { return ~this->bits_not_set(bits); } + simdjson_inline bool is_ascii() const { return _mm_movemask_epi8(*this) == 0; } + simdjson_inline bool bits_not_set_anywhere() const { return _mm_testz_si128(*this, *this); } + simdjson_inline bool any_bits_set_anywhere() const { return !bits_not_set_anywhere(); } + simdjson_inline bool bits_not_set_anywhere(simd8<uint8_t> bits) const { return _mm_testz_si128(*this, bits); } + simdjson_inline bool any_bits_set_anywhere(simd8<uint8_t> bits) const { return !bits_not_set_anywhere(bits); } + template<int N> + simdjson_inline simd8<uint8_t> shr() const { return simd8<uint8_t>(_mm_srli_epi16(*this, N)) & uint8_t(0xFFu >> N); } + template<int N> + simdjson_inline simd8<uint8_t> shl() const { return simd8<uint8_t>(_mm_slli_epi16(*this, N)) & uint8_t(0xFFu << N); } + // Get one of the bits and make a bitmask out of it. + // e.g. value.get_bit<7>() gets the high bit + template<int N> + simdjson_inline int get_bit() const { return _mm_movemask_epi8(_mm_slli_epi16(*this, 7-N)); } + }; + + template<typename T> + struct simd8x64 { + static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<T>); + static_assert(NUM_CHUNKS == 4, "Westmere kernel should use four registers per 64-byte block."); + const simd8<T> chunks[NUM_CHUNKS]; + template<int idx> simd8<uint8_t> get() const { return idx < NUM_CHUNKS ? chunks[idx] : simd8<T>(); } + + simd8x64(const simd8x64<T>& o) = delete; // no copy allowed + simd8x64<T>& operator=(const simd8<T>& other) = delete; // no assignment allowed + simd8x64() = delete; // no default constructor allowed + + simdjson_inline simd8x64(const simd8<T> chunk0, const simd8<T> chunk1, const simd8<T> chunk2, const simd8<T> chunk3) : chunks{chunk0, chunk1, chunk2, chunk3} {} + simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8<T>::load(ptr), simd8<T>::load(ptr+16), simd8<T>::load(ptr+32), simd8<T>::load(ptr+48)} {} + + simdjson_inline void store(T ptr[64]) const { + this->chunks[0].store(ptr+sizeof(simd8<T>)*0); + this->chunks[1].store(ptr+sizeof(simd8<T>)*1); + this->chunks[2].store(ptr+sizeof(simd8<T>)*2); + this->chunks[3].store(ptr+sizeof(simd8<T>)*3); + } + + simdjson_inline simd8<T> reduce_or() const { + return (this->chunks[0] | this->chunks[1]) | (this->chunks[2] | this->chunks[3]); + } + + simdjson_inline uint64_t compress(uint64_t mask, T * output) const { + this->chunks[0].compress(uint16_t(mask), output); + this->chunks[1].compress(uint16_t(mask >> 16), output + 16 - count_ones(mask & 0xFFFF)); + this->chunks[2].compress(uint16_t(mask >> 32), output + 32 - count_ones(mask & 0xFFFFFFFF)); + this->chunks[3].compress(uint16_t(mask >> 48), output + 48 - count_ones(mask & 0xFFFFFFFFFFFF)); + return 64 - count_ones(mask); + } + + simdjson_inline uint64_t to_bitmask() const { + uint64_t r0 = uint32_t(this->chunks[0].to_bitmask() ); + uint64_t r1 = this->chunks[1].to_bitmask() ; + uint64_t r2 = this->chunks[2].to_bitmask() ; + uint64_t r3 = this->chunks[3].to_bitmask() ; + return r0 | (r1 << 16) | (r2 << 32) | (r3 << 48); + } + + simdjson_inline uint64_t eq(const T m) const { + const simd8<T> mask = simd8<T>::splat(m); + return simd8x64<bool>( + this->chunks[0] == mask, + this->chunks[1] == mask, + this->chunks[2] == mask, + this->chunks[3] == mask + ).to_bitmask(); + } + + simdjson_inline uint64_t eq(const simd8x64<uint8_t> &other) const { + return simd8x64<bool>( + this->chunks[0] == other.chunks[0], + this->chunks[1] == other.chunks[1], + this->chunks[2] == other.chunks[2], + this->chunks[3] == other.chunks[3] + ).to_bitmask(); + } + + simdjson_inline uint64_t lteq(const T m) const { + const simd8<T> mask = simd8<T>::splat(m); + return simd8x64<bool>( + this->chunks[0] <= mask, + this->chunks[1] <= mask, + this->chunks[2] <= mask, + this->chunks[3] <= mask + ).to_bitmask(); + } + }; // struct simd8x64<T> + +} // namespace simd +} // unnamed namespace +} // namespace westmere +} // namespace simdjson + +#endif // SIMDJSON_WESTMERE_SIMD_INPUT_H +/* end file simdjson/westmere/simd.h */ +/* including simdjson/westmere/stringparsing_defs.h: #include "simdjson/westmere/stringparsing_defs.h" */ +/* begin file simdjson/westmere/stringparsing_defs.h */ +#ifndef SIMDJSON_WESTMERE_STRINGPARSING_DEFS_H +#define SIMDJSON_WESTMERE_STRINGPARSING_DEFS_H + +/* including simdjson/westmere/bitmanipulation.h: #include "simdjson/westmere/bitmanipulation.h" */ +/* begin file simdjson/westmere/bitmanipulation.h */ +#ifndef SIMDJSON_WESTMERE_BITMANIPULATION_H +#define SIMDJSON_WESTMERE_BITMANIPULATION_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/westmere/intrinsics.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace westmere { +namespace { + +// We sometimes call trailing_zero on inputs that are zero, +// but the algorithms do not end up using the returned value. +// Sadly, sanitizers are not smart enough to figure it out. +SIMDJSON_NO_SANITIZE_UNDEFINED +// This function can be used safely even if not all bytes have been +// initialized. +// See issue https://github.com/simdjson/simdjson/issues/1965 +SIMDJSON_NO_SANITIZE_MEMORY +simdjson_inline int trailing_zeroes(uint64_t input_num) { +#if SIMDJSON_REGULAR_VISUAL_STUDIO + unsigned long ret; + // Search the mask data from least significant bit (LSB) + // to the most significant bit (MSB) for a set bit (1). + _BitScanForward64(&ret, input_num); + return (int)ret; +#else // SIMDJSON_REGULAR_VISUAL_STUDIO + return __builtin_ctzll(input_num); +#endif // SIMDJSON_REGULAR_VISUAL_STUDIO +} + +/* result might be undefined when input_num is zero */ +simdjson_inline uint64_t clear_lowest_bit(uint64_t input_num) { + return input_num & (input_num-1); +} + +/* result might be undefined when input_num is zero */ +simdjson_inline int leading_zeroes(uint64_t input_num) { +#if SIMDJSON_REGULAR_VISUAL_STUDIO + unsigned long leading_zero = 0; + // Search the mask data from most significant bit (MSB) + // to least significant bit (LSB) for a set bit (1). + if (_BitScanReverse64(&leading_zero, input_num)) + return (int)(63 - leading_zero); + else + return 64; +#else + return __builtin_clzll(input_num); +#endif// SIMDJSON_REGULAR_VISUAL_STUDIO +} + +#if SIMDJSON_REGULAR_VISUAL_STUDIO +simdjson_inline unsigned __int64 count_ones(uint64_t input_num) { + // note: we do not support legacy 32-bit Windows in this kernel + return __popcnt64(input_num);// Visual Studio wants two underscores +} +#else +simdjson_inline long long int count_ones(uint64_t input_num) { + return _popcnt64(input_num); } +#endif -/** @private */ -simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) { - internal::value128 answer; -#if SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS -#if SIMDJSON_IS_ARM64 - // ARM64 has native support for 64-bit multiplications, no need to emultate - answer.high = __umulh(value1, value2); - answer.low = value1 * value2; +simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2, + uint64_t *result) { +#if SIMDJSON_REGULAR_VISUAL_STUDIO + return _addcarry_u64(0, value1, value2, + reinterpret_cast<unsigned __int64 *>(result)); #else - answer.low = _umul128(value1, value2, &answer.high); // _umul128 not available on ARM64 -#endif // SIMDJSON_IS_ARM64 -#else // SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS - __uint128_t r = (static_cast<__uint128_t>(value1)) * value2; - answer.low = uint64_t(r); - answer.high = uint64_t(r >> 64); + return __builtin_uaddll_overflow(value1, value2, + reinterpret_cast<unsigned long long *>(result)); #endif - return answer; } -} // namespace numberparsing -} // namespace ppc64 +} // unnamed namespace +} // namespace westmere } // namespace simdjson -#ifndef SIMDJSON_SWAR_NUMBER_PARSING -#if SIMDJSON_IS_BIG_ENDIAN -#define SIMDJSON_SWAR_NUMBER_PARSING 0 -#else -#define SIMDJSON_SWAR_NUMBER_PARSING 1 -#endif -#endif - -#endif // SIMDJSON_PPC64_NUMBERPARSING_DEFS_H -/* end file simdjson/ppc64/numberparsing_defs.h */ -/* including simdjson/ppc64/simd.h: #include "simdjson/ppc64/simd.h" */ -/* begin file simdjson/ppc64/simd.h */ -#ifndef SIMDJSON_PPC64_SIMD_H -#define SIMDJSON_PPC64_SIMD_H +#endif // SIMDJSON_WESTMERE_BITMANIPULATION_H +/* end file simdjson/westmere/bitmanipulation.h */ +/* including simdjson/westmere/simd.h: #include "simdjson/westmere/simd.h" */ +/* begin file simdjson/westmere/simd.h */ +#ifndef SIMDJSON_WESTMERE_SIMD_H +#define SIMDJSON_WESTMERE_SIMD_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/ppc64/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/westmere/bitmanipulation.h" */ /* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -#include <type_traits> - namespace simdjson { -namespace ppc64 { +namespace westmere { namespace { namespace simd { -using __m128i = __vector unsigned char; - -template <typename Child> struct base { - __m128i value; - - // Zero constructor - simdjson_inline base() : value{__m128i()} {} - - // Conversion from SIMD register - simdjson_inline base(const __m128i _value) : value(_value) {} + template<typename Child> + struct base { + __m128i value; - // Conversion to SIMD register - simdjson_inline operator const __m128i &() const { - return this->value; - } - simdjson_inline operator __m128i &() { return this->value; } + // Zero constructor + simdjson_inline base() : value{__m128i()} {} - // Bit operations - simdjson_inline Child operator|(const Child other) const { - return vec_or(this->value, (__m128i)other); - } - simdjson_inline Child operator&(const Child other) const { - return vec_and(this->value, (__m128i)other); - } - simdjson_inline Child operator^(const Child other) const { - return vec_xor(this->value, (__m128i)other); - } - simdjson_inline Child bit_andnot(const Child other) const { - return vec_andc(this->value, (__m128i)other); - } - simdjson_inline Child &operator|=(const Child other) { - auto this_cast = static_cast<Child*>(this); - *this_cast = *this_cast | other; - return *this_cast; - } - simdjson_inline Child &operator&=(const Child other) { - auto this_cast = static_cast<Child*>(this); - *this_cast = *this_cast & other; - return *this_cast; - } - simdjson_inline Child &operator^=(const Child other) { - auto this_cast = static_cast<Child*>(this); - *this_cast = *this_cast ^ other; - return *this_cast; - } -}; + // Conversion from SIMD register + simdjson_inline base(const __m128i _value) : value(_value) {} -template <typename T, typename Mask = simd8<bool>> -struct base8 : base<simd8<T>> { - typedef uint16_t bitmask_t; - typedef uint32_t bitmask2_t; + // Conversion to SIMD register + simdjson_inline operator const __m128i&() const { return this->value; } + simdjson_inline operator __m128i&() { return this->value; } - simdjson_inline base8() : base<simd8<T>>() {} - simdjson_inline base8(const __m128i _value) : base<simd8<T>>(_value) {} + // Bit operations + simdjson_inline Child operator|(const Child other) const { return _mm_or_si128(*this, other); } + simdjson_inline Child operator&(const Child other) const { return _mm_and_si128(*this, other); } + simdjson_inline Child operator^(const Child other) const { return _mm_xor_si128(*this, other); } + simdjson_inline Child bit_andnot(const Child other) const { return _mm_andnot_si128(other, *this); } + simdjson_inline Child& operator|=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast | other; return *this_cast; } + simdjson_inline Child& operator&=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast & other; return *this_cast; } + simdjson_inline Child& operator^=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast ^ other; return *this_cast; } + }; - friend simdjson_inline Mask operator==(const simd8<T> lhs, const simd8<T> rhs) { - return (__m128i)vec_cmpeq(lhs.value, (__m128i)rhs); - } + template<typename T, typename Mask=simd8<bool>> + struct base8: base<simd8<T>> { + typedef uint16_t bitmask_t; + typedef uint32_t bitmask2_t; - static const int SIZE = sizeof(base<simd8<T>>::value); + simdjson_inline base8() : base<simd8<T>>() {} + simdjson_inline base8(const __m128i _value) : base<simd8<T>>(_value) {} - template <int N = 1> - simdjson_inline simd8<T> prev(simd8<T> prev_chunk) const { - __m128i chunk = this->value; -#ifdef __LITTLE_ENDIAN__ - chunk = (__m128i)vec_reve(this->value); - prev_chunk = (__m128i)vec_reve((__m128i)prev_chunk); -#endif - chunk = (__m128i)vec_sld((__m128i)prev_chunk, (__m128i)chunk, 16 - N); -#ifdef __LITTLE_ENDIAN__ - chunk = (__m128i)vec_reve((__m128i)chunk); -#endif - return chunk; - } -}; + friend simdjson_inline Mask operator==(const simd8<T> lhs, const simd8<T> rhs) { return _mm_cmpeq_epi8(lhs, rhs); } -// SIMD byte mask type (returned by things like eq and gt) -template <> struct simd8<bool> : base8<bool> { - static simdjson_inline simd8<bool> splat(bool _value) { - return (__m128i)vec_splats((unsigned char)(-(!!_value))); - } + static const int SIZE = sizeof(base<simd8<T>>::value); - simdjson_inline simd8() : base8<bool>() {} - simdjson_inline simd8(const __m128i _value) - : base8<bool>(_value) {} - // Splat constructor - simdjson_inline simd8(bool _value) - : base8<bool>(splat(_value)) {} + template<int N=1> + simdjson_inline simd8<T> prev(const simd8<T> prev_chunk) const { + return _mm_alignr_epi8(*this, prev_chunk, 16 - N); + } + }; - simdjson_inline int to_bitmask() const { - __vector unsigned long long result; - const __m128i perm_mask = {0x78, 0x70, 0x68, 0x60, 0x58, 0x50, 0x48, 0x40, - 0x38, 0x30, 0x28, 0x20, 0x18, 0x10, 0x08, 0x00}; + // SIMD byte mask type (returned by things like eq and gt) + template<> + struct simd8<bool>: base8<bool> { + static simdjson_inline simd8<bool> splat(bool _value) { return _mm_set1_epi8(uint8_t(-(!!_value))); } - result = ((__vector unsigned long long)vec_vbpermq((__m128i)this->value, - (__m128i)perm_mask)); -#ifdef __LITTLE_ENDIAN__ - return static_cast<int>(result[1]); -#else - return static_cast<int>(result[0]); -#endif - } - simdjson_inline bool any() const { - return !vec_all_eq(this->value, (__m128i)vec_splats(0)); - } - simdjson_inline simd8<bool> operator~() const { - return this->value ^ (__m128i)splat(true); - } -}; + simdjson_inline simd8() : base8() {} + simdjson_inline simd8(const __m128i _value) : base8<bool>(_value) {} + // Splat constructor + simdjson_inline simd8(bool _value) : base8<bool>(splat(_value)) {} -template <typename T> struct base8_numeric : base8<T> { - static simdjson_inline simd8<T> splat(T value) { - (void)value; - return (__m128i)vec_splats(value); - } - static simdjson_inline simd8<T> zero() { return splat(0); } - static simdjson_inline simd8<T> load(const T values[16]) { - return (__m128i)(vec_vsx_ld(0, reinterpret_cast<const uint8_t *>(values))); - } - // Repeat 16 values as many times as necessary (usually for lookup tables) - static simdjson_inline simd8<T> repeat_16(T v0, T v1, T v2, T v3, T v4, - T v5, T v6, T v7, T v8, T v9, - T v10, T v11, T v12, T v13, - T v14, T v15) { - return simd8<T>(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, - v14, v15); - } + simdjson_inline int to_bitmask() const { return _mm_movemask_epi8(*this); } + simdjson_inline bool any() const { return !_mm_testz_si128(*this, *this); } + simdjson_inline simd8<bool> operator~() const { return *this ^ true; } + }; - simdjson_inline base8_numeric() : base8<T>() {} - simdjson_inline base8_numeric(const __m128i _value) - : base8<T>(_value) {} + template<typename T> + struct base8_numeric: base8<T> { + static simdjson_inline simd8<T> splat(T _value) { return _mm_set1_epi8(_value); } + static simdjson_inline simd8<T> zero() { return _mm_setzero_si128(); } + static simdjson_inline simd8<T> load(const T values[16]) { + return _mm_loadu_si128(reinterpret_cast<const __m128i *>(values)); + } + // Repeat 16 values as many times as necessary (usually for lookup tables) + static simdjson_inline simd8<T> repeat_16( + T v0, T v1, T v2, T v3, T v4, T v5, T v6, T v7, + T v8, T v9, T v10, T v11, T v12, T v13, T v14, T v15 + ) { + return simd8<T>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + ); + } - // Store to array - simdjson_inline void store(T dst[16]) const { - vec_vsx_st(this->value, 0, reinterpret_cast<__m128i *>(dst)); - } + simdjson_inline base8_numeric() : base8<T>() {} + simdjson_inline base8_numeric(const __m128i _value) : base8<T>(_value) {} - // Override to distinguish from bool version - simdjson_inline simd8<T> operator~() const { return *this ^ 0xFFu; } + // Store to array + simdjson_inline void store(T dst[16]) const { return _mm_storeu_si128(reinterpret_cast<__m128i *>(dst), *this); } - // Addition/subtraction are the same for signed and unsigned - simdjson_inline simd8<T> operator+(const simd8<T> other) const { - return (__m128i)((__m128i)this->value + (__m128i)other); - } - simdjson_inline simd8<T> operator-(const simd8<T> other) const { - return (__m128i)((__m128i)this->value - (__m128i)other); - } - simdjson_inline simd8<T> &operator+=(const simd8<T> other) { - *this = *this + other; - return *static_cast<simd8<T> *>(this); - } - simdjson_inline simd8<T> &operator-=(const simd8<T> other) { - *this = *this - other; - return *static_cast<simd8<T> *>(this); - } + // Override to distinguish from bool version + simdjson_inline simd8<T> operator~() const { return *this ^ 0xFFu; } - // Perform a lookup assuming the value is between 0 and 16 (undefined behavior - // for out of range values) - template <typename L> - simdjson_inline simd8<L> lookup_16(simd8<L> lookup_table) const { - return (__m128i)vec_perm((__m128i)lookup_table, (__m128i)lookup_table, this->value); - } + // Addition/subtraction are the same for signed and unsigned + simdjson_inline simd8<T> operator+(const simd8<T> other) const { return _mm_add_epi8(*this, other); } + simdjson_inline simd8<T> operator-(const simd8<T> other) const { return _mm_sub_epi8(*this, other); } + simdjson_inline simd8<T>& operator+=(const simd8<T> other) { *this = *this + other; return *static_cast<simd8<T>*>(this); } + simdjson_inline simd8<T>& operator-=(const simd8<T> other) { *this = *this - other; return *static_cast<simd8<T>*>(this); } - // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted - // as a bitset). Passing a 0 value for mask would be equivalent to writing out - // every byte to output. Only the first 16 - count_ones(mask) bytes of the - // result are significant but 16 bytes get written. Design consideration: it - // seems like a function with the signature simd8<L> compress(uint32_t mask) - // would be sensible, but the AVX ISA makes this kind of approach difficult. - template <typename L> - simdjson_inline void compress(uint16_t mask, L *output) const { - using internal::BitsSetTable256mul2; - using internal::pshufb_combine_table; - using internal::thintable_epi8; - // this particular implementation was inspired by work done by @animetosho - // we do it in two steps, first 8 bytes and then second 8 bytes - uint8_t mask1 = uint8_t(mask); // least significant 8 bits - uint8_t mask2 = uint8_t(mask >> 8); // most significant 8 bits - // next line just loads the 64-bit values thintable_epi8[mask1] and - // thintable_epi8[mask2] into a 128-bit register, using only - // two instructions on most compilers. -#ifdef __LITTLE_ENDIAN__ - __m128i shufmask = (__m128i)(__vector unsigned long long){ - thintable_epi8[mask1], thintable_epi8[mask2]}; -#else - __m128i shufmask = (__m128i)(__vector unsigned long long){ - thintable_epi8[mask2], thintable_epi8[mask1]}; - shufmask = (__m128i)vec_reve((__m128i)shufmask); -#endif - // we increment by 0x08 the second half of the mask - shufmask = ((__m128i)shufmask) + - ((__m128i)(__vector int){0, 0, 0x08080808, 0x08080808}); + // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values) + template<typename L> + simdjson_inline simd8<L> lookup_16(simd8<L> lookup_table) const { + return _mm_shuffle_epi8(lookup_table, *this); + } - // this is the version "nearly pruned" - __m128i pruned = vec_perm(this->value, this->value, shufmask); - // we still need to put the two halves together. - // we compute the popcount of the first half: - int pop1 = BitsSetTable256mul2[mask1]; - // then load the corresponding mask, what it does is to write - // only the first pop1 bytes from the first 8 bytes, and then - // it fills in with the bytes from the second 8 bytes + some filling - // at the end. - __m128i compactmask = - vec_vsx_ld(0, reinterpret_cast<const uint8_t *>(pshufb_combine_table + pop1 * 8)); - __m128i answer = vec_perm(pruned, (__m128i)vec_splats(0), compactmask); - vec_vsx_st(answer, 0, reinterpret_cast<__m128i *>(output)); - } + // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted as a bitset). + // Passing a 0 value for mask would be equivalent to writing out every byte to output. + // Only the first 16 - count_ones(mask) bytes of the result are significant but 16 bytes + // get written. + // Design consideration: it seems like a function with the + // signature simd8<L> compress(uint32_t mask) would be + // sensible, but the AVX ISA makes this kind of approach difficult. + template<typename L> + simdjson_inline void compress(uint16_t mask, L * output) const { + using internal::thintable_epi8; + using internal::BitsSetTable256mul2; + using internal::pshufb_combine_table; + // this particular implementation was inspired by work done by @animetosho + // we do it in two steps, first 8 bytes and then second 8 bytes + uint8_t mask1 = uint8_t(mask); // least significant 8 bits + uint8_t mask2 = uint8_t(mask >> 8); // most significant 8 bits + // next line just loads the 64-bit values thintable_epi8[mask1] and + // thintable_epi8[mask2] into a 128-bit register, using only + // two instructions on most compilers. + __m128i shufmask = _mm_set_epi64x(thintable_epi8[mask2], thintable_epi8[mask1]); + // we increment by 0x08 the second half of the mask + shufmask = + _mm_add_epi8(shufmask, _mm_set_epi32(0x08080808, 0x08080808, 0, 0)); + // this is the version "nearly pruned" + __m128i pruned = _mm_shuffle_epi8(*this, shufmask); + // we still need to put the two halves together. + // we compute the popcount of the first half: + int pop1 = BitsSetTable256mul2[mask1]; + // then load the corresponding mask, what it does is to write + // only the first pop1 bytes from the first 8 bytes, and then + // it fills in with the bytes from the second 8 bytes + some filling + // at the end. + __m128i compactmask = + _mm_loadu_si128(reinterpret_cast<const __m128i *>(pshufb_combine_table + pop1 * 8)); + __m128i answer = _mm_shuffle_epi8(pruned, compactmask); + _mm_storeu_si128(reinterpret_cast<__m128i *>(output), answer); + } - template <typename L> - simdjson_inline simd8<L> - lookup_16(L replace0, L replace1, L replace2, L replace3, L replace4, - L replace5, L replace6, L replace7, L replace8, L replace9, - L replace10, L replace11, L replace12, L replace13, L replace14, - L replace15) const { - return lookup_16(simd8<L>::repeat_16( - replace0, replace1, replace2, replace3, replace4, replace5, replace6, - replace7, replace8, replace9, replace10, replace11, replace12, - replace13, replace14, replace15)); - } -}; + template<typename L> + simdjson_inline simd8<L> lookup_16( + L replace0, L replace1, L replace2, L replace3, + L replace4, L replace5, L replace6, L replace7, + L replace8, L replace9, L replace10, L replace11, + L replace12, L replace13, L replace14, L replace15) const { + return lookup_16(simd8<L>::repeat_16( + replace0, replace1, replace2, replace3, + replace4, replace5, replace6, replace7, + replace8, replace9, replace10, replace11, + replace12, replace13, replace14, replace15 + )); + } + }; -// Signed bytes -template <> struct simd8<int8_t> : base8_numeric<int8_t> { - simdjson_inline simd8() : base8_numeric<int8_t>() {} - simdjson_inline simd8(const __m128i _value) - : base8_numeric<int8_t>(_value) {} - // Splat constructor - simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {} - // Array constructor - simdjson_inline simd8(const int8_t *values) : simd8(load(values)) {} - // Member-by-member initialization - simdjson_inline simd8(int8_t v0, int8_t v1, int8_t v2, int8_t v3, - int8_t v4, int8_t v5, int8_t v6, int8_t v7, - int8_t v8, int8_t v9, int8_t v10, int8_t v11, - int8_t v12, int8_t v13, int8_t v14, int8_t v15) - : simd8((__m128i)(__vector signed char){v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10, v11, v12, v13, v14, - v15}) {} - // Repeat 16 values as many times as necessary (usually for lookup tables) - simdjson_inline static simd8<int8_t> - repeat_16(int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, - int8_t v6, int8_t v7, int8_t v8, int8_t v9, int8_t v10, int8_t v11, - int8_t v12, int8_t v13, int8_t v14, int8_t v15) { - return simd8<int8_t>(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, - v13, v14, v15); - } + // Signed bytes + template<> + struct simd8<int8_t> : base8_numeric<int8_t> { + simdjson_inline simd8() : base8_numeric<int8_t>() {} + simdjson_inline simd8(const __m128i _value) : base8_numeric<int8_t>(_value) {} + // Splat constructor + simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {} + // Array constructor + simdjson_inline simd8(const int8_t* values) : simd8(load(values)) {} + // Member-by-member initialization + simdjson_inline simd8( + int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, + int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 + ) : simd8(_mm_setr_epi8( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + )) {} + // Repeat 16 values as many times as necessary (usually for lookup tables) + simdjson_inline static simd8<int8_t> repeat_16( + int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, + int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 + ) { + return simd8<int8_t>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + ); + } - // Order-sensitive comparisons - simdjson_inline simd8<int8_t> - max_val(const simd8<int8_t> other) const { - return (__m128i)vec_max((__vector signed char)this->value, - (__vector signed char)(__m128i)other); - } - simdjson_inline simd8<int8_t> - min_val(const simd8<int8_t> other) const { - return (__m128i)vec_min((__vector signed char)this->value, - (__vector signed char)(__m128i)other); - } - simdjson_inline simd8<bool> - operator>(const simd8<int8_t> other) const { - return (__m128i)vec_cmpgt((__vector signed char)this->value, - (__vector signed char)(__m128i)other); - } - simdjson_inline simd8<bool> - operator<(const simd8<int8_t> other) const { - return (__m128i)vec_cmplt((__vector signed char)this->value, - (__vector signed char)(__m128i)other); - } -}; + // Order-sensitive comparisons + simdjson_inline simd8<int8_t> max_val(const simd8<int8_t> other) const { return _mm_max_epi8(*this, other); } + simdjson_inline simd8<int8_t> min_val(const simd8<int8_t> other) const { return _mm_min_epi8(*this, other); } + simdjson_inline simd8<bool> operator>(const simd8<int8_t> other) const { return _mm_cmpgt_epi8(*this, other); } + simdjson_inline simd8<bool> operator<(const simd8<int8_t> other) const { return _mm_cmpgt_epi8(other, *this); } + }; -// Unsigned bytes -template <> struct simd8<uint8_t> : base8_numeric<uint8_t> { - simdjson_inline simd8() : base8_numeric<uint8_t>() {} - simdjson_inline simd8(const __m128i _value) - : base8_numeric<uint8_t>(_value) {} - // Splat constructor - simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {} - // Array constructor - simdjson_inline simd8(const uint8_t *values) : simd8(load(values)) {} - // Member-by-member initialization - simdjson_inline - simd8(uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, - uint8_t v6, uint8_t v7, uint8_t v8, uint8_t v9, uint8_t v10, - uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15) - : simd8((__m128i){v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, - v13, v14, v15}) {} - // Repeat 16 values as many times as necessary (usually for lookup tables) - simdjson_inline static simd8<uint8_t> - repeat_16(uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, - uint8_t v5, uint8_t v6, uint8_t v7, uint8_t v8, uint8_t v9, - uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, - uint8_t v15) { - return simd8<uint8_t>(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, - v13, v14, v15); - } + // Unsigned bytes + template<> + struct simd8<uint8_t>: base8_numeric<uint8_t> { + simdjson_inline simd8() : base8_numeric<uint8_t>() {} + simdjson_inline simd8(const __m128i _value) : base8_numeric<uint8_t>(_value) {} + // Splat constructor + simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {} + // Array constructor + simdjson_inline simd8(const uint8_t* values) : simd8(load(values)) {} + // Member-by-member initialization + simdjson_inline simd8( + uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, + uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 + ) : simd8(_mm_setr_epi8( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + )) {} + // Repeat 16 values as many times as necessary (usually for lookup tables) + simdjson_inline static simd8<uint8_t> repeat_16( + uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, + uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 + ) { + return simd8<uint8_t>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + ); + } - // Saturated math - simdjson_inline simd8<uint8_t> - saturating_add(const simd8<uint8_t> other) const { - return (__m128i)vec_adds(this->value, (__m128i)other); - } - simdjson_inline simd8<uint8_t> - saturating_sub(const simd8<uint8_t> other) const { - return (__m128i)vec_subs(this->value, (__m128i)other); - } + // Saturated math + simdjson_inline simd8<uint8_t> saturating_add(const simd8<uint8_t> other) const { return _mm_adds_epu8(*this, other); } + simdjson_inline simd8<uint8_t> saturating_sub(const simd8<uint8_t> other) const { return _mm_subs_epu8(*this, other); } - // Order-specific operations - simdjson_inline simd8<uint8_t> - max_val(const simd8<uint8_t> other) const { - return (__m128i)vec_max(this->value, (__m128i)other); - } - simdjson_inline simd8<uint8_t> - min_val(const simd8<uint8_t> other) const { - return (__m128i)vec_min(this->value, (__m128i)other); - } - // Same as >, but only guarantees true is nonzero (< guarantees true = -1) - simdjson_inline simd8<uint8_t> - gt_bits(const simd8<uint8_t> other) const { - return this->saturating_sub(other); - } - // Same as <, but only guarantees true is nonzero (< guarantees true = -1) - simdjson_inline simd8<uint8_t> - lt_bits(const simd8<uint8_t> other) const { - return other.saturating_sub(*this); - } - simdjson_inline simd8<bool> - operator<=(const simd8<uint8_t> other) const { - return other.max_val(*this) == other; - } - simdjson_inline simd8<bool> - operator>=(const simd8<uint8_t> other) const { - return other.min_val(*this) == other; - } - simdjson_inline simd8<bool> - operator>(const simd8<uint8_t> other) const { - return this->gt_bits(other).any_bits_set(); - } - simdjson_inline simd8<bool> - operator<(const simd8<uint8_t> other) const { - return this->gt_bits(other).any_bits_set(); - } + // Order-specific operations + simdjson_inline simd8<uint8_t> max_val(const simd8<uint8_t> other) const { return _mm_max_epu8(*this, other); } + simdjson_inline simd8<uint8_t> min_val(const simd8<uint8_t> other) const { return _mm_min_epu8(*this, other); } + // Same as >, but only guarantees true is nonzero (< guarantees true = -1) + simdjson_inline simd8<uint8_t> gt_bits(const simd8<uint8_t> other) const { return this->saturating_sub(other); } + // Same as <, but only guarantees true is nonzero (< guarantees true = -1) + simdjson_inline simd8<uint8_t> lt_bits(const simd8<uint8_t> other) const { return other.saturating_sub(*this); } + simdjson_inline simd8<bool> operator<=(const simd8<uint8_t> other) const { return other.max_val(*this) == other; } + simdjson_inline simd8<bool> operator>=(const simd8<uint8_t> other) const { return other.min_val(*this) == other; } + simdjson_inline simd8<bool> operator>(const simd8<uint8_t> other) const { return this->gt_bits(other).any_bits_set(); } + simdjson_inline simd8<bool> operator<(const simd8<uint8_t> other) const { return this->gt_bits(other).any_bits_set(); } - // Bit-specific operations - simdjson_inline simd8<bool> bits_not_set() const { - return (__m128i)vec_cmpeq(this->value, (__m128i)vec_splats(uint8_t(0))); - } - simdjson_inline simd8<bool> bits_not_set(simd8<uint8_t> bits) const { - return (*this & bits).bits_not_set(); - } - simdjson_inline simd8<bool> any_bits_set() const { - return ~this->bits_not_set(); - } - simdjson_inline simd8<bool> any_bits_set(simd8<uint8_t> bits) const { - return ~this->bits_not_set(bits); - } - simdjson_inline bool bits_not_set_anywhere() const { - return vec_all_eq(this->value, (__m128i)vec_splats(0)); - } - simdjson_inline bool any_bits_set_anywhere() const { - return !bits_not_set_anywhere(); - } - simdjson_inline bool bits_not_set_anywhere(simd8<uint8_t> bits) const { - return vec_all_eq(vec_and(this->value, (__m128i)bits), - (__m128i)vec_splats(0)); - } - simdjson_inline bool any_bits_set_anywhere(simd8<uint8_t> bits) const { - return !bits_not_set_anywhere(bits); - } - template <int N> simdjson_inline simd8<uint8_t> shr() const { - return simd8<uint8_t>( - (__m128i)vec_sr(this->value, (__m128i)vec_splat_u8(N))); - } - template <int N> simdjson_inline simd8<uint8_t> shl() const { - return simd8<uint8_t>( - (__m128i)vec_sl(this->value, (__m128i)vec_splat_u8(N))); - } -}; + // Bit-specific operations + simdjson_inline simd8<bool> bits_not_set() const { return *this == uint8_t(0); } + simdjson_inline simd8<bool> bits_not_set(simd8<uint8_t> bits) const { return (*this & bits).bits_not_set(); } + simdjson_inline simd8<bool> any_bits_set() const { return ~this->bits_not_set(); } + simdjson_inline simd8<bool> any_bits_set(simd8<uint8_t> bits) const { return ~this->bits_not_set(bits); } + simdjson_inline bool is_ascii() const { return _mm_movemask_epi8(*this) == 0; } + simdjson_inline bool bits_not_set_anywhere() const { return _mm_testz_si128(*this, *this); } + simdjson_inline bool any_bits_set_anywhere() const { return !bits_not_set_anywhere(); } + simdjson_inline bool bits_not_set_anywhere(simd8<uint8_t> bits) const { return _mm_testz_si128(*this, bits); } + simdjson_inline bool any_bits_set_anywhere(simd8<uint8_t> bits) const { return !bits_not_set_anywhere(bits); } + template<int N> + simdjson_inline simd8<uint8_t> shr() const { return simd8<uint8_t>(_mm_srli_epi16(*this, N)) & uint8_t(0xFFu >> N); } + template<int N> + simdjson_inline simd8<uint8_t> shl() const { return simd8<uint8_t>(_mm_slli_epi16(*this, N)) & uint8_t(0xFFu << N); } + // Get one of the bits and make a bitmask out of it. + // e.g. value.get_bit<7>() gets the high bit + template<int N> + simdjson_inline int get_bit() const { return _mm_movemask_epi8(_mm_slli_epi16(*this, 7-N)); } + }; -template <typename T> struct simd8x64 { - static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<T>); - static_assert(NUM_CHUNKS == 4, - "PPC64 kernel should use four registers per 64-byte block."); - const simd8<T> chunks[NUM_CHUNKS]; + template<typename T> + struct simd8x64 { + static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<T>); + static_assert(NUM_CHUNKS == 4, "Westmere kernel should use four registers per 64-byte block."); + const simd8<T> chunks[NUM_CHUNKS]; + template<int idx> simd8<uint8_t> get() const { return idx < NUM_CHUNKS ? chunks[idx] : simd8<T>(); } - simd8x64(const simd8x64<T> &o) = delete; // no copy allowed - simd8x64<T> & - operator=(const simd8<T>& other) = delete; // no assignment allowed - simd8x64() = delete; // no default constructor allowed + simd8x64(const simd8x64<T>& o) = delete; // no copy allowed + simd8x64<T>& operator=(const simd8<T>& other) = delete; // no assignment allowed + simd8x64() = delete; // no default constructor allowed - simdjson_inline simd8x64(const simd8<T> chunk0, const simd8<T> chunk1, - const simd8<T> chunk2, const simd8<T> chunk3) - : chunks{chunk0, chunk1, chunk2, chunk3} {} - simdjson_inline simd8x64(const T ptr[64]) - : chunks{simd8<T>::load(ptr), simd8<T>::load(ptr + 16), - simd8<T>::load(ptr + 32), simd8<T>::load(ptr + 48)} {} + simdjson_inline simd8x64(const simd8<T> chunk0, const simd8<T> chunk1, const simd8<T> chunk2, const simd8<T> chunk3) : chunks{chunk0, chunk1, chunk2, chunk3} {} + simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8<T>::load(ptr), simd8<T>::load(ptr+16), simd8<T>::load(ptr+32), simd8<T>::load(ptr+48)} {} - simdjson_inline void store(T ptr[64]) const { - this->chunks[0].store(ptr + sizeof(simd8<T>) * 0); - this->chunks[1].store(ptr + sizeof(simd8<T>) * 1); - this->chunks[2].store(ptr + sizeof(simd8<T>) * 2); - this->chunks[3].store(ptr + sizeof(simd8<T>) * 3); - } + simdjson_inline void store(T ptr[64]) const { + this->chunks[0].store(ptr+sizeof(simd8<T>)*0); + this->chunks[1].store(ptr+sizeof(simd8<T>)*1); + this->chunks[2].store(ptr+sizeof(simd8<T>)*2); + this->chunks[3].store(ptr+sizeof(simd8<T>)*3); + } - simdjson_inline simd8<T> reduce_or() const { - return (this->chunks[0] | this->chunks[1]) | - (this->chunks[2] | this->chunks[3]); - } + simdjson_inline simd8<T> reduce_or() const { + return (this->chunks[0] | this->chunks[1]) | (this->chunks[2] | this->chunks[3]); + } - simdjson_inline uint64_t compress(uint64_t mask, T *output) const { - this->chunks[0].compress(uint16_t(mask), output); - this->chunks[1].compress(uint16_t(mask >> 16), - output + 16 - count_ones(mask & 0xFFFF)); - this->chunks[2].compress(uint16_t(mask >> 32), - output + 32 - count_ones(mask & 0xFFFFFFFF)); - this->chunks[3].compress(uint16_t(mask >> 48), - output + 48 - count_ones(mask & 0xFFFFFFFFFFFF)); - return 64 - count_ones(mask); - } + simdjson_inline uint64_t compress(uint64_t mask, T * output) const { + this->chunks[0].compress(uint16_t(mask), output); + this->chunks[1].compress(uint16_t(mask >> 16), output + 16 - count_ones(mask & 0xFFFF)); + this->chunks[2].compress(uint16_t(mask >> 32), output + 32 - count_ones(mask & 0xFFFFFFFF)); + this->chunks[3].compress(uint16_t(mask >> 48), output + 48 - count_ones(mask & 0xFFFFFFFFFFFF)); + return 64 - count_ones(mask); + } - simdjson_inline uint64_t to_bitmask() const { - uint64_t r0 = uint32_t(this->chunks[0].to_bitmask()); - uint64_t r1 = this->chunks[1].to_bitmask(); - uint64_t r2 = this->chunks[2].to_bitmask(); - uint64_t r3 = this->chunks[3].to_bitmask(); - return r0 | (r1 << 16) | (r2 << 32) | (r3 << 48); - } + simdjson_inline uint64_t to_bitmask() const { + uint64_t r0 = uint32_t(this->chunks[0].to_bitmask() ); + uint64_t r1 = this->chunks[1].to_bitmask() ; + uint64_t r2 = this->chunks[2].to_bitmask() ; + uint64_t r3 = this->chunks[3].to_bitmask() ; + return r0 | (r1 << 16) | (r2 << 32) | (r3 << 48); + } - simdjson_inline uint64_t eq(const T m) const { - const simd8<T> mask = simd8<T>::splat(m); - return simd8x64<bool>(this->chunks[0] == mask, this->chunks[1] == mask, - this->chunks[2] == mask, this->chunks[3] == mask) - .to_bitmask(); - } + simdjson_inline uint64_t eq(const T m) const { + const simd8<T> mask = simd8<T>::splat(m); + return simd8x64<bool>( + this->chunks[0] == mask, + this->chunks[1] == mask, + this->chunks[2] == mask, + this->chunks[3] == mask + ).to_bitmask(); + } - simdjson_inline uint64_t eq(const simd8x64<uint8_t> &other) const { - return simd8x64<bool>(this->chunks[0] == other.chunks[0], - this->chunks[1] == other.chunks[1], - this->chunks[2] == other.chunks[2], - this->chunks[3] == other.chunks[3]) - .to_bitmask(); - } + simdjson_inline uint64_t eq(const simd8x64<uint8_t> &other) const { + return simd8x64<bool>( + this->chunks[0] == other.chunks[0], + this->chunks[1] == other.chunks[1], + this->chunks[2] == other.chunks[2], + this->chunks[3] == other.chunks[3] + ).to_bitmask(); + } - simdjson_inline uint64_t lteq(const T m) const { - const simd8<T> mask = simd8<T>::splat(m); - return simd8x64<bool>(this->chunks[0] <= mask, this->chunks[1] <= mask, - this->chunks[2] <= mask, this->chunks[3] <= mask) - .to_bitmask(); - } -}; // struct simd8x64<T> + simdjson_inline uint64_t lteq(const T m) const { + const simd8<T> mask = simd8<T>::splat(m); + return simd8x64<bool>( + this->chunks[0] <= mask, + this->chunks[1] <= mask, + this->chunks[2] <= mask, + this->chunks[3] <= mask + ).to_bitmask(); + } + }; // struct simd8x64<T> } // namespace simd } // unnamed namespace -} // namespace ppc64 +} // namespace westmere } // namespace simdjson -#endif // SIMDJSON_PPC64_SIMD_INPUT_H -/* end file simdjson/ppc64/simd.h */ -/* including simdjson/ppc64/stringparsing_defs.h: #include "simdjson/ppc64/stringparsing_defs.h" */ -/* begin file simdjson/ppc64/stringparsing_defs.h */ -#ifndef SIMDJSON_PPC64_STRINGPARSING_DEFS_H -#define SIMDJSON_PPC64_STRINGPARSING_DEFS_H - -/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/ppc64/bitmanipulation.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/ppc64/simd.h" */ -/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ +#endif // SIMDJSON_WESTMERE_SIMD_INPUT_H +/* end file simdjson/westmere/simd.h */ namespace simdjson { -namespace ppc64 { +namespace westmere { namespace { using namespace simd; @@ -93665,44 +130344,29 @@ using namespace simd; struct backslash_and_quote { public: static constexpr uint32_t BYTES_PROCESSED = 32; - simdjson_inline backslash_and_quote - copy_and_find(const uint8_t *src, uint8_t *dst); + simdjson_inline backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst); - simdjson_inline bool has_quote_first() { - return ((bs_bits - 1) & quote_bits) != 0; - } + simdjson_inline bool has_quote_first() { return ((bs_bits - 1) & quote_bits) != 0; } simdjson_inline bool has_backslash() { return bs_bits != 0; } - simdjson_inline int quote_index() { - return trailing_zeroes(quote_bits); - } - simdjson_inline int backslash_index() { - return trailing_zeroes(bs_bits); - } + simdjson_inline int quote_index() { return trailing_zeroes(quote_bits); } + simdjson_inline int backslash_index() { return trailing_zeroes(bs_bits); } uint32_t bs_bits; uint32_t quote_bits; }; // struct backslash_and_quote -simdjson_inline backslash_and_quote -backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) { +simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) { // this can read up to 31 bytes beyond the buffer size, but we require // SIMDJSON_PADDING of padding - static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), - "backslash and quote finder must process fewer than " - "SIMDJSON_PADDING bytes"); + static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "backslash and quote finder must process fewer than SIMDJSON_PADDING bytes"); simd8<uint8_t> v0(src); - simd8<uint8_t> v1(src + sizeof(v0)); + simd8<uint8_t> v1(src + 16); v0.store(dst); - v1.store(dst + sizeof(v0)); - - // Getting a 64-bit bitmask is much cheaper than multiple 16-bit bitmasks on - // PPC; therefore, we smash them together into a 64-byte mask and get the - // bitmask from there. - uint64_t bs_and_quote = - simd8x64<bool>(v0 == '\\', v1 == '\\', v0 == '"', v1 == '"').to_bitmask(); + v1.store(dst + 16); + uint64_t bs_and_quote = simd8x64<bool>(v0 == '\\', v1 == '\\', v0 == '"', v1 == '"').to_bitmask(); return { - uint32_t(bs_and_quote), // bs_bits - uint32_t(bs_and_quote >> 32) // quote_bits + uint32_t(bs_and_quote), // bs_bits + uint32_t(bs_and_quote >> 32) // quote_bits }; } @@ -93727,29 +130391,26 @@ simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *ds simd8<bool> is_backslash = (v == '\\'); simd8<bool> is_control = (v < 32); return { - // We store it as a 64-bit bitmask even though we only need 16 bits. uint64_t((is_backslash | is_quote | is_control).to_bitmask()) }; } } // unnamed namespace -} // namespace ppc64 +} // namespace westmere } // namespace simdjson -#endif // SIMDJSON_PPC64_STRINGPARSING_DEFS_H -/* end file simdjson/ppc64/stringparsing_defs.h */ - -#define SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT 1 -/* end file simdjson/ppc64/begin.h */ -/* including simdjson/generic/ondemand/amalgamated.h for ppc64: #include "simdjson/generic/ondemand/amalgamated.h" */ -/* begin file simdjson/generic/ondemand/amalgamated.h for ppc64 */ -#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_ONDEMAND_DEPENDENCIES_H) +#endif // SIMDJSON_WESTMERE_STRINGPARSING_DEFS_H +/* end file simdjson/westmere/stringparsing_defs.h */ +/* end file simdjson/westmere/begin.h */ +/* including simdjson/generic/ondemand/amalgamated.h for westmere: #include "simdjson/generic/ondemand/amalgamated.h" */ +/* begin file simdjson/generic/ondemand/amalgamated.h for westmere */ +#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_BUILDER_DEPENDENCIES_H) #error simdjson/generic/ondemand/dependencies.h must be included before simdjson/generic/ondemand/amalgamated.h! #endif // Stuff other things depend on -/* including simdjson/generic/ondemand/base.h for ppc64: #include "simdjson/generic/ondemand/base.h" */ -/* begin file simdjson/generic/ondemand/base.h for ppc64 */ +/* including simdjson/generic/ondemand/base.h for westmere: #include "simdjson/generic/ondemand/base.h" */ +/* begin file simdjson/generic/ondemand/base.h for westmere */ #ifndef SIMDJSON_GENERIC_ONDEMAND_BASE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -93758,7 +130419,7 @@ simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *ds /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace ppc64 { +namespace westmere { /** * A fast, simple, DOM-like interface that parses JSON as you use it. * @@ -93769,8 +130430,8 @@ namespace ondemand { /** Represents the depth of a JSON value (number of nested arrays/objects). */ using depth_t = int32_t; -/** @copydoc simdjson::ppc64::number_type */ -using number_type = simdjson::ppc64::number_type; +/** @copydoc simdjson::westmere::number_type */ +using number_type = simdjson::westmere::number_type; /** @private Position in the JSON buffer indexes */ using token_position = const uint32_t *; @@ -93793,13 +130454,13 @@ class value; class value_iterator; } // namespace ondemand -} // namespace ppc64 +} // namespace westmere } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_BASE_H -/* end file simdjson/generic/ondemand/base.h for ppc64 */ -/* including simdjson/generic/ondemand/deserialize.h for ppc64: #include "simdjson/generic/ondemand/deserialize.h" */ -/* begin file simdjson/generic/ondemand/deserialize.h for ppc64 */ +/* end file simdjson/generic/ondemand/base.h for westmere */ +/* including simdjson/generic/ondemand/deserialize.h for westmere: #include "simdjson/generic/ondemand/deserialize.h" */ +/* begin file simdjson/generic/ondemand/deserialize.h for westmere */ #if SIMDJSON_SUPPORTS_CONCEPTS #ifndef SIMDJSON_ONDEMAND_DESERIALIZE_H @@ -93819,35 +130480,35 @@ template <> struct is_builtin_deserializable<int64_t> : std::true_type {}; template <> struct is_builtin_deserializable<uint64_t> : std::true_type {}; template <> struct is_builtin_deserializable<double> : std::true_type {}; template <> struct is_builtin_deserializable<bool> : std::true_type {}; -template <> struct is_builtin_deserializable<ppc64::ondemand::array> : std::true_type {}; -template <> struct is_builtin_deserializable<ppc64::ondemand::object> : std::true_type {}; -template <> struct is_builtin_deserializable<ppc64::ondemand::value> : std::true_type {}; -template <> struct is_builtin_deserializable<ppc64::ondemand::raw_json_string> : std::true_type {}; +template <> struct is_builtin_deserializable<westmere::ondemand::array> : std::true_type {}; +template <> struct is_builtin_deserializable<westmere::ondemand::object> : std::true_type {}; +template <> struct is_builtin_deserializable<westmere::ondemand::value> : std::true_type {}; +template <> struct is_builtin_deserializable<westmere::ondemand::raw_json_string> : std::true_type {}; template <> struct is_builtin_deserializable<std::string_view> : std::true_type {}; template <typename T> concept is_builtin_deserializable_v = is_builtin_deserializable<T>::value; -template <typename T, typename ValT = ppc64::ondemand::value> +template <typename T, typename ValT = westmere::ondemand::value> concept custom_deserializable = tag_invocable<deserialize_tag, ValT&, T&>; -template <typename T, typename ValT = ppc64::ondemand::value> +template <typename T, typename ValT = westmere::ondemand::value> concept deserializable = custom_deserializable<T, ValT> || is_builtin_deserializable_v<T> || concepts::optional_type<T>; -template <typename T, typename ValT = ppc64::ondemand::value> +template <typename T, typename ValT = westmere::ondemand::value> concept nothrow_custom_deserializable = nothrow_tag_invocable<deserialize_tag, ValT&, T&>; // built-in types are noexcept and if an error happens, the value simply gets ignored and the error is returned. -template <typename T, typename ValT = ppc64::ondemand::value> +template <typename T, typename ValT = westmere::ondemand::value> concept nothrow_deserializable = nothrow_custom_deserializable<T, ValT> || is_builtin_deserializable_v<T>; /// Deserialize Tag inline constexpr struct deserialize_tag { - using array_type = ppc64::ondemand::array; - using object_type = ppc64::ondemand::object; - using value_type = ppc64::ondemand::value; - using document_type = ppc64::ondemand::document; - using document_reference_type = ppc64::ondemand::document_reference; + using array_type = westmere::ondemand::array; + using object_type = westmere::ondemand::object; + using value_type = westmere::ondemand::value; + using document_type = westmere::ondemand::document; + using document_reference_type = westmere::ondemand::document_reference; // Customization Point for array template <typename T> @@ -93892,9 +130553,9 @@ inline constexpr struct deserialize_tag { #endif // SIMDJSON_ONDEMAND_DESERIALIZE_H #endif // SIMDJSON_SUPPORTS_CONCEPTS -/* end file simdjson/generic/ondemand/deserialize.h for ppc64 */ -/* including simdjson/generic/ondemand/value_iterator.h for ppc64: #include "simdjson/generic/ondemand/value_iterator.h" */ -/* begin file simdjson/generic/ondemand/value_iterator.h for ppc64 */ +/* end file simdjson/generic/ondemand/deserialize.h for westmere */ +/* including simdjson/generic/ondemand/value_iterator.h for westmere: #include "simdjson/generic/ondemand/value_iterator.h" */ +/* begin file simdjson/generic/ondemand/value_iterator.h for westmere */ #ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -93904,7 +130565,7 @@ inline constexpr struct deserialize_tag { /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace ppc64 { +namespace westmere { namespace ondemand { /** @@ -94369,21 +131030,22 @@ class value_iterator { friend class document; friend class object; + friend class object_iterator; friend class array; friend class value; friend class field; }; // value_iterator } // namespace ondemand -} // namespace ppc64 +} // namespace westmere } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<ppc64::ondemand::value_iterator> : public ppc64::implementation_simdjson_result_base<ppc64::ondemand::value_iterator> { +struct simdjson_result<westmere::ondemand::value_iterator> : public westmere::implementation_simdjson_result_base<westmere::ondemand::value_iterator> { public: - simdjson_inline simdjson_result(ppc64::ondemand::value_iterator &&value) noexcept; ///< @private + simdjson_inline simdjson_result(westmere::ondemand::value_iterator &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; }; @@ -94391,9 +131053,9 @@ struct simdjson_result<ppc64::ondemand::value_iterator> : public ppc64::implemen } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_H -/* end file simdjson/generic/ondemand/value_iterator.h for ppc64 */ -/* including simdjson/generic/ondemand/value.h for ppc64: #include "simdjson/generic/ondemand/value.h" */ -/* begin file simdjson/generic/ondemand/value.h for ppc64 */ +/* end file simdjson/generic/ondemand/value_iterator.h for westmere */ +/* including simdjson/generic/ondemand/value.h for westmere: #include "simdjson/generic/ondemand/value.h" */ +/* begin file simdjson/generic/ondemand/value.h for westmere */ #ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -94409,7 +131071,7 @@ struct simdjson_result<ppc64::ondemand::value_iterator> : public ppc64::implemen namespace simdjson { -namespace ppc64 { +namespace westmere { namespace ondemand { /** * An ephemeral JSON value returned during iteration. It is only valid for as long as you do @@ -95123,20 +131785,20 @@ class value { }; } // namespace ondemand -} // namespace ppc64 +} // namespace westmere } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<ppc64::ondemand::value> : public ppc64::implementation_simdjson_result_base<ppc64::ondemand::value> { +struct simdjson_result<westmere::ondemand::value> : public westmere::implementation_simdjson_result_base<westmere::ondemand::value> { public: - simdjson_inline simdjson_result(ppc64::ondemand::value &&value) noexcept; ///< @private + simdjson_inline simdjson_result(westmere::ondemand::value &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; - simdjson_inline simdjson_result<ppc64::ondemand::array> get_array() noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::object> get_object() noexcept; + simdjson_inline simdjson_result<westmere::ondemand::array> get_array() noexcept; + simdjson_inline simdjson_result<westmere::ondemand::object> get_object() noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64() noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64_in_string() noexcept; @@ -95148,7 +131810,7 @@ struct simdjson_result<ppc64::ondemand::value> : public ppc64::implementation_si template <typename string_type> simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result<std::string_view> get_wobbly_string() noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::raw_json_string> get_raw_json_string() noexcept; + simdjson_inline simdjson_result<westmere::ondemand::raw_json_string> get_raw_json_string() noexcept; simdjson_inline simdjson_result<bool> get_bool() noexcept; simdjson_inline simdjson_result<bool> is_null() noexcept; @@ -95159,20 +131821,20 @@ struct simdjson_result<ppc64::ondemand::value> : public ppc64::implementation_si #if SIMDJSON_EXCEPTIONS template <class T> explicit simdjson_inline operator T() noexcept(false); - simdjson_inline operator ppc64::ondemand::array() noexcept(false); - simdjson_inline operator ppc64::ondemand::object() noexcept(false); + simdjson_inline operator westmere::ondemand::array() noexcept(false); + simdjson_inline operator westmere::ondemand::object() noexcept(false); simdjson_inline operator uint64_t() noexcept(false); simdjson_inline operator int64_t() noexcept(false); simdjson_inline operator double() noexcept(false); simdjson_inline operator std::string_view() noexcept(false); - simdjson_inline operator ppc64::ondemand::raw_json_string() noexcept(false); + simdjson_inline operator westmere::ondemand::raw_json_string() noexcept(false); simdjson_inline operator bool() noexcept(false); #endif simdjson_inline simdjson_result<size_t> count_elements() & noexcept; simdjson_inline simdjson_result<size_t> count_fields() & noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::value> at(size_t index) noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::array_iterator> begin() & noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::array_iterator> end() & noexcept; + simdjson_inline simdjson_result<westmere::ondemand::value> at(size_t index) noexcept; + simdjson_inline simdjson_result<westmere::ondemand::array_iterator> begin() & noexcept; + simdjson_inline simdjson_result<westmere::ondemand::array_iterator> end() & noexcept; /** * Look up a field by name on an object (order-sensitive). By order-sensitive, we mean that @@ -95196,9 +131858,9 @@ struct simdjson_result<ppc64::ondemand::value> : public ppc64::implementation_si * @param key The key to look up. * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object. */ - simdjson_inline simdjson_result<ppc64::ondemand::value> find_field(std::string_view key) noexcept; - /** @overload simdjson_inline simdjson_result<ppc64::ondemand::value> find_field(std::string_view key) noexcept; */ - simdjson_inline simdjson_result<ppc64::ondemand::value> find_field(const char *key) noexcept; + simdjson_inline simdjson_result<westmere::ondemand::value> find_field(std::string_view key) noexcept; + /** @overload simdjson_inline simdjson_result<westmere::ondemand::value> find_field(std::string_view key) noexcept; */ + simdjson_inline simdjson_result<westmere::ondemand::value> find_field(const char *key) noexcept; /** * Look up a field by name on an object, without regard to key order. @@ -95210,7 +131872,7 @@ struct simdjson_result<ppc64::ondemand::value> : public ppc64::implementation_si * in question is large. The fact that the extra code is there also bumps the executable size. * * We default operator[] on find_field_unordered() for convenience. - * It is the defaul because it would be highly surprising (and hard to debug) if the + * It is the default because it would be highly surprising (and hard to debug) if the * default behavior failed to look up a field just because it was in the wrong order--and many * APIs assume this. Therefore, you must be explicit if you want to treat objects as out of order. * @@ -95220,14 +131882,14 @@ struct simdjson_result<ppc64::ondemand::value> : public ppc64::implementation_si * @param key The key to look up. * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object. */ - simdjson_inline simdjson_result<ppc64::ondemand::value> find_field_unordered(std::string_view key) noexcept; - /** @overload simdjson_inline simdjson_result<ppc64::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ - simdjson_inline simdjson_result<ppc64::ondemand::value> find_field_unordered(const char *key) noexcept; - /** @overload simdjson_inline simdjson_result<ppc64::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ - simdjson_inline simdjson_result<ppc64::ondemand::value> operator[](std::string_view key) noexcept; - /** @overload simdjson_inline simdjson_result<ppc64::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ - simdjson_inline simdjson_result<ppc64::ondemand::value> operator[](const char *key) noexcept; - simdjson_result<ppc64::ondemand::value> operator[](int) noexcept = delete; + simdjson_inline simdjson_result<westmere::ondemand::value> find_field_unordered(std::string_view key) noexcept; + /** @overload simdjson_inline simdjson_result<westmere::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ + simdjson_inline simdjson_result<westmere::ondemand::value> find_field_unordered(const char *key) noexcept; + /** @overload simdjson_inline simdjson_result<westmere::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ + simdjson_inline simdjson_result<westmere::ondemand::value> operator[](std::string_view key) noexcept; + /** @overload simdjson_inline simdjson_result<westmere::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ + simdjson_inline simdjson_result<westmere::ondemand::value> operator[](const char *key) noexcept; + simdjson_result<westmere::ondemand::value> operator[](int) noexcept = delete; /** * Get the type of this JSON value. It does not validate or consume the value. @@ -95251,13 +131913,13 @@ struct simdjson_result<ppc64::ondemand::value> : public ppc64::implementation_si * better to just call .get_double, .get_string, etc. and check for INCORRECT_TYPE (or just * let it throw an exception). */ - simdjson_inline simdjson_result<ppc64::ondemand::json_type> type() noexcept; + simdjson_inline simdjson_result<westmere::ondemand::json_type> type() noexcept; simdjson_inline simdjson_result<bool> is_scalar() noexcept; simdjson_inline simdjson_result<bool> is_string() noexcept; simdjson_inline simdjson_result<bool> is_negative() noexcept; simdjson_inline simdjson_result<bool> is_integer() noexcept; - simdjson_inline simdjson_result<ppc64::number_type> get_number_type() noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::number> get_number() noexcept; + simdjson_inline simdjson_result<westmere::number_type> get_number_type() noexcept; + simdjson_inline simdjson_result<westmere::ondemand::number> get_number() noexcept; /** @copydoc simdjson_inline std::string_view value::raw_json_token() const noexcept */ simdjson_inline simdjson_result<std::string_view> raw_json_token() noexcept; @@ -95267,17 +131929,17 @@ struct simdjson_result<ppc64::ondemand::value> : public ppc64::implementation_si simdjson_inline simdjson_result<const char *> current_location() noexcept; /** @copydoc simdjson_inline int32_t current_depth() const noexcept */ simdjson_inline simdjson_result<int32_t> current_depth() const noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::value> at_path(std::string_view json_path) noexcept; - simdjson_inline simdjson_result<std::vector<ppc64::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<westmere::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result<westmere::ondemand::value> at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<std::vector<westmere::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; }; } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_H -/* end file simdjson/generic/ondemand/value.h for ppc64 */ -/* including simdjson/generic/ondemand/logger.h for ppc64: #include "simdjson/generic/ondemand/logger.h" */ -/* begin file simdjson/generic/ondemand/logger.h for ppc64 */ +/* end file simdjson/generic/ondemand/value.h for westmere */ +/* including simdjson/generic/ondemand/logger.h for westmere: #include "simdjson/generic/ondemand/logger.h" */ +/* begin file simdjson/generic/ondemand/logger.h for westmere */ #ifndef SIMDJSON_GENERIC_ONDEMAND_LOGGER_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -95286,7 +131948,7 @@ struct simdjson_result<ppc64::ondemand::value> : public ppc64::implementation_si /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace ppc64 { +namespace westmere { namespace ondemand { // Logging should be free unless SIMDJSON_VERBOSE_LOGGING is set. Importantly, it is critical @@ -95332,13 +131994,13 @@ static inline void log_error(const value_iterator &iter, const char *error, cons } // namespace logger } // namespace ondemand -} // namespace ppc64 +} // namespace westmere } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_LOGGER_H -/* end file simdjson/generic/ondemand/logger.h for ppc64 */ -/* including simdjson/generic/ondemand/token_iterator.h for ppc64: #include "simdjson/generic/ondemand/token_iterator.h" */ -/* begin file simdjson/generic/ondemand/token_iterator.h for ppc64 */ +/* end file simdjson/generic/ondemand/logger.h for westmere */ +/* including simdjson/generic/ondemand/token_iterator.h for westmere: #include "simdjson/generic/ondemand/token_iterator.h" */ +/* begin file simdjson/generic/ondemand/token_iterator.h for westmere */ #ifndef SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -95349,7 +132011,7 @@ static inline void log_error(const value_iterator &iter, const char *error, cons /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace ppc64 { +namespace westmere { namespace ondemand { /** @@ -95480,15 +132142,15 @@ class token_iterator { }; } // namespace ondemand -} // namespace ppc64 +} // namespace westmere } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<ppc64::ondemand::token_iterator> : public ppc64::implementation_simdjson_result_base<ppc64::ondemand::token_iterator> { +struct simdjson_result<westmere::ondemand::token_iterator> : public westmere::implementation_simdjson_result_base<westmere::ondemand::token_iterator> { public: - simdjson_inline simdjson_result(ppc64::ondemand::token_iterator &&value) noexcept; ///< @private + simdjson_inline simdjson_result(westmere::ondemand::token_iterator &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; simdjson_inline ~simdjson_result() noexcept = default; ///< @private @@ -95497,9 +132159,9 @@ struct simdjson_result<ppc64::ondemand::token_iterator> : public ppc64::implemen } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_H -/* end file simdjson/generic/ondemand/token_iterator.h for ppc64 */ -/* including simdjson/generic/ondemand/json_iterator.h for ppc64: #include "simdjson/generic/ondemand/json_iterator.h" */ -/* begin file simdjson/generic/ondemand/json_iterator.h for ppc64 */ +/* end file simdjson/generic/ondemand/token_iterator.h for westmere */ +/* including simdjson/generic/ondemand/json_iterator.h for westmere: #include "simdjson/generic/ondemand/json_iterator.h" */ +/* begin file simdjson/generic/ondemand/json_iterator.h for westmere */ #ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -95510,7 +132172,7 @@ struct simdjson_result<ppc64::ondemand::token_iterator> : public ppc64::implemen /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace ppc64 { +namespace westmere { namespace ondemand { /** @@ -95821,15 +132483,15 @@ class json_iterator { }; // json_iterator } // namespace ondemand -} // namespace ppc64 +} // namespace westmere } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<ppc64::ondemand::json_iterator> : public ppc64::implementation_simdjson_result_base<ppc64::ondemand::json_iterator> { +struct simdjson_result<westmere::ondemand::json_iterator> : public westmere::implementation_simdjson_result_base<westmere::ondemand::json_iterator> { public: - simdjson_inline simdjson_result(ppc64::ondemand::json_iterator &&value) noexcept; ///< @private + simdjson_inline simdjson_result(westmere::ondemand::json_iterator &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; @@ -95838,9 +132500,9 @@ struct simdjson_result<ppc64::ondemand::json_iterator> : public ppc64::implement } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_H -/* end file simdjson/generic/ondemand/json_iterator.h for ppc64 */ -/* including simdjson/generic/ondemand/json_type.h for ppc64: #include "simdjson/generic/ondemand/json_type.h" */ -/* begin file simdjson/generic/ondemand/json_type.h for ppc64 */ +/* end file simdjson/generic/ondemand/json_iterator.h for westmere */ +/* including simdjson/generic/ondemand/json_type.h for westmere: #include "simdjson/generic/ondemand/json_type.h" */ +/* begin file simdjson/generic/ondemand/json_type.h for westmere */ #ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -95851,7 +132513,7 @@ struct simdjson_result<ppc64::ondemand::json_iterator> : public ppc64::implement /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace ppc64 { +namespace westmere { namespace ondemand { /** @@ -95985,15 +132647,15 @@ inline std::ostream& operator<<(std::ostream& out, simdjson_result<json_type> &t #endif } // namespace ondemand -} // namespace ppc64 +} // namespace westmere } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<ppc64::ondemand::json_type> : public ppc64::implementation_simdjson_result_base<ppc64::ondemand::json_type> { +struct simdjson_result<westmere::ondemand::json_type> : public westmere::implementation_simdjson_result_base<westmere::ondemand::json_type> { public: - simdjson_inline simdjson_result(ppc64::ondemand::json_type &&value) noexcept; ///< @private + simdjson_inline simdjson_result(westmere::ondemand::json_type &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; simdjson_inline ~simdjson_result() noexcept = default; ///< @private @@ -96002,9 +132664,9 @@ struct simdjson_result<ppc64::ondemand::json_type> : public ppc64::implementatio } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_H -/* end file simdjson/generic/ondemand/json_type.h for ppc64 */ -/* including simdjson/generic/ondemand/raw_json_string.h for ppc64: #include "simdjson/generic/ondemand/raw_json_string.h" */ -/* begin file simdjson/generic/ondemand/raw_json_string.h for ppc64 */ +/* end file simdjson/generic/ondemand/json_type.h for westmere */ +/* including simdjson/generic/ondemand/raw_json_string.h for westmere: #include "simdjson/generic/ondemand/raw_json_string.h" */ +/* begin file simdjson/generic/ondemand/raw_json_string.h for westmere */ #ifndef SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -96014,7 +132676,7 @@ struct simdjson_result<ppc64::ondemand::json_type> : public ppc64::implementatio /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace ppc64 { +namespace westmere { namespace ondemand { /** @@ -96196,30 +132858,30 @@ simdjson_unused simdjson_inline bool operator!=(std::string_view c, const raw_js } // namespace ondemand -} // namespace ppc64 +} // namespace westmere } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<ppc64::ondemand::raw_json_string> : public ppc64::implementation_simdjson_result_base<ppc64::ondemand::raw_json_string> { +struct simdjson_result<westmere::ondemand::raw_json_string> : public westmere::implementation_simdjson_result_base<westmere::ondemand::raw_json_string> { public: - simdjson_inline simdjson_result(ppc64::ondemand::raw_json_string &&value) noexcept; ///< @private + simdjson_inline simdjson_result(westmere::ondemand::raw_json_string &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; simdjson_inline ~simdjson_result() noexcept = default; ///< @private simdjson_inline simdjson_result<const char *> raw() const noexcept; simdjson_inline char operator[](size_t) const noexcept; - simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> unescape(ppc64::ondemand::json_iterator &iter, bool allow_replacement) const noexcept; - simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> unescape_wobbly(ppc64::ondemand::json_iterator &iter) const noexcept; + simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> unescape(westmere::ondemand::json_iterator &iter, bool allow_replacement) const noexcept; + simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> unescape_wobbly(westmere::ondemand::json_iterator &iter) const noexcept; }; } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_H -/* end file simdjson/generic/ondemand/raw_json_string.h for ppc64 */ -/* including simdjson/generic/ondemand/parser.h for ppc64: #include "simdjson/generic/ondemand/parser.h" */ -/* begin file simdjson/generic/ondemand/parser.h for ppc64 */ +/* end file simdjson/generic/ondemand/raw_json_string.h for westmere */ +/* including simdjson/generic/ondemand/parser.h for westmere: #include "simdjson/generic/ondemand/parser.h" */ +/* begin file simdjson/generic/ondemand/parser.h for westmere */ #ifndef SIMDJSON_GENERIC_ONDEMAND_PARSER_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -96232,7 +132894,7 @@ struct simdjson_result<ppc64::ondemand::raw_json_string> : public ppc64::impleme #include <thread> namespace simdjson { -namespace ppc64 { +namespace westmere { namespace ondemand { /** @@ -96632,15 +133294,15 @@ class parser { }; } // namespace ondemand -} // namespace ppc64 +} // namespace westmere } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<ppc64::ondemand::parser> : public ppc64::implementation_simdjson_result_base<ppc64::ondemand::parser> { +struct simdjson_result<westmere::ondemand::parser> : public westmere::implementation_simdjson_result_base<westmere::ondemand::parser> { public: - simdjson_inline simdjson_result(ppc64::ondemand::parser &&value) noexcept; ///< @private + simdjson_inline simdjson_result(westmere::ondemand::parser &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; }; @@ -96648,319 +133310,11 @@ struct simdjson_result<ppc64::ondemand::parser> : public ppc64::implementation_s } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_PARSER_H -/* end file simdjson/generic/ondemand/parser.h for ppc64 */ - -// JSON builder - needed for extract_into functionality -/* including simdjson/generic/ondemand/json_string_builder.h for ppc64: #include "simdjson/generic/ondemand/json_string_builder.h" */ -/* begin file simdjson/generic/ondemand/json_string_builder.h for ppc64 */ -/** - * This file is part of the builder API. It is temporarily in the ondemand directory - * but we will move it to a builder directory later. - */ -#ifndef SIMDJSON_GENERIC_STRING_BUILDER_H - -/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_H */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */ -/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ - -namespace simdjson { - - -#if SIMDJSON_SUPPORTS_CONCEPTS - -namespace ppc64 { -namespace builder { - class string_builder; -}} - -template <typename T, typename = void> -struct has_custom_serialization : std::false_type {}; - -inline constexpr struct serialize_tag { - template <typename T> - constexpr void operator()(ppc64::builder::string_builder& b, T&& obj) const{ - return tag_invoke(*this, b, std::forward<T>(obj)); - } - - -} serialize{}; -template <typename T> -struct has_custom_serialization<T, std::void_t< - decltype(tag_invoke(serialize, std::declval<ppc64::builder::string_builder&>(), std::declval<T&>())) ->> : std::true_type {}; - -template <typename T> -constexpr bool require_custom_serialization = has_custom_serialization<T>::value; -#else -struct has_custom_serialization : std::false_type {}; -#endif // SIMDJSON_SUPPORTS_CONCEPTS - -namespace ppc64 { -namespace builder { -/** - * A builder for JSON strings representing documents. This is a low-level - * builder that is not meant to be used directly by end-users. Though it - * supports atomic types (Booleans, strings), it does not support composed - * types (arrays and objects). - * - * Ultimately, this class can support kernel-specific optimizations. E.g., - * it may make use of SIMD instructions to escape strings faster. - */ -class string_builder { -public: - simdjson_inline string_builder(size_t initial_capacity = DEFAULT_INITIAL_CAPACITY); - - static constexpr size_t DEFAULT_INITIAL_CAPACITY = 1024; - - /** - * Append number (includes Booleans). Booleans are mapped to the strings - * false and true. Numbers are converted to strings abiding by the JSON standard. - * Floating-point numbers are converted to the shortest string that 'correctly' - * represents the number. - */ - template<typename number_type, - typename = typename std::enable_if<std::is_arithmetic<number_type>::value>::type> - simdjson_inline void append(number_type v) noexcept; - - /** - * Append character c. - */ - simdjson_inline void append(char c) noexcept; - - /** - * Append the string 'null'. - */ - simdjson_inline void append_null() noexcept; - - /** - * Clear the content. - */ - simdjson_inline void clear() noexcept; - - /** - * Append the std::string_view, after escaping it. - * There is no UTF-8 validation. - */ - simdjson_inline void escape_and_append(std::string_view input) noexcept; - - /** - * Append the std::string_view surrounded by double quotes, after escaping it. - * There is no UTF-8 validation. - */ - simdjson_inline void escape_and_append_with_quotes(std::string_view input) noexcept; -#if SIMDJSON_SUPPORTS_CONCEPTS - template<constevalutil::fixed_string key> - simdjson_inline void escape_and_append_with_quotes() noexcept; -#endif - /** - * Append the character surrounded by double quotes, after escaping it. - * There is no UTF-8 validation. - */ - simdjson_inline void escape_and_append_with_quotes(char input) noexcept; - - /** - * Append the character surrounded by double quotes, after escaping it. - * There is no UTF-8 validation. - */ - simdjson_inline void escape_and_append_with_quotes(const char* input) noexcept; - - /** - * Append the C string directly, without escaping. - * There is no UTF-8 validation. - */ - simdjson_inline void append_raw(const char *c) noexcept; - - /** - * Append "{" to the buffer. - */ - simdjson_inline void start_object() noexcept; - - /** - * Append "}" to the buffer. - */ - simdjson_inline void end_object() noexcept; - - /** - * Append "[" to the buffer. - */ - simdjson_inline void start_array() noexcept; - - /** - * Append "]" to the buffer. - */ - simdjson_inline void end_array() noexcept; - - /** - * Append "," to the buffer. - */ - simdjson_inline void append_comma() noexcept; - - /** - * Append ":" to the buffer. - */ - simdjson_inline void append_colon() noexcept; - - /** - * Append a key-value pair to the buffer. - * The key is escaped and surrounded by double quotes. - * The value is escaped if it is a string. - */ - template<typename key_type, typename value_type> - simdjson_inline void append_key_value(key_type key, value_type value) noexcept; -#if SIMDJSON_SUPPORTS_CONCEPTS - template<constevalutil::fixed_string key, typename value_type> - simdjson_inline void append_key_value(value_type value) noexcept; - - // Support for optional types (std::optional, etc.) - template <concepts::optional_type T> - requires(!require_custom_serialization<T>) - simdjson_inline void append(const T &opt); - - template <typename T> - requires(require_custom_serialization<T>) - simdjson_inline void append(T &&val); - - // Support for string-like types - template <typename T> - requires(std::is_convertible<T, std::string_view>::value || - std::is_same<T, const char*>::value ) - simdjson_inline void append(const T &value); -#endif -#if SIMDJSON_SUPPORTS_RANGES && SIMDJSON_SUPPORTS_CONCEPTS - // Support for range-based appending (std::ranges::view, etc.) - template <std::ranges::range R> -requires (!std::is_convertible<R, std::string_view>::value && !require_custom_serialization<R>) - simdjson_inline void append(const R &range) noexcept; -#endif - /** - * Append the std::string_view directly, without escaping. - * There is no UTF-8 validation. - */ - simdjson_inline void append_raw(std::string_view input) noexcept; - - /** - * Append len characters from str. - * There is no UTF-8 validation. - */ - simdjson_inline void append_raw(const char *str, size_t len) noexcept; -#if SIMDJSON_EXCEPTIONS - /** - * Creates an std::string from the written JSON buffer. - * Throws if memory allocation failed - * - * The result may not be valid UTF-8 if some of your content was not valid UTF-8. - * Use validate_unicode() to check the content if needed. - */ - simdjson_inline operator std::string() const noexcept(false); - - /** - * Creates an std::string_view from the written JSON buffer. - * Throws if memory allocation failed. - * - * The result may not be valid UTF-8 if some of your content was not valid UTF-8. - * Use validate_unicode() to check the content if needed. - */ - simdjson_inline operator std::string_view() const noexcept(false) simdjson_lifetime_bound; -#endif - - /** - * Returns a view on the written JSON buffer. Returns an error - * if memory allocation failed. - * - * The result may not be valid UTF-8 if some of your content was not valid UTF-8. - * Use validate_unicode() to check the content. - */ - simdjson_inline simdjson_result<std::string_view> view() const noexcept; - - /** - * Appends the null character to the buffer and returns - * a pointer to the beginning of the written JSON buffer. - * Returns an error if memory allocation failed. - * The result is null-terminated. - * - * The result may not be valid UTF-8 if some of your content was not valid UTF-8. - * Use validate_unicode() to check the content. - */ - simdjson_inline simdjson_result<const char *> c_str() noexcept; - - /** - * Return true if the content is valid UTF-8. - */ - simdjson_inline bool validate_unicode() const noexcept; - - /** - * Returns the current size of the written JSON buffer. - * If an error occurred, returns 0. - */ - simdjson_inline size_t size() const noexcept; - -private: - /** - * Returns true if we can write at least upcoming_bytes bytes. - * The underlying buffer is reallocated if needed. It is designed - * to be called before writing to the buffer. It should be fast. - */ - simdjson_inline bool capacity_check(size_t upcoming_bytes); - - /** - * Grow the buffer to at least desired_capacity bytes. - * If the allocation fails, is_valid is set to false. We expect - * that this function would not be repeatedly called. - */ - simdjson_inline void grow_buffer(size_t desired_capacity); - - /** - * We use this helper function to make sure that is_valid is kept consistent. - */ - simdjson_inline void set_valid(bool valid) noexcept; - - std::unique_ptr<char[]> buffer{}; - size_t position{0}; - size_t capacity{0}; - bool is_valid{true}; -}; - - - -} -} - - -#if !SIMDJSON_STATIC_REFLECTION -// fallback implementation until we have static reflection -template <class Z> -simdjson_warn_unused simdjson_result<std::string> to_json(const Z &z, size_t initial_capacity = simdjson::ppc64::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { - simdjson::ppc64::builder::string_builder b(initial_capacity); - b.append(z); - std::string_view s; - auto e = b.view().get(s); - if(e) { return e; } - return std::string(s); -} -template <class Z> -simdjson_warn_unused simdjson_error to_json(const Z &z, std::string &s, size_t initial_capacity = simdjson::ppc64::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { - simdjson::ppc64::builder::string_builder b(initial_capacity); - b.append(z); - std::string_view sv; - auto e = b.view().get(sv); - if(e) { return e; } - s.assign(sv.data(), sv.size()); - return simdjson::SUCCESS; -} -#endif - -#if SIMDJSON_SUPPORTS_CONCEPTS -#endif // SIMDJSON_SUPPORTS_CONCEPTS - -} // namespace simdjson - -#endif // SIMDJSON_GENERIC_STRING_BUILDER_H -/* end file simdjson/generic/ondemand/json_string_builder.h for ppc64 */ +/* end file simdjson/generic/ondemand/parser.h for westmere */ // All other declarations -/* including simdjson/generic/ondemand/array.h for ppc64: #include "simdjson/generic/ondemand/array.h" */ -/* begin file simdjson/generic/ondemand/array.h for ppc64 */ +/* including simdjson/generic/ondemand/array.h for westmere: #include "simdjson/generic/ondemand/array.h" */ +/* begin file simdjson/generic/ondemand/array.h for westmere */ #ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -96972,7 +133326,7 @@ simdjson_warn_unused simdjson_error to_json(const Z &z, std::string &s, size_t i /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace ppc64 { +namespace westmere { namespace ondemand { /** @@ -97192,27 +133546,27 @@ class array { }; } // namespace ondemand -} // namespace ppc64 +} // namespace westmere } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<ppc64::ondemand::array> : public ppc64::implementation_simdjson_result_base<ppc64::ondemand::array> { +struct simdjson_result<westmere::ondemand::array> : public westmere::implementation_simdjson_result_base<westmere::ondemand::array> { public: - simdjson_inline simdjson_result(ppc64::ondemand::array &&value) noexcept; ///< @private + simdjson_inline simdjson_result(westmere::ondemand::array &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; - simdjson_inline simdjson_result<ppc64::ondemand::array_iterator> begin() noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::array_iterator> end() noexcept; + simdjson_inline simdjson_result<westmere::ondemand::array_iterator> begin() noexcept; + simdjson_inline simdjson_result<westmere::ondemand::array_iterator> end() noexcept; inline simdjson_result<size_t> count_elements() & noexcept; inline simdjson_result<bool> is_empty() & noexcept; inline simdjson_result<bool> reset() & noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::value> at(size_t index) noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::value> at_path(std::string_view json_path) noexcept; - simdjson_inline simdjson_result<std::vector<ppc64::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<westmere::ondemand::value> at(size_t index) noexcept; + simdjson_inline simdjson_result<westmere::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result<westmere::ondemand::value> at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<std::vector<westmere::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; simdjson_inline simdjson_result<std::string_view> raw_json() noexcept; #if SIMDJSON_SUPPORTS_CONCEPTS // TODO: move this code into object-inl.h @@ -97220,7 +133574,7 @@ struct simdjson_result<ppc64::ondemand::array> : public ppc64::implementation_si template<typename T> simdjson_inline simdjson_result<T> get() noexcept { if (error()) { return error(); } - if constexpr (std::is_same_v<T, ppc64::ondemand::array>) { + if constexpr (std::is_same_v<T, westmere::ondemand::array>) { return first; } return first.get<T>(); @@ -97228,7 +133582,7 @@ struct simdjson_result<ppc64::ondemand::array> : public ppc64::implementation_si template<typename T> simdjson_warn_unused simdjson_inline error_code get(T& out) noexcept { if (error()) { return error(); } - if constexpr (std::is_same_v<T, ppc64::ondemand::array>) { + if constexpr (std::is_same_v<T, westmere::ondemand::array>) { out = first; } else { SIMDJSON_TRY( first.get<T>(out) ); @@ -97241,13 +133595,14 @@ struct simdjson_result<ppc64::ondemand::array> : public ppc64::implementation_si } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_H -/* end file simdjson/generic/ondemand/array.h for ppc64 */ -/* including simdjson/generic/ondemand/array_iterator.h for ppc64: #include "simdjson/generic/ondemand/array_iterator.h" */ -/* begin file simdjson/generic/ondemand/array_iterator.h for ppc64 */ +/* end file simdjson/generic/ondemand/array.h for westmere */ +/* including simdjson/generic/ondemand/array_iterator.h for westmere: #include "simdjson/generic/ondemand/array_iterator.h" */ +/* begin file simdjson/generic/ondemand/array_iterator.h for westmere */ #ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ /* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H */ +/* amalgamation skipped (editor-only): #include <iterator> */ /* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */ @@ -97255,7 +133610,7 @@ struct simdjson_result<ppc64::ondemand::array> : public ppc64::implementation_si namespace simdjson { -namespace ppc64 { +namespace westmere { namespace ondemand { /** @@ -97263,11 +133618,17 @@ namespace ondemand { * * This is an input_iterator, meaning: * - It is forward-only - * - * must be called exactly once per element. + * - * must be called at most once per element. * - ++ must be called exactly once in between each * (*, ++, *, ++, * ...) */ class array_iterator { public: + using iterator_category = std::input_iterator_tag; + using value_type = simdjson_result<value>; + using difference_type = std::ptrdiff_t; + using pointer = void; + using reference = value_type; + /** Create a new, invalid array iterator. */ simdjson_inline array_iterator() noexcept = default; @@ -97311,6 +133672,9 @@ class array_iterator { simdjson_warn_unused simdjson_inline bool at_end() const noexcept; private: +#if SIMDJSON_DEVELOPMENT_CHECKS + bool has_been_referenced{false}; +#endif value_iterator iter{}; simdjson_inline array_iterator(const value_iterator &iter) noexcept; @@ -97321,14 +133685,20 @@ class array_iterator { }; } // namespace ondemand -} // namespace ppc64 +} // namespace westmere } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<ppc64::ondemand::array_iterator> : public ppc64::implementation_simdjson_result_base<ppc64::ondemand::array_iterator> { - simdjson_inline simdjson_result(ppc64::ondemand::array_iterator &&value) noexcept; ///< @private +struct simdjson_result<westmere::ondemand::array_iterator> : public westmere::implementation_simdjson_result_base<westmere::ondemand::array_iterator> { + using iterator_category = std::input_iterator_tag; + using value_type = simdjson_result<westmere::ondemand::value>; + using difference_type = std::ptrdiff_t; + using pointer = void; + using reference = value_type; + + simdjson_inline simdjson_result(westmere::ondemand::array_iterator &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; @@ -97336,10 +133706,10 @@ struct simdjson_result<ppc64::ondemand::array_iterator> : public ppc64::implemen // Iterator interface // - simdjson_inline simdjson_result<ppc64::ondemand::value> operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. - simdjson_inline bool operator==(const simdjson_result<ppc64::ondemand::array_iterator> &) const noexcept; - simdjson_inline bool operator!=(const simdjson_result<ppc64::ondemand::array_iterator> &) const noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::array_iterator> &operator++() noexcept; + simdjson_inline simdjson_result<westmere::ondemand::value> operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. + simdjson_inline bool operator==(const simdjson_result<westmere::ondemand::array_iterator> &) const noexcept; + simdjson_inline bool operator!=(const simdjson_result<westmere::ondemand::array_iterator> &) const noexcept; + simdjson_inline simdjson_result<westmere::ondemand::array_iterator> &operator++() noexcept; simdjson_warn_unused simdjson_inline bool at_end() const noexcept; }; @@ -97347,9 +133717,9 @@ struct simdjson_result<ppc64::ondemand::array_iterator> : public ppc64::implemen } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H -/* end file simdjson/generic/ondemand/array_iterator.h for ppc64 */ -/* including simdjson/generic/ondemand/document.h for ppc64: #include "simdjson/generic/ondemand/document.h" */ -/* begin file simdjson/generic/ondemand/document.h for ppc64 */ +/* end file simdjson/generic/ondemand/array_iterator.h for westmere */ +/* including simdjson/generic/ondemand/document.h for westmere: #include "simdjson/generic/ondemand/document.h" */ +/* begin file simdjson/generic/ondemand/document.h for westmere */ #ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -97363,7 +133733,7 @@ struct simdjson_result<ppc64::ondemand::array_iterator> : public ppc64::implemen namespace simdjson { -namespace ppc64 { +namespace westmere { namespace ondemand { /** @@ -98315,21 +134685,21 @@ class document_reference { document *doc{nullptr}; }; } // namespace ondemand -} // namespace ppc64 +} // namespace westmere } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<ppc64::ondemand::document> : public ppc64::implementation_simdjson_result_base<ppc64::ondemand::document> { +struct simdjson_result<westmere::ondemand::document> : public westmere::implementation_simdjson_result_base<westmere::ondemand::document> { public: - simdjson_inline simdjson_result(ppc64::ondemand::document &&value) noexcept; ///< @private + simdjson_inline simdjson_result(westmere::ondemand::document &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; simdjson_inline error_code rewind() noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::array> get_array() & noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::object> get_object() & noexcept; + simdjson_inline simdjson_result<westmere::ondemand::array> get_array() & noexcept; + simdjson_inline simdjson_result<westmere::ondemand::object> get_object() & noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64() noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64_in_string() noexcept; simdjson_inline simdjson_result<int64_t> get_int64() noexcept; @@ -98340,9 +134710,9 @@ struct simdjson_result<ppc64::ondemand::document> : public ppc64::implementation template <typename string_type> simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result<std::string_view> get_wobbly_string() noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::raw_json_string> get_raw_json_string() noexcept; + simdjson_inline simdjson_result<westmere::ondemand::raw_json_string> get_raw_json_string() noexcept; simdjson_inline simdjson_result<bool> get_bool() noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::value> get_value() noexcept; + simdjson_inline simdjson_result<westmere::ondemand::value> get_value() noexcept; simdjson_inline simdjson_result<bool> is_null() noexcept; template<typename T> simdjson_inline simdjson_result<T> get() & noexcept; @@ -98352,33 +134722,33 @@ struct simdjson_result<ppc64::ondemand::document> : public ppc64::implementation template<typename T> simdjson_inline error_code get(T &out) && noexcept; #if SIMDJSON_EXCEPTIONS - using ppc64::implementation_simdjson_result_base<ppc64::ondemand::document>::operator*; - using ppc64::implementation_simdjson_result_base<ppc64::ondemand::document>::operator->; - template <class T, typename std::enable_if<std::is_same<T, ppc64::ondemand::document>::value == false>::type> + using westmere::implementation_simdjson_result_base<westmere::ondemand::document>::operator*; + using westmere::implementation_simdjson_result_base<westmere::ondemand::document>::operator->; + template <class T, typename std::enable_if<std::is_same<T, westmere::ondemand::document>::value == false>::type> explicit simdjson_inline operator T() noexcept(false); - simdjson_inline operator ppc64::ondemand::array() & noexcept(false); - simdjson_inline operator ppc64::ondemand::object() & noexcept(false); + simdjson_inline operator westmere::ondemand::array() & noexcept(false); + simdjson_inline operator westmere::ondemand::object() & noexcept(false); simdjson_inline operator uint64_t() noexcept(false); simdjson_inline operator int64_t() noexcept(false); simdjson_inline operator double() noexcept(false); simdjson_inline operator std::string_view() noexcept(false); - simdjson_inline operator ppc64::ondemand::raw_json_string() noexcept(false); + simdjson_inline operator westmere::ondemand::raw_json_string() noexcept(false); simdjson_inline operator bool() noexcept(false); - simdjson_inline operator ppc64::ondemand::value() noexcept(false); + simdjson_inline operator westmere::ondemand::value() noexcept(false); #endif simdjson_inline simdjson_result<size_t> count_elements() & noexcept; simdjson_inline simdjson_result<size_t> count_fields() & noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::value> at(size_t index) & noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::array_iterator> begin() & noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::array_iterator> end() & noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::value> find_field(std::string_view key) & noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::value> find_field(const char *key) & noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::value> operator[](std::string_view key) & noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::value> operator[](const char *key) & noexcept; - simdjson_result<ppc64::ondemand::value> operator[](int) & noexcept = delete; - simdjson_inline simdjson_result<ppc64::ondemand::value> find_field_unordered(std::string_view key) & noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::value> find_field_unordered(const char *key) & noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::json_type> type() noexcept; + simdjson_inline simdjson_result<westmere::ondemand::value> at(size_t index) & noexcept; + simdjson_inline simdjson_result<westmere::ondemand::array_iterator> begin() & noexcept; + simdjson_inline simdjson_result<westmere::ondemand::array_iterator> end() & noexcept; + simdjson_inline simdjson_result<westmere::ondemand::value> find_field(std::string_view key) & noexcept; + simdjson_inline simdjson_result<westmere::ondemand::value> find_field(const char *key) & noexcept; + simdjson_inline simdjson_result<westmere::ondemand::value> operator[](std::string_view key) & noexcept; + simdjson_inline simdjson_result<westmere::ondemand::value> operator[](const char *key) & noexcept; + simdjson_result<westmere::ondemand::value> operator[](int) & noexcept = delete; + simdjson_inline simdjson_result<westmere::ondemand::value> find_field_unordered(std::string_view key) & noexcept; + simdjson_inline simdjson_result<westmere::ondemand::value> find_field_unordered(const char *key) & noexcept; + simdjson_inline simdjson_result<westmere::ondemand::json_type> type() noexcept; simdjson_inline simdjson_result<bool> is_scalar() noexcept; simdjson_inline simdjson_result<bool> is_string() noexcept; simdjson_inline simdjson_result<const char *> current_location() noexcept; @@ -98386,14 +134756,14 @@ struct simdjson_result<ppc64::ondemand::document> : public ppc64::implementation simdjson_inline bool at_end() const noexcept; simdjson_inline bool is_negative() noexcept; simdjson_inline simdjson_result<bool> is_integer() noexcept; - simdjson_inline simdjson_result<ppc64::number_type> get_number_type() noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::number> get_number() noexcept; + simdjson_inline simdjson_result<westmere::number_type> get_number_type() noexcept; + simdjson_inline simdjson_result<westmere::ondemand::number> get_number() noexcept; /** @copydoc simdjson_inline std::string_view document::raw_json_token() const noexcept */ simdjson_inline simdjson_result<std::string_view> raw_json_token() noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::value> at_path(std::string_view json_path) noexcept; - simdjson_inline simdjson_result<std::vector<ppc64::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<westmere::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result<westmere::ondemand::value> at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<std::vector<westmere::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; #if SIMDJSON_STATIC_REFLECTION template<constevalutil::fixed_string... FieldNames, typename T> requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) @@ -98409,14 +134779,14 @@ struct simdjson_result<ppc64::ondemand::document> : public ppc64::implementation namespace simdjson { template<> -struct simdjson_result<ppc64::ondemand::document_reference> : public ppc64::implementation_simdjson_result_base<ppc64::ondemand::document_reference> { +struct simdjson_result<westmere::ondemand::document_reference> : public westmere::implementation_simdjson_result_base<westmere::ondemand::document_reference> { public: - simdjson_inline simdjson_result(ppc64::ondemand::document_reference value, error_code error) noexcept; + simdjson_inline simdjson_result(westmere::ondemand::document_reference value, error_code error) noexcept; simdjson_inline simdjson_result() noexcept = default; simdjson_inline error_code rewind() noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::array> get_array() & noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::object> get_object() & noexcept; + simdjson_inline simdjson_result<westmere::ondemand::array> get_array() & noexcept; + simdjson_inline simdjson_result<westmere::ondemand::object> get_object() & noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64() noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64_in_string() noexcept; simdjson_inline simdjson_result<int64_t> get_int64() noexcept; @@ -98427,9 +134797,9 @@ struct simdjson_result<ppc64::ondemand::document_reference> : public ppc64::impl template <typename string_type> simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result<std::string_view> get_wobbly_string() noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::raw_json_string> get_raw_json_string() noexcept; + simdjson_inline simdjson_result<westmere::ondemand::raw_json_string> get_raw_json_string() noexcept; simdjson_inline simdjson_result<bool> get_bool() noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::value> get_value() noexcept; + simdjson_inline simdjson_result<westmere::ondemand::value> get_value() noexcept; simdjson_inline simdjson_result<bool> is_null() noexcept; template<typename T> simdjson_inline simdjson_result<T> get() & noexcept; @@ -98440,43 +134810,43 @@ struct simdjson_result<ppc64::ondemand::document_reference> : public ppc64::impl #if SIMDJSON_EXCEPTIONS template <class T> explicit simdjson_inline operator T() noexcept(false); - simdjson_inline operator ppc64::ondemand::array() & noexcept(false); - simdjson_inline operator ppc64::ondemand::object() & noexcept(false); + simdjson_inline operator westmere::ondemand::array() & noexcept(false); + simdjson_inline operator westmere::ondemand::object() & noexcept(false); simdjson_inline operator uint64_t() noexcept(false); simdjson_inline operator int64_t() noexcept(false); simdjson_inline operator double() noexcept(false); simdjson_inline operator std::string_view() noexcept(false); - simdjson_inline operator ppc64::ondemand::raw_json_string() noexcept(false); + simdjson_inline operator westmere::ondemand::raw_json_string() noexcept(false); simdjson_inline operator bool() noexcept(false); - simdjson_inline operator ppc64::ondemand::value() noexcept(false); + simdjson_inline operator westmere::ondemand::value() noexcept(false); #endif simdjson_inline simdjson_result<size_t> count_elements() & noexcept; simdjson_inline simdjson_result<size_t> count_fields() & noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::value> at(size_t index) & noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::array_iterator> begin() & noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::array_iterator> end() & noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::value> find_field(std::string_view key) & noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::value> find_field(const char *key) & noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::value> operator[](std::string_view key) & noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::value> operator[](const char *key) & noexcept; - simdjson_result<ppc64::ondemand::value> operator[](int) & noexcept = delete; - simdjson_inline simdjson_result<ppc64::ondemand::value> find_field_unordered(std::string_view key) & noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::value> find_field_unordered(const char *key) & noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::json_type> type() noexcept; + simdjson_inline simdjson_result<westmere::ondemand::value> at(size_t index) & noexcept; + simdjson_inline simdjson_result<westmere::ondemand::array_iterator> begin() & noexcept; + simdjson_inline simdjson_result<westmere::ondemand::array_iterator> end() & noexcept; + simdjson_inline simdjson_result<westmere::ondemand::value> find_field(std::string_view key) & noexcept; + simdjson_inline simdjson_result<westmere::ondemand::value> find_field(const char *key) & noexcept; + simdjson_inline simdjson_result<westmere::ondemand::value> operator[](std::string_view key) & noexcept; + simdjson_inline simdjson_result<westmere::ondemand::value> operator[](const char *key) & noexcept; + simdjson_result<westmere::ondemand::value> operator[](int) & noexcept = delete; + simdjson_inline simdjson_result<westmere::ondemand::value> find_field_unordered(std::string_view key) & noexcept; + simdjson_inline simdjson_result<westmere::ondemand::value> find_field_unordered(const char *key) & noexcept; + simdjson_inline simdjson_result<westmere::ondemand::json_type> type() noexcept; simdjson_inline simdjson_result<bool> is_scalar() noexcept; simdjson_inline simdjson_result<bool> is_string() noexcept; simdjson_inline simdjson_result<const char *> current_location() noexcept; simdjson_inline simdjson_result<int32_t> current_depth() const noexcept; simdjson_inline simdjson_result<bool> is_negative() noexcept; simdjson_inline simdjson_result<bool> is_integer() noexcept; - simdjson_inline simdjson_result<ppc64::number_type> get_number_type() noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::number> get_number() noexcept; + simdjson_inline simdjson_result<westmere::number_type> get_number_type() noexcept; + simdjson_inline simdjson_result<westmere::ondemand::number> get_number() noexcept; /** @copydoc simdjson_inline std::string_view document_reference::raw_json_token() const noexcept */ simdjson_inline simdjson_result<std::string_view> raw_json_token() noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::value> at_path(std::string_view json_path) noexcept; - simdjson_inline simdjson_result<std::vector<ppc64::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<westmere::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result<westmere::ondemand::value> at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<std::vector<westmere::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; #if SIMDJSON_STATIC_REFLECTION template<constevalutil::fixed_string... FieldNames, typename T> requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) @@ -98488,9 +134858,9 @@ struct simdjson_result<ppc64::ondemand::document_reference> : public ppc64::impl } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_H -/* end file simdjson/generic/ondemand/document.h for ppc64 */ -/* including simdjson/generic/ondemand/document_stream.h for ppc64: #include "simdjson/generic/ondemand/document_stream.h" */ -/* begin file simdjson/generic/ondemand/document_stream.h for ppc64 */ +/* end file simdjson/generic/ondemand/document.h for westmere */ +/* including simdjson/generic/ondemand/document_stream.h for westmere: #include "simdjson/generic/ondemand/document_stream.h" */ +/* begin file simdjson/generic/ondemand/document_stream.h for westmere */ #ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -98508,7 +134878,7 @@ struct simdjson_result<ppc64::ondemand::document_reference> : public ppc64::impl #endif namespace simdjson { -namespace ppc64 { +namespace westmere { namespace ondemand { #ifdef SIMDJSON_THREADS_ENABLED @@ -98821,14 +135191,14 @@ class document_stream { }; // document_stream } // namespace ondemand -} // namespace ppc64 +} // namespace westmere } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<ppc64::ondemand::document_stream> : public ppc64::implementation_simdjson_result_base<ppc64::ondemand::document_stream> { +struct simdjson_result<westmere::ondemand::document_stream> : public westmere::implementation_simdjson_result_base<westmere::ondemand::document_stream> { public: - simdjson_inline simdjson_result(ppc64::ondemand::document_stream &&value) noexcept; ///< @private + simdjson_inline simdjson_result(westmere::ondemand::document_stream &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; }; @@ -98836,9 +135206,9 @@ struct simdjson_result<ppc64::ondemand::document_stream> : public ppc64::impleme } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_H -/* end file simdjson/generic/ondemand/document_stream.h for ppc64 */ -/* including simdjson/generic/ondemand/field.h for ppc64: #include "simdjson/generic/ondemand/field.h" */ -/* begin file simdjson/generic/ondemand/field.h for ppc64 */ +/* end file simdjson/generic/ondemand/document_stream.h for westmere */ +/* including simdjson/generic/ondemand/field.h for westmere: #include "simdjson/generic/ondemand/field.h" */ +/* begin file simdjson/generic/ondemand/field.h for westmere */ #ifndef SIMDJSON_GENERIC_ONDEMAND_FIELD_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -98850,7 +135220,7 @@ struct simdjson_result<ppc64::ondemand::document_stream> : public ppc64::impleme /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace ppc64 { +namespace westmere { namespace ondemand { /** @@ -98928,33 +135298,33 @@ class field : public std::pair<raw_json_string, value> { }; } // namespace ondemand -} // namespace ppc64 +} // namespace westmere } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<ppc64::ondemand::field> : public ppc64::implementation_simdjson_result_base<ppc64::ondemand::field> { +struct simdjson_result<westmere::ondemand::field> : public westmere::implementation_simdjson_result_base<westmere::ondemand::field> { public: - simdjson_inline simdjson_result(ppc64::ondemand::field &&value) noexcept; ///< @private + simdjson_inline simdjson_result(westmere::ondemand::field &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; simdjson_inline simdjson_result<std::string_view> unescaped_key(bool allow_replacement = false) noexcept; template<typename string_type> simdjson_inline error_code unescaped_key(string_type &receiver, bool allow_replacement = false) noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::raw_json_string> key() noexcept; + simdjson_inline simdjson_result<westmere::ondemand::raw_json_string> key() noexcept; simdjson_inline simdjson_result<std::string_view> key_raw_json_token() noexcept; simdjson_inline simdjson_result<std::string_view> escaped_key() noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::value> value() noexcept; + simdjson_inline simdjson_result<westmere::ondemand::value> value() noexcept; }; } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_FIELD_H -/* end file simdjson/generic/ondemand/field.h for ppc64 */ -/* including simdjson/generic/ondemand/object.h for ppc64: #include "simdjson/generic/ondemand/object.h" */ -/* begin file simdjson/generic/ondemand/object.h for ppc64 */ +/* end file simdjson/generic/ondemand/field.h for westmere */ +/* including simdjson/generic/ondemand/object.h for westmere: #include "simdjson/generic/ondemand/object.h" */ +/* begin file simdjson/generic/ondemand/object.h for westmere */ #ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -98969,7 +135339,7 @@ struct simdjson_result<ppc64::ondemand::field> : public ppc64::implementation_si /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace ppc64 { +namespace westmere { namespace ondemand { /** @@ -98984,6 +135354,13 @@ class object { */ simdjson_inline object() noexcept = default; + /** + * Get an iterator to the start of the object. We recommend using a range-based for loop. + * + * Using the iterator directly is also possible but error-prone and discouraged. In particular, + * you must dereference the iterator exactly once per iteration (before calling '++'). + * Doing otherwise is unsafe and may lead to errors. You are responsible for ensuring + */ simdjson_inline simdjson_result<object_iterator> begin() noexcept; simdjson_inline simdjson_result<object_iterator> end() noexcept; /** @@ -99256,29 +135633,29 @@ class object { }; } // namespace ondemand -} // namespace ppc64 +} // namespace westmere } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<ppc64::ondemand::object> : public ppc64::implementation_simdjson_result_base<ppc64::ondemand::object> { +struct simdjson_result<westmere::ondemand::object> : public westmere::implementation_simdjson_result_base<westmere::ondemand::object> { public: - simdjson_inline simdjson_result(ppc64::ondemand::object &&value) noexcept; ///< @private + simdjson_inline simdjson_result(westmere::ondemand::object &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; - simdjson_inline simdjson_result<ppc64::ondemand::object_iterator> begin() noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::object_iterator> end() noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::value> find_field(std::string_view key) & noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::value> find_field(std::string_view key) && noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::value> find_field_unordered(std::string_view key) & noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::value> find_field_unordered(std::string_view key) && noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::value> operator[](std::string_view key) & noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::value> operator[](std::string_view key) && noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result<ppc64::ondemand::value> at_path(std::string_view json_path) noexcept; - simdjson_inline simdjson_result<std::vector<ppc64::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<westmere::ondemand::object_iterator> begin() noexcept; + simdjson_inline simdjson_result<westmere::ondemand::object_iterator> end() noexcept; + simdjson_inline simdjson_result<westmere::ondemand::value> find_field(std::string_view key) & noexcept; + simdjson_inline simdjson_result<westmere::ondemand::value> find_field(std::string_view key) && noexcept; + simdjson_inline simdjson_result<westmere::ondemand::value> find_field_unordered(std::string_view key) & noexcept; + simdjson_inline simdjson_result<westmere::ondemand::value> find_field_unordered(std::string_view key) && noexcept; + simdjson_inline simdjson_result<westmere::ondemand::value> operator[](std::string_view key) & noexcept; + simdjson_inline simdjson_result<westmere::ondemand::value> operator[](std::string_view key) && noexcept; + simdjson_inline simdjson_result<westmere::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result<westmere::ondemand::value> at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<std::vector<westmere::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; inline simdjson_result<bool> reset() noexcept; inline simdjson_result<bool> is_empty() noexcept; inline simdjson_result<size_t> count_fields() & noexcept; @@ -99289,7 +135666,7 @@ struct simdjson_result<ppc64::ondemand::object> : public ppc64::implementation_s template<typename T> simdjson_inline simdjson_result<T> get() noexcept { if (error()) { return error(); } - if constexpr (std::is_same_v<T, ppc64::ondemand::object>) { + if constexpr (std::is_same_v<T, westmere::ondemand::object>) { return first; } return first.get<T>(); @@ -99297,7 +135674,7 @@ struct simdjson_result<ppc64::ondemand::object> : public ppc64::implementation_s template<typename T> simdjson_warn_unused simdjson_inline error_code get(T& out) noexcept { if (error()) { return error(); } - if constexpr (std::is_same_v<T, ppc64::ondemand::object>) { + if constexpr (std::is_same_v<T, westmere::ondemand::object>) { out = first; } else { SIMDJSON_TRY( first.get<T>(out) ); @@ -99320,9 +135697,9 @@ struct simdjson_result<ppc64::ondemand::object> : public ppc64::implementation_s } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_H -/* end file simdjson/generic/ondemand/object.h for ppc64 */ -/* including simdjson/generic/ondemand/object_iterator.h for ppc64: #include "simdjson/generic/ondemand/object_iterator.h" */ -/* begin file simdjson/generic/ondemand/object_iterator.h for ppc64 */ +/* end file simdjson/generic/ondemand/object.h for westmere */ +/* including simdjson/generic/ondemand/object_iterator.h for westmere: #include "simdjson/generic/ondemand/object_iterator.h" */ +/* begin file simdjson/generic/ondemand/object_iterator.h for westmere */ #ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -99333,7 +135710,7 @@ struct simdjson_result<ppc64::ondemand::object> : public ppc64::implementation_s /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace ppc64 { +namespace westmere { namespace ondemand { class object_iterator { @@ -99357,9 +135734,14 @@ class object_iterator { // Assumes it's being compared with the end. true if depth >= iter->depth. simdjson_inline bool operator!=(const object_iterator &) const noexcept; // Checks for ']' and ',' + // YOU MUST NOT CALL THIS IF operator* YIELDED AN ERROR. + // YOU MUST NOT CALL THIS WITHOUT A CORRESPONDING operator* CALL. simdjson_inline object_iterator &operator++() noexcept; private: +#if SIMDJSON_DEVELOPMENT_CHECKS + bool has_been_referenced{false}; +#endif /** * The underlying JSON iterator. * @@ -99374,15 +135756,15 @@ class object_iterator { }; } // namespace ondemand -} // namespace ppc64 +} // namespace westmere } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<ppc64::ondemand::object_iterator> : public ppc64::implementation_simdjson_result_base<ppc64::ondemand::object_iterator> { +struct simdjson_result<westmere::ondemand::object_iterator> : public westmere::implementation_simdjson_result_base<westmere::ondemand::object_iterator> { public: - simdjson_inline simdjson_result(ppc64::ondemand::object_iterator &&value) noexcept; ///< @private + simdjson_inline simdjson_result(westmere::ondemand::object_iterator &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; @@ -99391,21 +135773,21 @@ struct simdjson_result<ppc64::ondemand::object_iterator> : public ppc64::impleme // // Reads key and value, yielding them to the user. - simdjson_inline simdjson_result<ppc64::ondemand::field> operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. + simdjson_inline simdjson_result<westmere::ondemand::field> operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. // Assumes it's being compared with the end. true if depth < iter->depth. - simdjson_inline bool operator==(const simdjson_result<ppc64::ondemand::object_iterator> &) const noexcept; + simdjson_inline bool operator==(const simdjson_result<westmere::ondemand::object_iterator> &) const noexcept; // Assumes it's being compared with the end. true if depth >= iter->depth. - simdjson_inline bool operator!=(const simdjson_result<ppc64::ondemand::object_iterator> &) const noexcept; + simdjson_inline bool operator!=(const simdjson_result<westmere::ondemand::object_iterator> &) const noexcept; // Checks for ']' and ',' - simdjson_inline simdjson_result<ppc64::ondemand::object_iterator> &operator++() noexcept; + simdjson_inline simdjson_result<westmere::ondemand::object_iterator> &operator++() noexcept; }; } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_H -/* end file simdjson/generic/ondemand/object_iterator.h for ppc64 */ -/* including simdjson/generic/ondemand/serialization.h for ppc64: #include "simdjson/generic/ondemand/serialization.h" */ -/* begin file simdjson/generic/ondemand/serialization.h for ppc64 */ +/* end file simdjson/generic/ondemand/object_iterator.h for westmere */ +/* including simdjson/generic/ondemand/serialization.h for westmere: #include "simdjson/generic/ondemand/serialization.h" */ +/* begin file simdjson/generic/ondemand/serialization.h for westmere */ #ifndef SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -99419,30 +135801,30 @@ namespace simdjson { * contains JSON text that is suitable to be parsed as JSON again. It does not * validate the content. */ -inline simdjson_result<std::string_view> to_json_string(ppc64::ondemand::document& x) noexcept; +inline simdjson_result<std::string_view> to_json_string(westmere::ondemand::document& x) noexcept; /** * Create a string-view instance out of a value instance. The string-view instance * contains JSON text that is suitable to be parsed as JSON again. The value must * not have been accessed previously. It does not * validate the content. */ -inline simdjson_result<std::string_view> to_json_string(ppc64::ondemand::value& x) noexcept; +inline simdjson_result<std::string_view> to_json_string(westmere::ondemand::value& x) noexcept; /** * Create a string-view instance out of an object instance. The string-view instance * contains JSON text that is suitable to be parsed as JSON again. It does not * validate the content. */ -inline simdjson_result<std::string_view> to_json_string(ppc64::ondemand::object& x) noexcept; +inline simdjson_result<std::string_view> to_json_string(westmere::ondemand::object& x) noexcept; /** * Create a string-view instance out of an array instance. The string-view instance * contains JSON text that is suitable to be parsed as JSON again. It does not * validate the content. */ -inline simdjson_result<std::string_view> to_json_string(ppc64::ondemand::array& x) noexcept; -inline simdjson_result<std::string_view> to_json_string(simdjson_result<ppc64::ondemand::document> x); -inline simdjson_result<std::string_view> to_json_string(simdjson_result<ppc64::ondemand::value> x); -inline simdjson_result<std::string_view> to_json_string(simdjson_result<ppc64::ondemand::object> x); -inline simdjson_result<std::string_view> to_json_string(simdjson_result<ppc64::ondemand::array> x); +inline simdjson_result<std::string_view> to_json_string(westmere::ondemand::array& x) noexcept; +inline simdjson_result<std::string_view> to_json_string(simdjson_result<westmere::ondemand::document> x); +inline simdjson_result<std::string_view> to_json_string(simdjson_result<westmere::ondemand::value> x); +inline simdjson_result<std::string_view> to_json_string(simdjson_result<westmere::ondemand::object> x); +inline simdjson_result<std::string_view> to_json_string(simdjson_result<westmere::ondemand::array> x); #if SIMDJSON_STATIC_REFLECTION /** @@ -99450,10 +135832,10 @@ inline simdjson_result<std::string_view> to_json_string(simdjson_result<ppc64::o * Only available when SIMDJSON_STATIC_REFLECTION is enabled. */ template<typename T> - requires(!std::same_as<T, ppc64::ondemand::document> && - !std::same_as<T, ppc64::ondemand::value> && - !std::same_as<T, ppc64::ondemand::object> && - !std::same_as<T, ppc64::ondemand::array>) + requires(!std::same_as<T, westmere::ondemand::document> && + !std::same_as<T, westmere::ondemand::value> && + !std::same_as<T, westmere::ondemand::object> && + !std::same_as<T, westmere::ondemand::array>) inline std::string to_json_string(const T& obj); #endif @@ -99466,7 +135848,7 @@ inline std::string to_json_string(const T& obj); * Credit: @madhur4127 * See https://github.com/simdjson/simdjson/issues/1768 */ -namespace simdjson { namespace ppc64 { namespace ondemand { +namespace simdjson { namespace westmere { namespace ondemand { /** * Print JSON to an output stream. It does not @@ -99476,9 +135858,9 @@ namespace simdjson { namespace ppc64 { namespace ondemand { * @param value The element. * @throw if there is an error with the underlying output stream. simdjson itself will not throw. */ -inline std::ostream& operator<<(std::ostream& out, simdjson::ppc64::ondemand::value x); +inline std::ostream& operator<<(std::ostream& out, simdjson::westmere::ondemand::value x); #if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::ppc64::ondemand::value> x); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::westmere::ondemand::value> x); #endif /** * Print JSON to an output stream. It does not @@ -99488,9 +135870,9 @@ inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<sim * @param value The array. * @throw if there is an error with the underlying output stream. simdjson itself will not throw. */ -inline std::ostream& operator<<(std::ostream& out, simdjson::ppc64::ondemand::array value); +inline std::ostream& operator<<(std::ostream& out, simdjson::westmere::ondemand::array value); #if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::ppc64::ondemand::array> x); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::westmere::ondemand::array> x); #endif /** * Print JSON to an output stream. It does not @@ -99500,13 +135882,13 @@ inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<sim * @param value The array. * @throw if there is an error with the underlying output stream. simdjson itself will not throw. */ -inline std::ostream& operator<<(std::ostream& out, simdjson::ppc64::ondemand::document& value); +inline std::ostream& operator<<(std::ostream& out, simdjson::westmere::ondemand::document& value); #if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::ppc64::ondemand::document>&& x); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::westmere::ondemand::document>&& x); #endif -inline std::ostream& operator<<(std::ostream& out, simdjson::ppc64::ondemand::document_reference& value); +inline std::ostream& operator<<(std::ostream& out, simdjson::westmere::ondemand::document_reference& value); #if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::ppc64::ondemand::document_reference>&& x); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::westmere::ondemand::document_reference>&& x); #endif /** * Print JSON to an output stream. It does not @@ -99516,18 +135898,18 @@ inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<sim * @param value The object. * @throw if there is an error with the underlying output stream. simdjson itself will not throw. */ -inline std::ostream& operator<<(std::ostream& out, simdjson::ppc64::ondemand::object value); +inline std::ostream& operator<<(std::ostream& out, simdjson::westmere::ondemand::object value); #if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::ppc64::ondemand::object> x); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::westmere::ondemand::object> x); #endif -}}} // namespace simdjson::ppc64::ondemand +}}} // namespace simdjson::westmere::ondemand #endif // SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_H -/* end file simdjson/generic/ondemand/serialization.h for ppc64 */ +/* end file simdjson/generic/ondemand/serialization.h for westmere */ // Deserialization for standard types -/* including simdjson/generic/ondemand/std_deserialize.h for ppc64: #include "simdjson/generic/ondemand/std_deserialize.h" */ -/* begin file simdjson/generic/ondemand/std_deserialize.h for ppc64 */ +/* including simdjson/generic/ondemand/std_deserialize.h for westmere: #include "simdjson/generic/ondemand/std_deserialize.h" */ +/* begin file simdjson/generic/ondemand/std_deserialize.h for westmere */ #if SIMDJSON_SUPPORTS_CONCEPTS #ifndef SIMDJSON_ONDEMAND_DESERIALIZE_H @@ -99626,8 +136008,8 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { static_assert( std::is_default_constructible_v<value_type>, "The specified type inside the container must default constructible."); - ppc64::ondemand::array arr; - if constexpr (std::is_same_v<std::remove_cvref_t<ValT>, ppc64::ondemand::array>) { + westmere::ondemand::array arr; + if constexpr (std::is_same_v<std::remove_cvref_t<ValT>, westmere::ondemand::array>) { arr = val; } else { SIMDJSON_TRY(val.get_array().get(arr)); @@ -99671,7 +136053,7 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { static_assert( std::is_default_constructible_v<value_type>, "The specified value type inside the container must default constructible."); - ppc64::ondemand::object obj; + westmere::ondemand::object obj; SIMDJSON_TRY(val.get_object().get(obj)); for (auto field : obj) { std::string_view key; @@ -99689,7 +136071,7 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { } template <concepts::string_view_keyed_map T> -error_code tag_invoke(deserialize_tag, ppc64::ondemand::object &obj, T &out) noexcept { +error_code tag_invoke(deserialize_tag, westmere::ondemand::object &obj, T &out) noexcept { using value_type = typename std::remove_cvref_t<T>::mapped_type; out.clear(); @@ -99697,7 +136079,7 @@ error_code tag_invoke(deserialize_tag, ppc64::ondemand::object &obj, T &out) noe std::string_view key; SIMDJSON_TRY(field.unescaped_key().get(key)); - ppc64::ondemand::value value_obj; + westmere::ondemand::value value_obj; SIMDJSON_TRY(field.value().get(value_obj)); value_type this_value; @@ -99708,22 +136090,22 @@ error_code tag_invoke(deserialize_tag, ppc64::ondemand::object &obj, T &out) noe } template <concepts::string_view_keyed_map T> -error_code tag_invoke(deserialize_tag, ppc64::ondemand::value &val, T &out) noexcept { - ppc64::ondemand::object obj; +error_code tag_invoke(deserialize_tag, westmere::ondemand::value &val, T &out) noexcept { + westmere::ondemand::object obj; SIMDJSON_TRY(val.get_object().get(obj)); return simdjson::deserialize(obj, out); } template <concepts::string_view_keyed_map T> -error_code tag_invoke(deserialize_tag, ppc64::ondemand::document &doc, T &out) noexcept { - ppc64::ondemand::object obj; +error_code tag_invoke(deserialize_tag, westmere::ondemand::document &doc, T &out) noexcept { + westmere::ondemand::object obj; SIMDJSON_TRY(doc.get_object().get(obj)); return simdjson::deserialize(obj, out); } template <concepts::string_view_keyed_map T> -error_code tag_invoke(deserialize_tag, ppc64::ondemand::document_reference &doc, T &out) noexcept { - ppc64::ondemand::object obj; +error_code tag_invoke(deserialize_tag, westmere::ondemand::document_reference &doc, T &out) noexcept { + westmere::ondemand::object obj; SIMDJSON_TRY(doc.get_object().get(obj)); return simdjson::deserialize(obj, out); } @@ -99800,8 +136182,8 @@ constexpr bool user_defined_type = (std::is_class_v<T> template <typename T, typename ValT> requires(user_defined_type<T> && std::is_class_v<T>) error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept { - ppc64::ondemand::object obj; - if constexpr (std::is_same_v<std::remove_cvref_t<ValT>, ppc64::ondemand::object>) { + westmere::ondemand::object obj; + if constexpr (std::is_same_v<std::remove_cvref_t<ValT>, westmere::ondemand::object>) { obj = val; } else { SIMDJSON_TRY(val.get_object().get(obj)); @@ -100110,11 +136492,11 @@ error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr<int> &out) noe #endif // SIMDJSON_ONDEMAND_DESERIALIZE_H #endif // SIMDJSON_SUPPORTS_CONCEPTS -/* end file simdjson/generic/ondemand/std_deserialize.h for ppc64 */ +/* end file simdjson/generic/ondemand/std_deserialize.h for westmere */ // Inline definitions -/* including simdjson/generic/ondemand/array-inl.h for ppc64: #include "simdjson/generic/ondemand/array-inl.h" */ -/* begin file simdjson/generic/ondemand/array-inl.h for ppc64 */ +/* including simdjson/generic/ondemand/array-inl.h for westmere: #include "simdjson/generic/ondemand/array-inl.h" */ +/* begin file simdjson/generic/ondemand/array-inl.h for westmere */ #ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -100129,7 +136511,7 @@ error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr<int> &out) noe /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace ppc64 { +namespace westmere { namespace ondemand { // @@ -100358,68 +136740,68 @@ simdjson_inline simdjson_result<value> array::at(size_t index) noexcept { } } // namespace ondemand -} // namespace ppc64 +} // namespace westmere } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<ppc64::ondemand::array>::simdjson_result( - ppc64::ondemand::array &&value +simdjson_inline simdjson_result<westmere::ondemand::array>::simdjson_result( + westmere::ondemand::array &&value ) noexcept - : implementation_simdjson_result_base<ppc64::ondemand::array>( - std::forward<ppc64::ondemand::array>(value) + : implementation_simdjson_result_base<westmere::ondemand::array>( + std::forward<westmere::ondemand::array>(value) ) { } -simdjson_inline simdjson_result<ppc64::ondemand::array>::simdjson_result( +simdjson_inline simdjson_result<westmere::ondemand::array>::simdjson_result( error_code error ) noexcept - : implementation_simdjson_result_base<ppc64::ondemand::array>(error) + : implementation_simdjson_result_base<westmere::ondemand::array>(error) { } -simdjson_inline simdjson_result<ppc64::ondemand::array_iterator> simdjson_result<ppc64::ondemand::array>::begin() noexcept { +simdjson_inline simdjson_result<westmere::ondemand::array_iterator> simdjson_result<westmere::ondemand::array>::begin() noexcept { if (error()) { return error(); } return first.begin(); } -simdjson_inline simdjson_result<ppc64::ondemand::array_iterator> simdjson_result<ppc64::ondemand::array>::end() noexcept { +simdjson_inline simdjson_result<westmere::ondemand::array_iterator> simdjson_result<westmere::ondemand::array>::end() noexcept { if (error()) { return error(); } return first.end(); } -simdjson_inline simdjson_result<size_t> simdjson_result<ppc64::ondemand::array>::count_elements() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<westmere::ondemand::array>::count_elements() & noexcept { if (error()) { return error(); } return first.count_elements(); } -simdjson_inline simdjson_result<bool> simdjson_result<ppc64::ondemand::array>::is_empty() & noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<westmere::ondemand::array>::is_empty() & noexcept { if (error()) { return error(); } return first.is_empty(); } -simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::array>::at(size_t index) noexcept { +simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::array>::at(size_t index) noexcept { if (error()) { return error(); } return first.at(index); } -simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::array>::at_pointer(std::string_view json_pointer) noexcept { +simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::array>::at_pointer(std::string_view json_pointer) noexcept { if (error()) { return error(); } return first.at_pointer(json_pointer); } -simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::array>::at_path(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::array>::at_path(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path(json_path); } -simdjson_inline simdjson_result<std::vector<ppc64::ondemand::value>> simdjson_result<ppc64::ondemand::array>::at_path_with_wildcard(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<std::vector<westmere::ondemand::value>> simdjson_result<westmere::ondemand::array>::at_path_with_wildcard(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path_with_wildcard(json_path); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<ppc64::ondemand::array>::raw_json() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<westmere::ondemand::array>::raw_json() noexcept { if (error()) { return error(); } return first.raw_json(); } } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_INL_H -/* end file simdjson/generic/ondemand/array-inl.h for ppc64 */ -/* including simdjson/generic/ondemand/array_iterator-inl.h for ppc64: #include "simdjson/generic/ondemand/array_iterator-inl.h" */ -/* begin file simdjson/generic/ondemand/array_iterator-inl.h for ppc64 */ +/* end file simdjson/generic/ondemand/array-inl.h for westmere */ +/* including simdjson/generic/ondemand/array_iterator-inl.h for westmere: #include "simdjson/generic/ondemand/array_iterator-inl.h" */ +/* begin file simdjson/generic/ondemand/array_iterator-inl.h for westmere */ #ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -100431,7 +136813,7 @@ simdjson_inline simdjson_result<std::string_view> simdjson_result<ppc64::ondema /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace ppc64 { +namespace westmere { namespace ondemand { simdjson_inline array_iterator::array_iterator(const value_iterator &_iter) noexcept @@ -100439,6 +136821,10 @@ simdjson_inline array_iterator::array_iterator(const value_iterator &_iter) noex {} simdjson_inline simdjson_result<value> array_iterator::operator*() noexcept { +#if SIMDJSON_DEVELOPMENT_CHECKS + SIMDJSON_ASSUME(!has_been_referenced); + has_been_referenced = true; +#endif if (iter.error()) { iter.abandon(); return iter.error(); } return value(iter.child()); } @@ -100449,6 +136835,9 @@ simdjson_inline bool array_iterator::operator!=(const array_iterator &) const no return iter.is_open(); } simdjson_inline array_iterator &array_iterator::operator++() noexcept { +#if SIMDJSON_DEVELOPMENT_CHECKS + has_been_referenced = false; +#endif error_code error; // PERF NOTE this is a safety rail ... users should exit loops as soon as they receive an error, so we'll never get here. // However, it does not seem to make a perf difference, so we add it out of an abundance of caution. @@ -100462,50 +136851,50 @@ simdjson_inline bool array_iterator::at_end() const noexcept { return iter.at_end(); } } // namespace ondemand -} // namespace ppc64 +} // namespace westmere } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<ppc64::ondemand::array_iterator>::simdjson_result( - ppc64::ondemand::array_iterator &&value +simdjson_inline simdjson_result<westmere::ondemand::array_iterator>::simdjson_result( + westmere::ondemand::array_iterator &&value ) noexcept - : ppc64::implementation_simdjson_result_base<ppc64::ondemand::array_iterator>(std::forward<ppc64::ondemand::array_iterator>(value)) + : westmere::implementation_simdjson_result_base<westmere::ondemand::array_iterator>(std::forward<westmere::ondemand::array_iterator>(value)) { first.iter.assert_is_valid(); } -simdjson_inline simdjson_result<ppc64::ondemand::array_iterator>::simdjson_result(error_code error) noexcept - : ppc64::implementation_simdjson_result_base<ppc64::ondemand::array_iterator>({}, error) +simdjson_inline simdjson_result<westmere::ondemand::array_iterator>::simdjson_result(error_code error) noexcept + : westmere::implementation_simdjson_result_base<westmere::ondemand::array_iterator>({}, error) { } -simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::array_iterator>::operator*() noexcept { +simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::array_iterator>::operator*() noexcept { if (error()) { return error(); } return *first; } -simdjson_inline bool simdjson_result<ppc64::ondemand::array_iterator>::operator==(const simdjson_result<ppc64::ondemand::array_iterator> &other) const noexcept { +simdjson_inline bool simdjson_result<westmere::ondemand::array_iterator>::operator==(const simdjson_result<westmere::ondemand::array_iterator> &other) const noexcept { if (!first.iter.is_valid()) { return !error(); } return first == other.first; } -simdjson_inline bool simdjson_result<ppc64::ondemand::array_iterator>::operator!=(const simdjson_result<ppc64::ondemand::array_iterator> &other) const noexcept { +simdjson_inline bool simdjson_result<westmere::ondemand::array_iterator>::operator!=(const simdjson_result<westmere::ondemand::array_iterator> &other) const noexcept { if (!first.iter.is_valid()) { return error(); } return first != other.first; } -simdjson_inline simdjson_result<ppc64::ondemand::array_iterator> &simdjson_result<ppc64::ondemand::array_iterator>::operator++() noexcept { +simdjson_inline simdjson_result<westmere::ondemand::array_iterator> &simdjson_result<westmere::ondemand::array_iterator>::operator++() noexcept { // Clear the error if there is one, so we don't yield it twice if (error()) { second = SUCCESS; return *this; } ++(first); return *this; } -simdjson_inline bool simdjson_result<ppc64::ondemand::array_iterator>::at_end() const noexcept { +simdjson_inline bool simdjson_result<westmere::ondemand::array_iterator>::at_end() const noexcept { return !first.iter.is_valid() || first.at_end(); } } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_INL_H -/* end file simdjson/generic/ondemand/array_iterator-inl.h for ppc64 */ -/* including simdjson/generic/ondemand/value-inl.h for ppc64: #include "simdjson/generic/ondemand/value-inl.h" */ -/* begin file simdjson/generic/ondemand/value-inl.h for ppc64 */ +/* end file simdjson/generic/ondemand/array_iterator-inl.h for westmere */ +/* including simdjson/generic/ondemand/value-inl.h for westmere: #include "simdjson/generic/ondemand/value-inl.h" */ +/* begin file simdjson/generic/ondemand/value-inl.h for westmere */ #ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -100521,7 +136910,7 @@ simdjson_inline bool simdjson_result<ppc64::ondemand::array_iterator>::at_end() /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace ppc64 { +namespace westmere { namespace ondemand { simdjson_inline value::value(const value_iterator &_iter) noexcept @@ -100818,240 +137207,240 @@ inline simdjson_result<std::vector<value>> value::at_path_with_wildcard(std::str } } // namespace ondemand -} // namespace ppc64 +} // namespace westmere } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<ppc64::ondemand::value>::simdjson_result( - ppc64::ondemand::value &&value +simdjson_inline simdjson_result<westmere::ondemand::value>::simdjson_result( + westmere::ondemand::value &&value ) noexcept : - implementation_simdjson_result_base<ppc64::ondemand::value>( - std::forward<ppc64::ondemand::value>(value) + implementation_simdjson_result_base<westmere::ondemand::value>( + std::forward<westmere::ondemand::value>(value) ) { } -simdjson_inline simdjson_result<ppc64::ondemand::value>::simdjson_result( +simdjson_inline simdjson_result<westmere::ondemand::value>::simdjson_result( error_code error ) noexcept : - implementation_simdjson_result_base<ppc64::ondemand::value>(error) + implementation_simdjson_result_base<westmere::ondemand::value>(error) { } -simdjson_inline simdjson_result<size_t> simdjson_result<ppc64::ondemand::value>::count_elements() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<westmere::ondemand::value>::count_elements() & noexcept { if (error()) { return error(); } return first.count_elements(); } -simdjson_inline simdjson_result<size_t> simdjson_result<ppc64::ondemand::value>::count_fields() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<westmere::ondemand::value>::count_fields() & noexcept { if (error()) { return error(); } return first.count_fields(); } -simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::value>::at(size_t index) noexcept { +simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::value>::at(size_t index) noexcept { if (error()) { return error(); } return first.at(index); } -simdjson_inline simdjson_result<ppc64::ondemand::array_iterator> simdjson_result<ppc64::ondemand::value>::begin() & noexcept { +simdjson_inline simdjson_result<westmere::ondemand::array_iterator> simdjson_result<westmere::ondemand::value>::begin() & noexcept { if (error()) { return error(); } return first.begin(); } -simdjson_inline simdjson_result<ppc64::ondemand::array_iterator> simdjson_result<ppc64::ondemand::value>::end() & noexcept { +simdjson_inline simdjson_result<westmere::ondemand::array_iterator> simdjson_result<westmere::ondemand::value>::end() & noexcept { if (error()) { return error(); } return {}; } -simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::value>::find_field(std::string_view key) noexcept { +simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::value>::find_field(std::string_view key) noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::value>::find_field(const char *key) noexcept { +simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::value>::find_field(const char *key) noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::value>::find_field_unordered(std::string_view key) noexcept { +simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::value>::find_field_unordered(std::string_view key) noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::value>::find_field_unordered(const char *key) noexcept { +simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::value>::find_field_unordered(const char *key) noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::value>::operator[](std::string_view key) noexcept { +simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::value>::operator[](std::string_view key) noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::value>::operator[](const char *key) noexcept { +simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::value>::operator[](const char *key) noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<ppc64::ondemand::array> simdjson_result<ppc64::ondemand::value>::get_array() noexcept { +simdjson_inline simdjson_result<westmere::ondemand::array> simdjson_result<westmere::ondemand::value>::get_array() noexcept { if (error()) { return error(); } return first.get_array(); } -simdjson_inline simdjson_result<ppc64::ondemand::object> simdjson_result<ppc64::ondemand::value>::get_object() noexcept { +simdjson_inline simdjson_result<westmere::ondemand::object> simdjson_result<westmere::ondemand::value>::get_object() noexcept { if (error()) { return error(); } return first.get_object(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<ppc64::ondemand::value>::get_uint64() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<westmere::ondemand::value>::get_uint64() noexcept { if (error()) { return error(); } return first.get_uint64(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<ppc64::ondemand::value>::get_uint64_in_string() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<westmere::ondemand::value>::get_uint64_in_string() noexcept { if (error()) { return error(); } return first.get_uint64_in_string(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<ppc64::ondemand::value>::get_int64() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<westmere::ondemand::value>::get_int64() noexcept { if (error()) { return error(); } return first.get_int64(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<ppc64::ondemand::value>::get_int64_in_string() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<westmere::ondemand::value>::get_int64_in_string() noexcept { if (error()) { return error(); } return first.get_int64_in_string(); } -simdjson_inline simdjson_result<double> simdjson_result<ppc64::ondemand::value>::get_double() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<westmere::ondemand::value>::get_double() noexcept { if (error()) { return error(); } return first.get_double(); } -simdjson_inline simdjson_result<double> simdjson_result<ppc64::ondemand::value>::get_double_in_string() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<westmere::ondemand::value>::get_double_in_string() noexcept { if (error()) { return error(); } return first.get_double_in_string(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<ppc64::ondemand::value>::get_string(bool allow_replacement) noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<westmere::ondemand::value>::get_string(bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(allow_replacement); } template <typename string_type> -simdjson_inline error_code simdjson_result<ppc64::ondemand::value>::get_string(string_type& receiver, bool allow_replacement) noexcept { +simdjson_inline error_code simdjson_result<westmere::ondemand::value>::get_string(string_type& receiver, bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(receiver, allow_replacement); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<ppc64::ondemand::value>::get_wobbly_string() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<westmere::ondemand::value>::get_wobbly_string() noexcept { if (error()) { return error(); } return first.get_wobbly_string(); } -simdjson_inline simdjson_result<ppc64::ondemand::raw_json_string> simdjson_result<ppc64::ondemand::value>::get_raw_json_string() noexcept { +simdjson_inline simdjson_result<westmere::ondemand::raw_json_string> simdjson_result<westmere::ondemand::value>::get_raw_json_string() noexcept { if (error()) { return error(); } return first.get_raw_json_string(); } -simdjson_inline simdjson_result<bool> simdjson_result<ppc64::ondemand::value>::get_bool() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<westmere::ondemand::value>::get_bool() noexcept { if (error()) { return error(); } return first.get_bool(); } -simdjson_inline simdjson_result<bool> simdjson_result<ppc64::ondemand::value>::is_null() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<westmere::ondemand::value>::is_null() noexcept { if (error()) { return error(); } return first.is_null(); } -template<> simdjson_inline error_code simdjson_result<ppc64::ondemand::value>::get<ppc64::ondemand::value>(ppc64::ondemand::value &out) noexcept { +template<> simdjson_inline error_code simdjson_result<westmere::ondemand::value>::get<westmere::ondemand::value>(westmere::ondemand::value &out) noexcept { if (error()) { return error(); } out = first; return SUCCESS; } -template<typename T> simdjson_inline simdjson_result<T> simdjson_result<ppc64::ondemand::value>::get() noexcept { +template<typename T> simdjson_inline simdjson_result<T> simdjson_result<westmere::ondemand::value>::get() noexcept { if (error()) { return error(); } return first.get<T>(); } -template<typename T> simdjson_inline error_code simdjson_result<ppc64::ondemand::value>::get(T &out) noexcept { +template<typename T> simdjson_inline error_code simdjson_result<westmere::ondemand::value>::get(T &out) noexcept { if (error()) { return error(); } return first.get<T>(out); } -template<> simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::value>::get<ppc64::ondemand::value>() noexcept { +template<> simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::value>::get<westmere::ondemand::value>() noexcept { if (error()) { return error(); } return std::move(first); } -simdjson_inline simdjson_result<ppc64::ondemand::json_type> simdjson_result<ppc64::ondemand::value>::type() noexcept { +simdjson_inline simdjson_result<westmere::ondemand::json_type> simdjson_result<westmere::ondemand::value>::type() noexcept { if (error()) { return error(); } return first.type(); } -simdjson_inline simdjson_result<bool> simdjson_result<ppc64::ondemand::value>::is_scalar() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<westmere::ondemand::value>::is_scalar() noexcept { if (error()) { return error(); } return first.is_scalar(); } -simdjson_inline simdjson_result<bool> simdjson_result<ppc64::ondemand::value>::is_string() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<westmere::ondemand::value>::is_string() noexcept { if (error()) { return error(); } return first.is_string(); } -simdjson_inline simdjson_result<bool> simdjson_result<ppc64::ondemand::value>::is_negative() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<westmere::ondemand::value>::is_negative() noexcept { if (error()) { return error(); } return first.is_negative(); } -simdjson_inline simdjson_result<bool> simdjson_result<ppc64::ondemand::value>::is_integer() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<westmere::ondemand::value>::is_integer() noexcept { if (error()) { return error(); } return first.is_integer(); } -simdjson_inline simdjson_result<ppc64::number_type> simdjson_result<ppc64::ondemand::value>::get_number_type() noexcept { +simdjson_inline simdjson_result<westmere::number_type> simdjson_result<westmere::ondemand::value>::get_number_type() noexcept { if (error()) { return error(); } return first.get_number_type(); } -simdjson_inline simdjson_result<ppc64::ondemand::number> simdjson_result<ppc64::ondemand::value>::get_number() noexcept { +simdjson_inline simdjson_result<westmere::ondemand::number> simdjson_result<westmere::ondemand::value>::get_number() noexcept { if (error()) { return error(); } return first.get_number(); } #if SIMDJSON_EXCEPTIONS template <class T> -simdjson_inline simdjson_result<ppc64::ondemand::value>::operator T() noexcept(false) { +simdjson_inline simdjson_result<westmere::ondemand::value>::operator T() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first.get<T>(); } -simdjson_inline simdjson_result<ppc64::ondemand::value>::operator ppc64::ondemand::array() noexcept(false) { +simdjson_inline simdjson_result<westmere::ondemand::value>::operator westmere::ondemand::array() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<ppc64::ondemand::value>::operator ppc64::ondemand::object() noexcept(false) { +simdjson_inline simdjson_result<westmere::ondemand::value>::operator westmere::ondemand::object() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<ppc64::ondemand::value>::operator uint64_t() noexcept(false) { +simdjson_inline simdjson_result<westmere::ondemand::value>::operator uint64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<ppc64::ondemand::value>::operator int64_t() noexcept(false) { +simdjson_inline simdjson_result<westmere::ondemand::value>::operator int64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<ppc64::ondemand::value>::operator double() noexcept(false) { +simdjson_inline simdjson_result<westmere::ondemand::value>::operator double() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<ppc64::ondemand::value>::operator std::string_view() noexcept(false) { +simdjson_inline simdjson_result<westmere::ondemand::value>::operator std::string_view() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<ppc64::ondemand::value>::operator ppc64::ondemand::raw_json_string() noexcept(false) { +simdjson_inline simdjson_result<westmere::ondemand::value>::operator westmere::ondemand::raw_json_string() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<ppc64::ondemand::value>::operator bool() noexcept(false) { +simdjson_inline simdjson_result<westmere::ondemand::value>::operator bool() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } #endif -simdjson_inline simdjson_result<std::string_view> simdjson_result<ppc64::ondemand::value>::raw_json_token() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<westmere::ondemand::value>::raw_json_token() noexcept { if (error()) { return error(); } return first.raw_json_token(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<ppc64::ondemand::value>::raw_json() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<westmere::ondemand::value>::raw_json() noexcept { if (error()) { return error(); } return first.raw_json(); } -simdjson_inline simdjson_result<const char *> simdjson_result<ppc64::ondemand::value>::current_location() noexcept { +simdjson_inline simdjson_result<const char *> simdjson_result<westmere::ondemand::value>::current_location() noexcept { if (error()) { return error(); } return first.current_location(); } -simdjson_inline simdjson_result<int32_t> simdjson_result<ppc64::ondemand::value>::current_depth() const noexcept { +simdjson_inline simdjson_result<int32_t> simdjson_result<westmere::ondemand::value>::current_depth() const noexcept { if (error()) { return error(); } return first.current_depth(); } -simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::value>::at_pointer( +simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::value>::at_pointer( std::string_view json_pointer) noexcept { if (error()) { return error(); @@ -101059,7 +137448,7 @@ simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::o return first.at_pointer(json_pointer); } -simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::value>::at_path( +simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::value>::at_path( std::string_view json_path) noexcept { if (error()) { return error(); @@ -101067,7 +137456,7 @@ simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::o return first.at_path(json_path); } -inline simdjson_result<std::vector<ppc64::ondemand::value>> simdjson_result<ppc64::ondemand::value>::at_path_with_wildcard( +inline simdjson_result<std::vector<westmere::ondemand::value>> simdjson_result<westmere::ondemand::value>::at_path_with_wildcard( std::string_view json_path) noexcept { if (error()) { return error(); @@ -101078,9 +137467,9 @@ inline simdjson_result<std::vector<ppc64::ondemand::value>> simdjson_result<ppc6 } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_INL_H -/* end file simdjson/generic/ondemand/value-inl.h for ppc64 */ -/* including simdjson/generic/ondemand/document-inl.h for ppc64: #include "simdjson/generic/ondemand/document-inl.h" */ -/* begin file simdjson/generic/ondemand/document-inl.h for ppc64 */ +/* end file simdjson/generic/ondemand/value-inl.h for westmere */ +/* including simdjson/generic/ondemand/document-inl.h for westmere: #include "simdjson/generic/ondemand/document-inl.h" */ +/* begin file simdjson/generic/ondemand/document-inl.h for westmere */ #ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -101100,7 +137489,7 @@ inline simdjson_result<std::vector<ppc64::ondemand::value>> simdjson_result<ppc6 /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace ppc64 { +namespace westmere { namespace ondemand { simdjson_inline document::document(ondemand::json_iterator &&_iter) noexcept @@ -101494,283 +137883,283 @@ simdjson_warn_unused simdjson_inline error_code document::extract_into(T& out) & #endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION } // namespace ondemand -} // namespace ppc64 +} // namespace westmere } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<ppc64::ondemand::document>::simdjson_result( - ppc64::ondemand::document &&value +simdjson_inline simdjson_result<westmere::ondemand::document>::simdjson_result( + westmere::ondemand::document &&value ) noexcept : - implementation_simdjson_result_base<ppc64::ondemand::document>( - std::forward<ppc64::ondemand::document>(value) + implementation_simdjson_result_base<westmere::ondemand::document>( + std::forward<westmere::ondemand::document>(value) ) { } -simdjson_inline simdjson_result<ppc64::ondemand::document>::simdjson_result( +simdjson_inline simdjson_result<westmere::ondemand::document>::simdjson_result( error_code error ) noexcept : - implementation_simdjson_result_base<ppc64::ondemand::document>( + implementation_simdjson_result_base<westmere::ondemand::document>( error ) { } -simdjson_inline simdjson_result<size_t> simdjson_result<ppc64::ondemand::document>::count_elements() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<westmere::ondemand::document>::count_elements() & noexcept { if (error()) { return error(); } return first.count_elements(); } -simdjson_inline simdjson_result<size_t> simdjson_result<ppc64::ondemand::document>::count_fields() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<westmere::ondemand::document>::count_fields() & noexcept { if (error()) { return error(); } return first.count_fields(); } -simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::document>::at(size_t index) & noexcept { +simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::document>::at(size_t index) & noexcept { if (error()) { return error(); } return first.at(index); } -simdjson_inline error_code simdjson_result<ppc64::ondemand::document>::rewind() noexcept { +simdjson_inline error_code simdjson_result<westmere::ondemand::document>::rewind() noexcept { if (error()) { return error(); } first.rewind(); return SUCCESS; } -simdjson_inline simdjson_result<ppc64::ondemand::array_iterator> simdjson_result<ppc64::ondemand::document>::begin() & noexcept { +simdjson_inline simdjson_result<westmere::ondemand::array_iterator> simdjson_result<westmere::ondemand::document>::begin() & noexcept { if (error()) { return error(); } return first.begin(); } -simdjson_inline simdjson_result<ppc64::ondemand::array_iterator> simdjson_result<ppc64::ondemand::document>::end() & noexcept { +simdjson_inline simdjson_result<westmere::ondemand::array_iterator> simdjson_result<westmere::ondemand::document>::end() & noexcept { return {}; } -simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::document>::find_field_unordered(std::string_view key) & noexcept { +simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::document>::find_field_unordered(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::document>::find_field_unordered(const char *key) & noexcept { +simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::document>::find_field_unordered(const char *key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::document>::operator[](std::string_view key) & noexcept { +simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::document>::operator[](std::string_view key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::document>::operator[](const char *key) & noexcept { +simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::document>::operator[](const char *key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::document>::find_field(std::string_view key) & noexcept { +simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::document>::find_field(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::document>::find_field(const char *key) & noexcept { +simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::document>::find_field(const char *key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<ppc64::ondemand::array> simdjson_result<ppc64::ondemand::document>::get_array() & noexcept { +simdjson_inline simdjson_result<westmere::ondemand::array> simdjson_result<westmere::ondemand::document>::get_array() & noexcept { if (error()) { return error(); } return first.get_array(); } -simdjson_inline simdjson_result<ppc64::ondemand::object> simdjson_result<ppc64::ondemand::document>::get_object() & noexcept { +simdjson_inline simdjson_result<westmere::ondemand::object> simdjson_result<westmere::ondemand::document>::get_object() & noexcept { if (error()) { return error(); } return first.get_object(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<ppc64::ondemand::document>::get_uint64() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<westmere::ondemand::document>::get_uint64() noexcept { if (error()) { return error(); } return first.get_uint64(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<ppc64::ondemand::document>::get_uint64_in_string() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<westmere::ondemand::document>::get_uint64_in_string() noexcept { if (error()) { return error(); } return first.get_uint64_in_string(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<ppc64::ondemand::document>::get_int64() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<westmere::ondemand::document>::get_int64() noexcept { if (error()) { return error(); } return first.get_int64(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<ppc64::ondemand::document>::get_int64_in_string() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<westmere::ondemand::document>::get_int64_in_string() noexcept { if (error()) { return error(); } return first.get_int64_in_string(); } -simdjson_inline simdjson_result<double> simdjson_result<ppc64::ondemand::document>::get_double() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<westmere::ondemand::document>::get_double() noexcept { if (error()) { return error(); } return first.get_double(); } -simdjson_inline simdjson_result<double> simdjson_result<ppc64::ondemand::document>::get_double_in_string() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<westmere::ondemand::document>::get_double_in_string() noexcept { if (error()) { return error(); } return first.get_double_in_string(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<ppc64::ondemand::document>::get_string(bool allow_replacement) noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<westmere::ondemand::document>::get_string(bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(allow_replacement); } template <typename string_type> -simdjson_warn_unused simdjson_inline error_code simdjson_result<ppc64::ondemand::document>::get_string(string_type& receiver, bool allow_replacement) noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<westmere::ondemand::document>::get_string(string_type& receiver, bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(receiver, allow_replacement); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<ppc64::ondemand::document>::get_wobbly_string() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<westmere::ondemand::document>::get_wobbly_string() noexcept { if (error()) { return error(); } return first.get_wobbly_string(); } -simdjson_inline simdjson_result<ppc64::ondemand::raw_json_string> simdjson_result<ppc64::ondemand::document>::get_raw_json_string() noexcept { +simdjson_inline simdjson_result<westmere::ondemand::raw_json_string> simdjson_result<westmere::ondemand::document>::get_raw_json_string() noexcept { if (error()) { return error(); } return first.get_raw_json_string(); } -simdjson_inline simdjson_result<bool> simdjson_result<ppc64::ondemand::document>::get_bool() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<westmere::ondemand::document>::get_bool() noexcept { if (error()) { return error(); } return first.get_bool(); } -simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::document>::get_value() noexcept { +simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::document>::get_value() noexcept { if (error()) { return error(); } return first.get_value(); } -simdjson_inline simdjson_result<bool> simdjson_result<ppc64::ondemand::document>::is_null() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<westmere::ondemand::document>::is_null() noexcept { if (error()) { return error(); } return first.is_null(); } template<typename T> -simdjson_inline simdjson_result<T> simdjson_result<ppc64::ondemand::document>::get() & noexcept { +simdjson_inline simdjson_result<T> simdjson_result<westmere::ondemand::document>::get() & noexcept { if (error()) { return error(); } return first.get<T>(); } template<typename T> -simdjson_deprecated simdjson_inline simdjson_result<T> simdjson_result<ppc64::ondemand::document>::get() && noexcept { +simdjson_deprecated simdjson_inline simdjson_result<T> simdjson_result<westmere::ondemand::document>::get() && noexcept { if (error()) { return error(); } - return std::forward<ppc64::ondemand::document>(first).get<T>(); + return std::forward<westmere::ondemand::document>(first).get<T>(); } template<typename T> -simdjson_warn_unused simdjson_inline error_code simdjson_result<ppc64::ondemand::document>::get(T &out) & noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<westmere::ondemand::document>::get(T &out) & noexcept { if (error()) { return error(); } return first.get<T>(out); } template<typename T> -simdjson_warn_unused simdjson_inline error_code simdjson_result<ppc64::ondemand::document>::get(T &out) && noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<westmere::ondemand::document>::get(T &out) && noexcept { if (error()) { return error(); } - return std::forward<ppc64::ondemand::document>(first).get<T>(out); + return std::forward<westmere::ondemand::document>(first).get<T>(out); } -template<> simdjson_inline simdjson_result<ppc64::ondemand::document> simdjson_result<ppc64::ondemand::document>::get<ppc64::ondemand::document>() & noexcept = delete; -template<> simdjson_deprecated simdjson_inline simdjson_result<ppc64::ondemand::document> simdjson_result<ppc64::ondemand::document>::get<ppc64::ondemand::document>() && noexcept { +template<> simdjson_inline simdjson_result<westmere::ondemand::document> simdjson_result<westmere::ondemand::document>::get<westmere::ondemand::document>() & noexcept = delete; +template<> simdjson_deprecated simdjson_inline simdjson_result<westmere::ondemand::document> simdjson_result<westmere::ondemand::document>::get<westmere::ondemand::document>() && noexcept { if (error()) { return error(); } - return std::forward<ppc64::ondemand::document>(first); + return std::forward<westmere::ondemand::document>(first); } -template<> simdjson_warn_unused simdjson_inline error_code simdjson_result<ppc64::ondemand::document>::get<ppc64::ondemand::document>(ppc64::ondemand::document &out) & noexcept = delete; -template<> simdjson_warn_unused simdjson_inline error_code simdjson_result<ppc64::ondemand::document>::get<ppc64::ondemand::document>(ppc64::ondemand::document &out) && noexcept { +template<> simdjson_warn_unused simdjson_inline error_code simdjson_result<westmere::ondemand::document>::get<westmere::ondemand::document>(westmere::ondemand::document &out) & noexcept = delete; +template<> simdjson_warn_unused simdjson_inline error_code simdjson_result<westmere::ondemand::document>::get<westmere::ondemand::document>(westmere::ondemand::document &out) && noexcept { if (error()) { return error(); } - out = std::forward<ppc64::ondemand::document>(first); + out = std::forward<westmere::ondemand::document>(first); return SUCCESS; } -simdjson_inline simdjson_result<ppc64::ondemand::json_type> simdjson_result<ppc64::ondemand::document>::type() noexcept { +simdjson_inline simdjson_result<westmere::ondemand::json_type> simdjson_result<westmere::ondemand::document>::type() noexcept { if (error()) { return error(); } return first.type(); } -simdjson_inline simdjson_result<bool> simdjson_result<ppc64::ondemand::document>::is_scalar() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<westmere::ondemand::document>::is_scalar() noexcept { if (error()) { return error(); } return first.is_scalar(); } -simdjson_inline simdjson_result<bool> simdjson_result<ppc64::ondemand::document>::is_string() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<westmere::ondemand::document>::is_string() noexcept { if (error()) { return error(); } return first.is_string(); } -simdjson_inline bool simdjson_result<ppc64::ondemand::document>::is_negative() noexcept { +simdjson_inline bool simdjson_result<westmere::ondemand::document>::is_negative() noexcept { if (error()) { return error(); } return first.is_negative(); } -simdjson_inline simdjson_result<bool> simdjson_result<ppc64::ondemand::document>::is_integer() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<westmere::ondemand::document>::is_integer() noexcept { if (error()) { return error(); } return first.is_integer(); } -simdjson_inline simdjson_result<ppc64::number_type> simdjson_result<ppc64::ondemand::document>::get_number_type() noexcept { +simdjson_inline simdjson_result<westmere::number_type> simdjson_result<westmere::ondemand::document>::get_number_type() noexcept { if (error()) { return error(); } return first.get_number_type(); } -simdjson_inline simdjson_result<ppc64::ondemand::number> simdjson_result<ppc64::ondemand::document>::get_number() noexcept { +simdjson_inline simdjson_result<westmere::ondemand::number> simdjson_result<westmere::ondemand::document>::get_number() noexcept { if (error()) { return error(); } return first.get_number(); } #if SIMDJSON_EXCEPTIONS -template <class T, typename std::enable_if<std::is_same<T, ppc64::ondemand::document>::value == false>::type> -simdjson_inline simdjson_result<ppc64::ondemand::document>::operator T() noexcept(false) { +template <class T, typename std::enable_if<std::is_same<T, westmere::ondemand::document>::value == false>::type> +simdjson_inline simdjson_result<westmere::ondemand::document>::operator T() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<ppc64::ondemand::document>::operator ppc64::ondemand::array() & noexcept(false) { +simdjson_inline simdjson_result<westmere::ondemand::document>::operator westmere::ondemand::array() & noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<ppc64::ondemand::document>::operator ppc64::ondemand::object() & noexcept(false) { +simdjson_inline simdjson_result<westmere::ondemand::document>::operator westmere::ondemand::object() & noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<ppc64::ondemand::document>::operator uint64_t() noexcept(false) { +simdjson_inline simdjson_result<westmere::ondemand::document>::operator uint64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<ppc64::ondemand::document>::operator int64_t() noexcept(false) { +simdjson_inline simdjson_result<westmere::ondemand::document>::operator int64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<ppc64::ondemand::document>::operator double() noexcept(false) { +simdjson_inline simdjson_result<westmere::ondemand::document>::operator double() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<ppc64::ondemand::document>::operator std::string_view() noexcept(false) { +simdjson_inline simdjson_result<westmere::ondemand::document>::operator std::string_view() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<ppc64::ondemand::document>::operator ppc64::ondemand::raw_json_string() noexcept(false) { +simdjson_inline simdjson_result<westmere::ondemand::document>::operator westmere::ondemand::raw_json_string() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<ppc64::ondemand::document>::operator bool() noexcept(false) { +simdjson_inline simdjson_result<westmere::ondemand::document>::operator bool() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<ppc64::ondemand::document>::operator ppc64::ondemand::value() noexcept(false) { +simdjson_inline simdjson_result<westmere::ondemand::document>::operator westmere::ondemand::value() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } #endif -simdjson_inline simdjson_result<const char *> simdjson_result<ppc64::ondemand::document>::current_location() noexcept { +simdjson_inline simdjson_result<const char *> simdjson_result<westmere::ondemand::document>::current_location() noexcept { if (error()) { return error(); } return first.current_location(); } -simdjson_inline bool simdjson_result<ppc64::ondemand::document>::at_end() const noexcept { +simdjson_inline bool simdjson_result<westmere::ondemand::document>::at_end() const noexcept { if (error()) { return error(); } return first.at_end(); } -simdjson_inline int32_t simdjson_result<ppc64::ondemand::document>::current_depth() const noexcept { +simdjson_inline int32_t simdjson_result<westmere::ondemand::document>::current_depth() const noexcept { if (error()) { return error(); } return first.current_depth(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<ppc64::ondemand::document>::raw_json_token() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<westmere::ondemand::document>::raw_json_token() noexcept { if (error()) { return error(); } return first.raw_json_token(); } -simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::document>::at_pointer(std::string_view json_pointer) noexcept { +simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::document>::at_pointer(std::string_view json_pointer) noexcept { if (error()) { return error(); } return first.at_pointer(json_pointer); } -simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::document>::at_path(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::document>::at_path(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path(json_path); } -simdjson_inline simdjson_result<std::vector<ppc64::ondemand::value>> simdjson_result<ppc64::ondemand::document>::at_path_with_wildcard(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<std::vector<westmere::ondemand::value>> simdjson_result<westmere::ondemand::document>::at_path_with_wildcard(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path_with_wildcard(json_path); } @@ -101778,7 +138167,7 @@ simdjson_inline simdjson_result<std::vector<ppc64::ondemand::value>> simdjson_re #if SIMDJSON_STATIC_REFLECTION template<constevalutil::fixed_string... FieldNames, typename T> requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) -simdjson_warn_unused simdjson_inline error_code simdjson_result<ppc64::ondemand::document>::extract_into(T& out) & noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<westmere::ondemand::document>::extract_into(T& out) & noexcept { if (error()) { return error(); } return first.extract_into<FieldNames...>(out); } @@ -101788,7 +138177,7 @@ simdjson_warn_unused simdjson_inline error_code simdjson_result<ppc64::ondemand: namespace simdjson { -namespace ppc64 { +namespace westmere { namespace ondemand { simdjson_inline document_reference::document_reference() noexcept : doc{nullptr} {} @@ -101880,253 +138269,253 @@ simdjson_warn_unused simdjson_inline error_code document_reference::extract_into } #endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION } // namespace ondemand -} // namespace ppc64 +} // namespace westmere } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<ppc64::ondemand::document_reference>::simdjson_result(ppc64::ondemand::document_reference value, error_code error) - noexcept : implementation_simdjson_result_base<ppc64::ondemand::document_reference>(std::forward<ppc64::ondemand::document_reference>(value), error) {} +simdjson_inline simdjson_result<westmere::ondemand::document_reference>::simdjson_result(westmere::ondemand::document_reference value, error_code error) + noexcept : implementation_simdjson_result_base<westmere::ondemand::document_reference>(std::forward<westmere::ondemand::document_reference>(value), error) {} -simdjson_inline simdjson_result<size_t> simdjson_result<ppc64::ondemand::document_reference>::count_elements() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<westmere::ondemand::document_reference>::count_elements() & noexcept { if (error()) { return error(); } return first.count_elements(); } -simdjson_inline simdjson_result<size_t> simdjson_result<ppc64::ondemand::document_reference>::count_fields() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<westmere::ondemand::document_reference>::count_fields() & noexcept { if (error()) { return error(); } return first.count_fields(); } -simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::document_reference>::at(size_t index) & noexcept { +simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::document_reference>::at(size_t index) & noexcept { if (error()) { return error(); } return first.at(index); } -simdjson_inline error_code simdjson_result<ppc64::ondemand::document_reference>::rewind() noexcept { +simdjson_inline error_code simdjson_result<westmere::ondemand::document_reference>::rewind() noexcept { if (error()) { return error(); } first.rewind(); return SUCCESS; } -simdjson_inline simdjson_result<ppc64::ondemand::array_iterator> simdjson_result<ppc64::ondemand::document_reference>::begin() & noexcept { +simdjson_inline simdjson_result<westmere::ondemand::array_iterator> simdjson_result<westmere::ondemand::document_reference>::begin() & noexcept { if (error()) { return error(); } return first.begin(); } -simdjson_inline simdjson_result<ppc64::ondemand::array_iterator> simdjson_result<ppc64::ondemand::document_reference>::end() & noexcept { +simdjson_inline simdjson_result<westmere::ondemand::array_iterator> simdjson_result<westmere::ondemand::document_reference>::end() & noexcept { return {}; } -simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::document_reference>::find_field_unordered(std::string_view key) & noexcept { +simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::document_reference>::find_field_unordered(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::document_reference>::find_field_unordered(const char *key) & noexcept { +simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::document_reference>::find_field_unordered(const char *key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::document_reference>::operator[](std::string_view key) & noexcept { +simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::document_reference>::operator[](std::string_view key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::document_reference>::operator[](const char *key) & noexcept { +simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::document_reference>::operator[](const char *key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::document_reference>::find_field(std::string_view key) & noexcept { +simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::document_reference>::find_field(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::document_reference>::find_field(const char *key) & noexcept { +simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::document_reference>::find_field(const char *key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<ppc64::ondemand::array> simdjson_result<ppc64::ondemand::document_reference>::get_array() & noexcept { +simdjson_inline simdjson_result<westmere::ondemand::array> simdjson_result<westmere::ondemand::document_reference>::get_array() & noexcept { if (error()) { return error(); } return first.get_array(); } -simdjson_inline simdjson_result<ppc64::ondemand::object> simdjson_result<ppc64::ondemand::document_reference>::get_object() & noexcept { +simdjson_inline simdjson_result<westmere::ondemand::object> simdjson_result<westmere::ondemand::document_reference>::get_object() & noexcept { if (error()) { return error(); } return first.get_object(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<ppc64::ondemand::document_reference>::get_uint64() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<westmere::ondemand::document_reference>::get_uint64() noexcept { if (error()) { return error(); } return first.get_uint64(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<ppc64::ondemand::document_reference>::get_uint64_in_string() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<westmere::ondemand::document_reference>::get_uint64_in_string() noexcept { if (error()) { return error(); } return first.get_uint64_in_string(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<ppc64::ondemand::document_reference>::get_int64() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<westmere::ondemand::document_reference>::get_int64() noexcept { if (error()) { return error(); } return first.get_int64(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<ppc64::ondemand::document_reference>::get_int64_in_string() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<westmere::ondemand::document_reference>::get_int64_in_string() noexcept { if (error()) { return error(); } return first.get_int64_in_string(); } -simdjson_inline simdjson_result<double> simdjson_result<ppc64::ondemand::document_reference>::get_double() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<westmere::ondemand::document_reference>::get_double() noexcept { if (error()) { return error(); } return first.get_double(); } -simdjson_inline simdjson_result<double> simdjson_result<ppc64::ondemand::document_reference>::get_double_in_string() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<westmere::ondemand::document_reference>::get_double_in_string() noexcept { if (error()) { return error(); } return first.get_double_in_string(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<ppc64::ondemand::document_reference>::get_string(bool allow_replacement) noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<westmere::ondemand::document_reference>::get_string(bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(allow_replacement); } template <typename string_type> -simdjson_warn_unused simdjson_inline error_code simdjson_result<ppc64::ondemand::document_reference>::get_string(string_type& receiver, bool allow_replacement) noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<westmere::ondemand::document_reference>::get_string(string_type& receiver, bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(receiver, allow_replacement); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<ppc64::ondemand::document_reference>::get_wobbly_string() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<westmere::ondemand::document_reference>::get_wobbly_string() noexcept { if (error()) { return error(); } return first.get_wobbly_string(); } -simdjson_inline simdjson_result<ppc64::ondemand::raw_json_string> simdjson_result<ppc64::ondemand::document_reference>::get_raw_json_string() noexcept { +simdjson_inline simdjson_result<westmere::ondemand::raw_json_string> simdjson_result<westmere::ondemand::document_reference>::get_raw_json_string() noexcept { if (error()) { return error(); } return first.get_raw_json_string(); } -simdjson_inline simdjson_result<bool> simdjson_result<ppc64::ondemand::document_reference>::get_bool() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<westmere::ondemand::document_reference>::get_bool() noexcept { if (error()) { return error(); } return first.get_bool(); } -simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::document_reference>::get_value() noexcept { +simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::document_reference>::get_value() noexcept { if (error()) { return error(); } return first.get_value(); } -simdjson_inline simdjson_result<bool> simdjson_result<ppc64::ondemand::document_reference>::is_null() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<westmere::ondemand::document_reference>::is_null() noexcept { if (error()) { return error(); } return first.is_null(); } template<typename T> -simdjson_inline simdjson_result<T> simdjson_result<ppc64::ondemand::document_reference>::get() & noexcept { +simdjson_inline simdjson_result<T> simdjson_result<westmere::ondemand::document_reference>::get() & noexcept { if (error()) { return error(); } return first.get<T>(); } template<typename T> -simdjson_inline simdjson_result<T> simdjson_result<ppc64::ondemand::document_reference>::get() && noexcept { +simdjson_inline simdjson_result<T> simdjson_result<westmere::ondemand::document_reference>::get() && noexcept { if (error()) { return error(); } - return std::forward<ppc64::ondemand::document_reference>(first).get<T>(); + return std::forward<westmere::ondemand::document_reference>(first).get<T>(); } template <class T> -simdjson_warn_unused simdjson_inline error_code simdjson_result<ppc64::ondemand::document_reference>::get(T &out) & noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<westmere::ondemand::document_reference>::get(T &out) & noexcept { if (error()) { return error(); } return first.get<T>(out); } template <class T> -simdjson_warn_unused simdjson_inline error_code simdjson_result<ppc64::ondemand::document_reference>::get(T &out) && noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<westmere::ondemand::document_reference>::get(T &out) && noexcept { if (error()) { return error(); } - return std::forward<ppc64::ondemand::document_reference>(first).get<T>(out); + return std::forward<westmere::ondemand::document_reference>(first).get<T>(out); } -simdjson_inline simdjson_result<ppc64::ondemand::json_type> simdjson_result<ppc64::ondemand::document_reference>::type() noexcept { +simdjson_inline simdjson_result<westmere::ondemand::json_type> simdjson_result<westmere::ondemand::document_reference>::type() noexcept { if (error()) { return error(); } return first.type(); } -simdjson_inline simdjson_result<bool> simdjson_result<ppc64::ondemand::document_reference>::is_scalar() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<westmere::ondemand::document_reference>::is_scalar() noexcept { if (error()) { return error(); } return first.is_scalar(); } -simdjson_inline simdjson_result<bool> simdjson_result<ppc64::ondemand::document_reference>::is_string() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<westmere::ondemand::document_reference>::is_string() noexcept { if (error()) { return error(); } return first.is_string(); } template <> -simdjson_warn_unused simdjson_inline error_code simdjson_result<ppc64::ondemand::document_reference>::get(ppc64::ondemand::document_reference &out) & noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<westmere::ondemand::document_reference>::get(westmere::ondemand::document_reference &out) & noexcept { if (error()) { return error(); } out = first; return SUCCESS; } template <> -simdjson_warn_unused simdjson_inline error_code simdjson_result<ppc64::ondemand::document_reference>::get(ppc64::ondemand::document_reference &out) && noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<westmere::ondemand::document_reference>::get(westmere::ondemand::document_reference &out) && noexcept { if (error()) { return error(); } out = first; return SUCCESS; } -simdjson_inline simdjson_result<bool> simdjson_result<ppc64::ondemand::document_reference>::is_negative() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<westmere::ondemand::document_reference>::is_negative() noexcept { if (error()) { return error(); } return first.is_negative(); } -simdjson_inline simdjson_result<bool> simdjson_result<ppc64::ondemand::document_reference>::is_integer() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<westmere::ondemand::document_reference>::is_integer() noexcept { if (error()) { return error(); } return first.is_integer(); } -simdjson_inline simdjson_result<ppc64::number_type> simdjson_result<ppc64::ondemand::document_reference>::get_number_type() noexcept { +simdjson_inline simdjson_result<westmere::number_type> simdjson_result<westmere::ondemand::document_reference>::get_number_type() noexcept { if (error()) { return error(); } return first.get_number_type(); } -simdjson_inline simdjson_result<ppc64::ondemand::number> simdjson_result<ppc64::ondemand::document_reference>::get_number() noexcept { +simdjson_inline simdjson_result<westmere::ondemand::number> simdjson_result<westmere::ondemand::document_reference>::get_number() noexcept { if (error()) { return error(); } return first.get_number(); } #if SIMDJSON_EXCEPTIONS template <class T> -simdjson_inline simdjson_result<ppc64::ondemand::document_reference>::operator T() noexcept(false) { - static_assert(std::is_same<T, ppc64::ondemand::document_reference>::value == false, "You should not call get<T> when T is a document"); - static_assert(std::is_same<T, ppc64::ondemand::document>::value == false, "You should not call get<T> when T is a document"); +simdjson_inline simdjson_result<westmere::ondemand::document_reference>::operator T() noexcept(false) { + static_assert(std::is_same<T, westmere::ondemand::document_reference>::value == false, "You should not call get<T> when T is a document"); + static_assert(std::is_same<T, westmere::ondemand::document>::value == false, "You should not call get<T> when T is a document"); if (error()) { throw simdjson_error(error()); } return first.get<T>(); } -simdjson_inline simdjson_result<ppc64::ondemand::document_reference>::operator ppc64::ondemand::array() & noexcept(false) { +simdjson_inline simdjson_result<westmere::ondemand::document_reference>::operator westmere::ondemand::array() & noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<ppc64::ondemand::document_reference>::operator ppc64::ondemand::object() & noexcept(false) { +simdjson_inline simdjson_result<westmere::ondemand::document_reference>::operator westmere::ondemand::object() & noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<ppc64::ondemand::document_reference>::operator uint64_t() noexcept(false) { +simdjson_inline simdjson_result<westmere::ondemand::document_reference>::operator uint64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<ppc64::ondemand::document_reference>::operator int64_t() noexcept(false) { +simdjson_inline simdjson_result<westmere::ondemand::document_reference>::operator int64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<ppc64::ondemand::document_reference>::operator double() noexcept(false) { +simdjson_inline simdjson_result<westmere::ondemand::document_reference>::operator double() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<ppc64::ondemand::document_reference>::operator std::string_view() noexcept(false) { +simdjson_inline simdjson_result<westmere::ondemand::document_reference>::operator std::string_view() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<ppc64::ondemand::document_reference>::operator ppc64::ondemand::raw_json_string() noexcept(false) { +simdjson_inline simdjson_result<westmere::ondemand::document_reference>::operator westmere::ondemand::raw_json_string() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<ppc64::ondemand::document_reference>::operator bool() noexcept(false) { +simdjson_inline simdjson_result<westmere::ondemand::document_reference>::operator bool() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<ppc64::ondemand::document_reference>::operator ppc64::ondemand::value() noexcept(false) { +simdjson_inline simdjson_result<westmere::ondemand::document_reference>::operator westmere::ondemand::value() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } #endif -simdjson_inline simdjson_result<const char *> simdjson_result<ppc64::ondemand::document_reference>::current_location() noexcept { +simdjson_inline simdjson_result<const char *> simdjson_result<westmere::ondemand::document_reference>::current_location() noexcept { if (error()) { return error(); } return first.current_location(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<ppc64::ondemand::document_reference>::raw_json_token() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<westmere::ondemand::document_reference>::raw_json_token() noexcept { if (error()) { return error(); } return first.raw_json_token(); } -simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::document_reference>::at_pointer(std::string_view json_pointer) noexcept { +simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::document_reference>::at_pointer(std::string_view json_pointer) noexcept { if (error()) { return error(); } return first.at_pointer(json_pointer); } -simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::document_reference>::at_path(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::document_reference>::at_path(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path(json_path); } -simdjson_inline simdjson_result<std::vector<ppc64::ondemand::value>> simdjson_result<ppc64::ondemand::document_reference>::at_path_with_wildcard(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<std::vector<westmere::ondemand::value>> simdjson_result<westmere::ondemand::document_reference>::at_path_with_wildcard(std::string_view json_path) noexcept { if (error()) { return error(); } @@ -102135,7 +138524,7 @@ simdjson_inline simdjson_result<std::vector<ppc64::ondemand::value>> simdjson_re #if SIMDJSON_STATIC_REFLECTION template<constevalutil::fixed_string... FieldNames, typename T> requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) -simdjson_warn_unused simdjson_inline error_code simdjson_result<ppc64::ondemand::document_reference>::extract_into(T& out) & noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<westmere::ondemand::document_reference>::extract_into(T& out) & noexcept { if (error()) { return error(); } return first.extract_into<FieldNames...>(out); } @@ -102143,9 +138532,9 @@ simdjson_warn_unused simdjson_inline error_code simdjson_result<ppc64::ondemand: } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H -/* end file simdjson/generic/ondemand/document-inl.h for ppc64 */ -/* including simdjson/generic/ondemand/document_stream-inl.h for ppc64: #include "simdjson/generic/ondemand/document_stream-inl.h" */ -/* begin file simdjson/generic/ondemand/document_stream-inl.h for ppc64 */ +/* end file simdjson/generic/ondemand/document-inl.h for westmere */ +/* including simdjson/generic/ondemand/document_stream-inl.h for westmere: #include "simdjson/generic/ondemand/document_stream-inl.h" */ +/* begin file simdjson/generic/ondemand/document_stream-inl.h for westmere */ #ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -102160,7 +138549,7 @@ simdjson_warn_unused simdjson_inline error_code simdjson_result<ppc64::ondemand: #include <stdexcept> namespace simdjson { -namespace ppc64 { +namespace westmere { namespace ondemand { #ifdef SIMDJSON_THREADS_ENABLED @@ -102567,22 +138956,22 @@ inline void document_stream::start_stage1_thread() noexcept { #endif // SIMDJSON_THREADS_ENABLED } // namespace ondemand -} // namespace ppc64 +} // namespace westmere } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<ppc64::ondemand::document_stream>::simdjson_result( +simdjson_inline simdjson_result<westmere::ondemand::document_stream>::simdjson_result( error_code error ) noexcept : - implementation_simdjson_result_base<ppc64::ondemand::document_stream>(error) + implementation_simdjson_result_base<westmere::ondemand::document_stream>(error) { } -simdjson_inline simdjson_result<ppc64::ondemand::document_stream>::simdjson_result( - ppc64::ondemand::document_stream &&value +simdjson_inline simdjson_result<westmere::ondemand::document_stream>::simdjson_result( + westmere::ondemand::document_stream &&value ) noexcept : - implementation_simdjson_result_base<ppc64::ondemand::document_stream>( - std::forward<ppc64::ondemand::document_stream>(value) + implementation_simdjson_result_base<westmere::ondemand::document_stream>( + std::forward<westmere::ondemand::document_stream>(value) ) { } @@ -102590,9 +138979,9 @@ simdjson_inline simdjson_result<ppc64::ondemand::document_stream>::simdjson_resu } #endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_INL_H -/* end file simdjson/generic/ondemand/document_stream-inl.h for ppc64 */ -/* including simdjson/generic/ondemand/field-inl.h for ppc64: #include "simdjson/generic/ondemand/field-inl.h" */ -/* begin file simdjson/generic/ondemand/field-inl.h for ppc64 */ +/* end file simdjson/generic/ondemand/document_stream-inl.h for westmere */ +/* including simdjson/generic/ondemand/field-inl.h for westmere: #include "simdjson/generic/ondemand/field-inl.h" */ +/* begin file simdjson/generic/ondemand/field-inl.h for westmere */ #ifndef SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -102604,7 +138993,7 @@ simdjson_inline simdjson_result<ppc64::ondemand::document_stream>::simdjson_resu /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace ppc64 { +namespace westmere { namespace ondemand { // clang 6 does not think the default constructor can be noexcept, so we make it explicit @@ -102668,53 +139057,53 @@ simdjson_inline value field::value() && noexcept { } } // namespace ondemand -} // namespace ppc64 +} // namespace westmere } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<ppc64::ondemand::field>::simdjson_result( - ppc64::ondemand::field &&value +simdjson_inline simdjson_result<westmere::ondemand::field>::simdjson_result( + westmere::ondemand::field &&value ) noexcept : - implementation_simdjson_result_base<ppc64::ondemand::field>( - std::forward<ppc64::ondemand::field>(value) + implementation_simdjson_result_base<westmere::ondemand::field>( + std::forward<westmere::ondemand::field>(value) ) { } -simdjson_inline simdjson_result<ppc64::ondemand::field>::simdjson_result( +simdjson_inline simdjson_result<westmere::ondemand::field>::simdjson_result( error_code error ) noexcept : - implementation_simdjson_result_base<ppc64::ondemand::field>(error) + implementation_simdjson_result_base<westmere::ondemand::field>(error) { } -simdjson_inline simdjson_result<ppc64::ondemand::raw_json_string> simdjson_result<ppc64::ondemand::field>::key() noexcept { +simdjson_inline simdjson_result<westmere::ondemand::raw_json_string> simdjson_result<westmere::ondemand::field>::key() noexcept { if (error()) { return error(); } return first.key(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<ppc64::ondemand::field>::key_raw_json_token() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<westmere::ondemand::field>::key_raw_json_token() noexcept { if (error()) { return error(); } return first.key_raw_json_token(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<ppc64::ondemand::field>::escaped_key() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<westmere::ondemand::field>::escaped_key() noexcept { if (error()) { return error(); } return first.escaped_key(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<ppc64::ondemand::field>::unescaped_key(bool allow_replacement) noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<westmere::ondemand::field>::unescaped_key(bool allow_replacement) noexcept { if (error()) { return error(); } return first.unescaped_key(allow_replacement); } template<typename string_type> -simdjson_warn_unused simdjson_inline error_code simdjson_result<ppc64::ondemand::field>::unescaped_key(string_type &receiver, bool allow_replacement) noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<westmere::ondemand::field>::unescaped_key(string_type &receiver, bool allow_replacement) noexcept { if (error()) { return error(); } return first.unescaped_key(receiver, allow_replacement); } -simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::field>::value() noexcept { +simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::field>::value() noexcept { if (error()) { return error(); } return std::move(first.value()); } @@ -102722,9 +139111,9 @@ simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::o } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H -/* end file simdjson/generic/ondemand/field-inl.h for ppc64 */ -/* including simdjson/generic/ondemand/json_iterator-inl.h for ppc64: #include "simdjson/generic/ondemand/json_iterator-inl.h" */ -/* begin file simdjson/generic/ondemand/json_iterator-inl.h for ppc64 */ +/* end file simdjson/generic/ondemand/field-inl.h for westmere */ +/* including simdjson/generic/ondemand/json_iterator-inl.h for westmere: #include "simdjson/generic/ondemand/json_iterator-inl.h" */ +/* begin file simdjson/generic/ondemand/json_iterator-inl.h for westmere */ #ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -102740,7 +139129,7 @@ simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::o /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace ppc64 { +namespace westmere { namespace ondemand { simdjson_inline json_iterator::json_iterator(json_iterator &&other) noexcept @@ -102942,11 +139331,10 @@ simdjson_inline void json_iterator::assert_more_tokens(uint32_t required_tokens) } simdjson_inline void json_iterator::assert_valid_position(token_position position) const noexcept { + (void)position; // Suppress unused parameter warning #ifndef SIMDJSON_CLANG_VISUAL_STUDIO SIMDJSON_ASSUME( position >= &parser->implementation->structural_indexes[0] ); SIMDJSON_ASSUME( position < &parser->implementation->structural_indexes[parser->implementation->n_structural_indexes] ); -#else - (void)position; // Suppress unused parameter warning #endif } @@ -103085,7 +139473,11 @@ simdjson_inline token_position json_iterator::position() const noexcept { simdjson_inline simdjson_result<std::string_view> json_iterator::unescape(raw_json_string in, bool allow_replacement) noexcept { #if SIMDJSON_DEVELOPMENT_CHECKS auto result = parser->unescape(in, _string_buf_loc, allow_replacement); +#if !defined(SIMDJSON_VISUAL_STUDIO) && !defined(SIMDJSON_CLANG_VISUAL_STUDIO) + // Under Visual Studio, the next SIMDJSON_ASSUME fails with: the argument + // has side effects that will be discarded. SIMDJSON_ASSUME(!parser->string_buffer_overflow(_string_buf_loc)); +#endif // !defined(SIMDJSON_VISUAL_STUDIO) && !defined(SIMDJSON_CLANG_VISUAL_STUDIO) return result; #else return parser->unescape(in, _string_buf_loc, allow_replacement); @@ -103095,7 +139487,11 @@ simdjson_inline simdjson_result<std::string_view> json_iterator::unescape(raw_js simdjson_inline simdjson_result<std::string_view> json_iterator::unescape_wobbly(raw_json_string in) noexcept { #if SIMDJSON_DEVELOPMENT_CHECKS auto result = parser->unescape_wobbly(in, _string_buf_loc); +#if !defined(SIMDJSON_VISUAL_STUDIO) && !defined(SIMDJSON_CLANG_VISUAL_STUDIO) + // Under Visual Studio, the next SIMDJSON_ASSUME fails with: the argument + // has side effects that will be discarded. SIMDJSON_ASSUME(!parser->string_buffer_overflow(_string_buf_loc)); +#endif // !defined(SIMDJSON_VISUAL_STUDIO) && !defined(SIMDJSON_CLANG_VISUAL_STUDIO) return result; #else return parser->unescape_wobbly(in, _string_buf_loc); @@ -103158,22 +139554,22 @@ simdjson_warn_unused simdjson_inline bool json_iterator::copy_to_buffer(const ui } } // namespace ondemand -} // namespace ppc64 +} // namespace westmere } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<ppc64::ondemand::json_iterator>::simdjson_result(ppc64::ondemand::json_iterator &&value) noexcept - : implementation_simdjson_result_base<ppc64::ondemand::json_iterator>(std::forward<ppc64::ondemand::json_iterator>(value)) {} -simdjson_inline simdjson_result<ppc64::ondemand::json_iterator>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<ppc64::ondemand::json_iterator>(error) {} +simdjson_inline simdjson_result<westmere::ondemand::json_iterator>::simdjson_result(westmere::ondemand::json_iterator &&value) noexcept + : implementation_simdjson_result_base<westmere::ondemand::json_iterator>(std::forward<westmere::ondemand::json_iterator>(value)) {} +simdjson_inline simdjson_result<westmere::ondemand::json_iterator>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<westmere::ondemand::json_iterator>(error) {} } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_INL_H -/* end file simdjson/generic/ondemand/json_iterator-inl.h for ppc64 */ -/* including simdjson/generic/ondemand/json_type-inl.h for ppc64: #include "simdjson/generic/ondemand/json_type-inl.h" */ -/* begin file simdjson/generic/ondemand/json_type-inl.h for ppc64 */ +/* end file simdjson/generic/ondemand/json_iterator-inl.h for westmere */ +/* including simdjson/generic/ondemand/json_type-inl.h for westmere: #include "simdjson/generic/ondemand/json_type-inl.h" */ +/* begin file simdjson/generic/ondemand/json_type-inl.h for westmere */ #ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -103184,7 +139580,7 @@ simdjson_inline simdjson_result<ppc64::ondemand::json_iterator>::simdjson_result /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace ppc64 { +namespace westmere { namespace ondemand { inline std::ostream& operator<<(std::ostream& out, json_type type) noexcept { @@ -103278,22 +139674,22 @@ simdjson_inline void number::skip_double() noexcept { } } // namespace ondemand -} // namespace ppc64 +} // namespace westmere } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<ppc64::ondemand::json_type>::simdjson_result(ppc64::ondemand::json_type &&value) noexcept - : implementation_simdjson_result_base<ppc64::ondemand::json_type>(std::forward<ppc64::ondemand::json_type>(value)) {} -simdjson_inline simdjson_result<ppc64::ondemand::json_type>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<ppc64::ondemand::json_type>(error) {} +simdjson_inline simdjson_result<westmere::ondemand::json_type>::simdjson_result(westmere::ondemand::json_type &&value) noexcept + : implementation_simdjson_result_base<westmere::ondemand::json_type>(std::forward<westmere::ondemand::json_type>(value)) {} +simdjson_inline simdjson_result<westmere::ondemand::json_type>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<westmere::ondemand::json_type>(error) {} } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_INL_H -/* end file simdjson/generic/ondemand/json_type-inl.h for ppc64 */ -/* including simdjson/generic/ondemand/logger-inl.h for ppc64: #include "simdjson/generic/ondemand/logger-inl.h" */ -/* begin file simdjson/generic/ondemand/logger-inl.h for ppc64 */ +/* end file simdjson/generic/ondemand/json_type-inl.h for westmere */ +/* including simdjson/generic/ondemand/logger-inl.h for westmere: #include "simdjson/generic/ondemand/logger-inl.h" */ +/* begin file simdjson/generic/ondemand/logger-inl.h for westmere */ #ifndef SIMDJSON_GENERIC_ONDEMAND_LOGGER_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -103308,7 +139704,7 @@ simdjson_inline simdjson_result<ppc64::ondemand::json_type>::simdjson_result(err #include <cstring> namespace simdjson { -namespace ppc64 { +namespace westmere { namespace ondemand { namespace logger { @@ -103515,13 +139911,13 @@ inline void log_line(const json_iterator &iter, token_position index, depth_t de } // namespace logger } // namespace ondemand -} // namespace ppc64 +} // namespace westmere } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_LOGGER_INL_H -/* end file simdjson/generic/ondemand/logger-inl.h for ppc64 */ -/* including simdjson/generic/ondemand/object-inl.h for ppc64: #include "simdjson/generic/ondemand/object-inl.h" */ -/* begin file simdjson/generic/ondemand/object-inl.h for ppc64 */ +/* end file simdjson/generic/ondemand/logger-inl.h for westmere */ +/* including simdjson/generic/ondemand/object-inl.h for westmere: #include "simdjson/generic/ondemand/object-inl.h" */ +/* begin file simdjson/generic/ondemand/object-inl.h for westmere */ #ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -103541,7 +139937,7 @@ inline void log_line(const json_iterator &iter, token_position index, depth_t de /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace ppc64 { +namespace westmere { namespace ondemand { simdjson_inline simdjson_result<value> object::find_field_unordered(const std::string_view key) & noexcept { @@ -103815,55 +140211,55 @@ simdjson_warn_unused simdjson_inline error_code object::extract_into(T& out) & n #endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION } // namespace ondemand -} // namespace ppc64 +} // namespace westmere } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<ppc64::ondemand::object>::simdjson_result(ppc64::ondemand::object &&value) noexcept - : implementation_simdjson_result_base<ppc64::ondemand::object>(std::forward<ppc64::ondemand::object>(value)) {} -simdjson_inline simdjson_result<ppc64::ondemand::object>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<ppc64::ondemand::object>(error) {} +simdjson_inline simdjson_result<westmere::ondemand::object>::simdjson_result(westmere::ondemand::object &&value) noexcept + : implementation_simdjson_result_base<westmere::ondemand::object>(std::forward<westmere::ondemand::object>(value)) {} +simdjson_inline simdjson_result<westmere::ondemand::object>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<westmere::ondemand::object>(error) {} -simdjson_inline simdjson_result<ppc64::ondemand::object_iterator> simdjson_result<ppc64::ondemand::object>::begin() noexcept { +simdjson_inline simdjson_result<westmere::ondemand::object_iterator> simdjson_result<westmere::ondemand::object>::begin() noexcept { if (error()) { return error(); } return first.begin(); } -simdjson_inline simdjson_result<ppc64::ondemand::object_iterator> simdjson_result<ppc64::ondemand::object>::end() noexcept { +simdjson_inline simdjson_result<westmere::ondemand::object_iterator> simdjson_result<westmere::ondemand::object>::end() noexcept { if (error()) { return error(); } return first.end(); } -simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::object>::find_field_unordered(std::string_view key) & noexcept { +simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::object>::find_field_unordered(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::object>::find_field_unordered(std::string_view key) && noexcept { +simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::object>::find_field_unordered(std::string_view key) && noexcept { if (error()) { return error(); } - return std::forward<ppc64::ondemand::object>(first).find_field_unordered(key); + return std::forward<westmere::ondemand::object>(first).find_field_unordered(key); } -simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::object>::operator[](std::string_view key) & noexcept { +simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::object>::operator[](std::string_view key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::object>::operator[](std::string_view key) && noexcept { +simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::object>::operator[](std::string_view key) && noexcept { if (error()) { return error(); } - return std::forward<ppc64::ondemand::object>(first)[key]; + return std::forward<westmere::ondemand::object>(first)[key]; } -simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::object>::find_field(std::string_view key) & noexcept { +simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::object>::find_field(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::object>::find_field(std::string_view key) && noexcept { +simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::object>::find_field(std::string_view key) && noexcept { if (error()) { return error(); } - return std::forward<ppc64::ondemand::object>(first).find_field(key); + return std::forward<westmere::ondemand::object>(first).find_field(key); } -simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::object>::at_pointer(std::string_view json_pointer) noexcept { +simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::object>::at_pointer(std::string_view json_pointer) noexcept { if (error()) { return error(); } return first.at_pointer(json_pointer); } -simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::ondemand::object>::at_path( +simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::object>::at_path( std::string_view json_path) noexcept { if (error()) { return error(); @@ -103871,27 +140267,27 @@ simdjson_inline simdjson_result<ppc64::ondemand::value> simdjson_result<ppc64::o return first.at_path(json_path); } -simdjson_inline simdjson_result<std::vector<ppc64::ondemand::value>> simdjson_result<ppc64::ondemand::object>::at_path_with_wildcard(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<std::vector<westmere::ondemand::value>> simdjson_result<westmere::ondemand::object>::at_path_with_wildcard(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path_with_wildcard(json_path); } -inline simdjson_result<bool> simdjson_result<ppc64::ondemand::object>::reset() noexcept { +inline simdjson_result<bool> simdjson_result<westmere::ondemand::object>::reset() noexcept { if (error()) { return error(); } return first.reset(); } -inline simdjson_result<bool> simdjson_result<ppc64::ondemand::object>::is_empty() noexcept { +inline simdjson_result<bool> simdjson_result<westmere::ondemand::object>::is_empty() noexcept { if (error()) { return error(); } return first.is_empty(); } -simdjson_inline simdjson_result<size_t> simdjson_result<ppc64::ondemand::object>::count_fields() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<westmere::ondemand::object>::count_fields() & noexcept { if (error()) { return error(); } return first.count_fields(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<ppc64::ondemand::object>::raw_json() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<westmere::ondemand::object>::raw_json() noexcept { if (error()) { return error(); } return first.raw_json(); } @@ -103899,9 +140295,9 @@ simdjson_inline simdjson_result<std::string_view> simdjson_result<ppc64::ondema } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_INL_H -/* end file simdjson/generic/ondemand/object-inl.h for ppc64 */ -/* including simdjson/generic/ondemand/object_iterator-inl.h for ppc64: #include "simdjson/generic/ondemand/object_iterator-inl.h" */ -/* begin file simdjson/generic/ondemand/object_iterator-inl.h for ppc64 */ +/* end file simdjson/generic/ondemand/object-inl.h for westmere */ +/* including simdjson/generic/ondemand/object_iterator-inl.h for westmere: #include "simdjson/generic/ondemand/object_iterator-inl.h" */ +/* begin file simdjson/generic/ondemand/object_iterator-inl.h for westmere */ #ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -103913,7 +140309,7 @@ simdjson_inline simdjson_result<std::string_view> simdjson_result<ppc64::ondema /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace ppc64 { +namespace westmere { namespace ondemand { // @@ -103925,6 +140321,11 @@ simdjson_inline object_iterator::object_iterator(const value_iterator &_iter) no {} simdjson_inline simdjson_result<field> object_iterator::operator*() noexcept { +#if SIMDJSON_DEVELOPMENT_CHECKS + // We must call * once per iteration. + SIMDJSON_ASSUME(!has_been_referenced); + has_been_referenced = true; +#endif error_code error = iter.error(); if (error) { iter.abandon(); return error; } auto result = field::start(iter); @@ -103943,6 +140344,11 @@ simdjson_inline bool object_iterator::operator!=(const object_iterator &) const SIMDJSON_PUSH_DISABLE_WARNINGS SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING simdjson_inline object_iterator &object_iterator::operator++() noexcept { +#if SIMDJSON_DEVELOPMENT_CHECKS + // Before calling ++, we must have called *. + SIMDJSON_ASSUME(has_been_referenced); + has_been_referenced = false; +#endif // TODO this is a safety rail ... users should exit loops as soon as they receive an error. // Nonetheless, let's see if performance is OK with this if statement--the compiler may give it to us for free. if (!iter.is_open()) { return *this; } // Iterator will be released if there is an error @@ -103998,39 +140404,39 @@ SIMDJSON_POP_DISABLE_WARNINGS // } // namespace ondemand -} // namespace ppc64 +} // namespace westmere } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<ppc64::ondemand::object_iterator>::simdjson_result( - ppc64::ondemand::object_iterator &&value +simdjson_inline simdjson_result<westmere::ondemand::object_iterator>::simdjson_result( + westmere::ondemand::object_iterator &&value ) noexcept - : implementation_simdjson_result_base<ppc64::ondemand::object_iterator>(std::forward<ppc64::ondemand::object_iterator>(value)) + : implementation_simdjson_result_base<westmere::ondemand::object_iterator>(std::forward<westmere::ondemand::object_iterator>(value)) { first.iter.assert_is_valid(); } -simdjson_inline simdjson_result<ppc64::ondemand::object_iterator>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<ppc64::ondemand::object_iterator>({}, error) +simdjson_inline simdjson_result<westmere::ondemand::object_iterator>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<westmere::ondemand::object_iterator>({}, error) { } -simdjson_inline simdjson_result<ppc64::ondemand::field> simdjson_result<ppc64::ondemand::object_iterator>::operator*() noexcept { +simdjson_inline simdjson_result<westmere::ondemand::field> simdjson_result<westmere::ondemand::object_iterator>::operator*() noexcept { if (error()) { return error(); } return *first; } // If we're iterating and there is an error, return the error once. -simdjson_inline bool simdjson_result<ppc64::ondemand::object_iterator>::operator==(const simdjson_result<ppc64::ondemand::object_iterator> &other) const noexcept { +simdjson_inline bool simdjson_result<westmere::ondemand::object_iterator>::operator==(const simdjson_result<westmere::ondemand::object_iterator> &other) const noexcept { if (!first.iter.is_valid()) { return !error(); } return first == other.first; } // If we're iterating and there is an error, return the error once. -simdjson_inline bool simdjson_result<ppc64::ondemand::object_iterator>::operator!=(const simdjson_result<ppc64::ondemand::object_iterator> &other) const noexcept { +simdjson_inline bool simdjson_result<westmere::ondemand::object_iterator>::operator!=(const simdjson_result<westmere::ondemand::object_iterator> &other) const noexcept { if (!first.iter.is_valid()) { return error(); } return first != other.first; } // Checks for ']' and ',' -simdjson_inline simdjson_result<ppc64::ondemand::object_iterator> &simdjson_result<ppc64::ondemand::object_iterator>::operator++() noexcept { +simdjson_inline simdjson_result<westmere::ondemand::object_iterator> &simdjson_result<westmere::ondemand::object_iterator>::operator++() noexcept { // Clear the error if there is one, so we don't yield it twice if (error()) { second = SUCCESS; return *this; } ++first; @@ -104040,9 +140446,9 @@ simdjson_inline simdjson_result<ppc64::ondemand::object_iterator> &simdjson_resu } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_INL_H -/* end file simdjson/generic/ondemand/object_iterator-inl.h for ppc64 */ -/* including simdjson/generic/ondemand/parser-inl.h for ppc64: #include "simdjson/generic/ondemand/parser-inl.h" */ -/* begin file simdjson/generic/ondemand/parser-inl.h for ppc64 */ +/* end file simdjson/generic/ondemand/object_iterator-inl.h for westmere */ +/* including simdjson/generic/ondemand/parser-inl.h for westmere: #include "simdjson/generic/ondemand/parser-inl.h" */ +/* begin file simdjson/generic/ondemand/parser-inl.h for westmere */ #ifndef SIMDJSON_GENERIC_ONDEMAND_PARSER_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -104059,7 +140465,7 @@ simdjson_inline simdjson_result<ppc64::ondemand::object_iterator> &simdjson_resu /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace ppc64 { +namespace westmere { namespace ondemand { simdjson_inline parser::parser(size_t max_capacity) noexcept @@ -104269,22 +140675,22 @@ simdjson_inline simdjson_warn_unused std::unique_ptr<ondemand::parser>& parser:: } // namespace ondemand -} // namespace ppc64 +} // namespace westmere } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<ppc64::ondemand::parser>::simdjson_result(ppc64::ondemand::parser &&value) noexcept - : implementation_simdjson_result_base<ppc64::ondemand::parser>(std::forward<ppc64::ondemand::parser>(value)) {} -simdjson_inline simdjson_result<ppc64::ondemand::parser>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<ppc64::ondemand::parser>(error) {} +simdjson_inline simdjson_result<westmere::ondemand::parser>::simdjson_result(westmere::ondemand::parser &&value) noexcept + : implementation_simdjson_result_base<westmere::ondemand::parser>(std::forward<westmere::ondemand::parser>(value)) {} +simdjson_inline simdjson_result<westmere::ondemand::parser>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<westmere::ondemand::parser>(error) {} } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_PARSER_INL_H -/* end file simdjson/generic/ondemand/parser-inl.h for ppc64 */ -/* including simdjson/generic/ondemand/raw_json_string-inl.h for ppc64: #include "simdjson/generic/ondemand/raw_json_string-inl.h" */ -/* begin file simdjson/generic/ondemand/raw_json_string-inl.h for ppc64 */ +/* end file simdjson/generic/ondemand/parser-inl.h for westmere */ +/* including simdjson/generic/ondemand/raw_json_string-inl.h for westmere: #include "simdjson/generic/ondemand/raw_json_string-inl.h" */ +/* begin file simdjson/generic/ondemand/raw_json_string-inl.h for westmere */ #ifndef SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -104297,7 +140703,7 @@ simdjson_inline simdjson_result<ppc64::ondemand::parser>::simdjson_result(error_ namespace simdjson { -namespace ppc64 { +namespace westmere { namespace ondemand { simdjson_inline raw_json_string::raw_json_string(const uint8_t * _buf) noexcept : buf{_buf} {} @@ -104471,277 +140877,38 @@ simdjson_unused simdjson_inline std::ostream &operator<<(std::ostream &out, cons } } // namespace ondemand -} // namespace ppc64 +} // namespace westmere } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<ppc64::ondemand::raw_json_string>::simdjson_result(ppc64::ondemand::raw_json_string &&value) noexcept - : implementation_simdjson_result_base<ppc64::ondemand::raw_json_string>(std::forward<ppc64::ondemand::raw_json_string>(value)) {} -simdjson_inline simdjson_result<ppc64::ondemand::raw_json_string>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<ppc64::ondemand::raw_json_string>(error) {} +simdjson_inline simdjson_result<westmere::ondemand::raw_json_string>::simdjson_result(westmere::ondemand::raw_json_string &&value) noexcept + : implementation_simdjson_result_base<westmere::ondemand::raw_json_string>(std::forward<westmere::ondemand::raw_json_string>(value)) {} +simdjson_inline simdjson_result<westmere::ondemand::raw_json_string>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<westmere::ondemand::raw_json_string>(error) {} -simdjson_inline simdjson_result<const char *> simdjson_result<ppc64::ondemand::raw_json_string>::raw() const noexcept { +simdjson_inline simdjson_result<const char *> simdjson_result<westmere::ondemand::raw_json_string>::raw() const noexcept { if (error()) { return error(); } return first.raw(); } -simdjson_inline char simdjson_result<ppc64::ondemand::raw_json_string>::operator[](size_t i) const noexcept { +simdjson_inline char simdjson_result<westmere::ondemand::raw_json_string>::operator[](size_t i) const noexcept { if (error()) { return error(); } return first[i]; } -simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> simdjson_result<ppc64::ondemand::raw_json_string>::unescape(ppc64::ondemand::json_iterator &iter, bool allow_replacement) const noexcept { +simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> simdjson_result<westmere::ondemand::raw_json_string>::unescape(westmere::ondemand::json_iterator &iter, bool allow_replacement) const noexcept { if (error()) { return error(); } return first.unescape(iter, allow_replacement); } -simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> simdjson_result<ppc64::ondemand::raw_json_string>::unescape_wobbly(ppc64::ondemand::json_iterator &iter) const noexcept { +simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> simdjson_result<westmere::ondemand::raw_json_string>::unescape_wobbly(westmere::ondemand::json_iterator &iter) const noexcept { if (error()) { return error(); } return first.unescape_wobbly(iter); } } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_INL_H -/* end file simdjson/generic/ondemand/raw_json_string-inl.h for ppc64 */ -/* including simdjson/generic/ondemand/serialization-inl.h for ppc64: #include "simdjson/generic/ondemand/serialization-inl.h" */ -/* begin file simdjson/generic/ondemand/serialization-inl.h for ppc64 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H - -/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document-inl.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/serialization.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */ -/* amalgamation skipped (editor-only): #if SIMDJSON_STATIC_REFLECTION */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_builder.h" */ -/* amalgamation skipped (editor-only): #endif */ -/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ - -namespace simdjson { - -inline std::string_view trim(const std::string_view str) noexcept { - // We can almost surely do better by rolling our own find_first_not_of function. - size_t first = str.find_first_not_of(" \t\n\r"); - // If we have the empty string (just white space), then no trimming is possible, and - // we return the empty string_view. - if (std::string_view::npos == first) { return std::string_view(); } - size_t last = str.find_last_not_of(" \t\n\r"); - return str.substr(first, (last - first + 1)); -} - - -inline simdjson_result<std::string_view> to_json_string(ppc64::ondemand::document& x) noexcept { - std::string_view v; - auto error = x.raw_json().get(v); - if(error) {return error; } - return trim(v); -} - -inline simdjson_result<std::string_view> to_json_string(ppc64::ondemand::document_reference& x) noexcept { - std::string_view v; - auto error = x.raw_json().get(v); - if(error) {return error; } - return trim(v); -} - -inline simdjson_result<std::string_view> to_json_string(ppc64::ondemand::value& x) noexcept { - /** - * If we somehow receive a value that has already been consumed, - * then the following code could be in trouble. E.g., we create - * an array as needed, but if an array was already created, then - * it could be bad. - */ - using namespace ppc64::ondemand; - ppc64::ondemand::json_type t; - auto error = x.type().get(t); - if(error != SUCCESS) { return error; } - switch (t) - { - case json_type::array: - { - ppc64::ondemand::array array; - error = x.get_array().get(array); - if(error) { return error; } - return to_json_string(array); - } - case json_type::object: - { - ppc64::ondemand::object object; - error = x.get_object().get(object); - if(error) { return error; } - return to_json_string(object); - } - default: - return trim(x.raw_json_token()); - } -} - -inline simdjson_result<std::string_view> to_json_string(ppc64::ondemand::object& x) noexcept { - std::string_view v; - auto error = x.raw_json().get(v); - if(error) {return error; } - return trim(v); -} - -inline simdjson_result<std::string_view> to_json_string(ppc64::ondemand::array& x) noexcept { - std::string_view v; - auto error = x.raw_json().get(v); - if(error) {return error; } - return trim(v); -} - -inline simdjson_result<std::string_view> to_json_string(simdjson_result<ppc64::ondemand::document> x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); -} - -inline simdjson_result<std::string_view> to_json_string(simdjson_result<ppc64::ondemand::document_reference> x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); -} - -inline simdjson_result<std::string_view> to_json_string(simdjson_result<ppc64::ondemand::value> x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); -} - -inline simdjson_result<std::string_view> to_json_string(simdjson_result<ppc64::ondemand::object> x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); -} - -inline simdjson_result<std::string_view> to_json_string(simdjson_result<ppc64::ondemand::array> x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); -} -} // namespace simdjson - -namespace simdjson { namespace ppc64 { namespace ondemand { - -#if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::ppc64::ondemand::value x) { - std::string_view v; - auto error = simdjson::to_json_string(x).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - throw simdjson::simdjson_error(error); - } -} -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::ppc64::ondemand::value> x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); -} -#else -inline std::ostream& operator<<(std::ostream& out, simdjson::ppc64::ondemand::value x) { - std::string_view v; - auto error = simdjson::to_json_string(x).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - return (out << error); - } -} -#endif - -#if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::ppc64::ondemand::array value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - throw simdjson::simdjson_error(error); - } -} -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::ppc64::ondemand::array> x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); -} -#else -inline std::ostream& operator<<(std::ostream& out, simdjson::ppc64::ondemand::array value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - return (out << error); - } -} -#endif - -#if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::ppc64::ondemand::document& value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - throw simdjson::simdjson_error(error); - } -} -inline std::ostream& operator<<(std::ostream& out, simdjson::ppc64::ondemand::document_reference& value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - throw simdjson::simdjson_error(error); - } -} -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::ppc64::ondemand::document>&& x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); -} -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::ppc64::ondemand::document_reference>&& x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); -} -#else -inline std::ostream& operator<<(std::ostream& out, simdjson::ppc64::ondemand::document& value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - return (out << error); - } -} -#endif - -#if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::ppc64::ondemand::object value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - throw simdjson::simdjson_error(error); - } -} -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::ppc64::ondemand::object> x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); -} -#else -inline std::ostream& operator<<(std::ostream& out, simdjson::ppc64::ondemand::object value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - return (out << error); - } -} -#endif -}}} // namespace simdjson::ppc64::ondemand - -#endif // SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H -/* end file simdjson/generic/ondemand/serialization-inl.h for ppc64 */ -/* including simdjson/generic/ondemand/token_iterator-inl.h for ppc64: #include "simdjson/generic/ondemand/token_iterator-inl.h" */ -/* begin file simdjson/generic/ondemand/token_iterator-inl.h for ppc64 */ +/* end file simdjson/generic/ondemand/raw_json_string-inl.h for westmere */ +/* including simdjson/generic/ondemand/token_iterator-inl.h for westmere: #include "simdjson/generic/ondemand/token_iterator-inl.h" */ +/* begin file simdjson/generic/ondemand/token_iterator-inl.h for westmere */ #ifndef SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -104752,7 +140919,7 @@ inline std::ostream& operator<<(std::ostream& out, simdjson::ppc64::ondemand::ob /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace ppc64 { +namespace westmere { namespace ondemand { simdjson_inline token_iterator::token_iterator( @@ -104823,22 +140990,22 @@ simdjson_inline bool token_iterator::operator<=(const token_iterator &other) con } } // namespace ondemand -} // namespace ppc64 +} // namespace westmere } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<ppc64::ondemand::token_iterator>::simdjson_result(ppc64::ondemand::token_iterator &&value) noexcept - : implementation_simdjson_result_base<ppc64::ondemand::token_iterator>(std::forward<ppc64::ondemand::token_iterator>(value)) {} -simdjson_inline simdjson_result<ppc64::ondemand::token_iterator>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<ppc64::ondemand::token_iterator>(error) {} +simdjson_inline simdjson_result<westmere::ondemand::token_iterator>::simdjson_result(westmere::ondemand::token_iterator &&value) noexcept + : implementation_simdjson_result_base<westmere::ondemand::token_iterator>(std::forward<westmere::ondemand::token_iterator>(value)) {} +simdjson_inline simdjson_result<westmere::ondemand::token_iterator>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<westmere::ondemand::token_iterator>(error) {} } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_INL_H -/* end file simdjson/generic/ondemand/token_iterator-inl.h for ppc64 */ -/* including simdjson/generic/ondemand/value_iterator-inl.h for ppc64: #include "simdjson/generic/ondemand/value_iterator-inl.h" */ -/* begin file simdjson/generic/ondemand/value_iterator-inl.h for ppc64 */ +/* end file simdjson/generic/ondemand/token_iterator-inl.h for westmere */ +/* including simdjson/generic/ondemand/value_iterator-inl.h for westmere: #include "simdjson/generic/ondemand/value_iterator-inl.h" */ +/* begin file simdjson/generic/ondemand/value_iterator-inl.h for westmere */ #ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -104853,7 +141020,7 @@ simdjson_inline simdjson_result<ppc64::ondemand::token_iterator>::simdjson_resul /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace ppc64 { +namespace westmere { namespace ondemand { simdjson_inline value_iterator::value_iterator( @@ -104935,7 +141102,6 @@ simdjson_warn_unused simdjson_inline error_code value_iterator::end_container() simdjson_warn_unused simdjson_inline simdjson_result<bool> value_iterator::has_next_field() noexcept { assert_at_next(); - // It's illegal to call this unless there are more tokens: anything that ends in } or ] is // obligated to verify there are more tokens if they are not the top level. switch (*_json_iter->return_current_and_advance()) { @@ -105357,9 +141523,13 @@ simdjson_warn_unused simdjson_inline simdjson_result<std::string_view> value_ite template <typename string_type> simdjson_warn_unused simdjson_inline error_code value_iterator::get_string(string_type& receiver, bool allow_replacement) noexcept { std::string_view content; + // Save the string buffer location so that we can restore it after get_string + auto saved_string_buf_loc = _json_iter->string_buf_loc(); auto err = get_string(allow_replacement).get(content); if (err) { return err; } receiver = content; + // Restore the string buffer location, effectively discarding any temporary string storage + _json_iter->string_buf_loc() = saved_string_buf_loc; return SUCCESS; } simdjson_warn_unused simdjson_inline simdjson_result<std::string_view> value_iterator::get_wobbly_string() noexcept { @@ -105447,7 +141617,7 @@ simdjson_inline simdjson_result<bool> value_iterator::is_root_integer(bool check return answer; } -simdjson_inline simdjson_result<ppc64::number_type> value_iterator::get_root_number_type(bool check_trailing) noexcept { +simdjson_inline simdjson_result<westmere::number_type> value_iterator::get_root_number_type(bool check_trailing) noexcept { auto max_len = peek_root_length(); auto json = peek_root_scalar("number"); // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/, @@ -105499,9 +141669,13 @@ simdjson_warn_unused simdjson_inline simdjson_result<std::string_view> value_ite template <typename string_type> simdjson_warn_unused simdjson_inline error_code value_iterator::get_root_string(string_type& receiver, bool check_trailing, bool allow_replacement) noexcept { std::string_view content; + // Save the string buffer location so that we can restore it after get_string + auto saved_string_buf_loc = _json_iter->string_buf_loc(); auto err = get_root_string(check_trailing, allow_replacement).get(content); if (err) { return err; } receiver = content; + // Restore the string buffer location, effectively discarding any temporary string storage + _json_iter->string_buf_loc() = saved_string_buf_loc; return SUCCESS; } simdjson_warn_unused simdjson_inline simdjson_result<std::string_view> value_iterator::get_root_wobbly_string(bool check_trailing) noexcept { @@ -105570,1469 +141744,619 @@ simdjson_warn_unused simdjson_inline simdjson_result<int64_t> value_iterator::ge tmpbuf[20+1] = '\0'; // make sure that buffer is always null terminated. if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 20+1)) { logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 20 characters"); - return NUMBER_ERROR; - } - - auto result = numberparsing::parse_integer_in_string(tmpbuf); - if(result.error() == SUCCESS) { - if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } - advance_root_scalar("int64"); - } - return result; -} -simdjson_warn_unused simdjson_inline simdjson_result<double> value_iterator::get_root_double(bool check_trailing) noexcept { - auto max_len = peek_root_length(); - auto json = peek_root_scalar("double"); - // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/, - // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest - // number: -0.<fraction>e-308. - uint8_t tmpbuf[1074+8+1+1]; // +1 for null termination. - tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated. - if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) { - logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters"); - return NUMBER_ERROR; - } - auto result = numberparsing::parse_double(tmpbuf); - if(result.error() == SUCCESS) { - if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } - advance_root_scalar("double"); - } - return result; -} - -simdjson_warn_unused simdjson_inline simdjson_result<double> value_iterator::get_root_double_in_string(bool check_trailing) noexcept { - auto max_len = peek_root_length(); - auto json = peek_root_scalar("double"); - // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/, - // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest - // number: -0.<fraction>e-308. - uint8_t tmpbuf[1074+8+1+1]; // +1 for null termination. - tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated. - if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) { - logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters"); - return NUMBER_ERROR; - } - auto result = numberparsing::parse_double_in_string(tmpbuf); - if(result.error() == SUCCESS) { - if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } - advance_root_scalar("double"); - } - return result; -} - -simdjson_warn_unused simdjson_inline simdjson_result<bool> value_iterator::get_root_bool(bool check_trailing) noexcept { - auto max_len = peek_root_length(); - auto json = peek_root_scalar("bool"); - // We have a boolean if we have either "true" or "false" and the next character is either - // a structural character or whitespace. We also check that the length is correct: - // "true" and "false" are 4 and 5 characters long, respectively. - bool value_true = (max_len >= 4 && !atomparsing::str4ncmp(json, "true") && - (max_len == 4 || jsoncharutils::is_structural_or_whitespace(json[4]))); - bool value_false = (max_len >= 5 && !atomparsing::str4ncmp(json, "false") && - (max_len == 5 || jsoncharutils::is_structural_or_whitespace(json[5]))); - if(value_true == false && value_false == false) { return incorrect_type_error("Not a boolean"); } - if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } - advance_root_scalar("bool"); - return value_true; -} - -simdjson_inline simdjson_result<bool> value_iterator::is_root_null(bool check_trailing) noexcept { - auto max_len = peek_root_length(); - auto json = peek_root_scalar("null"); - bool result = (max_len >= 4 && !atomparsing::str4ncmp(json, "null") && - (max_len == 4 || jsoncharutils::is_structural_or_whitespace(json[4]))); - if(result) { // we have something that looks like a null. - if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } - advance_root_scalar("null"); - } else if (json[0] == 'n') { - return incorrect_type_error("Not a null but starts with n"); - } - return result; -} - -simdjson_warn_unused simdjson_inline error_code value_iterator::skip_child() noexcept { - SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); - SIMDJSON_ASSUME( _json_iter->_depth >= _depth ); - - return _json_iter->skip_child(depth()); -} - -simdjson_inline value_iterator value_iterator::child() const noexcept { - assert_at_child(); - return { _json_iter, depth()+1, _json_iter->token.position() }; -} - -// GCC 7 warns when the first line of this function is inlined away into oblivion due to the caller -// relating depth and iterator depth, which is a desired effect. It does not happen if is_open is -// marked non-inline. -SIMDJSON_PUSH_DISABLE_WARNINGS -SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING -simdjson_inline bool value_iterator::is_open() const noexcept { - return _json_iter->depth() >= depth(); -} -SIMDJSON_POP_DISABLE_WARNINGS - -simdjson_inline bool value_iterator::at_end() const noexcept { - return _json_iter->at_end(); -} - -simdjson_inline bool value_iterator::at_start() const noexcept { - return _json_iter->token.position() == start_position(); -} - -simdjson_inline bool value_iterator::at_first_field() const noexcept { - SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); - return _json_iter->token.position() == start_position() + 1; -} - -simdjson_inline void value_iterator::abandon() noexcept { - _json_iter->abandon(); -} - -simdjson_warn_unused simdjson_inline depth_t value_iterator::depth() const noexcept { - return _depth; -} -simdjson_warn_unused simdjson_inline error_code value_iterator::error() const noexcept { - return _json_iter->error; -} -simdjson_warn_unused simdjson_inline uint8_t *&value_iterator::string_buf_loc() noexcept { - return _json_iter->string_buf_loc(); -} -simdjson_warn_unused simdjson_inline const json_iterator &value_iterator::json_iter() const noexcept { - return *_json_iter; -} -simdjson_warn_unused simdjson_inline json_iterator &value_iterator::json_iter() noexcept { - return *_json_iter; -} - -simdjson_inline const uint8_t *value_iterator::peek_start() const noexcept { - return _json_iter->peek(start_position()); -} -simdjson_inline uint32_t value_iterator::peek_start_length() const noexcept { - return _json_iter->peek_length(start_position()); -} -simdjson_inline uint32_t value_iterator::peek_root_length() const noexcept { - return _json_iter->peek_root_length(start_position()); -} - -simdjson_inline const uint8_t *value_iterator::peek_scalar(const char *type) noexcept { - logger::log_value(*_json_iter, start_position(), depth(), type); - // If we're not at the position anymore, we don't want to advance the cursor. - if (!is_at_start()) { return peek_start(); } - - // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value. - assert_at_start(); - return _json_iter->peek(); -} - -simdjson_inline void value_iterator::advance_scalar(const char *type) noexcept { - logger::log_value(*_json_iter, start_position(), depth(), type); - // If we're not at the position anymore, we don't want to advance the cursor. - if (!is_at_start()) { return; } - - // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value. - assert_at_start(); - _json_iter->return_current_and_advance(); - _json_iter->ascend_to(depth()-1); -} - -simdjson_warn_unused simdjson_inline error_code value_iterator::start_container(uint8_t start_char, const char *incorrect_type_message, const char *type) noexcept { - logger::log_start_value(*_json_iter, start_position(), depth(), type); - // If we're not at the position anymore, we don't want to advance the cursor. - const uint8_t *json; - if (!is_at_start()) { -#if SIMDJSON_DEVELOPMENT_CHECKS - if (!is_at_iterator_start()) { return OUT_OF_ORDER_ITERATION; } -#endif - json = peek_start(); - if (*json != start_char) { return incorrect_type_error(incorrect_type_message); } - } else { - assert_at_start(); - /** - * We should be prudent. Let us peek. If it is not the right type, we - * return an error. Only once we have determined that we have the right - * type are we allowed to advance! - */ - json = _json_iter->peek(); - if (*json != start_char) { return incorrect_type_error(incorrect_type_message); } - _json_iter->return_current_and_advance(); - } - - - return SUCCESS; -} - - -simdjson_inline const uint8_t *value_iterator::peek_root_scalar(const char *type) noexcept { - logger::log_value(*_json_iter, start_position(), depth(), type); - if (!is_at_start()) { return peek_start(); } - - assert_at_root(); - return _json_iter->peek(); -} -simdjson_inline const uint8_t *value_iterator::peek_non_root_scalar(const char *type) noexcept { - logger::log_value(*_json_iter, start_position(), depth(), type); - if (!is_at_start()) { return peek_start(); } - - assert_at_non_root_start(); - return _json_iter->peek(); -} - -simdjson_inline void value_iterator::advance_root_scalar(const char *type) noexcept { - logger::log_value(*_json_iter, start_position(), depth(), type); - if (!is_at_start()) { return; } - - assert_at_root(); - _json_iter->return_current_and_advance(); - _json_iter->ascend_to(depth()-1); -} -simdjson_inline void value_iterator::advance_non_root_scalar(const char *type) noexcept { - logger::log_value(*_json_iter, start_position(), depth(), type); - if (!is_at_start()) { return; } - - assert_at_non_root_start(); - _json_iter->return_current_and_advance(); - _json_iter->ascend_to(depth()-1); -} - -simdjson_inline error_code value_iterator::incorrect_type_error(const char *message) const noexcept { - logger::log_error(*_json_iter, start_position(), depth(), message); - return INCORRECT_TYPE; -} - -simdjson_inline bool value_iterator::is_at_start() const noexcept { - return position() == start_position(); -} - -simdjson_inline bool value_iterator::is_at_key() const noexcept { - // Keys are at the same depth as the object. - // Note here that we could be safer and check that we are within an object, - // but we do not. - return _depth == _json_iter->_depth && *_json_iter->peek() == '"'; -} - -simdjson_inline bool value_iterator::is_at_iterator_start() const noexcept { - // We can legitimately be either at the first value ([1]), or after the array if it's empty ([]). - auto delta = position() - start_position(); - return delta == 1 || delta == 2; -} - -inline void value_iterator::assert_at_start() const noexcept { - SIMDJSON_ASSUME( _json_iter->token._position == _start_position ); - SIMDJSON_ASSUME( _json_iter->_depth == _depth ); - SIMDJSON_ASSUME( _depth > 0 ); -} - -inline void value_iterator::assert_at_container_start() const noexcept { - SIMDJSON_ASSUME( _json_iter->token._position == _start_position + 1 ); - SIMDJSON_ASSUME( _json_iter->_depth == _depth ); - SIMDJSON_ASSUME( _depth > 0 ); -} - -inline void value_iterator::assert_at_next() const noexcept { - SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); - SIMDJSON_ASSUME( _json_iter->_depth == _depth ); - SIMDJSON_ASSUME( _depth > 0 ); -} - -simdjson_inline void value_iterator::move_at_start() noexcept { - _json_iter->_depth = _depth; - _json_iter->token.set_position(_start_position); -} - -simdjson_inline void value_iterator::move_at_container_start() noexcept { - _json_iter->_depth = _depth; - _json_iter->token.set_position(_start_position + 1); -} - -simdjson_inline simdjson_result<bool> value_iterator::reset_array() noexcept { - if(error()) { return error(); } - move_at_container_start(); - return started_array(); -} - -simdjson_inline simdjson_result<bool> value_iterator::reset_object() noexcept { - if(error()) { return error(); } - move_at_container_start(); - return started_object(); -} - -inline void value_iterator::assert_at_child() const noexcept { - SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); - SIMDJSON_ASSUME( _json_iter->_depth == _depth + 1 ); - SIMDJSON_ASSUME( _depth > 0 ); -} - -inline void value_iterator::assert_at_root() const noexcept { - assert_at_start(); - SIMDJSON_ASSUME( _depth == 1 ); -} - -inline void value_iterator::assert_at_non_root_start() const noexcept { - assert_at_start(); - SIMDJSON_ASSUME( _depth > 1 ); -} - -inline void value_iterator::assert_is_valid() const noexcept { - SIMDJSON_ASSUME( _json_iter != nullptr ); -} - -simdjson_inline bool value_iterator::is_valid() const noexcept { - return _json_iter != nullptr; -} - -simdjson_inline simdjson_result<json_type> value_iterator::type() const noexcept { - switch (*peek_start()) { - case '{': - return json_type::object; - case '[': - return json_type::array; - case '"': - return json_type::string; - case 'n': - return json_type::null; - case 't': case 'f': - return json_type::boolean; - case '-': - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - return json_type::number; - default: - return json_type::unknown; - } -} - -simdjson_inline token_position value_iterator::start_position() const noexcept { - return _start_position; -} - -simdjson_inline token_position value_iterator::position() const noexcept { - return _json_iter->position(); -} - -simdjson_inline token_position value_iterator::end_position() const noexcept { - return _json_iter->end_position(); -} - -simdjson_inline token_position value_iterator::last_position() const noexcept { - return _json_iter->last_position(); -} - -simdjson_inline error_code value_iterator::report_error(error_code error, const char *message) noexcept { - return _json_iter->report_error(error, message); -} - -} // namespace ondemand -} // namespace ppc64 -} // namespace simdjson - -namespace simdjson { - -simdjson_inline simdjson_result<ppc64::ondemand::value_iterator>::simdjson_result(ppc64::ondemand::value_iterator &&value) noexcept - : implementation_simdjson_result_base<ppc64::ondemand::value_iterator>(std::forward<ppc64::ondemand::value_iterator>(value)) {} -simdjson_inline simdjson_result<ppc64::ondemand::value_iterator>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<ppc64::ondemand::value_iterator>(error) {} - -} // namespace simdjson - -#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H -/* end file simdjson/generic/ondemand/value_iterator-inl.h for ppc64 */ - -// JSON builder inline definitions -/* including simdjson/generic/ondemand/json_string_builder-inl.h for ppc64: #include "simdjson/generic/ondemand/json_string_builder-inl.h" */ -/* begin file simdjson/generic/ondemand/json_string_builder-inl.h for ppc64 */ -/** - * This file is part of the builder API. It is temporarily in the ondemand - * directory but we will move it to a builder directory later. - */ -#include <array> -#include <cstring> -#include <type_traits> -#ifndef SIMDJSON_GENERIC_STRING_BUILDER_INL_H - -/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_INL_H */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_string_builder.h" */ -/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ - -/* - * Empirically, we have found that an inlined optimization is important for - * performance. The following macros are not ideal. We should find a better - * way to inline the code. - */ - -#if defined(__SSE2__) || defined(__x86_64__) || defined(__x86_64) || \ - (defined(_M_AMD64) || defined(_M_X64) || \ - (defined(_M_IX86_FP) && _M_IX86_FP == 2)) -#ifndef SIMDJSON_EXPERIMENTAL_HAS_SSE2 -#define SIMDJSON_EXPERIMENTAL_HAS_SSE2 1 -#endif -#endif - -#if defined(__aarch64__) || defined(_M_ARM64) -#ifndef SIMDJSON_EXPERIMENTAL_HAS_NEON -#define SIMDJSON_EXPERIMENTAL_HAS_NEON 1 -#endif -#endif -#if SIMDJSON_EXPERIMENTAL_HAS_NEON -#include <arm_neon.h> -#endif -#if SIMDJSON_EXPERIMENTAL_HAS_SSE2 -#include <emmintrin.h> -#endif - -namespace simdjson { -namespace ppc64 { -namespace builder { - -static SIMDJSON_CONSTEXPR_LAMBDA std::array<uint8_t, 256> - json_quotable_character = { - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - -/** - -A possible SWAR implementation of has_json_escapable_byte. It is not used -because it is slower than the current implementation. It is kept here for -reference (to show that we tried it). - -inline bool has_json_escapable_byte(uint64_t x) { - uint64_t is_ascii = 0x8080808080808080ULL & ~x; - uint64_t xor2 = x ^ 0x0202020202020202ULL; - uint64_t lt32_or_eq34 = xor2 - 0x2121212121212121ULL; - uint64_t sub92 = x ^ 0x5C5C5C5C5C5C5C5CULL; - uint64_t eq92 = (sub92 - 0x0101010101010101ULL); - return ((lt32_or_eq34 | eq92) & is_ascii) != 0; -} - -**/ - -SIMDJSON_CONSTEXPR_LAMBDA simdjson_inline bool -simple_needs_escaping(std::string_view v) { - for (char c : v) { - // a table lookup is faster than a series of comparisons - if (json_quotable_character[static_cast<uint8_t>(c)]) { - return true; - } - } - return false; -} - -#if SIMDJSON_EXPERIMENTAL_HAS_NEON -simdjson_inline bool fast_needs_escaping(std::string_view view) { - if (view.size() < 16) { - return simple_needs_escaping(view); - } - size_t i = 0; - uint8x16_t running = vdupq_n_u8(0); - uint8x16_t v34 = vdupq_n_u8(34); - uint8x16_t v92 = vdupq_n_u8(92); - - for (; i + 15 < view.size(); i += 16) { - uint8x16_t word = vld1q_u8((const uint8_t *)view.data() + i); - running = vorrq_u8(running, vceqq_u8(word, v34)); - running = vorrq_u8(running, vceqq_u8(word, v92)); - running = vorrq_u8(running, vcltq_u8(word, vdupq_n_u8(32))); - } - if (i < view.size()) { - uint8x16_t word = - vld1q_u8((const uint8_t *)view.data() + view.length() - 16); - running = vorrq_u8(running, vceqq_u8(word, v34)); - running = vorrq_u8(running, vceqq_u8(word, v92)); - running = vorrq_u8(running, vcltq_u8(word, vdupq_n_u8(32))); - } - return vmaxvq_u32(vreinterpretq_u32_u8(running)) != 0; -} -#elif SIMDJSON_EXPERIMENTAL_HAS_SSE2 -simdjson_inline bool fast_needs_escaping(std::string_view view) { - if (view.size() < 16) { - return simple_needs_escaping(view); - } - size_t i = 0; - __m128i running = _mm_setzero_si128(); - for (; i + 15 < view.size(); i += 16) { - - __m128i word = - _mm_loadu_si128(reinterpret_cast<const __m128i *>(view.data() + i)); - running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(34))); - running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(92))); - running = _mm_or_si128( - running, _mm_cmpeq_epi8(_mm_subs_epu8(word, _mm_set1_epi8(31)), - _mm_setzero_si128())); - } - if (i < view.size()) { - __m128i word = _mm_loadu_si128( - reinterpret_cast<const __m128i *>(view.data() + view.length() - 16)); - running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(34))); - running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(92))); - running = _mm_or_si128( - running, _mm_cmpeq_epi8(_mm_subs_epu8(word, _mm_set1_epi8(31)), - _mm_setzero_si128())); - } - return _mm_movemask_epi8(running) != 0; -} -#else -simdjson_inline bool fast_needs_escaping(std::string_view view) { - return simple_needs_escaping(view); -} -#endif - -SIMDJSON_CONSTEXPR_LAMBDA inline size_t -find_next_json_quotable_character(const std::string_view view, - size_t location) noexcept { - - for (auto pos = view.begin() + location; pos != view.end(); ++pos) { - if (json_quotable_character[static_cast<uint8_t>(*pos)]) { - return pos - view.begin(); - } - } - return size_t(view.size()); -} - -SIMDJSON_CONSTEXPR_LAMBDA static std::string_view control_chars[] = { - "\\u0000", "\\u0001", "\\u0002", "\\u0003", "\\u0004", "\\u0005", "\\u0006", - "\\u0007", "\\b", "\\t", "\\n", "\\u000b", "\\f", "\\r", - "\\u000e", "\\u000f", "\\u0010", "\\u0011", "\\u0012", "\\u0013", "\\u0014", - "\\u0015", "\\u0016", "\\u0017", "\\u0018", "\\u0019", "\\u001a", "\\u001b", - "\\u001c", "\\u001d", "\\u001e", "\\u001f"}; - -// All Unicode characters may be placed within the quotation marks, except for -// the characters that MUST be escaped: quotation mark, reverse solidus, and the -// control characters (U+0000 through U+001F). There are two-character sequence -// escape representations of some popular characters: -// \", \\, \b, \f, \n, \r, \t. -SIMDJSON_CONSTEXPR_LAMBDA void escape_json_char(char c, char *&out) { - if (c == '"') { - memcpy(out, "\\\"", 2); - out += 2; - } else if (c == '\\') { - memcpy(out, "\\\\", 2); - out += 2; - } else { - std::string_view v = control_chars[uint8_t(c)]; - memcpy(out, v.data(), v.size()); - out += v.size(); - } -} - -inline size_t write_string_escaped(const std::string_view input, char *out) { - size_t mysize = input.size(); - if (!fast_needs_escaping(input)) { // fast path! - memcpy(out, input.data(), input.size()); - return input.size(); - } - const char *const initout = out; - size_t location = find_next_json_quotable_character(input, 0); - memcpy(out, input.data(), location); - out += location; - escape_json_char(input[location], out); - location += 1; - while (location < mysize) { - size_t newlocation = find_next_json_quotable_character(input, location); - memcpy(out, input.data() + location, newlocation - location); - out += newlocation - location; - location = newlocation; - if (location == mysize) { - break; - } - escape_json_char(input[location], out); - location += 1; - } - return out - initout; -} - -simdjson_inline string_builder::string_builder(size_t initial_capacity) - : buffer(new(std::nothrow) char[initial_capacity]), position(0), - capacity(buffer.get() != nullptr ? initial_capacity : 0), - is_valid(buffer.get() != nullptr) {} - -simdjson_inline bool string_builder::capacity_check(size_t upcoming_bytes) { - // We use the convention that when is_valid is false, then the capacity and - // the position are 0. - // Most of the time, this function will return true. - if (simdjson_likely(upcoming_bytes <= capacity - position)) { - return true; - } - // check for overflow, most of the time there is no overflow - if (simdjson_likely(position + upcoming_bytes < position)) { - return false; - } - // We will rarely get here. - grow_buffer((std::max)(capacity * 2, position + upcoming_bytes)); - // If the buffer allocation failed, we set is_valid to false. - return is_valid; -} - -simdjson_inline void string_builder::grow_buffer(size_t desired_capacity) { - if (!is_valid) { - return; - } - std::unique_ptr<char[]> new_buffer(new (std::nothrow) char[desired_capacity]); - if (new_buffer.get() == nullptr) { - set_valid(false); - return; + return NUMBER_ERROR; } - std::memcpy(new_buffer.get(), buffer.get(), position); - buffer.swap(new_buffer); - capacity = desired_capacity; -} -simdjson_inline void string_builder::set_valid(bool valid) noexcept { - if (!valid) { - is_valid = false; - capacity = 0; - position = 0; - buffer.reset(); - } else { - is_valid = true; + auto result = numberparsing::parse_integer_in_string(tmpbuf); + if(result.error() == SUCCESS) { + if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } + advance_root_scalar("int64"); } + return result; } - -simdjson_inline size_t string_builder::size() const noexcept { - return position; +simdjson_warn_unused simdjson_inline simdjson_result<double> value_iterator::get_root_double(bool check_trailing) noexcept { + auto max_len = peek_root_length(); + auto json = peek_root_scalar("double"); + // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/, + // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest + // number: -0.<fraction>e-308. + uint8_t tmpbuf[1074+8+1+1]; // +1 for null termination. + tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated. + if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) { + logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters"); + return NUMBER_ERROR; + } + auto result = numberparsing::parse_double(tmpbuf); + if(result.error() == SUCCESS) { + if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } + advance_root_scalar("double"); + } + return result; } -simdjson_inline void string_builder::append(char c) noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = c; +simdjson_warn_unused simdjson_inline simdjson_result<double> value_iterator::get_root_double_in_string(bool check_trailing) noexcept { + auto max_len = peek_root_length(); + auto json = peek_root_scalar("double"); + // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/, + // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest + // number: -0.<fraction>e-308. + uint8_t tmpbuf[1074+8+1+1]; // +1 for null termination. + tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated. + if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) { + logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters"); + return NUMBER_ERROR; + } + auto result = numberparsing::parse_double_in_string(tmpbuf); + if(result.error() == SUCCESS) { + if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } + advance_root_scalar("double"); } + return result; } -simdjson_inline void string_builder::append_null() noexcept { - constexpr char null_literal[] = "null"; - constexpr size_t null_len = sizeof(null_literal) - 1; - if (capacity_check(null_len)) { - std::memcpy(buffer.get() + position, null_literal, null_len); - position += null_len; - } +simdjson_warn_unused simdjson_inline simdjson_result<bool> value_iterator::get_root_bool(bool check_trailing) noexcept { + auto max_len = peek_root_length(); + auto json = peek_root_scalar("bool"); + // We have a boolean if we have either "true" or "false" and the next character is either + // a structural character or whitespace. We also check that the length is correct: + // "true" and "false" are 4 and 5 characters long, respectively. + bool value_true = (max_len >= 4 && !atomparsing::str4ncmp(json, "true") && + (max_len == 4 || jsoncharutils::is_structural_or_whitespace(json[4]))); + bool value_false = (max_len >= 5 && !atomparsing::str4ncmp(json, "false") && + (max_len == 5 || jsoncharutils::is_structural_or_whitespace(json[5]))); + if(value_true == false && value_false == false) { return incorrect_type_error("Not a boolean"); } + if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } + advance_root_scalar("bool"); + return value_true; } -simdjson_inline void string_builder::clear() noexcept { - position = 0; - // if it was invalid, we should try to repair it - if (!is_valid) { - capacity = 0; - buffer.reset(); - is_valid = true; +simdjson_inline simdjson_result<bool> value_iterator::is_root_null(bool check_trailing) noexcept { + auto max_len = peek_root_length(); + auto json = peek_root_scalar("null"); + bool result = (max_len >= 4 && !atomparsing::str4ncmp(json, "null") && + (max_len == 4 || jsoncharutils::is_structural_or_whitespace(json[4]))); + if(result) { // we have something that looks like a null. + if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } + advance_root_scalar("null"); + } else if (json[0] == 'n') { + return incorrect_type_error("Not a null but starts with n"); } + return result; } -namespace internal { +simdjson_warn_unused simdjson_inline error_code value_iterator::skip_child() noexcept { + SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); + SIMDJSON_ASSUME( _json_iter->_depth >= _depth ); -template <typename number_type, typename = typename std::enable_if< - std::is_unsigned<number_type>::value>::type> -simdjson_really_inline int int_log2(number_type x) { - return 63 - leading_zeroes(uint64_t(x) | 1); + return _json_iter->skip_child(depth()); } -simdjson_really_inline int fast_digit_count_32(uint32_t x) { - static uint64_t table[] = { - 4294967296, 8589934582, 8589934582, 8589934582, 12884901788, - 12884901788, 12884901788, 17179868184, 17179868184, 17179868184, - 21474826480, 21474826480, 21474826480, 21474826480, 25769703776, - 25769703776, 25769703776, 30063771072, 30063771072, 30063771072, - 34349738368, 34349738368, 34349738368, 34349738368, 38554705664, - 38554705664, 38554705664, 41949672960, 41949672960, 41949672960, - 42949672960, 42949672960}; - return uint32_t((x + table[int_log2(x)]) >> 32); +simdjson_inline value_iterator value_iterator::child() const noexcept { + assert_at_child(); + return { _json_iter, depth()+1, _json_iter->token.position() }; } -simdjson_really_inline int fast_digit_count_64(uint64_t x) { - static uint64_t table[] = {9, - 99, - 999, - 9999, - 99999, - 999999, - 9999999, - 99999999, - 999999999, - 9999999999, - 99999999999, - 999999999999, - 9999999999999, - 99999999999999, - 999999999999999ULL, - 9999999999999999ULL, - 99999999999999999ULL, - 999999999999999999ULL, - 9999999999999999999ULL}; - int y = (19 * int_log2(x) >> 6); - y += x > table[y]; - return y + 1; +// GCC 7 warns when the first line of this function is inlined away into oblivion due to the caller +// relating depth and iterator depth, which is a desired effect. It does not happen if is_open is +// marked non-inline. +SIMDJSON_PUSH_DISABLE_WARNINGS +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING +simdjson_inline bool value_iterator::is_open() const noexcept { + return _json_iter->depth() >= depth(); } +SIMDJSON_POP_DISABLE_WARNINGS -template <typename number_type, typename = typename std::enable_if< - std::is_unsigned<number_type>::value>::type> -simdjson_really_inline size_t digit_count(number_type v) noexcept { - static_assert(sizeof(number_type) == 8 || sizeof(number_type) == 4 || - sizeof(number_type) == 2 || sizeof(number_type) == 1, - "We only support 8-bit, 16-bit, 32-bit and 64-bit numbers"); - SIMDJSON_IF_CONSTEXPR(sizeof(number_type) <= 4) { - return fast_digit_count_32(static_cast<uint32_t>(v)); - } - else { - return fast_digit_count_64(static_cast<uint64_t>(v)); - } +simdjson_inline bool value_iterator::at_end() const noexcept { + return _json_iter->at_end(); } -static const char decimal_table[200] = { - 0x30, 0x30, 0x30, 0x31, 0x30, 0x32, 0x30, 0x33, 0x30, 0x34, 0x30, 0x35, - 0x30, 0x36, 0x30, 0x37, 0x30, 0x38, 0x30, 0x39, 0x31, 0x30, 0x31, 0x31, - 0x31, 0x32, 0x31, 0x33, 0x31, 0x34, 0x31, 0x35, 0x31, 0x36, 0x31, 0x37, - 0x31, 0x38, 0x31, 0x39, 0x32, 0x30, 0x32, 0x31, 0x32, 0x32, 0x32, 0x33, - 0x32, 0x34, 0x32, 0x35, 0x32, 0x36, 0x32, 0x37, 0x32, 0x38, 0x32, 0x39, - 0x33, 0x30, 0x33, 0x31, 0x33, 0x32, 0x33, 0x33, 0x33, 0x34, 0x33, 0x35, - 0x33, 0x36, 0x33, 0x37, 0x33, 0x38, 0x33, 0x39, 0x34, 0x30, 0x34, 0x31, - 0x34, 0x32, 0x34, 0x33, 0x34, 0x34, 0x34, 0x35, 0x34, 0x36, 0x34, 0x37, - 0x34, 0x38, 0x34, 0x39, 0x35, 0x30, 0x35, 0x31, 0x35, 0x32, 0x35, 0x33, - 0x35, 0x34, 0x35, 0x35, 0x35, 0x36, 0x35, 0x37, 0x35, 0x38, 0x35, 0x39, - 0x36, 0x30, 0x36, 0x31, 0x36, 0x32, 0x36, 0x33, 0x36, 0x34, 0x36, 0x35, - 0x36, 0x36, 0x36, 0x37, 0x36, 0x38, 0x36, 0x39, 0x37, 0x30, 0x37, 0x31, - 0x37, 0x32, 0x37, 0x33, 0x37, 0x34, 0x37, 0x35, 0x37, 0x36, 0x37, 0x37, - 0x37, 0x38, 0x37, 0x39, 0x38, 0x30, 0x38, 0x31, 0x38, 0x32, 0x38, 0x33, - 0x38, 0x34, 0x38, 0x35, 0x38, 0x36, 0x38, 0x37, 0x38, 0x38, 0x38, 0x39, - 0x39, 0x30, 0x39, 0x31, 0x39, 0x32, 0x39, 0x33, 0x39, 0x34, 0x39, 0x35, - 0x39, 0x36, 0x39, 0x37, 0x39, 0x38, 0x39, 0x39, -}; -} // namespace internal -template <typename number_type, typename> -simdjson_inline void string_builder::append(number_type v) noexcept { - static_assert(std::is_same<number_type, bool>::value || - std::is_integral<number_type>::value || - std::is_floating_point<number_type>::value, - "Unsupported number type"); - // If C++17 is available, we can 'if constexpr' here. - SIMDJSON_IF_CONSTEXPR(std::is_same<number_type, bool>::value) { - if (v) { - constexpr char true_literal[] = "true"; - constexpr size_t true_len = sizeof(true_literal) - 1; - if (capacity_check(true_len)) { - std::memcpy(buffer.get() + position, true_literal, true_len); - position += true_len; - } - } else { - constexpr char false_literal[] = "false"; - constexpr size_t false_len = sizeof(false_literal) - 1; - if (capacity_check(false_len)) { - std::memcpy(buffer.get() + position, false_literal, false_len); - position += false_len; - } - } - } - else SIMDJSON_IF_CONSTEXPR(std::is_unsigned<number_type>::value) { - constexpr size_t max_number_size = 20; - if (capacity_check(max_number_size)) { - using unsigned_type = typename std::make_unsigned<number_type>::type; - unsigned_type pv = static_cast<unsigned_type>(v); - size_t dc = internal::digit_count(pv); - char *write_pointer = buffer.get() + position + dc - 1; - while (pv >= 100) { - memcpy(write_pointer - 1, &internal::decimal_table[(pv % 100) * 2], 2); - write_pointer -= 2; - pv /= 100; - } - if (pv >= 10) { - *write_pointer-- = char('0' + (pv % 10)); - pv /= 10; - } - *write_pointer = char('0' + pv); - position += dc; - } - } - else SIMDJSON_IF_CONSTEXPR(std::is_integral<number_type>::value) { - constexpr size_t max_number_size = 20; - if (capacity_check(max_number_size)) { - using unsigned_type = typename std::make_unsigned<number_type>::type; - bool negative = v < 0; - unsigned_type pv = static_cast<unsigned_type>(v); - if (negative) { - pv = 0 - pv; // the 0 is for Microsoft - } - size_t dc = internal::digit_count(pv); - // by always writing the minus sign, we avoid the branch. - buffer.get()[position] = '-'; - position += negative ? 1 : 0; - char *write_pointer = buffer.get() + position + dc - 1; - while (pv >= 100) { - memcpy(write_pointer - 1, &internal::decimal_table[(pv % 100) * 2], 2); - write_pointer -= 2; - pv /= 100; - } - if (pv >= 10) { - *write_pointer-- = char('0' + (pv % 10)); - pv /= 10; - } - *write_pointer = char('0' + pv); - position += dc; - } - } - else SIMDJSON_IF_CONSTEXPR(std::is_floating_point<number_type>::value) { - constexpr size_t max_number_size = 24; - if (capacity_check(max_number_size)) { - // We could specialize for float. - char *end = simdjson::internal::to_chars(buffer.get() + position, nullptr, - double(v)); - position = end - buffer.get(); - } - } +simdjson_inline bool value_iterator::at_start() const noexcept { + return _json_iter->token.position() == start_position(); } -simdjson_inline void -string_builder::escape_and_append(std::string_view input) noexcept { - // escaping might turn a control character into \x00xx so 6 characters. - if (capacity_check(6 * input.size())) { - position += write_string_escaped(input, buffer.get() + position); - } +simdjson_inline bool value_iterator::at_first_field() const noexcept { + SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); + return _json_iter->token.position() == start_position() + 1; } -simdjson_inline void -string_builder::escape_and_append_with_quotes(std::string_view input) noexcept { - // escaping might turn a control character into \x00xx so 6 characters. - if (capacity_check(2 + 6 * input.size())) { - buffer.get()[position++] = '"'; - position += write_string_escaped(input, buffer.get() + position); - buffer.get()[position++] = '"'; - } +simdjson_inline void value_iterator::abandon() noexcept { + _json_iter->abandon(); } -simdjson_inline void -string_builder::escape_and_append_with_quotes(char input) noexcept { - // escaping might turn a control character into \x00xx so 6 characters. - if (capacity_check(2 + 6 * 1)) { - buffer.get()[position++] = '"'; - std::string_view cinput(&input, 1); - position += write_string_escaped(cinput, buffer.get() + position); - buffer.get()[position++] = '"'; - } +simdjson_warn_unused simdjson_inline depth_t value_iterator::depth() const noexcept { + return _depth; } - -simdjson_inline void -string_builder::escape_and_append_with_quotes(const char *input) noexcept { - std::string_view cinput(input); - escape_and_append_with_quotes(cinput); +simdjson_warn_unused simdjson_inline error_code value_iterator::error() const noexcept { + return _json_iter->error; } -#if SIMDJSON_SUPPORTS_CONCEPTS -template <constevalutil::fixed_string key> -simdjson_inline void string_builder::escape_and_append_with_quotes() noexcept { - escape_and_append_with_quotes(constevalutil::string_constant<key>::value); +simdjson_warn_unused simdjson_inline uint8_t *&value_iterator::string_buf_loc() noexcept { + return _json_iter->string_buf_loc(); } -#endif - -simdjson_inline void string_builder::append_raw(const char *c) noexcept { - size_t len = std::strlen(c); - append_raw(c, len); +simdjson_warn_unused simdjson_inline const json_iterator &value_iterator::json_iter() const noexcept { + return *_json_iter; } - -simdjson_inline void -string_builder::append_raw(std::string_view input) noexcept { - if (capacity_check(input.size())) { - std::memcpy(buffer.get() + position, input.data(), input.size()); - position += input.size(); - } +simdjson_warn_unused simdjson_inline json_iterator &value_iterator::json_iter() noexcept { + return *_json_iter; } -simdjson_inline void string_builder::append_raw(const char *str, - size_t len) noexcept { - if (capacity_check(len)) { - std::memcpy(buffer.get() + position, str, len); - position += len; - } +simdjson_inline const uint8_t *value_iterator::peek_start() const noexcept { + return _json_iter->peek(start_position()); } -#if SIMDJSON_SUPPORTS_CONCEPTS -// Support for optional types (std::optional, etc.) -template <concepts::optional_type T> - requires(!require_custom_serialization<T>) -simdjson_inline void string_builder::append(const T &opt) { - if (opt) { - append(*opt); - } else { - append_null(); - } +simdjson_inline uint32_t value_iterator::peek_start_length() const noexcept { + return _json_iter->peek_length(start_position()); } - -template <typename T> - requires(require_custom_serialization<T>) -simdjson_inline void string_builder::append(T &&val) { - serialize(*this, std::forward<T>(val)); +simdjson_inline uint32_t value_iterator::peek_root_length() const noexcept { + return _json_iter->peek_root_length(start_position()); } -template <typename T> - requires(std::is_convertible<T, std::string_view>::value || - std::is_same<T, const char *>::value) -simdjson_inline void string_builder::append(const T &value) { - escape_and_append_with_quotes(value); +simdjson_inline const uint8_t *value_iterator::peek_scalar(const char *type) noexcept { + logger::log_value(*_json_iter, start_position(), depth(), type); + // If we're not at the position anymore, we don't want to advance the cursor. + if (!is_at_start()) { return peek_start(); } + + // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value. + assert_at_start(); + return _json_iter->peek(); } -#endif -#if SIMDJSON_SUPPORTS_RANGES && SIMDJSON_SUPPORTS_CONCEPTS -// Support for range-based appending (std::ranges::view, etc.) -template <std::ranges::range R> - requires(!std::is_convertible<R, std::string_view>::value && !require_custom_serialization<R>) -simdjson_inline void string_builder::append(const R &range) noexcept { - auto it = std::ranges::begin(range); - auto end = std::ranges::end(range); - if constexpr (concepts::is_pair<std::ranges::range_value_t<R>>) { - start_object(); +simdjson_inline void value_iterator::advance_scalar(const char *type) noexcept { + logger::log_value(*_json_iter, start_position(), depth(), type); + // If we're not at the position anymore, we don't want to advance the cursor. + if (!is_at_start()) { return; } - if (it == end) { - end_object(); - return; // Handle empty range - } - // Append first item without leading comma - append_key_value(it->first, it->second); - ++it; + // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value. + assert_at_start(); + _json_iter->return_current_and_advance(); + _json_iter->ascend_to(depth()-1); +} - // Append remaining items with preceding commas - for (; it != end; ++it) { - append_comma(); - append_key_value(it->first, it->second); - } - end_object(); +simdjson_warn_unused simdjson_inline error_code value_iterator::start_container(uint8_t start_char, const char *incorrect_type_message, const char *type) noexcept { + logger::log_start_value(*_json_iter, start_position(), depth(), type); + // If we're not at the position anymore, we don't want to advance the cursor. + const uint8_t *json; + if (!is_at_start()) { +#if SIMDJSON_DEVELOPMENT_CHECKS + if (!is_at_iterator_start()) { return OUT_OF_ORDER_ITERATION; } +#endif + json = peek_start(); + if (*json != start_char) { return incorrect_type_error(incorrect_type_message); } } else { - start_array(); - if (it == end) { - end_array(); - return; // Handle empty range - } + assert_at_start(); + /** + * We should be prudent. Let us peek. If it is not the right type, we + * return an error. Only once we have determined that we have the right + * type are we allowed to advance! + */ + json = _json_iter->peek(); + if (*json != start_char) { return incorrect_type_error(incorrect_type_message); } + _json_iter->return_current_and_advance(); + } - // Append first item without leading comma - append(*it); - ++it; - // Append remaining items with preceding commas - for (; it != end; ++it) { - append_comma(); - append(*it); - } - end_array(); - } + return SUCCESS; } -#endif -#if SIMDJSON_EXCEPTIONS -simdjson_inline string_builder::operator std::string() const noexcept(false) { - return std::string(operator std::string_view()); -} +simdjson_inline const uint8_t *value_iterator::peek_root_scalar(const char *type) noexcept { + logger::log_value(*_json_iter, start_position(), depth(), type); + if (!is_at_start()) { return peek_start(); } -simdjson_inline string_builder::operator std::string_view() const - noexcept(false) simdjson_lifetime_bound { - return view(); + assert_at_root(); + return _json_iter->peek(); } -#endif +simdjson_inline const uint8_t *value_iterator::peek_non_root_scalar(const char *type) noexcept { + logger::log_value(*_json_iter, start_position(), depth(), type); + if (!is_at_start()) { return peek_start(); } -simdjson_inline simdjson_result<std::string_view> -string_builder::view() const noexcept { - if (!is_valid) { - return simdjson::OUT_OF_CAPACITY; - } - return std::string_view(buffer.get(), position); + assert_at_non_root_start(); + return _json_iter->peek(); } -simdjson_inline simdjson_result<const char *> string_builder::c_str() noexcept { - if (capacity_check(1)) { - buffer.get()[position] = '\0'; - return buffer.get(); - } - return simdjson::OUT_OF_CAPACITY; -} +simdjson_inline void value_iterator::advance_root_scalar(const char *type) noexcept { + logger::log_value(*_json_iter, start_position(), depth(), type); + if (!is_at_start()) { return; } -simdjson_inline bool string_builder::validate_unicode() const noexcept { - return simdjson::validate_utf8(buffer.get(), position); + assert_at_root(); + _json_iter->return_current_and_advance(); + _json_iter->ascend_to(depth()-1); } +simdjson_inline void value_iterator::advance_non_root_scalar(const char *type) noexcept { + logger::log_value(*_json_iter, start_position(), depth(), type); + if (!is_at_start()) { return; } -simdjson_inline void string_builder::start_object() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = '{'; - } + assert_at_non_root_start(); + _json_iter->return_current_and_advance(); + _json_iter->ascend_to(depth()-1); } -simdjson_inline void string_builder::end_object() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = '}'; - } +simdjson_inline error_code value_iterator::incorrect_type_error(const char *message) const noexcept { + logger::log_error(*_json_iter, start_position(), depth(), message); + return INCORRECT_TYPE; } -simdjson_inline void string_builder::start_array() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = '['; - } +simdjson_inline bool value_iterator::is_at_start() const noexcept { + return position() == start_position(); } -simdjson_inline void string_builder::end_array() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = ']'; - } +simdjson_inline bool value_iterator::is_at_key() const noexcept { + // Keys are at the same depth as the object. + // Note here that we could be safer and check that we are within an object, + // but we do not. + // + // As long as we are at the object's depth, in a valid document, + // we will only ever be at { , : or the actual string key: ". + return _depth == _json_iter->_depth && *_json_iter->peek() == '"'; } -simdjson_inline void string_builder::append_comma() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = ','; - } +simdjson_inline bool value_iterator::is_at_iterator_start() const noexcept { + // We can legitimately be either at the first value ([1]), or after the array if it's empty ([]). + auto delta = position() - start_position(); + return delta == 1 || delta == 2; } -simdjson_inline void string_builder::append_colon() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = ':'; - } +inline void value_iterator::assert_at_start() const noexcept { + SIMDJSON_ASSUME( _json_iter->token._position == _start_position ); + SIMDJSON_ASSUME( _json_iter->_depth == _depth ); + SIMDJSON_ASSUME( _depth > 0 ); } -template <typename key_type, typename value_type> -simdjson_inline void -string_builder::append_key_value(key_type key, value_type value) noexcept { - static_assert(std::is_same<key_type, const char *>::value || - std::is_convertible<key_type, std::string_view>::value, - "Unsupported key type"); - escape_and_append_with_quotes(key); - append_colon(); - SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, std::nullptr_t>::value) { - append_null(); - } - else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, char>::value) { - escape_and_append_with_quotes(value); - } - else SIMDJSON_IF_CONSTEXPR( - std::is_convertible<value_type, std::string_view>::value) { - escape_and_append_with_quotes(value); - } - else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, const char *>::value) { - escape_and_append_with_quotes(value); - } - else { - append(value); - } +inline void value_iterator::assert_at_container_start() const noexcept { + SIMDJSON_ASSUME( _json_iter->token._position == _start_position + 1 ); + SIMDJSON_ASSUME( _json_iter->_depth == _depth ); + SIMDJSON_ASSUME( _depth > 0 ); } -#if SIMDJSON_SUPPORTS_CONCEPTS -template <constevalutil::fixed_string key, typename value_type> -simdjson_inline void -string_builder::append_key_value(value_type value) noexcept { - escape_and_append_with_quotes<key>(); - append_colon(); - SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, std::nullptr_t>::value) { - append_null(); - } - else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, char>::value) { - escape_and_append_with_quotes(value); - } - else SIMDJSON_IF_CONSTEXPR( - std::is_convertible<value_type, std::string_view>::value) { - escape_and_append_with_quotes(value); - } - else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, const char *>::value) { - escape_and_append_with_quotes(value); - } - else { - append(value); - } +inline void value_iterator::assert_at_next() const noexcept { + SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); + SIMDJSON_ASSUME( _json_iter->_depth == _depth ); + SIMDJSON_ASSUME( _depth > 0 ); } -#endif - -} // namespace builder -} // namespace ppc64 -} // namespace simdjson - -#endif // SIMDJSON_GENERIC_STRING_BUILDER_INL_H -/* end file simdjson/generic/ondemand/json_string_builder-inl.h for ppc64 */ -/* including simdjson/generic/ondemand/json_builder.h for ppc64: #include "simdjson/generic/ondemand/json_builder.h" */ -/* begin file simdjson/generic/ondemand/json_builder.h for ppc64 */ -/** - * This file is part of the builder API. It is temporarily in the ondemand directory - * but we will move it to a builder directory later. - */ -#ifndef SIMDJSON_GENERIC_BUILDER_H - -/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_H */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_string_builder.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/concepts.h" */ -/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -#if SIMDJSON_STATIC_REFLECTION - -#include <charconv> -#include <cstring> -#include <meta> -#include <memory> -#include <optional> -#include <string_view> -#include <type_traits> -#include <utility> -// #include <static_reflection> // for std::define_static_string - header not available yet - -namespace simdjson { -namespace ppc64 { -namespace builder { -template <class T> - requires(concepts::container_but_not_string<T> && !require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &t) { - auto it = t.begin(); - auto end = t.end(); - if (it == end) { - b.append_raw("[]"); - return; - } - b.append('['); - atom(b, *it); - ++it; - for (; it != end; ++it) { - b.append(','); - atom(b, *it); - } - b.append(']'); +simdjson_inline void value_iterator::move_at_start() noexcept { + _json_iter->_depth = _depth; + _json_iter->token.set_position(_start_position); } -template <class T> - requires(std::is_same_v<T, std::string> || - std::is_same_v<T, std::string_view> || - std::is_same_v<T, const char *> || - std::is_same_v<T, char>) -constexpr void atom(string_builder &b, const T &t) { - b.escape_and_append_with_quotes(t); +simdjson_inline void value_iterator::move_at_container_start() noexcept { + _json_iter->_depth = _depth; + _json_iter->token.set_position(_start_position + 1); } -template <concepts::string_view_keyed_map T> - requires(!require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &m) { - if (m.empty()) { - b.append_raw("{}"); - return; - } - b.append('{'); - bool first = true; - for (const auto& [key, value] : m) { - if (!first) { - b.append(','); - } - first = false; - // Keys must be convertible to string_view per the concept - b.escape_and_append_with_quotes(key); - b.append(':'); - atom(b, value); - } - b.append('}'); +simdjson_inline simdjson_result<bool> value_iterator::reset_array() noexcept { + if(error()) { return error(); } + move_at_container_start(); + return started_array(); } +simdjson_inline simdjson_result<bool> value_iterator::reset_object() noexcept { + if(error()) { return error(); } + move_at_container_start(); + return started_object(); +} -template<typename number_type, - typename = typename std::enable_if<std::is_arithmetic<number_type>::value && !std::is_same_v<number_type, char>>::type> -constexpr void atom(string_builder &b, const number_type t) { - b.append(t); +inline void value_iterator::assert_at_child() const noexcept { + SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); + SIMDJSON_ASSUME( _json_iter->_depth == _depth + 1 ); + SIMDJSON_ASSUME( _depth > 0 ); } -template <class T> - requires(std::is_class_v<T> && !concepts::container_but_not_string<T> && - !concepts::string_view_keyed_map<T> && - !concepts::optional_type<T> && - !concepts::smart_pointer<T> && - !concepts::appendable_containers<T> && - !std::is_same_v<T, std::string> && - !std::is_same_v<T, std::string_view> && - !std::is_same_v<T, const char*> && - !std::is_same_v<T, char> && !require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &t) { - int i = 0; - b.append('{'); - template for (constexpr auto dm : std::define_static_array(std::meta::nonstatic_data_members_of(^^T, std::meta::access_context::unchecked()))) { - if (i != 0) - b.append(','); - constexpr auto key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(dm))); - b.append_raw(key); - b.append(':'); - atom(b, t.[:dm:]); - i++; - }; - b.append('}'); +inline void value_iterator::assert_at_root() const noexcept { + assert_at_start(); + SIMDJSON_ASSUME( _depth == 1 ); } -// Support for optional types (std::optional, etc.) -template <concepts::optional_type T> - requires(!require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &opt) { - if (opt) { - atom(b, opt.value()); - } else { - b.append_raw("null"); - } +inline void value_iterator::assert_at_non_root_start() const noexcept { + assert_at_start(); + SIMDJSON_ASSUME( _depth > 1 ); } -// Support for smart pointers (std::unique_ptr, std::shared_ptr, etc.) -template <concepts::smart_pointer T> - requires(!require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &ptr) { - if (ptr) { - atom(b, *ptr); - } else { - b.append_raw("null"); - } +inline void value_iterator::assert_is_valid() const noexcept { + SIMDJSON_ASSUME( _json_iter != nullptr ); } -// Support for enums - serialize as string representation using expand approach from P2996R12 -template <typename T> - requires(std::is_enum_v<T> && !require_custom_serialization<T>) -void atom(string_builder &b, const T &e) { -#if SIMDJSON_STATIC_REFLECTION - constexpr auto enumerators = std::define_static_array(std::meta::enumerators_of(^^T)); - template for (constexpr auto enum_val : enumerators) { - constexpr auto enum_str = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(enum_val))); - if (e == [:enum_val:]) { - b.append_raw(enum_str); - return; - } - }; - // Fallback to integer if enum value not found - atom(b, static_cast<std::underlying_type_t<T>>(e)); -#else - // Fallback: serialize as integer if reflection not available - atom(b, static_cast<std::underlying_type_t<T>>(e)); -#endif +simdjson_inline bool value_iterator::is_valid() const noexcept { + return _json_iter != nullptr; } -// Support for appendable containers that don't have operator[] (sets, etc.) -template <concepts::appendable_containers T> - requires(!concepts::container_but_not_string<T> && !concepts::string_view_keyed_map<T> && - !concepts::optional_type<T> && !concepts::smart_pointer<T> && - !std::is_same_v<T, std::string> && - !std::is_same_v<T, std::string_view> && !std::is_same_v<T, const char*> && !require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &container) { - if (container.empty()) { - b.append_raw("[]"); - return; - } - b.append('['); - bool first = true; - for (const auto& item : container) { - if (!first) { - b.append(','); - } - first = false; - atom(b, item); +simdjson_inline simdjson_result<json_type> value_iterator::type() const noexcept { + switch (*peek_start()) { + case '{': + return json_type::object; + case '[': + return json_type::array; + case '"': + return json_type::string; + case 'n': + return json_type::null; + case 't': case 'f': + return json_type::boolean; + case '-': + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + return json_type::number; + default: + return json_type::unknown; } - b.append(']'); } -// append functions that delegate to atom functions for primitive types -template <class T> - requires(std::is_arithmetic_v<T> && !std::is_same_v<T, char>) -void append(string_builder &b, const T &t) { - atom(b, t); +simdjson_inline token_position value_iterator::start_position() const noexcept { + return _start_position; } -template <class T> - requires(std::is_same_v<T, std::string> || - std::is_same_v<T, std::string_view> || - std::is_same_v<T, const char *> || - std::is_same_v<T, char>) -void append(string_builder &b, const T &t) { - atom(b, t); +simdjson_inline token_position value_iterator::position() const noexcept { + return _json_iter->position(); } -template <concepts::optional_type T> - requires(!require_custom_serialization<T>) -void append(string_builder &b, const T &t) { - atom(b, t); +simdjson_inline token_position value_iterator::end_position() const noexcept { + return _json_iter->end_position(); } -template <concepts::smart_pointer T> - requires(!require_custom_serialization<T>) -void append(string_builder &b, const T &t) { - atom(b, t); +simdjson_inline token_position value_iterator::last_position() const noexcept { + return _json_iter->last_position(); } -template <concepts::appendable_containers T> - requires(!concepts::container_but_not_string<T> && !concepts::string_view_keyed_map<T> && - !concepts::optional_type<T> && !concepts::smart_pointer<T> && - !std::is_same_v<T, std::string> && - !std::is_same_v<T, std::string_view> && !std::is_same_v<T, const char*> && !require_custom_serialization<T>) -void append(string_builder &b, const T &t) { - atom(b, t); +simdjson_inline error_code value_iterator::report_error(error_code error, const char *message) noexcept { + return _json_iter->report_error(error, message); } -template <concepts::string_view_keyed_map T> - requires(!require_custom_serialization<T>) -void append(string_builder &b, const T &t) { - atom(b, t); -} +} // namespace ondemand +} // namespace westmere +} // namespace simdjson -// works for struct -template <class Z> - requires(std::is_class_v<Z> && !concepts::container_but_not_string<Z> && - !concepts::string_view_keyed_map<Z> && - !concepts::optional_type<Z> && - !concepts::smart_pointer<Z> && - !concepts::appendable_containers<Z> && - !std::is_same_v<Z, std::string> && - !std::is_same_v<Z, std::string_view> && - !std::is_same_v<Z, const char*> && - !std::is_same_v<Z, char> && !require_custom_serialization<Z>) -void append(string_builder &b, const Z &z) { - int i = 0; - b.append('{'); - template for (constexpr auto dm : std::define_static_array(std::meta::nonstatic_data_members_of(^^Z, std::meta::access_context::unchecked()))) { - if (i != 0) - b.append(','); - constexpr auto key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(dm))); - b.append_raw(key); - b.append(':'); - atom(b, z.[:dm:]); - i++; - }; - b.append('}'); -} +namespace simdjson { -// works for container that have begin() and end() iterators -template <class Z> - requires(concepts::container_but_not_string<Z> && !require_custom_serialization<Z>) -void append(string_builder &b, const Z &z) { - auto it = z.begin(); - auto end = z.end(); - if (it == end) { - b.append_raw("[]"); - return; - } - b.append('['); - atom(b, *it); - ++it; - for (; it != end; ++it) { - b.append(','); - atom(b, *it); - } - b.append(']'); -} +simdjson_inline simdjson_result<westmere::ondemand::value_iterator>::simdjson_result(westmere::ondemand::value_iterator &&value) noexcept + : implementation_simdjson_result_base<westmere::ondemand::value_iterator>(std::forward<westmere::ondemand::value_iterator>(value)) {} +simdjson_inline simdjson_result<westmere::ondemand::value_iterator>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<westmere::ondemand::value_iterator>(error) {} -template <class Z> - requires (require_custom_serialization<Z>) -void append(string_builder &b, const Z &z) { - b.append(z); -} +} // namespace simdjson +#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H +/* end file simdjson/generic/ondemand/value_iterator-inl.h for westmere */ +/* including simdjson/generic/ondemand/serialization-inl.h for westmere: #include "simdjson/generic/ondemand/serialization-inl.h" */ +/* begin file simdjson/generic/ondemand/serialization-inl.h for westmere */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H -template <class Z> -simdjson_warn_unused simdjson_result<std::string> to_json_string(const Z &z, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { - string_builder b(initial_capacity); - append(b, z); - std::string_view s; - if(auto e = b.view().get(s); e) { return e; } - return std::string(s); -} +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document-inl.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/serialization.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */ +/* amalgamation skipped (editor-only): #if SIMDJSON_STATIC_REFLECTION */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_builder.h" */ +/* amalgamation skipped (editor-only): #endif */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -template <class Z> -simdjson_warn_unused simdjson_error to_json(const Z &z, std::string &s, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { - string_builder b(initial_capacity); - append(b, z); - std::string_view view; - if(auto e = b.view().get(view); e) { return e; } - s.assign(view); - return SUCCESS; +namespace simdjson { + +inline std::string_view trim(const std::string_view str) noexcept { + // We can almost surely do better by rolling our own find_first_not_of function. + size_t first = str.find_first_not_of(" \t\n\r"); + // If we have the empty string (just white space), then no trimming is possible, and + // we return the empty string_view. + if (std::string_view::npos == first) { return std::string_view(); } + size_t last = str.find_last_not_of(" \t\n\r"); + return str.substr(first, (last - first + 1)); } -template <class Z> -string_builder& operator<<(string_builder& b, const Z& z) { - append(b, z); - return b; + +inline simdjson_result<std::string_view> to_json_string(westmere::ondemand::document& x) noexcept { + std::string_view v; + auto error = x.raw_json().get(v); + if(error) {return error; } + return trim(v); } -// extract_from: Serialize only specific fields from a struct to JSON -template<constevalutil::fixed_string... FieldNames, typename T> - requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) -void extract_from(string_builder &b, const T &obj) { - // Helper to check if a field name matches any of the requested fields - auto should_extract = [](std::string_view field_name) constexpr -> bool { - return ((FieldNames.view() == field_name) || ...); - }; +inline simdjson_result<std::string_view> to_json_string(westmere::ondemand::document_reference& x) noexcept { + std::string_view v; + auto error = x.raw_json().get(v); + if(error) {return error; } + return trim(v); +} - b.append('{'); - bool first = true; +inline simdjson_result<std::string_view> to_json_string(westmere::ondemand::value& x) noexcept { + /** + * If we somehow receive a value that has already been consumed, + * then the following code could be in trouble. E.g., we create + * an array as needed, but if an array was already created, then + * it could be bad. + */ + using namespace westmere::ondemand; + westmere::ondemand::json_type t; + auto error = x.type().get(t); + if(error != SUCCESS) { return error; } + switch (t) + { + case json_type::array: + { + westmere::ondemand::array array; + error = x.get_array().get(array); + if(error) { return error; } + return to_json_string(array); + } + case json_type::object: + { + westmere::ondemand::object object; + error = x.get_object().get(object); + if(error) { return error; } + return to_json_string(object); + } + default: + return trim(x.raw_json_token()); + } +} - // Iterate through all members of T using reflection - template for (constexpr auto mem : std::define_static_array( - std::meta::nonstatic_data_members_of(^^T, std::meta::access_context::unchecked()))) { +inline simdjson_result<std::string_view> to_json_string(westmere::ondemand::object& x) noexcept { + std::string_view v; + auto error = x.raw_json().get(v); + if(error) {return error; } + return trim(v); +} - if constexpr (std::meta::is_public(mem)) { - constexpr std::string_view key = std::define_static_string(std::meta::identifier_of(mem)); +inline simdjson_result<std::string_view> to_json_string(westmere::ondemand::array& x) noexcept { + std::string_view v; + auto error = x.raw_json().get(v); + if(error) {return error; } + return trim(v); +} - // Only serialize this field if it's in our list of requested fields - if constexpr (should_extract(key)) { - if (!first) { - b.append(','); - } - first = false; +inline simdjson_result<std::string_view> to_json_string(simdjson_result<westmere::ondemand::document> x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); +} - // Serialize the key - constexpr auto quoted_key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(mem))); - b.append_raw(quoted_key); - b.append(':'); +inline simdjson_result<std::string_view> to_json_string(simdjson_result<westmere::ondemand::document_reference> x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); +} - // Serialize the value - atom(b, obj.[:mem:]); - } - } - }; +inline simdjson_result<std::string_view> to_json_string(simdjson_result<westmere::ondemand::value> x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); +} - b.append('}'); +inline simdjson_result<std::string_view> to_json_string(simdjson_result<westmere::ondemand::object> x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } -template<constevalutil::fixed_string... FieldNames, typename T> - requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) -simdjson_warn_unused simdjson_result<std::string> extract_from(const T &obj, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { - string_builder b(initial_capacity); - extract_from<FieldNames...>(b, obj); - std::string_view s; - if(auto e = b.view().get(s); e) { return e; } - return std::string(s); +inline simdjson_result<std::string_view> to_json_string(simdjson_result<westmere::ondemand::array> x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } +} // namespace simdjson -} // namespace builder -} // namespace ppc64 -// Alias the function template to 'to' in the global namespace -template <class Z> -simdjson_warn_unused simdjson_result<std::string> to_json(const Z &z, size_t initial_capacity = ppc64::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { - ppc64::builder::string_builder b(initial_capacity); - ppc64::builder::append(b, z); - std::string_view s; - if(auto e = b.view().get(s); e) { return e; } - return std::string(s); +namespace simdjson { namespace westmere { namespace ondemand { + +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::westmere::ondemand::value x) { + std::string_view v; + auto error = simdjson::to_json_string(x).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + throw simdjson::simdjson_error(error); + } } -template <class Z> -simdjson_warn_unused simdjson_error to_json(const Z &z, std::string &s, size_t initial_capacity = ppc64::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { - ppc64::builder::string_builder b(initial_capacity); - ppc64::builder::append(b, z); - std::string_view view; - if(auto e = b.view().get(view); e) { return e; } - s.assign(view); - return SUCCESS; +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::westmere::ondemand::value> x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); } -// Global namespace function for extract_from -template<constevalutil::fixed_string... FieldNames, typename T> - requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) -simdjson_warn_unused simdjson_result<std::string> extract_from(const T &obj, size_t initial_capacity = ppc64::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { - ppc64::builder::string_builder b(initial_capacity); - ppc64::builder::extract_from<FieldNames...>(b, obj); - std::string_view s; - if(auto e = b.view().get(s); e) { return e; } - return std::string(s); +#else +inline std::ostream& operator<<(std::ostream& out, simdjson::westmere::ondemand::value x) { + std::string_view v; + auto error = simdjson::to_json_string(x).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + return (out << error); + } } +#endif -} // namespace simdjson +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::westmere::ondemand::array value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + throw simdjson::simdjson_error(error); + } +} +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::westmere::ondemand::array> x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); +} +#else +inline std::ostream& operator<<(std::ostream& out, simdjson::westmere::ondemand::array value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + return (out << error); + } +} +#endif -#endif // SIMDJSON_STATIC_REFLECTION +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::westmere::ondemand::document& value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + throw simdjson::simdjson_error(error); + } +} +inline std::ostream& operator<<(std::ostream& out, simdjson::westmere::ondemand::document_reference& value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + throw simdjson::simdjson_error(error); + } +} +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::westmere::ondemand::document>&& x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); +} +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::westmere::ondemand::document_reference>&& x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); +} +#else +inline std::ostream& operator<<(std::ostream& out, simdjson::westmere::ondemand::document& value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + return (out << error); + } +} +#endif +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::westmere::ondemand::object value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + throw simdjson::simdjson_error(error); + } +} +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::westmere::ondemand::object> x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); +} +#else +inline std::ostream& operator<<(std::ostream& out, simdjson::westmere::ondemand::object value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + return (out << error); + } +} #endif -/* end file simdjson/generic/ondemand/json_builder.h for ppc64 */ +}}} // namespace simdjson::westmere::ondemand + +#endif // SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H +/* end file simdjson/generic/ondemand/serialization-inl.h for westmere */ // JSON path accessor (compile-time) - must be after inline definitions -/* including simdjson/generic/ondemand/compile_time_accessors.h for ppc64: #include "simdjson/generic/ondemand/compile_time_accessors.h" */ -/* begin file simdjson/generic/ondemand/compile_time_accessors.h for ppc64 */ +/* including simdjson/generic/ondemand/compile_time_accessors.h for westmere: #include "simdjson/generic/ondemand/compile_time_accessors.h" */ +/* begin file simdjson/generic/ondemand/compile_time_accessors.h for westmere */ /** * Compile-time JSON Path and JSON Pointer accessors using C++26 reflection (P2996) * @@ -107090,7 +142414,7 @@ simdjson_warn_unused simdjson_result<std::string> extract_from(const T &obj, siz #include <array> namespace simdjson { -namespace ppc64 { +namespace westmere { namespace ondemand { /*** * JSONPath implementation for compile-time access @@ -107101,7 +142425,7 @@ namespace json_path { // Note: value type must be fully defined before this header is included // This is ensured by including this in amalgamated.h after value-inl.h -using ::simdjson::ppc64::ondemand::value; +using ::simdjson::westmere::ondemand::value; // Path step types enum class step_type { @@ -107235,7 +142559,7 @@ struct json_path_parser { // Compile-time path accessor generator template<typename T, constevalutil::fixed_string Path> struct path_accessor { - using value = ::simdjson::ppc64::ondemand::value; + using value = ::simdjson::westmere::ondemand::value; static constexpr auto parser = json_path_parser<Path>(); static constexpr std::size_t num_steps = parser.count_steps(); @@ -107713,14 +143037,14 @@ struct path_accessor { // Compile-time path accessor with validation template<typename T, constevalutil::fixed_string Path, typename DocOrValue> -inline simdjson_result<::simdjson::ppc64::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { +inline simdjson_result<::simdjson::westmere::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { using accessor = path_accessor<T, Path>; return accessor::access(doc_or_val); } // Overload without type parameter (no validation) template<constevalutil::fixed_string Path, typename DocOrValue> -inline simdjson_result<::simdjson::ppc64::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { +inline simdjson_result<::simdjson::westmere::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { using accessor = path_accessor<void, Path>; return accessor::access(doc_or_val); } @@ -107951,135 +143275,112 @@ struct pointer_accessor { // Compile-time JSON Pointer accessor with validation template<typename T, constevalutil::fixed_string Pointer, typename DocOrValue> -inline simdjson_result<::simdjson::ppc64::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { +inline simdjson_result<::simdjson::westmere::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { using accessor = pointer_accessor<T, Pointer>; return accessor::access(doc_or_val); } // Overload without type parameter (no validation) template<constevalutil::fixed_string Pointer, typename DocOrValue> -inline simdjson_result<::simdjson::ppc64::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { +inline simdjson_result<::simdjson::westmere::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { using accessor = pointer_accessor<void, Pointer>; return accessor::access(doc_or_val); } } // namespace json_path } // namespace ondemand -} // namespace ppc64 +} // namespace westmere } // namespace simdjson #endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION #endif // SIMDJSON_GENERIC_ONDEMAND_COMPILE_TIME_ACCESSORS_H -/* end file simdjson/generic/ondemand/compile_time_accessors.h for ppc64 */ +/* end file simdjson/generic/ondemand/compile_time_accessors.h for westmere */ -/* end file simdjson/generic/ondemand/amalgamated.h for ppc64 */ -/* including simdjson/ppc64/end.h: #include "simdjson/ppc64/end.h" */ -/* begin file simdjson/ppc64/end.h */ +/* end file simdjson/generic/ondemand/amalgamated.h for westmere */ +/* including simdjson/westmere/end.h: #include "simdjson/westmere/end.h" */ +/* begin file simdjson/westmere/end.h */ /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -#undef SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT -/* undefining SIMDJSON_IMPLEMENTATION from "ppc64" */ +#if !SIMDJSON_CAN_ALWAYS_RUN_WESTMERE +SIMDJSON_UNTARGET_REGION +#endif + +/* undefining SIMDJSON_IMPLEMENTATION from "westmere" */ #undef SIMDJSON_IMPLEMENTATION -/* end file simdjson/ppc64/end.h */ +/* end file simdjson/westmere/end.h */ -#endif // SIMDJSON_PPC64_ONDEMAND_H -/* end file simdjson/ppc64/ondemand.h */ -#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(westmere) -/* including simdjson/westmere/ondemand.h: #include "simdjson/westmere/ondemand.h" */ -/* begin file simdjson/westmere/ondemand.h */ -#ifndef SIMDJSON_WESTMERE_ONDEMAND_H -#define SIMDJSON_WESTMERE_ONDEMAND_H +#endif // SIMDJSON_WESTMERE_IMPLEMENTATION_H +/* end file simdjson/westmere/ondemand.h */ +#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(lsx) +/* including simdjson/lsx/ondemand.h: #include "simdjson/lsx/ondemand.h" */ +/* begin file simdjson/lsx/ondemand.h */ +#ifndef SIMDJSON_LSX_ONDEMAND_H +#define SIMDJSON_LSX_ONDEMAND_H -/* including simdjson/westmere/begin.h: #include "simdjson/westmere/begin.h" */ -/* begin file simdjson/westmere/begin.h */ -/* defining SIMDJSON_IMPLEMENTATION to "westmere" */ -#define SIMDJSON_IMPLEMENTATION westmere -/* including simdjson/westmere/base.h: #include "simdjson/westmere/base.h" */ -/* begin file simdjson/westmere/base.h */ -#ifndef SIMDJSON_WESTMERE_BASE_H -#define SIMDJSON_WESTMERE_BASE_H +/* including simdjson/lsx/begin.h: #include "simdjson/lsx/begin.h" */ +/* begin file simdjson/lsx/begin.h */ +/* defining SIMDJSON_IMPLEMENTATION to "lsx" */ +#define SIMDJSON_IMPLEMENTATION lsx +/* including simdjson/lsx/base.h: #include "simdjson/lsx/base.h" */ +/* begin file simdjson/lsx/base.h */ +#ifndef SIMDJSON_LSX_BASE_H +#define SIMDJSON_LSX_BASE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ /* amalgamation skipped (editor-only): #include "simdjson/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -// The constructor may be executed on any host, so we take care not to use SIMDJSON_TARGET_WESTMERE namespace simdjson { /** - * Implementation for Westmere (Intel SSE4.2). + * Implementation for LSX. */ -namespace westmere { +namespace lsx { class implementation; namespace { namespace simd { - template <typename T> struct simd8; template <typename T> struct simd8x64; - } // namespace simd } // unnamed namespace -} // namespace westmere +} // namespace lsx } // namespace simdjson -#endif // SIMDJSON_WESTMERE_BASE_H -/* end file simdjson/westmere/base.h */ -/* including simdjson/westmere/intrinsics.h: #include "simdjson/westmere/intrinsics.h" */ -/* begin file simdjson/westmere/intrinsics.h */ -#ifndef SIMDJSON_WESTMERE_INTRINSICS_H -#define SIMDJSON_WESTMERE_INTRINSICS_H +#endif // SIMDJSON_LSX_BASE_H +/* end file simdjson/lsx/base.h */ +/* including simdjson/lsx/intrinsics.h: #include "simdjson/lsx/intrinsics.h" */ +/* begin file simdjson/lsx/intrinsics.h */ +#ifndef SIMDJSON_LSX_INTRINSICS_H +#define SIMDJSON_LSX_INTRINSICS_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -#if SIMDJSON_VISUAL_STUDIO -// under clang within visual studio, this will include <x86intrin.h> -#include <intrin.h> // visual studio or clang -#else -#include <x86intrin.h> // elsewhere -#endif // SIMDJSON_VISUAL_STUDIO - - -#if SIMDJSON_CLANG_VISUAL_STUDIO -/** - * You are not supposed, normally, to include these - * headers directly. Instead you should either include intrin.h - * or x86intrin.h. However, when compiling with clang - * under Windows (i.e., when _MSC_VER is set), these headers - * only get included *if* the corresponding features are detected - * from macros: - */ -#include <smmintrin.h> // for _mm_alignr_epi8 -#include <wmmintrin.h> // for _mm_clmulepi64_si128 -#endif - -static_assert(sizeof(__m128i) <= simdjson::SIMDJSON_PADDING, "insufficient padding for westmere"); - -#endif // SIMDJSON_WESTMERE_INTRINSICS_H -/* end file simdjson/westmere/intrinsics.h */ +#include <lsxintrin.h> -#if !SIMDJSON_CAN_ALWAYS_RUN_WESTMERE -SIMDJSON_TARGET_REGION("sse4.2,pclmul,popcnt") -#endif +static_assert(sizeof(__m128i) <= simdjson::SIMDJSON_PADDING, "insufficient padding for LoongArch SX"); -/* including simdjson/westmere/bitmanipulation.h: #include "simdjson/westmere/bitmanipulation.h" */ -/* begin file simdjson/westmere/bitmanipulation.h */ -#ifndef SIMDJSON_WESTMERE_BITMANIPULATION_H -#define SIMDJSON_WESTMERE_BITMANIPULATION_H +#endif // SIMDJSON_LSX_INTRINSICS_H +/* end file simdjson/lsx/intrinsics.h */ +/* including simdjson/lsx/bitmanipulation.h: #include "simdjson/lsx/bitmanipulation.h" */ +/* begin file simdjson/lsx/bitmanipulation.h */ +#ifndef SIMDJSON_LSX_BITMANIPULATION_H +#define SIMDJSON_LSX_BITMANIPULATION_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/westmere/intrinsics.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/intrinsics.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/bitmask.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace westmere { +namespace lsx { namespace { // We sometimes call trailing_zero on inputs that are zero, @@ -108091,15 +143392,7 @@ SIMDJSON_NO_SANITIZE_UNDEFINED // See issue https://github.com/simdjson/simdjson/issues/1965 SIMDJSON_NO_SANITIZE_MEMORY simdjson_inline int trailing_zeroes(uint64_t input_num) { -#if SIMDJSON_REGULAR_VISUAL_STUDIO - unsigned long ret; - // Search the mask data from least significant bit (LSB) - // to the most significant bit (MSB) for a set bit (1). - _BitScanForward64(&ret, input_num); - return (int)ret; -#else // SIMDJSON_REGULAR_VISUAL_STUDIO return __builtin_ctzll(input_num); -#endif // SIMDJSON_REGULAR_VISUAL_STUDIO } /* result might be undefined when input_num is zero */ @@ -108109,59 +143402,36 @@ simdjson_inline uint64_t clear_lowest_bit(uint64_t input_num) { /* result might be undefined when input_num is zero */ simdjson_inline int leading_zeroes(uint64_t input_num) { -#if SIMDJSON_REGULAR_VISUAL_STUDIO - unsigned long leading_zero = 0; - // Search the mask data from most significant bit (MSB) - // to least significant bit (LSB) for a set bit (1). - if (_BitScanReverse64(&leading_zero, input_num)) - return (int)(63 - leading_zero); - else - return 64; -#else return __builtin_clzll(input_num); -#endif// SIMDJSON_REGULAR_VISUAL_STUDIO } -#if SIMDJSON_REGULAR_VISUAL_STUDIO -simdjson_inline unsigned __int64 count_ones(uint64_t input_num) { - // note: we do not support legacy 32-bit Windows in this kernel - return __popcnt64(input_num);// Visual Studio wants two underscores -} -#else -simdjson_inline long long int count_ones(uint64_t input_num) { - return _popcnt64(input_num); +/* result might be undefined when input_num is zero */ +simdjson_inline int count_ones(uint64_t input_num) { + return __lsx_vpickve2gr_w(__lsx_vpcnt_d(__m128i(v2u64{input_num, 0})), 0); } -#endif -simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2, - uint64_t *result) { -#if SIMDJSON_REGULAR_VISUAL_STUDIO - return _addcarry_u64(0, value1, value2, - reinterpret_cast<unsigned __int64 *>(result)); -#else +simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2, uint64_t *result) { return __builtin_uaddll_overflow(value1, value2, reinterpret_cast<unsigned long long *>(result)); -#endif } } // unnamed namespace -} // namespace westmere +} // namespace lsx } // namespace simdjson -#endif // SIMDJSON_WESTMERE_BITMANIPULATION_H -/* end file simdjson/westmere/bitmanipulation.h */ -/* including simdjson/westmere/bitmask.h: #include "simdjson/westmere/bitmask.h" */ -/* begin file simdjson/westmere/bitmask.h */ -#ifndef SIMDJSON_WESTMERE_BITMASK_H -#define SIMDJSON_WESTMERE_BITMASK_H +#endif // SIMDJSON_LSX_BITMANIPULATION_H +/* end file simdjson/lsx/bitmanipulation.h */ +/* including simdjson/lsx/bitmask.h: #include "simdjson/lsx/bitmask.h" */ +/* begin file simdjson/lsx/bitmask.h */ +#ifndef SIMDJSON_LSX_BITMASK_H +#define SIMDJSON_LSX_BITMASK_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/westmere/intrinsics.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace westmere { +namespace lsx { namespace { // @@ -108169,162 +143439,89 @@ namespace { // // For example, prefix_xor(00100100) == 00011100 // -simdjson_inline uint64_t prefix_xor(const uint64_t bitmask) { - // There should be no such thing with a processing supporting avx2 - // but not clmul. - __m128i all_ones = _mm_set1_epi8('\xFF'); - __m128i result = _mm_clmulepi64_si128(_mm_set_epi64x(0ULL, bitmask), all_ones, 0); - return _mm_cvtsi128_si64(result); +simdjson_inline uint64_t prefix_xor(uint64_t bitmask) { + bitmask ^= bitmask << 1; + bitmask ^= bitmask << 2; + bitmask ^= bitmask << 4; + bitmask ^= bitmask << 8; + bitmask ^= bitmask << 16; + bitmask ^= bitmask << 32; + return bitmask; } } // unnamed namespace -} // namespace westmere -} // namespace simdjson - -#endif // SIMDJSON_WESTMERE_BITMASK_H -/* end file simdjson/westmere/bitmask.h */ -/* including simdjson/westmere/numberparsing_defs.h: #include "simdjson/westmere/numberparsing_defs.h" */ -/* begin file simdjson/westmere/numberparsing_defs.h */ -#ifndef SIMDJSON_WESTMERE_NUMBERPARSING_DEFS_H -#define SIMDJSON_WESTMERE_NUMBERPARSING_DEFS_H - -/* including simdjson/westmere/base.h: #include "simdjson/westmere/base.h" */ -/* begin file simdjson/westmere/base.h */ -#ifndef SIMDJSON_WESTMERE_BASE_H -#define SIMDJSON_WESTMERE_BASE_H - -/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/base.h" */ -/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ - -// The constructor may be executed on any host, so we take care not to use SIMDJSON_TARGET_WESTMERE -namespace simdjson { -/** - * Implementation for Westmere (Intel SSE4.2). - */ -namespace westmere { - -class implementation; - -namespace { -namespace simd { - -template <typename T> struct simd8; -template <typename T> struct simd8x64; - -} // namespace simd -} // unnamed namespace - -} // namespace westmere +} // namespace lsx } // namespace simdjson -#endif // SIMDJSON_WESTMERE_BASE_H -/* end file simdjson/westmere/base.h */ -/* including simdjson/westmere/intrinsics.h: #include "simdjson/westmere/intrinsics.h" */ -/* begin file simdjson/westmere/intrinsics.h */ -#ifndef SIMDJSON_WESTMERE_INTRINSICS_H -#define SIMDJSON_WESTMERE_INTRINSICS_H - -/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */ -/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ - -#if SIMDJSON_VISUAL_STUDIO -// under clang within visual studio, this will include <x86intrin.h> -#include <intrin.h> // visual studio or clang -#else -#include <x86intrin.h> // elsewhere -#endif // SIMDJSON_VISUAL_STUDIO - - -#if SIMDJSON_CLANG_VISUAL_STUDIO -/** - * You are not supposed, normally, to include these - * headers directly. Instead you should either include intrin.h - * or x86intrin.h. However, when compiling with clang - * under Windows (i.e., when _MSC_VER is set), these headers - * only get included *if* the corresponding features are detected - * from macros: - */ -#include <smmintrin.h> // for _mm_alignr_epi8 -#include <wmmintrin.h> // for _mm_clmulepi64_si128 #endif - -static_assert(sizeof(__m128i) <= simdjson::SIMDJSON_PADDING, "insufficient padding for westmere"); - -#endif // SIMDJSON_WESTMERE_INTRINSICS_H -/* end file simdjson/westmere/intrinsics.h */ +/* end file simdjson/lsx/bitmask.h */ +/* including simdjson/lsx/numberparsing_defs.h: #include "simdjson/lsx/numberparsing_defs.h" */ +/* begin file simdjson/lsx/numberparsing_defs.h */ +#ifndef SIMDJSON_LSX_NUMBERPARSING_DEFS_H +#define SIMDJSON_LSX_NUMBERPARSING_DEFS_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/intrinsics.h" */ /* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ +#include <cstring> + namespace simdjson { -namespace westmere { +namespace lsx { namespace numberparsing { +// we don't have appropriate instructions, so let us use a scalar function +// credit: https://johnnylee-sde.github.io/Fast-numeric-string-to-int/ /** @private */ static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) { - // this actually computes *16* values so we are being wasteful. - const __m128i ascii0 = _mm_set1_epi8('0'); - const __m128i mul_1_10 = - _mm_setr_epi8(10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1); - const __m128i mul_1_100 = _mm_setr_epi16(100, 1, 100, 1, 100, 1, 100, 1); - const __m128i mul_1_10000 = - _mm_setr_epi16(10000, 1, 10000, 1, 10000, 1, 10000, 1); - const __m128i input = _mm_sub_epi8( - _mm_loadu_si128(reinterpret_cast<const __m128i *>(chars)), ascii0); - const __m128i t1 = _mm_maddubs_epi16(input, mul_1_10); - const __m128i t2 = _mm_madd_epi16(t1, mul_1_100); - const __m128i t3 = _mm_packus_epi32(t2, t2); - const __m128i t4 = _mm_madd_epi16(t3, mul_1_10000); - return _mm_cvtsi128_si32( - t4); // only captures the sum of the first 8 digits, drop the rest + uint64_t val; + std::memcpy(&val, chars, sizeof(uint64_t)); + val = (val & 0x0F0F0F0F0F0F0F0F) * 2561 >> 8; + val = (val & 0x00FF00FF00FF00FF) * 6553601 >> 16; + return uint32_t((val & 0x0000FFFF0000FFFF) * 42949672960001 >> 32); } -/** @private */ simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) { internal::value128 answer; -#if SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS -#if SIMDJSON_IS_ARM64 - // ARM64 has native support for 64-bit multiplications, no need to emultate - answer.high = __umulh(value1, value2); - answer.low = value1 * value2; -#else - answer.low = _umul128(value1, value2, &answer.high); // _umul128 not available on ARM64 -#endif // SIMDJSON_IS_ARM64 -#else // SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS __uint128_t r = (static_cast<__uint128_t>(value1)) * value2; answer.low = uint64_t(r); answer.high = uint64_t(r >> 64); -#endif return answer; } } // namespace numberparsing -} // namespace westmere +} // namespace lsx } // namespace simdjson +#ifndef SIMDJSON_SWAR_NUMBER_PARSING +#if SIMDJSON_IS_BIG_ENDIAN +#define SIMDJSON_SWAR_NUMBER_PARSING 0 +#else #define SIMDJSON_SWAR_NUMBER_PARSING 1 +#endif +#endif -#endif // SIMDJSON_WESTMERE_NUMBERPARSING_DEFS_H -/* end file simdjson/westmere/numberparsing_defs.h */ -/* including simdjson/westmere/simd.h: #include "simdjson/westmere/simd.h" */ -/* begin file simdjson/westmere/simd.h */ -#ifndef SIMDJSON_WESTMERE_SIMD_H -#define SIMDJSON_WESTMERE_SIMD_H +#endif // SIMDJSON_LSX_NUMBERPARSING_DEFS_H +/* end file simdjson/lsx/numberparsing_defs.h */ +/* including simdjson/lsx/simd.h: #include "simdjson/lsx/simd.h" */ +/* begin file simdjson/lsx/simd.h */ +#ifndef SIMDJSON_LSX_SIMD_H +#define SIMDJSON_LSX_SIMD_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/westmere/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/bitmanipulation.h" */ /* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace westmere { +namespace lsx { namespace { namespace simd { + // Forward-declared so they can be used by splat and friends. template<typename Child> struct base { __m128i value; @@ -108338,56 +143535,61 @@ namespace simd { // Conversion to SIMD register simdjson_inline operator const __m128i&() const { return this->value; } simdjson_inline operator __m128i&() { return this->value; } + simdjson_inline operator const v16i8&() const { return (v16i8&)this->value; } + simdjson_inline operator v16i8&() { return (v16i8&)this->value; } // Bit operations - simdjson_inline Child operator|(const Child other) const { return _mm_or_si128(*this, other); } - simdjson_inline Child operator&(const Child other) const { return _mm_and_si128(*this, other); } - simdjson_inline Child operator^(const Child other) const { return _mm_xor_si128(*this, other); } - simdjson_inline Child bit_andnot(const Child other) const { return _mm_andnot_si128(other, *this); } + simdjson_inline Child operator|(const Child other) const { return __lsx_vor_v(*this, other); } + simdjson_inline Child operator&(const Child other) const { return __lsx_vand_v(*this, other); } + simdjson_inline Child operator^(const Child other) const { return __lsx_vxor_v(*this, other); } + simdjson_inline Child bit_andnot(const Child other) const { return __lsx_vandn_v(other, *this); } simdjson_inline Child& operator|=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast | other; return *this_cast; } simdjson_inline Child& operator&=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast & other; return *this_cast; } simdjson_inline Child& operator^=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast ^ other; return *this_cast; } }; + // Forward-declared so they can be used by splat and friends. + template<typename T> + struct simd8; + template<typename T, typename Mask=simd8<bool>> struct base8: base<simd8<T>> { - typedef uint16_t bitmask_t; - typedef uint32_t bitmask2_t; - simdjson_inline base8() : base<simd8<T>>() {} simdjson_inline base8(const __m128i _value) : base<simd8<T>>(_value) {} - friend simdjson_inline Mask operator==(const simd8<T> lhs, const simd8<T> rhs) { return _mm_cmpeq_epi8(lhs, rhs); } + friend simdjson_really_inline Mask operator==(const simd8<T> lhs, const simd8<T> rhs) { return __lsx_vseq_b(lhs, rhs); } static const int SIZE = sizeof(base<simd8<T>>::value); template<int N=1> simdjson_inline simd8<T> prev(const simd8<T> prev_chunk) const { - return _mm_alignr_epi8(*this, prev_chunk, 16 - N); + return __lsx_vor_v(__lsx_vbsll_v(*this, N), __lsx_vbsrl_v(prev_chunk, 16 - N)); } }; // SIMD byte mask type (returned by things like eq and gt) template<> struct simd8<bool>: base8<bool> { - static simdjson_inline simd8<bool> splat(bool _value) { return _mm_set1_epi8(uint8_t(-(!!_value))); } + static simdjson_inline simd8<bool> splat(bool _value) { + return __lsx_vreplgr2vr_b(uint8_t(-(!!_value))); + } simdjson_inline simd8() : base8() {} simdjson_inline simd8(const __m128i _value) : base8<bool>(_value) {} // Splat constructor simdjson_inline simd8(bool _value) : base8<bool>(splat(_value)) {} - simdjson_inline int to_bitmask() const { return _mm_movemask_epi8(*this); } - simdjson_inline bool any() const { return !_mm_testz_si128(*this, *this); } + simdjson_inline int to_bitmask() const { return __lsx_vpickve2gr_w(__lsx_vmskltz_b(*this), 0); } + simdjson_inline bool any() const { return 0 == __lsx_vpickve2gr_hu(__lsx_vmsknz_b(*this), 0); } simdjson_inline simd8<bool> operator~() const { return *this ^ true; } }; template<typename T> struct base8_numeric: base8<T> { - static simdjson_inline simd8<T> splat(T _value) { return _mm_set1_epi8(_value); } - static simdjson_inline simd8<T> zero() { return _mm_setzero_si128(); } + static simdjson_inline simd8<T> splat(T _value) { return __lsx_vreplgr2vr_b(_value); } + static simdjson_inline simd8<T> zero() { return __lsx_vldi(0); } static simdjson_inline simd8<T> load(const T values[16]) { - return _mm_loadu_si128(reinterpret_cast<const __m128i *>(values)); + return __lsx_vld(reinterpret_cast<const __m128i *>(values), 0); } // Repeat 16 values as many times as necessary (usually for lookup tables) static simdjson_inline simd8<T> repeat_16( @@ -108404,487 +143606,50 @@ namespace simd { simdjson_inline base8_numeric(const __m128i _value) : base8<T>(_value) {} // Store to array - simdjson_inline void store(T dst[16]) const { return _mm_storeu_si128(reinterpret_cast<__m128i *>(dst), *this); } - - // Override to distinguish from bool version - simdjson_inline simd8<T> operator~() const { return *this ^ 0xFFu; } + simdjson_inline void store(T dst[16]) const { + return __lsx_vst(*this, reinterpret_cast<__m128i *>(dst), 0); + } // Addition/subtraction are the same for signed and unsigned - simdjson_inline simd8<T> operator+(const simd8<T> other) const { return _mm_add_epi8(*this, other); } - simdjson_inline simd8<T> operator-(const simd8<T> other) const { return _mm_sub_epi8(*this, other); } + simdjson_inline simd8<T> operator+(const simd8<T> other) const { return __lsx_vadd_b(*this, other); } + simdjson_inline simd8<T> operator-(const simd8<T> other) const { return __lsx_vsub_b(*this, other); } simdjson_inline simd8<T>& operator+=(const simd8<T> other) { *this = *this + other; return *static_cast<simd8<T>*>(this); } simdjson_inline simd8<T>& operator-=(const simd8<T> other) { *this = *this - other; return *static_cast<simd8<T>*>(this); } - // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values) - template<typename L> - simdjson_inline simd8<L> lookup_16(simd8<L> lookup_table) const { - return _mm_shuffle_epi8(lookup_table, *this); - } - - // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted as a bitset). - // Passing a 0 value for mask would be equivalent to writing out every byte to output. - // Only the first 16 - count_ones(mask) bytes of the result are significant but 16 bytes - // get written. - // Design consideration: it seems like a function with the - // signature simd8<L> compress(uint32_t mask) would be - // sensible, but the AVX ISA makes this kind of approach difficult. - template<typename L> - simdjson_inline void compress(uint16_t mask, L * output) const { - using internal::thintable_epi8; - using internal::BitsSetTable256mul2; - using internal::pshufb_combine_table; - // this particular implementation was inspired by work done by @animetosho - // we do it in two steps, first 8 bytes and then second 8 bytes - uint8_t mask1 = uint8_t(mask); // least significant 8 bits - uint8_t mask2 = uint8_t(mask >> 8); // most significant 8 bits - // next line just loads the 64-bit values thintable_epi8[mask1] and - // thintable_epi8[mask2] into a 128-bit register, using only - // two instructions on most compilers. - __m128i shufmask = _mm_set_epi64x(thintable_epi8[mask2], thintable_epi8[mask1]); - // we increment by 0x08 the second half of the mask - shufmask = - _mm_add_epi8(shufmask, _mm_set_epi32(0x08080808, 0x08080808, 0, 0)); - // this is the version "nearly pruned" - __m128i pruned = _mm_shuffle_epi8(*this, shufmask); - // we still need to put the two halves together. - // we compute the popcount of the first half: - int pop1 = BitsSetTable256mul2[mask1]; - // then load the corresponding mask, what it does is to write - // only the first pop1 bytes from the first 8 bytes, and then - // it fills in with the bytes from the second 8 bytes + some filling - // at the end. - __m128i compactmask = - _mm_loadu_si128(reinterpret_cast<const __m128i *>(pshufb_combine_table + pop1 * 8)); - __m128i answer = _mm_shuffle_epi8(pruned, compactmask); - _mm_storeu_si128(reinterpret_cast<__m128i *>(output), answer); - } - - template<typename L> - simdjson_inline simd8<L> lookup_16( - L replace0, L replace1, L replace2, L replace3, - L replace4, L replace5, L replace6, L replace7, - L replace8, L replace9, L replace10, L replace11, - L replace12, L replace13, L replace14, L replace15) const { - return lookup_16(simd8<L>::repeat_16( - replace0, replace1, replace2, replace3, - replace4, replace5, replace6, replace7, - replace8, replace9, replace10, replace11, - replace12, replace13, replace14, replace15 - )); - } - }; - - // Signed bytes - template<> - struct simd8<int8_t> : base8_numeric<int8_t> { - simdjson_inline simd8() : base8_numeric<int8_t>() {} - simdjson_inline simd8(const __m128i _value) : base8_numeric<int8_t>(_value) {} - // Splat constructor - simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {} - // Array constructor - simdjson_inline simd8(const int8_t* values) : simd8(load(values)) {} - // Member-by-member initialization - simdjson_inline simd8( - int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, - int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 - ) : simd8(_mm_setr_epi8( - v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15 - )) {} - // Repeat 16 values as many times as necessary (usually for lookup tables) - simdjson_inline static simd8<int8_t> repeat_16( - int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, - int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 - ) { - return simd8<int8_t>( - v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15 - ); - } - - // Order-sensitive comparisons - simdjson_inline simd8<int8_t> max_val(const simd8<int8_t> other) const { return _mm_max_epi8(*this, other); } - simdjson_inline simd8<int8_t> min_val(const simd8<int8_t> other) const { return _mm_min_epi8(*this, other); } - simdjson_inline simd8<bool> operator>(const simd8<int8_t> other) const { return _mm_cmpgt_epi8(*this, other); } - simdjson_inline simd8<bool> operator<(const simd8<int8_t> other) const { return _mm_cmpgt_epi8(other, *this); } - }; - - // Unsigned bytes - template<> - struct simd8<uint8_t>: base8_numeric<uint8_t> { - simdjson_inline simd8() : base8_numeric<uint8_t>() {} - simdjson_inline simd8(const __m128i _value) : base8_numeric<uint8_t>(_value) {} - // Splat constructor - simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {} - // Array constructor - simdjson_inline simd8(const uint8_t* values) : simd8(load(values)) {} - // Member-by-member initialization - simdjson_inline simd8( - uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, - uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 - ) : simd8(_mm_setr_epi8( - v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15 - )) {} - // Repeat 16 values as many times as necessary (usually for lookup tables) - simdjson_inline static simd8<uint8_t> repeat_16( - uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, - uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 - ) { - return simd8<uint8_t>( - v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15 - ); - } - - // Saturated math - simdjson_inline simd8<uint8_t> saturating_add(const simd8<uint8_t> other) const { return _mm_adds_epu8(*this, other); } - simdjson_inline simd8<uint8_t> saturating_sub(const simd8<uint8_t> other) const { return _mm_subs_epu8(*this, other); } - - // Order-specific operations - simdjson_inline simd8<uint8_t> max_val(const simd8<uint8_t> other) const { return _mm_max_epu8(*this, other); } - simdjson_inline simd8<uint8_t> min_val(const simd8<uint8_t> other) const { return _mm_min_epu8(*this, other); } - // Same as >, but only guarantees true is nonzero (< guarantees true = -1) - simdjson_inline simd8<uint8_t> gt_bits(const simd8<uint8_t> other) const { return this->saturating_sub(other); } - // Same as <, but only guarantees true is nonzero (< guarantees true = -1) - simdjson_inline simd8<uint8_t> lt_bits(const simd8<uint8_t> other) const { return other.saturating_sub(*this); } - simdjson_inline simd8<bool> operator<=(const simd8<uint8_t> other) const { return other.max_val(*this) == other; } - simdjson_inline simd8<bool> operator>=(const simd8<uint8_t> other) const { return other.min_val(*this) == other; } - simdjson_inline simd8<bool> operator>(const simd8<uint8_t> other) const { return this->gt_bits(other).any_bits_set(); } - simdjson_inline simd8<bool> operator<(const simd8<uint8_t> other) const { return this->gt_bits(other).any_bits_set(); } - - // Bit-specific operations - simdjson_inline simd8<bool> bits_not_set() const { return *this == uint8_t(0); } - simdjson_inline simd8<bool> bits_not_set(simd8<uint8_t> bits) const { return (*this & bits).bits_not_set(); } - simdjson_inline simd8<bool> any_bits_set() const { return ~this->bits_not_set(); } - simdjson_inline simd8<bool> any_bits_set(simd8<uint8_t> bits) const { return ~this->bits_not_set(bits); } - simdjson_inline bool is_ascii() const { return _mm_movemask_epi8(*this) == 0; } - simdjson_inline bool bits_not_set_anywhere() const { return _mm_testz_si128(*this, *this); } - simdjson_inline bool any_bits_set_anywhere() const { return !bits_not_set_anywhere(); } - simdjson_inline bool bits_not_set_anywhere(simd8<uint8_t> bits) const { return _mm_testz_si128(*this, bits); } - simdjson_inline bool any_bits_set_anywhere(simd8<uint8_t> bits) const { return !bits_not_set_anywhere(bits); } - template<int N> - simdjson_inline simd8<uint8_t> shr() const { return simd8<uint8_t>(_mm_srli_epi16(*this, N)) & uint8_t(0xFFu >> N); } - template<int N> - simdjson_inline simd8<uint8_t> shl() const { return simd8<uint8_t>(_mm_slli_epi16(*this, N)) & uint8_t(0xFFu << N); } - // Get one of the bits and make a bitmask out of it. - // e.g. value.get_bit<7>() gets the high bit - template<int N> - simdjson_inline int get_bit() const { return _mm_movemask_epi8(_mm_slli_epi16(*this, 7-N)); } - }; - - template<typename T> - struct simd8x64 { - static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<T>); - static_assert(NUM_CHUNKS == 4, "Westmere kernel should use four registers per 64-byte block."); - const simd8<T> chunks[NUM_CHUNKS]; - - simd8x64(const simd8x64<T>& o) = delete; // no copy allowed - simd8x64<T>& operator=(const simd8<T>& other) = delete; // no assignment allowed - simd8x64() = delete; // no default constructor allowed - - simdjson_inline simd8x64(const simd8<T> chunk0, const simd8<T> chunk1, const simd8<T> chunk2, const simd8<T> chunk3) : chunks{chunk0, chunk1, chunk2, chunk3} {} - simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8<T>::load(ptr), simd8<T>::load(ptr+16), simd8<T>::load(ptr+32), simd8<T>::load(ptr+48)} {} - - simdjson_inline void store(T ptr[64]) const { - this->chunks[0].store(ptr+sizeof(simd8<T>)*0); - this->chunks[1].store(ptr+sizeof(simd8<T>)*1); - this->chunks[2].store(ptr+sizeof(simd8<T>)*2); - this->chunks[3].store(ptr+sizeof(simd8<T>)*3); - } - - simdjson_inline simd8<T> reduce_or() const { - return (this->chunks[0] | this->chunks[1]) | (this->chunks[2] | this->chunks[3]); - } - - simdjson_inline uint64_t compress(uint64_t mask, T * output) const { - this->chunks[0].compress(uint16_t(mask), output); - this->chunks[1].compress(uint16_t(mask >> 16), output + 16 - count_ones(mask & 0xFFFF)); - this->chunks[2].compress(uint16_t(mask >> 32), output + 32 - count_ones(mask & 0xFFFFFFFF)); - this->chunks[3].compress(uint16_t(mask >> 48), output + 48 - count_ones(mask & 0xFFFFFFFFFFFF)); - return 64 - count_ones(mask); - } - - simdjson_inline uint64_t to_bitmask() const { - uint64_t r0 = uint32_t(this->chunks[0].to_bitmask() ); - uint64_t r1 = this->chunks[1].to_bitmask() ; - uint64_t r2 = this->chunks[2].to_bitmask() ; - uint64_t r3 = this->chunks[3].to_bitmask() ; - return r0 | (r1 << 16) | (r2 << 32) | (r3 << 48); - } - - simdjson_inline uint64_t eq(const T m) const { - const simd8<T> mask = simd8<T>::splat(m); - return simd8x64<bool>( - this->chunks[0] == mask, - this->chunks[1] == mask, - this->chunks[2] == mask, - this->chunks[3] == mask - ).to_bitmask(); - } - - simdjson_inline uint64_t eq(const simd8x64<uint8_t> &other) const { - return simd8x64<bool>( - this->chunks[0] == other.chunks[0], - this->chunks[1] == other.chunks[1], - this->chunks[2] == other.chunks[2], - this->chunks[3] == other.chunks[3] - ).to_bitmask(); - } - - simdjson_inline uint64_t lteq(const T m) const { - const simd8<T> mask = simd8<T>::splat(m); - return simd8x64<bool>( - this->chunks[0] <= mask, - this->chunks[1] <= mask, - this->chunks[2] <= mask, - this->chunks[3] <= mask - ).to_bitmask(); - } - }; // struct simd8x64<T> - -} // namespace simd -} // unnamed namespace -} // namespace westmere -} // namespace simdjson - -#endif // SIMDJSON_WESTMERE_SIMD_INPUT_H -/* end file simdjson/westmere/simd.h */ -/* including simdjson/westmere/stringparsing_defs.h: #include "simdjson/westmere/stringparsing_defs.h" */ -/* begin file simdjson/westmere/stringparsing_defs.h */ -#ifndef SIMDJSON_WESTMERE_STRINGPARSING_DEFS_H -#define SIMDJSON_WESTMERE_STRINGPARSING_DEFS_H - -/* including simdjson/westmere/bitmanipulation.h: #include "simdjson/westmere/bitmanipulation.h" */ -/* begin file simdjson/westmere/bitmanipulation.h */ -#ifndef SIMDJSON_WESTMERE_BITMANIPULATION_H -#define SIMDJSON_WESTMERE_BITMANIPULATION_H - -/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/westmere/intrinsics.h" */ -/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ - -namespace simdjson { -namespace westmere { -namespace { - -// We sometimes call trailing_zero on inputs that are zero, -// but the algorithms do not end up using the returned value. -// Sadly, sanitizers are not smart enough to figure it out. -SIMDJSON_NO_SANITIZE_UNDEFINED -// This function can be used safely even if not all bytes have been -// initialized. -// See issue https://github.com/simdjson/simdjson/issues/1965 -SIMDJSON_NO_SANITIZE_MEMORY -simdjson_inline int trailing_zeroes(uint64_t input_num) { -#if SIMDJSON_REGULAR_VISUAL_STUDIO - unsigned long ret; - // Search the mask data from least significant bit (LSB) - // to the most significant bit (MSB) for a set bit (1). - _BitScanForward64(&ret, input_num); - return (int)ret; -#else // SIMDJSON_REGULAR_VISUAL_STUDIO - return __builtin_ctzll(input_num); -#endif // SIMDJSON_REGULAR_VISUAL_STUDIO -} - -/* result might be undefined when input_num is zero */ -simdjson_inline uint64_t clear_lowest_bit(uint64_t input_num) { - return input_num & (input_num-1); -} - -/* result might be undefined when input_num is zero */ -simdjson_inline int leading_zeroes(uint64_t input_num) { -#if SIMDJSON_REGULAR_VISUAL_STUDIO - unsigned long leading_zero = 0; - // Search the mask data from most significant bit (MSB) - // to least significant bit (LSB) for a set bit (1). - if (_BitScanReverse64(&leading_zero, input_num)) - return (int)(63 - leading_zero); - else - return 64; -#else - return __builtin_clzll(input_num); -#endif// SIMDJSON_REGULAR_VISUAL_STUDIO -} - -#if SIMDJSON_REGULAR_VISUAL_STUDIO -simdjson_inline unsigned __int64 count_ones(uint64_t input_num) { - // note: we do not support legacy 32-bit Windows in this kernel - return __popcnt64(input_num);// Visual Studio wants two underscores -} -#else -simdjson_inline long long int count_ones(uint64_t input_num) { - return _popcnt64(input_num); -} -#endif - -simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2, - uint64_t *result) { -#if SIMDJSON_REGULAR_VISUAL_STUDIO - return _addcarry_u64(0, value1, value2, - reinterpret_cast<unsigned __int64 *>(result)); -#else - return __builtin_uaddll_overflow(value1, value2, - reinterpret_cast<unsigned long long *>(result)); -#endif -} - -} // unnamed namespace -} // namespace westmere -} // namespace simdjson - -#endif // SIMDJSON_WESTMERE_BITMANIPULATION_H -/* end file simdjson/westmere/bitmanipulation.h */ -/* including simdjson/westmere/simd.h: #include "simdjson/westmere/simd.h" */ -/* begin file simdjson/westmere/simd.h */ -#ifndef SIMDJSON_WESTMERE_SIMD_H -#define SIMDJSON_WESTMERE_SIMD_H - -/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/westmere/bitmanipulation.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */ -/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ - -namespace simdjson { -namespace westmere { -namespace { -namespace simd { - - template<typename Child> - struct base { - __m128i value; - - // Zero constructor - simdjson_inline base() : value{__m128i()} {} - - // Conversion from SIMD register - simdjson_inline base(const __m128i _value) : value(_value) {} - - // Conversion to SIMD register - simdjson_inline operator const __m128i&() const { return this->value; } - simdjson_inline operator __m128i&() { return this->value; } - - // Bit operations - simdjson_inline Child operator|(const Child other) const { return _mm_or_si128(*this, other); } - simdjson_inline Child operator&(const Child other) const { return _mm_and_si128(*this, other); } - simdjson_inline Child operator^(const Child other) const { return _mm_xor_si128(*this, other); } - simdjson_inline Child bit_andnot(const Child other) const { return _mm_andnot_si128(other, *this); } - simdjson_inline Child& operator|=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast | other; return *this_cast; } - simdjson_inline Child& operator&=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast & other; return *this_cast; } - simdjson_inline Child& operator^=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast ^ other; return *this_cast; } - }; - - template<typename T, typename Mask=simd8<bool>> - struct base8: base<simd8<T>> { - typedef uint16_t bitmask_t; - typedef uint32_t bitmask2_t; - - simdjson_inline base8() : base<simd8<T>>() {} - simdjson_inline base8(const __m128i _value) : base<simd8<T>>(_value) {} - - friend simdjson_inline Mask operator==(const simd8<T> lhs, const simd8<T> rhs) { return _mm_cmpeq_epi8(lhs, rhs); } - - static const int SIZE = sizeof(base<simd8<T>>::value); - - template<int N=1> - simdjson_inline simd8<T> prev(const simd8<T> prev_chunk) const { - return _mm_alignr_epi8(*this, prev_chunk, 16 - N); - } - }; - - // SIMD byte mask type (returned by things like eq and gt) - template<> - struct simd8<bool>: base8<bool> { - static simdjson_inline simd8<bool> splat(bool _value) { return _mm_set1_epi8(uint8_t(-(!!_value))); } - - simdjson_inline simd8() : base8() {} - simdjson_inline simd8(const __m128i _value) : base8<bool>(_value) {} - // Splat constructor - simdjson_inline simd8(bool _value) : base8<bool>(splat(_value)) {} - - simdjson_inline int to_bitmask() const { return _mm_movemask_epi8(*this); } - simdjson_inline bool any() const { return !_mm_testz_si128(*this, *this); } - simdjson_inline simd8<bool> operator~() const { return *this ^ true; } - }; - - template<typename T> - struct base8_numeric: base8<T> { - static simdjson_inline simd8<T> splat(T _value) { return _mm_set1_epi8(_value); } - static simdjson_inline simd8<T> zero() { return _mm_setzero_si128(); } - static simdjson_inline simd8<T> load(const T values[16]) { - return _mm_loadu_si128(reinterpret_cast<const __m128i *>(values)); - } - // Repeat 16 values as many times as necessary (usually for lookup tables) - static simdjson_inline simd8<T> repeat_16( - T v0, T v1, T v2, T v3, T v4, T v5, T v6, T v7, - T v8, T v9, T v10, T v11, T v12, T v13, T v14, T v15 - ) { - return simd8<T>( - v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15 - ); - } - - simdjson_inline base8_numeric() : base8<T>() {} - simdjson_inline base8_numeric(const __m128i _value) : base8<T>(_value) {} - - // Store to array - simdjson_inline void store(T dst[16]) const { return _mm_storeu_si128(reinterpret_cast<__m128i *>(dst), *this); } - // Override to distinguish from bool version simdjson_inline simd8<T> operator~() const { return *this ^ 0xFFu; } - // Addition/subtraction are the same for signed and unsigned - simdjson_inline simd8<T> operator+(const simd8<T> other) const { return _mm_add_epi8(*this, other); } - simdjson_inline simd8<T> operator-(const simd8<T> other) const { return _mm_sub_epi8(*this, other); } - simdjson_inline simd8<T>& operator+=(const simd8<T> other) { *this = *this + other; return *static_cast<simd8<T>*>(this); } - simdjson_inline simd8<T>& operator-=(const simd8<T> other) { *this = *this - other; return *static_cast<simd8<T>*>(this); } - // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values) template<typename L> simdjson_inline simd8<L> lookup_16(simd8<L> lookup_table) const { - return _mm_shuffle_epi8(lookup_table, *this); + return __lsx_vshuf_b(lookup_table, lookup_table, *this); } // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted as a bitset). // Passing a 0 value for mask would be equivalent to writing out every byte to output. // Only the first 16 - count_ones(mask) bytes of the result are significant but 16 bytes // get written. - // Design consideration: it seems like a function with the - // signature simd8<L> compress(uint32_t mask) would be - // sensible, but the AVX ISA makes this kind of approach difficult. template<typename L> simdjson_inline void compress(uint16_t mask, L * output) const { using internal::thintable_epi8; using internal::BitsSetTable256mul2; using internal::pshufb_combine_table; - // this particular implementation was inspired by work done by @animetosho - // we do it in two steps, first 8 bytes and then second 8 bytes + // this particular implementation was inspired by haswell + // lsx do it in 2 steps, first 8 bytes and then second 8 bytes... uint8_t mask1 = uint8_t(mask); // least significant 8 bits - uint8_t mask2 = uint8_t(mask >> 8); // most significant 8 bits + uint8_t mask2 = uint8_t(mask >> 8); // second least significant 8 bits // next line just loads the 64-bit values thintable_epi8[mask1] and - // thintable_epi8[mask2] into a 128-bit register, using only - // two instructions on most compilers. - __m128i shufmask = _mm_set_epi64x(thintable_epi8[mask2], thintable_epi8[mask1]); - // we increment by 0x08 the second half of the mask - shufmask = - _mm_add_epi8(shufmask, _mm_set_epi32(0x08080808, 0x08080808, 0, 0)); + // thintable_epi8[mask2] into a 128-bit register. + __m128i shufmask = {int64_t(thintable_epi8[mask1]), int64_t(thintable_epi8[mask2]) + 0x0808080808080808}; // this is the version "nearly pruned" - __m128i pruned = _mm_shuffle_epi8(*this, shufmask); - // we still need to put the two halves together. - // we compute the popcount of the first half: + __m128i pruned = __lsx_vshuf_b(*this, *this, shufmask); + // we still need to put the pieces back together. + // we compute the popcount of the first words: int pop1 = BitsSetTable256mul2[mask1]; - // then load the corresponding mask, what it does is to write - // only the first pop1 bytes from the first 8 bytes, and then - // it fills in with the bytes from the second 8 bytes + some filling - // at the end. - __m128i compactmask = - _mm_loadu_si128(reinterpret_cast<const __m128i *>(pshufb_combine_table + pop1 * 8)); - __m128i answer = _mm_shuffle_epi8(pruned, compactmask); - _mm_storeu_si128(reinterpret_cast<__m128i *>(output), answer); + // then load the corresponding mask + __m128i compactmask = __lsx_vldx(reinterpret_cast<void*>(reinterpret_cast<unsigned long>(pshufb_combine_table)), pop1 * 8); + __m128i answer = __lsx_vshuf_b(pruned, pruned, compactmask); + __lsx_vst(answer, reinterpret_cast<uint8_t*>(output), 0); } template<typename L> @@ -108910,15 +143675,15 @@ namespace simd { // Splat constructor simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {} // Array constructor - simdjson_inline simd8(const int8_t* values) : simd8(load(values)) {} + simdjson_inline simd8(const int8_t values[16]) : simd8(load(values)) {} // Member-by-member initialization simdjson_inline simd8( int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 - ) : simd8(_mm_setr_epi8( + ) : simd8({ v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,v11,v12,v13,v14,v15 - )) {} + }) {} // Repeat 16 values as many times as necessary (usually for lookup tables) simdjson_inline static simd8<int8_t> repeat_16( int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, @@ -108931,10 +143696,10 @@ namespace simd { } // Order-sensitive comparisons - simdjson_inline simd8<int8_t> max_val(const simd8<int8_t> other) const { return _mm_max_epi8(*this, other); } - simdjson_inline simd8<int8_t> min_val(const simd8<int8_t> other) const { return _mm_min_epi8(*this, other); } - simdjson_inline simd8<bool> operator>(const simd8<int8_t> other) const { return _mm_cmpgt_epi8(*this, other); } - simdjson_inline simd8<bool> operator<(const simd8<int8_t> other) const { return _mm_cmpgt_epi8(other, *this); } + simdjson_inline simd8<int8_t> max_val(const simd8<int8_t> other) const { return __lsx_vmax_b(*this, other); } + simdjson_inline simd8<int8_t> min_val(const simd8<int8_t> other) const { return __lsx_vmin_b(*this, other); } + simdjson_inline simd8<bool> operator>(const simd8<int8_t> other) const { return __lsx_vslt_b(other, *this); } + simdjson_inline simd8<bool> operator<(const simd8<int8_t> other) const { return __lsx_vslt_b(*this, other); } }; // Unsigned bytes @@ -108945,15 +143710,15 @@ namespace simd { // Splat constructor simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {} // Array constructor - simdjson_inline simd8(const uint8_t* values) : simd8(load(values)) {} + simdjson_inline simd8(const uint8_t values[16]) : simd8(load(values)) {} // Member-by-member initialization simdjson_inline simd8( uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 - ) : simd8(_mm_setr_epi8( + ) : simd8(__m128i(v16u8{ v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,v11,v12,v13,v14,v15 - )) {} + })) {} // Repeat 16 values as many times as necessary (usually for lookup tables) simdjson_inline static simd8<uint8_t> repeat_16( uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, @@ -108966,12 +143731,12 @@ namespace simd { } // Saturated math - simdjson_inline simd8<uint8_t> saturating_add(const simd8<uint8_t> other) const { return _mm_adds_epu8(*this, other); } - simdjson_inline simd8<uint8_t> saturating_sub(const simd8<uint8_t> other) const { return _mm_subs_epu8(*this, other); } + simdjson_inline simd8<uint8_t> saturating_add(const simd8<uint8_t> other) const { return __lsx_vsadd_bu(*this, other); } + simdjson_inline simd8<uint8_t> saturating_sub(const simd8<uint8_t> other) const { return __lsx_vssub_bu(*this, other); } // Order-specific operations - simdjson_inline simd8<uint8_t> max_val(const simd8<uint8_t> other) const { return _mm_max_epu8(*this, other); } - simdjson_inline simd8<uint8_t> min_val(const simd8<uint8_t> other) const { return _mm_min_epu8(*this, other); } + simdjson_inline simd8<uint8_t> max_val(const simd8<uint8_t> other) const { return __lsx_vmax_bu(*this, other); } + simdjson_inline simd8<uint8_t> min_val(const simd8<uint8_t> other) const { return __lsx_vmin_bu(other, *this); } // Same as >, but only guarantees true is nonzero (< guarantees true = -1) simdjson_inline simd8<uint8_t> gt_bits(const simd8<uint8_t> other) const { return this->saturating_sub(other); } // Same as <, but only guarantees true is nonzero (< guarantees true = -1) @@ -108979,33 +143744,32 @@ namespace simd { simdjson_inline simd8<bool> operator<=(const simd8<uint8_t> other) const { return other.max_val(*this) == other; } simdjson_inline simd8<bool> operator>=(const simd8<uint8_t> other) const { return other.min_val(*this) == other; } simdjson_inline simd8<bool> operator>(const simd8<uint8_t> other) const { return this->gt_bits(other).any_bits_set(); } - simdjson_inline simd8<bool> operator<(const simd8<uint8_t> other) const { return this->gt_bits(other).any_bits_set(); } + simdjson_inline simd8<bool> operator<(const simd8<uint8_t> other) const { return this->lt_bits(other).any_bits_set(); } // Bit-specific operations simdjson_inline simd8<bool> bits_not_set() const { return *this == uint8_t(0); } simdjson_inline simd8<bool> bits_not_set(simd8<uint8_t> bits) const { return (*this & bits).bits_not_set(); } simdjson_inline simd8<bool> any_bits_set() const { return ~this->bits_not_set(); } simdjson_inline simd8<bool> any_bits_set(simd8<uint8_t> bits) const { return ~this->bits_not_set(bits); } - simdjson_inline bool is_ascii() const { return _mm_movemask_epi8(*this) == 0; } - simdjson_inline bool bits_not_set_anywhere() const { return _mm_testz_si128(*this, *this); } + simdjson_inline bool is_ascii() const { return 0 == __lsx_vpickve2gr_w(__lsx_vmskltz_b(*this), 0); } + simdjson_inline bool bits_not_set_anywhere() const { return 0 == __lsx_vpickve2gr_hu(__lsx_vmsknz_b(*this), 0); } simdjson_inline bool any_bits_set_anywhere() const { return !bits_not_set_anywhere(); } - simdjson_inline bool bits_not_set_anywhere(simd8<uint8_t> bits) const { return _mm_testz_si128(*this, bits); } + simdjson_inline bool bits_not_set_anywhere(simd8<uint8_t> bits) const { + return 0 == __lsx_vpickve2gr_hu(__lsx_vmsknz_b(__lsx_vand_v(*this, bits)), 0); + } simdjson_inline bool any_bits_set_anywhere(simd8<uint8_t> bits) const { return !bits_not_set_anywhere(bits); } template<int N> - simdjson_inline simd8<uint8_t> shr() const { return simd8<uint8_t>(_mm_srli_epi16(*this, N)) & uint8_t(0xFFu >> N); } - template<int N> - simdjson_inline simd8<uint8_t> shl() const { return simd8<uint8_t>(_mm_slli_epi16(*this, N)) & uint8_t(0xFFu << N); } - // Get one of the bits and make a bitmask out of it. - // e.g. value.get_bit<7>() gets the high bit + simdjson_inline simd8<uint8_t> shr() const { return simd8<uint8_t>(__lsx_vsrli_b(*this, N)); } template<int N> - simdjson_inline int get_bit() const { return _mm_movemask_epi8(_mm_slli_epi16(*this, 7-N)); } + simdjson_inline simd8<uint8_t> shl() const { return simd8<uint8_t>(__lsx_vslli_b(*this, N)); } }; template<typename T> struct simd8x64 { static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<T>); - static_assert(NUM_CHUNKS == 4, "Westmere kernel should use four registers per 64-byte block."); + static_assert(NUM_CHUNKS == 4, "LSX kernel should use four registers per 64-byte block."); const simd8<T> chunks[NUM_CHUNKS]; + template<int idx> simd8<uint8_t> get() const { return idx < NUM_CHUNKS ? chunks[idx] : simd8<T>(); } simd8x64(const simd8x64<T>& o) = delete; // no copy allowed simd8x64<T>& operator=(const simd8<T>& other) = delete; // no assignment allowed @@ -109014,6 +143778,33 @@ namespace simd { simdjson_inline simd8x64(const simd8<T> chunk0, const simd8<T> chunk1, const simd8<T> chunk2, const simd8<T> chunk3) : chunks{chunk0, chunk1, chunk2, chunk3} {} simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8<T>::load(ptr), simd8<T>::load(ptr+16), simd8<T>::load(ptr+32), simd8<T>::load(ptr+48)} {} + simdjson_inline uint64_t compress(uint64_t mask, T * output) const { + uint16_t mask1 = uint16_t(mask); + uint16_t mask2 = uint16_t(mask >> 16); + uint16_t mask3 = uint16_t(mask >> 32); + uint16_t mask4 = uint16_t(mask >> 48); + __m128i zcnt = __lsx_vpcnt_h(__m128i(v2u64{~mask, 0})); + uint64_t zcnt1 = __lsx_vpickve2gr_hu(zcnt, 0); + uint64_t zcnt2 = __lsx_vpickve2gr_hu(zcnt, 1); + uint64_t zcnt3 = __lsx_vpickve2gr_hu(zcnt, 2); + uint64_t zcnt4 = __lsx_vpickve2gr_hu(zcnt, 3); + uint8_t *voutput = reinterpret_cast<uint8_t*>(output); + // There should be a critical value which processes in scaler is faster. + if (zcnt1) + this->chunks[0].compress(mask1, reinterpret_cast<T*>(voutput)); + voutput += zcnt1; + if (zcnt2) + this->chunks[1].compress(mask2, reinterpret_cast<T*>(voutput)); + voutput += zcnt2; + if (zcnt3) + this->chunks[2].compress(mask3, reinterpret_cast<T*>(voutput)); + voutput += zcnt3; + if (zcnt4) + this->chunks[3].compress(mask4, reinterpret_cast<T*>(voutput)); + voutput += zcnt4; + return reinterpret_cast<uint64_t>(voutput) - reinterpret_cast<uint64_t>(output); + } + simdjson_inline void store(T ptr[64]) const { this->chunks[0].store(ptr+sizeof(simd8<T>)*0); this->chunks[1].store(ptr+sizeof(simd8<T>)*1); @@ -109021,24 +143812,18 @@ namespace simd { this->chunks[3].store(ptr+sizeof(simd8<T>)*3); } - simdjson_inline simd8<T> reduce_or() const { - return (this->chunks[0] | this->chunks[1]) | (this->chunks[2] | this->chunks[3]); - } - - simdjson_inline uint64_t compress(uint64_t mask, T * output) const { - this->chunks[0].compress(uint16_t(mask), output); - this->chunks[1].compress(uint16_t(mask >> 16), output + 16 - count_ones(mask & 0xFFFF)); - this->chunks[2].compress(uint16_t(mask >> 32), output + 32 - count_ones(mask & 0xFFFFFFFF)); - this->chunks[3].compress(uint16_t(mask >> 48), output + 48 - count_ones(mask & 0xFFFFFFFFFFFF)); - return 64 - count_ones(mask); + simdjson_inline uint64_t to_bitmask() const { + __m128i mask1 = __lsx_vmskltz_b(this->chunks[0]); + __m128i mask2 = __lsx_vmskltz_b(this->chunks[1]); + __m128i mask3 = __lsx_vmskltz_b(this->chunks[2]); + __m128i mask4 = __lsx_vmskltz_b(this->chunks[3]); + mask1 = __lsx_vilvl_h(mask2, mask1); + mask2 = __lsx_vilvl_h(mask4, mask3); + return __lsx_vpickve2gr_du(__lsx_vilvl_w(mask2, mask1), 0); } - simdjson_inline uint64_t to_bitmask() const { - uint64_t r0 = uint32_t(this->chunks[0].to_bitmask() ); - uint64_t r1 = this->chunks[1].to_bitmask() ; - uint64_t r2 = this->chunks[2].to_bitmask() ; - uint64_t r3 = this->chunks[3].to_bitmask() ; - return r0 | (r1 << 16) | (r2 << 32) | (r3 << 48); + simdjson_inline simd8<T> reduce_or() const { + return (this->chunks[0] | this->chunks[1]) | (this->chunks[2] | this->chunks[3]); } simdjson_inline uint64_t eq(const T m) const { @@ -109073,14 +143858,24 @@ namespace simd { } // namespace simd } // unnamed namespace -} // namespace westmere +} // namespace lsx } // namespace simdjson -#endif // SIMDJSON_WESTMERE_SIMD_INPUT_H -/* end file simdjson/westmere/simd.h */ +#endif // SIMDJSON_LSX_SIMD_H +/* end file simdjson/lsx/simd.h */ +/* including simdjson/lsx/stringparsing_defs.h: #include "simdjson/lsx/stringparsing_defs.h" */ +/* begin file simdjson/lsx/stringparsing_defs.h */ +#ifndef SIMDJSON_LSX_STRINGPARSING_DEFS_H +#define SIMDJSON_LSX_STRINGPARSING_DEFS_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/simd.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace westmere { +namespace lsx { namespace { using namespace simd; @@ -109105,9 +143900,12 @@ simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uin // SIMDJSON_PADDING of padding static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "backslash and quote finder must process fewer than SIMDJSON_PADDING bytes"); simd8<uint8_t> v0(src); - simd8<uint8_t> v1(src + 16); + simd8<uint8_t> v1(src + sizeof(v0)); v0.store(dst); - v1.store(dst + 16); + v1.store(dst + sizeof(v0)); + + // Getting a 64-bit bitmask is much cheaper than multiple 16-bit bitmasks on LSX; therefore, we + // smash them together into a 64-byte mask and get the bitmask from there. uint64_t bs_and_quote = simd8x64<bool>(v0 == '\\', v1 == '\\', v0 == '"', v1 == '"').to_bitmask(); return { uint32_t(bs_and_quote), // bs_bits @@ -109136,26 +143934,28 @@ simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *ds simd8<bool> is_backslash = (v == '\\'); simd8<bool> is_control = (v < 32); return { - uint64_t((is_backslash | is_quote | is_control).to_bitmask()) + static_cast<uint64_t>((is_backslash | is_quote | is_control).to_bitmask()) }; } } // unnamed namespace -} // namespace westmere +} // namespace lsx } // namespace simdjson -#endif // SIMDJSON_WESTMERE_STRINGPARSING_DEFS_H -/* end file simdjson/westmere/stringparsing_defs.h */ -/* end file simdjson/westmere/begin.h */ -/* including simdjson/generic/ondemand/amalgamated.h for westmere: #include "simdjson/generic/ondemand/amalgamated.h" */ -/* begin file simdjson/generic/ondemand/amalgamated.h for westmere */ -#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_ONDEMAND_DEPENDENCIES_H) +#endif // SIMDJSON_LSX_STRINGPARSING_DEFS_H +/* end file simdjson/lsx/stringparsing_defs.h */ + +#define SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT 1 +/* end file simdjson/lsx/begin.h */ +/* including simdjson/generic/ondemand/amalgamated.h for lsx: #include "simdjson/generic/ondemand/amalgamated.h" */ +/* begin file simdjson/generic/ondemand/amalgamated.h for lsx */ +#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_BUILDER_DEPENDENCIES_H) #error simdjson/generic/ondemand/dependencies.h must be included before simdjson/generic/ondemand/amalgamated.h! #endif // Stuff other things depend on -/* including simdjson/generic/ondemand/base.h for westmere: #include "simdjson/generic/ondemand/base.h" */ -/* begin file simdjson/generic/ondemand/base.h for westmere */ +/* including simdjson/generic/ondemand/base.h for lsx: #include "simdjson/generic/ondemand/base.h" */ +/* begin file simdjson/generic/ondemand/base.h for lsx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_BASE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -109164,7 +143964,7 @@ simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *ds /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace westmere { +namespace lsx { /** * A fast, simple, DOM-like interface that parses JSON as you use it. * @@ -109175,8 +143975,8 @@ namespace ondemand { /** Represents the depth of a JSON value (number of nested arrays/objects). */ using depth_t = int32_t; -/** @copydoc simdjson::westmere::number_type */ -using number_type = simdjson::westmere::number_type; +/** @copydoc simdjson::lsx::number_type */ +using number_type = simdjson::lsx::number_type; /** @private Position in the JSON buffer indexes */ using token_position = const uint32_t *; @@ -109199,13 +143999,13 @@ class value; class value_iterator; } // namespace ondemand -} // namespace westmere +} // namespace lsx } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_BASE_H -/* end file simdjson/generic/ondemand/base.h for westmere */ -/* including simdjson/generic/ondemand/deserialize.h for westmere: #include "simdjson/generic/ondemand/deserialize.h" */ -/* begin file simdjson/generic/ondemand/deserialize.h for westmere */ +/* end file simdjson/generic/ondemand/base.h for lsx */ +/* including simdjson/generic/ondemand/deserialize.h for lsx: #include "simdjson/generic/ondemand/deserialize.h" */ +/* begin file simdjson/generic/ondemand/deserialize.h for lsx */ #if SIMDJSON_SUPPORTS_CONCEPTS #ifndef SIMDJSON_ONDEMAND_DESERIALIZE_H @@ -109225,35 +144025,35 @@ template <> struct is_builtin_deserializable<int64_t> : std::true_type {}; template <> struct is_builtin_deserializable<uint64_t> : std::true_type {}; template <> struct is_builtin_deserializable<double> : std::true_type {}; template <> struct is_builtin_deserializable<bool> : std::true_type {}; -template <> struct is_builtin_deserializable<westmere::ondemand::array> : std::true_type {}; -template <> struct is_builtin_deserializable<westmere::ondemand::object> : std::true_type {}; -template <> struct is_builtin_deserializable<westmere::ondemand::value> : std::true_type {}; -template <> struct is_builtin_deserializable<westmere::ondemand::raw_json_string> : std::true_type {}; +template <> struct is_builtin_deserializable<lsx::ondemand::array> : std::true_type {}; +template <> struct is_builtin_deserializable<lsx::ondemand::object> : std::true_type {}; +template <> struct is_builtin_deserializable<lsx::ondemand::value> : std::true_type {}; +template <> struct is_builtin_deserializable<lsx::ondemand::raw_json_string> : std::true_type {}; template <> struct is_builtin_deserializable<std::string_view> : std::true_type {}; template <typename T> concept is_builtin_deserializable_v = is_builtin_deserializable<T>::value; -template <typename T, typename ValT = westmere::ondemand::value> +template <typename T, typename ValT = lsx::ondemand::value> concept custom_deserializable = tag_invocable<deserialize_tag, ValT&, T&>; -template <typename T, typename ValT = westmere::ondemand::value> +template <typename T, typename ValT = lsx::ondemand::value> concept deserializable = custom_deserializable<T, ValT> || is_builtin_deserializable_v<T> || concepts::optional_type<T>; -template <typename T, typename ValT = westmere::ondemand::value> +template <typename T, typename ValT = lsx::ondemand::value> concept nothrow_custom_deserializable = nothrow_tag_invocable<deserialize_tag, ValT&, T&>; // built-in types are noexcept and if an error happens, the value simply gets ignored and the error is returned. -template <typename T, typename ValT = westmere::ondemand::value> +template <typename T, typename ValT = lsx::ondemand::value> concept nothrow_deserializable = nothrow_custom_deserializable<T, ValT> || is_builtin_deserializable_v<T>; /// Deserialize Tag inline constexpr struct deserialize_tag { - using array_type = westmere::ondemand::array; - using object_type = westmere::ondemand::object; - using value_type = westmere::ondemand::value; - using document_type = westmere::ondemand::document; - using document_reference_type = westmere::ondemand::document_reference; + using array_type = lsx::ondemand::array; + using object_type = lsx::ondemand::object; + using value_type = lsx::ondemand::value; + using document_type = lsx::ondemand::document; + using document_reference_type = lsx::ondemand::document_reference; // Customization Point for array template <typename T> @@ -109298,9 +144098,9 @@ inline constexpr struct deserialize_tag { #endif // SIMDJSON_ONDEMAND_DESERIALIZE_H #endif // SIMDJSON_SUPPORTS_CONCEPTS -/* end file simdjson/generic/ondemand/deserialize.h for westmere */ -/* including simdjson/generic/ondemand/value_iterator.h for westmere: #include "simdjson/generic/ondemand/value_iterator.h" */ -/* begin file simdjson/generic/ondemand/value_iterator.h for westmere */ +/* end file simdjson/generic/ondemand/deserialize.h for lsx */ +/* including simdjson/generic/ondemand/value_iterator.h for lsx: #include "simdjson/generic/ondemand/value_iterator.h" */ +/* begin file simdjson/generic/ondemand/value_iterator.h for lsx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -109310,7 +144110,7 @@ inline constexpr struct deserialize_tag { /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace westmere { +namespace lsx { namespace ondemand { /** @@ -109775,21 +144575,22 @@ class value_iterator { friend class document; friend class object; + friend class object_iterator; friend class array; friend class value; friend class field; }; // value_iterator } // namespace ondemand -} // namespace westmere +} // namespace lsx } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<westmere::ondemand::value_iterator> : public westmere::implementation_simdjson_result_base<westmere::ondemand::value_iterator> { +struct simdjson_result<lsx::ondemand::value_iterator> : public lsx::implementation_simdjson_result_base<lsx::ondemand::value_iterator> { public: - simdjson_inline simdjson_result(westmere::ondemand::value_iterator &&value) noexcept; ///< @private + simdjson_inline simdjson_result(lsx::ondemand::value_iterator &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; }; @@ -109797,9 +144598,9 @@ struct simdjson_result<westmere::ondemand::value_iterator> : public westmere::im } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_H -/* end file simdjson/generic/ondemand/value_iterator.h for westmere */ -/* including simdjson/generic/ondemand/value.h for westmere: #include "simdjson/generic/ondemand/value.h" */ -/* begin file simdjson/generic/ondemand/value.h for westmere */ +/* end file simdjson/generic/ondemand/value_iterator.h for lsx */ +/* including simdjson/generic/ondemand/value.h for lsx: #include "simdjson/generic/ondemand/value.h" */ +/* begin file simdjson/generic/ondemand/value.h for lsx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -109815,7 +144616,7 @@ struct simdjson_result<westmere::ondemand::value_iterator> : public westmere::im namespace simdjson { -namespace westmere { +namespace lsx { namespace ondemand { /** * An ephemeral JSON value returned during iteration. It is only valid for as long as you do @@ -110529,20 +145330,20 @@ class value { }; } // namespace ondemand -} // namespace westmere +} // namespace lsx } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<westmere::ondemand::value> : public westmere::implementation_simdjson_result_base<westmere::ondemand::value> { +struct simdjson_result<lsx::ondemand::value> : public lsx::implementation_simdjson_result_base<lsx::ondemand::value> { public: - simdjson_inline simdjson_result(westmere::ondemand::value &&value) noexcept; ///< @private + simdjson_inline simdjson_result(lsx::ondemand::value &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; - simdjson_inline simdjson_result<westmere::ondemand::array> get_array() noexcept; - simdjson_inline simdjson_result<westmere::ondemand::object> get_object() noexcept; + simdjson_inline simdjson_result<lsx::ondemand::array> get_array() noexcept; + simdjson_inline simdjson_result<lsx::ondemand::object> get_object() noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64() noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64_in_string() noexcept; @@ -110554,7 +145355,7 @@ struct simdjson_result<westmere::ondemand::value> : public westmere::implementat template <typename string_type> simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result<std::string_view> get_wobbly_string() noexcept; - simdjson_inline simdjson_result<westmere::ondemand::raw_json_string> get_raw_json_string() noexcept; + simdjson_inline simdjson_result<lsx::ondemand::raw_json_string> get_raw_json_string() noexcept; simdjson_inline simdjson_result<bool> get_bool() noexcept; simdjson_inline simdjson_result<bool> is_null() noexcept; @@ -110565,20 +145366,20 @@ struct simdjson_result<westmere::ondemand::value> : public westmere::implementat #if SIMDJSON_EXCEPTIONS template <class T> explicit simdjson_inline operator T() noexcept(false); - simdjson_inline operator westmere::ondemand::array() noexcept(false); - simdjson_inline operator westmere::ondemand::object() noexcept(false); + simdjson_inline operator lsx::ondemand::array() noexcept(false); + simdjson_inline operator lsx::ondemand::object() noexcept(false); simdjson_inline operator uint64_t() noexcept(false); simdjson_inline operator int64_t() noexcept(false); simdjson_inline operator double() noexcept(false); simdjson_inline operator std::string_view() noexcept(false); - simdjson_inline operator westmere::ondemand::raw_json_string() noexcept(false); + simdjson_inline operator lsx::ondemand::raw_json_string() noexcept(false); simdjson_inline operator bool() noexcept(false); #endif simdjson_inline simdjson_result<size_t> count_elements() & noexcept; simdjson_inline simdjson_result<size_t> count_fields() & noexcept; - simdjson_inline simdjson_result<westmere::ondemand::value> at(size_t index) noexcept; - simdjson_inline simdjson_result<westmere::ondemand::array_iterator> begin() & noexcept; - simdjson_inline simdjson_result<westmere::ondemand::array_iterator> end() & noexcept; + simdjson_inline simdjson_result<lsx::ondemand::value> at(size_t index) noexcept; + simdjson_inline simdjson_result<lsx::ondemand::array_iterator> begin() & noexcept; + simdjson_inline simdjson_result<lsx::ondemand::array_iterator> end() & noexcept; /** * Look up a field by name on an object (order-sensitive). By order-sensitive, we mean that @@ -110602,9 +145403,9 @@ struct simdjson_result<westmere::ondemand::value> : public westmere::implementat * @param key The key to look up. * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object. */ - simdjson_inline simdjson_result<westmere::ondemand::value> find_field(std::string_view key) noexcept; - /** @overload simdjson_inline simdjson_result<westmere::ondemand::value> find_field(std::string_view key) noexcept; */ - simdjson_inline simdjson_result<westmere::ondemand::value> find_field(const char *key) noexcept; + simdjson_inline simdjson_result<lsx::ondemand::value> find_field(std::string_view key) noexcept; + /** @overload simdjson_inline simdjson_result<lsx::ondemand::value> find_field(std::string_view key) noexcept; */ + simdjson_inline simdjson_result<lsx::ondemand::value> find_field(const char *key) noexcept; /** * Look up a field by name on an object, without regard to key order. @@ -110616,7 +145417,7 @@ struct simdjson_result<westmere::ondemand::value> : public westmere::implementat * in question is large. The fact that the extra code is there also bumps the executable size. * * We default operator[] on find_field_unordered() for convenience. - * It is the defaul because it would be highly surprising (and hard to debug) if the + * It is the default because it would be highly surprising (and hard to debug) if the * default behavior failed to look up a field just because it was in the wrong order--and many * APIs assume this. Therefore, you must be explicit if you want to treat objects as out of order. * @@ -110626,14 +145427,14 @@ struct simdjson_result<westmere::ondemand::value> : public westmere::implementat * @param key The key to look up. * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object. */ - simdjson_inline simdjson_result<westmere::ondemand::value> find_field_unordered(std::string_view key) noexcept; - /** @overload simdjson_inline simdjson_result<westmere::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ - simdjson_inline simdjson_result<westmere::ondemand::value> find_field_unordered(const char *key) noexcept; - /** @overload simdjson_inline simdjson_result<westmere::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ - simdjson_inline simdjson_result<westmere::ondemand::value> operator[](std::string_view key) noexcept; - /** @overload simdjson_inline simdjson_result<westmere::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ - simdjson_inline simdjson_result<westmere::ondemand::value> operator[](const char *key) noexcept; - simdjson_result<westmere::ondemand::value> operator[](int) noexcept = delete; + simdjson_inline simdjson_result<lsx::ondemand::value> find_field_unordered(std::string_view key) noexcept; + /** @overload simdjson_inline simdjson_result<lsx::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ + simdjson_inline simdjson_result<lsx::ondemand::value> find_field_unordered(const char *key) noexcept; + /** @overload simdjson_inline simdjson_result<lsx::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ + simdjson_inline simdjson_result<lsx::ondemand::value> operator[](std::string_view key) noexcept; + /** @overload simdjson_inline simdjson_result<lsx::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ + simdjson_inline simdjson_result<lsx::ondemand::value> operator[](const char *key) noexcept; + simdjson_result<lsx::ondemand::value> operator[](int) noexcept = delete; /** * Get the type of this JSON value. It does not validate or consume the value. @@ -110657,13 +145458,13 @@ struct simdjson_result<westmere::ondemand::value> : public westmere::implementat * better to just call .get_double, .get_string, etc. and check for INCORRECT_TYPE (or just * let it throw an exception). */ - simdjson_inline simdjson_result<westmere::ondemand::json_type> type() noexcept; + simdjson_inline simdjson_result<lsx::ondemand::json_type> type() noexcept; simdjson_inline simdjson_result<bool> is_scalar() noexcept; simdjson_inline simdjson_result<bool> is_string() noexcept; simdjson_inline simdjson_result<bool> is_negative() noexcept; simdjson_inline simdjson_result<bool> is_integer() noexcept; - simdjson_inline simdjson_result<westmere::number_type> get_number_type() noexcept; - simdjson_inline simdjson_result<westmere::ondemand::number> get_number() noexcept; + simdjson_inline simdjson_result<lsx::number_type> get_number_type() noexcept; + simdjson_inline simdjson_result<lsx::ondemand::number> get_number() noexcept; /** @copydoc simdjson_inline std::string_view value::raw_json_token() const noexcept */ simdjson_inline simdjson_result<std::string_view> raw_json_token() noexcept; @@ -110673,17 +145474,17 @@ struct simdjson_result<westmere::ondemand::value> : public westmere::implementat simdjson_inline simdjson_result<const char *> current_location() noexcept; /** @copydoc simdjson_inline int32_t current_depth() const noexcept */ simdjson_inline simdjson_result<int32_t> current_depth() const noexcept; - simdjson_inline simdjson_result<westmere::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result<westmere::ondemand::value> at_path(std::string_view json_path) noexcept; - simdjson_inline simdjson_result<std::vector<westmere::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<lsx::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result<lsx::ondemand::value> at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<std::vector<lsx::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; }; } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_H -/* end file simdjson/generic/ondemand/value.h for westmere */ -/* including simdjson/generic/ondemand/logger.h for westmere: #include "simdjson/generic/ondemand/logger.h" */ -/* begin file simdjson/generic/ondemand/logger.h for westmere */ +/* end file simdjson/generic/ondemand/value.h for lsx */ +/* including simdjson/generic/ondemand/logger.h for lsx: #include "simdjson/generic/ondemand/logger.h" */ +/* begin file simdjson/generic/ondemand/logger.h for lsx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_LOGGER_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -110692,7 +145493,7 @@ struct simdjson_result<westmere::ondemand::value> : public westmere::implementat /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace westmere { +namespace lsx { namespace ondemand { // Logging should be free unless SIMDJSON_VERBOSE_LOGGING is set. Importantly, it is critical @@ -110738,13 +145539,13 @@ static inline void log_error(const value_iterator &iter, const char *error, cons } // namespace logger } // namespace ondemand -} // namespace westmere +} // namespace lsx } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_LOGGER_H -/* end file simdjson/generic/ondemand/logger.h for westmere */ -/* including simdjson/generic/ondemand/token_iterator.h for westmere: #include "simdjson/generic/ondemand/token_iterator.h" */ -/* begin file simdjson/generic/ondemand/token_iterator.h for westmere */ +/* end file simdjson/generic/ondemand/logger.h for lsx */ +/* including simdjson/generic/ondemand/token_iterator.h for lsx: #include "simdjson/generic/ondemand/token_iterator.h" */ +/* begin file simdjson/generic/ondemand/token_iterator.h for lsx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -110755,7 +145556,7 @@ static inline void log_error(const value_iterator &iter, const char *error, cons /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace westmere { +namespace lsx { namespace ondemand { /** @@ -110886,15 +145687,15 @@ class token_iterator { }; } // namespace ondemand -} // namespace westmere +} // namespace lsx } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<westmere::ondemand::token_iterator> : public westmere::implementation_simdjson_result_base<westmere::ondemand::token_iterator> { +struct simdjson_result<lsx::ondemand::token_iterator> : public lsx::implementation_simdjson_result_base<lsx::ondemand::token_iterator> { public: - simdjson_inline simdjson_result(westmere::ondemand::token_iterator &&value) noexcept; ///< @private + simdjson_inline simdjson_result(lsx::ondemand::token_iterator &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; simdjson_inline ~simdjson_result() noexcept = default; ///< @private @@ -110903,9 +145704,9 @@ struct simdjson_result<westmere::ondemand::token_iterator> : public westmere::im } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_H -/* end file simdjson/generic/ondemand/token_iterator.h for westmere */ -/* including simdjson/generic/ondemand/json_iterator.h for westmere: #include "simdjson/generic/ondemand/json_iterator.h" */ -/* begin file simdjson/generic/ondemand/json_iterator.h for westmere */ +/* end file simdjson/generic/ondemand/token_iterator.h for lsx */ +/* including simdjson/generic/ondemand/json_iterator.h for lsx: #include "simdjson/generic/ondemand/json_iterator.h" */ +/* begin file simdjson/generic/ondemand/json_iterator.h for lsx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -110916,7 +145717,7 @@ struct simdjson_result<westmere::ondemand::token_iterator> : public westmere::im /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace westmere { +namespace lsx { namespace ondemand { /** @@ -111227,15 +146028,15 @@ class json_iterator { }; // json_iterator } // namespace ondemand -} // namespace westmere +} // namespace lsx } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<westmere::ondemand::json_iterator> : public westmere::implementation_simdjson_result_base<westmere::ondemand::json_iterator> { +struct simdjson_result<lsx::ondemand::json_iterator> : public lsx::implementation_simdjson_result_base<lsx::ondemand::json_iterator> { public: - simdjson_inline simdjson_result(westmere::ondemand::json_iterator &&value) noexcept; ///< @private + simdjson_inline simdjson_result(lsx::ondemand::json_iterator &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; @@ -111244,9 +146045,9 @@ struct simdjson_result<westmere::ondemand::json_iterator> : public westmere::imp } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_H -/* end file simdjson/generic/ondemand/json_iterator.h for westmere */ -/* including simdjson/generic/ondemand/json_type.h for westmere: #include "simdjson/generic/ondemand/json_type.h" */ -/* begin file simdjson/generic/ondemand/json_type.h for westmere */ +/* end file simdjson/generic/ondemand/json_iterator.h for lsx */ +/* including simdjson/generic/ondemand/json_type.h for lsx: #include "simdjson/generic/ondemand/json_type.h" */ +/* begin file simdjson/generic/ondemand/json_type.h for lsx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -111257,7 +146058,7 @@ struct simdjson_result<westmere::ondemand::json_iterator> : public westmere::imp /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace westmere { +namespace lsx { namespace ondemand { /** @@ -111391,15 +146192,15 @@ inline std::ostream& operator<<(std::ostream& out, simdjson_result<json_type> &t #endif } // namespace ondemand -} // namespace westmere +} // namespace lsx } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<westmere::ondemand::json_type> : public westmere::implementation_simdjson_result_base<westmere::ondemand::json_type> { +struct simdjson_result<lsx::ondemand::json_type> : public lsx::implementation_simdjson_result_base<lsx::ondemand::json_type> { public: - simdjson_inline simdjson_result(westmere::ondemand::json_type &&value) noexcept; ///< @private + simdjson_inline simdjson_result(lsx::ondemand::json_type &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; simdjson_inline ~simdjson_result() noexcept = default; ///< @private @@ -111408,9 +146209,9 @@ struct simdjson_result<westmere::ondemand::json_type> : public westmere::impleme } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_H -/* end file simdjson/generic/ondemand/json_type.h for westmere */ -/* including simdjson/generic/ondemand/raw_json_string.h for westmere: #include "simdjson/generic/ondemand/raw_json_string.h" */ -/* begin file simdjson/generic/ondemand/raw_json_string.h for westmere */ +/* end file simdjson/generic/ondemand/json_type.h for lsx */ +/* including simdjson/generic/ondemand/raw_json_string.h for lsx: #include "simdjson/generic/ondemand/raw_json_string.h" */ +/* begin file simdjson/generic/ondemand/raw_json_string.h for lsx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -111420,7 +146221,7 @@ struct simdjson_result<westmere::ondemand::json_type> : public westmere::impleme /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace westmere { +namespace lsx { namespace ondemand { /** @@ -111602,30 +146403,30 @@ simdjson_unused simdjson_inline bool operator!=(std::string_view c, const raw_js } // namespace ondemand -} // namespace westmere +} // namespace lsx } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<westmere::ondemand::raw_json_string> : public westmere::implementation_simdjson_result_base<westmere::ondemand::raw_json_string> { +struct simdjson_result<lsx::ondemand::raw_json_string> : public lsx::implementation_simdjson_result_base<lsx::ondemand::raw_json_string> { public: - simdjson_inline simdjson_result(westmere::ondemand::raw_json_string &&value) noexcept; ///< @private + simdjson_inline simdjson_result(lsx::ondemand::raw_json_string &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; simdjson_inline ~simdjson_result() noexcept = default; ///< @private simdjson_inline simdjson_result<const char *> raw() const noexcept; simdjson_inline char operator[](size_t) const noexcept; - simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> unescape(westmere::ondemand::json_iterator &iter, bool allow_replacement) const noexcept; - simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> unescape_wobbly(westmere::ondemand::json_iterator &iter) const noexcept; + simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> unescape(lsx::ondemand::json_iterator &iter, bool allow_replacement) const noexcept; + simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> unescape_wobbly(lsx::ondemand::json_iterator &iter) const noexcept; }; } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_H -/* end file simdjson/generic/ondemand/raw_json_string.h for westmere */ -/* including simdjson/generic/ondemand/parser.h for westmere: #include "simdjson/generic/ondemand/parser.h" */ -/* begin file simdjson/generic/ondemand/parser.h for westmere */ +/* end file simdjson/generic/ondemand/raw_json_string.h for lsx */ +/* including simdjson/generic/ondemand/parser.h for lsx: #include "simdjson/generic/ondemand/parser.h" */ +/* begin file simdjson/generic/ondemand/parser.h for lsx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_PARSER_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -111638,7 +146439,7 @@ struct simdjson_result<westmere::ondemand::raw_json_string> : public westmere::i #include <thread> namespace simdjson { -namespace westmere { +namespace lsx { namespace ondemand { /** @@ -112038,15 +146839,15 @@ class parser { }; } // namespace ondemand -} // namespace westmere +} // namespace lsx } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<westmere::ondemand::parser> : public westmere::implementation_simdjson_result_base<westmere::ondemand::parser> { +struct simdjson_result<lsx::ondemand::parser> : public lsx::implementation_simdjson_result_base<lsx::ondemand::parser> { public: - simdjson_inline simdjson_result(westmere::ondemand::parser &&value) noexcept; ///< @private + simdjson_inline simdjson_result(lsx::ondemand::parser &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; }; @@ -112054,319 +146855,11 @@ struct simdjson_result<westmere::ondemand::parser> : public westmere::implementa } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_PARSER_H -/* end file simdjson/generic/ondemand/parser.h for westmere */ - -// JSON builder - needed for extract_into functionality -/* including simdjson/generic/ondemand/json_string_builder.h for westmere: #include "simdjson/generic/ondemand/json_string_builder.h" */ -/* begin file simdjson/generic/ondemand/json_string_builder.h for westmere */ -/** - * This file is part of the builder API. It is temporarily in the ondemand directory - * but we will move it to a builder directory later. - */ -#ifndef SIMDJSON_GENERIC_STRING_BUILDER_H - -/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_H */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */ -/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ - -namespace simdjson { - - -#if SIMDJSON_SUPPORTS_CONCEPTS - -namespace westmere { -namespace builder { - class string_builder; -}} - -template <typename T, typename = void> -struct has_custom_serialization : std::false_type {}; - -inline constexpr struct serialize_tag { - template <typename T> - constexpr void operator()(westmere::builder::string_builder& b, T&& obj) const{ - return tag_invoke(*this, b, std::forward<T>(obj)); - } - - -} serialize{}; -template <typename T> -struct has_custom_serialization<T, std::void_t< - decltype(tag_invoke(serialize, std::declval<westmere::builder::string_builder&>(), std::declval<T&>())) ->> : std::true_type {}; - -template <typename T> -constexpr bool require_custom_serialization = has_custom_serialization<T>::value; -#else -struct has_custom_serialization : std::false_type {}; -#endif // SIMDJSON_SUPPORTS_CONCEPTS - -namespace westmere { -namespace builder { -/** - * A builder for JSON strings representing documents. This is a low-level - * builder that is not meant to be used directly by end-users. Though it - * supports atomic types (Booleans, strings), it does not support composed - * types (arrays and objects). - * - * Ultimately, this class can support kernel-specific optimizations. E.g., - * it may make use of SIMD instructions to escape strings faster. - */ -class string_builder { -public: - simdjson_inline string_builder(size_t initial_capacity = DEFAULT_INITIAL_CAPACITY); - - static constexpr size_t DEFAULT_INITIAL_CAPACITY = 1024; - - /** - * Append number (includes Booleans). Booleans are mapped to the strings - * false and true. Numbers are converted to strings abiding by the JSON standard. - * Floating-point numbers are converted to the shortest string that 'correctly' - * represents the number. - */ - template<typename number_type, - typename = typename std::enable_if<std::is_arithmetic<number_type>::value>::type> - simdjson_inline void append(number_type v) noexcept; - - /** - * Append character c. - */ - simdjson_inline void append(char c) noexcept; - - /** - * Append the string 'null'. - */ - simdjson_inline void append_null() noexcept; - - /** - * Clear the content. - */ - simdjson_inline void clear() noexcept; - - /** - * Append the std::string_view, after escaping it. - * There is no UTF-8 validation. - */ - simdjson_inline void escape_and_append(std::string_view input) noexcept; - - /** - * Append the std::string_view surrounded by double quotes, after escaping it. - * There is no UTF-8 validation. - */ - simdjson_inline void escape_and_append_with_quotes(std::string_view input) noexcept; -#if SIMDJSON_SUPPORTS_CONCEPTS - template<constevalutil::fixed_string key> - simdjson_inline void escape_and_append_with_quotes() noexcept; -#endif - /** - * Append the character surrounded by double quotes, after escaping it. - * There is no UTF-8 validation. - */ - simdjson_inline void escape_and_append_with_quotes(char input) noexcept; - - /** - * Append the character surrounded by double quotes, after escaping it. - * There is no UTF-8 validation. - */ - simdjson_inline void escape_and_append_with_quotes(const char* input) noexcept; - - /** - * Append the C string directly, without escaping. - * There is no UTF-8 validation. - */ - simdjson_inline void append_raw(const char *c) noexcept; - - /** - * Append "{" to the buffer. - */ - simdjson_inline void start_object() noexcept; - - /** - * Append "}" to the buffer. - */ - simdjson_inline void end_object() noexcept; - - /** - * Append "[" to the buffer. - */ - simdjson_inline void start_array() noexcept; - - /** - * Append "]" to the buffer. - */ - simdjson_inline void end_array() noexcept; - - /** - * Append "," to the buffer. - */ - simdjson_inline void append_comma() noexcept; - - /** - * Append ":" to the buffer. - */ - simdjson_inline void append_colon() noexcept; - - /** - * Append a key-value pair to the buffer. - * The key is escaped and surrounded by double quotes. - * The value is escaped if it is a string. - */ - template<typename key_type, typename value_type> - simdjson_inline void append_key_value(key_type key, value_type value) noexcept; -#if SIMDJSON_SUPPORTS_CONCEPTS - template<constevalutil::fixed_string key, typename value_type> - simdjson_inline void append_key_value(value_type value) noexcept; - - // Support for optional types (std::optional, etc.) - template <concepts::optional_type T> - requires(!require_custom_serialization<T>) - simdjson_inline void append(const T &opt); - - template <typename T> - requires(require_custom_serialization<T>) - simdjson_inline void append(T &&val); - - // Support for string-like types - template <typename T> - requires(std::is_convertible<T, std::string_view>::value || - std::is_same<T, const char*>::value ) - simdjson_inline void append(const T &value); -#endif -#if SIMDJSON_SUPPORTS_RANGES && SIMDJSON_SUPPORTS_CONCEPTS - // Support for range-based appending (std::ranges::view, etc.) - template <std::ranges::range R> -requires (!std::is_convertible<R, std::string_view>::value && !require_custom_serialization<R>) - simdjson_inline void append(const R &range) noexcept; -#endif - /** - * Append the std::string_view directly, without escaping. - * There is no UTF-8 validation. - */ - simdjson_inline void append_raw(std::string_view input) noexcept; - - /** - * Append len characters from str. - * There is no UTF-8 validation. - */ - simdjson_inline void append_raw(const char *str, size_t len) noexcept; -#if SIMDJSON_EXCEPTIONS - /** - * Creates an std::string from the written JSON buffer. - * Throws if memory allocation failed - * - * The result may not be valid UTF-8 if some of your content was not valid UTF-8. - * Use validate_unicode() to check the content if needed. - */ - simdjson_inline operator std::string() const noexcept(false); - - /** - * Creates an std::string_view from the written JSON buffer. - * Throws if memory allocation failed. - * - * The result may not be valid UTF-8 if some of your content was not valid UTF-8. - * Use validate_unicode() to check the content if needed. - */ - simdjson_inline operator std::string_view() const noexcept(false) simdjson_lifetime_bound; -#endif - - /** - * Returns a view on the written JSON buffer. Returns an error - * if memory allocation failed. - * - * The result may not be valid UTF-8 if some of your content was not valid UTF-8. - * Use validate_unicode() to check the content. - */ - simdjson_inline simdjson_result<std::string_view> view() const noexcept; - - /** - * Appends the null character to the buffer and returns - * a pointer to the beginning of the written JSON buffer. - * Returns an error if memory allocation failed. - * The result is null-terminated. - * - * The result may not be valid UTF-8 if some of your content was not valid UTF-8. - * Use validate_unicode() to check the content. - */ - simdjson_inline simdjson_result<const char *> c_str() noexcept; - - /** - * Return true if the content is valid UTF-8. - */ - simdjson_inline bool validate_unicode() const noexcept; - - /** - * Returns the current size of the written JSON buffer. - * If an error occurred, returns 0. - */ - simdjson_inline size_t size() const noexcept; - -private: - /** - * Returns true if we can write at least upcoming_bytes bytes. - * The underlying buffer is reallocated if needed. It is designed - * to be called before writing to the buffer. It should be fast. - */ - simdjson_inline bool capacity_check(size_t upcoming_bytes); - - /** - * Grow the buffer to at least desired_capacity bytes. - * If the allocation fails, is_valid is set to false. We expect - * that this function would not be repeatedly called. - */ - simdjson_inline void grow_buffer(size_t desired_capacity); - - /** - * We use this helper function to make sure that is_valid is kept consistent. - */ - simdjson_inline void set_valid(bool valid) noexcept; - - std::unique_ptr<char[]> buffer{}; - size_t position{0}; - size_t capacity{0}; - bool is_valid{true}; -}; - - - -} -} - - -#if !SIMDJSON_STATIC_REFLECTION -// fallback implementation until we have static reflection -template <class Z> -simdjson_warn_unused simdjson_result<std::string> to_json(const Z &z, size_t initial_capacity = simdjson::westmere::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { - simdjson::westmere::builder::string_builder b(initial_capacity); - b.append(z); - std::string_view s; - auto e = b.view().get(s); - if(e) { return e; } - return std::string(s); -} -template <class Z> -simdjson_warn_unused simdjson_error to_json(const Z &z, std::string &s, size_t initial_capacity = simdjson::westmere::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { - simdjson::westmere::builder::string_builder b(initial_capacity); - b.append(z); - std::string_view sv; - auto e = b.view().get(sv); - if(e) { return e; } - s.assign(sv.data(), sv.size()); - return simdjson::SUCCESS; -} -#endif - -#if SIMDJSON_SUPPORTS_CONCEPTS -#endif // SIMDJSON_SUPPORTS_CONCEPTS - -} // namespace simdjson - -#endif // SIMDJSON_GENERIC_STRING_BUILDER_H -/* end file simdjson/generic/ondemand/json_string_builder.h for westmere */ +/* end file simdjson/generic/ondemand/parser.h for lsx */ // All other declarations -/* including simdjson/generic/ondemand/array.h for westmere: #include "simdjson/generic/ondemand/array.h" */ -/* begin file simdjson/generic/ondemand/array.h for westmere */ +/* including simdjson/generic/ondemand/array.h for lsx: #include "simdjson/generic/ondemand/array.h" */ +/* begin file simdjson/generic/ondemand/array.h for lsx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -112378,7 +146871,7 @@ simdjson_warn_unused simdjson_error to_json(const Z &z, std::string &s, size_t i /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace westmere { +namespace lsx { namespace ondemand { /** @@ -112598,27 +147091,27 @@ class array { }; } // namespace ondemand -} // namespace westmere +} // namespace lsx } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<westmere::ondemand::array> : public westmere::implementation_simdjson_result_base<westmere::ondemand::array> { +struct simdjson_result<lsx::ondemand::array> : public lsx::implementation_simdjson_result_base<lsx::ondemand::array> { public: - simdjson_inline simdjson_result(westmere::ondemand::array &&value) noexcept; ///< @private + simdjson_inline simdjson_result(lsx::ondemand::array &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; - simdjson_inline simdjson_result<westmere::ondemand::array_iterator> begin() noexcept; - simdjson_inline simdjson_result<westmere::ondemand::array_iterator> end() noexcept; + simdjson_inline simdjson_result<lsx::ondemand::array_iterator> begin() noexcept; + simdjson_inline simdjson_result<lsx::ondemand::array_iterator> end() noexcept; inline simdjson_result<size_t> count_elements() & noexcept; inline simdjson_result<bool> is_empty() & noexcept; inline simdjson_result<bool> reset() & noexcept; - simdjson_inline simdjson_result<westmere::ondemand::value> at(size_t index) noexcept; - simdjson_inline simdjson_result<westmere::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result<westmere::ondemand::value> at_path(std::string_view json_path) noexcept; - simdjson_inline simdjson_result<std::vector<westmere::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<lsx::ondemand::value> at(size_t index) noexcept; + simdjson_inline simdjson_result<lsx::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result<lsx::ondemand::value> at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<std::vector<lsx::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; simdjson_inline simdjson_result<std::string_view> raw_json() noexcept; #if SIMDJSON_SUPPORTS_CONCEPTS // TODO: move this code into object-inl.h @@ -112626,7 +147119,7 @@ struct simdjson_result<westmere::ondemand::array> : public westmere::implementat template<typename T> simdjson_inline simdjson_result<T> get() noexcept { if (error()) { return error(); } - if constexpr (std::is_same_v<T, westmere::ondemand::array>) { + if constexpr (std::is_same_v<T, lsx::ondemand::array>) { return first; } return first.get<T>(); @@ -112634,7 +147127,7 @@ struct simdjson_result<westmere::ondemand::array> : public westmere::implementat template<typename T> simdjson_warn_unused simdjson_inline error_code get(T& out) noexcept { if (error()) { return error(); } - if constexpr (std::is_same_v<T, westmere::ondemand::array>) { + if constexpr (std::is_same_v<T, lsx::ondemand::array>) { out = first; } else { SIMDJSON_TRY( first.get<T>(out) ); @@ -112647,13 +147140,14 @@ struct simdjson_result<westmere::ondemand::array> : public westmere::implementat } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_H -/* end file simdjson/generic/ondemand/array.h for westmere */ -/* including simdjson/generic/ondemand/array_iterator.h for westmere: #include "simdjson/generic/ondemand/array_iterator.h" */ -/* begin file simdjson/generic/ondemand/array_iterator.h for westmere */ +/* end file simdjson/generic/ondemand/array.h for lsx */ +/* including simdjson/generic/ondemand/array_iterator.h for lsx: #include "simdjson/generic/ondemand/array_iterator.h" */ +/* begin file simdjson/generic/ondemand/array_iterator.h for lsx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ /* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H */ +/* amalgamation skipped (editor-only): #include <iterator> */ /* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */ @@ -112661,7 +147155,7 @@ struct simdjson_result<westmere::ondemand::array> : public westmere::implementat namespace simdjson { -namespace westmere { +namespace lsx { namespace ondemand { /** @@ -112669,11 +147163,17 @@ namespace ondemand { * * This is an input_iterator, meaning: * - It is forward-only - * - * must be called exactly once per element. + * - * must be called at most once per element. * - ++ must be called exactly once in between each * (*, ++, *, ++, * ...) */ class array_iterator { public: + using iterator_category = std::input_iterator_tag; + using value_type = simdjson_result<value>; + using difference_type = std::ptrdiff_t; + using pointer = void; + using reference = value_type; + /** Create a new, invalid array iterator. */ simdjson_inline array_iterator() noexcept = default; @@ -112717,6 +147217,9 @@ class array_iterator { simdjson_warn_unused simdjson_inline bool at_end() const noexcept; private: +#if SIMDJSON_DEVELOPMENT_CHECKS + bool has_been_referenced{false}; +#endif value_iterator iter{}; simdjson_inline array_iterator(const value_iterator &iter) noexcept; @@ -112727,14 +147230,20 @@ class array_iterator { }; } // namespace ondemand -} // namespace westmere +} // namespace lsx } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<westmere::ondemand::array_iterator> : public westmere::implementation_simdjson_result_base<westmere::ondemand::array_iterator> { - simdjson_inline simdjson_result(westmere::ondemand::array_iterator &&value) noexcept; ///< @private +struct simdjson_result<lsx::ondemand::array_iterator> : public lsx::implementation_simdjson_result_base<lsx::ondemand::array_iterator> { + using iterator_category = std::input_iterator_tag; + using value_type = simdjson_result<lsx::ondemand::value>; + using difference_type = std::ptrdiff_t; + using pointer = void; + using reference = value_type; + + simdjson_inline simdjson_result(lsx::ondemand::array_iterator &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; @@ -112742,10 +147251,10 @@ struct simdjson_result<westmere::ondemand::array_iterator> : public westmere::im // Iterator interface // - simdjson_inline simdjson_result<westmere::ondemand::value> operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. - simdjson_inline bool operator==(const simdjson_result<westmere::ondemand::array_iterator> &) const noexcept; - simdjson_inline bool operator!=(const simdjson_result<westmere::ondemand::array_iterator> &) const noexcept; - simdjson_inline simdjson_result<westmere::ondemand::array_iterator> &operator++() noexcept; + simdjson_inline simdjson_result<lsx::ondemand::value> operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. + simdjson_inline bool operator==(const simdjson_result<lsx::ondemand::array_iterator> &) const noexcept; + simdjson_inline bool operator!=(const simdjson_result<lsx::ondemand::array_iterator> &) const noexcept; + simdjson_inline simdjson_result<lsx::ondemand::array_iterator> &operator++() noexcept; simdjson_warn_unused simdjson_inline bool at_end() const noexcept; }; @@ -112753,9 +147262,9 @@ struct simdjson_result<westmere::ondemand::array_iterator> : public westmere::im } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H -/* end file simdjson/generic/ondemand/array_iterator.h for westmere */ -/* including simdjson/generic/ondemand/document.h for westmere: #include "simdjson/generic/ondemand/document.h" */ -/* begin file simdjson/generic/ondemand/document.h for westmere */ +/* end file simdjson/generic/ondemand/array_iterator.h for lsx */ +/* including simdjson/generic/ondemand/document.h for lsx: #include "simdjson/generic/ondemand/document.h" */ +/* begin file simdjson/generic/ondemand/document.h for lsx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -112769,7 +147278,7 @@ struct simdjson_result<westmere::ondemand::array_iterator> : public westmere::im namespace simdjson { -namespace westmere { +namespace lsx { namespace ondemand { /** @@ -113721,21 +148230,21 @@ class document_reference { document *doc{nullptr}; }; } // namespace ondemand -} // namespace westmere +} // namespace lsx } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<westmere::ondemand::document> : public westmere::implementation_simdjson_result_base<westmere::ondemand::document> { +struct simdjson_result<lsx::ondemand::document> : public lsx::implementation_simdjson_result_base<lsx::ondemand::document> { public: - simdjson_inline simdjson_result(westmere::ondemand::document &&value) noexcept; ///< @private + simdjson_inline simdjson_result(lsx::ondemand::document &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; simdjson_inline error_code rewind() noexcept; - simdjson_inline simdjson_result<westmere::ondemand::array> get_array() & noexcept; - simdjson_inline simdjson_result<westmere::ondemand::object> get_object() & noexcept; + simdjson_inline simdjson_result<lsx::ondemand::array> get_array() & noexcept; + simdjson_inline simdjson_result<lsx::ondemand::object> get_object() & noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64() noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64_in_string() noexcept; simdjson_inline simdjson_result<int64_t> get_int64() noexcept; @@ -113746,9 +148255,9 @@ struct simdjson_result<westmere::ondemand::document> : public westmere::implemen template <typename string_type> simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result<std::string_view> get_wobbly_string() noexcept; - simdjson_inline simdjson_result<westmere::ondemand::raw_json_string> get_raw_json_string() noexcept; + simdjson_inline simdjson_result<lsx::ondemand::raw_json_string> get_raw_json_string() noexcept; simdjson_inline simdjson_result<bool> get_bool() noexcept; - simdjson_inline simdjson_result<westmere::ondemand::value> get_value() noexcept; + simdjson_inline simdjson_result<lsx::ondemand::value> get_value() noexcept; simdjson_inline simdjson_result<bool> is_null() noexcept; template<typename T> simdjson_inline simdjson_result<T> get() & noexcept; @@ -113758,33 +148267,33 @@ struct simdjson_result<westmere::ondemand::document> : public westmere::implemen template<typename T> simdjson_inline error_code get(T &out) && noexcept; #if SIMDJSON_EXCEPTIONS - using westmere::implementation_simdjson_result_base<westmere::ondemand::document>::operator*; - using westmere::implementation_simdjson_result_base<westmere::ondemand::document>::operator->; - template <class T, typename std::enable_if<std::is_same<T, westmere::ondemand::document>::value == false>::type> + using lsx::implementation_simdjson_result_base<lsx::ondemand::document>::operator*; + using lsx::implementation_simdjson_result_base<lsx::ondemand::document>::operator->; + template <class T, typename std::enable_if<std::is_same<T, lsx::ondemand::document>::value == false>::type> explicit simdjson_inline operator T() noexcept(false); - simdjson_inline operator westmere::ondemand::array() & noexcept(false); - simdjson_inline operator westmere::ondemand::object() & noexcept(false); + simdjson_inline operator lsx::ondemand::array() & noexcept(false); + simdjson_inline operator lsx::ondemand::object() & noexcept(false); simdjson_inline operator uint64_t() noexcept(false); simdjson_inline operator int64_t() noexcept(false); simdjson_inline operator double() noexcept(false); simdjson_inline operator std::string_view() noexcept(false); - simdjson_inline operator westmere::ondemand::raw_json_string() noexcept(false); + simdjson_inline operator lsx::ondemand::raw_json_string() noexcept(false); simdjson_inline operator bool() noexcept(false); - simdjson_inline operator westmere::ondemand::value() noexcept(false); + simdjson_inline operator lsx::ondemand::value() noexcept(false); #endif simdjson_inline simdjson_result<size_t> count_elements() & noexcept; simdjson_inline simdjson_result<size_t> count_fields() & noexcept; - simdjson_inline simdjson_result<westmere::ondemand::value> at(size_t index) & noexcept; - simdjson_inline simdjson_result<westmere::ondemand::array_iterator> begin() & noexcept; - simdjson_inline simdjson_result<westmere::ondemand::array_iterator> end() & noexcept; - simdjson_inline simdjson_result<westmere::ondemand::value> find_field(std::string_view key) & noexcept; - simdjson_inline simdjson_result<westmere::ondemand::value> find_field(const char *key) & noexcept; - simdjson_inline simdjson_result<westmere::ondemand::value> operator[](std::string_view key) & noexcept; - simdjson_inline simdjson_result<westmere::ondemand::value> operator[](const char *key) & noexcept; - simdjson_result<westmere::ondemand::value> operator[](int) & noexcept = delete; - simdjson_inline simdjson_result<westmere::ondemand::value> find_field_unordered(std::string_view key) & noexcept; - simdjson_inline simdjson_result<westmere::ondemand::value> find_field_unordered(const char *key) & noexcept; - simdjson_inline simdjson_result<westmere::ondemand::json_type> type() noexcept; + simdjson_inline simdjson_result<lsx::ondemand::value> at(size_t index) & noexcept; + simdjson_inline simdjson_result<lsx::ondemand::array_iterator> begin() & noexcept; + simdjson_inline simdjson_result<lsx::ondemand::array_iterator> end() & noexcept; + simdjson_inline simdjson_result<lsx::ondemand::value> find_field(std::string_view key) & noexcept; + simdjson_inline simdjson_result<lsx::ondemand::value> find_field(const char *key) & noexcept; + simdjson_inline simdjson_result<lsx::ondemand::value> operator[](std::string_view key) & noexcept; + simdjson_inline simdjson_result<lsx::ondemand::value> operator[](const char *key) & noexcept; + simdjson_result<lsx::ondemand::value> operator[](int) & noexcept = delete; + simdjson_inline simdjson_result<lsx::ondemand::value> find_field_unordered(std::string_view key) & noexcept; + simdjson_inline simdjson_result<lsx::ondemand::value> find_field_unordered(const char *key) & noexcept; + simdjson_inline simdjson_result<lsx::ondemand::json_type> type() noexcept; simdjson_inline simdjson_result<bool> is_scalar() noexcept; simdjson_inline simdjson_result<bool> is_string() noexcept; simdjson_inline simdjson_result<const char *> current_location() noexcept; @@ -113792,14 +148301,14 @@ struct simdjson_result<westmere::ondemand::document> : public westmere::implemen simdjson_inline bool at_end() const noexcept; simdjson_inline bool is_negative() noexcept; simdjson_inline simdjson_result<bool> is_integer() noexcept; - simdjson_inline simdjson_result<westmere::number_type> get_number_type() noexcept; - simdjson_inline simdjson_result<westmere::ondemand::number> get_number() noexcept; + simdjson_inline simdjson_result<lsx::number_type> get_number_type() noexcept; + simdjson_inline simdjson_result<lsx::ondemand::number> get_number() noexcept; /** @copydoc simdjson_inline std::string_view document::raw_json_token() const noexcept */ simdjson_inline simdjson_result<std::string_view> raw_json_token() noexcept; - simdjson_inline simdjson_result<westmere::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result<westmere::ondemand::value> at_path(std::string_view json_path) noexcept; - simdjson_inline simdjson_result<std::vector<westmere::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<lsx::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result<lsx::ondemand::value> at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<std::vector<lsx::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; #if SIMDJSON_STATIC_REFLECTION template<constevalutil::fixed_string... FieldNames, typename T> requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) @@ -113815,14 +148324,14 @@ struct simdjson_result<westmere::ondemand::document> : public westmere::implemen namespace simdjson { template<> -struct simdjson_result<westmere::ondemand::document_reference> : public westmere::implementation_simdjson_result_base<westmere::ondemand::document_reference> { +struct simdjson_result<lsx::ondemand::document_reference> : public lsx::implementation_simdjson_result_base<lsx::ondemand::document_reference> { public: - simdjson_inline simdjson_result(westmere::ondemand::document_reference value, error_code error) noexcept; + simdjson_inline simdjson_result(lsx::ondemand::document_reference value, error_code error) noexcept; simdjson_inline simdjson_result() noexcept = default; simdjson_inline error_code rewind() noexcept; - simdjson_inline simdjson_result<westmere::ondemand::array> get_array() & noexcept; - simdjson_inline simdjson_result<westmere::ondemand::object> get_object() & noexcept; + simdjson_inline simdjson_result<lsx::ondemand::array> get_array() & noexcept; + simdjson_inline simdjson_result<lsx::ondemand::object> get_object() & noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64() noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64_in_string() noexcept; simdjson_inline simdjson_result<int64_t> get_int64() noexcept; @@ -113833,9 +148342,9 @@ struct simdjson_result<westmere::ondemand::document_reference> : public westmere template <typename string_type> simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result<std::string_view> get_wobbly_string() noexcept; - simdjson_inline simdjson_result<westmere::ondemand::raw_json_string> get_raw_json_string() noexcept; + simdjson_inline simdjson_result<lsx::ondemand::raw_json_string> get_raw_json_string() noexcept; simdjson_inline simdjson_result<bool> get_bool() noexcept; - simdjson_inline simdjson_result<westmere::ondemand::value> get_value() noexcept; + simdjson_inline simdjson_result<lsx::ondemand::value> get_value() noexcept; simdjson_inline simdjson_result<bool> is_null() noexcept; template<typename T> simdjson_inline simdjson_result<T> get() & noexcept; @@ -113846,43 +148355,43 @@ struct simdjson_result<westmere::ondemand::document_reference> : public westmere #if SIMDJSON_EXCEPTIONS template <class T> explicit simdjson_inline operator T() noexcept(false); - simdjson_inline operator westmere::ondemand::array() & noexcept(false); - simdjson_inline operator westmere::ondemand::object() & noexcept(false); + simdjson_inline operator lsx::ondemand::array() & noexcept(false); + simdjson_inline operator lsx::ondemand::object() & noexcept(false); simdjson_inline operator uint64_t() noexcept(false); simdjson_inline operator int64_t() noexcept(false); simdjson_inline operator double() noexcept(false); simdjson_inline operator std::string_view() noexcept(false); - simdjson_inline operator westmere::ondemand::raw_json_string() noexcept(false); + simdjson_inline operator lsx::ondemand::raw_json_string() noexcept(false); simdjson_inline operator bool() noexcept(false); - simdjson_inline operator westmere::ondemand::value() noexcept(false); + simdjson_inline operator lsx::ondemand::value() noexcept(false); #endif simdjson_inline simdjson_result<size_t> count_elements() & noexcept; simdjson_inline simdjson_result<size_t> count_fields() & noexcept; - simdjson_inline simdjson_result<westmere::ondemand::value> at(size_t index) & noexcept; - simdjson_inline simdjson_result<westmere::ondemand::array_iterator> begin() & noexcept; - simdjson_inline simdjson_result<westmere::ondemand::array_iterator> end() & noexcept; - simdjson_inline simdjson_result<westmere::ondemand::value> find_field(std::string_view key) & noexcept; - simdjson_inline simdjson_result<westmere::ondemand::value> find_field(const char *key) & noexcept; - simdjson_inline simdjson_result<westmere::ondemand::value> operator[](std::string_view key) & noexcept; - simdjson_inline simdjson_result<westmere::ondemand::value> operator[](const char *key) & noexcept; - simdjson_result<westmere::ondemand::value> operator[](int) & noexcept = delete; - simdjson_inline simdjson_result<westmere::ondemand::value> find_field_unordered(std::string_view key) & noexcept; - simdjson_inline simdjson_result<westmere::ondemand::value> find_field_unordered(const char *key) & noexcept; - simdjson_inline simdjson_result<westmere::ondemand::json_type> type() noexcept; + simdjson_inline simdjson_result<lsx::ondemand::value> at(size_t index) & noexcept; + simdjson_inline simdjson_result<lsx::ondemand::array_iterator> begin() & noexcept; + simdjson_inline simdjson_result<lsx::ondemand::array_iterator> end() & noexcept; + simdjson_inline simdjson_result<lsx::ondemand::value> find_field(std::string_view key) & noexcept; + simdjson_inline simdjson_result<lsx::ondemand::value> find_field(const char *key) & noexcept; + simdjson_inline simdjson_result<lsx::ondemand::value> operator[](std::string_view key) & noexcept; + simdjson_inline simdjson_result<lsx::ondemand::value> operator[](const char *key) & noexcept; + simdjson_result<lsx::ondemand::value> operator[](int) & noexcept = delete; + simdjson_inline simdjson_result<lsx::ondemand::value> find_field_unordered(std::string_view key) & noexcept; + simdjson_inline simdjson_result<lsx::ondemand::value> find_field_unordered(const char *key) & noexcept; + simdjson_inline simdjson_result<lsx::ondemand::json_type> type() noexcept; simdjson_inline simdjson_result<bool> is_scalar() noexcept; simdjson_inline simdjson_result<bool> is_string() noexcept; simdjson_inline simdjson_result<const char *> current_location() noexcept; simdjson_inline simdjson_result<int32_t> current_depth() const noexcept; simdjson_inline simdjson_result<bool> is_negative() noexcept; simdjson_inline simdjson_result<bool> is_integer() noexcept; - simdjson_inline simdjson_result<westmere::number_type> get_number_type() noexcept; - simdjson_inline simdjson_result<westmere::ondemand::number> get_number() noexcept; + simdjson_inline simdjson_result<lsx::number_type> get_number_type() noexcept; + simdjson_inline simdjson_result<lsx::ondemand::number> get_number() noexcept; /** @copydoc simdjson_inline std::string_view document_reference::raw_json_token() const noexcept */ simdjson_inline simdjson_result<std::string_view> raw_json_token() noexcept; - simdjson_inline simdjson_result<westmere::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result<westmere::ondemand::value> at_path(std::string_view json_path) noexcept; - simdjson_inline simdjson_result<std::vector<westmere::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<lsx::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result<lsx::ondemand::value> at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<std::vector<lsx::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; #if SIMDJSON_STATIC_REFLECTION template<constevalutil::fixed_string... FieldNames, typename T> requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) @@ -113894,9 +148403,9 @@ struct simdjson_result<westmere::ondemand::document_reference> : public westmere } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_H -/* end file simdjson/generic/ondemand/document.h for westmere */ -/* including simdjson/generic/ondemand/document_stream.h for westmere: #include "simdjson/generic/ondemand/document_stream.h" */ -/* begin file simdjson/generic/ondemand/document_stream.h for westmere */ +/* end file simdjson/generic/ondemand/document.h for lsx */ +/* including simdjson/generic/ondemand/document_stream.h for lsx: #include "simdjson/generic/ondemand/document_stream.h" */ +/* begin file simdjson/generic/ondemand/document_stream.h for lsx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -113914,7 +148423,7 @@ struct simdjson_result<westmere::ondemand::document_reference> : public westmere #endif namespace simdjson { -namespace westmere { +namespace lsx { namespace ondemand { #ifdef SIMDJSON_THREADS_ENABLED @@ -114227,14 +148736,14 @@ class document_stream { }; // document_stream } // namespace ondemand -} // namespace westmere +} // namespace lsx } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<westmere::ondemand::document_stream> : public westmere::implementation_simdjson_result_base<westmere::ondemand::document_stream> { +struct simdjson_result<lsx::ondemand::document_stream> : public lsx::implementation_simdjson_result_base<lsx::ondemand::document_stream> { public: - simdjson_inline simdjson_result(westmere::ondemand::document_stream &&value) noexcept; ///< @private + simdjson_inline simdjson_result(lsx::ondemand::document_stream &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; }; @@ -114242,9 +148751,9 @@ struct simdjson_result<westmere::ondemand::document_stream> : public westmere::i } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_H -/* end file simdjson/generic/ondemand/document_stream.h for westmere */ -/* including simdjson/generic/ondemand/field.h for westmere: #include "simdjson/generic/ondemand/field.h" */ -/* begin file simdjson/generic/ondemand/field.h for westmere */ +/* end file simdjson/generic/ondemand/document_stream.h for lsx */ +/* including simdjson/generic/ondemand/field.h for lsx: #include "simdjson/generic/ondemand/field.h" */ +/* begin file simdjson/generic/ondemand/field.h for lsx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_FIELD_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -114256,7 +148765,7 @@ struct simdjson_result<westmere::ondemand::document_stream> : public westmere::i /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace westmere { +namespace lsx { namespace ondemand { /** @@ -114334,33 +148843,33 @@ class field : public std::pair<raw_json_string, value> { }; } // namespace ondemand -} // namespace westmere +} // namespace lsx } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<westmere::ondemand::field> : public westmere::implementation_simdjson_result_base<westmere::ondemand::field> { +struct simdjson_result<lsx::ondemand::field> : public lsx::implementation_simdjson_result_base<lsx::ondemand::field> { public: - simdjson_inline simdjson_result(westmere::ondemand::field &&value) noexcept; ///< @private + simdjson_inline simdjson_result(lsx::ondemand::field &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; simdjson_inline simdjson_result<std::string_view> unescaped_key(bool allow_replacement = false) noexcept; template<typename string_type> simdjson_inline error_code unescaped_key(string_type &receiver, bool allow_replacement = false) noexcept; - simdjson_inline simdjson_result<westmere::ondemand::raw_json_string> key() noexcept; + simdjson_inline simdjson_result<lsx::ondemand::raw_json_string> key() noexcept; simdjson_inline simdjson_result<std::string_view> key_raw_json_token() noexcept; simdjson_inline simdjson_result<std::string_view> escaped_key() noexcept; - simdjson_inline simdjson_result<westmere::ondemand::value> value() noexcept; + simdjson_inline simdjson_result<lsx::ondemand::value> value() noexcept; }; } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_FIELD_H -/* end file simdjson/generic/ondemand/field.h for westmere */ -/* including simdjson/generic/ondemand/object.h for westmere: #include "simdjson/generic/ondemand/object.h" */ -/* begin file simdjson/generic/ondemand/object.h for westmere */ +/* end file simdjson/generic/ondemand/field.h for lsx */ +/* including simdjson/generic/ondemand/object.h for lsx: #include "simdjson/generic/ondemand/object.h" */ +/* begin file simdjson/generic/ondemand/object.h for lsx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -114375,7 +148884,7 @@ struct simdjson_result<westmere::ondemand::field> : public westmere::implementat /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace westmere { +namespace lsx { namespace ondemand { /** @@ -114390,6 +148899,13 @@ class object { */ simdjson_inline object() noexcept = default; + /** + * Get an iterator to the start of the object. We recommend using a range-based for loop. + * + * Using the iterator directly is also possible but error-prone and discouraged. In particular, + * you must dereference the iterator exactly once per iteration (before calling '++'). + * Doing otherwise is unsafe and may lead to errors. You are responsible for ensuring + */ simdjson_inline simdjson_result<object_iterator> begin() noexcept; simdjson_inline simdjson_result<object_iterator> end() noexcept; /** @@ -114662,29 +149178,29 @@ class object { }; } // namespace ondemand -} // namespace westmere +} // namespace lsx } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<westmere::ondemand::object> : public westmere::implementation_simdjson_result_base<westmere::ondemand::object> { +struct simdjson_result<lsx::ondemand::object> : public lsx::implementation_simdjson_result_base<lsx::ondemand::object> { public: - simdjson_inline simdjson_result(westmere::ondemand::object &&value) noexcept; ///< @private + simdjson_inline simdjson_result(lsx::ondemand::object &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; - simdjson_inline simdjson_result<westmere::ondemand::object_iterator> begin() noexcept; - simdjson_inline simdjson_result<westmere::ondemand::object_iterator> end() noexcept; - simdjson_inline simdjson_result<westmere::ondemand::value> find_field(std::string_view key) & noexcept; - simdjson_inline simdjson_result<westmere::ondemand::value> find_field(std::string_view key) && noexcept; - simdjson_inline simdjson_result<westmere::ondemand::value> find_field_unordered(std::string_view key) & noexcept; - simdjson_inline simdjson_result<westmere::ondemand::value> find_field_unordered(std::string_view key) && noexcept; - simdjson_inline simdjson_result<westmere::ondemand::value> operator[](std::string_view key) & noexcept; - simdjson_inline simdjson_result<westmere::ondemand::value> operator[](std::string_view key) && noexcept; - simdjson_inline simdjson_result<westmere::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result<westmere::ondemand::value> at_path(std::string_view json_path) noexcept; - simdjson_inline simdjson_result<std::vector<westmere::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<lsx::ondemand::object_iterator> begin() noexcept; + simdjson_inline simdjson_result<lsx::ondemand::object_iterator> end() noexcept; + simdjson_inline simdjson_result<lsx::ondemand::value> find_field(std::string_view key) & noexcept; + simdjson_inline simdjson_result<lsx::ondemand::value> find_field(std::string_view key) && noexcept; + simdjson_inline simdjson_result<lsx::ondemand::value> find_field_unordered(std::string_view key) & noexcept; + simdjson_inline simdjson_result<lsx::ondemand::value> find_field_unordered(std::string_view key) && noexcept; + simdjson_inline simdjson_result<lsx::ondemand::value> operator[](std::string_view key) & noexcept; + simdjson_inline simdjson_result<lsx::ondemand::value> operator[](std::string_view key) && noexcept; + simdjson_inline simdjson_result<lsx::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result<lsx::ondemand::value> at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<std::vector<lsx::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; inline simdjson_result<bool> reset() noexcept; inline simdjson_result<bool> is_empty() noexcept; inline simdjson_result<size_t> count_fields() & noexcept; @@ -114695,7 +149211,7 @@ struct simdjson_result<westmere::ondemand::object> : public westmere::implementa template<typename T> simdjson_inline simdjson_result<T> get() noexcept { if (error()) { return error(); } - if constexpr (std::is_same_v<T, westmere::ondemand::object>) { + if constexpr (std::is_same_v<T, lsx::ondemand::object>) { return first; } return first.get<T>(); @@ -114703,7 +149219,7 @@ struct simdjson_result<westmere::ondemand::object> : public westmere::implementa template<typename T> simdjson_warn_unused simdjson_inline error_code get(T& out) noexcept { if (error()) { return error(); } - if constexpr (std::is_same_v<T, westmere::ondemand::object>) { + if constexpr (std::is_same_v<T, lsx::ondemand::object>) { out = first; } else { SIMDJSON_TRY( first.get<T>(out) ); @@ -114726,9 +149242,9 @@ struct simdjson_result<westmere::ondemand::object> : public westmere::implementa } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_H -/* end file simdjson/generic/ondemand/object.h for westmere */ -/* including simdjson/generic/ondemand/object_iterator.h for westmere: #include "simdjson/generic/ondemand/object_iterator.h" */ -/* begin file simdjson/generic/ondemand/object_iterator.h for westmere */ +/* end file simdjson/generic/ondemand/object.h for lsx */ +/* including simdjson/generic/ondemand/object_iterator.h for lsx: #include "simdjson/generic/ondemand/object_iterator.h" */ +/* begin file simdjson/generic/ondemand/object_iterator.h for lsx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -114739,7 +149255,7 @@ struct simdjson_result<westmere::ondemand::object> : public westmere::implementa /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace westmere { +namespace lsx { namespace ondemand { class object_iterator { @@ -114763,9 +149279,14 @@ class object_iterator { // Assumes it's being compared with the end. true if depth >= iter->depth. simdjson_inline bool operator!=(const object_iterator &) const noexcept; // Checks for ']' and ',' + // YOU MUST NOT CALL THIS IF operator* YIELDED AN ERROR. + // YOU MUST NOT CALL THIS WITHOUT A CORRESPONDING operator* CALL. simdjson_inline object_iterator &operator++() noexcept; private: +#if SIMDJSON_DEVELOPMENT_CHECKS + bool has_been_referenced{false}; +#endif /** * The underlying JSON iterator. * @@ -114780,15 +149301,15 @@ class object_iterator { }; } // namespace ondemand -} // namespace westmere +} // namespace lsx } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<westmere::ondemand::object_iterator> : public westmere::implementation_simdjson_result_base<westmere::ondemand::object_iterator> { +struct simdjson_result<lsx::ondemand::object_iterator> : public lsx::implementation_simdjson_result_base<lsx::ondemand::object_iterator> { public: - simdjson_inline simdjson_result(westmere::ondemand::object_iterator &&value) noexcept; ///< @private + simdjson_inline simdjson_result(lsx::ondemand::object_iterator &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; @@ -114797,21 +149318,21 @@ struct simdjson_result<westmere::ondemand::object_iterator> : public westmere::i // // Reads key and value, yielding them to the user. - simdjson_inline simdjson_result<westmere::ondemand::field> operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. + simdjson_inline simdjson_result<lsx::ondemand::field> operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. // Assumes it's being compared with the end. true if depth < iter->depth. - simdjson_inline bool operator==(const simdjson_result<westmere::ondemand::object_iterator> &) const noexcept; + simdjson_inline bool operator==(const simdjson_result<lsx::ondemand::object_iterator> &) const noexcept; // Assumes it's being compared with the end. true if depth >= iter->depth. - simdjson_inline bool operator!=(const simdjson_result<westmere::ondemand::object_iterator> &) const noexcept; + simdjson_inline bool operator!=(const simdjson_result<lsx::ondemand::object_iterator> &) const noexcept; // Checks for ']' and ',' - simdjson_inline simdjson_result<westmere::ondemand::object_iterator> &operator++() noexcept; + simdjson_inline simdjson_result<lsx::ondemand::object_iterator> &operator++() noexcept; }; } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_H -/* end file simdjson/generic/ondemand/object_iterator.h for westmere */ -/* including simdjson/generic/ondemand/serialization.h for westmere: #include "simdjson/generic/ondemand/serialization.h" */ -/* begin file simdjson/generic/ondemand/serialization.h for westmere */ +/* end file simdjson/generic/ondemand/object_iterator.h for lsx */ +/* including simdjson/generic/ondemand/serialization.h for lsx: #include "simdjson/generic/ondemand/serialization.h" */ +/* begin file simdjson/generic/ondemand/serialization.h for lsx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -114825,30 +149346,30 @@ namespace simdjson { * contains JSON text that is suitable to be parsed as JSON again. It does not * validate the content. */ -inline simdjson_result<std::string_view> to_json_string(westmere::ondemand::document& x) noexcept; +inline simdjson_result<std::string_view> to_json_string(lsx::ondemand::document& x) noexcept; /** * Create a string-view instance out of a value instance. The string-view instance * contains JSON text that is suitable to be parsed as JSON again. The value must * not have been accessed previously. It does not * validate the content. */ -inline simdjson_result<std::string_view> to_json_string(westmere::ondemand::value& x) noexcept; +inline simdjson_result<std::string_view> to_json_string(lsx::ondemand::value& x) noexcept; /** * Create a string-view instance out of an object instance. The string-view instance * contains JSON text that is suitable to be parsed as JSON again. It does not * validate the content. */ -inline simdjson_result<std::string_view> to_json_string(westmere::ondemand::object& x) noexcept; +inline simdjson_result<std::string_view> to_json_string(lsx::ondemand::object& x) noexcept; /** * Create a string-view instance out of an array instance. The string-view instance * contains JSON text that is suitable to be parsed as JSON again. It does not * validate the content. */ -inline simdjson_result<std::string_view> to_json_string(westmere::ondemand::array& x) noexcept; -inline simdjson_result<std::string_view> to_json_string(simdjson_result<westmere::ondemand::document> x); -inline simdjson_result<std::string_view> to_json_string(simdjson_result<westmere::ondemand::value> x); -inline simdjson_result<std::string_view> to_json_string(simdjson_result<westmere::ondemand::object> x); -inline simdjson_result<std::string_view> to_json_string(simdjson_result<westmere::ondemand::array> x); +inline simdjson_result<std::string_view> to_json_string(lsx::ondemand::array& x) noexcept; +inline simdjson_result<std::string_view> to_json_string(simdjson_result<lsx::ondemand::document> x); +inline simdjson_result<std::string_view> to_json_string(simdjson_result<lsx::ondemand::value> x); +inline simdjson_result<std::string_view> to_json_string(simdjson_result<lsx::ondemand::object> x); +inline simdjson_result<std::string_view> to_json_string(simdjson_result<lsx::ondemand::array> x); #if SIMDJSON_STATIC_REFLECTION /** @@ -114856,10 +149377,10 @@ inline simdjson_result<std::string_view> to_json_string(simdjson_result<westmere * Only available when SIMDJSON_STATIC_REFLECTION is enabled. */ template<typename T> - requires(!std::same_as<T, westmere::ondemand::document> && - !std::same_as<T, westmere::ondemand::value> && - !std::same_as<T, westmere::ondemand::object> && - !std::same_as<T, westmere::ondemand::array>) + requires(!std::same_as<T, lsx::ondemand::document> && + !std::same_as<T, lsx::ondemand::value> && + !std::same_as<T, lsx::ondemand::object> && + !std::same_as<T, lsx::ondemand::array>) inline std::string to_json_string(const T& obj); #endif @@ -114872,7 +149393,7 @@ inline std::string to_json_string(const T& obj); * Credit: @madhur4127 * See https://github.com/simdjson/simdjson/issues/1768 */ -namespace simdjson { namespace westmere { namespace ondemand { +namespace simdjson { namespace lsx { namespace ondemand { /** * Print JSON to an output stream. It does not @@ -114882,9 +149403,9 @@ namespace simdjson { namespace westmere { namespace ondemand { * @param value The element. * @throw if there is an error with the underlying output stream. simdjson itself will not throw. */ -inline std::ostream& operator<<(std::ostream& out, simdjson::westmere::ondemand::value x); +inline std::ostream& operator<<(std::ostream& out, simdjson::lsx::ondemand::value x); #if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::westmere::ondemand::value> x); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::lsx::ondemand::value> x); #endif /** * Print JSON to an output stream. It does not @@ -114894,9 +149415,9 @@ inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<sim * @param value The array. * @throw if there is an error with the underlying output stream. simdjson itself will not throw. */ -inline std::ostream& operator<<(std::ostream& out, simdjson::westmere::ondemand::array value); +inline std::ostream& operator<<(std::ostream& out, simdjson::lsx::ondemand::array value); #if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::westmere::ondemand::array> x); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::lsx::ondemand::array> x); #endif /** * Print JSON to an output stream. It does not @@ -114906,13 +149427,13 @@ inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<sim * @param value The array. * @throw if there is an error with the underlying output stream. simdjson itself will not throw. */ -inline std::ostream& operator<<(std::ostream& out, simdjson::westmere::ondemand::document& value); +inline std::ostream& operator<<(std::ostream& out, simdjson::lsx::ondemand::document& value); #if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::westmere::ondemand::document>&& x); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::lsx::ondemand::document>&& x); #endif -inline std::ostream& operator<<(std::ostream& out, simdjson::westmere::ondemand::document_reference& value); +inline std::ostream& operator<<(std::ostream& out, simdjson::lsx::ondemand::document_reference& value); #if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::westmere::ondemand::document_reference>&& x); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::lsx::ondemand::document_reference>&& x); #endif /** * Print JSON to an output stream. It does not @@ -114922,18 +149443,18 @@ inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<sim * @param value The object. * @throw if there is an error with the underlying output stream. simdjson itself will not throw. */ -inline std::ostream& operator<<(std::ostream& out, simdjson::westmere::ondemand::object value); +inline std::ostream& operator<<(std::ostream& out, simdjson::lsx::ondemand::object value); #if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::westmere::ondemand::object> x); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::lsx::ondemand::object> x); #endif -}}} // namespace simdjson::westmere::ondemand +}}} // namespace simdjson::lsx::ondemand #endif // SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_H -/* end file simdjson/generic/ondemand/serialization.h for westmere */ +/* end file simdjson/generic/ondemand/serialization.h for lsx */ // Deserialization for standard types -/* including simdjson/generic/ondemand/std_deserialize.h for westmere: #include "simdjson/generic/ondemand/std_deserialize.h" */ -/* begin file simdjson/generic/ondemand/std_deserialize.h for westmere */ +/* including simdjson/generic/ondemand/std_deserialize.h for lsx: #include "simdjson/generic/ondemand/std_deserialize.h" */ +/* begin file simdjson/generic/ondemand/std_deserialize.h for lsx */ #if SIMDJSON_SUPPORTS_CONCEPTS #ifndef SIMDJSON_ONDEMAND_DESERIALIZE_H @@ -115032,8 +149553,8 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { static_assert( std::is_default_constructible_v<value_type>, "The specified type inside the container must default constructible."); - westmere::ondemand::array arr; - if constexpr (std::is_same_v<std::remove_cvref_t<ValT>, westmere::ondemand::array>) { + lsx::ondemand::array arr; + if constexpr (std::is_same_v<std::remove_cvref_t<ValT>, lsx::ondemand::array>) { arr = val; } else { SIMDJSON_TRY(val.get_array().get(arr)); @@ -115077,7 +149598,7 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { static_assert( std::is_default_constructible_v<value_type>, "The specified value type inside the container must default constructible."); - westmere::ondemand::object obj; + lsx::ondemand::object obj; SIMDJSON_TRY(val.get_object().get(obj)); for (auto field : obj) { std::string_view key; @@ -115095,7 +149616,7 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { } template <concepts::string_view_keyed_map T> -error_code tag_invoke(deserialize_tag, westmere::ondemand::object &obj, T &out) noexcept { +error_code tag_invoke(deserialize_tag, lsx::ondemand::object &obj, T &out) noexcept { using value_type = typename std::remove_cvref_t<T>::mapped_type; out.clear(); @@ -115103,7 +149624,7 @@ error_code tag_invoke(deserialize_tag, westmere::ondemand::object &obj, T &out) std::string_view key; SIMDJSON_TRY(field.unescaped_key().get(key)); - westmere::ondemand::value value_obj; + lsx::ondemand::value value_obj; SIMDJSON_TRY(field.value().get(value_obj)); value_type this_value; @@ -115114,22 +149635,22 @@ error_code tag_invoke(deserialize_tag, westmere::ondemand::object &obj, T &out) } template <concepts::string_view_keyed_map T> -error_code tag_invoke(deserialize_tag, westmere::ondemand::value &val, T &out) noexcept { - westmere::ondemand::object obj; +error_code tag_invoke(deserialize_tag, lsx::ondemand::value &val, T &out) noexcept { + lsx::ondemand::object obj; SIMDJSON_TRY(val.get_object().get(obj)); return simdjson::deserialize(obj, out); } template <concepts::string_view_keyed_map T> -error_code tag_invoke(deserialize_tag, westmere::ondemand::document &doc, T &out) noexcept { - westmere::ondemand::object obj; +error_code tag_invoke(deserialize_tag, lsx::ondemand::document &doc, T &out) noexcept { + lsx::ondemand::object obj; SIMDJSON_TRY(doc.get_object().get(obj)); return simdjson::deserialize(obj, out); } template <concepts::string_view_keyed_map T> -error_code tag_invoke(deserialize_tag, westmere::ondemand::document_reference &doc, T &out) noexcept { - westmere::ondemand::object obj; +error_code tag_invoke(deserialize_tag, lsx::ondemand::document_reference &doc, T &out) noexcept { + lsx::ondemand::object obj; SIMDJSON_TRY(doc.get_object().get(obj)); return simdjson::deserialize(obj, out); } @@ -115206,8 +149727,8 @@ constexpr bool user_defined_type = (std::is_class_v<T> template <typename T, typename ValT> requires(user_defined_type<T> && std::is_class_v<T>) error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept { - westmere::ondemand::object obj; - if constexpr (std::is_same_v<std::remove_cvref_t<ValT>, westmere::ondemand::object>) { + lsx::ondemand::object obj; + if constexpr (std::is_same_v<std::remove_cvref_t<ValT>, lsx::ondemand::object>) { obj = val; } else { SIMDJSON_TRY(val.get_object().get(obj)); @@ -115516,11 +150037,11 @@ error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr<int> &out) noe #endif // SIMDJSON_ONDEMAND_DESERIALIZE_H #endif // SIMDJSON_SUPPORTS_CONCEPTS -/* end file simdjson/generic/ondemand/std_deserialize.h for westmere */ +/* end file simdjson/generic/ondemand/std_deserialize.h for lsx */ // Inline definitions -/* including simdjson/generic/ondemand/array-inl.h for westmere: #include "simdjson/generic/ondemand/array-inl.h" */ -/* begin file simdjson/generic/ondemand/array-inl.h for westmere */ +/* including simdjson/generic/ondemand/array-inl.h for lsx: #include "simdjson/generic/ondemand/array-inl.h" */ +/* begin file simdjson/generic/ondemand/array-inl.h for lsx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -115535,7 +150056,7 @@ error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr<int> &out) noe /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace westmere { +namespace lsx { namespace ondemand { // @@ -115764,68 +150285,68 @@ simdjson_inline simdjson_result<value> array::at(size_t index) noexcept { } } // namespace ondemand -} // namespace westmere +} // namespace lsx } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<westmere::ondemand::array>::simdjson_result( - westmere::ondemand::array &&value +simdjson_inline simdjson_result<lsx::ondemand::array>::simdjson_result( + lsx::ondemand::array &&value ) noexcept - : implementation_simdjson_result_base<westmere::ondemand::array>( - std::forward<westmere::ondemand::array>(value) + : implementation_simdjson_result_base<lsx::ondemand::array>( + std::forward<lsx::ondemand::array>(value) ) { } -simdjson_inline simdjson_result<westmere::ondemand::array>::simdjson_result( +simdjson_inline simdjson_result<lsx::ondemand::array>::simdjson_result( error_code error ) noexcept - : implementation_simdjson_result_base<westmere::ondemand::array>(error) + : implementation_simdjson_result_base<lsx::ondemand::array>(error) { } -simdjson_inline simdjson_result<westmere::ondemand::array_iterator> simdjson_result<westmere::ondemand::array>::begin() noexcept { +simdjson_inline simdjson_result<lsx::ondemand::array_iterator> simdjson_result<lsx::ondemand::array>::begin() noexcept { if (error()) { return error(); } return first.begin(); } -simdjson_inline simdjson_result<westmere::ondemand::array_iterator> simdjson_result<westmere::ondemand::array>::end() noexcept { +simdjson_inline simdjson_result<lsx::ondemand::array_iterator> simdjson_result<lsx::ondemand::array>::end() noexcept { if (error()) { return error(); } return first.end(); } -simdjson_inline simdjson_result<size_t> simdjson_result<westmere::ondemand::array>::count_elements() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<lsx::ondemand::array>::count_elements() & noexcept { if (error()) { return error(); } return first.count_elements(); } -simdjson_inline simdjson_result<bool> simdjson_result<westmere::ondemand::array>::is_empty() & noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<lsx::ondemand::array>::is_empty() & noexcept { if (error()) { return error(); } return first.is_empty(); } -simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::array>::at(size_t index) noexcept { +simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::array>::at(size_t index) noexcept { if (error()) { return error(); } return first.at(index); } -simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::array>::at_pointer(std::string_view json_pointer) noexcept { +simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::array>::at_pointer(std::string_view json_pointer) noexcept { if (error()) { return error(); } return first.at_pointer(json_pointer); } -simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::array>::at_path(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::array>::at_path(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path(json_path); } -simdjson_inline simdjson_result<std::vector<westmere::ondemand::value>> simdjson_result<westmere::ondemand::array>::at_path_with_wildcard(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<std::vector<lsx::ondemand::value>> simdjson_result<lsx::ondemand::array>::at_path_with_wildcard(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path_with_wildcard(json_path); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<westmere::ondemand::array>::raw_json() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<lsx::ondemand::array>::raw_json() noexcept { if (error()) { return error(); } return first.raw_json(); } } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_INL_H -/* end file simdjson/generic/ondemand/array-inl.h for westmere */ -/* including simdjson/generic/ondemand/array_iterator-inl.h for westmere: #include "simdjson/generic/ondemand/array_iterator-inl.h" */ -/* begin file simdjson/generic/ondemand/array_iterator-inl.h for westmere */ +/* end file simdjson/generic/ondemand/array-inl.h for lsx */ +/* including simdjson/generic/ondemand/array_iterator-inl.h for lsx: #include "simdjson/generic/ondemand/array_iterator-inl.h" */ +/* begin file simdjson/generic/ondemand/array_iterator-inl.h for lsx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -115837,7 +150358,7 @@ simdjson_inline simdjson_result<std::string_view> simdjson_result<westmere::ond /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace westmere { +namespace lsx { namespace ondemand { simdjson_inline array_iterator::array_iterator(const value_iterator &_iter) noexcept @@ -115845,6 +150366,10 @@ simdjson_inline array_iterator::array_iterator(const value_iterator &_iter) noex {} simdjson_inline simdjson_result<value> array_iterator::operator*() noexcept { +#if SIMDJSON_DEVELOPMENT_CHECKS + SIMDJSON_ASSUME(!has_been_referenced); + has_been_referenced = true; +#endif if (iter.error()) { iter.abandon(); return iter.error(); } return value(iter.child()); } @@ -115855,6 +150380,9 @@ simdjson_inline bool array_iterator::operator!=(const array_iterator &) const no return iter.is_open(); } simdjson_inline array_iterator &array_iterator::operator++() noexcept { +#if SIMDJSON_DEVELOPMENT_CHECKS + has_been_referenced = false; +#endif error_code error; // PERF NOTE this is a safety rail ... users should exit loops as soon as they receive an error, so we'll never get here. // However, it does not seem to make a perf difference, so we add it out of an abundance of caution. @@ -115868,50 +150396,50 @@ simdjson_inline bool array_iterator::at_end() const noexcept { return iter.at_end(); } } // namespace ondemand -} // namespace westmere +} // namespace lsx } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<westmere::ondemand::array_iterator>::simdjson_result( - westmere::ondemand::array_iterator &&value +simdjson_inline simdjson_result<lsx::ondemand::array_iterator>::simdjson_result( + lsx::ondemand::array_iterator &&value ) noexcept - : westmere::implementation_simdjson_result_base<westmere::ondemand::array_iterator>(std::forward<westmere::ondemand::array_iterator>(value)) + : lsx::implementation_simdjson_result_base<lsx::ondemand::array_iterator>(std::forward<lsx::ondemand::array_iterator>(value)) { first.iter.assert_is_valid(); } -simdjson_inline simdjson_result<westmere::ondemand::array_iterator>::simdjson_result(error_code error) noexcept - : westmere::implementation_simdjson_result_base<westmere::ondemand::array_iterator>({}, error) +simdjson_inline simdjson_result<lsx::ondemand::array_iterator>::simdjson_result(error_code error) noexcept + : lsx::implementation_simdjson_result_base<lsx::ondemand::array_iterator>({}, error) { } -simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::array_iterator>::operator*() noexcept { +simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::array_iterator>::operator*() noexcept { if (error()) { return error(); } return *first; } -simdjson_inline bool simdjson_result<westmere::ondemand::array_iterator>::operator==(const simdjson_result<westmere::ondemand::array_iterator> &other) const noexcept { +simdjson_inline bool simdjson_result<lsx::ondemand::array_iterator>::operator==(const simdjson_result<lsx::ondemand::array_iterator> &other) const noexcept { if (!first.iter.is_valid()) { return !error(); } return first == other.first; } -simdjson_inline bool simdjson_result<westmere::ondemand::array_iterator>::operator!=(const simdjson_result<westmere::ondemand::array_iterator> &other) const noexcept { +simdjson_inline bool simdjson_result<lsx::ondemand::array_iterator>::operator!=(const simdjson_result<lsx::ondemand::array_iterator> &other) const noexcept { if (!first.iter.is_valid()) { return error(); } return first != other.first; } -simdjson_inline simdjson_result<westmere::ondemand::array_iterator> &simdjson_result<westmere::ondemand::array_iterator>::operator++() noexcept { +simdjson_inline simdjson_result<lsx::ondemand::array_iterator> &simdjson_result<lsx::ondemand::array_iterator>::operator++() noexcept { // Clear the error if there is one, so we don't yield it twice if (error()) { second = SUCCESS; return *this; } ++(first); return *this; } -simdjson_inline bool simdjson_result<westmere::ondemand::array_iterator>::at_end() const noexcept { +simdjson_inline bool simdjson_result<lsx::ondemand::array_iterator>::at_end() const noexcept { return !first.iter.is_valid() || first.at_end(); } } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_INL_H -/* end file simdjson/generic/ondemand/array_iterator-inl.h for westmere */ -/* including simdjson/generic/ondemand/value-inl.h for westmere: #include "simdjson/generic/ondemand/value-inl.h" */ -/* begin file simdjson/generic/ondemand/value-inl.h for westmere */ +/* end file simdjson/generic/ondemand/array_iterator-inl.h for lsx */ +/* including simdjson/generic/ondemand/value-inl.h for lsx: #include "simdjson/generic/ondemand/value-inl.h" */ +/* begin file simdjson/generic/ondemand/value-inl.h for lsx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -115927,7 +150455,7 @@ simdjson_inline bool simdjson_result<westmere::ondemand::array_iterator>::at_end /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace westmere { +namespace lsx { namespace ondemand { simdjson_inline value::value(const value_iterator &_iter) noexcept @@ -116224,240 +150752,240 @@ inline simdjson_result<std::vector<value>> value::at_path_with_wildcard(std::str } } // namespace ondemand -} // namespace westmere +} // namespace lsx } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<westmere::ondemand::value>::simdjson_result( - westmere::ondemand::value &&value +simdjson_inline simdjson_result<lsx::ondemand::value>::simdjson_result( + lsx::ondemand::value &&value ) noexcept : - implementation_simdjson_result_base<westmere::ondemand::value>( - std::forward<westmere::ondemand::value>(value) + implementation_simdjson_result_base<lsx::ondemand::value>( + std::forward<lsx::ondemand::value>(value) ) { } -simdjson_inline simdjson_result<westmere::ondemand::value>::simdjson_result( +simdjson_inline simdjson_result<lsx::ondemand::value>::simdjson_result( error_code error ) noexcept : - implementation_simdjson_result_base<westmere::ondemand::value>(error) + implementation_simdjson_result_base<lsx::ondemand::value>(error) { } -simdjson_inline simdjson_result<size_t> simdjson_result<westmere::ondemand::value>::count_elements() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<lsx::ondemand::value>::count_elements() & noexcept { if (error()) { return error(); } return first.count_elements(); } -simdjson_inline simdjson_result<size_t> simdjson_result<westmere::ondemand::value>::count_fields() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<lsx::ondemand::value>::count_fields() & noexcept { if (error()) { return error(); } return first.count_fields(); } -simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::value>::at(size_t index) noexcept { +simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::value>::at(size_t index) noexcept { if (error()) { return error(); } return first.at(index); } -simdjson_inline simdjson_result<westmere::ondemand::array_iterator> simdjson_result<westmere::ondemand::value>::begin() & noexcept { +simdjson_inline simdjson_result<lsx::ondemand::array_iterator> simdjson_result<lsx::ondemand::value>::begin() & noexcept { if (error()) { return error(); } return first.begin(); } -simdjson_inline simdjson_result<westmere::ondemand::array_iterator> simdjson_result<westmere::ondemand::value>::end() & noexcept { +simdjson_inline simdjson_result<lsx::ondemand::array_iterator> simdjson_result<lsx::ondemand::value>::end() & noexcept { if (error()) { return error(); } return {}; } -simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::value>::find_field(std::string_view key) noexcept { +simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::value>::find_field(std::string_view key) noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::value>::find_field(const char *key) noexcept { +simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::value>::find_field(const char *key) noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::value>::find_field_unordered(std::string_view key) noexcept { +simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::value>::find_field_unordered(std::string_view key) noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::value>::find_field_unordered(const char *key) noexcept { +simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::value>::find_field_unordered(const char *key) noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::value>::operator[](std::string_view key) noexcept { +simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::value>::operator[](std::string_view key) noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::value>::operator[](const char *key) noexcept { +simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::value>::operator[](const char *key) noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<westmere::ondemand::array> simdjson_result<westmere::ondemand::value>::get_array() noexcept { +simdjson_inline simdjson_result<lsx::ondemand::array> simdjson_result<lsx::ondemand::value>::get_array() noexcept { if (error()) { return error(); } return first.get_array(); } -simdjson_inline simdjson_result<westmere::ondemand::object> simdjson_result<westmere::ondemand::value>::get_object() noexcept { +simdjson_inline simdjson_result<lsx::ondemand::object> simdjson_result<lsx::ondemand::value>::get_object() noexcept { if (error()) { return error(); } return first.get_object(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<westmere::ondemand::value>::get_uint64() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<lsx::ondemand::value>::get_uint64() noexcept { if (error()) { return error(); } return first.get_uint64(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<westmere::ondemand::value>::get_uint64_in_string() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<lsx::ondemand::value>::get_uint64_in_string() noexcept { if (error()) { return error(); } return first.get_uint64_in_string(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<westmere::ondemand::value>::get_int64() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<lsx::ondemand::value>::get_int64() noexcept { if (error()) { return error(); } return first.get_int64(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<westmere::ondemand::value>::get_int64_in_string() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<lsx::ondemand::value>::get_int64_in_string() noexcept { if (error()) { return error(); } return first.get_int64_in_string(); } -simdjson_inline simdjson_result<double> simdjson_result<westmere::ondemand::value>::get_double() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<lsx::ondemand::value>::get_double() noexcept { if (error()) { return error(); } return first.get_double(); } -simdjson_inline simdjson_result<double> simdjson_result<westmere::ondemand::value>::get_double_in_string() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<lsx::ondemand::value>::get_double_in_string() noexcept { if (error()) { return error(); } return first.get_double_in_string(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<westmere::ondemand::value>::get_string(bool allow_replacement) noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<lsx::ondemand::value>::get_string(bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(allow_replacement); } template <typename string_type> -simdjson_inline error_code simdjson_result<westmere::ondemand::value>::get_string(string_type& receiver, bool allow_replacement) noexcept { +simdjson_inline error_code simdjson_result<lsx::ondemand::value>::get_string(string_type& receiver, bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(receiver, allow_replacement); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<westmere::ondemand::value>::get_wobbly_string() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<lsx::ondemand::value>::get_wobbly_string() noexcept { if (error()) { return error(); } return first.get_wobbly_string(); } -simdjson_inline simdjson_result<westmere::ondemand::raw_json_string> simdjson_result<westmere::ondemand::value>::get_raw_json_string() noexcept { +simdjson_inline simdjson_result<lsx::ondemand::raw_json_string> simdjson_result<lsx::ondemand::value>::get_raw_json_string() noexcept { if (error()) { return error(); } return first.get_raw_json_string(); } -simdjson_inline simdjson_result<bool> simdjson_result<westmere::ondemand::value>::get_bool() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<lsx::ondemand::value>::get_bool() noexcept { if (error()) { return error(); } return first.get_bool(); } -simdjson_inline simdjson_result<bool> simdjson_result<westmere::ondemand::value>::is_null() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<lsx::ondemand::value>::is_null() noexcept { if (error()) { return error(); } return first.is_null(); } -template<> simdjson_inline error_code simdjson_result<westmere::ondemand::value>::get<westmere::ondemand::value>(westmere::ondemand::value &out) noexcept { +template<> simdjson_inline error_code simdjson_result<lsx::ondemand::value>::get<lsx::ondemand::value>(lsx::ondemand::value &out) noexcept { if (error()) { return error(); } out = first; return SUCCESS; } -template<typename T> simdjson_inline simdjson_result<T> simdjson_result<westmere::ondemand::value>::get() noexcept { +template<typename T> simdjson_inline simdjson_result<T> simdjson_result<lsx::ondemand::value>::get() noexcept { if (error()) { return error(); } return first.get<T>(); } -template<typename T> simdjson_inline error_code simdjson_result<westmere::ondemand::value>::get(T &out) noexcept { +template<typename T> simdjson_inline error_code simdjson_result<lsx::ondemand::value>::get(T &out) noexcept { if (error()) { return error(); } return first.get<T>(out); } -template<> simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::value>::get<westmere::ondemand::value>() noexcept { +template<> simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::value>::get<lsx::ondemand::value>() noexcept { if (error()) { return error(); } return std::move(first); } -simdjson_inline simdjson_result<westmere::ondemand::json_type> simdjson_result<westmere::ondemand::value>::type() noexcept { +simdjson_inline simdjson_result<lsx::ondemand::json_type> simdjson_result<lsx::ondemand::value>::type() noexcept { if (error()) { return error(); } return first.type(); } -simdjson_inline simdjson_result<bool> simdjson_result<westmere::ondemand::value>::is_scalar() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<lsx::ondemand::value>::is_scalar() noexcept { if (error()) { return error(); } return first.is_scalar(); } -simdjson_inline simdjson_result<bool> simdjson_result<westmere::ondemand::value>::is_string() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<lsx::ondemand::value>::is_string() noexcept { if (error()) { return error(); } return first.is_string(); } -simdjson_inline simdjson_result<bool> simdjson_result<westmere::ondemand::value>::is_negative() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<lsx::ondemand::value>::is_negative() noexcept { if (error()) { return error(); } return first.is_negative(); } -simdjson_inline simdjson_result<bool> simdjson_result<westmere::ondemand::value>::is_integer() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<lsx::ondemand::value>::is_integer() noexcept { if (error()) { return error(); } return first.is_integer(); } -simdjson_inline simdjson_result<westmere::number_type> simdjson_result<westmere::ondemand::value>::get_number_type() noexcept { +simdjson_inline simdjson_result<lsx::number_type> simdjson_result<lsx::ondemand::value>::get_number_type() noexcept { if (error()) { return error(); } return first.get_number_type(); } -simdjson_inline simdjson_result<westmere::ondemand::number> simdjson_result<westmere::ondemand::value>::get_number() noexcept { +simdjson_inline simdjson_result<lsx::ondemand::number> simdjson_result<lsx::ondemand::value>::get_number() noexcept { if (error()) { return error(); } return first.get_number(); } #if SIMDJSON_EXCEPTIONS template <class T> -simdjson_inline simdjson_result<westmere::ondemand::value>::operator T() noexcept(false) { +simdjson_inline simdjson_result<lsx::ondemand::value>::operator T() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first.get<T>(); } -simdjson_inline simdjson_result<westmere::ondemand::value>::operator westmere::ondemand::array() noexcept(false) { +simdjson_inline simdjson_result<lsx::ondemand::value>::operator lsx::ondemand::array() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<westmere::ondemand::value>::operator westmere::ondemand::object() noexcept(false) { +simdjson_inline simdjson_result<lsx::ondemand::value>::operator lsx::ondemand::object() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<westmere::ondemand::value>::operator uint64_t() noexcept(false) { +simdjson_inline simdjson_result<lsx::ondemand::value>::operator uint64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<westmere::ondemand::value>::operator int64_t() noexcept(false) { +simdjson_inline simdjson_result<lsx::ondemand::value>::operator int64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<westmere::ondemand::value>::operator double() noexcept(false) { +simdjson_inline simdjson_result<lsx::ondemand::value>::operator double() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<westmere::ondemand::value>::operator std::string_view() noexcept(false) { +simdjson_inline simdjson_result<lsx::ondemand::value>::operator std::string_view() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<westmere::ondemand::value>::operator westmere::ondemand::raw_json_string() noexcept(false) { +simdjson_inline simdjson_result<lsx::ondemand::value>::operator lsx::ondemand::raw_json_string() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<westmere::ondemand::value>::operator bool() noexcept(false) { +simdjson_inline simdjson_result<lsx::ondemand::value>::operator bool() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } #endif -simdjson_inline simdjson_result<std::string_view> simdjson_result<westmere::ondemand::value>::raw_json_token() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<lsx::ondemand::value>::raw_json_token() noexcept { if (error()) { return error(); } return first.raw_json_token(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<westmere::ondemand::value>::raw_json() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<lsx::ondemand::value>::raw_json() noexcept { if (error()) { return error(); } return first.raw_json(); } -simdjson_inline simdjson_result<const char *> simdjson_result<westmere::ondemand::value>::current_location() noexcept { +simdjson_inline simdjson_result<const char *> simdjson_result<lsx::ondemand::value>::current_location() noexcept { if (error()) { return error(); } return first.current_location(); } -simdjson_inline simdjson_result<int32_t> simdjson_result<westmere::ondemand::value>::current_depth() const noexcept { +simdjson_inline simdjson_result<int32_t> simdjson_result<lsx::ondemand::value>::current_depth() const noexcept { if (error()) { return error(); } return first.current_depth(); } -simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::value>::at_pointer( +simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::value>::at_pointer( std::string_view json_pointer) noexcept { if (error()) { return error(); @@ -116465,7 +150993,7 @@ simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westm return first.at_pointer(json_pointer); } -simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::value>::at_path( +simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::value>::at_path( std::string_view json_path) noexcept { if (error()) { return error(); @@ -116473,7 +151001,7 @@ simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westm return first.at_path(json_path); } -inline simdjson_result<std::vector<westmere::ondemand::value>> simdjson_result<westmere::ondemand::value>::at_path_with_wildcard( +inline simdjson_result<std::vector<lsx::ondemand::value>> simdjson_result<lsx::ondemand::value>::at_path_with_wildcard( std::string_view json_path) noexcept { if (error()) { return error(); @@ -116484,9 +151012,9 @@ inline simdjson_result<std::vector<westmere::ondemand::value>> simdjson_result<w } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_INL_H -/* end file simdjson/generic/ondemand/value-inl.h for westmere */ -/* including simdjson/generic/ondemand/document-inl.h for westmere: #include "simdjson/generic/ondemand/document-inl.h" */ -/* begin file simdjson/generic/ondemand/document-inl.h for westmere */ +/* end file simdjson/generic/ondemand/value-inl.h for lsx */ +/* including simdjson/generic/ondemand/document-inl.h for lsx: #include "simdjson/generic/ondemand/document-inl.h" */ +/* begin file simdjson/generic/ondemand/document-inl.h for lsx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -116506,7 +151034,7 @@ inline simdjson_result<std::vector<westmere::ondemand::value>> simdjson_result<w /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace westmere { +namespace lsx { namespace ondemand { simdjson_inline document::document(ondemand::json_iterator &&_iter) noexcept @@ -116900,283 +151428,283 @@ simdjson_warn_unused simdjson_inline error_code document::extract_into(T& out) & #endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION } // namespace ondemand -} // namespace westmere +} // namespace lsx } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<westmere::ondemand::document>::simdjson_result( - westmere::ondemand::document &&value +simdjson_inline simdjson_result<lsx::ondemand::document>::simdjson_result( + lsx::ondemand::document &&value ) noexcept : - implementation_simdjson_result_base<westmere::ondemand::document>( - std::forward<westmere::ondemand::document>(value) + implementation_simdjson_result_base<lsx::ondemand::document>( + std::forward<lsx::ondemand::document>(value) ) { } -simdjson_inline simdjson_result<westmere::ondemand::document>::simdjson_result( +simdjson_inline simdjson_result<lsx::ondemand::document>::simdjson_result( error_code error ) noexcept : - implementation_simdjson_result_base<westmere::ondemand::document>( + implementation_simdjson_result_base<lsx::ondemand::document>( error ) { } -simdjson_inline simdjson_result<size_t> simdjson_result<westmere::ondemand::document>::count_elements() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<lsx::ondemand::document>::count_elements() & noexcept { if (error()) { return error(); } return first.count_elements(); } -simdjson_inline simdjson_result<size_t> simdjson_result<westmere::ondemand::document>::count_fields() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<lsx::ondemand::document>::count_fields() & noexcept { if (error()) { return error(); } return first.count_fields(); } -simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::document>::at(size_t index) & noexcept { +simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::document>::at(size_t index) & noexcept { if (error()) { return error(); } return first.at(index); } -simdjson_inline error_code simdjson_result<westmere::ondemand::document>::rewind() noexcept { +simdjson_inline error_code simdjson_result<lsx::ondemand::document>::rewind() noexcept { if (error()) { return error(); } first.rewind(); return SUCCESS; } -simdjson_inline simdjson_result<westmere::ondemand::array_iterator> simdjson_result<westmere::ondemand::document>::begin() & noexcept { +simdjson_inline simdjson_result<lsx::ondemand::array_iterator> simdjson_result<lsx::ondemand::document>::begin() & noexcept { if (error()) { return error(); } return first.begin(); } -simdjson_inline simdjson_result<westmere::ondemand::array_iterator> simdjson_result<westmere::ondemand::document>::end() & noexcept { +simdjson_inline simdjson_result<lsx::ondemand::array_iterator> simdjson_result<lsx::ondemand::document>::end() & noexcept { return {}; } -simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::document>::find_field_unordered(std::string_view key) & noexcept { +simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::document>::find_field_unordered(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::document>::find_field_unordered(const char *key) & noexcept { +simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::document>::find_field_unordered(const char *key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::document>::operator[](std::string_view key) & noexcept { +simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::document>::operator[](std::string_view key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::document>::operator[](const char *key) & noexcept { +simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::document>::operator[](const char *key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::document>::find_field(std::string_view key) & noexcept { +simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::document>::find_field(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::document>::find_field(const char *key) & noexcept { +simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::document>::find_field(const char *key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<westmere::ondemand::array> simdjson_result<westmere::ondemand::document>::get_array() & noexcept { +simdjson_inline simdjson_result<lsx::ondemand::array> simdjson_result<lsx::ondemand::document>::get_array() & noexcept { if (error()) { return error(); } return first.get_array(); } -simdjson_inline simdjson_result<westmere::ondemand::object> simdjson_result<westmere::ondemand::document>::get_object() & noexcept { +simdjson_inline simdjson_result<lsx::ondemand::object> simdjson_result<lsx::ondemand::document>::get_object() & noexcept { if (error()) { return error(); } return first.get_object(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<westmere::ondemand::document>::get_uint64() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<lsx::ondemand::document>::get_uint64() noexcept { if (error()) { return error(); } return first.get_uint64(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<westmere::ondemand::document>::get_uint64_in_string() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<lsx::ondemand::document>::get_uint64_in_string() noexcept { if (error()) { return error(); } return first.get_uint64_in_string(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<westmere::ondemand::document>::get_int64() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<lsx::ondemand::document>::get_int64() noexcept { if (error()) { return error(); } return first.get_int64(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<westmere::ondemand::document>::get_int64_in_string() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<lsx::ondemand::document>::get_int64_in_string() noexcept { if (error()) { return error(); } return first.get_int64_in_string(); } -simdjson_inline simdjson_result<double> simdjson_result<westmere::ondemand::document>::get_double() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<lsx::ondemand::document>::get_double() noexcept { if (error()) { return error(); } return first.get_double(); } -simdjson_inline simdjson_result<double> simdjson_result<westmere::ondemand::document>::get_double_in_string() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<lsx::ondemand::document>::get_double_in_string() noexcept { if (error()) { return error(); } return first.get_double_in_string(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<westmere::ondemand::document>::get_string(bool allow_replacement) noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<lsx::ondemand::document>::get_string(bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(allow_replacement); } template <typename string_type> -simdjson_warn_unused simdjson_inline error_code simdjson_result<westmere::ondemand::document>::get_string(string_type& receiver, bool allow_replacement) noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<lsx::ondemand::document>::get_string(string_type& receiver, bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(receiver, allow_replacement); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<westmere::ondemand::document>::get_wobbly_string() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<lsx::ondemand::document>::get_wobbly_string() noexcept { if (error()) { return error(); } return first.get_wobbly_string(); } -simdjson_inline simdjson_result<westmere::ondemand::raw_json_string> simdjson_result<westmere::ondemand::document>::get_raw_json_string() noexcept { +simdjson_inline simdjson_result<lsx::ondemand::raw_json_string> simdjson_result<lsx::ondemand::document>::get_raw_json_string() noexcept { if (error()) { return error(); } return first.get_raw_json_string(); } -simdjson_inline simdjson_result<bool> simdjson_result<westmere::ondemand::document>::get_bool() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<lsx::ondemand::document>::get_bool() noexcept { if (error()) { return error(); } return first.get_bool(); } -simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::document>::get_value() noexcept { +simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::document>::get_value() noexcept { if (error()) { return error(); } return first.get_value(); } -simdjson_inline simdjson_result<bool> simdjson_result<westmere::ondemand::document>::is_null() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<lsx::ondemand::document>::is_null() noexcept { if (error()) { return error(); } return first.is_null(); } template<typename T> -simdjson_inline simdjson_result<T> simdjson_result<westmere::ondemand::document>::get() & noexcept { +simdjson_inline simdjson_result<T> simdjson_result<lsx::ondemand::document>::get() & noexcept { if (error()) { return error(); } return first.get<T>(); } template<typename T> -simdjson_deprecated simdjson_inline simdjson_result<T> simdjson_result<westmere::ondemand::document>::get() && noexcept { +simdjson_deprecated simdjson_inline simdjson_result<T> simdjson_result<lsx::ondemand::document>::get() && noexcept { if (error()) { return error(); } - return std::forward<westmere::ondemand::document>(first).get<T>(); + return std::forward<lsx::ondemand::document>(first).get<T>(); } template<typename T> -simdjson_warn_unused simdjson_inline error_code simdjson_result<westmere::ondemand::document>::get(T &out) & noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<lsx::ondemand::document>::get(T &out) & noexcept { if (error()) { return error(); } return first.get<T>(out); } template<typename T> -simdjson_warn_unused simdjson_inline error_code simdjson_result<westmere::ondemand::document>::get(T &out) && noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<lsx::ondemand::document>::get(T &out) && noexcept { if (error()) { return error(); } - return std::forward<westmere::ondemand::document>(first).get<T>(out); + return std::forward<lsx::ondemand::document>(first).get<T>(out); } -template<> simdjson_inline simdjson_result<westmere::ondemand::document> simdjson_result<westmere::ondemand::document>::get<westmere::ondemand::document>() & noexcept = delete; -template<> simdjson_deprecated simdjson_inline simdjson_result<westmere::ondemand::document> simdjson_result<westmere::ondemand::document>::get<westmere::ondemand::document>() && noexcept { +template<> simdjson_inline simdjson_result<lsx::ondemand::document> simdjson_result<lsx::ondemand::document>::get<lsx::ondemand::document>() & noexcept = delete; +template<> simdjson_deprecated simdjson_inline simdjson_result<lsx::ondemand::document> simdjson_result<lsx::ondemand::document>::get<lsx::ondemand::document>() && noexcept { if (error()) { return error(); } - return std::forward<westmere::ondemand::document>(first); + return std::forward<lsx::ondemand::document>(first); } -template<> simdjson_warn_unused simdjson_inline error_code simdjson_result<westmere::ondemand::document>::get<westmere::ondemand::document>(westmere::ondemand::document &out) & noexcept = delete; -template<> simdjson_warn_unused simdjson_inline error_code simdjson_result<westmere::ondemand::document>::get<westmere::ondemand::document>(westmere::ondemand::document &out) && noexcept { +template<> simdjson_warn_unused simdjson_inline error_code simdjson_result<lsx::ondemand::document>::get<lsx::ondemand::document>(lsx::ondemand::document &out) & noexcept = delete; +template<> simdjson_warn_unused simdjson_inline error_code simdjson_result<lsx::ondemand::document>::get<lsx::ondemand::document>(lsx::ondemand::document &out) && noexcept { if (error()) { return error(); } - out = std::forward<westmere::ondemand::document>(first); + out = std::forward<lsx::ondemand::document>(first); return SUCCESS; } -simdjson_inline simdjson_result<westmere::ondemand::json_type> simdjson_result<westmere::ondemand::document>::type() noexcept { +simdjson_inline simdjson_result<lsx::ondemand::json_type> simdjson_result<lsx::ondemand::document>::type() noexcept { if (error()) { return error(); } return first.type(); } -simdjson_inline simdjson_result<bool> simdjson_result<westmere::ondemand::document>::is_scalar() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<lsx::ondemand::document>::is_scalar() noexcept { if (error()) { return error(); } return first.is_scalar(); } -simdjson_inline simdjson_result<bool> simdjson_result<westmere::ondemand::document>::is_string() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<lsx::ondemand::document>::is_string() noexcept { if (error()) { return error(); } return first.is_string(); } -simdjson_inline bool simdjson_result<westmere::ondemand::document>::is_negative() noexcept { +simdjson_inline bool simdjson_result<lsx::ondemand::document>::is_negative() noexcept { if (error()) { return error(); } return first.is_negative(); } -simdjson_inline simdjson_result<bool> simdjson_result<westmere::ondemand::document>::is_integer() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<lsx::ondemand::document>::is_integer() noexcept { if (error()) { return error(); } return first.is_integer(); } -simdjson_inline simdjson_result<westmere::number_type> simdjson_result<westmere::ondemand::document>::get_number_type() noexcept { +simdjson_inline simdjson_result<lsx::number_type> simdjson_result<lsx::ondemand::document>::get_number_type() noexcept { if (error()) { return error(); } return first.get_number_type(); } -simdjson_inline simdjson_result<westmere::ondemand::number> simdjson_result<westmere::ondemand::document>::get_number() noexcept { +simdjson_inline simdjson_result<lsx::ondemand::number> simdjson_result<lsx::ondemand::document>::get_number() noexcept { if (error()) { return error(); } return first.get_number(); } #if SIMDJSON_EXCEPTIONS -template <class T, typename std::enable_if<std::is_same<T, westmere::ondemand::document>::value == false>::type> -simdjson_inline simdjson_result<westmere::ondemand::document>::operator T() noexcept(false) { +template <class T, typename std::enable_if<std::is_same<T, lsx::ondemand::document>::value == false>::type> +simdjson_inline simdjson_result<lsx::ondemand::document>::operator T() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<westmere::ondemand::document>::operator westmere::ondemand::array() & noexcept(false) { +simdjson_inline simdjson_result<lsx::ondemand::document>::operator lsx::ondemand::array() & noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<westmere::ondemand::document>::operator westmere::ondemand::object() & noexcept(false) { +simdjson_inline simdjson_result<lsx::ondemand::document>::operator lsx::ondemand::object() & noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<westmere::ondemand::document>::operator uint64_t() noexcept(false) { +simdjson_inline simdjson_result<lsx::ondemand::document>::operator uint64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<westmere::ondemand::document>::operator int64_t() noexcept(false) { +simdjson_inline simdjson_result<lsx::ondemand::document>::operator int64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<westmere::ondemand::document>::operator double() noexcept(false) { +simdjson_inline simdjson_result<lsx::ondemand::document>::operator double() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<westmere::ondemand::document>::operator std::string_view() noexcept(false) { +simdjson_inline simdjson_result<lsx::ondemand::document>::operator std::string_view() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<westmere::ondemand::document>::operator westmere::ondemand::raw_json_string() noexcept(false) { +simdjson_inline simdjson_result<lsx::ondemand::document>::operator lsx::ondemand::raw_json_string() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<westmere::ondemand::document>::operator bool() noexcept(false) { +simdjson_inline simdjson_result<lsx::ondemand::document>::operator bool() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<westmere::ondemand::document>::operator westmere::ondemand::value() noexcept(false) { +simdjson_inline simdjson_result<lsx::ondemand::document>::operator lsx::ondemand::value() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } #endif -simdjson_inline simdjson_result<const char *> simdjson_result<westmere::ondemand::document>::current_location() noexcept { +simdjson_inline simdjson_result<const char *> simdjson_result<lsx::ondemand::document>::current_location() noexcept { if (error()) { return error(); } return first.current_location(); } -simdjson_inline bool simdjson_result<westmere::ondemand::document>::at_end() const noexcept { +simdjson_inline bool simdjson_result<lsx::ondemand::document>::at_end() const noexcept { if (error()) { return error(); } return first.at_end(); } -simdjson_inline int32_t simdjson_result<westmere::ondemand::document>::current_depth() const noexcept { +simdjson_inline int32_t simdjson_result<lsx::ondemand::document>::current_depth() const noexcept { if (error()) { return error(); } return first.current_depth(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<westmere::ondemand::document>::raw_json_token() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<lsx::ondemand::document>::raw_json_token() noexcept { if (error()) { return error(); } return first.raw_json_token(); } -simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::document>::at_pointer(std::string_view json_pointer) noexcept { +simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::document>::at_pointer(std::string_view json_pointer) noexcept { if (error()) { return error(); } return first.at_pointer(json_pointer); } -simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::document>::at_path(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::document>::at_path(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path(json_path); } -simdjson_inline simdjson_result<std::vector<westmere::ondemand::value>> simdjson_result<westmere::ondemand::document>::at_path_with_wildcard(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<std::vector<lsx::ondemand::value>> simdjson_result<lsx::ondemand::document>::at_path_with_wildcard(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path_with_wildcard(json_path); } @@ -117184,7 +151712,7 @@ simdjson_inline simdjson_result<std::vector<westmere::ondemand::value>> simdjson #if SIMDJSON_STATIC_REFLECTION template<constevalutil::fixed_string... FieldNames, typename T> requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) -simdjson_warn_unused simdjson_inline error_code simdjson_result<westmere::ondemand::document>::extract_into(T& out) & noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<lsx::ondemand::document>::extract_into(T& out) & noexcept { if (error()) { return error(); } return first.extract_into<FieldNames...>(out); } @@ -117194,7 +151722,7 @@ simdjson_warn_unused simdjson_inline error_code simdjson_result<westmere::ondema namespace simdjson { -namespace westmere { +namespace lsx { namespace ondemand { simdjson_inline document_reference::document_reference() noexcept : doc{nullptr} {} @@ -117286,253 +151814,253 @@ simdjson_warn_unused simdjson_inline error_code document_reference::extract_into } #endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION } // namespace ondemand -} // namespace westmere +} // namespace lsx } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<westmere::ondemand::document_reference>::simdjson_result(westmere::ondemand::document_reference value, error_code error) - noexcept : implementation_simdjson_result_base<westmere::ondemand::document_reference>(std::forward<westmere::ondemand::document_reference>(value), error) {} +simdjson_inline simdjson_result<lsx::ondemand::document_reference>::simdjson_result(lsx::ondemand::document_reference value, error_code error) + noexcept : implementation_simdjson_result_base<lsx::ondemand::document_reference>(std::forward<lsx::ondemand::document_reference>(value), error) {} -simdjson_inline simdjson_result<size_t> simdjson_result<westmere::ondemand::document_reference>::count_elements() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<lsx::ondemand::document_reference>::count_elements() & noexcept { if (error()) { return error(); } return first.count_elements(); } -simdjson_inline simdjson_result<size_t> simdjson_result<westmere::ondemand::document_reference>::count_fields() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<lsx::ondemand::document_reference>::count_fields() & noexcept { if (error()) { return error(); } return first.count_fields(); } -simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::document_reference>::at(size_t index) & noexcept { +simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::document_reference>::at(size_t index) & noexcept { if (error()) { return error(); } return first.at(index); } -simdjson_inline error_code simdjson_result<westmere::ondemand::document_reference>::rewind() noexcept { +simdjson_inline error_code simdjson_result<lsx::ondemand::document_reference>::rewind() noexcept { if (error()) { return error(); } first.rewind(); return SUCCESS; } -simdjson_inline simdjson_result<westmere::ondemand::array_iterator> simdjson_result<westmere::ondemand::document_reference>::begin() & noexcept { +simdjson_inline simdjson_result<lsx::ondemand::array_iterator> simdjson_result<lsx::ondemand::document_reference>::begin() & noexcept { if (error()) { return error(); } return first.begin(); } -simdjson_inline simdjson_result<westmere::ondemand::array_iterator> simdjson_result<westmere::ondemand::document_reference>::end() & noexcept { +simdjson_inline simdjson_result<lsx::ondemand::array_iterator> simdjson_result<lsx::ondemand::document_reference>::end() & noexcept { return {}; } -simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::document_reference>::find_field_unordered(std::string_view key) & noexcept { +simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::document_reference>::find_field_unordered(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::document_reference>::find_field_unordered(const char *key) & noexcept { +simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::document_reference>::find_field_unordered(const char *key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::document_reference>::operator[](std::string_view key) & noexcept { +simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::document_reference>::operator[](std::string_view key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::document_reference>::operator[](const char *key) & noexcept { +simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::document_reference>::operator[](const char *key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::document_reference>::find_field(std::string_view key) & noexcept { +simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::document_reference>::find_field(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::document_reference>::find_field(const char *key) & noexcept { +simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::document_reference>::find_field(const char *key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<westmere::ondemand::array> simdjson_result<westmere::ondemand::document_reference>::get_array() & noexcept { +simdjson_inline simdjson_result<lsx::ondemand::array> simdjson_result<lsx::ondemand::document_reference>::get_array() & noexcept { if (error()) { return error(); } return first.get_array(); } -simdjson_inline simdjson_result<westmere::ondemand::object> simdjson_result<westmere::ondemand::document_reference>::get_object() & noexcept { +simdjson_inline simdjson_result<lsx::ondemand::object> simdjson_result<lsx::ondemand::document_reference>::get_object() & noexcept { if (error()) { return error(); } return first.get_object(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<westmere::ondemand::document_reference>::get_uint64() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<lsx::ondemand::document_reference>::get_uint64() noexcept { if (error()) { return error(); } return first.get_uint64(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<westmere::ondemand::document_reference>::get_uint64_in_string() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<lsx::ondemand::document_reference>::get_uint64_in_string() noexcept { if (error()) { return error(); } return first.get_uint64_in_string(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<westmere::ondemand::document_reference>::get_int64() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<lsx::ondemand::document_reference>::get_int64() noexcept { if (error()) { return error(); } return first.get_int64(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<westmere::ondemand::document_reference>::get_int64_in_string() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<lsx::ondemand::document_reference>::get_int64_in_string() noexcept { if (error()) { return error(); } return first.get_int64_in_string(); } -simdjson_inline simdjson_result<double> simdjson_result<westmere::ondemand::document_reference>::get_double() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<lsx::ondemand::document_reference>::get_double() noexcept { if (error()) { return error(); } return first.get_double(); } -simdjson_inline simdjson_result<double> simdjson_result<westmere::ondemand::document_reference>::get_double_in_string() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<lsx::ondemand::document_reference>::get_double_in_string() noexcept { if (error()) { return error(); } return first.get_double_in_string(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<westmere::ondemand::document_reference>::get_string(bool allow_replacement) noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<lsx::ondemand::document_reference>::get_string(bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(allow_replacement); } template <typename string_type> -simdjson_warn_unused simdjson_inline error_code simdjson_result<westmere::ondemand::document_reference>::get_string(string_type& receiver, bool allow_replacement) noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<lsx::ondemand::document_reference>::get_string(string_type& receiver, bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(receiver, allow_replacement); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<westmere::ondemand::document_reference>::get_wobbly_string() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<lsx::ondemand::document_reference>::get_wobbly_string() noexcept { if (error()) { return error(); } return first.get_wobbly_string(); } -simdjson_inline simdjson_result<westmere::ondemand::raw_json_string> simdjson_result<westmere::ondemand::document_reference>::get_raw_json_string() noexcept { +simdjson_inline simdjson_result<lsx::ondemand::raw_json_string> simdjson_result<lsx::ondemand::document_reference>::get_raw_json_string() noexcept { if (error()) { return error(); } return first.get_raw_json_string(); } -simdjson_inline simdjson_result<bool> simdjson_result<westmere::ondemand::document_reference>::get_bool() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<lsx::ondemand::document_reference>::get_bool() noexcept { if (error()) { return error(); } return first.get_bool(); } -simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::document_reference>::get_value() noexcept { +simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::document_reference>::get_value() noexcept { if (error()) { return error(); } return first.get_value(); } -simdjson_inline simdjson_result<bool> simdjson_result<westmere::ondemand::document_reference>::is_null() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<lsx::ondemand::document_reference>::is_null() noexcept { if (error()) { return error(); } return first.is_null(); } template<typename T> -simdjson_inline simdjson_result<T> simdjson_result<westmere::ondemand::document_reference>::get() & noexcept { +simdjson_inline simdjson_result<T> simdjson_result<lsx::ondemand::document_reference>::get() & noexcept { if (error()) { return error(); } return first.get<T>(); } template<typename T> -simdjson_inline simdjson_result<T> simdjson_result<westmere::ondemand::document_reference>::get() && noexcept { +simdjson_inline simdjson_result<T> simdjson_result<lsx::ondemand::document_reference>::get() && noexcept { if (error()) { return error(); } - return std::forward<westmere::ondemand::document_reference>(first).get<T>(); + return std::forward<lsx::ondemand::document_reference>(first).get<T>(); } template <class T> -simdjson_warn_unused simdjson_inline error_code simdjson_result<westmere::ondemand::document_reference>::get(T &out) & noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<lsx::ondemand::document_reference>::get(T &out) & noexcept { if (error()) { return error(); } return first.get<T>(out); } template <class T> -simdjson_warn_unused simdjson_inline error_code simdjson_result<westmere::ondemand::document_reference>::get(T &out) && noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<lsx::ondemand::document_reference>::get(T &out) && noexcept { if (error()) { return error(); } - return std::forward<westmere::ondemand::document_reference>(first).get<T>(out); + return std::forward<lsx::ondemand::document_reference>(first).get<T>(out); } -simdjson_inline simdjson_result<westmere::ondemand::json_type> simdjson_result<westmere::ondemand::document_reference>::type() noexcept { +simdjson_inline simdjson_result<lsx::ondemand::json_type> simdjson_result<lsx::ondemand::document_reference>::type() noexcept { if (error()) { return error(); } return first.type(); } -simdjson_inline simdjson_result<bool> simdjson_result<westmere::ondemand::document_reference>::is_scalar() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<lsx::ondemand::document_reference>::is_scalar() noexcept { if (error()) { return error(); } return first.is_scalar(); } -simdjson_inline simdjson_result<bool> simdjson_result<westmere::ondemand::document_reference>::is_string() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<lsx::ondemand::document_reference>::is_string() noexcept { if (error()) { return error(); } return first.is_string(); } template <> -simdjson_warn_unused simdjson_inline error_code simdjson_result<westmere::ondemand::document_reference>::get(westmere::ondemand::document_reference &out) & noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<lsx::ondemand::document_reference>::get(lsx::ondemand::document_reference &out) & noexcept { if (error()) { return error(); } out = first; return SUCCESS; } template <> -simdjson_warn_unused simdjson_inline error_code simdjson_result<westmere::ondemand::document_reference>::get(westmere::ondemand::document_reference &out) && noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<lsx::ondemand::document_reference>::get(lsx::ondemand::document_reference &out) && noexcept { if (error()) { return error(); } out = first; return SUCCESS; } -simdjson_inline simdjson_result<bool> simdjson_result<westmere::ondemand::document_reference>::is_negative() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<lsx::ondemand::document_reference>::is_negative() noexcept { if (error()) { return error(); } return first.is_negative(); } -simdjson_inline simdjson_result<bool> simdjson_result<westmere::ondemand::document_reference>::is_integer() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<lsx::ondemand::document_reference>::is_integer() noexcept { if (error()) { return error(); } return first.is_integer(); } -simdjson_inline simdjson_result<westmere::number_type> simdjson_result<westmere::ondemand::document_reference>::get_number_type() noexcept { +simdjson_inline simdjson_result<lsx::number_type> simdjson_result<lsx::ondemand::document_reference>::get_number_type() noexcept { if (error()) { return error(); } return first.get_number_type(); } -simdjson_inline simdjson_result<westmere::ondemand::number> simdjson_result<westmere::ondemand::document_reference>::get_number() noexcept { +simdjson_inline simdjson_result<lsx::ondemand::number> simdjson_result<lsx::ondemand::document_reference>::get_number() noexcept { if (error()) { return error(); } return first.get_number(); } #if SIMDJSON_EXCEPTIONS template <class T> -simdjson_inline simdjson_result<westmere::ondemand::document_reference>::operator T() noexcept(false) { - static_assert(std::is_same<T, westmere::ondemand::document_reference>::value == false, "You should not call get<T> when T is a document"); - static_assert(std::is_same<T, westmere::ondemand::document>::value == false, "You should not call get<T> when T is a document"); +simdjson_inline simdjson_result<lsx::ondemand::document_reference>::operator T() noexcept(false) { + static_assert(std::is_same<T, lsx::ondemand::document_reference>::value == false, "You should not call get<T> when T is a document"); + static_assert(std::is_same<T, lsx::ondemand::document>::value == false, "You should not call get<T> when T is a document"); if (error()) { throw simdjson_error(error()); } return first.get<T>(); } -simdjson_inline simdjson_result<westmere::ondemand::document_reference>::operator westmere::ondemand::array() & noexcept(false) { +simdjson_inline simdjson_result<lsx::ondemand::document_reference>::operator lsx::ondemand::array() & noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<westmere::ondemand::document_reference>::operator westmere::ondemand::object() & noexcept(false) { +simdjson_inline simdjson_result<lsx::ondemand::document_reference>::operator lsx::ondemand::object() & noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<westmere::ondemand::document_reference>::operator uint64_t() noexcept(false) { +simdjson_inline simdjson_result<lsx::ondemand::document_reference>::operator uint64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<westmere::ondemand::document_reference>::operator int64_t() noexcept(false) { +simdjson_inline simdjson_result<lsx::ondemand::document_reference>::operator int64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<westmere::ondemand::document_reference>::operator double() noexcept(false) { +simdjson_inline simdjson_result<lsx::ondemand::document_reference>::operator double() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<westmere::ondemand::document_reference>::operator std::string_view() noexcept(false) { +simdjson_inline simdjson_result<lsx::ondemand::document_reference>::operator std::string_view() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<westmere::ondemand::document_reference>::operator westmere::ondemand::raw_json_string() noexcept(false) { +simdjson_inline simdjson_result<lsx::ondemand::document_reference>::operator lsx::ondemand::raw_json_string() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<westmere::ondemand::document_reference>::operator bool() noexcept(false) { +simdjson_inline simdjson_result<lsx::ondemand::document_reference>::operator bool() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<westmere::ondemand::document_reference>::operator westmere::ondemand::value() noexcept(false) { +simdjson_inline simdjson_result<lsx::ondemand::document_reference>::operator lsx::ondemand::value() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } #endif -simdjson_inline simdjson_result<const char *> simdjson_result<westmere::ondemand::document_reference>::current_location() noexcept { +simdjson_inline simdjson_result<const char *> simdjson_result<lsx::ondemand::document_reference>::current_location() noexcept { if (error()) { return error(); } return first.current_location(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<westmere::ondemand::document_reference>::raw_json_token() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<lsx::ondemand::document_reference>::raw_json_token() noexcept { if (error()) { return error(); } return first.raw_json_token(); } -simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::document_reference>::at_pointer(std::string_view json_pointer) noexcept { +simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::document_reference>::at_pointer(std::string_view json_pointer) noexcept { if (error()) { return error(); } return first.at_pointer(json_pointer); } -simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::document_reference>::at_path(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::document_reference>::at_path(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path(json_path); } -simdjson_inline simdjson_result<std::vector<westmere::ondemand::value>> simdjson_result<westmere::ondemand::document_reference>::at_path_with_wildcard(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<std::vector<lsx::ondemand::value>> simdjson_result<lsx::ondemand::document_reference>::at_path_with_wildcard(std::string_view json_path) noexcept { if (error()) { return error(); } @@ -117541,7 +152069,7 @@ simdjson_inline simdjson_result<std::vector<westmere::ondemand::value>> simdjson #if SIMDJSON_STATIC_REFLECTION template<constevalutil::fixed_string... FieldNames, typename T> requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) -simdjson_warn_unused simdjson_inline error_code simdjson_result<westmere::ondemand::document_reference>::extract_into(T& out) & noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<lsx::ondemand::document_reference>::extract_into(T& out) & noexcept { if (error()) { return error(); } return first.extract_into<FieldNames...>(out); } @@ -117549,9 +152077,9 @@ simdjson_warn_unused simdjson_inline error_code simdjson_result<westmere::ondema } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H -/* end file simdjson/generic/ondemand/document-inl.h for westmere */ -/* including simdjson/generic/ondemand/document_stream-inl.h for westmere: #include "simdjson/generic/ondemand/document_stream-inl.h" */ -/* begin file simdjson/generic/ondemand/document_stream-inl.h for westmere */ +/* end file simdjson/generic/ondemand/document-inl.h for lsx */ +/* including simdjson/generic/ondemand/document_stream-inl.h for lsx: #include "simdjson/generic/ondemand/document_stream-inl.h" */ +/* begin file simdjson/generic/ondemand/document_stream-inl.h for lsx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -117566,7 +152094,7 @@ simdjson_warn_unused simdjson_inline error_code simdjson_result<westmere::ondema #include <stdexcept> namespace simdjson { -namespace westmere { +namespace lsx { namespace ondemand { #ifdef SIMDJSON_THREADS_ENABLED @@ -117973,22 +152501,22 @@ inline void document_stream::start_stage1_thread() noexcept { #endif // SIMDJSON_THREADS_ENABLED } // namespace ondemand -} // namespace westmere +} // namespace lsx } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<westmere::ondemand::document_stream>::simdjson_result( +simdjson_inline simdjson_result<lsx::ondemand::document_stream>::simdjson_result( error_code error ) noexcept : - implementation_simdjson_result_base<westmere::ondemand::document_stream>(error) + implementation_simdjson_result_base<lsx::ondemand::document_stream>(error) { } -simdjson_inline simdjson_result<westmere::ondemand::document_stream>::simdjson_result( - westmere::ondemand::document_stream &&value +simdjson_inline simdjson_result<lsx::ondemand::document_stream>::simdjson_result( + lsx::ondemand::document_stream &&value ) noexcept : - implementation_simdjson_result_base<westmere::ondemand::document_stream>( - std::forward<westmere::ondemand::document_stream>(value) + implementation_simdjson_result_base<lsx::ondemand::document_stream>( + std::forward<lsx::ondemand::document_stream>(value) ) { } @@ -117996,9 +152524,9 @@ simdjson_inline simdjson_result<westmere::ondemand::document_stream>::simdjson_r } #endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_INL_H -/* end file simdjson/generic/ondemand/document_stream-inl.h for westmere */ -/* including simdjson/generic/ondemand/field-inl.h for westmere: #include "simdjson/generic/ondemand/field-inl.h" */ -/* begin file simdjson/generic/ondemand/field-inl.h for westmere */ +/* end file simdjson/generic/ondemand/document_stream-inl.h for lsx */ +/* including simdjson/generic/ondemand/field-inl.h for lsx: #include "simdjson/generic/ondemand/field-inl.h" */ +/* begin file simdjson/generic/ondemand/field-inl.h for lsx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -118010,7 +152538,7 @@ simdjson_inline simdjson_result<westmere::ondemand::document_stream>::simdjson_r /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace westmere { +namespace lsx { namespace ondemand { // clang 6 does not think the default constructor can be noexcept, so we make it explicit @@ -118074,53 +152602,53 @@ simdjson_inline value field::value() && noexcept { } } // namespace ondemand -} // namespace westmere +} // namespace lsx } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<westmere::ondemand::field>::simdjson_result( - westmere::ondemand::field &&value +simdjson_inline simdjson_result<lsx::ondemand::field>::simdjson_result( + lsx::ondemand::field &&value ) noexcept : - implementation_simdjson_result_base<westmere::ondemand::field>( - std::forward<westmere::ondemand::field>(value) + implementation_simdjson_result_base<lsx::ondemand::field>( + std::forward<lsx::ondemand::field>(value) ) { } -simdjson_inline simdjson_result<westmere::ondemand::field>::simdjson_result( +simdjson_inline simdjson_result<lsx::ondemand::field>::simdjson_result( error_code error ) noexcept : - implementation_simdjson_result_base<westmere::ondemand::field>(error) + implementation_simdjson_result_base<lsx::ondemand::field>(error) { } -simdjson_inline simdjson_result<westmere::ondemand::raw_json_string> simdjson_result<westmere::ondemand::field>::key() noexcept { +simdjson_inline simdjson_result<lsx::ondemand::raw_json_string> simdjson_result<lsx::ondemand::field>::key() noexcept { if (error()) { return error(); } return first.key(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<westmere::ondemand::field>::key_raw_json_token() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<lsx::ondemand::field>::key_raw_json_token() noexcept { if (error()) { return error(); } return first.key_raw_json_token(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<westmere::ondemand::field>::escaped_key() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<lsx::ondemand::field>::escaped_key() noexcept { if (error()) { return error(); } return first.escaped_key(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<westmere::ondemand::field>::unescaped_key(bool allow_replacement) noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<lsx::ondemand::field>::unescaped_key(bool allow_replacement) noexcept { if (error()) { return error(); } return first.unescaped_key(allow_replacement); } template<typename string_type> -simdjson_warn_unused simdjson_inline error_code simdjson_result<westmere::ondemand::field>::unescaped_key(string_type &receiver, bool allow_replacement) noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<lsx::ondemand::field>::unescaped_key(string_type &receiver, bool allow_replacement) noexcept { if (error()) { return error(); } return first.unescaped_key(receiver, allow_replacement); } -simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::field>::value() noexcept { +simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::field>::value() noexcept { if (error()) { return error(); } return std::move(first.value()); } @@ -118128,9 +152656,9 @@ simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westm } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H -/* end file simdjson/generic/ondemand/field-inl.h for westmere */ -/* including simdjson/generic/ondemand/json_iterator-inl.h for westmere: #include "simdjson/generic/ondemand/json_iterator-inl.h" */ -/* begin file simdjson/generic/ondemand/json_iterator-inl.h for westmere */ +/* end file simdjson/generic/ondemand/field-inl.h for lsx */ +/* including simdjson/generic/ondemand/json_iterator-inl.h for lsx: #include "simdjson/generic/ondemand/json_iterator-inl.h" */ +/* begin file simdjson/generic/ondemand/json_iterator-inl.h for lsx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -118146,7 +152674,7 @@ simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westm /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace westmere { +namespace lsx { namespace ondemand { simdjson_inline json_iterator::json_iterator(json_iterator &&other) noexcept @@ -118348,11 +152876,10 @@ simdjson_inline void json_iterator::assert_more_tokens(uint32_t required_tokens) } simdjson_inline void json_iterator::assert_valid_position(token_position position) const noexcept { + (void)position; // Suppress unused parameter warning #ifndef SIMDJSON_CLANG_VISUAL_STUDIO SIMDJSON_ASSUME( position >= &parser->implementation->structural_indexes[0] ); SIMDJSON_ASSUME( position < &parser->implementation->structural_indexes[parser->implementation->n_structural_indexes] ); -#else - (void)position; // Suppress unused parameter warning #endif } @@ -118491,7 +153018,11 @@ simdjson_inline token_position json_iterator::position() const noexcept { simdjson_inline simdjson_result<std::string_view> json_iterator::unescape(raw_json_string in, bool allow_replacement) noexcept { #if SIMDJSON_DEVELOPMENT_CHECKS auto result = parser->unescape(in, _string_buf_loc, allow_replacement); +#if !defined(SIMDJSON_VISUAL_STUDIO) && !defined(SIMDJSON_CLANG_VISUAL_STUDIO) + // Under Visual Studio, the next SIMDJSON_ASSUME fails with: the argument + // has side effects that will be discarded. SIMDJSON_ASSUME(!parser->string_buffer_overflow(_string_buf_loc)); +#endif // !defined(SIMDJSON_VISUAL_STUDIO) && !defined(SIMDJSON_CLANG_VISUAL_STUDIO) return result; #else return parser->unescape(in, _string_buf_loc, allow_replacement); @@ -118501,7 +153032,11 @@ simdjson_inline simdjson_result<std::string_view> json_iterator::unescape(raw_js simdjson_inline simdjson_result<std::string_view> json_iterator::unescape_wobbly(raw_json_string in) noexcept { #if SIMDJSON_DEVELOPMENT_CHECKS auto result = parser->unescape_wobbly(in, _string_buf_loc); +#if !defined(SIMDJSON_VISUAL_STUDIO) && !defined(SIMDJSON_CLANG_VISUAL_STUDIO) + // Under Visual Studio, the next SIMDJSON_ASSUME fails with: the argument + // has side effects that will be discarded. SIMDJSON_ASSUME(!parser->string_buffer_overflow(_string_buf_loc)); +#endif // !defined(SIMDJSON_VISUAL_STUDIO) && !defined(SIMDJSON_CLANG_VISUAL_STUDIO) return result; #else return parser->unescape_wobbly(in, _string_buf_loc); @@ -118564,22 +153099,22 @@ simdjson_warn_unused simdjson_inline bool json_iterator::copy_to_buffer(const ui } } // namespace ondemand -} // namespace westmere +} // namespace lsx } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<westmere::ondemand::json_iterator>::simdjson_result(westmere::ondemand::json_iterator &&value) noexcept - : implementation_simdjson_result_base<westmere::ondemand::json_iterator>(std::forward<westmere::ondemand::json_iterator>(value)) {} -simdjson_inline simdjson_result<westmere::ondemand::json_iterator>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<westmere::ondemand::json_iterator>(error) {} +simdjson_inline simdjson_result<lsx::ondemand::json_iterator>::simdjson_result(lsx::ondemand::json_iterator &&value) noexcept + : implementation_simdjson_result_base<lsx::ondemand::json_iterator>(std::forward<lsx::ondemand::json_iterator>(value)) {} +simdjson_inline simdjson_result<lsx::ondemand::json_iterator>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<lsx::ondemand::json_iterator>(error) {} } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_INL_H -/* end file simdjson/generic/ondemand/json_iterator-inl.h for westmere */ -/* including simdjson/generic/ondemand/json_type-inl.h for westmere: #include "simdjson/generic/ondemand/json_type-inl.h" */ -/* begin file simdjson/generic/ondemand/json_type-inl.h for westmere */ +/* end file simdjson/generic/ondemand/json_iterator-inl.h for lsx */ +/* including simdjson/generic/ondemand/json_type-inl.h for lsx: #include "simdjson/generic/ondemand/json_type-inl.h" */ +/* begin file simdjson/generic/ondemand/json_type-inl.h for lsx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -118590,7 +153125,7 @@ simdjson_inline simdjson_result<westmere::ondemand::json_iterator>::simdjson_res /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace westmere { +namespace lsx { namespace ondemand { inline std::ostream& operator<<(std::ostream& out, json_type type) noexcept { @@ -118684,22 +153219,22 @@ simdjson_inline void number::skip_double() noexcept { } } // namespace ondemand -} // namespace westmere +} // namespace lsx } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<westmere::ondemand::json_type>::simdjson_result(westmere::ondemand::json_type &&value) noexcept - : implementation_simdjson_result_base<westmere::ondemand::json_type>(std::forward<westmere::ondemand::json_type>(value)) {} -simdjson_inline simdjson_result<westmere::ondemand::json_type>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<westmere::ondemand::json_type>(error) {} +simdjson_inline simdjson_result<lsx::ondemand::json_type>::simdjson_result(lsx::ondemand::json_type &&value) noexcept + : implementation_simdjson_result_base<lsx::ondemand::json_type>(std::forward<lsx::ondemand::json_type>(value)) {} +simdjson_inline simdjson_result<lsx::ondemand::json_type>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<lsx::ondemand::json_type>(error) {} } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_INL_H -/* end file simdjson/generic/ondemand/json_type-inl.h for westmere */ -/* including simdjson/generic/ondemand/logger-inl.h for westmere: #include "simdjson/generic/ondemand/logger-inl.h" */ -/* begin file simdjson/generic/ondemand/logger-inl.h for westmere */ +/* end file simdjson/generic/ondemand/json_type-inl.h for lsx */ +/* including simdjson/generic/ondemand/logger-inl.h for lsx: #include "simdjson/generic/ondemand/logger-inl.h" */ +/* begin file simdjson/generic/ondemand/logger-inl.h for lsx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_LOGGER_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -118714,7 +153249,7 @@ simdjson_inline simdjson_result<westmere::ondemand::json_type>::simdjson_result( #include <cstring> namespace simdjson { -namespace westmere { +namespace lsx { namespace ondemand { namespace logger { @@ -118921,13 +153456,13 @@ inline void log_line(const json_iterator &iter, token_position index, depth_t de } // namespace logger } // namespace ondemand -} // namespace westmere +} // namespace lsx } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_LOGGER_INL_H -/* end file simdjson/generic/ondemand/logger-inl.h for westmere */ -/* including simdjson/generic/ondemand/object-inl.h for westmere: #include "simdjson/generic/ondemand/object-inl.h" */ -/* begin file simdjson/generic/ondemand/object-inl.h for westmere */ +/* end file simdjson/generic/ondemand/logger-inl.h for lsx */ +/* including simdjson/generic/ondemand/object-inl.h for lsx: #include "simdjson/generic/ondemand/object-inl.h" */ +/* begin file simdjson/generic/ondemand/object-inl.h for lsx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -118947,7 +153482,7 @@ inline void log_line(const json_iterator &iter, token_position index, depth_t de /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace westmere { +namespace lsx { namespace ondemand { simdjson_inline simdjson_result<value> object::find_field_unordered(const std::string_view key) & noexcept { @@ -119221,55 +153756,55 @@ simdjson_warn_unused simdjson_inline error_code object::extract_into(T& out) & n #endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION } // namespace ondemand -} // namespace westmere +} // namespace lsx } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<westmere::ondemand::object>::simdjson_result(westmere::ondemand::object &&value) noexcept - : implementation_simdjson_result_base<westmere::ondemand::object>(std::forward<westmere::ondemand::object>(value)) {} -simdjson_inline simdjson_result<westmere::ondemand::object>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<westmere::ondemand::object>(error) {} +simdjson_inline simdjson_result<lsx::ondemand::object>::simdjson_result(lsx::ondemand::object &&value) noexcept + : implementation_simdjson_result_base<lsx::ondemand::object>(std::forward<lsx::ondemand::object>(value)) {} +simdjson_inline simdjson_result<lsx::ondemand::object>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<lsx::ondemand::object>(error) {} -simdjson_inline simdjson_result<westmere::ondemand::object_iterator> simdjson_result<westmere::ondemand::object>::begin() noexcept { +simdjson_inline simdjson_result<lsx::ondemand::object_iterator> simdjson_result<lsx::ondemand::object>::begin() noexcept { if (error()) { return error(); } return first.begin(); } -simdjson_inline simdjson_result<westmere::ondemand::object_iterator> simdjson_result<westmere::ondemand::object>::end() noexcept { +simdjson_inline simdjson_result<lsx::ondemand::object_iterator> simdjson_result<lsx::ondemand::object>::end() noexcept { if (error()) { return error(); } return first.end(); } -simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::object>::find_field_unordered(std::string_view key) & noexcept { +simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::object>::find_field_unordered(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::object>::find_field_unordered(std::string_view key) && noexcept { +simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::object>::find_field_unordered(std::string_view key) && noexcept { if (error()) { return error(); } - return std::forward<westmere::ondemand::object>(first).find_field_unordered(key); + return std::forward<lsx::ondemand::object>(first).find_field_unordered(key); } -simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::object>::operator[](std::string_view key) & noexcept { +simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::object>::operator[](std::string_view key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::object>::operator[](std::string_view key) && noexcept { +simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::object>::operator[](std::string_view key) && noexcept { if (error()) { return error(); } - return std::forward<westmere::ondemand::object>(first)[key]; + return std::forward<lsx::ondemand::object>(first)[key]; } -simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::object>::find_field(std::string_view key) & noexcept { +simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::object>::find_field(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::object>::find_field(std::string_view key) && noexcept { +simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::object>::find_field(std::string_view key) && noexcept { if (error()) { return error(); } - return std::forward<westmere::ondemand::object>(first).find_field(key); + return std::forward<lsx::ondemand::object>(first).find_field(key); } -simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::object>::at_pointer(std::string_view json_pointer) noexcept { +simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::object>::at_pointer(std::string_view json_pointer) noexcept { if (error()) { return error(); } return first.at_pointer(json_pointer); } -simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westmere::ondemand::object>::at_path( +simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::object>::at_path( std::string_view json_path) noexcept { if (error()) { return error(); @@ -119277,27 +153812,27 @@ simdjson_inline simdjson_result<westmere::ondemand::value> simdjson_result<westm return first.at_path(json_path); } -simdjson_inline simdjson_result<std::vector<westmere::ondemand::value>> simdjson_result<westmere::ondemand::object>::at_path_with_wildcard(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<std::vector<lsx::ondemand::value>> simdjson_result<lsx::ondemand::object>::at_path_with_wildcard(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path_with_wildcard(json_path); } -inline simdjson_result<bool> simdjson_result<westmere::ondemand::object>::reset() noexcept { +inline simdjson_result<bool> simdjson_result<lsx::ondemand::object>::reset() noexcept { if (error()) { return error(); } return first.reset(); } -inline simdjson_result<bool> simdjson_result<westmere::ondemand::object>::is_empty() noexcept { +inline simdjson_result<bool> simdjson_result<lsx::ondemand::object>::is_empty() noexcept { if (error()) { return error(); } return first.is_empty(); } -simdjson_inline simdjson_result<size_t> simdjson_result<westmere::ondemand::object>::count_fields() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<lsx::ondemand::object>::count_fields() & noexcept { if (error()) { return error(); } return first.count_fields(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<westmere::ondemand::object>::raw_json() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<lsx::ondemand::object>::raw_json() noexcept { if (error()) { return error(); } return first.raw_json(); } @@ -119305,9 +153840,9 @@ simdjson_inline simdjson_result<std::string_view> simdjson_result<westmere::ond } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_INL_H -/* end file simdjson/generic/ondemand/object-inl.h for westmere */ -/* including simdjson/generic/ondemand/object_iterator-inl.h for westmere: #include "simdjson/generic/ondemand/object_iterator-inl.h" */ -/* begin file simdjson/generic/ondemand/object_iterator-inl.h for westmere */ +/* end file simdjson/generic/ondemand/object-inl.h for lsx */ +/* including simdjson/generic/ondemand/object_iterator-inl.h for lsx: #include "simdjson/generic/ondemand/object_iterator-inl.h" */ +/* begin file simdjson/generic/ondemand/object_iterator-inl.h for lsx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -119319,7 +153854,7 @@ simdjson_inline simdjson_result<std::string_view> simdjson_result<westmere::ond /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace westmere { +namespace lsx { namespace ondemand { // @@ -119331,6 +153866,11 @@ simdjson_inline object_iterator::object_iterator(const value_iterator &_iter) no {} simdjson_inline simdjson_result<field> object_iterator::operator*() noexcept { +#if SIMDJSON_DEVELOPMENT_CHECKS + // We must call * once per iteration. + SIMDJSON_ASSUME(!has_been_referenced); + has_been_referenced = true; +#endif error_code error = iter.error(); if (error) { iter.abandon(); return error; } auto result = field::start(iter); @@ -119349,6 +153889,11 @@ simdjson_inline bool object_iterator::operator!=(const object_iterator &) const SIMDJSON_PUSH_DISABLE_WARNINGS SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING simdjson_inline object_iterator &object_iterator::operator++() noexcept { +#if SIMDJSON_DEVELOPMENT_CHECKS + // Before calling ++, we must have called *. + SIMDJSON_ASSUME(has_been_referenced); + has_been_referenced = false; +#endif // TODO this is a safety rail ... users should exit loops as soon as they receive an error. // Nonetheless, let's see if performance is OK with this if statement--the compiler may give it to us for free. if (!iter.is_open()) { return *this; } // Iterator will be released if there is an error @@ -119404,39 +153949,39 @@ SIMDJSON_POP_DISABLE_WARNINGS // } // namespace ondemand -} // namespace westmere +} // namespace lsx } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<westmere::ondemand::object_iterator>::simdjson_result( - westmere::ondemand::object_iterator &&value +simdjson_inline simdjson_result<lsx::ondemand::object_iterator>::simdjson_result( + lsx::ondemand::object_iterator &&value ) noexcept - : implementation_simdjson_result_base<westmere::ondemand::object_iterator>(std::forward<westmere::ondemand::object_iterator>(value)) + : implementation_simdjson_result_base<lsx::ondemand::object_iterator>(std::forward<lsx::ondemand::object_iterator>(value)) { first.iter.assert_is_valid(); } -simdjson_inline simdjson_result<westmere::ondemand::object_iterator>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<westmere::ondemand::object_iterator>({}, error) +simdjson_inline simdjson_result<lsx::ondemand::object_iterator>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<lsx::ondemand::object_iterator>({}, error) { } -simdjson_inline simdjson_result<westmere::ondemand::field> simdjson_result<westmere::ondemand::object_iterator>::operator*() noexcept { +simdjson_inline simdjson_result<lsx::ondemand::field> simdjson_result<lsx::ondemand::object_iterator>::operator*() noexcept { if (error()) { return error(); } return *first; } // If we're iterating and there is an error, return the error once. -simdjson_inline bool simdjson_result<westmere::ondemand::object_iterator>::operator==(const simdjson_result<westmere::ondemand::object_iterator> &other) const noexcept { +simdjson_inline bool simdjson_result<lsx::ondemand::object_iterator>::operator==(const simdjson_result<lsx::ondemand::object_iterator> &other) const noexcept { if (!first.iter.is_valid()) { return !error(); } return first == other.first; } // If we're iterating and there is an error, return the error once. -simdjson_inline bool simdjson_result<westmere::ondemand::object_iterator>::operator!=(const simdjson_result<westmere::ondemand::object_iterator> &other) const noexcept { +simdjson_inline bool simdjson_result<lsx::ondemand::object_iterator>::operator!=(const simdjson_result<lsx::ondemand::object_iterator> &other) const noexcept { if (!first.iter.is_valid()) { return error(); } return first != other.first; } // Checks for ']' and ',' -simdjson_inline simdjson_result<westmere::ondemand::object_iterator> &simdjson_result<westmere::ondemand::object_iterator>::operator++() noexcept { +simdjson_inline simdjson_result<lsx::ondemand::object_iterator> &simdjson_result<lsx::ondemand::object_iterator>::operator++() noexcept { // Clear the error if there is one, so we don't yield it twice if (error()) { second = SUCCESS; return *this; } ++first; @@ -119446,9 +153991,9 @@ simdjson_inline simdjson_result<westmere::ondemand::object_iterator> &simdjson_r } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_INL_H -/* end file simdjson/generic/ondemand/object_iterator-inl.h for westmere */ -/* including simdjson/generic/ondemand/parser-inl.h for westmere: #include "simdjson/generic/ondemand/parser-inl.h" */ -/* begin file simdjson/generic/ondemand/parser-inl.h for westmere */ +/* end file simdjson/generic/ondemand/object_iterator-inl.h for lsx */ +/* including simdjson/generic/ondemand/parser-inl.h for lsx: #include "simdjson/generic/ondemand/parser-inl.h" */ +/* begin file simdjson/generic/ondemand/parser-inl.h for lsx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_PARSER_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -119465,7 +154010,7 @@ simdjson_inline simdjson_result<westmere::ondemand::object_iterator> &simdjson_r /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace westmere { +namespace lsx { namespace ondemand { simdjson_inline parser::parser(size_t max_capacity) noexcept @@ -119675,22 +154220,22 @@ simdjson_inline simdjson_warn_unused std::unique_ptr<ondemand::parser>& parser:: } // namespace ondemand -} // namespace westmere +} // namespace lsx } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<westmere::ondemand::parser>::simdjson_result(westmere::ondemand::parser &&value) noexcept - : implementation_simdjson_result_base<westmere::ondemand::parser>(std::forward<westmere::ondemand::parser>(value)) {} -simdjson_inline simdjson_result<westmere::ondemand::parser>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<westmere::ondemand::parser>(error) {} +simdjson_inline simdjson_result<lsx::ondemand::parser>::simdjson_result(lsx::ondemand::parser &&value) noexcept + : implementation_simdjson_result_base<lsx::ondemand::parser>(std::forward<lsx::ondemand::parser>(value)) {} +simdjson_inline simdjson_result<lsx::ondemand::parser>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<lsx::ondemand::parser>(error) {} } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_PARSER_INL_H -/* end file simdjson/generic/ondemand/parser-inl.h for westmere */ -/* including simdjson/generic/ondemand/raw_json_string-inl.h for westmere: #include "simdjson/generic/ondemand/raw_json_string-inl.h" */ -/* begin file simdjson/generic/ondemand/raw_json_string-inl.h for westmere */ +/* end file simdjson/generic/ondemand/parser-inl.h for lsx */ +/* including simdjson/generic/ondemand/raw_json_string-inl.h for lsx: #include "simdjson/generic/ondemand/raw_json_string-inl.h" */ +/* begin file simdjson/generic/ondemand/raw_json_string-inl.h for lsx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -119703,7 +154248,7 @@ simdjson_inline simdjson_result<westmere::ondemand::parser>::simdjson_result(err namespace simdjson { -namespace westmere { +namespace lsx { namespace ondemand { simdjson_inline raw_json_string::raw_json_string(const uint8_t * _buf) noexcept : buf{_buf} {} @@ -119817,337 +154362,98 @@ simdjson_inline bool raw_json_string::is_equal(const char* target) const noexcep // the raw content is quote terminated within a valid JSON string. const char * r{raw()}; size_t pos{0}; - bool escaping{false}; - for(;target[pos];pos++) { - if(r[pos] != target[pos]) { return false; } - // if target is a compile-time constant and it is free from - // quotes, then the next part could get optimized away through - // inlining. - if((target[pos] == '"') && !escaping) { - // We have reached the end of the raw_json_string but - // the target is not done. - return false; - } else if(target[pos] == '\\') { - escaping = !escaping; - } else { - escaping = false; - } - } - if(r[pos] != '"') { return false; } - return true; -} - -simdjson_unused simdjson_inline bool operator==(const raw_json_string &a, std::string_view c) noexcept { - return a.unsafe_is_equal(c); -} - -simdjson_unused simdjson_inline bool operator==(std::string_view c, const raw_json_string &a) noexcept { - return a == c; -} - -simdjson_unused simdjson_inline bool operator!=(const raw_json_string &a, std::string_view c) noexcept { - return !(a == c); -} - -simdjson_unused simdjson_inline bool operator!=(std::string_view c, const raw_json_string &a) noexcept { - return !(a == c); -} - - -simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> raw_json_string::unescape(json_iterator &iter, bool allow_replacement) const noexcept { - return iter.unescape(*this, allow_replacement); -} - -simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> raw_json_string::unescape_wobbly(json_iterator &iter) const noexcept { - return iter.unescape_wobbly(*this); -} - -simdjson_unused simdjson_inline std::ostream &operator<<(std::ostream &out, const raw_json_string &str) noexcept { - bool in_escape = false; - const char *s = str.raw(); - while (true) { - switch (*s) { - case '\\': in_escape = !in_escape; break; - case '"': if (in_escape) { in_escape = false; } else { return out; } break; - default: if (in_escape) { in_escape = false; } - } - out << *s; - s++; - } -} - -} // namespace ondemand -} // namespace westmere -} // namespace simdjson - -namespace simdjson { - -simdjson_inline simdjson_result<westmere::ondemand::raw_json_string>::simdjson_result(westmere::ondemand::raw_json_string &&value) noexcept - : implementation_simdjson_result_base<westmere::ondemand::raw_json_string>(std::forward<westmere::ondemand::raw_json_string>(value)) {} -simdjson_inline simdjson_result<westmere::ondemand::raw_json_string>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<westmere::ondemand::raw_json_string>(error) {} - -simdjson_inline simdjson_result<const char *> simdjson_result<westmere::ondemand::raw_json_string>::raw() const noexcept { - if (error()) { return error(); } - return first.raw(); -} -simdjson_inline char simdjson_result<westmere::ondemand::raw_json_string>::operator[](size_t i) const noexcept { - if (error()) { return error(); } - return first[i]; -} -simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> simdjson_result<westmere::ondemand::raw_json_string>::unescape(westmere::ondemand::json_iterator &iter, bool allow_replacement) const noexcept { - if (error()) { return error(); } - return first.unescape(iter, allow_replacement); -} -simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> simdjson_result<westmere::ondemand::raw_json_string>::unescape_wobbly(westmere::ondemand::json_iterator &iter) const noexcept { - if (error()) { return error(); } - return first.unescape_wobbly(iter); -} -} // namespace simdjson - -#endif // SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_INL_H -/* end file simdjson/generic/ondemand/raw_json_string-inl.h for westmere */ -/* including simdjson/generic/ondemand/serialization-inl.h for westmere: #include "simdjson/generic/ondemand/serialization-inl.h" */ -/* begin file simdjson/generic/ondemand/serialization-inl.h for westmere */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H - -/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document-inl.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/serialization.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */ -/* amalgamation skipped (editor-only): #if SIMDJSON_STATIC_REFLECTION */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_builder.h" */ -/* amalgamation skipped (editor-only): #endif */ -/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ - -namespace simdjson { - -inline std::string_view trim(const std::string_view str) noexcept { - // We can almost surely do better by rolling our own find_first_not_of function. - size_t first = str.find_first_not_of(" \t\n\r"); - // If we have the empty string (just white space), then no trimming is possible, and - // we return the empty string_view. - if (std::string_view::npos == first) { return std::string_view(); } - size_t last = str.find_last_not_of(" \t\n\r"); - return str.substr(first, (last - first + 1)); -} - - -inline simdjson_result<std::string_view> to_json_string(westmere::ondemand::document& x) noexcept { - std::string_view v; - auto error = x.raw_json().get(v); - if(error) {return error; } - return trim(v); -} - -inline simdjson_result<std::string_view> to_json_string(westmere::ondemand::document_reference& x) noexcept { - std::string_view v; - auto error = x.raw_json().get(v); - if(error) {return error; } - return trim(v); -} - -inline simdjson_result<std::string_view> to_json_string(westmere::ondemand::value& x) noexcept { - /** - * If we somehow receive a value that has already been consumed, - * then the following code could be in trouble. E.g., we create - * an array as needed, but if an array was already created, then - * it could be bad. - */ - using namespace westmere::ondemand; - westmere::ondemand::json_type t; - auto error = x.type().get(t); - if(error != SUCCESS) { return error; } - switch (t) - { - case json_type::array: - { - westmere::ondemand::array array; - error = x.get_array().get(array); - if(error) { return error; } - return to_json_string(array); - } - case json_type::object: - { - westmere::ondemand::object object; - error = x.get_object().get(object); - if(error) { return error; } - return to_json_string(object); + bool escaping{false}; + for(;target[pos];pos++) { + if(r[pos] != target[pos]) { return false; } + // if target is a compile-time constant and it is free from + // quotes, then the next part could get optimized away through + // inlining. + if((target[pos] == '"') && !escaping) { + // We have reached the end of the raw_json_string but + // the target is not done. + return false; + } else if(target[pos] == '\\') { + escaping = !escaping; + } else { + escaping = false; } - default: - return trim(x.raw_json_token()); } + if(r[pos] != '"') { return false; } + return true; } -inline simdjson_result<std::string_view> to_json_string(westmere::ondemand::object& x) noexcept { - std::string_view v; - auto error = x.raw_json().get(v); - if(error) {return error; } - return trim(v); +simdjson_unused simdjson_inline bool operator==(const raw_json_string &a, std::string_view c) noexcept { + return a.unsafe_is_equal(c); } -inline simdjson_result<std::string_view> to_json_string(westmere::ondemand::array& x) noexcept { - std::string_view v; - auto error = x.raw_json().get(v); - if(error) {return error; } - return trim(v); +simdjson_unused simdjson_inline bool operator==(std::string_view c, const raw_json_string &a) noexcept { + return a == c; } -inline simdjson_result<std::string_view> to_json_string(simdjson_result<westmere::ondemand::document> x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); +simdjson_unused simdjson_inline bool operator!=(const raw_json_string &a, std::string_view c) noexcept { + return !(a == c); } -inline simdjson_result<std::string_view> to_json_string(simdjson_result<westmere::ondemand::document_reference> x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); +simdjson_unused simdjson_inline bool operator!=(std::string_view c, const raw_json_string &a) noexcept { + return !(a == c); } -inline simdjson_result<std::string_view> to_json_string(simdjson_result<westmere::ondemand::value> x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); -} -inline simdjson_result<std::string_view> to_json_string(simdjson_result<westmere::ondemand::object> x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); +simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> raw_json_string::unescape(json_iterator &iter, bool allow_replacement) const noexcept { + return iter.unescape(*this, allow_replacement); } -inline simdjson_result<std::string_view> to_json_string(simdjson_result<westmere::ondemand::array> x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); +simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> raw_json_string::unescape_wobbly(json_iterator &iter) const noexcept { + return iter.unescape_wobbly(*this); } -} // namespace simdjson - -namespace simdjson { namespace westmere { namespace ondemand { -#if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::westmere::ondemand::value x) { - std::string_view v; - auto error = simdjson::to_json_string(x).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - throw simdjson::simdjson_error(error); - } -} -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::westmere::ondemand::value> x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); -} -#else -inline std::ostream& operator<<(std::ostream& out, simdjson::westmere::ondemand::value x) { - std::string_view v; - auto error = simdjson::to_json_string(x).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - return (out << error); +simdjson_unused simdjson_inline std::ostream &operator<<(std::ostream &out, const raw_json_string &str) noexcept { + bool in_escape = false; + const char *s = str.raw(); + while (true) { + switch (*s) { + case '\\': in_escape = !in_escape; break; + case '"': if (in_escape) { in_escape = false; } else { return out; } break; + default: if (in_escape) { in_escape = false; } + } + out << *s; + s++; } } -#endif -#if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::westmere::ondemand::array value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - throw simdjson::simdjson_error(error); - } -} -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::westmere::ondemand::array> x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); -} -#else -inline std::ostream& operator<<(std::ostream& out, simdjson::westmere::ondemand::array value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - return (out << error); - } -} -#endif +} // namespace ondemand +} // namespace lsx +} // namespace simdjson -#if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::westmere::ondemand::document& value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - throw simdjson::simdjson_error(error); - } -} -inline std::ostream& operator<<(std::ostream& out, simdjson::westmere::ondemand::document_reference& value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - throw simdjson::simdjson_error(error); - } -} -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::westmere::ondemand::document>&& x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); -} -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::westmere::ondemand::document_reference>&& x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); -} -#else -inline std::ostream& operator<<(std::ostream& out, simdjson::westmere::ondemand::document& value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - return (out << error); - } -} -#endif +namespace simdjson { -#if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::westmere::ondemand::object value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - throw simdjson::simdjson_error(error); - } +simdjson_inline simdjson_result<lsx::ondemand::raw_json_string>::simdjson_result(lsx::ondemand::raw_json_string &&value) noexcept + : implementation_simdjson_result_base<lsx::ondemand::raw_json_string>(std::forward<lsx::ondemand::raw_json_string>(value)) {} +simdjson_inline simdjson_result<lsx::ondemand::raw_json_string>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<lsx::ondemand::raw_json_string>(error) {} + +simdjson_inline simdjson_result<const char *> simdjson_result<lsx::ondemand::raw_json_string>::raw() const noexcept { + if (error()) { return error(); } + return first.raw(); } -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::westmere::ondemand::object> x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); +simdjson_inline char simdjson_result<lsx::ondemand::raw_json_string>::operator[](size_t i) const noexcept { + if (error()) { return error(); } + return first[i]; } -#else -inline std::ostream& operator<<(std::ostream& out, simdjson::westmere::ondemand::object value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - return (out << error); - } +simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> simdjson_result<lsx::ondemand::raw_json_string>::unescape(lsx::ondemand::json_iterator &iter, bool allow_replacement) const noexcept { + if (error()) { return error(); } + return first.unescape(iter, allow_replacement); } -#endif -}}} // namespace simdjson::westmere::ondemand +simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> simdjson_result<lsx::ondemand::raw_json_string>::unescape_wobbly(lsx::ondemand::json_iterator &iter) const noexcept { + if (error()) { return error(); } + return first.unescape_wobbly(iter); +} +} // namespace simdjson -#endif // SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H -/* end file simdjson/generic/ondemand/serialization-inl.h for westmere */ -/* including simdjson/generic/ondemand/token_iterator-inl.h for westmere: #include "simdjson/generic/ondemand/token_iterator-inl.h" */ -/* begin file simdjson/generic/ondemand/token_iterator-inl.h for westmere */ +#endif // SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_INL_H +/* end file simdjson/generic/ondemand/raw_json_string-inl.h for lsx */ +/* including simdjson/generic/ondemand/token_iterator-inl.h for lsx: #include "simdjson/generic/ondemand/token_iterator-inl.h" */ +/* begin file simdjson/generic/ondemand/token_iterator-inl.h for lsx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -120158,7 +154464,7 @@ inline std::ostream& operator<<(std::ostream& out, simdjson::westmere::ondemand: /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace westmere { +namespace lsx { namespace ondemand { simdjson_inline token_iterator::token_iterator( @@ -120229,22 +154535,22 @@ simdjson_inline bool token_iterator::operator<=(const token_iterator &other) con } } // namespace ondemand -} // namespace westmere +} // namespace lsx } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<westmere::ondemand::token_iterator>::simdjson_result(westmere::ondemand::token_iterator &&value) noexcept - : implementation_simdjson_result_base<westmere::ondemand::token_iterator>(std::forward<westmere::ondemand::token_iterator>(value)) {} -simdjson_inline simdjson_result<westmere::ondemand::token_iterator>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<westmere::ondemand::token_iterator>(error) {} +simdjson_inline simdjson_result<lsx::ondemand::token_iterator>::simdjson_result(lsx::ondemand::token_iterator &&value) noexcept + : implementation_simdjson_result_base<lsx::ondemand::token_iterator>(std::forward<lsx::ondemand::token_iterator>(value)) {} +simdjson_inline simdjson_result<lsx::ondemand::token_iterator>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<lsx::ondemand::token_iterator>(error) {} } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_INL_H -/* end file simdjson/generic/ondemand/token_iterator-inl.h for westmere */ -/* including simdjson/generic/ondemand/value_iterator-inl.h for westmere: #include "simdjson/generic/ondemand/value_iterator-inl.h" */ -/* begin file simdjson/generic/ondemand/value_iterator-inl.h for westmere */ +/* end file simdjson/generic/ondemand/token_iterator-inl.h for lsx */ +/* including simdjson/generic/ondemand/value_iterator-inl.h for lsx: #include "simdjson/generic/ondemand/value_iterator-inl.h" */ +/* begin file simdjson/generic/ondemand/value_iterator-inl.h for lsx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -120259,7 +154565,7 @@ simdjson_inline simdjson_result<westmere::ondemand::token_iterator>::simdjson_re /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace westmere { +namespace lsx { namespace ondemand { simdjson_inline value_iterator::value_iterator( @@ -120341,7 +154647,6 @@ simdjson_warn_unused simdjson_inline error_code value_iterator::end_container() simdjson_warn_unused simdjson_inline simdjson_result<bool> value_iterator::has_next_field() noexcept { assert_at_next(); - // It's illegal to call this unless there are more tokens: anything that ends in } or ] is // obligated to verify there are more tokens if they are not the top level. switch (*_json_iter->return_current_and_advance()) { @@ -120763,9 +155068,13 @@ simdjson_warn_unused simdjson_inline simdjson_result<std::string_view> value_ite template <typename string_type> simdjson_warn_unused simdjson_inline error_code value_iterator::get_string(string_type& receiver, bool allow_replacement) noexcept { std::string_view content; + // Save the string buffer location so that we can restore it after get_string + auto saved_string_buf_loc = _json_iter->string_buf_loc(); auto err = get_string(allow_replacement).get(content); if (err) { return err; } receiver = content; + // Restore the string buffer location, effectively discarding any temporary string storage + _json_iter->string_buf_loc() = saved_string_buf_loc; return SUCCESS; } simdjson_warn_unused simdjson_inline simdjson_result<std::string_view> value_iterator::get_wobbly_string() noexcept { @@ -120853,7 +155162,7 @@ simdjson_inline simdjson_result<bool> value_iterator::is_root_integer(bool check return answer; } -simdjson_inline simdjson_result<westmere::number_type> value_iterator::get_root_number_type(bool check_trailing) noexcept { +simdjson_inline simdjson_result<lsx::number_type> value_iterator::get_root_number_type(bool check_trailing) noexcept { auto max_len = peek_root_length(); auto json = peek_root_scalar("number"); // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/, @@ -120905,9 +155214,13 @@ simdjson_warn_unused simdjson_inline simdjson_result<std::string_view> value_ite template <typename string_type> simdjson_warn_unused simdjson_inline error_code value_iterator::get_root_string(string_type& receiver, bool check_trailing, bool allow_replacement) noexcept { std::string_view content; + // Save the string buffer location so that we can restore it after get_string + auto saved_string_buf_loc = _json_iter->string_buf_loc(); auto err = get_root_string(check_trailing, allow_replacement).get(content); if (err) { return err; } receiver = content; + // Restore the string buffer location, effectively discarding any temporary string storage + _json_iter->string_buf_loc() = saved_string_buf_loc; return SUCCESS; } simdjson_warn_unused simdjson_inline simdjson_result<std::string_view> value_iterator::get_root_wobbly_string(bool check_trailing) noexcept { @@ -120982,1463 +155295,613 @@ simdjson_warn_unused simdjson_inline simdjson_result<int64_t> value_iterator::ge auto result = numberparsing::parse_integer_in_string(tmpbuf); if(result.error() == SUCCESS) { if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } - advance_root_scalar("int64"); - } - return result; -} -simdjson_warn_unused simdjson_inline simdjson_result<double> value_iterator::get_root_double(bool check_trailing) noexcept { - auto max_len = peek_root_length(); - auto json = peek_root_scalar("double"); - // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/, - // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest - // number: -0.<fraction>e-308. - uint8_t tmpbuf[1074+8+1+1]; // +1 for null termination. - tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated. - if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) { - logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters"); - return NUMBER_ERROR; - } - auto result = numberparsing::parse_double(tmpbuf); - if(result.error() == SUCCESS) { - if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } - advance_root_scalar("double"); - } - return result; -} - -simdjson_warn_unused simdjson_inline simdjson_result<double> value_iterator::get_root_double_in_string(bool check_trailing) noexcept { - auto max_len = peek_root_length(); - auto json = peek_root_scalar("double"); - // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/, - // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest - // number: -0.<fraction>e-308. - uint8_t tmpbuf[1074+8+1+1]; // +1 for null termination. - tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated. - if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) { - logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters"); - return NUMBER_ERROR; - } - auto result = numberparsing::parse_double_in_string(tmpbuf); - if(result.error() == SUCCESS) { - if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } - advance_root_scalar("double"); - } - return result; -} - -simdjson_warn_unused simdjson_inline simdjson_result<bool> value_iterator::get_root_bool(bool check_trailing) noexcept { - auto max_len = peek_root_length(); - auto json = peek_root_scalar("bool"); - // We have a boolean if we have either "true" or "false" and the next character is either - // a structural character or whitespace. We also check that the length is correct: - // "true" and "false" are 4 and 5 characters long, respectively. - bool value_true = (max_len >= 4 && !atomparsing::str4ncmp(json, "true") && - (max_len == 4 || jsoncharutils::is_structural_or_whitespace(json[4]))); - bool value_false = (max_len >= 5 && !atomparsing::str4ncmp(json, "false") && - (max_len == 5 || jsoncharutils::is_structural_or_whitespace(json[5]))); - if(value_true == false && value_false == false) { return incorrect_type_error("Not a boolean"); } - if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } - advance_root_scalar("bool"); - return value_true; -} - -simdjson_inline simdjson_result<bool> value_iterator::is_root_null(bool check_trailing) noexcept { - auto max_len = peek_root_length(); - auto json = peek_root_scalar("null"); - bool result = (max_len >= 4 && !atomparsing::str4ncmp(json, "null") && - (max_len == 4 || jsoncharutils::is_structural_or_whitespace(json[4]))); - if(result) { // we have something that looks like a null. - if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } - advance_root_scalar("null"); - } else if (json[0] == 'n') { - return incorrect_type_error("Not a null but starts with n"); - } - return result; -} - -simdjson_warn_unused simdjson_inline error_code value_iterator::skip_child() noexcept { - SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); - SIMDJSON_ASSUME( _json_iter->_depth >= _depth ); - - return _json_iter->skip_child(depth()); -} - -simdjson_inline value_iterator value_iterator::child() const noexcept { - assert_at_child(); - return { _json_iter, depth()+1, _json_iter->token.position() }; -} - -// GCC 7 warns when the first line of this function is inlined away into oblivion due to the caller -// relating depth and iterator depth, which is a desired effect. It does not happen if is_open is -// marked non-inline. -SIMDJSON_PUSH_DISABLE_WARNINGS -SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING -simdjson_inline bool value_iterator::is_open() const noexcept { - return _json_iter->depth() >= depth(); -} -SIMDJSON_POP_DISABLE_WARNINGS - -simdjson_inline bool value_iterator::at_end() const noexcept { - return _json_iter->at_end(); -} - -simdjson_inline bool value_iterator::at_start() const noexcept { - return _json_iter->token.position() == start_position(); -} - -simdjson_inline bool value_iterator::at_first_field() const noexcept { - SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); - return _json_iter->token.position() == start_position() + 1; -} - -simdjson_inline void value_iterator::abandon() noexcept { - _json_iter->abandon(); -} - -simdjson_warn_unused simdjson_inline depth_t value_iterator::depth() const noexcept { - return _depth; -} -simdjson_warn_unused simdjson_inline error_code value_iterator::error() const noexcept { - return _json_iter->error; -} -simdjson_warn_unused simdjson_inline uint8_t *&value_iterator::string_buf_loc() noexcept { - return _json_iter->string_buf_loc(); -} -simdjson_warn_unused simdjson_inline const json_iterator &value_iterator::json_iter() const noexcept { - return *_json_iter; -} -simdjson_warn_unused simdjson_inline json_iterator &value_iterator::json_iter() noexcept { - return *_json_iter; -} - -simdjson_inline const uint8_t *value_iterator::peek_start() const noexcept { - return _json_iter->peek(start_position()); -} -simdjson_inline uint32_t value_iterator::peek_start_length() const noexcept { - return _json_iter->peek_length(start_position()); -} -simdjson_inline uint32_t value_iterator::peek_root_length() const noexcept { - return _json_iter->peek_root_length(start_position()); -} - -simdjson_inline const uint8_t *value_iterator::peek_scalar(const char *type) noexcept { - logger::log_value(*_json_iter, start_position(), depth(), type); - // If we're not at the position anymore, we don't want to advance the cursor. - if (!is_at_start()) { return peek_start(); } - - // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value. - assert_at_start(); - return _json_iter->peek(); -} - -simdjson_inline void value_iterator::advance_scalar(const char *type) noexcept { - logger::log_value(*_json_iter, start_position(), depth(), type); - // If we're not at the position anymore, we don't want to advance the cursor. - if (!is_at_start()) { return; } - - // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value. - assert_at_start(); - _json_iter->return_current_and_advance(); - _json_iter->ascend_to(depth()-1); -} - -simdjson_warn_unused simdjson_inline error_code value_iterator::start_container(uint8_t start_char, const char *incorrect_type_message, const char *type) noexcept { - logger::log_start_value(*_json_iter, start_position(), depth(), type); - // If we're not at the position anymore, we don't want to advance the cursor. - const uint8_t *json; - if (!is_at_start()) { -#if SIMDJSON_DEVELOPMENT_CHECKS - if (!is_at_iterator_start()) { return OUT_OF_ORDER_ITERATION; } -#endif - json = peek_start(); - if (*json != start_char) { return incorrect_type_error(incorrect_type_message); } - } else { - assert_at_start(); - /** - * We should be prudent. Let us peek. If it is not the right type, we - * return an error. Only once we have determined that we have the right - * type are we allowed to advance! - */ - json = _json_iter->peek(); - if (*json != start_char) { return incorrect_type_error(incorrect_type_message); } - _json_iter->return_current_and_advance(); - } - - - return SUCCESS; -} - - -simdjson_inline const uint8_t *value_iterator::peek_root_scalar(const char *type) noexcept { - logger::log_value(*_json_iter, start_position(), depth(), type); - if (!is_at_start()) { return peek_start(); } - - assert_at_root(); - return _json_iter->peek(); -} -simdjson_inline const uint8_t *value_iterator::peek_non_root_scalar(const char *type) noexcept { - logger::log_value(*_json_iter, start_position(), depth(), type); - if (!is_at_start()) { return peek_start(); } - - assert_at_non_root_start(); - return _json_iter->peek(); -} - -simdjson_inline void value_iterator::advance_root_scalar(const char *type) noexcept { - logger::log_value(*_json_iter, start_position(), depth(), type); - if (!is_at_start()) { return; } - - assert_at_root(); - _json_iter->return_current_and_advance(); - _json_iter->ascend_to(depth()-1); -} -simdjson_inline void value_iterator::advance_non_root_scalar(const char *type) noexcept { - logger::log_value(*_json_iter, start_position(), depth(), type); - if (!is_at_start()) { return; } - - assert_at_non_root_start(); - _json_iter->return_current_and_advance(); - _json_iter->ascend_to(depth()-1); -} - -simdjson_inline error_code value_iterator::incorrect_type_error(const char *message) const noexcept { - logger::log_error(*_json_iter, start_position(), depth(), message); - return INCORRECT_TYPE; -} - -simdjson_inline bool value_iterator::is_at_start() const noexcept { - return position() == start_position(); -} - -simdjson_inline bool value_iterator::is_at_key() const noexcept { - // Keys are at the same depth as the object. - // Note here that we could be safer and check that we are within an object, - // but we do not. - return _depth == _json_iter->_depth && *_json_iter->peek() == '"'; -} - -simdjson_inline bool value_iterator::is_at_iterator_start() const noexcept { - // We can legitimately be either at the first value ([1]), or after the array if it's empty ([]). - auto delta = position() - start_position(); - return delta == 1 || delta == 2; -} - -inline void value_iterator::assert_at_start() const noexcept { - SIMDJSON_ASSUME( _json_iter->token._position == _start_position ); - SIMDJSON_ASSUME( _json_iter->_depth == _depth ); - SIMDJSON_ASSUME( _depth > 0 ); -} - -inline void value_iterator::assert_at_container_start() const noexcept { - SIMDJSON_ASSUME( _json_iter->token._position == _start_position + 1 ); - SIMDJSON_ASSUME( _json_iter->_depth == _depth ); - SIMDJSON_ASSUME( _depth > 0 ); -} - -inline void value_iterator::assert_at_next() const noexcept { - SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); - SIMDJSON_ASSUME( _json_iter->_depth == _depth ); - SIMDJSON_ASSUME( _depth > 0 ); -} - -simdjson_inline void value_iterator::move_at_start() noexcept { - _json_iter->_depth = _depth; - _json_iter->token.set_position(_start_position); -} - -simdjson_inline void value_iterator::move_at_container_start() noexcept { - _json_iter->_depth = _depth; - _json_iter->token.set_position(_start_position + 1); -} - -simdjson_inline simdjson_result<bool> value_iterator::reset_array() noexcept { - if(error()) { return error(); } - move_at_container_start(); - return started_array(); -} - -simdjson_inline simdjson_result<bool> value_iterator::reset_object() noexcept { - if(error()) { return error(); } - move_at_container_start(); - return started_object(); -} - -inline void value_iterator::assert_at_child() const noexcept { - SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); - SIMDJSON_ASSUME( _json_iter->_depth == _depth + 1 ); - SIMDJSON_ASSUME( _depth > 0 ); -} - -inline void value_iterator::assert_at_root() const noexcept { - assert_at_start(); - SIMDJSON_ASSUME( _depth == 1 ); -} - -inline void value_iterator::assert_at_non_root_start() const noexcept { - assert_at_start(); - SIMDJSON_ASSUME( _depth > 1 ); -} - -inline void value_iterator::assert_is_valid() const noexcept { - SIMDJSON_ASSUME( _json_iter != nullptr ); -} - -simdjson_inline bool value_iterator::is_valid() const noexcept { - return _json_iter != nullptr; -} - -simdjson_inline simdjson_result<json_type> value_iterator::type() const noexcept { - switch (*peek_start()) { - case '{': - return json_type::object; - case '[': - return json_type::array; - case '"': - return json_type::string; - case 'n': - return json_type::null; - case 't': case 'f': - return json_type::boolean; - case '-': - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - return json_type::number; - default: - return json_type::unknown; - } -} - -simdjson_inline token_position value_iterator::start_position() const noexcept { - return _start_position; -} - -simdjson_inline token_position value_iterator::position() const noexcept { - return _json_iter->position(); -} - -simdjson_inline token_position value_iterator::end_position() const noexcept { - return _json_iter->end_position(); -} - -simdjson_inline token_position value_iterator::last_position() const noexcept { - return _json_iter->last_position(); -} - -simdjson_inline error_code value_iterator::report_error(error_code error, const char *message) noexcept { - return _json_iter->report_error(error, message); -} - -} // namespace ondemand -} // namespace westmere -} // namespace simdjson - -namespace simdjson { - -simdjson_inline simdjson_result<westmere::ondemand::value_iterator>::simdjson_result(westmere::ondemand::value_iterator &&value) noexcept - : implementation_simdjson_result_base<westmere::ondemand::value_iterator>(std::forward<westmere::ondemand::value_iterator>(value)) {} -simdjson_inline simdjson_result<westmere::ondemand::value_iterator>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<westmere::ondemand::value_iterator>(error) {} - -} // namespace simdjson - -#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H -/* end file simdjson/generic/ondemand/value_iterator-inl.h for westmere */ - -// JSON builder inline definitions -/* including simdjson/generic/ondemand/json_string_builder-inl.h for westmere: #include "simdjson/generic/ondemand/json_string_builder-inl.h" */ -/* begin file simdjson/generic/ondemand/json_string_builder-inl.h for westmere */ -/** - * This file is part of the builder API. It is temporarily in the ondemand - * directory but we will move it to a builder directory later. - */ -#include <array> -#include <cstring> -#include <type_traits> -#ifndef SIMDJSON_GENERIC_STRING_BUILDER_INL_H - -/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_INL_H */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_string_builder.h" */ -/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ - -/* - * Empirically, we have found that an inlined optimization is important for - * performance. The following macros are not ideal. We should find a better - * way to inline the code. - */ - -#if defined(__SSE2__) || defined(__x86_64__) || defined(__x86_64) || \ - (defined(_M_AMD64) || defined(_M_X64) || \ - (defined(_M_IX86_FP) && _M_IX86_FP == 2)) -#ifndef SIMDJSON_EXPERIMENTAL_HAS_SSE2 -#define SIMDJSON_EXPERIMENTAL_HAS_SSE2 1 -#endif -#endif - -#if defined(__aarch64__) || defined(_M_ARM64) -#ifndef SIMDJSON_EXPERIMENTAL_HAS_NEON -#define SIMDJSON_EXPERIMENTAL_HAS_NEON 1 -#endif -#endif -#if SIMDJSON_EXPERIMENTAL_HAS_NEON -#include <arm_neon.h> -#endif -#if SIMDJSON_EXPERIMENTAL_HAS_SSE2 -#include <emmintrin.h> -#endif - -namespace simdjson { -namespace westmere { -namespace builder { - -static SIMDJSON_CONSTEXPR_LAMBDA std::array<uint8_t, 256> - json_quotable_character = { - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - -/** - -A possible SWAR implementation of has_json_escapable_byte. It is not used -because it is slower than the current implementation. It is kept here for -reference (to show that we tried it). - -inline bool has_json_escapable_byte(uint64_t x) { - uint64_t is_ascii = 0x8080808080808080ULL & ~x; - uint64_t xor2 = x ^ 0x0202020202020202ULL; - uint64_t lt32_or_eq34 = xor2 - 0x2121212121212121ULL; - uint64_t sub92 = x ^ 0x5C5C5C5C5C5C5C5CULL; - uint64_t eq92 = (sub92 - 0x0101010101010101ULL); - return ((lt32_or_eq34 | eq92) & is_ascii) != 0; -} - -**/ - -SIMDJSON_CONSTEXPR_LAMBDA simdjson_inline bool -simple_needs_escaping(std::string_view v) { - for (char c : v) { - // a table lookup is faster than a series of comparisons - if (json_quotable_character[static_cast<uint8_t>(c)]) { - return true; - } - } - return false; -} - -#if SIMDJSON_EXPERIMENTAL_HAS_NEON -simdjson_inline bool fast_needs_escaping(std::string_view view) { - if (view.size() < 16) { - return simple_needs_escaping(view); - } - size_t i = 0; - uint8x16_t running = vdupq_n_u8(0); - uint8x16_t v34 = vdupq_n_u8(34); - uint8x16_t v92 = vdupq_n_u8(92); - - for (; i + 15 < view.size(); i += 16) { - uint8x16_t word = vld1q_u8((const uint8_t *)view.data() + i); - running = vorrq_u8(running, vceqq_u8(word, v34)); - running = vorrq_u8(running, vceqq_u8(word, v92)); - running = vorrq_u8(running, vcltq_u8(word, vdupq_n_u8(32))); - } - if (i < view.size()) { - uint8x16_t word = - vld1q_u8((const uint8_t *)view.data() + view.length() - 16); - running = vorrq_u8(running, vceqq_u8(word, v34)); - running = vorrq_u8(running, vceqq_u8(word, v92)); - running = vorrq_u8(running, vcltq_u8(word, vdupq_n_u8(32))); - } - return vmaxvq_u32(vreinterpretq_u32_u8(running)) != 0; -} -#elif SIMDJSON_EXPERIMENTAL_HAS_SSE2 -simdjson_inline bool fast_needs_escaping(std::string_view view) { - if (view.size() < 16) { - return simple_needs_escaping(view); - } - size_t i = 0; - __m128i running = _mm_setzero_si128(); - for (; i + 15 < view.size(); i += 16) { - - __m128i word = - _mm_loadu_si128(reinterpret_cast<const __m128i *>(view.data() + i)); - running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(34))); - running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(92))); - running = _mm_or_si128( - running, _mm_cmpeq_epi8(_mm_subs_epu8(word, _mm_set1_epi8(31)), - _mm_setzero_si128())); - } - if (i < view.size()) { - __m128i word = _mm_loadu_si128( - reinterpret_cast<const __m128i *>(view.data() + view.length() - 16)); - running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(34))); - running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(92))); - running = _mm_or_si128( - running, _mm_cmpeq_epi8(_mm_subs_epu8(word, _mm_set1_epi8(31)), - _mm_setzero_si128())); - } - return _mm_movemask_epi8(running) != 0; -} -#else -simdjson_inline bool fast_needs_escaping(std::string_view view) { - return simple_needs_escaping(view); -} -#endif - -SIMDJSON_CONSTEXPR_LAMBDA inline size_t -find_next_json_quotable_character(const std::string_view view, - size_t location) noexcept { - - for (auto pos = view.begin() + location; pos != view.end(); ++pos) { - if (json_quotable_character[static_cast<uint8_t>(*pos)]) { - return pos - view.begin(); - } - } - return size_t(view.size()); -} - -SIMDJSON_CONSTEXPR_LAMBDA static std::string_view control_chars[] = { - "\\u0000", "\\u0001", "\\u0002", "\\u0003", "\\u0004", "\\u0005", "\\u0006", - "\\u0007", "\\b", "\\t", "\\n", "\\u000b", "\\f", "\\r", - "\\u000e", "\\u000f", "\\u0010", "\\u0011", "\\u0012", "\\u0013", "\\u0014", - "\\u0015", "\\u0016", "\\u0017", "\\u0018", "\\u0019", "\\u001a", "\\u001b", - "\\u001c", "\\u001d", "\\u001e", "\\u001f"}; - -// All Unicode characters may be placed within the quotation marks, except for -// the characters that MUST be escaped: quotation mark, reverse solidus, and the -// control characters (U+0000 through U+001F). There are two-character sequence -// escape representations of some popular characters: -// \", \\, \b, \f, \n, \r, \t. -SIMDJSON_CONSTEXPR_LAMBDA void escape_json_char(char c, char *&out) { - if (c == '"') { - memcpy(out, "\\\"", 2); - out += 2; - } else if (c == '\\') { - memcpy(out, "\\\\", 2); - out += 2; - } else { - std::string_view v = control_chars[uint8_t(c)]; - memcpy(out, v.data(), v.size()); - out += v.size(); - } -} - -inline size_t write_string_escaped(const std::string_view input, char *out) { - size_t mysize = input.size(); - if (!fast_needs_escaping(input)) { // fast path! - memcpy(out, input.data(), input.size()); - return input.size(); - } - const char *const initout = out; - size_t location = find_next_json_quotable_character(input, 0); - memcpy(out, input.data(), location); - out += location; - escape_json_char(input[location], out); - location += 1; - while (location < mysize) { - size_t newlocation = find_next_json_quotable_character(input, location); - memcpy(out, input.data() + location, newlocation - location); - out += newlocation - location; - location = newlocation; - if (location == mysize) { - break; - } - escape_json_char(input[location], out); - location += 1; - } - return out - initout; -} - -simdjson_inline string_builder::string_builder(size_t initial_capacity) - : buffer(new(std::nothrow) char[initial_capacity]), position(0), - capacity(buffer.get() != nullptr ? initial_capacity : 0), - is_valid(buffer.get() != nullptr) {} - -simdjson_inline bool string_builder::capacity_check(size_t upcoming_bytes) { - // We use the convention that when is_valid is false, then the capacity and - // the position are 0. - // Most of the time, this function will return true. - if (simdjson_likely(upcoming_bytes <= capacity - position)) { - return true; - } - // check for overflow, most of the time there is no overflow - if (simdjson_likely(position + upcoming_bytes < position)) { - return false; - } - // We will rarely get here. - grow_buffer((std::max)(capacity * 2, position + upcoming_bytes)); - // If the buffer allocation failed, we set is_valid to false. - return is_valid; -} - -simdjson_inline void string_builder::grow_buffer(size_t desired_capacity) { - if (!is_valid) { - return; - } - std::unique_ptr<char[]> new_buffer(new (std::nothrow) char[desired_capacity]); - if (new_buffer.get() == nullptr) { - set_valid(false); - return; - } - std::memcpy(new_buffer.get(), buffer.get(), position); - buffer.swap(new_buffer); - capacity = desired_capacity; -} - -simdjson_inline void string_builder::set_valid(bool valid) noexcept { - if (!valid) { - is_valid = false; - capacity = 0; - position = 0; - buffer.reset(); - } else { - is_valid = true; - } -} - -simdjson_inline size_t string_builder::size() const noexcept { - return position; -} - -simdjson_inline void string_builder::append(char c) noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = c; - } -} - -simdjson_inline void string_builder::append_null() noexcept { - constexpr char null_literal[] = "null"; - constexpr size_t null_len = sizeof(null_literal) - 1; - if (capacity_check(null_len)) { - std::memcpy(buffer.get() + position, null_literal, null_len); - position += null_len; - } -} - -simdjson_inline void string_builder::clear() noexcept { - position = 0; - // if it was invalid, we should try to repair it - if (!is_valid) { - capacity = 0; - buffer.reset(); - is_valid = true; - } -} - -namespace internal { - -template <typename number_type, typename = typename std::enable_if< - std::is_unsigned<number_type>::value>::type> -simdjson_really_inline int int_log2(number_type x) { - return 63 - leading_zeroes(uint64_t(x) | 1); -} - -simdjson_really_inline int fast_digit_count_32(uint32_t x) { - static uint64_t table[] = { - 4294967296, 8589934582, 8589934582, 8589934582, 12884901788, - 12884901788, 12884901788, 17179868184, 17179868184, 17179868184, - 21474826480, 21474826480, 21474826480, 21474826480, 25769703776, - 25769703776, 25769703776, 30063771072, 30063771072, 30063771072, - 34349738368, 34349738368, 34349738368, 34349738368, 38554705664, - 38554705664, 38554705664, 41949672960, 41949672960, 41949672960, - 42949672960, 42949672960}; - return uint32_t((x + table[int_log2(x)]) >> 32); -} - -simdjson_really_inline int fast_digit_count_64(uint64_t x) { - static uint64_t table[] = {9, - 99, - 999, - 9999, - 99999, - 999999, - 9999999, - 99999999, - 999999999, - 9999999999, - 99999999999, - 999999999999, - 9999999999999, - 99999999999999, - 999999999999999ULL, - 9999999999999999ULL, - 99999999999999999ULL, - 999999999999999999ULL, - 9999999999999999999ULL}; - int y = (19 * int_log2(x) >> 6); - y += x > table[y]; - return y + 1; -} - -template <typename number_type, typename = typename std::enable_if< - std::is_unsigned<number_type>::value>::type> -simdjson_really_inline size_t digit_count(number_type v) noexcept { - static_assert(sizeof(number_type) == 8 || sizeof(number_type) == 4 || - sizeof(number_type) == 2 || sizeof(number_type) == 1, - "We only support 8-bit, 16-bit, 32-bit and 64-bit numbers"); - SIMDJSON_IF_CONSTEXPR(sizeof(number_type) <= 4) { - return fast_digit_count_32(static_cast<uint32_t>(v)); - } - else { - return fast_digit_count_64(static_cast<uint64_t>(v)); - } -} -static const char decimal_table[200] = { - 0x30, 0x30, 0x30, 0x31, 0x30, 0x32, 0x30, 0x33, 0x30, 0x34, 0x30, 0x35, - 0x30, 0x36, 0x30, 0x37, 0x30, 0x38, 0x30, 0x39, 0x31, 0x30, 0x31, 0x31, - 0x31, 0x32, 0x31, 0x33, 0x31, 0x34, 0x31, 0x35, 0x31, 0x36, 0x31, 0x37, - 0x31, 0x38, 0x31, 0x39, 0x32, 0x30, 0x32, 0x31, 0x32, 0x32, 0x32, 0x33, - 0x32, 0x34, 0x32, 0x35, 0x32, 0x36, 0x32, 0x37, 0x32, 0x38, 0x32, 0x39, - 0x33, 0x30, 0x33, 0x31, 0x33, 0x32, 0x33, 0x33, 0x33, 0x34, 0x33, 0x35, - 0x33, 0x36, 0x33, 0x37, 0x33, 0x38, 0x33, 0x39, 0x34, 0x30, 0x34, 0x31, - 0x34, 0x32, 0x34, 0x33, 0x34, 0x34, 0x34, 0x35, 0x34, 0x36, 0x34, 0x37, - 0x34, 0x38, 0x34, 0x39, 0x35, 0x30, 0x35, 0x31, 0x35, 0x32, 0x35, 0x33, - 0x35, 0x34, 0x35, 0x35, 0x35, 0x36, 0x35, 0x37, 0x35, 0x38, 0x35, 0x39, - 0x36, 0x30, 0x36, 0x31, 0x36, 0x32, 0x36, 0x33, 0x36, 0x34, 0x36, 0x35, - 0x36, 0x36, 0x36, 0x37, 0x36, 0x38, 0x36, 0x39, 0x37, 0x30, 0x37, 0x31, - 0x37, 0x32, 0x37, 0x33, 0x37, 0x34, 0x37, 0x35, 0x37, 0x36, 0x37, 0x37, - 0x37, 0x38, 0x37, 0x39, 0x38, 0x30, 0x38, 0x31, 0x38, 0x32, 0x38, 0x33, - 0x38, 0x34, 0x38, 0x35, 0x38, 0x36, 0x38, 0x37, 0x38, 0x38, 0x38, 0x39, - 0x39, 0x30, 0x39, 0x31, 0x39, 0x32, 0x39, 0x33, 0x39, 0x34, 0x39, 0x35, - 0x39, 0x36, 0x39, 0x37, 0x39, 0x38, 0x39, 0x39, -}; -} // namespace internal - -template <typename number_type, typename> -simdjson_inline void string_builder::append(number_type v) noexcept { - static_assert(std::is_same<number_type, bool>::value || - std::is_integral<number_type>::value || - std::is_floating_point<number_type>::value, - "Unsupported number type"); - // If C++17 is available, we can 'if constexpr' here. - SIMDJSON_IF_CONSTEXPR(std::is_same<number_type, bool>::value) { - if (v) { - constexpr char true_literal[] = "true"; - constexpr size_t true_len = sizeof(true_literal) - 1; - if (capacity_check(true_len)) { - std::memcpy(buffer.get() + position, true_literal, true_len); - position += true_len; - } - } else { - constexpr char false_literal[] = "false"; - constexpr size_t false_len = sizeof(false_literal) - 1; - if (capacity_check(false_len)) { - std::memcpy(buffer.get() + position, false_literal, false_len); - position += false_len; - } - } - } - else SIMDJSON_IF_CONSTEXPR(std::is_unsigned<number_type>::value) { - constexpr size_t max_number_size = 20; - if (capacity_check(max_number_size)) { - using unsigned_type = typename std::make_unsigned<number_type>::type; - unsigned_type pv = static_cast<unsigned_type>(v); - size_t dc = internal::digit_count(pv); - char *write_pointer = buffer.get() + position + dc - 1; - while (pv >= 100) { - memcpy(write_pointer - 1, &internal::decimal_table[(pv % 100) * 2], 2); - write_pointer -= 2; - pv /= 100; - } - if (pv >= 10) { - *write_pointer-- = char('0' + (pv % 10)); - pv /= 10; - } - *write_pointer = char('0' + pv); - position += dc; - } - } - else SIMDJSON_IF_CONSTEXPR(std::is_integral<number_type>::value) { - constexpr size_t max_number_size = 20; - if (capacity_check(max_number_size)) { - using unsigned_type = typename std::make_unsigned<number_type>::type; - bool negative = v < 0; - unsigned_type pv = static_cast<unsigned_type>(v); - if (negative) { - pv = 0 - pv; // the 0 is for Microsoft - } - size_t dc = internal::digit_count(pv); - // by always writing the minus sign, we avoid the branch. - buffer.get()[position] = '-'; - position += negative ? 1 : 0; - char *write_pointer = buffer.get() + position + dc - 1; - while (pv >= 100) { - memcpy(write_pointer - 1, &internal::decimal_table[(pv % 100) * 2], 2); - write_pointer -= 2; - pv /= 100; - } - if (pv >= 10) { - *write_pointer-- = char('0' + (pv % 10)); - pv /= 10; - } - *write_pointer = char('0' + pv); - position += dc; - } + advance_root_scalar("int64"); } - else SIMDJSON_IF_CONSTEXPR(std::is_floating_point<number_type>::value) { - constexpr size_t max_number_size = 24; - if (capacity_check(max_number_size)) { - // We could specialize for float. - char *end = simdjson::internal::to_chars(buffer.get() + position, nullptr, - double(v)); - position = end - buffer.get(); - } + return result; +} +simdjson_warn_unused simdjson_inline simdjson_result<double> value_iterator::get_root_double(bool check_trailing) noexcept { + auto max_len = peek_root_length(); + auto json = peek_root_scalar("double"); + // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/, + // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest + // number: -0.<fraction>e-308. + uint8_t tmpbuf[1074+8+1+1]; // +1 for null termination. + tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated. + if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) { + logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters"); + return NUMBER_ERROR; + } + auto result = numberparsing::parse_double(tmpbuf); + if(result.error() == SUCCESS) { + if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } + advance_root_scalar("double"); } + return result; } -simdjson_inline void -string_builder::escape_and_append(std::string_view input) noexcept { - // escaping might turn a control character into \x00xx so 6 characters. - if (capacity_check(6 * input.size())) { - position += write_string_escaped(input, buffer.get() + position); +simdjson_warn_unused simdjson_inline simdjson_result<double> value_iterator::get_root_double_in_string(bool check_trailing) noexcept { + auto max_len = peek_root_length(); + auto json = peek_root_scalar("double"); + // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/, + // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest + // number: -0.<fraction>e-308. + uint8_t tmpbuf[1074+8+1+1]; // +1 for null termination. + tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated. + if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) { + logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters"); + return NUMBER_ERROR; + } + auto result = numberparsing::parse_double_in_string(tmpbuf); + if(result.error() == SUCCESS) { + if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } + advance_root_scalar("double"); } + return result; } -simdjson_inline void -string_builder::escape_and_append_with_quotes(std::string_view input) noexcept { - // escaping might turn a control character into \x00xx so 6 characters. - if (capacity_check(2 + 6 * input.size())) { - buffer.get()[position++] = '"'; - position += write_string_escaped(input, buffer.get() + position); - buffer.get()[position++] = '"'; - } +simdjson_warn_unused simdjson_inline simdjson_result<bool> value_iterator::get_root_bool(bool check_trailing) noexcept { + auto max_len = peek_root_length(); + auto json = peek_root_scalar("bool"); + // We have a boolean if we have either "true" or "false" and the next character is either + // a structural character or whitespace. We also check that the length is correct: + // "true" and "false" are 4 and 5 characters long, respectively. + bool value_true = (max_len >= 4 && !atomparsing::str4ncmp(json, "true") && + (max_len == 4 || jsoncharutils::is_structural_or_whitespace(json[4]))); + bool value_false = (max_len >= 5 && !atomparsing::str4ncmp(json, "false") && + (max_len == 5 || jsoncharutils::is_structural_or_whitespace(json[5]))); + if(value_true == false && value_false == false) { return incorrect_type_error("Not a boolean"); } + if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } + advance_root_scalar("bool"); + return value_true; } -simdjson_inline void -string_builder::escape_and_append_with_quotes(char input) noexcept { - // escaping might turn a control character into \x00xx so 6 characters. - if (capacity_check(2 + 6 * 1)) { - buffer.get()[position++] = '"'; - std::string_view cinput(&input, 1); - position += write_string_escaped(cinput, buffer.get() + position); - buffer.get()[position++] = '"'; +simdjson_inline simdjson_result<bool> value_iterator::is_root_null(bool check_trailing) noexcept { + auto max_len = peek_root_length(); + auto json = peek_root_scalar("null"); + bool result = (max_len >= 4 && !atomparsing::str4ncmp(json, "null") && + (max_len == 4 || jsoncharutils::is_structural_or_whitespace(json[4]))); + if(result) { // we have something that looks like a null. + if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } + advance_root_scalar("null"); + } else if (json[0] == 'n') { + return incorrect_type_error("Not a null but starts with n"); } + return result; } -simdjson_inline void -string_builder::escape_and_append_with_quotes(const char *input) noexcept { - std::string_view cinput(input); - escape_and_append_with_quotes(cinput); +simdjson_warn_unused simdjson_inline error_code value_iterator::skip_child() noexcept { + SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); + SIMDJSON_ASSUME( _json_iter->_depth >= _depth ); + + return _json_iter->skip_child(depth()); } -#if SIMDJSON_SUPPORTS_CONCEPTS -template <constevalutil::fixed_string key> -simdjson_inline void string_builder::escape_and_append_with_quotes() noexcept { - escape_and_append_with_quotes(constevalutil::string_constant<key>::value); + +simdjson_inline value_iterator value_iterator::child() const noexcept { + assert_at_child(); + return { _json_iter, depth()+1, _json_iter->token.position() }; } -#endif -simdjson_inline void string_builder::append_raw(const char *c) noexcept { - size_t len = std::strlen(c); - append_raw(c, len); +// GCC 7 warns when the first line of this function is inlined away into oblivion due to the caller +// relating depth and iterator depth, which is a desired effect. It does not happen if is_open is +// marked non-inline. +SIMDJSON_PUSH_DISABLE_WARNINGS +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING +simdjson_inline bool value_iterator::is_open() const noexcept { + return _json_iter->depth() >= depth(); } +SIMDJSON_POP_DISABLE_WARNINGS -simdjson_inline void -string_builder::append_raw(std::string_view input) noexcept { - if (capacity_check(input.size())) { - std::memcpy(buffer.get() + position, input.data(), input.size()); - position += input.size(); - } +simdjson_inline bool value_iterator::at_end() const noexcept { + return _json_iter->at_end(); } -simdjson_inline void string_builder::append_raw(const char *str, - size_t len) noexcept { - if (capacity_check(len)) { - std::memcpy(buffer.get() + position, str, len); - position += len; - } +simdjson_inline bool value_iterator::at_start() const noexcept { + return _json_iter->token.position() == start_position(); } -#if SIMDJSON_SUPPORTS_CONCEPTS -// Support for optional types (std::optional, etc.) -template <concepts::optional_type T> - requires(!require_custom_serialization<T>) -simdjson_inline void string_builder::append(const T &opt) { - if (opt) { - append(*opt); - } else { - append_null(); - } + +simdjson_inline bool value_iterator::at_first_field() const noexcept { + SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); + return _json_iter->token.position() == start_position() + 1; } -template <typename T> - requires(require_custom_serialization<T>) -simdjson_inline void string_builder::append(T &&val) { - serialize(*this, std::forward<T>(val)); +simdjson_inline void value_iterator::abandon() noexcept { + _json_iter->abandon(); } -template <typename T> - requires(std::is_convertible<T, std::string_view>::value || - std::is_same<T, const char *>::value) -simdjson_inline void string_builder::append(const T &value) { - escape_and_append_with_quotes(value); +simdjson_warn_unused simdjson_inline depth_t value_iterator::depth() const noexcept { + return _depth; +} +simdjson_warn_unused simdjson_inline error_code value_iterator::error() const noexcept { + return _json_iter->error; +} +simdjson_warn_unused simdjson_inline uint8_t *&value_iterator::string_buf_loc() noexcept { + return _json_iter->string_buf_loc(); +} +simdjson_warn_unused simdjson_inline const json_iterator &value_iterator::json_iter() const noexcept { + return *_json_iter; +} +simdjson_warn_unused simdjson_inline json_iterator &value_iterator::json_iter() noexcept { + return *_json_iter; } -#endif -#if SIMDJSON_SUPPORTS_RANGES && SIMDJSON_SUPPORTS_CONCEPTS -// Support for range-based appending (std::ranges::view, etc.) -template <std::ranges::range R> - requires(!std::is_convertible<R, std::string_view>::value && !require_custom_serialization<R>) -simdjson_inline void string_builder::append(const R &range) noexcept { - auto it = std::ranges::begin(range); - auto end = std::ranges::end(range); - if constexpr (concepts::is_pair<std::ranges::range_value_t<R>>) { - start_object(); +simdjson_inline const uint8_t *value_iterator::peek_start() const noexcept { + return _json_iter->peek(start_position()); +} +simdjson_inline uint32_t value_iterator::peek_start_length() const noexcept { + return _json_iter->peek_length(start_position()); +} +simdjson_inline uint32_t value_iterator::peek_root_length() const noexcept { + return _json_iter->peek_root_length(start_position()); +} - if (it == end) { - end_object(); - return; // Handle empty range - } - // Append first item without leading comma - append_key_value(it->first, it->second); - ++it; +simdjson_inline const uint8_t *value_iterator::peek_scalar(const char *type) noexcept { + logger::log_value(*_json_iter, start_position(), depth(), type); + // If we're not at the position anymore, we don't want to advance the cursor. + if (!is_at_start()) { return peek_start(); } - // Append remaining items with preceding commas - for (; it != end; ++it) { - append_comma(); - append_key_value(it->first, it->second); - } - end_object(); - } else { - start_array(); - if (it == end) { - end_array(); - return; // Handle empty range - } + // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value. + assert_at_start(); + return _json_iter->peek(); +} - // Append first item without leading comma - append(*it); - ++it; +simdjson_inline void value_iterator::advance_scalar(const char *type) noexcept { + logger::log_value(*_json_iter, start_position(), depth(), type); + // If we're not at the position anymore, we don't want to advance the cursor. + if (!is_at_start()) { return; } - // Append remaining items with preceding commas - for (; it != end; ++it) { - append_comma(); - append(*it); - } - end_array(); - } + // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value. + assert_at_start(); + _json_iter->return_current_and_advance(); + _json_iter->ascend_to(depth()-1); } +simdjson_warn_unused simdjson_inline error_code value_iterator::start_container(uint8_t start_char, const char *incorrect_type_message, const char *type) noexcept { + logger::log_start_value(*_json_iter, start_position(), depth(), type); + // If we're not at the position anymore, we don't want to advance the cursor. + const uint8_t *json; + if (!is_at_start()) { +#if SIMDJSON_DEVELOPMENT_CHECKS + if (!is_at_iterator_start()) { return OUT_OF_ORDER_ITERATION; } #endif + json = peek_start(); + if (*json != start_char) { return incorrect_type_error(incorrect_type_message); } + } else { + assert_at_start(); + /** + * We should be prudent. Let us peek. If it is not the right type, we + * return an error. Only once we have determined that we have the right + * type are we allowed to advance! + */ + json = _json_iter->peek(); + if (*json != start_char) { return incorrect_type_error(incorrect_type_message); } + _json_iter->return_current_and_advance(); + } -#if SIMDJSON_EXCEPTIONS -simdjson_inline string_builder::operator std::string() const noexcept(false) { - return std::string(operator std::string_view()); -} -simdjson_inline string_builder::operator std::string_view() const - noexcept(false) simdjson_lifetime_bound { - return view(); + return SUCCESS; } -#endif -simdjson_inline simdjson_result<std::string_view> -string_builder::view() const noexcept { - if (!is_valid) { - return simdjson::OUT_OF_CAPACITY; - } - return std::string_view(buffer.get(), position); -} -simdjson_inline simdjson_result<const char *> string_builder::c_str() noexcept { - if (capacity_check(1)) { - buffer.get()[position] = '\0'; - return buffer.get(); - } - return simdjson::OUT_OF_CAPACITY; -} +simdjson_inline const uint8_t *value_iterator::peek_root_scalar(const char *type) noexcept { + logger::log_value(*_json_iter, start_position(), depth(), type); + if (!is_at_start()) { return peek_start(); } -simdjson_inline bool string_builder::validate_unicode() const noexcept { - return simdjson::validate_utf8(buffer.get(), position); + assert_at_root(); + return _json_iter->peek(); } +simdjson_inline const uint8_t *value_iterator::peek_non_root_scalar(const char *type) noexcept { + logger::log_value(*_json_iter, start_position(), depth(), type); + if (!is_at_start()) { return peek_start(); } -simdjson_inline void string_builder::start_object() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = '{'; - } + assert_at_non_root_start(); + return _json_iter->peek(); } -simdjson_inline void string_builder::end_object() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = '}'; - } -} +simdjson_inline void value_iterator::advance_root_scalar(const char *type) noexcept { + logger::log_value(*_json_iter, start_position(), depth(), type); + if (!is_at_start()) { return; } -simdjson_inline void string_builder::start_array() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = '['; - } + assert_at_root(); + _json_iter->return_current_and_advance(); + _json_iter->ascend_to(depth()-1); } +simdjson_inline void value_iterator::advance_non_root_scalar(const char *type) noexcept { + logger::log_value(*_json_iter, start_position(), depth(), type); + if (!is_at_start()) { return; } -simdjson_inline void string_builder::end_array() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = ']'; - } + assert_at_non_root_start(); + _json_iter->return_current_and_advance(); + _json_iter->ascend_to(depth()-1); } -simdjson_inline void string_builder::append_comma() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = ','; - } +simdjson_inline error_code value_iterator::incorrect_type_error(const char *message) const noexcept { + logger::log_error(*_json_iter, start_position(), depth(), message); + return INCORRECT_TYPE; } -simdjson_inline void string_builder::append_colon() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = ':'; - } +simdjson_inline bool value_iterator::is_at_start() const noexcept { + return position() == start_position(); } -template <typename key_type, typename value_type> -simdjson_inline void -string_builder::append_key_value(key_type key, value_type value) noexcept { - static_assert(std::is_same<key_type, const char *>::value || - std::is_convertible<key_type, std::string_view>::value, - "Unsupported key type"); - escape_and_append_with_quotes(key); - append_colon(); - SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, std::nullptr_t>::value) { - append_null(); - } - else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, char>::value) { - escape_and_append_with_quotes(value); - } - else SIMDJSON_IF_CONSTEXPR( - std::is_convertible<value_type, std::string_view>::value) { - escape_and_append_with_quotes(value); - } - else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, const char *>::value) { - escape_and_append_with_quotes(value); - } - else { - append(value); - } +simdjson_inline bool value_iterator::is_at_key() const noexcept { + // Keys are at the same depth as the object. + // Note here that we could be safer and check that we are within an object, + // but we do not. + // + // As long as we are at the object's depth, in a valid document, + // we will only ever be at { , : or the actual string key: ". + return _depth == _json_iter->_depth && *_json_iter->peek() == '"'; } -#if SIMDJSON_SUPPORTS_CONCEPTS -template <constevalutil::fixed_string key, typename value_type> -simdjson_inline void -string_builder::append_key_value(value_type value) noexcept { - escape_and_append_with_quotes<key>(); - append_colon(); - SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, std::nullptr_t>::value) { - append_null(); - } - else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, char>::value) { - escape_and_append_with_quotes(value); - } - else SIMDJSON_IF_CONSTEXPR( - std::is_convertible<value_type, std::string_view>::value) { - escape_and_append_with_quotes(value); - } - else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, const char *>::value) { - escape_and_append_with_quotes(value); - } - else { - append(value); - } +simdjson_inline bool value_iterator::is_at_iterator_start() const noexcept { + // We can legitimately be either at the first value ([1]), or after the array if it's empty ([]). + auto delta = position() - start_position(); + return delta == 1 || delta == 2; } -#endif -} // namespace builder -} // namespace westmere -} // namespace simdjson +inline void value_iterator::assert_at_start() const noexcept { + SIMDJSON_ASSUME( _json_iter->token._position == _start_position ); + SIMDJSON_ASSUME( _json_iter->_depth == _depth ); + SIMDJSON_ASSUME( _depth > 0 ); +} -#endif // SIMDJSON_GENERIC_STRING_BUILDER_INL_H -/* end file simdjson/generic/ondemand/json_string_builder-inl.h for westmere */ -/* including simdjson/generic/ondemand/json_builder.h for westmere: #include "simdjson/generic/ondemand/json_builder.h" */ -/* begin file simdjson/generic/ondemand/json_builder.h for westmere */ -/** - * This file is part of the builder API. It is temporarily in the ondemand directory - * but we will move it to a builder directory later. - */ -#ifndef SIMDJSON_GENERIC_BUILDER_H +inline void value_iterator::assert_at_container_start() const noexcept { + SIMDJSON_ASSUME( _json_iter->token._position == _start_position + 1 ); + SIMDJSON_ASSUME( _json_iter->_depth == _depth ); + SIMDJSON_ASSUME( _depth > 0 ); +} -/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_H */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_string_builder.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/concepts.h" */ -/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -#if SIMDJSON_STATIC_REFLECTION +inline void value_iterator::assert_at_next() const noexcept { + SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); + SIMDJSON_ASSUME( _json_iter->_depth == _depth ); + SIMDJSON_ASSUME( _depth > 0 ); +} -#include <charconv> -#include <cstring> -#include <meta> -#include <memory> -#include <optional> -#include <string_view> -#include <type_traits> -#include <utility> -// #include <static_reflection> // for std::define_static_string - header not available yet +simdjson_inline void value_iterator::move_at_start() noexcept { + _json_iter->_depth = _depth; + _json_iter->token.set_position(_start_position); +} -namespace simdjson { -namespace westmere { -namespace builder { +simdjson_inline void value_iterator::move_at_container_start() noexcept { + _json_iter->_depth = _depth; + _json_iter->token.set_position(_start_position + 1); +} -template <class T> - requires(concepts::container_but_not_string<T> && !require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &t) { - auto it = t.begin(); - auto end = t.end(); - if (it == end) { - b.append_raw("[]"); - return; - } - b.append('['); - atom(b, *it); - ++it; - for (; it != end; ++it) { - b.append(','); - atom(b, *it); - } - b.append(']'); +simdjson_inline simdjson_result<bool> value_iterator::reset_array() noexcept { + if(error()) { return error(); } + move_at_container_start(); + return started_array(); } -template <class T> - requires(std::is_same_v<T, std::string> || - std::is_same_v<T, std::string_view> || - std::is_same_v<T, const char *> || - std::is_same_v<T, char>) -constexpr void atom(string_builder &b, const T &t) { - b.escape_and_append_with_quotes(t); +simdjson_inline simdjson_result<bool> value_iterator::reset_object() noexcept { + if(error()) { return error(); } + move_at_container_start(); + return started_object(); } -template <concepts::string_view_keyed_map T> - requires(!require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &m) { - if (m.empty()) { - b.append_raw("{}"); - return; - } - b.append('{'); - bool first = true; - for (const auto& [key, value] : m) { - if (!first) { - b.append(','); - } - first = false; - // Keys must be convertible to string_view per the concept - b.escape_and_append_with_quotes(key); - b.append(':'); - atom(b, value); - } - b.append('}'); +inline void value_iterator::assert_at_child() const noexcept { + SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); + SIMDJSON_ASSUME( _json_iter->_depth == _depth + 1 ); + SIMDJSON_ASSUME( _depth > 0 ); } +inline void value_iterator::assert_at_root() const noexcept { + assert_at_start(); + SIMDJSON_ASSUME( _depth == 1 ); +} -template<typename number_type, - typename = typename std::enable_if<std::is_arithmetic<number_type>::value && !std::is_same_v<number_type, char>>::type> -constexpr void atom(string_builder &b, const number_type t) { - b.append(t); +inline void value_iterator::assert_at_non_root_start() const noexcept { + assert_at_start(); + SIMDJSON_ASSUME( _depth > 1 ); } -template <class T> - requires(std::is_class_v<T> && !concepts::container_but_not_string<T> && - !concepts::string_view_keyed_map<T> && - !concepts::optional_type<T> && - !concepts::smart_pointer<T> && - !concepts::appendable_containers<T> && - !std::is_same_v<T, std::string> && - !std::is_same_v<T, std::string_view> && - !std::is_same_v<T, const char*> && - !std::is_same_v<T, char> && !require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &t) { - int i = 0; - b.append('{'); - template for (constexpr auto dm : std::define_static_array(std::meta::nonstatic_data_members_of(^^T, std::meta::access_context::unchecked()))) { - if (i != 0) - b.append(','); - constexpr auto key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(dm))); - b.append_raw(key); - b.append(':'); - atom(b, t.[:dm:]); - i++; - }; - b.append('}'); +inline void value_iterator::assert_is_valid() const noexcept { + SIMDJSON_ASSUME( _json_iter != nullptr ); } -// Support for optional types (std::optional, etc.) -template <concepts::optional_type T> - requires(!require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &opt) { - if (opt) { - atom(b, opt.value()); - } else { - b.append_raw("null"); - } +simdjson_inline bool value_iterator::is_valid() const noexcept { + return _json_iter != nullptr; } -// Support for smart pointers (std::unique_ptr, std::shared_ptr, etc.) -template <concepts::smart_pointer T> - requires(!require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &ptr) { - if (ptr) { - atom(b, *ptr); - } else { - b.append_raw("null"); +simdjson_inline simdjson_result<json_type> value_iterator::type() const noexcept { + switch (*peek_start()) { + case '{': + return json_type::object; + case '[': + return json_type::array; + case '"': + return json_type::string; + case 'n': + return json_type::null; + case 't': case 'f': + return json_type::boolean; + case '-': + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + return json_type::number; + default: + return json_type::unknown; } } -// Support for enums - serialize as string representation using expand approach from P2996R12 -template <typename T> - requires(std::is_enum_v<T> && !require_custom_serialization<T>) -void atom(string_builder &b, const T &e) { -#if SIMDJSON_STATIC_REFLECTION - constexpr auto enumerators = std::define_static_array(std::meta::enumerators_of(^^T)); - template for (constexpr auto enum_val : enumerators) { - constexpr auto enum_str = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(enum_val))); - if (e == [:enum_val:]) { - b.append_raw(enum_str); - return; - } - }; - // Fallback to integer if enum value not found - atom(b, static_cast<std::underlying_type_t<T>>(e)); -#else - // Fallback: serialize as integer if reflection not available - atom(b, static_cast<std::underlying_type_t<T>>(e)); -#endif +simdjson_inline token_position value_iterator::start_position() const noexcept { + return _start_position; } -// Support for appendable containers that don't have operator[] (sets, etc.) -template <concepts::appendable_containers T> - requires(!concepts::container_but_not_string<T> && !concepts::string_view_keyed_map<T> && - !concepts::optional_type<T> && !concepts::smart_pointer<T> && - !std::is_same_v<T, std::string> && - !std::is_same_v<T, std::string_view> && !std::is_same_v<T, const char*> && !require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &container) { - if (container.empty()) { - b.append_raw("[]"); - return; - } - b.append('['); - bool first = true; - for (const auto& item : container) { - if (!first) { - b.append(','); - } - first = false; - atom(b, item); - } - b.append(']'); +simdjson_inline token_position value_iterator::position() const noexcept { + return _json_iter->position(); } -// append functions that delegate to atom functions for primitive types -template <class T> - requires(std::is_arithmetic_v<T> && !std::is_same_v<T, char>) -void append(string_builder &b, const T &t) { - atom(b, t); +simdjson_inline token_position value_iterator::end_position() const noexcept { + return _json_iter->end_position(); } -template <class T> - requires(std::is_same_v<T, std::string> || - std::is_same_v<T, std::string_view> || - std::is_same_v<T, const char *> || - std::is_same_v<T, char>) -void append(string_builder &b, const T &t) { - atom(b, t); +simdjson_inline token_position value_iterator::last_position() const noexcept { + return _json_iter->last_position(); } -template <concepts::optional_type T> - requires(!require_custom_serialization<T>) -void append(string_builder &b, const T &t) { - atom(b, t); +simdjson_inline error_code value_iterator::report_error(error_code error, const char *message) noexcept { + return _json_iter->report_error(error, message); } -template <concepts::smart_pointer T> - requires(!require_custom_serialization<T>) -void append(string_builder &b, const T &t) { - atom(b, t); -} +} // namespace ondemand +} // namespace lsx +} // namespace simdjson -template <concepts::appendable_containers T> - requires(!concepts::container_but_not_string<T> && !concepts::string_view_keyed_map<T> && - !concepts::optional_type<T> && !concepts::smart_pointer<T> && - !std::is_same_v<T, std::string> && - !std::is_same_v<T, std::string_view> && !std::is_same_v<T, const char*> && !require_custom_serialization<T>) -void append(string_builder &b, const T &t) { - atom(b, t); +namespace simdjson { + +simdjson_inline simdjson_result<lsx::ondemand::value_iterator>::simdjson_result(lsx::ondemand::value_iterator &&value) noexcept + : implementation_simdjson_result_base<lsx::ondemand::value_iterator>(std::forward<lsx::ondemand::value_iterator>(value)) {} +simdjson_inline simdjson_result<lsx::ondemand::value_iterator>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<lsx::ondemand::value_iterator>(error) {} + +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H +/* end file simdjson/generic/ondemand/value_iterator-inl.h for lsx */ +/* including simdjson/generic/ondemand/serialization-inl.h for lsx: #include "simdjson/generic/ondemand/serialization-inl.h" */ +/* begin file simdjson/generic/ondemand/serialization-inl.h for lsx */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document-inl.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/serialization.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */ +/* amalgamation skipped (editor-only): #if SIMDJSON_STATIC_REFLECTION */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_builder.h" */ +/* amalgamation skipped (editor-only): #endif */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { + +inline std::string_view trim(const std::string_view str) noexcept { + // We can almost surely do better by rolling our own find_first_not_of function. + size_t first = str.find_first_not_of(" \t\n\r"); + // If we have the empty string (just white space), then no trimming is possible, and + // we return the empty string_view. + if (std::string_view::npos == first) { return std::string_view(); } + size_t last = str.find_last_not_of(" \t\n\r"); + return str.substr(first, (last - first + 1)); } -template <concepts::string_view_keyed_map T> - requires(!require_custom_serialization<T>) -void append(string_builder &b, const T &t) { - atom(b, t); + +inline simdjson_result<std::string_view> to_json_string(lsx::ondemand::document& x) noexcept { + std::string_view v; + auto error = x.raw_json().get(v); + if(error) {return error; } + return trim(v); } -// works for struct -template <class Z> - requires(std::is_class_v<Z> && !concepts::container_but_not_string<Z> && - !concepts::string_view_keyed_map<Z> && - !concepts::optional_type<Z> && - !concepts::smart_pointer<Z> && - !concepts::appendable_containers<Z> && - !std::is_same_v<Z, std::string> && - !std::is_same_v<Z, std::string_view> && - !std::is_same_v<Z, const char*> && - !std::is_same_v<Z, char> && !require_custom_serialization<Z>) -void append(string_builder &b, const Z &z) { - int i = 0; - b.append('{'); - template for (constexpr auto dm : std::define_static_array(std::meta::nonstatic_data_members_of(^^Z, std::meta::access_context::unchecked()))) { - if (i != 0) - b.append(','); - constexpr auto key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(dm))); - b.append_raw(key); - b.append(':'); - atom(b, z.[:dm:]); - i++; - }; - b.append('}'); +inline simdjson_result<std::string_view> to_json_string(lsx::ondemand::document_reference& x) noexcept { + std::string_view v; + auto error = x.raw_json().get(v); + if(error) {return error; } + return trim(v); } -// works for container that have begin() and end() iterators -template <class Z> - requires(concepts::container_but_not_string<Z> && !require_custom_serialization<Z>) -void append(string_builder &b, const Z &z) { - auto it = z.begin(); - auto end = z.end(); - if (it == end) { - b.append_raw("[]"); - return; - } - b.append('['); - atom(b, *it); - ++it; - for (; it != end; ++it) { - b.append(','); - atom(b, *it); +inline simdjson_result<std::string_view> to_json_string(lsx::ondemand::value& x) noexcept { + /** + * If we somehow receive a value that has already been consumed, + * then the following code could be in trouble. E.g., we create + * an array as needed, but if an array was already created, then + * it could be bad. + */ + using namespace lsx::ondemand; + lsx::ondemand::json_type t; + auto error = x.type().get(t); + if(error != SUCCESS) { return error; } + switch (t) + { + case json_type::array: + { + lsx::ondemand::array array; + error = x.get_array().get(array); + if(error) { return error; } + return to_json_string(array); + } + case json_type::object: + { + lsx::ondemand::object object; + error = x.get_object().get(object); + if(error) { return error; } + return to_json_string(object); + } + default: + return trim(x.raw_json_token()); } - b.append(']'); } -template <class Z> - requires (require_custom_serialization<Z>) -void append(string_builder &b, const Z &z) { - b.append(z); +inline simdjson_result<std::string_view> to_json_string(lsx::ondemand::object& x) noexcept { + std::string_view v; + auto error = x.raw_json().get(v); + if(error) {return error; } + return trim(v); } - -template <class Z> -simdjson_warn_unused simdjson_result<std::string> to_json_string(const Z &z, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { - string_builder b(initial_capacity); - append(b, z); - std::string_view s; - if(auto e = b.view().get(s); e) { return e; } - return std::string(s); +inline simdjson_result<std::string_view> to_json_string(lsx::ondemand::array& x) noexcept { + std::string_view v; + auto error = x.raw_json().get(v); + if(error) {return error; } + return trim(v); } -template <class Z> -simdjson_warn_unused simdjson_error to_json(const Z &z, std::string &s, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { - string_builder b(initial_capacity); - append(b, z); - std::string_view view; - if(auto e = b.view().get(view); e) { return e; } - s.assign(view); - return SUCCESS; +inline simdjson_result<std::string_view> to_json_string(simdjson_result<lsx::ondemand::document> x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } -template <class Z> -string_builder& operator<<(string_builder& b, const Z& z) { - append(b, z); - return b; +inline simdjson_result<std::string_view> to_json_string(simdjson_result<lsx::ondemand::document_reference> x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } -// extract_from: Serialize only specific fields from a struct to JSON -template<constevalutil::fixed_string... FieldNames, typename T> - requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) -void extract_from(string_builder &b, const T &obj) { - // Helper to check if a field name matches any of the requested fields - auto should_extract = [](std::string_view field_name) constexpr -> bool { - return ((FieldNames.view() == field_name) || ...); - }; - - b.append('{'); - bool first = true; - - // Iterate through all members of T using reflection - template for (constexpr auto mem : std::define_static_array( - std::meta::nonstatic_data_members_of(^^T, std::meta::access_context::unchecked()))) { - - if constexpr (std::meta::is_public(mem)) { - constexpr std::string_view key = std::define_static_string(std::meta::identifier_of(mem)); +inline simdjson_result<std::string_view> to_json_string(simdjson_result<lsx::ondemand::value> x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); +} - // Only serialize this field if it's in our list of requested fields - if constexpr (should_extract(key)) { - if (!first) { - b.append(','); - } - first = false; +inline simdjson_result<std::string_view> to_json_string(simdjson_result<lsx::ondemand::object> x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); +} - // Serialize the key - constexpr auto quoted_key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(mem))); - b.append_raw(quoted_key); - b.append(':'); +inline simdjson_result<std::string_view> to_json_string(simdjson_result<lsx::ondemand::array> x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); +} +} // namespace simdjson - // Serialize the value - atom(b, obj.[:mem:]); - } - } - }; +namespace simdjson { namespace lsx { namespace ondemand { - b.append('}'); +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::lsx::ondemand::value x) { + std::string_view v; + auto error = simdjson::to_json_string(x).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + throw simdjson::simdjson_error(error); + } } - -template<constevalutil::fixed_string... FieldNames, typename T> - requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) -simdjson_warn_unused simdjson_result<std::string> extract_from(const T &obj, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { - string_builder b(initial_capacity); - extract_from<FieldNames...>(b, obj); - std::string_view s; - if(auto e = b.view().get(s); e) { return e; } - return std::string(s); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::lsx::ondemand::value> x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); +} +#else +inline std::ostream& operator<<(std::ostream& out, simdjson::lsx::ondemand::value x) { + std::string_view v; + auto error = simdjson::to_json_string(x).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + return (out << error); + } } +#endif -} // namespace builder -} // namespace westmere -// Alias the function template to 'to' in the global namespace -template <class Z> -simdjson_warn_unused simdjson_result<std::string> to_json(const Z &z, size_t initial_capacity = westmere::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { - westmere::builder::string_builder b(initial_capacity); - westmere::builder::append(b, z); - std::string_view s; - if(auto e = b.view().get(s); e) { return e; } - return std::string(s); +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::lsx::ondemand::array value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + throw simdjson::simdjson_error(error); + } } -template <class Z> -simdjson_warn_unused simdjson_error to_json(const Z &z, std::string &s, size_t initial_capacity = westmere::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { - westmere::builder::string_builder b(initial_capacity); - westmere::builder::append(b, z); - std::string_view view; - if(auto e = b.view().get(view); e) { return e; } - s.assign(view); - return SUCCESS; +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::lsx::ondemand::array> x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); } -// Global namespace function for extract_from -template<constevalutil::fixed_string... FieldNames, typename T> - requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) -simdjson_warn_unused simdjson_result<std::string> extract_from(const T &obj, size_t initial_capacity = westmere::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { - westmere::builder::string_builder b(initial_capacity); - westmere::builder::extract_from<FieldNames...>(b, obj); - std::string_view s; - if(auto e = b.view().get(s); e) { return e; } - return std::string(s); +#else +inline std::ostream& operator<<(std::ostream& out, simdjson::lsx::ondemand::array value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + return (out << error); + } } +#endif -} // namespace simdjson - -#endif // SIMDJSON_STATIC_REFLECTION +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::lsx::ondemand::document& value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + throw simdjson::simdjson_error(error); + } +} +inline std::ostream& operator<<(std::ostream& out, simdjson::lsx::ondemand::document_reference& value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + throw simdjson::simdjson_error(error); + } +} +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::lsx::ondemand::document>&& x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); +} +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::lsx::ondemand::document_reference>&& x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); +} +#else +inline std::ostream& operator<<(std::ostream& out, simdjson::lsx::ondemand::document& value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + return (out << error); + } +} +#endif +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::lsx::ondemand::object value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + throw simdjson::simdjson_error(error); + } +} +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::lsx::ondemand::object> x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); +} +#else +inline std::ostream& operator<<(std::ostream& out, simdjson::lsx::ondemand::object value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + return (out << error); + } +} #endif -/* end file simdjson/generic/ondemand/json_builder.h for westmere */ +}}} // namespace simdjson::lsx::ondemand + +#endif // SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H +/* end file simdjson/generic/ondemand/serialization-inl.h for lsx */ // JSON path accessor (compile-time) - must be after inline definitions -/* including simdjson/generic/ondemand/compile_time_accessors.h for westmere: #include "simdjson/generic/ondemand/compile_time_accessors.h" */ -/* begin file simdjson/generic/ondemand/compile_time_accessors.h for westmere */ +/* including simdjson/generic/ondemand/compile_time_accessors.h for lsx: #include "simdjson/generic/ondemand/compile_time_accessors.h" */ +/* begin file simdjson/generic/ondemand/compile_time_accessors.h for lsx */ /** * Compile-time JSON Path and JSON Pointer accessors using C++26 reflection (P2996) * @@ -122496,7 +155959,7 @@ simdjson_warn_unused simdjson_result<std::string> extract_from(const T &obj, siz #include <array> namespace simdjson { -namespace westmere { +namespace lsx { namespace ondemand { /*** * JSONPath implementation for compile-time access @@ -122507,7 +155970,7 @@ namespace json_path { // Note: value type must be fully defined before this header is included // This is ensured by including this in amalgamated.h after value-inl.h -using ::simdjson::westmere::ondemand::value; +using ::simdjson::lsx::ondemand::value; // Path step types enum class step_type { @@ -122641,7 +156104,7 @@ struct json_path_parser { // Compile-time path accessor generator template<typename T, constevalutil::fixed_string Path> struct path_accessor { - using value = ::simdjson::westmere::ondemand::value; + using value = ::simdjson::lsx::ondemand::value; static constexpr auto parser = json_path_parser<Path>(); static constexpr std::size_t num_steps = parser.count_steps(); @@ -123119,14 +156582,14 @@ struct path_accessor { // Compile-time path accessor with validation template<typename T, constevalutil::fixed_string Path, typename DocOrValue> -inline simdjson_result<::simdjson::westmere::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { +inline simdjson_result<::simdjson::lsx::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { using accessor = path_accessor<T, Path>; return accessor::access(doc_or_val); } // Overload without type parameter (no validation) template<constevalutil::fixed_string Path, typename DocOrValue> -inline simdjson_result<::simdjson::westmere::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { +inline simdjson_result<::simdjson::lsx::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { using accessor = path_accessor<void, Path>; return accessor::access(doc_or_val); } @@ -123357,59 +156820,63 @@ struct pointer_accessor { // Compile-time JSON Pointer accessor with validation template<typename T, constevalutil::fixed_string Pointer, typename DocOrValue> -inline simdjson_result<::simdjson::westmere::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { +inline simdjson_result<::simdjson::lsx::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { using accessor = pointer_accessor<T, Pointer>; return accessor::access(doc_or_val); } // Overload without type parameter (no validation) template<constevalutil::fixed_string Pointer, typename DocOrValue> -inline simdjson_result<::simdjson::westmere::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { +inline simdjson_result<::simdjson::lsx::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { using accessor = pointer_accessor<void, Pointer>; return accessor::access(doc_or_val); } } // namespace json_path } // namespace ondemand -} // namespace westmere +} // namespace lsx } // namespace simdjson #endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION #endif // SIMDJSON_GENERIC_ONDEMAND_COMPILE_TIME_ACCESSORS_H -/* end file simdjson/generic/ondemand/compile_time_accessors.h for westmere */ +/* end file simdjson/generic/ondemand/compile_time_accessors.h for lsx */ -/* end file simdjson/generic/ondemand/amalgamated.h for westmere */ -/* including simdjson/westmere/end.h: #include "simdjson/westmere/end.h" */ -/* begin file simdjson/westmere/end.h */ +/* end file simdjson/generic/ondemand/amalgamated.h for lsx */ +/* including simdjson/lsx/end.h: #include "simdjson/lsx/end.h" */ +/* begin file simdjson/lsx/end.h */ /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -#if !SIMDJSON_CAN_ALWAYS_RUN_WESTMERE -SIMDJSON_UNTARGET_REGION -#endif - -/* undefining SIMDJSON_IMPLEMENTATION from "westmere" */ +#undef SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT +/* undefining SIMDJSON_IMPLEMENTATION from "lsx" */ #undef SIMDJSON_IMPLEMENTATION -/* end file simdjson/westmere/end.h */ +/* end file simdjson/lsx/end.h */ -#endif // SIMDJSON_WESTMERE_IMPLEMENTATION_H -/* end file simdjson/westmere/ondemand.h */ -#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(lsx) -/* including simdjson/lsx/ondemand.h: #include "simdjson/lsx/ondemand.h" */ -/* begin file simdjson/lsx/ondemand.h */ -#ifndef SIMDJSON_LSX_ONDEMAND_H -#define SIMDJSON_LSX_ONDEMAND_H +#endif // SIMDJSON_LSX_ONDEMAND_H +/* end file simdjson/lsx/ondemand.h */ +#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(lasx) +/* including simdjson/lasx/ondemand.h: #include "simdjson/lasx/ondemand.h" */ +/* begin file simdjson/lasx/ondemand.h */ +#ifndef SIMDJSON_LASX_ONDEMAND_H +#define SIMDJSON_LASX_ONDEMAND_H -/* including simdjson/lsx/begin.h: #include "simdjson/lsx/begin.h" */ -/* begin file simdjson/lsx/begin.h */ -/* defining SIMDJSON_IMPLEMENTATION to "lsx" */ -#define SIMDJSON_IMPLEMENTATION lsx -/* including simdjson/lsx/base.h: #include "simdjson/lsx/base.h" */ -/* begin file simdjson/lsx/base.h */ -#ifndef SIMDJSON_LSX_BASE_H -#define SIMDJSON_LSX_BASE_H +/* including simdjson/lasx/begin.h: #include "simdjson/lasx/begin.h" */ +/* begin file simdjson/lasx/begin.h */ +/* defining SIMDJSON_IMPLEMENTATION to "lasx" */ +#define SIMDJSON_IMPLEMENTATION lasx +#include <lsxintrin.h> // This is a hack. We should not need to put this include here. +#if SIMDJSON_CAN_ALWAYS_RUN_LASX +// nothing needed. +#else +SIMDJSON_TARGET_REGION("lasx,lsx") +#endif + +/* including simdjson/lasx/base.h: #include "simdjson/lasx/base.h" */ +/* begin file simdjson/lasx/base.h */ +#ifndef SIMDJSON_LASX_BASE_H +#define SIMDJSON_LASX_BASE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ /* amalgamation skipped (editor-only): #include "simdjson/base.h" */ @@ -123417,9 +156884,9 @@ SIMDJSON_UNTARGET_REGION namespace simdjson { /** - * Implementation for LSX. + * Implementation for LASX. */ -namespace lsx { +namespace lasx { class implementation; @@ -123430,41 +156897,40 @@ template <typename T> struct simd8x64; } // namespace simd } // unnamed namespace -} // namespace lsx +} // namespace lasx } // namespace simdjson -#endif // SIMDJSON_LSX_BASE_H -/* end file simdjson/lsx/base.h */ -/* including simdjson/lsx/intrinsics.h: #include "simdjson/lsx/intrinsics.h" */ -/* begin file simdjson/lsx/intrinsics.h */ -#ifndef SIMDJSON_LSX_INTRINSICS_H -#define SIMDJSON_LSX_INTRINSICS_H +#endif // SIMDJSON_LASX_BASE_H +/* end file simdjson/lasx/base.h */ +/* including simdjson/lasx/intrinsics.h: #include "simdjson/lasx/intrinsics.h" */ +/* begin file simdjson/lasx/intrinsics.h */ +#ifndef SIMDJSON_LASX_INTRINSICS_H +#define SIMDJSON_LASX_INTRINSICS_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -// This should be the correct header whether -// you use visual studio or other compilers. #include <lsxintrin.h> +#include <lasxintrin.h> -static_assert(sizeof(__m128i) <= simdjson::SIMDJSON_PADDING, "insufficient padding for LoongArch SX"); +static_assert(sizeof(__m256i) <= simdjson::SIMDJSON_PADDING, "insufficient padding for LoongArch ASX"); -#endif // SIMDJSON_LSX_INTRINSICS_H -/* end file simdjson/lsx/intrinsics.h */ -/* including simdjson/lsx/bitmanipulation.h: #include "simdjson/lsx/bitmanipulation.h" */ -/* begin file simdjson/lsx/bitmanipulation.h */ -#ifndef SIMDJSON_LSX_BITMANIPULATION_H -#define SIMDJSON_LSX_BITMANIPULATION_H +#endif // SIMDJSON_LASX_INTRINSICS_H +/* end file simdjson/lasx/intrinsics.h */ +/* including simdjson/lasx/bitmanipulation.h: #include "simdjson/lasx/bitmanipulation.h" */ +/* begin file simdjson/lasx/bitmanipulation.h */ +#ifndef SIMDJSON_LASX_BITMANIPULATION_H +#define SIMDJSON_LASX_BITMANIPULATION_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/intrinsics.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/bitmask.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/intrinsics.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/bitmask.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace { // We sometimes call trailing_zero on inputs that are zero, @@ -123491,7 +156957,7 @@ simdjson_inline int leading_zeroes(uint64_t input_num) { /* result might be undefined when input_num is zero */ simdjson_inline int count_ones(uint64_t input_num) { - return __lsx_vpickve2gr_w(__lsx_vpcnt_d(__m128i(v2u64{input_num, 0})), 0); + return __lasx_xvpickve2gr_w(__lasx_xvpcnt_d(__m256i(v4u64{input_num, 0, 0, 0})), 0); } simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2, uint64_t *result) { @@ -123500,22 +156966,22 @@ simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2, uint64_t *re } } // unnamed namespace -} // namespace lsx +} // namespace lasx } // namespace simdjson -#endif // SIMDJSON_LSX_BITMANIPULATION_H -/* end file simdjson/lsx/bitmanipulation.h */ -/* including simdjson/lsx/bitmask.h: #include "simdjson/lsx/bitmask.h" */ -/* begin file simdjson/lsx/bitmask.h */ -#ifndef SIMDJSON_LSX_BITMASK_H -#define SIMDJSON_LSX_BITMASK_H +#endif // SIMDJSON_LASX_BITMANIPULATION_H +/* end file simdjson/lasx/bitmanipulation.h */ +/* including simdjson/lasx/bitmask.h: #include "simdjson/lasx/bitmask.h" */ +/* begin file simdjson/lasx/bitmask.h */ +#ifndef SIMDJSON_LASX_BITMASK_H +#define SIMDJSON_LASX_BITMASK_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace { // @@ -123534,26 +157000,26 @@ simdjson_inline uint64_t prefix_xor(uint64_t bitmask) { } } // unnamed namespace -} // namespace lsx +} // namespace lasx } // namespace simdjson #endif -/* end file simdjson/lsx/bitmask.h */ -/* including simdjson/lsx/numberparsing_defs.h: #include "simdjson/lsx/numberparsing_defs.h" */ -/* begin file simdjson/lsx/numberparsing_defs.h */ -#ifndef SIMDJSON_LSX_NUMBERPARSING_DEFS_H -#define SIMDJSON_LSX_NUMBERPARSING_DEFS_H +/* end file simdjson/lasx/bitmask.h */ +/* including simdjson/lasx/numberparsing_defs.h: #include "simdjson/lasx/numberparsing_defs.h" */ +/* begin file simdjson/lasx/numberparsing_defs.h */ +#ifndef SIMDJSON_LASX_NUMBERPARSING_DEFS_H +#define SIMDJSON_LASX_NUMBERPARSING_DEFS_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/intrinsics.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/intrinsics.h" */ /* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ #include <cstring> namespace simdjson { -namespace lsx { +namespace lasx { namespace numberparsing { // we don't have appropriate instructions, so let us use a scalar function @@ -123576,7 +157042,7 @@ simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t } } // namespace numberparsing -} // namespace lsx +} // namespace lasx } // namespace simdjson #ifndef SIMDJSON_SWAR_NUMBER_PARSING @@ -123587,46 +157053,46 @@ simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t #endif #endif -#endif // SIMDJSON_LSX_NUMBERPARSING_DEFS_H -/* end file simdjson/lsx/numberparsing_defs.h */ -/* including simdjson/lsx/simd.h: #include "simdjson/lsx/simd.h" */ -/* begin file simdjson/lsx/simd.h */ -#ifndef SIMDJSON_LSX_SIMD_H -#define SIMDJSON_LSX_SIMD_H +#endif // SIMDJSON_LASX_NUMBERPARSING_DEFS_H +/* end file simdjson/lasx/numberparsing_defs.h */ +/* including simdjson/lasx/simd.h: #include "simdjson/lasx/simd.h" */ +/* begin file simdjson/lasx/simd.h */ +#ifndef SIMDJSON_LASX_SIMD_H +#define SIMDJSON_LASX_SIMD_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/bitmanipulation.h" */ /* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace { namespace simd { // Forward-declared so they can be used by splat and friends. template<typename Child> struct base { - __m128i value; + __m256i value; // Zero constructor - simdjson_inline base() : value{__m128i()} {} + simdjson_inline base() : value{__m256i()} {} // Conversion from SIMD register - simdjson_inline base(const __m128i _value) : value(_value) {} + simdjson_inline base(const __m256i _value) : value(_value) {} // Conversion to SIMD register - simdjson_inline operator const __m128i&() const { return this->value; } - simdjson_inline operator __m128i&() { return this->value; } - simdjson_inline operator const v16i8&() const { return (v16i8&)this->value; } - simdjson_inline operator v16i8&() { return (v16i8&)this->value; } + simdjson_inline operator const __m256i&() const { return this->value; } + simdjson_inline operator __m256i&() { return this->value; } + simdjson_inline operator const v32i8&() const { return (v32i8&)this->value; } + simdjson_inline operator v32i8&() { return (v32i8&)this->value; } // Bit operations - simdjson_inline Child operator|(const Child other) const { return __lsx_vor_v(*this, other); } - simdjson_inline Child operator&(const Child other) const { return __lsx_vand_v(*this, other); } - simdjson_inline Child operator^(const Child other) const { return __lsx_vxor_v(*this, other); } - simdjson_inline Child bit_andnot(const Child other) const { return __lsx_vandn_v(other, *this); } + simdjson_inline Child operator|(const Child other) const { return __lasx_xvor_v(*this, other); } + simdjson_inline Child operator&(const Child other) const { return __lasx_xvand_v(*this, other); } + simdjson_inline Child operator^(const Child other) const { return __lasx_xvxor_v(*this, other); } + simdjson_inline Child bit_andnot(const Child other) const { return __lasx_xvandn_v(other, *this); } simdjson_inline Child& operator|=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast | other; return *this_cast; } simdjson_inline Child& operator&=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast & other; return *this_cast; } simdjson_inline Child& operator^=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast ^ other; return *this_cast; } @@ -123639,41 +157105,51 @@ namespace simd { template<typename T, typename Mask=simd8<bool>> struct base8: base<simd8<T>> { simdjson_inline base8() : base<simd8<T>>() {} - simdjson_inline base8(const __m128i _value) : base<simd8<T>>(_value) {} + simdjson_inline base8(const __m256i _value) : base<simd8<T>>(_value) {} - friend simdjson_really_inline Mask operator==(const simd8<T> lhs, const simd8<T> rhs) { return __lsx_vseq_b(lhs, rhs); } + friend simdjson_really_inline Mask operator==(const simd8<T> lhs, const simd8<T> rhs) { return __lasx_xvseq_b(lhs, rhs); } static const int SIZE = sizeof(base<simd8<T>>::value); template<int N=1> simdjson_inline simd8<T> prev(const simd8<T> prev_chunk) const { - return __lsx_vor_v(__lsx_vbsll_v(*this, N), __lsx_vbsrl_v(prev_chunk, 16 - N)); + __m256i hi = __lasx_xvbsll_v(*this, N); + __m256i lo = __lasx_xvbsrl_v(*this, 16 - N); + __m256i tmp = __lasx_xvbsrl_v(prev_chunk, 16 - N); + lo = __lasx_xvpermi_q(lo, tmp, 0x21); + return __lasx_xvor_v(hi, lo); } }; // SIMD byte mask type (returned by things like eq and gt) template<> struct simd8<bool>: base8<bool> { - static simdjson_inline simd8<bool> splat(bool _value) { - return __lsx_vreplgr2vr_b(uint8_t(-(!!_value))); - } + static simdjson_inline simd8<bool> splat(bool _value) { return __lasx_xvreplgr2vr_b(uint8_t(-(!!_value))); } simdjson_inline simd8() : base8() {} - simdjson_inline simd8(const __m128i _value) : base8<bool>(_value) {} + simdjson_inline simd8(const __m256i _value) : base8<bool>(_value) {} // Splat constructor simdjson_inline simd8(bool _value) : base8<bool>(splat(_value)) {} - simdjson_inline int to_bitmask() const { return __lsx_vpickve2gr_w(__lsx_vmskltz_b(*this), 0); } - simdjson_inline bool any() const { return 0 == __lsx_vpickve2gr_hu(__lsx_vmsknz_b(*this), 0); } + simdjson_inline int to_bitmask() const { + __m256i mask = __lasx_xvmskltz_b(*this); + return (__lasx_xvpickve2gr_w(mask, 4) << 16) | (__lasx_xvpickve2gr_w(mask, 0)); + } + simdjson_inline bool any() const { + __m256i v = __lasx_xvmsknz_b(*this); + return (0 == __lasx_xvpickve2gr_w(v, 0)) && (0 == __lasx_xvpickve2gr_w(v, 4)); + } simdjson_inline simd8<bool> operator~() const { return *this ^ true; } }; template<typename T> struct base8_numeric: base8<T> { - static simdjson_inline simd8<T> splat(T _value) { return __lsx_vreplgr2vr_b(_value); } - static simdjson_inline simd8<T> zero() { return __lsx_vldi(0); } - static simdjson_inline simd8<T> load(const T values[16]) { - return __lsx_vld(reinterpret_cast<const __m128i *>(values), 0); + static simdjson_inline simd8<T> splat(T _value) { + return __lasx_xvreplgr2vr_b(_value); + } + static simdjson_inline simd8<T> zero() { return __lasx_xvldi(0); } + static simdjson_inline simd8<T> load(const T values[32]) { + return __lasx_xvld(reinterpret_cast<const __m256i *>(values), 0); } // Repeat 16 values as many times as necessary (usually for lookup tables) static simdjson_inline simd8<T> repeat_16( @@ -123681,22 +157157,24 @@ namespace simd { T v8, T v9, T v10, T v11, T v12, T v13, T v14, T v15 ) { return simd8<T>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,v11,v12,v13,v14,v15 ); } simdjson_inline base8_numeric() : base8<T>() {} - simdjson_inline base8_numeric(const __m128i _value) : base8<T>(_value) {} + simdjson_inline base8_numeric(const __m256i _value) : base8<T>(_value) {} // Store to array - simdjson_inline void store(T dst[16]) const { - return __lsx_vst(*this, reinterpret_cast<__m128i *>(dst), 0); + simdjson_inline void store(T dst[32]) const { + return __lasx_xvst(*this, reinterpret_cast<__m256i *>(dst), 0); } // Addition/subtraction are the same for signed and unsigned - simdjson_inline simd8<T> operator+(const simd8<T> other) const { return __lsx_vadd_b(*this, other); } - simdjson_inline simd8<T> operator-(const simd8<T> other) const { return __lsx_vsub_b(*this, other); } + simdjson_inline simd8<T> operator+(const simd8<T> other) const { return __lasx_xvadd_b(*this, other); } + simdjson_inline simd8<T> operator-(const simd8<T> other) const { return __lasx_xvsub_b(*this, other); } simdjson_inline simd8<T>& operator+=(const simd8<T> other) { *this = *this + other; return *static_cast<simd8<T>*>(this); } simdjson_inline simd8<T>& operator-=(const simd8<T> other) { *this = *this - other; return *static_cast<simd8<T>*>(this); } @@ -123706,7 +157184,7 @@ namespace simd { // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values) template<typename L> simdjson_inline simd8<L> lookup_16(simd8<L> lookup_table) const { - return __lsx_vshuf_b(lookup_table, lookup_table, *this); + return __lasx_xvshuf_b(lookup_table, lookup_table, *this); } // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted as a bitset). @@ -123714,26 +157192,38 @@ namespace simd { // Only the first 16 - count_ones(mask) bytes of the result are significant but 16 bytes // get written. template<typename L> - simdjson_inline void compress(uint16_t mask, L * output) const { + simdjson_inline void compress(uint32_t mask, L * output) const { using internal::thintable_epi8; using internal::BitsSetTable256mul2; using internal::pshufb_combine_table; // this particular implementation was inspired by haswell - // lsx do it in 2 steps, first 8 bytes and then second 8 bytes... + // lasx do it in 4 steps, first 8 bytes and then second 8 bytes... uint8_t mask1 = uint8_t(mask); // least significant 8 bits - uint8_t mask2 = uint8_t(mask >> 8); // second least significant 8 bits - // next line just loads the 64-bit values thintable_epi8[mask1] and - // thintable_epi8[mask2] into a 128-bit register. - __m128i shufmask = {int64_t(thintable_epi8[mask1]), int64_t(thintable_epi8[mask2]) + 0x0808080808080808}; + uint8_t mask2 = uint8_t(mask >> 8); // second significant 8 bits + uint8_t mask3 = uint8_t(mask >> 16); // ... + uint8_t mask4 = uint8_t(mask >> 24); // ... + // next line just loads the 64-bit values thintable_epi8[mask{1,2,3,4}] + // into a 256-bit register. + __m256i shufmask = {int64_t(thintable_epi8[mask1]), int64_t(thintable_epi8[mask2]) + 0x0808080808080808, int64_t(thintable_epi8[mask3]), int64_t(thintable_epi8[mask4]) + 0x0808080808080808}; // this is the version "nearly pruned" - __m128i pruned = __lsx_vshuf_b(*this, *this, shufmask); + __m256i pruned = __lasx_xvshuf_b(*this, *this, shufmask); // we still need to put the pieces back together. // we compute the popcount of the first words: int pop1 = BitsSetTable256mul2[mask1]; + int pop2 = BitsSetTable256mul2[mask2]; + int pop3 = BitsSetTable256mul2[mask3]; + // then load the corresponding mask - __m128i compactmask = __lsx_vldx(reinterpret_cast<void*>(reinterpret_cast<unsigned long>(pshufb_combine_table)), pop1 * 8); - __m128i answer = __lsx_vshuf_b(pruned, pruned, compactmask); - __lsx_vst(answer, reinterpret_cast<uint8_t*>(output), 0); + __m256i masklo = __lasx_xvldx(reinterpret_cast<void*>(reinterpret_cast<unsigned long>(pshufb_combine_table)), pop1 * 8); + __m256i maskhi = __lasx_xvldx(reinterpret_cast<void*>(reinterpret_cast<unsigned long>(pshufb_combine_table)), pop3 * 8); + __m256i compactmask = __lasx_xvpermi_q(maskhi, masklo, 0x20); + __m256i answer = __lasx_xvshuf_b(pruned, pruned, compactmask); + __lasx_xvst(answer, reinterpret_cast<uint8_t*>(output), 0); + uint64_t value3 = __lasx_xvpickve2gr_du(answer, 2); + uint64_t value4 = __lasx_xvpickve2gr_du(answer, 3); + uint64_t *pos = reinterpret_cast<uint64_t*>(reinterpret_cast<uint8_t*>(output) + 16 - (pop1 + pop2) / 2); + pos[0] = value3; + pos[1] = value4; } template<typename L> @@ -123755,18 +157245,22 @@ namespace simd { template<> struct simd8<int8_t> : base8_numeric<int8_t> { simdjson_inline simd8() : base8_numeric<int8_t>() {} - simdjson_inline simd8(const __m128i _value) : base8_numeric<int8_t>(_value) {} + simdjson_inline simd8(const __m256i _value) : base8_numeric<int8_t>(_value) {} // Splat constructor simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {} // Array constructor - simdjson_inline simd8(const int8_t values[16]) : simd8(load(values)) {} + simdjson_inline simd8(const int8_t values[32]) : simd8(load(values)) {} // Member-by-member initialization simdjson_inline simd8( int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, - int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 + int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15, + int8_t v16, int8_t v17, int8_t v18, int8_t v19, int8_t v20, int8_t v21, int8_t v22, int8_t v23, + int8_t v24, int8_t v25, int8_t v26, int8_t v27, int8_t v28, int8_t v29, int8_t v30, int8_t v31 ) : simd8({ v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15 + v8, v9, v10,v11,v12,v13,v14,v15, + v16,v17,v18,v19,v20,v21,v22,v23, + v24,v25,v26,v27,v28,v29,v30,v31 }) {} // Repeat 16 values as many times as necessary (usually for lookup tables) simdjson_inline static simd8<int8_t> repeat_16( @@ -123774,34 +157268,40 @@ namespace simd { int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 ) { return simd8<int8_t>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,v11,v12,v13,v14,v15 ); } // Order-sensitive comparisons - simdjson_inline simd8<int8_t> max_val(const simd8<int8_t> other) const { return __lsx_vmax_b(*this, other); } - simdjson_inline simd8<int8_t> min_val(const simd8<int8_t> other) const { return __lsx_vmin_b(*this, other); } - simdjson_inline simd8<bool> operator>(const simd8<int8_t> other) const { return __lsx_vslt_b(other, *this); } - simdjson_inline simd8<bool> operator<(const simd8<int8_t> other) const { return __lsx_vslt_b(*this, other); } + simdjson_inline simd8<int8_t> max_val(const simd8<int8_t> other) const { return __lasx_xvmax_b(*this, other); } + simdjson_inline simd8<int8_t> min_val(const simd8<int8_t> other) const { return __lasx_xvmin_b(*this, other); } + simdjson_inline simd8<bool> operator>(const simd8<int8_t> other) const { return __lasx_xvslt_b(other, *this); } + simdjson_inline simd8<bool> operator<(const simd8<int8_t> other) const { return __lasx_xvslt_b(*this, other); } }; // Unsigned bytes template<> struct simd8<uint8_t>: base8_numeric<uint8_t> { simdjson_inline simd8() : base8_numeric<uint8_t>() {} - simdjson_inline simd8(const __m128i _value) : base8_numeric<uint8_t>(_value) {} + simdjson_inline simd8(const __m256i _value) : base8_numeric<uint8_t>(_value) {} // Splat constructor simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {} // Array constructor - simdjson_inline simd8(const uint8_t values[16]) : simd8(load(values)) {} + simdjson_inline simd8(const uint8_t values[32]) : simd8(load(values)) {} // Member-by-member initialization simdjson_inline simd8( uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, - uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 - ) : simd8(__m128i(v16u8{ + uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15, + uint8_t v16, uint8_t v17, uint8_t v18, uint8_t v19, uint8_t v20, uint8_t v21, uint8_t v22, uint8_t v23, + uint8_t v24, uint8_t v25, uint8_t v26, uint8_t v27, uint8_t v28, uint8_t v29, uint8_t v30, uint8_t v31 + ) : simd8(__m256i(v32u8{ v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15 + v8, v9, v10,v11,v12,v13,v14,v15, + v16,v17,v18,v19,v20,v21,v22,v23, + v24,v25,v26,v27,v28,v29,v30,v31 })) {} // Repeat 16 values as many times as necessary (usually for lookup tables) simdjson_inline static simd8<uint8_t> repeat_16( @@ -123809,18 +157309,20 @@ namespace simd { uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 ) { return simd8<uint8_t>( + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,v11,v12,v13,v14,v15 ); } // Saturated math - simdjson_inline simd8<uint8_t> saturating_add(const simd8<uint8_t> other) const { return __lsx_vsadd_bu(*this, other); } - simdjson_inline simd8<uint8_t> saturating_sub(const simd8<uint8_t> other) const { return __lsx_vssub_bu(*this, other); } + simdjson_inline simd8<uint8_t> saturating_add(const simd8<uint8_t> other) const { return __lasx_xvsadd_bu(*this, other); } + simdjson_inline simd8<uint8_t> saturating_sub(const simd8<uint8_t> other) const { return __lasx_xvssub_bu(*this, other); } // Order-specific operations - simdjson_inline simd8<uint8_t> max_val(const simd8<uint8_t> other) const { return __lsx_vmax_bu(*this, other); } - simdjson_inline simd8<uint8_t> min_val(const simd8<uint8_t> other) const { return __lsx_vmin_bu(other, *this); } + simdjson_inline simd8<uint8_t> max_val(const simd8<uint8_t> other) const { return __lasx_xvmax_bu(*this, other); } + simdjson_inline simd8<uint8_t> min_val(const simd8<uint8_t> other) const { return __lasx_xvmin_bu(other, *this); } // Same as >, but only guarantees true is nonzero (< guarantees true = -1) simdjson_inline simd8<uint8_t> gt_bits(const simd8<uint8_t> other) const { return this->saturating_sub(other); } // Same as <, but only guarantees true is nonzero (< guarantees true = -1) @@ -123835,96 +157337,85 @@ namespace simd { simdjson_inline simd8<bool> bits_not_set(simd8<uint8_t> bits) const { return (*this & bits).bits_not_set(); } simdjson_inline simd8<bool> any_bits_set() const { return ~this->bits_not_set(); } simdjson_inline simd8<bool> any_bits_set(simd8<uint8_t> bits) const { return ~this->bits_not_set(bits); } - simdjson_inline bool is_ascii() const { return 0 == __lsx_vpickve2gr_w(__lsx_vmskltz_b(*this), 0); } - simdjson_inline bool bits_not_set_anywhere() const { return 0 == __lsx_vpickve2gr_hu(__lsx_vmsknz_b(*this), 0); } + simdjson_inline bool is_ascii() const { + __m256i mask = __lasx_xvmskltz_b(*this); + return (0 == __lasx_xvpickve2gr_w(mask, 0)) && (0 == __lasx_xvpickve2gr_w(mask, 4)); + } + simdjson_inline bool bits_not_set_anywhere() const { + __m256i v = __lasx_xvmsknz_b(*this); + return (0 == __lasx_xvpickve2gr_w(v, 0)) && (0 == __lasx_xvpickve2gr_w(v, 4)); + } simdjson_inline bool any_bits_set_anywhere() const { return !bits_not_set_anywhere(); } simdjson_inline bool bits_not_set_anywhere(simd8<uint8_t> bits) const { - return 0 == __lsx_vpickve2gr_hu(__lsx_vmsknz_b(__lsx_vand_v(*this, bits)), 0); + __m256i v = __lasx_xvmsknz_b(__lasx_xvand_v(*this, bits)); + return (0 == __lasx_xvpickve2gr_w(v, 0)) && (0 == __lasx_xvpickve2gr_w(v, 4)); } simdjson_inline bool any_bits_set_anywhere(simd8<uint8_t> bits) const { return !bits_not_set_anywhere(bits); } template<int N> - simdjson_inline simd8<uint8_t> shr() const { return simd8<uint8_t>(__lsx_vsrli_b(*this, N)); } + simdjson_inline simd8<uint8_t> shr() const { return simd8<uint8_t>(__lasx_xvsrli_b(*this, N)); } template<int N> - simdjson_inline simd8<uint8_t> shl() const { return simd8<uint8_t>(__lsx_vslli_b(*this, N)); } + simdjson_inline simd8<uint8_t> shl() const { return simd8<uint8_t>(__lasx_xvslli_b(*this, N)); } }; template<typename T> struct simd8x64 { static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<T>); - static_assert(NUM_CHUNKS == 4, "LSX kernel should use four registers per 64-byte block."); + static_assert(NUM_CHUNKS == 2, "LASX kernel should use two registers per 64-byte block."); const simd8<T> chunks[NUM_CHUNKS]; + template<int idx> simd8<uint8_t> get() const { return idx < NUM_CHUNKS ? chunks[idx] : simd8<T>(); } simd8x64(const simd8x64<T>& o) = delete; // no copy allowed simd8x64<T>& operator=(const simd8<T>& other) = delete; // no assignment allowed simd8x64() = delete; // no default constructor allowed - simdjson_inline simd8x64(const simd8<T> chunk0, const simd8<T> chunk1, const simd8<T> chunk2, const simd8<T> chunk3) : chunks{chunk0, chunk1, chunk2, chunk3} {} - simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8<T>::load(ptr), simd8<T>::load(ptr+16), simd8<T>::load(ptr+32), simd8<T>::load(ptr+48)} {} + simdjson_inline simd8x64(const simd8<T> chunk0, const simd8<T> chunk1) : chunks{chunk0, chunk1} {} + simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8<T>::load(ptr), simd8<T>::load(ptr+32)} {} simdjson_inline uint64_t compress(uint64_t mask, T * output) const { - uint16_t mask1 = uint16_t(mask); - uint16_t mask2 = uint16_t(mask >> 16); - uint16_t mask3 = uint16_t(mask >> 32); - uint16_t mask4 = uint16_t(mask >> 48); - __m128i zcnt = __lsx_vpcnt_h(__m128i(v2u64{~mask, 0})); - uint64_t zcnt1 = __lsx_vpickve2gr_hu(zcnt, 0); - uint64_t zcnt2 = __lsx_vpickve2gr_hu(zcnt, 1); - uint64_t zcnt3 = __lsx_vpickve2gr_hu(zcnt, 2); - uint64_t zcnt4 = __lsx_vpickve2gr_hu(zcnt, 3); - uint8_t *voutput = reinterpret_cast<uint8_t*>(output); + uint32_t mask1 = uint32_t(mask); + uint32_t mask2 = uint32_t(mask >> 32); + __m256i zcnt = __lasx_xvpcnt_w(__m256i(v4u64{~mask, 0, 0, 0})); + uint64_t zcnt1 = __lasx_xvpickve2gr_wu(zcnt, 0); + uint64_t zcnt2 = __lasx_xvpickve2gr_wu(zcnt, 1); // There should be a critical value which processes in scaler is faster. if (zcnt1) - this->chunks[0].compress(mask1, reinterpret_cast<T*>(voutput)); - voutput += zcnt1; + this->chunks[0].compress(mask1, output); if (zcnt2) - this->chunks[1].compress(mask2, reinterpret_cast<T*>(voutput)); - voutput += zcnt2; - if (zcnt3) - this->chunks[2].compress(mask3, reinterpret_cast<T*>(voutput)); - voutput += zcnt3; - if (zcnt4) - this->chunks[3].compress(mask4, reinterpret_cast<T*>(voutput)); - voutput += zcnt4; - return reinterpret_cast<uint64_t>(voutput) - reinterpret_cast<uint64_t>(output); + this->chunks[1].compress(mask2, output + zcnt1); + return zcnt1 + zcnt2; } simdjson_inline void store(T ptr[64]) const { this->chunks[0].store(ptr+sizeof(simd8<T>)*0); this->chunks[1].store(ptr+sizeof(simd8<T>)*1); - this->chunks[2].store(ptr+sizeof(simd8<T>)*2); - this->chunks[3].store(ptr+sizeof(simd8<T>)*3); } simdjson_inline uint64_t to_bitmask() const { - __m128i mask1 = __lsx_vmskltz_b(this->chunks[0]); - __m128i mask2 = __lsx_vmskltz_b(this->chunks[1]); - __m128i mask3 = __lsx_vmskltz_b(this->chunks[2]); - __m128i mask4 = __lsx_vmskltz_b(this->chunks[3]); - mask1 = __lsx_vilvl_h(mask2, mask1); - mask2 = __lsx_vilvl_h(mask4, mask3); - return __lsx_vpickve2gr_du(__lsx_vilvl_w(mask2, mask1), 0); + __m256i mask0 = __lasx_xvmskltz_b(this->chunks[0]); + __m256i mask1 = __lasx_xvmskltz_b(this->chunks[1]); + __m256i mask_tmp = __lasx_xvpickve_w(mask0, 4); + __m256i tmp = __lasx_xvpickve_w(mask1, 4); + mask0 = __lasx_xvinsve0_w(mask0, mask1, 1); + mask_tmp = __lasx_xvinsve0_w(mask_tmp, tmp, 1); + return __lasx_xvpickve2gr_du(__lasx_xvpackev_h(mask_tmp, mask0), 0); } simdjson_inline simd8<T> reduce_or() const { - return (this->chunks[0] | this->chunks[1]) | (this->chunks[2] | this->chunks[3]); + return this->chunks[0] | this->chunks[1]; } simdjson_inline uint64_t eq(const T m) const { const simd8<T> mask = simd8<T>::splat(m); return simd8x64<bool>( this->chunks[0] == mask, - this->chunks[1] == mask, - this->chunks[2] == mask, - this->chunks[3] == mask + this->chunks[1] == mask ).to_bitmask(); } simdjson_inline uint64_t eq(const simd8x64<uint8_t> &other) const { return simd8x64<bool>( this->chunks[0] == other.chunks[0], - this->chunks[1] == other.chunks[1], - this->chunks[2] == other.chunks[2], - this->chunks[3] == other.chunks[3] + this->chunks[1] == other.chunks[1] ).to_bitmask(); } @@ -123932,33 +157423,31 @@ namespace simd { const simd8<T> mask = simd8<T>::splat(m); return simd8x64<bool>( this->chunks[0] <= mask, - this->chunks[1] <= mask, - this->chunks[2] <= mask, - this->chunks[3] <= mask + this->chunks[1] <= mask ).to_bitmask(); } }; // struct simd8x64<T> } // namespace simd } // unnamed namespace -} // namespace lsx +} // namespace lasx } // namespace simdjson -#endif // SIMDJSON_LSX_SIMD_H -/* end file simdjson/lsx/simd.h */ -/* including simdjson/lsx/stringparsing_defs.h: #include "simdjson/lsx/stringparsing_defs.h" */ -/* begin file simdjson/lsx/stringparsing_defs.h */ -#ifndef SIMDJSON_LSX_STRINGPARSING_DEFS_H -#define SIMDJSON_LSX_STRINGPARSING_DEFS_H +#endif // SIMDJSON_LASX_SIMD_H +/* end file simdjson/lasx/simd.h */ +/* including simdjson/lasx/stringparsing_defs.h: #include "simdjson/lasx/stringparsing_defs.h" */ +/* begin file simdjson/lasx/stringparsing_defs.h */ +#ifndef SIMDJSON_LASX_STRINGPARSING_DEFS_H +#define SIMDJSON_LASX_STRINGPARSING_DEFS_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/simd.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/simd.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/bitmanipulation.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace { using namespace simd; @@ -123982,17 +157471,11 @@ simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uin // this can read up to 31 bytes beyond the buffer size, but we require // SIMDJSON_PADDING of padding static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "backslash and quote finder must process fewer than SIMDJSON_PADDING bytes"); - simd8<uint8_t> v0(src); - simd8<uint8_t> v1(src + sizeof(v0)); - v0.store(dst); - v1.store(dst + sizeof(v0)); - - // Getting a 64-bit bitmask is much cheaper than multiple 16-bit bitmasks on LSX; therefore, we - // smash them together into a 64-byte mask and get the bitmask from there. - uint64_t bs_and_quote = simd8x64<bool>(v0 == '\\', v1 == '\\', v0 == '"', v1 == '"').to_bitmask(); + simd8<uint8_t> v(src); + v.store(dst); return { - uint32_t(bs_and_quote), // bs_bits - uint32_t(bs_and_quote >> 32) // quote_bits + static_cast<uint32_t>((v == '\\').to_bitmask()), // bs_bits + static_cast<uint32_t>((v == '"').to_bitmask()), // quote_bits }; } @@ -124022,23 +157505,25 @@ simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *ds } } // unnamed namespace -} // namespace lsx +} // namespace lasx } // namespace simdjson -#endif // SIMDJSON_LSX_STRINGPARSING_DEFS_H -/* end file simdjson/lsx/stringparsing_defs.h */ +#endif // SIMDJSON_LASX_STRINGPARSING_DEFS_H +/* end file simdjson/lasx/stringparsing_defs.h */ #define SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT 1 -/* end file simdjson/lsx/begin.h */ -/* including simdjson/generic/ondemand/amalgamated.h for lsx: #include "simdjson/generic/ondemand/amalgamated.h" */ -/* begin file simdjson/generic/ondemand/amalgamated.h for lsx */ -#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_ONDEMAND_DEPENDENCIES_H) + + +/* end file simdjson/lasx/begin.h */ +/* including simdjson/generic/ondemand/amalgamated.h for lasx: #include "simdjson/generic/ondemand/amalgamated.h" */ +/* begin file simdjson/generic/ondemand/amalgamated.h for lasx */ +#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_BUILDER_DEPENDENCIES_H) #error simdjson/generic/ondemand/dependencies.h must be included before simdjson/generic/ondemand/amalgamated.h! #endif // Stuff other things depend on -/* including simdjson/generic/ondemand/base.h for lsx: #include "simdjson/generic/ondemand/base.h" */ -/* begin file simdjson/generic/ondemand/base.h for lsx */ +/* including simdjson/generic/ondemand/base.h for lasx: #include "simdjson/generic/ondemand/base.h" */ +/* begin file simdjson/generic/ondemand/base.h for lasx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_BASE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -124047,7 +157532,7 @@ simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *ds /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { /** * A fast, simple, DOM-like interface that parses JSON as you use it. * @@ -124058,8 +157543,8 @@ namespace ondemand { /** Represents the depth of a JSON value (number of nested arrays/objects). */ using depth_t = int32_t; -/** @copydoc simdjson::lsx::number_type */ -using number_type = simdjson::lsx::number_type; +/** @copydoc simdjson::lasx::number_type */ +using number_type = simdjson::lasx::number_type; /** @private Position in the JSON buffer indexes */ using token_position = const uint32_t *; @@ -124082,13 +157567,13 @@ class value; class value_iterator; } // namespace ondemand -} // namespace lsx +} // namespace lasx } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_BASE_H -/* end file simdjson/generic/ondemand/base.h for lsx */ -/* including simdjson/generic/ondemand/deserialize.h for lsx: #include "simdjson/generic/ondemand/deserialize.h" */ -/* begin file simdjson/generic/ondemand/deserialize.h for lsx */ +/* end file simdjson/generic/ondemand/base.h for lasx */ +/* including simdjson/generic/ondemand/deserialize.h for lasx: #include "simdjson/generic/ondemand/deserialize.h" */ +/* begin file simdjson/generic/ondemand/deserialize.h for lasx */ #if SIMDJSON_SUPPORTS_CONCEPTS #ifndef SIMDJSON_ONDEMAND_DESERIALIZE_H @@ -124108,35 +157593,35 @@ template <> struct is_builtin_deserializable<int64_t> : std::true_type {}; template <> struct is_builtin_deserializable<uint64_t> : std::true_type {}; template <> struct is_builtin_deserializable<double> : std::true_type {}; template <> struct is_builtin_deserializable<bool> : std::true_type {}; -template <> struct is_builtin_deserializable<lsx::ondemand::array> : std::true_type {}; -template <> struct is_builtin_deserializable<lsx::ondemand::object> : std::true_type {}; -template <> struct is_builtin_deserializable<lsx::ondemand::value> : std::true_type {}; -template <> struct is_builtin_deserializable<lsx::ondemand::raw_json_string> : std::true_type {}; +template <> struct is_builtin_deserializable<lasx::ondemand::array> : std::true_type {}; +template <> struct is_builtin_deserializable<lasx::ondemand::object> : std::true_type {}; +template <> struct is_builtin_deserializable<lasx::ondemand::value> : std::true_type {}; +template <> struct is_builtin_deserializable<lasx::ondemand::raw_json_string> : std::true_type {}; template <> struct is_builtin_deserializable<std::string_view> : std::true_type {}; template <typename T> concept is_builtin_deserializable_v = is_builtin_deserializable<T>::value; -template <typename T, typename ValT = lsx::ondemand::value> +template <typename T, typename ValT = lasx::ondemand::value> concept custom_deserializable = tag_invocable<deserialize_tag, ValT&, T&>; -template <typename T, typename ValT = lsx::ondemand::value> +template <typename T, typename ValT = lasx::ondemand::value> concept deserializable = custom_deserializable<T, ValT> || is_builtin_deserializable_v<T> || concepts::optional_type<T>; -template <typename T, typename ValT = lsx::ondemand::value> +template <typename T, typename ValT = lasx::ondemand::value> concept nothrow_custom_deserializable = nothrow_tag_invocable<deserialize_tag, ValT&, T&>; // built-in types are noexcept and if an error happens, the value simply gets ignored and the error is returned. -template <typename T, typename ValT = lsx::ondemand::value> +template <typename T, typename ValT = lasx::ondemand::value> concept nothrow_deserializable = nothrow_custom_deserializable<T, ValT> || is_builtin_deserializable_v<T>; /// Deserialize Tag inline constexpr struct deserialize_tag { - using array_type = lsx::ondemand::array; - using object_type = lsx::ondemand::object; - using value_type = lsx::ondemand::value; - using document_type = lsx::ondemand::document; - using document_reference_type = lsx::ondemand::document_reference; + using array_type = lasx::ondemand::array; + using object_type = lasx::ondemand::object; + using value_type = lasx::ondemand::value; + using document_type = lasx::ondemand::document; + using document_reference_type = lasx::ondemand::document_reference; // Customization Point for array template <typename T> @@ -124181,9 +157666,9 @@ inline constexpr struct deserialize_tag { #endif // SIMDJSON_ONDEMAND_DESERIALIZE_H #endif // SIMDJSON_SUPPORTS_CONCEPTS -/* end file simdjson/generic/ondemand/deserialize.h for lsx */ -/* including simdjson/generic/ondemand/value_iterator.h for lsx: #include "simdjson/generic/ondemand/value_iterator.h" */ -/* begin file simdjson/generic/ondemand/value_iterator.h for lsx */ +/* end file simdjson/generic/ondemand/deserialize.h for lasx */ +/* including simdjson/generic/ondemand/value_iterator.h for lasx: #include "simdjson/generic/ondemand/value_iterator.h" */ +/* begin file simdjson/generic/ondemand/value_iterator.h for lasx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -124193,7 +157678,7 @@ inline constexpr struct deserialize_tag { /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace ondemand { /** @@ -124658,21 +158143,22 @@ class value_iterator { friend class document; friend class object; + friend class object_iterator; friend class array; friend class value; friend class field; }; // value_iterator } // namespace ondemand -} // namespace lsx +} // namespace lasx } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<lsx::ondemand::value_iterator> : public lsx::implementation_simdjson_result_base<lsx::ondemand::value_iterator> { +struct simdjson_result<lasx::ondemand::value_iterator> : public lasx::implementation_simdjson_result_base<lasx::ondemand::value_iterator> { public: - simdjson_inline simdjson_result(lsx::ondemand::value_iterator &&value) noexcept; ///< @private + simdjson_inline simdjson_result(lasx::ondemand::value_iterator &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; }; @@ -124680,9 +158166,9 @@ struct simdjson_result<lsx::ondemand::value_iterator> : public lsx::implementati } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_H -/* end file simdjson/generic/ondemand/value_iterator.h for lsx */ -/* including simdjson/generic/ondemand/value.h for lsx: #include "simdjson/generic/ondemand/value.h" */ -/* begin file simdjson/generic/ondemand/value.h for lsx */ +/* end file simdjson/generic/ondemand/value_iterator.h for lasx */ +/* including simdjson/generic/ondemand/value.h for lasx: #include "simdjson/generic/ondemand/value.h" */ +/* begin file simdjson/generic/ondemand/value.h for lasx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -124698,7 +158184,7 @@ struct simdjson_result<lsx::ondemand::value_iterator> : public lsx::implementati namespace simdjson { -namespace lsx { +namespace lasx { namespace ondemand { /** * An ephemeral JSON value returned during iteration. It is only valid for as long as you do @@ -125412,20 +158898,20 @@ class value { }; } // namespace ondemand -} // namespace lsx +} // namespace lasx } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<lsx::ondemand::value> : public lsx::implementation_simdjson_result_base<lsx::ondemand::value> { +struct simdjson_result<lasx::ondemand::value> : public lasx::implementation_simdjson_result_base<lasx::ondemand::value> { public: - simdjson_inline simdjson_result(lsx::ondemand::value &&value) noexcept; ///< @private + simdjson_inline simdjson_result(lasx::ondemand::value &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; - simdjson_inline simdjson_result<lsx::ondemand::array> get_array() noexcept; - simdjson_inline simdjson_result<lsx::ondemand::object> get_object() noexcept; + simdjson_inline simdjson_result<lasx::ondemand::array> get_array() noexcept; + simdjson_inline simdjson_result<lasx::ondemand::object> get_object() noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64() noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64_in_string() noexcept; @@ -125437,7 +158923,7 @@ struct simdjson_result<lsx::ondemand::value> : public lsx::implementation_simdjs template <typename string_type> simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result<std::string_view> get_wobbly_string() noexcept; - simdjson_inline simdjson_result<lsx::ondemand::raw_json_string> get_raw_json_string() noexcept; + simdjson_inline simdjson_result<lasx::ondemand::raw_json_string> get_raw_json_string() noexcept; simdjson_inline simdjson_result<bool> get_bool() noexcept; simdjson_inline simdjson_result<bool> is_null() noexcept; @@ -125448,20 +158934,20 @@ struct simdjson_result<lsx::ondemand::value> : public lsx::implementation_simdjs #if SIMDJSON_EXCEPTIONS template <class T> explicit simdjson_inline operator T() noexcept(false); - simdjson_inline operator lsx::ondemand::array() noexcept(false); - simdjson_inline operator lsx::ondemand::object() noexcept(false); + simdjson_inline operator lasx::ondemand::array() noexcept(false); + simdjson_inline operator lasx::ondemand::object() noexcept(false); simdjson_inline operator uint64_t() noexcept(false); simdjson_inline operator int64_t() noexcept(false); simdjson_inline operator double() noexcept(false); simdjson_inline operator std::string_view() noexcept(false); - simdjson_inline operator lsx::ondemand::raw_json_string() noexcept(false); + simdjson_inline operator lasx::ondemand::raw_json_string() noexcept(false); simdjson_inline operator bool() noexcept(false); #endif simdjson_inline simdjson_result<size_t> count_elements() & noexcept; simdjson_inline simdjson_result<size_t> count_fields() & noexcept; - simdjson_inline simdjson_result<lsx::ondemand::value> at(size_t index) noexcept; - simdjson_inline simdjson_result<lsx::ondemand::array_iterator> begin() & noexcept; - simdjson_inline simdjson_result<lsx::ondemand::array_iterator> end() & noexcept; + simdjson_inline simdjson_result<lasx::ondemand::value> at(size_t index) noexcept; + simdjson_inline simdjson_result<lasx::ondemand::array_iterator> begin() & noexcept; + simdjson_inline simdjson_result<lasx::ondemand::array_iterator> end() & noexcept; /** * Look up a field by name on an object (order-sensitive). By order-sensitive, we mean that @@ -125485,9 +158971,9 @@ struct simdjson_result<lsx::ondemand::value> : public lsx::implementation_simdjs * @param key The key to look up. * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object. */ - simdjson_inline simdjson_result<lsx::ondemand::value> find_field(std::string_view key) noexcept; - /** @overload simdjson_inline simdjson_result<lsx::ondemand::value> find_field(std::string_view key) noexcept; */ - simdjson_inline simdjson_result<lsx::ondemand::value> find_field(const char *key) noexcept; + simdjson_inline simdjson_result<lasx::ondemand::value> find_field(std::string_view key) noexcept; + /** @overload simdjson_inline simdjson_result<lasx::ondemand::value> find_field(std::string_view key) noexcept; */ + simdjson_inline simdjson_result<lasx::ondemand::value> find_field(const char *key) noexcept; /** * Look up a field by name on an object, without regard to key order. @@ -125499,7 +158985,7 @@ struct simdjson_result<lsx::ondemand::value> : public lsx::implementation_simdjs * in question is large. The fact that the extra code is there also bumps the executable size. * * We default operator[] on find_field_unordered() for convenience. - * It is the defaul because it would be highly surprising (and hard to debug) if the + * It is the default because it would be highly surprising (and hard to debug) if the * default behavior failed to look up a field just because it was in the wrong order--and many * APIs assume this. Therefore, you must be explicit if you want to treat objects as out of order. * @@ -125509,14 +158995,14 @@ struct simdjson_result<lsx::ondemand::value> : public lsx::implementation_simdjs * @param key The key to look up. * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object. */ - simdjson_inline simdjson_result<lsx::ondemand::value> find_field_unordered(std::string_view key) noexcept; - /** @overload simdjson_inline simdjson_result<lsx::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ - simdjson_inline simdjson_result<lsx::ondemand::value> find_field_unordered(const char *key) noexcept; - /** @overload simdjson_inline simdjson_result<lsx::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ - simdjson_inline simdjson_result<lsx::ondemand::value> operator[](std::string_view key) noexcept; - /** @overload simdjson_inline simdjson_result<lsx::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ - simdjson_inline simdjson_result<lsx::ondemand::value> operator[](const char *key) noexcept; - simdjson_result<lsx::ondemand::value> operator[](int) noexcept = delete; + simdjson_inline simdjson_result<lasx::ondemand::value> find_field_unordered(std::string_view key) noexcept; + /** @overload simdjson_inline simdjson_result<lasx::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ + simdjson_inline simdjson_result<lasx::ondemand::value> find_field_unordered(const char *key) noexcept; + /** @overload simdjson_inline simdjson_result<lasx::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ + simdjson_inline simdjson_result<lasx::ondemand::value> operator[](std::string_view key) noexcept; + /** @overload simdjson_inline simdjson_result<lasx::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ + simdjson_inline simdjson_result<lasx::ondemand::value> operator[](const char *key) noexcept; + simdjson_result<lasx::ondemand::value> operator[](int) noexcept = delete; /** * Get the type of this JSON value. It does not validate or consume the value. @@ -125540,13 +159026,13 @@ struct simdjson_result<lsx::ondemand::value> : public lsx::implementation_simdjs * better to just call .get_double, .get_string, etc. and check for INCORRECT_TYPE (or just * let it throw an exception). */ - simdjson_inline simdjson_result<lsx::ondemand::json_type> type() noexcept; + simdjson_inline simdjson_result<lasx::ondemand::json_type> type() noexcept; simdjson_inline simdjson_result<bool> is_scalar() noexcept; simdjson_inline simdjson_result<bool> is_string() noexcept; simdjson_inline simdjson_result<bool> is_negative() noexcept; simdjson_inline simdjson_result<bool> is_integer() noexcept; - simdjson_inline simdjson_result<lsx::number_type> get_number_type() noexcept; - simdjson_inline simdjson_result<lsx::ondemand::number> get_number() noexcept; + simdjson_inline simdjson_result<lasx::number_type> get_number_type() noexcept; + simdjson_inline simdjson_result<lasx::ondemand::number> get_number() noexcept; /** @copydoc simdjson_inline std::string_view value::raw_json_token() const noexcept */ simdjson_inline simdjson_result<std::string_view> raw_json_token() noexcept; @@ -125556,17 +159042,17 @@ struct simdjson_result<lsx::ondemand::value> : public lsx::implementation_simdjs simdjson_inline simdjson_result<const char *> current_location() noexcept; /** @copydoc simdjson_inline int32_t current_depth() const noexcept */ simdjson_inline simdjson_result<int32_t> current_depth() const noexcept; - simdjson_inline simdjson_result<lsx::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result<lsx::ondemand::value> at_path(std::string_view json_path) noexcept; - simdjson_inline simdjson_result<std::vector<lsx::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<lasx::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result<lasx::ondemand::value> at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<std::vector<lasx::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; }; } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_H -/* end file simdjson/generic/ondemand/value.h for lsx */ -/* including simdjson/generic/ondemand/logger.h for lsx: #include "simdjson/generic/ondemand/logger.h" */ -/* begin file simdjson/generic/ondemand/logger.h for lsx */ +/* end file simdjson/generic/ondemand/value.h for lasx */ +/* including simdjson/generic/ondemand/logger.h for lasx: #include "simdjson/generic/ondemand/logger.h" */ +/* begin file simdjson/generic/ondemand/logger.h for lasx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_LOGGER_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -125575,7 +159061,7 @@ struct simdjson_result<lsx::ondemand::value> : public lsx::implementation_simdjs /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace ondemand { // Logging should be free unless SIMDJSON_VERBOSE_LOGGING is set. Importantly, it is critical @@ -125621,13 +159107,13 @@ static inline void log_error(const value_iterator &iter, const char *error, cons } // namespace logger } // namespace ondemand -} // namespace lsx +} // namespace lasx } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_LOGGER_H -/* end file simdjson/generic/ondemand/logger.h for lsx */ -/* including simdjson/generic/ondemand/token_iterator.h for lsx: #include "simdjson/generic/ondemand/token_iterator.h" */ -/* begin file simdjson/generic/ondemand/token_iterator.h for lsx */ +/* end file simdjson/generic/ondemand/logger.h for lasx */ +/* including simdjson/generic/ondemand/token_iterator.h for lasx: #include "simdjson/generic/ondemand/token_iterator.h" */ +/* begin file simdjson/generic/ondemand/token_iterator.h for lasx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -125638,7 +159124,7 @@ static inline void log_error(const value_iterator &iter, const char *error, cons /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace ondemand { /** @@ -125769,15 +159255,15 @@ class token_iterator { }; } // namespace ondemand -} // namespace lsx +} // namespace lasx } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<lsx::ondemand::token_iterator> : public lsx::implementation_simdjson_result_base<lsx::ondemand::token_iterator> { +struct simdjson_result<lasx::ondemand::token_iterator> : public lasx::implementation_simdjson_result_base<lasx::ondemand::token_iterator> { public: - simdjson_inline simdjson_result(lsx::ondemand::token_iterator &&value) noexcept; ///< @private + simdjson_inline simdjson_result(lasx::ondemand::token_iterator &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; simdjson_inline ~simdjson_result() noexcept = default; ///< @private @@ -125786,9 +159272,9 @@ struct simdjson_result<lsx::ondemand::token_iterator> : public lsx::implementati } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_H -/* end file simdjson/generic/ondemand/token_iterator.h for lsx */ -/* including simdjson/generic/ondemand/json_iterator.h for lsx: #include "simdjson/generic/ondemand/json_iterator.h" */ -/* begin file simdjson/generic/ondemand/json_iterator.h for lsx */ +/* end file simdjson/generic/ondemand/token_iterator.h for lasx */ +/* including simdjson/generic/ondemand/json_iterator.h for lasx: #include "simdjson/generic/ondemand/json_iterator.h" */ +/* begin file simdjson/generic/ondemand/json_iterator.h for lasx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -125799,7 +159285,7 @@ struct simdjson_result<lsx::ondemand::token_iterator> : public lsx::implementati /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace ondemand { /** @@ -126110,15 +159596,15 @@ class json_iterator { }; // json_iterator } // namespace ondemand -} // namespace lsx +} // namespace lasx } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<lsx::ondemand::json_iterator> : public lsx::implementation_simdjson_result_base<lsx::ondemand::json_iterator> { +struct simdjson_result<lasx::ondemand::json_iterator> : public lasx::implementation_simdjson_result_base<lasx::ondemand::json_iterator> { public: - simdjson_inline simdjson_result(lsx::ondemand::json_iterator &&value) noexcept; ///< @private + simdjson_inline simdjson_result(lasx::ondemand::json_iterator &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; @@ -126127,9 +159613,9 @@ struct simdjson_result<lsx::ondemand::json_iterator> : public lsx::implementatio } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_H -/* end file simdjson/generic/ondemand/json_iterator.h for lsx */ -/* including simdjson/generic/ondemand/json_type.h for lsx: #include "simdjson/generic/ondemand/json_type.h" */ -/* begin file simdjson/generic/ondemand/json_type.h for lsx */ +/* end file simdjson/generic/ondemand/json_iterator.h for lasx */ +/* including simdjson/generic/ondemand/json_type.h for lasx: #include "simdjson/generic/ondemand/json_type.h" */ +/* begin file simdjson/generic/ondemand/json_type.h for lasx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -126140,7 +159626,7 @@ struct simdjson_result<lsx::ondemand::json_iterator> : public lsx::implementatio /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace ondemand { /** @@ -126274,15 +159760,15 @@ inline std::ostream& operator<<(std::ostream& out, simdjson_result<json_type> &t #endif } // namespace ondemand -} // namespace lsx +} // namespace lasx } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<lsx::ondemand::json_type> : public lsx::implementation_simdjson_result_base<lsx::ondemand::json_type> { +struct simdjson_result<lasx::ondemand::json_type> : public lasx::implementation_simdjson_result_base<lasx::ondemand::json_type> { public: - simdjson_inline simdjson_result(lsx::ondemand::json_type &&value) noexcept; ///< @private + simdjson_inline simdjson_result(lasx::ondemand::json_type &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; simdjson_inline ~simdjson_result() noexcept = default; ///< @private @@ -126291,9 +159777,9 @@ struct simdjson_result<lsx::ondemand::json_type> : public lsx::implementation_si } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_H -/* end file simdjson/generic/ondemand/json_type.h for lsx */ -/* including simdjson/generic/ondemand/raw_json_string.h for lsx: #include "simdjson/generic/ondemand/raw_json_string.h" */ -/* begin file simdjson/generic/ondemand/raw_json_string.h for lsx */ +/* end file simdjson/generic/ondemand/json_type.h for lasx */ +/* including simdjson/generic/ondemand/raw_json_string.h for lasx: #include "simdjson/generic/ondemand/raw_json_string.h" */ +/* begin file simdjson/generic/ondemand/raw_json_string.h for lasx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -126303,7 +159789,7 @@ struct simdjson_result<lsx::ondemand::json_type> : public lsx::implementation_si /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace ondemand { /** @@ -126485,30 +159971,30 @@ simdjson_unused simdjson_inline bool operator!=(std::string_view c, const raw_js } // namespace ondemand -} // namespace lsx +} // namespace lasx } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<lsx::ondemand::raw_json_string> : public lsx::implementation_simdjson_result_base<lsx::ondemand::raw_json_string> { +struct simdjson_result<lasx::ondemand::raw_json_string> : public lasx::implementation_simdjson_result_base<lasx::ondemand::raw_json_string> { public: - simdjson_inline simdjson_result(lsx::ondemand::raw_json_string &&value) noexcept; ///< @private + simdjson_inline simdjson_result(lasx::ondemand::raw_json_string &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; simdjson_inline ~simdjson_result() noexcept = default; ///< @private simdjson_inline simdjson_result<const char *> raw() const noexcept; simdjson_inline char operator[](size_t) const noexcept; - simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> unescape(lsx::ondemand::json_iterator &iter, bool allow_replacement) const noexcept; - simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> unescape_wobbly(lsx::ondemand::json_iterator &iter) const noexcept; + simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> unescape(lasx::ondemand::json_iterator &iter, bool allow_replacement) const noexcept; + simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> unescape_wobbly(lasx::ondemand::json_iterator &iter) const noexcept; }; } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_H -/* end file simdjson/generic/ondemand/raw_json_string.h for lsx */ -/* including simdjson/generic/ondemand/parser.h for lsx: #include "simdjson/generic/ondemand/parser.h" */ -/* begin file simdjson/generic/ondemand/parser.h for lsx */ +/* end file simdjson/generic/ondemand/raw_json_string.h for lasx */ +/* including simdjson/generic/ondemand/parser.h for lasx: #include "simdjson/generic/ondemand/parser.h" */ +/* begin file simdjson/generic/ondemand/parser.h for lasx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_PARSER_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -126521,7 +160007,7 @@ struct simdjson_result<lsx::ondemand::raw_json_string> : public lsx::implementat #include <thread> namespace simdjson { -namespace lsx { +namespace lasx { namespace ondemand { /** @@ -126921,15 +160407,15 @@ class parser { }; } // namespace ondemand -} // namespace lsx +} // namespace lasx } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<lsx::ondemand::parser> : public lsx::implementation_simdjson_result_base<lsx::ondemand::parser> { +struct simdjson_result<lasx::ondemand::parser> : public lasx::implementation_simdjson_result_base<lasx::ondemand::parser> { public: - simdjson_inline simdjson_result(lsx::ondemand::parser &&value) noexcept; ///< @private + simdjson_inline simdjson_result(lasx::ondemand::parser &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; }; @@ -126937,319 +160423,11 @@ struct simdjson_result<lsx::ondemand::parser> : public lsx::implementation_simdj } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_PARSER_H -/* end file simdjson/generic/ondemand/parser.h for lsx */ - -// JSON builder - needed for extract_into functionality -/* including simdjson/generic/ondemand/json_string_builder.h for lsx: #include "simdjson/generic/ondemand/json_string_builder.h" */ -/* begin file simdjson/generic/ondemand/json_string_builder.h for lsx */ -/** - * This file is part of the builder API. It is temporarily in the ondemand directory - * but we will move it to a builder directory later. - */ -#ifndef SIMDJSON_GENERIC_STRING_BUILDER_H - -/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_H */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */ -/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ - -namespace simdjson { - - -#if SIMDJSON_SUPPORTS_CONCEPTS - -namespace lsx { -namespace builder { - class string_builder; -}} - -template <typename T, typename = void> -struct has_custom_serialization : std::false_type {}; - -inline constexpr struct serialize_tag { - template <typename T> - constexpr void operator()(lsx::builder::string_builder& b, T&& obj) const{ - return tag_invoke(*this, b, std::forward<T>(obj)); - } - - -} serialize{}; -template <typename T> -struct has_custom_serialization<T, std::void_t< - decltype(tag_invoke(serialize, std::declval<lsx::builder::string_builder&>(), std::declval<T&>())) ->> : std::true_type {}; - -template <typename T> -constexpr bool require_custom_serialization = has_custom_serialization<T>::value; -#else -struct has_custom_serialization : std::false_type {}; -#endif // SIMDJSON_SUPPORTS_CONCEPTS - -namespace lsx { -namespace builder { -/** - * A builder for JSON strings representing documents. This is a low-level - * builder that is not meant to be used directly by end-users. Though it - * supports atomic types (Booleans, strings), it does not support composed - * types (arrays and objects). - * - * Ultimately, this class can support kernel-specific optimizations. E.g., - * it may make use of SIMD instructions to escape strings faster. - */ -class string_builder { -public: - simdjson_inline string_builder(size_t initial_capacity = DEFAULT_INITIAL_CAPACITY); - - static constexpr size_t DEFAULT_INITIAL_CAPACITY = 1024; - - /** - * Append number (includes Booleans). Booleans are mapped to the strings - * false and true. Numbers are converted to strings abiding by the JSON standard. - * Floating-point numbers are converted to the shortest string that 'correctly' - * represents the number. - */ - template<typename number_type, - typename = typename std::enable_if<std::is_arithmetic<number_type>::value>::type> - simdjson_inline void append(number_type v) noexcept; - - /** - * Append character c. - */ - simdjson_inline void append(char c) noexcept; - - /** - * Append the string 'null'. - */ - simdjson_inline void append_null() noexcept; - - /** - * Clear the content. - */ - simdjson_inline void clear() noexcept; - - /** - * Append the std::string_view, after escaping it. - * There is no UTF-8 validation. - */ - simdjson_inline void escape_and_append(std::string_view input) noexcept; - - /** - * Append the std::string_view surrounded by double quotes, after escaping it. - * There is no UTF-8 validation. - */ - simdjson_inline void escape_and_append_with_quotes(std::string_view input) noexcept; -#if SIMDJSON_SUPPORTS_CONCEPTS - template<constevalutil::fixed_string key> - simdjson_inline void escape_and_append_with_quotes() noexcept; -#endif - /** - * Append the character surrounded by double quotes, after escaping it. - * There is no UTF-8 validation. - */ - simdjson_inline void escape_and_append_with_quotes(char input) noexcept; - - /** - * Append the character surrounded by double quotes, after escaping it. - * There is no UTF-8 validation. - */ - simdjson_inline void escape_and_append_with_quotes(const char* input) noexcept; - - /** - * Append the C string directly, without escaping. - * There is no UTF-8 validation. - */ - simdjson_inline void append_raw(const char *c) noexcept; - - /** - * Append "{" to the buffer. - */ - simdjson_inline void start_object() noexcept; - - /** - * Append "}" to the buffer. - */ - simdjson_inline void end_object() noexcept; - - /** - * Append "[" to the buffer. - */ - simdjson_inline void start_array() noexcept; - - /** - * Append "]" to the buffer. - */ - simdjson_inline void end_array() noexcept; - - /** - * Append "," to the buffer. - */ - simdjson_inline void append_comma() noexcept; - - /** - * Append ":" to the buffer. - */ - simdjson_inline void append_colon() noexcept; - - /** - * Append a key-value pair to the buffer. - * The key is escaped and surrounded by double quotes. - * The value is escaped if it is a string. - */ - template<typename key_type, typename value_type> - simdjson_inline void append_key_value(key_type key, value_type value) noexcept; -#if SIMDJSON_SUPPORTS_CONCEPTS - template<constevalutil::fixed_string key, typename value_type> - simdjson_inline void append_key_value(value_type value) noexcept; - - // Support for optional types (std::optional, etc.) - template <concepts::optional_type T> - requires(!require_custom_serialization<T>) - simdjson_inline void append(const T &opt); - - template <typename T> - requires(require_custom_serialization<T>) - simdjson_inline void append(T &&val); - - // Support for string-like types - template <typename T> - requires(std::is_convertible<T, std::string_view>::value || - std::is_same<T, const char*>::value ) - simdjson_inline void append(const T &value); -#endif -#if SIMDJSON_SUPPORTS_RANGES && SIMDJSON_SUPPORTS_CONCEPTS - // Support for range-based appending (std::ranges::view, etc.) - template <std::ranges::range R> -requires (!std::is_convertible<R, std::string_view>::value && !require_custom_serialization<R>) - simdjson_inline void append(const R &range) noexcept; -#endif - /** - * Append the std::string_view directly, without escaping. - * There is no UTF-8 validation. - */ - simdjson_inline void append_raw(std::string_view input) noexcept; - - /** - * Append len characters from str. - * There is no UTF-8 validation. - */ - simdjson_inline void append_raw(const char *str, size_t len) noexcept; -#if SIMDJSON_EXCEPTIONS - /** - * Creates an std::string from the written JSON buffer. - * Throws if memory allocation failed - * - * The result may not be valid UTF-8 if some of your content was not valid UTF-8. - * Use validate_unicode() to check the content if needed. - */ - simdjson_inline operator std::string() const noexcept(false); - - /** - * Creates an std::string_view from the written JSON buffer. - * Throws if memory allocation failed. - * - * The result may not be valid UTF-8 if some of your content was not valid UTF-8. - * Use validate_unicode() to check the content if needed. - */ - simdjson_inline operator std::string_view() const noexcept(false) simdjson_lifetime_bound; -#endif - - /** - * Returns a view on the written JSON buffer. Returns an error - * if memory allocation failed. - * - * The result may not be valid UTF-8 if some of your content was not valid UTF-8. - * Use validate_unicode() to check the content. - */ - simdjson_inline simdjson_result<std::string_view> view() const noexcept; - - /** - * Appends the null character to the buffer and returns - * a pointer to the beginning of the written JSON buffer. - * Returns an error if memory allocation failed. - * The result is null-terminated. - * - * The result may not be valid UTF-8 if some of your content was not valid UTF-8. - * Use validate_unicode() to check the content. - */ - simdjson_inline simdjson_result<const char *> c_str() noexcept; - - /** - * Return true if the content is valid UTF-8. - */ - simdjson_inline bool validate_unicode() const noexcept; - - /** - * Returns the current size of the written JSON buffer. - * If an error occurred, returns 0. - */ - simdjson_inline size_t size() const noexcept; - -private: - /** - * Returns true if we can write at least upcoming_bytes bytes. - * The underlying buffer is reallocated if needed. It is designed - * to be called before writing to the buffer. It should be fast. - */ - simdjson_inline bool capacity_check(size_t upcoming_bytes); - - /** - * Grow the buffer to at least desired_capacity bytes. - * If the allocation fails, is_valid is set to false. We expect - * that this function would not be repeatedly called. - */ - simdjson_inline void grow_buffer(size_t desired_capacity); - - /** - * We use this helper function to make sure that is_valid is kept consistent. - */ - simdjson_inline void set_valid(bool valid) noexcept; - - std::unique_ptr<char[]> buffer{}; - size_t position{0}; - size_t capacity{0}; - bool is_valid{true}; -}; - - - -} -} - - -#if !SIMDJSON_STATIC_REFLECTION -// fallback implementation until we have static reflection -template <class Z> -simdjson_warn_unused simdjson_result<std::string> to_json(const Z &z, size_t initial_capacity = simdjson::lsx::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { - simdjson::lsx::builder::string_builder b(initial_capacity); - b.append(z); - std::string_view s; - auto e = b.view().get(s); - if(e) { return e; } - return std::string(s); -} -template <class Z> -simdjson_warn_unused simdjson_error to_json(const Z &z, std::string &s, size_t initial_capacity = simdjson::lsx::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { - simdjson::lsx::builder::string_builder b(initial_capacity); - b.append(z); - std::string_view sv; - auto e = b.view().get(sv); - if(e) { return e; } - s.assign(sv.data(), sv.size()); - return simdjson::SUCCESS; -} -#endif - -#if SIMDJSON_SUPPORTS_CONCEPTS -#endif // SIMDJSON_SUPPORTS_CONCEPTS - -} // namespace simdjson - -#endif // SIMDJSON_GENERIC_STRING_BUILDER_H -/* end file simdjson/generic/ondemand/json_string_builder.h for lsx */ +/* end file simdjson/generic/ondemand/parser.h for lasx */ // All other declarations -/* including simdjson/generic/ondemand/array.h for lsx: #include "simdjson/generic/ondemand/array.h" */ -/* begin file simdjson/generic/ondemand/array.h for lsx */ +/* including simdjson/generic/ondemand/array.h for lasx: #include "simdjson/generic/ondemand/array.h" */ +/* begin file simdjson/generic/ondemand/array.h for lasx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -127261,7 +160439,7 @@ simdjson_warn_unused simdjson_error to_json(const Z &z, std::string &s, size_t i /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace ondemand { /** @@ -127481,27 +160659,27 @@ class array { }; } // namespace ondemand -} // namespace lsx +} // namespace lasx } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<lsx::ondemand::array> : public lsx::implementation_simdjson_result_base<lsx::ondemand::array> { +struct simdjson_result<lasx::ondemand::array> : public lasx::implementation_simdjson_result_base<lasx::ondemand::array> { public: - simdjson_inline simdjson_result(lsx::ondemand::array &&value) noexcept; ///< @private + simdjson_inline simdjson_result(lasx::ondemand::array &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; - simdjson_inline simdjson_result<lsx::ondemand::array_iterator> begin() noexcept; - simdjson_inline simdjson_result<lsx::ondemand::array_iterator> end() noexcept; + simdjson_inline simdjson_result<lasx::ondemand::array_iterator> begin() noexcept; + simdjson_inline simdjson_result<lasx::ondemand::array_iterator> end() noexcept; inline simdjson_result<size_t> count_elements() & noexcept; inline simdjson_result<bool> is_empty() & noexcept; inline simdjson_result<bool> reset() & noexcept; - simdjson_inline simdjson_result<lsx::ondemand::value> at(size_t index) noexcept; - simdjson_inline simdjson_result<lsx::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result<lsx::ondemand::value> at_path(std::string_view json_path) noexcept; - simdjson_inline simdjson_result<std::vector<lsx::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<lasx::ondemand::value> at(size_t index) noexcept; + simdjson_inline simdjson_result<lasx::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result<lasx::ondemand::value> at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<std::vector<lasx::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; simdjson_inline simdjson_result<std::string_view> raw_json() noexcept; #if SIMDJSON_SUPPORTS_CONCEPTS // TODO: move this code into object-inl.h @@ -127509,7 +160687,7 @@ struct simdjson_result<lsx::ondemand::array> : public lsx::implementation_simdjs template<typename T> simdjson_inline simdjson_result<T> get() noexcept { if (error()) { return error(); } - if constexpr (std::is_same_v<T, lsx::ondemand::array>) { + if constexpr (std::is_same_v<T, lasx::ondemand::array>) { return first; } return first.get<T>(); @@ -127517,7 +160695,7 @@ struct simdjson_result<lsx::ondemand::array> : public lsx::implementation_simdjs template<typename T> simdjson_warn_unused simdjson_inline error_code get(T& out) noexcept { if (error()) { return error(); } - if constexpr (std::is_same_v<T, lsx::ondemand::array>) { + if constexpr (std::is_same_v<T, lasx::ondemand::array>) { out = first; } else { SIMDJSON_TRY( first.get<T>(out) ); @@ -127530,13 +160708,14 @@ struct simdjson_result<lsx::ondemand::array> : public lsx::implementation_simdjs } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_H -/* end file simdjson/generic/ondemand/array.h for lsx */ -/* including simdjson/generic/ondemand/array_iterator.h for lsx: #include "simdjson/generic/ondemand/array_iterator.h" */ -/* begin file simdjson/generic/ondemand/array_iterator.h for lsx */ +/* end file simdjson/generic/ondemand/array.h for lasx */ +/* including simdjson/generic/ondemand/array_iterator.h for lasx: #include "simdjson/generic/ondemand/array_iterator.h" */ +/* begin file simdjson/generic/ondemand/array_iterator.h for lasx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ /* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H */ +/* amalgamation skipped (editor-only): #include <iterator> */ /* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */ @@ -127544,7 +160723,7 @@ struct simdjson_result<lsx::ondemand::array> : public lsx::implementation_simdjs namespace simdjson { -namespace lsx { +namespace lasx { namespace ondemand { /** @@ -127552,11 +160731,17 @@ namespace ondemand { * * This is an input_iterator, meaning: * - It is forward-only - * - * must be called exactly once per element. + * - * must be called at most once per element. * - ++ must be called exactly once in between each * (*, ++, *, ++, * ...) */ class array_iterator { public: + using iterator_category = std::input_iterator_tag; + using value_type = simdjson_result<value>; + using difference_type = std::ptrdiff_t; + using pointer = void; + using reference = value_type; + /** Create a new, invalid array iterator. */ simdjson_inline array_iterator() noexcept = default; @@ -127600,6 +160785,9 @@ class array_iterator { simdjson_warn_unused simdjson_inline bool at_end() const noexcept; private: +#if SIMDJSON_DEVELOPMENT_CHECKS + bool has_been_referenced{false}; +#endif value_iterator iter{}; simdjson_inline array_iterator(const value_iterator &iter) noexcept; @@ -127610,14 +160798,20 @@ class array_iterator { }; } // namespace ondemand -} // namespace lsx +} // namespace lasx } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<lsx::ondemand::array_iterator> : public lsx::implementation_simdjson_result_base<lsx::ondemand::array_iterator> { - simdjson_inline simdjson_result(lsx::ondemand::array_iterator &&value) noexcept; ///< @private +struct simdjson_result<lasx::ondemand::array_iterator> : public lasx::implementation_simdjson_result_base<lasx::ondemand::array_iterator> { + using iterator_category = std::input_iterator_tag; + using value_type = simdjson_result<lasx::ondemand::value>; + using difference_type = std::ptrdiff_t; + using pointer = void; + using reference = value_type; + + simdjson_inline simdjson_result(lasx::ondemand::array_iterator &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; @@ -127625,10 +160819,10 @@ struct simdjson_result<lsx::ondemand::array_iterator> : public lsx::implementati // Iterator interface // - simdjson_inline simdjson_result<lsx::ondemand::value> operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. - simdjson_inline bool operator==(const simdjson_result<lsx::ondemand::array_iterator> &) const noexcept; - simdjson_inline bool operator!=(const simdjson_result<lsx::ondemand::array_iterator> &) const noexcept; - simdjson_inline simdjson_result<lsx::ondemand::array_iterator> &operator++() noexcept; + simdjson_inline simdjson_result<lasx::ondemand::value> operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. + simdjson_inline bool operator==(const simdjson_result<lasx::ondemand::array_iterator> &) const noexcept; + simdjson_inline bool operator!=(const simdjson_result<lasx::ondemand::array_iterator> &) const noexcept; + simdjson_inline simdjson_result<lasx::ondemand::array_iterator> &operator++() noexcept; simdjson_warn_unused simdjson_inline bool at_end() const noexcept; }; @@ -127636,9 +160830,9 @@ struct simdjson_result<lsx::ondemand::array_iterator> : public lsx::implementati } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H -/* end file simdjson/generic/ondemand/array_iterator.h for lsx */ -/* including simdjson/generic/ondemand/document.h for lsx: #include "simdjson/generic/ondemand/document.h" */ -/* begin file simdjson/generic/ondemand/document.h for lsx */ +/* end file simdjson/generic/ondemand/array_iterator.h for lasx */ +/* including simdjson/generic/ondemand/document.h for lasx: #include "simdjson/generic/ondemand/document.h" */ +/* begin file simdjson/generic/ondemand/document.h for lasx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -127652,7 +160846,7 @@ struct simdjson_result<lsx::ondemand::array_iterator> : public lsx::implementati namespace simdjson { -namespace lsx { +namespace lasx { namespace ondemand { /** @@ -128604,21 +161798,21 @@ class document_reference { document *doc{nullptr}; }; } // namespace ondemand -} // namespace lsx +} // namespace lasx } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<lsx::ondemand::document> : public lsx::implementation_simdjson_result_base<lsx::ondemand::document> { +struct simdjson_result<lasx::ondemand::document> : public lasx::implementation_simdjson_result_base<lasx::ondemand::document> { public: - simdjson_inline simdjson_result(lsx::ondemand::document &&value) noexcept; ///< @private + simdjson_inline simdjson_result(lasx::ondemand::document &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; simdjson_inline error_code rewind() noexcept; - simdjson_inline simdjson_result<lsx::ondemand::array> get_array() & noexcept; - simdjson_inline simdjson_result<lsx::ondemand::object> get_object() & noexcept; + simdjson_inline simdjson_result<lasx::ondemand::array> get_array() & noexcept; + simdjson_inline simdjson_result<lasx::ondemand::object> get_object() & noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64() noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64_in_string() noexcept; simdjson_inline simdjson_result<int64_t> get_int64() noexcept; @@ -128629,9 +161823,9 @@ struct simdjson_result<lsx::ondemand::document> : public lsx::implementation_sim template <typename string_type> simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result<std::string_view> get_wobbly_string() noexcept; - simdjson_inline simdjson_result<lsx::ondemand::raw_json_string> get_raw_json_string() noexcept; + simdjson_inline simdjson_result<lasx::ondemand::raw_json_string> get_raw_json_string() noexcept; simdjson_inline simdjson_result<bool> get_bool() noexcept; - simdjson_inline simdjson_result<lsx::ondemand::value> get_value() noexcept; + simdjson_inline simdjson_result<lasx::ondemand::value> get_value() noexcept; simdjson_inline simdjson_result<bool> is_null() noexcept; template<typename T> simdjson_inline simdjson_result<T> get() & noexcept; @@ -128641,33 +161835,33 @@ struct simdjson_result<lsx::ondemand::document> : public lsx::implementation_sim template<typename T> simdjson_inline error_code get(T &out) && noexcept; #if SIMDJSON_EXCEPTIONS - using lsx::implementation_simdjson_result_base<lsx::ondemand::document>::operator*; - using lsx::implementation_simdjson_result_base<lsx::ondemand::document>::operator->; - template <class T, typename std::enable_if<std::is_same<T, lsx::ondemand::document>::value == false>::type> + using lasx::implementation_simdjson_result_base<lasx::ondemand::document>::operator*; + using lasx::implementation_simdjson_result_base<lasx::ondemand::document>::operator->; + template <class T, typename std::enable_if<std::is_same<T, lasx::ondemand::document>::value == false>::type> explicit simdjson_inline operator T() noexcept(false); - simdjson_inline operator lsx::ondemand::array() & noexcept(false); - simdjson_inline operator lsx::ondemand::object() & noexcept(false); + simdjson_inline operator lasx::ondemand::array() & noexcept(false); + simdjson_inline operator lasx::ondemand::object() & noexcept(false); simdjson_inline operator uint64_t() noexcept(false); simdjson_inline operator int64_t() noexcept(false); simdjson_inline operator double() noexcept(false); simdjson_inline operator std::string_view() noexcept(false); - simdjson_inline operator lsx::ondemand::raw_json_string() noexcept(false); + simdjson_inline operator lasx::ondemand::raw_json_string() noexcept(false); simdjson_inline operator bool() noexcept(false); - simdjson_inline operator lsx::ondemand::value() noexcept(false); + simdjson_inline operator lasx::ondemand::value() noexcept(false); #endif simdjson_inline simdjson_result<size_t> count_elements() & noexcept; simdjson_inline simdjson_result<size_t> count_fields() & noexcept; - simdjson_inline simdjson_result<lsx::ondemand::value> at(size_t index) & noexcept; - simdjson_inline simdjson_result<lsx::ondemand::array_iterator> begin() & noexcept; - simdjson_inline simdjson_result<lsx::ondemand::array_iterator> end() & noexcept; - simdjson_inline simdjson_result<lsx::ondemand::value> find_field(std::string_view key) & noexcept; - simdjson_inline simdjson_result<lsx::ondemand::value> find_field(const char *key) & noexcept; - simdjson_inline simdjson_result<lsx::ondemand::value> operator[](std::string_view key) & noexcept; - simdjson_inline simdjson_result<lsx::ondemand::value> operator[](const char *key) & noexcept; - simdjson_result<lsx::ondemand::value> operator[](int) & noexcept = delete; - simdjson_inline simdjson_result<lsx::ondemand::value> find_field_unordered(std::string_view key) & noexcept; - simdjson_inline simdjson_result<lsx::ondemand::value> find_field_unordered(const char *key) & noexcept; - simdjson_inline simdjson_result<lsx::ondemand::json_type> type() noexcept; + simdjson_inline simdjson_result<lasx::ondemand::value> at(size_t index) & noexcept; + simdjson_inline simdjson_result<lasx::ondemand::array_iterator> begin() & noexcept; + simdjson_inline simdjson_result<lasx::ondemand::array_iterator> end() & noexcept; + simdjson_inline simdjson_result<lasx::ondemand::value> find_field(std::string_view key) & noexcept; + simdjson_inline simdjson_result<lasx::ondemand::value> find_field(const char *key) & noexcept; + simdjson_inline simdjson_result<lasx::ondemand::value> operator[](std::string_view key) & noexcept; + simdjson_inline simdjson_result<lasx::ondemand::value> operator[](const char *key) & noexcept; + simdjson_result<lasx::ondemand::value> operator[](int) & noexcept = delete; + simdjson_inline simdjson_result<lasx::ondemand::value> find_field_unordered(std::string_view key) & noexcept; + simdjson_inline simdjson_result<lasx::ondemand::value> find_field_unordered(const char *key) & noexcept; + simdjson_inline simdjson_result<lasx::ondemand::json_type> type() noexcept; simdjson_inline simdjson_result<bool> is_scalar() noexcept; simdjson_inline simdjson_result<bool> is_string() noexcept; simdjson_inline simdjson_result<const char *> current_location() noexcept; @@ -128675,14 +161869,14 @@ struct simdjson_result<lsx::ondemand::document> : public lsx::implementation_sim simdjson_inline bool at_end() const noexcept; simdjson_inline bool is_negative() noexcept; simdjson_inline simdjson_result<bool> is_integer() noexcept; - simdjson_inline simdjson_result<lsx::number_type> get_number_type() noexcept; - simdjson_inline simdjson_result<lsx::ondemand::number> get_number() noexcept; + simdjson_inline simdjson_result<lasx::number_type> get_number_type() noexcept; + simdjson_inline simdjson_result<lasx::ondemand::number> get_number() noexcept; /** @copydoc simdjson_inline std::string_view document::raw_json_token() const noexcept */ simdjson_inline simdjson_result<std::string_view> raw_json_token() noexcept; - simdjson_inline simdjson_result<lsx::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result<lsx::ondemand::value> at_path(std::string_view json_path) noexcept; - simdjson_inline simdjson_result<std::vector<lsx::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<lasx::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result<lasx::ondemand::value> at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<std::vector<lasx::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; #if SIMDJSON_STATIC_REFLECTION template<constevalutil::fixed_string... FieldNames, typename T> requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) @@ -128698,14 +161892,14 @@ struct simdjson_result<lsx::ondemand::document> : public lsx::implementation_sim namespace simdjson { template<> -struct simdjson_result<lsx::ondemand::document_reference> : public lsx::implementation_simdjson_result_base<lsx::ondemand::document_reference> { +struct simdjson_result<lasx::ondemand::document_reference> : public lasx::implementation_simdjson_result_base<lasx::ondemand::document_reference> { public: - simdjson_inline simdjson_result(lsx::ondemand::document_reference value, error_code error) noexcept; + simdjson_inline simdjson_result(lasx::ondemand::document_reference value, error_code error) noexcept; simdjson_inline simdjson_result() noexcept = default; simdjson_inline error_code rewind() noexcept; - simdjson_inline simdjson_result<lsx::ondemand::array> get_array() & noexcept; - simdjson_inline simdjson_result<lsx::ondemand::object> get_object() & noexcept; + simdjson_inline simdjson_result<lasx::ondemand::array> get_array() & noexcept; + simdjson_inline simdjson_result<lasx::ondemand::object> get_object() & noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64() noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64_in_string() noexcept; simdjson_inline simdjson_result<int64_t> get_int64() noexcept; @@ -128716,9 +161910,9 @@ struct simdjson_result<lsx::ondemand::document_reference> : public lsx::implemen template <typename string_type> simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result<std::string_view> get_wobbly_string() noexcept; - simdjson_inline simdjson_result<lsx::ondemand::raw_json_string> get_raw_json_string() noexcept; + simdjson_inline simdjson_result<lasx::ondemand::raw_json_string> get_raw_json_string() noexcept; simdjson_inline simdjson_result<bool> get_bool() noexcept; - simdjson_inline simdjson_result<lsx::ondemand::value> get_value() noexcept; + simdjson_inline simdjson_result<lasx::ondemand::value> get_value() noexcept; simdjson_inline simdjson_result<bool> is_null() noexcept; template<typename T> simdjson_inline simdjson_result<T> get() & noexcept; @@ -128729,43 +161923,43 @@ struct simdjson_result<lsx::ondemand::document_reference> : public lsx::implemen #if SIMDJSON_EXCEPTIONS template <class T> explicit simdjson_inline operator T() noexcept(false); - simdjson_inline operator lsx::ondemand::array() & noexcept(false); - simdjson_inline operator lsx::ondemand::object() & noexcept(false); + simdjson_inline operator lasx::ondemand::array() & noexcept(false); + simdjson_inline operator lasx::ondemand::object() & noexcept(false); simdjson_inline operator uint64_t() noexcept(false); simdjson_inline operator int64_t() noexcept(false); simdjson_inline operator double() noexcept(false); simdjson_inline operator std::string_view() noexcept(false); - simdjson_inline operator lsx::ondemand::raw_json_string() noexcept(false); + simdjson_inline operator lasx::ondemand::raw_json_string() noexcept(false); simdjson_inline operator bool() noexcept(false); - simdjson_inline operator lsx::ondemand::value() noexcept(false); + simdjson_inline operator lasx::ondemand::value() noexcept(false); #endif simdjson_inline simdjson_result<size_t> count_elements() & noexcept; simdjson_inline simdjson_result<size_t> count_fields() & noexcept; - simdjson_inline simdjson_result<lsx::ondemand::value> at(size_t index) & noexcept; - simdjson_inline simdjson_result<lsx::ondemand::array_iterator> begin() & noexcept; - simdjson_inline simdjson_result<lsx::ondemand::array_iterator> end() & noexcept; - simdjson_inline simdjson_result<lsx::ondemand::value> find_field(std::string_view key) & noexcept; - simdjson_inline simdjson_result<lsx::ondemand::value> find_field(const char *key) & noexcept; - simdjson_inline simdjson_result<lsx::ondemand::value> operator[](std::string_view key) & noexcept; - simdjson_inline simdjson_result<lsx::ondemand::value> operator[](const char *key) & noexcept; - simdjson_result<lsx::ondemand::value> operator[](int) & noexcept = delete; - simdjson_inline simdjson_result<lsx::ondemand::value> find_field_unordered(std::string_view key) & noexcept; - simdjson_inline simdjson_result<lsx::ondemand::value> find_field_unordered(const char *key) & noexcept; - simdjson_inline simdjson_result<lsx::ondemand::json_type> type() noexcept; + simdjson_inline simdjson_result<lasx::ondemand::value> at(size_t index) & noexcept; + simdjson_inline simdjson_result<lasx::ondemand::array_iterator> begin() & noexcept; + simdjson_inline simdjson_result<lasx::ondemand::array_iterator> end() & noexcept; + simdjson_inline simdjson_result<lasx::ondemand::value> find_field(std::string_view key) & noexcept; + simdjson_inline simdjson_result<lasx::ondemand::value> find_field(const char *key) & noexcept; + simdjson_inline simdjson_result<lasx::ondemand::value> operator[](std::string_view key) & noexcept; + simdjson_inline simdjson_result<lasx::ondemand::value> operator[](const char *key) & noexcept; + simdjson_result<lasx::ondemand::value> operator[](int) & noexcept = delete; + simdjson_inline simdjson_result<lasx::ondemand::value> find_field_unordered(std::string_view key) & noexcept; + simdjson_inline simdjson_result<lasx::ondemand::value> find_field_unordered(const char *key) & noexcept; + simdjson_inline simdjson_result<lasx::ondemand::json_type> type() noexcept; simdjson_inline simdjson_result<bool> is_scalar() noexcept; simdjson_inline simdjson_result<bool> is_string() noexcept; simdjson_inline simdjson_result<const char *> current_location() noexcept; simdjson_inline simdjson_result<int32_t> current_depth() const noexcept; simdjson_inline simdjson_result<bool> is_negative() noexcept; simdjson_inline simdjson_result<bool> is_integer() noexcept; - simdjson_inline simdjson_result<lsx::number_type> get_number_type() noexcept; - simdjson_inline simdjson_result<lsx::ondemand::number> get_number() noexcept; + simdjson_inline simdjson_result<lasx::number_type> get_number_type() noexcept; + simdjson_inline simdjson_result<lasx::ondemand::number> get_number() noexcept; /** @copydoc simdjson_inline std::string_view document_reference::raw_json_token() const noexcept */ simdjson_inline simdjson_result<std::string_view> raw_json_token() noexcept; - simdjson_inline simdjson_result<lsx::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result<lsx::ondemand::value> at_path(std::string_view json_path) noexcept; - simdjson_inline simdjson_result<std::vector<lsx::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<lasx::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result<lasx::ondemand::value> at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<std::vector<lasx::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; #if SIMDJSON_STATIC_REFLECTION template<constevalutil::fixed_string... FieldNames, typename T> requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) @@ -128777,9 +161971,9 @@ struct simdjson_result<lsx::ondemand::document_reference> : public lsx::implemen } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_H -/* end file simdjson/generic/ondemand/document.h for lsx */ -/* including simdjson/generic/ondemand/document_stream.h for lsx: #include "simdjson/generic/ondemand/document_stream.h" */ -/* begin file simdjson/generic/ondemand/document_stream.h for lsx */ +/* end file simdjson/generic/ondemand/document.h for lasx */ +/* including simdjson/generic/ondemand/document_stream.h for lasx: #include "simdjson/generic/ondemand/document_stream.h" */ +/* begin file simdjson/generic/ondemand/document_stream.h for lasx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -128797,7 +161991,7 @@ struct simdjson_result<lsx::ondemand::document_reference> : public lsx::implemen #endif namespace simdjson { -namespace lsx { +namespace lasx { namespace ondemand { #ifdef SIMDJSON_THREADS_ENABLED @@ -129110,14 +162304,14 @@ class document_stream { }; // document_stream } // namespace ondemand -} // namespace lsx +} // namespace lasx } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<lsx::ondemand::document_stream> : public lsx::implementation_simdjson_result_base<lsx::ondemand::document_stream> { +struct simdjson_result<lasx::ondemand::document_stream> : public lasx::implementation_simdjson_result_base<lasx::ondemand::document_stream> { public: - simdjson_inline simdjson_result(lsx::ondemand::document_stream &&value) noexcept; ///< @private + simdjson_inline simdjson_result(lasx::ondemand::document_stream &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; }; @@ -129125,9 +162319,9 @@ struct simdjson_result<lsx::ondemand::document_stream> : public lsx::implementat } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_H -/* end file simdjson/generic/ondemand/document_stream.h for lsx */ -/* including simdjson/generic/ondemand/field.h for lsx: #include "simdjson/generic/ondemand/field.h" */ -/* begin file simdjson/generic/ondemand/field.h for lsx */ +/* end file simdjson/generic/ondemand/document_stream.h for lasx */ +/* including simdjson/generic/ondemand/field.h for lasx: #include "simdjson/generic/ondemand/field.h" */ +/* begin file simdjson/generic/ondemand/field.h for lasx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_FIELD_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -129139,7 +162333,7 @@ struct simdjson_result<lsx::ondemand::document_stream> : public lsx::implementat /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace ondemand { /** @@ -129217,33 +162411,33 @@ class field : public std::pair<raw_json_string, value> { }; } // namespace ondemand -} // namespace lsx +} // namespace lasx } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<lsx::ondemand::field> : public lsx::implementation_simdjson_result_base<lsx::ondemand::field> { +struct simdjson_result<lasx::ondemand::field> : public lasx::implementation_simdjson_result_base<lasx::ondemand::field> { public: - simdjson_inline simdjson_result(lsx::ondemand::field &&value) noexcept; ///< @private + simdjson_inline simdjson_result(lasx::ondemand::field &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; simdjson_inline simdjson_result<std::string_view> unescaped_key(bool allow_replacement = false) noexcept; template<typename string_type> simdjson_inline error_code unescaped_key(string_type &receiver, bool allow_replacement = false) noexcept; - simdjson_inline simdjson_result<lsx::ondemand::raw_json_string> key() noexcept; + simdjson_inline simdjson_result<lasx::ondemand::raw_json_string> key() noexcept; simdjson_inline simdjson_result<std::string_view> key_raw_json_token() noexcept; simdjson_inline simdjson_result<std::string_view> escaped_key() noexcept; - simdjson_inline simdjson_result<lsx::ondemand::value> value() noexcept; + simdjson_inline simdjson_result<lasx::ondemand::value> value() noexcept; }; } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_FIELD_H -/* end file simdjson/generic/ondemand/field.h for lsx */ -/* including simdjson/generic/ondemand/object.h for lsx: #include "simdjson/generic/ondemand/object.h" */ -/* begin file simdjson/generic/ondemand/object.h for lsx */ +/* end file simdjson/generic/ondemand/field.h for lasx */ +/* including simdjson/generic/ondemand/object.h for lasx: #include "simdjson/generic/ondemand/object.h" */ +/* begin file simdjson/generic/ondemand/object.h for lasx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -129258,7 +162452,7 @@ struct simdjson_result<lsx::ondemand::field> : public lsx::implementation_simdjs /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace ondemand { /** @@ -129273,6 +162467,13 @@ class object { */ simdjson_inline object() noexcept = default; + /** + * Get an iterator to the start of the object. We recommend using a range-based for loop. + * + * Using the iterator directly is also possible but error-prone and discouraged. In particular, + * you must dereference the iterator exactly once per iteration (before calling '++'). + * Doing otherwise is unsafe and may lead to errors. You are responsible for ensuring + */ simdjson_inline simdjson_result<object_iterator> begin() noexcept; simdjson_inline simdjson_result<object_iterator> end() noexcept; /** @@ -129545,29 +162746,29 @@ class object { }; } // namespace ondemand -} // namespace lsx +} // namespace lasx } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<lsx::ondemand::object> : public lsx::implementation_simdjson_result_base<lsx::ondemand::object> { +struct simdjson_result<lasx::ondemand::object> : public lasx::implementation_simdjson_result_base<lasx::ondemand::object> { public: - simdjson_inline simdjson_result(lsx::ondemand::object &&value) noexcept; ///< @private + simdjson_inline simdjson_result(lasx::ondemand::object &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; - simdjson_inline simdjson_result<lsx::ondemand::object_iterator> begin() noexcept; - simdjson_inline simdjson_result<lsx::ondemand::object_iterator> end() noexcept; - simdjson_inline simdjson_result<lsx::ondemand::value> find_field(std::string_view key) & noexcept; - simdjson_inline simdjson_result<lsx::ondemand::value> find_field(std::string_view key) && noexcept; - simdjson_inline simdjson_result<lsx::ondemand::value> find_field_unordered(std::string_view key) & noexcept; - simdjson_inline simdjson_result<lsx::ondemand::value> find_field_unordered(std::string_view key) && noexcept; - simdjson_inline simdjson_result<lsx::ondemand::value> operator[](std::string_view key) & noexcept; - simdjson_inline simdjson_result<lsx::ondemand::value> operator[](std::string_view key) && noexcept; - simdjson_inline simdjson_result<lsx::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result<lsx::ondemand::value> at_path(std::string_view json_path) noexcept; - simdjson_inline simdjson_result<std::vector<lsx::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<lasx::ondemand::object_iterator> begin() noexcept; + simdjson_inline simdjson_result<lasx::ondemand::object_iterator> end() noexcept; + simdjson_inline simdjson_result<lasx::ondemand::value> find_field(std::string_view key) & noexcept; + simdjson_inline simdjson_result<lasx::ondemand::value> find_field(std::string_view key) && noexcept; + simdjson_inline simdjson_result<lasx::ondemand::value> find_field_unordered(std::string_view key) & noexcept; + simdjson_inline simdjson_result<lasx::ondemand::value> find_field_unordered(std::string_view key) && noexcept; + simdjson_inline simdjson_result<lasx::ondemand::value> operator[](std::string_view key) & noexcept; + simdjson_inline simdjson_result<lasx::ondemand::value> operator[](std::string_view key) && noexcept; + simdjson_inline simdjson_result<lasx::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result<lasx::ondemand::value> at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<std::vector<lasx::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; inline simdjson_result<bool> reset() noexcept; inline simdjson_result<bool> is_empty() noexcept; inline simdjson_result<size_t> count_fields() & noexcept; @@ -129578,7 +162779,7 @@ struct simdjson_result<lsx::ondemand::object> : public lsx::implementation_simdj template<typename T> simdjson_inline simdjson_result<T> get() noexcept { if (error()) { return error(); } - if constexpr (std::is_same_v<T, lsx::ondemand::object>) { + if constexpr (std::is_same_v<T, lasx::ondemand::object>) { return first; } return first.get<T>(); @@ -129586,7 +162787,7 @@ struct simdjson_result<lsx::ondemand::object> : public lsx::implementation_simdj template<typename T> simdjson_warn_unused simdjson_inline error_code get(T& out) noexcept { if (error()) { return error(); } - if constexpr (std::is_same_v<T, lsx::ondemand::object>) { + if constexpr (std::is_same_v<T, lasx::ondemand::object>) { out = first; } else { SIMDJSON_TRY( first.get<T>(out) ); @@ -129609,9 +162810,9 @@ struct simdjson_result<lsx::ondemand::object> : public lsx::implementation_simdj } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_H -/* end file simdjson/generic/ondemand/object.h for lsx */ -/* including simdjson/generic/ondemand/object_iterator.h for lsx: #include "simdjson/generic/ondemand/object_iterator.h" */ -/* begin file simdjson/generic/ondemand/object_iterator.h for lsx */ +/* end file simdjson/generic/ondemand/object.h for lasx */ +/* including simdjson/generic/ondemand/object_iterator.h for lasx: #include "simdjson/generic/ondemand/object_iterator.h" */ +/* begin file simdjson/generic/ondemand/object_iterator.h for lasx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -129622,7 +162823,7 @@ struct simdjson_result<lsx::ondemand::object> : public lsx::implementation_simdj /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace ondemand { class object_iterator { @@ -129646,9 +162847,14 @@ class object_iterator { // Assumes it's being compared with the end. true if depth >= iter->depth. simdjson_inline bool operator!=(const object_iterator &) const noexcept; // Checks for ']' and ',' + // YOU MUST NOT CALL THIS IF operator* YIELDED AN ERROR. + // YOU MUST NOT CALL THIS WITHOUT A CORRESPONDING operator* CALL. simdjson_inline object_iterator &operator++() noexcept; private: +#if SIMDJSON_DEVELOPMENT_CHECKS + bool has_been_referenced{false}; +#endif /** * The underlying JSON iterator. * @@ -129663,15 +162869,15 @@ class object_iterator { }; } // namespace ondemand -} // namespace lsx +} // namespace lasx } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<lsx::ondemand::object_iterator> : public lsx::implementation_simdjson_result_base<lsx::ondemand::object_iterator> { +struct simdjson_result<lasx::ondemand::object_iterator> : public lasx::implementation_simdjson_result_base<lasx::ondemand::object_iterator> { public: - simdjson_inline simdjson_result(lsx::ondemand::object_iterator &&value) noexcept; ///< @private + simdjson_inline simdjson_result(lasx::ondemand::object_iterator &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; @@ -129680,21 +162886,21 @@ struct simdjson_result<lsx::ondemand::object_iterator> : public lsx::implementat // // Reads key and value, yielding them to the user. - simdjson_inline simdjson_result<lsx::ondemand::field> operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. + simdjson_inline simdjson_result<lasx::ondemand::field> operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. // Assumes it's being compared with the end. true if depth < iter->depth. - simdjson_inline bool operator==(const simdjson_result<lsx::ondemand::object_iterator> &) const noexcept; + simdjson_inline bool operator==(const simdjson_result<lasx::ondemand::object_iterator> &) const noexcept; // Assumes it's being compared with the end. true if depth >= iter->depth. - simdjson_inline bool operator!=(const simdjson_result<lsx::ondemand::object_iterator> &) const noexcept; + simdjson_inline bool operator!=(const simdjson_result<lasx::ondemand::object_iterator> &) const noexcept; // Checks for ']' and ',' - simdjson_inline simdjson_result<lsx::ondemand::object_iterator> &operator++() noexcept; + simdjson_inline simdjson_result<lasx::ondemand::object_iterator> &operator++() noexcept; }; } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_H -/* end file simdjson/generic/ondemand/object_iterator.h for lsx */ -/* including simdjson/generic/ondemand/serialization.h for lsx: #include "simdjson/generic/ondemand/serialization.h" */ -/* begin file simdjson/generic/ondemand/serialization.h for lsx */ +/* end file simdjson/generic/ondemand/object_iterator.h for lasx */ +/* including simdjson/generic/ondemand/serialization.h for lasx: #include "simdjson/generic/ondemand/serialization.h" */ +/* begin file simdjson/generic/ondemand/serialization.h for lasx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -129708,30 +162914,30 @@ namespace simdjson { * contains JSON text that is suitable to be parsed as JSON again. It does not * validate the content. */ -inline simdjson_result<std::string_view> to_json_string(lsx::ondemand::document& x) noexcept; +inline simdjson_result<std::string_view> to_json_string(lasx::ondemand::document& x) noexcept; /** * Create a string-view instance out of a value instance. The string-view instance * contains JSON text that is suitable to be parsed as JSON again. The value must * not have been accessed previously. It does not * validate the content. */ -inline simdjson_result<std::string_view> to_json_string(lsx::ondemand::value& x) noexcept; +inline simdjson_result<std::string_view> to_json_string(lasx::ondemand::value& x) noexcept; /** * Create a string-view instance out of an object instance. The string-view instance * contains JSON text that is suitable to be parsed as JSON again. It does not * validate the content. */ -inline simdjson_result<std::string_view> to_json_string(lsx::ondemand::object& x) noexcept; +inline simdjson_result<std::string_view> to_json_string(lasx::ondemand::object& x) noexcept; /** * Create a string-view instance out of an array instance. The string-view instance * contains JSON text that is suitable to be parsed as JSON again. It does not * validate the content. */ -inline simdjson_result<std::string_view> to_json_string(lsx::ondemand::array& x) noexcept; -inline simdjson_result<std::string_view> to_json_string(simdjson_result<lsx::ondemand::document> x); -inline simdjson_result<std::string_view> to_json_string(simdjson_result<lsx::ondemand::value> x); -inline simdjson_result<std::string_view> to_json_string(simdjson_result<lsx::ondemand::object> x); -inline simdjson_result<std::string_view> to_json_string(simdjson_result<lsx::ondemand::array> x); +inline simdjson_result<std::string_view> to_json_string(lasx::ondemand::array& x) noexcept; +inline simdjson_result<std::string_view> to_json_string(simdjson_result<lasx::ondemand::document> x); +inline simdjson_result<std::string_view> to_json_string(simdjson_result<lasx::ondemand::value> x); +inline simdjson_result<std::string_view> to_json_string(simdjson_result<lasx::ondemand::object> x); +inline simdjson_result<std::string_view> to_json_string(simdjson_result<lasx::ondemand::array> x); #if SIMDJSON_STATIC_REFLECTION /** @@ -129739,10 +162945,10 @@ inline simdjson_result<std::string_view> to_json_string(simdjson_result<lsx::ond * Only available when SIMDJSON_STATIC_REFLECTION is enabled. */ template<typename T> - requires(!std::same_as<T, lsx::ondemand::document> && - !std::same_as<T, lsx::ondemand::value> && - !std::same_as<T, lsx::ondemand::object> && - !std::same_as<T, lsx::ondemand::array>) + requires(!std::same_as<T, lasx::ondemand::document> && + !std::same_as<T, lasx::ondemand::value> && + !std::same_as<T, lasx::ondemand::object> && + !std::same_as<T, lasx::ondemand::array>) inline std::string to_json_string(const T& obj); #endif @@ -129755,7 +162961,7 @@ inline std::string to_json_string(const T& obj); * Credit: @madhur4127 * See https://github.com/simdjson/simdjson/issues/1768 */ -namespace simdjson { namespace lsx { namespace ondemand { +namespace simdjson { namespace lasx { namespace ondemand { /** * Print JSON to an output stream. It does not @@ -129765,9 +162971,9 @@ namespace simdjson { namespace lsx { namespace ondemand { * @param value The element. * @throw if there is an error with the underlying output stream. simdjson itself will not throw. */ -inline std::ostream& operator<<(std::ostream& out, simdjson::lsx::ondemand::value x); +inline std::ostream& operator<<(std::ostream& out, simdjson::lasx::ondemand::value x); #if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::lsx::ondemand::value> x); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::lasx::ondemand::value> x); #endif /** * Print JSON to an output stream. It does not @@ -129777,9 +162983,9 @@ inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<sim * @param value The array. * @throw if there is an error with the underlying output stream. simdjson itself will not throw. */ -inline std::ostream& operator<<(std::ostream& out, simdjson::lsx::ondemand::array value); +inline std::ostream& operator<<(std::ostream& out, simdjson::lasx::ondemand::array value); #if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::lsx::ondemand::array> x); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::lasx::ondemand::array> x); #endif /** * Print JSON to an output stream. It does not @@ -129789,13 +162995,13 @@ inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<sim * @param value The array. * @throw if there is an error with the underlying output stream. simdjson itself will not throw. */ -inline std::ostream& operator<<(std::ostream& out, simdjson::lsx::ondemand::document& value); +inline std::ostream& operator<<(std::ostream& out, simdjson::lasx::ondemand::document& value); #if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::lsx::ondemand::document>&& x); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::lasx::ondemand::document>&& x); #endif -inline std::ostream& operator<<(std::ostream& out, simdjson::lsx::ondemand::document_reference& value); +inline std::ostream& operator<<(std::ostream& out, simdjson::lasx::ondemand::document_reference& value); #if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::lsx::ondemand::document_reference>&& x); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::lasx::ondemand::document_reference>&& x); #endif /** * Print JSON to an output stream. It does not @@ -129805,18 +163011,18 @@ inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<sim * @param value The object. * @throw if there is an error with the underlying output stream. simdjson itself will not throw. */ -inline std::ostream& operator<<(std::ostream& out, simdjson::lsx::ondemand::object value); +inline std::ostream& operator<<(std::ostream& out, simdjson::lasx::ondemand::object value); #if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::lsx::ondemand::object> x); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::lasx::ondemand::object> x); #endif -}}} // namespace simdjson::lsx::ondemand +}}} // namespace simdjson::lasx::ondemand #endif // SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_H -/* end file simdjson/generic/ondemand/serialization.h for lsx */ +/* end file simdjson/generic/ondemand/serialization.h for lasx */ // Deserialization for standard types -/* including simdjson/generic/ondemand/std_deserialize.h for lsx: #include "simdjson/generic/ondemand/std_deserialize.h" */ -/* begin file simdjson/generic/ondemand/std_deserialize.h for lsx */ +/* including simdjson/generic/ondemand/std_deserialize.h for lasx: #include "simdjson/generic/ondemand/std_deserialize.h" */ +/* begin file simdjson/generic/ondemand/std_deserialize.h for lasx */ #if SIMDJSON_SUPPORTS_CONCEPTS #ifndef SIMDJSON_ONDEMAND_DESERIALIZE_H @@ -129915,8 +163121,8 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { static_assert( std::is_default_constructible_v<value_type>, "The specified type inside the container must default constructible."); - lsx::ondemand::array arr; - if constexpr (std::is_same_v<std::remove_cvref_t<ValT>, lsx::ondemand::array>) { + lasx::ondemand::array arr; + if constexpr (std::is_same_v<std::remove_cvref_t<ValT>, lasx::ondemand::array>) { arr = val; } else { SIMDJSON_TRY(val.get_array().get(arr)); @@ -129960,7 +163166,7 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { static_assert( std::is_default_constructible_v<value_type>, "The specified value type inside the container must default constructible."); - lsx::ondemand::object obj; + lasx::ondemand::object obj; SIMDJSON_TRY(val.get_object().get(obj)); for (auto field : obj) { std::string_view key; @@ -129978,7 +163184,7 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { } template <concepts::string_view_keyed_map T> -error_code tag_invoke(deserialize_tag, lsx::ondemand::object &obj, T &out) noexcept { +error_code tag_invoke(deserialize_tag, lasx::ondemand::object &obj, T &out) noexcept { using value_type = typename std::remove_cvref_t<T>::mapped_type; out.clear(); @@ -129986,7 +163192,7 @@ error_code tag_invoke(deserialize_tag, lsx::ondemand::object &obj, T &out) noexc std::string_view key; SIMDJSON_TRY(field.unescaped_key().get(key)); - lsx::ondemand::value value_obj; + lasx::ondemand::value value_obj; SIMDJSON_TRY(field.value().get(value_obj)); value_type this_value; @@ -129997,22 +163203,22 @@ error_code tag_invoke(deserialize_tag, lsx::ondemand::object &obj, T &out) noexc } template <concepts::string_view_keyed_map T> -error_code tag_invoke(deserialize_tag, lsx::ondemand::value &val, T &out) noexcept { - lsx::ondemand::object obj; +error_code tag_invoke(deserialize_tag, lasx::ondemand::value &val, T &out) noexcept { + lasx::ondemand::object obj; SIMDJSON_TRY(val.get_object().get(obj)); return simdjson::deserialize(obj, out); } template <concepts::string_view_keyed_map T> -error_code tag_invoke(deserialize_tag, lsx::ondemand::document &doc, T &out) noexcept { - lsx::ondemand::object obj; +error_code tag_invoke(deserialize_tag, lasx::ondemand::document &doc, T &out) noexcept { + lasx::ondemand::object obj; SIMDJSON_TRY(doc.get_object().get(obj)); return simdjson::deserialize(obj, out); } template <concepts::string_view_keyed_map T> -error_code tag_invoke(deserialize_tag, lsx::ondemand::document_reference &doc, T &out) noexcept { - lsx::ondemand::object obj; +error_code tag_invoke(deserialize_tag, lasx::ondemand::document_reference &doc, T &out) noexcept { + lasx::ondemand::object obj; SIMDJSON_TRY(doc.get_object().get(obj)); return simdjson::deserialize(obj, out); } @@ -130089,8 +163295,8 @@ constexpr bool user_defined_type = (std::is_class_v<T> template <typename T, typename ValT> requires(user_defined_type<T> && std::is_class_v<T>) error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept { - lsx::ondemand::object obj; - if constexpr (std::is_same_v<std::remove_cvref_t<ValT>, lsx::ondemand::object>) { + lasx::ondemand::object obj; + if constexpr (std::is_same_v<std::remove_cvref_t<ValT>, lasx::ondemand::object>) { obj = val; } else { SIMDJSON_TRY(val.get_object().get(obj)); @@ -130399,11 +163605,11 @@ error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr<int> &out) noe #endif // SIMDJSON_ONDEMAND_DESERIALIZE_H #endif // SIMDJSON_SUPPORTS_CONCEPTS -/* end file simdjson/generic/ondemand/std_deserialize.h for lsx */ +/* end file simdjson/generic/ondemand/std_deserialize.h for lasx */ // Inline definitions -/* including simdjson/generic/ondemand/array-inl.h for lsx: #include "simdjson/generic/ondemand/array-inl.h" */ -/* begin file simdjson/generic/ondemand/array-inl.h for lsx */ +/* including simdjson/generic/ondemand/array-inl.h for lasx: #include "simdjson/generic/ondemand/array-inl.h" */ +/* begin file simdjson/generic/ondemand/array-inl.h for lasx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -130418,7 +163624,7 @@ error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr<int> &out) noe /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace ondemand { // @@ -130647,68 +163853,68 @@ simdjson_inline simdjson_result<value> array::at(size_t index) noexcept { } } // namespace ondemand -} // namespace lsx +} // namespace lasx } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<lsx::ondemand::array>::simdjson_result( - lsx::ondemand::array &&value +simdjson_inline simdjson_result<lasx::ondemand::array>::simdjson_result( + lasx::ondemand::array &&value ) noexcept - : implementation_simdjson_result_base<lsx::ondemand::array>( - std::forward<lsx::ondemand::array>(value) + : implementation_simdjson_result_base<lasx::ondemand::array>( + std::forward<lasx::ondemand::array>(value) ) { } -simdjson_inline simdjson_result<lsx::ondemand::array>::simdjson_result( +simdjson_inline simdjson_result<lasx::ondemand::array>::simdjson_result( error_code error ) noexcept - : implementation_simdjson_result_base<lsx::ondemand::array>(error) + : implementation_simdjson_result_base<lasx::ondemand::array>(error) { } -simdjson_inline simdjson_result<lsx::ondemand::array_iterator> simdjson_result<lsx::ondemand::array>::begin() noexcept { +simdjson_inline simdjson_result<lasx::ondemand::array_iterator> simdjson_result<lasx::ondemand::array>::begin() noexcept { if (error()) { return error(); } return first.begin(); } -simdjson_inline simdjson_result<lsx::ondemand::array_iterator> simdjson_result<lsx::ondemand::array>::end() noexcept { +simdjson_inline simdjson_result<lasx::ondemand::array_iterator> simdjson_result<lasx::ondemand::array>::end() noexcept { if (error()) { return error(); } return first.end(); } -simdjson_inline simdjson_result<size_t> simdjson_result<lsx::ondemand::array>::count_elements() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<lasx::ondemand::array>::count_elements() & noexcept { if (error()) { return error(); } return first.count_elements(); } -simdjson_inline simdjson_result<bool> simdjson_result<lsx::ondemand::array>::is_empty() & noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<lasx::ondemand::array>::is_empty() & noexcept { if (error()) { return error(); } return first.is_empty(); } -simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::array>::at(size_t index) noexcept { +simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::array>::at(size_t index) noexcept { if (error()) { return error(); } return first.at(index); } -simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::array>::at_pointer(std::string_view json_pointer) noexcept { +simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::array>::at_pointer(std::string_view json_pointer) noexcept { if (error()) { return error(); } return first.at_pointer(json_pointer); } -simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::array>::at_path(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::array>::at_path(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path(json_path); } -simdjson_inline simdjson_result<std::vector<lsx::ondemand::value>> simdjson_result<lsx::ondemand::array>::at_path_with_wildcard(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<std::vector<lasx::ondemand::value>> simdjson_result<lasx::ondemand::array>::at_path_with_wildcard(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path_with_wildcard(json_path); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<lsx::ondemand::array>::raw_json() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<lasx::ondemand::array>::raw_json() noexcept { if (error()) { return error(); } return first.raw_json(); } } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_INL_H -/* end file simdjson/generic/ondemand/array-inl.h for lsx */ -/* including simdjson/generic/ondemand/array_iterator-inl.h for lsx: #include "simdjson/generic/ondemand/array_iterator-inl.h" */ -/* begin file simdjson/generic/ondemand/array_iterator-inl.h for lsx */ +/* end file simdjson/generic/ondemand/array-inl.h for lasx */ +/* including simdjson/generic/ondemand/array_iterator-inl.h for lasx: #include "simdjson/generic/ondemand/array_iterator-inl.h" */ +/* begin file simdjson/generic/ondemand/array_iterator-inl.h for lasx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -130720,7 +163926,7 @@ simdjson_inline simdjson_result<std::string_view> simdjson_result<lsx::ondemand /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace ondemand { simdjson_inline array_iterator::array_iterator(const value_iterator &_iter) noexcept @@ -130728,6 +163934,10 @@ simdjson_inline array_iterator::array_iterator(const value_iterator &_iter) noex {} simdjson_inline simdjson_result<value> array_iterator::operator*() noexcept { +#if SIMDJSON_DEVELOPMENT_CHECKS + SIMDJSON_ASSUME(!has_been_referenced); + has_been_referenced = true; +#endif if (iter.error()) { iter.abandon(); return iter.error(); } return value(iter.child()); } @@ -130738,6 +163948,9 @@ simdjson_inline bool array_iterator::operator!=(const array_iterator &) const no return iter.is_open(); } simdjson_inline array_iterator &array_iterator::operator++() noexcept { +#if SIMDJSON_DEVELOPMENT_CHECKS + has_been_referenced = false; +#endif error_code error; // PERF NOTE this is a safety rail ... users should exit loops as soon as they receive an error, so we'll never get here. // However, it does not seem to make a perf difference, so we add it out of an abundance of caution. @@ -130751,50 +163964,50 @@ simdjson_inline bool array_iterator::at_end() const noexcept { return iter.at_end(); } } // namespace ondemand -} // namespace lsx +} // namespace lasx } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<lsx::ondemand::array_iterator>::simdjson_result( - lsx::ondemand::array_iterator &&value +simdjson_inline simdjson_result<lasx::ondemand::array_iterator>::simdjson_result( + lasx::ondemand::array_iterator &&value ) noexcept - : lsx::implementation_simdjson_result_base<lsx::ondemand::array_iterator>(std::forward<lsx::ondemand::array_iterator>(value)) + : lasx::implementation_simdjson_result_base<lasx::ondemand::array_iterator>(std::forward<lasx::ondemand::array_iterator>(value)) { first.iter.assert_is_valid(); } -simdjson_inline simdjson_result<lsx::ondemand::array_iterator>::simdjson_result(error_code error) noexcept - : lsx::implementation_simdjson_result_base<lsx::ondemand::array_iterator>({}, error) +simdjson_inline simdjson_result<lasx::ondemand::array_iterator>::simdjson_result(error_code error) noexcept + : lasx::implementation_simdjson_result_base<lasx::ondemand::array_iterator>({}, error) { } -simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::array_iterator>::operator*() noexcept { +simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::array_iterator>::operator*() noexcept { if (error()) { return error(); } return *first; } -simdjson_inline bool simdjson_result<lsx::ondemand::array_iterator>::operator==(const simdjson_result<lsx::ondemand::array_iterator> &other) const noexcept { +simdjson_inline bool simdjson_result<lasx::ondemand::array_iterator>::operator==(const simdjson_result<lasx::ondemand::array_iterator> &other) const noexcept { if (!first.iter.is_valid()) { return !error(); } return first == other.first; } -simdjson_inline bool simdjson_result<lsx::ondemand::array_iterator>::operator!=(const simdjson_result<lsx::ondemand::array_iterator> &other) const noexcept { +simdjson_inline bool simdjson_result<lasx::ondemand::array_iterator>::operator!=(const simdjson_result<lasx::ondemand::array_iterator> &other) const noexcept { if (!first.iter.is_valid()) { return error(); } return first != other.first; } -simdjson_inline simdjson_result<lsx::ondemand::array_iterator> &simdjson_result<lsx::ondemand::array_iterator>::operator++() noexcept { +simdjson_inline simdjson_result<lasx::ondemand::array_iterator> &simdjson_result<lasx::ondemand::array_iterator>::operator++() noexcept { // Clear the error if there is one, so we don't yield it twice if (error()) { second = SUCCESS; return *this; } ++(first); return *this; } -simdjson_inline bool simdjson_result<lsx::ondemand::array_iterator>::at_end() const noexcept { +simdjson_inline bool simdjson_result<lasx::ondemand::array_iterator>::at_end() const noexcept { return !first.iter.is_valid() || first.at_end(); } } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_INL_H -/* end file simdjson/generic/ondemand/array_iterator-inl.h for lsx */ -/* including simdjson/generic/ondemand/value-inl.h for lsx: #include "simdjson/generic/ondemand/value-inl.h" */ -/* begin file simdjson/generic/ondemand/value-inl.h for lsx */ +/* end file simdjson/generic/ondemand/array_iterator-inl.h for lasx */ +/* including simdjson/generic/ondemand/value-inl.h for lasx: #include "simdjson/generic/ondemand/value-inl.h" */ +/* begin file simdjson/generic/ondemand/value-inl.h for lasx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -130810,7 +164023,7 @@ simdjson_inline bool simdjson_result<lsx::ondemand::array_iterator>::at_end() co /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace ondemand { simdjson_inline value::value(const value_iterator &_iter) noexcept @@ -131107,240 +164320,240 @@ inline simdjson_result<std::vector<value>> value::at_path_with_wildcard(std::str } } // namespace ondemand -} // namespace lsx +} // namespace lasx } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<lsx::ondemand::value>::simdjson_result( - lsx::ondemand::value &&value +simdjson_inline simdjson_result<lasx::ondemand::value>::simdjson_result( + lasx::ondemand::value &&value ) noexcept : - implementation_simdjson_result_base<lsx::ondemand::value>( - std::forward<lsx::ondemand::value>(value) + implementation_simdjson_result_base<lasx::ondemand::value>( + std::forward<lasx::ondemand::value>(value) ) { } -simdjson_inline simdjson_result<lsx::ondemand::value>::simdjson_result( +simdjson_inline simdjson_result<lasx::ondemand::value>::simdjson_result( error_code error ) noexcept : - implementation_simdjson_result_base<lsx::ondemand::value>(error) + implementation_simdjson_result_base<lasx::ondemand::value>(error) { } -simdjson_inline simdjson_result<size_t> simdjson_result<lsx::ondemand::value>::count_elements() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<lasx::ondemand::value>::count_elements() & noexcept { if (error()) { return error(); } return first.count_elements(); } -simdjson_inline simdjson_result<size_t> simdjson_result<lsx::ondemand::value>::count_fields() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<lasx::ondemand::value>::count_fields() & noexcept { if (error()) { return error(); } return first.count_fields(); } -simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::value>::at(size_t index) noexcept { +simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::value>::at(size_t index) noexcept { if (error()) { return error(); } return first.at(index); } -simdjson_inline simdjson_result<lsx::ondemand::array_iterator> simdjson_result<lsx::ondemand::value>::begin() & noexcept { +simdjson_inline simdjson_result<lasx::ondemand::array_iterator> simdjson_result<lasx::ondemand::value>::begin() & noexcept { if (error()) { return error(); } return first.begin(); } -simdjson_inline simdjson_result<lsx::ondemand::array_iterator> simdjson_result<lsx::ondemand::value>::end() & noexcept { +simdjson_inline simdjson_result<lasx::ondemand::array_iterator> simdjson_result<lasx::ondemand::value>::end() & noexcept { if (error()) { return error(); } return {}; } -simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::value>::find_field(std::string_view key) noexcept { +simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::value>::find_field(std::string_view key) noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::value>::find_field(const char *key) noexcept { +simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::value>::find_field(const char *key) noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::value>::find_field_unordered(std::string_view key) noexcept { +simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::value>::find_field_unordered(std::string_view key) noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::value>::find_field_unordered(const char *key) noexcept { +simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::value>::find_field_unordered(const char *key) noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::value>::operator[](std::string_view key) noexcept { +simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::value>::operator[](std::string_view key) noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::value>::operator[](const char *key) noexcept { +simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::value>::operator[](const char *key) noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<lsx::ondemand::array> simdjson_result<lsx::ondemand::value>::get_array() noexcept { +simdjson_inline simdjson_result<lasx::ondemand::array> simdjson_result<lasx::ondemand::value>::get_array() noexcept { if (error()) { return error(); } return first.get_array(); } -simdjson_inline simdjson_result<lsx::ondemand::object> simdjson_result<lsx::ondemand::value>::get_object() noexcept { +simdjson_inline simdjson_result<lasx::ondemand::object> simdjson_result<lasx::ondemand::value>::get_object() noexcept { if (error()) { return error(); } return first.get_object(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<lsx::ondemand::value>::get_uint64() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<lasx::ondemand::value>::get_uint64() noexcept { if (error()) { return error(); } return first.get_uint64(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<lsx::ondemand::value>::get_uint64_in_string() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<lasx::ondemand::value>::get_uint64_in_string() noexcept { if (error()) { return error(); } return first.get_uint64_in_string(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<lsx::ondemand::value>::get_int64() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<lasx::ondemand::value>::get_int64() noexcept { if (error()) { return error(); } return first.get_int64(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<lsx::ondemand::value>::get_int64_in_string() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<lasx::ondemand::value>::get_int64_in_string() noexcept { if (error()) { return error(); } return first.get_int64_in_string(); } -simdjson_inline simdjson_result<double> simdjson_result<lsx::ondemand::value>::get_double() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<lasx::ondemand::value>::get_double() noexcept { if (error()) { return error(); } return first.get_double(); } -simdjson_inline simdjson_result<double> simdjson_result<lsx::ondemand::value>::get_double_in_string() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<lasx::ondemand::value>::get_double_in_string() noexcept { if (error()) { return error(); } return first.get_double_in_string(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<lsx::ondemand::value>::get_string(bool allow_replacement) noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<lasx::ondemand::value>::get_string(bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(allow_replacement); } template <typename string_type> -simdjson_inline error_code simdjson_result<lsx::ondemand::value>::get_string(string_type& receiver, bool allow_replacement) noexcept { +simdjson_inline error_code simdjson_result<lasx::ondemand::value>::get_string(string_type& receiver, bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(receiver, allow_replacement); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<lsx::ondemand::value>::get_wobbly_string() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<lasx::ondemand::value>::get_wobbly_string() noexcept { if (error()) { return error(); } return first.get_wobbly_string(); } -simdjson_inline simdjson_result<lsx::ondemand::raw_json_string> simdjson_result<lsx::ondemand::value>::get_raw_json_string() noexcept { +simdjson_inline simdjson_result<lasx::ondemand::raw_json_string> simdjson_result<lasx::ondemand::value>::get_raw_json_string() noexcept { if (error()) { return error(); } return first.get_raw_json_string(); } -simdjson_inline simdjson_result<bool> simdjson_result<lsx::ondemand::value>::get_bool() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<lasx::ondemand::value>::get_bool() noexcept { if (error()) { return error(); } return first.get_bool(); } -simdjson_inline simdjson_result<bool> simdjson_result<lsx::ondemand::value>::is_null() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<lasx::ondemand::value>::is_null() noexcept { if (error()) { return error(); } return first.is_null(); } -template<> simdjson_inline error_code simdjson_result<lsx::ondemand::value>::get<lsx::ondemand::value>(lsx::ondemand::value &out) noexcept { +template<> simdjson_inline error_code simdjson_result<lasx::ondemand::value>::get<lasx::ondemand::value>(lasx::ondemand::value &out) noexcept { if (error()) { return error(); } out = first; return SUCCESS; } -template<typename T> simdjson_inline simdjson_result<T> simdjson_result<lsx::ondemand::value>::get() noexcept { +template<typename T> simdjson_inline simdjson_result<T> simdjson_result<lasx::ondemand::value>::get() noexcept { if (error()) { return error(); } return first.get<T>(); } -template<typename T> simdjson_inline error_code simdjson_result<lsx::ondemand::value>::get(T &out) noexcept { +template<typename T> simdjson_inline error_code simdjson_result<lasx::ondemand::value>::get(T &out) noexcept { if (error()) { return error(); } return first.get<T>(out); } -template<> simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::value>::get<lsx::ondemand::value>() noexcept { +template<> simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::value>::get<lasx::ondemand::value>() noexcept { if (error()) { return error(); } return std::move(first); } -simdjson_inline simdjson_result<lsx::ondemand::json_type> simdjson_result<lsx::ondemand::value>::type() noexcept { +simdjson_inline simdjson_result<lasx::ondemand::json_type> simdjson_result<lasx::ondemand::value>::type() noexcept { if (error()) { return error(); } return first.type(); } -simdjson_inline simdjson_result<bool> simdjson_result<lsx::ondemand::value>::is_scalar() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<lasx::ondemand::value>::is_scalar() noexcept { if (error()) { return error(); } return first.is_scalar(); } -simdjson_inline simdjson_result<bool> simdjson_result<lsx::ondemand::value>::is_string() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<lasx::ondemand::value>::is_string() noexcept { if (error()) { return error(); } return first.is_string(); } -simdjson_inline simdjson_result<bool> simdjson_result<lsx::ondemand::value>::is_negative() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<lasx::ondemand::value>::is_negative() noexcept { if (error()) { return error(); } return first.is_negative(); } -simdjson_inline simdjson_result<bool> simdjson_result<lsx::ondemand::value>::is_integer() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<lasx::ondemand::value>::is_integer() noexcept { if (error()) { return error(); } return first.is_integer(); } -simdjson_inline simdjson_result<lsx::number_type> simdjson_result<lsx::ondemand::value>::get_number_type() noexcept { +simdjson_inline simdjson_result<lasx::number_type> simdjson_result<lasx::ondemand::value>::get_number_type() noexcept { if (error()) { return error(); } return first.get_number_type(); } -simdjson_inline simdjson_result<lsx::ondemand::number> simdjson_result<lsx::ondemand::value>::get_number() noexcept { +simdjson_inline simdjson_result<lasx::ondemand::number> simdjson_result<lasx::ondemand::value>::get_number() noexcept { if (error()) { return error(); } return first.get_number(); } #if SIMDJSON_EXCEPTIONS template <class T> -simdjson_inline simdjson_result<lsx::ondemand::value>::operator T() noexcept(false) { +simdjson_inline simdjson_result<lasx::ondemand::value>::operator T() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first.get<T>(); } -simdjson_inline simdjson_result<lsx::ondemand::value>::operator lsx::ondemand::array() noexcept(false) { +simdjson_inline simdjson_result<lasx::ondemand::value>::operator lasx::ondemand::array() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lsx::ondemand::value>::operator lsx::ondemand::object() noexcept(false) { +simdjson_inline simdjson_result<lasx::ondemand::value>::operator lasx::ondemand::object() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lsx::ondemand::value>::operator uint64_t() noexcept(false) { +simdjson_inline simdjson_result<lasx::ondemand::value>::operator uint64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lsx::ondemand::value>::operator int64_t() noexcept(false) { +simdjson_inline simdjson_result<lasx::ondemand::value>::operator int64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lsx::ondemand::value>::operator double() noexcept(false) { +simdjson_inline simdjson_result<lasx::ondemand::value>::operator double() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lsx::ondemand::value>::operator std::string_view() noexcept(false) { +simdjson_inline simdjson_result<lasx::ondemand::value>::operator std::string_view() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lsx::ondemand::value>::operator lsx::ondemand::raw_json_string() noexcept(false) { +simdjson_inline simdjson_result<lasx::ondemand::value>::operator lasx::ondemand::raw_json_string() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lsx::ondemand::value>::operator bool() noexcept(false) { +simdjson_inline simdjson_result<lasx::ondemand::value>::operator bool() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } #endif -simdjson_inline simdjson_result<std::string_view> simdjson_result<lsx::ondemand::value>::raw_json_token() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<lasx::ondemand::value>::raw_json_token() noexcept { if (error()) { return error(); } return first.raw_json_token(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<lsx::ondemand::value>::raw_json() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<lasx::ondemand::value>::raw_json() noexcept { if (error()) { return error(); } return first.raw_json(); } -simdjson_inline simdjson_result<const char *> simdjson_result<lsx::ondemand::value>::current_location() noexcept { +simdjson_inline simdjson_result<const char *> simdjson_result<lasx::ondemand::value>::current_location() noexcept { if (error()) { return error(); } return first.current_location(); } -simdjson_inline simdjson_result<int32_t> simdjson_result<lsx::ondemand::value>::current_depth() const noexcept { +simdjson_inline simdjson_result<int32_t> simdjson_result<lasx::ondemand::value>::current_depth() const noexcept { if (error()) { return error(); } return first.current_depth(); } -simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::value>::at_pointer( +simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::value>::at_pointer( std::string_view json_pointer) noexcept { if (error()) { return error(); @@ -131348,7 +164561,7 @@ simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondem return first.at_pointer(json_pointer); } -simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::value>::at_path( +simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::value>::at_path( std::string_view json_path) noexcept { if (error()) { return error(); @@ -131356,7 +164569,7 @@ simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondem return first.at_path(json_path); } -inline simdjson_result<std::vector<lsx::ondemand::value>> simdjson_result<lsx::ondemand::value>::at_path_with_wildcard( +inline simdjson_result<std::vector<lasx::ondemand::value>> simdjson_result<lasx::ondemand::value>::at_path_with_wildcard( std::string_view json_path) noexcept { if (error()) { return error(); @@ -131367,9 +164580,9 @@ inline simdjson_result<std::vector<lsx::ondemand::value>> simdjson_result<lsx::o } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_INL_H -/* end file simdjson/generic/ondemand/value-inl.h for lsx */ -/* including simdjson/generic/ondemand/document-inl.h for lsx: #include "simdjson/generic/ondemand/document-inl.h" */ -/* begin file simdjson/generic/ondemand/document-inl.h for lsx */ +/* end file simdjson/generic/ondemand/value-inl.h for lasx */ +/* including simdjson/generic/ondemand/document-inl.h for lasx: #include "simdjson/generic/ondemand/document-inl.h" */ +/* begin file simdjson/generic/ondemand/document-inl.h for lasx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -131389,7 +164602,7 @@ inline simdjson_result<std::vector<lsx::ondemand::value>> simdjson_result<lsx::o /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace ondemand { simdjson_inline document::document(ondemand::json_iterator &&_iter) noexcept @@ -131783,283 +164996,283 @@ simdjson_warn_unused simdjson_inline error_code document::extract_into(T& out) & #endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION } // namespace ondemand -} // namespace lsx +} // namespace lasx } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<lsx::ondemand::document>::simdjson_result( - lsx::ondemand::document &&value +simdjson_inline simdjson_result<lasx::ondemand::document>::simdjson_result( + lasx::ondemand::document &&value ) noexcept : - implementation_simdjson_result_base<lsx::ondemand::document>( - std::forward<lsx::ondemand::document>(value) + implementation_simdjson_result_base<lasx::ondemand::document>( + std::forward<lasx::ondemand::document>(value) ) { } -simdjson_inline simdjson_result<lsx::ondemand::document>::simdjson_result( +simdjson_inline simdjson_result<lasx::ondemand::document>::simdjson_result( error_code error ) noexcept : - implementation_simdjson_result_base<lsx::ondemand::document>( + implementation_simdjson_result_base<lasx::ondemand::document>( error ) { } -simdjson_inline simdjson_result<size_t> simdjson_result<lsx::ondemand::document>::count_elements() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<lasx::ondemand::document>::count_elements() & noexcept { if (error()) { return error(); } return first.count_elements(); } -simdjson_inline simdjson_result<size_t> simdjson_result<lsx::ondemand::document>::count_fields() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<lasx::ondemand::document>::count_fields() & noexcept { if (error()) { return error(); } return first.count_fields(); } -simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::document>::at(size_t index) & noexcept { +simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::document>::at(size_t index) & noexcept { if (error()) { return error(); } return first.at(index); } -simdjson_inline error_code simdjson_result<lsx::ondemand::document>::rewind() noexcept { +simdjson_inline error_code simdjson_result<lasx::ondemand::document>::rewind() noexcept { if (error()) { return error(); } first.rewind(); return SUCCESS; } -simdjson_inline simdjson_result<lsx::ondemand::array_iterator> simdjson_result<lsx::ondemand::document>::begin() & noexcept { +simdjson_inline simdjson_result<lasx::ondemand::array_iterator> simdjson_result<lasx::ondemand::document>::begin() & noexcept { if (error()) { return error(); } return first.begin(); } -simdjson_inline simdjson_result<lsx::ondemand::array_iterator> simdjson_result<lsx::ondemand::document>::end() & noexcept { +simdjson_inline simdjson_result<lasx::ondemand::array_iterator> simdjson_result<lasx::ondemand::document>::end() & noexcept { return {}; } -simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::document>::find_field_unordered(std::string_view key) & noexcept { +simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::document>::find_field_unordered(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::document>::find_field_unordered(const char *key) & noexcept { +simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::document>::find_field_unordered(const char *key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::document>::operator[](std::string_view key) & noexcept { +simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::document>::operator[](std::string_view key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::document>::operator[](const char *key) & noexcept { +simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::document>::operator[](const char *key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::document>::find_field(std::string_view key) & noexcept { +simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::document>::find_field(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::document>::find_field(const char *key) & noexcept { +simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::document>::find_field(const char *key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<lsx::ondemand::array> simdjson_result<lsx::ondemand::document>::get_array() & noexcept { +simdjson_inline simdjson_result<lasx::ondemand::array> simdjson_result<lasx::ondemand::document>::get_array() & noexcept { if (error()) { return error(); } return first.get_array(); } -simdjson_inline simdjson_result<lsx::ondemand::object> simdjson_result<lsx::ondemand::document>::get_object() & noexcept { +simdjson_inline simdjson_result<lasx::ondemand::object> simdjson_result<lasx::ondemand::document>::get_object() & noexcept { if (error()) { return error(); } return first.get_object(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<lsx::ondemand::document>::get_uint64() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<lasx::ondemand::document>::get_uint64() noexcept { if (error()) { return error(); } return first.get_uint64(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<lsx::ondemand::document>::get_uint64_in_string() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<lasx::ondemand::document>::get_uint64_in_string() noexcept { if (error()) { return error(); } return first.get_uint64_in_string(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<lsx::ondemand::document>::get_int64() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<lasx::ondemand::document>::get_int64() noexcept { if (error()) { return error(); } return first.get_int64(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<lsx::ondemand::document>::get_int64_in_string() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<lasx::ondemand::document>::get_int64_in_string() noexcept { if (error()) { return error(); } return first.get_int64_in_string(); } -simdjson_inline simdjson_result<double> simdjson_result<lsx::ondemand::document>::get_double() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<lasx::ondemand::document>::get_double() noexcept { if (error()) { return error(); } return first.get_double(); } -simdjson_inline simdjson_result<double> simdjson_result<lsx::ondemand::document>::get_double_in_string() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<lasx::ondemand::document>::get_double_in_string() noexcept { if (error()) { return error(); } return first.get_double_in_string(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<lsx::ondemand::document>::get_string(bool allow_replacement) noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<lasx::ondemand::document>::get_string(bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(allow_replacement); } template <typename string_type> -simdjson_warn_unused simdjson_inline error_code simdjson_result<lsx::ondemand::document>::get_string(string_type& receiver, bool allow_replacement) noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<lasx::ondemand::document>::get_string(string_type& receiver, bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(receiver, allow_replacement); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<lsx::ondemand::document>::get_wobbly_string() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<lasx::ondemand::document>::get_wobbly_string() noexcept { if (error()) { return error(); } return first.get_wobbly_string(); } -simdjson_inline simdjson_result<lsx::ondemand::raw_json_string> simdjson_result<lsx::ondemand::document>::get_raw_json_string() noexcept { +simdjson_inline simdjson_result<lasx::ondemand::raw_json_string> simdjson_result<lasx::ondemand::document>::get_raw_json_string() noexcept { if (error()) { return error(); } return first.get_raw_json_string(); } -simdjson_inline simdjson_result<bool> simdjson_result<lsx::ondemand::document>::get_bool() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<lasx::ondemand::document>::get_bool() noexcept { if (error()) { return error(); } return first.get_bool(); } -simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::document>::get_value() noexcept { +simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::document>::get_value() noexcept { if (error()) { return error(); } return first.get_value(); } -simdjson_inline simdjson_result<bool> simdjson_result<lsx::ondemand::document>::is_null() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<lasx::ondemand::document>::is_null() noexcept { if (error()) { return error(); } return first.is_null(); } template<typename T> -simdjson_inline simdjson_result<T> simdjson_result<lsx::ondemand::document>::get() & noexcept { +simdjson_inline simdjson_result<T> simdjson_result<lasx::ondemand::document>::get() & noexcept { if (error()) { return error(); } return first.get<T>(); } template<typename T> -simdjson_deprecated simdjson_inline simdjson_result<T> simdjson_result<lsx::ondemand::document>::get() && noexcept { +simdjson_deprecated simdjson_inline simdjson_result<T> simdjson_result<lasx::ondemand::document>::get() && noexcept { if (error()) { return error(); } - return std::forward<lsx::ondemand::document>(first).get<T>(); + return std::forward<lasx::ondemand::document>(first).get<T>(); } template<typename T> -simdjson_warn_unused simdjson_inline error_code simdjson_result<lsx::ondemand::document>::get(T &out) & noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<lasx::ondemand::document>::get(T &out) & noexcept { if (error()) { return error(); } return first.get<T>(out); } template<typename T> -simdjson_warn_unused simdjson_inline error_code simdjson_result<lsx::ondemand::document>::get(T &out) && noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<lasx::ondemand::document>::get(T &out) && noexcept { if (error()) { return error(); } - return std::forward<lsx::ondemand::document>(first).get<T>(out); + return std::forward<lasx::ondemand::document>(first).get<T>(out); } -template<> simdjson_inline simdjson_result<lsx::ondemand::document> simdjson_result<lsx::ondemand::document>::get<lsx::ondemand::document>() & noexcept = delete; -template<> simdjson_deprecated simdjson_inline simdjson_result<lsx::ondemand::document> simdjson_result<lsx::ondemand::document>::get<lsx::ondemand::document>() && noexcept { +template<> simdjson_inline simdjson_result<lasx::ondemand::document> simdjson_result<lasx::ondemand::document>::get<lasx::ondemand::document>() & noexcept = delete; +template<> simdjson_deprecated simdjson_inline simdjson_result<lasx::ondemand::document> simdjson_result<lasx::ondemand::document>::get<lasx::ondemand::document>() && noexcept { if (error()) { return error(); } - return std::forward<lsx::ondemand::document>(first); + return std::forward<lasx::ondemand::document>(first); } -template<> simdjson_warn_unused simdjson_inline error_code simdjson_result<lsx::ondemand::document>::get<lsx::ondemand::document>(lsx::ondemand::document &out) & noexcept = delete; -template<> simdjson_warn_unused simdjson_inline error_code simdjson_result<lsx::ondemand::document>::get<lsx::ondemand::document>(lsx::ondemand::document &out) && noexcept { +template<> simdjson_warn_unused simdjson_inline error_code simdjson_result<lasx::ondemand::document>::get<lasx::ondemand::document>(lasx::ondemand::document &out) & noexcept = delete; +template<> simdjson_warn_unused simdjson_inline error_code simdjson_result<lasx::ondemand::document>::get<lasx::ondemand::document>(lasx::ondemand::document &out) && noexcept { if (error()) { return error(); } - out = std::forward<lsx::ondemand::document>(first); + out = std::forward<lasx::ondemand::document>(first); return SUCCESS; } -simdjson_inline simdjson_result<lsx::ondemand::json_type> simdjson_result<lsx::ondemand::document>::type() noexcept { +simdjson_inline simdjson_result<lasx::ondemand::json_type> simdjson_result<lasx::ondemand::document>::type() noexcept { if (error()) { return error(); } return first.type(); } -simdjson_inline simdjson_result<bool> simdjson_result<lsx::ondemand::document>::is_scalar() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<lasx::ondemand::document>::is_scalar() noexcept { if (error()) { return error(); } return first.is_scalar(); } -simdjson_inline simdjson_result<bool> simdjson_result<lsx::ondemand::document>::is_string() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<lasx::ondemand::document>::is_string() noexcept { if (error()) { return error(); } return first.is_string(); } -simdjson_inline bool simdjson_result<lsx::ondemand::document>::is_negative() noexcept { +simdjson_inline bool simdjson_result<lasx::ondemand::document>::is_negative() noexcept { if (error()) { return error(); } return first.is_negative(); } -simdjson_inline simdjson_result<bool> simdjson_result<lsx::ondemand::document>::is_integer() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<lasx::ondemand::document>::is_integer() noexcept { if (error()) { return error(); } return first.is_integer(); } -simdjson_inline simdjson_result<lsx::number_type> simdjson_result<lsx::ondemand::document>::get_number_type() noexcept { +simdjson_inline simdjson_result<lasx::number_type> simdjson_result<lasx::ondemand::document>::get_number_type() noexcept { if (error()) { return error(); } return first.get_number_type(); } -simdjson_inline simdjson_result<lsx::ondemand::number> simdjson_result<lsx::ondemand::document>::get_number() noexcept { +simdjson_inline simdjson_result<lasx::ondemand::number> simdjson_result<lasx::ondemand::document>::get_number() noexcept { if (error()) { return error(); } return first.get_number(); } #if SIMDJSON_EXCEPTIONS -template <class T, typename std::enable_if<std::is_same<T, lsx::ondemand::document>::value == false>::type> -simdjson_inline simdjson_result<lsx::ondemand::document>::operator T() noexcept(false) { +template <class T, typename std::enable_if<std::is_same<T, lasx::ondemand::document>::value == false>::type> +simdjson_inline simdjson_result<lasx::ondemand::document>::operator T() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lsx::ondemand::document>::operator lsx::ondemand::array() & noexcept(false) { +simdjson_inline simdjson_result<lasx::ondemand::document>::operator lasx::ondemand::array() & noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lsx::ondemand::document>::operator lsx::ondemand::object() & noexcept(false) { +simdjson_inline simdjson_result<lasx::ondemand::document>::operator lasx::ondemand::object() & noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lsx::ondemand::document>::operator uint64_t() noexcept(false) { +simdjson_inline simdjson_result<lasx::ondemand::document>::operator uint64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lsx::ondemand::document>::operator int64_t() noexcept(false) { +simdjson_inline simdjson_result<lasx::ondemand::document>::operator int64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lsx::ondemand::document>::operator double() noexcept(false) { +simdjson_inline simdjson_result<lasx::ondemand::document>::operator double() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lsx::ondemand::document>::operator std::string_view() noexcept(false) { +simdjson_inline simdjson_result<lasx::ondemand::document>::operator std::string_view() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lsx::ondemand::document>::operator lsx::ondemand::raw_json_string() noexcept(false) { +simdjson_inline simdjson_result<lasx::ondemand::document>::operator lasx::ondemand::raw_json_string() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lsx::ondemand::document>::operator bool() noexcept(false) { +simdjson_inline simdjson_result<lasx::ondemand::document>::operator bool() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lsx::ondemand::document>::operator lsx::ondemand::value() noexcept(false) { +simdjson_inline simdjson_result<lasx::ondemand::document>::operator lasx::ondemand::value() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } #endif -simdjson_inline simdjson_result<const char *> simdjson_result<lsx::ondemand::document>::current_location() noexcept { +simdjson_inline simdjson_result<const char *> simdjson_result<lasx::ondemand::document>::current_location() noexcept { if (error()) { return error(); } return first.current_location(); } -simdjson_inline bool simdjson_result<lsx::ondemand::document>::at_end() const noexcept { +simdjson_inline bool simdjson_result<lasx::ondemand::document>::at_end() const noexcept { if (error()) { return error(); } return first.at_end(); } -simdjson_inline int32_t simdjson_result<lsx::ondemand::document>::current_depth() const noexcept { +simdjson_inline int32_t simdjson_result<lasx::ondemand::document>::current_depth() const noexcept { if (error()) { return error(); } return first.current_depth(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<lsx::ondemand::document>::raw_json_token() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<lasx::ondemand::document>::raw_json_token() noexcept { if (error()) { return error(); } return first.raw_json_token(); } -simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::document>::at_pointer(std::string_view json_pointer) noexcept { +simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::document>::at_pointer(std::string_view json_pointer) noexcept { if (error()) { return error(); } return first.at_pointer(json_pointer); } -simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::document>::at_path(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::document>::at_path(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path(json_path); } -simdjson_inline simdjson_result<std::vector<lsx::ondemand::value>> simdjson_result<lsx::ondemand::document>::at_path_with_wildcard(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<std::vector<lasx::ondemand::value>> simdjson_result<lasx::ondemand::document>::at_path_with_wildcard(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path_with_wildcard(json_path); } @@ -132067,7 +165280,7 @@ simdjson_inline simdjson_result<std::vector<lsx::ondemand::value>> simdjson_resu #if SIMDJSON_STATIC_REFLECTION template<constevalutil::fixed_string... FieldNames, typename T> requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) -simdjson_warn_unused simdjson_inline error_code simdjson_result<lsx::ondemand::document>::extract_into(T& out) & noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<lasx::ondemand::document>::extract_into(T& out) & noexcept { if (error()) { return error(); } return first.extract_into<FieldNames...>(out); } @@ -132077,7 +165290,7 @@ simdjson_warn_unused simdjson_inline error_code simdjson_result<lsx::ondemand::d namespace simdjson { -namespace lsx { +namespace lasx { namespace ondemand { simdjson_inline document_reference::document_reference() noexcept : doc{nullptr} {} @@ -132169,253 +165382,253 @@ simdjson_warn_unused simdjson_inline error_code document_reference::extract_into } #endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION } // namespace ondemand -} // namespace lsx +} // namespace lasx } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<lsx::ondemand::document_reference>::simdjson_result(lsx::ondemand::document_reference value, error_code error) - noexcept : implementation_simdjson_result_base<lsx::ondemand::document_reference>(std::forward<lsx::ondemand::document_reference>(value), error) {} +simdjson_inline simdjson_result<lasx::ondemand::document_reference>::simdjson_result(lasx::ondemand::document_reference value, error_code error) + noexcept : implementation_simdjson_result_base<lasx::ondemand::document_reference>(std::forward<lasx::ondemand::document_reference>(value), error) {} -simdjson_inline simdjson_result<size_t> simdjson_result<lsx::ondemand::document_reference>::count_elements() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<lasx::ondemand::document_reference>::count_elements() & noexcept { if (error()) { return error(); } return first.count_elements(); } -simdjson_inline simdjson_result<size_t> simdjson_result<lsx::ondemand::document_reference>::count_fields() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<lasx::ondemand::document_reference>::count_fields() & noexcept { if (error()) { return error(); } return first.count_fields(); } -simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::document_reference>::at(size_t index) & noexcept { +simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::document_reference>::at(size_t index) & noexcept { if (error()) { return error(); } return first.at(index); } -simdjson_inline error_code simdjson_result<lsx::ondemand::document_reference>::rewind() noexcept { +simdjson_inline error_code simdjson_result<lasx::ondemand::document_reference>::rewind() noexcept { if (error()) { return error(); } first.rewind(); return SUCCESS; } -simdjson_inline simdjson_result<lsx::ondemand::array_iterator> simdjson_result<lsx::ondemand::document_reference>::begin() & noexcept { +simdjson_inline simdjson_result<lasx::ondemand::array_iterator> simdjson_result<lasx::ondemand::document_reference>::begin() & noexcept { if (error()) { return error(); } return first.begin(); } -simdjson_inline simdjson_result<lsx::ondemand::array_iterator> simdjson_result<lsx::ondemand::document_reference>::end() & noexcept { +simdjson_inline simdjson_result<lasx::ondemand::array_iterator> simdjson_result<lasx::ondemand::document_reference>::end() & noexcept { return {}; } -simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::document_reference>::find_field_unordered(std::string_view key) & noexcept { +simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::document_reference>::find_field_unordered(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::document_reference>::find_field_unordered(const char *key) & noexcept { +simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::document_reference>::find_field_unordered(const char *key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::document_reference>::operator[](std::string_view key) & noexcept { +simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::document_reference>::operator[](std::string_view key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::document_reference>::operator[](const char *key) & noexcept { +simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::document_reference>::operator[](const char *key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::document_reference>::find_field(std::string_view key) & noexcept { +simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::document_reference>::find_field(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::document_reference>::find_field(const char *key) & noexcept { +simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::document_reference>::find_field(const char *key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<lsx::ondemand::array> simdjson_result<lsx::ondemand::document_reference>::get_array() & noexcept { +simdjson_inline simdjson_result<lasx::ondemand::array> simdjson_result<lasx::ondemand::document_reference>::get_array() & noexcept { if (error()) { return error(); } return first.get_array(); } -simdjson_inline simdjson_result<lsx::ondemand::object> simdjson_result<lsx::ondemand::document_reference>::get_object() & noexcept { +simdjson_inline simdjson_result<lasx::ondemand::object> simdjson_result<lasx::ondemand::document_reference>::get_object() & noexcept { if (error()) { return error(); } return first.get_object(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<lsx::ondemand::document_reference>::get_uint64() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<lasx::ondemand::document_reference>::get_uint64() noexcept { if (error()) { return error(); } return first.get_uint64(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<lsx::ondemand::document_reference>::get_uint64_in_string() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<lasx::ondemand::document_reference>::get_uint64_in_string() noexcept { if (error()) { return error(); } return first.get_uint64_in_string(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<lsx::ondemand::document_reference>::get_int64() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<lasx::ondemand::document_reference>::get_int64() noexcept { if (error()) { return error(); } return first.get_int64(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<lsx::ondemand::document_reference>::get_int64_in_string() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<lasx::ondemand::document_reference>::get_int64_in_string() noexcept { if (error()) { return error(); } return first.get_int64_in_string(); } -simdjson_inline simdjson_result<double> simdjson_result<lsx::ondemand::document_reference>::get_double() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<lasx::ondemand::document_reference>::get_double() noexcept { if (error()) { return error(); } return first.get_double(); } -simdjson_inline simdjson_result<double> simdjson_result<lsx::ondemand::document_reference>::get_double_in_string() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<lasx::ondemand::document_reference>::get_double_in_string() noexcept { if (error()) { return error(); } return first.get_double_in_string(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<lsx::ondemand::document_reference>::get_string(bool allow_replacement) noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<lasx::ondemand::document_reference>::get_string(bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(allow_replacement); } template <typename string_type> -simdjson_warn_unused simdjson_inline error_code simdjson_result<lsx::ondemand::document_reference>::get_string(string_type& receiver, bool allow_replacement) noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<lasx::ondemand::document_reference>::get_string(string_type& receiver, bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(receiver, allow_replacement); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<lsx::ondemand::document_reference>::get_wobbly_string() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<lasx::ondemand::document_reference>::get_wobbly_string() noexcept { if (error()) { return error(); } return first.get_wobbly_string(); } -simdjson_inline simdjson_result<lsx::ondemand::raw_json_string> simdjson_result<lsx::ondemand::document_reference>::get_raw_json_string() noexcept { +simdjson_inline simdjson_result<lasx::ondemand::raw_json_string> simdjson_result<lasx::ondemand::document_reference>::get_raw_json_string() noexcept { if (error()) { return error(); } return first.get_raw_json_string(); } -simdjson_inline simdjson_result<bool> simdjson_result<lsx::ondemand::document_reference>::get_bool() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<lasx::ondemand::document_reference>::get_bool() noexcept { if (error()) { return error(); } return first.get_bool(); } -simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::document_reference>::get_value() noexcept { +simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::document_reference>::get_value() noexcept { if (error()) { return error(); } return first.get_value(); } -simdjson_inline simdjson_result<bool> simdjson_result<lsx::ondemand::document_reference>::is_null() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<lasx::ondemand::document_reference>::is_null() noexcept { if (error()) { return error(); } return first.is_null(); } template<typename T> -simdjson_inline simdjson_result<T> simdjson_result<lsx::ondemand::document_reference>::get() & noexcept { +simdjson_inline simdjson_result<T> simdjson_result<lasx::ondemand::document_reference>::get() & noexcept { if (error()) { return error(); } return first.get<T>(); } template<typename T> -simdjson_inline simdjson_result<T> simdjson_result<lsx::ondemand::document_reference>::get() && noexcept { +simdjson_inline simdjson_result<T> simdjson_result<lasx::ondemand::document_reference>::get() && noexcept { if (error()) { return error(); } - return std::forward<lsx::ondemand::document_reference>(first).get<T>(); + return std::forward<lasx::ondemand::document_reference>(first).get<T>(); } template <class T> -simdjson_warn_unused simdjson_inline error_code simdjson_result<lsx::ondemand::document_reference>::get(T &out) & noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<lasx::ondemand::document_reference>::get(T &out) & noexcept { if (error()) { return error(); } return first.get<T>(out); } template <class T> -simdjson_warn_unused simdjson_inline error_code simdjson_result<lsx::ondemand::document_reference>::get(T &out) && noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<lasx::ondemand::document_reference>::get(T &out) && noexcept { if (error()) { return error(); } - return std::forward<lsx::ondemand::document_reference>(first).get<T>(out); + return std::forward<lasx::ondemand::document_reference>(first).get<T>(out); } -simdjson_inline simdjson_result<lsx::ondemand::json_type> simdjson_result<lsx::ondemand::document_reference>::type() noexcept { +simdjson_inline simdjson_result<lasx::ondemand::json_type> simdjson_result<lasx::ondemand::document_reference>::type() noexcept { if (error()) { return error(); } return first.type(); } -simdjson_inline simdjson_result<bool> simdjson_result<lsx::ondemand::document_reference>::is_scalar() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<lasx::ondemand::document_reference>::is_scalar() noexcept { if (error()) { return error(); } return first.is_scalar(); } -simdjson_inline simdjson_result<bool> simdjson_result<lsx::ondemand::document_reference>::is_string() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<lasx::ondemand::document_reference>::is_string() noexcept { if (error()) { return error(); } return first.is_string(); } template <> -simdjson_warn_unused simdjson_inline error_code simdjson_result<lsx::ondemand::document_reference>::get(lsx::ondemand::document_reference &out) & noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<lasx::ondemand::document_reference>::get(lasx::ondemand::document_reference &out) & noexcept { if (error()) { return error(); } out = first; return SUCCESS; } template <> -simdjson_warn_unused simdjson_inline error_code simdjson_result<lsx::ondemand::document_reference>::get(lsx::ondemand::document_reference &out) && noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<lasx::ondemand::document_reference>::get(lasx::ondemand::document_reference &out) && noexcept { if (error()) { return error(); } out = first; return SUCCESS; } -simdjson_inline simdjson_result<bool> simdjson_result<lsx::ondemand::document_reference>::is_negative() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<lasx::ondemand::document_reference>::is_negative() noexcept { if (error()) { return error(); } return first.is_negative(); } -simdjson_inline simdjson_result<bool> simdjson_result<lsx::ondemand::document_reference>::is_integer() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<lasx::ondemand::document_reference>::is_integer() noexcept { if (error()) { return error(); } return first.is_integer(); } -simdjson_inline simdjson_result<lsx::number_type> simdjson_result<lsx::ondemand::document_reference>::get_number_type() noexcept { +simdjson_inline simdjson_result<lasx::number_type> simdjson_result<lasx::ondemand::document_reference>::get_number_type() noexcept { if (error()) { return error(); } return first.get_number_type(); } -simdjson_inline simdjson_result<lsx::ondemand::number> simdjson_result<lsx::ondemand::document_reference>::get_number() noexcept { +simdjson_inline simdjson_result<lasx::ondemand::number> simdjson_result<lasx::ondemand::document_reference>::get_number() noexcept { if (error()) { return error(); } return first.get_number(); } #if SIMDJSON_EXCEPTIONS template <class T> -simdjson_inline simdjson_result<lsx::ondemand::document_reference>::operator T() noexcept(false) { - static_assert(std::is_same<T, lsx::ondemand::document_reference>::value == false, "You should not call get<T> when T is a document"); - static_assert(std::is_same<T, lsx::ondemand::document>::value == false, "You should not call get<T> when T is a document"); +simdjson_inline simdjson_result<lasx::ondemand::document_reference>::operator T() noexcept(false) { + static_assert(std::is_same<T, lasx::ondemand::document_reference>::value == false, "You should not call get<T> when T is a document"); + static_assert(std::is_same<T, lasx::ondemand::document>::value == false, "You should not call get<T> when T is a document"); if (error()) { throw simdjson_error(error()); } return first.get<T>(); } -simdjson_inline simdjson_result<lsx::ondemand::document_reference>::operator lsx::ondemand::array() & noexcept(false) { +simdjson_inline simdjson_result<lasx::ondemand::document_reference>::operator lasx::ondemand::array() & noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lsx::ondemand::document_reference>::operator lsx::ondemand::object() & noexcept(false) { +simdjson_inline simdjson_result<lasx::ondemand::document_reference>::operator lasx::ondemand::object() & noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lsx::ondemand::document_reference>::operator uint64_t() noexcept(false) { +simdjson_inline simdjson_result<lasx::ondemand::document_reference>::operator uint64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lsx::ondemand::document_reference>::operator int64_t() noexcept(false) { +simdjson_inline simdjson_result<lasx::ondemand::document_reference>::operator int64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lsx::ondemand::document_reference>::operator double() noexcept(false) { +simdjson_inline simdjson_result<lasx::ondemand::document_reference>::operator double() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lsx::ondemand::document_reference>::operator std::string_view() noexcept(false) { +simdjson_inline simdjson_result<lasx::ondemand::document_reference>::operator std::string_view() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lsx::ondemand::document_reference>::operator lsx::ondemand::raw_json_string() noexcept(false) { +simdjson_inline simdjson_result<lasx::ondemand::document_reference>::operator lasx::ondemand::raw_json_string() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lsx::ondemand::document_reference>::operator bool() noexcept(false) { +simdjson_inline simdjson_result<lasx::ondemand::document_reference>::operator bool() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lsx::ondemand::document_reference>::operator lsx::ondemand::value() noexcept(false) { +simdjson_inline simdjson_result<lasx::ondemand::document_reference>::operator lasx::ondemand::value() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } #endif -simdjson_inline simdjson_result<const char *> simdjson_result<lsx::ondemand::document_reference>::current_location() noexcept { +simdjson_inline simdjson_result<const char *> simdjson_result<lasx::ondemand::document_reference>::current_location() noexcept { if (error()) { return error(); } return first.current_location(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<lsx::ondemand::document_reference>::raw_json_token() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<lasx::ondemand::document_reference>::raw_json_token() noexcept { if (error()) { return error(); } return first.raw_json_token(); } -simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::document_reference>::at_pointer(std::string_view json_pointer) noexcept { +simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::document_reference>::at_pointer(std::string_view json_pointer) noexcept { if (error()) { return error(); } return first.at_pointer(json_pointer); } -simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::document_reference>::at_path(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::document_reference>::at_path(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path(json_path); } -simdjson_inline simdjson_result<std::vector<lsx::ondemand::value>> simdjson_result<lsx::ondemand::document_reference>::at_path_with_wildcard(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<std::vector<lasx::ondemand::value>> simdjson_result<lasx::ondemand::document_reference>::at_path_with_wildcard(std::string_view json_path) noexcept { if (error()) { return error(); } @@ -132424,7 +165637,7 @@ simdjson_inline simdjson_result<std::vector<lsx::ondemand::value>> simdjson_resu #if SIMDJSON_STATIC_REFLECTION template<constevalutil::fixed_string... FieldNames, typename T> requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) -simdjson_warn_unused simdjson_inline error_code simdjson_result<lsx::ondemand::document_reference>::extract_into(T& out) & noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<lasx::ondemand::document_reference>::extract_into(T& out) & noexcept { if (error()) { return error(); } return first.extract_into<FieldNames...>(out); } @@ -132432,9 +165645,9 @@ simdjson_warn_unused simdjson_inline error_code simdjson_result<lsx::ondemand::d } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H -/* end file simdjson/generic/ondemand/document-inl.h for lsx */ -/* including simdjson/generic/ondemand/document_stream-inl.h for lsx: #include "simdjson/generic/ondemand/document_stream-inl.h" */ -/* begin file simdjson/generic/ondemand/document_stream-inl.h for lsx */ +/* end file simdjson/generic/ondemand/document-inl.h for lasx */ +/* including simdjson/generic/ondemand/document_stream-inl.h for lasx: #include "simdjson/generic/ondemand/document_stream-inl.h" */ +/* begin file simdjson/generic/ondemand/document_stream-inl.h for lasx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -132449,7 +165662,7 @@ simdjson_warn_unused simdjson_inline error_code simdjson_result<lsx::ondemand::d #include <stdexcept> namespace simdjson { -namespace lsx { +namespace lasx { namespace ondemand { #ifdef SIMDJSON_THREADS_ENABLED @@ -132856,22 +166069,22 @@ inline void document_stream::start_stage1_thread() noexcept { #endif // SIMDJSON_THREADS_ENABLED } // namespace ondemand -} // namespace lsx +} // namespace lasx } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<lsx::ondemand::document_stream>::simdjson_result( +simdjson_inline simdjson_result<lasx::ondemand::document_stream>::simdjson_result( error_code error ) noexcept : - implementation_simdjson_result_base<lsx::ondemand::document_stream>(error) + implementation_simdjson_result_base<lasx::ondemand::document_stream>(error) { } -simdjson_inline simdjson_result<lsx::ondemand::document_stream>::simdjson_result( - lsx::ondemand::document_stream &&value +simdjson_inline simdjson_result<lasx::ondemand::document_stream>::simdjson_result( + lasx::ondemand::document_stream &&value ) noexcept : - implementation_simdjson_result_base<lsx::ondemand::document_stream>( - std::forward<lsx::ondemand::document_stream>(value) + implementation_simdjson_result_base<lasx::ondemand::document_stream>( + std::forward<lasx::ondemand::document_stream>(value) ) { } @@ -132879,9 +166092,9 @@ simdjson_inline simdjson_result<lsx::ondemand::document_stream>::simdjson_result } #endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_INL_H -/* end file simdjson/generic/ondemand/document_stream-inl.h for lsx */ -/* including simdjson/generic/ondemand/field-inl.h for lsx: #include "simdjson/generic/ondemand/field-inl.h" */ -/* begin file simdjson/generic/ondemand/field-inl.h for lsx */ +/* end file simdjson/generic/ondemand/document_stream-inl.h for lasx */ +/* including simdjson/generic/ondemand/field-inl.h for lasx: #include "simdjson/generic/ondemand/field-inl.h" */ +/* begin file simdjson/generic/ondemand/field-inl.h for lasx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -132893,7 +166106,7 @@ simdjson_inline simdjson_result<lsx::ondemand::document_stream>::simdjson_result /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace ondemand { // clang 6 does not think the default constructor can be noexcept, so we make it explicit @@ -132957,53 +166170,53 @@ simdjson_inline value field::value() && noexcept { } } // namespace ondemand -} // namespace lsx +} // namespace lasx } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<lsx::ondemand::field>::simdjson_result( - lsx::ondemand::field &&value +simdjson_inline simdjson_result<lasx::ondemand::field>::simdjson_result( + lasx::ondemand::field &&value ) noexcept : - implementation_simdjson_result_base<lsx::ondemand::field>( - std::forward<lsx::ondemand::field>(value) + implementation_simdjson_result_base<lasx::ondemand::field>( + std::forward<lasx::ondemand::field>(value) ) { } -simdjson_inline simdjson_result<lsx::ondemand::field>::simdjson_result( +simdjson_inline simdjson_result<lasx::ondemand::field>::simdjson_result( error_code error ) noexcept : - implementation_simdjson_result_base<lsx::ondemand::field>(error) + implementation_simdjson_result_base<lasx::ondemand::field>(error) { } -simdjson_inline simdjson_result<lsx::ondemand::raw_json_string> simdjson_result<lsx::ondemand::field>::key() noexcept { +simdjson_inline simdjson_result<lasx::ondemand::raw_json_string> simdjson_result<lasx::ondemand::field>::key() noexcept { if (error()) { return error(); } return first.key(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<lsx::ondemand::field>::key_raw_json_token() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<lasx::ondemand::field>::key_raw_json_token() noexcept { if (error()) { return error(); } return first.key_raw_json_token(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<lsx::ondemand::field>::escaped_key() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<lasx::ondemand::field>::escaped_key() noexcept { if (error()) { return error(); } return first.escaped_key(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<lsx::ondemand::field>::unescaped_key(bool allow_replacement) noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<lasx::ondemand::field>::unescaped_key(bool allow_replacement) noexcept { if (error()) { return error(); } return first.unescaped_key(allow_replacement); } template<typename string_type> -simdjson_warn_unused simdjson_inline error_code simdjson_result<lsx::ondemand::field>::unescaped_key(string_type &receiver, bool allow_replacement) noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<lasx::ondemand::field>::unescaped_key(string_type &receiver, bool allow_replacement) noexcept { if (error()) { return error(); } return first.unescaped_key(receiver, allow_replacement); } -simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::field>::value() noexcept { +simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::field>::value() noexcept { if (error()) { return error(); } return std::move(first.value()); } @@ -133011,9 +166224,9 @@ simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondem } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H -/* end file simdjson/generic/ondemand/field-inl.h for lsx */ -/* including simdjson/generic/ondemand/json_iterator-inl.h for lsx: #include "simdjson/generic/ondemand/json_iterator-inl.h" */ -/* begin file simdjson/generic/ondemand/json_iterator-inl.h for lsx */ +/* end file simdjson/generic/ondemand/field-inl.h for lasx */ +/* including simdjson/generic/ondemand/json_iterator-inl.h for lasx: #include "simdjson/generic/ondemand/json_iterator-inl.h" */ +/* begin file simdjson/generic/ondemand/json_iterator-inl.h for lasx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -133029,7 +166242,7 @@ simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondem /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace ondemand { simdjson_inline json_iterator::json_iterator(json_iterator &&other) noexcept @@ -133231,11 +166444,10 @@ simdjson_inline void json_iterator::assert_more_tokens(uint32_t required_tokens) } simdjson_inline void json_iterator::assert_valid_position(token_position position) const noexcept { + (void)position; // Suppress unused parameter warning #ifndef SIMDJSON_CLANG_VISUAL_STUDIO SIMDJSON_ASSUME( position >= &parser->implementation->structural_indexes[0] ); SIMDJSON_ASSUME( position < &parser->implementation->structural_indexes[parser->implementation->n_structural_indexes] ); -#else - (void)position; // Suppress unused parameter warning #endif } @@ -133374,7 +166586,11 @@ simdjson_inline token_position json_iterator::position() const noexcept { simdjson_inline simdjson_result<std::string_view> json_iterator::unescape(raw_json_string in, bool allow_replacement) noexcept { #if SIMDJSON_DEVELOPMENT_CHECKS auto result = parser->unescape(in, _string_buf_loc, allow_replacement); +#if !defined(SIMDJSON_VISUAL_STUDIO) && !defined(SIMDJSON_CLANG_VISUAL_STUDIO) + // Under Visual Studio, the next SIMDJSON_ASSUME fails with: the argument + // has side effects that will be discarded. SIMDJSON_ASSUME(!parser->string_buffer_overflow(_string_buf_loc)); +#endif // !defined(SIMDJSON_VISUAL_STUDIO) && !defined(SIMDJSON_CLANG_VISUAL_STUDIO) return result; #else return parser->unescape(in, _string_buf_loc, allow_replacement); @@ -133384,7 +166600,11 @@ simdjson_inline simdjson_result<std::string_view> json_iterator::unescape(raw_js simdjson_inline simdjson_result<std::string_view> json_iterator::unescape_wobbly(raw_json_string in) noexcept { #if SIMDJSON_DEVELOPMENT_CHECKS auto result = parser->unescape_wobbly(in, _string_buf_loc); +#if !defined(SIMDJSON_VISUAL_STUDIO) && !defined(SIMDJSON_CLANG_VISUAL_STUDIO) + // Under Visual Studio, the next SIMDJSON_ASSUME fails with: the argument + // has side effects that will be discarded. SIMDJSON_ASSUME(!parser->string_buffer_overflow(_string_buf_loc)); +#endif // !defined(SIMDJSON_VISUAL_STUDIO) && !defined(SIMDJSON_CLANG_VISUAL_STUDIO) return result; #else return parser->unescape_wobbly(in, _string_buf_loc); @@ -133447,22 +166667,22 @@ simdjson_warn_unused simdjson_inline bool json_iterator::copy_to_buffer(const ui } } // namespace ondemand -} // namespace lsx +} // namespace lasx } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<lsx::ondemand::json_iterator>::simdjson_result(lsx::ondemand::json_iterator &&value) noexcept - : implementation_simdjson_result_base<lsx::ondemand::json_iterator>(std::forward<lsx::ondemand::json_iterator>(value)) {} -simdjson_inline simdjson_result<lsx::ondemand::json_iterator>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<lsx::ondemand::json_iterator>(error) {} +simdjson_inline simdjson_result<lasx::ondemand::json_iterator>::simdjson_result(lasx::ondemand::json_iterator &&value) noexcept + : implementation_simdjson_result_base<lasx::ondemand::json_iterator>(std::forward<lasx::ondemand::json_iterator>(value)) {} +simdjson_inline simdjson_result<lasx::ondemand::json_iterator>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<lasx::ondemand::json_iterator>(error) {} } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_INL_H -/* end file simdjson/generic/ondemand/json_iterator-inl.h for lsx */ -/* including simdjson/generic/ondemand/json_type-inl.h for lsx: #include "simdjson/generic/ondemand/json_type-inl.h" */ -/* begin file simdjson/generic/ondemand/json_type-inl.h for lsx */ +/* end file simdjson/generic/ondemand/json_iterator-inl.h for lasx */ +/* including simdjson/generic/ondemand/json_type-inl.h for lasx: #include "simdjson/generic/ondemand/json_type-inl.h" */ +/* begin file simdjson/generic/ondemand/json_type-inl.h for lasx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -133473,7 +166693,7 @@ simdjson_inline simdjson_result<lsx::ondemand::json_iterator>::simdjson_result(e /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace ondemand { inline std::ostream& operator<<(std::ostream& out, json_type type) noexcept { @@ -133567,22 +166787,22 @@ simdjson_inline void number::skip_double() noexcept { } } // namespace ondemand -} // namespace lsx +} // namespace lasx } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<lsx::ondemand::json_type>::simdjson_result(lsx::ondemand::json_type &&value) noexcept - : implementation_simdjson_result_base<lsx::ondemand::json_type>(std::forward<lsx::ondemand::json_type>(value)) {} -simdjson_inline simdjson_result<lsx::ondemand::json_type>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<lsx::ondemand::json_type>(error) {} +simdjson_inline simdjson_result<lasx::ondemand::json_type>::simdjson_result(lasx::ondemand::json_type &&value) noexcept + : implementation_simdjson_result_base<lasx::ondemand::json_type>(std::forward<lasx::ondemand::json_type>(value)) {} +simdjson_inline simdjson_result<lasx::ondemand::json_type>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<lasx::ondemand::json_type>(error) {} } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_INL_H -/* end file simdjson/generic/ondemand/json_type-inl.h for lsx */ -/* including simdjson/generic/ondemand/logger-inl.h for lsx: #include "simdjson/generic/ondemand/logger-inl.h" */ -/* begin file simdjson/generic/ondemand/logger-inl.h for lsx */ +/* end file simdjson/generic/ondemand/json_type-inl.h for lasx */ +/* including simdjson/generic/ondemand/logger-inl.h for lasx: #include "simdjson/generic/ondemand/logger-inl.h" */ +/* begin file simdjson/generic/ondemand/logger-inl.h for lasx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_LOGGER_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -133597,7 +166817,7 @@ simdjson_inline simdjson_result<lsx::ondemand::json_type>::simdjson_result(error #include <cstring> namespace simdjson { -namespace lsx { +namespace lasx { namespace ondemand { namespace logger { @@ -133804,13 +167024,13 @@ inline void log_line(const json_iterator &iter, token_position index, depth_t de } // namespace logger } // namespace ondemand -} // namespace lsx +} // namespace lasx } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_LOGGER_INL_H -/* end file simdjson/generic/ondemand/logger-inl.h for lsx */ -/* including simdjson/generic/ondemand/object-inl.h for lsx: #include "simdjson/generic/ondemand/object-inl.h" */ -/* begin file simdjson/generic/ondemand/object-inl.h for lsx */ +/* end file simdjson/generic/ondemand/logger-inl.h for lasx */ +/* including simdjson/generic/ondemand/object-inl.h for lasx: #include "simdjson/generic/ondemand/object-inl.h" */ +/* begin file simdjson/generic/ondemand/object-inl.h for lasx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -133830,7 +167050,7 @@ inline void log_line(const json_iterator &iter, token_position index, depth_t de /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace ondemand { simdjson_inline simdjson_result<value> object::find_field_unordered(const std::string_view key) & noexcept { @@ -134104,55 +167324,55 @@ simdjson_warn_unused simdjson_inline error_code object::extract_into(T& out) & n #endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION } // namespace ondemand -} // namespace lsx +} // namespace lasx } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<lsx::ondemand::object>::simdjson_result(lsx::ondemand::object &&value) noexcept - : implementation_simdjson_result_base<lsx::ondemand::object>(std::forward<lsx::ondemand::object>(value)) {} -simdjson_inline simdjson_result<lsx::ondemand::object>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<lsx::ondemand::object>(error) {} +simdjson_inline simdjson_result<lasx::ondemand::object>::simdjson_result(lasx::ondemand::object &&value) noexcept + : implementation_simdjson_result_base<lasx::ondemand::object>(std::forward<lasx::ondemand::object>(value)) {} +simdjson_inline simdjson_result<lasx::ondemand::object>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<lasx::ondemand::object>(error) {} -simdjson_inline simdjson_result<lsx::ondemand::object_iterator> simdjson_result<lsx::ondemand::object>::begin() noexcept { +simdjson_inline simdjson_result<lasx::ondemand::object_iterator> simdjson_result<lasx::ondemand::object>::begin() noexcept { if (error()) { return error(); } return first.begin(); } -simdjson_inline simdjson_result<lsx::ondemand::object_iterator> simdjson_result<lsx::ondemand::object>::end() noexcept { +simdjson_inline simdjson_result<lasx::ondemand::object_iterator> simdjson_result<lasx::ondemand::object>::end() noexcept { if (error()) { return error(); } return first.end(); } -simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::object>::find_field_unordered(std::string_view key) & noexcept { +simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::object>::find_field_unordered(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::object>::find_field_unordered(std::string_view key) && noexcept { +simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::object>::find_field_unordered(std::string_view key) && noexcept { if (error()) { return error(); } - return std::forward<lsx::ondemand::object>(first).find_field_unordered(key); + return std::forward<lasx::ondemand::object>(first).find_field_unordered(key); } -simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::object>::operator[](std::string_view key) & noexcept { +simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::object>::operator[](std::string_view key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::object>::operator[](std::string_view key) && noexcept { +simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::object>::operator[](std::string_view key) && noexcept { if (error()) { return error(); } - return std::forward<lsx::ondemand::object>(first)[key]; + return std::forward<lasx::ondemand::object>(first)[key]; } -simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::object>::find_field(std::string_view key) & noexcept { +simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::object>::find_field(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::object>::find_field(std::string_view key) && noexcept { +simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::object>::find_field(std::string_view key) && noexcept { if (error()) { return error(); } - return std::forward<lsx::ondemand::object>(first).find_field(key); + return std::forward<lasx::ondemand::object>(first).find_field(key); } -simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::object>::at_pointer(std::string_view json_pointer) noexcept { +simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::object>::at_pointer(std::string_view json_pointer) noexcept { if (error()) { return error(); } return first.at_pointer(json_pointer); } -simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondemand::object>::at_path( +simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::object>::at_path( std::string_view json_path) noexcept { if (error()) { return error(); @@ -134160,27 +167380,27 @@ simdjson_inline simdjson_result<lsx::ondemand::value> simdjson_result<lsx::ondem return first.at_path(json_path); } -simdjson_inline simdjson_result<std::vector<lsx::ondemand::value>> simdjson_result<lsx::ondemand::object>::at_path_with_wildcard(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<std::vector<lasx::ondemand::value>> simdjson_result<lasx::ondemand::object>::at_path_with_wildcard(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path_with_wildcard(json_path); } -inline simdjson_result<bool> simdjson_result<lsx::ondemand::object>::reset() noexcept { +inline simdjson_result<bool> simdjson_result<lasx::ondemand::object>::reset() noexcept { if (error()) { return error(); } return first.reset(); } -inline simdjson_result<bool> simdjson_result<lsx::ondemand::object>::is_empty() noexcept { +inline simdjson_result<bool> simdjson_result<lasx::ondemand::object>::is_empty() noexcept { if (error()) { return error(); } return first.is_empty(); } -simdjson_inline simdjson_result<size_t> simdjson_result<lsx::ondemand::object>::count_fields() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<lasx::ondemand::object>::count_fields() & noexcept { if (error()) { return error(); } return first.count_fields(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<lsx::ondemand::object>::raw_json() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<lasx::ondemand::object>::raw_json() noexcept { if (error()) { return error(); } return first.raw_json(); } @@ -134188,9 +167408,9 @@ simdjson_inline simdjson_result<std::string_view> simdjson_result<lsx::ondemand } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_INL_H -/* end file simdjson/generic/ondemand/object-inl.h for lsx */ -/* including simdjson/generic/ondemand/object_iterator-inl.h for lsx: #include "simdjson/generic/ondemand/object_iterator-inl.h" */ -/* begin file simdjson/generic/ondemand/object_iterator-inl.h for lsx */ +/* end file simdjson/generic/ondemand/object-inl.h for lasx */ +/* including simdjson/generic/ondemand/object_iterator-inl.h for lasx: #include "simdjson/generic/ondemand/object_iterator-inl.h" */ +/* begin file simdjson/generic/ondemand/object_iterator-inl.h for lasx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -134202,7 +167422,7 @@ simdjson_inline simdjson_result<std::string_view> simdjson_result<lsx::ondemand /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace ondemand { // @@ -134214,6 +167434,11 @@ simdjson_inline object_iterator::object_iterator(const value_iterator &_iter) no {} simdjson_inline simdjson_result<field> object_iterator::operator*() noexcept { +#if SIMDJSON_DEVELOPMENT_CHECKS + // We must call * once per iteration. + SIMDJSON_ASSUME(!has_been_referenced); + has_been_referenced = true; +#endif error_code error = iter.error(); if (error) { iter.abandon(); return error; } auto result = field::start(iter); @@ -134232,6 +167457,11 @@ simdjson_inline bool object_iterator::operator!=(const object_iterator &) const SIMDJSON_PUSH_DISABLE_WARNINGS SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING simdjson_inline object_iterator &object_iterator::operator++() noexcept { +#if SIMDJSON_DEVELOPMENT_CHECKS + // Before calling ++, we must have called *. + SIMDJSON_ASSUME(has_been_referenced); + has_been_referenced = false; +#endif // TODO this is a safety rail ... users should exit loops as soon as they receive an error. // Nonetheless, let's see if performance is OK with this if statement--the compiler may give it to us for free. if (!iter.is_open()) { return *this; } // Iterator will be released if there is an error @@ -134287,39 +167517,39 @@ SIMDJSON_POP_DISABLE_WARNINGS // } // namespace ondemand -} // namespace lsx +} // namespace lasx } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<lsx::ondemand::object_iterator>::simdjson_result( - lsx::ondemand::object_iterator &&value +simdjson_inline simdjson_result<lasx::ondemand::object_iterator>::simdjson_result( + lasx::ondemand::object_iterator &&value ) noexcept - : implementation_simdjson_result_base<lsx::ondemand::object_iterator>(std::forward<lsx::ondemand::object_iterator>(value)) + : implementation_simdjson_result_base<lasx::ondemand::object_iterator>(std::forward<lasx::ondemand::object_iterator>(value)) { first.iter.assert_is_valid(); } -simdjson_inline simdjson_result<lsx::ondemand::object_iterator>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<lsx::ondemand::object_iterator>({}, error) +simdjson_inline simdjson_result<lasx::ondemand::object_iterator>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<lasx::ondemand::object_iterator>({}, error) { } -simdjson_inline simdjson_result<lsx::ondemand::field> simdjson_result<lsx::ondemand::object_iterator>::operator*() noexcept { +simdjson_inline simdjson_result<lasx::ondemand::field> simdjson_result<lasx::ondemand::object_iterator>::operator*() noexcept { if (error()) { return error(); } return *first; } // If we're iterating and there is an error, return the error once. -simdjson_inline bool simdjson_result<lsx::ondemand::object_iterator>::operator==(const simdjson_result<lsx::ondemand::object_iterator> &other) const noexcept { +simdjson_inline bool simdjson_result<lasx::ondemand::object_iterator>::operator==(const simdjson_result<lasx::ondemand::object_iterator> &other) const noexcept { if (!first.iter.is_valid()) { return !error(); } return first == other.first; } // If we're iterating and there is an error, return the error once. -simdjson_inline bool simdjson_result<lsx::ondemand::object_iterator>::operator!=(const simdjson_result<lsx::ondemand::object_iterator> &other) const noexcept { +simdjson_inline bool simdjson_result<lasx::ondemand::object_iterator>::operator!=(const simdjson_result<lasx::ondemand::object_iterator> &other) const noexcept { if (!first.iter.is_valid()) { return error(); } return first != other.first; } // Checks for ']' and ',' -simdjson_inline simdjson_result<lsx::ondemand::object_iterator> &simdjson_result<lsx::ondemand::object_iterator>::operator++() noexcept { +simdjson_inline simdjson_result<lasx::ondemand::object_iterator> &simdjson_result<lasx::ondemand::object_iterator>::operator++() noexcept { // Clear the error if there is one, so we don't yield it twice if (error()) { second = SUCCESS; return *this; } ++first; @@ -134329,9 +167559,9 @@ simdjson_inline simdjson_result<lsx::ondemand::object_iterator> &simdjson_result } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_INL_H -/* end file simdjson/generic/ondemand/object_iterator-inl.h for lsx */ -/* including simdjson/generic/ondemand/parser-inl.h for lsx: #include "simdjson/generic/ondemand/parser-inl.h" */ -/* begin file simdjson/generic/ondemand/parser-inl.h for lsx */ +/* end file simdjson/generic/ondemand/object_iterator-inl.h for lasx */ +/* including simdjson/generic/ondemand/parser-inl.h for lasx: #include "simdjson/generic/ondemand/parser-inl.h" */ +/* begin file simdjson/generic/ondemand/parser-inl.h for lasx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_PARSER_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -134348,7 +167578,7 @@ simdjson_inline simdjson_result<lsx::ondemand::object_iterator> &simdjson_result /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace ondemand { simdjson_inline parser::parser(size_t max_capacity) noexcept @@ -134558,22 +167788,22 @@ simdjson_inline simdjson_warn_unused std::unique_ptr<ondemand::parser>& parser:: } // namespace ondemand -} // namespace lsx +} // namespace lasx } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<lsx::ondemand::parser>::simdjson_result(lsx::ondemand::parser &&value) noexcept - : implementation_simdjson_result_base<lsx::ondemand::parser>(std::forward<lsx::ondemand::parser>(value)) {} -simdjson_inline simdjson_result<lsx::ondemand::parser>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<lsx::ondemand::parser>(error) {} - +simdjson_inline simdjson_result<lasx::ondemand::parser>::simdjson_result(lasx::ondemand::parser &&value) noexcept + : implementation_simdjson_result_base<lasx::ondemand::parser>(std::forward<lasx::ondemand::parser>(value)) {} +simdjson_inline simdjson_result<lasx::ondemand::parser>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<lasx::ondemand::parser>(error) {} + } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_PARSER_INL_H -/* end file simdjson/generic/ondemand/parser-inl.h for lsx */ -/* including simdjson/generic/ondemand/raw_json_string-inl.h for lsx: #include "simdjson/generic/ondemand/raw_json_string-inl.h" */ -/* begin file simdjson/generic/ondemand/raw_json_string-inl.h for lsx */ +/* end file simdjson/generic/ondemand/parser-inl.h for lasx */ +/* including simdjson/generic/ondemand/raw_json_string-inl.h for lasx: #include "simdjson/generic/ondemand/raw_json_string-inl.h" */ +/* begin file simdjson/generic/ondemand/raw_json_string-inl.h for lasx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -134586,7 +167816,7 @@ simdjson_inline simdjson_result<lsx::ondemand::parser>::simdjson_result(error_co namespace simdjson { -namespace lsx { +namespace lasx { namespace ondemand { simdjson_inline raw_json_string::raw_json_string(const uint8_t * _buf) noexcept : buf{_buf} {} @@ -134760,277 +167990,38 @@ simdjson_unused simdjson_inline std::ostream &operator<<(std::ostream &out, cons } } // namespace ondemand -} // namespace lsx +} // namespace lasx } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<lsx::ondemand::raw_json_string>::simdjson_result(lsx::ondemand::raw_json_string &&value) noexcept - : implementation_simdjson_result_base<lsx::ondemand::raw_json_string>(std::forward<lsx::ondemand::raw_json_string>(value)) {} -simdjson_inline simdjson_result<lsx::ondemand::raw_json_string>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<lsx::ondemand::raw_json_string>(error) {} +simdjson_inline simdjson_result<lasx::ondemand::raw_json_string>::simdjson_result(lasx::ondemand::raw_json_string &&value) noexcept + : implementation_simdjson_result_base<lasx::ondemand::raw_json_string>(std::forward<lasx::ondemand::raw_json_string>(value)) {} +simdjson_inline simdjson_result<lasx::ondemand::raw_json_string>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<lasx::ondemand::raw_json_string>(error) {} -simdjson_inline simdjson_result<const char *> simdjson_result<lsx::ondemand::raw_json_string>::raw() const noexcept { +simdjson_inline simdjson_result<const char *> simdjson_result<lasx::ondemand::raw_json_string>::raw() const noexcept { if (error()) { return error(); } return first.raw(); } -simdjson_inline char simdjson_result<lsx::ondemand::raw_json_string>::operator[](size_t i) const noexcept { +simdjson_inline char simdjson_result<lasx::ondemand::raw_json_string>::operator[](size_t i) const noexcept { if (error()) { return error(); } return first[i]; } -simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> simdjson_result<lsx::ondemand::raw_json_string>::unescape(lsx::ondemand::json_iterator &iter, bool allow_replacement) const noexcept { +simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> simdjson_result<lasx::ondemand::raw_json_string>::unescape(lasx::ondemand::json_iterator &iter, bool allow_replacement) const noexcept { if (error()) { return error(); } return first.unescape(iter, allow_replacement); } -simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> simdjson_result<lsx::ondemand::raw_json_string>::unescape_wobbly(lsx::ondemand::json_iterator &iter) const noexcept { +simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> simdjson_result<lasx::ondemand::raw_json_string>::unescape_wobbly(lasx::ondemand::json_iterator &iter) const noexcept { if (error()) { return error(); } return first.unescape_wobbly(iter); } } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_INL_H -/* end file simdjson/generic/ondemand/raw_json_string-inl.h for lsx */ -/* including simdjson/generic/ondemand/serialization-inl.h for lsx: #include "simdjson/generic/ondemand/serialization-inl.h" */ -/* begin file simdjson/generic/ondemand/serialization-inl.h for lsx */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H - -/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document-inl.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/serialization.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */ -/* amalgamation skipped (editor-only): #if SIMDJSON_STATIC_REFLECTION */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_builder.h" */ -/* amalgamation skipped (editor-only): #endif */ -/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ - -namespace simdjson { - -inline std::string_view trim(const std::string_view str) noexcept { - // We can almost surely do better by rolling our own find_first_not_of function. - size_t first = str.find_first_not_of(" \t\n\r"); - // If we have the empty string (just white space), then no trimming is possible, and - // we return the empty string_view. - if (std::string_view::npos == first) { return std::string_view(); } - size_t last = str.find_last_not_of(" \t\n\r"); - return str.substr(first, (last - first + 1)); -} - - -inline simdjson_result<std::string_view> to_json_string(lsx::ondemand::document& x) noexcept { - std::string_view v; - auto error = x.raw_json().get(v); - if(error) {return error; } - return trim(v); -} - -inline simdjson_result<std::string_view> to_json_string(lsx::ondemand::document_reference& x) noexcept { - std::string_view v; - auto error = x.raw_json().get(v); - if(error) {return error; } - return trim(v); -} - -inline simdjson_result<std::string_view> to_json_string(lsx::ondemand::value& x) noexcept { - /** - * If we somehow receive a value that has already been consumed, - * then the following code could be in trouble. E.g., we create - * an array as needed, but if an array was already created, then - * it could be bad. - */ - using namespace lsx::ondemand; - lsx::ondemand::json_type t; - auto error = x.type().get(t); - if(error != SUCCESS) { return error; } - switch (t) - { - case json_type::array: - { - lsx::ondemand::array array; - error = x.get_array().get(array); - if(error) { return error; } - return to_json_string(array); - } - case json_type::object: - { - lsx::ondemand::object object; - error = x.get_object().get(object); - if(error) { return error; } - return to_json_string(object); - } - default: - return trim(x.raw_json_token()); - } -} - -inline simdjson_result<std::string_view> to_json_string(lsx::ondemand::object& x) noexcept { - std::string_view v; - auto error = x.raw_json().get(v); - if(error) {return error; } - return trim(v); -} - -inline simdjson_result<std::string_view> to_json_string(lsx::ondemand::array& x) noexcept { - std::string_view v; - auto error = x.raw_json().get(v); - if(error) {return error; } - return trim(v); -} - -inline simdjson_result<std::string_view> to_json_string(simdjson_result<lsx::ondemand::document> x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); -} - -inline simdjson_result<std::string_view> to_json_string(simdjson_result<lsx::ondemand::document_reference> x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); -} - -inline simdjson_result<std::string_view> to_json_string(simdjson_result<lsx::ondemand::value> x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); -} - -inline simdjson_result<std::string_view> to_json_string(simdjson_result<lsx::ondemand::object> x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); -} - -inline simdjson_result<std::string_view> to_json_string(simdjson_result<lsx::ondemand::array> x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); -} -} // namespace simdjson - -namespace simdjson { namespace lsx { namespace ondemand { - -#if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::lsx::ondemand::value x) { - std::string_view v; - auto error = simdjson::to_json_string(x).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - throw simdjson::simdjson_error(error); - } -} -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::lsx::ondemand::value> x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); -} -#else -inline std::ostream& operator<<(std::ostream& out, simdjson::lsx::ondemand::value x) { - std::string_view v; - auto error = simdjson::to_json_string(x).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - return (out << error); - } -} -#endif - -#if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::lsx::ondemand::array value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - throw simdjson::simdjson_error(error); - } -} -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::lsx::ondemand::array> x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); -} -#else -inline std::ostream& operator<<(std::ostream& out, simdjson::lsx::ondemand::array value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - return (out << error); - } -} -#endif - -#if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::lsx::ondemand::document& value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - throw simdjson::simdjson_error(error); - } -} -inline std::ostream& operator<<(std::ostream& out, simdjson::lsx::ondemand::document_reference& value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - throw simdjson::simdjson_error(error); - } -} -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::lsx::ondemand::document>&& x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); -} -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::lsx::ondemand::document_reference>&& x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); -} -#else -inline std::ostream& operator<<(std::ostream& out, simdjson::lsx::ondemand::document& value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - return (out << error); - } -} -#endif - -#if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::lsx::ondemand::object value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - throw simdjson::simdjson_error(error); - } -} -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::lsx::ondemand::object> x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); -} -#else -inline std::ostream& operator<<(std::ostream& out, simdjson::lsx::ondemand::object value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - return (out << error); - } -} -#endif -}}} // namespace simdjson::lsx::ondemand - -#endif // SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H -/* end file simdjson/generic/ondemand/serialization-inl.h for lsx */ -/* including simdjson/generic/ondemand/token_iterator-inl.h for lsx: #include "simdjson/generic/ondemand/token_iterator-inl.h" */ -/* begin file simdjson/generic/ondemand/token_iterator-inl.h for lsx */ +/* end file simdjson/generic/ondemand/raw_json_string-inl.h for lasx */ +/* including simdjson/generic/ondemand/token_iterator-inl.h for lasx: #include "simdjson/generic/ondemand/token_iterator-inl.h" */ +/* begin file simdjson/generic/ondemand/token_iterator-inl.h for lasx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -135041,7 +168032,7 @@ inline std::ostream& operator<<(std::ostream& out, simdjson::lsx::ondemand::obje /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace ondemand { simdjson_inline token_iterator::token_iterator( @@ -135112,22 +168103,22 @@ simdjson_inline bool token_iterator::operator<=(const token_iterator &other) con } } // namespace ondemand -} // namespace lsx +} // namespace lasx } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<lsx::ondemand::token_iterator>::simdjson_result(lsx::ondemand::token_iterator &&value) noexcept - : implementation_simdjson_result_base<lsx::ondemand::token_iterator>(std::forward<lsx::ondemand::token_iterator>(value)) {} -simdjson_inline simdjson_result<lsx::ondemand::token_iterator>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<lsx::ondemand::token_iterator>(error) {} +simdjson_inline simdjson_result<lasx::ondemand::token_iterator>::simdjson_result(lasx::ondemand::token_iterator &&value) noexcept + : implementation_simdjson_result_base<lasx::ondemand::token_iterator>(std::forward<lasx::ondemand::token_iterator>(value)) {} +simdjson_inline simdjson_result<lasx::ondemand::token_iterator>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<lasx::ondemand::token_iterator>(error) {} } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_INL_H -/* end file simdjson/generic/ondemand/token_iterator-inl.h for lsx */ -/* including simdjson/generic/ondemand/value_iterator-inl.h for lsx: #include "simdjson/generic/ondemand/value_iterator-inl.h" */ -/* begin file simdjson/generic/ondemand/value_iterator-inl.h for lsx */ +/* end file simdjson/generic/ondemand/token_iterator-inl.h for lasx */ +/* including simdjson/generic/ondemand/value_iterator-inl.h for lasx: #include "simdjson/generic/ondemand/value_iterator-inl.h" */ +/* begin file simdjson/generic/ondemand/value_iterator-inl.h for lasx */ #ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -135142,7 +168133,7 @@ simdjson_inline simdjson_result<lsx::ondemand::token_iterator>::simdjson_result( /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lsx { +namespace lasx { namespace ondemand { simdjson_inline value_iterator::value_iterator( @@ -135224,7 +168215,6 @@ simdjson_warn_unused simdjson_inline error_code value_iterator::end_container() simdjson_warn_unused simdjson_inline simdjson_result<bool> value_iterator::has_next_field() noexcept { assert_at_next(); - // It's illegal to call this unless there are more tokens: anything that ends in } or ] is // obligated to verify there are more tokens if they are not the top level. switch (*_json_iter->return_current_and_advance()) { @@ -135646,9 +168636,13 @@ simdjson_warn_unused simdjson_inline simdjson_result<std::string_view> value_ite template <typename string_type> simdjson_warn_unused simdjson_inline error_code value_iterator::get_string(string_type& receiver, bool allow_replacement) noexcept { std::string_view content; + // Save the string buffer location so that we can restore it after get_string + auto saved_string_buf_loc = _json_iter->string_buf_loc(); auto err = get_string(allow_replacement).get(content); if (err) { return err; } receiver = content; + // Restore the string buffer location, effectively discarding any temporary string storage + _json_iter->string_buf_loc() = saved_string_buf_loc; return SUCCESS; } simdjson_warn_unused simdjson_inline simdjson_result<std::string_view> value_iterator::get_wobbly_string() noexcept { @@ -135736,7 +168730,7 @@ simdjson_inline simdjson_result<bool> value_iterator::is_root_integer(bool check return answer; } -simdjson_inline simdjson_result<lsx::number_type> value_iterator::get_root_number_type(bool check_trailing) noexcept { +simdjson_inline simdjson_result<lasx::number_type> value_iterator::get_root_number_type(bool check_trailing) noexcept { auto max_len = peek_root_length(); auto json = peek_root_scalar("number"); // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/, @@ -135788,9 +168782,13 @@ simdjson_warn_unused simdjson_inline simdjson_result<std::string_view> value_ite template <typename string_type> simdjson_warn_unused simdjson_inline error_code value_iterator::get_root_string(string_type& receiver, bool check_trailing, bool allow_replacement) noexcept { std::string_view content; + // Save the string buffer location so that we can restore it after get_string + auto saved_string_buf_loc = _json_iter->string_buf_loc(); auto err = get_root_string(check_trailing, allow_replacement).get(content); if (err) { return err; } receiver = content; + // Restore the string buffer location, effectively discarding any temporary string storage + _json_iter->string_buf_loc() = saved_string_buf_loc; return SUCCESS; } simdjson_warn_unused simdjson_inline simdjson_result<std::string_view> value_iterator::get_root_wobbly_string(bool check_trailing) noexcept { @@ -135940,1388 +168938,538 @@ simdjson_inline simdjson_result<bool> value_iterator::is_root_null(bool check_tr } simdjson_warn_unused simdjson_inline error_code value_iterator::skip_child() noexcept { - SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); - SIMDJSON_ASSUME( _json_iter->_depth >= _depth ); - - return _json_iter->skip_child(depth()); -} - -simdjson_inline value_iterator value_iterator::child() const noexcept { - assert_at_child(); - return { _json_iter, depth()+1, _json_iter->token.position() }; -} - -// GCC 7 warns when the first line of this function is inlined away into oblivion due to the caller -// relating depth and iterator depth, which is a desired effect. It does not happen if is_open is -// marked non-inline. -SIMDJSON_PUSH_DISABLE_WARNINGS -SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING -simdjson_inline bool value_iterator::is_open() const noexcept { - return _json_iter->depth() >= depth(); -} -SIMDJSON_POP_DISABLE_WARNINGS - -simdjson_inline bool value_iterator::at_end() const noexcept { - return _json_iter->at_end(); -} - -simdjson_inline bool value_iterator::at_start() const noexcept { - return _json_iter->token.position() == start_position(); -} - -simdjson_inline bool value_iterator::at_first_field() const noexcept { - SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); - return _json_iter->token.position() == start_position() + 1; -} - -simdjson_inline void value_iterator::abandon() noexcept { - _json_iter->abandon(); -} - -simdjson_warn_unused simdjson_inline depth_t value_iterator::depth() const noexcept { - return _depth; -} -simdjson_warn_unused simdjson_inline error_code value_iterator::error() const noexcept { - return _json_iter->error; -} -simdjson_warn_unused simdjson_inline uint8_t *&value_iterator::string_buf_loc() noexcept { - return _json_iter->string_buf_loc(); -} -simdjson_warn_unused simdjson_inline const json_iterator &value_iterator::json_iter() const noexcept { - return *_json_iter; -} -simdjson_warn_unused simdjson_inline json_iterator &value_iterator::json_iter() noexcept { - return *_json_iter; -} - -simdjson_inline const uint8_t *value_iterator::peek_start() const noexcept { - return _json_iter->peek(start_position()); -} -simdjson_inline uint32_t value_iterator::peek_start_length() const noexcept { - return _json_iter->peek_length(start_position()); -} -simdjson_inline uint32_t value_iterator::peek_root_length() const noexcept { - return _json_iter->peek_root_length(start_position()); -} - -simdjson_inline const uint8_t *value_iterator::peek_scalar(const char *type) noexcept { - logger::log_value(*_json_iter, start_position(), depth(), type); - // If we're not at the position anymore, we don't want to advance the cursor. - if (!is_at_start()) { return peek_start(); } - - // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value. - assert_at_start(); - return _json_iter->peek(); -} - -simdjson_inline void value_iterator::advance_scalar(const char *type) noexcept { - logger::log_value(*_json_iter, start_position(), depth(), type); - // If we're not at the position anymore, we don't want to advance the cursor. - if (!is_at_start()) { return; } - - // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value. - assert_at_start(); - _json_iter->return_current_and_advance(); - _json_iter->ascend_to(depth()-1); -} - -simdjson_warn_unused simdjson_inline error_code value_iterator::start_container(uint8_t start_char, const char *incorrect_type_message, const char *type) noexcept { - logger::log_start_value(*_json_iter, start_position(), depth(), type); - // If we're not at the position anymore, we don't want to advance the cursor. - const uint8_t *json; - if (!is_at_start()) { -#if SIMDJSON_DEVELOPMENT_CHECKS - if (!is_at_iterator_start()) { return OUT_OF_ORDER_ITERATION; } -#endif - json = peek_start(); - if (*json != start_char) { return incorrect_type_error(incorrect_type_message); } - } else { - assert_at_start(); - /** - * We should be prudent. Let us peek. If it is not the right type, we - * return an error. Only once we have determined that we have the right - * type are we allowed to advance! - */ - json = _json_iter->peek(); - if (*json != start_char) { return incorrect_type_error(incorrect_type_message); } - _json_iter->return_current_and_advance(); - } - - - return SUCCESS; -} - - -simdjson_inline const uint8_t *value_iterator::peek_root_scalar(const char *type) noexcept { - logger::log_value(*_json_iter, start_position(), depth(), type); - if (!is_at_start()) { return peek_start(); } - - assert_at_root(); - return _json_iter->peek(); -} -simdjson_inline const uint8_t *value_iterator::peek_non_root_scalar(const char *type) noexcept { - logger::log_value(*_json_iter, start_position(), depth(), type); - if (!is_at_start()) { return peek_start(); } - - assert_at_non_root_start(); - return _json_iter->peek(); -} - -simdjson_inline void value_iterator::advance_root_scalar(const char *type) noexcept { - logger::log_value(*_json_iter, start_position(), depth(), type); - if (!is_at_start()) { return; } - - assert_at_root(); - _json_iter->return_current_and_advance(); - _json_iter->ascend_to(depth()-1); -} -simdjson_inline void value_iterator::advance_non_root_scalar(const char *type) noexcept { - logger::log_value(*_json_iter, start_position(), depth(), type); - if (!is_at_start()) { return; } - - assert_at_non_root_start(); - _json_iter->return_current_and_advance(); - _json_iter->ascend_to(depth()-1); -} - -simdjson_inline error_code value_iterator::incorrect_type_error(const char *message) const noexcept { - logger::log_error(*_json_iter, start_position(), depth(), message); - return INCORRECT_TYPE; -} - -simdjson_inline bool value_iterator::is_at_start() const noexcept { - return position() == start_position(); -} - -simdjson_inline bool value_iterator::is_at_key() const noexcept { - // Keys are at the same depth as the object. - // Note here that we could be safer and check that we are within an object, - // but we do not. - return _depth == _json_iter->_depth && *_json_iter->peek() == '"'; -} - -simdjson_inline bool value_iterator::is_at_iterator_start() const noexcept { - // We can legitimately be either at the first value ([1]), or after the array if it's empty ([]). - auto delta = position() - start_position(); - return delta == 1 || delta == 2; -} - -inline void value_iterator::assert_at_start() const noexcept { - SIMDJSON_ASSUME( _json_iter->token._position == _start_position ); - SIMDJSON_ASSUME( _json_iter->_depth == _depth ); - SIMDJSON_ASSUME( _depth > 0 ); -} - -inline void value_iterator::assert_at_container_start() const noexcept { - SIMDJSON_ASSUME( _json_iter->token._position == _start_position + 1 ); - SIMDJSON_ASSUME( _json_iter->_depth == _depth ); - SIMDJSON_ASSUME( _depth > 0 ); -} - -inline void value_iterator::assert_at_next() const noexcept { - SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); - SIMDJSON_ASSUME( _json_iter->_depth == _depth ); - SIMDJSON_ASSUME( _depth > 0 ); -} - -simdjson_inline void value_iterator::move_at_start() noexcept { - _json_iter->_depth = _depth; - _json_iter->token.set_position(_start_position); -} - -simdjson_inline void value_iterator::move_at_container_start() noexcept { - _json_iter->_depth = _depth; - _json_iter->token.set_position(_start_position + 1); -} - -simdjson_inline simdjson_result<bool> value_iterator::reset_array() noexcept { - if(error()) { return error(); } - move_at_container_start(); - return started_array(); -} - -simdjson_inline simdjson_result<bool> value_iterator::reset_object() noexcept { - if(error()) { return error(); } - move_at_container_start(); - return started_object(); -} - -inline void value_iterator::assert_at_child() const noexcept { - SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); - SIMDJSON_ASSUME( _json_iter->_depth == _depth + 1 ); - SIMDJSON_ASSUME( _depth > 0 ); -} - -inline void value_iterator::assert_at_root() const noexcept { - assert_at_start(); - SIMDJSON_ASSUME( _depth == 1 ); -} - -inline void value_iterator::assert_at_non_root_start() const noexcept { - assert_at_start(); - SIMDJSON_ASSUME( _depth > 1 ); -} - -inline void value_iterator::assert_is_valid() const noexcept { - SIMDJSON_ASSUME( _json_iter != nullptr ); -} - -simdjson_inline bool value_iterator::is_valid() const noexcept { - return _json_iter != nullptr; -} - -simdjson_inline simdjson_result<json_type> value_iterator::type() const noexcept { - switch (*peek_start()) { - case '{': - return json_type::object; - case '[': - return json_type::array; - case '"': - return json_type::string; - case 'n': - return json_type::null; - case 't': case 'f': - return json_type::boolean; - case '-': - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - return json_type::number; - default: - return json_type::unknown; - } -} - -simdjson_inline token_position value_iterator::start_position() const noexcept { - return _start_position; -} - -simdjson_inline token_position value_iterator::position() const noexcept { - return _json_iter->position(); -} - -simdjson_inline token_position value_iterator::end_position() const noexcept { - return _json_iter->end_position(); -} - -simdjson_inline token_position value_iterator::last_position() const noexcept { - return _json_iter->last_position(); -} - -simdjson_inline error_code value_iterator::report_error(error_code error, const char *message) noexcept { - return _json_iter->report_error(error, message); -} - -} // namespace ondemand -} // namespace lsx -} // namespace simdjson - -namespace simdjson { - -simdjson_inline simdjson_result<lsx::ondemand::value_iterator>::simdjson_result(lsx::ondemand::value_iterator &&value) noexcept - : implementation_simdjson_result_base<lsx::ondemand::value_iterator>(std::forward<lsx::ondemand::value_iterator>(value)) {} -simdjson_inline simdjson_result<lsx::ondemand::value_iterator>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<lsx::ondemand::value_iterator>(error) {} - -} // namespace simdjson - -#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H -/* end file simdjson/generic/ondemand/value_iterator-inl.h for lsx */ - -// JSON builder inline definitions -/* including simdjson/generic/ondemand/json_string_builder-inl.h for lsx: #include "simdjson/generic/ondemand/json_string_builder-inl.h" */ -/* begin file simdjson/generic/ondemand/json_string_builder-inl.h for lsx */ -/** - * This file is part of the builder API. It is temporarily in the ondemand - * directory but we will move it to a builder directory later. - */ -#include <array> -#include <cstring> -#include <type_traits> -#ifndef SIMDJSON_GENERIC_STRING_BUILDER_INL_H - -/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_INL_H */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_string_builder.h" */ -/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ - -/* - * Empirically, we have found that an inlined optimization is important for - * performance. The following macros are not ideal. We should find a better - * way to inline the code. - */ - -#if defined(__SSE2__) || defined(__x86_64__) || defined(__x86_64) || \ - (defined(_M_AMD64) || defined(_M_X64) || \ - (defined(_M_IX86_FP) && _M_IX86_FP == 2)) -#ifndef SIMDJSON_EXPERIMENTAL_HAS_SSE2 -#define SIMDJSON_EXPERIMENTAL_HAS_SSE2 1 -#endif -#endif - -#if defined(__aarch64__) || defined(_M_ARM64) -#ifndef SIMDJSON_EXPERIMENTAL_HAS_NEON -#define SIMDJSON_EXPERIMENTAL_HAS_NEON 1 -#endif -#endif -#if SIMDJSON_EXPERIMENTAL_HAS_NEON -#include <arm_neon.h> -#endif -#if SIMDJSON_EXPERIMENTAL_HAS_SSE2 -#include <emmintrin.h> -#endif - -namespace simdjson { -namespace lsx { -namespace builder { - -static SIMDJSON_CONSTEXPR_LAMBDA std::array<uint8_t, 256> - json_quotable_character = { - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - -/** - -A possible SWAR implementation of has_json_escapable_byte. It is not used -because it is slower than the current implementation. It is kept here for -reference (to show that we tried it). - -inline bool has_json_escapable_byte(uint64_t x) { - uint64_t is_ascii = 0x8080808080808080ULL & ~x; - uint64_t xor2 = x ^ 0x0202020202020202ULL; - uint64_t lt32_or_eq34 = xor2 - 0x2121212121212121ULL; - uint64_t sub92 = x ^ 0x5C5C5C5C5C5C5C5CULL; - uint64_t eq92 = (sub92 - 0x0101010101010101ULL); - return ((lt32_or_eq34 | eq92) & is_ascii) != 0; -} - -**/ - -SIMDJSON_CONSTEXPR_LAMBDA simdjson_inline bool -simple_needs_escaping(std::string_view v) { - for (char c : v) { - // a table lookup is faster than a series of comparisons - if (json_quotable_character[static_cast<uint8_t>(c)]) { - return true; - } - } - return false; -} - -#if SIMDJSON_EXPERIMENTAL_HAS_NEON -simdjson_inline bool fast_needs_escaping(std::string_view view) { - if (view.size() < 16) { - return simple_needs_escaping(view); - } - size_t i = 0; - uint8x16_t running = vdupq_n_u8(0); - uint8x16_t v34 = vdupq_n_u8(34); - uint8x16_t v92 = vdupq_n_u8(92); - - for (; i + 15 < view.size(); i += 16) { - uint8x16_t word = vld1q_u8((const uint8_t *)view.data() + i); - running = vorrq_u8(running, vceqq_u8(word, v34)); - running = vorrq_u8(running, vceqq_u8(word, v92)); - running = vorrq_u8(running, vcltq_u8(word, vdupq_n_u8(32))); - } - if (i < view.size()) { - uint8x16_t word = - vld1q_u8((const uint8_t *)view.data() + view.length() - 16); - running = vorrq_u8(running, vceqq_u8(word, v34)); - running = vorrq_u8(running, vceqq_u8(word, v92)); - running = vorrq_u8(running, vcltq_u8(word, vdupq_n_u8(32))); - } - return vmaxvq_u32(vreinterpretq_u32_u8(running)) != 0; -} -#elif SIMDJSON_EXPERIMENTAL_HAS_SSE2 -simdjson_inline bool fast_needs_escaping(std::string_view view) { - if (view.size() < 16) { - return simple_needs_escaping(view); - } - size_t i = 0; - __m128i running = _mm_setzero_si128(); - for (; i + 15 < view.size(); i += 16) { - - __m128i word = - _mm_loadu_si128(reinterpret_cast<const __m128i *>(view.data() + i)); - running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(34))); - running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(92))); - running = _mm_or_si128( - running, _mm_cmpeq_epi8(_mm_subs_epu8(word, _mm_set1_epi8(31)), - _mm_setzero_si128())); - } - if (i < view.size()) { - __m128i word = _mm_loadu_si128( - reinterpret_cast<const __m128i *>(view.data() + view.length() - 16)); - running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(34))); - running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(92))); - running = _mm_or_si128( - running, _mm_cmpeq_epi8(_mm_subs_epu8(word, _mm_set1_epi8(31)), - _mm_setzero_si128())); - } - return _mm_movemask_epi8(running) != 0; -} -#else -simdjson_inline bool fast_needs_escaping(std::string_view view) { - return simple_needs_escaping(view); -} -#endif - -SIMDJSON_CONSTEXPR_LAMBDA inline size_t -find_next_json_quotable_character(const std::string_view view, - size_t location) noexcept { - - for (auto pos = view.begin() + location; pos != view.end(); ++pos) { - if (json_quotable_character[static_cast<uint8_t>(*pos)]) { - return pos - view.begin(); - } - } - return size_t(view.size()); -} - -SIMDJSON_CONSTEXPR_LAMBDA static std::string_view control_chars[] = { - "\\u0000", "\\u0001", "\\u0002", "\\u0003", "\\u0004", "\\u0005", "\\u0006", - "\\u0007", "\\b", "\\t", "\\n", "\\u000b", "\\f", "\\r", - "\\u000e", "\\u000f", "\\u0010", "\\u0011", "\\u0012", "\\u0013", "\\u0014", - "\\u0015", "\\u0016", "\\u0017", "\\u0018", "\\u0019", "\\u001a", "\\u001b", - "\\u001c", "\\u001d", "\\u001e", "\\u001f"}; - -// All Unicode characters may be placed within the quotation marks, except for -// the characters that MUST be escaped: quotation mark, reverse solidus, and the -// control characters (U+0000 through U+001F). There are two-character sequence -// escape representations of some popular characters: -// \", \\, \b, \f, \n, \r, \t. -SIMDJSON_CONSTEXPR_LAMBDA void escape_json_char(char c, char *&out) { - if (c == '"') { - memcpy(out, "\\\"", 2); - out += 2; - } else if (c == '\\') { - memcpy(out, "\\\\", 2); - out += 2; - } else { - std::string_view v = control_chars[uint8_t(c)]; - memcpy(out, v.data(), v.size()); - out += v.size(); - } -} - -inline size_t write_string_escaped(const std::string_view input, char *out) { - size_t mysize = input.size(); - if (!fast_needs_escaping(input)) { // fast path! - memcpy(out, input.data(), input.size()); - return input.size(); - } - const char *const initout = out; - size_t location = find_next_json_quotable_character(input, 0); - memcpy(out, input.data(), location); - out += location; - escape_json_char(input[location], out); - location += 1; - while (location < mysize) { - size_t newlocation = find_next_json_quotable_character(input, location); - memcpy(out, input.data() + location, newlocation - location); - out += newlocation - location; - location = newlocation; - if (location == mysize) { - break; - } - escape_json_char(input[location], out); - location += 1; - } - return out - initout; -} - -simdjson_inline string_builder::string_builder(size_t initial_capacity) - : buffer(new(std::nothrow) char[initial_capacity]), position(0), - capacity(buffer.get() != nullptr ? initial_capacity : 0), - is_valid(buffer.get() != nullptr) {} - -simdjson_inline bool string_builder::capacity_check(size_t upcoming_bytes) { - // We use the convention that when is_valid is false, then the capacity and - // the position are 0. - // Most of the time, this function will return true. - if (simdjson_likely(upcoming_bytes <= capacity - position)) { - return true; - } - // check for overflow, most of the time there is no overflow - if (simdjson_likely(position + upcoming_bytes < position)) { - return false; - } - // We will rarely get here. - grow_buffer((std::max)(capacity * 2, position + upcoming_bytes)); - // If the buffer allocation failed, we set is_valid to false. - return is_valid; -} - -simdjson_inline void string_builder::grow_buffer(size_t desired_capacity) { - if (!is_valid) { - return; - } - std::unique_ptr<char[]> new_buffer(new (std::nothrow) char[desired_capacity]); - if (new_buffer.get() == nullptr) { - set_valid(false); - return; - } - std::memcpy(new_buffer.get(), buffer.get(), position); - buffer.swap(new_buffer); - capacity = desired_capacity; -} - -simdjson_inline void string_builder::set_valid(bool valid) noexcept { - if (!valid) { - is_valid = false; - capacity = 0; - position = 0; - buffer.reset(); - } else { - is_valid = true; - } -} - -simdjson_inline size_t string_builder::size() const noexcept { - return position; -} - -simdjson_inline void string_builder::append(char c) noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = c; - } -} - -simdjson_inline void string_builder::append_null() noexcept { - constexpr char null_literal[] = "null"; - constexpr size_t null_len = sizeof(null_literal) - 1; - if (capacity_check(null_len)) { - std::memcpy(buffer.get() + position, null_literal, null_len); - position += null_len; - } -} - -simdjson_inline void string_builder::clear() noexcept { - position = 0; - // if it was invalid, we should try to repair it - if (!is_valid) { - capacity = 0; - buffer.reset(); - is_valid = true; - } -} - -namespace internal { - -template <typename number_type, typename = typename std::enable_if< - std::is_unsigned<number_type>::value>::type> -simdjson_really_inline int int_log2(number_type x) { - return 63 - leading_zeroes(uint64_t(x) | 1); -} - -simdjson_really_inline int fast_digit_count_32(uint32_t x) { - static uint64_t table[] = { - 4294967296, 8589934582, 8589934582, 8589934582, 12884901788, - 12884901788, 12884901788, 17179868184, 17179868184, 17179868184, - 21474826480, 21474826480, 21474826480, 21474826480, 25769703776, - 25769703776, 25769703776, 30063771072, 30063771072, 30063771072, - 34349738368, 34349738368, 34349738368, 34349738368, 38554705664, - 38554705664, 38554705664, 41949672960, 41949672960, 41949672960, - 42949672960, 42949672960}; - return uint32_t((x + table[int_log2(x)]) >> 32); -} - -simdjson_really_inline int fast_digit_count_64(uint64_t x) { - static uint64_t table[] = {9, - 99, - 999, - 9999, - 99999, - 999999, - 9999999, - 99999999, - 999999999, - 9999999999, - 99999999999, - 999999999999, - 9999999999999, - 99999999999999, - 999999999999999ULL, - 9999999999999999ULL, - 99999999999999999ULL, - 999999999999999999ULL, - 9999999999999999999ULL}; - int y = (19 * int_log2(x) >> 6); - y += x > table[y]; - return y + 1; -} - -template <typename number_type, typename = typename std::enable_if< - std::is_unsigned<number_type>::value>::type> -simdjson_really_inline size_t digit_count(number_type v) noexcept { - static_assert(sizeof(number_type) == 8 || sizeof(number_type) == 4 || - sizeof(number_type) == 2 || sizeof(number_type) == 1, - "We only support 8-bit, 16-bit, 32-bit and 64-bit numbers"); - SIMDJSON_IF_CONSTEXPR(sizeof(number_type) <= 4) { - return fast_digit_count_32(static_cast<uint32_t>(v)); - } - else { - return fast_digit_count_64(static_cast<uint64_t>(v)); - } -} -static const char decimal_table[200] = { - 0x30, 0x30, 0x30, 0x31, 0x30, 0x32, 0x30, 0x33, 0x30, 0x34, 0x30, 0x35, - 0x30, 0x36, 0x30, 0x37, 0x30, 0x38, 0x30, 0x39, 0x31, 0x30, 0x31, 0x31, - 0x31, 0x32, 0x31, 0x33, 0x31, 0x34, 0x31, 0x35, 0x31, 0x36, 0x31, 0x37, - 0x31, 0x38, 0x31, 0x39, 0x32, 0x30, 0x32, 0x31, 0x32, 0x32, 0x32, 0x33, - 0x32, 0x34, 0x32, 0x35, 0x32, 0x36, 0x32, 0x37, 0x32, 0x38, 0x32, 0x39, - 0x33, 0x30, 0x33, 0x31, 0x33, 0x32, 0x33, 0x33, 0x33, 0x34, 0x33, 0x35, - 0x33, 0x36, 0x33, 0x37, 0x33, 0x38, 0x33, 0x39, 0x34, 0x30, 0x34, 0x31, - 0x34, 0x32, 0x34, 0x33, 0x34, 0x34, 0x34, 0x35, 0x34, 0x36, 0x34, 0x37, - 0x34, 0x38, 0x34, 0x39, 0x35, 0x30, 0x35, 0x31, 0x35, 0x32, 0x35, 0x33, - 0x35, 0x34, 0x35, 0x35, 0x35, 0x36, 0x35, 0x37, 0x35, 0x38, 0x35, 0x39, - 0x36, 0x30, 0x36, 0x31, 0x36, 0x32, 0x36, 0x33, 0x36, 0x34, 0x36, 0x35, - 0x36, 0x36, 0x36, 0x37, 0x36, 0x38, 0x36, 0x39, 0x37, 0x30, 0x37, 0x31, - 0x37, 0x32, 0x37, 0x33, 0x37, 0x34, 0x37, 0x35, 0x37, 0x36, 0x37, 0x37, - 0x37, 0x38, 0x37, 0x39, 0x38, 0x30, 0x38, 0x31, 0x38, 0x32, 0x38, 0x33, - 0x38, 0x34, 0x38, 0x35, 0x38, 0x36, 0x38, 0x37, 0x38, 0x38, 0x38, 0x39, - 0x39, 0x30, 0x39, 0x31, 0x39, 0x32, 0x39, 0x33, 0x39, 0x34, 0x39, 0x35, - 0x39, 0x36, 0x39, 0x37, 0x39, 0x38, 0x39, 0x39, -}; -} // namespace internal - -template <typename number_type, typename> -simdjson_inline void string_builder::append(number_type v) noexcept { - static_assert(std::is_same<number_type, bool>::value || - std::is_integral<number_type>::value || - std::is_floating_point<number_type>::value, - "Unsupported number type"); - // If C++17 is available, we can 'if constexpr' here. - SIMDJSON_IF_CONSTEXPR(std::is_same<number_type, bool>::value) { - if (v) { - constexpr char true_literal[] = "true"; - constexpr size_t true_len = sizeof(true_literal) - 1; - if (capacity_check(true_len)) { - std::memcpy(buffer.get() + position, true_literal, true_len); - position += true_len; - } - } else { - constexpr char false_literal[] = "false"; - constexpr size_t false_len = sizeof(false_literal) - 1; - if (capacity_check(false_len)) { - std::memcpy(buffer.get() + position, false_literal, false_len); - position += false_len; - } - } - } - else SIMDJSON_IF_CONSTEXPR(std::is_unsigned<number_type>::value) { - constexpr size_t max_number_size = 20; - if (capacity_check(max_number_size)) { - using unsigned_type = typename std::make_unsigned<number_type>::type; - unsigned_type pv = static_cast<unsigned_type>(v); - size_t dc = internal::digit_count(pv); - char *write_pointer = buffer.get() + position + dc - 1; - while (pv >= 100) { - memcpy(write_pointer - 1, &internal::decimal_table[(pv % 100) * 2], 2); - write_pointer -= 2; - pv /= 100; - } - if (pv >= 10) { - *write_pointer-- = char('0' + (pv % 10)); - pv /= 10; - } - *write_pointer = char('0' + pv); - position += dc; - } - } - else SIMDJSON_IF_CONSTEXPR(std::is_integral<number_type>::value) { - constexpr size_t max_number_size = 20; - if (capacity_check(max_number_size)) { - using unsigned_type = typename std::make_unsigned<number_type>::type; - bool negative = v < 0; - unsigned_type pv = static_cast<unsigned_type>(v); - if (negative) { - pv = 0 - pv; // the 0 is for Microsoft - } - size_t dc = internal::digit_count(pv); - // by always writing the minus sign, we avoid the branch. - buffer.get()[position] = '-'; - position += negative ? 1 : 0; - char *write_pointer = buffer.get() + position + dc - 1; - while (pv >= 100) { - memcpy(write_pointer - 1, &internal::decimal_table[(pv % 100) * 2], 2); - write_pointer -= 2; - pv /= 100; - } - if (pv >= 10) { - *write_pointer-- = char('0' + (pv % 10)); - pv /= 10; - } - *write_pointer = char('0' + pv); - position += dc; - } - } - else SIMDJSON_IF_CONSTEXPR(std::is_floating_point<number_type>::value) { - constexpr size_t max_number_size = 24; - if (capacity_check(max_number_size)) { - // We could specialize for float. - char *end = simdjson::internal::to_chars(buffer.get() + position, nullptr, - double(v)); - position = end - buffer.get(); - } - } + SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); + SIMDJSON_ASSUME( _json_iter->_depth >= _depth ); + + return _json_iter->skip_child(depth()); } -simdjson_inline void -string_builder::escape_and_append(std::string_view input) noexcept { - // escaping might turn a control character into \x00xx so 6 characters. - if (capacity_check(6 * input.size())) { - position += write_string_escaped(input, buffer.get() + position); - } +simdjson_inline value_iterator value_iterator::child() const noexcept { + assert_at_child(); + return { _json_iter, depth()+1, _json_iter->token.position() }; } -simdjson_inline void -string_builder::escape_and_append_with_quotes(std::string_view input) noexcept { - // escaping might turn a control character into \x00xx so 6 characters. - if (capacity_check(2 + 6 * input.size())) { - buffer.get()[position++] = '"'; - position += write_string_escaped(input, buffer.get() + position); - buffer.get()[position++] = '"'; - } +// GCC 7 warns when the first line of this function is inlined away into oblivion due to the caller +// relating depth and iterator depth, which is a desired effect. It does not happen if is_open is +// marked non-inline. +SIMDJSON_PUSH_DISABLE_WARNINGS +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING +simdjson_inline bool value_iterator::is_open() const noexcept { + return _json_iter->depth() >= depth(); } +SIMDJSON_POP_DISABLE_WARNINGS -simdjson_inline void -string_builder::escape_and_append_with_quotes(char input) noexcept { - // escaping might turn a control character into \x00xx so 6 characters. - if (capacity_check(2 + 6 * 1)) { - buffer.get()[position++] = '"'; - std::string_view cinput(&input, 1); - position += write_string_escaped(cinput, buffer.get() + position); - buffer.get()[position++] = '"'; - } +simdjson_inline bool value_iterator::at_end() const noexcept { + return _json_iter->at_end(); } -simdjson_inline void -string_builder::escape_and_append_with_quotes(const char *input) noexcept { - std::string_view cinput(input); - escape_and_append_with_quotes(cinput); +simdjson_inline bool value_iterator::at_start() const noexcept { + return _json_iter->token.position() == start_position(); } -#if SIMDJSON_SUPPORTS_CONCEPTS -template <constevalutil::fixed_string key> -simdjson_inline void string_builder::escape_and_append_with_quotes() noexcept { - escape_and_append_with_quotes(constevalutil::string_constant<key>::value); + +simdjson_inline bool value_iterator::at_first_field() const noexcept { + SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); + return _json_iter->token.position() == start_position() + 1; } -#endif -simdjson_inline void string_builder::append_raw(const char *c) noexcept { - size_t len = std::strlen(c); - append_raw(c, len); +simdjson_inline void value_iterator::abandon() noexcept { + _json_iter->abandon(); } -simdjson_inline void -string_builder::append_raw(std::string_view input) noexcept { - if (capacity_check(input.size())) { - std::memcpy(buffer.get() + position, input.data(), input.size()); - position += input.size(); - } +simdjson_warn_unused simdjson_inline depth_t value_iterator::depth() const noexcept { + return _depth; +} +simdjson_warn_unused simdjson_inline error_code value_iterator::error() const noexcept { + return _json_iter->error; +} +simdjson_warn_unused simdjson_inline uint8_t *&value_iterator::string_buf_loc() noexcept { + return _json_iter->string_buf_loc(); +} +simdjson_warn_unused simdjson_inline const json_iterator &value_iterator::json_iter() const noexcept { + return *_json_iter; +} +simdjson_warn_unused simdjson_inline json_iterator &value_iterator::json_iter() noexcept { + return *_json_iter; } -simdjson_inline void string_builder::append_raw(const char *str, - size_t len) noexcept { - if (capacity_check(len)) { - std::memcpy(buffer.get() + position, str, len); - position += len; - } +simdjson_inline const uint8_t *value_iterator::peek_start() const noexcept { + return _json_iter->peek(start_position()); } -#if SIMDJSON_SUPPORTS_CONCEPTS -// Support for optional types (std::optional, etc.) -template <concepts::optional_type T> - requires(!require_custom_serialization<T>) -simdjson_inline void string_builder::append(const T &opt) { - if (opt) { - append(*opt); - } else { - append_null(); - } +simdjson_inline uint32_t value_iterator::peek_start_length() const noexcept { + return _json_iter->peek_length(start_position()); +} +simdjson_inline uint32_t value_iterator::peek_root_length() const noexcept { + return _json_iter->peek_root_length(start_position()); } -template <typename T> - requires(require_custom_serialization<T>) -simdjson_inline void string_builder::append(T &&val) { - serialize(*this, std::forward<T>(val)); +simdjson_inline const uint8_t *value_iterator::peek_scalar(const char *type) noexcept { + logger::log_value(*_json_iter, start_position(), depth(), type); + // If we're not at the position anymore, we don't want to advance the cursor. + if (!is_at_start()) { return peek_start(); } + + // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value. + assert_at_start(); + return _json_iter->peek(); } -template <typename T> - requires(std::is_convertible<T, std::string_view>::value || - std::is_same<T, const char *>::value) -simdjson_inline void string_builder::append(const T &value) { - escape_and_append_with_quotes(value); +simdjson_inline void value_iterator::advance_scalar(const char *type) noexcept { + logger::log_value(*_json_iter, start_position(), depth(), type); + // If we're not at the position anymore, we don't want to advance the cursor. + if (!is_at_start()) { return; } + + // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value. + assert_at_start(); + _json_iter->return_current_and_advance(); + _json_iter->ascend_to(depth()-1); } + +simdjson_warn_unused simdjson_inline error_code value_iterator::start_container(uint8_t start_char, const char *incorrect_type_message, const char *type) noexcept { + logger::log_start_value(*_json_iter, start_position(), depth(), type); + // If we're not at the position anymore, we don't want to advance the cursor. + const uint8_t *json; + if (!is_at_start()) { +#if SIMDJSON_DEVELOPMENT_CHECKS + if (!is_at_iterator_start()) { return OUT_OF_ORDER_ITERATION; } #endif + json = peek_start(); + if (*json != start_char) { return incorrect_type_error(incorrect_type_message); } + } else { + assert_at_start(); + /** + * We should be prudent. Let us peek. If it is not the right type, we + * return an error. Only once we have determined that we have the right + * type are we allowed to advance! + */ + json = _json_iter->peek(); + if (*json != start_char) { return incorrect_type_error(incorrect_type_message); } + _json_iter->return_current_and_advance(); + } -#if SIMDJSON_SUPPORTS_RANGES && SIMDJSON_SUPPORTS_CONCEPTS -// Support for range-based appending (std::ranges::view, etc.) -template <std::ranges::range R> - requires(!std::is_convertible<R, std::string_view>::value && !require_custom_serialization<R>) -simdjson_inline void string_builder::append(const R &range) noexcept { - auto it = std::ranges::begin(range); - auto end = std::ranges::end(range); - if constexpr (concepts::is_pair<std::ranges::range_value_t<R>>) { - start_object(); - if (it == end) { - end_object(); - return; // Handle empty range - } - // Append first item without leading comma - append_key_value(it->first, it->second); - ++it; + return SUCCESS; +} - // Append remaining items with preceding commas - for (; it != end; ++it) { - append_comma(); - append_key_value(it->first, it->second); - } - end_object(); - } else { - start_array(); - if (it == end) { - end_array(); - return; // Handle empty range - } - // Append first item without leading comma - append(*it); - ++it; +simdjson_inline const uint8_t *value_iterator::peek_root_scalar(const char *type) noexcept { + logger::log_value(*_json_iter, start_position(), depth(), type); + if (!is_at_start()) { return peek_start(); } - // Append remaining items with preceding commas - for (; it != end; ++it) { - append_comma(); - append(*it); - } - end_array(); - } + assert_at_root(); + return _json_iter->peek(); } +simdjson_inline const uint8_t *value_iterator::peek_non_root_scalar(const char *type) noexcept { + logger::log_value(*_json_iter, start_position(), depth(), type); + if (!is_at_start()) { return peek_start(); } -#endif + assert_at_non_root_start(); + return _json_iter->peek(); +} -#if SIMDJSON_EXCEPTIONS -simdjson_inline string_builder::operator std::string() const noexcept(false) { - return std::string(operator std::string_view()); +simdjson_inline void value_iterator::advance_root_scalar(const char *type) noexcept { + logger::log_value(*_json_iter, start_position(), depth(), type); + if (!is_at_start()) { return; } + + assert_at_root(); + _json_iter->return_current_and_advance(); + _json_iter->ascend_to(depth()-1); } +simdjson_inline void value_iterator::advance_non_root_scalar(const char *type) noexcept { + logger::log_value(*_json_iter, start_position(), depth(), type); + if (!is_at_start()) { return; } -simdjson_inline string_builder::operator std::string_view() const - noexcept(false) simdjson_lifetime_bound { - return view(); + assert_at_non_root_start(); + _json_iter->return_current_and_advance(); + _json_iter->ascend_to(depth()-1); } -#endif -simdjson_inline simdjson_result<std::string_view> -string_builder::view() const noexcept { - if (!is_valid) { - return simdjson::OUT_OF_CAPACITY; - } - return std::string_view(buffer.get(), position); +simdjson_inline error_code value_iterator::incorrect_type_error(const char *message) const noexcept { + logger::log_error(*_json_iter, start_position(), depth(), message); + return INCORRECT_TYPE; } -simdjson_inline simdjson_result<const char *> string_builder::c_str() noexcept { - if (capacity_check(1)) { - buffer.get()[position] = '\0'; - return buffer.get(); - } - return simdjson::OUT_OF_CAPACITY; +simdjson_inline bool value_iterator::is_at_start() const noexcept { + return position() == start_position(); } -simdjson_inline bool string_builder::validate_unicode() const noexcept { - return simdjson::validate_utf8(buffer.get(), position); +simdjson_inline bool value_iterator::is_at_key() const noexcept { + // Keys are at the same depth as the object. + // Note here that we could be safer and check that we are within an object, + // but we do not. + // + // As long as we are at the object's depth, in a valid document, + // we will only ever be at { , : or the actual string key: ". + return _depth == _json_iter->_depth && *_json_iter->peek() == '"'; } -simdjson_inline void string_builder::start_object() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = '{'; - } +simdjson_inline bool value_iterator::is_at_iterator_start() const noexcept { + // We can legitimately be either at the first value ([1]), or after the array if it's empty ([]). + auto delta = position() - start_position(); + return delta == 1 || delta == 2; } -simdjson_inline void string_builder::end_object() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = '}'; - } +inline void value_iterator::assert_at_start() const noexcept { + SIMDJSON_ASSUME( _json_iter->token._position == _start_position ); + SIMDJSON_ASSUME( _json_iter->_depth == _depth ); + SIMDJSON_ASSUME( _depth > 0 ); } -simdjson_inline void string_builder::start_array() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = '['; - } +inline void value_iterator::assert_at_container_start() const noexcept { + SIMDJSON_ASSUME( _json_iter->token._position == _start_position + 1 ); + SIMDJSON_ASSUME( _json_iter->_depth == _depth ); + SIMDJSON_ASSUME( _depth > 0 ); } -simdjson_inline void string_builder::end_array() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = ']'; - } +inline void value_iterator::assert_at_next() const noexcept { + SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); + SIMDJSON_ASSUME( _json_iter->_depth == _depth ); + SIMDJSON_ASSUME( _depth > 0 ); } -simdjson_inline void string_builder::append_comma() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = ','; - } +simdjson_inline void value_iterator::move_at_start() noexcept { + _json_iter->_depth = _depth; + _json_iter->token.set_position(_start_position); } -simdjson_inline void string_builder::append_colon() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = ':'; - } +simdjson_inline void value_iterator::move_at_container_start() noexcept { + _json_iter->_depth = _depth; + _json_iter->token.set_position(_start_position + 1); } -template <typename key_type, typename value_type> -simdjson_inline void -string_builder::append_key_value(key_type key, value_type value) noexcept { - static_assert(std::is_same<key_type, const char *>::value || - std::is_convertible<key_type, std::string_view>::value, - "Unsupported key type"); - escape_and_append_with_quotes(key); - append_colon(); - SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, std::nullptr_t>::value) { - append_null(); - } - else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, char>::value) { - escape_and_append_with_quotes(value); - } - else SIMDJSON_IF_CONSTEXPR( - std::is_convertible<value_type, std::string_view>::value) { - escape_and_append_with_quotes(value); - } - else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, const char *>::value) { - escape_and_append_with_quotes(value); - } - else { - append(value); - } +simdjson_inline simdjson_result<bool> value_iterator::reset_array() noexcept { + if(error()) { return error(); } + move_at_container_start(); + return started_array(); } -#if SIMDJSON_SUPPORTS_CONCEPTS -template <constevalutil::fixed_string key, typename value_type> -simdjson_inline void -string_builder::append_key_value(value_type value) noexcept { - escape_and_append_with_quotes<key>(); - append_colon(); - SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, std::nullptr_t>::value) { - append_null(); - } - else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, char>::value) { - escape_and_append_with_quotes(value); - } - else SIMDJSON_IF_CONSTEXPR( - std::is_convertible<value_type, std::string_view>::value) { - escape_and_append_with_quotes(value); - } - else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, const char *>::value) { - escape_and_append_with_quotes(value); - } - else { - append(value); - } +simdjson_inline simdjson_result<bool> value_iterator::reset_object() noexcept { + if(error()) { return error(); } + move_at_container_start(); + return started_object(); } -#endif -} // namespace builder -} // namespace lsx -} // namespace simdjson +inline void value_iterator::assert_at_child() const noexcept { + SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); + SIMDJSON_ASSUME( _json_iter->_depth == _depth + 1 ); + SIMDJSON_ASSUME( _depth > 0 ); +} -#endif // SIMDJSON_GENERIC_STRING_BUILDER_INL_H -/* end file simdjson/generic/ondemand/json_string_builder-inl.h for lsx */ -/* including simdjson/generic/ondemand/json_builder.h for lsx: #include "simdjson/generic/ondemand/json_builder.h" */ -/* begin file simdjson/generic/ondemand/json_builder.h for lsx */ -/** - * This file is part of the builder API. It is temporarily in the ondemand directory - * but we will move it to a builder directory later. - */ -#ifndef SIMDJSON_GENERIC_BUILDER_H +inline void value_iterator::assert_at_root() const noexcept { + assert_at_start(); + SIMDJSON_ASSUME( _depth == 1 ); +} -/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_H */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_string_builder.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/concepts.h" */ -/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -#if SIMDJSON_STATIC_REFLECTION +inline void value_iterator::assert_at_non_root_start() const noexcept { + assert_at_start(); + SIMDJSON_ASSUME( _depth > 1 ); +} -#include <charconv> -#include <cstring> -#include <meta> -#include <memory> -#include <optional> -#include <string_view> -#include <type_traits> -#include <utility> -// #include <static_reflection> // for std::define_static_string - header not available yet +inline void value_iterator::assert_is_valid() const noexcept { + SIMDJSON_ASSUME( _json_iter != nullptr ); +} -namespace simdjson { -namespace lsx { -namespace builder { +simdjson_inline bool value_iterator::is_valid() const noexcept { + return _json_iter != nullptr; +} -template <class T> - requires(concepts::container_but_not_string<T> && !require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &t) { - auto it = t.begin(); - auto end = t.end(); - if (it == end) { - b.append_raw("[]"); - return; - } - b.append('['); - atom(b, *it); - ++it; - for (; it != end; ++it) { - b.append(','); - atom(b, *it); +simdjson_inline simdjson_result<json_type> value_iterator::type() const noexcept { + switch (*peek_start()) { + case '{': + return json_type::object; + case '[': + return json_type::array; + case '"': + return json_type::string; + case 'n': + return json_type::null; + case 't': case 'f': + return json_type::boolean; + case '-': + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + return json_type::number; + default: + return json_type::unknown; } - b.append(']'); } -template <class T> - requires(std::is_same_v<T, std::string> || - std::is_same_v<T, std::string_view> || - std::is_same_v<T, const char *> || - std::is_same_v<T, char>) -constexpr void atom(string_builder &b, const T &t) { - b.escape_and_append_with_quotes(t); +simdjson_inline token_position value_iterator::start_position() const noexcept { + return _start_position; } -template <concepts::string_view_keyed_map T> - requires(!require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &m) { - if (m.empty()) { - b.append_raw("{}"); - return; - } - b.append('{'); - bool first = true; - for (const auto& [key, value] : m) { - if (!first) { - b.append(','); - } - first = false; - // Keys must be convertible to string_view per the concept - b.escape_and_append_with_quotes(key); - b.append(':'); - atom(b, value); - } - b.append('}'); +simdjson_inline token_position value_iterator::position() const noexcept { + return _json_iter->position(); } +simdjson_inline token_position value_iterator::end_position() const noexcept { + return _json_iter->end_position(); +} -template<typename number_type, - typename = typename std::enable_if<std::is_arithmetic<number_type>::value && !std::is_same_v<number_type, char>>::type> -constexpr void atom(string_builder &b, const number_type t) { - b.append(t); +simdjson_inline token_position value_iterator::last_position() const noexcept { + return _json_iter->last_position(); } -template <class T> - requires(std::is_class_v<T> && !concepts::container_but_not_string<T> && - !concepts::string_view_keyed_map<T> && - !concepts::optional_type<T> && - !concepts::smart_pointer<T> && - !concepts::appendable_containers<T> && - !std::is_same_v<T, std::string> && - !std::is_same_v<T, std::string_view> && - !std::is_same_v<T, const char*> && - !std::is_same_v<T, char> && !require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &t) { - int i = 0; - b.append('{'); - template for (constexpr auto dm : std::define_static_array(std::meta::nonstatic_data_members_of(^^T, std::meta::access_context::unchecked()))) { - if (i != 0) - b.append(','); - constexpr auto key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(dm))); - b.append_raw(key); - b.append(':'); - atom(b, t.[:dm:]); - i++; - }; - b.append('}'); +simdjson_inline error_code value_iterator::report_error(error_code error, const char *message) noexcept { + return _json_iter->report_error(error, message); } -// Support for optional types (std::optional, etc.) -template <concepts::optional_type T> - requires(!require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &opt) { - if (opt) { - atom(b, opt.value()); - } else { - b.append_raw("null"); - } +} // namespace ondemand +} // namespace lasx +} // namespace simdjson + +namespace simdjson { + +simdjson_inline simdjson_result<lasx::ondemand::value_iterator>::simdjson_result(lasx::ondemand::value_iterator &&value) noexcept + : implementation_simdjson_result_base<lasx::ondemand::value_iterator>(std::forward<lasx::ondemand::value_iterator>(value)) {} +simdjson_inline simdjson_result<lasx::ondemand::value_iterator>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<lasx::ondemand::value_iterator>(error) {} + +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H +/* end file simdjson/generic/ondemand/value_iterator-inl.h for lasx */ +/* including simdjson/generic/ondemand/serialization-inl.h for lasx: #include "simdjson/generic/ondemand/serialization-inl.h" */ +/* begin file simdjson/generic/ondemand/serialization-inl.h for lasx */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document-inl.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/serialization.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */ +/* amalgamation skipped (editor-only): #if SIMDJSON_STATIC_REFLECTION */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_builder.h" */ +/* amalgamation skipped (editor-only): #endif */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { + +inline std::string_view trim(const std::string_view str) noexcept { + // We can almost surely do better by rolling our own find_first_not_of function. + size_t first = str.find_first_not_of(" \t\n\r"); + // If we have the empty string (just white space), then no trimming is possible, and + // we return the empty string_view. + if (std::string_view::npos == first) { return std::string_view(); } + size_t last = str.find_last_not_of(" \t\n\r"); + return str.substr(first, (last - first + 1)); } -// Support for smart pointers (std::unique_ptr, std::shared_ptr, etc.) -template <concepts::smart_pointer T> - requires(!require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &ptr) { - if (ptr) { - atom(b, *ptr); - } else { - b.append_raw("null"); - } + +inline simdjson_result<std::string_view> to_json_string(lasx::ondemand::document& x) noexcept { + std::string_view v; + auto error = x.raw_json().get(v); + if(error) {return error; } + return trim(v); } -// Support for enums - serialize as string representation using expand approach from P2996R12 -template <typename T> - requires(std::is_enum_v<T> && !require_custom_serialization<T>) -void atom(string_builder &b, const T &e) { -#if SIMDJSON_STATIC_REFLECTION - constexpr auto enumerators = std::define_static_array(std::meta::enumerators_of(^^T)); - template for (constexpr auto enum_val : enumerators) { - constexpr auto enum_str = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(enum_val))); - if (e == [:enum_val:]) { - b.append_raw(enum_str); - return; - } - }; - // Fallback to integer if enum value not found - atom(b, static_cast<std::underlying_type_t<T>>(e)); -#else - // Fallback: serialize as integer if reflection not available - atom(b, static_cast<std::underlying_type_t<T>>(e)); -#endif +inline simdjson_result<std::string_view> to_json_string(lasx::ondemand::document_reference& x) noexcept { + std::string_view v; + auto error = x.raw_json().get(v); + if(error) {return error; } + return trim(v); } -// Support for appendable containers that don't have operator[] (sets, etc.) -template <concepts::appendable_containers T> - requires(!concepts::container_but_not_string<T> && !concepts::string_view_keyed_map<T> && - !concepts::optional_type<T> && !concepts::smart_pointer<T> && - !std::is_same_v<T, std::string> && - !std::is_same_v<T, std::string_view> && !std::is_same_v<T, const char*> && !require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &container) { - if (container.empty()) { - b.append_raw("[]"); - return; - } - b.append('['); - bool first = true; - for (const auto& item : container) { - if (!first) { - b.append(','); +inline simdjson_result<std::string_view> to_json_string(lasx::ondemand::value& x) noexcept { + /** + * If we somehow receive a value that has already been consumed, + * then the following code could be in trouble. E.g., we create + * an array as needed, but if an array was already created, then + * it could be bad. + */ + using namespace lasx::ondemand; + lasx::ondemand::json_type t; + auto error = x.type().get(t); + if(error != SUCCESS) { return error; } + switch (t) + { + case json_type::array: + { + lasx::ondemand::array array; + error = x.get_array().get(array); + if(error) { return error; } + return to_json_string(array); } - first = false; - atom(b, item); + case json_type::object: + { + lasx::ondemand::object object; + error = x.get_object().get(object); + if(error) { return error; } + return to_json_string(object); + } + default: + return trim(x.raw_json_token()); } - b.append(']'); } -// append functions that delegate to atom functions for primitive types -template <class T> - requires(std::is_arithmetic_v<T> && !std::is_same_v<T, char>) -void append(string_builder &b, const T &t) { - atom(b, t); +inline simdjson_result<std::string_view> to_json_string(lasx::ondemand::object& x) noexcept { + std::string_view v; + auto error = x.raw_json().get(v); + if(error) {return error; } + return trim(v); } -template <class T> - requires(std::is_same_v<T, std::string> || - std::is_same_v<T, std::string_view> || - std::is_same_v<T, const char *> || - std::is_same_v<T, char>) -void append(string_builder &b, const T &t) { - atom(b, t); +inline simdjson_result<std::string_view> to_json_string(lasx::ondemand::array& x) noexcept { + std::string_view v; + auto error = x.raw_json().get(v); + if(error) {return error; } + return trim(v); } -template <concepts::optional_type T> - requires(!require_custom_serialization<T>) -void append(string_builder &b, const T &t) { - atom(b, t); +inline simdjson_result<std::string_view> to_json_string(simdjson_result<lasx::ondemand::document> x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } -template <concepts::smart_pointer T> - requires(!require_custom_serialization<T>) -void append(string_builder &b, const T &t) { - atom(b, t); +inline simdjson_result<std::string_view> to_json_string(simdjson_result<lasx::ondemand::document_reference> x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } -template <concepts::appendable_containers T> - requires(!concepts::container_but_not_string<T> && !concepts::string_view_keyed_map<T> && - !concepts::optional_type<T> && !concepts::smart_pointer<T> && - !std::is_same_v<T, std::string> && - !std::is_same_v<T, std::string_view> && !std::is_same_v<T, const char*> && !require_custom_serialization<T>) -void append(string_builder &b, const T &t) { - atom(b, t); +inline simdjson_result<std::string_view> to_json_string(simdjson_result<lasx::ondemand::value> x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } -template <concepts::string_view_keyed_map T> - requires(!require_custom_serialization<T>) -void append(string_builder &b, const T &t) { - atom(b, t); +inline simdjson_result<std::string_view> to_json_string(simdjson_result<lasx::ondemand::object> x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } -// works for struct -template <class Z> - requires(std::is_class_v<Z> && !concepts::container_but_not_string<Z> && - !concepts::string_view_keyed_map<Z> && - !concepts::optional_type<Z> && - !concepts::smart_pointer<Z> && - !concepts::appendable_containers<Z> && - !std::is_same_v<Z, std::string> && - !std::is_same_v<Z, std::string_view> && - !std::is_same_v<Z, const char*> && - !std::is_same_v<Z, char> && !require_custom_serialization<Z>) -void append(string_builder &b, const Z &z) { - int i = 0; - b.append('{'); - template for (constexpr auto dm : std::define_static_array(std::meta::nonstatic_data_members_of(^^Z, std::meta::access_context::unchecked()))) { - if (i != 0) - b.append(','); - constexpr auto key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(dm))); - b.append_raw(key); - b.append(':'); - atom(b, z.[:dm:]); - i++; - }; - b.append('}'); +inline simdjson_result<std::string_view> to_json_string(simdjson_result<lasx::ondemand::array> x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } +} // namespace simdjson -// works for container that have begin() and end() iterators -template <class Z> - requires(concepts::container_but_not_string<Z> && !require_custom_serialization<Z>) -void append(string_builder &b, const Z &z) { - auto it = z.begin(); - auto end = z.end(); - if (it == end) { - b.append_raw("[]"); - return; +namespace simdjson { namespace lasx { namespace ondemand { + +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::lasx::ondemand::value x) { + std::string_view v; + auto error = simdjson::to_json_string(x).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + throw simdjson::simdjson_error(error); } - b.append('['); - atom(b, *it); - ++it; - for (; it != end; ++it) { - b.append(','); - atom(b, *it); +} +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::lasx::ondemand::value> x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); +} +#else +inline std::ostream& operator<<(std::ostream& out, simdjson::lasx::ondemand::value x) { + std::string_view v; + auto error = simdjson::to_json_string(x).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + return (out << error); } - b.append(']'); } +#endif -template <class Z> - requires (require_custom_serialization<Z>) -void append(string_builder &b, const Z &z) { - b.append(z); +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::lasx::ondemand::array value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + throw simdjson::simdjson_error(error); + } } - - -template <class Z> -simdjson_warn_unused simdjson_result<std::string> to_json_string(const Z &z, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { - string_builder b(initial_capacity); - append(b, z); - std::string_view s; - if(auto e = b.view().get(s); e) { return e; } - return std::string(s); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::lasx::ondemand::array> x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); } - -template <class Z> -simdjson_warn_unused simdjson_error to_json(const Z &z, std::string &s, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { - string_builder b(initial_capacity); - append(b, z); - std::string_view view; - if(auto e = b.view().get(view); e) { return e; } - s.assign(view); - return SUCCESS; +#else +inline std::ostream& operator<<(std::ostream& out, simdjson::lasx::ondemand::array value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + return (out << error); + } } +#endif -template <class Z> -string_builder& operator<<(string_builder& b, const Z& z) { - append(b, z); - return b; +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::lasx::ondemand::document& value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + throw simdjson::simdjson_error(error); + } } - -// extract_from: Serialize only specific fields from a struct to JSON -template<constevalutil::fixed_string... FieldNames, typename T> - requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) -void extract_from(string_builder &b, const T &obj) { - // Helper to check if a field name matches any of the requested fields - auto should_extract = [](std::string_view field_name) constexpr -> bool { - return ((FieldNames.view() == field_name) || ...); - }; - - b.append('{'); - bool first = true; - - // Iterate through all members of T using reflection - template for (constexpr auto mem : std::define_static_array( - std::meta::nonstatic_data_members_of(^^T, std::meta::access_context::unchecked()))) { - - if constexpr (std::meta::is_public(mem)) { - constexpr std::string_view key = std::define_static_string(std::meta::identifier_of(mem)); - - // Only serialize this field if it's in our list of requested fields - if constexpr (should_extract(key)) { - if (!first) { - b.append(','); - } - first = false; - - // Serialize the key - constexpr auto quoted_key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(mem))); - b.append_raw(quoted_key); - b.append(':'); - - // Serialize the value - atom(b, obj.[:mem:]); - } - } - }; - - b.append('}'); +inline std::ostream& operator<<(std::ostream& out, simdjson::lasx::ondemand::document_reference& value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + throw simdjson::simdjson_error(error); + } } - -template<constevalutil::fixed_string... FieldNames, typename T> - requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) -simdjson_warn_unused simdjson_result<std::string> extract_from(const T &obj, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { - string_builder b(initial_capacity); - extract_from<FieldNames...>(b, obj); - std::string_view s; - if(auto e = b.view().get(s); e) { return e; } - return std::string(s); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::lasx::ondemand::document>&& x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); } +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::lasx::ondemand::document_reference>&& x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); +} +#else +inline std::ostream& operator<<(std::ostream& out, simdjson::lasx::ondemand::document& value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + return (out << error); + } +} +#endif -} // namespace builder -} // namespace lsx -// Alias the function template to 'to' in the global namespace -template <class Z> -simdjson_warn_unused simdjson_result<std::string> to_json(const Z &z, size_t initial_capacity = lsx::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { - lsx::builder::string_builder b(initial_capacity); - lsx::builder::append(b, z); - std::string_view s; - if(auto e = b.view().get(s); e) { return e; } - return std::string(s); +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::lasx::ondemand::object value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + throw simdjson::simdjson_error(error); + } } -template <class Z> -simdjson_warn_unused simdjson_error to_json(const Z &z, std::string &s, size_t initial_capacity = lsx::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { - lsx::builder::string_builder b(initial_capacity); - lsx::builder::append(b, z); - std::string_view view; - if(auto e = b.view().get(view); e) { return e; } - s.assign(view); - return SUCCESS; +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::lasx::ondemand::object> x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); } -// Global namespace function for extract_from -template<constevalutil::fixed_string... FieldNames, typename T> - requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) -simdjson_warn_unused simdjson_result<std::string> extract_from(const T &obj, size_t initial_capacity = lsx::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { - lsx::builder::string_builder b(initial_capacity); - lsx::builder::extract_from<FieldNames...>(b, obj); - std::string_view s; - if(auto e = b.view().get(s); e) { return e; } - return std::string(s); +#else +inline std::ostream& operator<<(std::ostream& out, simdjson::lasx::ondemand::object value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + return (out << error); + } } - -} // namespace simdjson - -#endif // SIMDJSON_STATIC_REFLECTION - #endif -/* end file simdjson/generic/ondemand/json_builder.h for lsx */ +}}} // namespace simdjson::lasx::ondemand + +#endif // SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H +/* end file simdjson/generic/ondemand/serialization-inl.h for lasx */ // JSON path accessor (compile-time) - must be after inline definitions -/* including simdjson/generic/ondemand/compile_time_accessors.h for lsx: #include "simdjson/generic/ondemand/compile_time_accessors.h" */ -/* begin file simdjson/generic/ondemand/compile_time_accessors.h for lsx */ +/* including simdjson/generic/ondemand/compile_time_accessors.h for lasx: #include "simdjson/generic/ondemand/compile_time_accessors.h" */ +/* begin file simdjson/generic/ondemand/compile_time_accessors.h for lasx */ /** * Compile-time JSON Path and JSON Pointer accessors using C++26 reflection (P2996) * @@ -137379,7 +169527,7 @@ simdjson_warn_unused simdjson_result<std::string> extract_from(const T &obj, siz #include <array> namespace simdjson { -namespace lsx { +namespace lasx { namespace ondemand { /*** * JSONPath implementation for compile-time access @@ -137390,7 +169538,7 @@ namespace json_path { // Note: value type must be fully defined before this header is included // This is ensured by including this in amalgamated.h after value-inl.h -using ::simdjson::lsx::ondemand::value; +using ::simdjson::lasx::ondemand::value; // Path step types enum class step_type { @@ -137524,7 +169672,7 @@ struct json_path_parser { // Compile-time path accessor generator template<typename T, constevalutil::fixed_string Path> struct path_accessor { - using value = ::simdjson::lsx::ondemand::value; + using value = ::simdjson::lasx::ondemand::value; static constexpr auto parser = json_path_parser<Path>(); static constexpr std::size_t num_steps = parser.count_steps(); @@ -138002,14 +170150,14 @@ struct path_accessor { // Compile-time path accessor with validation template<typename T, constevalutil::fixed_string Path, typename DocOrValue> -inline simdjson_result<::simdjson::lsx::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { +inline simdjson_result<::simdjson::lasx::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { using accessor = path_accessor<T, Path>; return accessor::access(doc_or_val); } // Overload without type parameter (no validation) template<constevalutil::fixed_string Path, typename DocOrValue> -inline simdjson_result<::simdjson::lsx::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { +inline simdjson_result<::simdjson::lasx::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { using accessor = path_accessor<void, Path>; return accessor::access(doc_or_val); } @@ -138240,56 +170388,63 @@ struct pointer_accessor { // Compile-time JSON Pointer accessor with validation template<typename T, constevalutil::fixed_string Pointer, typename DocOrValue> -inline simdjson_result<::simdjson::lsx::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { +inline simdjson_result<::simdjson::lasx::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { using accessor = pointer_accessor<T, Pointer>; return accessor::access(doc_or_val); } // Overload without type parameter (no validation) template<constevalutil::fixed_string Pointer, typename DocOrValue> -inline simdjson_result<::simdjson::lsx::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { +inline simdjson_result<::simdjson::lasx::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { using accessor = pointer_accessor<void, Pointer>; return accessor::access(doc_or_val); } } // namespace json_path } // namespace ondemand -} // namespace lsx +} // namespace lasx } // namespace simdjson #endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION #endif // SIMDJSON_GENERIC_ONDEMAND_COMPILE_TIME_ACCESSORS_H -/* end file simdjson/generic/ondemand/compile_time_accessors.h for lsx */ +/* end file simdjson/generic/ondemand/compile_time_accessors.h for lasx */ -/* end file simdjson/generic/ondemand/amalgamated.h for lsx */ -/* including simdjson/lsx/end.h: #include "simdjson/lsx/end.h" */ -/* begin file simdjson/lsx/end.h */ +/* end file simdjson/generic/ondemand/amalgamated.h for lasx */ +/* including simdjson/lasx/end.h: #include "simdjson/lasx/end.h" */ +/* begin file simdjson/lasx/end.h */ /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lsx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ #undef SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT -/* undefining SIMDJSON_IMPLEMENTATION from "lsx" */ +/* undefining SIMDJSON_IMPLEMENTATION from "lasx" */ #undef SIMDJSON_IMPLEMENTATION -/* end file simdjson/lsx/end.h */ -#endif // SIMDJSON_LSX_ONDEMAND_H -/* end file simdjson/lsx/ondemand.h */ -#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(lasx) -/* including simdjson/lasx/ondemand.h: #include "simdjson/lasx/ondemand.h" */ -/* begin file simdjson/lasx/ondemand.h */ -#ifndef SIMDJSON_LASX_ONDEMAND_H -#define SIMDJSON_LASX_ONDEMAND_H -/* including simdjson/lasx/begin.h: #include "simdjson/lasx/begin.h" */ -/* begin file simdjson/lasx/begin.h */ -/* defining SIMDJSON_IMPLEMENTATION to "lasx" */ -#define SIMDJSON_IMPLEMENTATION lasx -/* including simdjson/lasx/base.h: #include "simdjson/lasx/base.h" */ -/* begin file simdjson/lasx/base.h */ -#ifndef SIMDJSON_LASX_BASE_H -#define SIMDJSON_LASX_BASE_H +#if SIMDJSON_CAN_ALWAYS_RUN_LASX +// nothing needed. +#else +SIMDJSON_UNTARGET_REGION +#endif +/* end file simdjson/lasx/end.h */ + +#endif // SIMDJSON_LASX_ONDEMAND_H +/* end file simdjson/lasx/ondemand.h */ +#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(rvv_vls) +/* including simdjson/rvv-vls/ondemand.h: #include "simdjson/rvv-vls/ondemand.h" */ +/* begin file simdjson/rvv-vls/ondemand.h */ +#ifndef SIMDJSON_RVV_VLS_ONDEMAND_H +#define SIMDJSON_RVV_VLS_ONDEMAND_H + +/* including simdjson/rvv-vls/begin.h: #include "simdjson/rvv-vls/begin.h" */ +/* begin file simdjson/rvv-vls/begin.h */ +/* defining SIMDJSON_IMPLEMENTATION to "rvv_vls" */ +#define SIMDJSON_IMPLEMENTATION rvv_vls +/* including simdjson/rvv-vls/base.h: #include "simdjson/rvv-vls/base.h" */ +/* begin file simdjson/rvv-vls/base.h */ +#ifndef SIMDJSON_RVV_VLS_BASE_H +#define SIMDJSON_RVV_VLS_BASE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ /* amalgamation skipped (editor-only): #include "simdjson/base.h" */ @@ -138297,54 +170452,63 @@ inline simdjson_result<::simdjson::lsx::ondemand::value> at_pointer_compiled(Doc namespace simdjson { /** - * Implementation for LASX. + * RVV-VLS implementation. */ -namespace lasx { +namespace rvv_vls { class implementation; -namespace { -namespace simd { -template <typename T> struct simd8; -template <typename T> struct simd8x64; -} // namespace simd -} // unnamed namespace - -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson -#endif // SIMDJSON_LASX_BASE_H -/* end file simdjson/lasx/base.h */ -/* including simdjson/lasx/intrinsics.h: #include "simdjson/lasx/intrinsics.h" */ -/* begin file simdjson/lasx/intrinsics.h */ -#ifndef SIMDJSON_LASX_INTRINSICS_H -#define SIMDJSON_LASX_INTRINSICS_H +#endif // SIMDJSON_RVV_VLS_BASE_H +/* end file simdjson/rvv-vls/base.h */ +/* including simdjson/rvv-vls/intrinsics.h: #include "simdjson/rvv-vls/intrinsics.h" */ +/* begin file simdjson/rvv-vls/intrinsics.h */ +#ifndef SIMDJSON_RVV_VLS_INTRINSICS_H +#define SIMDJSON_RVV_VLS_INTRINSICS_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -// This should be the correct header whether -// you use visual studio or other compilers. -#include <lasxintrin.h> - -static_assert(sizeof(__m256i) <= simdjson::SIMDJSON_PADDING, "insufficient padding for LoongArch ASX"); - -#endif // SIMDJSON_LASX_INTRINSICS_H -/* end file simdjson/lasx/intrinsics.h */ -/* including simdjson/lasx/bitmanipulation.h: #include "simdjson/lasx/bitmanipulation.h" */ -/* begin file simdjson/lasx/bitmanipulation.h */ -#ifndef SIMDJSON_LASX_BITMANIPULATION_H -#define SIMDJSON_LASX_BITMANIPULATION_H +#include <riscv_vector.h> + +#define simdutf_vrgather_u8m1x2(tbl, idx) \ + __riscv_vcreate_v_u8m1_u8m2( \ + __riscv_vrgather_vv_u8m1(tbl, __riscv_vget_v_u8m2_u8m1(idx, 0), \ + __riscv_vsetvlmax_e8m1()), \ + __riscv_vrgather_vv_u8m1(tbl, __riscv_vget_v_u8m2_u8m1(idx, 1), \ + __riscv_vsetvlmax_e8m1())) + +#define simdutf_vrgather_u8m1x4(tbl, idx) \ + __riscv_vcreate_v_u8m1_u8m4( \ + __riscv_vrgather_vv_u8m1(tbl, __riscv_vget_v_u8m4_u8m1(idx, 0), \ + __riscv_vsetvlmax_e8m1()), \ + __riscv_vrgather_vv_u8m1(tbl, __riscv_vget_v_u8m4_u8m1(idx, 1), \ + __riscv_vsetvlmax_e8m1()), \ + __riscv_vrgather_vv_u8m1(tbl, __riscv_vget_v_u8m4_u8m1(idx, 2), \ + __riscv_vsetvlmax_e8m1()), \ + __riscv_vrgather_vv_u8m1(tbl, __riscv_vget_v_u8m4_u8m1(idx, 3), \ + __riscv_vsetvlmax_e8m1())) + +#if __riscv_zbc +#include <riscv_bitmanip.h> +#endif + +#endif // SIMDJSON_RVV_VLS_INTRINSICS_H +/* end file simdjson/rvv-vls/intrinsics.h */ +/* including simdjson/rvv-vls/bitmanipulation.h: #include "simdjson/rvv-vls/bitmanipulation.h" */ +/* begin file simdjson/rvv-vls/bitmanipulation.h */ +#ifndef SIMDJSON_RVV_VLS_BITMANIPULATION_H +#define SIMDJSON_RVV_VLS_BITMANIPULATION_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/intrinsics.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/bitmask.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace { // We sometimes call trailing_zero on inputs that are zero, @@ -138369,33 +170533,34 @@ simdjson_inline int leading_zeroes(uint64_t input_num) { return __builtin_clzll(input_num); } -/* result might be undefined when input_num is zero */ -simdjson_inline int count_ones(uint64_t input_num) { - return __lasx_xvpickve2gr_w(__lasx_xvpcnt_d(__m256i(v4u64{input_num, 0, 0, 0})), 0); +simdjson_inline long long int count_ones(uint64_t input_num) { + return __builtin_popcountll(input_num); } -simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2, uint64_t *result) { +simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2, + uint64_t *result) { return __builtin_uaddll_overflow(value1, value2, reinterpret_cast<unsigned long long *>(result)); } } // unnamed namespace -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson -#endif // SIMDJSON_LASX_BITMANIPULATION_H -/* end file simdjson/lasx/bitmanipulation.h */ -/* including simdjson/lasx/bitmask.h: #include "simdjson/lasx/bitmask.h" */ -/* begin file simdjson/lasx/bitmask.h */ -#ifndef SIMDJSON_LASX_BITMASK_H -#define SIMDJSON_LASX_BITMASK_H +#endif // SIMDJSON_RVV_VLS_BITMANIPULATION_H +/* end file simdjson/rvv-vls/bitmanipulation.h */ +/* including simdjson/rvv-vls/bitmask.h: #include "simdjson/rvv-vls/bitmask.h" */ +/* begin file simdjson/rvv-vls/bitmask.h */ +#ifndef SIMDJSON_RVV_VLS_BITMASK_H +#define SIMDJSON_RVV_VLS_BITMASK_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/intrinsics.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace { // @@ -138404,240 +170569,229 @@ namespace { // For example, prefix_xor(00100100) == 00011100 // simdjson_inline uint64_t prefix_xor(uint64_t bitmask) { +#if __riscv_zbc + return __riscv_clmul_64(bitmask, ~(uint64_t)0); +#elif __riscv_zvbc + return __riscv_vmv_x(__riscv_vclmul(__riscv_vmv_s_x_u64m1(bitmask, 1), ~(uint64_t)0, 1)); +#else bitmask ^= bitmask << 1; bitmask ^= bitmask << 2; bitmask ^= bitmask << 4; bitmask ^= bitmask << 8; bitmask ^= bitmask << 16; bitmask ^= bitmask << 32; +#endif return bitmask; } } // unnamed namespace -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson -#endif -/* end file simdjson/lasx/bitmask.h */ -/* including simdjson/lasx/numberparsing_defs.h: #include "simdjson/lasx/numberparsing_defs.h" */ -/* begin file simdjson/lasx/numberparsing_defs.h */ -#ifndef SIMDJSON_LASX_NUMBERPARSING_DEFS_H -#define SIMDJSON_LASX_NUMBERPARSING_DEFS_H - -/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/intrinsics.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */ -/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ +#endif // SIMDJSON_RVV_VLS_BITMASK_H -#include <cstring> - -namespace simdjson { -namespace lasx { -namespace numberparsing { - -// we don't have appropriate instructions, so let us use a scalar function -// credit: https://johnnylee-sde.github.io/Fast-numeric-string-to-int/ -/** @private */ -static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) { - uint64_t val; - std::memcpy(&val, chars, sizeof(uint64_t)); - val = (val & 0x0F0F0F0F0F0F0F0F) * 2561 >> 8; - val = (val & 0x00FF00FF00FF00FF) * 6553601 >> 16; - return uint32_t((val & 0x0000FFFF0000FFFF) * 42949672960001 >> 32); -} - -simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) { - internal::value128 answer; - __uint128_t r = (static_cast<__uint128_t>(value1)) * value2; - answer.low = uint64_t(r); - answer.high = uint64_t(r >> 64); - return answer; -} - -} // namespace numberparsing -} // namespace lasx -} // namespace simdjson - -#ifndef SIMDJSON_SWAR_NUMBER_PARSING -#if SIMDJSON_IS_BIG_ENDIAN -#define SIMDJSON_SWAR_NUMBER_PARSING 0 -#else -#define SIMDJSON_SWAR_NUMBER_PARSING 1 -#endif -#endif - -#endif // SIMDJSON_LASX_NUMBERPARSING_DEFS_H -/* end file simdjson/lasx/numberparsing_defs.h */ -/* including simdjson/lasx/simd.h: #include "simdjson/lasx/simd.h" */ -/* begin file simdjson/lasx/simd.h */ -#ifndef SIMDJSON_LASX_SIMD_H -#define SIMDJSON_LASX_SIMD_H +/* end file simdjson/rvv-vls/bitmask.h */ +/* including simdjson/rvv-vls/simd.h: #include "simdjson/rvv-vls/simd.h" */ +/* begin file simdjson/rvv-vls/simd.h */ +#ifndef SIMDJSON_RVV_VLS_SIMD_H +#define SIMDJSON_RVV_VLS_SIMD_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/bitmanipulation.h" */ /* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace { namespace simd { - // Forward-declared so they can be used by splat and friends. - template<typename Child> - struct base { - __m256i value; - - // Zero constructor - simdjson_inline base() : value{__m256i()} {} - - // Conversion from SIMD register - simdjson_inline base(const __m256i _value) : value(_value) {} - - // Conversion to SIMD register - simdjson_inline operator const __m256i&() const { return this->value; } - simdjson_inline operator __m256i&() { return this->value; } - simdjson_inline operator const v32i8&() const { return (v32i8&)this->value; } - simdjson_inline operator v32i8&() { return (v32i8&)this->value; } +#if __riscv_v_fixed_vlen >= 512 + static constexpr size_t VL8 = 512/8; + using vint8_t = vint8m1_t __attribute__((riscv_rvv_vector_bits(512))); + using vuint8_t = vuint8m1_t __attribute__((riscv_rvv_vector_bits(512))); + using vbool_t = vbool8_t __attribute__((riscv_rvv_vector_bits(512/8))); + using vbitmask_t = uint64_t; +#else + static constexpr size_t VL8 = __riscv_v_fixed_vlen/8; + using vint8_t = vint8m1_t __attribute__((riscv_rvv_vector_bits(__riscv_v_fixed_vlen))); + using vuint8_t = vuint8m1_t __attribute__((riscv_rvv_vector_bits(__riscv_v_fixed_vlen))); + using vbool_t = vbool8_t __attribute__((riscv_rvv_vector_bits(__riscv_v_fixed_vlen/8))); + #if __riscv_v_fixed_vlen == 128 + using vbitmask_t = uint16_t; + #elif __riscv_v_fixed_vlen == 256 + using vbitmask_t = uint32_t; + #endif +#endif - // Bit operations - simdjson_inline Child operator|(const Child other) const { return __lasx_xvor_v(*this, other); } - simdjson_inline Child operator&(const Child other) const { return __lasx_xvand_v(*this, other); } - simdjson_inline Child operator^(const Child other) const { return __lasx_xvxor_v(*this, other); } - simdjson_inline Child bit_andnot(const Child other) const { return __lasx_xvandn_v(other, *this); } - simdjson_inline Child& operator|=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast | other; return *this_cast; } - simdjson_inline Child& operator&=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast & other; return *this_cast; } - simdjson_inline Child& operator^=(const Child other) { auto this_cast = static_cast<Child*>(this); *this_cast = *this_cast ^ other; return *this_cast; } - }; +#if __riscv_v_fixed_vlen == 128 + using vuint8x64_t = vuint8m4_t __attribute__((riscv_rvv_vector_bits(512))); + using vboolx64_t = vbool2_t __attribute__((riscv_rvv_vector_bits(512/8))); +#elif __riscv_v_fixed_vlen == 256 + using vuint8x64_t = vuint8m2_t __attribute__((riscv_rvv_vector_bits(512))); + using vboolx64_t = vbool4_t __attribute__((riscv_rvv_vector_bits(512/8))); +#else + using vuint8x64_t = vuint8m1_t __attribute__((riscv_rvv_vector_bits(512))); + using vboolx64_t = vbool8_t __attribute__((riscv_rvv_vector_bits(512/8))); +#endif - // Forward-declared so they can be used by splat and friends. template<typename T> struct simd8; - template<typename T, typename Mask=simd8<bool>> - struct base8: base<simd8<T>> { - simdjson_inline base8() : base<simd8<T>>() {} - simdjson_inline base8(const __m256i _value) : base<simd8<T>>(_value) {} + // SIMD byte mask type (returned by things like eq and gt) + template<> + struct simd8<bool> { + vbool_t value; + using bitmask_t = vbitmask_t; + static constexpr int SIZE = sizeof(value); - friend simdjson_really_inline Mask operator==(const simd8<T> lhs, const simd8<T> rhs) { return __lasx_xvseq_b(lhs, rhs); } + simdjson_inline simd8(const vbool_t _value) : value(_value) {} + simdjson_inline simd8() : simd8(__riscv_vmclr_m_b8(VL8)) {} + simdjson_inline simd8(bool _value) : simd8(splat(_value)) {} - static const int SIZE = sizeof(base<simd8<T>>::value); + simdjson_inline operator const vbool_t&() const { return value; } + simdjson_inline operator vbool_t&() { return value; } - template<int N=1> - simdjson_inline simd8<T> prev(const simd8<T> prev_chunk) const { - __m256i hi = __lasx_xvbsll_v(*this, N); - __m256i lo = __lasx_xvbsrl_v(*this, 16 - N); - __m256i tmp = __lasx_xvbsrl_v(prev_chunk, 16 - N); - lo = __lasx_xvpermi_q(lo, tmp, 0x21); - return __lasx_xvor_v(hi, lo); + static simdjson_inline simd8<bool> splat(bool _value) { + return __riscv_vreinterpret_b8(__riscv_vmv_v_x_u64m1(((uint64_t)!_value)-1, 1)); + } + + simdjson_inline vbitmask_t to_bitmask() const { +#if __riscv_v_fixed_vlen == 128 + return __riscv_vmv_x(__riscv_vreinterpret_u16m1(value)); +#elif __riscv_v_fixed_vlen == 256 + return __riscv_vmv_x(__riscv_vreinterpret_u32m1(value)); +#else + return __riscv_vmv_x(__riscv_vreinterpret_u64m1(value)); +#endif } + + // Bit operations + simdjson_inline simd8<bool> operator|(const simd8<bool> other) const { return __riscv_vmor(*this, other, VL8); } + simdjson_inline simd8<bool> operator&(const simd8<bool> other) const { return __riscv_vmand(*this, other, VL8); } + simdjson_inline simd8<bool> operator^(const simd8<bool> other) const { return __riscv_vmxor(*this, other, VL8); } + simdjson_inline simd8<bool> bit_andnot(const simd8<bool> other) const { return __riscv_vmandn(other, *this, VL8); } + simdjson_inline simd8<bool> operator~() const { return __riscv_vmnot(*this, VL8); } + simdjson_inline simd8<bool>& operator|=(const simd8<bool> other) { auto this_cast = static_cast<simd8<bool>*>(this); *this_cast = *this_cast | other; return *this_cast; } + simdjson_inline simd8<bool>& operator&=(const simd8<bool> other) { auto this_cast = static_cast<simd8<bool>*>(this); *this_cast = *this_cast & other; return *this_cast; } + simdjson_inline simd8<bool>& operator^=(const simd8<bool> other) { auto this_cast = static_cast<simd8<bool>*>(this); *this_cast = *this_cast ^ other; return *this_cast; } }; - // SIMD byte mask type (returned by things like eq and gt) + // Unsigned bytes template<> - struct simd8<bool>: base8<bool> { - static simdjson_inline simd8<bool> splat(bool _value) { return __lasx_xvreplgr2vr_b(uint8_t(-(!!_value))); } + struct simd8<uint8_t> { - simdjson_inline simd8() : base8() {} - simdjson_inline simd8(const __m256i _value) : base8<bool>(_value) {} - // Splat constructor - simdjson_inline simd8(bool _value) : base8<bool>(splat(_value)) {} + vuint8_t value; + static constexpr int SIZE = sizeof(value); - simdjson_inline int to_bitmask() const { - __m256i mask = __lasx_xvmskltz_b(*this); - return (__lasx_xvpickve2gr_w(mask, 4) << 16) | (__lasx_xvpickve2gr_w(mask, 0)); - } - simdjson_inline bool any() const { - __m256i v = __lasx_xvmsknz_b(*this); - return (0 == __lasx_xvpickve2gr_w(v, 0)) && (0 == __lasx_xvpickve2gr_w(v, 4)); - } - simdjson_inline simd8<bool> operator~() const { return *this ^ true; } - }; + simdjson_inline simd8(const vuint8_t _value) : value(_value) {} + simdjson_inline simd8() : simd8(zero()) {} + simdjson_inline simd8(const uint8_t values[VL8]) : simd8(load(values)) {} + simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {} + simdjson_inline simd8(simd8<bool> mask) : value(__riscv_vmerge_vxm_u8m1(zero(), -1, (vbool_t)mask, VL8)) {} + + simdjson_inline operator const vuint8_t&() const { return this->value; } + simdjson_inline operator vuint8_t&() { return this->value; } + + simdjson_inline simd8( + uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, + uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 + ) : simd8(vuint8_t{ + v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10,v11,v12,v13,v14,v15 + }) {} - template<typename T> - struct base8_numeric: base8<T> { - static simdjson_inline simd8<T> splat(T _value) { - return __lasx_xvreplgr2vr_b(_value); - } - static simdjson_inline simd8<T> zero() { return __lasx_xvldi(0); } - static simdjson_inline simd8<T> load(const T values[32]) { - return __lasx_xvld(reinterpret_cast<const __m256i *>(values), 0); - } // Repeat 16 values as many times as necessary (usually for lookup tables) - static simdjson_inline simd8<T> repeat_16( - T v0, T v1, T v2, T v3, T v4, T v5, T v6, T v7, - T v8, T v9, T v10, T v11, T v12, T v13, T v14, T v15 + simdjson_inline static simd8<uint8_t> repeat_16( + uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, + uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 ) { - return simd8<T>( - v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15, + return simd8<uint8_t>( v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,v11,v12,v13,v14,v15 ); } - simdjson_inline base8_numeric() : base8<T>() {} - simdjson_inline base8_numeric(const __m256i _value) : base8<T>(_value) {} + static simdjson_inline vuint8_t splat(uint8_t _value) { return __riscv_vmv_v_x_u8m1(_value, VL8); } + static simdjson_inline vuint8_t zero() { return splat(0); } + static simdjson_inline vuint8_t load(const uint8_t values[VL8]) { return __riscv_vle8_v_u8m1(values, VL8); } - // Store to array - simdjson_inline void store(T dst[32]) const { - return __lasx_xvst(*this, reinterpret_cast<__m256i *>(dst), 0); + // Bit operations + simdjson_inline simd8<uint8_t> operator|(const simd8<uint8_t> other) const { return __riscv_vor_vv_u8m1( value, other, VL8); } + simdjson_inline simd8<uint8_t> operator&(const simd8<uint8_t> other) const { return __riscv_vand_vv_u8m1( value, other, VL8); } + simdjson_inline simd8<uint8_t> operator^(const simd8<uint8_t> other) const { return __riscv_vxor_vv_u8m1( value, other, VL8); } + simdjson_inline simd8<uint8_t> operator~() const { return __riscv_vnot_v_u8m1(value, VL8); } +#if __riscv_zvbb + simdjson_inline simd8<uint8_t> bit_andnot(const simd8<uint8_t> other) const { return __riscv_vandn_vv_u8m1(other, value, VL8); } +#else + simdjson_inline simd8<uint8_t> bit_andnot(const simd8<uint8_t> other) const { return other & ~*this; } +#endif + simdjson_inline simd8<uint8_t>& operator|=(const simd8<uint8_t> other) { value = *this | other; return *this; } + simdjson_inline simd8<uint8_t>& operator&=(const simd8<uint8_t> other) { value = *this & other; return *this; } + simdjson_inline simd8<uint8_t>& operator^=(const simd8<uint8_t> other) { value = *this ^ other; return *this; } + + simdjson_inline simd8<bool> operator==(const simd8<uint8_t> other) const { return __riscv_vmseq(value, other, VL8); } + simdjson_inline simd8<bool> operator==(uint8_t other) const { return __riscv_vmseq(value, other, VL8); } + + template<int N=1> + simdjson_inline simd8<uint8_t> prev(const simd8<uint8_t> prev_chunk) const { + return __riscv_vslideup(__riscv_vslidedown(prev_chunk, VL8-N, VL8), value, N, VL8); } + // Store to array + simdjson_inline void store(uint8_t dst[VL8]) const { return __riscv_vse8(dst, value, VL8); } + + // Saturated math + simdjson_inline simd8<uint8_t> saturating_add(const simd8<uint8_t> other) const { return __riscv_vsaddu(value, other, VL8); } + simdjson_inline simd8<uint8_t> saturating_sub(const simd8<uint8_t> other) const { return __riscv_vssubu(value, other, VL8); } + // Addition/subtraction are the same for signed and unsigned - simdjson_inline simd8<T> operator+(const simd8<T> other) const { return __lasx_xvadd_b(*this, other); } - simdjson_inline simd8<T> operator-(const simd8<T> other) const { return __lasx_xvsub_b(*this, other); } - simdjson_inline simd8<T>& operator+=(const simd8<T> other) { *this = *this + other; return *static_cast<simd8<T>*>(this); } - simdjson_inline simd8<T>& operator-=(const simd8<T> other) { *this = *this - other; return *static_cast<simd8<T>*>(this); } + simdjson_inline simd8<uint8_t> operator+(const simd8<uint8_t> other) const { return __riscv_vadd(value, other, VL8); } + simdjson_inline simd8<uint8_t> operator-(const simd8<uint8_t> other) const { return __riscv_vsub(value, other, VL8); } + simdjson_inline simd8<uint8_t>& operator+=(const simd8<uint8_t> other) { value = *this + other; return *this; } + simdjson_inline simd8<uint8_t>& operator-=(const simd8<uint8_t> other) { value = *this - other; return *this; } + + // Order-specific operations + simdjson_inline simd8<bool> operator<=(const simd8<uint8_t> other) const { return __riscv_vmsleu(value, other, VL8); } + simdjson_inline simd8<bool> operator>=(const simd8<uint8_t> other) const { return __riscv_vmsgeu(value, other, VL8); } + simdjson_inline simd8<bool> operator<(const simd8<uint8_t> other) const { return __riscv_vmsltu(value, other, VL8); } + simdjson_inline simd8<bool> operator>(const simd8<uint8_t> other) const { return __riscv_vmsgtu(value, other, VL8); } + + // Same as >, but instead of guaranteeing all 1's == true, false = 0 and true = nonzero. + simdjson_inline simd8<uint8_t> gt_bits(const simd8<uint8_t> other) const { return simd8<uint8_t>(*this > other); } + // Same as <, but instead of guaranteeing all 1's == true, false = 0 and true = nonzero. + simdjson_inline simd8<uint8_t> lt_bits(const simd8<uint8_t> other) const { return simd8<uint8_t>(*this < other); } + + // Bit-specific operations + simdjson_inline bool any_bits_set_anywhere() const { + return __riscv_vfirst(__riscv_vmsne(value, 0, VL8), VL8) >= 0; + } + simdjson_inline bool any_bits_set_anywhere(simd8<uint8_t> bits) const { return (*this & bits).any_bits_set_anywhere(); } + template<int N> + simdjson_inline simd8<uint8_t> shr() const { return __riscv_vsrl(value, N, VL8); } + template<int N> + simdjson_inline simd8<uint8_t> shl() const { return __riscv_vsll(value, N, VL8); } - // Override to distinguish from bool version - simdjson_inline simd8<T> operator~() const { return *this ^ 0xFFu; } // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values) template<typename L> simdjson_inline simd8<L> lookup_16(simd8<L> lookup_table) const { - return __lasx_xvshuf_b(lookup_table, lookup_table, *this); + return __riscv_vrgather(lookup_table, value, VL8); } - // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted as a bitset). - // Passing a 0 value for mask would be equivalent to writing out every byte to output. - // Only the first 16 - count_ones(mask) bytes of the result are significant but 16 bytes - // get written. + // compress inactive elements, to match AVX-512 behavior template<typename L> - simdjson_inline void compress(uint32_t mask, L * output) const { - using internal::thintable_epi8; - using internal::BitsSetTable256mul2; - using internal::pshufb_combine_table; - // this particular implementation was inspired by haswell - // lasx do it in 4 steps, first 8 bytes and then second 8 bytes... - uint8_t mask1 = uint8_t(mask); // least significant 8 bits - uint8_t mask2 = uint8_t(mask >> 8); // second significant 8 bits - uint8_t mask3 = uint8_t(mask >> 16); // ... - uint8_t mask4 = uint8_t(mask >> 24); // ... - // next line just loads the 64-bit values thintable_epi8[mask{1,2,3,4}] - // into a 256-bit register. - __m256i shufmask = {int64_t(thintable_epi8[mask1]), int64_t(thintable_epi8[mask2]) + 0x0808080808080808, int64_t(thintable_epi8[mask3]), int64_t(thintable_epi8[mask4]) + 0x0808080808080808}; - // this is the version "nearly pruned" - __m256i pruned = __lasx_xvshuf_b(*this, *this, shufmask); - // we still need to put the pieces back together. - // we compute the popcount of the first words: - int pop1 = BitsSetTable256mul2[mask1]; - int pop2 = BitsSetTable256mul2[mask2]; - int pop3 = BitsSetTable256mul2[mask3]; - - // then load the corresponding mask - __m256i masklo = __lasx_xvldx(reinterpret_cast<void*>(reinterpret_cast<unsigned long>(pshufb_combine_table)), pop1 * 8); - __m256i maskhi = __lasx_xvldx(reinterpret_cast<void*>(reinterpret_cast<unsigned long>(pshufb_combine_table)), pop3 * 8); - __m256i compactmask = __lasx_xvpermi_q(maskhi, masklo, 0x20); - __m256i answer = __lasx_xvshuf_b(pruned, pruned, compactmask); - __lasx_xvst(answer, reinterpret_cast<uint8_t*>(output), 0); - uint64_t value3 = __lasx_xvpickve2gr_du(answer, 2); - uint64_t value4 = __lasx_xvpickve2gr_du(answer, 3); - uint64_t *pos = reinterpret_cast<uint64_t*>(reinterpret_cast<uint8_t*>(output) + 16 - (pop1 + pop2) / 2); - pos[0] = value3; - pos[1] = value4; + simdjson_inline void compress(vbitmask_t mask, L * output) const { + mask = (vbitmask_t)~mask; +#if __riscv_v_fixed_vlen == 128 + vbool8_t m = __riscv_vreinterpret_b8(__riscv_vmv_s_x_u16m1(mask, 1)); +#elif __riscv_v_fixed_vlen == 256 + vbool8_t m = __riscv_vreinterpret_b8(__riscv_vmv_s_x_u32m1(mask, 1)); +#else + vbool8_t m = __riscv_vreinterpret_b8(__riscv_vmv_s_x_u64m1(mask, 1)); +#endif + __riscv_vse8_v_u8m1(output, __riscv_vcompress(value, m, VL8), count_ones(mask)); } template<typename L> @@ -138657,210 +170811,170 @@ namespace simd { // Signed bytes template<> - struct simd8<int8_t> : base8_numeric<int8_t> { - simdjson_inline simd8() : base8_numeric<int8_t>() {} - simdjson_inline simd8(const __m256i _value) : base8_numeric<int8_t>(_value) {} - // Splat constructor + struct simd8<int8_t> { + vint8_t value; + static constexpr int SIZE = sizeof(value); + + simdjson_inline simd8(const vint8_t _value) : value(_value) {} + simdjson_inline simd8() : simd8(zero()) {} + simdjson_inline simd8(const int8_t values[VL8]) : simd8(load(values)) {} simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {} - // Array constructor - simdjson_inline simd8(const int8_t values[32]) : simd8(load(values)) {} - // Member-by-member initialization + + simdjson_inline operator const vint8_t&() const { return this->value; } + simdjson_inline operator vint8_t&() { return this->value; } + simdjson_inline simd8( int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, - int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15, - int8_t v16, int8_t v17, int8_t v18, int8_t v19, int8_t v20, int8_t v21, int8_t v22, int8_t v23, - int8_t v24, int8_t v25, int8_t v26, int8_t v27, int8_t v28, int8_t v29, int8_t v30, int8_t v31 - ) : simd8({ + int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 + ) : simd8(vint8_t{ v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15, - v16,v17,v18,v19,v20,v21,v22,v23, - v24,v25,v26,v27,v28,v29,v30,v31 - }) {} + v8, v9, v10,v11,v12,v13,v14,v15 + }) {} + // Repeat 16 values as many times as necessary (usually for lookup tables) simdjson_inline static simd8<int8_t> repeat_16( int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7, int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15 ) { return simd8<int8_t>( - v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,v11,v12,v13,v14,v15 ); } - // Order-sensitive comparisons - simdjson_inline simd8<int8_t> max_val(const simd8<int8_t> other) const { return __lasx_xvmax_b(*this, other); } - simdjson_inline simd8<int8_t> min_val(const simd8<int8_t> other) const { return __lasx_xvmin_b(*this, other); } - simdjson_inline simd8<bool> operator>(const simd8<int8_t> other) const { return __lasx_xvslt_b(other, *this); } - simdjson_inline simd8<bool> operator<(const simd8<int8_t> other) const { return __lasx_xvslt_b(*this, other); } - }; + static simdjson_inline vint8_t splat(int8_t _value) { return __riscv_vmv_v_x_i8m1(_value, VL8); } + static simdjson_inline vint8_t zero() { return splat(0); } + static simdjson_inline vint8_t load(const int8_t values[VL8]) { return __riscv_vle8_v_i8m1(values, VL8); } - // Unsigned bytes - template<> - struct simd8<uint8_t>: base8_numeric<uint8_t> { - simdjson_inline simd8() : base8_numeric<uint8_t>() {} - simdjson_inline simd8(const __m256i _value) : base8_numeric<uint8_t>(_value) {} - // Splat constructor - simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {} - // Array constructor - simdjson_inline simd8(const uint8_t values[32]) : simd8(load(values)) {} - // Member-by-member initialization - simdjson_inline simd8( - uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, - uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15, - uint8_t v16, uint8_t v17, uint8_t v18, uint8_t v19, uint8_t v20, uint8_t v21, uint8_t v22, uint8_t v23, - uint8_t v24, uint8_t v25, uint8_t v26, uint8_t v27, uint8_t v28, uint8_t v29, uint8_t v30, uint8_t v31 - ) : simd8(__m256i(v32u8{ - v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15, - v16,v17,v18,v19,v20,v21,v22,v23, - v24,v25,v26,v27,v28,v29,v30,v31 - })) {} - // Repeat 16 values as many times as necessary (usually for lookup tables) - simdjson_inline static simd8<uint8_t> repeat_16( - uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7, - uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15 - ) { - return simd8<uint8_t>( - v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15, - v0, v1, v2, v3, v4, v5, v6, v7, - v8, v9, v10,v11,v12,v13,v14,v15 - ); - } - // Saturated math - simdjson_inline simd8<uint8_t> saturating_add(const simd8<uint8_t> other) const { return __lasx_xvsadd_bu(*this, other); } - simdjson_inline simd8<uint8_t> saturating_sub(const simd8<uint8_t> other) const { return __lasx_xvssub_bu(*this, other); } + simdjson_inline void store(int8_t dst[VL8]) const { return __riscv_vse8(dst, value, VL8); } - // Order-specific operations - simdjson_inline simd8<uint8_t> max_val(const simd8<uint8_t> other) const { return __lasx_xvmax_bu(*this, other); } - simdjson_inline simd8<uint8_t> min_val(const simd8<uint8_t> other) const { return __lasx_xvmin_bu(other, *this); } - // Same as >, but only guarantees true is nonzero (< guarantees true = -1) - simdjson_inline simd8<uint8_t> gt_bits(const simd8<uint8_t> other) const { return this->saturating_sub(other); } - // Same as <, but only guarantees true is nonzero (< guarantees true = -1) - simdjson_inline simd8<uint8_t> lt_bits(const simd8<uint8_t> other) const { return other.saturating_sub(*this); } - simdjson_inline simd8<bool> operator<=(const simd8<uint8_t> other) const { return other.max_val(*this) == other; } - simdjson_inline simd8<bool> operator>=(const simd8<uint8_t> other) const { return other.min_val(*this) == other; } - simdjson_inline simd8<bool> operator>(const simd8<uint8_t> other) const { return this->gt_bits(other).any_bits_set(); } - simdjson_inline simd8<bool> operator<(const simd8<uint8_t> other) const { return this->lt_bits(other).any_bits_set(); } + // Explicit conversion to/from unsigned + simdjson_inline explicit simd8(const vuint8_t other): simd8(__riscv_vreinterpret_i8m1(other)) {} + simdjson_inline explicit operator simd8<uint8_t>() const { return __riscv_vreinterpret_u8m1(value); } - // Bit-specific operations - simdjson_inline simd8<bool> bits_not_set() const { return *this == uint8_t(0); } - simdjson_inline simd8<bool> bits_not_set(simd8<uint8_t> bits) const { return (*this & bits).bits_not_set(); } - simdjson_inline simd8<bool> any_bits_set() const { return ~this->bits_not_set(); } - simdjson_inline simd8<bool> any_bits_set(simd8<uint8_t> bits) const { return ~this->bits_not_set(bits); } - simdjson_inline bool is_ascii() const { - __m256i mask = __lasx_xvmskltz_b(*this); - return (0 == __lasx_xvpickve2gr_w(mask, 0)) && (0 == __lasx_xvpickve2gr_w(mask, 4)); + // Math + simdjson_inline simd8<int8_t> operator+(const simd8<int8_t> other) const { return __riscv_vadd(value, other, VL8); } + simdjson_inline simd8<int8_t> operator-(const simd8<int8_t> other) const { return __riscv_vsub(value, other, VL8); } + simdjson_inline simd8<int8_t>& operator+=(const simd8<int8_t> other) { value = *this + other; return *this; } + simdjson_inline simd8<int8_t>& operator-=(const simd8<int8_t> other) { value = *this - other; return *this; } + + // Order-sensitive comparisons + simdjson_inline simd8<int8_t> max_val( const simd8<int8_t> other) const { return __riscv_vmax( value, other, VL8); } + simdjson_inline simd8<int8_t> min_val( const simd8<int8_t> other) const { return __riscv_vmin( value, other, VL8); } + simdjson_inline simd8<bool> operator>( const simd8<int8_t> other) const { return __riscv_vmsgt(value, other, VL8); } + simdjson_inline simd8<bool> operator<( const simd8<int8_t> other) const { return __riscv_vmslt(value, other, VL8); } + simdjson_inline simd8<bool> operator==(const simd8<int8_t> other) const { return __riscv_vmseq(value, other, VL8); } + + template<int N=1> + simdjson_inline simd8<int8_t> prev(const simd8<int8_t> prev_chunk) const { + return __riscv_vslideup(__riscv_vslidedown(prev_chunk, VL8-N, VL8), value, N, VL8); } - simdjson_inline bool bits_not_set_anywhere() const { - __m256i v = __lasx_xvmsknz_b(*this); - return (0 == __lasx_xvpickve2gr_w(v, 0)) && (0 == __lasx_xvpickve2gr_w(v, 4)); + + // Perform a lookup assuming no value is larger than 16 + template<typename L> + simdjson_inline simd8<L> lookup_16(simd8<L> lookup_table) const { + return __riscv_vrgather(lookup_table, value, VL8); } - simdjson_inline bool any_bits_set_anywhere() const { return !bits_not_set_anywhere(); } - simdjson_inline bool bits_not_set_anywhere(simd8<uint8_t> bits) const { - __m256i v = __lasx_xvmsknz_b(__lasx_xvand_v(*this, bits)); - return (0 == __lasx_xvpickve2gr_w(v, 0)) && (0 == __lasx_xvpickve2gr_w(v, 4)); + template<typename L> + simdjson_inline simd8<L> lookup_16( + L replace0, L replace1, L replace2, L replace3, + L replace4, L replace5, L replace6, L replace7, + L replace8, L replace9, L replace10, L replace11, + L replace12, L replace13, L replace14, L replace15) const { + return lookup_16(simd8<L>::repeat_16( + replace0, replace1, replace2, replace3, + replace4, replace5, replace6, replace7, + replace8, replace9, replace10, replace11, + replace12, replace13, replace14, replace15 + )); } - simdjson_inline bool any_bits_set_anywhere(simd8<uint8_t> bits) const { return !bits_not_set_anywhere(bits); } - template<int N> - simdjson_inline simd8<uint8_t> shr() const { return simd8<uint8_t>(__lasx_xvsrli_b(*this, N)); } - template<int N> - simdjson_inline simd8<uint8_t> shl() const { return simd8<uint8_t>(__lasx_xvslli_b(*this, N)); } }; template<typename T> - struct simd8x64 { - static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<T>); - static_assert(NUM_CHUNKS == 2, "LASX kernel should use two registers per 64-byte block."); - const simd8<T> chunks[NUM_CHUNKS]; + struct simd8x64; + template<> + struct simd8x64<uint8_t> { + static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<uint8_t>); + vuint8x64_t value; - simd8x64(const simd8x64<T>& o) = delete; // no copy allowed - simd8x64<T>& operator=(const simd8<T>& other) = delete; // no assignment allowed - simd8x64() = delete; // no default constructor allowed +#if __riscv_v_fixed_vlen >= 512 + template<int idx> simd8<uint8_t> get() const { return value; } +#else + template<int idx> simd8<uint8_t> get() const { return __riscv_vget_u8m1(value, idx); } +#endif - simdjson_inline simd8x64(const simd8<T> chunk0, const simd8<T> chunk1) : chunks{chunk0, chunk1} {} - simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8<T>::load(ptr), simd8<T>::load(ptr+32)} {} + simdjson_inline operator const vuint8x64_t&() const { return this->value; } + simdjson_inline operator vuint8x64_t&() { return this->value; } - simdjson_inline uint64_t compress(uint64_t mask, T * output) const { - uint32_t mask1 = uint32_t(mask); - uint32_t mask2 = uint32_t(mask >> 32); - __m256i zcnt = __lasx_xvpcnt_w(__m256i(v4u64{~mask, 0, 0, 0})); - uint64_t zcnt1 = __lasx_xvpickve2gr_wu(zcnt, 0); - uint64_t zcnt2 = __lasx_xvpickve2gr_wu(zcnt, 1); - // There should be a critical value which processes in scaler is faster. - if (zcnt1) - this->chunks[0].compress(mask1, output); - if (zcnt2) - this->chunks[1].compress(mask2, output + zcnt1); - return zcnt1 + zcnt2; - } + simd8x64(const simd8x64<uint8_t>& o) = delete; // no copy allowed + simd8x64<uint8_t>& operator=(const simd8<uint8_t>& other) = delete; // no assignment allowed + simd8x64() = delete; // no default constructor allowed - simdjson_inline void store(T ptr[64]) const { - this->chunks[0].store(ptr+sizeof(simd8<T>)*0); - this->chunks[1].store(ptr+sizeof(simd8<T>)*1); - } +#if __riscv_v_fixed_vlen == 128 + simdjson_inline simd8x64(const uint8_t *ptr, size_t n = 64) : value(__riscv_vle8_v_u8m4(ptr, n)) {} +#elif __riscv_v_fixed_vlen == 256 + simdjson_inline simd8x64(const uint8_t *ptr, size_t n = 64) : value(__riscv_vle8_v_u8m2(ptr, n)) {} +#else + simdjson_inline simd8x64(const uint8_t *ptr, size_t n = 64) : value(__riscv_vle8_v_u8m1(ptr, n)) {} +#endif - simdjson_inline uint64_t to_bitmask() const { - __m256i mask0 = __lasx_xvmskltz_b(this->chunks[0]); - __m256i mask1 = __lasx_xvmskltz_b(this->chunks[1]); - __m256i mask_tmp = __lasx_xvpickve_w(mask0, 4); - __m256i tmp = __lasx_xvpickve_w(mask1, 4); - mask0 = __lasx_xvinsve0_w(mask0, mask1, 1); - mask_tmp = __lasx_xvinsve0_w(mask_tmp, tmp, 1); - return __lasx_xvpickve2gr_du(__lasx_xvpackev_h(mask_tmp, mask0), 0); + simdjson_inline void store(uint8_t ptr[64]) const { + __riscv_vse8(ptr, value, 64); } - simdjson_inline simd8<T> reduce_or() const { - return this->chunks[0] | this->chunks[1]; + simdjson_inline bool is_ascii() const { +#if __riscv_v_fixed_vlen == 128 + return __riscv_vfirst(__riscv_vmslt(__riscv_vreinterpret_i8m4(value), 0, 64), 64) < 0; +#elif __riscv_v_fixed_vlen == 256 + return __riscv_vfirst(__riscv_vmslt(__riscv_vreinterpret_i8m2(value), 0, 64), 64) < 0; +#else + return __riscv_vfirst(__riscv_vmslt(__riscv_vreinterpret_i8m1(value), 0, 64), 64) < 0; +#endif } - simdjson_inline uint64_t eq(const T m) const { - const simd8<T> mask = simd8<T>::splat(m); - return simd8x64<bool>( - this->chunks[0] == mask, - this->chunks[1] == mask - ).to_bitmask(); + // compress inactive elements, to match AVX-512 behavior + simdjson_inline uint64_t compress(uint64_t mask, uint8_t * output) const { + mask = ~mask; +#if __riscv_v_fixed_vlen == 128 + vboolx64_t m = __riscv_vreinterpret_b2(__riscv_vmv_s_x_u64m1(mask, 1)); +#elif __riscv_v_fixed_vlen == 256 + vboolx64_t m = __riscv_vreinterpret_b4(__riscv_vmv_s_x_u64m1(mask, 1)); +#else + vboolx64_t m = __riscv_vreinterpret_b8(__riscv_vmv_s_x_u64m1(mask, 1)); +#endif + size_t cnt = count_ones(mask); + __riscv_vse8(output, __riscv_vcompress(value, m, 64), cnt); + return cnt; } - simdjson_inline uint64_t eq(const simd8x64<uint8_t> &other) const { - return simd8x64<bool>( - this->chunks[0] == other.chunks[0], - this->chunks[1] == other.chunks[1] - ).to_bitmask(); + simdjson_inline uint64_t eq(const uint8_t m) const { + return __riscv_vmv_x(__riscv_vreinterpret_u64m1(__riscv_vmseq(value, m, 64))); } - simdjson_inline uint64_t lteq(const T m) const { - const simd8<T> mask = simd8<T>::splat(m); - return simd8x64<bool>( - this->chunks[0] <= mask, - this->chunks[1] <= mask - ).to_bitmask(); + simdjson_inline uint64_t lteq(const uint8_t m) const { + return __riscv_vmv_x(__riscv_vreinterpret_u64m1(__riscv_vmsleu(value, m, 64))); } - }; // struct simd8x64<T> + }; // struct simd8x64<uint8_t> } // namespace simd } // unnamed namespace -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson -#endif // SIMDJSON_LASX_SIMD_H -/* end file simdjson/lasx/simd.h */ -/* including simdjson/lasx/stringparsing_defs.h: #include "simdjson/lasx/stringparsing_defs.h" */ -/* begin file simdjson/lasx/stringparsing_defs.h */ -#ifndef SIMDJSON_LASX_STRINGPARSING_DEFS_H -#define SIMDJSON_LASX_STRINGPARSING_DEFS_H +#endif // SIMDJSON_RVV_VLS_SIMD_H +/* end file simdjson/rvv-vls/simd.h */ +/* including simdjson/rvv-vls/stringparsing_defs.h: #include "simdjson/rvv-vls/stringparsing_defs.h" */ +/* begin file simdjson/rvv-vls/stringparsing_defs.h */ +#ifndef SIMDJSON_RVV_VLS_STRINGPARSING_DEFS_H +#define SIMDJSON_RVV_VLS_STRINGPARSING_DEFS_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/simd.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/bitmanipulation.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace { using namespace simd; @@ -138868,73 +170982,120 @@ using namespace simd; // Holds backslashes and quotes locations. struct backslash_and_quote { public: - static constexpr uint32_t BYTES_PROCESSED = 32; + static constexpr uint64_t BYTES_PROCESSED = sizeof(simd8<uint8_t>); simdjson_inline backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst); simdjson_inline bool has_quote_first() { return ((bs_bits - 1) & quote_bits) != 0; } - simdjson_inline bool has_backslash() { return bs_bits != 0; } + simdjson_inline bool has_backslash() { return ((quote_bits - 1) & bs_bits) != 0; } simdjson_inline int quote_index() { return trailing_zeroes(quote_bits); } simdjson_inline int backslash_index() { return trailing_zeroes(bs_bits); } - uint32_t bs_bits; - uint32_t quote_bits; + uint64_t bs_bits; + uint64_t quote_bits; }; // struct backslash_and_quote simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) { - // this can read up to 31 bytes beyond the buffer size, but we require - // SIMDJSON_PADDING of padding static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "backslash and quote finder must process fewer than SIMDJSON_PADDING bytes"); simd8<uint8_t> v(src); v.store(dst); - return { - static_cast<uint32_t>((v == '\\').to_bitmask()), // bs_bits - static_cast<uint32_t>((v == '"').to_bitmask()), // quote_bits - }; + return { (v == '\\').to_bitmask(), (v == '"').to_bitmask() }; } - struct escaping { - static constexpr uint32_t BYTES_PROCESSED = 16; + static constexpr uint64_t BYTES_PROCESSED = sizeof(simd8<uint8_t>); simdjson_inline static escaping copy_and_find(const uint8_t *src, uint8_t *dst); simdjson_inline bool has_escape() { return escape_bits != 0; } - simdjson_inline int escape_index() { return trailing_zeroes(escape_bits); } + simdjson_inline int escape_index() { return trailing_zeroes(escape_bits) / 4; } uint64_t escape_bits; }; // struct escaping - - simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *dst) { static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "escaping finder must process fewer than SIMDJSON_PADDING bytes"); simd8<uint8_t> v(src); v.store(dst); - simd8<bool> is_quote = (v == '"'); - simd8<bool> is_backslash = (v == '\\'); - simd8<bool> is_control = (v < 32); - return { - (is_backslash | is_quote | is_control).to_bitmask() - }; + return { ((v == '"') | (v == '\\') | (v == 32)).to_bitmask() }; } + } // unnamed namespace -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson -#endif // SIMDJSON_LASX_STRINGPARSING_DEFS_H -/* end file simdjson/lasx/stringparsing_defs.h */ +#endif // SIMDJSON_RVV_VLS_STRINGPARSING_DEFS_H +/* end file simdjson/rvv-vls/stringparsing_defs.h */ +/* including simdjson/rvv-vls/numberparsing_defs.h: #include "simdjson/rvv-vls/numberparsing_defs.h" */ +/* begin file simdjson/rvv-vls/numberparsing_defs.h */ +#ifndef SIMDJSON_RVV_VLS_NUMBERPARSING_DEFS_H +#define SIMDJSON_RVV_VLS_NUMBERPARSING_DEFS_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +#include <cstring> + +#ifdef JSON_TEST_NUMBERS // for unit testing +void found_invalid_number(const uint8_t *buf); +void found_integer(int64_t result, const uint8_t *buf); +void found_unsigned_integer(uint64_t result, const uint8_t *buf); +void found_float(double result, const uint8_t *buf); +#endif + +namespace simdjson { +namespace rvv_vls { +namespace numberparsing { + +// credit: https://johnnylee-sde.github.io/Fast-numeric-string-to-int/ +/** @private */ +static simdjson_inline uint32_t parse_eight_digits_unrolled(const char *chars) { + uint64_t val; +#if __riscv_misaligned_fast + memcpy(&val, chars, sizeof(uint64_t)); +#else + val = __riscv_vmv_x(__riscv_vreinterpret_u64m1(__riscv_vlmul_ext_u8m1(__riscv_vle8_v_u8mf2((uint8_t*)chars, 8)))); +#endif + val = (val & 0x0F0F0F0F0F0F0F0F) * 2561 >> 8; + val = (val & 0x00FF00FF00FF00FF) * 6553601 >> 16; + return uint32_t((val & 0x0000FFFF0000FFFF) * 42949672960001 >> 32); +} + +/** @private */ +static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) { + return parse_eight_digits_unrolled(reinterpret_cast<const char *>(chars)); +} + +/** @private */ +simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) { + internal::value128 answer; + __uint128_t r = (static_cast<__uint128_t>(value1)) * value2; + answer.low = uint64_t(r); + answer.high = uint64_t(r >> 64); + return answer; +} + +} // namespace numberparsing +} // namespace rvv_vls +} // namespace simdjson + +#define SIMDJSON_SWAR_NUMBER_PARSING 1 + +#endif // SIMDJSON_RVV_VLS_NUMBERPARSING_DEFS_H +/* end file simdjson/rvv-vls/numberparsing_defs.h */ #define SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT 1 -/* end file simdjson/lasx/begin.h */ -/* including simdjson/generic/ondemand/amalgamated.h for lasx: #include "simdjson/generic/ondemand/amalgamated.h" */ -/* begin file simdjson/generic/ondemand/amalgamated.h for lasx */ -#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_ONDEMAND_DEPENDENCIES_H) +/* end file simdjson/rvv-vls/begin.h */ +/* including simdjson/generic/ondemand/amalgamated.h for rvv_vls: #include "simdjson/generic/ondemand/amalgamated.h" */ +/* begin file simdjson/generic/ondemand/amalgamated.h for rvv_vls */ +#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_BUILDER_DEPENDENCIES_H) #error simdjson/generic/ondemand/dependencies.h must be included before simdjson/generic/ondemand/amalgamated.h! #endif // Stuff other things depend on -/* including simdjson/generic/ondemand/base.h for lasx: #include "simdjson/generic/ondemand/base.h" */ -/* begin file simdjson/generic/ondemand/base.h for lasx */ +/* including simdjson/generic/ondemand/base.h for rvv_vls: #include "simdjson/generic/ondemand/base.h" */ +/* begin file simdjson/generic/ondemand/base.h for rvv_vls */ #ifndef SIMDJSON_GENERIC_ONDEMAND_BASE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -138943,7 +171104,7 @@ simdjson_inline escaping escaping::copy_and_find(const uint8_t *src, uint8_t *ds /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace rvv_vls { /** * A fast, simple, DOM-like interface that parses JSON as you use it. * @@ -138954,8 +171115,8 @@ namespace ondemand { /** Represents the depth of a JSON value (number of nested arrays/objects). */ using depth_t = int32_t; -/** @copydoc simdjson::lasx::number_type */ -using number_type = simdjson::lasx::number_type; +/** @copydoc simdjson::rvv_vls::number_type */ +using number_type = simdjson::rvv_vls::number_type; /** @private Position in the JSON buffer indexes */ using token_position = const uint32_t *; @@ -138978,13 +171139,13 @@ class value; class value_iterator; } // namespace ondemand -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_BASE_H -/* end file simdjson/generic/ondemand/base.h for lasx */ -/* including simdjson/generic/ondemand/deserialize.h for lasx: #include "simdjson/generic/ondemand/deserialize.h" */ -/* begin file simdjson/generic/ondemand/deserialize.h for lasx */ +/* end file simdjson/generic/ondemand/base.h for rvv_vls */ +/* including simdjson/generic/ondemand/deserialize.h for rvv_vls: #include "simdjson/generic/ondemand/deserialize.h" */ +/* begin file simdjson/generic/ondemand/deserialize.h for rvv_vls */ #if SIMDJSON_SUPPORTS_CONCEPTS #ifndef SIMDJSON_ONDEMAND_DESERIALIZE_H @@ -139004,35 +171165,35 @@ template <> struct is_builtin_deserializable<int64_t> : std::true_type {}; template <> struct is_builtin_deserializable<uint64_t> : std::true_type {}; template <> struct is_builtin_deserializable<double> : std::true_type {}; template <> struct is_builtin_deserializable<bool> : std::true_type {}; -template <> struct is_builtin_deserializable<lasx::ondemand::array> : std::true_type {}; -template <> struct is_builtin_deserializable<lasx::ondemand::object> : std::true_type {}; -template <> struct is_builtin_deserializable<lasx::ondemand::value> : std::true_type {}; -template <> struct is_builtin_deserializable<lasx::ondemand::raw_json_string> : std::true_type {}; +template <> struct is_builtin_deserializable<rvv_vls::ondemand::array> : std::true_type {}; +template <> struct is_builtin_deserializable<rvv_vls::ondemand::object> : std::true_type {}; +template <> struct is_builtin_deserializable<rvv_vls::ondemand::value> : std::true_type {}; +template <> struct is_builtin_deserializable<rvv_vls::ondemand::raw_json_string> : std::true_type {}; template <> struct is_builtin_deserializable<std::string_view> : std::true_type {}; template <typename T> concept is_builtin_deserializable_v = is_builtin_deserializable<T>::value; -template <typename T, typename ValT = lasx::ondemand::value> +template <typename T, typename ValT = rvv_vls::ondemand::value> concept custom_deserializable = tag_invocable<deserialize_tag, ValT&, T&>; -template <typename T, typename ValT = lasx::ondemand::value> +template <typename T, typename ValT = rvv_vls::ondemand::value> concept deserializable = custom_deserializable<T, ValT> || is_builtin_deserializable_v<T> || concepts::optional_type<T>; -template <typename T, typename ValT = lasx::ondemand::value> +template <typename T, typename ValT = rvv_vls::ondemand::value> concept nothrow_custom_deserializable = nothrow_tag_invocable<deserialize_tag, ValT&, T&>; // built-in types are noexcept and if an error happens, the value simply gets ignored and the error is returned. -template <typename T, typename ValT = lasx::ondemand::value> +template <typename T, typename ValT = rvv_vls::ondemand::value> concept nothrow_deserializable = nothrow_custom_deserializable<T, ValT> || is_builtin_deserializable_v<T>; /// Deserialize Tag inline constexpr struct deserialize_tag { - using array_type = lasx::ondemand::array; - using object_type = lasx::ondemand::object; - using value_type = lasx::ondemand::value; - using document_type = lasx::ondemand::document; - using document_reference_type = lasx::ondemand::document_reference; + using array_type = rvv_vls::ondemand::array; + using object_type = rvv_vls::ondemand::object; + using value_type = rvv_vls::ondemand::value; + using document_type = rvv_vls::ondemand::document; + using document_reference_type = rvv_vls::ondemand::document_reference; // Customization Point for array template <typename T> @@ -139077,9 +171238,9 @@ inline constexpr struct deserialize_tag { #endif // SIMDJSON_ONDEMAND_DESERIALIZE_H #endif // SIMDJSON_SUPPORTS_CONCEPTS -/* end file simdjson/generic/ondemand/deserialize.h for lasx */ -/* including simdjson/generic/ondemand/value_iterator.h for lasx: #include "simdjson/generic/ondemand/value_iterator.h" */ -/* begin file simdjson/generic/ondemand/value_iterator.h for lasx */ +/* end file simdjson/generic/ondemand/deserialize.h for rvv_vls */ +/* including simdjson/generic/ondemand/value_iterator.h for rvv_vls: #include "simdjson/generic/ondemand/value_iterator.h" */ +/* begin file simdjson/generic/ondemand/value_iterator.h for rvv_vls */ #ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -139089,7 +171250,7 @@ inline constexpr struct deserialize_tag { /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace ondemand { /** @@ -139554,21 +171715,22 @@ class value_iterator { friend class document; friend class object; + friend class object_iterator; friend class array; friend class value; friend class field; }; // value_iterator } // namespace ondemand -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<lasx::ondemand::value_iterator> : public lasx::implementation_simdjson_result_base<lasx::ondemand::value_iterator> { +struct simdjson_result<rvv_vls::ondemand::value_iterator> : public rvv_vls::implementation_simdjson_result_base<rvv_vls::ondemand::value_iterator> { public: - simdjson_inline simdjson_result(lasx::ondemand::value_iterator &&value) noexcept; ///< @private + simdjson_inline simdjson_result(rvv_vls::ondemand::value_iterator &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; }; @@ -139576,9 +171738,9 @@ struct simdjson_result<lasx::ondemand::value_iterator> : public lasx::implementa } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_H -/* end file simdjson/generic/ondemand/value_iterator.h for lasx */ -/* including simdjson/generic/ondemand/value.h for lasx: #include "simdjson/generic/ondemand/value.h" */ -/* begin file simdjson/generic/ondemand/value.h for lasx */ +/* end file simdjson/generic/ondemand/value_iterator.h for rvv_vls */ +/* including simdjson/generic/ondemand/value.h for rvv_vls: #include "simdjson/generic/ondemand/value.h" */ +/* begin file simdjson/generic/ondemand/value.h for rvv_vls */ #ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -139594,7 +171756,7 @@ struct simdjson_result<lasx::ondemand::value_iterator> : public lasx::implementa namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace ondemand { /** * An ephemeral JSON value returned during iteration. It is only valid for as long as you do @@ -140308,20 +172470,20 @@ class value { }; } // namespace ondemand -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<lasx::ondemand::value> : public lasx::implementation_simdjson_result_base<lasx::ondemand::value> { +struct simdjson_result<rvv_vls::ondemand::value> : public rvv_vls::implementation_simdjson_result_base<rvv_vls::ondemand::value> { public: - simdjson_inline simdjson_result(lasx::ondemand::value &&value) noexcept; ///< @private + simdjson_inline simdjson_result(rvv_vls::ondemand::value &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; - simdjson_inline simdjson_result<lasx::ondemand::array> get_array() noexcept; - simdjson_inline simdjson_result<lasx::ondemand::object> get_object() noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::array> get_array() noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::object> get_object() noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64() noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64_in_string() noexcept; @@ -140333,7 +172495,7 @@ struct simdjson_result<lasx::ondemand::value> : public lasx::implementation_simd template <typename string_type> simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result<std::string_view> get_wobbly_string() noexcept; - simdjson_inline simdjson_result<lasx::ondemand::raw_json_string> get_raw_json_string() noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::raw_json_string> get_raw_json_string() noexcept; simdjson_inline simdjson_result<bool> get_bool() noexcept; simdjson_inline simdjson_result<bool> is_null() noexcept; @@ -140344,20 +172506,20 @@ struct simdjson_result<lasx::ondemand::value> : public lasx::implementation_simd #if SIMDJSON_EXCEPTIONS template <class T> explicit simdjson_inline operator T() noexcept(false); - simdjson_inline operator lasx::ondemand::array() noexcept(false); - simdjson_inline operator lasx::ondemand::object() noexcept(false); + simdjson_inline operator rvv_vls::ondemand::array() noexcept(false); + simdjson_inline operator rvv_vls::ondemand::object() noexcept(false); simdjson_inline operator uint64_t() noexcept(false); simdjson_inline operator int64_t() noexcept(false); simdjson_inline operator double() noexcept(false); simdjson_inline operator std::string_view() noexcept(false); - simdjson_inline operator lasx::ondemand::raw_json_string() noexcept(false); + simdjson_inline operator rvv_vls::ondemand::raw_json_string() noexcept(false); simdjson_inline operator bool() noexcept(false); #endif simdjson_inline simdjson_result<size_t> count_elements() & noexcept; simdjson_inline simdjson_result<size_t> count_fields() & noexcept; - simdjson_inline simdjson_result<lasx::ondemand::value> at(size_t index) noexcept; - simdjson_inline simdjson_result<lasx::ondemand::array_iterator> begin() & noexcept; - simdjson_inline simdjson_result<lasx::ondemand::array_iterator> end() & noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::value> at(size_t index) noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::array_iterator> begin() & noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::array_iterator> end() & noexcept; /** * Look up a field by name on an object (order-sensitive). By order-sensitive, we mean that @@ -140381,9 +172543,9 @@ struct simdjson_result<lasx::ondemand::value> : public lasx::implementation_simd * @param key The key to look up. * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object. */ - simdjson_inline simdjson_result<lasx::ondemand::value> find_field(std::string_view key) noexcept; - /** @overload simdjson_inline simdjson_result<lasx::ondemand::value> find_field(std::string_view key) noexcept; */ - simdjson_inline simdjson_result<lasx::ondemand::value> find_field(const char *key) noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::value> find_field(std::string_view key) noexcept; + /** @overload simdjson_inline simdjson_result<rvv_vls::ondemand::value> find_field(std::string_view key) noexcept; */ + simdjson_inline simdjson_result<rvv_vls::ondemand::value> find_field(const char *key) noexcept; /** * Look up a field by name on an object, without regard to key order. @@ -140395,7 +172557,7 @@ struct simdjson_result<lasx::ondemand::value> : public lasx::implementation_simd * in question is large. The fact that the extra code is there also bumps the executable size. * * We default operator[] on find_field_unordered() for convenience. - * It is the defaul because it would be highly surprising (and hard to debug) if the + * It is the default because it would be highly surprising (and hard to debug) if the * default behavior failed to look up a field just because it was in the wrong order--and many * APIs assume this. Therefore, you must be explicit if you want to treat objects as out of order. * @@ -140405,14 +172567,14 @@ struct simdjson_result<lasx::ondemand::value> : public lasx::implementation_simd * @param key The key to look up. * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object. */ - simdjson_inline simdjson_result<lasx::ondemand::value> find_field_unordered(std::string_view key) noexcept; - /** @overload simdjson_inline simdjson_result<lasx::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ - simdjson_inline simdjson_result<lasx::ondemand::value> find_field_unordered(const char *key) noexcept; - /** @overload simdjson_inline simdjson_result<lasx::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ - simdjson_inline simdjson_result<lasx::ondemand::value> operator[](std::string_view key) noexcept; - /** @overload simdjson_inline simdjson_result<lasx::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ - simdjson_inline simdjson_result<lasx::ondemand::value> operator[](const char *key) noexcept; - simdjson_result<lasx::ondemand::value> operator[](int) noexcept = delete; + simdjson_inline simdjson_result<rvv_vls::ondemand::value> find_field_unordered(std::string_view key) noexcept; + /** @overload simdjson_inline simdjson_result<rvv_vls::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ + simdjson_inline simdjson_result<rvv_vls::ondemand::value> find_field_unordered(const char *key) noexcept; + /** @overload simdjson_inline simdjson_result<rvv_vls::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ + simdjson_inline simdjson_result<rvv_vls::ondemand::value> operator[](std::string_view key) noexcept; + /** @overload simdjson_inline simdjson_result<rvv_vls::ondemand::value> find_field_unordered(std::string_view key) noexcept; */ + simdjson_inline simdjson_result<rvv_vls::ondemand::value> operator[](const char *key) noexcept; + simdjson_result<rvv_vls::ondemand::value> operator[](int) noexcept = delete; /** * Get the type of this JSON value. It does not validate or consume the value. @@ -140436,13 +172598,13 @@ struct simdjson_result<lasx::ondemand::value> : public lasx::implementation_simd * better to just call .get_double, .get_string, etc. and check for INCORRECT_TYPE (or just * let it throw an exception). */ - simdjson_inline simdjson_result<lasx::ondemand::json_type> type() noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::json_type> type() noexcept; simdjson_inline simdjson_result<bool> is_scalar() noexcept; simdjson_inline simdjson_result<bool> is_string() noexcept; simdjson_inline simdjson_result<bool> is_negative() noexcept; simdjson_inline simdjson_result<bool> is_integer() noexcept; - simdjson_inline simdjson_result<lasx::number_type> get_number_type() noexcept; - simdjson_inline simdjson_result<lasx::ondemand::number> get_number() noexcept; + simdjson_inline simdjson_result<rvv_vls::number_type> get_number_type() noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::number> get_number() noexcept; /** @copydoc simdjson_inline std::string_view value::raw_json_token() const noexcept */ simdjson_inline simdjson_result<std::string_view> raw_json_token() noexcept; @@ -140452,17 +172614,17 @@ struct simdjson_result<lasx::ondemand::value> : public lasx::implementation_simd simdjson_inline simdjson_result<const char *> current_location() noexcept; /** @copydoc simdjson_inline int32_t current_depth() const noexcept */ simdjson_inline simdjson_result<int32_t> current_depth() const noexcept; - simdjson_inline simdjson_result<lasx::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result<lasx::ondemand::value> at_path(std::string_view json_path) noexcept; - simdjson_inline simdjson_result<std::vector<lasx::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::value> at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<std::vector<rvv_vls::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; }; } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_H -/* end file simdjson/generic/ondemand/value.h for lasx */ -/* including simdjson/generic/ondemand/logger.h for lasx: #include "simdjson/generic/ondemand/logger.h" */ -/* begin file simdjson/generic/ondemand/logger.h for lasx */ +/* end file simdjson/generic/ondemand/value.h for rvv_vls */ +/* including simdjson/generic/ondemand/logger.h for rvv_vls: #include "simdjson/generic/ondemand/logger.h" */ +/* begin file simdjson/generic/ondemand/logger.h for rvv_vls */ #ifndef SIMDJSON_GENERIC_ONDEMAND_LOGGER_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -140471,7 +172633,7 @@ struct simdjson_result<lasx::ondemand::value> : public lasx::implementation_simd /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace ondemand { // Logging should be free unless SIMDJSON_VERBOSE_LOGGING is set. Importantly, it is critical @@ -140517,13 +172679,13 @@ static inline void log_error(const value_iterator &iter, const char *error, cons } // namespace logger } // namespace ondemand -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_LOGGER_H -/* end file simdjson/generic/ondemand/logger.h for lasx */ -/* including simdjson/generic/ondemand/token_iterator.h for lasx: #include "simdjson/generic/ondemand/token_iterator.h" */ -/* begin file simdjson/generic/ondemand/token_iterator.h for lasx */ +/* end file simdjson/generic/ondemand/logger.h for rvv_vls */ +/* including simdjson/generic/ondemand/token_iterator.h for rvv_vls: #include "simdjson/generic/ondemand/token_iterator.h" */ +/* begin file simdjson/generic/ondemand/token_iterator.h for rvv_vls */ #ifndef SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -140534,7 +172696,7 @@ static inline void log_error(const value_iterator &iter, const char *error, cons /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace ondemand { /** @@ -140665,15 +172827,15 @@ class token_iterator { }; } // namespace ondemand -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<lasx::ondemand::token_iterator> : public lasx::implementation_simdjson_result_base<lasx::ondemand::token_iterator> { +struct simdjson_result<rvv_vls::ondemand::token_iterator> : public rvv_vls::implementation_simdjson_result_base<rvv_vls::ondemand::token_iterator> { public: - simdjson_inline simdjson_result(lasx::ondemand::token_iterator &&value) noexcept; ///< @private + simdjson_inline simdjson_result(rvv_vls::ondemand::token_iterator &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; simdjson_inline ~simdjson_result() noexcept = default; ///< @private @@ -140682,9 +172844,9 @@ struct simdjson_result<lasx::ondemand::token_iterator> : public lasx::implementa } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_H -/* end file simdjson/generic/ondemand/token_iterator.h for lasx */ -/* including simdjson/generic/ondemand/json_iterator.h for lasx: #include "simdjson/generic/ondemand/json_iterator.h" */ -/* begin file simdjson/generic/ondemand/json_iterator.h for lasx */ +/* end file simdjson/generic/ondemand/token_iterator.h for rvv_vls */ +/* including simdjson/generic/ondemand/json_iterator.h for rvv_vls: #include "simdjson/generic/ondemand/json_iterator.h" */ +/* begin file simdjson/generic/ondemand/json_iterator.h for rvv_vls */ #ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -140695,7 +172857,7 @@ struct simdjson_result<lasx::ondemand::token_iterator> : public lasx::implementa /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace ondemand { /** @@ -141006,15 +173168,15 @@ class json_iterator { }; // json_iterator } // namespace ondemand -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<lasx::ondemand::json_iterator> : public lasx::implementation_simdjson_result_base<lasx::ondemand::json_iterator> { +struct simdjson_result<rvv_vls::ondemand::json_iterator> : public rvv_vls::implementation_simdjson_result_base<rvv_vls::ondemand::json_iterator> { public: - simdjson_inline simdjson_result(lasx::ondemand::json_iterator &&value) noexcept; ///< @private + simdjson_inline simdjson_result(rvv_vls::ondemand::json_iterator &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; @@ -141023,9 +173185,9 @@ struct simdjson_result<lasx::ondemand::json_iterator> : public lasx::implementat } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_H -/* end file simdjson/generic/ondemand/json_iterator.h for lasx */ -/* including simdjson/generic/ondemand/json_type.h for lasx: #include "simdjson/generic/ondemand/json_type.h" */ -/* begin file simdjson/generic/ondemand/json_type.h for lasx */ +/* end file simdjson/generic/ondemand/json_iterator.h for rvv_vls */ +/* including simdjson/generic/ondemand/json_type.h for rvv_vls: #include "simdjson/generic/ondemand/json_type.h" */ +/* begin file simdjson/generic/ondemand/json_type.h for rvv_vls */ #ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -141036,7 +173198,7 @@ struct simdjson_result<lasx::ondemand::json_iterator> : public lasx::implementat /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace ondemand { /** @@ -141170,15 +173332,15 @@ inline std::ostream& operator<<(std::ostream& out, simdjson_result<json_type> &t #endif } // namespace ondemand -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<lasx::ondemand::json_type> : public lasx::implementation_simdjson_result_base<lasx::ondemand::json_type> { +struct simdjson_result<rvv_vls::ondemand::json_type> : public rvv_vls::implementation_simdjson_result_base<rvv_vls::ondemand::json_type> { public: - simdjson_inline simdjson_result(lasx::ondemand::json_type &&value) noexcept; ///< @private + simdjson_inline simdjson_result(rvv_vls::ondemand::json_type &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; simdjson_inline ~simdjson_result() noexcept = default; ///< @private @@ -141187,9 +173349,9 @@ struct simdjson_result<lasx::ondemand::json_type> : public lasx::implementation_ } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_H -/* end file simdjson/generic/ondemand/json_type.h for lasx */ -/* including simdjson/generic/ondemand/raw_json_string.h for lasx: #include "simdjson/generic/ondemand/raw_json_string.h" */ -/* begin file simdjson/generic/ondemand/raw_json_string.h for lasx */ +/* end file simdjson/generic/ondemand/json_type.h for rvv_vls */ +/* including simdjson/generic/ondemand/raw_json_string.h for rvv_vls: #include "simdjson/generic/ondemand/raw_json_string.h" */ +/* begin file simdjson/generic/ondemand/raw_json_string.h for rvv_vls */ #ifndef SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -141199,7 +173361,7 @@ struct simdjson_result<lasx::ondemand::json_type> : public lasx::implementation_ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace ondemand { /** @@ -141381,30 +173543,30 @@ simdjson_unused simdjson_inline bool operator!=(std::string_view c, const raw_js } // namespace ondemand -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<lasx::ondemand::raw_json_string> : public lasx::implementation_simdjson_result_base<lasx::ondemand::raw_json_string> { +struct simdjson_result<rvv_vls::ondemand::raw_json_string> : public rvv_vls::implementation_simdjson_result_base<rvv_vls::ondemand::raw_json_string> { public: - simdjson_inline simdjson_result(lasx::ondemand::raw_json_string &&value) noexcept; ///< @private + simdjson_inline simdjson_result(rvv_vls::ondemand::raw_json_string &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; simdjson_inline ~simdjson_result() noexcept = default; ///< @private simdjson_inline simdjson_result<const char *> raw() const noexcept; simdjson_inline char operator[](size_t) const noexcept; - simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> unescape(lasx::ondemand::json_iterator &iter, bool allow_replacement) const noexcept; - simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> unescape_wobbly(lasx::ondemand::json_iterator &iter) const noexcept; + simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> unescape(rvv_vls::ondemand::json_iterator &iter, bool allow_replacement) const noexcept; + simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> unescape_wobbly(rvv_vls::ondemand::json_iterator &iter) const noexcept; }; } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_H -/* end file simdjson/generic/ondemand/raw_json_string.h for lasx */ -/* including simdjson/generic/ondemand/parser.h for lasx: #include "simdjson/generic/ondemand/parser.h" */ -/* begin file simdjson/generic/ondemand/parser.h for lasx */ +/* end file simdjson/generic/ondemand/raw_json_string.h for rvv_vls */ +/* including simdjson/generic/ondemand/parser.h for rvv_vls: #include "simdjson/generic/ondemand/parser.h" */ +/* begin file simdjson/generic/ondemand/parser.h for rvv_vls */ #ifndef SIMDJSON_GENERIC_ONDEMAND_PARSER_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -141417,7 +173579,7 @@ struct simdjson_result<lasx::ondemand::raw_json_string> : public lasx::implement #include <thread> namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace ondemand { /** @@ -141817,15 +173979,15 @@ class parser { }; } // namespace ondemand -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<lasx::ondemand::parser> : public lasx::implementation_simdjson_result_base<lasx::ondemand::parser> { +struct simdjson_result<rvv_vls::ondemand::parser> : public rvv_vls::implementation_simdjson_result_base<rvv_vls::ondemand::parser> { public: - simdjson_inline simdjson_result(lasx::ondemand::parser &&value) noexcept; ///< @private + simdjson_inline simdjson_result(rvv_vls::ondemand::parser &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; }; @@ -141833,319 +173995,11 @@ struct simdjson_result<lasx::ondemand::parser> : public lasx::implementation_sim } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_PARSER_H -/* end file simdjson/generic/ondemand/parser.h for lasx */ - -// JSON builder - needed for extract_into functionality -/* including simdjson/generic/ondemand/json_string_builder.h for lasx: #include "simdjson/generic/ondemand/json_string_builder.h" */ -/* begin file simdjson/generic/ondemand/json_string_builder.h for lasx */ -/** - * This file is part of the builder API. It is temporarily in the ondemand directory - * but we will move it to a builder directory later. - */ -#ifndef SIMDJSON_GENERIC_STRING_BUILDER_H - -/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_H */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */ -/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ - -namespace simdjson { - - -#if SIMDJSON_SUPPORTS_CONCEPTS - -namespace lasx { -namespace builder { - class string_builder; -}} - -template <typename T, typename = void> -struct has_custom_serialization : std::false_type {}; - -inline constexpr struct serialize_tag { - template <typename T> - constexpr void operator()(lasx::builder::string_builder& b, T&& obj) const{ - return tag_invoke(*this, b, std::forward<T>(obj)); - } - - -} serialize{}; -template <typename T> -struct has_custom_serialization<T, std::void_t< - decltype(tag_invoke(serialize, std::declval<lasx::builder::string_builder&>(), std::declval<T&>())) ->> : std::true_type {}; - -template <typename T> -constexpr bool require_custom_serialization = has_custom_serialization<T>::value; -#else -struct has_custom_serialization : std::false_type {}; -#endif // SIMDJSON_SUPPORTS_CONCEPTS - -namespace lasx { -namespace builder { -/** - * A builder for JSON strings representing documents. This is a low-level - * builder that is not meant to be used directly by end-users. Though it - * supports atomic types (Booleans, strings), it does not support composed - * types (arrays and objects). - * - * Ultimately, this class can support kernel-specific optimizations. E.g., - * it may make use of SIMD instructions to escape strings faster. - */ -class string_builder { -public: - simdjson_inline string_builder(size_t initial_capacity = DEFAULT_INITIAL_CAPACITY); - - static constexpr size_t DEFAULT_INITIAL_CAPACITY = 1024; - - /** - * Append number (includes Booleans). Booleans are mapped to the strings - * false and true. Numbers are converted to strings abiding by the JSON standard. - * Floating-point numbers are converted to the shortest string that 'correctly' - * represents the number. - */ - template<typename number_type, - typename = typename std::enable_if<std::is_arithmetic<number_type>::value>::type> - simdjson_inline void append(number_type v) noexcept; - - /** - * Append character c. - */ - simdjson_inline void append(char c) noexcept; - - /** - * Append the string 'null'. - */ - simdjson_inline void append_null() noexcept; - - /** - * Clear the content. - */ - simdjson_inline void clear() noexcept; - - /** - * Append the std::string_view, after escaping it. - * There is no UTF-8 validation. - */ - simdjson_inline void escape_and_append(std::string_view input) noexcept; - - /** - * Append the std::string_view surrounded by double quotes, after escaping it. - * There is no UTF-8 validation. - */ - simdjson_inline void escape_and_append_with_quotes(std::string_view input) noexcept; -#if SIMDJSON_SUPPORTS_CONCEPTS - template<constevalutil::fixed_string key> - simdjson_inline void escape_and_append_with_quotes() noexcept; -#endif - /** - * Append the character surrounded by double quotes, after escaping it. - * There is no UTF-8 validation. - */ - simdjson_inline void escape_and_append_with_quotes(char input) noexcept; - - /** - * Append the character surrounded by double quotes, after escaping it. - * There is no UTF-8 validation. - */ - simdjson_inline void escape_and_append_with_quotes(const char* input) noexcept; - - /** - * Append the C string directly, without escaping. - * There is no UTF-8 validation. - */ - simdjson_inline void append_raw(const char *c) noexcept; - - /** - * Append "{" to the buffer. - */ - simdjson_inline void start_object() noexcept; - - /** - * Append "}" to the buffer. - */ - simdjson_inline void end_object() noexcept; - - /** - * Append "[" to the buffer. - */ - simdjson_inline void start_array() noexcept; - - /** - * Append "]" to the buffer. - */ - simdjson_inline void end_array() noexcept; - - /** - * Append "," to the buffer. - */ - simdjson_inline void append_comma() noexcept; - - /** - * Append ":" to the buffer. - */ - simdjson_inline void append_colon() noexcept; - - /** - * Append a key-value pair to the buffer. - * The key is escaped and surrounded by double quotes. - * The value is escaped if it is a string. - */ - template<typename key_type, typename value_type> - simdjson_inline void append_key_value(key_type key, value_type value) noexcept; -#if SIMDJSON_SUPPORTS_CONCEPTS - template<constevalutil::fixed_string key, typename value_type> - simdjson_inline void append_key_value(value_type value) noexcept; - - // Support for optional types (std::optional, etc.) - template <concepts::optional_type T> - requires(!require_custom_serialization<T>) - simdjson_inline void append(const T &opt); - - template <typename T> - requires(require_custom_serialization<T>) - simdjson_inline void append(T &&val); - - // Support for string-like types - template <typename T> - requires(std::is_convertible<T, std::string_view>::value || - std::is_same<T, const char*>::value ) - simdjson_inline void append(const T &value); -#endif -#if SIMDJSON_SUPPORTS_RANGES && SIMDJSON_SUPPORTS_CONCEPTS - // Support for range-based appending (std::ranges::view, etc.) - template <std::ranges::range R> -requires (!std::is_convertible<R, std::string_view>::value && !require_custom_serialization<R>) - simdjson_inline void append(const R &range) noexcept; -#endif - /** - * Append the std::string_view directly, without escaping. - * There is no UTF-8 validation. - */ - simdjson_inline void append_raw(std::string_view input) noexcept; - - /** - * Append len characters from str. - * There is no UTF-8 validation. - */ - simdjson_inline void append_raw(const char *str, size_t len) noexcept; -#if SIMDJSON_EXCEPTIONS - /** - * Creates an std::string from the written JSON buffer. - * Throws if memory allocation failed - * - * The result may not be valid UTF-8 if some of your content was not valid UTF-8. - * Use validate_unicode() to check the content if needed. - */ - simdjson_inline operator std::string() const noexcept(false); - - /** - * Creates an std::string_view from the written JSON buffer. - * Throws if memory allocation failed. - * - * The result may not be valid UTF-8 if some of your content was not valid UTF-8. - * Use validate_unicode() to check the content if needed. - */ - simdjson_inline operator std::string_view() const noexcept(false) simdjson_lifetime_bound; -#endif - - /** - * Returns a view on the written JSON buffer. Returns an error - * if memory allocation failed. - * - * The result may not be valid UTF-8 if some of your content was not valid UTF-8. - * Use validate_unicode() to check the content. - */ - simdjson_inline simdjson_result<std::string_view> view() const noexcept; - - /** - * Appends the null character to the buffer and returns - * a pointer to the beginning of the written JSON buffer. - * Returns an error if memory allocation failed. - * The result is null-terminated. - * - * The result may not be valid UTF-8 if some of your content was not valid UTF-8. - * Use validate_unicode() to check the content. - */ - simdjson_inline simdjson_result<const char *> c_str() noexcept; - - /** - * Return true if the content is valid UTF-8. - */ - simdjson_inline bool validate_unicode() const noexcept; - - /** - * Returns the current size of the written JSON buffer. - * If an error occurred, returns 0. - */ - simdjson_inline size_t size() const noexcept; - -private: - /** - * Returns true if we can write at least upcoming_bytes bytes. - * The underlying buffer is reallocated if needed. It is designed - * to be called before writing to the buffer. It should be fast. - */ - simdjson_inline bool capacity_check(size_t upcoming_bytes); - - /** - * Grow the buffer to at least desired_capacity bytes. - * If the allocation fails, is_valid is set to false. We expect - * that this function would not be repeatedly called. - */ - simdjson_inline void grow_buffer(size_t desired_capacity); - - /** - * We use this helper function to make sure that is_valid is kept consistent. - */ - simdjson_inline void set_valid(bool valid) noexcept; - - std::unique_ptr<char[]> buffer{}; - size_t position{0}; - size_t capacity{0}; - bool is_valid{true}; -}; - - - -} -} - - -#if !SIMDJSON_STATIC_REFLECTION -// fallback implementation until we have static reflection -template <class Z> -simdjson_warn_unused simdjson_result<std::string> to_json(const Z &z, size_t initial_capacity = simdjson::lasx::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { - simdjson::lasx::builder::string_builder b(initial_capacity); - b.append(z); - std::string_view s; - auto e = b.view().get(s); - if(e) { return e; } - return std::string(s); -} -template <class Z> -simdjson_warn_unused simdjson_error to_json(const Z &z, std::string &s, size_t initial_capacity = simdjson::lasx::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { - simdjson::lasx::builder::string_builder b(initial_capacity); - b.append(z); - std::string_view sv; - auto e = b.view().get(sv); - if(e) { return e; } - s.assign(sv.data(), sv.size()); - return simdjson::SUCCESS; -} -#endif - -#if SIMDJSON_SUPPORTS_CONCEPTS -#endif // SIMDJSON_SUPPORTS_CONCEPTS - -} // namespace simdjson - -#endif // SIMDJSON_GENERIC_STRING_BUILDER_H -/* end file simdjson/generic/ondemand/json_string_builder.h for lasx */ +/* end file simdjson/generic/ondemand/parser.h for rvv_vls */ // All other declarations -/* including simdjson/generic/ondemand/array.h for lasx: #include "simdjson/generic/ondemand/array.h" */ -/* begin file simdjson/generic/ondemand/array.h for lasx */ +/* including simdjson/generic/ondemand/array.h for rvv_vls: #include "simdjson/generic/ondemand/array.h" */ +/* begin file simdjson/generic/ondemand/array.h for rvv_vls */ #ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -142157,7 +174011,7 @@ simdjson_warn_unused simdjson_error to_json(const Z &z, std::string &s, size_t i /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace ondemand { /** @@ -142377,27 +174231,27 @@ class array { }; } // namespace ondemand -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<lasx::ondemand::array> : public lasx::implementation_simdjson_result_base<lasx::ondemand::array> { +struct simdjson_result<rvv_vls::ondemand::array> : public rvv_vls::implementation_simdjson_result_base<rvv_vls::ondemand::array> { public: - simdjson_inline simdjson_result(lasx::ondemand::array &&value) noexcept; ///< @private + simdjson_inline simdjson_result(rvv_vls::ondemand::array &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; - simdjson_inline simdjson_result<lasx::ondemand::array_iterator> begin() noexcept; - simdjson_inline simdjson_result<lasx::ondemand::array_iterator> end() noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::array_iterator> begin() noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::array_iterator> end() noexcept; inline simdjson_result<size_t> count_elements() & noexcept; inline simdjson_result<bool> is_empty() & noexcept; inline simdjson_result<bool> reset() & noexcept; - simdjson_inline simdjson_result<lasx::ondemand::value> at(size_t index) noexcept; - simdjson_inline simdjson_result<lasx::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result<lasx::ondemand::value> at_path(std::string_view json_path) noexcept; - simdjson_inline simdjson_result<std::vector<lasx::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::value> at(size_t index) noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::value> at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<std::vector<rvv_vls::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; simdjson_inline simdjson_result<std::string_view> raw_json() noexcept; #if SIMDJSON_SUPPORTS_CONCEPTS // TODO: move this code into object-inl.h @@ -142405,7 +174259,7 @@ struct simdjson_result<lasx::ondemand::array> : public lasx::implementation_simd template<typename T> simdjson_inline simdjson_result<T> get() noexcept { if (error()) { return error(); } - if constexpr (std::is_same_v<T, lasx::ondemand::array>) { + if constexpr (std::is_same_v<T, rvv_vls::ondemand::array>) { return first; } return first.get<T>(); @@ -142413,7 +174267,7 @@ struct simdjson_result<lasx::ondemand::array> : public lasx::implementation_simd template<typename T> simdjson_warn_unused simdjson_inline error_code get(T& out) noexcept { if (error()) { return error(); } - if constexpr (std::is_same_v<T, lasx::ondemand::array>) { + if constexpr (std::is_same_v<T, rvv_vls::ondemand::array>) { out = first; } else { SIMDJSON_TRY( first.get<T>(out) ); @@ -142426,13 +174280,14 @@ struct simdjson_result<lasx::ondemand::array> : public lasx::implementation_simd } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_H -/* end file simdjson/generic/ondemand/array.h for lasx */ -/* including simdjson/generic/ondemand/array_iterator.h for lasx: #include "simdjson/generic/ondemand/array_iterator.h" */ -/* begin file simdjson/generic/ondemand/array_iterator.h for lasx */ +/* end file simdjson/generic/ondemand/array.h for rvv_vls */ +/* including simdjson/generic/ondemand/array_iterator.h for rvv_vls: #include "simdjson/generic/ondemand/array_iterator.h" */ +/* begin file simdjson/generic/ondemand/array_iterator.h for rvv_vls */ #ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ /* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H */ +/* amalgamation skipped (editor-only): #include <iterator> */ /* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */ @@ -142440,7 +174295,7 @@ struct simdjson_result<lasx::ondemand::array> : public lasx::implementation_simd namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace ondemand { /** @@ -142448,11 +174303,17 @@ namespace ondemand { * * This is an input_iterator, meaning: * - It is forward-only - * - * must be called exactly once per element. + * - * must be called at most once per element. * - ++ must be called exactly once in between each * (*, ++, *, ++, * ...) */ class array_iterator { public: + using iterator_category = std::input_iterator_tag; + using value_type = simdjson_result<value>; + using difference_type = std::ptrdiff_t; + using pointer = void; + using reference = value_type; + /** Create a new, invalid array iterator. */ simdjson_inline array_iterator() noexcept = default; @@ -142496,6 +174357,9 @@ class array_iterator { simdjson_warn_unused simdjson_inline bool at_end() const noexcept; private: +#if SIMDJSON_DEVELOPMENT_CHECKS + bool has_been_referenced{false}; +#endif value_iterator iter{}; simdjson_inline array_iterator(const value_iterator &iter) noexcept; @@ -142506,14 +174370,20 @@ class array_iterator { }; } // namespace ondemand -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<lasx::ondemand::array_iterator> : public lasx::implementation_simdjson_result_base<lasx::ondemand::array_iterator> { - simdjson_inline simdjson_result(lasx::ondemand::array_iterator &&value) noexcept; ///< @private +struct simdjson_result<rvv_vls::ondemand::array_iterator> : public rvv_vls::implementation_simdjson_result_base<rvv_vls::ondemand::array_iterator> { + using iterator_category = std::input_iterator_tag; + using value_type = simdjson_result<rvv_vls::ondemand::value>; + using difference_type = std::ptrdiff_t; + using pointer = void; + using reference = value_type; + + simdjson_inline simdjson_result(rvv_vls::ondemand::array_iterator &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; @@ -142521,10 +174391,10 @@ struct simdjson_result<lasx::ondemand::array_iterator> : public lasx::implementa // Iterator interface // - simdjson_inline simdjson_result<lasx::ondemand::value> operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. - simdjson_inline bool operator==(const simdjson_result<lasx::ondemand::array_iterator> &) const noexcept; - simdjson_inline bool operator!=(const simdjson_result<lasx::ondemand::array_iterator> &) const noexcept; - simdjson_inline simdjson_result<lasx::ondemand::array_iterator> &operator++() noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::value> operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. + simdjson_inline bool operator==(const simdjson_result<rvv_vls::ondemand::array_iterator> &) const noexcept; + simdjson_inline bool operator!=(const simdjson_result<rvv_vls::ondemand::array_iterator> &) const noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::array_iterator> &operator++() noexcept; simdjson_warn_unused simdjson_inline bool at_end() const noexcept; }; @@ -142532,9 +174402,9 @@ struct simdjson_result<lasx::ondemand::array_iterator> : public lasx::implementa } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H -/* end file simdjson/generic/ondemand/array_iterator.h for lasx */ -/* including simdjson/generic/ondemand/document.h for lasx: #include "simdjson/generic/ondemand/document.h" */ -/* begin file simdjson/generic/ondemand/document.h for lasx */ +/* end file simdjson/generic/ondemand/array_iterator.h for rvv_vls */ +/* including simdjson/generic/ondemand/document.h for rvv_vls: #include "simdjson/generic/ondemand/document.h" */ +/* begin file simdjson/generic/ondemand/document.h for rvv_vls */ #ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -142548,7 +174418,7 @@ struct simdjson_result<lasx::ondemand::array_iterator> : public lasx::implementa namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace ondemand { /** @@ -143500,21 +175370,21 @@ class document_reference { document *doc{nullptr}; }; } // namespace ondemand -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<lasx::ondemand::document> : public lasx::implementation_simdjson_result_base<lasx::ondemand::document> { +struct simdjson_result<rvv_vls::ondemand::document> : public rvv_vls::implementation_simdjson_result_base<rvv_vls::ondemand::document> { public: - simdjson_inline simdjson_result(lasx::ondemand::document &&value) noexcept; ///< @private + simdjson_inline simdjson_result(rvv_vls::ondemand::document &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; simdjson_inline error_code rewind() noexcept; - simdjson_inline simdjson_result<lasx::ondemand::array> get_array() & noexcept; - simdjson_inline simdjson_result<lasx::ondemand::object> get_object() & noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::array> get_array() & noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::object> get_object() & noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64() noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64_in_string() noexcept; simdjson_inline simdjson_result<int64_t> get_int64() noexcept; @@ -143525,9 +175395,9 @@ struct simdjson_result<lasx::ondemand::document> : public lasx::implementation_s template <typename string_type> simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result<std::string_view> get_wobbly_string() noexcept; - simdjson_inline simdjson_result<lasx::ondemand::raw_json_string> get_raw_json_string() noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::raw_json_string> get_raw_json_string() noexcept; simdjson_inline simdjson_result<bool> get_bool() noexcept; - simdjson_inline simdjson_result<lasx::ondemand::value> get_value() noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::value> get_value() noexcept; simdjson_inline simdjson_result<bool> is_null() noexcept; template<typename T> simdjson_inline simdjson_result<T> get() & noexcept; @@ -143537,33 +175407,33 @@ struct simdjson_result<lasx::ondemand::document> : public lasx::implementation_s template<typename T> simdjson_inline error_code get(T &out) && noexcept; #if SIMDJSON_EXCEPTIONS - using lasx::implementation_simdjson_result_base<lasx::ondemand::document>::operator*; - using lasx::implementation_simdjson_result_base<lasx::ondemand::document>::operator->; - template <class T, typename std::enable_if<std::is_same<T, lasx::ondemand::document>::value == false>::type> + using rvv_vls::implementation_simdjson_result_base<rvv_vls::ondemand::document>::operator*; + using rvv_vls::implementation_simdjson_result_base<rvv_vls::ondemand::document>::operator->; + template <class T, typename std::enable_if<std::is_same<T, rvv_vls::ondemand::document>::value == false>::type> explicit simdjson_inline operator T() noexcept(false); - simdjson_inline operator lasx::ondemand::array() & noexcept(false); - simdjson_inline operator lasx::ondemand::object() & noexcept(false); + simdjson_inline operator rvv_vls::ondemand::array() & noexcept(false); + simdjson_inline operator rvv_vls::ondemand::object() & noexcept(false); simdjson_inline operator uint64_t() noexcept(false); simdjson_inline operator int64_t() noexcept(false); simdjson_inline operator double() noexcept(false); simdjson_inline operator std::string_view() noexcept(false); - simdjson_inline operator lasx::ondemand::raw_json_string() noexcept(false); + simdjson_inline operator rvv_vls::ondemand::raw_json_string() noexcept(false); simdjson_inline operator bool() noexcept(false); - simdjson_inline operator lasx::ondemand::value() noexcept(false); + simdjson_inline operator rvv_vls::ondemand::value() noexcept(false); #endif simdjson_inline simdjson_result<size_t> count_elements() & noexcept; simdjson_inline simdjson_result<size_t> count_fields() & noexcept; - simdjson_inline simdjson_result<lasx::ondemand::value> at(size_t index) & noexcept; - simdjson_inline simdjson_result<lasx::ondemand::array_iterator> begin() & noexcept; - simdjson_inline simdjson_result<lasx::ondemand::array_iterator> end() & noexcept; - simdjson_inline simdjson_result<lasx::ondemand::value> find_field(std::string_view key) & noexcept; - simdjson_inline simdjson_result<lasx::ondemand::value> find_field(const char *key) & noexcept; - simdjson_inline simdjson_result<lasx::ondemand::value> operator[](std::string_view key) & noexcept; - simdjson_inline simdjson_result<lasx::ondemand::value> operator[](const char *key) & noexcept; - simdjson_result<lasx::ondemand::value> operator[](int) & noexcept = delete; - simdjson_inline simdjson_result<lasx::ondemand::value> find_field_unordered(std::string_view key) & noexcept; - simdjson_inline simdjson_result<lasx::ondemand::value> find_field_unordered(const char *key) & noexcept; - simdjson_inline simdjson_result<lasx::ondemand::json_type> type() noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::value> at(size_t index) & noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::array_iterator> begin() & noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::array_iterator> end() & noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::value> find_field(std::string_view key) & noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::value> find_field(const char *key) & noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::value> operator[](std::string_view key) & noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::value> operator[](const char *key) & noexcept; + simdjson_result<rvv_vls::ondemand::value> operator[](int) & noexcept = delete; + simdjson_inline simdjson_result<rvv_vls::ondemand::value> find_field_unordered(std::string_view key) & noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::value> find_field_unordered(const char *key) & noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::json_type> type() noexcept; simdjson_inline simdjson_result<bool> is_scalar() noexcept; simdjson_inline simdjson_result<bool> is_string() noexcept; simdjson_inline simdjson_result<const char *> current_location() noexcept; @@ -143571,14 +175441,14 @@ struct simdjson_result<lasx::ondemand::document> : public lasx::implementation_s simdjson_inline bool at_end() const noexcept; simdjson_inline bool is_negative() noexcept; simdjson_inline simdjson_result<bool> is_integer() noexcept; - simdjson_inline simdjson_result<lasx::number_type> get_number_type() noexcept; - simdjson_inline simdjson_result<lasx::ondemand::number> get_number() noexcept; + simdjson_inline simdjson_result<rvv_vls::number_type> get_number_type() noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::number> get_number() noexcept; /** @copydoc simdjson_inline std::string_view document::raw_json_token() const noexcept */ simdjson_inline simdjson_result<std::string_view> raw_json_token() noexcept; - simdjson_inline simdjson_result<lasx::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result<lasx::ondemand::value> at_path(std::string_view json_path) noexcept; - simdjson_inline simdjson_result<std::vector<lasx::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::value> at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<std::vector<rvv_vls::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; #if SIMDJSON_STATIC_REFLECTION template<constevalutil::fixed_string... FieldNames, typename T> requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) @@ -143594,14 +175464,14 @@ struct simdjson_result<lasx::ondemand::document> : public lasx::implementation_s namespace simdjson { template<> -struct simdjson_result<lasx::ondemand::document_reference> : public lasx::implementation_simdjson_result_base<lasx::ondemand::document_reference> { +struct simdjson_result<rvv_vls::ondemand::document_reference> : public rvv_vls::implementation_simdjson_result_base<rvv_vls::ondemand::document_reference> { public: - simdjson_inline simdjson_result(lasx::ondemand::document_reference value, error_code error) noexcept; + simdjson_inline simdjson_result(rvv_vls::ondemand::document_reference value, error_code error) noexcept; simdjson_inline simdjson_result() noexcept = default; simdjson_inline error_code rewind() noexcept; - simdjson_inline simdjson_result<lasx::ondemand::array> get_array() & noexcept; - simdjson_inline simdjson_result<lasx::ondemand::object> get_object() & noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::array> get_array() & noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::object> get_object() & noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64() noexcept; simdjson_inline simdjson_result<uint64_t> get_uint64_in_string() noexcept; simdjson_inline simdjson_result<int64_t> get_int64() noexcept; @@ -143612,9 +175482,9 @@ struct simdjson_result<lasx::ondemand::document_reference> : public lasx::implem template <typename string_type> simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result<std::string_view> get_wobbly_string() noexcept; - simdjson_inline simdjson_result<lasx::ondemand::raw_json_string> get_raw_json_string() noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::raw_json_string> get_raw_json_string() noexcept; simdjson_inline simdjson_result<bool> get_bool() noexcept; - simdjson_inline simdjson_result<lasx::ondemand::value> get_value() noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::value> get_value() noexcept; simdjson_inline simdjson_result<bool> is_null() noexcept; template<typename T> simdjson_inline simdjson_result<T> get() & noexcept; @@ -143625,43 +175495,43 @@ struct simdjson_result<lasx::ondemand::document_reference> : public lasx::implem #if SIMDJSON_EXCEPTIONS template <class T> explicit simdjson_inline operator T() noexcept(false); - simdjson_inline operator lasx::ondemand::array() & noexcept(false); - simdjson_inline operator lasx::ondemand::object() & noexcept(false); + simdjson_inline operator rvv_vls::ondemand::array() & noexcept(false); + simdjson_inline operator rvv_vls::ondemand::object() & noexcept(false); simdjson_inline operator uint64_t() noexcept(false); simdjson_inline operator int64_t() noexcept(false); simdjson_inline operator double() noexcept(false); simdjson_inline operator std::string_view() noexcept(false); - simdjson_inline operator lasx::ondemand::raw_json_string() noexcept(false); + simdjson_inline operator rvv_vls::ondemand::raw_json_string() noexcept(false); simdjson_inline operator bool() noexcept(false); - simdjson_inline operator lasx::ondemand::value() noexcept(false); + simdjson_inline operator rvv_vls::ondemand::value() noexcept(false); #endif simdjson_inline simdjson_result<size_t> count_elements() & noexcept; simdjson_inline simdjson_result<size_t> count_fields() & noexcept; - simdjson_inline simdjson_result<lasx::ondemand::value> at(size_t index) & noexcept; - simdjson_inline simdjson_result<lasx::ondemand::array_iterator> begin() & noexcept; - simdjson_inline simdjson_result<lasx::ondemand::array_iterator> end() & noexcept; - simdjson_inline simdjson_result<lasx::ondemand::value> find_field(std::string_view key) & noexcept; - simdjson_inline simdjson_result<lasx::ondemand::value> find_field(const char *key) & noexcept; - simdjson_inline simdjson_result<lasx::ondemand::value> operator[](std::string_view key) & noexcept; - simdjson_inline simdjson_result<lasx::ondemand::value> operator[](const char *key) & noexcept; - simdjson_result<lasx::ondemand::value> operator[](int) & noexcept = delete; - simdjson_inline simdjson_result<lasx::ondemand::value> find_field_unordered(std::string_view key) & noexcept; - simdjson_inline simdjson_result<lasx::ondemand::value> find_field_unordered(const char *key) & noexcept; - simdjson_inline simdjson_result<lasx::ondemand::json_type> type() noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::value> at(size_t index) & noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::array_iterator> begin() & noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::array_iterator> end() & noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::value> find_field(std::string_view key) & noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::value> find_field(const char *key) & noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::value> operator[](std::string_view key) & noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::value> operator[](const char *key) & noexcept; + simdjson_result<rvv_vls::ondemand::value> operator[](int) & noexcept = delete; + simdjson_inline simdjson_result<rvv_vls::ondemand::value> find_field_unordered(std::string_view key) & noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::value> find_field_unordered(const char *key) & noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::json_type> type() noexcept; simdjson_inline simdjson_result<bool> is_scalar() noexcept; simdjson_inline simdjson_result<bool> is_string() noexcept; simdjson_inline simdjson_result<const char *> current_location() noexcept; simdjson_inline simdjson_result<int32_t> current_depth() const noexcept; simdjson_inline simdjson_result<bool> is_negative() noexcept; simdjson_inline simdjson_result<bool> is_integer() noexcept; - simdjson_inline simdjson_result<lasx::number_type> get_number_type() noexcept; - simdjson_inline simdjson_result<lasx::ondemand::number> get_number() noexcept; + simdjson_inline simdjson_result<rvv_vls::number_type> get_number_type() noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::number> get_number() noexcept; /** @copydoc simdjson_inline std::string_view document_reference::raw_json_token() const noexcept */ simdjson_inline simdjson_result<std::string_view> raw_json_token() noexcept; - simdjson_inline simdjson_result<lasx::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result<lasx::ondemand::value> at_path(std::string_view json_path) noexcept; - simdjson_inline simdjson_result<std::vector<lasx::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::value> at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<std::vector<rvv_vls::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; #if SIMDJSON_STATIC_REFLECTION template<constevalutil::fixed_string... FieldNames, typename T> requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) @@ -143673,9 +175543,9 @@ struct simdjson_result<lasx::ondemand::document_reference> : public lasx::implem } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_H -/* end file simdjson/generic/ondemand/document.h for lasx */ -/* including simdjson/generic/ondemand/document_stream.h for lasx: #include "simdjson/generic/ondemand/document_stream.h" */ -/* begin file simdjson/generic/ondemand/document_stream.h for lasx */ +/* end file simdjson/generic/ondemand/document.h for rvv_vls */ +/* including simdjson/generic/ondemand/document_stream.h for rvv_vls: #include "simdjson/generic/ondemand/document_stream.h" */ +/* begin file simdjson/generic/ondemand/document_stream.h for rvv_vls */ #ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -143693,7 +175563,7 @@ struct simdjson_result<lasx::ondemand::document_reference> : public lasx::implem #endif namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace ondemand { #ifdef SIMDJSON_THREADS_ENABLED @@ -144006,14 +175876,14 @@ class document_stream { }; // document_stream } // namespace ondemand -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<lasx::ondemand::document_stream> : public lasx::implementation_simdjson_result_base<lasx::ondemand::document_stream> { +struct simdjson_result<rvv_vls::ondemand::document_stream> : public rvv_vls::implementation_simdjson_result_base<rvv_vls::ondemand::document_stream> { public: - simdjson_inline simdjson_result(lasx::ondemand::document_stream &&value) noexcept; ///< @private + simdjson_inline simdjson_result(rvv_vls::ondemand::document_stream &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; }; @@ -144021,9 +175891,9 @@ struct simdjson_result<lasx::ondemand::document_stream> : public lasx::implement } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_H -/* end file simdjson/generic/ondemand/document_stream.h for lasx */ -/* including simdjson/generic/ondemand/field.h for lasx: #include "simdjson/generic/ondemand/field.h" */ -/* begin file simdjson/generic/ondemand/field.h for lasx */ +/* end file simdjson/generic/ondemand/document_stream.h for rvv_vls */ +/* including simdjson/generic/ondemand/field.h for rvv_vls: #include "simdjson/generic/ondemand/field.h" */ +/* begin file simdjson/generic/ondemand/field.h for rvv_vls */ #ifndef SIMDJSON_GENERIC_ONDEMAND_FIELD_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -144035,7 +175905,7 @@ struct simdjson_result<lasx::ondemand::document_stream> : public lasx::implement /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace ondemand { /** @@ -144113,33 +175983,33 @@ class field : public std::pair<raw_json_string, value> { }; } // namespace ondemand -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<lasx::ondemand::field> : public lasx::implementation_simdjson_result_base<lasx::ondemand::field> { +struct simdjson_result<rvv_vls::ondemand::field> : public rvv_vls::implementation_simdjson_result_base<rvv_vls::ondemand::field> { public: - simdjson_inline simdjson_result(lasx::ondemand::field &&value) noexcept; ///< @private + simdjson_inline simdjson_result(rvv_vls::ondemand::field &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; simdjson_inline simdjson_result<std::string_view> unescaped_key(bool allow_replacement = false) noexcept; template<typename string_type> simdjson_inline error_code unescaped_key(string_type &receiver, bool allow_replacement = false) noexcept; - simdjson_inline simdjson_result<lasx::ondemand::raw_json_string> key() noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::raw_json_string> key() noexcept; simdjson_inline simdjson_result<std::string_view> key_raw_json_token() noexcept; simdjson_inline simdjson_result<std::string_view> escaped_key() noexcept; - simdjson_inline simdjson_result<lasx::ondemand::value> value() noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::value> value() noexcept; }; } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_FIELD_H -/* end file simdjson/generic/ondemand/field.h for lasx */ -/* including simdjson/generic/ondemand/object.h for lasx: #include "simdjson/generic/ondemand/object.h" */ -/* begin file simdjson/generic/ondemand/object.h for lasx */ +/* end file simdjson/generic/ondemand/field.h for rvv_vls */ +/* including simdjson/generic/ondemand/object.h for rvv_vls: #include "simdjson/generic/ondemand/object.h" */ +/* begin file simdjson/generic/ondemand/object.h for rvv_vls */ #ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -144154,7 +176024,7 @@ struct simdjson_result<lasx::ondemand::field> : public lasx::implementation_simd /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace ondemand { /** @@ -144169,6 +176039,13 @@ class object { */ simdjson_inline object() noexcept = default; + /** + * Get an iterator to the start of the object. We recommend using a range-based for loop. + * + * Using the iterator directly is also possible but error-prone and discouraged. In particular, + * you must dereference the iterator exactly once per iteration (before calling '++'). + * Doing otherwise is unsafe and may lead to errors. You are responsible for ensuring + */ simdjson_inline simdjson_result<object_iterator> begin() noexcept; simdjson_inline simdjson_result<object_iterator> end() noexcept; /** @@ -144441,29 +176318,29 @@ class object { }; } // namespace ondemand -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<lasx::ondemand::object> : public lasx::implementation_simdjson_result_base<lasx::ondemand::object> { +struct simdjson_result<rvv_vls::ondemand::object> : public rvv_vls::implementation_simdjson_result_base<rvv_vls::ondemand::object> { public: - simdjson_inline simdjson_result(lasx::ondemand::object &&value) noexcept; ///< @private + simdjson_inline simdjson_result(rvv_vls::ondemand::object &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; - simdjson_inline simdjson_result<lasx::ondemand::object_iterator> begin() noexcept; - simdjson_inline simdjson_result<lasx::ondemand::object_iterator> end() noexcept; - simdjson_inline simdjson_result<lasx::ondemand::value> find_field(std::string_view key) & noexcept; - simdjson_inline simdjson_result<lasx::ondemand::value> find_field(std::string_view key) && noexcept; - simdjson_inline simdjson_result<lasx::ondemand::value> find_field_unordered(std::string_view key) & noexcept; - simdjson_inline simdjson_result<lasx::ondemand::value> find_field_unordered(std::string_view key) && noexcept; - simdjson_inline simdjson_result<lasx::ondemand::value> operator[](std::string_view key) & noexcept; - simdjson_inline simdjson_result<lasx::ondemand::value> operator[](std::string_view key) && noexcept; - simdjson_inline simdjson_result<lasx::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result<lasx::ondemand::value> at_path(std::string_view json_path) noexcept; - simdjson_inline simdjson_result<std::vector<lasx::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::object_iterator> begin() noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::object_iterator> end() noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::value> find_field(std::string_view key) & noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::value> find_field(std::string_view key) && noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::value> find_field_unordered(std::string_view key) & noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::value> find_field_unordered(std::string_view key) && noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::value> operator[](std::string_view key) & noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::value> operator[](std::string_view key) && noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::value> at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::value> at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result<std::vector<rvv_vls::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept; inline simdjson_result<bool> reset() noexcept; inline simdjson_result<bool> is_empty() noexcept; inline simdjson_result<size_t> count_fields() & noexcept; @@ -144474,7 +176351,7 @@ struct simdjson_result<lasx::ondemand::object> : public lasx::implementation_sim template<typename T> simdjson_inline simdjson_result<T> get() noexcept { if (error()) { return error(); } - if constexpr (std::is_same_v<T, lasx::ondemand::object>) { + if constexpr (std::is_same_v<T, rvv_vls::ondemand::object>) { return first; } return first.get<T>(); @@ -144482,7 +176359,7 @@ struct simdjson_result<lasx::ondemand::object> : public lasx::implementation_sim template<typename T> simdjson_warn_unused simdjson_inline error_code get(T& out) noexcept { if (error()) { return error(); } - if constexpr (std::is_same_v<T, lasx::ondemand::object>) { + if constexpr (std::is_same_v<T, rvv_vls::ondemand::object>) { out = first; } else { SIMDJSON_TRY( first.get<T>(out) ); @@ -144505,9 +176382,9 @@ struct simdjson_result<lasx::ondemand::object> : public lasx::implementation_sim } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_H -/* end file simdjson/generic/ondemand/object.h for lasx */ -/* including simdjson/generic/ondemand/object_iterator.h for lasx: #include "simdjson/generic/ondemand/object_iterator.h" */ -/* begin file simdjson/generic/ondemand/object_iterator.h for lasx */ +/* end file simdjson/generic/ondemand/object.h for rvv_vls */ +/* including simdjson/generic/ondemand/object_iterator.h for rvv_vls: #include "simdjson/generic/ondemand/object_iterator.h" */ +/* begin file simdjson/generic/ondemand/object_iterator.h for rvv_vls */ #ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -144518,7 +176395,7 @@ struct simdjson_result<lasx::ondemand::object> : public lasx::implementation_sim /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace ondemand { class object_iterator { @@ -144542,9 +176419,14 @@ class object_iterator { // Assumes it's being compared with the end. true if depth >= iter->depth. simdjson_inline bool operator!=(const object_iterator &) const noexcept; // Checks for ']' and ',' + // YOU MUST NOT CALL THIS IF operator* YIELDED AN ERROR. + // YOU MUST NOT CALL THIS WITHOUT A CORRESPONDING operator* CALL. simdjson_inline object_iterator &operator++() noexcept; private: +#if SIMDJSON_DEVELOPMENT_CHECKS + bool has_been_referenced{false}; +#endif /** * The underlying JSON iterator. * @@ -144559,15 +176441,15 @@ class object_iterator { }; } // namespace ondemand -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson namespace simdjson { template<> -struct simdjson_result<lasx::ondemand::object_iterator> : public lasx::implementation_simdjson_result_base<lasx::ondemand::object_iterator> { +struct simdjson_result<rvv_vls::ondemand::object_iterator> : public rvv_vls::implementation_simdjson_result_base<rvv_vls::ondemand::object_iterator> { public: - simdjson_inline simdjson_result(lasx::ondemand::object_iterator &&value) noexcept; ///< @private + simdjson_inline simdjson_result(rvv_vls::ondemand::object_iterator &&value) noexcept; ///< @private simdjson_inline simdjson_result(error_code error) noexcept; ///< @private simdjson_inline simdjson_result() noexcept = default; @@ -144576,21 +176458,21 @@ struct simdjson_result<lasx::ondemand::object_iterator> : public lasx::implement // // Reads key and value, yielding them to the user. - simdjson_inline simdjson_result<lasx::ondemand::field> operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. + simdjson_inline simdjson_result<rvv_vls::ondemand::field> operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. // Assumes it's being compared with the end. true if depth < iter->depth. - simdjson_inline bool operator==(const simdjson_result<lasx::ondemand::object_iterator> &) const noexcept; + simdjson_inline bool operator==(const simdjson_result<rvv_vls::ondemand::object_iterator> &) const noexcept; // Assumes it's being compared with the end. true if depth >= iter->depth. - simdjson_inline bool operator!=(const simdjson_result<lasx::ondemand::object_iterator> &) const noexcept; + simdjson_inline bool operator!=(const simdjson_result<rvv_vls::ondemand::object_iterator> &) const noexcept; // Checks for ']' and ',' - simdjson_inline simdjson_result<lasx::ondemand::object_iterator> &operator++() noexcept; + simdjson_inline simdjson_result<rvv_vls::ondemand::object_iterator> &operator++() noexcept; }; } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_H -/* end file simdjson/generic/ondemand/object_iterator.h for lasx */ -/* including simdjson/generic/ondemand/serialization.h for lasx: #include "simdjson/generic/ondemand/serialization.h" */ -/* begin file simdjson/generic/ondemand/serialization.h for lasx */ +/* end file simdjson/generic/ondemand/object_iterator.h for rvv_vls */ +/* including simdjson/generic/ondemand/serialization.h for rvv_vls: #include "simdjson/generic/ondemand/serialization.h" */ +/* begin file simdjson/generic/ondemand/serialization.h for rvv_vls */ #ifndef SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -144604,30 +176486,30 @@ namespace simdjson { * contains JSON text that is suitable to be parsed as JSON again. It does not * validate the content. */ -inline simdjson_result<std::string_view> to_json_string(lasx::ondemand::document& x) noexcept; +inline simdjson_result<std::string_view> to_json_string(rvv_vls::ondemand::document& x) noexcept; /** * Create a string-view instance out of a value instance. The string-view instance * contains JSON text that is suitable to be parsed as JSON again. The value must * not have been accessed previously. It does not * validate the content. */ -inline simdjson_result<std::string_view> to_json_string(lasx::ondemand::value& x) noexcept; +inline simdjson_result<std::string_view> to_json_string(rvv_vls::ondemand::value& x) noexcept; /** * Create a string-view instance out of an object instance. The string-view instance * contains JSON text that is suitable to be parsed as JSON again. It does not * validate the content. */ -inline simdjson_result<std::string_view> to_json_string(lasx::ondemand::object& x) noexcept; +inline simdjson_result<std::string_view> to_json_string(rvv_vls::ondemand::object& x) noexcept; /** * Create a string-view instance out of an array instance. The string-view instance * contains JSON text that is suitable to be parsed as JSON again. It does not * validate the content. */ -inline simdjson_result<std::string_view> to_json_string(lasx::ondemand::array& x) noexcept; -inline simdjson_result<std::string_view> to_json_string(simdjson_result<lasx::ondemand::document> x); -inline simdjson_result<std::string_view> to_json_string(simdjson_result<lasx::ondemand::value> x); -inline simdjson_result<std::string_view> to_json_string(simdjson_result<lasx::ondemand::object> x); -inline simdjson_result<std::string_view> to_json_string(simdjson_result<lasx::ondemand::array> x); +inline simdjson_result<std::string_view> to_json_string(rvv_vls::ondemand::array& x) noexcept; +inline simdjson_result<std::string_view> to_json_string(simdjson_result<rvv_vls::ondemand::document> x); +inline simdjson_result<std::string_view> to_json_string(simdjson_result<rvv_vls::ondemand::value> x); +inline simdjson_result<std::string_view> to_json_string(simdjson_result<rvv_vls::ondemand::object> x); +inline simdjson_result<std::string_view> to_json_string(simdjson_result<rvv_vls::ondemand::array> x); #if SIMDJSON_STATIC_REFLECTION /** @@ -144635,10 +176517,10 @@ inline simdjson_result<std::string_view> to_json_string(simdjson_result<lasx::on * Only available when SIMDJSON_STATIC_REFLECTION is enabled. */ template<typename T> - requires(!std::same_as<T, lasx::ondemand::document> && - !std::same_as<T, lasx::ondemand::value> && - !std::same_as<T, lasx::ondemand::object> && - !std::same_as<T, lasx::ondemand::array>) + requires(!std::same_as<T, rvv_vls::ondemand::document> && + !std::same_as<T, rvv_vls::ondemand::value> && + !std::same_as<T, rvv_vls::ondemand::object> && + !std::same_as<T, rvv_vls::ondemand::array>) inline std::string to_json_string(const T& obj); #endif @@ -144651,7 +176533,7 @@ inline std::string to_json_string(const T& obj); * Credit: @madhur4127 * See https://github.com/simdjson/simdjson/issues/1768 */ -namespace simdjson { namespace lasx { namespace ondemand { +namespace simdjson { namespace rvv_vls { namespace ondemand { /** * Print JSON to an output stream. It does not @@ -144661,9 +176543,9 @@ namespace simdjson { namespace lasx { namespace ondemand { * @param value The element. * @throw if there is an error with the underlying output stream. simdjson itself will not throw. */ -inline std::ostream& operator<<(std::ostream& out, simdjson::lasx::ondemand::value x); +inline std::ostream& operator<<(std::ostream& out, simdjson::rvv_vls::ondemand::value x); #if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::lasx::ondemand::value> x); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::rvv_vls::ondemand::value> x); #endif /** * Print JSON to an output stream. It does not @@ -144673,9 +176555,9 @@ inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<sim * @param value The array. * @throw if there is an error with the underlying output stream. simdjson itself will not throw. */ -inline std::ostream& operator<<(std::ostream& out, simdjson::lasx::ondemand::array value); +inline std::ostream& operator<<(std::ostream& out, simdjson::rvv_vls::ondemand::array value); #if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::lasx::ondemand::array> x); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::rvv_vls::ondemand::array> x); #endif /** * Print JSON to an output stream. It does not @@ -144685,13 +176567,13 @@ inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<sim * @param value The array. * @throw if there is an error with the underlying output stream. simdjson itself will not throw. */ -inline std::ostream& operator<<(std::ostream& out, simdjson::lasx::ondemand::document& value); +inline std::ostream& operator<<(std::ostream& out, simdjson::rvv_vls::ondemand::document& value); #if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::lasx::ondemand::document>&& x); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::rvv_vls::ondemand::document>&& x); #endif -inline std::ostream& operator<<(std::ostream& out, simdjson::lasx::ondemand::document_reference& value); +inline std::ostream& operator<<(std::ostream& out, simdjson::rvv_vls::ondemand::document_reference& value); #if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::lasx::ondemand::document_reference>&& x); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::rvv_vls::ondemand::document_reference>&& x); #endif /** * Print JSON to an output stream. It does not @@ -144701,18 +176583,18 @@ inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<sim * @param value The object. * @throw if there is an error with the underlying output stream. simdjson itself will not throw. */ -inline std::ostream& operator<<(std::ostream& out, simdjson::lasx::ondemand::object value); +inline std::ostream& operator<<(std::ostream& out, simdjson::rvv_vls::ondemand::object value); #if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::lasx::ondemand::object> x); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::rvv_vls::ondemand::object> x); #endif -}}} // namespace simdjson::lasx::ondemand +}}} // namespace simdjson::rvv_vls::ondemand #endif // SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_H -/* end file simdjson/generic/ondemand/serialization.h for lasx */ +/* end file simdjson/generic/ondemand/serialization.h for rvv_vls */ // Deserialization for standard types -/* including simdjson/generic/ondemand/std_deserialize.h for lasx: #include "simdjson/generic/ondemand/std_deserialize.h" */ -/* begin file simdjson/generic/ondemand/std_deserialize.h for lasx */ +/* including simdjson/generic/ondemand/std_deserialize.h for rvv_vls: #include "simdjson/generic/ondemand/std_deserialize.h" */ +/* begin file simdjson/generic/ondemand/std_deserialize.h for rvv_vls */ #if SIMDJSON_SUPPORTS_CONCEPTS #ifndef SIMDJSON_ONDEMAND_DESERIALIZE_H @@ -144811,8 +176693,8 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { static_assert( std::is_default_constructible_v<value_type>, "The specified type inside the container must default constructible."); - lasx::ondemand::array arr; - if constexpr (std::is_same_v<std::remove_cvref_t<ValT>, lasx::ondemand::array>) { + rvv_vls::ondemand::array arr; + if constexpr (std::is_same_v<std::remove_cvref_t<ValT>, rvv_vls::ondemand::array>) { arr = val; } else { SIMDJSON_TRY(val.get_array().get(arr)); @@ -144856,7 +176738,7 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { static_assert( std::is_default_constructible_v<value_type>, "The specified value type inside the container must default constructible."); - lasx::ondemand::object obj; + rvv_vls::ondemand::object obj; SIMDJSON_TRY(val.get_object().get(obj)); for (auto field : obj) { std::string_view key; @@ -144874,7 +176756,7 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { } template <concepts::string_view_keyed_map T> -error_code tag_invoke(deserialize_tag, lasx::ondemand::object &obj, T &out) noexcept { +error_code tag_invoke(deserialize_tag, rvv_vls::ondemand::object &obj, T &out) noexcept { using value_type = typename std::remove_cvref_t<T>::mapped_type; out.clear(); @@ -144882,7 +176764,7 @@ error_code tag_invoke(deserialize_tag, lasx::ondemand::object &obj, T &out) noex std::string_view key; SIMDJSON_TRY(field.unescaped_key().get(key)); - lasx::ondemand::value value_obj; + rvv_vls::ondemand::value value_obj; SIMDJSON_TRY(field.value().get(value_obj)); value_type this_value; @@ -144893,22 +176775,22 @@ error_code tag_invoke(deserialize_tag, lasx::ondemand::object &obj, T &out) noex } template <concepts::string_view_keyed_map T> -error_code tag_invoke(deserialize_tag, lasx::ondemand::value &val, T &out) noexcept { - lasx::ondemand::object obj; +error_code tag_invoke(deserialize_tag, rvv_vls::ondemand::value &val, T &out) noexcept { + rvv_vls::ondemand::object obj; SIMDJSON_TRY(val.get_object().get(obj)); return simdjson::deserialize(obj, out); } template <concepts::string_view_keyed_map T> -error_code tag_invoke(deserialize_tag, lasx::ondemand::document &doc, T &out) noexcept { - lasx::ondemand::object obj; +error_code tag_invoke(deserialize_tag, rvv_vls::ondemand::document &doc, T &out) noexcept { + rvv_vls::ondemand::object obj; SIMDJSON_TRY(doc.get_object().get(obj)); return simdjson::deserialize(obj, out); } template <concepts::string_view_keyed_map T> -error_code tag_invoke(deserialize_tag, lasx::ondemand::document_reference &doc, T &out) noexcept { - lasx::ondemand::object obj; +error_code tag_invoke(deserialize_tag, rvv_vls::ondemand::document_reference &doc, T &out) noexcept { + rvv_vls::ondemand::object obj; SIMDJSON_TRY(doc.get_object().get(obj)); return simdjson::deserialize(obj, out); } @@ -144985,8 +176867,8 @@ constexpr bool user_defined_type = (std::is_class_v<T> template <typename T, typename ValT> requires(user_defined_type<T> && std::is_class_v<T>) error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept { - lasx::ondemand::object obj; - if constexpr (std::is_same_v<std::remove_cvref_t<ValT>, lasx::ondemand::object>) { + rvv_vls::ondemand::object obj; + if constexpr (std::is_same_v<std::remove_cvref_t<ValT>, rvv_vls::ondemand::object>) { obj = val; } else { SIMDJSON_TRY(val.get_object().get(obj)); @@ -145295,11 +177177,11 @@ error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr<int> &out) noe #endif // SIMDJSON_ONDEMAND_DESERIALIZE_H #endif // SIMDJSON_SUPPORTS_CONCEPTS -/* end file simdjson/generic/ondemand/std_deserialize.h for lasx */ +/* end file simdjson/generic/ondemand/std_deserialize.h for rvv_vls */ // Inline definitions -/* including simdjson/generic/ondemand/array-inl.h for lasx: #include "simdjson/generic/ondemand/array-inl.h" */ -/* begin file simdjson/generic/ondemand/array-inl.h for lasx */ +/* including simdjson/generic/ondemand/array-inl.h for rvv_vls: #include "simdjson/generic/ondemand/array-inl.h" */ +/* begin file simdjson/generic/ondemand/array-inl.h for rvv_vls */ #ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -145314,7 +177196,7 @@ error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr<int> &out) noe /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace ondemand { // @@ -145543,68 +177425,68 @@ simdjson_inline simdjson_result<value> array::at(size_t index) noexcept { } } // namespace ondemand -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<lasx::ondemand::array>::simdjson_result( - lasx::ondemand::array &&value +simdjson_inline simdjson_result<rvv_vls::ondemand::array>::simdjson_result( + rvv_vls::ondemand::array &&value ) noexcept - : implementation_simdjson_result_base<lasx::ondemand::array>( - std::forward<lasx::ondemand::array>(value) + : implementation_simdjson_result_base<rvv_vls::ondemand::array>( + std::forward<rvv_vls::ondemand::array>(value) ) { } -simdjson_inline simdjson_result<lasx::ondemand::array>::simdjson_result( +simdjson_inline simdjson_result<rvv_vls::ondemand::array>::simdjson_result( error_code error ) noexcept - : implementation_simdjson_result_base<lasx::ondemand::array>(error) + : implementation_simdjson_result_base<rvv_vls::ondemand::array>(error) { } -simdjson_inline simdjson_result<lasx::ondemand::array_iterator> simdjson_result<lasx::ondemand::array>::begin() noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::array_iterator> simdjson_result<rvv_vls::ondemand::array>::begin() noexcept { if (error()) { return error(); } return first.begin(); } -simdjson_inline simdjson_result<lasx::ondemand::array_iterator> simdjson_result<lasx::ondemand::array>::end() noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::array_iterator> simdjson_result<rvv_vls::ondemand::array>::end() noexcept { if (error()) { return error(); } return first.end(); } -simdjson_inline simdjson_result<size_t> simdjson_result<lasx::ondemand::array>::count_elements() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<rvv_vls::ondemand::array>::count_elements() & noexcept { if (error()) { return error(); } return first.count_elements(); } -simdjson_inline simdjson_result<bool> simdjson_result<lasx::ondemand::array>::is_empty() & noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<rvv_vls::ondemand::array>::is_empty() & noexcept { if (error()) { return error(); } return first.is_empty(); } -simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::array>::at(size_t index) noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::value> simdjson_result<rvv_vls::ondemand::array>::at(size_t index) noexcept { if (error()) { return error(); } return first.at(index); } -simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::array>::at_pointer(std::string_view json_pointer) noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::value> simdjson_result<rvv_vls::ondemand::array>::at_pointer(std::string_view json_pointer) noexcept { if (error()) { return error(); } return first.at_pointer(json_pointer); } -simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::array>::at_path(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::value> simdjson_result<rvv_vls::ondemand::array>::at_path(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path(json_path); } -simdjson_inline simdjson_result<std::vector<lasx::ondemand::value>> simdjson_result<lasx::ondemand::array>::at_path_with_wildcard(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<std::vector<rvv_vls::ondemand::value>> simdjson_result<rvv_vls::ondemand::array>::at_path_with_wildcard(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path_with_wildcard(json_path); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<lasx::ondemand::array>::raw_json() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<rvv_vls::ondemand::array>::raw_json() noexcept { if (error()) { return error(); } return first.raw_json(); } } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_INL_H -/* end file simdjson/generic/ondemand/array-inl.h for lasx */ -/* including simdjson/generic/ondemand/array_iterator-inl.h for lasx: #include "simdjson/generic/ondemand/array_iterator-inl.h" */ -/* begin file simdjson/generic/ondemand/array_iterator-inl.h for lasx */ +/* end file simdjson/generic/ondemand/array-inl.h for rvv_vls */ +/* including simdjson/generic/ondemand/array_iterator-inl.h for rvv_vls: #include "simdjson/generic/ondemand/array_iterator-inl.h" */ +/* begin file simdjson/generic/ondemand/array_iterator-inl.h for rvv_vls */ #ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -145616,7 +177498,7 @@ simdjson_inline simdjson_result<std::string_view> simdjson_result<lasx::ondeman /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace ondemand { simdjson_inline array_iterator::array_iterator(const value_iterator &_iter) noexcept @@ -145624,6 +177506,10 @@ simdjson_inline array_iterator::array_iterator(const value_iterator &_iter) noex {} simdjson_inline simdjson_result<value> array_iterator::operator*() noexcept { +#if SIMDJSON_DEVELOPMENT_CHECKS + SIMDJSON_ASSUME(!has_been_referenced); + has_been_referenced = true; +#endif if (iter.error()) { iter.abandon(); return iter.error(); } return value(iter.child()); } @@ -145634,6 +177520,9 @@ simdjson_inline bool array_iterator::operator!=(const array_iterator &) const no return iter.is_open(); } simdjson_inline array_iterator &array_iterator::operator++() noexcept { +#if SIMDJSON_DEVELOPMENT_CHECKS + has_been_referenced = false; +#endif error_code error; // PERF NOTE this is a safety rail ... users should exit loops as soon as they receive an error, so we'll never get here. // However, it does not seem to make a perf difference, so we add it out of an abundance of caution. @@ -145647,50 +177536,50 @@ simdjson_inline bool array_iterator::at_end() const noexcept { return iter.at_end(); } } // namespace ondemand -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<lasx::ondemand::array_iterator>::simdjson_result( - lasx::ondemand::array_iterator &&value +simdjson_inline simdjson_result<rvv_vls::ondemand::array_iterator>::simdjson_result( + rvv_vls::ondemand::array_iterator &&value ) noexcept - : lasx::implementation_simdjson_result_base<lasx::ondemand::array_iterator>(std::forward<lasx::ondemand::array_iterator>(value)) + : rvv_vls::implementation_simdjson_result_base<rvv_vls::ondemand::array_iterator>(std::forward<rvv_vls::ondemand::array_iterator>(value)) { first.iter.assert_is_valid(); } -simdjson_inline simdjson_result<lasx::ondemand::array_iterator>::simdjson_result(error_code error) noexcept - : lasx::implementation_simdjson_result_base<lasx::ondemand::array_iterator>({}, error) +simdjson_inline simdjson_result<rvv_vls::ondemand::array_iterator>::simdjson_result(error_code error) noexcept + : rvv_vls::implementation_simdjson_result_base<rvv_vls::ondemand::array_iterator>({}, error) { } -simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::array_iterator>::operator*() noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::value> simdjson_result<rvv_vls::ondemand::array_iterator>::operator*() noexcept { if (error()) { return error(); } return *first; } -simdjson_inline bool simdjson_result<lasx::ondemand::array_iterator>::operator==(const simdjson_result<lasx::ondemand::array_iterator> &other) const noexcept { +simdjson_inline bool simdjson_result<rvv_vls::ondemand::array_iterator>::operator==(const simdjson_result<rvv_vls::ondemand::array_iterator> &other) const noexcept { if (!first.iter.is_valid()) { return !error(); } return first == other.first; } -simdjson_inline bool simdjson_result<lasx::ondemand::array_iterator>::operator!=(const simdjson_result<lasx::ondemand::array_iterator> &other) const noexcept { +simdjson_inline bool simdjson_result<rvv_vls::ondemand::array_iterator>::operator!=(const simdjson_result<rvv_vls::ondemand::array_iterator> &other) const noexcept { if (!first.iter.is_valid()) { return error(); } return first != other.first; } -simdjson_inline simdjson_result<lasx::ondemand::array_iterator> &simdjson_result<lasx::ondemand::array_iterator>::operator++() noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::array_iterator> &simdjson_result<rvv_vls::ondemand::array_iterator>::operator++() noexcept { // Clear the error if there is one, so we don't yield it twice if (error()) { second = SUCCESS; return *this; } ++(first); return *this; } -simdjson_inline bool simdjson_result<lasx::ondemand::array_iterator>::at_end() const noexcept { +simdjson_inline bool simdjson_result<rvv_vls::ondemand::array_iterator>::at_end() const noexcept { return !first.iter.is_valid() || first.at_end(); } } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_INL_H -/* end file simdjson/generic/ondemand/array_iterator-inl.h for lasx */ -/* including simdjson/generic/ondemand/value-inl.h for lasx: #include "simdjson/generic/ondemand/value-inl.h" */ -/* begin file simdjson/generic/ondemand/value-inl.h for lasx */ +/* end file simdjson/generic/ondemand/array_iterator-inl.h for rvv_vls */ +/* including simdjson/generic/ondemand/value-inl.h for rvv_vls: #include "simdjson/generic/ondemand/value-inl.h" */ +/* begin file simdjson/generic/ondemand/value-inl.h for rvv_vls */ #ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -145706,7 +177595,7 @@ simdjson_inline bool simdjson_result<lasx::ondemand::array_iterator>::at_end() c /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace ondemand { simdjson_inline value::value(const value_iterator &_iter) noexcept @@ -146003,240 +177892,240 @@ inline simdjson_result<std::vector<value>> value::at_path_with_wildcard(std::str } } // namespace ondemand -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<lasx::ondemand::value>::simdjson_result( - lasx::ondemand::value &&value +simdjson_inline simdjson_result<rvv_vls::ondemand::value>::simdjson_result( + rvv_vls::ondemand::value &&value ) noexcept : - implementation_simdjson_result_base<lasx::ondemand::value>( - std::forward<lasx::ondemand::value>(value) + implementation_simdjson_result_base<rvv_vls::ondemand::value>( + std::forward<rvv_vls::ondemand::value>(value) ) { } -simdjson_inline simdjson_result<lasx::ondemand::value>::simdjson_result( +simdjson_inline simdjson_result<rvv_vls::ondemand::value>::simdjson_result( error_code error ) noexcept : - implementation_simdjson_result_base<lasx::ondemand::value>(error) + implementation_simdjson_result_base<rvv_vls::ondemand::value>(error) { } -simdjson_inline simdjson_result<size_t> simdjson_result<lasx::ondemand::value>::count_elements() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<rvv_vls::ondemand::value>::count_elements() & noexcept { if (error()) { return error(); } return first.count_elements(); } -simdjson_inline simdjson_result<size_t> simdjson_result<lasx::ondemand::value>::count_fields() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<rvv_vls::ondemand::value>::count_fields() & noexcept { if (error()) { return error(); } return first.count_fields(); } -simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::value>::at(size_t index) noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::value> simdjson_result<rvv_vls::ondemand::value>::at(size_t index) noexcept { if (error()) { return error(); } return first.at(index); } -simdjson_inline simdjson_result<lasx::ondemand::array_iterator> simdjson_result<lasx::ondemand::value>::begin() & noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::array_iterator> simdjson_result<rvv_vls::ondemand::value>::begin() & noexcept { if (error()) { return error(); } return first.begin(); } -simdjson_inline simdjson_result<lasx::ondemand::array_iterator> simdjson_result<lasx::ondemand::value>::end() & noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::array_iterator> simdjson_result<rvv_vls::ondemand::value>::end() & noexcept { if (error()) { return error(); } return {}; } -simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::value>::find_field(std::string_view key) noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::value> simdjson_result<rvv_vls::ondemand::value>::find_field(std::string_view key) noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::value>::find_field(const char *key) noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::value> simdjson_result<rvv_vls::ondemand::value>::find_field(const char *key) noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::value>::find_field_unordered(std::string_view key) noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::value> simdjson_result<rvv_vls::ondemand::value>::find_field_unordered(std::string_view key) noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::value>::find_field_unordered(const char *key) noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::value> simdjson_result<rvv_vls::ondemand::value>::find_field_unordered(const char *key) noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::value>::operator[](std::string_view key) noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::value> simdjson_result<rvv_vls::ondemand::value>::operator[](std::string_view key) noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::value>::operator[](const char *key) noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::value> simdjson_result<rvv_vls::ondemand::value>::operator[](const char *key) noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<lasx::ondemand::array> simdjson_result<lasx::ondemand::value>::get_array() noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::array> simdjson_result<rvv_vls::ondemand::value>::get_array() noexcept { if (error()) { return error(); } return first.get_array(); } -simdjson_inline simdjson_result<lasx::ondemand::object> simdjson_result<lasx::ondemand::value>::get_object() noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::object> simdjson_result<rvv_vls::ondemand::value>::get_object() noexcept { if (error()) { return error(); } return first.get_object(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<lasx::ondemand::value>::get_uint64() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<rvv_vls::ondemand::value>::get_uint64() noexcept { if (error()) { return error(); } return first.get_uint64(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<lasx::ondemand::value>::get_uint64_in_string() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<rvv_vls::ondemand::value>::get_uint64_in_string() noexcept { if (error()) { return error(); } return first.get_uint64_in_string(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<lasx::ondemand::value>::get_int64() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<rvv_vls::ondemand::value>::get_int64() noexcept { if (error()) { return error(); } return first.get_int64(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<lasx::ondemand::value>::get_int64_in_string() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<rvv_vls::ondemand::value>::get_int64_in_string() noexcept { if (error()) { return error(); } return first.get_int64_in_string(); } -simdjson_inline simdjson_result<double> simdjson_result<lasx::ondemand::value>::get_double() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<rvv_vls::ondemand::value>::get_double() noexcept { if (error()) { return error(); } return first.get_double(); } -simdjson_inline simdjson_result<double> simdjson_result<lasx::ondemand::value>::get_double_in_string() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<rvv_vls::ondemand::value>::get_double_in_string() noexcept { if (error()) { return error(); } return first.get_double_in_string(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<lasx::ondemand::value>::get_string(bool allow_replacement) noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<rvv_vls::ondemand::value>::get_string(bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(allow_replacement); } template <typename string_type> -simdjson_inline error_code simdjson_result<lasx::ondemand::value>::get_string(string_type& receiver, bool allow_replacement) noexcept { +simdjson_inline error_code simdjson_result<rvv_vls::ondemand::value>::get_string(string_type& receiver, bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(receiver, allow_replacement); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<lasx::ondemand::value>::get_wobbly_string() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<rvv_vls::ondemand::value>::get_wobbly_string() noexcept { if (error()) { return error(); } return first.get_wobbly_string(); } -simdjson_inline simdjson_result<lasx::ondemand::raw_json_string> simdjson_result<lasx::ondemand::value>::get_raw_json_string() noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::raw_json_string> simdjson_result<rvv_vls::ondemand::value>::get_raw_json_string() noexcept { if (error()) { return error(); } return first.get_raw_json_string(); } -simdjson_inline simdjson_result<bool> simdjson_result<lasx::ondemand::value>::get_bool() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<rvv_vls::ondemand::value>::get_bool() noexcept { if (error()) { return error(); } return first.get_bool(); } -simdjson_inline simdjson_result<bool> simdjson_result<lasx::ondemand::value>::is_null() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<rvv_vls::ondemand::value>::is_null() noexcept { if (error()) { return error(); } return first.is_null(); } -template<> simdjson_inline error_code simdjson_result<lasx::ondemand::value>::get<lasx::ondemand::value>(lasx::ondemand::value &out) noexcept { +template<> simdjson_inline error_code simdjson_result<rvv_vls::ondemand::value>::get<rvv_vls::ondemand::value>(rvv_vls::ondemand::value &out) noexcept { if (error()) { return error(); } out = first; return SUCCESS; } -template<typename T> simdjson_inline simdjson_result<T> simdjson_result<lasx::ondemand::value>::get() noexcept { +template<typename T> simdjson_inline simdjson_result<T> simdjson_result<rvv_vls::ondemand::value>::get() noexcept { if (error()) { return error(); } return first.get<T>(); } -template<typename T> simdjson_inline error_code simdjson_result<lasx::ondemand::value>::get(T &out) noexcept { +template<typename T> simdjson_inline error_code simdjson_result<rvv_vls::ondemand::value>::get(T &out) noexcept { if (error()) { return error(); } return first.get<T>(out); } -template<> simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::value>::get<lasx::ondemand::value>() noexcept { +template<> simdjson_inline simdjson_result<rvv_vls::ondemand::value> simdjson_result<rvv_vls::ondemand::value>::get<rvv_vls::ondemand::value>() noexcept { if (error()) { return error(); } return std::move(first); } -simdjson_inline simdjson_result<lasx::ondemand::json_type> simdjson_result<lasx::ondemand::value>::type() noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::json_type> simdjson_result<rvv_vls::ondemand::value>::type() noexcept { if (error()) { return error(); } return first.type(); } -simdjson_inline simdjson_result<bool> simdjson_result<lasx::ondemand::value>::is_scalar() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<rvv_vls::ondemand::value>::is_scalar() noexcept { if (error()) { return error(); } return first.is_scalar(); } -simdjson_inline simdjson_result<bool> simdjson_result<lasx::ondemand::value>::is_string() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<rvv_vls::ondemand::value>::is_string() noexcept { if (error()) { return error(); } return first.is_string(); } -simdjson_inline simdjson_result<bool> simdjson_result<lasx::ondemand::value>::is_negative() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<rvv_vls::ondemand::value>::is_negative() noexcept { if (error()) { return error(); } return first.is_negative(); } -simdjson_inline simdjson_result<bool> simdjson_result<lasx::ondemand::value>::is_integer() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<rvv_vls::ondemand::value>::is_integer() noexcept { if (error()) { return error(); } return first.is_integer(); } -simdjson_inline simdjson_result<lasx::number_type> simdjson_result<lasx::ondemand::value>::get_number_type() noexcept { +simdjson_inline simdjson_result<rvv_vls::number_type> simdjson_result<rvv_vls::ondemand::value>::get_number_type() noexcept { if (error()) { return error(); } return first.get_number_type(); } -simdjson_inline simdjson_result<lasx::ondemand::number> simdjson_result<lasx::ondemand::value>::get_number() noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::number> simdjson_result<rvv_vls::ondemand::value>::get_number() noexcept { if (error()) { return error(); } return first.get_number(); } #if SIMDJSON_EXCEPTIONS template <class T> -simdjson_inline simdjson_result<lasx::ondemand::value>::operator T() noexcept(false) { +simdjson_inline simdjson_result<rvv_vls::ondemand::value>::operator T() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first.get<T>(); } -simdjson_inline simdjson_result<lasx::ondemand::value>::operator lasx::ondemand::array() noexcept(false) { +simdjson_inline simdjson_result<rvv_vls::ondemand::value>::operator rvv_vls::ondemand::array() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lasx::ondemand::value>::operator lasx::ondemand::object() noexcept(false) { +simdjson_inline simdjson_result<rvv_vls::ondemand::value>::operator rvv_vls::ondemand::object() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lasx::ondemand::value>::operator uint64_t() noexcept(false) { +simdjson_inline simdjson_result<rvv_vls::ondemand::value>::operator uint64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lasx::ondemand::value>::operator int64_t() noexcept(false) { +simdjson_inline simdjson_result<rvv_vls::ondemand::value>::operator int64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lasx::ondemand::value>::operator double() noexcept(false) { +simdjson_inline simdjson_result<rvv_vls::ondemand::value>::operator double() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lasx::ondemand::value>::operator std::string_view() noexcept(false) { +simdjson_inline simdjson_result<rvv_vls::ondemand::value>::operator std::string_view() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lasx::ondemand::value>::operator lasx::ondemand::raw_json_string() noexcept(false) { +simdjson_inline simdjson_result<rvv_vls::ondemand::value>::operator rvv_vls::ondemand::raw_json_string() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lasx::ondemand::value>::operator bool() noexcept(false) { +simdjson_inline simdjson_result<rvv_vls::ondemand::value>::operator bool() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } #endif -simdjson_inline simdjson_result<std::string_view> simdjson_result<lasx::ondemand::value>::raw_json_token() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<rvv_vls::ondemand::value>::raw_json_token() noexcept { if (error()) { return error(); } return first.raw_json_token(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<lasx::ondemand::value>::raw_json() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<rvv_vls::ondemand::value>::raw_json() noexcept { if (error()) { return error(); } return first.raw_json(); } -simdjson_inline simdjson_result<const char *> simdjson_result<lasx::ondemand::value>::current_location() noexcept { +simdjson_inline simdjson_result<const char *> simdjson_result<rvv_vls::ondemand::value>::current_location() noexcept { if (error()) { return error(); } return first.current_location(); } -simdjson_inline simdjson_result<int32_t> simdjson_result<lasx::ondemand::value>::current_depth() const noexcept { +simdjson_inline simdjson_result<int32_t> simdjson_result<rvv_vls::ondemand::value>::current_depth() const noexcept { if (error()) { return error(); } return first.current_depth(); } -simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::value>::at_pointer( +simdjson_inline simdjson_result<rvv_vls::ondemand::value> simdjson_result<rvv_vls::ondemand::value>::at_pointer( std::string_view json_pointer) noexcept { if (error()) { return error(); @@ -146244,7 +178133,7 @@ simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ond return first.at_pointer(json_pointer); } -simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::value>::at_path( +simdjson_inline simdjson_result<rvv_vls::ondemand::value> simdjson_result<rvv_vls::ondemand::value>::at_path( std::string_view json_path) noexcept { if (error()) { return error(); @@ -146252,7 +178141,7 @@ simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ond return first.at_path(json_path); } -inline simdjson_result<std::vector<lasx::ondemand::value>> simdjson_result<lasx::ondemand::value>::at_path_with_wildcard( +inline simdjson_result<std::vector<rvv_vls::ondemand::value>> simdjson_result<rvv_vls::ondemand::value>::at_path_with_wildcard( std::string_view json_path) noexcept { if (error()) { return error(); @@ -146263,9 +178152,9 @@ inline simdjson_result<std::vector<lasx::ondemand::value>> simdjson_result<lasx: } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_INL_H -/* end file simdjson/generic/ondemand/value-inl.h for lasx */ -/* including simdjson/generic/ondemand/document-inl.h for lasx: #include "simdjson/generic/ondemand/document-inl.h" */ -/* begin file simdjson/generic/ondemand/document-inl.h for lasx */ +/* end file simdjson/generic/ondemand/value-inl.h for rvv_vls */ +/* including simdjson/generic/ondemand/document-inl.h for rvv_vls: #include "simdjson/generic/ondemand/document-inl.h" */ +/* begin file simdjson/generic/ondemand/document-inl.h for rvv_vls */ #ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -146285,7 +178174,7 @@ inline simdjson_result<std::vector<lasx::ondemand::value>> simdjson_result<lasx: /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace ondemand { simdjson_inline document::document(ondemand::json_iterator &&_iter) noexcept @@ -146679,283 +178568,283 @@ simdjson_warn_unused simdjson_inline error_code document::extract_into(T& out) & #endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION } // namespace ondemand -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<lasx::ondemand::document>::simdjson_result( - lasx::ondemand::document &&value +simdjson_inline simdjson_result<rvv_vls::ondemand::document>::simdjson_result( + rvv_vls::ondemand::document &&value ) noexcept : - implementation_simdjson_result_base<lasx::ondemand::document>( - std::forward<lasx::ondemand::document>(value) + implementation_simdjson_result_base<rvv_vls::ondemand::document>( + std::forward<rvv_vls::ondemand::document>(value) ) { } -simdjson_inline simdjson_result<lasx::ondemand::document>::simdjson_result( +simdjson_inline simdjson_result<rvv_vls::ondemand::document>::simdjson_result( error_code error ) noexcept : - implementation_simdjson_result_base<lasx::ondemand::document>( + implementation_simdjson_result_base<rvv_vls::ondemand::document>( error ) { } -simdjson_inline simdjson_result<size_t> simdjson_result<lasx::ondemand::document>::count_elements() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<rvv_vls::ondemand::document>::count_elements() & noexcept { if (error()) { return error(); } return first.count_elements(); } -simdjson_inline simdjson_result<size_t> simdjson_result<lasx::ondemand::document>::count_fields() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<rvv_vls::ondemand::document>::count_fields() & noexcept { if (error()) { return error(); } return first.count_fields(); } -simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::document>::at(size_t index) & noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::value> simdjson_result<rvv_vls::ondemand::document>::at(size_t index) & noexcept { if (error()) { return error(); } return first.at(index); } -simdjson_inline error_code simdjson_result<lasx::ondemand::document>::rewind() noexcept { +simdjson_inline error_code simdjson_result<rvv_vls::ondemand::document>::rewind() noexcept { if (error()) { return error(); } first.rewind(); return SUCCESS; } -simdjson_inline simdjson_result<lasx::ondemand::array_iterator> simdjson_result<lasx::ondemand::document>::begin() & noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::array_iterator> simdjson_result<rvv_vls::ondemand::document>::begin() & noexcept { if (error()) { return error(); } return first.begin(); } -simdjson_inline simdjson_result<lasx::ondemand::array_iterator> simdjson_result<lasx::ondemand::document>::end() & noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::array_iterator> simdjson_result<rvv_vls::ondemand::document>::end() & noexcept { return {}; } -simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::document>::find_field_unordered(std::string_view key) & noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::value> simdjson_result<rvv_vls::ondemand::document>::find_field_unordered(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::document>::find_field_unordered(const char *key) & noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::value> simdjson_result<rvv_vls::ondemand::document>::find_field_unordered(const char *key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::document>::operator[](std::string_view key) & noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::value> simdjson_result<rvv_vls::ondemand::document>::operator[](std::string_view key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::document>::operator[](const char *key) & noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::value> simdjson_result<rvv_vls::ondemand::document>::operator[](const char *key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::document>::find_field(std::string_view key) & noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::value> simdjson_result<rvv_vls::ondemand::document>::find_field(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::document>::find_field(const char *key) & noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::value> simdjson_result<rvv_vls::ondemand::document>::find_field(const char *key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<lasx::ondemand::array> simdjson_result<lasx::ondemand::document>::get_array() & noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::array> simdjson_result<rvv_vls::ondemand::document>::get_array() & noexcept { if (error()) { return error(); } return first.get_array(); } -simdjson_inline simdjson_result<lasx::ondemand::object> simdjson_result<lasx::ondemand::document>::get_object() & noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::object> simdjson_result<rvv_vls::ondemand::document>::get_object() & noexcept { if (error()) { return error(); } return first.get_object(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<lasx::ondemand::document>::get_uint64() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<rvv_vls::ondemand::document>::get_uint64() noexcept { if (error()) { return error(); } return first.get_uint64(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<lasx::ondemand::document>::get_uint64_in_string() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<rvv_vls::ondemand::document>::get_uint64_in_string() noexcept { if (error()) { return error(); } return first.get_uint64_in_string(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<lasx::ondemand::document>::get_int64() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<rvv_vls::ondemand::document>::get_int64() noexcept { if (error()) { return error(); } return first.get_int64(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<lasx::ondemand::document>::get_int64_in_string() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<rvv_vls::ondemand::document>::get_int64_in_string() noexcept { if (error()) { return error(); } return first.get_int64_in_string(); } -simdjson_inline simdjson_result<double> simdjson_result<lasx::ondemand::document>::get_double() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<rvv_vls::ondemand::document>::get_double() noexcept { if (error()) { return error(); } return first.get_double(); } -simdjson_inline simdjson_result<double> simdjson_result<lasx::ondemand::document>::get_double_in_string() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<rvv_vls::ondemand::document>::get_double_in_string() noexcept { if (error()) { return error(); } return first.get_double_in_string(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<lasx::ondemand::document>::get_string(bool allow_replacement) noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<rvv_vls::ondemand::document>::get_string(bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(allow_replacement); } template <typename string_type> -simdjson_warn_unused simdjson_inline error_code simdjson_result<lasx::ondemand::document>::get_string(string_type& receiver, bool allow_replacement) noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<rvv_vls::ondemand::document>::get_string(string_type& receiver, bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(receiver, allow_replacement); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<lasx::ondemand::document>::get_wobbly_string() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<rvv_vls::ondemand::document>::get_wobbly_string() noexcept { if (error()) { return error(); } return first.get_wobbly_string(); } -simdjson_inline simdjson_result<lasx::ondemand::raw_json_string> simdjson_result<lasx::ondemand::document>::get_raw_json_string() noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::raw_json_string> simdjson_result<rvv_vls::ondemand::document>::get_raw_json_string() noexcept { if (error()) { return error(); } return first.get_raw_json_string(); } -simdjson_inline simdjson_result<bool> simdjson_result<lasx::ondemand::document>::get_bool() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<rvv_vls::ondemand::document>::get_bool() noexcept { if (error()) { return error(); } return first.get_bool(); } -simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::document>::get_value() noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::value> simdjson_result<rvv_vls::ondemand::document>::get_value() noexcept { if (error()) { return error(); } return first.get_value(); } -simdjson_inline simdjson_result<bool> simdjson_result<lasx::ondemand::document>::is_null() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<rvv_vls::ondemand::document>::is_null() noexcept { if (error()) { return error(); } return first.is_null(); } template<typename T> -simdjson_inline simdjson_result<T> simdjson_result<lasx::ondemand::document>::get() & noexcept { +simdjson_inline simdjson_result<T> simdjson_result<rvv_vls::ondemand::document>::get() & noexcept { if (error()) { return error(); } return first.get<T>(); } template<typename T> -simdjson_deprecated simdjson_inline simdjson_result<T> simdjson_result<lasx::ondemand::document>::get() && noexcept { +simdjson_deprecated simdjson_inline simdjson_result<T> simdjson_result<rvv_vls::ondemand::document>::get() && noexcept { if (error()) { return error(); } - return std::forward<lasx::ondemand::document>(first).get<T>(); + return std::forward<rvv_vls::ondemand::document>(first).get<T>(); } template<typename T> -simdjson_warn_unused simdjson_inline error_code simdjson_result<lasx::ondemand::document>::get(T &out) & noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<rvv_vls::ondemand::document>::get(T &out) & noexcept { if (error()) { return error(); } return first.get<T>(out); } template<typename T> -simdjson_warn_unused simdjson_inline error_code simdjson_result<lasx::ondemand::document>::get(T &out) && noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<rvv_vls::ondemand::document>::get(T &out) && noexcept { if (error()) { return error(); } - return std::forward<lasx::ondemand::document>(first).get<T>(out); + return std::forward<rvv_vls::ondemand::document>(first).get<T>(out); } -template<> simdjson_inline simdjson_result<lasx::ondemand::document> simdjson_result<lasx::ondemand::document>::get<lasx::ondemand::document>() & noexcept = delete; -template<> simdjson_deprecated simdjson_inline simdjson_result<lasx::ondemand::document> simdjson_result<lasx::ondemand::document>::get<lasx::ondemand::document>() && noexcept { +template<> simdjson_inline simdjson_result<rvv_vls::ondemand::document> simdjson_result<rvv_vls::ondemand::document>::get<rvv_vls::ondemand::document>() & noexcept = delete; +template<> simdjson_deprecated simdjson_inline simdjson_result<rvv_vls::ondemand::document> simdjson_result<rvv_vls::ondemand::document>::get<rvv_vls::ondemand::document>() && noexcept { if (error()) { return error(); } - return std::forward<lasx::ondemand::document>(first); + return std::forward<rvv_vls::ondemand::document>(first); } -template<> simdjson_warn_unused simdjson_inline error_code simdjson_result<lasx::ondemand::document>::get<lasx::ondemand::document>(lasx::ondemand::document &out) & noexcept = delete; -template<> simdjson_warn_unused simdjson_inline error_code simdjson_result<lasx::ondemand::document>::get<lasx::ondemand::document>(lasx::ondemand::document &out) && noexcept { +template<> simdjson_warn_unused simdjson_inline error_code simdjson_result<rvv_vls::ondemand::document>::get<rvv_vls::ondemand::document>(rvv_vls::ondemand::document &out) & noexcept = delete; +template<> simdjson_warn_unused simdjson_inline error_code simdjson_result<rvv_vls::ondemand::document>::get<rvv_vls::ondemand::document>(rvv_vls::ondemand::document &out) && noexcept { if (error()) { return error(); } - out = std::forward<lasx::ondemand::document>(first); + out = std::forward<rvv_vls::ondemand::document>(first); return SUCCESS; } -simdjson_inline simdjson_result<lasx::ondemand::json_type> simdjson_result<lasx::ondemand::document>::type() noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::json_type> simdjson_result<rvv_vls::ondemand::document>::type() noexcept { if (error()) { return error(); } return first.type(); } -simdjson_inline simdjson_result<bool> simdjson_result<lasx::ondemand::document>::is_scalar() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<rvv_vls::ondemand::document>::is_scalar() noexcept { if (error()) { return error(); } return first.is_scalar(); } -simdjson_inline simdjson_result<bool> simdjson_result<lasx::ondemand::document>::is_string() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<rvv_vls::ondemand::document>::is_string() noexcept { if (error()) { return error(); } return first.is_string(); } -simdjson_inline bool simdjson_result<lasx::ondemand::document>::is_negative() noexcept { +simdjson_inline bool simdjson_result<rvv_vls::ondemand::document>::is_negative() noexcept { if (error()) { return error(); } return first.is_negative(); } -simdjson_inline simdjson_result<bool> simdjson_result<lasx::ondemand::document>::is_integer() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<rvv_vls::ondemand::document>::is_integer() noexcept { if (error()) { return error(); } return first.is_integer(); } -simdjson_inline simdjson_result<lasx::number_type> simdjson_result<lasx::ondemand::document>::get_number_type() noexcept { +simdjson_inline simdjson_result<rvv_vls::number_type> simdjson_result<rvv_vls::ondemand::document>::get_number_type() noexcept { if (error()) { return error(); } return first.get_number_type(); } -simdjson_inline simdjson_result<lasx::ondemand::number> simdjson_result<lasx::ondemand::document>::get_number() noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::number> simdjson_result<rvv_vls::ondemand::document>::get_number() noexcept { if (error()) { return error(); } return first.get_number(); } #if SIMDJSON_EXCEPTIONS -template <class T, typename std::enable_if<std::is_same<T, lasx::ondemand::document>::value == false>::type> -simdjson_inline simdjson_result<lasx::ondemand::document>::operator T() noexcept(false) { +template <class T, typename std::enable_if<std::is_same<T, rvv_vls::ondemand::document>::value == false>::type> +simdjson_inline simdjson_result<rvv_vls::ondemand::document>::operator T() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lasx::ondemand::document>::operator lasx::ondemand::array() & noexcept(false) { +simdjson_inline simdjson_result<rvv_vls::ondemand::document>::operator rvv_vls::ondemand::array() & noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lasx::ondemand::document>::operator lasx::ondemand::object() & noexcept(false) { +simdjson_inline simdjson_result<rvv_vls::ondemand::document>::operator rvv_vls::ondemand::object() & noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lasx::ondemand::document>::operator uint64_t() noexcept(false) { +simdjson_inline simdjson_result<rvv_vls::ondemand::document>::operator uint64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lasx::ondemand::document>::operator int64_t() noexcept(false) { +simdjson_inline simdjson_result<rvv_vls::ondemand::document>::operator int64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lasx::ondemand::document>::operator double() noexcept(false) { +simdjson_inline simdjson_result<rvv_vls::ondemand::document>::operator double() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lasx::ondemand::document>::operator std::string_view() noexcept(false) { +simdjson_inline simdjson_result<rvv_vls::ondemand::document>::operator std::string_view() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lasx::ondemand::document>::operator lasx::ondemand::raw_json_string() noexcept(false) { +simdjson_inline simdjson_result<rvv_vls::ondemand::document>::operator rvv_vls::ondemand::raw_json_string() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lasx::ondemand::document>::operator bool() noexcept(false) { +simdjson_inline simdjson_result<rvv_vls::ondemand::document>::operator bool() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lasx::ondemand::document>::operator lasx::ondemand::value() noexcept(false) { +simdjson_inline simdjson_result<rvv_vls::ondemand::document>::operator rvv_vls::ondemand::value() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } #endif -simdjson_inline simdjson_result<const char *> simdjson_result<lasx::ondemand::document>::current_location() noexcept { +simdjson_inline simdjson_result<const char *> simdjson_result<rvv_vls::ondemand::document>::current_location() noexcept { if (error()) { return error(); } return first.current_location(); } -simdjson_inline bool simdjson_result<lasx::ondemand::document>::at_end() const noexcept { +simdjson_inline bool simdjson_result<rvv_vls::ondemand::document>::at_end() const noexcept { if (error()) { return error(); } return first.at_end(); } -simdjson_inline int32_t simdjson_result<lasx::ondemand::document>::current_depth() const noexcept { +simdjson_inline int32_t simdjson_result<rvv_vls::ondemand::document>::current_depth() const noexcept { if (error()) { return error(); } return first.current_depth(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<lasx::ondemand::document>::raw_json_token() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<rvv_vls::ondemand::document>::raw_json_token() noexcept { if (error()) { return error(); } return first.raw_json_token(); } -simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::document>::at_pointer(std::string_view json_pointer) noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::value> simdjson_result<rvv_vls::ondemand::document>::at_pointer(std::string_view json_pointer) noexcept { if (error()) { return error(); } return first.at_pointer(json_pointer); } -simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::document>::at_path(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::value> simdjson_result<rvv_vls::ondemand::document>::at_path(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path(json_path); } -simdjson_inline simdjson_result<std::vector<lasx::ondemand::value>> simdjson_result<lasx::ondemand::document>::at_path_with_wildcard(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<std::vector<rvv_vls::ondemand::value>> simdjson_result<rvv_vls::ondemand::document>::at_path_with_wildcard(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path_with_wildcard(json_path); } @@ -146963,7 +178852,7 @@ simdjson_inline simdjson_result<std::vector<lasx::ondemand::value>> simdjson_res #if SIMDJSON_STATIC_REFLECTION template<constevalutil::fixed_string... FieldNames, typename T> requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) -simdjson_warn_unused simdjson_inline error_code simdjson_result<lasx::ondemand::document>::extract_into(T& out) & noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<rvv_vls::ondemand::document>::extract_into(T& out) & noexcept { if (error()) { return error(); } return first.extract_into<FieldNames...>(out); } @@ -146973,7 +178862,7 @@ simdjson_warn_unused simdjson_inline error_code simdjson_result<lasx::ondemand:: namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace ondemand { simdjson_inline document_reference::document_reference() noexcept : doc{nullptr} {} @@ -147065,253 +178954,253 @@ simdjson_warn_unused simdjson_inline error_code document_reference::extract_into } #endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION } // namespace ondemand -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<lasx::ondemand::document_reference>::simdjson_result(lasx::ondemand::document_reference value, error_code error) - noexcept : implementation_simdjson_result_base<lasx::ondemand::document_reference>(std::forward<lasx::ondemand::document_reference>(value), error) {} +simdjson_inline simdjson_result<rvv_vls::ondemand::document_reference>::simdjson_result(rvv_vls::ondemand::document_reference value, error_code error) + noexcept : implementation_simdjson_result_base<rvv_vls::ondemand::document_reference>(std::forward<rvv_vls::ondemand::document_reference>(value), error) {} -simdjson_inline simdjson_result<size_t> simdjson_result<lasx::ondemand::document_reference>::count_elements() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<rvv_vls::ondemand::document_reference>::count_elements() & noexcept { if (error()) { return error(); } return first.count_elements(); } -simdjson_inline simdjson_result<size_t> simdjson_result<lasx::ondemand::document_reference>::count_fields() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<rvv_vls::ondemand::document_reference>::count_fields() & noexcept { if (error()) { return error(); } return first.count_fields(); } -simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::document_reference>::at(size_t index) & noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::value> simdjson_result<rvv_vls::ondemand::document_reference>::at(size_t index) & noexcept { if (error()) { return error(); } return first.at(index); } -simdjson_inline error_code simdjson_result<lasx::ondemand::document_reference>::rewind() noexcept { +simdjson_inline error_code simdjson_result<rvv_vls::ondemand::document_reference>::rewind() noexcept { if (error()) { return error(); } first.rewind(); return SUCCESS; } -simdjson_inline simdjson_result<lasx::ondemand::array_iterator> simdjson_result<lasx::ondemand::document_reference>::begin() & noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::array_iterator> simdjson_result<rvv_vls::ondemand::document_reference>::begin() & noexcept { if (error()) { return error(); } return first.begin(); } -simdjson_inline simdjson_result<lasx::ondemand::array_iterator> simdjson_result<lasx::ondemand::document_reference>::end() & noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::array_iterator> simdjson_result<rvv_vls::ondemand::document_reference>::end() & noexcept { return {}; } -simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::document_reference>::find_field_unordered(std::string_view key) & noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::value> simdjson_result<rvv_vls::ondemand::document_reference>::find_field_unordered(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::document_reference>::find_field_unordered(const char *key) & noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::value> simdjson_result<rvv_vls::ondemand::document_reference>::find_field_unordered(const char *key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::document_reference>::operator[](std::string_view key) & noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::value> simdjson_result<rvv_vls::ondemand::document_reference>::operator[](std::string_view key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::document_reference>::operator[](const char *key) & noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::value> simdjson_result<rvv_vls::ondemand::document_reference>::operator[](const char *key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::document_reference>::find_field(std::string_view key) & noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::value> simdjson_result<rvv_vls::ondemand::document_reference>::find_field(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::document_reference>::find_field(const char *key) & noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::value> simdjson_result<rvv_vls::ondemand::document_reference>::find_field(const char *key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<lasx::ondemand::array> simdjson_result<lasx::ondemand::document_reference>::get_array() & noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::array> simdjson_result<rvv_vls::ondemand::document_reference>::get_array() & noexcept { if (error()) { return error(); } return first.get_array(); } -simdjson_inline simdjson_result<lasx::ondemand::object> simdjson_result<lasx::ondemand::document_reference>::get_object() & noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::object> simdjson_result<rvv_vls::ondemand::document_reference>::get_object() & noexcept { if (error()) { return error(); } return first.get_object(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<lasx::ondemand::document_reference>::get_uint64() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<rvv_vls::ondemand::document_reference>::get_uint64() noexcept { if (error()) { return error(); } return first.get_uint64(); } -simdjson_inline simdjson_result<uint64_t> simdjson_result<lasx::ondemand::document_reference>::get_uint64_in_string() noexcept { +simdjson_inline simdjson_result<uint64_t> simdjson_result<rvv_vls::ondemand::document_reference>::get_uint64_in_string() noexcept { if (error()) { return error(); } return first.get_uint64_in_string(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<lasx::ondemand::document_reference>::get_int64() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<rvv_vls::ondemand::document_reference>::get_int64() noexcept { if (error()) { return error(); } return first.get_int64(); } -simdjson_inline simdjson_result<int64_t> simdjson_result<lasx::ondemand::document_reference>::get_int64_in_string() noexcept { +simdjson_inline simdjson_result<int64_t> simdjson_result<rvv_vls::ondemand::document_reference>::get_int64_in_string() noexcept { if (error()) { return error(); } return first.get_int64_in_string(); } -simdjson_inline simdjson_result<double> simdjson_result<lasx::ondemand::document_reference>::get_double() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<rvv_vls::ondemand::document_reference>::get_double() noexcept { if (error()) { return error(); } return first.get_double(); } -simdjson_inline simdjson_result<double> simdjson_result<lasx::ondemand::document_reference>::get_double_in_string() noexcept { +simdjson_inline simdjson_result<double> simdjson_result<rvv_vls::ondemand::document_reference>::get_double_in_string() noexcept { if (error()) { return error(); } return first.get_double_in_string(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<lasx::ondemand::document_reference>::get_string(bool allow_replacement) noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<rvv_vls::ondemand::document_reference>::get_string(bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(allow_replacement); } template <typename string_type> -simdjson_warn_unused simdjson_inline error_code simdjson_result<lasx::ondemand::document_reference>::get_string(string_type& receiver, bool allow_replacement) noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<rvv_vls::ondemand::document_reference>::get_string(string_type& receiver, bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(receiver, allow_replacement); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<lasx::ondemand::document_reference>::get_wobbly_string() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<rvv_vls::ondemand::document_reference>::get_wobbly_string() noexcept { if (error()) { return error(); } return first.get_wobbly_string(); } -simdjson_inline simdjson_result<lasx::ondemand::raw_json_string> simdjson_result<lasx::ondemand::document_reference>::get_raw_json_string() noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::raw_json_string> simdjson_result<rvv_vls::ondemand::document_reference>::get_raw_json_string() noexcept { if (error()) { return error(); } return first.get_raw_json_string(); } -simdjson_inline simdjson_result<bool> simdjson_result<lasx::ondemand::document_reference>::get_bool() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<rvv_vls::ondemand::document_reference>::get_bool() noexcept { if (error()) { return error(); } return first.get_bool(); } -simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::document_reference>::get_value() noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::value> simdjson_result<rvv_vls::ondemand::document_reference>::get_value() noexcept { if (error()) { return error(); } return first.get_value(); } -simdjson_inline simdjson_result<bool> simdjson_result<lasx::ondemand::document_reference>::is_null() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<rvv_vls::ondemand::document_reference>::is_null() noexcept { if (error()) { return error(); } return first.is_null(); } template<typename T> -simdjson_inline simdjson_result<T> simdjson_result<lasx::ondemand::document_reference>::get() & noexcept { +simdjson_inline simdjson_result<T> simdjson_result<rvv_vls::ondemand::document_reference>::get() & noexcept { if (error()) { return error(); } return first.get<T>(); } template<typename T> -simdjson_inline simdjson_result<T> simdjson_result<lasx::ondemand::document_reference>::get() && noexcept { +simdjson_inline simdjson_result<T> simdjson_result<rvv_vls::ondemand::document_reference>::get() && noexcept { if (error()) { return error(); } - return std::forward<lasx::ondemand::document_reference>(first).get<T>(); + return std::forward<rvv_vls::ondemand::document_reference>(first).get<T>(); } template <class T> -simdjson_warn_unused simdjson_inline error_code simdjson_result<lasx::ondemand::document_reference>::get(T &out) & noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<rvv_vls::ondemand::document_reference>::get(T &out) & noexcept { if (error()) { return error(); } return first.get<T>(out); } template <class T> -simdjson_warn_unused simdjson_inline error_code simdjson_result<lasx::ondemand::document_reference>::get(T &out) && noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<rvv_vls::ondemand::document_reference>::get(T &out) && noexcept { if (error()) { return error(); } - return std::forward<lasx::ondemand::document_reference>(first).get<T>(out); + return std::forward<rvv_vls::ondemand::document_reference>(first).get<T>(out); } -simdjson_inline simdjson_result<lasx::ondemand::json_type> simdjson_result<lasx::ondemand::document_reference>::type() noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::json_type> simdjson_result<rvv_vls::ondemand::document_reference>::type() noexcept { if (error()) { return error(); } return first.type(); } -simdjson_inline simdjson_result<bool> simdjson_result<lasx::ondemand::document_reference>::is_scalar() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<rvv_vls::ondemand::document_reference>::is_scalar() noexcept { if (error()) { return error(); } return first.is_scalar(); } -simdjson_inline simdjson_result<bool> simdjson_result<lasx::ondemand::document_reference>::is_string() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<rvv_vls::ondemand::document_reference>::is_string() noexcept { if (error()) { return error(); } return first.is_string(); } template <> -simdjson_warn_unused simdjson_inline error_code simdjson_result<lasx::ondemand::document_reference>::get(lasx::ondemand::document_reference &out) & noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<rvv_vls::ondemand::document_reference>::get(rvv_vls::ondemand::document_reference &out) & noexcept { if (error()) { return error(); } out = first; return SUCCESS; } template <> -simdjson_warn_unused simdjson_inline error_code simdjson_result<lasx::ondemand::document_reference>::get(lasx::ondemand::document_reference &out) && noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<rvv_vls::ondemand::document_reference>::get(rvv_vls::ondemand::document_reference &out) && noexcept { if (error()) { return error(); } out = first; return SUCCESS; } -simdjson_inline simdjson_result<bool> simdjson_result<lasx::ondemand::document_reference>::is_negative() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<rvv_vls::ondemand::document_reference>::is_negative() noexcept { if (error()) { return error(); } return first.is_negative(); } -simdjson_inline simdjson_result<bool> simdjson_result<lasx::ondemand::document_reference>::is_integer() noexcept { +simdjson_inline simdjson_result<bool> simdjson_result<rvv_vls::ondemand::document_reference>::is_integer() noexcept { if (error()) { return error(); } return first.is_integer(); } -simdjson_inline simdjson_result<lasx::number_type> simdjson_result<lasx::ondemand::document_reference>::get_number_type() noexcept { +simdjson_inline simdjson_result<rvv_vls::number_type> simdjson_result<rvv_vls::ondemand::document_reference>::get_number_type() noexcept { if (error()) { return error(); } return first.get_number_type(); } -simdjson_inline simdjson_result<lasx::ondemand::number> simdjson_result<lasx::ondemand::document_reference>::get_number() noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::number> simdjson_result<rvv_vls::ondemand::document_reference>::get_number() noexcept { if (error()) { return error(); } return first.get_number(); } #if SIMDJSON_EXCEPTIONS template <class T> -simdjson_inline simdjson_result<lasx::ondemand::document_reference>::operator T() noexcept(false) { - static_assert(std::is_same<T, lasx::ondemand::document_reference>::value == false, "You should not call get<T> when T is a document"); - static_assert(std::is_same<T, lasx::ondemand::document>::value == false, "You should not call get<T> when T is a document"); +simdjson_inline simdjson_result<rvv_vls::ondemand::document_reference>::operator T() noexcept(false) { + static_assert(std::is_same<T, rvv_vls::ondemand::document_reference>::value == false, "You should not call get<T> when T is a document"); + static_assert(std::is_same<T, rvv_vls::ondemand::document>::value == false, "You should not call get<T> when T is a document"); if (error()) { throw simdjson_error(error()); } return first.get<T>(); } -simdjson_inline simdjson_result<lasx::ondemand::document_reference>::operator lasx::ondemand::array() & noexcept(false) { +simdjson_inline simdjson_result<rvv_vls::ondemand::document_reference>::operator rvv_vls::ondemand::array() & noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lasx::ondemand::document_reference>::operator lasx::ondemand::object() & noexcept(false) { +simdjson_inline simdjson_result<rvv_vls::ondemand::document_reference>::operator rvv_vls::ondemand::object() & noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lasx::ondemand::document_reference>::operator uint64_t() noexcept(false) { +simdjson_inline simdjson_result<rvv_vls::ondemand::document_reference>::operator uint64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lasx::ondemand::document_reference>::operator int64_t() noexcept(false) { +simdjson_inline simdjson_result<rvv_vls::ondemand::document_reference>::operator int64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lasx::ondemand::document_reference>::operator double() noexcept(false) { +simdjson_inline simdjson_result<rvv_vls::ondemand::document_reference>::operator double() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lasx::ondemand::document_reference>::operator std::string_view() noexcept(false) { +simdjson_inline simdjson_result<rvv_vls::ondemand::document_reference>::operator std::string_view() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lasx::ondemand::document_reference>::operator lasx::ondemand::raw_json_string() noexcept(false) { +simdjson_inline simdjson_result<rvv_vls::ondemand::document_reference>::operator rvv_vls::ondemand::raw_json_string() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lasx::ondemand::document_reference>::operator bool() noexcept(false) { +simdjson_inline simdjson_result<rvv_vls::ondemand::document_reference>::operator bool() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result<lasx::ondemand::document_reference>::operator lasx::ondemand::value() noexcept(false) { +simdjson_inline simdjson_result<rvv_vls::ondemand::document_reference>::operator rvv_vls::ondemand::value() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } #endif -simdjson_inline simdjson_result<const char *> simdjson_result<lasx::ondemand::document_reference>::current_location() noexcept { +simdjson_inline simdjson_result<const char *> simdjson_result<rvv_vls::ondemand::document_reference>::current_location() noexcept { if (error()) { return error(); } return first.current_location(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<lasx::ondemand::document_reference>::raw_json_token() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<rvv_vls::ondemand::document_reference>::raw_json_token() noexcept { if (error()) { return error(); } return first.raw_json_token(); } -simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::document_reference>::at_pointer(std::string_view json_pointer) noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::value> simdjson_result<rvv_vls::ondemand::document_reference>::at_pointer(std::string_view json_pointer) noexcept { if (error()) { return error(); } return first.at_pointer(json_pointer); } -simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::document_reference>::at_path(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::value> simdjson_result<rvv_vls::ondemand::document_reference>::at_path(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path(json_path); } -simdjson_inline simdjson_result<std::vector<lasx::ondemand::value>> simdjson_result<lasx::ondemand::document_reference>::at_path_with_wildcard(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<std::vector<rvv_vls::ondemand::value>> simdjson_result<rvv_vls::ondemand::document_reference>::at_path_with_wildcard(std::string_view json_path) noexcept { if (error()) { return error(); } @@ -147320,7 +179209,7 @@ simdjson_inline simdjson_result<std::vector<lasx::ondemand::value>> simdjson_res #if SIMDJSON_STATIC_REFLECTION template<constevalutil::fixed_string... FieldNames, typename T> requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) -simdjson_warn_unused simdjson_inline error_code simdjson_result<lasx::ondemand::document_reference>::extract_into(T& out) & noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<rvv_vls::ondemand::document_reference>::extract_into(T& out) & noexcept { if (error()) { return error(); } return first.extract_into<FieldNames...>(out); } @@ -147328,9 +179217,9 @@ simdjson_warn_unused simdjson_inline error_code simdjson_result<lasx::ondemand:: } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H -/* end file simdjson/generic/ondemand/document-inl.h for lasx */ -/* including simdjson/generic/ondemand/document_stream-inl.h for lasx: #include "simdjson/generic/ondemand/document_stream-inl.h" */ -/* begin file simdjson/generic/ondemand/document_stream-inl.h for lasx */ +/* end file simdjson/generic/ondemand/document-inl.h for rvv_vls */ +/* including simdjson/generic/ondemand/document_stream-inl.h for rvv_vls: #include "simdjson/generic/ondemand/document_stream-inl.h" */ +/* begin file simdjson/generic/ondemand/document_stream-inl.h for rvv_vls */ #ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -147345,7 +179234,7 @@ simdjson_warn_unused simdjson_inline error_code simdjson_result<lasx::ondemand:: #include <stdexcept> namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace ondemand { #ifdef SIMDJSON_THREADS_ENABLED @@ -147752,22 +179641,22 @@ inline void document_stream::start_stage1_thread() noexcept { #endif // SIMDJSON_THREADS_ENABLED } // namespace ondemand -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<lasx::ondemand::document_stream>::simdjson_result( +simdjson_inline simdjson_result<rvv_vls::ondemand::document_stream>::simdjson_result( error_code error ) noexcept : - implementation_simdjson_result_base<lasx::ondemand::document_stream>(error) + implementation_simdjson_result_base<rvv_vls::ondemand::document_stream>(error) { } -simdjson_inline simdjson_result<lasx::ondemand::document_stream>::simdjson_result( - lasx::ondemand::document_stream &&value +simdjson_inline simdjson_result<rvv_vls::ondemand::document_stream>::simdjson_result( + rvv_vls::ondemand::document_stream &&value ) noexcept : - implementation_simdjson_result_base<lasx::ondemand::document_stream>( - std::forward<lasx::ondemand::document_stream>(value) + implementation_simdjson_result_base<rvv_vls::ondemand::document_stream>( + std::forward<rvv_vls::ondemand::document_stream>(value) ) { } @@ -147775,9 +179664,9 @@ simdjson_inline simdjson_result<lasx::ondemand::document_stream>::simdjson_resul } #endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_INL_H -/* end file simdjson/generic/ondemand/document_stream-inl.h for lasx */ -/* including simdjson/generic/ondemand/field-inl.h for lasx: #include "simdjson/generic/ondemand/field-inl.h" */ -/* begin file simdjson/generic/ondemand/field-inl.h for lasx */ +/* end file simdjson/generic/ondemand/document_stream-inl.h for rvv_vls */ +/* including simdjson/generic/ondemand/field-inl.h for rvv_vls: #include "simdjson/generic/ondemand/field-inl.h" */ +/* begin file simdjson/generic/ondemand/field-inl.h for rvv_vls */ #ifndef SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -147789,7 +179678,7 @@ simdjson_inline simdjson_result<lasx::ondemand::document_stream>::simdjson_resul /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace ondemand { // clang 6 does not think the default constructor can be noexcept, so we make it explicit @@ -147853,53 +179742,53 @@ simdjson_inline value field::value() && noexcept { } } // namespace ondemand -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<lasx::ondemand::field>::simdjson_result( - lasx::ondemand::field &&value +simdjson_inline simdjson_result<rvv_vls::ondemand::field>::simdjson_result( + rvv_vls::ondemand::field &&value ) noexcept : - implementation_simdjson_result_base<lasx::ondemand::field>( - std::forward<lasx::ondemand::field>(value) + implementation_simdjson_result_base<rvv_vls::ondemand::field>( + std::forward<rvv_vls::ondemand::field>(value) ) { } -simdjson_inline simdjson_result<lasx::ondemand::field>::simdjson_result( +simdjson_inline simdjson_result<rvv_vls::ondemand::field>::simdjson_result( error_code error ) noexcept : - implementation_simdjson_result_base<lasx::ondemand::field>(error) + implementation_simdjson_result_base<rvv_vls::ondemand::field>(error) { } -simdjson_inline simdjson_result<lasx::ondemand::raw_json_string> simdjson_result<lasx::ondemand::field>::key() noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::raw_json_string> simdjson_result<rvv_vls::ondemand::field>::key() noexcept { if (error()) { return error(); } return first.key(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<lasx::ondemand::field>::key_raw_json_token() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<rvv_vls::ondemand::field>::key_raw_json_token() noexcept { if (error()) { return error(); } return first.key_raw_json_token(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<lasx::ondemand::field>::escaped_key() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<rvv_vls::ondemand::field>::escaped_key() noexcept { if (error()) { return error(); } return first.escaped_key(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<lasx::ondemand::field>::unescaped_key(bool allow_replacement) noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<rvv_vls::ondemand::field>::unescaped_key(bool allow_replacement) noexcept { if (error()) { return error(); } return first.unescaped_key(allow_replacement); } template<typename string_type> -simdjson_warn_unused simdjson_inline error_code simdjson_result<lasx::ondemand::field>::unescaped_key(string_type &receiver, bool allow_replacement) noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result<rvv_vls::ondemand::field>::unescaped_key(string_type &receiver, bool allow_replacement) noexcept { if (error()) { return error(); } return first.unescaped_key(receiver, allow_replacement); } -simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::field>::value() noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::value> simdjson_result<rvv_vls::ondemand::field>::value() noexcept { if (error()) { return error(); } return std::move(first.value()); } @@ -147907,9 +179796,9 @@ simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ond } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H -/* end file simdjson/generic/ondemand/field-inl.h for lasx */ -/* including simdjson/generic/ondemand/json_iterator-inl.h for lasx: #include "simdjson/generic/ondemand/json_iterator-inl.h" */ -/* begin file simdjson/generic/ondemand/json_iterator-inl.h for lasx */ +/* end file simdjson/generic/ondemand/field-inl.h for rvv_vls */ +/* including simdjson/generic/ondemand/json_iterator-inl.h for rvv_vls: #include "simdjson/generic/ondemand/json_iterator-inl.h" */ +/* begin file simdjson/generic/ondemand/json_iterator-inl.h for rvv_vls */ #ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -147925,7 +179814,7 @@ simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ond /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace ondemand { simdjson_inline json_iterator::json_iterator(json_iterator &&other) noexcept @@ -148127,11 +180016,10 @@ simdjson_inline void json_iterator::assert_more_tokens(uint32_t required_tokens) } simdjson_inline void json_iterator::assert_valid_position(token_position position) const noexcept { + (void)position; // Suppress unused parameter warning #ifndef SIMDJSON_CLANG_VISUAL_STUDIO SIMDJSON_ASSUME( position >= &parser->implementation->structural_indexes[0] ); SIMDJSON_ASSUME( position < &parser->implementation->structural_indexes[parser->implementation->n_structural_indexes] ); -#else - (void)position; // Suppress unused parameter warning #endif } @@ -148270,7 +180158,11 @@ simdjson_inline token_position json_iterator::position() const noexcept { simdjson_inline simdjson_result<std::string_view> json_iterator::unescape(raw_json_string in, bool allow_replacement) noexcept { #if SIMDJSON_DEVELOPMENT_CHECKS auto result = parser->unescape(in, _string_buf_loc, allow_replacement); +#if !defined(SIMDJSON_VISUAL_STUDIO) && !defined(SIMDJSON_CLANG_VISUAL_STUDIO) + // Under Visual Studio, the next SIMDJSON_ASSUME fails with: the argument + // has side effects that will be discarded. SIMDJSON_ASSUME(!parser->string_buffer_overflow(_string_buf_loc)); +#endif // !defined(SIMDJSON_VISUAL_STUDIO) && !defined(SIMDJSON_CLANG_VISUAL_STUDIO) return result; #else return parser->unescape(in, _string_buf_loc, allow_replacement); @@ -148280,7 +180172,11 @@ simdjson_inline simdjson_result<std::string_view> json_iterator::unescape(raw_js simdjson_inline simdjson_result<std::string_view> json_iterator::unescape_wobbly(raw_json_string in) noexcept { #if SIMDJSON_DEVELOPMENT_CHECKS auto result = parser->unescape_wobbly(in, _string_buf_loc); +#if !defined(SIMDJSON_VISUAL_STUDIO) && !defined(SIMDJSON_CLANG_VISUAL_STUDIO) + // Under Visual Studio, the next SIMDJSON_ASSUME fails with: the argument + // has side effects that will be discarded. SIMDJSON_ASSUME(!parser->string_buffer_overflow(_string_buf_loc)); +#endif // !defined(SIMDJSON_VISUAL_STUDIO) && !defined(SIMDJSON_CLANG_VISUAL_STUDIO) return result; #else return parser->unescape_wobbly(in, _string_buf_loc); @@ -148343,22 +180239,22 @@ simdjson_warn_unused simdjson_inline bool json_iterator::copy_to_buffer(const ui } } // namespace ondemand -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<lasx::ondemand::json_iterator>::simdjson_result(lasx::ondemand::json_iterator &&value) noexcept - : implementation_simdjson_result_base<lasx::ondemand::json_iterator>(std::forward<lasx::ondemand::json_iterator>(value)) {} -simdjson_inline simdjson_result<lasx::ondemand::json_iterator>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<lasx::ondemand::json_iterator>(error) {} +simdjson_inline simdjson_result<rvv_vls::ondemand::json_iterator>::simdjson_result(rvv_vls::ondemand::json_iterator &&value) noexcept + : implementation_simdjson_result_base<rvv_vls::ondemand::json_iterator>(std::forward<rvv_vls::ondemand::json_iterator>(value)) {} +simdjson_inline simdjson_result<rvv_vls::ondemand::json_iterator>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<rvv_vls::ondemand::json_iterator>(error) {} } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_INL_H -/* end file simdjson/generic/ondemand/json_iterator-inl.h for lasx */ -/* including simdjson/generic/ondemand/json_type-inl.h for lasx: #include "simdjson/generic/ondemand/json_type-inl.h" */ -/* begin file simdjson/generic/ondemand/json_type-inl.h for lasx */ +/* end file simdjson/generic/ondemand/json_iterator-inl.h for rvv_vls */ +/* including simdjson/generic/ondemand/json_type-inl.h for rvv_vls: #include "simdjson/generic/ondemand/json_type-inl.h" */ +/* begin file simdjson/generic/ondemand/json_type-inl.h for rvv_vls */ #ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -148369,7 +180265,7 @@ simdjson_inline simdjson_result<lasx::ondemand::json_iterator>::simdjson_result( /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace ondemand { inline std::ostream& operator<<(std::ostream& out, json_type type) noexcept { @@ -148463,22 +180359,22 @@ simdjson_inline void number::skip_double() noexcept { } } // namespace ondemand -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<lasx::ondemand::json_type>::simdjson_result(lasx::ondemand::json_type &&value) noexcept - : implementation_simdjson_result_base<lasx::ondemand::json_type>(std::forward<lasx::ondemand::json_type>(value)) {} -simdjson_inline simdjson_result<lasx::ondemand::json_type>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<lasx::ondemand::json_type>(error) {} +simdjson_inline simdjson_result<rvv_vls::ondemand::json_type>::simdjson_result(rvv_vls::ondemand::json_type &&value) noexcept + : implementation_simdjson_result_base<rvv_vls::ondemand::json_type>(std::forward<rvv_vls::ondemand::json_type>(value)) {} +simdjson_inline simdjson_result<rvv_vls::ondemand::json_type>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<rvv_vls::ondemand::json_type>(error) {} } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_INL_H -/* end file simdjson/generic/ondemand/json_type-inl.h for lasx */ -/* including simdjson/generic/ondemand/logger-inl.h for lasx: #include "simdjson/generic/ondemand/logger-inl.h" */ -/* begin file simdjson/generic/ondemand/logger-inl.h for lasx */ +/* end file simdjson/generic/ondemand/json_type-inl.h for rvv_vls */ +/* including simdjson/generic/ondemand/logger-inl.h for rvv_vls: #include "simdjson/generic/ondemand/logger-inl.h" */ +/* begin file simdjson/generic/ondemand/logger-inl.h for rvv_vls */ #ifndef SIMDJSON_GENERIC_ONDEMAND_LOGGER_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -148493,7 +180389,7 @@ simdjson_inline simdjson_result<lasx::ondemand::json_type>::simdjson_result(erro #include <cstring> namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace ondemand { namespace logger { @@ -148700,13 +180596,13 @@ inline void log_line(const json_iterator &iter, token_position index, depth_t de } // namespace logger } // namespace ondemand -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_LOGGER_INL_H -/* end file simdjson/generic/ondemand/logger-inl.h for lasx */ -/* including simdjson/generic/ondemand/object-inl.h for lasx: #include "simdjson/generic/ondemand/object-inl.h" */ -/* begin file simdjson/generic/ondemand/object-inl.h for lasx */ +/* end file simdjson/generic/ondemand/logger-inl.h for rvv_vls */ +/* including simdjson/generic/ondemand/object-inl.h for rvv_vls: #include "simdjson/generic/ondemand/object-inl.h" */ +/* begin file simdjson/generic/ondemand/object-inl.h for rvv_vls */ #ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -148726,7 +180622,7 @@ inline void log_line(const json_iterator &iter, token_position index, depth_t de /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace ondemand { simdjson_inline simdjson_result<value> object::find_field_unordered(const std::string_view key) & noexcept { @@ -149000,55 +180896,55 @@ simdjson_warn_unused simdjson_inline error_code object::extract_into(T& out) & n #endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION } // namespace ondemand -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<lasx::ondemand::object>::simdjson_result(lasx::ondemand::object &&value) noexcept - : implementation_simdjson_result_base<lasx::ondemand::object>(std::forward<lasx::ondemand::object>(value)) {} -simdjson_inline simdjson_result<lasx::ondemand::object>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<lasx::ondemand::object>(error) {} +simdjson_inline simdjson_result<rvv_vls::ondemand::object>::simdjson_result(rvv_vls::ondemand::object &&value) noexcept + : implementation_simdjson_result_base<rvv_vls::ondemand::object>(std::forward<rvv_vls::ondemand::object>(value)) {} +simdjson_inline simdjson_result<rvv_vls::ondemand::object>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<rvv_vls::ondemand::object>(error) {} -simdjson_inline simdjson_result<lasx::ondemand::object_iterator> simdjson_result<lasx::ondemand::object>::begin() noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::object_iterator> simdjson_result<rvv_vls::ondemand::object>::begin() noexcept { if (error()) { return error(); } return first.begin(); } -simdjson_inline simdjson_result<lasx::ondemand::object_iterator> simdjson_result<lasx::ondemand::object>::end() noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::object_iterator> simdjson_result<rvv_vls::ondemand::object>::end() noexcept { if (error()) { return error(); } return first.end(); } -simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::object>::find_field_unordered(std::string_view key) & noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::value> simdjson_result<rvv_vls::ondemand::object>::find_field_unordered(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::object>::find_field_unordered(std::string_view key) && noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::value> simdjson_result<rvv_vls::ondemand::object>::find_field_unordered(std::string_view key) && noexcept { if (error()) { return error(); } - return std::forward<lasx::ondemand::object>(first).find_field_unordered(key); + return std::forward<rvv_vls::ondemand::object>(first).find_field_unordered(key); } -simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::object>::operator[](std::string_view key) & noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::value> simdjson_result<rvv_vls::ondemand::object>::operator[](std::string_view key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::object>::operator[](std::string_view key) && noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::value> simdjson_result<rvv_vls::ondemand::object>::operator[](std::string_view key) && noexcept { if (error()) { return error(); } - return std::forward<lasx::ondemand::object>(first)[key]; + return std::forward<rvv_vls::ondemand::object>(first)[key]; } -simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::object>::find_field(std::string_view key) & noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::value> simdjson_result<rvv_vls::ondemand::object>::find_field(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::object>::find_field(std::string_view key) && noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::value> simdjson_result<rvv_vls::ondemand::object>::find_field(std::string_view key) && noexcept { if (error()) { return error(); } - return std::forward<lasx::ondemand::object>(first).find_field(key); + return std::forward<rvv_vls::ondemand::object>(first).find_field(key); } -simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::object>::at_pointer(std::string_view json_pointer) noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::value> simdjson_result<rvv_vls::ondemand::object>::at_pointer(std::string_view json_pointer) noexcept { if (error()) { return error(); } return first.at_pointer(json_pointer); } -simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ondemand::object>::at_path( +simdjson_inline simdjson_result<rvv_vls::ondemand::value> simdjson_result<rvv_vls::ondemand::object>::at_path( std::string_view json_path) noexcept { if (error()) { return error(); @@ -149056,27 +180952,27 @@ simdjson_inline simdjson_result<lasx::ondemand::value> simdjson_result<lasx::ond return first.at_path(json_path); } -simdjson_inline simdjson_result<std::vector<lasx::ondemand::value>> simdjson_result<lasx::ondemand::object>::at_path_with_wildcard(std::string_view json_path) noexcept { +simdjson_inline simdjson_result<std::vector<rvv_vls::ondemand::value>> simdjson_result<rvv_vls::ondemand::object>::at_path_with_wildcard(std::string_view json_path) noexcept { if (error()) { return error(); } return first.at_path_with_wildcard(json_path); } -inline simdjson_result<bool> simdjson_result<lasx::ondemand::object>::reset() noexcept { +inline simdjson_result<bool> simdjson_result<rvv_vls::ondemand::object>::reset() noexcept { if (error()) { return error(); } return first.reset(); } -inline simdjson_result<bool> simdjson_result<lasx::ondemand::object>::is_empty() noexcept { +inline simdjson_result<bool> simdjson_result<rvv_vls::ondemand::object>::is_empty() noexcept { if (error()) { return error(); } return first.is_empty(); } -simdjson_inline simdjson_result<size_t> simdjson_result<lasx::ondemand::object>::count_fields() & noexcept { +simdjson_inline simdjson_result<size_t> simdjson_result<rvv_vls::ondemand::object>::count_fields() & noexcept { if (error()) { return error(); } return first.count_fields(); } -simdjson_inline simdjson_result<std::string_view> simdjson_result<lasx::ondemand::object>::raw_json() noexcept { +simdjson_inline simdjson_result<std::string_view> simdjson_result<rvv_vls::ondemand::object>::raw_json() noexcept { if (error()) { return error(); } return first.raw_json(); } @@ -149084,9 +180980,9 @@ simdjson_inline simdjson_result<std::string_view> simdjson_result<lasx::ondeman } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_INL_H -/* end file simdjson/generic/ondemand/object-inl.h for lasx */ -/* including simdjson/generic/ondemand/object_iterator-inl.h for lasx: #include "simdjson/generic/ondemand/object_iterator-inl.h" */ -/* begin file simdjson/generic/ondemand/object_iterator-inl.h for lasx */ +/* end file simdjson/generic/ondemand/object-inl.h for rvv_vls */ +/* including simdjson/generic/ondemand/object_iterator-inl.h for rvv_vls: #include "simdjson/generic/ondemand/object_iterator-inl.h" */ +/* begin file simdjson/generic/ondemand/object_iterator-inl.h for rvv_vls */ #ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -149098,7 +180994,7 @@ simdjson_inline simdjson_result<std::string_view> simdjson_result<lasx::ondeman /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace ondemand { // @@ -149110,6 +181006,11 @@ simdjson_inline object_iterator::object_iterator(const value_iterator &_iter) no {} simdjson_inline simdjson_result<field> object_iterator::operator*() noexcept { +#if SIMDJSON_DEVELOPMENT_CHECKS + // We must call * once per iteration. + SIMDJSON_ASSUME(!has_been_referenced); + has_been_referenced = true; +#endif error_code error = iter.error(); if (error) { iter.abandon(); return error; } auto result = field::start(iter); @@ -149128,6 +181029,11 @@ simdjson_inline bool object_iterator::operator!=(const object_iterator &) const SIMDJSON_PUSH_DISABLE_WARNINGS SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING simdjson_inline object_iterator &object_iterator::operator++() noexcept { +#if SIMDJSON_DEVELOPMENT_CHECKS + // Before calling ++, we must have called *. + SIMDJSON_ASSUME(has_been_referenced); + has_been_referenced = false; +#endif // TODO this is a safety rail ... users should exit loops as soon as they receive an error. // Nonetheless, let's see if performance is OK with this if statement--the compiler may give it to us for free. if (!iter.is_open()) { return *this; } // Iterator will be released if there is an error @@ -149183,39 +181089,39 @@ SIMDJSON_POP_DISABLE_WARNINGS // } // namespace ondemand -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<lasx::ondemand::object_iterator>::simdjson_result( - lasx::ondemand::object_iterator &&value +simdjson_inline simdjson_result<rvv_vls::ondemand::object_iterator>::simdjson_result( + rvv_vls::ondemand::object_iterator &&value ) noexcept - : implementation_simdjson_result_base<lasx::ondemand::object_iterator>(std::forward<lasx::ondemand::object_iterator>(value)) + : implementation_simdjson_result_base<rvv_vls::ondemand::object_iterator>(std::forward<rvv_vls::ondemand::object_iterator>(value)) { first.iter.assert_is_valid(); } -simdjson_inline simdjson_result<lasx::ondemand::object_iterator>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<lasx::ondemand::object_iterator>({}, error) +simdjson_inline simdjson_result<rvv_vls::ondemand::object_iterator>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<rvv_vls::ondemand::object_iterator>({}, error) { } -simdjson_inline simdjson_result<lasx::ondemand::field> simdjson_result<lasx::ondemand::object_iterator>::operator*() noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::field> simdjson_result<rvv_vls::ondemand::object_iterator>::operator*() noexcept { if (error()) { return error(); } return *first; } // If we're iterating and there is an error, return the error once. -simdjson_inline bool simdjson_result<lasx::ondemand::object_iterator>::operator==(const simdjson_result<lasx::ondemand::object_iterator> &other) const noexcept { +simdjson_inline bool simdjson_result<rvv_vls::ondemand::object_iterator>::operator==(const simdjson_result<rvv_vls::ondemand::object_iterator> &other) const noexcept { if (!first.iter.is_valid()) { return !error(); } return first == other.first; } // If we're iterating and there is an error, return the error once. -simdjson_inline bool simdjson_result<lasx::ondemand::object_iterator>::operator!=(const simdjson_result<lasx::ondemand::object_iterator> &other) const noexcept { +simdjson_inline bool simdjson_result<rvv_vls::ondemand::object_iterator>::operator!=(const simdjson_result<rvv_vls::ondemand::object_iterator> &other) const noexcept { if (!first.iter.is_valid()) { return error(); } return first != other.first; } // Checks for ']' and ',' -simdjson_inline simdjson_result<lasx::ondemand::object_iterator> &simdjson_result<lasx::ondemand::object_iterator>::operator++() noexcept { +simdjson_inline simdjson_result<rvv_vls::ondemand::object_iterator> &simdjson_result<rvv_vls::ondemand::object_iterator>::operator++() noexcept { // Clear the error if there is one, so we don't yield it twice if (error()) { second = SUCCESS; return *this; } ++first; @@ -149225,9 +181131,9 @@ simdjson_inline simdjson_result<lasx::ondemand::object_iterator> &simdjson_resul } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_INL_H -/* end file simdjson/generic/ondemand/object_iterator-inl.h for lasx */ -/* including simdjson/generic/ondemand/parser-inl.h for lasx: #include "simdjson/generic/ondemand/parser-inl.h" */ -/* begin file simdjson/generic/ondemand/parser-inl.h for lasx */ +/* end file simdjson/generic/ondemand/object_iterator-inl.h for rvv_vls */ +/* including simdjson/generic/ondemand/parser-inl.h for rvv_vls: #include "simdjson/generic/ondemand/parser-inl.h" */ +/* begin file simdjson/generic/ondemand/parser-inl.h for rvv_vls */ #ifndef SIMDJSON_GENERIC_ONDEMAND_PARSER_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -149244,7 +181150,7 @@ simdjson_inline simdjson_result<lasx::ondemand::object_iterator> &simdjson_resul /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace ondemand { simdjson_inline parser::parser(size_t max_capacity) noexcept @@ -149454,22 +181360,22 @@ simdjson_inline simdjson_warn_unused std::unique_ptr<ondemand::parser>& parser:: } // namespace ondemand -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<lasx::ondemand::parser>::simdjson_result(lasx::ondemand::parser &&value) noexcept - : implementation_simdjson_result_base<lasx::ondemand::parser>(std::forward<lasx::ondemand::parser>(value)) {} -simdjson_inline simdjson_result<lasx::ondemand::parser>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<lasx::ondemand::parser>(error) {} +simdjson_inline simdjson_result<rvv_vls::ondemand::parser>::simdjson_result(rvv_vls::ondemand::parser &&value) noexcept + : implementation_simdjson_result_base<rvv_vls::ondemand::parser>(std::forward<rvv_vls::ondemand::parser>(value)) {} +simdjson_inline simdjson_result<rvv_vls::ondemand::parser>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<rvv_vls::ondemand::parser>(error) {} } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_PARSER_INL_H -/* end file simdjson/generic/ondemand/parser-inl.h for lasx */ -/* including simdjson/generic/ondemand/raw_json_string-inl.h for lasx: #include "simdjson/generic/ondemand/raw_json_string-inl.h" */ -/* begin file simdjson/generic/ondemand/raw_json_string-inl.h for lasx */ +/* end file simdjson/generic/ondemand/parser-inl.h for rvv_vls */ +/* including simdjson/generic/ondemand/raw_json_string-inl.h for rvv_vls: #include "simdjson/generic/ondemand/raw_json_string-inl.h" */ +/* begin file simdjson/generic/ondemand/raw_json_string-inl.h for rvv_vls */ #ifndef SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -149482,7 +181388,7 @@ simdjson_inline simdjson_result<lasx::ondemand::parser>::simdjson_result(error_c namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace ondemand { simdjson_inline raw_json_string::raw_json_string(const uint8_t * _buf) noexcept : buf{_buf} {} @@ -149611,322 +181517,83 @@ simdjson_inline bool raw_json_string::is_equal(const char* target) const noexcep } else { escaping = false; } - } - if(r[pos] != '"') { return false; } - return true; -} - -simdjson_unused simdjson_inline bool operator==(const raw_json_string &a, std::string_view c) noexcept { - return a.unsafe_is_equal(c); -} - -simdjson_unused simdjson_inline bool operator==(std::string_view c, const raw_json_string &a) noexcept { - return a == c; -} - -simdjson_unused simdjson_inline bool operator!=(const raw_json_string &a, std::string_view c) noexcept { - return !(a == c); -} - -simdjson_unused simdjson_inline bool operator!=(std::string_view c, const raw_json_string &a) noexcept { - return !(a == c); -} - - -simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> raw_json_string::unescape(json_iterator &iter, bool allow_replacement) const noexcept { - return iter.unescape(*this, allow_replacement); -} - -simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> raw_json_string::unescape_wobbly(json_iterator &iter) const noexcept { - return iter.unescape_wobbly(*this); -} - -simdjson_unused simdjson_inline std::ostream &operator<<(std::ostream &out, const raw_json_string &str) noexcept { - bool in_escape = false; - const char *s = str.raw(); - while (true) { - switch (*s) { - case '\\': in_escape = !in_escape; break; - case '"': if (in_escape) { in_escape = false; } else { return out; } break; - default: if (in_escape) { in_escape = false; } - } - out << *s; - s++; - } -} - -} // namespace ondemand -} // namespace lasx -} // namespace simdjson - -namespace simdjson { - -simdjson_inline simdjson_result<lasx::ondemand::raw_json_string>::simdjson_result(lasx::ondemand::raw_json_string &&value) noexcept - : implementation_simdjson_result_base<lasx::ondemand::raw_json_string>(std::forward<lasx::ondemand::raw_json_string>(value)) {} -simdjson_inline simdjson_result<lasx::ondemand::raw_json_string>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<lasx::ondemand::raw_json_string>(error) {} - -simdjson_inline simdjson_result<const char *> simdjson_result<lasx::ondemand::raw_json_string>::raw() const noexcept { - if (error()) { return error(); } - return first.raw(); -} -simdjson_inline char simdjson_result<lasx::ondemand::raw_json_string>::operator[](size_t i) const noexcept { - if (error()) { return error(); } - return first[i]; -} -simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> simdjson_result<lasx::ondemand::raw_json_string>::unescape(lasx::ondemand::json_iterator &iter, bool allow_replacement) const noexcept { - if (error()) { return error(); } - return first.unescape(iter, allow_replacement); -} -simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> simdjson_result<lasx::ondemand::raw_json_string>::unescape_wobbly(lasx::ondemand::json_iterator &iter) const noexcept { - if (error()) { return error(); } - return first.unescape_wobbly(iter); -} -} // namespace simdjson - -#endif // SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_INL_H -/* end file simdjson/generic/ondemand/raw_json_string-inl.h for lasx */ -/* including simdjson/generic/ondemand/serialization-inl.h for lasx: #include "simdjson/generic/ondemand/serialization-inl.h" */ -/* begin file simdjson/generic/ondemand/serialization-inl.h for lasx */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H - -/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document-inl.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/serialization.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */ -/* amalgamation skipped (editor-only): #if SIMDJSON_STATIC_REFLECTION */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_builder.h" */ -/* amalgamation skipped (editor-only): #endif */ -/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ - -namespace simdjson { - -inline std::string_view trim(const std::string_view str) noexcept { - // We can almost surely do better by rolling our own find_first_not_of function. - size_t first = str.find_first_not_of(" \t\n\r"); - // If we have the empty string (just white space), then no trimming is possible, and - // we return the empty string_view. - if (std::string_view::npos == first) { return std::string_view(); } - size_t last = str.find_last_not_of(" \t\n\r"); - return str.substr(first, (last - first + 1)); -} - - -inline simdjson_result<std::string_view> to_json_string(lasx::ondemand::document& x) noexcept { - std::string_view v; - auto error = x.raw_json().get(v); - if(error) {return error; } - return trim(v); -} - -inline simdjson_result<std::string_view> to_json_string(lasx::ondemand::document_reference& x) noexcept { - std::string_view v; - auto error = x.raw_json().get(v); - if(error) {return error; } - return trim(v); -} - -inline simdjson_result<std::string_view> to_json_string(lasx::ondemand::value& x) noexcept { - /** - * If we somehow receive a value that has already been consumed, - * then the following code could be in trouble. E.g., we create - * an array as needed, but if an array was already created, then - * it could be bad. - */ - using namespace lasx::ondemand; - lasx::ondemand::json_type t; - auto error = x.type().get(t); - if(error != SUCCESS) { return error; } - switch (t) - { - case json_type::array: - { - lasx::ondemand::array array; - error = x.get_array().get(array); - if(error) { return error; } - return to_json_string(array); - } - case json_type::object: - { - lasx::ondemand::object object; - error = x.get_object().get(object); - if(error) { return error; } - return to_json_string(object); - } - default: - return trim(x.raw_json_token()); - } -} - -inline simdjson_result<std::string_view> to_json_string(lasx::ondemand::object& x) noexcept { - std::string_view v; - auto error = x.raw_json().get(v); - if(error) {return error; } - return trim(v); -} - -inline simdjson_result<std::string_view> to_json_string(lasx::ondemand::array& x) noexcept { - std::string_view v; - auto error = x.raw_json().get(v); - if(error) {return error; } - return trim(v); -} - -inline simdjson_result<std::string_view> to_json_string(simdjson_result<lasx::ondemand::document> x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); + } + if(r[pos] != '"') { return false; } + return true; } -inline simdjson_result<std::string_view> to_json_string(simdjson_result<lasx::ondemand::document_reference> x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); +simdjson_unused simdjson_inline bool operator==(const raw_json_string &a, std::string_view c) noexcept { + return a.unsafe_is_equal(c); } -inline simdjson_result<std::string_view> to_json_string(simdjson_result<lasx::ondemand::value> x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); +simdjson_unused simdjson_inline bool operator==(std::string_view c, const raw_json_string &a) noexcept { + return a == c; } -inline simdjson_result<std::string_view> to_json_string(simdjson_result<lasx::ondemand::object> x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); +simdjson_unused simdjson_inline bool operator!=(const raw_json_string &a, std::string_view c) noexcept { + return !(a == c); } -inline simdjson_result<std::string_view> to_json_string(simdjson_result<lasx::ondemand::array> x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); +simdjson_unused simdjson_inline bool operator!=(std::string_view c, const raw_json_string &a) noexcept { + return !(a == c); } -} // namespace simdjson -namespace simdjson { namespace lasx { namespace ondemand { -#if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::lasx::ondemand::value x) { - std::string_view v; - auto error = simdjson::to_json_string(x).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - throw simdjson::simdjson_error(error); - } -} -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::lasx::ondemand::value> x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); -} -#else -inline std::ostream& operator<<(std::ostream& out, simdjson::lasx::ondemand::value x) { - std::string_view v; - auto error = simdjson::to_json_string(x).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - return (out << error); - } +simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> raw_json_string::unescape(json_iterator &iter, bool allow_replacement) const noexcept { + return iter.unescape(*this, allow_replacement); } -#endif -#if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::lasx::ondemand::array value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - throw simdjson::simdjson_error(error); - } -} -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::lasx::ondemand::array> x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); -} -#else -inline std::ostream& operator<<(std::ostream& out, simdjson::lasx::ondemand::array value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - return (out << error); - } +simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> raw_json_string::unescape_wobbly(json_iterator &iter) const noexcept { + return iter.unescape_wobbly(*this); } -#endif -#if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::lasx::ondemand::document& value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - throw simdjson::simdjson_error(error); - } -} -inline std::ostream& operator<<(std::ostream& out, simdjson::lasx::ondemand::document_reference& value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - throw simdjson::simdjson_error(error); - } -} -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::lasx::ondemand::document>&& x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); -} -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::lasx::ondemand::document_reference>&& x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); -} -#else -inline std::ostream& operator<<(std::ostream& out, simdjson::lasx::ondemand::document& value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - return (out << error); +simdjson_unused simdjson_inline std::ostream &operator<<(std::ostream &out, const raw_json_string &str) noexcept { + bool in_escape = false; + const char *s = str.raw(); + while (true) { + switch (*s) { + case '\\': in_escape = !in_escape; break; + case '"': if (in_escape) { in_escape = false; } else { return out; } break; + default: if (in_escape) { in_escape = false; } + } + out << *s; + s++; } } -#endif -#if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::lasx::ondemand::object value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - throw simdjson::simdjson_error(error); - } +} // namespace ondemand +} // namespace rvv_vls +} // namespace simdjson + +namespace simdjson { + +simdjson_inline simdjson_result<rvv_vls::ondemand::raw_json_string>::simdjson_result(rvv_vls::ondemand::raw_json_string &&value) noexcept + : implementation_simdjson_result_base<rvv_vls::ondemand::raw_json_string>(std::forward<rvv_vls::ondemand::raw_json_string>(value)) {} +simdjson_inline simdjson_result<rvv_vls::ondemand::raw_json_string>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<rvv_vls::ondemand::raw_json_string>(error) {} + +simdjson_inline simdjson_result<const char *> simdjson_result<rvv_vls::ondemand::raw_json_string>::raw() const noexcept { + if (error()) { return error(); } + return first.raw(); } -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::lasx::ondemand::object> x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); +simdjson_inline char simdjson_result<rvv_vls::ondemand::raw_json_string>::operator[](size_t i) const noexcept { + if (error()) { return error(); } + return first[i]; } -#else -inline std::ostream& operator<<(std::ostream& out, simdjson::lasx::ondemand::object value) { - std::string_view v; - auto error = simdjson::to_json_string(value).get(v); - if(error == simdjson::SUCCESS) { - return (out << v); - } else { - return (out << error); - } +simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> simdjson_result<rvv_vls::ondemand::raw_json_string>::unescape(rvv_vls::ondemand::json_iterator &iter, bool allow_replacement) const noexcept { + if (error()) { return error(); } + return first.unescape(iter, allow_replacement); } -#endif -}}} // namespace simdjson::lasx::ondemand +simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> simdjson_result<rvv_vls::ondemand::raw_json_string>::unescape_wobbly(rvv_vls::ondemand::json_iterator &iter) const noexcept { + if (error()) { return error(); } + return first.unescape_wobbly(iter); +} +} // namespace simdjson -#endif // SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H -/* end file simdjson/generic/ondemand/serialization-inl.h for lasx */ -/* including simdjson/generic/ondemand/token_iterator-inl.h for lasx: #include "simdjson/generic/ondemand/token_iterator-inl.h" */ -/* begin file simdjson/generic/ondemand/token_iterator-inl.h for lasx */ +#endif // SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_INL_H +/* end file simdjson/generic/ondemand/raw_json_string-inl.h for rvv_vls */ +/* including simdjson/generic/ondemand/token_iterator-inl.h for rvv_vls: #include "simdjson/generic/ondemand/token_iterator-inl.h" */ +/* begin file simdjson/generic/ondemand/token_iterator-inl.h for rvv_vls */ #ifndef SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -149937,7 +181604,7 @@ inline std::ostream& operator<<(std::ostream& out, simdjson::lasx::ondemand::obj /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace ondemand { simdjson_inline token_iterator::token_iterator( @@ -150008,22 +181675,22 @@ simdjson_inline bool token_iterator::operator<=(const token_iterator &other) con } } // namespace ondemand -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result<lasx::ondemand::token_iterator>::simdjson_result(lasx::ondemand::token_iterator &&value) noexcept - : implementation_simdjson_result_base<lasx::ondemand::token_iterator>(std::forward<lasx::ondemand::token_iterator>(value)) {} -simdjson_inline simdjson_result<lasx::ondemand::token_iterator>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<lasx::ondemand::token_iterator>(error) {} +simdjson_inline simdjson_result<rvv_vls::ondemand::token_iterator>::simdjson_result(rvv_vls::ondemand::token_iterator &&value) noexcept + : implementation_simdjson_result_base<rvv_vls::ondemand::token_iterator>(std::forward<rvv_vls::ondemand::token_iterator>(value)) {} +simdjson_inline simdjson_result<rvv_vls::ondemand::token_iterator>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<rvv_vls::ondemand::token_iterator>(error) {} } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_INL_H -/* end file simdjson/generic/ondemand/token_iterator-inl.h for lasx */ -/* including simdjson/generic/ondemand/value_iterator-inl.h for lasx: #include "simdjson/generic/ondemand/value_iterator-inl.h" */ -/* begin file simdjson/generic/ondemand/value_iterator-inl.h for lasx */ +/* end file simdjson/generic/ondemand/token_iterator-inl.h for rvv_vls */ +/* including simdjson/generic/ondemand/value_iterator-inl.h for rvv_vls: #include "simdjson/generic/ondemand/value_iterator-inl.h" */ +/* begin file simdjson/generic/ondemand/value_iterator-inl.h for rvv_vls */ #ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -150038,7 +181705,7 @@ simdjson_inline simdjson_result<lasx::ondemand::token_iterator>::simdjson_result /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace ondemand { simdjson_inline value_iterator::value_iterator( @@ -150120,7 +181787,6 @@ simdjson_warn_unused simdjson_inline error_code value_iterator::end_container() simdjson_warn_unused simdjson_inline simdjson_result<bool> value_iterator::has_next_field() noexcept { assert_at_next(); - // It's illegal to call this unless there are more tokens: anything that ends in } or ] is // obligated to verify there are more tokens if they are not the top level. switch (*_json_iter->return_current_and_advance()) { @@ -150542,9 +182208,13 @@ simdjson_warn_unused simdjson_inline simdjson_result<std::string_view> value_ite template <typename string_type> simdjson_warn_unused simdjson_inline error_code value_iterator::get_string(string_type& receiver, bool allow_replacement) noexcept { std::string_view content; + // Save the string buffer location so that we can restore it after get_string + auto saved_string_buf_loc = _json_iter->string_buf_loc(); auto err = get_string(allow_replacement).get(content); if (err) { return err; } receiver = content; + // Restore the string buffer location, effectively discarding any temporary string storage + _json_iter->string_buf_loc() = saved_string_buf_loc; return SUCCESS; } simdjson_warn_unused simdjson_inline simdjson_result<std::string_view> value_iterator::get_wobbly_string() noexcept { @@ -150632,7 +182302,7 @@ simdjson_inline simdjson_result<bool> value_iterator::is_root_integer(bool check return answer; } -simdjson_inline simdjson_result<lasx::number_type> value_iterator::get_root_number_type(bool check_trailing) noexcept { +simdjson_inline simdjson_result<rvv_vls::number_type> value_iterator::get_root_number_type(bool check_trailing) noexcept { auto max_len = peek_root_length(); auto json = peek_root_scalar("number"); // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/, @@ -150684,9 +182354,13 @@ simdjson_warn_unused simdjson_inline simdjson_result<std::string_view> value_ite template <typename string_type> simdjson_warn_unused simdjson_inline error_code value_iterator::get_root_string(string_type& receiver, bool check_trailing, bool allow_replacement) noexcept { std::string_view content; + // Save the string buffer location so that we can restore it after get_string + auto saved_string_buf_loc = _json_iter->string_buf_loc(); auto err = get_root_string(check_trailing, allow_replacement).get(content); if (err) { return err; } receiver = content; + // Restore the string buffer location, effectively discarding any temporary string storage + _json_iter->string_buf_loc() = saved_string_buf_loc; return SUCCESS; } simdjson_warn_unused simdjson_inline simdjson_result<std::string_view> value_iterator::get_root_wobbly_string(bool check_trailing) noexcept { @@ -150717,1507 +182391,657 @@ simdjson_warn_unused simdjson_inline simdjson_result<uint64_t> value_iterator::g } simdjson_warn_unused simdjson_inline simdjson_result<uint64_t> value_iterator::get_root_uint64_in_string(bool check_trailing) noexcept { auto max_len = peek_root_length(); - auto json = peek_root_scalar("uint64"); - uint8_t tmpbuf[20+1+1]{}; // <20 digits> is the longest possible unsigned integer - tmpbuf[20+1] = '\0'; // make sure that buffer is always null terminated. - if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 20+1)) { - logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 20 characters"); - return NUMBER_ERROR; - } - auto result = numberparsing::parse_unsigned_in_string(tmpbuf); - if(result.error() == SUCCESS) { - if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } - advance_root_scalar("uint64"); - } - return result; -} -simdjson_warn_unused simdjson_inline simdjson_result<int64_t> value_iterator::get_root_int64(bool check_trailing) noexcept { - auto max_len = peek_root_length(); - auto json = peek_root_scalar("int64"); - uint8_t tmpbuf[20+1+1]; // -<19 digits> is the longest possible integer - tmpbuf[20+1] = '\0'; // make sure that buffer is always null terminated. - if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 20+1)) { - logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 20 characters"); - return NUMBER_ERROR; - } - - auto result = numberparsing::parse_integer(tmpbuf); - if(result.error() == SUCCESS) { - if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } - advance_root_scalar("int64"); - } - return result; -} -simdjson_warn_unused simdjson_inline simdjson_result<int64_t> value_iterator::get_root_int64_in_string(bool check_trailing) noexcept { - auto max_len = peek_root_length(); - auto json = peek_root_scalar("int64"); - uint8_t tmpbuf[20+1+1]; // -<19 digits> is the longest possible integer - tmpbuf[20+1] = '\0'; // make sure that buffer is always null terminated. - if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 20+1)) { - logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 20 characters"); - return NUMBER_ERROR; - } - - auto result = numberparsing::parse_integer_in_string(tmpbuf); - if(result.error() == SUCCESS) { - if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } - advance_root_scalar("int64"); - } - return result; -} -simdjson_warn_unused simdjson_inline simdjson_result<double> value_iterator::get_root_double(bool check_trailing) noexcept { - auto max_len = peek_root_length(); - auto json = peek_root_scalar("double"); - // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/, - // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest - // number: -0.<fraction>e-308. - uint8_t tmpbuf[1074+8+1+1]; // +1 for null termination. - tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated. - if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) { - logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters"); - return NUMBER_ERROR; - } - auto result = numberparsing::parse_double(tmpbuf); - if(result.error() == SUCCESS) { - if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } - advance_root_scalar("double"); - } - return result; -} - -simdjson_warn_unused simdjson_inline simdjson_result<double> value_iterator::get_root_double_in_string(bool check_trailing) noexcept { - auto max_len = peek_root_length(); - auto json = peek_root_scalar("double"); - // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/, - // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest - // number: -0.<fraction>e-308. - uint8_t tmpbuf[1074+8+1+1]; // +1 for null termination. - tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated. - if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) { - logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters"); - return NUMBER_ERROR; - } - auto result = numberparsing::parse_double_in_string(tmpbuf); - if(result.error() == SUCCESS) { - if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } - advance_root_scalar("double"); - } - return result; -} - -simdjson_warn_unused simdjson_inline simdjson_result<bool> value_iterator::get_root_bool(bool check_trailing) noexcept { - auto max_len = peek_root_length(); - auto json = peek_root_scalar("bool"); - // We have a boolean if we have either "true" or "false" and the next character is either - // a structural character or whitespace. We also check that the length is correct: - // "true" and "false" are 4 and 5 characters long, respectively. - bool value_true = (max_len >= 4 && !atomparsing::str4ncmp(json, "true") && - (max_len == 4 || jsoncharutils::is_structural_or_whitespace(json[4]))); - bool value_false = (max_len >= 5 && !atomparsing::str4ncmp(json, "false") && - (max_len == 5 || jsoncharutils::is_structural_or_whitespace(json[5]))); - if(value_true == false && value_false == false) { return incorrect_type_error("Not a boolean"); } - if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } - advance_root_scalar("bool"); - return value_true; -} - -simdjson_inline simdjson_result<bool> value_iterator::is_root_null(bool check_trailing) noexcept { - auto max_len = peek_root_length(); - auto json = peek_root_scalar("null"); - bool result = (max_len >= 4 && !atomparsing::str4ncmp(json, "null") && - (max_len == 4 || jsoncharutils::is_structural_or_whitespace(json[4]))); - if(result) { // we have something that looks like a null. - if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } - advance_root_scalar("null"); - } else if (json[0] == 'n') { - return incorrect_type_error("Not a null but starts with n"); - } - return result; -} - -simdjson_warn_unused simdjson_inline error_code value_iterator::skip_child() noexcept { - SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); - SIMDJSON_ASSUME( _json_iter->_depth >= _depth ); - - return _json_iter->skip_child(depth()); -} - -simdjson_inline value_iterator value_iterator::child() const noexcept { - assert_at_child(); - return { _json_iter, depth()+1, _json_iter->token.position() }; -} - -// GCC 7 warns when the first line of this function is inlined away into oblivion due to the caller -// relating depth and iterator depth, which is a desired effect. It does not happen if is_open is -// marked non-inline. -SIMDJSON_PUSH_DISABLE_WARNINGS -SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING -simdjson_inline bool value_iterator::is_open() const noexcept { - return _json_iter->depth() >= depth(); -} -SIMDJSON_POP_DISABLE_WARNINGS - -simdjson_inline bool value_iterator::at_end() const noexcept { - return _json_iter->at_end(); -} - -simdjson_inline bool value_iterator::at_start() const noexcept { - return _json_iter->token.position() == start_position(); -} - -simdjson_inline bool value_iterator::at_first_field() const noexcept { - SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); - return _json_iter->token.position() == start_position() + 1; -} - -simdjson_inline void value_iterator::abandon() noexcept { - _json_iter->abandon(); -} - -simdjson_warn_unused simdjson_inline depth_t value_iterator::depth() const noexcept { - return _depth; -} -simdjson_warn_unused simdjson_inline error_code value_iterator::error() const noexcept { - return _json_iter->error; -} -simdjson_warn_unused simdjson_inline uint8_t *&value_iterator::string_buf_loc() noexcept { - return _json_iter->string_buf_loc(); -} -simdjson_warn_unused simdjson_inline const json_iterator &value_iterator::json_iter() const noexcept { - return *_json_iter; -} -simdjson_warn_unused simdjson_inline json_iterator &value_iterator::json_iter() noexcept { - return *_json_iter; -} - -simdjson_inline const uint8_t *value_iterator::peek_start() const noexcept { - return _json_iter->peek(start_position()); -} -simdjson_inline uint32_t value_iterator::peek_start_length() const noexcept { - return _json_iter->peek_length(start_position()); -} -simdjson_inline uint32_t value_iterator::peek_root_length() const noexcept { - return _json_iter->peek_root_length(start_position()); -} - -simdjson_inline const uint8_t *value_iterator::peek_scalar(const char *type) noexcept { - logger::log_value(*_json_iter, start_position(), depth(), type); - // If we're not at the position anymore, we don't want to advance the cursor. - if (!is_at_start()) { return peek_start(); } - - // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value. - assert_at_start(); - return _json_iter->peek(); -} - -simdjson_inline void value_iterator::advance_scalar(const char *type) noexcept { - logger::log_value(*_json_iter, start_position(), depth(), type); - // If we're not at the position anymore, we don't want to advance the cursor. - if (!is_at_start()) { return; } - - // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value. - assert_at_start(); - _json_iter->return_current_and_advance(); - _json_iter->ascend_to(depth()-1); -} - -simdjson_warn_unused simdjson_inline error_code value_iterator::start_container(uint8_t start_char, const char *incorrect_type_message, const char *type) noexcept { - logger::log_start_value(*_json_iter, start_position(), depth(), type); - // If we're not at the position anymore, we don't want to advance the cursor. - const uint8_t *json; - if (!is_at_start()) { -#if SIMDJSON_DEVELOPMENT_CHECKS - if (!is_at_iterator_start()) { return OUT_OF_ORDER_ITERATION; } -#endif - json = peek_start(); - if (*json != start_char) { return incorrect_type_error(incorrect_type_message); } - } else { - assert_at_start(); - /** - * We should be prudent. Let us peek. If it is not the right type, we - * return an error. Only once we have determined that we have the right - * type are we allowed to advance! - */ - json = _json_iter->peek(); - if (*json != start_char) { return incorrect_type_error(incorrect_type_message); } - _json_iter->return_current_and_advance(); - } - - - return SUCCESS; -} - - -simdjson_inline const uint8_t *value_iterator::peek_root_scalar(const char *type) noexcept { - logger::log_value(*_json_iter, start_position(), depth(), type); - if (!is_at_start()) { return peek_start(); } - - assert_at_root(); - return _json_iter->peek(); -} -simdjson_inline const uint8_t *value_iterator::peek_non_root_scalar(const char *type) noexcept { - logger::log_value(*_json_iter, start_position(), depth(), type); - if (!is_at_start()) { return peek_start(); } - - assert_at_non_root_start(); - return _json_iter->peek(); -} - -simdjson_inline void value_iterator::advance_root_scalar(const char *type) noexcept { - logger::log_value(*_json_iter, start_position(), depth(), type); - if (!is_at_start()) { return; } - - assert_at_root(); - _json_iter->return_current_and_advance(); - _json_iter->ascend_to(depth()-1); -} -simdjson_inline void value_iterator::advance_non_root_scalar(const char *type) noexcept { - logger::log_value(*_json_iter, start_position(), depth(), type); - if (!is_at_start()) { return; } - - assert_at_non_root_start(); - _json_iter->return_current_and_advance(); - _json_iter->ascend_to(depth()-1); -} - -simdjson_inline error_code value_iterator::incorrect_type_error(const char *message) const noexcept { - logger::log_error(*_json_iter, start_position(), depth(), message); - return INCORRECT_TYPE; -} - -simdjson_inline bool value_iterator::is_at_start() const noexcept { - return position() == start_position(); -} - -simdjson_inline bool value_iterator::is_at_key() const noexcept { - // Keys are at the same depth as the object. - // Note here that we could be safer and check that we are within an object, - // but we do not. - return _depth == _json_iter->_depth && *_json_iter->peek() == '"'; -} - -simdjson_inline bool value_iterator::is_at_iterator_start() const noexcept { - // We can legitimately be either at the first value ([1]), or after the array if it's empty ([]). - auto delta = position() - start_position(); - return delta == 1 || delta == 2; -} - -inline void value_iterator::assert_at_start() const noexcept { - SIMDJSON_ASSUME( _json_iter->token._position == _start_position ); - SIMDJSON_ASSUME( _json_iter->_depth == _depth ); - SIMDJSON_ASSUME( _depth > 0 ); -} - -inline void value_iterator::assert_at_container_start() const noexcept { - SIMDJSON_ASSUME( _json_iter->token._position == _start_position + 1 ); - SIMDJSON_ASSUME( _json_iter->_depth == _depth ); - SIMDJSON_ASSUME( _depth > 0 ); -} - -inline void value_iterator::assert_at_next() const noexcept { - SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); - SIMDJSON_ASSUME( _json_iter->_depth == _depth ); - SIMDJSON_ASSUME( _depth > 0 ); -} - -simdjson_inline void value_iterator::move_at_start() noexcept { - _json_iter->_depth = _depth; - _json_iter->token.set_position(_start_position); -} - -simdjson_inline void value_iterator::move_at_container_start() noexcept { - _json_iter->_depth = _depth; - _json_iter->token.set_position(_start_position + 1); -} - -simdjson_inline simdjson_result<bool> value_iterator::reset_array() noexcept { - if(error()) { return error(); } - move_at_container_start(); - return started_array(); -} - -simdjson_inline simdjson_result<bool> value_iterator::reset_object() noexcept { - if(error()) { return error(); } - move_at_container_start(); - return started_object(); -} - -inline void value_iterator::assert_at_child() const noexcept { - SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); - SIMDJSON_ASSUME( _json_iter->_depth == _depth + 1 ); - SIMDJSON_ASSUME( _depth > 0 ); -} - -inline void value_iterator::assert_at_root() const noexcept { - assert_at_start(); - SIMDJSON_ASSUME( _depth == 1 ); -} - -inline void value_iterator::assert_at_non_root_start() const noexcept { - assert_at_start(); - SIMDJSON_ASSUME( _depth > 1 ); -} - -inline void value_iterator::assert_is_valid() const noexcept { - SIMDJSON_ASSUME( _json_iter != nullptr ); -} - -simdjson_inline bool value_iterator::is_valid() const noexcept { - return _json_iter != nullptr; -} - -simdjson_inline simdjson_result<json_type> value_iterator::type() const noexcept { - switch (*peek_start()) { - case '{': - return json_type::object; - case '[': - return json_type::array; - case '"': - return json_type::string; - case 'n': - return json_type::null; - case 't': case 'f': - return json_type::boolean; - case '-': - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - return json_type::number; - default: - return json_type::unknown; - } -} - -simdjson_inline token_position value_iterator::start_position() const noexcept { - return _start_position; -} - -simdjson_inline token_position value_iterator::position() const noexcept { - return _json_iter->position(); -} - -simdjson_inline token_position value_iterator::end_position() const noexcept { - return _json_iter->end_position(); -} - -simdjson_inline token_position value_iterator::last_position() const noexcept { - return _json_iter->last_position(); -} - -simdjson_inline error_code value_iterator::report_error(error_code error, const char *message) noexcept { - return _json_iter->report_error(error, message); -} - -} // namespace ondemand -} // namespace lasx -} // namespace simdjson - -namespace simdjson { - -simdjson_inline simdjson_result<lasx::ondemand::value_iterator>::simdjson_result(lasx::ondemand::value_iterator &&value) noexcept - : implementation_simdjson_result_base<lasx::ondemand::value_iterator>(std::forward<lasx::ondemand::value_iterator>(value)) {} -simdjson_inline simdjson_result<lasx::ondemand::value_iterator>::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base<lasx::ondemand::value_iterator>(error) {} - -} // namespace simdjson - -#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H -/* end file simdjson/generic/ondemand/value_iterator-inl.h for lasx */ - -// JSON builder inline definitions -/* including simdjson/generic/ondemand/json_string_builder-inl.h for lasx: #include "simdjson/generic/ondemand/json_string_builder-inl.h" */ -/* begin file simdjson/generic/ondemand/json_string_builder-inl.h for lasx */ -/** - * This file is part of the builder API. It is temporarily in the ondemand - * directory but we will move it to a builder directory later. - */ -#include <array> -#include <cstring> -#include <type_traits> -#ifndef SIMDJSON_GENERIC_STRING_BUILDER_INL_H - -/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_INL_H */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_string_builder.h" */ -/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ - -/* - * Empirically, we have found that an inlined optimization is important for - * performance. The following macros are not ideal. We should find a better - * way to inline the code. - */ - -#if defined(__SSE2__) || defined(__x86_64__) || defined(__x86_64) || \ - (defined(_M_AMD64) || defined(_M_X64) || \ - (defined(_M_IX86_FP) && _M_IX86_FP == 2)) -#ifndef SIMDJSON_EXPERIMENTAL_HAS_SSE2 -#define SIMDJSON_EXPERIMENTAL_HAS_SSE2 1 -#endif -#endif - -#if defined(__aarch64__) || defined(_M_ARM64) -#ifndef SIMDJSON_EXPERIMENTAL_HAS_NEON -#define SIMDJSON_EXPERIMENTAL_HAS_NEON 1 -#endif -#endif -#if SIMDJSON_EXPERIMENTAL_HAS_NEON -#include <arm_neon.h> -#endif -#if SIMDJSON_EXPERIMENTAL_HAS_SSE2 -#include <emmintrin.h> -#endif - -namespace simdjson { -namespace lasx { -namespace builder { - -static SIMDJSON_CONSTEXPR_LAMBDA std::array<uint8_t, 256> - json_quotable_character = { - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - -/** - -A possible SWAR implementation of has_json_escapable_byte. It is not used -because it is slower than the current implementation. It is kept here for -reference (to show that we tried it). - -inline bool has_json_escapable_byte(uint64_t x) { - uint64_t is_ascii = 0x8080808080808080ULL & ~x; - uint64_t xor2 = x ^ 0x0202020202020202ULL; - uint64_t lt32_or_eq34 = xor2 - 0x2121212121212121ULL; - uint64_t sub92 = x ^ 0x5C5C5C5C5C5C5C5CULL; - uint64_t eq92 = (sub92 - 0x0101010101010101ULL); - return ((lt32_or_eq34 | eq92) & is_ascii) != 0; -} - -**/ - -SIMDJSON_CONSTEXPR_LAMBDA simdjson_inline bool -simple_needs_escaping(std::string_view v) { - for (char c : v) { - // a table lookup is faster than a series of comparisons - if (json_quotable_character[static_cast<uint8_t>(c)]) { - return true; - } - } - return false; -} - -#if SIMDJSON_EXPERIMENTAL_HAS_NEON -simdjson_inline bool fast_needs_escaping(std::string_view view) { - if (view.size() < 16) { - return simple_needs_escaping(view); - } - size_t i = 0; - uint8x16_t running = vdupq_n_u8(0); - uint8x16_t v34 = vdupq_n_u8(34); - uint8x16_t v92 = vdupq_n_u8(92); - - for (; i + 15 < view.size(); i += 16) { - uint8x16_t word = vld1q_u8((const uint8_t *)view.data() + i); - running = vorrq_u8(running, vceqq_u8(word, v34)); - running = vorrq_u8(running, vceqq_u8(word, v92)); - running = vorrq_u8(running, vcltq_u8(word, vdupq_n_u8(32))); - } - if (i < view.size()) { - uint8x16_t word = - vld1q_u8((const uint8_t *)view.data() + view.length() - 16); - running = vorrq_u8(running, vceqq_u8(word, v34)); - running = vorrq_u8(running, vceqq_u8(word, v92)); - running = vorrq_u8(running, vcltq_u8(word, vdupq_n_u8(32))); - } - return vmaxvq_u32(vreinterpretq_u32_u8(running)) != 0; -} -#elif SIMDJSON_EXPERIMENTAL_HAS_SSE2 -simdjson_inline bool fast_needs_escaping(std::string_view view) { - if (view.size() < 16) { - return simple_needs_escaping(view); - } - size_t i = 0; - __m128i running = _mm_setzero_si128(); - for (; i + 15 < view.size(); i += 16) { - - __m128i word = - _mm_loadu_si128(reinterpret_cast<const __m128i *>(view.data() + i)); - running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(34))); - running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(92))); - running = _mm_or_si128( - running, _mm_cmpeq_epi8(_mm_subs_epu8(word, _mm_set1_epi8(31)), - _mm_setzero_si128())); - } - if (i < view.size()) { - __m128i word = _mm_loadu_si128( - reinterpret_cast<const __m128i *>(view.data() + view.length() - 16)); - running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(34))); - running = _mm_or_si128(running, _mm_cmpeq_epi8(word, _mm_set1_epi8(92))); - running = _mm_or_si128( - running, _mm_cmpeq_epi8(_mm_subs_epu8(word, _mm_set1_epi8(31)), - _mm_setzero_si128())); - } - return _mm_movemask_epi8(running) != 0; -} -#else -simdjson_inline bool fast_needs_escaping(std::string_view view) { - return simple_needs_escaping(view); -} -#endif - -SIMDJSON_CONSTEXPR_LAMBDA inline size_t -find_next_json_quotable_character(const std::string_view view, - size_t location) noexcept { - - for (auto pos = view.begin() + location; pos != view.end(); ++pos) { - if (json_quotable_character[static_cast<uint8_t>(*pos)]) { - return pos - view.begin(); - } - } - return size_t(view.size()); -} - -SIMDJSON_CONSTEXPR_LAMBDA static std::string_view control_chars[] = { - "\\u0000", "\\u0001", "\\u0002", "\\u0003", "\\u0004", "\\u0005", "\\u0006", - "\\u0007", "\\b", "\\t", "\\n", "\\u000b", "\\f", "\\r", - "\\u000e", "\\u000f", "\\u0010", "\\u0011", "\\u0012", "\\u0013", "\\u0014", - "\\u0015", "\\u0016", "\\u0017", "\\u0018", "\\u0019", "\\u001a", "\\u001b", - "\\u001c", "\\u001d", "\\u001e", "\\u001f"}; - -// All Unicode characters may be placed within the quotation marks, except for -// the characters that MUST be escaped: quotation mark, reverse solidus, and the -// control characters (U+0000 through U+001F). There are two-character sequence -// escape representations of some popular characters: -// \", \\, \b, \f, \n, \r, \t. -SIMDJSON_CONSTEXPR_LAMBDA void escape_json_char(char c, char *&out) { - if (c == '"') { - memcpy(out, "\\\"", 2); - out += 2; - } else if (c == '\\') { - memcpy(out, "\\\\", 2); - out += 2; - } else { - std::string_view v = control_chars[uint8_t(c)]; - memcpy(out, v.data(), v.size()); - out += v.size(); - } -} - -inline size_t write_string_escaped(const std::string_view input, char *out) { - size_t mysize = input.size(); - if (!fast_needs_escaping(input)) { // fast path! - memcpy(out, input.data(), input.size()); - return input.size(); - } - const char *const initout = out; - size_t location = find_next_json_quotable_character(input, 0); - memcpy(out, input.data(), location); - out += location; - escape_json_char(input[location], out); - location += 1; - while (location < mysize) { - size_t newlocation = find_next_json_quotable_character(input, location); - memcpy(out, input.data() + location, newlocation - location); - out += newlocation - location; - location = newlocation; - if (location == mysize) { - break; - } - escape_json_char(input[location], out); - location += 1; - } - return out - initout; -} - -simdjson_inline string_builder::string_builder(size_t initial_capacity) - : buffer(new(std::nothrow) char[initial_capacity]), position(0), - capacity(buffer.get() != nullptr ? initial_capacity : 0), - is_valid(buffer.get() != nullptr) {} - -simdjson_inline bool string_builder::capacity_check(size_t upcoming_bytes) { - // We use the convention that when is_valid is false, then the capacity and - // the position are 0. - // Most of the time, this function will return true. - if (simdjson_likely(upcoming_bytes <= capacity - position)) { - return true; - } - // check for overflow, most of the time there is no overflow - if (simdjson_likely(position + upcoming_bytes < position)) { - return false; - } - // We will rarely get here. - grow_buffer((std::max)(capacity * 2, position + upcoming_bytes)); - // If the buffer allocation failed, we set is_valid to false. - return is_valid; -} - -simdjson_inline void string_builder::grow_buffer(size_t desired_capacity) { - if (!is_valid) { - return; - } - std::unique_ptr<char[]> new_buffer(new (std::nothrow) char[desired_capacity]); - if (new_buffer.get() == nullptr) { - set_valid(false); - return; - } - std::memcpy(new_buffer.get(), buffer.get(), position); - buffer.swap(new_buffer); - capacity = desired_capacity; -} - -simdjson_inline void string_builder::set_valid(bool valid) noexcept { - if (!valid) { - is_valid = false; - capacity = 0; - position = 0; - buffer.reset(); - } else { - is_valid = true; - } -} - -simdjson_inline size_t string_builder::size() const noexcept { - return position; -} - -simdjson_inline void string_builder::append(char c) noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = c; - } -} - -simdjson_inline void string_builder::append_null() noexcept { - constexpr char null_literal[] = "null"; - constexpr size_t null_len = sizeof(null_literal) - 1; - if (capacity_check(null_len)) { - std::memcpy(buffer.get() + position, null_literal, null_len); - position += null_len; - } -} - -simdjson_inline void string_builder::clear() noexcept { - position = 0; - // if it was invalid, we should try to repair it - if (!is_valid) { - capacity = 0; - buffer.reset(); - is_valid = true; - } -} - -namespace internal { - -template <typename number_type, typename = typename std::enable_if< - std::is_unsigned<number_type>::value>::type> -simdjson_really_inline int int_log2(number_type x) { - return 63 - leading_zeroes(uint64_t(x) | 1); -} - -simdjson_really_inline int fast_digit_count_32(uint32_t x) { - static uint64_t table[] = { - 4294967296, 8589934582, 8589934582, 8589934582, 12884901788, - 12884901788, 12884901788, 17179868184, 17179868184, 17179868184, - 21474826480, 21474826480, 21474826480, 21474826480, 25769703776, - 25769703776, 25769703776, 30063771072, 30063771072, 30063771072, - 34349738368, 34349738368, 34349738368, 34349738368, 38554705664, - 38554705664, 38554705664, 41949672960, 41949672960, 41949672960, - 42949672960, 42949672960}; - return uint32_t((x + table[int_log2(x)]) >> 32); -} - -simdjson_really_inline int fast_digit_count_64(uint64_t x) { - static uint64_t table[] = {9, - 99, - 999, - 9999, - 99999, - 999999, - 9999999, - 99999999, - 999999999, - 9999999999, - 99999999999, - 999999999999, - 9999999999999, - 99999999999999, - 999999999999999ULL, - 9999999999999999ULL, - 99999999999999999ULL, - 999999999999999999ULL, - 9999999999999999999ULL}; - int y = (19 * int_log2(x) >> 6); - y += x > table[y]; - return y + 1; -} - -template <typename number_type, typename = typename std::enable_if< - std::is_unsigned<number_type>::value>::type> -simdjson_really_inline size_t digit_count(number_type v) noexcept { - static_assert(sizeof(number_type) == 8 || sizeof(number_type) == 4 || - sizeof(number_type) == 2 || sizeof(number_type) == 1, - "We only support 8-bit, 16-bit, 32-bit and 64-bit numbers"); - SIMDJSON_IF_CONSTEXPR(sizeof(number_type) <= 4) { - return fast_digit_count_32(static_cast<uint32_t>(v)); - } - else { - return fast_digit_count_64(static_cast<uint64_t>(v)); - } -} -static const char decimal_table[200] = { - 0x30, 0x30, 0x30, 0x31, 0x30, 0x32, 0x30, 0x33, 0x30, 0x34, 0x30, 0x35, - 0x30, 0x36, 0x30, 0x37, 0x30, 0x38, 0x30, 0x39, 0x31, 0x30, 0x31, 0x31, - 0x31, 0x32, 0x31, 0x33, 0x31, 0x34, 0x31, 0x35, 0x31, 0x36, 0x31, 0x37, - 0x31, 0x38, 0x31, 0x39, 0x32, 0x30, 0x32, 0x31, 0x32, 0x32, 0x32, 0x33, - 0x32, 0x34, 0x32, 0x35, 0x32, 0x36, 0x32, 0x37, 0x32, 0x38, 0x32, 0x39, - 0x33, 0x30, 0x33, 0x31, 0x33, 0x32, 0x33, 0x33, 0x33, 0x34, 0x33, 0x35, - 0x33, 0x36, 0x33, 0x37, 0x33, 0x38, 0x33, 0x39, 0x34, 0x30, 0x34, 0x31, - 0x34, 0x32, 0x34, 0x33, 0x34, 0x34, 0x34, 0x35, 0x34, 0x36, 0x34, 0x37, - 0x34, 0x38, 0x34, 0x39, 0x35, 0x30, 0x35, 0x31, 0x35, 0x32, 0x35, 0x33, - 0x35, 0x34, 0x35, 0x35, 0x35, 0x36, 0x35, 0x37, 0x35, 0x38, 0x35, 0x39, - 0x36, 0x30, 0x36, 0x31, 0x36, 0x32, 0x36, 0x33, 0x36, 0x34, 0x36, 0x35, - 0x36, 0x36, 0x36, 0x37, 0x36, 0x38, 0x36, 0x39, 0x37, 0x30, 0x37, 0x31, - 0x37, 0x32, 0x37, 0x33, 0x37, 0x34, 0x37, 0x35, 0x37, 0x36, 0x37, 0x37, - 0x37, 0x38, 0x37, 0x39, 0x38, 0x30, 0x38, 0x31, 0x38, 0x32, 0x38, 0x33, - 0x38, 0x34, 0x38, 0x35, 0x38, 0x36, 0x38, 0x37, 0x38, 0x38, 0x38, 0x39, - 0x39, 0x30, 0x39, 0x31, 0x39, 0x32, 0x39, 0x33, 0x39, 0x34, 0x39, 0x35, - 0x39, 0x36, 0x39, 0x37, 0x39, 0x38, 0x39, 0x39, -}; -} // namespace internal - -template <typename number_type, typename> -simdjson_inline void string_builder::append(number_type v) noexcept { - static_assert(std::is_same<number_type, bool>::value || - std::is_integral<number_type>::value || - std::is_floating_point<number_type>::value, - "Unsupported number type"); - // If C++17 is available, we can 'if constexpr' here. - SIMDJSON_IF_CONSTEXPR(std::is_same<number_type, bool>::value) { - if (v) { - constexpr char true_literal[] = "true"; - constexpr size_t true_len = sizeof(true_literal) - 1; - if (capacity_check(true_len)) { - std::memcpy(buffer.get() + position, true_literal, true_len); - position += true_len; - } - } else { - constexpr char false_literal[] = "false"; - constexpr size_t false_len = sizeof(false_literal) - 1; - if (capacity_check(false_len)) { - std::memcpy(buffer.get() + position, false_literal, false_len); - position += false_len; - } - } - } - else SIMDJSON_IF_CONSTEXPR(std::is_unsigned<number_type>::value) { - constexpr size_t max_number_size = 20; - if (capacity_check(max_number_size)) { - using unsigned_type = typename std::make_unsigned<number_type>::type; - unsigned_type pv = static_cast<unsigned_type>(v); - size_t dc = internal::digit_count(pv); - char *write_pointer = buffer.get() + position + dc - 1; - while (pv >= 100) { - memcpy(write_pointer - 1, &internal::decimal_table[(pv % 100) * 2], 2); - write_pointer -= 2; - pv /= 100; - } - if (pv >= 10) { - *write_pointer-- = char('0' + (pv % 10)); - pv /= 10; - } - *write_pointer = char('0' + pv); - position += dc; - } - } - else SIMDJSON_IF_CONSTEXPR(std::is_integral<number_type>::value) { - constexpr size_t max_number_size = 20; - if (capacity_check(max_number_size)) { - using unsigned_type = typename std::make_unsigned<number_type>::type; - bool negative = v < 0; - unsigned_type pv = static_cast<unsigned_type>(v); - if (negative) { - pv = 0 - pv; // the 0 is for Microsoft - } - size_t dc = internal::digit_count(pv); - // by always writing the minus sign, we avoid the branch. - buffer.get()[position] = '-'; - position += negative ? 1 : 0; - char *write_pointer = buffer.get() + position + dc - 1; - while (pv >= 100) { - memcpy(write_pointer - 1, &internal::decimal_table[(pv % 100) * 2], 2); - write_pointer -= 2; - pv /= 100; - } - if (pv >= 10) { - *write_pointer-- = char('0' + (pv % 10)); - pv /= 10; - } - *write_pointer = char('0' + pv); - position += dc; - } - } - else SIMDJSON_IF_CONSTEXPR(std::is_floating_point<number_type>::value) { - constexpr size_t max_number_size = 24; - if (capacity_check(max_number_size)) { - // We could specialize for float. - char *end = simdjson::internal::to_chars(buffer.get() + position, nullptr, - double(v)); - position = end - buffer.get(); - } + auto json = peek_root_scalar("uint64"); + uint8_t tmpbuf[20+1+1]{}; // <20 digits> is the longest possible unsigned integer + tmpbuf[20+1] = '\0'; // make sure that buffer is always null terminated. + if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 20+1)) { + logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 20 characters"); + return NUMBER_ERROR; + } + auto result = numberparsing::parse_unsigned_in_string(tmpbuf); + if(result.error() == SUCCESS) { + if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } + advance_root_scalar("uint64"); } + return result; } +simdjson_warn_unused simdjson_inline simdjson_result<int64_t> value_iterator::get_root_int64(bool check_trailing) noexcept { + auto max_len = peek_root_length(); + auto json = peek_root_scalar("int64"); + uint8_t tmpbuf[20+1+1]; // -<19 digits> is the longest possible integer + tmpbuf[20+1] = '\0'; // make sure that buffer is always null terminated. + if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 20+1)) { + logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 20 characters"); + return NUMBER_ERROR; + } -simdjson_inline void -string_builder::escape_and_append(std::string_view input) noexcept { - // escaping might turn a control character into \x00xx so 6 characters. - if (capacity_check(6 * input.size())) { - position += write_string_escaped(input, buffer.get() + position); + auto result = numberparsing::parse_integer(tmpbuf); + if(result.error() == SUCCESS) { + if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } + advance_root_scalar("int64"); } + return result; } +simdjson_warn_unused simdjson_inline simdjson_result<int64_t> value_iterator::get_root_int64_in_string(bool check_trailing) noexcept { + auto max_len = peek_root_length(); + auto json = peek_root_scalar("int64"); + uint8_t tmpbuf[20+1+1]; // -<19 digits> is the longest possible integer + tmpbuf[20+1] = '\0'; // make sure that buffer is always null terminated. + if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 20+1)) { + logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 20 characters"); + return NUMBER_ERROR; + } -simdjson_inline void -string_builder::escape_and_append_with_quotes(std::string_view input) noexcept { - // escaping might turn a control character into \x00xx so 6 characters. - if (capacity_check(2 + 6 * input.size())) { - buffer.get()[position++] = '"'; - position += write_string_escaped(input, buffer.get() + position); - buffer.get()[position++] = '"'; + auto result = numberparsing::parse_integer_in_string(tmpbuf); + if(result.error() == SUCCESS) { + if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } + advance_root_scalar("int64"); } + return result; } - -simdjson_inline void -string_builder::escape_and_append_with_quotes(char input) noexcept { - // escaping might turn a control character into \x00xx so 6 characters. - if (capacity_check(2 + 6 * 1)) { - buffer.get()[position++] = '"'; - std::string_view cinput(&input, 1); - position += write_string_escaped(cinput, buffer.get() + position); - buffer.get()[position++] = '"'; +simdjson_warn_unused simdjson_inline simdjson_result<double> value_iterator::get_root_double(bool check_trailing) noexcept { + auto max_len = peek_root_length(); + auto json = peek_root_scalar("double"); + // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/, + // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest + // number: -0.<fraction>e-308. + uint8_t tmpbuf[1074+8+1+1]; // +1 for null termination. + tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated. + if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) { + logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters"); + return NUMBER_ERROR; } + auto result = numberparsing::parse_double(tmpbuf); + if(result.error() == SUCCESS) { + if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } + advance_root_scalar("double"); + } + return result; } -simdjson_inline void -string_builder::escape_and_append_with_quotes(const char *input) noexcept { - std::string_view cinput(input); - escape_and_append_with_quotes(cinput); -} -#if SIMDJSON_SUPPORTS_CONCEPTS -template <constevalutil::fixed_string key> -simdjson_inline void string_builder::escape_and_append_with_quotes() noexcept { - escape_and_append_with_quotes(constevalutil::string_constant<key>::value); +simdjson_warn_unused simdjson_inline simdjson_result<double> value_iterator::get_root_double_in_string(bool check_trailing) noexcept { + auto max_len = peek_root_length(); + auto json = peek_root_scalar("double"); + // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/, + // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest + // number: -0.<fraction>e-308. + uint8_t tmpbuf[1074+8+1+1]; // +1 for null termination. + tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated. + if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) { + logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters"); + return NUMBER_ERROR; + } + auto result = numberparsing::parse_double_in_string(tmpbuf); + if(result.error() == SUCCESS) { + if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } + advance_root_scalar("double"); + } + return result; } -#endif -simdjson_inline void string_builder::append_raw(const char *c) noexcept { - size_t len = std::strlen(c); - append_raw(c, len); +simdjson_warn_unused simdjson_inline simdjson_result<bool> value_iterator::get_root_bool(bool check_trailing) noexcept { + auto max_len = peek_root_length(); + auto json = peek_root_scalar("bool"); + // We have a boolean if we have either "true" or "false" and the next character is either + // a structural character or whitespace. We also check that the length is correct: + // "true" and "false" are 4 and 5 characters long, respectively. + bool value_true = (max_len >= 4 && !atomparsing::str4ncmp(json, "true") && + (max_len == 4 || jsoncharutils::is_structural_or_whitespace(json[4]))); + bool value_false = (max_len >= 5 && !atomparsing::str4ncmp(json, "false") && + (max_len == 5 || jsoncharutils::is_structural_or_whitespace(json[5]))); + if(value_true == false && value_false == false) { return incorrect_type_error("Not a boolean"); } + if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } + advance_root_scalar("bool"); + return value_true; } -simdjson_inline void -string_builder::append_raw(std::string_view input) noexcept { - if (capacity_check(input.size())) { - std::memcpy(buffer.get() + position, input.data(), input.size()); - position += input.size(); +simdjson_inline simdjson_result<bool> value_iterator::is_root_null(bool check_trailing) noexcept { + auto max_len = peek_root_length(); + auto json = peek_root_scalar("null"); + bool result = (max_len >= 4 && !atomparsing::str4ncmp(json, "null") && + (max_len == 4 || jsoncharutils::is_structural_or_whitespace(json[4]))); + if(result) { // we have something that looks like a null. + if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } + advance_root_scalar("null"); + } else if (json[0] == 'n') { + return incorrect_type_error("Not a null but starts with n"); } + return result; } -simdjson_inline void string_builder::append_raw(const char *str, - size_t len) noexcept { - if (capacity_check(len)) { - std::memcpy(buffer.get() + position, str, len); - position += len; - } +simdjson_warn_unused simdjson_inline error_code value_iterator::skip_child() noexcept { + SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); + SIMDJSON_ASSUME( _json_iter->_depth >= _depth ); + + return _json_iter->skip_child(depth()); } -#if SIMDJSON_SUPPORTS_CONCEPTS -// Support for optional types (std::optional, etc.) -template <concepts::optional_type T> - requires(!require_custom_serialization<T>) -simdjson_inline void string_builder::append(const T &opt) { - if (opt) { - append(*opt); - } else { - append_null(); - } + +simdjson_inline value_iterator value_iterator::child() const noexcept { + assert_at_child(); + return { _json_iter, depth()+1, _json_iter->token.position() }; } -template <typename T> - requires(require_custom_serialization<T>) -simdjson_inline void string_builder::append(T &&val) { - serialize(*this, std::forward<T>(val)); +// GCC 7 warns when the first line of this function is inlined away into oblivion due to the caller +// relating depth and iterator depth, which is a desired effect. It does not happen if is_open is +// marked non-inline. +SIMDJSON_PUSH_DISABLE_WARNINGS +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING +simdjson_inline bool value_iterator::is_open() const noexcept { + return _json_iter->depth() >= depth(); } +SIMDJSON_POP_DISABLE_WARNINGS -template <typename T> - requires(std::is_convertible<T, std::string_view>::value || - std::is_same<T, const char *>::value) -simdjson_inline void string_builder::append(const T &value) { - escape_and_append_with_quotes(value); +simdjson_inline bool value_iterator::at_end() const noexcept { + return _json_iter->at_end(); } -#endif -#if SIMDJSON_SUPPORTS_RANGES && SIMDJSON_SUPPORTS_CONCEPTS -// Support for range-based appending (std::ranges::view, etc.) -template <std::ranges::range R> - requires(!std::is_convertible<R, std::string_view>::value && !require_custom_serialization<R>) -simdjson_inline void string_builder::append(const R &range) noexcept { - auto it = std::ranges::begin(range); - auto end = std::ranges::end(range); - if constexpr (concepts::is_pair<std::ranges::range_value_t<R>>) { - start_object(); +simdjson_inline bool value_iterator::at_start() const noexcept { + return _json_iter->token.position() == start_position(); +} - if (it == end) { - end_object(); - return; // Handle empty range - } - // Append first item without leading comma - append_key_value(it->first, it->second); - ++it; +simdjson_inline bool value_iterator::at_first_field() const noexcept { + SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); + return _json_iter->token.position() == start_position() + 1; +} - // Append remaining items with preceding commas - for (; it != end; ++it) { - append_comma(); - append_key_value(it->first, it->second); - } - end_object(); - } else { - start_array(); - if (it == end) { - end_array(); - return; // Handle empty range - } +simdjson_inline void value_iterator::abandon() noexcept { + _json_iter->abandon(); +} - // Append first item without leading comma - append(*it); - ++it; +simdjson_warn_unused simdjson_inline depth_t value_iterator::depth() const noexcept { + return _depth; +} +simdjson_warn_unused simdjson_inline error_code value_iterator::error() const noexcept { + return _json_iter->error; +} +simdjson_warn_unused simdjson_inline uint8_t *&value_iterator::string_buf_loc() noexcept { + return _json_iter->string_buf_loc(); +} +simdjson_warn_unused simdjson_inline const json_iterator &value_iterator::json_iter() const noexcept { + return *_json_iter; +} +simdjson_warn_unused simdjson_inline json_iterator &value_iterator::json_iter() noexcept { + return *_json_iter; +} - // Append remaining items with preceding commas - for (; it != end; ++it) { - append_comma(); - append(*it); - } - end_array(); - } +simdjson_inline const uint8_t *value_iterator::peek_start() const noexcept { + return _json_iter->peek(start_position()); +} +simdjson_inline uint32_t value_iterator::peek_start_length() const noexcept { + return _json_iter->peek_length(start_position()); +} +simdjson_inline uint32_t value_iterator::peek_root_length() const noexcept { + return _json_iter->peek_root_length(start_position()); } -#endif +simdjson_inline const uint8_t *value_iterator::peek_scalar(const char *type) noexcept { + logger::log_value(*_json_iter, start_position(), depth(), type); + // If we're not at the position anymore, we don't want to advance the cursor. + if (!is_at_start()) { return peek_start(); } -#if SIMDJSON_EXCEPTIONS -simdjson_inline string_builder::operator std::string() const noexcept(false) { - return std::string(operator std::string_view()); + // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value. + assert_at_start(); + return _json_iter->peek(); } -simdjson_inline string_builder::operator std::string_view() const - noexcept(false) simdjson_lifetime_bound { - return view(); -} -#endif +simdjson_inline void value_iterator::advance_scalar(const char *type) noexcept { + logger::log_value(*_json_iter, start_position(), depth(), type); + // If we're not at the position anymore, we don't want to advance the cursor. + if (!is_at_start()) { return; } -simdjson_inline simdjson_result<std::string_view> -string_builder::view() const noexcept { - if (!is_valid) { - return simdjson::OUT_OF_CAPACITY; - } - return std::string_view(buffer.get(), position); + // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value. + assert_at_start(); + _json_iter->return_current_and_advance(); + _json_iter->ascend_to(depth()-1); } -simdjson_inline simdjson_result<const char *> string_builder::c_str() noexcept { - if (capacity_check(1)) { - buffer.get()[position] = '\0'; - return buffer.get(); +simdjson_warn_unused simdjson_inline error_code value_iterator::start_container(uint8_t start_char, const char *incorrect_type_message, const char *type) noexcept { + logger::log_start_value(*_json_iter, start_position(), depth(), type); + // If we're not at the position anymore, we don't want to advance the cursor. + const uint8_t *json; + if (!is_at_start()) { +#if SIMDJSON_DEVELOPMENT_CHECKS + if (!is_at_iterator_start()) { return OUT_OF_ORDER_ITERATION; } +#endif + json = peek_start(); + if (*json != start_char) { return incorrect_type_error(incorrect_type_message); } + } else { + assert_at_start(); + /** + * We should be prudent. Let us peek. If it is not the right type, we + * return an error. Only once we have determined that we have the right + * type are we allowed to advance! + */ + json = _json_iter->peek(); + if (*json != start_char) { return incorrect_type_error(incorrect_type_message); } + _json_iter->return_current_and_advance(); } - return simdjson::OUT_OF_CAPACITY; -} -simdjson_inline bool string_builder::validate_unicode() const noexcept { - return simdjson::validate_utf8(buffer.get(), position); + + return SUCCESS; } -simdjson_inline void string_builder::start_object() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = '{'; - } + +simdjson_inline const uint8_t *value_iterator::peek_root_scalar(const char *type) noexcept { + logger::log_value(*_json_iter, start_position(), depth(), type); + if (!is_at_start()) { return peek_start(); } + + assert_at_root(); + return _json_iter->peek(); } +simdjson_inline const uint8_t *value_iterator::peek_non_root_scalar(const char *type) noexcept { + logger::log_value(*_json_iter, start_position(), depth(), type); + if (!is_at_start()) { return peek_start(); } -simdjson_inline void string_builder::end_object() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = '}'; - } + assert_at_non_root_start(); + return _json_iter->peek(); } -simdjson_inline void string_builder::start_array() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = '['; - } +simdjson_inline void value_iterator::advance_root_scalar(const char *type) noexcept { + logger::log_value(*_json_iter, start_position(), depth(), type); + if (!is_at_start()) { return; } + + assert_at_root(); + _json_iter->return_current_and_advance(); + _json_iter->ascend_to(depth()-1); } +simdjson_inline void value_iterator::advance_non_root_scalar(const char *type) noexcept { + logger::log_value(*_json_iter, start_position(), depth(), type); + if (!is_at_start()) { return; } -simdjson_inline void string_builder::end_array() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = ']'; - } + assert_at_non_root_start(); + _json_iter->return_current_and_advance(); + _json_iter->ascend_to(depth()-1); } -simdjson_inline void string_builder::append_comma() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = ','; - } +simdjson_inline error_code value_iterator::incorrect_type_error(const char *message) const noexcept { + logger::log_error(*_json_iter, start_position(), depth(), message); + return INCORRECT_TYPE; } -simdjson_inline void string_builder::append_colon() noexcept { - if (capacity_check(1)) { - buffer.get()[position++] = ':'; - } +simdjson_inline bool value_iterator::is_at_start() const noexcept { + return position() == start_position(); } -template <typename key_type, typename value_type> -simdjson_inline void -string_builder::append_key_value(key_type key, value_type value) noexcept { - static_assert(std::is_same<key_type, const char *>::value || - std::is_convertible<key_type, std::string_view>::value, - "Unsupported key type"); - escape_and_append_with_quotes(key); - append_colon(); - SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, std::nullptr_t>::value) { - append_null(); - } - else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, char>::value) { - escape_and_append_with_quotes(value); - } - else SIMDJSON_IF_CONSTEXPR( - std::is_convertible<value_type, std::string_view>::value) { - escape_and_append_with_quotes(value); - } - else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, const char *>::value) { - escape_and_append_with_quotes(value); - } - else { - append(value); - } +simdjson_inline bool value_iterator::is_at_key() const noexcept { + // Keys are at the same depth as the object. + // Note here that we could be safer and check that we are within an object, + // but we do not. + // + // As long as we are at the object's depth, in a valid document, + // we will only ever be at { , : or the actual string key: ". + return _depth == _json_iter->_depth && *_json_iter->peek() == '"'; } -#if SIMDJSON_SUPPORTS_CONCEPTS -template <constevalutil::fixed_string key, typename value_type> -simdjson_inline void -string_builder::append_key_value(value_type value) noexcept { - escape_and_append_with_quotes<key>(); - append_colon(); - SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, std::nullptr_t>::value) { - append_null(); - } - else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, char>::value) { - escape_and_append_with_quotes(value); - } - else SIMDJSON_IF_CONSTEXPR( - std::is_convertible<value_type, std::string_view>::value) { - escape_and_append_with_quotes(value); - } - else SIMDJSON_IF_CONSTEXPR(std::is_same<value_type, const char *>::value) { - escape_and_append_with_quotes(value); - } - else { - append(value); - } +simdjson_inline bool value_iterator::is_at_iterator_start() const noexcept { + // We can legitimately be either at the first value ([1]), or after the array if it's empty ([]). + auto delta = position() - start_position(); + return delta == 1 || delta == 2; } -#endif -} // namespace builder -} // namespace lasx -} // namespace simdjson +inline void value_iterator::assert_at_start() const noexcept { + SIMDJSON_ASSUME( _json_iter->token._position == _start_position ); + SIMDJSON_ASSUME( _json_iter->_depth == _depth ); + SIMDJSON_ASSUME( _depth > 0 ); +} -#endif // SIMDJSON_GENERIC_STRING_BUILDER_INL_H -/* end file simdjson/generic/ondemand/json_string_builder-inl.h for lasx */ -/* including simdjson/generic/ondemand/json_builder.h for lasx: #include "simdjson/generic/ondemand/json_builder.h" */ -/* begin file simdjson/generic/ondemand/json_builder.h for lasx */ -/** - * This file is part of the builder API. It is temporarily in the ondemand directory - * but we will move it to a builder directory later. - */ -#ifndef SIMDJSON_GENERIC_BUILDER_H +inline void value_iterator::assert_at_container_start() const noexcept { + SIMDJSON_ASSUME( _json_iter->token._position == _start_position + 1 ); + SIMDJSON_ASSUME( _json_iter->_depth == _depth ); + SIMDJSON_ASSUME( _depth > 0 ); +} -/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_STRING_BUILDER_H */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_string_builder.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/concepts.h" */ -/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -#if SIMDJSON_STATIC_REFLECTION +inline void value_iterator::assert_at_next() const noexcept { + SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); + SIMDJSON_ASSUME( _json_iter->_depth == _depth ); + SIMDJSON_ASSUME( _depth > 0 ); +} -#include <charconv> -#include <cstring> -#include <meta> -#include <memory> -#include <optional> -#include <string_view> -#include <type_traits> -#include <utility> -// #include <static_reflection> // for std::define_static_string - header not available yet +simdjson_inline void value_iterator::move_at_start() noexcept { + _json_iter->_depth = _depth; + _json_iter->token.set_position(_start_position); +} -namespace simdjson { -namespace lasx { -namespace builder { +simdjson_inline void value_iterator::move_at_container_start() noexcept { + _json_iter->_depth = _depth; + _json_iter->token.set_position(_start_position + 1); +} -template <class T> - requires(concepts::container_but_not_string<T> && !require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &t) { - auto it = t.begin(); - auto end = t.end(); - if (it == end) { - b.append_raw("[]"); - return; - } - b.append('['); - atom(b, *it); - ++it; - for (; it != end; ++it) { - b.append(','); - atom(b, *it); - } - b.append(']'); +simdjson_inline simdjson_result<bool> value_iterator::reset_array() noexcept { + if(error()) { return error(); } + move_at_container_start(); + return started_array(); } -template <class T> - requires(std::is_same_v<T, std::string> || - std::is_same_v<T, std::string_view> || - std::is_same_v<T, const char *> || - std::is_same_v<T, char>) -constexpr void atom(string_builder &b, const T &t) { - b.escape_and_append_with_quotes(t); +simdjson_inline simdjson_result<bool> value_iterator::reset_object() noexcept { + if(error()) { return error(); } + move_at_container_start(); + return started_object(); } -template <concepts::string_view_keyed_map T> - requires(!require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &m) { - if (m.empty()) { - b.append_raw("{}"); - return; - } - b.append('{'); - bool first = true; - for (const auto& [key, value] : m) { - if (!first) { - b.append(','); - } - first = false; - // Keys must be convertible to string_view per the concept - b.escape_and_append_with_quotes(key); - b.append(':'); - atom(b, value); - } - b.append('}'); +inline void value_iterator::assert_at_child() const noexcept { + SIMDJSON_ASSUME( _json_iter->token._position > _start_position ); + SIMDJSON_ASSUME( _json_iter->_depth == _depth + 1 ); + SIMDJSON_ASSUME( _depth > 0 ); } +inline void value_iterator::assert_at_root() const noexcept { + assert_at_start(); + SIMDJSON_ASSUME( _depth == 1 ); +} -template<typename number_type, - typename = typename std::enable_if<std::is_arithmetic<number_type>::value && !std::is_same_v<number_type, char>>::type> -constexpr void atom(string_builder &b, const number_type t) { - b.append(t); +inline void value_iterator::assert_at_non_root_start() const noexcept { + assert_at_start(); + SIMDJSON_ASSUME( _depth > 1 ); } -template <class T> - requires(std::is_class_v<T> && !concepts::container_but_not_string<T> && - !concepts::string_view_keyed_map<T> && - !concepts::optional_type<T> && - !concepts::smart_pointer<T> && - !concepts::appendable_containers<T> && - !std::is_same_v<T, std::string> && - !std::is_same_v<T, std::string_view> && - !std::is_same_v<T, const char*> && - !std::is_same_v<T, char> && !require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &t) { - int i = 0; - b.append('{'); - template for (constexpr auto dm : std::define_static_array(std::meta::nonstatic_data_members_of(^^T, std::meta::access_context::unchecked()))) { - if (i != 0) - b.append(','); - constexpr auto key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(dm))); - b.append_raw(key); - b.append(':'); - atom(b, t.[:dm:]); - i++; - }; - b.append('}'); +inline void value_iterator::assert_is_valid() const noexcept { + SIMDJSON_ASSUME( _json_iter != nullptr ); } -// Support for optional types (std::optional, etc.) -template <concepts::optional_type T> - requires(!require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &opt) { - if (opt) { - atom(b, opt.value()); - } else { - b.append_raw("null"); - } +simdjson_inline bool value_iterator::is_valid() const noexcept { + return _json_iter != nullptr; } -// Support for smart pointers (std::unique_ptr, std::shared_ptr, etc.) -template <concepts::smart_pointer T> - requires(!require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &ptr) { - if (ptr) { - atom(b, *ptr); - } else { - b.append_raw("null"); +simdjson_inline simdjson_result<json_type> value_iterator::type() const noexcept { + switch (*peek_start()) { + case '{': + return json_type::object; + case '[': + return json_type::array; + case '"': + return json_type::string; + case 'n': + return json_type::null; + case 't': case 'f': + return json_type::boolean; + case '-': + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + return json_type::number; + default: + return json_type::unknown; } } -// Support for enums - serialize as string representation using expand approach from P2996R12 -template <typename T> - requires(std::is_enum_v<T> && !require_custom_serialization<T>) -void atom(string_builder &b, const T &e) { -#if SIMDJSON_STATIC_REFLECTION - constexpr auto enumerators = std::define_static_array(std::meta::enumerators_of(^^T)); - template for (constexpr auto enum_val : enumerators) { - constexpr auto enum_str = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(enum_val))); - if (e == [:enum_val:]) { - b.append_raw(enum_str); - return; - } - }; - // Fallback to integer if enum value not found - atom(b, static_cast<std::underlying_type_t<T>>(e)); -#else - // Fallback: serialize as integer if reflection not available - atom(b, static_cast<std::underlying_type_t<T>>(e)); -#endif +simdjson_inline token_position value_iterator::start_position() const noexcept { + return _start_position; } -// Support for appendable containers that don't have operator[] (sets, etc.) -template <concepts::appendable_containers T> - requires(!concepts::container_but_not_string<T> && !concepts::string_view_keyed_map<T> && - !concepts::optional_type<T> && !concepts::smart_pointer<T> && - !std::is_same_v<T, std::string> && - !std::is_same_v<T, std::string_view> && !std::is_same_v<T, const char*> && !require_custom_serialization<T>) -constexpr void atom(string_builder &b, const T &container) { - if (container.empty()) { - b.append_raw("[]"); - return; - } - b.append('['); - bool first = true; - for (const auto& item : container) { - if (!first) { - b.append(','); - } - first = false; - atom(b, item); - } - b.append(']'); +simdjson_inline token_position value_iterator::position() const noexcept { + return _json_iter->position(); } -// append functions that delegate to atom functions for primitive types -template <class T> - requires(std::is_arithmetic_v<T> && !std::is_same_v<T, char>) -void append(string_builder &b, const T &t) { - atom(b, t); +simdjson_inline token_position value_iterator::end_position() const noexcept { + return _json_iter->end_position(); } -template <class T> - requires(std::is_same_v<T, std::string> || - std::is_same_v<T, std::string_view> || - std::is_same_v<T, const char *> || - std::is_same_v<T, char>) -void append(string_builder &b, const T &t) { - atom(b, t); +simdjson_inline token_position value_iterator::last_position() const noexcept { + return _json_iter->last_position(); } -template <concepts::optional_type T> - requires(!require_custom_serialization<T>) -void append(string_builder &b, const T &t) { - atom(b, t); +simdjson_inline error_code value_iterator::report_error(error_code error, const char *message) noexcept { + return _json_iter->report_error(error, message); } -template <concepts::smart_pointer T> - requires(!require_custom_serialization<T>) -void append(string_builder &b, const T &t) { - atom(b, t); -} +} // namespace ondemand +} // namespace rvv_vls +} // namespace simdjson -template <concepts::appendable_containers T> - requires(!concepts::container_but_not_string<T> && !concepts::string_view_keyed_map<T> && - !concepts::optional_type<T> && !concepts::smart_pointer<T> && - !std::is_same_v<T, std::string> && - !std::is_same_v<T, std::string_view> && !std::is_same_v<T, const char*> && !require_custom_serialization<T>) -void append(string_builder &b, const T &t) { - atom(b, t); +namespace simdjson { + +simdjson_inline simdjson_result<rvv_vls::ondemand::value_iterator>::simdjson_result(rvv_vls::ondemand::value_iterator &&value) noexcept + : implementation_simdjson_result_base<rvv_vls::ondemand::value_iterator>(std::forward<rvv_vls::ondemand::value_iterator>(value)) {} +simdjson_inline simdjson_result<rvv_vls::ondemand::value_iterator>::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base<rvv_vls::ondemand::value_iterator>(error) {} + +} // namespace simdjson + +#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H +/* end file simdjson/generic/ondemand/value_iterator-inl.h for rvv_vls */ +/* including simdjson/generic/ondemand/serialization-inl.h for rvv_vls: #include "simdjson/generic/ondemand/serialization-inl.h" */ +/* begin file simdjson/generic/ondemand/serialization-inl.h for rvv_vls */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H + +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document-inl.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/serialization.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */ +/* amalgamation skipped (editor-only): #if SIMDJSON_STATIC_REFLECTION */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/builder/json_builder.h" */ +/* amalgamation skipped (editor-only): #endif */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { + +inline std::string_view trim(const std::string_view str) noexcept { + // We can almost surely do better by rolling our own find_first_not_of function. + size_t first = str.find_first_not_of(" \t\n\r"); + // If we have the empty string (just white space), then no trimming is possible, and + // we return the empty string_view. + if (std::string_view::npos == first) { return std::string_view(); } + size_t last = str.find_last_not_of(" \t\n\r"); + return str.substr(first, (last - first + 1)); } -template <concepts::string_view_keyed_map T> - requires(!require_custom_serialization<T>) -void append(string_builder &b, const T &t) { - atom(b, t); + +inline simdjson_result<std::string_view> to_json_string(rvv_vls::ondemand::document& x) noexcept { + std::string_view v; + auto error = x.raw_json().get(v); + if(error) {return error; } + return trim(v); } -// works for struct -template <class Z> - requires(std::is_class_v<Z> && !concepts::container_but_not_string<Z> && - !concepts::string_view_keyed_map<Z> && - !concepts::optional_type<Z> && - !concepts::smart_pointer<Z> && - !concepts::appendable_containers<Z> && - !std::is_same_v<Z, std::string> && - !std::is_same_v<Z, std::string_view> && - !std::is_same_v<Z, const char*> && - !std::is_same_v<Z, char> && !require_custom_serialization<Z>) -void append(string_builder &b, const Z &z) { - int i = 0; - b.append('{'); - template for (constexpr auto dm : std::define_static_array(std::meta::nonstatic_data_members_of(^^Z, std::meta::access_context::unchecked()))) { - if (i != 0) - b.append(','); - constexpr auto key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(dm))); - b.append_raw(key); - b.append(':'); - atom(b, z.[:dm:]); - i++; - }; - b.append('}'); +inline simdjson_result<std::string_view> to_json_string(rvv_vls::ondemand::document_reference& x) noexcept { + std::string_view v; + auto error = x.raw_json().get(v); + if(error) {return error; } + return trim(v); } -// works for container that have begin() and end() iterators -template <class Z> - requires(concepts::container_but_not_string<Z> && !require_custom_serialization<Z>) -void append(string_builder &b, const Z &z) { - auto it = z.begin(); - auto end = z.end(); - if (it == end) { - b.append_raw("[]"); - return; - } - b.append('['); - atom(b, *it); - ++it; - for (; it != end; ++it) { - b.append(','); - atom(b, *it); +inline simdjson_result<std::string_view> to_json_string(rvv_vls::ondemand::value& x) noexcept { + /** + * If we somehow receive a value that has already been consumed, + * then the following code could be in trouble. E.g., we create + * an array as needed, but if an array was already created, then + * it could be bad. + */ + using namespace rvv_vls::ondemand; + rvv_vls::ondemand::json_type t; + auto error = x.type().get(t); + if(error != SUCCESS) { return error; } + switch (t) + { + case json_type::array: + { + rvv_vls::ondemand::array array; + error = x.get_array().get(array); + if(error) { return error; } + return to_json_string(array); + } + case json_type::object: + { + rvv_vls::ondemand::object object; + error = x.get_object().get(object); + if(error) { return error; } + return to_json_string(object); + } + default: + return trim(x.raw_json_token()); } - b.append(']'); } -template <class Z> - requires (require_custom_serialization<Z>) -void append(string_builder &b, const Z &z) { - b.append(z); +inline simdjson_result<std::string_view> to_json_string(rvv_vls::ondemand::object& x) noexcept { + std::string_view v; + auto error = x.raw_json().get(v); + if(error) {return error; } + return trim(v); } - -template <class Z> -simdjson_warn_unused simdjson_result<std::string> to_json_string(const Z &z, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { - string_builder b(initial_capacity); - append(b, z); - std::string_view s; - if(auto e = b.view().get(s); e) { return e; } - return std::string(s); +inline simdjson_result<std::string_view> to_json_string(rvv_vls::ondemand::array& x) noexcept { + std::string_view v; + auto error = x.raw_json().get(v); + if(error) {return error; } + return trim(v); } -template <class Z> -simdjson_warn_unused simdjson_error to_json(const Z &z, std::string &s, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { - string_builder b(initial_capacity); - append(b, z); - std::string_view view; - if(auto e = b.view().get(view); e) { return e; } - s.assign(view); - return SUCCESS; +inline simdjson_result<std::string_view> to_json_string(simdjson_result<rvv_vls::ondemand::document> x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } -template <class Z> -string_builder& operator<<(string_builder& b, const Z& z) { - append(b, z); - return b; +inline simdjson_result<std::string_view> to_json_string(simdjson_result<rvv_vls::ondemand::document_reference> x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } -// extract_from: Serialize only specific fields from a struct to JSON -template<constevalutil::fixed_string... FieldNames, typename T> - requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) -void extract_from(string_builder &b, const T &obj) { - // Helper to check if a field name matches any of the requested fields - auto should_extract = [](std::string_view field_name) constexpr -> bool { - return ((FieldNames.view() == field_name) || ...); - }; - - b.append('{'); - bool first = true; - - // Iterate through all members of T using reflection - template for (constexpr auto mem : std::define_static_array( - std::meta::nonstatic_data_members_of(^^T, std::meta::access_context::unchecked()))) { - - if constexpr (std::meta::is_public(mem)) { - constexpr std::string_view key = std::define_static_string(std::meta::identifier_of(mem)); +inline simdjson_result<std::string_view> to_json_string(simdjson_result<rvv_vls::ondemand::value> x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); +} - // Only serialize this field if it's in our list of requested fields - if constexpr (should_extract(key)) { - if (!first) { - b.append(','); - } - first = false; +inline simdjson_result<std::string_view> to_json_string(simdjson_result<rvv_vls::ondemand::object> x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); +} - // Serialize the key - constexpr auto quoted_key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(mem))); - b.append_raw(quoted_key); - b.append(':'); +inline simdjson_result<std::string_view> to_json_string(simdjson_result<rvv_vls::ondemand::array> x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); +} +} // namespace simdjson - // Serialize the value - atom(b, obj.[:mem:]); - } - } - }; +namespace simdjson { namespace rvv_vls { namespace ondemand { - b.append('}'); +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::rvv_vls::ondemand::value x) { + std::string_view v; + auto error = simdjson::to_json_string(x).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + throw simdjson::simdjson_error(error); + } } - -template<constevalutil::fixed_string... FieldNames, typename T> - requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) -simdjson_warn_unused simdjson_result<std::string> extract_from(const T &obj, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { - string_builder b(initial_capacity); - extract_from<FieldNames...>(b, obj); - std::string_view s; - if(auto e = b.view().get(s); e) { return e; } - return std::string(s); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::rvv_vls::ondemand::value> x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); +} +#else +inline std::ostream& operator<<(std::ostream& out, simdjson::rvv_vls::ondemand::value x) { + std::string_view v; + auto error = simdjson::to_json_string(x).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + return (out << error); + } } +#endif -} // namespace builder -} // namespace lasx -// Alias the function template to 'to' in the global namespace -template <class Z> -simdjson_warn_unused simdjson_result<std::string> to_json(const Z &z, size_t initial_capacity = lasx::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { - lasx::builder::string_builder b(initial_capacity); - lasx::builder::append(b, z); - std::string_view s; - if(auto e = b.view().get(s); e) { return e; } - return std::string(s); +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::rvv_vls::ondemand::array value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + throw simdjson::simdjson_error(error); + } } -template <class Z> -simdjson_warn_unused simdjson_error to_json(const Z &z, std::string &s, size_t initial_capacity = lasx::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { - lasx::builder::string_builder b(initial_capacity); - lasx::builder::append(b, z); - std::string_view view; - if(auto e = b.view().get(view); e) { return e; } - s.assign(view); - return SUCCESS; +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::rvv_vls::ondemand::array> x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); } -// Global namespace function for extract_from -template<constevalutil::fixed_string... FieldNames, typename T> - requires(std::is_class_v<T> && (sizeof...(FieldNames) > 0)) -simdjson_warn_unused simdjson_result<std::string> extract_from(const T &obj, size_t initial_capacity = lasx::builder::string_builder::DEFAULT_INITIAL_CAPACITY) { - lasx::builder::string_builder b(initial_capacity); - lasx::builder::extract_from<FieldNames...>(b, obj); - std::string_view s; - if(auto e = b.view().get(s); e) { return e; } - return std::string(s); +#else +inline std::ostream& operator<<(std::ostream& out, simdjson::rvv_vls::ondemand::array value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + return (out << error); + } } +#endif -} // namespace simdjson - -#endif // SIMDJSON_STATIC_REFLECTION +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::rvv_vls::ondemand::document& value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + throw simdjson::simdjson_error(error); + } +} +inline std::ostream& operator<<(std::ostream& out, simdjson::rvv_vls::ondemand::document_reference& value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + throw simdjson::simdjson_error(error); + } +} +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::rvv_vls::ondemand::document>&& x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); +} +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::rvv_vls::ondemand::document_reference>&& x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); +} +#else +inline std::ostream& operator<<(std::ostream& out, simdjson::rvv_vls::ondemand::document& value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + return (out << error); + } +} +#endif +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::rvv_vls::ondemand::object value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + throw simdjson::simdjson_error(error); + } +} +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::rvv_vls::ondemand::object> x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); +} +#else +inline std::ostream& operator<<(std::ostream& out, simdjson::rvv_vls::ondemand::object value) { + std::string_view v; + auto error = simdjson::to_json_string(value).get(v); + if(error == simdjson::SUCCESS) { + return (out << v); + } else { + return (out << error); + } +} #endif -/* end file simdjson/generic/ondemand/json_builder.h for lasx */ +}}} // namespace simdjson::rvv_vls::ondemand + +#endif // SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H +/* end file simdjson/generic/ondemand/serialization-inl.h for rvv_vls */ // JSON path accessor (compile-time) - must be after inline definitions -/* including simdjson/generic/ondemand/compile_time_accessors.h for lasx: #include "simdjson/generic/ondemand/compile_time_accessors.h" */ -/* begin file simdjson/generic/ondemand/compile_time_accessors.h for lasx */ +/* including simdjson/generic/ondemand/compile_time_accessors.h for rvv_vls: #include "simdjson/generic/ondemand/compile_time_accessors.h" */ +/* begin file simdjson/generic/ondemand/compile_time_accessors.h for rvv_vls */ /** * Compile-time JSON Path and JSON Pointer accessors using C++26 reflection (P2996) * @@ -152275,7 +183099,7 @@ simdjson_warn_unused simdjson_result<std::string> extract_from(const T &obj, siz #include <array> namespace simdjson { -namespace lasx { +namespace rvv_vls { namespace ondemand { /*** * JSONPath implementation for compile-time access @@ -152286,7 +183110,7 @@ namespace json_path { // Note: value type must be fully defined before this header is included // This is ensured by including this in amalgamated.h after value-inl.h -using ::simdjson::lasx::ondemand::value; +using ::simdjson::rvv_vls::ondemand::value; // Path step types enum class step_type { @@ -152420,7 +183244,7 @@ struct json_path_parser { // Compile-time path accessor generator template<typename T, constevalutil::fixed_string Path> struct path_accessor { - using value = ::simdjson::lasx::ondemand::value; + using value = ::simdjson::rvv_vls::ondemand::value; static constexpr auto parser = json_path_parser<Path>(); static constexpr std::size_t num_steps = parser.count_steps(); @@ -152898,14 +183722,14 @@ struct path_accessor { // Compile-time path accessor with validation template<typename T, constevalutil::fixed_string Path, typename DocOrValue> -inline simdjson_result<::simdjson::lasx::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { +inline simdjson_result<::simdjson::rvv_vls::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { using accessor = path_accessor<T, Path>; return accessor::access(doc_or_val); } // Overload without type parameter (no validation) template<constevalutil::fixed_string Path, typename DocOrValue> -inline simdjson_result<::simdjson::lasx::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { +inline simdjson_result<::simdjson::rvv_vls::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { using accessor = path_accessor<void, Path>; return accessor::access(doc_or_val); } @@ -153136,42 +183960,41 @@ struct pointer_accessor { // Compile-time JSON Pointer accessor with validation template<typename T, constevalutil::fixed_string Pointer, typename DocOrValue> -inline simdjson_result<::simdjson::lasx::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { +inline simdjson_result<::simdjson::rvv_vls::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { using accessor = pointer_accessor<T, Pointer>; return accessor::access(doc_or_val); } // Overload without type parameter (no validation) template<constevalutil::fixed_string Pointer, typename DocOrValue> -inline simdjson_result<::simdjson::lasx::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { +inline simdjson_result<::simdjson::rvv_vls::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { using accessor = pointer_accessor<void, Pointer>; return accessor::access(doc_or_val); } } // namespace json_path } // namespace ondemand -} // namespace lasx +} // namespace rvv_vls } // namespace simdjson #endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION #endif // SIMDJSON_GENERIC_ONDEMAND_COMPILE_TIME_ACCESSORS_H -/* end file simdjson/generic/ondemand/compile_time_accessors.h for lasx */ +/* end file simdjson/generic/ondemand/compile_time_accessors.h for rvv_vls */ -/* end file simdjson/generic/ondemand/amalgamated.h for lasx */ -/* including simdjson/lasx/end.h: #include "simdjson/lasx/end.h" */ -/* begin file simdjson/lasx/end.h */ +/* end file simdjson/generic/ondemand/amalgamated.h for rvv_vls */ +/* including simdjson/rvv-vls/end.h: #include "simdjson/rvv-vls/end.h" */ +/* begin file simdjson/rvv-vls/end.h */ /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/lasx/base.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/rvv-vls/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -#undef SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT -/* undefining SIMDJSON_IMPLEMENTATION from "lasx" */ +/* undefining SIMDJSON_IMPLEMENTATION from "rvv_vls" */ #undef SIMDJSON_IMPLEMENTATION -/* end file simdjson/lasx/end.h */ +/* end file simdjson/rvv-vls/end.h */ -#endif // SIMDJSON_LASX_ONDEMAND_H -/* end file simdjson/lasx/ondemand.h */ +#endif // SIMDJSON_RVV_VLS_ONDEMAND_H +/* end file simdjson/rvv-vls/ondemand.h */ #else #error Unknown SIMDJSON_BUILTIN_IMPLEMENTATION #endif diff --git a/deps/sqlite/sqlite3.c b/deps/sqlite/sqlite3.c index b44fb754da8bdb..851a2504cd0bde 100644 --- a/deps/sqlite/sqlite3.c +++ b/deps/sqlite/sqlite3.c @@ -1,6 +1,6 @@ /****************************************************************************** ** This file is an amalgamation of many separate C source files from SQLite -** version 3.51.2. By combining all the individual C code files into this +** version 3.51.3. By combining all the individual C code files into this ** single large file, the entire code can be compiled as a single translation ** unit. This allows many compilers to do optimizations that would not be ** possible if the files were compiled separately. Performance improvements @@ -18,7 +18,7 @@ ** separate file. This file contains only code for the core SQLite library. ** ** The content in this amalgamation comes from Fossil check-in -** b270f8339eb13b504d0b2ba154ebca966b7d with changes in files: +** 737ae4a34738ffa0c3ff7f9bb18df914dd1c with changes in files: ** ** */ @@ -467,12 +467,12 @@ extern "C" { ** [sqlite3_libversion_number()], [sqlite3_sourceid()], ** [sqlite_version()] and [sqlite_source_id()]. */ -#define SQLITE_VERSION "3.51.2" -#define SQLITE_VERSION_NUMBER 3051002 -#define SQLITE_SOURCE_ID "2026-01-09 17:27:48 b270f8339eb13b504d0b2ba154ebca966b7dde08e40c3ed7d559749818cb2075" +#define SQLITE_VERSION "3.51.3" +#define SQLITE_VERSION_NUMBER 3051003 +#define SQLITE_SOURCE_ID "2026-03-13 10:38:09 737ae4a34738ffa0c3ff7f9bb18df914dd1cad163f28fd6b6e114a344fe6d618" #define SQLITE_SCM_BRANCH "branch-3.51" -#define SQLITE_SCM_TAGS "release version-3.51.2" -#define SQLITE_SCM_DATETIME "2026-01-09T17:27:48.405Z" +#define SQLITE_SCM_TAGS "release version-3.51.3" +#define SQLITE_SCM_DATETIME "2026-03-13T10:38:09.694Z" /* ** CAPI3REF: Run-Time Library Version Numbers @@ -14334,6 +14334,27 @@ struct fts5_api { #endif #define SQLITE_MIN_LENGTH 30 /* Minimum value for the length limit */ +/* +** Maximum size of any single memory allocation. +** +** This is not a limit on the total amount of memory used. This is +** a limit on the size parameter to sqlite3_malloc() and sqlite3_realloc(). +** +** The upper bound is slightly less than 2GiB: 0x7ffffeff == 2,147,483,391 +** This provides a 256-byte safety margin for defense against 32-bit +** signed integer overflow bugs when computing memory allocation sizes. +** Paranoid applications might want to reduce the maximum allocation size +** further for an even larger safety margin. 0x3fffffff or 0x0fffffff +** or even smaller would be reasonable upper bounds on the size of a memory +** allocations for most applications. +*/ +#ifndef SQLITE_MAX_ALLOCATION_SIZE +# define SQLITE_MAX_ALLOCATION_SIZE 2147483391 +#endif +#if SQLITE_MAX_ALLOCATION_SIZE>2147483391 +# error Maximum size for SQLITE_MAX_ALLOCATION_SIZE is 2147483391 +#endif + /* ** This is the maximum number of ** @@ -21664,6 +21685,7 @@ SQLITE_PRIVATE Select *sqlite3SelectNew(Parse*,ExprList*,SrcList*,Expr*,ExprList Expr*,ExprList*,u32,Expr*); SQLITE_PRIVATE void sqlite3SelectDelete(sqlite3*, Select*); SQLITE_PRIVATE void sqlite3SelectDeleteGeneric(sqlite3*,void*); +SQLITE_PRIVATE void sqlite3SelectCheckOnClauses(Parse *pParse, Select *pSelect); SQLITE_PRIVATE Table *sqlite3SrcListLookup(Parse*, SrcList*); SQLITE_PRIVATE int sqlite3IsReadOnly(Parse*, Table*, Trigger*); SQLITE_PRIVATE void sqlite3OpenTable(Parse*, int iCur, int iDb, Table*, int); @@ -31310,27 +31332,6 @@ static void mallocWithAlarm(int n, void **pp){ *pp = p; } -/* -** Maximum size of any single memory allocation. -** -** This is not a limit on the total amount of memory used. This is -** a limit on the size parameter to sqlite3_malloc() and sqlite3_realloc(). -** -** The upper bound is slightly less than 2GiB: 0x7ffffeff == 2,147,483,391 -** This provides a 256-byte safety margin for defense against 32-bit -** signed integer overflow bugs when computing memory allocation sizes. -** Paranoid applications might want to reduce the maximum allocation size -** further for an even larger safety margin. 0x3fffffff or 0x0fffffff -** or even smaller would be reasonable upper bounds on the size of a memory -** allocations for most applications. -*/ -#ifndef SQLITE_MAX_ALLOCATION_SIZE -# define SQLITE_MAX_ALLOCATION_SIZE 2147483391 -#endif -#if SQLITE_MAX_ALLOCATION_SIZE>2147483391 -# error Maximum size for SQLITE_MAX_ALLOCATION_SIZE is 2147483391 -#endif - /* ** Allocate memory. This routine is like sqlite3_malloc() except that it ** assumes the memory subsystem has already been initialized. @@ -31554,8 +31555,7 @@ SQLITE_PRIVATE void *sqlite3Realloc(void *pOld, u64 nBytes){ sqlite3_free(pOld); /* IMP: R-26507-47431 */ return 0; } - if( nBytes>=0x7fffff00 ){ - /* The 0x7ffff00 limit term is explained in comments on sqlite3Malloc() */ + if( nBytes>SQLITE_MAX_ALLOCATION_SIZE ){ return 0; } nOld = sqlite3MallocSize(pOld); @@ -69010,68 +69010,82 @@ static int walCheckpoint( && (rc = walBusyLock(pWal,xBusy,pBusyArg,WAL_READ_LOCK(0),1))==SQLITE_OK ){ u32 nBackfill = pInfo->nBackfill; - pInfo->nBackfillAttempted = mxSafeFrame; SEH_INJECT_FAULT; - - /* Sync the WAL to disk */ - rc = sqlite3OsSync(pWal->pWalFd, CKPT_SYNC_FLAGS(sync_flags)); - - /* If the database may grow as a result of this checkpoint, hint - ** about the eventual size of the db file to the VFS layer. - */ - if( rc==SQLITE_OK ){ - i64 nReq = ((i64)mxPage * szPage); - i64 nSize; /* Current size of database file */ - sqlite3OsFileControl(pWal->pDbFd, SQLITE_FCNTL_CKPT_START, 0); - rc = sqlite3OsFileSize(pWal->pDbFd, &nSize); - if( rc==SQLITE_OK && nSize<nReq ){ - if( (nSize+65536+(i64)pWal->hdr.mxFrame*szPage)<nReq ){ - /* If the size of the final database is larger than the current - ** database plus the amount of data in the wal file, plus the - ** maximum size of the pending-byte page (65536 bytes), then - ** must be corruption somewhere. */ - rc = SQLITE_CORRUPT_BKPT; - }else{ - sqlite3OsFileControlHint(pWal->pDbFd, SQLITE_FCNTL_SIZE_HINT,&nReq); + WalIndexHdr *pLive = (WalIndexHdr*)walIndexHdr(pWal); + + /* Now that read-lock slot 0 is locked, check that the wal has not been + ** wrapped since the header was read for this checkpoint. If it was, then + ** there was no work to do anyway. In this case the + ** (pInfo->nBackfill<pWal->hdr.mxFrame) test above only passed because + ** pInfo->nBackfill had already been set to 0 by the writer that wrapped + ** the wal file. It would also be dangerous to proceed, as there may be + ** fewer than pWal->hdr.mxFrame valid frames in the wal file. */ + int bChg = memcmp(pLive->aSalt, pWal->hdr.aSalt, sizeof(pWal->hdr.aSalt)); + if( 0==bChg ){ + pInfo->nBackfillAttempted = mxSafeFrame; SEH_INJECT_FAULT; + + /* Sync the WAL to disk */ + rc = sqlite3OsSync(pWal->pWalFd, CKPT_SYNC_FLAGS(sync_flags)); + + /* If the database may grow as a result of this checkpoint, hint + ** about the eventual size of the db file to the VFS layer. + */ + if( rc==SQLITE_OK ){ + i64 nReq = ((i64)mxPage * szPage); + i64 nSize; /* Current size of database file */ + sqlite3OsFileControl(pWal->pDbFd, SQLITE_FCNTL_CKPT_START, 0); + rc = sqlite3OsFileSize(pWal->pDbFd, &nSize); + if( rc==SQLITE_OK && nSize<nReq ){ + if( (nSize+65536+(i64)pWal->hdr.mxFrame*szPage)<nReq ){ + /* If the size of the final database is larger than the current + ** database plus the amount of data in the wal file, plus the + ** maximum size of the pending-byte page (65536 bytes), then + ** must be corruption somewhere. */ + rc = SQLITE_CORRUPT_BKPT; + }else{ + sqlite3OsFileControlHint( + pWal->pDbFd, SQLITE_FCNTL_SIZE_HINT, &nReq); + } } - } - - } - /* Iterate through the contents of the WAL, copying data to the db file */ - while( rc==SQLITE_OK && 0==walIteratorNext(pIter, &iDbpage, &iFrame) ){ - i64 iOffset; - assert( walFramePgno(pWal, iFrame)==iDbpage ); - SEH_INJECT_FAULT; - if( AtomicLoad(&db->u1.isInterrupted) ){ - rc = db->mallocFailed ? SQLITE_NOMEM_BKPT : SQLITE_INTERRUPT; - break; } - if( iFrame<=nBackfill || iFrame>mxSafeFrame || iDbpage>mxPage ){ - continue; - } - iOffset = walFrameOffset(iFrame, szPage) + WAL_FRAME_HDRSIZE; - /* testcase( IS_BIG_INT(iOffset) ); // requires a 4GiB WAL file */ - rc = sqlite3OsRead(pWal->pWalFd, zBuf, szPage, iOffset); - if( rc!=SQLITE_OK ) break; - iOffset = (iDbpage-1)*(i64)szPage; - testcase( IS_BIG_INT(iOffset) ); - rc = sqlite3OsWrite(pWal->pDbFd, zBuf, szPage, iOffset); - if( rc!=SQLITE_OK ) break; - } - sqlite3OsFileControl(pWal->pDbFd, SQLITE_FCNTL_CKPT_DONE, 0); - /* If work was actually accomplished... */ - if( rc==SQLITE_OK ){ - if( mxSafeFrame==walIndexHdr(pWal)->mxFrame ){ - i64 szDb = pWal->hdr.nPage*(i64)szPage; - testcase( IS_BIG_INT(szDb) ); - rc = sqlite3OsTruncate(pWal->pDbFd, szDb); - if( rc==SQLITE_OK ){ - rc = sqlite3OsSync(pWal->pDbFd, CKPT_SYNC_FLAGS(sync_flags)); + /* Iterate through the contents of the WAL, copying data to the + ** db file */ + while( rc==SQLITE_OK && 0==walIteratorNext(pIter, &iDbpage, &iFrame) ){ + i64 iOffset; + assert( walFramePgno(pWal, iFrame)==iDbpage ); + SEH_INJECT_FAULT; + if( AtomicLoad(&db->u1.isInterrupted) ){ + rc = db->mallocFailed ? SQLITE_NOMEM_BKPT : SQLITE_INTERRUPT; + break; } + if( iFrame<=nBackfill || iFrame>mxSafeFrame || iDbpage>mxPage ){ + continue; + } + iOffset = walFrameOffset(iFrame, szPage) + WAL_FRAME_HDRSIZE; + /* testcase( IS_BIG_INT(iOffset) ); // requires a 4GiB WAL file */ + rc = sqlite3OsRead(pWal->pWalFd, zBuf, szPage, iOffset); + if( rc!=SQLITE_OK ) break; + iOffset = (iDbpage-1)*(i64)szPage; + testcase( IS_BIG_INT(iOffset) ); + rc = sqlite3OsWrite(pWal->pDbFd, zBuf, szPage, iOffset); + if( rc!=SQLITE_OK ) break; } + sqlite3OsFileControl(pWal->pDbFd, SQLITE_FCNTL_CKPT_DONE, 0); + + /* If work was actually accomplished... */ if( rc==SQLITE_OK ){ - AtomicStore(&pInfo->nBackfill, mxSafeFrame); SEH_INJECT_FAULT; + if( mxSafeFrame==walIndexHdr(pWal)->mxFrame ){ + i64 szDb = pWal->hdr.nPage*(i64)szPage; + testcase( IS_BIG_INT(szDb) ); + rc = sqlite3OsTruncate(pWal->pDbFd, szDb); + if( rc==SQLITE_OK ){ + rc = sqlite3OsSync(pWal->pDbFd, CKPT_SYNC_FLAGS(sync_flags)); + } + } + if( rc==SQLITE_OK ){ + AtomicStore(&pInfo->nBackfill, mxSafeFrame); SEH_INJECT_FAULT; + } } } @@ -71121,6 +71135,7 @@ SQLITE_PRIVATE int sqlite3WalCheckpoint( /* Copy data from the log to the database file. */ if( rc==SQLITE_OK ){ + sqlite3FaultSim(660); if( pWal->hdr.mxFrame && walPagesize(pWal)!=nBuf ){ rc = SQLITE_CORRUPT_BKPT; }else if( eMode2!=SQLITE_CHECKPOINT_NOOP ){ @@ -77556,7 +77571,7 @@ static int accessPayload( getCellInfo(pCur); aPayload = pCur->info.pPayload; - assert( offset+amt <= pCur->info.nPayload ); + assert( (u64)offset+(u64)amt <= (u64)pCur->info.nPayload ); assert( aPayload > pPage->aData ); if( (uptr)(aPayload - pPage->aData) > (pBt->usableSize - pCur->info.nLocal) ){ @@ -86030,7 +86045,12 @@ SQLITE_PRIVATE int sqlite3VdbeMemFromBtree( ){ int rc; pMem->flags = MEM_Null; - if( sqlite3BtreeMaxRecordSize(pCur)<offset+amt ){ + testcase( amt==SQLITE_MAX_ALLOCATION_SIZE-1 ); + testcase( amt==SQLITE_MAX_ALLOCATION_SIZE ); + if( amt>=SQLITE_MAX_ALLOCATION_SIZE ){ + return SQLITE_NOMEM_BKPT; + } + if( (u64)amt + (u64)offset > (u64)sqlite3BtreeMaxRecordSize(pCur) ){ return SQLITE_CORRUPT_BKPT; } if( SQLITE_OK==(rc = sqlite3VdbeMemClearAndResize(pMem, amt+1)) ){ @@ -93443,7 +93463,7 @@ static int valueFromValueList( Mem sMem; /* Raw content of current row */ memset(&sMem, 0, sizeof(sMem)); sz = sqlite3BtreePayloadSize(pRhs->pCsr); - rc = sqlite3VdbeMemFromBtreeZeroOffset(pRhs->pCsr,(int)sz,&sMem); + rc = sqlite3VdbeMemFromBtreeZeroOffset(pRhs->pCsr,sz,&sMem); if( rc==SQLITE_OK ){ u8 *zBuf = (u8*)sMem.z; u32 iSerial; @@ -111185,6 +111205,14 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ return WRC_Abort; } + /* If the SELECT statement contains ON clauses that were moved into + ** the WHERE clause, go through and verify that none of the terms + ** in the ON clauses reference tables to the right of the ON clause. */ + if( (p->selFlags & SF_OnToWhere) ){ + sqlite3SelectCheckOnClauses(pParse, p); + if( pParse->nErr ) return WRC_Abort; + } + /* Advance to the next term of the compound */ p = p->pPrior; @@ -154356,7 +154384,7 @@ static int selectCheckOnClausesSelect(Walker *pWalker, Select *pSelect){ ** Check all ON clauses in pSelect to verify that they do not reference ** columns to the right. */ -static void selectCheckOnClauses(Parse *pParse, Select *pSelect){ +SQLITE_PRIVATE void sqlite3SelectCheckOnClauses(Parse *pParse, Select *pSelect){ Walker w; CheckOnCtx sCtx; assert( pSelect->selFlags & SF_OnToWhere ); @@ -154499,18 +154527,6 @@ SQLITE_PRIVATE int sqlite3Select( } #endif - /* If the SELECT statement contains ON clauses that were moved into - ** the WHERE clause, go through and verify that none of the terms - ** in the ON clauses reference tables to the right of the ON clause. - ** Do this now, after name resolution, but before query flattening - */ - if( p->selFlags & SF_OnToWhere ){ - selectCheckOnClauses(pParse, p); - if( pParse->nErr ){ - goto select_end; - } - } - /* If the SF_UFSrcCheck flag is set, then this function is being called ** as part of populating the temp table for an UPDATE...FROM statement. ** In this case, it is an error if the target object (pSrc->a[0]) name @@ -164677,6 +164693,15 @@ SQLITE_PRIVATE SQLITE_NOINLINE void sqlite3WhereRightJoinLoop( sqlite3ExprDup(pParse->db, pTerm->pExpr, 0)); } } + if( pLevel->iIdxCur ){ + /* pSubWhere may contain expressions that read from an index on the + ** table on the RHS of the right join. All such expressions first test + ** if the index is pointing at a NULL row, and if so, read from the + ** table cursor instead. So ensure that the index cursor really is + ** pointing at a NULL row here, so that no values are read from it during + ** the scan of the RHS of the RIGHT join below. */ + sqlite3VdbeAddOp1(v, OP_NullRow, pLevel->iIdxCur); + } pFrom = &uSrc.sSrc; pFrom->nSrc = 1; pFrom->nAlloc = 1; @@ -224163,7 +224188,7 @@ static int rbuDeltaApply( /* ERROR: copy exceeds output file size */ return -1; } - if( (int)(ofst+cnt) > lenSrc ){ + if( (u64)ofst+(u64)cnt > (u64)lenSrc ){ /* ERROR: copy extends past end of input */ return -1; } @@ -252450,7 +252475,7 @@ static void fts5DoSecureDelete( int iSegid = pSeg->pSeg->iSegid; u8 *aPg = pSeg->pLeaf->p; int nPg = pSeg->pLeaf->nn; - int iPgIdx = pSeg->pLeaf->szLeaf; + int iPgIdx = pSeg->pLeaf->szLeaf; /* Offset of page footer */ u64 iDelta = 0; int iNextOff = 0; @@ -252529,7 +252554,7 @@ static void fts5DoSecureDelete( iSOP += fts5GetVarint32(&aPg[iSOP], nPos); } assert_nc( iSOP==pSeg->iLeafOffset ); - iNextOff = pSeg->iLeafOffset + pSeg->nPos; + iNextOff = iSOP + pSeg->nPos; } } @@ -260348,7 +260373,7 @@ static void fts5SourceIdFunc( ){ assert( nArg==0 ); UNUSED_PARAM2(nArg, apUnused); - sqlite3_result_text(pCtx, "fts5: 2026-01-09 17:27:48 b270f8339eb13b504d0b2ba154ebca966b7dde08e40c3ed7d559749818cb2075", -1, SQLITE_TRANSIENT); + sqlite3_result_text(pCtx, "fts5: 2026-03-13 10:38:09 737ae4a34738ffa0c3ff7f9bb18df914dd1cad163f28fd6b6e114a344fe6d618", -1, SQLITE_TRANSIENT); } /* diff --git a/deps/sqlite/sqlite3.h b/deps/sqlite/sqlite3.h index 6e975a6d199273..302f0f5b1698d1 100644 --- a/deps/sqlite/sqlite3.h +++ b/deps/sqlite/sqlite3.h @@ -146,12 +146,12 @@ extern "C" { ** [sqlite3_libversion_number()], [sqlite3_sourceid()], ** [sqlite_version()] and [sqlite_source_id()]. */ -#define SQLITE_VERSION "3.51.2" -#define SQLITE_VERSION_NUMBER 3051002 -#define SQLITE_SOURCE_ID "2026-01-09 17:27:48 b270f8339eb13b504d0b2ba154ebca966b7dde08e40c3ed7d559749818cb2075" +#define SQLITE_VERSION "3.51.3" +#define SQLITE_VERSION_NUMBER 3051003 +#define SQLITE_SOURCE_ID "2026-03-13 10:38:09 737ae4a34738ffa0c3ff7f9bb18df914dd1cad163f28fd6b6e114a344fe6d618" #define SQLITE_SCM_BRANCH "branch-3.51" -#define SQLITE_SCM_TAGS "release version-3.51.2" -#define SQLITE_SCM_DATETIME "2026-01-09T17:27:48.405Z" +#define SQLITE_SCM_TAGS "release version-3.51.3" +#define SQLITE_SCM_DATETIME "2026-03-13T10:38:09.694Z" /* ** CAPI3REF: Run-Time Library Version Numbers diff --git a/deps/v8/src/strings/unicode-inl.h b/deps/v8/src/strings/unicode-inl.h index 4aa7e8090ca39a..26f77adf28fd2f 100644 --- a/deps/v8/src/strings/unicode-inl.h +++ b/deps/v8/src/strings/unicode-inl.h @@ -10,6 +10,7 @@ #include "src/base/logging.h" #include "src/utils/utils.h" +#include "third_party/simdutf/simdutf.h" namespace unibrow { @@ -219,6 +220,16 @@ bool Utf8::IsValidCharacter(uchar c) { c != kBadChar); } +template <> +bool Utf8::IsAsciiOneByteString<uint8_t>(const uint8_t* buffer, size_t size) { + return simdutf::validate_ascii(reinterpret_cast<const char*>(buffer), size); +} + +template <> +bool Utf8::IsAsciiOneByteString<uint16_t>(const uint16_t* buffer, size_t size) { + return false; +} + template <typename Char> Utf8::EncodingResult Utf8::Encode(v8::base::Vector<const Char> string, char* buffer, size_t capacity, @@ -234,8 +245,17 @@ Utf8::EncodingResult Utf8::Encode(v8::base::Vector<const Char> string, const Char* characters = string.begin(); size_t content_capacity = capacity - write_null; CHECK_LE(content_capacity, capacity); - uint16_t last = Utf16::kNoPreviousCharacter; size_t read_index = 0; + if (kSourceIsOneByte) { + size_t writeable = std::min(string.size(), content_capacity); + // Just memcpy when possible. + if (writeable > 0 && Utf8::IsAsciiOneByteString(characters, writeable)) { + memcpy(buffer, characters, writeable); + read_index = writeable; + write_index = writeable; + } + } + uint16_t last = Utf16::kNoPreviousCharacter; for (; read_index < string.size(); read_index++) { Char character = characters[read_index]; diff --git a/deps/v8/src/strings/unicode.h b/deps/v8/src/strings/unicode.h index ef1e717b1ea857..b9b5bc2431eb54 100644 --- a/deps/v8/src/strings/unicode.h +++ b/deps/v8/src/strings/unicode.h @@ -212,6 +212,16 @@ class V8_EXPORT_PRIVATE Utf8 { // - valid code point range. static bool ValidateEncoding(const uint8_t* str, size_t length); + template <typename Char> + static bool IsAsciiOneByteString(const Char* buffer, size_t size); + + template <> + inline bool IsAsciiOneByteString<uint8_t>(const uint8_t* buffer, size_t size); + + template <> + inline bool IsAsciiOneByteString<uint16_t>(const uint16_t* buffer, + size_t size); + // Encode the given characters as Utf8 into the provided output buffer. struct EncodingResult { size_t bytes_written; @@ -223,6 +233,14 @@ class V8_EXPORT_PRIVATE Utf8 { bool replace_invalid_utf8); }; +template <> +inline bool Utf8::IsAsciiOneByteString<uint8_t>(const uint8_t* buffer, + size_t size); + +template <> +inline bool Utf8::IsAsciiOneByteString<uint16_t>(const uint16_t* buffer, + size_t size); + #if V8_ENABLE_WEBASSEMBLY class V8_EXPORT_PRIVATE Wtf8 { public: diff --git a/deps/v8/src/wasm/constant-expression-interface.cc b/deps/v8/src/wasm/constant-expression-interface.cc index b06009f4a9265f..01d07dd889f904 100644 --- a/deps/v8/src/wasm/constant-expression-interface.cc +++ b/deps/v8/src/wasm/constant-expression-interface.cc @@ -40,7 +40,17 @@ void ConstantExpressionInterface::S128Const(FullDecoder* decoder, const Simd128Immediate& imm, Value* result) { if (!generate_value()) return; +#if V8_TARGET_BIG_ENDIAN + // Globals are not little endian enforced, they use native byte order and we + // need to reverse the bytes on big endian platforms. + uint8_t value[kSimd128Size]; + for (int i = 0; i < kSimd128Size; i++) { + value[i] = imm.value[kSimd128Size - 1 - i]; + } + result->runtime_value = WasmValue(value, kWasmS128); +#else result->runtime_value = WasmValue(imm.value, kWasmS128); +#endif } void ConstantExpressionInterface::UnOp(FullDecoder* decoder, WasmOpcode opcode, diff --git a/deps/v8/src/wasm/jump-table-assembler.cc b/deps/v8/src/wasm/jump-table-assembler.cc index 7a69ea0902ed1d..80b5511bc17c5e 100644 --- a/deps/v8/src/wasm/jump-table-assembler.cc +++ b/deps/v8/src/wasm/jump-table-assembler.cc @@ -426,7 +426,8 @@ void JumpTableAssembler::EmitFarJumpSlot(Address target) { // static void JumpTableAssembler::PatchFarJumpSlot(WritableJitAllocation& jit_allocation, Address slot, Address target) { - Address target_addr = slot + 8; + // See {EmitFarJumpSlot} for the offset of the target. + Address target_addr = slot + kFarJumpTableSlotSize - kSystemPointerSize; jit_allocation.WriteValue(target_addr, target, kRelaxedStore); } @@ -636,7 +637,7 @@ bool JumpTableAssembler::EmitJumpSlot(Address target) { CHECK((relative_target & (kAAMask | kLKMask)) == 0); // The jump table is updated live, so the write has to be atomic. - emit<uint32_t>(inst[0] | relative_target, kRelaxedStore); + emit<uint32_t>(inst[0] | (relative_target & kImm26Mask), kRelaxedStore); return true; } @@ -671,7 +672,9 @@ void JumpTableAssembler::EmitFarJumpSlot(Address target) { // static void JumpTableAssembler::PatchFarJumpSlot(WritableJitAllocation& jit_allocation, Address slot, Address target) { - Address target_addr = slot + kFarJumpTableSlotSize - 8; + // See {EmitFarJumpSlot} for the offset of the target. + Address target_addr = + slot + kFarJumpTableSlotSize - (2 * kInstrSize) - kSystemPointerSize; jit_allocation.WriteValue(target_addr, target, kRelaxedStore); } diff --git a/doc/api/addons.md b/doc/api/addons.md index 8e2864952e0841..48eaeb078456ec 100644 --- a/doc/api/addons.md +++ b/doc/api/addons.md @@ -4,22 +4,17 @@ <!-- type=misc --> -_Addons_ are dynamically-linked shared objects written in C++. The -[`require()`][require] function can load addons as ordinary Node.js modules. -Addons provide an interface between JavaScript and C/C++ libraries. +_Addons_ are dynamically-linked shared objects that can be loaded via the +[`require()`][] function as ordinary Node.js modules. +Addons provide a foreign function interface between JavaScript and native code. There are three options for implementing addons: -* Node-API +* [Node-API][] (recommended) * `nan` ([Native Abstractions for Node.js][]) * direct use of internal V8, libuv, and Node.js libraries -Unless there is a need for direct access to functionality which is not\ -exposed by Node-API, use Node-API. -Refer to [C/C++ addons with Node-API](n-api.md) for more information on -Node-API. - -When not using Node-API, implementing addons becomes more complex, requiring\ +This rest of this document focuses on the latter, requiring knowledge of multiple components and APIs: * [V8][]: the C++ library Node.js uses to provide the @@ -28,7 +23,7 @@ knowledge of multiple components and APIs: `v8.h` header file (`deps/v8/include/v8.h` in the Node.js source tree), and is also available [online][v8-docs]. -* [libuv][]: The C library that implements the Node.js event loop, its worker +* [`libuv`][]: The C library that implements the Node.js event loop, its worker threads and all of the asynchronous behaviors of the platform. It also serves as a cross-platform abstraction library, giving easy, POSIX-like access across all major operating systems to many common system tasks, such @@ -87,37 +82,40 @@ void Initialize(Local<Object> exports) { NODE_SET_METHOD(exports, "hello", Method); } -NODE_MODULE(NODE_GYP_MODULE_NAME, Initialize) +NODE_MODULE(NODE_GYP_MODULE_NAME, Initialize) // N.B.: no semi-colon, this is not a function } // namespace demo ``` -All Node.js addons must export an initialization function following -the pattern: +On most platforms, the following `Makefile` can get us started: -```cpp -void Initialize(Local<Object> exports); -NODE_MODULE(NODE_GYP_MODULE_NAME, Initialize) +<!--lint disable no-tabs remark-lint--> + +```bash +NODEJS_DEV_ROOT ?= $(shell dirname "$$(command -v node)")/.. +CXXFLAGS = -std=c++23 -I$(NODEJS_DEV_ROOT)/include/node -fPIC -shared -Wl,-undefined,dynamic_lookup + +hello.node: hello.cc + $(CXX) $(CXXFLAGS) -o $@ $< ``` -There is no semi-colon after `NODE_MODULE` as it's not a function (see -`node.h`). +<!--lint enable no-tabs remark-lint--> -The `module_name` must match the filename of the final binary (excluding -the `.node` suffix). +Then running the following commands will compile and run the code: -In the `hello.cc` example, then, the initialization function is `Initialize` -and the addon module name is `addon`. +```console +$ make +$ node -p 'require("./hello.node").hello()' +world +``` + +To integrate with the npm ecosystem, see the [Building][] section. -When building addons with `node-gyp`, using the macro `NODE_GYP_MODULE_NAME` as -the first parameter of `NODE_MODULE()` will ensure that the name of the final -binary will be passed to `NODE_MODULE()`. +### Context-aware addons Addons defined with `NODE_MODULE()` can not be loaded in multiple contexts or multiple threads at the same time. -### Context-aware addons - There are environments in which Node.js addons may need to be loaded multiple times in multiple contexts. For example, the [Electron][] runtime runs multiple instances of Node.js in a single process. Each instance will have its own @@ -257,8 +255,8 @@ changes: In order to be loaded from multiple Node.js environments, such as a main thread and a Worker thread, an add-on needs to either: -* Be an Node-API addon, or -* Be declared as context-aware using `NODE_MODULE_INIT()` as described above +* Be an [Node-API][] addon. +* Be declared as context-aware using `NODE_MODULE_INIT()` as described above. In order to support [`Worker`][] threads, addons need to clean up any resources they may have allocated when such a thread exits. This can be achieved through @@ -340,7 +338,7 @@ require('./build/Release/addon'); Once the source code has been written, it must be compiled into the binary `addon.node` file. To do so, create a file called `binding.gyp` in the top-level of the project describing the build configuration of the module -using a JSON-like format. This file is used by [node-gyp][], a tool written +using a JSON-like format. This file is used by [`node-gyp`][], a tool written specifically to compile Node.js addons. ```json @@ -375,7 +373,7 @@ version of `node-gyp` to perform this same set of actions, generating a compiled version of the addon for the user's platform on demand. Once built, the binary addon can be used from within Node.js by pointing -[`require()`][require] to the built `addon.node` module: +[`require()`][] to the built `addon.node` module: ```js // hello.js @@ -422,18 +420,46 @@ aware of: ### Loading addons using `require()` The filename extension of the compiled addon binary is `.node` (as opposed -to `.dll` or `.so`). The [`require()`][require] function is written to look for +to `.dll` or `.so`). The [`require()`][] function is written to look for files with the `.node` file extension and initialize those as dynamically-linked libraries. -When calling [`require()`][require], the `.node` extension can usually be +When calling [`require()`][], the `.node` extension can usually be omitted and Node.js will still find and initialize the addon. One caveat, however, is that Node.js will first attempt to locate and load modules or JavaScript files that happen to share the same base name. For instance, if there is a file `addon.js` in the same directory as the binary `addon.node`, -then [`require('addon')`][require] will give precedence to the `addon.js` file +then [`require('addon')`][`require()`] will give precedence to the `addon.js` file and load it instead. +### Loading addons using `import` + +<!-- YAML +added: + - v23.6.0 + - v22.20.0 +--> + +> Stability: 1.0 - Early development + +You can use the [`--experimental-addon-modules`][] flag to enable support for +both static `import` and dynamic `import()` to load binary addons. + +If we reuse the Hello World example from earlier, you could do: + +```mjs +// hello.mjs +import myAddon from './hello.node'; +// N.B.: import {hello} from './hello.node' would not work + +console.log(myAddon.hello()); +``` + +```console +$ node --experimental-addon-modules hello.mjs +world +``` + ## Native abstractions for Node.js Each of the examples illustrated in this document directly use the @@ -453,59 +479,7 @@ illustration of how it can be used. > Stability: 2 - Stable -Node-API is an API for building native addons. It is independent from -the underlying JavaScript runtime (e.g. V8) and is maintained as part of -Node.js itself. This API will be Application Binary Interface (ABI) stable -across versions of Node.js. It is intended to insulate addons from -changes in the underlying JavaScript engine and allow modules -compiled for one version to run on later versions of Node.js without -recompilation. Addons are built/packaged with the same approach/tools -outlined in this document (node-gyp, etc.). The only difference is the -set of APIs that are used by the native code. Instead of using the V8 -or [Native Abstractions for Node.js][] APIs, the functions available -in the Node-API are used. - -Creating and maintaining an addon that benefits from the ABI stability -provided by Node-API carries with it certain -[implementation considerations][]. - -To use Node-API in the above "Hello world" example, replace the content of -`hello.cc` with the following. All other instructions remain the same. - -```cpp -// hello.cc using Node-API -#include <node_api.h> - -namespace demo { - -napi_value Method(napi_env env, napi_callback_info args) { - napi_value greeting; - napi_status status; - - status = napi_create_string_utf8(env, "world", NAPI_AUTO_LENGTH, &greeting); - if (status != napi_ok) return nullptr; - return greeting; -} - -napi_value init(napi_env env, napi_value exports) { - napi_status status; - napi_value fn; - - status = napi_create_function(env, nullptr, 0, Method, nullptr, &fn); - if (status != napi_ok) return nullptr; - - status = napi_set_named_property(env, exports, "hello", fn); - if (status != napi_ok) return nullptr; - return exports; -} - -NAPI_MODULE(NODE_GYP_MODULE_NAME, init) - -} // namespace demo -``` - -The functions available and how to use them are documented in -[C/C++ addons with Node-API](n-api.md). +See [C/C++ addons with Node-API][Node-API]. ## Addon examples @@ -1376,18 +1350,20 @@ console.log(result); // Prints: 30 ``` +[Building]: #building [Electron]: https://electronjs.org/ [Embedder's Guide]: https://v8.dev/docs/embed [Linking to libraries included with Node.js]: #linking-to-libraries-included-with-nodejs [Native Abstractions for Node.js]: https://github.com/nodejs/nan +[Node-API]: n-api.md [V8]: https://v8.dev/ +[`--experimental-addon-modules`]: cli.md#--experimental-addon-modules [`Worker`]: worker_threads.md#class-worker +[`libuv`]: https://github.com/libuv/libuv +[`node-gyp`]: https://github.com/nodejs/node-gyp +[`require()`]: modules.md#requireid [bindings]: https://github.com/TooTallNate/node-bindings [download]: https://github.com/nodejs/node-addon-examples [examples]: https://github.com/nodejs/nan/tree/HEAD/examples/ -[implementation considerations]: n-api.md#implications-of-abi-stability [installation instructions]: https://github.com/nodejs/node-gyp#installation -[libuv]: https://github.com/libuv/libuv -[node-gyp]: https://github.com/nodejs/node-gyp -[require]: modules.md#requireid [v8-docs]: https://v8docs.nodesource.com/ diff --git a/doc/api/buffer.md b/doc/api/buffer.md index 7c358edbc7c095..a03b95c1ffe3c3 100644 --- a/doc/api/buffer.md +++ b/doc/api/buffer.md @@ -3524,13 +3524,13 @@ changes: calculations with them. --> +> Stability: 0 - Deprecated: Use [`buf.subarray`][] instead. + * `start` {integer} Where the new `Buffer` will start. **Default:** `0`. * `end` {integer} Where the new `Buffer` will end (not inclusive). **Default:** [`buf.length`][]. * Returns: {Buffer} -> Stability: 0 - Deprecated: Use [`buf.subarray`][] instead. - Returns a new `Buffer` that references the same memory as the original, but offset and cropped by the `start` and `end` indexes. diff --git a/doc/api/child_process.md b/doc/api/child_process.md index 6818eec4594b25..7df9fe27e613f8 100644 --- a/doc/api/child_process.md +++ b/doc/api/child_process.md @@ -2402,7 +2402,7 @@ or [`child_process.fork()`][]. [`subprocess.stdin`]: #subprocessstdin [`subprocess.stdio`]: #subprocessstdio [`subprocess.stdout`]: #subprocessstdout -[`util.convertProcessSignalToExitCode()`]: util.md#utilconvertprocesssignaltoexitcodesignalcode +[`util.convertProcessSignalToExitCode()`]: util.md#utilconvertprocesssignaltoexitcodesignal [`util.promisify()`]: util.md#utilpromisifyoriginal [synchronous counterparts]: #synchronous-process-creation [v8.serdes]: v8.md#serialization-api diff --git a/doc/api/cli.md b/doc/api/cli.md index d6409347d8f00c..935c5375d8d62a 100644 --- a/doc/api/cli.md +++ b/doc/api/cli.md @@ -943,6 +943,9 @@ changes: Evaluate the following argument as JavaScript. The modules which are predefined in the REPL can also be used in `script`. +If `script` starts with `-`, pass it using `=` (for example, +`node --print --eval=-42`) so it is parsed as the value of `--eval`. + On Windows, using `cmd.exe` a single quote will not work correctly because it only recognizes double `"` for quoting. In Powershell or Git bash, both `'` and `"` are usable. @@ -3612,6 +3615,7 @@ V8 options that are allowed are: * `--expose-gc` * `--interpreted-frames-native-stack` * `--jitless` +* `--max-heap-size` * `--max-old-space-size` * `--max-semi-space-size` * `--perf-basic-prof-only-functions` @@ -3968,6 +3972,12 @@ documented here: ### `--jitless` +### `--max-heap-size` + +Specifies the maximum heap size (in megabytes) for the process. + +This option is typically used to limit the amount of memory the process can use for its JavaScript heap. + <!-- Anchor to make sure old links find a target --> <a id="--max-old-space-sizesize-in-megabytes"></a> diff --git a/doc/api/debugger.md b/doc/api/debugger.md index 03e9cd9185027e..ce25c927d8ef81 100644 --- a/doc/api/debugger.md +++ b/doc/api/debugger.md @@ -260,13 +260,5 @@ For help, see: https://nodejs.org/en/docs/inspector at the end of the URL is generated on the fly, it varies in different debugging sessions.) -If the Chrome browser is older than 66.0.3345.0, -use `inspector.html` instead of `js_app.html` in the above URL. - -Chrome DevTools doesn't support debugging [worker threads][] yet. -[ndb][] can be used to debug them. - [Chrome DevTools Protocol]: https://chromedevtools.github.io/devtools-protocol/ [`debugger`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/debugger -[ndb]: https://github.com/GoogleChromeLabs/ndb/ -[worker threads]: worker_threads.md diff --git a/doc/api/deprecations.md b/doc/api/deprecations.md index 9423b2147896d6..378581dc03ae3a 100644 --- a/doc/api/deprecations.md +++ b/doc/api/deprecations.md @@ -924,6 +924,11 @@ The [`require.extensions`][] property is deprecated. <!-- YAML changes: + - version: + - v23.7.0 + - v22.14.0 + pr-url: https://github.com/nodejs/node/pull/56632 + description: Application deprecation. - version: v21.0.0 pr-url: https://github.com/nodejs/node/pull/47202 description: Runtime deprecation. @@ -935,7 +940,7 @@ changes: description: Documentation-only deprecation. --> -Type: Runtime +Type: Application (non-`node_modules` code only) The [`punycode`][] module is deprecated. Please use a userland alternative instead. @@ -2637,11 +2642,15 @@ future release. <!-- YAML changes: + - version: + - v24.0.0 + pr-url: https://github.com/nodejs/node/pull/55017 + description: DEP0169 covers also `url.format()` and `url.resolve()`. - version: - v19.0.0 - v18.13.0 pr-url: https://github.com/nodejs/node/pull/44919 - description: \`url.parse()` is deprecated again in DEP0169. + description: DEP0169 deprecates `url.parse()` again. - version: - v15.13.0 - v14.17.0 @@ -3724,7 +3733,7 @@ Type: Application (non-`node_modules` code only) have security implications. Use the [WHATWG URL API][] instead. CVEs are not issued for `url.parse()` vulnerabilities. -Passing a string argument to [`url.format()`][] invokes `url.parse()` +Calling [`url.format(urlString)`][] or [`url.resolve()`][] invokes `url.parse()` internally, and is therefore also covered by this deprecation. ### DEP0170: Invalid port when using `url.parse()` @@ -4095,7 +4104,7 @@ Type: Documentation-only `process.features.tls_alpn`, `process.features.tls_ocsp`, and `process.features.tls_sni` are deprecated, as their values are guaranteed to be identical to that of `process.features.tls`. -### DEP0190: Passing `args` to `node:child_process` `execFile`/`spawn` with `shell` option `true` +### DEP0190: Passing `args` to `node:child_process` `execFile`/`spawn` with `shell` option <!-- YAML changes: @@ -4112,7 +4121,8 @@ changes: Type: Runtime When an `args` array is passed to [`child_process.execFile`][] or [`child_process.spawn`][] with the option -`{ shell: true }`, the values are not escaped, only space-separated, which can lead to shell injection. +`{ shell: true }` or `{ shell: '/path/to/shell' }`, the values are not escaped, only space-separated, +which can lead to shell injection. ### DEP0191: `repl.builtinModules` @@ -4335,6 +4345,100 @@ Passing the `type` option to [`Duplex.toWeb()`][] is deprecated. To specify the type of the readable half of the constructed readable-writable pair, use the `readableType` option instead. +### DEP0202: `Http1IncomingMessage` and `Http1ServerResponse` options of HTTP/2 servers + +<!-- YAML +changes: + - version: REPLACEME + pr-url: https://github.com/nodejs/node/pull/61713 + description: Documentation-only deprecation. +--> + +Type: Documentation-only + +The `Http1IncomingMessage` and `Http1ServerResponse` options of +[`http2.createServer()`][] and [`http2.createSecureServer()`][] are +deprecated. Use `http1Options.IncomingMessage` and +`http1Options.ServerResponse` instead. + +```cjs +// Deprecated +const server = http2.createSecureServer({ + allowHTTP1: true, + Http1IncomingMessage: MyIncomingMessage, + Http1ServerResponse: MyServerResponse, +}); +``` + +```cjs +// Use this instead +const server = http2.createSecureServer({ + allowHTTP1: true, + http1Options: { + IncomingMessage: MyIncomingMessage, + ServerResponse: MyServerResponse, + }, +}); +``` + +### DEP0203: Passing `CryptoKey` to `node:crypto` APIs + +<!-- YAML +changes: + - version: REPLACEME + pr-url: https://github.com/nodejs/node/pull/62321 + description: Documentation-only deprecation. +--> + +Type: Documentation-only + +Passing a [`CryptoKey`][] to `node:crypto` functions is deprecated and +will throw an error in a future version. This includes +[`crypto.createPublicKey()`][], [`crypto.createPrivateKey()`][], +[`crypto.sign()`][], [`crypto.verify()`][], +[`crypto.publicEncrypt()`][], [`crypto.publicDecrypt()`][], +[`crypto.privateEncrypt()`][], [`crypto.privateDecrypt()`][], +[`Sign.prototype.sign()`][], [`Verify.prototype.verify()`][], +[`crypto.createHmac()`][], [`crypto.createCipheriv()`][], +[`crypto.createDecipheriv()`][], [`crypto.encapsulate()`][], and +[`crypto.decapsulate()`][]. + +### DEP0204: `KeyObject.from()` with non-extractable `CryptoKey` + +<!-- YAML +changes: + - version: REPLACEME + pr-url: https://github.com/nodejs/node/pull/62321 + description: Documentation-only deprecation. +--> + +Type: Documentation-only + +Passing a non-extractable [`CryptoKey`][] to [`KeyObject.from()`][] is +deprecated and will throw an error in a future version. + +### DEP0205: `module.register()` + +<!-- YAML +changes: + - version: REPLACEME + pr-url: https://github.com/nodejs/node/pull/62395 + description: Documentation-only deprecation. +--> + +Type: Documentation-only + +[`module.register()`][] is deprecated. Use [`module.registerHooks()`][] +instead. + +The `module.register()` API provides off-thread async hooks for customizing ES modules; +the `module.registerHooks()` API provides similar hooks that are synchronous, in-thread, and +work for all types of modules. +Supporting async hooks has proven to be complex, involving worker threads orchestration, and there are issues +that have proven unresolveable. See [caveats of asynchronous customization hooks][]. Please migrate to +`module.registerHooks()` as soon as possible as `module.register()` will be +removed in a future version of Node.js. + [DEP0142]: #dep0142-repl_builtinlibs [NIST SP 800-38D]: https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38d.pdf [RFC 6066]: https://tools.ietf.org/html/rfc6066#section-3 @@ -4352,15 +4456,19 @@ type of the readable half of the constructed readable-writable pair, use the [`Buffer.from(buffer)`]: buffer.md#static-method-bufferfrombuffer [`Buffer.isBuffer()`]: buffer.md#static-method-bufferisbufferobj [`Cipheriv`]: crypto.md#class-cipheriv +[`CryptoKey`]: webcrypto.md#class-cryptokey [`Decipheriv`]: crypto.md#class-decipheriv [`Duplex.toWeb()`]: stream.md#streamduplextowebstreamduplex-options [`Error.isError`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/isError +[`KeyObject.from()`]: crypto.md#static-method-keyobjectfromkey [`REPLServer.clearBufferedCommand()`]: repl.md#replserverclearbufferedcommand [`ReadStream.open()`]: fs.md#class-fsreadstream [`Server.getConnections()`]: net.md#servergetconnectionscallback [`Server.listen({fd: <number>})`]: net.md#serverlistenhandle-backlog-callback +[`Sign.prototype.sign()`]: crypto.md#signsignprivatekey-outputencoding [`SlowBuffer`]: buffer.md#class-slowbuffer [`String.prototype.toWellFormed`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toWellFormed +[`Verify.prototype.verify()`]: crypto.md#verifyverifyobject-signature-signatureencoding [`WriteStream.open()`]: fs.md#class-fswritestream [`assert.CallTracker`]: assert.md#class-assertcalltracker [`assert`]: assert.md @@ -4379,11 +4487,21 @@ type of the readable half of the constructed readable-writable pair, use the [`crypto.createDecipheriv()`]: crypto.md#cryptocreatedecipherivalgorithm-key-iv-options [`crypto.createHash()`]: crypto.md#cryptocreatehashalgorithm-options [`crypto.createHmac()`]: crypto.md#cryptocreatehmacalgorithm-key-options +[`crypto.createPrivateKey()`]: crypto.md#cryptocreateprivatekeykey +[`crypto.createPublicKey()`]: crypto.md#cryptocreatepublickeykey +[`crypto.decapsulate()`]: crypto.md#cryptodecapsulatekey-ciphertext-callback +[`crypto.encapsulate()`]: crypto.md#cryptoencapsulatekey-callback [`crypto.fips`]: crypto.md#cryptofips [`crypto.pbkdf2()`]: crypto.md#cryptopbkdf2password-salt-iterations-keylen-digest-callback +[`crypto.privateDecrypt()`]: crypto.md#cryptoprivatedecryptprivatekey-buffer +[`crypto.privateEncrypt()`]: crypto.md#cryptoprivateencryptprivatekey-buffer +[`crypto.publicDecrypt()`]: crypto.md#cryptopublicdecryptkey-buffer +[`crypto.publicEncrypt()`]: crypto.md#cryptopublicencryptkey-buffer [`crypto.randomBytes()`]: crypto.md#cryptorandombytessize-callback [`crypto.scrypt()`]: crypto.md#cryptoscryptpassword-salt-keylen-options-callback [`crypto.setEngine()`]: crypto.md#cryptosetengineengine-flags +[`crypto.sign()`]: crypto.md#cryptosignalgorithm-data-key-callback +[`crypto.verify()`]: crypto.md#cryptoverifyalgorithm-data-key-signature-callback [`decipher.final()`]: crypto.md#decipherfinaloutputencoding [`decipher.setAuthTag()`]: crypto.md#deciphersetauthtagbuffer-encoding [`dirent.parentPath`]: fs.md#direntparentpath @@ -4416,6 +4534,8 @@ type of the readable half of the constructed readable-writable pair, use the [`http.ServerResponse`]: http.md#class-httpserverresponse [`http.get()`]: http.md#httpgetoptions-callback [`http.request()`]: http.md#httprequestoptions-callback +[`http2.createSecureServer()`]: http2.md#http2createsecureserveroptions-onrequesthandler +[`http2.createServer()`]: http2.md#http2createserveroptions-onrequesthandler [`https.get()`]: https.md#httpsgetoptions-callback [`https.request()`]: https.md#httpsrequestoptions-callback [`message.connection`]: http.md#messageconnection @@ -4426,6 +4546,8 @@ type of the readable half of the constructed readable-writable pair, use the [`message.trailers`]: http.md#messagetrailers [`mock`]: test.md#mocking [`module.createRequire()`]: module.md#modulecreaterequirefilename +[`module.register()`]: module.md#moduleregisterspecifier-parenturl-options +[`module.registerHooks()`]: module.md#moduleregisterhooksoptions [`os.networkInterfaces()`]: os.md#osnetworkinterfaces [`os.tmpdir()`]: os.md#ostmpdir [`process.env`]: process.md#processenv @@ -4460,6 +4582,7 @@ type of the readable half of the constructed readable-writable pair, use the [`tls.createSecureContext()`]: tls.md#tlscreatesecurecontextoptions [`tls.createServer()`]: tls.md#tlscreateserveroptions-secureconnectionlistener [`url.format()`]: url.md#urlformaturlobject +[`url.format(urlString)`]: url.md#urlformaturlstring [`url.parse()`]: url.md#urlparseurlstring-parsequerystring-slashesdenotehost [`url.resolve()`]: url.md#urlresolvefrom-to [`util._extend()`]: util.md#util_extendtarget-source @@ -4478,6 +4601,7 @@ type of the readable half of the constructed readable-writable pair, use the [`zlib.bytesWritten`]: zlib.md#zlibbyteswritten [alloc]: buffer.md#static-method-bufferallocsize-fill-encoding [alloc_unsafe_size]: buffer.md#static-method-bufferallocunsafesize +[caveats of asynchronous customization hooks]: module.md#caveats-of-asynchronous-customization-hooks [from_arraybuffer]: buffer.md#static-method-bufferfromarraybuffer-byteoffset-length [from_string_encoding]: buffer.md#static-method-bufferfromstring-encoding [legacy URL API]: url.md#legacy-url-api diff --git a/doc/api/diagnostics_channel.md b/doc/api/diagnostics_channel.md index e955e1813f015b..8b63fa813eb313 100644 --- a/doc/api/diagnostics_channel.md +++ b/doc/api/diagnostics_channel.md @@ -1413,6 +1413,28 @@ added: v16.18.0 Emitted when a new process is created. +`tracing:child_process.spawn:start` + +* `process` {ChildProcess} +* `options` {Object} + +Emitted when [`child_process.spawn()`][] is invoked, before the process is +actually spawned. + +`tracing:child_process.spawn:end` + +* `process` {ChildProcess} + +Emitted when [`child_process.spawn()`][] has completed successfully and the +process has been created. + +`tracing:child_process.spawn:error` + +* `process` {ChildProcess} +* `error` {Error} + +Emitted when [`child_process.spawn()`][] encounters an error. + ##### Event: `'execve'` * `execPath` {string} @@ -1421,6 +1443,50 @@ Emitted when a new process is created. Emitted when [`process.execve()`][] is invoked. +#### Web Locks + +> Stability: 1 - Experimental + +<!-- YAML +added: REPLACEME +--> + +These channels are emitted for each [`locks.request()`][] call. See +[`worker_threads.locks`][] for details on Web Locks. + +##### Event: `'locks.request.start'` + +* `name` {string} The name of the requested lock resource. +* `mode` {string} The lock mode: `'exclusive'` or `'shared'`. + +Emitted when a lock request is initiated, before the lock is granted. + +##### Event: `'locks.request.grant'` + +* `name` {string} The name of the requested lock resource. +* `mode` {string} The lock mode: `'exclusive'` or `'shared'`. + +Emitted when a lock is successfully granted and the callback is about to run. + +##### Event: `'locks.request.miss'` + +* `name` {string} The name of the requested lock resource. +* `mode` {string} The lock mode: `'exclusive'` or `'shared'`. + +Emitted when `ifAvailable` is `true` and the lock is not immediately available, +and the request callback is invoked with `null` instead of a `Lock` object. + +##### Event: `'locks.request.end'` + +* `name` {string} The name of the requested lock resource. +* `mode` {string} The lock mode: `'exclusive'` or `'shared'`. +* `steal` {boolean} Whether the request uses steal semantics. +* `ifAvailable` {boolean} Whether the request uses ifAvailable semantics. +* `error` {Error|undefined} The error thrown by the callback, if any. + +Emitted when a lock request has finished, whether the callback succeeded, +threw an error, or the lock was stolen. + #### Worker Thread > Stability: 1 - Experimental @@ -1444,12 +1510,15 @@ Emitted when a new thread is created. [`channel.runStores(context, ...)`]: #channelrunstorescontext-fn-thisarg-args [`channel.subscribe(onMessage)`]: #channelsubscribeonmessage [`channel.unsubscribe(onMessage)`]: #channelunsubscribeonmessage +[`child_process.spawn()`]: child_process.md#child_processspawncommand-args-options [`diagnostics_channel.channel(name)`]: #diagnostics_channelchannelname [`diagnostics_channel.subscribe(name, onMessage)`]: #diagnostics_channelsubscribename-onmessage [`diagnostics_channel.tracingChannel()`]: #diagnostics_channeltracingchannelnameorchannels [`end` event]: #endevent [`error` event]: #errorevent +[`locks.request()`]: worker_threads.md#locksrequestname-options-callback [`net.Server.listen()`]: net.md#serverlisten [`process.execve()`]: process.md#processexecvefile-args-env [`start` event]: #startevent +[`worker_threads.locks`]: worker_threads.md#worker_threadslocks [context loss]: async_context.md#troubleshooting-context-loss diff --git a/doc/api/environment_variables.md b/doc/api/environment_variables.md index 114287251f91a2..ebaa5c9f5e86ef 100644 --- a/doc/api/environment_variables.md +++ b/doc/api/environment_variables.md @@ -18,10 +18,10 @@ For more details refer to the [`process.env` documentation][]. ## DotEnv -Set of utilities for dealing with additional environment variables defined in `.env` files. - > Stability: 2 - Stable +Set of utilities for dealing with additional environment variables defined in `.env` files. + ### .env files `.env` files (also known as dotenv files) are files that define environment variables, @@ -145,7 +145,7 @@ There following two functions allow you to directly interact with `.env` files: * [`process.loadEnvFile`][] loads an `.env` file and populates `process.env` with its variables -* [`util.parseEnv`][] parses the row content of an `.env` file and returns its value in an object +* [`util.parseEnv`][] parses the raw content of an `.env` file and returns its value in an object [CLI Environment Variables documentation]: cli.md#environment-variables_1 [`--env-file-if-exists=file`]: cli.md#--env-file-if-existsfile diff --git a/doc/api/esm.md b/doc/api/esm.md index 838e0810012ad5..c3377fc7c29a71 100644 --- a/doc/api/esm.md +++ b/doc/api/esm.md @@ -800,6 +800,15 @@ imports and they cannot be inspected via `WebAssembly.Module.imports(mod)` or virtualized unless recompiling the module using the direct `WebAssembly.compile` API with string builtins disabled. +String constants may also be imported from the `wasm:js/string-constants` builtin +import URL, allowing static JS string globals to be defined: + +```text +(module + (import "wasm:js/string-constants" "hello" (global $hello externref)) +) +``` + Importing a module in the source phase before it has been instantiated will also use the compile-time builtins automatically: @@ -1263,7 +1272,7 @@ _isImports_, _conditions_) > 2. If _source_ contains a top-level lexical declaration (`const`, `let`, > or `class`) of any of the CommonJS wrapper variables (`require`, > `exports`, `module`, `__filename`, or `__dirname`) then return **true**. -> 3. Else return **false**. +> 3. Return **false**. ### Customizing ESM specifier resolution algorithm diff --git a/doc/api/events.md b/doc/api/events.md index 47f378fafa2336..2b6d859c040354 100644 --- a/doc/api/events.md +++ b/doc/api/events.md @@ -1489,14 +1489,25 @@ foo(ee, 'foo', ac.signal); ac.abort(); // Prints: Waiting for the event was canceled! ``` -### Awaiting multiple events emitted on `process.nextTick()` +### Caveats when awaiting multiple events -There is an edge case worth noting when using the `events.once()` function -to await multiple events emitted on in the same batch of `process.nextTick()` -operations, or whenever multiple events are emitted synchronously. Specifically, -because the `process.nextTick()` queue is drained before the `Promise` microtask -queue, and because `EventEmitter` emits all events synchronously, it is possible -for `events.once()` to miss an event. +It is important to be aware of execution order when using the `events.once()` +method to await multiple events. + +Conventional event listeners are called synchronously when the event is +emitted. This guarantees that execution will not proceed beyond the emitted +event until all listeners have finished executing. + +The same is _not_ true when awaiting Promises returned by `events.once()`. +Promise tasks are not handled until after the current execution stack runs to +completion, which means that multiple events could be emitted before +asynchronous execution continues from the relevant `await` statement. + +As a result, events can be "missed" if a series of `await events.once()` +statements is used to listen to multiple events, since there might be times +where more than one event is emitted during the same phase of the event loop. +(The same is true when using `process.nextTick()` to emit events, because the +tasks queued by `process.nextTick()` are executed before Promise tasks.) ```mjs import { EventEmitter, once } from 'node:events'; @@ -1504,22 +1515,22 @@ import process from 'node:process'; const myEE = new EventEmitter(); -async function foo() { - await once(myEE, 'bar'); - console.log('bar'); - - // This Promise will never resolve because the 'foo' event will - // have already been emitted before the Promise is created. +async function listen() { await once(myEE, 'foo'); console.log('foo'); + + // This Promise will never resolve, because the 'bar' event will + // have already been emitted before the next line is executed. + await once(myEE, 'bar'); + console.log('bar'); } process.nextTick(() => { - myEE.emit('bar'); myEE.emit('foo'); + myEE.emit('bar'); }); -foo().then(() => console.log('done')); +listen().then(() => console.log('done')); ``` ```cjs @@ -1527,26 +1538,26 @@ const { EventEmitter, once } = require('node:events'); const myEE = new EventEmitter(); -async function foo() { - await once(myEE, 'bar'); - console.log('bar'); - - // This Promise will never resolve because the 'foo' event will - // have already been emitted before the Promise is created. +async function listen() { await once(myEE, 'foo'); console.log('foo'); + + // This Promise will never resolve, because the 'bar' event will + // have already been emitted before the next line is executed. + await once(myEE, 'bar'); + console.log('bar'); } process.nextTick(() => { - myEE.emit('bar'); myEE.emit('foo'); + myEE.emit('bar'); }); -foo().then(() => console.log('done')); +listen().then(() => console.log('done')); ``` -To catch both events, create each of the Promises _before_ awaiting either -of them, then it becomes possible to use `Promise.all()`, `Promise.race()`, +To catch multiple events, create all of the Promises _before_ awaiting any of +them. This is usually made easier by using `Promise.all()`, `Promise.race()`, or `Promise.allSettled()`: ```mjs @@ -1555,17 +1566,20 @@ import process from 'node:process'; const myEE = new EventEmitter(); -async function foo() { - await Promise.all([once(myEE, 'bar'), once(myEE, 'foo')]); +async function listen() { + await Promise.all([ + once(myEE, 'foo'), + once(myEE, 'bar'), + ]); console.log('foo', 'bar'); } process.nextTick(() => { - myEE.emit('bar'); myEE.emit('foo'); + myEE.emit('bar'); }); -foo().then(() => console.log('done')); +listen().then(() => console.log('done')); ``` ```cjs @@ -1573,17 +1587,20 @@ const { EventEmitter, once } = require('node:events'); const myEE = new EventEmitter(); -async function foo() { - await Promise.all([once(myEE, 'bar'), once(myEE, 'foo')]); +async function listen() { + await Promise.all([ + once(myEE, 'bar'), + once(myEE, 'foo'), + ]); console.log('foo', 'bar'); } process.nextTick(() => { - myEE.emit('bar'); myEE.emit('foo'); + myEE.emit('bar'); }); -foo().then(() => console.log('done')); +listen().then(() => console.log('done')); ``` ## `events.captureRejections` @@ -1889,15 +1906,12 @@ Returns a disposable so that it may be unsubscribed from more easily. const { addAbortListener } = require('node:events'); function example(signal) { - let disposable; - try { - signal.addEventListener('abort', (e) => e.stopImmediatePropagation()); - disposable = addAbortListener(signal, (e) => { - // Do something when signal is aborted. - }); - } finally { - disposable?.[Symbol.dispose](); - } + signal.addEventListener('abort', (e) => e.stopImmediatePropagation()); + // addAbortListener() returns a disposable, so the `using` keyword ensures + // the abort listener is automatically removed when this scope exits. + using _ = addAbortListener(signal, (e) => { + // Do something when signal is aborted. + }); } ``` @@ -1905,15 +1919,12 @@ function example(signal) { import { addAbortListener } from 'node:events'; function example(signal) { - let disposable; - try { - signal.addEventListener('abort', (e) => e.stopImmediatePropagation()); - disposable = addAbortListener(signal, (e) => { - // Do something when signal is aborted. - }); - } finally { - disposable?.[Symbol.dispose](); - } + signal.addEventListener('abort', (e) => e.stopImmediatePropagation()); + // addAbortListener() returns a disposable, so the `using` keyword ensures + // the abort listener is automatically removed when this scope exits. + using _ = addAbortListener(signal, (e) => { + // Do something when signal is aborted. + }); } ``` diff --git a/doc/api/fs.md b/doc/api/fs.md index 3b32cb5912d77c..18464b76a2da86 100644 --- a/doc/api/fs.md +++ b/doc/api/fs.md @@ -1720,6 +1720,9 @@ changes: * `options` {Object} * `bigint` {boolean} Whether the numeric values in the returned {fs.Stats} object should be `bigint`. **Default:** `false`. + * `throwIfNoEntry` {boolean} Whether an exception will be thrown + if no file system entry exists, rather than returning `undefined`. + **Default:** `true`. * Returns: {Promise} Fulfills with the {fs.Stats} object for the given `path`. @@ -4432,6 +4435,9 @@ changes: * `options` {Object} * `bigint` {boolean} Whether the numeric values in the returned {fs.Stats} object should be `bigint`. **Default:** `false`. + * `throwIfNoEntry` {boolean} Whether an exception will be thrown + if no file system entry exists, rather than returning `undefined`. + **Default:** `true`. * `callback` {Function} * `err` {Error} * `stats` {fs.Stats} @@ -7132,8 +7138,8 @@ added: v0.1.93 * Extends: {stream.Readable} -Instances of {fs.ReadStream} are created and returned using the -[`fs.createReadStream()`][] function. +Instances of {fs.ReadStream} cannot be constructed directly. They are created and +returned using the [`fs.createReadStream()`][] function. #### Event: `'close'` @@ -7903,8 +7909,8 @@ added: v0.1.93 * Extends {stream.Writable} -Instances of {fs.WriteStream} are created and returned using the -[`fs.createWriteStream()`][] function. +Instances of {fs.WriteStream} cannot be constructed directly. They are created and +returned using the [`fs.createWriteStream()`][] function. #### Event: `'close'` diff --git a/doc/api/globals.md b/doc/api/globals.md index 7b62b8ac871b6d..8b96e41bed3f36 100644 --- a/doc/api/globals.md +++ b/doc/api/globals.md @@ -21,6 +21,14 @@ The objects listed here are specific to Node.js. There are [built-in objects][] that are part of the JavaScript language itself, which are also globally accessible. +## `__dirname` + +This variable may appear to be global but is not. See [`__dirname`][]. + +## `__filename` + +This variable may appear to be global but is not. See [`__filename`][]. + ## Class: `AbortController` <!-- YAML @@ -77,7 +85,7 @@ added: * Type: {AbortSignal} -### Class: `AbortSignal` +## Class: `AbortSignal` <!-- YAML added: @@ -90,7 +98,7 @@ added: The `AbortSignal` is used to notify observers when the `abortController.abort()` method is called. -#### Static method: `AbortSignal.abort([reason])` +### Static method: `AbortSignal.abort([reason])` <!-- YAML added: @@ -109,7 +117,7 @@ changes: Returns a new already aborted `AbortSignal`. -#### Static method: `AbortSignal.timeout(delay)` +### Static method: `AbortSignal.timeout(delay)` <!-- YAML added: @@ -122,7 +130,7 @@ added: Returns a new `AbortSignal` which will be aborted in `delay` milliseconds. -#### Static method: `AbortSignal.any(signals)` +### Static method: `AbortSignal.any(signals)` <!-- YAML added: @@ -136,7 +144,7 @@ Returns a new `AbortSignal` which will be aborted if any of the provided signals are aborted. Its [`abortSignal.reason`][] will be set to whichever one of the `signals` caused it to be aborted. -#### Event: `'abort'` +### Event: `'abort'` <!-- YAML added: @@ -173,7 +181,7 @@ listener, use the `once()` method) to ensure that the event listener is removed as soon as the `'abort'` event is handled. Failure to do so may result in memory leaks. -#### `abortSignal.aborted` +### `abortSignal.aborted` <!-- YAML added: @@ -181,9 +189,11 @@ added: - v14.17.0 --> -* Type: {boolean} True after the `AbortController` has been aborted. +* Type: {boolean} + +True after the `AbortController` has been aborted. -#### `abortSignal.onabort` +### `abortSignal.onabort` <!-- YAML added: @@ -196,7 +206,7 @@ added: An optional callback function that may be set by user code to be notified when the `abortController.abort()` function has been called. -#### `abortSignal.reason` +### `abortSignal.reason` <!-- YAML added: @@ -214,7 +224,7 @@ ac.abort(new Error('boom!')); console.log(ac.signal.reason); // Error: boom! ``` -#### `abortSignal.throwIfAborted()` +### `abortSignal.throwIfAborted()` <!-- YAML added: @@ -224,46 +234,6 @@ added: If `abortSignal.aborted` is `true`, throws `abortSignal.reason`. -## Class: `Blob` - -<!-- YAML -added: v18.0.0 ---> - -See {Blob}. - -## Class: `Buffer` - -<!-- YAML -added: v0.1.103 ---> - -* Type: {Function} - -Used to handle binary data. See the [buffer section][]. - -## Class: `ByteLengthQueuingStrategy` - -<!-- YAML -added: v18.0.0 -changes: - - version: - - v23.11.0 - - v22.15.0 - pr-url: https://github.com/nodejs/node/pull/57510 - description: Marking the API stable. ---> - -A browser-compatible implementation of [`ByteLengthQueuingStrategy`][]. - -## `__dirname` - -This variable may appear to be global but is not. See [`__dirname`][]. - -## `__filename` - -This variable may appear to be global but is not. See [`__filename`][]. - ## `atob(data)` <!-- YAML @@ -280,6 +250,14 @@ An automated migration is available ([source](https://github.com/nodejs/userland npx codemod@latest @nodejs/buffer-atob-btoa ``` +## Class: `Blob` + +<!-- YAML +added: v18.0.0 +--> + +See {Blob}. + ## Class: `BroadcastChannel` <!-- YAML @@ -304,6 +282,30 @@ An automated migration is available ([source](https://github.com/nodejs/userland npx codemod@latest @nodejs/buffer-atob-btoa ``` +## Class: `Buffer` + +<!-- YAML +added: v0.1.103 +--> + +* Type: {Function} + +Used to handle binary data. See the [buffer section][]. + +## Class: `ByteLengthQueuingStrategy` + +<!-- YAML +added: v18.0.0 +changes: + - version: + - v23.11.0 + - v22.15.0 + pr-url: https://github.com/nodejs/node/pull/57510 + description: Marking the API stable. +--> + +A browser-compatible implementation of [`ByteLengthQueuingStrategy`][]. + ## `clearImmediate(immediateObject)` <!-- YAML @@ -472,6 +474,14 @@ changes: A browser-compatible implementation of [`DecompressionStream`][]. +## Class: `DOMException` + +<!-- YAML +added: v17.0.0 +--> + +The WHATWG {DOMException} class. + ## Class: `Event` <!-- YAML @@ -568,10 +578,10 @@ setGlobalDispatcher(new MyAgent()); The following globals are available to use with `fetch`: -* [`FormData`](https://nodejs.org/api/globals.html#class-formdata) -* [`Headers`](https://nodejs.org/api/globals.html#class-headers) -* [`Request`](https://nodejs.org/api/globals.html#request) -* [`Response`](https://nodejs.org/api/globals.html#response). +* [`FormData`][] +* [`Headers`][] +* [`Request`][] +* [`Response`][] ## Class: `File` @@ -741,7 +751,7 @@ console.log(`The preferred language of the Node.js instance has the tag '${navig added: v21.2.0 --> -* Type: {Array<string>} +* Type: {string\[]} The `navigator.languages` read-only property returns an array of strings representing the preferred languages of the Node.js instance. @@ -755,36 +765,6 @@ The fallback value on builds without ICU is `['en-US']`. console.log(`The preferred languages are '${navigator.languages}'`); ``` -### `navigator.platform` - -<!-- YAML -added: v21.2.0 ---> - -* Type: {string} - -The `navigator.platform` read-only property returns a string identifying the -platform on which the Node.js instance is running. - -```js -console.log(`This process is running on ${navigator.platform}`); -``` - -### `navigator.userAgent` - -<!-- YAML -added: v21.1.0 ---> - -* Type: {string} - -The `navigator.userAgent` read-only property returns user agent -consisting of the runtime name and major version number. - -```js -console.log(`The user-agent is ${navigator.userAgent}`); // Prints "Node.js/21" -``` - ### `navigator.locks` <!-- YAML @@ -834,6 +814,44 @@ navigator.locks.request('shared_resource', { mode: 'shared' }, async (lock) => { See [`worker_threads.locks`][] for detailed API documentation. +### `navigator.platform` + +<!-- YAML +added: v21.2.0 +--> + +* Type: {string} + +The `navigator.platform` read-only property returns a string identifying the +platform on which the Node.js instance is running. + +```js +console.log(`This process is running on ${navigator.platform}`); +``` + +### `navigator.userAgent` + +<!-- YAML +added: v21.1.0 +--> + +* Type: {string} + +The `navigator.userAgent` read-only property returns user agent +consisting of the runtime name and major version number. + +```js +console.log(`The user-agent is ${navigator.userAgent}`); // Prints "Node.js/21" +``` + +## `performance` + +<!-- YAML +added: v16.0.0 +--> + +The [`perf_hooks.performance`][] object. + ## Class: `PerformanceEntry` <!-- YAML @@ -884,14 +902,6 @@ added: v19.0.0 The `PerformanceResourceTiming` class. See [`PerformanceResourceTiming`][] for more details. -## `performance` - -<!-- YAML -added: v16.0.0 ---> - -The [`perf_hooks.performance`][] object. - ## `process` <!-- YAML @@ -1024,11 +1034,7 @@ changes: A browser-compatible implementation of [`ReadableStreamDefaultReader`][]. -## `require()` - -This variable may appear to be global but is not. See [`require()`][]. - -## Class: `Response` +## Class: `Request` <!-- YAML added: @@ -1044,9 +1050,13 @@ changes: description: No longer behind `--experimental-fetch` CLI flag. --> -A browser-compatible implementation of {Response}. +A browser-compatible implementation of {Request}. -## Class: `Request` +## `require()` + +This variable may appear to be global but is not. See [`require()`][]. + +## Class: `Response` <!-- YAML added: @@ -1062,7 +1072,7 @@ changes: description: No longer behind `--experimental-fetch` CLI flag. --> -A browser-compatible implementation of {Request}. +A browser-compatible implementation of {Response}. ## `sessionStorage` @@ -1138,14 +1148,6 @@ A browser-compatible implementation of {SubtleCrypto}. This global is available only if the Node.js binary was compiled with including support for the `node:crypto` module. -## Class: `DOMException` - -<!-- YAML -added: v17.0.0 ---> - -The WHATWG {DOMException} class. - ## Class: `TextDecoder` <!-- YAML @@ -1332,6 +1334,8 @@ A browser-compatible implementation of [`WritableStreamDefaultWriter`][]. [`CountQueuingStrategy`]: webstreams.md#class-countqueuingstrategy [`DecompressionStream`]: webstreams.md#class-decompressionstream [`EventTarget` and `Event` API]: events.md#eventtarget-and-event-api +[`FormData`]: #class-formdata +[`Headers`]: #class-headers [`LockManager`]: worker_threads.md#class-lockmanager [`MessageChannel`]: worker_threads.md#class-messagechannel [`MessagePort`]: worker_threads.md#class-messageport @@ -1347,6 +1351,8 @@ A browser-compatible implementation of [`WritableStreamDefaultWriter`][]. [`ReadableStreamDefaultController`]: webstreams.md#class-readablestreamdefaultcontroller [`ReadableStreamDefaultReader`]: webstreams.md#class-readablestreamdefaultreader [`ReadableStream`]: webstreams.md#class-readablestream +[`Request`]: #class-request +[`Response`]: #class-response [`TextDecoderStream`]: webstreams.md#class-textdecoderstream [`TextDecoder`]: util.md#class-utiltextdecoder [`TextEncoderStream`]: webstreams.md#class-textencoderstream diff --git a/doc/api/http.md b/doc/api/http.md index 91950b1ab8f39b..2d2b202e41baab 100644 --- a/doc/api/http.md +++ b/doc/api/http.md @@ -2298,8 +2298,8 @@ added: v0.7.5 When true, the Date header will be automatically generated and sent in the response if it is not already present in the headers. Defaults to true. -This should only be disabled for testing; HTTP requires the Date header -in responses. +This should only be disabled for testing; the Date header is required in +most HTTP responses (see [RFC 9110 Section 6.6.1][] for details). ### `response.setHeader(name, value)` @@ -4555,6 +4555,7 @@ const agent2 = new http.Agent({ proxyEnv: process.env }); [Built-in Proxy Support]: #built-in-proxy-support [RFC 8187]: https://www.rfc-editor.org/rfc/rfc8187.txt +[RFC 9110 Section 6.6.1]: https://www.rfc-editor.org/rfc/rfc9110#section-6.6.1 [`'ERR_HTTP_CONTENT_LENGTH_MISMATCH'`]: errors.md#err_http_content_length_mismatch [`'checkContinue'`]: #event-checkcontinue [`'finish'`]: #event-finish diff --git a/doc/api/http2.md b/doc/api/http2.md index e4a82f4a9642b0..d053c31342cd3b 100644 --- a/doc/api/http2.md +++ b/doc/api/http2.md @@ -2786,6 +2786,13 @@ Throws `ERR_INVALID_ARG_TYPE` for invalid `settings` argument. <!-- YAML added: v8.4.0 changes: + - version: REPLACEME + pr-url: https://github.com/nodejs/node/pull/59917 + description: Added the `strictSingleValueFields` option. + - version: REPLACEME + pr-url: https://github.com/nodejs/node/pull/61713 + description: Added `http1Options` option. The `Http1IncomingMessage` + and `Http1ServerResponse` options are now deprecated. - version: - v23.0.0 - v22.10.0 @@ -2904,9 +2911,27 @@ changes: * `Http1IncomingMessage` {http.IncomingMessage} Specifies the `IncomingMessage` class to used for HTTP/1 fallback. Useful for extending the original `http.IncomingMessage`. **Default:** `http.IncomingMessage`. + **Deprecated.** Use `http1Options.IncomingMessage` instead. See + [DEP0202][]. * `Http1ServerResponse` {http.ServerResponse} Specifies the `ServerResponse` class to used for HTTP/1 fallback. Useful for extending the original `http.ServerResponse`. **Default:** `http.ServerResponse`. + **Deprecated.** Use `http1Options.ServerResponse` instead. See + [DEP0202][]. + * `http1Options` {Object} An options object for configuring the HTTP/1 + fallback when `allowHTTP1` is `true`. These options are passed to the + underlying HTTP/1 server. See [`http.createServer()`][] for available + options. Among others, the following are supported: + * `IncomingMessage` {http.IncomingMessage} Specifies the + `IncomingMessage` class to use for HTTP/1 fallback. + **Default:** `http.IncomingMessage`. + * `ServerResponse` {http.ServerResponse} Specifies the `ServerResponse` + class to use for HTTP/1 fallback. + **Default:** `http.ServerResponse`. + * `keepAliveTimeout` {number} The number of milliseconds of inactivity + a server needs to wait for additional incoming data, after it has + finished writing the last response, before a socket will be destroyed. + **Default:** `5000`. * `Http2ServerRequest` {http2.Http2ServerRequest} Specifies the `Http2ServerRequest` class to use. Useful for extending the original `Http2ServerRequest`. @@ -2923,6 +2948,10 @@ changes: and trailing whitespace validation for HTTP/2 header field names and values as per [RFC-9113](https://www.rfc-editor.org/rfc/rfc9113.html#section-8.2.1). **Default:** `true`. + * `strictSingleValueFields` {boolean} If `true`, strict validation is used + for headers and trailers defined as having only a single value, such that + an error is thrown if multiple values are provided. + **Default:** `true`. * `...options` {Object} Any [`net.createServer()`][] option can be provided. * `onRequestHandler` {Function} See [Compatibility API][] * Returns: {Http2Server} @@ -2980,6 +3009,12 @@ server.listen(8000); <!-- YAML added: v8.4.0 changes: + - version: REPLACEME + pr-url: https://github.com/nodejs/node/pull/59917 + description: Added the `strictSingleValueFields` option. + - version: REPLACEME + pr-url: https://github.com/nodejs/node/pull/61713 + description: Added `http1Options` option. - version: - v15.10.0 - v14.16.0 @@ -3098,6 +3133,24 @@ changes: and trailing whitespace validation for HTTP/2 header field names and values as per [RFC-9113](https://www.rfc-editor.org/rfc/rfc9113.html#section-8.2.1). **Default:** `true`. + * `strictSingleValueFields` {boolean} If `true`, strict validation is used + for headers and trailers defined as having only a single value, such that + an error is thrown if multiple values are provided. + **Default:** `true`. + * `http1Options` {Object} An options object for configuring the HTTP/1 + fallback when `allowHTTP1` is `true`. These options are passed to the + underlying HTTP/1 server. See [`http.createServer()`][] for available + options. Among others, the following are supported: + * `IncomingMessage` {http.IncomingMessage} Specifies the + `IncomingMessage` class to use for HTTP/1 fallback. + **Default:** `http.IncomingMessage`. + * `ServerResponse` {http.ServerResponse} Specifies the `ServerResponse` + class to use for HTTP/1 fallback. + **Default:** `http.ServerResponse`. + * `keepAliveTimeout` {number} The number of milliseconds of inactivity + a server needs to wait for additional incoming data, after it has + finished writing the last response, before a socket will be destroyed. + **Default:** `5000`. * `onRequestHandler` {Function} See [Compatibility API][] * Returns: {Http2SecureServer} @@ -4927,6 +4980,7 @@ you need to implement any fall-back behavior yourself. [ALPN Protocol ID]: https://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml#alpn-protocol-ids [ALPN negotiation]: #alpn-negotiation [Compatibility API]: #compatibility-api +[DEP0202]: deprecations.md#dep0202-http1incomingmessage-and-http1serverresponse-options-of-http2-servers [HTTP/1]: http.md [HTTP/2]: https://tools.ietf.org/html/rfc7540 [HTTP/2 Headers Object]: #headers-object @@ -4953,6 +5007,7 @@ you need to implement any fall-back behavior yourself. [`Http2Stream`]: #class-http2stream [`ServerHttp2Stream`]: #class-serverhttp2stream [`TypeError`]: errors.md#class-typeerror +[`http.createServer()`]: http.md#httpcreateserveroptions-requestlistener [`http2.SecureServer`]: #class-http2secureserver [`http2.Server`]: #class-http2server [`http2.createSecureServer()`]: #http2createsecureserveroptions-onrequesthandler diff --git a/doc/api/module.md b/doc/api/module.md index 4904b9f172bef4..39487ac14ae485 100644 --- a/doc/api/module.md +++ b/doc/api/module.md @@ -178,6 +178,7 @@ isBuiltin('wss'); // false added: - v20.6.0 - v18.19.0 +deprecated: REPLACEME changes: - version: - v23.6.1 @@ -193,7 +194,7 @@ changes: description: Add support for WHATWG URL instances. --> -> Stability: 1.1 - Active development +> Stability: 0 - Deprecated: Use [`module.registerHooks()`][] instead. * `specifier` {string|URL} Customization hooks to be registered; this should be the same string that would be passed to `import()`, except that if it is @@ -234,9 +235,14 @@ changes: * `options` {Object} * `load` {Function|undefined} See [load hook][]. **Default:** `undefined`. * `resolve` {Function|undefined} See [resolve hook][]. **Default:** `undefined`. +* Returns: {Object} An object with the following property: + * `deregister()` {Function} Remove the registered hooks so that they are no + longer called. Hooks are otherwise retained for the lifetime of the running + process. Register [hooks][] that customize Node.js module resolution and loading behavior. -See [Customization hooks][]. +See [Customization hooks][]. The returned object can be used to +[deregister the hooks][deregistration of synchronous customization hooks]. ### `module.stripTypeScriptTypes(code[, options])` @@ -257,16 +263,20 @@ added: will be generated for the transformed code. * `sourceUrl` {string} Specifies the source url used in the source map. * Returns: {string} The code with type annotations stripped. - `module.stripTypeScriptTypes()` removes type annotations from TypeScript code. It - can be used to strip type annotations from TypeScript code before running it - with `vm.runInContext()` or `vm.compileFunction()`. - By default, it will throw an error if the code contains TypeScript features - that require transformation such as `Enums`, - see [type-stripping][] for more information. - When mode is `'transform'`, it also transforms TypeScript features to JavaScript, - see [transform TypeScript features][] for more information. - When mode is `'strip'`, source maps are not generated, because locations are preserved. - If `sourceMap` is provided, when mode is `'strip'`, an error will be thrown. + +`module.stripTypeScriptTypes()` removes type annotations from TypeScript code. It +can be used to strip type annotations from TypeScript code before running it +with `vm.runInContext()` or `vm.compileFunction()`. + +By default, it will throw an error if the code contains TypeScript features +that require transformation such as `Enums`, +see [type-stripping][] for more information. + +When mode is `'transform'`, it also transforms TypeScript features to JavaScript, +see [transform TypeScript features][] for more information. + +When mode is `'strip'`, source maps are not generated, because locations are preserved. +If `sourceMap` is provided, when mode is `'strip'`, an error will be thrown. _WARNING_: The output of this function should not be considered stable across Node.js versions, due to changes in the TypeScript parser. @@ -794,6 +804,63 @@ hook to signal that the chain is intentionally ending at your hook. If a hook should be applied when loading other hook modules, the other hook modules should be loaded after the hook is registered. +#### Deregistration of synchronous customization hooks + +The object returned by `registerHooks()` has a `deregister()` method that can be +used to remove the hooks from the chain. Once `deregister()` is called, the hooks +will no longer be invoked during module resolution or loading. + +This is currently only available for synchronous hooks registered via `registerHooks()`, not for asynchronous +hooks registered via `module.register()`. + +```mjs +import { registerHooks } from 'node:module'; + +const hooks = registerHooks({ + resolve(specifier, context, nextResolve) { + console.log('resolve hook called for', specifier); + return nextResolve(specifier, context); + }, + load(url, context, nextLoad) { + return nextLoad(url, context); + }, +}); + +// At this point, the hooks are active and will be called for +// any subsequent import() or require() calls. +await import('./my-module.mjs'); + +// Later, remove the hooks from the chain. +hooks.deregister(); + +// Subsequent loads will no longer trigger the hooks. +await import('./another-module.mjs'); +``` + +```cjs +const { registerHooks } = require('node:module'); + +const hooks = registerHooks({ + resolve(specifier, context, nextResolve) { + console.log('resolve hook called for', specifier); + return nextResolve(specifier, context); + }, + load(url, context, nextLoad) { + return nextLoad(url, context); + }, +}); + +// At this point, the hooks are active and will be called for +// any subsequent require() calls. +require('./my-module.cjs'); + +// Later, remove the hooks from the chain. +hooks.deregister(); + +// Subsequent loads will no longer trigger the hooks. +require('./another-module.cjs'); +``` + #### Hook functions accepted by `module.registerHooks()` <!-- YAML @@ -2025,6 +2092,7 @@ returned object contains the following keys: [asynchronous `resolve` hook]: #asynchronous-resolvespecifier-context-nextresolve [asynchronous hook functions]: #asynchronous-hooks-accepted-by-moduleregister [caveats of asynchronous customization hooks]: #caveats-of-asynchronous-customization-hooks +[deregistration of synchronous customization hooks]: #deregistration-of-synchronous-customization-hooks [hooks]: #customization-hooks [load hook]: #synchronous-loadurl-context-nextload [module compile cache]: #module-compile-cache diff --git a/doc/api/packages.md b/doc/api/packages.md index 09acf6af878821..f13ef8a3019cb1 100644 --- a/doc/api/packages.md +++ b/doc/api/packages.md @@ -1010,7 +1010,7 @@ added: v0.4.0 The `"main"` field defines the entry point of a package when imported by name via a `node_modules` lookup. Its value is a path. -When a package has an [`"exports"`][] field, this will take precedence over the +The [`"exports"`][] field, if it exists, takes precedence over the `"main"` field when importing the package by name. It also defines the script that is used when the [package directory is loaded diff --git a/doc/api/perf_hooks.md b/doc/api/perf_hooks.md index 6d11ae5ec9c08c..5c838da9b3f2db 100644 --- a/doc/api/perf_hooks.md +++ b/doc/api/perf_hooks.md @@ -2191,6 +2191,8 @@ const timedImport = performance.timerify(async (module) => { await timedImport('some-module'); ``` +<!-- eslint-disable no-global-assign --> + ```cjs 'use strict'; const { diff --git a/doc/api/quic.md b/doc/api/quic.md index 723c26c5bd0b99..5fc54450bc7b7f 100644 --- a/doc/api/quic.md +++ b/doc/api/quic.md @@ -519,7 +519,7 @@ added: v23.8.0 Sends an unreliable datagram to the remote peer, returning the datagram ID. If the datagram payload is specified as an `ArrayBufferView`, then ownership of -that view will be transfered to the underlying stream. +that view will be transferred to the underlying stream. ### `session.stats` @@ -1197,9 +1197,13 @@ True to enable TLS keylogging output. <!-- YAML added: v23.8.0 +changes: + - version: REPLACEME + pr-url: https://github.com/nodejs/node/pull/62335 + description: CryptoKey is no longer accepted. --> -* Type: {KeyObject|CryptoKey|KeyObject\[]|CryptoKey\[]} +* Type: {KeyObject|KeyObject\[]} The TLS crypto keys to use for sessions. diff --git a/doc/api/single-executable-applications.md b/doc/api/single-executable-applications.md index 5e92923f4d831e..b0f57a2efc81f6 100644 --- a/doc/api/single-executable-applications.md +++ b/doc/api/single-executable-applications.md @@ -459,6 +459,8 @@ This also ensures a more deterministic dependency graph. However, if a file based `require()` is still needed, that can also be achieved: +<!-- eslint-disable no-global-assign --> + ```js const { createRequire } = require('node:module'); require = createRequire(__filename); diff --git a/doc/api/sqlite.md b/doc/api/sqlite.md index cd1c3c38d8b2e9..3642ccbf8f1c47 100644 --- a/doc/api/sqlite.md +++ b/doc/api/sqlite.md @@ -5,6 +5,9 @@ <!-- YAML added: v22.5.0 changes: + - version: REPLACEME + pr-url: https://github.com/nodejs/node/pull/61262 + description: SQLite is now a release candidate. - version: - v23.4.0 - v22.13.0 @@ -12,7 +15,7 @@ changes: description: SQLite is no longer behind `--experimental-sqlite` but still experimental. --> -> Stability: 1.1 - Active development. +> Stability: 1.2 - Release candidate. <!-- source_link=lib/sqlite.js --> @@ -79,6 +82,29 @@ console.log(query.all()); // Prints: [ { key: 1, value: 'hello' }, { key: 2, value: 'world' } ] ``` +## Type conversion between JavaScript and SQLite + +When Node.js writes to or reads from SQLite, it is necessary to convert between +JavaScript data types and SQLite's [data types][]. Because JavaScript supports +more data types than SQLite, only a subset of JavaScript types are supported. +Attempting to write an unsupported data type to SQLite will result in an +exception. + +| Storage class | JavaScript to SQLite | SQLite to JavaScript | +| ------------- | -------------------------- | ------------------------------------- | +| `NULL` | {null} | {null} | +| `INTEGER` | {number} or {bigint} | {number} or {bigint} _(configurable)_ | +| `REAL` | {number} | {number} | +| `TEXT` | {string} | {string} | +| `BLOB` | {TypedArray} or {DataView} | {Uint8Array} | + +APIs that read values from SQLite have a configuration option that determines +whether `INTEGER` values are converted to `number` or `bigint` in JavaScript, +such as the `readBigInts` option for statements and the `useBigIntArguments` +option for user-defined functions. If Node.js reads an `INTEGER` value from +SQLite that is outside the JavaScript [safe integer][] range, and the option to +read BigInts is not enabled, then an `ERR_OUT_OF_RANGE` error will be thrown. + ## Class: `DatabaseSync` <!-- YAML @@ -153,6 +179,23 @@ changes: language features that allow ordinary SQL to deliberately corrupt the database file are disabled. The defensive flag can also be set using `enableDefensive()`. **Default:** `true`. + * `limits` {Object} Configuration for various SQLite limits. These limits + can be used to prevent excessive resource consumption when handling + potentially malicious input. See [Run-Time Limits][] and [Limit Constants][] + in the SQLite documentation for details. Default values are determined by + SQLite's compile-time defaults and may vary depending on how SQLite was + built. The following properties are supported: + * `length` {number} Maximum length of a string or BLOB. + * `sqlLength` {number} Maximum length of an SQL statement. + * `column` {number} Maximum number of columns. + * `exprDepth` {number} Maximum depth of an expression tree. + * `compoundSelect` {number} Maximum number of terms in a compound SELECT. + * `vdbeOp` {number} Maximum number of VDBE instructions. + * `functionArg` {number} Maximum number of function arguments. + * `attach` {number} Maximum number of attached databases. + * `likePatternLength` {number} Maximum length of a LIKE pattern. + * `variableNumber` {number} Maximum number of SQL variables. + * `triggerDepth` {number} Maximum trigger recursion depth. Constructs a new `DatabaseSync` instance. @@ -310,7 +353,7 @@ This method allows one or more SQL statements to be executed without returning any results. This method is useful when executing SQL statements read from a file. This method is a wrapper around [`sqlite3_exec()`][]. -### `database.function(name[, options], function)` +### `database.function(name[, options], fn)` <!-- YAML added: @@ -332,10 +375,10 @@ added: arguments (between zero and [`SQLITE_MAX_FUNCTION_ARG`][]). If `false`, `function` must be invoked with exactly `function.length` arguments. **Default:** `false`. -* `function` {Function} The JavaScript function to call when the SQLite - function is invoked. The return value of this function should be a valid - SQLite data type: see [Type conversion between JavaScript and SQLite][]. - The result defaults to `NULL` if the return value is `undefined`. +* `fn` {Function} The JavaScript function to call when the SQLite function is + invoked. The return value of this function should be a valid SQLite data type: + see [Type conversion between JavaScript and SQLite][]. The result defaults to + `NULL` if the return value is `undefined`. This method is used to create SQLite user-defined functions. This method is a wrapper around [`sqlite3_create_function_v2()`][]. @@ -434,6 +477,36 @@ added: v24.0.0 * Type: {boolean} Whether the database is currently within a transaction. This method is a wrapper around [`sqlite3_get_autocommit()`][]. +### `database.limits` + +<!-- YAML +added: REPLACEME +--> + +* Type: {Object} + +An object for getting and setting SQLite database limits at runtime. +Each property corresponds to an SQLite limit and can be read or written. + +```js +const db = new DatabaseSync(':memory:'); + +// Read current limit +console.log(db.limits.length); + +// Set a new limit +db.limits.sqlLength = 100000; + +// Reset a limit to its compile-time maximum +db.limits.sqlLength = Infinity; +``` + +Available properties: `length`, `sqlLength`, `column`, `exprDepth`, +`compoundSelect`, `vdbeOp`, `functionArg`, `attach`, `likePatternLength`, +`variableNumber`, `triggerDepth`. + +Setting a property to `Infinity` resets the limit to its compile-time maximum value. + ### `database.open()` <!-- YAML @@ -1123,22 +1196,6 @@ added: v24.9.0 Resets the LRU cache, clearing all stored prepared statements. -### Type conversion between JavaScript and SQLite - -When Node.js writes to or reads from SQLite it is necessary to convert between -JavaScript data types and SQLite's [data types][]. Because JavaScript supports -more data types than SQLite, only a subset of JavaScript types are supported. -Attempting to write an unsupported data type to SQLite will result in an -exception. - -| SQLite | JavaScript | -| --------- | -------------------------- | -| `NULL` | {null} | -| `INTEGER` | {number} or {bigint} | -| `REAL` | {number} | -| `TEXT` | {string} | -| `BLOB` | {TypedArray} or {DataView} | - ## `sqlite.backup(sourceDb, path[, options])` <!-- YAML @@ -1453,6 +1510,8 @@ callback function to indicate what type of operation is being authorized. [Changesets and Patchsets]: https://www.sqlite.org/sessionintro.html#changesets_and_patchsets [Constants Passed To The Conflict Handler]: https://www.sqlite.org/session/c_changeset_conflict.html [Constants Returned From The Conflict Handler]: https://www.sqlite.org/session/c_changeset_abort.html +[Limit Constants]: https://www.sqlite.org/c3ref/c_limit_attached.html +[Run-Time Limits]: https://www.sqlite.org/c3ref/limit.html [SQL injection]: https://en.wikipedia.org/wiki/SQL_injection [Type conversion between JavaScript and SQLite]: #type-conversion-between-javascript-and-sqlite [`ATTACH DATABASE`]: https://www.sqlite.org/lang_attach.html @@ -1499,3 +1558,4 @@ callback function to indicate what type of operation is being authorized. [in memory]: https://www.sqlite.org/inmemorydb.html [parameters are bound]: https://www.sqlite.org/c3ref/bind_blob.html [prepared statement]: https://www.sqlite.org/c3ref/stmt.html +[safe integer]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isSafeInteger diff --git a/doc/api/test.md b/doc/api/test.md index 2f0d73aeae9eb8..0da838f8de04f1 100644 --- a/doc/api/test.md +++ b/doc/api/test.md @@ -265,11 +265,12 @@ added: - v24.14.0 --> -This flips the pass/fail reporting for a specific test or suite: A flagged test/test-case must throw -in order to "pass"; a test/test-case that does not throw, fails. +This flips the pass/fail reporting for a specific test or suite: a flagged test +case must throw in order to pass, and a flagged test case that does not throw +fails. -In the following, `doTheThing()` returns _currently_ `false` (`false` does not equal `true`, causing -`strictEqual` to throw, so the test-case passes). +In each of the following, `doTheThing()` fails to return `true`, but since the +tests are flagged `expectFailure`, they pass. ```js it.expectFailure('should do the thing', () => { @@ -279,6 +280,46 @@ it.expectFailure('should do the thing', () => { it('should do the thing', { expectFailure: true }, () => { assert.strictEqual(doTheThing(), true); }); + +it('should do the thing', { expectFailure: 'feature not implemented' }, () => { + assert.strictEqual(doTheThing(), true); +}); +``` + +If the value of `expectFailure` is a {RegExp|Function|Object|Error} +the tests will pass only if they throw a matching value. +See [`assert.throws`][] for how each value type is handled. + +Each of the following tests fails _despite_ being flagged `expectFailure` +because the failure does not match the specific **expected** failure. + +```js +it('fails because regex does not match', { + expectFailure: /expected message/, +}, () => { + throw new Error('different message'); +}); + +it('fails because object matcher does not match', { + expectFailure: { code: 'ERR_EXPECTED' }, +}, () => { + const err = new Error('boom'); + err.code = 'ERR_ACTUAL'; + throw err; +}); +``` + +To supply both a reason and specific error for `expectFailure`, use `{ label, match }`. + +```js +it('should fail with specific error and reason', { + expectFailure: { + label: 'reason for failure', + match: /error message/, + }, +}, () => { + assert.strictEqual(doTheThing(), true); +}); ``` `skip` and/or `todo` are mutually exclusive to `expectFailure`, and `skip` or `todo` @@ -1684,6 +1725,14 @@ changes: thread. If `false`, only one test runs at a time. If unspecified, subtests inherit this value from their parent. **Default:** `false`. + * `expectFailure` {boolean|string|RegExp|Function|Object|Error} If truthy, the + test is expected to fail. If a non-empty string is provided, that string is displayed + in the test results as the reason why the test is expected to fail. If a {RegExp|Function|Object|Error} + is provided directly (without wrapping in `{ match: … }`), the test passes + only if the thrown error matches, following the behavior of + [`assert.throws`][]. To provide both a reason and validation, pass an object + with `label` (string) and `match` (RegExp, Function, Object, or Error). + **Default:** `false`. * `only` {boolean} If truthy, and the test context is configured to run `only` tests, then this test will be run. Otherwise, the test is skipped. **Default:** `false`. @@ -2428,16 +2477,32 @@ changes: generates a new mock module. If `true`, subsequent calls will return the same module mock, and the mock module is inserted into the CommonJS cache. **Default:** false. + * `exports` {Object} Optional mocked exports. The `default` property, if + provided, is used as the mocked module's default export. All other own + enumerable properties are used as named exports. + **This option cannot be used with `defaultExport` or `namedExports`.** + * If the mock is a CommonJS or builtin module, `exports.default` is used as + the value of `module.exports`. + * If `exports.default` is not provided for a CommonJS or builtin mock, + `module.exports` defaults to an empty object. + * If named exports are provided with a non-object default export, the mock + throws an exception when used as a CommonJS or builtin module. * `defaultExport` {any} An optional value used as the mocked module's default export. If this value is not provided, ESM mocks do not include a default export. If the mock is a CommonJS or builtin module, this setting is used as the value of `module.exports`. If this value is not provided, CJS and builtin mocks use an empty object as the value of `module.exports`. + **This option cannot be used with `options.exports`.** + This option is deprecated and will be removed in a later version. + Prefer `options.exports.default`. * `namedExports` {Object} An optional object whose keys and values are used to create the named exports of the mock module. If the mock is a CommonJS or builtin module, these values are copied onto `module.exports`. Therefore, if a mock is created with both named exports and a non-object default export, the mock will throw an exception when used as a CJS or builtin module. + **This option cannot be used with `options.exports`.** + This option is deprecated and will be removed in a later version. + Prefer `options.exports`. * Returns: {MockModuleContext} An object that can be used to manipulate the mock. This function is used to mock the exports of ECMAScript modules, CommonJS modules, JSON modules, and @@ -2445,14 +2510,19 @@ Node.js builtin modules. Any references to the original module prior to mocking order to enable module mocking, Node.js must be started with the [`--experimental-test-module-mocks`][] command-line flag. +**Note**: [module customization hooks][] registered via the **synchronous** API effect resolution of +the `specifier` provided to `mock.module`. Customization hooks registered via the **asynchronous** +API are currently ignored (because the test runner's loader is synchronous, and node does not +support multi-chain / cross-chain loading). + The following example demonstrates how a mock is created for a module. ```js test('mocks a builtin module in both module systems', async (t) => { - // Create a mock of 'node:readline' with a named export named 'fn', which + // Create a mock of 'node:readline' with a named export named 'foo', which // does not exist in the original 'node:readline' module. const mock = t.mock.module('node:readline', { - namedExports: { fn() { return 42; } }, + exports: { foo: () => 42 }, }); let esmImpl = await import('node:readline'); @@ -3343,6 +3413,32 @@ This event is guaranteed to be emitted in the same order as the tests are defined. The corresponding execution ordered event is `'test:complete'`. +### Event: `'test:interrupted'` + +<!-- YAML +added: REPLACEME +--> + +* `data` {Object} + * `tests` {Array} An array of objects containing information about the + interrupted tests. + * `column` {number|undefined} The column number where the test is defined, + or `undefined` if the test was run through the REPL. + * `file` {string|undefined} The path of the test file, + `undefined` if test was run through the REPL. + * `line` {number|undefined} The line number where the test is defined, or + `undefined` if the test was run through the REPL. + * `name` {string} The test name. + * `nesting` {number} The nesting level of the test. + +Emitted when the test runner is interrupted by a `SIGINT` signal (e.g., when +pressing <kbd>Ctrl</kbd>+<kbd>C</kbd>). The event contains information about +the tests that were running at the time of interruption. + +When using process isolation (the default), the test name will be the file path +since the parent runner only knows about file-level tests. When using +`--test-isolation=none`, the actual test name is shown. + ### Event: `'test:pass'` * `data` {Object} @@ -3773,6 +3869,39 @@ added: v25.0.0 Number of times the test has been attempted. +### `context.workerId` + +<!-- YAML +added: REPLACEME +--> + +* Type: {number|undefined} + +The unique identifier of the worker running the current test file. This value is +derived from the `NODE_TEST_WORKER_ID` environment variable. When running tests +with `--test-isolation=process` (the default), each test file runs in a separate +child process and is assigned a worker ID from 1 to N, where N is the number of +concurrent workers. When running with `--test-isolation=none`, all tests run in +the same process and the worker ID is always 1. This value is `undefined` when +not running in a test context. + +This property is useful for splitting resources (like database connections or +server ports) across concurrent test files: + +```mjs +import { test } from 'node:test'; +import { process } from 'node:process'; + +test('database operations', async (t) => { + // Worker ID is available via context + console.log(`Running in worker ${t.workerId}`); + + // Or via environment variable (available at import time) + const workerId = process.env.NODE_TEST_WORKER_ID; + // Use workerId to allocate separate resources per worker +}); +``` + ### `context.plan(count[,options])` <!-- YAML @@ -4117,6 +4246,7 @@ Can be used to abort test subtasks when the test has been aborted. [`NODE_V8_COVERAGE`]: cli.md#node_v8_coveragedir [`SuiteContext`]: #class-suitecontext [`TestContext`]: #class-testcontext +[`assert.throws`]: assert.md#assertthrowsfn-error-message [`context.diagnostic`]: #contextdiagnosticmessage [`context.skip`]: #contextskipmessage [`context.todo`]: #contexttodomessage @@ -4130,6 +4260,7 @@ Can be used to abort test subtasks when the test has been aborted. [configuration files]: cli.md#--experimental-config-fileconfig [describe options]: #describename-options-fn [it options]: #testname-options-fn +[module customization hooks]: module.md#customization-hooks [running tests from the command line]: #running-tests-from-the-command-line [stream.compose]: stream.md#streamcomposestreams [subtests]: #subtests diff --git a/doc/api/typescript.md b/doc/api/typescript.md index 1c37e4cd21816b..017f80e9c67007 100644 --- a/doc/api/typescript.md +++ b/doc/api/typescript.md @@ -138,11 +138,10 @@ The most prominent features that require transformation are: * `Enum` declarations * `namespace` with runtime code -* legacy `module` with runtime code * parameter properties * import aliases -`namespaces` and `module` that do not contain runtime code are supported. +`namespace`s that do not contain runtime code are supported. This example will work correctly: ```ts diff --git a/doc/api/url.md b/doc/api/url.md index 662db7dfa30cd8..3dc955cf997c21 100644 --- a/doc/api/url.md +++ b/doc/api/url.md @@ -1833,7 +1833,7 @@ changes: `url.format(urlString)` is shorthand for `url.format(url.parse(urlString))`. -Because it invokes the deprecated [`url.parse()`][], passing a string argument +Because it invokes the deprecated [`url.parse()`][] internally, passing a string argument to `url.format()` is itself deprecated. Canonicalizing a URL string can be performed using the WHATWG URL API, by @@ -1950,6 +1950,10 @@ npx codemod@latest @nodejs/node-url-to-whatwg-url <!-- YAML added: v0.1.25 changes: + - version: + - v24.0.0 + pr-url: https://github.com/nodejs/node/pull/55017 + description: Deprecated again through DEP0169. - version: - v15.13.0 - v14.17.0 @@ -1973,6 +1977,8 @@ changes: contains a hostname. --> +> Stability: 0 - Deprecated: Use the WHATWG URL API instead. + * `from` {string} The base URL to use if `to` is a relative URL. * `to` {string} The target URL to resolve. @@ -1986,6 +1992,8 @@ url.resolve('http://example.com/', '/one'); // 'http://example.com/one' url.resolve('http://example.com/one', '/two'); // 'http://example.com/two' ``` +Because it invokes the deprecated [`url.parse()`][] internally, `url.resolve()` is itself deprecated. + To achieve the same result using the WHATWG URL API: ```js diff --git a/doc/api/util.md b/doc/api/util.md index ff224f175f27c5..a798d4befa4559 100644 --- a/doc/api/util.md +++ b/doc/api/util.md @@ -89,25 +89,27 @@ callbackFunction((err, ret) => { }); ``` -## `util.convertProcessSignalToExitCode(signalCode)` +## `util.convertProcessSignalToExitCode(signal)` <!-- YAML added: v24.14.0 --> -* `signalCode` {string} A signal name (e.g., `'SIGTERM'`, `'SIGKILL'`). -* Returns: {number|null} The exit code, or `null` if the signal is invalid. +* `signal` {string} A signal name (e.g. `'SIGTERM'`) +* Returns: {number} The exit code corresponding to `signal` The `util.convertProcessSignalToExitCode()` method converts a signal name to its corresponding POSIX exit code. Following the POSIX standard, the exit code for a process terminated by a signal is calculated as `128 + signal number`. +If `signal` is not a valid signal name, then an error will be thrown. See +[`signal(7)`][] for a list of valid signals. + ```mjs import { convertProcessSignalToExitCode } from 'node:util'; console.log(convertProcessSignalToExitCode('SIGTERM')); // 143 (128 + 15) console.log(convertProcessSignalToExitCode('SIGKILL')); // 137 (128 + 9) -console.log(convertProcessSignalToExitCode('INVALID')); // null ``` ```cjs @@ -115,7 +117,6 @@ const { convertProcessSignalToExitCode } = require('node:util'); console.log(convertProcessSignalToExitCode('SIGTERM')); // 143 (128 + 15) console.log(convertProcessSignalToExitCode('SIGKILL')); // 137 (128 + 9) -console.log(convertProcessSignalToExitCode('INVALID')); // null ``` This is particularly useful when working with processes to determine @@ -3835,6 +3836,7 @@ npx codemod@latest @nodejs/util-is [`mime.toString()`]: #mimetostring [`mimeParams.entries()`]: #mimeparamsentries [`napi_create_external()`]: n-api.md#napi_create_external +[`signal(7)`]: https://man7.org/linux/man-pages/man7/signal.7.html [`target` and `handler`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy#terminology [`tty.hasColors()`]: tty.md#writestreamhascolorscount-env [`util.diff()`]: #utildiffactual-expected diff --git a/doc/api/vm.md b/doc/api/vm.md index 91cc862071b9ef..16cc536c8818c8 100644 --- a/doc/api/vm.md +++ b/doc/api/vm.md @@ -25,23 +25,42 @@ object. The invoked code treats any property in the context like a global variable. Any changes to global variables caused by the invoked code are reflected in the context object. -```js -const vm = require('node:vm'); +```mjs +import { createContext, runInContext } from 'node:vm'; + +const x = 1; + +const context = { x: 2 }; +createContext(context); // Contextify the object. + +const code = 'x += 40; var y = 17;'; +// `x` and `y` are global variables in the context. +// Initially, x has the value 2 because that is the value of context.x. +runInContext(code, context); + +console.log(context.x); // 42 +console.log(context.y); // 17 + +console.log(x); // 1; y is not defined +``` + +```cjs +const { createContext, runInContext } = require('node:vm'); const x = 1; const context = { x: 2 }; -vm.createContext(context); // Contextify the object. +createContext(context); // Contextify the object. const code = 'x += 40; var y = 17;'; // `x` and `y` are global variables in the context. // Initially, x has the value 2 because that is the value of context.x. -vm.runInContext(code, context); +runInContext(code, context); console.log(context.x); // 42 console.log(context.y); // 17 -console.log(x); // 1; y is not defined. +console.log(x); // 1; y is not defined ``` ## Class: `vm.Script` @@ -201,17 +220,36 @@ The following example compiles code that increments a global variable, sets the value of another global variable, then execute the code multiple times. The globals are contained in the `context` object. -```js -const vm = require('node:vm'); +```mjs +import { createContext, Script } from 'node:vm'; const context = { animal: 'cat', count: 2, }; -const script = new vm.Script('count += 1; name = "kitty";'); +const script = new Script('count += 1; name = "kitty";'); -vm.createContext(context); +createContext(context); +for (let i = 0; i < 10; ++i) { + script.runInContext(context); +} + +console.log(context); +// Prints: { animal: 'cat', count: 12, name: 'kitty' } +``` + +```cjs +const { createContext, Script } = require('node:vm'); + +const context = { + animal: 'cat', + count: 2, +}; + +const script = new Script('count += 1; name = "kitty";'); + +createContext(context); for (let i = 0; i < 10; ++i) { script.runInContext(context); } @@ -296,10 +334,30 @@ The following example compiles code that sets a global variable, then executes the code multiple times in different contexts. The globals are set on and contained within each individual `context`. -```js -const vm = require('node:vm'); +```mjs +import { constants, Script } from 'node:vm'; + +const script = new Script('globalVar = "set"'); + +const contexts = [{}, {}, {}]; +contexts.forEach((context) => { + script.runInNewContext(context); +}); + +console.log(contexts); +// Prints: [{ globalVar: 'set' }, { globalVar: 'set' }, { globalVar: 'set' }] + +// This would throw if the context is created from a contextified object. +// constants.DONT_CONTEXTIFY allows creating contexts with ordinary +// global objects that can be frozen. +const freezeScript = new Script('Object.freeze(globalThis); globalThis;'); +const frozenContext = freezeScript.runInNewContext(constants.DONT_CONTEXTIFY); +``` + +```cjs +const { constants, Script } = require('node:vm'); -const script = new vm.Script('globalVar = "set"'); +const script = new Script('globalVar = "set"'); const contexts = [{}, {}, {}]; contexts.forEach((context) => { @@ -310,10 +368,10 @@ console.log(contexts); // Prints: [{ globalVar: 'set' }, { globalVar: 'set' }, { globalVar: 'set' }] // This would throw if the context is created from a contextified object. -// vm.constants.DONT_CONTEXTIFY allows creating contexts with ordinary +// constants.DONT_CONTEXTIFY allows creating contexts with ordinary // global objects that can be frozen. -const freezeScript = new vm.Script('Object.freeze(globalThis); globalThis;'); -const frozenContext = freezeScript.runInNewContext(vm.constants.DONT_CONTEXTIFY); +const freezeScript = new Script('Object.freeze(globalThis); globalThis;'); +const frozenContext = freezeScript.runInNewContext(constants.DONT_CONTEXTIFY); ``` ### `script.runInThisContext([options])` @@ -347,12 +405,28 @@ _does_ have access to the current `global` object. The following example compiles code that increments a `global` variable then executes that code multiple times: -```js -const vm = require('node:vm'); +```mjs +import { Script } from 'node:vm'; global.globalVar = 0; -const script = new vm.Script('globalVar += 1', { filename: 'myfile.vm' }); +const script = new Script('globalVar += 1', { filename: 'myfile.vm' }); + +for (let i = 0; i < 1000; ++i) { + script.runInThisContext(); +} + +console.log(globalVar); + +// 1000 +``` + +```cjs +const { Script } = require('node:vm'); + +global.globalVar = 0; + +const script = new Script('globalVar += 1', { filename: 'myfile.vm' }); for (let i = 0; i < 1000; ++i) { script.runInThisContext(); @@ -1118,16 +1192,40 @@ defined in the WebIDL specification. The purpose of synthetic modules is to provide a generic interface for exposing non-JavaScript sources to ECMAScript module graphs. -```js -const vm = require('node:vm'); +```mjs +import { SyntheticModule } from 'node:vm'; + +const source = '{ "a": 1 }'; +const syntheticModule = new SyntheticModule(['default'], function() { + const obj = JSON.parse(source); + this.setExport('default', obj); +}); + +// Use `syntheticModule` in linking +(async () => { + await syntheticModule.link(() => {}); + await syntheticModule.evaluate(); + + console.log('Default export:', syntheticModule.namespace.default); +})(); +``` + +```cjs +const { SyntheticModule } = require('node:vm'); const source = '{ "a": 1 }'; -const module = new vm.SyntheticModule(['default'], function() { +const syntheticModule = new SyntheticModule(['default'], function() { const obj = JSON.parse(source); this.setExport('default', obj); }); -// Use `module` in linking... +// Use `syntheticModule` in linking +(async () => { + await syntheticModule.link(() => {}); + await syntheticModule.evaluate(); + + console.log('Default export:', syntheticModule.namespace.default); +})(); ``` ### `new vm.SyntheticModule(exportNames, evaluateCallback[, options])` @@ -1383,15 +1481,32 @@ existing properties but also having the built-in objects and functions any standard [global object][] has. Outside of scripts run by the vm module, global variables will remain unchanged. -```js -const vm = require('node:vm'); +```mjs +import { createContext, runInContext } from 'node:vm'; + +global.globalVar = 3; + +const context = { globalVar: 1 }; +createContext(context); + +runInContext('globalVar *= 2;', context); + +console.log(context); +// Prints: { globalVar: 2 } + +console.log(global.globalVar); +// Prints: 3 +``` + +```cjs +const { createContext, runInContext } = require('node:vm'); global.globalVar = 3; const context = { globalVar: 1 }; -vm.createContext(context); +createContext(context); -vm.runInContext('globalVar *= 2;', context); +runInContext('globalVar *= 2;', context); console.log(context); // Prints: { globalVar: 2 } @@ -1466,45 +1581,62 @@ memory reachable by each V8 specific contexts in the current instance of the V8 engine, while the result of `v8.getHeapSpaceStatistics()` measure the memory occupied by each heap space in the current V8 instance. -```js -const vm = require('node:vm'); +```mjs +import { createContext, measureMemory } from 'node:vm'; // Measure the memory used by the main context. -vm.measureMemory({ mode: 'summary' }) +measureMemory({ mode: 'summary' }) // This is the same as vm.measureMemory() .then((result) => { // The current format is: // { - // total: { - // jsMemoryEstimate: 2418479, jsMemoryRange: [ 2418479, 2745799 ] - // } + // total: { jsMemoryEstimate: 1601828, jsMemoryRange: [1601828, 5275288] }, + // WebAssembly: { code: 0, metadata: 33962 }, // } console.log(result); }); -const context = vm.createContext({ a: 1 }); -vm.measureMemory({ mode: 'detailed', execution: 'eager' }) +const context = createContext({ a: 1 }); +measureMemory({ mode: 'detailed', execution: 'eager' }).then((result) => { + // Reference the context here so that it won't be GC'ed + // until the measurement is complete. + console.log('Context:', context.a); + // { + // total: { jsMemoryEstimate: 1767100, jsMemoryRange: [1767100, 5440560] }, + // WebAssembly: { code: 0, metadata: 33962 }, + // current: { jsMemoryEstimate: 1601828, jsMemoryRange: [1601828, 5275288] }, + // other: [{ jsMemoryEstimate: 165272, jsMemoryRange: [Array] }], + // } + console.log(result); +}); +``` + +```cjs +const { createContext, measureMemory } = require('node:vm'); +// Measure the memory used by the main context. +measureMemory({ mode: 'summary' }) + // This is the same as vm.measureMemory() .then((result) => { - // Reference the context here so that it won't be GC'ed - // until the measurement is complete. - console.log(context.a); + // The current format is: // { - // total: { - // jsMemoryEstimate: 2574732, - // jsMemoryRange: [ 2574732, 2904372 ] - // }, - // current: { - // jsMemoryEstimate: 2438996, - // jsMemoryRange: [ 2438996, 2768636 ] - // }, - // other: [ - // { - // jsMemoryEstimate: 135736, - // jsMemoryRange: [ 135736, 465376 ] - // } - // ] + // total: { jsMemoryEstimate: 1601828, jsMemoryRange: [1601828, 5275288] }, + // WebAssembly: { code: 0, metadata: 33962 }, // } console.log(result); }); + +const context = createContext({ a: 1 }); +measureMemory({ mode: 'detailed', execution: 'eager' }).then((result) => { + // Reference the context here so that it won't be GC'ed + // until the measurement is complete. + console.log('Context:', context.a); + // { + // total: { jsMemoryEstimate: 1767100, jsMemoryRange: [1767100, 5440560] }, + // WebAssembly: { code: 0, metadata: 33962 }, + // current: { jsMemoryEstimate: 1601828, jsMemoryRange: [1601828, 5275288] }, + // other: [{ jsMemoryEstimate: 165272, jsMemoryRange: [Array] }], + // } + console.log(result); +}); ``` ## `vm.runInContext(code, contextifiedObject[, options])` @@ -1571,14 +1703,27 @@ If `options` is a string, then it specifies the filename. The following example compiles and executes different scripts using a single [contextified][] object: -```js -const vm = require('node:vm'); +```mjs +import { createContext, runInContext } from 'node:vm'; const contextObject = { globalVar: 1 }; -vm.createContext(contextObject); +createContext(contextObject); for (let i = 0; i < 10; ++i) { - vm.runInContext('globalVar *= 2;', contextObject); + runInContext('globalVar *= 2;', contextObject); +} +console.log(contextObject); +// Prints: { globalVar: 1024 } +``` + +```cjs +const { createContext, runInContext } = require('node:vm'); + +const contextObject = { globalVar: 1 }; +createContext(contextObject); + +for (let i = 0; i < 10; ++i) { + runInContext('globalVar *= 2;', contextObject); } console.log(contextObject); // Prints: { globalVar: 1024 } @@ -1678,32 +1823,56 @@ It does several things at once: 1. Creates a new context. 2. If `contextObject` is an object, [contextifies][contextified] it with the new context. - If `contextObject` is undefined, creates a new object and [contextifies][contextified] it. + If `contextObject` is undefined, creates a new object and [contextifies][contextified] it. If `contextObject` is [`vm.constants.DONT_CONTEXTIFY`][], don't [contextify][contextified] anything. -3. Compiles the code as a`vm.Script` -4. Runs the compield code within the created context. The code does not have access to the scope in +3. Compiles the code as a `vm.Script` +4. Runs the compiled code within the created context. The code does not have access to the scope in which this method is called. 5. Returns the result. The following example compiles and executes code that increments a global variable and sets a new one. These globals are contained in the `contextObject`. -```js -const vm = require('node:vm'); +```mjs +import { runInNewContext, constants } from 'node:vm'; + +const contextObject = { + animal: 'cat', + count: 2, +}; + +runInNewContext('count += 1; name = "kitty"', contextObject); +console.log(contextObject); +// Prints: { animal: 'cat', count: 3, name: 'kitty' } + +// This would throw if the context is created from a contextified object. +// vm.constants.DONT_CONTEXTIFY allows creating contexts with ordinary global objects that +// can be frozen. +const frozenContext = runInNewContext( + 'Object.freeze(globalThis); globalThis;', + constants.DONT_CONTEXTIFY, +); +``` + +```cjs +const { runInNewContext, constants } = require('node:vm'); const contextObject = { animal: 'cat', count: 2, }; -vm.runInNewContext('count += 1; name = "kitty"', contextObject); +runInNewContext('count += 1; name = "kitty"', contextObject); console.log(contextObject); // Prints: { animal: 'cat', count: 3, name: 'kitty' } // This would throw if the context is created from a contextified object. // vm.constants.DONT_CONTEXTIFY allows creating contexts with ordinary global objects that // can be frozen. -const frozenContext = vm.runInNewContext('Object.freeze(globalThis); globalThis;', vm.constants.DONT_CONTEXTIFY); +const frozenContext = runInNewContext( + 'Object.freeze(globalThis); globalThis;', + constants.DONT_CONTEXTIFY, +); ``` ## `vm.runInThisContext(code[, options])` @@ -1770,11 +1939,26 @@ the JavaScript [`eval()`][] function to run the same code: <!-- eslint-disable prefer-const --> -```js -const vm = require('node:vm'); +```mjs +import { runInThisContext } from 'node:vm'; let localVar = 'initial value'; -const vmResult = vm.runInThisContext('localVar = "vm";'); +const vmResult = runInThisContext('localVar = "vm";'); +console.log(`vmResult: '${vmResult}', localVar: '${localVar}'`); +// Prints: vmResult: 'vm', localVar: 'initial value' + +const evalResult = eval('localVar = "eval";'); +console.log(`evalResult: '${evalResult}', localVar: '${localVar}'`); +// Prints: evalResult: 'eval', localVar: 'eval' +``` + +<!-- eslint-disable prefer-const --> + +```cjs +const { runInThisContext } = require('node:vm'); +let localVar = 'initial value'; + +const vmResult = runInThisContext('localVar = "vm";'); console.log(`vmResult: '${vmResult}', localVar: '${localVar}'`); // Prints: vmResult: 'vm', localVar: 'initial value' @@ -1799,15 +1983,17 @@ In order to run a simple web server using the `node:http` module the code passed to the context must either call `require('node:http')` on its own, or have a reference to the `node:http` module passed to it. For instance: -```js -'use strict'; -const vm = require('node:vm'); +```mjs +import { runInThisContext } from 'node:vm'; +import { createRequire } from 'node:module'; + +const require = createRequire(import.meta.url); const code = ` ((require) => { - const http = require('node:http'); + const { createServer } = require('node:http'); - http.createServer((request, response) => { + createServer((request, response) => { response.writeHead(200, { 'Content-Type': 'text/plain' }); response.end('Hello World\\n'); }).listen(8124); @@ -1815,7 +2001,25 @@ const code = ` console.log('Server running at http://127.0.0.1:8124/'); })`; -vm.runInThisContext(code)(require); +runInThisContext(code)(require); +``` + +```cjs +const { runInThisContext } = require('node:vm'); + +const code = ` +((require) => { + const { createServer } = require('node:http'); + + createServer((request, response) => { + response.writeHead(200, { 'Content-Type': 'text/plain' }); + response.end('Hello World\\n'); + }).listen(8124); + + console.log('Server running at http://127.0.0.1:8124/'); +})`; + +runInThisContext(code)(require); ``` The `require()` in the above case shares the state with the context it is @@ -1843,19 +2047,34 @@ The contextifying would introduce some quirks to the `globalThis` value in the c For example, it cannot be frozen, and it is not reference equal to the `contextObject` in the outer context. -```js -const vm = require('node:vm'); +```mjs +import { createContext, runInContext } from 'node:vm'; // An undefined `contextObject` option makes the global object contextified. -const context = vm.createContext(); -console.log(vm.runInContext('globalThis', context) === context); // false +const context = createContext(); +console.log(runInContext('globalThis', context) === context); // false // A contextified global object cannot be frozen. try { - vm.runInContext('Object.freeze(globalThis);', context); + runInContext('Object.freeze(globalThis);', context); } catch (e) { - console.log(e); // TypeError: Cannot freeze + console.log(`${e.constructor.name}: ${e.message}`); // TypeError: Cannot freeze } -console.log(vm.runInContext('globalThis.foo = 1; foo;', context)); // 1 +console.log(runInContext('globalThis.foo = 1; foo;', context)); // 1 +``` + +```cjs +const { createContext, runInContext } = require('node:vm'); + +// An undefined `contextObject` option makes the global object contextified. +const context = createContext(); +console.log(runInContext('globalThis', context) === context); // false +// A contextified global object cannot be frozen. +try { + runInContext('Object.freeze(globalThis);', context); +} catch (e) { + console.log(`${e.constructor.name}: ${e.message}`); // TypeError: Cannot freeze +} +console.log(runInContext('globalThis.foo = 1; foo;', context)); // 1 ``` To create a context with an ordinary global object and get access to a global proxy in @@ -1869,16 +2088,29 @@ a context without wrapping its global object with another object in a Node.js-sp As a result, the `globalThis` value inside the new context would behave more closely to an ordinary one. -```js -const vm = require('node:vm'); +```mjs +import { createContext, runInContext, constants } from 'node:vm'; // Use vm.constants.DONT_CONTEXTIFY to freeze the global object. -const context = vm.createContext(vm.constants.DONT_CONTEXTIFY); -vm.runInContext('Object.freeze(globalThis);', context); +const context = createContext(constants.DONT_CONTEXTIFY); +runInContext('Object.freeze(globalThis);', context); try { - vm.runInContext('bar = 1; bar;', context); + runInContext('bar = 1; bar;', context); } catch (e) { - console.log(e); // Uncaught ReferenceError: bar is not defined + console.log(`${e.constructor.name}: ${e.message}`); // ReferenceError: bar is not defined +} +``` + +```cjs +const { createContext, runInContext, constants } = require('node:vm'); + +// Use vm.constants.DONT_CONTEXTIFY to freeze the global object. +const context = createContext(constants.DONT_CONTEXTIFY); +runInContext('Object.freeze(globalThis);', context); +try { + runInContext('bar = 1; bar;', context); +} catch (e) { + console.log(`${e.constructor.name}: ${e.message}`); // ReferenceError: bar is not defined } ``` @@ -1887,27 +2119,51 @@ the returned object is a proxy-like object to the global object in the newly cre fewer Node.js-specific quirks. It is reference equal to the `globalThis` value in the new context, can be modified from outside the context, and can be used to access built-ins in the new context directly. -```js -const vm = require('node:vm'); +```mjs +import { createContext, runInContext, constants } from 'node:vm'; + +const context = createContext(constants.DONT_CONTEXTIFY); + +// Returned object is reference equal to globalThis in the new context. +console.log(runInContext('globalThis', context) === context); // true + +// Can be used to access globals in the new context directly. +console.log(context.Array); // [Function: Array] +runInContext('foo = 1;', context); +console.log(context.foo); // 1 +context.bar = 1; +console.log(runInContext('bar;', context)); // 1 + +// Can be frozen and it affects the inner context. +Object.freeze(context); +try { + runInContext('baz = 1; baz;', context); +} catch (e) { + console.log(`${e.constructor.name}: ${e.message}`); // ReferenceError: baz is not defined +} +``` -const context = vm.createContext(vm.constants.DONT_CONTEXTIFY); +```cjs +const { createContext, runInContext, constants } = require('node:vm'); + +const context = createContext(constants.DONT_CONTEXTIFY); // Returned object is reference equal to globalThis in the new context. -console.log(vm.runInContext('globalThis', context) === context); // true +console.log(runInContext('globalThis', context) === context); // true // Can be used to access globals in the new context directly. console.log(context.Array); // [Function: Array] -vm.runInContext('foo = 1;', context); +runInContext('foo = 1;', context); console.log(context.foo); // 1 context.bar = 1; -console.log(vm.runInContext('bar;', context)); // 1 +console.log(runInContext('bar;', context)); // 1 // Can be frozen and it affects the inner context. Object.freeze(context); try { - vm.runInContext('baz = 1; baz;', context); + runInContext('baz = 1; baz;', context); } catch (e) { - console.log(e); // Uncaught ReferenceError: baz is not defined + console.log(`${e.constructor.name}: ${e.message}`); // ReferenceError: baz is not defined } ``` @@ -1923,34 +2179,65 @@ For example, the following code executed by `vm.runInNewContext()` with a timeout of 5 milliseconds schedules an infinite loop to run after a promise resolves. The scheduled loop is never interrupted by the timeout: -```js -const vm = require('node:vm'); +```mjs +import { runInNewContext } from 'node:vm'; + +function loop() { + console.log('entering loop'); + while (1) console.log(Date.now()); +} + +runInNewContext( + 'Promise.resolve().then(() => loop());', + { loop, console }, + { timeout: 5 }, +); +// This is printed *before* 'entering infinite loop' (!) +console.log('done executing'); +``` + +```cjs +const { runInNewContext } = require('node:vm'); function loop() { console.log('entering loop'); while (1) console.log(Date.now()); } -vm.runInNewContext( +runInNewContext( 'Promise.resolve().then(() => loop());', { loop, console }, { timeout: 5 }, ); -// This is printed *before* 'entering loop' (!) +// This is printed *before* 'entering infinite loop' (!) console.log('done executing'); ``` This can be addressed by passing `microtaskMode: 'afterEvaluate'` to the code that creates the `Context`: -```js -const vm = require('node:vm'); +```mjs +import { runInNewContext } from 'node:vm'; + +function loop() { + while (1) console.log(Date.now()); +} + +runInNewContext( + 'Promise.resolve().then(() => loop());', + { loop, console }, + { timeout: 5, microtaskMode: 'afterEvaluate' }, +); +``` + +```cjs +const { runInNewContext } = require('node:vm'); function loop() { while (1) console.log(Date.now()); } -vm.runInNewContext( +runInNewContext( 'Promise.resolve().then(() => loop());', { loop, console }, { timeout: 5, microtaskMode: 'afterEvaluate' }, @@ -1987,15 +2274,12 @@ flow of the outer context is disrupted in a surprising way: the log statement is never executed. ```mjs -import * as vm from 'node:vm'; +import { createContext, runInContext } from 'node:vm'; -const inner_context = vm.createContext({}, { microtaskMode: 'afterEvaluate' }); +const inner_context = createContext({}, { microtaskMode: 'afterEvaluate' }); // runInContext() returns a Promise created in the inner context. -const inner_promise = vm.runInContext( - 'Promise.resolve()', - context, -); +const inner_promise = runInContext('Promise.resolve()', inner_context); // As part of performing `await`, the JavaScript runtime must enqueue a task // on the microtask queue of the context where `inner_promise` was created. @@ -2009,6 +2293,28 @@ await inner_promise; console.log('this will NOT be printed'); ``` +```cjs +const { createContext, runInContext } = require('node:vm'); + +// runInContext() returns a Promise created in the inner context. +const inner_context = createContext({}, { microtaskMode: 'afterEvaluate' }); + +(async () => { + const inner_promise = runInContext('Promise.resolve()', inner_context); + + // As part of performing `await`, the JavaScript runtime must enqueue a task + // on the microtask queue of the context where `inner_promise` was created. + // A task is added on the inner microtask queue, but **it will not be run + // automatically**: this task will remain pending indefinitely. + // + // Since the outer microtask queue is empty, execution in the outer module + // falls through, and the log statement below is never executed. + await inner_promise; + + console.log('this will NOT be printed'); +})(); +``` + To successfully share promises between contexts with different microtask queues, it is necessary to ensure that tasks on the inner microtask queue will be run **whenever** the outer context enqueues a task on the inner microtask queue. diff --git a/doc/api/webcrypto.md b/doc/api/webcrypto.md index c72e15b3fd053e..f249dab5b92049 100644 --- a/doc/api/webcrypto.md +++ b/doc/api/webcrypto.md @@ -1279,6 +1279,10 @@ The {CryptoKey} (secret key) generating algorithms supported include: <!-- YAML added: v15.0.0 changes: + - version: REPLACEME + pr-url: https://github.com/nodejs/node/pull/62218 + description: Importing ML-DSA and ML-KEM PKCS#8 keys + without a seed is no longer supported. - version: v24.8.0 pr-url: https://github.com/nodejs/node/pull/59647 description: KMAC algorithms are now supported. diff --git a/doc/contributing/collaborator-guide.md b/doc/contributing/collaborator-guide.md index 6f2e400d440181..99b3ec84b3b9e0 100644 --- a/doc/contributing/collaborator-guide.md +++ b/doc/contributing/collaborator-guide.md @@ -387,6 +387,12 @@ undergo deprecation. The exceptions to this rule are: * Changes to errors thrown by dependencies of Node.js, such as V8. * One-time exceptions granted by the TSC. +Experimental and undocumented APIs are not considered stable, therefore are +typically removed without a deprecation cycle. However, if such API has gotten +some non-trivial adoption in the ecosystem, it (or a subset of it) can undergo +deprecation – at which point, changes to that API (or at least, its deprecated +subset) should follow [semantic versioning][] rules. + For more information, see [Deprecations](#deprecations). #### Breaking changes to internal elements @@ -526,8 +532,8 @@ the three Deprecation levels. Documentation-Only Deprecations can land in a minor release. They can not change to a Runtime Deprecation until the next major release. -No API can change to End-of-Life without going through a Runtime Deprecation -cycle. There is no rule that deprecated code must progress to End-of-Life. +No deprecated APIs can change to End-of-Life without going through a Runtime +Deprecation cycle. There is no rule that deprecated code must progress to End-of-Life. Documentation-Only and Runtime Deprecations can remain in place for an unlimited duration. @@ -1059,6 +1065,7 @@ need to be attached anymore, as only important bugfixes will be included. [node-core-utils-issues]: https://github.com/nodejs/node-core-utils/issues [ppc]: https://github.com/orgs/nodejs/teams/platform-ppc [s390]: https://github.com/orgs/nodejs/teams/platform-s390 +[semantic versioning]: https://semver.org/ [smartos]: https://github.com/orgs/nodejs/teams/platform-smartos [unreliable tests]: https://github.com/nodejs/node/issues?q=is%3Aopen+is%3Aissue+label%3A%22CI+%2F+flaky+test%22 [windows]: https://github.com/orgs/nodejs/teams/platform-windows diff --git a/doc/contributing/feature-request-management.md b/doc/contributing/feature-request-management.md index 9331164314fb0e..bb2ecd9d99660b 100644 --- a/doc/contributing/feature-request-management.md +++ b/doc/contributing/feature-request-management.md @@ -1,13 +1,15 @@ # Feature request management -Feature requests are a valuable source of input to the project. -They help our maintainers understand what additions will be of -value to users of the Node.js runtime. - -At the same time, the project is volunteer run and does not -have the ability to direct resources toward specific work. The -features which are implemented are those for which volunteers -are individually motivated to work on. The best way to ensure +Feature requests are not a valuable source of input for the project. +It is usually more productive to first send the Pull Request implementing the +feature, even imperfectly, and let the discussion happen during code review. +That being said, the project still welcomes feature request issues, either for +features you cannot and/or won't implement yourself, or if you need more input +from the community before starting the work. + +The project is volunteer run and does not have the ability to direct resources +toward specific work. The features which are implemented are those for which +volunteers are individually motivated to work on. The best way to ensure a feature gets implemented is to create a PR to add it. The project strives to support people who do that. diff --git a/doc/contributing/releases.md b/doc/contributing/releases.md index adbe8c80c3d806..81ab323ec89b44 100644 --- a/doc/contributing/releases.md +++ b/doc/contributing/releases.md @@ -314,14 +314,14 @@ git checkout -b v1.2.3-proposal upstream/v1.x-staging You can also run: ```bash -git node release -S --prepare --security --filterLabel vX.x +git node release -S --prepare --security=../vulnerabilities.json --filterLabel vX.x ``` Example: ```bash git checkout v20.x -git node release -S --prepare --security --filterLabel v20.x +git node release -S --prepare --security=../vulnerabilities.json --filterLabel v20.x ``` to automate the remaining steps until step 6 or you can perform it manually @@ -329,7 +329,7 @@ following the below steps. For semver-minors, you can pass the new version explicitly with `--newVersion` arg: ```bash -git node release -S --prepare --security --filterLabel v20.x --newVersion 20.20.0 +git node release -S --prepare --security=../vulnerabilities.json --filterLabel v20.x --newVersion 20.20.0 ``` <details> diff --git a/doc/contributing/security-release-process.md b/doc/contributing/security-release-process.md index 1107edc5a68976..ba7dbae378f730 100644 --- a/doc/contributing/security-release-process.md +++ b/doc/contributing/security-release-process.md @@ -39,6 +39,7 @@ The current security stewards are documented in the main Node.js | NodeSource | Rafael | 2025-May-14 | | NodeSource | Rafael | 2025-Jul-15 | | HeroDevs and NodeSource | Marco / Rafael | 2026-Jan-13 | +| NodeSource | Rafael | 2026-Mar-24 | | Datadog | Bryan | | | IBM | Joe | | | Platformatic | Matteo | | diff --git a/eslint.config.mjs b/eslint.config.mjs index ef11ccb28cab08..fb6f9623587583 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -20,6 +20,7 @@ const { default: js } = await importEslintTool('@eslint/js'); const { default: babelEslintParser } = await importEslintTool('@babel/eslint-parser'); const babelPluginSyntaxImportSource = resolveEslintTool('@babel/plugin-syntax-import-source'); const { default: jsdoc } = await importEslintTool('eslint-plugin-jsdoc'); +const { default: regexpPlugin } = await importEslintTool('eslint-plugin-regexp'); const { default: markdown } = await importEslintTool('@eslint/markdown'); const { default: stylisticJs } = await importEslintTool('@stylistic/eslint-plugin'); @@ -84,11 +85,11 @@ export default [ // #region general config js.configs.recommended, jsdoc.configs['flat/recommended'], + regexpPlugin.configs.recommended, { - files: ['**/*.{js,cjs}'], + files: ['**/*.js'], languageOptions: { - // The default is `commonjs` but it's not supported by the Babel parser. - sourceType: 'script', + sourceType: 'commonjs', }, }, { @@ -101,7 +102,6 @@ export default [ parser: babelEslintParser, parserOptions: { babelOptions: { - parserOpts: { createImportExpressions: true }, plugins: [ babelPluginSyntaxImportSource, ], @@ -229,6 +229,7 @@ export default [ ...noRestrictedSyntaxCommonLib, ], 'no-self-compare': 'error', + 'no-shadow-restricted-names': ['error', { reportGlobalThis: false }], 'no-template-curly-in-string': 'error', 'no-throw-literal': 'error', 'no-undef': ['error', { typeof: true }], @@ -256,6 +257,7 @@ export default [ // ESLint recommended rules that we disable. 'no-inner-declarations': 'off', + 'no-useless-assignment': 'off', // JSDoc rules. 'jsdoc/require-jsdoc': 'off', @@ -275,6 +277,42 @@ export default [ 'jsdoc/reject-any-type': 'off', 'jsdoc/reject-function-type': 'off', + // RegExp recommended rules that we disable. + // Todo: Investigate which rules should be enabled. + 'prefer-regex-literals': 'off', + 'regexp/control-character-escape': 'off', + 'regexp/match-any': 'off', + 'regexp/negation': 'off', + 'regexp/no-contradiction-with-assertion': 'off', + 'regexp/no-dupe-characters-character-class': 'off', + 'regexp/no-dupe-disjunctions': 'off', + 'regexp/no-empty-alternative': 'off', + 'regexp/no-legacy-features': 'off', + 'regexp/no-misleading-capturing-group': 'off', + 'regexp/no-obscure-range': 'off', + 'regexp/no-potentially-useless-backreference': 'off', + 'regexp/no-super-linear-backtracking': 'off', + 'regexp/no-trivially-nested-quantifier': 'off', + 'regexp/no-unused-capturing-group': 'off', + 'regexp/no-useless-assertions': 'off', + 'regexp/no-useless-character-class': 'off', + 'regexp/no-useless-escape': 'off', + 'regexp/no-useless-flag': 'off', + 'regexp/no-useless-lazy': 'off', + 'regexp/no-useless-non-capturing-group': 'off', + 'regexp/no-useless-quantifier': 'off', + 'regexp/no-useless-range': 'off', + 'regexp/optimal-lookaround-quantifier': 'off', + 'regexp/optimal-quantifier-concatenation': 'off', + 'regexp/prefer-character-class': 'off', + 'regexp/prefer-d': 'off', + 'regexp/prefer-question-quantifier': 'off', + 'regexp/prefer-star-quantifier': 'off', + 'regexp/prefer-w': 'off', + 'regexp/sort-flags': 'off', + 'regexp/strict': 'off', + 'regexp/use-ignore-case': 'off', + // Stylistic rules. '@stylistic/js/arrow-parens': 'error', '@stylistic/js/arrow-spacing': 'error', diff --git a/lib/_http_client.js b/lib/_http_client.js index ee4f47be64ab3c..c14e899dabbf04 100644 --- a/lib/_http_client.js +++ b/lib/_http_client.js @@ -27,6 +27,7 @@ const { Error, NumberIsFinite, ObjectAssign, + ObjectDefineProperty, ObjectKeys, ObjectSetPrototypeOf, ReflectApply, @@ -116,6 +117,7 @@ let debug = require('internal/util/debuglog').debuglog('http', (fn) => { const INVALID_PATH_REGEX = /[^\u0021-\u00ff]/; const kError = Symbol('kError'); +const kPath = Symbol('kPath'); const kLenientAll = HTTPParser.kLenientAll | 0; const kLenientNone = HTTPParser.kLenientNone | 0; @@ -303,7 +305,7 @@ function ClientRequest(input, options, cb) { this.joinDuplicateHeaders = options.joinDuplicateHeaders; - this.path = options.path || '/'; + this[kPath] = options.path || '/'; if (cb) { this.once('response', cb); } @@ -446,6 +448,22 @@ function ClientRequest(input, options, cb) { ObjectSetPrototypeOf(ClientRequest.prototype, OutgoingMessage.prototype); ObjectSetPrototypeOf(ClientRequest, OutgoingMessage); +ObjectDefineProperty(ClientRequest.prototype, 'path', { + __proto__: null, + get() { + return this[kPath]; + }, + set(value) { + const path = String(value); + if (INVALID_PATH_REGEX.test(path)) { + throw new ERR_UNESCAPED_CHARACTERS('Request path'); + } + this[kPath] = path; + }, + configurable: true, + enumerable: true, +}); + ClientRequest.prototype._finish = function _finish() { OutgoingMessage.prototype._finish.call(this); if (hasObserver('http')) { @@ -571,7 +589,7 @@ function socketErrorListener(err) { if (req) { // For Safety. Some additional errors might fire later on // and we need to make sure we don't double-fire the error event. - req.socket._hadError = true; + socket._hadError = true; emitErrorEvent(req, err); } @@ -870,7 +888,11 @@ function responseOnTimeout() { function requestOnFinish() { const req = this; - if (req.shouldKeepAlive && req._ended) + // If the response ends before this request finishes writing, `responseOnEnd()` + // already released the socket. When `finish` fires later, that socket may + // belong to a different request, so only call `responseKeepAlive()` when the + // original request is still alive (`!req.destroyed`). + if (req.shouldKeepAlive && req._ended && !req.destroyed) responseKeepAlive(req); } @@ -906,7 +928,6 @@ function tickOnSocket(req, socket) { parser.joinDuplicateHeaders = req.joinDuplicateHeaders; parser.onIncoming = parserOnIncomingClient; - socket.on('error', socketErrorListener); socket.on('data', socketOnData); socket.on('end', socketOnEnd); socket.on('close', socketCloseListener); @@ -945,8 +966,15 @@ function listenSocketTimeout(req) { } ClientRequest.prototype.onSocket = function onSocket(socket, err) { - // TODO(ronag): Between here and onSocketNT the socket - // has no 'error' handler. + // Attach the error listener synchronously so that any errors emitted on + // the socket before onSocketNT runs (e.g. from a blocklist check or other + // next-tick error) are forwarded to the request and can be caught by the + // user's error handler. socketErrorListener requires socket._httpMessage + // to be set so we set it here too. + if (socket && !err) { + socket._httpMessage = this; + socket.on('error', socketErrorListener); + } process.nextTick(onSocketNT, this, socket, err); }; @@ -958,8 +986,10 @@ function onSocketNT(req, socket, err) { if (!req.aborted && !err) { err = new ConnResetException('socket hang up'); } - // ERR_PROXY_TUNNEL is handled by the proxying logic - if (err && err.code !== 'ERR_PROXY_TUNNEL') { + // ERR_PROXY_TUNNEL is handled by the proxying logic. + // Skip if the error was already emitted by the early socketErrorListener. + if (err && err.code !== 'ERR_PROXY_TUNNEL' && + !socket?._hadError) { emitErrorEvent(req, err); } req._closed = true; diff --git a/lib/_http_common.js b/lib/_http_common.js index 019b73a1ff225e..3c389ba054decc 100644 --- a/lib/_http_common.js +++ b/lib/_http_common.js @@ -189,8 +189,8 @@ function freeParser(parser, req, socket) { if (parser) { if (parser._consumed) parser.unconsume(); - cleanParser(parser); parser.remove(); + cleanParser(parser); if (parsers.free(parser) === false) { // Make sure the parser's stack has unwound before deleting the // corresponding C++ object through .close(). diff --git a/lib/_http_server.js b/lib/_http_server.js index 50b6ca17822883..a50ed683170334 100644 --- a/lib/_http_server.js +++ b/lib/_http_server.js @@ -53,6 +53,8 @@ const { kUniqueHeaders, parseUniqueHeadersOption, OutgoingMessage, + validateHeaderName, + validateHeaderValue, } = require('_http_outgoing'); const { kOutHeaders, @@ -330,13 +332,20 @@ ServerResponse.prototype.writeEarlyHints = function writeEarlyHints(hints, cb) { return; } + if (checkInvalidHeaderChar(link)) { + throw new ERR_INVALID_CHAR('header content', 'Link'); + } + head += 'Link: ' + link + '\r\n'; const keys = ObjectKeys(hints); for (let i = 0; i < keys.length; i++) { const key = keys[i]; if (key !== 'link') { - head += key + ': ' + hints[key] + '\r\n'; + validateHeaderName(key); + const value = hints[key]; + validateHeaderValue(key, value); + head += key + ': ' + value + '\r\n'; } } @@ -574,12 +583,6 @@ function Server(options, requestListener) { storeHTTPOptions.call(this, options); - // Optional buffer added to the keep-alive timeout when setting socket timeouts. - // Helps reduce ECONNRESET errors from clients by extending the internal timeout. - // Default is 1000ms if not specified. - const buf = options.keepAliveTimeoutBuffer; - this.keepAliveTimeoutBuffer = - (typeof buf === 'number' && NumberIsFinite(buf) && buf >= 0) ? buf : 1000; net.Server.call( this, { allowHalfOpen: true, noDelay: options.noDelay ?? true, diff --git a/lib/buffer.js b/lib/buffer.js index c43f2a2f4a36f9..5124d60fe01099 100644 --- a/lib/buffer.js +++ b/lib/buffer.js @@ -50,7 +50,7 @@ const { TypedArrayPrototypeGetByteOffset, TypedArrayPrototypeGetLength, TypedArrayPrototypeSet, - TypedArrayPrototypeSlice, + TypedArrayPrototypeSubarray, Uint8Array, Uint8ArrayPrototype, } = primordials; @@ -384,28 +384,33 @@ Buffer.copyBytesFrom = function copyBytesFrom(view, offset, length) { return new FastBuffer(); } - if (offset !== undefined || length !== undefined) { - if (offset !== undefined) { - validateInteger(offset, 'offset', 0); - if (offset >= viewLength) return new FastBuffer(); - } else { - offset = 0; - } - let end; - if (length !== undefined) { - validateInteger(length, 'length', 0); - end = offset + length; - } else { - end = viewLength; - } + let start = 0; + let end = viewLength; + + if (offset !== undefined) { + validateInteger(offset, 'offset', 0); + if (offset >= viewLength) return new FastBuffer(); + start = offset; + } - view = TypedArrayPrototypeSlice(view, offset, end); + if (length !== undefined) { + validateInteger(length, 'length', 0); + // The old code used TypedArrayPrototypeSlice which clamps internally. + end = MathMin(start + length, viewLength); } + if (end <= start) return new FastBuffer(); + + const viewByteLength = TypedArrayPrototypeGetByteLength(view); + const elementSize = viewByteLength / viewLength; + const srcByteOffset = TypedArrayPrototypeGetByteOffset(view) + + start * elementSize; + const srcByteLength = (end - start) * elementSize; + return fromArrayLike(new Uint8Array( TypedArrayPrototypeGetBuffer(view), - TypedArrayPrototypeGetByteOffset(view), - TypedArrayPrototypeGetByteLength(view))); + srcByteOffset, + srcByteLength)); }; // Identical to the built-in %TypedArray%.of(), but avoids using the deprecated @@ -562,14 +567,15 @@ function fromArrayBuffer(obj, byteOffset, length) { } function fromArrayLike(obj) { - if (obj.length <= 0) + const { length } = obj; + if (length <= 0) return new FastBuffer(); - if (obj.length < (Buffer.poolSize >>> 1)) { - if (obj.length > (poolSize - poolOffset)) + if (length < (Buffer.poolSize >>> 1)) { + if (length > (poolSize - poolOffset)) createPool(); - const b = new FastBuffer(allocPool, poolOffset, obj.length); + const b = new FastBuffer(allocPool, poolOffset, length); TypedArrayPrototypeSet(b, obj, 0); - poolOffset += obj.length; + poolOffset += length; alignPool(); return b; } @@ -626,25 +632,55 @@ Buffer.concat = function concat(list, length) { if (length === undefined) { length = 0; for (let i = 0; i < list.length; i++) { - if (list[i].length) { - length += list[i].length; + const buf = list[i]; + if (!isUint8Array(buf)) { + // TODO(BridgeAR): This should not be of type ERR_INVALID_ARG_TYPE. + // Instead, find the proper error code for this. + throw new ERR_INVALID_ARG_TYPE( + `list[${i}]`, ['Buffer', 'Uint8Array'], buf); } + length += TypedArrayPrototypeGetByteLength(buf); } - } else { - validateOffset(length, 'length'); + + const buffer = allocate(length); + let pos = 0; + for (let i = 0; i < list.length; i++) { + const buf = list[i]; + const bufLength = TypedArrayPrototypeGetByteLength(buf); + TypedArrayPrototypeSet(buffer, buf, pos); + pos += bufLength; + } + + if (pos < length) { + TypedArrayPrototypeFill(buffer, 0, pos, length); + } + return buffer; } - const buffer = Buffer.allocUnsafe(length); - let pos = 0; + validateOffset(length, 'length'); for (let i = 0; i < list.length; i++) { - const buf = list[i]; - if (!isUint8Array(buf)) { + if (!isUint8Array(list[i])) { // TODO(BridgeAR): This should not be of type ERR_INVALID_ARG_TYPE. // Instead, find the proper error code for this. throw new ERR_INVALID_ARG_TYPE( `list[${i}]`, ['Buffer', 'Uint8Array'], list[i]); } - pos += _copyActual(buf, buffer, pos, 0, buf.length, true); + } + + const buffer = allocate(length); + let pos = 0; + for (let i = 0; i < list.length; i++) { + const buf = list[i]; + const bufLength = TypedArrayPrototypeGetByteLength(buf); + if (pos + bufLength > length) { + TypedArrayPrototypeSet(buffer, + TypedArrayPrototypeSubarray(buf, 0, length - pos), + pos); + pos = length; + break; + } + TypedArrayPrototypeSet(buffer, buf, pos); + pos += bufLength; } // Note: `length` is always equal to `buffer.length` at this point @@ -713,11 +749,7 @@ const encodingOps = { write: asciiWrite, slice: asciiSlice, indexOf: (buf, val, byteOffset, dir) => - indexOfBuffer(buf, - fromStringFast(val, encodingOps.ascii), - byteOffset, - encodingsMap.ascii, - dir), + indexOfString(buf, val, byteOffset, encodingsMap.ascii, dir), }, base64: { encoding: 'base64', @@ -878,17 +910,17 @@ Buffer.prototype.toString = function toString(encoding, start, end) { return utf8Slice(this, 0, this.length); } - const len = this.length; + const bufferLength = TypedArrayPrototypeGetLength(this); if (start <= 0) start = 0; - else if (start >= len) + else if (start >= bufferLength) return ''; else start = MathTrunc(start) || 0; - if (end === undefined || end > len) - end = len; + if (end === undefined || end > bufferLength) + end = bufferLength; else end = MathTrunc(end) || 0; @@ -1099,7 +1131,9 @@ function _fill(buf, value, offset, end, encoding) { value = 0; } else if (value.length === 1) { // Fast path: If `value` fits into a single byte, use that numeric value. - if (normalizedEncoding === 'utf8') { + // ASCII shares this branch with utf8 since code < 128 covers the full + // ASCII range; anything outside falls through to C++ bindingFill. + if (normalizedEncoding === 'utf8' || normalizedEncoding === 'ascii') { const code = StringPrototypeCharCodeAt(value, 0); if (code < 128) { value = code; @@ -1149,21 +1183,22 @@ function _fill(buf, value, offset, end, encoding) { } Buffer.prototype.write = function write(string, offset, length, encoding) { + const bufferLength = TypedArrayPrototypeGetLength(this); // Buffer#write(string); if (offset === undefined) { - return utf8Write(this, string, 0, this.length); + return utf8Write(this, string, 0, bufferLength); } // Buffer#write(string, encoding) if (length === undefined && typeof offset === 'string') { encoding = offset; - length = this.length; + length = bufferLength; offset = 0; // Buffer#write(string, offset[, length][, encoding]) } else { - validateOffset(offset, 'offset', 0, this.length); + validateOffset(offset, 'offset', 0, bufferLength); - const remaining = this.length - offset; + const remaining = bufferLength - offset; if (length === undefined) { length = remaining; @@ -1171,7 +1206,7 @@ Buffer.prototype.write = function write(string, offset, length, encoding) { encoding = length; length = remaining; } else { - validateOffset(length, 'length', 0, this.length); + validateOffset(length, 'length', 0, bufferLength); if (length > remaining) length = remaining; } @@ -1189,9 +1224,10 @@ Buffer.prototype.write = function write(string, offset, length, encoding) { }; Buffer.prototype.toJSON = function toJSON() { - if (this.length > 0) { - const data = new Array(this.length); - for (let i = 0; i < this.length; ++i) + const bufferLength = TypedArrayPrototypeGetLength(this); + if (bufferLength > 0) { + const data = new Array(bufferLength); + for (let i = 0; i < bufferLength; ++i) data[i] = this[i]; return { type: 'Buffer', data }; } @@ -1216,7 +1252,7 @@ function adjustOffset(offset, length) { } Buffer.prototype.subarray = function subarray(start, end) { - const srcLength = this.length; + const srcLength = TypedArrayPrototypeGetLength(this); start = adjustOffset(start, srcLength); end = end !== undefined ? adjustOffset(end, srcLength) : srcLength; const newLength = end > start ? end - start : 0; @@ -1234,45 +1270,52 @@ function swap(b, n, m) { } Buffer.prototype.swap16 = function swap16() { - // For Buffer.length < 128, it's generally faster to + // Ref: https://github.com/nodejs/node/pull/61871#discussion_r2889557696 + // For Buffer.length <= 32, it's generally faster to // do the swap in javascript. For larger buffers, // dropping down to the native code is faster. - const len = this.length; + const len = TypedArrayPrototypeGetLength(this); if (len % 2 !== 0) throw new ERR_INVALID_BUFFER_SIZE('16-bits'); - if (len < 128) { + if (len <= 32) { for (let i = 0; i < len; i += 2) swap(this, i, i + 1); return this; } - return _swap16(this); + _swap16(this); + return this; }; Buffer.prototype.swap32 = function swap32() { - // For Buffer.length < 192, it's generally faster to + // Ref: https://github.com/nodejs/node/pull/61871#discussion_r2889557696 + // For Buffer.length <= 32, it's generally faster to // do the swap in javascript. For larger buffers, // dropping down to the native code is faster. - const len = this.length; + const len = TypedArrayPrototypeGetLength(this); if (len % 4 !== 0) throw new ERR_INVALID_BUFFER_SIZE('32-bits'); - if (len < 192) { + if (len <= 32) { for (let i = 0; i < len; i += 4) { swap(this, i, i + 3); swap(this, i + 1, i + 2); } return this; } - return _swap32(this); + _swap32(this); + return this; }; Buffer.prototype.swap64 = function swap64() { - // For Buffer.length < 192, it's generally faster to + // Ref: https://github.com/nodejs/node/pull/61871#discussion_r2889557696 + // For Buffer.length < 48, it's generally faster to // do the swap in javascript. For larger buffers, // dropping down to the native code is faster. - const len = this.length; + // Threshold differs from swap16/swap32 (<=32) because swap64's + // crossover is between 40 and 48 (native wins at 48, loses at 40). + const len = TypedArrayPrototypeGetLength(this); if (len % 8 !== 0) throw new ERR_INVALID_BUFFER_SIZE('64-bits'); - if (len < 192) { + if (len < 48) { for (let i = 0; i < len; i += 8) { swap(this, i, i + 7); swap(this, i + 1, i + 6); @@ -1281,7 +1324,8 @@ Buffer.prototype.swap64 = function swap64() { } return this; } - return _swap64(this); + _swap64(this); + return this; }; Buffer.prototype.toLocaleString = Buffer.prototype.toString; diff --git a/lib/diagnostics_channel.js b/lib/diagnostics_channel.js index 3deb301e7f3cd2..bd17965b131208 100644 --- a/lib/diagnostics_channel.js +++ b/lib/diagnostics_channel.js @@ -31,6 +31,9 @@ const { const { triggerUncaughtException } = internalBinding('errors'); +const dc_binding = internalBinding('diagnostics_channel'); +const { subscribers: subscriberCounts } = dc_binding; + const { WeakReference } = require('internal/util'); // Can't delete when weakref count reaches 0 as it could increment again. @@ -108,6 +111,7 @@ class ActiveChannel { this._subscribers = ArrayPrototypeSlice(this._subscribers); ArrayPrototypePush(this._subscribers, subscription); channels.incRef(this.name); + if (this._index !== undefined) subscriberCounts[this._index]++; } unsubscribe(subscription) { @@ -120,6 +124,7 @@ class ActiveChannel { ArrayPrototypePushApply(this._subscribers, after); channels.decRef(this.name); + if (this._index !== undefined) subscriberCounts[this._index]--; maybeMarkInactive(this); return true; @@ -127,7 +132,10 @@ class ActiveChannel { bindStore(store, transform) { const replacing = this._stores.has(store); - if (!replacing) channels.incRef(this.name); + if (!replacing) { + channels.incRef(this.name); + if (this._index !== undefined) subscriberCounts[this._index]++; + } this._stores.set(store, transform); } @@ -139,6 +147,7 @@ class ActiveChannel { this._stores.delete(store); channels.decRef(this.name); + if (this._index !== undefined) subscriberCounts[this._index]--; maybeMarkInactive(this); return true; @@ -183,6 +192,9 @@ class Channel { this._subscribers = undefined; this._stores = undefined; this.name = name; + if (typeof name === 'string') { + this._index = dc_binding.getOrCreateChannelIndex(name); + } channels.set(name, this); } @@ -434,6 +446,8 @@ function tracingChannel(nameOrChannels) { return new TracingChannel(nameOrChannels); } +dc_binding.linkNativeChannel((name) => channel(name)); + module.exports = { channel, hasSubscribers, diff --git a/lib/events.js b/lib/events.js index f134789c8690a1..23b09f2f1c99eb 100644 --- a/lib/events.js +++ b/lib/events.js @@ -1074,7 +1074,7 @@ function on(emitter, event, options = kEmptyObject) { const value = unconsumedEvents.shift(); size--; if (paused && size < lowWatermark) { - emitter.resume(); + emitter.resume(); // Can not be finished yet paused = false; } return PromiseResolve(createIterResult(value, false)); @@ -1191,6 +1191,7 @@ function on(emitter, event, options = kEmptyObject) { abortListenerDisposable?.[SymbolDispose](); removeAll(); finished = true; + paused = false; const doneResult = createIterResult(undefined, true); while (!unconsumedPromises.isEmpty()) { unconsumedPromises.shift().resolve(doneResult); diff --git a/lib/fs.js b/lib/fs.js index a7ecb4f5235454..6e688375f48d2d 100644 --- a/lib/fs.js +++ b/lib/fs.js @@ -193,6 +193,7 @@ function makeStatsCallback(cb) { return (err, stats) => { if (err) return cb(err); + if (stats === undefined && err === null) return cb(null, undefined); cb(err, getStatsFromBinding(stats)); }; } @@ -1637,7 +1638,7 @@ function lstat(path, options = { bigint: false }, callback) { * ) => any} callback * @returns {void} */ -function stat(path, options = { bigint: false }, callback) { +function stat(path, options = { bigint: false, throwIfNoEntry: true }, callback) { if (typeof options === 'function') { callback = options; options = kEmptyObject; @@ -1646,7 +1647,7 @@ function stat(path, options = { bigint: false }, callback) { const req = new FSReqCallback(options.bigint); req.oncomplete = callback; - binding.stat(getValidatedPath(path), options.bigint, req); + binding.stat(getValidatedPath(path), options.bigint, req, options.throwIfNoEntry); } function statfs(path, options = { bigint: false }, callback) { diff --git a/lib/internal/blob.js b/lib/internal/blob.js index 46abb4f793c465..e42773a8d03dcc 100644 --- a/lib/internal/blob.js +++ b/lib/internal/blob.js @@ -149,8 +149,8 @@ class Blob { } validateDictionary(options, 'options'); let { - type = '', endings = 'transparent', + type = '', } = options ?? kEmptyObject; endings = `${endings}`; diff --git a/lib/internal/bootstrap/switches/is_main_thread.js b/lib/internal/bootstrap/switches/is_main_thread.js index 74486ba5310b78..06ac27c8486963 100644 --- a/lib/internal/bootstrap/switches/is_main_thread.js +++ b/lib/internal/bootstrap/switches/is_main_thread.js @@ -296,6 +296,7 @@ require('util'); require('url'); // eslint-disable-line no-restricted-modules internalBinding('module_wrap'); require('internal/modules/cjs/loader'); +require('internal/modules/esm/loader'); require('internal/modules/esm/utils'); // Needed to refresh the time origin. diff --git a/lib/internal/child_process.js b/lib/internal/child_process.js index 5ce8f0f7e9057c..86f051edc8a499 100644 --- a/lib/internal/child_process.js +++ b/lib/internal/child_process.js @@ -62,6 +62,7 @@ const spawn_sync = internalBinding('spawn_sync'); const { kStateSymbol } = require('internal/dgram'); const dc = require('diagnostics_channel'); const childProcessChannel = dc.channel('child_process'); +const childProcessSpawn = dc.tracingChannel('child_process.spawn'); const { UV_EACCES, @@ -393,6 +394,10 @@ ChildProcess.prototype.spawn = function spawn(options) { this.spawnargs = options.args; } + if (childProcessSpawn.hasSubscribers) { + childProcessSpawn.start.publish({ process: this, options }); + } + const err = this._handle.spawn(options); // Run-time errors should emit an error, not throw an exception. @@ -401,6 +406,13 @@ ChildProcess.prototype.spawn = function spawn(options) { err === UV_EMFILE || err === UV_ENFILE || err === UV_ENOENT) { + if (childProcessSpawn.hasSubscribers) { + childProcessSpawn.error.publish({ + process: this, + error: new ErrnoException(err, 'spawn'), + }); + } + process.nextTick(onErrorNT, this, err); // There is no point in continuing when we've hit EMFILE or ENFILE @@ -418,8 +430,20 @@ ChildProcess.prototype.spawn = function spawn(options) { this._handle.close(); this._handle = null; + + if (childProcessSpawn.hasSubscribers) { + childProcessSpawn.error.publish({ + process: this, + error: new ErrnoException(err, 'spawn'), + }); + } + throw new ErrnoException(err, 'spawn'); } else { + if (childProcessSpawn.hasSubscribers) { + childProcessSpawn.end.publish({ process: this }); + } + process.nextTick(onSpawnNT, this); } diff --git a/lib/internal/crypto/aes.js b/lib/internal/crypto/aes.js index 0474060d394c99..c0765f75642189 100644 --- a/lib/internal/crypto/aes.js +++ b/lib/internal/crypto/aes.js @@ -1,12 +1,9 @@ 'use strict'; const { - ArrayBufferIsView, - ArrayBufferPrototypeSlice, ArrayFrom, ArrayPrototypePush, SafeSet, - TypedArrayPrototypeSlice, } = primordials; const { @@ -28,8 +25,6 @@ const { kKeyVariantAES_GCM_256, kKeyVariantAES_KW_256, kKeyVariantAES_OCB_256, - kWebCryptoCipherDecrypt, - kWebCryptoCipherEncrypt, } = internalBinding('crypto'); const { @@ -143,80 +138,33 @@ function asyncAesKwCipher(mode, key, data) { getVariant('AES-KW', key[kAlgorithm].length))); } -async function asyncAesGcmCipher(mode, key, data, algorithm) { +function asyncAesGcmCipher(mode, key, data, algorithm) { const { tagLength = 128 } = algorithm; - const tagByteLength = tagLength / 8; - let tag; - switch (mode) { - case kWebCryptoCipherDecrypt: { - const slice = ArrayBufferIsView(data) ? - TypedArrayPrototypeSlice : ArrayBufferPrototypeSlice; - tag = slice(data, -tagByteLength); - - // Refs: https://www.w3.org/TR/WebCryptoAPI/#aes-gcm-operations - // - // > If *plaintext* has a length less than *tagLength* bits, then `throw` - // > an `OperationError`. - if (tagByteLength > tag.byteLength) { - throw lazyDOMException( - 'The provided data is too small.', - 'OperationError'); - } - data = slice(data, 0, -tagByteLength); - break; - } - case kWebCryptoCipherEncrypt: - tag = tagByteLength; - break; - } - - return await jobPromise(() => new AESCipherJob( + return jobPromise(() => new AESCipherJob( kCryptoJobAsync, mode, key[kKeyObject][kHandle], data, getVariant('AES-GCM', key[kAlgorithm].length), algorithm.iv, - tag, + tagByteLength, algorithm.additionalData)); } -async function asyncAesOcbCipher(mode, key, data, algorithm) { +function asyncAesOcbCipher(mode, key, data, algorithm) { const { tagLength = 128 } = algorithm; - const tagByteLength = tagLength / 8; - let tag; - switch (mode) { - case kWebCryptoCipherDecrypt: { - const slice = ArrayBufferIsView(data) ? - TypedArrayPrototypeSlice : ArrayBufferPrototypeSlice; - tag = slice(data, -tagByteLength); - - // Similar to GCM, OCB requires the tag to be present for decryption - if (tagByteLength > tag.byteLength) { - throw lazyDOMException( - 'The provided data is too small.', - 'OperationError'); - } - data = slice(data, 0, -tagByteLength); - break; - } - case kWebCryptoCipherEncrypt: - tag = tagByteLength; - break; - } - - return await jobPromise(() => new AESCipherJob( + return jobPromise(() => new AESCipherJob( kCryptoJobAsync, mode, key[kKeyObject][kHandle], data, getVariant('AES-OCB', key.algorithm.length), algorithm.iv, - tag, + tagByteLength, algorithm.additionalData)); } diff --git a/lib/internal/crypto/cfrg.js b/lib/internal/crypto/cfrg.js index c5bbaae90cf595..fd3f168435ddcb 100644 --- a/lib/internal/crypto/cfrg.js +++ b/lib/internal/crypto/cfrg.js @@ -2,6 +2,7 @@ const { SafeSet, + StringPrototypeToLowerCase, } = primordials; const { Buffer } = require('buffer'); @@ -332,7 +333,7 @@ function cfrgImportKey( return undefined; } - if (keyObject.asymmetricKeyType !== name.toLowerCase()) { + if (keyObject.asymmetricKeyType !== StringPrototypeToLowerCase(name)) { throw lazyDOMException('Invalid key type', 'DataError'); } diff --git a/lib/internal/crypto/chacha20_poly1305.js b/lib/internal/crypto/chacha20_poly1305.js index 0979d7aaddbb61..a2b7c1fb04fb89 100644 --- a/lib/internal/crypto/chacha20_poly1305.js +++ b/lib/internal/crypto/chacha20_poly1305.js @@ -1,19 +1,14 @@ 'use strict'; const { - ArrayBufferIsView, - ArrayBufferPrototypeSlice, ArrayFrom, SafeSet, - TypedArrayPrototypeSlice, } = primordials; const { ChaCha20Poly1305CipherJob, KeyObjectHandle, kCryptoJobAsync, - kWebCryptoCipherDecrypt, - kWebCryptoCipherEncrypt, } = internalBinding('crypto'); const { @@ -46,35 +41,13 @@ function validateKeyLength(length) { throw lazyDOMException('Invalid key length', 'DataError'); } -async function c20pCipher(mode, key, data, algorithm) { - let tag; - switch (mode) { - case kWebCryptoCipherDecrypt: { - const slice = ArrayBufferIsView(data) ? - TypedArrayPrototypeSlice : ArrayBufferPrototypeSlice; - - if (data.byteLength < 16) { - throw lazyDOMException( - 'The provided data is too small.', - 'OperationError'); - } - - tag = slice(data, -16); - data = slice(data, 0, -16); - break; - } - case kWebCryptoCipherEncrypt: - tag = 16; - break; - } - - return await jobPromise(() => new ChaCha20Poly1305CipherJob( +function c20pCipher(mode, key, data, algorithm) { + return jobPromise(() => new ChaCha20Poly1305CipherJob( kCryptoJobAsync, mode, key[kKeyObject][kHandle], data, algorithm.iv, - tag, algorithm.additionalData)); } diff --git a/lib/internal/crypto/ml_dsa.js b/lib/internal/crypto/ml_dsa.js index ebe3bfe3d17ca0..11a7e8d843a0a7 100644 --- a/lib/internal/crypto/ml_dsa.js +++ b/lib/internal/crypto/ml_dsa.js @@ -2,6 +2,7 @@ const { SafeSet, + StringPrototypeToLowerCase, TypedArrayPrototypeGetBuffer, TypedArrayPrototypeSet, Uint8Array, @@ -191,6 +192,19 @@ function mlDsaImportKey( } case 'pkcs8': { verifyAcceptableMlDsaKeyUse(name, false, usagesSet); + + const privOnlyLengths = { + '__proto__': null, + 'ML-DSA-44': 2588, + 'ML-DSA-65': 4060, + 'ML-DSA-87': 4924, + }; + if (keyData.byteLength === privOnlyLengths[name]) { + throw lazyDOMException( + 'Importing an ML-DSA PKCS#8 key without a seed is not supported', + 'NotSupportedError'); + } + try { keyObject = createPrivateKey({ key: keyData, @@ -276,7 +290,7 @@ function mlDsaImportKey( return undefined; } - if (keyObject.asymmetricKeyType !== name.toLowerCase()) { + if (keyObject.asymmetricKeyType !== StringPrototypeToLowerCase(name)) { throw lazyDOMException('Invalid key type', 'DataError'); } diff --git a/lib/internal/crypto/ml_kem.js b/lib/internal/crypto/ml_kem.js index f6eb76cef10b20..9cf44efc37f20a 100644 --- a/lib/internal/crypto/ml_kem.js +++ b/lib/internal/crypto/ml_kem.js @@ -3,6 +3,7 @@ const { PromiseWithResolvers, SafeSet, + StringPrototypeToLowerCase, TypedArrayPrototypeGetBuffer, TypedArrayPrototypeSet, Uint8Array, @@ -181,6 +182,19 @@ function mlKemImportKey( } case 'pkcs8': { verifyAcceptableMlKemKeyUse(name, false, usagesSet); + + const privOnlyLengths = { + '__proto__': null, + 'ML-KEM-512': 1660, + 'ML-KEM-768': 2428, + 'ML-KEM-1024': 3196, + }; + if (keyData.byteLength === privOnlyLengths[name]) { + throw lazyDOMException( + 'Importing an ML-KEM PKCS#8 key without a seed is not supported', + 'NotSupportedError'); + } + try { keyObject = createPrivateKey({ key: keyData, @@ -209,7 +223,7 @@ function mlKemImportKey( return undefined; } - if (keyObject.asymmetricKeyType !== name.toLowerCase()) { + if (keyObject.asymmetricKeyType !== StringPrototypeToLowerCase(name)) { throw lazyDOMException('Invalid key type', 'DataError'); } diff --git a/lib/internal/crypto/util.js b/lib/internal/crypto/util.js index 3c1d0e6bc6e9f7..70e1027946190a 100644 --- a/lib/internal/crypto/util.js +++ b/lib/internal/crypto/util.js @@ -15,7 +15,7 @@ const { ObjectEntries, ObjectKeys, ObjectPrototypeHasOwnProperty, - Promise, + PromiseWithResolvers, StringPrototypeToUpperCase, Symbol, TypedArrayPrototypeGetBuffer, @@ -488,6 +488,8 @@ function createSupportedAlgorithms(algorithmDefs) { const kSupportedAlgorithms = createSupportedAlgorithms(kAlgorithmDefinitions); const simpleAlgorithmDictionaries = { + AesCbcParams: { iv: 'BufferSource' }, + AesCtrParams: { counter: 'BufferSource' }, AeadParams: { iv: 'BufferSource', additionalData: 'BufferSource' }, // publicExponent is not strictly a BufferSource but it is a Uint8Array that we normalize // this way @@ -575,10 +577,13 @@ function normalizeAlgorithm(algorithm, op) { return { name: algName }; // 6. - const normalizedAlgorithm = webidl.converters[desiredType](algorithm, { - prefix: 'Failed to normalize algorithm', - context: 'passed algorithm', - }); + const normalizedAlgorithm = webidl.converters[desiredType]( + { __proto__: algorithm, name: algName }, + { + prefix: 'Failed to normalize algorithm', + context: 'passed algorithm', + }, + ); // 7. normalizedAlgorithm.name = algName; @@ -663,15 +668,15 @@ function onDone(resolve, reject, err, result) { } function jobPromise(getJob) { - return new Promise((resolve, reject) => { - try { - const job = getJob(); - job.ondone = FunctionPrototypeBind(onDone, job, resolve, reject); - job.run(); - } catch (err) { - onDone(resolve, reject, err); - } - }); + const { promise, resolve, reject } = PromiseWithResolvers(); + try { + const job = getJob(); + job.ondone = FunctionPrototypeBind(onDone, job, resolve, reject); + job.run(); + } catch (err) { + onDone(resolve, reject, err); + } + return promise; } // In WebCrypto, the publicExponent option in RSA is represented as a diff --git a/lib/internal/crypto/webcrypto.js b/lib/internal/crypto/webcrypto.js index 0fba4e9108c329..e95c4fd1392bca 100644 --- a/lib/internal/crypto/webcrypto.js +++ b/lib/internal/crypto/webcrypto.js @@ -865,7 +865,7 @@ async function importKey( webidl ??= require('internal/crypto/webidl'); const prefix = "Failed to execute 'importKey' on 'SubtleCrypto'"; - webidl.requiredArguments(arguments.length, 4, { prefix }); + webidl.requiredArguments(arguments.length, 5, { prefix }); format = webidl.converters.KeyFormat(format, { prefix, context: '1st argument', @@ -1894,6 +1894,10 @@ ObjectDefineProperties( }, }); +ObjectDefineProperties(SubtleCrypto, { + supports: kEnumerableProperty, +}); + module.exports = { Crypto, CryptoKey, diff --git a/lib/internal/crypto/webidl.js b/lib/internal/crypto/webidl.js index 8730bc0de94efb..4f371955a73bfd 100644 --- a/lib/internal/crypto/webidl.js +++ b/lib/internal/crypto/webidl.js @@ -195,12 +195,14 @@ converters.object = (V, opts) => { const isNonSharedArrayBuffer = isArrayBuffer; +/** + * @param {string | object} V - The hash algorithm identifier (string or object). + * @param {string} label - The dictionary name for the error message. + */ function ensureSHA(V, label) { - if ( - typeof V === 'string' ? - !StringPrototypeStartsWith(StringPrototypeToLowerCase(V), 'sha') : - V.name?.toLowerCase?.().startsWith('sha') === false - ) + const name = typeof V === 'string' ? V : V.name; + if (typeof name !== 'string' || + !StringPrototypeStartsWith(StringPrototypeToLowerCase(name), 'sha')) throw lazyDOMException( `Only SHA hashes are supported in ${label}`, 'NotSupportedError'); } diff --git a/lib/internal/debugger/inspect.js b/lib/internal/debugger/inspect.js index 75636b159ede2e..6a763b7770c0ed 100644 --- a/lib/internal/debugger/inspect.js +++ b/lib/internal/debugger/inspect.js @@ -32,11 +32,8 @@ const { AbortController, } = require('internal/abort_controller'); -const { 0: InspectClient, 1: createRepl } = - [ - require('internal/debugger/inspect_client'), - require('internal/debugger/inspect_repl'), - ]; +const InspectClient = require('internal/debugger/inspect_client'); +const createRepl = require('internal/debugger/inspect_repl'); const debuglog = util.debuglog('inspect'); diff --git a/lib/internal/fs/promises.js b/lib/internal/fs/promises.js index e30a2f1d069a7e..ff6dee2581fd4f 100644 --- a/lib/internal/fs/promises.js +++ b/lib/internal/fs/promises.js @@ -1034,12 +1034,16 @@ async function lstat(path, options = { bigint: false }) { return getStatsFromBinding(result); } -async function stat(path, options = { bigint: false }) { +async function stat(path, options = { bigint: false, throwIfNoEntry: true }) { const result = await PromisePrototypeThen( - binding.stat(getValidatedPath(path), options.bigint, kUsePromises), + binding.stat(getValidatedPath(path), options.bigint, kUsePromises, options.throwIfNoEntry), undefined, handleErrorFromBinding, ); + + // Binding will resolve undefined if UV_ENOENT or UV_ENOTDIR and throwIfNoEntry is false + if (!options.throwIfNoEntry && result === undefined) return undefined; + return getStatsFromBinding(result); } diff --git a/lib/internal/http2/core.js b/lib/internal/http2/core.js index 9f21daeff16bfd..273ddd15414b51 100644 --- a/lib/internal/http2/core.js +++ b/lib/internal/http2/core.js @@ -48,8 +48,12 @@ const { Duplex } = require('stream'); const tls = require('tls'); const { setImmediate, setTimeout, clearTimeout } = require('timers'); -const { kIncomingMessage } = require('_http_common'); -const { kServerResponse, Server: HttpServer, httpServerPreClose, setupConnectionsTracking } = require('_http_server'); +const { + Server: HttpServer, + httpServerPreClose, + setupConnectionsTracking, + storeHTTPOptions, +} = require('_http_server'); const JSStreamSocket = require('internal/js_stream_socket'); const { @@ -132,6 +136,7 @@ const { const { assertIsObject, assertIsArray, + assertValidPseudoHeader, assertValidPseudoHeaderResponse, assertValidPseudoHeaderTrailer, assertWithinRange, @@ -144,6 +149,7 @@ const { isPayloadMeaningless, kAuthority, kSensitiveHeaders, + kStrictSingleValueFields, kSocket, kRequest, kProtocol, @@ -1314,6 +1320,8 @@ class Http2Session extends EventEmitter { this[kSocket] = socket; this[kTimeout] = null; this[kHandle] = undefined; + this[kStrictSingleValueFields] = + options.strictSingleValueFields; // Do not use nagle's algorithm if (typeof socket.setNoDelay === 'function') @@ -2366,7 +2374,11 @@ class Http2Stream extends Duplex { this[kUpdateTimer](); - const headersList = buildNgHeaderString(headers, assertValidPseudoHeaderTrailer); + const headersList = buildNgHeaderString( + headers, + assertValidPseudoHeaderTrailer, + this.session[kStrictSingleValueFields], + ); this[kSentTrailers] = headers; // Send the trailers in setImmediate so we don't do it on nghttp2 stack. @@ -2575,7 +2587,11 @@ function prepareResponseHeaders(stream, headersParam, options) { stream[kSentHeaders] = headers; } - const headersList = buildNgHeaderString(headers, assertValidPseudoHeaderResponse); + const headersList = buildNgHeaderString( + headers, + assertValidPseudoHeaderResponse, + stream.session[kStrictSingleValueFields], + ); return { headers, headersList, statusCode }; } @@ -2678,7 +2694,11 @@ function processRespondWithFD(self, fd, headers, offset = 0, length = -1, let headersList; try { - headersList = buildNgHeaderString(headers, assertValidPseudoHeaderResponse); + headersList = buildNgHeaderString( + headers, + assertValidPseudoHeaderResponse, + self.session[kStrictSingleValueFields], + ); } catch (err) { if (self.ownsFd) tryClose(fd); @@ -2905,7 +2925,11 @@ class ServerHttp2Stream extends Http2Stream { if (headers[HTTP2_HEADER_METHOD] === HTTP2_METHOD_HEAD) headRequest = options.endStream = true; - const headersList = buildNgHeaderString(headers); + const headersList = buildNgHeaderString( + headers, + assertValidPseudoHeader, + this.session[kStrictSingleValueFields], + ); const streamOptions = options.endStream ? STREAM_OPTION_EMPTY_PAYLOAD : 0; @@ -3169,7 +3193,11 @@ class ServerHttp2Stream extends Http2Stream { this[kUpdateTimer](); - const headersList = buildNgHeaderString(headers, assertValidPseudoHeaderResponse); + const headersList = buildNgHeaderString( + headers, + assertValidPseudoHeaderResponse, + this.session[kStrictSingleValueFields], + ); if (!this[kInfoHeaders]) this[kInfoHeaders] = [headers]; else @@ -3257,8 +3285,6 @@ function connectionListener(socket) { if (socket.alpnProtocol === false || socket.alpnProtocol === 'http/1.1') { // Fallback to HTTP/1.1 if (options.allowHTTP1 === true) { - socket.server[kIncomingMessage] = options.Http1IncomingMessage; - socket.server[kServerResponse] = options.Http1ServerResponse; return httpConnectionListener.call(this, socket); } // Let event handler deal with the socket @@ -3324,25 +3350,43 @@ function initializeOptions(options) { } if (options.maxSessionInvalidFrames !== undefined) - validateUint32(options.maxSessionInvalidFrames, 'maxSessionInvalidFrames'); + validateUint32(options.maxSessionInvalidFrames, 'options.maxSessionInvalidFrames'); if (options.maxSessionRejectedStreams !== undefined) { validateUint32( options.maxSessionRejectedStreams, - 'maxSessionRejectedStreams', + 'options.maxSessionRejectedStreams', ); } if (options.unknownProtocolTimeout !== undefined) - validateUint32(options.unknownProtocolTimeout, 'unknownProtocolTimeout'); + validateUint32(options.unknownProtocolTimeout, 'options.unknownProtocolTimeout'); else // TODO(danbev): is this a good default value? options.unknownProtocolTimeout = 10000; + if (options.strictSingleValueFields !== undefined) { + validateBoolean( + options.strictSingleValueFields, + 'options.strictSingleValueFields', + ); + } else { + options.strictSingleValueFields = true; + } - // Used only with allowHTTP1 - options.Http1IncomingMessage ||= http.IncomingMessage; - options.Http1ServerResponse ||= http.ServerResponse; + + // Initialize http1Options bag for HTTP/1 fallback when allowHTTP1 is true. + // This bag is passed to storeHTTPOptions() to configure HTTP/1 server + // behavior (timeouts, IncomingMessage/ServerResponse classes, etc.). + options.http1Options = { ...options.http1Options }; + + // Backward compat: migrate deprecated top-level Http1 options (DEP0201) + if (options.Http1IncomingMessage !== undefined) { + options.http1Options.IncomingMessage ??= options.Http1IncomingMessage; + } + if (options.Http1ServerResponse !== undefined) { + options.http1Options.ServerResponse ??= options.Http1ServerResponse; + } options.Http2ServerRequest ||= Http2ServerRequest; options.Http2ServerResponse ||= Http2ServerResponse; @@ -3390,9 +3434,7 @@ class Http2SecureServer extends TLSServer { this.timeout = 0; this.on('newListener', setupCompat); if (options.allowHTTP1 === true) { - this.headersTimeout = 60_000; // Minimum between 60 seconds or requestTimeout - this.requestTimeout = 300_000; // 5 minutes - this.connectionsCheckingInterval = 30_000; // 30 seconds + storeHTTPOptions.call(this, { ...options, ...options.http1Options }); this.shouldUpgradeCallback = function() { return this.listenerCount('upgrade') > 0; }; @@ -3544,6 +3586,15 @@ function connect(authority, options, listener) { throw new ERR_HTTP2_TOO_MANY_CUSTOM_SETTINGS(); } + if (options.strictSingleValueFields !== undefined) { + validateBoolean( + options.strictSingleValueFields, + 'options.strictSingleValueFields', + ); + } else { + options.strictSingleValueFields = true; + } + if (typeof authority === 'string') authority = new URL(authority); diff --git a/lib/internal/http2/util.js b/lib/internal/http2/util.js index ba981c8934dee9..25adc8f9697d82 100644 --- a/lib/internal/http2/util.js +++ b/lib/internal/http2/util.js @@ -39,6 +39,7 @@ const { const kAuthority = Symbol('authority'); const kSensitiveHeaders = Symbol('sensitiveHeaders'); +const kStrictSingleValueFields = Symbol('strictSingleValueFields'); const kSocket = Symbol('socket'); const kProtocol = Symbol('protocol'); const kProxySocket = Symbol('proxySocket'); @@ -121,7 +122,7 @@ const kValidPseudoHeaders = new SafeSet([ // This set contains headers that are permitted to have only a single // value. Multiple instances must not be specified. -const kSingleValueHeaders = new SafeSet([ +const kSingleValueFields = new SafeSet([ HTTP2_HEADER_STATUS, HTTP2_HEADER_METHOD, HTTP2_HEADER_AUTHORITY, @@ -690,6 +691,7 @@ function prepareRequestHeadersArray(headers, session) { const headersList = buildNgHeaderString( rawHeaders, assertValidPseudoHeader, + session[kStrictSingleValueFields], ); return { @@ -731,7 +733,11 @@ function prepareRequestHeadersObject(headers, session) { throw new ERR_HTTP2_CONNECT_PATH(); } - const headersList = buildNgHeaderString(headersObject); + const headersList = buildNgHeaderString( + headersObject, + assertValidPseudoHeader, + session[kStrictSingleValueFields], + ); return { headersObject, @@ -751,10 +757,15 @@ const kNoHeaderFlags = StringFromCharCode(NGHTTP2_NV_FLAG_NONE); * format, rejecting illegal header configurations, and marking sensitive headers * that should not be indexed en route. This takes either a flat map of * raw headers ([k1, v1, k2, v2]) or a header object ({ k1: v1, k2: [v2, v3] }). + * + * Takes a validation function to check the pseudo-headers allowed for this + * message, and a boolean indicating whether to enforce strict single-value + * header validation. * @returns {[string, number]} */ function buildNgHeaderString(arrayOrMap, - assertValuePseudoHeader = assertValidPseudoHeader) { + validatePseudoHeaderValue, + strictSingleValueFields) { let headers = ''; let pseudoHeaders = ''; let count = 0; @@ -765,7 +776,8 @@ function buildNgHeaderString(arrayOrMap, function processHeader(key, value) { key = key.toLowerCase(); - const isSingleValueHeader = kSingleValueHeaders.has(key); + const isStrictSingleValueField = strictSingleValueFields && + kSingleValueFields.has(key); let isArray = ArrayIsArray(value); if (isArray) { switch (value.length) { @@ -776,13 +788,13 @@ function buildNgHeaderString(arrayOrMap, isArray = false; break; default: - if (isSingleValueHeader) + if (isStrictSingleValueField) throw new ERR_HTTP2_HEADER_SINGLE_VALUE(key); } } else { value = String(value); } - if (isSingleValueHeader) { + if (isStrictSingleValueField) { if (singles.has(key)) throw new ERR_HTTP2_HEADER_SINGLE_VALUE(key); singles.add(key); @@ -791,7 +803,7 @@ function buildNgHeaderString(arrayOrMap, kNeverIndexFlag : kNoHeaderFlags; if (key[0] === ':') { - const err = assertValuePseudoHeader(key); + const err = validatePseudoHeaderValue(key); if (err !== undefined) throw err; pseudoHeaders += `${key}\0${value}\0${flags}`; @@ -893,7 +905,7 @@ function toHeaderObject(headers, sensitiveHeaders) { const existing = obj[name]; if (existing === undefined) { obj[name] = name === HTTP2_HEADER_SET_COOKIE ? [value] : value; - } else if (!kSingleValueHeaders.has(name)) { + } else if (!kSingleValueFields.has(name)) { switch (name) { case HTTP2_HEADER_COOKIE: // https://tools.ietf.org/html/rfc7540#section-8.1.2.5 @@ -970,6 +982,7 @@ module.exports = { isPayloadMeaningless, kAuthority, kSensitiveHeaders, + kStrictSingleValueFields, kSocket, kProtocol, kProxySocket, diff --git a/lib/internal/locks.js b/lib/internal/locks.js index 054197bcaefcc6..05000e933f0b55 100644 --- a/lib/internal/locks.js +++ b/lib/internal/locks.js @@ -29,8 +29,13 @@ const { createEnumConverter, createDictionaryConverter, } = require('internal/webidl'); +const dc = require('diagnostics_channel'); const locks = internalBinding('locks'); +const lockRequestStartChannel = dc.channel('locks.request.start'); +const lockRequestGrantChannel = dc.channel('locks.request.grant'); +const lockRequestMissChannel = dc.channel('locks.request.miss'); +const lockRequestEndChannel = dc.channel('locks.request.end'); const kName = Symbol('kName'); const kMode = Symbol('kMode'); @@ -113,6 +118,30 @@ function convertLockError(error) { return error; } +function publishLockRequestStart(name, mode) { + if (lockRequestStartChannel.hasSubscribers) { + lockRequestStartChannel.publish({ name, mode }); + } +} + +function publishLockRequestGrant(name, mode) { + if (lockRequestGrantChannel.hasSubscribers) { + lockRequestGrantChannel.publish({ name, mode }); + } +} + +function publishLockRequestMiss(name, mode, ifAvailable) { + if (ifAvailable && lockRequestMissChannel.hasSubscribers) { + lockRequestMissChannel.publish({ name, mode }); + } +} + +function publishLockRequestEnd(name, mode, ifAvailable, steal, error) { + if (lockRequestEndChannel.hasSubscribers) { + lockRequestEndChannel.publish({ name, mode, ifAvailable, steal, error }); + } +} + // https://w3c.github.io/web-locks/#api-lock-manager class LockManager { constructor(symbol = undefined) { @@ -192,6 +221,7 @@ class LockManager { } const clientId = `node-${process.pid}-${threadId}`; + publishLockRequestStart(name, mode); // Handle requests with AbortSignal if (signal) { @@ -212,6 +242,8 @@ class LockManager { return undefined; } lockGranted = true; + publishLockRequestGrant(name, mode); + return callback(createLock(lock)); }); }; @@ -228,27 +260,49 @@ class LockManager { // When released promise settles, clean up listener and resolve main promise SafePromisePrototypeFinally( - PromisePrototypeThen(released, resolve, (error) => reject(convertLockError(error))), + PromisePrototypeThen( + released, + (result) => { + publishLockRequestEnd(name, mode, ifAvailable, steal, undefined); + resolve(result); + }, + (error) => { + const convertedError = convertLockError(error); + publishLockRequestEnd(name, mode, ifAvailable, steal, convertedError); + reject(convertedError); + }, + ), () => signal.removeEventListener('abort', abortListener), ); } catch (error) { signal.removeEventListener('abort', abortListener); - reject(convertLockError(error)); + const convertedError = convertLockError(error); + publishLockRequestEnd(name, mode, ifAvailable, steal, convertedError); + reject(convertedError); } }); } // When ifAvailable: true and lock is not available, C++ passes null to indicate no lock granted const wrapCallback = (internalLock) => { + if (internalLock === null) { + publishLockRequestMiss(name, mode, ifAvailable); + } else { + publishLockRequestGrant(name, mode); + } const lock = createLock(internalLock); return callback(lock); }; // Standard request without signal try { - return await locks.request(name, clientId, mode, steal, ifAvailable, wrapCallback); + const result = await locks.request(name, clientId, mode, steal, ifAvailable, wrapCallback); + publishLockRequestEnd(name, mode, ifAvailable, steal, undefined); + + return result; } catch (error) { const convertedError = convertLockError(error); + publishLockRequestEnd(name, mode, ifAvailable, steal, convertedError); throw convertedError; } } diff --git a/lib/internal/main/watch_mode.js b/lib/internal/main/watch_mode.js index 225436661f5e56..06c2c8602da444 100644 --- a/lib/internal/main/watch_mode.js +++ b/lib/internal/main/watch_mode.js @@ -18,7 +18,7 @@ const { triggerUncaughtException, exitCodes: { kNoFailure }, } = internalBinding('errors'); -const { getOptionValue, getOptionsAsFlagsFromBinding } = require('internal/options'); +const { getOptionValue } = require('internal/options'); const { FilesWatcher } = require('internal/watch_mode/files_watcher'); const { green, blue, red, white, clear } = require('internal/util/colors'); const { convertToValidSignal } = require('internal/util'); @@ -44,14 +44,13 @@ const kCommand = ArrayPrototypeSlice(process.argv, 1); const kCommandStr = inspect(ArrayPrototypeJoin(kCommand, ' ')); const argsWithoutWatchOptions = []; -const argsFromBinding = getOptionsAsFlagsFromBinding(); -for (let i = 0; i < argsFromBinding.length; i++) { - const arg = argsFromBinding[i]; +for (let i = 0; i < process.execArgv.length; i++) { + const arg = process.execArgv[i]; if (StringPrototypeStartsWith(arg, '--watch=')) { continue; } if (arg === '--watch') { - const nextArg = argsFromBinding[i + 1]; + const nextArg = process.execArgv[i + 1]; if (nextArg && nextArg[0] !== '-') { // If `--watch` doesn't include `=` and the next // argument is not a flag then it is interpreted as diff --git a/lib/internal/modules/cjs/loader.js b/lib/internal/modules/cjs/loader.js index 3b48333c2a8cae..df656b86016a87 100644 --- a/lib/internal/modules/cjs/loader.js +++ b/lib/internal/modules/cjs/loader.js @@ -1035,41 +1035,63 @@ function getExportsForCircularRequire(module) { return module.exports; } + /** - * Resolve a module request for CommonJS, invoking hooks from module.registerHooks() - * if necessary. + * Wraps result of Module._resolveFilename to include additional fields for hooks. + * See resolveForCJSWithHooks. * @param {string} specifier * @param {Module|undefined} parent * @param {boolean} isMain - * @param {boolean} shouldSkipModuleHooks + * @param {ResolveFilenameOptions} options * @returns {{url?: string, format?: string, parentURL?: string, filename: string}} */ -function resolveForCJSWithHooks(specifier, parent, isMain, shouldSkipModuleHooks) { - let defaultResolvedURL; - let defaultResolvedFilename; - let format; - - function defaultResolveImpl(specifier, parent, isMain, options) { - // For backwards compatibility, when encountering requests starting with node:, - // throw ERR_UNKNOWN_BUILTIN_MODULE on failure or return the normalized ID on success - // without going into Module._resolveFilename. - let normalized; - if (StringPrototypeStartsWith(specifier, 'node:')) { - normalized = BuiltinModule.normalizeRequirableId(specifier); - if (!normalized) { - throw new ERR_UNKNOWN_BUILTIN_MODULE(specifier); - } - defaultResolvedURL = specifier; - format = 'builtin'; - return normalized; +function wrapResolveFilename(specifier, parent, isMain, options) { + const filename = Module._resolveFilename(specifier, parent, isMain, options).toString(); + return { __proto__: null, url: undefined, format: undefined, filename }; +} + +/** + * See resolveForCJSWithHooks. + * @param {string} specifier + * @param {Module|undefined} parent + * @param {boolean} isMain + * @param {ResolveFilenameOptions} options + * @returns {{url?: string, format?: string, parentURL?: string, filename: string}} + */ +function defaultResolveImplForCJSLoading(specifier, parent, isMain, options) { + // For backwards compatibility, when encountering requests starting with node:, + // throw ERR_UNKNOWN_BUILTIN_MODULE on failure or return the normalized ID on success + // without going into Module._resolveFilename. + let normalized; + if (StringPrototypeStartsWith(specifier, 'node:')) { + normalized = BuiltinModule.normalizeRequirableId(specifier); + if (!normalized) { + throw new ERR_UNKNOWN_BUILTIN_MODULE(specifier); } - return Module._resolveFilename(specifier, parent, isMain, options).toString(); + return { __proto__: null, url: specifier, format: 'builtin', filename: normalized }; } + return wrapResolveFilename(specifier, parent, isMain, options); +} +/** + * Resolve a module request for CommonJS, invoking hooks from module.registerHooks() + * if necessary. + * @param {string} specifier + * @param {Module|undefined} parent + * @param {boolean} isMain + * @param {object} internalResolveOptions + * @param {boolean} internalResolveOptions.shouldSkipModuleHooks Whether to skip module hooks. + * @param {ResolveFilenameOptions} internalResolveOptions.requireResolveOptions Options from require.resolve(). + * Only used when it comes from require.resolve(). + * @returns {{url?: string, format?: string, parentURL?: string, filename: string}} + */ +function resolveForCJSWithHooks(specifier, parent, isMain, internalResolveOptions) { + const { requireResolveOptions, shouldSkipModuleHooks } = internalResolveOptions; + const defaultResolveImpl = requireResolveOptions ? + wrapResolveFilename : defaultResolveImplForCJSLoading; // Fast path: no hooks, just return simple results. if (!resolveHooks.length || shouldSkipModuleHooks) { - const filename = defaultResolveImpl(specifier, parent, isMain); - return { __proto__: null, url: defaultResolvedURL, filename, format }; + return defaultResolveImpl(specifier, parent, isMain, requireResolveOptions); } // Slow path: has hooks, do the URL conversions and invoke hooks with contexts. @@ -1098,27 +1120,25 @@ function resolveForCJSWithHooks(specifier, parent, isMain, shouldSkipModuleHooks } else { conditionSet = getCjsConditions(); } - defaultResolvedFilename = defaultResolveImpl(specifier, parent, isMain, { + + const result = defaultResolveImpl(specifier, parent, isMain, { __proto__: null, + paths: requireResolveOptions?.paths, conditions: conditionSet, }); + // If the default resolver does not return a URL, convert it for the public API. + result.url ??= convertCJSFilenameToURL(result.filename); - defaultResolvedURL = convertCJSFilenameToURL(defaultResolvedFilename); - return { __proto__: null, url: defaultResolvedURL }; + // Remove filename because it's not part of the public API. + // TODO(joyeecheung): maybe expose it in the public API to avoid re-conversion for users too. + return { __proto__: null, url: result.url, format: result.format }; } const resolveResult = resolveWithHooks(specifier, parentURL, /* importAttributes */ undefined, getCjsConditionsArray(), defaultResolve); - const { url } = resolveResult; - format = resolveResult.format; - - let filename; - if (url === defaultResolvedURL) { // Not overridden, skip the re-conversion. - filename = defaultResolvedFilename; - } else { - filename = convertURLToCJSFilename(url); - } - + const { url, format } = resolveResult; + // Convert the URL from the hook chain back to a filename for internal use. + const filename = convertURLToCJSFilename(url); const result = { __proto__: null, url, format, filename, parentURL }; debug('resolveForCJSWithHooks', specifier, parent?.id, isMain, shouldSkipModuleHooks, '->', result); return result; @@ -1213,10 +1233,10 @@ function loadBuiltinWithHooks(id, url, format) { * @param {string} request Specifier of module to load via `require` * @param {Module} parent Absolute path of the module importing the child * @param {boolean} isMain Whether the module is the main entry point - * @param {object|undefined} options Additional options for loading the module + * @param {object|undefined} internalResolveOptions Additional options for loading the module * @returns {object} */ -Module._load = function(request, parent, isMain, options = kEmptyObject) { +Module._load = function(request, parent, isMain, internalResolveOptions = kEmptyObject) { let relResolveCacheIdentifier; if (parent) { debug('Module._load REQUEST %s parent: %s', request, parent.id); @@ -1239,7 +1259,7 @@ Module._load = function(request, parent, isMain, options = kEmptyObject) { } } - const resolveResult = resolveForCJSWithHooks(request, parent, isMain, options.shouldSkipModuleHooks); + const resolveResult = resolveForCJSWithHooks(request, parent, isMain, internalResolveOptions); let { format } = resolveResult; const { url, filename } = resolveResult; @@ -1779,8 +1799,6 @@ Module.prototype._compile = function(content, filename, format) { } } - let redirects; - let compiledWrapper; if (format !== 'module') { const result = wrapSafe(filename, content, this, format); @@ -1796,7 +1814,7 @@ Module.prototype._compile = function(content, filename, format) { } const dirname = path.dirname(filename); - const require = makeRequireFunction(this, redirects); + const require = makeRequireFunction(this); let result; const exports = this.exports; const thisValue = exports; diff --git a/lib/internal/modules/esm/formats.js b/lib/internal/modules/esm/formats.js deleted file mode 100644 index 6a18bd992fa1d9..00000000000000 --- a/lib/internal/modules/esm/formats.js +++ /dev/null @@ -1,70 +0,0 @@ -'use strict'; - -const { - RegExpPrototypeExec, -} = primordials; - -const { getOptionValue } = require('internal/options'); -const { getValidatedPath } = require('internal/fs/utils'); -const fsBindings = internalBinding('fs'); -const { internal: internalConstants } = internalBinding('constants'); - -const experimentalAddonModules = getOptionValue('--experimental-addon-modules'); - -const extensionFormatMap = { - '__proto__': null, - '.cjs': 'commonjs', - '.js': 'module', - '.json': 'json', - '.mjs': 'module', - '.wasm': 'wasm', -}; - -if (experimentalAddonModules) { - extensionFormatMap['.node'] = 'addon'; -} - -if (getOptionValue('--strip-types')) { - extensionFormatMap['.ts'] = 'module-typescript'; - extensionFormatMap['.mts'] = 'module-typescript'; - extensionFormatMap['.cts'] = 'commonjs-typescript'; -} - -/** - * @param {string} mime - * @returns {string | null} - */ -function mimeToFormat(mime) { - if ( - RegExpPrototypeExec( - /^\s*(text|application)\/javascript\s*(;\s*charset=utf-?8\s*)?$/i, - mime, - ) !== null - ) { return 'module'; } - if (mime === 'application/json') { return 'json'; } - if (mime === 'application/wasm') { return 'wasm'; } - return null; -} - -/** - * For extensionless files in a `module` package scope, we check the file contents to disambiguate between ES module - * JavaScript and Wasm. - * We do this by taking advantage of the fact that all Wasm files start with the header `0x00 0x61 0x73 0x6d` (`_asm`). - * @param {URL} url - * @returns {'wasm'|'module'} - */ -function getFormatOfExtensionlessFile(url) { - const path = getValidatedPath(url); - switch (fsBindings.getFormatOfExtensionlessFile(path)) { - case internalConstants.EXTENSIONLESS_FORMAT_WASM: - return 'wasm'; - default: - return 'module'; - } -} - -module.exports = { - extensionFormatMap, - getFormatOfExtensionlessFile, - mimeToFormat, -}; diff --git a/lib/internal/modules/esm/get_format.js b/lib/internal/modules/esm/get_format.js index 48ccb97a6244ea..4f334c7d88c336 100644 --- a/lib/internal/modules/esm/get_format.js +++ b/lib/internal/modules/esm/get_format.js @@ -9,13 +9,63 @@ const { StringPrototypeSlice, } = primordials; const { getOptionValue } = require('internal/options'); -const { - extensionFormatMap, - getFormatOfExtensionlessFile, - mimeToFormat, -} = require('internal/modules/esm/formats'); +const { getValidatedPath } = require('internal/fs/utils'); +const fsBindings = internalBinding('fs'); +const { internal: internalConstants } = internalBinding('constants'); + +const extensionFormatMap = { + '__proto__': null, + '.cjs': 'commonjs', + '.js': 'module', + '.json': 'json', + '.mjs': 'module', + '.wasm': 'wasm', +}; + +function initializeExtensionFormatMap() { + if (getOptionValue('--experimental-addon-modules')) { + extensionFormatMap['.node'] = 'addon'; + } + + if (getOptionValue('--strip-types')) { + extensionFormatMap['.ts'] = 'module-typescript'; + extensionFormatMap['.mts'] = 'module-typescript'; + extensionFormatMap['.cts'] = 'commonjs-typescript'; + } +} -const detectModule = getOptionValue('--experimental-detect-module'); +/** + * @param {string} mime + * @returns {string | null} + */ +function mimeToFormat(mime) { + if ( + RegExpPrototypeExec( + /^\s*(text|application)\/javascript\s*(;\s*charset=utf-?8\s*)?$/i, + mime, + ) !== null + ) { return 'module'; } + if (mime === 'application/json') { return 'json'; } + if (mime === 'application/wasm') { return 'wasm'; } + return null; +} + +/** + * For extensionless files in a `module` package scope, we check the file contents to disambiguate between ES module + * JavaScript and Wasm. + * We do this by taking advantage of the fact that all Wasm files start with the header `0x00 0x61 0x73 0x6d` (`_asm`). + * @param {URL} url + * @returns {'wasm'|'module'} + */ +function getFormatOfExtensionlessFile(url) { + const path = getValidatedPath(url); + switch (fsBindings.getFormatOfExtensionlessFile(path)) { + case internalConstants.EXTENSIONLESS_FORMAT_WASM: + return 'wasm'; + default: + return 'module'; + } +} const { containsModuleSyntax } = internalBinding('contextify'); const { getPackageScopeConfig, getPackageType } = require('internal/modules/package_json_reader'); const { fileURLToPath } = require('internal/url'); @@ -35,6 +85,7 @@ const protocolHandlers = { * @returns {'module'|'commonjs'} */ function detectModuleFormat(source, url) { + const detectModule = getOptionValue('--experimental-detect-module'); if (!source) { return detectModule ? null : 'commonjs'; } if (!detectModule) { return 'commonjs'; } return containsModuleSyntax(`${source}`, fileURLToPath(url), url) ? 'module' : 'commonjs'; @@ -216,4 +267,5 @@ module.exports = { defaultGetFormatWithoutErrors, extensionFormatMap, extname, + initializeExtensionFormatMap, }; diff --git a/lib/internal/modules/esm/loader.js b/lib/internal/modules/esm/loader.js index ff4492a09cb300..9d08c0819b1cce 100644 --- a/lib/internal/modules/esm/loader.js +++ b/lib/internal/modules/esm/loader.js @@ -62,7 +62,7 @@ const { loadWithHooks: loadWithSyncHooks, validateLoadSloppy, } = require('internal/modules/customization_hooks'); -let defaultResolve, defaultLoadSync, importMetaInitializer; +let importMetaInitializer; const { tracingChannel } = require('diagnostics_channel'); const onImport = tracingChannel('module.import'); @@ -97,19 +97,9 @@ function newLoadCache() { return new LoadCache(); } -let _translators; -function lazyLoadTranslators() { - _translators ??= require('internal/modules/esm/translators'); - return _translators; -} - -/** - * Lazy-load translators to avoid potentially unnecessary work at startup (ex if ESM is not used). - * @returns {import('./translators.js').Translators} - */ -function getTranslators() { - return lazyLoadTranslators().translators; -} +const { translators } = require('internal/modules/esm/translators'); +const { defaultResolve } = require('internal/modules/esm/resolve'); +const { defaultLoadSync, throwUnknownModuleFormat } = require('internal/modules/esm/load'); /** * Generate message about potential race condition caused by requiring a cached module that has started @@ -178,18 +168,6 @@ class ModuleLoader { */ loadCache = newLoadCache(); - /** - * Methods which translate input code or other information into ES modules - */ - translators = getTranslators(); - - /** - * Truthy to allow the use of `import.meta.resolve`. This is needed - * currently because the `Hooks` class does not have `resolveSync` - * implemented and `import.meta.resolve` requires it. - */ - allowImportMetaResolve; - /** * @see {AsyncLoaderHooks.isForAsyncLoaderHookWorker} * Shortcut to this.#asyncLoaderHooks.isForAsyncLoaderHookWorker. @@ -464,7 +442,7 @@ class ModuleLoader { #translate(url, translateContext, parentURL) { const { translatorKey, format } = translateContext; this.validateLoadResult(url, format); - const translator = getTranslators().get(translatorKey); + const translator = translators.get(translatorKey); if (!translator) { throw new ERR_UNKNOWN_MODULE_FORMAT(translatorKey, url); @@ -715,7 +693,7 @@ class ModuleLoader { if (cachedResult != null) { return cachedResult; } - defaultResolve ??= require('internal/modules/esm/resolve').defaultResolve; + const result = defaultResolve(specifier, context); this.#resolveCache.set(requestKey, parentURL, result); return result; @@ -744,13 +722,16 @@ class ModuleLoader { * `module.registerHooks()` hooks. * @param {string} [parentURL] See {@link resolve}. * @param {ModuleRequest} request See {@link resolve}. + * @param {boolean} [shouldSkipSyncHooks] Whether to skip the synchronous hooks registered by module.registerHooks(). + * This is used to maintain compatibility for the re-invented require.resolve (in imported CJS customized + * by module.register()`) which invokes the CJS resolution separately from the hook chain. * @returns {{ format: string, url: string }} */ - resolveSync(parentURL, request) { + resolveSync(parentURL, request, shouldSkipSyncHooks = false) { const specifier = `${request.specifier}`; const importAttributes = request.attributes ?? kEmptyObject; - if (syncResolveHooks.length) { + if (!shouldSkipSyncHooks && syncResolveHooks.length) { // Has module.registerHooks() hooks, chain the asynchronous hooks in the default step. return resolveWithSyncHooks(specifier, parentURL, importAttributes, this.#defaultConditions, this.#resolveAndMaybeBlockOnLoaderThread.bind(this)); @@ -792,7 +773,6 @@ class ModuleLoader { if (this.#asyncLoaderHooks?.loadSync) { return this.#asyncLoaderHooks.loadSync(url, context); } - defaultLoadSync ??= require('internal/modules/esm/load').defaultLoadSync; return defaultLoadSync(url, context); } @@ -818,7 +798,7 @@ class ModuleLoader { validateLoadResult(url, format) { if (format == null) { - require('internal/modules/esm/load').throwUnknownModuleFormat(url, format); + throwUnknownModuleFormat(url, format); } } diff --git a/lib/internal/modules/esm/module_job.js b/lib/internal/modules/esm/module_job.js index 929577c0da6d08..22032f79e90d44 100644 --- a/lib/internal/modules/esm/module_job.js +++ b/lib/internal/modules/esm/module_job.js @@ -145,7 +145,9 @@ class ModuleJobBase { */ syncLink(requestType) { // Store itself into the cache first before linking in case there are circular - // references in the linking. + // references in the linking. Track whether we're overwriting an existing entry + // so we know whether to remove the temporary entry in the finally block. + const hadPreviousEntry = this.loader.loadCache.get(this.url, this.type) !== undefined; this.loader.loadCache.set(this.url, this.type, this); const moduleRequests = this.module.getModuleRequests(); // Modules should be aligned with the moduleRequests array in order. @@ -169,9 +171,14 @@ class ModuleJobBase { } this.module.link(modules); } finally { - // Restore it - if it succeeds, we'll reset in the caller; Otherwise it's - // not cached and if the error is caught, subsequent attempt would still fail. - this.loader.loadCache.delete(this.url, this.type); + if (!hadPreviousEntry) { + // Remove the temporary entry. On failure this ensures subsequent attempts + // don't return a broken job. On success the caller + // (#getOrCreateModuleJobAfterResolve) will re-insert under the correct key. + this.loader.loadCache.delete(this.url, this.type); + } + // If there was a previous entry (ensurePhase() path), leave this in cache - + // it is the upgraded job and the caller will not re-insert. } return evaluationDepJobs; diff --git a/lib/internal/modules/esm/resolve.js b/lib/internal/modules/esm/resolve.js index cc1230648881d8..cbdc120302443c 100644 --- a/lib/internal/modules/esm/resolve.js +++ b/lib/internal/modules/esm/resolve.js @@ -29,9 +29,6 @@ const { realpathSync } = require('fs'); const { getOptionValue } = require('internal/options'); // Do not eagerly grab .manifest, it may be in TDZ const { sep, posix: { relative: relativePosixPath }, resolve } = require('path'); -const preserveSymlinks = getOptionValue('--preserve-symlinks'); -const preserveSymlinksMain = getOptionValue('--preserve-symlinks-main'); -const inputTypeFlag = getOptionValue('--input-type'); const { URL, pathToFileURL, fileURLToPath, isURL, URLParse } = require('internal/url'); const { getCWDURL, setOwnProperty } = require('internal/util'); const { canParse: URLCanParse } = internalBinding('url'); @@ -49,8 +46,7 @@ const { ERR_UNSUPPORTED_DIR_IMPORT, ERR_UNSUPPORTED_RESOLVE_REQUEST, } = require('internal/errors').codes; - -const { Module: CJSModule } = require('internal/modules/cjs/loader'); +const { defaultGetFormatWithoutErrors } = require('internal/modules/esm/get_format'); const { getConditionsSet } = require('internal/modules/esm/utils'); const packageJsonReader = require('internal/modules/package_json_reader'); const internalFsBinding = internalBinding('fs'); @@ -249,7 +245,7 @@ function finalizeResolution(resolved, base, preserveSymlinks) { } const stats = internalFsBinding.internalModuleStat( - StringPrototypeEndsWith(internalFsBinding, path, '/') ? StringPrototypeSlice(path, -1) : path, + StringPrototypeEndsWith(path, '/') ? StringPrototypeSlice(path, -1) : path, ); // Check for stats.isDirectory() @@ -873,6 +869,7 @@ function moduleResolve(specifier, base, conditions, preserveSymlinks) { */ function resolveAsCommonJS(specifier, parentURL) { try { + const { Module: CJSModule } = require('internal/modules/cjs/loader'); const parent = fileURLToPath(parentURL); const tmpModule = new CJSModule(parent, null); tmpModule.paths = CJSModule._nodeModulePaths(parent); @@ -982,7 +979,7 @@ function defaultResolve(specifier, context = {}) { // input, to avoid user confusion over how expansive the effect of the // flag should be (i.e. entry point only, package scope surrounding the // entry point, etc.). - if (inputTypeFlag) { throw new ERR_INPUT_TYPE_NOT_ALLOWED(); } + if (getOptionValue('--input-type')) { throw new ERR_INPUT_TYPE_NOT_ALLOWED(); } } conditions = getConditionsSet(conditions); @@ -992,7 +989,7 @@ function defaultResolve(specifier, context = {}) { specifier, parentURL, conditions, - isMain ? preserveSymlinksMain : preserveSymlinks, + isMain ? getOptionValue('--preserve-symlinks-main') : getOptionValue('--preserve-symlinks'), ); } catch (error) { // Try to give the user a hint of what would have been the @@ -1046,8 +1043,3 @@ module.exports = { packageResolve, throwIfInvalidParentURL, }; - -// cycle -const { - defaultGetFormatWithoutErrors, -} = require('internal/modules/esm/get_format'); diff --git a/lib/internal/modules/esm/translators.js b/lib/internal/modules/esm/translators.js index 1a686612329136..12c3cef5e68014 100644 --- a/lib/internal/modules/esm/translators.js +++ b/lib/internal/modules/esm/translators.js @@ -14,7 +14,7 @@ const { StringPrototypeReplaceAll, StringPrototypeSlice, StringPrototypeStartsWith, - globalThis: { WebAssembly }, + globalThis, } = primordials; const { @@ -58,16 +58,7 @@ const { maybeCacheSourceMap } = require('internal/source_map/source_map_cache'); const moduleWrap = internalBinding('module_wrap'); const { ModuleWrap, kEvaluationPhase } = moduleWrap; -// Lazy-loading to avoid circular dependencies. -let getSourceSync; -/** - * @param {Parameters<typeof import('./load').getSourceSync>[0]} url - * @returns {ReturnType<typeof import('./load').getSourceSync>} - */ -function getSource(url) { - getSourceSync ??= require('internal/modules/esm/load').getSourceSync; - return getSourceSync(url); -} +const { getSourceSync } = require('internal/modules/esm/load'); const { parse: cjsParse } = internalBinding('cjs_lexer'); @@ -102,6 +93,8 @@ translators.set('module', function moduleStrategy(url, translateContext, parentU const { requestTypes: { kRequireInImportedCJS } } = require('internal/modules/esm/utils'); const kShouldSkipModuleHooks = { __proto__: null, shouldSkipModuleHooks: true }; +const kShouldNotSkipModuleHooks = { __proto__: null, shouldSkipModuleHooks: false }; + /** * Loads a CommonJS module via the ESM Loader sync CommonJS translator. * This translator creates its own version of the `require` function passed into CommonJS modules. @@ -114,7 +107,9 @@ const kShouldSkipModuleHooks = { __proto__: null, shouldSkipModuleHooks: true }; * @param {boolean} isMain - Whether the module is the entrypoint */ function loadCJSModule(module, source, url, filename, isMain) { - const compileResult = compileFunctionForCJSLoader(source, filename, false /* is_sea_main */, false); + // Use the full URL as the V8 resource name so that any search params + // (e.g. ?node-test-mock) are preserved in coverage reports. + const compileResult = compileFunctionForCJSLoader(source, url, false /* is_sea_main */, false); const { function: compiledWrapper, sourceMapURL, sourceURL } = compileResult; // Cache the source map for the cjs module if present. @@ -172,14 +167,17 @@ function loadCJSModule(module, source, url, filename, isMain) { }; setOwnProperty(requireFn, 'resolve', function resolve(specifier) { if (!StringPrototypeStartsWith(specifier, 'node:')) { - const path = CJSModule._resolveFilename(specifier, module); - if (specifier !== path) { - specifier = `${pathToFileURL(path)}`; + const { + filename, url: resolvedURL, + } = resolveForCJSWithHooks(specifier, module, false, kShouldNotSkipModuleHooks); + if (specifier !== filename) { + specifier = resolvedURL ?? `${pathToFileURL(filename)}`; } } const request = { specifier, __proto__: null, attributes: kEmptyObject }; - const { url: resolvedURL } = cascadedLoader.resolveSync(url, request); + // Skip sync hooks in resolveSync since resolveForCJSWithHooks already ran them above. + const { url: resolvedURL } = cascadedLoader.resolveSync(url, request, /* shouldSkipSyncHooks */ true); return urlToFilename(resolvedURL); }); setOwnProperty(requireFn, 'main', process.mainModule); @@ -209,7 +207,7 @@ function createCJSModuleWrap(url, translateContext, parentURL, loadCJS = loadCJS const isMain = (parentURL === undefined); const filename = urlToFilename(url); // In case the source was not provided by the `load` step, we need fetch it now. - source = stringify(source ?? getSource(new URL(url)).source); + source = stringify(source ?? getSourceSync(new URL(url)).source); const { exportNames, module } = cjsPreparseModuleExports(filename, source, sourceFormat); cjsCache.set(url, module); @@ -409,7 +407,7 @@ function cjsPreparseModuleExports(filename, source, format) { let resolved; let format; try { - ({ format, filename: resolved } = resolveForCJSWithHooks(reexport, module, false)); + ({ format, filename: resolved } = resolveForCJSWithHooks(reexport, module, false, kShouldNotSkipModuleHooks)); } catch (e) { debug(`Failed to resolve '${reexport}', skipping`, e); continue; @@ -515,6 +513,8 @@ translators.set('json', function jsonStrategy(url, translateContext) { const wasmInstances = new SafeWeakMap(); translators.set('wasm', function(url, translateContext) { const { source } = translateContext; + // WebAssembly global is not available during snapshot building, so we need to get it lazily. + const { WebAssembly } = globalThis; assertBufferSource(source, false, 'load'); debug(`Translating WASMModule ${url}`, translateContext); @@ -523,6 +523,7 @@ translators.set('wasm', function(url, translateContext) { try { compiled = new WebAssembly.Module(source, { builtins: ['js-string'], + importedStringConstants: 'wasm:js/string-constants', }); } catch (err) { err.message = errPath(url) + ': ' + err.message; diff --git a/lib/internal/modules/esm/worker.js b/lib/internal/modules/esm/worker.js index fa5fa87d20efb1..e2553b253db830 100644 --- a/lib/internal/modules/esm/worker.js +++ b/lib/internal/modules/esm/worker.js @@ -37,7 +37,7 @@ const { isCascadedLoaderInitialized, getOrInitializeCascadedLoader } = require(' const { AsyncLoaderHooksOnLoaderHookWorker } = require('internal/modules/esm/hooks'); /** - * Register asynchronus module loader customization hooks. This should only be run in the loader + * Register asynchronous module loader customization hooks. This should only be run in the loader * hooks worker. In a non-loader-hooks thread, if any asynchronous loader hook is registered, the * ModuleLoader#asyncLoaderHooks are initialized to be AsyncLoaderHooksProxiedToLoaderHookWorker * which posts the messages to the async loader hook worker thread. diff --git a/lib/internal/modules/helpers.js b/lib/internal/modules/helpers.js index b04ac126cd35b9..87af4da0294469 100644 --- a/lib/internal/modules/helpers.js +++ b/lib/internal/modules/helpers.js @@ -40,6 +40,7 @@ const { flushCompileCache, } = internalBinding('modules'); +const lazyCJSLoader = getLazy(() => require('internal/modules/cjs/loader')); let debug = require('internal/util/debuglog').debuglog('module', (fn) => { debug = fn; }); @@ -160,7 +161,23 @@ function makeRequireFunction(mod) { */ function resolve(request, options) { validateString(request, 'request'); - return Module._resolveFilename(request, mod, false, options); + const { resolveForCJSWithHooks } = lazyCJSLoader(); + // require.resolve() has different behaviors from the internal resolution used by + // Module._load: + // 1. When the request resolves to a non-existent built-in, it throws MODULE_NOT_FOUND + // instead of UNKNOWN_BUILTIN_MODULE. This is handled by resolveForCJSWithHooks. + // 2. If the request is a prefixed built-in, the returned value is also prefixed. This + // is handled below. + const { filename, url } = resolveForCJSWithHooks( + request, mod, /* isMain */ false, { + __proto__: null, + shouldSkipModuleHooks: false, + requireResolveOptions: options ?? {}, + }); + if (url === request && StringPrototypeStartsWith(request, 'node:')) { + return url; + } + return filename; } require.resolve = resolve; diff --git a/lib/internal/net.js b/lib/internal/net.js index d380d8a41982e2..80de67791512e4 100644 --- a/lib/internal/net.js +++ b/lib/internal/net.js @@ -100,6 +100,9 @@ function isLoopback(host) { module.exports = { kReinitializeHandle: Symbol('kReinitializeHandle'), + kSetNoDelay: Symbol('kSetNoDelay'), + kSetKeepAlive: Symbol('kSetKeepAlive'), + kSetKeepAliveInitialDelay: Symbol('kSetKeepAliveInitialDelay'), isIP, isIPv4, isIPv6, diff --git a/lib/internal/process/pre_execution.js b/lib/internal/process/pre_execution.js index 8ed8802adcda30..e9ab2b2a8958e9 100644 --- a/lib/internal/process/pre_execution.js +++ b/lib/internal/process/pre_execution.js @@ -124,6 +124,8 @@ function prepareExecution(options) { // Process initial diagnostic reporting configuration, if present. initializeReport(); + setupDiagnosticsChannel(); + // Load permission system API initializePermission(); @@ -161,6 +163,9 @@ function prepareExecution(options) { assert(!initializeModules); } + const { initializeExtensionFormatMap } = require('internal/modules/esm/get_format'); + initializeExtensionFormatMap(); + setupVmModules(); if (initializeModules) { initializeModuleLoaders({ shouldSpawnLoaderHookWorker, shouldPreloadModules }); @@ -601,6 +606,14 @@ function initializeClusterIPC() { } } +function setupDiagnosticsChannel() { + // Re-link native channels after snapshot deserialization since + // JS references are cleared during serialization. + const dc = require('diagnostics_channel'); + const dc_binding = internalBinding('diagnostics_channel'); + dc_binding.linkNativeChannel((name) => dc.channel(name)); +} + function initializePermission() { const permission = getOptionValue('--permission'); if (permission) { diff --git a/lib/internal/quic/quic.js b/lib/internal/quic/quic.js index ffc586c7fbe4f3..cae80dc12be341 100644 --- a/lib/internal/quic/quic.js +++ b/lib/internal/quic/quic.js @@ -93,7 +93,6 @@ const { const { isKeyObject, - isCryptoKey, } = require('internal/crypto/keys'); const { @@ -106,6 +105,7 @@ const { const { buildNgHeaderString, + assertValidPseudoHeader, } = require('internal/http2/util'); const kEmptyObject = { __proto__: null }; @@ -137,7 +137,6 @@ const { kVersionNegotiation, kInspect, kKeyObjectHandle, - kKeyObjectInner, kWantsHeaders, kWantsTrailers, } = require('internal/quic/symbols'); @@ -181,7 +180,6 @@ const onSessionHandshakeChannel = dc.channel('quic.session.handshake'); /** * @typedef {import('../socketaddress.js').SocketAddress} SocketAddress * @typedef {import('../crypto/keys.js').KeyObject} KeyObject - * @typedef {import('../crypto/keys.js').CryptoKey} CryptoKey */ /** @@ -254,7 +252,7 @@ const onSessionHandshakeChannel = dc.channel('quic.session.handshake'); * @property {boolean} [verifyClient] Verify the client * @property {boolean} [tlsTrace] Enable TLS tracing * @property {boolean} [verifyPrivateKey] Verify the private key - * @property {KeyObject|CryptoKey|Array<KeyObject|CryptoKey>} [keys] The keys + * @property {KeyObject|KeyObject[]} [keys] The keys * @property {ArrayBuffer|ArrayBufferView|Array<ArrayBuffer|ArrayBufferView>} [certs] The certificates * @property {ArrayBuffer|ArrayBufferView|Array<ArrayBuffer|ArrayBufferView>} [ca] The certificate authority * @property {ArrayBuffer|ArrayBufferView|Array<ArrayBuffer|ArrayBufferView>} [crl] The certificate revocation list @@ -780,8 +778,13 @@ class QuicStream { } else { debug(`stream ${this.id} sending headers`, headers); } + const headerString = buildNgHeaderString( + headers, + assertValidPseudoHeader, + true, // This could become an option in future + ); // TODO(@jasnell): Support differentiating between early headers, primary headers, etc - return this.#handle.sendHeaders(1, buildNgHeaderString(headers), 1); + return this.#handle.sendHeaders(1, headerString, 1); } [kFinishClose](error) { @@ -1993,13 +1996,8 @@ function processTlsOptions(tls, forServer) { throw new ERR_INVALID_ARG_VALUE('options.keys', key, 'must be a private key'); } ArrayPrototypePush(keyHandles, key[kKeyObjectHandle]); - } else if (isCryptoKey(key)) { - if (key.type !== 'private') { - throw new ERR_INVALID_ARG_VALUE('options.keys', key, 'must be a private key'); - } - ArrayPrototypePush(keyHandles, key[kKeyObjectInner][kKeyObjectHandle]); } else { - throw new ERR_INVALID_ARG_TYPE('options.keys', ['KeyObject', 'CryptoKey'], key); + throw new ERR_INVALID_ARG_TYPE('options.keys', 'KeyObject', key); } } } diff --git a/lib/internal/quic/symbols.js b/lib/internal/quic/symbols.js index 15f2339fc95504..61e1791bda153a 100644 --- a/lib/internal/quic/symbols.js +++ b/lib/internal/quic/symbols.js @@ -10,7 +10,6 @@ const { const { kHandle: kKeyObjectHandle, - kKeyObject: kKeyObjectInner, } = require('internal/crypto/util'); // Symbols used to hide various private properties and methods from the @@ -54,7 +53,6 @@ module.exports = { kHeaders, kInspect, kKeyObjectHandle, - kKeyObjectInner, kListen, kNewSession, kNewStream, diff --git a/lib/internal/repl/completion.js b/lib/internal/repl/completion.js index a16b7af0d1732c..8587e5e5b2333b 100644 --- a/lib/internal/repl/completion.js +++ b/lib/internal/repl/completion.js @@ -48,7 +48,7 @@ const CJSModule = require('internal/modules/cjs/loader').Module; const { extensionFormatMap, -} = require('internal/modules/esm/formats'); +} = require('internal/modules/esm/get_format'); const path = require('path'); const fs = require('fs'); diff --git a/lib/internal/source_map/source_map_cache.js b/lib/internal/source_map/source_map_cache.js index a4a95ad0ae49c3..95b09090c4739c 100644 --- a/lib/internal/source_map/source_map_cache.js +++ b/lib/internal/source_map/source_map_cache.js @@ -247,7 +247,10 @@ function dataFromUrl(sourceURL, sourceMappingURL) { } } - const mapURL = new URL(sourceMappingURL, sourceURL).href; + const mapURL = URLParse(sourceMappingURL, sourceURL); + if (mapURL === null) { + return null; + } return sourceMapFromFile(mapURL); } @@ -276,7 +279,7 @@ function lineLengths(content) { /** * Read source map from file. - * @param {string} mapURL - file url of the source map + * @param {URL} mapURL - file url of the source map * @returns {object} deserialized source map JSON object */ function sourceMapFromFile(mapURL) { diff --git a/lib/internal/streams/fast-utf8-stream.js b/lib/internal/streams/fast-utf8-stream.js index 25f4771d052a2a..cb86f245302620 100644 --- a/lib/internal/streams/fast-utf8-stream.js +++ b/lib/internal/streams/fast-utf8-stream.js @@ -237,7 +237,7 @@ class Utf8Stream extends EventEmitter { this.on('newListener', (name) => { if (name === 'drain') { - this._asyncDrainScheduled = false; + this.#asyncDrainScheduled = false; } }); @@ -894,11 +894,23 @@ class Utf8Stream extends EventEmitter { * @returns {{writingBuf: string | Buffer, len: number}} released writingBuf and length */ function releaseWritingBuf(writingBuf, len, n) { - // if Buffer.byteLength is equal to n, that means writingBuf contains no multi-byte character - if (typeof writingBuf === 'string' && Buffer.byteLength(writingBuf) !== n) { - // Since the fs.write callback parameter `n` means how many bytes the passed of string - // We calculate the original string length for avoiding the multi-byte character issue - n = Buffer.from(writingBuf).subarray(0, n).toString().length; + if (typeof writingBuf === 'string') { + const byteLength = Buffer.byteLength(writingBuf); + if (byteLength !== n) { + // Since fs.write returns the number of bytes written, we need to find + // how many complete characters fit within those n bytes. + // If a partial write splits a multi-byte UTF-8 character, we must back up + // to the start of that character to avoid data corruption. + const buf = Buffer.from(writingBuf); + // Back up from position n to find a valid UTF-8 character boundary. + // UTF-8 continuation bytes have the pattern 10xxxxxx (0x80-0xBF). + // We need to find the start of the character that was split. + while (n > 0 && (buf[n] & 0xC0) === 0x80) { + n--; + } + // Decode the properly-aligned bytes to get the character count. + n = buf.subarray(0, n).toString().length; + } } len = MathMax(len - n, 0); writingBuf = writingBuf.slice(n); diff --git a/lib/internal/streams/pipeline.js b/lib/internal/streams/pipeline.js index ad3f0796875aae..546ff579d8ebbd 100644 --- a/lib/internal/streams/pipeline.js +++ b/lib/internal/streams/pipeline.js @@ -227,7 +227,7 @@ function pipelineImpl(streams, callback, opts) { } function finishImpl(err, final) { - if (err && (!error || error.code === 'ERR_STREAM_PREMATURE_CLOSE')) { + if (err && (!error || error.code === 'ERR_STREAM_PREMATURE_CLOSE' || error.name === 'AbortError')) { error = err; } diff --git a/lib/internal/streams/readable.js b/lib/internal/streams/readable.js index 00cf273add0453..51444deb355c3b 100644 --- a/lib/internal/streams/readable.js +++ b/lib/internal/streams/readable.js @@ -1664,7 +1664,7 @@ function fromList(n, state) { n -= str.length; buf[idx++] = null; } else { - if (n === buf.length) { + if (n === str.length) { ret += str; buf[idx++] = null; } else { diff --git a/lib/internal/streams/writable.js b/lib/internal/streams/writable.js index a9beecee156ee6..e934c38bbf9acc 100644 --- a/lib/internal/streams/writable.js +++ b/lib/internal/streams/writable.js @@ -347,7 +347,7 @@ function WritableState(options, stream, isDuplex) { this.corked = 0; // The callback that's passed to _write(chunk, cb). - this.onwrite = onwrite.bind(undefined, stream); + this.onwrite = (er) => onwrite(stream, er); // The amount that is being written when _write is called. this.writelen = 0; diff --git a/lib/internal/test_runner/harness.js b/lib/internal/test_runner/harness.js index 6b3b13b2c88d65..5418a14a4410a4 100644 --- a/lib/internal/test_runner/harness.js +++ b/lib/internal/test_runner/harness.js @@ -3,6 +3,7 @@ const { ArrayPrototypeForEach, ArrayPrototypePush, FunctionPrototypeBind, + Promise, PromiseResolve, PromiseWithResolvers, SafeMap, @@ -32,7 +33,7 @@ const { PassThrough, compose } = require('stream'); const { reportReruns } = require('internal/test_runner/reporter/rerun'); const { queueMicrotask } = require('internal/process/task_queues'); const { TIMEOUT_MAX } = require('internal/timers'); -const { clearInterval, setInterval } = require('timers'); +const { clearInterval, setImmediate, setInterval } = require('timers'); const { bigint: hrtime } = process.hrtime; const testResources = new SafeMap(); let globalRoot; @@ -289,7 +290,33 @@ function setupProcessState(root, globalOptions) { } }; + const findRunningTests = (test, running = []) => { + if (test.startTime !== null && !test.finished) { + for (let i = 0; i < test.subtests.length; i++) { + findRunningTests(test.subtests[i], running); + } + // Only add leaf tests (innermost running tests) + if (test.activeSubtests === 0 && test.name !== '<root>') { + ArrayPrototypePush(running, { + __proto__: null, + name: test.name, + nesting: test.nesting, + file: test.loc?.file, + line: test.loc?.line, + column: test.loc?.column, + }); + } + } + return running; + }; + const terminationHandler = async () => { + const runningTests = findRunningTests(root); + if (runningTests.length > 0) { + root.reporter.interrupted(runningTests); + // Allow the reporter stream to process the interrupted event + await new Promise((resolve) => setImmediate(resolve)); + } await exitHandler(true); process.exit(); }; diff --git a/lib/internal/test_runner/mock/loader.js b/lib/internal/test_runner/mock/loader.js index a7a22539be3093..d64ffdfa096559 100644 --- a/lib/internal/test_runner/mock/loader.js +++ b/lib/internal/test_runner/mock/loader.js @@ -113,10 +113,10 @@ function defaultExportSource(useESM, hasDefaultExport) { if (!hasDefaultExport) { return ''; } else if (useESM) { - return 'export default $__exports.defaultExport;'; + return 'export default $__exports.moduleExports.default;'; } - return 'module.exports = $__exports.defaultExport;'; + return 'module.exports = $__exports.moduleExports.default;'; } function namedExportsSource(useESM, exportNames) { @@ -134,9 +134,9 @@ if (module.exports === null || typeof module.exports !== 'object') { const name = exportNames[i]; if (useESM) { - source += `export let ${name} = $__exports.namedExports[${JSONStringify(name)}];\n`; + source += `export let ${name} = $__exports.moduleExports[${JSONStringify(name)}];\n`; } else { - source += `module.exports[${JSONStringify(name)}] = $__exports.namedExports[${JSONStringify(name)}];\n`; + source += `module.exports[${JSONStringify(name)}] = $__exports.moduleExports[${JSONStringify(name)}];\n`; } } diff --git a/lib/internal/test_runner/mock/mock.js b/lib/internal/test_runner/mock/mock.js index 1af24c77a10731..fb1ed322b414fc 100644 --- a/lib/internal/test_runner/mock/mock.js +++ b/lib/internal/test_runner/mock/mock.js @@ -1,10 +1,12 @@ 'use strict'; const { + ArrayPrototypeFilter, ArrayPrototypePush, ArrayPrototypeSlice, Error, FunctionPrototypeBind, FunctionPrototypeCall, + ObjectAssign, ObjectDefineProperty, ObjectGetOwnPropertyDescriptor, ObjectGetPrototypeOf, @@ -33,6 +35,7 @@ const { URLParse, } = require('internal/url'); const { + deprecateProperty, emitExperimentalWarning, getStructuredStack, kEmptyObject, @@ -61,6 +64,14 @@ const kSupportedFormats = [ 'module', ]; let sharedModuleState; +const deprecateNamedExports = deprecateProperty( + 'namedExports', + 'mock.module(): options.namedExports is deprecated. Use options.exports instead.', +); +const deprecateDefaultExport = deprecateProperty( + 'defaultExport', + 'mock.module(): options.defaultExport is deprecated. Use options.exports.default instead.', +); const { hooks: mockHooks, mocks, @@ -185,20 +196,16 @@ class MockModuleContext { baseURL, cache, caller, - defaultExport, format, fullPath, - hasDefaultExport, - namedExports, + moduleExports, sharedState, specifier, }) { const config = { __proto__: null, cache, - defaultExport, - hasDefaultExport, - namedExports, + moduleExports, caller, }; @@ -230,8 +237,8 @@ class MockModuleContext { __proto__: null, url: baseURL, cache, - exportNames: ObjectKeys(namedExports), - hasDefaultExport, + exportNames: ArrayPrototypeFilter(ObjectKeys(moduleExports), (k) => k !== 'default'), + hasDefaultExport: 'default' in moduleExports, format, localVersion, active: true, @@ -241,8 +248,7 @@ class MockModuleContext { delete Module._cache[fullPath]; sharedState.mockExports.set(baseURL, { __proto__: null, - defaultExport, - namedExports, + moduleExports, }); } @@ -627,14 +633,9 @@ class MockTracker { debug('module mock entry, specifier = "%s", options = %o', specifier, options); const { - cache = false, - namedExports = kEmptyObject, - defaultExport, - } = options; - const hasDefaultExport = 'defaultExport' in options; - - validateBoolean(cache, 'options.cache'); - validateObject(namedExports, 'options.namedExports'); + cache, + moduleExports, + } = normalizeModuleMockOptions(options); const sharedState = setupSharedModuleState(); const mockSpecifier = StringPrototypeStartsWith(specifier, 'node:') ? @@ -673,11 +674,9 @@ class MockTracker { baseURL: baseURL.href, cache, caller, - defaultExport, format, fullPath, - hasDefaultExport, - namedExports, + moduleExports, sharedState, specifier: mockSpecifier, }); @@ -816,6 +815,73 @@ class MockTracker { } } +function normalizeModuleMockOptions(options) { + const { cache = false } = options; + validateBoolean(cache, 'options.cache'); + + const hasExports = 'exports' in options; + const hasNamedExports = 'namedExports' in options; + const hasDefaultExport = 'defaultExport' in options; + + deprecateNamedExports(options); + deprecateDefaultExport(options); + + const moduleExports = { __proto__: null }; + + if (hasExports) { + validateObject(options.exports, 'options.exports'); + } + + if (hasNamedExports) { + validateObject(options.namedExports, 'options.namedExports'); + } + + if (hasExports && (hasNamedExports || hasDefaultExport)) { + let reason = "cannot be used with 'options.namedExports'"; + + if (hasDefaultExport) { + reason = hasNamedExports ? + "cannot be used with 'options.namedExports' or 'options.defaultExport'" : + "cannot be used with 'options.defaultExport'"; + } + + throw new ERR_INVALID_ARG_VALUE('options.exports', options.exports, reason); + } + + if (hasExports) { + copyOwnProperties(options.exports, moduleExports); + } + + if (hasNamedExports) { + copyOwnProperties(options.namedExports, moduleExports); + } + + if (hasDefaultExport) { + ObjectDefineProperty( + moduleExports, + 'default', + ObjectAssign({ __proto__: null }, ObjectGetOwnPropertyDescriptor(options, 'defaultExport')), + ); + } + + return { + __proto__: null, + cache, + moduleExports, + }; +} + + +function copyOwnProperties(from, to) { + const keys = ObjectKeys(from); + + for (let i = 0; i < keys.length; ++i) { + const key = keys[i]; + const descriptor = ObjectGetOwnPropertyDescriptor(from, key); + ObjectDefineProperty(to, key, descriptor); + } +} + function setupSharedModuleState() { if (sharedModuleState === undefined) { const { mock } = require('test'); @@ -855,9 +921,7 @@ function cjsMockModuleLoad(request, parent, isMain) { const { cache, caller, - defaultExport, - hasDefaultExport, - namedExports, + moduleExports, } = config; if (cache && Module._cache[resolved]) { @@ -866,9 +930,10 @@ function cjsMockModuleLoad(request, parent, isMain) { return Module._cache[resolved].exports; } + const hasDefaultExport = 'default' in moduleExports; // eslint-disable-next-line node-core/set-proto-to-null-in-object - const modExports = hasDefaultExport ? defaultExport : {}; - const exportNames = ObjectKeys(namedExports); + const modExports = hasDefaultExport ? moduleExports.default : {}; + const exportNames = ArrayPrototypeFilter(ObjectKeys(moduleExports), (k) => k !== 'default'); if ((typeof modExports !== 'object' || modExports === null) && exportNames.length > 0) { @@ -878,7 +943,7 @@ function cjsMockModuleLoad(request, parent, isMain) { for (let i = 0; i < exportNames.length; ++i) { const name = exportNames[i]; - const descriptor = ObjectGetOwnPropertyDescriptor(namedExports, name); + const descriptor = ObjectGetOwnPropertyDescriptor(moduleExports, name); ObjectDefineProperty(modExports, name, descriptor); } diff --git a/lib/internal/test_runner/reporter/spec.js b/lib/internal/test_runner/reporter/spec.js index 14c447f316492f..fce0754e25061a 100644 --- a/lib/internal/test_runner/reporter/spec.js +++ b/lib/internal/test_runner/reporter/spec.js @@ -106,8 +106,31 @@ class SpecReporter extends Transform { break; case 'test:watch:restarted': return `\nRestarted at ${DatePrototypeToLocaleString(new Date())}\n`; + case 'test:interrupted': + return this.#formatInterruptedTests(data.tests); } } + #formatInterruptedTests(tests) { + if (tests.length === 0) { + return ''; + } + + const results = [ + `\n${colors.yellow}Interrupted while running:${colors.white}\n`, + ]; + + for (let i = 0; i < tests.length; i++) { + const test = tests[i]; + let msg = `${indent(test.nesting)}${reporterUnicodeSymbolMap['warning:alert']}${test.name}`; + if (test.file) { + const relPath = relative(this.#cwd, test.file); + msg += ` ${colors.gray}(${relPath}:${test.line}:${test.column})${colors.white}`; + } + ArrayPrototypePush(results, msg); + } + + return ArrayPrototypeJoin(results, '\n') + '\n'; + } _transform({ type, data }, encoding, callback) { callback(null, this.#handleEvent({ __proto__: null, type, data })); } diff --git a/lib/internal/test_runner/reporter/tap.js b/lib/internal/test_runner/reporter/tap.js index 01c698871b9134..c3bbd1d144eb35 100644 --- a/lib/internal/test_runner/reporter/tap.js +++ b/lib/internal/test_runner/reporter/tap.js @@ -61,6 +61,16 @@ async function * tapReporter(source) { case 'test:coverage': yield getCoverageReport(indent(data.nesting), data.summary, '# ', '', true); break; + case 'test:interrupted': + for (let i = 0; i < data.tests.length; i++) { + const test = data.tests[i]; + let msg = `Interrupted while running: ${test.name}`; + if (test.file) { + msg += ` at ${test.file}:${test.line}:${test.column}`; + } + yield `# ${tapEscape(msg)}\n`; + } + break; } } } @@ -77,7 +87,7 @@ function reportTest(nesting, testNumber, status, name, skip, todo, expectFailure } else if (todo !== undefined) { line += ` # TODO${typeof todo === 'string' && todo.length ? ` ${tapEscape(todo)}` : ''}`; } else if (expectFailure !== undefined) { - line += ' # EXPECTED FAILURE'; + line += ` # EXPECTED FAILURE${typeof expectFailure === 'string' ? ` ${tapEscape(expectFailure)}` : ''}`; } line += '\n'; diff --git a/lib/internal/test_runner/runner.js b/lib/internal/test_runner/runner.js index df2c85bdaed8de..f90c7dcad10346 100644 --- a/lib/internal/test_runner/runner.js +++ b/lib/internal/test_runner/runner.js @@ -15,6 +15,7 @@ const { ArrayPrototypeSlice, ArrayPrototypeSome, ArrayPrototypeSort, + MathMax, ObjectAssign, PromisePrototypeThen, PromiseWithResolvers, @@ -23,6 +24,7 @@ const { SafePromiseAllReturnVoid, SafePromiseAllSettledReturnVoid, SafeSet, + String, StringPrototypeIndexOf, StringPrototypeSlice, StringPrototypeStartsWith, @@ -33,6 +35,7 @@ const { const { spawn } = require('child_process'); const { finished } = require('internal/streams/end-of-stream'); +const { availableParallelism } = require('os'); const { resolve, sep, isAbsolute } = require('path'); const { DefaultDeserializer, DefaultSerializer } = require('v8'); const { getOptionValue, getOptionsAsFlagsFromBinding } = require('internal/options'); @@ -117,6 +120,21 @@ const kCanceledTests = new SafeSet() let kResistStopPropagation; +// Worker ID pool management for concurrent test execution +class WorkerIdPool { + #nextId = 0; + #maxConcurrency; + + constructor(maxConcurrency) { + this.#maxConcurrency = maxConcurrency; + } + + acquire() { + const id = (this.#nextId++ % this.#maxConcurrency) + 1; + return id; + } +} + function createTestFileList(patterns, cwd) { const hasUserSuppliedPattern = patterns != null; if (!patterns || patterns.length === 0) { @@ -404,6 +422,15 @@ function runTestFile(path, filesWatcher, opts) { const args = getRunArgs(path, opts); const stdio = ['pipe', 'pipe', 'pipe']; const env = { __proto__: null, NODE_TEST_CONTEXT: 'child-v8', ...(opts.env || process.env) }; + + // Acquire a worker ID from the pool for process isolation mode + let workerId; + if (opts.workerIdPool) { + workerId = opts.workerIdPool.acquire(); + env.NODE_TEST_WORKER_ID = String(workerId); + debug('Assigned worker ID %d to test file: %s', workerId, path); + } + if (watchMode) { stdio.push('ipc'); env.WATCH_REPORT_DEPENDENCIES = '1'; @@ -769,6 +796,25 @@ function run(options = kEmptyObject) { let postRun; let filesWatcher; let runFiles; + + // Create worker ID pool for concurrent test execution. + // Use concurrency from globalOptions which has been processed by parseCommandLine(). + const effectiveConcurrency = globalOptions.concurrency ?? concurrency; + let maxConcurrency = 1; + if (effectiveConcurrency === true) { + maxConcurrency = MathMax(availableParallelism() - 1, 1); + } else if (typeof effectiveConcurrency === 'number') { + maxConcurrency = effectiveConcurrency; + } + const workerIdPool = new WorkerIdPool(maxConcurrency); + debug( + 'Created worker ID pool with max concurrency: %d, ' + + 'effectiveConcurrency: %s, testFiles: %d', + maxConcurrency, + effectiveConcurrency, + testFiles.length, + ); + const opts = { __proto__: null, root, @@ -786,6 +832,7 @@ function run(options = kEmptyObject) { execArgv, rerunFailuresFilePath, env, + workerIdPool: isolation === 'process' ? workerIdPool : null, }; if (isolation === 'process') { @@ -812,6 +859,10 @@ function run(options = kEmptyObject) { }); }; } else if (isolation === 'none') { + // For isolation=none, set worker ID to 1 in the current process + process.env.NODE_TEST_WORKER_ID = '1'; + debug('Set NODE_TEST_WORKER_ID=1 for isolation=none'); + if (watch) { const absoluteTestFiles = ArrayPrototypeMap(testFiles, (file) => (isAbsolute(file) ? file : resolve(cwd, file))); filesWatcher = watchFiles(absoluteTestFiles, opts); diff --git a/lib/internal/test_runner/snapshot.js b/lib/internal/test_runner/snapshot.js index ff3e3c8d0e6ee6..158ec1d44216cd 100644 --- a/lib/internal/test_runner/snapshot.js +++ b/lib/internal/test_runner/snapshot.js @@ -9,6 +9,7 @@ const { SafeMap, String, StringPrototypeReplaceAll, + StringPrototypeSlice, } = primordials; const { codes: { @@ -291,7 +292,7 @@ function validateFunctionArray(fns, name) { } function escapeSnapshotKey(str) { - let result = JSONStringify(str, null, 2).slice(1, -1); + let result = StringPrototypeSlice(JSONStringify(str, null, 2), 1, -1); result = StringPrototypeReplaceAll(result, '`', '\\`'); result = StringPrototypeReplaceAll(result, '${', '\\${'); return result; diff --git a/lib/internal/test_runner/test.js b/lib/internal/test_runner/test.js index a545c450a3dceb..0fcf0bdab644d2 100644 --- a/lib/internal/test_runner/test.js +++ b/lib/internal/test_runner/test.js @@ -1,5 +1,6 @@ 'use strict'; const { + ArrayPrototypeEvery, ArrayPrototypePush, ArrayPrototypePushApply, ArrayPrototypeShift, @@ -13,6 +14,7 @@ const { MathMax, Number, NumberPrototypeToFixed, + ObjectKeys, ObjectSeal, Promise, PromisePrototypeThen, @@ -40,6 +42,7 @@ const { AbortError, codes: { ERR_INVALID_ARG_TYPE, + ERR_INVALID_ARG_VALUE, ERR_TEST_FAILURE, }, } = require('internal/errors'); @@ -56,7 +59,8 @@ const { once: runOnce, setOwnProperty, } = require('internal/util'); -const { isPromise } = require('internal/util/types'); +const assert = require('assert'); +const { isPromise, isRegExp } = require('internal/util/types'); const { validateAbortSignal, validateFunction, @@ -145,7 +149,7 @@ function stopTest(timeout, signal) { disposeFunction = () => { abortListener[SymbolDispose](); - timer[SymbolDispose](); + clearTimeout(timer); }; } @@ -285,6 +289,11 @@ class TestContext { return this.#test.attempt ?? 0; } + get workerId() { + const envWorkerId = process.env.NODE_TEST_WORKER_ID; + return Number(envWorkerId) || undefined; + } + diagnostic(message) { this.#test.diagnostic(message); } @@ -487,6 +496,39 @@ class SuiteContext { } } +function parseExpectFailure(expectFailure) { + if (expectFailure === undefined || expectFailure === false) { + return false; + } + + if (typeof expectFailure === 'string') { + return { __proto__: null, label: expectFailure, match: undefined }; + } + + if (typeof expectFailure === 'function' || isRegExp(expectFailure)) { + return { __proto__: null, label: undefined, match: expectFailure }; + } + + if (typeof expectFailure !== 'object') { + return { __proto__: null, label: undefined, match: undefined }; + } + + const keys = ObjectKeys(expectFailure); + if (keys.length === 0) { + throw new ERR_INVALID_ARG_VALUE('options.expectFailure', expectFailure, 'must not be an empty object'); + } + + if (ArrayPrototypeEvery(keys, (k) => k === 'match' || k === 'label')) { + return { + __proto__: null, + label: expectFailure.label, + match: expectFailure.match, + }; + } + + return { __proto__: null, label: undefined, match: expectFailure }; +} + class Test extends AsyncResource { reportedType = 'test'; abortController; @@ -636,7 +678,7 @@ class Test extends AsyncResource { this.plan = null; this.expectedAssertions = plan; this.cancelled = false; - this.expectFailure = expectFailure !== undefined && expectFailure !== false; + this.expectFailure = parseExpectFailure(expectFailure) || this.parent?.expectFailure; this.skipped = skip !== undefined && skip !== false; this.isTodo = (todo !== undefined && todo !== false) || this.parent?.isTodo; this.startTime = null; @@ -706,10 +748,12 @@ class Test extends AsyncResource { this.fn = () => { for (let i = 0; i < (previousAttempt.children?.length ?? 0); i++) { const child = previousAttempt.children[i]; - this.createSubtest(Test, child.name, { __proto__: null }, noop, { + const t = this.createSubtest(Test, child.name, { __proto__: null }, noop, { __proto__: null, loc: [child.line, child.column, child.file], - }, noop).start(); + }, noop); + t.endTime = t.startTime = hrtime(); + t.start(); } }; } @@ -948,7 +992,30 @@ class Test extends AsyncResource { return; } - if (this.expectFailure === true) { + if (this.expectFailure) { + if (typeof this.expectFailure === 'object' && + this.expectFailure.match !== undefined) { + const { match: validation } = this.expectFailure; + try { + const errorToCheck = ( + err?.code === 'ERR_TEST_FAILURE' && + err?.failureType === kTestCodeFailure && + err.cause + ) ? + err.cause : + err; + // eslint-disable-next-line no-restricted-syntax + assert.throws(() => { throw errorToCheck; }, validation); + } catch (e) { + this.passed = false; + this.error = new ERR_TEST_FAILURE( + 'The test failed, but the error did not match the expected validation', + kTestCodeFailure, + ); + this.error.cause = e; + return; + } + } this.passed = true; } else { this.passed = false; @@ -958,7 +1025,7 @@ class Test extends AsyncResource { } pass() { - if (this.error == null && this.expectFailure === true && !this.skipped) { + if (this.error == null && this.expectFailure && !this.skipped) { this.passed = false; this.error = new ERR_TEST_FAILURE( 'test was expected to fail but passed', @@ -970,6 +1037,20 @@ class Test extends AsyncResource { return; } + if (this.skipped || this.isTodo) { + this.passed = true; + return; + } + + if (this.expectFailure) { + this.passed = false; + this.error = new ERR_TEST_FAILURE( + 'Test passed but was expected to fail', + kTestCodeFailure, + ); + return; + } + this.passed = true; } @@ -1071,13 +1152,15 @@ class Test extends AsyncResource { ctx.plan(this.expectedAssertions); } + const wasSkippedBeforeRun = this.skipped; + const after = async () => { if (this.hooks.after.length > 0) { await this.runHook('after', hookArgs); } }; const afterEach = runOnce(async () => { - if (this.parent?.hooks.afterEach.length > 0 && !this.skipped) { + if (this.parent?.hooks.afterEach.length > 0 && !wasSkippedBeforeRun) { await this.parent.runHook('afterEach', hookArgs); } }, kRunOnceOptions); @@ -1359,7 +1442,10 @@ class Test extends AsyncResource { } else if (this.isTodo) { directive = this.reporter.getTodo(this.message); } else if (this.expectFailure) { - directive = this.reporter.getXFail(this.expectFailure); // TODO(@JakobJingleheimer): support specifying failure + const message = typeof this.expectFailure === 'object' ? + this.expectFailure.label : + this.expectFailure; + directive = this.reporter.getXFail(message); } if (this.reportedType) { diff --git a/lib/internal/test_runner/tests_stream.js b/lib/internal/test_runner/tests_stream.js index 7b64487696f53f..17b6890b5fc5df 100644 --- a/lib/internal/test_runner/tests_stream.js +++ b/lib/internal/test_runner/tests_stream.js @@ -149,6 +149,13 @@ class TestsStream extends Readable { }); } + interrupted(tests) { + this[kEmitMessage]('test:interrupted', { + __proto__: null, + tests, + }); + } + end() { this.#tryPush(null); } diff --git a/lib/internal/test_runner/utils.js b/lib/internal/test_runner/utils.js index 5b53342933cdcb..db7e2ee50dd8d6 100644 --- a/lib/internal/test_runner/utils.js +++ b/lib/internal/test_runner/utils.js @@ -384,6 +384,9 @@ function countCompletedTest(test, harness = test.root.harness) { } if (test.reportedType === 'suite') { harness.counters.suites++; + if (!test.passed) { + harness.success = false; + } return; } // Check SKIP and TODO tests first, as those should not be counted as diff --git a/lib/internal/tls/wrap.js b/lib/internal/tls/wrap.js index 196ce9715288cb..ce0d4cc0db6a2a 100644 --- a/lib/internal/tls/wrap.js +++ b/lib/internal/tls/wrap.js @@ -595,6 +595,9 @@ function TLSSocket(socket, opts) { highWaterMark: tlsOptions.highWaterMark, onread: !socket ? tlsOptions.onread : null, signal: tlsOptions.signal, + noDelay: tlsOptions.noDelay, + keepAlive: tlsOptions.keepAlive, + keepAliveInitialDelay: tlsOptions.keepAliveInitialDelay, }); // Proxy for API compatibility @@ -1752,6 +1755,9 @@ exports.connect = function connect(...args) { highWaterMark: options.highWaterMark, onread: options.onread, signal: options.signal, + noDelay: options.noDelay, + keepAlive: options.keepAlive, + keepAliveInitialDelay: options.keepAliveInitialDelay, }); // rejectUnauthorized property can be explicitly defined as `undefined` diff --git a/lib/internal/util/inspect.js b/lib/internal/util/inspect.js index e55c9e68d63b08..ff0445214a4bee 100644 --- a/lib/internal/util/inspect.js +++ b/lib/internal/util/inspect.js @@ -2764,6 +2764,13 @@ if (internalBinding('config').hasIntl) { function stripVTControlCharacters(str) { validateString(str, 'str'); + // Short-circuit: all ANSI escape sequences start with either + // ESC (\u001B, 7-bit) or CSI (\u009B, 8-bit) introducer. + // If neither is present, the string has no VT control characters. + if (StringPrototypeIndexOf(str, '\u001B') === -1 && + StringPrototypeIndexOf(str, '\u009B') === -1) + return str; + return RegExpPrototypeSymbolReplace(ansi, str, ''); } diff --git a/lib/internal/validators.js b/lib/internal/validators.js index b9845c538bb98f..110b045a063460 100644 --- a/lib/internal/validators.js +++ b/lib/internal/validators.js @@ -509,7 +509,7 @@ function validateUnion(value, name, union) { (not necessarily a valid URI reference) followed by zero or more link-params separated by semicolons. */ -const linkValueRegExp = /^(?:<[^>]*>)(?:\s*;\s*[^;"\s]+(?:=(")?[^;"\s]*\1)?)*$/; +const linkValueRegExp = /^(?:<[^>\r\n]*>)(?:\s*;\s*[^;"\s]+(?:=(")?[^;"\s]*\1)?)*$/; /** * @param {any} value diff --git a/lib/internal/webstreams/adapters.js b/lib/internal/webstreams/adapters.js index ed9847f250f1ca..1ffb19b4f59a31 100644 --- a/lib/internal/webstreams/adapters.js +++ b/lib/internal/webstreams/adapters.js @@ -11,6 +11,8 @@ const { SafePromiseAll, SafePromisePrototypeFinally, SafeSet, + StringPrototypeStartsWith, + Symbol, TypeError, TypedArrayPrototypeGetBuffer, TypedArrayPrototypeGetByteLength, @@ -53,6 +55,10 @@ const { Buffer, } = require('buffer'); +const { + isArrayBuffer, +} = require('internal/util/types'); + const { AbortError, ErrnoException, @@ -90,6 +96,9 @@ const { UV_EOF } = internalBinding('uv'); const encoder = new TextEncoder(); +const kValidateChunk = Symbol('kValidateChunk'); +const kDestroyOnSyncError = Symbol('kDestroyOnSyncError'); + // Collect all negative (error) ZLIB codes and Z_NEED_DICT const ZLIB_FAILURES = new SafeSet([ ...ArrayPrototypeFilter( @@ -111,7 +120,14 @@ function handleKnownInternalErrors(cause) { case cause?.code === 'ERR_STREAM_PREMATURE_CLOSE': { return new AbortError(undefined, { cause }); } - case ZLIB_FAILURES.has(cause?.code): { + case ZLIB_FAILURES.has(cause?.code): + // Brotli decoder error codes are formatted as 'ERR_' + + // BrotliDecoderErrorString(), where the latter returns strings like + // '_ERROR_FORMAT_...', '_ERROR_ALLOC_...', '_ERROR_UNREACHABLE', etc. + // The resulting JS error codes all start with 'ERR__ERROR_'. + // Falls through + case cause?.code != null && + StringPrototypeStartsWith(cause.code, 'ERR__ERROR_'): { // eslint-disable-next-line no-restricted-syntax const error = new TypeError(undefined, { cause }); error.code = cause.code; @@ -135,9 +151,10 @@ function handleKnownInternalErrors(cause) { /** * @param {Writable} streamWritable + * @param {object} [options] * @returns {WritableStream} */ -function newWritableStreamFromStreamWritable(streamWritable) { +function newWritableStreamFromStreamWritable(streamWritable, options = kEmptyObject) { // Not using the internal/streams/utils isWritableNodeStream utility // here because it will return false if streamWritable is a Duplex // whose writable option is false. For a Duplex that is not writable, @@ -213,12 +230,29 @@ function newWritableStreamFromStreamWritable(streamWritable) { start(c) { controller = c; }, write(chunk) { - if (streamWritable.writableNeedDrain || !streamWritable.write(chunk)) { - backpressurePromise = PromiseWithResolvers(); - return SafePromisePrototypeFinally( - backpressurePromise.promise, () => { - backpressurePromise = undefined; - }); + if (!streamWritable.writableObjectMode && isArrayBuffer(chunk)) { + chunk = new Uint8Array(chunk); + } + try { + options[kValidateChunk]?.(chunk); + if (streamWritable.writableNeedDrain || !streamWritable.write(chunk)) { + backpressurePromise = PromiseWithResolvers(); + return SafePromisePrototypeFinally( + backpressurePromise.promise, () => { + backpressurePromise = undefined; + }); + } + } catch (error) { + // When the kDestroyOnSyncError flag is set (e.g. for + // CompressionStream), a sync throw must also destroy the + // stream so the readable side is errored too. Without this + // the readable side hangs forever. This replicates the + // TransformStream semantics: error both sides on any throw + // in the transform path. + if (options[kDestroyOnSyncError]) { + destroy(streamWritable, error); + } + throw error; } }, @@ -655,9 +689,15 @@ function newReadableWritablePairFromDuplex(duplex, options = kEmptyObject) { return { readable, writable }; } + const writableOptions = { + __proto__: null, + [kValidateChunk]: options[kValidateChunk], + [kDestroyOnSyncError]: options[kDestroyOnSyncError], + }; + const writable = isWritable(duplex) ? - newWritableStreamFromStreamWritable(duplex) : + newWritableStreamFromStreamWritable(duplex, writableOptions) : new WritableStream(); if (!isWritable(duplex)) @@ -1057,4 +1097,6 @@ module.exports = { newStreamDuplexFromReadableWritablePair, newWritableStreamFromStreamBase, newReadableStreamFromStreamBase, + kValidateChunk, + kDestroyOnSyncError, }; diff --git a/lib/internal/webstreams/compression.js b/lib/internal/webstreams/compression.js index 836c02f7341f70..7ec929d94a0da0 100644 --- a/lib/internal/webstreams/compression.js +++ b/lib/internal/webstreams/compression.js @@ -7,15 +7,28 @@ const { const { newReadableWritablePairFromDuplex, + kValidateChunk, + kDestroyOnSyncError, } = require('internal/webstreams/adapters'); const { customInspect } = require('internal/webstreams/util'); +const { + isArrayBufferView, + isSharedArrayBuffer, +} = require('internal/util/types'); + const { customInspectSymbol: kInspect, kEnumerableProperty, } = require('internal/util'); +const { + codes: { + ERR_INVALID_ARG_TYPE, + }, +} = require('internal/errors'); + const { createEnumConverter } = require('internal/webidl'); let zlib; @@ -24,6 +37,18 @@ function lazyZlib() { return zlib; } +// Per the Compression Streams spec, chunks must be BufferSource +// (ArrayBuffer or ArrayBufferView not backed by SharedArrayBuffer). +function validateBufferSourceChunk(chunk) { + if (isArrayBufferView(chunk) && isSharedArrayBuffer(chunk.buffer)) { + throw new ERR_INVALID_ARG_TYPE( + 'chunk', + ['ArrayBuffer', 'Buffer', 'TypedArray', 'DataView'], + chunk, + ); + } +} + const formatConverter = createEnumConverter('CompressionFormat', [ 'deflate', 'deflate-raw', @@ -62,7 +87,10 @@ class CompressionStream { this.#handle = lazyZlib().createBrotliCompress(); break; } - this.#transform = newReadableWritablePairFromDuplex(this.#handle); + this.#transform = newReadableWritablePairFromDuplex(this.#handle, { + [kValidateChunk]: validateBufferSourceChunk, + [kDestroyOnSyncError]: true, + }); } /** @@ -108,7 +136,9 @@ class DecompressionStream { }); break; case 'deflate-raw': - this.#handle = lazyZlib().createInflateRaw(); + this.#handle = lazyZlib().createInflateRaw({ + rejectGarbageAfterEnd: true, + }); break; case 'gzip': this.#handle = lazyZlib().createGunzip({ @@ -116,17 +146,14 @@ class DecompressionStream { }); break; case 'brotli': - this.#handle = lazyZlib().createBrotliDecompress(); + this.#handle = lazyZlib().createBrotliDecompress({ + rejectGarbageAfterEnd: true, + }); break; } - this.#transform = newReadableWritablePairFromDuplex(this.#handle); - - this.#handle.on('error', (err) => { - if (this.#transform?.writable && - !this.#transform.writable.locked && - typeof this.#transform.writable.abort === 'function') { - this.#transform.writable.abort(err); - } + this.#transform = newReadableWritablePairFromDuplex(this.#handle, { + [kValidateChunk]: validateBufferSourceChunk, + [kDestroyOnSyncError]: true, }); } diff --git a/lib/internal/webstreams/readablestream.js b/lib/internal/webstreams/readablestream.js index f9b9e6b4fb2c3e..94592cdf01258c 100644 --- a/lib/internal/webstreams/readablestream.js +++ b/lib/internal/webstreams/readablestream.js @@ -860,6 +860,31 @@ class ReadableStreamDefaultReader { new ERR_INVALID_STATE.TypeError( 'The reader is not attached to a stream')); } + + const stream = this[kState].stream; + const controller = stream[kState].controller; + + // Fast path: if data is already buffered in a default controller, + // return a resolved promise immediately without creating a read request. + // This is spec-compliant because read() returns a Promise, and + // Promise.resolve() callbacks still run in the microtask queue. + if (stream[kState].state === 'readable' && + isReadableStreamDefaultController(controller) && + controller[kState].queue.length > 0) { + stream[kState].disturbed = true; + const chunk = dequeueValue(controller); + + if (controller[kState].closeRequested && !controller[kState].queue.length) { + readableStreamDefaultControllerClearAlgorithms(controller); + readableStreamClose(stream); + } else { + readableStreamDefaultControllerCallPullIfNeeded(controller); + } + + return PromiseResolve({ value: chunk, done: false }); + } + + // Slow path: create request and go through normal flow const readRequest = new DefaultReadRequest(); readableStreamDefaultReaderRead(this, readRequest); return readRequest.promise; @@ -1286,6 +1311,8 @@ const isReadableStream = isBrandCheck('ReadableStream'); const isReadableByteStreamController = isBrandCheck('ReadableByteStreamController'); +const isReadableStreamDefaultController = + isBrandCheck('ReadableStreamDefaultController'); const isReadableStreamBYOBRequest = isBrandCheck('ReadableStreamBYOBRequest'); const isReadableStreamDefaultReader = @@ -1505,11 +1532,60 @@ function readableStreamPipeTo( } async function step() { - if (shuttingDown) - return true; + if (shuttingDown) return true; + + if (dest[kState].backpressure) { + await writer[kState].ready.promise; + if (shuttingDown) return true; + } + + const controller = source[kState].controller; + + // Fast path: batch reads when data is buffered in a default controller. + // This avoids creating PipeToReadableStreamReadRequest objects and + // reduces promise allocation overhead. + if (source[kState].state === 'readable' && + isReadableStreamDefaultController(controller) && + controller[kState].queue.length > 0) { + + while (controller[kState].queue.length > 0) { + if (shuttingDown) return true; - await writer[kState].ready.promise; + const chunk = dequeueValue(controller); + if (controller[kState].closeRequested && !controller[kState].queue.length) { + readableStreamDefaultControllerClearAlgorithms(controller); + readableStreamClose(source); + } + + // Write the chunk - we're already in a separate microtask from enqueue + // because we awaited writer[kState].ready.promise above + state.currentWrite = writableStreamDefaultWriterWrite(writer, chunk); + setPromiseHandled(state.currentWrite); + + // Check backpressure after each write + if (dest[kState].backpressure) { + // Backpressure - stop batch and wait for ready + break; + } else if (dest[kState].state !== 'writable' || writableStreamCloseQueuedOrInFlight(dest)) { + // Closing or erroring - stop batch and wait for shutdown + break; + } + } + + // Trigger pull if needed after batch + readableStreamDefaultControllerCallPullIfNeeded(controller); + + // Check if stream closed during batch + if (source[kState].state === 'closed') { + return true; + } + + // Yield to microtask queue between batches to allow events/signals to fire + return false; + } + + // Slow path: use read request for async reads const promise = PromiseWithResolvers(); // eslint-disable-next-line no-use-before-define readableStreamDefaultReaderRead(reader, new PipeToReadableStreamReadRequest(writer, state, promise)); @@ -1584,9 +1660,14 @@ class PipeToReadableStreamReadRequest { } [kChunk](chunk) { - this.state.currentWrite = writableStreamDefaultWriterWrite(this.writer, chunk); - setPromiseHandled(this.state.currentWrite); - this.promise.resolve(false); + // Per spec, pipeTo must queue a microtask for the write to avoid + // synchronous write during enqueue(). See WHATWG Streams spec + // "ReadableStreamPipeTo" step 15's "chunk steps". + queueMicrotask(() => { + this.state.currentWrite = writableStreamDefaultWriterWrite(this.writer, chunk); + setPromiseHandled(this.state.currentWrite); + this.promise.resolve(false); + }); } [kClose]() { diff --git a/lib/internal/webstreams/transformstream.js b/lib/internal/webstreams/transformstream.js index 371b597dc681d6..e2d15c05bca249 100644 --- a/lib/internal/webstreams/transformstream.js +++ b/lib/internal/webstreams/transformstream.js @@ -72,7 +72,6 @@ const { const assert = require('internal/assert'); const kSkipThrow = Symbol('kSkipThrow'); - const getNonWritablePropertyDescriptor = (value) => { return { __proto__: null, @@ -524,7 +523,12 @@ function transformStreamDefaultControllerError(controller, error) { async function transformStreamDefaultControllerPerformTransform(controller, chunk) { try { - return await controller[kState].transformAlgorithm(chunk, controller); + const transformAlgorithm = controller[kState].transformAlgorithm; + if (transformAlgorithm === undefined) { + // Algorithms were cleared by a concurrent cancel/abort/close. + return; + } + return await transformAlgorithm(chunk, controller); } catch (error) { transformStreamError(controller[kState].stream, error); throw error; diff --git a/lib/internal/worker.js b/lib/internal/worker.js index f80190800692d7..13c2f5040f6be8 100644 --- a/lib/internal/worker.js +++ b/lib/internal/worker.js @@ -111,8 +111,8 @@ if (isMainThread) { cwdCounter = new Uint32Array(constructSharedArrayBuffer(4)); const originalChdir = process.chdir; process.chdir = function(path) { - AtomicsAdd(cwdCounter, 0, 1); originalChdir(path); + AtomicsAdd(cwdCounter, 0, 1); }; } diff --git a/lib/net.js b/lib/net.js index cbde238ba0a2ce..efd2029fb67ddd 100644 --- a/lib/net.js +++ b/lib/net.js @@ -48,6 +48,9 @@ let debug = require('internal/util/debuglog').debuglog('net', (fn) => { }); const { kReinitializeHandle, + kSetNoDelay, + kSetKeepAlive, + kSetKeepAliveInitialDelay, isIP, isIPv4, isIPv6, @@ -356,9 +359,6 @@ function closeSocketHandle(self, isException, isCleanupPending = false) { const kBytesRead = Symbol('kBytesRead'); const kBytesWritten = Symbol('kBytesWritten'); -const kSetNoDelay = Symbol('kSetNoDelay'); -const kSetKeepAlive = Symbol('kSetKeepAlive'); -const kSetKeepAliveInitialDelay = Symbol('kSetKeepAliveInitialDelay'); const kSetTOS = Symbol('kSetTOS'); function Socket(options) { @@ -1125,7 +1125,7 @@ function internalConnect( err = checkBindError(err, localPort, self._handle); if (err) { const ex = new ExceptionWithHostPort(err, 'bind', localAddress, localPort); - process.nextTick(emitErrorAndDestroy, self, ex); + self.destroy(ex); return; } } @@ -1135,7 +1135,7 @@ function internalConnect( if (addressType === 6 || addressType === 4) { if (self.blockList?.check(address, `ipv${addressType}`)) { - process.nextTick(emitErrorAndDestroy, self, new ERR_IP_BLOCKED(address)); + self.destroy(new ERR_IP_BLOCKED(address)); return; } const req = new TCPConnectWrap(); @@ -1167,20 +1167,12 @@ function internalConnect( } const ex = new ExceptionWithHostPort(err, 'connect', address, port, details); - process.nextTick(emitErrorAndDestroy, self, ex); + self.destroy(ex); } else if ((addressType === 6 || addressType === 4) && hasObserver('net')) { startPerf(self, kPerfHooksNetConnectContext, { type: 'net', name: 'connect', detail: { host: address, port } }); } } -// Helper function to defer socket destruction to the next tick. -// This ensures that error handlers have a chance to be set up -// before the error is emitted, particularly important when using -// http.request with a custom lookup function. -function emitErrorAndDestroy(self, err) { - self.destroy(err); -} - function internalConnectMultiple(context, canceled) { clearTimeout(context[kTimeout]); @@ -1194,11 +1186,11 @@ function internalConnectMultiple(context, canceled) { // All connections have been tried without success, destroy with error if (canceled || context.current === context.addresses.length) { if (context.errors.length === 0) { - process.nextTick(emitErrorAndDestroy, self, new ERR_SOCKET_CONNECTION_TIMEOUT()); + self.destroy(new ERR_SOCKET_CONNECTION_TIMEOUT()); return; } - process.nextTick(emitErrorAndDestroy, self, new NodeAggregateError(context.errors)); + self.destroy(new NodeAggregateError(context.errors)); return; } diff --git a/lib/sqlite.js b/lib/sqlite.js index 6d6ada72008f1c..db781a21ee1ce7 100644 --- a/lib/sqlite.js +++ b/lib/sqlite.js @@ -1,6 +1,3 @@ 'use strict'; -const { emitExperimentalWarning } = require('internal/util'); - -emitExperimentalWarning('SQLite'); module.exports = internalBinding('sqlite'); diff --git a/lib/util.js b/lib/util.js index ebd486addc7eb2..54b7e2f9a442f7 100644 --- a/lib/util.js +++ b/lib/util.js @@ -25,7 +25,6 @@ const { ArrayIsArray, ArrayPrototypePop, ArrayPrototypePush, - ArrayPrototypeReduce, Error, ErrorCaptureStackTrace, FunctionPrototypeBind, @@ -33,12 +32,11 @@ const { ObjectDefineProperties, ObjectDefineProperty, ObjectGetOwnPropertyDescriptors, + ObjectGetOwnPropertyNames, ObjectKeys, ObjectSetPrototypeOf, ObjectValues, ReflectApply, - RegExp, - RegExpPrototypeSymbolReplace, StringPrototypeToWellFormed, } = primordials; @@ -104,13 +102,58 @@ function lazyAbortController() { let internalDeepEqual; -/** - * @param {string} [code] - * @returns {string} - */ -function escapeStyleCode(code) { - if (code === undefined) return ''; - return `\u001b[${code}m`; +// Pre-computed ANSI escape code constants +const kEscape = '\u001b['; +const kEscapeEnd = 'm'; + +// Codes for dim (2) and bold (1) - these share close code 22 +const kDimCode = 2; +const kBoldCode = 1; + +let styleCache; + +function getStyleCache() { + if (styleCache === undefined) { + styleCache = { __proto__: null }; + const colors = inspect.colors; + for (const key of ObjectGetOwnPropertyNames(colors)) { + const codes = colors[key]; + if (codes) { + const openNum = codes[0]; + const closeNum = codes[1]; + styleCache[key] = { + __proto__: null, + openSeq: kEscape + openNum + kEscapeEnd, + closeSeq: kEscape + closeNum + kEscapeEnd, + keepClose: openNum === kDimCode || openNum === kBoldCode, + }; + } + } + } + return styleCache; +} + +function replaceCloseCode(str, closeSeq, openSeq, keepClose) { + const closeLen = closeSeq.length; + let index = str.indexOf(closeSeq); + if (index === -1) return str; + + let result = ''; + let lastIndex = 0; + const replacement = keepClose ? closeSeq + openSeq : openSeq; + + do { + const afterClose = index + closeLen; + if (afterClose < str.length) { + result += str.slice(lastIndex, index) + replacement; + lastIndex = afterClose; + } else { + break; + } + index = str.indexOf(closeSeq, lastIndex); + } while (index !== -1); + + return result + str.slice(lastIndex); } /** @@ -121,12 +164,29 @@ function escapeStyleCode(code) { * @param {Stream} [options.stream] - The stream used for validation. * @returns {string} */ -function styleText(format, text, { validateStream = true, stream = process.stdout } = {}) { +function styleText(format, text, options) { + const validateStream = options?.validateStream ?? true; + const cache = getStyleCache(); + + // Fast path: single format string with validateStream=false + if (!validateStream && typeof format === 'string' && typeof text === 'string') { + if (format === 'none') return text; + const style = cache[format]; + if (style !== undefined) { + const processed = replaceCloseCode(text, style.closeSeq, style.openSeq, style.keepClose); + return style.openSeq + processed + style.closeSeq; + } + } + validateString(text, 'text'); + if (options !== undefined) { + validateObject(options, 'options'); + } validateBoolean(validateStream, 'options.validateStream'); let skipColorize; if (validateStream) { + const stream = options?.stream ?? process.stdout; if ( !isReadableStream(stream) && !isWritableStream(stream) && @@ -134,71 +194,27 @@ function styleText(format, text, { validateStream = true, stream = process.stdou ) { throw new ERR_INVALID_ARG_TYPE('stream', ['ReadableStream', 'WritableStream', 'Stream'], stream); } - - // If the stream is falsy or should not be colorized, set skipColorize to true skipColorize = !lazyUtilColors().shouldColorize(stream); } - // If the format is not an array, convert it to an array const formatArray = ArrayIsArray(format) ? format : [format]; - const codes = []; + let openCodes = ''; + let closeCodes = ''; + let processedText = text; + for (const key of formatArray) { if (key === 'none') continue; - const formatCodes = inspect.colors[key]; - // If the format is not a valid style, throw an error - if (formatCodes == null) { - validateOneOf(key, 'format', ObjectKeys(inspect.colors)); + const style = cache[key]; + if (style === undefined) { + validateOneOf(key, 'format', ObjectGetOwnPropertyNames(inspect.colors)); } - if (skipColorize) continue; - ArrayPrototypePush(codes, formatCodes); - } - - if (skipColorize) { - return text; + openCodes += style.openSeq; + closeCodes = style.closeSeq + closeCodes; + processedText = replaceCloseCode(processedText, style.closeSeq, style.openSeq, style.keepClose); } - // Build opening codes - let openCodes = ''; - for (let i = 0; i < codes.length; i++) { - openCodes += escapeStyleCode(codes[i][0]); - } - - // Process the text to handle nested styles - let processedText; - if (codes.length > 0) { - processedText = ArrayPrototypeReduce( - codes, - (text, code) => RegExpPrototypeSymbolReplace( - // Find the reset code - new RegExp(`\\u001b\\[${code[1]}m`, 'g'), - text, - (match, offset) => { - // Check if there's more content after this reset - if (offset + match.length < text.length) { - if ( - code[0] === inspect.colors.dim[0] || - code[0] === inspect.colors.bold[0] - ) { - // Dim and bold are not mutually exclusive, so we need to reapply - return `${match}${escapeStyleCode(code[0])}`; - } - return escapeStyleCode(code[0]); - } - return match; - }, - ), - text, - ); - } else { - processedText = text; - } - - // Build closing codes in reverse order - let closeCodes = ''; - for (let i = codes.length - 1; i >= 0; i--) { - closeCodes += escapeStyleCode(codes[i][1]); - } + if (skipColorize) return text; return `${openCodes}${processedText}${closeCodes}`; } diff --git a/lib/zlib.js b/lib/zlib.js index 73eb8ff2120490..056b1a13a17392 100644 --- a/lib/zlib.js +++ b/lib/zlib.js @@ -295,19 +295,19 @@ ZlibBase.prototype.reset = function() { }; /** - * @this {ZlibBase} * This is the _flush function called by the transform class, * internally, when the last chunk has been written. * @returns {void} + * @this {ZlibBase} */ ZlibBase.prototype._flush = function(callback) { this._transform(new FastBuffer(), '', callback); }; /** - * @this {ZlibBase} * Force Transform compat behavior. * @returns {void} + * @this {ZlibBase} */ ZlibBase.prototype._final = function(callback) { callback(); @@ -830,11 +830,29 @@ function Brotli(opts, mode) { }); } + let dictionary = opts?.dictionary; + if (dictionary !== undefined && !isArrayBufferView(dictionary)) { + if (isAnyArrayBuffer(dictionary)) { + dictionary = Buffer.from(dictionary); + } else { + throw new ERR_INVALID_ARG_TYPE( + 'options.dictionary', + ['Buffer', 'TypedArray', 'DataView', 'ArrayBuffer'], + dictionary, + ); + } + } + const handle = mode === BROTLI_DECODE ? new binding.BrotliDecoder(mode) : new binding.BrotliEncoder(mode); this._writeState = new Uint32Array(2); - handle.init(brotliInitParamsArray, this._writeState, processCallback); + handle.init( + brotliInitParamsArray, + this._writeState, + processCallback, + dictionary, + ); ZlibBase.call(this, opts, mode, handle, brotliDefaultOpts); } diff --git a/node.gyp b/node.gyp index 7223a2e972b5a7..909e1b5622f6c9 100644 --- a/node.gyp +++ b/node.gyp @@ -128,6 +128,7 @@ 'src/node_main_instance.cc', 'src/node_messaging.cc', 'src/node_metadata.cc', + 'src/node_diagnostics_channel.cc', 'src/node_modules.cc', 'src/node_options.cc', 'src/node_os.cc', @@ -264,6 +265,7 @@ 'src/node_messaging.h', 'src/node_metadata.h', 'src/node_mutex.h', + 'src/node_diagnostics_channel.h', 'src/node_modules.h', 'src/node_object_wrap.h', 'src/node_options.h', diff --git a/src/acorn_version.h b/src/acorn_version.h index a8af314b687206..22b7971249bc1d 100644 --- a/src/acorn_version.h +++ b/src/acorn_version.h @@ -2,5 +2,5 @@ // Refer to tools/dep_updaters/update-acorn.sh #ifndef SRC_ACORN_VERSION_H_ #define SRC_ACORN_VERSION_H_ -#define ACORN_VERSION "8.15.0" +#define ACORN_VERSION "8.16.0" #endif // SRC_ACORN_VERSION_H_ diff --git a/src/amaro_version.h b/src/amaro_version.h index 514371f22648ee..203d46ebc74217 100644 --- a/src/amaro_version.h +++ b/src/amaro_version.h @@ -2,5 +2,5 @@ // Refer to tools/dep_updaters/update-amaro.sh #ifndef SRC_AMARO_VERSION_H_ #define SRC_AMARO_VERSION_H_ -#define AMARO_VERSION "1.1.7" +#define AMARO_VERSION "1.1.8" #endif // SRC_AMARO_VERSION_H_ diff --git a/src/async_wrap.cc b/src/async_wrap.cc index 301f77c419f178..f71195f1c87480 100644 --- a/src/async_wrap.cc +++ b/src/async_wrap.cc @@ -25,6 +25,9 @@ #include "env-inl.h" #include "node_errors.h" #include "node_external_reference.h" +#ifdef DEBUG +#include <node_process-inl.h> +#endif #include "tracing/traced_value.h" #include "util-inl.h" @@ -319,6 +322,13 @@ void AsyncWrap::AsyncReset(const FunctionCallbackInfo<Value>& args) { wrap->AsyncReset(resource, execution_async_id); } +// Useful for debugging async context propagation. Not intended for public use. +void AsyncWrap::GetAsyncContextFrame(const FunctionCallbackInfo<Value>& args) { + AsyncWrap* wrap; + ASSIGN_OR_RETURN_UNWRAP(&wrap, args.This()); + + args.GetReturnValue().Set(wrap->context_frame()); +} void AsyncWrap::GetProviderType(const FunctionCallbackInfo<Value>& args) { AsyncWrap* wrap; @@ -333,9 +343,12 @@ void AsyncWrap::EmitDestroy(bool from_gc) { // Ensure no double destroy is emitted via AsyncReset(). async_id_ = kInvalidAsyncId; - if (!persistent().IsEmpty() && !from_gc) { - HandleScope handle_scope(env()->isolate()); - USE(object()->Set(env()->context(), env()->resource_symbol(), object())); + if (!from_gc) { + if (!persistent().IsEmpty()) { + HandleScope handle_scope(env()->isolate()); + USE(object()->Set(env()->context(), env()->resource_symbol(), object())); + } + context_frame_.Reset(); } } @@ -366,6 +379,10 @@ Local<FunctionTemplate> AsyncWrap::GetConstructorTemplate( FIXED_ONE_BYTE_STRING(isolate_data->isolate(), "AsyncWrap")); SetProtoMethod(isolate, tmpl, "getAsyncId", AsyncWrap::GetAsyncId); SetProtoMethod(isolate, tmpl, "asyncReset", AsyncWrap::AsyncReset); + SetProtoMethod(isolate, + tmpl, + "getAsyncContextFrameForDebuggingOnly", + AsyncWrap::GetAsyncContextFrame); SetProtoMethod( isolate, tmpl, "getProviderType", AsyncWrap::GetProviderType); isolate_data->set_async_wrap_ctor_template(tmpl); @@ -495,6 +512,7 @@ void AsyncWrap::RegisterExternalReferences( registry->Register(RegisterDestroyHook); registry->Register(AsyncWrap::GetAsyncId); registry->Register(AsyncWrap::AsyncReset); + registry->Register(AsyncWrap::GetAsyncContextFrame); registry->Register(AsyncWrap::GetProviderType); } @@ -659,6 +677,14 @@ MaybeLocal<Value> AsyncWrap::MakeCallback(const Local<Function> cb, Local<Value>* argv) { EmitTraceEventBefore(); +#ifdef DEBUG + if (context_frame_.IsEmpty()) { + ProcessEmitWarning(env(), + "MakeCallback() called without context_frame, " + "likely use after destroy of AsyncWrap."); + } +#endif + ProviderType provider = provider_type(); async_context context { get_async_id(), get_trigger_async_id() }; MaybeLocal<Value> ret = diff --git a/src/async_wrap.h b/src/async_wrap.h index efb56a61a3e2d3..c64dea2790d651 100644 --- a/src/async_wrap.h +++ b/src/async_wrap.h @@ -162,6 +162,8 @@ class AsyncWrap : public BaseObject { static void ClearAsyncIdStack( const v8::FunctionCallbackInfo<v8::Value>& args); static void AsyncReset(const v8::FunctionCallbackInfo<v8::Value>& args); + static void GetAsyncContextFrame( + const v8::FunctionCallbackInfo<v8::Value>& args); static void GetProviderType(const v8::FunctionCallbackInfo<v8::Value>& args); static void QueueDestroyAsyncId( const v8::FunctionCallbackInfo<v8::Value>& args); diff --git a/src/base_object_types.h b/src/base_object_types.h index 9cfe6a77f71708..cd1a06e41a3071 100644 --- a/src/base_object_types.h +++ b/src/base_object_types.h @@ -10,6 +10,7 @@ namespace node { // what the class passes to SET_BINDING_ID(), the second argument should match // the C++ class name. #define SERIALIZABLE_BINDING_TYPES(V) \ + V(diagnostics_channel_binding_data, diagnostics_channel::BindingData) \ V(encoding_binding_data, encoding_binding::BindingData) \ V(fs_binding_data, fs::BindingData) \ V(mksnapshot_binding_data, mksnapshot::BindingData) \ diff --git a/src/blob_serializer_deserializer-inl.h b/src/blob_serializer_deserializer-inl.h index 7f5a3860b5b7e5..fa258dbe814459 100644 --- a/src/blob_serializer_deserializer-inl.h +++ b/src/blob_serializer_deserializer-inl.h @@ -105,7 +105,7 @@ template <typename T> std::vector<T> BlobDeserializer<Impl>::ReadVector() { if (is_debug) { std::string name = GetName<T>(); - Debug("\nReadVector<%s>()(%d-byte)\n", name.c_str(), sizeof(T)); + Debug("\nReadVector<%s>()(%d-byte)\n", name, sizeof(T)); } size_t count = static_cast<size_t>(ReadArithmetic<size_t>()); if (count == 0) { @@ -123,7 +123,7 @@ std::vector<T> BlobDeserializer<Impl>::ReadVector() { if (is_debug) { std::string str = std::is_arithmetic_v<T> ? "" : ToStr(result); std::string name = GetName<T>(); - Debug("ReadVector<%s>() read %s\n", name.c_str(), str.c_str()); + Debug("ReadVector<%s>() read %s\n", name, str); } return result; } @@ -163,7 +163,7 @@ void BlobDeserializer<Impl>::ReadArithmetic(T* out, size_t count) { DCHECK_GT(count, 0); // Should not read contents for vectors of size 0. if (is_debug) { std::string name = GetName<T>(); - Debug("Read<%s>()(%d-byte), count=%d: ", name.c_str(), sizeof(T), count); + Debug("Read<%s>()(%d-byte), count=%d: ", name, sizeof(T), count); } size_t size = sizeof(T) * count; @@ -172,7 +172,7 @@ void BlobDeserializer<Impl>::ReadArithmetic(T* out, size_t count) { if (is_debug) { std::string str = "{ " + std::to_string(out[0]) + (count > 1 ? ", ... }" : " }"); - Debug("%s, read %zu bytes\n", str.c_str(), size); + Debug("%s, read %zu bytes\n", str, size); } read_total += size; } @@ -240,10 +240,10 @@ size_t BlobSerializer<Impl>::WriteVector(const std::vector<T>& data) { std::string name = GetName<T>(); Debug("\nAt 0x%x: WriteVector<%s>() (%d-byte), count=%d: %s\n", sink.size(), - name.c_str(), + name, sizeof(T), data.size(), - str.c_str()); + str); } size_t written_total = WriteArithmetic<size_t>(data.size()); @@ -259,7 +259,7 @@ size_t BlobSerializer<Impl>::WriteVector(const std::vector<T>& data) { if (is_debug) { std::string name = GetName<T>(); - Debug("WriteVector<%s>() wrote %d bytes\n", name.c_str(), written_total); + Debug("WriteVector<%s>() wrote %d bytes\n", name, written_total); } return written_total; @@ -319,10 +319,10 @@ size_t BlobSerializer<Impl>::WriteArithmetic(const T* data, size_t count) { std::string name = GetName<T>(); Debug("At 0x%x: Write<%s>() (%zu-byte), count=%zu: %s", sink.size(), - name.c_str(), + name, sizeof(T), count, - str.c_str()); + str); } size_t size = sizeof(T) * count; diff --git a/src/compile_cache.cc b/src/compile_cache.cc index 0920747012f072..6b054db1ccc2e8 100644 --- a/src/compile_cache.cc +++ b/src/compile_cache.cc @@ -265,8 +265,8 @@ CompileCacheEntry* CompileCacheHandler::GetOrInsert(Local<String> code, if (!relative_path.empty()) { file_path = relative_path; Debug("[compile cache] using relative path %s from %s\n", - file_path.c_str(), - compile_cache_dir_.c_str()); + file_path, + compile_cache_dir_); } } uint32_t key = GetCacheKey(file_path, type); diff --git a/src/crypto/crypto_aes.cc b/src/crypto/crypto_aes.cc index b5495e59737eb6..fa619696ffd5b2 100644 --- a/src/crypto/crypto_aes.cc +++ b/src/crypto/crypto_aes.cc @@ -76,24 +76,28 @@ WebCryptoCipherStatus AES_Cipher(Environment* env, } size_t tag_len = 0; + size_t data_len = in.size(); if (params.cipher.isGcmMode() || params.cipher.isOcbMode()) { + tag_len = params.length; switch (cipher_mode) { case kWebCryptoCipherDecrypt: { - // If in decrypt mode, the auth tag must be set in the params.tag. - CHECK(params.tag); + // In decrypt mode, the auth tag is appended to the end of the + // ciphertext. Split it off and set it on the cipher context. + if (data_len < tag_len) { + return WebCryptoCipherStatus::FAILED; + } + data_len -= tag_len; - // For OCB mode, we need to set the auth tag length before setting the - // tag if (params.cipher.isOcbMode()) { - if (!ctx.setAeadTagLength(params.tag.size())) { + if (!ctx.setAeadTagLength(tag_len)) { return WebCryptoCipherStatus::FAILED; } } ncrypto::Buffer<const char> buffer = { - .data = params.tag.data<char>(), - .len = params.tag.size(), + .data = in.data<char>() + data_len, + .len = tag_len, }; if (!ctx.setAeadTag(buffer)) { return WebCryptoCipherStatus::FAILED; @@ -101,14 +105,6 @@ WebCryptoCipherStatus AES_Cipher(Environment* env, break; } case kWebCryptoCipherEncrypt: { - // In encrypt mode, we grab the tag length here. We'll use it to - // ensure that that allocated buffer has enough room for both the - // final block and the auth tag. Unlike our other AES-GCM implementation - // in CipherBase, in WebCrypto, the auth tag is concatenated to the end - // of the generated ciphertext and returned in the same ArrayBuffer. - tag_len = params.length; - - // For OCB mode, we need to set the auth tag length if (params.cipher.isOcbMode()) { if (!ctx.setAeadTagLength(tag_len)) { return WebCryptoCipherStatus::FAILED; @@ -122,7 +118,7 @@ WebCryptoCipherStatus AES_Cipher(Environment* env, } size_t total = 0; - int buf_len = in.size() + ctx.getBlockSize() + tag_len; + int buf_len = data_len + ctx.getBlockSize() + (encrypt ? tag_len : 0); int out_len; ncrypto::Buffer<const unsigned char> buffer = { @@ -148,9 +144,9 @@ WebCryptoCipherStatus AES_Cipher(Environment* env, // Refs: https://github.com/nodejs/node/pull/38913#issuecomment-866505244 buffer = { .data = in.data<unsigned char>(), - .len = in.size(), + .len = data_len, }; - if (in.empty()) { + if (data_len == 0) { out_len = 0; } else if (!ctx.update(buffer, ptr, &out_len)) { return WebCryptoCipherStatus::FAILED; @@ -381,42 +377,17 @@ bool ValidateCounter( return true; } -bool ValidateAuthTag( - Environment* env, - CryptoJobMode mode, - WebCryptoCipherMode cipher_mode, - Local<Value> value, - AESCipherConfig* params) { - switch (cipher_mode) { - case kWebCryptoCipherDecrypt: { - if (!IsAnyBufferSource(value)) { - THROW_ERR_CRYPTO_INVALID_TAG_LENGTH(env); - return false; - } - ArrayBufferOrViewContents<char> tag_contents(value); - if (!tag_contents.CheckSizeInt32()) [[unlikely]] { - THROW_ERR_OUT_OF_RANGE(env, "tagLength is too big"); - return false; - } - params->tag = mode == kCryptoJobAsync - ? tag_contents.ToCopy() - : tag_contents.ToByteSource(); - break; - } - case kWebCryptoCipherEncrypt: { - if (!value->IsUint32()) { - THROW_ERR_CRYPTO_INVALID_TAG_LENGTH(env); - return false; - } - params->length = value.As<Uint32>()->Value(); - if (params->length > 128) { - THROW_ERR_CRYPTO_INVALID_TAG_LENGTH(env); - return false; - } - break; - } - default: - UNREACHABLE(); +bool ValidateAuthTag(Environment* env, + Local<Value> value, + AESCipherConfig* params) { + if (!value->IsUint32()) { + THROW_ERR_CRYPTO_INVALID_TAG_LENGTH(env); + return false; + } + params->length = value.As<Uint32>()->Value(); + if (params->length > 128) { + THROW_ERR_CRYPTO_INVALID_TAG_LENGTH(env); + return false; } return true; } @@ -451,8 +422,7 @@ AESCipherConfig::AESCipherConfig(AESCipherConfig&& other) noexcept cipher(other.cipher), length(other.length), iv(std::move(other.iv)), - additional_data(std::move(other.additional_data)), - tag(std::move(other.tag)) {} + additional_data(std::move(other.additional_data)) {} AESCipherConfig& AESCipherConfig::operator=(AESCipherConfig&& other) noexcept { if (&other == this) return *this; @@ -466,7 +436,6 @@ void AESCipherConfig::MemoryInfo(MemoryTracker* tracker) const { if (mode == kCryptoJobAsync) { tracker->TrackFieldWithSize("iv", iv.size()); tracker->TrackFieldWithSize("additional_data", additional_data.size()); - tracker->TrackFieldWithSize("tag", tag.size()); } } @@ -510,7 +479,7 @@ Maybe<void> AESCipherTraits::AdditionalConfig( return Nothing<void>(); } } else if (params->cipher.isGcmMode() || params->cipher.isOcbMode()) { - if (!ValidateAuthTag(env, mode, cipher_mode, args[offset + 2], params) || + if (!ValidateAuthTag(env, args[offset + 2], params) || !ValidateAdditionalData(env, mode, args[offset + 3], params)) { return Nothing<void>(); } diff --git a/src/crypto/crypto_aes.h b/src/crypto/crypto_aes.h index 401ef70a5eba9f..5627f9020bad54 100644 --- a/src/crypto/crypto_aes.h +++ b/src/crypto/crypto_aes.h @@ -52,7 +52,6 @@ struct AESCipherConfig final : public MemoryRetainer { size_t length; ByteSource iv; // Used for both iv or counter ByteSource additional_data; - ByteSource tag; // Used only for authenticated modes (GCM) AESCipherConfig() = default; diff --git a/src/crypto/crypto_bio.cc b/src/crypto/crypto_bio.cc index f32cb1cff7d41d..cdf87c322afd9c 100644 --- a/src/crypto/crypto_bio.cc +++ b/src/crypto/crypto_bio.cc @@ -226,6 +226,7 @@ const BIO_METHOD* NodeBIO::GetMethod() { // Static initialization ensures that this is safe to use concurrently. static const BIO_METHOD* method = [&]() { BIO_METHOD* method = BIO_meth_new(BIO_TYPE_MEM, "node.js SSL buffer"); + CHECK_NOT_NULL(method); BIO_meth_set_write(method, Write); BIO_meth_set_read(method, Read); BIO_meth_set_puts(method, Puts); diff --git a/src/crypto/crypto_chacha20_poly1305.cc b/src/crypto/crypto_chacha20_poly1305.cc index bfe904c49ad771..0fd3e0517317ca 100644 --- a/src/crypto/crypto_chacha20_poly1305.cc +++ b/src/crypto/crypto_chacha20_poly1305.cc @@ -54,63 +54,6 @@ bool ValidateIV(Environment* env, return true; } -bool ValidateAuthTag(Environment* env, - CryptoJobMode mode, - WebCryptoCipherMode cipher_mode, - Local<Value> value, - ChaCha20Poly1305CipherConfig* params) { - switch (cipher_mode) { - case kWebCryptoCipherDecrypt: { - if (!IsAnyBufferSource(value)) { - THROW_ERR_CRYPTO_INVALID_TAG_LENGTH( - env, "Authentication tag must be a buffer"); - return false; - } - - ArrayBufferOrViewContents<unsigned char> tag(value); - if (!tag.CheckSizeInt32()) [[unlikely]] { - THROW_ERR_OUT_OF_RANGE(env, "tag is too large"); - return false; - } - - if (tag.size() != kChaCha20Poly1305TagSize) { - THROW_ERR_CRYPTO_INVALID_TAG_LENGTH( - env, "Invalid authentication tag length"); - return false; - } - - if (mode == kCryptoJobAsync) { - params->tag = tag.ToCopy(); - } else { - params->tag = tag.ToByteSource(); - } - break; - } - case kWebCryptoCipherEncrypt: { - // For encryption, the value should be the tag length (passed from - // JavaScript) We expect it to be the tag size constant for - // ChaCha20-Poly1305 - if (!value->IsUint32()) { - THROW_ERR_CRYPTO_INVALID_TAG_LENGTH(env, "Tag length must be a number"); - return false; - } - - uint32_t tag_length = value.As<v8::Uint32>()->Value(); - if (tag_length != kChaCha20Poly1305TagSize) { - THROW_ERR_CRYPTO_INVALID_TAG_LENGTH( - env, "Invalid tag length for ChaCha20-Poly1305"); - return false; - } - // Tag is generated during encryption, not provided - break; - } - default: - UNREACHABLE(); - } - - return true; -} - bool ValidateAdditionalData(Environment* env, CryptoJobMode mode, Local<Value> value, @@ -138,8 +81,7 @@ ChaCha20Poly1305CipherConfig::ChaCha20Poly1305CipherConfig( : mode(other.mode), cipher(other.cipher), iv(std::move(other.iv)), - additional_data(std::move(other.additional_data)), - tag(std::move(other.tag)) {} + additional_data(std::move(other.additional_data)) {} ChaCha20Poly1305CipherConfig& ChaCha20Poly1305CipherConfig::operator=( ChaCha20Poly1305CipherConfig&& other) noexcept { @@ -154,7 +96,6 @@ void ChaCha20Poly1305CipherConfig::MemoryInfo(MemoryTracker* tracker) const { if (mode == kCryptoJobAsync) { tracker->TrackFieldWithSize("iv", iv.size()); tracker->TrackFieldWithSize("additional_data", additional_data.size()); - tracker->TrackFieldWithSize("tag", tag.size()); } } @@ -179,17 +120,9 @@ Maybe<void> ChaCha20Poly1305CipherTraits::AdditionalConfig( return Nothing<void>(); } - // Authentication tag parameter (only for decryption) or tag length (for - // encryption) - if (static_cast<unsigned int>(args.Length()) > offset + 1) { - if (!ValidateAuthTag(env, mode, cipher_mode, args[offset + 1], params)) { - return Nothing<void>(); - } - } - // Additional authenticated data parameter (optional) - if (static_cast<unsigned int>(args.Length()) > offset + 2) { - if (!ValidateAdditionalData(env, mode, args[offset + 2], params)) { + if (static_cast<unsigned int>(args.Length()) > offset + 1) { + if (!ValidateAdditionalData(env, mode, args[offset + 1], params)) { return Nothing<void>(); } } @@ -229,23 +162,25 @@ WebCryptoCipherStatus ChaCha20Poly1305CipherTraits::DoCipher( return WebCryptoCipherStatus::FAILED; } - size_t tag_len = 0; + size_t tag_len = kChaCha20Poly1305TagSize; + size_t data_len = in.size(); switch (cipher_mode) { case kWebCryptoCipherDecrypt: { - if (params.tag.size() != kChaCha20Poly1305TagSize) { + if (data_len < tag_len) { return WebCryptoCipherStatus::FAILED; } + data_len -= tag_len; + if (!ctx.setAeadTag(ncrypto::Buffer<const char>{ - .data = params.tag.data<char>(), - .len = params.tag.size(), + .data = in.data<char>() + data_len, + .len = tag_len, })) { return WebCryptoCipherStatus::FAILED; } break; } case kWebCryptoCipherEncrypt: { - tag_len = kChaCha20Poly1305TagSize; break; } default: @@ -253,7 +188,7 @@ WebCryptoCipherStatus ChaCha20Poly1305CipherTraits::DoCipher( } size_t total = 0; - int buf_len = in.size() + ctx.getBlockSize() + tag_len; + int buf_len = data_len + ctx.getBlockSize() + (encrypt ? tag_len : 0); int out_len; // Process additional authenticated data if present @@ -271,9 +206,9 @@ WebCryptoCipherStatus ChaCha20Poly1305CipherTraits::DoCipher( // Process the input data buffer = { .data = in.data<unsigned char>(), - .len = in.size(), + .len = data_len, }; - if (in.empty()) { + if (data_len == 0) { if (!ctx.update({}, ptr, &out_len)) { return WebCryptoCipherStatus::FAILED; } diff --git a/src/crypto/crypto_chacha20_poly1305.h b/src/crypto/crypto_chacha20_poly1305.h index 5b4d5cde2c3929..f56b1a2e74a152 100644 --- a/src/crypto/crypto_chacha20_poly1305.h +++ b/src/crypto/crypto_chacha20_poly1305.h @@ -17,7 +17,6 @@ struct ChaCha20Poly1305CipherConfig final : public MemoryRetainer { ncrypto::Cipher cipher; ByteSource iv; ByteSource additional_data; - ByteSource tag; ChaCha20Poly1305CipherConfig() = default; diff --git a/src/crypto/crypto_context.cc b/src/crypto/crypto_context.cc index 4e968477ebcc08..980b7fafb3144b 100644 --- a/src/crypto/crypto_context.cc +++ b/src/crypto/crypto_context.cc @@ -2371,5 +2371,30 @@ void UseExtraCaCerts(std::string_view file) { extra_root_certs_file = file; } +NODE_EXTERN SSL_CTX* GetSSLCtx(Local<Context> context, Local<Value> value) { + Environment* env = Environment::GetCurrent(context); + if (env == nullptr) return nullptr; + + // TryCatchto swallow any exceptions from Get() (e.g. failing getters) + v8::TryCatch try_catch(env->isolate()); + + // Unwrap the .context property from the JS SecureContext wrapper + // (as returned by tls.createSecureContext()). + if (value->IsObject()) { + Local<Value> inner; + if (!value.As<v8::Object>() + ->Get(context, FIXED_ONE_BYTE_STRING(env->isolate(), "context")) + .ToLocal(&inner)) { + return nullptr; + } + value = inner; + } + + if (!SecureContext::HasInstance(env, value)) return nullptr; + SecureContext* sc = BaseObject::FromJSObject<SecureContext>(value); + if (sc == nullptr) return nullptr; + return sc->ctx().get(); +} + } // namespace crypto } // namespace node diff --git a/src/crypto/crypto_keys.cc b/src/crypto/crypto_keys.cc index 2ace9270381223..0651166f5e74ad 100644 --- a/src/crypto/crypto_keys.cc +++ b/src/crypto/crypto_keys.cc @@ -97,8 +97,15 @@ MaybeLocal<Value> ToV8Value( Environment* env, const BIOPointer& bio, const EVPKeyPointer::AsymmetricKeyEncodingConfig& config) { - if (!bio) return {}; + if (!bio) { + THROW_ERR_CRYPTO_OPERATION_FAILED(env, "Invalid BIO pointer"); + return {}; + } BUF_MEM* bptr = bio; + if (!bptr) { + THROW_ERR_CRYPTO_OPERATION_FAILED(env, "Unable to create BUF_MEM pointer"); + return {}; + } if (config.format == EVPKeyPointer::PKFormatType::PEM) { // PEM is an ASCII format, so we will return it as a string. return String::NewFromUtf8( diff --git a/src/crypto/crypto_rsa.cc b/src/crypto/crypto_rsa.cc index e7546cec4c1123..62ee228945c45b 100644 --- a/src/crypto/crypto_rsa.cc +++ b/src/crypto/crypto_rsa.cc @@ -385,6 +385,11 @@ KeyObjectData ImportJWKRsaKey(Environment* env, KeyType type = d_value->IsString() ? kKeyTypePrivate : kKeyTypePublic; RSAPointer rsa(RSA_new()); + if (!rsa) { + THROW_ERR_CRYPTO_OPERATION_FAILED(env, "Unable to create RSA pointer"); + return {}; + } + ncrypto::Rsa rsa_view(rsa.get()); ByteSource n = ByteSource::FromEncodedString(env, n_value.As<String>()); @@ -435,7 +440,10 @@ KeyObjectData ImportJWKRsaKey(Environment* env, } auto pkey = EVPKeyPointer::NewRSA(std::move(rsa)); - if (!pkey) return {}; + if (!pkey) { + THROW_ERR_CRYPTO_OPERATION_FAILED(env, "Unable to create key pointer"); + return {}; + } return KeyObjectData::CreateAsymmetric(type, std::move(pkey)); } diff --git a/src/crypto/crypto_x509.cc b/src/crypto/crypto_x509.cc index b30297eac08ad9..496cb272d4f90f 100644 --- a/src/crypto/crypto_x509.cc +++ b/src/crypto/crypto_x509.cc @@ -106,6 +106,8 @@ MaybeLocal<Value> ToV8Value(Local<Context> context, BIOPointer&& bio) { if (!bio) [[unlikely]] return {}; BUF_MEM* mem = bio; + if (!mem) [[unlikely]] + return {}; Local<Value> ret; if (!String::NewFromUtf8(context->GetIsolate(), mem->data, @@ -120,6 +122,8 @@ MaybeLocal<Value> ToV8Value(Local<Context> context, const BIOPointer& bio) { if (!bio) [[unlikely]] return {}; BUF_MEM* mem = bio; + if (!mem) [[unlikely]] + return {}; Local<Value> ret; if (!String::NewFromUtf8(context->GetIsolate(), mem->data, @@ -134,6 +138,8 @@ MaybeLocal<Value> ToBuffer(Environment* env, BIOPointer* bio) { if (bio == nullptr || !*bio) [[unlikely]] return {}; BUF_MEM* mem = *bio; + if (!mem) [[unlikely]] + return {}; #ifdef V8_ENABLE_SANDBOX // If the v8 sandbox is enabled, then all array buffers must be allocated // via the isolate. External buffers are not allowed. So, instead of wrapping @@ -253,8 +259,8 @@ MaybeLocal<Value> GetSignatureAlgorithmOID(Environment* env, MaybeLocal<Value> GetSerialNumber(Environment* env, const X509View& view) { if (auto serial = view.getSerialNumber()) { - return OneByteString(env->isolate(), - static_cast<unsigned char*>(serial.get())); + return ToV8Value( + env, ToUpper(std::string_view(static_cast<char*>(serial.get())))); } return Undefined(env->isolate()); } diff --git a/src/env.cc b/src/env.cc index 1050e354fab253..bbb30dd8a50f7b 100644 --- a/src/env.cc +++ b/src/env.cc @@ -2181,7 +2181,7 @@ size_t Environment::NearHeapLimitCallback(void* data, env->RemoveHeapSnapshotNearHeapLimitCallback(0); } - FPrintF(stderr, "Wrote snapshot to %s\n", filename.c_str()); + FPrintF(stderr, "Wrote snapshot to %s\n", filename); // Tell V8 to reset the heap limit once the heap usage falls down to // 95% of the initial limit. env->isolate()->AutomaticallyRestoreInitialHeapLimit(0.95); diff --git a/src/env_properties.h b/src/env_properties.h index b3343981c2c325..b90c3c57cdd476 100644 --- a/src/env_properties.h +++ b/src/env_properties.h @@ -236,6 +236,7 @@ V(kind_string, "kind") \ V(last_insert_rowid_string, "lastInsertRowid") \ V(length_string, "length") \ + V(limits_string, "limits") \ V(library_string, "library") \ V(loop_count, "loopCount") \ V(max_buffer_string, "maxBuffer") \ @@ -433,6 +434,7 @@ V(socketaddress_constructor_template, v8::FunctionTemplate) \ V(space_stats_template, v8::DictionaryTemplate) \ V(sqlite_column_template, v8::DictionaryTemplate) \ + V(sqlite_limits_template, v8::ObjectTemplate) \ V(sqlite_run_result_template, v8::DictionaryTemplate) \ V(sqlite_statement_sync_constructor_template, v8::FunctionTemplate) \ V(sqlite_statement_sync_iterator_constructor_template, v8::FunctionTemplate) \ diff --git a/src/inspector/domain_target.pdl b/src/inspector/domain_target.pdl index 3195b3a441d8ab..890e79db8eb6b3 100644 --- a/src/inspector/domain_target.pdl +++ b/src/inspector/domain_target.pdl @@ -20,6 +20,9 @@ experimental domain Target SessionID sessionId TargetInfo targetInfo boolean waitingForDebugger + command getTargets + returns + array of TargetInfo targetInfos command setAutoAttach parameters boolean autoAttach diff --git a/src/inspector/node_inspector.gypi b/src/inspector/node_inspector.gypi index cde02a28d03dfa..5b96bc77733059 100644 --- a/src/inspector/node_inspector.gypi +++ b/src/inspector/node_inspector.gypi @@ -32,6 +32,8 @@ 'src/inspector/network_inspector.h', 'src/inspector/network_agent.cc', 'src/inspector/network_agent.h', + 'src/inspector/target_manager.cc', + 'src/inspector/target_manager.h', 'src/inspector/target_agent.cc', 'src/inspector/target_agent.h', 'src/inspector/worker_inspector.cc', diff --git a/src/inspector/target_agent.cc b/src/inspector/target_agent.cc index 2f841cb2a9c54c..04cbe0b83750ce 100644 --- a/src/inspector/target_agent.cc +++ b/src/inspector/target_agent.cc @@ -8,10 +8,6 @@ namespace node { namespace inspector { namespace protocol { -std::unordered_map<int, std::shared_ptr<MainThreadHandle>> - TargetAgent::target_session_id_worker_map_ = - std::unordered_map<int, std::shared_ptr<MainThreadHandle>>(); -int TargetAgent::next_session_id_ = 1; class WorkerTargetDelegate : public WorkerDelegate { public: explicit WorkerTargetDelegate(std::shared_ptr<TargetAgent> target_agent) @@ -32,13 +28,14 @@ std::unique_ptr<Target::TargetInfo> createTargetInfo( const std::string_view target_id, const std::string_view type, const std::string_view title, - const std::string_view url) { + const std::string_view url, + bool attached = false) { return Target::TargetInfo::create() .setTargetId(std::string(target_id)) .setType(std::string(type)) .setTitle(std::string(title)) .setUrl(std::string(url)) - .setAttached(false) + .setAttached(attached) .setCanAccessOpener(true) .build(); } @@ -57,11 +54,11 @@ void TargetAgent::createAndAttachIfNecessary( targetCreated(target_id, type, title, url); bool attached = false; - if (auto_attach_) { + if (target_manager_->auto_attach()) { attached = true; attachedToTarget(worker, target_id, type, title, url); } - targets_.push_back({target_id, type, title, url, worker, attached}); + target_manager_->AddTarget(worker, target_id, type, title, url, attached); } void TargetAgent::listenWorker(std::weak_ptr<WorkerManager> worker_manager) { @@ -87,12 +84,26 @@ void TargetAgent::targetCreated(const std::string_view target_id, frontend_->targetCreated(createTargetInfo(target_id, type, title, url)); } +crdtp::DispatchResponse TargetAgent::getTargets( + std::unique_ptr<protocol::Array<Target::TargetInfo>>* out_targetInfos) { + auto target_infos = std::make_unique<protocol::Array<Target::TargetInfo>>(); + for (const auto& target : target_manager_->GetTargetsSnapshot()) { + target_infos->push_back(createTargetInfo(target.target_id, + target.type, + target.title, + target.url, + target.attached)); + } + *out_targetInfos = std::move(target_infos); + return DispatchResponse::Success(); +} + int TargetAgent::getNextSessionId() { - return next_session_id_++; + return target_manager_->NextSessionId(); } int TargetAgent::getNextTargetId() { - return next_target_id_++; + return target_manager_->NextTargetId(); } void TargetAgent::attachedToTarget(std::shared_ptr<MainThreadHandle> worker, @@ -101,7 +112,7 @@ void TargetAgent::attachedToTarget(std::shared_ptr<MainThreadHandle> worker, const std::string& title, const std::string& url) { int session_id = getNextSessionId(); - target_session_id_worker_map_[session_id] = worker; + TargetManager::RegisterSessionWorker(session_id, worker); worker->SetTargetSessionId(session_id); frontend_->attachedToTarget(std::to_string(session_id), createTargetInfo(target_id, type, title, url), @@ -112,11 +123,10 @@ void TargetAgent::attachedToTarget(std::shared_ptr<MainThreadHandle> worker, // all threads. Modify it to be managed per worker thread. crdtp::DispatchResponse TargetAgent::setAutoAttach( bool auto_attach, bool wait_for_debugger_on_start) { - auto_attach_ = auto_attach; - wait_for_debugger_on_start_ = wait_for_debugger_on_start; + target_manager_->SetAutoAttach(auto_attach, wait_for_debugger_on_start); if (auto_attach) { - for (auto& target : targets_) { + for (auto& target : target_manager_->targets()) { if (!target.attached) { target.attached = true; attachedToTarget(target.worker, diff --git a/src/inspector/target_agent.h b/src/inspector/target_agent.h index 36a95f80dcad75..f7904e986751f3 100644 --- a/src/inspector/target_agent.h +++ b/src/inspector/target_agent.h @@ -1,9 +1,9 @@ #ifndef SRC_INSPECTOR_TARGET_AGENT_H_ #define SRC_INSPECTOR_TARGET_AGENT_H_ +#include <memory> #include <string_view> -#include <unordered_map> -#include <vector> +#include "inspector/target_manager.h" #include "inspector/worker_inspector.h" #include "node/inspector/protocol/Target.h" @@ -14,15 +14,6 @@ class TargetInspector; namespace protocol { -struct TargetInfo { - std::string target_id; - std::string type; - std::string title; - std::string url; - std::shared_ptr<MainThreadHandle> worker; - bool attached; -}; - class TargetAgent : public Target::Backend, public std::enable_shared_from_this<TargetAgent> { public: @@ -32,15 +23,14 @@ class TargetAgent : public Target::Backend, const std::string& title, const std::string& url); + DispatchResponse getTargets( + std::unique_ptr<protocol::Array<Target::TargetInfo>>* out_targetInfos) + override; DispatchResponse setAutoAttach(bool auto_attach, bool wait_for_debugger_on_start) override; void listenWorker(std::weak_ptr<WorkerManager> worker_manager); void reset(); - static std::unordered_map<int, std::shared_ptr<MainThreadHandle>> - target_session_id_worker_map_; - - bool isThisThread(MainThreadHandle* worker) { return worker == main_thread_; } private: int getNextTargetId(); @@ -57,15 +47,9 @@ class TargetAgent : public Target::Backend, std::shared_ptr<Target::Frontend> frontend_; std::weak_ptr<WorkerManager> worker_manager_; - static int next_session_id_; - int next_target_id_ = 1; std::unique_ptr<WorkerManagerEventHandle> worker_event_handle_ = nullptr; - bool auto_attach_ = false; - // TODO(islandryu): If false, implement it so that each thread does not wait - // for the worker to execute. - bool wait_for_debugger_on_start_ = true; - std::vector<TargetInfo> targets_; - MainThreadHandle* main_thread_; + std::unique_ptr<TargetManager> target_manager_ = + std::make_unique<TargetManager>(); }; } // namespace protocol diff --git a/src/inspector/target_manager.cc b/src/inspector/target_manager.cc new file mode 100644 index 00000000000000..318aa71e4e7526 --- /dev/null +++ b/src/inspector/target_manager.cc @@ -0,0 +1,66 @@ +#include "inspector/target_manager.h" + +#include "inspector/main_thread_interface.h" + +namespace node { +namespace inspector { + +Mutex TargetManager::session_state_lock_; +std::unordered_map<int, std::shared_ptr<MainThreadHandle>> + TargetManager::session_worker_map_; +int TargetManager::next_session_id_ = 1; + +int TargetManager::NextTargetId() { + return next_target_id_++; +} + +int TargetManager::NextSessionId() { + Mutex::ScopedLock scoped_lock(session_state_lock_); + return next_session_id_++; +} + +void TargetManager::SetAutoAttach(bool auto_attach, + bool wait_for_debugger_on_start) { + auto_attach_ = auto_attach; + wait_for_debugger_on_start_ = wait_for_debugger_on_start; +} + +void TargetManager::AddTarget(std::shared_ptr<MainThreadHandle> worker, + const std::string& target_id, + const std::string& type, + const std::string& title, + const std::string& url, + bool attached) { + targets_.push_back({target_id, type, title, url, worker, attached}); +} + +std::vector<TargetManager::TargetInfo> TargetManager::GetTargetsSnapshot() + const { + std::vector<TargetInfo> result; + result.reserve(targets_.size()); + for (const auto& target : targets_) { + if (target.worker && !target.worker->Expired()) { + result.push_back(target); + } + } + return result; +} + +void TargetManager::RegisterSessionWorker( + int session_id, std::shared_ptr<MainThreadHandle> worker) { + Mutex::ScopedLock scoped_lock(session_state_lock_); + session_worker_map_[session_id] = std::move(worker); +} + +std::shared_ptr<MainThreadHandle> TargetManager::WorkerForSession( + int session_id) { + Mutex::ScopedLock scoped_lock(session_state_lock_); + auto it = session_worker_map_.find(session_id); + if (it == session_worker_map_.end()) { + return nullptr; + } + return it->second; +} + +} // namespace inspector +} // namespace node diff --git a/src/inspector/target_manager.h b/src/inspector/target_manager.h new file mode 100644 index 00000000000000..3d7984b866665f --- /dev/null +++ b/src/inspector/target_manager.h @@ -0,0 +1,70 @@ +#ifndef SRC_INSPECTOR_TARGET_MANAGER_H_ +#define SRC_INSPECTOR_TARGET_MANAGER_H_ + +#include <memory> +#include <string> +#include <unordered_map> +#include <vector> + +#include "node_mutex.h" + +namespace node { +namespace inspector { + +class MainThreadHandle; + +class TargetManager { + public: + struct TargetInfo { + std::string target_id; + std::string type; + std::string title; + std::string url; + std::shared_ptr<MainThreadHandle> worker; + bool attached; + }; + + TargetManager() = default; + + int NextTargetId(); + int NextSessionId(); + + void SetAutoAttach(bool auto_attach, bool wait_for_debugger_on_start); + bool auto_attach() const { return auto_attach_; } + bool wait_for_debugger_on_start() const { + return wait_for_debugger_on_start_; + } + + void AddTarget(std::shared_ptr<MainThreadHandle> worker, + const std::string& target_id, + const std::string& type, + const std::string& title, + const std::string& url, + bool attached); + std::vector<TargetInfo> GetTargetsSnapshot() const; + std::vector<TargetInfo>& targets() { return targets_; } + const std::vector<TargetInfo>& targets() const { return targets_; } + + static void RegisterSessionWorker(int session_id, + std::shared_ptr<MainThreadHandle> worker); + static std::shared_ptr<MainThreadHandle> WorkerForSession(int session_id); + + private: + static Mutex session_state_lock_; + static std::unordered_map<int, std::shared_ptr<MainThreadHandle>> + session_worker_map_; + static int next_session_id_; + + int next_target_id_ = 1; + bool auto_attach_ = false; + // TODO(islandryu): Honor this flag for worker targets. It is stored here + // so Target.setAutoAttach() state can be tracked, but worker startup pause + // behavior does not change based on it yet. + bool wait_for_debugger_on_start_ = true; + std::vector<TargetInfo> targets_; +}; + +} // namespace inspector +} // namespace node + +#endif // SRC_INSPECTOR_TARGET_MANAGER_H_ diff --git a/src/inspector_io.cc b/src/inspector_io.cc index 361d19349261e5..e0b4b6c3746162 100644 --- a/src/inspector_io.cc +++ b/src/inspector_io.cc @@ -7,6 +7,7 @@ #include "inspector/node_json.h" #include "inspector/node_string.h" #include "inspector/target_agent.h" +#include "inspector/target_manager.h" #include "inspector_socket_server.h" #include "ncrypto.h" #include "node.h" @@ -380,8 +381,7 @@ void InspectorIoDelegate::MessageReceived(int session_id, ::isdigit); if (is_number) { int target_session_id = std::stoi(*target_session_id_str); - worker = protocol::TargetAgent::target_session_id_worker_map_ - [target_session_id]; + worker = TargetManager::WorkerForSession(target_session_id); if (worker) { merged_session_id += target_session_id << 16; } diff --git a/src/inspector_profiler.cc b/src/inspector_profiler.cc index dd57c779595c80..28653a3939daef 100644 --- a/src/inspector_profiler.cc +++ b/src/inspector_profiler.cc @@ -66,7 +66,7 @@ uint64_t V8ProfilerConnection::DispatchMessage(const char* method, Debug(env(), DebugCategory::INSPECTOR_PROFILER, "Dispatching message %s\n", - message.c_str()); + message); session_->Dispatch(StringView(message_data, message.length())); return id; } diff --git a/src/js_udp_wrap.cc b/src/js_udp_wrap.cc index 51e4f8c45ffd38..6b35871d92ceb1 100644 --- a/src/js_udp_wrap.cc +++ b/src/js_udp_wrap.cc @@ -157,7 +157,7 @@ void JSUDPWrap::EmitReceived(const FunctionCallbackInfo<Value>& args) { int family = args[1].As<Int32>()->Value() == 4 ? AF_INET : AF_INET6; Utf8Value address(env->isolate(), args[2]); int port = args[3].As<Int32>()->Value(); - int flags = args[3].As<Int32>()->Value(); + int flags = args[4].As<Int32>()->Value(); sockaddr_storage addr; CHECK_EQ(sockaddr_for_family(family, *address, port, &addr), 0); diff --git a/src/node.h b/src/node.h index ebfd7229b5f004..2087509f7961dc 100644 --- a/src/node.h +++ b/src/node.h @@ -124,6 +124,8 @@ // Forward-declare libuv loop struct uv_loop_s; +struct napi_module; +struct ssl_ctx_st; // Forward declaration of SSL_CTX for OpenSSL. // Forward-declare these functions now to stop MSVS from becoming // terminally confused when it's done in node_internals.h @@ -1700,6 +1702,20 @@ NODE_DEPRECATED("Use v8::Object::Wrap()", v8::Local<v8::Object> object, void* wrappable)); +namespace crypto { + +// Returns the SSL_CTX* from a SecureContext JS object, as returned by +// tls.createSecureContext(). +// Returns nullptr if the value is not a SecureContext instance, +// or if Node.js was built without OpenSSL. +// +// The returned pointer is not owned by the caller and must not be freed. +// It is valid only while the SecureContext JS object remains alive. +NODE_EXTERN struct ssl_ctx_st* GetSSLCtx(v8::Local<v8::Context> context, + v8::Local<v8::Value> secure_context); + +} // namespace crypto + } // namespace node #endif // SRC_NODE_H_ diff --git a/src/node_binding.cc b/src/node_binding.cc index 740706e917b7d2..b76ecc8cab47df 100644 --- a/src/node_binding.cc +++ b/src/node_binding.cc @@ -48,6 +48,7 @@ V(constants) \ V(contextify) \ V(credentials) \ + V(diagnostics_channel) \ V(encoding_binding) \ V(errors) \ V(fs) \ diff --git a/src/node_binding.h b/src/node_binding.h index a55a9c6a578798..bb6547e5dac408 100644 --- a/src/node_binding.h +++ b/src/node_binding.h @@ -48,6 +48,7 @@ static_assert(static_cast<int>(NM_F_LINKED) == V(blob) \ V(builtins) \ V(contextify) \ + V(diagnostics_channel) \ V(encoding_binding) \ V(fs) \ V(fs_dir) \ diff --git a/src/node_buffer.cc b/src/node_buffer.cc index d4a63cf610ca7f..362ac268483ea3 100644 --- a/src/node_buffer.cc +++ b/src/node_buffer.cc @@ -1050,24 +1050,20 @@ void IndexOfString(const FunctionCallbackInfo<Value>& args) { needle_length, offset, is_forward); - } else if (enc == LATIN1) { - uint8_t* needle_data = node::UncheckedMalloc<uint8_t>(needle_length); - if (needle_data == nullptr) { - return args.GetReturnValue().Set(-1); - } + } else if (enc == ASCII || enc == LATIN1) { + MaybeStackBuffer<uint8_t> needle_data(needle_length); StringBytes::Write(isolate, - reinterpret_cast<char*>(needle_data), + reinterpret_cast<char*>(needle_data.out()), needle_length, needle, enc); result = nbytes::SearchString(reinterpret_cast<const uint8_t*>(haystack), haystack_length, - needle_data, + needle_data.out(), needle_length, offset, is_forward); - free(needle_data); } args.GetReturnValue().Set( @@ -1200,31 +1196,59 @@ int32_t FastIndexOfNumber(Local<Value>, static CFunction fast_index_of_number(CFunction::Make(FastIndexOfNumber)); void Swap16(const FunctionCallbackInfo<Value>& args) { - Environment* env = Environment::GetCurrent(args); - THROW_AND_RETURN_UNLESS_BUFFER(env, args[0]); + DCHECK(args[0]->IsArrayBufferView()); SPREAD_BUFFER_ARG(args[0], ts_obj); CHECK(nbytes::SwapBytes16(ts_obj_data, ts_obj_length)); - args.GetReturnValue().Set(args[0]); } +void FastSwap16(Local<Value> receiver, + Local<Value> buffer_obj, + // NOLINTNEXTLINE(runtime/references) + FastApiCallbackOptions& options) { + TRACK_V8_FAST_API_CALL("buffer.swap16"); + HandleScope scope(options.isolate); + SPREAD_BUFFER_ARG(buffer_obj, ts_obj); + CHECK(nbytes::SwapBytes16(ts_obj_data, ts_obj_length)); +} + +static CFunction fast_swap16(CFunction::Make(FastSwap16)); void Swap32(const FunctionCallbackInfo<Value>& args) { - Environment* env = Environment::GetCurrent(args); - THROW_AND_RETURN_UNLESS_BUFFER(env, args[0]); + DCHECK(args[0]->IsArrayBufferView()); SPREAD_BUFFER_ARG(args[0], ts_obj); CHECK(nbytes::SwapBytes32(ts_obj_data, ts_obj_length)); - args.GetReturnValue().Set(args[0]); } +void FastSwap32(Local<Value> receiver, + Local<Value> buffer_obj, + // NOLINTNEXTLINE(runtime/references) + FastApiCallbackOptions& options) { + TRACK_V8_FAST_API_CALL("buffer.swap32"); + HandleScope scope(options.isolate); + SPREAD_BUFFER_ARG(buffer_obj, ts_obj); + CHECK(nbytes::SwapBytes32(ts_obj_data, ts_obj_length)); +} + +static CFunction fast_swap32(CFunction::Make(FastSwap32)); void Swap64(const FunctionCallbackInfo<Value>& args) { - Environment* env = Environment::GetCurrent(args); - THROW_AND_RETURN_UNLESS_BUFFER(env, args[0]); + DCHECK(args[0]->IsArrayBufferView()); SPREAD_BUFFER_ARG(args[0], ts_obj); CHECK(nbytes::SwapBytes64(ts_obj_data, ts_obj_length)); - args.GetReturnValue().Set(args[0]); } +void FastSwap64(Local<Value> receiver, + Local<Value> buffer_obj, + // NOLINTNEXTLINE(runtime/references) + FastApiCallbackOptions& options) { + TRACK_V8_FAST_API_CALL("buffer.swap64"); + HandleScope scope(options.isolate); + SPREAD_BUFFER_ARG(buffer_obj, ts_obj); + CHECK(nbytes::SwapBytes64(ts_obj_data, ts_obj_length)); +} + +static CFunction fast_swap64(CFunction::Make(FastSwap64)); + static void IsUtf8(const FunctionCallbackInfo<Value>& args) { Environment* env = Environment::GetCurrent(args); CHECK_EQ(args.Length(), 1); @@ -1252,7 +1276,8 @@ static void IsAscii(const FunctionCallbackInfo<Value>& args) { env, "Cannot validate on a detached buffer"); } - args.GetReturnValue().Set(simdutf::validate_ascii(abv.data(), abv.length())); + args.GetReturnValue().Set( + !simdutf::validate_ascii_with_errors(abv.data(), abv.length()).error); } void SetBufferPrototype(const FunctionCallbackInfo<Value>& args) { @@ -1622,9 +1647,9 @@ void Initialize(Local<Object> target, SetMethodNoSideEffect( context, target, "createUnsafeArrayBuffer", CreateUnsafeArrayBuffer); - SetMethod(context, target, "swap16", Swap16); - SetMethod(context, target, "swap32", Swap32); - SetMethod(context, target, "swap64", Swap64); + SetFastMethod(context, target, "swap16", Swap16, &fast_swap16); + SetFastMethod(context, target, "swap32", Swap32, &fast_swap32); + SetFastMethod(context, target, "swap64", Swap64, &fast_swap64); SetMethodNoSideEffect(context, target, "isUtf8", IsUtf8); SetMethodNoSideEffect(context, target, "isAscii", IsAscii); @@ -1693,8 +1718,11 @@ void RegisterExternalReferences(ExternalReferenceRegistry* registry) { registry->Register(IndexOfString); registry->Register(Swap16); + registry->Register(fast_swap16); registry->Register(Swap32); + registry->Register(fast_swap32); registry->Register(Swap64); + registry->Register(fast_swap64); registry->Register(IsUtf8); registry->Register(IsAscii); diff --git a/src/node_builtins.cc b/src/node_builtins.cc index 90f91484fdd5cd..6506dcea3f4f88 100644 --- a/src/node_builtins.cc +++ b/src/node_builtins.cc @@ -559,7 +559,7 @@ bool BuiltinLoader::CompileAllBuiltinsAndCopyCodeCache( if (bootstrapCatch.HasCaught()) { per_process::Debug(DebugCategory::CODE_CACHE, "Failed to compile code cache for %s\n", - id.data()); + id); all_succeeded = false; PrintCaughtException(context->GetIsolate(), context, bootstrapCatch); } else { diff --git a/src/node_config_file.cc b/src/node_config_file.cc index e6c049b4d14f10..9db6a9b2472aa5 100644 --- a/src/node_config_file.cc +++ b/src/node_config_file.cc @@ -48,7 +48,7 @@ ParseResult ConfigReader::ProcessOptionValue( case options_parser::OptionType::kBoolean: { bool result; if (option_value->get_bool().get(result)) { - FPrintF(stderr, "Invalid value for %s\n", option_name.c_str()); + FPrintF(stderr, "Invalid value for %s\n", option_name); return ParseResult::InvalidContent; } @@ -74,13 +74,13 @@ ParseResult ConfigReader::ProcessOptionValue( std::vector<std::string> result; simdjson::ondemand::array raw_imports; if (option_value->get_array().get(raw_imports)) { - FPrintF(stderr, "Invalid value for %s\n", option_name.c_str()); + FPrintF(stderr, "Invalid value for %s\n", option_name); return ParseResult::InvalidContent; } for (auto raw_import : raw_imports) { std::string_view import; if (raw_import.get_string(import)) { - FPrintF(stderr, "Invalid value for %s\n", option_name.c_str()); + FPrintF(stderr, "Invalid value for %s\n", option_name); return ParseResult::InvalidContent; } output->push_back(option_name + "=" + std::string(import)); @@ -90,14 +90,14 @@ ParseResult ConfigReader::ProcessOptionValue( case simdjson::ondemand::json_type::string: { std::string result; if (option_value->get_string(result)) { - FPrintF(stderr, "Invalid value for %s\n", option_name.c_str()); + FPrintF(stderr, "Invalid value for %s\n", option_name); return ParseResult::InvalidContent; } output->push_back(option_name + "=" + result); break; } default: - FPrintF(stderr, "Invalid value for %s\n", option_name.c_str()); + FPrintF(stderr, "Invalid value for %s\n", option_name); return ParseResult::InvalidContent; } break; @@ -105,7 +105,7 @@ ParseResult ConfigReader::ProcessOptionValue( case options_parser::OptionType::kString: { std::string result; if (option_value->get_string(result)) { - FPrintF(stderr, "Invalid value for %s\n", option_name.c_str()); + FPrintF(stderr, "Invalid value for %s\n", option_name); return ParseResult::InvalidContent; } output->push_back(option_name + "=" + result); @@ -114,7 +114,7 @@ ParseResult ConfigReader::ProcessOptionValue( case options_parser::OptionType::kInteger: { int64_t result; if (option_value->get_int64().get(result)) { - FPrintF(stderr, "Invalid value for %s\n", option_name.c_str()); + FPrintF(stderr, "Invalid value for %s\n", option_name); return ParseResult::InvalidContent; } output->push_back(option_name + "=" + std::to_string(result)); @@ -124,22 +124,19 @@ ParseResult ConfigReader::ProcessOptionValue( case options_parser::OptionType::kUInteger: { uint64_t result; if (option_value->get_uint64().get(result)) { - FPrintF(stderr, "Invalid value for %s\n", option_name.c_str()); + FPrintF(stderr, "Invalid value for %s\n", option_name); return ParseResult::InvalidContent; } output->push_back(option_name + "=" + std::to_string(result)); break; } case options_parser::OptionType::kNoOp: { - FPrintF(stderr, - "No-op flag %s is currently not supported\n", - option_name.c_str()); + FPrintF( + stderr, "No-op flag %s is currently not supported\n", option_name); return ParseResult::InvalidContent; } case options_parser::OptionType::kV8Option: { - FPrintF(stderr, - "V8 flag %s is currently not supported\n", - option_name.c_str()); + FPrintF(stderr, "V8 flag %s is currently not supported\n", option_name); return ParseResult::InvalidContent; } default: @@ -187,8 +184,7 @@ ParseResult ConfigReader::ParseOptions( if (option != options_map.end()) { // If the option has already been set, return an error if (unique_options->contains(option->first)) { - FPrintF( - stderr, "Option %s is already defined\n", option->first.c_str()); + FPrintF(stderr, "Option %s is already defined\n", option->first); return ParseResult::InvalidContent; } // Add the option to the unique set to prevent duplicates @@ -204,7 +200,7 @@ ParseResult ConfigReader::ParseOptions( FPrintF(stderr, "Unknown or not allowed option %s for namespace %s\n", option_key, - namespace_name.c_str()); + namespace_name); return ParseResult::InvalidContent; } } @@ -277,7 +273,7 @@ ParseResult ConfigReader::ParseConfig(const std::string_view& config_path) { if (field_error) { FPrintF(stderr, "\"%s\" value unexpected for %s (should be an object)\n", - namespace_name.c_str(), + namespace_name, config_path.data()); return ParseResult::InvalidContent; } diff --git a/src/node_diagnostics_channel.cc b/src/node_diagnostics_channel.cc new file mode 100644 index 00000000000000..450a124c86959a --- /dev/null +++ b/src/node_diagnostics_channel.cc @@ -0,0 +1,293 @@ +#include "node_diagnostics_channel.h" + +#include "base_object-inl.h" +#include "env-inl.h" +#include "node_external_reference.h" +#include "util-inl.h" +#include "v8.h" + +#include <cstdint> + +namespace node { +namespace diagnostics_channel { + +using v8::Context; +using v8::Function; +using v8::FunctionCallbackInfo; +using v8::FunctionTemplate; +using v8::HandleScope; +using v8::Isolate; +using v8::Local; +using v8::Object; +using v8::ObjectTemplate; +using v8::SnapshotCreator; +using v8::String; +using v8::Value; + +BindingData::BindingData(Realm* realm, + Local<Object> wrap, + InternalFieldInfo* info) + : SnapshotableObject(realm, wrap, type_int), + subscribers_( + realm->isolate(), kMaxChannels, MAYBE_FIELD_PTR(info, subscribers)) { + if (info == nullptr) { + wrap->Set(realm->context(), + FIXED_ONE_BYTE_STRING(realm->isolate(), "subscribers"), + subscribers_.GetJSArray()) + .Check(); + } else { + subscribers_.Deserialize(realm->context()); + } + subscribers_.MakeWeak(); +} + +void BindingData::MemoryInfo(MemoryTracker* tracker) const { + tracker->TrackField("subscribers", subscribers_); +} + +uint32_t BindingData::GetOrCreateChannelIndex(const std::string& name) { + auto it = channel_indices_.find(name); + if (it != channel_indices_.end()) { + return it->second; + } + CHECK_LT(next_channel_index_, kMaxChannels); + uint32_t index = next_channel_index_++; + channel_indices_.emplace(name, index); + return index; +} + +void BindingData::GetOrCreateChannelIndex( + const FunctionCallbackInfo<Value>& args) { + Realm* realm = Realm::GetCurrent(args); + BindingData* binding = realm->GetBindingData<BindingData>(); + CHECK_NOT_NULL(binding); + + CHECK(args[0]->IsString()); + Utf8Value name(realm->isolate(), args[0]); + + uint32_t index = binding->GetOrCreateChannelIndex(*name); + args.GetReturnValue().Set(index); +} + +void BindingData::LinkNativeChannel(const FunctionCallbackInfo<Value>& args) { + Realm* realm = Realm::GetCurrent(args); + BindingData* binding = realm->GetBindingData<BindingData>(); + CHECK_NOT_NULL(binding); + + CHECK(args[0]->IsFunction()); + Isolate* isolate = realm->isolate(); + Local<Context> context = realm->context(); + binding->link_callback_.Reset(isolate, args[0].As<Function>()); + + // Resolve channels created before the link callback was available. + for (auto& channel_ptr : binding->channels_) { + if (channel_ptr && !channel_ptr->IsLinked()) { + Local<String> name = + String::NewFromUtf8(isolate, channel_ptr->name_.c_str()) + .ToLocalChecked(); + Local<Value> argv[] = {name}; + Local<Value> result; + if (binding->link_callback_.Get(isolate) + ->Call(context, v8::Undefined(isolate), 1, argv) + .ToLocal(&result) && + result->IsObject()) { + channel_ptr->Link(isolate, result.As<Object>()); + } + } + } +} + +bool BindingData::PrepareForSerialization(Local<Context> context, + SnapshotCreator* creator) { + DCHECK_NULL(internal_field_info_); + internal_field_info_ = InternalFieldInfoBase::New<InternalFieldInfo>(type()); + internal_field_info_->subscribers = subscribers_.Serialize(context, creator); + link_callback_.Reset(); + channel_wrap_template_.Reset(); + channels_.clear(); + return true; +} + +InternalFieldInfoBase* BindingData::Serialize(int index) { + DCHECK_IS_SNAPSHOT_SLOT(index); + InternalFieldInfo* info = internal_field_info_; + internal_field_info_ = nullptr; + return info; +} + +void BindingData::Deserialize(Local<Context> context, + Local<Object> holder, + int index, + InternalFieldInfoBase* info) { + DCHECK_IS_SNAPSHOT_SLOT(index); + HandleScope scope(Isolate::GetCurrent()); + Realm* realm = Realm::GetCurrent(context); + BindingData* binding = realm->AddBindingData<BindingData>( + holder, static_cast<InternalFieldInfo*>(info)); + CHECK_NOT_NULL(binding); +} + +void BindingData::CreatePerIsolateProperties(IsolateData* isolate_data, + Local<ObjectTemplate> target) { + Isolate* isolate = isolate_data->isolate(); + SetMethod( + isolate, target, "getOrCreateChannelIndex", GetOrCreateChannelIndex); + SetMethod(isolate, target, "linkNativeChannel", LinkNativeChannel); +} + +void BindingData::CreatePerContextProperties(Local<Object> target, + Local<Value> unused, + Local<Context> context, + void* priv) { + Realm* realm = Realm::GetCurrent(context); + BindingData* const binding = realm->AddBindingData<BindingData>(target); + if (binding == nullptr) return; +} + +void BindingData::RegisterExternalReferences( + ExternalReferenceRegistry* registry) { + registry->Register(GetOrCreateChannelIndex); + registry->Register(LinkNativeChannel); +} + +Channel::Channel(Environment* env, + Local<Object> wrap, + BindingData* binding_data, + uint32_t index, + std::string name) + : BaseObject(env, wrap), + binding_data_(binding_data), + index_(index), + name_(std::move(name)) { + MakeWeak(); +} + +void Channel::MemoryInfo(MemoryTracker* tracker) const { + tracker->TrackField("js_channel", js_channel_); + tracker->TrackField("publish_fn", publish_fn_); +} + +void Channel::Link(Isolate* isolate, Local<Object> js_channel) { + js_channel_.Reset(isolate, js_channel); + // If the channel already has subscribers at link time (JS subscribed before + // C++ called Get()), cache publish eagerly so Publish() has no extra work. + if (HasSubscribers()) { + CachePublishFn(isolate, js_channel); + } +} + +void Channel::Unlink() { + js_channel_.Reset(); + publish_fn_.Reset(); +} + +Channel* Channel::Get(Environment* env, const char* name) { + Realm* realm = env->principal_realm(); + BindingData* binding = realm->GetBindingData<BindingData>(); + if (binding == nullptr) { + return nullptr; + } + uint32_t index = binding->GetOrCreateChannelIndex(std::string(name)); + + if (index >= binding->channels_.size()) { + binding->channels_.resize(index + 1); + } + + if (!binding->channels_[index]) { + Isolate* isolate = env->isolate(); + HandleScope handle_scope(isolate); + Local<Context> context = env->context(); + + // Lazily create the wrap template for Channel objects. + if (binding->channel_wrap_template_.IsEmpty()) { + Local<FunctionTemplate> tmpl = + BaseObject::MakeLazilyInitializedJSTemplate(env); + binding->channel_wrap_template_.Reset(isolate, tmpl); + } + + Local<Object> wrap; + if (!binding->channel_wrap_template_.Get(isolate) + ->GetFunction(context) + .ToLocalChecked() + ->NewInstance(context) + .ToLocal(&wrap)) { + return nullptr; + } + + binding->channels_[index] = MakeDetachedBaseObject<Channel>( + env, wrap, binding, index, std::string(name)); + } + + Channel* channel = binding->channels_[index].get(); + + // Late-bind: link to the JS channel when the callback is available. + if (!binding->link_callback_.IsEmpty() && !channel->IsLinked()) { + Isolate* isolate = env->isolate(); + HandleScope handle_scope(isolate); + Local<Context> context = env->context(); + Local<String> js_name = String::NewFromUtf8(isolate, name).ToLocalChecked(); + Local<Value> argv[] = {js_name}; + Local<Value> result; + if (binding->link_callback_.Get(isolate) + ->Call(context, v8::Undefined(isolate), 1, argv) + .ToLocal(&result) && + result->IsObject()) { + channel->Link(isolate, result.As<Object>()); + } + } + + return channel; +} + +void Channel::CachePublishFn(Isolate* isolate, Local<Object> js_channel) { + Local<Value> publish_val; + Local<Context> context = isolate->GetCurrentContext(); + if (js_channel->Get(context, FIXED_ONE_BYTE_STRING(isolate, "publish")) + .ToLocal(&publish_val) && + publish_val->IsFunction()) { + publish_fn_.Reset(isolate, publish_val.As<Function>()); + } +} + +void Channel::Publish(Environment* env, Local<Value> message) { + if (!HasSubscribers()) return; + + if (binding_data_ == nullptr) return; + + if (js_channel_.IsEmpty()) return; + + // Publishing is not possible during shutdown or GC. + DCHECK(env->can_call_into_js()); + if (!env->can_call_into_js()) return; + + Isolate* isolate = env->isolate(); + HandleScope handle_scope(isolate); + Local<Context> context = env->context(); + Context::Scope context_scope(context); + + Local<Object> js_channel = js_channel_.Get(isolate); + + // publish_fn_ is eagerly cached by Link() when the channel already has + // subscribers at link time. For channels linked before any JS subscriber + // existed, cache it here on the first publish — happens exactly once. + if (publish_fn_.IsEmpty()) { + CachePublishFn(isolate, js_channel); + if (publish_fn_.IsEmpty()) return; + } + + Local<Value> argv[] = {message}; + USE(publish_fn_.Get(isolate)->Call(context, js_channel, 1, argv)); +} + +} // namespace diagnostics_channel +} // namespace node + +NODE_BINDING_CONTEXT_AWARE_INTERNAL( + diagnostics_channel, + node::diagnostics_channel::BindingData::CreatePerContextProperties) +NODE_BINDING_PER_ISOLATE_INIT( + diagnostics_channel, + node::diagnostics_channel::BindingData::CreatePerIsolateProperties) +NODE_BINDING_EXTERNAL_REFERENCE( + diagnostics_channel, + node::diagnostics_channel::BindingData::RegisterExternalReferences) diff --git a/src/node_diagnostics_channel.h b/src/node_diagnostics_channel.h new file mode 100644 index 00000000000000..1c1831a0f9e45f --- /dev/null +++ b/src/node_diagnostics_channel.h @@ -0,0 +1,113 @@ +#ifndef SRC_NODE_DIAGNOSTICS_CHANNEL_H_ +#define SRC_NODE_DIAGNOSTICS_CHANNEL_H_ + +#if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS + +#include <cinttypes> +#include <string> +#include <unordered_map> +#include <vector> +#include "aliased_buffer.h" +#include "base_object.h" +#include "node_snapshotable.h" + +namespace node { +class ExternalReferenceRegistry; + +namespace diagnostics_channel { + +class Channel; + +class BindingData : public SnapshotableObject { + public: + static constexpr size_t kMaxChannels = 1024; + + struct InternalFieldInfo : public node::InternalFieldInfoBase { + AliasedBufferIndex subscribers; + }; + + BindingData(Realm* realm, + v8::Local<v8::Object> wrap, + InternalFieldInfo* info = nullptr); + + SERIALIZABLE_OBJECT_METHODS() + SET_BINDING_ID(diagnostics_channel_binding_data) + + void MemoryInfo(MemoryTracker* tracker) const override; + SET_SELF_SIZE(BindingData) + SET_MEMORY_INFO_NAME(BindingData) + + AliasedUint32Array subscribers_; + + uint32_t next_channel_index_ = 0; + std::unordered_map<std::string, uint32_t> channel_indices_; + + uint32_t GetOrCreateChannelIndex(const std::string& name); + + v8::Global<v8::Function> link_callback_; + v8::Global<v8::FunctionTemplate> channel_wrap_template_; + std::vector<BaseObjectPtr<Channel>> channels_; + + static void GetOrCreateChannelIndex( + const v8::FunctionCallbackInfo<v8::Value>& args); + static void LinkNativeChannel( + const v8::FunctionCallbackInfo<v8::Value>& args); + + static void CreatePerIsolateProperties(IsolateData* isolate_data, + v8::Local<v8::ObjectTemplate> target); + static void CreatePerContextProperties(v8::Local<v8::Object> target, + v8::Local<v8::Value> unused, + v8::Local<v8::Context> context, + void* priv); + static void RegisterExternalReferences(ExternalReferenceRegistry* registry); + + private: + InternalFieldInfo* internal_field_info_ = nullptr; +}; + +class Channel : public BaseObject { + public: + // Public for MakeDetachedBaseObject. + Channel(Environment* env, + v8::Local<v8::Object> wrap, + BindingData* binding_data, + uint32_t index, + std::string name); + + // Returns a non-owning pointer. Lifetime is managed by BindingData. + static Channel* Get(Environment* env, const char* name); + + inline bool HasSubscribers() const { + return binding_data_ != nullptr && binding_data_->subscribers_[index_] > 0; + } + + void Publish(Environment* env, v8::Local<v8::Value> message); + + void Link(v8::Isolate* isolate, v8::Local<v8::Object> js_channel); + + inline bool IsLinked() const { return !js_channel_.IsEmpty(); } + + void Unlink(); + + void MemoryInfo(MemoryTracker* tracker) const override; + SET_MEMORY_INFO_NAME(Channel) + SET_SELF_SIZE(Channel) + + private: + friend class BindingData; + + void CachePublishFn(v8::Isolate* isolate, v8::Local<v8::Object> js_channel); + + BindingData* binding_data_; + uint32_t index_; + std::string name_; + v8::Global<v8::Object> js_channel_; + v8::Global<v8::Function> publish_fn_; +}; + +} // namespace diagnostics_channel +} // namespace node + +#endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS + +#endif // SRC_NODE_DIAGNOSTICS_CHANNEL_H_ diff --git a/src/node_env_var.cc b/src/node_env_var.cc index 6aad252eb5681b..5550a4bee3ce9e 100644 --- a/src/node_env_var.cc +++ b/src/node_env_var.cc @@ -358,9 +358,9 @@ Maybe<void> KVStore::AssignToObject(v8::Isolate* isolate, } struct TraceEnvVarOptions { - bool print_message : 1 = 0; - bool print_js_stack : 1 = 0; - bool print_native_stack : 1 = 0; + bool print_message : 1 = false; + bool print_js_stack : 1 = false; + bool print_native_stack : 1 = false; }; template <typename... Args> @@ -385,13 +385,13 @@ TraceEnvVarOptions GetTraceEnvVarOptions(Environment* env) { ? env->options() : per_process::cli_options->per_isolate->per_env; if (cli_options->trace_env) { - options.print_message = 1; + options.print_message = true; }; if (cli_options->trace_env_js_stack) { - options.print_js_stack = 1; + options.print_js_stack = true; }; if (cli_options->trace_env_native_stack) { - options.print_native_stack = 1; + options.print_native_stack = true; }; return options; } diff --git a/src/node_errors.cc b/src/node_errors.cc index d148127b89b632..0388e2e31c9739 100644 --- a/src/node_errors.cc +++ b/src/node_errors.cc @@ -156,10 +156,8 @@ static std::string GetErrorSource(Isolate* isolate, end -= script_start; } - std::string buf = SPrintF("%s:%i\n%s\n", - filename_string, - linenum, - sourceline.c_str()); + std::string buf = + SPrintF("%s:%i\n%s\n", filename_string, linenum, sourceline); CHECK_GT(buf.size(), 0); *added_exception_line = true; diff --git a/src/node_external_reference.h b/src/node_external_reference.h index 8ab94c9c4a4e8f..a073cde10d1206 100644 --- a/src/node_external_reference.h +++ b/src/node_external_reference.h @@ -70,6 +70,7 @@ class ExternalReferenceRegistry { V(config) \ V(contextify) \ V(credentials) \ + V(diagnostics_channel) \ V(encoding_binding) \ V(env_var) \ V(errors) \ diff --git a/src/node_file.cc b/src/node_file.cc index c69b4eb461cab7..65bd2661bbceba 100644 --- a/src/node_file.cc +++ b/src/node_file.cc @@ -801,6 +801,22 @@ void AfterStat(uv_fs_t* req) { } } +void AfterStatNoThrowIfNoEntry(uv_fs_t* req) { + FSReqBase* req_wrap = FSReqBase::from_req(req); + FSReqAfterScope after(req_wrap, req); + + FS_ASYNC_TRACE_END1( + req->fs_type, req_wrap, "result", static_cast<int>(req->result)) + if (req->result == UV_ENOENT || req->result == UV_ENOTDIR) { + req_wrap->Resolve(Undefined(req_wrap->env()->isolate())); + return; + } + + if (after.Proceed()) { + req_wrap->ResolveStat(&req->statbuf); + } +} + void AfterStatFs(uv_fs_t* req) { FSReqBase* req_wrap = FSReqBase::from_req(req); FSReqAfterScope after(req_wrap, req); @@ -1096,7 +1112,9 @@ static void Stat(const FunctionCallbackInfo<Value>& args) { ToNamespacedPath(env, &path); bool use_bigint = args[1]->IsTrue(); - if (!args[2]->IsUndefined()) { // stat(path, use_bigint, req) + if (!args[2]->IsUndefined()) { // stat(path, use_bigint, req, + // do_not_throw_if_no_entry) + bool do_not_throw_if_no_entry = args[3]->IsFalse(); FSReqBase* req_wrap_async = GetReqWrap(args, 2, use_bigint); CHECK_NOT_NULL(req_wrap_async); ASYNC_THROW_IF_INSUFFICIENT_PERMISSIONS( @@ -1106,8 +1124,25 @@ static void Stat(const FunctionCallbackInfo<Value>& args) { path.ToStringView()); FS_ASYNC_TRACE_BEGIN1( UV_FS_STAT, req_wrap_async, "path", TRACE_STR_COPY(*path)) - AsyncCall(env, req_wrap_async, args, "stat", UTF8, AfterStat, - uv_fs_stat, *path); + if (do_not_throw_if_no_entry) { + AsyncCall(env, + req_wrap_async, + args, + "stat", + UTF8, + AfterStatNoThrowIfNoEntry, + uv_fs_stat, + *path); + } else { + AsyncCall(env, + req_wrap_async, + args, + "stat", + UTF8, + AfterStat, + uv_fs_stat, + *path); + } } else { // stat(path, use_bigint, undefined, do_not_throw_if_no_entry) THROW_IF_INSUFFICIENT_PERMISSIONS( env, permission::PermissionScope::kFileSystemRead, path.ToStringView()); @@ -3388,15 +3423,18 @@ static void CpSyncOverrideFile(const FunctionCallbackInfo<Value>& args) { THROW_IF_INSUFFICIENT_PERMISSIONS( env, permission::PermissionScope::kFileSystemWrite, dest.ToStringView()); + auto src_path = src.ToPath(); + auto dest_path = dest.ToPath(); + std::error_code error; - if (!std::filesystem::remove(*dest, error)) { + if (!std::filesystem::remove(dest_path, error)) { return env->ThrowStdErrException(error, "unlink", *dest); } if (mode == 0) { // if no mode is specified use the faster std::filesystem API - if (!std::filesystem::copy_file(*src, *dest, error)) { + if (!std::filesystem::copy_file(src_path, dest_path, error)) { return env->ThrowStdErrException(error, "cp", *dest); } } else { @@ -3409,7 +3447,7 @@ static void CpSyncOverrideFile(const FunctionCallbackInfo<Value>& args) { } if (preserve_timestamps) { - CopyUtimes(*src, *dest, env); + CopyUtimes(src_path, dest_path, env); } } @@ -3452,8 +3490,11 @@ static void CpSyncCopyDir(const FunctionCallbackInfo<Value>& args) { bool verbatim_symlinks = args[5]->IsTrue(); bool preserve_timestamps = args[6]->IsTrue(); + auto src_path = src.ToPath(); + auto dest_path = dest.ToPath(); + std::error_code error; - std::filesystem::create_directories(*dest, error); + std::filesystem::create_directories(dest_path, error); if (error) { return env->ThrowStdErrException(error, "cp", *dest); } @@ -3595,7 +3636,7 @@ static void CpSyncCopyDir(const FunctionCallbackInfo<Value>& args) { return true; }; - copy_dir_contents(std::filesystem::path(*src), std::filesystem::path(*dest)); + copy_dir_contents(src_path, dest_path); } BindingData::FilePathIsFileReturnType BindingData::FilePathIsFile( diff --git a/src/node_http_parser.cc b/src/node_http_parser.cc index 8edd9f9523fd6f..50d7f9e6916096 100644 --- a/src/node_http_parser.cc +++ b/src/node_http_parser.cc @@ -628,6 +628,8 @@ class Parser : public AsyncWrap, public StreamListener { Parser* parser; ASSIGN_OR_RETURN_UNWRAP(&parser, args.This()); + parser->is_being_freed_ = true; + if (parser->connectionsList_ != nullptr) { parser->connectionsList_->Pop(parser); parser->connectionsList_->PopActive(parser); @@ -1012,6 +1014,7 @@ class Parser : public AsyncWrap, public StreamListener { num_values_ = 0; have_flushed_ = false; got_exception_ = false; + is_being_freed_ = false; headers_completed_ = false; max_http_header_size_ = max_http_header_size; } @@ -1056,6 +1059,7 @@ class Parser : public AsyncWrap, public StreamListener { size_t num_values_; bool have_flushed_; bool got_exception_; + bool is_being_freed_ = false; size_t current_buffer_len_; const char* current_buffer_data_; bool headers_completed_ = false; @@ -1075,6 +1079,9 @@ class Parser : public AsyncWrap, public StreamListener { struct Proxy<int (Parser::*)(Args...), Member> { static int Raw(llhttp_t* p, Args ... args) { Parser* parser = ContainerOf(&Parser::parser_, p); + if (parser->is_being_freed_) { + return 0; + } int rv = (parser->*Member)(std::forward<Args>(args)...); if (rv == 0) { rv = parser->MaybePause(); diff --git a/src/node_options.cc b/src/node_options.cc index 02cc4fde90e7cd..79d7c8cac002ba 100644 --- a/src/node_options.cc +++ b/src/node_options.cc @@ -1157,6 +1157,7 @@ PerIsolateOptionsParser::PerIsolateOptionsParser( "help system profilers to translate JavaScript interpreted frames", V8Option{}, kAllowedInEnvvar); + AddOption("--max-heap-size", "", V8Option{}, kAllowedInEnvvar); AddOption("--max-old-space-size", "", V8Option{}, kAllowedInEnvvar); AddOption("--max-old-space-size-percentage", "set V8's max old space size as a percentage of available memory " diff --git a/src/node_root_certs.h b/src/node_root_certs.h index cd14f09fdc4620..e3c77a175f9ccf 100644 --- a/src/node_root_certs.h +++ b/src/node_root_certs.h @@ -3469,7 +3469,7 @@ "ak5KGoJr3M/TvEqzPNcum9v4KGm8ay3sMaE641c=\n" "-----END CERTIFICATE-----", -/* OISTE Server Root RSA G1 */ +/* OISTE Server Root RSA G1 */ "-----BEGIN CERTIFICATE-----\n" "MIIFgzCCA2ugAwIBAgIQVaXZZ5Qoxu0M+ifdWwFNGDANBgkqhkiG9w0BAQwFADBLMQswCQYD\n" "VQQGEwJDSDEZMBcGA1UECgwQT0lTVEUgRm91bmRhdGlvbjEhMB8GA1UEAwwYT0lTVEUgU2Vy\n" @@ -3499,4 +3499,22 @@ "axj5d9spLFKebXd7Yv0PTY6YMjAwcRLWJTXjn/hvnLXrahut6hDTlhZyBiElxky8j3C7DORe\n" "IoMt0r7+hVu05L0=\n" "-----END CERTIFICATE-----", + +/* e-Szigno TLS Root CA 2023 */ +"-----BEGIN CERTIFICATE-----\n" +"MIICzzCCAjGgAwIBAgINAOhvGHvWOWuYSkmYCjAKBggqhkjOPQQDBDB1MQswCQYDVQQGEwJI\n" +"VTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xFzAVBgNVBGEM\n" +"DlZBVEhVLTIzNTg0NDk3MSIwIAYDVQQDDBllLVN6aWdubyBUTFMgUm9vdCBDQSAyMDIzMB4X\n" +"DTIzMDcxNzE0MDAwMFoXDTM4MDcxNzE0MDAwMFowdTELMAkGA1UEBhMCSFUxETAPBgNVBAcM\n" +"CEJ1ZGFwZXN0MRYwFAYDVQQKDA1NaWNyb3NlYyBMdGQuMRcwFQYDVQRhDA5WQVRIVS0yMzU4\n" +"NDQ5NzEiMCAGA1UEAwwZZS1Temlnbm8gVExTIFJvb3QgQ0EgMjAyMzCBmzAQBgcqhkjOPQIB\n" +"BgUrgQQAIwOBhgAEAGgP36J8PKp0iGEKjcJMpQEiFNT3YHdCnAo4YKGMZz6zY+n6kbCLS+Y5\n" +"3wLCMAFSAL/fjO1ZrTJlqwlZULUZwmgcAOAFX9pQJhzDrAQixTpN7+lXWDajwRlTEArRzT/v\n" +"SzUaQ49CE0y5LBqcvjC2xN7cS53kpDzLLtmt3999Cd8ukv+ho2MwYTAPBgNVHRMBAf8EBTAD\n" +"AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUWYQCYlpGePVd3I8KECgj3NXW+0UwHwYD\n" +"VR0jBBgwFoAUWYQCYlpGePVd3I8KECgj3NXW+0UwCgYIKoZIzj0EAwQDgYsAMIGHAkIBLdqu\n" +"9S54tma4n7Zwf2Z0z+yOfP7AAXmazlIC58PRDHpty7Ve7hekm9sEdu4pKeiv+62sUvTXK9Z3\n" +"hBC9xdIoaDQCQTV2WnXzkoYI9bIeCvZlC9p2x1L/Cx6AcCIwwzPbGO2E14vs7dOoY4G1VnxH\n" +"x1YwlGhza9IuqbnZLBwpvQy6uWWL\n" +"-----END CERTIFICATE-----", #endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS diff --git a/src/node_sea.cc b/src/node_sea.cc index bea8d27e243853..f387813aa65a7f 100644 --- a/src/node_sea.cc +++ b/src/node_sea.cc @@ -642,7 +642,7 @@ int BuildAssets(const std::unordered_map<std::string, std::string>& config, int r = ReadFileSync(&blob, path.c_str()); if (r != 0) { const char* err = uv_strerror(r); - FPrintF(stderr, "Cannot read asset %s: %s\n", path.c_str(), err); + FPrintF(stderr, "Cannot read asset %s: %s\n", path, err); return r; } assets->emplace(key, std::move(blob)); diff --git a/src/node_snapshotable.cc b/src/node_snapshotable.cc index 56a7facd19a493..41b0773f4c37a0 100644 --- a/src/node_snapshotable.cc +++ b/src/node_snapshotable.cc @@ -14,6 +14,7 @@ #include "node_blob.h" #include "node_builtins.h" #include "node_contextify.h" +#include "node_diagnostics_channel.h" #include "node_errors.h" #include "node_external_reference.h" #include "node_file.h" @@ -225,7 +226,7 @@ builtins::CodeCacheInfo SnapshotDeserializer::Read() { if (is_debug) { std::string str = ToStr(result); - Debug("Read<builtins::CodeCacheInfo>() %s\n", str.c_str()); + Debug("Read<builtins::CodeCacheInfo>() %s\n", str); } return result; } @@ -234,7 +235,7 @@ template <> size_t SnapshotSerializer::Write(const builtins::CodeCacheInfo& info) { Debug("\nWrite<builtins::CodeCacheInfo>() id = %s" ", length=%d\n", - info.id.c_str(), + info.id, info.data.length); size_t written_total = WriteString(info.id); @@ -263,7 +264,7 @@ PropInfo SnapshotDeserializer::Read() { if (is_debug) { std::string str = ToStr(result); - Debug("Read<PropInfo>() %s\n", str.c_str()); + Debug("Read<PropInfo>() %s\n", str); } return result; @@ -273,7 +274,7 @@ template <> size_t SnapshotSerializer::Write(const PropInfo& data) { if (is_debug) { std::string str = ToStr(data); - Debug("Write<PropInfo>() %s\n", str.c_str()); + Debug("Write<PropInfo>() %s\n", str); } size_t written_total = WriteString(data.name); @@ -305,7 +306,7 @@ AsyncHooks::SerializeInfo SnapshotDeserializer::Read() { if (is_debug) { std::string str = ToStr(result); - Debug("Read<AsyncHooks::SerializeInfo>() %s\n", str.c_str()); + Debug("Read<AsyncHooks::SerializeInfo>() %s\n", str); } return result; @@ -314,7 +315,7 @@ template <> size_t SnapshotSerializer::Write(const AsyncHooks::SerializeInfo& data) { if (is_debug) { std::string str = ToStr(data); - Debug("Write<AsyncHooks::SerializeInfo>() %s\n", str.c_str()); + Debug("Write<AsyncHooks::SerializeInfo>() %s\n", str); } size_t written_total = @@ -341,7 +342,7 @@ TickInfo::SerializeInfo SnapshotDeserializer::Read() { if (is_debug) { std::string str = ToStr(result); - Debug("Read<TickInfo::SerializeInfo>() %s\n", str.c_str()); + Debug("Read<TickInfo::SerializeInfo>() %s\n", str); } return result; @@ -351,7 +352,7 @@ template <> size_t SnapshotSerializer::Write(const TickInfo::SerializeInfo& data) { if (is_debug) { std::string str = ToStr(data); - Debug("Write<TickInfo::SerializeInfo>() %s\n", str.c_str()); + Debug("Write<TickInfo::SerializeInfo>() %s\n", str); } size_t written_total = WriteArithmetic<AliasedBufferIndex>(data.fields); @@ -370,7 +371,7 @@ ImmediateInfo::SerializeInfo SnapshotDeserializer::Read() { result.fields = ReadArithmetic<AliasedBufferIndex>(); if (is_debug) { std::string str = ToStr(result); - Debug("Read<ImmediateInfo::SerializeInfo>() %s\n", str.c_str()); + Debug("Read<ImmediateInfo::SerializeInfo>() %s\n", str); } return result; } @@ -379,7 +380,7 @@ template <> size_t SnapshotSerializer::Write(const ImmediateInfo::SerializeInfo& data) { if (is_debug) { std::string str = ToStr(data); - Debug("Write<ImmediateInfo::SerializeInfo>() %s\n", str.c_str()); + Debug("Write<ImmediateInfo::SerializeInfo>() %s\n", str); } size_t written_total = WriteArithmetic<AliasedBufferIndex>(data.fields); @@ -403,7 +404,7 @@ performance::PerformanceState::SerializeInfo SnapshotDeserializer::Read() { result.observers = ReadArithmetic<AliasedBufferIndex>(); if (is_debug) { std::string str = ToStr(result); - Debug("Read<PerformanceState::SerializeInfo>() %s\n", str.c_str()); + Debug("Read<PerformanceState::SerializeInfo>() %s\n", str); } return result; } @@ -413,7 +414,7 @@ size_t SnapshotSerializer::Write( const performance::PerformanceState::SerializeInfo& data) { if (is_debug) { std::string str = ToStr(data); - Debug("Write<PerformanceState::SerializeInfo>() %s\n", str.c_str()); + Debug("Write<PerformanceState::SerializeInfo>() %s\n", str); } size_t written_total = WriteArithmetic<AliasedBufferIndex>(data.root); @@ -439,7 +440,7 @@ IsolateDataSerializeInfo SnapshotDeserializer::Read() { result.template_values = ReadVector<PropInfo>(); if (is_debug) { std::string str = ToStr(result); - Debug("Read<IsolateDataSerializeInfo>() %s\n", str.c_str()); + Debug("Read<IsolateDataSerializeInfo>() %s\n", str); } return result; } @@ -448,7 +449,7 @@ template <> size_t SnapshotSerializer::Write(const IsolateDataSerializeInfo& data) { if (is_debug) { std::string str = ToStr(data); - Debug("Write<IsolateDataSerializeInfo>() %s\n", str.c_str()); + Debug("Write<IsolateDataSerializeInfo>() %s\n", str); } size_t written_total = WriteVector<SnapshotIndex>(data.primitive_values); @@ -473,7 +474,7 @@ template <> size_t SnapshotSerializer::Write(const RealmSerializeInfo& data) { if (is_debug) { std::string str = ToStr(data); - Debug("\nWrite<RealmSerializeInfo>() %s\n", str.c_str()); + Debug("\nWrite<RealmSerializeInfo>() %s\n", str); } // Use += here to ensure order of evaluation. @@ -507,7 +508,7 @@ template <> size_t SnapshotSerializer::Write(const EnvSerializeInfo& data) { if (is_debug) { std::string str = ToStr(data); - Debug("\nWrite<EnvSerializeInfo>() %s\n", str.c_str()); + Debug("\nWrite<EnvSerializeInfo>() %s\n", str); } // Use += here to ensure order of evaluation. @@ -549,7 +550,7 @@ SnapshotMetadata SnapshotDeserializer::Read() { if (is_debug) { std::string str = ToStr(result); - Debug("Read<SnapshotMetadata>() %s\n", str.c_str()); + Debug("Read<SnapshotMetadata>() %s\n", str); } return result; } @@ -558,7 +559,7 @@ template <> size_t SnapshotSerializer::Write(const SnapshotMetadata& data) { if (is_debug) { std::string str = ToStr(data); - Debug("\nWrite<SnapshotMetadata>() %s\n", str.c_str()); + Debug("\nWrite<SnapshotMetadata>() %s\n", str); } size_t written_total = 0; // We need the Node.js version, platform and arch to match because @@ -566,7 +567,7 @@ size_t SnapshotSerializer::Write(const SnapshotMetadata& data) { // can be changed in semver-patches. Debug("Write snapshot type %d\n", static_cast<uint8_t>(data.type)); written_total += WriteArithmetic<uint8_t>(static_cast<uint8_t>(data.type)); - Debug("Write Node.js version %s\n", data.node_version.c_str()); + Debug("Write Node.js version %s\n", data.node_version); written_total += WriteString(data.node_version); Debug("Write Node.js arch %s\n", data.node_arch); written_total += WriteString(data.node_arch); @@ -1130,8 +1131,8 @@ ExitCode BuildCodeCacheFromSnapshot(SnapshotData* out, std::string size_str = FormatSize(item.data.length); per_process::Debug(DebugCategory::MKSNAPSHOT, "Generated code cache for %d: %s\n", - item.id.c_str(), - size_str.c_str()); + item.id, + size_str); } } return ExitCode::kNoFailure; diff --git a/src/node_sqlite.cc b/src/node_sqlite.cc index 050d779bdcd2b3..f7942f68fdb46e 100644 --- a/src/node_sqlite.cc +++ b/src/node_sqlite.cc @@ -12,7 +12,10 @@ #include "threadpoolwork-inl.h" #include "util-inl.h" +#include <array> #include <cinttypes> +#include <cmath> +#include <limits> namespace node { namespace sqlite { @@ -36,6 +39,7 @@ using v8::Global; using v8::HandleScope; using v8::Int32; using v8::Integer; +using v8::Intercepted; using v8::Isolate; using v8::JustVoid; using v8::Local; @@ -43,12 +47,16 @@ using v8::LocalVector; using v8::Maybe; using v8::MaybeLocal; using v8::Name; +using v8::NamedPropertyHandlerConfiguration; using v8::NewStringType; using v8::Nothing; using v8::Null; using v8::Number; using v8::Object; +using v8::ObjectTemplate; using v8::Promise; +using v8::PropertyCallbackInfo; +using v8::PropertyHandlerFlags; using v8::SideEffectType; using v8::String; using v8::TryCatch; @@ -133,6 +141,16 @@ Local<DictionaryTemplate> getLazyIterTemplate(Environment* env) { } } // namespace +// Helper function to find limit info from JS property name +static constexpr const LimitInfo* GetLimitInfoFromName(std::string_view name) { + for (const auto& info : kLimitMapping) { + if (name == info.js_name) { + return &info; + } + } + return nullptr; +} + inline MaybeLocal<Object> CreateSQLiteError(Isolate* isolate, const char* message) { Local<String> js_msg; @@ -668,6 +686,175 @@ void UserDefinedFunction::xDestroy(void* self) { delete static_cast<UserDefinedFunction*>(self); } +DatabaseSyncLimits::DatabaseSyncLimits(Environment* env, + Local<Object> object, + BaseObjectWeakPtr<DatabaseSync> database) + : BaseObject(env, object), database_(std::move(database)) { + MakeWeak(); +} + +DatabaseSyncLimits::~DatabaseSyncLimits() = default; + +void DatabaseSyncLimits::MemoryInfo(MemoryTracker* tracker) const { + tracker->TrackField("database", database_); +} + +Local<ObjectTemplate> DatabaseSyncLimits::GetTemplate(Environment* env) { + Local<ObjectTemplate> tmpl = env->sqlite_limits_template(); + if (!tmpl.IsEmpty()) return tmpl; + + Isolate* isolate = env->isolate(); + tmpl = ObjectTemplate::New(isolate); + tmpl->SetInternalFieldCount(DatabaseSyncLimits::kInternalFieldCount); + tmpl->SetHandler(NamedPropertyHandlerConfiguration( + LimitsGetter, + LimitsSetter, + LimitsQuery, + nullptr, // deleter - not allowed + LimitsEnumerator, + nullptr, // definer + nullptr, + Local<Value>(), + PropertyHandlerFlags::kHasNoSideEffect)); + + env->set_sqlite_limits_template(tmpl); + return tmpl; +} + +Intercepted DatabaseSyncLimits::LimitsGetter( + Local<Name> property, const PropertyCallbackInfo<Value>& info) { + // Skip symbols + if (!property->IsString()) { + return Intercepted::kNo; + } + + DatabaseSyncLimits* limits; + ASSIGN_OR_RETURN_UNWRAP(&limits, info.This(), Intercepted::kNo); + + Environment* env = limits->env(); + Isolate* isolate = env->isolate(); + + Utf8Value prop_name(isolate, property); + const LimitInfo* limit_info = GetLimitInfoFromName(prop_name.ToStringView()); + + if (limit_info == nullptr) { + return Intercepted::kNo; // Unknown property, let default handling occur + } + + if (!limits->database_ || !limits->database_->IsOpen()) { + THROW_ERR_INVALID_STATE(env, "database is not open"); + return Intercepted::kYes; + } + + int current_value = sqlite3_limit( + limits->database_->Connection(), limit_info->sqlite_limit_id, -1); + info.GetReturnValue().Set(Integer::New(isolate, current_value)); + return Intercepted::kYes; +} + +Intercepted DatabaseSyncLimits::LimitsSetter( + Local<Name> property, + Local<Value> value, + const PropertyCallbackInfo<void>& info) { + if (!property->IsString()) { + return Intercepted::kNo; + } + + DatabaseSyncLimits* limits; + ASSIGN_OR_RETURN_UNWRAP(&limits, info.This(), Intercepted::kNo); + + Environment* env = limits->env(); + Isolate* isolate = env->isolate(); + + Utf8Value prop_name(isolate, property); + const LimitInfo* limit_info = GetLimitInfoFromName(prop_name.ToStringView()); + + if (limit_info == nullptr) { + return Intercepted::kNo; + } + + if (!limits->database_ || !limits->database_->IsOpen()) { + THROW_ERR_INVALID_STATE(env, "database is not open"); + return Intercepted::kYes; + } + + if (!value->IsNumber()) { + THROW_ERR_INVALID_ARG_TYPE( + isolate, "Limit value must be a non-negative integer or Infinity."); + return Intercepted::kYes; + } + + const double num_value = value.As<Number>()->Value(); + int new_value; + + if (std::isinf(num_value) && num_value > 0) { + // Positive Infinity resets the limit to the compile-time maximum + new_value = std::numeric_limits<int>::max(); + } else if (!value->IsInt32()) { + THROW_ERR_INVALID_ARG_TYPE( + isolate, "Limit value must be a non-negative integer or Infinity."); + return Intercepted::kYes; + } else { + new_value = value.As<Int32>()->Value(); + if (new_value < 0) { + THROW_ERR_OUT_OF_RANGE(isolate, "Limit value must be non-negative."); + return Intercepted::kYes; + } + } + + sqlite3_limit( + limits->database_->Connection(), limit_info->sqlite_limit_id, new_value); + return Intercepted::kYes; +} + +Intercepted DatabaseSyncLimits::LimitsQuery( + Local<Name> property, const PropertyCallbackInfo<Integer>& info) { + if (!property->IsString()) { + return Intercepted::kNo; + } + + Isolate* isolate = info.GetIsolate(); + Utf8Value prop_name(isolate, property); + const LimitInfo* limit_info = GetLimitInfoFromName(prop_name.ToStringView()); + + if (!limit_info) { + return Intercepted::kNo; + } + + // Property exists and is writable + info.GetReturnValue().Set( + Integer::New(isolate, v8::PropertyAttribute::DontDelete)); + return Intercepted::kYes; +} + +void DatabaseSyncLimits::LimitsEnumerator( + const PropertyCallbackInfo<Array>& info) { + Isolate* isolate = info.GetIsolate(); + LocalVector<Value> names(isolate); + + for (const auto& [js_name, sqlite_limit_id] : kLimitMapping) { + Local<String> name; + if (!String::NewFromUtf8( + isolate, js_name.data(), NewStringType::kNormal, js_name.size()) + .ToLocal(&name)) { + return; + } + names.push_back(name); + } + + info.GetReturnValue().Set(Array::New(isolate, names.data(), names.size())); +} + +BaseObjectPtr<DatabaseSyncLimits> DatabaseSyncLimits::Create( + Environment* env, BaseObjectWeakPtr<DatabaseSync> database) { + Local<Object> obj; + if (!GetTemplate(env)->NewInstance(env->context()).ToLocal(&obj)) { + return nullptr; + } + + return MakeBaseObject<DatabaseSyncLimits>(env, obj, std::move(database)); +} + DatabaseSync::DatabaseSync(Environment* env, Local<Object> object, DatabaseOpenConfiguration&& open_config, @@ -766,6 +953,14 @@ bool DatabaseSync::Open() { sqlite3_busy_timeout(connection_, open_config_.get_timeout()); + // Apply initial limits + for (const auto& [js_name, sqlite_limit_id] : kLimitMapping) { + const auto& limit_value = open_config_.initial_limits()[sqlite_limit_id]; + if (limit_value.has_value()) { + sqlite3_limit(connection_, sqlite_limit_id, *limit_value); + } + } + if (allow_load_extension_) { if (env()->permission()->enabled()) [[unlikely]] { THROW_ERR_LOAD_SQLITE_EXTENSION(env(), @@ -886,7 +1081,7 @@ std::optional<std::string> ValidateDatabasePath(Environment* env, THROW_ERR_INVALID_ARG_TYPE(env->isolate(), "The \"%s\" argument must be a string, " "Uint8Array, or URL without null bytes.", - field_name.c_str()); + field_name); return std::nullopt; } @@ -1091,6 +1286,59 @@ void DatabaseSync::New(const FunctionCallbackInfo<Value>& args) { } open_config.set_enable_defensive(defensive_v.As<Boolean>()->Value()); } + + // Parse limits option + Local<Value> limits_v; + if (!options->Get(env->context(), env->limits_string()) + .ToLocal(&limits_v)) { + return; + } + if (!limits_v->IsUndefined()) { + if (!limits_v->IsObject()) { + THROW_ERR_INVALID_ARG_TYPE( + env->isolate(), + "The \"options.limits\" argument must be an object."); + return; + } + + Local<Object> limits_obj = limits_v.As<Object>(); + + // Iterate through known limit names and extract values + for (const auto& [js_name, sqlite_limit_id] : kLimitMapping) { + Local<String> key; + if (!String::NewFromUtf8(env->isolate(), + js_name.data(), + NewStringType::kNormal, + js_name.size()) + .ToLocal(&key)) { + return; + } + + Local<Value> val; + if (!limits_obj->Get(env->context(), key).ToLocal(&val)) { + return; + } + + if (!val->IsUndefined()) { + if (!val->IsInt32()) { + std::string msg = "The \"options.limits." + std::string(js_name) + + "\" argument must be an integer."; + THROW_ERR_INVALID_ARG_TYPE(env->isolate(), msg); + return; + } + + int limit_val = val.As<Int32>()->Value(); + if (limit_val < 0) { + std::string msg = "The \"options.limits." + std::string(js_name) + + "\" argument must be non-negative."; + THROW_ERR_OUT_OF_RANGE(env->isolate(), msg); + return; + } + + open_config.set_initial_limit(sqlite_limit_id, limit_val); + } + } + } } new DatabaseSync( @@ -1118,6 +1366,26 @@ void DatabaseSync::IsTransactionGetter( args.GetReturnValue().Set(sqlite3_get_autocommit(db->connection_) == 0); } +void DatabaseSync::LimitsGetter(const FunctionCallbackInfo<Value>& args) { + DatabaseSync* db; + ASSIGN_OR_RETURN_UNWRAP(&db, args.This()); + Environment* env = Environment::GetCurrent(args); + + Local<Value> limits_val = + db->object()->GetInternalField(kLimitsObject).template As<Value>(); + + if (limits_val->IsUndefined()) { + BaseObjectPtr<DatabaseSyncLimits> limits = + DatabaseSyncLimits::Create(env, BaseObjectWeakPtr<DatabaseSync>(db)); + if (limits) { + db->object()->SetInternalField(kLimitsObject, limits->object()); + args.GetReturnValue().Set(limits->object()); + } + } else { + args.GetReturnValue().Set(limits_val); + } +} + void DatabaseSync::Close(const FunctionCallbackInfo<Value>& args) { DatabaseSync* db; ASSIGN_OR_RETURN_UNWRAP(&db, args.This()); @@ -1889,7 +2157,8 @@ void DatabaseSync::ApplyChangeset(const FunctionCallbackInfo<Value>& args) { Local<Function> filterFunc = filterValue.As<Function>(); - context.filterCallback = [&](std::string_view item) -> bool { + context.filterCallback = + [env, db, filterFunc](std::string_view item) -> bool { // If there was an error in the previous call to the filter's // callback, we skip calling it again. if (db->ignore_next_sqlite_error_) { @@ -2153,6 +2422,11 @@ inline bool StatementSync::IsFinalized() { return statement_ == nullptr; } +inline int StatementSync::ResetStatement() { + reset_generation_++; + return sqlite3_reset(statement_); +} + bool StatementSync::BindParams(const FunctionCallbackInfo<Value>& args) { int r = sqlite3_clear_bindings(statement_); CHECK_ERROR_OR_THROW(env()->isolate(), db_.get(), r, SQLITE_OK, false); @@ -2544,7 +2818,7 @@ void StatementSync::All(const FunctionCallbackInfo<Value>& args) { THROW_AND_RETURN_ON_BAD_STATE( env, stmt->IsFinalized(), "statement has been finalized"); Isolate* isolate = env->isolate(); - int r = sqlite3_reset(stmt->statement_); + int r = stmt->ResetStatement(); CHECK_ERROR_OR_THROW(isolate, stmt->db_.get(), r, SQLITE_OK, void()); if (!stmt->BindParams(args)) { @@ -2570,7 +2844,7 @@ void StatementSync::Iterate(const FunctionCallbackInfo<Value>& args) { Environment* env = Environment::GetCurrent(args); THROW_AND_RETURN_ON_BAD_STATE( env, stmt->IsFinalized(), "statement has been finalized"); - int r = sqlite3_reset(stmt->statement_); + int r = stmt->ResetStatement(); CHECK_ERROR_OR_THROW(env->isolate(), stmt->db_.get(), r, SQLITE_OK, void()); if (!stmt->BindParams(args)) { @@ -2593,7 +2867,7 @@ void StatementSync::Get(const FunctionCallbackInfo<Value>& args) { Environment* env = Environment::GetCurrent(args); THROW_AND_RETURN_ON_BAD_STATE( env, stmt->IsFinalized(), "statement has been finalized"); - int r = sqlite3_reset(stmt->statement_); + int r = stmt->ResetStatement(); CHECK_ERROR_OR_THROW(env->isolate(), stmt->db_.get(), r, SQLITE_OK, void()); if (!stmt->BindParams(args)) { @@ -2617,7 +2891,7 @@ void StatementSync::Run(const FunctionCallbackInfo<Value>& args) { Environment* env = Environment::GetCurrent(args); THROW_AND_RETURN_ON_BAD_STATE( env, stmt->IsFinalized(), "statement has been finalized"); - int r = sqlite3_reset(stmt->statement_); + int r = stmt->ResetStatement(); CHECK_ERROR_OR_THROW(env->isolate(), stmt->db_.get(), r, SQLITE_OK, void()); if (!stmt->BindParams(args)) { @@ -3162,6 +3436,7 @@ StatementSyncIterator::StatementSyncIterator(Environment* env, : BaseObject(env, object), stmt_(std::move(stmt)) { MakeWeak(); done_ = false; + statement_reset_generation_ = stmt_->reset_generation_; } StatementSyncIterator::~StatementSyncIterator() {} @@ -3220,6 +3495,11 @@ void StatementSyncIterator::Next(const FunctionCallbackInfo<Value>& args) { return; } + THROW_AND_RETURN_ON_BAD_STATE( + env, + iter->statement_reset_generation_ != iter->stmt_->reset_generation_, + "iterator was invalidated"); + int r = sqlite3_step(iter->stmt_->statement_); if (r != SQLITE_ROW) { CHECK_ERROR_OR_THROW( @@ -3496,6 +3776,10 @@ static void Initialize(Local<Object> target, db_tmpl, FIXED_ONE_BYTE_STRING(isolate, "isTransaction"), DatabaseSync::IsTransactionGetter); + SetSideEffectFreeGetter(isolate, + db_tmpl, + FIXED_ONE_BYTE_STRING(isolate, "limits"), + DatabaseSync::LimitsGetter); Local<String> sqlite_type_key = FIXED_ONE_BYTE_STRING(isolate, "sqlite-type"); Local<v8::Symbol> sqlite_type_symbol = v8::Symbol::For(isolate, sqlite_type_key); diff --git a/src/node_sqlite.h b/src/node_sqlite.h index bd61fcd6ebcd4d..3ee79cc10ec562 100644 --- a/src/node_sqlite.h +++ b/src/node_sqlite.h @@ -9,13 +9,48 @@ #include "sqlite3.h" #include "util.h" +#include <array> #include <list> #include <map> +#include <optional> +#include <string_view> #include <unordered_set> namespace node { namespace sqlite { +// Mapping from JavaScript property names to SQLite limit constants +struct LimitInfo { + std::string_view js_name; + int sqlite_limit_id; +}; + +inline constexpr std::array<LimitInfo, 11> kLimitMapping = {{ + {"length", SQLITE_LIMIT_LENGTH}, + {"sqlLength", SQLITE_LIMIT_SQL_LENGTH}, + {"column", SQLITE_LIMIT_COLUMN}, + {"exprDepth", SQLITE_LIMIT_EXPR_DEPTH}, + {"compoundSelect", SQLITE_LIMIT_COMPOUND_SELECT}, + {"vdbeOp", SQLITE_LIMIT_VDBE_OP}, + {"functionArg", SQLITE_LIMIT_FUNCTION_ARG}, + {"attach", SQLITE_LIMIT_ATTACHED}, + {"likePatternLength", SQLITE_LIMIT_LIKE_PATTERN_LENGTH}, + {"variableNumber", SQLITE_LIMIT_VARIABLE_NUMBER}, + {"triggerDepth", SQLITE_LIMIT_TRIGGER_DEPTH}, +}}; + +constexpr bool CheckLimitIndices() { + for (size_t i = 0; i < kLimitMapping.size(); ++i) { + if (kLimitMapping[i].sqlite_limit_id != static_cast<int>(i)) { + return false; + } + } + return true; +} +static_assert( + CheckLimitIndices(), + "Each kLimitMapping entry's sqlite_limit_id must match its index"); + class DatabaseOpenConfiguration { public: explicit DatabaseOpenConfiguration(std::string&& location) @@ -69,6 +104,15 @@ class DatabaseOpenConfiguration { inline bool get_enable_defensive() const { return defensive_; } + inline void set_initial_limit(int sqlite_limit_id, int value) { + initial_limits_.at(sqlite_limit_id) = value; + } + + inline const std::array<std::optional<int>, kLimitMapping.size()>& + initial_limits() const { + return initial_limits_; + } + private: std::string location_; bool read_only_ = false; @@ -80,9 +124,11 @@ class DatabaseOpenConfiguration { bool allow_bare_named_params_ = true; bool allow_unknown_named_params_ = false; bool defensive_ = true; + std::array<std::optional<int>, kLimitMapping.size()> initial_limits_{}; }; class DatabaseSync; +class DatabaseSyncLimits; class StatementSyncIterator; class StatementSync; class BackupJob; @@ -118,6 +164,7 @@ class DatabaseSync : public BaseObject { public: enum InternalFields { kAuthorizerCallback = BaseObject::kInternalFieldCount, + kLimitsObject, kInternalFieldCount }; @@ -146,6 +193,7 @@ class DatabaseSync : public BaseObject { static void EnableLoadExtension( const v8::FunctionCallbackInfo<v8::Value>& args); static void EnableDefensive(const v8::FunctionCallbackInfo<v8::Value>& args); + static void LimitsGetter(const v8::FunctionCallbackInfo<v8::Value>& args); static void LoadExtension(const v8::FunctionCallbackInfo<v8::Value>& args); static void SetAuthorizer(const v8::FunctionCallbackInfo<v8::Value>& args); static int AuthorizerCallback(void* user_data, @@ -195,6 +243,7 @@ class DatabaseSync : public BaseObject { std::set<sqlite3_session*> sessions_; std::unordered_set<StatementSync*> statements_; + friend class DatabaseSyncLimits; friend class Session; friend class SQLTagStore; friend class StatementExecutionHelper; @@ -242,7 +291,9 @@ class StatementSync : public BaseObject { bool use_big_ints_; bool allow_bare_named_params_; bool allow_unknown_named_params_; + uint64_t reset_generation_ = 0; std::optional<std::map<std::string, std::string>> bare_named_params_; + inline int ResetStatement(); bool BindParams(const v8::FunctionCallbackInfo<v8::Value>& args); bool BindValue(const v8::Local<v8::Value>& value, const int index); @@ -272,6 +323,7 @@ class StatementSyncIterator : public BaseObject { ~StatementSyncIterator() override; BaseObjectPtr<StatementSync> stmt_; bool done_; + uint64_t statement_reset_generation_; }; using Sqlite3ChangesetGenFunc = int (*)(sqlite3_session*, int*, void**); @@ -356,6 +408,37 @@ class UserDefinedFunction { bool use_bigint_args_; }; +class DatabaseSyncLimits : public BaseObject { + public: + DatabaseSyncLimits(Environment* env, + v8::Local<v8::Object> object, + BaseObjectWeakPtr<DatabaseSync> database); + ~DatabaseSyncLimits() override; + + void MemoryInfo(MemoryTracker* tracker) const override; + static v8::Local<v8::ObjectTemplate> GetTemplate(Environment* env); + static BaseObjectPtr<DatabaseSyncLimits> Create( + Environment* env, BaseObjectWeakPtr<DatabaseSync> database); + + static v8::Intercepted LimitsGetter( + v8::Local<v8::Name> property, + const v8::PropertyCallbackInfo<v8::Value>& info); + static v8::Intercepted LimitsSetter( + v8::Local<v8::Name> property, + v8::Local<v8::Value> value, + const v8::PropertyCallbackInfo<void>& info); + static v8::Intercepted LimitsQuery( + v8::Local<v8::Name> property, + const v8::PropertyCallbackInfo<v8::Integer>& info); + static void LimitsEnumerator(const v8::PropertyCallbackInfo<v8::Array>& info); + + SET_MEMORY_INFO_NAME(DatabaseSyncLimits) + SET_SELF_SIZE(DatabaseSyncLimits) + + private: + BaseObjectWeakPtr<DatabaseSync> database_; +}; + } // namespace sqlite } // namespace node diff --git a/src/node_worker.cc b/src/node_worker.cc index fa7dc52b19119e..1d07449c5293f0 100644 --- a/src/node_worker.cc +++ b/src/node_worker.cc @@ -1121,7 +1121,8 @@ static bool serializeProfile(Isolate* isolate, std::ostringstream& out_stream) { if (!profile) { return false; } - JSONWriter writer(out_stream, false); + profiler->StopSamplingHeapProfiler(); + JSONWriter writer(out_stream, true); writer.json_start(); writer.json_arraystart("samples"); @@ -1139,7 +1140,6 @@ static bool serializeProfile(Isolate* isolate, std::ostringstream& out_stream) { writer.json_objectend(); writer.json_end(); - profiler->StopSamplingHeapProfiler(); return true; } diff --git a/src/node_zlib.cc b/src/node_zlib.cc index d3bd0f6f6540b4..792d800847e105 100644 --- a/src/node_zlib.cc +++ b/src/node_zlib.cc @@ -40,6 +40,7 @@ #include "brotli/decode.h" #include "brotli/encode.h" +#include "brotli/shared_dictionary.h" #include "zlib.h" #include "zstd.h" #include "zstd_errors.h" @@ -256,7 +257,7 @@ class BrotliEncoderContext final : public BrotliContext { public: void Close(); void DoThreadPoolWork(); - CompressionError Init(); + CompressionError Init(std::vector<uint8_t>&& dictionary = {}); CompressionError ResetStream(); CompressionError SetParams(int key, uint32_t value); CompressionError GetErrorInfo() const; @@ -268,13 +269,18 @@ class BrotliEncoderContext final : public BrotliContext { private: bool last_result_ = false; DeleteFnPtr<BrotliEncoderState, BrotliEncoderDestroyInstance> state_; + DeleteFnPtr<BrotliEncoderPreparedDictionary, + BrotliEncoderDestroyPreparedDictionary> + prepared_dictionary_; + // Dictionary data must remain valid while the prepared dictionary is alive. + std::vector<uint8_t> dictionary_; }; class BrotliDecoderContext final : public BrotliContext { public: void Close(); void DoThreadPoolWork(); - CompressionError Init(); + CompressionError Init(std::vector<uint8_t>&& dictionary = {}); CompressionError ResetStream(); CompressionError SetParams(int key, uint32_t value); CompressionError GetErrorInfo() const; @@ -288,6 +294,8 @@ class BrotliDecoderContext final : public BrotliContext { BrotliDecoderErrorCode error_ = BROTLI_DECODER_NO_ERROR; std::string error_string_; DeleteFnPtr<BrotliDecoderState, BrotliDecoderDestroyInstance> state_; + // Dictionary data must remain valid for the lifetime of the decoder. + std::vector<uint8_t> dictionary_; }; class ZstdContext : public MemoryRetainer { @@ -636,6 +644,12 @@ class CompressionStream : public AsyncWrap, CompressionStream* wrap; ASSIGN_OR_RETURN_UNWRAP(&wrap, args.This()); + if (wrap->write_in_progress_) { + wrap->env()->ThrowError( + "Cannot reset zlib stream while a write is in progress"); + return; + } + AllocScope alloc_scope(wrap); const CompressionError err = wrap->context()->ResetStream(); if (err.IsError()) @@ -830,7 +844,8 @@ class BrotliCompressionStream final : static void Init(const FunctionCallbackInfo<Value>& args) { BrotliCompressionStream* wrap; ASSIGN_OR_RETURN_UNWRAP(&wrap, args.This()); - CHECK(args.Length() == 3 && "init(params, writeResult, writeCallback)"); + CHECK((args.Length() == 3 || args.Length() == 4) && + "init(params, writeResult, writeCallback[, dictionary])"); CHECK(args[1]->IsUint32Array()); CHECK_GE(args[1].As<Uint32Array>()->Length(), 2); @@ -841,7 +856,18 @@ class BrotliCompressionStream final : wrap->InitStream(write_result, write_js_callback); AllocScope alloc_scope(wrap); - CompressionError err = wrap->context()->Init(); + std::vector<uint8_t> dictionary; + if (args.Length() == 4 && !args[3]->IsUndefined()) { + if (!args[3]->IsArrayBufferView()) { + THROW_ERR_INVALID_ARG_TYPE( + wrap->env(), "dictionary must be an ArrayBufferView if provided"); + return; + } + ArrayBufferViewContents<uint8_t> contents(args[3]); + dictionary.assign(contents.data(), contents.data() + contents.length()); + } + + CompressionError err = wrap->context()->Init(std::move(dictionary)); if (err.IsError()) { wrap->EmitError(err); // TODO(addaleax): Sometimes we generate better error codes in C++ land, @@ -1387,23 +1413,57 @@ void BrotliEncoderContext::DoThreadPoolWork() { void BrotliEncoderContext::Close() { state_.reset(); + prepared_dictionary_.reset(); + dictionary_.clear(); mode_ = NONE; } -CompressionError BrotliEncoderContext::Init() { +CompressionError BrotliEncoderContext::Init(std::vector<uint8_t>&& dictionary) { brotli_alloc_func alloc = CompressionStreamMemoryOwner::AllocForBrotli; brotli_free_func free = CompressionStreamMemoryOwner::FreeForZlib; void* opaque = CompressionStream<BrotliEncoderContext>::AllocatorOpaquePointerForContext( this); + + // Clean up any previous dictionary state before re-initializing. + prepared_dictionary_.reset(); + dictionary_.clear(); + state_.reset(BrotliEncoderCreateInstance(alloc, free, opaque)); if (!state_) { return CompressionError("Could not initialize Brotli instance", "ERR_ZLIB_INITIALIZATION_FAILED", -1); - } else { - return CompressionError {}; } + + if (!dictionary.empty()) { + // The dictionary data must remain valid for the lifetime of the prepared + // dictionary, so take ownership via move. + dictionary_ = std::move(dictionary); + + prepared_dictionary_.reset( + BrotliEncoderPrepareDictionary(BROTLI_SHARED_DICTIONARY_RAW, + dictionary_.size(), + dictionary_.data(), + BROTLI_MAX_QUALITY, + alloc, + free, + opaque)); + if (!prepared_dictionary_) { + return CompressionError("Failed to prepare brotli dictionary", + "ERR_ZLIB_DICTIONARY_LOAD_FAILED", + -1); + } + + if (!BrotliEncoderAttachPreparedDictionary(state_.get(), + prepared_dictionary_.get())) { + return CompressionError("Failed to attach brotli dictionary", + "ERR_ZLIB_DICTIONARY_LOAD_FAILED", + -1); + } + } + + return CompressionError{}; } CompressionError BrotliEncoderContext::ResetStream() { @@ -1435,6 +1495,7 @@ CompressionError BrotliEncoderContext::GetErrorInfo() const { void BrotliDecoderContext::Close() { state_.reset(); + dictionary_.clear(); mode_ = NONE; } @@ -1455,20 +1516,39 @@ void BrotliDecoderContext::DoThreadPoolWork() { } } -CompressionError BrotliDecoderContext::Init() { +CompressionError BrotliDecoderContext::Init(std::vector<uint8_t>&& dictionary) { brotli_alloc_func alloc = CompressionStreamMemoryOwner::AllocForBrotli; brotli_free_func free = CompressionStreamMemoryOwner::FreeForZlib; void* opaque = CompressionStream<BrotliDecoderContext>::AllocatorOpaquePointerForContext( this); + + // Clean up any previous dictionary state before re-initializing. + dictionary_.clear(); + state_.reset(BrotliDecoderCreateInstance(alloc, free, opaque)); if (!state_) { return CompressionError("Could not initialize Brotli instance", "ERR_ZLIB_INITIALIZATION_FAILED", -1); - } else { - return CompressionError {}; } + + if (!dictionary.empty()) { + // The dictionary data must remain valid for the lifetime of the decoder, + // so take ownership via move. + dictionary_ = std::move(dictionary); + + if (!BrotliDecoderAttachDictionary(state_.get(), + BROTLI_SHARED_DICTIONARY_RAW, + dictionary_.size(), + dictionary_.data())) { + return CompressionError("Failed to attach brotli dictionary", + "ERR_ZLIB_DICTIONARY_LOAD_FAILED", + -1); + } + } + + return CompressionError{}; } CompressionError BrotliDecoderContext::ResetStream() { diff --git a/src/permission/fs_permission.cc b/src/permission/fs_permission.cc index 63dfc25f536c7c..3b817c5bcdce75 100644 --- a/src/permission/fs_permission.cc +++ b/src/permission/fs_permission.cc @@ -102,10 +102,8 @@ void PrintTree(const node::permission::FSPermission::RadixTree::Node* node, } } - node::per_process::Debug(node::DebugCategory::PERMISSION_MODEL, - "%s%s\n", - indent.c_str(), - node->prefix.c_str()); + node::per_process::Debug( + node::DebugCategory::PERMISSION_MODEL, "%s%s\n", indent, node->prefix); } if (node->children.size() > 0) { diff --git a/src/util-inl.h b/src/util-inl.h index c71c95656c0e76..f42c7b1250d1eb 100644 --- a/src/util-inl.h +++ b/src/util-inl.h @@ -591,7 +591,9 @@ void ArrayBufferViewContents<T, S>::Read(v8::Local<v8::ArrayBufferView> abv) { static_assert(sizeof(T) == 1, "Only supports one-byte data at the moment"); length_ = abv->ByteLength(); if (length_ > sizeof(stack_storage_) || abv->HasBuffer()) { - data_ = static_cast<T*>(abv->Buffer()->Data()) + abv->ByteOffset(); + auto buf_data = abv->Buffer()->Data(); + data_ = buf_data != nullptr ? static_cast<T*>(buf_data) + abv->ByteOffset() + : stack_storage_; } else { abv->CopyContents(stack_storage_, sizeof(stack_storage_)); data_ = stack_storage_; diff --git a/test/addons/addons.status b/test/addons/addons.status index 7f5fd8f0c2f51f..18b1c2b2157d81 100644 --- a/test/addons/addons.status +++ b/test/addons/addons.status @@ -12,6 +12,7 @@ openssl-binding/test: PASS,FLAKY [$system==ibmi] openssl-binding/test: SKIP +openssl-get-ssl-ctx/test: SKIP openssl-providers/test-default-only-config: SKIP openssl-providers/test-legacy-provider-config: SKIP openssl-providers/test-legacy-provider-inactive-config: SKIP diff --git a/test/addons/openssl-get-ssl-ctx/binding.cc b/test/addons/openssl-get-ssl-ctx/binding.cc new file mode 100644 index 00000000000000..3945ec870fb8b9 --- /dev/null +++ b/test/addons/openssl-get-ssl-ctx/binding.cc @@ -0,0 +1,52 @@ +#include <node.h> +#include <openssl/ssl.h> + +namespace { + +// Test: extract SSL_CTX* from a SecureContext object via +// node::crypto::GetSSLCtx. +void GetSSLCtx(const v8::FunctionCallbackInfo<v8::Value>& args) { + v8::Isolate* isolate = args.GetIsolate(); + v8::Local<v8::Context> context = isolate->GetCurrentContext(); + + SSL_CTX* ctx = node::crypto::GetSSLCtx(context, args[0]); + if (ctx == nullptr) { + isolate->ThrowException(v8::Exception::Error( + v8::String::NewFromUtf8( + isolate, "GetSSLCtx returned nullptr for a valid SecureContext") + .ToLocalChecked())); + return; + } + + // Verify the pointer is a valid SSL_CTX by calling an OpenSSL function. + const SSL_METHOD* method = SSL_CTX_get_ssl_method(ctx); + if (method == nullptr) { + isolate->ThrowException(v8::Exception::Error( + v8::String::NewFromUtf8(isolate, + "SSL_CTX_get_ssl_method returned nullptr") + .ToLocalChecked())); + return; + } + + args.GetReturnValue().Set(true); +} + +// Test: passing a non-SecureContext value returns nullptr. +void GetSSLCtxInvalid(const v8::FunctionCallbackInfo<v8::Value>& args) { + v8::Isolate* isolate = args.GetIsolate(); + v8::Local<v8::Context> context = isolate->GetCurrentContext(); + + SSL_CTX* ctx = node::crypto::GetSSLCtx(context, args[0]); + args.GetReturnValue().Set(ctx == nullptr); +} + +void Initialize(v8::Local<v8::Object> exports, + v8::Local<v8::Value> module, + v8::Local<v8::Context> context) { + NODE_SET_METHOD(exports, "getSSLCtx", GetSSLCtx); + NODE_SET_METHOD(exports, "getSSLCtxInvalid", GetSSLCtxInvalid); +} + +} // anonymous namespace + +NODE_MODULE_CONTEXT_AWARE(NODE_GYP_MODULE_NAME, Initialize) diff --git a/test/addons/openssl-get-ssl-ctx/binding.gyp b/test/addons/openssl-get-ssl-ctx/binding.gyp new file mode 100644 index 00000000000000..46a558e1203036 --- /dev/null +++ b/test/addons/openssl-get-ssl-ctx/binding.gyp @@ -0,0 +1,29 @@ +{ + 'targets': [ + { + 'target_name': 'binding', + 'includes': ['../common.gypi'], + 'conditions': [ + ['node_use_openssl=="true"', { + 'conditions': [ + ['OS in "aix os400"', { + 'variables': { + # Used to differentiate `AIX` and `OS400`(IBM i). + 'aix_variant_name': '<!(uname -s)', + }, + 'conditions': [ + [ '"<(aix_variant_name)"!="OS400"', { # Not `OS400`(IBM i) + 'sources': ['binding.cc'], + 'include_dirs': ['../../../deps/openssl/openssl/include'], + }], + ], + }, { + 'sources': ['binding.cc'], + 'include_dirs': ['../../../deps/openssl/openssl/include'], + }], + ], + }], + ], + }, + ], +} diff --git a/test/addons/openssl-get-ssl-ctx/test.js b/test/addons/openssl-get-ssl-ctx/test.js new file mode 100644 index 00000000000000..9acedb6ab93cff --- /dev/null +++ b/test/addons/openssl-get-ssl-ctx/test.js @@ -0,0 +1,49 @@ +'use strict'; +const common = require('../../common'); +if (!common.hasCrypto) + common.skip('missing crypto'); + +const assert = require('assert'); +const tls = require('tls'); +const binding = require(`./build/${common.buildType}/binding`); + +// Test 1: Pass a SecureContext to getSSLCtx. +{ + const ctx = tls.createSecureContext(); + assert.strictEqual(binding.getSSLCtx(ctx), true); +} + +// Test 2: Passing a non-SecureContext should return nullptr. +{ + assert.strictEqual(binding.getSSLCtxInvalid({}), true); +} + +// Test 3: Passing a number should return nullptr. +{ + assert.strictEqual(binding.getSSLCtxInvalid(42), true); +} + +// Test 4: Passing undefined should return nullptr. +{ + assert.strictEqual(binding.getSSLCtxInvalid(undefined), true); +} + +// Test 5: Passing null should return nullptr. +{ + assert.strictEqual(binding.getSSLCtxInvalid(null), true); +} + +// Test 6: An object with a non-SecureContext .context property should return +// nullptr. +{ + assert.strictEqual(binding.getSSLCtxInvalid({ context: 'not a context' }), true); +} + +// Test 7: An object with a throwing .context getter should return nullptr +// without propagating the exception. +{ + const obj = { + get context() { throw new Error('getter threw'); }, + }; + assert.strictEqual(binding.getSSLCtxInvalid(obj), true); +} diff --git a/test/cctest/test_diagnostics_channel.cc b/test/cctest/test_diagnostics_channel.cc new file mode 100644 index 00000000000000..b456f6aaf9eaab --- /dev/null +++ b/test/cctest/test_diagnostics_channel.cc @@ -0,0 +1,259 @@ +#include "node_diagnostics_channel.h" + +#include "gtest/gtest.h" +#include "node_test_fixture.h" + +using node::diagnostics_channel::Channel; + +class DiagnosticsChannelTest : public EnvironmentTestFixture {}; + +static v8::Local<v8::Value> RunJS(v8::Isolate* isolate, const char* code) { + v8::Local<v8::Context> context = isolate->GetCurrentContext(); + v8::Local<v8::Script> script = + v8::Script::Compile( + context, v8::String::NewFromUtf8(isolate, code).ToLocalChecked()) + .ToLocalChecked(); + return script->Run(context).ToLocalChecked(); +} + +// Channel::HasSubscribers() returns false when there are no subscribers. +TEST_F(DiagnosticsChannelTest, HasSubscribersReturnsFalseWithoutSubscribers) { + const v8::HandleScope handle_scope(isolate_); + Argv argv; + Env env{handle_scope, argv}; + + SetProcessExitHandler(*env, [&](node::Environment* env_, int exit_code) { + EXPECT_EQ(exit_code, 0); + node::Stop(*env); + }); + + // Load the environment to initialize bindings. + node::LoadEnvironment(*env, "require('diagnostics_channel');"); + + auto ch = Channel::Get(*env, "test:cctest:no-subscribers"); + ASSERT_NE(ch, nullptr); + EXPECT_FALSE(ch->HasSubscribers()); +} + +// Channel::HasSubscribers() returns true after JS subscribes. +TEST_F(DiagnosticsChannelTest, HasSubscribersReturnsTrueAfterSubscribe) { + const v8::HandleScope handle_scope(isolate_); + Argv argv; + Env env{handle_scope, argv}; + + SetProcessExitHandler(*env, [&](node::Environment* env_, int exit_code) { + EXPECT_EQ(exit_code, 0); + node::Stop(*env); + }); + + node::LoadEnvironment(*env, + "const dc = require('diagnostics_channel');" + "dc.subscribe('test:cctest:with-sub', () => {});"); + + auto ch = Channel::Get(*env, "test:cctest:with-sub"); + ASSERT_NE(ch, nullptr); + EXPECT_TRUE(ch->HasSubscribers()); +} + +// Channel::Get() with the same name returns consistent subscriber state. +TEST_F(DiagnosticsChannelTest, GetReturnsSameChannelState) { + const v8::HandleScope handle_scope(isolate_); + Argv argv; + Env env{handle_scope, argv}; + + SetProcessExitHandler(*env, [&](node::Environment* env_, int exit_code) { + EXPECT_EQ(exit_code, 0); + node::Stop(*env); + }); + + node::LoadEnvironment(*env, + "const dc = require('diagnostics_channel');" + "dc.subscribe('test:cctest:same-channel', () => {});"); + + auto ch1 = Channel::Get(*env, "test:cctest:same-channel"); + auto ch2 = Channel::Get(*env, "test:cctest:same-channel"); + ASSERT_NE(ch1, nullptr); + ASSERT_NE(ch2, nullptr); + EXPECT_TRUE(ch1->HasSubscribers()); + EXPECT_TRUE(ch2->HasSubscribers()); + EXPECT_EQ(ch1, ch2); +} + +// Channel::Publish() delivers messages to JS subscribers. +TEST_F(DiagnosticsChannelTest, PublishDeliversToJSSubscribers) { + const v8::HandleScope handle_scope(isolate_); + Argv argv; + Env env{handle_scope, argv}; + + SetProcessExitHandler(*env, [&](node::Environment* env_, int exit_code) { + EXPECT_EQ(exit_code, 0); + node::Stop(*env); + }); + + node::LoadEnvironment( + *env, + "const dc = require('diagnostics_channel');" + "const assert = require('assert');" + "dc.subscribe('test:cctest:publish', (message, name) => {" + " assert.strictEqual(name, 'test:cctest:publish');" + " assert.strictEqual(message.value, 42);" + " globalThis.__publishReceived = true;" + "});"); + + v8::Local<v8::Context> context = (*env)->context(); + + auto ch = Channel::Get(*env, "test:cctest:publish"); + ASSERT_NE(ch, nullptr); + ASSERT_TRUE(ch->HasSubscribers()); + + v8::Local<v8::Object> msg = v8::Object::New(isolate_); + msg->Set(context, + v8::String::NewFromUtf8Literal(isolate_, "value"), + v8::Integer::New(isolate_, 42)) + .Check(); + + ch->Publish(*env, msg); + + v8::Local<v8::Value> received = + context->Global() + ->Get(context, + v8::String::NewFromUtf8Literal(isolate_, "__publishReceived")) + .ToLocalChecked(); + EXPECT_TRUE(received->IsTrue()); +} + +// C++ creates a channel first, then JS subscribes to the same name. +// Verifies C++ Channel reflects the JS subscriber via the shared buffer. +TEST_F(DiagnosticsChannelTest, CppChannelVisibleFromJS) { + const v8::HandleScope handle_scope(isolate_); + Argv argv; + Env env{handle_scope, argv}; + + SetProcessExitHandler(*env, [&](node::Environment* env_, int exit_code) { + EXPECT_EQ(exit_code, 0); + node::Stop(*env); + }); + + // Expose dc on globalThis so RunJS (v8::Script) can access it. + node::LoadEnvironment(*env, + "globalThis.__dc = require('diagnostics_channel');"); + + auto ch = Channel::Get(*env, "test:cctest:cpp-first"); + ASSERT_NE(ch, nullptr); + EXPECT_FALSE(ch->HasSubscribers()); + + // JS subscribes to the same channel name via globalThis.__dc. + RunJS(isolate_, + "globalThis.__dc.subscribe('test:cctest:cpp-first', () => {});"); + + EXPECT_TRUE(ch->HasSubscribers()); + + RunJS(isolate_, + "globalThis.__cppFirstMsg = null;" + "globalThis.__dc.subscribe('test:cctest:cpp-first', (msg) => {" + " globalThis.__cppFirstMsg = msg;" + "});"); + + v8::Local<v8::Context> context = (*env)->context(); + v8::Local<v8::Object> msg = v8::Object::New(isolate_); + msg->Set(context, + v8::String::NewFromUtf8Literal(isolate_, "from"), + v8::String::NewFromUtf8Literal(isolate_, "cpp")) + .Check(); + + ch->Publish(*env, msg); + + v8::Local<v8::Value> received = + context->Global() + ->Get(context, + v8::String::NewFromUtf8Literal(isolate_, "__cppFirstMsg")) + .ToLocalChecked(); + ASSERT_TRUE(received->IsObject()); + v8::Local<v8::Value> from_val = + received.As<v8::Object>() + ->Get(context, v8::String::NewFromUtf8Literal(isolate_, "from")) + .ToLocalChecked(); + v8::String::Utf8Value from_str(isolate_, from_val); + EXPECT_STREQ(*from_str, "cpp"); +} + +// JS creates a channel and subscribes, then C++ gets the same channel, +// verifies it shares state, and publishes messages that JS receives. +TEST_F(DiagnosticsChannelTest, JSChannelVisibleFromCpp) { + const v8::HandleScope handle_scope(isolate_); + Argv argv; + Env env{handle_scope, argv}; + + SetProcessExitHandler(*env, [&](node::Environment* env_, int exit_code) { + EXPECT_EQ(exit_code, 0); + node::Stop(*env); + }); + + node::LoadEnvironment(*env, + "const dc = require('diagnostics_channel');" + "globalThis.__dc = dc;" + "globalThis.__jsFirstMessages = [];" + "dc.subscribe('test:cctest:js-first', (msg) => {" + " globalThis.__jsFirstMessages.push(msg);" + "});"); + + v8::Local<v8::Context> context = (*env)->context(); + + auto ch = Channel::Get(*env, "test:cctest:js-first"); + ASSERT_NE(ch, nullptr); + ASSERT_TRUE(ch->HasSubscribers()); + + // Publish from C++ — JS subscriber should receive it. + v8::Local<v8::Object> msg1 = v8::Object::New(isolate_); + msg1->Set(context, + v8::String::NewFromUtf8Literal(isolate_, "seq"), + v8::Integer::New(isolate_, 1)) + .Check(); + ch->Publish(*env, msg1); + + v8::Local<v8::Object> msg2 = v8::Object::New(isolate_); + msg2->Set(context, + v8::String::NewFromUtf8Literal(isolate_, "seq"), + v8::Integer::New(isolate_, 2)) + .Check(); + ch->Publish(*env, msg2); + + v8::Local<v8::Value> msgs_val = + context->Global() + ->Get(context, + v8::String::NewFromUtf8Literal(isolate_, "__jsFirstMessages")) + .ToLocalChecked(); + ASSERT_TRUE(msgs_val->IsArray()); + v8::Local<v8::Array> msgs = msgs_val.As<v8::Array>(); + EXPECT_EQ(msgs->Length(), 2u); + + // Check first message: { seq: 1 } + v8::Local<v8::Value> m1 = msgs->Get(context, 0).ToLocalChecked(); + ASSERT_TRUE(m1->IsObject()); + v8::Local<v8::Value> seq1 = + m1.As<v8::Object>() + ->Get(context, v8::String::NewFromUtf8Literal(isolate_, "seq")) + .ToLocalChecked(); + EXPECT_EQ(seq1->Int32Value(context).FromJust(), 1); + + // Check second message: { seq: 2 } + v8::Local<v8::Value> m2 = msgs->Get(context, 1).ToLocalChecked(); + ASSERT_TRUE(m2->IsObject()); + v8::Local<v8::Value> seq2 = + m2.As<v8::Object>() + ->Get(context, v8::String::NewFromUtf8Literal(isolate_, "seq")) + .ToLocalChecked(); + EXPECT_EQ(seq2->Int32Value(context).FromJust(), 2); + + RunJS(isolate_, + "globalThis.__jsHasSubs =" + " globalThis.__dc.hasSubscribers('test:cctest:js-first');"); + + v8::Local<v8::Value> js_has_subs = + context->Global() + ->Get(context, + v8::String::NewFromUtf8Literal(isolate_, "__jsHasSubs")) + .ToLocalChecked(); + EXPECT_TRUE(js_has_subs->IsTrue()); + EXPECT_TRUE(ch->HasSubscribers()); +} diff --git a/test/common/assertSnapshot.js b/test/common/assertSnapshot.js index 2b27db283167fc..9a7482020e098a 100644 --- a/test/common/assertSnapshot.js +++ b/test/common/assertSnapshot.js @@ -3,11 +3,30 @@ const common = require('.'); const path = require('node:path'); const test = require('node:test'); const fs = require('node:fs/promises'); +const { realpathSync } = require('node:fs'); const assert = require('node:assert/strict'); const { pathToFileURL } = require('node:url'); const { hostname } = require('node:os'); -const stackFramesRegexp = /(?<=\n)(\s+)((.+?)\s+\()?(?:\(?(.+?):(\d+)(?::(\d+))?)\)?(\s+\{)?(\[\d+m)?(\n|$)/g; +/* eslint-disable @stylistic/js/max-len,no-control-regex */ +/** + * Group 1: Line start (including color codes and escapes) + * Group 2: Function name + * Group 3: Filename + * Group 4: Line number + * Group 5: Column number + * Group 6: Line end (including color codes and `{` which indicates the start of an error object details) + */ +// Mappings: (g1 ) (g2 ) (g3 ) (g4 ) (g5 ) (g6 ) +const internalStackFramesRegexp = /(?<=\n)(\s*(?:\x1b?\[\d+m\s+)?(?:at\s+)?)(?:async\s+)?(?:(.+?)\s+\()?(?:(node:.+?):(\d+)(?::(\d+))?)\)?((?:\x1b?\[\d+m)?\s*{?\n|$)/g; +/** + * Group 1: Filename + * Group 2: Line number + * Group 3: Line end and source code line + */ +const internalErrorSourceLines = /(?<=\n|^)(node:.+?):(\d+)(\n.*\n\s*\^(?:\n|$))/g; +/* eslint-enable @stylistic/js/max-len,no-control-regex */ + const windowNewlineRegexp = /\r/g; // Replaces the current Node.js executable version strings with a @@ -17,14 +36,33 @@ function replaceNodeVersion(str) { return str.replaceAll(`Node.js ${process.version}`, 'Node.js <node-version>'); } -function replaceStackTrace(str, replacement = '$1*$7$8\n') { - return str.replace(stackFramesRegexp, replacement); +// Collapse consecutive identical lines containing the keyword into +// one single line. The `str` should have been processed by `replaceWindowsLineEndings`. +function foldIdenticalLines(str, keyword) { + const lines = str.split('\n'); + const folded = lines.filter((line, idx) => { + if (idx === 0) { + return true; + } + if (line.includes(keyword) && line === lines[idx - 1]) { + return false; + } + return true; + }); + return folded.join('\n'); } +const kInternalFrame = '<node-internal-frames>'; +// Replace non-internal frame `at TracingChannel.traceSync (node:diagnostics_channel:328:14)` +// as well as `at node:internal/main/run_main_module:33:47` with `at <node-internal-frames>`. +// Also replaces error source line like: +// node:internal/mod.js:44 +// throw err; +// ^ function replaceInternalStackTrace(str) { - // Replace non-internal frame `at TracingChannel.traceSync (node:diagnostics_channel:328:14)` - // as well as `at node:internal/main/run_main_module:33:47` with `*`. - return str.replaceAll(/(\W+).*[(\s]node:.*/g, '$1*'); + const result = str.replaceAll(internalErrorSourceLines, `$1:<line>$3`) + .replaceAll(internalStackFramesRegexp, `$1${kInternalFrame}$6`); + return foldIdenticalLines(result, kInternalFrame); } // Replaces Windows line endings with posix line endings for unified snapshots @@ -36,7 +74,12 @@ function replaceWindowsLineEndings(str) { // Replaces all Windows path separators with posix separators for unified snapshots // across platforms. function replaceWindowsPaths(str) { - return common.isWindows ? str.replaceAll(path.win32.sep, path.posix.sep) : str; + if (!common.isWindows) { + return str; + } + // Only replace `\` and `\\` with a leading letter, colon, or a `.`. + // Avoid replacing escaping patterns like ` \#`, `\ `, or `\\`. + return str.replaceAll(/(?<=(\w:|\.|\w+)(?:\S|\\ )*)\\\\?/g, '/'); } // Removes line trailing white spaces. @@ -55,30 +98,53 @@ function replaceWarningPid(str) { return str.replaceAll(/\(node:\d+\)/g, '(node:<pid>)'); } -// Replaces path strings representing the nodejs/node repo full project root with -// `<project-root>`. Also replaces file URLs containing the full project root path. -// The project root path may contain unicode characters. -function transformProjectRoot(replacement = '<project-root>') { - const projectRoot = path.resolve(__dirname, '../..'); +// Replaces a path with a placeholder. The path can be a platform specific path +// or a file URL. +function transformPath(dirname, replacement) { // Handles output already processed by `replaceWindowsPaths`. - const winPath = replaceWindowsPaths(projectRoot); - // Handles URL encoded project root in file URL strings as well. - const urlEncoded = pathToFileURL(projectRoot).pathname; + const winPath = replaceWindowsPaths(dirname); + // Handles URL encoded path in file URL strings as well. + const urlEncoded = pathToFileURL(dirname).pathname; // On Windows, paths are case-insensitive, so we need to use case-insensitive // regex replacement to handle cases where the drive letter case differs. const flags = common.isWindows ? 'gi' : 'g'; const urlEncodedRegex = new RegExp(RegExp.escape(urlEncoded), flags); - const projectRootRegex = new RegExp(RegExp.escape(projectRoot), flags); + const dirnameRegex = new RegExp(RegExp.escape(dirname), flags); const winPathRegex = new RegExp(RegExp.escape(winPath), flags); return (str) => { return str.replaceAll('\\\'', "'") // Replace fileUrl first as `winPath` could be a substring of the fileUrl. .replaceAll(urlEncodedRegex, replacement) - .replaceAll(projectRootRegex, replacement) + .replaceAll(dirnameRegex, replacement) .replaceAll(winPathRegex, replacement); }; } +// Replaces path strings representing the nodejs/node repo full project root with +// `<project-root>`. Also replaces file URLs containing the full project root path. +// The project root path may contain unicode characters. +const kProjectRoot = '<project-root>'; +function transformProjectRoot() { + const projectRoot = path.resolve(__dirname, '../..'); + if (process.env.NODE_TEST_DIR) { + const testDir = realpathSync(process.env.NODE_TEST_DIR); + // On Jenkins CI, the test dir may be overridden by `NODE_TEST_DIR`. + return transform( + transformPath(projectRoot, kProjectRoot), + transformPath(testDir, `${kProjectRoot}/test`), + // TODO(legendecas): test-runner may print relative paths to the test relative to cwd. + // It will be better if we could distinguish them from the project root. + transformPath(path.relative(projectRoot, testDir), 'test'), + ); + } + return transformPath(projectRoot, kProjectRoot); +} + +// Replaces tmpdirs created by `test/common/tmpdir.js`. +function transformTmpDir(str) { + return str.replaceAll(/\/\.tmp\.\d+\//g, '/<tmpdir>/'); +} + function transform(...args) { return (str) => args.reduce((acc, fn) => fn(acc), str); } @@ -149,14 +215,10 @@ function replaceTestDuration(str) { } const root = path.resolve(__dirname, '..', '..'); -const color = '(\\[\\d+m)'; -const stackTraceBasePath = new RegExp(`${color}\\(${RegExp.escape(root)}/?${color}(.*)${color}\\)`, 'g'); - function replaceSpecDuration(str) { return str .replaceAll(/[0-9.]+ms/g, '*ms') - .replaceAll(/duration_ms [0-9.]+/g, 'duration_ms *') - .replace(stackTraceBasePath, '$3'); + .replaceAll(/duration_ms [0-9.]+/g, 'duration_ms *'); } function replaceJunitDuration(str) { @@ -164,16 +226,7 @@ function replaceJunitDuration(str) { .replaceAll(/time="[0-9.]+"/g, 'time="*"') .replaceAll(/duration_ms [0-9.]+/g, 'duration_ms *') .replaceAll(`hostname="${hostname()}"`, 'hostname="HOSTNAME"') - .replaceAll(/file="[^"]*"/g, 'file="*"') - .replace(stackTraceBasePath, '$3'); -} - -function removeWindowsPathEscaping(str) { - return common.isWindows ? str.replaceAll(/\\\\/g, '\\') : str; -} - -function replaceTestLocationLine(str) { - return str.replaceAll(/(js:)(\d+)(:\d+)/g, '$1(LINE)$3'); + .replaceAll(/file="[^"]*"/g, 'file="*"'); } // The Node test coverage returns results for all files called by the test. This @@ -194,40 +247,37 @@ function pickTestFileFromLcov(str) { } // Transforms basic patterns like: -// - platform specific path and line endings, -// - line trailing spaces, -// - executable specific path and versions. +// - platform specific path and line endings +// - line trailing spaces +// - executable specific path and versions +// - project root path and tmpdir +// - node internal stack frames const basicTransform = transform( replaceWindowsLineEndings, replaceTrailingSpaces, - removeWindowsPathEscaping, replaceWindowsPaths, replaceNodeVersion, generalizeExeName, replaceWarningPid, + transformProjectRoot(), + transformTmpDir, + replaceInternalStackTrace, ); const defaultTransform = transform( basicTransform, - replaceStackTrace, - transformProjectRoot(), replaceTestDuration, - replaceTestLocationLine, ); const specTransform = transform( replaceSpecDuration, basicTransform, - replaceStackTrace, ); const junitTransform = transform( replaceJunitDuration, basicTransform, - replaceStackTrace, ); const lcovTransform = transform( basicTransform, - replaceStackTrace, - transformProjectRoot(), pickTestFileFromLcov, ); @@ -246,7 +296,6 @@ module.exports = { assertSnapshot, getSnapshotPath, replaceNodeVersion, - replaceStackTrace, replaceInternalStackTrace, replaceWindowsLineEndings, replaceWindowsPaths, diff --git a/test/common/sea.js b/test/common/sea.js index 2ba5de286fdddb..5f3741e0117cc5 100644 --- a/test/common/sea.js +++ b/test/common/sea.js @@ -94,7 +94,7 @@ function generateSEA(fixtureDir, options = {}) { } catch (e) { const message = `Cannot copy ${process.execPath} to ${outputFile}: ${inspect(e)}`; if (verifyWorkflow) { - throw new Error(message); + throw new Error(message, { cause: e }); } common.skip(message); } @@ -132,7 +132,7 @@ function generateSEA(fixtureDir, options = {}) { } catch (e) { const message = `Cannot inject ${seaPrepBlob} into ${outputFile}: ${inspect(e)}`; if (verifyWorkflow) { - throw new Error(message); + throw new Error(message, { cause: e }); } common.skip(message); } @@ -150,7 +150,7 @@ function signSEA(targetExecutable, verifyWorkflow = false) { } catch (e) { const message = `Cannot sign ${targetExecutable}: ${inspect(e)}`; if (verifyWorkflow) { - throw new Error(message); + throw new Error(message, { cause: e }); } common.skip(message); } @@ -161,7 +161,7 @@ function signSEA(targetExecutable, verifyWorkflow = false) { } catch (e) { const message = `Cannot find signtool: ${inspect(e)}`; if (verifyWorkflow) { - throw new Error(message); + throw new Error(message, { cause: e }); } common.skip(message); } @@ -172,7 +172,7 @@ function signSEA(targetExecutable, verifyWorkflow = false) { } catch (e) { const message = `Cannot sign ${targetExecutable}: ${inspect(e)}\n${stderr}`; if (verifyWorkflow) { - throw new Error(message); + throw new Error(message, { cause: e }); } common.skip(message); } diff --git a/test/common/v8-max-heap-size-option.js b/test/common/v8-max-heap-size-option.js new file mode 100644 index 00000000000000..4487b011a97cdf --- /dev/null +++ b/test/common/v8-max-heap-size-option.js @@ -0,0 +1,49 @@ +'use strict'; + +const assert = require('assert'); +const { spawnSync } = require('child_process'); +const path = require('path'); +const fs = require('fs'); +const tmpdir = require('./tmpdir'); + +const testScript = ` + const v8 = require('v8'); + const stats = v8.getHeapStatistics(); + const maxHeapSizeMB = Math.round(stats.heap_size_limit / 1024 / 1024); + console.log(maxHeapSizeMB); +`; + +tmpdir.refresh(); +const scriptPath = path.join(tmpdir.path, 'heap-limit-test.js'); +fs.writeFileSync(scriptPath, testScript); + +const child = spawnSync( + process.execPath, + [scriptPath], + { + encoding: 'utf8', + env: { + ...process.env, + NODE_OPTIONS: '--max-heap-size=750', + }, + }, +); + +assert.strictEqual( + child.status, + 0, + [ + `Child process did not exit cleanly.`, + ` Exit code: ${child.status}`, + child.stderr ? ` Stderr: ${child.stderr.toString()}` : '', + child.stdout ? ` Stdout: ${child.stdout.toString()}` : '', + ].filter(Boolean).join('\n'), +); +const output = child.stdout.trim(); +const heapLimit = Number(output); + +assert.strictEqual( + heapLimit, + 750, + `max heap size is ${heapLimit}MB, expected 750MB`, +); diff --git a/test/common/wpt.js b/test/common/wpt.js index 584f3c177ab0be..8a0e4bea2ec568 100644 --- a/test/common/wpt.js +++ b/test/common/wpt.js @@ -223,6 +223,7 @@ class ResourceLoader { return { ok: true, arrayBuffer() { return data.buffer; }, + bytes() { return new Uint8Array(data); }, json() { return JSON.parse(data.toString()); }, text() { return data.toString(); }, }; @@ -721,6 +722,7 @@ class WPTRunner { // Mark the whole test as failed in wpt.fyi report. reportResult?.finish('ERROR'); this.inProgress.delete(spec); + this.report?.write(); }); await events.once(worker, 'exit').catch(() => {}); @@ -787,6 +789,9 @@ class WPTRunner { } } + // Write the report on clean exit. The report is also written + // incrementally after each spec completes (see completionCallback) + // so that results survive if the process is killed. this.report?.write(); const ran = queue.length; @@ -873,6 +878,9 @@ class WPTRunner { reportResult?.finish(); } this.inProgress.delete(spec); + // Write report incrementally so results survive even if the process + // is killed before the exit handler runs. + this.report?.write(); // Always force termination of the worker. Some tests allocate resources // that would otherwise keep it alive. this.workers.get(spec).terminate(); diff --git a/test/doctool/test-doc-api-json.mjs b/test/doctool/test-doc-api-json.mjs index ffe50075c7bc71..0671436b3b50d0 100644 --- a/test/doctool/test-doc-api-json.mjs +++ b/test/doctool/test-doc-api-json.mjs @@ -159,5 +159,5 @@ for await (const dirent of await fs.opendir(new URL('../../out/doc/api/', import assert.partialDeepStrictEqual(allExpectedKeys, findAllKeys(json)); } -assert.strictEqual(numberOfDeprecatedSections, 41); // Increase this number every time a new API is deprecated. +assert.strictEqual(numberOfDeprecatedSections, 42); // Increase this number every time a new API is deprecated. assert.strictEqual(numberOfRemovedAPIs, 46); // Increase this number every time a section is marked as removed. diff --git a/test/doctool/test-stability-block-position.mjs b/test/doctool/test-stability-block-position.mjs new file mode 100644 index 00000000000000..d1bd509cd2bd93 --- /dev/null +++ b/test/doctool/test-stability-block-position.mjs @@ -0,0 +1,52 @@ +import '../common/index.mjs'; + +import fs from 'fs'; +import assert from 'assert'; + +import { + remarkParse, + unified, +} from '../../tools/doc/deps.mjs'; + +const ignore = ['deprecations.md', 'documentation.md']; + +const docURL = new URL('../../doc/api/', import.meta.url); +const docList = fs.readdirSync(docURL).filter((filename) => !ignore.includes(filename)); + +const re = /^Stability: \d/; + +for (const file of docList) { + const fileURL = new URL(file, docURL); + const tree = unified() + .use(remarkParse) + .parse(fs.readFileSync(fileURL)); + + // Traverse first-level nodes, ignoring comment blocks + const nodes = tree.children.filter((node) => node.type !== 'html'); + + for (let i = 0; i < nodes.length; i++) { + const { [i]: node, [i - 1]: previousNode } = nodes; + if (node.type !== 'blockquote' || !node.children.length) continue; + + const paragraph = node.children[0]; + if (paragraph.type !== 'paragraph' || !paragraph.children.length) continue; + + const text = paragraph.children[0]; + if (text.type !== 'text' || !re.exec(text.value)) continue; + + // Check that previous node type (excluding comment blocks) is one of: + // * 'heading' + // * 'paragraph' with a leading 'strong' node (pseudo-heading, eg. assert.equal) + try { + assert(previousNode.type === 'heading' || + (previousNode.type === 'paragraph' && previousNode.children[0]?.type === 'strong'), + 'Stability block must be the first content element under heading'); + } catch (error) { + const { line, column } = node.position.start; + error.stack = error.stack.split('\n') + .toSpliced(1, 0, ` at ${fileURL}:${line}:${column}`) + .join('\n'); + throw error; + } + } +} diff --git a/test/es-module/test-esm-detect-ambiguous.mjs b/test/es-module/test-esm-detect-ambiguous.mjs index 4b2544c42cfbae..170b1569382808 100644 --- a/test/es-module/test-esm-detect-ambiguous.mjs +++ b/test/es-module/test-esm-detect-ambiguous.mjs @@ -147,6 +147,7 @@ describe('Module syntax detection', { concurrency: !process.env.TEST_PARALLEL }, } it('should not hint wrong format in resolve hook', async () => { + // eslint-disable-next-line no-unassigned-vars let writeSync; const { stdout, stderr, code, signal } = await spawnPromisified(process.execPath, [ '--no-warnings', diff --git a/test/es-module/test-esm-wasm-source-phase-identity.mjs b/test/es-module/test-esm-wasm-source-phase-identity.mjs new file mode 100644 index 00000000000000..2d742dfcff61ab --- /dev/null +++ b/test/es-module/test-esm-wasm-source-phase-identity.mjs @@ -0,0 +1,11 @@ +// Regression test for source phase import identity with mixed eval/source +// phase imports of the same module in one parent. +import '../common/index.mjs'; +import { spawnSyncAndAssert } from '../common/child_process.js'; +import * as fixtures from '../common/fixtures.mjs'; + +spawnSyncAndAssert( + process.execPath, + ['--no-warnings', fixtures.path('es-modules/test-wasm-source-phase-identity.mjs')], + { stdout: '', stderr: '', trim: true } +); diff --git a/test/fixtures/console/console.snapshot b/test/fixtures/console/console.snapshot index 4f1cb254811b6d..b6106485af1612 100644 --- a/test/fixtures/console/console.snapshot +++ b/test/fixtures/console/console.snapshot @@ -1,9 +1,3 @@ Trace: foo - at * - at * - at * - at * - at * - at * - at * - at * + at Object.<anonymous> (<project-root>/test/fixtures/console/console.js:5:9) + at <node-internal-frames> diff --git a/test/fixtures/console/stack_overflow.snapshot b/test/fixtures/console/stack_overflow.snapshot index e7e499e308dcb2..2af0ca42092301 100644 --- a/test/fixtures/console/stack_overflow.snapshot +++ b/test/fixtures/console/stack_overflow.snapshot @@ -1,5 +1,5 @@ before -<project-root>/test/fixtures/console/stack_overflow.js:* +<project-root>/test/fixtures/console/stack_overflow.js:39 JSON.stringify(array); ^ diff --git a/test/fixtures/errors/async_error_nexttick_main.snapshot b/test/fixtures/errors/async_error_nexttick_main.snapshot index 5f1dbc0d86bea5..a52b5b31440cc5 100644 --- a/test/fixtures/errors/async_error_nexttick_main.snapshot +++ b/test/fixtures/errors/async_error_nexttick_main.snapshot @@ -1,7 +1,7 @@ Error: test at one (<project-root>/test/fixtures/async-error.js:4:9) at two (<project-root>/test/fixtures/async-error.js:17:9) - at process.processTicksAndRejections (node:internal/process/task_queues:104:5) + at <node-internal-frames> at async three (<project-root>/test/fixtures/async-error.js:20:3) at async four (<project-root>/test/fixtures/async-error.js:24:3) at async main (<project-root>/test/fixtures/errors/async_error_nexttick_main.js:7:5) diff --git a/test/fixtures/errors/core_line_numbers.snapshot b/test/fixtures/errors/core_line_numbers.snapshot index 04fab485252eeb..0a5fc4f8840e97 100644 --- a/test/fixtures/errors/core_line_numbers.snapshot +++ b/test/fixtures/errors/core_line_numbers.snapshot @@ -1,10 +1,9 @@ -node:punycode:54 +node:punycode:<line> throw new RangeError(errors[type]); ^ RangeError: Invalid input - at error (node:punycode:54:8) - at Object.decode (node:punycode:247:5) + at <node-internal-frames> at Object.<anonymous> (<project-root>/test/fixtures/errors/core_line_numbers.js:13:10) Node.js <node-version> diff --git a/test/fixtures/errors/error_aggregateTwoErrors.snapshot b/test/fixtures/errors/error_aggregateTwoErrors.snapshot index ab0cafa534db5f..b87c639830cf91 100644 --- a/test/fixtures/errors/error_aggregateTwoErrors.snapshot +++ b/test/fixtures/errors/error_aggregateTwoErrors.snapshot @@ -1,17 +1,17 @@ -<project-root>/test/fixtures/errors/error_aggregateTwoErrors.js:* +<project-root>/test/fixtures/errors/error_aggregateTwoErrors.js:15 throw aggregateTwoErrors(err, originalError); ^ AggregateError: original - at Object.<anonymous> (<project-root>/test/fixtures/errors/error_aggregateTwoErrors.js:*:*) { + at Object.<anonymous> (<project-root>/test/fixtures/errors/error_aggregateTwoErrors.js:15:7) { code: 'ERR0', [errors]: [ Error: original - at Object.<anonymous> (<project-root>/test/fixtures/errors/error_aggregateTwoErrors.js:*:*) { + at Object.<anonymous> (<project-root>/test/fixtures/errors/error_aggregateTwoErrors.js:9:23) { code: 'ERR0' }, Error: second error - at Object.<anonymous> (<project-root>/test/fixtures/errors/error_aggregateTwoErrors.js:*:*) { + at Object.<anonymous> (<project-root>/test/fixtures/errors/error_aggregateTwoErrors.js:10:13) { code: 'ERR1' } ] diff --git a/test/fixtures/errors/error_exit.snapshot b/test/fixtures/errors/error_exit.snapshot index 0c046965647bb8..23df3a59245f54 100644 --- a/test/fixtures/errors/error_exit.snapshot +++ b/test/fixtures/errors/error_exit.snapshot @@ -1,5 +1,5 @@ Exiting with code=1 -node:assert:* +node:assert:<line> throw new AssertionError(obj); ^ @@ -7,7 +7,7 @@ AssertionError [ERR_ASSERTION]: Expected values to be strictly equal: 1 !== 2 - at Object.<anonymous> (<project-root>/test/fixtures/errors/error_exit.js:*:*) { + at Object.<anonymous> (<project-root>/test/fixtures/errors/error_exit.js:32:8) { generatedMessage: true, code: 'ERR_ASSERTION', actual: 1, diff --git a/test/fixtures/errors/error_with_nul.snapshot b/test/fixtures/errors/error_with_nul.snapshot index b60c03fe89cb74..877fb8fa042e72 100644 Binary files a/test/fixtures/errors/error_with_nul.snapshot and b/test/fixtures/errors/error_with_nul.snapshot differ diff --git a/test/fixtures/errors/events_unhandled_error_common_trace.snapshot b/test/fixtures/errors/events_unhandled_error_common_trace.snapshot index 37b3e3b7785874..5c4a3c02d33825 100644 --- a/test/fixtures/errors/events_unhandled_error_common_trace.snapshot +++ b/test/fixtures/errors/events_unhandled_error_common_trace.snapshot @@ -1,12 +1,12 @@ -node:events:* +node:events:<line> throw er; // Unhandled 'error' event ^ Error: foo:bar - at bar (<project-root>/test/fixtures/errors/events_unhandled_error_common_trace.js:*:*) - at foo (<project-root>/test/fixtures/errors/events_unhandled_error_common_trace.js:*:*) + at bar (<project-root>/test/fixtures/errors/events_unhandled_error_common_trace.js:9:12) + at foo (<project-root>/test/fixtures/errors/events_unhandled_error_common_trace.js:12:10) Emitted 'error' event at: - at quux (<project-root>/test/fixtures/errors/events_unhandled_error_common_trace.js:*:*) - at Object.<anonymous> (<project-root>/test/fixtures/errors/events_unhandled_error_common_trace.js:*:*) + at quux (<project-root>/test/fixtures/errors/events_unhandled_error_common_trace.js:19:6) + at Object.<anonymous> (<project-root>/test/fixtures/errors/events_unhandled_error_common_trace.js:22:1) Node.js <node-version> diff --git a/test/fixtures/errors/events_unhandled_error_nexttick.snapshot b/test/fixtures/errors/events_unhandled_error_nexttick.snapshot index df8940bf9f7721..e789ecab2ab047 100644 --- a/test/fixtures/errors/events_unhandled_error_nexttick.snapshot +++ b/test/fixtures/errors/events_unhandled_error_nexttick.snapshot @@ -1,10 +1,10 @@ -node:events:* +node:events:<line> throw er; // Unhandled 'error' event ^ Error - at Object.<anonymous> (<project-root>/test/fixtures/errors/events_unhandled_error_nexttick.js:*:*) + at Object.<anonymous> (<project-root>/test/fixtures/errors/events_unhandled_error_nexttick.js:6:12) Emitted 'error' event at: - at <project-root>/test/fixtures/errors/events_unhandled_error_nexttick.js:*:* + at <project-root>/test/fixtures/errors/events_unhandled_error_nexttick.js:8:22 Node.js <node-version> diff --git a/test/fixtures/errors/events_unhandled_error_sameline.snapshot b/test/fixtures/errors/events_unhandled_error_sameline.snapshot index 700a7ace09c9d0..15e44b748edaff 100644 --- a/test/fixtures/errors/events_unhandled_error_sameline.snapshot +++ b/test/fixtures/errors/events_unhandled_error_sameline.snapshot @@ -1,10 +1,10 @@ -node:events:* +node:events:<line> throw er; // Unhandled 'error' event ^ Error - at Object.<anonymous> (<project-root>/test/fixtures/errors/events_unhandled_error_sameline.js:*:*) + at Object.<anonymous> (<project-root>/test/fixtures/errors/events_unhandled_error_sameline.js:6:34) Emitted 'error' event at: - at Object.<anonymous> (<project-root>/test/fixtures/errors/events_unhandled_error_sameline.js:*:*) + at Object.<anonymous> (<project-root>/test/fixtures/errors/events_unhandled_error_sameline.js:6:20) Node.js <node-version> diff --git a/test/fixtures/errors/events_unhandled_error_subclass.snapshot b/test/fixtures/errors/events_unhandled_error_subclass.snapshot index a1c2c0485aa4fc..1584badd956515 100644 --- a/test/fixtures/errors/events_unhandled_error_subclass.snapshot +++ b/test/fixtures/errors/events_unhandled_error_subclass.snapshot @@ -1,10 +1,10 @@ -node:events:* +node:events:<line> throw er; // Unhandled 'error' event ^ Error - at Object.<anonymous> (<project-root>/test/fixtures/errors/events_unhandled_error_subclass.js:*:*) + at Object.<anonymous> (<project-root>/test/fixtures/errors/events_unhandled_error_subclass.js:7:25) Emitted 'error' event on Foo instance at: - at Object.<anonymous> (<project-root>/test/fixtures/errors/events_unhandled_error_subclass.js:*:*) + at Object.<anonymous> (<project-root>/test/fixtures/errors/events_unhandled_error_subclass.js:7:11) Node.js <node-version> diff --git a/test/fixtures/errors/force_colors.snapshot b/test/fixtures/errors/force_colors.snapshot index dd673d0bf9660f..5503072ab10f74 100644 --- a/test/fixtures/errors/force_colors.snapshot +++ b/test/fixtures/errors/force_colors.snapshot @@ -4,12 +4,6 @@ throw new Error('Should include grayed stack trace'); Error: Should include grayed stack trace at Object.<anonymous> (<project-root>/test/fixtures/errors/force_colors.js:2:7) - at * - at * - at * - at * - at * - at * - at * + at <node-internal-frames> Node.js <node-version> diff --git a/test/fixtures/errors/if-error-has-good-stack.snapshot b/test/fixtures/errors/if-error-has-good-stack.snapshot index 923e687c071315..91b7605d8f0ff4 100644 --- a/test/fixtures/errors/if-error-has-good-stack.snapshot +++ b/test/fixtures/errors/if-error-has-good-stack.snapshot @@ -1,23 +1,23 @@ -node:assert:* +node:assert:<line> throw newErr; ^ AssertionError [ERR_ASSERTION]: ifError got unwanted exception: test error - at z (<project-root>/test/fixtures/errors/if-error-has-good-stack.js:*:*) - at y (<project-root>/test/fixtures/errors/if-error-has-good-stack.js:*:*) - at x (<project-root>/test/fixtures/errors/if-error-has-good-stack.js:*:*) - at Object.<anonymous> (<project-root>/test/fixtures/errors/if-error-has-good-stack.js:*:*) - at c (<project-root>/test/fixtures/errors/if-error-has-good-stack.js:*:*) - at b (<project-root>/test/fixtures/errors/if-error-has-good-stack.js:*:*) - at a (<project-root>/test/fixtures/errors/if-error-has-good-stack.js:*:*) - at Object.<anonymous> (<project-root>/test/fixtures/errors/if-error-has-good-stack.js:*:*) { + at z (<project-root>/test/fixtures/errors/if-error-has-good-stack.js:21:14) + at y (<project-root>/test/fixtures/errors/if-error-has-good-stack.js:22:7) + at x (<project-root>/test/fixtures/errors/if-error-has-good-stack.js:23:5) + at Object.<anonymous> (<project-root>/test/fixtures/errors/if-error-has-good-stack.js:24:3) + at c (<project-root>/test/fixtures/errors/if-error-has-good-stack.js:13:13) + at b (<project-root>/test/fixtures/errors/if-error-has-good-stack.js:14:7) + at a (<project-root>/test/fixtures/errors/if-error-has-good-stack.js:15:5) + at Object.<anonymous> (<project-root>/test/fixtures/errors/if-error-has-good-stack.js:16:3) { generatedMessage: false, code: 'ERR_ASSERTION', actual: Error: test error - at c (<project-root>/test/fixtures/errors/if-error-has-good-stack.js:*:*) - at b (<project-root>/test/fixtures/errors/if-error-has-good-stack.js:*:*) - at a (<project-root>/test/fixtures/errors/if-error-has-good-stack.js:*:*) - at Object.<anonymous> (<project-root>/test/fixtures/errors/if-error-has-good-stack.js:*:*), + at c (<project-root>/test/fixtures/errors/if-error-has-good-stack.js:13:13) + at b (<project-root>/test/fixtures/errors/if-error-has-good-stack.js:14:7) + at a (<project-root>/test/fixtures/errors/if-error-has-good-stack.js:15:5) + at Object.<anonymous> (<project-root>/test/fixtures/errors/if-error-has-good-stack.js:16:3), expected: null, operator: 'ifError', diff: 'simple' diff --git a/test/fixtures/errors/promise_always_throw_unhandled.snapshot b/test/fixtures/errors/promise_always_throw_unhandled.snapshot index bd4fe396d898e8..6ced213b1b4db9 100644 --- a/test/fixtures/errors/promise_always_throw_unhandled.snapshot +++ b/test/fixtures/errors/promise_always_throw_unhandled.snapshot @@ -1,17 +1,11 @@ -<project-root>/test/fixtures/errors/promise_always_throw_unhandled.js:* +<project-root>/test/fixtures/errors/promise_always_throw_unhandled.js:10 throw new Error('One'); ^ Error: One - at * + at <project-root>/test/fixtures/errors/promise_always_throw_unhandled.js:10:9 at new Promise (<anonymous>) - at * - at * - at * - at * - at * - at * - at * - at * + at Object.<anonymous> (<project-root>/test/fixtures/errors/promise_always_throw_unhandled.js:9:14) + at <node-internal-frames> Node.js <node-version> diff --git a/test/fixtures/errors/promise_unhandled_warn_with_error.snapshot b/test/fixtures/errors/promise_unhandled_warn_with_error.snapshot index 8a260ab7dfb098..a2a4cb644b586b 100644 --- a/test/fixtures/errors/promise_unhandled_warn_with_error.snapshot +++ b/test/fixtures/errors/promise_unhandled_warn_with_error.snapshot @@ -1,11 +1,5 @@ (node:<pid>) UnhandledPromiseRejectionWarning: Error: alas - at * - at * - at * - at * - at * - at * - at * - at * + at Object.<anonymous> (<project-root>/test/fixtures/errors/promise_unhandled_warn_with_error.js:7:16) + at <node-internal-frames> (Use `<node-exe> --trace-warnings ...` to show where the warning was created) (node:<pid>) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1) diff --git a/test/fixtures/errors/throw_custom_error.snapshot b/test/fixtures/errors/throw_custom_error.snapshot index efaf2d6f8aed27..22d5a9de733650 100644 --- a/test/fixtures/errors/throw_custom_error.snapshot +++ b/test/fixtures/errors/throw_custom_error.snapshot @@ -1,5 +1,5 @@ -<project-root>/test/fixtures/errors/throw_custom_error.js:* +<project-root>/test/fixtures/errors/throw_custom_error.js:27 throw ({ name: 'MyCustomError', message: 'This is a custom message' }); ^ { name: 'MyCustomError', message: 'This is a custom message' } diff --git a/test/fixtures/errors/throw_error_with_getter_throw.snapshot b/test/fixtures/errors/throw_error_with_getter_throw.snapshot index 5c4281c4769b66..9212c17f6cd574 100644 --- a/test/fixtures/errors/throw_error_with_getter_throw.snapshot +++ b/test/fixtures/errors/throw_error_with_getter_throw.snapshot @@ -1,5 +1,5 @@ -<project-root>/test/fixtures/errors/throw_error_with_getter_throw.js:* +<project-root>/test/fixtures/errors/throw_error_with_getter_throw.js:3 throw { // eslint-disable-line no-throw-literal ^ [object Object] diff --git a/test/fixtures/errors/throw_in_eval_anonymous.snapshot b/test/fixtures/errors/throw_in_eval_anonymous.snapshot index 47305671b1bc71..607e7f81d2cd9b 100644 --- a/test/fixtures/errors/throw_in_eval_anonymous.snapshot +++ b/test/fixtures/errors/throw_in_eval_anonymous.snapshot @@ -1,8 +1,8 @@ -<anonymous_script>:* +<anonymous_script>:3 throw new Error('error in anonymous script'); ^ Error: error in anonymous script - at eval (eval at <anonymous> (<project-root>/test/fixtures/errors/throw_in_eval_anonymous.js:*:*), <anonymous>:*:*) + at eval (eval at <anonymous> (<project-root>/test/fixtures/errors/throw_in_eval_anonymous.js:5:1), <anonymous>:3:9) Node.js <node-version> diff --git a/test/fixtures/errors/throw_in_eval_named.snapshot b/test/fixtures/errors/throw_in_eval_named.snapshot index 4677dd195ab38c..cfe6295f36da31 100644 --- a/test/fixtures/errors/throw_in_eval_named.snapshot +++ b/test/fixtures/errors/throw_in_eval_named.snapshot @@ -1,8 +1,8 @@ -evalscript.js:* +evalscript.js:3 throw new Error('error in named script'); ^ Error: error in named script - at eval (evalscript.js:*:*) + at eval (evalscript.js:3:9) Node.js <node-version> diff --git a/test/fixtures/errors/throw_in_line_with_tabs.snapshot b/test/fixtures/errors/throw_in_line_with_tabs.snapshot index b5cb8e99cd3130..24dac9786edb8a 100644 --- a/test/fixtures/errors/throw_in_line_with_tabs.snapshot +++ b/test/fixtures/errors/throw_in_line_with_tabs.snapshot @@ -1,6 +1,6 @@ before -<project-root>/test/fixtures/errors/throw_in_line_with_tabs.js:* +<project-root>/test/fixtures/errors/throw_in_line_with_tabs.js:31 throw ({ foo: 'bar' }); ^ { foo: 'bar' } diff --git a/test/fixtures/errors/throw_non_error.snapshot b/test/fixtures/errors/throw_non_error.snapshot index 55f213290b8a85..4da670f95c64f6 100644 --- a/test/fixtures/errors/throw_non_error.snapshot +++ b/test/fixtures/errors/throw_non_error.snapshot @@ -1,5 +1,5 @@ -<project-root>/test/fixtures/errors/throw_non_error.js:* +<project-root>/test/fixtures/errors/throw_non_error.js:27 throw ({ foo: 'bar' }); ^ { foo: 'bar' } diff --git a/test/fixtures/errors/throw_null.snapshot b/test/fixtures/errors/throw_null.snapshot index dd535b524ff061..d0a5b499789e1d 100644 --- a/test/fixtures/errors/throw_null.snapshot +++ b/test/fixtures/errors/throw_null.snapshot @@ -1,5 +1,5 @@ -<project-root>/test/fixtures/errors/throw_null.js:* +<project-root>/test/fixtures/errors/throw_null.js:26 throw null; ^ null diff --git a/test/fixtures/errors/throw_undefined.snapshot b/test/fixtures/errors/throw_undefined.snapshot index f1b12ae7563a87..71e329e69d6d89 100644 --- a/test/fixtures/errors/throw_undefined.snapshot +++ b/test/fixtures/errors/throw_undefined.snapshot @@ -1,5 +1,5 @@ -<project-root>/test/fixtures/errors/throw_undefined.js:* +<project-root>/test/fixtures/errors/throw_undefined.js:26 throw undefined; ^ undefined diff --git a/test/fixtures/errors/timeout_throw.snapshot b/test/fixtures/errors/timeout_throw.snapshot index 5ad384ab43f329..e823593a6a80a8 100644 --- a/test/fixtures/errors/timeout_throw.snapshot +++ b/test/fixtures/errors/timeout_throw.snapshot @@ -1,10 +1,9 @@ -<project-root>/test/fixtures/errors/timeout_throw.js:* +<project-root>/test/fixtures/errors/timeout_throw.js:27 undefined_reference_error_maker; ^ ReferenceError: undefined_reference_error_maker is not defined - at Timeout._onTimeout (<project-root>/test/fixtures/errors/timeout_throw.js:*:*) - at listOnTimeout (node:internal/timers:*:*) - at process.processTimers (node:internal/timers:*:*) + at Timeout._onTimeout (<project-root>/test/fixtures/errors/timeout_throw.js:27:3) + at <node-internal-frames> Node.js <node-version> diff --git a/test/fixtures/errors/undefined_reference_in_new_context.snapshot b/test/fixtures/errors/undefined_reference_in_new_context.snapshot index 50b6f8e7f329ff..c8b240a94e36f9 100644 --- a/test/fixtures/errors/undefined_reference_in_new_context.snapshot +++ b/test/fixtures/errors/undefined_reference_in_new_context.snapshot @@ -1,13 +1,11 @@ before -evalmachine.<anonymous>:* +evalmachine.<anonymous>:1 Error.stackTraceLimit = 5; foo.bar = 5; ^ ReferenceError: foo is not defined - at evalmachine.<anonymous>:*:* - at Script.runInContext (node:vm:*:*) - at Script.runInNewContext (node:vm:*:*) - at Object.runInNewContext (node:vm:*:*) - at Object.<anonymous> (<project-root>/test/fixtures/errors/undefined_reference_in_new_context.js:*:*) + at evalmachine.<anonymous>:1:28 + at <node-internal-frames> + at Object.<anonymous> (<project-root>/test/fixtures/errors/undefined_reference_in_new_context.js:29:4) Node.js <node-version> diff --git a/test/fixtures/errors/unhandled_promise_trace_warnings.snapshot b/test/fixtures/errors/unhandled_promise_trace_warnings.snapshot index b0af9d31a97b48..d434f6d3f13276 100644 --- a/test/fixtures/errors/unhandled_promise_trace_warnings.snapshot +++ b/test/fixtures/errors/unhandled_promise_trace_warnings.snapshot @@ -1,29 +1,12 @@ (node:<pid>) UnhandledPromiseRejectionWarning: Error: This was rejected - at * - at * - at * - at * - at * - at * - at * - at * - at * - at * - at * - at * + at Object.<anonymous> (<project-root>/test/fixtures/errors/unhandled_promise_trace_warnings.js:4:26) + at <node-internal-frames> (node:<pid>) Error: This was rejected - at * - at * - at * - at * - at * - at * - at * - at * + at Object.<anonymous> (<project-root>/test/fixtures/errors/unhandled_promise_trace_warnings.js:4:26) + at <node-internal-frames> (node:<pid>) PromiseRejectionHandledWarning: Promise rejection was handled asynchronously (rejection id: 1) - at * - at * + at <node-internal-frames> at Promise.then (<anonymous>) at Promise.catch (<anonymous>) - at * - at * + at Immediate.<anonymous> (<project-root>/test/fixtures/errors/unhandled_promise_trace_warnings.js:5:27) + at <node-internal-frames> diff --git a/test/fixtures/es-modules/js-string-builtins.wasm b/test/fixtures/es-modules/js-string-builtins.wasm index b4c08587dd08e7..fe520bab1fbbf5 100644 Binary files a/test/fixtures/es-modules/js-string-builtins.wasm and b/test/fixtures/es-modules/js-string-builtins.wasm differ diff --git a/test/fixtures/es-modules/js-string-builtins.wat b/test/fixtures/es-modules/js-string-builtins.wat index 9bc55a8fa750cc..08f4ade8c4151c 100644 --- a/test/fixtures/es-modules/js-string-builtins.wat +++ b/test/fixtures/es-modules/js-string-builtins.wat @@ -4,11 +4,15 @@ (import "wasm:js-string" "length" (func $string_length (param externref) (result i32))) (import "wasm:js-string" "concat" (func $string_concat (param externref externref) (result (ref extern)))) (import "wasm:js-string" "equals" (func $string_equals (param externref externref) (result i32))) + + ;; Import a string constant via importedStringConstants + (import "wasm:js/string-constants" "hello" (global $hello externref)) ;; Export functions that use the builtins (export "getLength" (func $get_length)) (export "concatStrings" (func $concat_strings)) (export "compareStrings" (func $compare_strings)) + (export "getHello" (func $get_hello)) (func $get_length (param $str externref) (result i32) local.get $str @@ -26,4 +30,8 @@ local.get $str2 call $string_equals ) + + (func $get_hello (result externref) + global.get $hello + ) ) \ No newline at end of file diff --git a/test/fixtures/es-modules/test-wasm-js-string-builtins.mjs b/test/fixtures/es-modules/test-wasm-js-string-builtins.mjs index 2364f246b2558d..c76dcc39894932 100644 --- a/test/fixtures/es-modules/test-wasm-js-string-builtins.mjs +++ b/test/fixtures/es-modules/test-wasm-js-string-builtins.mjs @@ -6,3 +6,4 @@ strictEqual(wasmExports.getLength('hello'), 5); strictEqual(wasmExports.concatStrings('hello', ' world'), 'hello world'); strictEqual(wasmExports.compareStrings('test', 'test'), 1); strictEqual(wasmExports.compareStrings('test', 'different'), 0); +strictEqual(wasmExports.getHello(), 'hello'); diff --git a/test/fixtures/es-modules/test-wasm-source-phase-identity-parent.mjs b/test/fixtures/es-modules/test-wasm-source-phase-identity-parent.mjs new file mode 100644 index 00000000000000..36d5765c17f0ad --- /dev/null +++ b/test/fixtures/es-modules/test-wasm-source-phase-identity-parent.mjs @@ -0,0 +1,6 @@ +import * as mod1 from './simple.wasm'; +import * as mod2 from './simple.wasm'; +import source mod3 from './simple.wasm'; +import source mod4 from './simple.wasm'; + +export { mod1, mod2, mod3, mod4 }; diff --git a/test/fixtures/es-modules/test-wasm-source-phase-identity.mjs b/test/fixtures/es-modules/test-wasm-source-phase-identity.mjs new file mode 100644 index 00000000000000..84cf6261139038 --- /dev/null +++ b/test/fixtures/es-modules/test-wasm-source-phase-identity.mjs @@ -0,0 +1,14 @@ +import { strictEqual } from 'node:assert'; + +// Pre-load simple.wasm at kSourcePhase to prime the loadCache. +const preloaded = await import.source('./simple.wasm'); +strictEqual(preloaded instanceof WebAssembly.Module, true); + +// Import a parent that has both eval-phase and source-phase imports of the +// same wasm file, which triggers ensurePhase(kEvaluationPhase) on the cached +// job and exposes the loadCache eviction bug. +const { mod1, mod2, mod3, mod4 } = + await import('./test-wasm-source-phase-identity-parent.mjs'); + +strictEqual(mod1, mod2, 'two eval-phase imports of the same wasm must be identical'); +strictEqual(mod3, mod4, 'two source-phase imports of the same wasm must be identical'); diff --git a/test/fixtures/eval/eval_messages.snapshot b/test/fixtures/eval/eval_messages.snapshot index 615a05089449a1..900569324f65fd 100644 --- a/test/fixtures/eval/eval_messages.snapshot +++ b/test/fixtures/eval/eval_messages.snapshot @@ -5,10 +5,7 @@ with(this){__filename} The 'with' statement is not supported. All symbols in a 'with' block will have type 'any'. SyntaxError: Strict mode code may not include a with statement - - - - + at <node-internal-frames> Node.js <node-version> 42 @@ -18,14 +15,10 @@ throw new Error("hello") ^ Error: hello - - - - - - - - + at [eval]:1:7 + at <node-internal-frames> + at [eval]-wrapper:6:24 + at <node-internal-frames> Node.js <node-version> [eval]:1 @@ -33,14 +26,10 @@ throw new Error("hello") ^ Error: hello - - - - - - - - + at [eval]:1:7 + at <node-internal-frames> + at [eval]-wrapper:6:24 + at <node-internal-frames> Node.js <node-version> 100 @@ -49,14 +38,10 @@ var x = 100; y = x; ^ ReferenceError: y is not defined - - - - - - - - + at [eval]:1:16 + at <node-internal-frames> + at [eval]-wrapper:6:24 + at <node-internal-frames> Node.js <node-version> diff --git a/test/fixtures/eval/eval_typescript.snapshot b/test/fixtures/eval/eval_typescript.snapshot index 49c034895ed92d..7d57ab541cd184 100644 --- a/test/fixtures/eval/eval_typescript.snapshot +++ b/test/fixtures/eval/eval_typescript.snapshot @@ -4,10 +4,7 @@ enum Foo{}; TypeScript enum is not supported in strip-only mode SyntaxError: Unexpected reserved word - - - - + at <node-internal-frames> Node.js <node-version> [eval]:1 @@ -15,14 +12,10 @@ throw new SyntaxError("hello") ^ SyntaxError: hello - - - - - - - - + at [eval]:1:7 + at <node-internal-frames> + at [eval]-wrapper:6:24 + at <node-internal-frames> Node.js <node-version> [eval]:1 @@ -31,10 +24,7 @@ const foo; 'const' declarations must be initialized SyntaxError: Missing initializer in const declaration - - - - + at <node-internal-frames> Node.js <node-version> 100 @@ -46,10 +36,7 @@ interface Foo{};const foo; 'const' declarations must be initialized SyntaxError: Unexpected identifier 'Foo' - - - - + at <node-internal-frames> Node.js <node-version> [eval]:1 @@ -58,9 +45,6 @@ function foo(){ await Promise.resolve(1)}; await isn't allowed in non-async function SyntaxError: await is only valid in async functions and the top level bodies of modules - - - - + at <node-internal-frames> Node.js <node-version> diff --git a/test/fixtures/eval/stdin_messages.snapshot b/test/fixtures/eval/stdin_messages.snapshot index 9710f6871583c4..fff0d2e9fcc926 100644 --- a/test/fixtures/eval/stdin_messages.snapshot +++ b/test/fixtures/eval/stdin_messages.snapshot @@ -5,14 +5,7 @@ with(this){__filename} The 'with' statement is not supported. All symbols in a 'with' block will have type 'any'. SyntaxError: Strict mode code may not include a with statement - - - - - - - - + at <node-internal-frames> Node.js <node-version> 42 @@ -22,16 +15,10 @@ throw new Error("hello") ^ Error: hello - - - - - - - - - - + at [stdin]:1:7 + at <node-internal-frames> + at [stdin]-wrapper:6:24 + at <node-internal-frames> Node.js <node-version> [stdin]:1 @@ -39,16 +26,10 @@ throw new Error("hello") ^ Error: hello - - - - - - - - - - + at [stdin]:1:7 + at <node-internal-frames> + at [stdin]-wrapper:6:24 + at <node-internal-frames> Node.js <node-version> 100 @@ -57,16 +38,10 @@ let x = 100; y = x; ^ ReferenceError: y is not defined - - - - - - - - - - + at [stdin]:1:16 + at <node-internal-frames> + at [stdin]-wrapper:6:24 + at <node-internal-frames> Node.js <node-version> diff --git a/test/fixtures/eval/stdin_typescript.snapshot b/test/fixtures/eval/stdin_typescript.snapshot index 7bf7fbaa3bfb97..73d9f714b6aaef 100644 --- a/test/fixtures/eval/stdin_typescript.snapshot +++ b/test/fixtures/eval/stdin_typescript.snapshot @@ -4,14 +4,7 @@ enum Foo{}; TypeScript enum is not supported in strip-only mode SyntaxError: Unexpected reserved word - - - - - - - - + at <node-internal-frames> Node.js <node-version> [stdin]:1 @@ -20,14 +13,7 @@ enum Foo{}; TypeScript enum is not supported in strip-only mode SyntaxError: Unexpected reserved word - - - - - - - - + at <node-internal-frames> Node.js <node-version> [stdin]:1 @@ -35,16 +21,10 @@ throw new SyntaxError("hello") ^ SyntaxError: hello - - - - - - - - - - + at [stdin]:1:7 + at <node-internal-frames> + at [stdin]-wrapper:6:24 + at <node-internal-frames> Node.js <node-version> [stdin]:1 @@ -52,16 +32,10 @@ throw new SyntaxError("hello") ^ SyntaxError: hello - - - - - - - - - - + at [stdin]:1:7 + at <node-internal-frames> + at [stdin]-wrapper:6:24 + at <node-internal-frames> Node.js <node-version> [stdin]:1 @@ -70,14 +44,7 @@ const foo; 'const' declarations must be initialized SyntaxError: Missing initializer in const declaration - - - - - - - - + at <node-internal-frames> Node.js <node-version> [stdin]:1 @@ -86,14 +53,7 @@ const foo; 'const' declarations must be initialized SyntaxError: Missing initializer in const declaration - - - - - - - - + at <node-internal-frames> Node.js <node-version> 100 @@ -108,14 +68,7 @@ interface Foo{};const foo; 'const' declarations must be initialized SyntaxError: Unexpected identifier 'Foo' - - - - - - - - + at <node-internal-frames> Node.js <node-version> [stdin]:1 @@ -124,14 +77,7 @@ interface Foo{};const foo; 'const' declarations must be initialized SyntaxError: Unexpected strict mode reserved word - - - - - - - - + at <node-internal-frames> Node.js <node-version> [stdin]:1 @@ -140,14 +86,7 @@ function foo(){ await Promise.resolve(1)}; await isn't allowed in non-async function SyntaxError: await is only valid in async functions and the top level bodies of modules - - - - - - - - + at <node-internal-frames> Node.js <node-version> [stdin]:1 @@ -156,14 +95,7 @@ function foo(){ await Promise.resolve(1)}; await isn't allowed in non-async function SyntaxError: await is only valid in async functions and the top level bodies of modules - - - - - - - - + at <node-internal-frames> Node.js <node-version> done diff --git a/test/fixtures/module-hooks/require-resolve-caller.js b/test/fixtures/module-hooks/require-resolve-caller.js new file mode 100644 index 00000000000000..94736e42d748c4 --- /dev/null +++ b/test/fixtures/module-hooks/require-resolve-caller.js @@ -0,0 +1,4 @@ +// Fixture CJS file that calls require.resolve and exports the result. +'use strict'; +const resolved = require.resolve('test-require-resolve-hook-target'); +module.exports = { resolved }; diff --git a/test/fixtures/module-hooks/require-resolve-paths-caller.js b/test/fixtures/module-hooks/require-resolve-paths-caller.js new file mode 100644 index 00000000000000..f18b1f37773507 --- /dev/null +++ b/test/fixtures/module-hooks/require-resolve-paths-caller.js @@ -0,0 +1,13 @@ +// Fixture CJS file that calls require.resolve with the paths option. +'use strict'; +const path = require('path'); +const fixturesDir = path.resolve(__dirname, '..', '..'); +const nodeModules = path.join(fixturesDir, 'node_modules'); + +// Use the paths option to resolve 'bar' from the fixtures node_modules. +const resolved = require.resolve('bar', { paths: [fixturesDir] }); +const expected = path.join(nodeModules, 'bar.js'); +if (resolved !== expected) { + throw new Error(`Expected ${expected}, got ${resolved}`); +} +module.exports = { resolved }; diff --git a/test/fixtures/source-map/output/source_map_assert_source_line.snapshot b/test/fixtures/source-map/output/source_map_assert_source_line.snapshot index d20e19d9fe3870..3bc9661920fd59 100644 --- a/test/fixtures/source-map/output/source_map_assert_source_line.snapshot +++ b/test/fixtures/source-map/output/source_map_assert_source_line.snapshot @@ -3,13 +3,8 @@ AssertionError [ERR_ASSERTION]: The expression evaluated to a falsy value: assert(false) at Object.<anonymous> (<project-root>/test/fixtures/source-map/output/source_map_assert_source_line.ts:11:3) - * - * - * - * - * - * - * + at <node-internal-frames> + at <node-internal-frames> { generatedMessage: true, code: 'ERR_ASSERTION', actual: false, diff --git a/test/fixtures/source-map/output/source_map_sourcemapping_url_string.snapshot b/test/fixtures/source-map/output/source_map_sourcemapping_url_string.snapshot index 8ebf9af22e9d09..148d1b8190dd08 100644 --- a/test/fixtures/source-map/output/source_map_sourcemapping_url_string.snapshot +++ b/test/fixtures/source-map/output/source_map_sourcemapping_url_string.snapshot @@ -1,3 +1,3 @@ Error: an exception. at Object.<anonymous> (<project-root>/test/fixtures/source-map/typescript-sourcemapping_url_string.ts:3:7) - * + at <node-internal-frames> diff --git a/test/fixtures/source-map/output/source_map_throw_construct.snapshot b/test/fixtures/source-map/output/source_map_throw_construct.snapshot index 43718adba6a306..824a374747d0b5 100644 --- a/test/fixtures/source-map/output/source_map_throw_construct.snapshot +++ b/test/fixtures/source-map/output/source_map_throw_construct.snapshot @@ -5,8 +5,6 @@ Error: message at new Foo (<project-root>/test/fixtures/source-map/output/source_map_throw_construct.mts:13:11) at <anonymous> (<project-root>/test/fixtures/source-map/output/source_map_throw_construct.mts:17:1) - * - * - * + at <node-internal-frames> Node.js <node-version> diff --git a/test/fixtures/source-map/output/source_map_throw_set_immediate.snapshot b/test/fixtures/source-map/output/source_map_throw_set_immediate.snapshot index 999258182a6152..461fb3b034ef88 100644 --- a/test/fixtures/source-map/output/source_map_throw_set_immediate.snapshot +++ b/test/fixtures/source-map/output/source_map_throw_set_immediate.snapshot @@ -5,6 +5,6 @@ Error: goodbye at Hello (<project-root>/test/fixtures/source-map/uglify-throw-original.js:5:9) at Immediate.<anonymous> (<project-root>/test/fixtures/source-map/uglify-throw-original.js:9:3) - * + at <node-internal-frames> Node.js <node-version> diff --git a/test/fixtures/test-runner/coverage-with-mock/dependency.cjs b/test/fixtures/test-runner/coverage-with-mock/dependency.cjs new file mode 100644 index 00000000000000..fa305d24a3f3c1 --- /dev/null +++ b/test/fixtures/test-runner/coverage-with-mock/dependency.cjs @@ -0,0 +1,9 @@ +throw new Error('This should never be called'); + +exports.dependency = function dependency() { + return 'foo'; +} + +exports.unused = function unused() { + return 'bar'; +} diff --git a/test/fixtures/test-runner/coverage-with-mock/subject.mjs b/test/fixtures/test-runner/coverage-with-mock/subject.mjs new file mode 100644 index 00000000000000..ae63dd386c4998 --- /dev/null +++ b/test/fixtures/test-runner/coverage-with-mock/subject.mjs @@ -0,0 +1,5 @@ +import { dependency } from './dependency.cjs'; + +export function subject() { + return dependency(); +} diff --git a/test/fixtures/test-runner/describe_error.js b/test/fixtures/test-runner/describe_error.js new file mode 100644 index 00000000000000..04e9d1faa042d1 --- /dev/null +++ b/test/fixtures/test-runner/describe_error.js @@ -0,0 +1,10 @@ +'use strict'; +const { describe, it } = require('node:test'); + +describe('should fail', () => { + throw new Error('error in describe'); +}); + +describe('should pass', () => { + it('ok', () => {}); +}); diff --git a/test/fixtures/test-runner/global-setup-teardown/another-test-file.js b/test/fixtures/test-runner/global-setup-teardown/another-test-file.js index 6d39ef2ec79aa8..d7808c2b565a7c 100644 --- a/test/fixtures/test-runner/global-setup-teardown/another-test-file.js +++ b/test/fixtures/test-runner/global-setup-teardown/another-test-file.js @@ -4,7 +4,7 @@ const test = require('node:test'); const assert = require('node:assert'); const fs = require('node:fs'); -test('Another test that verifies setup flag existance', (t) => { +test('Another test that verifies setup flag existence', (t) => { const setupFlagPath = process.env.SETUP_FLAG_PATH; assert.ok(fs.existsSync(setupFlagPath), 'Setup flag file should exist'); diff --git a/test/fixtures/test-runner/mock-timers-with-timeout.js b/test/fixtures/test-runner/mock-timers-with-timeout.js new file mode 100644 index 00000000000000..4eb94ec5d6d8e9 --- /dev/null +++ b/test/fixtures/test-runner/mock-timers-with-timeout.js @@ -0,0 +1,43 @@ +'use strict'; + +// Simulate @sinonjs/fake-timers: patch the timers module BEFORE +// the test runner is loaded, so the test runner captures the patched +// versions at import time. +const nodeTimers = require('node:timers'); +const originalSetTimeout = nodeTimers.setTimeout; +const originalClearTimeout = nodeTimers.clearTimeout; + +const fakeTimers = new Map(); +let nextId = 1; + +nodeTimers.setTimeout = (fn, delay, ...args) => { + const id = nextId++; + const timer = originalSetTimeout(fn, delay, ...args); + fakeTimers.set(id, timer); + // Sinon fake timers return an object with unref/ref but without + // Symbol.dispose, which would cause the test runner to throw. + return { id, unref() {}, ref() {} }; +}; + +nodeTimers.clearTimeout = (id) => { + if (id != null && typeof id === 'object') id = id.id; + const timer = fakeTimers.get(id); + if (timer) { + originalClearTimeout(timer); + fakeTimers.delete(id); + } +}; + +// Now load the test runner - it will capture our patched setTimeout/clearTimeout +const { test } = require('node:test'); + +test('test with fake timers and timeout', { timeout: 10_000 }, () => { + // This test verifies that the test runner works when setTimeout returns + // an object without Symbol.dispose (like sinon fake timers). + // Previously, the test runner called timer[Symbol.dispose]() which would + // throw TypeError on objects returned by fake timer implementations. +}); + +// Restore +nodeTimers.setTimeout = originalSetTimeout; +nodeTimers.clearTimeout = originalClearTimeout; diff --git a/test/fixtures/test-runner/output/abort-runs-after-hook.snapshot b/test/fixtures/test-runner/output/abort-runs-after-hook.snapshot index f551a0b5baab75..44643bfcb7c3cf 100644 --- a/test/fixtures/test-runner/output/abort-runs-after-hook.snapshot +++ b/test/fixtures/test-runner/output/abort-runs-after-hook.snapshot @@ -5,13 +5,13 @@ not ok 1 - test that aborts --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/abort-runs-after-hook.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/abort-runs-after-hook.js:4:1' failureType: 'uncaughtException' error: 'boom' code: 'ERR_TEST_FAILURE' stack: |- - * - * + Immediate.<anonymous> (<project-root>/test/fixtures/test-runner/output/abort-runs-after-hook.js:12:11) + <node-internal-frames> ... 1..1 # tests 1 diff --git a/test/fixtures/test-runner/output/abort.snapshot b/test/fixtures/test-runner/output/abort.snapshot index c8e9aeb31b5faa..72504832704c80 100644 --- a/test/fixtures/test-runner/output/abort.snapshot +++ b/test/fixtures/test-runner/output/abort.snapshot @@ -29,7 +29,7 @@ TAP version 13 --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/abort.js:(LINE):7' + location: '<project-root>/test/fixtures/test-runner/output/abort.js:11:7' failureType: 'cancelledByParent' error: 'test did not finish before its parent and was cancelled' code: 'ERR_TEST_FAILURE' @@ -39,7 +39,7 @@ TAP version 13 --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/abort.js:(LINE):7' + location: '<project-root>/test/fixtures/test-runner/output/abort.js:12:7' failureType: 'cancelledByParent' error: 'test did not finish before its parent and was cancelled' code: 'ERR_TEST_FAILURE' @@ -49,104 +49,67 @@ TAP version 13 --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/abort.js:(LINE):7' + location: '<project-root>/test/fixtures/test-runner/output/abort.js:13:7' failureType: 'testAborted' error: 'This operation was aborted' code: 20 name: 'AbortError' stack: |- - * - * - * - * - * - * - * - * - * - * + <node-internal-frames> ... # Subtest: not ok 4 not ok 8 - not ok 4 --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/abort.js:(LINE):7' + location: '<project-root>/test/fixtures/test-runner/output/abort.js:14:7' failureType: 'testAborted' error: 'This operation was aborted' code: 20 name: 'AbortError' stack: |- - * - * - * - * - * - * - * - * - * - * + <node-internal-frames> ... # Subtest: not ok 5 not ok 9 - not ok 5 --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/abort.js:(LINE):7' + location: '<project-root>/test/fixtures/test-runner/output/abort.js:15:7' failureType: 'testAborted' error: 'This operation was aborted' code: 20 name: 'AbortError' stack: |- - * - * - * - * - * - * - * - * - * - * + <node-internal-frames> ... 1..9 not ok 1 - promise timeout signal --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/abort.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/abort.js:5:1' failureType: 'testAborted' error: 'The operation was aborted due to timeout' code: 23 name: 'TimeoutError' stack: |- - * - * - * - * + <node-internal-frames> ... # Subtest: promise abort signal not ok 2 - promise abort signal --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/abort.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/abort.js:21:1' failureType: 'testAborted' error: 'This operation was aborted' code: 20 name: 'AbortError' stack: |- - * - * - * - * - * - * - * - * - * - * + <node-internal-frames> + Object.<anonymous> (<project-root>/test/fixtures/test-runner/output/abort.js:21:52) + <node-internal-frames> ... # Subtest: callback timeout signal # Subtest: ok 1 @@ -178,7 +141,7 @@ not ok 2 - promise abort signal --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/abort.js:(LINE):5' + location: '<project-root>/test/fixtures/test-runner/output/abort.js:30:5' failureType: 'cancelledByParent' error: 'test did not finish before its parent and was cancelled' code: 'ERR_TEST_FAILURE' @@ -188,7 +151,7 @@ not ok 2 - promise abort signal --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/abort.js:(LINE):5' + location: '<project-root>/test/fixtures/test-runner/output/abort.js:31:5' failureType: 'cancelledByParent' error: 'test did not finish before its parent and was cancelled' code: 'ERR_TEST_FAILURE' @@ -198,104 +161,67 @@ not ok 2 - promise abort signal --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/abort.js:(LINE):5' + location: '<project-root>/test/fixtures/test-runner/output/abort.js:32:5' failureType: 'testAborted' error: 'This operation was aborted' code: 20 name: 'AbortError' stack: |- - * - * - * - * - * - * - * - * - * - * + <node-internal-frames> ... # Subtest: not ok 4 not ok 8 - not ok 4 --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/abort.js:(LINE):5' + location: '<project-root>/test/fixtures/test-runner/output/abort.js:33:5' failureType: 'testAborted' error: 'This operation was aborted' code: 20 name: 'AbortError' stack: |- - * - * - * - * - * - * - * - * - * - * + <node-internal-frames> ... # Subtest: not ok 5 not ok 9 - not ok 5 --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/abort.js:(LINE):5' + location: '<project-root>/test/fixtures/test-runner/output/abort.js:34:5' failureType: 'testAborted' error: 'This operation was aborted' code: 20 name: 'AbortError' stack: |- - * - * - * - * - * - * - * - * - * - * + <node-internal-frames> ... 1..9 not ok 3 - callback timeout signal --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/abort.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/abort.js:25:1' failureType: 'testAborted' error: 'The operation was aborted due to timeout' code: 23 name: 'TimeoutError' stack: |- - * - * - * - * + <node-internal-frames> ... # Subtest: callback abort signal not ok 4 - callback abort signal --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/abort.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/abort.js:39:1' failureType: 'testAborted' error: 'This operation was aborted' code: 20 name: 'AbortError' stack: |- - * - * - * - * - * - * - * - * - * - * + <node-internal-frames> + Object.<anonymous> (<project-root>/test/fixtures/test-runner/output/abort.js:39:53) + <node-internal-frames> ... 1..4 # tests 22 diff --git a/test/fixtures/test-runner/output/abort_hooks.snapshot b/test/fixtures/test-runner/output/abort_hooks.snapshot index db52ca3c8fbbb0..10a9c189e7885c 100644 --- a/test/fixtures/test-runner/output/abort_hooks.snapshot +++ b/test/fixtures/test-runner/output/abort_hooks.snapshot @@ -13,7 +13,7 @@ TAP version 13 --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/abort_hooks.js:(LINE):3' + location: '<project-root>/test/fixtures/test-runner/output/abort_hooks.js:11:3' failureType: 'cancelledByParent' error: 'test did not finish before its parent and was cancelled' code: 'ERR_TEST_FAILURE' @@ -23,7 +23,7 @@ TAP version 13 --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/abort_hooks.js:(LINE):3' + location: '<project-root>/test/fixtures/test-runner/output/abort_hooks.js:14:3' failureType: 'cancelledByParent' error: 'test did not finish before its parent and was cancelled' code: 'ERR_TEST_FAILURE' @@ -33,22 +33,15 @@ not ok 1 - 1 before describe --- duration_ms: * type: 'suite' - location: '<project-root>/test/fixtures/test-runner/output/abort_hooks.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/abort_hooks.js:4:1' failureType: 'hookFailed' error: 'This operation was aborted' code: 20 name: 'AbortError' stack: |- - * - * - * - * - * - * - * - * - * - * + <node-internal-frames> + before.signal (<project-root>/test/fixtures/test-runner/output/abort_hooks.js:8:8) + <node-internal-frames> ... # Subtest: 2 after describe # Subtest: test 1 @@ -68,22 +61,15 @@ not ok 2 - 2 after describe --- duration_ms: * type: 'suite' - location: '<project-root>/test/fixtures/test-runner/output/abort_hooks.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/abort_hooks.js:19:1' failureType: 'hookFailed' error: 'This operation was aborted' code: 20 name: 'AbortError' stack: |- - * - * - * - * - * - * - * - * - * - * + <node-internal-frames> + after.signal (<project-root>/test/fixtures/test-runner/output/abort_hooks.js:23:8) + <node-internal-frames> ... # Subtest: 3 beforeEach describe # Subtest: test 1 @@ -91,51 +77,37 @@ not ok 2 - 2 after describe --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/abort_hooks.js:(LINE):3' + location: '<project-root>/test/fixtures/test-runner/output/abort_hooks.js:41:3' failureType: 'hookFailed' error: 'This operation was aborted' code: 20 name: 'AbortError' stack: |- - * - * - * - * - * - * - * - * - * - * + <node-internal-frames> + beforeEach.signal (<project-root>/test/fixtures/test-runner/output/abort_hooks.js:38:8) + <node-internal-frames> ... # Subtest: test 2 not ok 2 - test 2 --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/abort_hooks.js:(LINE):3' + location: '<project-root>/test/fixtures/test-runner/output/abort_hooks.js:44:3' failureType: 'hookFailed' error: 'This operation was aborted' code: 20 name: 'AbortError' stack: |- - * - * - * - * - * - * - * - * - * - * + <node-internal-frames> + beforeEach.signal (<project-root>/test/fixtures/test-runner/output/abort_hooks.js:38:8) + <node-internal-frames> ... 1..2 not ok 3 - 3 beforeEach describe --- duration_ms: * type: 'suite' - location: '<project-root>/test/fixtures/test-runner/output/abort_hooks.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/abort_hooks.js:34:1' failureType: 'subtestsFailed' error: '2 subtests failed' code: 'ERR_TEST_FAILURE' @@ -146,51 +118,37 @@ not ok 3 - 3 beforeEach describe --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/abort_hooks.js:(LINE):3' + location: '<project-root>/test/fixtures/test-runner/output/abort_hooks.js:56:3' failureType: 'hookFailed' error: 'This operation was aborted' code: 20 name: 'AbortError' stack: |- - * - * - * - * - * - * - * - * - * - * + <node-internal-frames> + afterEach.signal (<project-root>/test/fixtures/test-runner/output/abort_hooks.js:53:8) + <node-internal-frames> ... # Subtest: test 2 not ok 2 - test 2 --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/abort_hooks.js:(LINE):3' + location: '<project-root>/test/fixtures/test-runner/output/abort_hooks.js:59:3' failureType: 'hookFailed' error: 'This operation was aborted' code: 20 name: 'AbortError' stack: |- - * - * - * - * - * - * - * - * - * - * + <node-internal-frames> + afterEach.signal (<project-root>/test/fixtures/test-runner/output/abort_hooks.js:53:8) + <node-internal-frames> ... 1..2 not ok 4 - 4 afterEach describe --- duration_ms: * type: 'suite' - location: '<project-root>/test/fixtures/test-runner/output/abort_hooks.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/abort_hooks.js:49:1' failureType: 'subtestsFailed' error: '2 subtests failed' code: 'ERR_TEST_FAILURE' diff --git a/test/fixtures/test-runner/output/abort_suite.snapshot b/test/fixtures/test-runner/output/abort_suite.snapshot index 80a7705e92959b..0f1a1710c77d88 100644 --- a/test/fixtures/test-runner/output/abort_suite.snapshot +++ b/test/fixtures/test-runner/output/abort_suite.snapshot @@ -29,7 +29,7 @@ TAP version 13 --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/abort_suite.js:(LINE):3' + location: '<project-root>/test/fixtures/test-runner/output/abort_suite.js:10:3' failureType: 'cancelledByParent' error: 'test did not finish before its parent and was cancelled' code: 'ERR_TEST_FAILURE' @@ -39,7 +39,7 @@ TAP version 13 --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/abort_suite.js:(LINE):3' + location: '<project-root>/test/fixtures/test-runner/output/abort_suite.js:11:3' failureType: 'cancelledByParent' error: 'test did not finish before its parent and was cancelled' code: 'ERR_TEST_FAILURE' @@ -49,104 +49,67 @@ TAP version 13 --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/abort_suite.js:(LINE):3' + location: '<project-root>/test/fixtures/test-runner/output/abort_suite.js:12:3' failureType: 'testAborted' error: 'This operation was aborted' code: 20 name: 'AbortError' stack: |- - * - * - * - * - * - * - * - * - * - * + <node-internal-frames> ... # Subtest: not ok 4 not ok 8 - not ok 4 --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/abort_suite.js:(LINE):3' + location: '<project-root>/test/fixtures/test-runner/output/abort_suite.js:13:3' failureType: 'testAborted' error: 'This operation was aborted' code: 20 name: 'AbortError' stack: |- - * - * - * - * - * - * - * - * - * - * + <node-internal-frames> ... # Subtest: not ok 5 not ok 9 - not ok 5 --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/abort_suite.js:(LINE):3' + location: '<project-root>/test/fixtures/test-runner/output/abort_suite.js:14:3' failureType: 'testAborted' error: 'This operation was aborted' code: 20 name: 'AbortError' stack: |- - * - * - * - * - * - * - * - * - * - * + <node-internal-frames> ... 1..9 not ok 1 - describe timeout signal --- duration_ms: * type: 'suite' - location: '<project-root>/test/fixtures/test-runner/output/abort_suite.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/abort_suite.js:5:1' failureType: 'testAborted' error: 'The operation was aborted due to timeout' code: 23 name: 'TimeoutError' stack: |- - * - * - * - * + <node-internal-frames> ... # Subtest: describe abort signal not ok 2 - describe abort signal --- duration_ms: * type: 'suite' - location: '<project-root>/test/fixtures/test-runner/output/abort_suite.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/abort_suite.js:19:1' failureType: 'testAborted' error: 'This operation was aborted' code: 20 name: 'AbortError' stack: |- - * - * - * - * - * - * - * - * - * - * + <node-internal-frames> + Object.<anonymous> (<project-root>/test/fixtures/test-runner/output/abort_suite.js:19:57) + <node-internal-frames> ... 1..2 # tests 9 diff --git a/test/fixtures/test-runner/output/assertion-color-tty.snapshot b/test/fixtures/test-runner/output/assertion-color-tty.snapshot index 56def5cdaa5f79..1489619e4e7cd2 100644 --- a/test/fixtures/test-runner/output/assertion-color-tty.snapshot +++ b/test/fixtures/test-runner/output/assertion-color-tty.snapshot @@ -10,7 +10,7 @@ [31m✖ failing tests:[39m -* +test at test/fixtures/test-runner/output/assertion-color-tty.mjs:4:1 [31m✖ failing assertion [90m(*ms)[39m[39m [AssertionError [ERR_ASSERTION]: Expected values to be strictly equal: [32mactual[39m [31mexpected[39m diff --git a/test/fixtures/test-runner/output/coverage-with-mock-cjs.mjs b/test/fixtures/test-runner/output/coverage-with-mock-cjs.mjs new file mode 100644 index 00000000000000..9acf8019f789ea --- /dev/null +++ b/test/fixtures/test-runner/output/coverage-with-mock-cjs.mjs @@ -0,0 +1,11 @@ +import { mock, test } from 'node:test'; + +const dependency = mock.fn(() => 'mock-return-value'); +mock.module('../coverage-with-mock/dependency.cjs', { exports: { dependency } }); + +const { subject } = await import('../coverage-with-mock/subject.mjs'); + +test('subject calls dependency', (t) => { + t.assert.strictEqual(subject(), 'mock-return-value'); + t.assert.strictEqual(dependency.mock.callCount(), 1); +}); diff --git a/test/fixtures/test-runner/output/coverage-with-mock-cjs.snapshot b/test/fixtures/test-runner/output/coverage-with-mock-cjs.snapshot new file mode 100644 index 00000000000000..6d19904b02228a --- /dev/null +++ b/test/fixtures/test-runner/output/coverage-with-mock-cjs.snapshot @@ -0,0 +1,31 @@ +TAP version 13 +# Subtest: subject calls dependency +ok 1 - subject calls dependency + --- + duration_ms: * + type: 'test' + ... +1..1 +# tests 1 +# suites 0 +# pass 1 +# fail 0 +# cancelled 0 +# skipped 0 +# todo 0 +# duration_ms * +# start of coverage report +# ------------------------------------------------------------------------------- +# file | line % | branch % | funcs % | uncovered lines +# ------------------------------------------------------------------------------- +# test | | | | +# fixtures | | | | +# test-runner | | | | +# coverage-with-mock | | | | +# subject.mjs | 100.00 | 100.00 | 100.00 | +# output | | | | +# coverage-with-mock-cjs.mjs | 100.00 | 100.00 | 100.00 | +# ------------------------------------------------------------------------------- +# all files | 100.00 | 100.00 | 100.00 | +# ------------------------------------------------------------------------------- +# end of coverage report diff --git a/test/fixtures/test-runner/output/coverage-with-mock.mjs b/test/fixtures/test-runner/output/coverage-with-mock.mjs index 5d5b2b14f66a95..e3b8fcc473f450 100644 --- a/test/fixtures/test-runner/output/coverage-with-mock.mjs +++ b/test/fixtures/test-runner/output/coverage-with-mock.mjs @@ -2,7 +2,7 @@ import { describe, it, mock } from 'node:test'; describe('module test with mock', async () => { mock.module('../coverage-with-mock/sum.js', { - namedExports: { + exports: { sum: (a, b) => 1, getData: () => ({}), }, diff --git a/test/fixtures/test-runner/output/default_output.snapshot b/test/fixtures/test-runner/output/default_output.snapshot index a58e14346ec727..55b40367282366 100644 --- a/test/fixtures/test-runner/output/default_output.snapshot +++ b/test/fixtures/test-runner/output/default_output.snapshot @@ -16,27 +16,16 @@ [31m✖ failing tests:[39m -* +test at test/fixtures/test-runner/output/default_output.js:10:1 [31m✖ should fail [90m(*ms)[39m[39m Error: fail - *[39m - *[39m - *[39m - *[39m - *[39m - *[39m - *[39m + at TestContext.<anonymous> [90m(<project-root>/[39mtest/fixtures/test-runner/output/default_output.js:10:35[90m)[39m + [90m at <node-internal-frames>[39m -* +test at test/fixtures/test-runner/output/default_output.js:13:5 [31m✖ should fail [90m(*ms)[39m[39m Error: fail - *[39m - *[39m - *[39m - *[39m - *[39m - *[39m - *[39m - *[39m - *[39m - *[39m + at TestContext.<anonymous> [90m(<project-root>/[39mtest/fixtures/test-runner/output/default_output.js:13:39[90m)[39m + [90m at <node-internal-frames>[39m + at TestContext.<anonymous> [90m(<project-root>/[39mtest/fixtures/test-runner/output/default_output.js:13:5[90m)[39m + [90m at <node-internal-frames>[39m diff --git a/test/fixtures/test-runner/output/describe_it.snapshot b/test/fixtures/test-runner/output/describe_it.snapshot index cae467f6487ffe..4df2c20a45f3b7 100644 --- a/test/fixtures/test-runner/output/describe_it.snapshot +++ b/test/fixtures/test-runner/output/describe_it.snapshot @@ -40,18 +40,13 @@ not ok 7 - sync todo # TODO --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:(LINE):4' + location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:30:4' failureType: 'testCodeFailure' error: 'should not count as a failure' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/describe_it.js:31:9) + <node-internal-frames> ... # Subtest: sync todo with expect fail ok 8 - sync todo with expect fail # TODO @@ -64,18 +59,13 @@ not ok 9 - sync todo with message # TODO this is a failing todo --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:38:1' failureType: 'testCodeFailure' error: 'should not count as a failure' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/describe_it.js:39:9) + <node-internal-frames> ... # Subtest: sync skip pass ok 10 - sync skip pass # SKIP @@ -106,18 +96,13 @@ not ok 14 - sync throw fail --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:55:1' failureType: 'testCodeFailure' error: 'thrown from sync throw fail' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/describe_it.js:56:9) + <node-internal-frames> ... # Subtest: async skip pass ok 15 - async skip pass # SKIP @@ -142,25 +127,20 @@ not ok 18 - async throw fail --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:68:1' failureType: 'testCodeFailure' error: 'thrown from async throw fail' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/describe_it.js:69:9) + <node-internal-frames> ... # Subtest: async skip fail not ok 19 - async skip fail # SKIP --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:72:1' failureType: 'callbackAndPromisePresent' error: 'passed a callback but also returned a Promise' code: 'ERR_TEST_FAILURE' @@ -170,7 +150,7 @@ not ok 20 - async assertion fail --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:77:1' failureType: 'testCodeFailure' error: |- Expected values to be strictly equal: @@ -183,13 +163,8 @@ not ok 20 - async assertion fail actual: true operator: 'strictEqual' stack: |- - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/describe_it.js:79:10) + <node-internal-frames> ... # Subtest: resolve pass ok 21 - resolve pass @@ -202,18 +177,13 @@ not ok 22 - reject fail --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:86:1' failureType: 'testCodeFailure' error: 'rejected from reject fail' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/describe_it.js:87:25) + <node-internal-frames> ... # Subtest: unhandled rejection - passes but warns ok 23 - unhandled rejection - passes but warns @@ -251,20 +221,15 @@ ok 27 - immediate resolve pass --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:(LINE):3' + location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:119:3' failureType: 'testCodeFailure' error: 'thrown from subtest sync throw fail' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/describe_it.js:120:11) + <node-internal-frames> new Promise (<anonymous>) - * - * + <node-internal-frames> Array.map (<anonymous>) ... # Subtest: mixing describe/it and test should work @@ -278,7 +243,7 @@ not ok 28 - subtest sync throw fail --- duration_ms: * type: 'suite' - location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:118:1' failureType: 'subtestsFailed' error: '1 subtest failed' code: 'ERR_TEST_FAILURE' @@ -288,7 +253,7 @@ not ok 29 - sync throw non-error fail --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:125:1' failureType: 'testCodeFailure' error: 'Symbol(thrown symbol from sync throw non-error fail)' code: 'ERR_TEST_FAILURE' @@ -347,18 +312,13 @@ not ok 34 - sync skip option is false fail --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:194:1' failureType: 'testCodeFailure' error: 'this should be executed' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/describe_it.js:195:9) + <node-internal-frames> ... # Subtest: <anonymous> ok 35 - <anonymous> @@ -419,13 +379,13 @@ not ok 44 - callback fail --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:226:1' failureType: 'testCodeFailure' error: 'callback failure' code: 'ERR_TEST_FAILURE' stack: |- - * - * + Immediate.<anonymous> (<project-root>/test/fixtures/test-runner/output/describe_it.js:228:10) + <node-internal-frames> ... # Subtest: sync t is this in test ok 45 - sync t is this in test @@ -450,7 +410,7 @@ not ok 48 - callback also returns a Promise --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:245:1' failureType: 'callbackAndPromisePresent' error: 'passed a callback but also returned a Promise' code: 'ERR_TEST_FAILURE' @@ -460,31 +420,26 @@ not ok 49 - callback throw --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:249:1' failureType: 'testCodeFailure' error: 'thrown from callback throw' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/describe_it.js:250:9) + <node-internal-frames> ... # Subtest: callback called twice not ok 50 - callback called twice --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:253:1' failureType: 'multipleCallbackInvocations' error: 'callback invoked multiple times' code: 'ERR_TEST_FAILURE' stack: |- - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/describe_it.js:255:3) + <node-internal-frames> ... # Subtest: callback called twice in different ticks ok 51 - callback called twice in different ticks @@ -497,25 +452,25 @@ not ok 52 - callback called twice in future tick --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:263:1' failureType: 'uncaughtException' error: 'callback invoked multiple times' code: 'ERR_TEST_FAILURE' stack: |- - * + Immediate.<anonymous> (<project-root>/test/fixtures/test-runner/output/describe_it.js:266:5) ... # Subtest: callback async throw not ok 53 - callback async throw --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:270:1' failureType: 'uncaughtException' error: 'thrown from callback async throw' code: 'ERR_TEST_FAILURE' stack: |- - * - * + Immediate.<anonymous> (<project-root>/test/fixtures/test-runner/output/describe_it.js:272:11) + <node-internal-frames> ... # Subtest: callback async throw after done ok 54 - callback async throw after done @@ -528,7 +483,7 @@ not ok 55 - custom inspect symbol fail --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:284:1' failureType: 'testCodeFailure' error: 'customized' code: 'ERR_TEST_FAILURE' @@ -538,7 +493,7 @@ not ok 56 - custom inspect symbol that throws fail --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:295:1' failureType: 'testCodeFailure' error: |- { @@ -553,20 +508,15 @@ not ok 56 - custom inspect symbol that throws fail --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:(LINE):3' + location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:307:3' failureType: 'testCodeFailure' error: 'thrown from subtest sync throw fails at first' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/describe_it.js:308:11) + <node-internal-frames> new Promise (<anonymous>) - * - * + <node-internal-frames> Array.map (<anonymous>) ... # Subtest: sync throw fails at second @@ -574,27 +524,22 @@ not ok 56 - custom inspect symbol that throws fail --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:(LINE):3' + location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:310:3' failureType: 'testCodeFailure' error: 'thrown from subtest sync throw fails at second' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/describe_it.js:311:11) + <node-internal-frames> async Promise.all (index 0) - * - * + <node-internal-frames> ... 1..2 not ok 57 - subtest sync throw fails --- duration_ms: * type: 'suite' - location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:306:1' failureType: 'subtestsFailed' error: '2 subtests failed' code: 'ERR_TEST_FAILURE' @@ -605,7 +550,7 @@ not ok 57 - subtest sync throw fails --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:(LINE):3' + location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:316:3' failureType: 'cancelledByParent' error: 'test did not finish before its parent and was cancelled' code: 'ERR_TEST_FAILURE' @@ -615,21 +560,15 @@ not ok 58 - describe sync throw fails --- duration_ms: * type: 'suite' - location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:315:1' failureType: 'testCodeFailure' error: 'thrown from describe' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * - * - * - * + SuiteContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/describe_it.js:317:9) + <node-internal-frames> + Object.<anonymous> (<project-root>/test/fixtures/test-runner/output/describe_it.js:315:1) + <node-internal-frames> ... # Subtest: describe async throw fails # Subtest: should not run @@ -637,7 +576,7 @@ not ok 58 - describe sync throw fails --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:(LINE):3' + location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:321:3' failureType: 'cancelledByParent' error: 'test did not finish before its parent and was cancelled' code: 'ERR_TEST_FAILURE' @@ -647,21 +586,15 @@ not ok 59 - describe async throw fails --- duration_ms: * type: 'suite' - location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:320:1' failureType: 'testCodeFailure' error: 'thrown from describe' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * - * - * - * + SuiteContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/describe_it.js:322:9) + <node-internal-frames> + Object.<anonymous> (<project-root>/test/fixtures/test-runner/output/describe_it.js:320:1) + <node-internal-frames> ... # Subtest: timeouts # Subtest: timed out async test @@ -669,7 +602,7 @@ not ok 59 - describe async throw fails --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:(LINE):3' + location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:326:3' failureType: 'testTimeoutFailure' error: 'test timed out after 5ms' code: 'ERR_TEST_FAILURE' @@ -681,7 +614,7 @@ not ok 59 - describe async throw fails --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:(LINE):3' + location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:335:3' failureType: 'testTimeoutFailure' error: 'test timed out after 5ms' code: 'ERR_TEST_FAILURE' @@ -703,7 +636,7 @@ not ok 60 - timeouts --- duration_ms: * type: 'suite' - location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:325:1' failureType: 'subtestsFailed' error: '2 subtests failed' code: 'ERR_TEST_FAILURE' @@ -720,19 +653,19 @@ not ok 60 - timeouts --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:(LINE):3' + location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:366:3' failureType: 'testCodeFailure' error: 'custom error' code: 'ERR_TEST_FAILURE' stack: |- - * + Object.<anonymous> (<project-root>/test/fixtures/test-runner/output/describe_it.js:372:50) ... 1..2 not ok 61 - successful thenable --- duration_ms: * type: 'suite' - location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:354:1' failureType: 'subtestsFailed' error: '1 subtest failed' code: 'ERR_TEST_FAILURE' @@ -742,12 +675,12 @@ not ok 62 - rejected thenable --- duration_ms: * type: 'suite' - location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:387:1' failureType: 'testCodeFailure' error: 'custom error' code: 'ERR_TEST_FAILURE' stack: |- - * + Object.<anonymous> (<project-root>/test/fixtures/test-runner/output/describe_it.js:393:48) ... # Subtest: async describe function # Subtest: it inside describe 1 @@ -786,20 +719,20 @@ not ok 64 - invalid subtest fail --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:(LINE):5' + location: '<project-root>/test/fixtures/test-runner/output/describe_it.js:180:5' failureType: 'parentAlreadyFinished' error: 'test could not be started because its parent finished' code: 'ERR_TEST_FAILURE' stack: |- - * + Immediate.<anonymous> (<project-root>/test/fixtures/test-runner/output/describe_it.js:180:5) ... 1..64 -# Error: Test "unhandled rejection - passes but warns" at test/fixtures/test-runner/output/describe_it.js:(LINE):1 generated asynchronous activity after the test ended. This activity created the error "Error: rejected from unhandled rejection fail" and would have caused the test to fail, but instead triggered an unhandledRejection event. -# Error: Test "async unhandled rejection - passes but warns" at test/fixtures/test-runner/output/describe_it.js:(LINE):1 generated asynchronous activity after the test ended. This activity created the error "Error: rejected from async unhandled rejection fail" and would have caused the test to fail, but instead triggered an unhandledRejection event. -# Error: Test "immediate throw - passes but warns" at test/fixtures/test-runner/output/describe_it.js:(LINE):1 generated asynchronous activity after the test ended. This activity created the error "Error: thrown from immediate throw fail" and would have caused the test to fail, but instead triggered an uncaughtException event. -# Error: Test "immediate reject - passes but warns" at test/fixtures/test-runner/output/describe_it.js:(LINE):1 generated asynchronous activity after the test ended. This activity created the error "Error: rejected from immediate reject fail" and would have caused the test to fail, but instead triggered an unhandledRejection event. -# Error: Test "callback called twice in different ticks" at test/fixtures/test-runner/output/describe_it.js:(LINE):1 generated asynchronous activity after the test ended. This activity created the error "Error [ERR_TEST_FAILURE]: callback invoked multiple times" and would have caused the test to fail, but instead triggered an uncaughtException event. -# Error: Test "callback async throw after done" at test/fixtures/test-runner/output/describe_it.js:(LINE):1 generated asynchronous activity after the test ended. This activity created the error "Error: thrown from callback async throw after done" and would have caused the test to fail, but instead triggered an uncaughtException event. +# Error: Test "unhandled rejection - passes but warns" at test/fixtures/test-runner/output/describe_it.js:90:1 generated asynchronous activity after the test ended. This activity created the error "Error: rejected from unhandled rejection fail" and would have caused the test to fail, but instead triggered an unhandledRejection event. +# Error: Test "async unhandled rejection - passes but warns" at test/fixtures/test-runner/output/describe_it.js:94:1 generated asynchronous activity after the test ended. This activity created the error "Error: rejected from async unhandled rejection fail" and would have caused the test to fail, but instead triggered an unhandledRejection event. +# Error: Test "immediate throw - passes but warns" at test/fixtures/test-runner/output/describe_it.js:98:1 generated asynchronous activity after the test ended. This activity created the error "Error: thrown from immediate throw fail" and would have caused the test to fail, but instead triggered an uncaughtException event. +# Error: Test "immediate reject - passes but warns" at test/fixtures/test-runner/output/describe_it.js:104:1 generated asynchronous activity after the test ended. This activity created the error "Error: rejected from immediate reject fail" and would have caused the test to fail, but instead triggered an unhandledRejection event. +# Error: Test "callback called twice in different ticks" at test/fixtures/test-runner/output/describe_it.js:258:1 generated asynchronous activity after the test ended. This activity created the error "Error [ERR_TEST_FAILURE]: callback invoked multiple times" and would have caused the test to fail, but instead triggered an uncaughtException event. +# Error: Test "callback async throw after done" at test/fixtures/test-runner/output/describe_it.js:276:1 generated asynchronous activity after the test ended. This activity created the error "Error: thrown from callback async throw after done" and would have caused the test to fail, but instead triggered an uncaughtException event. # tests 73 # suites 11 # pass 35 diff --git a/test/fixtures/test-runner/output/dot_reporter.snapshot b/test/fixtures/test-runner/output/dot_reporter.snapshot index 9d36767c415586..f3335117acf884 100644 --- a/test/fixtures/test-runner/output/dot_reporter.snapshot +++ b/test/fixtures/test-runner/output/dot_reporter.snapshot @@ -8,61 +8,32 @@ Failed tests: ⚠ sync fail todo (*ms) # TODO Error: thrown from sync fail todo - * - * - * - * - * - * - * + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:42:9) + at <node-internal-frames> ⚠ sync fail todo with message (*ms) # this is a failing todo Error: thrown from sync fail todo with message - * - * - * - * - * - * - * + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:47:9) + at <node-internal-frames> ✖ sync throw fail (*ms) Error: thrown from sync throw fail - * - * - * - * - * - * - * + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:63:9) + at <node-internal-frames> ✖ async throw fail (*ms) Error: thrown from async throw fail - * - * - * - * - * - * - * + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:75:9) + at <node-internal-frames> ﹣ async skip fail (*ms) # SKIP Error: thrown from async throw fail - * - * - * - * - * - * - * + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:80:9) + at <node-internal-frames> ✖ async assertion fail (*ms) AssertionError [ERR_ASSERTION]: Expected values to be strictly equal: true !== false - * - * - * - * - * - * - * { + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:85:10) + at <node-internal-frames> + at <node-internal-frames> { generatedMessage: true, code: 'ERR_ASSERTION', actual: true, @@ -72,92 +43,61 @@ Failed tests: } ✖ reject fail (*ms) Error: rejected from reject fail - * - * - * - * - * - * - * + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:93:25) + at <node-internal-frames> ✖ +sync throw fail (*ms) Error: thrown from subtest sync throw fail - * - * - * - * - * - * - * - * - * - * + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:127:11) + at <node-internal-frames> + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:125:11) + at <node-internal-frames> ✖ subtest sync throw fail (*ms) '1 subtest failed' ✖ sync throw non-error fail (*ms) Symbol(thrown symbol from sync throw non-error fail) ✖ sync skip option is false fail (*ms) Error: this should be executed - * - * - * - * - * - * - * + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:212:9) + at <node-internal-frames> ✖ callback fail (*ms) Error: callback failure - * - * + at Immediate.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:245:10) + at <node-internal-frames> ✖ callback also returns a Promise (*ms) 'passed a callback but also returned a Promise' ✖ callback throw (*ms) Error: thrown from callback throw - * - * - * - * - * - * - * + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:267:9) + at <node-internal-frames> ✖ callback called twice (*ms) 'callback invoked multiple times' ✖ callback called twice in future tick (*ms) Error [ERR_TEST_FAILURE]: callback invoked multiple times - * { + at Immediate.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:283:5) { code: 'ERR_TEST_FAILURE', failureType: 'multipleCallbackInvocations', cause: 'callback invoked multiple times' } ✖ callback async throw (*ms) Error: thrown from callback async throw - * - * + at Immediate.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:289:11) + at <node-internal-frames> ✖ custom inspect symbol fail (*ms) customized ✖ custom inspect symbol that throws fail (*ms) { foo: 1, Symbol(nodejs.util.inspect.custom): [Function: [nodejs.util.inspect.custom]] } ✖ sync throw fails at first (*ms) Error: thrown from subtest sync throw fails at first - * - * - * - * - * - * - * - * - * - * + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:335:11) + at <node-internal-frames> + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:334:11) + at <node-internal-frames> ✖ sync throw fails at second (*ms) Error: thrown from subtest sync throw fails at second - * - * - * - * - * - * - * - * + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:338:11) + at <node-internal-frames> + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:337:11) + at <node-internal-frames> ✖ subtest sync throw fails (*ms) '2 subtests failed' ✖ timed out async test (*ms) @@ -168,14 +108,12 @@ Failed tests: 'custom error' ✖ unfinished test with uncaughtException (*ms) Error: foo - * - * - * + at Timeout._onTimeout (<project-root>/test/fixtures/test-runner/output/output.js:393:30) + at <node-internal-frames> ✖ unfinished test with unhandledRejection (*ms) Error: bar - * - * - * + at Timeout._onTimeout (<project-root>/test/fixtures/test-runner/output/output.js:399:37) + at <node-internal-frames> ✖ assertion errors display actual and expected properly (*ms) AssertionError [ERR_ASSERTION]: Expected values to be loosely deep-equal: @@ -212,7 +150,7 @@ Failed tests: c: [Circular *1] } } - * { + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:425:12) { generatedMessage: true, code: 'ERR_ASSERTION', actual: [Object], diff --git a/test/fixtures/test-runner/output/eval_dot.snapshot b/test/fixtures/test-runner/output/eval_dot.snapshot index 8a22cfd477b15d..cb0cd1cbf9be0e 100644 --- a/test/fixtures/test-runner/output/eval_dot.snapshot +++ b/test/fixtures/test-runner/output/eval_dot.snapshot @@ -4,10 +4,5 @@ Failed tests: ✖ fails (*ms) Error: fail - * - * - * - * - * - * - * + at TestContext.eval (eval at <anonymous> (<project-root>/test/fixtures/test-runner/output/eval_dot.js:3:1), <anonymous>:6:11) + at <node-internal-frames> diff --git a/test/fixtures/test-runner/output/eval_spec.snapshot b/test/fixtures/test-runner/output/eval_spec.snapshot index 116c23ccf97077..d5b4937bd12a34 100644 --- a/test/fixtures/test-runner/output/eval_spec.snapshot +++ b/test/fixtures/test-runner/output/eval_spec.snapshot @@ -13,10 +13,5 @@ ✖ fails (*ms) Error: fail - * - * - * - * - * - * - * + at TestContext.eval (eval at <anonymous> (<project-root>/test/fixtures/test-runner/output/eval_spec.js:3:1), <anonymous>:6:11) + at <node-internal-frames> diff --git a/test/fixtures/test-runner/output/eval_tap.snapshot b/test/fixtures/test-runner/output/eval_tap.snapshot index 50457b013633f4..85108ff8cc50b7 100644 --- a/test/fixtures/test-runner/output/eval_tap.snapshot +++ b/test/fixtures/test-runner/output/eval_tap.snapshot @@ -14,13 +14,8 @@ not ok 2 - fails error: 'fail' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * + TestContext.eval (eval at <anonymous> (<project-root>/test/fixtures/test-runner/output/eval_tap.js:3:1), <anonymous>:6:11) + <node-internal-frames> ... 1..2 # tests 2 diff --git a/test/fixtures/test-runner/output/filtered-suite-throws.snapshot b/test/fixtures/test-runner/output/filtered-suite-throws.snapshot index cdcbbc8593df87..123b7f6e823940 100644 --- a/test/fixtures/test-runner/output/filtered-suite-throws.snapshot +++ b/test/fixtures/test-runner/output/filtered-suite-throws.snapshot @@ -4,21 +4,15 @@ not ok 1 - suite 1 --- duration_ms: * type: 'suite' - location: '<project-root>/test/fixtures/test-runner/output/filtered-suite-throws.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/filtered-suite-throws.js:6:1' failureType: 'testCodeFailure' error: 'boom 1' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * - * - * - * + SuiteContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/filtered-suite-throws.js:7:9) + <node-internal-frames> + Object.<anonymous> (<project-root>/test/fixtures/test-runner/output/filtered-suite-throws.js:6:1) + <node-internal-frames> ... # Subtest: suite 2 # Subtest: enabled - should get cancelled @@ -26,7 +20,7 @@ not ok 1 - suite 1 --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/filtered-suite-throws.js:(LINE):3' + location: '<project-root>/test/fixtures/test-runner/output/filtered-suite-throws.js:13:3' failureType: 'cancelledByParent' error: 'test did not finish before its parent and was cancelled' code: 'ERR_TEST_FAILURE' @@ -36,21 +30,15 @@ not ok 2 - suite 2 --- duration_ms: * type: 'suite' - location: '<project-root>/test/fixtures/test-runner/output/filtered-suite-throws.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/filtered-suite-throws.js:12:1' failureType: 'testCodeFailure' error: 'boom 1' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * - * - * - * + SuiteContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/filtered-suite-throws.js:14:9) + <node-internal-frames> + Object.<anonymous> (<project-root>/test/fixtures/test-runner/output/filtered-suite-throws.js:12:1) + <node-internal-frames> ... 1..2 # tests 1 diff --git a/test/fixtures/test-runner/output/global_after_should_fail_the_test.snapshot b/test/fixtures/test-runner/output/global_after_should_fail_the_test.snapshot index 1aaedf6df75fa3..52a8d63a2c2709 100644 --- a/test/fixtures/test-runner/output/global_after_should_fail_the_test.snapshot +++ b/test/fixtures/test-runner/output/global_after_should_fail_the_test.snapshot @@ -9,19 +9,13 @@ ok 1 - this is a test not ok 2 - <project-root>/test/fixtures/test-runner/output/global_after_should_fail_the_test.js --- duration_ms: * - location: '<project-root>/test/fixtures/test-runner/output/global_after_should_fail_the_test.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/global_after_should_fail_the_test.js:4:1' failureType: 'hookFailed' error: 'this should fail the test' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/global_after_should_fail_the_test.js:5:9) + <node-internal-frames> ... 1..1 # tests 1 diff --git a/test/fixtures/test-runner/output/hooks.snapshot b/test/fixtures/test-runner/output/hooks.snapshot index f9cfd9ddb1c206..4a576028d9b98d 100644 --- a/test/fixtures/test-runner/output/hooks.snapshot +++ b/test/fixtures/test-runner/output/hooks.snapshot @@ -50,7 +50,7 @@ ok 2 - describe hooks - no subtests --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/hooks.js:(LINE):3' + location: '<project-root>/test/fixtures/test-runner/output/hooks.js:74:3' failureType: 'cancelledByParent' error: 'test did not finish before its parent and was cancelled' code: 'ERR_TEST_FAILURE' @@ -60,7 +60,7 @@ ok 2 - describe hooks - no subtests --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/hooks.js:(LINE):3' + location: '<project-root>/test/fixtures/test-runner/output/hooks.js:75:3' failureType: 'cancelledByParent' error: 'test did not finish before its parent and was cancelled' code: 'ERR_TEST_FAILURE' @@ -70,38 +70,26 @@ not ok 3 - before throws --- duration_ms: * type: 'suite' - location: '<project-root>/test/fixtures/test-runner/output/hooks.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/hooks.js:72:1' failureType: 'hookFailed' error: 'before' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * - * + SuiteContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:73:24) + <node-internal-frames> ... # Subtest: before throws - no subtests not ok 4 - before throws - no subtests --- duration_ms: * type: 'suite' - location: '<project-root>/test/fixtures/test-runner/output/hooks.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/hooks.js:78:1' failureType: 'hookFailed' error: 'before' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * - * + SuiteContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:79:24) + <node-internal-frames> ... # Subtest: after throws # Subtest: 1 @@ -121,42 +109,26 @@ not ok 5 - after throws --- duration_ms: * type: 'suite' - location: '<project-root>/test/fixtures/test-runner/output/hooks.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/hooks.js:83:1' failureType: 'hookFailed' error: 'after' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * - * - * - * + SuiteContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:84:23) + <node-internal-frames> ... # Subtest: after throws - no subtests not ok 6 - after throws - no subtests --- duration_ms: * type: 'suite' - location: '<project-root>/test/fixtures/test-runner/output/hooks.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/hooks.js:89:1' failureType: 'hookFailed' error: 'after' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * - * - * - * + SuiteContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:90:23) + <node-internal-frames> ... # Subtest: beforeEach throws # Subtest: 1 @@ -164,20 +136,13 @@ not ok 6 - after throws - no subtests --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/hooks.js:(LINE):3' + location: '<project-root>/test/fixtures/test-runner/output/hooks.js:95:3' failureType: 'hookFailed' error: 'beforeEach' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:94:28) + <node-internal-frames> new Promise (<anonymous>) ... # Subtest: 2 @@ -185,20 +150,13 @@ not ok 6 - after throws - no subtests --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/hooks.js:(LINE):3' + location: '<project-root>/test/fixtures/test-runner/output/hooks.js:96:3' failureType: 'hookFailed' error: 'beforeEach' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:94:28) + <node-internal-frames> async Promise.all (index 0) ... 1..2 @@ -206,7 +164,7 @@ not ok 7 - beforeEach throws --- duration_ms: * type: 'suite' - location: '<project-root>/test/fixtures/test-runner/output/hooks.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/hooks.js:93:1' failureType: 'subtestsFailed' error: '2 subtests failed' code: 'ERR_TEST_FAILURE' @@ -217,48 +175,35 @@ not ok 7 - beforeEach throws --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/hooks.js:(LINE):3' + location: '<project-root>/test/fixtures/test-runner/output/hooks.js:101:3' failureType: 'hookFailed' error: 'afterEach' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:100:27) + <node-internal-frames> async Promise.all (index 0) - * + <node-internal-frames> ... # Subtest: 2 not ok 2 - 2 --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/hooks.js:(LINE):3' + location: '<project-root>/test/fixtures/test-runner/output/hooks.js:102:3' failureType: 'hookFailed' error: 'afterEach' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:100:27) + <node-internal-frames> ... 1..2 not ok 8 - afterEach throws --- duration_ms: * type: 'suite' - location: '<project-root>/test/fixtures/test-runner/output/hooks.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/hooks.js:99:1' failureType: 'subtestsFailed' error: '2 subtests failed' code: 'ERR_TEST_FAILURE' @@ -269,20 +214,15 @@ not ok 8 - afterEach throws --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/hooks.js:(LINE):3' + location: '<project-root>/test/fixtures/test-runner/output/hooks.js:107:3' failureType: 'testCodeFailure' error: 'test' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:107:25) + <node-internal-frames> new Promise (<anonymous>) - * - * + <node-internal-frames> Array.map (<anonymous>) ... # Subtest: 2 @@ -296,7 +236,7 @@ not ok 9 - afterEach when test fails --- duration_ms: * type: 'suite' - location: '<project-root>/test/fixtures/test-runner/output/hooks.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/hooks.js:105:1' failureType: 'subtestsFailed' error: '1 subtest failed' code: 'ERR_TEST_FAILURE' @@ -307,20 +247,15 @@ not ok 9 - afterEach when test fails --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/hooks.js:(LINE):3' + location: '<project-root>/test/fixtures/test-runner/output/hooks.js:113:3' failureType: 'testCodeFailure' error: 'test' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:113:25) + <node-internal-frames> new Promise (<anonymous>) - * - * + <node-internal-frames> Array.map (<anonymous>) ... # Subtest: 2 @@ -328,27 +263,20 @@ not ok 9 - afterEach when test fails --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/hooks.js:(LINE):3' + location: '<project-root>/test/fixtures/test-runner/output/hooks.js:114:3' failureType: 'hookFailed' error: 'afterEach' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:112:27) + <node-internal-frames> ... 1..2 not ok 10 - afterEach throws and test fails --- duration_ms: * type: 'suite' - location: '<project-root>/test/fixtures/test-runner/output/hooks.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/hooks.js:111:1' failureType: 'subtestsFailed' error: '2 subtests failed' code: 'ERR_TEST_FAILURE' @@ -403,84 +331,60 @@ ok 12 - test hooks - no subtests --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/hooks.js:(LINE):11' + location: '<project-root>/test/fixtures/test-runner/output/hooks.js:172:11' failureType: 'hookFailed' error: 'before' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:171:26) + <node-internal-frames> + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:171:5) + <node-internal-frames> ... # Subtest: 2 not ok 2 - 2 --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/hooks.js:(LINE):11' + location: '<project-root>/test/fixtures/test-runner/output/hooks.js:173:11' failureType: 'hookFailed' error: 'before' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:171:26) + <node-internal-frames> + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:171:5) + <node-internal-frames> ... 1..2 not ok 13 - t.before throws --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/hooks.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/hooks.js:169:1' failureType: 'testCodeFailure' error: 'before' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:171:26) + <node-internal-frames> + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:171:5) + <node-internal-frames> ... # Subtest: t.before throws - no subtests not ok 14 - t.before throws - no subtests --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/hooks.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/hooks.js:176:1' failureType: 'testCodeFailure' error: 'before' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:178:26) + <node-internal-frames> + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:178:5) + <node-internal-frames> ... # Subtest: t.after throws # Subtest: 1 @@ -500,40 +404,26 @@ not ok 15 - t.after throws --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/hooks.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/hooks.js:181:1' failureType: 'hookFailed' error: 'after' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:183:25) + <node-internal-frames> ... # Subtest: t.after throws - no subtests not ok 16 - t.after throws - no subtests --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/hooks.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/hooks.js:188:1' failureType: 'hookFailed' error: 'after' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:190:25) + <node-internal-frames> ... # Subtest: t.beforeEach throws # Subtest: 1 @@ -541,49 +431,37 @@ not ok 16 - t.after throws - no subtests --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/hooks.js:(LINE):11' + location: '<project-root>/test/fixtures/test-runner/output/hooks.js:197:11' failureType: 'hookFailed' error: 'beforeEach' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:196:30) + <node-internal-frames> + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:197:11) + <node-internal-frames> ... # Subtest: 2 not ok 2 - 2 --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/hooks.js:(LINE):11' + location: '<project-root>/test/fixtures/test-runner/output/hooks.js:198:11' failureType: 'hookFailed' error: 'beforeEach' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:196:30) + <node-internal-frames> + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:198:11) + <node-internal-frames> ... 1..2 not ok 17 - t.beforeEach throws --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/hooks.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/hooks.js:194:1' failureType: 'subtestsFailed' error: '2 subtests failed' code: 'ERR_TEST_FAILURE' @@ -594,49 +472,37 @@ not ok 17 - t.beforeEach throws --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/hooks.js:(LINE):11' + location: '<project-root>/test/fixtures/test-runner/output/hooks.js:204:11' failureType: 'hookFailed' error: 'afterEach' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:203:29) + <node-internal-frames> + async TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:204:3) + <node-internal-frames> ... # Subtest: 2 not ok 2 - 2 --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/hooks.js:(LINE):11' + location: '<project-root>/test/fixtures/test-runner/output/hooks.js:205:11' failureType: 'hookFailed' error: 'afterEach' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:203:29) + <node-internal-frames> + async TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:205:3) + <node-internal-frames> ... 1..2 not ok 18 - t.afterEach throws --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/hooks.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/hooks.js:201:1' failureType: 'subtestsFailed' error: '2 subtests failed' code: 'ERR_TEST_FAILURE' @@ -647,20 +513,15 @@ not ok 18 - t.afterEach throws --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/hooks.js:(LINE):11' + location: '<project-root>/test/fixtures/test-runner/output/hooks.js:212:11' failureType: 'testCodeFailure' error: 'test' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:212:35) + <node-internal-frames> + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:212:11) + <node-internal-frames> ... # Subtest: 2 ok 2 - 2 @@ -673,7 +534,7 @@ not ok 19 - afterEach when test fails --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/hooks.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/hooks.js:209:1' failureType: 'subtestsFailed' error: '1 subtest failed' code: 'ERR_TEST_FAILURE' @@ -697,22 +558,20 @@ ok 20 - afterEach context when test passes --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/hooks.js:(LINE):11' + location: '<project-root>/test/fixtures/test-runner/output/hooks.js:232:11' failureType: 'testCodeFailure' error: 'test' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:226:15) + <node-internal-frames> ... 1..1 not ok 21 - afterEach context when test fails --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/hooks.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/hooks.js:225:1' failureType: 'subtestsFailed' error: '1 subtest failed' code: 'ERR_TEST_FAILURE' @@ -723,48 +582,37 @@ not ok 21 - afterEach context when test fails --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/hooks.js:(LINE):11' + location: '<project-root>/test/fixtures/test-runner/output/hooks.js:238:11' failureType: 'testCodeFailure' error: 'test' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:238:35) + <node-internal-frames> + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:238:11) + <node-internal-frames> ... # Subtest: 2 not ok 2 - 2 --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/hooks.js:(LINE):11' + location: '<project-root>/test/fixtures/test-runner/output/hooks.js:239:11' failureType: 'hookFailed' error: 'afterEach' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:237:29) + <node-internal-frames> + async TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:239:3) + <node-internal-frames> ... 1..2 not ok 22 - afterEach throws and test fails --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/hooks.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/hooks.js:235:1' failureType: 'subtestsFailed' error: '2 subtests failed' code: 'ERR_TEST_FAILURE' @@ -774,15 +622,13 @@ not ok 23 - t.after() is called if test body throws --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/hooks.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/hooks.js:242:1' failureType: 'testCodeFailure' error: 'bye' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:246:9) + <node-internal-frames> ... # - after() called # Subtest: run after when before throws @@ -791,7 +637,7 @@ not ok 23 - t.after() is called if test body throws --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/hooks.js:(LINE):3' + location: '<project-root>/test/fixtures/test-runner/output/hooks.js:254:3' failureType: 'cancelledByParent' error: 'test did not finish before its parent and was cancelled' code: 'ERR_TEST_FAILURE' @@ -801,19 +647,13 @@ not ok 24 - run after when before throws --- duration_ms: * type: 'suite' - location: '<project-root>/test/fixtures/test-runner/output/hooks.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/hooks.js:249:1' failureType: 'hookFailed' error: 'before' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * - * + SuiteContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:253:24) + <node-internal-frames> ... # Subtest: test hooks - async # Subtest: 1 diff --git a/test/fixtures/test-runner/output/hooks_spec_reporter.js b/test/fixtures/test-runner/output/hooks_spec_reporter.js index 75bb4b6be1e908..81a125ab93289a 100644 --- a/test/fixtures/test-runner/output/hooks_spec_reporter.js +++ b/test/fixtures/test-runner/output/hooks_spec_reporter.js @@ -6,6 +6,6 @@ const spawn = require('node:child_process').spawn; const child = spawn(process.execPath, ['--no-warnings', '--test-reporter', 'spec', fixtures.path('test-runner/output/hooks.js')], { stdio: 'pipe' }); -// eslint-disable-next-line no-control-regex -child.stdout.on('data', (d) => process.stdout.write(d.toString().replace(/[^\x00-\x7F]/g, '').replace(/\u001b\[\d+m/g, ''))); + +child.stdout.pipe(process.stdout); child.stderr.pipe(process.stderr); diff --git a/test/fixtures/test-runner/output/hooks_spec_reporter.snapshot b/test/fixtures/test-runner/output/hooks_spec_reporter.snapshot index 8c267672b9a951..e2ad150bb5f7a2 100644 --- a/test/fixtures/test-runner/output/hooks_spec_reporter.snapshot +++ b/test/fixtures/test-runner/output/hooks_spec_reporter.snapshot @@ -1,466 +1,306 @@ - after() called - describe hooks - 1 (*ms) - 2 (*ms) - nested - nested 1 (*ms) - nested 2 (*ms) - nested (*ms) - describe hooks (*ms) - describe hooks - no subtests (*ms) - before throws - 1 - 2 - before throws (*ms) - before throws - no subtests (*ms) - after throws - 1 (*ms) - 2 (*ms) - after throws (*ms) - after throws - no subtests (*ms) - beforeEach throws - 1 (*ms) - 2 (*ms) - beforeEach throws (*ms) - afterEach throws - 1 (*ms) - 2 (*ms) - afterEach throws (*ms) - afterEach when test fails - 1 (*ms) - 2 (*ms) - afterEach when test fails (*ms) - afterEach throws and test fails - 1 (*ms) - 2 (*ms) - afterEach throws and test fails (*ms) - test hooks - 1 (*ms) - 2 (*ms) - nested - nested 1 (*ms) - nested 2 (*ms) - nested (*ms) - test hooks (*ms) - test hooks - no subtests (*ms) - t.before throws - 1 (*ms) - 2 (*ms) - t.before throws (*ms) - t.before throws - no subtests (*ms) - t.after throws - 1 (*ms) - 2 (*ms) - t.after throws (*ms) - t.after throws - no subtests (*ms) - t.beforeEach throws - 1 (*ms) - 2 (*ms) - t.beforeEach throws (*ms) - t.afterEach throws - 1 (*ms) - 2 (*ms) - t.afterEach throws (*ms) - afterEach when test fails - 1 (*ms) - 2 (*ms) - afterEach when test fails (*ms) - afterEach context when test passes - 1 (*ms) - afterEach context when test passes (*ms) - afterEach context when test fails - 1 (*ms) - afterEach context when test fails (*ms) - afterEach throws and test fails - 1 (*ms) - 2 (*ms) - afterEach throws and test fails (*ms) - t.after() is called if test body throws (*ms) - - after() called - run after when before throws - 1 - run after when before throws (*ms) - test hooks - async - 1 (*ms) - 2 (*ms) - test hooks - async (*ms) - before 1 called - before 2 called - after 1 called - after 2 called - tests 52 - suites 12 - pass 22 - fail 27 - cancelled 3 - skipped 0 - todo 0 - duration_ms * +▶ describe hooks + ✔ 1 (*ms) + ✔ 2 (*ms) + ▶ nested + ✔ nested 1 (*ms) + ✔ nested 2 (*ms) + ✔ nested (*ms) +✔ describe hooks (*ms) +✔ describe hooks - no subtests (*ms) +▶ before throws + ✖ 1 + ✖ 2 +✖ before throws (*ms) +✖ before throws - no subtests (*ms) +▶ after throws + ✔ 1 (*ms) + ✔ 2 (*ms) +✖ after throws (*ms) +✖ after throws - no subtests (*ms) +▶ beforeEach throws + ✖ 1 (*ms) + ✖ 2 (*ms) +✖ beforeEach throws (*ms) +▶ afterEach throws + ✖ 1 (*ms) + ✖ 2 (*ms) +✖ afterEach throws (*ms) +▶ afterEach when test fails + ✖ 1 (*ms) + ✔ 2 (*ms) +✖ afterEach when test fails (*ms) +▶ afterEach throws and test fails + ✖ 1 (*ms) + ✖ 2 (*ms) +✖ afterEach throws and test fails (*ms) +▶ test hooks + ✔ 1 (*ms) + ✔ 2 (*ms) + ▶ nested + ✔ nested 1 (*ms) + ✔ nested 2 (*ms) + ✔ nested (*ms) +✔ test hooks (*ms) +✔ test hooks - no subtests (*ms) +▶ t.before throws + ✖ 1 (*ms) + ✖ 2 (*ms) +✖ t.before throws (*ms) +✖ t.before throws - no subtests (*ms) +▶ t.after throws + ✔ 1 (*ms) + ✔ 2 (*ms) +✖ t.after throws (*ms) +✖ t.after throws - no subtests (*ms) +▶ t.beforeEach throws + ✖ 1 (*ms) + ✖ 2 (*ms) +✖ t.beforeEach throws (*ms) +▶ t.afterEach throws + ✖ 1 (*ms) + ✖ 2 (*ms) +✖ t.afterEach throws (*ms) +▶ afterEach when test fails + ✖ 1 (*ms) + ✔ 2 (*ms) +✖ afterEach when test fails (*ms) +▶ afterEach context when test passes + ✔ 1 (*ms) +✔ afterEach context when test passes (*ms) +▶ afterEach context when test fails + ✖ 1 (*ms) +✖ afterEach context when test fails (*ms) +▶ afterEach throws and test fails + ✖ 1 (*ms) + ✖ 2 (*ms) +✖ afterEach throws and test fails (*ms) +✖ t.after() is called if test body throws (*ms) +ℹ - after() called +▶ run after when before throws + ✖ 1 +✖ run after when before throws (*ms) +▶ test hooks - async + ✔ 1 (*ms) + ✔ 2 (*ms) +✔ test hooks - async (*ms) +ℹ before 1 called +ℹ before 2 called +ℹ after 1 called +ℹ after 2 called +ℹ tests 52 +ℹ suites 12 +ℹ pass 22 +ℹ fail 27 +ℹ cancelled 3 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms * - failing tests: +✖ failing tests: -* - 1 +test at test/fixtures/test-runner/output/hooks.js:74:3 +✖ 1 'test did not finish before its parent and was cancelled' -* - 2 +test at test/fixtures/test-runner/output/hooks.js:75:3 +✖ 2 'test did not finish before its parent and was cancelled' -* - before throws (*ms) +test at test/fixtures/test-runner/output/hooks.js:72:1 +✖ before throws (*ms) Error: before - * - * - * - * - * - * - * - * + at SuiteContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:73:24) + at <node-internal-frames> -* - before throws - no subtests (*ms) +test at test/fixtures/test-runner/output/hooks.js:78:1 +✖ before throws - no subtests (*ms) Error: before - * - * - * - * - * - * - * - * + at SuiteContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:79:24) + at <node-internal-frames> -* - after throws (*ms) +test at test/fixtures/test-runner/output/hooks.js:83:1 +✖ after throws (*ms) Error: after - * - * - * - * - * - * - * - * - * - * + at SuiteContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:84:23) + at <node-internal-frames> -* - after throws - no subtests (*ms) +test at test/fixtures/test-runner/output/hooks.js:89:1 +✖ after throws - no subtests (*ms) Error: after - * - * - * - * - * - * - * - * - * - * + at SuiteContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:90:23) + at <node-internal-frames> -* - 1 (*ms) +test at test/fixtures/test-runner/output/hooks.js:95:3 +✖ 1 (*ms) Error: beforeEach - * - * - * - * - * - * - * - * - * + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:94:28) + at <node-internal-frames> at new Promise (<anonymous>) -* - 2 (*ms) +test at test/fixtures/test-runner/output/hooks.js:96:3 +✖ 2 (*ms) Error: beforeEach - * - * - * - * - * - * - * - * - * + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:94:28) + at <node-internal-frames> at async Promise.all (index 0) -* - 1 (*ms) +test at test/fixtures/test-runner/output/hooks.js:101:3 +✖ 1 (*ms) Error: afterEach - * - * - * - * - * - * - * - * + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:100:27) + at <node-internal-frames> at async Promise.all (index 0) - * + at <node-internal-frames> -* - 2 (*ms) +test at test/fixtures/test-runner/output/hooks.js:102:3 +✖ 2 (*ms) Error: afterEach - * - * - * - * - * - * - * - * - * + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:100:27) + at <node-internal-frames> -* - 1 (*ms) +test at test/fixtures/test-runner/output/hooks.js:107:3 +✖ 1 (*ms) Error: test - * - * - * - * - * - * + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:107:25) + at <node-internal-frames> at new Promise (<anonymous>) - * - * + at <node-internal-frames> at Array.map (<anonymous>) -* - 1 (*ms) +test at test/fixtures/test-runner/output/hooks.js:113:3 +✖ 1 (*ms) Error: test - * - * - * - * - * - * + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:113:25) + at <node-internal-frames> at new Promise (<anonymous>) - * - * + at <node-internal-frames> at Array.map (<anonymous>) -* - 2 (*ms) +test at test/fixtures/test-runner/output/hooks.js:114:3 +✖ 2 (*ms) Error: afterEach - * - * - * - * - * - * - * - * - * + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:112:27) + at <node-internal-frames> -* - 1 (*ms) +test at test/fixtures/test-runner/output/hooks.js:172:11 +✖ 1 (*ms) Error: before - * - * - * - * - * - * - * - * - * - * + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:171:26) + at <node-internal-frames> + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:171:5) + at <node-internal-frames> -* - 2 (*ms) +test at test/fixtures/test-runner/output/hooks.js:173:11 +✖ 2 (*ms) Error: before - * - * - * - * - * - * - * - * - * - * + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:171:26) + at <node-internal-frames> + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:171:5) + at <node-internal-frames> -* - t.before throws (*ms) +test at test/fixtures/test-runner/output/hooks.js:169:1 +✖ t.before throws (*ms) Error: before - * - * - * - * - * - * - * - * - * - * + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:171:26) + at <node-internal-frames> + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:171:5) + at <node-internal-frames> -* - t.before throws - no subtests (*ms) +test at test/fixtures/test-runner/output/hooks.js:176:1 +✖ t.before throws - no subtests (*ms) Error: before - * - * - * - * - * - * - * - * - * - * + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:178:26) + at <node-internal-frames> + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:178:5) + at <node-internal-frames> -* - t.after throws (*ms) +test at test/fixtures/test-runner/output/hooks.js:181:1 +✖ t.after throws (*ms) Error: after - * - * - * - * - * - * - * - * - * + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:183:25) + at <node-internal-frames> -* - t.after throws - no subtests (*ms) +test at test/fixtures/test-runner/output/hooks.js:188:1 +✖ t.after throws - no subtests (*ms) Error: after - * - * - * - * - * - * - * - * - * + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:190:25) + at <node-internal-frames> -* - 1 (*ms) +test at test/fixtures/test-runner/output/hooks.js:197:11 +✖ 1 (*ms) Error: beforeEach - * - * - * - * - * - * - * - * - * - * + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:196:30) + at <node-internal-frames> + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:197:11) + at <node-internal-frames> -* - 2 (*ms) +test at test/fixtures/test-runner/output/hooks.js:198:11 +✖ 2 (*ms) Error: beforeEach - * - * - * - * - * - * - * - * - * - * + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:196:30) + at <node-internal-frames> + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:198:11) + at <node-internal-frames> -* - 1 (*ms) +test at test/fixtures/test-runner/output/hooks.js:204:11 +✖ 1 (*ms) Error: afterEach - * - * - * - * - * - * - * - * - * - * + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:203:29) + at <node-internal-frames> + at async TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:204:3) + at <node-internal-frames> -* - 2 (*ms) +test at test/fixtures/test-runner/output/hooks.js:205:11 +✖ 2 (*ms) Error: afterEach - * - * - * - * - * - * - * - * - * - * + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:203:29) + at <node-internal-frames> + at async TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:205:3) + at <node-internal-frames> -* - 1 (*ms) +test at test/fixtures/test-runner/output/hooks.js:212:11 +✖ 1 (*ms) Error: test - * - * - * - * - * - * - * - * - * + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:212:35) + at <node-internal-frames> + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:212:11) + at <node-internal-frames> -* - 1 (*ms) +test at test/fixtures/test-runner/output/hooks.js:232:11 +✖ 1 (*ms) Error: test - * - * - * - * + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:226:15) + at <node-internal-frames> -* - 1 (*ms) +test at test/fixtures/test-runner/output/hooks.js:238:11 +✖ 1 (*ms) Error: test - * - * - * - * - * - * - * - * - * + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:238:35) + at <node-internal-frames> + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:238:11) + at <node-internal-frames> -* - 2 (*ms) +test at test/fixtures/test-runner/output/hooks.js:239:11 +✖ 2 (*ms) Error: afterEach - * - * - * - * - * - * - * - * - * - * + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:237:29) + at <node-internal-frames> + at async TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:239:3) + at <node-internal-frames> -* - t.after() is called if test body throws (*ms) +test at test/fixtures/test-runner/output/hooks.js:242:1 +✖ t.after() is called if test body throws (*ms) Error: bye - * - * - * - * + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:246:9) + at <node-internal-frames> -* - 1 +test at test/fixtures/test-runner/output/hooks.js:254:3 +✖ 1 'test did not finish before its parent and was cancelled' -* - run after when before throws (*ms) +test at test/fixtures/test-runner/output/hooks.js:249:1 +✖ run after when before throws (*ms) Error: before - * - * - * - * - * - * - * - * + at SuiteContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/hooks.js:253:24) + at <node-internal-frames> diff --git a/test/fixtures/test-runner/output/junit_reporter.snapshot b/test/fixtures/test-runner/output/junit_reporter.snapshot index 5441bafe360ca2..1142b5b31ff2e7 100644 --- a/test/fixtures/test-runner/output/junit_reporter.snapshot +++ b/test/fixtures/test-runner/output/junit_reporter.snapshot @@ -23,13 +23,8 @@ code: 'ERR_TEST_FAILURE', failureType: 'testCodeFailure', cause: Error: thrown from sync fail todo - * - * - * - * - * - * - * + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:42:9) + at <node-internal-frames> } </failure> </testcase> @@ -40,13 +35,8 @@ code: 'ERR_TEST_FAILURE', failureType: 'testCodeFailure', cause: Error: thrown from sync fail todo with message - * - * - * - * - * - * - * + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:47:9) + at <node-internal-frames> } </failure> </testcase> @@ -64,13 +54,8 @@ code: 'ERR_TEST_FAILURE', failureType: 'testCodeFailure', cause: Error: thrown from sync throw fail - * - * - * - * - * - * - * + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:63:9) + at <node-internal-frames> } </failure> </testcase> @@ -84,13 +69,8 @@ code: 'ERR_TEST_FAILURE', failureType: 'testCodeFailure', cause: Error: thrown from async throw fail - * - * - * - * - * - * - * + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:75:9) + at <node-internal-frames> } </failure> </testcase> @@ -101,13 +81,8 @@ code: 'ERR_TEST_FAILURE', failureType: 'testCodeFailure', cause: Error: thrown from async throw fail - * - * - * - * - * - * - * + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:80:9) + at <node-internal-frames> } </failure> </testcase> @@ -123,13 +98,9 @@ true !== false true !== false - * - * - * - * - * - * - * { + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:85:10) + at <node-internal-frames> + at <node-internal-frames> { generatedMessage: true, code: 'ERR_ASSERTION', actual: true, @@ -147,13 +118,8 @@ true !== false code: 'ERR_TEST_FAILURE', failureType: 'testCodeFailure', cause: Error: rejected from reject fail - * - * - * - * - * - * - * + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:93:25) + at <node-internal-frames> } </failure> </testcase> @@ -166,21 +132,15 @@ true !== false <testcase name="+sync throw fail" time="*" classname="test" file="*" failure="thrown from subtest sync throw fail"> <failure type="testCodeFailure" message="thrown from subtest sync throw fail"> Error [ERR_TEST_FAILURE]: thrown from subtest sync throw fail - * - * { + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:125:11) + at <node-internal-frames> { code: 'ERR_TEST_FAILURE', failureType: 'testCodeFailure', cause: Error: thrown from subtest sync throw fail - * - * - * - * - * - * - * - * - * - * + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:127:11) + at <node-internal-frames> + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:125:11) + at <node-internal-frames> } </failure> </testcase> @@ -216,13 +176,8 @@ Error [ERR_TEST_FAILURE]: thrown from subtest sync throw fail code: 'ERR_TEST_FAILURE', failureType: 'testCodeFailure', cause: Error: this should be executed - * - * - * - * - * - * - * + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:212:9) + at <node-internal-frames> } </failure> </testcase> @@ -247,8 +202,8 @@ Error [ERR_TEST_FAILURE]: thrown from subtest sync throw fail code: 'ERR_TEST_FAILURE', failureType: 'testCodeFailure', cause: Error: callback failure - * - * + at Immediate.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:245:10) + at <node-internal-frames> } </failure> </testcase> @@ -266,21 +221,16 @@ Error [ERR_TEST_FAILURE]: thrown from subtest sync throw fail code: 'ERR_TEST_FAILURE', failureType: 'testCodeFailure', cause: Error: thrown from callback throw - * - * - * - * - * - * - * + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:267:9) + at <node-internal-frames> } </failure> </testcase> <testcase name="callback called twice" time="*" classname="test" file="*" failure="callback invoked multiple times"> <failure type="multipleCallbackInvocations" message="callback invoked multiple times"> Error [ERR_TEST_FAILURE]: callback invoked multiple times - * - * { + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:272:3) + at <node-internal-frames> { code: 'ERR_TEST_FAILURE', failureType: 'multipleCallbackInvocations', cause: 'callback invoked multiple times' @@ -291,11 +241,11 @@ Error [ERR_TEST_FAILURE]: callback invoked multiple times <testcase name="callback called twice in future tick" time="*" classname="test" file="*" failure="callback invoked multiple times"> <failure type="uncaughtException" message="callback invoked multiple times"> Error [ERR_TEST_FAILURE]: callback invoked multiple times - * { + at <node-internal-frames> { code: 'ERR_TEST_FAILURE', failureType: 'uncaughtException', cause: Error [ERR_TEST_FAILURE]: callback invoked multiple times - * { + at Immediate.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:283:5) { code: 'ERR_TEST_FAILURE', failureType: 'multipleCallbackInvocations', cause: 'callback invoked multiple times' @@ -306,12 +256,12 @@ Error [ERR_TEST_FAILURE]: callback invoked multiple times <testcase name="callback async throw" time="*" classname="test" file="*" failure="thrown from callback async throw"> <failure type="uncaughtException" message="thrown from callback async throw"> Error [ERR_TEST_FAILURE]: thrown from callback async throw - * { + at <node-internal-frames> { code: 'ERR_TEST_FAILURE', failureType: 'uncaughtException', cause: Error: thrown from callback async throw - * - * + at Immediate.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:289:11) + at <node-internal-frames> } </failure> </testcase> @@ -342,39 +292,29 @@ Error [ERR_TEST_FAILURE]: thrown from callback async throw <testcase name="sync throw fails at first" time="*" classname="test" file="*" failure="thrown from subtest sync throw fails at first"> <failure type="testCodeFailure" message="thrown from subtest sync throw fails at first"> Error [ERR_TEST_FAILURE]: thrown from subtest sync throw fails at first - * - * { + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:334:11) + at <node-internal-frames> { code: 'ERR_TEST_FAILURE', failureType: 'testCodeFailure', cause: Error: thrown from subtest sync throw fails at first - * - * - * - * - * - * - * - * - * - * + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:335:11) + at <node-internal-frames> + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:334:11) + at <node-internal-frames> } </failure> </testcase> <testcase name="sync throw fails at second" time="*" classname="test" file="*" failure="thrown from subtest sync throw fails at second"> <failure type="testCodeFailure" message="thrown from subtest sync throw fails at second"> Error [ERR_TEST_FAILURE]: thrown from subtest sync throw fails at second - * { + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:337:11) { code: 'ERR_TEST_FAILURE', failureType: 'testCodeFailure', cause: Error: thrown from subtest sync throw fails at second - * - * - * - * - * - * - * - * + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:338:11) + at <node-internal-frames> + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:337:11) + at <node-internal-frames> } </failure> </testcase> @@ -400,26 +340,24 @@ Error [ERR_TEST_FAILURE]: thrown from subtest sync throw fails at second <testcase name="unfinished test with uncaughtException" time="*" classname="test" file="*" failure="foo"> <failure type="uncaughtException" message="foo"> Error [ERR_TEST_FAILURE]: foo - * { + at <node-internal-frames> { code: 'ERR_TEST_FAILURE', failureType: 'uncaughtException', cause: Error: foo - * - * - * + at Timeout._onTimeout (<project-root>/test/fixtures/test-runner/output/output.js:393:30) + at <node-internal-frames> } </failure> </testcase> <testcase name="unfinished test with unhandledRejection" time="*" classname="test" file="*" failure="bar"> <failure type="unhandledRejection" message="bar"> Error [ERR_TEST_FAILURE]: bar - * { + at <node-internal-frames> { code: 'ERR_TEST_FAILURE', failureType: 'unhandledRejection', cause: Error: bar - * - * - * + at Timeout._onTimeout (<project-root>/test/fixtures/test-runner/output/output.js:399:37) + at <node-internal-frames> } </failure> </testcase> @@ -497,7 +435,7 @@ should loosely deep-equal c: [Circular *1] } } - * { + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:425:12) { generatedMessage: true, code: 'ERR_ASSERTION', actual: [Object], @@ -511,7 +449,7 @@ should loosely deep-equal <testcase name="invalid subtest fail" time="*" classname="test" file="*" failure="test could not be started because its parent finished"> <failure type="parentAlreadyFinished" message="test could not be started because its parent finished"> Error [ERR_TEST_FAILURE]: test could not be started because its parent finished - * { + at Immediate.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:197:7) { code: 'ERR_TEST_FAILURE', failureType: 'parentAlreadyFinished', cause: 'test could not be started because its parent finished' diff --git a/test/fixtures/test-runner/output/output.snapshot b/test/fixtures/test-runner/output/output.snapshot index b99744c9f12a2a..79ac90bd667dda 100644 --- a/test/fixtures/test-runner/output/output.snapshot +++ b/test/fixtures/test-runner/output/output.snapshot @@ -52,36 +52,26 @@ not ok 9 - sync fail todo # TODO --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:40:1' failureType: 'testCodeFailure' error: 'thrown from sync fail todo' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:42:9) + <node-internal-frames> ... # Subtest: sync fail todo with message not ok 10 - sync fail todo with message # TODO this is a failing todo --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:45:1' failureType: 'testCodeFailure' error: 'thrown from sync fail todo with message' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:47:9) + <node-internal-frames> ... # Subtest: sync skip pass ok 11 - sync skip pass # SKIP @@ -107,18 +97,13 @@ not ok 14 - sync throw fail --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:62:1' failureType: 'testCodeFailure' error: 'thrown from sync throw fail' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:63:9) + <node-internal-frames> ... # Subtest: async skip pass ok 15 - async skip pass # SKIP @@ -137,43 +122,33 @@ not ok 17 - async throw fail --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:74:1' failureType: 'testCodeFailure' error: 'thrown from async throw fail' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:75:9) + <node-internal-frames> ... # Subtest: async skip fail not ok 18 - async skip fail # SKIP --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:78:1' failureType: 'testCodeFailure' error: 'thrown from async throw fail' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:80:9) + <node-internal-frames> ... # Subtest: async assertion fail not ok 19 - async assertion fail --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:83:1' failureType: 'testCodeFailure' error: |- Expected values to be strictly equal: @@ -186,13 +161,8 @@ not ok 19 - async assertion fail actual: true operator: 'strictEqual' stack: |- - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:85:10) + <node-internal-frames> ... # Subtest: resolve pass ok 20 - resolve pass @@ -205,18 +175,13 @@ not ok 21 - reject fail --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:92:1' failureType: 'testCodeFailure' error: 'rejected from reject fail' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:93:25) + <node-internal-frames> ... # Subtest: unhandled rejection - passes but warns ok 22 - unhandled rejection - passes but warns @@ -254,21 +219,15 @@ ok 26 - immediate resolve pass --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):11' + location: '<project-root>/test/fixtures/test-runner/output/output.js:125:11' failureType: 'testCodeFailure' error: 'thrown from subtest sync throw fail' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:127:11) + <node-internal-frames> + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:125:11) + <node-internal-frames> ... # this subtest should make its parent test fail 1..1 @@ -276,7 +235,7 @@ not ok 27 - subtest sync throw fail --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:124:1' failureType: 'subtestsFailed' error: '1 subtest failed' code: 'ERR_TEST_FAILURE' @@ -286,7 +245,7 @@ not ok 28 - sync throw non-error fail --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:131:1' failureType: 'testCodeFailure' error: 'Symbol(thrown symbol from sync throw non-error fail)' code: 'ERR_TEST_FAILURE' @@ -371,18 +330,13 @@ not ok 34 - sync skip option is false fail --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:211:1' failureType: 'testCodeFailure' error: 'this should be executed' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:212:9) + <node-internal-frames> ... # Subtest: <anonymous> ok 35 - <anonymous> @@ -443,13 +397,13 @@ not ok 44 - callback fail --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:243:1' failureType: 'testCodeFailure' error: 'callback failure' code: 'ERR_TEST_FAILURE' stack: |- - * - * + Immediate.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:245:10) + <node-internal-frames> ... # Subtest: sync t is this in test ok 45 - sync t is this in test @@ -474,7 +428,7 @@ not ok 48 - callback also returns a Promise --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:262:1' failureType: 'callbackAndPromisePresent' error: 'passed a callback but also returned a Promise' code: 'ERR_TEST_FAILURE' @@ -484,31 +438,26 @@ not ok 49 - callback throw --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:266:1' failureType: 'testCodeFailure' error: 'thrown from callback throw' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:267:9) + <node-internal-frames> ... # Subtest: callback called twice not ok 50 - callback called twice --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:270:1' failureType: 'multipleCallbackInvocations' error: 'callback invoked multiple times' code: 'ERR_TEST_FAILURE' stack: |- - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:272:3) + <node-internal-frames> ... # Subtest: callback called twice in different ticks ok 51 - callback called twice in different ticks @@ -521,25 +470,25 @@ not ok 52 - callback called twice in future tick --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:280:1' failureType: 'uncaughtException' error: 'callback invoked multiple times' code: 'ERR_TEST_FAILURE' stack: |- - * + Immediate.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:283:5) ... # Subtest: callback async throw not ok 53 - callback async throw --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:287:1' failureType: 'uncaughtException' error: 'thrown from callback async throw' code: 'ERR_TEST_FAILURE' stack: |- - * - * + Immediate.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:289:11) + <node-internal-frames> ... # Subtest: callback async throw after done ok 54 - callback async throw after done @@ -577,7 +526,7 @@ not ok 56 - custom inspect symbol fail --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:311:1' failureType: 'testCodeFailure' error: 'customized' code: 'ERR_TEST_FAILURE' @@ -587,7 +536,7 @@ not ok 57 - custom inspect symbol that throws fail --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:322:1' failureType: 'testCodeFailure' error: |- { @@ -602,47 +551,37 @@ not ok 57 - custom inspect symbol that throws fail --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):11' + location: '<project-root>/test/fixtures/test-runner/output/output.js:334:11' failureType: 'testCodeFailure' error: 'thrown from subtest sync throw fails at first' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:335:11) + <node-internal-frames> + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:334:11) + <node-internal-frames> ... # Subtest: sync throw fails at second not ok 2 - sync throw fails at second --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):11' + location: '<project-root>/test/fixtures/test-runner/output/output.js:337:11' failureType: 'testCodeFailure' error: 'thrown from subtest sync throw fails at second' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:338:11) + <node-internal-frames> + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:337:11) + <node-internal-frames> ... 1..2 not ok 58 - subtest sync throw fails --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:333:1' failureType: 'subtestsFailed' error: '2 subtests failed' code: 'ERR_TEST_FAILURE' @@ -652,7 +591,7 @@ not ok 59 - timed out async test --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:342:1' failureType: 'testTimeoutFailure' error: 'test timed out after 5ms' code: 'ERR_TEST_FAILURE' @@ -662,7 +601,7 @@ not ok 60 - timed out callback test --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:351:1' failureType: 'testTimeoutFailure' error: 'test timed out after 5ms' code: 'ERR_TEST_FAILURE' @@ -690,7 +629,7 @@ not ok 64 - rejected thenable --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:380:1' failureType: 'testCodeFailure' error: 'custom error' code: 'ERR_TEST_FAILURE' @@ -700,35 +639,33 @@ not ok 65 - unfinished test with uncaughtException --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:391:1' failureType: 'uncaughtException' error: 'foo' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * + Timeout._onTimeout (<project-root>/test/fixtures/test-runner/output/output.js:393:30) + <node-internal-frames> ... # Subtest: unfinished test with unhandledRejection not ok 66 - unfinished test with unhandledRejection --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:397:1' failureType: 'unhandledRejection' error: 'bar' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * + Timeout._onTimeout (<project-root>/test/fixtures/test-runner/output/output.js:399:37) + <node-internal-frames> ... # Subtest: assertion errors display actual and expected properly not ok 67 - assertion errors display actual and expected properly --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:409:1' failureType: 'testCodeFailure' error: |- Expected values to be loosely deep-equal: @@ -791,28 +728,28 @@ not ok 67 - assertion errors display actual and expected properly string: 'Hello' operator: 'deepEqual' stack: |- - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:425:12) ... # Subtest: invalid subtest fail not ok 68 - invalid subtest fail --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):7' + location: '<project-root>/test/fixtures/test-runner/output/output.js:197:7' failureType: 'parentAlreadyFinished' error: 'test could not be started because its parent finished' code: 'ERR_TEST_FAILURE' stack: |- - * + Immediate.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:197:7) ... 1..68 -# Error: Test "unhandled rejection - passes but warns" at test/fixtures/test-runner/output/output.js:(LINE):1 generated asynchronous activity after the test ended. This activity created the error "Error: rejected from unhandled rejection fail" and would have caused the test to fail, but instead triggered an unhandledRejection event. -# Error: Test "async unhandled rejection - passes but warns" at test/fixtures/test-runner/output/output.js:(LINE):1 generated asynchronous activity after the test ended. This activity created the error "Error: rejected from async unhandled rejection fail" and would have caused the test to fail, but instead triggered an unhandledRejection event. +# Error: Test "unhandled rejection - passes but warns" at test/fixtures/test-runner/output/output.js:96:1 generated asynchronous activity after the test ended. This activity created the error "Error: rejected from unhandled rejection fail" and would have caused the test to fail, but instead triggered an unhandledRejection event. +# Error: Test "async unhandled rejection - passes but warns" at test/fixtures/test-runner/output/output.js:100:1 generated asynchronous activity after the test ended. This activity created the error "Error: rejected from async unhandled rejection fail" and would have caused the test to fail, but instead triggered an unhandledRejection event. # Error: A resource generated asynchronous activity after the test ended. This activity created the error "Error: uncaught from outside of a test" which triggered an uncaughtException event, caught by the test runner. -# Error: Test "immediate throw - passes but warns" at test/fixtures/test-runner/output/output.js:(LINE):1 generated asynchronous activity after the test ended. This activity created the error "Error: thrown from immediate throw fail" and would have caused the test to fail, but instead triggered an uncaughtException event. -# Error: Test "immediate reject - passes but warns" at test/fixtures/test-runner/output/output.js:(LINE):1 generated asynchronous activity after the test ended. This activity created the error "Error: rejected from immediate reject fail" and would have caused the test to fail, but instead triggered an unhandledRejection event. -# Error: Test "callback called twice in different ticks" at test/fixtures/test-runner/output/output.js:(LINE):1 generated asynchronous activity after the test ended. This activity created the error "Error [ERR_TEST_FAILURE]: callback invoked multiple times" and would have caused the test to fail, but instead triggered an uncaughtException event. -# Error: Test "callback async throw after done" at test/fixtures/test-runner/output/output.js:(LINE):1 generated asynchronous activity after the test ended. This activity created the error "Error: thrown from callback async throw after done" and would have caused the test to fail, but instead triggered an uncaughtException event. +# Error: Test "immediate throw - passes but warns" at test/fixtures/test-runner/output/output.js:104:1 generated asynchronous activity after the test ended. This activity created the error "Error: thrown from immediate throw fail" and would have caused the test to fail, but instead triggered an uncaughtException event. +# Error: Test "immediate reject - passes but warns" at test/fixtures/test-runner/output/output.js:110:1 generated asynchronous activity after the test ended. This activity created the error "Error: rejected from immediate reject fail" and would have caused the test to fail, but instead triggered an unhandledRejection event. +# Error: Test "callback called twice in different ticks" at test/fixtures/test-runner/output/output.js:275:1 generated asynchronous activity after the test ended. This activity created the error "Error [ERR_TEST_FAILURE]: callback invoked multiple times" and would have caused the test to fail, but instead triggered an uncaughtException event. +# Error: Test "callback async throw after done" at test/fixtures/test-runner/output/output.js:293:1 generated asynchronous activity after the test ended. This activity created the error "Error: thrown from callback async throw after done" and would have caused the test to fail, but instead triggered an uncaughtException event. # tests 81 # suites 0 # pass 40 diff --git a/test/fixtures/test-runner/output/output_cli.snapshot b/test/fixtures/test-runner/output/output_cli.snapshot index 25392dafaa0574..27a144d3e8043a 100644 --- a/test/fixtures/test-runner/output/output_cli.snapshot +++ b/test/fixtures/test-runner/output/output_cli.snapshot @@ -52,36 +52,26 @@ not ok 9 - sync fail todo # TODO --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:40:1' failureType: 'testCodeFailure' error: 'thrown from sync fail todo' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:42:9) + <node-internal-frames> ... # Subtest: sync fail todo with message not ok 10 - sync fail todo with message # TODO this is a failing todo --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:45:1' failureType: 'testCodeFailure' error: 'thrown from sync fail todo with message' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:47:9) + <node-internal-frames> ... # Subtest: sync skip pass ok 11 - sync skip pass # SKIP @@ -107,18 +97,13 @@ not ok 14 - sync throw fail --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:62:1' failureType: 'testCodeFailure' error: 'thrown from sync throw fail' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:63:9) + <node-internal-frames> ... # Subtest: async skip pass ok 15 - async skip pass # SKIP @@ -137,43 +122,33 @@ not ok 17 - async throw fail --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:74:1' failureType: 'testCodeFailure' error: 'thrown from async throw fail' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:75:9) + <node-internal-frames> ... # Subtest: async skip fail not ok 18 - async skip fail # SKIP --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:78:1' failureType: 'testCodeFailure' error: 'thrown from async throw fail' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:80:9) + <node-internal-frames> ... # Subtest: async assertion fail not ok 19 - async assertion fail --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:83:1' failureType: 'testCodeFailure' error: |- Expected values to be strictly equal: @@ -186,13 +161,8 @@ not ok 19 - async assertion fail actual: true operator: 'strictEqual' stack: |- - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:85:10) + <node-internal-frames> ... # Subtest: resolve pass ok 20 - resolve pass @@ -205,18 +175,13 @@ not ok 21 - reject fail --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:92:1' failureType: 'testCodeFailure' error: 'rejected from reject fail' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:93:25) + <node-internal-frames> ... # Subtest: unhandled rejection - passes but warns ok 22 - unhandled rejection - passes but warns @@ -254,21 +219,15 @@ ok 26 - immediate resolve pass --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):11' + location: '<project-root>/test/fixtures/test-runner/output/output.js:125:11' failureType: 'testCodeFailure' error: 'thrown from subtest sync throw fail' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:127:11) + <node-internal-frames> + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:125:11) + <node-internal-frames> ... # this subtest should make its parent test fail 1..1 @@ -276,7 +235,7 @@ not ok 27 - subtest sync throw fail --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:124:1' failureType: 'subtestsFailed' error: '1 subtest failed' code: 'ERR_TEST_FAILURE' @@ -286,7 +245,7 @@ not ok 28 - sync throw non-error fail --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:131:1' failureType: 'testCodeFailure' error: 'Symbol(thrown symbol from sync throw non-error fail)' code: 'ERR_TEST_FAILURE' @@ -371,18 +330,13 @@ not ok 34 - sync skip option is false fail --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:211:1' failureType: 'testCodeFailure' error: 'this should be executed' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:212:9) + <node-internal-frames> ... # Subtest: <anonymous> ok 35 - <anonymous> @@ -443,13 +397,13 @@ not ok 44 - callback fail --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:243:1' failureType: 'testCodeFailure' error: 'callback failure' code: 'ERR_TEST_FAILURE' stack: |- - * - * + Immediate.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:245:10) + <node-internal-frames> ... # Subtest: sync t is this in test ok 45 - sync t is this in test @@ -474,7 +428,7 @@ not ok 48 - callback also returns a Promise --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:262:1' failureType: 'callbackAndPromisePresent' error: 'passed a callback but also returned a Promise' code: 'ERR_TEST_FAILURE' @@ -484,31 +438,26 @@ not ok 49 - callback throw --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:266:1' failureType: 'testCodeFailure' error: 'thrown from callback throw' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:267:9) + <node-internal-frames> ... # Subtest: callback called twice not ok 50 - callback called twice --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:270:1' failureType: 'multipleCallbackInvocations' error: 'callback invoked multiple times' code: 'ERR_TEST_FAILURE' stack: |- - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:272:3) + <node-internal-frames> ... # Subtest: callback called twice in different ticks ok 51 - callback called twice in different ticks @@ -521,25 +470,25 @@ not ok 52 - callback called twice in future tick --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:280:1' failureType: 'uncaughtException' error: 'callback invoked multiple times' code: 'ERR_TEST_FAILURE' stack: |- - * + Immediate.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:283:5) ... # Subtest: callback async throw not ok 53 - callback async throw --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:287:1' failureType: 'uncaughtException' error: 'thrown from callback async throw' code: 'ERR_TEST_FAILURE' stack: |- - * - * + Immediate.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:289:11) + <node-internal-frames> ... # Subtest: callback async throw after done ok 54 - callback async throw after done @@ -585,7 +534,7 @@ not ok 56 - custom inspect symbol fail --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:311:1' failureType: 'testCodeFailure' error: 'customized' code: 'ERR_TEST_FAILURE' @@ -595,7 +544,7 @@ not ok 57 - custom inspect symbol that throws fail --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:322:1' failureType: 'testCodeFailure' error: |- { @@ -610,47 +559,37 @@ not ok 57 - custom inspect symbol that throws fail --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):11' + location: '<project-root>/test/fixtures/test-runner/output/output.js:334:11' failureType: 'testCodeFailure' error: 'thrown from subtest sync throw fails at first' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:335:11) + <node-internal-frames> + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:334:11) + <node-internal-frames> ... # Subtest: sync throw fails at second not ok 2 - sync throw fails at second --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):11' + location: '<project-root>/test/fixtures/test-runner/output/output.js:337:11' failureType: 'testCodeFailure' error: 'thrown from subtest sync throw fails at second' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:338:11) + <node-internal-frames> + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:337:11) + <node-internal-frames> ... 1..2 not ok 58 - subtest sync throw fails --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:333:1' failureType: 'subtestsFailed' error: '2 subtests failed' code: 'ERR_TEST_FAILURE' @@ -660,7 +599,7 @@ not ok 59 - timed out async test --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:342:1' failureType: 'testTimeoutFailure' error: 'test timed out after 5ms' code: 'ERR_TEST_FAILURE' @@ -670,7 +609,7 @@ not ok 60 - timed out callback test --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:351:1' failureType: 'testTimeoutFailure' error: 'test timed out after 5ms' code: 'ERR_TEST_FAILURE' @@ -698,7 +637,7 @@ not ok 64 - rejected thenable --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:380:1' failureType: 'testCodeFailure' error: 'custom error' code: 'ERR_TEST_FAILURE' @@ -708,35 +647,33 @@ not ok 65 - unfinished test with uncaughtException --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:391:1' failureType: 'uncaughtException' error: 'foo' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * + Timeout._onTimeout (<project-root>/test/fixtures/test-runner/output/output.js:393:30) + <node-internal-frames> ... # Subtest: unfinished test with unhandledRejection not ok 66 - unfinished test with unhandledRejection --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:397:1' failureType: 'unhandledRejection' error: 'bar' code: 'ERR_TEST_FAILURE' stack: |- - * - * - * + Timeout._onTimeout (<project-root>/test/fixtures/test-runner/output/output.js:399:37) + <node-internal-frames> ... # Subtest: assertion errors display actual and expected properly not ok 67 - assertion errors display actual and expected properly --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/output.js:409:1' failureType: 'testCodeFailure' error: |- Expected values to be loosely deep-equal: @@ -799,27 +736,27 @@ not ok 67 - assertion errors display actual and expected properly string: 'Hello' operator: 'deepEqual' stack: |- - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:425:12) ... # Subtest: invalid subtest fail not ok 68 - invalid subtest fail --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/output.js:(LINE):7' + location: '<project-root>/test/fixtures/test-runner/output/output.js:197:7' failureType: 'parentAlreadyFinished' error: 'test could not be started because its parent finished' code: 'ERR_TEST_FAILURE' stack: |- - * + Immediate.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:197:7) ... -# Error: Test "unhandled rejection - passes but warns" at test/fixtures/test-runner/output/output.js:(LINE):1 generated asynchronous activity after the test ended. This activity created the error "Error: rejected from unhandled rejection fail" and would have caused the test to fail, but instead triggered an unhandledRejection event. -# Error: Test "async unhandled rejection - passes but warns" at test/fixtures/test-runner/output/output.js:(LINE):1 generated asynchronous activity after the test ended. This activity created the error "Error: rejected from async unhandled rejection fail" and would have caused the test to fail, but instead triggered an unhandledRejection event. +# Error: Test "unhandled rejection - passes but warns" at test/fixtures/test-runner/output/output.js:96:1 generated asynchronous activity after the test ended. This activity created the error "Error: rejected from unhandled rejection fail" and would have caused the test to fail, but instead triggered an unhandledRejection event. +# Error: Test "async unhandled rejection - passes but warns" at test/fixtures/test-runner/output/output.js:100:1 generated asynchronous activity after the test ended. This activity created the error "Error: rejected from async unhandled rejection fail" and would have caused the test to fail, but instead triggered an unhandledRejection event. # Error: A resource generated asynchronous activity after the test ended. This activity created the error "Error: uncaught from outside of a test" which triggered an uncaughtException event, caught by the test runner. -# Error: Test "immediate throw - passes but warns" at test/fixtures/test-runner/output/output.js:(LINE):1 generated asynchronous activity after the test ended. This activity created the error "Error: thrown from immediate throw fail" and would have caused the test to fail, but instead triggered an uncaughtException event. -# Error: Test "immediate reject - passes but warns" at test/fixtures/test-runner/output/output.js:(LINE):1 generated asynchronous activity after the test ended. This activity created the error "Error: rejected from immediate reject fail" and would have caused the test to fail, but instead triggered an unhandledRejection event. -# Error: Test "callback called twice in different ticks" at test/fixtures/test-runner/output/output.js:(LINE):1 generated asynchronous activity after the test ended. This activity created the error "Error [ERR_TEST_FAILURE]: callback invoked multiple times" and would have caused the test to fail, but instead triggered an uncaughtException event. -# Error: Test "callback async throw after done" at test/fixtures/test-runner/output/output.js:(LINE):1 generated asynchronous activity after the test ended. This activity created the error "Error: thrown from callback async throw after done" and would have caused the test to fail, but instead triggered an uncaughtException event. +# Error: Test "immediate throw - passes but warns" at test/fixtures/test-runner/output/output.js:104:1 generated asynchronous activity after the test ended. This activity created the error "Error: thrown from immediate throw fail" and would have caused the test to fail, but instead triggered an uncaughtException event. +# Error: Test "immediate reject - passes but warns" at test/fixtures/test-runner/output/output.js:110:1 generated asynchronous activity after the test ended. This activity created the error "Error: rejected from immediate reject fail" and would have caused the test to fail, but instead triggered an unhandledRejection event. +# Error: Test "callback called twice in different ticks" at test/fixtures/test-runner/output/output.js:275:1 generated asynchronous activity after the test ended. This activity created the error "Error [ERR_TEST_FAILURE]: callback invoked multiple times" and would have caused the test to fail, but instead triggered an uncaughtException event. +# Error: Test "callback async throw after done" at test/fixtures/test-runner/output/output.js:293:1 generated asynchronous activity after the test ended. This activity created the error "Error: thrown from callback async throw after done" and would have caused the test to fail, but instead triggered an uncaughtException event. # Subtest: last test ok 69 - last test --- diff --git a/test/fixtures/test-runner/output/source_mapped_locations.snapshot b/test/fixtures/test-runner/output/source_mapped_locations.snapshot index 41ddcd622c4e62..f5625b69fe5cee 100644 --- a/test/fixtures/test-runner/output/source_mapped_locations.snapshot +++ b/test/fixtures/test-runner/output/source_mapped_locations.snapshot @@ -17,11 +17,8 @@ not ok 1 - fails actual: 1 operator: 'strictEqual' stack: |- - * - * - * - * - * + TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/source_mapped_locations.ts:6:3) + <node-internal-frames> ... 1..1 # tests 1 diff --git a/test/fixtures/test-runner/output/spec_reporter.js b/test/fixtures/test-runner/output/spec_reporter.js index 5edcb6e8d9c8df..131fa432f6d282 100644 --- a/test/fixtures/test-runner/output/spec_reporter.js +++ b/test/fixtures/test-runner/output/spec_reporter.js @@ -13,6 +13,5 @@ const child = spawn( { stdio: 'pipe' }, ); -// eslint-disable-next-line no-control-regex -child.stdout.on('data', (d) => process.stdout.write(d.toString().replace(/[^\x00-\x7F]/g, '').replace(/\u001b\[\d+m/g, ''))); +child.stdout.pipe(process.stdout); child.stderr.pipe(process.stderr); diff --git a/test/fixtures/test-runner/output/spec_reporter.snapshot b/test/fixtures/test-runner/output/spec_reporter.snapshot index 71a386e1756369..cbc5c3bac14b73 100644 --- a/test/fixtures/test-runner/output/spec_reporter.snapshot +++ b/test/fixtures/test-runner/output/spec_reporter.snapshot @@ -1,178 +1,149 @@ - sync expect fail (method) (*ms) # EXPECTED FAILURE - sync expect fail (options) (*ms) # EXPECTED FAILURE - async expect fail (method) (*ms) # EXPECTED FAILURE - async expect fail (options) (*ms) # EXPECTED FAILURE - sync todo with expect fail (*ms) # TODO - sync skip expect fail (*ms) # SKIP - sync pass todo (*ms) # TODO - sync pass todo with message (*ms) # this is a passing todo - sync fail todo (*ms) # TODO - sync fail todo with message (*ms) # this is a failing todo - sync skip pass (*ms) # SKIP - sync skip pass with message (*ms) # this is skipped - sync pass (*ms) - this test should pass - sync throw fail (*ms) - async skip pass (*ms) # SKIP - async pass (*ms) - async throw fail (*ms) - async skip fail (*ms) # SKIP - async assertion fail (*ms) - resolve pass (*ms) - reject fail (*ms) - unhandled rejection - passes but warns (*ms) - async unhandled rejection - passes but warns (*ms) - immediate throw - passes but warns (*ms) - immediate reject - passes but warns (*ms) - immediate resolve pass (*ms) - subtest sync throw fail - +sync throw fail (*ms) - this subtest should make its parent test fail - subtest sync throw fail (*ms) - sync throw non-error fail (*ms) - level 0a - level 1a (*ms) - level 1b (*ms) - level 1c (*ms) - level 1d (*ms) - level 0a (*ms) - top level - +long running (*ms) - +short running - ++short running (*ms) - +short running (*ms) - top level (*ms) - invalid subtest - pass but subtest fails (*ms) - sync skip option (*ms) # SKIP - sync skip option with message (*ms) # this is skipped - sync skip option is false fail (*ms) - <anonymous> (*ms) - functionOnly (*ms) - <anonymous> (*ms) - test with only a name provided (*ms) - <anonymous> (*ms) - <anonymous> (*ms) # SKIP - test with a name and options provided (*ms) # SKIP - functionAndOptions (*ms) # SKIP - callback pass (*ms) - callback fail (*ms) - sync t is this in test (*ms) - async t is this in test (*ms) - callback t is this in test (*ms) - callback also returns a Promise (*ms) - callback throw (*ms) - callback called twice (*ms) - callback called twice in different ticks (*ms) - callback called twice in future tick (*ms) - callback async throw (*ms) - callback async throw after done (*ms) - only is set on subtests but not in only mode - running subtest 1 (*ms) - running subtest 3 (*ms) - running subtest 4 (*ms) - only is set on subtests but not in only mode (*ms) - custom inspect symbol fail (*ms) - custom inspect symbol that throws fail (*ms) - subtest sync throw fails - sync throw fails at first (*ms) - sync throw fails at second (*ms) - subtest sync throw fails (*ms) - timed out async test (*ms) - timed out callback test (*ms) - large timeout async test is ok (*ms) - large timeout callback test is ok (*ms) - successful thenable (*ms) - rejected thenable (*ms) - unfinished test with uncaughtException (*ms) - unfinished test with unhandledRejection (*ms) - assertion errors display actual and expected properly (*ms) - invalid subtest fail (*ms) - Error: Test "unhandled rejection - passes but warns" at test/fixtures/test-runner/output/output.js:96:1 generated asynchronous activity after the test ended. This activity created the error "Error: rejected from unhandled rejection fail" and would have caused the test to fail, but instead triggered an unhandledRejection event. - Error: Test "async unhandled rejection - passes but warns" at test/fixtures/test-runner/output/output.js:100:1 generated asynchronous activity after the test ended. This activity created the error "Error: rejected from async unhandled rejection fail" and would have caused the test to fail, but instead triggered an unhandledRejection event. - Error: A resource generated asynchronous activity after the test ended. This activity created the error "Error: uncaught from outside of a test" which triggered an uncaughtException event, caught by the test runner. - Error: Test "immediate throw - passes but warns" at test/fixtures/test-runner/output/output.js:104:1 generated asynchronous activity after the test ended. This activity created the error "Error: thrown from immediate throw fail" and would have caused the test to fail, but instead triggered an uncaughtException event. - Error: Test "immediate reject - passes but warns" at test/fixtures/test-runner/output/output.js:110:1 generated asynchronous activity after the test ended. This activity created the error "Error: rejected from immediate reject fail" and would have caused the test to fail, but instead triggered an unhandledRejection event. - Error: Test "callback called twice in different ticks" at test/fixtures/test-runner/output/output.js:275:1 generated asynchronous activity after the test ended. This activity created the error "Error [ERR_TEST_FAILURE]: callback invoked multiple times" and would have caused the test to fail, but instead triggered an uncaughtException event. - Error: Test "callback async throw after done" at test/fixtures/test-runner/output/output.js:293:1 generated asynchronous activity after the test ended. This activity created the error "Error: thrown from callback async throw after done" and would have caused the test to fail, but instead triggered an uncaughtException event. - tests 81 - suites 0 - pass 40 - fail 24 - cancelled 2 - skipped 10 - todo 5 - duration_ms * - - failing tests: - -* - sync fail todo (*ms) # TODO +✔ sync expect fail (method) (*ms) # EXPECTED FAILURE +✔ sync expect fail (options) (*ms) # EXPECTED FAILURE +✔ async expect fail (method) (*ms) # EXPECTED FAILURE +✔ async expect fail (options) (*ms) # EXPECTED FAILURE +✔ sync todo with expect fail (*ms) # TODO +﹣ sync skip expect fail (*ms) # SKIP +✔ sync pass todo (*ms) # TODO +✔ sync pass todo with message (*ms) # this is a passing todo +⚠ sync fail todo (*ms) # TODO +⚠ sync fail todo with message (*ms) # this is a failing todo +﹣ sync skip pass (*ms) # SKIP +﹣ sync skip pass with message (*ms) # this is skipped +✔ sync pass (*ms) +ℹ this test should pass +✖ sync throw fail (*ms) +﹣ async skip pass (*ms) # SKIP +✔ async pass (*ms) +✖ async throw fail (*ms) +﹣ async skip fail (*ms) # SKIP +✖ async assertion fail (*ms) +✔ resolve pass (*ms) +✖ reject fail (*ms) +✔ unhandled rejection - passes but warns (*ms) +✔ async unhandled rejection - passes but warns (*ms) +✔ immediate throw - passes but warns (*ms) +✔ immediate reject - passes but warns (*ms) +✔ immediate resolve pass (*ms) +▶ subtest sync throw fail + ✖ +sync throw fail (*ms) + ℹ this subtest should make its parent test fail +✖ subtest sync throw fail (*ms) +✖ sync throw non-error fail (*ms) +▶ level 0a + ✔ level 1a (*ms) + ✔ level 1b (*ms) + ✔ level 1c (*ms) + ✔ level 1d (*ms) +✔ level 0a (*ms) +▶ top level + ✔ +long running (*ms) + ▶ +short running + ✔ ++short running (*ms) + ✔ +short running (*ms) +✔ top level (*ms) +✔ invalid subtest - pass but subtest fails (*ms) +﹣ sync skip option (*ms) # SKIP +﹣ sync skip option with message (*ms) # this is skipped +✖ sync skip option is false fail (*ms) +✔ <anonymous> (*ms) +✔ functionOnly (*ms) +✔ <anonymous> (*ms) +✔ test with only a name provided (*ms) +✔ <anonymous> (*ms) +﹣ <anonymous> (*ms) # SKIP +﹣ test with a name and options provided (*ms) # SKIP +﹣ functionAndOptions (*ms) # SKIP +✔ callback pass (*ms) +✖ callback fail (*ms) +✔ sync t is this in test (*ms) +✔ async t is this in test (*ms) +✔ callback t is this in test (*ms) +✖ callback also returns a Promise (*ms) +✖ callback throw (*ms) +✖ callback called twice (*ms) +✔ callback called twice in different ticks (*ms) +✖ callback called twice in future tick (*ms) +✖ callback async throw (*ms) +✔ callback async throw after done (*ms) +▶ only is set on subtests but not in only mode + ✔ running subtest 1 (*ms) + ✔ running subtest 3 (*ms) + ✔ running subtest 4 (*ms) +✔ only is set on subtests but not in only mode (*ms) +✖ custom inspect symbol fail (*ms) +✖ custom inspect symbol that throws fail (*ms) +▶ subtest sync throw fails + ✖ sync throw fails at first (*ms) + ✖ sync throw fails at second (*ms) +✖ subtest sync throw fails (*ms) +✖ timed out async test (*ms) +✖ timed out callback test (*ms) +✔ large timeout async test is ok (*ms) +✔ large timeout callback test is ok (*ms) +✔ successful thenable (*ms) +✖ rejected thenable (*ms) +✖ unfinished test with uncaughtException (*ms) +✖ unfinished test with unhandledRejection (*ms) +✖ assertion errors display actual and expected properly (*ms) +✖ invalid subtest fail (*ms) +ℹ Error: Test "unhandled rejection - passes but warns" at test/fixtures/test-runner/output/output.js:96:1 generated asynchronous activity after the test ended. This activity created the error "Error: rejected from unhandled rejection fail" and would have caused the test to fail, but instead triggered an unhandledRejection event. +ℹ Error: Test "async unhandled rejection - passes but warns" at test/fixtures/test-runner/output/output.js:100:1 generated asynchronous activity after the test ended. This activity created the error "Error: rejected from async unhandled rejection fail" and would have caused the test to fail, but instead triggered an unhandledRejection event. +ℹ Error: A resource generated asynchronous activity after the test ended. This activity created the error "Error: uncaught from outside of a test" which triggered an uncaughtException event, caught by the test runner. +ℹ Error: Test "immediate throw - passes but warns" at test/fixtures/test-runner/output/output.js:104:1 generated asynchronous activity after the test ended. This activity created the error "Error: thrown from immediate throw fail" and would have caused the test to fail, but instead triggered an uncaughtException event. +ℹ Error: Test "immediate reject - passes but warns" at test/fixtures/test-runner/output/output.js:110:1 generated asynchronous activity after the test ended. This activity created the error "Error: rejected from immediate reject fail" and would have caused the test to fail, but instead triggered an unhandledRejection event. +ℹ Error: Test "callback called twice in different ticks" at test/fixtures/test-runner/output/output.js:275:1 generated asynchronous activity after the test ended. This activity created the error "Error [ERR_TEST_FAILURE]: callback invoked multiple times" and would have caused the test to fail, but instead triggered an uncaughtException event. +ℹ Error: Test "callback async throw after done" at test/fixtures/test-runner/output/output.js:293:1 generated asynchronous activity after the test ended. This activity created the error "Error: thrown from callback async throw after done" and would have caused the test to fail, but instead triggered an uncaughtException event. +ℹ tests 81 +ℹ suites 0 +ℹ pass 40 +ℹ fail 24 +ℹ cancelled 2 +ℹ skipped 10 +ℹ todo 5 +ℹ duration_ms * + +✖ failing tests: + +test at test/fixtures/test-runner/output/output.js:40:1 +⚠ sync fail todo (*ms) # TODO Error: thrown from sync fail todo - * - * - * - * - * - * - * - -* - sync fail todo with message (*ms) # this is a failing todo + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:42:9) + at <node-internal-frames> + +test at test/fixtures/test-runner/output/output.js:45:1 +⚠ sync fail todo with message (*ms) # this is a failing todo Error: thrown from sync fail todo with message - * - * - * - * - * - * - * - -* - sync throw fail (*ms) + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:47:9) + at <node-internal-frames> + +test at test/fixtures/test-runner/output/output.js:62:1 +✖ sync throw fail (*ms) Error: thrown from sync throw fail - * - * - * - * - * - * - * - -* - async throw fail (*ms) + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:63:9) + at <node-internal-frames> + +test at test/fixtures/test-runner/output/output.js:74:1 +✖ async throw fail (*ms) Error: thrown from async throw fail - * - * - * - * - * - * - * - -* - async skip fail (*ms) # SKIP + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:75:9) + at <node-internal-frames> + +test at test/fixtures/test-runner/output/output.js:78:1 +﹣ async skip fail (*ms) # SKIP Error: thrown from async throw fail - * - * - * - * - * - * - * - -* - async assertion fail (*ms) + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:80:9) + at <node-internal-frames> + +test at test/fixtures/test-runner/output/output.js:83:1 +✖ async assertion fail (*ms) AssertionError [ERR_ASSERTION]: Expected values to be strictly equal: true !== false - * - * - * - * - * - * - * { + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:85:10) + at <node-internal-frames> + at <node-internal-frames> { generatedMessage: true, code: 'ERR_ASSERTION', actual: true, @@ -181,148 +152,115 @@ diff: 'simple' } -* - reject fail (*ms) +test at test/fixtures/test-runner/output/output.js:92:1 +✖ reject fail (*ms) Error: rejected from reject fail - * - * - * - * - * - * - * - -* - +sync throw fail (*ms) + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:93:25) + at <node-internal-frames> + +test at test/fixtures/test-runner/output/output.js:125:11 +✖ +sync throw fail (*ms) Error: thrown from subtest sync throw fail - * - * - * - * - * - * - * - * - * - * - -* - sync throw non-error fail (*ms) + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:127:11) + at <node-internal-frames> + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:125:11) + at <node-internal-frames> + +test at test/fixtures/test-runner/output/output.js:131:1 +✖ sync throw non-error fail (*ms) Symbol(thrown symbol from sync throw non-error fail) -* - sync skip option is false fail (*ms) +test at test/fixtures/test-runner/output/output.js:211:1 +✖ sync skip option is false fail (*ms) Error: this should be executed - * - * - * - * - * - * - * - -* - callback fail (*ms) + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:212:9) + at <node-internal-frames> + +test at test/fixtures/test-runner/output/output.js:243:1 +✖ callback fail (*ms) Error: callback failure - * - * + at Immediate.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:245:10) + at <node-internal-frames> -* - callback also returns a Promise (*ms) +test at test/fixtures/test-runner/output/output.js:262:1 +✖ callback also returns a Promise (*ms) 'passed a callback but also returned a Promise' -* - callback throw (*ms) +test at test/fixtures/test-runner/output/output.js:266:1 +✖ callback throw (*ms) Error: thrown from callback throw - * - * - * - * - * - * - * - -* - callback called twice (*ms) + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:267:9) + at <node-internal-frames> + +test at test/fixtures/test-runner/output/output.js:270:1 +✖ callback called twice (*ms) 'callback invoked multiple times' -* - callback called twice in future tick (*ms) +test at test/fixtures/test-runner/output/output.js:280:1 +✖ callback called twice in future tick (*ms) Error [ERR_TEST_FAILURE]: callback invoked multiple times - * { + at Immediate.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:283:5) { code: 'ERR_TEST_FAILURE', failureType: 'multipleCallbackInvocations', cause: 'callback invoked multiple times' } -* - callback async throw (*ms) +test at test/fixtures/test-runner/output/output.js:287:1 +✖ callback async throw (*ms) Error: thrown from callback async throw - * - * + at Immediate.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:289:11) + at <node-internal-frames> -* - custom inspect symbol fail (*ms) +test at test/fixtures/test-runner/output/output.js:311:1 +✖ custom inspect symbol fail (*ms) customized -* - custom inspect symbol that throws fail (*ms) +test at test/fixtures/test-runner/output/output.js:322:1 +✖ custom inspect symbol that throws fail (*ms) { foo: 1, Symbol(nodejs.util.inspect.custom): [Function: [nodejs.util.inspect.custom]] } -* - sync throw fails at first (*ms) +test at test/fixtures/test-runner/output/output.js:334:11 +✖ sync throw fails at first (*ms) Error: thrown from subtest sync throw fails at first - * - * - * - * - * - * - * - * - * - * - -* - sync throw fails at second (*ms) + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:335:11) + at <node-internal-frames> + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:334:11) + at <node-internal-frames> + +test at test/fixtures/test-runner/output/output.js:337:11 +✖ sync throw fails at second (*ms) Error: thrown from subtest sync throw fails at second - * - * - * - * - * - * - * - * - -* - timed out async test (*ms) + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:338:11) + at <node-internal-frames> + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:337:11) + at <node-internal-frames> + +test at test/fixtures/test-runner/output/output.js:342:1 +✖ timed out async test (*ms) 'test timed out after *ms' -* - timed out callback test (*ms) +test at test/fixtures/test-runner/output/output.js:351:1 +✖ timed out callback test (*ms) 'test timed out after *ms' -* - rejected thenable (*ms) +test at test/fixtures/test-runner/output/output.js:380:1 +✖ rejected thenable (*ms) 'custom error' -* - unfinished test with uncaughtException (*ms) +test at test/fixtures/test-runner/output/output.js:391:1 +✖ unfinished test with uncaughtException (*ms) Error: foo - * - * - * + at Timeout._onTimeout (<project-root>/test/fixtures/test-runner/output/output.js:393:30) + at <node-internal-frames> -* - unfinished test with unhandledRejection (*ms) +test at test/fixtures/test-runner/output/output.js:397:1 +✖ unfinished test with unhandledRejection (*ms) Error: bar - * - * - * + at Timeout._onTimeout (<project-root>/test/fixtures/test-runner/output/output.js:399:37) + at <node-internal-frames> -* - assertion errors display actual and expected properly (*ms) +test at test/fixtures/test-runner/output/output.js:409:1 +✖ assertion errors display actual and expected properly (*ms) AssertionError [ERR_ASSERTION]: Expected values to be loosely deep-equal: { @@ -358,7 +296,7 @@ c: [Circular *1] } } - * { + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:425:12) { generatedMessage: true, code: 'ERR_ASSERTION', actual: [Object], @@ -367,6 +305,6 @@ diff: 'simple' } -* - invalid subtest fail (*ms) +test at test/fixtures/test-runner/output/output.js:197:7 +✖ invalid subtest fail (*ms) 'test could not be started because its parent finished' diff --git a/test/fixtures/test-runner/output/spec_reporter_cli.js b/test/fixtures/test-runner/output/spec_reporter_cli.js index 9802c6b3414a91..336ee71e7c8de8 100644 --- a/test/fixtures/test-runner/output/spec_reporter_cli.js +++ b/test/fixtures/test-runner/output/spec_reporter_cli.js @@ -14,6 +14,5 @@ const child = spawn( { stdio: 'pipe' }, ); -// eslint-disable-next-line no-control-regex -child.stdout.on('data', (d) => process.stdout.write(d.toString().replace(/[^\x00-\x7F]/g, '').replace(/\u001b\[\d+m/g, ''))); +child.stdout.pipe(process.stdout); child.stderr.pipe(process.stderr); diff --git a/test/fixtures/test-runner/output/spec_reporter_cli.snapshot b/test/fixtures/test-runner/output/spec_reporter_cli.snapshot index 5d082244aa3447..fff7f9b0f123fe 100644 --- a/test/fixtures/test-runner/output/spec_reporter_cli.snapshot +++ b/test/fixtures/test-runner/output/spec_reporter_cli.snapshot @@ -1,181 +1,152 @@ - sync expect fail (method) (*ms) # EXPECTED FAILURE - sync expect fail (options) (*ms) # EXPECTED FAILURE - async expect fail (method) (*ms) # EXPECTED FAILURE - async expect fail (options) (*ms) # EXPECTED FAILURE - sync todo with expect fail (*ms) # TODO - sync skip expect fail (*ms) # SKIP - sync pass todo (*ms) # TODO - sync pass todo with message (*ms) # this is a passing todo - sync fail todo (*ms) # TODO - sync fail todo with message (*ms) # this is a failing todo - sync skip pass (*ms) # SKIP - sync skip pass with message (*ms) # this is skipped - sync pass (*ms) - this test should pass - sync throw fail (*ms) - async skip pass (*ms) # SKIP - async pass (*ms) - async throw fail (*ms) - async skip fail (*ms) # SKIP - async assertion fail (*ms) - resolve pass (*ms) - reject fail (*ms) - unhandled rejection - passes but warns (*ms) - async unhandled rejection - passes but warns (*ms) - immediate throw - passes but warns (*ms) - immediate reject - passes but warns (*ms) - immediate resolve pass (*ms) - subtest sync throw fail - +sync throw fail (*ms) - this subtest should make its parent test fail - subtest sync throw fail (*ms) - sync throw non-error fail (*ms) - level 0a - level 1a (*ms) - level 1b (*ms) - level 1c (*ms) - level 1d (*ms) - level 0a (*ms) - top level - +long running (*ms) - +short running - ++short running (*ms) - +short running (*ms) - top level (*ms) - invalid subtest - pass but subtest fails (*ms) - sync skip option (*ms) # SKIP - sync skip option with message (*ms) # this is skipped - sync skip option is false fail (*ms) - <anonymous> (*ms) - functionOnly (*ms) - <anonymous> (*ms) - test with only a name provided (*ms) - <anonymous> (*ms) - <anonymous> (*ms) # SKIP - test with a name and options provided (*ms) # SKIP - functionAndOptions (*ms) # SKIP - callback pass (*ms) - callback fail (*ms) - sync t is this in test (*ms) - async t is this in test (*ms) - callback t is this in test (*ms) - callback also returns a Promise (*ms) - callback throw (*ms) - callback called twice (*ms) - callback called twice in different ticks (*ms) - callback called twice in future tick (*ms) - callback async throw (*ms) - callback async throw after done (*ms) - only is set on subtests but not in only mode - running subtest 1 (*ms) - running subtest 2 (*ms) - 'only' and 'runOnly' require the --test-only command-line option. - running subtest 3 (*ms) - 'only' and 'runOnly' require the --test-only command-line option. - running subtest 4 (*ms) - only is set on subtests but not in only mode (*ms) - custom inspect symbol fail (*ms) - custom inspect symbol that throws fail (*ms) - subtest sync throw fails - sync throw fails at first (*ms) - sync throw fails at second (*ms) - subtest sync throw fails (*ms) - timed out async test (*ms) - timed out callback test (*ms) - large timeout async test is ok (*ms) - large timeout callback test is ok (*ms) - successful thenable (*ms) - rejected thenable (*ms) - unfinished test with uncaughtException (*ms) - unfinished test with unhandledRejection (*ms) - assertion errors display actual and expected properly (*ms) - invalid subtest fail (*ms) - Error: Test "unhandled rejection - passes but warns" at test/fixtures/test-runner/output/output.js:96:1 generated asynchronous activity after the test ended. This activity created the error "Error: rejected from unhandled rejection fail" and would have caused the test to fail, but instead triggered an unhandledRejection event. - Error: Test "async unhandled rejection - passes but warns" at test/fixtures/test-runner/output/output.js:100:1 generated asynchronous activity after the test ended. This activity created the error "Error: rejected from async unhandled rejection fail" and would have caused the test to fail, but instead triggered an unhandledRejection event. - Error: A resource generated asynchronous activity after the test ended. This activity created the error "Error: uncaught from outside of a test" which triggered an uncaughtException event, caught by the test runner. - Error: Test "immediate throw - passes but warns" at test/fixtures/test-runner/output/output.js:104:1 generated asynchronous activity after the test ended. This activity created the error "Error: thrown from immediate throw fail" and would have caused the test to fail, but instead triggered an uncaughtException event. - Error: Test "immediate reject - passes but warns" at test/fixtures/test-runner/output/output.js:110:1 generated asynchronous activity after the test ended. This activity created the error "Error: rejected from immediate reject fail" and would have caused the test to fail, but instead triggered an unhandledRejection event. - Error: Test "callback called twice in different ticks" at test/fixtures/test-runner/output/output.js:275:1 generated asynchronous activity after the test ended. This activity created the error "Error [ERR_TEST_FAILURE]: callback invoked multiple times" and would have caused the test to fail, but instead triggered an uncaughtException event. - Error: Test "callback async throw after done" at test/fixtures/test-runner/output/output.js:293:1 generated asynchronous activity after the test ended. This activity created the error "Error: thrown from callback async throw after done" and would have caused the test to fail, but instead triggered an uncaughtException event. - tests 82 - suites 0 - pass 41 - fail 24 - cancelled 2 - skipped 10 - todo 5 - duration_ms * - - failing tests: - -* - sync fail todo (*ms) # TODO +✔ sync expect fail (method) (*ms) # EXPECTED FAILURE +✔ sync expect fail (options) (*ms) # EXPECTED FAILURE +✔ async expect fail (method) (*ms) # EXPECTED FAILURE +✔ async expect fail (options) (*ms) # EXPECTED FAILURE +✔ sync todo with expect fail (*ms) # TODO +﹣ sync skip expect fail (*ms) # SKIP +✔ sync pass todo (*ms) # TODO +✔ sync pass todo with message (*ms) # this is a passing todo +⚠ sync fail todo (*ms) # TODO +⚠ sync fail todo with message (*ms) # this is a failing todo +﹣ sync skip pass (*ms) # SKIP +﹣ sync skip pass with message (*ms) # this is skipped +✔ sync pass (*ms) +ℹ this test should pass +✖ sync throw fail (*ms) +﹣ async skip pass (*ms) # SKIP +✔ async pass (*ms) +✖ async throw fail (*ms) +﹣ async skip fail (*ms) # SKIP +✖ async assertion fail (*ms) +✔ resolve pass (*ms) +✖ reject fail (*ms) +✔ unhandled rejection - passes but warns (*ms) +✔ async unhandled rejection - passes but warns (*ms) +✔ immediate throw - passes but warns (*ms) +✔ immediate reject - passes but warns (*ms) +✔ immediate resolve pass (*ms) +▶ subtest sync throw fail + ✖ +sync throw fail (*ms) + ℹ this subtest should make its parent test fail +✖ subtest sync throw fail (*ms) +✖ sync throw non-error fail (*ms) +▶ level 0a + ✔ level 1a (*ms) + ✔ level 1b (*ms) + ✔ level 1c (*ms) + ✔ level 1d (*ms) +✔ level 0a (*ms) +▶ top level + ✔ +long running (*ms) + ▶ +short running + ✔ ++short running (*ms) + ✔ +short running (*ms) +✔ top level (*ms) +✔ invalid subtest - pass but subtest fails (*ms) +﹣ sync skip option (*ms) # SKIP +﹣ sync skip option with message (*ms) # this is skipped +✖ sync skip option is false fail (*ms) +✔ <anonymous> (*ms) +✔ functionOnly (*ms) +✔ <anonymous> (*ms) +✔ test with only a name provided (*ms) +✔ <anonymous> (*ms) +﹣ <anonymous> (*ms) # SKIP +﹣ test with a name and options provided (*ms) # SKIP +﹣ functionAndOptions (*ms) # SKIP +✔ callback pass (*ms) +✖ callback fail (*ms) +✔ sync t is this in test (*ms) +✔ async t is this in test (*ms) +✔ callback t is this in test (*ms) +✖ callback also returns a Promise (*ms) +✖ callback throw (*ms) +✖ callback called twice (*ms) +✔ callback called twice in different ticks (*ms) +✖ callback called twice in future tick (*ms) +✖ callback async throw (*ms) +✔ callback async throw after done (*ms) +▶ only is set on subtests but not in only mode + ✔ running subtest 1 (*ms) + ✔ running subtest 2 (*ms) + ℹ 'only' and 'runOnly' require the --test-only command-line option. + ✔ running subtest 3 (*ms) + ℹ 'only' and 'runOnly' require the --test-only command-line option. + ✔ running subtest 4 (*ms) +✔ only is set on subtests but not in only mode (*ms) +✖ custom inspect symbol fail (*ms) +✖ custom inspect symbol that throws fail (*ms) +▶ subtest sync throw fails + ✖ sync throw fails at first (*ms) + ✖ sync throw fails at second (*ms) +✖ subtest sync throw fails (*ms) +✖ timed out async test (*ms) +✖ timed out callback test (*ms) +✔ large timeout async test is ok (*ms) +✔ large timeout callback test is ok (*ms) +✔ successful thenable (*ms) +✖ rejected thenable (*ms) +✖ unfinished test with uncaughtException (*ms) +✖ unfinished test with unhandledRejection (*ms) +✖ assertion errors display actual and expected properly (*ms) +✖ invalid subtest fail (*ms) +ℹ Error: Test "unhandled rejection - passes but warns" at test/fixtures/test-runner/output/output.js:96:1 generated asynchronous activity after the test ended. This activity created the error "Error: rejected from unhandled rejection fail" and would have caused the test to fail, but instead triggered an unhandledRejection event. +ℹ Error: Test "async unhandled rejection - passes but warns" at test/fixtures/test-runner/output/output.js:100:1 generated asynchronous activity after the test ended. This activity created the error "Error: rejected from async unhandled rejection fail" and would have caused the test to fail, but instead triggered an unhandledRejection event. +ℹ Error: A resource generated asynchronous activity after the test ended. This activity created the error "Error: uncaught from outside of a test" which triggered an uncaughtException event, caught by the test runner. +ℹ Error: Test "immediate throw - passes but warns" at test/fixtures/test-runner/output/output.js:104:1 generated asynchronous activity after the test ended. This activity created the error "Error: thrown from immediate throw fail" and would have caused the test to fail, but instead triggered an uncaughtException event. +ℹ Error: Test "immediate reject - passes but warns" at test/fixtures/test-runner/output/output.js:110:1 generated asynchronous activity after the test ended. This activity created the error "Error: rejected from immediate reject fail" and would have caused the test to fail, but instead triggered an unhandledRejection event. +ℹ Error: Test "callback called twice in different ticks" at test/fixtures/test-runner/output/output.js:275:1 generated asynchronous activity after the test ended. This activity created the error "Error [ERR_TEST_FAILURE]: callback invoked multiple times" and would have caused the test to fail, but instead triggered an uncaughtException event. +ℹ Error: Test "callback async throw after done" at test/fixtures/test-runner/output/output.js:293:1 generated asynchronous activity after the test ended. This activity created the error "Error: thrown from callback async throw after done" and would have caused the test to fail, but instead triggered an uncaughtException event. +ℹ tests 82 +ℹ suites 0 +ℹ pass 41 +ℹ fail 24 +ℹ cancelled 2 +ℹ skipped 10 +ℹ todo 5 +ℹ duration_ms * + +✖ failing tests: + +test at test/fixtures/test-runner/output/output.js:40:1 +⚠ sync fail todo (*ms) # TODO Error: thrown from sync fail todo - * - * - * - * - * - * - * - -* - sync fail todo with message (*ms) # this is a failing todo + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:42:9) + at <node-internal-frames> + +test at test/fixtures/test-runner/output/output.js:45:1 +⚠ sync fail todo with message (*ms) # this is a failing todo Error: thrown from sync fail todo with message - * - * - * - * - * - * - * - -* - sync throw fail (*ms) + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:47:9) + at <node-internal-frames> + +test at test/fixtures/test-runner/output/output.js:62:1 +✖ sync throw fail (*ms) Error: thrown from sync throw fail - * - * - * - * - * - * - * - -* - async throw fail (*ms) + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:63:9) + at <node-internal-frames> + +test at test/fixtures/test-runner/output/output.js:74:1 +✖ async throw fail (*ms) Error: thrown from async throw fail - * - * - * - * - * - * - * - -* - async skip fail (*ms) # SKIP + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:75:9) + at <node-internal-frames> + +test at test/fixtures/test-runner/output/output.js:78:1 +﹣ async skip fail (*ms) # SKIP Error: thrown from async throw fail - * - * - * - * - * - * - * - -* - async assertion fail (*ms) + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:80:9) + at <node-internal-frames> + +test at test/fixtures/test-runner/output/output.js:83:1 +✖ async assertion fail (*ms) AssertionError [ERR_ASSERTION]: Expected values to be strictly equal: true !== false - * - * - * - * - * - * - * { + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:85:10) + at <node-internal-frames> + at <node-internal-frames> { generatedMessage: true, code: 'ERR_ASSERTION', actual: true, @@ -184,148 +155,115 @@ diff: 'simple' } -* - reject fail (*ms) +test at test/fixtures/test-runner/output/output.js:92:1 +✖ reject fail (*ms) Error: rejected from reject fail - * - * - * - * - * - * - * - -* - +sync throw fail (*ms) + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:93:25) + at <node-internal-frames> + +test at test/fixtures/test-runner/output/output.js:125:11 +✖ +sync throw fail (*ms) Error: thrown from subtest sync throw fail - * - * - * - * - * - * - * - * - * - * - -* - sync throw non-error fail (*ms) + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:127:11) + at <node-internal-frames> + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:125:11) + at <node-internal-frames> + +test at test/fixtures/test-runner/output/output.js:131:1 +✖ sync throw non-error fail (*ms) Symbol(thrown symbol from sync throw non-error fail) -* - sync skip option is false fail (*ms) +test at test/fixtures/test-runner/output/output.js:211:1 +✖ sync skip option is false fail (*ms) Error: this should be executed - * - * - * - * - * - * - * - -* - callback fail (*ms) + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:212:9) + at <node-internal-frames> + +test at test/fixtures/test-runner/output/output.js:243:1 +✖ callback fail (*ms) Error: callback failure - * - * + at Immediate.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:245:10) + at <node-internal-frames> -* - callback also returns a Promise (*ms) +test at test/fixtures/test-runner/output/output.js:262:1 +✖ callback also returns a Promise (*ms) 'passed a callback but also returned a Promise' -* - callback throw (*ms) +test at test/fixtures/test-runner/output/output.js:266:1 +✖ callback throw (*ms) Error: thrown from callback throw - * - * - * - * - * - * - * - -* - callback called twice (*ms) + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:267:9) + at <node-internal-frames> + +test at test/fixtures/test-runner/output/output.js:270:1 +✖ callback called twice (*ms) 'callback invoked multiple times' -* - callback called twice in future tick (*ms) +test at test/fixtures/test-runner/output/output.js:280:1 +✖ callback called twice in future tick (*ms) Error [ERR_TEST_FAILURE]: callback invoked multiple times - * { + at Immediate.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:283:5) { code: 'ERR_TEST_FAILURE', failureType: 'multipleCallbackInvocations', cause: 'callback invoked multiple times' } -* - callback async throw (*ms) +test at test/fixtures/test-runner/output/output.js:287:1 +✖ callback async throw (*ms) Error: thrown from callback async throw - * - * + at Immediate.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:289:11) + at <node-internal-frames> -* - custom inspect symbol fail (*ms) +test at test/fixtures/test-runner/output/output.js:311:1 +✖ custom inspect symbol fail (*ms) customized -* - custom inspect symbol that throws fail (*ms) +test at test/fixtures/test-runner/output/output.js:322:1 +✖ custom inspect symbol that throws fail (*ms) { foo: 1 } -* - sync throw fails at first (*ms) +test at test/fixtures/test-runner/output/output.js:334:11 +✖ sync throw fails at first (*ms) Error: thrown from subtest sync throw fails at first - * - * - * - * - * - * - * - * - * - * - -* - sync throw fails at second (*ms) + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:335:11) + at <node-internal-frames> + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:334:11) + at <node-internal-frames> + +test at test/fixtures/test-runner/output/output.js:337:11 +✖ sync throw fails at second (*ms) Error: thrown from subtest sync throw fails at second - * - * - * - * - * - * - * - * - -* - timed out async test (*ms) + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:338:11) + at <node-internal-frames> + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:337:11) + at <node-internal-frames> + +test at test/fixtures/test-runner/output/output.js:342:1 +✖ timed out async test (*ms) 'test timed out after *ms' -* - timed out callback test (*ms) +test at test/fixtures/test-runner/output/output.js:351:1 +✖ timed out callback test (*ms) 'test timed out after *ms' -* - rejected thenable (*ms) +test at test/fixtures/test-runner/output/output.js:380:1 +✖ rejected thenable (*ms) 'custom error' -* - unfinished test with uncaughtException (*ms) +test at test/fixtures/test-runner/output/output.js:391:1 +✖ unfinished test with uncaughtException (*ms) Error: foo - * - * - * + at Timeout._onTimeout (<project-root>/test/fixtures/test-runner/output/output.js:393:30) + at <node-internal-frames> -* - unfinished test with unhandledRejection (*ms) +test at test/fixtures/test-runner/output/output.js:397:1 +✖ unfinished test with unhandledRejection (*ms) Error: bar - * - * - * + at Timeout._onTimeout (<project-root>/test/fixtures/test-runner/output/output.js:399:37) + at <node-internal-frames> -* - assertion errors display actual and expected properly (*ms) +test at test/fixtures/test-runner/output/output.js:409:1 +✖ assertion errors display actual and expected properly (*ms) AssertionError [ERR_ASSERTION]: Expected values to be loosely deep-equal: { @@ -361,7 +299,7 @@ c: [Circular *1] } } - * { + at TestContext.<anonymous> (<project-root>/test/fixtures/test-runner/output/output.js:425:12) { generatedMessage: true, code: 'ERR_ASSERTION', actual: { foo: 1, bar: 1, boo: [ 1 ], baz: { date: 1970-01-01T00:00:00.000Z, null: null, number: 1, string: 'Hello', undefined: undefined } }, @@ -370,6 +308,6 @@ diff: 'simple' } -* - invalid subtest fail (*ms) +test at test/fixtures/test-runner/output/output.js:197:7 +✖ invalid subtest fail (*ms) 'test could not be started because its parent finished' diff --git a/test/fixtures/test-runner/output/test-runner-plan-timeout.snapshot b/test/fixtures/test-runner/output/test-runner-plan-timeout.snapshot index b704f0af39cf74..8982635f1f8208 100644 --- a/test/fixtures/test-runner/output/test-runner-plan-timeout.snapshot +++ b/test/fixtures/test-runner/output/test-runner-plan-timeout.snapshot @@ -11,7 +11,7 @@ TAP version 13 --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/test-runner-plan-timeout.js:(LINE):3' + location: '<project-root>/test/fixtures/test-runner/output/test-runner-plan-timeout.js:17:3' failureType: 'uncaughtException' error: |- The expression evaluated to a falsy value: @@ -24,16 +24,15 @@ TAP version 13 actual: false operator: '==' stack: |- - * - * - * + Timeout._onTimeout (<project-root>/test/fixtures/test-runner/output/test-runner-plan-timeout.js:22:18) + <node-internal-frames> ... # Subtest: planning wait time expires before plan is met not ok 3 - planning wait time expires before plan is met --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/test-runner-plan-timeout.js:(LINE):3' + location: '<project-root>/test/fixtures/test-runner/output/test-runner-plan-timeout.js:29:3' failureType: 'testTimeoutFailure' error: 'plan timed out after 500ms with 0 assertions when expecting 2' code: 'ERR_TEST_FAILURE' @@ -49,7 +48,7 @@ TAP version 13 --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/test-runner-plan-timeout.js:(LINE):3' + location: '<project-root>/test/fixtures/test-runner/output/test-runner-plan-timeout.js:53:3' failureType: 'uncaughtException' error: |- The expression evaluated to a falsy value: @@ -62,16 +61,15 @@ TAP version 13 actual: false operator: '==' stack: |- - * - * - * + Timeout._onTimeout (<project-root>/test/fixtures/test-runner/output/test-runner-plan-timeout.js:58:18) + <node-internal-frames> ... # Subtest: planning with wait "options.wait : false" should not wait not ok 6 - planning with wait "options.wait : false" should not wait --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/test-runner-plan-timeout.js:(LINE):3' + location: '<project-root>/test/fixtures/test-runner/output/test-runner-plan-timeout.js:65:3' failureType: 'testCodeFailure' error: 'plan expected 1 assertions but received 0' code: 'ERR_TEST_FAILURE' @@ -81,7 +79,7 @@ not ok 1 - planning with wait --- duration_ms: * type: 'suite' - location: '<project-root>/test/fixtures/test-runner/output/test-runner-plan-timeout.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/test-runner-plan-timeout.js:4:1' failureType: 'subtestsFailed' error: '4 subtests failed' code: 'ERR_TEST_FAILURE' diff --git a/test/fixtures/test-runner/output/test-runner-plan.snapshot b/test/fixtures/test-runner/output/test-runner-plan.snapshot index 8698312a519d81..7cfc1977901216 100644 --- a/test/fixtures/test-runner/output/test-runner-plan.snapshot +++ b/test/fixtures/test-runner/output/test-runner-plan.snapshot @@ -35,7 +35,7 @@ not ok 3 - less assertions than planned --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/test-runner-plan.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/test-runner-plan.js:40:1' failureType: 'testCodeFailure' error: 'plan expected 1 assertions but received 0' code: 'ERR_TEST_FAILURE' @@ -45,7 +45,7 @@ not ok 4 - more assertions than planned --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/test-runner-plan.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/test-runner-plan.js:44:1' failureType: 'testCodeFailure' error: 'plan expected 1 assertions but received 2' code: 'ERR_TEST_FAILURE' @@ -94,7 +94,7 @@ not ok 8 - failing planning by options --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/test-runner-plan.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/test-runner-plan.js:72:1' failureType: 'testCodeFailure' error: 'plan expected 1 assertions but received 0' code: 'ERR_TEST_FAILURE' @@ -123,7 +123,7 @@ not ok 11 - failing more assertions than planned --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/test-runner-plan.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/test-runner-plan.js:85:1' failureType: 'testCodeFailure' error: 'plan expected 2 assertions but received 3' code: 'ERR_TEST_FAILURE' diff --git a/test/fixtures/test-runner/output/test-runner-watch-spec.snapshot b/test/fixtures/test-runner/output/test-runner-watch-spec.snapshot index c0af6b179c20b7..2bf56936159e35 100644 --- a/test/fixtures/test-runner/output/test-runner-watch-spec.snapshot +++ b/test/fixtures/test-runner/output/test-runner-watch-spec.snapshot @@ -11,15 +11,11 @@ ✖ failing tests: -* +test at test/<tmpdir>/failing-test.js:3:3 ✖ failing test (*ms) Error: failed - * - * - * - * - * - * + at TestContext.<anonymous> (<project-root>/test/<tmpdir>/failing-test.js:4:11) + at <node-internal-frames> ℹ tests 0 ℹ suites 0 ℹ pass 0 diff --git a/test/fixtures/test-runner/output/test-timeout-flag.snapshot b/test/fixtures/test-runner/output/test-timeout-flag.snapshot index 2c45befde37c5f..2b5ba9d76a2031 100644 --- a/test/fixtures/test-runner/output/test-timeout-flag.snapshot +++ b/test/fixtures/test-runner/output/test-timeout-flag.snapshot @@ -5,7 +5,7 @@ TAP version 13 --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/test-timeout-flag.js:(LINE):3' + location: '<project-root>/test/fixtures/test-runner/output/test-timeout-flag.js:8:3' failureType: 'testTimeoutFailure' error: 'test timed out after 100ms' code: 'ERR_TEST_FAILURE' @@ -17,7 +17,7 @@ TAP version 13 --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/test-timeout-flag.js:(LINE):3' + location: '<project-root>/test/fixtures/test-runner/output/test-timeout-flag.js:16:3' failureType: 'testTimeoutFailure' error: 'test timed out after 5ms' code: 'ERR_TEST_FAILURE' @@ -39,7 +39,7 @@ not ok 1 - --test-timeout is set to 100ms --- duration_ms: * type: 'suite' - location: '<project-root>/test/fixtures/test-runner/output/test-timeout-flag.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/test-timeout-flag.js:5:1' failureType: 'subtestsFailed' error: '2 subtests failed' code: 'ERR_TEST_FAILURE' @@ -50,7 +50,7 @@ not ok 1 - --test-timeout is set to 100ms --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/test-timeout-flag.js:(LINE):3' + location: '<project-root>/test/fixtures/test-runner/output/test-timeout-flag.js:51:3' failureType: 'cancelledByParent' error: 'test did not finish before its parent and was cancelled' code: 'ERR_TEST_FAILURE' @@ -60,7 +60,7 @@ not ok 2 - should inherit timeout options to children --- duration_ms: * type: 'suite' - location: '<project-root>/test/fixtures/test-runner/output/test-timeout-flag.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/test-timeout-flag.js:42:1' failureType: 'testTimeoutFailure' error: 'test timed out after 1ms' code: 'ERR_TEST_FAILURE' diff --git a/test/fixtures/test-runner/output/timeout_in_before_each_should_not_affect_further_tests.snapshot b/test/fixtures/test-runner/output/timeout_in_before_each_should_not_affect_further_tests.snapshot index a22daa3174ce0f..00d34906582371 100644 --- a/test/fixtures/test-runner/output/timeout_in_before_each_should_not_affect_further_tests.snapshot +++ b/test/fixtures/test-runner/output/timeout_in_before_each_should_not_affect_further_tests.snapshot @@ -10,7 +10,7 @@ gonna timeout --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/timeout_in_before_each_should_not_affect_further_tests.js:(LINE):3' + location: '<project-root>/test/fixtures/test-runner/output/timeout_in_before_each_should_not_affect_further_tests.js:18:3' failureType: 'hookFailed' error: 'failed running beforeEach hook' code: 'ERR_TEST_FAILURE' @@ -28,7 +28,7 @@ not ok 1 - before each timeout --- duration_ms: * type: 'suite' - location: '<project-root>/test/fixtures/test-runner/output/timeout_in_before_each_should_not_affect_further_tests.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/timeout_in_before_each_should_not_affect_further_tests.js:6:1' failureType: 'subtestsFailed' error: '1 subtest failed' code: 'ERR_TEST_FAILURE' @@ -41,7 +41,7 @@ not gonna timeout --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/timeout_in_before_each_should_not_affect_further_tests.js:(LINE):3' + location: '<project-root>/test/fixtures/test-runner/output/timeout_in_before_each_should_not_affect_further_tests.js:40:3' failureType: 'hookFailed' error: 'failed running afterEach hook' code: 'ERR_TEST_FAILURE' @@ -59,7 +59,7 @@ not ok 2 - after each timeout --- duration_ms: * type: 'suite' - location: '<project-root>/test/fixtures/test-runner/output/timeout_in_before_each_should_not_affect_further_tests.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/timeout_in_before_each_should_not_affect_further_tests.js:28:1' failureType: 'subtestsFailed' error: '1 subtest failed' code: 'ERR_TEST_FAILURE' diff --git a/test/fixtures/test-runner/output/typescript-coverage.mts b/test/fixtures/test-runner/output/typescript-coverage.mts index c26ddcac9b33f9..5498d5f83831a1 100644 --- a/test/fixtures/test-runner/output/typescript-coverage.mts +++ b/test/fixtures/test-runner/output/typescript-coverage.mts @@ -10,8 +10,10 @@ describe('foo', { concurrency: true }, () => { .then(({ default: _, ...rest }) => rest); mock.module('../coverage/bar.mts', { - defaultExport: barMock, - namedExports: barNamedExports, + exports: { + ...barNamedExports, + default: barMock, + }, }); ({ foo } = await import('../coverage/foo.mts')); diff --git a/test/fixtures/test-runner/output/typescript-coverage.snapshot b/test/fixtures/test-runner/output/typescript-coverage.snapshot index 25546c9a5d0060..d31a59c5be61a3 100644 --- a/test/fixtures/test-runner/output/typescript-coverage.snapshot +++ b/test/fixtures/test-runner/output/typescript-coverage.snapshot @@ -34,6 +34,6 @@ ok 1 - foo # output | | | | # typescript-coverage.mts | 100.00 | 100.00 | 100.00 | # ---------------------------------------------------------------------------- -# all files | 93.55 | 100.00 | 85.71 | +# all files | 93.94 | 100.00 | 85.71 | # ---------------------------------------------------------------------------- # end of coverage report diff --git a/test/fixtures/test-runner/output/unfinished-suite-async-error.snapshot b/test/fixtures/test-runner/output/unfinished-suite-async-error.snapshot index 59c04c818c7458..ae9765ee054259 100644 --- a/test/fixtures/test-runner/output/unfinished-suite-async-error.snapshot +++ b/test/fixtures/test-runner/output/unfinished-suite-async-error.snapshot @@ -5,13 +5,13 @@ TAP version 13 --- duration_ms: * type: 'test' - location: '<project-root>/test/fixtures/test-runner/output/unfinished-suite-async-error.js:(LINE):3' + location: '<project-root>/test/fixtures/test-runner/output/unfinished-suite-async-error.js:5:3' failureType: 'uncaughtException' error: 'callback test does not complete' code: 'ERR_TEST_FAILURE' stack: |- - * - * + Immediate.<anonymous> (<project-root>/test/fixtures/test-runner/output/unfinished-suite-async-error.js:7:13) + <node-internal-frames> ... # Subtest: should pass 1 ok 2 - should pass 1 @@ -24,7 +24,7 @@ not ok 1 - unfinished suite with asynchronous error --- duration_ms: * type: 'suite' - location: '<project-root>/test/fixtures/test-runner/output/unfinished-suite-async-error.js:(LINE):1' + location: '<project-root>/test/fixtures/test-runner/output/unfinished-suite-async-error.js:4:1' failureType: 'subtestsFailed' error: '1 subtest failed' code: 'ERR_TEST_FAILURE' diff --git a/test/fixtures/test-runner/rerun.js b/test/fixtures/test-runner/rerun.js index a76a1bd00dd12a..563e92e4c1bb80 100644 --- a/test/fixtures/test-runner/rerun.js +++ b/test/fixtures/test-runner/rerun.js @@ -1,4 +1,4 @@ -const { test } = require('node:test') +const { test, describe } = require('node:test') test('should fail on first two attempts', ({ attempt }) => { if (attempt < 2) { @@ -38,3 +38,11 @@ function nestedAmbiguousTest(expectedAttempts) { test('nested ambiguous (expectedAttempts=0)', nestedAmbiguousTest(0)); test('nested ambiguous (expectedAttempts=1)', nestedAmbiguousTest(2)); + + +describe('describe rerun', { timeout: 1000, concurrency: 1000 }, () => { + test('passed on first attempt', async (t) => { + await t.test('nested', async () => {}); + }); + test('a'); +}); diff --git a/test/fixtures/test-runner/worker-id/test-1.mjs b/test/fixtures/test-runner/worker-id/test-1.mjs new file mode 100644 index 00000000000000..7e6f40f2b18c38 --- /dev/null +++ b/test/fixtures/test-runner/worker-id/test-1.mjs @@ -0,0 +1,26 @@ +import { test } from 'node:test'; + +test('worker ID is available as environment variable', (t) => { + const workerId = process.env.NODE_TEST_WORKER_ID; + if (workerId === undefined) { + throw new Error('NODE_TEST_WORKER_ID should be defined'); + } + + const id = Number(workerId); + if (isNaN(id) || id < 1) { + throw new Error(`Invalid worker ID: ${workerId}`); + } +}); + +test('worker ID is available via context', (t) => { + const workerId = t.workerId; + const envWorkerId = process.env.NODE_TEST_WORKER_ID; + + if (workerId === undefined) { + throw new Error('context.workerId should be defined'); + } + + if (workerId !== Number(envWorkerId)) { + throw new Error(`context.workerId (${workerId}) should match NODE_TEST_WORKER_ID (${envWorkerId})`); + } +}); diff --git a/test/fixtures/test-runner/worker-id/test-2.mjs b/test/fixtures/test-runner/worker-id/test-2.mjs new file mode 100644 index 00000000000000..7e6f40f2b18c38 --- /dev/null +++ b/test/fixtures/test-runner/worker-id/test-2.mjs @@ -0,0 +1,26 @@ +import { test } from 'node:test'; + +test('worker ID is available as environment variable', (t) => { + const workerId = process.env.NODE_TEST_WORKER_ID; + if (workerId === undefined) { + throw new Error('NODE_TEST_WORKER_ID should be defined'); + } + + const id = Number(workerId); + if (isNaN(id) || id < 1) { + throw new Error(`Invalid worker ID: ${workerId}`); + } +}); + +test('worker ID is available via context', (t) => { + const workerId = t.workerId; + const envWorkerId = process.env.NODE_TEST_WORKER_ID; + + if (workerId === undefined) { + throw new Error('context.workerId should be defined'); + } + + if (workerId !== Number(envWorkerId)) { + throw new Error(`context.workerId (${workerId}) should match NODE_TEST_WORKER_ID (${envWorkerId})`); + } +}); diff --git a/test/fixtures/test-runner/worker-id/test-3.mjs b/test/fixtures/test-runner/worker-id/test-3.mjs new file mode 100644 index 00000000000000..7e6f40f2b18c38 --- /dev/null +++ b/test/fixtures/test-runner/worker-id/test-3.mjs @@ -0,0 +1,26 @@ +import { test } from 'node:test'; + +test('worker ID is available as environment variable', (t) => { + const workerId = process.env.NODE_TEST_WORKER_ID; + if (workerId === undefined) { + throw new Error('NODE_TEST_WORKER_ID should be defined'); + } + + const id = Number(workerId); + if (isNaN(id) || id < 1) { + throw new Error(`Invalid worker ID: ${workerId}`); + } +}); + +test('worker ID is available via context', (t) => { + const workerId = t.workerId; + const envWorkerId = process.env.NODE_TEST_WORKER_ID; + + if (workerId === undefined) { + throw new Error('context.workerId should be defined'); + } + + if (workerId !== Number(envWorkerId)) { + throw new Error(`context.workerId (${workerId}) should match NODE_TEST_WORKER_ID (${envWorkerId})`); + } +}); diff --git a/test/fixtures/tz-version.txt b/test/fixtures/tz-version.txt index cb3be9ab63e7fc..5d9126009e7f87 100644 --- a/test/fixtures/tz-version.txt +++ b/test/fixtures/tz-version.txt @@ -1 +1 @@ -2025c +2026a diff --git a/test/fixtures/v8/v8_warning.snapshot b/test/fixtures/v8/v8_warning.snapshot index 5419601c1d27d3..87c7c86b4fedeb 100644 --- a/test/fixtures/v8/v8_warning.snapshot +++ b/test/fixtures/v8/v8_warning.snapshot @@ -1,2 +1,2 @@ -(node:<pid>) V8: <project-root>/test/fixtures/v8/v8_warning.js:* Invalid asm.js: Invalid return type +(node:<pid>) V8: <project-root>/test/fixtures/v8/v8_warning.js:13 Invalid asm.js: Invalid return type (Use `<node-exe> --trace-warnings ...` to show where the warning was created) diff --git a/test/fixtures/vm/vm_display_runtime_error.snapshot b/test/fixtures/vm/vm_display_runtime_error.snapshot index a20375f224c625..87fa3d7b6a6458 100644 --- a/test/fixtures/vm/vm_display_runtime_error.snapshot +++ b/test/fixtures/vm/vm_display_runtime_error.snapshot @@ -5,8 +5,7 @@ throw new Error("boo!") Error: boo! at test.vm:1:7 - at Script.runInThisContext (node:vm:*) - at Object.runInThisContext (node:vm:*) + at <node-internal-frames> at Object.<anonymous> (<project-root>/test/fixtures/vm/vm_display_runtime_error.js:31:6) test.vm:1 throw new Error("spooky!") @@ -14,8 +13,7 @@ throw new Error("spooky!") Error: spooky! at test.vm:1:7 - at Script.runInThisContext (node:vm:*) - at Object.runInThisContext (node:vm:*) + at <node-internal-frames> at Object.<anonymous> (<project-root>/test/fixtures/vm/vm_display_runtime_error.js:36:4) Node.js <node-version> diff --git a/test/fixtures/vm/vm_display_syntax_error.snapshot b/test/fixtures/vm/vm_display_syntax_error.snapshot index b374091a1e67b3..87e9872563876f 100644 --- a/test/fixtures/vm/vm_display_syntax_error.snapshot +++ b/test/fixtures/vm/vm_display_syntax_error.snapshot @@ -4,18 +4,14 @@ var 4; ^ SyntaxError: Unexpected number - at new Script (node:vm:*) - at createScript (node:vm:*) - at Object.runInThisContext (node:vm:*) + at <node-internal-frames> at Object.<anonymous> (<project-root>/test/fixtures/vm/vm_display_syntax_error.js:31:6) test.vm:1 var 5; ^ SyntaxError: Unexpected number - at new Script (node:vm:*) - at createScript (node:vm:*) - at Object.runInThisContext (node:vm:*) + at <node-internal-frames> at Object.<anonymous> (<project-root>/test/fixtures/vm/vm_display_syntax_error.js:36:4) Node.js <node-version> diff --git a/test/fixtures/vm/vm_dont_display_runtime_error.snapshot b/test/fixtures/vm/vm_dont_display_runtime_error.snapshot index fd64cf80c91004..c111ca1d90bff9 100644 --- a/test/fixtures/vm/vm_dont_display_runtime_error.snapshot +++ b/test/fixtures/vm/vm_dont_display_runtime_error.snapshot @@ -6,8 +6,7 @@ throw new Error("boo!") Error: boo! at test.vm:1:7 - at Script.runInThisContext (node:vm:*) - at Object.runInThisContext (node:vm:*) + at <node-internal-frames> at Object.<anonymous> (<project-root>/test/fixtures/vm/vm_dont_display_runtime_error.js:41:4) Node.js <node-version> diff --git a/test/fixtures/vm/vm_dont_display_syntax_error.snapshot b/test/fixtures/vm/vm_dont_display_syntax_error.snapshot index 26790583539470..58e24ca762422e 100644 --- a/test/fixtures/vm/vm_dont_display_syntax_error.snapshot +++ b/test/fixtures/vm/vm_dont_display_syntax_error.snapshot @@ -5,9 +5,7 @@ var 5; ^ SyntaxError: Unexpected number - at new Script (node:vm:*) - at createScript (node:vm:*) - at Object.runInThisContext (node:vm:*) + at <node-internal-frames> at Object.<anonymous> (<project-root>/test/fixtures/vm/vm_dont_display_syntax_error.js:41:4) Node.js <node-version> diff --git a/test/fixtures/wpt/FileAPI/BlobURL/cross-partition-navigation.https.html b/test/fixtures/wpt/FileAPI/BlobURL/cross-partition-navigation.https.html new file mode 100644 index 00000000000000..a92e0f7a8a9b20 --- /dev/null +++ b/test/fixtures/wpt/FileAPI/BlobURL/cross-partition-navigation.https.html @@ -0,0 +1,251 @@ +<!DOCTYPE html> +<meta charset=utf-8> +<meta name="timeout" content="long"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/get-host-info.sub.js"></script> +<script src="/common/utils.js"></script> +<script src="/common/dispatcher/dispatcher.js"></script> +<!-- Pull in executor_path needed by newPopup / newIframe --> +<script src="/html/cross-origin-embedder-policy/credentialless/resources/common.js"></script> +<!-- Pull in importScript / newPopup / newIframe --> +<script src="/html/anonymous-iframe/resources/common.js"></script> +<script src="resources/common.js"></script> +<body> +<script> + +const navigation_handle_null = "Navigation handle returns null"; +const navigation_handle_not_null = "Navigation handle returns not null"; +const opener_null_response = "Window.opener is null"; +const opener_not_null_response = "Window.opener isn't null"; + +const does_blob_url_open_return_handle = (blob_url, response_queue_name) => ` + async function test() { + const handle = window.open("${blob_url}") + if (!handle) { + return send("${response_queue_name}", "${navigation_handle_null}"); + } + + return send("${response_queue_name}", "${navigation_handle_not_null}"); + } + await test(); +`; + +const opener_check_frame_html = (noopener_response_queue) => ` + <!doctype html> + <!-- dispatcher.js requires the baseURI to be set in order to compute + the server path correctly in the blob URL page. --> + <base href="${window.location.href}"> + <script src="/html/cross-origin-embedder-policy/credentialless/resources/common.js"><\/script> + <script src="/html/anonymous-iframe/resources/common.js"><\/script> + <script src="/common/utils.js"><\/script> + <script src="/common/dispatcher/dispatcher.js"><\/script> + <script> + if (window.opener === null) { + send("${noopener_response_queue}", "${opener_null_response}") + } else { + send("${noopener_response_queue}", "${opener_not_null_response}") + } + <\/script> +`; + +// Tests blob URL window.open for same and cross partition iframes. +promise_test(t => { + return new Promise(async (resolve, reject) => { + try { + // Creates same and cross partition iframes. + const response_queue_uuid = token(); + const noopener_response_queue = token(); + + const [cross_site_iframe_uuid, same_site_iframe_uuid] = + await create_test_iframes(t, response_queue_uuid); + + const blob = new Blob([opener_check_frame_html(noopener_response_queue)], {type : "text/html"}); + const blob_url = URL.createObjectURL(blob); + + // Attempt to open blob URL in cross partition iframe. + await send(cross_site_iframe_uuid, does_blob_url_open_return_handle(blob_url, response_queue_uuid)); + const response_1 = await receive(response_queue_uuid); + if (response_1 !== navigation_handle_null) { + reject(`Blob URL handle wasn't null in not-same-top-level-site iframe: ${response_1}`); + } + const noopener_response_1 = await receive(noopener_response_queue); + if (noopener_response_1 !== opener_null_response) { + reject(`Blob URL page opener wasn't null in not-same-top-level-site iframe.`); + } + + // Attempt to open blob URL in same partition iframe. + await send(same_site_iframe_uuid, does_blob_url_open_return_handle(blob_url, response_queue_uuid)); + const response_2 = await receive(response_queue_uuid); + if (response_2 !== navigation_handle_not_null) { + reject(`Blob URL wasn't opened in same-top-level-site iframe: ${response_2}`); + } + const noopener_response_2 = await receive(noopener_response_queue); + if (noopener_response_2 !== opener_not_null_response) { + reject(`Blob URL page opener was null in same-top-level-site iframe`); + } + resolve(); + } catch (e) { + reject(e); + } + }); +}, "Blob URL window.open should enforce noopener for a cross-top-level-site navigation"); + +const blob_url_iframe_html = (response_queue_uuid, message) => ` + <!doctype html> + <!-- dispatcher.js requires the baseURI to be set in order to compute + the server path correctly in the blob URL page. --> + <base href="${window.location.href}"> + <script src="/html/cross-origin-embedder-policy/credentialless/resources/common.js"><\/script> + <script src="/html/anonymous-iframe/resources/common.js"><\/script> + <script src="/common/utils.js"><\/script> + <script src="/common/dispatcher/dispatcher.js"><\/script> + <script> + send("${response_queue_uuid}", "${message}"); + <\/script> +`; + +const create_iframe_with_blob_url = (blob_url, response_queue_uuid) => ` + const iframe = document.createElement('iframe'); + iframe.src = "${blob_url}"; + iframe.onload = () => { + const same_site_message = "same_partition_loaded"; + const blob_url_iframe_html = ${blob_url_iframe_html}; + const same_top_level_site_blob = new Blob([blob_url_iframe_html("${response_queue_uuid}", same_site_message)], {type : "text/html"}); + const same_top_level_site_blob_url = URL.createObjectURL(same_top_level_site_blob); + const iframe2 = document.createElement('iframe'); + iframe2.src = same_top_level_site_blob_url; + document.body.appendChild(iframe2); + }; + document.body.appendChild(iframe); +`; + +// Tests blob URL subframe navigations for same and cross partition iframes. +promise_test(t => { + return new Promise(async (resolve, reject) => { + try { + // Creates same and cross partition iframes. + const response_queue_uuid = token(); + const cross_site_message = "cross_partition_loaded"; + + const [cross_site_iframe_uuid, same_site_iframe_uuid] = + await create_test_iframes(t, response_queue_uuid); + + // Create blob URL for the cross-site test. + const cross_site_blob = new Blob([blob_url_iframe_html(response_queue_uuid, cross_site_message)], {type: "text/html"}); + const cross_site_blob_url = URL.createObjectURL(cross_site_blob); + + // Attempt to open blob URL in cross partition iframe. + await send(cross_site_iframe_uuid, create_iframe_with_blob_url(cross_site_blob_url, response_queue_uuid)); + + const response = await receive(response_queue_uuid); + if (response === cross_site_message) { + reject(`Blob URL subframe navigation succeeded in not-same-top-level-site iframe.`); + } + resolve(); + } catch (e) { + reject(e); + } + }); +}, "Blob URL should partition subframe navigation."); + +const open_blob_url_window_via_a_click = (blob_url) => ` + const link = document.createElement("a"); + link.href = "${blob_url}"; + link.target = "_blank"; + link.rel = "opener"; + document.body.appendChild(link); + link.click(); +`; + +// Tests blob URL `<a target="_blank" rel="opener">` click for same and cross partition iframes. +promise_test(t => { + return new Promise(async (resolve, reject) => { + try { + // Creates same and cross partition iframes. + const noopener_response_queue = token(); + + const [cross_site_iframe_uuid, same_site_iframe_uuid] = await create_test_iframes(t, token()); + + const blob = new Blob([opener_check_frame_html(noopener_response_queue)], {type : "text/html"}); + const blob_url = URL.createObjectURL(blob); + + // Attempt to click blob URL in cross partition iframe. + await send(cross_site_iframe_uuid, open_blob_url_window_via_a_click(blob_url)); + const noopener_response_1 = await receive(noopener_response_queue); + if (noopener_response_1 !== opener_null_response) { + reject(`Blob URL page opener wasn't null in not-same-top-level-site iframe.`); + } + + // Attempt to click blob URL in same partition iframe. + await send(same_site_iframe_uuid, open_blob_url_window_via_a_click(blob_url)); + const noopener_response_2 = await receive(noopener_response_queue); + if (noopener_response_2 !== opener_not_null_response) { + reject(`Blob URL page opener was null in same-top-level-site iframe`); + } + resolve(); + } catch (e) { + reject(e); + } + }); +}, "Blob URL link click should enforce noopener for a cross-top-level-site navigation"); + +const open_blob_url_window_via_area_click = (blob_url) => ` + const canvas = document.createElement("canvas"); + canvas.height = 1; + canvas.width = 1; + const dataURL = canvas.toDataURL(); + + const image = document.createElement("img"); + image.src = dataURL; + document.body.appendChild(image); + + const map = document.createElement("map"); + map.name = "map"; + image.useMap = "#map"; + document.body.appendChild(map); + + const area = document.createElement("area"); + area.shape = "rect"; + area.coords = "0,0,1,1"; + area.href = "${blob_url}"; + area.target = "_blank"; + area.rel = "opener"; + map.appendChild(area); + area.click(); +`; + +// Tests blob URL `<area target="_blank" rel="opener">` click for same and cross partition iframes. +promise_test(t => { + return new Promise(async (resolve, reject) => { + try { + // Creates same and cross partition iframes. + const noopener_response_queue = token(); + + const [cross_site_iframe_uuid, same_site_iframe_uuid] = await create_test_iframes(t, token()); + + const blob = new Blob([opener_check_frame_html(noopener_response_queue)], {type : "text/html"}); + const blob_url = URL.createObjectURL(blob); + + // Attempt to click blob URL in cross partition iframe. + await send(cross_site_iframe_uuid, open_blob_url_window_via_area_click(blob_url)); + const noopener_response_1 = await receive(noopener_response_queue); + if (noopener_response_1 !== opener_null_response) { + reject(`Blob URL page opener wasn't null in not-same-top-level-site iframe.`); + } + + // Attempt to click blob URL in same partition iframe. + await send(same_site_iframe_uuid, open_blob_url_window_via_area_click(blob_url)); + const noopener_response_2 = await receive(noopener_response_queue); + if (noopener_response_2 !== opener_not_null_response) { + reject(`Blob URL page opener was null in same-top-level-site iframe`); + } + resolve(); + } catch (e) { + reject(e); + } + }); +}, "Blob URL area element click should enforce noopener for a cross-top-level-site navigation"); + +</script> +</body> diff --git a/test/fixtures/wpt/FileAPI/BlobURL/cross-partition-self-fetch.https.html b/test/fixtures/wpt/FileAPI/BlobURL/cross-partition-self-fetch.https.html new file mode 100644 index 00000000000000..cbff2fa18fa15d --- /dev/null +++ b/test/fixtures/wpt/FileAPI/BlobURL/cross-partition-self-fetch.https.html @@ -0,0 +1,76 @@ +<!DOCTYPE html> +<meta charset=utf-8> +<meta name="timeout" content="long"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/get-host-info.sub.js"></script> +<script src="/common/utils.js"></script> +<script src="/common/dispatcher/dispatcher.js"></script> +<!-- Pull in executor_path needed by newPopup / newIframe --> +<script src="/html/cross-origin-embedder-policy/credentialless/resources/common.js"></script> +<!-- Pull in importScript / newPopup / newIframe --> +<script src="/html/anonymous-iframe/resources/common.js"></script> +<script src="resources/common.js"></script> +<body> +<script> + +// Creates a Blob URL for an HTML document that fetches itself and sends the result to the +// specified response queue UUID. This is somewhat contrived but aims to test a more common +// scenario where a Blob URL with a video/audio mime type is navigated to and has an HTML document +// created for to allow media controls to be present. In that scenario the Blob URL will be used +// via a "src" attribute, resulting in a first-party resource load. +const create_blob_url_and_send_js = (fetch_response_uuid, iframe_response_uuid) => ` + const blob_url_iframe_html = \` + <!doctype html> + <base href="\${window.location.href}"> + <script src="/html/cross-origin-embedder-policy/credentialless/resources/common.js"><\/script> + <script src="/html/anonymous-iframe/resources/common.js"><\/script> + <script src="/common/utils.js"><\/script> + <script src="/common/dispatcher/dispatcher.js"><\/script> + <script> + (async () => { + try { + const response = await fetch(window.location.href); + await response.text(); + send("${fetch_response_uuid}", "success"); + } catch (e) { + send("${fetch_response_uuid}", "failure"); + } + })(); + <\/script> + \`; + const blob = new Blob([blob_url_iframe_html], {type: 'text/html'}); + const blob_url = URL.createObjectURL(blob); + send("${iframe_response_uuid}", blob_url); +`; + +promise_test(t => { + return new Promise(async (resolve, reject) => { + try { + const iframe_response_uuid = token(); + const fetch_response_uuid = token(); + const response_queue_uuid = token(); + + const [cross_site_iframe_uuid, same_site_iframe_uuid] = + await create_test_iframes(t, response_queue_uuid); + + await send(cross_site_iframe_uuid, + create_blob_url_and_send_js(fetch_response_uuid, iframe_response_uuid)); + + const blob_url = await receive(iframe_response_uuid); + + window.open(blob_url); + + const fetch_result = await receive(fetch_response_uuid); + + assert_equals(fetch_result, "success", "Blob URL created in a cross-partition context should be able to fetch itself in a same-partition context."); + + resolve(); + } catch (e) { + reject(e); + } + }); +}, "Blob URL created in a cross-partition context can fetch itself in a same-partition context."); + +</script> +</body> \ No newline at end of file diff --git a/test/fixtures/wpt/FileAPI/BlobURL/cross-partition-worker-creation.https.html b/test/fixtures/wpt/FileAPI/BlobURL/cross-partition-worker-creation.https.html new file mode 100644 index 00000000000000..e8d0bad4c97580 --- /dev/null +++ b/test/fixtures/wpt/FileAPI/BlobURL/cross-partition-worker-creation.https.html @@ -0,0 +1,117 @@ +<!DOCTYPE html> +<meta charset=utf-8> +<meta name="timeout" content="long"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/get-host-info.sub.js"></script> +<script src="/common/utils.js"></script> +<script src="/common/dispatcher/dispatcher.js"></script> +<!-- Pull in executor_path needed by newPopup / newIframe --> +<script src="/html/cross-origin-embedder-policy/credentialless/resources/common.js"></script> +<!-- Pull in importScript / newPopup / newIframe --> +<script src="/html/anonymous-iframe/resources/common.js"></script> +<script src="resources/common.js"></script> +<body> +<script> + +const create_worker_unsuccessful = "Worker creation failed."; +const create_worker_successful = "Worker creation succeeded."; + +const can_create_blob_url_shared_worker_js = (blob_url, response_queue_name) => ` + const worker = new SharedWorker("${blob_url}"); + worker.onerror = (e) => { + send("${response_queue_name}", "${create_worker_unsuccessful}"); + }; + worker.port.onmessage = (e) => { + send("${response_queue_name}", "${create_worker_successful}"); + }; +`; + +// Tests cross-partition Shared Worker creation from blob URL. +promise_test(t => { + return new Promise(async (resolve, reject) => { + try { + const response_queue_uuid = token(); + + const [cross_site_iframe_uuid, same_site_iframe_uuid] = + await create_test_iframes(t, response_queue_uuid); + + const worker_js = ` + onconnect = function(e) { + e.ports[0].postMessage('ping'); + self.close(); + }; + `; + + const blob = new Blob([worker_js], {type : "text/javascript"}); + const blob_url = window.URL.createObjectURL(blob); + t.add_cleanup(() => window.URL.revokeObjectURL(blob_url)); + + // Create a shared worker in the cross-top-level-site iframe. + await send(cross_site_iframe_uuid, can_create_blob_url_shared_worker_js(blob_url, response_queue_uuid)); + const response_1 = await receive(response_queue_uuid); + if (response_1 !== create_worker_unsuccessful) { + reject(`Shared worker was created in not-same-top-level-site iframe`); + } + + // Create a shared worker in the same-top-level-site iframe. + await send(same_site_iframe_uuid, can_create_blob_url_shared_worker_js(blob_url, response_queue_uuid)); + const response_2 = await receive(response_queue_uuid); + if (response_2 !== create_worker_successful) { + reject(`Shared worker wasn't created in same-top-level-site iframe`); + } + + resolve(); + } catch (e) { + reject(e); + } + }); +}, "Cross-partition Shared worker shouldn't be created from blob URL."); + +const can_create_blob_url_dedicated_worker_js = (blob_url, response_queue_name) => ` + const worker = new Worker("${blob_url}"); + worker.onerror = (e) => { + send("${response_queue_name}", "${create_worker_unsuccessful}"); + }; + worker.onmessage = (e) => { + send("${response_queue_name}", "${create_worker_successful}"); + worker.terminate(); + }; +`; + +// Tests cross-partition Dedicated Worker creation from blob URL. +promise_test(t => { + return new Promise(async (resolve, reject) => { + try { + const response_queue_uuid = token(); + + const [cross_site_iframe_uuid, same_site_iframe_uuid] = + await create_test_iframes(t, response_queue_uuid); + + const blob = new Blob(["postMessage('ping');"], {type : "text/javascript"}); + const blob_url = window.URL.createObjectURL(blob); + t.add_cleanup(() => window.URL.revokeObjectURL(blob_url)); + + // Create a dedicated worker in the cross-top-level-site iframe. + await send(cross_site_iframe_uuid, can_create_blob_url_dedicated_worker_js(blob_url, response_queue_uuid)); + const response_1 = await receive(response_queue_uuid); + if (response_1 !== create_worker_unsuccessful) { + reject(`Dedicated worker was created in not-same-top-level-site iframe`); + } + + // Create a dedicated worker in the same-top-level-site iframe. + await send(same_site_iframe_uuid, can_create_blob_url_dedicated_worker_js(blob_url, response_queue_uuid)); + const response_2 = await receive(response_queue_uuid); + if (response_2 !== create_worker_successful) { + reject(`Dedicated worker wasn't created in same-top-level-site iframe`); + } + + resolve(); + } catch (e) { + reject(e); + } + }); +}, "Cross-partition Dedicated worker shouldn't be created from blob URL."); + +</script> +</body> \ No newline at end of file diff --git a/test/fixtures/wpt/FileAPI/BlobURL/cross-partition.https.html b/test/fixtures/wpt/FileAPI/BlobURL/cross-partition.https.html new file mode 100644 index 00000000000000..cb66ebe77093bc --- /dev/null +++ b/test/fixtures/wpt/FileAPI/BlobURL/cross-partition.https.html @@ -0,0 +1,482 @@ +<!DOCTYPE html> +<meta charset=utf-8> +<meta name="timeout" content="long"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/get-host-info.sub.js"></script> +<script src="/common/utils.js"></script> +<script src="/common/dispatcher/dispatcher.js"></script> +<!-- Pull in executor_path needed by newPopup / newIframe --> +<script src="/html/cross-origin-embedder-policy/credentialless/resources/common.js"></script> +<!-- Pull in importScript / newPopup / newIframe --> +<script src="/html/anonymous-iframe/resources/common.js"></script> +<script src="resources/common.js"></script> +<body> +<script> + +const fetch_unsuccessful_response = "Fetch failed"; +const fetch_successful_response = "Fetch succeeded"; +const js_finished = "revoking blob_url js finished"; + +// Fetches a previously revoked blob_url to see if the revoking was successful. +async function fetch_contents_check(blob_url) { + try { + const blob = await fetch(blob_url).then(response => response.blob()); + await blob.text(); + } catch(e) { + return fetch_unsuccessful_response; + } + return fetch_successful_response; +} + +const can_blob_url_be_revoked_js = (blob_url, response_queue_name) => ` + async function test() { + if (!('revokeObjectURL' in URL)) { + return send("${response_queue_name}", "URL.revokeObjectURL is not exposed"); + } + try { + URL.revokeObjectURL("${blob_url}"); + } catch(e) { + return send("${response_queue_name}", e.toString()); + } + + // Create, fetch, and revoke a separate blob URL to better ensure that the + // revoke call above has had time to take effect before we return. + const blob_1 = new Blob(["blob data"], {type : "text/plain"}); + const blob_url_1 = URL.createObjectURL(blob_1); + await fetch(blob_url_1).then(response => response.blob()); + URL.revokeObjectURL(blob_url_1); + + return send("${response_queue_name}", "${js_finished}"); + } + await test(); +`; + +const can_blob_url_be_fetched_js = (blob_url, response_queue_name) => ` + async function test() { + try { + const blob = await fetch("${blob_url}").then(response => response.blob()); + await blob.text(); + } catch(e) { + return send("${response_queue_name}", "${fetch_unsuccessful_response}"); + } + + return send("${response_queue_name}", "${fetch_successful_response}"); + } + await test(); +`; + +const same_site_origin = get_host_info().HTTPS_ORIGIN; + +// Tests revoking blob URL for same and cross partition iframes. +promise_test(t => { + return new Promise(async (resolve, reject) => { + try { + // Creates blob URL. + const blob = new Blob(["blob data"], {type : "text/plain"}); + const blob_url = window.URL.createObjectURL(blob); + + // Fetches blob URL to ensure that it's valid. + const blob_fetch = await fetch_contents_check(blob_url); + if (blob_fetch !== fetch_successful_response) { + reject("Blob URL invalid"); + } + + // Creates same and cross partition iframes. + const response_queue_uuid = token(); + + const [cross_site_iframe_uuid, same_site_iframe_uuid] = + await create_test_iframes(t, response_queue_uuid); + + // Attempt to revoke blob URL in cross partition iframe. + await send(cross_site_iframe_uuid, can_blob_url_be_revoked_js(blob_url, response_queue_uuid)); + var response_1 = await receive(response_queue_uuid); + if (response_1 !== js_finished) { + reject(response_1); + } + response_1 = await fetch_contents_check(blob_url); + if (response_1 !== fetch_successful_response) { + reject(`Blob URL was revoked in not-same-top-level-site iframe: ${response_1}`); + } + + // Attempt to revoke blob URL in same partition iframe. + await send(same_site_iframe_uuid, can_blob_url_be_revoked_js(blob_url, response_queue_uuid)); + var response_2 = await receive(response_queue_uuid); + if (response_2 !== js_finished) { + reject(response_2); + } + response_2 = await fetch_contents_check(blob_url); + if (response_2 !== fetch_unsuccessful_response) { + t.add_cleanup(() => window.URL.revokeObjectURL(blob_url)); + reject(`Blob URL wasn't revoked in same-top-level-site iframe: ${response_2}`); + } + + resolve(); + } catch (e) { + reject(e); + } + }); +}, "Blob URL shouldn't be revocable from a cross-partition iframe"); + +const newWorker = (origin) => { + const worker_token = token(); + const worker_url = origin + executor_worker_path + `&uuid=${worker_token}`; + const worker = new Worker(worker_url); + return worker_token; +} + +const create_dedicated_worker_js = (origin, response_queue_uuid) => ` + const importScript = ${importScript}; + await importScript("/html/cross-origin-embedder-policy/credentialless" + + "/resources/common.js"); + await importScript("/html/anonymous-iframe/resources/common.js"); + await importScript("/common/utils.js"); + + // dispatcher.js has already been loaded by the popup this is running in. + const newWorker = ${newWorker}; + await send("${response_queue_uuid}", newWorker("${origin}")); +`; + +// Tests revoking blob URL from same and cross partition dedicated worker. +promise_test(t => { + return new Promise(async (resolve, reject) => { + try { + const response_queue_uuid = token(); + + const [cross_site_iframe_uuid, same_site_iframe_uuid] = + await create_test_iframes(t, response_queue_uuid); + + await send(cross_site_iframe_uuid, create_dedicated_worker_js(same_site_origin, response_queue_uuid)); + const worker_1_uuid = await receive(response_queue_uuid); + + await send(same_site_iframe_uuid, create_dedicated_worker_js(same_site_origin, response_queue_uuid)); + const worker_2_uuid = await receive(response_queue_uuid); + + const blob = new Blob(["blob data"], {type : "text/plain"}); + const blob_url = window.URL.createObjectURL(blob); + + await send(worker_1_uuid, can_blob_url_be_revoked_js(blob_url, response_queue_uuid)); + var response_1 = await receive(response_queue_uuid); + if (response_1 !== js_finished) { + reject(response_1); + } + response_1 = await fetch_contents_check(blob_url); + if (response_1 !== fetch_successful_response) { + reject(`Blob URL was revoked in not-same-top-level-site dedicated worker: ${response_1}`); + } + + await send(worker_2_uuid, can_blob_url_be_revoked_js(blob_url, response_queue_uuid)); + var response_2 = await receive(response_queue_uuid); + if (response_2 !== js_finished) { + reject(response_2); + } + response_2 = await fetch_contents_check(blob_url); + if (response_2 !== fetch_unsuccessful_response) { + t.add_cleanup(() => window.URL.revokeObjectURL(blob_url)); + reject(`Blob URL wasn't revoked in same-top-level-site dedicated worker: ${response_2}`); + } + + resolve(); + } catch (e) { + reject(e); + } + }); +}, "Blob URL shouldn't be revocable from a cross-partition dedicated worker"); + +const newSharedWorker = (origin) => { + const worker_token = token(); + const worker_url = origin + executor_worker_path + `&uuid=${worker_token}`; + const worker = new SharedWorker(worker_url, worker_token); + return worker_token; +} + +const create_shared_worker_js = (origin, response_queue_uuid) => ` + const importScript = ${importScript}; + await importScript("/html/cross-origin-embedder-policy/credentialless" + + "/resources/common.js"); + await importScript("/html/anonymous-iframe/resources/common.js"); + await importScript("/common/utils.js"); + + // dispatcher.js has already been loaded by the popup this is running in. + const newSharedWorker = ${newSharedWorker}; + await send("${response_queue_uuid}", newSharedWorker("${origin}")); +`; + +// Tests revoking blob URL from same and cross partition shared worker. +promise_test(t => { + return new Promise(async (resolve, reject) => { + try { + const response_queue_uuid = token(); + + const [cross_site_iframe_uuid, same_site_iframe_uuid] = + await create_test_iframes(t, response_queue_uuid); + + // Create a shared worker in the cross-top-level-site iframe. + await send(cross_site_iframe_uuid, create_shared_worker_js(same_site_origin, response_queue_uuid)); + const worker_1_uuid = await receive(response_queue_uuid); + + // Create a shared worker in the same-top-level-site iframe. + await send(same_site_iframe_uuid, create_shared_worker_js(same_site_origin, response_queue_uuid)); + const worker_2_uuid = await receive(response_queue_uuid); + + const blob = new Blob(["blob data"], {type : "text/plain"}); + const blob_url = window.URL.createObjectURL(blob); + + await send(worker_1_uuid, can_blob_url_be_revoked_js(blob_url, response_queue_uuid)); + var response_1 = await receive(response_queue_uuid); + if (response_1 !== js_finished) { + reject(response_1); + } + response_1 = await fetch_contents_check(blob_url); + if (response_1 !== fetch_successful_response) { + reject(`Blob URL was revoked in not-same-top-level-site shared worker: ${response_1}`); + } + + await send(worker_2_uuid, can_blob_url_be_revoked_js(blob_url, response_queue_uuid)); + var response_2 = await receive(response_queue_uuid); + if (response_2 !== js_finished) { + reject(response_2); + } + response_2 = await fetch_contents_check(blob_url); + if (response_2 !== fetch_unsuccessful_response) { + t.add_cleanup(() => window.URL.revokeObjectURL(blob_url)); + reject(`Blob URL wasn't revoked in same-top-level-site shared worker: ${response_2}`); + } + + resolve(); + } catch (e) { + reject(e); + } + }); +}, "Blob URL shouldn't be revocable from a cross-partition shared worker"); + +const newServiceWorker = async (origin) => { + const worker_token = token(); + const worker_url = origin + executor_service_worker_path + + `&uuid=${worker_token}`; + const worker_url_path = executor_service_worker_path.substring(0, + executor_service_worker_path.lastIndexOf('/')); + const scope = worker_url_path + "/not-used/"; + const reg = await navigator.serviceWorker.register(worker_url, + {'scope': scope}); + return worker_token; +} + +const create_service_worker_js = (origin, response_queue_uuid) => ` + const importScript = ${importScript}; + await importScript("/html/cross-origin-embedder-policy/credentialless" + + "/resources/common.js"); + await importScript("/html/anonymous-iframe/resources/common.js"); + await importScript("/common/utils.js"); + + // dispatcher.js has already been loaded by the popup this is running in. + const newServiceWorker = ${newServiceWorker}; + await send("${response_queue_uuid}", await newServiceWorker("${origin}")); +`; + +// Tests revoking blob URL from a service worker. +promise_test(t => { + return new Promise(async (resolve, reject) => { + try { + const response_queue_uuid = token(); + + const [cross_site_iframe_uuid, same_site_iframe_uuid] = + await create_test_iframes(t, response_queue_uuid); + + // Create a service worker in either iframe. + await send(cross_site_iframe_uuid, create_service_worker_js(same_site_origin, response_queue_uuid)); + var worker_1_uuid = await receive(response_queue_uuid); + t.add_cleanup(() => + send(worker_1_uuid, "self.registration.unregister();")); + + const blob = new Blob(["blob data"], {type : "text/plain"}); + const blob_url = window.URL.createObjectURL(blob); + t.add_cleanup(() => window.URL.revokeObjectURL(blob_url)); + + await send(worker_1_uuid, + can_blob_url_be_revoked_js(blob_url, response_queue_uuid)); + const response = await receive(response_queue_uuid); + if (response !== "URL.revokeObjectURL is not exposed") { + reject(`URL.revokeObjectURL is exposed in a Service Worker context: ${response}`); + } + resolve(); + } catch (e) { + reject(e); + } + }); +}, "Blob URL shouldn't be revocable from a service worker"); + +// Tests fetching blob URL for same and cross partition iframes. +promise_test(t => { + return new Promise(async (resolve, reject) => { + try { + // Creates blob URL. + const blob = new Blob(["blob data"], {type : "text/plain"}); + const blob_url = window.URL.createObjectURL(blob); + t.add_cleanup(() => window.URL.revokeObjectURL(blob_url)); + + // Fetches blob URL to ensure that it's valid. + const blob_fetch = await fetch_contents_check(blob_url); + if (blob_fetch !== fetch_successful_response) { + reject("Blob URL invalid"); + } + + // Creates same and cross partition iframes. + const response_queue_uuid = token(); + + const [cross_site_iframe_uuid, same_site_iframe_uuid] = + await create_test_iframes(t, response_queue_uuid); + + // Attempt to fetch blob URL in cross partition iframe. + await send(cross_site_iframe_uuid, can_blob_url_be_fetched_js(blob_url, response_queue_uuid)); + var response_1 = await receive(response_queue_uuid); + if (response_1 !== fetch_unsuccessful_response) { + reject(`Blob URL was fetched in not-same-top-level-site iframe: ${response_1}`); + } + + // Attempt to fetch blob URL in same partition iframe. + await send(same_site_iframe_uuid, can_blob_url_be_fetched_js(blob_url, response_queue_uuid)); + var response_2 = await receive(response_queue_uuid); + if (response_2 !== fetch_successful_response) { + reject(`Blob URL wasn't fetched in same-top-level-site iframe: ${response_2}`); + } + + resolve(); + } catch (e) { + reject(e); + } + }); +}, "Blob URL shouldn't be fetched from a cross-partition iframe"); + +// Tests fetching blob URL from same and cross partition dedicated worker. +promise_test(t => { + return new Promise(async (resolve, reject) => { + try { + const response_queue_uuid = token(); + + // Creates same and cross partition iframes. + const [cross_site_iframe_uuid, same_site_iframe_uuid] = + await create_test_iframes(t, response_queue_uuid); + + // Creates a dedicated worker in the cross-top-level-site iframe. + await send(cross_site_iframe_uuid, create_dedicated_worker_js(same_site_origin, response_queue_uuid)); + const worker_1_uuid = await receive(response_queue_uuid); + + // Creates a dedicated worker in the same-top-level-site iframe. + await send(same_site_iframe_uuid, create_dedicated_worker_js(same_site_origin, response_queue_uuid)); + const worker_2_uuid = await receive(response_queue_uuid); + + const blob = new Blob(["blob data"], {type : "text/plain"}); + const blob_url = window.URL.createObjectURL(blob); + t.add_cleanup(() => window.URL.revokeObjectURL(blob_url)); + + // Attempts to fetch in the cross-top-level-site dedicated worker. + await send(worker_1_uuid, can_blob_url_be_fetched_js(blob_url, response_queue_uuid)); + var response_1 = await receive(response_queue_uuid); + if (response_1 !== fetch_unsuccessful_response) { + reject(`Blob URL was fetched in not-same-top-level-site dedicated worker: ${response_1}`); + } + + // Attempts to fetch in the same-top-level-site dedicated worker. + await send(worker_2_uuid, can_blob_url_be_fetched_js(blob_url, response_queue_uuid)); + var response_2 = await receive(response_queue_uuid); + if (response_2 !== fetch_successful_response) { + reject(`Blob URL wasn't fetched in same-top-level-site dedicated worker: ${response_2}`); + } + + resolve(); + } catch (e) { + reject(e); + } + }); +}, "Blob URL shouldn't be fetched from a cross-partition dedicated worker"); + +// Tests fetching blob URL from same and cross partition shared worker. +promise_test(t => { + return new Promise(async (resolve, reject) => { + try { + const response_queue_uuid = token(); + + const [cross_site_iframe_uuid, same_site_iframe_uuid] = + await create_test_iframes(t, response_queue_uuid); + + // Create a shared worker in the cross-top-level-site iframe. + await send(cross_site_iframe_uuid, create_shared_worker_js(same_site_origin, response_queue_uuid)); + const worker_1_uuid = await receive(response_queue_uuid); + + // Create a shared worker in the same-top-level-site iframe. + await send(same_site_iframe_uuid, create_shared_worker_js(same_site_origin, response_queue_uuid)); + const worker_2_uuid = await receive(response_queue_uuid); + + const blob = new Blob(["blob data"], {type : "text/plain"}); + const blob_url = window.URL.createObjectURL(blob); + t.add_cleanup(() => window.URL.revokeObjectURL(blob_url)); + + // Attempts to fetch in the cross-top-level-site shared worker. + await send(worker_1_uuid, can_blob_url_be_fetched_js(blob_url, response_queue_uuid)); + var response_1 = await receive(response_queue_uuid); + if (response_1 !== fetch_unsuccessful_response) { + reject(`Blob URL was fetched in not-same-top-level-site shared worker: ${response_1}`); + } + + // Attempts to fetch in the same-top-level-site shared worker. + await send(worker_2_uuid, can_blob_url_be_fetched_js(blob_url, response_queue_uuid)); + var response_2 = await receive(response_queue_uuid); + if (response_2 !== fetch_successful_response) { + reject(`Blob URL wasn't fetched in same-top-level-site shared worker: ${response_2}`); + } + + resolve(); + } catch (e) { + reject(e); + } + }); +}, "Blob URL shouldn't be fetched from a cross-partition shared worker"); + +// Tests fetching blob URL from a cross partition service worker. +promise_test(t => { + return new Promise(async (resolve, reject) => { + try { + const response_queue_uuid = token(); + + const [cross_site_iframe_uuid, same_site_iframe_uuid] = + await create_test_iframes(t, response_queue_uuid); + + const blob = new Blob(["blob data"], {type : "text/plain"}); + const blob_url = window.URL.createObjectURL(blob); + t.add_cleanup(() => window.URL.revokeObjectURL(blob_url)); + + // Create a service worker in cross-top-level-site iframe. + await send(cross_site_iframe_uuid, create_service_worker_js(same_site_origin, response_queue_uuid)); + var worker_1_uuid = await receive(response_queue_uuid); + t.add_cleanup(() => + send(worker_1_uuid, "self.registration.unregister();")); + + await send(worker_1_uuid, + can_blob_url_be_fetched_js(blob_url, response_queue_uuid)); + const response_1 = await receive(response_queue_uuid); + if (response_1 !== fetch_unsuccessful_response) { + reject(`Blob URL was fetched in not-same-top-level-site service worker: ${response_1}`); + } + + // Create a service worker in same-top-level-site iframe. + await send(same_site_iframe_uuid, create_service_worker_js(same_site_origin, response_queue_uuid)); + var worker_2_uuid = await receive(response_queue_uuid); + t.add_cleanup(() => + send(worker_2_uuid, "self.registration.unregister();")); + + await send(worker_2_uuid, + can_blob_url_be_fetched_js(blob_url, response_queue_uuid)); + const response_2 = await receive(response_queue_uuid); + if (response_2 !== fetch_successful_response) { + reject(`Blob URL wasn't fetched in same-top-level-site service worker: ${response_2}`); + } + resolve(); + } catch (e) { + reject(e); + } + }); +}, "Blob URL shouldn't be fetched from a cross-partition service worker"); + +</script> +</body> diff --git a/test/fixtures/wpt/FileAPI/BlobURL/cross-partition.tentative.https.html b/test/fixtures/wpt/FileAPI/BlobURL/cross-partition.tentative.https.html deleted file mode 100644 index c75ce07d054eb7..00000000000000 --- a/test/fixtures/wpt/FileAPI/BlobURL/cross-partition.tentative.https.html +++ /dev/null @@ -1,276 +0,0 @@ -<!DOCTYPE html> -<meta charset=utf-8> -<meta name="timeout" content="long"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/common/get-host-info.sub.js"></script> -<script src="/common/utils.js"></script> -<script src="/common/dispatcher/dispatcher.js"></script> -<!-- Pull in executor_path needed by newPopup / newIframe --> -<script src="/html/cross-origin-embedder-policy/credentialless/resources/common.js"></script> -<!-- Pull in importScript / newPopup / newIframe --> -<script src="/html/anonymous-iframe/resources/common.js"></script> -<body> -<script> - -const did_revoke_response = "URL.revokeObjectURL did revoke"; -const did_not_revoke_response = "URL.revokeObjectURL did not revoke"; - -const can_blob_url_be_revoked_js = (blob_url, response_queue_name) => ` - async function test() { - if (!('revokeObjectURL' in URL)) { - return send("${response_queue_name}", "URL.revokeObjectURL is not exposed"); - } - try { - var blob = await fetch("${blob_url}").then(response => response.blob()); - await blob.text(); - } catch { - return send("${response_queue_name}", "Blob URL invalid"); - } - try { - URL.revokeObjectURL("${blob_url}"); - } catch(e) { - return send("${response_queue_name}", e.toString()); - } - try { - const blob = await fetch("${blob_url}").then(response => response.blob()); - } catch(e) { - return send("${response_queue_name}", "${did_revoke_response}"); - } - return send("${response_queue_name}", "${did_not_revoke_response}"); - } - await test(); -`; - -const add_iframe_js = (iframe_origin, response_queue_uuid) => ` - const importScript = ${importScript}; - await importScript("/html/cross-origin-embedder-policy/credentialless" + - "/resources/common.js"); - await importScript("/html/anonymous-iframe/resources/common.js"); - await importScript("/common/utils.js"); - await send("${response_queue_uuid}", newIframe("${iframe_origin}")); -`; - -const same_site_origin = get_host_info().HTTPS_ORIGIN; -const cross_site_origin = get_host_info().HTTPS_NOTSAMESITE_ORIGIN; - -async function create_test_iframes(t, response_queue_uuid) { - - // Create a same-origin iframe in a cross-site popup. - const not_same_site_popup_uuid = newPopup(t, cross_site_origin); - await send(not_same_site_popup_uuid, - add_iframe_js(same_site_origin, response_queue_uuid)); - const iframe_1_uuid = await receive(response_queue_uuid); - - // Create a same-origin iframe in a same-site popup. - const same_origin_popup_uuid = newPopup(t, same_site_origin); - await send(same_origin_popup_uuid, - add_iframe_js(same_site_origin, response_queue_uuid)); - const iframe_2_uuid = await receive(response_queue_uuid); - - return [iframe_1_uuid, iframe_2_uuid]; -} - -promise_test(t => { - return new Promise(async (resolve, reject) => { - try { - const response_queue_uuid = token(); - - const [iframe_1_uuid, iframe_2_uuid] = - await create_test_iframes(t, response_queue_uuid); - - const blob = new Blob(["blob data"], {type : "text/plain"}); - const blob_url = window.URL.createObjectURL(blob); - t.add_cleanup(() => window.URL.revokeObjectURL(blob_url)); - - await send(iframe_1_uuid, - can_blob_url_be_revoked_js(blob_url, response_queue_uuid)); - var response = await receive(response_queue_uuid); - if (response !== did_not_revoke_response) { - reject(`Blob URL was revoked in not-same-top-level-site iframe: ${response}`); - } - - await send(iframe_2_uuid, - can_blob_url_be_revoked_js(blob_url, response_queue_uuid)); - response = await receive(response_queue_uuid); - if (response !== did_revoke_response) { - reject(`Blob URL wasn't revoked in same-top-level-site iframe: ${response}`); - } - - resolve(); - } catch (e) { - reject(e); - } - }); -}, "Blob URL shouldn't be revocable from a cross-partition iframe"); - -const newWorker = (origin) => { - const worker_token = token(); - const worker_url = origin + executor_worker_path + `&uuid=${worker_token}`; - const worker = new Worker(worker_url); - return worker_token; -} - -promise_test(t => { - return new Promise(async (resolve, reject) => { - try { - const response_queue_uuid = token(); - - const create_worker_js = (origin) => ` - const importScript = ${importScript}; - await importScript("/html/cross-origin-embedder-policy/credentialless" + - "/resources/common.js"); - await importScript("/html/anonymous-iframe/resources/common.js"); - await importScript("/common/utils.js"); - const newWorker = ${newWorker}; - await send("${response_queue_uuid}", newWorker("${origin}")); - `; - - const [iframe_1_uuid, iframe_2_uuid] = - await create_test_iframes(t, response_queue_uuid); - - // Create a dedicated worker in the cross-top-level-site iframe. - await send(iframe_1_uuid, create_worker_js(same_site_origin)); - const worker_1_uuid = await receive(response_queue_uuid); - - // Create a dedicated worker in the same-top-level-site iframe. - await send(iframe_2_uuid, create_worker_js(same_site_origin)); - const worker_2_uuid = await receive(response_queue_uuid); - - const blob = new Blob(["blob data"], {type : "text/plain"}); - const blob_url = window.URL.createObjectURL(blob); - t.add_cleanup(() => window.URL.revokeObjectURL(blob_url)); - - await send(worker_1_uuid, - can_blob_url_be_revoked_js(blob_url, response_queue_uuid)); - var response = await receive(response_queue_uuid); - if (response !== did_not_revoke_response) { - reject(`Blob URL was revoked in not-same-top-level-site dedicated worker: ${response}`); - } - - await send(worker_2_uuid, - can_blob_url_be_revoked_js(blob_url, response_queue_uuid)); - response = await receive(response_queue_uuid); - if (response !== did_revoke_response) { - reject(`Blob URL wasn't revoked in same-top-level-site dedicated worker: ${response}`); - } - - resolve(); - } catch (e) { - reject(e); - } - }); -}, "Blob URL shouldn't be revocable from a cross-partition dedicated worker"); - -const newSharedWorker = (origin) => { - const worker_token = token(); - const worker_url = origin + executor_worker_path + `&uuid=${worker_token}`; - const worker = new SharedWorker(worker_url, worker_token); - return worker_token; -} - -promise_test(t => { - return new Promise(async (resolve, reject) => { - try { - const response_queue_uuid = token(); - - const create_worker_js = (origin) => ` - const importScript = ${importScript}; - await importScript("/html/cross-origin-embedder-policy/credentialless" + - "/resources/common.js"); - await importScript("/html/anonymous-iframe/resources/common.js"); - await importScript("/common/utils.js"); - const newSharedWorker = ${newSharedWorker}; - await send("${response_queue_uuid}", newSharedWorker("${origin}")); - `; - - const [iframe_1_uuid, iframe_2_uuid] = - await create_test_iframes(t, response_queue_uuid); - - // Create a shared worker in the cross-top-level-site iframe. - await send(iframe_1_uuid, create_worker_js(same_site_origin)); - const worker_1_uuid = await receive(response_queue_uuid); - - // Create a shared worker in the same-top-level-site iframe. - await send(iframe_2_uuid, create_worker_js(same_site_origin)); - const worker_2_uuid = await receive(response_queue_uuid); - - const blob = new Blob(["blob data"], {type : "text/plain"}); - const blob_url = window.URL.createObjectURL(blob); - t.add_cleanup(() => window.URL.revokeObjectURL(blob_url)); - - await send(worker_1_uuid, - can_blob_url_be_revoked_js(blob_url, response_queue_uuid)); - var response = await receive(response_queue_uuid); - if (response !== did_not_revoke_response) { - reject(`Blob URL was revoked in not-same-top-level-site shared worker: ${response}`); - } - - await send(worker_2_uuid, - can_blob_url_be_revoked_js(blob_url, response_queue_uuid)); - response = await receive(response_queue_uuid); - if (response !== did_revoke_response) { - reject(`Blob URL wasn't revoked in same-top-level-site shared worker: ${response}`); - } - - resolve(); - } catch (e) { - reject(e); - } - }); -}, "Blob URL shouldn't be revocable from a cross-partition shared worker"); - -const newServiceWorker = async (origin) => { - const worker_token = token(); - const worker_url = origin + executor_service_worker_path + - `&uuid=${worker_token}`; - const worker_url_path = executor_service_worker_path.substring(0, - executor_service_worker_path.lastIndexOf('/')); - const scope = worker_url_path + "/not-used/"; - const reg = await navigator.serviceWorker.register(worker_url, - {'scope': scope}); - return worker_token; -} - -promise_test(t => { - return new Promise(async (resolve, reject) => { - try { - const response_queue_uuid = token(); - - const create_worker_js = (origin) => ` - const importScript = ${importScript}; - await importScript("/html/cross-origin-embedder-policy/credentialless" + - "/resources/common.js"); - await importScript("/html/anonymous-iframe/resources/common.js"); - await importScript("/common/utils.js"); - const newServiceWorker = ${newServiceWorker}; - await send("${response_queue_uuid}", await newServiceWorker("${origin}")); - `; - - const [iframe_1_uuid, iframe_2_uuid] = - await create_test_iframes(t, response_queue_uuid); - - // Create a service worker in either iframe. - await send(iframe_1_uuid, create_worker_js(same_site_origin)); - var worker_1_uuid = await receive(response_queue_uuid); - t.add_cleanup(() => - send(worker_1_uuid, "self.registration.unregister();")); - - const blob = new Blob(["blob data"], {type : "text/plain"}); - const blob_url = window.URL.createObjectURL(blob); - t.add_cleanup(() => window.URL.revokeObjectURL(blob_url)); - - await send(worker_1_uuid, - can_blob_url_be_revoked_js(blob_url, response_queue_uuid)); - const response = await receive(response_queue_uuid); - if (response !== "URL.revokeObjectURL is not exposed") { - reject(`URL.revokeObjectURL is exposed in a Service Worker context: ${response}`); - } - resolve(); - } catch (e) { - reject(e); - } - }); -}, "Blob URL shouldn't be revocable from a service worker"); -</script> -</body> diff --git a/test/fixtures/wpt/FileAPI/BlobURL/resources/common.js b/test/fixtures/wpt/FileAPI/BlobURL/resources/common.js new file mode 100644 index 00000000000000..60a97d6a5ea5fe --- /dev/null +++ b/test/fixtures/wpt/FileAPI/BlobURL/resources/common.js @@ -0,0 +1,33 @@ +const add_iframe_js = (iframe_origin, response_queue_uuid) => ` + const importScript = ${importScript}; + await importScript("/html/cross-origin-embedder-policy/credentialless" + + "/resources/common.js"); + await importScript("/html/anonymous-iframe/resources/common.js"); + await importScript("/common/utils.js"); + + // dispatcher.js has already been loaded by the popup this is running in. + await send("${response_queue_uuid}", newIframe("${iframe_origin}")); +`; + +async function create_test_iframes(t, response_queue_uuid) { + const same_site_origin = get_host_info().HTTPS_ORIGIN; + const cross_site_origin = get_host_info().HTTPS_NOTSAMESITE_ORIGIN; + + assert_equals("https://" + window.location.host, same_site_origin, + "this test assumes that the page's window.location.host corresponds to " + + "get_host_info().HTTPS_ORIGIN"); + + // Create a same-origin iframe in a cross-site popup. + const not_same_site_popup_uuid = newPopup(t, cross_site_origin); + await send(not_same_site_popup_uuid, + add_iframe_js(same_site_origin, response_queue_uuid)); + const cross_site_iframe_uuid = await receive(response_queue_uuid); + + // Create a same-origin iframe in a same-site popup. + const same_origin_popup_uuid = newPopup(t, same_site_origin); + await send(same_origin_popup_uuid, + add_iframe_js(same_site_origin, response_queue_uuid)); + const same_site_iframe_uuid = await receive(response_queue_uuid); + + return [cross_site_iframe_uuid, same_site_iframe_uuid]; +} \ No newline at end of file diff --git a/test/fixtures/wpt/FileAPI/WEB_FEATURES.yml b/test/fixtures/wpt/FileAPI/WEB_FEATURES.yml new file mode 100644 index 00000000000000..8d279ceaaeab21 --- /dev/null +++ b/test/fixtures/wpt/FileAPI/WEB_FEATURES.yml @@ -0,0 +1,3 @@ +features: +- name: file + files: "**" diff --git a/test/fixtures/wpt/FileAPI/blob/Blob-constructor.any.js b/test/fixtures/wpt/FileAPI/blob/Blob-constructor.any.js index 6dc44e8e156cce..03155b99cb20ea 100644 --- a/test/fixtures/wpt/FileAPI/blob/Blob-constructor.any.js +++ b/test/fixtures/wpt/FileAPI/blob/Blob-constructor.any.js @@ -104,6 +104,59 @@ test_blob(function() { desc: "A Uint8Array object should be treated as a sequence for the blobParts argument." }); +test(function() { + assert_throws_js(TypeError, function() { new Blob(true) }); +}, "blobParts not an object: boolean"); + +test(function() { + Boolean.prototype[Symbol.iterator] = () => ["FAIL"][Symbol.iterator]() + this.add_cleanup(function() { delete Boolean.prototype[Symbol.iterator] }); + assert_throws_js(TypeError, function() { new Blob(true) }); +}, "blobParts not an object: boolean with Boolean.prototype[Symbol.iterator]"); + +test(function() { + assert_throws_js(TypeError, function() { new Blob("fail") }); +}, "blobParts not an object: string"); + +test(function() { + const original = String.prototype[Symbol.iterator]; + String.prototype[Symbol.iterator] = () => ["FAIL"][Symbol.iterator]() + this.add_cleanup(function() { String.prototype[Symbol.iterator] = original }); + assert_throws_js(TypeError, function() { new Blob("fail") }); +}, "blobParts not an object: string with String.prototype[Symbol.iterator]"); + +test(function() { + assert_throws_js(TypeError, function() { new Blob(7) }); +}, "blobParts not an object: number"); + +test(function() { + Number.prototype[Symbol.iterator] = () => ["FAIL"][Symbol.iterator]() + this.add_cleanup(function() { delete Number.prototype[Symbol.iterator] }); + assert_throws_js(TypeError, function() { new Blob(7) }); +}, "blobParts not an object: number with Number.prototype[Symbol.iterator]"); + +test(function() { + assert_throws_js(TypeError, function() { new Blob(7n) }); +}, "blobParts not an object: BigInt"); + +test(function() { + BigInt.prototype[Symbol.iterator] = () => ["FAIL"][Symbol.iterator]() + this.add_cleanup(function() { delete BigInt.prototype[Symbol.iterator] }); + assert_throws_js(TypeError, function() { new Blob(7n) }); +}, "blobParts not an object: BigInt with BigInt.prototype[Symbol.iterator]"); + +test(function() { + const symbol = Symbol(); + assert_throws_js(TypeError, function() { new Blob(symbol) }); +}, "blobParts not an object: Symbol"); + +test(function() { + const symbol = Symbol(); + Symbol.prototype[Symbol.iterator] = () => ["FAIL"][Symbol.iterator]() + this.add_cleanup(function() { delete Symbol.prototype[Symbol.iterator] }); + assert_throws_js(TypeError, function() { new Blob(symbol) }); +}, "blobParts not an object: Symbol with Symbol.prototype[Symbol.iterator]"); + var test_error = { name: "test", message: "test error", @@ -290,14 +343,22 @@ test_blob(function() { new Int16Array([0x4150, 0x5353]), new Uint32Array([0x53534150]), new Int32Array([0x53534150]), - new Float16Array([2.65625, 58.59375]), new Float32Array([0xD341500000]) ]); }, { - expected: "PASSPASSPASSPASSPASSPASSPASSPASS", + expected: "PASSPASSPASSPASSPASSPASSPASS", type: "", desc: "Passing typed arrays as elements of the blobParts array should work." }); +test_blob(function() { + return new Blob([ + new Float16Array([2.65625, 58.59375]) + ]); +}, { + expected: "PASS", + type: "", + desc: "Passing a Float16Array as element of the blobParts array should work." +}); test_blob(function() { return new Blob([ // 0x535 3415053534150 diff --git a/test/fixtures/wpt/FileAPI/blob/Blob-newobject.any.js b/test/fixtures/wpt/FileAPI/blob/Blob-newobject.any.js new file mode 100644 index 00000000000000..e036c3a9a743e6 --- /dev/null +++ b/test/fixtures/wpt/FileAPI/blob/Blob-newobject.any.js @@ -0,0 +1,12 @@ +// META: title=Blob methods return new objects ([NewObject]) +// META: global=window,worker +'use strict'; + +['stream', 'text', 'arrayBuffer', 'bytes'].forEach(method => { + test(() => { + const blob = new Blob(['PASS']); + const a = blob[method](); + const b = blob[method](); + assert_not_equals(a, b, `Blob.${method}() must return a new object`); + }, `Blob.${method}() returns [NewObject]`); +}); diff --git a/test/fixtures/wpt/FileAPI/blob/Blob-slice.any.js b/test/fixtures/wpt/FileAPI/blob/Blob-slice.any.js index 1f85d44d269191..bedc8d737302a0 100644 --- a/test/fixtures/wpt/FileAPI/blob/Blob-slice.any.js +++ b/test/fixtures/wpt/FileAPI/blob/Blob-slice.any.js @@ -12,24 +12,50 @@ test_blob(function() { }); test(function() { - var blob1, blob2; + var blob1 = new Blob(["squiggle"]); + var blob2 = new Blob(["steak"], {type: "content/type"}); - test_blob(function() { - return blob1 = new Blob(["squiggle"]); - }, { + test_blob(() => blob1, + { expected: "squiggle", type: "", desc: "blob1." }); - test_blob(function() { - return blob2 = new Blob(["steak"], {type: "content/type"}); - }, { + test_blob(() => blob2, + { expected: "steak", type: "content/type", desc: "blob2." }); + test_blob(function() { + var blob = new Blob(["abcd"]); + return blob.slice(undefined, undefined, "content/type"); + }, { + expected: "abcd", + type: "content/type", + desc: "undefined start/end Blob slice" + }); + + test_blob(function() { + var blob = new Blob(["abcd"]); + return blob.slice(undefined, 2, "content/type"); + }, { + expected: "ab", + type: "content/type", + desc: "undefined start Blob slice" + }); + + test_blob(function() { + var blob = new Blob(["abcd"]); + return blob.slice(2, undefined, "content/type"); + }, { + expected: "cd", + type: "content/type", + desc: "undefined end Blob slice" + }); + test_blob(function() { return new Blob().slice(0,0,null); }, { @@ -74,6 +100,21 @@ test(function() { {start: 7, end: 4, contents: ""}] ], + // Test double start/end values + [ + ["abcd"], + [{start: 0.5, contents: "abcd"}, + {start: 1.5, contents: "cd"}, + {start: 2.5, contents: "cd"}, + {start: 3.5, contents: ""}, + {start: 0, end: 0.5, contents: ""}, + {start: 0, end: 1.5, contents: "ab"}, + {start: 0, end: 2.5, contents: "ab"}, + {start: 0, end: 3.5, contents: "abcd"}, + {start: 1.5, end: 2.5, contents: ""}, + {start: 1.5, end: 3.5, contents: "cd"}] + ], + // Test 3 strings [ ["foo", "bar", "baz"], diff --git a/test/fixtures/wpt/FileAPI/reading-data-section/filereader_readAsArrayBuffer.any.js b/test/fixtures/wpt/FileAPI/reading-data-section/filereader_readAsArrayBuffer.any.js index d06e3170782b7c..88c4f4d26cc0b2 100644 --- a/test/fixtures/wpt/FileAPI/reading-data-section/filereader_readAsArrayBuffer.any.js +++ b/test/fixtures/wpt/FileAPI/reading-data-section/filereader_readAsArrayBuffer.any.js @@ -7,6 +7,7 @@ reader.onload = this.step_func(function(evt) { assert_equals(reader.result.byteLength, 4, "The byteLength is 4"); assert_true(reader.result instanceof ArrayBuffer, "The result is instanceof ArrayBuffer"); + assert_array_equals(new Uint8Array(reader.result), [84, 69, 83, 84]); assert_equals(reader.readyState, reader.DONE); this.done(); }); diff --git a/test/fixtures/wpt/FileAPI/support/Blob.js b/test/fixtures/wpt/FileAPI/support/Blob.js index 2c249746858918..e8a52425a17085 100644 --- a/test/fixtures/wpt/FileAPI/support/Blob.js +++ b/test/fixtures/wpt/FileAPI/support/Blob.js @@ -5,23 +5,16 @@ self.test_blob = (fn, expectations) => { type = expectations.type, desc = expectations.desc; - var t = async_test(desc); - t.step(function() { + promise_test(async (t) => { var blob = fn(); assert_true(blob instanceof Blob); assert_false(blob instanceof File); assert_equals(blob.type, type); assert_equals(blob.size, expected.length); - var fr = new FileReader(); - fr.onload = t.step_func_done(function(event) { - assert_equals(this.result, expected); - }, fr); - fr.onerror = t.step_func(function(e) { - assert_unreached("got error event on FileReader"); - }); - fr.readAsText(blob, "UTF-8"); - }); + const text = await blob.text(); + assert_equals(text, expected); + }, desc); } self.test_blob_binary = (fn, expectations) => { @@ -29,25 +22,18 @@ self.test_blob_binary = (fn, expectations) => { type = expectations.type, desc = expectations.desc; - var t = async_test(desc); - t.step(function() { + promise_test(async (t) => { var blob = fn(); assert_true(blob instanceof Blob); assert_false(blob instanceof File); assert_equals(blob.type, type); assert_equals(blob.size, expected.length); - var fr = new FileReader(); - fr.onload = t.step_func_done(function(event) { - assert_true(this.result instanceof ArrayBuffer, - "Result should be an ArrayBuffer"); - assert_array_equals(new Uint8Array(this.result), expected); - }, fr); - fr.onerror = t.step_func(function(e) { - assert_unreached("got error event on FileReader"); - }); - fr.readAsArrayBuffer(blob); - }); + const ab = await blob.arrayBuffer(); + assert_true(ab instanceof ArrayBuffer, + "Result should be an ArrayBuffer"); + assert_array_equals(new Uint8Array(ab), expected); + }, desc); } // Assert that two TypedArray objects have the same byte values diff --git a/test/fixtures/wpt/FileAPI/support/send-file-form-helper.js b/test/fixtures/wpt/FileAPI/support/send-file-form-helper.js index 39c73c41b42207..d6adf21ec33795 100644 --- a/test/fixtures/wpt/FileAPI/support/send-file-form-helper.js +++ b/test/fixtures/wpt/FileAPI/support/send-file-form-helper.js @@ -180,7 +180,7 @@ const formPostFileUploadTest = ({ // Used to verify that the browser agrees with the test about // field value replacement and encoding independently of file system - // idiosyncrasies. + // idiosyncracies. form.append(Object.assign(document.createElement('input'), { type: 'hidden', name: 'filename', diff --git a/test/fixtures/wpt/FileAPI/support/send-file-formdata-helper.js b/test/fixtures/wpt/FileAPI/support/send-file-formdata-helper.js index dd62a0e98e92c8..53c8cca7e09b8e 100644 --- a/test/fixtures/wpt/FileAPI/support/send-file-formdata-helper.js +++ b/test/fixtures/wpt/FileAPI/support/send-file-formdata-helper.js @@ -34,7 +34,7 @@ const formDataPostFileUploadTest = ({ // Used to verify that the browser agrees with the test about // field value replacement and encoding independently of file system - // idiosyncrasies. + // idiosyncracies. formData.append("filename", fileBaseName); // Same, but with name and value reversed to ensure field names diff --git a/test/fixtures/wpt/FileAPI/url/url-in-tags.window.js b/test/fixtures/wpt/FileAPI/url/url-in-tags.window.js index f20b3599013bf5..8a722dcac82b66 100644 --- a/test/fixtures/wpt/FileAPI/url/url-in-tags.window.js +++ b/test/fixtures/wpt/FileAPI/url/url-in-tags.window.js @@ -1,3 +1,10 @@ +setup(() => { + const viewport_meta = document.createElement('meta'); + viewport_meta.name = "viewport"; + viewport_meta.content = "width=device-width,initial-scale=1"; + document.head.appendChild(viewport_meta); +}); + async_test(t => { const run_result = 'test_script_OK'; const blob_contents = 'window.test_result = "' + run_result + '";'; diff --git a/test/fixtures/wpt/README.md b/test/fixtures/wpt/README.md index 8cb1e30007ac65..ec1b3f5e071c73 100644 --- a/test/fixtures/wpt/README.md +++ b/test/fixtures/wpt/README.md @@ -11,13 +11,13 @@ See [test/wpt](../../wpt/README.md) for information on how these tests are run. Last update: - common: https://github.com/web-platform-tests/wpt/tree/dbd648158d/common -- compression: https://github.com/web-platform-tests/wpt/tree/67880a4eb8/compression +- compression: https://github.com/web-platform-tests/wpt/tree/ae05f5cb53/compression - console: https://github.com/web-platform-tests/wpt/tree/e48251b778/console - dom/abort: https://github.com/web-platform-tests/wpt/tree/dc928169ee/dom/abort - dom/events: https://github.com/web-platform-tests/wpt/tree/0a811c5161/dom/events - encoding: https://github.com/web-platform-tests/wpt/tree/1ac8deee08/encoding - fetch/data-urls/resources: https://github.com/web-platform-tests/wpt/tree/7c79d998ff/fetch/data-urls/resources -- FileAPI: https://github.com/web-platform-tests/wpt/tree/cceaf3628d/FileAPI +- FileAPI: https://github.com/web-platform-tests/wpt/tree/7f51301888/FileAPI - hr-time: https://github.com/web-platform-tests/wpt/tree/34cafd797e/hr-time - html/webappapis/atob: https://github.com/web-platform-tests/wpt/tree/f267e1dca6/html/webappapis/atob - html/webappapis/microtask-queuing: https://github.com/web-platform-tests/wpt/tree/2c5c3c4c27/html/webappapis/microtask-queuing @@ -28,13 +28,13 @@ Last update: - resource-timing: https://github.com/web-platform-tests/wpt/tree/22d38586d0/resource-timing - resources: https://github.com/web-platform-tests/wpt/tree/1d2c5fb36a/resources - streams: https://github.com/web-platform-tests/wpt/tree/bc9dcbbf1a/streams -- url: https://github.com/web-platform-tests/wpt/tree/efb889eb4c/url +- url: https://github.com/web-platform-tests/wpt/tree/fc3e651593/url - urlpattern: https://github.com/web-platform-tests/wpt/tree/a2e15ad405/urlpattern - user-timing: https://github.com/web-platform-tests/wpt/tree/5ae85bf826/user-timing - wasm/jsapi: https://github.com/web-platform-tests/wpt/tree/cde25e7e3c/wasm/jsapi - wasm/webapi: https://github.com/web-platform-tests/wpt/tree/fd1b23eeaa/wasm/webapi - web-locks: https://github.com/web-platform-tests/wpt/tree/10a122a6bc/web-locks -- WebCryptoAPI: https://github.com/web-platform-tests/wpt/tree/7cbe7e8ed9/WebCryptoAPI +- WebCryptoAPI: https://github.com/web-platform-tests/wpt/tree/6a1c545d77/WebCryptoAPI - webidl/ecmascript-binding/es-exceptions: https://github.com/web-platform-tests/wpt/tree/2f96fa1996/webidl/ecmascript-binding/es-exceptions - webmessaging/broadcastchannel: https://github.com/web-platform-tests/wpt/tree/6495c91853/webmessaging/broadcastchannel - webstorage: https://github.com/web-platform-tests/wpt/tree/1d2c5fb36a/webstorage diff --git a/test/fixtures/wpt/WebCryptoAPI/digest/cshake.tentative.https.any.js b/test/fixtures/wpt/WebCryptoAPI/digest/cshake.tentative.https.any.js index e793722d8be598..d0c23c09ada4a9 100644 --- a/test/fixtures/wpt/WebCryptoAPI/digest/cshake.tentative.https.any.js +++ b/test/fixtures/wpt/WebCryptoAPI/digest/cshake.tentative.https.any.js @@ -171,26 +171,77 @@ Object.keys(digestedData).forEach(function (alg) { }); }, alg + ' with ' + length + ' bit output and ' + size + ' source data'); - promise_test(function (test) { - var buffer = new Uint8Array(sourceData[size]); - return crypto.subtle - .digest({ name: alg, length: length }, buffer) - .then(function (result) { - // Alter the buffer after calling digest - if (buffer.length > 0) { - buffer[0] = ~buffer[0]; - } - assert_true( - equalBuffers(result, digestedData[alg][length][size]), - 'digest matches expected' - ); - }); - }, alg + - ' with ' + - length + - ' bit output and ' + - size + - ' source data and altered buffer after call'); + if (sourceData[size].length > 0) { + promise_test(function (test) { + var buffer = new Uint8Array(sourceData[size]); + // Alter the buffer before calling digest + buffer[0] = ~buffer[0]; + return crypto.subtle + .digest({ + get name() { + // Alter the buffer back while calling digest + buffer[0] = sourceData[size][0]; + return alg; + }, + length + }, buffer) + .then(function (result) { + assert_true( + equalBuffers(result, digestedData[alg][length][size]), + 'digest matches expected' + ); + }); + }, alg + ' with ' + length + ' bit output and ' + size + ' source data and altered buffer during call'); + + promise_test(function (test) { + var buffer = new Uint8Array(sourceData[size]); + var promise = crypto.subtle + .digest({ name: alg, length: length }, buffer) + .then(function (result) { + assert_true( + equalBuffers(result, digestedData[alg][length][size]), + 'digest matches expected' + ); + }); + // Alter the buffer after calling digest + buffer[0] = ~buffer[0]; + return promise; + }, alg + ' with ' + length + ' bit output and ' + size + ' source data and altered buffer after call'); + + promise_test(function (test) { + var buffer = new Uint8Array(sourceData[size]); + return crypto.subtle + .digest({ + get name() { + // Transfer the buffer while calling digest + buffer.buffer.transfer(); + return alg; + }, + length + }, buffer) + .then(function (result) { + assert_true( + equalBuffers(result, digestedData[alg][length].empty), + 'digest on transferred buffer should match result for empty buffer' + ); + }); + }, alg + ' with ' + length + ' bit output and ' + size + ' source data and transferred buffer during call'); + + promise_test(function (test) { + var buffer = new Uint8Array(sourceData[size]); + var promise = crypto.subtle + .digest({ name: alg, length: length }, buffer) + .then(function (result) { + assert_true( + equalBuffers(result, digestedData[alg][length][size]), + 'digest matches expected' + ); + }); + // Transfer the buffer after calling digest + buffer.buffer.transfer(); + return promise; + }, alg + ' with ' + length + ' bit output and ' + size + ' source data and transferred buffer after call'); + } }); }); }); diff --git a/test/fixtures/wpt/WebCryptoAPI/digest/digest.https.any.js b/test/fixtures/wpt/WebCryptoAPI/digest/digest.https.any.js index 3b0972b1f2bf7d..47bc220d44fb70 100644 --- a/test/fixtures/wpt/WebCryptoAPI/digest/digest.https.any.js +++ b/test/fixtures/wpt/WebCryptoAPI/digest/digest.https.any.js @@ -83,19 +83,61 @@ return promise; }, mixedCase + " with " + size + " source data"); - promise_test(function(test) { - var copiedBuffer = copyBuffer(sourceData[size]); - var promise = subtle.digest({name: upCase}, copiedBuffer) - .then(function(result) { - assert_true(equalBuffers(result, digestedData[alg][size]), "digest() yielded expected result for " + alg + ":" + size); - }, function(err) { - assert_unreached("digest() threw an error for " + alg + ":" + size + " - " + err.message); - }); - - copiedBuffer[0] = 255 - copiedBuffer; - return promise; - }, upCase + " with " + size + " source data and altered buffer after call"); - + if (sourceData[size].length > 0) { + promise_test(function(test) { + var copiedBuffer = copyBuffer(sourceData[size]); + copiedBuffer[0] = 255 - copiedBuffer[0]; + var promise = subtle.digest({ + get name() { + copiedBuffer[0] = sourceData[size][0]; + return upCase; + } + }, copiedBuffer) + .then(function(result) { + assert_true(equalBuffers(result, digestedData[alg][size]), "digest() yielded expected result for " + alg + ":" + size); + }, function(err) { + assert_unreached("digest() threw an error for " + alg + ":" + size + " - " + err.message); + }); + return promise; + }, upCase + " with " + size + " source data and altered buffer during call"); + + promise_test(function(test) { + var copiedBuffer = copyBuffer(sourceData[size]); + var promise = subtle.digest({name: upCase}, copiedBuffer) + .then(function(result) { + assert_true(equalBuffers(result, digestedData[alg][size]), "digest() yielded expected result for " + alg + ":" + size); + }, function(err) { + assert_unreached("digest() threw an error for " + alg + ":" + size + " - " + err.message); + }); + + copiedBuffer[0] = 255 - copiedBuffer[0]; + return promise; + }, upCase + " with " + size + " source data and altered buffer after call"); + + promise_test(function(test) { + var copiedBuffer = copyBuffer(sourceData[size]); + copiedBuffer.buffer.transfer(); + return subtle.digest({name: upCase}, copiedBuffer) + .then(function(result) { + assert_true(equalBuffers(result, digestedData[alg].empty), "digest() on transferred buffer should yield result for empty buffer for " + alg + ":" + size); + }, function(err) { + assert_unreached("digest() threw an error for transferred buffer for " + alg + ":" + size + ": " + err.message); + }); + }, upCase + " with " + size + " source data and transferred buffer during call"); + + promise_test(function(test) { + var copiedBuffer = copyBuffer(sourceData[size]); + var promise = subtle.digest({name: upCase}, copiedBuffer) + .then(function(result) { + assert_true(equalBuffers(result, digestedData[alg][size]), "digest() yielded expected result for " + alg + ":" + size); + }, function(err) { + assert_unreached("digest() threw an error for " + alg + ":" + size + " - " + err.message); + }); + + copiedBuffer.buffer.transfer(); + return promise; + }, upCase + " with " + size + " source data and transferred buffer after call"); + } }); }); diff --git a/test/fixtures/wpt/WebCryptoAPI/digest/sha3.tentative.https.any.js b/test/fixtures/wpt/WebCryptoAPI/digest/sha3.tentative.https.any.js index 8f84ad08ca1a25..4ae99791b8c95f 100644 --- a/test/fixtures/wpt/WebCryptoAPI/digest/sha3.tentative.https.any.js +++ b/test/fixtures/wpt/WebCryptoAPI/digest/sha3.tentative.https.any.js @@ -109,19 +109,71 @@ Object.keys(sourceData).forEach(function (size) { }); }, alg + ' with ' + size + ' source data'); - promise_test(function (test) { - var buffer = new Uint8Array(sourceData[size]); - return crypto.subtle.digest(alg, buffer).then(function (result) { + if (sourceData[size].length > 0) { + promise_test(function (test) { + var buffer = new Uint8Array(sourceData[size]); + // Alter the buffer before calling digest + buffer[0] = ~buffer[0]; + return crypto.subtle + .digest({ + get name() { + // Alter the buffer back while calling digest + buffer[0] = sourceData[size][0]; + return alg; + } + }, buffer) + .then(function (result) { + assert_true( + equalBuffers(result, digestedData[alg][size]), + 'digest matches expected' + ); + }); + }, alg + ' with ' + size + ' source data and altered buffer during call'); + + promise_test(function (test) { + var buffer = new Uint8Array(sourceData[size]); + var promise = crypto.subtle.digest(alg, buffer).then(function (result) { + assert_true( + equalBuffers(result, digestedData[alg][size]), + 'digest matches expected' + ); + }); // Alter the buffer after calling digest - if (buffer.length > 0) { - buffer[0] = ~buffer[0]; - } - assert_true( - equalBuffers(result, digestedData[alg][size]), - 'digest matches expected' - ); - }); - }, alg + ' with ' + size + ' source data and altered buffer after call'); + buffer[0] = ~buffer[0]; + return promise; + }, alg + ' with ' + size + ' source data and altered buffer after call'); + + promise_test(function (test) { + var buffer = new Uint8Array(sourceData[size]); + return crypto.subtle + .digest({ + get name() { + // Transfer the buffer while calling digest + buffer.buffer.transfer(); + return alg; + } + }, buffer) + .then(function (result) { + assert_true( + equalBuffers(result, digestedData[alg].empty), + 'digest on transferred buffer should match result for empty buffer' + ); + }); + }, alg + ' with ' + size + ' source data and transferred buffer during call'); + + promise_test(function (test) { + var buffer = new Uint8Array(sourceData[size]); + var promise = crypto.subtle.digest(alg, buffer).then(function (result) { + assert_true( + equalBuffers(result, digestedData[alg][size]), + 'digest matches expected' + ); + }); + // Transfer the buffer after calling digest + buffer.buffer.transfer(); + return promise; + }, alg + ' with ' + size + ' source data and transferred buffer after call'); + } }); }); diff --git a/test/fixtures/wpt/WebCryptoAPI/encrypt_decrypt/aes.js b/test/fixtures/wpt/WebCryptoAPI/encrypt_decrypt/aes.js index d93b60f8b87569..456f66423419c8 100644 --- a/test/fixtures/wpt/WebCryptoAPI/encrypt_decrypt/aes.js +++ b/test/fixtures/wpt/WebCryptoAPI/encrypt_decrypt/aes.js @@ -35,6 +35,38 @@ function run_test() { all_promises.push(promise); }); + // Check for successful encryption even if the buffer is changed while calling encrypt. + passingVectors.forEach(function(vector) { + var plaintext = copyBuffer(vector.plaintext); + plaintext[0] = 255 - plaintext[0]; + var promise = importVectorKey(vector, ["encrypt", "decrypt"]) + .then(function(vector) { + promise_test(function(test) { + var operation = subtle.encrypt({ + ...vector.algorithm, + get name() { + plaintext[0] = vector.plaintext[0]; + return vector.algorithm.name; + } + }, vector.key, plaintext) + .then(function(result) { + assert_true(equalBuffers(result, vector.result), "Should return expected result"); + }, function(err) { + assert_unreached("encrypt error for test " + vector.name + ": " + err.message); + }); + return operation; + }, vector.name + " with altered plaintext during call"); + }, function(err) { + // We need a failed test if the importVectorKey operation fails, so + // we know we never tested encryption + promise_test(function(test) { + assert_unreached("importKey failed for " + vector.name); + }, "importKey step: " + vector.name + " with altered plaintext during call"); + }); + + all_promises.push(promise); + }); + // Check for successful encryption even if the buffer is changed after calling encrypt. passingVectors.forEach(function(vector) { var plaintext = copyBuffer(vector.plaintext); @@ -49,13 +81,74 @@ function run_test() { }); plaintext[0] = 255 - plaintext[0]; return operation; - }, vector.name + " with altered plaintext"); + }, vector.name + " with altered plaintext after call"); + }, function(err) { + // We need a failed test if the importVectorKey operation fails, so + // we know we never tested encryption + promise_test(function(test) { + assert_unreached("importKey failed for " + vector.name); + }, "importKey step: " + vector.name + " with altered plaintext after call"); + }); + + all_promises.push(promise); + }); + + // Check for encryption of an empty value if the buffer is transferred while calling encrypt. + passingVectors.forEach(function(vector) { + var plaintext = copyBuffer(vector.plaintext); + var promise = importVectorKey(vector, ["encrypt", "decrypt"]) + .then(function(vector) { + promise_test(function(test) { + var operation = subtle.encrypt({ + ...vector.algorithm, + get name() { + plaintext.buffer.transfer(); + return vector.algorithm.name; + } + }, vector.key, plaintext) + .then(function(result) { + var expectedLength = + ["AES-GCM", "AES-OCB"].includes(vector.algorithm.name) ? vector.algorithm.tagLength / 8 : + vector.algorithm.name === "AES-CBC" ? 16 : + 0; + assert_equals(result.byteLength, expectedLength, "Transferred plaintext yields an empty ciphertext"); + }, function(err) { + assert_unreached("encrypt error for test " + vector.name + ": " + err.message); + }); + return operation; + }, vector.name + " with transferred plaintext during call"); + }, function(err) { + // We need a failed test if the importVectorKey operation fails, so + // we know we never tested encryption + promise_test(function(test) { + assert_unreached("importKey failed for " + vector.name); + }, "importKey step: " + vector.name + " with transferred plaintext during call"); + }); + + all_promises.push(promise); + }); + + // Check for successful encryption even if the buffer is transferred after calling encrypt. + passingVectors.forEach(function(vector) { + var plaintext = copyBuffer(vector.plaintext); + var promise = importVectorKey(vector, ["encrypt", "decrypt"]) + .then(function(vector) { + promise_test(function(test) { + var operation = subtle.encrypt(vector.algorithm, vector.key, plaintext) + .then(function(result) { + assert_true(equalBuffers(result, vector.result), "Should return expected result"); + }, function(err) { + assert_unreached("encrypt error for test " + vector.name + ": " + err.message); + }); + plaintext.buffer.transfer(); + return operation; + }, vector.name + " with transferred plaintext after call"); }, function(err) { // We need a failed test if the importVectorKey operation fails, so // we know we never tested encryption promise_test(function(test) { assert_unreached("importKey failed for " + vector.name); - }, "importKey step: " + vector.name + " with altered plaintext"); + }, "importKey step: " + vector.name + " with transferred plaintext after call"); }); all_promises.push(promise); @@ -84,7 +177,39 @@ function run_test() { all_promises.push(promise); }); - // Check for successful decryption even if ciphertext is altered. + // Check for successful decryption even if ciphertext is altered while calling encrypt. + passingVectors.forEach(function(vector) { + var ciphertext = copyBuffer(vector.result); + ciphertext[0] = 255 - ciphertext[0]; + var promise = importVectorKey(vector, ["encrypt", "decrypt"]) + .then(function(vector) { + promise_test(function(test) { + var operation = subtle.decrypt({ + ...vector.algorithm, + get name() { + ciphertext[0] = vector.result[0]; + return vector.algorithm.name; + } + }, vector.key, ciphertext) + .then(function(result) { + assert_true(equalBuffers(result, vector.plaintext), "Should return expected result"); + }, function(err) { + assert_unreached("decrypt error for test " + vector.name + ": " + err.message); + }); + return operation; + }, vector.name + " decryption with altered ciphertext during call"); + }, function(err) { + // We need a failed test if the importVectorKey operation fails, so + // we know we never tested encryption + promise_test(function(test) { + assert_unreached("importKey failed for " + vector.name); + }, "importKey step for decryption: " + vector.name + " with altered ciphertext during call"); + }); + + all_promises.push(promise); + }); + + // Check for successful decryption even if ciphertext is altered after calling encrypt. passingVectors.forEach(function(vector) { var ciphertext = copyBuffer(vector.result); var promise = importVectorKey(vector, ["encrypt", "decrypt"]) @@ -98,13 +223,78 @@ function run_test() { }); ciphertext[0] = 255 - ciphertext[0]; return operation; - }, vector.name + " decryption with altered ciphertext"); + }, vector.name + " decryption with altered ciphertext after call"); + }, function(err) { + // We need a failed test if the importVectorKey operation fails, so + // we know we never tested encryption + promise_test(function(test) { + assert_unreached("importKey failed for " + vector.name); + }, "importKey step for decryption: " + vector.name + " with altered ciphertext after call"); + }); + + all_promises.push(promise); + }); + + // Check for decryption when ciphertext is transferred while calling decrypt. + passingVectors.forEach(function(vector) { + var ciphertext = copyBuffer(vector.result); + var promise = importVectorKey(vector, ["encrypt", "decrypt"]) + .then(function(vector) { + promise_test(function(test) { + var operation = subtle.decrypt({ + ...vector.algorithm, + get name() { + ciphertext.buffer.transfer(); + return vector.algorithm.name; + } + }, vector.key, ciphertext) + .then(function(result) { + if (vector.algorithm.name === "AES-CTR") { + assert_equals(result.byteLength, 0, "Transferred ciphertext yields empty plaintext"); + } else { + assert_unreached("decrypt should not have succeeded for " + vector.name); + } + }, function(err) { + if (vector.algorithm.name === "AES-CTR") { + assert_unreached("decrypt error for test " + vector.name + ": " + err.message); + } else { + assert_equals(err.name, "OperationError", "Should throw an OperationError instead of " + err.message); + } + }); + return operation; + }, vector.name + " decryption with transferred ciphertext during call"); + }, function(err) { + // We need a failed test if the importVectorKey operation fails, so + // we know we never tested encryption + promise_test(function(test) { + assert_unreached("importKey failed for " + vector.name); + }, "importKey step for decryption: " + vector.name + " with transferred ciphertext during call"); + }); + + all_promises.push(promise); + }); + + // Check for successful decryption even if ciphertext is transferred after calling encrypt. + passingVectors.forEach(function(vector) { + var ciphertext = copyBuffer(vector.result); + var promise = importVectorKey(vector, ["encrypt", "decrypt"]) + .then(function(vector) { + promise_test(function(test) { + var operation = subtle.decrypt(vector.algorithm, vector.key, ciphertext) + .then(function(result) { + assert_true(equalBuffers(result, vector.plaintext), "Should return expected result"); + }, function(err) { + assert_unreached("decrypt error for test " + vector.name + ": " + err.message); + }); + ciphertext.buffer.transfer(); + return operation; + }, vector.name + " decryption with transferred ciphertext after call"); }, function(err) { // We need a failed test if the importVectorKey operation fails, so // we know we never tested encryption promise_test(function(test) { assert_unreached("importKey failed for " + vector.name); - }, "importKey step for decryption: " + vector.name + " with altered ciphertext"); + }, "importKey step for decryption: " + vector.name + " with transferred ciphertext after call"); }); all_promises.push(promise); diff --git a/test/fixtures/wpt/WebCryptoAPI/encrypt_decrypt/rsa.js b/test/fixtures/wpt/WebCryptoAPI/encrypt_decrypt/rsa.js index 5eae06e474564a..6f585cbe1ffcef 100644 --- a/test/fixtures/wpt/WebCryptoAPI/encrypt_decrypt/rsa.js +++ b/test/fixtures/wpt/WebCryptoAPI/encrypt_decrypt/rsa.js @@ -25,7 +25,7 @@ function run_test() { .then(function(plaintext) { assert_true(equalBuffers(plaintext, vector.plaintext, "Decryption works")); }, function(err) { - assert_unreached("Decryption should not throw error " + vector.name + ": " + err.message + "'"); + assert_unreached("Decryption should not throw error " + vector.name + ": '" + err.message + "'"); }); }, vector.name + " decryption"); @@ -40,7 +40,45 @@ function run_test() { all_promises.push(promise); }); - // Test decryption with an altered buffer + // Test decryption with an altered buffer during call + passingVectors.forEach(function(vector) { + var promise = importVectorKeys(vector, ["encrypt"], ["decrypt"]) + .then(function(vectors) { + // Get a one byte longer plaintext to encrypt + if (!("ciphertext" in vector)) { + return; + } + + promise_test(function(test) { + var ciphertext = copyBuffer(vector.ciphertext); + ciphertext[0] = 255 - ciphertext[0]; + var operation = subtle.decrypt({ + ...vector.algorithm, + get name() { + ciphertext[0] = vector.ciphertext[0]; + return vector.algorithm.name; + } + }, vector.privateKey, ciphertext) + .then(function(plaintext) { + assert_true(equalBuffers(plaintext, vector.plaintext, "Decryption works")); + }, function(err) { + assert_unreached("Decryption should not throw error " + vector.name + ": '" + err.message + "'"); + }); + return operation; + }, vector.name + " decryption with altered ciphertext during call"); + + }, function(err) { + // We need a failed test if the importVectorKey operation fails, so + // we know we never tested encryption + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " decryption with altered ciphertext during call"); + }); + + all_promises.push(promise); + }); + + // Test decryption with an altered buffer after call passingVectors.forEach(function(vector) { var promise = importVectorKeys(vector, ["encrypt"], ["decrypt"]) .then(function(vectors) { @@ -55,18 +93,87 @@ function run_test() { .then(function(plaintext) { assert_true(equalBuffers(plaintext, vector.plaintext, "Decryption works")); }, function(err) { - assert_unreached("Decryption should not throw error " + vector.name + ": " + err.message + "'"); + assert_unreached("Decryption should not throw error " + vector.name + ": '" + err.message + "'"); }); ciphertext[0] = 255 - ciphertext[0]; return operation; - }, vector.name + " decryption with altered ciphertext"); + }, vector.name + " decryption with altered ciphertext after call"); + + }, function(err) { + // We need a failed test if the importVectorKey operation fails, so + // we know we never tested encryption + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " decryption with altered ciphertext after call"); + }); + + all_promises.push(promise); + }); + + // Test decryption with a transferred buffer during call + passingVectors.forEach(function(vector) { + var promise = importVectorKeys(vector, ["encrypt"], ["decrypt"]) + .then(function(vectors) { + // Get a one byte longer plaintext to encrypt + if (!("ciphertext" in vector)) { + return; + } + + promise_test(function(test) { + var ciphertext = copyBuffer(vector.ciphertext); + var operation = subtle.decrypt({ + ...vector.algorithm, + get name() { + ciphertext.buffer.transfer(); + return vector.algorithm.name; + } + }, vector.privateKey, ciphertext) + .then(function(plaintext) { + assert_unreached("Decryption should not have succeeded for " + vector.name); + }, function(err) { + assert_equals(err.name, "OperationError", "Should throw OperationError instead of " + err.message); + }); + return operation; + }, vector.name + " decryption with transferred ciphertext during call"); }, function(err) { // We need a failed test if the importVectorKey operation fails, so // we know we never tested encryption promise_test(function(test) { assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); - }, "importVectorKeys step: " + vector.name + " decryption with altered ciphertext"); + }, "importVectorKeys step: " + vector.name + " decryption with transferred ciphertext during call"); + }); + + all_promises.push(promise); + }); + + // Test decryption with a transferred buffer after call + passingVectors.forEach(function(vector) { + var promise = importVectorKeys(vector, ["encrypt"], ["decrypt"]) + .then(function(vectors) { + // Get a one byte longer plaintext to encrypt + if (!("ciphertext" in vector)) { + return; + } + + promise_test(function(test) { + var ciphertext = copyBuffer(vector.ciphertext); + var operation = subtle.decrypt(vector.algorithm, vector.privateKey, ciphertext) + .then(function(plaintext) { + assert_true(equalBuffers(plaintext, vector.plaintext, "Decryption works")); + }, function(err) { + assert_unreached("Decryption should not throw error " + vector.name + ": '" + err.message + "'"); + }); + ciphertext.buffer.transfer(); + return operation; + }, vector.name + " decryption with transferred ciphertext after call"); + + }, function(err) { + // We need a failed test if the importVectorKey operation fails, so + // we know we never tested encryption + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " decryption with transferred ciphertext after call"); }); all_promises.push(promise); @@ -79,7 +186,7 @@ function run_test() { promise_test(function(test) { return subtle.decrypt(vector.algorithm, vector.publicKey, vector.ciphertext) .then(function(plaintext) { - assert_unreached("Should have thrown error for using publicKey to decrypt in " + vector.name + ": " + err.message + "'"); + assert_unreached("Should have thrown error for using publicKey to decrypt in " + vector.name + ": '" + err.message + "'"); }, function(err) { assert_equals(err.name, "InvalidAccessError", "Should throw InvalidAccessError instead of " + err.message); }); @@ -107,7 +214,7 @@ function run_test() { promise_test(function(test) { return subtle.decrypt(vector.algorithm, vector.publicKey, vector.ciphertext) .then(function(plaintext) { - assert_unreached("Should have thrown error for no decrypt usage in " + vector.name + ": " + err.message + "'"); + assert_unreached("Should have thrown error for no decrypt usage in " + vector.name + ": '" + err.message + "'"); }, function(err) { assert_equals(err.name, "InvalidAccessError", "Should throw InvalidAccessError instead of " + err.message); }); @@ -125,6 +232,57 @@ function run_test() { }); + // Check for successful encryption even if plaintext is altered during call. + passingVectors.forEach(function(vector) { + var promise = importVectorKeys(vector, ["encrypt"], ["decrypt"]) + .then(function(vectors) { + promise_test(function(test) { + var plaintext = copyBuffer(vector.plaintext); + plaintext[0] = 255 - plaintext[0]; + var operation = subtle.encrypt({ + ...vector.algorithm, + get name() { + plaintext[0] = vector.plaintext[0]; + return vector.algorithm.name; + } + }, vector.publicKey, plaintext) + .then(function(ciphertext) { + assert_equals(ciphertext.byteLength * 8, vector.privateKey.algorithm.modulusLength, "Ciphertext length matches modulus length"); + // Can we get the original plaintext back via decrypt? + return subtle.decrypt(vector.algorithm, vector.privateKey, ciphertext) + .then(function(result) { + assert_true(equalBuffers(result, vector.plaintext), "Round trip returns original plaintext"); + return ciphertext; + }, function(err) { + assert_unreached("decrypt error for test " + vector.name + ": '" + err.message + "'"); + }); + }) + .then(function(priorCiphertext) { + // Will a second encrypt give us different ciphertext, as it should? + return subtle.encrypt(vector.algorithm, vector.publicKey, vector.plaintext) + .then(function(ciphertext) { + assert_false(equalBuffers(priorCiphertext, ciphertext), "Two encrypts give different results") + }, function(err) { + assert_unreached("second time encrypt error for test " + vector.name + ": '" + err.message + "'"); + }); + }, function(err) { + assert_unreached("decrypt error for test " + vector.name + ": '" + err.message + "'"); + }); + + return operation; + }, vector.name + " with altered plaintext during call"); + + }, function(err) { + // We need a failed test if the importVectorKey operation fails, so + // we know we never tested encryption + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " with altered plaintext during call"); + }); + + all_promises.push(promise); + }); + // Check for successful encryption even if plaintext is altered after call. passingVectors.forEach(function(vector) { var promise = importVectorKeys(vector, ["encrypt"], ["decrypt"]) @@ -140,7 +298,7 @@ function run_test() { assert_true(equalBuffers(result, vector.plaintext), "Round trip returns original plaintext"); return ciphertext; }, function(err) { - assert_unreached("decrypt error for test " + vector.name + ": " + err.message + "'"); + assert_unreached("decrypt error for test " + vector.name + ": '" + err.message + "'"); }); }) .then(function(priorCiphertext) { @@ -157,14 +315,100 @@ function run_test() { plaintext[0] = 255 - plaintext[0]; return operation; - }, vector.name + " with altered plaintext"); + }, vector.name + " with altered plaintext after call"); + + }, function(err) { + // We need a failed test if the importVectorKey operation fails, so + // we know we never tested encryption + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " with altered plaintext after call"); + }); + + all_promises.push(promise); + }); + + // Check for encryption of an empty value if plaintext is transferred during call. + passingVectors.forEach(function(vector) { + var promise = importVectorKeys(vector, ["encrypt"], ["decrypt"]) + .then(function(vectors) { + promise_test(function(test) { + var plaintext = copyBuffer(vector.plaintext); + var operation = subtle.encrypt({ + ...vector.algorithm, + get name() { + plaintext.buffer.transfer(); + return vector.algorithm.name; + } + }, vector.publicKey, plaintext) + .then(function(ciphertext) { + assert_equals(ciphertext.byteLength * 8, vector.privateKey.algorithm.modulusLength, "Ciphertext length matches modulus length"); + // Do we get an empty plaintext back via decrypt? + return subtle.decrypt(vector.algorithm, vector.privateKey, ciphertext) + .then(function(result) { + assert_equals(result.byteLength, 0, "Decryption returns empty plaintext"); + return ciphertext; + }, function(err) { + assert_unreached("decrypt error for test " + vector.name + ": '" + err.message + "'"); + }); + }, function(err) { + assert_unreached("encrypt error for test " + vector.name + ": '" + err.message + "'"); + }); + + return operation; + }, vector.name + " with transferred plaintext during call"); + + }, function(err) { + // We need a failed test if the importVectorKey operation fails, so + // we know we never tested encryption + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " with transferred plaintext during call"); + }); + + all_promises.push(promise); + }); + + // Check for successful encryption even if plaintext is transferred after call. + passingVectors.forEach(function(vector) { + var promise = importVectorKeys(vector, ["encrypt"], ["decrypt"]) + .then(function(vectors) { + promise_test(function(test) { + var plaintext = copyBuffer(vector.plaintext); + var operation = subtle.encrypt(vector.algorithm, vector.publicKey, plaintext) + .then(function(ciphertext) { + assert_equals(ciphertext.byteLength * 8, vector.privateKey.algorithm.modulusLength, "Ciphertext length matches modulus length"); + // Can we get the original plaintext back via decrypt? + return subtle.decrypt(vector.algorithm, vector.privateKey, ciphertext) + .then(function(result) { + assert_true(equalBuffers(result, vector.plaintext), "Round trip returns original plaintext"); + return ciphertext; + }, function(err) { + assert_unreached("decrypt error for test " + vector.name + ": '" + err.message + "'"); + }); + }) + .then(function(priorCiphertext) { + // Will a second encrypt give us different ciphertext, as it should? + return subtle.encrypt(vector.algorithm, vector.publicKey, vector.plaintext) + .then(function(ciphertext) { + assert_false(equalBuffers(priorCiphertext, ciphertext), "Two encrypts give different results") + }, function(err) { + assert_unreached("second time encrypt error for test " + vector.name + ": '" + err.message + "'"); + }); + }, function(err) { + assert_unreached("decrypt error for test " + vector.name + ": '" + err.message + "'"); + }); + + plaintext.buffer.transfer(); + return operation; + }, vector.name + " with transferred plaintext after call"); }, function(err) { // We need a failed test if the importVectorKey operation fails, so // we know we never tested encryption promise_test(function(test) { assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); - }, "importVectorKeys step: " + vector.name + " with altered plaintext"); + }, "importVectorKeys step: " + vector.name + " with transferred plaintext after call"); }); all_promises.push(promise); @@ -185,7 +429,7 @@ function run_test() { assert_true(equalBuffers(result, vector.plaintext), "Round trip returns original plaintext"); return ciphertext; }, function(err) { - assert_unreached("decrypt error for test " + vector.name + ": " + err.message + "'"); + assert_unreached("decrypt error for test " + vector.name + ": '" + err.message + "'"); }); }) .then(function(priorCiphertext) { @@ -223,7 +467,7 @@ function run_test() { promise_test(function(test) { return subtle.encrypt(vector.algorithm, vector.publicKey, plaintext) .then(function(ciphertext) { - assert_unreached("Should have thrown error for too long plaintext in " + vector.name + ": " + err.message + "'"); + assert_unreached("Should have thrown error for too long plaintext in " + vector.name + ": '" + err.message + "'"); }, function(err) { assert_equals(err.name, "OperationError", "Should throw OperationError instead of " + err.message); }); @@ -248,7 +492,7 @@ function run_test() { promise_test(function(test) { return subtle.encrypt(vector.algorithm, vector.privateKey, vector.plaintext) .then(function(ciphertext) { - assert_unreached("Should have thrown error for using privateKey to encrypt in " + vector.name + ": " + err.message + "'"); + assert_unreached("Should have thrown error for using privateKey to encrypt in " + vector.name + ": '" + err.message + "'"); }, function(err) { assert_equals(err.name, "InvalidAccessError", "Should throw InvalidAccessError instead of " + err.message); }); @@ -276,7 +520,7 @@ function run_test() { promise_test(function(test) { return subtle.encrypt(vector.algorithm, vector.publicKey, vector.plaintext) .then(function(ciphertext) { - assert_unreached("Should have thrown error for no encrypt usage in " + vector.name + ": " + err.message + "'"); + assert_unreached("Should have thrown error for no encrypt usage in " + vector.name + ": '" + err.message + "'"); }, function(err) { assert_equals(err.name, "InvalidAccessError", "Should throw InvalidAccessError instead of " + err.message); }); diff --git a/test/fixtures/wpt/WebCryptoAPI/normalize-algorithm-name.https.any.js b/test/fixtures/wpt/WebCryptoAPI/normalize-algorithm-name.https.any.js new file mode 100644 index 00000000000000..5f9779c9dba168 --- /dev/null +++ b/test/fixtures/wpt/WebCryptoAPI/normalize-algorithm-name.https.any.js @@ -0,0 +1,52 @@ +// META: title=WebCryptoAPI: Algorithm normalization matches names ASCII case-insensitively +// U+212A is the Kelvin Sign + +function makeSalt() { + return crypto.getRandomValues(new Uint8Array(32)); +} + +async function makeKey(algorithm) { + const keyData = new Uint8Array([]); + return crypto.subtle.importKey("raw", keyData, algorithm, false, ["deriveBits"]); +} + +promise_test(async (t) => { + const algorithm = { + name: "H\u212ADF", + hash: "SHA-256", + salt: makeSalt(), + info: new TextEncoder().encode(''), + }; + const key = await makeKey("HKDF"); + const p = crypto.subtle.deriveBits(algorithm, key, 256); + return promise_rejects_dom(t, "NotSupportedError", p, algorithm.name); +}, `"H<U+212A>DF" does not match "HKDF"`); + +promise_test(async (t) => { + const algorithm = { + name: "PB\u212ADF2", + hash: "SHA-256", + iterations: 1, + salt: makeSalt(), + }; + const key = await makeKey("PBKDF2"); + const p = crypto.subtle.deriveBits(algorithm, key, 256); + return promise_rejects_dom(t, "NotSupportedError", p, algorithm.name); +}, `"PB<U+212A>DF2" does not match "PBKDF2"`); + +promise_test(async (t) => { + const algorithm = {name: "AES-\u212AW", length: 256}; + const p = crypto.subtle.generateKey(algorithm, false, ["wrapKey"]); + return promise_rejects_dom(t, "NotSupportedError", p, algorithm.name); +}, `"AES-<U+212A>W" does not match "AES-KW"`); + +promise_test(async (t) => { + const algorithm = { + name: "RSASSA-P\u212ACS1-V1_5", + modulusLength: 2048, + publicExponent: new Uint8Array([3]), + hash: "SHA-256", + }; + const p = crypto.subtle.generateKey(algorithm, false, ["sign"]); + return promise_rejects_dom(t, "NotSupportedError", p, algorithm.name); +}, `"RSASSA-P<U+212A>CS1-V1_5" does not match "RSASSA-PKCS1-V1_5"`); diff --git a/test/fixtures/wpt/WebCryptoAPI/sign_verify/ecdsa.js b/test/fixtures/wpt/WebCryptoAPI/sign_verify/ecdsa.js index 6bf662adcc547f..b2e0bf606b5fee 100644 --- a/test/fixtures/wpt/WebCryptoAPI/sign_verify/ecdsa.js +++ b/test/fixtures/wpt/WebCryptoAPI/sign_verify/ecdsa.js @@ -22,7 +22,7 @@ function run_test() { .then(function(is_verified) { assert_true(is_verified, "Signature verified"); }, function(err) { - assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'"); + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); }); return operation; @@ -39,6 +39,38 @@ function run_test() { all_promises.push(promise); }); + // Test verification with an altered buffer during call + testVectors.forEach(function(vector) { + var promise = importVectorKeys(vector, ["verify"], ["sign"]) + .then(function(vectors) { + promise_test(function(test) { + var signature = copyBuffer(vector.signature); + signature[0] = 255 - signature[0]; + var algorithm = { + hash: vector.hashName, + get name() { + signature[0] = vector.signature[0]; + return vector.algorithmName; + } + }; + var operation = subtle.verify(algorithm, vector.publicKey, signature, vector.plaintext) + .then(function(is_verified) { + assert_true(is_verified, "Signature verified"); + }, function(err) { + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); + }); + + return operation; + }, vector.name + " verification with altered signature during call"); + }, function(err) { + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " verification with altered signature during call"); + }); + + all_promises.push(promise); + }); + // Test verification with an altered buffer after call testVectors.forEach(function(vector) { var promise = importVectorKeys(vector, ["verify"], ["sign"]) @@ -50,7 +82,7 @@ function run_test() { .then(function(is_verified) { assert_true(is_verified, "Signature verified"); }, function(err) { - assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'"); + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); }); signature[0] = 255 - signature[0]; @@ -65,6 +97,95 @@ function run_test() { all_promises.push(promise); }); + // Test verification with a transferred buffer during call + testVectors.forEach(function(vector) { + var promise = importVectorKeys(vector, ["verify"], ["sign"]) + .then(function(vectors) { + promise_test(function(test) { + var signature = copyBuffer(vector.signature); + var algorithm = { + get name() { + signature.buffer.transfer(); + return vector.algorithmName; + }, + hash: vector.hashName + }; + var operation = subtle.verify(algorithm, vector.publicKey, signature, vector.plaintext) + .then(function(is_verified) { + assert_false(is_verified, "Signature is NOT verified"); + }, function(err) { + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); + }); + + return operation; + }, vector.name + " verification with transferred signature during call"); + }, function(err) { + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " verification with transferred signature during call"); + }); + + all_promises.push(promise); + }); + + // Test verification with a transferred buffer after call + testVectors.forEach(function(vector) { + var promise = importVectorKeys(vector, ["verify"], ["sign"]) + .then(function(vectors) { + var algorithm = {name: vector.algorithmName, hash: vector.hashName}; + promise_test(function(test) { + var signature = copyBuffer(vector.signature); + var operation = subtle.verify(algorithm, vector.publicKey, signature, vector.plaintext) + .then(function(is_verified) { + assert_true(is_verified, "Signature verified"); + }, function(err) { + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); + }); + + signature.buffer.transfer(); + return operation; + }, vector.name + " verification with transferred signature after call"); + }, function(err) { + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " verification with transferred signature after call"); + }); + + all_promises.push(promise); + }); + + // Check for successful verification even if plaintext is altered during call. + testVectors.forEach(function(vector) { + var promise = importVectorKeys(vector, ["verify"], ["sign"]) + .then(function(vectors) { + promise_test(function(test) { + var plaintext = copyBuffer(vector.plaintext); + plaintext[0] = 255 - plaintext[0]; + var algorithm = { + hash: vector.hashName, + get name() { + plaintext[0] = vector.plaintext[0]; + return vector.algorithmName; + } + }; + var operation = subtle.verify(algorithm, vector.publicKey, vector.signature, plaintext) + .then(function(is_verified) { + assert_true(is_verified, "Signature verified"); + }, function(err) { + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); + }); + + return operation; + }, vector.name + " with altered plaintext during call"); + }, function(err) { + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " with altered plaintext during call"); + }); + + all_promises.push(promise); + }); + // Check for successful verification even if plaintext is altered after call. testVectors.forEach(function(vector) { var promise = importVectorKeys(vector, ["verify"], ["sign"]) @@ -76,7 +197,7 @@ function run_test() { .then(function(is_verified) { assert_true(is_verified, "Signature verified"); }, function(err) { - assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'"); + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); }); plaintext[0] = 255 - plaintext[0]; @@ -91,6 +212,63 @@ function run_test() { all_promises.push(promise); }); + // Check for failed verification if plaintext is transferred during call. + testVectors.forEach(function(vector) { + var promise = importVectorKeys(vector, ["verify"], ["sign"]) + .then(function(vectors) { + promise_test(function(test) { + var plaintext = copyBuffer(vector.plaintext); + var algorithm = { + get name() { + plaintext.buffer.transfer(); + return vector.algorithmName; + }, + hash: vector.hashName + }; + var operation = subtle.verify(algorithm, vector.publicKey, vector.signature, plaintext) + .then(function(is_verified) { + assert_false(is_verified, "Signature is NOT verified"); + }, function(err) { + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); + }); + + return operation; + }, vector.name + " with transferred plaintext during call"); + }, function(err) { + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " with transferred plaintext during call"); + }); + + all_promises.push(promise); + }); + + // Check for successful verification even if plaintext is transferred after call. + testVectors.forEach(function(vector) { + var promise = importVectorKeys(vector, ["verify"], ["sign"]) + .then(function(vectors) { + var algorithm = {name: vector.algorithmName, hash: vector.hashName}; + promise_test(function(test) { + var plaintext = copyBuffer(vector.plaintext); + var operation = subtle.verify(algorithm, vector.publicKey, vector.signature, plaintext) + .then(function(is_verified) { + assert_true(is_verified, "Signature verified"); + }, function(err) { + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); + }); + + plaintext.buffer.transfer(); + return operation; + }, vector.name + " with transferred plaintext after call"); + }, function(err) { + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " with transferred plaintext after call"); + }); + + all_promises.push(promise); + }); + // Check for failures due to using privateKey to verify. testVectors.forEach(function(vector) { var promise = importVectorKeys(vector, ["verify"], ["sign"]) @@ -99,7 +277,7 @@ function run_test() { promise_test(function(test) { return subtle.verify(algorithm, vector.privateKey, vector.signature, vector.plaintext) .then(function(plaintext) { - assert_unreached("Should have thrown error for using privateKey to verify in " + vector.name + ": " + err.message + "'"); + assert_unreached("Should have thrown error for using privateKey to verify in " + vector.name + ": '" + err.message + "'"); }, function(err) { assert_equals(err.name, "InvalidAccessError", "Should throw InvalidAccessError instead of '" + err.message + "'"); }); @@ -122,7 +300,7 @@ function run_test() { promise_test(function(test) { return subtle.sign(algorithm, vector.publicKey, vector.plaintext) .then(function(signature) { - assert_unreached("Should have thrown error for using publicKey to sign in " + vector.name + ": " + err.message + "'"); + assert_unreached("Should have thrown error for using publicKey to sign in " + vector.name + ": '" + err.message + "'"); }, function(err) { assert_equals(err.name, "InvalidAccessError", "Should throw InvalidAccessError instead of '" + err.message + "'"); }); @@ -146,7 +324,7 @@ function run_test() { promise_test(function(test) { return subtle.verify(algorithm, vector.publicKey, vector.signature, vector.plaintext) .then(function(plaintext) { - assert_unreached("Should have thrown error for no verify usage in " + vector.name + ": " + err.message + "'"); + assert_unreached("Should have thrown error for no verify usage in " + vector.name + ": '" + err.message + "'"); }, function(err) { assert_equals(err.name, "InvalidAccessError", "Should throw InvalidAccessError instead of '" + err.message + "'"); }); @@ -174,7 +352,7 @@ function run_test() { assert_true(is_verified, "Round trip verification works"); return signature; }, function(err) { - assert_unreached("verify error for test " + vector.name + ": " + err.message + "'"); + assert_unreached("verify error for test " + vector.name + ": '" + err.message + "'"); }); }, function(err) { assert_unreached("sign error for test " + vector.name + ": '" + err.message + "'"); @@ -274,7 +452,7 @@ function run_test() { .then(function(is_verified) { assert_false(is_verified, "Signature NOT verified"); }, function(err) { - assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'"); + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); }); return operation; @@ -305,7 +483,7 @@ function run_test() { .then(function(is_verified) { assert_false(is_verified, "Signature NOT verified"); }, function(err) { - assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'"); + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); }); return operation; @@ -362,7 +540,7 @@ function run_test() { .then(function(is_verified) { assert_false(is_verified, "Signature NOT verified"); }, function(err) { - assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'"); + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); }); return operation; @@ -391,7 +569,7 @@ function run_test() { .then(function(is_verified) { assert_false(is_verified, "Signature NOT verified"); }, function(err) { - assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'"); + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); }); return operation; @@ -418,7 +596,7 @@ function run_test() { .then(function(is_verified) { assert_false(is_verified, "Signature unexpectedly verified"); }, function(err) { - assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'"); + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); }); return operation; diff --git a/test/fixtures/wpt/WebCryptoAPI/sign_verify/eddsa.js b/test/fixtures/wpt/WebCryptoAPI/sign_verify/eddsa.js index 4024674e3c3d7f..5ff6f21150c272 100644 --- a/test/fixtures/wpt/WebCryptoAPI/sign_verify/eddsa.js +++ b/test/fixtures/wpt/WebCryptoAPI/sign_verify/eddsa.js @@ -18,11 +18,32 @@ function run_test(algorithmName) { isVerified = await subtle.verify(algorithm, key, vector.signature, vector.data) } catch (err) { assert_false(key === undefined, "importKey failed for " + vector.name + ". Message: ''" + err.message + "''"); - assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'"); + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); }; assert_true(isVerified, "Signature verified"); }, vector.name + " verification"); + // Test verification with an altered buffer during call + promise_test(async() => { + let isVerified = false; + let key; + try { + key = await subtle.importKey("spki", vector.publicKeyBuffer, algorithm, false, ["verify"]); + var signature = copyBuffer(vector.signature); + signature[0] = 255 - signature[0]; + isVerified = await subtle.verify({ + get name() { + signature[0] = vector.signature[0]; + return vector.algorithmName; + } + }, key, signature, vector.data); + } catch (err) { + assert_false(key === undefined, "importKey failed for " + vector.name + ". Message: ''" + err.message + "''"); + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); + }; + assert_true(isVerified, "Signature verified"); + }, vector.name + " verification with altered signature during call"); + // Test verification with an altered buffer after call promise_test(async() => { let isVerified = false; @@ -36,11 +57,69 @@ function run_test(algorithmName) { ]); } catch (err) { assert_false(key === undefined, "importKey failed for " + vector.name + ". Message: ''" + err.message + "''"); - assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'"); + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); }; assert_true(isVerified, "Signature verified"); }, vector.name + " verification with altered signature after call"); + // Test verification with a transferred buffer during call + promise_test(async() => { + let isVerified = false; + let key; + try { + key = await subtle.importKey("spki", vector.publicKeyBuffer, algorithm, false, ["verify"]); + var signature = copyBuffer(vector.signature); + isVerified = await subtle.verify({ + get name() { + signature.buffer.transfer(); + return vector.algorithmName; + } + }, key, signature, vector.data); + } catch (err) { + assert_false(key === undefined, "importKey failed for " + vector.name + ". Message: ''" + err.message + "''"); + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); + }; + assert_false(isVerified, "Signature is NOT verified"); + }, vector.name + " verification with transferred signature during call"); + + // Test verification with a transferred buffer after call + promise_test(async() => { + let isVerified = false; + let key; + try { + key = await subtle.importKey("spki", vector.publicKeyBuffer, algorithm, false, ["verify"]); + var signature = copyBuffer(vector.signature); + var operation = subtle.verify(algorithm, key, signature, vector.data); + signature.buffer.transfer(); + isVerified = await operation; + } catch (err) { + assert_false(key === undefined, "importKey failed for " + vector.name + ". Message: ''" + err.message + "''"); + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); + }; + assert_true(isVerified, "Signature verified"); + }, vector.name + " verification with transferred signature after call"); + + // Check for successful verification even if data is altered during call. + promise_test(async() => { + let isVerified = false; + let key; + try { + key = await subtle.importKey("spki", vector.publicKeyBuffer, algorithm, false, ["verify"]); + var data = copyBuffer(vector.data); + data[0] = 255 - data[0]; + isVerified = await subtle.verify({ + get name() { + data[0] = vector.data[0]; + return vector.algorithmName; + } + }, key, vector.signature, data); + } catch (err) { + assert_false(key === undefined, "importKey failed for " + vector.name + ". Message: ''" + err.message + "''"); + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); + }; + assert_true(isVerified, "Signature verified"); + }, vector.name + " with altered data during call"); + // Check for successful verification even if data is altered after call. promise_test(async() => { let isVerified = false; @@ -54,11 +133,48 @@ function run_test(algorithmName) { ]); } catch (err) { assert_false(key === undefined, "importKey failed for " + vector.name + ". Message: ''" + err.message + "''"); - assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'"); + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); }; assert_true(isVerified, "Signature verified"); }, vector.name + " with altered data after call"); + // Check for failed verification if data is transferred during call. + promise_test(async() => { + let isVerified = false; + let key; + try { + key = await subtle.importKey("spki", vector.publicKeyBuffer, algorithm, false, ["verify"]); + var data = copyBuffer(vector.data); + isVerified = await subtle.verify({ + get name() { + data.buffer.transfer(); + return vector.algorithmName; + } + }, key, vector.signature, data); + } catch (err) { + assert_false(key === undefined, "importKey failed for " + vector.name + ". Message: ''" + err.message + "''"); + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); + }; + assert_false(isVerified, "Signature is NOT verified"); + }, vector.name + " with transferred data during call"); + + // Check for successful verification even if data is transferred after call. + promise_test(async() => { + let isVerified = false; + let key; + try { + key = await subtle.importKey("spki", vector.publicKeyBuffer, algorithm, false, ["verify"]); + var data = copyBuffer(vector.data); + var operation = subtle.verify(algorithm, key, vector.signature, data); + data.buffer.transfer(); + isVerified = await operation; + } catch (err) { + assert_false(key === undefined, "importKey failed for " + vector.name + ". Message: ''" + err.message + "''"); + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); + }; + assert_true(isVerified, "Signature verified"); + }, vector.name + " with transferred data after call"); + // Check for failures due to using privateKey to verify. promise_test(async() => { let isVerified = false; @@ -123,7 +239,7 @@ function run_test(algorithmName) { } catch (err) { assert_false(publicKey === undefined || privateKey === undefined, "importKey failed for " + vector.name + ". Message: ''" + err.message + "''"); assert_false(signature === undefined, "sign error for test " + vector.name + ": '" + err.message + "'"); - assert_unreached("verify error for test " + vector.name + ": " + err.message + "'"); + assert_unreached("verify error for test " + vector.name + ": '" + err.message + "'"); }; assert_true(isVerified, "Round trip verification works"); }, vector.name + " round trip"); @@ -172,7 +288,7 @@ function run_test(algorithmName) { isVerified = await subtle.verify(algorithm, key, signature, vector.data) } catch (err) { assert_false(key === undefined, "importKey failed for " + vector.name + ". Message: ''" + err.message + "''"); - assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'"); + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); }; assert_false(isVerified, "Signature verified"); }, vector.name + " verification failure due to altered signature"); @@ -187,7 +303,7 @@ function run_test(algorithmName) { isVerified = await subtle.verify(algorithm, key, signature, vector.data) } catch (err) { assert_false(key === undefined, "importKey failed for " + vector.name + ". Message: ''" + err.message + "''"); - assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'"); + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); }; assert_false(isVerified, "Signature verified"); }, vector.name + " verification failure due to shortened signature"); @@ -203,7 +319,7 @@ function run_test(algorithmName) { isVerified = await subtle.verify(algorithm, key, vector.signature, data) } catch (err) { assert_false(key === undefined, "importKey failed for " + vector.name + ". Message: ''" + err.message + "''"); - assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'"); + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); }; assert_false(isVerified, "Signature verified"); }, vector.name + " verification failure due to altered data"); diff --git a/test/fixtures/wpt/WebCryptoAPI/sign_verify/hmac.js b/test/fixtures/wpt/WebCryptoAPI/sign_verify/hmac.js index f5e2ad2769cdd8..8a099f4ce9377a 100644 --- a/test/fixtures/wpt/WebCryptoAPI/sign_verify/hmac.js +++ b/test/fixtures/wpt/WebCryptoAPI/sign_verify/hmac.js @@ -20,7 +20,7 @@ function run_test() { .then(function(is_verified) { assert_true(is_verified, "Signature verified"); }, function(err) { - assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'"); + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); }); return operation; @@ -37,6 +37,37 @@ function run_test() { all_promises.push(promise); }); + // Test verification with an altered buffer during call + testVectors.forEach(function(vector) { + var promise = importVectorKeys(vector, ["verify", "sign"]) + .then(function(vector) { + promise_test(function(test) { + var signature = copyBuffer(vector.signature); + signature[0] = 255 - signature[0]; + var operation = subtle.verify({ + get name() { + signature[0] = vector.signature[0]; + return "HMAC"; + }, + hash: vector.hash + }, vector.key, signature, vector.plaintext) + .then(function(is_verified) { + assert_true(is_verified, "Signature is not verified"); + }, function(err) { + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); + }); + + return operation; + }, vector.name + " verification with altered signature during call"); + }, function(err) { + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " verification with altered signature during call"); + }); + + all_promises.push(promise); + }); + // Test verification with an altered buffer after call testVectors.forEach(function(vector) { var promise = importVectorKeys(vector, ["verify", "sign"]) @@ -47,7 +78,7 @@ function run_test() { .then(function(is_verified) { assert_true(is_verified, "Signature is not verified"); }, function(err) { - assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'"); + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); }); signature[0] = 255 - signature[0]; @@ -62,6 +93,92 @@ function run_test() { all_promises.push(promise); }); + // Test verification with a transferred buffer during call + testVectors.forEach(function(vector) { + var promise = importVectorKeys(vector, ["verify", "sign"]) + .then(function(vector) { + promise_test(function(test) { + var signature = copyBuffer(vector.signature); + var operation = subtle.verify({ + get name() { + signature.buffer.transfer(); + return "HMAC"; + }, + hash: vector.hash + }, vector.key, signature, vector.plaintext) + .then(function(is_verified) { + assert_false(is_verified, "Signature is NOT verified"); + }, function(err) { + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); + }); + + return operation; + }, vector.name + " verification with transferred signature during call"); + }, function(err) { + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " verification with transferred signature during call"); + }); + + all_promises.push(promise); + }); + + // Test verification with a transferred buffer after call + testVectors.forEach(function(vector) { + var promise = importVectorKeys(vector, ["verify", "sign"]) + .then(function(vector) { + promise_test(function(test) { + var signature = copyBuffer(vector.signature); + var operation = subtle.verify({name: "HMAC", hash: vector.hash}, vector.key, signature, vector.plaintext) + .then(function(is_verified) { + assert_true(is_verified, "Signature is not verified"); + }, function(err) { + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); + }); + + signature.buffer.transfer(); + return operation; + }, vector.name + " verification with transferred signature after call"); + }, function(err) { + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " verification with transferred signature after call"); + }); + + all_promises.push(promise); + }); + + // Check for successful verification even if plaintext is altered during call. + testVectors.forEach(function(vector) { + var promise = importVectorKeys(vector, ["verify", "sign"]) + .then(function(vector) { + promise_test(function(test) { + var plaintext = copyBuffer(vector.plaintext); + plaintext[0] = 255 - plaintext[0]; + var operation = subtle.verify({ + hash: vector.hash, + get name() { + plaintext[0] = vector.plaintext[0]; + return "HMAC"; + } + }, vector.key, vector.signature, plaintext) + .then(function(is_verified) { + assert_true(is_verified, "Signature verified"); + }, function(err) { + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); + }); + + return operation; + }, vector.name + " with altered plaintext during call"); + }, function(err) { + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " with altered plaintext during call"); + }); + + all_promises.push(promise); + }); + // Check for successful verification even if plaintext is altered after call. testVectors.forEach(function(vector) { var promise = importVectorKeys(vector, ["verify", "sign"]) @@ -72,7 +189,7 @@ function run_test() { .then(function(is_verified) { assert_true(is_verified, "Signature verified"); }, function(err) { - assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'"); + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); }); plaintext[0] = 255 - plaintext[0]; @@ -81,7 +198,62 @@ function run_test() { }, function(err) { promise_test(function(test) { assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); - }, "importVectorKeys step: " + vector.name + " with altered plaintext"); + }, "importVectorKeys step: " + vector.name + " with altered plaintext after call"); + }); + + all_promises.push(promise); + }); + + // Check for failed verification if plaintext is transferred during call. + testVectors.forEach(function(vector) { + var promise = importVectorKeys(vector, ["verify", "sign"]) + .then(function(vector) { + promise_test(function(test) { + var plaintext = copyBuffer(vector.plaintext); + var operation = subtle.verify({ + get name() { + plaintext.buffer.transfer(); + return "HMAC"; + }, + hash: vector.hash + }, vector.key, vector.signature, plaintext) + .then(function(is_verified) { + assert_false(is_verified, "Signature is NOT verified"); + }, function(err) { + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); + }); + + return operation; + }, vector.name + " with transferred plaintext during call"); + }, function(err) { + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " with transferred plaintext during call"); + }); + + all_promises.push(promise); + }); + + // Check for successful verification even if plaintext is transferred after call. + testVectors.forEach(function(vector) { + var promise = importVectorKeys(vector, ["verify", "sign"]) + .then(function(vector) { + promise_test(function(test) { + var plaintext = copyBuffer(vector.plaintext); + var operation = subtle.verify({name: "HMAC", hash: vector.hash}, vector.key, vector.signature, plaintext) + .then(function(is_verified) { + assert_true(is_verified, "Signature verified"); + }, function(err) { + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); + }); + + plaintext.buffer.transfer(); + return operation; + }, vector.name + " with transferred plaintext after call"); + }, function(err) { + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " with transferred plaintext after call"); }); all_promises.push(promise); @@ -96,7 +268,7 @@ function run_test() { promise_test(function(test) { return subtle.verify({name: "HMAC", hash: vector.hash}, vector.key, vector.signature, vector.plaintext) .then(function(plaintext) { - assert_unreached("Should have thrown error for no verify usage in " + vector.name + ": " + err.message + "'"); + assert_unreached("Should have thrown error for no verify usage in " + vector.name + ": '" + err.message + "'"); }, function(err) { assert_equals(err.name, "InvalidAccessError", "Should throw InvalidAccessError instead of '" + err.message + "'"); }); @@ -124,7 +296,7 @@ function run_test() { assert_true(is_verified, "Round trip verifies"); return signature; }, function(err) { - assert_unreached("verify error for test " + vector.name + ": " + err.message + "'"); + assert_unreached("verify error for test " + vector.name + ": '" + err.message + "'"); }); }); }, vector.name + " round trip"); @@ -219,7 +391,7 @@ function run_test() { .then(function(is_verified) { assert_false(is_verified, "Signature is NOT verified"); }, function(err) { - assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'"); + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); }); return operation; @@ -247,7 +419,7 @@ function run_test() { .then(function(is_verified) { assert_false(is_verified, "Signature is NOT verified"); }, function(err) { - assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'"); + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); }); return operation; @@ -274,7 +446,7 @@ function run_test() { .then(function(is_verified) { assert_false(is_verified, "Signature is NOT verified"); }, function(err) { - assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'"); + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); }); return operation; diff --git a/test/fixtures/wpt/WebCryptoAPI/sign_verify/kmac.js b/test/fixtures/wpt/WebCryptoAPI/sign_verify/kmac.js index 037dbec1097ddc..f3cc9b4cd1dbfd 100644 --- a/test/fixtures/wpt/WebCryptoAPI/sign_verify/kmac.js +++ b/test/fixtures/wpt/WebCryptoAPI/sign_verify/kmac.js @@ -23,7 +23,7 @@ function run_test() { .then(function(is_verified) { assert_true(is_verified, "Signature verified"); }, function(err) { - assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'"); + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); }); return operation; @@ -40,6 +40,41 @@ function run_test() { all_promises.push(promise); }); + // Test verification with an altered buffer during call + testVectors.forEach(function(vector) { + var promise = importVectorKeys(vector, ["verify", "sign"]) + .then(function(vector) { + promise_test(function(test) { + var signature = copyBuffer(vector.signature); + signature[0] = 255 - signature[0]; + var algorithmParams = { + length: vector.length, + get name() { + signature[0] = vector.signature[0]; + return vector.algorithm; + } + }; + if (vector.customization !== undefined) { + algorithmParams.customization = vector.customization; + } + var operation = subtle.verify(algorithmParams, vector.key, signature, vector.plaintext) + .then(function(is_verified) { + assert_true(is_verified, "Signature is not verified"); + }, function(err) { + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); + }); + + return operation; + }, vector.name + " verification with altered signature during call"); + }, function(err) { + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " verification with altered signature during call"); + }); + + all_promises.push(promise); + }); + // Test verification with an altered buffer after call testVectors.forEach(function(vector) { var promise = importVectorKeys(vector, ["verify", "sign"]) @@ -54,7 +89,7 @@ function run_test() { .then(function(is_verified) { assert_true(is_verified, "Signature is not verified"); }, function(err) { - assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'"); + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); }); signature[0] = 255 - signature[0]; @@ -69,6 +104,104 @@ function run_test() { all_promises.push(promise); }); + // Test verification with a transferred buffer during call + testVectors.forEach(function(vector) { + var promise = importVectorKeys(vector, ["verify", "sign"]) + .then(function(vector) { + promise_test(function(test) { + var signature = copyBuffer(vector.signature); + var algorithmParams = { + get name() { + signature.buffer.transfer(); + return vector.algorithm; + }, + length: vector.length + }; + if (vector.customization !== undefined) { + algorithmParams.customization = vector.customization; + } + var operation = subtle.verify(algorithmParams, vector.key, signature, vector.plaintext) + .then(function(is_verified) { + assert_false(is_verified, "Signature is NOT verified"); + }, function(err) { + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); + }); + + return operation; + }, vector.name + " verification with transferred signature during call"); + }, function(err) { + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " verification with transferred signature during call"); + }); + + all_promises.push(promise); + }); + + // Test verification with a transferred buffer after call + testVectors.forEach(function(vector) { + var promise = importVectorKeys(vector, ["verify", "sign"]) + .then(function(vector) { + promise_test(function(test) { + var signature = copyBuffer(vector.signature); + var algorithmParams = {name: vector.algorithm, length: vector.length}; + if (vector.customization !== undefined) { + algorithmParams.customization = vector.customization; + } + var operation = subtle.verify(algorithmParams, vector.key, signature, vector.plaintext) + .then(function(is_verified) { + assert_true(is_verified, "Signature is not verified"); + }, function(err) { + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); + }); + + signature.buffer.transfer(); + return operation; + }, vector.name + " verification with transferred signature after call"); + }, function(err) { + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " verification with transferred signature after call"); + }); + + all_promises.push(promise); + }); + + // Check for successful verification even if plaintext is altered during call. + testVectors.forEach(function(vector) { + var promise = importVectorKeys(vector, ["verify", "sign"]) + .then(function(vector) { + promise_test(function(test) { + var plaintext = copyBuffer(vector.plaintext); + plaintext[0] = 255 - plaintext[0]; + var algorithmParams = { + length: vector.length, + get name() { + plaintext[0] = vector.plaintext[0]; + return vector.algorithm; + } + }; + if (vector.customization !== undefined) { + algorithmParams.customization = vector.customization; + } + var operation = subtle.verify(algorithmParams, vector.key, vector.signature, plaintext) + .then(function(is_verified) { + assert_true(is_verified, "Signature verified"); + }, function(err) { + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); + }); + + return operation; + }, vector.name + " with altered plaintext during call"); + }, function(err) { + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " with altered plaintext during call"); + }); + + all_promises.push(promise); + }); + // Check for successful verification even if plaintext is altered after call. testVectors.forEach(function(vector) { var promise = importVectorKeys(vector, ["verify", "sign"]) @@ -83,7 +216,7 @@ function run_test() { .then(function(is_verified) { assert_true(is_verified, "Signature verified"); }, function(err) { - assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'"); + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); }); plaintext[0] = 255 - plaintext[0]; @@ -92,7 +225,70 @@ function run_test() { }, function(err) { promise_test(function(test) { assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); - }, "importVectorKeys step: " + vector.name + " with altered plaintext"); + }, "importVectorKeys step: " + vector.name + " with altered plaintext after call"); + }); + + all_promises.push(promise); + }); + + // Check for failed verification if plaintext is transferred during call. + testVectors.forEach(function(vector) { + var promise = importVectorKeys(vector, ["verify", "sign"]) + .then(function(vector) { + promise_test(function(test) { + var plaintext = copyBuffer(vector.plaintext); + var algorithmParams = { + get name() { + plaintext.buffer.transfer(); + return vector.algorithm; + }, + length: vector.length + }; + if (vector.customization !== undefined) { + algorithmParams.customization = vector.customization; + } + var operation = subtle.verify(algorithmParams, vector.key, vector.signature, plaintext) + .then(function(is_verified) { + assert_false(is_verified, "Signature is NOT verified"); + }, function(err) { + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); + }); + + return operation; + }, vector.name + " with transferred plaintext during call"); + }, function(err) { + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " with transferred plaintext during call"); + }); + + all_promises.push(promise); + }); + + // Check for successful verification even if plaintext is transferred after call. + testVectors.forEach(function(vector) { + var promise = importVectorKeys(vector, ["verify", "sign"]) + .then(function(vector) { + promise_test(function(test) { + var plaintext = copyBuffer(vector.plaintext); + var algorithmParams = {name: vector.algorithm, length: vector.length}; + if (vector.customization !== undefined) { + algorithmParams.customization = vector.customization; + } + var operation = subtle.verify(algorithmParams, vector.key, vector.signature, plaintext) + .then(function(is_verified) { + assert_true(is_verified, "Signature verified"); + }, function(err) { + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); + }); + + plaintext.buffer.transfer(); + return operation; + }, vector.name + " with transferred plaintext after call"); + }, function(err) { + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " with transferred plaintext after call"); }); all_promises.push(promise); @@ -111,7 +307,7 @@ function run_test() { } return subtle.verify(algorithmParams, vector.key, vector.signature, vector.plaintext) .then(function(plaintext) { - assert_unreached("Should have thrown error for no verify usage in " + vector.name + ": " + err.message + "'"); + assert_unreached("Should have thrown error for no verify usage in " + vector.name + ": '" + err.message + "'"); }, function(err) { assert_equals(err.name, "InvalidAccessError", "Should throw InvalidAccessError instead of '" + err.message + "'"); }); @@ -143,7 +339,7 @@ function run_test() { assert_true(is_verified, "Round trip verifies"); return signature; }, function(err) { - assert_unreached("verify error for test " + vector.name + ": " + err.message + "'"); + assert_unreached("verify error for test " + vector.name + ": '" + err.message + "'"); }); }); }, vector.name + " round trip"); @@ -250,7 +446,7 @@ function run_test() { .then(function(is_verified) { assert_false(is_verified, "Signature is NOT verified"); }, function(err) { - assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'"); + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); }); return operation; @@ -282,7 +478,7 @@ function run_test() { .then(function(is_verified) { assert_false(is_verified, "Signature is NOT verified"); }, function(err) { - assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'"); + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); }); return operation; @@ -313,7 +509,7 @@ function run_test() { .then(function(is_verified) { assert_false(is_verified, "Signature is NOT verified"); }, function(err) { - assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'"); + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); }); return operation; @@ -344,7 +540,7 @@ function run_test() { .then(function(is_verified) { assert_false(is_verified, "Signature is NOT verified with wrong length"); }, function(err) { - assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'"); + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); }); return operation; diff --git a/test/fixtures/wpt/WebCryptoAPI/sign_verify/mldsa.js b/test/fixtures/wpt/WebCryptoAPI/sign_verify/mldsa.js index e31d36362b0dc9..9c654685c74f31 100644 --- a/test/fixtures/wpt/WebCryptoAPI/sign_verify/mldsa.js +++ b/test/fixtures/wpt/WebCryptoAPI/sign_verify/mldsa.js @@ -55,6 +55,61 @@ function run_test() { all_promises.push(promise); }); + // Test verification with an altered buffer during call + testVectors.forEach(function (vector) { + var promise = importVectorKeys(vector, ['verify'], ['sign']).then( + function (vectors) { + promise_test(function (test) { + var signature = copyBuffer(vector.signature); + signature[0] = 255 - signature[0]; + var operation = subtle + .verify( + { + get name() { + signature[0] = vector.signature[0]; + return vector.algorithmName; + }, + }, + vector.publicKey, + signature, + vector.data + ) + .then( + function (is_verified) { + assert_true(is_verified, 'Signature verified'); + }, + function (err) { + assert_unreached( + 'Verification should not throw error ' + + vector.name + + ': ' + + err.message + + "'" + ); + } + ); + + return operation; + }, vector.name + ' verification with altered signature during call'); + }, + function (err) { + promise_test(function (test) { + assert_unreached( + 'importVectorKeys failed for ' + + vector.name + + ". Message: ''" + + err.message + + "''" + ); + }, 'importVectorKeys step: ' + + vector.name + + ' verification with altered signature during call'); + } + ); + + all_promises.push(promise); + }); + // Test verification with an altered buffer after call testVectors.forEach(function (vector) { var promise = importVectorKeys(vector, ['verify'], ['sign']).then( @@ -101,6 +156,161 @@ function run_test() { all_promises.push(promise); }); + // Test verification with a transferred buffer during call + testVectors.forEach(function (vector) { + var promise = importVectorKeys(vector, ['verify'], ['sign']).then( + function (vectors) { + promise_test(function (test) { + var signature = copyBuffer(vector.signature); + var operation = subtle + .verify( + { + get name() { + signature.buffer.transfer(); + return vector.algorithmName; + }, + }, + vector.publicKey, + signature, + vector.data + ) + .then( + function (is_verified) { + assert_false(is_verified, 'Signature is NOT verified'); + }, + function (err) { + assert_unreached( + 'Verification should not throw error ' + + vector.name + + ': ' + + err.message + + "'" + ); + } + ); + + return operation; + }, vector.name + ' verification with transferred signature during call'); + }, + function (err) { + promise_test(function (test) { + assert_unreached( + 'importVectorKeys failed for ' + + vector.name + + ". Message: ''" + + err.message + + "''" + ); + }, 'importVectorKeys step: ' + + vector.name + + ' verification with transferred signature during call'); + } + ); + + all_promises.push(promise); + }); + + // Test verification with a transferred buffer after call + testVectors.forEach(function (vector) { + var promise = importVectorKeys(vector, ['verify'], ['sign']).then( + function (vectors) { + var algorithm = vector.algorithmName; + promise_test(function (test) { + var signature = copyBuffer(vector.signature); + var operation = subtle + .verify(algorithm, vector.publicKey, signature, vector.data) + .then( + function (is_verified) { + assert_true(is_verified, 'Signature verified'); + }, + function (err) { + assert_unreached( + 'Verification should not throw error ' + + vector.name + + ': ' + + err.message + + "'" + ); + } + ); + + signature.buffer.transfer(); + return operation; + }, vector.name + ' verification with transferred signature after call'); + }, + function (err) { + promise_test(function (test) { + assert_unreached( + 'importVectorKeys failed for ' + + vector.name + + ". Message: ''" + + err.message + + "''" + ); + }, 'importVectorKeys step: ' + + vector.name + + ' verification with transferred signature after call'); + } + ); + + all_promises.push(promise); + }); + + // Check for successful verification even if plaintext is altered during call. + testVectors.forEach(function (vector) { + var promise = importVectorKeys(vector, ['verify'], ['sign']).then( + function (vectors) { + promise_test(function (test) { + var plaintext = copyBuffer(vector.data); + plaintext[0] = 255 - plaintext[0]; + var operation = subtle + .verify( + { + get name() { + plaintext[0] = vector.data[0]; + return vector.algorithmName; + }, + }, + vector.publicKey, + vector.signature, + plaintext + ) + .then( + function (is_verified) { + assert_true(is_verified, 'Signature verified'); + }, + function (err) { + assert_unreached( + 'Verification should not throw error ' + + vector.name + + ': ' + + err.message + + "'" + ); + } + ); + + return operation; + }, vector.name + ' with altered plaintext during call'); + }, + function (err) { + promise_test(function (test) { + assert_unreached( + 'importVectorKeys failed for ' + + vector.name + + ". Message: ''" + + err.message + + "''" + ); + }, 'importVectorKeys step: ' + + vector.name + + ' with altered plaintext during call'); + } + ); + + all_promises.push(promise); + }); + // Check for successful verification even if plaintext is altered after call. testVectors.forEach(function (vector) { var promise = importVectorKeys(vector, ['verify'], ['sign']).then( @@ -147,6 +357,106 @@ function run_test() { all_promises.push(promise); }); + // Check for failed verification if plaintext is transferred during call. + testVectors.forEach(function (vector) { + var promise = importVectorKeys(vector, ['verify'], ['sign']).then( + function (vectors) { + promise_test(function (test) { + var plaintext = copyBuffer(vector.data); + var operation = subtle + .verify( + { + get name() { + plaintext.buffer.transfer(); + return vector.algorithmName; + }, + }, + vector.publicKey, + vector.signature, + plaintext + ) + .then( + function (is_verified) { + assert_false(is_verified, 'Signature is NOT verified'); + }, + function (err) { + assert_unreached( + 'Verification should not throw error ' + + vector.name + + ': ' + + err.message + + "'" + ); + } + ); + + return operation; + }, vector.name + ' with transferred plaintext during call'); + }, + function (err) { + promise_test(function (test) { + assert_unreached( + 'importVectorKeys failed for ' + + vector.name + + ". Message: ''" + + err.message + + "''" + ); + }, 'importVectorKeys step: ' + + vector.name + + ' with transferred plaintext during call'); + } + ); + + all_promises.push(promise); + }); + + // Check for successful verification even if plaintext is transferred after call. + testVectors.forEach(function (vector) { + var promise = importVectorKeys(vector, ['verify'], ['sign']).then( + function (vectors) { + var algorithm = vector.algorithmName; + promise_test(function (test) { + var plaintext = copyBuffer(vector.data); + var operation = subtle + .verify(algorithm, vector.publicKey, vector.signature, plaintext) + .then( + function (is_verified) { + assert_true(is_verified, 'Signature verified'); + }, + function (err) { + assert_unreached( + 'Verification should not throw error ' + + vector.name + + ': ' + + err.message + + "'" + ); + } + ); + + plaintext.buffer.transfer(); + return operation; + }, vector.name + ' with transferred plaintext after call'); + }, + function (err) { + promise_test(function (test) { + assert_unreached( + 'importVectorKeys failed for ' + + vector.name + + ". Message: ''" + + err.message + + "''" + ); + }, 'importVectorKeys step: ' + + vector.name + + ' with transferred plaintext after call'); + } + ); + + all_promises.push(promise); + }); + // Check for failures due to using privateKey to verify. testVectors.forEach(function (vector) { var promise = importVectorKeys(vector, ['verify'], ['sign']).then( diff --git a/test/fixtures/wpt/WebCryptoAPI/sign_verify/rsa.js b/test/fixtures/wpt/WebCryptoAPI/sign_verify/rsa.js index 5abadd3d4b8629..09c7ceb7675107 100644 --- a/test/fixtures/wpt/WebCryptoAPI/sign_verify/rsa.js +++ b/test/fixtures/wpt/WebCryptoAPI/sign_verify/rsa.js @@ -20,7 +20,7 @@ function run_test() { .then(function(is_verified) { assert_true(is_verified, "Signature verified"); }, function(err) { - assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'"); + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); }); return operation; @@ -37,6 +37,37 @@ function run_test() { all_promises.push(promise); }); + // Test verification with an altered buffer during call + testVectors.forEach(function(vector) { + var promise = importVectorKeys(vector, ["verify"], ["sign"]) + .then(function(vectors) { + promise_test(function(test) { + var signature = copyBuffer(vector.signature); + signature[0] = 255 - signature[0]; + var operation = subtle.verify({ + ...vector.algorithm, + get name() { + signature[0] = vector.signature[0]; + return vector.algorithm.name; + } + }, vector.publicKey, signature, vector.plaintext) + .then(function(is_verified) { + assert_true(is_verified, "Signature verified"); + }, function(err) { + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); + }); + + return operation; + }, vector.name + " verification with altered signature during call"); + }, function(err) { + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " verification with altered signature during call"); + }); + + all_promises.push(promise); + }); + // Test verification with an altered buffer after call testVectors.forEach(function(vector) { var promise = importVectorKeys(vector, ["verify"], ["sign"]) @@ -47,7 +78,7 @@ function run_test() { .then(function(is_verified) { assert_true(is_verified, "Signature verified"); }, function(err) { - assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'"); + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); }); signature[0] = 255 - signature[0]; @@ -62,6 +93,92 @@ function run_test() { all_promises.push(promise); }); + // Test verification with a transferred buffer during call + testVectors.forEach(function(vector) { + var promise = importVectorKeys(vector, ["verify"], ["sign"]) + .then(function(vectors) { + promise_test(function(test) { + var signature = copyBuffer(vector.signature); + var operation = subtle.verify({ + ...vector.algorithm, + get name() { + signature.buffer.transfer(); + return vector.algorithm.name; + } + }, vector.publicKey, signature, vector.plaintext) + .then(function(is_verified) { + assert_false(is_verified, "Signature is NOT verified"); + }, function(err) { + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); + }); + + return operation; + }, vector.name + " verification with transferred signature during call"); + }, function(err) { + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " verification with transferred signature during call"); + }); + + all_promises.push(promise); + }); + + // Test verification with a transferred buffer after call + testVectors.forEach(function(vector) { + var promise = importVectorKeys(vector, ["verify"], ["sign"]) + .then(function(vectors) { + promise_test(function(test) { + var signature = copyBuffer(vector.signature); + var operation = subtle.verify(vector.algorithm, vector.publicKey, signature, vector.plaintext) + .then(function(is_verified) { + assert_true(is_verified, "Signature verified"); + }, function(err) { + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); + }); + + signature.buffer.transfer(); + return operation; + }, vector.name + " verification with transferred signature after call"); + }, function(err) { + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " verification with transferred signature after call"); + }); + + all_promises.push(promise); + }); + + // Check for successful verification even if plaintext is altered during call. + testVectors.forEach(function(vector) { + var promise = importVectorKeys(vector, ["verify"], ["sign"]) + .then(function(vectors) { + promise_test(function(test) { + var plaintext = copyBuffer(vector.plaintext); + plaintext[0] = 255 - plaintext[0]; + var operation = subtle.verify({ + ...vector.algorithm, + get name() { + plaintext[0] = vector.plaintext[0]; + return vector.algorithm.name; + } + }, vector.publicKey, vector.signature, plaintext) + .then(function(is_verified) { + assert_true(is_verified, "Signature verified"); + }, function(err) { + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); + }); + + return operation; + }, vector.name + " with altered plaintext during call"); + }, function(err) { + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " with altered plaintext during call"); + }); + + all_promises.push(promise); + }); + // Check for successful verification even if plaintext is altered after call. testVectors.forEach(function(vector) { var promise = importVectorKeys(vector, ["verify"], ["sign"]) @@ -72,7 +189,7 @@ function run_test() { .then(function(is_verified) { assert_true(is_verified, "Signature verified"); }, function(err) { - assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'"); + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); }); plaintext[0] = 255 - plaintext[0]; @@ -87,6 +204,61 @@ function run_test() { all_promises.push(promise); }); + // Check for failed verification if plaintext is transferred during call. + testVectors.forEach(function(vector) { + var promise = importVectorKeys(vector, ["verify"], ["sign"]) + .then(function(vectors) { + promise_test(function(test) { + var plaintext = copyBuffer(vector.plaintext); + var operation = subtle.verify({ + ...vector.algorithm, + get name() { + plaintext.buffer.transfer(); + return vector.algorithm.name; + } + }, vector.publicKey, vector.signature, plaintext) + .then(function(is_verified) { + assert_false(is_verified, "Signature is NOT verified"); + }, function(err) { + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); + }); + + return operation; + }, vector.name + " with transferred plaintext during call"); + }, function(err) { + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " with transferred plaintext during call"); + }); + + all_promises.push(promise); + }); + + // Check for successful verification even if plaintext is transferred after call. + testVectors.forEach(function(vector) { + var promise = importVectorKeys(vector, ["verify"], ["sign"]) + .then(function(vectors) { + promise_test(function(test) { + var plaintext = copyBuffer(vector.plaintext); + var operation = subtle.verify(vector.algorithm, vector.publicKey, vector.signature, plaintext) + .then(function(is_verified) { + assert_true(is_verified, "Signature verified"); + }, function(err) { + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); + }); + + plaintext.buffer.transfer(); + return operation; + }, vector.name + " with transferred plaintext after call"); + }, function(err) { + promise_test(function(test) { + assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''"); + }, "importVectorKeys step: " + vector.name + " with transferred plaintext after call"); + }); + + all_promises.push(promise); + }); + // Check for failures due to using privateKey to verify. testVectors.forEach(function(vector) { var promise = importVectorKeys(vector, ["verify"], ["sign"]) @@ -94,7 +266,7 @@ function run_test() { promise_test(function(test) { return subtle.verify(vector.algorithm, vector.privateKey, vector.signature, vector.plaintext) .then(function(plaintext) { - assert_unreached("Should have thrown error for using privateKey to verify in " + vector.name + ": " + err.message + "'"); + assert_unreached("Should have thrown error for using privateKey to verify in " + vector.name + ": '" + err.message + "'"); }, function(err) { assert_equals(err.name, "InvalidAccessError", "Should throw InvalidAccessError instead of '" + err.message + "'"); }); @@ -116,7 +288,7 @@ function run_test() { promise_test(function(test) { return subtle.sign(vector.algorithm, vector.publicKey, vector.plaintext) .then(function(signature) { - assert_unreached("Should have thrown error for using publicKey to sign in " + vector.name + ": " + err.message + "'"); + assert_unreached("Should have thrown error for using publicKey to sign in " + vector.name + ": '" + err.message + "'"); }, function(err) { assert_equals(err.name, "InvalidAccessError", "Should throw InvalidAccessError instead of '" + err.message + "'"); }); @@ -139,7 +311,7 @@ function run_test() { promise_test(function(test) { return subtle.verify(vector.algorithm, vector.publicKey, vector.signature, vector.plaintext) .then(function(plaintext) { - assert_unreached("Should have thrown error for no verify usage in " + vector.name + ": " + err.message + "'"); + assert_unreached("Should have thrown error for no verify usage in " + vector.name + ": '" + err.message + "'"); }, function(err) { assert_equals(err.name, "InvalidAccessError", "Should throw InvalidAccessError instead of '" + err.message + "'"); }); @@ -172,7 +344,7 @@ function run_test() { assert_true(is_verified, "Round trip verifies"); return signature; }, function(err) { - assert_unreached("verify error for test " + vector.name + ": " + err.message + "'"); + assert_unreached("verify error for test " + vector.name + ": '" + err.message + "'"); }); }) .then(function(priorSignature) { @@ -289,7 +461,7 @@ function run_test() { .then(function(is_verified) { assert_false(is_verified, "Signature NOT verified"); }, function(err) { - assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'"); + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); }); return operation; @@ -317,7 +489,7 @@ function run_test() { .then(function(is_verified) { assert_false(is_verified, "Signature NOT verified"); }, function(err) { - assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'"); + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); }); return operation; @@ -346,7 +518,7 @@ function run_test() { .then(function(is_verified) { assert_false(is_verified, "Signature NOT verified"); }, function(err) { - assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'"); + assert_unreached("Verification should not throw error " + vector.name + ": '" + err.message + "'"); }); return operation; diff --git a/test/fixtures/wpt/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.https.any.js b/test/fixtures/wpt/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.https.any.js index 9dd837b3bf60a9..880f7d650964ae 100644 --- a/test/fixtures/wpt/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.https.any.js +++ b/test/fixtures/wpt/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.https.any.js @@ -40,6 +40,11 @@ name: "AES-KW", importParameters: {name: "AES-KW", length: 128}, wrapParameters: {name: "AES-KW"} + }, + { + name: 'ChaCha20-Poly1305', + importParameters: {name: "ChaCha20-Poly1305"}, + wrapParameters: {name: "ChaCha20-Poly1305", iv: new Uint8Array(12), additionalData: new Uint8Array(16)} } ]; @@ -57,7 +62,8 @@ {algorithm: {name: "AES-CBC", length: 128}, usages: ["encrypt", "decrypt"]}, {algorithm: {name: "AES-GCM", length: 128}, usages: ["encrypt", "decrypt"]}, {algorithm: {name: "AES-KW", length: 128}, usages: ["wrapKey", "unwrapKey"]}, - {algorithm: {name: "HMAC", length: 128, hash: "SHA-256"}, usages: ["sign", "verify"]} + {algorithm: {name: "HMAC", length: 128, hash: "SHA-256"}, usages: ["sign", "verify"]}, + {algorithm: {name: "ChaCha20-Poly1305"}, usages: ['encrypt', 'decrypt']} ]; // Import all the keys needed, then iterate over all combinations @@ -69,7 +75,7 @@ var wrapper = wrappers[wrapperParam.name]; keysToWrapParameters.filter((param) => Object.keys(keys).includes(param.algorithm.name)).forEach(function(toWrapParam) { var keyData = keys[toWrapParam.algorithm.name]; - ["raw", "spki", "pkcs8"].filter((fmt) => Object.keys(keyData).includes(fmt)).forEach(function(keyDataFormat) { + ["raw", "raw-secret", "spki", "pkcs8"].filter((fmt) => Object.keys(keyData).includes(fmt)).forEach(function(keyDataFormat) { var toWrap = keyData[keyDataFormat]; [keyDataFormat, "jwk"].forEach(function(format) { if (wrappingIsPossible(toWrap.originalExport[format], wrapper.parameters.name)) { @@ -106,9 +112,15 @@ .then(function(key) { wrappers["RSA-OAEP"].unwrappingKey = key; })); + } else if (params.name === "ChaCha20-Poly1305") { + var algorithm = {name: params.name}; + promises.push(subtle.importKey("raw-secret", wrappingKeyData["SYMMETRIC256"].raw, algorithm, true, ["wrapKey", "unwrapKey"]) + .then(function(key) { + wrappers[params.name] = {wrappingKey: key, unwrappingKey: key, parameters: params}; + })); } else { var algorithm = {name: params.name}; - promises.push(subtle.importKey("raw", wrappingKeyData["SYMMETRIC"].raw, algorithm, true, ["wrapKey", "unwrapKey"]) + promises.push(subtle.importKey("raw", wrappingKeyData["SYMMETRIC128"].raw, algorithm, true, ["wrapKey", "unwrapKey"]) .then(function(key) { wrappers[params.name] = {wrappingKey: key, unwrappingKey: key, parameters: params}; })); @@ -151,9 +163,12 @@ var keyData = toWrapKeyDataFromAlg(params.algorithm.name); promises.push(importAndExport("spki", keyData.spki, params.algorithm, params.publicUsages, "public key ")); promises.push(importAndExport("pkcs8", keyData.pkcs8, params.algorithm, params.privateUsages, "private key ")); + } else if (params.algorithm.name === "ChaCha20-Poly1305") { + keys[params.algorithm.name] = {}; + promises.push(importAndExport("raw-secret", toWrapKeyData["SYMMETRIC256"].raw, params.algorithm, params.usages, "")); } else { keys[params.algorithm.name] = {}; - promises.push(importAndExport("raw", toWrapKeyData["SYMMETRIC"].raw, params.algorithm, params.usages, "")); + promises.push(importAndExport("raw", toWrapKeyData["SYMMETRIC128"].raw, params.algorithm, params.usages, "")); } }); // Using allSettled to skip unsupported test cases. @@ -432,6 +447,9 @@ case "ECDH" : deriveParams = {name: "ECDH"}; break; + case "ChaCha20-Poly1305": + cryptParams = {name: "ChaCha20-Poly1305", iv: new Uint8Array(12)}; + break; default: throw new Error("Unsupported algorithm for key comparison"); } diff --git a/test/fixtures/wpt/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey_vectors.js b/test/fixtures/wpt/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey_vectors.js index 0c29a7df88b15e..cf799a8a8ce3ea 100644 --- a/test/fixtures/wpt/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey_vectors.js +++ b/test/fixtures/wpt/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey_vectors.js @@ -14,8 +14,11 @@ let wrappingKeyData = { qi: "JHmVKb1zwW5iRR6RCeexYnh2fmY-3DrPSdM8Dxhr0F8dayi-tlRqEdnG0hvp45n8gLUskWWcB9EXlUJObZGKDfGuxgMa3g_xeLA2vmFQ12MxPsyH4iCNZvsgmGxx7TuOHrnDh5EBVnM4_de63crEJON2sYI8Ozi-xp2OEmAr2seWKq4sxkFni6exLhqb-NE4m9HMKlng1EtQh2rLBFG1VYD3SYYpMLc5fxzqGvSxn3Fa-Xgg-IZPY3ubrcm52KYgmLUGmnYStfVqGSWSdhDXHlNgI5pdAA0FzpyBk3ZX-JsxhwcnneKrYBBweq06kRMGWgvdbdAQ-7wSeGqqj5VPwA" }, }, - "SYMMETRIC": { + "SYMMETRIC128": { raw: new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]), + }, + "SYMMETRIC256": { + raw: new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32]), } } @@ -86,8 +89,11 @@ let toWrapKeyData = { kty: "OKP" } }, - "SYMMETRIC": { + "SYMMETRIC128": { raw: new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]), + }, + "SYMMETRIC256": { + raw: new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32]), } } diff --git a/test/fixtures/wpt/compression/compression-bad-chunks.any.js b/test/fixtures/wpt/compression/compression-bad-chunks.any.js new file mode 100644 index 00000000000000..9afab59e2be1db --- /dev/null +++ b/test/fixtures/wpt/compression/compression-bad-chunks.any.js @@ -0,0 +1,57 @@ +// META: global=window,worker,shadowrealm +// META: script=resources/formats.js + +'use strict'; + +const badChunks = [ + { + name: 'undefined', + value: undefined + }, + { + name: 'null', + value: null + }, + { + name: 'numeric', + value: 3.14 + }, + { + name: 'object, not BufferSource', + value: {} + }, + { + name: 'array', + value: [65] + }, + { + name: 'SharedArrayBuffer', + // Use a getter to postpone construction so that all tests don't fail where + // SharedArrayBuffer is not yet implemented. + get value() { + // See https://github.com/whatwg/html/issues/5380 for why not `new SharedArrayBuffer()` + return new WebAssembly.Memory({ shared:true, initial:1, maximum:1 }).buffer; + } + }, + { + name: 'shared Uint8Array', + get value() { + // See https://github.com/whatwg/html/issues/5380 for why not `new SharedArrayBuffer()` + return new Uint8Array(new WebAssembly.Memory({ shared:true, initial:1, maximum:1 }).buffer) + } + }, +]; + +for (const format of formats) { + for (const chunk of badChunks) { + promise_test(async t => { + const cs = new CompressionStream(format); + const reader = cs.readable.getReader(); + const writer = cs.writable.getWriter(); + const writePromise = writer.write(chunk.value); + const readPromise = reader.read(); + await promise_rejects_js(t, TypeError, writePromise, 'write should reject'); + await promise_rejects_js(t, TypeError, readPromise, 'read should reject'); + }, `chunk of type ${chunk.name} should error the stream for ${format}`); + } +} diff --git a/test/fixtures/wpt/compression/compression-bad-chunks.tentative.any.js b/test/fixtures/wpt/compression/compression-bad-chunks.tentative.any.js deleted file mode 100644 index 2d0b5684733930..00000000000000 --- a/test/fixtures/wpt/compression/compression-bad-chunks.tentative.any.js +++ /dev/null @@ -1,74 +0,0 @@ -// META: global=window,worker,shadowrealm - -'use strict'; - -const badChunks = [ - { - name: 'undefined', - value: undefined - }, - { - name: 'null', - value: null - }, - { - name: 'numeric', - value: 3.14 - }, - { - name: 'object, not BufferSource', - value: {} - }, - { - name: 'array', - value: [65] - }, - { - name: 'SharedArrayBuffer', - // Use a getter to postpone construction so that all tests don't fail where - // SharedArrayBuffer is not yet implemented. - get value() { - // See https://github.com/whatwg/html/issues/5380 for why not `new SharedArrayBuffer()` - return new WebAssembly.Memory({ shared:true, initial:1, maximum:1 }).buffer; - } - }, - { - name: 'shared Uint8Array', - get value() { - // See https://github.com/whatwg/html/issues/5380 for why not `new SharedArrayBuffer()` - return new Uint8Array(new WebAssembly.Memory({ shared:true, initial:1, maximum:1 }).buffer) - } - }, -]; - -for (const chunk of badChunks) { - promise_test(async t => { - const cs = new CompressionStream('gzip'); - const reader = cs.readable.getReader(); - const writer = cs.writable.getWriter(); - const writePromise = writer.write(chunk.value); - const readPromise = reader.read(); - await promise_rejects_js(t, TypeError, writePromise, 'write should reject'); - await promise_rejects_js(t, TypeError, readPromise, 'read should reject'); - }, `chunk of type ${chunk.name} should error the stream for gzip`); - - promise_test(async t => { - const cs = new CompressionStream('deflate'); - const reader = cs.readable.getReader(); - const writer = cs.writable.getWriter(); - const writePromise = writer.write(chunk.value); - const readPromise = reader.read(); - await promise_rejects_js(t, TypeError, writePromise, 'write should reject'); - await promise_rejects_js(t, TypeError, readPromise, 'read should reject'); - }, `chunk of type ${chunk.name} should error the stream for deflate`); - - promise_test(async t => { - const cs = new CompressionStream('deflate-raw'); - const reader = cs.readable.getReader(); - const writer = cs.writable.getWriter(); - const writePromise = writer.write(chunk.value); - const readPromise = reader.read(); - await promise_rejects_js(t, TypeError, writePromise, 'write should reject'); - await promise_rejects_js(t, TypeError, readPromise, 'read should reject'); - }, `chunk of type ${chunk.name} should error the stream for deflate-raw`); -} diff --git a/test/fixtures/wpt/compression/compression-constructor-error.tentative.any.js b/test/fixtures/wpt/compression/compression-constructor-error.any.js similarity index 100% rename from test/fixtures/wpt/compression/compression-constructor-error.tentative.any.js rename to test/fixtures/wpt/compression/compression-constructor-error.any.js diff --git a/test/fixtures/wpt/compression/compression-including-empty-chunk.tentative.any.js b/test/fixtures/wpt/compression/compression-including-empty-chunk.any.js similarity index 52% rename from test/fixtures/wpt/compression/compression-including-empty-chunk.tentative.any.js rename to test/fixtures/wpt/compression/compression-including-empty-chunk.any.js index a7fd1ceb24f086..3c7a722b7c19b5 100644 --- a/test/fixtures/wpt/compression/compression-including-empty-chunk.tentative.any.js +++ b/test/fixtures/wpt/compression/compression-including-empty-chunk.any.js @@ -1,5 +1,7 @@ // META: global=window,worker,shadowrealm // META: script=third_party/pako/pako_inflate.min.js +// META: script=resources/decompress.js +// META: script=resources/formats.js // META: timeout=long 'use strict'; @@ -42,22 +44,13 @@ const chunkLists = [ ]; const expectedValue = new TextEncoder().encode('HelloHello'); -for (const chunkList of chunkLists) { - promise_test(async t => { - const compressedData = await compressChunkList(chunkList, 'deflate'); - // decompress with pako, and check that we got the same result as our original string - assert_array_equals(expectedValue, pako.inflate(compressedData), 'value should match'); - }, `the result of compressing [${chunkList}] with deflate should be 'HelloHello'`); - - promise_test(async t => { - const compressedData = await compressChunkList(chunkList, 'gzip'); - // decompress with pako, and check that we got the same result as our original string - assert_array_equals(expectedValue, pako.inflate(compressedData), 'value should match'); - }, `the result of compressing [${chunkList}] with gzip should be 'HelloHello'`); - - promise_test(async t => { - const compressedData = await compressChunkList(chunkList, 'deflate-raw'); - // decompress with pako, and check that we got the same result as our original string - assert_array_equals(expectedValue, pako.inflateRaw(compressedData), 'value should match'); - }, `the result of compressing [${chunkList}] with deflate-raw should be 'HelloHello'`); +for (const format of formats) { + for (const chunkList of chunkLists) { + promise_test(async t => { + const compressedData = await compressChunkList(chunkList, format); + const decompressedData = await decompressDataOrPako(compressedData, format); + // check that we got the same result as our original string + assert_array_equals(expectedValue, decompressedData, 'value should match'); + }, `the result of compressing [${chunkList}] with ${format} should be 'HelloHello'`); + } } diff --git a/test/fixtures/wpt/compression/compression-large-flush-output.any.js b/test/fixtures/wpt/compression/compression-large-flush-output.any.js index 6afcb4d52875b9..bc9c553b967394 100644 --- a/test/fixtures/wpt/compression/compression-large-flush-output.any.js +++ b/test/fixtures/wpt/compression/compression-large-flush-output.any.js @@ -1,6 +1,8 @@ // META: global=window,worker,shadowrealm // META: script=third_party/pako/pako_inflate.min.js // META: script=resources/concatenate-stream.js +// META: script=resources/decompress.js +// META: script=resources/formats.js // META: timeout=long 'use strict'; @@ -21,21 +23,11 @@ const fullData = new TextEncoder().encode(JSON.stringify(Array.from({ length: 10 const data = fullData.subarray(0, 35_579); const expectedValue = data; -promise_test(async t => { - const compressedData = await compressData(data, 'deflate'); - // decompress with pako, and check that we got the same result as our original string - assert_array_equals(expectedValue, pako.inflate(compressedData), 'value should match'); -}, `deflate compression with large flush output`); - -promise_test(async t => { - const compressedData = await compressData(data, 'gzip'); - // decompress with pako, and check that we got the same result as our original string - assert_array_equals(expectedValue, pako.inflate(compressedData), 'value should match'); -}, `gzip compression with large flush output`); - -promise_test(async t => { - const compressedData = await compressData(data, 'deflate-raw'); - // decompress with pako, and check that we got the same result as our original string - assert_array_equals(expectedValue, pako.inflateRaw(compressedData), 'value should match'); -}, `deflate-raw compression with large flush output`); - +for (const format of formats) { + promise_test(async t => { + const compressedData = await compressData(data, format); + const decompressedData = await decompressDataOrPako(compressedData, format); + // check that we got the same result as our original string + assert_array_equals(decompressedData, expectedValue, 'value should match'); + }, `${format} compression with large flush output`); +} diff --git a/test/fixtures/wpt/compression/compression-multiple-chunks.any.js b/test/fixtures/wpt/compression/compression-multiple-chunks.any.js new file mode 100644 index 00000000000000..2a77df2c945249 --- /dev/null +++ b/test/fixtures/wpt/compression/compression-multiple-chunks.any.js @@ -0,0 +1,58 @@ +// META: global=window,worker,shadowrealm +// META: script=third_party/pako/pako_inflate.min.js +// META: script=resources/decompress.js +// META: script=resources/formats.js +// META: timeout=long + +'use strict'; + +// This test asserts that compressing multiple chunks should work. + +// Example: ('Hello', 3) => TextEncoder().encode('HelloHelloHello') +function makeExpectedChunk(input, numberOfChunks) { + const expectedChunk = input.repeat(numberOfChunks); + return new TextEncoder().encode(expectedChunk); +} + +// Example: ('Hello', 3, 'deflate') => compress ['Hello', 'Hello', Hello'] +async function compressMultipleChunks(input, numberOfChunks, format) { + const cs = new CompressionStream(format); + const writer = cs.writable.getWriter(); + const chunk = new TextEncoder().encode(input); + for (let i = 0; i < numberOfChunks; ++i) { + writer.write(chunk); + } + const closePromise = writer.close(); + const out = []; + const reader = cs.readable.getReader(); + let totalSize = 0; + while (true) { + const { value, done } = await reader.read(); + if (done) + break; + out.push(value); + totalSize += value.byteLength; + } + await closePromise; + const concatenated = new Uint8Array(totalSize); + let offset = 0; + for (const array of out) { + concatenated.set(array, offset); + offset += array.byteLength; + } + return concatenated; +} + +const hello = 'Hello'; + +for (const format of formats) { + for (let numberOfChunks = 2; numberOfChunks <= 16; ++numberOfChunks) { + promise_test(async t => { + const compressedData = await compressMultipleChunks(hello, numberOfChunks, format); + const decompressedData = await decompressDataOrPako(compressedData, format); + const expectedValue = makeExpectedChunk(hello, numberOfChunks); + // check that we got the same result as our original string + assert_array_equals(decompressedData, expectedValue, 'value should match'); + }, `compressing ${numberOfChunks} chunks with ${format} should work`); + } +} diff --git a/test/fixtures/wpt/compression/compression-multiple-chunks.tentative.any.js b/test/fixtures/wpt/compression/compression-multiple-chunks.tentative.any.js deleted file mode 100644 index 28a90e5ca53902..00000000000000 --- a/test/fixtures/wpt/compression/compression-multiple-chunks.tentative.any.js +++ /dev/null @@ -1,67 +0,0 @@ -// META: global=window,worker,shadowrealm -// META: script=third_party/pako/pako_inflate.min.js -// META: timeout=long - -'use strict'; - -// This test asserts that compressing multiple chunks should work. - -// Example: ('Hello', 3) => TextEncoder().encode('HelloHelloHello') -function makeExpectedChunk(input, numberOfChunks) { - const expectedChunk = input.repeat(numberOfChunks); - return new TextEncoder().encode(expectedChunk); -} - -// Example: ('Hello', 3, 'deflate') => compress ['Hello', 'Hello', Hello'] -async function compressMultipleChunks(input, numberOfChunks, format) { - const cs = new CompressionStream(format); - const writer = cs.writable.getWriter(); - const chunk = new TextEncoder().encode(input); - for (let i = 0; i < numberOfChunks; ++i) { - writer.write(chunk); - } - const closePromise = writer.close(); - const out = []; - const reader = cs.readable.getReader(); - let totalSize = 0; - while (true) { - const { value, done } = await reader.read(); - if (done) - break; - out.push(value); - totalSize += value.byteLength; - } - await closePromise; - const concatenated = new Uint8Array(totalSize); - let offset = 0; - for (const array of out) { - concatenated.set(array, offset); - offset += array.byteLength; - } - return concatenated; -} - -const hello = 'Hello'; - -for (let numberOfChunks = 2; numberOfChunks <= 16; ++numberOfChunks) { - promise_test(async t => { - const compressedData = await compressMultipleChunks(hello, numberOfChunks, 'deflate'); - const expectedValue = makeExpectedChunk(hello, numberOfChunks); - // decompress with pako, and check that we got the same result as our original string - assert_array_equals(expectedValue, pako.inflate(compressedData), 'value should match'); - }, `compressing ${numberOfChunks} chunks with deflate should work`); - - promise_test(async t => { - const compressedData = await compressMultipleChunks(hello, numberOfChunks, 'gzip'); - const expectedValue = makeExpectedChunk(hello, numberOfChunks); - // decompress with pako, and check that we got the same result as our original string - assert_array_equals(expectedValue, pako.inflate(compressedData), 'value should match'); - }, `compressing ${numberOfChunks} chunks with gzip should work`); - - promise_test(async t => { - const compressedData = await compressMultipleChunks(hello, numberOfChunks, 'deflate-raw'); - const expectedValue = makeExpectedChunk(hello, numberOfChunks); - // decompress with pako, and check that we got the same result as our original string - assert_array_equals(expectedValue, pako.inflateRaw(compressedData), 'value should match'); - }, `compressing ${numberOfChunks} chunks with deflate-raw should work`); -} diff --git a/test/fixtures/wpt/compression/compression-output-length.any.js b/test/fixtures/wpt/compression/compression-output-length.any.js new file mode 100644 index 00000000000000..726c32f5ff5e82 --- /dev/null +++ b/test/fixtures/wpt/compression/compression-output-length.any.js @@ -0,0 +1,47 @@ +// META: global=window,worker,shadowrealm +// META: script=resources/formats.js + +'use strict'; + +// This test asserts that compressed data length is shorter than the original +// data length. If the input is extremely small, the compressed data may be +// larger than the original data. + +const LARGE_FILE = '/media/test-av-384k-44100Hz-1ch-320x240-30fps-10kfr.webm'; + +async function compressArrayBuffer(input, format) { + const cs = new CompressionStream(format); + const writer = cs.writable.getWriter(); + writer.write(input); + const closePromise = writer.close(); + const out = []; + const reader = cs.readable.getReader(); + let totalSize = 0; + while (true) { + const { value, done } = await reader.read(); + if (done) + break; + out.push(value); + totalSize += value.byteLength; + } + await closePromise; + const concatenated = new Uint8Array(totalSize); + let offset = 0; + for (const array of out) { + concatenated.set(array, offset); + offset += array.byteLength; + } + return concatenated; +} + +for (const format of formats) { + promise_test(async () => { + const response = await fetch(LARGE_FILE); + const buffer = await response.arrayBuffer(); + const bufferView = new Uint8Array(buffer); + const originalLength = bufferView.length; + const compressedData = await compressArrayBuffer(bufferView, format); + const compressedLength = compressedData.length; + assert_less_than(compressedLength, originalLength, 'output should be smaller'); + }, `the length of ${format} data should be shorter than that of the original data`); +} diff --git a/test/fixtures/wpt/compression/compression-output-length.tentative.any.js b/test/fixtures/wpt/compression/compression-output-length.tentative.any.js deleted file mode 100644 index 7aa13734500d26..00000000000000 --- a/test/fixtures/wpt/compression/compression-output-length.tentative.any.js +++ /dev/null @@ -1,64 +0,0 @@ -// META: global=window,worker,shadowrealm - -'use strict'; - -// This test asserts that compressed data length is shorter than the original -// data length. If the input is extremely small, the compressed data may be -// larger than the original data. - -const LARGE_FILE = '/media/test-av-384k-44100Hz-1ch-320x240-30fps-10kfr.webm'; - -async function compressArrayBuffer(input, format) { - const cs = new CompressionStream(format); - const writer = cs.writable.getWriter(); - writer.write(input); - const closePromise = writer.close(); - const out = []; - const reader = cs.readable.getReader(); - let totalSize = 0; - while (true) { - const { value, done } = await reader.read(); - if (done) - break; - out.push(value); - totalSize += value.byteLength; - } - await closePromise; - const concatenated = new Uint8Array(totalSize); - let offset = 0; - for (const array of out) { - concatenated.set(array, offset); - offset += array.byteLength; - } - return concatenated; -} - -promise_test(async () => { - const response = await fetch(LARGE_FILE); - const buffer = await response.arrayBuffer(); - const bufferView = new Uint8Array(buffer); - const originalLength = bufferView.length; - const compressedData = await compressArrayBuffer(bufferView, 'deflate'); - const compressedLength = compressedData.length; - assert_less_than(compressedLength, originalLength, 'output should be smaller'); -}, 'the length of deflated data should be shorter than that of the original data'); - -promise_test(async () => { - const response = await fetch(LARGE_FILE); - const buffer = await response.arrayBuffer(); - const bufferView = new Uint8Array(buffer); - const originalLength = bufferView.length; - const compressedData = await compressArrayBuffer(bufferView, 'gzip'); - const compressedLength = compressedData.length; - assert_less_than(compressedLength, originalLength, 'output should be smaller'); -}, 'the length of gzipped data should be shorter than that of the original data'); - -promise_test(async () => { - const response = await fetch(LARGE_FILE); - const buffer = await response.arrayBuffer(); - const bufferView = new Uint8Array(buffer); - const originalLength = bufferView.length; - const compressedData = await compressArrayBuffer(bufferView, 'deflate-raw'); - const compressedLength = compressedData.length; - assert_less_than(compressedLength, originalLength, 'output should be smaller'); -}, 'the length of deflated (with -raw) data should be shorter than that of the original data'); diff --git a/test/fixtures/wpt/compression/compression-stream.any.js b/test/fixtures/wpt/compression/compression-stream.any.js new file mode 100644 index 00000000000000..02183da0c63853 --- /dev/null +++ b/test/fixtures/wpt/compression/compression-stream.any.js @@ -0,0 +1,59 @@ +// META: global=window,worker,shadowrealm +// META: script=third_party/pako/pako_inflate.min.js +// META: script=resources/decompress.js +// META: script=resources/formats.js +// META: timeout=long + +'use strict'; + +const SMALL_FILE = "/media/foo.vtt"; +const LARGE_FILE = "/media/test-av-384k-44100Hz-1ch-320x240-30fps-10kfr.webm"; + +let dataPromiseList = [ + ["empty data", Promise.resolve(new Uint8Array(0))], + ["small amount data", fetch(SMALL_FILE).then(response => response.bytes())], + ["large amount data", fetch(LARGE_FILE).then(response => response.bytes())], +]; + +async function compressArrayBuffer(input, format) { + const cs = new CompressionStream(format); + const writer = cs.writable.getWriter(); + writer.write(input); + const closePromise = writer.close(); + const out = []; + const reader = cs.readable.getReader(); + let totalSize = 0; + while (true) { + const { value, done } = await reader.read(); + if (done) + break; + out.push(value); + totalSize += value.byteLength; + } + await closePromise; + const concatenated = new Uint8Array(totalSize); + let offset = 0; + for (const array of out) { + concatenated.set(array, offset); + offset += array.byteLength; + } + return concatenated; +} + +test(() => { + assert_throws_js(TypeError, () => { + const transformer = new CompressionStream("nonvalid"); + }, "non supported format should throw"); +}, "CompressionStream constructor should throw on invalid format"); + +for (const format of formats) { + for (const [label, dataPromise] of dataPromiseList) { + promise_test(async () => { + const bufferView = await dataPromise; + const compressedData = await compressArrayBuffer(bufferView, format); + const decompressedData = await decompressDataOrPako(compressedData, format); + // check that we got the same result as our original string + assert_array_equals(decompressedData, bufferView, 'value should match'); + }, `${format} ${label} should be reinflated back to its origin`); + } +} diff --git a/test/fixtures/wpt/compression/compression-stream.tentative.any.js b/test/fixtures/wpt/compression/compression-stream.tentative.any.js deleted file mode 100644 index a7ea0cb908402f..00000000000000 --- a/test/fixtures/wpt/compression/compression-stream.tentative.any.js +++ /dev/null @@ -1,91 +0,0 @@ -// META: global=window,worker,shadowrealm -// META: script=third_party/pako/pako_inflate.min.js -// META: timeout=long - -'use strict'; - -const SMALL_FILE = "/media/foo.vtt"; -const LARGE_FILE = "/media/test-av-384k-44100Hz-1ch-320x240-30fps-10kfr.webm"; - -async function compressArrayBuffer(input, format) { - const cs = new CompressionStream(format); - const writer = cs.writable.getWriter(); - writer.write(input); - const closePromise = writer.close(); - const out = []; - const reader = cs.readable.getReader(); - let totalSize = 0; - while (true) { - const { value, done } = await reader.read(); - if (done) - break; - out.push(value); - totalSize += value.byteLength; - } - await closePromise; - const concatenated = new Uint8Array(totalSize); - let offset = 0; - for (const array of out) { - concatenated.set(array, offset); - offset += array.byteLength; - } - return concatenated; -} - -test(() => { - assert_throws_js(TypeError, () => { - const transformer = new CompressionStream("nonvalid"); - }, "non supported format should throw"); -}, "CompressionStream constructor should throw on invalid format"); - -promise_test(async () => { - const buffer = new ArrayBuffer(0); - const bufferView = new Uint8Array(buffer); - const compressedData = await compressArrayBuffer(bufferView, "deflate"); - // decompress with pako, and check that we got the same result as our original string - assert_array_equals(bufferView, pako.inflate(compressedData)); -}, "deflated empty data should be reinflated back to its origin"); - -promise_test(async () => { - const response = await fetch(SMALL_FILE) - const buffer = await response.arrayBuffer(); - const bufferView = new Uint8Array(buffer); - const compressedData = await compressArrayBuffer(bufferView, "deflate"); - // decompress with pako, and check that we got the same result as our original string - assert_array_equals(bufferView, pako.inflate(compressedData)); -}, "deflated small amount data should be reinflated back to its origin"); - -promise_test(async () => { - const response = await fetch(LARGE_FILE) - const buffer = await response.arrayBuffer(); - const bufferView = new Uint8Array(buffer); - const compressedData = await compressArrayBuffer(bufferView, "deflate"); - // decompress with pako, and check that we got the same result as our original string - assert_array_equals(bufferView, pako.inflate(compressedData)); -}, "deflated large amount data should be reinflated back to its origin"); - -promise_test(async () => { - const buffer = new ArrayBuffer(0); - const bufferView = new Uint8Array(buffer); - const compressedData = await compressArrayBuffer(bufferView, "gzip"); - // decompress with pako, and check that we got the same result as our original string - assert_array_equals(bufferView, pako.inflate(compressedData)); -}, "gzipped empty data should be reinflated back to its origin"); - -promise_test(async () => { - const response = await fetch(SMALL_FILE) - const buffer = await response.arrayBuffer(); - const bufferView = new Uint8Array(buffer); - const compressedData = await compressArrayBuffer(bufferView, "gzip"); - // decompress with pako, and check that we got the same result as our original string - assert_array_equals(bufferView, pako.inflate(compressedData)); -}, "gzipped small amount data should be reinflated back to its origin"); - -promise_test(async () => { - const response = await fetch(LARGE_FILE) - const buffer = await response.arrayBuffer(); - const bufferView = new Uint8Array(buffer); - const compressedData = await compressArrayBuffer(bufferView, "gzip"); - // decompress with pako, and check that we got the same result as our original string - assert_array_equals(bufferView, pako.inflate(compressedData)); -}, "gzipped large amount data should be reinflated back to its origin"); diff --git a/test/fixtures/wpt/compression/compression-with-detach.tentative.window.js b/test/fixtures/wpt/compression/compression-with-detach.window.js similarity index 100% rename from test/fixtures/wpt/compression/compression-with-detach.tentative.window.js rename to test/fixtures/wpt/compression/compression-with-detach.window.js diff --git a/test/fixtures/wpt/compression/decompression-bad-chunks.tentative.any.js b/test/fixtures/wpt/compression/decompression-bad-chunks.any.js similarity index 82% rename from test/fixtures/wpt/compression/decompression-bad-chunks.tentative.any.js rename to test/fixtures/wpt/compression/decompression-bad-chunks.any.js index f450b0c4cb2553..57adebb2837228 100644 --- a/test/fixtures/wpt/compression/decompression-bad-chunks.tentative.any.js +++ b/test/fixtures/wpt/compression/decompression-bad-chunks.any.js @@ -1,4 +1,5 @@ // META: global=window,worker,shadowrealm +// META: script=resources/formats.js 'use strict'; @@ -70,16 +71,10 @@ async function decompress(chunk, format, t) await promise_rejects_js(t, TypeError, reader.closed, 'read.closed should reject'); } -for (const chunk of badChunks) { - promise_test(async t => { - await decompress(chunk, 'gzip', t); - }, `chunk of type ${chunk.name} should error the stream for gzip`); - - promise_test(async t => { - await decompress(chunk, 'deflate', t); - }, `chunk of type ${chunk.name} should error the stream for deflate`); - - promise_test(async t => { - await decompress(chunk, 'deflate-raw', t); - }, `chunk of type ${chunk.name} should error the stream for deflate-raw`); +for (const format of formats) { + for (const chunk of badChunks) { + promise_test(async t => { + await decompress(chunk, format, t); + }, `chunk of type ${chunk.name} should error the stream for ${format}`); + } } diff --git a/test/fixtures/wpt/compression/decompression-buffersource.any.js b/test/fixtures/wpt/compression/decompression-buffersource.any.js new file mode 100644 index 00000000000000..56216c8bd62372 --- /dev/null +++ b/test/fixtures/wpt/compression/decompression-buffersource.any.js @@ -0,0 +1,86 @@ +// META: global=window,worker,shadowrealm + +'use strict'; + +const compressedBytes = [ + ["deflate", [120, 156, 75, 52, 48, 52, 50, 54, 49, 53, 3, 0, 8, 136, 1, 199]], + ["gzip", [31, 139, 8, 0, 0, 0, 0, 0, 0, 3, 75, 52, 48, 52, 2, 0, 216, 252, 63, 136, 4, 0, 0, 0]], + ["deflate-raw", [ + 0x00, 0x06, 0x00, 0xf9, 0xff, 0x41, 0x42, 0x43, + 0x44, 0x45, 0x46, 0x01, 0x00, 0x00, 0xff, 0xff, + ]], + ["brotli", [0x21, 0x08, 0x00, 0x04, 0x66, 0x6F, 0x6F, 0x03]] +]; +// These chunk values below were chosen to make the length of the compressed +// output be a multiple of 8 bytes. +const expectedChunkValue = new Map(Object.entries({ + "deflate": new TextEncoder().encode('a0123456'), + "gzip": new TextEncoder().encode('a012'), + "deflate-raw": new TextEncoder().encode('ABCDEF'), + "brotli": new TextEncoder().encode('foo'), +})); + +const bufferSourceChunks = compressedBytes.map(([format, bytes]) => [format, [ + { + name: 'ArrayBuffer', + value: new Uint8Array(bytes).buffer + }, + { + name: 'Int8Array', + value: new Int8Array(new Uint8Array(bytes).buffer) + }, + { + name: 'Uint8Array', + value: new Uint8Array(new Uint8Array(bytes).buffer) + }, + { + name: 'Uint8ClampedArray', + value: new Uint8ClampedArray(new Uint8Array(bytes).buffer) + }, + { + name: 'Int16Array', + value: new Int16Array(new Uint8Array(bytes).buffer) + }, + { + name: 'Uint16Array', + value: new Uint16Array(new Uint8Array(bytes).buffer) + }, + { + name: 'Int32Array', + value: new Int32Array(new Uint8Array(bytes).buffer) + }, + { + name: 'Uint32Array', + value: new Uint32Array(new Uint8Array(bytes).buffer) + }, + { + name: 'Float16Array', + value: () => new Float16Array(new Uint8Array(bytes).buffer) + }, + { + name: 'Float32Array', + value: new Float32Array(new Uint8Array(bytes).buffer) + }, + { + name: 'Float64Array', + value: new Float64Array(new Uint8Array(bytes).buffer) + }, + { + name: 'DataView', + value: new DataView(new Uint8Array(bytes).buffer) + }, +]]); + +for (const [format, chunks] of bufferSourceChunks) { + for (const chunk of chunks) { + promise_test(async t => { + const ds = new DecompressionStream(format); + const reader = ds.readable.getReader(); + const writer = ds.writable.getWriter(); + const writePromise = writer.write(typeof chunk.value === 'function' ? chunk.value() : chunk.value); + writer.close(); + const { value } = await reader.read(); + assert_array_equals(Array.from(value), expectedChunkValue.get(format), 'value should match'); + }, `chunk of type ${chunk.name} should work for ${format}`); + } +} diff --git a/test/fixtures/wpt/compression/decompression-buffersource.tentative.any.js b/test/fixtures/wpt/compression/decompression-buffersource.tentative.any.js deleted file mode 100644 index f4316ba1fc876e..00000000000000 --- a/test/fixtures/wpt/compression/decompression-buffersource.tentative.any.js +++ /dev/null @@ -1,204 +0,0 @@ -// META: global=window,worker,shadowrealm - -'use strict'; - -const compressedBytesWithDeflate = [120, 156, 75, 52, 48, 52, 50, 54, 49, 53, 3, 0, 8, 136, 1, 199]; -const compressedBytesWithGzip = [31, 139, 8, 0, 0, 0, 0, 0, 0, 3, 75, 52, 48, 52, 2, 0, 216, 252, 63, 136, 4, 0, 0, 0]; -const compressedBytesWithDeflateRaw = [ - 0x00, 0x06, 0x00, 0xf9, 0xff, 0x41, 0x42, 0x43, - 0x44, 0x45, 0x46, 0x01, 0x00, 0x00, 0xff, 0xff, -]; -// These chunk values below were chosen to make the length of the compressed -// output be a multiple of 8 bytes. -const deflateExpectedChunkValue = new TextEncoder().encode('a0123456'); -const gzipExpectedChunkValue = new TextEncoder().encode('a012'); -const deflateRawExpectedChunkValue = new TextEncoder().encode('ABCDEF'); - -const bufferSourceChunksForDeflate = [ - { - name: 'ArrayBuffer', - value: new Uint8Array(compressedBytesWithDeflate).buffer - }, - { - name: 'Int8Array', - value: new Int8Array(new Uint8Array(compressedBytesWithDeflate).buffer) - }, - { - name: 'Uint8Array', - value: new Uint8Array(new Uint8Array(compressedBytesWithDeflate).buffer) - }, - { - name: 'Uint8ClampedArray', - value: new Uint8ClampedArray(new Uint8Array(compressedBytesWithDeflate).buffer) - }, - { - name: 'Int16Array', - value: new Int16Array(new Uint8Array(compressedBytesWithDeflate).buffer) - }, - { - name: 'Uint16Array', - value: new Uint16Array(new Uint8Array(compressedBytesWithDeflate).buffer) - }, - { - name: 'Int32Array', - value: new Int32Array(new Uint8Array(compressedBytesWithDeflate).buffer) - }, - { - name: 'Uint32Array', - value: new Uint32Array(new Uint8Array(compressedBytesWithDeflate).buffer) - }, - { - name: 'Float16Array', - value: () => new Float16Array(new Uint8Array(compressedBytesWithDeflate).buffer) - }, - { - name: 'Float32Array', - value: new Float32Array(new Uint8Array(compressedBytesWithDeflate).buffer) - }, - { - name: 'Float64Array', - value: new Float64Array(new Uint8Array(compressedBytesWithDeflate).buffer) - }, - { - name: 'DataView', - value: new DataView(new Uint8Array(compressedBytesWithDeflate).buffer) - }, -]; - -const bufferSourceChunksForGzip = [ - { - name: 'ArrayBuffer', - value: new Uint8Array(compressedBytesWithGzip).buffer - }, - { - name: 'Int8Array', - value: new Int8Array(new Uint8Array(compressedBytesWithGzip).buffer) - }, - { - name: 'Uint8Array', - value: new Uint8Array(new Uint8Array(compressedBytesWithGzip).buffer) - }, - { - name: 'Uint8ClambedArray', - value: new Uint8ClampedArray(new Uint8Array(compressedBytesWithGzip).buffer) - }, - { - name: 'Int16Array', - value: new Int16Array(new Uint8Array(compressedBytesWithGzip).buffer) - }, - { - name: 'Uint16Array', - value: new Uint16Array(new Uint8Array(compressedBytesWithGzip).buffer) - }, - { - name: 'Int32Array', - value: new Int32Array(new Uint8Array(compressedBytesWithGzip).buffer) - }, - { - name: 'Uint32Array', - value: new Uint32Array(new Uint8Array(compressedBytesWithGzip).buffer) - }, - { - name: 'Float16Array', - value: () => new Float16Array(new Uint8Array(compressedBytesWithGzip).buffer) - }, - { - name: 'Float32Array', - value: new Float32Array(new Uint8Array(compressedBytesWithGzip).buffer) - }, - { - name: 'Float64Array', - value: new Float64Array(new Uint8Array(compressedBytesWithGzip).buffer) - }, - { - name: 'DataView', - value: new DataView(new Uint8Array(compressedBytesWithGzip).buffer) - }, -]; - -const bufferSourceChunksForDeflateRaw = [ - { - name: 'ArrayBuffer', - value: new Uint8Array(compressedBytesWithDeflateRaw).buffer - }, - { - name: 'Int8Array', - value: new Int8Array(new Uint8Array(compressedBytesWithDeflateRaw).buffer) - }, - { - name: 'Uint8Array', - value: new Uint8Array(new Uint8Array(compressedBytesWithDeflateRaw).buffer) - }, - { - name: 'Uint8ClampedArray', - value: new Uint8ClampedArray(new Uint8Array(compressedBytesWithDeflateRaw).buffer) - }, - { - name: 'Int16Array', - value: new Int16Array(new Uint8Array(compressedBytesWithDeflateRaw).buffer) - }, - { - name: 'Uint16Array', - value: new Uint16Array(new Uint8Array(compressedBytesWithDeflateRaw).buffer) - }, - { - name: 'Int32Array', - value: new Int32Array(new Uint8Array(compressedBytesWithDeflateRaw).buffer) - }, - { - name: 'Uint32Array', - value: new Uint32Array(new Uint8Array(compressedBytesWithDeflateRaw).buffer) - }, - { - name: 'Float16Array', - value: () => new Float16Array(new Uint8Array(compressedBytesWithDeflateRaw).buffer) - }, - { - name: 'Float32Array', - value: new Float32Array(new Uint8Array(compressedBytesWithDeflateRaw).buffer) - }, - { - name: 'Float64Array', - value: new Float64Array(new Uint8Array(compressedBytesWithDeflateRaw).buffer) - }, - { - name: 'DataView', - value: new DataView(new Uint8Array(compressedBytesWithDeflateRaw).buffer) - }, -]; - -for (const chunk of bufferSourceChunksForDeflate) { - promise_test(async t => { - const ds = new DecompressionStream('deflate'); - const reader = ds.readable.getReader(); - const writer = ds.writable.getWriter(); - const writePromise = writer.write(typeof chunk.value === 'function' ? chunk.value() : chunk.value); - writer.close(); - const { value } = await reader.read(); - assert_array_equals(Array.from(value), deflateExpectedChunkValue, 'value should match'); - }, `chunk of type ${chunk.name} should work for deflate`); -} - -for (const chunk of bufferSourceChunksForGzip) { - promise_test(async t => { - const ds = new DecompressionStream('gzip'); - const reader = ds.readable.getReader(); - const writer = ds.writable.getWriter(); - const writePromise = writer.write(typeof chunk.value === 'function' ? chunk.value() : chunk.value); - writer.close(); - const { value } = await reader.read(); - assert_array_equals(Array.from(value), gzipExpectedChunkValue, 'value should match'); - }, `chunk of type ${chunk.name} should work for gzip`); -} - -for (const chunk of bufferSourceChunksForDeflateRaw) { - promise_test(async t => { - const ds = new DecompressionStream('deflate-raw'); - const reader = ds.readable.getReader(); - const writer = ds.writable.getWriter(); - const writePromise = writer.write(typeof chunk.value === 'function' ? chunk.value() : chunk.value); - writer.close(); - const { value } = await reader.read(); - assert_array_equals(Array.from(value), deflateRawExpectedChunkValue, 'value should match'); - }, `chunk of type ${chunk.name} should work for deflate-raw`); -} diff --git a/test/fixtures/wpt/compression/decompression-constructor-error.tentative.any.js b/test/fixtures/wpt/compression/decompression-constructor-error.any.js similarity index 100% rename from test/fixtures/wpt/compression/decompression-constructor-error.tentative.any.js rename to test/fixtures/wpt/compression/decompression-constructor-error.any.js diff --git a/test/fixtures/wpt/compression/decompression-correct-input.any.js b/test/fixtures/wpt/compression/decompression-correct-input.any.js new file mode 100644 index 00000000000000..0d0d82e714a882 --- /dev/null +++ b/test/fixtures/wpt/compression/decompression-correct-input.any.js @@ -0,0 +1,15 @@ +// META: global=window,worker,shadowrealm +// META: script=resources/decompression-input.js + +'use strict'; + +for (const [format, chunk] of compressedBytes) { + promise_test(async t => { + const ds = new DecompressionStream(format); + const reader = ds.readable.getReader(); + const writer = ds.writable.getWriter(); + const writePromise = writer.write(chunk); + const { done, value } = await reader.read(); + assert_array_equals(Array.from(value), expectedChunkValue, "value should match"); + }, `decompressing ${format} input should work`); +} diff --git a/test/fixtures/wpt/compression/decompression-correct-input.tentative.any.js b/test/fixtures/wpt/compression/decompression-correct-input.tentative.any.js deleted file mode 100644 index 90519445e3667b..00000000000000 --- a/test/fixtures/wpt/compression/decompression-correct-input.tentative.any.js +++ /dev/null @@ -1,39 +0,0 @@ -// META: global=window,worker,shadowrealm - -'use strict'; - -const deflateChunkValue = new Uint8Array([120, 156, 75, 173, 40, 72, 77, 46, 73, 77, 81, 200, 47, 45, 41, 40, 45, 1, 0, 48, 173, 6, 36]); -const gzipChunkValue = new Uint8Array([31, 139, 8, 0, 0, 0, 0, 0, 0, 3, 75, 173, 40, 72, 77, 46, 73, 77, 81, 200, 47, 45, 41, 40, 45, 1, 0, 176, 1, 57, 179, 15, 0, 0, 0]); -const deflateRawChunkValue = new Uint8Array([ - 0x4b, 0xad, 0x28, 0x48, 0x4d, 0x2e, 0x49, 0x4d, 0x51, 0xc8, - 0x2f, 0x2d, 0x29, 0x28, 0x2d, 0x01, 0x00, -]); -const trueChunkValue = new TextEncoder().encode('expected output'); - -promise_test(async t => { - const ds = new DecompressionStream('deflate'); - const reader = ds.readable.getReader(); - const writer = ds.writable.getWriter(); - const writePromise = writer.write(deflateChunkValue); - const { done, value } = await reader.read(); - assert_array_equals(Array.from(value), trueChunkValue, "value should match"); -}, 'decompressing deflated input should work'); - - -promise_test(async t => { - const ds = new DecompressionStream('gzip'); - const reader = ds.readable.getReader(); - const writer = ds.writable.getWriter(); - const writePromise = writer.write(gzipChunkValue); - const { done, value } = await reader.read(); - assert_array_equals(Array.from(value), trueChunkValue, "value should match"); -}, 'decompressing gzip input should work'); - -promise_test(async t => { - const ds = new DecompressionStream('deflate-raw'); - const reader = ds.readable.getReader(); - const writer = ds.writable.getWriter(); - const writePromise = writer.write(deflateRawChunkValue); - const { done, value } = await reader.read(); - assert_array_equals(Array.from(value), trueChunkValue, "value should match"); -}, 'decompressing deflated (with -raw) input should work'); diff --git a/test/fixtures/wpt/compression/decompression-corrupt-input.tentative.any.js b/test/fixtures/wpt/compression/decompression-corrupt-input.any.js similarity index 93% rename from test/fixtures/wpt/compression/decompression-corrupt-input.tentative.any.js rename to test/fixtures/wpt/compression/decompression-corrupt-input.any.js index fc18197dfbd3db..492232ee92b777 100644 --- a/test/fixtures/wpt/compression/decompression-corrupt-input.tentative.any.js +++ b/test/fixtures/wpt/compression/decompression-corrupt-input.any.js @@ -1,4 +1,5 @@ -// META global=window,worker,shadowrealm +// META: global=window,worker,shadowrealm +// META: script=resources/decompression-input.js // This test checks that DecompressionStream behaves according to the standard // when the input is corrupted. To avoid a combinatorial explosion in the @@ -13,8 +14,7 @@ const expectations = [ format: 'deflate', // Decompresses to 'expected output'. - baseInput: [120, 156, 75, 173, 40, 72, 77, 46, 73, 77, 81, 200, 47, 45, 41, - 40, 45, 1, 0, 48, 173, 6, 36], + baseInput: deflateChunkValue, // See RFC1950 for the definition of the various fields used by deflate: // https://tools.ietf.org/html/rfc1950. @@ -102,9 +102,7 @@ const expectations = [ format: 'gzip', // Decompresses to 'expected output'. - baseInput: [31, 139, 8, 0, 0, 0, 0, 0, 0, 3, 75, 173, 40, 72, 77, 46, 73, - 77, 81, 200, 47, 45, 41, 40, 45, 1, 0, 176, 1, 57, 179, 15, 0, - 0, 0], + baseInput: gzipChunkValue, // See RFC1952 for the definition of the various fields used by gzip: // https://tools.ietf.org/html/rfc1952. @@ -224,6 +222,14 @@ const expectations = [ ] } ] + }, + { + format: 'brotli', + + // Decompresses to 'expected output'. + baseInput: brotliChunkValue, + + fields: [] } ]; @@ -274,18 +280,18 @@ function corruptInput(input, offset, length, value) { for (const { format, baseInput, fields } of expectations) { promise_test(async () => { - const { result } = await tryDecompress(new Uint8Array(baseInput), format); + const { result } = await tryDecompress(baseInput, format); assert_equals(result, 'success', 'decompression should succeed'); }, `the unchanged input for '${format}' should decompress successfully`); promise_test(async () => { - const truncatedInput = new Uint8Array(baseInput.slice(0, -1)); + const truncatedInput = baseInput.subarray(0, -1); const { result } = await tryDecompress(truncatedInput, format); assert_equals(result, 'error', 'decompression should fail'); }, `truncating the input for '${format}' should give an error`); promise_test(async () => { - const extendedInput = new Uint8Array(baseInput.concat([0])); + const extendedInput = new Uint8Array([...baseInput, 0]); const { result } = await tryDecompress(extendedInput, format); assert_equals(result, 'error', 'decompression should fail'); }, `trailing junk for '${format}' should give an error`); diff --git a/test/fixtures/wpt/compression/decompression-empty-input.any.js b/test/fixtures/wpt/compression/decompression-empty-input.any.js new file mode 100644 index 00000000000000..40a660dbe02898 --- /dev/null +++ b/test/fixtures/wpt/compression/decompression-empty-input.any.js @@ -0,0 +1,24 @@ +// META: global=window,worker,shadowrealm + +'use strict'; + +const emptyValues = [ + ["gzip", new Uint8Array([31, 139, 8, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0])], + ["deflate", new Uint8Array([120, 156, 3, 0, 0, 0, 0, 1])], + ["deflate-raw", new Uint8Array([1, 0, 0, 255, 255])], + ["brotli", new Uint8Array([0xa1, 0x01])], +]; + +for (const [format, emptyValue] of emptyValues) { + promise_test(async t => { + const ds = new DecompressionStream(format); + const reader = ds.readable.getReader(); + const writer = ds.writable.getWriter(); + const writePromise = writer.write(emptyValue); + writer.close(); + const { value, done } = await reader.read(); + assert_true(done, "read() should set done"); + assert_equals(value, undefined, "value should be undefined"); + await writePromise; + }, `decompressing ${format} empty input should work`); +} diff --git a/test/fixtures/wpt/compression/decompression-empty-input.tentative.any.js b/test/fixtures/wpt/compression/decompression-empty-input.tentative.any.js deleted file mode 100644 index 201db8ec0b0d7c..00000000000000 --- a/test/fixtures/wpt/compression/decompression-empty-input.tentative.any.js +++ /dev/null @@ -1,43 +0,0 @@ -// META: global=window,worker,shadowrealm - -'use strict'; - -const gzipEmptyValue = new Uint8Array([31, 139, 8, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0]); -const deflateEmptyValue = new Uint8Array([120, 156, 3, 0, 0, 0, 0, 1]); -const deflateRawEmptyValue = new Uint8Array([1, 0, 0, 255, 255]); - -promise_test(async t => { - const ds = new DecompressionStream('gzip'); - const reader = ds.readable.getReader(); - const writer = ds.writable.getWriter(); - const writePromise = writer.write(gzipEmptyValue); - writer.close(); - const { value, done } = await reader.read(); - assert_true(done, "read() should set done"); - assert_equals(value, undefined, "value should be undefined"); - await writePromise; -}, 'decompressing gzip empty input should work'); - -promise_test(async t => { - const ds = new DecompressionStream('deflate'); - const reader = ds.readable.getReader(); - const writer = ds.writable.getWriter(); - const writePromise = writer.write(deflateEmptyValue); - writer.close(); - const { value, done } = await reader.read(); - assert_true(done, "read() should set done"); - assert_equals(value, undefined, "value should be undefined"); - await writePromise; -}, 'decompressing deflate empty input should work'); - -promise_test(async t => { - const ds = new DecompressionStream('deflate-raw'); - const reader = ds.readable.getReader(); - const writer = ds.writable.getWriter(); - const writePromise = writer.write(deflateRawEmptyValue); - writer.close(); - const { value, done } = await reader.read(); - assert_true(done, "read() should set done"); - assert_equals(value, undefined, "value should be undefined"); - await writePromise; -}, 'decompressing deflate-raw empty input should work'); diff --git a/test/fixtures/wpt/compression/decompression-extra-input.any.js b/test/fixtures/wpt/compression/decompression-extra-input.any.js new file mode 100644 index 00000000000000..e2c6a10a718516 --- /dev/null +++ b/test/fixtures/wpt/compression/decompression-extra-input.any.js @@ -0,0 +1,20 @@ +// META: global=window,worker,shadowrealm +// META: script=resources/decompression-input.js + +'use strict'; + +const tests = compressedBytes.map( + ([format, chunk]) => [format, new Uint8Array([...chunk, 0])] +); + +for (const [format, chunk] of tests) { + promise_test(async t => { + const ds = new DecompressionStream(format); + const reader = ds.readable.getReader(); + const writer = ds.writable.getWriter(); + writer.write(chunk).catch(() => { }); + const { done, value } = await reader.read(); + assert_array_equals(Array.from(value), expectedChunkValue, "value should match"); + await promise_rejects_js(t, TypeError, reader.read(), "Extra input should eventually throw"); + }, `decompressing ${format} input with extra pad should still give the output`); +} diff --git a/test/fixtures/wpt/compression/decompression-split-chunk.any.js b/test/fixtures/wpt/compression/decompression-split-chunk.any.js new file mode 100644 index 00000000000000..0408bfd9cd4336 --- /dev/null +++ b/test/fixtures/wpt/compression/decompression-split-chunk.any.js @@ -0,0 +1,38 @@ +// META: global=window,worker,shadowrealm +// META: script=resources/decompression-input.js + +'use strict'; + +async function decompressArrayBuffer(input, format, chunkSize) { + const ds = new DecompressionStream(format); + const reader = ds.readable.getReader(); + const writer = ds.writable.getWriter(); + for (let beginning = 0; beginning < input.length; beginning += chunkSize) { + writer.write(input.slice(beginning, beginning + chunkSize)); + } + writer.close(); + const out = []; + let totalSize = 0; + while (true) { + const { value, done } = await reader.read(); + if (done) break; + out.push(value); + totalSize += value.byteLength; + } + const concatenated = new Uint8Array(totalSize); + let offset = 0; + for (const array of out) { + concatenated.set(array, offset); + offset += array.byteLength; + } + return concatenated; +} + +for (const [format, bytes] of compressedBytes) { + for (let chunkSize = 1; chunkSize < 16; ++chunkSize) { + promise_test(async t => { + const decompressedData = await decompressArrayBuffer(bytes, format, chunkSize); + assert_array_equals(decompressedData, expectedChunkValue, "value should match"); + }, `decompressing splitted chunk into pieces of size ${chunkSize} should work in ${format}`); + } +} diff --git a/test/fixtures/wpt/compression/decompression-split-chunk.tentative.any.js b/test/fixtures/wpt/compression/decompression-split-chunk.tentative.any.js deleted file mode 100644 index eb12c2a2360cd9..00000000000000 --- a/test/fixtures/wpt/compression/decompression-split-chunk.tentative.any.js +++ /dev/null @@ -1,53 +0,0 @@ -// META: global=window,worker,shadowrealm - -'use strict'; - -const compressedBytesWithDeflate = new Uint8Array([120, 156, 75, 173, 40, 72, 77, 46, 73, 77, 81, 200, 47, 45, 41, 40, 45, 1, 0, 48, 173, 6, 36]); -const compressedBytesWithGzip = new Uint8Array([31, 139, 8, 0, 0, 0, 0, 0, 0, 3, 75, 173, 40, 72, 77, 46, 73, 77, 81, 200, 47, 45, 41, 40, 45, 1, 0, 176, 1, 57, 179, 15, 0, 0, 0]); -const compressedBytesWithDeflateRaw = new Uint8Array([ - 0x4b, 0xad, 0x28, 0x48, 0x4d, 0x2e, 0x49, 0x4d, 0x51, 0xc8, - 0x2f, 0x2d, 0x29, 0x28, 0x2d, 0x01, 0x00, -]); -const expectedChunkValue = new TextEncoder().encode('expected output'); - -async function decompressArrayBuffer(input, format, chunkSize) { - const ds = new DecompressionStream(format); - const reader = ds.readable.getReader(); - const writer = ds.writable.getWriter(); - for (let beginning = 0; beginning < input.length; beginning += chunkSize) { - writer.write(input.slice(beginning, beginning + chunkSize)); - } - writer.close(); - const out = []; - let totalSize = 0; - while (true) { - const { value, done } = await reader.read(); - if (done) break; - out.push(value); - totalSize += value.byteLength; - } - const concatenated = new Uint8Array(totalSize); - let offset = 0; - for (const array of out) { - concatenated.set(array, offset); - offset += array.byteLength; - } - return concatenated; -} - -for (let chunkSize = 1; chunkSize < 16; ++chunkSize) { - promise_test(async t => { - const decompressedData = await decompressArrayBuffer(compressedBytesWithDeflate, 'deflate', chunkSize); - assert_array_equals(decompressedData, expectedChunkValue, "value should match"); - }, `decompressing splitted chunk into pieces of size ${chunkSize} should work in deflate`); - - promise_test(async t => { - const decompressedData = await decompressArrayBuffer(compressedBytesWithGzip, 'gzip', chunkSize); - assert_array_equals(decompressedData, expectedChunkValue, "value should match"); - }, `decompressing splitted chunk into pieces of size ${chunkSize} should work in gzip`); - - promise_test(async t => { - const decompressedData = await decompressArrayBuffer(compressedBytesWithDeflateRaw, 'deflate-raw', chunkSize); - assert_array_equals(decompressedData, expectedChunkValue, "value should match"); - }, `decompressing splitted chunk into pieces of size ${chunkSize} should work in deflate-raw`); -} diff --git a/test/fixtures/wpt/compression/decompression-uint8array-output.any.js b/test/fixtures/wpt/compression/decompression-uint8array-output.any.js new file mode 100644 index 00000000000000..31e25fa2c6fb86 --- /dev/null +++ b/test/fixtures/wpt/compression/decompression-uint8array-output.any.js @@ -0,0 +1,16 @@ +// META: global=window,worker,shadowrealm +// META: script=resources/decompression-input.js + +'use strict'; + +for (const [format, chunkValue] of compressedBytes) { + promise_test(async t => { + const ds = new DecompressionStream(format); + const reader = ds.readable.getReader(); + const writer = ds.writable.getWriter(); + const writePromise = writer.write(chunkValue); + const { value } = await reader.read(); + assert_equals(value.constructor, Uint8Array, "type should match"); + await writePromise; + }, `decompressing ${format} output should give Uint8Array chunks`); +} diff --git a/test/fixtures/wpt/compression/decompression-uint8array-output.tentative.any.js b/test/fixtures/wpt/compression/decompression-uint8array-output.tentative.any.js deleted file mode 100644 index 0c45a0aaa727f1..00000000000000 --- a/test/fixtures/wpt/compression/decompression-uint8array-output.tentative.any.js +++ /dev/null @@ -1,30 +0,0 @@ -// META: global=window,worker,shadowrealm -// META: timeout=long -// -// This test isn't actually slow usually, but sometimes it takes >10 seconds on -// Firefox with service worker for no obvious reason. - -'use strict'; - -const deflateChunkValue = new Uint8Array([120, 156, 75, 173, 40, 72, 77, 46, 73, 77, 81, 200, 47, 45, 41, 40, 45, 1, 0, 48, 173, 6, 36]); -const gzipChunkValue = new Uint8Array([31, 139, 8, 0, 0, 0, 0, 0, 0, 3, 75, 173, 40, 72, 77, 46, 73, 77, 81, 200, 47, 45, 41, 40, 45, 1, 0, 176, 1, 57, 179, 15, 0, 0, 0]); - -promise_test(async t => { - const ds = new DecompressionStream('deflate'); - const reader = ds.readable.getReader(); - const writer = ds.writable.getWriter(); - const writePromise = writer.write(deflateChunkValue); - const { value } = await reader.read(); - assert_equals(value.constructor, Uint8Array, "type should match"); - await writePromise; -}, 'decompressing deflated output should give Uint8Array chunks'); - -promise_test(async t => { - const ds = new DecompressionStream('gzip'); - const reader = ds.readable.getReader(); - const writer = ds.writable.getWriter(); - const writePromise = writer.write(gzipChunkValue); - const { value } = await reader.read(); - assert_equals(value.constructor, Uint8Array, "type should match"); - await writePromise; -}, 'decompressing gzip output should give Uint8Array chunks'); diff --git a/test/fixtures/wpt/compression/decompression-with-detach.tentative.window.js b/test/fixtures/wpt/compression/decompression-with-detach.window.js similarity index 100% rename from test/fixtures/wpt/compression/decompression-with-detach.tentative.window.js rename to test/fixtures/wpt/compression/decompression-with-detach.window.js diff --git a/test/fixtures/wpt/compression/resources/decompress.js b/test/fixtures/wpt/compression/resources/decompress.js new file mode 100644 index 00000000000000..ae7d1b6e4ec2bc --- /dev/null +++ b/test/fixtures/wpt/compression/resources/decompress.js @@ -0,0 +1,31 @@ +/** + * @param {Uint8Array} chunk + * @param {string} format + */ +async function decompressData(chunk, format) { + const ds = new DecompressionStream(format); + const writer = ds.writable.getWriter(); + writer.write(chunk); + writer.close(); + const decompressedChunkList = await Array.fromAsync(ds.readable); + const mergedBlob = new Blob(decompressedChunkList); + return await mergedBlob.bytes(); +} + +/** + * @param {Uint8Array} chunk + * @param {string} format + */ +async function decompressDataOrPako(chunk, format) { + // Keep using pako for zlib to preserve existing test behavior + if (["deflate", "gzip"].includes(format)) { + return pako.inflate(chunk); + } + if (format === "deflate-raw") { + return pako.inflateRaw(chunk); + } + + // Use DecompressionStream for any newer formats, assuming implementations + // always implement decompression if they implement compression. + return decompressData(chunk, format); +} diff --git a/test/fixtures/wpt/compression/resources/decompression-input.js b/test/fixtures/wpt/compression/resources/decompression-input.js new file mode 100644 index 00000000000000..ef0acfb9ced799 --- /dev/null +++ b/test/fixtures/wpt/compression/resources/decompression-input.js @@ -0,0 +1,20 @@ +const deflateChunkValue = new Uint8Array([120, 156, 75, 173, 40, 72, 77, 46, 73, 77, 81, 200, 47, 45, 41, 40, 45, 1, 0, 48, 173, 6, 36]); +const gzipChunkValue = new Uint8Array([31, 139, 8, 0, 0, 0, 0, 0, 0, 3, 75, 173, 40, 72, 77, 46, 73, 77, 81, 200, 47, 45, 41, 40, 45, 1, 0, 176, 1, 57, 179, 15, 0, 0, 0]); +const deflateRawChunkValue = new Uint8Array([ + 0x4b, 0xad, 0x28, 0x48, 0x4d, 0x2e, 0x49, 0x4d, 0x51, 0xc8, + 0x2f, 0x2d, 0x29, 0x28, 0x2d, 0x01, 0x00, +]); +const brotliChunkValue = new Uint8Array([ + 0x21, 0x38, 0x00, 0x04, 0x65, 0x78, 0x70, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x20, 0x6F, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x03 +]); + +const compressedBytes = [ + ["deflate", deflateChunkValue], + ["gzip", gzipChunkValue], + ["deflate-raw", deflateRawChunkValue], + ["brotli", brotliChunkValue], +]; + +const expectedChunkValue = new TextEncoder().encode('expected output'); diff --git a/test/fixtures/wpt/compression/resources/formats.js b/test/fixtures/wpt/compression/resources/formats.js new file mode 100644 index 00000000000000..efbf7c08e580aa --- /dev/null +++ b/test/fixtures/wpt/compression/resources/formats.js @@ -0,0 +1,6 @@ +const formats = [ + "deflate", + "deflate-raw", + "gzip", + "brotli", +] diff --git a/test/fixtures/wpt/url/resources/setters_tests.json b/test/fixtures/wpt/url/resources/setters_tests.json index 090598db966df8..fb86654df2196b 100644 --- a/test/fixtures/wpt/url/resources/setters_tests.json +++ b/test/fixtures/wpt/url/resources/setters_tests.json @@ -2548,6 +2548,42 @@ "href": "http://example.net/#%00", "hash": "#%00" } + }, + { + "comment": "Fragment with <> on data: URI", + "href": "data:text/plain,test", + "new_value": "#<foo> <bar>", + "expected": { + "href": "data:text/plain,test#%3Cfoo%3E%20%3Cbar%3E", + "hash": "#%3Cfoo%3E%20%3Cbar%3E" + } + }, + { + "comment": "Fragment with <> on about:blank", + "href": "about:blank", + "new_value": "#<foo> <bar>", + "expected": { + "href": "about:blank#%3Cfoo%3E%20%3Cbar%3E", + "hash": "#%3Cfoo%3E%20%3Cbar%3E" + } + }, + { + "comment": "Fragment percent-encode set on data: URI; tabs and newlines are removed", + "href": "data:text/plain,test", + "new_value": "#\u0000\u0001\t\n\r\u001f !\"#$%&'()*+,-./09:;<=>?@AZ[\\]^_`az{|}~\u007f\u0080\u0081Éé", + "expected": { + "href": "data:text/plain,test#%00%01%1F%20!%22#$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_%60az{|}~%7F%C2%80%C2%81%C3%89%C3%A9", + "hash": "#%00%01%1F%20!%22#$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_%60az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" + } + }, + { + "comment": "Fragment percent-encode set on about:blank; tabs and newlines are removed", + "href": "about:blank", + "new_value": "#\u0000\u0001\t\n\r\u001f !\"#$%&'()*+,-./09:;<=>?@AZ[\\]^_`az{|}~\u007f\u0080\u0081Éé", + "expected": { + "href": "about:blank#%00%01%1F%20!%22#$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_%60az{|}~%7F%C2%80%C2%81%C3%89%C3%A9", + "hash": "#%00%01%1F%20!%22#$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_%60az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" + } } ], "href": [ diff --git a/test/fixtures/wpt/url/resources/urltestdata.json b/test/fixtures/wpt/url/resources/urltestdata.json index fd2201cfe3185d..690a48870fd0d9 100644 --- a/test/fixtures/wpt/url/resources/urltestdata.json +++ b/test/fixtures/wpt/url/resources/urltestdata.json @@ -4268,6 +4268,36 @@ "search": "", "hash": "" }, + { + "input": "https://localhost?q=🔥", + "base": null, + "href": "https://localhost/?q=%F0%9F%94%A5", + "origin": "https://localhost", + "protocol": "https:", + "username": "", + "password": "", + "host": "localhost", + "hostname": "localhost", + "port": "", + "pathname": "/", + "search": "?q=%F0%9F%94%A5", + "hash": "" + }, + { + "input": "https://localhost#🔥", + "base": null, + "href": "https://localhost/#%F0%9F%94%A5", + "origin": "https://localhost", + "protocol": "https:", + "username": "", + "password": "", + "host": "localhost", + "hostname": "localhost", + "port": "", + "pathname": "/", + "search": "", + "hash": "#%F0%9F%94%A5" + }, "# resolving a fragment against any scheme succeeds", { "input": "#", @@ -6095,6 +6125,21 @@ "search": "", "hash": "" }, + { + "input": "https://0000000000000000000000000000000000000000177.0.0.1", + "base": null, + "href": "https://127.0.0.1/", + "origin": "https://127.0.0.1", + "protocol": "https:", + "username": "", + "password": "", + "host": "127.0.0.1", + "hostname": "127.0.0.1", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, "More IPv4 parsing (via https://github.com/jsdom/whatwg-url/issues/92)", { "input": "https://0x100000000/test", @@ -10296,5 +10341,65 @@ "pathname": "/a\\b", "search": "", "hash": "" + }, + { + "comment": "Fragment with <> on data: URI", + "input": "data:text/plain,test#<foo> <bar>", + "base": null, + "href": "data:text/plain,test#%3Cfoo%3E%20%3Cbar%3E", + "protocol": "data:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "text/plain,test", + "search": "", + "hash": "#%3Cfoo%3E%20%3Cbar%3E" + }, + { + "comment": "Fragment with <> on about:blank", + "input": "about:blank#<foo> <bar>", + "base": null, + "href": "about:blank#%3Cfoo%3E%20%3Cbar%3E", + "protocol": "about:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "blank", + "search": "", + "hash": "#%3Cfoo%3E%20%3Cbar%3E" + }, + { + "comment": "Fragment percent-encode set on data: URI; tabs and newlines are removed", + "input":"data:text/plain,test#\u0000\u0001\t\n\r\u001f !\"#$%&'()*+,-./09:;<=>?@AZ[\\]^_`az{|}~\u007f\u0080\u0081Éé", + "base": null, + "href": "data:text/plain,test#%00%01%1F%20!%22#$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_%60az{|}~%7F%C2%80%C2%81%C3%89%C3%A9", + "protocol": "data:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "text/plain,test", + "search": "", + "hash": "#%00%01%1F%20!%22#$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_%60az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" + }, + { + "comment": "Fragment percent-encode set on about:blank; tabs and newlines are removed", + "input": "about:blank#\u0000\u0001\t\n\r\u001f !\"#$%&'()*+,-./09:;<=>?@AZ[\\]^_`az{|}~\u007f\u0080\u0081Éé", + "base": null, + "href": "about:blank#%00%01%1F%20!%22#$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_%60az{|}~%7F%C2%80%C2%81%C3%89%C3%A9", + "protocol": "about:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "blank", + "search": "", + "hash": "#%00%01%1F%20!%22#$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_%60az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" } ] diff --git a/test/fixtures/wpt/versions.json b/test/fixtures/wpt/versions.json index 2f02e8cde230dd..dd2e9e2b1662fa 100644 --- a/test/fixtures/wpt/versions.json +++ b/test/fixtures/wpt/versions.json @@ -4,7 +4,7 @@ "path": "common" }, "compression": { - "commit": "67880a4eb83ca9aa732eec4b35a1971ff5bf37ff", + "commit": "ae05f5cb53d3e290b91ae1e92069baa188292880", "path": "compression" }, "console": { @@ -28,7 +28,7 @@ "path": "fetch/data-urls/resources" }, "FileAPI": { - "commit": "cceaf3628da950621004d9b5d8c1d1f367073347", + "commit": "7f5130188818b6c12c636491186b459ec2bf131f", "path": "FileAPI" }, "hr-time": { @@ -72,7 +72,7 @@ "path": "streams" }, "url": { - "commit": "efb889eb4c9ca0b4e3ebd8ab308646b7483a8f54", + "commit": "fc3e651593fab938433613eb5ad0b4dbd5a4e167", "path": "url" }, "urlpattern": { @@ -96,7 +96,7 @@ "path": "web-locks" }, "WebCryptoAPI": { - "commit": "7cbe7e8ed962eac692ba4ad2e6ce3b9daafb65c0", + "commit": "6a1c545d778f115c84a1c27c25484afd442b89d8", "path": "WebCryptoAPI" }, "webidl/ecmascript-binding/es-exceptions": { diff --git a/test/module-hooks/test-module-hooks-resolve-require-resolve-builtin.js b/test/module-hooks/test-module-hooks-resolve-require-resolve-builtin.js new file mode 100644 index 00000000000000..1adf73c48a575e --- /dev/null +++ b/test/module-hooks/test-module-hooks-resolve-require-resolve-builtin.js @@ -0,0 +1,25 @@ +'use strict'; + +// This tests that require.resolve() works with builtin redirection +// via resolve hooks registered with module.registerHooks(). + +require('../common'); +const assert = require('assert'); +const { registerHooks } = require('module'); + +const hook = registerHooks({ + resolve(specifier, context, nextResolve) { + if (specifier === 'assert') { + return { + url: 'node:zlib', + shortCircuit: true, + }; + } + return nextResolve(specifier, context); + }, +}); + +const resolved = require.resolve('assert'); +assert.strictEqual(resolved, 'zlib'); + +hook.deregister(); diff --git a/test/module-hooks/test-module-hooks-resolve-require-resolve-consistency.js b/test/module-hooks/test-module-hooks-resolve-require-resolve-consistency.js new file mode 100644 index 00000000000000..7a282248a08d83 --- /dev/null +++ b/test/module-hooks/test-module-hooks-resolve-require-resolve-consistency.js @@ -0,0 +1,38 @@ +'use strict'; + +// This tests that require.resolve() and require() both go through the same +// resolve hooks registered via module.registerHooks(). + +require('../common'); +const assert = require('assert'); +const { registerHooks } = require('module'); +const fixtures = require('../common/fixtures'); +const { pathToFileURL } = require('url'); + +const redirectedPath = fixtures.path('module-hooks', 'redirected-assert.js'); + +const resolvedSpecifiers = []; +const hook = registerHooks({ + resolve(specifier, context, nextResolve) { + if (specifier === 'test-consistency-target') { + resolvedSpecifiers.push(specifier); + return { + url: pathToFileURL(redirectedPath).href, + shortCircuit: true, + }; + } + return nextResolve(specifier, context); + }, +}); + +const resolveResult = require.resolve('test-consistency-target'); +const requireResult = require('test-consistency-target'); + +assert.strictEqual(resolveResult, redirectedPath); +assert.strictEqual(requireResult.exports_for_test, 'redirected assert'); +assert.deepStrictEqual(resolvedSpecifiers, [ + 'test-consistency-target', + 'test-consistency-target', +]); + +hook.deregister(); diff --git a/test/module-hooks/test-module-hooks-resolve-require-resolve-create-require.js b/test/module-hooks/test-module-hooks-resolve-require-resolve-create-require.js new file mode 100644 index 00000000000000..27b103c9ddb57c --- /dev/null +++ b/test/module-hooks/test-module-hooks-resolve-require-resolve-create-require.js @@ -0,0 +1,31 @@ +'use strict'; + +// This tests that require.resolve() from a require function returned by +// module.createRequire() goes through resolve hooks registered via +// module.registerHooks(). + +require('../common'); +const assert = require('assert'); +const { registerHooks, createRequire } = require('module'); +const fixtures = require('../common/fixtures'); +const { pathToFileURL } = require('url'); + +const redirectedPath = fixtures.path('module-hooks', 'redirected-assert.js'); + +const hook = registerHooks({ + resolve(specifier, context, nextResolve) { + if (specifier === 'test-create-require-resolve-target') { + return { + url: pathToFileURL(redirectedPath).href, + shortCircuit: true, + }; + } + return nextResolve(specifier, context); + }, +}); + +const customRequire = createRequire(__filename); +const resolved = customRequire.resolve('test-create-require-resolve-target'); +assert.strictEqual(resolved, redirectedPath); + +hook.deregister(); diff --git a/test/module-hooks/test-module-hooks-resolve-require-resolve-fallthrough.js b/test/module-hooks/test-module-hooks-resolve-require-resolve-fallthrough.js new file mode 100644 index 00000000000000..78cd09fb3890fc --- /dev/null +++ b/test/module-hooks/test-module-hooks-resolve-require-resolve-fallthrough.js @@ -0,0 +1,19 @@ +'use strict'; + +// This tests that require.resolve() falls through to default resolution +// when resolve hooks registered via module.registerHooks() don't override. + +require('../common'); +const assert = require('assert'); +const { registerHooks } = require('module'); + +const hook = registerHooks({ + resolve(specifier, context, nextResolve) { + return nextResolve(specifier, context); + }, +}); + +const resolved = require.resolve('assert'); +assert.strictEqual(resolved, 'assert'); + +hook.deregister(); diff --git a/test/module-hooks/test-module-hooks-resolve-require-resolve-imported-cjs.js b/test/module-hooks/test-module-hooks-resolve-require-resolve-imported-cjs.js new file mode 100644 index 00000000000000..d6fff2f8a7b956 --- /dev/null +++ b/test/module-hooks/test-module-hooks-resolve-require-resolve-imported-cjs.js @@ -0,0 +1,29 @@ +'use strict'; + +// This tests that require.resolve() in an imported CJS file goes through +// resolve hooks registered via module.registerHooks(). + +const common = require('../common'); +const assert = require('assert'); +const { registerHooks } = require('module'); +const fixtures = require('../common/fixtures'); +const { pathToFileURL } = require('url'); + +const redirectedPath = fixtures.path('module-hooks', 'redirected-assert.js'); + +const hook = registerHooks({ + resolve: common.mustCall((specifier, context, nextResolve) => { + if (specifier === 'test-require-resolve-hook-target') { + return { + url: pathToFileURL(redirectedPath).href, + shortCircuit: true, + }; + } + return nextResolve(specifier, context); + }, 2), +}); + +import('../fixtures/module-hooks/require-resolve-caller.js').then(common.mustCall((ns) => { + assert.strictEqual(ns.default.resolved, redirectedPath); + hook.deregister(); +})); diff --git a/test/module-hooks/test-module-hooks-resolve-require-resolve-loaded-with-source.js b/test/module-hooks/test-module-hooks-resolve-require-resolve-loaded-with-source.js new file mode 100644 index 00000000000000..de66beda5b2e6c --- /dev/null +++ b/test/module-hooks/test-module-hooks-resolve-require-resolve-loaded-with-source.js @@ -0,0 +1,35 @@ +'use strict'; + +// This tests that require.resolve() in a CJS file loaded via the re-invented +// require (triggered when module.register() installs an async loader that +// provides source for a CJS file) still goes through resolve hooks registered +// via module.registerHooks(). + +const common = require('../common'); +const assert = require('assert'); +const { register, registerHooks } = require('module'); +const fixtures = require('../common/fixtures'); +const { pathToFileURL } = require('url'); + +const redirectedPath = fixtures.path('module-hooks', 'redirected-assert.js'); + +// Register an async loader that provides source for CJS files, which triggers +// the re-invented require path. +register(fixtures.fileURL('module-hooks', 'logger-async-hooks.mjs')); + +const hook = registerHooks({ + resolve: common.mustCall((specifier, context, nextResolve) => { + if (specifier === 'test-require-resolve-hook-target') { + return { + url: pathToFileURL(redirectedPath).href, + shortCircuit: true, + }; + } + return nextResolve(specifier, context); + }, 2), +}); + +import('../fixtures/module-hooks/require-resolve-caller.js').then(common.mustCall((ns) => { + assert.strictEqual(ns.default.resolved, redirectedPath); + hook.deregister(); +})); diff --git a/test/module-hooks/test-module-hooks-resolve-require-resolve-paths.js b/test/module-hooks/test-module-hooks-resolve-require-resolve-paths.js new file mode 100644 index 00000000000000..03eafadeb100fb --- /dev/null +++ b/test/module-hooks/test-module-hooks-resolve-require-resolve-paths.js @@ -0,0 +1,29 @@ +'use strict'; + +// This tests that require.resolve() with the paths option work transparently +// when resolve hooks are registered via module.registerHooks(). + +require('../common'); +const assert = require('assert'); +const path = require('path'); +const { registerHooks } = require('module'); +const fixtures = require('../common/fixtures'); + +const nodeModules = path.join(fixtures.path(), 'node_modules'); +const resolveCallCount = []; + +const hook = registerHooks({ + resolve(specifier, context, nextResolve) { + if (specifier === 'bar') { + resolveCallCount.push(specifier); + } + return nextResolve(specifier, context); + }, +}); + +// require.resolve with paths option should go through hooks and resolve correctly. +const resolved = require.resolve('bar', { paths: [fixtures.path()] }); +assert.strictEqual(resolved, path.join(nodeModules, 'bar.js')); +assert.deepStrictEqual(resolveCallCount, ['bar']); + +hook.deregister(); diff --git a/test/module-hooks/test-module-hooks-resolve-require-resolve-redirect.js b/test/module-hooks/test-module-hooks-resolve-require-resolve-redirect.js new file mode 100644 index 00000000000000..bbf058bae3c41c --- /dev/null +++ b/test/module-hooks/test-module-hooks-resolve-require-resolve-redirect.js @@ -0,0 +1,29 @@ +'use strict'; + +// This tests that require.resolve() invokes resolve hooks registered +// via module.registerHooks() and can redirect to a different file. + +require('../common'); +const assert = require('assert'); +const { registerHooks } = require('module'); +const fixtures = require('../common/fixtures'); +const { pathToFileURL } = require('url'); + +const redirectedPath = fixtures.path('module-hooks', 'redirected-assert.js'); + +const hook = registerHooks({ + resolve(specifier, context, nextResolve) { + if (specifier === 'test-resolve-target') { + return { + url: pathToFileURL(redirectedPath).href, + shortCircuit: true, + }; + } + return nextResolve(specifier, context); + }, +}); + +const resolved = require.resolve('test-resolve-target'); +assert.strictEqual(resolved, redirectedPath); + +hook.deregister(); diff --git a/test/parallel/test-abortsignal-drop-settled-signals.mjs b/test/parallel/test-abortsignal-drop-settled-signals.mjs index d5d704d55c5243..29a0dcf8b58638 100644 --- a/test/parallel/test-abortsignal-drop-settled-signals.mjs +++ b/test/parallel/test-abortsignal-drop-settled-signals.mjs @@ -103,7 +103,7 @@ function runWithOrphanListeners(limit, done) { const limit = 10_000; describe('when there is a long-lived signal', () => { - it('drops settled dependant signals', (t, done) => { + it('drops settled dependent signals', (t, done) => { makeSubsequentCalls(limit, (signal, dependantSignalsKey) => { setImmediate(() => { t.assert.strictEqual(signal[dependantSignalsKey].size, 0); @@ -112,7 +112,7 @@ describe('when there is a long-lived signal', () => { }); }); - it('keeps all active dependant signals', (t, done) => { + it('keeps all active dependent signals', (t, done) => { makeSubsequentCalls(limit, (signal, dependantSignalsKey) => { t.assert.strictEqual(signal[dependantSignalsKey].size, limit); @@ -132,7 +132,7 @@ it('does not prevent source signal from being GCed if it is short-lived', (t, do }); }); -it('drops settled dependant signals when signal is composite', (t, done) => { +it('drops settled dependent signals when signal is composite', (t, done) => { const controllers = Array.from({ length: 2 }, () => new AbortController()); // Using WeakRefs to avoid this test to retain information that will make the test fail diff --git a/test/parallel/test-async-local-storage-http-parser-leak.js b/test/parallel/test-async-local-storage-http-parser-leak.js new file mode 100644 index 00000000000000..2992db7c73f575 --- /dev/null +++ b/test/parallel/test-async-local-storage-http-parser-leak.js @@ -0,0 +1,29 @@ +// Flags: --expose-gc +'use strict'; + +const common = require('../common'); +const { onGC } = require('../common/gc'); +const assert = require('node:assert'); +const { AsyncLocalStorage } = require('node:async_hooks'); +const { freeParser, parsers, HTTPParser } = require('_http_common'); + +let storeGCed = false; + +const als = new AsyncLocalStorage(); + +function test() { + const store = {}; + onGC(store, { ongc: common.mustCall(() => { storeGCed = true; }) }); + let parser; + als.run(store, common.mustCall(() => { + parser = parsers.alloc(); + parser.initialize(HTTPParser.RESPONSE, {}); + })); + freeParser(parser); +} + +test(); +global.gc(); +setImmediate(common.mustCall(() => { + assert.ok(storeGCed); +})); diff --git a/test/parallel/test-bootstrap-modules.js b/test/parallel/test-bootstrap-modules.js index ae96258e95d89d..92bf3be1f612ff 100644 --- a/test/parallel/test-bootstrap-modules.js +++ b/test/parallel/test-bootstrap-modules.js @@ -105,6 +105,7 @@ expected.beforePreExec = new Set([ 'Internal Binding module_wrap', 'NativeModule internal/modules/cjs/loader', 'NativeModule diagnostics_channel', + 'Internal Binding diagnostics_channel', 'Internal Binding wasm_web_api', 'NativeModule internal/events/abort_listener', 'NativeModule internal/modules/typescript', @@ -115,6 +116,7 @@ expected.beforePreExec = new Set([ 'NativeModule internal/modules/run_main', 'NativeModule internal/net', 'NativeModule internal/dns/utils', + 'NativeModule internal/modules/esm/get_format', ]); expected.atRunTime = new Set([ @@ -125,6 +127,12 @@ const { isMainThread } = require('worker_threads'); if (isMainThread) { [ + 'Internal Binding cjs_lexer', + 'NativeModule internal/modules/esm/assert', + 'NativeModule internal/modules/esm/loader', + 'NativeModule internal/modules/esm/load', + 'NativeModule internal/modules/esm/resolve', + 'NativeModule internal/modules/esm/translators', 'NativeModule url', ].forEach(expected.beforePreExec.add.bind(expected.beforePreExec)); } else { // Worker. diff --git a/test/parallel/test-buffer-concat.js b/test/parallel/test-buffer-concat.js index 9f0eadd2f10163..b955ce1a8bf6ec 100644 --- a/test/parallel/test-buffer-concat.js +++ b/test/parallel/test-buffer-concat.js @@ -22,6 +22,7 @@ 'use strict'; const common = require('../common'); const assert = require('assert'); +const { kMaxLength } = require('buffer'); const zero = []; const one = [ Buffer.from('asdf') ]; @@ -84,8 +85,8 @@ assert.throws(() => { Buffer.concat([Buffer.from('hello')], -2); }, { code: 'ERR_OUT_OF_RANGE', - message: 'The value of "length" is out of range. It must be >= 0 && <= 9007199254740991. ' + - 'Received -2' + message: 'The value of "length" is out of range. It must be >= 0 && <= ' + + `${kMaxLength}. Received -2` }); // eslint-disable-next-line node-core/crypto-check @@ -122,3 +123,13 @@ assert.deepStrictEqual( assert.deepStrictEqual(Buffer.concat([new Uint8Array([0x41, 0x42]), new Uint8Array([0x43, 0x44])]), Buffer.from('ABCD')); + +// Spoofed length getter should not cause uninitialized memory exposure +{ + const u8_1 = new Uint8Array([1, 2, 3, 4]); + const u8_2 = new Uint8Array([5, 6, 7, 8]); + Object.defineProperty(u8_1, 'length', { get() { return 100; } }); + const buf = Buffer.concat([u8_1, u8_2]); + assert.strictEqual(buf.length, 8); + assert.deepStrictEqual(buf, Buffer.from([1, 2, 3, 4, 5, 6, 7, 8])); +} diff --git a/test/parallel/test-buffer-from.js b/test/parallel/test-buffer-from.js index 6c08b973e6ab41..b8f4a5d2a2a67b 100644 --- a/test/parallel/test-buffer-from.js +++ b/test/parallel/test-buffer-from.js @@ -140,5 +140,44 @@ assert.throws(() => { }) ); +// copyBytesFrom: length exceeds view (should clamp, not throw) +{ + const u8 = new Uint8Array([1, 2, 3, 4, 5]); + const b = Buffer.copyBytesFrom(u8, 2, 100); + assert.strictEqual(b.length, 3); + assert.deepStrictEqual([...b], [3, 4, 5]); +} + +// copyBytesFrom: length 0 returns empty buffer +{ + const u8 = new Uint8Array([1, 2, 3]); + const b = Buffer.copyBytesFrom(u8, 1, 0); + assert.strictEqual(b.length, 0); +} + +// copyBytesFrom: offset past end returns empty buffer +{ + const u8 = new Uint8Array([1, 2, 3]); + const b = Buffer.copyBytesFrom(u8, 10); + assert.strictEqual(b.length, 0); +} + +// copyBytesFrom: Float64Array with offset and length +{ + const f64 = new Float64Array([1.0, 2.0, 3.0, 4.0]); + const b = Buffer.copyBytesFrom(f64, 1, 2); + assert.strictEqual(b.length, 16); + const view = new Float64Array(b.buffer, b.byteOffset, 2); + assert.strictEqual(view[0], 2.0); + assert.strictEqual(view[1], 3.0); +} + +// copyBytesFrom: empty typed array returns empty buffer +{ + const empty = new Uint8Array(0); + const b = Buffer.copyBytesFrom(empty); + assert.strictEqual(b.length, 0); +} + // Invalid encoding is allowed Buffer.from('asd', 1); diff --git a/test/parallel/test-buffer-swap-fast.js b/test/parallel/test-buffer-swap-fast.js new file mode 100644 index 00000000000000..755edb6d598892 --- /dev/null +++ b/test/parallel/test-buffer-swap-fast.js @@ -0,0 +1,55 @@ +// Flags: --expose-internals --no-warnings --allow-natives-syntax +'use strict'; + +const common = require('../common'); +const assert = require('assert'); + +function testFastSwap16() { + const buf = Buffer.from([0x01, 0x02, 0x03, 0x04]); + const expected = Buffer.from([0x02, 0x01, 0x04, 0x03]); + const padded = Buffer.alloc(256); + buf.copy(padded); + padded.swap16(); + assert.deepStrictEqual(padded.subarray(0, 4), expected); +} + +function testFastSwap32() { + const buf = Buffer.from([0x01, 0x02, 0x03, 0x04]); + const expected = Buffer.from([0x04, 0x03, 0x02, 0x01]); + const padded = Buffer.alloc(256); + buf.copy(padded); + padded.swap32(); + assert.deepStrictEqual(padded.subarray(0, 4), expected); +} + +function testFastSwap64() { + const buf = Buffer.from([0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08]); + const expected = Buffer.from([0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01]); + const padded = Buffer.alloc(256); + buf.copy(padded); + padded.swap64(); + assert.deepStrictEqual(padded.subarray(0, 8), expected); +} + +eval('%PrepareFunctionForOptimization(Buffer.prototype.swap16)'); +testFastSwap16(); +eval('%OptimizeFunctionOnNextCall(Buffer.prototype.swap16)'); +testFastSwap16(); + +eval('%PrepareFunctionForOptimization(Buffer.prototype.swap32)'); +testFastSwap32(); +eval('%OptimizeFunctionOnNextCall(Buffer.prototype.swap32)'); +testFastSwap32(); + +eval('%PrepareFunctionForOptimization(Buffer.prototype.swap64)'); +testFastSwap64(); +eval('%OptimizeFunctionOnNextCall(Buffer.prototype.swap64)'); +testFastSwap64(); + +if (common.isDebug) { + const { internalBinding } = require('internal/test/binding'); + const { getV8FastApiCallCount } = internalBinding('debug'); + assert.strictEqual(getV8FastApiCallCount('buffer.swap16'), 1); + assert.strictEqual(getV8FastApiCallCount('buffer.swap32'), 1); + assert.strictEqual(getV8FastApiCallCount('buffer.swap64'), 1); +} diff --git a/test/parallel/test-buffer-tostring-range.js b/test/parallel/test-buffer-tostring-range.js index f4adf64c8d9129..00803bc35d7f4e 100644 --- a/test/parallel/test-buffer-tostring-range.js +++ b/test/parallel/test-buffer-tostring-range.js @@ -78,6 +78,46 @@ assert.strictEqual(rangeBuffer.toString('ascii', 0, '-1.99'), ''); assert.strictEqual(rangeBuffer.toString('ascii', 0, 1.99), 'a'); assert.strictEqual(rangeBuffer.toString('ascii', 0, true), 'a'); +// Test hex/base64/base64url partial range encoding (exercises V8 builtin path) +{ + const buf = Buffer.from([0xde, 0xad, 0xbe, 0xef, 0xca, 0xfe]); + assert.strictEqual(buf.toString('hex'), 'deadbeefcafe'); + assert.strictEqual(buf.toString('hex', 0, 3), 'deadbe'); + assert.strictEqual(buf.toString('hex', 2, 5), 'beefca'); + assert.strictEqual(buf.toString('hex', 4), 'cafe'); + assert.strictEqual(buf.toString('hex', 6), ''); + assert.strictEqual(buf.toString('hex', 0, 0), ''); +} + +{ + const buf = Buffer.from('Hello, World!'); + assert.strictEqual(buf.toString('base64'), 'SGVsbG8sIFdvcmxkIQ=='); + assert.strictEqual(buf.toString('base64', 0, 5), 'SGVsbG8='); + assert.strictEqual(buf.toString('base64', 7), 'V29ybGQh'); + assert.strictEqual(buf.toString('base64', 0, 0), ''); +} + +{ + const buf = Buffer.from('Hello, World!'); + assert.strictEqual(buf.toString('base64url'), 'SGVsbG8sIFdvcmxkIQ'); + assert.strictEqual(buf.toString('base64url', 0, 5), 'SGVsbG8'); + assert.strictEqual(buf.toString('base64url', 7), 'V29ybGQh'); + assert.strictEqual(buf.toString('base64url', 0, 0), ''); +} + +// Test with pool-allocated buffer (has non-zero byteOffset) +{ + const poolBuf = Buffer.from('test data for hex encoding'); + assert.strictEqual( + poolBuf.toString('hex'), + Buffer.from('test data for hex encoding').toString('hex') + ); + assert.strictEqual( + poolBuf.toString('hex', 5, 9), + Buffer.from('data').toString('hex') + ); +} + // Try toString() with an object as an encoding assert.strictEqual(rangeBuffer.toString({ toString: function() { return 'ascii'; diff --git a/test/parallel/test-child-process-fork-advanced-header-serialization.js b/test/parallel/test-child-process-fork-advanced-header-serialization.js index 27c15649e732d6..85116a1b5d16e0 100644 --- a/test/parallel/test-child-process-fork-advanced-header-serialization.js +++ b/test/parallel/test-child-process-fork-advanced-header-serialization.js @@ -13,11 +13,9 @@ if (process.argv[2] === 'child-buffer') { v & 0xFF, ]); const fd = process.channel?.fd; - if (fd === undefined) { - // skip test - process.exit(0); + if (fd !== undefined) { + fs.writeSync(fd, payload); } - fs.writeSync(fd, payload); return; } diff --git a/test/parallel/test-child-process-internal.js b/test/parallel/test-child-process-internal.js index c6ce0a8e04718c..345d4951742393 100644 --- a/test/parallel/test-child-process-internal.js +++ b/test/parallel/test-child-process-internal.js @@ -34,9 +34,6 @@ if (process.argv[2] === 'child') { // Send internal message process.send(internal); - - process.exit(0); - } else { const fork = require('child_process').fork; diff --git a/test/parallel/test-child-process-silent.js b/test/parallel/test-child-process-silent.js index 892c4527c9e2a2..3c0acf97555d0d 100644 --- a/test/parallel/test-child-process-silent.js +++ b/test/parallel/test-child-process-silent.js @@ -20,7 +20,7 @@ // USE OR OTHER DEALINGS IN THE SOFTWARE. 'use strict'; -require('../common'); +const common = require('../common'); const assert = require('assert'); const childProcess = require('child_process'); @@ -44,9 +44,7 @@ if (process.argv[2] === 'pipe') { // Allow child process to self terminate child.disconnect(); - child.on('exit', function() { - process.exit(0); - }); + child.on('exit', common.mustCall()); } else { // Testcase | start primary && child IPC test diff --git a/test/parallel/test-child-process-spawnsync-input.js b/test/parallel/test-child-process-spawnsync-input.js index 62ae476ae17caa..f0c3d3d78978d0 100644 --- a/test/parallel/test-child-process-spawnsync-input.js +++ b/test/parallel/test-child-process-spawnsync-input.js @@ -65,7 +65,6 @@ if (process.argv.includes('spawnchild')) { checkSpawnSyncRet(ret); break; } - process.exit(0); return; } diff --git a/test/parallel/test-child-process-stdout-flush-exit.js b/test/parallel/test-child-process-stdout-flush-exit.js index 90f746c39ef6d3..4c5de7d9a2b42d 100644 --- a/test/parallel/test-child-process-stdout-flush-exit.js +++ b/test/parallel/test-child-process-stdout-flush-exit.js @@ -36,7 +36,6 @@ if (process.argv[2] === 'child') { console.log('filler'); } console.log('goodbye'); - process.exit(0); } else { // parent process const spawn = require('child_process').spawn; diff --git a/test/parallel/test-cli-eval.js b/test/parallel/test-cli-eval.js index 8d765f10fbcbdb..5b090279621f37 100644 --- a/test/parallel/test-cli-eval.js +++ b/test/parallel/test-cli-eval.js @@ -35,7 +35,7 @@ const fixtures = require('../common/fixtures'); if (process.argv.length > 2) { console.log(process.argv.slice(2).join(' ')); - process.exit(0); + return; } // Assert that nothing is written to stdout. @@ -115,6 +115,26 @@ child.exec(...common.escapePOSIXShell`"${process.execPath}" -p "\\-42"`, common. assert.strictEqual(stderr, ''); })); +// Eval expressions that start with '-' can be passed with '='. +child.exec(...common.escapePOSIXShell`"${process.execPath}" --print --eval=-42`, common.mustSucceed((stdout, stderr) => { + assert.strictEqual(stdout, '-42\n'); + assert.strictEqual(stderr, ''); +})); + +// Edge case: negative zero should preserve its sign when printed. +child.exec(...common.escapePOSIXShell`"${process.execPath}" --print --eval=-0`, common.mustSucceed((stdout, stderr) => { + assert.strictEqual(stdout, '-0\n'); + assert.strictEqual(stderr, ''); +})); + +// Nearby-path safety: option-looking values should still be rejected with -e. +child.exec(...common.escapePOSIXShell`"${process.execPath}" -e -p`, common.mustCall((err, stdout, stderr) => { + assert.strictEqual(err.code, 9); + assert.strictEqual(stdout, ''); + assert.strictEqual(stderr.trim(), + `${process.execPath}: -e requires an argument`); +})); + // Long output should not be truncated. child.exec(...common.escapePOSIXShell`"${process.execPath}" -p "'1'.repeat(1e5)"`, common.mustSucceed((stdout, stderr) => { assert.strictEqual(stdout, `${'1'.repeat(1e5)}\n`); diff --git a/test/parallel/test-cluster-dgram-reuse.js b/test/parallel/test-cluster-dgram-reuse.js index d2790b5d99c012..b8eae5826fd349 100644 --- a/test/parallel/test-cluster-dgram-reuse.js +++ b/test/parallel/test-cluster-dgram-reuse.js @@ -1,7 +1,10 @@ 'use strict'; const common = require('../common'); +const os = require('os'); if (common.isWindows) common.skip('dgram clustering is currently not supported on windows.'); +if (common.isAIX && os.release() === '7.3') + common.skip('dgram clutering with reuse does not work if built on AIX 7.3.'); const assert = require('assert'); const cluster = require('cluster'); diff --git a/test/parallel/test-crypto-authenticated.js b/test/parallel/test-crypto-authenticated.js index e8fedf2d5d5072..9778ea548e81d7 100644 --- a/test/parallel/test-crypto-authenticated.js +++ b/test/parallel/test-crypto-authenticated.js @@ -772,3 +772,26 @@ for (const test of TEST_CASES) { decipher.final(); }, /Unsupported state or unable to authenticate data/); } + +// Refs: https://github.com/nodejs/node/issues/62342 +{ + const key = crypto.randomBytes(16); + const nonce = crypto.randomBytes(13); + + const cipher = crypto.createCipheriv('aes-128-ccm', key, nonce, { + authTagLength: 16, + }); + cipher.setAAD(Buffer.alloc(0), { plaintextLength: 0 }); + cipher.update(new DataView(new ArrayBuffer(0))); + cipher.final(); + const tag = cipher.getAuthTag(); + assert.strictEqual(tag.length, 16); + + const decipher = crypto.createDecipheriv('aes-128-ccm', key, nonce, { + authTagLength: 16, + }); + decipher.setAuthTag(tag); + decipher.setAAD(Buffer.alloc(0), { plaintextLength: 0 }); + decipher.update(new DataView(new ArrayBuffer(0))); + decipher.final(); +} diff --git a/test/parallel/test-crypto-webcrypto-aes-decrypt-tag-too-small.js b/test/parallel/test-crypto-webcrypto-aes-decrypt-tag-too-small.js index 589a2f91a17cc2..2f0612db2bc253 100644 --- a/test/parallel/test-crypto-webcrypto-aes-decrypt-tag-too-small.js +++ b/test/parallel/test-crypto-webcrypto-aes-decrypt-tag-too-small.js @@ -24,6 +24,5 @@ subtle.importKey( }, k, new Uint8Array(0)); }, { name: 'OperationError', - message: /The provided data is too small/, }) ).then(common.mustCall()); diff --git a/test/parallel/test-debugger-preserve-breaks.js b/test/parallel/test-debugger-preserve-breaks.js index 7730039aed71b8..fc9411290a9bc8 100644 --- a/test/parallel/test-debugger-preserve-breaks.js +++ b/test/parallel/test-debugger-preserve-breaks.js @@ -29,6 +29,8 @@ const script = path.relative(process.cwd(), scriptFullPath); await cli.stepCommand('c'); // hit line 3 assert.deepStrictEqual(cli.breakInfo, { filename: script, line: 3 }); await cli.command('restart'); + await cli.waitFor(/Debugger attached\./); + await cli.waitForPrompt(); await cli.waitForInitialBreak(); assert.deepStrictEqual(cli.breakInfo, { filename: script, line: 1 }); await cli.stepCommand('c'); diff --git a/test/parallel/test-debugger-restart-message.js b/test/parallel/test-debugger-restart-message.js index 292a15bd9f4d7a..5803d0ad262058 100644 --- a/test/parallel/test-debugger-restart-message.js +++ b/test/parallel/test-debugger-restart-message.js @@ -25,7 +25,11 @@ const startCLI = require('../common/debugger'); assert.strictEqual(cli.output.match(listeningRegExp).length, 1); for (let i = 0; i < RESTARTS; i++) { - await cli.stepCommand('restart'); + // For `restart`, sync on attach/prompt instead of BREAK_MESSAGE to avoid flaky races. + // https://github.com/nodejs/node/issues/61762 + await cli.command('restart'); + await cli.waitFor(/Debugger attached\./); + await cli.waitForPrompt(); assert.strictEqual(cli.output.match(listeningRegExp).length, 1); } } finally { diff --git a/test/parallel/test-debugger-run-after-quit-restart.js b/test/parallel/test-debugger-run-after-quit-restart.js index 538798758601df..397c25cceaff65 100644 --- a/test/parallel/test-debugger-run-after-quit-restart.js +++ b/test/parallel/test-debugger-run-after-quit-restart.js @@ -41,7 +41,7 @@ const path = require('path'); .then(() => { assert.match(cli.output, /Use `run` to start the app again/); }) - .then(() => cli.stepCommand('run')) + .then(() => cli.command('run')) .then(() => cli.waitForInitialBreak()) .then(() => cli.waitForPrompt()) .then(() => { @@ -57,7 +57,9 @@ const path = require('path'); { filename: script, line: 2 }, ); }) - .then(() => cli.stepCommand('restart')) + .then(() => cli.command('restart')) + .then(() => cli.waitFor(/Debugger attached\./)) + .then(() => cli.waitForPrompt()) .then(() => cli.waitForInitialBreak()) .then(() => { assert.deepStrictEqual( @@ -71,7 +73,7 @@ const path = require('path'); .then(() => { assert.match(cli.output, /Use `run` to start the app again/); }) - .then(() => cli.stepCommand('run')) + .then(() => cli.command('run')) .then(() => cli.waitForInitialBreak()) .then(() => cli.waitForPrompt()) .then(() => { diff --git a/test/parallel/test-diagnostics-channel-child-process.js b/test/parallel/test-diagnostics-channel-child-process.js new file mode 100644 index 00000000000000..1d16fd4298779e --- /dev/null +++ b/test/parallel/test-diagnostics-channel-child-process.js @@ -0,0 +1,94 @@ +'use strict'; +const common = require('../common'); +const assert = require('assert'); +const { spawn, ChildProcess } = require('child_process'); +const dc = require('diagnostics_channel'); +const path = require('path'); +const fs = require('fs'); +const tmpdir = require('../common/tmpdir'); + +const isChildProcess = (process) => process instanceof ChildProcess; + +function testDiagnosticChannel(subscribers, test, after) { + dc.tracingChannel('child_process.spawn').subscribe(subscribers); + + test(common.mustCall(() => { + dc.tracingChannel('child_process.spawn').unsubscribe(subscribers); + after?.(); + })); +} + +const testSuccessfulSpawn = common.mustCall(() => { + let cb; + + testDiagnosticChannel( + { + start: common.mustCall(({ process: childProcess, options }) => { + assert.strictEqual(isChildProcess(childProcess), true); + assert.strictEqual(options.file, process.execPath); + }), + end: common.mustCall(({ process: childProcess }) => { + assert.strictEqual(isChildProcess(childProcess), true); + }), + error: common.mustNotCall(), + }, + common.mustCall((callback) => { + cb = callback; + const child = spawn(process.execPath, ['-e', 'process.exit(0)']); + child.on('close', () => { + cb(); + }); + }), + testFailingSpawnENOENT + ); +}); + +const testFailingSpawnENOENT = common.mustCall(() => { + testDiagnosticChannel( + { + start: common.mustCall(({ process: childProcess, options }) => { + assert.strictEqual(isChildProcess(childProcess), true); + assert.strictEqual(options.file, 'does-not-exist'); + }), + end: common.mustNotCall(), + error: common.mustCall(({ process: childProcess, error }) => { + assert.strictEqual(isChildProcess(childProcess), true); + assert.strictEqual(error.code, 'ENOENT'); + }), + }, + common.mustCall((callback) => { + const child = spawn('does-not-exist'); + child.on('error', () => {}); + callback(); + }), + common.isWindows ? undefined : testFailingSpawnEACCES, + ); +}); + +const testFailingSpawnEACCES = !common.isWindows ? common.mustCall(() => { + tmpdir.refresh(); + const noExecFile = path.join(tmpdir.path, 'no-exec'); + fs.writeFileSync(noExecFile, ''); + fs.chmodSync(noExecFile, 0o644); + + testDiagnosticChannel( + { + start: common.mustCall(({ process: childProcess, options }) => { + assert.strictEqual(isChildProcess(childProcess), true); + assert.strictEqual(options.file, noExecFile); + }), + end: common.mustNotCall(), + error: common.mustCall(({ process: childProcess, error }) => { + assert.strictEqual(isChildProcess(childProcess), true); + assert.strictEqual(error.code, 'EACCES'); + }), + }, + common.mustCall((callback) => { + const child = spawn(noExecFile); + child.on('error', () => {}); + callback(); + }), + ); +}) : undefined; + +testSuccessfulSpawn(); diff --git a/test/parallel/test-diagnostics-channel-web-locks.js b/test/parallel/test-diagnostics-channel-web-locks.js new file mode 100644 index 00000000000000..dec0daef9868a0 --- /dev/null +++ b/test/parallel/test-diagnostics-channel-web-locks.js @@ -0,0 +1,167 @@ +'use strict'; + +const common = require('../common'); +const { describe, it } = require('node:test'); +const assert = require('node:assert'); +const dc = require('node:diagnostics_channel'); + +function subscribe({ start, grant, miss, end }) { + if (start) dc.subscribe('locks.request.start', start); + if (grant) dc.subscribe('locks.request.grant', grant); + if (miss) dc.subscribe('locks.request.miss', miss); + if (end) dc.subscribe('locks.request.end', end); + + return () => { + if (start) dc.unsubscribe('locks.request.start', start); + if (grant) dc.unsubscribe('locks.request.grant', grant); + if (miss) dc.unsubscribe('locks.request.miss', miss); + if (end) dc.unsubscribe('locks.request.end', end); + }; +} + +describe('Web Locks diagnostics channel', () => { + it('emits start, grant, and end on success', async () => { + let startEvent; + const unsubscribe = subscribe({ + start: common.mustCall((e) => startEvent = e), + grant: common.mustCall(), + miss: common.mustNotCall(), + end: common.mustCall(), + }); + + try { + const result = await navigator.locks.request('normal-lock', async () => 'done'); + assert.strictEqual(result, 'done'); + assert.strictEqual(startEvent.name, 'normal-lock'); + assert.strictEqual(startEvent.mode, 'exclusive'); + } finally { + unsubscribe(); + } + }); + + it('emits start, miss, and end when lock is unavailable', async () => { + await navigator.locks.request('ifavailable-true-lock', common.mustCall(async () => { + let startEvent; + const unsubscribe = subscribe({ + start: common.mustCall((e) => startEvent = e), + grant: common.mustNotCall(), + miss: common.mustCall(), + end: common.mustCall(), + }); + + try { + const result = await navigator.locks.request( + 'ifavailable-true-lock', + { ifAvailable: true }, + (lock) => lock, + ); + + assert.strictEqual(result, null); + assert.strictEqual(startEvent.name, 'ifavailable-true-lock'); + assert.strictEqual(startEvent.mode, 'exclusive'); + } finally { + unsubscribe(); + } + })); + }); + + it('queued lock request emits start, grant, and end without miss', async () => { + // Outer fires first, inner is queued — so events arrive in insertion order + let outerStartEvent, innerStartEvent; + const unsubscribe = subscribe({ + start: common.mustCall((e) => (outerStartEvent ? innerStartEvent = e : outerStartEvent = e), 2), + grant: common.mustCall(2), + miss: common.mustNotCall(), + end: common.mustCall(2), + }); + + try { + let innerDone; + + const outerResult = await navigator.locks.request('ifavailable-false-lock', common.mustCall(async () => { + innerDone = navigator.locks.request( + 'ifavailable-false-lock', + { ifAvailable: false }, + common.mustCall(async (lock) => { + assert.ok(lock); + return 'inner-done'; + }), + ); + await new Promise((resolve) => setTimeout(resolve, 20)); + return 'outer-done'; + })); + + assert.strictEqual(outerResult, 'outer-done'); + assert.strictEqual(await innerDone, 'inner-done'); + + assert.strictEqual(outerStartEvent.name, 'ifavailable-false-lock'); + assert.strictEqual(outerStartEvent.mode, 'exclusive'); + assert.strictEqual(innerStartEvent.name, 'ifavailable-false-lock'); + assert.strictEqual(innerStartEvent.mode, 'exclusive'); + } finally { + unsubscribe(); + } + }); + + it('reports callback error in end event', async () => { + const expectedError = new Error('Callback error'); + let endEvent; + const unsubscribe = subscribe({ + start: common.mustCall(), + grant: common.mustCall(), + miss: common.mustNotCall(), + end: common.mustCall((e) => endEvent = e), + }); + + try { + await assert.rejects( + navigator.locks.request('error-lock', async () => { throw expectedError; }), + (error) => error === expectedError, + ); + + assert.strictEqual(endEvent.name, 'error-lock'); + assert.strictEqual(endEvent.mode, 'exclusive'); + assert.strictEqual(endEvent.error, expectedError); + } finally { + unsubscribe(); + } + }); + + it('stolen lock ends original request with AbortError', async () => { + let stolenEndEvent, stealerEndEvent; + const unsubscribe = subscribe({ + start: common.mustCall(2), + grant: common.mustCall(2), + miss: common.mustNotCall(), + end: common.mustCall((e) => (e.steal ? stealerEndEvent = e : stolenEndEvent = e), 2), + }); + + try { + let resolveGranted; + const granted = new Promise((r) => { resolveGranted = r; }); + + const originalRejected = assert.rejects( + navigator.locks.request('steal-lock', async () => { + resolveGranted(); + await new Promise((r) => setTimeout(r, 200)); + }), + { name: 'AbortError' }, + ); + + await granted; + await navigator.locks.request('steal-lock', { steal: true }, async () => {}); + await originalRejected; + + assert.strictEqual(stolenEndEvent.name, 'steal-lock'); + assert.strictEqual(stolenEndEvent.mode, 'exclusive'); + assert.strictEqual(stolenEndEvent.steal, false); + assert.strictEqual(stealerEndEvent.name, 'steal-lock'); + assert.strictEqual(stealerEndEvent.mode, 'exclusive'); + assert.strictEqual(stealerEndEvent.steal, true); + assert.strictEqual(stolenEndEvent.error.name, 'AbortError'); + assert.strictEqual(stealerEndEvent.error, undefined); + } finally { + unsubscribe(); + } + }); +}); diff --git a/test/parallel/test-fastutf8stream-partial-write-utf8.js b/test/parallel/test-fastutf8stream-partial-write-utf8.js new file mode 100644 index 00000000000000..3a56fcf71a7b44 --- /dev/null +++ b/test/parallel/test-fastutf8stream-partial-write-utf8.js @@ -0,0 +1,322 @@ +'use strict'; + +// Tests for UTF-8 character preservation when partial writes split multi-byte characters. +// See: https://github.com/nodejs/node/issues/61744 + +const common = require('../common'); +const tmpdir = require('../common/tmpdir'); +const assert = require('node:assert'); +const { + openSync, + write, + writeSync, +} = require('node:fs'); +const { Utf8Stream } = require('node:fs'); +const { join } = require('node:path'); +const { isMainThread } = require('node:worker_threads'); + +tmpdir.refresh(); +if (isMainThread) { + process.umask(0o000); +} + +let fileCounter = 0; + +function getTempFile() { + return join(tmpdir.path, `fastutf8stream-partial-${process.pid}-${Date.now()}-${fileCounter++}.log`); +} + +runTests(false); +runTests(true); + +function runTests(sync) { + // Test 1: Partial write splitting a 3-byte UTF-8 character (CJK) + // "abc中def" where "中" is 3 bytes (E4 B8 AD) + // Simulate partial write of 4 bytes: "abc" (3 bytes) + first byte of "中" + // The remaining buffer should be "中def" (not "def") + { + const dest = getTempFile(); + const fd = openSync(dest, 'w'); + + let firstWrite = true; + const writtenChunks = []; + const fsOverride = {}; + + if (sync) { + fsOverride.writeSync = common.mustCall((...args) => { + const data = args[1]; + writtenChunks.push(typeof data === 'string' ? data : data.toString()); + if (firstWrite) { + firstWrite = false; + // Simulate partial write: only 4 bytes written out of 9 + // This splits the 3-byte "中" character + return 4; + } + return writeSync(...args); + }, 2); + } else { + fsOverride.write = common.mustCall((...args) => { + const data = args[1]; + writtenChunks.push(typeof data === 'string' ? data : data.toString()); + const callback = args[args.length - 1]; + if (firstWrite) { + firstWrite = false; + // Simulate partial write: only 4 bytes written out of 9 + process.nextTick(callback, null, 4); + return; + } + return write(...args); + }, 2); + } + + const stream = new Utf8Stream({ + fd, + sync, + minLength: 0, + fs: fsOverride, + }); + + stream.on('ready', common.mustCall(() => { + stream.write('abc中def'); + stream.end(); + + stream.on('finish', common.mustCall(() => { + // Verify the second chunk contains the preserved CJK character + assert.strictEqual(writtenChunks.length, 2); + assert.strictEqual(writtenChunks[0], 'abc中def'); // First attempt + assert.strictEqual(writtenChunks[1], '中def'); // Retry with preserved char + })); + })); + } + + // Test 2: Partial write splitting a 4-byte UTF-8 character (emoji) + // "hello🌍world" where "🌍" is 4 bytes (F0 9F 8C 8D) + // Simulate partial write of 7 bytes: "hello" (5 bytes) + first 2 bytes of "🌍" + // The remaining buffer should be "🌍world" (not a lone surrogate + "world") + { + const dest = getTempFile(); + const fd = openSync(dest, 'w'); + + let firstWrite = true; + const writtenChunks = []; + const fsOverride = {}; + + if (sync) { + fsOverride.writeSync = common.mustCall((...args) => { + const data = args[1]; + writtenChunks.push(typeof data === 'string' ? data : data.toString()); + if (firstWrite) { + firstWrite = false; + // Simulate partial write: only 7 bytes written + return 7; + } + return writeSync(...args); + }, 2); + } else { + fsOverride.write = common.mustCall((...args) => { + const data = args[1]; + writtenChunks.push(typeof data === 'string' ? data : data.toString()); + const callback = args[args.length - 1]; + if (firstWrite) { + firstWrite = false; + process.nextTick(callback, null, 7); + return; + } + return write(...args); + }, 2); + } + + const stream = new Utf8Stream({ + fd, + sync, + minLength: 0, + fs: fsOverride, + }); + + stream.on('ready', common.mustCall(() => { + stream.write('hello🌍world'); + stream.end(); + + stream.on('finish', common.mustCall(() => { + assert.strictEqual(writtenChunks.length, 2); + assert.strictEqual(writtenChunks[0], 'hello🌍world'); // First attempt + assert.strictEqual(writtenChunks[1], '🌍world'); // Retry with preserved emoji + + // Verify no lone surrogates in the retry chunk + const retryChunk = writtenChunks[1]; + for (let i = 0; i < retryChunk.length; i++) { + const code = retryChunk.charCodeAt(i); + if (code >= 0xD800 && code <= 0xDBFF) { + // High surrogate - next must be low surrogate + const next = retryChunk.charCodeAt(i + 1); + assert.ok(next >= 0xDC00 && next <= 0xDFFF, + `Found lone high surrogate at position ${i}`); + i++; // Skip the low surrogate we just verified + } else if (code >= 0xDC00 && code <= 0xDFFF) { + // Low surrogate without preceding high surrogate + assert.fail(`Found lone low surrogate at position ${i}: 0x${code.toString(16)}`); + } + } + })); + })); + } + + // Test 3: Partial write at exactly 0 bytes (edge case) + { + const dest = getTempFile(); + const fd = openSync(dest, 'w'); + + let firstWrite = true; + const writtenChunks = []; + const fsOverride = {}; + + if (sync) { + fsOverride.writeSync = common.mustCall((...args) => { + const data = args[1]; + writtenChunks.push(typeof data === 'string' ? data : data.toString()); + if (firstWrite) { + firstWrite = false; + return 0; // No bytes written + } + return writeSync(...args); + }, 2); + } else { + fsOverride.write = common.mustCall((...args) => { + const data = args[1]; + writtenChunks.push(typeof data === 'string' ? data : data.toString()); + const callback = args[args.length - 1]; + if (firstWrite) { + firstWrite = false; + process.nextTick(callback, null, 0); + return; + } + return write(...args); + }, 2); + } + + const stream = new Utf8Stream({ + fd, + sync, + minLength: 0, + fs: fsOverride, + }); + + stream.on('ready', common.mustCall(() => { + stream.write('中文'); + stream.end(); + + stream.on('finish', common.mustCall(() => { + assert.strictEqual(writtenChunks.length, 2); + assert.strictEqual(writtenChunks[0], '中文'); + assert.strictEqual(writtenChunks[1], '中文'); // Entire string retried + })); + })); + } + + // Test 4: Partial write splitting between characters (not mid-character) + // This should work the same as before - no character preservation needed + { + const dest = getTempFile(); + const fd = openSync(dest, 'w'); + + let firstWrite = true; + const writtenChunks = []; + const fsOverride = {}; + + if (sync) { + fsOverride.writeSync = common.mustCall((...args) => { + const data = args[1]; + writtenChunks.push(typeof data === 'string' ? data : data.toString()); + if (firstWrite) { + firstWrite = false; + // Write exactly 3 bytes ("abc"), which is a clean character boundary + return 3; + } + return writeSync(...args); + }, 2); + } else { + fsOverride.write = common.mustCall((...args) => { + const data = args[1]; + writtenChunks.push(typeof data === 'string' ? data : data.toString()); + const callback = args[args.length - 1]; + if (firstWrite) { + firstWrite = false; + process.nextTick(callback, null, 3); + return; + } + return write(...args); + }, 2); + } + + const stream = new Utf8Stream({ + fd, + sync, + minLength: 0, + fs: fsOverride, + }); + + stream.on('ready', common.mustCall(() => { + stream.write('abc中def'); + stream.end(); + + stream.on('finish', common.mustCall(() => { + assert.strictEqual(writtenChunks.length, 2); + assert.strictEqual(writtenChunks[0], 'abc中def'); + assert.strictEqual(writtenChunks[1], '中def'); // Remaining after 3 bytes + })); + })); + } + + // Test 5: Single multi-byte character with partial write of 1 byte + { + const dest = getTempFile(); + const fd = openSync(dest, 'w'); + + let firstWrite = true; + const writtenChunks = []; + const fsOverride = {}; + + if (sync) { + fsOverride.writeSync = common.mustCall((...args) => { + const data = args[1]; + writtenChunks.push(typeof data === 'string' ? data : data.toString()); + if (firstWrite) { + firstWrite = false; + // Write only 1 byte of a 3-byte character + return 1; + } + return writeSync(...args); + }, 2); + } else { + fsOverride.write = common.mustCall((...args) => { + const data = args[1]; + writtenChunks.push(typeof data === 'string' ? data : data.toString()); + const callback = args[args.length - 1]; + if (firstWrite) { + firstWrite = false; + process.nextTick(callback, null, 1); + return; + } + return write(...args); + }, 2); + } + + const stream = new Utf8Stream({ + fd, + sync, + minLength: 0, + fs: fsOverride, + }); + + stream.on('ready', common.mustCall(() => { + stream.write('中'); + stream.end(); + + stream.on('finish', common.mustCall(() => { + assert.strictEqual(writtenChunks.length, 2); + assert.strictEqual(writtenChunks[0], '中'); + assert.strictEqual(writtenChunks[1], '中'); // Full character retried + })); + })); + } +} diff --git a/test/parallel/test-fs-cp-sync-unicode-dest.mjs b/test/parallel/test-fs-cp-sync-unicode-dest.mjs new file mode 100644 index 00000000000000..0638b98180c5da --- /dev/null +++ b/test/parallel/test-fs-cp-sync-unicode-dest.mjs @@ -0,0 +1,23 @@ +// Regression test for https://github.com/nodejs/node/issues/61878 +// fs.cpSync should copy files when destination path has UTF characters. +import '../common/index.mjs'; +import { cpSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from 'node:fs'; +import { join } from 'node:path'; +import assert from 'node:assert'; +import tmpdir from '../common/tmpdir.js'; + +tmpdir.refresh(); + +const src = join(tmpdir.path, 'src'); +mkdirSync(join(src, 'subdir'), { recursive: true }); +writeFileSync(join(src, 'file1.txt'), 'Hello World'); +writeFileSync(join(src, 'subdir', 'nested.txt'), 'Nested File'); + +const dest = join(tmpdir.path, 'Eyjafjallajökull-Pranckevičius'); +cpSync(src, dest, { recursive: true, force: true }); + +const destFiles = readdirSync(dest); +assert.ok(destFiles.includes('file1.txt')); +assert.strictEqual(readFileSync(join(dest, 'file1.txt'), 'utf8'), 'Hello World'); +assert.ok(destFiles.includes('subdir')); +assert.strictEqual(readFileSync(join(dest, 'subdir', 'nested.txt'), 'utf8'), 'Nested File'); diff --git a/test/parallel/test-fs-promises.js b/test/parallel/test-fs-promises.js index 9b0b5d98a603f3..10af085ae832ee 100644 --- a/test/parallel/test-fs-promises.js +++ b/test/parallel/test-fs-promises.js @@ -152,6 +152,12 @@ async function executeOnHandle(dest, func) { })); } + // File stats throwIfNoEntry: false + { + const stats = await stat('meow.js', { throwIfNoEntry: false }); + assert.strictEqual(stats, undefined); + } + // File system stats { const statFs = await statfs(dest); diff --git a/test/parallel/test-fs-stat.js b/test/parallel/test-fs-stat.js index cc7be77e53dadc..93bf6573a109a7 100644 --- a/test/parallel/test-fs-stat.js +++ b/test/parallel/test-fs-stat.js @@ -224,5 +224,9 @@ fs.lstat(__filename, undefined, common.mustCall()); { // Test that the throwIfNoEntry option works and returns undefined - assert.ok(!(fs.statSync('./wont_exists', { throwIfNoEntry: false }))); + const opts = { throwIfNoEntry: false }; + assert.ok(!(fs.statSync('./wont_exists', opts))); + fs.stat('./wont_exists', opts, common.mustSucceed((err, stats) => { + assert.strictEqual(stats, undefined); + })); } diff --git a/test/parallel/test-fs-utimes.js b/test/parallel/test-fs-utimes.js index e6ae75d4e33a5f..41e5faea46be66 100644 --- a/test/parallel/test-fs-utimes.js +++ b/test/parallel/test-fs-utimes.js @@ -63,7 +63,7 @@ function expect_ok(syscall, resource, err, atime, mtime, statSync) { const mtime_diff = check_mtime(resource, mtime, statSync); assert( // Check up to single-second precision. - // Sub-second precision is OS and fs dependant. + // Sub-second precision is OS and fs dependent. !err && (mtime_diff < 2) || err && err.code === 'ENOSYS', `FAILED: expect_ok ${util.inspect(arguments)} check_mtime: ${mtime_diff}` diff --git a/test/parallel/test-http-client-path-toctou.js b/test/parallel/test-http-client-path-toctou.js new file mode 100644 index 00000000000000..2975ba363d2614 --- /dev/null +++ b/test/parallel/test-http-client-path-toctou.js @@ -0,0 +1,68 @@ +'use strict'; +require('../common'); +const assert = require('assert'); +const http = require('http'); + +// Test that mutating req.path after construction to include +// invalid characters (e.g. CRLF) throws ERR_UNESCAPED_CHARACTERS. +// Regression test for a TOCTOU vulnerability where path was only +// validated at construction time but could be mutated before +// _implicitHeader() flushed it to the socket. + +// Use a createConnection that returns nothing to avoid actual connection. +const req = new http.ClientRequest({ + host: '127.0.0.1', + port: 1, + path: '/valid', + method: 'GET', + createConnection: () => {}, +}); + +// Attempting to set path with CRLF must throw +assert.throws( + () => { req.path = '/evil\r\nX-Injected: true\r\n\r\n'; }, + { + code: 'ERR_UNESCAPED_CHARACTERS', + name: 'TypeError', + message: 'Request path contains unescaped characters', + } +); + +// Path must be unchanged after failed mutation +assert.strictEqual(req.path, '/valid'); + +// Attempting to set path with lone CR must throw +assert.throws( + () => { req.path = '/evil\rpath'; }, + { + code: 'ERR_UNESCAPED_CHARACTERS', + name: 'TypeError', + } +); + +// Attempting to set path with lone LF must throw +assert.throws( + () => { req.path = '/evil\npath'; }, + { + code: 'ERR_UNESCAPED_CHARACTERS', + name: 'TypeError', + } +); + +// Attempting to set path with null byte must throw +assert.throws( + () => { req.path = '/evil\0path'; }, + { + code: 'ERR_UNESCAPED_CHARACTERS', + name: 'TypeError', + } +); + +// Valid path mutation should succeed +req.path = '/also-valid'; +assert.strictEqual(req.path, '/also-valid'); + +req.path = '/path?query=1&other=2'; +assert.strictEqual(req.path, '/path?query=1&other=2'); + +req.destroy(); diff --git a/test/parallel/test-http-early-hints-invalid-argument.js b/test/parallel/test-http-early-hints-invalid-argument.js index f776bcafa40ed3..edf613614bc721 100644 --- a/test/parallel/test-http-early-hints-invalid-argument.js +++ b/test/parallel/test-http-early-hints-invalid-argument.js @@ -47,3 +47,44 @@ const testResBody = 'response content\n'; req.on('information', common.mustNotCall()); })); } + +{ + const server = http.createServer(common.mustCall((req, res) => { + debug('Server sending early hints with CRLF injection...'); + + assert.throws(() => { + res.writeEarlyHints({ + 'link': '</styles.css>; rel=preload; as=style', + 'X-Custom': 'valid\r\nSet-Cookie: session=evil', + }); + }, (err) => err.code === 'ERR_INVALID_CHAR'); + + assert.throws(() => { + res.writeEarlyHints({ + 'link': '</styles.css>; rel=preload; as=style', + 'X-Custom\r\nSet-Cookie: session=evil': 'value', + }); + }, (err) => err.code === 'ERR_INVALID_HTTP_TOKEN'); + + assert.throws(() => { + res.writeEarlyHints({ + link: '</styles.css\r\nSet-Cookie: session=evil>; rel=preload; as=style', + }); + }, (err) => err.code === 'ERR_INVALID_ARG_VALUE'); + + debug('Server sending full response...'); + res.end(testResBody); + server.close(); + })); + + server.listen(0, common.mustCall(() => { + const req = http.request({ + port: server.address().port, path: '/' + }); + + req.end(); + debug('Client sending request...'); + + req.on('information', common.mustNotCall()); + })); +} diff --git a/test/parallel/test-http-expect-continue-reuse-race.js b/test/parallel/test-http-expect-continue-reuse-race.js new file mode 100644 index 00000000000000..d56319d0e6bab1 --- /dev/null +++ b/test/parallel/test-http-expect-continue-reuse-race.js @@ -0,0 +1,117 @@ +'use strict'; + +// Regression test for a keep-alive socket reuse race condition. +// +// The race is between responseOnEnd() and requestOnFinish(), both of which +// can call responseKeepAlive(). The window is: req.end() has been called, +// the socket write has completed (writableFinished true), but the write +// callback that emits the 'finish' event has not fired yet. +// +// With plain HTTP the window is normally too narrow to hit. This test +// widens it by delaying every client-socket write *callback* by a few +// milliseconds (the actual I/O is not delayed, so writableFinished becomes +// true while the 'finish'-emitting callback is still pending). +// +// With Expect: 100-continue, the server responds quickly while the client +// delays req.end() just slightly (setTimeout 0), creating the perfect +// timing for the response to arrive in that window. +// +// On unpatched Node, the double responseKeepAlive() call corrupts the +// socket by stripping a subsequent request's listeners and emitting a +// spurious 'free' event, causing requests to hang / time out. + +const common = require('../common'); +const assert = require('assert'); +const http = require('http'); + +const REQUEST_COUNT = 100; +const agent = new http.Agent({ keepAlive: true, maxSockets: 1 }); + +// Delay every write *callback* on the client socket so that +// socket.writableLength drops to 0 (writableFinished becomes true) before +// the callback that ultimately emits the 'finish' event fires. With +// HTTPS the TLS layer provides this gap naturally; for plain HTTP we +// need to create it artificially. +const patchedSockets = new WeakSet(); +function patchSocket(socket) { + if (patchedSockets.has(socket)) return; + patchedSockets.add(socket); + const delay = 5; + const origWrite = socket.write; + socket.write = function(chunk, encoding, cb) { + if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + if (typeof cb === 'function') { + const orig = cb; + cb = (...args) => setTimeout(() => orig(...args), delay); + } + return origWrite.call(this, chunk, encoding, cb); + }; +} + +const server = http.createServer(common.mustCall((req, res) => { + req.on('error', common.mustNotCall()); + res.writeHead(200); + res.end(); +}, REQUEST_COUNT)); + +server.listen(0, common.mustCall(() => { + const { port } = server.address(); + + async function run() { + try { + for (let i = 0; i < REQUEST_COUNT; i++) { + await sendRequest(port); + } + } finally { + agent.destroy(); + server.close(); + } + } + + run().then(common.mustCall()); +})); + +function sendRequest(port) { + let timeout; + const promise = new Promise((resolve, reject) => { + function done(err) { + clearTimeout(timeout); + if (err) + reject(err); + else + resolve(); + } + + const req = http.request({ + port, + host: '127.0.0.1', + method: 'POST', + agent, + headers: { + 'Content-Length': '0', + 'Expect': '100-continue', + }, + }, common.mustCall((res) => { + assert.strictEqual(res.statusCode, 200); + res.resume(); + res.once('end', done); + res.once('error', done); + })); + + req.on('socket', patchSocket); + + timeout = setTimeout(() => { + const err = new Error('request timed out'); + req.destroy(err); + done(err); + }, common.platformTimeout(5000)); + + req.once('error', done); + + setTimeout(() => req.end(Buffer.alloc(0)), 0); + }); + return promise.finally(() => clearTimeout(timeout)); +} diff --git a/test/parallel/test-http-outgoing-message-capture-rejection.js b/test/parallel/test-http-outgoing-message-capture-rejection.js index a89ef8baf70605..31cc047ea2e319 100644 --- a/test/parallel/test-http-outgoing-message-capture-rejection.js +++ b/test/parallel/test-http-outgoing-message-capture-rejection.js @@ -46,7 +46,7 @@ events.captureRejections = true; { let _res; let shouldEnd = false; - // Not using mustCall here, because it is OS-dependant. + // Not using mustCall here, because it is OS-dependent. const server = createServer((req, res) => { // So that we cleanly stop _res = res; diff --git a/test/parallel/test-http-parser-freed-during-execute.js b/test/parallel/test-http-parser-freed-during-execute.js new file mode 100644 index 00000000000000..c7605b75d95aa5 --- /dev/null +++ b/test/parallel/test-http-parser-freed-during-execute.js @@ -0,0 +1,23 @@ +'use strict'; + +const common = require('../common'); +const { createServer } = require('http'); +const { connect } = require('net'); + +// Regression test: ensure llhttp_execute() is aborted when freeParser() is +// called synchronously during parsing of pipelined requests. +const server = createServer(common.mustCall((req, res) => { + req.socket.emit('close'); + res.end(); +}, 1)); + +server.unref(); + +server.listen(0, common.mustCall(() => { + // Two pipelined requests in one write, processed by a single llhttp_execute(). + const client = connect(server.address().port); + client.end( + 'GET / HTTP/1.1\r\nHost: localhost\r\nConnection: keep-alive\r\n\r\n' + + 'GET / HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n', + ); +})); diff --git a/test/parallel/test-http-request-lookup-error-catchable.js b/test/parallel/test-http-request-lookup-error-catchable.js index 905f841c77c096..242f6ad45a553f 100644 --- a/test/parallel/test-http-request-lookup-error-catchable.js +++ b/test/parallel/test-http-request-lookup-error-catchable.js @@ -13,8 +13,8 @@ const net = require('net'); // 2. The lookup returns an IP that triggers a synchronous error (e.g., blockList) // 3. The error is emitted before http's error handler is set up (via nextTick) // -// The fix defers socket.destroy() calls in internalConnect to the next tick, -// giving http.request() time to set up its error handlers. +// The fix attaches socketErrorListener synchronously in onSocket so that +// socket errors are forwarded to the request before onSocketNT runs. const blockList = new net.BlockList(); blockList.addAddress(common.localhostIPv4); diff --git a/test/parallel/test-http2-https-fallback-http-server-options.js b/test/parallel/test-http2-https-fallback-http-server-options.js index 8143f56d491ccc..29bb24d1cfd242 100644 --- a/test/parallel/test-http2-https-fallback-http-server-options.js +++ b/test/parallel/test-http2-https-fallback-http-server-options.js @@ -20,6 +20,10 @@ const ca = fixtures.readKey('fake-startcom-root-cert.pem'); function onRequest(request, response) { const { socket: { alpnProtocol } } = request.httpVersion === '2.0' ? request.stream.session : request; + // Verify that http1Options are applied when allowHTTP1 is true + if (request.httpVersion === '1.1') { + assert.strictEqual(request.socket.server.keepAliveTimeout, 10000); + } response.status(200); response.end(JSON.stringify({ alpnProtocol, @@ -46,8 +50,11 @@ class MyServerResponse extends http.ServerResponse { { cert, key, allowHTTP1: true, - Http1IncomingMessage: MyIncomingMessage, - Http1ServerResponse: MyServerResponse + http1Options: { + IncomingMessage: MyIncomingMessage, + ServerResponse: MyServerResponse, + keepAliveTimeout: 10000, + }, }, common.mustCall(onRequest, 1) ); diff --git a/test/parallel/test-http2-single-headers-validation-disabled.js b/test/parallel/test-http2-single-headers-validation-disabled.js new file mode 100644 index 00000000000000..4ea6da83673040 --- /dev/null +++ b/test/parallel/test-http2-single-headers-validation-disabled.js @@ -0,0 +1,53 @@ +'use strict'; + +const common = require('../common'); +if (!common.hasCrypto) + common.skip('missing crypto'); +const assert = require('assert'); +const http2 = require('http2'); + +const server = http2.createServer({ + strictSingleValueFields: false +}); + +server.on('stream', common.mustCall((stream, _headers, _flags, rawHeaders) => { + assert.deepStrictEqual(rawHeaders.slice(8), [ + 'user-agent', 'abc', + 'user-agent', 'xyz', + 'referer', 'qwe', + 'referer', 'asd', + ]); + + stream.respond({ + ':status': 200, + 'expires': 'Thu, 01 Jan 1970 00:00:00 GMT', + 'EXPIRES': 'Thu, 01 Jan 1970 00:00:00 GMT', + 'content-type': ['a', 'b'], + }); + + stream.end(); +})); + +server.listen(0, common.mustCall(() => { + const client = http2.connect(`http://localhost:${server.address().port}`, { + strictSingleValueFields: false + }); + + const res = client.request({ + 'user-agent': 'abc', + 'USER-AGENT': 'xyz', + 'referer': ['qwe', 'asd'], + }); + + res.on('response', common.mustCall((_headers, _flags, rawHeaders) => { + assert.deepStrictEqual(rawHeaders.slice(2, 10), [ + 'expires', 'Thu, 01 Jan 1970 00:00:00 GMT', + 'expires', 'Thu, 01 Jan 1970 00:00:00 GMT', + 'content-type', 'a', + 'content-type', 'b', + ]); + + server.close(); + client.close(); + })); +})); diff --git a/test/parallel/test-http2-single-headers.js b/test/parallel/test-http2-single-headers-validation.js similarity index 100% rename from test/parallel/test-http2-single-headers.js rename to test/parallel/test-http2-single-headers-validation.js diff --git a/test/parallel/test-http2-util-assert-valid-pseudoheader.js b/test/parallel/test-http2-util-assert-valid-pseudoheader.js index bd995f0338f106..29c41e7a5a83e9 100644 --- a/test/parallel/test-http2-util-assert-valid-pseudoheader.js +++ b/test/parallel/test-http2-util-assert-valid-pseudoheader.js @@ -4,20 +4,16 @@ require('../common'); const assert = require('assert'); -// Tests the assertValidPseudoHeader function that is used within the -// buildNgHeaderString function. The assert function is not exported so we -// have to test it through buildNgHeaderString - -const { buildNgHeaderString } = require('internal/http2/util'); +const { assertValidPseudoHeader } = require('internal/http2/util'); // These should not throw -buildNgHeaderString({ ':status': 'a' }); -buildNgHeaderString({ ':path': 'a' }); -buildNgHeaderString({ ':authority': 'a' }); -buildNgHeaderString({ ':scheme': 'a' }); -buildNgHeaderString({ ':method': 'a' }); +assertValidPseudoHeader(':status'); +assertValidPseudoHeader(':path'); +assertValidPseudoHeader(':authority'); +assertValidPseudoHeader(':scheme'); +assertValidPseudoHeader(':method'); -assert.throws(() => buildNgHeaderString({ ':foo': 'a' }), { +assert.throws(() => assertValidPseudoHeader(':foo'), { code: 'ERR_HTTP2_INVALID_PSEUDOHEADER', name: 'TypeError', message: '":foo" is an invalid pseudoheader or is used incorrectly' diff --git a/test/parallel/test-http2-util-headers-list.js b/test/parallel/test-http2-util-headers-list.js index 0d1ac1d1b8c694..09135e865d4f98 100644 --- a/test/parallel/test-http2-util-headers-list.js +++ b/test/parallel/test-http2-util-headers-list.js @@ -9,6 +9,7 @@ if (!common.hasCrypto) common.skip('missing crypto'); const assert = require('assert'); const { + assertValidPseudoHeader, getAuthority, buildNgHeaderString, toHeaderObject @@ -106,7 +107,7 @@ const { }; assert.deepStrictEqual( - buildNgHeaderString(headers), + buildNgHeaderString(headers, assertValidPseudoHeader, true), [ [ ':path', 'abc\0', ':status', '200\0', 'abc', '1\0', 'xyz', '1\0', 'xyz', '2\0', 'xyz', '3\0', 'xyz', '4\0', 'bar', '1\0', '' ].join('\0'), 8 ] @@ -123,7 +124,7 @@ const { }; assert.deepStrictEqual( - buildNgHeaderString(headers), + buildNgHeaderString(headers, assertValidPseudoHeader, true), [ [ ':status', '200\0', ':path', 'abc\0', 'abc', '1\0', 'xyz', '1\0', 'xyz', '2\0', 'xyz', '3\0', 'xyz', '4\0', '' ].join('\0'), 7 ] ); @@ -140,7 +141,7 @@ const { }; assert.deepStrictEqual( - buildNgHeaderString(headers), + buildNgHeaderString(headers, assertValidPseudoHeader, true), [ [ ':status', '200\0', ':path', 'abc\0', 'abc', '1\0', 'xyz', '1\0', 'xyz', '2\0', 'xyz', '3\0', 'xyz', '4\0', '' ].join('\0'), 7 ] ); @@ -156,7 +157,7 @@ const { headers[':path'] = 'abc'; assert.deepStrictEqual( - buildNgHeaderString(headers), + buildNgHeaderString(headers, assertValidPseudoHeader, true), [ [ ':status', '200\0', ':path', 'abc\0', 'xyz', '1\0', 'xyz', '2\0', 'xyz', '3\0', 'xyz', '4\0', '' ].join('\0'), 6 ] ); @@ -169,7 +170,7 @@ const { 'set-cookie': ['foo=bar'] }; assert.deepStrictEqual( - buildNgHeaderString(headers), + buildNgHeaderString(headers, assertValidPseudoHeader, true), [ [ 'set-cookie', 'foo=bar\0', '' ].join('\0'), 1 ] ); } @@ -181,7 +182,7 @@ const { ':statuS': 204, }; - assert.throws(() => buildNgHeaderString(headers), { + assert.throws(() => buildNgHeaderString(headers, assertValidPseudoHeader, true), { code: 'ERR_HTTP2_HEADER_SINGLE_VALUE', name: 'TypeError', message: 'Header field ":status" must only have a single value' @@ -199,13 +200,14 @@ const { }; assert.deepStrictEqual( - buildNgHeaderString(headers), + buildNgHeaderString(headers, assertValidPseudoHeader, true), [ ':status\x00200\x00\x00:path\x00abc\x00\x00abc\x001\x00\x00' + 'xyz\x001\x00\x01xyz\x002\x00\x01xyz\x003\x00\x01xyz\x004\x00\x01', 7 ] ); } -// The following are not allowed to have multiple values +// The following are not allowed to have multiple values by default, unless +// strictSingleValueFields is set to false. [ HTTP2_HEADER_STATUS, HTTP2_HEADER_METHOD, @@ -248,10 +250,20 @@ const { HTTP2_HEADER_X_CONTENT_TYPE_OPTIONS, ].forEach((name) => { const msg = `Header field "${name}" must only have a single value`; - assert.throws(() => buildNgHeaderString({ [name]: [1, 2, 3] }), { + assert.throws(() => buildNgHeaderString( + { [name]: [1, 2, 3] }, + assertValidPseudoHeader, + true + ), { code: 'ERR_HTTP2_HEADER_SINGLE_VALUE', message: msg }); + + assert(!(buildNgHeaderString( + { [name]: [1, 2, 3] }, + assertValidPseudoHeader, + false + ) instanceof Error), name); }); [ @@ -285,7 +297,11 @@ const { HTTP2_HEADER_WWW_AUTHENTICATE, HTTP2_HEADER_X_FRAME_OPTIONS, ].forEach((name) => { - assert(!(buildNgHeaderString({ [name]: [1, 2, 3] }) instanceof Error), name); + assert(!(buildNgHeaderString( + { [name]: [1, 2, 3] }, + assertValidPseudoHeader, + true + ) instanceof Error), name); }); [ @@ -304,7 +320,11 @@ const { 'Proxy-Connection', 'Keep-Alive', ].forEach((name) => { - assert.throws(() => buildNgHeaderString({ [name]: 'abc' }), { + assert.throws(() => buildNgHeaderString( + { [name]: 'abc' }, + assertValidPseudoHeader, + true + ), { code: 'ERR_HTTP2_INVALID_CONNECTION_HEADERS', name: 'TypeError', message: 'HTTP/1 Connection specific headers are forbidden: ' + @@ -312,7 +332,11 @@ const { }); }); -assert.throws(() => buildNgHeaderString({ [HTTP2_HEADER_TE]: ['abc'] }), { +assert.throws(() => buildNgHeaderString( + { [HTTP2_HEADER_TE]: ['abc'] }, + assertValidPseudoHeader, + true +), { code: 'ERR_HTTP2_INVALID_CONNECTION_HEADERS', name: 'TypeError', message: 'HTTP/1 Connection specific headers are forbidden: ' + @@ -320,7 +344,11 @@ assert.throws(() => buildNgHeaderString({ [HTTP2_HEADER_TE]: ['abc'] }), { }); assert.throws( - () => buildNgHeaderString({ [HTTP2_HEADER_TE]: ['abc', 'trailers'] }), { + () => buildNgHeaderString( + { [HTTP2_HEADER_TE]: ['abc', 'trailers'] }, + assertValidPseudoHeader, + true + ), { code: 'ERR_HTTP2_INVALID_CONNECTION_HEADERS', name: 'TypeError', message: 'HTTP/1 Connection specific headers are forbidden: ' + @@ -328,13 +356,25 @@ assert.throws( }); // These should not throw -buildNgHeaderString({ te: 'trailers' }); -buildNgHeaderString({ te: ['trailers'] }); +buildNgHeaderString( + { te: 'trailers' }, + assertValidPseudoHeader, + true +); +buildNgHeaderString( + { te: ['trailers'] }, + assertValidPseudoHeader, + true +); // HTTP/2 encourages use of Host instead of :authority when converting // from HTTP/1 to HTTP/2, so we no longer disallow it. // Refs: https://github.com/nodejs/node/issues/29858 -buildNgHeaderString({ [HTTP2_HEADER_HOST]: 'abc' }); +buildNgHeaderString( + { [HTTP2_HEADER_HOST]: 'abc' }, + assertValidPseudoHeader, + true +); // If both are present, the latter has priority assert.strictEqual(getAuthority({ diff --git a/test/parallel/test-https-expect-continue-reuse-race.js b/test/parallel/test-https-expect-continue-reuse-race.js new file mode 100644 index 00000000000000..cc754477b788c3 --- /dev/null +++ b/test/parallel/test-https-expect-continue-reuse-race.js @@ -0,0 +1,97 @@ +'use strict'; + +// Regression test for a keep-alive socket reuse race condition. +// +// The race is between responseOnEnd() and requestOnFinish(), both of which +// can call responseKeepAlive(). The window is: req.end() has been called, +// the socket write has completed (writableFinished true), but the write +// callback that emits the 'finish' event has not fired yet. +// +// HTTPS widens this window because the TLS layer introduces async +// indirection between the actual write completion and the JS callback. +// +// With Expect: 100-continue, the server responds quickly while the client +// delays req.end() just slightly (setTimeout 0), creating the perfect +// timing for the response to arrive in that window. +// +// On unpatched Node, the double responseKeepAlive() call corrupts the +// socket by stripping a subsequent request's listeners and emitting a +// spurious 'free' event, causing requests to hang / time out. + +const common = require('../common'); + +if (!common.hasCrypto) + common.skip('missing crypto'); + +const assert = require('assert'); +const https = require('https'); +const fixtures = require('../common/fixtures'); + +const REQUEST_COUNT = 100; +const agent = new https.Agent({ keepAlive: true, maxSockets: 1 }); + +const key = fixtures.readKey('agent1-key.pem'); +const cert = fixtures.readKey('agent1-cert.pem'); +const server = https.createServer({ key, cert }, common.mustCall((req, res) => { + req.on('error', common.mustNotCall()); + res.writeHead(200); + res.end(); +}, REQUEST_COUNT)); + +server.listen(0, common.mustCall(() => { + const { port } = server.address(); + + async function run() { + try { + for (let i = 0; i < REQUEST_COUNT; i++) { + await sendRequest(port); + } + } finally { + agent.destroy(); + server.close(); + } + } + + run().then(common.mustCall()); +})); + +function sendRequest(port) { + let timeout; + const promise = new Promise((resolve, reject) => { + function done(err) { + clearTimeout(timeout); + if (err) + reject(err); + else + resolve(); + } + + const req = https.request({ + port, + host: '127.0.0.1', + rejectUnauthorized: false, + method: 'POST', + agent, + headers: { + 'Content-Length': '0', + 'Expect': '100-continue', + }, + }, common.mustCall((res) => { + assert.strictEqual(res.statusCode, 200); + res.resume(); + res.once('end', done); + res.once('error', done); + })); + + timeout = setTimeout(() => { + const err = new Error('request timed out'); + req.destroy(err); + done(err); + }, common.platformTimeout(5000)); + + req.once('error', done); + + setTimeout(() => req.end(Buffer.alloc(0)), 0); + }); + return promise.finally(() => clearTimeout(timeout)); +} diff --git a/test/parallel/test-inspector-port-zero-cluster.js b/test/parallel/test-inspector-port-zero-cluster.js index 5ee7bcf7417345..8b17dbee73500b 100644 --- a/test/parallel/test-inspector-port-zero-cluster.js +++ b/test/parallel/test-inspector-port-zero-cluster.js @@ -35,7 +35,7 @@ function serialFork() { if (cluster.isPrimary) { Promise.all([serialFork(), serialFork(), serialFork()]) - .then(common.mustCall((ports) => { + .then((ports) => { ports.splice(0, 0, process.debugPort); // 4 = [primary, worker1, worker2, worker3].length() assert.strictEqual(ports.length, 4); @@ -44,12 +44,8 @@ if (cluster.isPrimary) { assert.strictEqual(ports[0] === 65535 ? 1024 : ports[0] + 1, ports[1]); assert.strictEqual(ports[1] === 65535 ? 1024 : ports[1] + 1, ports[2]); assert.strictEqual(ports[2] === 65535 ? 1024 : ports[2] + 1, ports[3]); - })) - .catch( - (err) => { - console.error(err); - process.exit(1); - }); + }) + .then(common.mustCall()); } else { - process.exit(0); + process.disconnect(); } diff --git a/test/parallel/test-inspector-worker-target.js b/test/parallel/test-inspector-worker-target.js index e5d2a0c2039712..6bfe8bf9304d5c 100644 --- a/test/parallel/test-inspector-worker-target.js +++ b/test/parallel/test-inspector-worker-target.js @@ -3,6 +3,8 @@ const common = require('../common'); const fixtures = require('../common/fixtures'); +const assert = require('assert'); + common.skipIfInspectorDisabled(); const { NodeInstance } = require('../common/inspector-helper.js'); @@ -21,6 +23,15 @@ async function setupInspector(session, sessionId = undefined) { }); } +async function assertTargetAttachedState(session, targetId, attached) { + const { targetInfos } = await session.send({ method: 'Target.getTargets' }); + const targetInfo = targetInfos.find((target) => { + return target.targetId === targetId; + }); + assert.notStrictEqual(targetInfo, undefined); + assert.strictEqual(targetInfo.attached, attached); +} + async function test(isSetAutoAttachBeforeExecution) { const child = new NodeInstance(['--inspect-brk=0', '--experimental-worker-inspection'], '', @@ -38,7 +49,10 @@ async function test(isSetAutoAttachBeforeExecution) { await session.send({ method: 'Debugger.resume' }); const sessionId = '1'; - await session.waitForNotification('Target.targetCreated'); + const targetCreated = await session.waitForNotification('Target.targetCreated'); + const targetId = targetCreated.params.targetInfo.targetId; + + await assertTargetAttachedState(session, targetId, isSetAutoAttachBeforeExecution); if (!isSetAutoAttachBeforeExecution) { await session.send({ method: 'Target.setAutoAttach', params: { autoAttach: true, waitForDebuggerOnStart: true } }); @@ -47,6 +61,7 @@ async function test(isSetAutoAttachBeforeExecution) { return notification.method === 'Target.attachedToTarget' && notification.params.sessionId === sessionId; }); + await assertTargetAttachedState(session, targetId, true); await setupInspector(session, sessionId); await session.waitForNotification('Debugger.paused'); await session.send({ method: 'Debugger.resume', sessionId }); diff --git a/test/parallel/test-net-listen-twice.js b/test/parallel/test-net-listen-twice.js index 5a2399ea217005..281868da5a9eb7 100644 --- a/test/parallel/test-net-listen-twice.js +++ b/test/parallel/test-net-listen-twice.js @@ -19,7 +19,7 @@ if (cluster.isPrimary) { server.listen(); } catch (e) { console.error(e); - process.exit(0); + return; } let i = 0; process.on('internalMessage', (msg) => { diff --git a/test/parallel/test-node-output-console.mjs b/test/parallel/test-node-output-console.mjs index 8fabed9db60ab7..e9b001db336cf5 100644 --- a/test/parallel/test-node-output-console.mjs +++ b/test/parallel/test-node-output-console.mjs @@ -7,37 +7,20 @@ const skipForceColors = process.config.variables.icu_gyp_path !== 'tools/icu/icu-generic.gyp' || process.config.variables.node_shared_openssl; -function replaceStackTrace(str) { - return snapshot.replaceStackTrace(str, '$1at *$7\n'); -} - describe('console output', { concurrency: !process.env.TEST_PARALLEL }, () => { - function normalize(str) { - return str.replaceAll(/\d+/g, '*'); - } const tests = [ { name: 'console/2100bytes.js' }, { name: 'console/console_low_stack_space.js' }, { name: 'console/console.js' }, { name: 'console/hello_world.js' }, - { - name: 'console/stack_overflow.js', - transform: snapshot - .transform( - snapshot.basicTransform, - snapshot.transformProjectRoot(), - normalize - ) - }, + { name: 'console/stack_overflow.js' }, !skipForceColors ? { name: 'console/force_colors.js', env: { FORCE_COLOR: 1 } } : null, ].filter(Boolean); - const defaultTransform = snapshot - .transform(snapshot.basicTransform, replaceStackTrace); - for (const { name, transform, env } of tests) { + for (const { name, env } of tests) { it(name, async () => { await snapshot.spawnAndAssert( fixtures.path(name), - transform ?? defaultTransform, + snapshot.defaultTransform, { env: { ...env, ...process.env } }, ); }); diff --git a/test/parallel/test-node-output-errors.mjs b/test/parallel/test-node-output-errors.mjs index 731a21243481f4..3764ce52107379 100644 --- a/test/parallel/test-node-output-errors.mjs +++ b/test/parallel/test-node-output-errors.mjs @@ -7,41 +7,7 @@ import { describe, it } from 'node:test'; const skipForceColors = (common.isWindows && (Number(os.release().split('.')[0]) !== 10 || Number(os.release().split('.')[2]) < 14393)); // See https://github.com/nodejs/node/pull/33132 - -function replaceStackTrace(str) { - return snapshot.replaceStackTrace(str, '$1at *$7\n'); -} - -function replaceForceColorsStackTrace(str) { - // eslint-disable-next-line no-control-regex - return str.replaceAll(/(\[90m\W+)at .*node:.*/g, '$1at *'); -} - describe('errors output', { concurrency: !process.env.TEST_PARALLEL }, () => { - function normalizeNoNumbers(str) { - return str.replaceAll(/\d+:\d+/g, '*:*').replaceAll(/:\d+/g, ':*').replaceAll('*fixtures*message*', '*'); - } - const defaultTransform = snapshot.transform( - snapshot.basicTransform, - snapshot.transformProjectRoot(), - ); - const errTransform = snapshot.transform( - snapshot.basicTransform, - snapshot.transformProjectRoot(), - normalizeNoNumbers, - ); - const promiseTransform = snapshot.transform( - snapshot.basicTransform, - snapshot.transformProjectRoot(), - replaceStackTrace, - normalizeNoNumbers, - ); - const forceColorsTransform = snapshot.transform( - snapshot.basicTransform, - snapshot.transformProjectRoot(), - replaceForceColorsStackTrace, - ); - const tests = [ { name: 'errors/async_error_eval_cjs.js' }, { name: 'errors/async_error_eval_esm.js' }, @@ -51,33 +17,36 @@ describe('errors output', { concurrency: !process.env.TEST_PARALLEL }, () => { { name: 'errors/core_line_numbers.js' }, { name: 'errors/async_error_sync_esm.mjs' }, { name: 'errors/test-no-extra-info-on-fatal-exception.js' }, - { name: 'errors/error_aggregateTwoErrors.js', transform: errTransform }, - { name: 'errors/error_exit.js', transform: errTransform }, - { name: 'errors/error_with_nul.js', transform: errTransform }, - { name: 'errors/events_unhandled_error_common_trace.js', transform: errTransform }, - { name: 'errors/events_unhandled_error_nexttick.js', transform: errTransform }, - { name: 'errors/events_unhandled_error_sameline.js', transform: errTransform }, - { name: 'errors/events_unhandled_error_subclass.js', transform: errTransform }, - { name: 'errors/if-error-has-good-stack.js', transform: errTransform }, - { name: 'errors/throw_custom_error.js', transform: errTransform }, - { name: 'errors/throw_error_with_getter_throw.js', transform: errTransform }, - { name: 'errors/throw_in_eval_anonymous.js', transform: errTransform }, - { name: 'errors/throw_in_eval_named.js', transform: errTransform }, - { name: 'errors/throw_in_line_with_tabs.js', transform: errTransform }, - { name: 'errors/throw_non_error.js', transform: errTransform }, - { name: 'errors/throw_null.js', transform: errTransform }, - { name: 'errors/throw_undefined.js', transform: errTransform }, - { name: 'errors/timeout_throw.js', transform: errTransform }, - { name: 'errors/undefined_reference_in_new_context.js', transform: errTransform }, - { name: 'errors/promise_always_throw_unhandled.js', transform: promiseTransform }, - { name: 'errors/promise_unhandled_warn_with_error.js', transform: promiseTransform }, - { name: 'errors/unhandled_promise_trace_warnings.js', transform: promiseTransform }, - { skip: skipForceColors, name: 'errors/force_colors.js', - transform: forceColorsTransform, env: { FORCE_COLOR: 1 } }, + { name: 'errors/error_aggregateTwoErrors.js' }, + { name: 'errors/error_exit.js' }, + { name: 'errors/error_with_nul.js' }, + { name: 'errors/events_unhandled_error_common_trace.js' }, + { name: 'errors/events_unhandled_error_nexttick.js' }, + { name: 'errors/events_unhandled_error_sameline.js' }, + { name: 'errors/events_unhandled_error_subclass.js' }, + { name: 'errors/if-error-has-good-stack.js' }, + { name: 'errors/throw_custom_error.js' }, + { name: 'errors/throw_error_with_getter_throw.js' }, + { name: 'errors/throw_in_eval_anonymous.js' }, + { name: 'errors/throw_in_eval_named.js' }, + { name: 'errors/throw_in_line_with_tabs.js' }, + { name: 'errors/throw_non_error.js' }, + { name: 'errors/throw_null.js' }, + { name: 'errors/throw_undefined.js' }, + { name: 'errors/timeout_throw.js' }, + { name: 'errors/undefined_reference_in_new_context.js' }, + { name: 'errors/promise_always_throw_unhandled.js' }, + { name: 'errors/promise_unhandled_warn_with_error.js' }, + { name: 'errors/unhandled_promise_trace_warnings.js' }, + { skip: skipForceColors, name: 'errors/force_colors.js', env: { FORCE_COLOR: 1 } }, ]; - for (const { name, transform = defaultTransform, env, skip = false } of tests) { + for (const { name, env, skip = false } of tests) { it(name, { skip }, async () => { - await snapshot.spawnAndAssert(fixtures.path(name), transform, { env: { ...env, ...process.env } }); + await snapshot.spawnAndAssert( + fixtures.path(name), + snapshot.defaultTransform, + { env: { ...env, ...process.env } } + ); }); } }); diff --git a/test/parallel/test-node-output-eval.mjs b/test/parallel/test-node-output-eval.mjs index 0dc97ac9f32e42..e064b47073f6aa 100644 --- a/test/parallel/test-node-output-eval.mjs +++ b/test/parallel/test-node-output-eval.mjs @@ -7,22 +7,6 @@ import * as snapshot from '../common/assertSnapshot.js'; import { describe, it } from 'node:test'; describe('eval output', { concurrency: true }, () => { - function normalize(str) { - return str - .replaceAll(/\d+:\d+/g, '*:*'); - } - - const defaultTransform = snapshot.transform( - normalize, - snapshot.basicTransform, - snapshot.transformProjectRoot(), - removeStackTraces, - ); - - function removeStackTraces(output) { - return output.replaceAll(/^ *at .+$/gm, ''); - } - const tests = [ { name: 'eval/eval_messages.js' }, { name: 'eval/stdin_messages.js' }, @@ -32,7 +16,7 @@ describe('eval output', { concurrency: true }, () => { for (const { name } of tests) { it(name, async () => { - await snapshot.spawnAndAssert(fixtures.path(name), defaultTransform); + await snapshot.spawnAndAssert(fixtures.path(name), snapshot.defaultTransform); }); } }); diff --git a/test/parallel/test-node-output-sourcemaps.mjs b/test/parallel/test-node-output-sourcemaps.mjs index 2341d66e628746..840ca7cf59a47c 100644 --- a/test/parallel/test-node-output-sourcemaps.mjs +++ b/test/parallel/test-node-output-sourcemaps.mjs @@ -4,13 +4,6 @@ import * as snapshot from '../common/assertSnapshot.js'; import { describe, it } from 'node:test'; describe('sourcemaps output', { concurrency: !process.env.TEST_PARALLEL }, () => { - const defaultTransform = snapshot - .transform( - snapshot.basicTransform, - snapshot.transformProjectRoot(), - snapshot.replaceInternalStackTrace, - ); - const tests = [ { name: 'source-map/output/source_map_assert_source_line.ts' }, { name: 'source-map/output/source_map_disabled_by_api.js' }, @@ -35,7 +28,7 @@ describe('sourcemaps output', { concurrency: !process.env.TEST_PARALLEL }, () => for (const { name } of tests) { const skip = name.endsWith('.ts') && !process.config.variables.node_use_amaro; it(name, { skip }, async () => { - await snapshot.spawnAndAssert(fixtures.path(name), defaultTransform); + await snapshot.spawnAndAssert(fixtures.path(name), snapshot.defaultTransform); }); } }); diff --git a/test/parallel/test-node-output-v8-warning.mjs b/test/parallel/test-node-output-v8-warning.mjs index f342ef1d4f8db9..43f6709dc248c7 100644 --- a/test/parallel/test-node-output-v8-warning.mjs +++ b/test/parallel/test-node-output-v8-warning.mjs @@ -4,16 +4,12 @@ import * as snapshot from '../common/assertSnapshot.js'; import { describe, it } from 'node:test'; describe('v8 output', { concurrency: !process.env.TEST_PARALLEL }, () => { - function normalize(str) { - return str.replaceAll(/:\d+/g, ':*'); - } - const defaultTransform = snapshot.transform(snapshot.basicTransform, snapshot.transformProjectRoot(), normalize); const tests = [ { name: 'v8/v8_warning.js' }, ]; for (const { name } of tests) { it(name, async () => { - await snapshot.spawnAndAssert(fixtures.path(name), defaultTransform); + await snapshot.spawnAndAssert(fixtures.path(name), snapshot.defaultTransform); }); } }); diff --git a/test/parallel/test-node-output-vm.mjs b/test/parallel/test-node-output-vm.mjs index 9a285d9ca0f006..f87e66a8bc5df3 100644 --- a/test/parallel/test-node-output-vm.mjs +++ b/test/parallel/test-node-output-vm.mjs @@ -4,13 +4,6 @@ import * as snapshot from '../common/assertSnapshot.js'; import { describe, it } from 'node:test'; describe('vm output', { concurrency: !process.env.TEST_PARALLEL }, () => { - function normalize(str) { - return str.replaceAll(/node:vm:\d+:\d+/g, 'node:vm:*'); - } - - const defaultTransform = snapshot - .transform(snapshot.basicTransform, snapshot.transformProjectRoot(), normalize); - const tests = [ { name: 'vm/vm_caught_custom_runtime_error.js' }, { name: 'vm/vm_display_runtime_error.js' }, @@ -20,7 +13,7 @@ describe('vm output', { concurrency: !process.env.TEST_PARALLEL }, () => { ]; for (const { name } of tests) { it(name, async () => { - await snapshot.spawnAndAssert(fixtures.path(name), defaultTransform); + await snapshot.spawnAndAssert(fixtures.path(name), snapshot.defaultTransform); }); } }); diff --git a/test/parallel/test-permission-allow-child-process-cli.js b/test/parallel/test-permission-allow-child-process-cli.js index d82332ba3d5084..640a043d9f5d25 100644 --- a/test/parallel/test-permission-allow-child-process-cli.js +++ b/test/parallel/test-permission-allow-child-process-cli.js @@ -24,7 +24,7 @@ if (process.argv[2] === 'child') { code: 'ERR_ACCESS_DENIED', permission: 'FileSystemWrite', })); - process.exit(0); + return; } // Guarantee the initial state diff --git a/test/parallel/test-permission-allow-worker-cli.js b/test/parallel/test-permission-allow-worker-cli.js index 8ccbc5d4960885..228d1ea5607fc1 100644 --- a/test/parallel/test-permission-allow-worker-cli.js +++ b/test/parallel/test-permission-allow-worker-cli.js @@ -6,7 +6,7 @@ const assert = require('assert'); const { isMainThread, Worker } = require('worker_threads'); if (!isMainThread) { - process.exit(0); + return; } // Guarantee the initial state diff --git a/test/parallel/test-permission-child-process-cli.js b/test/parallel/test-permission-child-process-cli.js index abd4271257b6fa..3330bcddd96f9d 100644 --- a/test/parallel/test-permission-child-process-cli.js +++ b/test/parallel/test-permission-child-process-cli.js @@ -12,7 +12,7 @@ const assert = require('assert'); const childProcess = require('child_process'); if (process.argv[2] === 'child') { - process.exit(0); + return; } // Guarantee the initial state diff --git a/test/parallel/test-process-env.js b/test/parallel/test-process-env.js index f20be5a194dbf9..a27e5eb5ffd347 100644 --- a/test/parallel/test-process-env.js +++ b/test/parallel/test-process-env.js @@ -31,7 +31,7 @@ if (process.argv[2] === 'you-are-the-child') { assert.strictEqual(process.env.hasOwnProperty, 'asdf'); const has = Object.hasOwn(process.env, 'hasOwnProperty'); assert.strictEqual(has, true); - process.exit(0); + return; } { diff --git a/test/parallel/test-readline-async-iterators.js b/test/parallel/test-readline-async-iterators.js index 32fa32a1284a09..a88c550c07efae 100644 --- a/test/parallel/test-readline-async-iterators.js +++ b/test/parallel/test-readline-async-iterators.js @@ -17,6 +17,7 @@ const testContents = [ 'line 1', 'line 1\nline 2 南越国是前203年至前111年存在于岭南地区的一个国家\nline 3\ntrailing', 'line 1\nline 2\nline 3 ends with newline\n', + Array(1e4).fill(0).map((_, i) => i).join('\n'), // More that 2 * highWaterMark ]; async function testSimple() { @@ -43,6 +44,29 @@ async function testSimple() { } } +// Same as testSimple, but with Readable.from() instead of fs.createReadStream +async function testReadableFrom() { + for (const fileContent of testContents) { + const readable = Readable.from([fileContent]); + const rli = readline.createInterface({ + input: readable, + crlfDelay: Infinity + }); + + const iteratedLines = []; + for await (const k of rli) { + iteratedLines.push(k); + } + + const expectedLines = fileContent.split('\n'); + if (expectedLines[expectedLines.length - 1] === '') { + expectedLines.pop(); + } + assert.deepStrictEqual(iteratedLines, expectedLines); + assert.strictEqual(iteratedLines.join(''), fileContent.replace(/\n/g, '')); + } +} + async function testMutual() { for (const fileContent of testContents) { fs.writeFileSync(filename, fileContent); @@ -115,6 +139,7 @@ async function testSlowStreamForLeaks() { } testSimple() + .then(testReadableFrom) .then(testMutual) .then(testSlowStreamForLeaks) .then(common.mustCall()); diff --git a/test/parallel/test-repl.js b/test/parallel/test-repl.js index a8f483e90135cb..714064d552ab4b 100644 --- a/test/parallel/test-repl.js +++ b/test/parallel/test-repl.js @@ -608,10 +608,10 @@ const errorTests = [ // access to internal modules without the --expose-internals flag. { // Shrink the stack trace to avoid having to update this test whenever the - // implementation of require() changes. It's set to 4 because somehow setting it + // implementation of require() changes. It's set to 5 because somehow setting it // to a lower value breaks the error formatting and the message becomes // "Uncaught [Error...", which is probably a bug(?). - send: 'Error.stackTraceLimit = 4; require("internal/repl")', + send: 'Error.stackTraceLimit = 5; require("internal/repl")', expect: [ /^Uncaught Error: Cannot find module 'internal\/repl'/, /^Require stack:/, @@ -619,6 +619,7 @@ const errorTests = [ /^ {4}at .*/, // Some stack frame that we have to capture otherwise error message is buggy. /^ {4}at .*/, // Some stack frame that we have to capture otherwise error message is buggy. /^ {4}at .*/, // Some stack frame that we have to capture otherwise error message is buggy. + /^ {4}at .*/, // Some stack frame that we have to capture otherwise error message is buggy. " code: 'MODULE_NOT_FOUND',", " requireStack: [ '<repl>' ]", '}', diff --git a/test/parallel/test-runner-aftereach-runtime-skip.js b/test/parallel/test-runner-aftereach-runtime-skip.js new file mode 100644 index 00000000000000..7a6ba2ea9cbddf --- /dev/null +++ b/test/parallel/test-runner-aftereach-runtime-skip.js @@ -0,0 +1,36 @@ +'use strict'; + +const common = require('../common'); +const assert = require('node:assert'); +const { beforeEach, afterEach, test } = require('node:test'); + +let beforeEachTotal = 0; +let afterEachRuntimeSkip = 0; +let afterEachTotal = 0; + +beforeEach(common.mustCall(() => { + beforeEachTotal++; +}, 2)); + +afterEach(common.mustCall((t) => { + afterEachTotal++; + if (t.name === 'runtime skip') { + afterEachRuntimeSkip++; + } +}, 2)); + +test('normal test', (t) => { + t.assert.ok(true); +}); + +test('runtime skip', (t) => { + t.skip('skip after setup'); +}); + +test('static skip', { skip: true }, common.mustNotCall()); + +process.on('exit', () => { + assert.strictEqual(beforeEachTotal, 2); + assert.strictEqual(afterEachRuntimeSkip, 1); + assert.strictEqual(afterEachTotal, 2); +}); diff --git a/test/parallel/test-runner-exit-code.js b/test/parallel/test-runner-exit-code.js index 792c5f1717bd60..c25becee3f708f 100644 --- a/test/parallel/test-runner-exit-code.js +++ b/test/parallel/test-runner-exit-code.js @@ -6,7 +6,7 @@ const { spawnSync, spawn } = require('child_process'); const { once } = require('events'); const { finished } = require('stream/promises'); -async function runAndKill(file) { +async function runAndKill(file, expectedTestName) { if (common.isWindows) { common.printSkipMessage(`signals are not supported in windows, skipping ${file}`); return; @@ -21,6 +21,9 @@ async function runAndKill(file) { const [code, signal] = await once(child, 'exit'); await finished(child.stdout); assert(stdout.startsWith('TAP version 13\n')); + // Verify interrupted test message + assert(stdout.includes(`Interrupted while running: ${expectedTestName}`), + `Expected output to contain interrupted test name`); assert.strictEqual(signal, null); assert.strictEqual(code, 1); } @@ -67,6 +70,18 @@ if (process.argv[2] === 'child') { assert.strictEqual(child.status, 1); assert.strictEqual(child.signal, null); - runAndKill(fixtures.path('test-runner', 'never_ending_sync.js')).then(common.mustCall()); - runAndKill(fixtures.path('test-runner', 'never_ending_async.js')).then(common.mustCall()); + // An error thrown inside describe() should cause a non-zero exit code. + child = spawnSync(process.execPath, [ + '--test', + fixtures.path('test-runner', 'describe_error.js'), + ]); + assert.strictEqual(child.status, 1); + assert.strictEqual(child.signal, null); + + // With process isolation (default), the test name shown is the file path + // because the parent runner only knows about file-level tests + const neverEndingSync = fixtures.path('test-runner', 'never_ending_sync.js'); + const neverEndingAsync = fixtures.path('test-runner', 'never_ending_async.js'); + runAndKill(neverEndingSync, neverEndingSync).then(common.mustCall()); + runAndKill(neverEndingAsync, neverEndingAsync).then(common.mustCall()); } diff --git a/test/parallel/test-runner-expect-error-but-pass.js b/test/parallel/test-runner-expect-error-but-pass.js index b6900724fa8dbe..e300b705432e89 100644 --- a/test/parallel/test-runner-expect-error-but-pass.js +++ b/test/parallel/test-runner-expect-error-but-pass.js @@ -8,10 +8,9 @@ if (!process.env.NODE_TEST_CONTEXT) { stream.on('test:pass', common.mustNotCall()); stream.on('test:fail', common.mustCall((event) => { - assert.strictEqual(event.expectFailure, true); assert.strictEqual(event.details.error.code, 'ERR_TEST_FAILURE'); assert.strictEqual(event.details.error.failureType, 'expectedFailure'); - assert.strictEqual(event.details.error.cause, 'test was expected to fail but passed'); + assert.strictEqual(event.details.error.message, 'test was expected to fail but passed'); }, 1)); } else { test('passing test', { expectFailure: true }, () => {}); diff --git a/test/parallel/test-runner-mock-timers-with-timeout.js b/test/parallel/test-runner-mock-timers-with-timeout.js new file mode 100644 index 00000000000000..67f266851fe1ed --- /dev/null +++ b/test/parallel/test-runner-mock-timers-with-timeout.js @@ -0,0 +1,14 @@ +'use strict'; +require('../common'); +const fixtures = require('../common/fixtures'); +const assert = require('node:assert'); +const { spawnSync } = require('node:child_process'); +const { test } = require('node:test'); + +test('mock timers do not break test timeout cleanup', async () => { + const fixture = fixtures.path('test-runner', 'mock-timers-with-timeout.js'); + const cp = spawnSync(process.execPath, ['--test', fixture], { + timeout: 30_000, + }); + assert.strictEqual(cp.status, 0, `Test failed:\nstdout: ${cp.stdout}\nstderr: ${cp.stderr}`); +}); diff --git a/test/parallel/test-runner-module-mocking.js b/test/parallel/test-runner-module-mocking.js index dcb6f84597fe71..7f2c76663ba29c 100644 --- a/test/parallel/test-runner-module-mocking.js +++ b/test/parallel/test-runner-module-mocking.js @@ -39,6 +39,42 @@ test('input validation', async (t) => { }); }, { code: 'ERR_INVALID_ARG_TYPE' }); }); + + await t.test('throws if exports is not an object', async (t) => { + assert.throws(() => { + t.mock.module(__filename, { + exports: null, + }); + }, { code: 'ERR_INVALID_ARG_TYPE' }); + }); + + await t.test('throws if exports is used with namedExports', async (t) => { + assert.throws(() => { + t.mock.module(__filename, { + exports: {}, + namedExports: {}, + }); + }, { code: 'ERR_INVALID_ARG_VALUE' }); + }); + + await t.test('throws if exports is used with defaultExport', async (t) => { + assert.throws(() => { + t.mock.module(__filename, { + exports: {}, + defaultExport: {}, + }); + }, { code: 'ERR_INVALID_ARG_VALUE' }); + }); + + await t.test('throws if exports is used with both legacy options', async (t) => { + assert.throws(() => { + t.mock.module(__filename, { + exports: {}, + namedExports: {}, + defaultExport: {}, + }); + }, { code: 'ERR_INVALID_ARG_VALUE' }); + }); }); test('core module mocking with namedExports option', async (t) => { @@ -517,42 +553,33 @@ test('mocks can be restored independently', async (t) => { assert.strictEqual(esmImpl.fn, undefined); }); -test('core module mocks can be used by both module systems', async (t) => { - const coreMock = t.mock.module('readline', { - namedExports: { fn() { return 42; } }, - }); +async function assertCoreModuleMockWorksInBothModuleSystems(t, specifier, options) { + const coreMock = t.mock.module(specifier, options); - let esmImpl = await import('readline'); - let cjsImpl = require('readline'); + let esmImpl = await import(specifier); + let cjsImpl = require(specifier); assert.strictEqual(esmImpl.fn(), 42); assert.strictEqual(cjsImpl.fn(), 42); coreMock.restore(); - esmImpl = await import('readline'); - cjsImpl = require('readline'); + esmImpl = await import(specifier); + cjsImpl = require(specifier); assert.strictEqual(typeof esmImpl.cursorTo, 'function'); assert.strictEqual(typeof cjsImpl.cursorTo, 'function'); +} + +test('core module mocks can be used by both module systems', async (t) => { + await assertCoreModuleMockWorksInBothModuleSystems(t, 'readline', { + namedExports: { fn() { return 42; } }, + }); }); test('node:- core module mocks can be used by both module systems', async (t) => { - const coreMock = t.mock.module('node:readline', { + await assertCoreModuleMockWorksInBothModuleSystems(t, 'node:readline', { namedExports: { fn() { return 42; } }, }); - - let esmImpl = await import('node:readline'); - let cjsImpl = require('node:readline'); - - assert.strictEqual(esmImpl.fn(), 42); - assert.strictEqual(cjsImpl.fn(), 42); - - coreMock.restore(); - esmImpl = await import('node:readline'); - cjsImpl = require('node:readline'); - - assert.strictEqual(typeof esmImpl.cursorTo, 'function'); - assert.strictEqual(typeof cjsImpl.cursorTo, 'function'); }); test('CJS mocks can be used by both module systems', async (t) => { @@ -666,6 +693,92 @@ test('defaultExports work with ESM mocks in both module systems', async (t) => { assert.strictEqual(require(fixturePath), defaultExport); }); +test('exports option works with core module mocks in both module systems', async (t) => { + await assertCoreModuleMockWorksInBothModuleSystems(t, 'readline', { + exports: { fn() { return 42; } }, + }); +}); + +async function assertGetterMockWorksInBothSystems(t, mockOptionsFactory) { + const fixturePath = fixtures.path('module-mocking', 'basic-esm.mjs'); + const fixture = pathToFileURL(fixturePath); + const original = await import(fixture); + let getterCalls = 0; + + assert.strictEqual(original.string, 'original esm string'); + + const options = mockOptionsFactory(() => { + getterCalls++; + return { mocked: true }; + }); + + t.mock.module(`${fixture}`, options); + + assert.deepStrictEqual((await import(fixture)).default, { mocked: true }); + assert.deepStrictEqual(require(fixturePath), { mocked: true }); + assert.strictEqual(getterCalls, 2); +} + +test('defaultExports getter works in both module systems', async (t) => { + await assertGetterMockWorksInBothSystems(t, (getter) => ({ + get defaultExport() { + return getter(); + }, + })); +}); + +test('exports.default getter works in both module systems', async (t) => { + await assertGetterMockWorksInBothSystems(t, (getter) => ({ + exports: { + get default() { + return getter(); + }, + }, + })); +}); +test('exports option supports default for CJS mocks in both module systems', async (t) => { + const fixturePath = fixtures.path('module-mocking', 'basic-cjs.js'); + const fixture = pathToFileURL(fixturePath); + const defaultExport = { val1: 5, val2: 3 }; + + t.mock.module(fixture, { + exports: { + default: defaultExport, + val1: 'mock value', + }, + }); + + const cjsMock = require(fixturePath); + const esmMock = await import(fixture); + + assert.strictEqual(cjsMock, defaultExport); + assert.strictEqual(esmMock.default, defaultExport); + assert.strictEqual(cjsMock.val1, 'mock value'); + assert.strictEqual(esmMock.val1, 'mock value'); + assert.strictEqual(cjsMock.val2, 3); +}); + +test('exports option supports default for ESM mocks in both module systems', async (t) => { + const fixturePath = fixtures.path('module-mocking', 'basic-esm.mjs'); + const fixture = pathToFileURL(fixturePath); + const defaultExport = { mocked: true }; + + t.mock.module(fixture, { + exports: { + default: defaultExport, + val1: 'mock value', + }, + }); + + const esmMock = await import(fixture); + const cjsMock = require(fixturePath); + + assert.strictEqual(esmMock.default, defaultExport); + assert.strictEqual(esmMock.val1, 'mock value'); + assert.strictEqual(cjsMock, defaultExport); + assert.strictEqual(cjsMock.val1, 'mock value'); +}); + test('wrong import syntax should throw error after module mocking', async () => { const { stdout, stderr, code } = await common.spawnPromisified( process.execPath, diff --git a/test/parallel/test-runner-run-files-undefined.mjs b/test/parallel/test-runner-run-files-undefined.mjs index 9d08b10a4550cd..a0981b307d1999 100644 --- a/test/parallel/test-runner-run-files-undefined.mjs +++ b/test/parallel/test-runner-run-files-undefined.mjs @@ -1,61 +1,31 @@ -import * as common from '../common/index.mjs'; +import '../common/index.mjs'; import tmpdir from '../common/tmpdir.js'; -import { describe, it, run, beforeEach } from 'node:test'; -import { dot, spec, tap } from 'node:test/reporters'; -import { fork } from 'node:child_process'; -import assert from 'node:assert'; - -if (common.hasCrypto) { - console.log('1..0 # Skipped: no crypto'); - process.exit(0); -} - -if (process.env.CHILD === 'true') { - describe('require(\'node:test\').run with no files', { concurrency: true }, () => { - beforeEach(() => { - tmpdir.refresh(); - process.chdir(tmpdir.path); +import { spawnSyncAndExitWithoutError } from '../common/child_process.js'; + +async function runTests(run, reporters) { + for (const reporterName of Object.keys(reporters)) { + if (reporterName === 'default') continue; + console.log({ reporterName }); + + const stream = run({ + files: undefined + }).compose(reporters[reporterName]); + stream.on('test:fail', () => { + throw new Error('Received test:fail with ' + reporterName); }); - - it('should neither pass or fail', async () => { - const stream = run({ - files: undefined - }).compose(tap); - stream.on('test:fail', common.mustNotCall()); - stream.on('test:pass', common.mustNotCall()); - - // eslint-disable-next-line no-unused-vars - for await (const _ of stream); + stream.on('test:pass', () => { + throw new Error('Received test:pass with ' + reporterName); }); - it('can use the spec reporter', async () => { - const stream = run({ - files: undefined - }).compose(spec); - stream.on('test:fail', common.mustNotCall()); - stream.on('test:pass', common.mustNotCall()); - - // eslint-disable-next-line no-unused-vars - for await (const _ of stream); - }); + // eslint-disable-next-line no-unused-vars + for await (const _ of stream); + } +} - it('can use the dot reporter', async () => { - const stream = run({ - files: undefined - }).compose(dot); - stream.on('test:fail', common.mustNotCall()); - stream.on('test:pass', common.mustNotCall()); +tmpdir.refresh(); +spawnSyncAndExitWithoutError(process.execPath, ['--input-type=module', '-e', ` + import { run } from 'node:test'; + import * as reporters from 'node:test/reporters'; - // eslint-disable-next-line no-unused-vars - for await (const _ of stream); - }); - }); -} else if (common.isAIX) { - console.log('1..0 # Skipped: test runner without specifying files fails on AIX'); -} else { - fork(import.meta.filename, [], { - env: { CHILD: 'true' } - }).on('exit', common.mustCall((code) => { - assert.strictEqual(code, 0); - })); -} + await (${runTests})(run, reporters); +`], { cwd: tmpdir.path }); diff --git a/test/parallel/test-runner-test-rerun-failures.js b/test/parallel/test-runner-test-rerun-failures.js index 220ec140b368a6..4a9ea5d4ac0bee 100644 --- a/test/parallel/test-runner-test-rerun-failures.js +++ b/test/parallel/test-runner-test-rerun-failures.js @@ -23,6 +23,10 @@ const expectedStateFile = [ 'test/fixtures/test-runner/rerun.js:39:1': { passed_on_attempt: 0, name: 'nested ambiguous (expectedAttempts=0)' }, 'test/fixtures/test-runner/rerun.js:30:16:(1)': { passed_on_attempt: 0, name: '2 levels deep' }, 'test/fixtures/test-runner/rerun.js:35:13:(1)': { passed_on_attempt: 0, name: 'ok' }, + 'test/fixtures/test-runner/rerun.js:45:13': { passed_on_attempt: 0, name: 'nested' }, + 'test/fixtures/test-runner/rerun.js:44:3': { passed_on_attempt: 0, name: 'passed on first attempt' }, + 'test/fixtures/test-runner/rerun.js:47:3': { passed_on_attempt: 0, name: 'a' }, + 'test/fixtures/test-runner/rerun.js:43:1': { passed_on_attempt: 0, name: 'describe rerun' }, }, { 'test/fixtures/test-runner/rerun.js:9:1': { passed_on_attempt: 0, name: 'ok' }, @@ -34,6 +38,11 @@ const expectedStateFile = [ 'test/fixtures/test-runner/rerun.js:39:1': { passed_on_attempt: 0, name: 'nested ambiguous (expectedAttempts=0)' }, 'test/fixtures/test-runner/rerun.js:30:16:(1)': { passed_on_attempt: 0, name: '2 levels deep' }, 'test/fixtures/test-runner/rerun.js:35:13:(1)': { passed_on_attempt: 0, name: 'ok' }, + 'test/fixtures/test-runner/rerun.js:43:1': { passed_on_attempt: 0, name: 'describe rerun' }, + 'test/fixtures/test-runner/rerun.js:44:3': { passed_on_attempt: 0, name: 'passed on first attempt' }, + 'test/fixtures/test-runner/rerun.js:45:13': { passed_on_attempt: 0, name: 'nested' }, + 'test/fixtures/test-runner/rerun.js:45:13:(1)': { passed_on_attempt: 1, name: 'nested' }, + 'test/fixtures/test-runner/rerun.js:47:3': { passed_on_attempt: 0, name: 'a' }, }, { 'test/fixtures/test-runner/rerun.js:3:1': { passed_on_attempt: 2, name: 'should fail on first two attempts' }, @@ -48,6 +57,11 @@ const expectedStateFile = [ 'test/fixtures/test-runner/rerun.js:30:16:(1)': { passed_on_attempt: 0, name: '2 levels deep' }, 'test/fixtures/test-runner/rerun.js:35:13:(1)': { passed_on_attempt: 0, name: 'ok' }, 'test/fixtures/test-runner/rerun.js:40:1': { passed_on_attempt: 2, name: 'nested ambiguous (expectedAttempts=1)' }, + 'test/fixtures/test-runner/rerun.js:43:1': { passed_on_attempt: 0, name: 'describe rerun' }, + 'test/fixtures/test-runner/rerun.js:44:3': { passed_on_attempt: 0, name: 'passed on first attempt' }, + 'test/fixtures/test-runner/rerun.js:45:13': { passed_on_attempt: 0, name: 'nested' }, + 'test/fixtures/test-runner/rerun.js:45:13:(1)': { passed_on_attempt: 1, name: 'nested' }, + 'test/fixtures/test-runner/rerun.js:47:3': { passed_on_attempt: 0, name: 'a' }, }, ]; @@ -67,23 +81,26 @@ test('test should pass on third rerun', async () => { let { code, stdout, signal } = await common.spawnPromisified(process.execPath, args); assert.strictEqual(code, 1); assert.strictEqual(signal, null); - assert.match(stdout, /pass 8/); + assert.match(stdout, /pass 11/); assert.match(stdout, /fail 4/); + assert.match(stdout, /suites 1/); assert.deepStrictEqual(await getStateFile(), expectedStateFile.slice(0, 1)); ({ code, stdout, signal } = await common.spawnPromisified(process.execPath, args)); assert.strictEqual(code, 1); assert.strictEqual(signal, null); - assert.match(stdout, /pass 9/); + assert.match(stdout, /pass 13/); assert.match(stdout, /fail 3/); + assert.match(stdout, /suites 1/); assert.deepStrictEqual(await getStateFile(), expectedStateFile.slice(0, 2)); ({ code, stdout, signal } = await common.spawnPromisified(process.execPath, args)); assert.strictEqual(code, 0); assert.strictEqual(signal, null); - assert.match(stdout, /pass 12/); + assert.match(stdout, /pass 18/); assert.match(stdout, /fail 0/); + assert.match(stdout, /suites 1/); assert.deepStrictEqual(await getStateFile(), expectedStateFile); }); @@ -93,29 +110,32 @@ test('test should pass on third rerun with `--test`', async () => { let { code, stdout, signal } = await common.spawnPromisified(process.execPath, args); assert.strictEqual(code, 1); assert.strictEqual(signal, null); - assert.match(stdout, /pass 8/); + assert.match(stdout, /pass 11/); assert.match(stdout, /fail 4/); + assert.match(stdout, /suites 1/); assert.deepStrictEqual(await getStateFile(), expectedStateFile.slice(0, 1)); ({ code, stdout, signal } = await common.spawnPromisified(process.execPath, args)); assert.strictEqual(code, 1); assert.strictEqual(signal, null); - assert.match(stdout, /pass 9/); + assert.match(stdout, /pass 13/); assert.match(stdout, /fail 3/); + assert.match(stdout, /suites 1/); assert.deepStrictEqual(await getStateFile(), expectedStateFile.slice(0, 2)); ({ code, stdout, signal } = await common.spawnPromisified(process.execPath, args)); assert.strictEqual(code, 0); assert.strictEqual(signal, null); - assert.match(stdout, /pass 12/); + assert.match(stdout, /pass 18/); assert.match(stdout, /fail 0/); + assert.match(stdout, /suites 1/); assert.deepStrictEqual(await getStateFile(), expectedStateFile); }); test('using `run` api', async () => { let stream = run({ files: [fixture], rerunFailuresFilePath: stateFile }); - stream.on('test:pass', common.mustCall(8)); + stream.on('test:pass', common.mustCall(12)); stream.on('test:fail', common.mustCall(4)); // eslint-disable-next-line no-unused-vars @@ -125,7 +145,7 @@ test('using `run` api', async () => { stream = run({ files: [fixture], rerunFailuresFilePath: stateFile }); - stream.on('test:pass', common.mustCall(9)); + stream.on('test:pass', common.mustCall(14)); stream.on('test:fail', common.mustCall(3)); // eslint-disable-next-line no-unused-vars @@ -135,7 +155,7 @@ test('using `run` api', async () => { stream = run({ files: [fixture], rerunFailuresFilePath: stateFile }); - stream.on('test:pass', common.mustCall(12)); + stream.on('test:pass', common.mustCall(19)); stream.on('test:fail', common.mustNotCall()); // eslint-disable-next-line no-unused-vars diff --git a/test/parallel/test-runner-worker-id.js b/test/parallel/test-runner-worker-id.js new file mode 100644 index 00000000000000..9366cfb4fd8a64 --- /dev/null +++ b/test/parallel/test-runner-worker-id.js @@ -0,0 +1,141 @@ +'use strict'; +require('../common'); +const fixtures = require('../common/fixtures'); +const assert = require('node:assert'); +const { spawnSync } = require('node:child_process'); +const { test } = require('node:test'); + +test('NODE_TEST_WORKER_ID is set for concurrent test files', async () => { + const args = [ + '--test', + fixtures.path('test-runner', 'worker-id', 'test-1.mjs'), + fixtures.path('test-runner', 'worker-id', 'test-2.mjs'), + fixtures.path('test-runner', 'worker-id', 'test-3.mjs'), + ]; + const result = spawnSync(process.execPath, args, { + cwd: fixtures.path(), + env: { ...process.env } + }); + + assert.strictEqual(result.status, 0, `Test failed: ${result.stderr.toString()}`); +}); + +test('NODE_TEST_WORKER_ID is set with explicit concurrency', async () => { + const args = [ + '--test', + '--test-concurrency=2', + fixtures.path('test-runner', 'worker-id', 'test-1.mjs'), + fixtures.path('test-runner', 'worker-id', 'test-2.mjs'), + ]; + const result = spawnSync(process.execPath, args, { + cwd: fixtures.path(), + env: { ...process.env } + }); + + assert.strictEqual(result.status, 0, `Test failed: ${result.stderr.toString()}`); +}); + +test('NODE_TEST_WORKER_ID is 1 with concurrency=1', async () => { + const args = ['--test', '--test-concurrency=1', fixtures.path('test-runner', 'worker-id', 'test-1.mjs')]; + const result = spawnSync(process.execPath, args, { + cwd: fixtures.path(), + env: { ...process.env } + }); + + assert.strictEqual(result.status, 0, `Test failed: ${result.stderr.toString()}`); +}); + +test('NODE_TEST_WORKER_ID with explicit isolation=process', async () => { + const args = [ + '--test', + '--test-isolation=process', + fixtures.path('test-runner', 'worker-id', 'test-1.mjs'), + fixtures.path('test-runner', 'worker-id', 'test-2.mjs'), + ]; + const result = spawnSync(process.execPath, args, { + cwd: fixtures.path(), + env: { ...process.env } + }); + + assert.strictEqual(result.status, 0, `Test failed: ${result.stderr.toString()}`); +}); + +test('NODE_TEST_WORKER_ID is 1 with isolation=none', async () => { + const args = [ + '--test', + '--test-isolation=none', + fixtures.path('test-runner', 'worker-id', 'test-1.mjs'), + fixtures.path('test-runner', 'worker-id', 'test-2.mjs'), + ]; + const result = spawnSync(process.execPath, args, { + cwd: fixtures.path(), + env: { ...process.env } + }); + + assert.strictEqual(result.status, 0, `Test failed: ${result.stderr.toString()}`); +}); + +test('context.workerId matches NODE_TEST_WORKER_ID', async () => { + const args = ['--test', fixtures.path('test-runner', 'worker-id', 'test-1.mjs')]; + const result = spawnSync(process.execPath, args, { + cwd: fixtures.path(), + env: { ...process.env } + }); + + // The fixture tests already verify that context.workerId matches the env var + assert.strictEqual(result.status, 0, `Test failed: ${result.stderr.toString()}`); +}); + +test('worker IDs are reused when more tests than concurrency', async () => { + const tmpdir = require('../common/tmpdir'); + const { writeFileSync } = require('node:fs'); + tmpdir.refresh(); + + // Create 9 separate test files dynamically + const testFiles = []; + const usageFile = tmpdir.resolve('worker-usage.txt'); + for (let i = 1; i <= 9; i++) { + const testFile = tmpdir.resolve(`reuse-test-${i}.mjs`); + writeFileSync( + testFile, + `import { test } from 'node:test'; +import { appendFileSync } from 'node:fs'; + +test('track worker ${i}', () => { + const workerId = process.env.NODE_TEST_WORKER_ID; + const usageFile = process.env.WORKER_USAGE_FILE; + appendFileSync(usageFile, workerId + '\\n'); +}); +`, + ); + testFiles.push(testFile); + } + + const args = ['--test', '--test-concurrency=3', ...testFiles]; + const result = spawnSync(process.execPath, args, { + env: { ...process.env, WORKER_USAGE_FILE: usageFile } + }); + + assert.strictEqual(result.status, 0, `Test failed: ${result.stderr.toString()}`); + + // Read and analyze worker IDs used + const { readFileSync } = require('node:fs'); + const workerIds = readFileSync(usageFile, 'utf8').trim().split('\n'); + + // Count occurrences of each worker ID + const workerCounts = {}; + workerIds.forEach((id) => { + workerCounts[id] = (workerCounts[id] || 0) + 1; + }); + + const uniqueWorkers = Object.keys(workerCounts); + assert.strictEqual( + uniqueWorkers.length, + 3, + `Should have exactly 3 unique worker IDs, got ${uniqueWorkers.length}: ${uniqueWorkers.join(', ')}` + ); + + Object.entries(workerCounts).forEach(([id, count]) => { + assert.strictEqual(count, 3, `Worker ID ${id} should be used 3 times, got ${count}`); + }); +}); diff --git a/test/parallel/test-runner-xfail.js b/test/parallel/test-runner-xfail.js new file mode 100644 index 00000000000000..b144156209a8f7 --- /dev/null +++ b/test/parallel/test-runner-xfail.js @@ -0,0 +1,259 @@ +'use strict'; +const common = require('../common'); +const { test, suite } = require('node:test'); +const { spawn } = require('child_process'); +const assert = require('node:assert'); + +if (process.env.CHILD_PROCESS === 'true') { + test('fail with message string', { expectFailure: 'reason string' }, () => { + assert.fail('boom'); + }); + + test('fail with label object', { expectFailure: { label: 'reason object' } }, () => { + assert.fail('boom'); + }); + + test('fail with match regex', { expectFailure: { match: /boom/ } }, () => { + assert.fail('boom'); + }); + + test('fail with match object', { expectFailure: { match: { message: 'boom' } } }, () => { + assert.fail('boom'); + }); + + test('fail with match class', { expectFailure: { match: assert.AssertionError } }, () => { + assert.fail('boom'); + }); + + test('fail with match error (wrong error)', { expectFailure: { match: /bang/ } }, () => { + assert.fail('boom'); // Should result in real failure because error doesn't match + }); + + test('unexpected pass', { expectFailure: true }, () => { + // Should result in real failure because it didn't fail + }); + + test('fail with empty string', { expectFailure: '' }, () => { + assert.fail('boom'); + }); + + // 1. Matcher: RegExp + test('fails with regex matcher', { expectFailure: /expected error/ }, () => { + throw new Error('this is the expected error'); + }); + + test('fails with regex matcher (mismatch)', { expectFailure: /expected error/ }, () => { + throw new Error('wrong error'); // Should fail the test + }); + + // 2. Matcher: Class + test('fails with class matcher', { expectFailure: RangeError }, () => { + throw new RangeError('out of bounds'); + }); + + test('fails with class matcher (mismatch)', { expectFailure: RangeError }, () => { + throw new TypeError('wrong type'); // Should fail the test + }); + + // 3. Matcher: Function + test('fails with function matcher', { + expectFailure: (err) => err.code === 'ERR_FUNCTION', + }, () => { + const err = new Error('boom'); + err.code = 'ERR_FUNCTION'; + throw err; + }); + + test('fails with function matcher (mismatch)', { + expectFailure: (err) => err.code === 'ERR_FUNCTION', + }, () => { + const err = new Error('boom'); + err.code = 'ERR_WRONG'; + throw err; // Should fail + }); + + // 4. Matcher: Object (Properties) + test('fails with object matcher', { expectFailure: { code: 'ERR_TEST' } }, () => { + const err = new Error('boom'); + err.code = 'ERR_TEST'; + throw err; + }); + + test('fails with object matcher (mismatch)', { expectFailure: { code: 'ERR_TEST' } }, () => { + const err = new Error('boom'); + err.code = 'ERR_WRONG'; + throw err; // Should fail + }); + + // 5. Configuration Object: Reason + Validation + test('fails with config object (label + match)', { + expectFailure: { + label: 'Bug #124', + match: /boom/ + } + }, () => { + throw new Error('boom'); + }); + + test('fails with config object (label only)', { + expectFailure: { label: 'Bug #125' } + }, () => { + throw new Error('boom'); + }); + + test('fails with config object (match only)', { + expectFailure: { match: /boom/ } + }, () => { + throw new Error('boom'); + }); + + // 6. Edge Case: Empty Object (Should throw ERR_INVALID_ARG_VALUE during creation) + test('invalid empty object throws', () => { + // eslint-disable-next-line no-restricted-syntax + assert.throws(() => test('invalid empty object', { expectFailure: {} }, () => {})); + }); + + // 7. Primitives and Truthiness + test('fails with boolean true', { expectFailure: true }, () => { + throw new Error('any error'); + }); + + // 8. Unexpected Pass (Enhanced) + test('unexpected pass (reason string)', { expectFailure: 'should fail' }, () => { + // Pass + }); + + test('unexpected pass (matcher)', { expectFailure: /boom/ }, () => { + // Pass + }); + + // 9. Test level expectFailure with subtests + test('test level expectFailure with subtests', { expectFailure: true }, async (t) => { + await t.test('subtest should pass if it throws', () => { + throw new Error('fail'); + }); + + await t.test('subtest should fail if it does not throw', () => { + // This should fail the test because the suite expects failure, + // and this subtest inherited that expectation but didn't throw. + }); + }); + + test('test level expectFailure with subtests and matcher', { expectFailure: /suite error/ }, async (t) => { + await t.test('subtest match suite expectation', () => { + throw new Error('suite error'); + }); + }); + + // 10. Suite level expectFailure + suite('suite level expectFailure', { expectFailure: true }, () => { + test('suite subtest should pass if it throws', () => { + throw new Error('fail'); + }); + + test('suite subtest should fail if it does not throw', () => { + // This should fail the test because the suite expects failure, + // and this subtest inherited that expectation but didn't throw. + }); + }); + + suite('suite level expectFailure with matcher', { expectFailure: /suite error/ }, () => { + test('suite subtest match suite expectation', () => { + throw new Error('suite error'); + }); + }); + + test('correct config with label and match object', { + expectFailure: { + label: 'Bug #124', + match: { code: 'ERR_TEST' } + } + }, () => { + const err = new Error('boom'); + err.code = 'ERR_TEST'; + throw err; + }); + + test('fails with ambiguous config (mixed props)', { + expectFailure: { + code: 'ERR_TEST', + label: 'Bug #124', + } + }, () => { + const err = new Error('boom'); + err.code = 'ERR_TEST'; + throw err; + }); + + test('fails with ambiguous config (mixed props with match)', { + expectFailure: { + code: 'ERR_TEST', + match: /message/ + } + }, () => { + const err = new Error('message'); + err.code = 'ERR_TEST'; + throw err; + }); + +} else { + const child = spawn(process.execPath, ['--test-reporter', 'tap', __filename], { + env: { ...process.env, CHILD_PROCESS: 'true' }, + stdio: 'pipe', + }); + + let stdout = ''; + child.stdout.setEncoding('utf8'); + child.stdout.on('data', (chunk) => { stdout += chunk; }); + + child.on('close', common.mustCall((code) => { + // We expect exit code 1 because 'unexpected pass' and 'wrong error' should fail the test run + assert.strictEqual(code, 1); + + assert.match(stdout, /ok \d+ - fail with message string # EXPECTED FAILURE reason string/); + assert.match(stdout, /ok \d+ - fail with label object # EXPECTED FAILURE reason object/); + assert.match(stdout, /ok \d+ - fail with match regex # EXPECTED FAILURE/); + assert.match(stdout, /ok \d+ - fail with match object # EXPECTED FAILURE/); + assert.match(stdout, /ok \d+ - fail with match class # EXPECTED FAILURE/); + assert.match(stdout, /not ok \d+ - fail with match error \(wrong error\) # EXPECTED FAILURE/); + assert.match(stdout, /not ok \d+ - unexpected pass # EXPECTED FAILURE/); + assert.match(stdout, /ok \d+ - fail with empty string # EXPECTED FAILURE/); + + // New tests verification + assert.match(stdout, /ok \d+ - fails with regex matcher # EXPECTED FAILURE/); + assert.match(stdout, /not ok \d+ - fails with regex matcher \(mismatch\) # EXPECTED FAILURE/); + assert.match(stdout, /ok \d+ - fails with class matcher # EXPECTED FAILURE/); + assert.match(stdout, /not ok \d+ - fails with class matcher \(mismatch\) # EXPECTED FAILURE/); + assert.match(stdout, /ok \d+ - fails with function matcher # EXPECTED FAILURE/); + assert.match(stdout, /not ok \d+ - fails with function matcher \(mismatch\) # EXPECTED FAILURE/); + assert.match(stdout, /ok \d+ - fails with object matcher # EXPECTED FAILURE/); + assert.match(stdout, /not ok \d+ - fails with object matcher \(mismatch\) # EXPECTED FAILURE/); + assert.match(stdout, /ok \d+ - fails with config object \(label \+ match\) # EXPECTED FAILURE Bug \\#124/); + assert.match(stdout, /ok \d+ - fails with config object \(label only\) # EXPECTED FAILURE Bug \\#125/); + assert.match(stdout, /ok \d+ - fails with config object \(match only\) # EXPECTED FAILURE/); + assert.match(stdout, /ok \d+ - fails with boolean true # EXPECTED FAILURE/); + assert.match(stdout, /not ok \d+ - unexpected pass \(reason string\) # EXPECTED FAILURE should fail/); + assert.match(stdout, /not ok \d+ - unexpected pass \(matcher\) # EXPECTED FAILURE/); + + // Suite inheritance verification + assert.match(stdout, /ok \d+ - test level expectFailure with subtests # EXPECTED FAILURE/); + assert.match(stdout, /ok \d+ - subtest should pass if it throws # EXPECTED FAILURE/); + assert.match(stdout, /not ok \d+ - subtest should fail if it does not throw # EXPECTED FAILURE/); + assert.match(stdout, /ok \d+ - test level expectFailure with subtests and matcher # EXPECTED FAILURE/); + assert.match(stdout, /ok \d+ - subtest match suite expectation # EXPECTED FAILURE/); + + // Suite level expectFailure verification + assert.match(stdout, /ok \d+ - suite level expectFailure # EXPECTED FAILURE/); + assert.match(stdout, /ok \d+ - suite subtest should pass if it throws # EXPECTED FAILURE/); + assert.match(stdout, /not ok \d+ - suite subtest should fail if it does not throw # EXPECTED FAILURE/); + assert.match(stdout, /ok \d+ - suite level expectFailure with matcher # EXPECTED FAILURE/); + assert.match(stdout, /ok \d+ - suite subtest match suite expectation # EXPECTED FAILURE/); + + // Empty object error + assert.match(stdout, /ok \d+ - invalid empty object throws/); + assert.match(stdout, /ok \d+ - correct config with label and match object # EXPECTED FAILURE Bug \\#124/); + assert.match(stdout, /not ok \d+ - fails with ambiguous config \(mixed props\) # EXPECTED FAILURE/); + assert.match(stdout, /not ok \d+ - fails with ambiguous config \(mixed props with match\) # EXPECTED FAILURE/); + + })); +} diff --git a/test/parallel/test-source-map-invalid-url.js b/test/parallel/test-source-map-invalid-url.js new file mode 100644 index 00000000000000..a968040b4f1e3d --- /dev/null +++ b/test/parallel/test-source-map-invalid-url.js @@ -0,0 +1,56 @@ +// Flags: --enable-source-maps +'use strict'; + +const common = require('../common'); +const assert = require('node:assert'); +const childProcess = require('node:child_process'); + +// TODO(legendecas): c8 will complain if non-file-scheme is used in source maps. +// https://github.com/bcoe/c8/blob/ee2f1cfc5584d41bb2d51b788d0953dab0c798f8/lib/report.js#L517 +if (process.env.NODE_V8_COVERAGE) { + console.log('Spawning with coverage disabled.'); + const { status } = childProcess.spawnSync( + process.execPath, + [__filename], + { + stdio: 'inherit', + env: { + ...process.env, + NODE_V8_COVERAGE: '', + }, + }, + ); + assert.strictEqual(status, 0); + return; +} + +const sources = [ + ` + //# sourceMappingURL=unknown-protocol://invalid/url + //# sourceURL=unknown-protocol://invalid/url + `, + ` + //# sourceMappingURL=file://invalid:/file/url + //# sourceURL=file://invalid:/file/url + `, + ` + //# sourceMappingURL=invalid-url + //# sourceURL=invalid-url + `, +]; + +sources.forEach(test); + +function test(source) { + // Eval should tolerate invalid source map url + eval(source); + + const base64 = Buffer.from(source).toString('base64url'); + + // Dynamic import should tolerate invalid source map url + import(`data:text/javascript;base64,${base64}`) + .then(common.mustCall()); +} + +// eslint-disable-next-line @stylistic/js/spaced-comment +//# sourceMappingURL=invalid-url diff --git a/test/parallel/test-sqlite-limits.js b/test/parallel/test-sqlite-limits.js new file mode 100644 index 00000000000000..1a038df054451b --- /dev/null +++ b/test/parallel/test-sqlite-limits.js @@ -0,0 +1,304 @@ +'use strict'; +const { skipIfSQLiteMissing } = require('../common'); +skipIfSQLiteMissing(); +const { DatabaseSync } = require('node:sqlite'); +const { suite, test } = require('node:test'); + +suite('DatabaseSync limits', () => { + test('limits object has expected properties with positive values', (t) => { + const db = new DatabaseSync(':memory:'); + const expectedProperties = [ + 'length', + 'sqlLength', + 'column', + 'exprDepth', + 'compoundSelect', + 'vdbeOp', + 'functionArg', + 'attach', + 'likePatternLength', + 'variableNumber', + 'triggerDepth', + ]; + + for (const prop of expectedProperties) { + t.assert.strictEqual(typeof db.limits[prop], 'number', + `${prop} should be a number`); + t.assert.ok(db.limits[prop] > 0, + `${prop} should be positive`); + } + }); + + test('constructor accepts limits option', (t) => { + const db = new DatabaseSync(':memory:', { + limits: { + length: 500000, + sqlLength: 50000, + column: 100, + exprDepth: 50, + compoundSelect: 10, + vdbeOp: 10000, + functionArg: 8, + attach: 5, + likePatternLength: 1000, + variableNumber: 100, + triggerDepth: 5, + } + }); + + t.assert.strictEqual(db.limits.length, 500000); + t.assert.strictEqual(db.limits.sqlLength, 50000); + t.assert.strictEqual(db.limits.column, 100); + t.assert.strictEqual(db.limits.exprDepth, 50); + t.assert.strictEqual(db.limits.compoundSelect, 10); + t.assert.strictEqual(db.limits.vdbeOp, 10000); + t.assert.strictEqual(db.limits.functionArg, 8); + t.assert.strictEqual(db.limits.attach, 5); + t.assert.strictEqual(db.limits.likePatternLength, 1000); + t.assert.strictEqual(db.limits.variableNumber, 100); + t.assert.strictEqual(db.limits.triggerDepth, 5); + }); + + test('getter returns current limit value', (t) => { + const db = new DatabaseSync(':memory:'); + t.assert.strictEqual(typeof db.limits.length, 'number'); + t.assert.ok(db.limits.length > 0); + t.assert.strictEqual(typeof db.limits.sqlLength, 'number'); + t.assert.ok(db.limits.sqlLength > 0); + }); + + test('setter modifies limit value', (t) => { + const db = new DatabaseSync(':memory:'); + + db.limits.length = 100000; + t.assert.strictEqual(db.limits.length, 100000); + + db.limits.sqlLength = 50000; + t.assert.strictEqual(db.limits.sqlLength, 50000); + + db.limits.column = 50; + t.assert.strictEqual(db.limits.column, 50); + }); + + test('Infinity resets limit to maximum', (t) => { + const db = new DatabaseSync(':memory:'); + const originalLength = db.limits.length; + + // Set to a lower value + db.limits.length = 100; + t.assert.strictEqual(db.limits.length, 100); + + // Reset to maximum using Infinity + db.limits.length = Infinity; + t.assert.strictEqual(db.limits.length, originalLength); + }); + + test('throws on invalid argument type', (t) => { + const db = new DatabaseSync(':memory:'); + t.assert.throws(() => { + db.limits.length = 'invalid'; + }, { + name: 'TypeError', + message: /Limit value must be a non-negative integer or Infinity/, + }); + }); + + test('throws on negative value', (t) => { + const db = new DatabaseSync(':memory:'); + t.assert.throws(() => { + db.limits.length = -1; + }, { + name: 'RangeError', + message: /Limit value must be non-negative/, + }); + }); + + test('throws on null value', (t) => { + const db = new DatabaseSync(':memory:'); + t.assert.throws(() => { + db.limits.length = null; + }, { + name: 'TypeError', + message: /Limit value must be a non-negative integer or Infinity/, + }); + }); + + test('throws on negative Infinity', (t) => { + const db = new DatabaseSync(':memory:'); + t.assert.throws(() => { + db.limits.length = -Infinity; + }, { + name: 'TypeError', + message: /Limit value must be a non-negative integer or Infinity/, + }); + }); + + test('throws on getter access after close', (t) => { + const db = new DatabaseSync(':memory:'); + db.close(); + t.assert.throws(() => { + return db.limits.length; + }, { + code: 'ERR_INVALID_STATE', + message: /database is not open/, + }); + }); + + test('throws on setter access after close', (t) => { + const db = new DatabaseSync(':memory:'); + db.close(); + t.assert.throws(() => { + db.limits.length = 100; + }, { + code: 'ERR_INVALID_STATE', + message: /database is not open/, + }); + }); + + test('limits object is enumerable', (t) => { + const db = new DatabaseSync(':memory:'); + const keys = Object.keys(db.limits); + t.assert.ok(keys.includes('length')); + t.assert.ok(keys.includes('sqlLength')); + t.assert.ok(keys.includes('column')); + t.assert.ok(keys.includes('exprDepth')); + t.assert.ok(keys.includes('compoundSelect')); + t.assert.ok(keys.includes('vdbeOp')); + t.assert.ok(keys.includes('functionArg')); + t.assert.ok(keys.includes('attach')); + t.assert.ok(keys.includes('likePatternLength')); + t.assert.ok(keys.includes('variableNumber')); + t.assert.ok(keys.includes('triggerDepth')); + }); + + test('throws on invalid limits option type', (t) => { + t.assert.throws(() => { + new DatabaseSync(':memory:', { limits: 'invalid' }); + }, { + name: 'TypeError', + message: /options\.limits.*must be an object/, + }); + }); + + test('throws on invalid limit value type in constructor', (t) => { + t.assert.throws(() => { + new DatabaseSync(':memory:', { limits: { length: 'invalid' } }); + }, { + name: 'TypeError', + message: /options\.limits\.length.*must be an integer/, + }); + }); + + test('throws on negative limit value in constructor', (t) => { + t.assert.throws(() => { + new DatabaseSync(':memory:', { limits: { length: -100 } }); + }, { + name: 'RangeError', + message: /options\.limits\.length.*must be non-negative/, + }); + }); + + test('throws on Infinity limit value in constructor', (t) => { + t.assert.throws(() => { + new DatabaseSync(':memory:', { limits: { length: Infinity } }); + }, { + name: 'TypeError', + message: /options\.limits\.length.*must be an integer/, + }); + }); + + test('partial limits in constructor', (t) => { + const db = new DatabaseSync(':memory:', { + limits: { + length: 100000, + } + }); + t.assert.strictEqual(db.limits.length, 100000); + t.assert.strictEqual(typeof db.limits.sqlLength, 'number'); + }); + + test('throws when exceeding column limit', (t) => { + const db = new DatabaseSync(':memory:', { + limits: { + column: 10, + } + }); + + db.exec('CREATE TABLE t1 (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10)'); + + t.assert.throws(() => { + db.exec('CREATE TABLE t2 (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11)'); + }, { + message: /too many columns/, + }); + }); + + test('throws when exceeding attach limit', (t) => { + const db = new DatabaseSync(':memory:', { + limits: { + attach: 0, + } + }); + + t.assert.throws(() => { + db.exec("ATTACH DATABASE ':memory:' AS db1"); + }, { + message: /too many attached databases/, + }); + }); + + test('throws when exceeding variable number limit', (t) => { + const db = new DatabaseSync(':memory:', { + limits: { + variableNumber: 2, + } + }); + + t.assert.throws(() => { + const stmt = db.prepare('SELECT ?, ?, ?'); + stmt.all(1, 2, 3); + }, { + message: /too many SQL variables/, + }); + }); + + test('throws when exceeding compound select limit', (t) => { + const db = new DatabaseSync(':memory:', { + limits: { + compoundSelect: 1, + } + }); + + t.assert.throws(() => { + db.exec('SELECT 1 UNION SELECT 2 UNION SELECT 3'); + }, { + message: /too many terms in compound SELECT/, + }); + }); + + test('throws when exceeding function arg limit', (t) => { + const db = new DatabaseSync(':memory:', { + limits: { + functionArg: 2, + } + }); + + t.assert.throws(() => { + db.exec('SELECT max(1, 2, 3)'); + }, { + message: /too many arguments on function max/, + }); + }); + + test('setter applies limit to SQLite immediately', (t) => { + const db = new DatabaseSync(':memory:'); + + db.limits.attach = 0; + + t.assert.throws(() => { + db.exec("ATTACH DATABASE ':memory:' AS db1"); + }, { + message: /too many attached databases/, + }); + }); +}); diff --git a/test/parallel/test-sqlite-statement-sync.js b/test/parallel/test-sqlite-statement-sync.js index 62e95363f1c46a..aa7a3a73ae6649 100644 --- a/test/parallel/test-sqlite-statement-sync.js +++ b/test/parallel/test-sqlite-statement-sync.js @@ -171,6 +171,61 @@ suite('StatementSync.prototype.iterate()', () => { { __proto__: null, done: true, value: null }, ); }); + + test('iterator is invalidated when statement is reset by get/all/run/iterate', (t) => { + const db = new DatabaseSync(':memory:'); + db.exec('CREATE TABLE test (value INTEGER NOT NULL)'); + for (let i = 0; i < 5; i++) { + db.prepare('INSERT INTO test (value) VALUES (?)').run(i); + } + const stmt = db.prepare('SELECT * FROM test'); + + // Invalidated by stmt.get() + let it = stmt.iterate(); + it.next(); + stmt.get(); + t.assert.throws(() => { it.next(); }, { + code: 'ERR_INVALID_STATE', + message: /iterator was invalidated/, + }); + + // Invalidated by stmt.all() + it = stmt.iterate(); + it.next(); + stmt.all(); + t.assert.throws(() => { it.next(); }, { + code: 'ERR_INVALID_STATE', + message: /iterator was invalidated/, + }); + + // Invalidated by stmt.run() + it = stmt.iterate(); + it.next(); + stmt.run(); + t.assert.throws(() => { it.next(); }, { + code: 'ERR_INVALID_STATE', + message: /iterator was invalidated/, + }); + + // Invalidated by a new stmt.iterate() + it = stmt.iterate(); + it.next(); + const it2 = stmt.iterate(); + t.assert.throws(() => { it.next(); }, { + code: 'ERR_INVALID_STATE', + message: /iterator was invalidated/, + }); + + // New iterator works fine + t.assert.strictEqual(it2.next().done, false); + + // Reset on a different statement does NOT invalidate this iterator + const stmt2 = db.prepare('SELECT * FROM test'); + it = stmt.iterate(); + it.next(); + stmt2.get(); + it.next(); + }); }); suite('StatementSync.prototype.run()', () => { diff --git a/test/parallel/test-strace-openat-openssl.js b/test/parallel/test-strace-openat-openssl.js index 234c12f126f093..399c1db443f9f0 100644 --- a/test/parallel/test-strace-openat-openssl.js +++ b/test/parallel/test-strace-openat-openssl.js @@ -11,6 +11,9 @@ if (!common.isLinux) common.skip('linux only'); if (common.isASan) common.skip('strace does not work well with address sanitizer builds'); +if (process.config.variables.node_shared_openssl) { + common.skip('external shared openssl may open other files'); +} if (spawnSync('strace').error !== undefined) { common.skip('missing strace'); } diff --git a/test/parallel/test-stream-pipeline.js b/test/parallel/test-stream-pipeline.js index 6220bc15365361..8852f24a75050f 100644 --- a/test/parallel/test-stream-pipeline.js +++ b/test/parallel/test-stream-pipeline.js @@ -1749,3 +1749,24 @@ tmpdir.refresh(); assert.deepStrictEqual(err, new Error('booom')); })); } + +{ + // Errors thrown in Readable.map inside pipeline should not be + // swallowed by AbortError when the source is an infinite stream. + pipeline( + new Readable({ read() { this.push('data'); } }), + new Transform({ + readableObjectMode: true, + transform(chunk, encoding, callback) { + this.push({}); + callback(); + }, + }), + (readable) => readable.map(async () => { + throw new Error('Boom!'); + }), + common.mustCall((err) => { + assert.strictEqual(err.message, 'Boom!'); + }), + ); +} diff --git a/test/parallel/test-stream2-read-correct-num-bytes-in-utf8.js b/test/parallel/test-stream2-read-correct-num-bytes-in-utf8.js new file mode 100644 index 00000000000000..476f041e3f4087 --- /dev/null +++ b/test/parallel/test-stream2-read-correct-num-bytes-in-utf8.js @@ -0,0 +1,16 @@ +'use strict'; + +require('../common'); +const assert = require('assert'); +const { Readable } = require('stream'); + +const readable = new Readable({ read() {} }); +readable.setEncoding('utf8'); + +readable.push('abc'); +readable.push('defgh'); +readable.push(null); + +assert.strictEqual(readable.read(5), 'abcde'); +assert.strictEqual(readable.read(3), 'fgh'); +assert.strictEqual(readable.read(1), null); diff --git a/test/parallel/test-tls-client-auth.js b/test/parallel/test-tls-client-auth.js index 04bf40b9a9e1ac..67aed40914c9fe 100644 --- a/test/parallel/test-tls-client-auth.js +++ b/test/parallel/test-tls-client-auth.js @@ -82,8 +82,9 @@ connect({ }, common.mustCall((err, pair, cleanup) => { assert.strictEqual(pair.server.err.code, 'ERR_SSL_PEER_DID_NOT_RETURN_A_CERTIFICATE'); - const expectedErr = hasOpenSSL(3, 2) ? - 'ERR_SSL_SSL/TLS_ALERT_HANDSHAKE_FAILURE' : 'ERR_SSL_SSLV3_ALERT_HANDSHAKE_FAILURE'; + const expectedErr = hasOpenSSL(4, 0) ? + 'ERR_SSL_TLS_ALERT_HANDSHAKE_FAILURE' : hasOpenSSL(3, 2) ? + 'ERR_SSL_SSL/TLS_ALERT_HANDSHAKE_FAILURE' : 'ERR_SSL_SSLV3_ALERT_HANDSHAKE_FAILURE'; assert.strictEqual(pair.client.err.code, expectedErr); return cleanup(); diff --git a/test/parallel/test-tls-connect-keepalive-nodelay.js b/test/parallel/test-tls-connect-keepalive-nodelay.js new file mode 100644 index 00000000000000..81eaafabc64a6f --- /dev/null +++ b/test/parallel/test-tls-connect-keepalive-nodelay.js @@ -0,0 +1,65 @@ +// Flags: --expose-internals +'use strict'; + +const common = require('../common'); + +// This test verifies that tls.connect() forwards keepAlive, +// keepAliveInitialDelay, and noDelay options to the underlying socket. + +if (!common.hasCrypto) + common.skip('missing crypto'); + +const assert = require('assert'); +const tls = require('tls'); +const fixtures = require('../common/fixtures'); +const { + kSetNoDelay, + kSetKeepAlive, + kSetKeepAliveInitialDelay, +} = require('internal/net'); + +const key = fixtures.readKey('agent1-key.pem'); +const cert = fixtures.readKey('agent1-cert.pem'); + +// Test: keepAlive, keepAliveInitialDelay, and noDelay +{ + const server = tls.createServer({ key, cert }, (socket) => { + socket.end(); + }); + + server.listen(0, common.mustCall(() => { + const socket = tls.connect({ + port: server.address().port, + rejectUnauthorized: false, + keepAlive: true, + keepAliveInitialDelay: 1000, + noDelay: true, + }, common.mustCall(() => { + assert.strictEqual(socket[kSetKeepAlive], true); + assert.strictEqual(socket[kSetKeepAliveInitialDelay], 1); + assert.strictEqual(socket[kSetNoDelay], true); + socket.destroy(); + server.close(); + })); + })); +} + +// Test: defaults (options not set) +{ + const server = tls.createServer({ key, cert }, (socket) => { + socket.end(); + }); + + server.listen(0, common.mustCall(() => { + const socket = tls.connect({ + port: server.address().port, + rejectUnauthorized: false, + }, common.mustCall(() => { + assert.strictEqual(socket[kSetKeepAlive], false); + assert.strictEqual(socket[kSetKeepAliveInitialDelay], 0); + assert.strictEqual(socket[kSetNoDelay], false); + socket.destroy(); + server.close(); + })); + })); +} diff --git a/test/parallel/test-tls-empty-sni-context.js b/test/parallel/test-tls-empty-sni-context.js index 79f1ddd341d938..e4136ff71e1d52 100644 --- a/test/parallel/test-tls-empty-sni-context.js +++ b/test/parallel/test-tls-empty-sni-context.js @@ -26,8 +26,9 @@ const server = tls.createServer(options, (c) => { }, common.mustNotCall()); c.on('error', common.mustCall((err) => { - const expectedErr = hasOpenSSL(3, 2) ? - 'ERR_SSL_SSL/TLS_ALERT_HANDSHAKE_FAILURE' : 'ERR_SSL_SSLV3_ALERT_HANDSHAKE_FAILURE'; + const expectedErr = hasOpenSSL(4, 0) ? + 'ERR_SSL_TLS_ALERT_HANDSHAKE_FAILURE' : hasOpenSSL(3, 2) ? + 'ERR_SSL_SSL/TLS_ALERT_HANDSHAKE_FAILURE' : 'ERR_SSL_SSLV3_ALERT_HANDSHAKE_FAILURE'; assert.strictEqual(err.code, expectedErr); })); })); diff --git a/test/parallel/test-tls-psk-circuit.js b/test/parallel/test-tls-psk-circuit.js index 9cbc7a91fb852b..bdf9c86c26a7b6 100644 --- a/test/parallel/test-tls-psk-circuit.js +++ b/test/parallel/test-tls-psk-circuit.js @@ -64,8 +64,9 @@ test({ psk: USERS.UserA, identity: 'UserA' }, { minVersion: 'TLSv1.3' }); test({ psk: USERS.UserB, identity: 'UserB' }); test({ psk: USERS.UserB, identity: 'UserB' }, { minVersion: 'TLSv1.3' }); // Unrecognized user should fail handshake -const expectedHandshakeErr = hasOpenSSL(3, 2) ? - 'ERR_SSL_SSL/TLS_ALERT_HANDSHAKE_FAILURE' : 'ERR_SSL_SSLV3_ALERT_HANDSHAKE_FAILURE'; +const expectedHandshakeErr = hasOpenSSL(4, 0) ? + 'ERR_SSL_TLS_ALERT_HANDSHAKE_FAILURE' : hasOpenSSL(3, 2) ? + 'ERR_SSL_SSL/TLS_ALERT_HANDSHAKE_FAILURE' : 'ERR_SSL_SSLV3_ALERT_HANDSHAKE_FAILURE'; test({ psk: USERS.UserB, identity: 'UserC' }, {}, expectedHandshakeErr); // Recognized user but incorrect secret should fail handshake const expectedIllegalParameterErr = hasOpenSSL(3, 4) ? 'ERR_SSL_TLSV1_ALERT_DECRYPT_ERROR' : diff --git a/test/parallel/test-tls-set-ciphers.js b/test/parallel/test-tls-set-ciphers.js index 1e63e9376e134b..82a19bb9e90fc2 100644 --- a/test/parallel/test-tls-set-ciphers.js +++ b/test/parallel/test-tls-set-ciphers.js @@ -90,7 +90,9 @@ function test(cciphers, sciphers, cipher, cerr, serr, options) { const U = undefined; let expectedTLSAlertError = 'ERR_SSL_SSLV3_ALERT_HANDSHAKE_FAILURE'; -if (hasOpenSSL(3, 2)) { +if (hasOpenSSL(4, 0)) { + expectedTLSAlertError = 'ERR_SSL_TLS_ALERT_HANDSHAKE_FAILURE'; +} else if (hasOpenSSL(3, 2)) { expectedTLSAlertError = 'ERR_SSL_SSL/TLS_ALERT_HANDSHAKE_FAILURE'; } diff --git a/test/parallel/test-tls-set-sigalgs.js b/test/parallel/test-tls-set-sigalgs.js index 985ca13ba2ac7d..1bce814f3e8604 100644 --- a/test/parallel/test-tls-set-sigalgs.js +++ b/test/parallel/test-tls-set-sigalgs.js @@ -66,8 +66,9 @@ test('RSA-PSS+SHA256:RSA-PSS+SHA512:ECDSA+SHA256', ['RSA-PSS+SHA256', 'ECDSA+SHA256']); // Do not have shared sigalgs. -const handshakeErr = hasOpenSSL(3, 2) ? - 'ERR_SSL_SSL/TLS_ALERT_HANDSHAKE_FAILURE' : 'ERR_SSL_SSLV3_ALERT_HANDSHAKE_FAILURE'; +const handshakeErr = hasOpenSSL(4, 0) ? + 'ERR_SSL_TLS_ALERT_HANDSHAKE_FAILURE' : hasOpenSSL(3, 2) ? + 'ERR_SSL_SSL/TLS_ALERT_HANDSHAKE_FAILURE' : 'ERR_SSL_SSLV3_ALERT_HANDSHAKE_FAILURE'; test('RSA-PSS+SHA384', 'ECDSA+SHA256', undefined, handshakeErr, 'ERR_SSL_NO_SHARED_SIGNATURE_ALGORITHMS'); diff --git a/test/parallel/test-trace-exit.js b/test/parallel/test-trace-exit.js index 7a4c222c40f74c..bfe412c5fba9c7 100644 --- a/test/parallel/test-trace-exit.js +++ b/test/parallel/test-trace-exit.js @@ -7,26 +7,22 @@ const { Worker, isMainThread, workerData } = require('worker_threads'); const variant = process.argv[process.argv.length - 1]; switch (true) { - case variant === 'main-thread': { - return; - } - case variant === 'main-thread-exit': { + case isMainThread ? variant === 'main-thread-exit' : workerData === 'worker-thread-exit': return process.exit(0); - } case variant.startsWith('worker-thread'): { const worker = new Worker(__filename, { workerData: variant }); worker.on('error', common.mustNotCall()); worker.on('exit', common.mustCall((code) => { assert.strictEqual(code, 0); })); - return; } - case !isMainThread: { - if (workerData === 'worker-thread-exit') { - process.exit(0); - } + // eslint-disable-next-line no-fallthrough + case variant === 'main-thread': + // eslint-disable-next-line no-fallthrough + case variant === 'main-thread-exit': + // eslint-disable-next-line no-fallthrough + case !isMainThread: return; - } } (async function() { diff --git a/test/parallel/test-util-styletext.js b/test/parallel/test-util-styletext.js index b87c5d7e82c74c..3db01bec1c3acd 100644 --- a/test/parallel/test-util-styletext.js +++ b/test/parallel/test-util-styletext.js @@ -22,12 +22,12 @@ const noChange = 'test'; util.styleText(invalidOption, 'test'); }, { code: 'ERR_INVALID_ARG_VALUE', - }); + }, invalidOption); assert.throws(() => { util.styleText('red', invalidOption); }, { code: 'ERR_INVALID_ARG_TYPE' - }); + }, invalidOption); }); assert.throws(() => { @@ -41,6 +41,16 @@ assert.strictEqual( '\u001b[31mtest\u001b[39m', ); +assert.strictEqual( + util.styleText('gray', 'test', { validateStream: false }), + '\u001b[90mtest\u001b[39m', +); + +assert.strictEqual( + util.styleText('grey', 'test', { validateStream: false }), + '\u001b[90mtest\u001b[39m', +); + assert.strictEqual( util.styleText(['bold', 'red'], 'test', { validateStream: false }), '\u001b[1m\u001b[31mtest\u001b[39m\u001b[22m', @@ -144,6 +154,29 @@ assert.throws(() => { code: 'ERR_INVALID_ARG_TYPE', }); +// Color aliases should be accepted (e.g. 'grey' is an alias for 'gray') +// See https://github.com/nodejs/node/issues/62177 +assert.strictEqual( + util.styleText('grey', 'test', { validateStream: false }), + util.styleText('gray', 'test', { validateStream: false }), +); +assert.strictEqual( + util.styleText('bgGrey', 'test', { validateStream: false }), + util.styleText('bgGray', 'test', { validateStream: false }), +); +assert.strictEqual( + util.styleText('blackBright', 'test', { validateStream: false }), + util.styleText('gray', 'test', { validateStream: false }), +); +assert.strictEqual( + util.styleText('faint', 'test', { validateStream: false }), + util.styleText('dim', 'test', { validateStream: false }), +); +assert.strictEqual( + util.styleText(['grey', 'bold'], 'test', { validateStream: false }), + util.styleText(['gray', 'bold'], 'test', { validateStream: false }), +); + // does not throw util.styleText('red', 'text', { stream: {}, validateStream: false }); diff --git a/test/parallel/test-util.js b/test/parallel/test-util.js index 1ecddc829a0fdb..ad6c8142b27d0b 100644 --- a/test/parallel/test-util.js +++ b/test/parallel/test-util.js @@ -87,3 +87,13 @@ assert.throws(() => { message: 'The "str" argument must be of type string.' + common.invalidArgTypeHelper({}) }); + +// stripVTControlCharacters: fast path returns input when no ANSI codes +assert.strictEqual(util.stripVTControlCharacters('hello'), 'hello'); +assert.strictEqual(util.stripVTControlCharacters(''), ''); + +// stripVTControlCharacters: strips 7-bit ESC sequences +assert.strictEqual(util.stripVTControlCharacters('\u001B[31mfoo\u001B[39m'), 'foo'); + +// stripVTControlCharacters: strips 8-bit CSI sequences +assert.strictEqual(util.stripVTControlCharacters('\u009B31mfoo\u009B39m'), 'foo'); diff --git a/test/parallel/test-webcrypto-aead-decrypt-detached-buffer.js b/test/parallel/test-webcrypto-aead-decrypt-detached-buffer.js new file mode 100644 index 00000000000000..a96e709095430f --- /dev/null +++ b/test/parallel/test-webcrypto-aead-decrypt-detached-buffer.js @@ -0,0 +1,42 @@ +'use strict'; + +const common = require('../common'); + +if (!common.hasCrypto) + common.skip('missing crypto'); + +const assert = require('assert'); +const { hasOpenSSL } = require('../common/crypto'); +const { subtle } = globalThis.crypto; + +async function test(algorithmName, keyLength, ivLength, format = 'raw') { + const key = await subtle.importKey( + format, + new Uint8Array(keyLength), + { name: algorithmName }, + false, + ['encrypt', 'decrypt'], + ); + + const data = new Uint8Array(32); + data.buffer.transfer(); + + await assert.rejects( + subtle.decrypt({ name: algorithmName, iv: new Uint8Array(ivLength) }, key, data), + { name: 'OperationError' }, + ); +} + +const tests = [ + test('AES-GCM', 32, 12), +]; + +if (hasOpenSSL(3)) { + tests.push(test('AES-OCB', 32, 12, 'raw-secret')); +} + +if (!process.features.openssl_is_boringssl) { + tests.push(test('ChaCha20-Poly1305', 32, 12, 'raw-secret')); +} + +Promise.all(tests).then(common.mustCall()); diff --git a/test/parallel/test-webcrypto-encrypt-decrypt-chacha20-poly1305.js b/test/parallel/test-webcrypto-encrypt-decrypt-chacha20-poly1305.js index aea9528f2463db..5362484288089d 100644 --- a/test/parallel/test-webcrypto-encrypt-decrypt-chacha20-poly1305.js +++ b/test/parallel/test-webcrypto-encrypt-decrypt-chacha20-poly1305.js @@ -189,7 +189,7 @@ async function testDecrypt({ keyBuffer, algorithm, result }) { const iv = globalThis.crypto.getRandomValues(new Uint8Array(12)); await assert.rejects( subtle.decrypt({ name: 'ChaCha20-Poly1305', iv }, secretKey, new Uint8Array(8)), - { name: 'OperationError', message: /The provided data is too small/ } + { name: 'OperationError' } ); // Test invalid tagLength values diff --git a/test/parallel/test-webcrypto-export-import-ml-dsa.js b/test/parallel/test-webcrypto-export-import-ml-dsa.js index 38d619eb8c00ec..ceb652955d5929 100644 --- a/test/parallel/test-webcrypto-export-import-ml-dsa.js +++ b/test/parallel/test-webcrypto-export-import-ml-dsa.js @@ -12,6 +12,7 @@ if (!hasOpenSSL(3, 5)) const assert = require('assert'); const { subtle } = globalThis.crypto; +const { createPrivateKey } = require('crypto'); const fixtures = require('../common/fixtures'); @@ -196,41 +197,32 @@ async function testImportPkcs8SeedOnly({ name, privateUsages }, extractable) { } async function testImportPkcs8PrivOnly({ name, privateUsages }, extractable) { - const key = await subtle.importKey( - 'pkcs8', - keyData[name].pkcs8_priv_only, - { name }, - extractable, - privateUsages); - assert.strictEqual(key.type, 'private'); - assert.strictEqual(key.extractable, extractable); - assert.deepStrictEqual(key.usages, privateUsages); - assert.deepStrictEqual(key.algorithm.name, name); - assert.strictEqual(key.algorithm, key.algorithm); - assert.strictEqual(key.usages, key.usages); - - if (extractable) { - await assert.rejects(subtle.exportKey('pkcs8', key), (err) => { - assert.strictEqual(err.name, 'OperationError'); - assert.strictEqual(err.cause.code, 'ERR_CRYPTO_OPERATION_FAILED'); - assert.strictEqual(err.cause.message, 'Failed to get raw seed'); - return true; + await assert.rejects( + subtle.importKey( + 'pkcs8', + keyData[name].pkcs8_priv_only, + { name }, + extractable, + privateUsages), + { + name: 'NotSupportedError', + message: 'Importing an ML-DSA PKCS#8 key without a seed is not supported', }); - } else { - await assert.rejects( - subtle.exportKey('pkcs8', key), { - message: /key is not extractable/ - }); - } +} +async function testImportPkcs8MismatchedSeed({ name, privateUsages }, extractable) { + const modified = Buffer.from(keyData[name].pkcs8); + modified[30] ^= 0xff; await assert.rejects( subtle.importKey( 'pkcs8', - keyData[name].pkcs8_seed_only, + modified, { name }, extractable, - [/* empty usages */]), - { name: 'SyntaxError', message: 'Usages cannot be empty when importing a private key.' }); + privateUsages), + { + name: 'DataError', + }); } async function testImportJwk({ name, publicUsages, privateUsages }, extractable) { @@ -493,6 +485,7 @@ async function testImportRawSeed({ name, privateUsages }, extractable) { tests.push(testImportPkcs8(vector, extractable)); tests.push(testImportPkcs8SeedOnly(vector, extractable)); tests.push(testImportPkcs8PrivOnly(vector, extractable)); + tests.push(testImportPkcs8MismatchedSeed(vector, extractable)); tests.push(testImportJwk(vector, extractable)); tests.push(testImportRawSeed(vector, extractable)); tests.push(testImportRawPublic(vector, extractable)); @@ -509,3 +502,17 @@ async function testImportRawSeed({ name, privateUsages }, extractable) { message: 'Unable to import ML-DSA-44 using raw format', }); })().then(common.mustCall()); + +(async function() { + for (const { name, privateUsages } of testVectors) { + const pem = fixtures.readKey(getKeyFileName(name.toLowerCase(), 'private_priv_only'), 'ascii'); + const keyObject = createPrivateKey(pem); + const key = keyObject.toCryptoKey({ name }, true, privateUsages); + await assert.rejects(subtle.exportKey('pkcs8', key), (err) => { + assert.strictEqual(err.name, 'OperationError'); + assert.strictEqual(err.cause.code, 'ERR_CRYPTO_OPERATION_FAILED'); + assert.strictEqual(err.cause.message, 'Failed to get raw seed'); + return true; + }); + } +})().then(common.mustCall()); diff --git a/test/parallel/test-webcrypto-export-import-ml-kem.js b/test/parallel/test-webcrypto-export-import-ml-kem.js index c927b5571a69da..c33eb2b5993156 100644 --- a/test/parallel/test-webcrypto-export-import-ml-kem.js +++ b/test/parallel/test-webcrypto-export-import-ml-kem.js @@ -12,6 +12,7 @@ if (!hasOpenSSL(3, 5)) const assert = require('assert'); const { subtle } = globalThis.crypto; +const { createPrivateKey } = require('crypto'); const fixtures = require('../common/fixtures'); @@ -179,41 +180,32 @@ async function testImportPkcs8SeedOnly({ name, privateUsages }, extractable) { } async function testImportPkcs8PrivOnly({ name, privateUsages }, extractable) { - const key = await subtle.importKey( - 'pkcs8', - keyData[name].pkcs8_priv_only, - { name }, - extractable, - privateUsages); - assert.strictEqual(key.type, 'private'); - assert.strictEqual(key.extractable, extractable); - assert.deepStrictEqual(key.usages, privateUsages); - assert.deepStrictEqual(key.algorithm.name, name); - assert.strictEqual(key.algorithm, key.algorithm); - assert.strictEqual(key.usages, key.usages); - - if (extractable) { - await assert.rejects(subtle.exportKey('pkcs8', key), (err) => { - assert.strictEqual(err.name, 'OperationError'); - assert.strictEqual(err.cause.code, 'ERR_CRYPTO_OPERATION_FAILED'); - assert.strictEqual(err.cause.message, 'Failed to get raw seed'); - return true; + await assert.rejects( + subtle.importKey( + 'pkcs8', + keyData[name].pkcs8_priv_only, + { name }, + extractable, + privateUsages), + { + name: 'NotSupportedError', + message: 'Importing an ML-KEM PKCS#8 key without a seed is not supported', }); - } else { - await assert.rejects( - subtle.exportKey('pkcs8', key), { - message: /key is not extractable/ - }); - } +} +async function testImportPkcs8MismatchedSeed({ name, privateUsages }, extractable) { + const modified = Buffer.from(keyData[name].pkcs8); + modified[30] ^= 0xff; await assert.rejects( subtle.importKey( 'pkcs8', - keyData[name].pkcs8_seed_only, + modified, { name }, extractable, - [/* empty usages */]), - { name: 'SyntaxError', message: 'Usages cannot be empty when importing a private key.' }); + privateUsages), + { + name: 'DataError', + }); } async function testImportRawPublic({ name, publicUsages }, extractable) { @@ -298,6 +290,7 @@ async function testImportRawSeed({ name, privateUsages }, extractable) { tests.push(testImportPkcs8(vector, extractable)); tests.push(testImportPkcs8SeedOnly(vector, extractable)); tests.push(testImportPkcs8PrivOnly(vector, extractable)); + tests.push(testImportPkcs8MismatchedSeed(vector, extractable)); tests.push(testImportRawSeed(vector, extractable)); tests.push(testImportRawPublic(vector, extractable)); } @@ -313,3 +306,17 @@ async function testImportRawSeed({ name, privateUsages }, extractable) { message: 'Unable to import ML-KEM-512 using raw format', }); })().then(common.mustCall()); + +(async function() { + for (const { name, privateUsages } of testVectors) { + const pem = fixtures.readKey(getKeyFileName(name.toLowerCase(), 'private_priv_only'), 'ascii'); + const keyObject = createPrivateKey(pem); + const key = keyObject.toCryptoKey({ name }, true, privateUsages); + await assert.rejects(subtle.exportKey('pkcs8', key), (err) => { + assert.strictEqual(err.name, 'OperationError'); + assert.strictEqual(err.cause.code, 'ERR_CRYPTO_OPERATION_FAILED'); + assert.strictEqual(err.cause.message, 'Failed to get raw seed'); + return true; + }); + } +})().then(common.mustCall()); diff --git a/test/parallel/test-webcrypto-export-import.js b/test/parallel/test-webcrypto-export-import.js index faf7aef01a1844..6c8f36a62eccb3 100644 --- a/test/parallel/test-webcrypto-export-import.js +++ b/test/parallel/test-webcrypto-export-import.js @@ -435,3 +435,11 @@ if (!process.features.openssl_is_boringssl) { subtle.importKey('jwk', jwk, { name: 'HMAC', hash: 'SHA3-256' }, false, ['sign', 'verify']).then(common.mustCall()); } } + +{ + const keyData = new Uint8Array(32); + assert.rejects( + subtle.importKey('raw', keyData, { name: 'HMAC', hash: 'SHA-256' }, false), + { code: 'ERR_MISSING_ARGS' } + ).then(common.mustCall()); +} diff --git a/test/parallel/test-webcrypto-promise-prototype-pollution.mjs b/test/parallel/test-webcrypto-promise-prototype-pollution.mjs new file mode 100644 index 00000000000000..b4fbedba5e3242 --- /dev/null +++ b/test/parallel/test-webcrypto-promise-prototype-pollution.mjs @@ -0,0 +1,95 @@ +import * as common from '../common/index.mjs'; + +if (!common.hasCrypto) common.skip('missing crypto'); + +// WebCrypto subtle methods must not leak intermediate values +// through Promise.prototype.then pollution. +// Regression test for https://github.com/nodejs/node/pull/61492 +// and https://github.com/nodejs/node/issues/59699. + +import { hasOpenSSL } from '../common/crypto.js'; + +const { subtle } = globalThis.crypto; + +Promise.prototype.then = common.mustNotCall('Promise.prototype.then'); + +await subtle.digest('SHA-256', new Uint8Array([1, 2, 3])); + +await subtle.generateKey({ name: 'AES-CBC', length: 256 }, true, ['encrypt', 'decrypt']); + +await subtle.generateKey({ name: 'ECDSA', namedCurve: 'P-256' }, true, ['sign', 'verify']); + +const rawKey = globalThis.crypto.getRandomValues(new Uint8Array(32)); + +const importedKey = await subtle.importKey( + 'raw', rawKey, { name: 'AES-CBC', length: 256 }, false, ['encrypt', 'decrypt']); + +const exportableKey = await subtle.importKey( + 'raw', rawKey, { name: 'AES-CBC', length: 256 }, true, ['encrypt', 'decrypt']); + +await subtle.exportKey('raw', exportableKey); + +const iv = globalThis.crypto.getRandomValues(new Uint8Array(16)); +const plaintext = new TextEncoder().encode('Hello, world!'); + +const ciphertext = await subtle.encrypt({ name: 'AES-CBC', iv }, importedKey, plaintext); + +await subtle.decrypt({ name: 'AES-CBC', iv }, importedKey, ciphertext); + +const signingKey = await subtle.generateKey( + { name: 'HMAC', hash: 'SHA-256' }, false, ['sign', 'verify']); + +const data = new TextEncoder().encode('test data'); + +const signature = await subtle.sign('HMAC', signingKey, data); + +await subtle.verify('HMAC', signingKey, signature, data); + +const pbkdf2Key = await subtle.importKey( + 'raw', rawKey, 'PBKDF2', false, ['deriveBits', 'deriveKey']); + +await subtle.deriveBits( + { name: 'PBKDF2', salt: rawKey, iterations: 1000, hash: 'SHA-256' }, + pbkdf2Key, 256); + +await subtle.deriveKey( + { name: 'PBKDF2', salt: rawKey, iterations: 1000, hash: 'SHA-256' }, + pbkdf2Key, + { name: 'AES-CBC', length: 256 }, + true, + ['encrypt', 'decrypt']); + +const wrappingKey = await subtle.generateKey( + { name: 'AES-KW', length: 256 }, true, ['wrapKey', 'unwrapKey']); + +const keyToWrap = await subtle.generateKey( + { name: 'AES-CBC', length: 256 }, true, ['encrypt', 'decrypt']); + +const wrapped = await subtle.wrapKey('raw', keyToWrap, wrappingKey, 'AES-KW'); + +await subtle.unwrapKey( + 'raw', wrapped, wrappingKey, 'AES-KW', + { name: 'AES-CBC', length: 256 }, true, ['encrypt', 'decrypt']); + +const { privateKey } = await subtle.generateKey( + { name: 'ECDSA', namedCurve: 'P-256' }, true, ['sign', 'verify']); + +await subtle.getPublicKey(privateKey, ['verify']); + +if (hasOpenSSL(3, 5)) { + const kemPair = await subtle.generateKey( + { name: 'ML-KEM-768' }, false, + ['encapsulateKey', 'encapsulateBits', 'decapsulateKey', 'decapsulateBits']); + + const { ciphertext: ct1 } = await subtle.encapsulateKey( + { name: 'ML-KEM-768' }, kemPair.publicKey, 'HKDF', false, ['deriveBits']); + + await subtle.decapsulateKey( + { name: 'ML-KEM-768' }, kemPair.privateKey, ct1, 'HKDF', false, ['deriveBits']); + + const { ciphertext: ct2 } = await subtle.encapsulateBits( + { name: 'ML-KEM-768' }, kemPair.publicKey); + + await subtle.decapsulateBits( + { name: 'ML-KEM-768' }, kemPair.privateKey, ct2); +} diff --git a/test/parallel/test-webcrypto-util.js b/test/parallel/test-webcrypto-util.js index b8d5361433fd0e..89d8575e20ddbd 100644 --- a/test/parallel/test-webcrypto-util.js +++ b/test/parallel/test-webcrypto-util.js @@ -17,3 +17,35 @@ const { assert.strictEqual(normalizeAlgorithm(algorithm, 'sign') !== algorithm, true); assert.deepStrictEqual(algorithm, { name: 'ECDSA', hash: 'SHA-256' }); } + +// The algorithm name getter should only be invoked once during +// normalizeAlgorithm, including for algorithms with a non-null desiredType +// where step 6 runs the specialized dictionary converter. +// Refs: https://github.com/web-platform-tests/wpt/pull/57614#pullrequestreview-3808145365 +{ + let nameReadCount = 0; + const algorithm = { + get name() { + nameReadCount++; + return 'AES-GCM'; + }, + iv: new Uint8Array(12), + }; + const normalized = normalizeAlgorithm(algorithm, 'encrypt'); + assert.strictEqual(normalized.name, 'AES-GCM'); + assert.strictEqual(nameReadCount, 1); +} + +{ + let nameReadCount = 0; + const algorithm = { + get name() { + nameReadCount++; + return 'ECDSA'; + }, + hash: 'SHA-256', + }; + const normalized = normalizeAlgorithm(algorithm, 'sign'); + assert.strictEqual(normalized.name, 'ECDSA'); + assert.strictEqual(nameReadCount, 1); +} diff --git a/test/parallel/test-webstreams-adapters-sync-write-error.js b/test/parallel/test-webstreams-adapters-sync-write-error.js new file mode 100644 index 00000000000000..748f682365ee93 --- /dev/null +++ b/test/parallel/test-webstreams-adapters-sync-write-error.js @@ -0,0 +1,79 @@ +'use strict'; +// Flags: --no-warnings --expose-internals +require('../common'); +const assert = require('assert'); +const test = require('node:test'); +const { Duplex, Writable } = require('stream'); +const { + newWritableStreamFromStreamWritable, + newReadableWritablePairFromDuplex, +} = require('internal/webstreams/adapters'); + +// Verify that when the underlying Node.js stream throws synchronously from +// write(), the writable web stream properly rejects but does not destroy +// the stream (destroy-on-sync-throw is only used internally by +// CompressionStream/DecompressionStream). + +test('WritableStream from Node.js stream handles sync write throw', async () => { + const error = new TypeError('invalid chunk'); + const writable = new Writable({ + write() { + throw error; + }, + }); + + const ws = newWritableStreamFromStreamWritable(writable); + const writer = ws.getWriter(); + + await assert.rejects(writer.write('bad'), (err) => { + assert.strictEqual(err, error); + return true; + }); + + // Standalone writable should not be destroyed on sync write error + assert.strictEqual(writable.destroyed, false); +}); + +test('Duplex-backed pair does NOT destroy on sync write throw', async () => { + const error = new TypeError('invalid chunk'); + const duplex = new Duplex({ + read() {}, + write() { + throw error; + }, + }); + + const { writable, readable } = newReadableWritablePairFromDuplex(duplex); + const writer = writable.getWriter(); + + await assert.rejects(writer.write('bad'), (err) => { + assert.strictEqual(err, error); + return true; + }); + + // A plain Duplex should NOT be destroyed on sync write error + assert.strictEqual(duplex.destroyed, false); + + // The readable side should still be usable + const reader = readable.getReader(); + reader.cancel(); +}); + +test('WritableStream from Node.js stream - valid writes still work', async () => { + const chunks = []; + const writable = new Writable({ + write(chunk, _encoding, cb) { + chunks.push(chunk); + cb(); + }, + }); + + const ws = newWritableStreamFromStreamWritable(writable); + const writer = ws.getWriter(); + + await writer.write(Buffer.from('hello')); + await writer.write(Buffer.from(' world')); + await writer.close(); + + assert.strictEqual(Buffer.concat(chunks).toString(), 'hello world'); +}); diff --git a/test/parallel/test-webstreams-compression-bad-chunks.js b/test/parallel/test-webstreams-compression-bad-chunks.js new file mode 100644 index 00000000000000..4a8ca3cff8a27f --- /dev/null +++ b/test/parallel/test-webstreams-compression-bad-chunks.js @@ -0,0 +1,75 @@ +'use strict'; +require('../common'); +const assert = require('assert'); +const test = require('node:test'); +const { CompressionStream, DecompressionStream } = require('stream/web'); + +// Verify that writing invalid (non-BufferSource) chunks to +// CompressionStream and DecompressionStream properly rejects +// on both the write and the read side, instead of hanging. + +const badChunks = [ + { name: 'undefined', value: undefined, code: 'ERR_INVALID_ARG_TYPE' }, + { name: 'null', value: null, code: 'ERR_STREAM_NULL_VALUES' }, + { name: 'number', value: 3.14, code: 'ERR_INVALID_ARG_TYPE' }, + { name: 'object', value: {}, code: 'ERR_INVALID_ARG_TYPE' }, + { name: 'array', value: [65], code: 'ERR_INVALID_ARG_TYPE' }, + { + name: 'SharedArrayBuffer', + value: new SharedArrayBuffer(1), + code: 'ERR_INVALID_ARG_TYPE', + }, + { + name: 'Uint8Array backed by SharedArrayBuffer', + value: new Uint8Array(new SharedArrayBuffer(1)), + code: 'ERR_INVALID_ARG_TYPE', + }, +]; + +for (const format of ['deflate', 'deflate-raw', 'gzip', 'brotli']) { + for (const { name, value, code } of badChunks) { + const expected = { name: 'TypeError', code }; + + test(`CompressionStream rejects bad chunk (${name}) for ${format}`, async () => { + const cs = new CompressionStream(format); + const writer = cs.writable.getWriter(); + const reader = cs.readable.getReader(); + + const writePromise = writer.write(value); + const readPromise = reader.read(); + + await assert.rejects(writePromise, expected); + await assert.rejects(readPromise, expected); + }); + + test(`DecompressionStream rejects bad chunk (${name}) for ${format}`, async () => { + const ds = new DecompressionStream(format); + const writer = ds.writable.getWriter(); + const reader = ds.readable.getReader(); + + const writePromise = writer.write(value); + const readPromise = reader.read(); + + await assert.rejects(writePromise, expected); + await assert.rejects(readPromise, expected); + }); + } +} + +// Verify that decompression errors (e.g. corrupt data) are surfaced as +// TypeError, not plain Error, per the Compression Streams spec. +for (const format of ['deflate', 'deflate-raw', 'gzip', 'brotli']) { + test(`DecompressionStream surfaces corrupt data as TypeError for ${format}`, async () => { + const ds = new DecompressionStream(format); + const writer = ds.writable.getWriter(); + const reader = ds.readable.getReader(); + + const corruptData = new Uint8Array([0, 1, 2, 3, 4, 5]); + + writer.write(corruptData).catch(() => {}); + reader.read().catch(() => {}); + + await assert.rejects(writer.close(), { name: 'TypeError' }); + await assert.rejects(reader.closed, { name: 'TypeError' }); + }); +} diff --git a/test/parallel/test-webstreams-compression-buffer-source.js b/test/parallel/test-webstreams-compression-buffer-source.js new file mode 100644 index 00000000000000..3304a8e64f3175 --- /dev/null +++ b/test/parallel/test-webstreams-compression-buffer-source.js @@ -0,0 +1,42 @@ +'use strict'; +require('../common'); +const assert = require('assert'); +const test = require('node:test'); +const { DecompressionStream, CompressionStream } = require('stream/web'); + +// Minimal gzip-compressed bytes for "hello" +const compressedGzip = new Uint8Array([ + 31, 139, 8, 0, 0, 0, 0, 0, 0, 3, + 203, 72, 205, 201, 201, 7, 0, 134, 166, 16, 54, 5, 0, 0, 0, +]); + +test('DecompressionStream accepts ArrayBuffer chunks', async () => { + const ds = new DecompressionStream('gzip'); + const writer = ds.writable.getWriter(); + + const writePromise = writer.write(compressedGzip.buffer); + writer.close(); + + const chunks = await Array.fromAsync(ds.readable); + await writePromise; + const out = Buffer.concat(chunks.map((c) => Buffer.from(c))); + assert.strictEqual(out.toString(), 'hello'); +}); + +test('CompressionStream round-trip with ArrayBuffer input', async () => { + const cs = new CompressionStream('gzip'); + const ds = new DecompressionStream('gzip'); + + const csWriter = cs.writable.getWriter(); + + const input = new TextEncoder().encode('hello').buffer; + + await csWriter.write(input); + csWriter.close(); + + await cs.readable.pipeTo(ds.writable); + + const out = await Array.fromAsync(ds.readable); + const result = Buffer.concat(out.map((c) => Buffer.from(c))); + assert.strictEqual(result.toString(), 'hello'); +}); diff --git a/test/parallel/test-webstreams-decompression-reject-trailing.js b/test/parallel/test-webstreams-decompression-reject-trailing.js new file mode 100644 index 00000000000000..3efc97578e42f7 --- /dev/null +++ b/test/parallel/test-webstreams-decompression-reject-trailing.js @@ -0,0 +1,86 @@ +'use strict'; +require('../common'); +const assert = require('assert'); +const test = require('node:test'); +const { CompressionStream, DecompressionStream } = require('stream/web'); + +// Verify that DecompressionStream rejects trailing data after a valid +// compressed payload for all four supported formats (deflate, deflate-raw, gzip, brotli). + +const input = Buffer.from('hello'); +const trailingJunk = Buffer.from([0xDE, 0xAD]); + +async function compress(format, data) { + const cs = new CompressionStream(format); + const writer = cs.writable.getWriter(); + writer.write(data); + writer.close(); + const chunks = await Array.fromAsync(cs.readable); + return Buffer.concat(chunks.map((c) => Buffer.from(c))); +} + +for (const format of ['deflate', 'deflate-raw', 'gzip', 'brotli']) { + test(`DecompressionStream rejects trailing junk for ${format}`, async () => { + const compressed = await compress(format, input); + const withJunk = Buffer.concat([compressed, trailingJunk]); + + const ds = new DecompressionStream(format); + const writer = ds.writable.getWriter(); + const reader = ds.readable.getReader(); + + writer.write(withJunk).catch(() => {}); + writer.close().catch(() => {}); + + await assert.rejects(async () => { + const chunks = []; + while (true) { + const { done, value } = await reader.read(); + if (done) break; + chunks.push(value); + } + }, (err) => { + assert(err instanceof Error, `Expected Error, got ${err?.constructor?.name}`); + return true; + }); + }); + + test(`DecompressionStream accepts valid ${format} data without trailing junk`, async () => { + const compressed = await compress(format, input); + + const ds = new DecompressionStream(format); + const writer = ds.writable.getWriter(); + + writer.write(compressed); + writer.close(); + + const chunks = await Array.fromAsync(ds.readable); + const result = Buffer.concat(chunks.map((c) => Buffer.from(c))); + assert.strictEqual(result.toString(), 'hello'); + }); +} + +// Extra: Verify that trailing data is also rejected when passed as a separate +// chunk after the valid compressed data has been fully written. +for (const format of ['deflate', 'deflate-raw', 'gzip', 'brotli']) { + test(`DecompressionStream rejects trailing junk as separate chunk for ${format}`, async () => { + const compressed = await compress(format, input); + + const ds = new DecompressionStream(format); + const writer = ds.writable.getWriter(); + const reader = ds.readable.getReader(); + + writer.write(compressed).catch(() => {}); + writer.write(trailingJunk).catch(() => {}); + writer.close().catch(() => {}); + + await assert.rejects(async () => { + while (true) { + const { done } = await reader.read(); + if (done) break; + } + }, (err) => { + assert(err instanceof Error, `Expected Error, got ${err?.constructor?.name}`); + return true; + }); + }); +} diff --git a/test/parallel/test-whatwg-transformstream-cancel-write-race.js b/test/parallel/test-whatwg-transformstream-cancel-write-race.js new file mode 100644 index 00000000000000..5c32a25b9246f9 --- /dev/null +++ b/test/parallel/test-whatwg-transformstream-cancel-write-race.js @@ -0,0 +1,51 @@ +'use strict'; + +require('../common'); +const { test } = require('node:test'); +const assert = require('node:assert'); +const { TransformStream } = require('stream/web'); +const { setTimeout } = require('timers/promises'); + +// https://github.com/nodejs/node/issues/62036 + +test('Late write racing with reader.cancel() should not throw an internal TypeError', async () => { + const stream = new TransformStream({ + transform(chunk, controller) { + controller.enqueue(chunk); + }, + }); + + await setTimeout(0); + + const reader = stream.readable.getReader(); + const writer = stream.writable.getWriter(); + + // Release backpressure. + const pendingRead = reader.read(); + + // Simulate client disconnect / shutdown. + const pendingCancel = reader.cancel(new Error('client disconnected')); + + // Late write racing with cancel. + const pendingLateWrite = writer.write('late-write'); + + const [ + readResult, + cancelResult, + lateWriteResult, + ] = await Promise.allSettled([ + pendingRead, + pendingCancel, + pendingLateWrite, + ]); + + assert.strictEqual(readResult.status, 'fulfilled'); + assert.strictEqual(cancelResult.status, 'fulfilled'); + if (lateWriteResult.status === 'rejected') { + const err = lateWriteResult.reason; + const isNotAFunction = err instanceof TypeError && + /transformAlgorithm is not a function/.test(err.message); + assert.ok(!isNotAFunction, + `Internal implementation error leaked: ${err.message}`); + } +}); diff --git a/test/parallel/test-whatwg-webstreams-adapters-to-writablestream.js b/test/parallel/test-whatwg-webstreams-adapters-to-writablestream.js index 1527610c513333..23e6319563daa0 100644 --- a/test/parallel/test-whatwg-webstreams-adapters-to-writablestream.js +++ b/test/parallel/test-whatwg-webstreams-adapters-to-writablestream.js @@ -165,3 +165,35 @@ class TestWritable extends Writable { const writer = writableStream.getWriter(); writer.closed.then(common.mustCall()); } + +{ + const duplex = new PassThrough(); + const writableStream = newWritableStreamFromStreamWritable(duplex); + const ec = new TextEncoder(); + const arrayBuffer = ec.encode('hello').buffer; + writableStream + .getWriter() + .write(arrayBuffer) + .then(common.mustCall()); + + duplex.on('data', common.mustCall((chunk) => { + assert(chunk instanceof Buffer); + assert(chunk.equals(Buffer.from('hello'))); + })); +} + +{ + const duplex = new PassThrough({ objectMode: true }); + const writableStream = newWritableStreamFromStreamWritable(duplex); + const ec = new TextEncoder(); + const arrayBuffer = ec.encode('hello').buffer; + writableStream + .getWriter() + .write(arrayBuffer) + .then(common.mustCall()); + + duplex.on('data', common.mustCall((chunk) => { + assert(chunk instanceof ArrayBuffer); + assert.strictEqual(chunk, arrayBuffer); + })); +} diff --git a/test/parallel/test-worker-cwd-race-condition.js b/test/parallel/test-worker-cwd-race-condition.js new file mode 100644 index 00000000000000..19394c85f0d1c4 --- /dev/null +++ b/test/parallel/test-worker-cwd-race-condition.js @@ -0,0 +1,70 @@ +// Flags: --expose-internals --no-warnings +'use strict'; + +const common = require('../common'); +const { isMainThread } = require('worker_threads'); + +if (!isMainThread) { + common.skip('process.chdir is not available in Workers'); +} + +const { internalBinding } = require('internal/test/binding'); + +const assert = require('assert'); +const { Worker } = require('worker_threads'); + +const processBinding = internalBinding('process_methods'); +const originalChdir = processBinding.chdir; + +const cwdOriginal = process.cwd(); +const i32 = new Int32Array(new SharedArrayBuffer(12)); + +processBinding.chdir = common.mustCall(function chdir(path) { + // Signal to the worker that we're inside the chdir call + Atomics.store(i32, 0, 1); + Atomics.notify(i32, 0); + + // Pause the chdir call while the worker calls process.cwd(), + // to simulate a race condition + Atomics.wait(i32, 1, 0); + + return originalChdir(path); +}); + +const worker = new Worker(` + const { + parentPort, + workerData: { i32 }, + } = require('worker_threads'); + + // Wait until the main thread has entered the chdir call + Atomics.wait(i32, 0, 0); + + const cwdDuringChdir = process.cwd(); + + // Signal the main thread to continue the chdir call + Atomics.store(i32, 1, 1); + Atomics.notify(i32, 1); + + // Wait until the main thread has left the chdir call + Atomics.wait(i32, 2, 0); + + const cwdAfterChdir = process.cwd(); + parentPort.postMessage({ cwdDuringChdir, cwdAfterChdir }); +`, { + eval: true, + workerData: { i32 }, +}); + +worker.on('exit', common.mustCall()); +worker.on('error', common.mustNotCall()); +worker.on('message', common.mustCall(({ cwdDuringChdir, cwdAfterChdir }) => { + assert.strictEqual(cwdDuringChdir, cwdOriginal); + assert.strictEqual(cwdAfterChdir, process.cwd()); +})); + +process.chdir('..'); + +// Signal to the worker that the chdir call is completed +Atomics.store(i32, 2, 1); +Atomics.notify(i32, 2); diff --git a/test/parallel/test-worker-safe-getters.js b/test/parallel/test-worker-safe-getters.js index 69856659a5773b..a22f92b3354a4b 100644 --- a/test/parallel/test-worker-safe-getters.js +++ b/test/parallel/test-worker-safe-getters.js @@ -29,6 +29,4 @@ if (isMainThread) { assert.strictEqual(w.stdout, stdout); assert.strictEqual(w.stderr, stderr); })); -} else { - process.exit(0); } diff --git a/test/parallel/test-worker-stdio-flush-inflight.js b/test/parallel/test-worker-stdio-flush-inflight.js index 34b81152811e7b..a51656ca1ec880 100644 --- a/test/parallel/test-worker-stdio-flush-inflight.js +++ b/test/parallel/test-worker-stdio-flush-inflight.js @@ -20,5 +20,4 @@ if (isMainThread) { process.stdout.write('hello'); process.stdout.write(' '); process.stdout.write('world'); - process.exit(0); } diff --git a/test/parallel/test-worker-thread-name.js b/test/parallel/test-worker-thread-name.js index 47e497b07b5164..541761b4e2d1b7 100644 --- a/test/parallel/test-worker-thread-name.js +++ b/test/parallel/test-worker-thread-name.js @@ -8,7 +8,6 @@ const name = 'test-worker-thread-name'; if (workerData?.isWorker) { assert.strictEqual(threadName, name); - process.exit(0); } else { const w = new Worker(__filename, { name, workerData: { isWorker: true } }); assert.strictEqual(w.threadName, name); diff --git a/test/parallel/test-zlib-brotli-dictionary.js b/test/parallel/test-zlib-brotli-dictionary.js new file mode 100644 index 00000000000000..1703a5e047041a --- /dev/null +++ b/test/parallel/test-zlib-brotli-dictionary.js @@ -0,0 +1,126 @@ +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const zlib = require('zlib'); + +const dictionary = Buffer.from( + `Lorem ipsum dolor sit amet, consectetur adipiscing elit. + Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.` +); + +const input = Buffer.from( + `Lorem ipsum dolor sit amet, consectetur adipiscing elit. + Lorem ipsum dolor sit amet, consectetur adipiscing elit. + Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.` +); + +// Test with convenience methods (async). +zlib.brotliCompress(input, { dictionary }, common.mustSucceed((compressed) => { + assert(compressed.length < input.length, + 'compressed data should be smaller with dictionary'); + zlib.brotliDecompress(compressed, { dictionary }, common.mustSucceed((decompressed) => { + assert.strictEqual(decompressed.toString(), input.toString()); + })); +})); + +// Test with streaming API. +{ + const encoder = zlib.createBrotliCompress({ dictionary }); + const decoder = zlib.createBrotliDecompress({ dictionary }); + + const chunks = []; + decoder.on('data', (chunk) => chunks.push(chunk)); + decoder.on('end', common.mustCall(() => { + const result = Buffer.concat(chunks); + assert.strictEqual(result.toString(), input.toString()); + })); + + encoder.pipe(decoder); + encoder.end(input); +} + +// Test that dictionary improves compression ratio. +{ + const withDict = zlib.brotliCompressSync(input, { dictionary }); + const withoutDict = zlib.brotliCompressSync(input); + + // Dictionary-based compression should be at least as good as without. + assert(withDict.length <= withoutDict.length, + `Dictionary compression (${withDict.length}) should not be ` + + `larger than non-dictionary compression (${withoutDict.length})`); + + // Verify decompression with dictionary works. + const decompressed = zlib.brotliDecompressSync(withDict, { dictionary }); + assert.strictEqual(decompressed.toString(), input.toString()); +} + +// Test that decompression without matching dictionary fails. +{ + const compressed = zlib.brotliCompressSync(input, { dictionary }); + assert.throws(() => { + zlib.brotliDecompressSync(compressed); + }, (err) => { + assert.match(err.code, /ERR_/); + return true; + }); +} + +// Test that decompression with wrong dictionary fails. +{ + const compressed = zlib.brotliCompressSync(input, { dictionary }); + const wrongDictionary = Buffer.from('this is the wrong dictionary'); + assert.throws(() => { + zlib.brotliDecompressSync(compressed, { dictionary: wrongDictionary }); + }, (err) => { + assert.match(err.code, /ERR_/); + return true; + }); +} + +// Test that dictionary works with ArrayBuffer (converted to Buffer). +{ + const arrayBufferDict = dictionary.buffer.slice( + dictionary.byteOffset, + dictionary.byteOffset + dictionary.byteLength, + ); + const compressed = zlib.brotliCompressSync(input, { dictionary: arrayBufferDict }); + const decompressed = zlib.brotliDecompressSync(compressed, { dictionary: arrayBufferDict }); + assert.strictEqual(decompressed.toString(), input.toString()); +} + +// Test that dictionary works with TypedArray (Uint8Array). +{ + const uint8Dict = new Uint8Array(dictionary); + const compressed = zlib.brotliCompressSync(input, { dictionary: uint8Dict }); + const decompressed = zlib.brotliDecompressSync(compressed, { dictionary: uint8Dict }); + assert.strictEqual(decompressed.toString(), input.toString()); +} + +// Test that invalid dictionary type throws ERR_INVALID_ARG_TYPE. +for (const invalidDict of ['string', 123, true, { object: true }, [1, 2, 3]]) { + assert.throws(() => { + zlib.createBrotliCompress({ dictionary: invalidDict }); + }, { code: 'ERR_INVALID_ARG_TYPE' }); + + assert.throws(() => { + zlib.createBrotliDecompress({ dictionary: invalidDict }); + }, { code: 'ERR_INVALID_ARG_TYPE' }); +} + +// Test with streaming API and wrong dictionary emits error event. +{ + const compressed = zlib.brotliCompressSync(input, { dictionary }); + const wrongDict = Buffer.from('wrong dictionary data'); + const decoder = zlib.createBrotliDecompress({ dictionary: wrongDict }); + + decoder.on('error', common.mustCall((err) => { + assert.match(err.code, /ERR_/); + })); + + decoder.write(compressed); + decoder.end(); +} diff --git a/test/parallel/test-zlib-reset-during-write.js b/test/parallel/test-zlib-reset-during-write.js new file mode 100644 index 00000000000000..35c4c853e5ea59 --- /dev/null +++ b/test/parallel/test-zlib-reset-during-write.js @@ -0,0 +1,23 @@ +'use strict'; +const common = require('../common'); +const assert = require('assert'); +const { createBrotliCompress, createDeflate } = require('zlib'); + +// Tests that calling .reset() while an async write is in progress +// throws an error instead of causing a use-after-free. + +for (const factory of [createBrotliCompress, createDeflate]) { + const stream = factory(); + const input = Buffer.alloc(1024, 0x41); + + stream.write(input, common.mustCall()); + stream.on('error', common.mustNotCall()); + + // The write has been dispatched to the thread pool. + // Calling reset while write is in progress must throw. + assert.throws(() => { + stream._handle.reset(); + }, { + message: 'Cannot reset zlib stream while a write is in progress', + }); +} diff --git a/test/sequential/test-watch-mode.mjs b/test/sequential/test-watch-mode.mjs index 4fb0f0acb377c3..a5cac129ad1c21 100644 --- a/test/sequential/test-watch-mode.mjs +++ b/test/sequential/test-watch-mode.mjs @@ -893,4 +893,33 @@ process.on('message', (message) => { await done(); } }); + + it('should respect the order for --env-file and --env-file-if-exists', async () => { + const envKey = `TEST_ENV_${Date.now()}`; + const jsFile = createTmpFile(`console.log('ENV: ' + process.env.${envKey});`); + + const envFile = createTmpFile(`${envKey}=base`, '.env'); + const envFileIfExists = createTmpFile(`${envKey}=override`, '.env'); + + const { done, restart } = runInBackground({ + args: [ + '--watch', + `--env-file=${envFile}`, + `--env-file-if-exists=${envFileIfExists}`, + jsFile, + ], + }); + + try { + const { stdout, stderr } = await restart(); + + assert.strictEqual(stderr, ''); + assert.deepStrictEqual(stdout, [ + 'ENV: override', + `Completed running ${inspect(jsFile)}. Waiting for file changes before restarting...`, + ]); + } finally { + await done(); + } + }); }); diff --git a/test/test-runner/test-output-coverage-with-mock-cjs.mjs b/test/test-runner/test-output-coverage-with-mock-cjs.mjs new file mode 100644 index 00000000000000..3f8152a5cdcd89 --- /dev/null +++ b/test/test-runner/test-output-coverage-with-mock-cjs.mjs @@ -0,0 +1,22 @@ +import * as common from '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +if (!process.features.inspector) { + common.skip('inspector support required'); +} + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/coverage-with-mock-cjs.mjs'), + defaultTransform, + { + flags: [ + '--disable-warning=ExperimentalWarning', + '--test-reporter=tap', + '--experimental-test-module-mocks', + '--experimental-test-coverage', + '--test-coverage-exclude=!test/**', + ], + }, +); diff --git a/test/test-runner/test-output-tap-escape.mjs b/test/test-runner/test-output-tap-escape.mjs index f0b4471d5158bb..794e0fe94558f3 100644 --- a/test/test-runner/test-output-tap-escape.mjs +++ b/test/test-runner/test-output-tap-escape.mjs @@ -3,15 +3,13 @@ import '../common/index.mjs'; import * as fixtures from '../common/fixtures.mjs'; import { spawnAndAssert, - transform, - replaceWindowsLineEndings, - replaceTestDuration, + defaultTransform, ensureCwdIsProjectRoot, } from '../common/assertSnapshot.js'; ensureCwdIsProjectRoot(); await spawnAndAssert( fixtures.path('test-runner/output/tap_escape.js'), - transform(replaceWindowsLineEndings, replaceTestDuration), + defaultTransform, { flags: ['--test-reporter=tap'] }, ); diff --git a/test/wpt/status/FileAPI/blob.cjs b/test/wpt/status/FileAPI/blob.cjs new file mode 100644 index 00000000000000..b59756abc70121 --- /dev/null +++ b/test/wpt/status/FileAPI/blob.cjs @@ -0,0 +1,59 @@ +'use strict'; + +const os = require('node:os'); + +// On AIX, V8's OS::DecommitPages() has an inherent race condition caused by +// AIX's non-POSIX MAP_FIXED behavior. The implementation must munmap() then +// mmap(), and another thread can steal the address range in between. The +// Blob.arrayBuffer() tests trigger this by creating enough GC pressure +// (especially the concurrent reads test) to hit the race window. +// See deps/v8/src/base/platform/platform-aix.cc, lines 168-203. +const isAIX = os.type() === 'AIX'; + +const conditionalSkips = {}; + +if (isAIX) { + conditionalSkips['Blob-array-buffer.any.js'] = { + skip: 'V8 DecommitPages race condition on AIX (munmap/mmap non-atomic)', + }; +} + +module.exports = { + ...conditionalSkips, + 'Blob-constructor-dom.window.js': { + skip: 'Depends on DOM API', + }, + 'Blob-constructor.any.js': { + fail: { + expected: [ + 'blobParts not an object: boolean with Boolean.prototype[Symbol.iterator]', + 'blobParts not an object: number with Number.prototype[Symbol.iterator]', + 'blobParts not an object: BigInt with BigInt.prototype[Symbol.iterator]', + 'blobParts not an object: Symbol with Symbol.prototype[Symbol.iterator]', + 'Getters and value conversions should happen in order until an exception is thrown.', + 'Arguments should be evaluated from left to right.', + ], + flaky: [ + 'Passing typed arrays as elements of the blobParts array should work.', + 'Passing a Float16Array as element of the blobParts array should work.', + 'Passing a Float64Array as element of the blobParts array should work.', + 'Passing BigInt typed arrays as elements of the blobParts array should work.', + ], + }, + }, + 'Blob-in-worker.worker.js': { + skip: 'Depends on Web Workers API', + }, + 'Blob-slice.any.js': { + fail: { + expected: [ + 'Slicing test: slice (1,1).', + 'Slicing test: slice (1,3).', + 'Slicing test: slice (1,5).', + 'Slicing test: slice (1,7).', + 'Slicing test: slice (1,8).', + 'Slicing test: slice (1,9).', + ], + }, + }, +}; diff --git a/test/wpt/status/FileAPI/blob.json b/test/wpt/status/FileAPI/blob.json deleted file mode 100644 index 8ea03bbc019992..00000000000000 --- a/test/wpt/status/FileAPI/blob.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "Blob-constructor-dom.window.js": { - "skip": "Depends on DOM API" - }, - "Blob-constructor.any.js": { - "fail": { - "note": "Depends on File API", - "expected": [ - "A plain object with @@iterator should be treated as a sequence for the blobParts argument.", - "A plain object with @@iterator and a length property should be treated as a sequence for the blobParts argument.", - "A String object should be treated as a sequence for the blobParts argument.", - "A Uint8Array object should be treated as a sequence for the blobParts argument.", - "Getters and value conversions should happen in order until an exception is thrown.", - "Changes to the blobParts array should be reflected in the returned Blob (pop).", - "Changes to the blobParts array should be reflected in the returned Blob (unshift).", - "ToString should be called on elements of the blobParts array.", - "ArrayBuffer elements of the blobParts array should be supported.", - "Passing typed arrays as elements of the blobParts array should work.", - "Passing a Float64Array as element of the blobParts array should work.", - "Passing BigInt typed arrays as elements of the blobParts array should work.", - "Array with two blobs", - "Array with two buffers", - "Array with two bufferviews", - "Array with mixed types", - "options properties should be accessed in lexicographic order.", - "Arguments should be evaluated from left to right.", - "Passing null (index 0) for options should use the defaults.", - "Passing null (index 0) for options should use the defaults (with newlines).", - "Passing undefined (index 1) for options should use the defaults.", - "Passing undefined (index 1) for options should use the defaults (with newlines).", - "Passing object \"[object Object]\" (index 2) for options should use the defaults.", - "Passing object \"[object Object]\" (index 2) for options should use the defaults (with newlines).", - "Passing object \"[object Object]\" (index 3) for options should use the defaults.", - "Passing object \"[object Object]\" (index 3) for options should use the defaults (with newlines).", - "Passing object \"/regex/\" (index 4) for options should use the defaults.", - "Passing object \"/regex/\" (index 4) for options should use the defaults (with newlines).", - "Passing function \"function() {}\" (index 5) for options should use the defaults.", - "Passing function \"function() {}\" (index 5) for options should use the defaults (with newlines)." - ] - } - }, - "Blob-in-worker.worker.js": { - "skip": "Depends on Web Workers API" - }, - "Blob-slice.any.js": { - "skip": "Depends on File API" - } -} diff --git a/test/wpt/status/WebCryptoAPI.cjs b/test/wpt/status/WebCryptoAPI.cjs index d14c617614af34..d7f2d4aca70f5d 100644 --- a/test/wpt/status/WebCryptoAPI.cjs +++ b/test/wpt/status/WebCryptoAPI.cjs @@ -53,8 +53,12 @@ const cshakeExpectedFailures = ['cSHAKE128', 'cSHAKE256'].flatMap((algorithm) => const base = `${algorithm} with ${length} bit output and ${size} source data`; return [ base, + ].concat(size !== 'empty' ? [ `${base} and altered buffer after call`, - ]; + `${base} and altered buffer during call`, + `${base} and transferred buffer after call`, + `${base} and transferred buffer during call`, + ] : []); }); }); }); @@ -71,8 +75,14 @@ const kmacVectorNames = [ const kmacExpectedFailures = kmacVectorNames.flatMap((name) => { return [ `${name} verification`, + `${name} verification with transferred signature during call`, + `${name} verification with transferred signature after call`, + `${name} verification with altered signature during call`, `${name} verification with altered signature after call`, + `${name} with altered plaintext during call`, `${name} with altered plaintext after call`, + `${name} with transferred plaintext during call`, + `${name} with transferred plaintext after call`, `${name} no verify usage`, `${name} round trip`, `${name} verification failure due to wrong plaintext`, diff --git a/test/wpt/status/compression.json b/test/wpt/status/compression.json index be073427810f0d..5c73f02a587176 100644 --- a/test/wpt/status/compression.json +++ b/test/wpt/status/compression.json @@ -1,14 +1,5 @@ { - "compression-bad-chunks.tentative.any.js": { - "skip": "Execution \"hangs\", ArrayBuffer and TypedArray is not accepted and throws, instead of rejects during writer.write" - }, - "decompression-bad-chunks.tentative.any.js": { - "skip": "Execution \"hangs\", ArrayBuffer and TypedArray is not accepted and throws, instead of rejects during writer.write" - }, - "decompression-buffersource.tentative.any.js": { - "skip": "ArrayBuffer and TypedArray is not accepted and throws, instead of rejects during writer.write" - }, - "compression-with-detach.tentative.window.js": { + "compression-with-detach.window.js": { "requires": ["crypto"] }, "idlharness-shadowrealm.window.js": { diff --git a/test/wpt/status/streams.json b/test/wpt/status/streams.json index af3646c65ea660..222a68014f4af6 100644 --- a/test/wpt/status/streams.json +++ b/test/wpt/status/streams.json @@ -2,14 +2,6 @@ "idlharness-shadowrealm.window.js": { "skip": "ShadowRealm support is not enabled" }, - "piping/general-addition.any.js": { - "fail": { - "note": "Blocked on https://github.com/whatwg/streams/issues/1243", - "expected": [ - "enqueue() must not synchronously call write algorithm" - ] - } - }, "queuing-strategies-size-function-per-global.window.js": { "skip": "Browser-specific test" }, diff --git a/test/wpt/test-url.js b/test/wpt/test-url.js index fc84c22a275c38..7f1ae43fc61080 100644 --- a/test/wpt/test-url.js +++ b/test/wpt/test-url.js @@ -1,5 +1,11 @@ 'use strict'; +const { skip } = require('../common'); + +if (process.config.variables.node_shared_ada) { + skip('Different versions of Ada affect the WPT tests'); +} + const { WPTRunner } = require('../common/wpt'); const runner = new WPTRunner('url'); diff --git a/tools/actions/lint-release-proposal-commit-list.mjs b/tools/actions/lint-release-proposal-commit-list.mjs index 9bbc7159fbf17a..a51f0c590026cf 100755 --- a/tools/actions/lint-release-proposal-commit-list.mjs +++ b/tools/actions/lint-release-proposal-commit-list.mjs @@ -6,6 +6,7 @@ // Example: // $ git log upstream/vXX.x...upstream/vX.X.X-proposal \ // --reverse --format='{"prURL":"%(trailers:key=PR-URL,valueonly,separator=)","title":"%s","smallSha":"%h"}' \ +// --abbrev=10 \ // | sed 's/,"title":"Revert "\([^"]\+\)""/,"title":"Revert \\"\1\\""/g' \ // | ./lint-release-proposal-commit-list.mjs "path/to/CHANGELOG.md" "$(git rev-parse upstream/vX.X.X-proposal)" diff --git a/tools/actions/start-ci.sh b/tools/actions/start-ci.sh index bca1da86074f3b..4d4fadf958a961 100755 --- a/tools/actions/start-ci.sh +++ b/tools/actions/start-ci.sh @@ -10,7 +10,7 @@ for pr in "$@"; do ci_started=yes rm -f output; - ncu-ci run "$pr" >output 2>&1 || ci_started=no + ncu-ci run --check-for-duplicates "$pr" >output 2>&1 || ci_started=no cat output if [ "$ci_started" = "no" ]; then diff --git a/tools/bootstrap/README.md b/tools/bootstrap/README.md deleted file mode 100644 index 0b93055811d2ac..00000000000000 --- a/tools/bootstrap/README.md +++ /dev/null @@ -1,2 +0,0 @@ -Refer to [BUILDING.md](../../BUILDING.md#option-3-automated-install-with-boxstarter) for -instructions on how to build Node.js with boxstarter. diff --git a/tools/bootstrap/windows_boxstarter b/tools/bootstrap/windows_boxstarter deleted file mode 100644 index fc860180aab36f..00000000000000 --- a/tools/bootstrap/windows_boxstarter +++ /dev/null @@ -1,24 +0,0 @@ -# Boxstarter (http://boxstarter.org/) script for Node.js prerequisites -# -# To install either open this link in IE or Edge: -# http://boxstarter.org/package/nr/url?https://raw.githubusercontent.com/nodejs/node/HEAD/tools/bootstrap/windows_boxstarter -# -# Or run those commands in an elevated Powershell terminal: -# iex ((New-Object System.Net.WebClient).DownloadString('http://boxstarter.org/bootstrapper.ps1')) -# get-boxstarter -Force -# Install-BoxstarterPackage https://raw.githubusercontent.com/nodejs/node/HEAD/tools/bootstrap/windows_boxstarter -DisableReboots -# -# For more detail see -# https://github.com/nodejs/node/blob/HEAD/tools/bootstrap/README.md -# - -# Git and Unix tools will be added to the PATH -choco install git -params /GitAndUnixToolsOnPath -y -choco install python3 -y - -# Installs VS 2022 Build Tools -choco install visualstudio2022buildtools -y -choco install visualstudio2022-workload-vctools -y --params="--add Microsoft.VisualStudio.Component.VC.Tools.ARM64 --add Microsoft.VisualStudio.Component.VC.ATL.ARM64 --add Microsoft.NetCore.Component.SDK --add Microsoft.VisualStudio.Component.VC.Llvm.Clang --add Microsoft.VisualStudio.Component.VC.Llvm.ClangToolset" - -# NASM -choco install nasm -y diff --git a/tools/certdata.txt b/tools/certdata.txt index be24d9501c2d12..150f746b62d376 100644 --- a/tools/certdata.txt +++ b/tools/certdata.txt @@ -26591,7 +26591,7 @@ CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE # -# Certificate " OISTE Server Root RSA G1" +# Certificate "OISTE Server Root RSA G1" # # Issuer: CN=OISTE Server Root RSA G1,O=OISTE Foundation,C=CH # Serial Number:55:a5:d9:67:94:28:c6:ed:0c:fa:27:dd:5b:01:4d:18 @@ -26604,7 +26604,7 @@ CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE CKA_TOKEN CK_BBOOL CK_TRUE CKA_PRIVATE CK_BBOOL CK_FALSE CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 " OISTE Server Root RSA G1" +CKA_LABEL UTF8 "OISTE Server Root RSA G1" CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 CKA_SUBJECT MULTILINE_OCTAL \060\113\061\013\060\011\006\003\125\004\006\023\002\103\110\061 @@ -26720,7 +26720,7 @@ CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE -# Trust for " OISTE Server Root RSA G1" +# Trust for "OISTE Server Root RSA G1" # Issuer: CN=OISTE Server Root RSA G1,O=OISTE Foundation,C=CH # Serial Number:55:a5:d9:67:94:28:c6:ed:0c:fa:27:dd:5b:01:4d:18 # Subject: CN=OISTE Server Root RSA G1,O=OISTE Foundation,C=CH @@ -26732,7 +26732,7 @@ CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST CKA_TOKEN CK_BBOOL CK_TRUE CKA_PRIVATE CK_BBOOL CK_FALSE CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 " OISTE Server Root RSA G1" +CKA_LABEL UTF8 "OISTE Server Root RSA G1" CKA_CERT_SHA1_HASH MULTILINE_OCTAL \367\000\064\045\224\210\150\061\344\064\207\077\160\376\206\263 \206\237\360\156 @@ -26755,3 +26755,133 @@ CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE + +# +# Certificate "e-Szigno TLS Root CA 2023" +# +# Issuer: CN=e-Szigno TLS Root CA 2023,OID.2.5.4.97=VATHU-23584497,O=Microsec Ltd.,L=Budapest,C=HU +# Serial Number:00:e8:6f:18:7b:d6:39:6b:98:4a:49:98:0a +# Subject: CN=e-Szigno TLS Root CA 2023,OID.2.5.4.97=VATHU-23584497,O=Microsec Ltd.,L=Budapest,C=HU +# Not Valid Before: Mon Jul 17 14:00:00 2023 +# Not Valid After : Sat Jul 17 14:00:00 2038 +# Fingerprint (SHA-256): B4:91:41:50:2D:00:66:3D:74:0F:2E:7E:C3:40:C5:28:00:96:26:66:12:1A:36:D0:9C:F7:DD:2B:90:38:4F:B4 +# Fingerprint (SHA1): 6F:9A:D5:D5:DF:E8:2C:EB:BE:37:07:EE:4F:4F:52:58:29:41:D1:FE +CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE +CKA_TOKEN CK_BBOOL CK_TRUE +CKA_PRIVATE CK_BBOOL CK_FALSE +CKA_MODIFIABLE CK_BBOOL CK_FALSE +CKA_LABEL UTF8 "e-Szigno TLS Root CA 2023" +CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 +CKA_SUBJECT MULTILINE_OCTAL +\060\165\061\013\060\011\006\003\125\004\006\023\002\110\125\061 +\021\060\017\006\003\125\004\007\014\010\102\165\144\141\160\145 +\163\164\061\026\060\024\006\003\125\004\012\014\015\115\151\143 +\162\157\163\145\143\040\114\164\144\056\061\027\060\025\006\003 +\125\004\141\014\016\126\101\124\110\125\055\062\063\065\070\064 +\064\071\067\061\042\060\040\006\003\125\004\003\014\031\145\055 +\123\172\151\147\156\157\040\124\114\123\040\122\157\157\164\040 +\103\101\040\062\060\062\063 +END +CKA_ID UTF8 "0" +CKA_ISSUER MULTILINE_OCTAL +\060\165\061\013\060\011\006\003\125\004\006\023\002\110\125\061 +\021\060\017\006\003\125\004\007\014\010\102\165\144\141\160\145 +\163\164\061\026\060\024\006\003\125\004\012\014\015\115\151\143 +\162\157\163\145\143\040\114\164\144\056\061\027\060\025\006\003 +\125\004\141\014\016\126\101\124\110\125\055\062\063\065\070\064 +\064\071\067\061\042\060\040\006\003\125\004\003\014\031\145\055 +\123\172\151\147\156\157\040\124\114\123\040\122\157\157\164\040 +\103\101\040\062\060\062\063 +END +CKA_SERIAL_NUMBER MULTILINE_OCTAL +\002\015\000\350\157\030\173\326\071\153\230\112\111\230\012 +END +CKA_VALUE MULTILINE_OCTAL +\060\202\002\317\060\202\002\061\240\003\002\001\002\002\015\000 +\350\157\030\173\326\071\153\230\112\111\230\012\060\012\006\010 +\052\206\110\316\075\004\003\004\060\165\061\013\060\011\006\003 +\125\004\006\023\002\110\125\061\021\060\017\006\003\125\004\007 +\014\010\102\165\144\141\160\145\163\164\061\026\060\024\006\003 +\125\004\012\014\015\115\151\143\162\157\163\145\143\040\114\164 +\144\056\061\027\060\025\006\003\125\004\141\014\016\126\101\124 +\110\125\055\062\063\065\070\064\064\071\067\061\042\060\040\006 +\003\125\004\003\014\031\145\055\123\172\151\147\156\157\040\124 +\114\123\040\122\157\157\164\040\103\101\040\062\060\062\063\060 +\036\027\015\062\063\060\067\061\067\061\064\060\060\060\060\132 +\027\015\063\070\060\067\061\067\061\064\060\060\060\060\132\060 +\165\061\013\060\011\006\003\125\004\006\023\002\110\125\061\021 +\060\017\006\003\125\004\007\014\010\102\165\144\141\160\145\163 +\164\061\026\060\024\006\003\125\004\012\014\015\115\151\143\162 +\157\163\145\143\040\114\164\144\056\061\027\060\025\006\003\125 +\004\141\014\016\126\101\124\110\125\055\062\063\065\070\064\064 +\071\067\061\042\060\040\006\003\125\004\003\014\031\145\055\123 +\172\151\147\156\157\040\124\114\123\040\122\157\157\164\040\103 +\101\040\062\060\062\063\060\201\233\060\020\006\007\052\206\110 +\316\075\002\001\006\005\053\201\004\000\043\003\201\206\000\004 +\000\150\017\337\242\174\074\252\164\210\141\012\215\302\114\245 +\001\042\024\324\367\140\167\102\234\012\070\140\241\214\147\076 +\263\143\351\372\221\260\213\113\346\071\337\002\302\060\001\122 +\000\277\337\214\355\131\255\062\145\253\011\131\120\265\031\302 +\150\034\000\340\005\137\332\120\046\034\303\254\004\042\305\072 +\115\357\351\127\130\066\243\301\031\123\020\012\321\315\077\357 +\113\065\032\103\217\102\023\114\271\054\032\234\276\060\266\304 +\336\334\113\235\344\244\074\313\056\331\255\337\337\175\011\337 +\056\222\377\241\243\143\060\141\060\017\006\003\125\035\023\001 +\001\377\004\005\060\003\001\001\377\060\016\006\003\125\035\017 +\001\001\377\004\004\003\002\001\006\060\035\006\003\125\035\016 +\004\026\004\024\131\204\002\142\132\106\170\365\135\334\217\012 +\020\050\043\334\325\326\373\105\060\037\006\003\125\035\043\004 +\030\060\026\200\024\131\204\002\142\132\106\170\365\135\334\217 +\012\020\050\043\334\325\326\373\105\060\012\006\010\052\206\110 +\316\075\004\003\004\003\201\213\000\060\201\207\002\102\001\055 +\332\256\365\056\170\266\146\270\237\266\160\177\146\164\317\354 +\216\174\376\300\001\171\232\316\122\002\347\303\321\014\172\155 +\313\265\136\356\027\244\233\333\004\166\356\051\051\350\257\373 +\255\254\122\364\327\053\326\167\204\020\275\305\322\050\150\064 +\002\101\065\166\132\165\363\222\206\010\365\262\036\012\366\145 +\013\332\166\307\122\377\013\036\200\160\042\060\303\063\333\030 +\355\204\327\213\354\355\323\250\143\201\265\126\174\107\307\126 +\060\224\150\163\153\322\056\251\271\331\054\034\051\275\014\272 +\271\145\213 +END +CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE +CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE +CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE + +# Trust for "e-Szigno TLS Root CA 2023" +# Issuer: CN=e-Szigno TLS Root CA 2023,OID.2.5.4.97=VATHU-23584497,O=Microsec Ltd.,L=Budapest,C=HU +# Serial Number:00:e8:6f:18:7b:d6:39:6b:98:4a:49:98:0a +# Subject: CN=e-Szigno TLS Root CA 2023,OID.2.5.4.97=VATHU-23584497,O=Microsec Ltd.,L=Budapest,C=HU +# Not Valid Before: Mon Jul 17 14:00:00 2023 +# Not Valid After : Sat Jul 17 14:00:00 2038 +# Fingerprint (SHA-256): B4:91:41:50:2D:00:66:3D:74:0F:2E:7E:C3:40:C5:28:00:96:26:66:12:1A:36:D0:9C:F7:DD:2B:90:38:4F:B4 +# Fingerprint (SHA1): 6F:9A:D5:D5:DF:E8:2C:EB:BE:37:07:EE:4F:4F:52:58:29:41:D1:FE +CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST +CKA_TOKEN CK_BBOOL CK_TRUE +CKA_PRIVATE CK_BBOOL CK_FALSE +CKA_MODIFIABLE CK_BBOOL CK_FALSE +CKA_LABEL UTF8 "e-Szigno TLS Root CA 2023" +CKA_CERT_SHA1_HASH MULTILINE_OCTAL +\157\232\325\325\337\350\054\353\276\067\007\356\117\117\122\130 +\051\101\321\376 +END +CKA_CERT_MD5_HASH MULTILINE_OCTAL +\152\351\231\164\245\332\136\361\331\056\362\310\321\206\213\161 +END +CKA_ISSUER MULTILINE_OCTAL +\060\165\061\013\060\011\006\003\125\004\006\023\002\110\125\061 +\021\060\017\006\003\125\004\007\014\010\102\165\144\141\160\145 +\163\164\061\026\060\024\006\003\125\004\012\014\015\115\151\143 +\162\157\163\145\143\040\114\164\144\056\061\027\060\025\006\003 +\125\004\141\014\016\126\101\124\110\125\055\062\063\065\070\064 +\064\071\067\061\042\060\040\006\003\125\004\003\014\031\145\055 +\123\172\151\147\156\157\040\124\114\123\040\122\157\157\164\040 +\103\101\040\062\060\062\063 +END +CKA_SERIAL_NUMBER MULTILINE_OCTAL +\002\015\000\350\157\030\173\326\071\153\230\112\111\230\012 +END +CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR +CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST +CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST +CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE diff --git a/tools/clang-format/package-lock.json b/tools/clang-format/package-lock.json index 3f5dab7088f3d8..c951eb9e720d9d 100644 --- a/tools/clang-format/package-lock.json +++ b/tools/clang-format/package-lock.json @@ -118,9 +118,9 @@ } }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -271,9 +271,9 @@ } }, "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "requires": { "brace-expansion": "^1.1.7" } diff --git a/tools/dep_updaters/update-merve.sh b/tools/dep_updaters/update-merve.sh old mode 100644 new mode 100755 index ec0525aadb48b6..31d9b15148ad5d --- a/tools/dep_updaters/update-merve.sh +++ b/tools/dep_updaters/update-merve.sh @@ -54,8 +54,8 @@ rm "$MERVE_ZIP" curl -sL -o "$MERVE_LICENSE" "https://raw.githubusercontent.com/anonrig/merve/HEAD/LICENSE-MIT" -echo "Replacing existing merve (except GYP build files)" -mv "$DEPS_DIR/merve/merve.gyp" "$WORKSPACE/" +echo "Replacing existing merve (except GYP/GN build files)" +mv "$DEPS_DIR/merve/merve.gyp" "$DEPS_DIR/merve/BUILD.gn" "$DEPS_DIR/merve/unofficial.gni" "$WORKSPACE/" rm -rf "$DEPS_DIR/merve" mv "$WORKSPACE" "$DEPS_DIR/merve" diff --git a/tools/dep_updaters/update-test426-fixtures.sh b/tools/dep_updaters/update-test426-fixtures.sh new file mode 100755 index 00000000000000..a1a97797c29357 --- /dev/null +++ b/tools/dep_updaters/update-test426-fixtures.sh @@ -0,0 +1,35 @@ +#!/bin/sh + +set -ex + +BASE_DIR=$(cd "$(dirname "$0")/../.." && pwd) + +TARGET_DIR="$BASE_DIR/test/fixtures/test426" +README="$BASE_DIR/test/test426/README.md" + +CURRENT_SHA=$(sed -n 's#^.*https://github.com/tc39/source-map-tests/commit/\([0-9a-f]*\).*$#\1#p' "$README") + +if [ -z "$CURRENT_SHA" ]; then + echo "Could not find source-map-tests commit marker in $README" >&2 + exit 1 +fi + +TARBALL_URL=$(curl -fsIo /dev/null -w '%header{Location}' https://github.com/tc39/source-map-tests/archive/HEAD.tar.gz) +SHA=$(basename "$TARBALL_URL") + +if [ "$CURRENT_SHA" = "$SHA" ]; then + echo "Already up-to-date" + exit 0 +fi + +rm -rf "$TARGET_DIR" +mkdir "$TARGET_DIR" +curl -f "$TARBALL_URL" | tar -xz --strip-components 1 -C "$TARGET_DIR" + +TMP_FILE=$(mktemp) +sed "s/$CURRENT_SHA/$SHA/" "$README" > "$TMP_FILE" +mv "$TMP_FILE" "$README" + +# The last line of the script should always print the new version, +# as we need to add it to $GITHUB_ENV variable. +echo "NEW_VERSION=$SHA" diff --git a/tools/doc/package-lock.json b/tools/doc/package-lock.json index dc3a589436d012..dfaf0b9a084ef3 100644 --- a/tools/doc/package-lock.json +++ b/tools/doc/package-lock.json @@ -1695,9 +1695,9 @@ } }, "node_modules/unist-util-visit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", - "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", "dev": true, "license": "MIT", "dependencies": { diff --git a/tools/eslint-rules/prefer-optional-chaining.js b/tools/eslint-rules/prefer-optional-chaining.js index a460ec51bff391..ac3a54ffd4d5a4 100644 --- a/tools/eslint-rules/prefer-optional-chaining.js +++ b/tools/eslint-rules/prefer-optional-chaining.js @@ -15,7 +15,7 @@ module.exports = { }, create(context) { - const sourceCode = context.getSourceCode(); + const sourceCode = context.sourceCode; // Helper function: Checks if two nodes have identical tokens function equalTokens(left, right) { diff --git a/tools/eslint-rules/require-common-first.js b/tools/eslint-rules/require-common-first.js index ffa5e943fac89f..8e387cdbfc3290 100644 --- a/tools/eslint-rules/require-common-first.js +++ b/tools/eslint-rules/require-common-first.js @@ -49,12 +49,13 @@ module.exports = { // The common module should be loaded in the first place. const notLoadedFirst = foundModules.indexOf(requiredModule) !== 0; if (notLoadedFirst) { - context.report( - node, - 'Mandatory module "{{moduleName}}" must be loaded ' + - 'before any other modules.', - { moduleName: requiredModule }, - ); + context.report({ + node: node.body[0] ?? node, + message: + 'Mandatory module "{{moduleName}}" must be loaded ' + + 'before any other modules.', + data: { moduleName: requiredModule }, + }); } }, }; diff --git a/tools/eslint-rules/required-modules.js b/tools/eslint-rules/required-modules.js index f86b1bc2871e1a..b0def92a1ec5b1 100644 --- a/tools/eslint-rules/required-modules.js +++ b/tools/eslint-rules/required-modules.js @@ -66,11 +66,11 @@ module.exports = { ([module]) => foundModules.indexOf(module) === -1, ); missingModules.forEach(([moduleName]) => { - context.report( - node, - 'Mandatory module "{{moduleName}}" must be loaded.', - { moduleName: moduleName }, - ); + context.report({ + node: node.body[0] ?? node, + message: 'Mandatory module "{{moduleName}}" must be loaded.', + data: { moduleName: moduleName }, + }); }); } }, diff --git a/tools/eslint/package-lock.json b/tools/eslint/package-lock.json index b6cb05dea5c3f9..8db663739af6e5 100644 --- a/tools/eslint/package-lock.json +++ b/tools/eslint/package-lock.json @@ -8,298 +8,281 @@ "name": "eslint-tools", "version": "0.0.0", "dependencies": { - "@babel/core": "^7.28.5", - "@babel/eslint-parser": "^7.28.5", - "@babel/plugin-syntax-import-source": "^7.27.1", + "@babel/core": "^8.0.0-rc.3", + "@babel/eslint-parser": "^8.0.0-rc.3", + "@babel/plugin-syntax-import-source": "^8.0.0-rc.3", + "@eslint/js": "^10.0.1", "@eslint/markdown": "^7.5.1", - "@stylistic/eslint-plugin": "^5.6.1", - "eslint": "^9.39.2", + "@stylistic/eslint-plugin": "^5.10.0", + "eslint": "^10.1.0", "eslint-formatter-tap": "^9.0.1", - "eslint-plugin-jsdoc": "^61.5.0", - "globals": "^16.5.0" + "eslint-plugin-jsdoc": "^62.8.0", + "eslint-plugin-regexp": "^3.1.0", + "globals": "^17.4.0" } }, "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "version": "8.0.0-rc.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-8.0.0-rc.3.tgz", + "integrity": "sha512-585nwYQGQKKc+jMIAPeZJ+aGMn4FHmIUUjLZa9zI7mslvYmShnx0u7rFA4gliRip6S2vkwTYrMxPeXadkKW93Q==", "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" + "@babel/helper-validator-identifier": "^8.0.0-rc.3", + "js-tokens": "^10.0.0" }, "engines": { - "node": ">=6.9.0" + "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@babel/compat-data": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", - "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", + "version": "8.0.0-rc.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-8.0.0-rc.3.tgz", + "integrity": "sha512-TlS7d9xYz/93xC8ovkRBwTKPodbwPfzTn7TxUgZo4c3LwpPINnScqIlN0QRDE/x1S4C1bmyqxGmAZUIC0buW0A==", "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@babel/core": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", - "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.28.3", - "@babel/helpers": "^7.28.4", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.5", - "@babel/types": "^7.28.5", + "version": "8.0.0-rc.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-8.0.0-rc.3.tgz", + "integrity": "sha512-ov5mBbHiosqX1eqt8nN0JM7VuhirO6V8lln5rUXNZpNB+a9NnPTVYeDqSTBkf9C6GmFq3fnFlGT8eg3QBI7jJQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^8.0.0-rc.3", + "@babel/generator": "^8.0.0-rc.3", + "@babel/helper-compilation-targets": "^8.0.0-rc.3", + "@babel/helpers": "^8.0.0-rc.3", + "@babel/parser": "^8.0.0-rc.3", + "@babel/template": "^8.0.0-rc.3", + "@babel/traverse": "^8.0.0-rc.3", + "@babel/types": "^8.0.0-rc.3", "@jridgewell/remapping": "^2.3.5", + "@types/gensync": "^1.0.0", "convert-source-map": "^2.0.0", - "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", + "import-meta-resolve": "^4.2.0", "json5": "^2.2.3", - "semver": "^6.3.1" + "obug": "^2.1.1", + "semver": "^7.7.3" }, "engines": { - "node": ">=6.9.0" + "node": "^20.19.0 || >=22.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/babel" + }, + "peerDependencies": { + "@babel/preset-typescript": "^8.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/preset-typescript": { + "optional": true + } } }, "node_modules/@babel/eslint-parser": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.28.5.tgz", - "integrity": "sha512-fcdRcWahONYo+JRnJg1/AekOacGvKx12Gu0qXJXFi2WBqQA1i7+O5PaxRB7kxE/Op94dExnCiiar6T09pvdHpA==", + "version": "8.0.0-rc.3", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-8.0.0-rc.3.tgz", + "integrity": "sha512-YsJgMO5TVzHGpX0zNF5WkrKj04QI32kQv0L2r/KKbCOmOt4A/XhM5zctW7WgFiOAEZafWfQyo6dWEwwBjZnHlQ==", "license": "MIT", "dependencies": { - "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", - "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.1" + "eslint-scope": "^9.1.0", + "eslint-visitor-keys": "^5.0.0", + "semver": "^7.7.3" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || >=14.0.0" + "node": "^20.19.0 || >=22.12.0" }, "peerDependencies": { - "@babel/core": "^7.11.0", - "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" + "@babel/core": "^8.0.0-rc.3", + "eslint": "^9.0.0 || ^10.0.0" } }, "node_modules/@babel/generator": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", - "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "version": "8.0.0-rc.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-8.0.0-rc.3.tgz", + "integrity": "sha512-em37/13/nR320G4jab/nIIHZgc2Wz2y/D39lxnTyxB4/D/omPQncl/lSdlnJY1OhQcRGugTSIF2l/69o31C9dA==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.5", - "@babel/types": "^7.28.5", + "@babel/parser": "^8.0.0-rc.3", + "@babel/types": "^8.0.0-rc.3", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", + "@types/jsesc": "^2.5.0", "jsesc": "^3.0.2" }, "engines": { - "node": ">=6.9.0" + "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "version": "8.0.0-rc.3", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-8.0.0-rc.3.tgz", + "integrity": "sha512-UXlT7t103KBJjiphN7Ij9DtELX2Q5uk1xMle7oN/eckxR8dmJyvbFsIm5u+cY0KZyF7qNkAiLsJljEPix1yfKg==", "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.27.2", - "@babel/helper-validator-option": "^7.27.1", + "@babel/compat-data": "^8.0.0-rc.3", + "@babel/helper-validator-option": "^8.0.0-rc.3", "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" + "lru-cache": "^7.14.1", + "semver": "^7.7.3" }, "engines": { - "node": ">=6.9.0" + "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "version": "8.0.0-rc.3", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-8.0.0-rc.3.tgz", + "integrity": "sha512-rwtdZPunoa/IAlcZhgDoLxROXPW5evSN7SXMdObS8vNt7Wu6fCf8nLPFcuuhLCzeRoIrGNKx08v/XEQ4riQDGg==", "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", - "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "node_modules/@babel/helper-plugin-utils": { + "version": "8.0.0-rc.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-8.0.0-rc.3.tgz", + "integrity": "sha512-1+lvhojDf75++IwFRWrch4BBaznB2Z99GCfggHFWEKJ8B40iovZ8KqP0kDeb60ThuAa7WxCbtuYHfP5BtJL1kA==", "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.28.3" - }, "engines": { - "node": ">=6.9.0" + "node": "^20.19.0 || >=22.12.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" + "@babel/core": "^8.0.0-rc.3" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "version": "8.0.0-rc.3", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-8.0.0-rc.3.tgz", + "integrity": "sha512-AmwWFx1m8G/a5cXkxLxTiWl+YEoWuoFLUCwqMlNuWO1tqAYITQAbCRPUkyBHv1VOFgfjVOqEj6L3u15J5ZCzTA==", "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "version": "8.0.0-rc.3", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.0-rc.3.tgz", + "integrity": "sha512-8AWCJ2VJJyDFlGBep5GpaaQ9AAaE/FjAcrqI7jyssYhtL7WGV0DOKpJsQqM037xDbpRLHXsY8TwU7zDma7coOw==", "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "version": "8.0.0-rc.3", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-8.0.0-rc.3.tgz", + "integrity": "sha512-wpzZ9KycQDqmJct4ee/ihua2KKdW/MXTDidD4Ya7HdUHL+Jp5zBZTj8oNrxc8wp5Qr4sofKgZF1GIyymfdq7+g==", "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@babel/helpers": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", - "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "version": "8.0.0-rc.3", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-8.0.0-rc.3.tgz", + "integrity": "sha512-dbPuulmsPOwIAXP4pGsKiAv1E50pKYmAJfWXYytCwLpgj6IDNUFAzGuVVemaphYP/WniKsCf42+Cfo4xpc4jjQ==", "license": "MIT", "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4" + "@babel/template": "^8.0.0-rc.3", + "@babel/types": "^8.0.0-rc.3" }, "engines": { - "node": ">=6.9.0" + "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@babel/parser": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", - "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "version": "8.0.0-rc.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.0-rc.3.tgz", + "integrity": "sha512-B20dvP3MfNc/XS5KKCHy/oyWl5IA6Cn9YjXRdDlCjNmUFrjvLXMNUfQq/QUy9fnG2gYkKKcrto2YaF9B32ToOQ==", "license": "MIT", "dependencies": { - "@babel/types": "^7.28.5" + "@babel/types": "^8.0.0-rc.3" }, "bin": { "parser": "bin/babel-parser.js" }, "engines": { - "node": ">=6.0.0" + "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@babel/plugin-syntax-import-source": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-source/-/plugin-syntax-import-source-7.27.1.tgz", - "integrity": "sha512-8MOQQZ+gIKsoB0RK9rpVsX+EXgiLHDAf4gH8ko4dIki5w1VeM6uBLv7dPZb5gGFVxoo0135wmpZ930HPqMrINw==", + "version": "8.0.0-rc.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-source/-/plugin-syntax-import-source-8.0.0-rc.3.tgz", + "integrity": "sha512-enWWk7TiwxhNMdLgyY1JKYhpsTHoKh5rotU6RHelLGefWCk6vAA1wamfNhu1wWch/tRUm4UCo8imafyzUem1Mg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^8.0.0-rc.3" }, "engines": { - "node": ">=6.9.0" + "node": "^20.19.0 || >=22.12.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0-rc.3" } }, "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "version": "8.0.0-rc.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-8.0.0-rc.3.tgz", + "integrity": "sha512-9iet2svxZhCGgmt/b6M3Fbmy2i+OgjhXMDWNqDTBrNvb9Cc60NgETNIaJq6b0wICiCqpsFdIt8NYXMXyCQU6jA==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" + "@babel/code-frame": "^8.0.0-rc.3", + "@babel/parser": "^8.0.0-rc.3", + "@babel/types": "^8.0.0-rc.3" }, "engines": { - "node": ">=6.9.0" + "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@babel/traverse": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", - "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "version": "8.0.0-rc.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-8.0.0-rc.3.tgz", + "integrity": "sha512-3gvZCynaX+zxYZ2v5odaBBcc9eT4Yr7Gf16l3QSEvvBPVyMSZbYhsGAZfO79kjOCNJY2j6rWvNkWl1ZwYa64lQ==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.5", - "debug": "^4.3.1" + "@babel/code-frame": "^8.0.0-rc.3", + "@babel/generator": "^8.0.0-rc.3", + "@babel/helper-globals": "^8.0.0-rc.3", + "@babel/parser": "^8.0.0-rc.3", + "@babel/template": "^8.0.0-rc.3", + "@babel/types": "^8.0.0-rc.3", + "obug": "^2.1.1" }, "engines": { - "node": ">=6.9.0" + "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@babel/types": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", - "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "version": "8.0.0-rc.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.0-rc.3.tgz", + "integrity": "sha512-mOm5ZrYmphGfqVWoH5YYMTITb3cDXsFgmvFlvkvWDMsR9X8RFnt7a0Wb6yNIdoFsiMO9WjYLq+U/FMtqIYAF8Q==", "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" + "@babel/helper-string-parser": "^8.0.0-rc.3", + "@babel/helper-validator-identifier": "^8.0.0-rc.3" }, "engines": { - "node": ">=6.9.0" + "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@es-joy/jsdoccomment": { - "version": "0.76.0", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.76.0.tgz", - "integrity": "sha512-g+RihtzFgGTx2WYCuTHbdOXJeAlGnROws0TeALx9ow/ZmOROOZkVg5wp/B44n0WJgI4SQFP1eWM2iRPlU2Y14w==", + "version": "0.84.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.84.0.tgz", + "integrity": "sha512-0xew1CxOam0gV5OMjh2KjFQZsKL2bByX1+q4j3E73MpYIdyUxcZb/xQct9ccUb+ve5KGUYbCUxyPnYB7RbuP+w==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.8", - "@typescript-eslint/types": "^8.46.0", - "comment-parser": "1.4.1", - "esquery": "^1.6.0", - "jsdoc-type-pratt-parser": "~6.10.0" + "@typescript-eslint/types": "^8.54.0", + "comment-parser": "1.4.5", + "esquery": "^1.7.0", + "jsdoc-type-pratt-parser": "~7.1.1" }, "engines": { - "node": ">=20.11.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@es-joy/resolve.exports": { @@ -312,9 +295,9 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", - "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.4.3" @@ -351,88 +334,73 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", - "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "version": "0.23.3", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.3.tgz", + "integrity": "sha512-j+eEWmB6YYLwcNOdlwQ6L2OsptI/LO6lNBuLIqe5R7RetD658HLoF+Mn7LzYmAWWNNzdC6cqP+L6r8ujeYXWLw==", "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^2.1.7", + "@eslint/object-schema": "^3.0.3", "debug": "^4.3.1", - "minimatch": "^3.1.2" + "minimatch": "^10.2.4" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@eslint/config-helpers": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", - "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.3.tgz", + "integrity": "sha512-lzGN0onllOZCGroKJmRwY6QcEHxbjBw1gwB8SgRSqK8YbbtEXMvKynsXc3553ckIEBxsbMBU7oOZXKIPGZNeZw==", "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.17.0" + "@eslint/core": "^1.1.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@eslint/core": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "node_modules/@eslint/config-helpers/node_modules/@eslint/core": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.1.1.tgz", + "integrity": "sha512-QUPblTtE51/7/Zhfv8BDwO0qkkzQL7P/aWWbqcf4xWLEYn1oKjdO0gglQBB4GAsu7u6wjijbCmzsUTy6mnk6oQ==", "license": "Apache-2.0", "dependencies": { "@types/json-schema": "^7.0.15" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@eslint/eslintrc": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", - "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", - "license": "MIT", + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "license": "Apache-2.0", "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.1", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" + "@types/json-schema": "^7.0.15" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@eslint/js": { - "version": "9.39.2", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", - "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz", + "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==", "license": "MIT", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "eslint": "^10.0.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, "node_modules/@eslint/markdown": { @@ -459,12 +427,12 @@ } }, "node_modules/@eslint/object-schema": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", - "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.3.tgz", + "integrity": "sha512-iM869Pugn9Nsxbh/YHRqYiqd23AmIbxJOcpUMOuWCVNdoQJ5ZtwL6h3t0bcZzJUlC3Dq9jCFCESBZnX0GTv7iQ==", "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@eslint/plugin-kit": { @@ -573,15 +541,6 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { - "version": "5.1.1-v1", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", - "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", - "license": "MIT", - "dependencies": { - "eslint-scope": "5.1.1" - } - }, "node_modules/@sindresorhus/base62": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@sindresorhus/base62/-/base62-1.0.0.tgz", @@ -595,13 +554,13 @@ } }, "node_modules/@stylistic/eslint-plugin": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.6.1.tgz", - "integrity": "sha512-JCs+MqoXfXrRPGbGmho/zGS/jMcn3ieKl/A8YImqib76C8kjgZwq5uUFzc30lJkMvcchuRn6/v8IApLxli3Jyw==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.10.0.tgz", + "integrity": "sha512-nPK52ZHvot8Ju/0A4ucSX1dcPV2/1clx0kLcH5wDmrE4naKso7TUC/voUyU1O9OTKTrR6MYip6LP0ogEMQ9jPQ==", "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.9.0", - "@typescript-eslint/types": "^8.47.0", + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/types": "^8.56.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "estraverse": "^5.3.0", @@ -611,7 +570,7 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "peerDependencies": { - "eslint": ">=9.0.0" + "eslint": "^9.0.0 || ^10.0.0" } }, "node_modules/@stylistic/eslint-plugin/node_modules/eslint-visitor-keys": { @@ -635,12 +594,30 @@ "@types/ms": "*" } }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "license": "MIT" + }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "license": "MIT" }, + "node_modules/@types/gensync": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/gensync/-/gensync-1.0.4.tgz", + "integrity": "sha512-C3YYeRQWp2fmq9OryX+FoDy8nXS6scQ7dPptD8LnFDAUNcKWJjXQKDNJD3HVm+kOUsXhTOkpi69vI4EuAr95bA==", + "license": "MIT" + }, + "node_modules/@types/jsesc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@types/jsesc/-/jsesc-2.5.1.tgz", + "integrity": "sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==", + "license": "MIT" + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -669,9 +646,9 @@ "license": "MIT" }, "node_modules/@typescript-eslint/types": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.48.0.tgz", - "integrity": "sha512-cQMcGQQH7kwKoVswD1xdOytxQR60MWKM1di26xSUtxehaDs/32Zpqsu5WJlXTtTTqyAVK8R7hvsUnIXRS+bjvA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.0.tgz", + "integrity": "sha512-DBsLPs3GsWhX5HylbP9HNG15U0bnwut55Lx12bHB9MpXxQ+R5GC8MwQe+N1UFXxAeQDvEsEDY6ZYwX03K7Z6HQ==", "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -682,11 +659,10 @@ } }, "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -704,9 +680,9 @@ } }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -719,21 +695,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/are-docs-informative": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", @@ -750,34 +711,42 @@ "license": "Python-2.0" }, "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } }, "node_modules/baseline-browser-mapping": { - "version": "2.8.32", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.32.tgz", - "integrity": "sha512-OPz5aBThlyLFgxyhdwf/s2+8ab3OvT7AdTNvKHBwpXomIYeXqpUUuT8LrdtxZSsWJ4R4CU1un4XGh5Ez3nlTpw==", + "version": "2.10.8", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.8.tgz", + "integrity": "sha512-PCLz/LXGBsNTErbtB6i5u4eLpHeMfi93aUv5duMmj6caNu6IphS4q6UevDnL36sZQv9lrP11dbPKGMaXPwMKfQ==", "license": "Apache-2.0", "bin": { - "baseline-browser-mapping": "dist/cli.js" + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" } }, "node_modules/browserslist": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.0.tgz", - "integrity": "sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "funding": [ { "type": "opencollective", @@ -793,13 +762,12 @@ } ], "license": "MIT", - "peer": true, "dependencies": { - "baseline-browser-mapping": "^2.8.25", - "caniuse-lite": "^1.0.30001754", - "electron-to-chromium": "^1.5.249", + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", "node-releases": "^2.0.27", - "update-browserslist-db": "^1.1.4" + "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" @@ -808,19 +776,10 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/caniuse-lite": { - "version": "1.0.30001757", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001757.tgz", - "integrity": "sha512-r0nnL/I28Zi/yjk1el6ilj27tKcdjLsNqAOZr0yVjWPrSQyHgKI2INaEWw21bAQSv2LXRt1XuCS/GomNpWOxsQ==", + "version": "1.0.30001780", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001780.tgz", + "integrity": "sha512-llngX0E7nQci5BPJDqoZSbuZ5Bcs9F5db7EtgfwBerX9XGtkkiO4NwfDDIRzHTTwcYC8vC7bmeUEPGrKlR/TkQ==", "funding": [ { "type": "opencollective", @@ -847,22 +806,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/character-entities": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", @@ -873,39 +816,15 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, "node_modules/comment-parser": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", - "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.5.tgz", + "integrity": "sha512-aRDkn3uyIlCFfk5NUA+VdwMmMsh8JGhc4hapfV4yxymHGQ3BVskMQfoXGpCo5IoBuQ9tS5iiVKhCpTcB4pW4qw==", "license": "MIT", "engines": { "node": ">= 12.0.0" } }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "license": "MIT" - }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -985,9 +904,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.262", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.262.tgz", - "integrity": "sha512-NlAsMteRHek05jRUxUR0a5jpjYq9ykk6+kO0yRaMi5moe7u0fVIOeQ3Y30A8dIiWFBNUoQGi1ljb1i5VtS9WQQ==", + "version": "1.5.321", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.321.tgz", + "integrity": "sha512-L2C7Q279W2D/J4PLZLk7sebOILDSWos7bMsMNN06rK482umHUrh/3lM8G7IlHFOYip2oAg5nha1rCMxr/rs6ZQ==", "license": "ISC" }, "node_modules/escalade": { @@ -1012,33 +931,29 @@ } }, "node_modules/eslint": { - "version": "9.39.2", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", - "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.1.0.tgz", + "integrity": "sha512-S9jlY/ELKEUwwQnqWDO+f+m6sercqOPSqXM5Go94l7DOmxHVDgmSFGWEzeE/gwgTAr0W103BWt0QLe/7mabIvA==", "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.1", - "@eslint/config-helpers": "^0.4.2", - "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.2", - "@eslint/plugin-kit": "^0.4.1", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.3", + "@eslint/config-helpers": "^0.5.3", + "@eslint/core": "^1.1.1", + "@eslint/plugin-kit": "^0.6.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", - "ajv": "^6.12.4", - "chalk": "^4.0.0", + "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.2.0", + "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", @@ -1048,8 +963,7 @@ "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", + "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, @@ -1057,7 +971,7 @@ "eslint": "bin/eslint.js" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://eslint.org/donate" @@ -1084,99 +998,138 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "61.5.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-61.5.0.tgz", - "integrity": "sha512-PR81eOGq4S7diVnV9xzFSBE4CDENRQGP0Lckkek8AdHtbj+6Bm0cItwlFnxsLFriJHspiE3mpu8U20eODyToIg==", + "version": "62.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-62.8.0.tgz", + "integrity": "sha512-hu3r9/6JBmPG6wTcqtYzgZAnjEG2eqRUATfkFscokESg1VDxZM21ZaMire0KjeMwfj+SXvgB4Rvh5LBuesj92w==", "license": "BSD-3-Clause", "dependencies": { - "@es-joy/jsdoccomment": "~0.76.0", + "@es-joy/jsdoccomment": "~0.84.0", "@es-joy/resolve.exports": "1.2.0", "are-docs-informative": "^0.0.2", - "comment-parser": "1.4.1", + "comment-parser": "1.4.5", "debug": "^4.4.3", "escape-string-regexp": "^4.0.0", - "espree": "^10.4.0", - "esquery": "^1.6.0", + "espree": "^11.1.0", + "esquery": "^1.7.0", "html-entities": "^2.6.0", "object-deep-merge": "^2.0.0", "parse-imports-exports": "^0.2.4", - "semver": "^7.7.3", + "semver": "^7.7.4", "spdx-expression-parse": "^4.0.0", "to-valid-identifier": "^1.0.0" }, "engines": { - "node": ">=20.11.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0" } }, - "node_modules/eslint-plugin-jsdoc/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "node_modules/eslint-plugin-jsdoc/node_modules/espree": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.1.1.tgz", + "integrity": "sha512-AVHPqQoZYc+RUM4/3Ly5udlZY/U4LS8pIG05jEjWM2lQMU/oaZ7qshzAl2YP1tfNmXfftH3ohurfwNAug+MnsQ==", + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.16.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.1" }, "engines": { - "node": ">=10" + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "license": "BSD-2-Clause", + "node_modules/eslint-plugin-regexp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-regexp/-/eslint-plugin-regexp-3.1.0.tgz", + "integrity": "sha512-qGXIC3DIKZHcK1H9A9+Byz9gmndY6TTSRkSMTZpNXdyCw2ObSehRgccJv35n9AdUakEjQp5VFNLas6BMXizCZg==", + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.11.0", + "comment-parser": "^1.4.0", + "jsdoc-type-pratt-parser": "^7.0.0", + "refa": "^0.12.1", + "regexp-ast-analysis": "^0.7.1", + "scslre": "^0.3.0" }, "engines": { - "node": ">=8.0.0" + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "peerDependencies": { + "eslint": ">=9.38.0" } }, - "node_modules/eslint-scope/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "node_modules/eslint-scope": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", "license": "BSD-2-Clause", + "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, "engines": { - "node": ">=4.0" + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "license": "Apache-2.0", "engines": { - "node": ">=10" + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", - "license": "BSD-2-Clause", + "node_modules/eslint/node_modules/@eslint/core": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.1.1.tgz", + "integrity": "sha512-QUPblTtE51/7/Zhfv8BDwO0qkkzQL7P/aWWbqcf4xWLEYn1oKjdO0gglQBB4GAsu7u6wjijbCmzsUTy6mnk6oQ==", + "license": "Apache-2.0", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "@types/json-schema": "^7.0.15" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "node_modules/eslint/node_modules/@eslint/plugin-kit": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.6.1.tgz", + "integrity": "sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ==", "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.1.1", + "levn": "^0.4.1" + }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/eslint/node_modules/espree": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.16.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" @@ -1212,9 +1165,9 @@ } }, "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" @@ -1326,9 +1279,9 @@ } }, "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", "license": "ISC" }, "node_modules/format": { @@ -1367,9 +1320,9 @@ } }, "node_modules/globals": { - "version": "16.5.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", - "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.4.0.tgz", + "integrity": "sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==", "license": "MIT", "engines": { "node": ">=18" @@ -1378,15 +1331,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/html-entities": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", @@ -1412,20 +1356,14 @@ "node": ">= 4" } }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "node_modules/import-meta-resolve": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", + "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, "node_modules/imurmurhash": { @@ -1465,9 +1403,9 @@ "license": "ISC" }, "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", + "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", "license": "MIT" }, "node_modules/js-yaml": { @@ -1483,9 +1421,9 @@ } }, "node_modules/jsdoc-type-pratt-parser": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-6.10.0.tgz", - "integrity": "sha512-+LexoTRyYui5iOhJGn13N9ZazL23nAHGkXsa1p/C8yeq79WRfLBag6ZZ0FQG2aRoc9yfo59JT9EYCQonOkHKkQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-7.1.1.tgz", + "integrity": "sha512-/2uqY7x6bsrpi3i9LVU6J89352C0rpMk0as8trXxCtvd4kPk1ke/Eyif6wqfSLvoNJqcDG9Vk4UsXgygzCt2xA==", "license": "MIT", "engines": { "node": ">=20.0.0" @@ -1570,12 +1508,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "license": "MIT" - }, "node_modules/longest-streak": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", @@ -1587,12 +1519,12 @@ } }, "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" + "engines": { + "node": ">=12" } }, "node_modules/markdown-table": { @@ -2416,15 +2348,18 @@ "license": "MIT" }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^5.0.2" }, "engines": { - "node": "*" + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/ms": { @@ -2440,9 +2375,9 @@ "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "version": "2.0.36", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", + "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==", "license": "MIT" }, "node_modules/object-deep-merge": { @@ -2451,6 +2386,16 @@ "integrity": "sha512-3DC3UMpeffLTHiuXSy/UG4NOIYTLlY9u3V82+djSCLYClWobZiS4ivYzpIUWrRY/nfsJ8cWsKyG3QfyLePmhvg==", "license": "MIT" }, + "node_modules/obug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT" + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -2498,18 +2443,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/parse-imports-exports": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/parse-imports-exports/-/parse-imports-exports-0.2.4.tgz", @@ -2550,9 +2483,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "license": "MIT", "engines": { "node": ">=12" @@ -2579,6 +2512,31 @@ "node": ">=6" } }, + "node_modules/refa": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/refa/-/refa-0.12.1.tgz", + "integrity": "sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g==", + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.8.0" + }, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/regexp-ast-analysis": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/regexp-ast-analysis/-/regexp-ast-analysis-0.7.1.tgz", + "integrity": "sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A==", + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.8.0", + "refa": "^0.12.1" + }, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, "node_modules/reserved-identifiers": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/reserved-identifiers/-/reserved-identifiers-1.2.0.tgz", @@ -2591,22 +2549,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "node_modules/scslre": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/scslre/-/scslre-0.3.0.tgz", + "integrity": "sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ==", "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.8.0", + "refa": "^0.12.0", + "regexp-ast-analysis": "^0.7.0" + }, "engines": { - "node": ">=4" + "node": "^14.0.0 || >=16.0.0" } }, "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "license": "ISC", "bin": { "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/shebang-command": { @@ -2652,30 +2618,6 @@ "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", "license": "CC0-1.0" }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/to-valid-identifier": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/to-valid-identifier/-/to-valid-identifier-1.0.0.tgz", @@ -2760,9 +2702,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", - "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "funding": [ { "type": "opencollective", @@ -2822,12 +2764,6 @@ "node": ">=0.10.0" } }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "license": "ISC" - }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/tools/eslint/package.json b/tools/eslint/package.json index 5919c2e0930e43..75c6ae2346d4d8 100644 --- a/tools/eslint/package.json +++ b/tools/eslint/package.json @@ -3,14 +3,16 @@ "version": "0.0.0", "private": true, "dependencies": { - "@babel/core": "^7.28.5", - "@babel/eslint-parser": "^7.28.5", - "@babel/plugin-syntax-import-source": "^7.27.1", + "@babel/core": "^8.0.0-rc.3", + "@babel/eslint-parser": "^8.0.0-rc.3", + "@babel/plugin-syntax-import-source": "^8.0.0-rc.3", + "@eslint/js": "^10.0.1", "@eslint/markdown": "^7.5.1", - "@stylistic/eslint-plugin": "^5.6.1", - "eslint": "^9.39.2", + "@stylistic/eslint-plugin": "^5.10.0", + "eslint": "^10.1.0", "eslint-formatter-tap": "^9.0.1", - "eslint-plugin-jsdoc": "^61.5.0", - "globals": "^16.5.0" + "eslint-plugin-jsdoc": "^62.8.0", + "eslint-plugin-regexp": "^3.1.0", + "globals": "^17.4.0" } } diff --git a/tools/generate_config_gypi.py b/tools/generate_config_gypi.py index abd11e1dbda8d4..436767e633e1f4 100755 --- a/tools/generate_config_gypi.py +++ b/tools/generate_config_gypi.py @@ -58,7 +58,7 @@ def translate_config(out_dir, config, v8_config): 'llvm_version': 13, 'napi_build_version': config['napi_build_version'], 'node_builtin_shareable_builtins': - eval(config['node_builtin_shareable_builtins']), + json.loads(config['node_builtin_shareable_builtins']), 'node_module_version': int(config['node_module_version']), 'node_use_openssl': config['node_use_openssl'], 'node_use_amaro': config['node_use_amaro'], @@ -102,7 +102,8 @@ def main(): # Write output. with open(args.target, 'w') as f: - f.write(repr(translate_config(args.out_dir, config, v8_config))) + f.write(json.dumps(translate_config(args.out_dir, config, v8_config), + sort_keys=True)) # Write depfile. Force regenerating config.gypi when GN configs change. if args.dep_file: diff --git a/typings/globals.d.ts b/typings/globals.d.ts index 739f3d9a534026..ddd5885faa057f 100644 --- a/typings/globals.d.ts +++ b/typings/globals.d.ts @@ -87,6 +87,20 @@ declare global { | BigUint64Array | BigInt64Array; + type TypedArrayConstructor = + | typeof Uint8Array + | typeof Uint8ClampedArray + | typeof Uint16Array + | typeof Uint32Array + | typeof Int8Array + | typeof Int16Array + | typeof Int32Array + | typeof Float16Array + | typeof Float32Array + | typeof Float64Array + | typeof BigUint64Array + | typeof BigInt64Array; + namespace NodeJS { interface Global { internalBinding<T extends InternalBindingKeys>(binding: T): InternalBindingMap[T] diff --git a/typings/primordials.d.ts b/typings/primordials.d.ts index 204c12b0087f91..5437ac2736792a 100644 --- a/typings/primordials.d.ts +++ b/typings/primordials.d.ts @@ -19,7 +19,7 @@ type UncurryGetter<O, K extends keyof O, T = O> = type UncurrySetter<O, K extends keyof O, T = O> = O[K] extends infer V ? (self: T, value: V) => void : never; -type TypedArrayContentType<T extends TypedArray> = T extends { [k: number]: infer V } ? V : never; +type TypedArrayContentType<T extends TypedArrayConstructor> = InstanceType<T>[number]; /** * Primordials are a way to safely use globals without fear of global mutation @@ -472,14 +472,12 @@ declare namespace primordials { export const SyntaxErrorPrototype: typeof SyntaxError.prototype export import TypeError = globalThis.TypeError; export const TypeErrorPrototype: typeof TypeError.prototype - export function TypedArrayFrom<T extends TypedArray>( - constructor: new (length: number) => T, - source: - | Iterable<TypedArrayContentType<T>> - | ArrayLike<TypedArrayContentType<T>>, - ): T; - export function TypedArrayFrom<T extends TypedArray, U, THIS_ARG = undefined>( - constructor: new (length: number) => T, + export function TypedArrayFrom<T extends TypedArrayConstructor>( + constructor: T, + source: Iterable<TypedArrayContentType<T>> | ArrayLike<TypedArrayContentType<T>>, + ): InstanceType<T> + export function TypedArrayFrom<T extends TypedArrayConstructor, U, THIS_ARG = undefined>( + constructor: T, source: Iterable<U> | ArrayLike<U>, mapfn: ( this: THIS_ARG, @@ -487,28 +485,17 @@ declare namespace primordials { index: number, ) => TypedArrayContentType<T>, thisArg?: THIS_ARG, - ): T; - export function TypedArrayOf<T extends TypedArray>( - constructor: new (length: number) => T, - ...items: readonly TypedArrayContentType<T>[] - ): T; - export function TypedArrayOfApply<T extends TypedArray>( - constructor: new (length: number) => T, + ): InstanceType<T>; + export function TypedArrayOf<T extends TypedArrayConstructor>( + constructor: T, + ...items: TypedArrayContentType<T>[], + ): InstanceType<T>; + export function TypedArrayOfApply<T extends TypedArrayConstructor>( + constructor: T, items: readonly TypedArrayContentType<T>[], - ): T; - export const TypedArray: TypedArray; - export const TypedArrayPrototype: - | typeof Uint8Array.prototype - | typeof Int8Array.prototype - | typeof Uint16Array.prototype - | typeof Int16Array.prototype - | typeof Uint32Array.prototype - | typeof Int32Array.prototype - | typeof Float32Array.prototype - | typeof Float64Array.prototype - | typeof BigInt64Array.prototype - | typeof BigUint64Array.prototype - | typeof Uint8ClampedArray.prototype; + ): InstanceType<T>; + export const TypedArray: TypedArrayConstructor; + export const TypedArrayPrototype: TypedArrayConstructor["prototype"]; export const TypedArrayPrototypeGetBuffer: UncurryGetter<TypedArray, "buffer">; export const TypedArrayPrototypeGetByteLength: UncurryGetter<TypedArray, "byteLength">; export const TypedArrayPrototypeGetByteOffset: UncurryGetter<TypedArray, "byteOffset">; @@ -519,19 +506,7 @@ declare namespace primordials { export function TypedArrayPrototypeSet<T extends TypedArray>(self: T, ...args: Parameters<T["set"]>): ReturnType<T["set"]>; export function TypedArrayPrototypeSubarray<T extends TypedArray>(self: T, ...args: Parameters<T["subarray"]>): ReturnType<T["subarray"]>; export function TypedArrayPrototypeSlice<T extends TypedArray>(self: T, ...args: Parameters<T["slice"]>): ReturnType<T["slice"]>; - export function TypedArrayPrototypeGetSymbolToStringTag(self: unknown): - | 'Int8Array' - | 'Int16Array' - | 'Int32Array' - | 'Uint8Array' - | 'Uint16Array' - | 'Uint32Array' - | 'Uint8ClampedArray' - | 'BigInt64Array' - | 'BigUint64Array' - | 'Float32Array' - | 'Float64Array' - | undefined; + export function TypedArrayPrototypeGetSymbolToStringTag(self: unknown): TypedArray[typeof Symbol.toStringTag] | undefined; export import URIError = globalThis.URIError; export const URIErrorPrototype: typeof URIError.prototype export import Uint16Array = globalThis.Uint16Array;